ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9DaGFuZ2VMb2cgYi9kcml2ZXJzL2NoYXIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjhhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNzc1IEBACisyMDAxLTA4LTExICBUaW0gV2F1Z2ggIDx0d2F1Z2hAcmVkaGF0LmNvbT4KKworCSogc2VyaWFsLmMgKGdldF9wY2lfcG9ydCk6IERlYWwgd2l0aCBhd2t3YXJkIFRpdGFuIGNhcmRzLgorCisxOTk4LTA4LTI2ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAocnNfb3Blbik6IENvcnJlY3RseSBkZWNyZW1lbnQgdGhlIG1vZHVsZSBpbi11c2UgY291bnQKKwkJb24gZXJyb3JzLgorCitUaHUgRmViIDE5IDE0OjI0OjA4IDE5OTggIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfbmFtZSk6IFJlbW92ZSB0aGUgbm9uLXJlZW50cmFudCAoYW5kIG5vbi1TTVAgc2FmZSkKKwkJdmVyc2lvbiBvZiB0dHlfbmFtZSwgYW5kIHJlbmFtZSB0aGUgcmVlbnRyYW50IF90dHlfbmFtZQorCQlmdW5jdGlvbiB0byBiZSB0dHlfbmFtZS4KKwkJKHR0eV9vcGVuKTogQWRkIGEgd2FybmluZyBtZXNzYWdlIHN0YXRpbmcgY2FsbG91dCBkZXZpY2VzCisJCWFyZSBkZXByZWNhdGVkLgorCitNb24gRGVjICAxIDA4OjI0OjE1IDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfZ2V0X2JhdWRfcmF0ZSk6IFByaW50IGEgd2FybmluZyBzeXNsb2cgaWYgdGhlCisJCXR0eS0+YWx0X3NwZWVkIGtsdWRnZSBpcyB1c2VkOyB0aGlzIG1lYW5zIHRoZSBzeXN0ZW0gaXMKKwkJdXNpbmcgdGhlIGRlcHJlY2F0ZWQgU1BEX0hJIGlvY3Rscy4KKworTW9uIE5vdiAyNCAxMDozNzo0OSAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYywgZXNwLmMsIHJvY2tldC5jOiBDaGFuZ2UgZHJpdmVycyB0byB0YWtlIGFkdmFudGFnZSBvZgorCSAJdHR5X2dldF9iYXVkX3JhdGUoKS4KKwkKKwkqIHR0eV9pby5jICh0dHlfZ2V0X2JhdWRfcmF0ZSk6IE5ldyBmdW5jdGlvbiB3aGljaCBjb21wdXRlcyB0aGUKKwkJY29ycmVjdCBiYXVkIHJhdGUgZm9yIHRoZSB0dHkuICBNb3JlIGZhY3RvcmluZyBvdXQgb2YKKwkJY29tbW9uIGNvZGUgb3V0IG9mIHRoZSBzZXJpYWwgZHJpdmVyIHRvIHRoZSBoaWdoLWxldmVsIHR0eQorCQlmdW5jdGlvbnMuLi4uCisKK1NhdCBOb3YgMjIgMDc6NTM6MzYgMTk5NyAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMsIGVzcC5jLCByb2NrZXQuYzogQWRkIHR0eS0+ZHJpdmVyLmJyZWFrKCkgcm91dGluZSwgYW5kCisgCQlhbGxvdyBoaWdoLWxldmVsIHR0eSBjb2RlIHRvIGhhbmRsZSB0aGUgYnJlYWsgYW5kIHNvZnQKKyAJCWNhcnJpZXIgaW9jdGxzLgorCQorCSogdHR5X2lvY3RsLmMgKG5fdHR5X2lvY3RsKTogU3VwcG9ydCBUSU9DR1NPRlRDQVIgYW5kCisgCQlUSU9DU1NPRlRDQVIsIHNvIHRoYXQgZGV2aWNlIGRyaXZlcnMgZG9uJ3QgaGF2ZSB0byBzdXBwb3J0CisgCQlpdC4KKworCSogc2VyaWFsLmMgKGF1dG9jb25maWcpOiBDaGFuZ2UgMTY3NTAgdGVzdCB0byBob3BlZnVsbHkgZWxpbWluYXRlCisJCWZhbHNlIHJlc3VsdHMgYnkgcGVvcGxlIHdpdGggc3RyYW5nZSAxNjU1MEFzIGJlaW5nCisJCWRldGVjdGVkIGFzIDE2NzUwcy4gIEhvcGVmdWxseSAxNjc1MHMgd2lsbCBzdGlsbCBiZQorCQlkZXRlY3RlZCBhcyAxNjc1MCwgYW5kIG90aGVyIHdlaXJkIFVBUlRzIHdvbid0IGdldCBwb29ybHkKKwkJYXV0b2RldGVjdGVkLiAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIEknbGwgaGF2ZSB0byBkaXNhYmxlCisJCXRoZSBhdXRvIGlkZW50aWZpY2F0aW9uIGZvciB0aGUgMTY3NTAuCisKKwkqIHR0eV9pby5jICh0dHlfaGFuZ3VwKTogTm93IGFjdHVhbGx5IGRvIHRoZSB0dHkgaGFuZ3VwCisJCXByb2Nlc3NpbmcgZHVyaW5nIHRoZSB0aW1lciBwcm9jZXNzaW5nLCBhbmQgZGlzYWJsZQorCQlpbnRlcnJ1cHRzIHdoaWxlIGRvaW5nIHRoZSBoYW5ndXAgcHJvY2Vzc2luZy4gIFRoaXMgYXZvaWRzCisJCXNldmVyYWwgbmFzdHkgcmFjZSBjb25kaXRpb25zIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlCisJCWhhbmd1cCBwcm9jZXNzaW5nIHdhcyBkb25lIGFzeW5jaHJvbm91c2x5LgorCQkodHR5X2lvY3RsKTogRG8gYnJlYWsgaGFuZGxpbmcgaW4gdGhlIHR0eSBkcml2ZXIgaWYKKwkJZHJpdmVyJ3MgYnJlYWsgZnVuY3Rpb24gaXMgc3VwcG9ydGVkLiAgCisJCSh0dHlfZmxpcF9idWZmZXJfcHVzaCk6IE5ldyBleHBvcnRlZCBmdW5jdGlvbiB3aGljaCBzaG91bGQKKwkJYmUgdXNlZCBieSBkcml2ZXJzIHRvIHB1c2ggY2hhcmFjdGVycyBpbiB0aGUgZmxpcCBidWZmZXIKKwkJdG8gdGhlIHR0eSBoYW5kbGVyLiAgVGhpcyBtYXkgZWl0aGVyIGJlIGRvbmUgdXNpbmcgYSB0YXNrCisJCXF1ZXVlIGZ1bmN0aW9uIGZvciBiZXR0ZXIgQ1BVIGVmZmljaWVuY3ksIG9yIGRpcmVjdGx5IGZvcgorCQlsb3cgbGF0ZW5jeSBvcGVyYXRpb24uCisKKwkqIHNlcmlhbC5jIChyc19zZXRfdGVybWlvcyk6IEZpeCBidWcgcnNfc2V0X3Rlcm1pb3Mgd2hlbgorCQl0cmFuc2l0aW9uaW5nIGF3YXkgZnJvbSBCMCwgc3VibWl0dGVkIGJ5IFN0YW5pc2xhdgorCQlWb3JvbnlpLiAKKworVGh1IEp1biAxOSAyMDowNTo1OCAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoYmVnaW5fYnJlYWssIGVuZF9icmVhaywgcnNfaW9jdGwpOiBBcHBsaWVkIHBhdGNoCisJCXRvIHN1cHBvcnQgQlNEIGlvY3RscyB0byBzZXQgYW5kIGNsZWFyIHRoZSBicmVhaworCQljb25kaXRpb24gZXhwbGljaXRseS4KKworCSogY29uc29sZS5jIChzY3J1cCwgc2NyZG93biwgaW5zZXJ0X2xpbmUsIGRlbGV0ZV9saW5lKTogQXBwbGllZAorCQlmaXggc3VnZ2VzdGVkIGJ5IEFhcm9uIFRpZW5zaXZ1IHRvIHNwZWVkIHVwIGJsb2NrIHNjcm9sbHMKKwkJdXAgYW5kIGRvd24uCisKKwkqIG5fdHR5LmMgKG9wb3N0X2Jsb2NrLCB3cml0ZV9jaGFuKTogQWRkZWQgYSBtb2RpZmllZCAiZmFzdAorIAkJY29uc29sZSIgcGF0Y2ggd2hpY2ggcHJvY2Vzc2VzIGEgYmxvY2sgb2YgdGV4dCB2aWEKKwkJImNvb2tpbmciIGVmZmljaWVudGx5LgorCitXZWQgSnVuIDE4IDE1OjI1OjUwIDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jIChpbml0X2RldiwgcmVsZWFzZV9kZXYpOiBBcHBsaWVkIGZpeCBzdWdnZXN0ZWQgYnkgQmlsbAorCQlIYXdlcyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgdHR5IGNvZGUuCisKKwkqIG5fdHR5LmMgKG5fdHR5X2NoYXJzX2luX2J1ZmZlcik6IEFwcGxpZWQgZml4IHN1Z2dlc3RlZCBieSBCaWxsCisJCUhhd2VzIHNvIHRoYXQgbl90dHlfY2hhcnNfaW5fYnVmZmVyIHJldHVybnMgdGhlIGNvcnJlY3QKKwkJdmFsdWUgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgdHR5IGlzIGluIGNhbm5vbmljYWwgbW9kZS4gIChUbworCQlhdm9pZCBhIHB0eSBkZWFkbG9jayB3aXRoIHRlbG5ldGQuKQorCitUaHUgRmViIDI3IDAxOjUzOjA4IDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChjaGFuZ2Vfc3BlZWQpOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHRlcm1pb3MgZmxhZworCQlDTVNQQVIsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3Qgc3RpY2sgcGFyaXR5LgorCQkoaS5lLCBpZiBQQVJPREQgaXMgc2V0LCB0aGUgcGFyaXR5IGJpdCBpcyBhbHdheXMgMTsgaWYKKwkJUEFSUk9ERCBpcyBub3Qgc2V0LCB0aGVuIHRoZSBwYXJpdHkgYml0IGlzIGFsd2F5cyAwKS4KKworV2VkIEZlYiAyNiAxOTowMzoxMCAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoY2xlYW51cF9tb2R1bGUpOiBGaXggbWVtb3J5IGxlYWsgd2hlbiB1c2luZyB0aGUgc2VyaWFsCisJCWRyaXZlciBhcyBhIG1vZHVsZTsgbWFrZSBzdXJlIHRtcF9idWYgZ2V0cyBmcmVlZCEKKworVHVlIEZlYiAyNSAxMTowMTo1OSAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoc2V0X21vZGVtX2luZm8pOiBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBhbmQgY2xlYXJpbmcKKwkJdGhlIE9VVDEgYW5kIE9VVDIgYml0cy4gIChGb3Igc3BlY2lhbCBjYXNlIFVBUlQncywgdXN1YWxseQorCQlmb3IgaGFsZi1kdXBsZXguKQorCQkoYXV0b2NvbmZpZywgY2hhbmdlX3NwZWVkKTogRml4IFRJIDE2NzUwIHN1cHBvcnQuCisKK1N1biBGZWIgMTYgMDA6MTQ6NDMgMTk5NyAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKHJlbGVhc2VfZGV2KTogQWRkIHNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgYXJlCisJCW5vIHdhaXRlcnMgb24gdHR5LT5yZWFkX3dhaXQgb3IgdHR5LT53cml0ZV93YWl0LgorCisJKiBzZXJpYWwuYyAocnNfaW5pdCk6IERvbid0IGF1dG9jb25maWcgYSBkZXZpY2UgaWYgdGhlIEkvTyByZWdpb24KKwkJaXMgYWxyZWFkeSByZXNlcnZlZC4KKworCSogc2VyaWFsLmMgKHNlcmlhbF9wcm9jX2luZm8pOiBBZGQgc3VwcG9ydCBmb3IgL3Byb2Mvc2VyaWFsLgorCitUaHUgRmViIDEzIDAwOjQ5OjEwIDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChyZWNlaXZlX2NoYXJzKTogV2hlbiB0aGUgVUFSVCByZXBvdHJzIGFuIG92ZXJydW4KKyAJCWNvbmRpdGlvbiwgaXQgZG9lcyBzbyB3aXRoIGEgdmFsaWQgY2hhcmFjdGVyLiAgQ2hhbmdlZCB0bworIAkJbm90IHRocm93IGF3YXkgdGhlIHZhbGlkIGNoYXJhY3RlciwgYnV0IGluc3RlYWQgcmVwb3J0IHRoZQorCQlvdmVycnVuIGFmdGVyIHRoZSB2YWxpZCBjaGFyYWN0ZXIuCisKKwkqIHNlcmlhbC5jOiBBZGRlZCBuZXcgI2lmZGVmJ3MgZm9yIHNvbWUgb2YgdGhlIGFkdmFuY2VkIHNlcmlhbAorCQlkcml2ZXIgZmVhdHVyZXMuICBBIG1pbmltYWwgZHJpdmVyIHRoYXQgb25seSBzdXBwb3J0cyBDT00KKwkJMS8yLzMvNCB3aXRob3V0IHNoYXJpbmcgc2VyaWFsIGludGVycnVwdHMgb25seSB0YWtlcyAxN2s7CisJCXRoZSBmdWxsIGRyaXZlciB0YWtlcyAzMmsuCisJCQorV2VkIEZlYiAxMiAxNDo1MDo0NCAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiB2dC5jOgorCSogcHR5LmM6IAorCSogdHR5X2lvY3RsLmM6IAorCSogc2VyaWFsLmM6IFVwZGF0ZSByb3V0aW5lcyB0byB1c2UgdGhlIG5ldyAyLjEgbWVtb3J5IGFjY2VzcworCSAJcm91dGluZXMuCisKK1dlZCBEZWMgIDQgMDc6NTE6NTIgMTk5NiAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQGxvY2FsaG9zdC5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoY2hhbmdlX3NwZWVkKTogVXNlIHNhdmVfZmxhZ3MoKTsgY2xpKCkgYW5kCisJCXJlc3RvcmVfZmxhZ3MoKSBpbiBvcmRlciB0byBlbnN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5CisJCXR1cm4gb24gaW50ZXJydXB0cyB3aGVuIHN0YXJ0aW5nIHVwIHRoZSBwb3J0LgorCQkoc3RhcnR1cCk6IE1vdmUgdGhlIGluc2VydGlvbiBvZiBzZXJpYWwgc3RydWN0dXJlIGludG8gdGhlCisJCUlSUSBjaGFpbiBlYXJsaWVyIGludG8gdGhlIHN0YXJ0dXAgcHJvY2Vzc2luZy4gIEludGVycnVwdHMKKwkJc2hvdWxkIGJlIG9mZiB0aGlzIHdob2xlIHRpbWUsIGJ1dCB3ZSBldmVudHVhbGx5IHdpbGwgd2FudAorCQl0byByZWR1Y2UgdGhpcyB3aW5kb3cuCisKK1RodSBOb3YgMjEgMTA6MDU6MjIgMTk5NiAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQGxvY2FsaG9zdC5taXQuZWR1PgorCisJKiB0dHlfaW9jdGwuYyAodHR5X3dhaXRfdW50aWxfc2VudCk6IEFsd2F5cyBjaGVjayB0aGUgZHJpdmVyCisgCQl3YWl0X3VudGlsX3JlYWR5IHJvdXRpbmUsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMKKyAJCWluIHRoZSB4bWl0IGJ1ZmZlci4gIChUaGVyZSBtYXkgYmUgY2hhcmFjdGVzIGluIHRoZSBkZXZpY2UKKyAJCUZJRk8uKQorCQkobl90dHlfaW9jdGwpOiBBZGQgbmV3IGZsYWcgdHR5LT5mbG93X3N0b3BwZWQgd2hpY2gKKyAJCWluZGljYXRlcyB3aGV0aGVyIHRoZSB0dHkgaXMgc3RvcHBlZCBkdWUgdG8gYSByZXF1ZXN0IGJ5CisgCQl0aGUgVENYT05DIGlvY3RsICh1c2VkIGJ5IHRjZmxvdykuICBJZiBzbywgZG9uJ3QgbGV0IGFuCisgCQlpbmNvbWluZyBYT0ZGIGNoYXJhY3RlciByZXN0YXJ0IHRoZSB0dHkuICBUaGUgdHR5IGNhbiBvbmx5CisgCQliZSByZXN0YXJ0ZWQgYnkgYW5vdGhlciBUQ1hPTkMgcmVxdWVzdC4KKworCSogdHR5X2lvLmMgKHN0YXJ0X3R0eSk6IERvbid0IGFsbG93IHRoZSB0dHkgdG8gYmUgcmVzdGFydGVkIGlmCisJCXR0eS0+Zmxvd19zdG9wcGVkIGlzIHRydWUuCisKKwkqIG5fdHR5LmMgKG5fdHR5X3JlY2VpdmVfY2hhcik6IElmIHR0eS0+Zmxvd19zdG9wcGVkIGlzIHRydWUsIGFuZAorIAkJSVhBTlkgaXMgc2V0LCBkb24ndCBlYXQgYSBjaGFyYWN0ZXIgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlCisgCQl0dHkuCisKKwkqIHNlcmlhbC5jIChzdGFydHVwKTogUmVtb3ZlIG5lZWQgZm9yIE1DUl9ub2ludCBmcm9tIHRoZQorIAkJYXN5bmNfc3RydWN0IHN0cnVjdHVyZS4gIE9ubHkgdHVybiBvbiBEVFIgYW5kIFJUUyBpZiB0aGUKKyAJCWJhdWQgcmF0ZSBpcyBub3QgemVyby4KKwkJKGNoYW5nZV9zcGVlZCk6IE1vcmUgYWNjdXJhdGVseSBjYWxjdWxhdGUgdGhlIHRpbWVvdXQKKyAJCXZhbHVlIGJhc2VkIG9uIHRoZSB3b3JkIHNpemUuICBNb3ZlIHJlc3BvbnNpYmlsaXR5IG9mCisgCQloYW5ndXAgd2hlbiBzcGVlZCBiZWNvbWVzIEIwIHRvIHJzX3NldF90ZXJtaW9zKCkKKwkJKHNldF9zZXJpYWxfaW5mbyk6IFdoZW4gY2hhbmdpbmcgdGhlIFVBUlQgdHlwZSBzZXQgdGhlCisgCQljdXJyZW50IHhtaXRfZmlmb19zaXplIGFzIHdlbGwgYXMgdGhlIHBlcm1hbmVudAorIAkJeG1pdF9maWZvX3NpemUuCisJCShyc19pb2N0bCk6IEZpeCBUQ1NCUksgKHVzZWQgYnkgdGNkcmFpbikgYW5kIFRDU0JSS1AKKyAJCWlvY3RscyB0byByZXR1cm4gRUlOVFIgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisJCShyc19zZXRfdGVybWlvcyk6IElmIHRoZSBiYXVkIHJhdGUgY2hhbmdlcyB0byBvciBmcm9tIEIwLAorIAkJdGhpcyBmdW5jdGlvbiBpcyBub3cgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgb3IgY2xlYXJpbmcKKyAJCURUUiBhbmQgUlRTLiAgRFRSIGFuZCBSVFMgYXJlIG9ubHkgYmUgY2hhbmdlZCBvbiB0aGUKKyAJCXRyYW5zaXRpb24gdG8gb3IgZnJvbSB0aGUgQjAgc3RhdGUuCisJCShyc19jbG9zZSk6IFdhaXQgZm9yIHRoZSBjaGFyYWN0ZXJzIHRvIGRyYWluIGJhc2VkIG9uCisgCQlpbmZvLT50aW1lb3V0LiAgQXQgbG93IGJhdWQgcmF0ZXMgKDUwIGJwcyksIGl0IG1heSB0YWtlIGEKKyAJCWxvbmcgdGltZSBmb3IgdGhlIEZJRk8gdG8gY29tcGxldGVseSBkcmFpbiBvdXQhCisJCShyc193YWl0X3VudGlsX3NlbnQpOiBGaXhlZCB0aW1lb3V0IGhhbmRsaW5nLiAgTm93CisgCQlyZWxlYXNlcyBjb250cm9sIHRvIHRoZSBzY2hlZHVsZXIsIGJ1dCBjaGVja3MgZnJlcXVlbnRseQorIAkJZW5vdWdoIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHNlbnNpdGl2ZSBlbm91Z2ggdG8gcGFzcworIAkJdGhlIHRpbWluZyByZXF1aXJlbWVudHMgb2YgdGhlIE5JU1QtUENUUy4KKwkJKGJsb2NrX3RpbF9yZWFkeSk6IFdoZW4gb3BlbmluZyB0aGUgZGV2aWNlLCBkb24ndCB0dXJuIG9uCisgCQlEVFIgYW5kIFJUUyBpZiB0aGUgYmF1ZCByYXRlIGlzIEIwLgorCitUaHUgTm92IDE0IDAwOjA2OjA5IDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChhdXRvY29uZmlnKTogRml4IGF1dG9jb25maWd1cmF0aW9uIHByb2JsZW1zOworCQlpbmZvLT5mbGFncyB3YXNuJ3QgZ2V0dGluZyBpbml0aWFsaXplZCBmcm9tIHRoZSBzdGF0ZQorCQlzdHJ1Y3R1cmUuICBQdXQgaW4gbW9yZSBwYXJhbm9pZCB0ZXN0IGZvciB0aGUgMTY3NTAuCisKK0ZyaSBOb3YgIDggMjA6MTk6NTAgMTk5NiAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogbl90dHkuYyAobl90dHlfZmx1c2hfYnVmZmVyKTogT25seSBjYWxsIGRyaXZlci0+dW50aHJvdHRsZSgpIGlmCisgCQl0aGUgdHR5IHdhcyBwcmV2aW91cyB0aHJvdHRsZWQuCisJCShuX3R0eV9zZXRfdGVybWlvcywgd3JpdGVfY2hhbik6IEFkZCBjaGFuZ2VzIHN1Z2dlc3RlZCBieQorIAkJCVNpbW9uIFAuIEFsbGVuIHRvIGFsbG93IGhhcmR3YXJlIGNvb2tpbmcuCisKKwkqIHR0eV9pb2N0bC5jIChzZXRfdGVybWlvcyk6IElmIHdlIGdldCBhIHNpZ25hbCB3aGlsZSB3YWl0aW5nIGZvcgorCQl0aGUgdHR5IHRvIGRyYWluLCByZXR1cm4gLUVJTlRSLgorCQorCSogc2VyaWFsLmMgKGNoYW5nZV9zcGVlZCk6IEFkZCBzdXBwb3J0IGZvciBDUkVBRCwgYXMgcmVxdWlyZWQgYnkKKwkgCVBPU0lYLgorCitTYXQgTm92ICAyIDIwOjQzOjEwIDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jOiBXaG9sZXNhbGUgY2hhbmdlcy4gIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTdGFydGVjaAorIAkJMTY2NTAgYW5kIDE2NjUwVjIgY2hpcHMuICAoV0FSTklORzogdGhlIG5ldyBzdGFydGVjaAorIAkJMTY2NTBBIG1heSBvciBtYXkgbm90IHdvcmshKSAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlCisgCQlUSTE2NzUwIChub3QgeWV0IHRlc3RlZCkuICBTcGxpdCBhc3luY19zdHJ1Y3QgaW50byBhCisgCQl0cmFuc2llbnQgcGFydCAoYXN5bmNfc3RydWN0KSBhbmQgYSBwZXJtYW5lbnQgcGFydAorCQkoc2VyaWFsX3N0YXRlKSB3aGljaCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbgorIAkJaW5mb3JtYXRpb24gZm9yIHRoZSBwb3J0cy4gIEFkZGVkIG5ldyBkcml2ZXIgcm91dGluZXMKKyAJCXdhaXRfdW50aWxfc2VudCgpIGFuZCBzZW5kX3hjaGFyKCkgdG8gaGVscCB3aXRoIFBPU0lYCisgCQljb21wbGlhbmNlLiAgQWRkZWQgc3VwcG9ydCBmb3IgcmFkaW8gY2xvY2tzIHdoaWNoIHdhZ2dsZQorCQl0aGUgY2FycmllciBkZXRlY3QgbGluZSAoQ09ORklHX0hBUkRfUFBTKS4KKwkKKwkqIHR0eV9pb2N0bC5jICh0dHlfd2FpdF91bnRpbF9zZW50KTogQWRkZWQgY2FsbCB0byBuZXcgZHJpdmVyCisJCWZ1bmN0aW9uIHR0eS0+ZHJpdmVyLndhaXRfdW50aWxfc2VudCgpLCB3aGljaCByZXR1cm5zIHdoZW4KKwkJdGhlIHR0eSdzIGRldmljZSB4bWl0IGJ1ZmZlcnMgYXJlIGRyYWluZWQuICBOZWVkZWQgZm9yCisJCWZ1bGwgUE9TSVggY29tcGxpYW5jZS4KKworCQkoc2VuZF9wcmlvX2NoYXIpOiBOZXcgZnVuY3Rpb24sIGNhbGxlZCBieSB0aGUgaW9jdGwncworCQlUQ0lPRkYgYW5kIFRDSU9OOyB1c2VzIHRoZSBuZXcgZHJpdmVyIGNhbGwgc2VuZF94Y2hhcigpLAorCQl3aGljaCB3aWxsIHNlbmQgdGhlIFhPTiBvciBYT0ZGIGNoYXJhY3RlciBhdCBoaWdoIHByaW9yaXR5CisJCShhbmQgZXZlbiBpZiB0dHkgb3V0cHV0IGlzIHN0b3BwZWQpLgorCitXZWQgSnVuICA1IDE4OjUyOjA0IDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHB0eS5jIChwdHlfY2xvc2UpOiBXaGVuIGNsb3NpbmcgYSBwdHksIG1ha2Ugc3VyZSBwYWNrZXQgbW9kZSBpcworCSAJY2xlYXJlZC4KKworU3VuIE1heSAyNiAwOTozMzo1MiAxOTk2ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiB2ZXNhX2JsYW5rLmMgKHNldF92ZXNhX2JsYW5raW5nKTogQWRkIG1pc3NpbmcgdmVyaWZ5X2FyZWEoKSBjYWxsLgorCisJKiBzZWxlY3Rpb24uYyAoc2V0X3NlbGVjdGlvbik6IEFkZCBtaXNzaW5nIHZlcmlmeV9hcmVhKCkgY2FsbC4KKworCSogdHR5X2lvLmMgKHR0eV9pb2N0bCk6IEFkZCBtaXNzaW5nIHZlcmlmeV9hcmVhKCkgY2FsbHMuCisKKwkqIHNlcmlhbC5jIChyc19pb2N0bCk6IEFkZCBtaXNzaW5nIHZlcmlmeV9hcmVhKCkgY2FsbHMuCisJCShyc19pbml0KTogQWxsb3cgaW5pdGlhbGl6YXRpb24gb2Ygc2VyaWFsIGRyaXZlcgorCQljb25maWd1cmF0aW9uIGZyb20gYSBtb2R1bGUuCisKKwkqIHJhbmRvbS5jIChleHRyYWN0X2VudHJvcHkpOiBBZGQgbWlzc2luZyB2ZXJpZnlfYXJlYSBjYWxsLgorCQlEb24ndCBsaW1pdCBudW1iZXIgb2YgY2hhcmFjdGVycyByZXR1cm5lZCB0bworCQkzMiw3NjguIEV4dHJhY3QgZW50cm9weSBpcyBub3cgbm8gbG9uZ2VyIGEgaW5saW5lZAorCQlmdW5jdGlvbi4KKworCQkocmFuZG9tX3JlYWQpOiBDaGVjayByZXR1cm4gdmFsdWUgaW4gY2FzZSBleHRyYWN0X2VudHJvcHkKKwkJcmV0dXJucyBhbiBlcnJvci4KKworCQkoc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhCisJCXNlY3VyZSBUQ1Agc2VxdWVuY2UgbnVtYmVyLiAgVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBzb21lCisJCW5hc3R5IFRDUCBoaWphY2tpbmcgYXR0YWNrcy4KKwkKKwkJKGluaXRfc3RkX2RhdGEpOiBJbml0aWFsaXplIHVzaW5nIGdldHRpbWVvZmRheSgpIGluc3RlYWQgb2YKKwkJc3RydWN0IHRpbWV2YWwgeHRpbWUuCisKKwkJKGZhc3RfYWRkX2VudHJvcHlfd29yZCwgYWRkX2VudHJvcHlfd29yZCk6IFJlbmFtZSB0aGUKKwkJaW5saW5lIGZ1bmN0aW9uIGFkZF9lbnRyb3B5X3dvcmQoKSB0bworCQlmYXN0X2FkZF9lbnRyb3B5X3dvcmQoKS4gIE1ha2UgYWRkX2VudHJvcHlfd29yZCgpIGJlIHRoZQorCQlub24taW5saW5lZCBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIGluIG5vbi10aW1pbmcgY3JpdGljYWwKKwkJcGxhY2VzLCBpbiBvcmRlciB0byBzYXZlIHNwYWNlLgorCisJCShpbml0aWFsaXplX2JlbmNobWFyaywgYmVnaW5fYmVuY2htYXJrLCBlbmRfYmVuY2htYXJrKTogTmV3CisJCWZ1bmN0aW9ucyBkZWZpbmVkIHdoZW4gUkFORE9NX0JFTkNITUFSSyBpcyBkZWZpbmVkLiAgVGhleQorCQlhbGxvdyB1cyB0byBiZW5jaG1hcmsgdGhlIHNwZWVkIG9mIHRoZQorCQlhZGRfdGltZXJfcmFuZG9tbmVzcygpIGNhbGwuCisKKwkJKGludF9sbiwgcm90YXRlX2xlZnQpOiBBZGQgdHdvIG5ldyBpbmxpbmUgZnVuY3Rpb25zIHdpdGgKKwkJaTM4NiBvcHRpbWl6ZWQgYXNtIGluc3RydWN0aW9ucy4gIFRoaXMgc3BlZWRzIHVwIHRoZQorCQljcml0aWNhbCBhZGRfZW50cm9weV93b3JkKCkgYW5kIGFkZF90aW1lcl9yYW5kb21uZXNzKCkKKwkJZnVuY3Rpb25zLCB3aGljaCBhcmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgorCitUdWUgTWF5ICA3IDIyOjUxOjExIDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogcmFuZG9tLmMgKGFkZF90aW1lcl9yYW5kb21uZXNzKTogTGltaXQgdGhlIGFtb3VudCByYW5kb21uZXNzCisJCXRoYXQgd2UgZXN0aW1hdGUgdG8gMTIgYml0cy4gIChBbiBhcmJpdHJhcnkgYW1vdW50KS4KKworCQkoZXh0cmFjdF9lbnRyb3B5KTogVG8gbWFrZSBpdCBoYXJkZXIgdG8gYW5hbHl6ZSB0aGUgaGFzaAorCQlmdW5jdGlvbiwgZm9sZCB0aGUgaGFzaCBmdW5jdGlvbiBpbiBoYWxmIHVzaW5nIFhPUiwgYW5kCisJCXVzZSB0aGUgZm9sZGVkIHJlc3VsdCBhcyB0aGUgdmFsdWUgdG8gZW1pdCB0byB0aGUgdXNlci4KKwkJQWxzbywgYWRkIHRpbWVyIHJhbmRvbW5lc3MgZWFjaCBwYXNzIHRocm91Z2ggdGhlCisJCWV4YWN0X2VudHJvcHkgY2FsbCwgdG8gaW5jcmVhc2UgdGhlIGFtb3VudCBvZiB1bmtub3duCisJCXZhbHVlcyBkdXJpbmcgdGhlIGV4dHJhY3Rpb24gcHJvY2Vzcy4KKworCQkocmFuZG9tX2lvY3RsKTogVXNlIElPUi9JT1cgZGVmaW5pdGlvbnMgdG8gZGVmaW5lIHRoZQorCQlpb2N0bCB2YWx1ZXMgdXNlZCBieSB0aGUgL2Rldi9yYW5kb20gZHJpdmVyLiAgQWxsb3cgdGhlCisJCW9sZCBpb2N0bCB2YWx1ZXMgdG8gYmUgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJKGZvciBhIGxpbWl0ZWQgYW1vdW50IG9mIHRpbWUpLgorCitXZWQgQXByIDI0IDE0OjAyOjA0IDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHJhbmRvbS5jIChhZGRfdGltZXJfcmFuZG9tbmVzcyk6IFVzZSAybmQgZGVyaXZhdGl2ZSBhcyB3ZWxsIHRvCisJCWJldHRlciBlc3RpbWF0ZSBlbnRyb3B5LgorCisJCShyYW5kX2luaXRpYWxpemUpOiBFeHBsaWNpdGx5IGluaXRpYWxpemUgYWxsIHRoZSBwb2ludGVycworCQl0byBOVUxMLiAgKENsZWFyaW5nIHBvaW50ZXJzIHVzaW5nIG1lbXNldCBpc24ndCBwb3J0YWJsZS4pCisJCUluaXRpYWxpemUgdGhlIHJhbmRvbSBwb29sIHdpdGggT1MtZGVwZW5kZW50IGRhdGEuCisKKwkJKHJhbmRvbV93cml0ZSk6IEFkZCBzYW5pdHkgY2hlY2tpbmcgdG8gdGhlIGFyZ3VtZW50cyB0bworCQlyYW5kb21fd3JpdGUoKSwgc28gdGhhdCBiYWQgYXJndW1lbnRzIHdvbid0IGNhdXNlIGEga2VybmVsCisJCVNFR1YuIAorCisJCShyYW5kb21fcmVhZCk6IFVwZGF0ZSB0aGUgYWNjZXNzIHRpbWUgb2YgdGhlIGRldmljZSBpbm9kZQorCQl3aGVuIHlvdSByZXR1cm4gZGF0YSB0byB0aGUgdXNlci4KKworCQkocmFuZG9tX2lvY3RsKTogV2FrZSB1cCB0aGUgcmFuZG9tX3dhaXQgY2hhbm5lbCB3aGVuIHRoZXJlCisJCWFyZSBvbmx5IFdBSVRfSU5QVVRfQklUUyBhdmFpbGFibGUuICBBZGQgbW9yZSBwYXJhbm9pYQorCQljaGVja3MgdG8gbWFrZSBzdXJlIGVudHJvcHlfY291bnQgZG9lc24ndCBnbyBiZXlvbmQgdGhlCisJCWJvdW5kcyBvZiAoMCwgUE9PTFNJWkUpLiAgQWRkIGEgZmV3IG1pc3NpbmcgdmVyaWZ5X2FyZWEKKwkJY2hlY2tzLiAgQWRkIHN1cHBvcnQgZm9yIHRoZSBSTkRDTEVBUlBPT0wgaW9jdGwsIHdoaWNoCisJCXphcHMgdGhlIHJhbmRvbSBwb29sLgorCisJCShhZGRfdGltZXJfcmFuZG9tbmVzcyk6IFdha2UgdXAgdGhlIHJhbmRvbV93YWl0CisJCWNoYW5uZWwgb25seSB3aGVuIHRoZXJlIGFyZSBXQUlUX0lOUFVUX0JJVFMgYXZhaWxhYmxlLgorCisJCShyYW5kb21fc2VsZWN0KTogQWxsb3cgYSByYW5kb20gcmVmcmVzaCBkYWVtb24gcHJvY2VzcyB0bworCQlzZWxlY3Qgb24gL2Rldi9yYW5kb20gZm9yIHdyaXRpbmc7IHdha2UgdXAgdGhlIGRhZW1vbiB3aGVuCisJCXRoZXJlIGFyZSBsZXNzIHRoYW4gV0FJVF9PVVRQVVRfQklUUyBiaXRzIG9mIHJhbmRvbW5lc3MKKwkJYXZhaWxhYmxlLgorCitUdWUgQXByIDIzIDIyOjU2OjA3IDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKGluaXRfZGV2KTogQ2hhbmdlIHJldHVybiBjb2RlIHdoZW4gdXNlciBhdHRlbXB0cyB0bworCQlvcGVuIG1hc3RlciBwdHkgd2hpY2ggaXMgYWxyZWFkeSBvcGVuIGZyb20gRUFHQUlOIHRvIEVJTywKKwkJdG8gbWF0Y2ggd2l0aCBCU0QgZXhwZWN0YXRpb25zLiAgRUlPIGlzIG1vcmUgY29ycmVjdAorCQlhbnl3YXksIHNpbmNlIEVBR0FJTiBpbXBsaWVzIHRoYXQgcmV0cnlpbmcgd2lsbCBiZQorCQlzdWNjZXNzZnVsIC0tLSB3aGljaCBpdCBtaWdodCBiZS4uLi4gRXZlbnR1YWxseSEhCisKKwkqIHB0eS5jIChwdHlfb3BlbiwgcHR5X2Nsb3NlKTogRml4IHdhaXQgbG9vcCBzbyB0aGF0IHdlIGRvbid0CisJCWJ1c3kgbG9vcCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbWFzdGVyIHNpZGUgdG8gb3Blbi4KKwkJRml4IHR0eSBvcGVuaW5nL2Nsb3NpbmcgbG9naWMuICBUVFlfU0xBVkVfQ0xPU0VEIHdhcworCQlyZW5hbWVkIHRvIFRUWV9PVEhFUl9DTE9TRUQsIHNvIHRoYXQgdGhlIG5hbWUgaXMgbW9yZQorCQlkZXNjcmlwdGl2ZS4gIEFsc28gZml4ZWQgY29kZSBzbyB0aGF0IHRoZSB0dHkgZmxhZworCQlhY3R1YWxseSB3b3JrcyBjb3JyZWN0bHkgbm93Li4uLgorCitNb24gQXByICAxIDEwOjIyOjAxIDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMgKHJzX2Nsb3NlKTogQ2xlYW5lZCB1cCBtb2R1bGFyaXphdGlvbiBjaGFuZ2VzLgorCQlSZW1vdmUgY29kZSB3aGljaCBmb3JjZWQgbGluZSBkaXNjaXBsaW5lIGJhY2sgdG8gTl9UVFkKKwkJdGhpcyBpcyBkb25lIGluIHRoZSB0dHkgdXBwZXIgbGF5ZXJzLCBhbmQgdGhlcmUncyBubworCQlyZWFzb24gdG8gZG8gaXQgaGVyZS4gIChNYWtpbmcgdGhpcyBjaGFuZ2UgYWxzbworCQlyZW1vdmVkIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBzZXJpYWwgbW9kdWxlIGFjY2VzcworCQl0aGUgaW50ZXJuYWwga2VybmVsIHN5bWJvbCAibGRpc2NzIi4pCisKKwkqIHR0eV9pby5jICh0dHlfaW5pdCk6IEZvcm1hbGx5IHJlZ2lzdGVyIGEgdHR5X2RyaXZlciBlbnRyeSBmb3IKKwkJL2Rldi90dHkgKGRldmljZSA0LCAwKSBhbmQgL2Rldi9jb25zb2xlIChkZXZpY2UgNSwgMCkuCisJCVRoaXMgZ3VhcmFudGVlcyB0aGF0IG1ham9yIGRldmljZSBudW1iZXJzIDQgYW5kIDUgd2lsbCBiZQorCQlyZXNlcnZlZCBmb3IgdGhlIHR0eSBzdWJzeXN0ZW0gKGFzIHRoZXkgaGF2ZSB0byBiZSBiZWNhdXNlCisJCW9mIC9kZXYvdHR5IGFuZCAvZGV2L2NvbnNvbGUpLiAgUmVtb3ZlZCB0dHlfcmVnZGV2LCBhcworCQl0aGlzIGludGVyZmFjZSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgorCitTdW4gTWFyIDE3IDIwOjQyOjQ3IEdNVCAxOTk2IDxhaEBkb2MuaWMuYWMudWs+CisKKwkqIHNlcmlhbC5jIDogbW9kdWxhcmlzYXRpb24gKGNoYW5nZXMgaW4gbGludXgvZnMvZGV2aWNlLmMgYWxsb3cKKwkJa2VybmVsZCB0byBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIHNlcmlhbCBtb2R1bGUpLgorCisJKiBNYWtlZmlsZSwgQ29uZmlnLmluIDogc2VyaWFsIG1vZHVsYXJpc2F0aW9uIGFkZHMuCisKKwkqIHR0eV9pby5jIDogdHR5X2luaXRfY3R0eSB1c2VkIGJ5IHRvIHJlZ2lzdGVyICJjdWEiIGRyaXZlciBqdXN0CisJCWZvciB0aGUgL2Rldi90dHkgZGV2aWNlICg1LDApLiAgQWRkZWQgdHR5X3JlZ2Rldi4KKwkKKwkqIHNlcmlhbC5jIChzaHV0ZG93biwgcnNfaW9jdGwpIDogd2hlbiBwb3J0IHNodXRzIGRvd24gd2FrZXVwIHByb2Nlc3NlcworCSAgd2FpdGluZyBvbiBkZWx0YV9tc3Jfd2FpdC4gVGhlIFRJT0NNSVdBSVQgaW9jdGwgcmV0dXJucyBFSU8KKwkgIGlmIG5vIGNoYW5nZSB3YXMgZG9uZSBzaW5jZSB0aGUgdGltZSBvZiBjYWxsLgorCitTYXQgTWFyIDE2IDE0OjMzOjEzIDE5OTYgPGFlYkBjd2kubmw+CisKKwkqIHR0eV9pby5jIChkaXNhc3NvY2lhdGVfY3R0eSk6IElmIGRpc2Fzc29jaWF0ZV9jdHR5IGlzIGNhbGxlZCBieQorCQlleGl0LCBkbyBub3QgcGVyZm9ybSBhbiBpbXBsaWNpdCB2aGFuZ3VwIG9uIGEgcHR5LgorCitGcmkgRmViICA5IDE0OjE1OjQ3IDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMgKGJsb2NrX3RpbF9yZWFkeSk6IEZpeGVkIGFub3RoZXIgcmFjZSBjb25kaXRpb24gd2hpY2gKKwkJaGFwcGVucyBpZiBhIGhhbmd1cCBoYXBwZW5zIGR1cmluZyB0aGUgb3Blbi4KKworV2VkIEphbiAxMCAxMDowODowMCAxOTk2ICAgIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChibG9ja190aWxfcmVhZHkpOiBSZW1vdmUgcmFjZSBjb25kaXRpb24gd2hpY2ggaGFwcGVuZWQKKwkJaWYgYSBoYW5ndXAgY29uZGl0aW9uIGhhcHBlbmVkIGR1cmluZyB0aGUgc2V0dXAgb2YgdGhlCisJCVVBUlQsIGJlZm9yZSByc19vcGVuKCkgY2FsbGVkIGJsb2NrX3RpbF9yZWFkeSgpLiAgVGhpcworCQljYXVzZWQgdGhlIGluZm8tPmNvdW50IGNvdW50ZXIgdG8gYmUgZXJyb25lb3VzbHkKKwkJZGVjcmVtZW50ZWQuCisKKwkqIHNlcmlhbC5jIChzdGFydHVwLCByc19vcGVuKTogUmVtb3ZlIHJhY2UgY29uZGl0aW9uIHRoYXQgY291bGQKKwkJY2F1c2UgYSBtZW1vcnkgbGVhayBvZiBvbmUgcGFnZS4gIChGb3J0dW5hdGVseSwgYm90aCByYWNlCisJCWNvbmRpdGlvbnMgd2VyZSByZWxhdGl2ZWx5IHJhcmUgaW4gcHJhY3RpY2UuKQorCitUdWUgRGVjICA1IDEzOjIxOjI3IDE5OTUgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMgKGNoZWNrX21vZGVtX3N0YXR1cywgcnNfaW9jdGwpOiBTdXBwb3J0IHRoZSBuZXcKKwkJaW9jdGwoKSdzIFRJT0NHSUNPVU5ULCBUSU9DTUlXQUlULiAgVGhlc2UgYWxsb3cgYW4KKwkJYXBwbGljYXRpb24gcHJvZ3JhbSB0byB3YWl0IG9uIGEgbW9kZW0gc2VyaWFsIHJlZ2lzdGVyCisJCXN0YXR1cyBiaXQgY2hhbmdlLCBhbmQgdG8gZmluZCBvdXQgaG93IG1hbnkgY2hhbmdlcyBoYXZlCisJCXRha2VuIHBsYWNlIGZvciB0aGUgTVNSIGJpdHMuCisKKwkJKHJzX3dyaXRlKTogRWxpbWluYXRlIGEgcmFjZSBjb25kaXRpb24gd2hpY2ggaXMgaW50cm9kdWNlZAorCQlpZiBpdCBpcyBuZWNlc3NhcnkgdG8gd2FpdCBmb3IgdGhlIHNlbWFwaG9yZS4KKworU2F0IE5vdiAgNCAxNzoxNDo0NSAxOTk1ICAgIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfaW5pdCk6IE1vdmUgcmVnaXN0cmF0aW9uIG9mIFRUWV9NQUpPUiBhbmQKKwkJVFRZX0FVWF9NQUpPUiB0byB0aGUgZW5kLCBzbyB0aGF0IC9wcm9jL2RldmljZXMgbG9va3MKKwkJcHJldHRpZXIuIAorCisJKiBwdHkuYyAocHR5X2luaXQpOiBVc2UgbmV3IG1ham9yIG51bWJlcnMgZm9yIFBUWSBtYXN0ZXIgYW5kIHNsYXZlCisJCWRldmljZXMuICBUaGlzIGFsbG93IHVzIHRvIGhhdmUgbW9yZSB0aGFuIDY0IHB0eSdzLiAgV2UKKwkJcmVnaXN0ZXIgdGhlIG9sZCBwdHkgZGV2aWNlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJCU5vdGUgdGhhdCBhIHN5c3RlbSBzaG91bGQgZWl0aGVyIGJlIHVzaW5nIHRoZSBvbGQgcHR5CisJCWRldmljZXMgb3IgdGhlIG5ldyBwdHkgZGV2aWNlcyAtLS0gaW4gZ2VuZXJhbCwgaXQgc2hvdWxkCisJCXRyeSB0byB1c2UgYm90aCwgc2luY2UgdGhleSBtYXAgaW50byB0aGUgc2FtZSBwdHkgdGFibGUuCisJCVRoZSBvbGQgcHR5IGRldmljZXMgYXJlIHN0cmljdGx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKworV2VkIE9jdCAxMSAxMjo0NToyNCAxOTk1ICAgIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jIChkaXNhc3NvY2lhdGVfY3R0eSk6IElmIGRpc2Fzc29jaWF0ZV9jdHR5IGlzIGNhbGxlZCBieQorCQlleGl0LCBwZXJmb3JtIGFuIGltcGxpY2l0IHZoYW5ndXAgb24gdGhlIHR0eS4KKworCSogcHR5LmMgKHB0eV9jbG9zZSk6IFdoZW4gdGhlIG1hc3RlciBwdHkgaXMgY2xvc2VkLCBzZW5kIGEgaGFuZ3VwCisJCXRvIHRoZSBzbGF2ZSBwdHkuCisJCShwdHlfb3Blbik6IFVzZSB0aGUgZmxhZyBUVFlfU0xBVkVfQ0xPU0VEIHRvIHRlc3QgdG8gc2VlCisJCWlmIHRoZXJlIGFyZSBhbnkgb3BlbiBzbGF2ZSBwdHlzLCBpbnN0ZWFkIG9mIHVzaW5nCisJCXR0eS0+bGluay0+Y291bnQuICBUaGUgb2xkIG1ldGhvZCBnb3QgY29uZnVzZWQgaWYgdGhlcmUKKwkJd2VyZSBwcm9jZXNzZXMgdGhhdCBoYWQgaHVuZy11cCBmaWxlIGRlc2NyaXB0b3JzIG9uIHRoZQorCQlzbGF2ZSB0dHkuCisKK1R1ZSBNYXkgIDIgMDA6NTM6MjUgMTk5NSAgICA8dHl0c29AcnN4LTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfc2V0X2xkaXNjKTogV2FpdCB1bnRpbCB0aGUgb3V0cHV0IGJ1ZmZlciBpcworCQlkcmFpbmVkIGJlZm9yZSBjbG9zaW5nIHRoZSBvbGQgbGluZSBkaXNjaXBsaW5lIC0tLSBuZWVkZWQKKwkJaW4gb25seSBvbmUgY2FzZTogWE9OL1hPRkYgcHJvY2Vzc2luZy4KKworCSogbl90dHkuYyAobl90dHlfY2xvc2UpOiBEb24ndCBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgb3V0cHV0CisJCWRyaXZlciBpcyBjbG9zZWQ7IGluIGdlbmVyYWwsIHRoZSBsaW5lIGRpc2NpcGxpbmUKKwkJc2hvdWxkbid0IGNhcmUgaWYgdGhlIGhhcmR3YXJlIGlzIGZpbmlzaGVkCisJCXRyYW5zbWl0dGluZyBiZWZvcmUgdGhlIGxpbmUgZGlzY2lwbGluZSB0ZXJtaW5hdGVzLgorCisJKiB0dHlfaW8uYyAocmVsZWFzZV9kZXYpOiBTaHV0ZG93biB0aGUgbGluZSBkaXNjaXBsaW5lIGFmdGVyCisJCWRlY3JlbWVudGluZyB0aGUgdHR5IGNvdW50IHZhcmlhYmxlOyBidXQgc2V0IHRoZQorCQlUVFlfQ0xPU0lORyBmbGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgdHR5IHN0cnVjdHVyZQorCQlpc24ndCBsb25nIGZvciB0aGlzIHdvcmxkLgorCisJKiB0dHlfaW8uYyAoaW5pdF9kZXYpOiBBZGQgc2FuaXR5IGNvZGUgdG8gY2hlY2sgdG8gc2VlIGlmCisJCVRUWV9DTE9TSU5HIGlzIHNldCBvbiBhIHR0eSBzdHJ1Y3R1cmU7IGlmIHNvLCBzb21ldGhpbmcKKwkJYmFkIGhhcyBoYXBwZW5lZCAocHJvYmFibHkgYSBsaW5lIGRpc2NpcGxpbmUgY2xvc2UgYmxvY2tlZAorCQl3aGVuIGl0IHNob3VsZG4ndCBoYXZlOyBzbyBkbyBhIGtlcm5lbCBwcmludGsgYW5kIHRoZW4KKwkJcmV0dXJuIGFuIGVycm9yKS4KKworV2VkIEFwciAyNiAxMDoyMzo0NCAxOTk1ICBUaGVvZG9yZSBZLiBUcydvICA8dHl0c29AbG9jYWxob3N0PgorCisJKiB0dHlfaW8uYyAocmVsZWFzZV9kZXYpOiBUcnkgdG8gc2h1dGRvd24gdGhlIGxpbmUgZGlzY2lwbGluZQorCQkqYmVmb3JlKiBkZWNyZW1lbnRpbmcgdGhlIHR0eSBjb3VudCB2YXJpYWJsZTsgdGhpcyByZW1vdmVzCisJCWEgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIHdoaWNoIG9jY3VycyB3aGVuIHRoZSBsaW5lCisJCWRpc2NpcGxpbmUgY2xvc2UgYmxvY2tzLCBhbmQgYW5vdGhlciBwcm9jZXNzIHRoZW4gdHJpZXMKKwkJb3BlbiB0aGUgc2FtZSBzZXJpYWwgcG9ydC4KKworCSogc2VyaWFsLmMgKHJzX2hhbmd1cCk6IFdoZW4gaGFuZ2luZyB1cCwgZmx1c2ggdGhlIG91dHB1dCBidWZmZXIKKwkJYmVmb3JlIHNodXR0aW5nIGRvd24gdGhlIFVBUlQuICBPdGhlcndpc2UgdGhlIGxpbmUKKwkJZGlzY2lwbGluZSBjbG9zZSBibG9ja3Mgd2FpdGluZyBmb3IgdGhlIGNoYXJhY3RlcnMgdG8gZ2V0CisJCWZsdXNoZWQsIHdoaWNoIG5ldmVyIGhhcHBlbnMgdW50aWwgdGhlIHNlcmlhbCBwb3J0IGdldHMgcmV1c2VkLgorCitXZWQgQXByIDEyIDA4OjA2OjE2IDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gIDx0eXRzb0Bsb2NhbGhvc3Q+CisKKwkqIHNlcmlhbC5jIChkb19zZXJpYWxfaGFuZ3VwLCBkb19zb2Z0aW50LCBjaGVja19tb2RlbV9zdGF0dXMsCisJCXJzX2luaXQpOiAgSGFuZ3VwcyBhcmUgbm93IHNjaGVkdWxlZCB2aWEgYSBzZXBhcmF0ZSB0cXVldWUKKwkJc3RydWN0dXJlIGluIHRoZSBhc3luY19zdHJ1Y3Qgc3RydWN0dXJlLCB0cXVldWVfaGFuZ3VwLgorCQlUaGlzIHRhc2sgaXMgcHVzaGVkIG9uIHRvIHRoZSB0cV9zY2hlZHVsZSBxdWV1ZSwgc28gdGhhdAorCQlpdCBpcyBwcm9jZXNzZWQgc3luY2hyb25vdXNseSBieSB0aGUgc2NoZWR1bGVyLgorCitTYXQgRmViIDE4IDEyOjEzOjUxIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvLmMgKGRpc2Fzc29jaWF0ZV9jdHR5LCB0dHlfb3BlbiwgdHR5X2lvY3RsKTogQ2xlYXIKKwkJY3VycmVudC0+dHR5X29sZF9wZ3JwIGZpZWxkIHdoZW4gYSBzZXNzaW9uIGxlYWRlcgorCQlhY3F1aXJlcyBhIGNvbnRyb2xsaW5nIHR0eSwgYW5kIGFmdGVyIGEgc2Vzc2lvbiBsZWFkZXIKKwkJaGFzIGRpc2Fzc29jaWF0ZWQgZnJvbSBhIGNvbnRyb2xsaW5nIHR0eS4KKworRnJpIEZlYiAxNyAwOTozNDowOSAxOTk1ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19pbnRlcnJ1cHRfc2luZ2xlLCByc19pbnRlcnJ1cHQsIHJzX2ludGVycnVwdF9tdWx0aSk6IAorCQlDaGFuZ2UgdGhlIG51bWJlciBvZiBwYXNzZXMgbWFkZSBmcm9tIDY0IHRvIGJlIDI1NiwKKwkJY29uZmlndXJhYmxlIHdpdGggdGhlICNkZWZpbmUgUlNfSVNSX1BBU1NfTElNSVQuCisKKwkqIHNlcmlhbC5jIChyc19pbml0LCBzZXRfc2VyaWFsX2luZm8sIGdldF9zZXJpYWxfaW5mbywgcnNfY2xvc2UpOgorCQlSZW1vdmUgc3VwcG9ydCBmb3IgY2xvc2luZ193YWl0Mi4gIEluc3RlYWQsIHNldAorCQl0dHktPmNsb3NpbmcgYW5kIHJlbHkgb24gdGhlIGxpbmUgZGlzY2lwbGluZSB0byBwcmV2ZW50CisJCWVjaG8gd2Fycy4KKworCSogbl90dHkuYyAobl90dHlfcmVjZWl2ZV9jaGFyKTogIElFWFRFTiBkb2VzIG5vdCBuZWVkIHRvIGJlCisJCWVuYWJsZWQgaW4gb3JkZXIgZm9yIElYQU5ZIHRvIGJlIGFjdGl2ZS4KKworCQlJZiB0dHktPmNsb3NpbmcgaXMgc2V0LCB0aGVuIG9ubHkgcHJvY2VzcyBYT04gYW5kIFhPRkYKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLgorCitTdW4gRmViIDEyIDIzOjU3OjQ4IDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHJzX3RpbWVyKTogQ2hhbmdlIHRoZSBpbnRlcnJ1cHQgcG9sbCB0aW1lIGZyb20gNjAKKwkJc2Vjb25kcyB0byAxMCBzZWNvbmRzLCBjb25maWd1cmFibGUgd2l0aCB0aGUgI2RlZmluZQorCQlSU19TVFJPQkVfVElNRS4KKworCSogc2VyaWFsLmMgKHJzX2ludGVycnVwdF9tdWx0aSwgc3RhcnR1cCwgc2h1dGRvd24sIHJzX2lvY3RsLAorCQlzZXRfbXVsdGlwb3J0X3N0cnVjdCwgZ2V0X211bHRpcG9ydF9zdHJ1Y3QpOiBBZGQKKwkJcHJvdmlzaW9ucyBmb3IgYSBuZXcgdHlwZSBvZiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLAorCQl3aGljaCBiZXR0ZXIgc3VwcG9ydHMgbXVsdGlwbGUgc2VyaWFsIHBvcnRzIG9uIGEgc2luZ2xlCisJCUlSUS4gIAorCitTdW4gRmViICA1IDE5OjM1OjExIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvY3RsLmMgKG5fdHR5X2lvY3RsLCBzZXRfdGVybWlvcywgdHR5X3dhaXRfdW50aWxfc2VudCk6IAorCSogc2VyaWFsLmMgKHJzX2lvY3RsLCByc19jbG9zZSk6IAorCSogY3ljbGFkZXMuYyAoY3lfaW9jdGwsIGN5X2Nsb3NlKTogCisJKiBuX3R0eS5jIChuX3R0eV9jbG9zZSk6ICBSZW5hbWUgd2FpdF91bnRpbF9zZW50IHRvCisJCXR0eV93YWl0X3VudGlsX3NlbnQsIHNvIHRoYXQgaXQncyBhIGJldHRlciBuYW1lIHRvIGV4cG9ydAorCQlpbiBrc3ltcy5jLgorCitTYXQgRmViICA0IDIzOjM2OjIwIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHJzX2Nsb3NlKTogQWRkZWQgbWlzc2luZyBjaGVjayBmb3IgY2xvc2luZ193YWl0MiBiZWluZworCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORS4KKworVGh1IEphbiAyNiAwOTowMjo0OSAxOTk1ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19pbml0LCBzZXRfc2VyaWFsX2luZm8sIGdldF9zZXJpYWxfaW5mbywKKwkJcnNfY2xvc2UpOiBTdXBwb3J0IGNsb3NlX3dhaXQgaW4gdGhlIHNlcmlhbCBkcml2ZXIuCisJCVRoaXMgaXMgaGVscGZ1bCBmb3Igc2xvdyBkZXZpY2VzIChsaWtlIHNlcmlhbAorCQlwbG90dGVycykgc28gdGhhdCB0aGVpciBvdXRwdXRzIGRvbid0IGdldCBmbHVzaGVkIHVwb24KKwkJZGV2aWNlIGNsb3NlLiAgVGhpcyBoYXMgdG8gYmUgY29uZmlndXJhYmxlIGJlY2F1c2UKKwkJbm9ybWFsbHkgd2UgZG9uJ3Qgd2FudCBwb3J0cyB0byBiZSBodW5nIHVwIGZvciBsb25nCisJCXBlcmlvZHMgb2YgdGltZSBkdXJpbmcgYSBjbG9zZSB3aGVuIHRoZXkgYXJlIG5vdAorCQljb25uZWN0ZWQgdG8gYSBkZXZpY2UsIG9yIHRoZSBkZXZpY2UgaXMgcG93ZXJlZCBvZmYuCisKKwkJVGhlIGRlZmF1bHQgaXMgdG8gd2FpdCAzMCBzZWNvbmRzOyBpbiB0aGUgY2FzZSBvZiBhCisJCXZlcnkgc2xvdyBkZXZpY2UsIHRoZSBjbG9zZV93YWl0IHRpbWVvdXQgc2hvdWxkIGJlCisJCWxlbmd0aGVuZWQuICBJZiBpdCBpcyBzZXQgdG8gMCwgdGhlIGtlcm5lbCB3aWxsIHdhaXQKKwkJZm9yZXZlciBmb3IgYWxsIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLgorCitUaHUgSmFuIDE3IDAxOjE3OjIwIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHN0YXJ0dXAsIGNoYW5nZV9zcGVlZCwgcnNfaW5pdCk6IEFkZCBzdXBwb3J0IHRvIGRldGVjdAorCQl0aGUgU3RhclRlY2ggMTY2NTAgY2hpcC4gIFRyZWF0IGl0IGFzIGEgMTY0NTAgZm9yIG5vdywKKwkJYmVjYXVzZSBvZiBpdHMgRklGTyBidWdzLgorCitUaHUgSmFuICA1IDIxOjIxOjU3IDE5OTUgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc2VyaWFsLmM6IChyZWNlaXZlX2NoYXIpOiBBZGRlZCBjb3VudGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcAorCQl3aGVuIGEgUENNQ0lBIHNlcmlhbCBkZXZpY2UgaXMgZWplY3RlZC4KKworVGh1IERlYyAyOSAxNzo1Mzo0OCAxOTk0ICAgIDx0eXRzb0Byc3gtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKGNoZWNrX3R0eV9jb3VudCk6IE5ldyBwcm9jZWR1cmUgd2hpY2ggY2hlY2tzCisJCXR0eS0+Y291bnQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgbWF0Y2hlcyB3aXRoIHRoZSBudW1iZXIgb2YKKwkJb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHdoaWNoIHBvaW50IGF0IHRoZSBzdHJ1Y3R1cmUuICBJZgorCQl0aGUgbnVtYmVyIGRvZXNuJ3QgbWF0Y2gsIGl0IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KKworV2VkIERlYyAyOCAxNTo0MTo1MSAxOTk0ICAgIDx0eXRzb0Byc3gtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKGRvX3R0eV9oYW5ndXAsIGRpc2Fzc29jaWF0ZV9jdHR5KTogQXQgaGFuZ3VwIHRpbWUsCisJCXNhdmUgdGhlIHR0eSdzIGN1cnJlbnQgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGluIHRoZQorCQlzZXNzaW9uIGxlYWRlcidzIHRhc2sgc3RydWN0dXJlLiAgV2hlbiB0aGUgc2Vzc2lvbiBsZWFkZXIKKwkJdGVybWluYXRlcywgc2VuZCBhIFNJR0hVUCwgU0lHQ09OVCB0byB0aGF0IHByb2Nlc3MgZ3JvdXAuCisJCVRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IFBPU0lYLCBidXQgaXQncyBub3QgcHJvaGliaXRlZAorCQllaXRoZXIsIGFuZCBpdCBhcHBlYXJzIHRvIGJlIHRoZSBsZWFzdCBpbnRydXNpdmUgd2F5CisJCXRvIGZpeCBhIHByb2JsZW0gdGhhdCBkaWFsdXAgc2VydmVycyBoYXZlIHdpdGgKKwkJb3JwaGFuZWQgcHJvY2VzcyBncm91cHMgY2F1c2VkIGJ5IG1vZGVtIGhhbmd1cHMuCisKK1RodSBEZWMgIDggMTQ6NTI6MTEgMTk5NCAgICA8dHl0c29AcnN4LTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChyc19pb2N0bCk6IERvbid0IGFsbG93IG1vc3QgaW9jdGwncyBpZiB0aGUgc2VyaWFsIHBvcnQKKwkJaXNuJ3QgaW5pdGlhbGl6ZWQuCisKKwkqIHNlcmlhbC5jIChyc19jbG9zZSk6IERvbid0IGNsZWFyIHRoZSBJRVIgaWYgdGhlIHNlcmlhbCBwb3J0CisJCWlzbid0IGluaXRpYWxpemVkLiAKKworCSogc2VyaWFsLmMgKGJsb2NrX3RpbF9yZWFkeSk6IERvbid0IHRyeSB0byBibG9jayBvbiB0aGUgZGlhbGluCisJCXBvcnQgaWYgdGhlIHNlcmlhbCBwb3J0IGlzbid0IGluaXRpYWxpemVkLgorCitXZWQgRGVjICA3IDEwOjQ4OjMwIDE5OTQgIFNpIFBhcmsgKHNpQHdpbXBvbC5kZW1vbi5jby51aykKKwkqIHR0eV9pby5jICh0dHlfcmVnaXN0ZXJfZHJpdmVyKTogRml4IGJ1ZyB3aGVuIGxpbmtpbmcgb250bworCQl0aGUgdHR5X2RyaXZlcnMgbGlzdC4gV2Ugbm93IHRlc3QgdGhhdCB0aGVyZSBhcmUgZWxlbWVudHMKKwkJYWxyZWFkeSBvbiB0aGUgbGlzdCBiZWZvcmUgc2V0dGluZyB0aGUgYmFjayBsaW5rIGZyb20gdGhlCisJCWZpcnN0IGVsZW1lbnQgdG8gdGhlIG5ldyBkcml2ZXIuCisKKwkqIHR0eV9pby5jICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIpOiBGaXggYnVnIGluIHVubGlua2luZyB0aGUKKwkJc3BlY2lmaWVkIGRyaXZlciBmcm9tIHRoZSB0dHlfZHJpdmVycyBsaXN0LiBXZSB3ZXJlIG5vdAorCQlzZXR0aW5nIHRoZSBiYWNrIGxpbmsgY29ycmVjdGx5LiBUaGlzIHVzZWQgdG8gcmVzdWx0IGluCisJCWEgZGFuZ2xpbmcgYmFjayBsaW5rIHBvaW50ZXIgYW5kIGNhdXNlIHBhbmljcyBvbiB0aGUgbmV4dAorCQljYWxsIHRvIGdldF90dHlfZHJpdmVyKCkuCisKK1R1ZSBOb3YgMjkgMTA6MjE6MDkgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKTogRml4IGJ1ZyBpbgorCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZmNvdW50IGlzCisJCXRlc3RlZCwgaW5zdGVhZCBvZiB0aGUgcmVmY291bnQgaXRzZWxmLiAgVGhpcyBjYXVzZWQKKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyIHRvIGFsd2F5cyByZXR1cm4gRUJVU1kuCisKK1NhdCBOb3YgMjYgMTE6NTk6MjQgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAodHR5X2lvY3RsKTogQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgaW9jdGwKKwkJVElPQ1RUWUdTVFJVQ1QsIHdoaWNoIGFsbG93IGEga2VybmVsIGRlYnVnZ2luZyBwcm9ncmFtCisJCWRpcmVjdCByZWFkIGFjY2VzcyB0byB0aGUgdHR5IGFuZCB0dHlfZHJpdmVyIHN0cnVjdHVyZXMuCisKK0ZyaSBOb3YgMjUgMTc6MjY6MjIgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiBzZXJpYWwuYyAocnNfc2V0X3Rlcm1pb3MpOiBEb24ndCB3YWtlIHVwIHByb2Nlc3NlcyBibG9ja2VkIGluCisJCW9wZW4gd2hlbiB0aGUgQ0xPQ0FMIGZsYWcgY2hhbmdlcywgc2luY2UgYSBibG9ja2luZworCQlvcGVuIG9ubHkgc2FtcGxlcyB0aGUgQ0xPQ0FMIGZsYWcgb25jZSB3aGVuIGl0IGJsb2NrcywKKwkJYW5kIGRvZXNuJ3QgY2hlY2sgaXQgYWdhaW4uICAobi5iLiAgRnJlZUJTRCBoYXMgYQorCQlkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIGJsb2NraW5nIG9wZW5zOyBpdCdzIG5vdCBjbGVhcgorCQl3aGV0aGVyIExpbnV4IG9yIEZyZWVCU0QncyBpbnRlcnByZXRhdGlvbiBpcyBjb3JyZWN0LgorCQlQT1NJWCBkb2Vzbid0IGdpdmUgY2xlYXIgZ3VpZGFuY2Ugb24gdGhpcyBpc3N1ZSwgc28KKwkJdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuLi4uKQorCisJKiBzZXJpYWwuYyAoYmxvY2tfdGlsX3JlYWR5KTogVXNlIHRoZSBjb3JyZWN0IHRlcm1pb3Mgc3RydWN0dXJlIHRvCisJCWNoZWNrIHRoZSBDTE9DQUwgZmxhZy4gIElmIHRoZSBjdWFYWCBkZXZpY2UgaXMgYWN0aXZlLAorCQl0aGVuIGNoZWNrIHRoZSBzYXZlZCB0ZXJtaW9zIGZvciB0aGUgdHR5U1hYIGRldmljZS4KKwkJT3RoZXJ3aXNlLCB1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGVybWlvcyBzdHJ1Y3R1cmUuCisKK1N1biBOb3YgIDYgMjE6MDU6NDQgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiBzZXJpYWwuYyAoY2hhbmdlX3NwZWVkKTogQWRkIHN1cHBvcnQgZm9yIGRpcmVjdCBhY2Nlc3Mgb2YKKwkJNTcsNjAwIGFuZCAxMTUsMjAwIGJwcy4KKworV2VkIE5vdiAgMiAxMDozMjozNiAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIG5fdHR5LmMgKG5fdHR5X3JlY2VpdmVfcm9vbSk6IE9ubHkgYWxsb3cgZXhjZXNzIGNoYXJhY3RlcnMKKwkJdGhyb3VnaCBpZiB3ZSBhcmUgaW4gSUNBTk9OIG1vZGUgKmFuZCogdGhlcmUgYXJlIG90aGVyIG5vCisJCXBlbmRpbmcgbGluZXMgaW4gdGhlIGJ1ZmZlci4gIE90aGVyd2lzZSBjdXQgYW5kIHBhc3RlIG92ZXIKKwkJNGsgYnJlYWtzLgorCitTYXQgT2N0IDI5IDE4OjE3OjM0IDE5OTQgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHJzX2lvY3RsLCBnZXRfbHNyX2luZm8pOiBBZGRlZCBwYXRjaCBzdWdnZXN0ZWQgYnkgQXJuZQorCQlSaWliZXIgc28gdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgY2FuIHRlbGwgd2hlbiB0aGUKKwkJdHJhbnNtaXR0ZXIgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkuCisKK1RodSBPY3QgMjcgMjM6MTQ6MjkgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW9jdGwuYyAod2FpdF91bnRpbF9zZW50KTogQWRkZWQgZGVidWdnaW5nIHByaW50ayBzdGF0ZW1lbnRzCisJCSh1bmRlciB0aGUgI2lmZGVmIFRUWV9ERUJVR19XQUlUX1VOVElMX1NFTlQpICAKKworCSogc2VyaWFsLmMgKHJzX2ludGVycnVwdCwgcnNfaW50ZXJydXB0X3NpbmdsZSwgcmVjZWl2ZV9jaGFycywKKwkJY2hhbmdlX3NwZWVkLCByc19jbG9zZSk6IHJzX2Nsb3NlIG5vdyBkaXNhYmxlcyByZWNlaXZlcgorCQlpbnRlcnJ1cHRzIHdoZW4gY2xvc2luZyB0aGUgc2VyaWFsIHBvcnQuICBUaGlzIGFsbG93cyB0aGUKKwkJc2VyaWFsIHBvcnQgdG8gY2xvc2UgcXVpY2tseSB3aGVuIExpbnV4IGFuZCBhIG1vZGVtIChvciBhCisJCW1vdXNlKSBhcmUgZW5nYWdlZCBpbiBhbiBlY2hvIHdhcjsgd2hlbiBjbG9zaW5nIHRoZSBzZXJpYWwKKwkJcG9ydCwgd2Ugbm93IGZpcnN0IHN0b3AgbGlzdGVuaW5nIHRvIGluY29taW5nIGNoYXJhY3RlcnMsCisJCWFuZCAqdGhlbiogd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBkcmFpbi4gIAorCisJCUluIG9yZGVyIHRvIG1ha2UgdGhpcyBjaGFuZ2UsIHRoZSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrCisJCWlzIG5vdyB1c2VkIHRvIGNvbnRyb2wgd2hhdCBiaXRzIG9mIHRoZSBsaW5lIHN0YXR1cworCQlyZWdpc3RlciBhcmUgbG9va2VkIGF0IGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpbiBhbGwKKwkJY2FzZXM7IHByZXZpb3VzbHkgaXQgd2FzIG9ubHkgdXNlZCBpbiByZWNlaXZlX2NoYXJzIHRvCisJCXNlbGVjdCBhIGZldyBvZiB0aGUgc3RhdHVzIGJpdHMuCisKK01vbiBPY3QgMjQgMjM6MzY6MjEgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiBzZXJpYWwuYyAocnNfY2xvc2UpOiBBZGQgYSB0aW1lb3V0IHRvIHRoZSB0cmFuc21pdHRlciBmbHVzaAorCQlsb29wOyB0aGlzIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2sgaW4gY2FzZSB3ZSBoYXZlIGZsYWt5CisJCShvciBub24tZXhpc3RlbnQtYnV0LWNvbmZpZ3VyZWQtYnktdGhlLXVzZXIpIGhhcmR3YXJlLgorCitGcmkgT2N0IDIxIDA5OjM3OjIzIDE5OTQgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvLmMgKHR0eV9mYXN5bmMpOiBXaGVuIGFzeW5jaHJvbm91cyBJL08gaXMgZW5hYmxlZCwgaWYgdGhlCisJCXByb2Nlc3Mgb3IgcHJvY2VzcyBncm91cCBoYXMgbm90IGJlIHNwZWNpZmllZCB5ZXQsIHNldCBpdAorCQl0byBiZSB0aGUgdHR5J3MgcHJvY2VzcyBncm91cCwgb3IgaWYgdGhhdCBpcyBub3QgeWV0IHNldCwKKwkJdG8gdGhlIGN1cnJlbnQgcHJvY2VzcydzIHBpZC4KKworVGh1IE9jdCAyMCAyMzoxNzoyOCAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIG5fdHR5LmMgKG5fdHR5X3JlY2VpdmVfcm9vbSk6IElmIHdlIGFyZSBkb2luZyBpbnB1dAorCQljYW5vbmljYWxpemF0aW9uLCBsZXQgYXMgbWFueSBjaGFyYWN0ZXJzIHRocm91Z2ggYXMKKwkJcG9zc2libGUsIHNvIHRoYXQgdGhlIGV4Y2VzcyBjaGFyYWN0ZXJzIGNhbiBiZSAiYmVlcGVkIi4KKworVHVlIE9jdCAxOCAxMDowMjo0MyAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19zdGFydCk6IFJlbW92ZWQgYW4gaW5jb3JyZWN0ICchJyB0aGF0IHdhcworCQlwcmV2ZW50aW5nIHRyYW5zbWl0IGludGVycnVwdHMgZnJvbSBiZWluZyByZS1lbmFibGVkIGluCisJCXJzX3N0YXJ0KCkuICBGb3J0dW5hdGVseSBpbiBtb3N0IGNhc2VzIGl0IHdvdWxkIGJlCisJCXJlLWVuYWJsZWQgZWxzZXdoZXJlLCBidXQgdGhpcyBzdGlsbCBzaG91bGQgYmUgZml4ZWQKKwkJY29ycmVjdGx5LgorCitTdW4gT2N0ICA5IDIzOjQ2OjAzIDE5OTQgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvLmMgKGRvX3R0eV9oYW5ndXApOiBJZiB0aGUgdHR5IGRyaXZlciBmbGFncworCQlUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgaXMgc2V0LCB0aGVuIHJlc2V0IHRoZSB0ZXJtaW9zCisJCXNldHRpbmdzIGJhY2sgdG8gdGhlIGRyaXZlcidzIGluaXRpYWwgY29uZmlndXJhdGlvbi4gIFRoaXMKKwkJYWxsb3dzIHRoZSB0ZXJtaW9zIHNldHRpbmdzIHRvIGJlIHJlc2V0IGV2ZW4gaWYgYSBwcm9jZXNzCisJCWhhcyBodW5nIHVwIGZpbGUgZGVzY3JpcHRvcnMga2VlcGluZyBhIHB0eSdzIHRlcm1pb3MgZnJvbQorCQliZWluZyBmcmVlZCBhbmQgcmVzZXQuCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IEZpeCBtZW1vcnkgbGVhay4gIFRoZSBwdHkncyBvdGhlcgorCQl0ZXJtaW9zIHN0cnVjdHVyZSBzaG91bGQgYWxzbyBiZSBmcmVlZC4KKworCSogc2VyaWFsLmMgKHJzX2Nsb3NlLCBzaHV0ZG93bik6IENoYW5nZSBob3cgd2Ugd2FpdCBmb3IgdGhlCisJCXRyYW5zbWl0dGVyIHRvIGNvbXBsZXRlbHkgZHJhaW4gYmVmb3JlIHNodXR0aW5nIGRvd24gdGhlCisJCXNlcmlhbCBwb3J0LiAgV2Ugbm93IGRvIGl0IGJ5IHNjaGVkdWxpbmcgaW4gYW5vdGhlcgorCQlwcm9jZXNzIGluc3RlYWQgb2YgYnVzeSBsb29waW5nIHdpdGggdGhlIGludGVycnVwdHMgdHVybmVkCisJCW9uLiAgVGhpcyBtYXkgZWxpbWluYXRlIHNvbWUgcmFjZSBjb25kaXRpb24gcHJvYmxlbXMgdGhhdAorCQlzb21lIHBlb3BsZSBzZWVtIHRvIGJlIHJlcG9ydGluZy4KKworU3VuIFNlcCAyNSAxNDoxODoxNCAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IFdoZW4gZnJlZWluZyBhIHR0eSBtYWtlIHN1cmUgdGhhdCBib3RoCisJCXRoZSB0dHkgYW5kIHRoZSBvX3R0eSAoaWYgcHJlc2VudCkgYXJlbid0IGEgcHJvY2VzcydzCisJCWNvbnRyb2xsaW5nIHR0eS4gIChQcmV2aW91c2x5LCB3ZSBvbmx5IGNoZWNrZWQgdGhlIHR0eS4pCisKKwkqIHNlcmlhbC5jIChjaGFuZ2Vfc3BlZWQpOiBPbmx5IGVuYWJsZSB0aGUgTW9kZW0gU3RhdHVzCisJCUludGVycnVwdCBmb3IgYSBwb3J0IGlmIENMT0NBTCBpcyBub3Qgc2V0IG9yIENSVFNDVFMKKwkJaXMgc2V0LiAgSWYgd2UncmUgbm90IGNoZWNraW5nIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQKKwkJQ1RTIGxpbmUsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gZW5hYmxpbmcgdGhlIG1vZGVtCisJCXN0YXR1cyBpbnRlcnJ1cHQuICBUaGlzIHdpbGwgc2F2ZSBzcHVyaW91cyBpbnRlcnJ1cHRzCisJCWZyb20gc2xvd2luZyBkb3duIHN5c3RlbXMgd2hvIGhhdmUgdGVybWluYWxzIHRoYXQKKwkJZG9uJ3Qgc3VwcG9ydCBlaXRoZXIgbGluZS4gIChPZiBjb3Vyc2UsIGlmIHlvdSB3YW50CisJCW9ubHkgb25lIG9mIENEIGFuZCBDVFMgc3VwcG9ydCwgeW91IHdpbGwgbmVlZCBhCisJCXByb3Blcmx5IHdpcmVkIHNlcmlhbCBjYWJsZS4pCisKK1RodSBTZXAgMjIgMDg6MzI6NDggMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAoZG9fU0FLKTogUmV0dXJuIGlmIHR0eSBpcyBudWxsLgorCisJKiB0dHlfaW8uYyAoX3R0eV9uYW1lKTogUmV0dXJuICJOVUxMIHR0eSIgaWYgdGhlIHBhc3NlZCBpbiB0dHkgaXMKKwkJTlVMTC4KKworU2F0IFNlcCAxNyAxMzoxOToyNSAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHR0eV9pb2N0bC5jIChuX3R0eV9pb2N0bCk6IEZpeCBUSU9DR0xDS1RSTUlPUyBhbmQKKwkJVElPQ1NMQ0tUUk1JT1MsIHdoaWNoIHdlcmUgdG90YWxseSBicm9rZW4uICBSZW1vdmUKKwkJZXh0cmEgaW5kaXJlY3Rpb24gZnJvbSBhcmd1bWVudDsgaXQgc2hvdWxkIGJlIGEgc3RydWN0CisJCXRlcm1pb3MgKiwgbm90IGEgc3RydWN0IHRlcm1pb3MgKiouCisJCSZyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQgc2hvdWxkIGhhdmUgYmVlbgorCQlyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQuICBUaGlzIGNhdXNlZCB1cyB0byBiZQorCQlyZWFkaW5nIGFuZCB3cml0aW5nIHRoZSB0ZXJtaW9zX2xvY2tlZCBzdHJ1Y3R1cmUgdG8KKwkJcmFuZG9tIHBsYWNlcyBpbiBrZXJuZWwgbWVtb3J5LiAgCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IE9vcHMhICBGb3Jnb3QgdG8gZGVsZXRlIGEgY3JpdGljYWwga2ZyZWUKKwkJb2YgdGhlIGxvY2tlZF90ZXJtaW9zLiAgVGhpcyBsZWF2ZXMgdGhlIGxvY2tlZF90ZXJtaW9zCisJCXN0cnVjdHVyZSBwb2ludGVkIGF0IGEgZnJlZWQgb2JqZWN0LiAgCisKK0ZyaSBTZXAgMTYgMDg6MTM6MjUgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAodHR5X29wZW4pOiBEb24ndCBjaGVjayBmb3IgYW4gZXhjbHVzaXZlIG9wZW4gdW50aWwKKwkJYWZ0ZXIgdGhlIGRldmljZSBzcGVjaWZpYyBvcGVuIHJvdXRpbmUgaGFzIGJlZW4gY2FsbGVkLgorCQlPdGhlcndpc2UsIHRoZSBzZXJpYWwgZGV2aWNlIHJlZiBjb3VudGluZyB3aWxsIGJlIHNjcmV3ZWQKKwkJdXAuCisKKwkqIHNlcmlhbC5jIChyc19vcGVuLCBibG9ja190aWxfcmVhZHkpOiBEb24ndCBzZXQgdGVybWlvcyBzdHJ1Y3R1cmUKKwkJdW50aWwgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IGhhcyByZXR1cm5lZCBzdWNjZXNzZnVsbHkuCisJCU1vZGlmeSBibG9ja190aWxfcmVhZHkgdG8gY2hlY2sgdGhlIG5vcm1hbF90ZXJtaW9zCisJCXN0cnVjdHVyZSBkaXJlY3RseSwgc28gaXQgZG9lc24ndCByZWx5IG9uIHRlcm1pb3MgYmVpbmcKKwkJc2V0IGJlZm9yZSBpdCdzIGNhbGxlZC4KKworVGh1IFNlcCAxNSAyMzozNDowMSAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19jbG9zZSk6IFR1cm4gb2ZmIGludGVycnVwdHMgZHVyaW5nIHJzX2Nsb3NlKCkgdG8KKwkJcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGhhbmd1cCBjb2RlICh3aGljaAorCQlydW5zIGR1cmluZyBhIHNvZnR3YXJlIGludGVycnVwdCkuCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IERvbid0IGZyZWUgdGhlIGxvY2tlZF90ZXJtaW9zIHN0cnVjdHVyZTsKKwkJaXRzIHN0YXRlIG11c3QgYmUgcmV0YWluZWQgYWNyb3NzIGRldmljZSBvcGVucy4KKworCisJKiB0dHlfaW8uYyAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKTogQWRkZWQgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciBhCisJCXR0eSBkcml2ZXIuICAoRm9yIGxvYWRhYmxlIGRldmljZSBkcml2ZXJzLikKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmExMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtMCwwICsxLDk4OCBAQAorIworIyBDaGFyYWN0ZXIgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiQ2hhcmFjdGVyIGRldmljZXMiCisKK2NvbmZpZyBWVAorCWJvb2wgIlZpcnR1YWwgdGVybWluYWwiIGlmIEVNQkVEREVECisJc2VsZWN0IElOUFVUCisJZGVmYXVsdCB5IGlmICFWSU9DT05TCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0ZXJtaW5hbCBkZXZpY2VzIHdpdGgKKwkgIGRpc3BsYXkgYW5kIGtleWJvYXJkIGRldmljZXMuIFRoZXNlIGFyZSBjYWxsZWQgInZpcnR1YWwiIGJlY2F1c2UgeW91CisJICBjYW4gcnVuIHNldmVyYWwgdmlydHVhbCB0ZXJtaW5hbHMgKGFsc28gY2FsbGVkIHZpcnR1YWwgY29uc29sZXMpIG9uCisJICBvbmUgcGh5c2ljYWwgdGVybWluYWwuIFRoaXMgaXMgcmF0aGVyIHVzZWZ1bCwgZm9yIGV4YW1wbGUgb25lCisJICB2aXJ0dWFsIHRlcm1pbmFsIGNhbiBjb2xsZWN0IHN5c3RlbSBtZXNzYWdlcyBhbmQgd2FybmluZ3MsIGFub3RoZXIKKwkgIG9uZSBjYW4gYmUgdXNlZCBmb3IgYSB0ZXh0LW1vZGUgdXNlciBzZXNzaW9uLCBhbmQgYSB0aGlyZCBjb3VsZCBydW4KKwkgIGFuIFggc2Vzc2lvbiwgYWxsIGluIHBhcmFsbGVsLiBTd2l0Y2hpbmcgYmV0d2VlbiB2aXJ0dWFsIHRlcm1pbmFscworCSAgaXMgZG9uZSB3aXRoIGNlcnRhaW4ga2V5IGNvbWJpbmF0aW9ucywgdXN1YWxseSBBbHQtPGZ1bmN0aW9uIGtleT4uCisKKwkgIFRoZSBzZXR0ZXJtIGNvbW1hbmQgKCJtYW4gc2V0dGVybSIpIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUKKwkgIHByb3BlcnRpZXMgKHN1Y2ggYXMgY29sb3JzIG9yIGJlZXBpbmcpIG9mIGEgdmlydHVhbCB0ZXJtaW5hbC4gVGhlCisJICBtYW4gcGFnZSBjb25zb2xlX2NvZGVzKDQpICgibWFuIGNvbnNvbGVfY29kZXMiKSBjb250YWlucyB0aGUgc3BlY2lhbAorCSAgY2hhcmFjdGVyIHNlcXVlbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aG9zZSBwcm9wZXJ0aWVzCisJICBkaXJlY3RseS4gVGhlIGZvbnRzIHVzZWQgb24gdmlydHVhbCB0ZXJtaW5hbHMgY2FuIGJlIGNoYW5nZWQgd2l0aAorCSAgdGhlIHNldGZvbnQgKCJtYW4gc2V0Zm9udCIpIGNvbW1hbmQgYW5kIHRoZSBrZXkgYmluZGluZ3MgYXJlIGRlZmluZWQKKwkgIHdpdGggdGhlIGxvYWRrZXlzICgibWFuIGxvYWRrZXlzIikgY29tbWFuZC4KKworCSAgWW91IG5lZWQgYXQgbGVhc3Qgb25lIHZpcnR1YWwgdGVybWluYWwgZGV2aWNlIGluIG9yZGVyIHRvIG1ha2UgdXNlCisJICBvZiB5b3VyIGtleWJvYXJkIGFuZCBtb25pdG9yLiBUaGVyZWZvcmUsIG9ubHkgcGVvcGxlIGNvbmZpZ3VyaW5nIGFuCisJICBlbWJlZGRlZCBzeXN0ZW0gd291bGQgd2FudCB0byBzYXkgTiBoZXJlIGluIG9yZGVyIHRvIHNhdmUgc29tZQorCSAgbWVtb3J5OyB0aGUgb25seSB3YXkgdG8gbG9nIGludG8gc3VjaCBhIHN5c3RlbSBpcyB0aGVuIHZpYSBhIHNlcmlhbAorCSAgb3IgbmV0d29yayBjb25uZWN0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBZLCBvciBlbHNlIHlvdSB3b24ndCBiZSBhYmxlIHRvIGRvIG11Y2ggd2l0aCB5b3VyIG5ldworCSAgc2hpbnkgTGludXggc3lzdGVtIDotKQorCitjb25maWcgVlRfQ09OU09MRQorCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gdmlydHVhbCB0ZXJtaW5hbCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFZUCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhlIHN5c3RlbSBjb25zb2xlIGlzIHRoZSBkZXZpY2Ugd2hpY2ggcmVjZWl2ZXMgYWxsIGtlcm5lbCBtZXNzYWdlcworCSAgYW5kIHdhcm5pbmdzIGFuZCB3aGljaCBhbGxvd3MgbG9naW5zIGluIHNpbmdsZSB1c2VyIG1vZGUuIElmIHlvdQorCSAgYW5zd2VyIFkgaGVyZSwgYSB2aXJ0dWFsIHRlcm1pbmFsICh0aGUgZGV2aWNlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aAorCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbCkgY2FuIGJlIHVzZWQgYXMgc3lzdGVtIGNvbnNvbGUuIFRoaXMgaXMgdGhlIG1vc3QKKwkgIGNvbW1vbiBtb2RlIG9mIG9wZXJhdGlvbnMsIHNvIHlvdSBzaG91bGQgc2F5IFkgaGVyZSB1bmxlc3MgeW91IHdhbnQKKwkgIHRoZSBrZXJuZWwgbWVzc2FnZXMgYmUgb3V0cHV0IG9ubHkgdG8gYSBzZXJpYWwgcG9ydCAoaW4gd2hpY2ggY2FzZQorCSAgeW91IHNob3VsZCBzYXkgWSB0byAiQ29uc29sZSBvbiBzZXJpYWwgcG9ydCIsIGJlbG93KS4KKworCSAgSWYgeW91IGRvIHNheSBZIGhlcmUsIGJ5IGRlZmF1bHQgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHZpcnR1YWwKKwkgIHRlcm1pbmFsICgvZGV2L3R0eTApIHdpbGwgYmUgdXNlZCBhcyBzeXN0ZW0gY29uc29sZS4gWW91IGNhbiBjaGFuZ2UKKwkgIHRoYXQgd2l0aCBhIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uIHN1Y2ggYXMgImNvbnNvbGU9dHR5MyIgd2hpY2gKKwkgIHdvdWxkIHVzZSB0aGUgdGhpcmQgdmlydHVhbCB0ZXJtaW5hbCBhcyBzeXN0ZW0gY29uc29sZS4gKFRyeSAibWFuCisJICBib290cGFyYW0iIG9yIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIGJvb3QgbG9hZGVyIChsaWxvIG9yCisJICBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLikKKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEhXX0NPTlNPTEUKKwlib29sCisJZGVwZW5kcyBvbiBWVCAmJiAhUzM5MCAmJiAhVU1MCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTRVJJQUxfTk9OU1RBTkRBUkQKKwlib29sICJOb24tc3RhbmRhcmQgc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFueSBub24tc3RhbmRhcmQgc2VyaWFsIGJvYXJkcyAtLSBib2FyZHMKKwkgIHdoaWNoIGFyZW4ndCBzdXBwb3J0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkICJkdW1iIiBzZXJpYWwgZHJpdmVyLgorCSAgVGhpcyBpbmNsdWRlcyBpbnRlbGxpZ2VudCBzZXJpYWwgYm9hcmRzIHN1Y2ggYXMgQ3ljbGFkZXMsCisJICBEaWdpYm9hcmRzLCBldGMuIFRoZXNlIGFyZSB1c3VhbGx5IHVzZWQgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIG1hbnkKKwkgIHNlcmlhbCBwb3J0cyBiZWNhdXNlIHRoZXkgc2VydmUgbWFueSB0ZXJtaW5hbHMgb3IgZGlhbC1pbgorCSAgY29ubmVjdGlvbnMuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBub24tc3RhbmRhcmQgc2VyaWFsIGJvYXJkcy4KKworCSAgTW9zdCBwZW9wbGUgY2FuIHNheSBOIGhlcmUuCisKK2NvbmZpZyBDT01QVVRPTkUKKwl0cmlzdGF0ZSAiQ29tcHV0b25lIEludGVsbGlQb3J0IFBsdXMgc2VyaWFsIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBlbnRpcmUgZmFtaWx5IG9mIEludGVsbGlwb3J0IElJL1BsdXMKKwkgIGNvbnRyb2xsZXJzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgTWljcm9DaGFubmVsIGNvbnRyb2xsZXJzIGFuZAorCSAgcHJvZHVjdHMgcHJldmlvdXMgdG8gdGhlIEludGVsbGlwb3J0IElJLiBUaGVzZSBhcmUgbXVsdGlwb3J0IGNhcmRzLAorCSAgd2hpY2ggZ2l2ZSB5b3UgbWFueSBzZXJpYWwgcG9ydHMuIFlvdSB3b3VsZCBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMKKwkgIHRvIGNvbm5lY3QgbW9yZSB0aGFuIHR3byBtb2RlbXMgdG8geW91ciBMaW51eCBib3gsIGZvciBpbnN0YW5jZSBpbgorCSAgb3JkZXIgdG8gYmVjb21lIGEgZGlhbC1pbiBzZXJ2ZXIuIElmIHlvdSBoYXZlIGEgY2FyZCBsaWtlIHRoYXQsIHNheQorCSAgWSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vY29tcHV0b25lLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlcywgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGVzIHdpbGwgYmUgY2FsbGVkIGlwMiBhbmQgaXAybWFpbi4KKworY29uZmlnIFJPQ0tFVFBPUlQKKwl0cmlzdGF0ZSAiQ29tdHJvbCBSb2NrZXRQb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBDb210cm9sIFJvY2tldFBvcnQgYW5kIFJvY2tldE1vZGVtIFBDSSBib2FyZHMuICAgCisgICAgICAgICAgVGhlc2UgYm9hcmRzIHByb3ZpZGUgMiwgNCwgOCwgMTYsIG9yIDMyIGhpZ2gtc3BlZWQgc2VyaWFsIHBvcnRzIG9yCisgICAgICAgICAgbW9kZW1zLiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBSb2NrZXRQb3J0L1JvY2tldE1vZGVtICBib2FyZHMKKyAgICAgICAgICBhbmQgdGhpcyBkcml2ZXIgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3JvY2tldC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByb2NrZXQuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUga2VybmVsLCBzYXkgWSBoZXJlLiAgSWYKKyAgICAgICAgICB5b3UgZG9uJ3QgaGF2ZSBhIENvbXRyb2wgUm9ja2V0UG9ydC9Sb2NrZXRNb2RlbSBjYXJkIGluc3RhbGxlZCwgc2F5IE4uCisKK2NvbmZpZyBDWUNMQURFUworCXRyaXN0YXRlICJDeWNsYWRlcyBhc3luYyBtdXggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEN5Y2xhZGVzIFogYW5kIFkgbXVsdGlzZXJpYWwgYm9hcmRzLgorCSAgWW91IHdvdWxkIG5lZWQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byBjb25uZWN0IG1vcmUgdGhhbiB0d28gbW9kZW1zIHRvCisJICB5b3VyIExpbnV4IGJveCwgZm9yIGluc3RhbmNlIGluIG9yZGVyIHRvIGJlY29tZSBhIGRpYWwtaW4gc2VydmVyLgorCisJICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEN5Y2xhZGVzLVogY2FyZCwgcmVhZAorCSAgPGZpbGU6ZHJpdmVycy9jaGFyL1JFQURNRS5jeWNsYWRlc1o+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeWNsYWRlcy4KKworCSAgSWYgeW91IGhhdmVuJ3QgaGVhcmQgYWJvdXQgaXQsIGl0J3Mgc2FmZSB0byBzYXkgTi4KKworY29uZmlnIENZWl9JTlRSCisJYm9vbCAiQ3ljbGFkZXMtWiBpbnRlcnJ1cHQgbW9kZSBvcGVyYXRpb24gKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQ1lDTEFERVMKKwloZWxwCisJICBUaGUgQ3ljbGFkZXMtWiBmYW1pbHkgb2YgbXVsdGlwb3J0IGNhcmRzIGFsbG93cyAyICh0d28pIGRyaXZlciBvcAorCSAgbW9kZXM6IHBvbGxpbmcgYW5kIGludGVycnVwdC4gSW4gcG9sbGluZyBtb2RlLCB0aGUgZHJpdmVyIHdpbGwgY2hlY2sKKwkgIHRoZSBzdGF0dXMgb2YgdGhlIEN5Y2xhZGVzLVogcG9ydHMgZXZlcnkgY2VydGFpbiBhbW91bnQgb2YgdGltZQorCSAgKHdoaWNoIGlzIGNhbGxlZCBwb2xsaW5nIGN5Y2xlIGFuZCBpcyBjb25maWd1cmFibGUpLiBJbiBpbnRlcnJ1cHQKKwkgIG1vZGUsIGl0IHdpbGwgdXNlIGFuIGludGVycnVwdCBsaW5lIChJUlEpIGluIG9yZGVyIHRvIGNoZWNrIHRoZQorCSAgc3RhdHVzIG9mIHRoZSBDeWNsYWRlcy1aIHBvcnRzLiBUaGUgZGVmYXVsdCBvcCBtb2RlIGlzIHBvbGxpbmcuIElmCisJICB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRElHSUVQQ0EKKwl0cmlzdGF0ZSAiRGlnaWJvYXJkIEludGVsbGlnZW50IEFzeW5jIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIERpZ2kgSW50ZXJuYXRpb25hbCdzIFh4LCBYZXZlLCBhbmQgWGVtIHNlcmllcworCSAgb2YgY2FyZHMgd2hpY2ggcHJvdmlkZSBtdWx0aXBsZSBzZXJpYWwgcG9ydHMuIFlvdSB3b3VsZCBuZWVkCisJICBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIGNvbm5lY3QgbW9yZSB0aGFuIHR3byBtb2RlbXMgdG8geW91ciBMaW51eAorCSAgYm94LCBmb3IgaW5zdGFuY2UgaW4gb3JkZXIgdG8gYmVjb21lIGEgZGlhbC1pbiBzZXJ2ZXIuIFRoaXMgZHJpdmVyCisJICBzdXBwb3J0cyB0aGUgb3JpZ2luYWwgUEMgKElTQSkgYm9hcmRzIGFzIHdlbGwgYXMgUENJLCBhbmQgRUlTQS4gSWYKKwkgIHlvdSBoYXZlIGEgY2FyZCBsaWtlIHRoaXMsIHNheSBZIGhlcmUgYW5kIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZGlnaWVwY2EudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXBjYS4KKworY29uZmlnIEVTUFNFUklBTAorCXRyaXN0YXRlICJIYXllcyBFU1Agc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBJU0EgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgSGF5ZXMgRVNQIHNlcmlhbCBwb3J0cy4gIEJvdGggc2luZ2xlCisJICBwb3J0IGNhcmRzIGFuZCBtdWx0aXBvcnQgY2FyZHMgYXJlIHN1cHBvcnRlZC4gIE1ha2Ugc3VyZSB0byByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2hheWVzLWVzcC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlc3AuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBNT1hBX0lOVEVMTElPCisJdHJpc3RhdGUgIk1veGEgSW50ZWxsaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE1veGEgSW50ZWxsaW8gbXVsdGlwb3J0IHNlcmlhbCBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtb3hhLgorCitjb25maWcgTU9YQV9TTUFSVElPCisJdHJpc3RhdGUgIk1veGEgU21hcnRJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE1veGEgU21hcnRJTyBtdWx0aXBvcnQgc2VyaWFsIGNhcmQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBteHNlci4gSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0KKwkgIGhlcmUuCisKK2NvbmZpZyBJU0kKKwl0cmlzdGF0ZSAiTXVsdGktVGVjaCBtdWx0aXBvcnQgY2FyZCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE11bHRpLVRlY2ggY2FyZHMgd2hpY2ggcHJvdmlkZSBzZXZlcmFsCisJICBzZXJpYWwgcG9ydHMuICBUaGUgZHJpdmVyIGlzIGV4cGVyaW1lbnRhbCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlCisJICBidWlsdCBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc2ljb20uCisJICBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBjaG9vc2UgTSBoZXJlLgorCitjb25maWcgU1lOQ0xJTksKKwl0cmlzdGF0ZSAiTWljcm9nYXRlIFN5bmNMaW5rIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBQQ0kKKwloZWxwCisJICBQcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgSVNBIGFuZCBQQ0kgbXVsdGlwcm90b2NvbCBzZXJpYWwKKwkgIGFkYXB0ZXJzLiBUaGVzZSBhZGFwdGVycyBzdXBwb3J0IGFzeW5jaHJvbm91cyBhbmQgSERMQyBiaXQKKwkgIHN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gdXAgdG8gMTBNYnBzIChQQ0kgYWRhcHRlcikuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBvbmx5IGJlIGJ1aWx0IGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW5jbGluay4gIElmIHlvdSB3YW50IHRvIGRvIHRoYXQsIHNheSBNCisJICBoZXJlLgorCitjb25maWcgU1lOQ0xJTktNUAorCXRyaXN0YXRlICJTeW5jTGluayBNdWx0aXBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgTXVsdGlwb3J0ICgyIG9yIDQgcG9ydHMpCisJICBzZXJpYWwgYWRhcHRlciwgcnVubmluZyBhc3luY2hyb25vdXMgYW5kIEhETEMgY29tbXVuaWNhdGlvbnMgdXAKKwkgIHRvIDIuMDQ4TWJwcy4gRWFjaCBwb3J0cyBpcyBpbmRlcGVuZGVudGx5IHNlbGVjdGFibGUgZm9yCisJICBSUy0yMzIsIFYuMzUsIFJTLTQ0OSwgUlMtNTMwLCBhbmQgWC4yMQorCisJICBUaGlzIGRyaXZlciBtYXkgYmUgYnVpbHQgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN5bmNsaW5rbXAuICBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQorCSAgaGVyZS4KKworY29uZmlnIE5fSERMQworCXRyaXN0YXRlICJIRExDIGxpbmUgZGlzY2lwbGluZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgQWxsb3dzIHN5bmNocm9ub3VzIEhETEMgY29tbXVuaWNhdGlvbnMgd2l0aCB0dHkgZGV2aWNlIGRyaXZlcnMgdGhhdAorCSAgc3VwcG9ydCBzeW5jaHJvbm91cyBIRExDIHN1Y2ggYXMgdGhlIE1pY3JvZ2F0ZSBTeW5jTGluayBhZGFwdGVyLgorCisJICBUaGlzIGRyaXZlciBjYW4gb25seSBiZSBidWlsdCBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbl9oZGxjLiBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQorCSAgaGVyZS4KKworY29uZmlnIFJJU0NPTTgKKwl0cmlzdGF0ZSAiU0RMIFJJU0NvbS84IGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNETCBDb21tdW5pY2F0aW9ucyBSSVNDb20vOCBtdWx0aXBvcnQgY2FyZCwKKwkgIHdoaWNoIGdpdmVzIHlvdSBtYW55IHNlcmlhbCBwb3J0cy4gWW91IHdvdWxkIG5lZWQgc29tZXRoaW5nIGxpa2UKKwkgIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0byB5b3VyIExpbnV4IGJveCwgZm9yIGluc3RhbmNlCisJICBpbiBvcmRlciB0byBiZWNvbWUgYSBkaWFsLWluIHNlcnZlci4gSWYgeW91IGhhdmUgYSBjYXJkIGxpa2UgdGhhdCwKKwkgIHNheSBZIGhlcmUgYW5kIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9yaXNjb204LnR4dD4uCisKKwkgIEFsc28gaXQncyBwb3NzaWJsZSB0byBzYXkgTSBoZXJlIGFuZCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGtlcm5lbAorCSAgbG9hZGFibGUgbW9kdWxlOyB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJpc2NvbTguCisKK2NvbmZpZyBTUEVDSUFMSVgKKwl0cmlzdGF0ZSAiU3BlY2lhbGl4IElPOCsgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBjYXJkIChib3RoIHRoZQorCSAgSVNBIGFuZCB0aGUgUENJIHZlcnNpb24pIHdoaWNoIGdpdmVzIHlvdSBtYW55IHNlcmlhbCBwb3J0cy4gWW91CisJICB3b3VsZCBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0bworCSAgeW91ciBMaW51eCBib3gsIGZvciBpbnN0YW5jZSBpbiBvcmRlciB0byBiZWNvbWUgYSBkaWFsLWluIHNlcnZlci4KKworCSAgSWYgeW91IGhhdmUgYSBjYXJkIGxpa2UgdGhhdCwgc2F5IFkgaGVyZSBhbmQgcmVhZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zcGVjaWFsaXgudHh0Pi4gQWxzbyBpdCdzIHBvc3NpYmxlIHRvIHNheSBNIGhlcmUKKwkgIGFuZCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGtlcm5lbCBsb2FkYWJsZSBtb2R1bGUgd2hpY2ggd2lsbCBiZQorCSAgY2FsbGVkIHNwZWNpYWxpeC4KKworY29uZmlnIFNQRUNJQUxJWF9SVFNDVFMKKwlib29sICJTcGVjaWFsaXggRFRSL1JUUyBwaW4gaXMgUlRTIgorCWRlcGVuZHMgb24gU1BFQ0lBTElYCisJaGVscAorCSAgVGhlIFNwZWNpYWxpeCBJTzgrIGNhcmQgY2FuIG9ubHkgc3VwcG9ydCBlaXRoZXIgUlRTIG9yIERUUi4gSWYgeW91CisJICBzYXkgTiBoZXJlLCB0aGUgZHJpdmVyIHdpbGwgdXNlIHRoZSBwaW4gYXMgIkRUUiIgd2hlbiB0aGUgdHR5IGlzIGluCisJICBzb2Z0d2FyZSBoYW5kc2hha2UgbW9kZS4gIElmIHlvdSBzYXkgWSBoZXJlIG9yIGhhcmR3YXJlIGhhbmRzaGFrZSBpcworCSAgb24sIGl0IHdpbGwgYWx3YXlzIGJlIFJUUy4gIFJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc3BlY2lhbGl4LnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBTWAorCXRyaXN0YXRlICJTcGVjaWFsaXggU1ggKGFuZCBTSSkgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNYIGFuZCBTSSBtdWx0aXBvcnQgc2VyaWFsIGNhcmRzLgorCSAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zeC50eHQ+IGZvciBkZXRhaWxzLgorCisJICBUaGlzIGRyaXZlciBjYW4gb25seSBiZSBidWlsdCBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3guIElmIHlvdSB3YW50IHRvIGRvIHRoYXQsIHNheSBNIGhlcmUuCisKK2NvbmZpZyBSSU8KKwl0cmlzdGF0ZSAiU3BlY2lhbGl4IFJJTyBzeXN0ZW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNwZWNpYWxpeCBSSU8sIGEgc21hcnQgc2VyaWFsIGNhcmQgd2hpY2gKKwkgIGRyaXZlcyBhbiBvdXRib2FyZCBib3ggdGhhdCBjYW4gc3VwcG9ydCB1cCB0byAxMjggcG9ydHMuICBQcm9kdWN0CisJICBpbmZvcm1hdGlvbiBpcyBhdCA8aHR0cDovL3d3dy5wZXJsZS5jb20vc3VwcG9ydC9kb2N1bWVudGF0aW9uLmh0bWwjbXVsdGlwb3J0Pi4KKwkgIFRoZXJlIGFyZSBib3RoIElTQSBhbmQgUENJIHZlcnNpb25zLgorCitjb25maWcgUklPX09MRFBDSQorCWJvb2wgIlN1cHBvcnQgcmVhbGx5IG9sZCBSSU8vUENJIGNhcmRzIgorCWRlcGVuZHMgb24gUklPCisJaGVscAorCSAgT2xkZXIgUklPIFBDSSBjYXJkcyBuZWVkIHNvbWUgaW5pdGlhbGl6YXRpb24tdGltZSBjb25maWd1cmF0aW9uIHRvCisJICBkZXRlcm1pbmUgdGhlIElSUSBhbmQgc29tZSBjb250cm9sIGFkZHJlc3Nlcy4gIElmIHlvdSBoYXZlIGEgUklPIGFuZAorCSAgdGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yaywgdHJ5IHNldHRpbmcgdGhpcyB0byBZLgorCitjb25maWcgU1RBTERSVgorCWJvb2wgIlN0YWxsaW9uIG11bHRpcG9ydCBzZXJpYWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWhlbHAKKwkgIFN0YWxsaW9uIGNhcmRzIGdpdmUgeW91IG1hbnkgc2VyaWFsIHBvcnRzLiAgWW91IHdvdWxkIG5lZWQgc29tZXRoaW5nCisJICBsaWtlIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0byB5b3VyIExpbnV4IGJveCwgZm9yCisJICBpbnN0YW5jZSBpbiBvcmRlciB0byBiZWNvbWUgYSBkaWFsLWluIHNlcnZlci4gIElmIHlvdSBzYXkgWSBoZXJlLAorCSAgeW91IHdpbGwgYmUgYXNrZWQgZm9yIHlvdXIgc3BlY2lmaWMgY2FyZCBtb2RlbCBpbiB0aGUgbmV4dAorCSAgcXVlc3Rpb25zLiAgTWFrZSBzdXJlIHRvIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9zdGFsbGlvbi50eHQ+IGluCisJICB0aGlzIGNhc2UuICBJZiB5b3UgaGF2ZSBuZXZlciBoZWFyZCBhYm91dCBhbGwgdGhpcywgaXQncyBzYWZlIHRvCisJICBzYXkgTi4KKworY29uZmlnIFNUQUxMSU9OCisJdHJpc3RhdGUgIlN0YWxsaW9uIEVhc3lJTyBvciBFQzgvMzIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEVhc3lJTyBvciBFYXN5Q29ubmVjdGlvbiA4LzMyIG11bHRpcG9ydCBTdGFsbGlvbgorCSAgY2FyZCwgdGhlbiB0aGlzIGlzIGZvciB5b3U7IHNheSBZLiAgTWFrZSBzdXJlIHRvIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc3RhbGxpb24udHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3RhbGxpb24uCisKK2NvbmZpZyBJU1RBTExJT04KKwl0cmlzdGF0ZSAiU3RhbGxpb24gRUM4LzY0LCBPTmJvYXJkLCBCcnVtYnkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEVhc3lDb25uZWN0aW9uIDgvNjQsIE9OYm9hcmQsIEJydW1ieSBvciBTdGFsbGlvbgorCSAgc2VyaWFsIG11bHRpcG9ydCBjYXJkLCBzYXkgWSBoZXJlLiBNYWtlIHN1cmUgdG8gcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zdGFsbGlvbi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc3RhbGxpb24uCisKK2NvbmZpZyBBVTEwMDBfVUFSVAorCWJvb2wgIkVuYWJsZSBBdTEwMDAgVUFSVCBTdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIE1JUFMKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBBbGNoZW15IEFVMTAwMCBwcm9jZXNzb3IgKE1JUFMgYmFzZWQpIGFuZCB5b3Ugd2FudAorCSAgdG8gdXNlIHNlcmlhbCBwb3J0cywgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgQVUxMDAwX1NFUklBTF9DT05TT0xFCisJYm9vbCAiRW5hYmxlIEF1MTAwMCBzZXJpYWwgY29uc29sZSIKKwlkZXBlbmRzIG9uIEFVMTAwMF9VQVJUCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWxjaGVteSBBVTEwMDAgcHJvY2Vzc29yIChNSVBTIGJhc2VkKSBhbmQgeW91IHdhbnQKKwkgIHRvIHVzZSBhIGNvbnNvbGUgb24gYSBzZXJpYWwgcG9ydCwgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgUVRST05JWF9LRVlCT0FSRAorCWJvb2wgIkVuYWJsZSBRdHJvbml4IDk5MFAgS2V5Ym9hcmQgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIElUODcxMgorCWhlbHAKKwkgIEltYWdlcyBvZiBRdHJvbml4IGtleWJvYXJkcyBhcmUgYXQKKwkgIDxodHRwOi8vd3d3LnF0cm9uaXguY29tL2tleWJvYXJkLmh0bWw+LgorCitjb25maWcgSVQ4MTcyX0NJUgorCWJvb2wKKwlkZXBlbmRzIG9uIFFUUk9OSVhfS0VZQk9BUkQKKwlkZWZhdWx0IHkKKworY29uZmlnIElUODE3Ml9TQ1IwCisJYm9vbCAiRW5hYmxlIFNtYXJ0IENhcmQgUmVhZGVyIDAgU3VwcG9ydCAiCisJZGVwZW5kcyBvbiBJVDg3MTIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgc21hcnQtY2FyZCByZWFkZXIgMCAoU0NSMCkgb24gdGhlIEludGVncmF0ZWQKKwkgIFRlY2hub2xvZ3kgRXhwcmVzcywgSW5jLiBJVEU4MTcyIFNCQy4gIFZlbmRvciBwYWdlIGF0CisJICA8aHR0cDovL3d3dy5pdGUuY29tLnR3L2lhL2JyaWVmX2l0ODE3MmJzcC5odG0+OyBwaWN0dXJlIG9mIHRoZQorCSAgYm9hcmQgYXQgPGh0dHA6Ly93d3cubXZpc3RhLmNvbS9wYXJ0bmVycy9zZW1pY29uZHVjdG9yL2l0ZS5odG1sPi4KKworY29uZmlnIElUODE3Ml9TQ1IxCisJYm9vbCAiRW5hYmxlIFNtYXJ0IENhcmQgUmVhZGVyIDEgU3VwcG9ydCAiCisJZGVwZW5kcyBvbiBJVDg3MTIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgc21hcnQtY2FyZCByZWFkZXIgMSAoU0NSMSkgb24gdGhlIEludGVncmF0ZWQKKwkgIFRlY2hub2xvZ3kgRXhwcmVzcywgSW5jLiBJVEU4MTcyIFNCQy4gIFZlbmRvciBwYWdlIGF0CisJICA8aHR0cDovL3d3dy5pdGUuY29tLnR3L2lhL2JyaWVmX2l0ODE3MmJzcC5odG0+OyBwaWN0dXJlIG9mIHRoZQorCSAgYm9hcmQgYXQgPGh0dHA6Ly93d3cubXZpc3RhLmNvbS9wYXJ0bmVycy9zZW1pY29uZHVjdG9yL2l0ZS5odG1sPi4KKworY29uZmlnIEEyMjMyCisJdHJpc3RhdGUgIkNvbW1vZG9yZSBBMjIzMiBzZXJpYWwgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBaT1JSTyAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgdGhlIDIyMzIgNy1wb3J0IHNlcmlhbCBjYXJkIHNoaXBwZWQgd2l0aCB0aGUKKwkgIEFtaWdhIDIwMDAgYW5kIG90aGVyIFpvcnJvLWJ1cyBtYWNoaW5lcywgZGF0aW5nIGZyb20gMTk4OS4gIEF0CisJICBhIG1heCBvZiAxOSwyMDAgYnBzLCB0aGUgcG9ydHMgYXJlIHNlcnZlZCBieSBhIDY1NTEgQUNJQSBVQVJUIGNoaXAKKwkgIGVhY2gsIHBsdXMgYSA4NTIwIENJQSwgYW5kIGEgbWFzdGVyIDY1MDIgQ1BVIGFuZCBidWZmZXIgYXMgd2VsbC4gVGhlCisJICBwb3J0cyB3ZXJlIGNvbm5lY3RlZCB3aXRoIDggcGluIERJTiBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIGJyYWNrZXQsCisJICBmb3Igd2hpY2ggOCBwaW4gdG8gREIyNSBhZGFwdGVycyB3ZXJlIHN1cHBsaWVkLiBUaGUgY2FyZCBhbHNvIGhhZAorCSAganVtcGVycyBpbnRlcm5hbGx5IHRvIHRvZ2dsZSB2YXJpb3VzIHBpbm5pbmcgY29uZmlndXJhdGlvbnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZTsgYnV0IHRoZW4gImdlbmVyaWNfc2VyaWFsIgorCSAgd2lsbCBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGlzIGhhcyB0byBiZSBsb2FkZWQgYmVmb3JlCisJICAic2VyX2EyMjMyIi4gSWYgeW91IHdhbnQgdG8gZG8gdGhpcywgYW5zd2VyIE0gaGVyZS4KKworY29uZmlnIFNHSV9TTlNDCisJYm9vbCAiU0dJIEFsdGl4IHN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChJQTY0X1NHSV9TTjIgfHwgSUE2NF9HRU5FUklDKQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIFNHSSBBbHRpeCBhbmQgeW91IHdhbnQgdG8gZW5hYmxlIHN5c3RlbQorCSAgY29udHJvbGxlciBjb21tdW5pY2F0aW9uIGZyb20gdXNlciBzcGFjZSAoeW91IHdhbnQgdGhpcyEpLAorCSAgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgorCitzb3VyY2UgImRyaXZlcnMvc2VyaWFsL0tjb25maWciCisKK2NvbmZpZyBVTklYOThfUFRZUworCWJvb2wgIlVuaXg5OCBQVFkgc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBIHBzZXVkbyB0ZXJtaW5hbCAoUFRZKSBpcyBhIHNvZnR3YXJlIGRldmljZSBjb25zaXN0aW5nIG9mIHR3bworCSAgaGFsdmVzOiBhIG1hc3RlciBhbmQgYSBzbGF2ZS4gVGhlIHNsYXZlIGRldmljZSBiZWhhdmVzIGlkZW50aWNhbCB0bworCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbDsgdGhlIG1hc3RlciBkZXZpY2UgaXMgdXNlZCBieSBhIHByb2Nlc3MgdG8KKwkgIHJlYWQgZGF0YSBmcm9tIGFuZCB3cml0ZSBkYXRhIHRvIHRoZSBzbGF2ZSwgdGhlcmVieSBlbXVsYXRpbmcgYQorCSAgdGVybWluYWwuIFR5cGljYWwgcHJvZ3JhbXMgZm9yIHRoZSBtYXN0ZXIgc2lkZSBhcmUgdGVsbmV0IHNlcnZlcnMKKwkgIGFuZCB4dGVybXMuCisKKwkgIExpbnV4IGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgdGhlIEJTRC1saWtlIG5hbWVzIC9kZXYvcHR5eHggZm9yCisJICBtYXN0ZXJzIGFuZCAvZGV2L3R0eXh4IGZvciBzbGF2ZXMgb2YgcHNldWRvIHRlcm1pbmFscy4gVGhpcyBzY2hlbWUKKwkgIGhhcyBhIG51bWJlciBvZiBwcm9ibGVtcy4gVGhlIEdOVSBDIGxpYnJhcnkgZ2xpYmMgMi4xIGFuZCBsYXRlciwKKwkgIGhvd2V2ZXIsIHN1cHBvcnRzIHRoZSBVbml4OTggbmFtaW5nIHN0YW5kYXJkOiBpbiBvcmRlciB0byBhY3F1aXJlIGEKKwkgIHBzZXVkbyB0ZXJtaW5hbCwgYSBwcm9jZXNzIG9wZW5zIC9kZXYvcHRteDsgdGhlIG51bWJlciBvZiB0aGUgcHNldWRvCisJICB0ZXJtaW5hbCBpcyB0aGVuIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9jZXNzIGFuZCB0aGUgcHNldWRvCisJICB0ZXJtaW5hbCBzbGF2ZSBjYW4gYmUgYWNjZXNzZWQgYXMgL2Rldi9wdHMvPG51bWJlcj4uIFdoYXQgd2FzCisJICB0cmFkaXRpb25hbGx5IC9kZXYvdHR5cDIgd2lsbCB0aGVuIGJlIC9kZXYvcHRzLzIsIGZvciBleGFtcGxlLgorCisJICBBbGwgbW9kZXJuIExpbnV4IHN5c3RlbXMgdXNlIHRoZSBVbml4OTggcHR5cy4gIFNheSBZIHVubGVzcworCSAgeW91J3JlIG9uIGFuIGVtYmVkZGVkIHN5c3RlbSBhbmQgd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkuCisKK2NvbmZpZyBMRUdBQ1lfUFRZUworCWJvb2wgIkxlZ2FjeSAoQlNEKSBQVFkgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBIHBzZXVkbyB0ZXJtaW5hbCAoUFRZKSBpcyBhIHNvZnR3YXJlIGRldmljZSBjb25zaXN0aW5nIG9mIHR3bworCSAgaGFsdmVzOiBhIG1hc3RlciBhbmQgYSBzbGF2ZS4gVGhlIHNsYXZlIGRldmljZSBiZWhhdmVzIGlkZW50aWNhbCB0bworCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbDsgdGhlIG1hc3RlciBkZXZpY2UgaXMgdXNlZCBieSBhIHByb2Nlc3MgdG8KKwkgIHJlYWQgZGF0YSBmcm9tIGFuZCB3cml0ZSBkYXRhIHRvIHRoZSBzbGF2ZSwgdGhlcmVieSBlbXVsYXRpbmcgYQorCSAgdGVybWluYWwuIFR5cGljYWwgcHJvZ3JhbXMgZm9yIHRoZSBtYXN0ZXIgc2lkZSBhcmUgdGVsbmV0IHNlcnZlcnMKKwkgIGFuZCB4dGVybXMuCisKKwkgIExpbnV4IGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgdGhlIEJTRC1saWtlIG5hbWVzIC9kZXYvcHR5eHgKKwkgIGZvciBtYXN0ZXJzIGFuZCAvZGV2L3R0eXh4IGZvciBzbGF2ZXMgb2YgcHNldWRvCisJICB0ZXJtaW5hbHMuIFRoaXMgc2NoZW1lIGhhcyBhIG51bWJlciBvZiBwcm9ibGVtcywgaW5jbHVkaW5nCisJICBzZWN1cml0eS4gIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlc2UgbGVnYWN5IGRldmljZXM7IG9uIG1vc3QKKwkgIHN5c3RlbXMsIGl0IGlzIHNhZmUgdG8gc2F5IE4uCisKKworY29uZmlnIExFR0FDWV9QVFlfQ09VTlQKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIGxlZ2FjeSBQVFkgaW4gdXNlIgorCWRlcGVuZHMgb24gTEVHQUNZX1BUWVMKKwlyYW5nZSAxIDI1NgorCWRlZmF1bHQgIjI1NiIKKwktLS1oZWxwLS0tCisJICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGVnYWN5IFBUWXMgdGhhdCBjYW4gYmUgdXNlZCBhdCBhbnkgb25lIHRpbWUuCisJICBUaGUgZGVmYXVsdCBpcyAyNTYsIGFuZCBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaC4gIEVtYmVkZGVkCisJICBzeXN0ZW1zIG1heSB3YW50IHRvIHJlZHVjZSB0aGlzIHRvIHNhdmUgbWVtb3J5LgorCisJICBXaGVuIG5vdCBpbiB1c2UsIGVhY2ggbGVnYWN5IFBUWSBvY2N1cGllcyAxMiBieXRlcyBvbiAzMi1iaXQKKwkgIGFyY2hpdGVjdHVyZXMgYW5kIDI0IGJ5dGVzIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLgorCitjb25maWcgUFJJTlRFUgorCXRyaXN0YXRlICJQYXJhbGxlbCBwcmludGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJQT1JUCisJLS0taGVscC0tLQorCSAgSWYgeW91IGludGVuZCB0byBhdHRhY2ggYSBwcmludGVyIHRvIHRoZSBwYXJhbGxlbCBwb3J0IG9mIHlvdXIgTGludXgKKwkgIGJveCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIHNlcmlhbCBwcmludGVyOyBpZiB0aGUgY29ubmVjdG9yIGF0IHRoZQorCSAgcHJpbnRlciBoYXMgOSBvciAyNSBob2xlcyBbImZlbWFsZSJdLCB0aGVuIGl0J3Mgc2VyaWFsKSwgc2F5IFkuCisJICBBbHNvIHJlYWQgdGhlIFByaW50aW5nLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgSXQgaXMgcG9zc2libGUgdG8gc2hhcmUgb25lIHBhcmFsbGVsIHBvcnQgYW1vbmcgc2V2ZXJhbCBkZXZpY2VzCisJICAoZS5nLiBwcmludGVyIGFuZCBaSVAgZHJpdmUpIGFuZCBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgdGhlCisJICBjb3JyZXNwb25kaW5nIGRyaXZlcnMgaW50byB0aGUga2VybmVsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3BhcnBvcnQudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbHAuCisKKwkgIElmIHlvdSBoYXZlIHNldmVyYWwgcGFyYWxsZWwgcG9ydHMsIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBwb3J0cyB0bworCSAgdXNlIHdpdGggdGhlICJscCIga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24uICAoVHJ5ICJtYW4gYm9vdHBhcmFtIgorCSAgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQKKwkgIGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuKSAgVGhlIHN5bnRheCBvZiB0aGUKKwkgICJscCIgY29tbWFuZCBsaW5lIG9wdGlvbiBjYW4gYmUgZm91bmQgaW4gPGZpbGU6ZHJpdmVycy9jaGFyL2xwLmM+LgorCisJICBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gOCBwcmludGVycywgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlIExQX05PCisJICBtYWNybyBpbiBscC5jIGFuZCB0aGUgUEFSUE9SVF9NQVggbWFjcm8gaW4gcGFycG9ydC5oLgorCitjb25maWcgTFBfQ09OU09MRQorCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gbGluZSBwcmludGVyIgorCWRlcGVuZHMgb24gUFJJTlRFUgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSB3YW50IGtlcm5lbCBtZXNzYWdlcyB0byBiZSBwcmludGVkIG91dCBhcyB0aGV5IG9jY3VyLCB5b3UKKwkgIGNhbiBoYXZlIGEgY29uc29sZSBvbiB0aGUgcHJpbnRlci4gVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvcgorCSAgZG9pbmcgdGhhdDsgdG8gYWN0dWFsbHkgZ2V0IGl0IHRvIGhhcHBlbiB5b3UgbmVlZCB0byBwYXNzIHRoZQorCSAgb3B0aW9uICJjb25zb2xlPWxwMCIgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuCisKKwkgIElmIHRoZSBwcmludGVyIGlzIG91dCBvZiBwYXBlciAob3Igb2ZmLCBvciB1bnBsdWdnZWQsIG9yIHRvbworCSAgYnVzeS4uKSB0aGUga2VybmVsIHdpbGwgc3RhbGwgdW50aWwgdGhlIHByaW50ZXIgaXMgcmVhZHkgYWdhaW4uCisJICBCeSBkZWZpbmluZyBDT05TT0xFX0xQX1NUUklDVCB0byAwIChhdCB5b3VyIG93biByaXNrKSB5b3UKKwkgIGNhbiBtYWtlIHRoZSBrZXJuZWwgY29udGludWUgd2hlbiB0aGlzIGhhcHBlbnMsCisJICBidXQgaXQnbGwgbG9zZSB0aGUga2VybmVsIG1lc3NhZ2VzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUFBERVYKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRldmljZSBkcml2ZXJzIgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFNheWluZyBZIHRvIHRoaXMgYWRkcyBzdXBwb3J0IGZvciAvZGV2L3BhcnBvcnQgZGV2aWNlIG5vZGVzLiAgVGhpcworCSAgaXMgbmVlZGVkIGZvciBwcm9ncmFtcyB0aGF0IHdhbnQgcG9ydGFibGUgYWNjZXNzIHRvIHRoZSBwYXJhbGxlbAorCSAgcG9ydCwgZm9yIGluc3RhbmNlIGRldmljZWlkICh3aGljaCBkaXNwbGF5cyBQbHVnLWFuZC1QbGF5IGRldmljZQorCSAgSURzKS4KKworCSAgVGhpcyBpcyB0aGUgcGFyYWxsZWwgcG9ydCBlcXVpdmFsZW50IG9mIFNDU0kgZ2VuZXJpYyBzdXBwb3J0IChzZykuCisJICBJdCBpcyBzYWZlIHRvIHNheSBOIHRvIHRoaXMgLS0gaXQgaXMgbm90IG5lZWRlZCBmb3Igbm9ybWFsIHByaW50aW5nCisJICBvciBwYXJhbGxlbCBwb3J0IENELVJPTS9kaXNrIHN1cHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBwZGV2LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVElQQVIKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgcGFyYWxsZWwgbGluayBjYWJsZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBvd24gYSBUZXhhcyBJbnN0cnVtZW50cyBncmFwaGluZyBjYWxjdWxhdG9yIGFuZCB1c2UgYQorCSAgcGFyYWxsZWwgbGluayBjYWJsZSwgdGhlbiB5b3UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIGRyaXZlci4KKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIGRyaXZlciwgeW91IHdpbGwgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoCisJICB5b3VyIGNhbGN1bGF0b3IgdGhyb3VnaCBhIHNldCBvZiBkZXZpY2Ugbm9kZXMgdW5kZXIgL2Rldi4gVGhlCisJICBtYWluIGFkdmFudGFnZSBvZiB0aGlzIGRyaXZlciBpcyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGJlIHJvb3QKKwkgIHRvIHVzZSB0aGlzIHByZWNpc2UgbGluayBjYWJsZSAoZGVwZW5kaW5nIG9uIHRoZSBwZXJtaXNzaW9ucyBvbgorCSAgdGhlIGRldmljZSBub2RlcywgdGhvdWdoKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGlwYXIuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgYSBwYXJhbGxlbCBsaW5rIGNhYmxlIGlzIG9yIHdoYXQgYSBUZXhhcworCSAgSW5zdHJ1bWVudHMgZ3JhcGhpbmcgY2FsY3VsYXRvciBpcywgdGhlbiB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0aGlzCisJICBkcml2ZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIVkNfQ09OU09MRQorCWJvb2wgInBTZXJpZXMgSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJaGVscAorCSAgcFNlcmllcyBtYWNoaW5lcyB3aGVuIHBhcnRpdGlvbmVkIHN1cHBvcnQgYSBoeXBlcnZpc29yIHZpcnR1YWwKKwkgIGNvbnNvbGUuIFRoaXMgZHJpdmVyIGFsbG93cyBlYWNoIHBTZXJpZXMgcGFydGl0aW9uIHRvIGhhdmUgYSBjb25zb2xlCisJICB3aGljaCBpcyBhY2Nlc3NlZCB2aWEgdGhlIEhNQy4KKworY29uZmlnIEhWQ1MKKwl0cmlzdGF0ZSAiSUJNIEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMKKwloZWxwCisJICBQYXJ0aXRpb25hYmxlIElCTSBQb3dlcjUgcHBjNjQgbWFjaGluZXMgYWxsb3cgaG9zdGluZyBvZgorCSAgZmlybXdhcmUgdmlydHVhbCBjb25zb2xlcyBmcm9tIG9uZSBMaW51eCBwYXJ0aXRpb24gYnkKKwkgIGFub3RoZXIgTGludXggcGFydGl0aW9uLiAgVGhpcyBkcml2ZXIgYWxsb3dzIGNvbnNvbGUgZGF0YQorCSAgZnJvbSBMaW51eCBwYXJ0aXRpb25zIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggVFRZIGRldmljZQorCSAgaW50ZXJmYWNlcyBpbiB0aGUgZGV2aWNlIHRyZWUgb2YgYSBMaW51eCBwYXJ0aXRpb24gcnVubmluZworCSAgdGhpcyBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGh2Y3Mua28uICBBZGRpdGlvbmFsbHksIHRoaXMgbW9kdWxlCisJICB3aWxsIGRlcGVuZCBvbiBhcmNoIHNwZWNpZmljIEFQSXMgZXhwb3J0ZWQgZnJvbSBodmNzZXJ2ZXIua28KKwkgIHdoaWNoIHdpbGwgYWxzbyBiZSBjb21waWxlZCB3aGVuIHRoaXMgZHJpdmVyIGlzIGJ1aWx0IGFzIGEKKwkgIG1vZHVsZS4KKworc291cmNlICJkcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIgorCitjb25maWcgRFMxNjIwCisJdHJpc3RhdGUgIk5ldFdpbmRlciB0aGVybW9tZXRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9ORVRXSU5ERVIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIHRoZXJtYWwgbWFuYWdlbWVudCBoYXJkd2FyZQorCSAgZm91bmQgaW4gdGhlIE5ldFdpbmRlci4gVGhpcyBkcml2ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgdGhlCisJICB0ZW1wZXJhdHVyZSBzZXQgcG9pbnRzIGFuZCB0byByZWFkIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlLgorCisJICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNheSBNIGhlcmUgdG8gYnVpbGQgaXQgYXMgYSBtb2R1bGUgKGRzMTYyMCkKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgb24gYSBOZXRXaW5kZXIsIGJ1dCBpdCBpcyBub3QgYQorCSAgbmVjZXNzaXR5LgorCitjb25maWcgTldCVVRUT04KKwl0cmlzdGF0ZSAiTmV0V2luZGVyIEJ1dHRvbiIKKwlkZXBlbmRzIG9uIEFSQ0hfTkVUV0lOREVSCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAvZGV2L253YnV0dG9uCisJICB3aXRoIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIDEwIGFuZCAxNTggKCJtYW4gbWtub2QiKSwgdGhlbiBldmVyeQorCSAgdGltZSB0aGUgb3JhbmdlIGJ1dHRvbiBpcyBwcmVzc2VkIGEgbnVtYmVyIG9mIHRpbWVzLCB0aGUgbnVtYmVyIG9mCisJICB0aW1lcyB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHdpbGwgYmUgd3JpdHRlbiB0byB0aGF0IGRldmljZS4KKworCSAgVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zLCBhcyB5ZXQgdW53cml0dGVuLCB3aGljaAorCSAgcGVyZm9ybSBhY3Rpb25zIGJhc2VkIG9uIGhvdyBtYW55IHRpbWVzIHRoZSBidXR0b24gaXMgcHJlc3NlZCBpbiBhCisJICByb3cuCisKKwkgIERvIG5vdCBob2xkIHRoZSBidXR0b24gZG93biBmb3IgdG9vIGxvbmcsIGFzIHRoZSBkcml2ZXIgZG9lcyBub3QKKwkgIGFsdGVyIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGhhcmR3YXJlIHJlc2V0IGNpcmN1aXRyeSBhdHRhY2hlZCB0byB0aGUKKwkgIGJ1dHRvbjsgaXQgd2lsbCBzdGlsbCBleGVjdXRlIGEgaGFyZCByZXNldCBpZiB0aGUgYnV0dG9uIGlzIGhlbGQKKwkgIGRvd24gZm9yIGxvbmdlciB0aGFuIGFwcHJveGltYXRlbHkgZml2ZSBzZWNvbmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBud2J1dHRvbi4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBhbnN3ZXIgWSB0byB0aGlzIHF1ZXN0aW9uIGFuZCAiUmVib290IFVzaW5nIEJ1dHRvbiIKKwkgIGJlbG93IHRvIGJlIGFibGUgdG8gaW5pdGlhdGUgYSBzeXN0ZW0gc2h1dGRvd24gZnJvbSB0aGUgYnV0dG9uLgorCitjb25maWcgTldCVVRUT05fUkVCT09UCisJYm9vbCAiUmVib290IFVzaW5nIEJ1dHRvbiIKKwlkZXBlbmRzIG9uIE5XQlVUVE9OCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4geW91IHdpbGwgYmUgYWJsZSB0byBpbml0aWF0ZSBhIHN5c3RlbQorCSAgc2h1dGRvd24gYW5kIHJlYm9vdCBieSBwcmVzc2luZyB0aGUgb3JhbmdlIGJ1dHRvbiBhIG51bWJlciBvZiB0aW1lcy4KKwkgIFRoZSBudW1iZXIgb2YgcHJlc3NlcyB0byBpbml0aWF0ZSB0aGUgc2h1dGRvd24gaXMgdHdvIGJ5IGRlZmF1bHQsCisJICBidXQgdGhpcyBjYW4gYmUgYWx0ZXJlZCBieSBtb2RpZnlpbmcgdGhlIHZhbHVlIG9mIE5VTV9QUkVTU0VTX1JFQk9PVAorCSAgaW4gbndidXR0b24uaCBhbmQgcmVjb21waWxpbmcgdGhlIGRyaXZlciBvciwgaWYgeW91IGNvbXBpbGUgdGhlCisJICBkcml2ZXIgYXMgYSBtb2R1bGUsIHlvdSBjYW4gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHByZXNzZXMgYXQgbG9hZAorCSAgdGltZSB3aXRoICJpbnNtb2QgYnV0dG9uIHJlYm9vdF9jb3VudD08c29tZXRoaW5nPiIuCisKK2NvbmZpZyBOV0ZMQVNICisJdHJpc3RhdGUgIk5ldFdpbmRlciBmbGFzaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9ORVRXSU5ERVIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIGRldmljZSAvZGV2L2ZsYXNoIHdpdGgKKwkgIG1ham9yIDEwIGFuZCBtaW5vciAxNjAgeW91IGNhbiBtYW5pcHVsYXRlIHRoZSBmbGFzaCBST00gY29udGFpbmluZworCSAgdGhlIE5ldFdpbmRlciBmaXJtd2FyZS4gQmUgY2FyZWZ1bCBhcyBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlCisJICBmbGFzaCBjb250ZW50cyBjYW4gcmVuZGVyIHlvdXIgY29tcHV0ZXIgdW5ib290YWJsZS4gT24gbm8gYWNjb3VudAorCSAgYWxsb3cgcmFuZG9tIHVzZXJzIGFjY2VzcyB0byB0aGlzIGRldmljZS4gOi0pCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG53Zmxhc2guCisKKwkgIElmIHlvdSdyZSBub3Qgc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIV19SQU5ET00KKwl0cmlzdGF0ZSAiSW50ZWwvQU1EL1ZJQSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFg4NiB8fCBJQTY0KSAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgorCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIEludGVsIGk4eHgtYmFzZWQgbW90aGVyYm9hcmRzLAorCSAgQU1EIDc2eC1iYXNlZCBtb3RoZXJib2FyZHMsIGFuZCBWaWEgTmVoZW1pYWggQ1BVcy4KKworCSAgUHJvdmlkZXMgYSBjaGFyYWN0ZXIgZHJpdmVyLCB1c2VkIHRvIHJlYWQoKSBlbnRyb3B5IGRhdGEuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGh3X3JhbmRvbS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5WUkFNCisJdHJpc3RhdGUgIi9kZXYvbnZyYW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFUQVJJIHx8IFg4NiB8fCBYODZfNjQgfHwgQVJNIHx8IEdFTkVSSUNfTlZSQU0KKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L252cmFtCisJICB3aXRoIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDE0NCB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLAorCSAgeW91IGdldCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGV4dHJhIGJ5dGVzIG9mIG5vbi12b2xhdGlsZQorCSAgbWVtb3J5IGluIHRoZSByZWFsIHRpbWUgY2xvY2sgKFJUQyksIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiBldmVyeSBQQworCSAgYW5kIG1vc3QgQXRhcmlzLiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgdmFyaWVzLCBkZXBlbmRpbmcgb24gdGhlCisJICBudnJhbSBpbiB0aGUgc3lzdGVtLCBidXQgaXMgdXN1YWxseSAxMTQgKDEyOC0xNCBmb3IgdGhlIFJUQykuCisKKwkgIFRoaXMgbWVtb3J5IGlzIGNvbnZlbnRpb25hbGx5IGNhbGxlZCAiQ01PUyBSQU0iIG9uIFBDcyBhbmQgIk5WUkFNIgorCSAgb24gQXRhcmlzLiAvZGV2L252cmFtIG1heSBiZSB1c2VkIHRvIHZpZXcgc2V0dGluZ3MgdGhlcmUsIG9yIHRvCisJICBjaGFuZ2UgdGhlbSAod2l0aCBzb21lIHV0aWxpdHkpLiBJdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gZnJlcXVlbnRseQorCSAgc2F2ZSBhIGZldyBiaXRzIG9mIHZlcnkgaW1wb3J0YW50IGRhdGEgdGhhdCBtYXkgbm90IGJlIGxvc3Qgb3ZlcgorCSAgcG93ZXItb2ZmIGFuZCBmb3Igd2hpY2ggd3JpdGluZyB0byBkaXNrIGlzIHRvbyBpbnNlY3VyZS4gTm90ZQorCSAgaG93ZXZlciB0aGF0IG1vc3QgTlZSQU0gc3BhY2UgaW4gYSBQQyBiZWxvbmdzIHRvIHRoZSBCSU9TIGFuZCB5b3UKKwkgIHNob3VsZCBORVZFUiBpZGx5IHRhbXBlciB3aXRoIGl0LiBTZWUgUmFsZiBCcm93bidzIGludGVycnVwdCBsaXN0CisJICBmb3IgYSBndWlkZSB0byB0aGUgdXNlIG9mIENNT1MgYnl0ZXMgYnkgeW91ciBCSU9TLgorCisJICBPbiBBdGFyaSBtYWNoaW5lcywgL2Rldi9udnJhbSBpcyBhbHdheXMgY29uZmlndXJlZCBhbmQgZG9lcyBub3QgbmVlZAorCSAgdG8gYmUgc2VsZWN0ZWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG52cmFtLgorCitjb25maWcgUlRDCisJdHJpc3RhdGUgIkVuaGFuY2VkIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0IgorCWRlcGVuZHMgb24gIVBQQzMyICYmICFQQVJJU0MgJiYgIUlBNjQgJiYgIU02OEsKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCisJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CisJICB3aWxsIGdldCBhY2Nlc3MgdG8gdGhlIHJlYWwgdGltZSBjbG9jayAob3IgaGFyZHdhcmUgY2xvY2spIGJ1aWx0CisJICBpbnRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIEV2ZXJ5IFBDIGhhcyBzdWNoIGEgY2xvY2sgYnVpbHQgaW4uIEl0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlCisJICBzaWduYWxzIGZyb20gYXMgbG93IGFzIDFIeiB1cCB0byA4MTkySHosIGFuZCBjYW4gYWxzbyBiZSB1c2VkCisJICBhcyBhIDI0IGhvdXIgYWxhcm0uIEl0IHJlcG9ydHMgc3RhdHVzIGluZm9ybWF0aW9uIHZpYSB0aGUgZmlsZQorCSAgL3Byb2MvZHJpdmVyL3J0YyBhbmQgaXRzIGJlaGF2aW91ciBpcyBzZXQgYnkgdmFyaW91cyBpb2N0bHMgb24KKwkgIC9kZXYvcnRjLgorCisJICBJZiB5b3UgcnVuIExpbnV4IG9uIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZSBhbmQgc2FpZCBZIHRvCisJICAiU3ltbWV0cmljIE11bHRpIFByb2Nlc3NpbmciIGFib3ZlLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUgdG8gcmVhZAorCSAgYW5kIHNldCB0aGUgUlRDIGluIGFuIFNNUCBjb21wYXRpYmxlIGZhc2hpb24uCisKKwkgIElmIHlvdSB0aGluayB5b3UgaGF2ZSBhIHVzZSBmb3Igc3VjaCBhIGRldmljZSAoc3VjaCBhcyBwZXJpb2RpYyBkYXRhCisJICBzYW1wbGluZyksIHRoZW4gc2F5IFkgaGVyZSwgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9ydGMudHh0PgorCSAgZm9yIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy4KKworY29uZmlnIFNHSV9EUzEyODYKKwl0cmlzdGF0ZSAiU0dJIERTMTI4NiBSVEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNHSV9JUDIyCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi9ydGMgd2l0aAorCSAgbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTM1IHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdQorCSAgd2lsbCBnZXQgYWNjZXNzIHRvIHRoZSByZWFsIHRpbWUgY2xvY2sgYnVpbHQgaW50byB5b3VyIGNvbXB1dGVyLgorCSAgRXZlcnkgU0dJIGhhcyBzdWNoIGEgY2xvY2sgYnVpbHQgaW4uIEl0IHJlcG9ydHMgc3RhdHVzIGluZm9ybWF0aW9uCisJICB2aWEgdGhlIGZpbGUgL3Byb2MvcnRjIGFuZCBpdHMgYmVoYXZpb3VyIGlzIHNldCBieSB2YXJpb3VzIGlvY3RscyBvbgorCSAgL2Rldi9ydGMuCisKK2NvbmZpZyBTR0lfSVAyN19SVEMKKwlib29sICJTR0kgTTQ4VDM1IFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0dJX0lQMjcKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCisJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CisJICB3aWxsIGdldCBhY2Nlc3MgdG8gdGhlIHJlYWwgdGltZSBjbG9jayBidWlsdCBpbnRvIHlvdXIgY29tcHV0ZXIuCisJICBFdmVyeSBTR0kgaGFzIHN1Y2ggYSBjbG9jayBidWlsdCBpbi4gSXQgcmVwb3J0cyBzdGF0dXMgaW5mb3JtYXRpb24KKwkgIHZpYSB0aGUgZmlsZSAvcHJvYy9ydGMgYW5kIGl0cyBiZWhhdmlvdXIgaXMgc2V0IGJ5IHZhcmlvdXMgaW9jdGxzIG9uCisJICAvZGV2L3J0Yy4KKworY29uZmlnIEdFTl9SVEMKKwl0cmlzdGF0ZSAiR2VuZXJpYyAvZGV2L3J0YyBlbXVsYXRpb24iCisJZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKKwkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKKwkgIHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrIChvciBoYXJkd2FyZSBjbG9jaykgYnVpbHQKKwkgIGludG8geW91ciBjb21wdXRlci4KKworCSAgSXQgcmVwb3J0cyBzdGF0dXMgaW5mb3JtYXRpb24gdmlhIHRoZSBmaWxlIC9wcm9jL2RyaXZlci9ydGMgYW5kIGl0cworCSAgYmVoYXZpb3VyIGlzIHNldCBieSB2YXJpb3VzIGlvY3RscyBvbiAvZGV2L3J0Yy4gSWYgeW91IGVuYWJsZSB0aGUKKwkgICJleHRlbmRlZCBSVEMgb3BlcmF0aW9uIiBiZWxvdyBpdCB3aWxsIGFsc28gcHJvdmlkZSBhbiBlbXVsYXRpb24KKwkgIGZvciBSVENfVUlFIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IHNvbWUgcHJvZ3JhbXMgYW5kIG1heSBpbXByb3ZlCisJICBwcmVjaXNpb24gaW4gc29tZSBjYXNlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ2VucnRjLgorCitjb25maWcgR0VOX1JUQ19YCisJYm9vbCAiRXh0ZW5kZWQgUlRDIG9wZXJhdGlvbiIKKwlkZXBlbmRzIG9uIEdFTl9SVEMKKwloZWxwCisJICBQcm92aWRlcyBhbiBlbXVsYXRpb24gZm9yIFJUQ19VSUUgd2hpY2ggaXMgcmVxdWlyZWQgYnkgc29tZSBwcm9ncmFtcworCSAgYW5kIG1heSBpbXByb3ZlIHByZWNpc2lvbiBvZiB0aGUgZ2VuZXJpYyBSVEMgc3VwcG9ydCBpbiBzb21lIGNhc2VzLgorCitjb25maWcgRUZJX1JUQworCWJvb2wgIkVGSSBSZWFsIFRpbWUgQ2xvY2sgU2VydmljZXMiCisJZGVwZW5kcyBvbiBJQTY0CisKK2NvbmZpZyBEUzEzMDIKKwl0cmlzdGF0ZSAiRFMxMzAyIFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTTMyUiAmJiAoUExBVF9NMzI3MDBVVCB8fCBQTEFUX09QU1BVVCkKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCisJICBtYWpvciBudW1iZXIgMTIxIGFuZCBtaW5vciBudW1iZXIgMCB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKKwkgIHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrIChvciBoYXJkd2FyZSBjbG9jaykgYnVpbHQKKwkgIGludG8geW91ciBjb21wdXRlci4KKworY29uZmlnIFMzQzI0MTBfUlRDCisJYm9vbCAiUzNDMjQxMCBSVEMgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCisJaGVscAorCSAgUlRDIChSZWFsdGltZSBDbG9jaykgZHJpdmVyIGZvciB0aGUgY2xvY2sgaW5idWlsdCBpbnRvIHRoZQorCSAgU2Ftc3VuZyBTM0MyNDEwLiBUaGlzIGNhbiBwcm92aWRlIHBlcmlvZGljIGludGVycnVwdCByYXRlcworCSAgZnJvbSAxSHogdG8gNjRIeiBmb3IgdXNlciBwcm9ncmFtcywgYW5kIHdha2V1cCBmcm9tIEFsYXJtLgorCitjb25maWcgUlRDX1ZSNDFYWAorCXRyaXN0YXRlICJORUMgVlI0MTAwIHNlcmllcyBSZWFsIFRpbWUgQ2xvY2sgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIENQVV9WUjQxWFgKKworY29uZmlnIENPQkFMVF9MQ0QKKwlib29sICJTdXBwb3J0IGZvciBDb2JhbHQgTENEIgorCWRlcGVuZHMgb24gTUlQU19DT0JBTFQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMQ0QgZGlzcGxheSBhbmQgYnV0dG9ucyBmb3VuZAorCSAgb24gQ29iYWx0IHN5c3RlbXMgdGhyb3VnaCBhIG1pc2MgZGV2aWNlLgorCitjb25maWcgRFRMSworCXRyaXN0YXRlICJEb3VibGUgVGFsayBQQyBpbnRlcm5hbCBzcGVlY2ggY2FyZCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgRG91YmxlVGFsayBQQywgYSBzcGVlY2ggc3ludGhlc2l6ZXIKKwkgIG1hbnVmYWN0dXJlZCBieSBSQyBTeXN0ZW1zICg8aHR0cDovL3d3dy5yY3N5cy5jb20vPikuICBJdCBpcyBhbHNvCisJICBjYWxsZWQgdGhlIGBpbnRlcm5hbCBEb3VibGVUYWxrJy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHRsay4KKworY29uZmlnIFIzOTY0CisJdHJpc3RhdGUgIlNpZW1lbnMgUjM5NjQgbGluZSBkaXNjaXBsaW5lIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGFsbG93cyBzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uIHdpdGggZGV2aWNlcyB1c2luZyB0aGUKKwkgIFNpZW1lbnMgUjM5NjQgcGFja2V0IHByb3RvY29sLiBVbmxlc3MgeW91IGFyZSBkZWFsaW5nIHdpdGggc3BlY2lhbAorCSAgaGFyZHdhcmUgbGlrZSBQTENzLCB5b3UgYXJlIHVubGlrZWx5IHRvIG5lZWQgdGhpcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbl9yMzk2NC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFQUExJQ09NCisJdHJpc3RhdGUgIkFwcGxpY29tIGludGVsbGlnZW50IGZpZWxkYnVzIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZSBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgaW50ZWxsaWdlbnQKKwkgIGZpZWxkYnVzIGNhcmRzIG1hZGUgYnkgQXBwbGljb20gSW50ZXJuYXRpb25hbC4gTW9yZSBpbmZvcm1hdGlvbgorCSAgYWJvdXQgdGhlc2UgY2FyZHMgY2FuIGJlIGZvdW5kIG9uIHRoZSBXV1cgYXQgdGhlIGFkZHJlc3MKKwkgIDxodHRwOi8vd3d3LmFwcGxpY29tLWludC5jb20vPiwgb3IgYnkgZW1haWwgZnJvbSBEYXZpZCBXb29kaG91c2UKKwkgIDxkd213MkBpbmZyYWRlYWQub3JnPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXBwbGljb20uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTT05ZUEkKKwl0cmlzdGF0ZSAiU29ueSBWYWlvIFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2Ugc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBYODYgJiYgUENJICYmIElOUFVUICYmICE2NEJJVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbAorCSAgRGV2aWNlIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBtYW55IChhbGwgPykgU29ueSBWYWlvIGxhcHRvcHMuCisKKwkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSBsYXB0b3BzLCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvbnlwaS50eHQ+LCBhbmQgc2F5IFkgb3IgTSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzb255cGkuCisKK2NvbmZpZyBUQU5CQUNfVEIwMjE5CisJdHJpc3RhdGUgIlRBTkJBQyBUQjAyMTkgYmFzZSBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgVEFOQkFDX1RCMDIyOQorCisKK21lbnUgIkZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlciIKKworY29uZmlnIEZUQVBFCisJdHJpc3RhdGUgIkZ0YXBlIChRSUMtODAvVHJhdmFuKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJPS0VOX09OX1NNUCAmJiAoQUxQSEEgfHwgWDg2KQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgdGFwZSBkcml2ZSB0aGF0IGlzIGNvbm5lY3RlZCB0byB5b3VyIGZsb3BweQorCSAgY29udHJvbGxlciwgc2F5IFkgaGVyZS4KKworCSAgU29tZSB0YXBlIGRyaXZlcyAobGlrZSB0aGUgU2VhZ2F0ZSAiVGFwZSBTdG9yZSAzMjAwIiBvciB0aGUgSW9tZWdhCisJICAiRGl0dG8gMzIwMCIgb3IgdGhlIEV4YWJ5dGUgIkVhZ2xlIFRSLTMiKSBjb21lIHdpdGggYSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXIgb2YgdGhlaXIgb3duLiBUaGVzZSBkcml2ZXMgKGFuZCB0aGVpciBjb21wYW5pb24KKwkgIGNvbnRyb2xsZXJzKSBhcmUgYWxzbyBzdXBwb3J0ZWQgaWYgeW91IHNheSBZIGhlcmUuCisKKwkgIElmIHlvdSBoYXZlIGEgc3BlY2lhbCBjb250cm9sbGVyIChzdWNoIGFzIHRoZSBDTVMgRkMtMTAsIEZDLTIwLAorCSAgTW91bnRhaW4gTWFjaC1JSSwgb3IgYW55IGNvbnRyb2xsZXIgdGhhdCBpcyBiYXNlZCBvbiB0aGUgSW50ZWwgODIwNzgKKwkgIEZEQyBsaWtlIHRoZSBoaWdoIHNwZWVkIGNvbnRyb2xsZXJzIGJ5IFNlYWdhdGUgYW5kIEV4YWJ5dGUgYW5kCisJICBJb21lZ2EncyAiRGl0dG8gRGFzaCIpIHlvdSBtdXN0IGNvbmZpZ3VyZSBpdCBieSBzZWxlY3RpbmcgdGhlCisJICBhcHByb3ByaWF0ZSBlbnRyaWVzIGZyb20gdGhlICJGbG9wcHkgdGFwZSBjb250cm9sbGVycyIgc3ViLW1lbnUKKwkgIGJlbG93IGFuZCBwb3NzaWJseSBtb2RpZnkgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgSVJRIGFuZCBETUEKKwkgIGNoYW5uZWwgYW5kIHRoZSBJTyBiYXNlIGluIGZ0YXBlJ3MgY29uZmlndXJhdGlvbiBtZW51LgorCisJICBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBmbG9wcHkgdGFwZSBkcml2ZSBvbiBhIFBDSS1idXMgYmFzZWQgc3lzdGVtLAorCSAgcGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6ZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0k+LgorCisJICBUaGUgZnRhcGUga2VybmVsIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIHJ1bnRpbWUgbG9hZGFibGUKKwkgIG1vZHVsZS4gVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZnRhcGUuCisKKwkgIE5vdGUgdGhhdCB0aGUgRnRhcGUtSE9XVE8gaXMgb3V0IG9mIGRhdGUgKHNvcnJ5KSBhbmQgZG9jdW1lbnRzIHRoZQorCSAgb2xkZXIgdmVyc2lvbiAyLjA4IG9mIHRoaXMgc29mdHdhcmUgYnV0IHN0aWxsIGNvbnRhaW5zIHVzZWZ1bAorCSAgaW5mb3JtYXRpb24uICBUaGVyZSBpcyBhIHdlYiBwYWdlIHdpdGggbW9yZSByZWNlbnQgZG9jdW1lbnRhdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cuaW5zdG1hdGgucnd0aC1hYWNoZW4uZGUvfmhlaW5lL2Z0YXBlLz4uICBUaGlzIHBhZ2UKKwkgIGFsd2F5cyBjb250YWlucyB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2YgdGhlIGZ0YXBlIGRyaXZlciBhbmQgdXNlZnVsCisJICBpbmZvcm1hdGlvbiAoYmFja3VwIHNvZnR3YXJlLCBmdGFwZSByZWxhdGVkIHBhdGNoZXMgYW5kCisJICBkb2N1bWVudGF0aW9uLCBGQVEpLiAgTm90ZSB0aGF0IHRoZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgaGFzCisJICBjaGFuZ2VkIHF1aXRlIGEgYml0IGNvbXBhcmVkIHRvIHByZXZpb3VzIHZlcnNpb25zIG9mIGZ0YXBlLiAgUGxlYXNlCisJICByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vZnRhcGUudHh0Pi4KKworc291cmNlICJkcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyIKKworZW5kbWVudQorCitzb3VyY2UgImRyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2NoYXIvZHJtL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnIgorCitjb25maWcgTVdBVkUKKwl0cmlzdGF0ZSAiQUNQIE1vZGVtIChNd2F2ZSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NgorCXNlbGVjdCBTRVJJQUxfODI1MAorCS0tLWhlbHAtLS0KKwkgIFRoZSBBQ1AgbW9kZW0gKE13YXZlKSBmb3IgTGludXggaXMgYSBXaW5Nb2RlbS4gSXQgaXMgY29tcG9zZWQgb2YgYQorCSAga2VybmVsIGRyaXZlciBhbmQgYSB1c2VyIGxldmVsIGFwcGxpY2F0aW9uLiBUb2dldGhlciB0aGVzZSBjb21wb25lbnRzCisJICBzdXBwb3J0IGRpcmVjdCBhdHRhY2htZW50IHRvIHB1YmxpYyBzd2l0Y2hlZCB0ZWxlcGhvbmUgbmV0d29ya3MgKFBTVE5zKQorCSAgYW5kIHN1cHBvcnQgc2VsZWN0ZWQgd29ybGQgd2lkZSBjb3VudHJpZXMuCisKKwkgIFRoaXMgdmVyc2lvbiBvZiB0aGUgQUNQIE1vZGVtIGRyaXZlciBzdXBwb3J0cyB0aGUgSUJNIFRoaW5rcGFkIDYwMEUsCisJICA2MDAsIGFuZCA3NzAgdGhhdCBpbmNsdWRlIG9uIGJvYXJkIEFDUCBtb2RlbSBoYXJkd2FyZS4KKworCSAgVGhlIG1vZGVtIGFsc28gc3VwcG9ydHMgdGhlIHN0YW5kYXJkIGNvbW11bmljYXRpb25zIHBvcnQgaW50ZXJmYWNlCisJICAodHR5U3gpIGFuZCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEhheWVzIEFUIENvbW1hbmQgU2V0LgorCisJICBUaGUgdXNlciBsZXZlbCBhcHBsaWNhdGlvbiBuZWVkZWQgdG8gdXNlIHRoaXMgZHJpdmVyIGNhbiBiZSBmb3VuZCBhdAorCSAgdGhlIElCTSBMaW51eCBUZWNobm9sb2d5IENlbnRlciAoTFRDKSB3ZWIgc2l0ZToKKwkgIDxodHRwOi8vd3d3LmlibS5jb20vbGludXgvbHRjLz4uCisKKwkgIElmIHlvdSBvd24gb25lIG9mIHRoZSBhYm92ZSBJQk0gVGhpbmtwYWRzIHdoaWNoIGhhcyB0aGUgTXdhdmUgY2hpcHNldAorCSAgaW4gaXQsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtd2F2ZS4KKworY29uZmlnIFNDeDIwMF9HUElPCisJdHJpc3RhdGUgIk5hdFNlbWkgU0N4MjAwIEdQSU8gU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDeDIwMAorCWhlbHAKKwkgIEdpdmUgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUgR1BJTyBwaW5zIG9uIHRoZSBOYXRpb25hbAorCSAgU2VtaWNvbmR1Y3RvciBTQ3gyMDAgcHJvY2Vzc29ycy4KKworCSAgSWYgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHNjeDIwMF9ncGlvLgorCitjb25maWcgUkFXX0RSSVZFUgorCXRyaXN0YXRlICJSQVcgZHJpdmVyICgvZGV2L3Jhdy9yYXdOKSAoT0JTT0xFVEUpIgorCWhlbHAKKwkgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLiAKKwkgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4gCisJICBTZWUgdGhlIHJhdyg4KSBtYW5wYWdlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgICAgICBUaGUgcmF3IGRyaXZlciBpcyBkZXByZWNhdGVkIGFuZCBtYXkgYmUgcmVtb3ZlZCBmcm9tIDIuNworICAgICAgICAgIGtlcm5lbHMuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHNpbXBseSBvcGVuIHRoZSBkZXZpY2UgKGVnIC9kZXYvaGRhMSkKKyAgICAgICAgICB3aXRoIHRoZSBPX0RJUkVDVCBmbGFnLgorCitjb25maWcgSFBFVAorCWJvb2wgIkhQRVQgLSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciIgaWYgKFg4NiB8fCBJQTY0KQorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQUNQSQorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBoYXZlIGEgbWlzY2RldmljZSBuYW1lZCAiL2Rldi9ocGV0LyIuICBFYWNoCisJICBvcGVuIHNlbGVjdHMgb25lIG9mIHRoZSB0aW1lcnMgc3VwcG9ydGVkIGJ5IHRoZSBIUEVULiAgVGhlIHRpbWVycyBhcmUKKwkgIG5vbi1wZXJpb2Rpb2MgYW5kL29yIHBlcmlvZGljLgorCitjb25maWcgSFBFVF9SVENfSVJRCisJYm9vbCAiSFBFVCBDb250cm9sIFJUQyBJUlEiIGlmICFIUEVUX0VNVUxBVEVfUlRDCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBIUEVUCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGRpc2FibGUgUlRDX0lSUSBpbiBkcml2ZXJzL2NoYXIvcnRjLmMuIEl0CisJICBpcyBhc3N1bWVkIHRoZSBwbGF0Zm9ybSBjYWxsZWQgaHBldF9hbGxvYyB3aXRoIHRoZSBSVEMgSVJRIHZhbHVlcyBmb3IKKwkgIHRoZSBIUEVUIHRpbWVycy4KKworY29uZmlnIEhQRVRfTU1BUAorCWJvb2wgIkFsbG93IG1tYXAgb2YgSFBFVCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhQRVQKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdXNlciBhcHBsaWNhdGlvbnMgd2lsbCBiZSBhYmxlIHRvIG1tYXAKKwkgIHRoZSBIUEVUIHJlZ2lzdGVycy4KKworCSAgSW4gc29tZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMsIHRoZSBwYWdlIGNvbnRhaW5pbmcgSFBFVAorCSAgcmVnaXN0ZXJzIG1heSBhbHNvIGNvbnRhaW4gb3RoZXIgdGhpbmdzIHRoYXQgc2hvdWxkbid0IGJlCisJICBleHBvc2VkIHRvIHRoZSB1c2VyLiAgSWYgdGhpcyBhcHBsaWVzIHRvIHlvdXIgaGFyZHdhcmUsCisJICBzYXkgTiBoZXJlLgorCitjb25maWcgTUFYX1JBV19ERVZTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBSQVcgZGV2aWNlcyB0byBzdXBwb3J0ICgxLTgxOTIpIgorCWRlcGVuZHMgb24gUkFXX0RSSVZFUgorCWRlZmF1bHQgIjI1NiIKKwloZWxwCisJICBUaGUgbWF4aW11bSBudW1iZXIgb2YgUkFXIGRldmljZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgorCSAgRGVmYXVsdCBpcyAyNTYuIEluY3JlYXNlIHRoaXMgbnVtYmVyIGluIGNhc2UgeW91IG5lZWQgbG90cyBvZgorCSAgcmF3IGRldmljZXMuCisKK2NvbmZpZyBIQU5HQ0hFQ0tfVElNRVIKKwl0cmlzdGF0ZSAiSGFuZ2NoZWNrIHRpbWVyIgorCWRlcGVuZHMgb24gWDg2XzY0IHx8IFg4NgorCWhlbHAKKwkgIFRoZSBoYW5nY2hlY2stdGltZXIgbW9kdWxlIGRldGVjdHMgd2hlbiB0aGUgc3lzdGVtIGhhcyBnb25lCisJICBvdXQgdG8gbHVuY2ggcGFzdCBhIGNlcnRhaW4gbWFyZ2luLiAgSXQgY2FuIHJlYm9vdCB0aGUgc3lzdGVtCisJICBvciBtZXJlbHkgcHJpbnQgYSB3YXJuaW5nLgorCitjb25maWcgTU1USU1FUgorCXRyaXN0YXRlICJNTVRJTUVSIE1lbW9yeSBtYXBwZWQgUlRDIGZvciBTR0kgQWx0aXgiCisJZGVwZW5kcyBvbiBJQTY0X0dFTkVSSUMgfHwgSUE2NF9TR0lfU04yCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG1tdGltZXIgZGV2aWNlIGFsbG93cyBkaXJlY3QgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUKKwkgIEFsdGl4IHN5c3RlbSB0aW1lci4KKworc291cmNlICJkcml2ZXJzL2NoYXIvdHBtL0tjb25maWciCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWQ3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzLgorIworCisjCisjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZm9udCBtYXAgZm9yIHRoZSBkZWZhdWx0IChoYXJkd2FyZSkgZm9udAorIworRk9OVE1BUEZJTEUgPSBjcDQzNy51bmkKKworb2JqLXkJICs9IG1lbS5vIHJhbmRvbS5vIHR0eV9pby5vIG5fdHR5Lm8gdHR5X2lvY3RsLm8KKworb2JqLSQoQ09ORklHX0xFR0FDWV9QVFlTKQkrPSBwdHkubworb2JqLSQoQ09ORklHX1VOSVg5OF9QVFlTKQkrPSBwdHkubworb2JqLXkJCQkJKz0gbWlzYy5vCitvYmotJChDT05GSUdfVlQpCQkrPSB2dF9pb2N0bC5vIHZjX3NjcmVlbi5vIGNvbnNvbGVtYXAubyBcCisJCQkJICAgY29uc29sZW1hcF9kZWZ0YmwubyBzZWxlY3Rpb24ubyBrZXlib2FyZC5vCitvYmotJChDT05GSUdfSFdfQ09OU09MRSkJKz0gdnQubyBkZWZrZXltYXAubworb2JqLSQoQ09ORklHX01BR0lDX1NZU1JRKQkrPSBzeXNycS5vCitvYmotJChDT05GSUdfRVNQU0VSSUFMKQkJKz0gZXNwLm8KK29iai0kKENPTkZJR19NVk1FMTQ3X1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KK29iai0kKENPTkZJR19NVk1FMTYyX1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KK29iai0kKENPTkZJR19CVk1FNjAwMF9TQ0MpCSs9IGdlbmVyaWNfc2VyaWFsLm8gdm1lX3NjYy5vCitvYmotJChDT05GSUdfUk9DS0VUUE9SVCkJKz0gcm9ja2V0Lm8KK29iai0kKENPTkZJR19TRVJJQUwxNjcpCQkrPSBzZXJpYWwxNjcubworb2JqLSQoQ09ORklHX0NZQ0xBREVTKQkJKz0gY3ljbGFkZXMubworb2JqLSQoQ09ORklHX1NUQUxMSU9OKQkJKz0gc3RhbGxpb24ubworb2JqLSQoQ09ORklHX0lTVEFMTElPTikJCSs9IGlzdGFsbGlvbi5vCitvYmotJChDT05GSUdfRElHSUVQQ0EpCQkrPSBlcGNhLm8KK29iai0kKENPTkZJR19TUEVDSUFMSVgpCQkrPSBzcGVjaWFsaXgubworb2JqLSQoQ09ORklHX01PWEFfSU5URUxMSU8pCSs9IG1veGEubworb2JqLSQoQ09ORklHX0EyMjMyKQkJKz0gc2VyX2EyMjMyLm8gZ2VuZXJpY19zZXJpYWwubworb2JqLSQoQ09ORklHX0FUQVJJX0RTUDU2SykJKz0gZHNwNTZrLm8KK29iai0kKENPTkZJR19NT1hBX1NNQVJUSU8pCSs9IG14c2VyLm8KK29iai0kKENPTkZJR19DT01QVVRPTkUpCQkrPSBpcDIubyBpcDJtYWluLm8KK29iai0kKENPTkZJR19SSVNDT004KQkJKz0gcmlzY29tOC5vCitvYmotJChDT05GSUdfSVNJKQkJKz0gaXNpY29tLm8KK29iai0kKENPTkZJR19TWU5DTElOSykJCSs9IHN5bmNsaW5rLm8KK29iai0kKENPTkZJR19TWU5DTElOS01QKQkrPSBzeW5jbGlua21wLm8KK29iai0kKENPTkZJR19OX0hETEMpCQkrPSBuX2hkbGMubworb2JqLSQoQ09ORklHX0FNSUdBX0JVSUxUSU5fU0VSSUFMKSArPSBhbWlzZXJpYWwubworb2JqLSQoQ09ORklHX1NYKQkJKz0gc3gubyBnZW5lcmljX3NlcmlhbC5vCitvYmotJChDT05GSUdfUklPKQkJKz0gcmlvLyBnZW5lcmljX3NlcmlhbC5vCitvYmotJChDT05GSUdfSFZDX0NPTlNPTEUpCSs9IGh2Y19jb25zb2xlLm8gaHZzaS5vCitvYmotJChDT05GSUdfUkFXX0RSSVZFUikJKz0gcmF3Lm8KK29iai0kKENPTkZJR19TR0lfU05TQykJCSs9IHNuc2Mubworb2JqLSQoQ09ORklHX01NVElNRVIpCQkrPSBtbXRpbWVyLm8KK29iai0kKENPTkZJR19WSU9DT05TKSArPSB2aW9jb25zLm8KK29iai0kKENPTkZJR19WSU9UQVBFKQkJKz0gdmlvdGFwZS5vCitvYmotJChDT05GSUdfSFZDUykJCSs9IGh2Y3MubworCitvYmotJChDT05GSUdfUFJJTlRFUikgKz0gbHAubworb2JqLSQoQ09ORklHX1RJUEFSKSArPSB0aXBhci5vCisKK29iai0kKENPTkZJR19EVExLKSArPSBkdGxrLm8KK29iai0kKENPTkZJR19SMzk2NCkgKz0gbl9yMzk2NC5vCitvYmotJChDT05GSUdfQVBQTElDT00pICs9IGFwcGxpY29tLm8KK29iai0kKENPTkZJR19TT05ZUEkpICs9IHNvbnlwaS5vCitvYmotJChDT05GSUdfUlRDKSArPSBydGMubworb2JqLSQoQ09ORklHX0hQRVQpICs9IGhwZXQubworb2JqLSQoQ09ORklHX0dFTl9SVEMpICs9IGdlbnJ0Yy5vCitvYmotJChDT05GSUdfRUZJX1JUQykgKz0gZWZpcnRjLm8KK29iai0kKENPTkZJR19TR0lfRFMxMjg2KSArPSBkczEyODYubworb2JqLSQoQ09ORklHX1NHSV9JUDI3X1JUQykgKz0gaXAyNy1ydGMubworb2JqLSQoQ09ORklHX0RTMTMwMikgKz0gZHMxMzAyLm8KK29iai0kKENPTkZJR19TM0MyNDEwX1JUQykgKz0gczNjMjQxMC1ydGMubworb2JqLSQoQ09ORklHX1JUQ19WUjQxWFgpICs9IHZyNDF4eF9ydGMubworaWZlcSAoJChDT05GSUdfR0VORVJJQ19OVlJBTSkseSkKKyAgb2JqLSQoQ09ORklHX05WUkFNKSArPSBnZW5lcmljX252cmFtLm8KK2Vsc2UKKyAgb2JqLSQoQ09ORklHX05WUkFNKSArPSBudnJhbS5vCitlbmRpZgorb2JqLSQoQ09ORklHX1RPU0hJQkEpICs9IHRvc2hpYmEubworb2JqLSQoQ09ORklHX0k4SykgKz0gaThrLm8KK29iai0kKENPTkZJR19EUzE2MjApICs9IGRzMTYyMC5vCitvYmotJChDT05GSUdfSFdfUkFORE9NKSArPSBod19yYW5kb20ubworb2JqLSQoQ09ORklHX0ZUQVBFKSArPSBmdGFwZS8KK29iai0kKENPTkZJR19DT0JBTFRfTENEKSArPSBsY2Qubworb2JqLSQoQ09ORklHX1BQREVWKSArPSBwcGRldi5vCitvYmotJChDT05GSUdfTldCVVRUT04pICs9IG53YnV0dG9uLm8KK29iai0kKENPTkZJR19OV0ZMQVNIKSArPSBud2ZsYXNoLm8KK29iai0kKENPTkZJR19TQ3gyMDBfR1BJTykgKz0gc2N4MjAwX2dwaW8ubworb2JqLSQoQ09ORklHX1RBTkJBQ19UQjAyMTkpICs9IHRiMDIxOS5vCisKK29iai0kKENPTkZJR19XQVRDSERPRykJKz0gd2F0Y2hkb2cvCitvYmotJChDT05GSUdfTVdBVkUpICs9IG13YXZlLworb2JqLSQoQ09ORklHX0FHUCkgKz0gYWdwLworb2JqLSQoQ09ORklHX0RSTSkgKz0gZHJtLworb2JqLSQoQ09ORklHX1BDTUNJQSkgKz0gcGNtY2lhLworb2JqLSQoQ09ORklHX0lQTUlfSEFORExFUikgKz0gaXBtaS8KKworb2JqLSQoQ09ORklHX0hBTkdDSEVDS19USU1FUikgKz0gaGFuZ2NoZWNrLXRpbWVyLm8KK29iai0kKENPTkZJR19UQ0dfVFBNKSArPSB0cG0vCisjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCitjbGVhbi1maWxlcyA6PSBjb25zb2xlbWFwX2RlZnRibC5jIGRlZmtleW1hcC5jIHF0cm9uaXhtYXAuYworCitxdWlldF9jbWRfY29ubWsgPSBDT05NSyAgICRACisgICAgICBjbWRfY29ubWsgPSBzY3JpcHRzL2Nvbm1ha2VoYXNoICQ8ID4gJEAKKworJChvYmopL2NvbnNvbGVtYXBfZGVmdGJsLmM6ICQoc3JjKS8kKEZPTlRNQVBGSUxFKQorCSQoY2FsbCBjbWQsY29ubWspCisKKyQob2JqKS9kZWZrZXltYXAubzogICQob2JqKS9kZWZrZXltYXAuYworCiskKG9iaikvcXRyb25peG1hcC5vOiAkKG9iaikvcXRyb25peG1hcC5jCisKKyMgVW5jb21tZW50IGlmIHlvdSdyZSBjaGFuZ2luZyB0aGUga2V5bWFwIGFuZCBoYXZlIGFuIGFwcHJvcHJpYXRlCisjIGxvYWRrZXlzIHZlcnNpb24gZm9yIHRoZSBtYXAuIEJ5IGRlZmF1bHQsIHdlJ2xsIHVzZSB0aGUgc2hpcHBlZAorIyB2ZXJzaW9ucy4KKyMgR0VORVJBVEVfS0VZTUFQIDo9IDEKKworaWZkZWYgR0VORVJBVEVfS0VZTUFQCisKKyQob2JqKS9kZWZrZXltYXAuYyAkKG9iaikvcXRyb25peG1hcC5jOiAkKG9iaikvJS5jOiAkKHNyYykvJS5tYXAKKwlsb2Fka2V5cyAtLW1rdGFibGUgJDwgPiAkQC50bXAKKwlzZWQgLWUgJ3MvXnN0YXRpYyAqLy8nICRALnRtcCA+ICRACisJcm0gJEAudG1wCisKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4YzFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZwpAQCAtMCwwICsxLDE3MSBAQAorY29uZmlnIEFHUAorCXRyaXN0YXRlICIvZGV2L2FncGdhcnQgKEFHUCBTdXBwb3J0KSIgaWYgIUdBUlRfSU9NTVUKKwlkZXBlbmRzIG9uIEFMUEhBIHx8IElBNjQgfHwgUFBDIHx8IFg4NgorCWRlZmF1bHQgeSBpZiBHQVJUX0lPTU1VCisJLS0taGVscC0tLQorCSAgQUdQIChBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0KSBpcyBhIGJ1cyBzeXN0ZW0gbWFpbmx5IHVzZWQgdG8KKwkgIGNvbm5lY3QgZ3JhcGhpY3MgY2FyZHMgdG8gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKworCSAgSWYgeW91IGhhdmUgYW4gQUdQIHN5c3RlbSBhbmQgeW91IHNheSBZIGhlcmUsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8KKwkgIHVzZSB0aGUgQUdQIGZlYXR1cmVzIG9mIHlvdXIgM0QgcmVuZGVyaW5nIHZpZGVvIGNhcmQuIFRoaXMgY29kZSBhY3RzCisJICBhcyBhIHNvcnQgb2YgIkFHUCBkcml2ZXIiIGZvciB0aGUgbW90aGVyYm9hcmQncyBjaGlwc2V0LgorCisJICBJZiB5b3UgbmVlZCBtb3JlIHRleHR1cmUgbWVtb3J5IHRoYW4geW91IGNhbiBnZXQgd2l0aCB0aGUgQUdQIEdBUlQKKwkgICh0aGVvcmV0aWNhbGx5IHVwIHRvIDI1NiBNQiwgYnV0IGluIHByYWN0aWNlIHVzdWFsbHkgNjQgb3IgMTI4IE1CCisJICBkdWUgdG8ga2VybmVsIGFsbG9jYXRpb24gaXNzdWVzKSwgeW91IGNvdWxkIHVzZSBQQ0kgYWNjZXNzZXMKKwkgIGFuZCBoYXZlIHVwIHRvIGEgY291cGxlIGdpZ3Mgb2YgdGV4dHVyZSBzcGFjZS4KKworCSAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgbWVhbnMgdG8gaGF2ZSBYRnJlZTQvR0xYIHVzZQorCSAgd3JpdGUtY29tYmluaW5nIHdpdGggTVRSUiBzdXBwb3J0IG9uIHRoZSBBR1AgYnVzLiBXaXRob3V0IGl0LCBPcGVuR0wKKwkgIGRpcmVjdCByZW5kZXJpbmcgd2lsbCBiZSBhIGxvdCBzbG93ZXIgYnV0IHN0aWxsIGZhc3RlciB0aGFuIFBJTy4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWdwZ2FydC4KKworY29uZmlnIEFHUF9BTEkKKwl0cmlzdGF0ZSAiQUxJIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYgJiYgIVg4Nl82NAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKKwkgIFhGcmVlODYgNC54IG9uIHRoZSBmb2xsb3dpbmcgQUxpIGNoaXBzZXRzLiAgVGhlIHN1cHBvcnRlZCBjaGlwc2V0cworCSAgaW5jbHVkZSBNMTU0MSwgTTE2MjEsIE0xNjMxLCBNMTYzMiwgTTE2NDEsTTE2NDcsYW5kIE0xNjUxLgorCSAgRm9yIHRoZSBBTGktY2hpcHNldCBxdWVzdGlvbiwgQUxpIHN1Z2dlc3RzIHlvdSByZWZlciB0bworCSAgPGh0dHA6Ly93d3cuYWxpLmNvbS50dy9lbmcvc3VwcG9ydC9pbmRleC5zaHRtbD4uCisKKwkgIFRoZSBNMTU0MSBjaGlwc2V0IGNhbiBkbyBBR1AgMXggYW5kIDJ4LCBidXQgbm90ZSB0aGF0IHRoZXJlIGlzIGFuCisJICBhY2tub3dsZWRnZWQgaW5jb21wYXRpYmlsaXR5IHdpdGggTWF0cm94IEcyMDAgY2FyZHMuIER1ZSB0bworCSAgdGltaW5nIGlzc3VlcywgdGhpcyBjaGlwc2V0IGNhbm5vdCBkbyBBR1AgMnggd2l0aCB0aGUgRzIwMC4KKwkgIFRoaXMgaXMgYSBoYXJkd2FyZSBsaW1pdGF0aW9uLiBBR1AgMXggc2VlbXMgdG8gYmUgZmluZSwgdGhvdWdoLgorCisJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworCSAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUdQX0FUSQorCXRyaXN0YXRlICJBVEkgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJLS0taGVscC0tLQorICAgICAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgorICAgICAgWEZyZWU4NiA0Lnggb24gdGhlIEFUSSBSYWRlb25JR1AgZmFtaWx5IG9mIGNoaXBzZXRzLgorCisgICAgICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworICAgICAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUdQX0FNRAorCXRyaXN0YXRlICJBTUQgSXJvbmdhdGUsIDc2MSwgYW5kIDc2MiBjaGlwc2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBR1AgJiYgWDg2ICYmICFYODZfNjQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBnaXZlcyB5b3UgQUdQIHN1cHBvcnQgZm9yIHRoZSBHTFggY29tcG9uZW50IG9mCisJICBYRnJlZTg2IDQueCBvbiBBTUQgSXJvbmdhdGUsIDc2MSwgYW5kIDc2MiBjaGlwc2V0cy4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFHUF9BTUQ2NAorCXRyaXN0YXRlICJBTUQgT3B0ZXJvbi9BdGhsb242NCBvbi1DUFUgR0FSVCBzdXBwb3J0IiBpZiAhR0FSVF9JT01NVQorCWRlcGVuZHMgb24gQUdQICYmIFg4NgorCWRlZmF1bHQgeSBpZiBHQVJUX0lPTU1VCisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgorCSAgWEZyZWU4NiA0LnggdXNpbmcgdGhlIG9uLUNQVSBub3J0aGJyaWRnZSBvZiB0aGUgQU1EIEF0aGxvbjY0L09wdGVyb24gQ1BVcy4KKwkgIFlvdSBzdGlsbCBuZWVkIGFuIGV4dGVybmFsIEFHUCBicmlkZ2UgbGlrZSB0aGUgQU1EIDgxNTEsIFZJQQorICAgICAgICAgIEs4VDQwME0sIFNpUzc1NS4gSXQgbWF5IGFsc28gc3VwcG9ydCBvdGhlciBBR1AgYnJpZGdlcyB3aGVuIGxvYWRlZAorCSAgd2l0aCBhZ3BfdHJ5X3Vuc3VwcG9ydGVkPTEuCisJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworCSAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBZCisKK2NvbmZpZyBBR1BfSU5URUwKKwl0cmlzdGF0ZSAiSW50ZWwgNDQwTFgvQlgvR1gsIEk4eHggYW5kIEU3eDA1IGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYKKwloZWxwCisJICBUaGlzIG9wdGlvbiBnaXZlcyB5b3UgQUdQIHN1cHBvcnQgZm9yIHRoZSBHTFggY29tcG9uZW50IG9mIFhGcmVlODYgNC54CisJICBvbiBJbnRlbCA0NDBMWC9CWC9HWCwgODE1LCA4MjAsIDgzMCwgODQwLCA4NDUsIDg1MCwgODYwLCA4NzUsCisJICBFNzIwNSBhbmQgRTc1MDUgY2hpcHNldHMgYW5kIGZ1bGwgc3VwcG9ydCBmb3IgdGhlIDgxMCwgODE1LCA4MzBNLCA4NDVHLAorCSAgODUyR00sIDg1NUdNLCA4NjVHIGFuZCBJOTE1IGludGVncmF0ZWQgZ3JhcGhpY3MgY2hpcHNldHMuCisKKwkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgdXNlIFhGcmVlODYgMy4zLjYgb3IgNC54IGFuZCB3YW50IHRvCisJICB1c2UgR0xYIG9yIERSSSwgb3IgaWYgeW91IGhhdmUgYW55IEludGVsIGludGVncmF0ZWQgZ3JhcGhpY3MKKwkgIGNoaXBzZXRzLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEFHUF9OVklESUEKKwl0cmlzdGF0ZSAiTlZJRElBIG5Gb3JjZS9uRm9yY2UyIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYgJiYgIVg4Nl82NAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKKwkgIFhGcmVlODYgNC54IG9uIHRoZSBmb2xsb3dpbmcgTlZJRElBIGNoaXBzZXRzLiAgVGhlIHN1cHBvcnRlZCBjaGlwc2V0cworCSAgaW5jbHVkZSBuRm9yY2UgYW5kIG5Gb3JjZTIKKworY29uZmlnIEFHUF9TSVMKKwl0cmlzdGF0ZSAiU2lTIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYgJiYgIVg4Nl82NAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKKwkgIFhGcmVlODYgNC54IG9uIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIFtTaVNdIGNoaXBzZXRzLgorCisJICBOb3RlIHRoYXQgNTU5MS81NTkyIEFHUCBjaGlwc2V0cyBhcmUgTk9UIHN1cHBvcnRlZC4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFHUF9TV09SS1MKKwl0cmlzdGF0ZSAiU2VydmVyd29ya3MgTEUvSEUgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBTZXJ2ZXJ3b3JrcyBBR1AgY2FyZC4gIFNlZSAKKwkgIDxodHRwOi8vd3d3LnNlcnZlcndvcmtzLmNvbS8+IGZvciBwcm9kdWN0IGRlc2NyaXB0aW9ucyBhbmQgaW1hZ2VzLgorCitjb25maWcgQUdQX1ZJQQorCXRyaXN0YXRlICJWSUEgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgorCSAgWEZyZWU4NiA0Lnggb24gVklBIE1WUDMvQXBvbGxvIFBybyBjaGlwc2V0cy4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFHUF9JNDYwCisJdHJpc3RhdGUgIkludGVsIDQ2MEdYIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiAoSUE2NF9ESUcgfHwgSUE2NF9HRU5FUklDKQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgSW50ZWwgNDYwR1ggY2hpcHNldAorCSAgZm9yIElBNjQgcHJvY2Vzc29ycy4KKworY29uZmlnIEFHUF9IUF9aWDEKKwl0cmlzdGF0ZSAiSFAgWlgxIGNoaXBzZXQgQUdQIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBR1AgJiYgKElBNjRfSFBfWlgxIHx8IElBNjRfSFBfWlgxX1NXSU9UTEIgfHwgSUE2NF9HRU5FUklDKQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgSFAgWlgxIGNoaXBzZXQKKwkgIGZvciBJQTY0IHByb2Nlc3NvcnMuCisKK2NvbmZpZyBBR1BfQUxQSEFfQ09SRQorCXRyaXN0YXRlICJBbHBoYSBBR1Agc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiAoQUxQSEFfR0VORVJJQyB8fCBBTFBIQV9USVRBTiB8fCBBTFBIQV9NQVJWRUwpCisJZGVmYXVsdCBBR1AKKworY29uZmlnIEFHUF9VTklOT1JUSAorCXRyaXN0YXRlICJBcHBsZSBVbmlOb3J0aCAmIFUzIEFHUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFBQQ19QTUFDCisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciBBcHBsZSBtYWNoaW5lcyB3aXRoIGEKKwkgIFVuaU5vcnRoIG9yIFUzIChBcHBsZSBHNSkgYnJpZGdlLgorCitjb25maWcgQUdQX0VGRklDRU9OCisJdHJpc3RhdGUgIlRyYW5zbWV0YSBFZmZpY2VvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgVHJhbnNtZXRhIEVmZmljZW9uCisJICBzZXJpZXMgcHJvY2Vzc29ycyB3aXRoIGludGVncmF0ZWQgbm9ydGhicmlkZ2VzLgorCisJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworCSAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgQUdQX1NHSV9USU9DQQorICAgICAgICB0cmlzdGF0ZSAiU0dJIFRJTyBjaGlwc2V0IEFHUCBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIEFHUCAmJiAoSUE2NF9TR0lfU04yIHx8IElBNjRfR0VORVJJQykKKyAgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgU0dJIFRJTyBjaGlwc2V0CisgICAgICAgICAgZm9yIElBNjQgcHJvY2Vzc29ycy4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzYTIyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorYWdwZ2FydC15IDo9IGJhY2tlbmQubyBmcm9udGVuZC5vIGdlbmVyaWMubyBpc29jaC5vCisKK29iai0kKENPTkZJR19BR1ApCQkrPSBhZ3BnYXJ0Lm8KK29iai0kKENPTkZJR19BR1BfQUxJKQkJKz0gYWxpLWFncC5vCitvYmotJChDT05GSUdfQUdQX0FUSSkJCSs9IGF0aS1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9BTUQpCQkrPSBhbWQtazctYWdwLm8KK29iai0kKENPTkZJR19BR1BfQU1ENjQpCQkrPSBhbWQ2NC1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9BTFBIQV9DT1JFKQkrPSBhbHBoYS1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9FRkZJQ0VPTikJKz0gZWZmaWNlb24tYWdwLm8KK29iai0kKENPTkZJR19BR1BfSFBfWlgxKQkrPSBocC1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9JNDYwKQkJKz0gaTQ2MC1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9JTlRFTCkJCSs9IGludGVsLWFncC5vCitvYmotJChDT05GSUdfQUdQX05WSURJQSkJKz0gbnZpZGlhLWFncC5vCitvYmotJChDT05GSUdfQUdQX1NHSV9USU9DQSkJKz0gc2dpLWFncC5vCitvYmotJChDT05GSUdfQUdQX1NJUykJCSs9IHNpcy1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9TV09SS1MpCSs9IHN3b3Jrcy1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9VTklOT1JUSCkJKz0gdW5pbm9ydGgtYWdwLm8KK29iai0kKENPTkZJR19BR1BfVklBKQkJKz0gdmlhLWFncC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDljMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaApAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIEFHUEdBUlQKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBEYXZlIEpvbmVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmVmZiBIYXJ0bWFubgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIAorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0FHUF9CQUNLRU5EX1BSSVZfSAorI2RlZmluZSBfQUdQX0JBQ0tFTkRfUFJJVl9IIDEKKworI2luY2x1ZGUgPGFzbS9hZ3AuaD4JLyogZm9yIGZsdXNoX2FncF9jYWNoZSgpICovCisKKyNkZWZpbmUgUEZYICJhZ3BnYXJ0OiAiCisKKy8vI2RlZmluZSBBR1BfREVCVUcgMQorI2lmZGVmIEFHUF9ERUJVRworI2RlZmluZSBEQkcoeCx5Li4uKSBwcmludGsgKEtFUk5fREVCVUcgUEZYICIlczogIiB4ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjIHkpCisjZWxzZQorI2RlZmluZSBEQkcoeCx5Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9icmlkZ2U7CisKK2VudW0gYXBlcl9zaXplX3R5cGUgeworCVU4X0FQRVJfU0laRSwKKwlVMTZfQVBFUl9TSVpFLAorCVUzMl9BUEVSX1NJWkUsCisJTFZMMl9BUEVSX1NJWkUsCisJRklYRURfQVBFUl9TSVpFCit9OworCitzdHJ1Y3QgZ2F0dF9tYXNrIHsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdTMyIHR5cGU7CisJLyogdG90YWxseSBkZXZpY2Ugc3BlY2lmaWMsIGZvciBpbnRlZ3JhdGVkIGNoaXBzZXRzIHRoYXQgCisJICogbWlnaHQgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWVtb3J5IG1hc2tzLiAgRm9yIG90aGVyCisJICogZGV2aWNlcyB0aGlzIHdpbGwgcHJvYmFibHkgYmUgaWdub3JlZCAqLworfTsKKworc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggeworCWludCBzaXplOworCWludCBudW1fZW50cmllczsKKwlpbnQgcGFnZV9vcmRlcjsKKwl1OCBzaXplX3ZhbHVlOworfTsKKworc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2IHsKKwlpbnQgc2l6ZTsKKwlpbnQgbnVtX2VudHJpZXM7CisJaW50IHBhZ2Vfb3JkZXI7CisJdTE2IHNpemVfdmFsdWU7Cit9OworCitzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgeworCWludCBzaXplOworCWludCBudW1fZW50cmllczsKKwlpbnQgcGFnZV9vcmRlcjsKKwl1MzIgc2l6ZV92YWx1ZTsKK307CisKK3N0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyIHsKKwlpbnQgc2l6ZTsKKwlpbnQgbnVtX2VudHJpZXM7CisJdTMyIHNpemVfdmFsdWU7Cit9OworCitzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgeworCWludCBzaXplOworCWludCBudW1fZW50cmllczsKKwlpbnQgcGFnZV9vcmRlcjsKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJdm9pZCAqYXBlcnR1cmVfc2l6ZXM7CisJaW50IG51bV9hcGVydHVyZV9zaXplczsKKwllbnVtIGFwZXJfc2l6ZV90eXBlIHNpemVfdHlwZTsKKwlpbnQgY2FudF91c2VfYXBlcnR1cmU7CisJaW50IG5lZWRzX3NjcmF0Y2hfcGFnZTsKKwlzdHJ1Y3QgZ2F0dF9tYXNrICptYXNrczsKKwlpbnQgKCpmZXRjaF9zaXplKSh2b2lkKTsKKwlpbnQgKCpjb25maWd1cmUpKHZvaWQpOworCXZvaWQgKCphZ3BfZW5hYmxlKShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICosIHUzMik7CisJdm9pZCAoKmNsZWFudXApKHZvaWQpOworCXZvaWQgKCp0bGJfZmx1c2gpKHN0cnVjdCBhZ3BfbWVtb3J5ICopOworCXVuc2lnbmVkIGxvbmcgKCptYXNrX21lbW9yeSkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqLAorCQl1bnNpZ25lZCBsb25nLCBpbnQpOworCXZvaWQgKCpjYWNoZV9mbHVzaCkodm9pZCk7CisJaW50ICgqY3JlYXRlX2dhdHRfdGFibGUpKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKik7CisJaW50ICgqZnJlZV9nYXR0X3RhYmxlKShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopOworCWludCAoKmluc2VydF9tZW1vcnkpKHN0cnVjdCBhZ3BfbWVtb3J5ICosIG9mZl90LCBpbnQpOworCWludCAoKnJlbW92ZV9tZW1vcnkpKHN0cnVjdCBhZ3BfbWVtb3J5ICosIG9mZl90LCBpbnQpOworCXN0cnVjdCBhZ3BfbWVtb3J5ICooKmFsbG9jX2J5X3R5cGUpIChzaXplX3QsIGludCk7CisJdm9pZCAoKmZyZWVfYnlfdHlwZSkoc3RydWN0IGFncF9tZW1vcnkgKik7CisJdm9pZCAqKCphZ3BfYWxsb2NfcGFnZSkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKTsKKwl2b2lkICgqYWdwX2Rlc3Ryb3lfcGFnZSkodm9pZCAqKTsKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgeworCXN0cnVjdCBhZ3BfdmVyc2lvbiAqdmVyc2lvbjsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKKwl2b2lkICpwcmV2aW91c19zaXplOworCXZvaWQgKmN1cnJlbnRfc2l6ZTsKKwl2b2lkICpkZXZfcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTMyIF9faW9tZW0gKmdhdHRfdGFibGU7CisJdTMyICpnYXR0X3RhYmxlX3JlYWw7CisJdW5zaWduZWQgbG9uZyBzY3JhdGNoX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBzY3JhdGNoX3BhZ2VfcmVhbDsKKwl1bnNpZ25lZCBsb25nIGdhcnRfYnVzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBnYXR0X2J1c19hZGRyOworCXUzMiBtb2RlOworCWVudW0gY2hpcHNldF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyAqa2V5X2xpc3Q7CisJYXRvbWljX3QgY3VycmVudF9tZW1vcnlfYWdwOworCWF0b21pY190IGFncF9pbl91c2U7CisJaW50IG1heF9tZW1vcnlfYWdwOwkvKiBpbiBudW1iZXIgb2YgcGFnZXMgKi8KKwlpbnQgYXBlcnR1cmVfc2l6ZV9pZHg7CisJaW50IGNhcG5keDsKKwlpbnQgZmxhZ3M7CisJY2hhciBtYWpvcl92ZXJzaW9uOworCWNoYXIgbWlub3JfdmVyc2lvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIEtCKHgpCSgoeCkgKiAxMDI0KQorI2RlZmluZSBNQih4KQkoS0IgKEtCICh4KSkpCisjZGVmaW5lIEdCKHgpCShNQiAoS0IgKHgpKSkKKworI2RlZmluZSBBX1NJWkVfOCh4KQkoKHN0cnVjdCBhcGVyX3NpemVfaW5mb184ICopIHgpCisjZGVmaW5lIEFfU0laRV8xNih4KQkoKHN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqKSB4KQorI2RlZmluZSBBX1NJWkVfMzIoeCkJKChzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKikgeCkKKyNkZWZpbmUgQV9TSVpFX0xWTDIoeCkJKChzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqKSB4KQorI2RlZmluZSBBX1NJWkVfRklYKHgpCSgoc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICopIHgpCisjZGVmaW5lIEFfSURYOChicmlkZ2UpCShBX1NJWkVfOCgoYnJpZGdlKS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcykgKyBpKQorI2RlZmluZSBBX0lEWDE2KGJyaWRnZSkJKEFfU0laRV8xNigoYnJpZGdlKS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcykgKyBpKQorI2RlZmluZSBBX0lEWDMyKGJyaWRnZSkJKEFfU0laRV8zMigoYnJpZGdlKS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcykgKyBpKQorI2RlZmluZSBNQVhLRVkJCSg0MDk2ICogMzIpCisKKyNkZWZpbmUgUEdFX0VNUFRZKGIsIHApCSghKHApIHx8IChwKSA9PSAodW5zaWduZWQgbG9uZykgKGIpLT5zY3JhdGNoX3BhZ2UpCisKKworLyogSW50ZWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIElOVEVMX0FQU0laRQkweGI0CisjZGVmaW5lIElOVEVMX0FUVEJBU0UJMHhiOAorI2RlZmluZSBJTlRFTF9BR1BDVFJMCTB4YjAKKyNkZWZpbmUgSU5URUxfTkJYQ0ZHCTB4NTAKKyNkZWZpbmUgSU5URUxfRVJSU1RTCTB4OTEKKworLyogSW50ZWwgaTgzMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTgzMF9HTUNIX0NUUkwJCQkweDUyCisjZGVmaW5lIEk4MzBfR01DSF9FTkFCTEVECQkweDQKKyNkZWZpbmUgSTgzMF9HTUNIX01FTV9NQVNLCQkweDEKKyNkZWZpbmUgSTgzMF9HTUNIX01FTV82NE0JCTB4MQorI2RlZmluZSBJODMwX0dNQ0hfTUVNXzEyOE0JCTAKKyNkZWZpbmUgSTgzMF9HTUNIX0dNU19NQVNLCQkweDcwCisjZGVmaW5lIEk4MzBfR01DSF9HTVNfRElTQUJMRUQJCTB4MDAKKyNkZWZpbmUgSTgzMF9HTUNIX0dNU19MT0NBTAkJMHgxMAorI2RlZmluZSBJODMwX0dNQ0hfR01TX1NUT0xFTl81MTIJMHgyMAorI2RlZmluZSBJODMwX0dNQ0hfR01TX1NUT0xFTl8xMDI0CTB4MzAKKyNkZWZpbmUgSTgzMF9HTUNIX0dNU19TVE9MRU5fODE5MgkweDQwCisjZGVmaW5lIEk4MzBfUkRSQU1fQ0hBTk5FTF9UWVBFCQkweDAzMDEwCisjZGVmaW5lIEk4MzBfUkRSQU1fTkQoeCkJCSgoKHgpICYgMHgyMCkgPj4gNSkKKyNkZWZpbmUgSTgzMF9SRFJBTV9ERFQoeCkJCSgoKHgpICYgMHgxOCkgPj4gMykKKworLyogVGhpcyBvbmUgaXMgZm9yIEk4MzBNUCB3LiBhbiBleHRlcm5hbCBncmFwaGljIGNhcmQgKi8KKyNkZWZpbmUgSU5URUxfSTgzMF9FUlJTVFMJMHg5MgorCisvKiBJbnRlbCA4NTVHTS84NTJHTSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTg1NV9HTUNIX0dNU19TVE9MRU5fME0JCTB4MAorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8xTQkJKDB4MSA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl80TQkJKDB4MiA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl84TQkJKDB4MyA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8xNk0JKDB4NCA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8zMk0JKDB4NSA8PCA0KQorI2RlZmluZSBJODVYX0NBUElECQkJMHg0NAorI2RlZmluZSBJODVYX1ZBUklBTlRfTUFTSwkJMHg3CisjZGVmaW5lIEk4NVhfVkFSSUFOVF9TSElGVAkJNQorI2RlZmluZSBJODU1X0dNRQkJCTB4MAorI2RlZmluZSBJODU1X0dNCQkJCTB4NAorI2RlZmluZSBJODUyX0dNRQkJCTB4MgorI2RlZmluZSBJODUyX0dNCQkJCTB4NQorCisvKiBJbnRlbCBpODQ1IHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRFTF9JODQ1X0FHUE0JCTB4NTEKKyNkZWZpbmUgSU5URUxfSTg0NV9FUlJTVFMJMHhjOAorCisvKiBJbnRlbCBpODYwIHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRFTF9JODYwX01DSENGRwkweDUwCisjZGVmaW5lIElOVEVMX0k4NjBfRVJSU1RTCTB4YzgKKworLyogSW50ZWwgaTgxMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTgxMF9HTUFERFIJCTB4MTAKKyNkZWZpbmUgSTgxMF9NTUFERFIJCTB4MTQKKyNkZWZpbmUgSTgxMF9QVEVfQkFTRQkJMHgxMDAwMAorI2RlZmluZSBJODEwX1BURV9NQUlOX1VOQ0FDSEVECTB4MDAwMDAwMDAKKyNkZWZpbmUgSTgxMF9QVEVfTE9DQUwJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSTgxMF9QVEVfVkFMSUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTgxMF9TTVJBTV9NSVNDQwkweDcwCisjZGVmaW5lIEk4MTBfR0ZYX01FTV9XSU5fU0laRQkweDAwMDEwMDAwCisjZGVmaW5lIEk4MTBfR0ZYX01FTV9XSU5fMzJNCTB4MDAwMTAwMDAKKyNkZWZpbmUgSTgxMF9HTVMJCTB4MDAwMDAwYzAKKyNkZWZpbmUgSTgxMF9HTVNfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIEk4MTBfUEdFVEJMX0NUTAkJMHgyMDIwCisjZGVmaW5lIEk4MTBfUEdFVEJMX0VOQUJMRUQJMHgwMDAwMDAwMQorI2RlZmluZSBJODEwX0RSQU1fQ1RMCQkweDMwMDAKKyNkZWZpbmUgSTgxMF9EUkFNX1JPV18wCQkweDAwMDAwMDAxCisjZGVmaW5lIEk4MTBfRFJBTV9ST1dfMF9TRFJBTQkweDAwMDAwMDAxCisKK3N0cnVjdCBhZ3BfZGV2aWNlX2lkcyB7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOyAvKiBmaXJzdCwgdG8gbWFrZSB0YWJsZSBlYXNpZXIgdG8gcmVhZCAqLworCWVudW0gY2hpcHNldF90eXBlIGNoaXBzZXQ7CisJY29uc3QgY2hhciAqY2hpcHNldF9uYW1lOworCWludCAoKmNoaXBzZXRfc2V0dXApIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CS8qIHVzZWQgdG8gb3ZlcnJpZGUgZ2VuZXJpYyAqLworfTsKKworLyogRHJpdmVyIHJlZ2lzdHJhdGlvbiAqLworc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWdwX2FsbG9jX2JyaWRnZSh2b2lkKTsKK3ZvaWQgYWdwX3B1dF9icmlkZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKTsKK2ludCBhZ3BfYWRkX2JyaWRnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOwordm9pZCBhZ3BfcmVtb3ZlX2JyaWRnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOworCisvKiBGcm9udGVuZCByb3V0aW5lcy4gKi8KK2ludCBhZ3BfZnJvbnRlbmRfaW5pdGlhbGl6ZSh2b2lkKTsKK3ZvaWQgYWdwX2Zyb250ZW5kX2NsZWFudXAodm9pZCk7CisKKy8qIEdlbmVyaWMgcm91dGluZXMuICovCit2b2lkIGFncF9nZW5lcmljX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKTsKK2ludCBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOworaW50IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9jcmVhdGVfbWVtb3J5KGludCBzY3JhdGNoX3BhZ2VzKTsKK2ludCBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSk7CitpbnQgYWdwX2dlbmVyaWNfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKTsKK3ZvaWQgYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlKHN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyKTsKK3ZvaWQgKmFncF9nZW5lcmljX2FsbG9jX3BhZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKTsKK3ZvaWQgYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlKHZvaWQgKmFkZHIpOwordm9pZCBhZ3BfZnJlZV9rZXkoaW50IGtleSk7CitpbnQgYWdwX251bV9lbnRyaWVzKHZvaWQpOwordTMyIGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSwgdTMyIGNvbW1hbmQpOwordm9pZCBhZ3BfZGV2aWNlX2NvbW1hbmQodTMyIGNvbW1hbmQsIGludCBhZ3BfdjMpOworaW50IGFncF8zXzVfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSk7Cit2b2lkIGdsb2JhbF9jYWNoZV9mbHVzaCh2b2lkKTsKK3ZvaWQgZ2V0X2FncF92ZXJzaW9uKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSk7Cit1bnNpZ25lZCBsb25nIGFncF9nZW5lcmljX21hc2tfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0eXBlKTsKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9nZW5lcmljX2ZpbmRfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworLyogZ2VuZXJpYyByb3V0aW5lcyBmb3IgYWdwPj0zICovCitpbnQgYWdwM19nZW5lcmljX2ZldGNoX3NpemUodm9pZCk7Cit2b2lkIGFncDNfZ2VuZXJpY190bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKTsKK2ludCBhZ3AzX2dlbmVyaWNfY29uZmlndXJlKHZvaWQpOwordm9pZCBhZ3AzX2dlbmVyaWNfY2xlYW51cCh2b2lkKTsKKworLyogYXBlcnR1cmUgc2l6ZXMgaGF2ZSBiZWVuIHN0YW5kYXJkaXNlZCBzaW5jZSB2MyAqLworI2RlZmluZSBBR1BfR0VORVJJQ19TSVpFU19FTlRSSUVTIDExCitleHRlcm4gc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2IGFncDNfZ2VuZXJpY19zaXplc1tdOworCisKK2V4dGVybiBpbnQgYWdwX29mZjsKK2V4dGVybiBpbnQgYWdwX3RyeV91bnN1cHBvcnRlZF9ib290OworCisvKiBDaGlwc2V0IGluZGVwZW5kYW50IHJlZ2lzdGVycyAoZnJvbSBBR1AgU3BlYykgKi8KKyNkZWZpbmUgQUdQX0FQQkFTRQkweDEwCisKKyNkZWZpbmUgQUdQU1RBVAkJMHg0CisjZGVmaW5lIEFHUENNRAkJMHg4CisjZGVmaW5lIEFHUE5JU1RBVAkweGMKKyNkZWZpbmUgQUdQQ1RSTAkJMHgxMAorI2RlZmluZSBBR1BBUFNJWkUJMHgxNAorI2RlZmluZSBBR1BORVBHCQkweDE2CisjZGVmaW5lIEFHUEdBUlRMTwkweDE4CisjZGVmaW5lIEFHUEdBUlRISQkweDFjCisjZGVmaW5lIEFHUE5JQ01ECTB4MjAKKworI2RlZmluZSBBR1BfTUFKT1JfVkVSU0lPTl9TSElGVAkoMjApCisjZGVmaW5lIEFHUF9NSU5PUl9WRVJTSU9OX1NISUZUCSgxNikKKworI2RlZmluZSBBR1BTVEFUX1JRX0RFUFRICSgweGZmMDAwMDAwKQorI2RlZmluZSBBR1BTVEFUX1JRX0RFUFRIX1NISUZUCTI0CisKKyNkZWZpbmUgQUdQU1RBVF9DQUxfTUFTSwkoMTw8MTJ8MTw8MTF8MTw8MTApCisjZGVmaW5lIEFHUFNUQVRfQVJRU1oJCSgxPDwxNXwxPDwxNHwxPDwxMykKKyNkZWZpbmUgQUdQU1RBVF9BUlFTWl9TSElGVAkxMworCisjZGVmaW5lIEFHUFNUQVRfU0JBCQkoMTw8OSkKKyNkZWZpbmUgQUdQU1RBVF9BR1BfRU5BQkxFCSgxPDw4KQorI2RlZmluZSBBR1BTVEFUX0ZXCQkoMTw8NCkKKyNkZWZpbmUgQUdQU1RBVF9NT0RFXzNfMAkoMTw8MykKKworI2RlZmluZSBBR1BTVEFUMl8xWAkJKDE8PDApCisjZGVmaW5lIEFHUFNUQVQyXzJYCQkoMTw8MSkKKyNkZWZpbmUgQUdQU1RBVDJfNFgJCSgxPDwyKQorCisjZGVmaW5lIEFHUFNUQVQzX1JTVkQJCSgxPDwyKQorI2RlZmluZSBBR1BTVEFUM184WAkJKDE8PDEpCisjZGVmaW5lIEFHUFNUQVQzXzRYCQkoMSkKKworI2RlZmluZSBBR1BDVFJMX0FQRVJFTkIJCSgxPDw4KQorI2RlZmluZSBBR1BDVFJMX0dUTEJFTgkJKDE8PDcpCisKKyNkZWZpbmUgQUdQMl9SRVNFUlZFRF9NQVNLIDB4MDBmZmZjYzgKKyNkZWZpbmUgQUdQM19SRVNFUlZFRF9NQVNLIDB4MDBmZjAwYzQKKworI2RlZmluZSBBR1BfRVJSQVRBX0ZBU1RXUklURVMgMTw8MAorI2RlZmluZSBBR1BfRVJSQVRBX1NCQQkgMTw8MQorI2RlZmluZSBBR1BfRVJSQVRBXzFYIDE8PDIKKworI2VuZGlmCS8qIF9BR1BfQkFDS0VORF9QUklWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbGktYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogQUxpIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKyNkZWZpbmUgQUxJX0FHUENUUkwJMHhiOAorI2RlZmluZSBBTElfQVRUQkFTRQkweGJjCisjZGVmaW5lIEFMSV9UTEJDVFJMCTB4YzAKKyNkZWZpbmUgQUxJX1RBR0NUUkwJMHhjNAorI2RlZmluZSBBTElfQ0FDSEVfRkxVU0hfQ1RSTAkweEQwCisjZGVmaW5lIEFMSV9DQUNIRV9GTFVTSF9BRERSX01BU0sJMHhGRkZGRjAwMAorI2RlZmluZSBBTElfQ0FDSEVfRkxVU0hfRU4JMHgxMDAKKworc3RhdGljIGludCBhbGlfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0FUVEJBU0UsICZ0ZW1wKTsKKwl0ZW1wICY9IH4oMHhmZmZmZmZmMCk7CisJdmFsdWVzID0gQV9TSVpFXzMyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbGlfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKm1lbSkKK3sKKwl1MzIgdGVtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UTEJDVFJMLCAmdGVtcCk7CisJdGVtcCAmPSAweGZmZmZmZmYwOworCXRlbXAgfD0gKDE8PDAgfCAxPDwxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX1RBR0NUUkwsIHRlbXApOworfQorCitzdGF0aWMgdm9pZCBhbGlfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqcHJldmlvdXNfc2l6ZTsKKwl1MzIgdGVtcDsKKworCXByZXZpb3VzX3NpemUgPSBBX1NJWkVfMzIoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfVExCQ1RSTCwgJnRlbXApOworLy8gY2xlYXIgdGFnCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UQUdDVFJMLAorCQkJKCh0ZW1wICYgMHhmZmZmZmYwMCkgfCAweDAwMDAwMDAxfDB4MDAwMDAwMDIpKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsICBBTElfQVRUQkFTRSwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQVRUQkFTRSwKKwkJCSgodGVtcCAmIDB4MDAwMDBmZjApIHwgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSkpOworfQorCitzdGF0aWMgaW50IGFsaV9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKmN1cnJlbnRfc2l6ZTsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV8zMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSBhbmQgZ2F0dCBhZGRyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0FUVEJBU0UsICZ0ZW1wKTsKKwl0ZW1wID0gKCgodGVtcCAmIDB4MDAwMDBmZjApIHwgKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgJiAweGZmZmZmMDAwKSkKKwkJCXwgKGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSAmIDB4ZikpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQVRUQkFTRSwgdGVtcCk7CisKKwkvKiB0bGIgY29udHJvbCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UTEJDVFJMLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UTEJDVFJMLCAoKHRlbXAgJiAweGZmZmZmZjAwKSB8IDB4MDAwMDAwMTApKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisjaWYgMAorCWlmIChhZ3BfYnJpZGdlLT50eXBlID09IEFMSV9NMTU0MSkgeworCQl1MzIgbmx2bV9hZGRyID0gMDsKKworCQlzd2l0Y2ggKGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkgeworCQkJY2FzZSAwOiAgYnJlYWs7CisJCQljYXNlIDE6ICBubHZtX2FkZHIgPSAweDEwMDAwMDticmVhazsKKwkJCWNhc2UgMjogIG5sdm1fYWRkciA9IDB4MjAwMDAwO2JyZWFrOworCQkJY2FzZSAzOiAgbmx2bV9hZGRyID0gMHg0MDAwMDA7YnJlYWs7CisJCQljYXNlIDQ6ICBubHZtX2FkZHIgPSAweDgwMDAwMDticmVhazsKKwkJCWNhc2UgNjogIG5sdm1fYWRkciA9IDB4MTAwMDAwMDticmVhazsKKwkJCWNhc2UgNzogIG5sdm1fYWRkciA9IDB4MjAwMDAwMDticmVhazsKKwkJCWNhc2UgODogIG5sdm1fYWRkciA9IDB4NDAwMDAwMDticmVhazsKKwkJCWNhc2UgOTogIG5sdm1fYWRkciA9IDB4ODAwMDAwMDticmVhazsKKwkJCWNhc2UgMTA6IG5sdm1fYWRkciA9IDB4MTAwMDAwMDA7YnJlYWs7CisJCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCQlubHZtX2FkZHItLTsKKwkJbmx2bV9hZGRyJj0weGZmZjAwMDAwOworCisJCW5sdm1fYWRkcis9IGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCW5sdm1fYWRkcnw9KGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI+PjEyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5sdm0gdG9wICZiYXNlID0gJTh4XG4iLG5sdm1fYWRkcik7CisJfQorI2VuZGlmCisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfVExCQ1RSTCwgJnRlbXApOworCXRlbXAgJj0gMHhmZmZmZmY3ZjsJCS8vZW5hYmxlIFRMQgorCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfVExCQ1RSTCwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBtMTU0MV9jYWNoZV9mbHVzaCh2b2lkKQoreworCWludCBpLCBwYWdlX2NvdW50OworCXUzMiB0ZW1wOworCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlwYWdlX2NvdW50ID0gMSA8PCBBX1NJWkVfMzIoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKS0+cGFnZV9vcmRlcjsKKwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFICogcGFnZV9jb3VudDsgaSArPSBQQUdFX1NJWkUpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0NBQ0hFX0ZMVVNIX0NUUkwsCisJCQkJJnRlbXApOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0NBQ0hFX0ZMVVNIX0NUUkwsCisJCQkJKCgodGVtcCAmIEFMSV9DQUNIRV9GTFVTSF9BRERSX01BU0spIHwKKwkJCQkgIChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICsgaSkpIHwKKwkJCQkgQUxJX0NBQ0hFX0ZMVVNIX0VOKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCAqbTE1NDFfYWxsb2NfcGFnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdm9pZCAqYWRkciA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UoYWdwX2JyaWRnZSk7CisJdTMyIHRlbXA7CisKKwlpZiAoIWFkZHIpCisJCXJldHVybiBOVUxMOworCQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9DQUNIRV9GTFVTSF9DVFJMLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9DQUNIRV9GTFVTSF9DVFJMLAorCQkJKCgodGVtcCAmIEFMSV9DQUNIRV9GTFVTSF9BRERSX01BU0spIHwKKwkJCSAgdmlydF90b19waHlzKGFkZHIpKSB8IEFMSV9DQUNIRV9GTFVTSF9FTiApKTsKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIHZvaWQgYWxpX2Rlc3Ryb3lfcGFnZSh2b2lkICogYWRkcikKK3sKKwlpZiAoYWRkcikgeworCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsJLyogaXMgdGhpcyByZWFsbHkgbmVlZGVkPyAgLS1oY2ggKi8KKwkJYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlKGFkZHIpOworCX0KK30KKworc3RhdGljIHZvaWQgbTE1NDFfZGVzdHJveV9wYWdlKHZvaWQgKiBhZGRyKQoreworCXUzMiB0ZW1wOworCisJaWYgKGFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQ0FDSEVfRkxVU0hfQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQ0FDSEVfRkxVU0hfQ1RSTCwKKwkJCSgoKHRlbXAgJiBBTElfQ0FDSEVfRkxVU0hfQUREUl9NQVNLKSB8CisJCQkgIHZpcnRfdG9fcGh5cyhhZGRyKSkgfCBBTElfQ0FDSEVfRkxVU0hfRU4pKTsKKwlhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UoYWRkcik7Cit9CisKKworLyogU2V0dXAgZnVuY3Rpb24gKi8KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiBhbGlfZ2VuZXJpY19zaXplc1s3XSA9Cit7CisJezI1NiwgNjU1MzYsIDYsIDEwfSwKKwl7MTI4LCAzMjc2OCwgNSwgOX0sCisJezY0LCAxNjM4NCwgNCwgOH0sCisJezMyLCA4MTkyLCAzLCA3fSwKKwl7MTYsIDQwOTYsIDIsIDZ9LAorCXs4LCAyMDQ4LCAxLCA0fSwKKwl7NCwgMTAyNCwgMCwgM30KK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBhbGlfZ2VuZXJpY19icmlkZ2UgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gYWxpX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVMzJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA3LAorCS5jb25maWd1cmUJCT0gYWxpX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBhbGlfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBhbGlfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGFsaV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhbGlfZGVzdHJveV9wYWdlLAorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGFsaV9tMTU0MV9icmlkZ2UgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gYWxpX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVMzJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA3LAorCS5jb25maWd1cmUJCT0gYWxpX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBhbGlfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBhbGlfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGFsaV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gbTE1NDFfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gbTE1NDFfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IG0xNTQxX2Rlc3Ryb3lfcGFnZSwKK307CisKKworc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyBhbGlfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNTQxLAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNTQxIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2MjEsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2MjEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTF9NMTYzMSwKKwkJLmNoaXBzZXRfbmFtZQk9ICJNMTYzMSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjMyLAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNjMyIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2NDEsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2NDEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTF9NMTY0NCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJNMTY0NCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjQ3LAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNjQ3IiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2NTEsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2NTEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTF9NMTY3MSwKKwkJLmNoaXBzZXRfbmFtZQk9ICJNMTY3MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjgxLAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNjgxIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2ODMsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2ODMiLAorCX0sCisKKwl7IH0sIC8qIGR1bW15IGZpbmFsIGVudHJ5LCBhbHdheXMgcHJlc2VudCAqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX2FsaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfZGV2aWNlX2lkcyAqZGV2cyA9IGFsaV9hZ3BfZGV2aWNlX2lkczsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJdTggaGlkZGVuXzE2MjFfaWQsIGNhcF9wdHI7CisJaW50IGo7CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHByb2JlIGZvciBrbm93biBjaGlwc2V0cyAqLworCWZvciAoaiA9IDA7IGRldnNbal0uY2hpcHNldF9uYW1lOyBqKyspIHsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBkZXZzW2pdLmRldmljZV9pZCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgQUxpIGNoaXBzZXQgKGRldmljZSBpZDogJTA0eClcbiIsCisJICAgICBwZGV2LT5kZXZpY2UpOworCXJldHVybiAtRU5PREVWOworCisKK2ZvdW5kOgorCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxfTTE1NDE6CisJCWJyaWRnZS0+ZHJpdmVyID0gJmFsaV9tMTU0MV9icmlkZ2U7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9BTF9NMTYyMToKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHhGQiwgJmhpZGRlbl8xNjIxX2lkKTsKKwkJc3dpdGNoIChoaWRkZW5fMTYyMV9pZCkgeworCQljYXNlIDB4MzE6CisJCQlkZXZzW2pdLmNoaXBzZXRfbmFtZSA9ICJNMTYzMSI7CisJCQlicmVhazsKKwkJY2FzZSAweDMyOgorCQkJZGV2c1tqXS5jaGlwc2V0X25hbWUgPSAiTTE2MzIiOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MToKKwkJCWRldnNbal0uY2hpcHNldF9uYW1lID0gIk0xNjQxIjsKKwkJCWJyZWFrOworCQljYXNlIDB4NDM6CisJCQlkZXZzW2pdLmNoaXBzZXRfbmFtZSA9ICJNPz8/PyI7CisJCQlicmVhazsKKwkJY2FzZSAweDQ3OgorCQkJZGV2c1tqXS5jaGlwc2V0X25hbWUgPSAiTTE2NDciOworCQkJYnJlYWs7CisJCWNhc2UgMHg1MToKKwkJCWRldnNbal0uY2hpcHNldF9uYW1lID0gIk0xNjUxIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJLypGQUxMVEhST1VHSCovCisJZGVmYXVsdDoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmYWxpX2dlbmVyaWNfYnJpZGdlOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBTGkgJXMgY2hpcHNldFxuIiwKKwkJCWRldnNbal0uY2hpcHNldF9uYW1lKTsKKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCWJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLAorCQkJJmJyaWRnZS0+bW9kZSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJpZGdlKTsKKwlyZXR1cm4gYWdwX2FkZF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFncF9hbGlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFncF9yZW1vdmVfYnJpZGdlKGJyaWRnZSk7CisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9hbGlfcGNpX3RhYmxlW10gPSB7CisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FMLAorCS5kZXZpY2UJCT0gUENJX0FOWV9JRCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF9hbGlfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hbGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWdwZ2FydC1hbGkiLAorCS5pZF90YWJsZQk9IGFncF9hbGlfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYWxpX3Byb2JlLAorCS5yZW1vdmUJCT0gYWdwX2FsaV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfYWxpX2luaXQodm9pZCkKK3sKKwlpZiAoYWdwX29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbGlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfYWxpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbGlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFncF9hbGlfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfYWxpX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzJkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCkBAIC0wLDAgKzEsMjE2IEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmgiCisKKyNpbmNsdWRlICJhZ3AuaCIKKworc3RhdGljIHN0cnVjdCBwYWdlICphbHBoYV9jb3JlX2FncF92bV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCQkgICAgIGludCAqdHlwZSkKK3sKKwlhbHBoYV9hZ3BfaW5mbyAqYWdwID0gYWdwX2JyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXVuc2lnbmVkIGxvbmcgcGE7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlkbWFfYWRkciA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0ICsgYWdwLT5hcGVydHVyZS5idXNfYmFzZTsKKwlwYSA9IGFncC0+b3BzLT50cmFuc2xhdGUoYWdwLCBkbWFfYWRkcik7CisKKwlpZiAocGEgPT0gKHVuc2lnbmVkIGxvbmcpLUVJTlZBTCkgcmV0dXJuIE5VTEw7CS8qIG5vIHRyYW5zbGF0aW9uICovCisJCisJLyoKKwkgKiBHZXQgdGhlIHBhZ2UsIGluYyB0aGUgdXNlIGNvdW50LCBhbmQgcmV0dXJuIGl0CisJICovCisJcGFnZSA9IHZpcnRfdG9fcGFnZShfX3ZhKHBhKSk7CisJZ2V0X3BhZ2UocGFnZSk7CisJaWYgKHR5cGUpCisJCSp0eXBlID0gVk1fRkFVTFRfTUlOT1I7CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgYWxwaGFfY29yZV9hZ3Bfc2l6ZXNbXSA9Cit7CisJeyAwLCAwLCAwIH0sIC8qIGZpbGxlZCBpbiBieSBhbHBoYV9jb3JlX2FncF9zZXR1cCAqLworfTsKKworc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGFscGhhX2NvcmVfYWdwX3ZtX29wcyA9IHsKKwkubm9wYWdlID0gYWxwaGFfY29yZV9hZ3Bfdm1fbm9wYWdlLAorfTsKKworCitzdGF0aWMgaW50IGFscGhhX2NvcmVfYWdwX25vcCh2b2lkKQoreworCS8qIGp1c3QgcmV0dXJuIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHBoYV9jb3JlX2FncF9mZXRjaF9zaXplKHZvaWQpCit7CisJcmV0dXJuIGFscGhhX2NvcmVfYWdwX3NpemVzWzBdLnNpemU7Cit9CisKK3N0YXRpYyBpbnQgYWxwaGFfY29yZV9hZ3BfY29uZmlndXJlKHZvaWQpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IGFncC0+YXBlcnR1cmUuYnVzX2Jhc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFscGhhX2NvcmVfYWdwX2NsZWFudXAodm9pZCkKK3sKKwlhbHBoYV9hZ3BfaW5mbyAqYWdwID0gYWdwX2JyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCWFncC0+b3BzLT5jbGVhbnVwKGFncCk7Cit9CisKK3N0YXRpYyB2b2lkIGFscGhhX2NvcmVfYWdwX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJYWxwaGFfbXYubXZfcGNpX3RiaShhZ3AtPmhvc2UsIDAsIC0xKTsKK30KKworc3RhdGljIHZvaWQgYWxwaGFfY29yZV9hZ3BfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgdTMyIG1vZGUpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCWFncC0+bW9kZS5sdyA9IGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMoYnJpZGdlLCBtb2RlLAorCQkJCQlhZ3AtPmNhcGFiaWxpdHkubHcpOworCisJYWdwLT5tb2RlLmJpdHMuZW5hYmxlID0gMTsKKwlhZ3AtPm9wcy0+Y29uZmlndXJlKGFncCk7CisKKwlhZ3BfZGV2aWNlX2NvbW1hbmQoYWdwLT5tb2RlLmx3LCAwKTsKK30KKworc3RhdGljIGludCBhbHBoYV9jb3JlX2FncF9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCAKKwkJCQkJaW50IHR5cGUpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJaW50IG51bV9lbnRyaWVzLCBzdGF0dXM7CisJdm9pZCAqdGVtcDsKKworCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKSByZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IGFncC0+b3BzLT5iaW5kKGFncCwgcGdfc3RhcnQsIG1lbSk7CisJbWIoKTsKKwlhbHBoYV9jb3JlX2FncF90bGJmbHVzaChtZW0pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhbHBoYV9jb3JlX2FncF9yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCAKKwkJCQkJaW50IHR5cGUpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGFncC0+b3BzLT51bmJpbmQoYWdwLCBwZ19zdGFydCwgbWVtKTsKKwlhbHBoYV9jb3JlX2FncF90bGJmbHVzaChtZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBhbHBoYV9jb3JlX2FncF9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gYWxwaGFfY29yZV9hZ3Bfc2l6ZXMsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDEsCisJLnNpemVfdHlwZQkJPSBGSVhFRF9BUEVSX1NJWkUsCisJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKKwkubWFza3MJCQk9IE5VTEwsCisJCisJLmZldGNoX3NpemUJCT0gYWxwaGFfY29yZV9hZ3BfZmV0Y2hfc2l6ZSwKKwkuY29uZmlndXJlCQk9IGFscGhhX2NvcmVfYWdwX2NvbmZpZ3VyZSwKKwkuYWdwX2VuYWJsZQkJPSBhbHBoYV9jb3JlX2FncF9lbmFibGUsCisJLmNsZWFudXAJCT0gYWxwaGFfY29yZV9hZ3BfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGFscGhhX2NvcmVfYWdwX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFscGhhX2NvcmVfYWdwX25vcCwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYWxwaGFfY29yZV9hZ3Bfbm9wLAorCS5pbnNlcnRfbWVtb3J5CQk9IGFscGhhX2NvcmVfYWdwX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gYWxwaGFfY29yZV9hZ3BfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWxwaGFfYnJpZGdlOworCitpbnQgX19pbml0CithbHBoYV9jb3JlX2FncF9zZXR1cCh2b2lkKQoreworCWFscGhhX2FncF9pbmZvICphZ3AgPSBhbHBoYV9tdi5hZ3BfaW5mbygpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBmYWtlZCAqLworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqYXBlcl9zaXplOworCisJaWYgKCFhZ3ApCisJCXJldHVybiAtRU5PREVWOworCWlmIChhZ3AtPm9wcy0+c2V0dXAoYWdwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBhcGVydHVyZSBzaXplIGRlc2NyaXB0b3IKKwkgKi8KKwlhcGVyX3NpemUgPSBhbHBoYV9jb3JlX2FncF9zaXplczsKKwlhcGVyX3NpemUtPnNpemUgPSBhZ3AtPmFwZXJ0dXJlLnNpemUgLyAoMTAyNCAqIDEwMjQpOworCWFwZXJfc2l6ZS0+bnVtX2VudHJpZXMgPSBhZ3AtPmFwZXJ0dXJlLnNpemUgLyBQQUdFX1NJWkU7CisJYXBlcl9zaXplLT5wYWdlX29yZGVyID0gX19mZnMoYXBlcl9zaXplLT5udW1fZW50cmllcyAvIDEwMjQpOworCisJLyoKKwkgKiBCdWlsZCBhIGZha2UgcGNpX2RldiBzdHJ1Y3QKKwkgKi8KKwlwZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PTUVNOworCXBkZXYtPnZlbmRvciA9IDB4ZmZmZjsKKwlwZGV2LT5kZXZpY2UgPSAweGZmZmY7CisJcGRldi0+c3lzZGF0YSA9IGFncC0+aG9zZTsKKworCWFscGhhX2JyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWFscGhhX2JyaWRnZSkKKwkJZ290byBmYWlsOworCisJYWxwaGFfYnJpZGdlLT5kcml2ZXIgPSAmYWxwaGFfY29yZV9hZ3BfZHJpdmVyOworCWFscGhhX2JyaWRnZS0+dm1fb3BzID0gJmFscGhhX2NvcmVfYWdwX3ZtX29wczsKKwlhbHBoYV9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9IGFwZXJfc2l6ZTsgLyogb25seSAxIHNpemUgKi8KKwlhbHBoYV9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSBhZ3A7CisJYWxwaGFfYnJpZGdlLT5kZXYgPSBwZGV2OworCWFscGhhX2JyaWRnZS0+bW9kZSA9IGFncC0+Y2FwYWJpbGl0eS5sdzsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBR1Agb24gaG9zZSAlZFxuIiwgYWdwLT5ob3NlLT5pbmRleCk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGFscGhhX2JyaWRnZSk7CisKKyBmYWlsOgorCWtmcmVlKHBkZXYpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfYWxwaGFfY29yZV9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhbHBoYV9tdi5hZ3BfaW5mbykKKwkJcmV0dXJuIGFscGhhX2NvcmVfYWdwX3NldHVwKCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfYWxwaGFfY29yZV9jbGVhbnVwKHZvaWQpCit7CisJYWdwX3JlbW92ZV9icmlkZ2UoYWxwaGFfYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShhbHBoYV9icmlkZ2UpOworfQorCittb2R1bGVfaW5pdChhZ3BfYWxwaGFfY29yZV9pbml0KTsKK21vZHVsZV9leGl0KGFncF9hbHBoYV9jb3JlX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJKZWZmIFdpZWRlbWVpZXIgPEplZmYuV2llZGVtZWllckBocC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWVhODdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBBTUQgSzcgQUdQR0FSVCByb3V0aW5lcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKyNkZWZpbmUgQU1EX01NQkFTRQkweDE0CisjZGVmaW5lIEFNRF9BUFNJWkUJMHhhYworI2RlZmluZSBBTURfTU9ERUNOVEwJMHhiMAorI2RlZmluZSBBTURfTU9ERUNOVEwyCTB4YjIKKyNkZWZpbmUgQU1EX0dBUlRFTkFCTEUJMHgwMgkvKiBJbiBtbWlvIHJlZ2lvbiAoMTYtYml0IHJlZ2lzdGVyKSAqLworI2RlZmluZSBBTURfQVRUQkFTRQkweDA0CS8qIEluIG1taW8gcmVnaW9uICgzMi1iaXQgcmVnaXN0ZXIpICovCisjZGVmaW5lIEFNRF9UTEJGTFVTSAkweDBjCS8qIEluIG1taW8gcmVnaW9uICgzMi1iaXQgcmVnaXN0ZXIpICovCisjZGVmaW5lIEFNRF9DQUNIRUVOVFJZCTB4MTAJLyogSW4gbW1pbyByZWdpb24gKDMyLWJpdCByZWdpc3RlcikgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9hbWRrN19wY2lfdGFibGVbXTsKKworc3RydWN0IGFtZF9wYWdlX21hcCB7CisJdW5zaWduZWQgbG9uZyAqcmVhbDsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlbWFwcGVkOworfTsKKworc3RhdGljIHN0cnVjdCBfYW1kX2lyb25nYXRlX3ByaXZhdGUgeworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwICoqZ2F0dF9wYWdlczsKKwlpbnQgbnVtX3RhYmxlczsKK30gYW1kX2lyb25nYXRlX3ByaXZhdGU7CisKK3N0YXRpYyBpbnQgYW1kX2NyZWF0ZV9wYWdlX21hcChzdHJ1Y3QgYW1kX3BhZ2VfbWFwICpwYWdlX21hcCkKK3sKKwlpbnQgaTsKKworCXBhZ2VfbWFwLT5yZWFsID0gKHVuc2lnbmVkIGxvbmcgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlX21hcC0+cmVhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlwYWdlX21hcC0+cmVtYXBwZWQgPSBpb3JlbWFwX25vY2FjaGUodmlydF90b19waHlzKHBhZ2VfbWFwLT5yZWFsKSwKKwkJCQkJICAgIFBBR0VfU0laRSk7CisJaWYgKHBhZ2VfbWFwLT5yZW1hcHBlZCA9PSBOVUxMKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYWdlX21hcC0+cmVhbCkpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2VfbWFwLT5yZWFsKTsKKwkJcGFnZV9tYXAtPnJlYWwgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgcGFnZV9tYXAtPnJlbWFwcGVkK2kpOworCQlyZWFkbChwYWdlX21hcC0+cmVtYXBwZWQraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWRfZnJlZV9wYWdlX21hcChzdHJ1Y3QgYW1kX3BhZ2VfbWFwICpwYWdlX21hcCkKK3sKKwlpb3VubWFwKHBhZ2VfbWFwLT5yZW1hcHBlZCk7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2VfbWFwLT5yZWFsKSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9mcmVlX2dhdHRfcGFnZXModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwICoqdGFibGVzOworCXN0cnVjdCBhbWRfcGFnZV9tYXAgKmVudHJ5OworCisJdGFibGVzID0gYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgYW1kX2lyb25nYXRlX3ByaXZhdGUubnVtX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0gdGFibGVzW2ldOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJaWYgKGVudHJ5LT5yZWFsICE9IE5VTEwpCisJCQkJYW1kX2ZyZWVfcGFnZV9tYXAoZW50cnkpOworCQkJa2ZyZWUoZW50cnkpOworCQl9CisJfQorCWtmcmVlKHRhYmxlcyk7CisJYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2NyZWF0ZV9nYXR0X3BhZ2VzKGludCBucl90YWJsZXMpCit7CisJc3RydWN0IGFtZF9wYWdlX21hcCAqKnRhYmxlczsKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwICplbnRyeTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCXRhYmxlcyA9IGttYWxsb2MoKG5yX3RhYmxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBhbWRfcGFnZV9tYXAgKiksCisJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKHRhYmxlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCAodGFibGVzLCAwLCBzaXplb2Yoc3RydWN0IGFtZF9wYWdlX21hcCAqKSAqIChucl90YWJsZXMgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFtZF9wYWdlX21hcCksIEdGUF9LRVJORUwpOworCQlpZiAoZW50cnkgPT0gTlVMTCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldCAoZW50cnksIDAsIHNpemVvZihzdHJ1Y3QgYW1kX3BhZ2VfbWFwKSk7CisJCXRhYmxlc1tpXSA9IGVudHJ5OworCQlyZXR2YWwgPSBhbWRfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJYnJlYWs7CisJfQorCWFtZF9pcm9uZ2F0ZV9wcml2YXRlLm51bV90YWJsZXMgPSBucl90YWJsZXM7CisJYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKKworCWlmIChyZXR2YWwgIT0gMCkKKwkJYW1kX2ZyZWVfZ2F0dF9wYWdlcygpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogU2luY2Ugd2UgZG9uJ3QgbmVlZCBjb250aWdpb3VzIG1lbW9yeSB3ZSBqdXN0IHRyeQorICogdG8gZ2V0IHRoZSBnYXR0IHRhYmxlIG9uY2UKKyAqLworCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgKGFkZHIgPj4gMjIpCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9JRFgoYWRkcikgKEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgLSBcCisJR0VUX1BBR0VfRElSX09GRihhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyKSkKKyNkZWZpbmUgR0VUX0dBVFRfT0ZGKGFkZHIpICgoYWRkciAmIDB4MDAzZmYwMDApID4+IDEyKQorI2RlZmluZSBHRVRfR0FUVChhZGRyKSAoYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlc1tcCisJR0VUX1BBR0VfRElSX0lEWChhZGRyKV0tPnJlbWFwcGVkKQorCitzdGF0aWMgaW50IGFtZF9jcmVhdGVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKnZhbHVlOworCXN0cnVjdCBhbWRfcGFnZV9tYXAgcGFnZV9kaXI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCByZXR2YWw7CisJdTMyIHRlbXA7CisJaW50IGk7CisKKwl2YWx1ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisJcmV0dmFsID0gYW1kX2NyZWF0ZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCWlmIChyZXR2YWwgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGFtZF9jcmVhdGVfZ2F0dF9wYWdlcyh2YWx1ZS0+bnVtX2VudHJpZXMgLyAxMDI0KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJYW1kX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopcGFnZV9kaXIucmVhbDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiBfX2lvbWVtICopcGFnZV9kaXIucmVtYXBwZWQ7CisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyhwYWdlX2Rpci5yZWFsKTsKKworCS8qIEdldCB0aGUgYWRkcmVzcyBmb3IgdGhlIGdhcnQgcmVnaW9uLgorCSAqIFRoaXMgaXMgYSBidXMgYWRkcmVzcyBldmVuIG9uIHRoZSBhbHBoYSwgYi9jIGl0cworCSAqIHVzZWQgdG8gcHJvZ3JhbSB0aGUgYWdwIG1hc3RlciBub3QgdGhlIGNwdQorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSBhZGRyOworCisJLyogQ2FsY3VsYXRlIHRoZSBhZ3Agb2Zmc2V0ICovCisJZm9yIChpID0gMDsgaSA8IHZhbHVlLT5udW1fZW50cmllcyAvIDEwMjQ7IGkrKywgYWRkciArPSAweDAwNDAwMDAwKSB7CisJCXdyaXRlbCh2aXJ0X3RvX3BoeXMoYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlc1tpXS0+cmVhbCkgfCAxLAorCQkJcGFnZV9kaXIucmVtYXBwZWQrR0VUX1BBR0VfRElSX09GRihhZGRyKSk7CisJCXJlYWRsKHBhZ2VfZGlyLnJlbWFwcGVkK0dFVF9QQUdFX0RJUl9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfZnJlZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwIHBhZ2VfZGlyOworCisJcGFnZV9kaXIucmVhbCA9ICh1bnNpZ25lZCBsb25nICopYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsOworCXBhZ2VfZGlyLnJlbWFwcGVkID0gKHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKWFncF9icmlkZ2UtPmdhdHRfdGFibGU7CisKKwlhbWRfZnJlZV9nYXR0X3BhZ2VzKCk7CisJYW1kX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfaXJvbmdhdGVfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICp2YWx1ZXM7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTURfQVBTSVpFLCAmdGVtcCk7CisJdGVtcCA9ICh0ZW1wICYgMHgwMDAwMDAwZSk7CisJdmFsdWVzID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2lyb25nYXRlX2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpjdXJyZW50X3NpemU7CisJdTMyIHRlbXA7CisJdTE2IGVuYWJsZV9yZWc7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogR2V0IHRoZSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFNRF9NTUJBU0UsICZ0ZW1wKTsKKwl0ZW1wID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKwlhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKSBpb3JlbWFwKHRlbXAsIDQwOTYpOworCisJLyogV3JpdGUgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnYXR0IHRhYmxlICovCisJd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfQVRUQkFTRSk7CisJcmVhZGwoYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9BVFRCQVNFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwkvKiBXcml0ZSB0aGUgU3luYyByZWdpc3RlciAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIEFNRF9NT0RFQ05UTCwgMHg4MCk7CisKKwkvKiBTZXQgaW5kZXhpbmcgbW9kZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIEFNRF9NT0RFQ05UTDIsIDB4MDApOworCisJLyogV3JpdGUgdGhlIGVuYWJsZSByZWdpc3RlciAqLworCWVuYWJsZV9yZWcgPSByZWFkdyhhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMrQU1EX0dBUlRFTkFCTEUpOworCWVuYWJsZV9yZWcgPSAoZW5hYmxlX3JlZyB8IDB4MDAwNCk7CisJd3JpdGV3KGVuYWJsZV9yZWcsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfR0FSVEVOQUJMRSk7CisJcmVhZHcoYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9HQVJURU5BQkxFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwkvKiBXcml0ZSBvdXQgdGhlIHNpemUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTURfQVBTSVpFLCAmdGVtcCk7CisJdGVtcCA9ICgoKHRlbXAgJiB+KDB4MDAwMDAwMGUpKSB8IGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkgfCAxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQU1EX0FQU0laRSwgdGVtcCk7CisKKwkvKiBGbHVzaCB0aGUgdGxiICovCisJd3JpdGVsKDEsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOworCXJlYWRsKGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOwkvKiBQQ0kgUG9zdGluZy4qLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWRfaXJvbmdhdGVfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpwcmV2aW91c19zaXplOworCXUzMiB0ZW1wOworCXUxNiBlbmFibGVfcmVnOworCisJcHJldmlvdXNfc2l6ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCisJZW5hYmxlX3JlZyA9IHJlYWR3KGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfR0FSVEVOQUJMRSk7CisJZW5hYmxlX3JlZyA9IChlbmFibGVfcmVnICYgfigweDAwMDQpKTsKKwl3cml0ZXcoZW5hYmxlX3JlZywgYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9HQVJURU5BQkxFKTsKKwlyZWFkdyhhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMrQU1EX0dBUlRFTkFCTEUpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCS8qIFdyaXRlIGJhY2sgdGhlIHByZXZpb3VzIHNpemUgYW5kIGRpc2FibGUgZ2FydCB0cmFuc2xhdGlvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFNRF9BUFNJWkUsICZ0ZW1wKTsKKwl0ZW1wID0gKCh0ZW1wICYgfigweDAwMDAwMDBmKSkgfCBwcmV2aW91c19zaXplLT5zaXplX3ZhbHVlKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQU1EX0FQU0laRSwgdGVtcCk7CisJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY291bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFraW5nIHRoZSBhZGRyZXNzZXMKKyAqIHdyaXR0ZW4gdG8gdGhlIEdBVFQsIGFuZCBmbHVzaGluZyB0aGVtIGluZGl2aWR1YWxseS4gIEhvd2V2ZXIKKyAqIGN1cnJlbnRseSBpdCBqdXN0IGZsdXNoZXMgdGhlIHdob2xlIHRhYmxlLiAgV2hpY2ggaXMgcHJvYmFibHkKKyAqIG1vcmUgZWZmaWNlbnQsIHNpbmNlIGFncF9tZW1vcnkgYmxvY2tzIGNhbiBiZSBhIGxhcmdlIG51bWJlciBvZgorICogZW50cmllcy4KKyAqLworCitzdGF0aWMgdm9pZCBhbWRfaXJvbmdhdGVfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKnRlbXApCit7CisJd3JpdGVsKDEsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOworCXJlYWRsKGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOwkvKiBQQ0kgUG9zdGluZy4gKi8KK30KKworc3RhdGljIGludCBhbWRfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIGosIG51bV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqY3VyX2dhdHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisJd2hpbGUgKGogPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpKSB7CisJCWFkZHIgPSAoaiAqIFBBR0VfU0laRSkgKyBhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyOworCQljdXJfZ2F0dCA9IEdFVF9HQVRUKGFkZHIpOworCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWorKzsKKwl9CisKKwlpZiAobWVtLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOworCX0KKworCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJYWRkciA9IChqICogUEFHRV9TSVpFKSArIGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCWN1cl9nYXR0ID0gR0VUX0dBVFQoYWRkcik7CisJCXdyaXRlbChhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CisJCXJlYWRsKGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKwlhbWRfaXJvbmdhdGVfdGxiZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBfX2lvbWVtICpjdXJfZ2F0dDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCWFkZHIgPSAoaSAqIFBBR0VfU0laRSkgKyBhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyOworCQljdXJfZ2F0dCA9IEdFVF9HQVRUKGFkZHIpOworCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOworCQlyZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlhbWRfaXJvbmdhdGVfdGxiZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyIGFtZF9pcm9uZ2F0ZV9zaXplc1s3XSA9Cit7CisJezIwNDgsIDUyNDI4OCwgMHgwMDAwMDAwY30sCisJezEwMjQsIDI2MjE0NCwgMHgwMDAwMDAwYX0sCisJezUxMiwgMTMxMDcyLCAweDAwMDAwMDA4fSwKKwl7MjU2LCA2NTUzNiwgMHgwMDAwMDAwNn0sCisJezEyOCwgMzI3NjgsIDB4MDAwMDAwMDR9LAorCXs2NCwgMTYzODQsIDB4MDAwMDAwMDJ9LAorCXszMiwgODE5MiwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGFtZF9pcm9uZ2F0ZV9tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSAxLCAudHlwZSA9IDB9Cit9OworCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYW1kX2lyb25nYXRlX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBhbWRfaXJvbmdhdGVfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBMVkwyX0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IGFtZF9pcm9uZ2F0ZV9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gYW1kX2lyb25nYXRlX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gYW1kX2lyb25nYXRlX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBhbWRfaXJvbmdhdGVfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gYW1kX2lyb25nYXRlX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFtZF9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYW1kX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhbWRfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhbWRfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyBhbWRfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMDYsCisJCS5jaGlwc2V0X25hbWUJPSAiSXJvbmdhdGUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDBFLAorCQkuY2hpcHNldF9uYW1lCT0gIjc2MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEMsCisJCS5jaGlwc2V0X25hbWUJPSAiNzYwTVAiLAorCX0sCisJeyB9LCAvKiBkdW1teSBmaW5hbCBlbnRyeSwgYWx3YXlzIHByZXNlbnQgKi8KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF9hbWRrN19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXU4IGNhcF9wdHI7CisJaW50IGo7CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWogPSBlbnQgLSBhZ3BfYW1kazdfcGNpX3RhYmxlOworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBTUQgJXMgY2hpcHNldFxuIiwKKwkgICAgICAgYW1kX2FncF9kZXZpY2VfaWRzW2pdLmNoaXBzZXRfbmFtZSk7CisKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnJpZGdlLT5kcml2ZXIgPSAmYW1kX2lyb25nYXRlX2RyaXZlcjsKKwlicmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSAmYW1kX2lyb25nYXRlX3ByaXZhdGUsCisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKworCS8qIDc1MSBFcnJhdGEgKDIyNTY0X0ItMS5QREYpCisJICAgZXJyYXR1bSAyMDogc3Ryb2JlIGdsaXRjaCB3aXRoIE52aWRpYSBOVjEwIEdlRm9yY2UgY2FyZHMuCisJICAgc3lzdGVtIGNvbnRyb2xsZXIgbWF5IGV4cGVyaWVuY2Ugbm9pc2UgZHVlIHRvIHN0cm9uZyBkcml2ZSBzdHJlbmd0aHMKKwkgKi8KKwlpZiAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDA2KSB7CisJCXU4IGNhcF9wdHI9MDsKKwkJc3RydWN0IHBjaV9kZXYgKmdmeGNhcmQ9TlVMTDsKKwkJd2hpbGUgKCFjYXBfcHRyKSB7CisJCQlnZnhjYXJkID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfRElTUExBWV9WR0E8PDgsIGdmeGNhcmQpOworCQkJaWYgKCFnZnhjYXJkKSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJDb3VsZG4ndCBmaW5kIGFuIEFHUCBWR0EgY29udHJvbGxlci5cbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZ2Z4Y2FyZCwgUENJX0NBUF9JRF9BR1ApOworCQkJaWYgKCFjYXBfcHRyKSB7CisJCQkJcGNpX2Rldl9wdXQoZ2Z4Y2FyZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBXaXRoIHNvIG1hbnkgdmFyaWFudHMgb2YgTlZpZGlhIGNhcmRzLCBpdCdzIHNpbXBsZXIganVzdAorCQkgICB0byBibGFja2xpc3QgdGhlbSBhbGwsIGFuZCB0aGVuIHdoaXRlbGlzdCB0aGVtIGFzIG5lZWRlZAorCQkgICAoaWYgbmVjZXNzYXJ5IGF0IGFsbCkuICovCisJCWlmIChnZnhjYXJkLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsKKwkJCWFncF9icmlkZ2UtPmZsYWdzIHw9IEFHUF9FUlJBVEFfMVg7CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkFNRCA3NTEgY2hpcHNldCB3aXRoIE5WaWRpYSBHZUZvcmNlIGRldGVjdGVkLiBGb3JjaW5nIHRvIDFYIGR1ZSB0byBlcnJhdGEuXG4iKTsKKwkJfQorCQlwY2lfZGV2X3B1dChnZnhjYXJkKTsKKwl9CisKKwkvKiA3NjEgRXJyYXRhICgyMzYxM19GLnBkZikKKwkgKiBSZXZpc2lvbnMgQjAvQjEgd2VyZSBhIGRpc2FzdGVyLgorCSAqIGVycmF0dW0gNDQ6IFNZU0NMSy9BR1BDTEsgc2tldyBjYXVzZXMgMlggZmFpbHVyZXMgLS0gRm9yY2UgbW9kZSB0byAxWAorCSAqIGVycmF0dW0gNDU6IFRpbWluZyBwcm9ibGVtIHByZXZlbnRzIGZhc3Qgd3JpdGVzIC0tIERpc2FibGUgZmFzdCB3cml0ZS4KKwkgKiBlcnJhdHVtIDQ2OiBTZXR1cCB2aW9sYXRpb24gb24gQUdQIFNCQSBwaW5zIC0gRGlzYWJsZSBzaWRlIGJhbmQgYWRkcmVzc2luZy4KKwkgKiBXaXRoIHRoaXMgbG90IGRpc2FibGVkLCB3ZSBzaG91bGQgcHJldmVudCBsb2NrdXBzLiAqLworCWlmIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEUpIHsKKwkJdTggcmV2aXNpb249MDsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2aXNpb24pOworCQlpZiAocmV2aXNpb24gPT0gMHgxMCB8fCByZXZpc2lvbiA9PSAweDExKSB7CisJCQlhZ3BfYnJpZGdlLT5mbGFncyA9IEFHUF9FUlJBVEFfRkFTVFdSSVRFUzsKKwkJCWFncF9icmlkZ2UtPmZsYWdzIHw9IEFHUF9FUlJBVEFfU0JBOworCQkJYWdwX2JyaWRnZS0+ZmxhZ3MgfD0gQUdQX0VSUkFUQV8xWDsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQU1EIDc2MSBjaGlwc2V0IHdpdGggZXJyYXRhIGRldGVjdGVkIC0gZGlzYWJsaW5nIEFHUCBmYXN0IHdyaXRlcyAmIFNCQSBhbmQgZm9yY2luZyB0byAxWC5cbiIpOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJYnJpZGdlLT5jYXBuZHgrUENJX0FHUF9TVEFUVVMsCisJCQkmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2FtZGs3X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKKy8qIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgbmFtZSB0YWJsZSBhYm92ZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9hbWRrN19wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQU1ELAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDA2LAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FNRCwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwRSwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9BTUQsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEMsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfYW1kazdfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hbWRrN19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWFtZGs3IiwKKwkuaWRfdGFibGUJPSBhZ3BfYW1kazdfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYW1kazdfcHJvYmUsCisJLnJlbW92ZQkJPSBhZ3BfYW1kazdfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX2FtZGs3X2luaXQodm9pZCkKK3sKKwlpZiAoYWdwX29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbWRrN19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFncF9hbWRrN19jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfYW1kazdfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFncF9hbWRrN19pbml0KTsKK21vZHVsZV9leGl0KGFncF9hbWRrN19jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWYwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTdVNFIExhYnMuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIHB1YmxpYyBsaWNlbnNlLCB2Mi4KKyAqCisgKiBUaGlzIGlzIGEgR0FSVCBkcml2ZXIgZm9yIHRoZSBBTUQgT3B0ZXJvbi9BdGhsb242NCBvbi1DUFUgbm9ydGhicmlkZ2UuCisgKiBJdCBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHRoZSBBTUQgODE1MSBBR1AgYnJpZGdlLAorICogYWx0aG91Z2ggaXQgZG9lc24ndCBhY3R1YWxseSBkbyBtdWNoLCBhcyBhbGwgdGhlIHJlYWwKKyAqIHdvcmsgaXMgZG9uZSBpbiB0aGUgbm9ydGhicmlkZ2UocykuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgImFncC5oIgorCisvKiBXaWxsIG5lZWQgdG8gYmUgaW5jcmVhc2VkIGlmIEFNRDY0IGV2ZXIgZ29lcyA+OC13YXkuICovCisjZGVmaW5lIE1BWF9IQU1NRVJfR0FSVFMgICA4CisKKy8qIFBURSBiaXRzLiAqLworI2RlZmluZSBHUFRFX1ZBTElECTEKKyNkZWZpbmUgR1BURV9DT0hFUkVOVAkyCisKKy8qIEFwZXJ0dXJlIGNvbnRyb2wgcmVnaXN0ZXIgYml0cy4gKi8KKyNkZWZpbmUgR0FSVEVOCQkoMTw8MCkKKyNkZWZpbmUgRElTR0FSVENQVQkoMTw8NCkKKyNkZWZpbmUgRElTR0FSVElPCSgxPDw1KQorCisvKiBHQVJUIGNhY2hlIGNvbnRyb2wgcmVnaXN0ZXIgYml0cy4gKi8KKyNkZWZpbmUgSU5WR0FSVAkJKDE8PDApCisjZGVmaW5lIEdBUlRQVEVFUlIJKDE8PDEpCisKKy8qIEs4IE9uLWNwdSBHQVJUIHJlZ2lzdGVycyAqLworI2RlZmluZSBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwJMHg5MAorI2RlZmluZSBBTUQ2NF9HQVJUQVBFUlRVUkVCQVNFCTB4OTQKKyNkZWZpbmUgQU1ENjRfR0FSVFRBQkxFQkFTRQkweDk4CisjZGVmaW5lIEFNRDY0X0dBUlRDQUNIRUNUTAkweDljCisjZGVmaW5lIEFNRDY0X0dBUlRFTgkJKDE8PDApCisKKy8qIE5WSURJQSBLOCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlZJRElBX1g4Nl82NF8wX0FQQkFTRQkJMHgxMAorI2RlZmluZSBOVklESUFfWDg2XzY0XzFfQVBCQVNFMQkJMHg1MAorI2RlZmluZSBOVklESUFfWDg2XzY0XzFfQVBMSU1JVDEJMHg1NAorI2RlZmluZSBOVklESUFfWDg2XzY0XzFfQVBTSVpFCQkweGE4CisjZGVmaW5lIE5WSURJQV9YODZfNjRfMV9BUEJBU0UyCQkweGQ4CisjZGVmaW5lIE5WSURJQV9YODZfNjRfMV9BUExJTUlUMgkweGRjCisKKy8qIFVMaSBLOCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVUxJX1g4Nl82NF9CQVNFX0FERFIJCTB4MTAKKyNkZWZpbmUgVUxJX1g4Nl82NF9IVFRfRkVBX1JFRwkJMHg1MAorI2RlZmluZSBVTElfWDg2XzY0X0VOVV9TQ1JfUkVHCQkweDU0CisKK3N0YXRpYyBpbnQgbnJfZ2FydHM7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBoYW1tZXJzW01BWF9IQU1NRVJfR0FSVFNdOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlICphcGVydHVyZV9yZXNvdXJjZTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBhZ3BfdHJ5X3Vuc3VwcG9ydGVkOworCitzdGF0aWMgaW50IGdhcnRfaXRlcmF0b3I7CisjZGVmaW5lIGZvcl9lYWNoX25iKCkgZm9yKGdhcnRfaXRlcmF0b3I9MDtnYXJ0X2l0ZXJhdG9yPG5yX2dhcnRzO2dhcnRfaXRlcmF0b3IrKykKKworc3RhdGljIHZvaWQgZmx1c2hfYW1kNjRfdGxiKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIHRtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoZGV2LCBBTUQ2NF9HQVJUQ0FDSEVDVEwsICZ0bXApOworCXRtcCB8PSBJTlZHQVJUOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldiwgQU1ENjRfR0FSVENBQ0hFQ1RMLCB0bXApOworfQorCitzdGF0aWMgdm9pZCBhbWQ2NF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqdGVtcCkKK3sKKwlmb3JfZWFjaF9uYigpCisJCWZsdXNoX2FtZDY0X3RsYihoYW1tZXJzW2dhcnRfaXRlcmF0b3JdKTsKK30KKworc3RhdGljIGludCBhbWQ2NF9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpbnQgaSwgaiwgbnVtX2VudHJpZXM7CisJbG9uZyBsb25nIHRtcDsKKwl1MzIgcHRlOworCisJbnVtX2VudHJpZXMgPSBhZ3BfbnVtX2VudHJpZXMoKTsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFrZSBzdXJlIHdlIGNhbiBmaXQgdGhlIHJhbmdlIGluIHRoZSBnYXR0IHRhYmxlLiAqLworCS8qIEZJWE1FOiBjb3VsZCB3cmFwICovCisJaWYgKCgodW5zaWduZWQgbG9uZylwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwkvKiBnYXR0IHRhYmxlIHNob3VsZCBiZSBlbXB0eS4gKi8KKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCQlqKys7CisJfQorCisJaWYgKG1lbS0+aXNfZmx1c2hlZCA9PSBGQUxTRSkgeworCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCXRtcCA9IGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpOworCisJCUJVR19PTih0bXAgJiAweGZmZmZmZjAwMDAwMDBmZmNVTEwpOworCQlwdGUgPSAodG1wICYgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAyODsKKwkJcHRlIHw9KHRtcCAmIDB4MDAwMDAwMDBmZmZmZjAwMFVMTCk7CisJCXB0ZSB8PSBHUFRFX1ZBTElEIHwgR1BURV9DT0hFUkVOVDsKKworCQl3cml0ZWwocHRlLCBhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK2opOworCQlyZWFkbChhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK2opOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisJYW1kNjRfdGxiZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaGFjayBhbHRlcnMgdGhlIG9yZGVyIGVsZW1lbnQgYWNjb3JkaW5nCisgKiB0byB0aGUgc2l6ZSBvZiBhIGxvbmcuIEl0IHN1Y2tzLiBJIHRvdGFsbHkgZGlzb3duIHRoaXMsIGV2ZW4KKyAqIHRob3VnaCBpdCBkb2VzIGFwcGVhciB0byB3b3JrIGZvciB0aGUgbW9zdCBwYXJ0LgorICovCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIGFtZDY0X2FwZXJ0dXJlX3NpemVzWzddID0KK3sKKwl7MzIsICAgODE5MiwgICAzKyhzaXplb2YobG9uZykvOCksIDAgfSwKKwl7NjQsICAgMTYzODQsICA0KyhzaXplb2YobG9uZykvOCksIDE8PDEgfSwKKwl7MTI4LCAgMzI3NjgsICA1KyhzaXplb2YobG9uZykvOCksIDE8PDIgfSwKKwl7MjU2LCAgNjU1MzYsICA2KyhzaXplb2YobG9uZykvOCksIDE8PDEgfCAxPDwyIH0sCisJezUxMiwgIDEzMTA3MiwgNysoc2l6ZW9mKGxvbmcpLzgpLCAxPDwzIH0sCisJezEwMjQsIDI2MjE0NCwgOCsoc2l6ZW9mKGxvbmcpLzgpLCAxPDwxIHwgMTw8M30sCisJezIwNDgsIDUyNDI4OCwgOSsoc2l6ZW9mKGxvbmcpLzgpLCAxPDwyIHwgMTw8M30KK307CisKKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBBcGVydHVyZSBzaXplIGZyb20gdGhlIHg4Ni02NC4KKyAqIE5vdGUsIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIHg4Ni02NCdzLCBidXQgd2UganVzdCByZXR1cm4KKyAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gVGhlIHNldF9zaXplIGZ1bmN0aW9ucworICoga2VlcCB0aGUgcmVzdCBjb2hlcmVudCBhbnl3YXkuIE9yIGF0IGxlYXN0IHNob3VsZCBkby4KKyAqLworc3RhdGljIGludCBhbWQ2NF9mZXRjaF9zaXplKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlczsKKworCWRldiA9IGhhbW1lcnNbMF07CisJaWYgKGRldj09TlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0ZW1wKTsKKwl0ZW1wID0gKHRlbXAgJiAweGUpOworCXZhbHVlcyA9IEFfU0laRV8zMihhbWQ2NF9hcGVydHVyZV9zaXplcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAodGVtcCA9PSB2YWx1ZXNbaV0uc2l6ZV92YWx1ZSkgeworCQkJYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSA9CisJCQkgICAgYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOworCisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbiBhIG11bHRpcHJvY2Vzc29yIHg4Ni02NCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gZ2V0cworICogY2FsbGVkIG9uY2UgZm9yIGVhY2ggQ1BVLgorICovCitzdGF0aWMgdTY0IGFtZDY0X2NvbmZpZ3VyZSAoc3RydWN0IHBjaV9kZXYgKmhhbW1lciwgdTY0IGdhdHRfdGFibGUpCit7CisJdTY0IGFwZXJ0dXJlYmFzZTsKKwl1MzIgdG1wOworCXU2NCBhZGRyLCBhcGVyX2Jhc2U7CisKKwkvKiBBZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoaGFtbWVyLCBBTUQ2NF9HQVJUQVBFUlRVUkVCQVNFLCAmdG1wKTsKKwlhcGVydHVyZWJhc2UgPSB0bXAgPDwgMjU7CisJYXBlcl9iYXNlID0gKGFwZXJ0dXJlYmFzZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYWRkcmVzcyBvZiB0aGUgbWFwcGluZ3MgdGFibGUgKi8KKwlhZGRyID0gKHU2NCkgZ2F0dF90YWJsZTsKKwlhZGRyID4+PSAxMjsKKwl0bXAgPSAodTMyKSBhZGRyPDw0OworCXRtcCAmPSB+MHhmOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGhhbW1lciwgQU1ENjRfR0FSVFRBQkxFQkFTRSwgdG1wKTsKKworCS8qIEVuYWJsZSBHQVJUIHRyYW5zbGF0aW9uIGZvciB0aGlzIGhhbW1lci4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaGFtbWVyLCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0bXApOworCXRtcCB8PSBHQVJURU47CisJdG1wICY9IH4oRElTR0FSVENQVSB8IERJU0dBUlRJTyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChoYW1tZXIsIEFNRDY0X0dBUlRBUEVSVFVSRUNUTCwgdG1wKTsKKworCS8qIGtlZXAgQ1BVJ3MgY29oZXJlbnQuICovCisJZmx1c2hfYW1kNjRfdGxiIChoYW1tZXIpOworCisJcmV0dXJuIGFwZXJfYmFzZTsKK30KKworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIGFtZF84MTUxX3NpemVzWzddID0KK3sKKwl7MjA0OCwgNTI0Mjg4LCA5LCAweDAwMDAwMDAwIH0sCS8qIDAgMCAwIDAgMCAwICovCisJezEwMjQsIDI2MjE0NCwgOCwgMHgwMDAwMDQwMCB9LAkvKiAxIDAgMCAwIDAgMCAqLworCXs1MTIsICAxMzEwNzIsIDcsIDB4MDAwMDA2MDAgfSwJLyogMSAxIDAgMCAwIDAgKi8KKwl7MjU2LCAgNjU1MzYsICA2LCAweDAwMDAwNzAwIH0sCS8qIDEgMSAxIDAgMCAwICovCisJezEyOCwgIDMyNzY4LCAgNSwgMHgwMDAwMDcyMCB9LAkvKiAxIDEgMSAxIDAgMCAqLworCXs2NCwgICAxNjM4NCwgIDQsIDB4MDAwMDA3MzAgfSwJLyogMSAxIDEgMSAxIDAgKi8KKwl7MzIsICAgODE5MiwgICAzLCAweDAwMDAwNzM4IH0gCS8qIDEgMSAxIDEgMSAxICovCit9OworCitzdGF0aWMgaW50IGFtZF84MTUxX2NvbmZpZ3VyZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ2F0dF9idXMgPSB2aXJ0X3RvX3BoeXMoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsKTsKKworCS8qIENvbmZpZ3VyZSBBR1AgcmVncyBpbiBlYWNoIHg4Ni02NCBob3N0IGJyaWRnZS4gKi8KKwlmb3JfZWFjaF9uYigpIHsKKwkJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9CisJCQkJYW1kNjRfY29uZmlndXJlKGhhbW1lcnNbZ2FydF9pdGVyYXRvcl0sZ2F0dF9idXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhbWQ2NF9jbGVhbnVwKHZvaWQpCit7CisJdTMyIHRtcDsKKworCWZvcl9lYWNoX25iKCkgeworCQkvKiBkaXNhYmxlIGdhcnQgdHJhbnNsYXRpb24gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChoYW1tZXJzW2dhcnRfaXRlcmF0b3JdLCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0bXApOworCQl0bXAgJj0gfkFNRDY0X0dBUlRFTjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoaGFtbWVyc1tnYXJ0X2l0ZXJhdG9yXSwgQU1ENjRfR0FSVEFQRVJUVVJFQ1RMLCB0bXApOworCX0KK30KKworCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYW1kXzgxNTFfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGFtZF84MTUxX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVTMyX0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IGFtZF84MTUxX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBhbWQ2NF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGFtZDY0X2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBhbWQ2NF90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYW1kNjRfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCisvKiBTb21lIGJhc2ljIHNhbml0eSBjaGVja3MgZm9yIHRoZSBhcGVydHVyZS4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFwZXJ0dXJlX3ZhbGlkKHU2NCBhcGVyLCB1MzIgc2l6ZSkKK3sKKwl1MzIgcGZuLCBjOworCWlmIChhcGVyID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gYXBlcnR1cmVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNpemUgPCAzMioxMDI0KjEwMjQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQXBlcnR1cmUgdG9vIHNtYWxsICglZCBNQilcbiIsIHNpemU+PjIwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhcGVyICsgc2l6ZSA+IDB4ZmZmZmZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQXBlcnR1cmUgb3V0IG9mIGJvdW5kc1xuIik7CisJCXJldHVybiAwOworCX0KKwlwZm4gPSBhcGVyID4+IFBBR0VfU0hJRlQ7CisJZm9yIChjID0gMDsgYyA8IHNpemUvUEFHRV9TSVpFOyBjKyspIHsKKwkJaWYgKCFwZm5fdmFsaWQocGZuICsgYykpCisJCQlicmVhazsKKwkJaWYgKCFQYWdlUmVzZXJ2ZWQocGZuX3RvX3BhZ2UocGZuICsgYykpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJBcGVydHVyZSBwb2ludGluZyB0byBSQU1cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBSZXF1ZXN0IHRoZSBBcGVydHVyZS4gVGhpcyBjYXRjaGVzIGNhc2VzIHdoZW4gc29tZW9uZSBlbHNlCisJICAgYWxyZWFkeSBwdXQgYSBtYXBwaW5nIGluIHRoZXJlIC0gaGFwcGVucyB3aXRoIHNvbWUgdmVyeSBicm9rZW4gQklPUworCisJICAgTWF5YmUgYmV0dGVyIHRvIHVzZSBwY2lfYXNzaWduX3Jlc291cmNlL3BjaV9lbmFibGVfZGV2aWNlIGluc3RlYWQKKwkgICB0cnVzdGluZyB0aGUgYnJpZGdlcz8gKi8KKwlpZiAoIWFwZXJ0dXJlX3Jlc291cmNlICYmCisJICAgICEoYXBlcnR1cmVfcmVzb3VyY2UgPSByZXF1ZXN0X21lbV9yZWdpb24oYXBlciwgc2l6ZSwgImFwZXJ0dXJlIikpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFwZXJ0dXJlIGNvbmZsaWN0cyB3aXRoIFBDSSBtYXBwaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFcqcyBjZW50cmljIEJJT1Mgc29tZXRpbWVzIG9ubHkgc2V0IHVwIHRoZSBhcGVydHVyZSBpbiB0aGUgQUdQCisgKiBicmlkZ2UsIG5vdCB0aGUgbm9ydGhicmlkZ2UuIE9uIEFNRDY0IHRoaXMgaXMgaGFuZGxlZCBlYXJseQorICogaW4gYXBlcnR1cmUuYywgYnV0IHdoZW4gR0FSVF9JT01NVSBpcyBub3QgZW5hYmxlZCBvciB3ZSBydW4KKyAqIG9uIGEgMzJiaXQga2VybmVsIHRoaXMgbmVlZHMgdG8gYmUgcmVkb25lLgorICogVW5mb3J0dW5hdGVseSBpdCBpcyBpbXBvc3NpYmxlIHRvIGZpeCB0aGUgYXBlcnR1cmUgaGVyZSBiZWNhdXNlIGl0J3MgdG9vIGxhdGUKKyAqIHRvIGFsbG9jYXRlIHRoYXQgbXVjaCBtZW1vcnkuIEJ1dCBhdCBsZWFzdCBlcnJvciBvdXQgY2xlYW5seSBpbnN0ZWFkIG9mCisgKiBjcmFzaGluZy4KKyAqLworc3RhdGljIF9fZGV2aW5pdCBpbnQgZml4X25vcnRoYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpuYiwgc3RydWN0IHBjaV9kZXYgKmFncCwKKwkJCQkJCQkJIHUxNiBjYXApCit7CisJdTMyIGFwZXJfbG93LCBhcGVyX2hpOworCXU2NCBhcGVyLCBuYl9hcGVyOworCWludCBvcmRlciA9IDA7CisJdTMyIG5iX29yZGVyLCBuYl9iYXNlOworCXUxNiBhcHNpemU7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobmIsIDB4OTAsICZuYl9vcmRlcik7CisJbmJfb3JkZXIgPSAobmJfb3JkZXIgPj4gMSkgJiA3OworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuYiwgMHg5NCwgJm5iX2Jhc2UpOworCW5iX2FwZXIgPSBuYl9iYXNlIDw8IDI1OworCWlmIChhcGVydHVyZV92YWxpZChuYl9hcGVyLCAoMzIqMTAyNCoxMDI0KTw8bmJfb3JkZXIpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vcnRoYnJpZGdlIHNlZW1zIHRvIGNvbnRhaW4gY3JhcC4gVHJ5IHRoZSBBR1AgYnJpZGdlLiAqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwLCBjYXArMHgxNCwgJmFwc2l6ZSk7CisJaWYgKGFwc2l6ZSA9PSAweGZmZmYpCisJCXJldHVybiAtMTsKKworCWFwc2l6ZSAmPSAweGZmZjsKKwkvKiBTb21lIEJJT1MgdXNlIHdlaXJkIGVuY29kaW5ncyBub3QgaW4gdGhlIEFHUHYzIHRhYmxlLiAqLworCWlmIChhcHNpemUgJiAweGZmKQorCQlhcHNpemUgfD0gMHhmMDA7CisJb3JkZXIgPSA3IC0gaHdlaWdodDE2KGFwc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwLCAweDEwLCAmYXBlcl9sb3cpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3AsIDB4MTQsICZhcGVyX2hpKTsKKwlhcGVyID0gKGFwZXJfbG93ICYgfigoMTw8MjIpLTEpKSB8ICgodTY0KWFwZXJfaGkgPDwgMzIpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJBcGVydHVyZSBmcm9tIEFHUCBAICVMeCBzaXplICV1IE1CXG4iLCBhcGVyLCAzMiA8PCBvcmRlcik7CisJaWYgKG9yZGVyIDwgMCB8fCAhYXBlcnR1cmVfdmFsaWQoYXBlciwgKDMyKjEwMjQqMTAyNCk8PG9yZGVyKSkKKwkJcmV0dXJuIC0xOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuYiwgMHg5MCwgb3JkZXIgPDwgMSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuYiwgMHg5NCwgYXBlciA+PiAyNSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgY2FjaGVfbmJzIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIGNhcF9wdHIpCit7CisJc3RydWN0IHBjaV9kZXYgKmxvb3BfZGV2ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisKKwkvKiBjYWNoZSBwY2lfZGV2cyBvZiBub3J0aGJyaWRnZXMuICovCisJd2hpbGUgKChsb29wX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELCAweDExMDMsIGxvb3BfZGV2KSkKKwkJCSE9IE5VTEwpIHsKKwkJaWYgKGkgPT0gTUFYX0hBTU1FUl9HQVJUUykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVG9vIG1hbnkgbm9ydGhicmlkZ2VzIGZvciBBR1BcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChmaXhfbm9ydGhicmlkZ2UobG9vcF9kZXYsIHBkZXYsIGNhcF9wdHIpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIGFwZXJ0dXJlIGZvdW5kLlxuIik7CisjaWZkZWYgX194ODZfNjRfXworCQkJLyogc2hvdWxkIHBvcnQgdGhpcyB0byBpMzg2ICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb25zaWRlciByZWJvb3Rpbmcgd2l0aCBpb21tdT1tZW1hcGVyPTIgdG8gZ2V0IGEgZ29vZCBhcGVydHVyZS5cbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaGFtbWVyc1tpKytdID0gbG9vcF9kZXY7CisJfQorCQlucl9nYXJ0cyA9IGk7CisJcmV0dXJuIGkgPT0gMCA/IC0xIDogMDsKK30KKworLyogSGFuZGxlIEFNRCA4MTUxIHF1aXJrcyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGFtZDgxNTFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWNoYXIgKnJldnN0cmluZzsKKwl1OCByZXZfaWQ7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXZfaWQpOworCXN3aXRjaCAocmV2X2lkKSB7CisJY2FzZSAweDAxOiByZXZzdHJpbmc9IkEwIjsgYnJlYWs7CisJY2FzZSAweDAyOiByZXZzdHJpbmc9IkExIjsgYnJlYWs7CisJY2FzZSAweDExOiByZXZzdHJpbmc9IkIwIjsgYnJlYWs7CisJY2FzZSAweDEyOiByZXZzdHJpbmc9IkIxIjsgYnJlYWs7CisJY2FzZSAweDEzOiByZXZzdHJpbmc9IkIyIjsgYnJlYWs7CisJY2FzZSAweDE0OiByZXZzdHJpbmc9IkIzIjsgYnJlYWs7CisJZGVmYXVsdDogICByZXZzdHJpbmc9Ij8/IjsgYnJlYWs7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBTUQgODE1MSBBR1AgQnJpZGdlIHJldiAlc1xuIiwgcmV2c3RyaW5nKTsKKworCS8qCisJICogV29yayBhcm91bmQgZXJyYXRhLgorCSAqIENoaXBzIGJlZm9yZSBCMiBzdGVwcGluZyBpbmNvcnJlY3RseSByZXBvcnRpbmcgdjMuNQorCSAqLworCWlmIChyZXZfaWQgPCAweDEzKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQ29ycmVjdGluZyBBR1AgcmV2aXNpb24gKHJlcG9ydHMgMy41LCBpcyByZWFsbHkgMy4wKVxuIik7CisJCWJyaWRnZS0+bWFqb3JfdmVyc2lvbiA9IDM7CisJCWJyaWRnZS0+bWlub3JfdmVyc2lvbiA9IDA7CisJfQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgdWxpX3NpemVzWzddID0KK3sKKwl7MjU2LCA2NTUzNiwgNiwgMTB9LAorCXsxMjgsIDMyNzY4LCA1LCA5fSwKKwl7NjQsIDE2Mzg0LCA0LCA4fSwKKwl7MzIsIDgxOTIsIDMsIDd9LAorCXsxNiwgNDA5NiwgMiwgNn0sCisJezgsIDIwNDgsIDEsIDR9LAorCXs0LCAxMDI0LCAwLCAzfQorfTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHVsaV9hZ3BfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgaHR0ZmVhLGJhc2VhZGRyLGVudXNjcjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2MTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaXplID0gYW1kNjRfZmV0Y2hfc2l6ZSgpOworCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgdXAgVUxpIEFHUC4gXG4iKTsKKwlkZXYxID0gcGNpX2ZpbmRfc2xvdCAoKHVuc2lnbmVkIGludClwZGV2LT5idXMtPm51bWJlcixQQ0lfREVWRk4oMCwwKSk7CisJaWYgKGRldjEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV0ZWN0ZWQgYSBVTGkgY2hpcHNldCwgIgorCQkJImJ1dCBjb3VsZCBub3QgZmluZSB0aGUgc2Vjb25kYXJ5IGRldmljZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1bGlfc2l6ZXMpOyBpKyspCisJCWlmICh1bGlfc2l6ZXNbaV0uc2l6ZSA9PSBzaXplKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHVsaV9zaXplcykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5vIFVMaSBzaXplIGZvdW5kIGZvciAlZFxuIiwgc2l6ZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHNoYWRvdyB4ODYtNjQgcmVnaXN0ZXJzIGludG8gVUxpIHJlZ2lzdGVycyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoaGFtbWVyc1swXSwgQU1ENjRfR0FSVEFQRVJUVVJFQkFTRSwgJmh0dGZlYSk7CisKKwkvKiBpZiB4ODYtNjQgYXBlcnR1cmUgYmFzZSBpcyBiZXlvbmQgNEcsIGV4aXQgaGVyZSAqLworCWlmICgoaHR0ZmVhICYgMHg3ZmZmKSA+PiAoMzIgLSAyNSkpCisJCXJldHVybiAtRU5PREVWOworCisJaHR0ZmVhID0gKGh0dGZlYSYgMHg3ZmZmKSA8PCAyNTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBVTElfWDg2XzY0X0JBU0VfQUREUiwgJmJhc2VhZGRyKTsKKwliYXNlYWRkciY9IH5QQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWJhc2VhZGRyfD0gaHR0ZmVhOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgVUxJX1g4Nl82NF9CQVNFX0FERFIsIGJhc2VhZGRyKTsKKworCWVudXNjcj0gaHR0ZmVhKyAoc2l6ZSAqIDEwMjQgKiAxMDI0KSAtIDE7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYxLCBVTElfWDg2XzY0X0hUVF9GRUFfUkVHLCBodHRmZWEpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgVUxJX1g4Nl82NF9FTlVfU0NSX1JFRywgZW51c2NyKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIG5mb3JjZTNfc2l6ZXNbNV0gPQoreworCXs1MTIsICAxMzEwNzIsIDcsIDB4MDAwMDAwMDAgfSwKKwl7MjU2LCAgNjU1MzYsICA2LCAweDAwMDAwMDA4IH0sCisJezEyOCwgIDMyNzY4LCAgNSwgMHgwMDAwMDAwQyB9LAorCXs2NCwgICAxNjM4NCwgIDQsIDB4MDAwMDAwMEUgfSwKKwl7MzIsICAgODE5MiwgICAzLCAweDAwMDAwMDBGIH0KK307CisKKy8qIEhhbmRsZSBzaGFkb3cgZGV2aWNlIG9mIHRoZSBOdmlkaWEgTkZvcmNlMyAqLworLyogQ0hFQ0stTUUgb3JpZ2luYWwgMi40IHZlcnNpb24gc2V0IHVwIHNvbWUgSU9SUnMuIENoZWNrIGlmIHRoYXQgaXMgbmVlZGVkLiAqLworc3RhdGljIGludCBfX2RldmluaXQgbmZvcmNlM19hZ3BfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgdG1wLCBhcGJhc2UsIGFwYmFyLCBhcGxpbWl0OworCXN0cnVjdCBwY2lfZGV2ICpkZXYxOworCWludCBpOworCXVuc2lnbmVkIHNpemUgPSBhbWQ2NF9mZXRjaF9zaXplKCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU2V0dGluZyB1cCBOZm9yY2UzIEFHUC5cbiIpOworCisJZGV2MSA9IHBjaV9maW5kX3Nsb3QoKHVuc2lnbmVkIGludClwZGV2LT5idXMtPm51bWJlciwgUENJX0RFVkZOKDExLCAwKSk7CisJaWYgKGRldjEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYWdwZ2FydDogRGV0ZWN0ZWQgYW4gTlZJRElBICIKKwkJCSJuRm9yY2UzIGNoaXBzZXQsIGJ1dCBjb3VsZCBub3QgZmluZCAiCisJCQkidGhlIHNlY29uZGFyeSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmZvcmNlM19zaXplcyk7IGkrKykKKwkJaWYgKG5mb3JjZTNfc2l6ZXNbaV0uc2l6ZSA9PSBzaXplKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKG5mb3JjZTNfc2l6ZXMpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBORm9yY2UzIHNpemUgZm91bmQgZm9yICVkXG4iLCBzaXplKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUFNJWkUsICZ0bXApOworCXRtcCAmPSB+KDB4Zik7CisJdG1wIHw9IG5mb3JjZTNfc2l6ZXNbaV0uc2l6ZV92YWx1ZTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUFNJWkUsIHRtcCk7CisKKwkvKiBzaGFkb3cgeDg2LTY0IHJlZ2lzdGVycyBpbnRvIE5WSURJQSByZWdpc3RlcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGhhbW1lcnNbMF0sIEFNRDY0X0dBUlRBUEVSVFVSRUJBU0UsICZhcGJhc2UpOworCisJLyogaWYgeDg2LTY0IGFwZXJ0dXJlIGJhc2UgaXMgYmV5b25kIDRHLCBleGl0IGhlcmUgKi8KKwlpZiAoIChhcGJhc2UgJiAweDdmZmYpID4+ICgzMiAtIDI1KSApCisJCSByZXR1cm4gLUVOT0RFVjsKKworCWFwYmFzZSA9IChhcGJhc2UgJiAweDdmZmYpIDw8IDI1OworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE5WSURJQV9YODZfNjRfMF9BUEJBU0UsICZhcGJhcik7CisJYXBiYXIgJj0gflBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJYXBiYXIgfD0gYXBiYXNlOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTlZJRElBX1g4Nl82NF8wX0FQQkFTRSwgYXBiYXIpOworCisJYXBsaW1pdCA9IGFwYmFzZSArIChzaXplICogMTAyNCAqIDEwMjQpIC0gMTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUEJBU0UxLCBhcGJhc2UpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgTlZJRElBX1g4Nl82NF8xX0FQTElNSVQxLCBhcGxpbWl0KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUEJBU0UyLCBhcGJhc2UpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgTlZJRElBX1g4Nl82NF8xX0FQTElNSVQyLCBhcGxpbWl0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfYW1kNjRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmICghY2FwX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDb3VsZCBjaGVjayBmb3IgQUdQdjMgaGVyZSAqLworCisJYnJpZGdlID0gYWdwX2FsbG9jX2JyaWRnZSgpOworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTUQgJiYKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQU1EXzgxNTFfMCkgeworCQlhbWQ4MTUxX2luaXQocGRldiwgYnJpZGdlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV0ZWN0ZWQgQUdQIGJyaWRnZSAleFxuIiwgcGRldi0+ZGV2Zm4pOworCX0KKworCWJyaWRnZS0+ZHJpdmVyID0gJmFtZF84MTUxX2RyaXZlcjsKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBicmlkZ2UtPmNhcG5keCtQQ0lfQUdQX1NUQVRVUywgJmJyaWRnZS0+bW9kZSk7CisKKwlpZiAoY2FjaGVfbmJzKHBkZXYsIGNhcF9wdHIpID09IC0xKSB7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsKKwkJaW50IHJldCA9IG5mb3JjZTNfYWdwX2luaXQocGRldik7CisJCWlmIChyZXQpIHsKKwkJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FMKSB7CisJCWludCByZXQgPSB1bGlfYWdwX2luaXQocGRldik7CisJCWlmIChyZXQpIHsKKwkJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRnZSk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ3BfYW1kNjRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbih2aXJ0X3RvX3BoeXMoYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwpLAorCQkJICAgYW1kNjRfYXBlcnR1cmVfc2l6ZXNbYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeF0uc2l6ZSk7CisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX2FtZDY0X3BjaV90YWJsZVtdID0geworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9BTUQsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FNRF84MTUxXzAsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBVTGkgTTE2ODkgKi8KKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQUwsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjg5LAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJLyogVklBIEs4VDgwMFBybyAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1ZJQV9LOFQ4MDBQUk9fMCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCS8qIFZJQSBLOFQ4MDAgKi8KKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfVklBLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9WSUFfODM4NV8wLAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJLyogVklBIEs4TTgwMCAvIEs4TjgwMCAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MzgwXzAsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBWSUEgSzhUODkwICovCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1ZJQSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfVklBXzMyMzhfMCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCS8qIFZJQSBLOFQ4MDAvSzhNODAwL0s4TjgwMCAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MzhYXzEsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBORm9yY2UzICovCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTMsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFM1MsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBTSVMgNzU1ICovCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1NJLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9TSV83NTUsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfYW1kNjRfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hbWQ2NF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWFtZDY0IiwKKwkuaWRfdGFibGUJPSBhZ3BfYW1kNjRfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYW1kNjRfcHJvYmUsCisJLnJlbW92ZQkJPSBhZ3BfYW1kNjRfcmVtb3ZlLAorfTsKKworCisvKiBOb3Qgc3RhdGljIGR1ZSB0byBJT01NVSBjb2RlIGNhbGxpbmcgaXQgZWFybHkuICovCitpbnQgX19pbml0IGFncF9hbWQ2NF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDA7CisJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZDY0bmJbXSA9IHsKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCAweDExMDMpIH0sCisJCXsgfSwKKwl9OworCisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfYW1kNjRfcGNpX2RyaXZlcikgPiAwKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJCWlmICghYWdwX3RyeV91bnN1cHBvcnRlZCAmJiAhYWdwX3RyeV91bnN1cHBvcnRlZF9ib290KSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gc3VwcG9ydGVkIEFHUCBicmlkZ2UgZm91bmQuXG4iKTsKKyNpZmRlZiBNT0RVTEUKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJZb3UgY2FuIHRyeSBhZ3BfdHJ5X3Vuc3VwcG9ydGVkPTFcbiIpOworI2Vsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJZb3UgY2FuIGJvb3Qgd2l0aCBhZ3A9dHJ5X3Vuc3VwcG9ydGVkXG4iKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKiBGaXJzdCBjaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIEFNRDY0IE5CICovCisJCWlmICghcGNpX2Rldl9wcmVzZW50KGFtZDY0bmIpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogTG9vayBmb3IgYW55IEFHUCBicmlkZ2UgKi8KKwkJZGV2ID0gTlVMTDsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJCWlmICghcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfQUdQKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIE9ubHkgb25lIGJyaWRnZSBzdXBwb3J0ZWQgcmlnaHQgbm93ICovCisJCQlpZiAoYWdwX2FtZDY0X3Byb2JlKGRldiwgTlVMTCkgPT0gMCkgeworCQkJCWVyciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFncF9hbWQ2NF9jbGVhbnVwKHZvaWQpCit7CisJaWYgKGFwZXJ0dXJlX3Jlc291cmNlKQorCQlyZWxlYXNlX3Jlc291cmNlKGFwZXJ0dXJlX3Jlc291cmNlKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbWQ2NF9wY2lfZHJpdmVyKTsKK30KKworLyogT24gQU1ENjQgdGhlIFBDSSBkcml2ZXIgbmVlZHMgdG8gaW5pdGlhbGl6ZSB0aGlzIGRyaXZlciBlYXJseQorICAgZm9yIHRoZSBJT01NVSwgc28gaXQgaGFzIHRvIGJlIGNhbGxlZCB2aWEgYSBiYWNrZG9vci4gKi8KKyNpZm5kZWYgQ09ORklHX0dBUlRfSU9NTVUKK21vZHVsZV9pbml0KGFncF9hbWQ2NF9pbml0KTsKK21vZHVsZV9leGl0KGFncF9hbWQ2NF9jbGVhbnVwKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4sIEFuZGkgS2xlZW4iKTsKK21vZHVsZV9wYXJhbShhZ3BfdHJ5X3Vuc3VwcG9ydGVkLCBib29sLCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZGRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogQVRpIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8YXNtL2FncC5oPgorI2luY2x1ZGUgImFncC5oIgorCisjZGVmaW5lIEFUSV9HQVJUX01NQkFTRV9BRERSCTB4MTQKKyNkZWZpbmUgQVRJX1JTMTAwX0FQU0laRQkweGFjCisjZGVmaW5lIEFUSV9SUzEwMF9JR19BR1BNT0RFCTB4YjAKKyNkZWZpbmUgQVRJX1JTMzAwX0FQU0laRQkweGY4CisjZGVmaW5lIEFUSV9SUzMwMF9JR19BR1BNT0RFCTB4ZmMKKyNkZWZpbmUgQVRJX0dBUlRfRkVBVFVSRV9JRAkJMHgwMAorI2RlZmluZSBBVElfR0FSVF9CQVNFCQkJMHgwNAorI2RlZmluZSBBVElfR0FSVF9DQUNIRV9TWkJBU0UJCTB4MDgKKyNkZWZpbmUgQVRJX0dBUlRfQ0FDSEVfQ05UUkwJCTB4MGMKKyNkZWZpbmUgQVRJX0dBUlRfQ0FDSEVfRU5UUllfQ05UUkwJMHgxMAorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiBhdGlfZ2VuZXJpY19zaXplc1s3XSA9Cit7CisJezIwNDgsIDUyNDI4OCwgMHgwMDAwMDAwY30sCisJezEwMjQsIDI2MjE0NCwgMHgwMDAwMDAwYX0sCisJezUxMiwgMTMxMDcyLCAweDAwMDAwMDA4fSwKKwl7MjU2LCA2NTUzNiwgMHgwMDAwMDAwNn0sCisJezEyOCwgMzI3NjgsIDB4MDAwMDAwMDR9LAorCXs2NCwgMTYzODQsIDB4MDAwMDAwMDJ9LAorCXszMiwgODE5MiwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGF0aV9nZW5lcmljX21hc2tzW10gPQoreworCXsgLm1hc2sgPSAxLCAudHlwZSA9IDB9Cit9OworCisKKwordHlwZWRlZiBzdHJ1Y3QgX2F0aV9wYWdlX21hcCB7CisJdW5zaWduZWQgbG9uZyAqcmVhbDsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlbWFwcGVkOworfSBhdGlfcGFnZV9tYXA7CisKK3N0YXRpYyBzdHJ1Y3QgX2F0aV9nZW5lcmljX3ByaXZhdGUgeworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwlhdGlfcGFnZV9tYXAgKipnYXR0X3BhZ2VzOworCWludCBudW1fdGFibGVzOworfSBhdGlfZ2VuZXJpY19wcml2YXRlOworCitzdGF0aWMgaW50IGF0aV9jcmVhdGVfcGFnZV9tYXAoYXRpX3BhZ2VfbWFwICpwYWdlX21hcCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCXBhZ2VfbWFwLT5yZWFsID0gKHVuc2lnbmVkIGxvbmcgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlX21hcC0+cmVhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwllcnIgPSBtYXBfcGFnZV9pbnRvX2FncCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlwYWdlX21hcC0+cmVtYXBwZWQgPSBpb3JlbWFwX25vY2FjaGUodmlydF90b19waHlzKHBhZ2VfbWFwLT5yZWFsKSwKKwkJCQkJICAgIFBBR0VfU0laRSk7CisJaWYgKHBhZ2VfbWFwLT5yZW1hcHBlZCA9PSBOVUxMIHx8IGVycikgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7CisJCXBhZ2VfbWFwLT5yZWFsID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qQ0FDSEVfRkxVU0goKTsqLworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJZm9yKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgcGFnZV9tYXAtPnJlbWFwcGVkK2kpOworCQlyZWFkbChwYWdlX21hcC0+cmVtYXBwZWQraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGF0aV9mcmVlX3BhZ2VfbWFwKGF0aV9wYWdlX21hcCAqcGFnZV9tYXApCit7CisJdW5tYXBfcGFnZV9mcm9tX2FncCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlpb3VubWFwKHBhZ2VfbWFwLT5yZW1hcHBlZCk7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2VfbWFwLT5yZWFsKSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7Cit9CisKKworc3RhdGljIHZvaWQgYXRpX2ZyZWVfZ2F0dF9wYWdlcyh2b2lkKQoreworCWludCBpOworCWF0aV9wYWdlX21hcCAqKnRhYmxlczsKKwlhdGlfcGFnZV9tYXAgKmVudHJ5OworCisJdGFibGVzID0gYXRpX2dlbmVyaWNfcHJpdmF0ZS5nYXR0X3BhZ2VzOworCWZvcihpID0gMDsgaSA8IGF0aV9nZW5lcmljX3ByaXZhdGUubnVtX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0gdGFibGVzW2ldOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJaWYgKGVudHJ5LT5yZWFsICE9IE5VTEwpCisJCQkJYXRpX2ZyZWVfcGFnZV9tYXAoZW50cnkpOworCQkJa2ZyZWUoZW50cnkpOworCQl9CisJfQorCWtmcmVlKHRhYmxlcyk7Cit9CisKKworc3RhdGljIGludCBhdGlfY3JlYXRlX2dhdHRfcGFnZXMoaW50IG5yX3RhYmxlcykKK3sKKwlhdGlfcGFnZV9tYXAgKip0YWJsZXM7CisJYXRpX3BhZ2VfbWFwICplbnRyeTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCXRhYmxlcyA9IGttYWxsb2MoKG5yX3RhYmxlcyArIDEpICogc2l6ZW9mKGF0aV9wYWdlX21hcCAqKSwKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAodGFibGVzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHRhYmxlcywgMCwgc2l6ZW9mKGF0aV9wYWdlX21hcCAqKSAqIChucl90YWJsZXMgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoYXRpX3BhZ2VfbWFwKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCQl3aGlsZSAoaT4wKSB7CisJCQkJa2ZyZWUgKHRhYmxlc1tpLTFdKTsKKwkJCQlpLS07CisJCQl9CisJCQlrZnJlZSAodGFibGVzKTsKKwkJCXRhYmxlcyA9IE5VTEw7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoYXRpX3BhZ2VfbWFwKSk7CisJCXRhYmxlc1tpXSA9IGVudHJ5OworCQlyZXR2YWwgPSBhdGlfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKKwkJaWYgKHJldHZhbCAhPSAwKSBicmVhazsKKwl9CisJYXRpX2dlbmVyaWNfcHJpdmF0ZS5udW1fdGFibGVzID0gbnJfdGFibGVzOworCWF0aV9nZW5lcmljX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKKworCWlmIChyZXR2YWwgIT0gMCkgYXRpX2ZyZWVfZ2F0dF9wYWdlcygpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBpc19yMjAwKHZvaWQpCit7CisJaWYgKChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FUSV9SUzEwMCkgfHwKKwkgICAgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjAwKSB8fAorCSAgICAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BVElfUlMyMDBfQikgfHwKKwkgICAgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjUwKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRpX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWVzOworCisJaWYgKGlzX3IyMDAoKSkKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMTAwX0FQU0laRSwgJnRlbXApOworCWVsc2UKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMzAwX0FQU0laRSwgJnRlbXApOworCisJdGVtcCA9ICh0ZW1wICYgMHgwMDAwMDAwZSk7CisJdmFsdWVzID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aV90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSkKK3sKKwl3cml0ZWwoMSwgYXRpX2dlbmVyaWNfcHJpdmF0ZS5yZWdpc3RlcnMrQVRJX0dBUlRfQ0FDSEVfQ05UUkwpOworCXJlYWRsKGF0aV9nZW5lcmljX3ByaXZhdGUucmVnaXN0ZXJzK0FUSV9HQVJUX0NBQ0hFX0NOVFJMKTsJLyogUENJIFBvc3RpbmcuICovCit9CisKK3N0YXRpYyB2b2lkIGF0aV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKnByZXZpb3VzX3NpemU7CisJdTMyIHRlbXA7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisKKwkvKiBXcml0ZSBiYWNrIHRoZSBwcmV2aW91cyBzaXplIGFuZCBkaXNhYmxlIGdhcnQgdHJhbnNsYXRpb24gKi8KKwlpZiAoaXNfcjIwMCgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzEwMF9BUFNJWkUsICZ0ZW1wKTsKKwkJdGVtcCA9ICgodGVtcCAmIH4oMHgwMDAwMDAwZikpIHwgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMxMDBfQVBTSVpFLCB0ZW1wKTsKKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMzMDBfQVBTSVpFLCAmdGVtcCk7CisJCXRlbXAgPSAoKHRlbXAgJiB+KDB4MDAwMDAwMGYpKSB8IHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMzAwX0FQU0laRSwgdGVtcCk7CisJfQorCWlvdW5tYXAoKHZvbGF0aWxlIHU4IF9faW9tZW0gKilhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKKworc3RhdGljIGludCBhdGlfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisKKwkvKiBHZXQgdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX0dBUlRfTU1CQVNFX0FERFIsICZ0ZW1wKTsKKwl0ZW1wID0gKHRlbXAgJiAweGZmZmZmMDAwKTsKKwlhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycyA9ICh2b2xhdGlsZSB1OCBfX2lvbWVtICopIGlvcmVtYXAodGVtcCwgNDA5Nik7CisKKwlpZiAoaXNfcjIwMCgpKQorICAgICAgIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMTAwX0lHX0FHUE1PREUsIDB4MjAwMDApOworCWVsc2UKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzMwMF9JR19BR1BNT0RFLCAweDIwMDAwKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvbyAqLworICAgICAgICAvKgorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UuZ2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklHUDMyMCBnYXJ0X2J1c19hZGRyOiAleFxuIiwgYWdwX2JyaWRnZS5nYXJ0X2J1c19hZGRyKTsKKyAgICAgICAgKi8KKwl3cml0ZWwoMHg2MDAwMCwgYXRpX2dlbmVyaWNfcHJpdmF0ZS5yZWdpc3RlcnMrQVRJX0dBUlRfRkVBVFVSRV9JRCk7CisJcmVhZGwoYXRpX2dlbmVyaWNfcHJpdmF0ZS5yZWdpc3RlcnMrQVRJX0dBUlRfRkVBVFVSRV9JRCk7CS8qIFBDSSBQb3N0aW5nLiovCisKKwkvKiBTSUdOQUxFRF9TWVNURU1fRVJST1IgQCBOQl9TVEFUVVMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCA0LCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIDQsIHRlbXAgfCAoMTw8MTQpKTsKKworCS8qIFdyaXRlIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2F0dCB0YWJsZSAqLworCXdyaXRlbChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyLCBhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycytBVElfR0FSVF9CQVNFKTsKKwlyZWFkbChhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycytBVElfR0FSVF9CQVNFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICpTaW5jZSB3ZSBkb24ndCBuZWVkIGNvbnRpZ2lvdXMgbWVtb3J5IHdlIGp1c3QgdHJ5CisgKiB0byBnZXQgdGhlIGdhdHQgdGFibGUgb25jZQorICovCisKKyNkZWZpbmUgR0VUX1BBR0VfRElSX09GRihhZGRyKSAoYWRkciA+PiAyMikKKyNkZWZpbmUgR0VUX1BBR0VfRElSX0lEWChhZGRyKSAoR0VUX1BBR0VfRElSX09GRihhZGRyKSAtIFwKKwlHRVRfUEFHRV9ESVJfT0ZGKGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIpKQorI2RlZmluZSBHRVRfR0FUVF9PRkYoYWRkcikgKChhZGRyICYgMHgwMDNmZjAwMCkgPj4gMTIpCisjdW5kZWYgIEdFVF9HQVRUCisjZGVmaW5lIEdFVF9HQVRUKGFkZHIpIChhdGlfZ2VuZXJpY19wcml2YXRlLmdhdHRfcGFnZXNbXAorCUdFVF9QQUdFX0RJUl9JRFgoYWRkcildLT5yZW1hcHBlZCkKKworc3RhdGljIGludCBhdGlfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwKKwkJCSAgICAgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBqLCBudW1fZW50cmllczsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKmN1cl9nYXR0OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCW51bV9lbnRyaWVzID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKS0+bnVtX2VudHJpZXM7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaiA9IHBnX3N0YXJ0OworCXdoaWxlIChqIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSkgeworCQlhZGRyID0gKGogKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBHRVRfR0FUVChhZGRyKTsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSxyZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWorKzsKKwl9CisKKwlpZiAobWVtLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCS8qQ0FDSEVfRkxVU0goKTsgKi8KKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQlhZGRyID0gKGogKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBHRVRfR0FUVChhZGRyKTsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLCBjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOworCQlyZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGlfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwgb2ZmX3QgcGdfc3RhcnQsCisJCQkgICAgIGludCB0eXBlKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqY3VyX2dhdHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAobWVtLT5wYWdlX2NvdW50ICsgcGdfc3RhcnQpOyBpKyspIHsKKwkJYWRkciA9IChpICogUEFHRV9TSVpFKSArIGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCWN1cl9nYXR0ID0gR0VUX0dBVFQoYWRkcik7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CisJCXJlYWRsKGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7IC8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRpX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWU7CisJYXRpX3BhZ2VfbWFwIHBhZ2VfZGlyOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgcmV0dmFsOworCXUzMiB0ZW1wOworCWludCBpOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpjdXJyZW50X3NpemU7CisKKwl2YWx1ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisJcmV0dmFsID0gYXRpX2NyZWF0ZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCWlmIChyZXR2YWwgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGF0aV9jcmVhdGVfZ2F0dF9wYWdlcyh2YWx1ZS0+bnVtX2VudHJpZXMgLyAxMDI0KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJYXRpX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopcGFnZV9kaXIucmVhbDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiBfX2lvbWVtICopIHBhZ2VfZGlyLnJlbWFwcGVkOworCWFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cyhwYWdlX2Rpci5yZWFsKTsKKworCS8qIFdyaXRlIG91dCB0aGUgc2l6ZSByZWdpc3RlciAqLworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwlpZiAoaXNfcjIwMCgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzEwMF9BUFNJWkUsICZ0ZW1wKTsKKwkJdGVtcCA9ICgoKHRlbXAgJiB+KDB4MDAwMDAwMGUpKSB8IGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkKKwkJCXwgMHgwMDAwMDAwMSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMxMDBfQVBTSVpFLCB0ZW1wKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMTAwX0FQU0laRSwgJnRlbXApOworCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzMwMF9BUFNJWkUsICZ0ZW1wKTsKKwkJdGVtcCA9ICgoKHRlbXAgJiB+KDB4MDAwMDAwMGUpKSB8IGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkKKwkJCXwgMHgwMDAwMDAwMSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMzMDBfQVBTSVpFLCB0ZW1wKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMzAwX0FQU0laRSwgJnRlbXApOworCX0KKworCS8qCisJICogR2V0IHRoZSBhZGRyZXNzIGZvciB0aGUgZ2FydCByZWdpb24uCisJICogVGhpcyBpcyBhIGJ1cyBhZGRyZXNzIGV2ZW4gb24gdGhlIGFscGhhLCBiL2MgaXRzCisJICogdXNlZCB0byBwcm9ncmFtIHRoZSBhZ3AgbWFzdGVyIG5vdCB0aGUgY3B1CisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSBhZGRyOworCisJLyogQ2FsY3VsYXRlIHRoZSBhZ3Agb2Zmc2V0ICovCisJZm9yKGkgPSAwOyBpIDwgdmFsdWUtPm51bV9lbnRyaWVzIC8gMTAyNDsgaSsrLCBhZGRyICs9IDB4MDA0MDAwMDApIHsKKwkJd3JpdGVsKHZpcnRfdG9fYnVzKGF0aV9nZW5lcmljX3ByaXZhdGUuZ2F0dF9wYWdlc1tpXS0+cmVhbCkgfCAxLAorCQkJcGFnZV9kaXIucmVtYXBwZWQrR0VUX1BBR0VfRElSX09GRihhZGRyKSk7CisJCXJlYWRsKHBhZ2VfZGlyLnJlbWFwcGVkK0dFVF9QQUdFX0RJUl9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGlfZnJlZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlhdGlfcGFnZV9tYXAgcGFnZV9kaXI7CisKKwlwYWdlX2Rpci5yZWFsID0gKHVuc2lnbmVkIGxvbmcgKilhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWw7CisJcGFnZV9kaXIucmVtYXBwZWQgPSAodW5zaWduZWQgbG9uZyBfX2lvbWVtICopYWdwX2JyaWRnZS0+Z2F0dF90YWJsZTsKKworCWF0aV9mcmVlX2dhdHRfcGFnZXMoKTsKKwlhdGlfZnJlZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYXRpX2dlbmVyaWNfYnJpZGdlID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGF0aV9nZW5lcmljX3NpemVzLAorCS5zaXplX3R5cGUJCT0gTFZMMl9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBhdGlfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGF0aV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGF0aV9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gYXRpX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGF0aV9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGF0aV9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYXRpX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhdGlfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhdGlfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworCitzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIGF0aV9hZ3BfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGRhdGEgPQoreworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMTAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDMyMC9NIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDMzMC8zNDAvMzQ1LzM1MC9NIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjAwX0IsCisJCS5jaGlwc2V0X25hbWUJPSAiSUdQMzQ1TSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FUSV9SUzI1MCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJJR1A3MDAwL00iLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BVElfUlMzMDBfMTAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDkxMDAvTSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FUSV9SUzMwMF8xMzMsCisJCS5jaGlwc2V0X25hbWUJPSAiSUdQOTEwMC9NIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMzAwXzE2NiwKKwkJLmNoaXBzZXRfbmFtZQk9ICJJR1A5MTAwL00iLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BVElfUlMzMDBfMjAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDkxMDAvTSIsCisJfSwKKwl7IH0sIC8qIGR1bW15IGZpbmFsIGVudHJ5LCBhbHdheXMgcHJlc2VudCAqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX2F0aV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfZGV2aWNlX2lkcyAqZGV2cyA9IGF0aV9hZ3BfZGV2aWNlX2lkczsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJdTggY2FwX3B0cjsKKwlpbnQgajsKKworCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwlpZiAoIWNhcF9wdHIpCisJCXJldHVybiAtRU5PREVWOworCisJLyogcHJvYmUgZm9yIGtub3duIGNoaXBzZXRzICovCisJZm9yIChqID0gMDsgZGV2c1tqXS5jaGlwc2V0X25hbWU7IGorKykgeworCQlpZiAocGRldi0+ZGV2aWNlID09IGRldnNbal0uZGV2aWNlX2lkKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgUEZYCisJICAgICAiVW5zdXBwb3J0ZWQgQXRpIGNoaXBzZXQgKGRldmljZSBpZDogJTA0eClcbiIsIHBkZXYtPmRldmljZSk7CisJcmV0dXJuIC1FTk9ERVY7CisKK2ZvdW5kOgorCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCQorCWJyaWRnZS0+ZHJpdmVyID0gJmF0aV9nZW5lcmljX2JyaWRnZTsKKworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIEF0aSAlcyBjaGlwc2V0XG4iLAorCQkJZGV2c1tqXS5jaGlwc2V0X25hbWUpOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJYnJpZGdlLT5jYXBuZHgrUENJX0FHUF9TVEFUVVMsCisJCQkmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2F0aV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX2F0aV9wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQVRJLAorCS5kZXZpY2UJCT0gUENJX0FOWV9JRCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF9hdGlfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hdGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWdwZ2FydC1hdGkiLAorCS5pZF90YWJsZQk9IGFncF9hdGlfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYXRpX3Byb2JlLAorCS5yZW1vdmUJCT0gYWdwX2F0aV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfYXRpX2luaXQodm9pZCkKK3sKKwlpZiAoYWdwX29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFncF9hdGlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfYXRpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9hdGlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFncF9hdGlfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfYXRpX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NDJmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2JhY2tlbmQuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIEFHUEdBUlQgZHJpdmVyIGJhY2tlbmQgcm91dGluZXMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRGF2ZSBKb25lcy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBKZWZmIEhhcnRtYW5uLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIERBVkUgSk9ORVMsIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRQorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVE9ETzoKKyAqIC0gQWxsb2NhdGUgbW9yZSB0aGFuIG9yZGVyIDAgcGFnZXMgdG8gYXZvaWQgdG9vIG11Y2ggbGluZWFyIG1hcCBzcGxpdHRpbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworLyogRHVlIHRvIFhGcmVlODYgYnJhaW4tZGFtYWdlLCB3ZSBjYW4ndCBnbyB0byAxLjAgdW50aWwgdGhleQorICogZml4IHNvbWUgcmVhbCBzdHVwaWRpdHkuIEl0J3Mgb25seSBieSBjaGFuY2Ugd2UgY2FuIGJ1bXAKKyAqIHBhc3QgMC45OSBhdCBhbGwgZHVlIHRvIHNvbWUgYm9vbGVhbiBsb2dpYyBlcnJvci4gKi8KKyNkZWZpbmUgQUdQR0FSVF9WRVJTSU9OX01BSk9SIDAKKyNkZWZpbmUgQUdQR0FSVF9WRVJTSU9OX01JTk9SIDEwMQorc3RhdGljIHN0cnVjdCBhZ3BfdmVyc2lvbiBhZ3BfY3VycmVudF92ZXJzaW9uID0KK3sKKwkubWFqb3IgPSBBR1BHQVJUX1ZFUlNJT05fTUFKT1IsCisJLm1pbm9yID0gQUdQR0FSVF9WRVJTSU9OX01JTk9SLAorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKCphZ3BfZmluZF9icmlkZ2UpKHN0cnVjdCBwY2lfZGV2ICopID0KKwkmYWdwX2dlbmVyaWNfZmluZF9icmlkZ2U7CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9icmlkZ2U7CitMSVNUX0hFQUQoYWdwX2JyaWRnZXMpOworRVhQT1JUX1NZTUJPTChhZ3BfYnJpZGdlKTsKK0VYUE9SVF9TWU1CT0woYWdwX2JyaWRnZXMpOworRVhQT1JUX1NZTUJPTChhZ3BfZmluZF9icmlkZ2UpOworCisvKioKKyAqCWFncF9iYWNrZW5kX2FjcXVpcmUgIC0gIGF0dGVtcHQgdG8gYWNxdWlyZSBhbiBhZ3AgYmFja2VuZC4KKyAqCisgKi8KK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9iYWNrZW5kX2FjcXVpcmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCisJYnJpZGdlID0gYWdwX2ZpbmRfYnJpZGdlKHBkZXYpOworCisJaWYgKCFicmlkZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKGF0b21pY19yZWFkKCZicmlkZ2UtPmFncF9pbl91c2UpKQorCQlyZXR1cm4gTlVMTDsKKwlhdG9taWNfaW5jKCZicmlkZ2UtPmFncF9pbl91c2UpOworCXJldHVybiBicmlkZ2U7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9iYWNrZW5kX2FjcXVpcmUpOworCisKKy8qKgorICoJYWdwX2JhY2tlbmRfcmVsZWFzZSAgLSAgcmVsZWFzZSB0aGUgbG9jayBvbiB0aGUgYWdwIGJhY2tlbmQuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGluc3VyZSB0aGF0IHRoZSBncmFwaGljcyBhcGVydHVyZSB0cmFuc2xhdGlvbiB0YWJsZQorICoJaXMgcmVhZCBmb3IgdXNlIGJ5IGFub3RoZXIgZW50aXR5LgorICoKKyAqCShFbnN1cmUgdGhhdCBhbGwgbWVtb3J5IGl0IGJvdW5kIGlzIHVuYm91bmQuKQorICovCit2b2lkIGFncF9iYWNrZW5kX3JlbGVhc2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCisJaWYgKGJyaWRnZSkKKwkJYXRvbWljX2RlYygmYnJpZGdlLT5hZ3BfaW5fdXNlKTsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2JhY2tlbmRfcmVsZWFzZSk7CisKKworc3RydWN0IHsgaW50IG1lbSwgYWdwOyB9IG1heGVzX3RhYmxlW10gPSB7CisJezAsIDB9LAorCXszMiwgNH0sCisJezY0LCAyOH0sCisJezEyOCwgOTZ9LAorCXsyNTYsIDIwNH0sCisJezUxMiwgNDQwfSwKKwl7MTAyNCwgOTQyfSwKKwl7MjA0OCwgMTkyMH0sCisJezQwOTYsIDM5MzJ9Cit9OworCitzdGF0aWMgaW50IGFncF9maW5kX21heCh2b2lkKQoreworCWxvbmcgbWVtb3J5LCBpbmRleCwgcmVzdWx0OworCisjaWYgUEFHRV9TSElGVCA8IDIwCisJbWVtb3J5ID0gbnVtX3BoeXNwYWdlcyA+PiAoMjAgLSBQQUdFX1NISUZUKTsKKyNlbHNlCisJbWVtb3J5ID0gbnVtX3BoeXNwYWdlcyA8PCAoUEFHRV9TSElGVCAtIDIwKTsKKyNlbmRpZgorCWluZGV4ID0gMTsKKworCXdoaWxlICgobWVtb3J5ID4gbWF4ZXNfdGFibGVbaW5kZXhdLm1lbSkgJiYgKGluZGV4IDwgOCkpCisJCWluZGV4Kys7CisKKwlyZXN1bHQgPSBtYXhlc190YWJsZVtpbmRleCAtIDFdLmFncCArCisJICAgKCAobWVtb3J5IC0gbWF4ZXNfdGFibGVbaW5kZXggLSAxXS5tZW0pICAqCisJICAgICAobWF4ZXNfdGFibGVbaW5kZXhdLmFncCAtIG1heGVzX3RhYmxlW2luZGV4IC0gMV0uYWdwKSkgLworCSAgIChtYXhlc190YWJsZVtpbmRleF0ubWVtIC0gbWF4ZXNfdGFibGVbaW5kZXggLSAxXS5tZW0pOworCisJcmVzdWx0ID0gcmVzdWx0IDw8ICgyMCAtIFBBR0VfU0hJRlQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludCBhZ3BfYmFja2VuZF9pbml0aWFsaXplKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpbnQgc2l6ZV92YWx1ZSwgcmMsIGdvdF9nYXR0PTAsIGdvdF9rZXlsaXN0PTA7CisKKwlicmlkZ2UtPm1heF9tZW1vcnlfYWdwID0gYWdwX2ZpbmRfbWF4KCk7CisJYnJpZGdlLT52ZXJzaW9uID0gJmFncF9jdXJyZW50X3ZlcnNpb247CisKKwlpZiAoYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgeworCQl2b2lkICphZGRyID0gYnJpZGdlLT5kcml2ZXItPmFncF9hbGxvY19wYWdlKGJyaWRnZSk7CisKKwkJaWYgKCFhZGRyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gZ2V0IG1lbW9yeSBmb3Igc2NyYXRjaCBwYWdlLlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWJyaWRnZS0+c2NyYXRjaF9wYWdlX3JlYWwgPSB2aXJ0X3RvX3BoeXMoYWRkcik7CisJCWJyaWRnZS0+c2NyYXRjaF9wYWdlID0KKwkJICAgIGJyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShicmlkZ2UsIGJyaWRnZS0+c2NyYXRjaF9wYWdlX3JlYWwsIDApOworCX0KKworCXNpemVfdmFsdWUgPSBicmlkZ2UtPmRyaXZlci0+ZmV0Y2hfc2l6ZSgpOworCWlmIChzaXplX3ZhbHVlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGRldGVybWluZSBhcGVydHVyZSBzaXplLlxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoYnJpZGdlLT5kcml2ZXItPmNyZWF0ZV9nYXR0X3RhYmxlKGJyaWRnZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgInVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBncmFwaGljcyB0cmFuc2xhdGlvbiB0YWJsZS5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZ290X2dhdHQgPSAxOworCisJYnJpZGdlLT5rZXlfbGlzdCA9IHZtYWxsb2MoUEFHRV9TSVpFICogNCk7CisJaWYgKGJyaWRnZS0+a2V5X2xpc3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3Iga2V5IGxpc3RzLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlnb3Rfa2V5bGlzdCA9IDE7CisKKwkvKiBGSVhNRSB2bWFsbG9jJ2QgbWVtb3J5IG5vdCBndWFyYW50ZWVkIGNvbnRpZ3VvdXMgKi8KKwltZW1zZXQoYnJpZGdlLT5rZXlfbGlzdCwgMCwgUEFHRV9TSVpFICogNCk7CisKKwlpZiAoYnJpZGdlLT5kcml2ZXItPmNvbmZpZ3VyZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVycm9yIGNvbmZpZ3VyaW5nIGhvc3QgY2hpcHNldC5cbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlpZiAoYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkKKwkJYnJpZGdlLT5kcml2ZXItPmFncF9kZXN0cm95X3BhZ2UoCisJCQkJcGh5c190b192aXJ0KGJyaWRnZS0+c2NyYXRjaF9wYWdlX3JlYWwpKTsKKwlpZiAoZ290X2dhdHQpCisJCWJyaWRnZS0+ZHJpdmVyLT5mcmVlX2dhdHRfdGFibGUoYnJpZGdlKTsKKwlpZiAoZ290X2tleWxpc3QpIHsKKwkJdmZyZWUoYnJpZGdlLT5rZXlfbGlzdCk7CisJCWJyaWRnZS0+a2V5X2xpc3QgPSBOVUxMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNhbm5vdCBiZSBfX2V4aXQgYi9jIGFzIGl0IGNvdWxkIGJlIGNhbGxlZCBmcm9tIF9faW5pdCBjb2RlICovCitzdGF0aWMgdm9pZCBhZ3BfYmFja2VuZF9jbGVhbnVwKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpZiAoYnJpZGdlLT5kcml2ZXItPmNsZWFudXApCisJCWJyaWRnZS0+ZHJpdmVyLT5jbGVhbnVwKCk7CisJaWYgKGJyaWRnZS0+ZHJpdmVyLT5mcmVlX2dhdHRfdGFibGUpCisJCWJyaWRnZS0+ZHJpdmVyLT5mcmVlX2dhdHRfdGFibGUoYnJpZGdlKTsKKwlpZiAoYnJpZGdlLT5rZXlfbGlzdCkgeworCQl2ZnJlZShicmlkZ2UtPmtleV9saXN0KTsKKwkJYnJpZGdlLT5rZXlfbGlzdCA9IE5VTEw7CisJfQorCisJaWYgKGJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlICYmCisJICAgIGJyaWRnZS0+ZHJpdmVyLT5uZWVkc19zY3JhdGNoX3BhZ2UpCisJCWJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlKAorCQkJCXBoeXNfdG9fdmlydChicmlkZ2UtPnNjcmF0Y2hfcGFnZV9yZWFsKSk7Cit9CisKKy8qIFdoZW4gd2UgcmVtb3ZlIHRoZSBnbG9iYWwgdmFyaWFibGUgYWdwX2JyaWRnZSBmcm9tIGFsbCBkcml2ZXJzCisgKiB0aGVuIGFncF9hbGxvY19icmlkZ2UgYW5kIGFncF9nZW5lcmljX2ZpbmRfYnJpZGdlIG5lZWQgdG8gYmUgdXBkYXRlZAorICovCisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9hbGxvY19icmlkZ2Uodm9pZCkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBrbWFsbG9jKHNpemVvZigqYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoYnJpZGdlLCAwLCBzaXplb2YoKmJyaWRnZSkpOworCWF0b21pY19zZXQoJmJyaWRnZS0+YWdwX2luX3VzZSwgMCk7CisJYXRvbWljX3NldCgmYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3AsIDApOworCisJaWYgKGxpc3RfZW1wdHkoJmFncF9icmlkZ2VzKSkKKwkJYWdwX2JyaWRnZSA9IGJyaWRnZTsKKworCXJldHVybiBicmlkZ2U7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9hbGxvY19icmlkZ2UpOworCisKK3ZvaWQgYWdwX3B1dF9icmlkZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworICAgICAgICBrZnJlZShicmlkZ2UpOworCisgICAgICAgIGlmIChsaXN0X2VtcHR5KCZhZ3BfYnJpZGdlcykpCisgICAgICAgICAgICAgICAgYWdwX2JyaWRnZSA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9wdXRfYnJpZGdlKTsKKworCitpbnQgYWdwX2FkZF9icmlkZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWludCBlcnJvcjsKKworCWlmIChhZ3Bfb2ZmKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghYnJpZGdlLT5kZXYpIHsKKwkJcHJpbnRrIChLRVJOX0RFQlVHIFBGWCAiRXJrLCByZWdpc3RlcmluZyB3aXRoIG5vIHBjaV9kZXYhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR3JhYiByZWZlcmVuY2Ugb24gdGhlIGNoaXBzZXQgZHJpdmVyLiAqLworCWlmICghdHJ5X21vZHVsZV9nZXQoYnJpZGdlLT5kcml2ZXItPm93bmVyKSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNvdWxkbid0IGxvY2sgY2hpcHNldCBkcml2ZXIuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyb3IgPSBhZ3BfYmFja2VuZF9pbml0aWFsaXplKGJyaWRnZSk7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiYWdwX2JhY2tlbmRfaW5pdGlhbGl6ZSgpIGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmFncF9icmlkZ2VzKSkgeworCQllcnJvciA9IGFncF9mcm9udGVuZF9pbml0aWFsaXplKCk7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJhZ3BfZnJvbnRlbmRfaW5pdGlhbGl6ZSgpIGZhaWxlZC5cbiIpOworCQkJZ290byBmcm9udGVuZF9lcnI7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQUdQIGFwZXJ0dXJlIGlzICVkTSBAIDB4JWx4XG4iLAorCQkJYnJpZGdlLT5kcml2ZXItPmZldGNoX3NpemUoKSwgYnJpZGdlLT5nYXJ0X2J1c19hZGRyKTsKKworCX0KKworCWxpc3RfYWRkKCZicmlkZ2UtPmxpc3QsICZhZ3BfYnJpZGdlcyk7CisJcmV0dXJuIDA7CisKK2Zyb250ZW5kX2VycjoKKwlhZ3BfYmFja2VuZF9jbGVhbnVwKGJyaWRnZSk7CitlcnJfb3V0OgorCW1vZHVsZV9wdXQoYnJpZGdlLT5kcml2ZXItPm93bmVyKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFncF9hZGRfYnJpZGdlKTsKKworCit2b2lkIGFncF9yZW1vdmVfYnJpZGdlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlhZ3BfYmFja2VuZF9jbGVhbnVwKGJyaWRnZSk7CisJbGlzdF9kZWwoJmJyaWRnZS0+bGlzdCk7CisJaWYgKGxpc3RfZW1wdHkoJmFncF9icmlkZ2VzKSkKKwkJYWdwX2Zyb250ZW5kX2NsZWFudXAoKTsKKwltb2R1bGVfcHV0KGJyaWRnZS0+ZHJpdmVyLT5vd25lcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZ3BfcmVtb3ZlX2JyaWRnZSk7CisKK2ludCBhZ3Bfb2ZmOworaW50IGFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdDsKK0VYUE9SVF9TWU1CT0woYWdwX29mZik7CitFWFBPUlRfU1lNQk9MKGFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFncF9pbml0KHZvaWQpCit7CisJaWYgKCFhZ3Bfb2ZmKQorCQlwcmludGsoS0VSTl9JTkZPICJMaW51eCBhZ3BnYXJ0IGludGVyZmFjZSB2JWQuJWQgKGMpIERhdmUgSm9uZXNcbiIsCisJCQlBR1BHQVJUX1ZFUlNJT05fTUFKT1IsIEFHUEdBUlRfVkVSU0lPTl9NSU5PUik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGFncF9leGl0KHZvaWQpCit7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgX19pbml0IGludCBhZ3Bfc2V0dXAoY2hhciAqcykKK3sKKwlpZiAoIXN0cmNtcChzLCJvZmYiKSkKKwkJYWdwX29mZiA9IDE7CisJaWYgKCFzdHJjbXAocywidHJ5X3Vuc3VwcG9ydGVkIikpCisJCWFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdCA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJhZ3A9IiwgYWdwX3NldHVwKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUdQIEdBUlQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoQUdQR0FSVF9NSU5PUik7CisKK21vZHVsZV9pbml0KGFncF9pbml0KTsKK21vZHVsZV9leGl0KGFncF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjMGEwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBUcmFuc21ldGEncyBFZmZpY2VvbiBBR1BHQVJUIGRyaXZlci4KKyAqIAorICogQmFzZWQgdXBvbiBhIGRpZmYgYnkgTGludXMgYXJvdW5kIE5vdmVtYmVyICcwMi4KKyAqCisgKiBQb3J0ZWQgdG8gdGhlIDIuNiBrZXJuZWwgYnkgQ2FybG9zIFB1Y2hvbCA8Y3BnbGludXhAcHVjaG9sLmNvbT4KKyAqIGFuZCBILiBQZXRlciBBbnZpbiA8aHBhQHRyYW5zbWV0YS5jb20+LgorICovCisKKy8qCisgKiBOT1RFLWNwZy0wNDAyMTc6CisgKiAKKyAqICAgLSB3aGVuIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBhZnRlciBsb2FkaW5nIHRoZSBtb2R1bGUsCisgKiAgICAgaXQgd2lsbCByZWZ1c2UgdG8gdW5sb2FkLCBpbmRpY2F0aW5nIGl0IGlzIGluIHVzZSwKKyAqICAgICB3aGVuIGl0IGlzIG5vdC4KKyAqICAgLSBubyBzMyAoc3VzcGVuZCB0byByYW0pIHRlc3RpbmcuCisgKiAgIC0gdGVzdGVkIG9uIHRoZSBlZmZpY2VvbiBpbnRlZ3JhdGVkIG5vdGhicmlkZ2UgZm9yIHRlbnMKKyAqICAgICBvZiBpdGVyYXRpb25zIG9mIHN0YXJ0aW5nIHggYW5kIGdseGdlYXJzLgorICogICAtIHRlc3RlZCB3aXRoIHJhZGVvbiA5MDAwIGFuZCByYWRlb24gbW9iaWxpdHkgbTkgY2FyZHMKKyAqICAgLSB0ZXN0ZWQgd2l0aCBjMy9jNCBlbmFibGVkICh3aXRoIHRoZSBtb2JpbGl0eSBtOSBjYXJkKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworLyoKKyAqIFRoZSByZWFsIGRpZmZlcmVuY2VzIHRvIHRoZSBnZW5lcmljIEFHUCBjb2RlIGlzCisgKiBpbiB0aGUgR0FSVCBtYXBwaW5ncyAtIGEgdHdvLWxldmVsIHNldHVwIHdpdGggdGhlCisgKiBmaXJzdCBsZXZlbCBiZWluZyBhbiBvbi1jaGlwIDY0LWVudHJ5IHRhYmxlLgorICoKKyAqIFRoZSBwYWdlIGFycmF5IGlzIGZpbGxlZCB0aHJvdWdoIHRoZSBBVFRQQUdFIHJlZ2lzdGVyCisgKiAoQXBlcnR1cmUgVHJhbnNsYXRpb24gVGFibGUgUGFnZSBSZWdpc3RlcikgYXQgMHhCOC4gQml0czoKKyAqICAzMToyMDogcGh5c2ljYWwgcGFnZSBhZGRyZXNzCisgKiAgIDExOjk6IFBhZ2UgQXR0cmlidXRlIFRhYmxlIEluZGV4IChQQVRJKQorICoJICAgbXVzdCBtYXRjaCB0aGUgUEFUIGluZGV4IGZvciB0aGUKKyAqCSAgIG1hcHBlZCBwYWdlcyAodGhlIDJuZCBsZXZlbCBwYWdlIHRhYmxlIHBhZ2VzCisgKgkgICB0aGVtc2VsdmVzIHNob3VsZCBiZSBqdXN0IHJlZ3VsYXIgV0ItY2FjaGVhYmxlLAorICoJICAgc28gdGhpcyBpcyBub3JtYWxseSB6ZXJvLikKKyAqICAgICAgODogUHJlc2VudAorICogICAgNzo2OiByZXNlcnZlZCwgd3JpdGUgYXMgemVybworICogICAgNTowOiBHQVRUIGRpcmVjdG9yeSBpbmRleDogd2hpY2ggMXN0LWxldmVsIGVudHJ5CisgKiAKKyAqIFRoZSBFZmZpY2VvbiBBR1Agc3BlYyByZXF1aXJlcyBwYWdlcyB0byBiZSBXQi1jYWNoZWFibGUKKyAqIGJ1dCB0byBiZSBleHBsaWNpdGx5IENMRkxVU0gnZCBhZnRlciBhbnkgY2hhbmdlcy4KKyAqLworI2RlZmluZSBFRkZJQ0VPTl9BVFRQQUdFCTB4YjgKKyNkZWZpbmUgRUZGSUNFT05fTDFfU0laRQk2NAkvKiBOdW1iZXIgb2YgUERFIHBhZ2VzICovCisKKyNkZWZpbmUgRUZGSUNFT05fUEFUSQkJKDAgPDwgOSkKKyNkZWZpbmUgRUZGSUNFT05fUFJFU0VOVAkoMSA8PCA4KQorCitzdGF0aWMgc3RydWN0IF9lZmZpY2Vvbl9wcml2YXRlIHsKKwl1bnNpZ25lZCBsb25nIGwxX3RhYmxlW0VGRklDRU9OX0wxX1NJWkVdOworfSBlZmZpY2Vvbl9wcml2YXRlOworCitzdGF0aWMgc3RydWN0IGdhdHRfbWFzayBlZmZpY2Vvbl9nZW5lcmljX21hc2tzW10gPQoreworCXsubWFzayA9IDB4MDAwMDAwMDEsIC50eXBlID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiBlZmZpY2Vvbl9nZW5lcmljX3NpemVzWzRdID0KK3sKKwl7MjU2LCA2NTUzNiwgMH0sCisJezEyOCwgMzI3NjgsIDMyfSwKKwl7NjQsIDE2Mzg0LCA0OH0sCisJezMyLCA4MTkyLCA1Nn0KK307CisKKy8qCisgKiBDb250cm9sIGludGVyZmFjZXMgYXJlIGxhcmdlbHkgaWRlbnRpY2FsIHRvCisgKiB0aGUgbGVnYWN5IEludGVsIDQ0MEJYLi4KKyAqLworCitzdGF0aWMgaW50IGVmZmljZW9uX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MTYgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsICZ0ZW1wKTsKKwl2YWx1ZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWZmaWNlb25fdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKiBtZW0pCit7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl90bGJmbHVzaCgpXG4iKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgyMjAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgyMjgwKTsKK30KKworc3RhdGljIHZvaWQgZWZmaWNlb25fY2xlYW51cCh2b2lkKQoreworCXUxNiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpwcmV2aW91c19zaXplOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl9jbGVhbnVwKClcbiIpOworCXByZXZpb3VzX3NpemUgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywgdGVtcCAmIH4oMSA8PCA5KSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLAorCQkJICAgICAgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZWZmaWNlb25fY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpjdXJyZW50X3NpemU7CisKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggImVmZmljZW9uX2NvbmZpZ3VyZSgpXG4iKTsKKwkKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwKKwkJCSAgICAgIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGFncGN0cmwgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgyMjgwKTsKKworCS8qIHBhY2NmZy9uYnhjZmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywgJnRlbXAyKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsCisJCQkgICAgICAodGVtcDIgJiB+KDEgPDwgMTApKSB8ICgxIDw8IDkpIHwgKDEgPDwgMTEpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0VSUlNUUyArIDEsIDcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmZmljZW9uX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IGluZGV4LCBmcmVlZCA9IDA7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBFRkZJQ0VPTl9MMV9TSVpFOyBpbmRleCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGFnZSA9IGVmZmljZW9uX3ByaXZhdGUubDFfdGFibGVbaW5kZXhdOworCQlpZiAocGFnZSkgeworCQkJZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleF0gPSAwOworCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKChjaGFyICopcGFnZSkpOworCQkJZnJlZV9wYWdlKHBhZ2UpOworCQkJZnJlZWQrKzsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggImVmZmljZW9uX2ZyZWVfZ2F0dF90YWJsZSglcCwgJTAyeCwgJTA4eClcbiIsCisJCQlhZ3BfYnJpZGdlLT5kZXYsIEVGRklDRU9OX0FUVFBBR0UsIGluZGV4KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsCisJCQlFRkZJQ0VPTl9BVFRQQUdFLCBpbmRleCk7CisJfQorCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZWZmaWNlb25fZnJlZV9nYXR0X3RhYmxlKCkgZnJlZWQgJWQgcGFnZXNcbiIsIGZyZWVkKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU2luY2Ugd2UgZG9uJ3QgbmVlZCBjb250aWdpb3VzIG1lbW9yeSB3ZSBqdXN0IHRyeQorICogdG8gZ2V0IHRoZSBnYXR0IHRhYmxlIG9uY2UKKyAqLworCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgKGFkZHIgPj4gMjIpCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9JRFgoYWRkcikgKEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgLSBcCisJR0VUX1BBR0VfRElSX09GRihhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyKSkKKyNkZWZpbmUgR0VUX0dBVFRfT0ZGKGFkZHIpICgoYWRkciAmIDB4MDAzZmYwMDApID4+IDEyKQorI3VuZGVmICBHRVRfR0FUVAorI2RlZmluZSBHRVRfR0FUVChhZGRyKSAoZWZmaWNlb25fcHJpdmF0ZS5nYXR0X3BhZ2VzW1wKKwlHRVRfUEFHRV9ESVJfSURYKGFkZHIpXS0+cmVtYXBwZWQpCisKK3N0YXRpYyBpbnQgZWZmaWNlb25fY3JlYXRlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWludCBpbmRleDsKKwljb25zdCBpbnQgcGF0aSAgICA9IEVGRklDRU9OX1BBVEk7CisJY29uc3QgaW50IHByZXNlbnQgPSBFRkZJQ0VPTl9QUkVTRU5UOworCWNvbnN0IGludCBjbGZsdXNoX2NodW5rID0gKChjcHVpZF9lYngoMSkgPj4gOCkgJiAweGZmKSA8PCAzOworCWludCBudW1fZW50cmllcywgbDFfcGFnZXM7CisJCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZWZmaWNlb25fY3JlYXRlX2dhdHRfdGFibGUoJWQpXG4iLCBudW1fZW50cmllcyk7CisKKwkvKiBUaGVyZSBhcmUgMl4xMCBQVEUgcGFnZXMgcGVyIFBERSBwYWdlICovCisJQlVHX09OKG51bV9lbnRyaWVzICYgMHgzZmYpOworCWwxX3BhZ2VzID0gbnVtX2VudHJpZXMgPj4gMTA7CisKKwlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgbDFfcGFnZXMgOyBpbmRleCsrKSB7CisJCWludCBvZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCQlwYWdlID0gZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleF07CisJCUJVR19PTihwYWdlKTsKKworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCWVmZmljZW9uX2ZyZWVfZ2F0dF90YWJsZShhZ3BfYnJpZGdlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoKGNoYXIgKilwYWdlKSk7CisKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBQQUdFX1NJWkU7IG9mZnNldCArPSBjbGZsdXNoX2NodW5rKQorCQkJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICUwIiA6IDogIm0iICgqKGNoYXIgKikocGFnZStvZmZzZXQpKSk7CisKKwkJZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleF0gPSBwYWdlOworCisJCXZhbHVlID0gX19wYShwYWdlKSB8IHBhdGkgfCBwcmVzZW50IHwgaW5kZXg7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsCisJCQlFRkZJQ0VPTl9BVFRQQUdFLCB2YWx1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZmaWNlb25faW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBjb3VudCA9IG1lbS0+cGFnZV9jb3VudCwgbnVtX2VudHJpZXM7CisJdW5zaWduZWQgaW50ICpwYWdlLCAqbGFzdF9wYWdlOworCWNvbnN0IGludCBjbGZsdXNoX2NodW5rID0gKChjcHVpZF9lYngoMSkgPj4gOCkgJiAweGZmKSA8PCAzOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY2xmbHVzaF9tYXNrID0gfihjbGZsdXNoX2NodW5rLTEpOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl9pbnNlcnRfbWVtb3J5KCVseCwgJWQpXG4iLCBwZ19zdGFydCwgY291bnQpOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJbGFzdF9wYWdlID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpbnQgaW5kZXggPSBwZ19zdGFydCArIGk7CisJCXVuc2lnbmVkIGxvbmcgaW5zZXJ0ID0gbWVtLT5tZW1vcnlbaV07CisKKwkJcGFnZSA9ICh1bnNpZ25lZCBpbnQgKikgZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleCA+PiAxMF07CisKKwkJaWYgKCFwYWdlKQorCQkJY29udGludWU7CisJCQorCQlwYWdlICs9IChpbmRleCAmIDB4M2ZmKTsKKwkJKnBhZ2UgPSBpbnNlcnQ7CisKKwkJLyogY2xmbHVzaCBpcyBzbG93LCBzbyBkb24ndCBjbGZsdXNoIHVudGlsIHdlIGhhdmUgdG8gKi8KKwkJaWYgKCBsYXN0X3BhZ2UgJiYgCisJCSAgICAgKCh1bnNpZ25lZCBsb25nKXBhZ2VeKHVuc2lnbmVkIGxvbmcpbGFzdF9wYWdlKSAmIGNsZmx1c2hfbWFzayApCisJCSAgICBhc20gdm9sYXRpbGUoImNsZmx1c2ggJTAiIDogOiAibSIgKCpsYXN0X3BhZ2UpKTsKKworCQlsYXN0X3BhZ2UgPSBwYWdlOworCX0KKworCWlmICggbGFzdF9wYWdlICkKKwkJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICUwIiA6IDogIm0iICgqbGFzdF9wYWdlKSk7CisKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmZmljZW9uX3JlbW92ZV9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKiBtZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpbnQgaSwgY291bnQgPSBtZW0tPnBhZ2VfY291bnQsIG51bV9lbnRyaWVzOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl9yZW1vdmVfbWVtb3J5KCVseCwgJWQpXG4iLCBwZ19zdGFydCwgY291bnQpOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaW50IGluZGV4ID0gcGdfc3RhcnQgKyBpOworCQl1bnNpZ25lZCBpbnQgKnBhZ2UgPSAodW5zaWduZWQgaW50ICopIGVmZmljZW9uX3ByaXZhdGUubDFfdGFibGVbaW5kZXggPj4gMTBdOworCisJCWlmICghcGFnZSkKKwkJCWNvbnRpbnVlOworCQlwYWdlICs9IChpbmRleCAmIDB4M2ZmKTsKKwkJKnBhZ2UgPSAwOworCX0KKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBlZmZpY2Vvbl9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gZWZmaWNlb25fZ2VuZXJpY19zaXplcywKKwkuc2l6ZV90eXBlCQk9IExWTDJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA0LAorCS5jb25maWd1cmUJCT0gZWZmaWNlb25fY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGVmZmljZW9uX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gZWZmaWNlb25fY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGVmZmljZW9uX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGVmZmljZW9uX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisKKwkvLyBFZmZpY2Vvbi1zcGVjaWZpYyBHQVRUIHRhYmxlIHNldHVwIC8gcG9wdWxhdGUgLyB0ZWFyZG93bgorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGVmZmljZW9uX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBlZmZpY2Vvbl9mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gZWZmaWNlb25faW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBlZmZpY2Vvbl9yZW1vdmVfbWVtb3J5LAorCS5jYW50X3VzZV9hcGVydHVyZQk9IDAsCS8vIDEgbWlnaHQgYmUgZmFzdGVyPworCisJLy8gR2VuZXJpYworCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCisKK3N0YXRpYyBpbnQgYWdwX2VmZmljZW9uX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggImFncF9lZmZpY2Vvbl9yZXN1bWUoKVxuIik7CisJcmV0dXJuIGVmZmljZW9uX2NvbmZpZ3VyZSgpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfZWZmaWNlb25fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwl1OCBjYXBfcHRyOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwlpZiAoIWNhcF9wdHIpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUHJvYmUgZm9yIEVmZmljZW9uIGNvbnRyb2xsZXIgKi8KKwlpZiAocGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfRUZGSUNFT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgRWZmaWNlb24gY2hpcHNldCAoZGV2aWNlIGlkOiAlMDR4KVxuIiwKKwkJICAgIHBkZXYtPmRldmljZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBUcmFuc21ldGEgRWZmaWNlb24gVE04MDAwIHNlcmllcyBjaGlwc2V0XG4iKTsKKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRyaXZlciA9ICZlZmZpY2Vvbl9kcml2ZXI7CisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKworCS8qCisJKiBUaGUgZm9sbG93aW5nIGZpeGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCSU9TIGhhcyAiZm9yZ290dGVuIiB0bworCSogcHJvdmlkZSBhbiBhZGRyZXNzIHJhbmdlIGZvciB0aGUgR0FSVC4KKwkqIDIwMDMwNjEwIC0gaGFtaXNoQHpvdC5vcmcKKwkqLworCXIgPSAmcGRldi0+cmVzb3VyY2VbMF07CisJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKKwkJaWYocGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGQgbm90IGFzc2lnbiByZXNvdXJjZSAwXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkqIElmIHRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHByb3Blcmx5IHNldHVwLCB0aGUgZm9sbG93aW5nIHdpbGwgY2F0Y2gKKwkqIHRoZSBwcm9ibGVtIGFuZCBzaG91bGQgc3RvcCB0aGUgc3lzdGVtIGZyb20gY3Jhc2hpbmcuCisJKiAyMDAzMDYxMCAtIGhhbWlzaEB6b3Qub3JnCisJKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIEVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCWlmIChjYXBfcHRyKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJCWJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLAorCQkJCSZicmlkZ2UtPm1vZGUpOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2VmZmljZW9uX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyBpbnQgYWdwX2VmZmljZW9uX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfZWZmaWNlb25fcGNpX3RhYmxlW10gPSB7CisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1RSQU5TTUVUQSwKKwkuZGV2aWNlCQk9IFBDSV9BTllfSUQsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfZWZmaWNlb25fcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9lZmZpY2Vvbl9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWVmZmljZW9uIiwKKwkuaWRfdGFibGUJPSBhZ3BfZWZmaWNlb25fcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfZWZmaWNlb25fcHJvYmUsCisJLnJlbW92ZQkJPSBhZ3BfZWZmaWNlb25fcmVtb3ZlLAorCS5zdXNwZW5kCT0gYWdwX2VmZmljZW9uX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZ3BfZWZmaWNlb25fcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX2VmZmljZW9uX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGFncF9pbml0aWFsaXNlZD0wOworCisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFncF9pbml0aWFsaXNlZCA9PSAxKQorCQlyZXR1cm4gMDsKKwlhZ3BfaW5pdGlhbGlzZWQ9MTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfZWZmaWNlb25fcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfZWZmaWNlb25fY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdwX2VmZmljZW9uX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfZWZmaWNlb25faW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfZWZmaWNlb25fY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkNhcmxvcyBQdWNob2wgPGNwZ2xpbnV4QHB1Y2hvbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzM2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKQEAgLTAsMCArMSwxMTAzIEBACisvKgorICogQUdQR0FSVCBkcml2ZXIgZnJvbnRlbmQKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEYXZlIEpvbmVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmVmZiBIYXJ0bWFubgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRQorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworc3RhdGljIHN0cnVjdCBhZ3BfZnJvbnRfZGF0YSBhZ3BfZmU7CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2ZpbmRfbWVtX2J5X2tleShpbnQga2V5KQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyOworCisJaWYgKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljdXJyID0gYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+cG9vbDsKKworCXdoaWxlIChjdXJyICE9IE5VTEwpIHsKKwkJaWYgKGN1cnItPmtleSA9PSBrZXkpCisJCQlicmVhazsKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJfQorCisJREJHKCJrZXk9JWQgLT4gbWVtPSVwIiwga2V5LCBjdXJyKTsKKwlyZXR1cm4gY3VycjsKK30KKworc3RhdGljIHZvaWQgYWdwX3JlbW92ZV9mcm9tX3Bvb2woc3RydWN0IGFncF9tZW1vcnkgKnRlbXApCit7CisJc3RydWN0IGFncF9tZW1vcnkgKnByZXY7CisJc3RydWN0IGFncF9tZW1vcnkgKm5leHQ7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBldmVuIGluIHRoZSBtZW1vcnkgcG9vbCAqLworCisJREJHKCJtZW09JXAiLCB0ZW1wKTsKKwlpZiAoYWdwX2ZpbmRfbWVtX2J5X2tleSh0ZW1wLT5rZXkpICE9IE5VTEwpIHsKKwkJbmV4dCA9IHRlbXAtPm5leHQ7CisJCXByZXYgPSB0ZW1wLT5wcmV2OworCisJCWlmIChwcmV2ICE9IE5VTEwpIHsKKwkJCXByZXYtPm5leHQgPSBuZXh0OworCQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCQluZXh0LT5wcmV2ID0gcHJldjsKKworCQl9IGVsc2UgeworCQkJLyogVGhpcyBpcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdCAqLworCQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCQluZXh0LT5wcmV2ID0gTlVMTDsKKworCQkJYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+cG9vbCA9IG5leHQ7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSb3V0aW5lcyBmb3IgbWFuYWdpbmcgZWFjaCBjbGllbnQncyBzZWdtZW50IGxpc3QgLQorICogVGhlc2Ugcm91dGluZXMgaGFuZGxlIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2VnbWVudHMKKyAqIHRvIGVhY2ggYXV0aCdlZCBjbGllbnQuCisgKi8KKworc3RhdGljIHN0cnVjdAorYWdwX3NlZ21lbnRfcHJpdiAqYWdwX2ZpbmRfc2VnX2luX2NsaWVudChjb25zdCBzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgICBpbnQgc2l6ZSwgcGdwcm90X3QgcGFnZV9wcm90KQoreworCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICpzZWc7CisJaW50IG51bV9zZWdtZW50cywgaTsKKwlvZmZfdCBwZ19zdGFydDsKKwlzaXplX3QgcGdfY291bnQ7CisKKwlwZ19zdGFydCA9IG9mZnNldCAvIDQwOTY7CisJcGdfY291bnQgPSBzaXplIC8gNDA5NjsKKwlzZWcgPSAqKGNsaWVudC0+c2VnbWVudHMpOworCW51bV9zZWdtZW50cyA9IGNsaWVudC0+bnVtX3NlZ21lbnRzOworCisJZm9yIChpID0gMDsgaSA8IGNsaWVudC0+bnVtX3NlZ21lbnRzOyBpKyspIHsKKwkJaWYgKChzZWdbaV0ucGdfc3RhcnQgPT0gcGdfc3RhcnQpICYmCisJCSAgICAoc2VnW2ldLnBnX2NvdW50ID09IHBnX2NvdW50KSAmJgorCQkgICAgKHBncHJvdF92YWwoc2VnW2ldLnByb3QpID09IHBncHJvdF92YWwocGFnZV9wcm90KSkpIHsKKwkJCXJldHVybiBzZWcgKyBpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFncF9yZW1vdmVfc2VnX2Zyb21fY2xpZW50KHN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQpCit7CisJREJHKCJjbGllbnQ9JXAiLCBjbGllbnQpOworCisJaWYgKGNsaWVudC0+c2VnbWVudHMgIT0gTlVMTCkgeworCQlpZiAoKihjbGllbnQtPnNlZ21lbnRzKSAhPSBOVUxMKSB7CisJCQlEQkcoIkZyZWVpbmcgJXAgZnJvbSBjbGllbnQgJXAiLCAqKGNsaWVudC0+c2VnbWVudHMpLCBjbGllbnQpOworCQkJa2ZyZWUoKihjbGllbnQtPnNlZ21lbnRzKSk7CisJCX0KKwkJREJHKCJGcmVlaW5nICVwIGZyb20gY2xpZW50ICVwIiwgY2xpZW50LT5zZWdtZW50cywgY2xpZW50KTsKKwkJa2ZyZWUoY2xpZW50LT5zZWdtZW50cyk7CisJCWNsaWVudC0+c2VnbWVudHMgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgYWdwX2FkZF9zZWdfdG9fY2xpZW50KHN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgc3RydWN0IGFncF9zZWdtZW50X3ByaXYgKiogc2VnLCBpbnQgbnVtX3NlZ21lbnRzKQoreworCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICoqcHJldl9zZWc7CisKKwlwcmV2X3NlZyA9IGNsaWVudC0+c2VnbWVudHM7CisKKwlpZiAocHJldl9zZWcgIT0gTlVMTCkKKwkJYWdwX3JlbW92ZV9zZWdfZnJvbV9jbGllbnQoY2xpZW50KTsKKworCURCRygiQWRkaW5nIHNlZyAlcCAoJWQgc2VnbWVudHMpIHRvIGNsaWVudCAlcCIsIHNlZywgbnVtX3NlZ21lbnRzLCBjbGllbnQpOworCWNsaWVudC0+bnVtX3NlZ21lbnRzID0gbnVtX3NlZ21lbnRzOworCWNsaWVudC0+c2VnbWVudHMgPSBzZWc7Cit9CisKKy8qIE9yaWdpbmFsbHkgdGFrZW4gZnJvbSBsaW51eC9tbS9tbWFwLmMgZnJvbSB0aGUgYXJyYXkKKyAqIHByb3RlY3Rpb25fbWFwLgorICogVGhlIG9yaWdpbmFsIHJlYWxseSBzaG91bGQgYmUgZXhwb3J0ZWQgdG8gbW9kdWxlcywgb3IKKyAqIHNvbWUgcm91dGluZSB3aGljaCBkb2VzIHRoZSBjb252ZXJzaW9uIGZvciB5b3UKKyAqLworCitzdGF0aWMgY29uc3QgcGdwcm90X3QgbXlfcHJvdGVjdF9tYXBbMTZdID0KK3sKKwlfX1AwMDAsIF9fUDAwMSwgX19QMDEwLCBfX1AwMTEsIF9fUDEwMCwgX19QMTAxLCBfX1AxMTAsIF9fUDExMSwKKwlfX1MwMDAsIF9fUzAwMSwgX19TMDEwLCBfX1MwMTEsIF9fUzEwMCwgX19TMTAxLCBfX1MxMTAsIF9fUzExMQorfTsKKworc3RhdGljIHBncHJvdF90IGFncF9jb252ZXJ0X21tYXBfZmxhZ3MoaW50IHByb3QpCit7CisjZGVmaW5lIF90cmFucyh4LGJpdDEsYml0MikgXAorKChiaXQxPT1iaXQyKT8oeCZiaXQxKTooeCZiaXQxKT9iaXQyOjApCisKKwl1bnNpZ25lZCBsb25nIHByb3RfYml0czsKKwlwZ3Byb3RfdCB0ZW1wOworCisJcHJvdF9iaXRzID0gX3RyYW5zKHByb3QsIFBST1RfUkVBRCwgVk1fUkVBRCkgfAorCSAgICBfdHJhbnMocHJvdCwgUFJPVF9XUklURSwgVk1fV1JJVEUpIHwKKwkgICAgX3RyYW5zKHByb3QsIFBST1RfRVhFQywgVk1fRVhFQyk7CisKKwlwcm90X2JpdHMgfD0gVk1fU0hBUkVEOworCisJdGVtcCA9IG15X3Byb3RlY3RfbWFwW3Byb3RfYml0cyAmIDB4MDAwMDAwMGZdOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgYWdwX2NyZWF0ZV9zZWdtZW50KHN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBhZ3BfcmVnaW9uICpyZWdpb24pCit7CisJc3RydWN0IGFncF9zZWdtZW50X3ByaXYgKipyZXRfc2VnOworCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICpzZWc7CisJc3RydWN0IGFncF9zZWdtZW50ICp1c2VyX3NlZzsKKwlzaXplX3QgaTsKKworCXNlZyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgYWdwX3NlZ21lbnRfcHJpdikgKiByZWdpb24tPnNlZ19jb3VudCksIEdGUF9LRVJORUwpOworCWlmIChzZWcgPT0gTlVMTCkgeworCQlrZnJlZShyZWdpb24tPnNlZ19saXN0KTsKKwkJcmVnaW9uLT5zZWdfbGlzdCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc2VnLCAwLCAoc2l6ZW9mKHN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2KSAqIHJlZ2lvbi0+c2VnX2NvdW50KSk7CisJdXNlcl9zZWcgPSByZWdpb24tPnNlZ19saXN0OworCisJZm9yIChpID0gMDsgaSA8IHJlZ2lvbi0+c2VnX2NvdW50OyBpKyspIHsKKwkJc2VnW2ldLnBnX3N0YXJ0ID0gdXNlcl9zZWdbaV0ucGdfc3RhcnQ7CisJCXNlZ1tpXS5wZ19jb3VudCA9IHVzZXJfc2VnW2ldLnBnX2NvdW50OworCQlzZWdbaV0ucHJvdCA9IGFncF9jb252ZXJ0X21tYXBfZmxhZ3ModXNlcl9zZWdbaV0ucHJvdCk7CisJfQorCWtmcmVlKHJlZ2lvbi0+c2VnX2xpc3QpOworCXJlZ2lvbi0+c2VnX2xpc3QgPSBOVUxMOworCisJcmV0X3NlZyA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOworCWlmIChyZXRfc2VnID09IE5VTEwpIHsKKwkJa2ZyZWUoc2VnKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCSpyZXRfc2VnID0gc2VnOworCWFncF9hZGRfc2VnX3RvX2NsaWVudChjbGllbnQsIHJldF9zZWcsIHJlZ2lvbi0+c2VnX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogRW5kIC0gUm91dGluZXMgZm9yIG1hbmFnaW5nIGVhY2ggY2xpZW50J3Mgc2VnbWVudCBsaXN0ICovCisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGN1cnJlbnRfY29udHJvbGxlciAhPSBOVUxMICovCitzdGF0aWMgdm9pZCBhZ3BfaW5zZXJ0X2ludG9fcG9vbChzdHJ1Y3QgYWdwX21lbW9yeSAqIHRlbXApCit7CisJc3RydWN0IGFncF9tZW1vcnkgKnByZXY7CisKKwlwcmV2ID0gYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+cG9vbDsKKworCWlmIChwcmV2ICE9IE5VTEwpIHsKKwkJcHJldi0+cHJldiA9IHRlbXA7CisJCXRlbXAtPm5leHQgPSBwcmV2OworCX0KKwlhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLT5wb29sID0gdGVtcDsKK30KKworCisvKiBGaWxlIHByaXZhdGUgbGlzdCByb3V0aW5lcyAqLworCitzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqYWdwX2ZpbmRfcHJpdmF0ZShwaWRfdCBwaWQpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnI7CisKKwljdXJyID0gYWdwX2ZlLmZpbGVfcHJpdl9saXN0OworCisJd2hpbGUgKGN1cnIgIT0gTlVMTCkgeworCQlpZiAoY3Vyci0+bXlfcGlkID09IHBpZCkKKwkJCXJldHVybiBjdXJyOworCQljdXJyID0gY3Vyci0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBhZ3BfaW5zZXJ0X2ZpbGVfcHJpdmF0ZShzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByZXY7CisKKwlwcmV2ID0gYWdwX2ZlLmZpbGVfcHJpdl9saXN0OworCisJaWYgKHByZXYgIT0gTlVMTCkKKwkJcHJldi0+cHJldiA9IHByaXY7CisJcHJpdi0+bmV4dCA9IHByZXY7CisJYWdwX2ZlLmZpbGVfcHJpdl9saXN0ID0gcHJpdjsKK30KKwordm9pZCBhZ3BfcmVtb3ZlX2ZpbGVfcHJpdmF0ZShzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKm5leHQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByZXY7CisKKwluZXh0ID0gcHJpdi0+bmV4dDsKKwlwcmV2ID0gcHJpdi0+cHJldjsKKworCWlmIChwcmV2ICE9IE5VTEwpIHsKKwkJcHJldi0+bmV4dCA9IG5leHQ7CisKKwkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCW5leHQtPnByZXYgPSBwcmV2OworCisJfSBlbHNlIHsKKwkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCW5leHQtPnByZXYgPSBOVUxMOworCisJCWFncF9mZS5maWxlX3ByaXZfbGlzdCA9IG5leHQ7CisJfQorfQorCisvKiBFbmQgLSBGaWxlIGZsYWcgbGlzdCByb3V0aW5lcyAqLworCisvKgorICogV3JhcHBlcnMgZm9yIGFncF9mcmVlX21lbW9yeSAmIGFncF9hbGxvY2F0ZV9tZW1vcnkKKyAqIFRoZXNlIG1ha2Ugc3VyZSB0aGF0IGludGVybmFsIGxpc3RzIGFyZSBrZXB0IHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGFncF9mcmVlX21lbW9yeV93cmFwKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnkpCit7CisJYWdwX3JlbW92ZV9mcm9tX3Bvb2wobWVtb3J5KTsKKwlhZ3BfZnJlZV9tZW1vcnkobWVtb3J5KTsKK30KKworc3RhdGljIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoc2l6ZV90IHBnX2NvdW50LCB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCisJbWVtb3J5ID0gYWdwX2FsbG9jYXRlX21lbW9yeShhZ3BfYnJpZGdlLCBwZ19jb3VudCwgdHlwZSk7CisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWFncF9pbnNlcnRfaW50b19wb29sKG1lbW9yeSk7CisJcmV0dXJuIG1lbW9yeTsKK30KKworLyogUm91dGluZXMgZm9yIG1hbmFnaW5nIHRoZSBsaXN0IG9mIGNvbnRyb2xsZXJzIC0KKyAqIFRoZXNlIHJvdXRpbmVzIG1hbmFnZSB0aGUgY3VycmVudCBjb250cm9sbGVyLCBhbmQgdGhlIGxpc3Qgb2YKKyAqIGNvbnRyb2xsZXJzCisgKi8KKworc3RhdGljIHN0cnVjdCBhZ3BfY29udHJvbGxlciAqYWdwX2ZpbmRfY29udHJvbGxlcl9ieV9waWQocGlkX3QgaWQpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJY29udHJvbGxlciA9IGFncF9mZS5jb250cm9sbGVyczsKKworCXdoaWxlIChjb250cm9sbGVyICE9IE5VTEwpIHsKKwkJaWYgKGNvbnRyb2xsZXItPnBpZCA9PSBpZCkKKwkJCXJldHVybiBjb250cm9sbGVyOworCQljb250cm9sbGVyID0gY29udHJvbGxlci0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhZ3BfY29udHJvbGxlciAqYWdwX2NyZWF0ZV9jb250cm9sbGVyKHBpZF90IGlkKQoreworCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcjsKKworCWNvbnRyb2xsZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIpLCBHRlBfS0VSTkVMKTsKKworCWlmIChjb250cm9sbGVyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGNvbnRyb2xsZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIpKTsKKwljb250cm9sbGVyLT5waWQgPSBpZDsKKworCXJldHVybiBjb250cm9sbGVyOworfQorCitzdGF0aWMgaW50IGFncF9pbnNlcnRfY29udHJvbGxlcihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpwcmV2X2NvbnRyb2xsZXI7CisKKwlwcmV2X2NvbnRyb2xsZXIgPSBhZ3BfZmUuY29udHJvbGxlcnM7CisJY29udHJvbGxlci0+bmV4dCA9IHByZXZfY29udHJvbGxlcjsKKworCWlmIChwcmV2X2NvbnRyb2xsZXIgIT0gTlVMTCkKKwkJcHJldl9jb250cm9sbGVyLT5wcmV2ID0gY29udHJvbGxlcjsKKworCWFncF9mZS5jb250cm9sbGVycyA9IGNvbnRyb2xsZXI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWdwX3JlbW92ZV9hbGxfY2xpZW50cyhzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IGFncF9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqdGVtcDsKKworCWNsaWVudCA9IGNvbnRyb2xsZXItPmNsaWVudHM7CisKKwl3aGlsZSAoY2xpZW50KSB7CisJCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OworCisJCXRlbXAgPSBjbGllbnQ7CisJCWFncF9yZW1vdmVfc2VnX2Zyb21fY2xpZW50KHRlbXApOworCQlwcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZSh0ZW1wLT5waWQpOworCisJCWlmIChwcml2ICE9IE5VTEwpIHsKKwkJCWNsZWFyX2JpdChBR1BfRkZfSVNfVkFMSUQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJY2xlYXJfYml0KEFHUF9GRl9JU19DTElFTlQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCQl9CisJCWNsaWVudCA9IGNsaWVudC0+bmV4dDsKKwkJa2ZyZWUodGVtcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZ3BfcmVtb3ZlX2FsbF9tZW1vcnkoc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisJc3RydWN0IGFncF9tZW1vcnkgKnRlbXA7CisKKwltZW1vcnkgPSBjb250cm9sbGVyLT5wb29sOworCisJd2hpbGUgKG1lbW9yeSkgeworCQl0ZW1wID0gbWVtb3J5OworCQltZW1vcnkgPSBtZW1vcnktPm5leHQ7CisJCWFncF9mcmVlX21lbW9yeV93cmFwKHRlbXApOworCX0KK30KKworc3RhdGljIGludCBhZ3BfcmVtb3ZlX2NvbnRyb2xsZXIoc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyKQoreworCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqcHJldl9jb250cm9sbGVyOworCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqbmV4dF9jb250cm9sbGVyOworCisJcHJldl9jb250cm9sbGVyID0gY29udHJvbGxlci0+cHJldjsKKwluZXh0X2NvbnRyb2xsZXIgPSBjb250cm9sbGVyLT5uZXh0OworCisJaWYgKHByZXZfY29udHJvbGxlciAhPSBOVUxMKSB7CisJCXByZXZfY29udHJvbGxlci0+bmV4dCA9IG5leHRfY29udHJvbGxlcjsKKwkJaWYgKG5leHRfY29udHJvbGxlciAhPSBOVUxMKQorCQkJbmV4dF9jb250cm9sbGVyLT5wcmV2ID0gcHJldl9jb250cm9sbGVyOworCisJfSBlbHNlIHsKKwkJaWYgKG5leHRfY29udHJvbGxlciAhPSBOVUxMKQorCQkJbmV4dF9jb250cm9sbGVyLT5wcmV2ID0gTlVMTDsKKworCQlhZ3BfZmUuY29udHJvbGxlcnMgPSBuZXh0X2NvbnRyb2xsZXI7CisJfQorCisJYWdwX3JlbW92ZV9hbGxfbWVtb3J5KGNvbnRyb2xsZXIpOworCWFncF9yZW1vdmVfYWxsX2NsaWVudHMoY29udHJvbGxlcik7CisKKwlpZiAoYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciA9PSBjb250cm9sbGVyKSB7CisJCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIgPSBOVUxMOworCQlhZ3BfZmUuYmFja2VuZF9hY3F1aXJlZCA9IEZBTFNFOworCQlhZ3BfYmFja2VuZF9yZWxlYXNlKGFncF9icmlkZ2UpOworCX0KKwlrZnJlZShjb250cm9sbGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWdwX2NvbnRyb2xsZXJfbWFrZV9jdXJyZW50KHN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcikKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50czsKKworCWNsaWVudHMgPSBjb250cm9sbGVyLT5jbGllbnRzOworCisJd2hpbGUgKGNsaWVudHMgIT0gTlVMTCkgeworCQlzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdjsKKworCQlwcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZShjbGllbnRzLT5waWQpOworCisJCWlmIChwcml2ICE9IE5VTEwpIHsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX1ZBTElELCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX0NMSUVOVCwgJnByaXYtPmFjY2Vzc19mbGFncyk7CisJCX0KKwkJY2xpZW50cyA9IGNsaWVudHMtPm5leHQ7CisJfQorCisJYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Cit9CisKK3N0YXRpYyB2b2lkIGFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsCisJCQkJICAgICAgc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmNvbnRyb2xsZXJfcHJpdikKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50czsKKworCWNsZWFyX2JpdChBR1BfRkZfSVNfVkFMSUQsICZjb250cm9sbGVyX3ByaXYtPmFjY2Vzc19mbGFncyk7CisJY2xpZW50cyA9IGNvbnRyb2xsZXItPmNsaWVudHM7CisKKwl3aGlsZSAoY2xpZW50cyAhPSBOVUxMKSB7CisJCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OworCisJCXByaXYgPSBhZ3BfZmluZF9wcml2YXRlKGNsaWVudHMtPnBpZCk7CisKKwkJaWYgKHByaXYgIT0gTlVMTCkKKwkJCWNsZWFyX2JpdChBR1BfRkZfSVNfVkFMSUQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCisJCWNsaWVudHMgPSBjbGllbnRzLT5uZXh0OworCX0KKworCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIgPSBOVUxMOworCWFncF9mZS51c2VkX2J5X2NvbnRyb2xsZXIgPSBGQUxTRTsKKwlhZ3BfYmFja2VuZF9yZWxlYXNlKGFncF9icmlkZ2UpOworfQorCisvKgorICogUm91dGluZXMgZm9yIG1hbmFnaW5nIGNsaWVudCBsaXN0cyAtCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgZm9yIG1hbmFnaW5nIHRoZSBsaXN0IG9mIGF1dGgnZWQgY2xpZW50cy4KKyAqLworCitzdGF0aWMgc3RydWN0IGFncF9jbGllbnQKKyphZ3BfZmluZF9jbGllbnRfaW5fY29udHJvbGxlcihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsIHBpZF90IGlkKQoreworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisKKwlpZiAoY29udHJvbGxlciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNsaWVudCA9IGNvbnRyb2xsZXItPmNsaWVudHM7CisKKwl3aGlsZSAoY2xpZW50ICE9IE5VTEwpIHsKKwkJaWYgKGNsaWVudC0+cGlkID09IGlkKQorCQkJcmV0dXJuIGNsaWVudDsKKwkJY2xpZW50ID0gY2xpZW50LT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFncF9jb250cm9sbGVyICphZ3BfZmluZF9jb250cm9sbGVyX2Zvcl9jbGllbnQocGlkX3QgaWQpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJY29udHJvbGxlciA9IGFncF9mZS5jb250cm9sbGVyczsKKworCXdoaWxlIChjb250cm9sbGVyICE9IE5VTEwpIHsKKwkJaWYgKChhZ3BfZmluZF9jbGllbnRfaW5fY29udHJvbGxlcihjb250cm9sbGVyLCBpZCkpICE9IE5VTEwpCisJCQlyZXR1cm4gY29udHJvbGxlcjsKKwkJY29udHJvbGxlciA9IGNvbnRyb2xsZXItPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCkKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqdGVtcDsKKworCWlmIChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdGVtcCA9IGFncF9maW5kX2NsaWVudF9pbl9jb250cm9sbGVyKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIsIGlkKTsKKwlyZXR1cm4gdGVtcDsKK30KKworc3RhdGljIHZvaWQgYWdwX2luc2VydF9jbGllbnQoc3RydWN0IGFncF9jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqcHJldl9jbGllbnQ7CisKKwlwcmV2X2NsaWVudCA9IGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPmNsaWVudHM7CisJY2xpZW50LT5uZXh0ID0gcHJldl9jbGllbnQ7CisKKwlpZiAocHJldl9jbGllbnQgIT0gTlVMTCkKKwkJcHJldl9jbGllbnQtPnByZXYgPSBjbGllbnQ7CisKKwlhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLT5jbGllbnRzID0gY2xpZW50OworCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPm51bV9jbGllbnRzKys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2NyZWF0ZV9jbGllbnQocGlkX3QgaWQpCit7CisJc3RydWN0IGFncF9jbGllbnQgKm5ld19jbGllbnQ7CisKKwluZXdfY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFncF9jbGllbnQpLCBHRlBfS0VSTkVMKTsKKworCWlmIChuZXdfY2xpZW50ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG5ld19jbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2NsaWVudCkpOworCW5ld19jbGllbnQtPnBpZCA9IGlkOworCWFncF9pbnNlcnRfY2xpZW50KG5ld19jbGllbnQpOworCXJldHVybiBuZXdfY2xpZW50OworfQorCitzdGF0aWMgaW50IGFncF9yZW1vdmVfY2xpZW50KHBpZF90IGlkKQoreworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9jbGllbnQgKnByZXZfY2xpZW50OworCXN0cnVjdCBhZ3BfY2xpZW50ICpuZXh0X2NsaWVudDsKKwlzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CisKKwljb250cm9sbGVyID0gYWdwX2ZpbmRfY29udHJvbGxlcl9mb3JfY2xpZW50KGlkKTsKKwlpZiAoY29udHJvbGxlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsaWVudCA9IGFncF9maW5kX2NsaWVudF9pbl9jb250cm9sbGVyKGNvbnRyb2xsZXIsIGlkKTsKKwlpZiAoY2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJldl9jbGllbnQgPSBjbGllbnQtPnByZXY7CisJbmV4dF9jbGllbnQgPSBjbGllbnQtPm5leHQ7CisKKwlpZiAocHJldl9jbGllbnQgIT0gTlVMTCkgeworCQlwcmV2X2NsaWVudC0+bmV4dCA9IG5leHRfY2xpZW50OworCQlpZiAobmV4dF9jbGllbnQgIT0gTlVMTCkKKwkJCW5leHRfY2xpZW50LT5wcmV2ID0gcHJldl9jbGllbnQ7CisKKwl9IGVsc2UgeworCQlpZiAobmV4dF9jbGllbnQgIT0gTlVMTCkKKwkJCW5leHRfY2xpZW50LT5wcmV2ID0gTlVMTDsKKwkJY29udHJvbGxlci0+Y2xpZW50cyA9IG5leHRfY2xpZW50OworCX0KKworCWNvbnRyb2xsZXItPm51bV9jbGllbnRzLS07CisJYWdwX3JlbW92ZV9zZWdfZnJvbV9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCisvKiBFbmQgLSBSb3V0aW5lcyBmb3IgbWFuYWdpbmcgY2xpZW50IGxpc3RzICovCisKKy8qIEZpbGUgT3BlcmF0aW9ucyAqLworCitzdGF0aWMgaW50IGFncF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgY3VycmVudF9zaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFncF9rZXJuX2luZm8ga2VybmluZm87CisKKwlkb3duKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJaWYgKGFncF9mZS5iYWNrZW5kX2FjcXVpcmVkICE9IFRSVUUpCisJCWdvdG8gb3V0X2VwZXJtOworCisJaWYgKCEodGVzdF9iaXQoQUdQX0ZGX0lTX1ZBTElELCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkpCisJCWdvdG8gb3V0X2VwZXJtOworCisJYWdwX2NvcHlfaW5mbyhhZ3BfYnJpZGdlLCAma2VybmluZm8pOworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJY3VycmVudF9zaXplID0ga2VybmluZm8uYXBlcl9zaXplOworCWN1cnJlbnRfc2l6ZSA9IGN1cnJlbnRfc2l6ZSAqIDB4MTAwMDAwOworCW9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlEQkcoIiVseDolbHgiLCBvZmZzZXQsIG9mZnNldCtzaXplKTsKKworCWlmICh0ZXN0X2JpdChBR1BfRkZfSVNfQ0xJRU5ULCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkgeworCQlpZiAoKHNpemUgKyBvZmZzZXQpID4gY3VycmVudF9zaXplKQorCQkJZ290byBvdXRfaW52YWw7CisKKwkJY2xpZW50ID0gYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChjdXJyZW50LT5waWQpOworCisJCWlmIChjbGllbnQgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2VwZXJtOworCisJCWlmICghYWdwX2ZpbmRfc2VnX2luX2NsaWVudChjbGllbnQsIG9mZnNldCwgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQkJZ290byBvdXRfaW52YWw7CisKKwkJREJHKCJjbGllbnQgdm1fb3BzPSVwIiwga2VybmluZm8udm1fb3BzKTsKKwkJaWYgKGtlcm5pbmZvLnZtX29wcykgeworCQkJdm1hLT52bV9vcHMgPSBrZXJuaW5mby52bV9vcHM7CisJCX0gZWxzZSBpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkoa2VybmluZm8uYXBlcl9iYXNlICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCQlnb3RvIG91dF9hZ2FpbjsKKwkJfQorCQl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRlc3RfYml0KEFHUF9GRl9JU19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkgeworCQlpZiAoc2l6ZSAhPSBjdXJyZW50X3NpemUpCisJCQlnb3RvIG91dF9pbnZhbDsKKworCQlEQkcoImNvbnRyb2xsZXIgdm1fb3BzPSVwIiwga2VybmluZm8udm1fb3BzKTsKKwkJaWYgKGtlcm5pbmZvLnZtX29wcykgeworCQkJdm1hLT52bV9vcHMgPSBrZXJuaW5mby52bV9vcHM7CisJCX0gZWxzZSBpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkJICAgIGtlcm5pbmZvLmFwZXJfYmFzZSA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCQlnb3RvIG91dF9hZ2FpbjsKKwkJfQorCQl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXRfZXBlcm06CisJdXAoJihhZ3BfZmUuYWdwX211dGV4KSk7CisJcmV0dXJuIC1FUEVSTTsKKworb3V0X2ludmFsOgorCXVwKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCXJldHVybiAtRUlOVkFMOworCitvdXRfYWdhaW46CisJdXAoJihhZ3BfZmUuYWdwX211dGV4KSk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgYWdwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJREJHKCJwcml2PSVwIiwgcHJpdik7CisKKwlpZiAodGVzdF9iaXQoQUdQX0ZGX0lTX0NPTlRST0xMRVIsICZwcml2LT5hY2Nlc3NfZmxhZ3MpKSB7CisJCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcjsKKworCQljb250cm9sbGVyID0gYWdwX2ZpbmRfY29udHJvbGxlcl9ieV9waWQocHJpdi0+bXlfcGlkKTsKKworCQlpZiAoY29udHJvbGxlciAhPSBOVUxMKSB7CisJCQlpZiAoY29udHJvbGxlciA9PSBhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyKQorCQkJCWFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChjb250cm9sbGVyLCBwcml2KTsKKwkJCWFncF9yZW1vdmVfY29udHJvbGxlcihjb250cm9sbGVyKTsKKwkJCWNvbnRyb2xsZXIgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEFHUF9GRl9JU19DTElFTlQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpKQorCQlhZ3BfcmVtb3ZlX2NsaWVudChwcml2LT5teV9waWQpOworCisJYWdwX3JlbW92ZV9maWxlX3ByaXZhdGUocHJpdik7CisJa2ZyZWUocHJpdik7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJaW50IHJjID0gLUVOWElPOworCisJZG93bigmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKworCWlmIChtaW5vciAhPSBBR1BHQVJUX01JTk9SKQorCQlnb3RvIGVycl9vdXQ7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFncF9maWxlX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfbm9tZW07CisKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlKSk7CisJc2V0X2JpdChBR1BfRkZfQUxMT1dfQ0xJRU5ULCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwlwcml2LT5teV9waWQgPSBjdXJyZW50LT5waWQ7CisKKwlpZiAoKGN1cnJlbnQtPnVpZCA9PSAwKSB8fCAoY3VycmVudC0+c3VpZCA9PSAwKSkgeworCQkvKiBSb290IHByaXYsIGNhbiBiZSBjb250cm9sbGVyICovCisJCXNldF9iaXQoQUdQX0ZGX0FMTE9XX0NPTlRST0xMRVIsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCX0KKwljbGllbnQgPSBhZ3BfZmluZF9jbGllbnRfYnlfcGlkKGN1cnJlbnQtPnBpZCk7CisKKwlpZiAoY2xpZW50ICE9IE5VTEwpIHsKKwkJc2V0X2JpdChBR1BfRkZfSVNfQ0xJRU5ULCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJc2V0X2JpdChBR1BfRkZfSVNfVkFMSUQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSBwcml2OworCWFncF9pbnNlcnRfZmlsZV9wcml2YXRlKHByaXYpOworCURCRygicHJpdmF0ZT0lcCwgY2xpZW50PSVwIiwgcHJpdiwgY2xpZW50KTsKKwl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9ub21lbToKKwlyYyA9IC1FTk9NRU07CitlcnJfb3V0OgorCXVwKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3NpemVfdCBhZ3BfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgYWdwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZ3Bpb2NfaW5mb193cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfaW5mbyB1c2VyaW5mbzsKKwlzdHJ1Y3QgYWdwX2tlcm5faW5mbyBrZXJuaW5mbzsKKworCWFncF9jb3B5X2luZm8oYWdwX2JyaWRnZSwgJmtlcm5pbmZvKTsKKworCXVzZXJpbmZvLnZlcnNpb24ubWFqb3IgPSBrZXJuaW5mby52ZXJzaW9uLm1ham9yOworCXVzZXJpbmZvLnZlcnNpb24ubWlub3IgPSBrZXJuaW5mby52ZXJzaW9uLm1pbm9yOworCXVzZXJpbmZvLmJyaWRnZV9pZCA9IGtlcm5pbmZvLmRldmljZS0+dmVuZG9yIHwKKwkgICAgKGtlcm5pbmZvLmRldmljZS0+ZGV2aWNlIDw8IDE2KTsKKwl1c2VyaW5mby5hZ3BfbW9kZSA9IGtlcm5pbmZvLm1vZGU7CisJdXNlcmluZm8uYXBlcl9iYXNlID0ga2VybmluZm8uYXBlcl9iYXNlOworCXVzZXJpbmZvLmFwZXJfc2l6ZSA9IGtlcm5pbmZvLmFwZXJfc2l6ZTsKKwl1c2VyaW5mby5wZ190b3RhbCA9IHVzZXJpbmZvLnBnX3N5c3RlbSA9IGtlcm5pbmZvLm1heF9tZW1vcnk7CisJdXNlcmluZm8ucGdfdXNlZCA9IGtlcm5pbmZvLmN1cnJlbnRfbWVtb3J5OworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c2VyaW5mbywgc2l6ZW9mKHN0cnVjdCBhZ3BfaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFncGlvY19hY3F1aXJlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJREJHKCIiKTsKKworCWlmICghKHRlc3RfYml0KEFHUF9GRl9BTExPV19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciAhPSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYoIWFncF9icmlkZ2UpCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAgIGlmIChhdG9taWNfcmVhZCgmYWdwX2JyaWRnZS0+YWdwX2luX3VzZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKworCWF0b21pY19pbmMoJmFncF9icmlkZ2UtPmFncF9pbl91c2UpOworCisJYWdwX2ZlLmJhY2tlbmRfYWNxdWlyZWQgPSBUUlVFOworCisJY29udHJvbGxlciA9IGFncF9maW5kX2NvbnRyb2xsZXJfYnlfcGlkKHByaXYtPm15X3BpZCk7CisKKwlpZiAoY29udHJvbGxlciAhPSBOVUxMKSB7CisJCWFncF9jb250cm9sbGVyX21ha2VfY3VycmVudChjb250cm9sbGVyKTsKKwl9IGVsc2UgeworCQljb250cm9sbGVyID0gYWdwX2NyZWF0ZV9jb250cm9sbGVyKHByaXYtPm15X3BpZCk7CisKKwkJaWYgKGNvbnRyb2xsZXIgPT0gTlVMTCkgeworCQkJYWdwX2ZlLmJhY2tlbmRfYWNxdWlyZWQgPSBGQUxTRTsKKwkJCWFncF9iYWNrZW5kX3JlbGVhc2UoYWdwX2JyaWRnZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlhZ3BfaW5zZXJ0X2NvbnRyb2xsZXIoY29udHJvbGxlcik7CisJCWFncF9jb250cm9sbGVyX21ha2VfY3VycmVudChjb250cm9sbGVyKTsKKwl9CisKKwlzZXRfYml0KEFHUF9GRl9JU19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJnByaXYtPmFjY2Vzc19mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwaW9jX3JlbGVhc2Vfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKK3sKKwlEQkcoIiIpOworCWFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLCBwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ3Bpb2Nfc2V0dXBfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX3NldHVwIG1vZGU7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgYXJnLCBzaXplb2Yoc3RydWN0IGFncF9zZXR1cCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWFncF9lbmFibGUoYWdwX2JyaWRnZSwgbW9kZS5hZ3BfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwaW9jX3Jlc2VydmVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX3JlZ2lvbiByZXNlcnZlOworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmNsaWVudF9wcml2OworCisJREJHKCIiKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlc2VydmUsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfcmVnaW9uKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCh1bnNpZ25lZCkgcmVzZXJ2ZS5zZWdfY291bnQgPj0gfjBVL3NpemVvZihzdHJ1Y3QgYWdwX3NlZ21lbnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNsaWVudCA9IGFncF9maW5kX2NsaWVudF9ieV9waWQocmVzZXJ2ZS5waWQpOworCisJaWYgKHJlc2VydmUuc2VnX2NvdW50ID09IDApIHsKKwkJLyogcmVtb3ZlIGEgY2xpZW50ICovCisJCWNsaWVudF9wcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZShyZXNlcnZlLnBpZCk7CisKKwkJaWYgKGNsaWVudF9wcml2ICE9IE5VTEwpIHsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX0NMSUVOVCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJc2V0X2JpdChBR1BfRkZfSVNfVkFMSUQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJfQorCQlpZiAoY2xpZW50ID09IE5VTEwpIHsKKwkJCS8qIGNsaWVudCBpcyBhbHJlYWR5IHJlbW92ZWQgKi8KKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBhZ3BfcmVtb3ZlX2NsaWVudChyZXNlcnZlLnBpZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFncF9zZWdtZW50ICpzZWdtZW50OworCisJCWlmIChyZXNlcnZlLnNlZ19jb3VudCA+PSAxNjM4NCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNlZ21lbnQgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGFncF9zZWdtZW50KSAqIHJlc2VydmUuc2VnX2NvdW50KSwKKwkJCQkgIEdGUF9LRVJORUwpOworCisJCWlmIChzZWdtZW50ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoc2VnbWVudCwgKHZvaWQgX191c2VyICopIHJlc2VydmUuc2VnX2xpc3QsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBhZ3Bfc2VnbWVudCkgKiByZXNlcnZlLnNlZ19jb3VudCkpIHsKKwkJCWtmcmVlKHNlZ21lbnQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmVzZXJ2ZS5zZWdfbGlzdCA9IHNlZ21lbnQ7CisKKwkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkvKiBDcmVhdGUgdGhlIGNsaWVudCBhbmQgYWRkIHRoZSBzZWdtZW50ICovCisJCQljbGllbnQgPSBhZ3BfY3JlYXRlX2NsaWVudChyZXNlcnZlLnBpZCk7CisKKwkJCWlmIChjbGllbnQgPT0gTlVMTCkgeworCQkJCWtmcmVlKHNlZ21lbnQpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJY2xpZW50X3ByaXYgPSBhZ3BfZmluZF9wcml2YXRlKHJlc2VydmUucGlkKTsKKworCQkJaWYgKGNsaWVudF9wcml2ICE9IE5VTEwpIHsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19DTElFTlQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBhZ3BfY3JlYXRlX3NlZ21lbnQoY2xpZW50LCAmcmVzZXJ2ZSk7CisJfQorCS8qIFdpbGwgbmV2ZXIgcmVhbGx5IGhhcHBlbiAqLworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGFncGlvY19wcm90ZWN0X3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCit7CisJREJHKCIiKTsKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZ3Bpb2NfYWxsb2NhdGVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCXN0cnVjdCBhZ3BfYWxsb2NhdGUgYWxsb2M7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYWxsb2MsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfYWxsb2NhdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoYWxsb2MucGdfY291bnQsIGFsbG9jLnR5cGUpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFsbG9jLmtleSA9IG1lbW9yeS0+a2V5OworCWFsbG9jLnBoeXNpY2FsID0gbWVtb3J5LT5waHlzaWNhbDsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYWxsb2MsIHNpemVvZihzdHJ1Y3QgYWdwX2FsbG9jYXRlKSkpIHsKKwkJYWdwX2ZyZWVfbWVtb3J5X3dyYXAobWVtb3J5KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIGludCBhcmcpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKKworCURCRygiIik7CisJbWVtb3J5ID0gYWdwX2ZpbmRfbWVtX2J5X2tleShhcmcpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFncF9mcmVlX21lbW9yeV93cmFwKG1lbW9yeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwaW9jX2JpbmRfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX2JpbmQgYmluZF9pbmZvOworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYmluZF9pbmZvLCBhcmcsIHNpemVvZihzdHJ1Y3QgYWdwX2JpbmQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfZmluZF9tZW1fYnlfa2V5KGJpbmRfaW5mby5rZXkpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhZ3BfYmluZF9tZW1vcnkobWVtb3J5LCBiaW5kX2luZm8ucGdfc3RhcnQpOworfQorCitzdGF0aWMgaW50IGFncGlvY191bmJpbmRfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCXN0cnVjdCBhZ3BfdW5iaW5kIHVuYmluZDsKKworCURCRygiIik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bmJpbmQsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfdW5iaW5kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtb3J5ID0gYWdwX2ZpbmRfbWVtX2J5X2tleSh1bmJpbmQua2V5KTsKKworCWlmIChtZW1vcnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYWdwX3VuYmluZF9tZW1vcnkobWVtb3J5KTsKK30KKworc3RhdGljIGludCBhZ3BfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnJfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3ZhbCA9IC1FTk9UVFk7CisKKwlEQkcoInByaXY9JXAsIGNtZD0leCIsIGN1cnJfcHJpdiwgY21kKTsKKwlkb3duKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJaWYgKChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyID09IE5VTEwpICYmCisJICAgIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUpKSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlnb3RvIGlvY3RsX291dDsKKwl9CisJaWYgKChhZ3BfZmUuYmFja2VuZF9hY3F1aXJlZCAhPSBUUlVFKSAmJgorCSAgICAoY21kICE9IEFHUElPQ19BQ1FVSVJFKSkgeworCQlyZXRfdmFsID0gLUVCVVNZOworCQlnb3RvIGlvY3RsX291dDsKKwl9CisJaWYgKGNtZCAhPSBBR1BJT0NfQUNRVUlSRSkgeworCQlpZiAoISh0ZXN0X2JpdChBR1BfRkZfSVNfQ09OVFJPTExFUiwgJmN1cnJfcHJpdi0+YWNjZXNzX2ZsYWdzKSkpIHsKKwkJCXJldF92YWwgPSAtRVBFUk07CisJCQlnb3RvIGlvY3RsX291dDsKKwkJfQorCQkvKiBVc2UgdGhlIG9yaWdpbmFsIHBpZCBvZiB0aGUgY29udHJvbGxlciwKKwkJICogaW4gY2FzZSBpdCdzIHRocmVhZGVkICovCisKKwkJaWYgKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPnBpZCAhPSBjdXJyX3ByaXYtPm15X3BpZCkgeworCQkJcmV0X3ZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gaW9jdGxfb3V0OworCQl9CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFHUElPQ19JTkZPOgorCQlyZXRfdmFsID0gYWdwaW9jX2luZm9fd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FDUVVJUkU6CisJCXJldF92YWwgPSBhZ3Bpb2NfYWNxdWlyZV93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVMRUFTRToKKwkJcmV0X3ZhbCA9IGFncGlvY19yZWxlYXNlX3dyYXAoY3Vycl9wcml2KTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19TRVRVUDoKKwkJcmV0X3ZhbCA9IGFncGlvY19zZXR1cF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVTRVJWRToKKwkJcmV0X3ZhbCA9IGFncGlvY19yZXNlcnZlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19QUk9URUNUOgorCQlyZXRfdmFsID0gYWdwaW9jX3Byb3RlY3Rfd3JhcChjdXJyX3ByaXYpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FMTE9DQVRFOgorCQlyZXRfdmFsID0gYWdwaW9jX2FsbG9jYXRlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19ERUFMTE9DQVRFOgorCQlyZXRfdmFsID0gYWdwaW9jX2RlYWxsb2NhdGVfd3JhcChjdXJyX3ByaXYsIChpbnQpIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfQklORDoKKwkJcmV0X3ZhbCA9IGFncGlvY19iaW5kX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19VTkJJTkQ6CisJCXJldF92YWwgPSBhZ3Bpb2NfdW5iaW5kX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJfQorCitpb2N0bF9vdXQ6CisJREJHKCJpb2N0bCByZXR1cm5zICVkXG4iLCByZXRfdmFsKTsKKwl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWdwX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBhZ3BfcmVhZCwKKwkud3JpdGUJCT0gYWdwX3dyaXRlLAorCS5pb2N0bAkJPSBhZ3BfaW9jdGwsCisJLm1tYXAJCT0gYWdwX21tYXAsCisJLm9wZW4JCT0gYWdwX29wZW4sCisJLnJlbGVhc2UJPSBhZ3BfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhZ3BfbWlzY2RldiA9Cit7CisJLm1pbm9yCT0gQUdQR0FSVF9NSU5PUiwKKwkubmFtZQk9ICJhZ3BnYXJ0IiwKKwkuZm9wcwk9ICZhZ3BfZm9wcworfTsKKworaW50IGFncF9mcm9udGVuZF9pbml0aWFsaXplKHZvaWQpCit7CisJbWVtc2V0KCZhZ3BfZmUsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2Zyb250X2RhdGEpKTsKKwlzZW1hX2luaXQoJihhZ3BfZmUuYWdwX211dGV4KSwgMSk7CisKKwlpZiAobWlzY19yZWdpc3RlcigmYWdwX21pc2NkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBnZXQgbWlub3I6ICVkXG4iLCBBR1BHQVJUX01JTk9SKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGFncF9mcm9udGVuZF9jbGVhbnVwKHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZhZ3BfbWlzY2Rldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjFhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMCwwICsxLDEyMjIgQEAKKy8qCisgKiBBR1BHQVJUIGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBEYXZlIEpvbmVzLgorICogQ29weXJpZ2h0IChDKSAxOTk5IEplZmYgSGFydG1hbm4uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBYaSBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogSkVGRiBIQVJUTUFOTiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUT0RPOgorICogLSBBbGxvY2F0ZSBtb3JlIHRoYW4gb3JkZXIgMCBwYWdlcyB0byBhdm9pZCB0b28gbXVjaCBsaW5lYXIgbWFwIHNwbGl0dGluZy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworX191MzIgKmFncF9nYXR0X3RhYmxlOworaW50IGFncF9tZW1vcnlfcmVzZXJ2ZWQ7CisKKy8qCisgKiBOZWVkZWQgYnkgdGhlIE5mb3JjZSBHQVJUIGRyaXZlciBmb3IgdGhlIHRpbWUgYmVpbmcuIFdvdWxkIGJlCisgKiBuaWNlIHRvIGRvIHRoaXMgc29tZSBvdGhlciB3YXkgaW5zdGVhZCBvZiBuZWVkaW5nIHRoaXMgZXhwb3J0LgorICovCitFWFBPUlRfU1lNQk9MX0dQTChhZ3BfbWVtb3J5X3Jlc2VydmVkKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1g4NikKK2ludCBtYXBfcGFnZV9pbnRvX2FncChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgaTsKKwlpID0gY2hhbmdlX3BhZ2VfYXR0cihwYWdlLCAxLCBQQUdFX0tFUk5FTF9OT0NBQ0hFKTsKKwlnbG9iYWxfZmx1c2hfdGxiKCk7CisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYXBfcGFnZV9pbnRvX2FncCk7CisKK2ludCB1bm1hcF9wYWdlX2Zyb21fYWdwKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCBpOworCWkgPSBjaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIDEsIFBBR0VfS0VSTkVMKTsKKwlnbG9iYWxfZmx1c2hfdGxiKCk7CisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bm1hcF9wYWdlX2Zyb21fYWdwKTsKKyNlbmRpZgorCisvKgorICogR2VuZXJpYyByb3V0aW5lcyBmb3IgaGFuZGxpbmcgYWdwX21lbW9yeSBzdHJ1Y3R1cmVzIC0KKyAqIFRoZXkgdXNlIHRoZSBiYXNpYyBwYWdlIGFsbG9jYXRpb24gcm91dGluZXMgdG8gZG8gdGhlIGJydW50IG9mIHRoZSB3b3JrLgorICovCisKK3ZvaWQgYWdwX2ZyZWVfa2V5KGludCBrZXkpCit7CisJaWYgKGtleSA8IDApCisJCXJldHVybjsKKworCWlmIChrZXkgPCBNQVhLRVkpCisJCWNsZWFyX2JpdChrZXksIGFncF9icmlkZ2UtPmtleV9saXN0KTsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2ZyZWVfa2V5KTsKKworCitzdGF0aWMgaW50IGFncF9nZXRfa2V5KHZvaWQpCit7CisJaW50IGJpdDsKKworCWJpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQoYWdwX2JyaWRnZS0+a2V5X2xpc3QsIE1BWEtFWSk7CisJaWYgKGJpdCA8IE1BWEtFWSkgeworCQlzZXRfYml0KGJpdCwgYWdwX2JyaWRnZS0+a2V5X2xpc3QpOworCQlyZXR1cm4gYml0OworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworc3RydWN0IGFncF9tZW1vcnkgKmFncF9jcmVhdGVfbWVtb3J5KGludCBzY3JhdGNoX3BhZ2VzKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisKKwluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWdwX21lbW9yeSksIEdGUF9LRVJORUwpOworCisJaWYgKG5ldyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX21lbW9yeSkpOworCW5ldy0+a2V5ID0gYWdwX2dldF9rZXkoKTsKKworCWlmIChuZXctPmtleSA8IDApIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW5ldy0+bWVtb3J5ID0gdm1hbGxvYyhQQUdFX1NJWkUgKiBzY3JhdGNoX3BhZ2VzKTsKKworCWlmIChuZXctPm1lbW9yeSA9PSBOVUxMKSB7CisJCWFncF9mcmVlX2tleShuZXctPmtleSk7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiBOVUxMOworCX0KKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gc2NyYXRjaF9wYWdlczsKKwlyZXR1cm4gbmV3OworfQorRVhQT1JUX1NZTUJPTChhZ3BfY3JlYXRlX21lbW9yeSk7CisKKy8qKgorICoJYWdwX2ZyZWVfbWVtb3J5IC0gZnJlZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGFuIGFncF9tZW1vcnkgcG9pbnRlci4KKyAqCisgKglAY3VycjoJCWFncF9tZW1vcnkgcG9pbnRlciB0byBiZSBmcmVlZC4KKyAqCisgKglJdCBpcyB0aGUgb25seSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgYmFja2VuZCBpcyBub3Qgb3duZWQKKyAqCWJ5IHRoZSBjYWxsZXIuICAoU28gaXQgY2FuIGZyZWUgbWVtb3J5IG9uIGNsaWVudCBkZWF0aC4pCisgKi8KK3ZvaWQgYWdwX2ZyZWVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyKQoreworCXNpemVfdCBpOworCisJaWYgKGN1cnIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGN1cnItPmlzX2JvdW5kID09IFRSVUUpCisJCWFncF91bmJpbmRfbWVtb3J5KGN1cnIpOworCisJaWYgKGN1cnItPnR5cGUgIT0gMCkgeworCQljdXJyLT5icmlkZ2UtPmRyaXZlci0+ZnJlZV9ieV90eXBlKGN1cnIpOworCQlyZXR1cm47CisJfQorCWlmIChjdXJyLT5wYWdlX2NvdW50ICE9IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGN1cnItPnBhZ2VfY291bnQ7IGkrKykgeworCQkJY3Vyci0+YnJpZGdlLT5kcml2ZXItPmFncF9kZXN0cm95X3BhZ2UocGh5c190b192aXJ0KGN1cnItPm1lbW9yeVtpXSkpOworCQl9CisJfQorCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOworCXZmcmVlKGN1cnItPm1lbW9yeSk7CisJa2ZyZWUoY3Vycik7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9mcmVlX21lbW9yeSk7CisKKyNkZWZpbmUgRU5UUklFU19QRVJfUEFHRQkJKFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworLyoqCisgKglhZ3BfYWxsb2NhdGVfbWVtb3J5ICAtICBhbGxvY2F0ZSBhIGdyb3VwIG9mIHBhZ2VzIG9mIGEgY2VydGFpbiB0eXBlLgorICoKKyAqCUBwYWdlX2NvdW50OglzaXplX3QgYXJndW1lbnQgb2YgdGhlIG51bWJlciBvZiBwYWdlcworICoJQHR5cGU6CXUzMiBhcmd1bWVudCBvZiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqCUV2ZXJ5IGFncCBicmlkZ2UgZGV2aWNlIHdpbGwgYWxsb3cgeW91IHRvIGFsbG9jYXRlIEFHUF9OT1JNQUxfTUVNT1JZIHdoaWNoCisgKgltYXBzIHRvIHBoeXNpY2FsIHJhbS4gIEFueSBvdGhlciB0eXBlIGlzIGRldmljZSBkZXBlbmRlbnQuCisgKgorICoJSXQgcmV0dXJucyBOVUxMIHdoZW5ldmVyIG1lbW9yeSBpcyB1bmF2YWlsYWJsZS4KKyAqLworc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCQlzaXplX3QgcGFnZV9jb3VudCwgdTMyIHR5cGUpCit7CisJaW50IHNjcmF0Y2hfcGFnZXM7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKwlzaXplX3QgaTsKKworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoYXRvbWljX3JlYWQoJmJyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKSArIHBhZ2VfY291bnQpID4gYnJpZGdlLT5tYXhfbWVtb3J5X2FncCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHlwZSAhPSAwKSB7CisJCW5ldyA9IGJyaWRnZS0+ZHJpdmVyLT5hbGxvY19ieV90eXBlKHBhZ2VfY291bnQsIHR5cGUpOworCQlpZiAobmV3KQorCQkJbmV3LT5icmlkZ2UgPSBicmlkZ2U7CisJCXJldHVybiBuZXc7CisJfQorCisJc2NyYXRjaF9wYWdlcyA9IChwYWdlX2NvdW50ICsgRU5UUklFU19QRVJfUEFHRSAtIDEpIC8gRU5UUklFU19QRVJfUEFHRTsKKworCW5ldyA9IGFncF9jcmVhdGVfbWVtb3J5KHNjcmF0Y2hfcGFnZXMpOworCisJaWYgKG5ldyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKKwkJdm9pZCAqYWRkciA9IGJyaWRnZS0+ZHJpdmVyLT5hZ3BfYWxsb2NfcGFnZShicmlkZ2UpOworCisJCWlmIChhZGRyID09IE5VTEwpIHsKKwkJCWFncF9mcmVlX21lbW9yeShuZXcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbmV3LT5tZW1vcnlbaV0gPSB2aXJ0X3RvX3BoeXMoYWRkcik7CisJCW5ldy0+cGFnZV9jb3VudCsrOworCX0KKyAgICAgICBuZXctPmJyaWRnZSA9IGJyaWRnZTsKKworCWZsdXNoX2FncF9tYXBwaW5ncygpOworCisJcmV0dXJuIG5ldzsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2FsbG9jYXRlX21lbW9yeSk7CisKKworLyogRW5kIC0gR2VuZXJpYyByb3V0aW5lcyBmb3IgaGFuZGxpbmcgYWdwX21lbW9yeSBzdHJ1Y3R1cmVzICovCisKKworc3RhdGljIGludCBhZ3BfcmV0dXJuX3NpemUodm9pZCkKK3sKKwlpbnQgY3VycmVudF9zaXplOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCisJc3dpdGNoIChhZ3BfYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCWNhc2UgVThfQVBFUl9TSVpFOgorCQljdXJyZW50X3NpemUgPSBBX1NJWkVfOCh0ZW1wKS0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBVMTZfQVBFUl9TSVpFOgorCQljdXJyZW50X3NpemUgPSBBX1NJWkVfMTYodGVtcCktPnNpemU7CisJCWJyZWFrOworCWNhc2UgVTMyX0FQRVJfU0laRToKKwkJY3VycmVudF9zaXplID0gQV9TSVpFXzMyKHRlbXApLT5zaXplOworCQlicmVhazsKKwljYXNlIExWTDJfQVBFUl9TSVpFOgorCQljdXJyZW50X3NpemUgPSBBX1NJWkVfTFZMMih0ZW1wKS0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBGSVhFRF9BUEVSX1NJWkU6CisJCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgodGVtcCktPnNpemU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN1cnJlbnRfc2l6ZSA9IDA7CisJCWJyZWFrOworCX0KKworCWN1cnJlbnRfc2l6ZSAtPSAoYWdwX21lbW9yeV9yZXNlcnZlZCAvICgxMDI0KjEwMjQpKTsKKwlpZiAoY3VycmVudF9zaXplIDwwKQorCQljdXJyZW50X3NpemUgPSAwOworCXJldHVybiBjdXJyZW50X3NpemU7Cit9CisKKworaW50IGFncF9udW1fZW50cmllcyh2b2lkKQoreworCWludCBudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKworCXN3aXRjaCAoYWdwX2JyaWRnZS0+ZHJpdmVyLT5zaXplX3R5cGUpIHsKKwljYXNlIFU4X0FQRVJfU0laRToKKwkJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgVTE2X0FQRVJfU0laRToKKwkJbnVtX2VudHJpZXMgPSBBX1NJWkVfMTYodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIFUzMl9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzMyKHRlbXApLT5udW1fZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBMVkwyX0FQRVJfU0laRToKKwkJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludW1fZW50cmllcyA9IDA7CisJCWJyZWFrOworCX0KKworCW51bV9lbnRyaWVzIC09IGFncF9tZW1vcnlfcmVzZXJ2ZWQ+PlBBR0VfU0hJRlQ7CisJaWYgKG51bV9lbnRyaWVzPDApCisJCW51bV9lbnRyaWVzID0gMDsKKwlyZXR1cm4gbnVtX2VudHJpZXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZ3BfbnVtX2VudHJpZXMpOworCisKK3N0YXRpYyBpbnQgY2hlY2tfYnJpZGdlX21vZGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgYWdwMzsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgY2FwX3B0citBR1BTVEFULCAmYWdwMyk7CisJaWYgKGFncDMgJiBBR1BTVEFUX01PREVfM18wKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCWFncF9jb3B5X2luZm8gIC0gIGNvcHkgYnJpZGdlIHN0YXRlIGluZm9ybWF0aW9uCisgKgorICoJQGluZm86CQlhZ3Bfa2Vybl9pbmZvIHBvaW50ZXIuICBUaGUgY2FsbGVyIHNob3VsZCBpbnN1cmUgdGhhdCB0aGlzIHBvaW50ZXIgaXMgdmFsaWQuIAorICoKKyAqCVRoaXMgZnVuY3Rpb24gY29waWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhZ3AgYnJpZGdlIGRldmljZSBhbmQgdGhlIHN0YXRlIG9mCisgKgl0aGUgYWdwIGJhY2tlbmQgaW50byBhbiBhZ3Bfa2Vybl9pbmZvIHBvaW50ZXIuCisgKi8KK2ludCBhZ3BfY29weV9pbmZvKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgc3RydWN0IGFncF9rZXJuX2luZm8gKmluZm8pCit7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2tlcm5faW5mbykpOworCWlmICghYnJpZGdlKSB7CisJCWluZm8tPmNoaXBzZXQgPSBOT1RfU1VQUE9SVEVEOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpbmZvLT52ZXJzaW9uLm1ham9yID0gYnJpZGdlLT52ZXJzaW9uLT5tYWpvcjsKKwlpbmZvLT52ZXJzaW9uLm1pbm9yID0gYnJpZGdlLT52ZXJzaW9uLT5taW5vcjsKKwlpbmZvLT5jaGlwc2V0ID0gU1VQUE9SVEVEOworCWluZm8tPmRldmljZSA9IGJyaWRnZS0+ZGV2OworCWlmIChjaGVja19icmlkZ2VfbW9kZShicmlkZ2UtPmRldikpCisJCWluZm8tPm1vZGUgPSBicmlkZ2UtPm1vZGUgJiB+QUdQM19SRVNFUlZFRF9NQVNLOworCWVsc2UKKwkJaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZSAmIH5BR1AyX1JFU0VSVkVEX01BU0s7CisJaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZTsKKwlpbmZvLT5hcGVyX2Jhc2UgPSBicmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJaW5mby0+YXBlcl9zaXplID0gYWdwX3JldHVybl9zaXplKCk7CisJaW5mby0+bWF4X21lbW9yeSA9IGJyaWRnZS0+bWF4X21lbW9yeV9hZ3A7CisJaW5mby0+Y3VycmVudF9tZW1vcnkgPSBhdG9taWNfcmVhZCgmYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOworCWluZm8tPmNhbnRfdXNlX2FwZXJ0dXJlID0gYnJpZGdlLT5kcml2ZXItPmNhbnRfdXNlX2FwZXJ0dXJlOworCWluZm8tPnZtX29wcyA9IGJyaWRnZS0+dm1fb3BzOworCWluZm8tPnBhZ2VfbWFzayA9IH4wVUw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9jb3B5X2luZm8pOworCisvKiBFbmQgLSBSb3V0aW5lIHRvIGNvcHkgb3ZlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIFJvdXRpbmVzIGZvciBoYW5kbGluZyBzd2FwcGluZyBvZiBhZ3BfbWVtb3J5IGludG8gdGhlIEdBVFQgLQorICogVGhlc2Ugcm91dGluZXMgdGFrZSBhZ3BfbWVtb3J5IGFuZCBpbnNlcnQgdGhlbSBpbnRvIHRoZSBHQVRULgorICogVGhleSBjYWxsIGRldmljZSBzcGVjaWZpYyByb3V0aW5lcyB0byBhY3R1YWxseSB3cml0ZSB0byB0aGUgR0FUVC4KKyAqLworCisvKioKKyAqCWFncF9iaW5kX21lbW9yeSAgLSAgQmluZCBhbiBhZ3BfbWVtb3J5IHN0cnVjdHVyZSBpbnRvIHRoZSBHQVRULgorICoKKyAqCUBjdXJyOgkJYWdwX21lbW9yeSBwb2ludGVyCisgKglAcGdfc3RhcnQ6CWFuIG9mZnNldCBpbnRvIHRoZSBncmFwaGljcyBhcGVydHVyZSB0cmFuc2xhdGlvbiB0YWJsZQorICoKKyAqCUl0IHJldHVybnMgLUVJTlZBTCBpZiB0aGUgcG9pbnRlciA9PSBOVUxMLgorICoJSXQgcmV0dXJucyAtRUJVU1kgaWYgdGhlIGFyZWEgb2YgdGhlIHRhYmxlIHJlcXVlc3RlZCBpcyBhbHJlYWR5IGluIHVzZS4KKyAqLworaW50IGFncF9iaW5kX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqY3Vyciwgb2ZmX3QgcGdfc3RhcnQpCit7CisJaW50IHJldF92YWw7CisKKwlpZiAoY3VyciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjdXJyLT5pc19ib3VuZCA9PSBUUlVFKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAibWVtb3J5ICVwIGlzIGFscmVhZHkgYm91bmQhXG4iLCBjdXJyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjdXJyLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCWN1cnItPmJyaWRnZS0+ZHJpdmVyLT5jYWNoZV9mbHVzaCgpOworCQljdXJyLT5pc19mbHVzaGVkID0gVFJVRTsKKwl9CisJcmV0X3ZhbCA9IGN1cnItPmJyaWRnZS0+ZHJpdmVyLT5pbnNlcnRfbWVtb3J5KGN1cnIsIHBnX3N0YXJ0LCBjdXJyLT50eXBlKTsKKworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCisJY3Vyci0+aXNfYm91bmQgPSBUUlVFOworCWN1cnItPnBnX3N0YXJ0ID0gcGdfc3RhcnQ7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9iaW5kX21lbW9yeSk7CisKKworLyoqCisgKglhZ3BfdW5iaW5kX21lbW9yeSAgLSAgUmVtb3ZlcyBhbiBhZ3BfbWVtb3J5IHN0cnVjdHVyZSBmcm9tIHRoZSBHQVRUCisgKgorICogQGN1cnI6CWFncF9tZW1vcnkgcG9pbnRlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIEdBVFQuCisgKgorICogSXQgcmV0dXJucyAtRUlOVkFMIGlmIHRoaXMgcGllY2Ugb2YgYWdwX21lbW9yeSBpcyBub3QgY3VycmVudGx5IGJvdW5kIHRvCisgKiB0aGUgZ3JhcGhpY3MgYXBlcnR1cmUgdHJhbnNsYXRpb24gdGFibGUgb3IgaWYgdGhlIGFncF9tZW1vcnkgcG9pbnRlciA9PSBOVUxMCisgKi8KK2ludCBhZ3BfdW5iaW5kX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycikKK3sKKwlpbnQgcmV0X3ZhbDsKKworCWlmIChjdXJyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGN1cnItPmlzX2JvdW5kICE9IFRSVUUpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJtZW1vcnkgJXAgd2FzIG5vdCBib3VuZCFcbiIsIGN1cnIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXRfdmFsID0gY3Vyci0+YnJpZGdlLT5kcml2ZXItPnJlbW92ZV9tZW1vcnkoY3VyciwgY3Vyci0+cGdfc3RhcnQsIGN1cnItPnR5cGUpOworCisJaWYgKHJldF92YWwgIT0gMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwljdXJyLT5pc19ib3VuZCA9IEZBTFNFOworCWN1cnItPnBnX3N0YXJ0ID0gMDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwX3VuYmluZF9tZW1vcnkpOworCisvKiBFbmQgLSBSb3V0aW5lcyBmb3IgaGFuZGxpbmcgc3dhcHBpbmcgb2YgYWdwX21lbW9yeSBpbnRvIHRoZSBHQVRUICovCisKKworLyogR2VuZXJpYyBBZ3Agcm91dGluZXMgLSBTdGFydCAqLworc3RhdGljIHZvaWQgYWdwX3YyX3BhcnNlX29uZSh1MzIgKnJlcXVlc3RlZF9tb2RlLCB1MzIgKmJyaWRnZV9hZ3BzdGF0LCB1MzIgKnZnYV9hZ3BzdGF0KQoreworCXUzMiB0bXA7CisKKwlpZiAoKnJlcXVlc3RlZF9tb2RlICYgQUdQMl9SRVNFUlZFRF9NQVNLKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAicmVzZXJ2ZWQgYml0cyBzZXQgaW4gbW9kZSAweCV4LiBGaXhlZC5cbiIsICpyZXF1ZXN0ZWRfbW9kZSk7CisJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+QUdQMl9SRVNFUlZFRF9NQVNLOworCX0KKworCS8qIENoZWNrIHRoZSBzcGVlZCBiaXRzIG1ha2Ugc2Vuc2UuIE9ubHkgb25lIHNob3VsZCBiZSBzZXQuICovCisJdG1wID0gKnJlcXVlc3RlZF9tb2RlICYgNzsKKwlzd2l0Y2ggKHRtcCkgeworCQljYXNlIDA6CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHRyaWVkIHRvIHNldCByYXRlPXgwLiBTZXR0aW5nIHRvIHgxIG1vZGUuXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJCSpyZXF1ZXN0ZWRfbW9kZSB8PSBBR1BTVEFUMl8xWDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkqcmVxdWVzdGVkX21vZGUgJj0gfihBR1BTVEFUMl8xWCk7CS8qIHJhdGU9MiAqLworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJKnJlcXVlc3RlZF9tb2RlICY9IH4oQUdQU1RBVDJfMVh8QUdQU1RBVDJfMlgpOyAvKiByYXRlPTQqLworCQkJYnJlYWs7CisJfQorCisJLyogZGlzYWJsZSBTQkEgaWYgaXQncyBub3Qgc3VwcG9ydGVkICovCisJaWYgKCEoKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVRfU0JBKSAmJiAoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVF9TQkEpICYmICgqcmVxdWVzdGVkX21vZGUgJiBBR1BTVEFUX1NCQSkpKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfU0JBOworCisJLyogU2V0IHJhdGUgKi8KKwlpZiAoISgoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfNFgpICYmICgqdmdhX2FncHN0YXQgJiBBR1BTVEFUMl80WCkgJiYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzRYKSkpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVDJfNFg7CisKKwlpZiAoISgoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMlgpICYmICgqdmdhX2FncHN0YXQgJiBBR1BTVEFUMl8yWCkgJiYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzJYKSkpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVDJfMlg7CisKKwlpZiAoISgoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMVgpICYmICgqdmdhX2FncHN0YXQgJiBBR1BTVEFUMl8xWCkgJiYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzFYKSkpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVDJfMVg7CisKKwkvKiBOb3cgd2Uga25vdyB3aGF0IG1vZGUgaXQgc2hvdWxkIGJlLCBjbGVhciBvdXQgdGhlIHVud2FudGVkIGJpdHMuICovCisJaWYgKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQyXzRYKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUMl8xWCB8IEFHUFNUQVQyXzJYKTsJLyogNFggKi8KKworCWlmICgqYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUMl8yWCkKKwkJKmJyaWRnZV9hZ3BzdGF0ICY9IH4oQUdQU1RBVDJfMVggfCBBR1BTVEFUMl80WCk7CS8qIDJYICovCisKKwlpZiAoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMVgpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+KEFHUFNUQVQyXzJYIHwgQUdQU1RBVDJfNFgpOwkvKiAxWCAqLworCisJLyogQXBwbHkgYW55IGVycmF0YS4gKi8KKwlpZiAoYWdwX2JyaWRnZS0+ZmxhZ3MgJiBBR1BfRVJSQVRBX0ZBU1RXUklURVMpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVF9GVzsKKworCWlmIChhZ3BfYnJpZGdlLT5mbGFncyAmIEFHUF9FUlJBVEFfU0JBKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfU0JBOworCisJaWYgKGFncF9icmlkZ2UtPmZsYWdzICYgQUdQX0VSUkFUQV8xWCkgeworCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzRYKTsKKwkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQyXzFYOworCX0KKworCS8qIElmIHdlJ3ZlIGRyb3BwZWQgZG93biB0byAxWCwgZGlzYWJsZSBmYXN0IHdyaXRlcy4gKi8KKwlpZiAoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMVgpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVF9GVzsKK30KKworLyoKKyAqIHJlcXVlc3RlZF9tb2RlID0gTW9kZSByZXF1ZXN0ZWQgYnkgKHR5cGljYWxseSkgWC4KKyAqIGJyaWRnZV9hZ3BzdGF0ID0gUENJX0FHUF9TVEFUVVMgZnJvbSBhZ3AgYnJpZGdlLgorICogdmdhX2FncHN0YXQgPSBQQ0lfQUdQX1NUQVRVUyBmcm9tIGdyYXBoaWMgY2FyZC4KKyAqLworc3RhdGljIHZvaWQgYWdwX3YzX3BhcnNlX29uZSh1MzIgKnJlcXVlc3RlZF9tb2RlLCB1MzIgKmJyaWRnZV9hZ3BzdGF0LCB1MzIgKnZnYV9hZ3BzdGF0KQoreworCXUzMiBvcmlnYnJpZGdlPSpicmlkZ2VfYWdwc3RhdCwgb3JpZ3ZnYT0qdmdhX2FncHN0YXQ7CisJdTMyIHRtcDsKKworCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1AzX1JFU0VSVkVEX01BU0spIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJyZXNlcnZlZCBiaXRzIHNldCBpbiBtb2RlIDB4JXguIEZpeGVkLlxuIiwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJKnJlcXVlc3RlZF9tb2RlICY9IH5BR1AzX1JFU0VSVkVEX01BU0s7CisJfQorCisJLyogQ2hlY2sgdGhlIHNwZWVkIGJpdHMgbWFrZSBzZW5zZS4gKi8KKwl0bXAgPSAqcmVxdWVzdGVkX21vZGUgJiA3OworCWlmICh0bXAgPT0gMCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHRyaWVkIHRvIHNldCByYXRlPXgwLiBTZXR0aW5nIHRvIEFHUDMgeDQgbW9kZS5cbiIsIGN1cnJlbnQtPmNvbW0pOworCQkqcmVxdWVzdGVkX21vZGUgfD0gQUdQU1RBVDNfNFg7CisJfQorCWlmICh0bXAgPj0gMykgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHRyaWVkIHRvIHNldCByYXRlPXglZC4gU2V0dGluZyB0byBBR1AzIHg4IG1vZGUuXG4iLCBjdXJyZW50LT5jb21tLCB0bXAgKiA0KTsKKwkJKnJlcXVlc3RlZF9tb2RlID0gKCpyZXF1ZXN0ZWRfbW9kZSAmIH43KSB8IEFHUFNUQVQzXzhYOworCX0KKworCS8qIEFSUVNaIC0gU2V0IHRoZSB2YWx1ZSB0byB0aGUgbWF4aW11bSBvbmUuCisJICogRG9uJ3QgYWxsb3cgdGhlIG1vZGUgcmVnaXN0ZXIgdG8gb3ZlcnJpZGUgdmFsdWVzLiAqLworCSpicmlkZ2VfYWdwc3RhdCA9ICgoKmJyaWRnZV9hZ3BzdGF0ICYgfkFHUFNUQVRfQVJRU1opIHwKKwkJbWF4X3QodTMyLCgqYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUX0FSUVNaKSwoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVF9BUlFTWikpKTsKKworCS8qIENhbGlicmF0aW9uIGN5Y2xlLgorCSAqIERvbid0IGFsbG93IHRoZSBtb2RlIHJlZ2lzdGVyIHRvIG92ZXJyaWRlIHZhbHVlcy4gKi8KKwkqYnJpZGdlX2FncHN0YXQgPSAoKCpicmlkZ2VfYWdwc3RhdCAmIH5BR1BTVEFUX0NBTF9NQVNLKSB8CisJCW1pbl90KHUzMiwoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVF9DQUxfTUFTSyksKCp2Z2FfYWdwc3RhdCAmIEFHUFNUQVRfQ0FMX01BU0spKSk7CisKKwkvKiBTQkEgKm11c3QqIGJlIHN1cHBvcnRlZCBmb3IgQUdQIHYzICovCisJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVRfU0JBOworCisJLyoKKwkgKiBTZXQgc3BlZWQuCisJICogQ2hlY2sgZm9yIGludmFsaWQgc3BlZWRzLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhcHBsaWNhdGlvbnMKKwkgKiB3cml0dGVuIGJlZm9yZSB0aGUgQUdQIDMuMCBzdGFuZGFyZCBwYXNzIEFHUDIueCBtb2RlcyB0byBBR1AzIGhhcmR3YXJlCisJICovCisJaWYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVRfTU9ERV8zXzApIHsKKwkJLyoKKwkJICogQ2FsbGVyIGhhc24ndCBhIGNsdWUgd2hhdCBpdCBpcyBkb2luZy4gQnJpZGdlIGlzIGluIDMuMCBtb2RlLAorCQkgKiBoYXZlIGJlZW4gcGFzc2VkIGEgMy4wIG1vZGUsIGJ1dCB3aXRoIDIueCBzcGVlZCBiaXRzIHNldC4KKwkJICogQUdQMi54IDR4IC0+IEFHUDMuMCA0eC4KKwkJICovCisJCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1BTVEFUMl80WCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICIlcyBwYXNzZXMgYnJva2VuIEFHUDMgZmxhZ3MgKCV4KS4gRml4ZWQuXG4iLAorCQkJCQkJY3VycmVudC0+Y29tbSwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+QUdQU1RBVDJfNFg7CisJCQkqcmVxdWVzdGVkX21vZGUgfD0gQUdQU1RBVDNfNFg7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgY2FsbGVyIGRvZXNuJ3Qga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nLiBXZSBhcmUgaW4gMy4wIG1vZGUsCisJCSAqIGJ1dCBoYXZlIGJlZW4gcGFzc2VkIGFuIEFHUCAyLnggbW9kZS4KKwkJICogQ29udmVydCBBR1AgMXgsMngsNHggLT4gQUdQIDMuMCA0eC4KKwkJICovCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiJXMgcGFzc2VzIGJyb2tlbiBBR1AyIGZsYWdzICgleCkgaW4gQUdQMyBtb2RlLiBGaXhlZC5cbiIsCisJCQkJCWN1cnJlbnQtPmNvbW0sICpyZXF1ZXN0ZWRfbW9kZSk7CisJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+KEFHUFNUQVQyXzRYIHwgQUdQU1RBVDJfMlggfCBBR1BTVEFUMl8xWCk7CisJCSpyZXF1ZXN0ZWRfbW9kZSB8PSBBR1BTVEFUM180WDsKKwl9CisKKwlpZiAoKnJlcXVlc3RlZF9tb2RlICYgQUdQU1RBVDNfOFgpIHsKKwkJaWYgKCEoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDNfOFgpKSB7CisJCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUM184WCB8IEFHUFNUQVQzX1JTVkQpOworCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOworCQkJcHJpbnRrICgiJXMgcmVxdWVzdGVkIEFHUHg4IGJ1dCBicmlkZ2Ugbm90IGNhcGFibGUuXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoISgqdmdhX2FncHN0YXQgJiBBR1BTVEFUM184WCkpIHsKKwkJCSpicmlkZ2VfYWdwc3RhdCAmPSB+KEFHUFNUQVQzXzhYIHwgQUdQU1RBVDNfUlNWRCk7CisJCQkqYnJpZGdlX2FncHN0YXQgfD0gQUdQU1RBVDNfNFg7CisJCQlwcmludGsgKCIlcyByZXF1ZXN0ZWQgQUdQeDggYnV0IGdyYXBoaWMgY2FyZCBub3QgY2FwYWJsZS5cbiIsIGN1cnJlbnQtPmNvbW0pOworCQkJcmV0dXJuOworCQl9CisJCS8qIEFsbCBzZXQsIGJyaWRnZSAmIGRldmljZSBjYW4gZG8gQUdQIHg4Ki8KKwkJKmJyaWRnZV9hZ3BzdGF0ICY9IH4oQUdQU1RBVDNfNFggfCBBR1BTVEFUM19SU1ZEKTsKKwkJZ290byBkb25lOworCisJfSBlbHNlIHsKKworCQkvKgorCQkgKiBJZiB3ZSBkaWRuJ3Qgc3BlY2lmeSBBR1B4OCwgd2UgY2FuIG9ubHkgZG8geDQuCisJCSAqIElmIHRoZSBoYXJkd2FyZSBjYW4ndCBkbyB4NCwgd2UncmUgdXAgc2hpdCBjcmVlaywgYW5kIG5ldmVyCisJCSAqICBzaG91bGQgaGF2ZSBnb3QgdGhpcyBmYXIuCisJCSAqLworCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUM184WCB8IEFHUFNUQVQzX1JTVkQpOworCQlpZiAoKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQzXzRYKSAmJiAoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVDNfNFgpKQorCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOworCQllbHNlIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQmFkbmVzcy4gRG9uJ3Qga25vdyB3aGljaCBBR1AgbW9kZSB0byBzZXQuICIKKwkJCQkJCQkiW2JyaWRnZV9hZ3BzdGF0OiV4IHZnYV9hZ3BzdGF0OiV4IGZlbGwgYmFjayB0bzotIGJyaWRnZV9hZ3BzdGF0OiV4IHZnYV9hZ3BzdGF0OiV4XVxuIiwKKwkJCQkJCQlvcmlnYnJpZGdlLCBvcmlndmdhLCAqYnJpZGdlX2FncHN0YXQsICp2Z2FfYWdwc3RhdCk7CisJCQlpZiAoISgqYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUM180WCkpCisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCcmlkZ2UgY291bGRuJ3QgZG8gQUdQIHg0LlxuIik7CisJCQlpZiAoISgqdmdhX2FncHN0YXQgJiBBR1BTVEFUM180WCkpCisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJHcmFwaGljIGNhcmQgY291bGRuJ3QgZG8gQUdQIHg0LlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKK2RvbmU6CisJLyogQXBwbHkgYW55IGVycmF0YS4gKi8KKwlpZiAoYWdwX2JyaWRnZS0+ZmxhZ3MgJiBBR1BfRVJSQVRBX0ZBU1RXUklURVMpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVF9GVzsKKworCWlmIChhZ3BfYnJpZGdlLT5mbGFncyAmIEFHUF9FUlJBVEFfU0JBKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfU0JBOworCisJaWYgKGFncF9icmlkZ2UtPmZsYWdzICYgQUdQX0VSUkFUQV8xWCkgeworCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzRYKTsKKwkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQyXzFYOworCX0KK30KKworCisvKioKKyAqIGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMgLSBkZXRlcm1pbmUgY29ycmVjdCBhZ3BfY21kIGZyb20gdmFyaW91cyBhZ3Bfc3RhdCdzCisgKiBAYnJpZGdlOiBhbiBhZ3BfYnJpZGdlX2RhdGEgc3RydWN0IGFsbG9jYXRlZCBmb3IgdGhlIEFHUCBob3N0IGJyaWRnZS4KKyAqIEByZXF1ZXN0ZWRfbW9kZTogcmVxdWVzdGVkIGFncF9zdGF0IGZyb20gdXNlcnNwYWNlIChUeXBpY2FsbHkgZnJvbSBYKQorICogQGJyaWRnZV9hZ3BzdGF0OiBjdXJyZW50IGFncF9zdGF0IGZyb20gQUdQIGJyaWRnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaHVudCBmb3IgYW4gQUdQIGdyYXBoaWNzIGNhcmQsIGFuZCB0cnkgdG8gbWF0Y2gKKyAqIHRoZSByZXF1ZXN0ZWQgbW9kZSB0byB0aGUgY2FwYWJpbGl0aWVzIG9mIGJvdGggdGhlIGJyaWRnZSBhbmQgdGhlIGNhcmQuCisgKi8KK3UzMiBhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgdTMyIHJlcXVlc3RlZF9tb2RlLCB1MzIgYnJpZGdlX2FncHN0YXQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldmljZSA9IE5VTEw7CisJdTMyIHZnYV9hZ3BzdGF0OworCXU4IGNhcF9wdHI7CisKKwlmb3IgKDs7KSB7CisJCWRldmljZSA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIGRldmljZSk7CisJCWlmICghZGV2aWNlKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNvdWxkbid0IGZpbmQgYW4gQUdQIFZHQSBjb250cm9sbGVyLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXZpY2UsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKGNhcF9wdHIpCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIE9rLCBoZXJlIHdlIGhhdmUgYSBBR1AgZGV2aWNlLiBEaXNhYmxlIGltcG9zc2libGUKKwkgKiBzZXR0aW5ncywgYW5kIGFkanVzdCB0aGUgcmVhZHF1ZXVlIHRvIHRoZSBtaW5pbXVtLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZpY2UsIGNhcF9wdHIrUENJX0FHUF9TVEFUVVMsICZ2Z2FfYWdwc3RhdCk7CisKKwkvKiBhZGp1c3QgUlEgZGVwdGggKi8KKwlicmlkZ2VfYWdwc3RhdCA9ICgoYnJpZGdlX2FncHN0YXQgJiB+QUdQU1RBVF9SUV9ERVBUSCkgfAorCSAgICAgbWluX3QodTMyLCAocmVxdWVzdGVkX21vZGUgJiBBR1BTVEFUX1JRX0RFUFRIKSwKKwkJIG1pbl90KHUzMiwgKGJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVF9SUV9ERVBUSCksICh2Z2FfYWdwc3RhdCAmIEFHUFNUQVRfUlFfREVQVEgpKSkpOworCisJLyogZGlzYWJsZSBGVyBpZiBpdCdzIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoISgoYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUX0ZXKSAmJgorCQkgKHZnYV9hZ3BzdGF0ICYgQUdQU1RBVF9GVykgJiYKKwkJIChyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVRfRlcpKSkKKwkJYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfRlc7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIG9wZXJhdGluZyBpbiAzLjAgbW9kZSAqLworCWlmIChjaGVja19icmlkZ2VfbW9kZShhZ3BfYnJpZGdlLT5kZXYpKQorCQlhZ3BfdjNfcGFyc2Vfb25lKCZyZXF1ZXN0ZWRfbW9kZSwgJmJyaWRnZV9hZ3BzdGF0LCAmdmdhX2FncHN0YXQpOworCWVsc2UKKwkJYWdwX3YyX3BhcnNlX29uZSgmcmVxdWVzdGVkX21vZGUsICZicmlkZ2VfYWdwc3RhdCwgJnZnYV9hZ3BzdGF0KTsKKworCXBjaV9kZXZfcHV0KGRldmljZSk7CisJcmV0dXJuIGJyaWRnZV9hZ3BzdGF0OworfQorRVhQT1JUX1NZTUJPTChhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKTsKKworCit2b2lkIGFncF9kZXZpY2VfY29tbWFuZCh1MzIgYnJpZGdlX2FncHN0YXQsIGludCBhZ3BfdjMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldmljZSA9IE5VTEw7CisJaW50IG1vZGU7CisKKwltb2RlID0gYnJpZGdlX2FncHN0YXQgJiAweDc7CisJaWYgKGFncF92MykKKwkJbW9kZSAqPSA0OworCisJZm9yX2VhY2hfcGNpX2RldihkZXZpY2UpIHsKKwkJdTggYWdwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXZpY2UsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKCFhZ3ApCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUHV0dGluZyBBR1AgViVkIGRldmljZSBhdCAlcyBpbnRvICVkeCBtb2RlXG4iLAorCQkJCWFncF92MyA/IDMgOiAyLCBwY2lfbmFtZShkZXZpY2UpLCBtb2RlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZpY2UsIGFncCArIFBDSV9BR1BfQ09NTUFORCwgYnJpZGdlX2FncHN0YXQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woYWdwX2RldmljZV9jb21tYW5kKTsKKworCit2b2lkIGdldF9hZ3BfdmVyc2lvbihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdTMyIG5jYXBpZDsKKworCS8qIEV4aXQgZWFybHkgaWYgYWxyZWFkeSBzZXQgYnkgZXJyYXRhIHdvcmthcm91bmRzLiAqLworCWlmIChicmlkZ2UtPm1ham9yX3ZlcnNpb24gIT0gMCkKKwkJcmV0dXJuOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LCBicmlkZ2UtPmNhcG5keCwgJm5jYXBpZCk7CisJYnJpZGdlLT5tYWpvcl92ZXJzaW9uID0gKG5jYXBpZCA+PiBBR1BfTUFKT1JfVkVSU0lPTl9TSElGVCkgJiAweGY7CisJYnJpZGdlLT5taW5vcl92ZXJzaW9uID0gKG5jYXBpZCA+PiBBR1BfTUlOT1JfVkVSU0lPTl9TSElGVCkgJiAweGY7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9hZ3BfdmVyc2lvbik7CisKKwordm9pZCBhZ3BfZ2VuZXJpY19lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgcmVxdWVzdGVkX21vZGUpCit7CisJdTMyIGJyaWRnZV9hZ3BzdGF0LCB0ZW1wOworCisJZ2V0X2FncF92ZXJzaW9uKGFncF9icmlkZ2UpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIGFuIEFHUCAlZC4lZCBjb21wbGlhbnQgZGV2aWNlIGF0ICVzLlxuIiwKKwkJCQlhZ3BfYnJpZGdlLT5tYWpvcl92ZXJzaW9uLAorCQkJCWFncF9icmlkZ2UtPm1pbm9yX3ZlcnNpb24sCisJCQkJcGNpX25hbWUoYWdwX2JyaWRnZS0+ZGV2KSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LAorCQkgICAgICBhZ3BfYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX1NUQVRVUywgJmJyaWRnZV9hZ3BzdGF0KTsKKworCWJyaWRnZV9hZ3BzdGF0ID0gYWdwX2NvbGxlY3RfZGV2aWNlX3N0YXR1cyhhZ3BfYnJpZGdlLCByZXF1ZXN0ZWRfbW9kZSwgYnJpZGdlX2FncHN0YXQpOworCWlmIChicmlkZ2VfYWdwc3RhdCA9PSAwKQorCQkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLiBGSVhNRTogUmV0dXJuIGVycm9yIGNvZGU/ICovCisJCXJldHVybjsKKworCWJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVRfQUdQX0VOQUJMRTsKKworCS8qIERvIEFHUCB2ZXJzaW9uIHNwZWNpZmljIGZyb2JiaW5nLiAqLworCWlmIChicmlkZ2UtPm1ham9yX3ZlcnNpb24gPj0gMykgeworCQlpZiAoY2hlY2tfYnJpZGdlX21vZGUoYnJpZGdlLT5kZXYpKSB7CisJCQkvKiBJZiB3ZSBoYXZlIDMuNSwgd2UgY2FuIGRvIHRoZSBpc29jaCBzdHVmZi4gKi8KKwkJCWlmIChicmlkZ2UtPm1pbm9yX3ZlcnNpb24gPj0gNSkKKwkJCQlhZ3BfM181X2VuYWJsZShicmlkZ2UpOworCQkJYWdwX2RldmljZV9jb21tYW5kKGJyaWRnZV9hZ3BzdGF0LCBUUlVFKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJICAgIC8qIERpc2FibGUgY2FsaWJyYXRpb24gY3ljbGUgaW4gUlg5MTwxPiB3aGVuIG5vdCBpbiBBR1AzLjAgbW9kZSBvZiBvcGVyYXRpb24uKi8KKwkJICAgIGJyaWRnZV9hZ3BzdGF0ICY9IH4oNzw8MTApIDsKKwkJICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UtPmRldiwKKwkJCQkJYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgJnRlbXApOworCQkgICAgdGVtcCB8PSAoMTw8OSk7CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LAorCQkJCQlicmlkZ2UtPmNhcG5keCtBR1BDVFJMLCB0ZW1wKTsKKworCQkgICAgcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXZpY2UgaXMgaW4gbGVnYWN5IG1vZGUsIgorCQkJCSIgZmFsbGluZyBiYWNrIHRvIDIueFxuIik7CisJCX0KKwl9CisKKwkvKiBBR1AgdjwzICovCisJYWdwX2RldmljZV9jb21tYW5kKGJyaWRnZV9hZ3BzdGF0LCBGQUxTRSk7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2VuYWJsZSk7CisKKworaW50IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwljaGFyICp0YWJsZTsKKwljaGFyICp0YWJsZV9lbmQ7CisJaW50IHNpemU7CisJaW50IHBhZ2Vfb3JkZXI7CisJaW50IG51bV9lbnRyaWVzOworCWludCBpOworCXZvaWQgKnRlbXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBjYW4ndCBoYW5kbGUgMiBsZXZlbCBnYXR0J3MgKi8KKwlpZiAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSA9PSBMVkwyX0FQRVJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YWJsZSA9IE5VTEw7CisJaSA9IGJyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHg7CisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCXNpemUgPSBwYWdlX29yZGVyID0gbnVtX2VudHJpZXMgPSAwOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyLT5zaXplX3R5cGUgIT0gRklYRURfQVBFUl9TSVpFKSB7CisJCWRvIHsKKwkJCXN3aXRjaCAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCQkJY2FzZSBVOF9BUEVSX1NJWkU6CisJCQkJc2l6ZSA9IEFfU0laRV84KHRlbXApLT5zaXplOworCQkJCXBhZ2Vfb3JkZXIgPQorCQkJCSAgICBBX1NJWkVfOCh0ZW1wKS0+cGFnZV9vcmRlcjsKKwkJCQludW1fZW50cmllcyA9CisJCQkJICAgIEFfU0laRV84KHRlbXApLT5udW1fZW50cmllczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVTE2X0FQRVJfU0laRToKKwkJCQlzaXplID0gQV9TSVpFXzE2KHRlbXApLT5zaXplOworCQkJCXBhZ2Vfb3JkZXIgPSBBX1NJWkVfMTYodGVtcCktPnBhZ2Vfb3JkZXI7CisJCQkJbnVtX2VudHJpZXMgPSBBX1NJWkVfMTYodGVtcCktPm51bV9lbnRyaWVzOworCQkJCWJyZWFrOworCQkJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQkJCXNpemUgPSBBX1NJWkVfMzIodGVtcCktPnNpemU7CisJCQkJcGFnZV9vcmRlciA9IEFfU0laRV8zMih0ZW1wKS0+cGFnZV9vcmRlcjsKKwkJCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCQkJYnJlYWs7CisJCQkJLyogVGhpcyBjYXNlIHdpbGwgbmV2ZXIgcmVhbGx5IGhhcHBlbi4gKi8KKwkJCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQkJY2FzZSBMVkwyX0FQRVJfU0laRToKKwkJCWRlZmF1bHQ6CisJCQkJc2l6ZSA9IHBhZ2Vfb3JkZXIgPSBudW1fZW50cmllcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXRhYmxlID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJCSAgcGFnZV9vcmRlcik7CisKKwkJCWlmICh0YWJsZSA9PSBOVUxMKSB7CisJCQkJaSsrOworCQkJCXN3aXRjaCAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCQkJCWNhc2UgVThfQVBFUl9TSVpFOgorCQkJCQlicmlkZ2UtPmN1cnJlbnRfc2l6ZSA9IEFfSURYOChicmlkZ2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFUxNl9BUEVSX1NJWkU6CisJCQkJCWJyaWRnZS0+Y3VycmVudF9zaXplID0gQV9JRFgxNihicmlkZ2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFUzMl9BUEVSX1NJWkU6CisJCQkJCWJyaWRnZS0+Y3VycmVudF9zaXplID0gQV9JRFgzMihicmlkZ2UpOworCQkJCQlicmVhazsKKwkJCQkJLyogVGhpcyBjYXNlIHdpbGwgbmV2ZXIgcmVhbGx5IGhhcHBlbi4gKi8KKwkJCQljYXNlIEZJWEVEX0FQRVJfU0laRToKKwkJCQljYXNlIExWTDJfQVBFUl9TSVpFOgorCQkJCWRlZmF1bHQ6CisJCQkJCWJyaWRnZS0+Y3VycmVudF9zaXplID0KKwkJCQkJICAgIGJyaWRnZS0+Y3VycmVudF9zaXplOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCQkJfSBlbHNlIHsKKwkJCQlicmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCX0KKwkJfSB3aGlsZSAoIXRhYmxlICYmIChpIDwgYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplcykpOworCX0gZWxzZSB7CisJCXNpemUgPSAoKHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqKSB0ZW1wKS0+c2l6ZTsKKwkJcGFnZV9vcmRlciA9ICgoc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICopIHRlbXApLT5wYWdlX29yZGVyOworCQludW1fZW50cmllcyA9ICgoc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICopIHRlbXApLT5udW1fZW50cmllczsKKwkJdGFibGUgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2Vfb3JkZXIpOworCX0KKworCWlmICh0YWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRhYmxlX2VuZCA9IHRhYmxlICsgKChQQUdFX1NJWkUgKiAoMSA8PCBwYWdlX29yZGVyKSkgLSAxKTsKKworCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZSh0YWJsZSk7IHBhZ2UgPD0gdmlydF90b19wYWdlKHRhYmxlX2VuZCk7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCisJYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopIHRhYmxlOworCWFncF9nYXR0X3RhYmxlID0gKHZvaWQgKil0YWJsZTsKKworCWJyaWRnZS0+ZHJpdmVyLT5jYWNoZV9mbHVzaCgpOworCWJyaWRnZS0+Z2F0dF90YWJsZSA9IGlvcmVtYXBfbm9jYWNoZSh2aXJ0X3RvX3BoeXModGFibGUpLAorCQkJCQkoUEFHRV9TSVpFICogKDEgPDwgcGFnZV9vcmRlcikpKTsKKwlicmlkZ2UtPmRyaXZlci0+Y2FjaGVfZmx1c2goKTsKKworCWlmIChicmlkZ2UtPmdhdHRfdGFibGUgPT0gTlVMTCkgeworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UodGFibGUpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZSh0YWJsZV9lbmQpOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB0YWJsZSwgcGFnZV9vcmRlcik7CisKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyhicmlkZ2UtPmdhdHRfdGFibGVfcmVhbCk7CisKKwkvKiBBSzogYm9ndXMsIHNob3VsZCBlbmNvZGUgYWRkcmVzc2VzID4gNEdCICovCisJZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKwkJd3JpdGVsKGJyaWRnZS0+c2NyYXRjaF9wYWdlLCBicmlkZ2UtPmdhdHRfdGFibGUraSk7CisJCXJlYWRsKGJyaWRnZS0+Z2F0dF90YWJsZStpKTsJLyogUENJIFBvc3RpbmcuICovCisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlKTsKKworaW50IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IHBhZ2Vfb3JkZXI7CisJY2hhciAqdGFibGUsICp0YWJsZV9lbmQ7CisJdm9pZCAqdGVtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXRlbXAgPSBicmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKworCXN3aXRjaCAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCWNhc2UgVThfQVBFUl9TSVpFOgorCQlwYWdlX29yZGVyID0gQV9TSVpFXzgodGVtcCktPnBhZ2Vfb3JkZXI7CisJCWJyZWFrOworCWNhc2UgVTE2X0FQRVJfU0laRToKKwkJcGFnZV9vcmRlciA9IEFfU0laRV8xNih0ZW1wKS0+cGFnZV9vcmRlcjsKKwkJYnJlYWs7CisJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQlwYWdlX29yZGVyID0gQV9TSVpFXzMyKHRlbXApLT5wYWdlX29yZGVyOworCQlicmVhazsKKwljYXNlIEZJWEVEX0FQRVJfU0laRToKKwkJcGFnZV9vcmRlciA9IEFfU0laRV9GSVgodGVtcCktPnBhZ2Vfb3JkZXI7CisJCWJyZWFrOworCWNhc2UgTFZMMl9BUEVSX1NJWkU6CisJCS8qIFRoZSBnZW5lcmljIHJvdXRpbmVzIGNhbid0IGRlYWwgd2l0aCAyIGxldmVsIGdhdHQncyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFnZV9vcmRlciA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIERvIG5vdCB3b3JyeSBhYm91dCBmcmVlaW5nIG1lbW9yeSwgYmVjYXVzZSBpZiB0aGlzIGlzCisJICogY2FsbGVkLCB0aGVuIGFsbCBhZ3AgbWVtb3J5IGlzIGRlYWxsb2NhdGVkIGFuZCByZW1vdmVkCisJICogZnJvbSB0aGUgdGFibGUuICovCisKKwlpb3VubWFwKGJyaWRnZS0+Z2F0dF90YWJsZSk7CisJdGFibGUgPSAoY2hhciAqKSBicmlkZ2UtPmdhdHRfdGFibGVfcmVhbDsKKwl0YWJsZV9lbmQgPSB0YWJsZSArICgoUEFHRV9TSVpFICogKDEgPDwgcGFnZV9vcmRlcikpIC0gMSk7CisKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UodGFibGUpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZSh0YWJsZV9lbmQpOyBwYWdlKyspCisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwsIHBhZ2Vfb3JkZXIpOworCisJYWdwX2dhdHRfdGFibGUgPSBOVUxMOworCWJyaWRnZS0+Z2F0dF90YWJsZSA9IE5VTEw7CisJYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSBOVUxMOworCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IDA7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlKTsKKworCitpbnQgYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBudW1fZW50cmllczsKKwlzaXplX3QgaTsKKwlvZmZfdCBqOworCXZvaWQgKnRlbXA7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCisJYnJpZGdlID0gbWVtLT5icmlkZ2U7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCisJc3dpdGNoIChicmlkZ2UtPmRyaXZlci0+c2l6ZV90eXBlKSB7CisJY2FzZSBVOF9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIFUxNl9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzE2KHRlbXApLT5udW1fZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIExWTDJfQVBFUl9TSVpFOgorCQkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBjYW4ndCBkZWFsIHdpdGggMiBsZXZlbCBnYXR0J3MgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW51bV9lbnRyaWVzID0gMDsKKwkJYnJlYWs7CisJfQorCisJbnVtX2VudHJpZXMgLT0gYWdwX21lbW9yeV9yZXNlcnZlZC9QQUdFX1NJWkU7CisJaWYgKG51bV9lbnRyaWVzIDwgMCkgbnVtX2VudHJpZXMgPSAwOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCQkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBrbm93IG5vdGhpbmcgb2YgbWVtb3J5IHR5cGVzICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFLOiBjb3VsZCB3cmFwICovCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCFQR0VfRU1QVFkoYnJpZGdlLCByZWFkbChicmlkZ2UtPmdhdHRfdGFibGUraikpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaisrOworCX0KKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJYnJpZGdlLT5kcml2ZXItPmNhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQl3cml0ZWwoYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGJyaWRnZSwgbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGJyaWRnZS0+Z2F0dF90YWJsZStqKTsKKwkJcmVhZGwoYnJpZGdlLT5nYXR0X3RhYmxlK2opOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlicmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2luc2VydF9tZW1vcnkpOworCisKK2ludCBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisKKwlicmlkZ2UgPSBtZW0tPmJyaWRnZTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJCS8qIFRoZSBnZW5lcmljIHJvdXRpbmVzIGtub3cgbm90aGluZyBvZiBtZW1vcnkgdHlwZXMgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQUs6IGJvZ3VzLCBzaG91bGQgZW5jb2RlIGFkZHJlc3NlcyA+IDRHQiAqLworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCXdyaXRlbChicmlkZ2UtPnNjcmF0Y2hfcGFnZSwgYnJpZGdlLT5nYXR0X3RhYmxlK2kpOworCQlyZWFkbChicmlkZ2UtPmdhdHRfdGFibGUraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWJyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfcmVtb3ZlX21lbW9yeSk7CisKKworc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKQoreworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlKTsKKworCit2b2lkIGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZShzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycikKK3sKKwl2ZnJlZShjdXJyLT5tZW1vcnkpOworCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOworCWtmcmVlKGN1cnIpOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUpOworCisKKy8qCisgKiBCYXNpYyBQYWdlIEFsbG9jYXRpb24gUm91dGluZXMgLQorICogVGhlc2Ugcm91dGluZXMgaGFuZGxlIHBhZ2UgYWxsb2NhdGlvbiBhbmQgYnkgZGVmYXVsdCB0aGV5IHJlc2VydmUgdGhlIGFsbG9jYXRlZAorICogbWVtb3J5LiAgVGhleSBhbHNvIGhhbmRsZSBpbmNyZW1lbnRpbmcgdGhlIGN1cnJlbnRfbWVtb3J5X2FncCB2YWx1ZSwgV2hpY2ggaXMgY2hlY2tlZAorICogYWdhaW5zdCBhIG1heGltdW0gdmFsdWUuCisgKi8KKwordm9pZCAqYWdwX2dlbmVyaWNfYWxsb2NfcGFnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXBfcGFnZV9pbnRvX2FncChwYWdlKTsKKworCWdldF9wYWdlKHBhZ2UpOworCVNldFBhZ2VMb2NrZWQocGFnZSk7CisJYXRvbWljX2luYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKKwlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY19wYWdlKTsKKworCit2b2lkIGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSh2b2lkICphZGRyKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcGFnZSA9IHZpcnRfdG9fcGFnZShhZGRyKTsKKwl1bm1hcF9wYWdlX2Zyb21fYWdwKHBhZ2UpOworCXB1dF9wYWdlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGRyKTsKKwlhdG9taWNfZGVjKCZhZ3BfYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UpOworCisvKiBFbmQgQmFzaWMgUGFnZSBBbGxvY2F0aW9uIFJvdXRpbmVzICovCisKKworLyoqCisgKiBhZ3BfZW5hYmxlICAtICBpbml0aWFsaXNlIHRoZSBhZ3AgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbi4KKyAqCisgKiBAbW9kZToJYWdwIG1vZGUgcmVnaXN0ZXIgdmFsdWUgdG8gY29uZmlndXJlIHdpdGguCisgKi8KK3ZvaWQgYWdwX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCWlmICghYnJpZGdlKQorCQlyZXR1cm47CisJYnJpZGdlLT5kcml2ZXItPmFncF9lbmFibGUoYnJpZGdlLCBtb2RlKTsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2VuYWJsZSk7CisKKy8qIFdoZW4gd2UgcmVtb3ZlIHRoZSBnbG9iYWwgdmFyaWFibGUgYWdwX2JyaWRnZSBmcm9tIGFsbCBkcml2ZXJzCisgKiB0aGVuIGFncF9hbGxvY19icmlkZ2UgYW5kIGFncF9nZW5lcmljX2ZpbmRfYnJpZGdlIG5lZWQgdG8gYmUgdXBkYXRlZAorICovCisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9nZW5lcmljX2ZpbmRfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChsaXN0X2VtcHR5KCZhZ3BfYnJpZGdlcykpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFncF9icmlkZ2U7Cit9CisKK3N0YXRpYyB2b2lkIGlwaV9oYW5kbGVyKHZvaWQgKm51bGwpCit7CisJZmx1c2hfYWdwX2NhY2hlKCk7Cit9CisKK3ZvaWQgZ2xvYmFsX2NhY2hlX2ZsdXNoKHZvaWQpCit7CisJaWYgKG9uX2VhY2hfY3B1KGlwaV9oYW5kbGVyLCBOVUxMLCAxLCAxKSAhPSAwKQorCQlwYW5pYyhQRlggInRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgQ1BVcyFcbiIpOworfQorRVhQT1JUX1NZTUJPTChnbG9iYWxfY2FjaGVfZmx1c2gpOworCit1bnNpZ25lZCBsb25nIGFncF9nZW5lcmljX21hc2tfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0eXBlKQoreworCS8qIG1lbW9yeSB0eXBlIGlzIGlnbm9yZWQgaW4gdGhlIGdlbmVyaWMgcm91dGluZSAqLworCWlmIChicmlkZ2UtPmRyaXZlci0+bWFza3MpCisJCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzWzBdLm1hc2s7CisJZWxzZQorCQlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfbWFza19tZW1vcnkpOworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIEFHUHYzIHNwZWMsCisgKiB3aGljaCBjb3ZlcnMgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0aGF0IGhhZCBwcmV2aW91c2x5IGJlZW4KKyAqIGxlZnQgb3Blbi4KKyAqLworCitpbnQgYWdwM19nZW5lcmljX2ZldGNoX3NpemUodm9pZCkKK3sKKwl1MTYgdGVtcF9zaXplOworCWludCBpOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQVBTSVpFLCAmdGVtcF9zaXplKTsKKwl2YWx1ZXMgPSBBX1NJWkVfMTYoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAodGVtcF9zaXplID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCQlhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwM19nZW5lcmljX2ZldGNoX3NpemUpOworCit2b2lkIGFncDNfZ2VuZXJpY190bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiBjdHJsOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGFncF9icmlkZ2UtPmNhcG5keCtBR1BDVFJMLCAmY3RybCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGFncF9icmlkZ2UtPmNhcG5keCtBR1BDVFJMLCBjdHJsICYgfkFHUENUUkxfR1RMQkVOKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgYWdwX2JyaWRnZS0+Y2FwbmR4K0FHUENUUkwsIGN0cmwpOworfQorRVhQT1JUX1NZTUJPTChhZ3AzX2dlbmVyaWNfdGxiZmx1c2gpOworCitpbnQgYWdwM19nZW5lcmljX2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBzZXQgYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIGFncF9icmlkZ2UtPmNhcG5keCtBR1BBUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisJLyogc2V0IGdhcnQgcG9pbnRlciAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQR0FSVExPLCBhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyKTsKKwkvKiBlbmFibGUgYXBlcnR1cmUgYW5kIEdUTEIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgdGVtcCB8IEFHUENUUkxfQVBFUkVOQiB8IEFHUENUUkxfR1RMQkVOKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwM19nZW5lcmljX2NvbmZpZ3VyZSk7CisKK3ZvaWQgYWdwM19nZW5lcmljX2NsZWFudXAodm9pZCkKK3sKKwl1MzIgY3RybDsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgJmN0cmwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgY3RybCAmIH5BR1BDVFJMX0FQRVJFTkIpOworfQorRVhQT1JUX1NZTUJPTChhZ3AzX2dlbmVyaWNfY2xlYW51cCk7CisKK3N0cnVjdCBhcGVyX3NpemVfaW5mb18xNiBhZ3AzX2dlbmVyaWNfc2l6ZXNbQUdQX0dFTkVSSUNfU0laRVNfRU5UUklFU10gPQoreworCXs0MDk2LCAxMDQ4NTc2LCAxMCwweDAwMH0sCisJezIwNDgsICA1MjQyODgsIDksIDB4ODAwfSwKKwl7MTAyNCwgIDI2MjE0NCwgOCwgMHhjMDB9LAorCXsgNTEyLCAgMTMxMDcyLCA3LCAweGUwMH0sCisJeyAyNTYsICAgNjU1MzYsIDYsIDB4ZjAwfSwKKwl7IDEyOCwgICAzMjc2OCwgNSwgMHhmMjB9LAorCXsgIDY0LCAgIDE2Mzg0LCA0LCAweGYzMH0sCisJeyAgMzIsICAgIDgxOTIsIDMsIDB4ZjM4fSwKKwl7ICAxNiwgICAgNDA5NiwgMiwgMHhmM2N9LAorCXsgICA4LCAgICAyMDQ4LCAxLCAweGYzZX0sCisJeyAgIDQsICAgIDEwMjQsIDAsIDB4ZjNmfQorfTsKK0VYUE9SVF9TWU1CT0woYWdwM19nZW5lcmljX3NpemVzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1MmJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBIUCB6eDEgQUdQR0FSVCByb3V0aW5lcy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDIsIDIwMDMgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqCUJqb3JuIEhlbGdhYXMgPGJqb3JuLmhlbGdhYXNAaHAuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKworI2luY2x1ZGUgPGFzbS9hY3BpLWV4dC5oPgorCisjaW5jbHVkZSAiYWdwLmgiCisKKyNpZm5kZWYgbG9nMgorI2RlZmluZSBsb2cyKHgpCQlmZnoofih4KSkKKyNlbmRpZgorCisjZGVmaW5lIEhQX1pYMV9JT0NfT0ZGU0VUCTB4MTAwMCAgLyogQUNQSSByZXBvcnRzIFNCQSwgd2Ugd2FudCBJT0MgKi8KKworLyogSFAgWlgxIElPQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFBfWlgxX0lCQVNFCQkweDMwMAorI2RlZmluZSBIUF9aWDFfSU1BU0sJCTB4MzA4CisjZGVmaW5lIEhQX1pYMV9QQ09NCQkweDMxMAorI2RlZmluZSBIUF9aWDFfVENORkcJCTB4MzE4CisjZGVmaW5lIEhQX1pYMV9QRElSX0JBU0UJMHgzMjAKKworI2RlZmluZSBIUF9aWDFfSU9WQV9CQVNFCUdCKDFVTCkKKyNkZWZpbmUgSFBfWlgxX0lPVkFfU0laRQlHQigxVUwpCisjZGVmaW5lIEhQX1pYMV9HQVJUX1NJWkUJKEhQX1pYMV9JT1ZBX1NJWkUgLyAyKQorI2RlZmluZSBIUF9aWDFfU0JBX0lPTU1VX0NPT0tJRQkweDAwMDBiYWRiYWRjMGZmZWVVTAorCisjZGVmaW5lIEhQX1pYMV9QRElSX1ZBTElEX0JJVAkweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBIUF9aWDFfSU9WQV9UT19QRElSKHZhKQkoKHZhIC0gaHBfcHJpdmF0ZS5pb3ZhX2Jhc2UpID4+IGhwX3ByaXZhdGUuaW9fdGxiX3NoaWZ0KQorCisjZGVmaW5lIEFHUDhYX01PREVfQklUCQkzCisjZGVmaW5lIEFHUDhYX01PREUJCSgxIDw8IEFHUDhYX01PREVfQklUKQorCisvKiBBR1AgYnJpZGdlIG5lZWQgbm90IGJlIFBDSSBkZXZpY2UsIGJ1dCBEUk0gdGhpbmtzIGl0IGlzLiAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2IGZha2VfYnJpZGdlX2RldjsKKworc3RhdGljIGludCBocF96eDFfZ2FydF9mb3VuZDsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCBocF96eDFfc2l6ZXNbXSA9Cit7CisJezAsIDAsIDB9LAkJLyogZmlsbGVkIGluIGJ5IGhwX3p4MV9mZXRjaF9zaXplKCkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGhwX3p4MV9tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSBIUF9aWDFfUERJUl9WQUxJRF9CSVQsIC50eXBlID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgX2hwX3ByaXZhdGUgeworCXZvbGF0aWxlIHU4IF9faW9tZW0gKmlvY19yZWdzOworCXZvbGF0aWxlIHU4IF9faW9tZW0gKmxiYV9yZWdzOworCWludCBsYmFfY2FwX29mZnNldDsKKwl1NjQgKmlvX3BkaXI7CQkvLyBQRElSIGZvciBlbnRpcmUgSU9WQQorCXU2NCAqZ2F0dDsJCS8vIFBESVIganVzdCBmb3IgR0FSVCAoc3Vic2V0IG9mIGFib3ZlKQorCXU2NCBnYXR0X2VudHJpZXM7CisJdTY0IGlvdmFfYmFzZTsKKwl1NjQgZ2FydF9iYXNlOworCXU2NCBnYXJ0X3NpemU7CisJdTY0IGlvX3BkaXJfc2l6ZTsKKwlpbnQgaW9fcGRpcl9vd25lcjsJLy8gZG8gd2Ugb3duIGl0LCBvciBzaGFyZSBpdCB3aXRoIHNiYV9pb21tdT8KKwlpbnQgaW9fcGFnZV9zaXplOworCWludCBpb190bGJfc2hpZnQ7CisJaW50IGlvX3RsYl9wczsJCS8vIElPQyBwcyBjb25maWcKKwlpbnQgaW9fcGFnZXNfcGVyX2twYWdlOworfSBocF9wcml2YXRlOworCitzdGF0aWMgaW50IF9faW5pdCBocF96eDFfaW9jX3NoYXJlZCh2b2lkKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJIUCBaWDEgSU9DOiBJT1BESVIgc2hhcmVkIHdpdGggc2JhX2lvbW11XG4iKTsKKworCS8qCisJICogSU9DIGFscmVhZHkgY29uZmlndXJlZCBieSBzYmFfaW9tbXUgbW9kdWxlOyBqdXN0IHVzZQorCSAqIGl0cyBzZXR1cC4gIFdlIGFzc3VtZToKKwkgKiAJLSBJT1ZBIHNwYWNlIGlzIDFHYiBpbiBzaXplCisJICogCS0gZmlyc3QgNTEyTWIgaXMgSU9NTVUsIHNlY29uZCA1MTJNYiBpcyBHQVJUCisJICovCisJaHAtPmlvX3RsYl9wcyA9IHJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfVENORkcpOworCXN3aXRjaCAoaHAtPmlvX3RsYl9wcykgeworCQljYXNlIDA6IGhwLT5pb190bGJfc2hpZnQgPSAxMjsgYnJlYWs7CisJCWNhc2UgMTogaHAtPmlvX3RsYl9zaGlmdCA9IDEzOyBicmVhazsKKwkJY2FzZSAyOiBocC0+aW9fdGxiX3NoaWZ0ID0gMTQ7IGJyZWFrOworCQljYXNlIDM6IGhwLT5pb190bGJfc2hpZnQgPSAxNjsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIElPVExCIHBhZ2Ugc2l6ZSAiCisJCQkgICAgICAgImNvbmZpZ3VyYXRpb24gMHgleFxuIiwgaHAtPmlvX3RsYl9wcyk7CisJCQlocC0+Z2F0dCA9IE5VTEw7CisJCQlocC0+Z2F0dF9lbnRyaWVzID0gMDsKKwkJCXJldHVybiAtRU5PREVWOworCX0KKwlocC0+aW9fcGFnZV9zaXplID0gMSA8PCBocC0+aW9fdGxiX3NoaWZ0OworCWhwLT5pb19wYWdlc19wZXJfa3BhZ2UgPSBQQUdFX1NJWkUgLyBocC0+aW9fcGFnZV9zaXplOworCisJaHAtPmlvdmFfYmFzZSA9IHJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpICYgfjB4MTsKKwlocC0+Z2FydF9iYXNlID0gaHAtPmlvdmFfYmFzZSArIEhQX1pYMV9JT1ZBX1NJWkUgLSBIUF9aWDFfR0FSVF9TSVpFOworCisJaHAtPmdhcnRfc2l6ZSA9IEhQX1pYMV9HQVJUX1NJWkU7CisJaHAtPmdhdHRfZW50cmllcyA9IGhwLT5nYXJ0X3NpemUgLyBocC0+aW9fcGFnZV9zaXplOworCisJaHAtPmlvX3BkaXIgPSBwaHlzX3RvX3ZpcnQocmVhZHEoaHAtPmlvY19yZWdzK0hQX1pYMV9QRElSX0JBU0UpKTsKKwlocC0+Z2F0dCA9ICZocC0+aW9fcGRpcltIUF9aWDFfSU9WQV9UT19QRElSKGhwLT5nYXJ0X2Jhc2UpXTsKKworCWlmIChocC0+Z2F0dFswXSAhPSBIUF9aWDFfU0JBX0lPTU1VX0NPT0tJRSkgeworCQkvKiBOb3JtYWwgY2FzZSB3aGVuIG5vIEFHUCBkZXZpY2UgaW4gc3lzdGVtICovCisJICAgIAlocC0+Z2F0dCA9IE5VTEw7CisJCWhwLT5nYXR0X2VudHJpZXMgPSAwOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyByZXNlcnZlZCBJTyBQRElSIGVudHJ5IGZvdW5kOyAiCisJCSAgICAgICAiR0FSVCBkaXNhYmxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraHBfengxX2lvY19vd25lciAodm9pZCkKK3sKKwlzdHJ1Y3QgX2hwX3ByaXZhdGUgKmhwID0gJmhwX3ByaXZhdGU7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiSFAgWlgxIElPQzogSU9QRElSIGRlZGljYXRlZCB0byBHQVJUXG4iKTsKKworCS8qCisJICogU2VsZWN0IGFuIElPViBwYWdlIHNpemUgbm8gbGFyZ2VyIHRoYW4gc3lzdGVtIHBhZ2Ugc2l6ZS4KKwkgKi8KKwlpZiAoUEFHRV9TSVpFID49IEtCKDY0KSkgeworCQlocC0+aW9fdGxiX3NoaWZ0ID0gMTY7CisJCWhwLT5pb190bGJfcHMgPSAzOworCX0gZWxzZSBpZiAoUEFHRV9TSVpFID49IEtCKDE2KSkgeworCQlocC0+aW9fdGxiX3NoaWZ0ID0gMTQ7CisJCWhwLT5pb190bGJfcHMgPSAyOworCX0gZWxzZSBpZiAoUEFHRV9TSVpFID49IEtCKDgpKSB7CisJCWhwLT5pb190bGJfc2hpZnQgPSAxMzsKKwkJaHAtPmlvX3RsYl9wcyA9IDE7CisJfSBlbHNlIHsKKwkJaHAtPmlvX3RsYl9zaGlmdCA9IDEyOworCQlocC0+aW9fdGxiX3BzID0gMDsKKwl9CisJaHAtPmlvX3BhZ2Vfc2l6ZSA9IDEgPDwgaHAtPmlvX3RsYl9zaGlmdDsKKwlocC0+aW9fcGFnZXNfcGVyX2twYWdlID0gUEFHRV9TSVpFIC8gaHAtPmlvX3BhZ2Vfc2l6ZTsKKworCWhwLT5pb3ZhX2Jhc2UgPSBIUF9aWDFfSU9WQV9CQVNFOworCWhwLT5nYXJ0X3NpemUgPSBIUF9aWDFfR0FSVF9TSVpFOworCWhwLT5nYXJ0X2Jhc2UgPSBocC0+aW92YV9iYXNlICsgSFBfWlgxX0lPVkFfU0laRSAtIGhwLT5nYXJ0X3NpemU7CisKKwlocC0+Z2F0dF9lbnRyaWVzID0gaHAtPmdhcnRfc2l6ZSAvIGhwLT5pb19wYWdlX3NpemU7CisJaHAtPmlvX3BkaXJfc2l6ZSA9IChIUF9aWDFfSU9WQV9TSVpFIC8gaHAtPmlvX3BhZ2Vfc2l6ZSkgKiBzaXplb2YodTY0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraHBfengxX2lvY19pbml0ICh1NjQgaHBhKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCWhwLT5pb2NfcmVncyA9IGlvcmVtYXAoaHBhLCAxMDI0KTsKKwlpZiAoIWhwLT5pb2NfcmVncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIElmIHRoZSBJT1RMQiBpcyBjdXJyZW50bHkgZGlzYWJsZWQsIHdlIGNhbiB0YWtlIGl0IG92ZXIuCisJICogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIHNoYXJlIHdpdGggc2JhX2lvbW11LgorCSAqLworCWhwLT5pb19wZGlyX293bmVyID0gKHJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpICYgMHgxKSA9PSAwOworCisJaWYgKGhwLT5pb19wZGlyX293bmVyKQorCQlyZXR1cm4gaHBfengxX2lvY19vd25lcigpOworCisJcmV0dXJuIGhwX3p4MV9pb2Nfc2hhcmVkKCk7Cit9CisKK3N0YXRpYyBpbnQKK2hwX3p4MV9sYmFfZmluZF9jYXBhYmlsaXR5ICh2b2xhdGlsZSB1OCBfX2lvbWVtICpocGEsIGludCBjYXApCit7CisJdTE2IHN0YXR1czsKKwl1OCBwb3MsIGlkOworCWludCB0dGwgPSA0ODsKKworCXN0YXR1cyA9IHJlYWR3KGhwYStQQ0lfU1RBVFVTKTsKKwlpZiAoIShzdGF0dXMgJiBQQ0lfU1RBVFVTX0NBUF9MSVNUKSkKKwkJcmV0dXJuIDA7CisJcG9zID0gcmVhZGIoaHBhK1BDSV9DQVBBQklMSVRZX0xJU1QpOworCXdoaWxlICh0dGwtLSAmJiBwb3MgPj0gMHg0MCkgeworCQlwb3MgJj0gfjM7CisJCWlkID0gcmVhZGIoaHBhK3BvcytQQ0lfQ0FQX0xJU1RfSUQpOworCQlpZiAoaWQgPT0gMHhmZikKKwkJCWJyZWFrOworCQlpZiAoaWQgPT0gY2FwKQorCQkJcmV0dXJuIHBvczsKKwkJcG9zID0gcmVhZGIoaHBhK3BvcytQQ0lfQ0FQX0xJU1RfTkVYVCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraHBfengxX2xiYV9pbml0ICh1NjQgaHBhKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKwlpbnQgY2FwOworCisJaHAtPmxiYV9yZWdzID0gaW9yZW1hcChocGEsIDI1Nik7CisJaWYgKCFocC0+bGJhX3JlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJaHAtPmxiYV9jYXBfb2Zmc2V0ID0gaHBfengxX2xiYV9maW5kX2NhcGFiaWxpdHkoaHAtPmxiYV9yZWdzLCBQQ0lfQ0FQX0lEX0FHUCk7CisKKwljYXAgPSByZWFkbChocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0KSAmIDB4ZmY7CisJaWYgKGNhcCAhPSBQQ0lfQ0FQX0lEX0FHUCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGNhcGFiaWxpdHkgSUQgMHglMDJ4IGF0IDB4JXhcbiIsCisJCSAgICAgICBjYXAsIGhwLT5sYmFfY2FwX29mZnNldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitocF96eDFfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBzaXplOworCisJc2l6ZSA9IGhwX3ByaXZhdGUuZ2FydF9zaXplIC8gTUIoMSk7CisJaHBfengxX3NpemVzWzBdLnNpemUgPSBzaXplOworCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICZocF96eDFfc2l6ZXNbMF07CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQKK2hwX3p4MV9jb25maWd1cmUgKHZvaWQpCit7CisJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOworCisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IGhwLT5nYXJ0X2Jhc2U7CisJYWdwX2JyaWRnZS0+Y2FwbmR4ID0gaHAtPmxiYV9jYXBfb2Zmc2V0OworCWFncF9icmlkZ2UtPm1vZGUgPSByZWFkbChocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0K1BDSV9BR1BfU1RBVFVTKTsKKworCWlmIChocC0+aW9fcGRpcl9vd25lcikgeworCQl3cml0ZWwodmlydF90b19waHlzKGhwLT5pb19wZGlyKSwgaHAtPmlvY19yZWdzK0hQX1pYMV9QRElSX0JBU0UpOworCQlyZWFkbChocC0+aW9jX3JlZ3MrSFBfWlgxX1BESVJfQkFTRSk7CisJCXdyaXRlbChocC0+aW9fdGxiX3BzLCBocC0+aW9jX3JlZ3MrSFBfWlgxX1RDTkZHKTsKKwkJcmVhZGwoaHAtPmlvY19yZWdzK0hQX1pYMV9UQ05GRyk7CisJCXdyaXRlbCh+KEhQX1pYMV9JT1ZBX1NJWkUtMSksIGhwLT5pb2NfcmVncytIUF9aWDFfSU1BU0spOworCQlyZWFkbChocC0+aW9jX3JlZ3MrSFBfWlgxX0lNQVNLKTsKKwkJd3JpdGVsKGhwLT5pb3ZhX2Jhc2V8MSwgaHAtPmlvY19yZWdzK0hQX1pYMV9JQkFTRSk7CisJCXJlYWRsKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpOworCQl3cml0ZWwoaHAtPmlvdmFfYmFzZXxsb2cyKEhQX1pYMV9JT1ZBX1NJWkUpLCBocC0+aW9jX3JlZ3MrSFBfWlgxX1BDT00pOworCQlyZWFkbChocC0+aW9jX3JlZ3MrSFBfWlgxX1BDT00pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraHBfengxX2NsZWFudXAgKHZvaWQpCit7CisJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOworCisJaWYgKGhwLT5pb2NfcmVncykgeworCQlpZiAoaHAtPmlvX3BkaXJfb3duZXIpIHsKKwkJCXdyaXRlcSgwLCBocC0+aW9jX3JlZ3MrSFBfWlgxX0lCQVNFKTsKKwkJCXJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpOworCQl9CisJCWlvdW5tYXAoaHAtPmlvY19yZWdzKTsKKwl9CisJaWYgKGhwLT5sYmFfcmVncykKKwkJaW91bm1hcChocC0+bGJhX3JlZ3MpOworfQorCitzdGF0aWMgdm9pZAoraHBfengxX3RsYmZsdXNoIChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCXdyaXRlcShocC0+Z2FydF9iYXNlIHwgbG9nMihocC0+Z2FydF9zaXplKSwgaHAtPmlvY19yZWdzK0hQX1pYMV9QQ09NKTsKKwlyZWFkcShocC0+aW9jX3JlZ3MrSFBfWlgxX1BDT00pOworfQorCitzdGF0aWMgaW50CitocF96eDFfY3JlYXRlX2dhdHRfdGFibGUgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgX2hwX3ByaXZhdGUgKmhwID0gJmhwX3ByaXZhdGU7CisJaW50IGk7CisKKwlpZiAoaHAtPmlvX3BkaXJfb3duZXIpIHsKKwkJaHAtPmlvX3BkaXIgPSAodTY0ICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkJCWdldF9vcmRlcihocC0+aW9fcGRpcl9zaXplKSk7CisJCWlmICghaHAtPmlvX3BkaXIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkbid0IGFsbG9jYXRlIGNvbnRpZ3VvdXMgIgorCQkJCSJtZW1vcnkgZm9yIEkvTyBQRElSXG4iKTsKKwkJCWhwLT5nYXR0ID0gTlVMTDsKKwkJCWhwLT5nYXR0X2VudHJpZXMgPSAwOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KGhwLT5pb19wZGlyLCAwLCBocC0+aW9fcGRpcl9zaXplKTsKKworCQlocC0+Z2F0dCA9ICZocC0+aW9fcGRpcltIUF9aWDFfSU9WQV9UT19QRElSKGhwLT5nYXJ0X2Jhc2UpXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHAtPmdhdHRfZW50cmllczsgaSsrKSB7CisJCWhwLT5nYXR0W2ldID0gKHVuc2lnbmVkIGxvbmcpIGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraHBfengxX2ZyZWVfZ2F0dF90YWJsZSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCWlmIChocC0+aW9fcGRpcl9vd25lcikKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgaHAtPmlvX3BkaXIsCisJCQkgICAgZ2V0X29yZGVyKGhwLT5pb19wZGlyX3NpemUpKTsKKwllbHNlCisJCWhwLT5nYXR0WzBdID0gSFBfWlgxX1NCQV9JT01NVV9DT09LSUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hwX3p4MV9pbnNlcnRfbWVtb3J5IChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOworCWludCBpLCBrOworCW9mZl90IGosIGlvX3BnX3N0YXJ0OworCWludCBpb19wZ19jb3VudDsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW9fcGdfc3RhcnQgPSBocC0+aW9fcGFnZXNfcGVyX2twYWdlICogcGdfc3RhcnQ7CisJaW9fcGdfY291bnQgPSBocC0+aW9fcGFnZXNfcGVyX2twYWdlICogbWVtLT5wYWdlX2NvdW50OworCWlmICgoaW9fcGdfc3RhcnQgKyBpb19wZ19jb3VudCkgPiBocC0+Z2F0dF9lbnRyaWVzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWogPSBpb19wZ19zdGFydDsKKwl3aGlsZSAoaiA8IChpb19wZ19zdGFydCArIGlvX3BnX2NvdW50KSkgeworCQlpZiAoaHAtPmdhdHRbal0pIHsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaisrOworCX0KKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMCwgaiA9IGlvX3BnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQlwYWRkciA9IG1lbS0+bWVtb3J5W2ldOworCQlmb3IgKGsgPSAwOworCQkgICAgIGsgPCBocC0+aW9fcGFnZXNfcGVyX2twYWdlOworCQkgICAgIGsrKywgaisrLCBwYWRkciArPSBocC0+aW9fcGFnZV9zaXplKSB7CisJCQlocC0+Z2F0dFtqXSA9CisJCQkJYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJCQlwYWRkciwgdHlwZSk7CisJCX0KKwl9CisKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitocF96eDFfcmVtb3ZlX21lbW9yeSAoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKwlpbnQgaSwgaW9fcGdfc3RhcnQsIGlvX3BnX2NvdW50OworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpb19wZ19zdGFydCA9IGhwLT5pb19wYWdlc19wZXJfa3BhZ2UgKiBwZ19zdGFydDsKKwlpb19wZ19jb3VudCA9IGhwLT5pb19wYWdlc19wZXJfa3BhZ2UgKiBtZW0tPnBhZ2VfY291bnQ7CisJZm9yIChpID0gaW9fcGdfc3RhcnQ7IGkgPCBpb19wZ19jb3VudCArIGlvX3BnX3N0YXJ0OyBpKyspIHsKKwkJaHAtPmdhdHRbaV0gPSBhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2U7CisJfQorCisJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2hwX3p4MV9tYXNrX21lbW9yeSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCXVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHR5cGUpCit7CisJcmV0dXJuIEhQX1pYMV9QRElSX1ZBTElEX0JJVCB8IGFkZHI7Cit9CisKK3N0YXRpYyB2b2lkCitocF96eDFfZW5hYmxlIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKwl1MzIgY29tbWFuZDsKKworCWNvbW1hbmQgPSByZWFkbChocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0K1BDSV9BR1BfU1RBVFVTKTsKKwljb21tYW5kID0gYWdwX2NvbGxlY3RfZGV2aWNlX3N0YXR1cyhicmlkZ2UsIG1vZGUsIGNvbW1hbmQpOworCWNvbW1hbmQgfD0gMHgwMDAwMDEwMDsKKworCXdyaXRlbChjb21tYW5kLCBocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0K1BDSV9BR1BfQ09NTUFORCk7CisKKwlhZ3BfZGV2aWNlX2NvbW1hbmQoY29tbWFuZCwgKG1vZGUgJiBBR1A4WF9NT0RFKSAhPSAwKTsKK30KKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGhwX3p4MV9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuc2l6ZV90eXBlCQk9IEZJWEVEX0FQRVJfU0laRSwKKwkuY29uZmlndXJlCQk9IGhwX3p4MV9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaHBfengxX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gaHBfengxX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBocF96eDFfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGhwX3p4MV9tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGhwX3p4MV9tYXNrcywKKwkuYWdwX2VuYWJsZQkJPSBocF96eDFfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gaHBfengxX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBocF96eDFfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGhwX3p4MV9pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGhwX3p4MV9yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitocF96eDFfc2V0dXAgKHU2NCBpb2NfaHBhLCB1NjQgbGJhX2hwYSkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJaW50IGVycm9yID0gMDsKKworCWVycm9yID0gaHBfengxX2lvY19pbml0KGlvY19ocGEpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJZXJyb3IgPSBocF96eDFfbGJhX2luaXQobGJhX2hwYSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCWJyaWRnZS0+ZHJpdmVyID0gJmhwX3p4MV9kcml2ZXI7CisKKwlmYWtlX2JyaWRnZV9kZXYudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9IUDsKKwlmYWtlX2JyaWRnZV9kZXYuZGV2aWNlID0gUENJX0RFVklDRV9JRF9IUF9QQ0lYX0xCQTsKKwlicmlkZ2UtPmRldiA9ICZmYWtlX2JyaWRnZV9kZXY7CisKKwllcnJvciA9IGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7CisgIGZhaWw6CisJaWYgKGVycm9yKQorCQlocF96eDFfY2xlYW51cCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAorengxX2dhcnRfcHJvYmUgKGFjcGlfaGFuZGxlIG9iaiwgdTMyIGRlcHRoLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0KQoreworCWFjcGlfaGFuZGxlIGhhbmRsZSwgcGFyZW50OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXU2NCBsYmFfaHBhLCBzYmFfaHBhLCBsZW5ndGg7CisJaW50IG1hdGNoOworCisJc3RhdHVzID0gaHBfYWNwaV9jc3Jfc3BhY2Uob2JqLCAmbGJhX2hwYSwgJmxlbmd0aCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gQUVfT0s7IC8qIGtlZXAgbG9va2luZyBmb3IgYW5vdGhlciBicmlkZ2UgKi8KKworCS8qIExvb2sgZm9yIGFuIGVuY2xvc2luZyBJT0Mgc2NvcGUgYW5kIGZpbmQgaXRzIENTUiBzcGFjZSAqLworCWhhbmRsZSA9IG9iajsKKwlkbyB7CisJCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKKwkJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8oaGFuZGxlLCAmYnVmZmVyKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKiBUQkQgY2hlY2sgX0NJRCBhbHNvICovCisJCQlpbmZvID0gYnVmZmVyLnBvaW50ZXI7CisJCQlpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZVtzaXplb2YoaW5mby0+aGFyZHdhcmVfaWQpLTFdID0gJ1wwJzsKKwkJCW1hdGNoID0gKHN0cmNtcChpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZSwgIkhXUDAwMDEiKSA9PSAwKTsKKwkJCUFDUElfTUVNX0ZSRUUoaW5mbyk7CisJCQlpZiAobWF0Y2gpIHsKKwkJCQlzdGF0dXMgPSBocF9hY3BpX2Nzcl9zcGFjZShoYW5kbGUsICZzYmFfaHBhLCAmbGVuZ3RoKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQkJCWJyZWFrOworCQkJCWVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJEZXRlY3RlZCBIUCBaWDEgIgorCQkJCQkgICAgICAgIkFHUCBMQkEgYnV0IG5vIElPQy5cbiIpOworCQkJCQlyZXR1cm4gQUVfT0s7CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3RhdHVzID0gYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBhcmVudCk7CisJCWhhbmRsZSA9IHBhcmVudDsKKwl9IHdoaWxlIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSk7CisKKwlpZiAoaHBfengxX3NldHVwKHNiYV9ocGEgKyBIUF9aWDFfSU9DX09GRlNFVCwgbGJhX2hwYSkpCisJCXJldHVybiBBRV9PSzsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBIUCBaWDEgJXMgQUdQIGNoaXBzZXQgKGlvYz0lbHgsIGxiYT0lbHgpXG4iLAorCQkoY2hhciAqKSBjb250ZXh0LCBzYmFfaHBhICsgSFBfWlgxX0lPQ19PRkZTRVQsIGxiYV9ocGEpOworCisJaHBfengxX2dhcnRfZm91bmQgPSAxOworCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsgLyogd2Ugb25seSBzdXBwb3J0IG9uZSBicmlkZ2U7IHF1aXQgbG9va2luZyAqLworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWdwX2hwX2luaXQgKHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNwaV9nZXRfZGV2aWNlcygiSFdQMDAwMyIsIHp4MV9nYXJ0X3Byb2JlLCAiSFdQMDAwMyIsIE5VTEwpOworCWlmIChocF96eDFfZ2FydF9mb3VuZCkKKwkJcmV0dXJuIDA7CisKKwlhY3BpX2dldF9kZXZpY2VzKCJIV1AwMDA3IiwgengxX2dhcnRfcHJvYmUsICJIV1AwMDA3IiwgTlVMTCk7CisJaWYgKGhwX3p4MV9nYXJ0X2ZvdW5kKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2FncF9ocF9jbGVhbnVwICh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChhZ3BfaHBfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfaHBfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZWE4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIEZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBpNDYwIEFHUCBpbnRlcmZhY2UsIHNlZSBDaGFwdGVyIDcgKEFHUCBTdWJzeXN0ZW0pIG9mCisgKiB0aGUgIkludGVsIDQ2MEdUWCBDaGlwc2V0IFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbCI6CisgKiBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vaXRhbml1bS9kb3dubG9hZHMvMjQ4NzA0MDFzLmh0bQorICovCisvKgorICogNDYwR1ggc3VwcG9ydCBieSBDaHJpcyBBaG5hIDxjaHJpc3RvcGhlci5qLmFobmFAaW50ZWwuY29tPgorICogQ2xlYW4gdXAgJiBzaW1wbGlmaWNhdGlvbiBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKworI2luY2x1ZGUgImFncC5oIgorCisjZGVmaW5lIElOVEVMX0k0NjBfQkFQQkFTRQkJMHg5OAorI2RlZmluZSBJTlRFTF9JNDYwX0dYQkNUTAkJMHhhMAorI2RlZmluZSBJTlRFTF9JNDYwX0FHUFNJWgkJMHhhMgorI2RlZmluZSBJTlRFTF9JNDYwX0FUVEJBU0UJCTB4ZmUyMDAwMDAKKyNkZWZpbmUgSU5URUxfSTQ2MF9HQVRUX1ZBTElECQkoMVVMIDw8IDI0KQorI2RlZmluZSBJTlRFTF9JNDYwX0dBVFRfQ09IRVJFTlQJKDFVTCA8PCAyNSkKKworLyoKKyAqIFRoZSBpNDYwIGNhbiBvcGVyYXRlIHdpdGggbGFyZ2UgKDRNQikgcGFnZXMsIGJ1dCB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBzdXBwb3J0IHRoaXMKKyAqIHdpdGhpbiB0aGUgY3VycmVudCBrZXJuZWwvRFJNIGVudmlyb25tZW50LCBzbyB3ZSBkaXNhYmxlIHRoZSByZWxldmFudCBjb2RlIGZvciBub3cuCisgKiBTZWUgYWxzbyBjb21tZW50cyBpbiBpYTY0X2FsbG9jX3BhZ2UoKS4uLgorICovCisjZGVmaW5lIEk0NjBfTEFSR0VfSU9fUEFHRVMJCTAKKworI2lmIEk0NjBfTEFSR0VfSU9fUEFHRVMKKyMgZGVmaW5lIEk0NjBfSU9fUEFHRV9TSElGVAkJaTQ2MC5pb19wYWdlX3NoaWZ0CisjZWxzZQorIyBkZWZpbmUgSTQ2MF9JT19QQUdFX1NISUZUCQkxMgorI2VuZGlmCisKKyNkZWZpbmUgSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRQkJKFBBR0VfU0laRSA+PiBJNDYwX0lPX1BBR0VfU0hJRlQpCisjZGVmaW5lIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0UJCSgxIDw8IChJNDYwX0lPX1BBR0VfU0hJRlQgLSBQQUdFX1NISUZUKSkKKyNkZWZpbmUgSTQ2MF9TUkFNX0lPX0RJU0FCTEUJCSgxIDw8IDQpCisjZGVmaW5lIEk0NjBfQkFQQkFTRV9FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIEk0NjBfQUdQU0laX01BU0sJCTB4NworI2RlZmluZSBJNDYwXzRNX1BTCQkJKDEgPDwgMSkKKworLyogQ29udHJvbCBiaXRzIGZvciBPdXQtT2YtR0FSVCBjb2hlcmVuY3kgYW5kIEJ1cnN0IFdyaXRlIENvbWJpbmluZyAqLworI2RlZmluZSBJNDYwX0dYQkNUTF9PT0cJCSgxVUwgPDwgMCkKKyNkZWZpbmUgSTQ2MF9HWEJDVExfQldDCQkoMVVMIDw8IDIpCisKKy8qCisgKiBnYXR0X3RhYmxlIGVudHJpZXMgYXJlIDMyLWJpdHMgd2lkZSBvbiB0aGUgaTQ2MDsgdGhlIGdlbmVyaWMgY29kZSBvdWdodCB0byBkZWNsYXJlIHRoZQorICogZ2F0dF90YWJsZSBhbmQgZ2F0dF90YWJsZV9yZWFsIHBvaW50ZXJzIGEgInZvaWQgKiIuLi4KKyAqLworI2RlZmluZSBSRF9HQVRUKGluZGV4KQkJcmVhZGwoKHUzMiAqKSBpNDYwLmdhdHQgKyAoaW5kZXgpKQorI2RlZmluZSBXUl9HQVRUKGluZGV4LCB2YWwpCXdyaXRlbCgodmFsKSwgKHUzMiAqKSBpNDYwLmdhdHQgKyAoaW5kZXgpKQorLyoKKyAqIFRoZSA0NjAgc3BlYyBzYXlzIHdlIGhhdmUgdG8gcmVhZCB0aGUgbGFzdCBsb2NhdGlvbiB3cml0dGVuIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbAorICogd3JpdGVzIGhhdmUgdGFrZW4gZWZmZWN0CisgKi8KKyNkZWZpbmUgV1JfRkxVU0hfR0FUVChpbmRleCkJUkRfR0FUVChpbmRleCkKKworI2RlZmluZSBsb2cyKHgpCQkJZmZ6KH4oeCkpCisKK3N0YXRpYyBzdHJ1Y3QgeworCXZvaWQgKmdhdHQ7CQkJCS8qIGlvcmVtYXAnZCBHQVRUIGFyZWEgKi8KKworCS8qIGk0NjAgc3VwcG9ydHMgbXVsdGlwbGUgR0FSVCBwYWdlIHNpemVzLCBzbyBHQVJUIHBhZ2VzaGlmdCBpcyBkeW5hbWljOiAqLworCXU4IGlvX3BhZ2Vfc2hpZnQ7CisKKwkvKiBCSU9TIGNvbmZpZ3VyZXMgY2hpcHNldCB0byBvbmUgb2YgMiBwb3NzaWJsZSBhcGJhc2UgdmFsdWVzOiAqLworCXU4IGR5bmFtaWNfYXBiYXNlOworCisJLyogc3RydWN0dXJlIGZvciB0cmFja2luZyBwYXJ0aWFsIHVzZSBvZiA0TUIgR0FSVCBwYWdlczogKi8KKwlzdHJ1Y3QgbHBfZGVzYyB7CisJCXVuc2lnbmVkIGxvbmcgKmFsbG9jZWRfbWFwOwkvKiBiaXRtYXAgb2Yga2VybmVsLXBhZ2VzIGluIHVzZSAqLworCQlpbnQgcmVmY291bnQ7CQkJLyogbnVtYmVyIG9mIGtlcm5lbCBwYWdlcyB1c2luZyB0aGUgbGFyZ2UgcGFnZSAqLworCQl1NjQgcGFkZHI7CQkJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBsYXJnZSBwYWdlICovCisJfSAqbHBfZGVzYzsKK30gaTQ2MDsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb184IGk0NjBfc2l6ZXNbM10gPQoreworCS8qCisJICogVGhlIDMyR0IgYXBlcnR1cmUgaXMgb25seSBhdmFpbGFibGUgd2l0aCBhIDRNIEdBUlQgcGFnZSBzaXplLiAgRHVlIHRvIHRoZQorCSAqIGR5bmFtaWMgR0FSVCBwYWdlIHNpemUsIHdlIGNhbid0IGZpZ3VyZSBvdXQgcGFnZV9vcmRlciBvciBudW1fZW50cmllcyB1bnRpbAorCSAqIHJ1bnRpbWUuCisJICovCisJezMyNzY4LCAwLCAwLCA0fSwKKwl7MTAyNCwgMCwgMCwgMn0sCisJezI1NiwgMCwgMCwgMX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGk0NjBfbWFza3NbXSA9Cit7CisJeworCSAgLm1hc2sgPSBJTlRFTF9JNDYwX0dBVFRfVkFMSUQgfCBJTlRFTF9JNDYwX0dBVFRfQ09IRVJFTlQsCisJICAudHlwZSA9IDAKKwl9Cit9OworCitzdGF0aWMgaW50IGk0NjBfZmV0Y2hfc2l6ZSAodm9pZCkKK3sKKwlpbnQgaTsKKwl1OCB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICp2YWx1ZXM7CisKKwkvKiBEZXRlcm1pbmUgdGhlIEdBUlQgcGFnZSBzaXplICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0dYQkNUTCwgJnRlbXApOworCWk0NjAuaW9fcGFnZV9zaGlmdCA9ICh0ZW1wICYgSTQ2MF80TV9QUykgPyAyMiA6IDEyOworCXByX2RlYnVnKCJpNDYwX2ZldGNoX3NpemU6IGlvX3BhZ2Vfc2hpZnQ9JWRcbiIsIGk0NjAuaW9fcGFnZV9zaGlmdCk7CisKKwlpZiAoaTQ2MC5pb19wYWdlX3NoaWZ0ICE9IEk0NjBfSU9fUEFHRV9TSElGVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiSS9PIChHQVJUKSBwYWdlLXNpemUgJVp1S0IgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBzaXplICVadUtCXG4iLAorCQkgICAgICAgMVVMIDw8IChpNDYwLmlvX3BhZ2Vfc2hpZnQgLSAxMCksIDFVTCA8PCAoSTQ2MF9JT19QQUdFX1NISUZUKSk7CisJCXJldHVybiAwOworCX0KKworCXZhbHVlcyA9IEFfU0laRV84KGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0FHUFNJWiwgJnRlbXApOworCisJLyogRXhpdCBub3cgaWYgdGhlIElPIGRyaXZlcnMgZm9yIHRoZSBHQVJUIFNSQU1TIGFyZSB0dXJuZWQgb2ZmICovCisJaWYgKHRlbXAgJiBJNDYwX1NSQU1fSU9fRElTQUJMRSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJHQVJUIFNSQU1TIGRpc2FibGVkIG9uIDQ2MEdYIGNoaXBzZXRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBR1BHQVJUIG9wZXJhdGlvbiBub3QgcG9zc2libGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhbiAyIF4gMjMgZW50cnkgR0FUVCAqLworCWlmICgoaTQ2MC5pb19wYWdlX3NoaWZ0ID09IDApICYmICgodGVtcCAmIEk0NjBfQUdQU0laX01BU0spID09IDQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIldlIGNhbid0IGhhdmUgYSAzMkdCIGFwZXJ0dXJlIHdpdGggNEtCIEdBUlQgcGFnZXNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIHByb3BlciBBUEJBU0UgcmVnaXN0ZXIgKi8KKwlpZiAodGVtcCAmIEk0NjBfQkFQQkFTRV9FTkFCTEUpCisJCWk0NjAuZHluYW1pY19hcGJhc2UgPSBJTlRFTF9JNDYwX0JBUEJBU0U7CisJZWxzZQorCQlpNDYwLmR5bmFtaWNfYXBiYXNlID0gQUdQX0FQQkFTRTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCS8qCisJCSAqIER5bmFtaWNhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIG51bV9lbnRyaWVzIGFuZCBwYWdlX29yZGVyIHZhbHVlcyBmb3IKKwkJICogdGhlIGRlZmluZSBhcGVydHVyZSBzaXplcy4gVGFrZSBjYXJlIG5vdCB0byBzaGlmdCBvZmYgdGhlIGVuZCBvZgorCQkgKiB2YWx1ZXNbaV0uc2l6ZS4KKwkJICovCisJCXZhbHVlc1tpXS5udW1fZW50cmllcyA9ICh2YWx1ZXNbaV0uc2l6ZSA8PCA4KSA+PiAoSTQ2MF9JT19QQUdFX1NISUZUIC0gMTIpOworCQl2YWx1ZXNbaV0ucGFnZV9vcmRlciA9IGxvZzIoKHNpemVvZih1MzIpKnZhbHVlc1tpXS5udW1fZW50cmllcykgPj4gUEFHRV9TSElGVCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJLyogTmVnbGVjdCBjb250cm9sIGJpdHMgd2hlbiBtYXRjaGluZyB1cCBzaXplX3ZhbHVlICovCisJCWlmICgodGVtcCAmIEk0NjBfQUdQU0laX01BU0spID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZXJlIGlzbid0IGFueXRoaW5nIHRvIGRvIGhlcmUgc2luY2UgNDYwIGhhcyBubyBHQVJUIFRMQi4gKi8KK3N0YXRpYyB2b2lkIGk0NjBfdGxiX2ZsdXNoIChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gcHJldmVudCBjb3JydXB0aW9uIG9mIHRoZSBjb250cm9sIGJpdHMKKyAqIHdoaWNoIGFyZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYXBlcnR1cmUgc2l6ZSBpbiA0NjAncyBBR1BTSVogcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgaTQ2MF93cml0ZV9hZ3BzaXogKHU4IHNpemVfdmFsdWUpCit7CisJdTggdGVtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTQ2MF9BR1BTSVosICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0FHUFNJWiwKKwkJCSAgICAgICgodGVtcCAmIH5JNDYwX0FHUFNJWl9NQVNLKSB8IHNpemVfdmFsdWUpKTsKK30KKworc3RhdGljIHZvaWQgaTQ2MF9jbGVhbnVwICh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpwcmV2aW91c19zaXplOworCisJcHJldmlvdXNfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCWk0NjBfd3JpdGVfYWdwc2l6KHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworCisJaWYgKEk0NjBfSU9fUEFHRV9TSElGVCA+IFBBR0VfU0hJRlQpCisJCWtmcmVlKGk0NjAubHBfZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9jb25maWd1cmUgKHZvaWQpCit7CisJdW5pb24geworCQl1MzIgc21hbGxbMl07CisJCXU2NCBsYXJnZTsKKwl9IHRlbXA7CisJc2l6ZV90IHNpemU7CisJdTggc2NyYXRjaDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJdGVtcC5sYXJnZSA9IDA7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCWk0NjBfd3JpdGVfYWdwc2l6KGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKgorCSAqIERvIHRoZSBuZWNlc3NhcnkgcmlnbWFyb2xlIHRvIHJlYWQgYWxsIGVpZ2h0IGJ5dGVzIG9mIEFQQkFTRS4KKwkgKiBUaGlzIGhhcyB0byBiZSBkb25lIHNpbmNlIHRoZSBBR1AgYXBlcnR1cmUgY2FuIGJlIGFib3ZlIDRHQiBvbgorCSAqIDQ2MCBiYXNlZCBzeXN0ZW1zLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGk0NjAuZHluYW1pY19hcGJhc2UsICYodGVtcC5zbWFsbFswXSkpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGk0NjAuZHluYW1pY19hcGJhc2UgKyA0LCAmKHRlbXAuc21hbGxbMV0pKTsKKworCS8qIENsZWFyIEJBUiBjb250cm9sIGJpdHMgKi8KKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gdGVtcC5sYXJnZSAmIH4oKDFVTCA8PCAzKSAtIDEpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0dYQkNUTCwgJnNjcmF0Y2gpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k0NjBfR1hCQ1RMLAorCQkJICAgICAgKHNjcmF0Y2ggJiAweDAyKSB8IEk0NjBfR1hCQ1RMX09PRyB8IEk0NjBfR1hCQ1RMX0JXQyk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgcGFydGlhbCBhbGxvY2F0aW9uIHRyYWNrZXJzIGlmIGEgR0FSVCBwYWdlIGlzIGJpZ2dlciB0aGFuIGEga2VybmVsCisJICogcGFnZS4KKwkgKi8KKwlpZiAoSTQ2MF9JT19QQUdFX1NISUZUID4gUEFHRV9TSElGVCkgeworCQlzaXplID0gY3VycmVudF9zaXplLT5udW1fZW50cmllcyAqIHNpemVvZihpNDYwLmxwX2Rlc2NbMF0pOworCQlpNDYwLmxwX2Rlc2MgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWk0NjAubHBfZGVzYykKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoaTQ2MC5scF9kZXNjLCAwLCBzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9jcmVhdGVfZ2F0dF90YWJsZSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWludCBwYWdlX29yZGVyLCBudW1fZW50cmllcywgaTsKKwl2b2lkICp0ZW1wOworCisJLyoKKwkgKiBMb2FkIHVwIHRoZSBmaXhlZCBhZGRyZXNzIG9mIHRoZSBHQVJUIFNSQU1TIHdoaWNoIGhvbGQgb3VyIEdBVFQgdGFibGUuCisJICovCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwlwYWdlX29yZGVyID0gQV9TSVpFXzgodGVtcCktPnBhZ2Vfb3JkZXI7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwlpNDYwLmdhdHQgPSBpb3JlbWFwKElOVEVMX0k0NjBfQVRUQkFTRSwgUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXIpOworCisJLyogVGhlc2UgYXJlIG5vIGdvb2QsIHRoZSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZ3BfYnJpZGdlIHN0cnVjdXJlLi4uICovCisJYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsID0gTlVMTDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gTlVMTDsKKwlhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgKytpKQorCQlXUl9HQVRUKGksIDApOworCVdSX0ZMVVNIX0dBVFQoaSAtIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk0NjBfZnJlZV9nYXR0X3RhYmxlIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IG51bV9lbnRyaWVzLCBpOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkKKwkJV1JfR0FUVChpLCAwKTsKKwlXUl9GTFVTSF9HQVRUKG51bV9lbnRyaWVzIC0gMSk7CisKKwlpb3VubWFwKGk0NjAuZ2F0dCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW4gdGhlIEkvTyAoR0FSVCkgcGFnZSBzaXplIGlzIHNtYWxsZXIgdGhhbgorICogUEFHRV9TSVpFLgorICovCisKK3N0YXRpYyBpbnQgaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgcGFkZHIsIGlvX3BnX3N0YXJ0LCBpb19wYWdlX3NpemU7CisJaW50IGksIGosIGssIG51bV9lbnRyaWVzOworCXZvaWQgKnRlbXA7CisKKwlwcl9kZWJ1ZygiaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UobWVtPSVwLCBwZ19zdGFydD0lbGQsIHR5cGU9JWQsIHBhZGRyMD0weCVseClcbiIsCisJCSBtZW0sIHBnX3N0YXJ0LCB0eXBlLCBtZW0tPm1lbW9yeVswXSk7CisKKwlpb19wZ19zdGFydCA9IEk0NjBfSU9QQUdFU19QRVJfS1BBR0UgKiBwZ19zdGFydDsKKworCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwlpZiAoKGlvX3BnX3N0YXJ0ICsgSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRSAqIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJMb29rcyBsaWtlIHdlJ3JlIG91dCBvZiBBR1AgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaiA9IGlvX3BnX3N0YXJ0OworCXdoaWxlIChqIDwgKGlvX3BnX3N0YXJ0ICsgSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRSAqIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgUkRfR0FUVChqKSkpIHsKKwkJCXByX2RlYnVnKCJpNDYwX2luc2VydF9tZW1vcnlfc21hbGxfaW9fcGFnZTogR0FUVFslZF09MHgleCBpcyBidXN5XG4iLAorCQkJCSBqLCBSRF9HQVRUKGopKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaisrOworCX0KKworCWlvX3BhZ2Vfc2l6ZSA9IDFVTCA8PCBJNDYwX0lPX1BBR0VfU0hJRlQ7CisJZm9yIChpID0gMCwgaiA9IGlvX3BnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJcGFkZHIgPSBtZW0tPm1lbW9yeVtpXTsKKwkJZm9yIChrID0gMDsgayA8IEk0NjBfSU9QQUdFU19QRVJfS1BBR0U7IGsrKywgaisrLCBwYWRkciArPSBpb19wYWdlX3NpemUpCisJCQlXUl9HQVRUKGosIGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCQlwYWRkciwgbWVtLT50eXBlKSk7CisJfQorCVdSX0ZMVVNIX0dBVFQoaiAtIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpOworCisJcHJfZGVidWcoImk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlKG1lbT0lcCwgcGdfc3RhcnQ9JWxkLCB0eXBlPSVkKVxuIiwKKwkJIG1lbSwgcGdfc3RhcnQsIHR5cGUpOworCisJcGdfc3RhcnQgPSBJNDYwX0lPUEFHRVNfUEVSX0tQQUdFICogcGdfc3RhcnQ7CisKKwlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChwZ19zdGFydCArIEk0NjBfSU9QQUdFU19QRVJfS1BBR0UgKiBtZW0tPnBhZ2VfY291bnQpOyBpKyspCisJCVdSX0dBVFQoaSwgMCk7CisJV1JfRkxVU0hfR0FUVChpIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBJNDYwX0xBUkdFX0lPX1BBR0VTCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aGVuIHRoZSBJL08gKEdBUlQpIHBhZ2Ugc2l6ZSBleGNlZWRzIFBBR0VfU0laRS4KKyAqCisgKiBUaGlzIHNpdHVhdGlvbiBpcyBpbnRlcmVzdGluZyBzaW5jZSBBR1AgbWVtb3J5IGFsbG9jYXRpb25zIHRoYXQgYXJlIHNtYWxsZXIgdGhhbiBhCisgKiBzaW5nbGUgR0FSVCBwYWdlIGFyZSBwb3NzaWJsZS4gIFRoZSBpNDYwLmxwX2Rlc2MgYXJyYXkgdHJhY2tzIHBhcnRpYWwgYWxsb2NhdGlvbiBvZiB0aGUKKyAqIGxhcmdlIEdBUlQgcGFnZXMgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZS4KKyAqCisgKiBpNDYwLmxwX2Rlc2NbcGdfbnVtXS5yZWZjb3VudCB0cmFja3MgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZXMgaW4gdXNlIHdpdGhpbiBHQVJUIHBhZ2UKKyAqIHBnX251bS4gIGk0NjAubHBfZGVzY1twZ19udW1dLnBhZGRyIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBsYXJnZSBwYWdlIGFuZAorICogaTQ2MC5scF9kZXNjW3BnX251bV0uYWxsb2NlZF9tYXAgaXMgYSBiaXRtYXAgb2Yga2VybmVsIHBhZ2VzIHRoYXQgYXJlIGluIHVzZSAoYWxsb2NhdGVkKS4KKyAqLworCitzdGF0aWMgaW50IGk0NjBfYWxsb2NfbGFyZ2VfcGFnZSAoc3RydWN0IGxwX2Rlc2MgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgb3JkZXIgPSBJNDYwX0lPX1BBR0VfU0hJRlQgLSBQQUdFX1NISUZUOworCXNpemVfdCBtYXBfc2l6ZTsKKwl2b2lkICpscGFnZTsKKworCWxwYWdlID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJaWYgKCFscGFnZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZG4ndCBhbGxvYyA0TSBHQVJUIHBhZ2UuLi5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltYXBfc2l6ZSA9ICgoSTQ2MF9LUEFHRVNfUEVSX0lPUEFHRSArIEJJVFNfUEVSX0xPTkcgLSAxKSAmIC1CSVRTX1BFUl9MT05HKS84OworCWxwLT5hbGxvY2VkX21hcCA9IGttYWxsb2MobWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghbHAtPmFsbG9jZWRfbWFwKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGxwYWdlLCBvcmRlcik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk91dCBvZiBtZW1vcnksIHdlJ3JlIGluIHRyb3VibGUuLi5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGxwLT5hbGxvY2VkX21hcCwgMCwgbWFwX3NpemUpOworCisJbHAtPnBhZGRyID0gdmlydF90b19waHlzKGxwYWdlKTsKKwlscC0+cmVmY291bnQgPSAwOworCWF0b21pY19hZGQoSTQ2MF9LUEFHRVNfUEVSX0lPUEFHRSwgJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGk0NjBfZnJlZV9sYXJnZV9wYWdlIChzdHJ1Y3QgbHBfZGVzYyAqbHApCit7CisJa2ZyZWUobHAtPmFsbG9jZWRfbWFwKTsKKwlscC0+YWxsb2NlZF9tYXAgPSBOVUxMOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcGh5c190b192aXJ0KGxwLT5wYWRkciksIEk0NjBfSU9fUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpOworCWF0b21pY19zdWIoSTQ2MF9LUEFHRVNfUEVSX0lPUEFHRSwgJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9pbnNlcnRfbWVtb3J5X2xhcmdlX2lvX3BhZ2UgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQsIGlkeCwgcGcsIG51bV9lbnRyaWVzOworCXN0cnVjdCBscF9kZXNjICpzdGFydCwgKmVuZCwgKmxwOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOworCisJLyogRmlndXJlIG91dCB3aGF0IHBnX3N0YXJ0IG1lYW5zIGluIHRlcm1zIG9mIG91ciBsYXJnZSBHQVJUIHBhZ2VzICovCisJc3RhcnQJIAk9ICZpNDYwLmxwX2Rlc2NbcGdfc3RhcnQgLyBJNDYwX0tQQUdFU19QRVJfSU9QQUdFXTsKKwllbmQgCQk9ICZpNDYwLmxwX2Rlc2NbKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50IC0gMSkgLyBJNDYwX0tQQUdFU19QRVJfSU9QQUdFXTsKKwlzdGFydF9vZmZzZXQgCT0gcGdfc3RhcnQgJSBJNDYwX0tQQUdFU19QRVJfSU9QQUdFOworCWVuZF9vZmZzZXQgCT0gKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50IC0gMSkgJSBJNDYwX0tQQUdFU19QRVJfSU9QQUdFOworCisJaWYgKGVuZCA+IGk0NjAubHBfZGVzYyArIG51bV9lbnRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkxvb2tzIGxpa2Ugd2UncmUgb3V0IG9mIEFHUCBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBvZiB0aGUgYXBlcnR1cmUgaXMgZnJlZSAqLworCWZvciAobHAgPSBzdGFydDsgbHAgPD0gZW5kOyArK2xwKSB7CisJCWlmICghbHAtPmFsbG9jZWRfbWFwKQorCQkJY29udGludWU7CS8qIE9LLCB0aGUgZW50aXJlIGxhcmdlIHBhZ2UgaXMgYXZhaWxhYmxlLi4uICovCisKKwkJZm9yIChpZHggPSAoKGxwID09IHN0YXJ0KSA/IHN0YXJ0X29mZnNldCA6IDApOworCQkgICAgIGlkeCA8ICgobHAgPT0gZW5kKSA/IChlbmRfb2Zmc2V0ICsgMSkgOiBJNDYwX0tQQUdFU19QRVJfSU9QQUdFKTsKKwkJICAgICBpZHgrKykKKwkJeworCQkJaWYgKHRlc3RfYml0KGlkeCwgbHAtPmFsbG9jZWRfbWFwKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJZm9yIChscCA9IHN0YXJ0LCBpID0gMDsgbHAgPD0gZW5kOyArK2xwKSB7CisJCWlmICghbHAtPmFsbG9jZWRfbWFwKSB7CisJCQkvKiBBbGxvY2F0ZSBuZXcgR0FSVCBwYWdlcy4uLiAqLworCQkJaWYgKGk0NjBfYWxsb2NfbGFyZ2VfcGFnZShscCkgPCAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcGcgPSBscCAtIGk0NjAubHBfZGVzYzsKKwkJCVdSX0dBVFQocGcsIGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCQlscC0+cGFkZHIsIDApKTsKKwkJCVdSX0ZMVVNIX0dBVFQocGcpOworCQl9CisKKwkJZm9yIChpZHggPSAoKGxwID09IHN0YXJ0KSA/IHN0YXJ0X29mZnNldCA6IDApOworCQkgICAgIGlkeCA8ICgobHAgPT0gZW5kKSA/IChlbmRfb2Zmc2V0ICsgMSkgOiBJNDYwX0tQQUdFU19QRVJfSU9QQUdFKTsKKwkJICAgICBpZHgrKywgaSsrKQorCQl7CisJCQltZW0tPm1lbW9yeVtpXSA9IGxwLT5wYWRkciArIGlkeCpQQUdFX1NJWkU7CisJCQlfX3NldF9iaXQoaWR4LCBscC0+YWxsb2NlZF9tYXApOworCQkJKytscC0+cmVmY291bnQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9yZW1vdmVfbWVtb3J5X2xhcmdlX2lvX3BhZ2UgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBwZywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0LCBpZHgsIG51bV9lbnRyaWVzOworCXN0cnVjdCBscF9kZXNjICpzdGFydCwgKmVuZCwgKmxwOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgcGdfc3RhcnQgbWVhbnMgaW4gdGVybXMgb2Ygb3VyIGxhcmdlIEdBUlQgcGFnZXMgKi8KKwlzdGFydAkgCT0gJmk0NjAubHBfZGVzY1twZ19zdGFydCAvIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0VdOworCWVuZCAJCT0gJmk0NjAubHBfZGVzY1socGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQgLSAxKSAvIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0VdOworCXN0YXJ0X29mZnNldCAJPSBwZ19zdGFydCAlIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0U7CisJZW5kX29mZnNldCAJPSAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQgLSAxKSAlIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0U7CisKKwlmb3IgKGkgPSAwLCBscCA9IHN0YXJ0OyBscCA8PSBlbmQ7ICsrbHApIHsKKwkJZm9yIChpZHggPSAoKGxwID09IHN0YXJ0KSA/IHN0YXJ0X29mZnNldCA6IDApOworCQkgICAgIGlkeCA8ICgobHAgPT0gZW5kKSA/IChlbmRfb2Zmc2V0ICsgMSkgOiBJNDYwX0tQQUdFU19QRVJfSU9QQUdFKTsKKwkJICAgICBpZHgrKywgaSsrKQorCQl7CisJCQltZW0tPm1lbW9yeVtpXSA9IDA7CisJCQlfX2NsZWFyX2JpdChpZHgsIGxwLT5hbGxvY2VkX21hcCk7CisJCQktLWxwLT5yZWZjb3VudDsKKwkJfQorCisJCS8qIEZyZWUgR0FSVCBwYWdlcyBpZiB0aGV5IGFyZSB1bnVzZWQgKi8KKwkJaWYgKGxwLT5yZWZjb3VudCA9PSAwKSB7CisJCQlwZyA9IGxwIC0gaTQ2MC5scF9kZXNjOworCQkJV1JfR0FUVChwZywgMCk7CisJCQlXUl9GTFVTSF9HQVRUKHBnKTsKKwkJCWk0NjBfZnJlZV9sYXJnZV9wYWdlKGxwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogV3JhcHBlciByb3V0aW5lcyB0byBjYWxsIHRoZSBhcHByb3JpYXRlIHtzbWFsbF9pb19wYWdlLGxhcmdlX2lvX3BhZ2V9IGZ1bmN0aW9uICovCisKK3N0YXRpYyBpbnQgaTQ2MF9pbnNlcnRfbWVtb3J5IChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAorCQkJCW9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpZiAoSTQ2MF9JT19QQUdFX1NISUZUIDw9IFBBR0VfU0hJRlQpCisJCXJldHVybiBpNDYwX2luc2VydF9tZW1vcnlfc21hbGxfaW9fcGFnZShtZW0sIHBnX3N0YXJ0LCB0eXBlKTsKKwllbHNlCisJCXJldHVybiBpNDYwX2luc2VydF9tZW1vcnlfbGFyZ2VfaW9fcGFnZShtZW0sIHBnX3N0YXJ0LCB0eXBlKTsKK30KKworc3RhdGljIGludCBpNDYwX3JlbW92ZV9tZW1vcnkgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWlmIChJNDYwX0lPX1BBR0VfU0hJRlQgPD0gUEFHRV9TSElGVCkKKwkJcmV0dXJuIGk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlKG1lbSwgcGdfc3RhcnQsIHR5cGUpOworCWVsc2UKKwkJcmV0dXJuIGk0NjBfcmVtb3ZlX21lbW9yeV9sYXJnZV9pb19wYWdlKG1lbSwgcGdfc3RhcnQsIHR5cGUpOworfQorCisvKgorICogSWYgdGhlIEkvTyAoR0FSVCkgcGFnZSBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBrZXJuZWwgcGFnZSBzaXplLCB3ZSBkb24ndCB3YW50IHRvCisgKiBhbGxvY2F0ZSBtZW1vcnkgdW50aWwgd2Uga25vdyB3aGVyZSBpdCBpcyB0byBiZSBib3VuZCBpbiB0aGUgYXBlcnR1cmUgKGEKKyAqIG11bHRpLWtlcm5lbC1wYWdlIGFsbG9jIG1pZ2h0IGZpdCBpbnNpZGUgb2YgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgR0FSVCBwYWdlKS4KKyAqCisgKiBMZXQncyBqdXN0IGhvcGUgbm9ib2R5IGNvdW50cyBvbiB0aGUgYWxsb2NhdGVkIEFHUCBtZW1vcnkgYmVpbmcgdGhlcmUgYmVmb3JlIGJpbmQgdGltZQorICogKEkgZG9uJ3QgdGhpbmsgY3VycmVudCBkcml2ZXJzIGRvKS4uLgorICovCitzdGF0aWMgdm9pZCAqaTQ2MF9hbGxvY19wYWdlIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdm9pZCAqcGFnZTsKKworCWlmIChJNDYwX0lPX1BBR0VfU0hJRlQgPD0gUEFHRV9TSElGVCkKKwkJcGFnZSA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UoYWdwX2JyaWRnZSk7CisJZWxzZQorCQkvKiBSZXR1cm5pbmcgTlVMTCB3b3VsZCBjYXVzZSBwcm9ibGVtcyAqLworCQkvKiBBSzogcmVhbGx5IGR1YmlvdXMgY29kZS4gKi8KKwkJcGFnZSA9ICh2b2lkICopfjBVTDsKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHZvaWQgaTQ2MF9kZXN0cm95X3BhZ2UgKHZvaWQgKnBhZ2UpCit7CisJaWYgKEk0NjBfSU9fUEFHRV9TSElGVCA8PSBQQUdFX1NISUZUKQorCQlhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UocGFnZSk7Cit9CisKKyNlbmRpZiAvKiBJNDYwX0xBUkdFX0lPX1BBR0VTICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGk0NjBfbWFza19tZW1vcnkgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0eXBlKQoreworCS8qIE1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgYWRkcmVzcyBpcyBhIHZhbGlkIEdBVFQgZW50cnkgKi8KKwlyZXR1cm4gYnJpZGdlLT5kcml2ZXItPm1hc2tzWzBdLm1hc2sKKwkJfCAoKChhZGRyICYgfigoMSA8PCBJNDYwX0lPX1BBR0VfU0hJRlQpIC0gMSkpICYgMHhmZmZmZmYwMDApID4+IDEyKTsKK30KKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsX2k0NjBfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGk0NjBfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDMsCisJLmNvbmZpZ3VyZQkJPSBpNDYwX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBpNDYwX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gaTQ2MF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaTQ2MF90bGJfZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGk0NjBfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpNDYwX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGk0NjBfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGk0NjBfZnJlZV9nYXR0X3RhYmxlLAorI2lmIEk0NjBfTEFSR0VfSU9fUEFHRVMKKwkuaW5zZXJ0X21lbW9yeQkJPSBpNDYwX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gaTQ2MF9yZW1vdmVfbWVtb3J5LAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBpNDYwX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBpNDYwX2Rlc3Ryb3lfcGFnZSwKKyNlbHNlCisJLmluc2VydF9tZW1vcnkJCT0gaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UsCisJLnJlbW92ZV9tZW1vcnkJCT0gaTQ2MF9yZW1vdmVfbWVtb3J5X3NtYWxsX2lvX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisjZW5kaWYKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfaW50ZWxfaTQ2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmICghY2FwX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfaTQ2MF9kcml2ZXI7CisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBJbnRlbCA0NjBHWCBjaGlwc2V0XG4iKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2ludGVsX2k0NjBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFncF9yZW1vdmVfYnJpZGdlKGJyaWRnZSk7CisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9pbnRlbF9pNDYwX3BjaV90YWJsZVtdID0geworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfODQ0NjBHWCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF9pbnRlbF9pNDYwX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3BfaW50ZWxfaTQ2MF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWludGVsLWk0NjAiLAorCS5pZF90YWJsZQk9IGFncF9pbnRlbF9pNDYwX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX2ludGVsX2k0NjBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZ3BfaW50ZWxfaTQ2MF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX2ludGVsX2k0NjBfaW5pdCh2b2lkKQoreworCWlmIChhZ3Bfb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWdwX2ludGVsX2k0NjBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfaW50ZWxfaTQ2MF9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfaW50ZWxfaTQ2MF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWdwX2ludGVsX2k0NjBfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfaW50ZWxfaTQ2MF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiQ2hyaXMgQWhuYSA8Q2hyaXN0b3BoZXIuSi5BaG5hQGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdkNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtMCwwICsxLDE4MzMgQEAKKy8qCisgKiBJbnRlbCBBR1BHQVJUIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBJbnRlbChSKSA4NTVHTS84NTJHTSBhbmQgODY1RyBzdXBwb3J0IGFkZGVkIGJ5IERhdmlkIERhd2VzCisgKiA8ZGF3ZXNAdHVuZ3N0ZW5ncmFwaGljcy5jb20+LgorICoKKyAqIEludGVsKFIpIDkxNUcvOTE1R00gc3VwcG9ydCBhZGRlZCBieSBBbGFuIEhvdXJpaGFuZQorICogPGFsYW5oQHR1bmdzdGVuZ3JhcGhpY3MuY29tPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgImFncC5oIgorCisvKiBJbnRlbCA4MTUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfODE1X0FQQ09OVAkweDUxCisjZGVmaW5lIElOVEVMXzgxNV9BVFRCQVNFX01BU0sJfjB4MUZGRkZGRkYKKworLyogSW50ZWwgaTgyMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU5URUxfSTgyMF9SRENSCQkweDUxCisjZGVmaW5lIElOVEVMX0k4MjBfRVJSU1RTCTB4YzgKKworLyogSW50ZWwgaTg0MCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU5URUxfSTg0MF9NQ0hDRkcJMHg1MAorI2RlZmluZSBJTlRFTF9JODQwX0VSUlNUUwkweGM4CisKKy8qIEludGVsIGk4NTAgcmVnaXN0ZXJzICovCisjZGVmaW5lIElOVEVMX0k4NTBfTUNIQ0ZHCTB4NTAKKyNkZWZpbmUgSU5URUxfSTg1MF9FUlJTVFMJMHhjOAorCisvKiBpbnRlbCA5MTVHIHJlZ2lzdGVycyAqLworI2RlZmluZSBJOTE1X0dNQUREUgkweDE4CisjZGVmaW5lIEk5MTVfTU1BRERSCTB4MTAKKyNkZWZpbmUgSTkxNV9QVEVBRERSCTB4MUMKKyNkZWZpbmUgSTkxNV9HTUNIX0dNU19TVE9MRU5fNDhNCSgweDYgPDwgNCkKKyNkZWZpbmUgSTkxNV9HTUNIX0dNU19TVE9MRU5fNjRNCSgweDcgPDwgNCkKKworCisvKiBJbnRlbCA3NTA1IHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRFTF9JNzUwNV9BUFNJWkUJMHg3NAorI2RlZmluZSBJTlRFTF9JNzUwNV9OQ0FQSUQJMHg2MAorI2RlZmluZSBJTlRFTF9JNzUwNV9OSVNUQVQJMHg2YworI2RlZmluZSBJTlRFTF9JNzUwNV9BVFRCQVNFCTB4NzgKKyNkZWZpbmUgSU5URUxfSTc1MDVfRVJSU1RTCTB4NDIKKyNkZWZpbmUgSU5URUxfSTc1MDVfQUdQQ1RSTAkweDcwCisjZGVmaW5lIElOVEVMX0k3NTA1X01DSENGRwkweDUwCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgaW50ZWxfaTgxMF9zaXplc1tdID0KK3sKKwl7NjQsIDE2Mzg0LCA0fSwKKwkvKiBUaGUgMzJNIG1vZGUgc3RpbGwgcmVxdWlyZXMgYSA2NGsgZ2F0dCAqLworCXszMiwgODE5MiwgNH0KK307CisKKyNkZWZpbmUgQUdQX0RDQUNIRV9NRU1PUlkJMQorI2RlZmluZSBBR1BfUEhZU19NRU1PUlkJCTIKKworc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfaTgxMF9tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKKwl7Lm1hc2sgPSAoSTgxMF9QVEVfVkFMSUQgfCBJODEwX1BURV9MT0NBTCksIC50eXBlID0gQUdQX0RDQUNIRV9NRU1PUll9LAorCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9Cit9OworCitzdGF0aWMgc3RydWN0IF9pbnRlbF9pODEwX3ByaXZhdGUgeworCXN0cnVjdCBwY2lfZGV2ICppODEwX2RldjsJLyogZGV2aWNlIG9uZSAqLworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwlpbnQgbnVtX2RjYWNoZV9lbnRyaWVzOworfSBpbnRlbF9pODEwX3ByaXZhdGU7CisKK3N0YXRpYyBpbnQgaW50ZWxfaTgxMF9mZXRjaF9zaXplKHZvaWQpCit7CisJdTMyIHNtcmFtX21pc2NjOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSTgxMF9TTVJBTV9NSVNDQywgJnNtcmFtX21pc2NjKTsKKwl2YWx1ZXMgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR01TKSA9PSBJODEwX0dNU19ESVNBQkxFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJpODEwIGlzIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoc21yYW1fbWlzY2MgJiBJODEwX0dGWF9NRU1fV0lOX1NJWkUpID09IEk4MTBfR0ZYX01FTV9XSU5fMzJNKSB7CisJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIDEpOworCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDE7CisJCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKKwl9IGVsc2UgeworCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMpOworCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDA7CisJCXJldHVybiB2YWx1ZXNbMF0uc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9pODEwX2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqY3VycmVudF9zaXplOworCXUzMiB0ZW1wOworCWludCBpOworCisJY3VycmVudF9zaXplID0gQV9TSVpFX0ZJWChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX2k4MTBfcHJpdmF0ZS5pODEwX2RldiwgSTgxMF9NTUFERFIsICZ0ZW1wKTsKKwl0ZW1wICY9IDB4ZmZmODAwMDA7CisKKwlpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLCAxMjggKiA0MDk2KTsKKwlpZiAoIWludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlbWFwIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoKHJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9EUkFNX0NUTCkKKwkJJiBJODEwX0RSQU1fUk9XXzApID09IEk4MTBfRFJBTV9ST1dfMF9TRFJBTSkgeworCQkvKiBUaGlzIHdpbGwgbmVlZCB0byBiZSBkeW5hbWljYWxseSBhc3NpZ25lZCAqLworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZGV0ZWN0ZWQgNE1CIGRlZGljYXRlZCB2aWRlbyByYW0uXG4iKTsKKwkJaW50ZWxfaTgxMF9wcml2YXRlLm51bV9kY2FjaGVfZW50cmllcyA9IDEwMjQ7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYsIEk4MTBfR01BRERSLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgfCBJODEwX1BHRVRCTF9FTkFCTEVELCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CisJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCWlmIChhZ3BfYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9zaXplLT5udW1fZW50cmllczsgaSsrKSB7CisJCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOworCQkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsJLyogUENJIHBvc3RpbmcuICovCisJCX0KKwl9CisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k4MTBfY2xlYW51cCh2b2lkKQoreworCXdyaXRlbCgwLCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CisJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyk7CS8qIFBDSSBQb3N0aW5nLiAqLworCWlvdW5tYXAoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k4MTBfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKm1lbSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k4MTBfYWdwX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXJldHVybjsKK30KKworLyogRXhpc3RzIHRvIHN1cHBvcnQgQVJHQiBjdXJzb3JzICovCitzdGF0aWMgdm9pZCAqaTh4eF9hbGxvY19wYWdlcyh2b2lkKQoreworCXN0cnVjdCBwYWdlICogcGFnZTsKKworCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAyKTsKKwlpZiAocGFnZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIDQsIFBBR0VfS0VSTkVMX05PQ0FDSEUpIDwgMCkgeworCQlnbG9iYWxfZmx1c2hfdGxiKCk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZ2xvYmFsX2ZsdXNoX3RsYigpOworCWdldF9wYWdlKHBhZ2UpOworCVNldFBhZ2VMb2NrZWQocGFnZSk7CisJYXRvbWljX2luYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKKwlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBpOHh4X2Rlc3Ryb3lfcGFnZXModm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmIChhZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJY2hhbmdlX3BhZ2VfYXR0cihwYWdlLCA0LCBQQUdFX0tFUk5FTCk7CisJZ2xvYmFsX2ZsdXNoX3RsYigpOworCXB1dF9wYWdlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkciwgMik7CisJYXRvbWljX2RlYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKK30KKworc3RhdGljIGludCBpbnRlbF9pODEwX2luc2VydF9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAorCQkJCWludCB0eXBlKQoreworCWludCBpLCBqLCBudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChqID0gcGdfc3RhcnQ7IGogPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBqKyspIHsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJaWYgKCh0eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSAmJiAobWVtLT50eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSkgeworCQkJLyogc3BlY2lhbCBpbnNlcnQgKi8KKwkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQkJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBpKyspIHsKKwkJCQl3cml0ZWwoKGkqNDA5Nil8STgxMF9QVEVfTE9DQUx8STgxMF9QVEVfVkFMSUQsIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCQkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsJLyogUENJIFBvc3RpbmcuICovCisJCQl9CisJCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwkJCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZigodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpICYmIChtZW0tPnR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKSkKKwkJCWdvdG8gaW5zZXJ0OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK2luc2VydDoKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCisJCQltZW0tPm1lbW9yeVtpXSwgbWVtLT50eXBlKSwKKwkJCWludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CisJCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKKwkJCQlpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgaTgxMC9pODMwIHJlcXVpcmVzIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBwcm9ncmFtIGl0cyBtb3VzZQorICogcG9pbnRlciBpbnRvIGhhcmR3YXJlLgorICogSG93ZXZlciB0aGUgWHNlcnZlciBzdGlsbCB3cml0ZXMgdG8gaXQgdGhyb3VnaCB0aGUgYWdwIGFwZXJ0dXJlLgorICovCitzdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmFsbG9jX2FncHBoeXNtZW1faTh4eChzaXplX3QgcGdfY291bnQsIGludCB0eXBlKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisJdm9pZCAqYWRkcjsKKworCWlmIChwZ19jb3VudCAhPSAxICYmIHBnX2NvdW50ICE9IDQpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoIChwZ19jb3VudCkgeworCWNhc2UgMTogYWRkciA9IGFncF9icmlkZ2UtPmRyaXZlci0+YWdwX2FsbG9jX3BhZ2UoYWdwX2JyaWRnZSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJLyoga2x1ZGdlIHRvIGdldCA0IHBoeXNpY2FsIHBhZ2VzIGZvciBBUkdCIGN1cnNvciAqLworCQlhZGRyID0gaTh4eF9hbGxvY19wYWdlcygpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoYWRkciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW5ldyA9IGFncF9jcmVhdGVfbWVtb3J5KHBnX2NvdW50KTsKKwlpZiAobmV3ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5tZW1vcnlbMF0gPSB2aXJ0X3RvX3BoeXMoYWRkcik7CisJaWYgKHBnX2NvdW50ID09IDQpIHsKKwkJLyoga2x1ZGdlIHRvIGdldCA0IHBoeXNpY2FsIHBhZ2VzIGZvciBBUkdCIGN1cnNvciAqLworCQluZXctPm1lbW9yeVsxXSA9IG5ldy0+bWVtb3J5WzBdICsgUEFHRV9TSVpFOworCQluZXctPm1lbW9yeVsyXSA9IG5ldy0+bWVtb3J5WzFdICsgUEFHRV9TSVpFOworCQluZXctPm1lbW9yeVszXSA9IG5ldy0+bWVtb3J5WzJdICsgUEFHRV9TSVpFOworCX0KKwluZXctPnBhZ2VfY291bnQgPSBwZ19jb3VudDsKKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gcGdfY291bnQ7CisJbmV3LT50eXBlID0gQUdQX1BIWVNfTUVNT1JZOworCW5ldy0+cGh5c2ljYWwgPSBuZXctPm1lbW9yeVswXTsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmludGVsX2k4MTBfYWxsb2NfYnlfdHlwZShzaXplX3QgcGdfY291bnQsIGludCB0eXBlKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisKKwlpZiAodHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkgeworCQlpZiAocGdfY291bnQgIT0gaW50ZWxfaTgxMF9wcml2YXRlLm51bV9kY2FjaGVfZW50cmllcykKKwkJCXJldHVybiBOVUxMOworCisJCW5ldyA9IGFncF9jcmVhdGVfbWVtb3J5KDEpOworCQlpZiAobmV3ID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQluZXctPnR5cGUgPSBBR1BfRENBQ0hFX01FTU9SWTsKKwkJbmV3LT5wYWdlX2NvdW50ID0gcGdfY291bnQ7CisJCW5ldy0+bnVtX3NjcmF0Y2hfcGFnZXMgPSAwOworCQl2ZnJlZShuZXctPm1lbW9yeSk7CisJCXJldHVybiBuZXc7CisJfQorCWlmICh0eXBlID09IEFHUF9QSFlTX01FTU9SWSkKKwkJcmV0dXJuIGFsbG9jX2FncHBoeXNtZW1faTh4eChwZ19jb3VudCwgdHlwZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUoc3RydWN0IGFncF9tZW1vcnkgKmN1cnIpCit7CisJYWdwX2ZyZWVfa2V5KGN1cnItPmtleSk7CisJaWYoY3Vyci0+dHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpIHsKKwkJaWYgKGN1cnItPnBhZ2VfY291bnQgPT0gNCkKKwkJCWk4eHhfZGVzdHJveV9wYWdlcyhwaHlzX3RvX3ZpcnQoY3Vyci0+bWVtb3J5WzBdKSk7CisJCWVsc2UKKwkJCWFncF9icmlkZ2UtPmRyaXZlci0+YWdwX2Rlc3Ryb3lfcGFnZSgKKwkJCQkgcGh5c190b192aXJ0KGN1cnItPm1lbW9yeVswXSkpOworCQl2ZnJlZShjdXJyLT5tZW1vcnkpOworCX0KKwlrZnJlZShjdXJyKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfaTgxMF9tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCisJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSkKK3sKKwkvKiBUeXBlIGNoZWNraW5nIG11c3QgYmUgZG9uZSBlbHNld2hlcmUgKi8KKwlyZXR1cm4gYWRkciB8IGJyaWRnZS0+ZHJpdmVyLT5tYXNrc1t0eXBlXS5tYXNrOworfQorCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGludGVsX2k4MzBfc2l6ZXNbXSA9Cit7CisJezEyOCwgMzI3NjgsIDV9LAorCS8qIFRoZSA2NE0gbW9kZSBzdGlsbCByZXF1aXJlcyBhIDEyOGsgZ2F0dCAqLworCXs2NCwgMTYzODQsIDV9LAorCXsyNTYsIDY1NTM2LCA2fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgX2ludGVsX2k4MzBfcHJpdmF0ZSB7CisJc3RydWN0IHBjaV9kZXYgKmk4MzBfZGV2OwkJLyogZGV2aWNlIG9uZSAqLworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwl2b2xhdGlsZSB1MzIgX19pb21lbSAqZ3R0OwkJLyogSTkxNUcgKi8KKwlpbnQgZ3R0X2VudHJpZXM7Cit9IGludGVsX2k4MzBfcHJpdmF0ZTsKKworc3RhdGljIHZvaWQgaW50ZWxfaTgzMF9pbml0X2d0dF9lbnRyaWVzKHZvaWQpCit7CisJdTE2IGdtY2hfY3RybDsKKwlpbnQgZ3R0X2VudHJpZXM7CisJdTggcmRjdDsKKwlpbnQgbG9jYWwgPSAwOworCXN0YXRpYyBjb25zdCBpbnQgZGR0WzRdID0geyAwLCAxNiwgMzIsIDY0IH07CisJaW50IHNpemU7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsJmdtY2hfY3RybCk7CisKKwkvKiBXZSBvYnRhaW4gdGhlIHNpemUgb2YgdGhlIEdUVCwgd2hpY2ggaXMgYWxzbyBzdG9yZWQgKGZvciBzb21lCisJICogcmVhc29uKSBhdCB0aGUgdG9wIG9mIHN0b2xlbiBtZW1vcnkuIFRoZW4gd2UgYWRkIDRLQiB0byB0aGF0CisJICogZm9yIHRoZSB2aWRlbyBCSU9TIHBvcHVwLCB3aGljaCBpcyBhbHNvIHN0b3JlZCBpbiB0aGVyZS4gKi8KKwlzaXplID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5mZXRjaF9zaXplKCkgKyA0OworCisJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIgfHwKKwkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSEIpIHsKKwkJc3dpdGNoIChnbWNoX2N0cmwgJiBJODMwX0dNQ0hfR01TX01BU0spIHsKKwkJY2FzZSBJODMwX0dNQ0hfR01TX1NUT0xFTl81MTI6CisJCQlndHRfZW50cmllcyA9IEtCKDUxMikgLSBLQihzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIEk4MzBfR01DSF9HTVNfU1RPTEVOXzEwMjQ6CisJCQlndHRfZW50cmllcyA9IE1CKDEpIC0gS0Ioc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJODMwX0dNQ0hfR01TX1NUT0xFTl84MTkyOgorCQkJZ3R0X2VudHJpZXMgPSBNQig4KSAtIEtCKHNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgSTgzMF9HTUNIX0dNU19MT0NBTDoKKwkJCXJkY3QgPSByZWFkYihpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MzBfUkRSQU1fQ0hBTk5FTF9UWVBFKTsKKwkJCWd0dF9lbnRyaWVzID0gKEk4MzBfUkRSQU1fTkQocmRjdCkgKyAxKSAqCisJCQkJCU1CKGRkdFtJODMwX1JEUkFNX0REVChyZGN0KV0pOworCQkJbG9jYWwgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlndHRfZW50cmllcyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZ21jaF9jdHJsICYgSTgzMF9HTUNIX0dNU19NQVNLKSB7CisJCWNhc2UgSTg1NV9HTUNIX0dNU19TVE9MRU5fMU06CisJCQlndHRfZW50cmllcyA9IE1CKDEpIC0gS0Ioc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJODU1X0dNQ0hfR01TX1NUT0xFTl80TToKKwkJCWd0dF9lbnRyaWVzID0gTUIoNCkgLSBLQihzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIEk4NTVfR01DSF9HTVNfU1RPTEVOXzhNOgorCQkJZ3R0X2VudHJpZXMgPSBNQig4KSAtIEtCKHNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgSTg1NV9HTUNIX0dNU19TVE9MRU5fMTZNOgorCQkJZ3R0X2VudHJpZXMgPSBNQigxNikgLSBLQihzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIEk4NTVfR01DSF9HTVNfU1RPTEVOXzMyTToKKwkJCWd0dF9lbnRyaWVzID0gTUIoMzIpIC0gS0Ioc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJOTE1X0dNQ0hfR01TX1NUT0xFTl80OE06CisJCQkvKiBDaGVjayBpdCdzIHJlYWxseSBJOTE1RyAqLworCQkJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHX0hCIHx8CisJCQkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0hCKQorCQkJCWd0dF9lbnRyaWVzID0gTUIoNDgpIC0gS0Ioc2l6ZSk7CisJCQllbHNlCisJCQkJZ3R0X2VudHJpZXMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgSTkxNV9HTUNIX0dNU19TVE9MRU5fNjRNOgorCQkJLyogQ2hlY2sgaXQncyByZWFsbHkgSTkxNUcgKi8KKwkJCWlmIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R19IQiB8fAorCQkJICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHTV9IQikKKwkJCQlndHRfZW50cmllcyA9IE1CKDY0KSAtIEtCKHNpemUpOworCQkJZWxzZQorCQkJCWd0dF9lbnRyaWVzID0gMDsKKwkJZGVmYXVsdDoKKwkJCWd0dF9lbnRyaWVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChndHRfZW50cmllcyA+IDApCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCAlZEsgJXMgbWVtb3J5LlxuIiwKKwkJICAgICAgIGd0dF9lbnRyaWVzIC8gS0IoMSksIGxvY2FsID8gImxvY2FsIiA6ICJzdG9sZW4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiTm8gcHJlLWFsbG9jYXRlZCB2aWRlbyBtZW1vcnkgZGV0ZWN0ZWQuXG4iKTsKKwlndHRfZW50cmllcyAvPSBLQig0KTsKKworCWludGVsX2k4MzBfcHJpdmF0ZS5ndHRfZW50cmllcyA9IGd0dF9lbnRyaWVzOworfQorCisvKiBUaGUgaW50ZWwgaTgzMCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBhZ3AgYXBlcnR1cmUgZHVyaW5nIFBPU1QuCisgKiBVc2UgdGhlIG1lbW9yeSBhbHJlYWR5IHNldCBhc2lkZSBmb3IgaW4gdGhlIEdUVC4KKyAqLworc3RhdGljIGludCBpbnRlbF9pODMwX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpbnQgcGFnZV9vcmRlcjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgKnNpemU7CisJaW50IG51bV9lbnRyaWVzOworCXUzMiB0ZW1wOworCisJc2l6ZSA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwlwYWdlX29yZGVyID0gc2l6ZS0+cGFnZV9vcmRlcjsKKwludW1fZW50cmllcyA9IHNpemUtPm51bV9lbnRyaWVzOworCWFncF9icmlkZ2UtPmdhdHRfdGFibGVfcmVhbCA9IE5VTEw7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LEk4MTBfTU1BRERSLCZ0ZW1wKTsKKwl0ZW1wICY9IDB4ZmZmODAwMDA7CisKKwlpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLDEyOCAqIDQwOTYpOworCWlmICghaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0ZW1wID0gcmVhZGwoaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpICYgMHhmZmZmZjAwMDsKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsJLyogRklYTUU6ID8/ICovCisKKwkvKiB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgTU1JTyBiYXNlIGFkZHJlc3MgaXMga25vd24gKi8KKwlpbnRlbF9pODMwX2luaXRfZ3R0X2VudHJpZXMoKTsKKworCWFncF9icmlkZ2UtPmdhdHRfdGFibGUgPSBOVUxMOworCisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHRlbXA7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBnYXR0IHRhYmxlIHRvIGEgc2FuZSBzdGF0ZS4gVXNlIHRoZSB0b3Agb2Ygc3RvbGVuCisgKiBtZW1vcnkgZm9yIHRoZSBHVFQuCisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfaTgzMF9mcmVlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXUxNiBnbWNoX2N0cmw7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICp2YWx1ZXM7CisKKwl2YWx1ZXMgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIgJiYKKwkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSEIpIHsKKwkJLyogODU1R00vODUyR00vODY1RyBoYXMgMTI4TUIgYXBlcnR1cmUgc2l6ZSAqLworCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgdmFsdWVzOworCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDA7CisJCXJldHVybiB2YWx1ZXNbMF0uc2l6ZTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsJmdtY2hfY3RybCk7CisKKwlpZiAoKGdtY2hfY3RybCAmIEk4MzBfR01DSF9NRU1fTUFTSykgPT0gSTgzMF9HTUNIX01FTV8xMjhNKSB7CisJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSB2YWx1ZXM7CisJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gMDsKKwkJcmV0dXJuIHZhbHVlc1swXS5zaXplOworCX0gZWxzZSB7CisJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgMSk7CisJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gMTsKKwkJcmV0dXJuIHZhbHVlc1sxXS5zaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfY29uZmlndXJlKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICpjdXJyZW50X3NpemU7CisJdTMyIHRlbXA7CisJdTE2IGdtY2hfY3RybDsKKwlpbnQgaTsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODMwX3ByaXZhdGUuaTgzMF9kZXYsSTgxMF9HTUFERFIsJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LEk4MzBfR01DSF9DVFJMLCZnbWNoX2N0cmwpOworCWdtY2hfY3RybCB8PSBJODMwX0dNQ0hfRU5BQkxFRDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LEk4MzBfR01DSF9DVFJMLGdtY2hfY3RybCk7CisKKwl3cml0ZWwoYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcnxJODEwX1BHRVRCTF9FTkFCTEVELCBpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CisJcmVhZGwoaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCWlmIChhZ3BfYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgeworCQlmb3IgKGkgPSBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXM7IGkgPCBjdXJyZW50X3NpemUtPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCQlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwkJfQorCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9pODMwX2NsZWFudXAodm9pZCkKK3sKKwlpb3VubWFwKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMpOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfaW5zZXJ0X2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSxvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksaixudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKHBnX3N0YXJ0IDwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyBQRlggInBnX3N0YXJ0ID09IDB4JS44bHgsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzID09IDB4JS44eFxuIiwKKwkJCQlwZ19zdGFydCxpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpOworCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGluc2VydCBpbnRvIGxvY2FsL3N0b2xlbiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBpODMwIGNhbid0IGNoZWNrIHRoZSBHVFQgZm9yIGVudHJpZXMgc2luY2UgaXRzIHJlYWQgb25seSwKKwkgKiBkZXBlbmQgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IG9mZnNldCBkZWNpc2lvbnMuCisJICovCisKKwlpZiAoKHR5cGUgIT0gMCAmJiB0eXBlICE9IEFHUF9QSFlTX01FTU9SWSkgfHwKKwkJKG1lbS0+dHlwZSAhPSAwICYmIG1lbS0+dHlwZSAhPSBBR1BfUEhZU19NRU1PUlkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwkvKiBGSVhNRTogTmVjZXNzYXJ5ID8qLworCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksCisJCQlpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOworCQlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSxvZmZfdCBwZ19zdGFydCwKKwkJCQlpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJaWYgKHBnX3N0YXJ0IDwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGRpc2FibGUgbG9jYWwvc3RvbGVuIG1lbW9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqaW50ZWxfaTgzMF9hbGxvY19ieV90eXBlKHNpemVfdCBwZ19jb3VudCxpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCisJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOworCisJLyogYWx3YXlzIHJldHVybiBOVUxMIGZvciBvdGhlciBhbGxvY2F0aW9uIHR5cGVzIGZvciBub3cgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpbnRlbF9pOTE1X2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqY3VycmVudF9zaXplOworCXUzMiB0ZW1wOworCXUxNiBnbWNoX2N0cmw7CisJaW50IGk7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LCBJOTE1X0dNQUREUiwgJnRlbXApOworCisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsJmdtY2hfY3RybCk7CisJZ21jaF9jdHJsIHw9IEk4MzBfR01DSF9FTkFCTEVEOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsZ21jaF9jdHJsKTsKKworCXdyaXRlbChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyfEk4MTBfUEdFVEJMX0VOQUJMRUQsIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKKwlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJaWYgKGFncF9icmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKSB7CisJCWZvciAoaSA9IGludGVsX2k4MzBfcHJpdmF0ZS5ndHRfZW50cmllczsgaSA8IGN1cnJlbnRfc2l6ZS0+bnVtX2VudHJpZXM7IGkrKykgeworCQkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtpKTsKKwkJCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCQl9CisJfQorCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k5MTVfY2xlYW51cCh2b2lkKQoreworCWlvdW5tYXAoaW50ZWxfaTgzMF9wcml2YXRlLmd0dCk7CisJaW91bm1hcChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzKTsKK30KKworc3RhdGljIGludCBpbnRlbF9pOTE1X2luc2VydF9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sb2ZmX3QgcGdfc3RhcnQsCisJCQkJaW50IHR5cGUpCit7CisJaW50IGksaixudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKHBnX3N0YXJ0IDwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyBQRlggInBnX3N0YXJ0ID09IDB4JS44bHgsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzID09IDB4JS44eFxuIiwKKwkJCQlwZ19zdGFydCxpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpOworCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGluc2VydCBpbnRvIGxvY2FsL3N0b2xlbiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBpODMwIGNhbid0IGNoZWNrIHRoZSBHVFQgZm9yIGVudHJpZXMgc2luY2UgaXRzIHJlYWQgb25seSwKKwkgKiBkZXBlbmQgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IG9mZnNldCBkZWNpc2lvbnMuCisJICovCisKKwlpZiAoKHR5cGUgIT0gMCAmJiB0eXBlICE9IEFHUF9QSFlTX01FTU9SWSkgfHwKKwkJKG1lbS0+dHlwZSAhPSAwICYmIG1lbS0+dHlwZSAhPSBBR1BfUEhZU19NRU1PUlkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraik7CisJCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraik7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaTkxNV9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLG9mZl90IHBnX3N0YXJ0LAorCQkJCWludCB0eXBlKQoreworCWludCBpOworCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlpZiAocGdfc3RhcnQgPCBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUcnlpbmcgdG8gZGlzYWJsZSBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAobWVtLT5wYWdlX2NvdW50ICsgcGdfc3RhcnQpOyBpKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtpKTsKKwkJcmVhZGwoaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtpKTsKKwl9CisKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k5MTVfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqdmFsdWVzOworCXUzMiB0ZW1wLCBvZmZzZXQgPSAwOworCisjZGVmaW5lIEk5MTVfMjU2TUJfQUREUkVTU19NQVNLICgxPDwyNykKKworCXZhbHVlcyA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LCBJOTE1X0dNQUREUiwgJnRlbXApOworCWlmICh0ZW1wICYgSTkxNV8yNTZNQl9BRERSRVNTX01BU0spCisJCW9mZnNldCA9IDA7CS8qIDEyOE1CIGFwZXJ0dXJlICovCisJZWxzZQorCQlvZmZzZXQgPSAyOwkvKiAyNTZNQiBhcGVydHVyZSAqLworCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSh2YWx1ZXMgKyBvZmZzZXQpOworCXJldHVybiB2YWx1ZXNbb2Zmc2V0XS5zaXplOworfQorCisvKiBUaGUgaW50ZWwgaTkxNSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBhZ3AgYXBlcnR1cmUgZHVyaW5nIFBPU1QuCisgKiBVc2UgdGhlIG1lbW9yeSBhbHJlYWR5IHNldCBhc2lkZSBmb3IgaW4gdGhlIEdUVC4KKyAqLworc3RhdGljIGludCBpbnRlbF9pOTE1X2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpbnQgcGFnZV9vcmRlcjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgKnNpemU7CisJaW50IG51bV9lbnRyaWVzOworCXUzMiB0ZW1wLCB0ZW1wMjsKKworCXNpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJcGFnZV9vcmRlciA9IHNpemUtPnBhZ2Vfb3JkZXI7CisJbnVtX2VudHJpZXMgPSBzaXplLT5udW1fZW50cmllczsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSBOVUxMOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX2k4MzBfcHJpdmF0ZS5pODMwX2RldiwgSTkxNV9NTUFERFIsICZ0ZW1wKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LCBJOTE1X1BURUFERFIsJnRlbXAyKTsKKworCWludGVsX2k4MzBfcHJpdmF0ZS5ndHQgPSBpb3JlbWFwKHRlbXAyLCAyNTYgKiAxMDI0KTsKKwlpZiAoIWludGVsX2k4MzBfcHJpdmF0ZS5ndHQpCisJCXJldHVybiAtRU5PTUVNOworCisJdGVtcCAmPSAweGZmZjgwMDAwOworCisJaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycyA9IGlvcmVtYXAodGVtcCwxMjggKiA0MDk2KTsKKwlpZiAoIWludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJdGVtcCA9IHJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKSAmIDB4ZmZmZmYwMDA7CisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CS8qIEZJWE1FOiA/ICovCisKKwkvKiB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgTU1JTyBiYXNlIGFkZHJlc3MgaXMga25vd24gKi8KKwlpbnRlbF9pODMwX2luaXRfZ3R0X2VudHJpZXMoKTsKKworCWFncF9icmlkZ2UtPmdhdHRfdGFibGUgPSBOVUxMOworCisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHRlbXA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9mZXRjaF9zaXplKHZvaWQpCit7CisJaW50IGk7CisJdTE2IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2ICp2YWx1ZXM7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgJnRlbXApOworCXZhbHVlcyA9IEFfU0laRV8xNihhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbnRlbF84eHhfZmV0Y2hfc2l6ZSh1OCB0ZW1wKQoreworCWludCBpOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICp2YWx1ZXM7CisKKwl2YWx1ZXMgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCQlhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfOHh4X2ZldGNoX3NpemUodm9pZCkKK3sKKwl1OCB0ZW1wOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsICZ0ZW1wKTsKKwlyZXR1cm4gX19pbnRlbF84eHhfZmV0Y2hfc2l6ZSh0ZW1wKTsKK30KKworc3RhdGljIGludCBpbnRlbF84MTVfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXU4IHRlbXA7CisKKwkvKiBJbnRlbCA4MTUgY2hpcHNldHMgaGF2ZSBhIF93ZWlyZF8gQVBTSVpFIHJlZ2lzdGVyIHdpdGggb25seQorCSAqIG9uZSBub24tcmVzZXJ2ZWQgYml0LCBzbyBtYXNrIHRoZSBvdGhlcnMgb3V0IC4uLiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLCAmdGVtcCk7CisJdGVtcCAmPSAoMSA8PCAzKTsKKworCXJldHVybiBfX2ludGVsXzh4eF9mZXRjaF9zaXplKHRlbXApOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDIyMDApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDIyODApOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsXzh4eF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiB0ZW1wOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgdGVtcCAmIH4oMSA8PCA3KSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCB0ZW1wIHwgKDEgPDwgNykpOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsX2NsZWFudXAodm9pZCkKK3sKKwl1MTYgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMTYgKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCB0ZW1wICYgfigxIDw8IDkpKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsXzh4eF9jbGVhbnVwKHZvaWQpCit7CisJdTE2IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsIHRlbXAgJiB+KDEgPDwgOSkpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7Cit9CisKKworc3RhdGljIGludCBpbnRlbF9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1MTYgdGVtcDI7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfMTYoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDIyODApOworCisJLyogcGFjY2ZnL25ieGNmZyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywKKwkJCSh0ZW1wMiAmIH4oMSA8PCAxMCkpIHwgKDEgPDwgOSkpOworCS8qIGNsZWFyIGFueSBwb3NzaWJsZSBlcnJvciBjb25kaXRpb25zICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfRVJSU1RTICsgMSwgNyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfODE1X2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wLCBhZGRyOworCXU4IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwkvKiBhdHRiYXNlIC0gYXBlcnR1cmUgYmFzZSAqLworCS8qIHRoZSBJbnRlbCA4MTUgY2hpcHNldCBzcGVjLiBzYXlzIHRoYXQgYml0cyAyOS0zMSBpbiB0aGUKKwkqIEFUVEJBU0UgcmVnaXN0ZXIgYXJlIHJlc2VydmVkIC0+IHRyeSBub3QgdG8gd3JpdGUgdGhlbSAqLworCWlmIChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICYgSU5URUxfODE1X0FUVEJBU0VfTUFTSykgeworCQlwcmludGsgKEtFUk5fRU1FUkcgUEZYICJnYXR0IGJ1cyBhZGRyIHRvbyBoaWdoIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhcGVydHVyZSBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLAorCQkJY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgJmFkZHIpOworCWFkZHIgJj0gSU5URUxfODE1X0FUVEJBU0VfTUFTSzsKKwlhZGRyIHw9IGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHI7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogYXBjb250ICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF84MTVfQVBDT05ULCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMXzgxNV9BUENPTlQsIHRlbXAyIHwgKDEgPDwgMSkpOworCisJLyogY2xlYXIgYW55IHBvc3NpYmxlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwkvKiBPZGRuZXNzIDogdGhpcyBjaGlwc2V0IHNlZW1zIHRvIGhhdmUgbm8gRVJSU1RTIHJlZ2lzdGVyICEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfODIwX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF84MjBfY2xlYW51cCh2b2lkKQoreworCXU4IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODIwX1JEQ1IsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODIwX1JEQ1IsCisJCQl0ZW1wICYgfigxIDw8IDEpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsCisJCQlwcmV2aW91c19zaXplLT5zaXplX3ZhbHVlKTsKK30KKworCitzdGF0aWMgaW50IGludGVsXzgyMF9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1OCB0ZW1wMjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogZ2xvYmFsIGVuYWJsZSBhcGVydHVyZSBhY2Nlc3MgKi8KKwkvKiBUaGlzIGZsYWcgaXMgbm90IGFjY2Vzc2VkIHRocm91Z2ggTUNIQ0ZHIHJlZ2lzdGVyIGFzIGluICovCisJLyogaTg1MCBjaGlwc2V0LiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTgyMF9SRENSLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4MjBfUkRDUiwgdGVtcDIgfCAoMSA8PCAxKSk7CisJLyogY2xlYXIgYW55IHBvc3NpYmxlIEFHUC1yZWxhdGVkIGVycm9yIGNvbmRpdGlvbnMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODIwX0VSUlNUUywgMHgwMDFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF84NDBfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYXR0YmFzZSAtIGFwZXJ0dXJlIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcik7CisKKwkvKiBhZ3BjdHJsICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsIDB4MDAwMCk7CisKKwkvKiBtY2djZmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDBfTUNIQ0ZHLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDBfTUNIQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDBfRVJSU1RTLCAweGMwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsXzg0NV9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1OCB0ZW1wMjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogYWdwbSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg0NV9BR1BNLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDVfQUdQTSwgdGVtcDIgfCAoMSA8PCAxKSk7CisJLyogY2xlYXIgYW55IHBvc3NpYmxlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODQ1X0VSUlNUUywgMHgwMDFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF84NTBfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYXR0YmFzZSAtIGFwZXJ0dXJlIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcik7CisKKwkvKiBhZ3BjdHJsICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsIDB4MDAwMCk7CisKKwkvKiBtY2djZmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NTBfTUNIQ0ZHLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NTBfTUNIQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgQUdQLXJlbGF0ZWQgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NTBfRVJSU1RTLCAweDAwMWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsXzg2MF9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1MTYgdGVtcDI7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKmN1cnJlbnRfc2l6ZTsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhcGVydHVyZSBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLCBjdXJyZW50X3NpemUtPnNpemVfdmFsdWUpOworCisJLyogYWRkcmVzcyB0byBtYXAgdG8gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBhdHRiYXNlIC0gYXBlcnR1cmUgYmFzZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BVFRCQVNFLCBhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyKTsKKworCS8qIGFncGN0cmwgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgwMDAwKTsKKworCS8qIG1jZ2NmZyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg2MF9NQ0hDRkcsICZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg2MF9NQ0hDRkcsIHRlbXAyIHwgKDEgPDwgOSkpOworCS8qIGNsZWFyIGFueSBwb3NzaWJsZSBBR1AtcmVsYXRlZCBlcnJvciBjb25kaXRpb25zICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg2MF9FUlJTVFMsIDB4ZjcwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfODMwbXBfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYXR0YmFzZSAtIGFwZXJ0dXJlIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcik7CisKKwkvKiBhZ3BjdHJsICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsIDB4MDAwMCk7CisKKwkvKiBnbWNoICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsICZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgQUdQLXJlbGF0ZWQgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4MzBfRVJSU1RTLCAweDFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF83NTA1X2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXUxNiB0ZW1wMjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogbWNoY2ZnICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNzUwNV9NQ0hDRkcsICZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTc1MDVfTUNIQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKworCXJldHVybiAwOworfQorCisvKiBTZXR1cCBmdW5jdGlvbiAqLworc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfZ2VuZXJpY19tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSAweDAwMDAwMDE3LCAudHlwZSA9IDB9Cit9OworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggaW50ZWxfODE1X3NpemVzWzJdID0KK3sKKwl7NjQsIDE2Mzg0LCA0LCAwfSwKKwl7MzIsIDgxOTIsIDMsIDh9LAorfTsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb184IGludGVsXzh4eF9zaXplc1s3XSA9Cit7CisJezI1NiwgNjU1MzYsIDYsIDB9LAorCXsxMjgsIDMyNzY4LCA1LCAzMn0sCisJezY0LCAxNjM4NCwgNCwgNDh9LAorCXszMiwgODE5MiwgMywgNTZ9LAorCXsxNiwgNDA5NiwgMiwgNjB9LAorCXs4LCAyMDQ4LCAxLCA2Mn0sCisJezQsIDEwMjQsIDAsIDYzfQorfTsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiBpbnRlbF9nZW5lcmljX3NpemVzWzddID0KK3sKKwl7MjU2LCA2NTUzNiwgNiwgMH0sCisJezEyOCwgMzI3NjgsIDUsIDMyfSwKKwl7NjQsIDE2Mzg0LCA0LCA0OH0sCisJezMyLCA4MTkyLCAzLCA1Nn0sCisJezE2LCA0MDk2LCAyLCA2MH0sCisJezgsIDIwNDgsIDEsIDYyfSwKKwl7NCwgMTAyNCwgMCwgNjN9Cit9OworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggaW50ZWxfODMwbXBfc2l6ZXNbNF0gPQoreworCXsyNTYsIDY1NTM2LCA2LCAwfSwKKwl7MTI4LCAzMjc2OCwgNSwgMzJ9LAorCXs2NCwgMTYzODQsIDQsIDQ4fSwKKwl7MzIsIDgxOTIsIDMsIDU2fQorfTsKKworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9nZW5lcmljX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9nZW5lcmljX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVTE2X0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IGludGVsX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBpbnRlbF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBpbnRlbF90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzgxMF9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gaW50ZWxfaTgxMF9zaXplcywKKwkuc2l6ZV90eXBlCQk9IEZJWEVEX0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gMiwKKwkubmVlZHNfc2NyYXRjaF9wYWdlCT0gVFJVRSwKKwkuY29uZmlndXJlCQk9IGludGVsX2k4MTBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsX2k4MTBfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBpbnRlbF9pODEwX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBpbnRlbF9pODEwX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBpbnRlbF9pODEwX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gaW50ZWxfaTgxMF9tYXNrcywKKwkuYWdwX2VuYWJsZQkJPSBpbnRlbF9pODEwX2FncF9lbmFibGUsCisJLmNhY2hlX2ZsdXNoCQk9IGdsb2JhbF9jYWNoZV9mbHVzaCwKKwkuY3JlYXRlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k4MTBfaW5zZXJ0X2VudHJpZXMsCisJLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcywKKwkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODE1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84MTVfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDIsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84MTVfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzgxNV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODMwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9pODMwX3NpemVzLAorCS5zaXplX3R5cGUJCT0gRklYRURfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSAzLAorCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSBUUlVFLAorCS5jb25maWd1cmUJCT0gaW50ZWxfaTgzMF9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaW50ZWxfaTgzMF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2k4MzBfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGludGVsX2k4MTBfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGludGVsX2k4MTBfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9pODEwX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGludGVsX2k4MTBfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGludGVsX2k4MzBfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGludGVsX2k4MzBfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k4MzBfaW5zZXJ0X2VudHJpZXMsCisJLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTgzMF9yZW1vdmVfZW50cmllcywKKwkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODMwX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODIwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84MjBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzgyMF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfODIwX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODMwbXBfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGludGVsXzgzMG1wX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVThfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA0LAorCS5jb25maWd1cmUJCT0gaW50ZWxfODMwbXBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODQwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NDBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODQ1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NDVfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODUwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NTBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODYwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NjBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfOTE1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9pODMwX3NpemVzLAorCS5zaXplX3R5cGUJCT0gRklYRURfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSAzLAorCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSBUUlVFLAorCS5jb25maWd1cmUJCT0gaW50ZWxfaTkxNV9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaW50ZWxfaTkxNV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2k5MTVfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGludGVsX2k4MTBfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGludGVsX2k4MTBfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9pODEwX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGludGVsX2k4MTBfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGludGVsX2k5MTVfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGludGVsX2k4MzBfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k5MTVfaW5zZXJ0X2VudHJpZXMsCisJLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTkxNV9yZW1vdmVfZW50cmllcywKKwkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODMwX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKKworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF83NTA1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF83NTA1X2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBpbnRlbF84eHhfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBpbnRlbF84eHhfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGludGVsXzh4eF90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgaW50IGZpbmRfaTgxMCh1MTYgZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICppODEwX2RldjsKKworCWk4MTBfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2aWNlLCBOVUxMKTsKKwlpZiAoIWk4MTBfZGV2KQorCQlyZXR1cm4gMDsKKwlpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYgPSBpODEwX2RldjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaW5kX2k4MzAodTE2IGRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaTgzMF9kZXY7CisKKwlpODMwX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIGRldmljZSwgTlVMTCk7CisJaWYgKGk4MzBfZGV2ICYmIFBDSV9GVU5DKGk4MzBfZGV2LT5kZXZmbikgIT0gMCkgeworCQlpODMwX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJZGV2aWNlLCBpODMwX2Rldik7CisJfQorCisJaWYgKCFpODMwX2RldikKKwkJcmV0dXJuIDA7CisKKwlpbnRlbF9pODMwX3ByaXZhdGUuaTgzMF9kZXYgPSBpODMwX2RldjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX2ludGVsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJY2hhciAqbmFtZSA9ICIodW5rbm93bikiOworCXU4IGNhcF9wdHIgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0xYXzA6CisJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsX2dlbmVyaWNfZHJpdmVyOworCQluYW1lID0gIjQ0MExYIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMDoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfZ2VuZXJpY19kcml2ZXI7CisJCW5hbWUgPSAiNDQwQlgiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNHWF8wOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF9nZW5lcmljX2RyaXZlcjsKKwkJbmFtZSA9ICI0NDBHWCI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9NQzE6CisJCW5hbWUgPSAiaTgxMCI7CisJCWlmICghZmluZF9pODEwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfSUcxKSkKKwkJCWdvdG8gZmFpbDsKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODEwX2RyaXZlcjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX01DMzoKKwkJbmFtZSA9ICJpODEwIERDMTAwIjsKKwkJaWYgKCFmaW5kX2k4MTAoUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzMpKQorCQkJZ290byBmYWlsOworCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MTBfZHJpdmVyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBFX01DOgorCQluYW1lID0gImk4MTAgRSI7CisJCWlmICghZmluZF9pODEwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBFX0lHKSkKKwkJCWdvdG8gZmFpbDsKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODEwX2RyaXZlcjsKKwkJYnJlYWs7CisJIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxNV9NQzoKKwkJLyoKKwkJICogVGhlIGk4MTUgY2FuIG9wZXJhdGUgZWl0aGVyIGFzIGFuIGk4MTAgc3R5bGUKKwkJICogaW50ZWdyYXRlZCBkZXZpY2UsIG9yIGFzIGFuIEFHUDRYIG1vdGhlcmJvYXJkLgorCQkgKi8KKwkJaWYgKGZpbmRfaTgxMChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODE1X0NHQykpCisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MTBfZHJpdmVyOworCQllbHNlCisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MTVfZHJpdmVyOworCQluYW1lID0gImk4MTUiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MjBfSEI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODIwX1VQX0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MjBfZHJpdmVyOworCQluYW1lID0gImk4MjAiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEI6CisJCWlmIChmaW5kX2k4MzAoUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9DR0MpKSB7CisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MzBfZHJpdmVyOworCQl9IGVsc2UgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODMwbXBfZHJpdmVyOworCQl9CisJCW5hbWUgPSAiODMwTSI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0MF9IQjoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODQwX2RyaXZlcjsKKwkJbmFtZSA9ICJpODQwIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1X0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQluYW1lID0gImk4NDUiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0hCOgorCQlpZiAoZmluZF9pODMwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0lHKSkgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODMwX2RyaXZlcjsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzg0NV9kcml2ZXI7CisJCX0KKwkJbmFtZSA9ICI4NDVHIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODUwX0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NTBfZHJpdmVyOworCQluYW1lID0gImk4NTAiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQjoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODQ1X2RyaXZlcjsKKwkJbmFtZSA9ICI4NTVQTSI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg1NUdNX0hCOgorCQlpZiAoZmluZF9pODMwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVHTV9JRykpIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzgzMF9kcml2ZXI7CisJCQluYW1lID0gIjg1NSI7CisJCX0gZWxzZSB7CisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQkJbmFtZSA9ICI4NTVHTSI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODYwX0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NjBfZHJpdmVyOworCQluYW1lID0gImk4NjAiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NjVfSEI6CisJCWlmIChmaW5kX2k4MzAoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2NV9JRykpIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzgzMF9kcml2ZXI7CisJCX0gZWxzZSB7CisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQl9CisJCW5hbWUgPSAiODY1IjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODc1X0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQluYW1lID0gImk4NzUiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHX0hCOgorCQlpZiAoZmluZF9pODMwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHX0lHKSkgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfOTE1X2RyaXZlcjsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzg0NV9kcml2ZXI7CisJCX0KKwkJbmFtZSA9ICI5MTVHIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R01fSEI6CisJCWlmIChmaW5kX2k4MzAoUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0lHKSkgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfOTE1X2RyaXZlcjsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzg0NV9kcml2ZXI7CisJCX0KKwkJbmFtZSA9ICI5MTVHTSI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzA6CisJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzc1MDVfZHJpdmVyOworCQluYW1lID0gIkU3NTA1IjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzcyMDVfMDoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfNzUwNV9kcml2ZXI7CisJCW5hbWUgPSAiRTcyMDUiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY2FwX3B0cikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbnN1cHBvcnRlZCBJbnRlbCBjaGlwc2V0IChkZXZpY2UgaWQ6ICUwNHgpXG4iLAorCQkJICAgIHBkZXYtPmRldmljZSk7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX07CisKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MTBfZHJpdmVyKQorCQlicmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSAmaW50ZWxfaTgxMF9wcml2YXRlOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MzBfZHJpdmVyKQorCQlicmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSAmaW50ZWxfaTgzMF9wcml2YXRlOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIGFuIEludGVsICVzIENoaXBzZXQuXG4iLCBuYW1lKTsKKworCS8qCisJKiBUaGUgZm9sbG93aW5nIGZpeGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCSU9TIGhhcyAiZm9yZ290dGVuIiB0bworCSogcHJvdmlkZSBhbiBhZGRyZXNzIHJhbmdlIGZvciB0aGUgR0FSVC4KKwkqIDIwMDMwNjEwIC0gaGFtaXNoQHpvdC5vcmcKKwkqLworCXIgPSAmcGRldi0+cmVzb3VyY2VbMF07CisJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKKwkJaWYocGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGQgbm90IGFzc2lnbiByZXNvdXJjZSAwXG4iKTsKKwkJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qCisJKiBJZiB0aGUgZGV2aWNlIGhhcyBub3QgYmVlbiBwcm9wZXJseSBzZXR1cCwgdGhlIGZvbGxvd2luZyB3aWxsIGNhdGNoCisJKiB0aGUgcHJvYmxlbSBhbmQgc2hvdWxkIHN0b3AgdGhlIHN5c3RlbSBmcm9tIGNyYXNoaW5nLgorCSogMjAwMzA2MTAgLSBoYW1pc2hAem90Lm9yZworCSovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBFbmFibGUgUENJIGRldmljZVxuIik7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlpZiAoY2FwX3B0cikgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCQlicmlkZ2UtPmNhcG5keCtQQ0lfQUdQX1NUQVRVUywKKwkJCQkmYnJpZGdlLT5tb2RlKTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJpZGdlKTsKKwlyZXR1cm4gYWdwX2FkZF9icmlkZ2UoYnJpZGdlKTsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgUEZYICJEZXRlY3RlZCBhbiBJbnRlbCAlcyBjaGlwc2V0LCAiCisJCSJidXQgY291bGQgbm90IGZpbmQgdGhlIHNlY29uZGFyeSBkZXZpY2UuXG4iLCBuYW1lKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2ludGVsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCisJaWYgKGludGVsX2k4MTBfcHJpdmF0ZS5pODEwX2RldikKKwkJcGNpX2Rldl9wdXQoaW50ZWxfaTgxMF9wcml2YXRlLmk4MTBfZGV2KTsKKwlpZiAoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2KQorCQlwY2lfZGV2X3B1dChpbnRlbF9pODMwX3ByaXZhdGUuaTgzMF9kZXYpOworCisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIGludCBhZ3BfaW50ZWxfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF9nZW5lcmljX2RyaXZlcikKKwkJaW50ZWxfY29uZmlndXJlKCk7CisJZWxzZSBpZiAoYnJpZGdlLT5kcml2ZXIgPT0gJmludGVsXzg1MF9kcml2ZXIpCisJCWludGVsXzg1MF9jb25maWd1cmUoKTsKKwllbHNlIGlmIChicmlkZ2UtPmRyaXZlciA9PSAmaW50ZWxfODQ1X2RyaXZlcikKKwkJaW50ZWxfODQ1X2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MzBtcF9kcml2ZXIpCisJCWludGVsXzgzMG1wX2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF85MTVfZHJpdmVyKQorCQlpbnRlbF9pOTE1X2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MzBfZHJpdmVyKQorCQlpbnRlbF9pODMwX2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MTBfZHJpdmVyKQorCQlpbnRlbF9pODEwX2NvbmZpZ3VyZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfaW50ZWxfcGNpX3RhYmxlW10gPSB7CisjZGVmaW5lIElEKHgpCQkJCQkJXAorCXsJCQkJCQlcCisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCVwKKwkuY2xhc3NfbWFzawk9IH4wLAkJCQlcCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAkJXAorCS5kZXZpY2UJCT0geCwJCQkJXAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAkJCVwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwJCQlcCisJfQorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNMWF8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMCksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0dYXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfTUMxKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX01DMyksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMEVfTUMpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTVfTUMpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MjBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MjBfVVBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODUwX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU1UE1fSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVHTV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2MF9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2NV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg3NV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzApLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfNzIwNV8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R19IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0hCKSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfaW50ZWxfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9pbnRlbF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWludGVsIiwKKwkuaWRfdGFibGUJPSBhZ3BfaW50ZWxfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfaW50ZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZ3BfaW50ZWxfcmVtb3ZlKSwKKwkucmVzdW1lCQk9IGFncF9pbnRlbF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfaW50ZWxfaW5pdCh2b2lkKQoreworCWlmIChhZ3Bfb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWdwX2ludGVsX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX2ludGVsX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9pbnRlbF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWdwX2ludGVsX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX2ludGVsX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2lzb2NoLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2lzb2NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhYzczMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaXNvY2guYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIFNldHVwIHJvdXRpbmVzIGZvciBBR1AgMy41IGNvbXBsaWFudCBicmlkZ2VzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImFncC5oIgorCisvKiBHZW5lcmljIEFHUCAzLjUgZW5hYmxpbmcgcm91dGluZXMgKi8KKworc3RydWN0IGFncF8zXzVfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTggY2FwbmR4OworCXUzMiBtYXhidzsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworfTsKKworc3RhdGljIHZvaWQgYWdwXzNfNV9kZXZfbGlzdF9pbnNlcnQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGxpc3RfaGVhZCAqbmV3KQoreworCXN0cnVjdCBhZ3BfM181X2RldiAqY3VyLCAqbiA9IGxpc3RfZW50cnkobmV3LCBzdHJ1Y3QgYWdwXzNfNV9kZXYsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCWxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSB7CisJCWN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgYWdwXzNfNV9kZXYsIGxpc3QpOworCQlpZihjdXItPm1heGJ3ID4gbi0+bWF4YncpCisJCQlicmVhazsKKwl9CisJbGlzdF9hZGRfdGFpbChuZXcsIHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFncF8zXzVfZGV2X2xpc3Rfc29ydChzdHJ1Y3QgYWdwXzNfNV9kZXYgKmxpc3QsIHVuc2lnbmVkIGludCBuZGV2cykKK3sKKwlzdHJ1Y3QgYWdwXzNfNV9kZXYgKmN1cjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcCwgKmhlYWQgPSAmbGlzdC0+bGlzdCwgKnN0YXJ0ID0gaGVhZC0+bmV4dDsKKwl1MzIgbmlzdGF0OworCisJSU5JVF9MSVNUX0hFQUQoaGVhZCk7CisKKwlmb3IgKHBvcz1zdGFydDsgcG9zIT1oZWFkOyApIHsKKwkJY3VyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBhZ3BfM181X2RldiwgbGlzdCk7CisJCWRldiA9IGN1ci0+ZGV2OworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGN1ci0+Y2FwbmR4K0FHUE5JU1RBVCwgJm5pc3RhdCk7CisJCWN1ci0+bWF4YncgPSAobmlzdGF0ID4+IDE2KSAmIDB4ZmY7CisKKwkJdG1wID0gcG9zOworCQlwb3MgPSBwb3MtPm5leHQ7CisJCWFncF8zXzVfZGV2X2xpc3RfaW5zZXJ0KGhlYWQsIHRtcCk7CisJfQorfQorCisvKiAKKyAqIEluaXRpYWxpemUgYWxsIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHBhcmFtZXRlcnMgZm9yIGFuIEFHUCAzLjAgCisgKiBub2RlIChpLmUuIGEgaG9zdCBicmlkZ2UgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgYWRhcHRlcnMgCisgKiBseWluZyBiZWhpbmQgaXQuLi4pCisgKi8KKworc3RhdGljIGludCBhZ3BfM181X2lzb2Nocm9ub3VzX25vZGVfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJc3RydWN0IGFncF8zXzVfZGV2ICpkZXZfbGlzdCwgdW5zaWduZWQgaW50IG5kZXZzKQoreworCS8qCisJICogQ29udmVuaWVuY2Ugc3RydWN0dXJlIHRvIG1ha2UgdGhlIGNhbGN1bGF0aW9ucyBjbGVhcmVyCisJICogaGVyZS4gIFRoZSBmaWVsZCBuYW1lcyBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIEFHUCAzLjAgc3BlYy4KKwkgKi8KKwlzdHJ1Y3QgaXNvY2hfZGF0YSB7CisJCXUzMiBtYXhidzsKKwkJdTMyIG47CisJCXUzMiB5OworCQl1MzIgbDsKKwkJdTMyIHJxOworCQlzdHJ1Y3QgYWdwXzNfNV9kZXYgKmRldjsKKwl9OworCisJc3RydWN0IHBjaV9kZXYgKnRkID0gYnJpZGdlLT5kZXYsICpkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZkZXZfbGlzdC0+bGlzdCwgKnBvczsKKwlzdHJ1Y3QgYWdwXzNfNV9kZXYgKmN1cjsKKwlzdHJ1Y3QgaXNvY2hfZGF0YSAqbWFzdGVyLCB0YXJnZXQ7CisJdW5zaWduZWQgaW50IGNkZXYgPSAwOworCXUzMiBtbmlzdGF0LCB0bmlzdGF0LCB0c3RhdHVzLCBtY21kOworCXUxNiB0bmljbWQsIG1uaWNtZDsKKwl1OCBtY2FwbmR4OworCXUzMiB0b3RfYncgPSAwLCB0b3RfbiA9IDAsIHRvdF9ycSA9IDAsIHlfbWF4LCBycV9pc29jaCwgcnFfYXN5bmM7CisJdTMyIHN0ZXAsIHJlbSwgcmVtX2lzb2NoLCByZW1fYXN5bmM7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIFdlJ2xsIHdvcmsgd2l0aCBhbiBhcnJheSBvZiBpc29jaF9kYXRhJ3MgKG9uZSBmb3IgZWFjaAorCSAqIGRldmljZSBpbiBkZXZfbGlzdCkgdGhyb3VnaG91dCB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWlmICgobWFzdGVyID0ga21hbGxvYyhuZGV2cyAqIHNpemVvZigqbWFzdGVyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBnZXRfb3V0OworCX0KKworCS8qCisJICogU29ydCB0aGUgZGV2aWNlIGxpc3QgYnkgbWF4YncuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUKKwkgKiBzcGVjIHN1Z2dlc3RzIHRoYXQgdGhlIGRldmljZXMgd2l0aCB0aGUgc21hbGxlc3QgcmVxdWlyZW1lbnRzCisJICogaGF2ZSB0aGVpciByZXNvdXJjZXMgYWxsb2NhdGVkIGZpcnN0LCB3aXRoIGFsbCByZW1haW5pbmcgcmVzb3VyY2VzCisJICogZmFsbGluZyB0byB0aGUgZGV2aWNlIHdpdGggdGhlIGxhcmdlc3QgcmVxdWlyZW1lbnQuCisJICoKKwkgKiBXZSBkb24ndCBleGFjdGx5IGRvIHRoaXMsIHdlIGRpdmlkZSB0YXJnZXQgcmVzb3VyY2VzIGJ5IG5kZXZzCisJICogYW5kIHNwbGl0IHRoZW0gYW1vbmdzdCB0aGUgQUdQIDMuMCBkZXZpY2VzLiAgVGhlIHJlbWFpbmRlciBvZiBzdWNoCisJICogZGl2aXNpb24gb3BlcmF0aW9ucyBhcmUgZHJvcHBlZCBvbiB0aGUgbGFzdCBkZXZpY2UsIHNvcnQgb2YgbGlrZQorCSAqIHRoZSBzcGVjIG1lbnRpb25zIGl0IHNob3VsZCBiZSBkb25lLgorCSAqCisJICogV2UgY2FuJ3QgZG8gdGhpcyBzb3J0IHdoZW4gd2UgaW5pdGlhbGx5IGNvbnN0cnVjdCB0aGUgZGV2X2xpc3QKKwkgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgdW50aWwgdGhpcyBmdW5jdGlvbiB3aGV0aGVyIGlzb2Nocm9ub3VzCisJICogdHJhbnNmZXJzIGFyZSBlbmFibGVkIGFuZCBjb25zZXF1ZW50bHkgd2hldGhlciBtYXhidyB3aWxsIG1lYW4KKwkgKiBhbnl0aGluZy4KKwkgKi8KKwlhZ3BfM181X2Rldl9saXN0X3NvcnQoZGV2X2xpc3QsIG5kZXZzKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0ZCwgYnJpZGdlLT5jYXBuZHgrQUdQTklTVEFULCAmdG5pc3RhdCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRkLCBicmlkZ2UtPmNhcG5keCtBR1BTVEFULCAmdHN0YXR1cyk7CisKKwkvKiBFeHRyYWN0IHBvd2VyLW9uIGRlZmF1bHRzIGZyb20gdGhlIHRhcmdldCAqLworCXRhcmdldC5tYXhidyA9ICh0bmlzdGF0ID4+IDE2KSAmIDB4ZmY7CisJdGFyZ2V0Lm4gICAgID0gKHRuaXN0YXQgPj4gOCkgICYgMHhmZjsKKwl0YXJnZXQueSAgICAgPSAodG5pc3RhdCA+PiA2KSAgJiAweDM7CisJdGFyZ2V0LmwgICAgID0gKHRuaXN0YXQgPj4gMykgICYgMHg3OworCXRhcmdldC5ycSAgICA9ICh0c3RhdHVzID4+IDI0KSAmIDB4ZmY7CisKKwl5X21heCA9IHRhcmdldC55OworCisJLyoKKwkgKiBFeHRyYWN0IHBvd2VyLW9uIGRlZmF1bHRzIGZvciBlYWNoIGRldmljZSBpbiBkZXZfbGlzdC4gIEFsb25nCisJICogdGhlIHdheSwgY2FsY3VsYXRlIHRoZSB0b3RhbCBpc29jaHJvbm91cyBiYW5kd2lkdGggcmVxdWlyZWQKKwkgKiBieSB0aGVzZSBkZXZpY2VzIGFuZCB0aGUgbGFyZ2VzdCByZXF1ZXN0ZWQgcGF5bG9hZCBzaXplLgorCSAqLworCWxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSB7CisJCWN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgYWdwXzNfNV9kZXYsIGxpc3QpOworCQlkZXYgPSBjdXItPmRldjsKKworCQltY2FwbmR4ID0gY3VyLT5jYXBuZHg7CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQTklTVEFULCAmbW5pc3RhdCk7CisKKwkJbWFzdGVyW2NkZXZdLm1heGJ3ID0gKG1uaXN0YXQgPj4gMTYpICYgMHhmZjsKKwkJbWFzdGVyW2NkZXZdLm4gICAgID0gKG1uaXN0YXQgPj4gOCkgICYgMHhmZjsKKwkJbWFzdGVyW2NkZXZdLnkgICAgID0gKG1uaXN0YXQgPj4gNikgICYgMHgzOworCQltYXN0ZXJbY2Rldl0uZGV2ICAgPSBjdXI7CisKKwkJdG90X2J3ICs9IG1hc3RlcltjZGV2XS5tYXhidzsKKwkJeV9tYXggPSBtYXgoeV9tYXgsIG1hc3RlcltjZGV2XS55KTsKKworCQljZGV2Kys7CisJfQorCisJLyogQ2hlY2sgaWYgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBhbnkgY2hhbmNlIG9mIHdvcmtpbmcgKi8KKwlpZiAodG90X2J3ID4gdGFyZ2V0Lm1heGJ3KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlzb2Nocm9ub3VzIGJhbmR3aWR0aCByZXF1aXJlZCAiCisJCQkiYnkgQUdQIDMuMCBkZXZpY2VzIGV4Y2VlZHMgdGhhdCB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgIgorCQkJInRoZSBBR1AgMy4wIGJyaWRnZSFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisJfQorCisJdGFyZ2V0LnkgPSB5X21heDsKKworCS8qCisJICogV3JpdGUgdGhlIGNhbGN1bGF0ZWQgcGF5bG9hZCBzaXplIGludG8gdGhlIHRhcmdldCdzIE5JQ01ECisJICogcmVnaXN0ZXIuICBEb2luZyB0aGlzIGRpcmVjdGx5IGVmZmVjdHMgdGhlIElTT0NIX04gdmFsdWUKKwkgKiBpbiB0aGUgdGFyZ2V0J3MgTklTVEFUIHJlZ2lzdGVyLCBzbyB3ZSBuZWVkIHRvIGRvIHRoaXMgbm93CisJICogdG8gZ2V0IGFuIGFjY3VyYXRlIHZhbHVlIGZvciBJU09DSF9OIGxhdGVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRkLCBicmlkZ2UtPmNhcG5keCtBR1BOSUNNRCwgJnRuaWNtZCk7CisJdG5pY21kICY9IH4oMHgzIDw8IDYpOworCXRuaWNtZCB8PSB0YXJnZXQueSA8PCA2OworCXBjaV93cml0ZV9jb25maWdfd29yZCh0ZCwgYnJpZGdlLT5jYXBuZHgrQUdQTklDTUQsIHRuaWNtZCk7CisKKwkvKiBSZXJlYWQgdGhlIHRhcmdldCdzIElTT0NIX04gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGQsIGJyaWRnZS0+Y2FwbmR4K0FHUE5JU1RBVCwgJnRuaXN0YXQpOworCXRhcmdldC5uID0gKHRuaXN0YXQgPj4gOCkgJiAweGZmOworCisJLyogQ2FsY3VsYXRlIHRoZSBtaW5pbXVtIElTT0NIX04gbmVlZGVkIGJ5IGVhY2ggbWFzdGVyICovCisJZm9yIChjZGV2PTA7IGNkZXY8bmRldnM7IGNkZXYrKykgeworCQltYXN0ZXJbY2Rldl0ueSA9IHRhcmdldC55OworCQltYXN0ZXJbY2Rldl0ubiA9IG1hc3RlcltjZGV2XS5tYXhidyAvIChtYXN0ZXJbY2Rldl0ueSArIDEpOworCisJCXRvdF9uICs9IG1hc3RlcltjZGV2XS5uOworCX0KKworCS8qIEV4aXQgaWYgdGhlIG1pbmltYWwgSVNPQ0hfTiBhbGxvY2F0aW9uIGFtb25nIHRoZSBtYXN0ZXJzIGlzIG1vcmUKKwkgKiB0aGFuIHRoZSB0YXJnZXQgY2FuIGhhbmRsZS4gKi8KKwlpZiAodG90X24gPiB0YXJnZXQubikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJudW1iZXIgb2YgaXNvY2hyb25vdXMgIgorCQkJInRyYW5zYWN0aW9ucyBwZXIgcGVyaW9kIHJlcXVpcmVkIGJ5IEFHUCAzLjAgZGV2aWNlcyAiCisJCQkiZXhjZWVkcyB0aGF0IHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGUgQUdQIDMuMCAiCisJCQkiYnJpZGdlIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbGVmdCBvdmVyIElTT0NIX04gY2FwYWJpbGl0eSBpbiB0aGUgdGFyZ2V0LiAgV2UnbGwgZ2l2ZQorCSAqIHRoaXMgdG8gdGhlIGh1bmdyaWVzdCBkZXZpY2UgKGFzIHBlciB0aGUgc3BlYykgKi8KKwlyZW0gID0gdGFyZ2V0Lm4gLSB0b3RfbjsKKworCS8qIAorCSAqIENhbGN1bGF0ZSB0aGUgbWluaW11bSBpc29jaHJvbm91cyBSUSBkZXB0aCBuZWVkZWQgYnkgZWFjaCBtYXN0ZXIuCisJICogQWxvbmcgdGhlIHdheSwgZGlzdHJpYnV0ZSB0aGUgZXh0cmEgSVNPQ0hfTiBjYXBhYmlsaXR5IGNhbGN1bGF0ZWQKKwkgKiBhYm92ZS4KKwkgKi8KKwlmb3IgKGNkZXY9MDsgY2RldjxuZGV2czsgY2RldisrKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBsaXR0bGUgc3VidGxlLiAgSWYgSVNPQ0hfWSA+IDY0QiwgdGhlbiBJU09DSF9ZCisJCSAqIGJ5dGUgaXNvY2hyb25vdXMgd3JpdGVzIHdpbGwgYmUgYnJva2VuIGludG8gNjRCIHBpZWNlcy4KKwkJICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGJ1ZGdldCBtb3JlIFJRIGRlcHRoIHRvIGFjY291bnQgZm9yCisJCSAqIHRoZXNlIGtpbmQgb2Ygd3JpdGVzIChlYWNoIGlzb2Nocm9ub3VzIHdyaXRlIGlzIGFjdHVhbGx5CisJCSAqIG1hbnkgd3JpdGVzIG9uIHRoZSBBR1AgYnVzKS4KKwkJICovCisJCW1hc3RlcltjZGV2XS5ycSA9IG1hc3RlcltjZGV2XS5uOworCQlpZihtYXN0ZXJbY2Rldl0ueSA+IDB4MSkKKwkJCW1hc3RlcltjZGV2XS5ycSAqPSAoMSA8PCAobWFzdGVyW2NkZXZdLnkgLSAxKSk7CisKKwkJdG90X3JxICs9IG1hc3RlcltjZGV2XS5ycTsKKworCQlpZiAoY2RldiA9PSBuZGV2cy0xKQorCQkJbWFzdGVyW2NkZXZdLm4gKz0gcmVtOworCX0KKworCS8qIEZpZ3VyZSB0aGUgbnVtYmVyIG9mIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgUlEgc2xvdHMgdGhlCisJICogdGFyZ2V0IGlzIHByb3ZpZGluZy4gKi8KKwlycV9pc29jaCA9ICh0YXJnZXQueSA+IDB4MSkgPyB0YXJnZXQubiAqICgxIDw8ICh0YXJnZXQueSAtIDEpKSA6IHRhcmdldC5uOworCXJxX2FzeW5jID0gdGFyZ2V0LnJxIC0gcnFfaXNvY2g7CisKKwkvKiBFeGl0IGlmIHRoZSBtaW5pbWFsIFJRIG5lZWRzIG9mIHRoZSBtYXN0ZXJzIGV4Y2VlZHMgd2hhdCB0aGUgdGFyZ2V0CisJICogY2FuIHByb3ZpZGUuICovCisJaWYgKHRvdF9ycSA+IHJxX2lzb2NoKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm51bWJlciBvZiByZXF1ZXN0IHF1ZXVlIHNsb3RzICIKKwkJCSJyZXF1aXJlZCBieSB0aGUgaXNvY2hyb25vdXMgYmFuZHdpZHRoIHJlcXVlc3RlZCBieSAiCisJCQkiQUdQIDMuMCBkZXZpY2VzIGV4Y2VlZHMgdGhlIG51bWJlciBwcm92aWRlZCBieSB0aGUgIgorCQkJIkFHUCAzLjAgYnJpZGdlIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgYXN5bmNocm9ub3VzIFJRIGNhcGFiaWxpdHkgaW4gdGhlIHRhcmdldCAocGVyIG1hc3RlcikgYXMKKwkgKiB3ZWxsIGFzIHRoZSB0b3RhbCBudW1iZXIgb2YgbGVmdG92ZXIgaXNvY2hyb25vdXMgUlEgc2xvdHMuICovCisJc3RlcCAgICAgID0gcnFfYXN5bmMgLyBuZGV2czsKKwlyZW1fYXN5bmMgPSBzdGVwICsgKHJxX2FzeW5jICUgbmRldnMpOworCXJlbV9pc29jaCA9IHJxX2lzb2NoIC0gdG90X3JxOworCisJLyogRGlzdHJpYnV0ZSB0aGUgZXh0cmEgUlEgc2xvdHMgY2FsY3VsYXRlZCBhYm92ZSBhbmQgd3JpdGUgb3VyCisJICogaXNvY2hyb25vdXMgc2V0dGluZ3Mgb3V0IHRvIHRoZSBhY3R1YWwgZGV2aWNlcy4gKi8KKwlmb3IgKGNkZXY9MDsgY2RldjxuZGV2czsgY2RldisrKSB7CisJCWN1ciA9IG1hc3RlcltjZGV2XS5kZXY7CisJCWRldiA9IGN1ci0+ZGV2OworCisJCW1jYXBuZHggPSBjdXItPmNhcG5keDsKKworCQltYXN0ZXJbY2Rldl0ucnEgKz0gKGNkZXYgPT0gbmRldnMgLSAxKQorCQkgICAgICAgICAgICAgID8gKHJlbV9hc3luYyArIHJlbV9pc29jaCkgOiBzdGVwOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQTklDTUQsICZtbmljbWQpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBjdXItPmNhcG5keCtBR1BDTUQsICZtY21kKTsKKworCQltbmljbWQgJj0gfigweGZmIDw8IDgpOworCQltbmljbWQgJj0gfigweDMgIDw8IDYpOworCQltY21kICAgJj0gfigweGZmIDw8IDI0KTsKKworCQltbmljbWQgfD0gbWFzdGVyW2NkZXZdLm4gIDw8IDg7CisJCW1uaWNtZCB8PSBtYXN0ZXJbY2Rldl0ueSAgPDwgNjsKKwkJbWNtZCAgIHw9IG1hc3RlcltjZGV2XS5ycSA8PCAyNDsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQQ01ELCBtY21kKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQTklDTUQsIG1uaWNtZCk7CisJfQorCitmcmVlX2FuZF9leGl0OgorCWtmcmVlKG1hc3Rlcik7CisKK2dldF9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYmFzaWNhbGx5IGFsbG9jYXRlcyByZXF1ZXN0IHF1ZXVlIHNsb3RzIGFtb25nIHRoZQorICogQUdQIDMuMCBzeXN0ZW1zIGluIG5vbmlzb2Nocm9ub3VzIG5vZGVzLiAgVGhlIGFsZ29yaXRobSBpcworICogcHJldHR5IHN0dXBpZCwgZGl2aWRlIHRoZSB0b3RhbCBudW1iZXIgb2YgUlEgc2xvdHMgcHJvdmlkZWQgYnkgdGhlCisgKiB0YXJnZXQgYnkgbmRldnMuICBEaXN0cmlidXRlIHRoaXMgbWFueSBzbG90cyB0byBlYWNoIEFHUCAzLjAgZGV2aWNlLAorICogZ2l2aW5nIGFueSBsZWZ0IG92ZXIgc2xvdHMgdG8gdGhlIGxhc3QgZGV2aWNlIGluIGRldl9saXN0LgorICovCitzdGF0aWMgdm9pZCBhZ3BfM181X25vbmlzb2Nocm9ub3VzX25vZGVfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJc3RydWN0IGFncF8zXzVfZGV2ICpkZXZfbGlzdCwgdW5zaWduZWQgaW50IG5kZXZzKQoreworCXN0cnVjdCBhZ3BfM181X2RldiAqY3VyOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZGV2X2xpc3QtPmxpc3QsICpwb3M7CisJdTMyIHRzdGF0dXMsIG1jbWQ7CisJdTMyIHRycSwgbXJxLCByZW07CisJdW5zaWduZWQgaW50IGNkZXYgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LCBicmlkZ2UtPmNhcG5keCtBR1BTVEFULCAmdHN0YXR1cyk7CisKKwl0cnEgPSAodHN0YXR1cyA+PiAyNCkgJiAweGZmOworCW1ycSA9IHRycSAvIG5kZXZzOworCisJcmVtID0gbXJxICsgKHRycSAlIG5kZXZzKTsKKworCWZvciAocG9zPWhlYWQtPm5leHQ7IGNkZXY8bmRldnM7IGNkZXYrKywgcG9zPXBvcy0+bmV4dCkgeworCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGFncF8zXzVfZGV2LCBsaXN0KTsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY3VyLT5kZXYsIGN1ci0+Y2FwbmR4K0FHUENNRCwgJm1jbWQpOworCQltY21kICY9IH4oMHhmZiA8PCAyNCk7CisJCW1jbWQgfD0gKChjZGV2ID09IG5kZXZzIC0gMSkgPyByZW0gOiBtcnEpIDw8IDI0OworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGN1ci0+ZGV2LCBjdXItPmNhcG5keCtBR1BDTUQsIG1jbWQpOworCX0KK30KKworLyoKKyAqIEZ1bGx5IGNvbmZpZ3VyZSBhbmQgZW5hYmxlIGFuIEFHUCAzLjAgaG9zdCBicmlkZ2UgYW5kIGFsbCB0aGUgZGV2aWNlcworICogbHlpbmcgYmVoaW5kIGl0LgorICovCitpbnQgYWdwXzNfNV9lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBwY2lfZGV2ICp0ZCA9IGJyaWRnZS0+ZGV2LCAqZGV2ID0gTlVMTDsKKwl1OCBtY2FwbmR4OworCXUzMiBpc29jaCwgYXJxc3o7CisJdTMyIHRzdGF0dXMsIG1zdGF0dXMsIG5jYXBpZDsKKwl1MzIgbW1ham9yOworCXUxNiBtcHN0YXQ7CisJc3RydWN0IGFncF8zXzVfZGV2ICpkZXZfbGlzdCwgKmN1cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqcG9zOworCXVuc2lnbmVkIGludCBuZGV2cyA9IDA7CisJaW50IHJldCA9IDA7CisKKwkvKiBFeHRyYWN0IHNvbWUgcG93ZXItb24gZGVmYXVsdHMgZnJvbSB0aGUgdGFyZ2V0ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRkLCBicmlkZ2UtPmNhcG5keCtBR1BTVEFULCAmdHN0YXR1cyk7CisJaXNvY2ggICAgID0gKHRzdGF0dXMgPj4gMTcpICYgMHgxOworCWlmIChpc29jaCA9PSAwKQkvKiBpc29jaCB4ZmVycyBub3QgYXZhaWxhYmxlLCBiYWlsIG91dC4gKi8KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhcnFzeiAgICAgPSAodHN0YXR1cyA+PiAxMykgJiAweDc7CisKKwkvKiAKKwkgKiBBbGxvY2F0ZSBhIGhlYWQgZm9yIG91ciBBR1AgMy41IGRldmljZSBsaXN0CisJICogKG11bHRpcGxlIEFHUCB2MyBkZXZpY2VzIGFyZSBhbGxvd2VkIGJlaGluZCBhIHNpbmdsZSBicmlkZ2UpLiAKKwkgKi8KKwlpZiAoKGRldl9saXN0ID0ga21hbGxvYyhzaXplb2YoKmRldl9saXN0KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBnZXRfb3V0OworCX0KKwloZWFkID0gJmRldl9saXN0LT5saXN0OworCUlOSVRfTElTVF9IRUFEKGhlYWQpOworCisJLyogRmluZCBhbGwgQUdQIGRldmljZXMsIGFuZCBhZGQgdGhlbSB0byBkZXZfbGlzdC4gKi8KKwlmb3JfZWFjaF9wY2lfZGV2KGRldikgeworCQltY2FwbmR4ID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKG1jYXBuZHggPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoKGRldi0+Y2xhc3MgPj44KSAmIDB4ZmYwMCkgeworCQkJY2FzZSAweDA2MDA6ICAgIC8qIEJyaWRnZSAqLworCQkJCS8qIFNraXAgYnJpZGdlcy4gV2Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBvbmUuICovCisJCQkJY29udGludWU7CisKKwkJCWNhc2UgMHgwMDAxOiAgICAvKiBVbmNsYXNzaWZpZWQgZGV2aWNlICovCisJCQkJLyogRG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMsIGJ1dCBsb2cgaXQgZm9yIGludmVzdGlnYXRpb24uICovCisJCQkJaWYgKG1jYXBuZHggIT0gMCkgeworCQkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIldhY2t5LCBmb3VuZCB1bmNsYXNzaWZpZWQgQUdQIGRldmljZS4gJXg6JXhcbiIsCisJCQkJCQlkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UpOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAweDAzMDA6ICAgIC8qIERpc3BsYXkgY29udHJvbGxlciAqLworCQkJY2FzZSAweDA0MDA6ICAgIC8qIE11bHRpbWVkaWEgY29udHJvbGxlciAqLworCQkJCWlmKChjdXIgPSBrbWFsbG9jKHNpemVvZigqY3VyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJZ290byBmcmVlX2FuZF9leGl0OworCQkJCX0KKwkJCQljdXItPmRldiA9IGRldjsKKworCQkJCXBvcyA9ICZjdXItPmxpc3Q7CisJCQkJbGlzdF9hZGQocG9zLCBoZWFkKTsKKwkJCQluZGV2cysrOworCQkJCWNvbnRpbnVlOworCisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyoKKwkgKiBUYWtlIGFuIGluaXRpYWwgcGFzcyB0aHJvdWdoIHRoZSBkZXZpY2VzIGx5aW5nIGJlaGluZCBvdXIgaG9zdAorCSAqIGJyaWRnZS4gIE1ha2Ugc3VyZSBlYWNoIG9uZSBpcyBhY3R1YWxseSBhbiBBR1AgMy4wIGRldmljZSwgb3RoZXJ3aXNlCisJICogZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBBbG9uZyB0aGUgd2F5IHN0b3JlIHRoZSBBR1AgMy4wCisJICogY2FwX3B0ciBmb3IgZWFjaCBkZXZpY2UKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgeworCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGFncF8zXzVfZGV2LCBsaXN0KTsKKwkJZGV2ID0gY3VyLT5kZXY7CisJCQorCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsICZtcHN0YXQpOworCQlpZiAoKG1wc3RhdCAmIFBDSV9TVEFUVVNfQ0FQX0xJU1QpID09IDApCisJCQljb250aW51ZTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DQVBBQklMSVRZX0xJU1QsICZtY2FwbmR4KTsKKwkJaWYgKG1jYXBuZHggIT0gMCkgeworCQkJZG8geworCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG1jYXBuZHgsICZuY2FwaWQpOworCQkJCWlmICgobmNhcGlkICYgMHhmZikgIT0gMikKKwkJCQkJbWNhcG5keCA9IChuY2FwaWQgPj4gOCkgJiAweGZmOworCQkJfQorCQkJd2hpbGUgKCgobmNhcGlkICYgMHhmZikgIT0gMikgJiYgKG1jYXBuZHggIT0gMCkpOworCQl9CisKKwkJaWYgKG1jYXBuZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAid29haCEgIE5vbi1BR1AgZGV2aWNlICIKKwkJCQkiZm91bmQgb24gdGhlIHNlY29uZGFyeSBidXMgb2YgYW4gQUdQIDMuNSBicmlkZ2UhXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisJCX0KKworCQltbWFqb3IgPSAobmNhcGlkID4+IEFHUF9NQUpPUl9WRVJTSU9OX1NISUZUKSAmIDB4ZjsKKwkJaWYgKG1tYWpvciA8IDMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIndvYWghICBBR1AgMi4wIGRldmljZSAiCisJCQkJImZvdW5kIG9uIHRoZSBzZWNvbmRhcnkgYnVzIG9mIGFuIEFHUCAzLjUgIgorCQkJCSJicmlkZ2Ugb3BlcmF0aW5nIHdpdGggQUdQIDMuMCBlbGVjdHJpY2FscyFcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwkJfQorCisJCWN1ci0+Y2FwbmR4ID0gbWNhcG5keDsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBjdXItPmNhcG5keCtBR1BTVEFULCAmbXN0YXR1cyk7CisKKwkJaWYgKCgobXN0YXR1cyA+PiAzKSAmIDB4MSkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAid29haCEgIEFHUCAzLnggZGV2aWNlICIKKwkJCQkibm90IG9wZXJhdGluZyBpbiBBR1AgMy54IG1vZGUgZm91bmQgb24gdGhlICIKKwkJCQkic2Vjb25kYXJ5IGJ1cyBvZiBhbiBBR1AgMy41IGJyaWRnZSBvcGVyYXRpbmcgIgorCQkJCSJ3aXRoIEFHUCAzLjAgZWxlY3RyaWNhbHMhXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisJCX0KKwl9CQkKKworCS8qCisJICogQ2FsbCBmdW5jdGlvbnMgdG8gZGl2aWRlIHRhcmdldCByZXNvdXJjZXMgYW1vbmdzdCB0aGUgQUdQIDMuMAorCSAqIG1hc3RlcnMuICBUaGlzIHByb2Nlc3MgaXMgZHJhbWF0aWNhbGx5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24KKwkgKiB3aGV0aGVyIGlzb2Nocm9ub3VzIHRyYW5zZmVycyBhcmUgc3VwcG9ydGVkLgorCSAqLworCWlmIChpc29jaCkgeworCQlyZXQgPSBhZ3BfM181X2lzb2Nocm9ub3VzX25vZGVfZW5hYmxlKGJyaWRnZSwgZGV2X2xpc3QsIG5kZXZzKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQgc2V0dGluZyAiCisJCQkgICAgICAgInVwIGlzb2Nocm9ub3VzIHhmZXJzLiAgRmFsbGluZyBiYWNrIHRvICIKKwkJCSAgICAgICAibm9uLWlzb2Nocm9ub3VzIHhmZXIgbW9kZS5cbiIpOworCQl9IGVsc2UgeworCQkJZ290byBmcmVlX2FuZF9leGl0OworCQl9CisJfQorCWFncF8zXzVfbm9uaXNvY2hyb25vdXNfbm9kZV9lbmFibGUoYnJpZGdlLCBkZXZfbGlzdCwgbmRldnMpOworCitmcmVlX2FuZF9leGl0OgorCS8qIEJlIHN1cmUgdG8gZnJlZSB0aGUgZGV2X2xpc3QgKi8KKwlmb3IgKHBvcz1oZWFkLT5uZXh0OyBwb3MhPWhlYWQ7ICkgeworCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGFncF8zXzVfZGV2LCBsaXN0KTsKKworCQlwb3MgPSBwb3MtPm5leHQ7CisJCWtmcmVlKGN1cik7CisJfQorCWtmcmVlKGRldl9saXN0KTsKKworZ2V0X291dDoKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2EzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYwpAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqIE52aWRpYSBBR1BHQVJUIHJvdXRpbmVzLgorICogQmFzZWQgdXBvbiBhIDIuNCBhZ3BnYXJ0IGRpZmYgYnkgdGhlIGZvbGtzIGZyb20gTlZJRElBLCBhbmQgaGFja2VkIHVwCisgKiB0byB3b3JrIGluIDIuNSBieSBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKy8qIE5WSURJQSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlZJRElBXzBfQVBTSVpFCQkweDgwCisjZGVmaW5lIE5WSURJQV8xX1dCQwkJMHhmMAorI2RlZmluZSBOVklESUFfMl9HQVJUQ1RSTAkweGQwCisjZGVmaW5lIE5WSURJQV8yX0FQQkFTRQkJMHhkOAorI2RlZmluZSBOVklESUFfMl9BUExJTUlUCTB4ZGMKKyNkZWZpbmUgTlZJRElBXzJfQVRUQkFTRShpKQkoMHhlMCArIChpKSAqIDQpCisjZGVmaW5lIE5WSURJQV8zX0FQQkFTRQkJMHg1MAorI2RlZmluZSBOVklESUFfM19BUExJTUlUCTB4NTQKKworCitzdGF0aWMgc3RydWN0IF9udmlkaWFfcHJpdmF0ZSB7CisJc3RydWN0IHBjaV9kZXYgKmRldl8xOworCXN0cnVjdCBwY2lfZGV2ICpkZXZfMjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2XzM7CisJdm9sYXRpbGUgdTMyIF9faW9tZW0gKmFwZXJ0dXJlOworCWludCBudW1fYWN0aXZlX2VudHJpZXM7CisJb2ZmX3QgcGdfb2Zmc2V0OworCXUzMiB3YmNfbWFzazsKK30gbnZpZGlhX3ByaXZhdGU7CisKKworc3RhdGljIGludCBudmlkaWFfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXU4IHNpemVfdmFsdWU7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnZhbHVlczsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLCAmc2l6ZV92YWx1ZSk7CisJc2l6ZV92YWx1ZSAmPSAweDBmOworCXZhbHVlcyA9IEFfU0laRV84KGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHNpemVfdmFsdWUgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNZU0NGRyAgICAgICAgICAweEMwMDEwMDEwCisjZGVmaW5lIElPUlJfQkFTRTAgICAgICAweEMwMDEwMDE2CisjZGVmaW5lIElPUlJfTUFTSzAgICAgICAweEMwMDEwMDE3CisjZGVmaW5lIEFNRF9LN19OVU1fSU9SUiAyCisKK3N0YXRpYyBpbnQgbnZpZGlhX2luaXRfaW9ycih1MzIgYmFzZSwgdTMyIHNpemUpCit7CisJdTMyIGJhc2VfaGksIGJhc2VfbG87CisJdTMyIG1hc2tfaGksIG1hc2tfbG87CisJdTMyIHN5c19oaSwgc3lzX2xvOworCXUzMiBpb3JyX2FkZHIsIGZyZWVfaW9ycl9hZGRyOworCisJLyogRmluZCB0aGUgaW9yciB0aGF0IGlzIGFscmVhZHkgdXNlZCBmb3IgdGhlIGJhc2UgKi8KKwkvKiBJZiBub3QgZm91bmQsIGRldGVybWluZSB0aGUgdXBwZXJtb3N0IGF2YWlsYWJsZSBpb3JyICovCisJZnJlZV9pb3JyX2FkZHIgPSBBTURfSzdfTlVNX0lPUlI7CisJZm9yKGlvcnJfYWRkciA9IDA7IGlvcnJfYWRkciA8IEFNRF9LN19OVU1fSU9SUjsgaW9ycl9hZGRyKyspIHsKKwkJcmRtc3IoSU9SUl9CQVNFMCArIDIgKiBpb3JyX2FkZHIsIGJhc2VfbG8sIGJhc2VfaGkpOworCQlyZG1zcihJT1JSX01BU0swICsgMiAqIGlvcnJfYWRkciwgbWFza19sbywgbWFza19oaSk7CisKKwkJaWYgKChiYXNlX2xvICYgMHhmZmZmZjAwMCkgPT0gKGJhc2UgJiAweGZmZmZmMDAwKSkKKwkJCWJyZWFrOworCisJCWlmICgobWFza19sbyAmIDB4MDAwMDA4MDApID09IDApCisJCQlmcmVlX2lvcnJfYWRkciA9IGlvcnJfYWRkcjsKKwl9CisJCisJaWYgKGlvcnJfYWRkciA+PSBBTURfSzdfTlVNX0lPUlIpIHsKKwkJaW9ycl9hZGRyID0gZnJlZV9pb3JyX2FkZHI7CisJCWlmIChpb3JyX2FkZHIgPj0gQU1EX0s3X05VTV9JT1JSKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorICAgIGJhc2VfaGkgPSAweDA7CisgICAgYmFzZV9sbyA9IChiYXNlICYgfjB4ZmZmKSB8IDB4MTg7CisgICAgbWFza19oaSA9IDB4ZjsKKyAgICBtYXNrX2xvID0gKCh+KHNpemUgLSAxKSkgJiAweGZmZmZmMDAwKSB8IDB4ODAwOworICAgIHdybXNyKElPUlJfQkFTRTAgKyAyICogaW9ycl9hZGRyLCBiYXNlX2xvLCBiYXNlX2hpKTsKKyAgICB3cm1zcihJT1JSX01BU0swICsgMiAqIGlvcnJfYWRkciwgbWFza19sbywgbWFza19oaSk7CisKKyAgICByZG1zcihTWVNDRkcsIHN5c19sbywgc3lzX2hpKTsKKyAgICBzeXNfbG8gfD0gMHgwMDEwMDAwMDsKKyAgICB3cm1zcihTWVNDRkcsIHN5c19sbywgc3lzX2hpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52aWRpYV9jb25maWd1cmUodm9pZCkKK3sKKwlpbnQgaSwgcmMsIG51bV9kaXJzOworCXUzMiBhcGJhc2UsIGFwbGltaXQ7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKmN1cnJlbnRfc2l6ZTsKKwl1MzIgdGVtcDsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhcGVydHVyZSBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLAorCQljdXJyZW50X3NpemUtPnNpemVfdmFsdWUpOworCisgICAgLyogYWRkcmVzcyB0byBtYXAgdG8gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmYXBiYXNlKTsKKwlhcGJhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gYXBiYXNlOworCWFwbGltaXQgPSBhcGJhc2UgKyAoY3VycmVudF9zaXplLT5zaXplICogMTAyNCAqIDEwMjQpIC0gMTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG52aWRpYV9wcml2YXRlLmRldl8yLCBOVklESUFfMl9BUEJBU0UsIGFwYmFzZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMiwgTlZJRElBXzJfQVBMSU1JVCwgYXBsaW1pdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMywgTlZJRElBXzNfQVBCQVNFLCBhcGJhc2UpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobnZpZGlhX3ByaXZhdGUuZGV2XzMsIE5WSURJQV8zX0FQTElNSVQsIGFwbGltaXQpOworCWlmICgwICE9IChyYyA9IG52aWRpYV9pbml0X2lvcnIoYXBiYXNlLCBjdXJyZW50X3NpemUtPnNpemUgKiAxMDI0ICogMTAyNCkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBkaXJlY3Rvcnkgc2l6ZSBpcyA2NGsgKi8KKwludW1fZGlycyA9IGN1cnJlbnRfc2l6ZS0+c2l6ZSAvIDY0OworCW52aWRpYV9wcml2YXRlLm51bV9hY3RpdmVfZW50cmllcyA9IGN1cnJlbnRfc2l6ZS0+bnVtX2VudHJpZXM7CisJbnZpZGlhX3ByaXZhdGUucGdfb2Zmc2V0ID0gMDsKKwlpZiAobnVtX2RpcnMgPT0gMCkgeworCQludW1fZGlycyA9IDE7CisJCW52aWRpYV9wcml2YXRlLm51bV9hY3RpdmVfZW50cmllcyAvPSAoNjQgLyBjdXJyZW50X3NpemUtPnNpemUpOworCQludmlkaWFfcHJpdmF0ZS5wZ19vZmZzZXQgPSAoYXBiYXNlICYgKDY0ICogMTAyNCAqIDEwMjQgLSAxKSAmCisJCQl+KGN1cnJlbnRfc2l6ZS0+c2l6ZSAqIDEwMjQgKiAxMDI0IC0gMSkpIC8gUEFHRV9TSVpFOworCX0KKworCS8qIGF0dGJhc2UgKi8KKwlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMiwgTlZJRElBXzJfQVRUQkFTRShpKSwKKwkJCShhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICsgKGkgJSBudW1fZGlycykgKiA2NCAqIDEwMjQpIHwgMSk7CisJfQorCisJLyogZ3RsYiBjb250cm9sICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG52aWRpYV9wcml2YXRlLmRldl8yLCBOVklESUFfMl9HQVJUQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobnZpZGlhX3ByaXZhdGUuZGV2XzIsIE5WSURJQV8yX0dBUlRDVFJMLCB0ZW1wIHwgMHgxMSk7CisKKwkvKiBnYXJ0IGNvbnRyb2wgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBOVklESUFfMF9BUFNJWkUsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLCB0ZW1wIHwgMHgxMDApOworCisJLyogbWFwIGFwZXJ0dXJlICovCisJbnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUgPQorCQkodm9sYXRpbGUgdTMyIF9faW9tZW0gKikgaW9yZW1hcChhcGJhc2UsIDMzICogUEFHRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudmlkaWFfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpwcmV2aW91c19zaXplOworCXUzMiB0ZW1wOworCisJLyogZ2FydCBjb250cm9sICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIE5WSURJQV8wX0FQU0laRSwgdGVtcCAmIH4oMHgxMDApKTsKKworCS8qIGd0bGIgY29udHJvbCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMiwgTlZJRElBXzJfR0FSVENUUkwsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG52aWRpYV9wcml2YXRlLmRldl8yLCBOVklESUFfMl9HQVJUQ1RSTCwgdGVtcCAmIH4oMHgxMSkpOworCisJLyogdW5tYXAgYXBlcnR1cmUgKi8KKwlpb3VubWFwKCh2b2lkIF9faW9tZW0gKikgbnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUpOworCisJLyogcmVzdG9yZSBwcmV2aW91cyBhcGVydHVyZSBzaXplICovCisJcHJldmlvdXNfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIE5WSURJQV8wX0FQU0laRSwKKwkJcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiByZXN0b3JlIGlvcnIgZm9yIHByZXZpb3VzIGFwZXJ0dXJlIHNpemUgKi8KKwludmlkaWFfaW5pdF9pb3JyKGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIsCisJCXByZXZpb3VzX3NpemUtPnNpemUgKiAxMDI0ICogMTAyNCk7Cit9CisKKworLyoKKyAqIE5vdGUgd2UgY2FuJ3QgdXNlIHRoZSBnZW5lcmljIHJvdXRpbmVzLCBldmVuIHRob3VnaCB0aGV5IGFyZSA5OSUgdGhlIHNhbWUuCisgKiBBcGVydHVyZSBzaXplcyA8NjRNIHN0aWxsIHJlcXVpcmVzIGEgZnVsbCA2NGsgR0FSVCBkaXJlY3RvcnksIGJ1dAorICogb25seSB1c2UgdGhlIHBvcnRpb24gb2YgdGhlIFRMQiBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYXBlcnR1cmVzCisgKiBhbGlnbm1lbnQgaW5zaWRlIHRoZSBzdXJyb3VuZGluZyA2NE0gYmxvY2suCisgKi8KK2V4dGVybiBpbnQgYWdwX21lbW9yeV9yZXNlcnZlZDsKKworc3RhdGljIGludCBudmlkaWFfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIGo7CisJCisJaWYgKCh0eXBlICE9IDApIHx8IChtZW0tPnR5cGUgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4KKwkJKG52aWRpYV9wcml2YXRlLm51bV9hY3RpdmVfZW50cmllcyAtIGFncF9tZW1vcnlfcmVzZXJ2ZWQvUEFHRV9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJZm9yKGogPSBwZ19zdGFydDsgaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGorKykgeworCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK252aWRpYV9wcml2YXRlLnBnX29mZnNldCtqKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLAorCQkJYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStudmlkaWFfcHJpdmF0ZS5wZ19vZmZzZXQraik7CisJCXJlYWRsKGFncF9icmlkZ2UtPmdhdHRfdGFibGUrbnZpZGlhX3ByaXZhdGUucGdfb2Zmc2V0K2opOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG52aWRpYV9yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWlmICgodHlwZSAhPSAwKSB8fCAobWVtLT50eXBlICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKQorCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK252aWRpYV9wcml2YXRlLnBnX29mZnNldCtpKTsKKworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgbnZpZGlhX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJdTMyIHdiY19yZWcsIHRlbXA7CisJaW50IGk7CisKKwkvKiBmbHVzaCBjaGlwc2V0ICovCisJaWYgKG52aWRpYV9wcml2YXRlLndiY19tYXNrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMSwgTlZJRElBXzFfV0JDLCAmd2JjX3JlZyk7CisJCXdiY19yZWcgfD0gbnZpZGlhX3ByaXZhdGUud2JjX21hc2s7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobnZpZGlhX3ByaXZhdGUuZGV2XzEsIE5WSURJQV8xX1dCQywgd2JjX3JlZyk7CisKKwkJZW5kID0gamlmZmllcyArIDMqSFo7CisJCWRvIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMSwKKwkJCQkJTlZJRElBXzFfV0JDLCAmd2JjX3JlZyk7CisJCQlpZiAoKHNpZ25lZCkoZW5kIC0gamlmZmllcykgPD0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkgICAgIlRMQiBmbHVzaCB0b29rIG1vcmUgdGhhbiAzIHNlY29uZHMuXG4iKTsKKwkJCX0KKwkJfSB3aGlsZSAod2JjX3JlZyAmIG52aWRpYV9wcml2YXRlLndiY19tYXNrKTsKKwl9CisKKwkvKiBmbHVzaCBUTEIgZW50cmllcyAqLworCWZvcihpID0gMDsgaSA8IDMyICsgMTsgaSsrKQorCQl0ZW1wID0gcmVhZGwobnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUrKGkgKiBQQUdFX1NJWkUgLyBzaXplb2YodTMyKSkpOworCWZvcihpID0gMDsgaSA8IDMyICsgMTsgaSsrKQorCQl0ZW1wID0gcmVhZGwobnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUrKGkgKiBQQUdFX1NJWkUgLyBzaXplb2YodTMyKSkpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCBudmlkaWFfZ2VuZXJpY19zaXplc1s1XSA9Cit7CisJezUxMiwgMTMxMDcyLCA3LCAwfSwKKwl7MjU2LCA2NTUzNiwgNiwgOH0sCisJezEyOCwgMzI3NjgsIDUsIDEyfSwKKwl7NjQsIDE2Mzg0LCA0LCAxNH0sCisJLyogVGhlIDMyTSBtb2RlIHN0aWxsIHJlcXVpcmVzIGEgNjRrIGdhdHQgKi8KKwl7MzIsIDE2Mzg0LCA0LCAxNX0KK307CisKKworc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgbnZpZGlhX2dlbmVyaWNfbWFza3NbXSA9Cit7CisJeyAubWFzayA9IDEsIC50eXBlID0gMH0KK307CisKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIG52aWRpYV9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gbnZpZGlhX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDUsCisJLmNvbmZpZ3VyZQkJPSBudmlkaWFfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IG52aWRpYV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IG52aWRpYV9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gbnZpZGlhX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IG52aWRpYV9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gbnZpZGlhX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gbnZpZGlhX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF9udmlkaWFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJdTggY2FwX3B0cjsKKworCW52aWRpYV9wcml2YXRlLmRldl8xID0KKwkJcGNpX2ZpbmRfc2xvdCgodW5zaWduZWQgaW50KXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oMCwgMSkpOworCW52aWRpYV9wcml2YXRlLmRldl8yID0KKwkJcGNpX2ZpbmRfc2xvdCgodW5zaWduZWQgaW50KXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oMCwgMikpOworCW52aWRpYV9wcml2YXRlLmRldl8zID0KKwkJcGNpX2ZpbmRfc2xvdCgodW5zaWduZWQgaW50KXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oMzAsIDApKTsKKwkKKwlpZiAoIW52aWRpYV9wcml2YXRlLmRldl8xIHx8ICFudmlkaWFfcHJpdmF0ZS5kZXZfMiB8fCAhbnZpZGlhX3ByaXZhdGUuZGV2XzMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIGFuIE5WSURJQSBuRm9yY2UvbkZvcmNlMiAiCisJCQkiY2hpcHNldCwgYnV0IGNvdWxkIG5vdCBmaW5kIHRoZSBzZWNvbmRhcnkgZGV2aWNlcy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0U6CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBOVklESUEgbkZvcmNlIGNoaXBzZXRcbiIpOworCQludmlkaWFfcHJpdmF0ZS53YmNfbWFzayA9IDB4MDAwMTAwMDA7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIE5WSURJQSBuRm9yY2UyIGNoaXBzZXRcbiIpOworCQludmlkaWFfcHJpdmF0ZS53YmNfbWFzayA9IDB4ODAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuc3VwcG9ydGVkIE5WSURJQSBjaGlwc2V0IChkZXZpY2UgaWQ6ICUwNHgpXG4iLAorCQkJICAgIHBkZXYtPmRldmljZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRyaXZlciA9ICZudmlkaWFfZHJpdmVyOworCWJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YSA9ICZudmlkaWFfcHJpdmF0ZSwKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJYnJpZGdlLT5jYXBuZHgrUENJX0FHUF9TVEFUVVMsCisJCQkmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX252aWRpYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX252aWRpYV9wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFLAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTIsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfbnZpZGlhX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3BfbnZpZGlhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtbnZpZGlhIiwKKwkuaWRfdGFibGUJPSBhZ3BfbnZpZGlhX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX252aWRpYV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF9udmlkaWFfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX252aWRpYV9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfbnZpZGlhX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX252aWRpYV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfbnZpZGlhX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfbnZpZGlhX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX252aWRpYV9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKK01PRFVMRV9BVVRIT1IoIk5WSURJQSBDb3Jwb3JhdGlvbiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiM2VkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworLyoKKyAqIFNHSSBUSU9DQSBBR1BHQVJUIHJvdXRpbmVzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vc24vdGlvY2FfcHJvdmlkZXIuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworZXh0ZXJuIGludCBhZ3BfbWVtb3J5X3Jlc2VydmVkOworZXh0ZXJuIHVpbnQzMl90IHRpb2NhX2dhcnRfZm91bmQ7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB0aW9jYV9saXN0Oworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKipzZ2lfdGlvY2FfYWdwX2JyaWRnZXM7CisKKy8qCisgKiBUaGUgYXBlcmF0dXJlIHNpemUgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgc2V0IHVwIGF0IFRJT0NBIGluaXQgdGltZS4KKyAqIFZhbHVlcyBmb3IgdGhpcyB0YWJsZSB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgZmlsbGVkIGluIGF0CisgKiBzZ2lfdGlvY2FfZmV0Y2hfc2l6ZSgpIHRpbWUuCisgKi8KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCBzZ2lfdGlvY2Ffc2l6ZXNbXSA9IHsKKwl7MCwgMCwgMH0sCit9OworCitzdGF0aWMgdm9pZCAqc2dpX3Rpb2NhX2FsbG9jX3BhZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBuaWQ7CisJc3RydWN0IHRpb2NhX2tlcm5lbCAqaW5mbyA9CisJICAgIChzdHJ1Y3QgdGlvY2Ffa2VybmVsICopYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhOworCisJbmlkID0gaW5mby0+Y2FfY2xvc2VzdF9ub2RlOworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgR0ZQX0tFUk5FTCwgMCk7CisJaWYgKHBhZ2UgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlnZXRfcGFnZShwYWdlKTsKKwlTZXRQYWdlTG9ja2VkKHBhZ2UpOworCWF0b21pY19pbmMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CisJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKK30KKworLyoKKyAqIEZsdXNoIEdBUlQgdGxiJ3MuICBDYW5ub3Qgc2VsZWN0aXZlbHkgZmx1c2ggYmFzZWQgb24gbWVtb3J5IHNvIHRoZSBtZW0KKyAqIGFyZyBpcyBpZ25vcmVkLgorICovCisKK3N0YXRpYyB2b2lkIHNnaV90aW9jYV90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXRpb2NhX3RsYmZsdXNoKG1lbS0+YnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhKTsKK30KKworLyoKKyAqIEdpdmVuIGFuIGFkZHJlc3Mgb2YgYSBob3N0IHBoeXNpY2FsIHBhZ2UsIHR1cm4gaXQgaW50byBhIHZhbGlkIGdhcnQKKyAqIGVudHJ5LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworc2dpX3Rpb2NhX21hc2tfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdGlvY2FfcGh5c3BhZ2VfdG9fZ2FydChhZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2dpX3Rpb2NhX2FncF9lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSkKK3sKKwl0aW9jYV9mYXN0d3JpdGVfZW5hYmxlKGJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YSk7Cit9CisKKy8qCisgKiBzZ2lfdGlvY2FfY29uZmlndXJlKCkgZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHNpbmNlIHRoZSBiYXNlIENBIGRyaXZlcgorICogaGFzIGFscmVheSBzZXQgdXAgdGhlIEdBUlQuCisgKi8KKworc3RhdGljIGludCBzZ2lfdGlvY2FfY29uZmlndXJlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgZ2Z4IGFwZXJhdHVyZSBzaXplLiAgVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGRldGVybWluZWQgYnkgdGhlCisgKiBDQSBkcml2ZXIgaW5pdCwgc28ganVzdCBuZWVkIHRvIHNldCBhZ3BfYnJpZGdlIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAqLworCitzdGF0aWMgaW50IHNnaV90aW9jYV9mZXRjaF9zaXplKHZvaWQpCit7CisJc3RydWN0IHRpb2NhX2tlcm5lbCAqaW5mbyA9CisJICAgIChzdHJ1Y3QgdGlvY2Ffa2VybmVsICopYWdwX2JyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCXNnaV90aW9jYV9zaXplc1swXS5zaXplID0gaW5mby0+Y2FfZ2Z4YXBfc2l6ZSAvIE1CKDEpOworCXNnaV90aW9jYV9zaXplc1swXS5udW1fZW50cmllcyA9IGluZm8tPmNhX2dmeGdhcnRfZW50cmllczsKKworCXJldHVybiBzZ2lfdGlvY2Ffc2l6ZXNbMF0uc2l6ZTsKK30KKworc3RhdGljIGludCBzZ2lfdGlvY2FfY3JlYXRlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCB0aW9jYV9rZXJuZWwgKmluZm8gPQorCSAgICAoc3RydWN0IHRpb2NhX2tlcm5lbCAqKWJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCWJyaWRnZS0+Z2F0dF90YWJsZV9yZWFsID0gKHUzMiAqKSBpbmZvLT5jYV9nZnhnYXJ0OworCWJyaWRnZS0+Z2F0dF90YWJsZSA9IGJyaWRnZS0+Z2F0dF90YWJsZV9yZWFsOworCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IGluZm8tPmNhX2dmeGdhcnRfYmFzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnaV90aW9jYV9mcmVlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnaV90aW9jYV9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAorCQkJCSAgIGludCB0eXBlKQoreworCWludCBudW1fZW50cmllczsKKwlzaXplX3QgaTsKKwlvZmZfdCBqOworCXZvaWQgKnRlbXA7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCisJYnJpZGdlID0gbWVtLT5icmlkZ2U7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCisJc3dpdGNoIChicmlkZ2UtPmRyaXZlci0+c2l6ZV90eXBlKSB7CisJY2FzZSBVOF9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIFUxNl9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzE2KHRlbXApLT5udW1fZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIExWTDJfQVBFUl9TSVpFOgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnVtX2VudHJpZXMgPSAwOworCQlicmVhazsKKwl9CisKKwludW1fZW50cmllcyAtPSBhZ3BfbWVtb3J5X3Jlc2VydmVkIC8gUEFHRV9TSVpFOworCWlmIChudW1fZW50cmllcyA8IDApCisJCW51bV9lbnRyaWVzID0gMDsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCooYnJpZGdlLT5nYXR0X3RhYmxlICsgaikpCisJCQlyZXR1cm4gLUVCVVNZOworCQlqKys7CisJfQorCisJaWYgKG1lbS0+aXNfZmx1c2hlZCA9PSBGQUxTRSkgeworCQlicmlkZ2UtPmRyaXZlci0+Y2FjaGVfZmx1c2goKTsKKwkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCSooYnJpZGdlLT5nYXR0X3RhYmxlICsgaikgPQorCQkgICAgYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGJyaWRnZSwgbWVtLT5tZW1vcnlbaV0sCisJCQkJCQltZW0tPnR5cGUpOworCX0KKworCWJyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ2lfdGlvY2FfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKKwkJCQkgICBpbnQgdHlwZSkKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisKKwlicmlkZ2UgPSBtZW0tPmJyaWRnZTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCSooYnJpZGdlLT5nYXR0X3RhYmxlICsgaSkgPSAwOworCX0KKworCWJyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2dpX3Rpb2NhX2NhY2hlX2ZsdXNoKHZvaWQpCit7Cit9CisKKy8qCisgKiBDbGVhbnVwLiAgTm90aGluZyB0byBkbyBhcyB0aGUgQ0EgZHJpdmVyIG93bnMgdGhlIEdBUlQuCisgKi8KKworc3RhdGljIHZvaWQgc2dpX3Rpb2NhX2NsZWFudXAodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKnNnaV90aW9jYV9maW5kX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJyaWRnZSwgJmFncF9icmlkZ2VzLCBsaXN0KSB7CisJCWlmIChicmlkZ2UtPmRldi0+YnVzID09IHBkZXYtPmJ1cykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gYnJpZGdlOworfQorCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgc2dpX3Rpb2NhX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc2l6ZV90eXBlID0gVTE2X0FQRVJfU0laRSwKKwkuY29uZmlndXJlID0gc2dpX3Rpb2NhX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZSA9IHNnaV90aW9jYV9mZXRjaF9zaXplLAorCS5jbGVhbnVwID0gc2dpX3Rpb2NhX2NsZWFudXAsCisJLnRsYl9mbHVzaCA9IHNnaV90aW9jYV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkgPSBzZ2lfdGlvY2FfbWFza19tZW1vcnksCisJLmFncF9lbmFibGUgPSBzZ2lfdGlvY2FfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2ggPSBzZ2lfdGlvY2FfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlID0gc2dpX3Rpb2NhX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUgPSBzZ2lfdGlvY2FfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5ID0gc2dpX3Rpb2NhX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkgPSBzZ2lfdGlvY2FfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZSA9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZSA9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UgPSBzZ2lfdGlvY2FfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZSA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuY2FudF91c2VfYXBlcnR1cmUgPSAxLAorCS5uZWVkc19zY3JhdGNoX3BhZ2UgPSAwLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMgPSAxLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX3NnaV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGo7CisJc3RydWN0IHRpb2NhX2tlcm5lbCAqaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwlpZiAodGlvY2FfZ2FydF9mb3VuZCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNHSSBUSU8gQ0EgR0FSVCBkcml2ZXIgaW5pdGlhbGl6ZWQuXG4iKTsKKwllbHNlCisJCXJldHVybiAwOworCisJc2dpX3Rpb2NhX2FncF9icmlkZ2VzID0KKwkgICAgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiopa21hbGxvYyh0aW9jYV9nYXJ0X2ZvdW5kICoKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisKKwlqID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZ0aW9jYV9saXN0LCBjYV9saXN0KSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwkJbGlzdF9mb3JfZWFjaCh0bXAsIGluZm8tPmNhX2RldmljZXMpIHsKKwkJCXU4IGNhcF9wdHI7CisJCQlwZGV2ID0gcGNpX2Rldl9iKHRtcCk7CisJCQlpZiAocGRldi0+Y2xhc3MgIT0gKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4KSkKKwkJCQljb250aW51ZTsKKwkJCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwkJCWlmICghY2FwX3B0cikKKwkJCQljb250aW51ZTsKKwkJfQorCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0gPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJicmlkZ2UgJWQgPSAweCVwXG4iLCBqLAorCQkgICAgICAgc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdKTsKKwkJaWYgKHNnaV90aW9jYV9hZ3BfYnJpZGdlc1tqXSkgeworCQkJc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdLT5kZXYgPSBwZGV2OworCQkJc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdLT5kZXZfcHJpdmF0ZV9kYXRhID0gaW5mbzsKKwkJCXNnaV90aW9jYV9hZ3BfYnJpZGdlc1tqXS0+ZHJpdmVyID0gJnNnaV90aW9jYV9kcml2ZXI7CisJCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0tPmdhcnRfYnVzX2FkZHIgPQorCQkJICAgIGluZm8tPmNhX2dmeGFwX2Jhc2U7CisJCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0tPm1vZGUgPSAoMHg3RCA8PCAyNCkgfAkvKiAxMjYgcmVxdWVzdHMgKi8KKwkJCSAgICAoMHgxIDw8IDkpIHwJLyogU0JBIHN1cHBvcnRlZCAqLworCQkJICAgICgweDEgPDwgNSkgfAkvKiA2NC1iaXQgYWRkcmVzc2VzIHN1cHBvcnRlZCAqLworCQkJICAgICgweDEgPDwgNCkgfAkvKiBGVyBzdXBwb3J0ZWQgKi8KKwkJCSAgICAoMHgxIDw8IDMpIHwJLyogQUdQIDMuMCBtb2RlICovCisJCQkgICAgMHgyOwkvKiA4eCB0cmFuc2ZlciBvbmx5ICovCisJCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0tPmN1cnJlbnRfc2l6ZSA9CisJCQkgICAgc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdLT5wcmV2aW91c19zaXplID0KKwkJCSAgICAodm9pZCAqKSZzZ2lfdGlvY2Ffc2l6ZXNbMF07CisJCQlhZ3BfYWRkX2JyaWRnZShzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0pOworCQl9CisJCWorKzsKKwl9CisKKwlhZ3BfZmluZF9icmlkZ2UgPSAmc2dpX3Rpb2NhX2ZpbmRfYnJpZGdlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX3NnaV9jbGVhbnVwKHZvaWQpCit7CisJaWYoc2dpX3Rpb2NhX2FncF9icmlkZ2VzKQorCQlrZnJlZShzZ2lfdGlvY2FfYWdwX2JyaWRnZXMpOworCXNnaV90aW9jYV9hZ3BfYnJpZGdlcz1OVUxMOworfQorCittb2R1bGVfaW5pdChhZ3Bfc2dpX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX3NnaV9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjY2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogU2lTIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKyNkZWZpbmUgU0lTX0FUVEJBU0UJMHg5MAorI2RlZmluZSBTSVNfQVBTSVpFCTB4OTQKKyNkZWZpbmUgU0lTX1RMQkNOVFJMCTB4OTcKKyNkZWZpbmUgU0lTX1RMQkZMVVNICTB4OTgKKworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGFncF9zaXNfZm9yY2VfZGVsYXkgPSAwOworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGFncF9zaXNfYWdwX3NwZWMgPSAtMTsKKworc3RhdGljIGludCBzaXNfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXU4IHRlbXBfc2l6ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVBTSVpFLCAmdGVtcF9zaXplKTsKKwl2YWx1ZXMgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAoKHRlbXBfc2l6ZSA9PSB2YWx1ZXNbaV0uc2l6ZV92YWx1ZSkgfHwKKwkJICAgICgodGVtcF9zaXplICYgfigweDAzKSkgPT0KKwkJICAgICAodmFsdWVzW2ldLnNpemVfdmFsdWUgJiB+KDB4MDMpKSkpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpc190bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFNJU19UTEJGTFVTSCwgMHgwMik7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFNJU19UTEJDTlRSTCwgMHgwNSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVRUQkFTRSwKKwkJCSAgICAgICBhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVBTSVpFLAorCQkJICAgICAgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2lzX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqcHJldmlvdXNfc2l6ZTsKKworCXByZXZpb3VzX3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVBTSVpFLAorCQkJICAgICAgKHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUgJiB+KDB4MDMpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpc19kZWxheWVkX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXZpY2UgPSBOVUxMOworCXUzMiBjb21tYW5kOworCWludCByYXRlOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIGFuIEFHUCAlZC4lZCBjb21wbGlhbnQgZGV2aWNlIGF0ICVzLlxuIiwKKwkJYWdwX2JyaWRnZS0+bWFqb3JfdmVyc2lvbiwKKwkJYWdwX2JyaWRnZS0+bWlub3JfdmVyc2lvbiwKKwkJcGNpX25hbWUoYWdwX2JyaWRnZS0+ZGV2KSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX1NUQVRVUywgJmNvbW1hbmQpOworCWNvbW1hbmQgPSBhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKGJyaWRnZSwgbW9kZSwgY29tbWFuZCk7CisJY29tbWFuZCB8PSBBR1BTVEFUX0FHUF9FTkFCTEU7CisJcmF0ZSA9IChjb21tYW5kICYgMHg3KSA8PCAyOworCisJZm9yX2VhY2hfcGNpX2RldihkZXZpY2UpIHsKKwkJdTggYWdwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXZpY2UsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKCFhZ3ApCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUHV0dGluZyBBR1AgVjMgZGV2aWNlIGF0ICVzIGludG8gJWR4IG1vZGVcbiIsCisJCQlwY2lfbmFtZShkZXZpY2UpLCByYXRlKTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmljZSwgYWdwICsgUENJX0FHUF9DT01NQU5ELCBjb21tYW5kKTsKKworCQkvKgorCQkgKiBXZWlyZDogb24gc29tZSBzaXMgY2hpcHNldHMgYW55IHJhdGUgY2hhbmdlIGluIHRoZSB0YXJnZXQKKwkJICogY29tbWFuZCByZWdpc3RlciB0cmlnZ2VycyBhIDVtcyBzY3Jld3VwIGR1cmluZyB3aGljaCB0aGUgbWFzdGVyCisJCSAqIGNhbm5vdCBiZSBjb25maWd1cmVkCisJCSAqLworCQlpZiAoZGV2aWNlLT5kZXZpY2UgPT0gYnJpZGdlLT5kZXYtPmRldmljZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNpUyBkZWxheSB3b3JrYXJvdW5kOiBnaXZpbmcgYnJpZGdlIHRpbWUgdG8gcmVjb3Zlci5cbiIpOworCQkJbXNsZWVwKDEwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb184IHNpc19nZW5lcmljX3NpemVzWzddID0KK3sKKwl7MjU2LCA2NTUzNiwgNiwgOTl9LAorCXsxMjgsIDMyNzY4LCA1LCA4M30sCisJezY0LCAxNjM4NCwgNCwgNjd9LAorCXszMiwgODE5MiwgMywgNTF9LAorCXsxNiwgNDA5NiwgMiwgMzV9LAorCXs4LCAyMDQ4LCAxLCAxOX0sCisJezQsIDEwMjQsIDAsIDN9Cit9OworCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgc2lzX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcyAJPSBzaXNfZ2VuZXJpY19zaXplcywKKwkuc2l6ZV90eXBlCQk9IFU4X0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IHNpc19jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gc2lzX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gc2lzX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBzaXNfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gTlVMTCwKKwkuYWdwX2VuYWJsZQkJPSBhZ3BfZ2VuZXJpY19lbmFibGUsCisJLmNhY2hlX2ZsdXNoCQk9IGdsb2JhbF9jYWNoZV9mbHVzaCwKKwkuY3JlYXRlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGFncF9nZW5lcmljX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyBzaXNfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzU1OTFfQUdQLAorCQkuY2hpcHNldF9uYW1lCT0gIjU1OTEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV81MzAsCisJCS5jaGlwc2V0X25hbWUJPSAiNTMwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNTQwLAorCQkuY2hpcHNldF9uYW1lCT0gIjU0MCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzU1MCwKKwkJLmNoaXBzZXRfbmFtZQk9ICI1NTAiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82MjAsCisJCS5jaGlwc2V0X25hbWUJPSAiNjIwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNjMwLAorCQkuY2hpcHNldF9uYW1lCT0gIjYzMCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzYzNSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI2MzUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82NDUsCisJCS5jaGlwc2V0X25hbWUJPSAiNjQ1IiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNjQ2LAorCQkuY2hpcHNldF9uYW1lCT0gIjY0NiIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzY0OCwKKwkJLmNoaXBzZXRfbmFtZQk9ICI2NDgiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82NTAsCisJCS5jaGlwc2V0X25hbWUJPSAiNjUwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZCAgPSBQQ0lfREVWSUNFX0lEX1NJXzY1MSwKKwkJLmNoaXBzZXRfbmFtZSAgID0gIjY1MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzY1NSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI2NTUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82NjEsCisJCS5jaGlwc2V0X25hbWUJPSAiNjYxIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNzMwLAorCQkuY2hpcHNldF9uYW1lCT0gIjczMCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzczNSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI3MzUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV83NDAsCisJCS5jaGlwc2V0X25hbWUJPSAiNzQwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNzQxLAorCQkuY2hpcHNldF9uYW1lCT0gIjc0MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzc0NSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI3NDUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV83NDYsCisJCS5jaGlwc2V0X25hbWUJPSAiNzQ2IiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNzYwLAorCQkuY2hpcHNldF9uYW1lCT0gIjc2MCIsCisJfSwKKwl7IH0sIC8qIGR1bW15IGZpbmFsIGVudHJ5LCBhbHdheXMgcHJlc2VudCAqLworfTsKKworCisvLyBjaGlwc2V0cyB0aGF0IHJlcXVpcmUgdGhlICdkZWxheSBoYWNrJworc3RhdGljIGludCBzaXNfYnJva2VuX2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlQQ0lfREVWSUNFX0lEX1NJXzY0OCwKKwlQQ0lfREVWSUNFX0lEX1NJXzc0NiwKKwkwIC8vIHRlcm1pbmF0b3IKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzaXNfZ2V0X2RyaXZlcihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBzaXNfYnJva2VuX2NoaXBzZXRzW2ldIT0wOyArK2kpCisJCWlmKGJyaWRnZS0+ZGV2LT5kZXZpY2U9PXNpc19icm9rZW5fY2hpcHNldHNbaV0pCisJCQlicmVhazsKKworCWlmKHNpc19icm9rZW5fY2hpcHNldHNbaV0gfHwgYWdwX3Npc19mb3JjZV9kZWxheSkKKwkJc2lzX2RyaXZlci5hZ3BfZW5hYmxlPXNpc19kZWxheWVkX2VuYWJsZTsKKworCS8vIHNpcyBjaGlwc2V0cyB0aGF0IGluZGljYXRlIGxlc3MgdGhhbiBhZ3AzLjUKKwkvLyBhcmUgbm90IGFjdHVhbGx5IGZ1bGx5IGFncDMgY29tcGxpYW50CisJaWYgKChhZ3BfYnJpZGdlLT5tYWpvcl92ZXJzaW9uID09IDMgJiYgYWdwX2JyaWRnZS0+bWlub3JfdmVyc2lvbiA+PSA1CisJICAgICAmJiBhZ3Bfc2lzX2FncF9zcGVjIT0wKSB8fCBhZ3Bfc2lzX2FncF9zcGVjPT0xKSB7CisJCXNpc19kcml2ZXIuYXBlcnR1cmVfc2l6ZXMgPSBhZ3AzX2dlbmVyaWNfc2l6ZXM7CisJCXNpc19kcml2ZXIuc2l6ZV90eXBlID0gVTE2X0FQRVJfU0laRTsKKwkJc2lzX2RyaXZlci5udW1fYXBlcnR1cmVfc2l6ZXMgPSBBR1BfR0VORVJJQ19TSVpFU19FTlRSSUVTOworCQlzaXNfZHJpdmVyLmNvbmZpZ3VyZSA9IGFncDNfZ2VuZXJpY19jb25maWd1cmU7CisJCXNpc19kcml2ZXIuZmV0Y2hfc2l6ZSA9IGFncDNfZ2VuZXJpY19mZXRjaF9zaXplOworCQlzaXNfZHJpdmVyLmNsZWFudXAgPSBhZ3AzX2dlbmVyaWNfY2xlYW51cDsKKwkJc2lzX2RyaXZlci50bGJfZmx1c2ggPSBhZ3AzX2dlbmVyaWNfdGxiZmx1c2g7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF9zaXNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2RldmljZV9pZHMgKmRldnMgPSBzaXNfYWdwX2RldmljZV9pZHM7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXU4IGNhcF9wdHI7CisJaW50IGo7CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHByb2JlIGZvciBrbm93biBjaGlwc2V0cyAqLworCWZvciAoaiA9IDA7IGRldnNbal0uY2hpcHNldF9uYW1lOyBqKyspIHsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBkZXZzW2pdLmRldmljZV9pZCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIFNpUyAlcyBjaGlwc2V0XG4iLAorCQkJCQlkZXZzW2pdLmNoaXBzZXRfbmFtZSk7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgU2lTIGNoaXBzZXQgKGRldmljZSBpZDogJTA0eClcbiIsCisJCSAgICBwZGV2LT5kZXZpY2UpOworCXJldHVybiAtRU5PREVWOworCitmb3VuZDoKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnJpZGdlLT5kcml2ZXIgPSAmc2lzX2RyaXZlcjsKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJZ2V0X2FncF92ZXJzaW9uKGJyaWRnZSk7CisKKwkvKiBGaWxsIGluIHRoZSBtb2RlIHJlZ2lzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLCAmYnJpZGdlLT5tb2RlKTsKKwlzaXNfZ2V0X2RyaXZlcihicmlkZ2UpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRnZSk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ3Bfc2lzX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3Bfc2lzX3BjaV90YWJsZVtdID0geworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9TSSwKKwkuZGV2aWNlCQk9IFBDSV9BTllfSUQsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3Bfc2lzX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3Bfc2lzX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtc2lzIiwKKwkuaWRfdGFibGUJPSBhZ3Bfc2lzX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX3Npc19wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF9zaXNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX3Npc19pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3Bfc2lzX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX3Npc19jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3Bfc2lzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3Bfc2lzX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX3Npc19jbGVhbnVwKTsKKworbW9kdWxlX3BhcmFtKGFncF9zaXNfZm9yY2VfZGVsYXksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZ3Bfc2lzX2ZvcmNlX2RlbGF5LCJmb3JjZXMgc2lzIGRlbGF5IGhhY2siKTsKK21vZHVsZV9wYXJhbShhZ3Bfc2lzX2FncF9zcGVjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZ3Bfc2lzX2FncF9zcGVjLCIwPWZvcmNlIHNpcyBpbml0LCAxPWZvcmNlIGdlbmVyaWMgYWdwMyBpbml0LCBkZWZhdWx0OiBhdXRvZGV0ZWN0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zd29ya3MtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMzOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9zd29ya3MtYWdwLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBTZXJ2ZXJ3b3JrcyBBR1BHQVJUIHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworI2RlZmluZSBTVldSS1NfQ09NTUFORAkJMHgwNAorI2RlZmluZSBTVldSS1NfQVBTSVpFCQkweDEwCisjZGVmaW5lIFNWV1JLU19NTUJBU0UJCTB4MTQKKyNkZWZpbmUgU1ZXUktTX0NBQ0hJTkcJCTB4NGIKKyNkZWZpbmUgU1ZXUktTX0FHUF9FTkFCTEUJMHg2MAorI2RlZmluZSBTVldSS1NfRkVBVFVSRQkJMHg2OAorCisjZGVmaW5lIFNWV1JLU19TSVpFX01BU0sJMHhmZTAwMDAwMAorCisvKiBNZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBTVldSS1NfR0FSVF9DQUNIRQkweDAyCisjZGVmaW5lIFNWV1JLU19HQVRUQkFTRQkJMHgwNAorI2RlZmluZSBTVldSS1NfVExCRkxVU0gJCTB4MTAKKyNkZWZpbmUgU1ZXUktTX1BPU1RGTFVTSAkweDE0CisjZGVmaW5lIFNWV1JLU19ESVJGTFVTSAkJMHgwYworCisKK3N0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCB7CisJdW5zaWduZWQgbG9uZyAqcmVhbDsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlbWFwcGVkOworfTsKKworc3RhdGljIHN0cnVjdCBfc2VydmVyd29ya3NfcHJpdmF0ZSB7CisJc3RydWN0IHBjaV9kZXYgKnN2cndya3NfZGV2OwkvKiBkZXZpY2Ugb25lICovCisJdm9sYXRpbGUgdTggX19pb21lbSAqcmVnaXN0ZXJzOworCXN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCAqKmdhdHRfcGFnZXM7CisJaW50IG51bV90YWJsZXM7CisJc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwIHNjcmF0Y2hfZGlyOworCisJaW50IGdhcnRfYWRkcl9vZnM7CisJaW50IG1tX2FkZHJfb2ZzOworfSBzZXJ2ZXJ3b3Jrc19wcml2YXRlOworCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2NyZWF0ZV9wYWdlX21hcChzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKnBhZ2VfbWFwKQoreworCWludCBpOworCisJcGFnZV9tYXAtPnJlYWwgPSAodW5zaWduZWQgbG9uZyAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2VfbWFwLT5yZWFsID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlwYWdlX21hcC0+cmVtYXBwZWQgPSBpb3JlbWFwX25vY2FjaGUodmlydF90b19waHlzKHBhZ2VfbWFwLT5yZWFsKSwgCisJCQkJCSAgICBQQUdFX1NJWkUpOworCWlmIChwYWdlX21hcC0+cmVtYXBwZWQgPT0gTlVMTCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7CisJCXBhZ2VfbWFwLT5yZWFsID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJZm9yKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspCisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIHBhZ2VfbWFwLT5yZW1hcHBlZCtpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJ3b3Jrc19mcmVlX3BhZ2VfbWFwKHN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCAqcGFnZV9tYXApCit7CisJaW91bm1hcChwYWdlX21hcC0+cmVtYXBwZWQpOworCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYWdlX21hcC0+cmVhbCkpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZV9tYXAtPnJlYWwpOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJ3b3Jrc19mcmVlX2dhdHRfcGFnZXModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKip0YWJsZXM7CisJc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwICplbnRyeTsKKworCXRhYmxlcyA9IHNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlczsKKwlmb3IoaSA9IDA7IGkgPCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLm51bV90YWJsZXM7IGkrKykgeworCQllbnRyeSA9IHRhYmxlc1tpXTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWlmIChlbnRyeS0+cmVhbCAhPSBOVUxMKSB7CisJCQkJc2VydmVyd29ya3NfZnJlZV9wYWdlX21hcChlbnRyeSk7CisJCQl9CisJCQlrZnJlZShlbnRyeSk7CisJCX0KKwl9CisJa2ZyZWUodGFibGVzKTsKK30KKworc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19jcmVhdGVfZ2F0dF9wYWdlcyhpbnQgbnJfdGFibGVzKQoreworCXN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCAqKnRhYmxlczsKKwlzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKmVudHJ5OworCWludCByZXR2YWwgPSAwOworCWludCBpOworCisJdGFibGVzID0ga21hbGxvYygobnJfdGFibGVzICsgMSkgKiBzaXplb2Yoc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwICopLCAKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAodGFibGVzID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0YWJsZXMsIDAsIHNpemVvZihzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKikgKiAobnJfdGFibGVzICsgMSkpOworCWZvciAoaSA9IDA7IGkgPCBucl90YWJsZXM7IGkrKykgeworCQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCksIEdGUF9LRVJORUwpOworCQlpZiAoZW50cnkgPT0gTlVMTCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKHN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCkpOworCQl0YWJsZXNbaV0gPSBlbnRyeTsKKwkJcmV0dmFsID0gc2VydmVyd29ya3NfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKKwkJaWYgKHJldHZhbCAhPSAwKSBicmVhazsKKwl9CisJc2VydmVyd29ya3NfcHJpdmF0ZS5udW1fdGFibGVzID0gbnJfdGFibGVzOworCXNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKKworCWlmIChyZXR2YWwgIT0gMCkgc2VydmVyd29ya3NfZnJlZV9nYXR0X3BhZ2VzKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNWUldSS1NfR0VUX0dBVFQoYWRkcikgKHNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlc1tcCisJR0VUX1BBR0VfRElSX0lEWChhZGRyKV0tPnJlbWFwcGVkKQorCisjaWZuZGVmIEdFVF9QQUdFX0RJUl9PRkYKKyNkZWZpbmUgR0VUX1BBR0VfRElSX09GRihhZGRyKSAoYWRkciA+PiAyMikKKyNlbmRpZgorCisjaWZuZGVmIEdFVF9QQUdFX0RJUl9JRFgKKyNkZWZpbmUgR0VUX1BBR0VfRElSX0lEWChhZGRyKSAoR0VUX1BBR0VfRElSX09GRihhZGRyKSAtIFwKKwlHRVRfUEFHRV9ESVJfT0ZGKGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIpKQorI2VuZGlmCisKKyNpZm5kZWYgR0VUX0dBVFRfT0ZGCisjZGVmaW5lIEdFVF9HQVRUX09GRihhZGRyKSAoKGFkZHIgJiAweDAwM2ZmMDAwKSA+PiAxMikKKyNlbmRpZgorCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWU7CisJc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwIHBhZ2VfZGlyOworCWludCByZXR2YWw7CisJdTMyIHRlbXA7CisJaW50IGk7CisKKwl2YWx1ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisJcmV0dmFsID0gc2VydmVyd29ya3NfY3JlYXRlX3BhZ2VfbWFwKCZwYWdlX2Rpcik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHNlcnZlcndvcmtzX2NyZWF0ZV9wYWdlX21hcCgmc2VydmVyd29ya3NfcHJpdmF0ZS5zY3JhdGNoX2Rpcik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXNlcnZlcndvcmtzX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyogQ3JlYXRlIGEgZmFrZSBzY3JhdGNoIGRpcmVjdG9yeSAqLworCWZvcihpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLnNjcmF0Y2hfZGlyLnJlbWFwcGVkK2kpOworCQl3cml0ZWwodmlydF90b19waHlzKHNlcnZlcndvcmtzX3ByaXZhdGUuc2NyYXRjaF9kaXIucmVhbCkgfCAxLCBwYWdlX2Rpci5yZW1hcHBlZCtpKTsKKwl9CisKKwlyZXR2YWwgPSBzZXJ2ZXJ3b3Jrc19jcmVhdGVfZ2F0dF9wYWdlcyh2YWx1ZS0+bnVtX2VudHJpZXMgLyAxMDI0KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJc2VydmVyd29ya3NfZnJlZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCQlzZXJ2ZXJ3b3Jrc19mcmVlX3BhZ2VfbWFwKCZzZXJ2ZXJ3b3Jrc19wcml2YXRlLnNjcmF0Y2hfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopcGFnZV9kaXIucmVhbDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiBfX2lvbWVtICopcGFnZV9kaXIucmVtYXBwZWQ7CisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyhwYWdlX2Rpci5yZWFsKTsKKworCS8qIEdldCB0aGUgYWRkcmVzcyBmb3IgdGhlIGdhcnQgcmVnaW9uLgorCSAqIFRoaXMgaXMgYSBidXMgYWRkcmVzcyBldmVuIG9uIHRoZSBhbHBoYSwgYi9jIGl0cworCSAqIHVzZWQgdG8gcHJvZ3JhbSB0aGUgYWdwIG1hc3RlciBub3QgdGhlIGNwdQorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldixzZXJ2ZXJ3b3Jrc19wcml2YXRlLmdhcnRfYWRkcl9vZnMsJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogQ2FsY3VsYXRlIHRoZSBhZ3Agb2Zmc2V0ICovCQorCisJZm9yKGkgPSAwOyBpIDwgdmFsdWUtPm51bV9lbnRyaWVzIC8gMTAyNDsgaSsrKQorCQl3cml0ZWwodmlydF90b19waHlzKHNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlc1tpXS0+cmVhbCl8MSwgcGFnZV9kaXIucmVtYXBwZWQraSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19mcmVlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCBwYWdlX2RpcjsKKyAgIAorCXBhZ2VfZGlyLnJlYWwgPSAodW5zaWduZWQgbG9uZyAqKWFncF9icmlkZ2UtPmdhdHRfdGFibGVfcmVhbDsKKwlwYWdlX2Rpci5yZW1hcHBlZCA9ICh1bnNpZ25lZCBsb25nIF9faW9tZW0gKilhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlOworCisJc2VydmVyd29ya3NfZnJlZV9nYXR0X3BhZ2VzKCk7CisJc2VydmVyd29ya3NfZnJlZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCXNlcnZlcndvcmtzX2ZyZWVfcGFnZV9tYXAoJnNlcnZlcndvcmtzX3ByaXZhdGUuc2NyYXRjaF9kaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwl1MzIgdGVtcDI7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKnZhbHVlczsKKworCXZhbHVlcyA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzLCZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldixzZXJ2ZXJ3b3Jrc19wcml2YXRlLmdhcnRfYWRkcl9vZnMsCisJCQkJCVNWV1JLU19TSVpFX01BU0spOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzLCZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzLHRlbXApOworCXRlbXAyICY9IFNWV1JLU19TSVpFX01BU0s7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAodGVtcDIgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY291bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFraW5nIHRoZSBhZGRyZXNzZXMKKyAqIHdyaXR0ZW4gdG8gdGhlIEdBVFQsIGFuZCBmbHVzaGluZyB0aGVtIGluZGl2aWR1YWxseS4gIEhvd2V2ZXIKKyAqIGN1cnJlbnRseSBpdCBqdXN0IGZsdXNoZXMgdGhlIHdob2xlIHRhYmxlLiAgV2hpY2ggaXMgcHJvYmFibHkKKyAqIG1vcmUgZWZmaWNlbnQsIHNpbmNlIGFncF9tZW1vcnkgYmxvY2tzIGNhbiBiZSBhIGxhcmdlIG51bWJlciBvZgorICogZW50cmllcy4KKyAqLworc3RhdGljIHZvaWQgc2VydmVyd29ya3NfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKnRlbXApCit7CisJd3JpdGViKDEsIHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19QT1NURkxVU0gpOworCXdoaWxlIChyZWFkYihzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycytTVldSS1NfUE9TVEZMVVNIKSA9PSAxKQorCQljcHVfcmVsYXgoKTsKKworCXdyaXRlbCgxLCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycytTVldSS1NfRElSRkxVU0gpOworCXdoaWxlKHJlYWRsKHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19ESVJGTFVTSCkgPT0gMSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfY29uZmlndXJlKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKmN1cnJlbnRfc2l6ZTsKKwl1MzIgdGVtcDsKKwl1OCBlbmFibGVfcmVnOworCXUxNiBjYXBfcmVnOworCisJY3VycmVudF9zaXplID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIEdldCB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLm1tX2FkZHJfb2ZzLCAmdGVtcCk7CisJdGVtcCA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKSBpb3JlbWFwKHRlbXAsIDQwOTYpOworCWlmICghc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBpb3JlbWFwKCkgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdyaXRlYigweEEsIHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19HQVJUX0NBQ0hFKTsKKwlyZWFkYihzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycytTVldSS1NfR0FSVF9DQUNIRSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIsIHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19HQVRUQkFTRSk7CisJcmVhZGwoc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMrU1ZXUktTX0dBVFRCQVNFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwljYXBfcmVnID0gcmVhZHcoc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMrU1ZXUktTX0NPTU1BTkQpOworCWNhcF9yZWcgJj0gfjB4MDAwNzsKKwljYXBfcmVnIHw9IDB4NDsKKwl3cml0ZXcoY2FwX3JlZywgc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMrU1ZXUktTX0NPTU1BTkQpOworCXJlYWR3KHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19DT01NQU5EKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNlcnZlcndvcmtzX3ByaXZhdGUuc3Zyd3Jrc19kZXYsU1ZXUktTX0FHUF9FTkFCTEUsICZlbmFibGVfcmVnKTsKKwllbmFibGVfcmVnIHw9IDB4MTsgLyogQWdwIEVuYWJsZSBiaXQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoc2VydmVyd29ya3NfcHJpdmF0ZS5zdnJ3cmtzX2RldixTVldSS1NfQUdQX0VOQUJMRSwgZW5hYmxlX3JlZyk7CisJc2VydmVyd29ya3NfdGxiZmx1c2goTlVMTCk7CisKKwlhZ3BfYnJpZGdlLT5jYXBuZHggPSBwY2lfZmluZF9jYXBhYmlsaXR5KHNlcnZlcndvcmtzX3ByaXZhdGUuc3Zyd3Jrc19kZXYsIFBDSV9DQVBfSURfQUdQKTsKKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2VydmVyd29ya3NfcHJpdmF0ZS5zdnJ3cmtzX2RldiwKKwkJCSAgICAgIGFncF9icmlkZ2UtPmNhcG5keCtQQ0lfQUdQX1NUQVRVUywgJmFncF9icmlkZ2UtPm1vZGUpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTVldSS1NfQ0FDSElORywgJmVuYWJsZV9yZWcpOworCWVuYWJsZV9yZWcgJj0gfjB4MzsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTVldSS1NfQ0FDSElORywgZW5hYmxlX3JlZyk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFNWV1JLU19GRUFUVVJFLCAmZW5hYmxlX3JlZyk7CisJZW5hYmxlX3JlZyB8PSAoMTw8Nik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldixTVldSS1NfRkVBVFVSRSwgZW5hYmxlX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VydmVyd29ya3NfY2xlYW51cCh2b2lkKQoreworCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAorCQkJICAgICBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIGosIG51bV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqY3VyX2dhdHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaiA9IHBnX3N0YXJ0OworCXdoaWxlIChqIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSkgeworCQlhZGRyID0gKGogKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBTVlJXUktTX0dFVF9HQVRUKGFkZHIpOworCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWorKzsKKwl9CisKKwlpZiAobWVtLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOworCX0KKworCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJYWRkciA9IChqICogUEFHRV9TSVpFKSArIGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCWN1cl9nYXR0ID0gU1ZSV1JLU19HRVRfR0FUVChhZGRyKTsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwgbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CisJfQorCXNlcnZlcndvcmtzX3RsYmZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKKwkJCSAgICAgaW50IHR5cGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBfX2lvbWVtICpjdXJfZ2F0dDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCXNlcnZlcndvcmtzX3RsYmZsdXNoKG1lbSk7CisKKwlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChtZW0tPnBhZ2VfY291bnQgKyBwZ19zdGFydCk7IGkrKykgeworCQlhZGRyID0gKGkgKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBTVlJXUktTX0dFVF9HQVRUKGFkZHIpOworCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOworCX0KKworCXNlcnZlcndvcmtzX3RsYmZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIHNlcnZlcndvcmtzX21hc2tzW10gPQoreworCXsubWFzayA9IDEsIC50eXBlID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiBzZXJ2ZXJ3b3Jrc19zaXplc1s3XSA9Cit7CisJezIwNDgsIDUyNDI4OCwgMHg4MDAwMDAwMH0sCisJezEwMjQsIDI2MjE0NCwgMHhjMDAwMDAwMH0sCisJezUxMiwgMTMxMDcyLCAweGUwMDAwMDAwfSwKKwl7MjU2LCA2NTUzNiwgMHhmMDAwMDAwMH0sCisJezEyOCwgMzI3NjgsIDB4ZjgwMDAwMDB9LAorCXs2NCwgMTYzODQsIDB4ZmMwMDAwMDB9LAorCXszMiwgODE5MiwgMHhmZTAwMDAwMH0KK307CisKK3N0YXRpYyB2b2lkIHNlcnZlcndvcmtzX2FncF9lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSkKK3sKKwl1MzIgY29tbWFuZDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzZXJ2ZXJ3b3Jrc19wcml2YXRlLnN2cndya3NfZGV2LAorCQkJICAgICAgYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX1NUQVRVUywKKwkJCSAgICAgICZjb21tYW5kKTsKKworCWNvbW1hbmQgPSBhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKGJyaWRnZSwgbW9kZSwgY29tbWFuZCk7CisKKwljb21tYW5kICY9IH4weDEwOwkvKiBkaXNhYmxlIEZXICovCisJY29tbWFuZCAmPSB+MHgwODsKKworCWNvbW1hbmQgfD0gMHgxMDA7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNlcnZlcndvcmtzX3ByaXZhdGUuc3Zyd3Jrc19kZXYsCisJCQkgICAgICAgYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX0NPTU1BTkQsCisJCQkgICAgICAgY29tbWFuZCk7CisKKwlhZ3BfZGV2aWNlX2NvbW1hbmQoY29tbWFuZCwgMCk7Cit9CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBzd29ya3NfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IHNlcnZlcndvcmtzX3NpemVzLAorCS5zaXplX3R5cGUJCT0gTFZMMl9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBzZXJ2ZXJ3b3Jrc19jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gc2VydmVyd29ya3NfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBzZXJ2ZXJ3b3Jrc19jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gc2VydmVyd29ya3NfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gc2VydmVyd29ya3NfbWFza3MsCisJLmFncF9lbmFibGUJCT0gc2VydmVyd29ya3NfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IHNlcnZlcndvcmtzX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBzZXJ2ZXJ3b3Jrc19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gc2VydmVyd29ya3NfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBzZXJ2ZXJ3b3Jrc19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3Bfc2VydmVyd29ya3NfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OworCXUzMiB0ZW1wLCB0ZW1wMjsKKwl1OCBjYXBfcHRyID0gMDsKKworCS8qIEV2ZXJ5dGhpbmcgaXMgb24gZnVuYyAxIGhlcmUgc28gd2UgYXJlIGhhcmRjb2RpbmcgZnVuY3Rpb24gb25lICovCisJYnJpZGdlX2RldiA9IHBjaV9maW5kX3Nsb3QoKHVuc2lnbmVkIGludClwZGV2LT5idXMtPm51bWJlciwKKwkJCVBDSV9ERVZGTigwLCAxKSk7CisJaWYgKCFicmlkZ2VfZGV2KSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBhIFNlcnZlcndvcmtzIGNoaXBzZXQgIgorCQkgICAgICAgImJ1dCBjb3VsZCBub3QgZmluZCB0aGUgc2Vjb25kYXJ5IGRldmljZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgMHgwMDA2OgorCQkvKiBTZXJ2ZXJXb3JrcyBDTkIyMEhFCisJCUZhaWwgc2lsZW50bHkuKi8KKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkRldGVjdGVkIFNlcnZlcldvcmtzIENOQjIwSEUgY2hpcHNldDogTm8gQUdQIHByZXNlbnQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSEU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0xFOgorCWNhc2UgMHgwMDA3OgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChjYXBfcHRyKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgU2VydmVyd29ya3MgY2hpcHNldCAiCisJCQkJCSIoZGV2aWNlIGlkOiAlMDR4KVxuIiwgcGRldi0+ZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2VydmVyd29ya3NfcHJpdmF0ZS5zdnJ3cmtzX2RldiA9IGJyaWRnZV9kZXY7CisJc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzID0gMHgxMDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBTVldSS1NfQVBTSVpFLCAmdGVtcCk7CisJaWYgKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBTVldSS1NfQVBTSVpFICsgNCwgJnRlbXAyKTsKKwkJaWYgKHRlbXAyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCA2NCBiaXQgYXBlcnR1cmUgYWRkcmVzcywgIgorCQkJICAgICAgICJidXQgdG9wIGJpdHMgYXJlIG5vdCB6ZXJvLiAgRGlzYWJsaW5nIGFncFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlzZXJ2ZXJ3b3Jrc19wcml2YXRlLm1tX2FkZHJfb2ZzID0gMHgxODsKKwl9IGVsc2UKKwkJc2VydmVyd29ya3NfcHJpdmF0ZS5tbV9hZGRyX29mcyA9IDB4MTQ7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgc2VydmVyd29ya3NfcHJpdmF0ZS5tbV9hZGRyX29mcywgJnRlbXApOworCWlmICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCQlzZXJ2ZXJ3b3Jrc19wcml2YXRlLm1tX2FkZHJfb2ZzICsgNCwgJnRlbXAyKTsKKwkJaWYgKHRlbXAyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCA2NCBiaXQgTU1JTyBhZGRyZXNzLCAiCisJCQkgICAgICAgImJ1dCB0b3AgYml0cyBhcmUgbm90IHplcm8uICBEaXNhYmxpbmcgYWdwXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJYnJpZGdlID0gYWdwX2FsbG9jX2JyaWRnZSgpOworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJyaWRnZS0+ZHJpdmVyID0gJnN3b3Jrc19kcml2ZXI7CisJYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhID0gJnNlcnZlcndvcmtzX3ByaXZhdGUsCisJYnJpZGdlLT5kZXYgPSBwZGV2OworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRnZSk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ3Bfc2VydmVyd29ya3NfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFncF9yZW1vdmVfYnJpZGdlKGJyaWRnZSk7CisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9zZXJ2ZXJ3b3Jrc19wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsCisJLmRldmljZQkJPSBQQ0lfQU5ZX0lELAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdwX3NlcnZlcndvcmtzX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3Bfc2VydmVyd29ya3NfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWdwZ2FydC1zZXJ2ZXJ3b3JrcyIsCisJLmlkX3RhYmxlCT0gYWdwX3NlcnZlcndvcmtzX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX3NlcnZlcndvcmtzX3Byb2JlLAorCS5yZW1vdmUJCT0gYWdwX3NlcnZlcndvcmtzX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFncF9zZXJ2ZXJ3b3Jrc19pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3Bfc2VydmVyd29ya3NfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3Bfc2VydmVyd29ya3NfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdwX3NlcnZlcndvcmtzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3Bfc2VydmVyd29ya3NfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3Bfc2VydmVyd29ya3NfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjQ4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCkBAIC0wLDAgKzEsNjQ3IEBACisvKgorICogVW5pTm9ydGggQUdQR0FSVCByb3V0aW5lcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91bmlub3J0aC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworLyoKKyAqIE5PVEVTIGZvciB1bmlub3J0aDMgKEc1IEFHUCkgc3VwcG9ydHMgOgorICoKKyAqIFRoZXJlIG1heWJlIGFsc28gcG9zc2liaWxpdHkgdG8gaGF2ZSBiaWdnZXIgY2FjaGUgbGluZSBzaXplIGZvcgorICogYWdwIChzZWUgcG1hY19wY2kuYyBhbmQgbG9vayBmb3IgY2FjaGUgbGluZSkuIE5lZWQgdG8gYmUgaW52ZXN0aWdhdGVkCisgKiBieSBzb21lb25lLgorICoKKyAqIFBBR0Ugc2l6ZSBhcmUgaGFyZGNvZGVkIGJ1dCB0aGlzIG1heSBjaGFuZ2UsIHNlZSBhc20vcGFnZS5oLgorICoKKyAqIEplcm9tZSBHbGlzc2UgPGouZ2xpc3NlQGdtYWlsLmNvbT4KKyAqLworc3RhdGljIGludCB1bmlub3J0aF9yZXY7CitzdGF0aWMgaW50IGlzX3UzOworCitzdGF0aWMgaW50IHVuaW5vcnRoX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlczsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0JBU0UsICZ0ZW1wKTsKKwl0ZW1wICY9IH4oMHhmZmZmZjAwMCk7CisJdmFsdWVzID0gQV9TSVpFXzMyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKworCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgMSk7CisJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSAxOworCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bmlub3J0aF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiBjdHJsID0gVU5JX05fQ0ZHX0dBUlRfRU5BQkxFOworCisJaWYgKGlzX3UzKQorCQljdHJsIHw9IFUzX05fQ0ZHX0dBUlRfUEVSRlJEOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9DVFJMLAorCQkJICAgICAgIGN0cmwgfCBVTklfTl9DRkdfR0FSVF9JTlZBTCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0NUUkwsIGN0cmwpOworCisJaWYgKHVuaW5vcnRoX3JldiA8PSAweDMwKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9DVFJMLAorCQkJCSAgICAgICBjdHJsIHwgVU5JX05fQ0ZHX0dBUlRfMnhSRVNFVCk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9DVFJMLAorCQkJCSAgICAgICBjdHJsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5vcnRoX2NsZWFudXAodm9pZCkKK3sKKwl1MzIgdG1wOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwgJnRtcCk7CisJaWYgKCEodG1wICYgVU5JX05fQ0ZHX0dBUlRfRU5BQkxFKSkKKwkJcmV0dXJuOworCXRtcCB8PSBVTklfTl9DRkdfR0FSVF9JTlZBTDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwgdG1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwgMCk7CisKKwlpZiAodW5pbm9ydGhfcmV2IDw9IDB4MzApIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0NUUkwsCisJCQkJICAgICAgIFVOSV9OX0NGR19HQVJUXzJ4UkVTRVQpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwKKwkJCQkgICAgICAgMCk7CisJfQorfQorCitzdGF0aWMgaW50IHVuaW5vcnRoX2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqY3VycmVudF9zaXplOworCQorCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV8zMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImNvbmZpZ3VyaW5nIGZvciBzaXplIGlkeDogJWRcbiIsCisJICAgICAgIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisJCisJLyogYXBlcnR1cmUgc2l6ZSBhbmQgZ2F0dCBhZGRyICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsCisJCVVOSV9OX0NGR19HQVJUX0JBU0UsCisJCShhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICYgMHhmZmZmZjAwMCkKKwkJCXwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIEhBQ0sgQUxFUlQKKwkgKiBVbmlOb3J0aCBzZWVtIHRvIGJlIGJ1Z2d5IGVub3VnaCBub3QgdG8gaGFuZGxlIHByb3Blcmx5IHdoZW4KKwkgKiB0aGUgQUdQIGFwZXJ0dXJlIGlzbid0IG1hcHBlZCBhdCBidXMgcGh5c2ljYWwgYWRkcmVzcyAwCisJICovCisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IDA7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJLyogQXNzdW1lIFUzIG9yIGxhdGVyIG9uIFBQQzY0IHN5c3RlbXMgKi8KKwkvKiBoaWdoIDQgYml0cyBvZiBHQVJUIHBoeXNpY2FsIGFkZHJlc3MgZ28gaW4gVU5JX05fQ0ZHX0FHUF9CQVNFICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19BR1BfQkFTRSwKKwkJCSAgICAgICAoYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA+PiAzMikgJiAweGYpOworI2Vsc2UKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwKKwkJVU5JX05fQ0ZHX0FHUF9CQVNFLCBhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyKTsKKyNlbmRpZgorCisJaWYgKGlzX3UzKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LAorCQkJCSAgICAgICBVTklfTl9DRkdfR0FSVF9EVU1NWV9QQUdFLAorCQkJCSAgICAgICBhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2VfcmVhbCA+PiAxMik7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVuaW5vcnRoX2luc2VydF9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCisJCQkJaW50IHR5cGUpCit7CisJaW50IGksIGosIG51bV9lbnRyaWVzOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCW51bV9lbnRyaWVzID0gQV9TSVpFXzMyKHRlbXApLT5udW1fZW50cmllczsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCS8qIFdlIGtub3cgbm90aGluZyBvZiBtZW1vcnkgdHlwZXMgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKGFncF9icmlkZ2UtPmdhdHRfdGFibGVbal0pCisJCQlyZXR1cm4gLUVCVVNZOworCQlqKys7CisJfQorCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlW2pdID0KKwkJICAgIGNwdV90b19sZTMyKChtZW0tPm1lbW9yeVtpXSAmIDB4RkZGRkYwMDBVTCkgfCAweDFVTCk7CisJCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylfX3ZhKG1lbS0+bWVtb3J5W2ldKSwKKwkJCQkgICAodW5zaWduZWQgbG9uZylfX3ZhKG1lbS0+bWVtb3J5W2ldKSsweDEwMDApOworCX0KKwkodm9pZClpbl9sZTMyKCh2b2xhdGlsZSB1MzIqKSZhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlW3BnX3N0YXJ0XSk7CisJbWIoKTsKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpJmFncF9icmlkZ2UtPmdhdHRfdGFibGVbcGdfc3RhcnRdLCAKKwkJKHVuc2lnbmVkIGxvbmcpJmFncF9icmlkZ2UtPmdhdHRfdGFibGVbcGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnRdKTsKKworCXVuaW5vcnRoX3RsYmZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdTNfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIG51bV9lbnRyaWVzOworCXZvaWQgKnRlbXA7CisJdTMyICpncDsKKworCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfMzIodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkKKwkJLyogV2Uga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdwID0gKHUzMiAqKSAmYWdwX2JyaWRnZS0+Z2F0dF90YWJsZVtwZ19zdGFydF07CisJZm9yIChpID0gMDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgKytpKSB7CisJCWlmIChncFtpXSkgeworCQkJcHJpbnRrKCJ1M19pbnNlcnRfbWVtb3J5OiBlbnRyeSAweCV4IG9jY3VwaWVkICgleClcbiIsCisJCQkgICAgICAgaSwgZ3BbaV0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKykgeworCQlncFtpXSA9IChtZW0tPm1lbW9yeVtpXSA+PiBQQUdFX1NISUZUKSB8IDB4ODAwMDAwMDBVTDsKKwkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKV9fdmEobWVtLT5tZW1vcnlbaV0pLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKV9fdmEobWVtLT5tZW1vcnlbaV0pKzB4MTAwMCk7CisJfQorCW1iKCk7CisJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWdwLCAodW5zaWduZWQgbG9uZykgJmdwW2ldKTsKKwl1bmlub3J0aF90bGJmbHVzaChtZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1M19yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlzaXplX3QgaTsKKwl1MzIgKmdwOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkKKwkJLyogV2Uga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWdwID0gKHUzMiAqKSAmYWdwX2JyaWRnZS0+Z2F0dF90YWJsZVtwZ19zdGFydF07CisJZm9yIChpID0gMDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgKytpKQorCQlncFtpXSA9IDA7CisJbWIoKTsKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpZ3AsICh1bnNpZ25lZCBsb25nKSAmZ3BbaV0pOworCXVuaW5vcnRoX3RsYmZsdXNoKG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5pbm9ydGhfYWdwX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXUzMiBjb21tYW5kLCBzY3JhdGNoLCBzdGF0dXM7CisJaW50IHRpbWVvdXQ7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLT5kZXYsCisJCQkgICAgICBicmlkZ2UtPmNhcG5keCArIFBDSV9BR1BfU1RBVFVTLAorCQkJICAgICAgJnN0YXR1cyk7CisKKwljb21tYW5kID0gYWdwX2NvbGxlY3RfZGV2aWNlX3N0YXR1cyhicmlkZ2UsIG1vZGUsIHN0YXR1cyk7CisJY29tbWFuZCB8PSBQQ0lfQUdQX0NPTU1BTkRfQUdQOworCQorCWlmICh1bmlub3J0aF9yZXYgPT0gMHgyMSkgeworCQkvKgorCQkgKiBEYXJ3aW4gZGlzYWJsZSBBR1AgNHggb24gdGhpcyByZXZpc2lvbiwgdGh1cyB3ZQorCQkgKiBtYXkgYXNzdW1lIGl0J3MgYnJva2VuLiBUaGlzIGlzIGFuIEFHUDIgY29udHJvbGxlci4KKwkJICovCisJCWNvbW1hbmQgJj0gfkFHUFNUQVQyXzRYOworCX0KKworCWlmICgodW5pbm9ydGhfcmV2ID49IDB4MzApICYmICh1bmlub3J0aF9yZXYgPD0gMHgzMykpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byB0byBzZXQgUkVRX0RFUFRIIHRvIDcgZm9yIFUzIHZlcnNpb25zIDEuMCwgMi4xLAorCQkgKiAyLjIgYW5kIDIuMywgRGFyd2luIGRvIHNvLgorCQkgKi8KKwkJaWYgKChjb21tYW5kID4+IEFHUFNUQVRfUlFfREVQVEhfU0hJRlQpID4gNykKKwkJCWNvbW1hbmQgPSAoY29tbWFuZCAmIH5BR1BTVEFUX1JRX0RFUFRIKQorCQkJCXwgKDcgPDwgQUdQU1RBVF9SUV9ERVBUSF9TSElGVCk7CisJfQorCisJdW5pbm9ydGhfdGxiZmx1c2goTlVMTCk7CisKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLT5kZXYsCisJCQkJICAgICAgIGJyaWRnZS0+Y2FwbmR4ICsgUENJX0FHUF9DT01NQU5ELAorCQkJCSAgICAgICBjb21tYW5kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LAorCQkJCSAgICAgIGJyaWRnZS0+Y2FwbmR4ICsgUENJX0FHUF9DT01NQU5ELAorCQkJCSAgICAgICAmc2NyYXRjaCk7CisJfSB3aGlsZSAoKHNjcmF0Y2ggJiBQQ0lfQUdQX0NPTU1BTkRfQUdQKSA9PSAwICYmICsrdGltZW91dCA8IDEwMDApOworCWlmICgoc2NyYXRjaCAmIFBDSV9BR1BfQ09NTUFORF9BR1ApID09IDApCisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byB3cml0ZSBVbmlOb3J0aCBBR1AgY29tbWFuZCByZWdcbiIpOworCisJaWYgKHVuaW5vcnRoX3JldiA+PSAweDMwKSB7CisJCS8qIFRoaXMgaXMgYW4gQUdQIFYzICovCisJCWFncF9kZXZpY2VfY29tbWFuZChjb21tYW5kLCAoc3RhdHVzICYgQUdQU1RBVF9NT0RFXzNfMCkpOworCX0gZWxzZSB7CisJCS8qIEFHUCBWMiAqLworCQlhZ3BfZGV2aWNlX2NvbW1hbmQoY29tbWFuZCwgMCk7CisJfQorCisJdW5pbm9ydGhfdGxiZmx1c2goTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWdwX3VuaW5vcnRoX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwl1MzIgY21kOworCXU4IGFncDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2aWNlID0gTlVMTDsKKworCWlmIChzdGF0ZSAhPSBQTVNHX1NVU1BFTkQpCisJCXJldHVybiAwOworCisJLyogdHVybiBvZmYgQUdQIG9uIHRoZSB2aWRlbyBjaGlwLCBpZiBpdCB3YXMgZW5hYmxlZCAqLworCWZvcl9lYWNoX3BjaV9kZXYoZGV2aWNlKSB7CisJCS8qIERvbid0IHRvdWNoIHRoZSBicmlkZ2UgeWV0LCBkZXZpY2UgZmlyc3QgKi8KKwkJaWYgKGRldmljZSA9PSBwZGV2KQorCQkJY29udGludWU7CisJCS8qIE9ubHkgZGVhbCB3aXRoIGRldmljZXMgb24gdGhlIHNhbWUgYnVzIGhlcmUsIG5vIE1hYyBoYXMgYSBQMlAKKwkJICogYnJpZGdlIG9uIHRoZSBBR1AgcG9ydCwgYW5kIG11Y2tpbmcgYXJvdW5kIHRoZSBlbnRpcmUgUENJCisJCSAqIHRyZWUgaXMgc291cmNlIG9mIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMgYmVjYXVzZSBvZiBhIGJ1ZworCQkgKiBpbiBzb21lIHZlcnNpb25zIG9mIHBjaV9maW5kX2NhcGFiaWxpdHkoKSB3aGVuIGhpdHRpbmcgYSBkZWFkCisJCSAqIGRldmljZQorCQkgKi8KKwkJaWYgKGRldmljZS0+YnVzICE9IHBkZXYtPmJ1cykKKwkJCWNvbnRpbnVlOworCQlhZ3AgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldmljZSwgUENJX0NBUF9JRF9BR1ApOworCQlpZiAoIWFncCkKKwkJCWNvbnRpbnVlOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2aWNlLCBhZ3AgKyBQQ0lfQUdQX0NPTU1BTkQsICZjbWQpOworCQlpZiAoIShjbWQgJiBQQ0lfQUdQX0NPTU1BTkRfQUdQKSkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoInVuaW5vcnRoLWFncDogZGlzYWJsaW5nIEFHUCBvbiBkZXZpY2UgJXNcbiIsCisJCQkJcGNpX25hbWUoZGV2aWNlKSk7CisJCWNtZCAmPSB+UENJX0FHUF9DT01NQU5EX0FHUDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZpY2UsIGFncCArIFBDSV9BR1BfQ09NTUFORCwgY21kKTsKKwl9CisKKwkvKiB0dXJuIG9mZiBBR1Agb24gdGhlIGJyaWRnZSAqLworCWFncCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBhZ3AgKyBQQ0lfQUdQX0NPTU1BTkQsICZjbWQpOworCWlmIChjbWQgJiBQQ0lfQUdQX0NPTU1BTkRfQUdQKSB7CisJCXByaW50aygidW5pbm9ydGgtYWdwOiBkaXNhYmxpbmcgQUdQIG9uIGJyaWRnZSAlc1xuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCWNtZCAmPSB+UENJX0FHUF9DT01NQU5EX0FHUDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZ3AgKyBQQ0lfQUdQX0NPTU1BTkQsIGNtZCk7CisJfQorCS8qIHR1cm4gb2ZmIHRoZSBHQVJUICovCisJdW5pbm9ydGhfY2xlYW51cCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwX3VuaW5vcnRoX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHVuaW5vcnRoX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwljaGFyICp0YWJsZTsKKwljaGFyICp0YWJsZV9lbmQ7CisJaW50IHNpemU7CisJaW50IHBhZ2Vfb3JkZXI7CisJaW50IG51bV9lbnRyaWVzOworCWludCBpOworCXZvaWQgKnRlbXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKiBXZSBjYW4ndCBoYW5kbGUgMiBsZXZlbCBnYXR0J3MgKi8KKwlpZiAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSA9PSBMVkwyX0FQRVJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YWJsZSA9IE5VTEw7CisJaSA9IGJyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHg7CisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCXNpemUgPSBwYWdlX29yZGVyID0gbnVtX2VudHJpZXMgPSAwOworCisJZG8geworCQlzaXplID0gQV9TSVpFXzMyKHRlbXApLT5zaXplOworCQlwYWdlX29yZGVyID0gQV9TSVpFXzMyKHRlbXApLT5wYWdlX29yZGVyOworCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwkJdGFibGUgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2Vfb3JkZXIpOworCisJCWlmICh0YWJsZSA9PSBOVUxMKSB7CisJCQlpKys7CisJCQlicmlkZ2UtPmN1cnJlbnRfc2l6ZSA9IEFfSURYMzIoYnJpZGdlKTsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQl9CisJfSB3aGlsZSAoIXRhYmxlICYmIChpIDwgYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplcykpOworCisJaWYgKHRhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGFibGVfZW5kID0gdGFibGUgKyAoKFBBR0VfU0laRSAqICgxIDw8IHBhZ2Vfb3JkZXIpKSAtIDEpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHRhYmxlKTsgcGFnZSA8PSB2aXJ0X3RvX3BhZ2UodGFibGVfZW5kKTsgcGFnZSsrKQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlicmlkZ2UtPmdhdHRfdGFibGVfcmVhbCA9ICh1MzIgKikgdGFibGU7CisJYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiAqKXRhYmxlOworCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyh0YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykKKwkJYnJpZGdlLT5nYXR0X3RhYmxlW2ldID0gMDsKKworCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0YWJsZSwgKHVuc2lnbmVkIGxvbmcpdGFibGVfZW5kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVuaW5vcnRoX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IHBhZ2Vfb3JkZXI7CisJY2hhciAqdGFibGUsICp0YWJsZV9lbmQ7CisJdm9pZCAqdGVtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXRlbXAgPSBicmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwlwYWdlX29yZGVyID0gQV9TSVpFXzMyKHRlbXApLT5wYWdlX29yZGVyOworCisJLyogRG8gbm90IHdvcnJ5IGFib3V0IGZyZWVpbmcgbWVtb3J5LCBiZWNhdXNlIGlmIHRoaXMgaXMKKwkgKiBjYWxsZWQsIHRoZW4gYWxsIGFncCBtZW1vcnkgaXMgZGVhbGxvY2F0ZWQgYW5kIHJlbW92ZWQKKwkgKiBmcm9tIHRoZSB0YWJsZS4KKwkgKi8KKworCXRhYmxlID0gKGNoYXIgKikgYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWw7CisJdGFibGVfZW5kID0gdGFibGUgKyAoKFBBR0VfU0laRSAqICgxIDw8IHBhZ2Vfb3JkZXIpKSAtIDEpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHRhYmxlKTsgcGFnZSA8PSB2aXJ0X3RvX3BhZ2UodGFibGVfZW5kKTsgcGFnZSsrKQorCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGJyaWRnZS0+Z2F0dF90YWJsZV9yZWFsLCBwYWdlX29yZGVyKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG51bGxfY2FjaGVfZmx1c2godm9pZCkKK3sKKwltYigpOworfQorCisvKiBTZXR1cCBmdW5jdGlvbiAqLworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIHVuaW5vcnRoX3NpemVzWzddID0KK3sKKyNpZiAwIC8qIE5vdCBzdXJlIHVuaW5vcnRoIHN1cHBvcnRzIHRoYXQgaGlnaCBhcGVydHVyZSBzaXplcyAqLworCXsyNTYsIDY1NTM2LCA2LCA2NH0sCisJezEyOCwgMzI3NjgsIDUsIDMyfSwKKwl7NjQsIDE2Mzg0LCA0LCAxNn0sCisjZW5kaWYJCisJezMyLCA4MTkyLCAzLCA4fSwKKwl7MTYsIDQwOTYsIDIsIDR9LAorCXs4LCAyMDQ4LCAxLCAyfSwKKwl7NCwgMTAyNCwgMCwgMX0KK307CisKKy8qCisgKiBOb3Qgc3VyZSB0aGF0IHUzIHN1cHBvcnRzIHRoYXQgaGlnaCBhcGVydHVyZSBzaXplcyBidXQgaXQKKyAqIHdvdWxkIHN0cmFuZ2UgaWYgaXQgZGlkIG5vdCA6KQorICovCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIHUzX3NpemVzWzhdID0KK3sKKwl7NTEyLCAxMzEwNzIsIDcsIDEyOH0sCisJezI1NiwgNjU1MzYsIDYsIDY0fSwKKwl7MTI4LCAzMjc2OCwgNSwgMzJ9LAorCXs2NCwgMTYzODQsIDQsIDE2fSwKKwl7MzIsIDgxOTIsIDMsIDh9LAorCXsxNiwgNDA5NiwgMiwgNH0sCisJezgsIDIwNDgsIDEsIDJ9LAorCXs0LCAxMDI0LCAwLCAxfQorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIHVuaW5vcnRoX2FncF9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gKHZvaWQgKil1bmlub3J0aF9zaXplcywKKwkuc2l6ZV90eXBlCQk9IFUzMl9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDQsCisJLmNvbmZpZ3VyZQkJPSB1bmlub3J0aF9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gdW5pbm9ydGhfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSB1bmlub3J0aF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gdW5pbm9ydGhfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gTlVMTCwKKwkuY2FjaGVfZmx1c2gJCT0gbnVsbF9jYWNoZV9mbHVzaCwKKwkuYWdwX2VuYWJsZQkJPSB1bmlub3J0aF9hZ3BfZW5hYmxlLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IHVuaW5vcnRoX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSB1bmlub3J0aF9mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gdW5pbm9ydGhfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB1M19hZ3BfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9ICh2b2lkICopdTNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVMzJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA4LAorCS5jb25maWd1cmUJCT0gdW5pbm9ydGhfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IHVuaW5vcnRoX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gdW5pbm9ydGhfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IHVuaW5vcnRoX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IE5VTEwsCisJLmNhY2hlX2ZsdXNoCQk9IG51bGxfY2FjaGVfZmx1c2gsCisJLmFncF9lbmFibGUJCT0gdW5pbm9ydGhfYWdwX2VuYWJsZSwKKwkuY3JlYXRlX2dhdHRfdGFibGUJPSB1bmlub3J0aF9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gdW5pbm9ydGhfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IHUzX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gdTNfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCisJLm5lZWRzX3NjcmF0Y2hfcGFnZQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIHVuaW5vcnRoX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJVbmlOb3J0aCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUF9QLAorCQkuY2hpcHNldF9uYW1lCT0gIlVuaU5vcnRoL1BhbmdlYSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUDE1LAorCQkuY2hpcHNldF9uYW1lCT0gIlVuaU5vcnRoIDEuNSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUDIsCisJCS5jaGlwc2V0X25hbWUJPSAiVW5pTm9ydGggMiIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1UzX0FHUCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJVMyIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1UzTF9BR1AsCisJCS5jaGlwc2V0X25hbWUJPSAiVTNMIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVBQTEVfVTNIX0FHUCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJVM0giLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfdW5pbm9ydGhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFncF9kZXZpY2VfaWRzICpkZXZzID0gdW5pbm9ydGhfYWdwX2RldmljZV9pZHM7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdW5pbm9ydGhfbm9kZTsKKwl1OCBjYXBfcHRyOworCWludCBqOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmIChjYXBfcHRyID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogcHJvYmUgZm9yIGtub3duIGNoaXBzZXRzICovCisJZm9yIChqID0gMDsgZGV2c1tqXS5jaGlwc2V0X25hbWUgIT0gTlVMTDsgKytqKSB7CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gZGV2c1tqXS5kZXZpY2VfaWQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBcHBsZSAlcyBjaGlwc2V0XG4iLAorCQkJICAgICAgIGRldnNbal0uY2hpcHNldF9uYW1lKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJVbnN1cHBvcnRlZCBBcHBsZSBjaGlwc2V0IChkZXZpY2UgaWQ6ICUwNHgpLlxuIiwKKwkJcGRldi0+ZGV2aWNlKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworIGZvdW5kOgorCS8qIFNldCByZXZpc2lvbiB0byAwIGlmIHdlIGNvdWxkIG5vdCByZWFkIGl0LiAqLworCXVuaW5vcnRoX3JldiA9IDA7CisJaXNfdTMgPSAwOworCS8qIExvY2F0ZSBjb3JlOTkgVW5pLU4gKi8KKwl1bmlub3J0aF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInVuaS1uIik7CisJLyogTG9jYXRlIEc1IHUzICovCisJaWYgKHVuaW5vcnRoX25vZGUgPT0gTlVMTCkgeworCQlpc191MyA9IDE7CisJCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTMiKTsKKwl9CisJaWYgKHVuaW5vcnRoX25vZGUpIHsKKwkJaW50ICpyZXZwcm9wID0gKGludCAqKQorCQkJZ2V0X3Byb3BlcnR5KHVuaW5vcnRoX25vZGUsICJkZXZpY2UtcmV2IiwgTlVMTCk7CisJCWlmIChyZXZwcm9wICE9IE5VTEwpCisJCQl1bmlub3J0aF9yZXYgPSAqcmV2cHJvcCAmIDB4M2Y7CisJCW9mX25vZGVfcHV0KHVuaW5vcnRoX25vZGUpOworCX0KKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaXNfdTMpCisJCWJyaWRnZS0+ZHJpdmVyID0gJnUzX2FncF9kcml2ZXI7CisJZWxzZQorCQlicmlkZ2UtPmRyaXZlciA9ICZ1bmlub3J0aF9hZ3BfZHJpdmVyOworCisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKwlicmlkZ2UtPmZsYWdzID0gQUdQX0VSUkFUQV9GQVNUV1JJVEVTOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjYXBfcHRyK1BDSV9BR1BfU1RBVFVTLCAmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX3VuaW5vcnRoX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfdW5pbm9ydGhfcGNpX3RhYmxlW10gPSB7CisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FQUExFLAorCS5kZXZpY2UJCT0gUENJX0FOWV9JRCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF91bmlub3J0aF9wY2lfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWdwX3VuaW5vcnRoX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtdW5pbm9ydGgiLAorCS5pZF90YWJsZQk9IGFncF91bmlub3J0aF9wY2lfdGFibGUsCisJLnByb2JlCQk9IGFncF91bmlub3J0aF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF91bmlub3J0aF9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBhZ3BfdW5pbm9ydGhfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFncF91bmlub3J0aF9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFncF91bmlub3J0aF9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfdW5pbm9ydGhfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfdW5pbm9ydGhfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdwX3VuaW5vcnRoX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfdW5pbm9ydGhfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfdW5pbm9ydGhfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkJlbiBIZXJyZW5zY2htaWR0ICYgUGF1bCBNYWNrZXJyYXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogVklBIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfdmlhX3BjaV90YWJsZVtdOworCisjZGVmaW5lIFZJQV9HQVJUQ1RSTAkweDgwCisjZGVmaW5lIFZJQV9BUFNJWkUJMHg4NAorI2RlZmluZSBWSUFfQVRUQkFTRQkweDg4CisKKyNkZWZpbmUgVklBX0FHUDNfR0FSVENUUkwJMHg5MAorI2RlZmluZSBWSUFfQUdQM19BUFNJWkUJCTB4OTQKKyNkZWZpbmUgVklBX0FHUDNfQVRUQkFTRQkweDk4CisjZGVmaW5lIFZJQV9BR1BTRUwJCTB4ZmQKKworc3RhdGljIGludCB2aWFfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXU4IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnZhbHVlczsKKworCXZhbHVlcyA9IEFfU0laRV84KGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgVklBX0FQU0laRSwgJnRlbXApOworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5rbm93biBhcGVydHVyZSBzaXplIGZyb20gQUdQIGJyaWRnZSAoMHgleClcbiIsIHRlbXApOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlhX2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQVBTSVpFLAorCQkJICAgICAgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKwkvKiBhZGRyZXNzIHRvIG1hcCB0b28gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBHQVJUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0dBUlRDVFJMLCAweDAwMDAwMDBmKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBHQVRUIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0FUVEJBU0UsCisJCQkgICAgKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgJiAweGZmZmZmMDAwKSB8IDMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgVklBX0FQU0laRSwKKwkJCSAgICAgIHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworCS8qIERvIG5vdCBkaXNhYmxlIGJ5IHdyaXRpbmcgMCB0byBWSUFfQVRUQkFTRSwgaXQgc2NyZXdzIHRoaW5ncyB1cAorCSAqIGR1cmluZyByZWluaXRpYWxpemF0aW9uLgorCSAqLworfQorCisKK3N0YXRpYyB2b2lkIHZpYV90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiB0ZW1wOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0dBUlRDVFJMLCAmdGVtcCk7CisJdGVtcCB8PSAoMTw8Nyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFZJQV9HQVJUQ1RSTCwgdGVtcCk7CisJdGVtcCAmPSB+KDE8PDcpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfR0FSVENUUkwsIHRlbXApOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCB2aWFfZ2VuZXJpY19zaXplc1s5XSA9Cit7CisJezI1NiwgNjU1MzYsIDYsIDB9LAorCXsxMjgsIDMyNzY4LCA1LCAxMjh9LAorCXs2NCwgMTYzODQsIDQsIDE5Mn0sCisJezMyLCA4MTkyLCAzLCAyMjR9LAorCXsxNiwgNDA5NiwgMiwgMjQwfSwKKwl7OCwgMjA0OCwgMSwgMjQ4fSwKKwl7NCwgMTAyNCwgMCwgMjUyfSwKKwl7MiwgNTEyLCAwLCAyNTR9LAorCXsxLCAyNTYsIDAsIDI1NX0KK307CisKKworc3RhdGljIGludCB2aWFfZmV0Y2hfc2l6ZV9hZ3AzKHZvaWQpCit7CisJaW50IGk7CisJdTE2IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2ICp2YWx1ZXM7CisKKwl2YWx1ZXMgPSBBX1NJWkVfMTYoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19BUFNJWkUsICZ0ZW1wKTsKKwl0ZW1wICY9IDB4ZmZmOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHZpYV9jb25maWd1cmVfYWdwMyh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0b28gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBhdHRiYXNlIC0gYXBlcnR1cmUgR0FUVCBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFZJQV9BR1AzX0FUVEJBU0UsCisJCWFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgJiAweGZmZmZmMDAwKTsKKworCS8qIDEuIEVuYWJsZSBHVExCIGluIFJYOTA8Nz4sIGFsbCBBR1AgYXBlcnR1cmUgYWNjZXNzIG5lZWRzIHRvIGZldGNoCisJICogICAgdHJhbnNsYXRpb24gdGFibGUgZmlyc3QuCisJICogMi4gRW5hYmxlIEFHUCBhcGVydHVyZSBpbiBSWDkxPDA+LiBUaGlzIGJpdCBjb250cm9scyB0aGUgZW5hYmxpbmcgb2YgdGhlCisJICogICAgZ3JhcGhpY3MgQUdQIGFwZXJ0dXJlIGZvciB0aGUgQUdQMy4wIHBvcnQuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0FHUDNfR0FSVENUUkwsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0FHUDNfR0FSVENUUkwsIHRlbXAgfCAoMzw8NykpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwX2FncDModm9pZCkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMTYgKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFZJQV9BUFNJWkUsIHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV90bGJmbHVzaF9hZ3AzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJdTMyIHRlbXA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19HQVJUQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19HQVJUQ1RSTCwgdGVtcCAmIH4oMTw8NykpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19HQVJUQ1RSTCwgdGVtcCk7Cit9CisKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIHZpYV9hZ3AzX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBhZ3AzX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDEwLAorCS5jb25maWd1cmUJCT0gdmlhX2NvbmZpZ3VyZV9hZ3AzLAorCS5mZXRjaF9zaXplCQk9IHZpYV9mZXRjaF9zaXplX2FncDMsCisJLmNsZWFudXAJCT0gdmlhX2NsZWFudXBfYWdwMywKKwkudGxiX2ZsdXNoCQk9IHZpYV90bGJmbHVzaF9hZ3AzLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IE5VTEwsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB2aWFfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IHZpYV9nZW5lcmljX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVThfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA5LAorCS5jb25maWd1cmUJCT0gdmlhX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSB2aWFfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSB2aWFfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IHZpYV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIHZpYV9hZ3BfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGRhdGEgPQoreworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5N18wLAorCQkuY2hpcHNldF9uYW1lCT0gIkFwb2xsbyBWUDMiLAorCX0sCisKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OThfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gTVZQMyIsCisJfSwKKworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg1MDFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gTVZQNCIsCisJfSwKKworCS8qIFZUODYwMSAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg2MDFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gUHJvTWVkaWEvUExFMTMzVGEiLAorCX0sCisKKwkvKiBWVDgyQzY5M0EgLyBWVDI4QzY5NFQgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2OTFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gUHJvIDEzMyIsCisJfSwKKworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJLWDEzMyIsCisJfSwKKworCS8qIFZUODYzMyAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg2MzNfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJQcm8gMjY2IiwKKwl9LAorCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfWE4yNjYsCisJCS5jaGlwc2V0X25hbWUJPSAiQXBvbGxvIFBybzI2NiIsCisJfSwKKworCS8qIFZUODM2MSAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNjEsCisJCS5jaGlwc2V0X25hbWUJPSAiS0xFMTMzIiwKKwl9LAorCisJLyogVlQ4MzY1IC8gVlQ4MzYyICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODM2M18wLAorCQkuY2hpcHNldF9uYW1lCT0gIlR3aXN0ZXItSy9LVDEzM3gvS00xMzMiLAorCX0sCisKKwkvKiBWVDg3NTNBICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODc1M18wLAorCQkuY2hpcHNldF9uYW1lCT0gIlA0WDI2NiIsCisJfSwKKworCS8qIFZUODM2NiAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJLVDI2Ni9LWTI2NngvS1QzMzMiLAorCX0sCisKKwkvKiBWVDg2MzMgKGZvciBDdU1pbmUvIENlbGVyb24pICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODY1M18wLAorCQkuY2hpcHNldF9uYW1lCT0gIlBybzI2NlQiLAorCX0sCisKKwkvKiBLTTI2NiAvIFBNMjY2ICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfWE0yNjYsCisJCS5jaGlwc2V0X25hbWUJPSAiUE0yNjYvS00yNjYiLAorCX0sCisKKwkvKiBDTEUyNjYgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NjJYXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiQ0xFMjY2IiwKKwl9LAorCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODM3N18wLAorCQkuY2hpcHNldF9uYW1lCT0gIktUNDAwL0tUNDAwQS9LVDYwMCIsCisJfSwKKworCS8qIFZUODYwNCAvIFZUODYwNSAvIFZUODYwMworCSAqIChBcG9sbG8gUHJvMTMzQSBjaGlwc2V0IHdpdGggUzMgU2F2YWdlNCkgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NjA1XzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUHJvU2F2YWdlIFBNMTMzL1BMMTMzL1BOMTMzIgorCX0sCisKKwkvKiBQNE0yNjZ4L1A0TjI2NiAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg3MDNfNTFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJQNE0yNjZ4L1A0TjI2NiIsCisJfSwKKworCS8qIFZUODc1NCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg3NTRDXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUFQ4MDAiLAorCX0sCisKKwkvKiBQNFg2MDAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NzYzXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUDRYNjAwIgorCX0sCisKKwkvKiBLTTQwMCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNzhfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJLTTQwMC9LTTQwMEEiLAorCX0sCisKKwkvKiBQVDg4MCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBX1BUODgwLAorCQkuY2hpcHNldF9uYW1lCT0gIlBUODgwIiwKKwl9LAorCisJLyogUFQ4OTAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NzgzXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUFQ4OTAiLAorCX0sCisKKwkvKiBQTTgwMC9QTjgwMC9QTTg4MC9QTjg4MCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBX1BYOFgwXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUE04MDAvUE44MDAvUE04ODAvUE44ODAiLAorCX0sCisJLyogS1Q4ODAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV8zMjY5XzAsCisJCS5jaGlwc2V0X25hbWUJPSAiS1Q4ODAiLAorCX0sCisJLyogS1R4eHgvUHg4eHggKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84M184N1hYXzEsCisJCS5jaGlwc2V0X25hbWUJPSAiVlQ4M3h4L1ZUODd4eC9LVHh4eC9QeDh4eCIsCisJfSwKKwkvKiBQNE04MDAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV8zMjk2XzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUDRNODAwIiwKKwl9LAorCisJeyB9LCAvKiBkdW1teSBmaW5hbCBlbnRyeSwgYWx3YXlzIHByZXNlbnQgKi8KK307CisKKworLyoKKyAqIFZJQSdzIEFHUDMgY2hpcHNldHMgZG8gbWFnaWNrIHRvIHB1dCB0aGUgQUdQIGJyaWRnZSBjb21wbGlhbnQKKyAqIHdpdGggdGhlIHNhbWUgc3RhbmRhcmRzIHZlcnNpb24gYXMgdGhlIGdyYXBoaWNzIGNhcmQuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3ZpYV9hZ3AzIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdTggcmVnOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYnJpZGdlLT5kZXYsIFZJQV9BR1BTRUwsICZyZWcpOworCS8qIENoZWNrIEFHUCAyLjAgY29tcGF0aWJpbGl0eSBtb2RlLiAqLworCWlmICgocmVnICYgKDE8PDEpKT09MCkKKwkJYnJpZGdlLT5kcml2ZXIgPSAmdmlhX2FncDNfZHJpdmVyOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF92aWFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2RldmljZV9pZHMgKmRldnMgPSB2aWFfYWdwX2RldmljZV9pZHM7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCWludCBqID0gMDsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmICghY2FwX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlqID0gZW50IC0gYWdwX3ZpYV9wY2lfdGFibGU7CisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBWSUEgJXMgY2hpcHNldFxuIiwgZGV2c1tqXS5jaGlwc2V0X25hbWUpOworCisJYnJpZGdlID0gYWdwX2FsbG9jX2JyaWRnZSgpOworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJyaWRnZS0+ZGV2ID0gcGRldjsKKwlicmlkZ2UtPmNhcG5keCA9IGNhcF9wdHI7CisJYnJpZGdlLT5kcml2ZXIgPSAmdmlhX2RyaXZlcjsKKworCS8qCisJICogR2FyZywgdGhlcmUgYXJlIEtUNDAwcyB3aXRoIEtUMjY2IElEcy4KKwkgKi8KKwlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCkgeworCQkvKiBJcyB0aGVyZSBhIEtUNDAwIHN1YnN5c3RlbSA/ICovCisJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVklBXzgzNzdfMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIEtUNDAwIGluIGRpc2d1aXNlIGFzIGEgS1QyNjYuXG4iKTsKKwkJCWNoZWNrX3ZpYV9hZ3AzKGJyaWRnZSk7CisJCX0KKwl9CisKKwkvKiBJZiB0aGlzIGlzIGFuIEFHUDMgYnJpZGdlLCBjaGVjayB3aGljaCBtb2RlIGl0cyBpbiBhbmQgYWRqdXN0LiAqLworCWdldF9hZ3BfdmVyc2lvbihicmlkZ2UpOworCWlmIChicmlkZ2UtPm1ham9yX3ZlcnNpb24gPj0gMykKKwkJY2hlY2tfdmlhX2FncDMoYnJpZGdlKTsKKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCWJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLCAmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX3ZpYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYWdwX3ZpYV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcGNpX3NhdmVfc3RhdGUgKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUgKHBkZXYsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ3BfdmlhX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZ2aWFfYWdwM19kcml2ZXIpCisJCXJldHVybiB2aWFfY29uZmlndXJlX2FncDMoKTsKKwllbHNlIGlmIChicmlkZ2UtPmRyaXZlciA9PSAmdmlhX2RyaXZlcikKKwkJcmV0dXJuIHZpYV9jb25maWd1cmUoKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKy8qIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgbmFtZSB0YWJsZSBhYm92ZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF92aWFfcGNpX3RhYmxlW10gPSB7CisjZGVmaW5lIElEKHgpIFwKKwl7CQkJCQkJXAorCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAlcCisJLmNsYXNzX21hc2sJPSB+MCwJCQkJXAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCQlcCisJLmRldmljZQkJPSB4LAkJCQlcCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCQkJXAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAkJCVwKKwl9CisJSUQoUENJX0RFVklDRV9JRF9WSUFfODJDNTk3XzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5OF8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NTAxXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzg2MDFfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODJDNjkxXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODYzM18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV9YTjI2NiksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODM2MSksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODM2M18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NzUzXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODY1M18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV9YTTI2NiksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODYyWF8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84Mzc3XzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzg2MDVfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODcwM181MV8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NzU0Q18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NzYzXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgzNzhfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfUFQ4ODApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzg3ODNfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfUFg4WDBfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfMzI2OV8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84M184N1hYXzEpLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzMyOTZfMCksCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdwX3ZpYV9wY2lfdGFibGUpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3BfdmlhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtdmlhIiwKKwkuaWRfdGFibGUJPSBhZ3BfdmlhX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX3ZpYV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF92aWFfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gYWdwX3ZpYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWdwX3ZpYV9yZXN1bWUsCisjZW5kaWYKK307CisKKworc3RhdGljIGludCBfX2luaXQgYWdwX3ZpYV9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfdmlhX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX3ZpYV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfdmlhX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfdmlhX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX3ZpYV9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjNDI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwpAQCAtMCwwICsxLDIxNzkgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCisgKgorICogU2VyaWFsIGRyaXZlciBmb3IgdGhlIGFtaWdhIGJ1aWx0aW4gcG9ydC4KKyAqCisgKiBUaGlzIGNvZGUgd2FzIGNyZWF0ZWQgYnkgdGFraW5nIHNlcmlhbC5jIHZlcnNpb24gNC4zMCBmcm9tIGtlcm5lbAorICogcmVsZWFzZSAyLjMuMjIsIHJlcGxhY2luZyBhbGwgaGFyZHdhcmUgcmVsYXRlZCBzdHVmZiB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBhbWlnYSBoYXJkd2FyZSBhY3Rpb25zLCBhbmQgcmVtb3ZpbmcgYWxsIGlycmVsZXZhbnQKKyAqIGNvZGUuIEFzIGEgY29uc2VxdWVuY2UsIGl0IHVzZXMgbWFueSBvZiB0aGUgY29uc3RhbnRzIGFuZCBuYW1lcworICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RlcnMgYW5kIGJpdHMgb2YgMTY1NTAgY29tcGF0aWJsZSBVQVJUUyAtCisgKiBidXQgb25seSB0byBrZWVwIHRyYWNrIG9mIHN0YXR1cywgZXRjIGluIHRoZSBzdGF0ZSB2YXJpYWJsZXMuIEl0CisgKiB3YXMgZG9uZSB0aGlzIHdhcyB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIHRoZSBjb2RlIGluIGxpbmUgd2l0aAorICogKG5vbiBoYXJkd2FyZSBzcGVjaWZpYykgY2hhbmdlcyB0byBzZXJpYWwuYy4KKyAqCisgKiBUaGUgcG9ydCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHR0eSBkcml2ZXIgYXMgbWlub3IgZGV2aWNlIDY0LCBhbmQKKyAqIHRoZXJlZm9yZSBvdGhlciBwb3J0cyBzaG91bGQgc2hvdWxkIG9ubHkgdXNlIDY1IHVwd2FyZHMuCisgKgorICogUmljaGFyZCBMdWNvY2sgMjgvMTIvOTkKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgCisgKiAJCTE5OTgsIDE5OTkgIFRoZW9kb3JlIFRzJ28KKyAqCisgKi8KKworLyoKKyAqIFNlcmlhbCBkcml2ZXIgY29uZmlndXJhdGlvbiBzZWN0aW9uLiAgSGVyZSBhcmUgdGhlIHZhcmlvdXMgb3B0aW9uczoKKyAqCisgKiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyAqIAkJQ2hlY2sgdGhlIG1hZ2ljIG51bWJlciBmb3IgdGhlIGFzeW5jX3N0cnVjdHVyZSB3aGVyZQorICogCQlldmVyIHBvc3NpYmxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjdW5kZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCisjZGVmaW5lIFNFUklBTF9ET19SRVNUQVJUCisKKy8qIFNldCBvZiBkZWJ1Z2dpbmcgZGVmaW5lcyAqLworCisjdW5kZWYgU0VSSUFMX0RFQlVHX0lOVFIKKyN1bmRlZiBTRVJJQUxfREVCVUdfT1BFTgorI3VuZGVmIFNFUklBTF9ERUJVR19GTE9XCisjdW5kZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCisvKiBTYW5pdHkgY2hlY2tzICovCisKKyNkZWZpbmUgU0VSSUFMX0lOTElORQorICAKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChTRVJJQUxfREVCVUdfTUNPVU5UKQorI2RlZmluZSBEQkdfQ05UKHMpIHByaW50aygiKCVzKTogWyV4XSByZWZjPSVkLCBzZXJjPSVkLCB0dHljPSVkIC0+ICVzXG4iLCBcCisgdHR5LT5uYW1lLCAoaW5mby0+ZmxhZ3MpLCBzZXJpYWxfZHJpdmVyLT5yZWZjb3VudCxpbmZvLT5jb3VudCx0dHktPmNvdW50LHMpCisjZWxzZQorI2RlZmluZSBEQkdfQ05UKHMpCisjZW5kaWYKKworLyoKKyAqIEVuZCBvZiBzZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CitzdGF0aWMgY2hhciAqc2VyaWFsX3ZlcnNpb24gPSAiNC4zMCI7CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKworI2lmZGVmIFNFUklBTF9JTkxJTkUKKyNkZWZpbmUgX0lOTElORV8gaW5saW5lCisjZW5kaWYKKworc3RhdGljIGNoYXIgKnNlcmlhbF9uYW1lID0gIkFtaWdhLWJ1aWx0aW4gc2VyaWFsIGRyaXZlciI7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKKworLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworc3RhdGljIHN0cnVjdCBhc3luY19zdHJ1Y3QgKklSUV9wb3J0czsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3VycmVudF9jdGxfYml0czsKKworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8sIHN0cnVjdCB0ZXJtaW9zICpvbGQpOworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKKworCitzdGF0aWMgc3RydWN0IHNlcmlhbF9zdGF0ZSByc190YWJsZVsxXTsKKworI2RlZmluZSBOUl9QT1JUUwkoc2l6ZW9mKHJzX3RhYmxlKS9zaXplb2Yoc3RydWN0IHNlcmlhbF9zdGF0ZSkpCisKKy8qCisgKiB0bXBfYnVmIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGJ5IHNlcmlhbF93cml0ZS4gIFdlIG5lZWQgdG8KKyAqIGxvY2sgaXQgaW4gY2FzZSB0aGUgY29weV9mcm9tX3VzZXIgYmxvY2tzIHdoaWxlIHN3YXBwaW5nIGluIGEgcGFnZSwKKyAqIGFuZCBzb21lIG90aGVyIHByb2dyYW0gdHJpZXMgdG8gZG8gYSBzZXJpYWwgd3JpdGUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNpbmNlIHRoZSBsb2NrIHdpbGwgb25seSBjb21lIHVuZGVyIGNvbnRlbnRpb24gd2hlbiB0aGUgc3lzdGVtIGlzCisgKiBzd2FwcGluZyBhbmQgYXZhaWxhYmxlIG1lbW9yeSBpcyBsb3csIGl0IG1ha2VzIHNlbnNlIHRvIHNoYXJlIG9uZQorICogYnVmZmVyIGFjcm9zcyBhbGwgdGhlIHNlcmlhbCBwb3J0cywgc2luY2UgaXQgc2lnbmlmaWNhbnRseSBzYXZlcworICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgc2VyaWFsX2lzcm9vdCgpCShjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorCQkiV2FybmluZzogbnVsbCBhc3luY19zdHJ1Y3QgZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IFNFUklBTF9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogc29tZSBzZXJpYWwgaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0RSX09WUlVOICAgKDE8PDE1KQorI2RlZmluZSBTRFJfUkJGICAgICAoMTw8MTQpCisjZGVmaW5lIFNEUl9UQkUgICAgICgxPDwxMykKKyNkZWZpbmUgU0RSX1RTUkUgICAgKDE8PDEyKQorCisjZGVmaW5lIFNFUlBFUl9QQVJFTkIgICAgKDE8PDE1KQorCisjZGVmaW5lIEFDX1NFVENMUiAgICgxPDwxNSkKKyNkZWZpbmUgQUNfVUFSVEJSSyAgKDE8PDExKQorCisjZGVmaW5lIFNFUl9EVFIgICAgICgxPDw3KQorI2RlZmluZSBTRVJfUlRTICAgICAoMTw8NikKKyNkZWZpbmUgU0VSX0RDRCAgICAgKDE8PDUpCisjZGVmaW5lIFNFUl9DVFMgICAgICgxPDw0KQorI2RlZmluZSBTRVJfRFNSICAgICAoMTw8MykKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBydHNkdHJfY3RybChpbnQgYml0cykKK3sKKyAgICBjaWFiLnByYSA9ICgoYml0cyAmIChTRVJfUlRTIHwgU0VSX0RUUikpIF4gKFNFUl9SVFMgfCBTRVJfRFRSKSkgfCAoY2lhYi5wcmEgJiB+KFNFUl9SVFMgfCBTRVJfRFRSKSk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX3N0b3AoKSBhbmQgcnNfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RvcCIpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkvKiBkaXNhYmxlIFR4IGludGVycnVwdCBhbmQgcmVtb3ZlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwkJY3VzdG9tLmludGVuYSA9IElGX1RCRTsKKwkJbWIoKTsKKwkJY3VzdG9tLmludHJlcSA9IElGX1RCRTsKKwkJbWIoKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RhcnQiKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChpbmZvLT54bWl0LmhlYWQgIT0gaW5mby0+eG1pdC50YWlsCisJICAgICYmIGluZm8tPnhtaXQuYnVmCisJICAgICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJCW1iKCk7CisJCS8qIHNldCBhIHBlbmRpbmcgVHggSW50ZXJydXB0LCB0cmFuc21pdHRlciBzaG91bGQgcmVzdGFydCBub3cgKi8KKwkJY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwkJbWIoKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhlcmUgc3RhcnRzIHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMuICBBbGwgb2YgdGhlIGZvbGxvd2luZworICogc3Vicm91dGluZXMgYXJlIGRlY2xhcmVkIGFzIGlubGluZSBhbmQgYXJlIGZvbGRlZCBpbnRvCisgKiByc19pbnRlcnJ1cHQoKS4gIFRoZXkgd2VyZSBzZXBhcmF0ZWQgb3V0IGZvciByZWFkYWJpbGl0eSdzIHNha2UuCisgKgorICogTm90ZTogcnNfaW50ZXJydXB0KCkgaXMgYSAiZmFzdCIgaW50ZXJydXB0LCB3aGljaCBtZWFucyB0aGF0IGl0CisgKiBydW5zIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb2ZmLiAgUGVvcGxlIHdobyBtYXkgd2FudCB0byBtb2RpZnkKKyAqIHJzX2ludGVycnVwdCgpIHNob3VsZCB0cnkgdG8ga2VlcCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYXMgZmFzdCBhcworICogcG9zc2libGUuICBBZnRlciB5b3UgYXJlIGRvbmUgbWFraW5nIG1vZGlmaWNhdGlvbnMsIGl0IGlzIG5vdCBhIGJhZAorICogaWRlYSB0byBkbzoKKyAqIAorICogZ2NjIC1TIC1ES0VSTkVMIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIHNlcmlhbC5jCisgKgorICogYW5kIGxvb2sgYXQgdGhlIHJlc3VsdGluZyBhc3NlbWJsZSBjb2RlIGluIHNlcmlhbC5zLgorICoKKyAqIAkJCQktIFRlZCBUcydvICh0eXRzb0BtaXQuZWR1KSwgNy1NYXItOTMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBzY2hlZHVsZQorICogcHJvY2Vzc2luZyBpbiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHBvcnRpb24gb2YgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIF9JTkxJTkVfIHZvaWQgcnNfc2NoZWRfZXZlbnQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywKKwkJCQkgIGludCBldmVudCkKK3sKKwlpbmZvLT5ldmVudCB8PSAxIDw8IGV2ZW50OworCXRhc2tsZXRfc2NoZWR1bGUoJmluZm8tPnRsZXQpOworfQorCitzdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCit7CisgICAgICAgIGludCBzdGF0dXM7CisJaW50IHNlcmRhdHI7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNoOworCXN0cnVjdAlhc3luY19pY291bnQgKmljb3VudDsKKworCWljb3VudCA9ICZpbmZvLT5zdGF0ZS0+aWNvdW50OworCisJc3RhdHVzID0gVUFSVF9MU1JfRFI7IC8qIFdlIG9idmlvdXNseSBoYXZlIGEgY2hhcmFjdGVyISAqLworCXNlcmRhdHIgPSBjdXN0b20uc2VyZGF0cjsKKwltYigpOworCWN1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CisJbWIoKTsKKworCWlmKChzZXJkYXRyICYgMHgxZmYpID09IDApCisJICAgIHN0YXR1cyB8PSBVQVJUX0xTUl9CSTsKKwlpZihzZXJkYXRyICYgU0RSX09WUlVOKQorCSAgICBzdGF0dXMgfD0gVUFSVF9MU1JfT0U7CisKKwljaCA9IHNlcmRhdHIgJiAweGZmOworCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkgIGdvdG8gaWdub3JlX2NoYXI7CisJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKKwlpY291bnQtPnJ4Kys7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygiRFIlMDJ4OiUwMnguLi4iLCBjaCwgc3RhdHVzKTsKKyNlbmRpZgorCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKKworCS8qCisJICogV2UgZG9uJ3QgaGFuZGxlIHBhcml0eSBvciBmcmFtZSBlcnJvcnMgLSBidXQgSSBoYXZlIGxlZnQKKwkgKiB0aGUgY29kZSBpbiwgc2luY2UgSSdtIG5vdCBzdXJlIHRoYXQgdGhlIGVycm9ycyBjYW4ndCBiZQorCSAqIGRldGVjdGVkLgorCSAqLworCisJaWYgKHN0YXR1cyAmIChVQVJUX0xTUl9CSSB8IFVBUlRfTFNSX1BFIHwKKwkJICAgICAgVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9PRSkpIHsKKwkgIC8qCisJICAgKiBGb3Igc3RhdGlzdGljcyBvbmx5CisJICAgKi8KKwkgIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9CSSkgeworCSAgICBzdGF0dXMgJj0gfihVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFKTsKKwkgICAgaWNvdW50LT5icmsrKzsKKwkgIH0gZWxzZSBpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpCisJICAgIGljb3VudC0+cGFyaXR5Kys7CisJICBlbHNlIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKKwkgICAgaWNvdW50LT5mcmFtZSsrOworCSAgaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKQorCSAgICBpY291bnQtPm92ZXJydW4rKzsKKworCSAgLyoKKwkgICAqIE5vdyBjaGVjayB0byBzZWUgaWYgY2hhcmFjdGVyIHNob3VsZCBiZQorCSAgICogaWdub3JlZCwgYW5kIG1hc2sgb2ZmIGNvbmRpdGlvbnMgd2hpY2gKKwkgICAqIHNob3VsZCBiZSBpZ25vcmVkLgorCSAgICovCisJICBpZiAoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKQorCSAgICBnb3RvIGlnbm9yZV9jaGFyOworCisJICBzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKworCSAgaWYgKHN0YXR1cyAmIChVQVJUX0xTUl9CSSkpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCSAgICBwcmludGsoImhhbmRsaW5nIGJyZWFrLi4uLiIpOworI2VuZGlmCisJICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCSAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJICAgICAgZG9fU0FLKHR0eSk7CisJICB9IGVsc2UgaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1BFKQorCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJICBlbHNlIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKKwkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJICBpZiAoc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKKwkgICAgLyoKKwkgICAgICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCisJICAgICAqIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAorCSAgICAgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisJICAgICAqLworCSAgICBpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCSAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOworCSAgICAgIHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkgICAgICB0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKKwkgICAgfQorCSAgfQorCX0KKwl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCXR0eS0+ZmxpcC5jb3VudCsrOworIGlnbm9yZV9jaGFyOgorCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworc3RhdGljIF9JTkxJTkVfIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbykKK3sKKwljdXN0b20uaW50cmVxID0gSUZfVEJFOworCW1iKCk7CisJaWYgKGluZm8tPnhfY2hhcikgeworCSAgICAgICAgY3VzdG9tLnNlcmRhdCA9IGluZm8tPnhfY2hhciB8IDB4MTAwOworCQltYigpOworCQlpbmZvLT5zdGF0ZS0+aWNvdW50LnR4Kys7CisJCWluZm8tPnhfY2hhciA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKGluZm8tPnhtaXQuaGVhZCA9PSBpbmZvLT54bWl0LnRhaWwKKwkgICAgfHwgaW5mby0+dHR5LT5zdG9wcGVkCisJICAgIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJICAgICAgICBjdXN0b20uaW50ZW5hID0gSUZfVEJFOworCQltYigpOworCQlyZXR1cm47CisJfQorCisJY3VzdG9tLnNlcmRhdCA9IGluZm8tPnhtaXQuYnVmW2luZm8tPnhtaXQudGFpbCsrXSB8IDB4MTAwOworCW1iKCk7CisJaW5mby0+eG1pdC50YWlsID0gaW5mby0+eG1pdC50YWlsICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJaW5mby0+c3RhdGUtPmljb3VudC50eCsrOworCisJaWYgKENJUkNfQ05UKGluZm8tPnhtaXQuaGVhZCwKKwkJICAgICBpbmZvLT54bWl0LnRhaWwsCisJCSAgICAgU0VSSUFMX1hNSVRfU0laRSkgPCBXQUtFVVBfQ0hBUlMpCisJCXJzX3NjaGVkX2V2ZW50KGluZm8sIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygiVEhSRS4uLiIpOworI2VuZGlmCisJaWYgKGluZm8tPnhtaXQuaGVhZCA9PSBpbmZvLT54bWl0LnRhaWwpIHsKKwkgICAgICAgIGN1c3RvbS5pbnRlbmEgPSBJRl9UQkU7CisJCW1iKCk7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwl9Cit9CisKK3N0YXRpYyBfSU5MSU5FXyB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gY2lhYi5wcmEgJiAoU0VSX0RDRCB8IFNFUl9DVFMgfCBTRVJfRFNSKTsKKwl1bnNpZ25lZCBjaGFyIGRzdGF0dXM7CisJc3RydWN0CWFzeW5jX2ljb3VudCAqaWNvdW50OworCisJLyogRGV0ZXJtaW5lIGJpdHMgdGhhdCBoYXZlIGNoYW5nZWQgKi8KKwlkc3RhdHVzID0gc3RhdHVzIF4gY3VycmVudF9jdGxfYml0czsKKwljdXJyZW50X2N0bF9iaXRzID0gc3RhdHVzOworCisJaWYgKGRzdGF0dXMpIHsKKwkJaWNvdW50ID0gJmluZm8tPnN0YXRlLT5pY291bnQ7CisJCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJCWlmIChkc3RhdHVzICYgU0VSX0RTUikKKwkJCWljb3VudC0+ZHNyKys7CisJCWlmIChkc3RhdHVzICYgU0VSX0RDRCkgeworCQkJaWNvdW50LT5kY2QrKzsKKyNpZmRlZiBDT05GSUdfSEFSRF9QUFMKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IQVJEUFBTX0NEKSAmJgorCQkJICAgICEoc3RhdHVzICYgU0VSX0RDRCkpCisJCQkJaGFyZHBwcygpOworI2VuZGlmCisJCX0KKwkJaWYgKGRzdGF0dXMgJiBTRVJfQ1RTKQorCQkJaWNvdW50LT5jdHMrKzsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJfQorCisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoZHN0YXR1cyAmIFNFUl9EQ0QpKSB7CisjaWYgKGRlZmluZWQoU0VSSUFMX0RFQlVHX09QRU4pIHx8IGRlZmluZWQoU0VSSUFMX0RFQlVHX0lOVFIpKQorCQlwcmludGsoInR0eVMlZCBDRCBub3cgJXMuLi4iLCBpbmZvLT5saW5lLAorCQkgICAgICAgKCEoc3RhdHVzICYgU0VSX0RDRCkpID8gIm9uIiA6ICJvZmYiKTsKKyNlbmRpZgorCQlpZiAoIShzdGF0dXMgJiBTRVJfRENEKSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwkJZWxzZSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJCXByaW50aygiZG9pbmcgc2VyaWFsIGhhbmd1cC4uLiIpOworI2VuZGlmCisJCQlpZiAoaW5mby0+dHR5KQorCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJfQorCX0KKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoIShzdGF0dXMgJiBTRVJfQ1RTKSkgeworI2lmIChkZWZpbmVkKFNFUklBTF9ERUJVR19JTlRSKSB8fCBkZWZpbmVkKFNFUklBTF9ERUJVR19GTE9XKSkKKwkJCQlwcmludGsoIkNUUyB0eCBzdGFydC4uLiIpOworI2VuZGlmCisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfVEJFOworCQkJCW1iKCk7CisJCQkJLyogc2V0IGEgcGVuZGluZyBUeCBJbnRlcnJ1cHQsIHRyYW5zbWl0dGVyIHNob3VsZCByZXN0YXJ0IG5vdyAqLworCQkJCWN1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJCQkJbWIoKTsKKwkJCQlyc19zY2hlZF9ldmVudChpbmZvLCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoc3RhdHVzICYgU0VSX0NUUykpIHsKKyNpZiAoZGVmaW5lZChTRVJJQUxfREVCVUdfSU5UUikgfHwgZGVmaW5lZChTRVJJQUxfREVCVUdfRkxPVykpCisJCQkJcHJpbnRrKCJDVFMgdHggc3RvcC4uLiIpOworI2VuZGlmCisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCQkJLyogZGlzYWJsZSBUeCBpbnRlcnJ1cHQgYW5kIHJlbW92ZSBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJCQkJY3VzdG9tLmludGVuYSA9IElGX1RCRTsKKwkJCQltYigpOworCQkJCWN1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CisJCQkJbWIoKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHNlcl92YmxfaW50KCBpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgLyogdmJsIGlzIGp1c3QgYSBwZXJpb2RpYyBpbnRlcnJ1cHQgd2UgdGllIGludG8gdG8gdXBkYXRlIG1vZGVtIHN0YXR1cyAqLworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gSVJRX3BvcnRzOworCS8qCisJICogVEJEIC0gaXMgaXQgYmV0dGVyIHRvIHVucmVnaXN0ZXIgZnJvbSB0aGlzIGludGVycnVwdCBvciB0bworCSAqIGlnbm9yZSBpdCBpZiBNU0kgaXMgY2xlYXIgPworCSAqLworCWlmKGluZm8tPklFUiAmIFVBUlRfSUVSX01TSSkKKwkgIGNoZWNrX21vZGVtX3N0YXR1cyhpbmZvKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXJfcnhfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwlwcmludGsoInNlcl9yeF9pbnQuLi4iKTsKKyNlbmRpZgorCisJaW5mbyA9IElSUV9wb3J0czsKKwlpZiAoIWluZm8gfHwgIWluZm8tPnR0eSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcmVjZWl2ZV9jaGFycyhpbmZvKTsKKwlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwlwcmludGsoImVuZC5cbiIpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2VyX3R4X2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbzsKKworCWlmIChjdXN0b20uc2VyZGF0ciAmIFNEUl9UQkUpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCSAgcHJpbnRrKCJzZXJfdHhfaW50Li4uIik7CisjZW5kaWYKKworCSAgaW5mbyA9IElSUV9wb3J0czsKKwkgIGlmICghaW5mbyB8fCAhaW5mby0+dHR5KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkgIHRyYW5zbWl0X2NoYXJzKGluZm8pOworCSAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJICBwcmludGsoImVuZC5cbiIpOworI2VuZGlmCisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEhlcmUgZW5kcyB0aGUgc2VyaWFsIGludGVycnVwdCByb3V0aW5lcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSAiYm90dG9tIGhhbGYiIHByb2Nlc3NpbmcgZm9yIHRoZQorICogc2VyaWFsIGRyaXZlciwga25vd24gYWxzbyB0aGUgInNvZnR3YXJlIGludGVycnVwdCIgcHJvY2Vzc2luZy4KKyAqIFRoaXMgcHJvY2Vzc2luZyBpcyBkb25lIGF0IHRoZSBrZXJuZWwgaW50ZXJydXB0IGxldmVsLCBhZnRlciB0aGUKKyAqIHJzX2ludGVycnVwdCgpIGhhcyByZXR1cm5lZCwgQlVUIFdJVEggSU5URVJSVVBUUyBUVVJORUQgT04uICBUaGlzCisgKiBpcyB3aGVyZSB0aW1lLWNvbnN1bWluZyBhY3Rpdml0aWVzIHdoaWNoIGNhbiBub3QgYmUgZG9uZSBpbiB0aGUKKyAqIGludGVycnVwdCBkcml2ZXIgcHJvcGVyIGFyZSBkb25lOyB0aGUgaW50ZXJydXB0IGRyaXZlciBzY2hlZHVsZXMKKyAqIHRoZW0gdXNpbmcgcnNfc2NoZWRfZXZlbnQoKSwgYW5kIHRoZXkgZ2V0IGRvbmUgaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBkb19zb2Z0aW50KHVuc2lnbmVkIGxvbmcgcHJpdmF0ZV8pCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisKKwl0dHkgPSBpbmZvLT50dHk7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlNfRVZFTlRfV1JJVEVfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG93IGxldmVsIHV0aWxpdHkgc3Vicm91dGluZXMgZm9yIHRoZSBzZXJpYWwgZHJpdmVyOiAgcm91dGluZXMgdG8KKyAqIGZpZ3VyZSBvdXQgdGhlIGFwcHJvcHJpYXRlIHRpbWVvdXQgZm9yIGFuIGludGVycnVwdCBjaGFpbiwgcm91dGluZXMKKyAqIHRvIGluaXRpYWxpemUgYW5kIHN0YXJ0dXAgYSBzZXJpYWwgcG9ydCwgYW5kIHJvdXRpbmVzIHRvIHNodXRkb3duIGEKKyAqIHNlcmlhbCBwb3J0LiAgVXNlZnVsIHN0dWZmIGxpa2UgdGhhdC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludAlyZXR2YWw9MDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmcmVlX3BhZ2UocGFnZSk7CisJCWdvdG8gZXJyb3V0OworCX0KKworCWlmIChpbmZvLT54bWl0LmJ1ZikKKwkJZnJlZV9wYWdlKHBhZ2UpOworCWVsc2UKKwkJaW5mby0+eG1pdC5idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoInN0YXJ0aW5nIHVwIHR0eXMlZCAuLi4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCisJLyogQ2xlYXIgYW55dGhpbmcgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworCisJY3VzdG9tLmludHJlcSA9IElGX1JCRjsKKwltYigpOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBzZXJfdmJsX2ludCwgMCwgInNlcmlhbCBzdGF0dXMiLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisJICBpZiAoc2VyaWFsX2lzcm9vdCgpKSB7CisJICAgIGlmIChpbmZvLT50dHkpCisJICAgICAgc2V0X2JpdChUVFlfSU9fRVJST1IsCisJCSAgICAgICZpbmZvLT50dHktPmZsYWdzKTsKKwkgICAgcmV0dmFsID0gMDsKKwkgIH0KKwkgIGdvdG8gZXJyb3V0OworCX0KKworCS8qIGVuYWJsZSBib3RoIFJ4IGFuZCBUeCBpbnRlcnJ1cHRzICovCisJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1JCRiB8IElGX1RCRTsKKwltYigpOworCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSTsKKworCS8qIHJlbWVtYmVyIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERDRCBhbmQgQ1RTIGJpdHMgKi8KKwljdXJyZW50X2N0bF9iaXRzID0gY2lhYi5wcmEgJiAoU0VSX0RDRCB8IFNFUl9DVFMgfCBTRVJfRFNSKTsKKworCUlSUV9wb3J0cyA9IGluZm87CisKKwlpbmZvLT5NQ1IgPSAwOworCWlmIChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkKKwkgIGluZm8tPk1DUiA9IFNFUl9EVFIgfCBTRVJfUlRTOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJaW5mby0+eG1pdC5oZWFkID0gaW5mby0+eG1pdC50YWlsID0gMDsKKworCS8qCisJICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKwkgKi8KKwlpZiAoaW5mby0+dHR5KSB7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisJfQorCisJLyoKKwkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKwljaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBhbmQKKyAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJTaHV0dGluZyBkb3duIHNlcmlhbCBwb3J0ICVkIC4uLi5cbiIsIGluZm8tPmxpbmUpOworI2VuZGlmCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCisJLyoKKwkgKiBjbGVhciBkZWx0YV9tc3Jfd2FpdCBxdWV1ZSB0byBhdm9pZCBtZW0gbGVha3M6IHdlIG1heSBmcmVlIHRoZSBpcnEKKwkgKiBoZXJlIHNvIHRoZSBxdWV1ZSBtaWdodCBuZXZlciBiZSB3YWtlbiB1cAorCSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCisJSVJRX3BvcnRzID0gTlVMTDsKKworCS8qCisJICogRnJlZSB0aGUgSVJRLCBpZiBuZWNlc3NhcnkKKwkgKi8KKwlmcmVlX2lycShJUlFfQU1JR0FfVkVSVEIsIGluZm8pOworCisJaWYgKGluZm8tPnhtaXQuYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mby0+eG1pdC5idWYpOworCQlpbmZvLT54bWl0LmJ1ZiA9IE5VTEw7CisJfQorCisJaW5mby0+SUVSID0gMDsKKwljdXN0b20uaW50ZW5hID0gSUZfUkJGIHwgSUZfVEJFOworCW1iKCk7CisKKwkvKiBkaXNhYmxlIGJyZWFrIGNvbmRpdGlvbiAqLworCWN1c3RvbS5hZGtjb24gPSBBQ19VQVJUQlJLOworCW1iKCk7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKQorCQlpbmZvLT5NQ1IgJj0gfihTRVJfRFRSfFNFUl9SVFMpOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICovCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywKKwkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJaW50CXF1b3QgPSAwLCBiYXVkX2Jhc2UsIGJhdWQ7CisJdW5zaWduZWQgY2ZsYWcsIGN2YWwgPSAwOworCWludAliaXRzOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBCeXRlIHNpemUgaXMgYWx3YXlzIDggYml0cyBwbHVzIHBhcml0eSBiaXQgaWYgcmVxdWVzdGVkICovCisKKwljdmFsID0gMzsgYml0cyA9IDEwOworCWlmIChjZmxhZyAmIENTVE9QQikgeworCQljdmFsIHw9IDB4MDQ7CisJCWJpdHMrKzsKKwl9CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOworCQliaXRzKys7CisJfQorCWlmICghKGNmbGFnICYgUEFST0REKSkKKwkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOworI2lmZGVmIENNU1BBUgorCWlmIChjZmxhZyAmIENNU1BBUikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOworI2VuZGlmCisKKwkvKiBEZXRlcm1pbmUgZGl2aXNvciBiYXNlZCBvbiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwlpZiAoIWJhdWQpCisJCWJhdWQgPSA5NjAwOwkvKiBCMCB0cmFuc2l0aW9uIGhhbmRsZWQgaW4gcnNfc2V0X3Rlcm1pb3MgKi8KKwliYXVkX2Jhc2UgPSBpbmZvLT5zdGF0ZS0+YmF1ZF9iYXNlOworCWlmIChiYXVkID09IDM4NDAwICYmCisJICAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKQorCQlxdW90ID0gaW5mby0+c3RhdGUtPmN1c3RvbV9kaXZpc29yOworCWVsc2UgeworCQlpZiAoYmF1ZCA9PSAxMzQpCisJCQkvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLworCQkJcXVvdCA9ICgyKmJhdWRfYmFzZSAvIDI2OSk7CisJCWVsc2UgaWYgKGJhdWQpCisJCQlxdW90ID0gYmF1ZF9iYXNlIC8gYmF1ZDsKKwl9CisJLyogSWYgdGhlIHF1b3RpZW50IGlzIHplcm8gcmVmdXNlIHRoZSBjaGFuZ2UgKi8KKwlpZiAoIXF1b3QgJiYgb2xkX3Rlcm1pb3MpIHsKKwkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKKwkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKTsKKwkJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CisJCWlmICghYmF1ZCkKKwkJCWJhdWQgPSA5NjAwOworCQlpZiAoYmF1ZCA9PSAzODQwMCAmJgorCQkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpCisJCQlxdW90ID0gaW5mby0+c3RhdGUtPmN1c3RvbV9kaXZpc29yOworCQllbHNlIHsKKwkJCWlmIChiYXVkID09IDEzNCkKKwkJCQkvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLworCQkJCXF1b3QgPSAoMipiYXVkX2Jhc2UgLyAyNjkpOworCQkJZWxzZSBpZiAoYmF1ZCkKKwkJCQlxdW90ID0gYmF1ZF9iYXNlIC8gYmF1ZDsKKwkJfQorCX0KKwkvKiBBcyBhIGxhc3QgcmVzb3J0LCBpZiB0aGUgcXVvdGllbnQgaXMgemVybywgZGVmYXVsdCB0byA5NjAwIGJwcyAqLworCWlmICghcXVvdCkKKwkJcXVvdCA9IGJhdWRfYmFzZSAvIDk2MDA7CisJaW5mby0+cXVvdCA9IHF1b3Q7CisJaW5mby0+dGltZW91dCA9ICgoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqYml0cypxdW90KSAvIGJhdWRfYmFzZSk7CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSEFSRFBQU19DRCkKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0gZWxzZQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0KKwkvKiBUQkQ6CisJICogRG9lcyBjbGVhcmluZyBJRVJfTVNJIGltcGx5IHRoYXQgd2Ugc2hvdWxkIGRpc2JhbGUgdGhlIFZCTCBpbnRlcnJ1cHQgPworCSAqLworCisJLyoKKwkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKKwkgKi8KKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQorCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfRFI7CisJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOworCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisKKwkvKgorCSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCisJICovCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUgCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRTsKKwl9CisJLyoKKwkgKiAhISEgaWdub3JlIGFsbCBjaGFyYWN0ZXJzIGlmIENSRUFEIGlzIG5vdCBzZXQKKwkgKi8KKwlpZiAoKGNmbGFnICYgQ1JFQUQpID09IDApCisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9EUjsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl7CisJICBzaG9ydCBzZXJwZXI7CisKKwkvKiBTZXQgdXAgdGhlIGJhdWQgcmF0ZSAqLworCSAgc2VycGVyID0gcXVvdCAtIDE7CisKKwkvKiBFbmFibGUgb3IgZGlzYWJsZSBwYXJpdHkgYml0ICovCisKKwlpZihjdmFsICYgVUFSVF9MQ1JfUEFSSVRZKQorCSAgc2VycGVyIHw9IChTRVJQRVJfUEFSRU5CKTsKKworCWN1c3RvbS5zZXJwZXIgPSBzZXJwZXI7CisJbWIoKTsKKwl9CisKKwlpbmZvLT5MQ1IgPSBjdmFsOwkJCQkvKiBTYXZlIExDUiAqLworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0LmJ1ZikKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChDSVJDX1NQQUNFKGluZm8tPnhtaXQuaGVhZCwKKwkJICAgICAgIGluZm8tPnhtaXQudGFpbCwKKwkJICAgICAgIFNFUklBTF9YTUlUX1NJWkUpID09IDApIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaW5mby0+eG1pdC5idWZbaW5mby0+eG1pdC5oZWFkKytdID0gY2g7CisJaW5mby0+eG1pdC5oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUtMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJzX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdC5oZWFkID09IGluZm8tPnhtaXQudGFpbAorCSAgICB8fCB0dHktPnN0b3BwZWQKKwkgICAgfHwgdHR5LT5od19zdG9wcGVkCisJICAgIHx8ICFpbmZvLT54bWl0LmJ1ZikKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJbWIoKTsKKwkvKiBzZXQgYSBwZW5kaW5nIFR4IEludGVycnVwdCwgdHJhbnNtaXR0ZXIgc2hvdWxkIHJlc3RhcnQgbm93ICovCisJY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwltYigpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50CWMsIHJldCA9IDA7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZSIpKQorCQlyZXR1cm4gMDsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0LmJ1ZiB8fCAhdG1wX2J1ZikKKwkJcmV0dXJuIDA7CisKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKSB7CisJCWMgPSBDSVJDX1NQQUNFX1RPX0VORChpbmZvLT54bWl0LmhlYWQsCisJCQkJICAgICAgaW5mby0+eG1pdC50YWlsLAorCQkJCSAgICAgIFNFUklBTF9YTUlUX1NJWkUpOworCQlpZiAoY291bnQgPCBjKQorCQkJYyA9IGNvdW50OworCQlpZiAoYyA8PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkoaW5mby0+eG1pdC5idWYgKyBpbmZvLT54bWl0LmhlYWQsIGJ1ZiwgYyk7CisJCWluZm8tPnhtaXQuaGVhZCA9ICgoaW5mby0+eG1pdC5oZWFkICsgYykgJgorCQkJCSAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXJldCArPSBjOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiAoaW5mby0+eG1pdC5oZWFkICE9IGluZm8tPnhtaXQudGFpbAorCSAgICAmJiAhdHR5LT5zdG9wcGVkCisJICAgICYmICF0dHktPmh3X3N0b3BwZWQKKwkgICAgJiYgIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwkJbWIoKTsKKwkJLyogc2V0IGEgcGVuZGluZyBUeCBJbnRlcnJ1cHQsIHRyYW5zbWl0dGVyIHNob3VsZCByZXN0YXJ0IG5vdyAqLworCQljdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgSUZfVEJFOworCQltYigpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIENJUkNfU1BBQ0UoaW5mby0+eG1pdC5oZWFkLCBpbmZvLT54bWl0LnRhaWwsIFNFUklBTF9YTUlUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHJzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gQ0lSQ19DTlQoaW5mby0+eG1pdC5oZWFkLCBpbmZvLT54bWl0LnRhaWwsIFNFUklBTF9YTUlUX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCByc19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWluZm8tPnhtaXQuaGVhZCA9IGluZm8tPnhtaXQudGFpbCA9IDA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyIHRvCisgKiB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHJzX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zZW5kX2NoYXIiKSkKKwkJcmV0dXJuOworCisJaW5mby0+eF9jaGFyID0gY2g7CisJaWYgKGNoKSB7CisJCS8qIE1ha2Ugc3VyZSB0cmFuc21pdCBpbnRlcnJ1cHRzIGFyZSBvbiAqLworCisJICAgICAgICAvKiBDaGVjayB0aGlzICEgKi8KKwkgICAgICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYoIShjdXN0b20uaW50ZW5hciAmIElGX1RCRSkpIHsKKwkJICAgIGN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJCSAgICBtYigpOworCQkgICAgLyogc2V0IGEgcGVuZGluZyBUeCBJbnRlcnJ1cHQsIHRyYW5zbWl0dGVyIHNob3VsZCByZXN0YXJ0IG5vdyAqLworCQkgICAgY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwkJICAgIG1iKCk7CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCX0KK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfdGhyb3R0bGUoKQorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsIHRoYXQKKyAqIGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCisJY2hhcglidWZbNjRdOworCisJcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3Rocm90dGxlIikpCisJCXJldHVybjsKKworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXJzX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJaW5mby0+TUNSICY9IH5TRVJfUlRTOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBTRVJJQUxfREVCVUdfVEhST1RUTEUKKwljaGFyCWJ1Zls2NF07CisKKwlwcmludGsoInVudGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKKyNlbmRpZgorCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCisJCXJldHVybjsKKworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UKKwkJCXJzX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCX0KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJaW5mby0+TUNSIHw9IFNFUl9SVFM7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByc19pb2N0bCgpIGFuZCBmcmllbmRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogcmV0aW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKyAgIAorCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IHN0YXRlLT50eXBlOworCXRtcC5saW5lID0gc3RhdGUtPmxpbmU7CisJdG1wLnBvcnQgPSBzdGF0ZS0+cG9ydDsKKwl0bXAuaXJxID0gc3RhdGUtPmlycTsKKwl0bXAuZmxhZ3MgPSBzdGF0ZS0+ZmxhZ3M7CisJdG1wLnhtaXRfZmlmb19zaXplID0gc3RhdGUtPnhtaXRfZmlmb19zaXplOworCXRtcC5iYXVkX2Jhc2UgPSBzdGF0ZS0+YmF1ZF9iYXNlOworCXRtcC5jbG9zZV9kZWxheSA9IHN0YXRlLT5jbG9zZV9kZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gc3RhdGUtPmNsb3Npbmdfd2FpdDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3I7CisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogbmV3X2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKyAJc3RydWN0IHNlcmlhbF9zdGF0ZSBvbGRfc3RhdGUsICpzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCWNoYW5nZV9pcnEsY2hhbmdlX3BvcnQ7CisJaW50IAkJCXJldHZhbCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKwlvbGRfc3RhdGUgPSAqc3RhdGU7CisgIAorCWNoYW5nZV9pcnEgPSBuZXdfc2VyaWFsLmlycSAhPSBzdGF0ZS0+aXJxOworCWNoYW5nZV9wb3J0ID0gKG5ld19zZXJpYWwucG9ydCAhPSBzdGF0ZS0+cG9ydCk7CisJaWYoY2hhbmdlX2lycSB8fCBjaGFuZ2VfcG9ydCB8fCAobmV3X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZSAhPSBzdGF0ZS0+eG1pdF9maWZvX3NpemUpKQorCSAgcmV0dXJuIC1FSU5WQUw7CisgIAorCWlmICghc2VyaWFsX2lzcm9vdCgpKSB7CisJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gc3RhdGUtPmJhdWRfYmFzZSkgfHwKKwkJICAgIChuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IHN0YXRlLT5jbG9zZV9kZWxheSkgfHwKKwkJICAgIChuZXdfc2VyaWFsLnhtaXRfZmlmb19zaXplICE9IHN0YXRlLT54bWl0X2ZpZm9fc2l6ZSkgfHwKKwkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAoc3RhdGUtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzdGF0ZS0+ZmxhZ3MgPSAoKHN0YXRlLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCQlzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCQlnb3RvIGNoZWNrX2FuZF9leGl0OworCX0KKworCWlmIChuZXdfc2VyaWFsLmJhdWRfYmFzZSA8IDk2MDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCSAqLworCisJc3RhdGUtPmJhdWRfYmFzZSA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlOworCXN0YXRlLT5mbGFncyA9ICgoc3RhdGUtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJaW5mby0+ZmxhZ3MgPSAoKHN0YXRlLT5mbGFncyAmIH5BU1lOQ19JTlRFUk5BTF9GTEFHUykgfAorCQkgICAgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5URVJOQUxfRkxBR1MpKTsKKwlzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCXN0YXRlLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJc3RhdGUtPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOworCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworY2hlY2tfYW5kX2V4aXQ6CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJaWYgKCgob2xkX3N0YXRlLmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CisJCSAgICAgKHN0YXRlLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgfHwKKwkJICAgIChvbGRfc3RhdGUuY3VzdG9tX2Rpdmlzb3IgIT0gc3RhdGUtPmN1c3RvbV9kaXZpc29yKSkgeworCQkJaWYgKChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJCQlpZiAoKHN0YXRlLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCQkJaWYgKChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJCWlmICgoc3RhdGUtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworCQkJY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCQl9CisJfSBlbHNlCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKgorICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5CisgKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgorICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCisgKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAorICovCitzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3RhdHVzID0gY3VzdG9tLnNlcmRhdHI7CisJbWIoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmVzdWx0ID0gKChzdGF0dXMgJiBTRFJfVFNSRSkgPyBUSU9DU0VSX1RFTVQgOiAwKTsKKwlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gLUVJTzsKKworCWNvbnRyb2wgPSBpbmZvLT5NQ1I7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXN0YXR1cyA9IGNpYWIucHJhOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gICAgKChjb250cm9sICYgU0VSX1JUUykgPyBUSU9DTV9SVFMgOiAwKQorCQl8ICgoY29udHJvbCAmIFNFUl9EVFIpID8gVElPQ01fRFRSIDogMCkKKwkJfCAoIShzdGF0dXMgICYgU0VSX0RDRCkgPyBUSU9DTV9DQVIgOiAwKQorCQl8ICghKHN0YXR1cyAgJiBTRVJfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCXwgKCEoc3RhdHVzICAmIFNFUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgcnNfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gLUVJTzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgfD0gU0VSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgfD0gU0VSX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiAmPSB+U0VSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiAmPSB+U0VSX0RUUjsKKwlydHNkdHJfY3RybChpbmZvLT5NQ1IpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgorICovCitzdGF0aWMgdm9pZCByc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfYnJlYWsiKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkgIGN1c3RvbS5hZGtjb24gPSBBQ19TRVRDTFIgfCBBQ19VQVJUQlJLOworCWVsc2UKKwkgIGN1c3RvbS5hZGtjb24gPSBBQ19VQVJUQlJLOworCW1iKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldiwgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DU0VSQ09ORklHKSAmJiAoY21kICE9IFRJT0NTRVJHU1RSVUNUKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElPQ0dTRVJJQUw6CisJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGluZm8sCisJCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKwkJY2FzZSBUSU9DU1NFUklBTDoKKwkJCXJldHVybiBzZXRfc2VyaWFsX2luZm8oaW5mbywKKwkJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworCQljYXNlIFRJT0NTRVJDT05GSUc6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJT0NTRVJHRVRMU1I6IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCAodW5zaWduZWQgaW50ICopIGFyZyk7CisKKwkJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBhc3luY19zdHJ1Y3QgKikgYXJnLAorCQkJCQkgaW5mbywgc2l6ZW9mKHN0cnVjdCBhc3luY19zdHJ1Y3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIFdhaXQgZm9yIGFueSBvZiB0aGUgNCBtb2RlbSBpbnB1dHMgKERDRCxSSSxEU1IsQ1RTKSB0byBjaGFuZ2UKKwkJICogLSBtYXNrIHBhc3NlZCBpbiBhcmcgZm9yIGxpbmVzIG9mIGludGVyZXN0CisgCQkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKKwkJICovCisJCWNhc2UgVElPQ01JV0FJVDoKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCQljcHJldiA9IGluZm8tPnN0YXRlLT5pY291bnQ7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQl3aGlsZSAoMSkgeworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQljbm93ID0gaW5mby0+c3RhdGUtPmljb3VudDsgLyogYXRvbWljIGNvcHkgKi8KKwkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYgCisJCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpCisJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KKwkJCQlpZiAoICgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fQ0QpICAmJiAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQljcHJldiA9IGNub3c7CisJCQl9CisJCQkvKiBOT1RSRUFDSEVEICovCisKKwkJLyogCisJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAorCQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCQkgKi8KKwkJY2FzZSBUSU9DR0lDT1VOVDoKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWNub3cgPSBpbmZvLT5zdGF0ZS0+aWNvdW50OworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJaWNvdW50LmN0cyA9IGNub3cuY3RzOworCQkJaWNvdW50LmRzciA9IGNub3cuZHNyOworCQkJaWNvdW50LnJuZyA9IGNub3cucm5nOworCQkJaWNvdW50LmRjZCA9IGNub3cuZGNkOworCQkJaWNvdW50LnJ4ID0gY25vdy5yeDsKKwkJCWljb3VudC50eCA9IGNub3cudHg7CisJCQlpY291bnQuZnJhbWUgPSBjbm93LmZyYW1lOworCQkJaWNvdW50Lm92ZXJydW4gPSBjbm93Lm92ZXJydW47CisJCQlpY291bnQucGFyaXR5ID0gY25vdy5wYXJpdHk7CisJCQlpY291bnQuYnJrID0gY25vdy5icms7CisJCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSU9DU0VSR1dJTEQ6CisJCWNhc2UgVElPQ1NFUlNXSUxEOgorCQkJLyogInNldHNlcmlhbCAtVyIgaXMgY2FsbGVkIGluIERlYmlhbiBib290ICovCisJCQlwcmludGsgKCJUSU9DU0VSP1dJTEQgaW9jdGwgb2Jzb2xldGUsIGlnbm9yZWQuXG4iKTsKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJaWYgKCAgIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkgICAgJiYgKCAgIFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCisJCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCisJICByZXR1cm47CisKKwljaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICAhKGNmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPk1DUiAmPSB+KFNFUl9EVFJ8U0VSX1JUUyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJcnRzZHRyX2N0cmwoaW5mby0+TUNSKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICAoY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+TUNSIHw9IFNFUl9EVFI7CisJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IAorCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgeworCQkJaW5mby0+TUNSIHw9IFNFUl9SVFM7CisJCX0KKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlydHNkdHJfY3RybChpbmZvLT5NQ1IpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlyc19zdGFydCh0dHkpOworCX0KKworI2lmIDAKKwkvKgorCSAqIE5vIG5lZWQgdG8gd2FrZSB1cCBwcm9jZXNzZXMgaW4gb3BlbiB3YWl0LCBzaW5jZSB0aGV5CisJICogc2FtcGxlIHRoZSBDTE9DQUwgZmxhZyBvbmNlLCBhbmQgZG9uJ3QgcmVjaGVjayBpdC4KKwkgKiBYWFggIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgY29ycmVjdAorCSAqIG9yIG5vdC4gIEhlbmNlLCB0aGlzIG1heSBjaGFuZ2UuLi4uLgorCSAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCSAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworI2VuZGlmCit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX2Nsb3NlKCkKKyAqIAorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcG9ydCBnZXRzIGNsb3NlZC4gIEZpcnN0LCB3ZQorICogd2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4gIFRoZW4sIHdlIHVubGluayBpdHMKKyAqIGFzeW5jIHN0cnVjdHVyZSBmcm9tIHRoZSBpbnRlcnJ1cHQgY2hhaW4gaWYgbmVjZXNzYXJ5LCBhbmQgd2UgZnJlZQorICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mbyB8fCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfY2xvc2UiKSkKKwkJcmV0dXJuOworCisJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCURCR19DTlQoImJlZm9yZSBERUMtaHVuZyIpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygicnNfY2xvc2UgdHR5cyVkLCBjb3VudCA9ICVkXG4iLCBpbmZvLT5saW5lLCBzdGF0ZS0+Y291bnQpOworI2VuZGlmCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChzdGF0ZS0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBzdGF0ZS0+Y291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAic3RhdGUtPmNvdW50IGlzICVkXG4iLCBzdGF0ZS0+Y291bnQpOworCQlzdGF0ZS0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1zdGF0ZS0+Y291bnQgPCAwKSB7CisJCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5cyVkOiAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHN0YXRlLT5jb3VudCk7CisJCXN0YXRlLT5jb3VudCA9IDA7CisJfQorCWlmIChzdGF0ZS0+Y291bnQpIHsKKwkJREJHX0NOVCgiYmVmb3JlIERFQy0yIik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCisJICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCisJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKKwkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQorCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJICAgICAgICAvKiBkaXNhYmxlIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCSAgICAgICAgY3VzdG9tLmludGVuYSA9IElGX1JCRjsKKwkJbWIoKTsKKwkJLyogY2xlYXIgYW55IHBlbmRpbmcgcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJY3VzdG9tLmludHJlcSA9IElGX1JCRjsKKwkJbWIoKTsKKworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkJICovCisJCXJzX3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPnRpbWVvdXQpOworCX0KKwlzaHV0ZG93bihpbmZvKTsKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQkKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwl0dHktPmNsb3NpbmcgPSAwOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKwlpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiByc193YWl0X3VudGlsX3NlbnQoKSAtLS0gd2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkKKyAqLworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7CisJaW50IGxzcjsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQorCQlyZXR1cm47IC8qIEp1c3QgaW4gY2FzZS4uLi4gKi8KKworCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisJLyoKKwkgKiBTZXQgdGhlIGNoZWNrIGludGVydmFsIHRvIGJlIDEvNSBvZiB0aGUgZXN0aW1hdGVkIHRpbWUgdG8KKwkgKiBzZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gIFRoZSBjaGVjaworCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KKwkgKiAKKwkgKiBOb3RlOiB3ZSBoYXZlIHRvIHVzZSBwcmV0dHkgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkKKwkgKiB0aGUgTklTVC1QQ1RTLgorCSAqLworCWNoYXJfdGltZSA9IChpbmZvLT50aW1lb3V0IC0gSFovNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7CisJY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKKwlpZiAoY2hhcl90aW1lID09IDApCisJCWNoYXJfdGltZSA9IDE7CisJaWYgKHRpbWVvdXQpCisJICBjaGFyX3RpbWUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjaGFyX3RpbWUsIHRpbWVvdXQpOworCS8qCisJICogSWYgdGhlIHRyYW5zbWl0dGVyIGhhc24ndCBjbGVhcmVkIGluIHR3aWNlIHRoZSBhcHByb3hpbWF0ZQorCSAqIGFtb3VudCBvZiB0aW1lIHRvIHNlbmQgdGhlIGVudGlyZSBGSUZPLCBpdCBwcm9iYWJseSB3b24ndAorCSAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdworCSAqIGNvbnRyb2wsIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gIEhlbmNlLCBpZiBpdCBldmVyCisJICogdGFrZXMgbG9uZ2VyIHRoYW4gaW5mby0+dGltZW91dCwgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYQorCSAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKKwkgKiAyKmluZm8tPnRpbWVvdXQuCisJICovCisJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyKmluZm8tPnRpbWVvdXQpCisJCXRpbWVvdXQgPSAyKmluZm8tPnRpbWVvdXQ7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCXByaW50aygiSW4gcnNfd2FpdF91bnRpbF9zZW50KCVkKSBjaGVjaz0lbHUuLi4iLCB0aW1lb3V0LCBjaGFyX3RpbWUpOworCXByaW50aygiamlmZj0lbHUuLi4iLCBqaWZmaWVzKTsKKyNlbmRpZgorCXdoaWxlKCEoKGxzciA9IGN1c3RvbS5zZXJkYXRyKSAmIFNEUl9UU1JFKSkgeworI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKKwkJcHJpbnRrKCJzZXJkYXRyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLmRvbmVcbiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKK30KKworLyoKKyAqIHJzX2hhbmd1cCgpIC0tLSBjYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlID0gaW5mby0+c3RhdGU7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2hhbmd1cCIpKQorCQlyZXR1cm47CisKKwlzdGF0ZSA9IGluZm8tPnN0YXRlOworCisJcnNfZmx1c2hfYnVmZmVyKHR0eSk7CisJc2h1dGRvd24oaW5mbyk7CisJaW5mby0+ZXZlbnQgPSAwOworCXN0YXRlLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX29wZW4oKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCit7CisjaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyNlbHNlCisJc3RydWN0IHdhaXRfcXVldWUgd2FpdCA9IHsgY3VycmVudCwgTlVMTCB9OworI2VuZGlmCisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBzdGF0ZS0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIHN0YXRlLT5saW5lLCBzdGF0ZS0+Y291bnQpOworI2VuZGlmCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCXN0YXRlLT5jb3VudC0tOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCisJCSAgICAgICAgcnRzZHRyX2N0cmwoU0VSX0RUUnxTRVJfUlRTKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkgICAgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworI2Vsc2UKKwkJCXJldHZhbCA9IC1FQUdBSU47CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwgfHwgKCEoY2lhYi5wcmEgJiBTRVJfRENEKSkgKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHN0YXRlLT5jb3VudCk7CisjZW5kaWYKKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCWlmIChleHRyYV9jb3VudCkKKwkJc3RhdGUtPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBzdGF0ZS0+Y291bnQpOworI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9hc3luY19zdHJ1Y3QoaW50IGxpbmUsIHN0cnVjdCBhc3luY19zdHJ1Y3QgKipyZXRfaW5mbykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvOworCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnNzdGF0ZTsKKworCXNzdGF0ZSA9IHJzX3RhYmxlICsgbGluZTsKKwlzc3RhdGUtPmNvdW50Kys7CisJaWYgKHNzdGF0ZS0+aW5mbykgeworCQkqcmV0X2luZm8gPSBzc3RhdGUtPmluZm87CisJCXJldHVybiAwOworCX0KKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFzeW5jX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykgeworCQlzc3RhdGUtPmNvdW50LS07CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhc3luY19zdHJ1Y3QpKTsKKyNpZmRlZiBERUNMQVJFX1dBSVRRVUVVRQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworI2VuZGlmCisJaW5mby0+bWFnaWMgPSBTRVJJQUxfTUFHSUM7CisJaW5mby0+cG9ydCA9IHNzdGF0ZS0+cG9ydDsKKwlpbmZvLT5mbGFncyA9IHNzdGF0ZS0+ZmxhZ3M7CisJaW5mby0+eG1pdF9maWZvX3NpemUgPSBzc3RhdGUtPnhtaXRfZmlmb19zaXplOworCWluZm8tPmxpbmUgPSBsaW5lOworCXRhc2tsZXRfaW5pdCgmaW5mby0+dGxldCwgZG9fc29mdGludCwgKHVuc2lnbmVkIGxvbmcpaW5mbyk7CisJaW5mby0+c3RhdGUgPSBzc3RhdGU7CisJaWYgKHNzdGF0ZS0+aW5mbykgeworCQlrZnJlZShpbmZvKTsKKwkJKnJldF9pbmZvID0gc3N0YXRlLT5pbmZvOworCQlyZXR1cm4gMDsKKwl9CisJKnJldF9pbmZvID0gc3N0YXRlLT5pbmZvID0gaW5mbzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAorICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bworICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKKyAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCByc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0CSppbmZvOworCWludCAJCQlyZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZwkJcGFnZTsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IE5SX1BPUlRTKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dmFsID0gZ2V0X2FzeW5jX3N0cnVjdChsaW5lLCAmaW5mbyk7CisJaWYgKHJldHZhbCkgeworCQlyZXR1cm4gcmV0dmFsOworCX0KKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19vcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoInJzX29wZW4gJXMsIGNvdW50ID0gJWRcbiIsIHR0eS0+bmFtZSwgaW5mby0+c3RhdGUtPmNvdW50KTsKKyNlbmRpZgorCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworCWlmICghdG1wX2J1ZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmICh0bXBfYnVmKQorCQkJZnJlZV9wYWdlKHBhZ2UpOworCQllbHNlCisJCQl0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBwb3J0IGlzIHRoZSBtaWRkbGUgb2YgY2xvc2luZywgYmFpbCBvdXQgbm93CisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qCisJICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKKwkgKi8KKwlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJyc19vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKKwkJICAgICAgIHJldHZhbCk7CisjZW5kaWYKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygicnNfb3BlbiAlcyBzdWNjZXNzZnVsLi4uIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogL3Byb2MgZnMgcm91dGluZXMuLi4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbGluZV9pbmZvKGNoYXIgKmJ1Ziwgc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IHN0YXRlLT5pbmZvLCBzY3JfaW5mbzsKKwljaGFyCXN0YXRfYnVmWzMwXSwgY29udHJvbCwgc3RhdHVzOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWQ6IHVhcnQ6YW1pZ2FfYnVpbHRpbiIsc3RhdGUtPmxpbmUpOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBjdXJyZW50IFJTLTIzMiBsaW5lcworCSAqLworCWlmICghaW5mbykgeworCQlpbmZvID0gJnNjcl9pbmZvOwkvKiBUaGlzIGlzIGp1c3QgZm9yIHNlcmlhbF97aW4sb3V0fSAqLworCisJCWluZm8tPm1hZ2ljID0gU0VSSUFMX01BR0lDOworCQlpbmZvLT5mbGFncyA9IHN0YXRlLT5mbGFnczsKKwkJaW5mby0+cXVvdCA9IDA7CisJCWluZm8tPnR0eSA9IE5VTEw7CisJfQorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzdGF0dXMgPSBjaWFiLnByYTsKKwljb250cm9sID0gaW5mbyA/IGluZm8tPk1DUiA6IHN0YXR1czsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlzdGF0X2J1ZlswXSA9IDA7CisJc3RhdF9idWZbMV0gPSAwOworCWlmKCEoY29udHJvbCAmIFNFUl9SVFMpKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8UlRTIik7CisJaWYoIShzdGF0dXMgJiBTRVJfQ1RTKSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifENUUyIpOworCWlmKCEoY29udHJvbCAmIFNFUl9EVFIpKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8RFRSIik7CisJaWYoIShzdGF0dXMgJiBTRVJfRFNSKSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOworCWlmKCEoc3RhdHVzICYgU0VSX0RDRCkpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDRCIpOworCisJaWYgKGluZm8tPnF1b3QpIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBiYXVkOiVkIiwKKwkJCSAgICAgICBzdGF0ZS0+YmF1ZF9iYXNlIC8gaW5mby0+cXVvdCk7CisJfQorCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eDolZCByeDolZCIsCisJCSAgICAgIHN0YXRlLT5pY291bnQudHgsIHN0YXRlLT5pY291bnQucngpOworCisJaWYgKHN0YXRlLT5pY291bnQuZnJhbWUpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgZmU6JWQiLCBzdGF0ZS0+aWNvdW50LmZyYW1lKTsKKworCWlmIChzdGF0ZS0+aWNvdW50LnBhcml0eSkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBwZTolZCIsIHN0YXRlLT5pY291bnQucGFyaXR5KTsKKworCWlmIChzdGF0ZS0+aWNvdW50LmJyaykKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBicms6JWQiLCBzdGF0ZS0+aWNvdW50LmJyayk7CisKKwlpZiAoc3RhdGUtPmljb3VudC5vdmVycnVuKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIG9lOiVkIiwgc3RhdGUtPmljb3VudC5vdmVycnVuKTsKKworCS8qCisJICogTGFzdCB0aGluZyBpcyB0aGUgUlMtMjMyIHN0YXR1cyBsaW5lcworCSAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgbDsKKwlvZmZfdAliZWdpbiA9IDA7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAic2VyaW5mbzoxLjAgZHJpdmVyOiVzXG4iLCBzZXJpYWxfdmVyc2lvbik7CisJbCA9IGxpbmVfaW5mbyhwYWdlICsgbGVuLCAmcnNfdGFibGVbMF0pOworCWxlbiArPSBsOworCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCisJICBnb3RvIGRvbmU7CisJaWYgKGxlbitiZWdpbiA8IG9mZikgeworCSAgYmVnaW4gKz0gbGVuOworCSAgbGVuID0gMDsKKwl9CisJKmVvZiA9IDE7Citkb25lOgorCWlmIChvZmYgPj0gbGVuK2JlZ2luKQorCQlyZXR1cm4gMDsKKwkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7CisJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX2luaXQoKSBhbmQgZnJpZW5kcworICoKKyAqIHJzX2luaXQoKSBpcyBjYWxsZWQgYXQgYm9vdC10aW1lIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBkcml2ZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIHByaW50cyBvdXQgdGhlIGFwcHJvcHJpYXRlIHNlcmlhbCBkcml2ZXIgdmVyc2lvbgorICogbnVtYmVyLCBhbmQgaWRlbnRpZmllcyB3aGljaCBvcHRpb25zIHdlcmUgY29uZmlndXJlZCBpbnRvIHRoaXMKKyAqIGRyaXZlci4KKyAqLworc3RhdGljIF9JTkxJTkVfIHZvaWQgc2hvd19zZXJpYWxfdmVyc2lvbih2b2lkKQoreworIAlwcmludGsoS0VSTl9JTkZPICIlcyB2ZXJzaW9uICVzXG4iLCBzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24pOworfQorCisKK2ludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSk7Cit2b2lkIHVucmVnaXN0ZXJfc2VyaWFsKGludCBsaW5lKTsKKworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNlcmlhbF9vcHMgPSB7CisJLm9wZW4gPSByc19vcGVuLAorCS5jbG9zZSA9IHJzX2Nsb3NlLAorCS53cml0ZSA9IHJzX3dyaXRlLAorCS5wdXRfY2hhciA9IHJzX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IHJzX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gcnNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcnNfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSByc19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gcnNfaW9jdGwsCisJLnRocm90dGxlID0gcnNfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSByc191bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHJzX3NldF90ZXJtaW9zLAorCS5zdG9wID0gcnNfc3RvcCwKKwkuc3RhcnQgPSByc19zdGFydCwKKwkuaGFuZ3VwID0gcnNfaGFuZ3VwLAorCS5icmVha19jdGwgPSByc19icmVhaywKKwkuc2VuZF94Y2hhciA9IHJzX3NlbmRfeGNoYXIsCisJLndhaXRfdW50aWxfc2VudCA9IHJzX3dhaXRfdW50aWxfc2VudCwKKwkucmVhZF9wcm9jID0gcnNfcmVhZF9wcm9jLAorCS50aW9jbWdldCA9IHJzX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHJzX3Rpb2Ntc2V0LAorfTsKKworLyoKKyAqIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICovCitzdGF0aWMgaW50IF9faW5pdCByc19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CisKKwlpZiAoIU1BQ0hfSVNfQU1JR0EgfHwgIUFNSUdBSFdfUFJFU0VOVChBTUlfU0VSSUFMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcigxKTsKKwlpZiAoIXNlcmlhbF9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiAgV2UgcmVxdWVzdCBTRVJEQVQgYW5kIFNFUlBFUiBvbmx5LCBiZWNhdXNlIHRoZSBzZXJpYWwgcmVnaXN0ZXJzIGFyZQorCSAqICB0b28gc3ByZWFkZWQgb3ZlciB0aGUgY3VzdG9tIHJlZ2lzdGVyIHNwYWNlCisJICovCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQ1VTVE9NX1BIWVNBRERSKzB4MzAsIDQsICJhbWlzZXJpYWwgW1BhdWxhXSIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJSVJRX3BvcnRzID0gTlVMTDsKKworCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisKKwlzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImFtaXNlcmlhbCI7CisJc2VyaWFsX2RyaXZlci0+bmFtZSA9ICJ0dHlTIjsKKwlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKKwlzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OworCXNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJnNlcmlhbF9vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKKworCXN0YXRlID0gcnNfdGFibGU7CisJc3RhdGUtPm1hZ2ljID0gU1NUQVRFX01BR0lDOworCXN0YXRlLT5wb3J0ID0gKGludCkmY3VzdG9tLnNlcmRhdHI7IC8qIEp1c3QgdG8gZ2l2ZSBpdCBhIHZhbHVlICovCisJc3RhdGUtPmxpbmUgPSAwOworCXN0YXRlLT5jdXN0b21fZGl2aXNvciA9IDA7CisJc3RhdGUtPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwlzdGF0ZS0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJc3RhdGUtPmljb3VudC5jdHMgPSBzdGF0ZS0+aWNvdW50LmRzciA9IAorCSAgc3RhdGUtPmljb3VudC5ybmcgPSBzdGF0ZS0+aWNvdW50LmRjZCA9IDA7CisJc3RhdGUtPmljb3VudC5yeCA9IHN0YXRlLT5pY291bnQudHggPSAwOworCXN0YXRlLT5pY291bnQuZnJhbWUgPSBzdGF0ZS0+aWNvdW50LnBhcml0eSA9IDA7CisJc3RhdGUtPmljb3VudC5vdmVycnVuID0gc3RhdGUtPmljb3VudC5icmsgPSAwOworCS8qCisJaWYoc3RhdGUtPnBvcnQgJiYgY2hlY2tfcmVnaW9uKHN0YXRlLT5wb3J0LFJFR0lPTl9MRU5HVEgoc3RhdGUpKSkKKwkgIGNvbnRpbnVlOworCSovCisKKwlwcmludGsoS0VSTl9JTkZPICJ0dHlTJWQgaXMgdGhlIGFtaWdhIGJ1aWx0aW4gc2VyaWFsIHBvcnRcbiIsCisJCSAgICAgICBzdGF0ZS0+bGluZSk7CisKKwkvKiBIYXJkd2FyZSBzZXQgdXAgKi8KKworCXN0YXRlLT5iYXVkX2Jhc2UgPSBhbWlnYV9jb2xvcmNsb2NrOworCXN0YXRlLT54bWl0X2ZpZm9fc2l6ZSA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzZXQgSVNScywgYW5kIHRoZW4gZGlzYWJsZSB0aGUgcnggaW50ZXJydXB0cyAqLworCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9UQkUsIHNlcl90eF9pbnQsIDAsICJzZXJpYWwgVFgiLCBzdGF0ZSk7CisJcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1JCRiwgc2VyX3J4X2ludCwgU0FfSU5URVJSVVBULCAic2VyaWFsIFJYIiwgc3RhdGUpOworCisJLyogdHVybiBvZmYgUnggYW5kIFR4IGludGVycnVwdHMgKi8KKwljdXN0b20uaW50ZW5hID0gSUZfUkJGIHwgSUZfVEJFOworCW1iKCk7CisKKwkvKiBjbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwljdXN0b20uaW50cmVxID0gSUZfUkJGIHwgSUZfVEJFOworCW1iKCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKgorCSAqIHNldCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9ucyBmb3IgdGhlIG1vZGVtIGNvbnRyb2wgZmxhZ3MsCisJICogYW5kIGNsZWFyIFJUUyBhbmQgRFRSCisJICovCisJY2lhYi5kZHJhIHw9IChTRVJfRFRSIHwgU0VSX1JUUyk7ICAgLyogb3V0cHV0cyAqLworCWNpYWIuZGRyYSAmPSB+KFNFUl9EQ0QgfCBTRVJfQ1RTIHwgU0VSX0RTUik7ICAvKiBpbnB1dHMgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgcnNfZXhpdCh2b2lkKSAKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IHJzX3RhYmxlWzBdLmluZm87CisKKwkvKiBwcmludGsoIlVubG9hZGluZyAlczogdmVyc2lvbiAlc1xuIiwgc2VyaWFsX25hbWUsIHNlcmlhbF92ZXJzaW9uKTsgKi8KKwl0YXNrbGV0X2tpbGwoJmluZm8tPnRsZXQpOworCWlmICgoZXJyb3IgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpKQorCQlwcmludGsoIlNFUklBTDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgc2VyaWFsIGRyaXZlciAoJWQpXG4iLAorCQkgICAgICAgZXJyb3IpOworCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCisJaWYgKGluZm8pIHsKKwkgIHJzX3RhYmxlWzBdLmluZm8gPSBOVUxMOworCSAga2ZyZWUoaW5mbyk7CisJfQorCisJaWYgKHRtcF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0bXBfYnVmKTsKKwkJdG1wX2J1ZiA9IE5VTEw7CisJfQorCisJcmVsZWFzZV9tZW1fcmVnaW9uKENVU1RPTV9QSFlTQUREUisweDMwLCA0KTsKK30KKworbW9kdWxlX2luaXQocnNfaW5pdCkKK21vZHVsZV9leGl0KHJzX2V4aXQpCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VyaWFsIGNvbnNvbGUgZHJpdmVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmZGVmIENPTkZJR19TRVJJQUxfQ09OU09MRQorCitzdGF0aWMgdm9pZCBhbWlnYV9zZXJpYWxfcHV0YyhjaGFyIGMpCit7CisJY3VzdG9tLnNlcmRhdCA9ICh1bnNpZ25lZCBjaGFyKWMgfCAweDEwMDsKKwl3aGlsZSAoIShjdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCisJCWJhcnJpZXIoKTsKK30KKworLyoKKyAqCVByaW50IGEgc3RyaW5nIHRvIHRoZSBzZXJpYWwgcG9ydCB0cnlpbmcgbm90IHRvIGRpc3R1cmIKKyAqCWFueSBwb3NzaWJsZSByZWFsIHVzZSBvZiB0aGUgcG9ydC4uLgorICoKKyAqCVRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNlcmlhbF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCQl1bnNpZ25lZCBjb3VudCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnRlbmEgPSBjdXN0b20uaW50ZW5hcjsKKworCWN1c3RvbS5pbnRlbmEgPSBJRl9UQkU7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQlpZiAoKnMgPT0gJ1xuJykKKwkJCWFtaWdhX3NlcmlhbF9wdXRjKCdccicpOworCQlhbWlnYV9zZXJpYWxfcHV0YygqcysrKTsKKwl9CisKKwljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgKGludGVuYSAmIElGX1RCRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IDA7CisJcmV0dXJuIHNlcmlhbF9kcml2ZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJjb25zID0geworCS5uYW1lID0JCSJ0dHlTIiwKKwkud3JpdGUgPQlzZXJpYWxfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlID0Jc2VyaWFsX2NvbnNvbGVfZGV2aWNlLAorCS5mbGFncyA9CUNPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXggPQktMSwKK307CisKKy8qCisgKglSZWdpc3RlciBjb25zb2xlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhbWlzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfY29uc29sZSgmc2VyY29ucyk7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGFtaXNlcmlhbF9jb25zb2xlX2luaXQpOworI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCkBAIC0wLDAgKzEsODYyIEBACisvKiBEZXJpdmVkIGZyb20gQXBwbGljb20gZHJpdmVyIGFjLmMgZm9yIFNDTyBVbml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQb3J0ZWQgYnkgRGF2aWQgV29vZGhvdXNlLCBBeGlvbSAoQ2FtYnJpZGdlKSBMdGQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBkd213MkBpbmZyYWRlYWQub3JnIDMwLzgvOTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkSWQ6IGFjLmMsdiAxLjMwIDIwMDAvMDMvMjIgMTY6MDM6NTcgZHdtdzIgRXhwICQJCQkgICAgICovCisvKiBUaGlzIG1vZHVsZSBpcyBmb3IgTGludXggMi4xIGFuZCAyLjIgc2VyaWVzIGtlcm5lbHMuICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBKIFBBR0VUIDE4LzAyLzk0IHBhc3NhZ2UgVjIuNC4yIGlvY3RsIGF2ZWMgY29kZSAyIHJlc2V0IHRvIGxlcyBpbnRlcnJ1cHQgICovCisvKiBjZWNpIHBvdXIgcmVzZXRlciBjb3JyZWN0ZW1lbnQgYXByZXMgdW5lIHNvcnRpZSBzYXV2YWdlICAgICAgICAgICAgICAgICAgICovCisvKiBKIFBBR0VUIDAyLzA1Lzk0IHBhc3NhZ2UgVjIuNC4zIGRhbnMgbGUgdHJhaXRlbWVudCBkZSBkJ2ludGVycnVwdGlvbiwgICAgICovCisvKiBMb29wQ291bnQgbidldGFpdCBwYXMgaW5pdGlhbGlzZSBhIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGIExBRk9SU0UgMDQvMDcvOTUgdmVyc2lvbiBWMi42LjAgbGVjdHVyZSBiaWRvbiBhcHJlcyBhY2NlcyBhIHVuZSBjYXJ0ZSAgICovCisvKiAgICAgICAgICAgcG91ciBsaWJlcmVyIGxlIGJ1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBKLlBBR0VUIDE5LzExLzk1IHZlcnNpb24gVjIuNi4xIE5vbWJyZSwgYWRkcmVzc2UsaXJxIG4nZXN0IHBsdXMgY29uZmlndXJlICovCisvKiBldCBwYXNzZSBlbiBhcmd1bWVudCBhIGFjaW5pdCwgbWFpcyBlc3Qgc2NydXRlIHN1ciBsZSBidXMgcG91ciBzJ2FkYXB0ZXIgICovCisvKiBhdSBub21icmUgZGUgY2FydGVzIHByZXNlbnRlcyBzdXIgbGUgYnVzLiBJT0NMIGNvZGUgNiBhZmZpY2hhaXQgVjIuNC4zICAgICovCisvKiBGLkxBRk9SU0UgMjgvMTEvOTUgY3JlYXRpb24gZGUgZmljaGllcnMgYWNYWC5vIGF2ZWMgbGVzIGRpZmZlcmVudGVzICAgICAgICovCisvKiBhZHJlc3NlcyBkZSBiYXNlIGRlcyBjYXJ0ZXMsIElPQ1RMIDYgcGx1cyBjb21wbGV0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBKLlBBR0VUIGxlIDE5LzA4Lzk2IGNvcGllIGRlIGxhIHZlcnNpb24gVjIuNiBlbiBWMi44LjAgc2FucyBtb2RpZmljYXRpb24gICovCisvKiBkZSBjb2RlIGF1dHJlIHF1ZSBsZSB0ZXh0ZSBWMi42LjEgZW4gVjIuOC4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiYXBwbGljb20uaCIKKworCisvKiBOT1RFOiBXZSB1c2UgZm9yIGxvb3BzIHdpdGgge3dyaXRlLHJlYWR9YigpIGluc3RlYWQgb2YgCisgICBtZW1jcHlfe2Zyb20sdG99aW8gdGhyb3VnaG91dCB0aGlzIGRyaXZlci4gVGhpcyBpcyBiZWNhdXNlCisgICB0aGUgYm9hcmQgZG9lc24ndCBjb3JyZWN0bHkgaGFuZGxlIHdvcmQgYWNjZXNzZXMgLSBvbmx5CisgICBieXRlcy4gCisqLworCisKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIE1BWF9CT0FSRCA4CQkvKiBtYXhpbXVtIG9mIHBjIGJvYXJkIHBvc3NpYmxlICovCisjZGVmaW5lIE1BWF9JU0FfQk9BUkQgNAorI2RlZmluZSBMRU5fUkFNX0lPIDB4ODAwCisjZGVmaW5lIEFDX01JTk9SIDE1NworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQVBQTElDT00KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTSAgICAgICAgICAgICAgICAweDEzODkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0lHRU5FUklDICAgICAweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwSUJTX0NBTiAweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwUEZCICAgICAweDAwMDMKKyNlbmRpZgorI2RlZmluZSBNQVhfUENJX0RFVklDRV9OVU0gMworCitzdGF0aWMgY2hhciAqYXBwbGljb21fcGNpX2Rldm5hbWVzW10gPSB7CisJIlBDSSBib2FyZCIsCisJIlBDSTIwMDBJQlMgLyBQQ0kyMDAwQ0FOIiwKKwkiUENJMjAwMFBGQiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhcHBsaWNvbV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FQUExJQ09NLCBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSUdFTkVSSUMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExJQ09NLCBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSTIwMDBJQlNfQ0FOLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTSwgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwUEZCLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFwcGxpY29tX3BjaV90YmwpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBXb29kaG91c2UgJiBBcHBsaWNvbSBJbnRlcm5hdGlvbmFsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQXBwbGljb20gUHJvZmlidXMgY2FyZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiYWMiKTsKKworCitzdGF0aWMgc3RydWN0IGFwcGxpY29tX2JvYXJkIHsKKwl1bnNpZ25lZCBsb25nIFBoeXNJTzsKKwl2b2lkIF9faW9tZW0gKlJhbUlPOworCXdhaXRfcXVldWVfaGVhZF90IEZsYWdTbGVlcFNlbmQ7CisJbG9uZyBpcnE7CisJc3BpbmxvY2tfdCBtdXRleDsKK30gYXBic1tNQVhfQk9BUkRdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGlycSA9IDA7CS8qIGludGVycnVwdCBudW1iZXIgSVJRICAgICAgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW0gPSAwOwkvKiBwaHlzaWNhbCBzZWdtZW50IG9mIGJvYXJkICAqLworCittb2R1bGVfcGFyYW0oaXJxLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG9mIHRoZSBBcHBsaWNvbSBib2FyZCIpOworbW9kdWxlX3BhcmFtKG1lbSwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJTaGFyZWQgTWVtb3J5IEFkZHJlc3Mgb2YgQXBwbGljb20gYm9hcmQiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBudW1ib2FyZHM7CS8qIG51bWJlciBvZiBpbnN0YWxsZWQgYm9hcmRzICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBEdW1teTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChGbGFnU2xlZXBSZWMpOworc3RhdGljIHVuc2lnbmVkIGludCBXcml0ZUVycm9yQ291bnQ7CS8qIG51bWJlciBvZiB3cml0ZSBlcnJvciAgICAgICovCitzdGF0aWMgdW5zaWduZWQgaW50IFJlYWRFcnJvckNvdW50OwkvKiBudW1iZXIgb2YgcmVhZCBlcnJvciAgICAgICAqLworc3RhdGljIHVuc2lnbmVkIGludCBEZXZpY2VFcnJvckNvdW50OwkvKiBudW1iZXIgb2YgZGV2aWNlIGVycm9yICAgICAqLworCitzdGF0aWMgc3NpemVfdCBhY19yZWFkIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IGFjX3dyaXRlIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBpbnQgYWNfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKKwkJICAgIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGlycXJldHVybl90IGFjX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkucmVhZCA9IGFjX3JlYWQsCisJLndyaXRlID0gYWNfd3JpdGUsCisJLmlvY3RsID0gYWNfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYWNfbWlzY2RldiA9IHsKKwlBQ19NSU5PUiwKKwkiYWMiLAorCSZhY19mb3BzCit9OworCitzdGF0aWMgaW50IGR1bW15OwkvKiBkZXZfaWQgZm9yIHJlcXVlc3RfaXJxKCkgKi8KKworc3RhdGljIGludCBhY19yZWdpc3Rlcl9ib2FyZCh1bnNpZ25lZCBsb25nIHBoeXNsb2MsIHZvaWQgX19pb21lbSAqbG9jLCAKKwkJICAgICAgdW5zaWduZWQgY2hhciBib2FyZG5vKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYnl0ZV9yZXNldF9pdDsKKworCWlmKChyZWFkYihsb2MgKyBDT05GX0VORF9URVNUKSAgICAgIT0gMHgwMCkgfHwKKwkgICAocmVhZGIobG9jICsgQ09ORl9FTkRfVEVTVCArIDEpICE9IDB4NTUpIHx8CisJICAgKHJlYWRiKGxvYyArIENPTkZfRU5EX1RFU1QgKyAyKSAhPSAweEFBKSB8fAorCSAgIChyZWFkYihsb2MgKyBDT05GX0VORF9URVNUICsgMykgIT0gMHhGRikpCisJCXJldHVybiAwOworCisJaWYgKCFib2FyZG5vKQorCQlib2FyZG5vID0gcmVhZGIobG9jICsgTlVNQ0FSRF9PV05FUl9UT19QQyk7CisKKwlpZiAoIWJvYXJkbm8gJiYgYm9hcmRubyA+IE1BWF9CT0FSRCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCb2FyZCAjJWQgKGF0IDB4JWx4KSBpcyBvdXQgb2YgcmFuZ2UgKDEgPD0geCA8PSAlZCkuXG4iLAorCQkgICAgICAgYm9hcmRubywgcGh5c2xvYywgTUFYX0JPQVJEKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFwYnNbYm9hcmRubyAtIDFdLlJhbUlPKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJvYXJkICMlZCAoYXQgMHglbHgpIGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIGJvYXJkICMlZCAoYXQgMHglbHgpXG4iLCAKKwkJICAgICAgIGJvYXJkbm8sIHBoeXNsb2MsIGJvYXJkbm8sIGFwYnNbYm9hcmRuby0xXS5QaHlzSU8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlib2FyZG5vLS07CisKKwlhcGJzW2JvYXJkbm9dLlBoeXNJTyA9IHBoeXNsb2M7CisJYXBic1tib2FyZG5vXS5SYW1JTyA9IGxvYzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcGJzW2JvYXJkbm9dLkZsYWdTbGVlcFNlbmQpOworCXNwaW5fbG9ja19pbml0KCZhcGJzW2JvYXJkbm9dLm11dGV4KTsKKwlieXRlX3Jlc2V0X2l0ID0gcmVhZGIobG9jICsgUkFNX0lUX1RPX1BDKTsKKworCW51bWJvYXJkcysrOworCXJldHVybiBib2FyZG5vICsgMTsKK30KKworI2lmZGVmIE1PRFVMRQorCisjZGVmaW5lIGFwcGxpY29tX2luaXQgaW5pdF9tb2R1bGUKKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBpOworCisJbWlzY19kZXJlZ2lzdGVyKCZhY19taXNjZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkQ7IGkrKykgeworCisJCWlmICghYXBic1tpXS5SYW1JTykKKwkJCWNvbnRpbnVlOworCisJCWlmIChhcGJzW2ldLmlycSkKKwkJCWZyZWVfaXJxKGFwYnNbaV0uaXJxLCAmZHVtbXkpOworCisJCWlvdW5tYXAoYXBic1tpXS5SYW1JTyk7CisJfQorfQorCisjZW5kaWYJCQkJLyogTU9EVUxFICovCisKK2ludCBfX2luaXQgYXBwbGljb21faW5pdCh2b2lkKQoreworCWludCBpLCBudW1pc2EgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXZvaWQgX19pb21lbSAqUmFtSU87CisJaW50IGJvYXJkbm87CisKKwlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSBkcml2ZXI6ICRJZDogYWMuYyx2IDEuMzAgMjAwMC8wMy8yMiAxNjowMzo1NyBkd213MiBFeHAgJFxuIik7CisKKwkvKiBObyBtZW0gYW5kIGlycSBnaXZlbiAtIGNoZWNrIGZvciBhIFBDSSBjYXJkICovCisKKwl3aGlsZSAoIChkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIGRldikpKSB7CisKKwkJaWYgKGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQVBQTElDT00pCisJCQljb250aW51ZTsKKwkJCisJCWlmIChkZXYtPmRldmljZSAgPiBNQVhfUENJX0RFVklDRV9OVU0gfHwgZGV2LT5kZXZpY2UgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCQlyZXR1cm4gLUVJTzsKKworCQlSYW1JTyA9IGlvcmVtYXAoZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgTEVOX1JBTV9JTyk7CisKKwkJaWYgKCFSYW1JTykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWMubzogRmFpbGVkIHRvIGlvcmVtYXAgUENJIG1lbW9yeSBzcGFjZSBhdCAweCVseFxuIiwgZGV2LT5yZXNvdXJjZVswXS5zdGFydCk7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXBwbGljb20gJXMgZm91bmQgYXQgbWVtIDB4JWx4LCBpcnEgJWRcbiIsCisJCSAgICAgICBhcHBsaWNvbV9wY2lfZGV2bmFtZXNbZGV2LT5kZXZpY2UtMV0sIGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIAorCQkgICAgICAgZGV2LT5pcnEpOworCisJCWJvYXJkbm8gPSBhY19yZWdpc3Rlcl9ib2FyZChkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCBSYW1JTywwKTsKKwkJaWYgKCFib2FyZG5vKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhYy5vOiBQQ0kgQXBwbGljb20gZGV2aWNlIGRvZXNuJ3QgaGF2ZSBjb3JyZWN0IHNpZ25hdHVyZS5cbiIpOworCQkJaW91bm1hcChSYW1JTyk7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYWNfaW50ZXJydXB0LCBTQV9TSElSUSwgIkFwcGxpY29tIFBDSSIsICZkdW1teSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkIG5vdCBhbGxvY2F0ZSBJUlEgJWQgZm9yIFBDSSBBcHBsaWNvbSBkZXZpY2UuXG4iLCBkZXYtPmlycSk7CisJCQlpb3VubWFwKFJhbUlPKTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCQkJYXBic1tib2FyZG5vIC0gMV0uUmFtSU8gPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBFbmFibGUgaW50ZXJydXB0cy4gKi8KKworCQl3cml0ZWIoMHg0MCwgYXBic1tib2FyZG5vIC0gMV0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisKKwkJYXBic1tib2FyZG5vIC0gMV0uaXJxID0gZGV2LT5pcnE7CisJfQorCisJLyogRmluaXNoZWQgd2l0aCBQQ0kgY2FyZHMuIElmIG5vbmUgcmVnaXN0ZXJlZCwgCisJICogYW5kIHRoZXJlIHdhcyBubyBtZW0vaXJxIHNwZWNpZmllZCwgZXhpdCAqLworCisJaWYgKCFtZW0gfHwgIWlycSkgeworCQlpZiAobnVtYm9hcmRzKQorCQkJZ290byBmaW47CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWMubzogTm8gUENJIGJvYXJkcyBmb3VuZC5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWMubzogRm9yIGFuIElTQSBib2FyZCB5b3UgbXVzdCBzdXBwbHkgbWVtb3J5IGFuZCBpcnEgcGFyYW1ldGVycy5cbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCX0KKworCS8qIE5vdyB0cnkgdGhlIHNwZWNpZmllZCBJU0EgY2FyZHMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNBX0JPQVJEOyBpKyspIHsKKwkJUmFtSU8gPSBpb3JlbWFwKG1lbSArIChMRU5fUkFNX0lPICogaSksIExFTl9SQU1fSU8pOworCisJCWlmICghUmFtSU8pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFjLm86IEZhaWxlZCB0byBpb3JlbWFwIHRoZSBJU0EgY2FyZCdzIG1lbW9yeSBzcGFjZSAoc2xvdCAjJWQpXG4iLCBpICsgMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKGJvYXJkbm8gPSBhY19yZWdpc3Rlcl9ib2FyZCgodW5zaWduZWQgbG9uZyltZW0rIChMRU5fUkFNX0lPKmkpLAorCQkJCQkJICBSYW1JTyxpKzEpKSkgeworCQkJaW91bm1hcChSYW1JTyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50ayhLRVJOX05PVElDRSAiQXBwbGljb20gSVNBIGNhcmQgZm91bmQgYXQgbWVtIDB4JWx4LCBpcnEgJWRcbiIsIG1lbSArIChMRU5fUkFNX0lPKmkpLCBpcnEpOworCisJCWlmICghbnVtaXNhKSB7CisJCQlpZiAocmVxdWVzdF9pcnEoaXJxLCAmYWNfaW50ZXJydXB0LCBTQV9TSElSUSwgIkFwcGxpY29tIElTQSIsICZkdW1teSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgYWxsb2NhdGUgSVJRICVkIGZvciBJU0EgQXBwbGljb20gZGV2aWNlLlxuIiwgaXJxKTsKKwkJCQlpb3VubWFwKFJhbUlPKTsKKwkJCQlhcGJzW2JvYXJkbm8gLSAxXS5SYW1JTyA9IE5VTEw7CisJCQl9CisJCQllbHNlCisJCQkJYXBic1tib2FyZG5vIC0gMV0uaXJxID0gaXJxOworCQl9CisJCWVsc2UKKwkJCWFwYnNbYm9hcmRubyAtIDFdLmlycSA9IDA7CisKKwkJbnVtaXNhKys7CisJfQorCisJaWYgKCFudW1pc2EpCisJCXByaW50ayhLRVJOX1dBUk5JTkciYWMubzogTm8gdmFsaWQgSVNBIEFwcGxpY29tIGJvYXJkcyBmb3VuZCBhdCBtZW0gMHglbHhcbiIsbWVtKTsKKworIGZpbjoKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZGbGFnU2xlZXBSZWMpOworCisJV3JpdGVFcnJvckNvdW50ID0gMDsKKwlSZWFkRXJyb3JDb3VudCA9IDA7CisJRGV2aWNlRXJyb3JDb3VudCA9IDA7CisKKwlpZiAobnVtYm9hcmRzKSB7CisJCW1pc2NfcmVnaXN0ZXIoJmFjX21pc2NkZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEOyBpKyspIHsKKwkJCWludCBzZXJpYWw7CisJCQljaGFyIGJvYXJkbmFtZVsoU0VSSUFMX05VTUJFUiAtIFRZUEVfQ0FSRCkgKyAxXTsKKworCQkJaWYgKCFhcGJzW2ldLlJhbUlPKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKHNlcmlhbCA9IDA7IHNlcmlhbCA8IFNFUklBTF9OVU1CRVIgLSBUWVBFX0NBUkQ7IHNlcmlhbCsrKQorCQkJCWJvYXJkbmFtZVtzZXJpYWxdID0gcmVhZGIoYXBic1tpXS5SYW1JTyArIFRZUEVfQ0FSRCArIHNlcmlhbCk7CisKKwkJCWJvYXJkbmFtZVtzZXJpYWxdID0gMDsKKworCisJCQlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSBib2FyZCAlZDogJXMsIFBST00gViVkLiVkIiwKKwkJCSAgICAgICBpKzEsIGJvYXJkbmFtZSwKKwkJCSAgICAgICAoaW50KShyZWFkYihhcGJzW2ldLlJhbUlPICsgVkVSUykgPj4gNCksCisJCQkgICAgICAgKGludCkocmVhZGIoYXBic1tpXS5SYW1JTyArIFZFUlMpICYgMHhGKSk7CisJCQkKKwkJCXNlcmlhbCA9IChyZWFkYihhcGJzW2ldLlJhbUlPICsgU0VSSUFMX05VTUJFUikgPDwgMTYpICsgCisJCQkJKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSICsgMSkgPDwgOCkgKyAKKwkJCQkocmVhZGIoYXBic1tpXS5SYW1JTyArIFNFUklBTF9OVU1CRVIgKyAyKSApOworCisJCQlpZiAoc2VyaWFsICE9IDApCisJCQkJcHJpbnRrKCIgUy9OICVkXG4iLCBzZXJpYWwpOworCQkJZWxzZQorCQkJCXByaW50aygiXG4iKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwllbHNlCisJCXJldHVybiAtRU5YSU87Cit9CisKKworI2lmbmRlZiBNT0RVTEUKK19faW5pdGNhbGwoYXBwbGljb21faW5pdCk7CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgYWNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgTnVtQ2FyZDsJLyogQm9hcmQgbnVtYmVyIDEgLT4gOCAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgSW5kZXhDYXJkOwkvKiBJbmRleCBib2FyZCBudW1iZXIgMCAtPiA3ICAgICAqLworCXVuc2lnbmVkIGNoYXIgVGljQ2FyZDsJLyogQm9hcmQgVElDIHRvIHNlbmQgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBDdXJyZW50IHByaW9yaXR5ICAgICAgICAgICAgICAqLworCXN0cnVjdCBzdF9yYW1faW8gc3RfbG9jOworCXN0cnVjdCBtYWlsYm94IHRtcG1haWxib3g7CisjaWZkZWYgREVCVUcKKwlpbnQgYzsKKyNlbmRpZgorCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKGNvdW50ICE9IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKSArIHNpemVvZihzdHJ1Y3QgbWFpbGJveCkpIHsKKwkJc3RhdGljIGludCB3YXJuY291bnQgPSA1OworCQlpZiAod2FybmNvdW50KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJIbW1tLiB3cml0ZSgpIG9mIEFwcGxpY29tIGNhcmQsIGxlbmd0aCAlemQgIT0gZXhwZWN0ZWQgJXpkXG4iLAorCQkJICAgICAgIGNvdW50LCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbykgKyBzaXplb2Yoc3RydWN0IG1haWxib3gpKTsKKwkJCXdhcm5jb3VudC0tOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKGNvcHlfZnJvbV91c2VyKCZzdF9sb2MsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pKSkgCisJCXJldHVybiAtRUZBVUxUOworCQorCWlmKGNvcHlfZnJvbV91c2VyKCZ0bXBtYWlsYm94LCAmYnVmW3NpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKV0sCisJCQkgIHNpemVvZihzdHJ1Y3QgbWFpbGJveCkpKSAKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlOdW1DYXJkID0gc3RfbG9jLm51bV9jYXJkOwkvKiBib2FyZCBudW1iZXIgdG8gc2VuZCAgICAgICAgICAqLworCVRpY0NhcmQgPSBzdF9sb2MudGljX2Rlc19mcm9tX3BjOwkvKiB0aWMgbnVtYmVyIHRvIHNlbmQgICAgICAgICAgICAqLworCUluZGV4Q2FyZCA9IE51bUNhcmQgLSAxOworCisJaWYoKE51bUNhcmQgPCAxKSB8fCAoTnVtQ2FyZCA+IE1BWF9CT0FSRCkgfHwgIWFwYnNbSW5kZXhDYXJkXS5SYW1JTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiV3JpdGUgdG8gYXBwbGljb20gY2FyZCAjJWQuIHN0cnVjdCBzdF9yYW1faW8gZm9sbG93czoiLAorCSAgICAgICBJbmRleENhcmQrMSk7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKTspIHsKKwkJCisJCQlwcmludGsoIlxuJTUuNVg6ICUyLjJYIiwgYywgKCh1bnNpZ25lZCBjaGFyICopICZzdF9sb2MpW2NdKTsKKworCQkJZm9yIChjKys7IGMgJSA4ICYmIGMgPCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbyk7IGMrKykgeworCQkJCXByaW50aygiICUyLjJYIiwgKCh1bnNpZ25lZCBjaGFyICopICZzdF9sb2MpW2NdKTsKKwkJCX0KKwkJfQorCisJCXByaW50aygiXG5zdHJ1Y3QgbWFpbGJveCBmb2xsb3dzOiIpOworCisJCWZvciAoYyA9IDA7IGMgPCBzaXplb2Yoc3RydWN0IG1haWxib3gpOykgeworCQkJcHJpbnRrKCJcbiU1LjVYOiAlMi4yWCIsIGMsICgodW5zaWduZWQgY2hhciAqKSAmdG1wbWFpbGJveClbY10pOworCisJCQlmb3IgKGMrKzsgYyAlIDggJiYgYyA8IHNpemVvZihzdHJ1Y3QgbWFpbGJveCk7IGMrKykgeworCQkJCXByaW50aygiICUyLjJYIiwgKCh1bnNpZ25lZCBjaGFyICopICZ0bXBtYWlsYm94KVtjXSk7CisJCQl9CisJCX0KKworCQlwcmludGsoIlxuIik7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcGJzW0luZGV4Q2FyZF0ubXV0ZXgsIGZsYWdzKTsKKworCS8qIFRlc3Qgb2N0ZXQgcmVhZHkgY29ycmVjdCAqLworCWlmKHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkgPiAyKSB7IAorCQlEdW1teSA9IHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFZFUlMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW0luZGV4Q2FyZF0ubXV0ZXgsIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBQTElDT00gZHJpdmVyIHdyaXRlIGVycm9yIGJvYXJkICVkLCBEYXRhRnJvbVBjUmVhZHkgPSAlZFxuIiwKKwkJICAgICAgIEluZGV4Q2FyZCwoaW50KXJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkpOworCQlEZXZpY2VFcnJvckNvdW50Kys7CisJCXJldHVybiAtRUlPOworCX0KKwkKKwkvKiBQbGFjZSBvdXJzZWx2ZXMgb24gdGhlIHdhaXQgcXVldWUgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZhcGJzW0luZGV4Q2FyZF0uRmxhZ1NsZWVwU2VuZCwgJndhaXQpOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgY2FyZCBpcyByZWFkeSBmb3IgdXMgKi8KKwl3aGlsZSAocmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgREFUQV9GUk9NX1BDX1JFQURZKSAhPSAwKSB7CisJCUR1bW15ID0gcmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUyk7CisJCS8qIEl0J3MgYnVzeS4gU2xlZXAuICovCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXBic1tJbmRleENhcmRdLm11dGV4LCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmFwYnNbSW5kZXhDYXJkXS5GbGFnU2xlZXBTZW5kLAorCQkJCQkgICZ3YWl0KTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwYnNbSW5kZXhDYXJkXS5tdXRleCwgZmxhZ3MpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCS8qIFdlIG1heSBub3QgaGF2ZSBhY3R1YWxseSBzbGVwdCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFwYnNbSW5kZXhDYXJkXS5GbGFnU2xlZXBTZW5kLCAmd2FpdCk7CisKKwl3cml0ZWIoMSwgYXBic1tJbmRleENhcmRdLlJhbUlPICsgREFUQV9GUk9NX1BDX1JFQURZKTsKKworCS8qIFdoaWNoIGlzIGJlc3QgLSBsb2NrIGRvd24gdGhlIHBhZ2VzIHdpdGggcmF3aW8gYW5kIHRoZW4KKwkgICBjb3B5IGRpcmVjdGx5LCBvciB1c2UgYm91bmNlIGJ1ZmZlcnM/IEZvciBub3cgd2UgZG8gdGhlIGxhdHRlciAKKwkgICBiZWNhdXNlIGl0IHdvcmtzIHdpdGggMi4yIHN0aWxsICovCisJeworCQl1bnNpZ25lZCBjaGFyICpmcm9tID0gKHVuc2lnbmVkIGNoYXIgKikgJnRtcG1haWxib3g7CisJCXZvaWQgX19pb21lbSAqdG8gPSBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fRlJPTV9QQzsKKwkJaW50IGM7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3QgbWFpbGJveCk7IGMrKykKKwkJCXdyaXRlYigqKGZyb20rKyksIHRvKyspOworCX0KKworCXdyaXRlYigweDIwLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBUSUNfT1dORVJfRlJPTV9QQyk7CisJd3JpdGViKDB4ZmYsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIE5VTUNBUkRfT1dORVJfRlJPTV9QQyk7CisJd3JpdGViKFRpY0NhcmQsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFRJQ19ERVNfRlJPTV9QQyk7CisJd3JpdGViKE51bUNhcmQsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIE5VTUNBUkRfREVTX0ZST01fUEMpOworCXdyaXRlYigyLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBEQVRBX0ZST01fUENfUkVBRFkpOworCXdyaXRlYigxLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisJRHVtbXkgPSByZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBWRVJTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW0luZGV4Q2FyZF0ubXV0ZXgsIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hY19yZWFkKGludCBJbmRleENhcmQsIGNoYXIgX191c2VyICpidWYsCisJCXN0cnVjdCBzdF9yYW1faW8gKnN0X2xvYywgc3RydWN0IG1haWxib3ggKm1haWxib3gpCit7CisJdm9pZCBfX2lvbWVtICpmcm9tID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgUkFNX1RPX1BDOworCXVuc2lnbmVkIGNoYXIgKnRvID0gKHVuc2lnbmVkIGNoYXIgKikmbWFpbGJveDsKKyNpZmRlZiBERUJVRworCWludCBjOworI2VuZGlmCisKKwlzdF9sb2MtPnRpY19vd25lcl90b19wYyA9IHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFRJQ19PV05FUl9UT19QQyk7CisJc3RfbG9jLT5udW1jYXJkX293bmVyX3RvX3BjID0gcmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgTlVNQ0FSRF9PV05FUl9UT19QQyk7CisKKworCXsKKwkJaW50IGM7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3QgbWFpbGJveCk7IGMrKykKKwkJCSoodG8rKykgPSByZWFkYihmcm9tKyspOworCX0KKwl3cml0ZWIoMSwgYXBic1tJbmRleENhcmRdLlJhbUlPICsgQUNLX0ZST01fUENfUkVBRFkpOworCXdyaXRlYigxLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBUWVBfQUNLX0ZST01fUEMpOworCXdyaXRlYihJbmRleENhcmQrMSwgYXBic1tJbmRleENhcmRdLlJhbUlPICsgTlVNQ0FSRF9BQ0tfRlJPTV9QQyk7CisJd3JpdGViKHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFRJQ19PV05FUl9UT19QQyksIAorCSAgICAgICBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBUSUNfQUNLX0ZST01fUEMpOworCXdyaXRlYigyLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBBQ0tfRlJPTV9QQ19SRUFEWSk7CisJd3JpdGViKDAsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfVE9fUENfUkVBRFkpOworCXdyaXRlYigyLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisJRHVtbXkgPSByZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBWRVJTKTsKKworI2lmZGVmIERFQlVHCisJCXByaW50aygiUmVhZCBmcm9tIGFwcGxpY29tIGNhcmQgIyVkLiBzdHJ1Y3Qgc3RfcmFtX2lvIGZvbGxvd3M6IiwgTnVtQ2FyZCk7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKTspIHsKKwkJCXByaW50aygiXG4lNS41WDogJTIuMlgiLCBjLCAoKHVuc2lnbmVkIGNoYXIgKilzdF9sb2MpW2NdKTsKKworCQkJZm9yIChjKys7IGMgJSA4ICYmIGMgPCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbyk7IGMrKykgeworCQkJCXByaW50aygiICUyLjJYIiwgKCh1bnNpZ25lZCBjaGFyICopc3RfbG9jKVtjXSk7CisJCQl9CisJCX0KKworCQlwcmludGsoIlxuc3RydWN0IG1haWxib3ggZm9sbG93czoiKTsKKworCQlmb3IgKGMgPSAwOyBjIDwgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KTspIHsKKwkJCXByaW50aygiXG4lNS41WDogJTIuMlgiLCBjLCAoKHVuc2lnbmVkIGNoYXIgKiltYWlsYm94KVtjXSk7CisKKwkJCWZvciAoYysrOyBjICUgOCAmJiBjIDwgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KTsgYysrKSB7CisJCQkJcHJpbnRrKCIgJTIuMlgiLCAoKHVuc2lnbmVkIGNoYXIgKiltYWlsYm94KVtjXSk7CisJCQl9CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IHN0X3JhbV9pbykgKyBzaXplb2Yoc3RydWN0IG1haWxib3gpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWNfcmVhZCAoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgcmV0ID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyNpZmRlZiBERUJVRworCWludCBsb29wY291bnQ9MDsKKyNlbmRpZgorCS8qIE5vIG5lZWQgdG8gcmF0ZWxpbWl0IHRoaXMuIE9ubHkgcm9vdCBjYW4gdHJpZ2dlciBpdCBhbnl3YXkgKi8KKwlpZiAoY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pICsgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KSkgeworCQlwcmludGsoIEtFUk5fV0FSTklORyAiSG1tbS4gcmVhZCgpIG9mIEFwcGxpY29tIGNhcmQsIGxlbmd0aCAlemQgIT0gZXhwZWN0ZWQgJXpkXG4iLAorCQkJY291bnQsc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pICsgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwl3aGlsZSgxKSB7CisJCS8qIFN0aWNrIG91cnNlbGYgb24gdGhlIHdhaXQgcXVldWUgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJkZsYWdTbGVlcFJlYywgJndhaXQpOworCQkKKwkJLyogU2NhbiBlYWNoIGJvYXJkLCBsb29raW5nIGZvciBvbmUgd2hpY2ggaGFzIGEgcGFja2V0IGZvciB1cyAqLworCQlmb3IgKGk9MDsgaSA8IE1BWF9CT0FSRDsgaSsrKSB7CisJCQlpZiAoIWFwYnNbaV0uUmFtSU8pCisJCQkJY29udGludWU7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXBic1tpXS5tdXRleCwgZmxhZ3MpOworCQkJCisJCQl0bXAgPSByZWFkYihhcGJzW2ldLlJhbUlPICsgREFUQV9UT19QQ19SRUFEWSk7CisJCQkKKwkJCWlmICh0bXAgPT0gMikgeworCQkJCXN0cnVjdCBzdF9yYW1faW8gc3RfbG9jOworCQkJCXN0cnVjdCBtYWlsYm94IG1haWxib3g7CisKKwkJCQkvKiBHb3QgYSBwYWNrZXQgZm9yIHVzICovCisJCQkJcmV0ID0gZG9fYWNfcmVhZChpLCBidWYsICZzdF9sb2MsICZtYWlsYm94KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW2ldLm11dGV4LCBmbGFncyk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmRmxhZ1NsZWVwUmVjLCAmd2FpdCk7CisKKwkJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnN0X2xvYywgc2l6ZW9mKHN0X2xvYykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoY29weV90b191c2VyKGJ1ZiArIHNpemVvZihzdF9sb2MpLCAmbWFpbGJveCwgc2l6ZW9mKG1haWxib3gpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIHRtcDsKKwkJCX0KKwkJCQorCQkJaWYgKHRtcCA+IDIpIHsKKwkJCQkvKiBHb3QgYW4gZXJyb3IgKi8KKwkJCQlEdW1teSA9IHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBWRVJTKTsKKwkJCQkKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW2ldLm11dGV4LCBmbGFncyk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmRmxhZ1NsZWVwUmVjLCAmd2FpdCk7CisJCQkJCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBQTElDT00gZHJpdmVyIHJlYWQgZXJyb3IgYm9hcmQgJWQsIERhdGFUb1BjUmVhZHkgPSAlZFxuIiwKKwkJCQkgICAgICAgaSwoaW50KXJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX1RPX1BDX1JFQURZKSk7CisJCQkJRGV2aWNlRXJyb3JDb3VudCsrOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJCisJCQkvKiBOb3RoaW5nIGZvciB1cy4gVHJ5IHRoZSBuZXh0IGJvYXJkICovCisJCQlEdW1teSA9IHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBWRVJTKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwYnNbaV0ubXV0ZXgsIGZsYWdzKTsKKwkJCQorCQl9IC8qIHBlciBib2FyZCAqLworCisJCS8qIE9LIC0gTm8gYm9hcmRzIGhhZCBkYXRhIGZvciB1cy4gU2xlZXAgbm93ICovCisKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJkZsYWdTbGVlcFJlYywgJndhaXQpOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisKKyNpZmRlZiBERUJVRworCQlpZiAobG9vcGNvdW50KysgPiAyKSB7CisJCQlwcmludGsoIkxvb3BpbmcgaW4gYWNfcmVhZC4gbG9vcGNvdW50ICVkXG4iLCBsb29wY291bnQpOworCQl9CisjZW5kaWYKKwl9IAorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNfaW50ZXJydXB0KGludCB2ZWMsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IEZsYWdJbnQ7CisJdW5zaWduZWQgaW50IExvb3BDb3VudDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwkvLyAgICBwcmludGsoIkFwcGxpY29tIGludGVycnVwdCBvbiBJUlEgJWQgb2NjdXJyZWRcbiIsIHZlYyk7CisKKwlMb29wQ291bnQgPSAwOworCisJZG8geworCQlGbGFnSW50ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRDsgaSsrKSB7CisJCQkKKwkJCS8qIFNraXAgaWYgdGhpcyBib2FyZCBkb2Vzbid0IGV4aXN0ICovCisJCQlpZiAoIWFwYnNbaV0uUmFtSU8pCisJCQkJY29udGludWU7CisKKwkJCXNwaW5fbG9jaygmYXBic1tpXS5tdXRleCk7CisKKwkJCS8qIFNraXAgaWYgdGhpcyBib2FyZCBkb2Vzbid0IHdhbnQgYXR0ZW50aW9uICovCisJCQlpZihyZWFkYihhcGJzW2ldLlJhbUlPICsgUkFNX0lUX1RPX1BDKSA9PSAwKSB7CisJCQkJc3Bpbl91bmxvY2soJmFwYnNbaV0ubXV0ZXgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQloYW5kbGVkID0gMTsKKwkJCUZsYWdJbnQgPSAxOworCQkJd3JpdGViKDAsIGFwYnNbaV0uUmFtSU8gKyBSQU1fSVRfVE9fUEMpOworCisJCQlpZiAocmVhZGIoYXBic1tpXS5SYW1JTyArIERBVEFfVE9fUENfUkVBRFkpID4gMikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQUExJQ09NIGRyaXZlciBpbnRlcnJ1cHQgZXJyIGJvYXJkICVkLCBEYXRhVG9QY1JlYWR5ID0gJWRcbiIsCisJCQkJICAgICAgIGkrMSwoaW50KXJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX1RPX1BDX1JFQURZKSk7CisJCQkJRGV2aWNlRXJyb3JDb3VudCsrOworCQkJfQorCisJCQlpZigocmVhZGIoYXBic1tpXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkgPiAyKSAmJiAKKwkJCSAgIChyZWFkYihhcGJzW2ldLlJhbUlPICsgREFUQV9GUk9NX1BDX1JFQURZKSAhPSA2KSkgeworCQkJCQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQUExJQ09NIGRyaXZlciBpbnRlcnJ1cHQgZXJyIGJvYXJkICVkLCBEYXRhRnJvbVBjUmVhZHkgPSAlZFxuIiwKKwkJCQkgICAgICAgaSsxLChpbnQpcmVhZGIoYXBic1tpXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkpOworCQkJCURldmljZUVycm9yQ291bnQrKzsKKwkJCX0KKworCQkJaWYgKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX1RPX1BDX1JFQURZKSA9PSAyKSB7CS8qIG1haWxib3ggc2VudCBieSB0aGUgY2FyZCA/ICAgKi8KKwkJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmRmxhZ1NsZWVwUmVjKSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmRmxhZ1NsZWVwUmVjKTsKKwkJCX0KKwkJCX0KKworCQkJaWYgKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX0ZST01fUENfUkVBRFkpID09IDApIHsJLyogcmFtIGkvbyBmcmVlIGZvciB3cml0ZSBieSBwYyA/ICovCisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFwYnNbaV0uRmxhZ1NsZWVwU2VuZCkpIHsJLyogcHJvY2VzcyBzbGVlcCBkdXJpbmcgcmVhZCA/ICAgICovCisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXBic1tpXS5GbGFnU2xlZXBTZW5kKTsKKwkJCQl9CisJCQl9CisJCQlEdW1teSA9IHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBWRVJTKTsKKworCQkJaWYocmVhZGIoYXBic1tpXS5SYW1JTyArIFJBTV9JVF9UT19QQykpIHsKKwkJCQkvKiBUaGVyZSdzIGFub3RoZXIgaW50IHdhaXRpbmcgb24gdGhpcyBjYXJkICovCisJCQkJc3Bpbl91bmxvY2soJmFwYnNbaV0ubXV0ZXgpOworCQkJCWktLTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl91bmxvY2soJmFwYnNbaV0ubXV0ZXgpOworCQkJfQorCQl9CisJCWlmIChGbGFnSW50KQorCQkJTG9vcENvdW50ID0gMDsKKwkJZWxzZQorCQkJTG9vcENvdW50Kys7CisJfSB3aGlsZShMb29wQ291bnQgPCAyKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisKK3N0YXRpYyBpbnQgYWNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorICAgICAKK3sJCQkJLyogQCBBREcgb3UgQVRPIHNlbG9uIGxlIGNhcyAqLworCWludCBpOworCXVuc2lnbmVkIGNoYXIgSW5kZXhDYXJkOworCXZvaWQgX19pb21lbSAqcG1lbTsKKwlpbnQgcmV0ID0gMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGJ5dGVfcmVzZXRfaXQ7CisJc3RydWN0IHN0X3JhbV9pbyAqYWRnbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qIEluIGdlbmVyYWwsIHRoZSBkZXZpY2UgaXMgb25seSBvcGVuYWJsZSBieSByb290IGFueXdheSwgc28gd2UncmUgbm90CisJICAgcGFydGljdWxhcmx5IGNvbmNlcm5lZCB0aGF0IGJvZ3VzIGlvY3RscyBjYW4gZmxvb2QgdGhlIGNvbnNvbGUuICovCisKKwlhZGdsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN0X3JhbV9pbyksIEdGUF9LRVJORUwpOworCWlmICghYWRnbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYWRnbCwgYXJncCwgc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pKSkgeworCQlrZnJlZShhZGdsKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCUluZGV4Q2FyZCA9IGFkZ2wtPm51bV9jYXJkLTE7CisJIAorCWlmKGNtZCAhPSAwICYmIGNtZCAhPSA2ICYmCisJICAgKChJbmRleENhcmQgPj0gTUFYX0JPQVJEKSB8fCAhYXBic1tJbmRleENhcmRdLlJhbUlPKSkgeworCQlzdGF0aWMgaW50IHdhcm5jb3VudCA9IDEwOworCQlpZiAod2FybmNvdW50KSB7CisJCQlwcmludGsoIEtFUk5fV0FSTklORyAiQVBQTElDT00gZHJpdmVyIElPQ1RMLCBiYWQgYm9hcmQgbnVtYmVyICVkXG4iLChpbnQpSW5kZXhDYXJkKzEpOworCQkJd2FybmNvdW50LS07CisJCX0KKwkJa2ZyZWUoYWRnbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJCQorCWNhc2UgMDoKKwkJcG1lbSA9IGFwYnNbSW5kZXhDYXJkXS5SYW1JTzsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKTsgaSsrKQorCQkJKCh1bnNpZ25lZCBjaGFyICopYWRnbClbaV09cmVhZGIocG1lbSsrKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBhZGdsLCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbykpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgQ09ORl9FTkRfVEVTVDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWFkZ2wtPmNvbmZfZW5kX3Rlc3RbaV0gPSByZWFkYihwbWVtKyspOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJYWRnbC0+ZXJyb3JfY29kZVtpXSA9IHJlYWRiKHBtZW0rKyk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlhZGdsLT5wYXJhbWV0ZXJfZXJyb3JbaV0gPSByZWFkYihwbWVtKyspOworCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUzsKKwkJYWRnbC0+dmVycyA9IHJlYWRiKHBtZW0pOworCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVFlQRV9DQVJEOworCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJCWFkZ2wtPnJlc2VydjFbaV0gPSByZWFkYihwbWVtKyspOworCQkqKGludCAqKSZhZGdsLT5yZXNlcnYxWzIwXSA9ICAKKwkJCShyZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSKSA8PCAxNikgKyAKKwkJCShyZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSICsgMSkgPDwgOCkgKyAKKwkJCShyZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSICsgMikgKTsKKworCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFkZ2wsIHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIDI6CisJCXBtZW0gPSBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBDT05GX0VORF9URVNUOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJCXdyaXRlYigweGZmLCBwbWVtKyspOworCQl3cml0ZWIoYWRnbC0+ZGF0YV9mcm9tX3BjX3JlYWR5LCAKKwkJICAgICAgIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSk7CisKKwkJd3JpdGViKDEsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFJBTV9JVF9GUk9NX1BDKTsKKwkJCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkQ7IGkrKykgeworCQkJaWYgKGFwYnNbaV0uUmFtSU8pIHsKKwkJCQlieXRlX3Jlc2V0X2l0ID0gcmVhZGIoYXBic1tpXS5SYW1JTyArIFJBTV9JVF9UT19QQyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVElDX0RFU19GUk9NX1BDOworCQl3cml0ZWIoYWRnbC0+dGljX2Rlc19mcm9tX3BjLCBwbWVtKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVElDX09XTkVSX1RPX1BDOworCQlhZGdsLT50aWNfb3duZXJfdG9fcGMgICAgID0gcmVhZGIocG1lbSsrKTsKKwkJYWRnbC0+bnVtY2FyZF9vd25lcl90b19wYyA9IHJlYWRiKHBtZW0pOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFkZ2wsc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJd3JpdGViKGFkZ2wtPm51bV9jYXJkLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBOVU1DQVJEX09XTkVSX1RPX1BDKTsKKwkJd3JpdGViKGFkZ2wtPm51bV9jYXJkLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBOVU1DQVJEX0RFU19GUk9NX1BDKTsKKwkJd3JpdGViKGFkZ2wtPm51bV9jYXJkLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBOVU1DQVJEX0FDS19GUk9NX1BDKTsKKwkJd3JpdGViKDQsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSk7CisJCXdyaXRlYigxLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQVBQTElDT00gZHJpdmVyIHJlbGVhc2UgLi4uLiBWMi44LjAgKCRSZXZpc2lvbjogMS4zMCAkKVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBpbnN0YWxsZWQgYm9hcmRzIC4gJWRcbiIsIChpbnQpIG51bWJvYXJkcyk7CisJCXByaW50ayhLRVJOX0lORk8gIlNlZ21lbnQgb2YgYm9hcmQgLi4uLi4uLi4uLi4gJVhcbiIsIChpbnQpIG1lbSk7CisJCXByaW50ayhLRVJOX0lORk8gIkludGVycnVwdCBJUlEgbnVtYmVyIC4uLi4uLi4gJWRcbiIsIChpbnQpIGlycSk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkQ7IGkrKykgeworCQkJaW50IHNlcmlhbDsKKwkJCWNoYXIgYm9hcmRuYW1lWyhTRVJJQUxfTlVNQkVSIC0gVFlQRV9DQVJEKSArIDFdOworCisJCQlpZiAoIWFwYnNbaV0uUmFtSU8pCisJCQkJY29udGludWU7CisKKwkJCWZvciAoc2VyaWFsID0gMDsgc2VyaWFsIDwgU0VSSUFMX05VTUJFUiAtIFRZUEVfQ0FSRDsgc2VyaWFsKyspCisJCQkJYm9hcmRuYW1lW3NlcmlhbF0gPSByZWFkYihhcGJzW2ldLlJhbUlPICsgVFlQRV9DQVJEICsgc2VyaWFsKTsKKwkJCWJvYXJkbmFtZVtzZXJpYWxdID0gMDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvbSB2ZXJzaW9uIGJvYXJkICVkIC4uLi4uLi4gViVkLiVkICVzIiwKKwkJCSAgICAgICBpKzEsCisJCQkgICAgICAgKGludCkocmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUykgPj4gNCksCisJCQkgICAgICAgKGludCkocmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUykgJiAweEYpLAorCQkJICAgICAgIGJvYXJkbmFtZSk7CisKKworCQkJc2VyaWFsID0gKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSKSA8PCAxNikgKyAKKwkJCQkocmVhZGIoYXBic1tpXS5SYW1JTyArIFNFUklBTF9OVU1CRVIgKyAxKSA8PCA4KSArIAorCQkJCShyZWFkYihhcGJzW2ldLlJhbUlPICsgU0VSSUFMX05VTUJFUiArIDIpICk7CisKKwkJCWlmIChzZXJpYWwgIT0gMCkKKwkJCQlwcmludGsoIiBTL04gJWRcbiIsIHNlcmlhbCk7CisJCQllbHNlCisJCQkJcHJpbnRrKCJcbiIpOworCQl9CisJCWlmIChEZXZpY2VFcnJvckNvdW50ICE9IDApCisJCQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2VFcnJvckNvdW50IC4uLi4uLi4uLi4uICVkXG4iLCBEZXZpY2VFcnJvckNvdW50KTsKKwkJaWYgKFJlYWRFcnJvckNvdW50ICE9IDApCisJCQlwcmludGsoS0VSTl9JTkZPICJSZWFkRXJyb3JDb3VudCAuLi4uLi4uLi4uLi4uICVkXG4iLCBSZWFkRXJyb3JDb3VudCk7CisJCWlmIChXcml0ZUVycm9yQ291bnQgIT0gMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIldyaXRlRXJyb3JDb3VudCAuLi4uLi4uLi4uLi4gJWRcbiIsIFdyaXRlRXJyb3JDb3VudCk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZGbGFnU2xlZXBSZWMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2VzcyBpbiByZWFkIHBlbmRpbmdcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEOyBpKyspIHsKKwkJCWlmIChhcGJzW2ldLlJhbUlPICYmIHdhaXRxdWV1ZV9hY3RpdmUoJmFwYnNbaV0uRmxhZ1NsZWVwU2VuZCkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2VzcyBpbiB3cml0ZSBwZW5kaW5nIGJvYXJkICVkXG4iLGkrMSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQVBQTElDT00gZHJpdmVyIGlvY3RsLCB1bmtub3duIGZ1bmN0aW9uIGNvZGUgJWRcbiIsY21kKSA7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlEdW1teSA9IHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFZFUlMpOworCWtmcmVlKGFkZ2wpOworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgYXBwbGljb21fc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzRdOworCisJKHZvaWQpIGdldF9vcHRpb25zKHN0ciwgNCwgaW50cyk7CisKKwlpZiAoaW50c1swXSA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVG9vIG1hbnkgYXJndW1lbnRzIHRvICdhcHBsaWNvbT0nLCBleHBlY3RlZCBtZW0saXJxIG9ubHkuXG4iKTsKKwl9CisKKwlpZiAoaW50c1swXSA8IDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyJhcHBsaWNvbSBudW1hcmdzOiAlZFxuIiwgaW50c1swXSk7CisJCXJldHVybiAwOworCX0KKworCW1lbSA9IGludHNbMV07CisJaXJxID0gaW50c1syXTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYXBwbGljb209IiwgYXBwbGljb21fc2V0dXApOworCisjZW5kaWYJCQkJLyogTU9EVUxFICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5oIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1MzBiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qICRJZDogYXBwbGljb20uaCx2IDEuMiAxOTk5LzA4LzI4IDE1OjA5OjQ5IGR3bXcyIEV4cCAkICovCisKKworI2lmbmRlZiBfX0xJTlVYX0FQUExJQ09NX0hfXworI2RlZmluZSBfX0xJTlVYX0FQUExJQ09NX0hfXworCisKKyNkZWZpbmUgREFUQV9UT19QQ19SRUFEWSAgICAgIDB4MDAKKyNkZWZpbmUgVElDX09XTkVSX1RPX1BDICAgICAgIDB4MDEKKyNkZWZpbmUgTlVNQ0FSRF9PV05FUl9UT19QQyAgIDB4MDIKKyNkZWZpbmUgVElDX0RFU19UT19QQyAgICAgICAgIDB4MDMKKyNkZWZpbmUgTlVNQ0FSRF9ERVNfVE9fUEMgICAgIDB4MDQKKyNkZWZpbmUgREFUQV9GUk9NX1BDX1JFQURZICAgIDB4MDUKKyNkZWZpbmUgVElDX09XTkVSX0ZST01fUEMgICAgIDB4MDYKKyNkZWZpbmUgTlVNQ0FSRF9PV05FUl9GUk9NX1BDIDB4MDcKKyNkZWZpbmUgVElDX0RFU19GUk9NX1BDICAgICAgIDB4MDgKKyNkZWZpbmUgTlVNQ0FSRF9ERVNfRlJPTV9QQyAgIDB4MDkKKyNkZWZpbmUgQUNLX0ZST01fUENfUkVBRFkgICAgIDB4MEUKKyNkZWZpbmUgVElDX0FDS19GUk9NX1BDICAgICAgIDB4MEYKKyNkZWZpbmUgTlVNQ0FSRF9BQ0tfRlJPTV9QQyAgIDB4MDEwCisjZGVmaW5lIFRZUF9BQ0tfRlJPTV9QQyAgICAgICAweDAxMQorI2RlZmluZSBDT05GX0VORF9URVNUICAgICAgICAgMHgwMTIKKyNkZWZpbmUgRVJST1JfQ09ERSAgICAgICAgICAgIDB4MDE2IAorI2RlZmluZSBQQVJBTUVURVJfRVJST1IgICAgICAgMHgwMTggCisjZGVmaW5lIFZFUlMgICAgICAgICAgICAgICAgICAweDAxRSAKKyNkZWZpbmUgUkFNX1RPX1BDICAgICAgICAgICAgIDB4MDQwCisjZGVmaW5lIFJBTV9GUk9NX1BDICAgICAgICAgICAweDAxNzAKKyNkZWZpbmUgVFlQRV9DQVJEICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBTRVJJQUxfTlVNQkVSICAgICAgICAgMHgwM0RBCisjZGVmaW5lIFJBTV9JVF9GUk9NX1BDICAgICAgICAweDAzRkUKKyNkZWZpbmUgUkFNX0lUX1RPX1BDICAgICAgICAgIDB4MDNGRgorCitzdHJ1Y3QgbWFpbGJveHsKKwl1MTYgIHN0amJfY29kZWY7CQkvKiBvZmZzZXQgMDAgKi8KKwlzMTYgIHN0amJfc3RhdHVzOyAgICAgCQkvKiBvZmZzZXQgMDIgKi8KKwl1MTYgIHN0amJfdGljdXNlcl9yb290OwkJLyogb2Zmc2V0IDA0ICovCisJdTggICBzdGpiX3BpZHVzZXJbNF07CQkvKiBvZmZzZXQgMDYgKi8KKwl1MTYgIHN0amJfbW9kZTsJCQkvKiBvZmZzZXQgMEEgKi8KKwl1MTYgIHN0amJfdGltZTsJCQkvKiBvZmZzZXQgMEMgKi8KKwl1MTYgIHN0amJfc3RvcDsJCQkvKiBvZmZzZXQgMEUgKi8KKwl1MTYgIHN0amJfbmZvbmM7CQkvKiBvZmZzZXQgMTAgKi8KKwl1MTYgIHN0amJfbmNhcmQ7CQkvKiBvZmZzZXQgMTIgKi8KKwl1MTYgIHN0amJfbmNoYW47CQkvKiBvZmZzZXQgMTQgKi8KKwl1MTYgIHN0amJfbmVzOwkJCS8qIG9mZnNldCAxNiAqLworCXUxNiAgc3RqYl9uYjsJCQkvKiBvZmZzZXQgMTggKi8KKwl1MTYgIHN0amJfdHlwdmFyOwkJLyogb2Zmc2V0IDFBICovCisJdTMyICBzdGpiX2FkcjsJCQkvKiBvZmZzZXQgMUMgKi8KKwl1MTYgIHN0amJfdGljdXNlcl9kaXNwY3ljOwkvKiBvZmZzZXQgMjAgKi8KKwl1MTYgIHN0amJfdGljdXNlcl9wcm90b2NvbDsJLyogb2Zmc2V0IDIyICovCisJdTggICBzdGpiX2ZpbGxlclsxMl07CQkvKiBvZmZzZXQgMjQgKi8KKwl1OCAgIHN0amJfZGF0YVsyNTZdOwkJLyogb2Zmc2V0IDMwICovCisJfTsKKworc3RydWN0IHN0X3JhbV9pbyAKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGFfdG9fcGNfcmVhZHk7CisJdW5zaWduZWQgY2hhciB0aWNfb3duZXJfdG9fcGM7CisJdW5zaWduZWQgY2hhciBudW1jYXJkX293bmVyX3RvX3BjOworCXVuc2lnbmVkIGNoYXIgdGljX2Rlc190b19wYzsKKwl1bnNpZ25lZCBjaGFyIG51bWNhcmRfZGVzX3RvX3BjOworCXVuc2lnbmVkIGNoYXIgZGF0YV9mcm9tX3BjX3JlYWR5OworCXVuc2lnbmVkIGNoYXIgdGljX293bmVyX2Zyb21fcGM7CisJdW5zaWduZWQgY2hhciBudW1jYXJkX293bmVyX2Zyb21fcGM7CisJdW5zaWduZWQgY2hhciB0aWNfZGVzX2Zyb21fcGM7CisJdW5zaWduZWQgY2hhciBudW1jYXJkX2Rlc19mcm9tX3BjOworCXVuc2lnbmVkIGNoYXIgYWNrX3RvX3BjX3JlYWR5OworCXVuc2lnbmVkIGNoYXIgdGljX2Fja190b19wYzsKKwl1bnNpZ25lZCBjaGFyIG51bWNhcmRfYWNrX3RvX3BjOworCXVuc2lnbmVkIGNoYXIgdHlwX2Fja190b19wYzsKKwl1bnNpZ25lZCBjaGFyIGFja19mcm9tX3BjX3JlYWR5OworCXVuc2lnbmVkIGNoYXIgdGljX2Fja19mcm9tX3BjOworCXVuc2lnbmVkIGNoYXIgbnVtY2FyZF9hY2tfZnJvbV9wYzsKKwl1bnNpZ25lZCBjaGFyIHR5cF9hY2tfZnJvbV9wYzsKKwl1bnNpZ25lZCBjaGFyIGNvbmZfZW5kX3Rlc3RbNF07CisJdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlWzJdOworCXVuc2lnbmVkIGNoYXIgcGFyYW1ldGVyX2Vycm9yWzRdOworCXVuc2lnbmVkIGNoYXIgdGltZV9iYXNlOworCXVuc2lnbmVkIGNoYXIgbnVsX2luYzsKKwl1bnNpZ25lZCBjaGFyIHZlcnM7CisJdW5zaWduZWQgY2hhciBudW1fY2FyZDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydjFbMzJdOworfTsKKworCisjZW5kaWYgLyogX19MSU5VWF9BUFBMSUNPTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jZDE4NjUuaCBiL2RyaXZlcnMvY2hhci9jZDE4NjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQwOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2NkMTg2NS5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogICAgICBsaW51eC9kcml2ZXJzL2NoYXIvY2QxODY1LmggLS0gRGVmaW5pdGlvbnMgcmVsYXRpbmcgdG8gdGhlIENEMTg2NQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgU3BlY2lhbGl4IElPOCsgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgUm9nZXIgV29sZmYgKFIuRS5Xb2xmZkBCaXRXaXphcmQubmwpCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBEbWl0cnkgR29yb2RjaGFuaW4gKHBnbWRzZ0BpYmkuY29tKQorICoKKyAqICAgICAgU3BlY2lhbGl4IHBheXMgZm9yIHRoZSBkZXZlbG9wbWVudCBhbmQgc3VwcG9ydCBvZiB0aGlzIGRyaXZlci4KKyAqICAgICAgUGxlYXNlIERPIGNvbnRhY3QgaW84LWxpbnV4QHNwZWNpYWxpeC5jby51ayBpZiB5b3UgcmVxdWlyZQorICogICAgICBzdXBwb3J0LgorICoKKyAqICAgICAgVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BwZWQgaW4gdGhlIEJpdFdpemFyZCBsaW51eCBkZXZpY2UKKyAqICAgICAgZHJpdmVyIHNlcnZpY2UuIElmIHlvdSByZXF1aXJlIGEgbGludXggZGV2aWNlIGRyaXZlciBmb3IgeW91cgorICogICAgICBwcm9kdWN0LCBwbGVhc2UgY29udGFjdCBkZXZpY2VzQEJpdFdpemFyZC5ubCBmb3IgYSBxdW90ZS4KKyAqCisgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBEcml2aW5nIENEMTgwL0NEMTg2NC9DRDE4NjUgYmFzZWQgZWlnaHRwb3J0IHNlcmlhbCBjYXJkcy4KKyAqLworCisKKy8qIFZhbHVlcyBvZiBjaG9pY2UgZm9yIEludGVycnVwdCBBQ0tzICovCisvKiBUaGVzZSB2YWx1ZXMgYXJlICJvYmxpZ2F0b3J5IiBpZiB5b3UgdXNlIHRoZSByZWdpc3RlciBiYXNlZAorICogaW50ZXJydXB0IGFja25vd2xlZGdlbWVudHMuIFNlZSBwYWdlIDk5LTEwMSBvZiBWMi4wIG9mIHRoZSBDRDE4NjUKKyAqIGRhdGFib29rICovCisjZGVmaW5lIFNYX0FDS19NSU5UICAgICAweDc1ICAgIC8qIGdvZXMgdG8gUElMUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWF9BQ0tfVElOVCAgICAgMHg3NiAgICAvKiBnb2VzIHRvIFBJTFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1hfQUNLX1JJTlQgICAgIDB4NzcgICAgLyogZ29lcyB0byBQSUxSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIENoaXAgSUQgKGlzIHVzZWQgd2hlbiBjaGlwcyBhciBkYWlzeSBjaGFpbmVkLikgKi8KKyNkZWZpbmUgU1hfSUQgICAgICAgICAgIDB4MTAKKworLyogRGVmaW5pdGlvbnMgZm9yIENpcnJ1cyBMb2dpYyBDTC1DRDE4NnggOC1wb3J0IGFzeW5jIG11eCBjaGlwICovCisgCisjZGVmaW5lIENEMTg2eF9OQ0ggICAgICAgOCAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1RQQyAgICAgICAxNiAgICAgIC8qIFRpY2tzIHBlciBjaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfTkZJRk8JIDgJIC8qIFRYIEZJRk8gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBDRDE4NnhfR0lWUiAgICAgIDB4NDAgICAgLyogR2xvYmFsIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9HSUNSICAgICAgMHg0MSAgICAvKiBHbG9iYWwgSW50ZXJydXB0aW5nIENoYW5uZWwgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1BJTFIxICAgICAweDYxICAgIC8qIFByaW9yaXR5IEludGVycnVwdCBMZXZlbCBSZWdpc3RlciAxICAgICAqLworI2RlZmluZSBDRDE4NnhfUElMUjIgICAgIDB4NjIgICAgLyogUHJpb3JpdHkgSW50ZXJydXB0IExldmVsIFJlZ2lzdGVyIDIgICAgICovCisjZGVmaW5lIENEMTg2eF9QSUxSMyAgICAgMHg2MyAgICAvKiBQcmlvcml0eSBJbnRlcnJ1cHQgTGV2ZWwgUmVnaXN0ZXIgMyAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0NBUiAgICAgICAweDY0ICAgIC8qIENoYW5uZWwgQWNjZXNzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfU1JTUiAgICAgIDB4NjUgICAgLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9HRlJDUiAgICAgMHg2YiAgICAvKiBHbG9iYWwgRmlybXdhcmUgUmV2aXNpb24gQ29kZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQ0QxODZ4X1BQUkggICAgICAweDcwICAgIC8qIFByZXNjYWxlciBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfUFBSTCAgICAgIDB4NzEgICAgLyogUHJlc2NhbGVyIFBlcmlvZCBSZWdpc3RlciBMb3cgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9SRFIgICAgICAgMHg3OCAgICAvKiBSZWNlaXZlciBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1JDU1IgICAgICAweDdhICAgIC8qIFJlY2VpdmVyIENoYXJhY3RlciBTdGF0dXMgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBDRDE4NnhfVERSICAgICAgIDB4N2IgICAgLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9FT0lSICAgICAgMHg3ZiAgICAvKiBFbmQgb2YgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X01SQVIgICAgICAweDc1ICAgIC8qIE1vZGVtIFJlcXVlc3QgQWNrbm93bGVkZ2UgcmVnaXN0ZXIgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1RSQVIgICAgICAweDc2ICAgIC8qIFRyYW5zbWl0IFJlcXVlc3QgQWNrbm93bGVkZ2UgcmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1JSQVIgICAgICAweDc3ICAgIC8qIFJlY2VpdmUgUmVxdWVzdCBBY2tub3dsZWRnZSByZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1NSQ1IgICAgICAweDY2ICAgIC8qIFNlcnZpY2UgUmVxdWVzdCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICAqLworCisvKiBDaGFubmVsIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIENEMTg2eF9DQ1IgICAgICAgMHgwMSAgICAvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0lFUiAgICAgICAweDAyICAgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfQ09SMSAgICAgIDB4MDMgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9DT1IyICAgICAgMHgwNCAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0NPUjMgICAgICAweDA1ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfQ0NTUiAgICAgIDB4MDYgICAgLyogQ2hhbm5lbCBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9SRENSICAgICAgMHgwNyAgICAvKiBSZWNlaXZlIERhdGEgQ291bnQgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1NDSFIxICAgICAweDA5ICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDEgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfU0NIUjIgICAgIDB4MGEgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9TQ0hSMyAgICAgMHgwYiAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAzICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1NDSFI0ICAgICAweDBjICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDQgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfTUNPUjEgICAgIDB4MTAgICAgLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiAxIFJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9NQ09SMiAgICAgMHgxMSAgICAvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIDIgUmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X01DUiAgICAgICAweDEyICAgIC8qIE1vZGVtIENoYW5nZSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfUlRQUiAgICAgIDB4MTggICAgLyogUmVjZWl2ZSBUaW1lb3V0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9NU1ZSICAgICAgMHgyOCAgICAvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X01TVlJUUyAgICAweDI5ICAgIC8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfTVNWRFRSICAgIDB4MmEgICAgLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9SQlBSSCAgICAgMHgzMSAgICAvKiBSZWNlaXZlIEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAgKi8KKyNkZWZpbmUgQ0QxODZ4X1JCUFJMICAgICAweDMyICAgIC8qIFJlY2VpdmUgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciBMb3cgICAqLworI2RlZmluZSBDRDE4NnhfVEJQUkggICAgIDB4MzkgICAgLyogVHJhbnNtaXQgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIENEMTg2eF9UQlBSTCAgICAgMHgzYSAgICAvKiBUcmFuc21pdCBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyIExvdyAgKi8KKworCisvKiBHbG9iYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIEdJVlJfSVRNQVNLICAgICAweDA3ICAgICAvKiBJbnRlcnJ1cHQgdHlwZSBtYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfTU9ERU0gICAweDAxICAgIC8qIE1vZGVtIFNpZ25hbCBDaGFuZ2UgSW50ZXJydXB0ICAgICAgICAgICAqLworI2RlZmluZSAgR0lWUl9JVF9UWCAgICAgIDB4MDIgICAgLyogVHJhbnNtaXQgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBHSVZSX0lUX1JDViAgICAgMHgwMyAgICAvKiBSZWNlaXZlIEdvb2QgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfUkVYQyAgICAweDA3ICAgIC8qIFJlY2VpdmUgRXhjZXB0aW9uIEludGVycnVwdCAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3RlciAoUi9XKSAqLworIAorI2RlZmluZSBHSUNSX0NIQU4gICAgICAgMHgxYyAgICAvKiBDaGFubmVsIE51bWJlciBNYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0lDUl9DSEFOX09GRiAgIDIgICAgICAgLyogQ2hhbm5lbCBOdW1iZXIgc2hpZnQgICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgQ0FSX0NIQU4gICAgICAgIDB4MDcgICAgLyogQ2hhbm5lbCBOdW1iZXIgTWFzayAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUl9BNyAgICAgICAgICAweDA4ICAgIC8qIEE3IEFkZHJlc3MgRXh0ZW5zaW9uICh1bnVzZWQpICAgICAgICAgICAqLworCisKKy8qIFJlY2VpdmUgQ2hhcmFjdGVyIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAqLworCisjZGVmaW5lIFJDU1JfVE9VVCAgICAgICAweDgwICAgIC8qIFJ4IFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX1NDREVUICAgICAgMHg3MCAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBEZXRlY3RlZCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfTk9fU0MgICAgICAweDAwICAgLyogTm8gU3BlY2lhbCBDaGFyYWN0ZXJzIERldGVjdGVkICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzEgICAgICAgMHgxMCAgIC8qIFNwZWNpYWwgQ2hhciAxIChvciAxICYgMykgRGV0ZWN0ZWQgICAgICAqLworI2RlZmluZSAgUkNTUl9TQ18yICAgICAgIDB4MjAgICAvKiBTcGVjaWFsIENoYXIgMiAob3IgMiAmIDQpIERldGVjdGVkICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfU0NfMyAgICAgICAweDMwICAgLyogU3BlY2lhbCBDaGFyIDMgRGV0ZWN0ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzQgICAgICAgMHg0MCAgIC8qIFNwZWNpYWwgQ2hhciA0IERldGVjdGVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX0JSRUFLICAgICAgMHgwOCAgICAvKiBCcmVhayBoYXMgYmVlbiBkZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNTUl9QRSAgICAgICAgIDB4MDQgICAgLyogUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfRkUgICAgICAgICAweDAyICAgIC8qIEZyYW1lIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX09FICAgICAgICAgMHgwMSAgICAvKiBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgKFIvVykgKGNvbW1hbmRzIGluIGdyb3VwcyBjYW4gYmUgT1ItZWQpICovCisKKyNkZWZpbmUgQ0NSX0hBUkRSRVNFVCAgIDB4ODEgICAgLyogUmVzZXQgdGhlIGNoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1NPRlRSRVNFVCAgIDB4ODAgICAgLyogU29mdCBDaGFubmVsIFJlc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX0NPUkNIRzEgICAgIDB4NDIgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSBDaGFuZ2VkICAgICAgICovCisjZGVmaW5lIENDUl9DT1JDSEcyICAgICAweDQ0ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgQ2hhbmdlZCAgICAgICAqLworI2RlZmluZSBDQ1JfQ09SQ0hHMyAgICAgMHg0OCAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIENoYW5nZWQgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDEgICAgICAgMHgyMSAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDEgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDIgICAgICAgMHgyMiAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDIgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDMgICAgICAgMHgyMyAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDMgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDQgICAgICAgMHgyNCAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDQgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfVFhFTiAgICAgICAgMHgxOCAgICAvKiBFbmFibGUgVHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NSX1JYRU4gICAgICAgIDB4MTIgICAgLyogRW5hYmxlIFJlY2VpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1RYRElTICAgICAgIDB4MTQgICAgLyogRGlzYWJsZSBUcmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDUl9SWERJUyAgICAgICAweDExICAgIC8qIERpc2FibGUgUmVjZWl2ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBJRVJfRFNSICAgICAgICAgMHg4MCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIERTUiBjaGFuZ2UgICAgICAgICAgKi8KKyNkZWZpbmUgSUVSX0NEICAgICAgICAgIDB4NDAgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBDRCBjaGFuZ2UgICAgICAgICAgICovCisjZGVmaW5lIElFUl9DVFMgICAgICAgICAweDIwICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gQ1RTIGNoYW5nZSAgICAgICAgICAqLworI2RlZmluZSBJRVJfUlhEICAgICAgICAgMHgxMCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFJlY2VpdmUgRGF0YSAgICAgICAgKi8KKyNkZWZpbmUgSUVSX1JYU0MgICAgICAgIDB4MDggICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSZWNlaXZlIFNwZWMuIENoYXIgICovCisjZGVmaW5lIElFUl9UWFJEWSAgICAgICAweDA0ICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gVFggRklGTyBlbXB0eSAgICAgICAqLworI2RlZmluZSBJRVJfVFhFTVBUWSAgICAgMHgwMiAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFRYIGNvbXBsZXRlbHkgZW1wdHkgKi8KKyNkZWZpbmUgSUVSX1JFVCAgICAgICAgIDB4MDEgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSWCBFeGMuIFRpbWVvdXQgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIENPUjFfT0REUCAgICAgICAweDgwICAgIC8qIE9kZCBQYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX1BBUk1PREUgICAgMHg2MCAgICAvKiBQYXJpdHkgTW9kZSBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfTk9QQVIgICAgICAweDAwICAgLyogTm8gUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxX0ZPUkNFUEFSICAgMHgyMCAgIC8qIEZvcmNlIFBhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV9OT1JNUEFSICAgIDB4NDAgICAvKiBOb3JtYWwgUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMV9JR05PUkUgICAgIDB4MTAgICAgLyogSWdub3JlIFBhcml0eSBvbiBSWCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjFfU1RPUEJJVFMgICAweDBjICAgIC8qIE51bWJlciBvZiBTdG9wIEJpdHMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV8xU0IgICAgICAgIDB4MDAgICAvKiAxIFN0b3AgQml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfMTVTQiAgICAgICAweDA0ICAgLyogMS41IFN0b3AgQml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzJTQiAgICAgICAgMHgwOCAgIC8qIDIgU3RvcCBCaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX0NIQVJMRU4gICAgMHgwMyAgICAvKiBDaGFyYWN0ZXIgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfNUJJVFMgICAgICAweDAwICAgLyogNSBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzZCSVRTICAgICAgMHgwMSAgIC8qIDYgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV83QklUUyAgICAgIDB4MDIgICAvKiA3IGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfOEJJVFMgICAgICAweDAzICAgLyogOCBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAoUi9XKSAqLworCisjZGVmaW5lIENPUjJfSVhNICAgICAgICAweDgwICAgIC8qIEltcGxpZWQgWE9OIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1RYSUJFICAgICAgMHg0MCAgICAvKiBFbmFibGUgSW4tQmFuZCAoWE9OL1hPRkYpIEZsb3cgQ29udHJvbCAgKi8KKyNkZWZpbmUgQ09SMl9FVEMgICAgICAgIDB4MjAgICAgLyogRW1iZWRkZWQgVHggQ29tbWFuZHMgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfTExNICAgICAgICAweDEwICAgIC8qIExvY2FsIExvb3BiYWNrIE1vZGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1JMTSAgICAgICAgMHgwOCAgICAvKiBSZW1vdGUgTG9vcGJhY2sgTW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMl9SVFNBTyAgICAgIDB4MDQgICAgLyogUlRTIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfQ1RTQUUgICAgICAweDAyICAgIC8qIENUUyBBdXRvbWF0aWMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX0RTUkFFICAgICAgMHgwMSAgICAvKiBEU1IgQXV0b21hdGljIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIChSL1cpICovCisKKyNkZWZpbmUgQ09SM19YT05DSCAgICAgIDB4ODAgICAgLyogWE9OIGlzIGEgcGFpciBvZiBjaGFyYWN0ZXJzICgxICYgMykgICAgICovCisjZGVmaW5lIENPUjNfWE9GRkNIICAgICAweDQwICAgIC8qIFhPRkYgaXMgYSBwYWlyIG9mIGNoYXJhY3RlcnMgKDIgJiA0KSAgICAqLworI2RlZmluZSBDT1IzX0ZDVCAgICAgICAgMHgyMCAgICAvKiBGbG93LUNvbnRyb2wgVHJhbnNwYXJlbmN5IE1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SM19TQ0RFICAgICAgIDB4MTAgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgRGV0ZWN0aW9uIEVuYWJsZSAgICAgICovCisjZGVmaW5lIENPUjNfUlhUSCAgICAgICAweDBmICAgIC8qIFJYIEZJRk8gVGhyZXNob2xkIHZhbHVlICgxLTgpICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIgKFIvTykgKi8KKworI2RlZmluZSBDQ1NSX1JYRU4gICAgICAgMHg4MCAgICAvKiBSZWNlaXZlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9SWEZMT0ZGICAgIDB4NDAgICAgLyogUmVjZWl2ZSBGbG93IE9mZiAoWE9GRiB3YXMgc2VudCkgICAgICAgICovCisjZGVmaW5lIENDU1JfUlhGTE9OICAgICAweDIwICAgIC8qIFJlY2VpdmUgRmxvdyBPbiAoWE9OIHdhcyBzZW50KSAgICAgICAgICAqLworI2RlZmluZSBDQ1NSX1RYRU4gICAgICAgMHgwOCAgICAvKiBUcmFuc21pdHRlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT0ZGICAgIDB4MDQgICAgLyogVHJhbnNtaXQgRmxvdyBPZmYgKGdvdCBYT0ZGKSAgICAgICAgICAgICovCisjZGVmaW5lIENDU1JfVFhGTE9OICAgICAweDAyICAgIC8qIFRyYW5zbWl0IEZsb3cgT24gKGdvdCBYT04pICAgICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIENoYW5nZSBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIE1DT1IxX0RTUlpEICAgICAweDgwICAgIC8qIERldGVjdCAwLT4xIHRyYW5zaXRpb24gb2YgRFNSICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMV9DRFpEICAgICAgMHg0MCAgICAvKiBEZXRlY3QgMC0+MSB0cmFuc2l0aW9uIG9mIENEICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNPUjFfQ1RTWkQgICAgIDB4MjAgICAgLyogRGV0ZWN0IDAtPjEgdHJhbnNpdGlvbiBvZiBDVFMgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IxX0RUUlRIICAgICAweDBmICAgIC8qIEF1dG8gRFRSIGZsb3cgY29udHJvbCBUaHJlc2hvbGQgKDEtOCkgICAqLworI2RlZmluZSAgTUNPUjFfTk9EVFJGQyAgIDB4MCAgICAgLyogQXV0b21hdGljIERUUiBmbG93IGNvbnRyb2wgZGlzYWJsZWQgICAgICovCisKKworLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAyIChSL1cpICovCisKKyNkZWZpbmUgTUNPUjJfRFNST0QgICAgIDB4ODAgICAgLyogRGV0ZWN0IDEtPjAgdHJhbnNpdGlvbiBvZiBEU1IgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IyX0NET0QgICAgICAweDQwICAgIC8qIERldGVjdCAxLT4wIHRyYW5zaXRpb24gb2YgQ0QgICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMl9DVFNPRCAgICAgMHgyMCAgICAvKiBEZXRlY3QgMS0+MCB0cmFuc2l0aW9uIG9mIENUUyAgICAgICAgICAgKi8KKworLyogTW9kZW0gQ2hhbmdlIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgTUNSX0RTUkNIRyAgICAgIDB4ODAgICAgLyogRFNSIENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1DUl9DRENIRyAgICAgICAweDQwICAgIC8qIENEIENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQ1JfQ1RTQ0hHICAgICAgMHgyMCAgICAvKiBDVFMgQ2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBNU1ZSX0RTUiAgICAgICAgMHg4MCAgICAvKiBDdXJyZW50IHN0YXRlIG9mIERTUiBpbnB1dCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9DRCAgICAgICAgIDB4NDAgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBDRCBpbnB1dCAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TVlJfQ1RTICAgICAgICAweDIwICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgQ1RTIGlucHV0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX0RUUiAgICAgICAgMHgwMiAgICAvKiBDdXJyZW50IHN0YXRlIG9mIERUUiBvdXRwdXQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9SVFMgICAgICAgIDB4MDEgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBSVFMgb3V0cHV0ICAgICAgICAgICAgICovCisKKworLyogRXNjYXBlIGNoYXJhY3RlcnMgKi8KKworI2RlZmluZSBDRDE4NnhfQ19FU0MgICAgIDB4MDAgICAgLyogRXNjYXBlIGNoYXJhY3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9DX1NCUksgICAgMHg4MSAgICAvKiBTdGFydCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0NfREVMQVkgICAweDgyICAgIC8qIERlbGF5IG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfQ19FQlJLICAgIDB4ODMgICAgLyogU3RvcCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU1JTUl9SUkVRaW50ICAgICAweDEwICAgIC8qIFRoaXMgY2hpcCB3YW50cyAicmVjIiBzZXJ2aWNlZCAgICAgICAgICAqLworI2RlZmluZSBTUlNSX1RSRVFpbnQgICAgIDB4MDQgICAgLyogVGhpcyBjaGlwIHdhbnRzICJ0cmFuc21pdCIgc2VydmljZWQgICAgICovCisjZGVmaW5lIFNSU1JfTVJFUWludCAgICAgMHgwMSAgICAvKiBUaGlzIGNoaXAgd2FudHMgIm1kbSBjaGFuZ2UiIHNlcnZpY2VkICAgKi8KKworCisKKyNkZWZpbmUgU1JDUl9QS0dUWVBFICAgIDB4ODAKKyNkZWZpbmUgU1JDUl9SRUdBQ0tFTiAgIDB4NDAKKyNkZWZpbmUgU1JDUl9EQUlTWUVOICAgIDB4MjAKKyNkZWZpbmUgU1JDUl9HTE9CUFJJICAgIDB4MTAKKyNkZWZpbmUgU1JDUl9VTkZBSVIgICAgIDB4MDgKKyNkZWZpbmUgU1JDUl9BVVRPUFJJICAgIDB4MDIKKyNkZWZpbmUgU1JDUl9QUklTRUwgICAgIDB4MDEKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZkZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpAQCAtMCwwICsxLDY3MiBAQAorLyoKKyAqIGNvbnNvbGVtYXAuYworICoKKyAqIE1hcHBpbmcgZnJvbSBpbnRlcm5hbCBjb2RlIChzdWNoIGFzIExhdGluLTEgb3IgVW5pY29kZSBvciBJQk0gUEMgY29kZSkKKyAqIHRvIGZvbnQgcG9zaXRpb25zLgorICoKKyAqIGFlYiwgOTUwMjEwCisgKgorICogU3VwcG9ydCBmb3IgbXVsdGlwbGUgdW5pbWFwcyBieSBKYWt1YiBKZWxpbmVrIDxqakB1bHRyYS5saW51eC5jej4sIEp1bHkgMTk5OAorICoKKyAqIEZpeCBidWcgaW4gaW52ZXJzZSB0cmFuc2xhdGlvbi4gU3RhbmlzbGF2IFZvcm9ueWkgPHN0YXNAY250aS51YW5ldC5raGFya292LnVhPiwgRGVjIDE5OTgKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGVtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0cmFuc2xhdGlvbnNbXVsyNTZdID0geworICAvKiA4LWJpdCBMYXRpbi0xIG1hcHBlZCB0byBVbmljb2RlIC0tIHRyaXZpYWwgbWFwcGluZyAqLworICB7CisgICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisgICAgMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLCAweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisgICAgMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisgICAgMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLCAweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisgICAgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisgICAgMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLCAweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisgICAgMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLCAweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisgICAgMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLCAweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisgICAgMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLCAweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisgICAgMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDAwYTQsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsCisgICAgMHgwMGE4LCAweDAwYTksIDB4MDBhYSwgMHgwMGFiLCAweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDAwYWYsCisgICAgMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLCAweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisgICAgMHgwMGI4LCAweDAwYjksIDB4MDBiYSwgMHgwMGJiLCAweDAwYmMsIDB4MDBiZCwgMHgwMGJlLCAweDAwYmYsCisgICAgMHgwMGMwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLCAweDAwYzQsIDB4MDBjNSwgMHgwMGM2LCAweDAwYzcsCisgICAgMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLCAweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisgICAgMHgwMGQwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisgICAgMHgwMGQ4LCAweDAwZDksIDB4MDBkYSwgMHgwMGRiLCAweDAwZGMsIDB4MDBkZCwgMHgwMGRlLCAweDAwZGYsCisgICAgMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLCAweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsCisgICAgMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLCAweDAwZWMsIDB4MDBlZCwgMHgwMGVlLCAweDAwZWYsCisgICAgMHgwMGYwLCAweDAwZjEsIDB4MDBmMiwgMHgwMGYzLCAweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsCisgICAgMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLCAweDAwZmMsIDB4MDBmZCwgMHgwMGZlLCAweDAwZmYKKyAgfSwgCisgIC8qIFZUMTAwIGdyYXBoaWNzIG1hcHBlZCB0byBVbmljb2RlICovCisgIHsKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKyAgICAweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKyAgICAweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsIDB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKyAgICAweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsIDB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKyAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDIxOTIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTMsIDB4MDAyZiwKKyAgICAweDI1ODgsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDBhMCwKKyAgICAweDI1YzYsIDB4MjU5MiwgMHgyNDA5LCAweDI0MGMsIDB4MjQwZCwgMHgyNDBhLCAweDAwYjAsIDB4MDBiMSwKKyAgICAweDI1OTEsIDB4MjQwYiwgMHgyNTE4LCAweDI1MTAsIDB4MjUwYywgMHgyNTE0LCAweDI1M2MsIDB4MjNiYSwKKyAgICAweDIzYmIsIDB4MjUwMCwgMHgyM2JjLCAweDIzYmQsIDB4MjUxYywgMHgyNTI0LCAweDI1MzQsIDB4MjUyYywKKyAgICAweDI1MDIsIDB4MjI2NCwgMHgyMjY1LCAweDAzYzAsIDB4MjI2MCwgMHgwMGEzLCAweDAwYjcsIDB4MDA3ZiwKKyAgICAweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsIDB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKyAgICAweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsIDB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKyAgICAweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKyAgICAweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsIDB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKyAgICAweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsIDB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKyAgICAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsIDB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDBhZiwKKyAgICAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsIDB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKKyAgICAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKKyAgICAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKKyAgICAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKyAgICAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwKKyAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKyAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKyAgICAweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKyAgICAweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZgorICB9LAorICAvKiBJQk0gQ29kZXBhZ2UgNDM3IG1hcHBlZCB0byBVbmljb2RlICovCisgIHsKKyAgICAweDAwMDAsIDB4MjYzYSwgMHgyNjNiLCAweDI2NjUsIDB4MjY2NiwgMHgyNjYzLCAweDI2NjAsIDB4MjAyMiwgCisgICAgMHgyNWQ4LCAweDI1Y2IsIDB4MjVkOSwgMHgyNjQyLCAweDI2NDAsIDB4MjY2YSwgMHgyNjZiLCAweDI2M2MsCisgICAgMHgyNWI2LCAweDI1YzAsIDB4MjE5NSwgMHgyMDNjLCAweDAwYjYsIDB4MDBhNywgMHgyNWFjLCAweDIxYTgsCisgICAgMHgyMTkxLCAweDIxOTMsIDB4MjE5MiwgMHgyMTkwLCAweDIyMWYsIDB4MjE5NCwgMHgyNWIyLCAweDI1YmMsCisgICAgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDIzMDIsCisgICAgMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLCAweDAwZWUsIDB4MDBlYywgMHgwMGM0LCAweDAwYzUsCisgICAgMHgwMGM5LCAweDAwZTYsIDB4MDBjNiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmMiwgMHgwMGZiLCAweDAwZjksCisgICAgMHgwMGZmLCAweDAwZDYsIDB4MDBkYywgMHgwMGEyLCAweDAwYTMsIDB4MDBhNSwgMHgyMGE3LCAweDAxOTIsCisgICAgMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLCAweDAwZjEsIDB4MDBkMSwgMHgwMGFhLCAweDAwYmEsCisgICAgMHgwMGJmLCAweDIzMTAsIDB4MDBhYywgMHgwMGJkLCAweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisgICAgMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLCAweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisgICAgMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LCAweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsCisgICAgMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLCAweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisgICAgMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LCAweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisgICAgMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LCAweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsCisgICAgMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LCAweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisgICAgMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLCAweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisgICAgMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LCAweDIyMWUsIDB4MDNjNiwgMHgwM2I1LCAweDIyMjksCisgICAgMHgyMjYxLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LCAweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisgICAgMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLCAweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAKKyAgfSwgCisgIC8qIFVzZXIgbWFwcGluZyAtLSBkZWZhdWx0IHRvIGNvZGVzIGZvciBkaXJlY3QgZm9udCBtYXBwaW5nICovCisgIHsKKyAgICAweGYwMDAsIDB4ZjAwMSwgMHhmMDAyLCAweGYwMDMsIDB4ZjAwNCwgMHhmMDA1LCAweGYwMDYsIDB4ZjAwNywKKyAgICAweGYwMDgsIDB4ZjAwOSwgMHhmMDBhLCAweGYwMGIsIDB4ZjAwYywgMHhmMDBkLCAweGYwMGUsIDB4ZjAwZiwKKyAgICAweGYwMTAsIDB4ZjAxMSwgMHhmMDEyLCAweGYwMTMsIDB4ZjAxNCwgMHhmMDE1LCAweGYwMTYsIDB4ZjAxNywKKyAgICAweGYwMTgsIDB4ZjAxOSwgMHhmMDFhLCAweGYwMWIsIDB4ZjAxYywgMHhmMDFkLCAweGYwMWUsIDB4ZjAxZiwKKyAgICAweGYwMjAsIDB4ZjAyMSwgMHhmMDIyLCAweGYwMjMsIDB4ZjAyNCwgMHhmMDI1LCAweGYwMjYsIDB4ZjAyNywKKyAgICAweGYwMjgsIDB4ZjAyOSwgMHhmMDJhLCAweGYwMmIsIDB4ZjAyYywgMHhmMDJkLCAweGYwMmUsIDB4ZjAyZiwKKyAgICAweGYwMzAsIDB4ZjAzMSwgMHhmMDMyLCAweGYwMzMsIDB4ZjAzNCwgMHhmMDM1LCAweGYwMzYsIDB4ZjAzNywKKyAgICAweGYwMzgsIDB4ZjAzOSwgMHhmMDNhLCAweGYwM2IsIDB4ZjAzYywgMHhmMDNkLCAweGYwM2UsIDB4ZjAzZiwKKyAgICAweGYwNDAsIDB4ZjA0MSwgMHhmMDQyLCAweGYwNDMsIDB4ZjA0NCwgMHhmMDQ1LCAweGYwNDYsIDB4ZjA0NywKKyAgICAweGYwNDgsIDB4ZjA0OSwgMHhmMDRhLCAweGYwNGIsIDB4ZjA0YywgMHhmMDRkLCAweGYwNGUsIDB4ZjA0ZiwKKyAgICAweGYwNTAsIDB4ZjA1MSwgMHhmMDUyLCAweGYwNTMsIDB4ZjA1NCwgMHhmMDU1LCAweGYwNTYsIDB4ZjA1NywKKyAgICAweGYwNTgsIDB4ZjA1OSwgMHhmMDVhLCAweGYwNWIsIDB4ZjA1YywgMHhmMDVkLCAweGYwNWUsIDB4ZjA1ZiwKKyAgICAweGYwNjAsIDB4ZjA2MSwgMHhmMDYyLCAweGYwNjMsIDB4ZjA2NCwgMHhmMDY1LCAweGYwNjYsIDB4ZjA2NywKKyAgICAweGYwNjgsIDB4ZjA2OSwgMHhmMDZhLCAweGYwNmIsIDB4ZjA2YywgMHhmMDZkLCAweGYwNmUsIDB4ZjA2ZiwKKyAgICAweGYwNzAsIDB4ZjA3MSwgMHhmMDcyLCAweGYwNzMsIDB4ZjA3NCwgMHhmMDc1LCAweGYwNzYsIDB4ZjA3NywKKyAgICAweGYwNzgsIDB4ZjA3OSwgMHhmMDdhLCAweGYwN2IsIDB4ZjA3YywgMHhmMDdkLCAweGYwN2UsIDB4ZjA3ZiwKKyAgICAweGYwODAsIDB4ZjA4MSwgMHhmMDgyLCAweGYwODMsIDB4ZjA4NCwgMHhmMDg1LCAweGYwODYsIDB4ZjA4NywKKyAgICAweGYwODgsIDB4ZjA4OSwgMHhmMDhhLCAweGYwOGIsIDB4ZjA4YywgMHhmMDhkLCAweGYwOGUsIDB4ZjA4ZiwKKyAgICAweGYwOTAsIDB4ZjA5MSwgMHhmMDkyLCAweGYwOTMsIDB4ZjA5NCwgMHhmMDk1LCAweGYwOTYsIDB4ZjA5NywKKyAgICAweGYwOTgsIDB4ZjA5OSwgMHhmMDlhLCAweGYwOWIsIDB4ZjA5YywgMHhmMDlkLCAweGYwOWUsIDB4ZjA5ZiwKKyAgICAweGYwYTAsIDB4ZjBhMSwgMHhmMGEyLCAweGYwYTMsIDB4ZjBhNCwgMHhmMGE1LCAweGYwYTYsIDB4ZjBhNywKKyAgICAweGYwYTgsIDB4ZjBhOSwgMHhmMGFhLCAweGYwYWIsIDB4ZjBhYywgMHhmMGFkLCAweGYwYWUsIDB4ZjBhZiwKKyAgICAweGYwYjAsIDB4ZjBiMSwgMHhmMGIyLCAweGYwYjMsIDB4ZjBiNCwgMHhmMGI1LCAweGYwYjYsIDB4ZjBiNywKKyAgICAweGYwYjgsIDB4ZjBiOSwgMHhmMGJhLCAweGYwYmIsIDB4ZjBiYywgMHhmMGJkLCAweGYwYmUsIDB4ZjBiZiwKKyAgICAweGYwYzAsIDB4ZjBjMSwgMHhmMGMyLCAweGYwYzMsIDB4ZjBjNCwgMHhmMGM1LCAweGYwYzYsIDB4ZjBjNywKKyAgICAweGYwYzgsIDB4ZjBjOSwgMHhmMGNhLCAweGYwY2IsIDB4ZjBjYywgMHhmMGNkLCAweGYwY2UsIDB4ZjBjZiwKKyAgICAweGYwZDAsIDB4ZjBkMSwgMHhmMGQyLCAweGYwZDMsIDB4ZjBkNCwgMHhmMGQ1LCAweGYwZDYsIDB4ZjBkNywKKyAgICAweGYwZDgsIDB4ZjBkOSwgMHhmMGRhLCAweGYwZGIsIDB4ZjBkYywgMHhmMGRkLCAweGYwZGUsIDB4ZjBkZiwKKyAgICAweGYwZTAsIDB4ZjBlMSwgMHhmMGUyLCAweGYwZTMsIDB4ZjBlNCwgMHhmMGU1LCAweGYwZTYsIDB4ZjBlNywKKyAgICAweGYwZTgsIDB4ZjBlOSwgMHhmMGVhLCAweGYwZWIsIDB4ZjBlYywgMHhmMGVkLCAweGYwZWUsIDB4ZjBlZiwKKyAgICAweGYwZjAsIDB4ZjBmMSwgMHhmMGYyLCAweGYwZjMsIDB4ZjBmNCwgMHhmMGY1LCAweGYwZjYsIDB4ZjBmNywKKyAgICAweGYwZjgsIDB4ZjBmOSwgMHhmMGZhLCAweGYwZmIsIDB4ZjBmYywgMHhmMGZkLCAweGYwZmUsIDB4ZjBmZgorICB9Cit9OworCisvKiBUaGUgc3RhbmRhcmQga2VybmVsIGNoYXJhY3Rlci10by1mb250IG1hcHBpbmdzIGFyZSBub3QgaW52ZXJ0aWJsZQorICAgLS0gdGhpcyBpcyBqdXN0IGEgYmVzdCBlZmZvcnQuICovCisKKyNkZWZpbmUgTUFYX0dMWVBIIDUxMgkJLyogTWF4IHBvc3NpYmxlIGdseXBoIHZhbHVlICovCisKK3N0YXRpYyBpbnQgaW52X3RyYW5zbGF0ZVtNQVhfTlJfQ09OU09MRVNdOworCitzdHJ1Y3QgdW5pX3BhZ2VkaXIgeworCXUxNiAJCSoqdW5pX3BnZGlyWzMyXTsKKwl1bnNpZ25lZCBsb25nCXJlZmNvdW50OworCXVuc2lnbmVkIGxvbmcJc3VtOworCXVuc2lnbmVkIGNoYXIJKmludmVyc2VfdHJhbnNsYXRpb25zWzRdOworCWludAkJcmVhZG9ubHk7Cit9OworCitzdGF0aWMgc3RydWN0IHVuaV9wYWdlZGlyICpkZmx0OworCitzdGF0aWMgdm9pZCBzZXRfaW52ZXJzZV90cmFuc2woc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCB1bmlfcGFnZWRpciAqcCwgaW50IGkpCit7CisJaW50IGosIGdseXBoOworCXVuc2lnbmVkIHNob3J0ICp0ID0gdHJhbnNsYXRpb25zW2ldOworCXVuc2lnbmVkIGNoYXIgKnE7CisJCisJaWYgKCFwKSByZXR1cm47CisJcSA9IHAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ldOworCisJaWYgKCFxKSB7CisJCXEgPSBwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSA9ICh1bnNpZ25lZCBjaGFyICopIAorCQkJa21hbGxvYyhNQVhfR0xZUEgsIEdGUF9LRVJORUwpOworCQlpZiAoIXEpIHJldHVybjsKKwl9CisJbWVtc2V0KHEsIDAsIE1BWF9HTFlQSCk7CisKKwlmb3IgKGogPSAwOyBqIDwgRV9UQUJTWjsgaisrKSB7CisJCWdseXBoID0gY29udl91bmlfdG9fcGMoY29ucCwgdFtqXSk7CisJCWlmIChnbHlwaCA+PSAwICYmIGdseXBoIDwgTUFYX0dMWVBIICYmIHFbZ2x5cGhdIDwgMzIpIHsKKwkJCS8qIHByZWZlciAnLScgYWJvdmUgU0hZIGV0Yy4gKi8KKwkJICAJcVtnbHlwaF0gPSBqOworCQl9CisJfQorfQorCit1bnNpZ25lZCBzaG9ydCAqc2V0X3RyYW5zbGF0ZShpbnQgbSwgc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWludl90cmFuc2xhdGVbdmMtPnZjX251bV0gPSBtOworCXJldHVybiB0cmFuc2xhdGlvbnNbbV07Cit9CisKKy8qCisgKiBJbnZlcnNlIHRyYW5zbGF0aW9uIGlzIGltcG9zc2libGUgZm9yIHNldmVyYWwgcmVhc29uczoKKyAqIDEuIFRoZSBmb250PC0+Y2hhcmFjdGVyIG1hcHMgYXJlIG5vdCAxLTEuCisgKiAyLiBUaGUgdGV4dCBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4gd2hpbGUgYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gbWFwCisgKiAgICB3YXMgYWN0aXZlLCBvciB1c2luZyBVbmljb2RlLgorICogU3RpbGwsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBhIGNlcnRhaW4gZXh0ZW50IHRvIGN1dCBhbmQgcGFzdGUgbm9uLUFTQ0lJLgorICovCit1bnNpZ25lZCBjaGFyIGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgpCit7CisJc3RydWN0IHVuaV9wYWdlZGlyICpwOworCWlmIChnbHlwaCA8IDAgfHwgZ2x5cGggPj0gTUFYX0dMWVBIKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICghKHAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKmNvbnAtPnZjX3VuaV9wYWdlZGlyX2xvYykgfHwKKwkJICFwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpbnZfdHJhbnNsYXRlW2NvbnAtPnZjX251bV1dKQorCQlyZXR1cm4gZ2x5cGg7CisJZWxzZQorCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaW52X3RyYW5zbGF0ZVtjb25wLT52Y19udW1dXVtnbHlwaF07Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV91c2VyX21hcHModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnAsICpxID0gTlVMTDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwkJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChpKSkKKwkJCWNvbnRpbnVlOworCQlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSp2Y19jb25zW2ldLmQtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwkJaWYgKHAgJiYgcCAhPSBxKSB7CisJCQlzZXRfaW52ZXJzZV90cmFuc2wodmNfY29uc1tpXS5kLCBwLCBVU0VSX01BUCk7CisJCQlxID0gcDsKKwkJfQorCX0KK30KKworLyoKKyAqIExvYWQgY3VzdG9taXphYmxlIHRyYW5zbGF0aW9uIHRhYmxlCisgKiBhcmcgcG9pbnRzIHRvIGEgMjU2IGJ5dGUgdHJhbnNsYXRpb24gdGFibGUuCisgKgorICogVGhlICJvbGQiIHZhcmlhbnRzIGFyZSBmb3IgdHJhbnNsYXRpb24gZGlyZWN0bHkgdG8gZm9udCAodXNpbmcgdGhlCisgKiAweGYwMDAtMHhmMGZmICJ0cmFuc3BhcmVudCIgVW5pY29kZXMpIHdoZXJlYXMgdGhlICJuZXciIHZhcmlhbnRzIHNldAorICogVW5pY29kZXMgZXhwbGljaXRseS4KKyAqLworaW50IGNvbl9zZXRfdHJhbnNfb2xkKHVuc2lnbmVkIGNoYXIgX191c2VyICogYXJnKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICpwID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmcsIEVfVEFCU1opKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZvciAoaT0wOyBpPEVfVEFCU1ogOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciB1YzsKKwkJX19nZXRfdXNlcih1YywgYXJnK2kpOworCQlwW2ldID0gVU5JX0RJUkVDVF9CQVNFIHwgdWM7CisJfQorCisJdXBkYXRlX3VzZXJfbWFwcygpOworCXJldHVybiAwOworfQorCitpbnQgY29uX2dldF90cmFuc19vbGQodW5zaWduZWQgY2hhciBfX3VzZXIgKiBhcmcpCit7CisJaW50IGksIGNoOworCXVuc2lnbmVkIHNob3J0ICpwID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJnLCBFX1RBQlNaKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGk9MDsgaTxFX1RBQlNaIDsgaSsrKQorCSAgeworCSAgICBjaCA9IGNvbnZfdW5pX3RvX3BjKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgcFtpXSk7CisJICAgIF9fcHV0X3VzZXIoKGNoICYgfjB4ZmYpID8gMCA6IGNoLCBhcmcraSk7CisJICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25fc2V0X3RyYW5zX25ldyh1c2hvcnQgX191c2VyICogYXJnKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICpwID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmcsIEVfVEFCU1oqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpPTA7IGk8RV9UQUJTWiA7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCB1czsKKwkJX19nZXRfdXNlcih1cywgYXJnK2kpOworCQlwW2ldID0gdXM7CisJfQorCisJdXBkYXRlX3VzZXJfbWFwcygpOworCXJldHVybiAwOworfQorCitpbnQgY29uX2dldF90cmFuc19uZXcodXNob3J0IF9fdXNlciAqIGFyZykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqcCA9IHRyYW5zbGF0aW9uc1tVU0VSX01BUF07CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgRV9UQUJTWipzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGk9MDsgaTxFX1RBQlNaIDsgaSsrKQorCSAgX19wdXRfdXNlcihwW2ldLCBhcmcraSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbmljb2RlIC0+IGN1cnJlbnQgZm9udCBjb252ZXJzaW9uIAorICoKKyAqIEEgZm9udCBoYXMgYXQgbW9zdCA1MTIgY2hhcnMsIHVzdWFsbHkgMjU2LgorICogQnV0IG9uZSBmb250IHBvc2l0aW9uIG1heSByZXByZXNlbnQgc2V2ZXJhbCBVbmljb2RlIGNoYXJzLgorICogQSBoYXNodGFibGUgaXMgc29tZXdoYXQgb2YgYSBwYWluIHRvIGRlYWwgd2l0aCwgc28gdXNlIGEKKyAqICJwYWdlZCB0YWJsZSIgaW5zdGVhZC4gIFNpbXVsYXRpb24gaGFzIHNob3duIHRoZSBtZW1vcnkgY29zdCBvZgorICogdGhpcyAzLWxldmVsIHBhZ2VkIHRhYmxlIHNjaGVtZSB0byBiZSBjb21wYXJhYmxlIHRvIGEgaGFzaCB0YWJsZS4KKyAqLworCitleHRlcm4gdTggZGZvbnRfdW5pY291bnRbXTsJLyogRGVmaW5lZCBpbiBjb25zb2xlX2RlZm1hcC5jICovCitleHRlcm4gdTE2IGRmb250X3VuaXRhYmxlW107CisKK3N0YXRpYyB2b2lkIGNvbl9yZWxlYXNlX3VuaW1hcChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnApCit7CisJdTE2ICoqcDE7CisJaW50IGksIGo7CisKKwlpZiAocCA9PSBkZmx0KSBkZmx0ID0gTlVMTDsgIAorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICgocDEgPSBwLT51bmlfcGdkaXJbaV0pICE9IE5VTEwpIHsKKwkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorCQkJCWlmIChwMVtqXSkKKwkJCQkJa2ZyZWUocDFbal0pOworCQkJa2ZyZWUocDEpOworCQl9CisJCXAtPnVuaV9wZ2RpcltpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWlmIChwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSkgeworCQkJa2ZyZWUocC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaV0pOworCQkJcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaV0gPSBOVUxMOworCQl9Cit9CisKK3ZvaWQgY29uX2ZyZWVfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnA7CisKKwlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jOworCWlmICghcCkKKwkJcmV0dXJuOworCSp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jID0gMDsKKwlpZiAoLS1wLT5yZWZjb3VudCkKKwkJcmV0dXJuOworCWNvbl9yZWxlYXNlX3VuaW1hcChwKTsKKwlrZnJlZShwKTsKK30KKyAgCitzdGF0aWMgaW50IGNvbl91bmlmeV91bmltYXAoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCB1bmlfcGFnZWRpciAqcCkKK3sKKwlpbnQgaSwgaiwgazsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnE7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJCWlmICghdmNfY29uc19hbGxvY2F0ZWQoaSkpCisJCQljb250aW51ZTsKKwkJcSA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmNfY29uc1tpXS5kLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWlmICghcSB8fCBxID09IHAgfHwgcS0+c3VtICE9IHAtPnN1bSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgeworCQkJdTE2ICoqcDEsICoqcTE7CisJCQlwMSA9IHAtPnVuaV9wZ2RpcltqXTsgcTEgPSBxLT51bmlfcGdkaXJbal07CisJCQlpZiAoIXAxICYmICFxMSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcDEgfHwgIXExKQorCQkJCWJyZWFrOworCQkJZm9yIChrID0gMDsgayA8IDMyOyBrKyspIHsKKwkJCQlpZiAoIXAxW2tdICYmICFxMVtrXSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCFwMVtrXSB8fCAhcTFba10pCisJCQkJCWJyZWFrOworCQkJCWlmIChtZW1jbXAocDFba10sIHExW2tdLCA2NCpzaXplb2YodTE2KSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGsgPCAzMikKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSAzMikgeworCQkJcS0+cmVmY291bnQrKzsKKwkJCSpjb25wLT52Y191bmlfcGFnZWRpcl9sb2MgPSAodW5zaWduZWQgbG9uZylxOworCQkJY29uX3JlbGVhc2VfdW5pbWFwKHApOworCQkJa2ZyZWUocCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY29uX2luc2VydF91bmlwYWlyKHN0cnVjdCB1bmlfcGFnZWRpciAqcCwgdV9zaG9ydCB1bmljb2RlLCB1X3Nob3J0IGZvbnRwb3MpCit7CisJaW50IGksIG47CisJdTE2ICoqcDEsICpwMjsKKworCWlmICghKHAxID0gcC0+dW5pX3BnZGlyW24gPSB1bmljb2RlID4+IDExXSkpIHsKKwkJcDEgPSBwLT51bmlfcGdkaXJbbl0gPSBrbWFsbG9jKDMyKnNpemVvZih1MTYgKiksIEdGUF9LRVJORUwpOworCQlpZiAoIXAxKSByZXR1cm4gLUVOT01FTTsKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlwMVtpXSA9IE5VTEw7CisJfQorCisJaWYgKCEocDIgPSBwMVtuID0gKHVuaWNvZGUgPj4gNikgJiAweDFmXSkpIHsKKwkJcDIgPSBwMVtuXSA9IGttYWxsb2MoNjQqc2l6ZW9mKHUxNiksIEdGUF9LRVJORUwpOworCQlpZiAoIXAyKSByZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KHAyLCAweGZmLCA2NCpzaXplb2YodTE2KSk7IC8qIE5vIGdseXBocyBmb3IgdGhlIGNoYXJhY3RlcnMgKHlldCkgKi8KKwl9CisKKwlwMlt1bmljb2RlICYgMHgzZl0gPSBmb250cG9zOworCQorCXAtPnN1bSArPSAoZm9udHBvcyA8PCAyMCkgKyB1bmljb2RlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHVpIGlzIGEgbGVmdG92ZXIgZnJvbSB1c2luZyBhIGhhc2h0YWJsZSwgYnV0IG1pZ2h0IGJlIHVzZWQgYWdhaW4gKi8KK2ludCBjb25fY2xlYXJfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHVuaW1hcGluaXQgKnVpKQoreworCXN0cnVjdCB1bmlfcGFnZWRpciAqcCwgKnE7CisgIAorCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJaWYgKHAgJiYgcC0+cmVhZG9ubHkpIHJldHVybiAtRUlPOworCWlmICghcCB8fCAtLXAtPnJlZmNvdW50KSB7CisJCXEgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopa21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFxKSB7CisJCQlpZiAocCkgcC0+cmVmY291bnQrKzsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChxLCAwLCBzaXplb2YoKnEpKTsKKwkJcS0+cmVmY291bnQ9MTsKKwkJKnZjLT52Y191bmlfcGFnZWRpcl9sb2MgPSAodW5zaWduZWQgbG9uZylxOworCX0gZWxzZSB7CisJCWlmIChwID09IGRmbHQpIGRmbHQgPSBOVUxMOworCQlwLT5yZWZjb3VudCsrOworCQlwLT5zdW0gPSAwOworCQljb25fcmVsZWFzZV91bmltYXAocCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY29uX3NldF91bmltYXAoc3RydWN0IHZjX2RhdGEgKnZjLCB1c2hvcnQgY3QsIHN0cnVjdCB1bmlwYWlyIF9fdXNlciAqbGlzdCkKK3sKKwlpbnQgZXJyID0gMCwgZXJyMSwgaTsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnAsICpxOworCisJcCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwlpZiAocC0+cmVhZG9ubHkpIHJldHVybiAtRUlPOworCQorCWlmICghY3QpIHJldHVybiAwOworCQorCWlmIChwLT5yZWZjb3VudCA+IDEpIHsKKwkJaW50IGosIGs7CisJCXUxNiAqKnAxLCAqcDIsIGw7CisJCQorCQllcnIxID0gY29uX2NsZWFyX3VuaW1hcCh2YywgTlVMTCk7CisJCWlmIChlcnIxKSByZXR1cm4gZXJyMTsKKwkJCisJCXEgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWZvciAoaSA9IDAsIGwgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKChwMSA9IHAtPnVuaV9wZ2RpcltpXSkpCisJCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKwkJCWlmICgocDIgPSBwMVtqXSkpCisJCQkJZm9yIChrID0gMDsgayA8IDY0OyBrKyssIGwrKykKKwkJCQlpZiAocDJba10gIT0gMHhmZmZmKSB7CisJCQkJCWVycjEgPSBjb25faW5zZXJ0X3VuaXBhaXIocSwgbCwgcDJba10pOworCQkJCQlpZiAoZXJyMSkgeworCQkJCQkJcC0+cmVmY291bnQrKzsKKwkJCQkJCSp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jID0gKHVuc2lnbmVkIGxvbmcpcDsKKwkJCQkJCWNvbl9yZWxlYXNlX3VuaW1hcChxKTsKKwkJCQkJCWtmcmVlKHEpOworCQkJCQkJcmV0dXJuIGVycjE7IAorCQkJCQl9CisgICAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgICAgCXAgPSBxOworCX0gZWxzZSBpZiAocCA9PSBkZmx0KQorCQlkZmx0ID0gTlVMTDsKKwkKKwl3aGlsZSAoY3QtLSkgeworCQl1bnNpZ25lZCBzaG9ydCB1bmljb2RlLCBmb250cG9zOworCQlfX2dldF91c2VyKHVuaWNvZGUsICZsaXN0LT51bmljb2RlKTsKKwkJX19nZXRfdXNlcihmb250cG9zLCAmbGlzdC0+Zm9udHBvcyk7CisJCWlmICgoZXJyMSA9IGNvbl9pbnNlcnRfdW5pcGFpcihwLCB1bmljb2RlLGZvbnRwb3MpKSAhPSAwKQorCQkJZXJyID0gZXJyMTsKKwkJCWxpc3QrKzsKKwl9CisJCisJaWYgKGNvbl91bmlmeV91bmltYXAodmMsIHApKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8PSAzOyBpKyspCisJCXNldF9pbnZlcnNlX3RyYW5zbCh2YywgcCwgaSk7IC8qIFVwZGF0ZSBhbGwgaW52ZXJzZSB0cmFuc2xhdGlvbnMgKi8KKyAgCisJcmV0dXJuIGVycjsKK30KKworLyogTG9hZHMgdGhlIHVuaW1hcCBmb3IgdGhlIGhhcmR3YXJlIGZvbnQsIGFzIGRlZmluZWQgaW4gdW5pX2hhc2gudGJsLgorICAgVGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgd2FzIHRoZSBtb3N0IGNvbXBhY3QgSSBjb3VsZCBjb21lIHVwCisgICB3aXRoLiAgVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIGF0IHN5c19zZXR1cCB0aW1lLCBhbmQgd2hlbiB0aGUKKyAgIFBJT19GT05UUkVTRVQgaW9jdGwgaXMgY2FsbGVkLiAqLworCitpbnQgY29uX3NldF9kZWZhdWx0X3VuaW1hcChzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaW50IGksIGosIGVyciA9IDAsIGVycjE7CisJdTE2ICpxOworCXN0cnVjdCB1bmlfcGFnZWRpciAqcDsKKworCWlmIChkZmx0KSB7CisJCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWlmIChwID09IGRmbHQpCisJCQlyZXR1cm4gMDsKKwkJZGZsdC0+cmVmY291bnQrKzsKKwkJKnZjLT52Y191bmlfcGFnZWRpcl9sb2MgPSAodW5zaWduZWQgbG9uZylkZmx0OworCQlpZiAocCAmJiAtLXAtPnJlZmNvdW50KSB7CisJCQljb25fcmVsZWFzZV91bmltYXAocCk7CisJCQlrZnJlZShwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJCisJLyogVGhlIGRlZmF1bHQgZm9udCBpcyBhbHdheXMgMjU2IGNoYXJhY3RlcnMgKi8KKworCWVyciA9IGNvbl9jbGVhcl91bmltYXAodmMsIE5VTEwpOworCWlmIChlcnIpIHJldHVybiBlcnI7CisgICAgCisJcCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwlxID0gZGZvbnRfdW5pdGFibGU7CisJCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlmb3IgKGogPSBkZm9udF91bmljb3VudFtpXTsgajsgai0tKSB7CisJCQllcnIxID0gY29uX2luc2VydF91bmlwYWlyKHAsICoocSsrKSwgaSk7CisJCQlpZiAoZXJyMSkKKwkJCQllcnIgPSBlcnIxOworCQl9CisJCQkKKwlpZiAoY29uX3VuaWZ5X3VuaW1hcCh2YywgcCkpIHsKKwkJZGZsdCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKKwkJc2V0X2ludmVyc2VfdHJhbnNsKHZjLCBwLCBpKTsJLyogVXBkYXRlIGFsbCBpbnZlcnNlIHRyYW5zbGF0aW9ucyAqLworCWRmbHQgPSBwOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGNvbl9zZXRfZGVmYXVsdF91bmltYXApOworCitpbnQgY29uX2NvcHlfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICpkc3RfdmMsIHN0cnVjdCB2Y19kYXRhICpzcmNfdmMpCit7CisJc3RydWN0IHVuaV9wYWdlZGlyICpxOworCisJaWYgKCEqc3JjX3ZjLT52Y191bmlfcGFnZWRpcl9sb2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgqZHN0X3ZjLT52Y191bmlfcGFnZWRpcl9sb2MgPT0gKnNyY192Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jKQorCQlyZXR1cm4gMDsKKwljb25fZnJlZV91bmltYXAoZHN0X3ZjKTsKKwlxID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSpzcmNfdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwlxLT5yZWZjb3VudCsrOworCSpkc3RfdmMtPnZjX3VuaV9wYWdlZGlyX2xvYyA9IChsb25nKXE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25fZ2V0X3VuaW1hcChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVzaG9ydCBjdCwgdXNob3J0IF9fdXNlciAqdWN0LCBzdHJ1Y3QgdW5pcGFpciBfX3VzZXIgKmxpc3QpCit7CisJaW50IGksIGosIGssIGVjdDsKKwl1MTYgKipwMSwgKnAyOworCXN0cnVjdCB1bmlfcGFnZWRpciAqcDsKKworCWVjdCA9IDA7CisJaWYgKCp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jKSB7CisJCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlpZiAoKHAxID0gcC0+dW5pX3BnZGlyW2ldKSkKKwkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorCQkJaWYgKChwMiA9ICoocDErKykpKQorCQkJCWZvciAoayA9IDA7IGsgPCA2NDsgaysrKSB7CisJCQkJCWlmICgqcDIgPCBNQVhfR0xZUEggJiYgZWN0KysgPCBjdCkgeworCQkJCQkJX19wdXRfdXNlcigodV9zaG9ydCkoKGk8PDExKSsoajw8NikrayksCisJCQkJCQkJICAgJmxpc3QtPnVuaWNvZGUpOworCQkJCQkJX19wdXRfdXNlcigodV9zaG9ydCkgKnAyLCAKKwkJCQkJCQkgICAmbGlzdC0+Zm9udHBvcyk7CisJCQkJCQlsaXN0Kys7CisJCQkJCX0KKwkJCQkJcDIrKzsKKwkJCQl9CisJfQorCV9fcHV0X3VzZXIoZWN0LCB1Y3QpOworCXJldHVybiAoKGVjdCA8PSBjdCkgPyAwIDogLUVOT01FTSk7Cit9CisKK3ZvaWQgY29uX3Byb3RlY3RfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IHJkb25seSkKK3sKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCisJaWYgKHApCisJCXAtPnJlYWRvbmx5ID0gcmRvbmx5OworfQorCitpbnQKK2NvbnZfdW5pX3RvX3BjKHN0cnVjdCB2Y19kYXRhICpjb25wLCBsb25nIHVjcykgCit7CisJaW50IGg7CisJdTE2ICoqcDEsICpwMjsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnA7CisgIAorCS8qIE9ubHkgMTYtYml0IGNvZGVzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUgKi8KKwlpZiAodWNzID4gMHhmZmZmKQorCQl1Y3MgPSAweGZmZmQ7CQkvKiBVK0ZGRkQ6IFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAqLworCWVsc2UgaWYgKHVjcyA8IDB4MjAgfHwgdWNzID49IDB4ZmZmZSkKKwkJcmV0dXJuIC0xOwkJLyogTm90IGEgcHJpbnRhYmxlIGNoYXJhY3RlciAqLworCWVsc2UgaWYgKHVjcyA9PSAweGZlZmYgfHwgKHVjcyA+PSAweDIwMGEgJiYgdWNzIDw9IDB4MjAwZikpCisJCXJldHVybiAtMjsJCQkvKiBaZXJvLXdpZHRoIHNwYWNlICovCisJLyoKKwkgKiBVTklfRElSRUNUX0JBU0UgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uIGluIHRoZSBVc2VyIFpvbmUKKwkgKiB3aGljaCBhbHdheXMgaGFzIGEgMToxIG1hcHBpbmcgdG8gdGhlIGN1cnJlbnRseSBsb2FkZWQgZm9udC4gIFRoZQorCSAqIFVOSV9ESVJFQ1RfTUFTSyBpbmRpY2F0ZXMgdGhlIGJpdCBzcGFuIG9mIHRoZSByZWdpb24uCisJICovCisJZWxzZSBpZiAoKHVjcyAmIH5VTklfRElSRUNUX01BU0spID09IFVOSV9ESVJFQ1RfQkFTRSkKKwkJcmV0dXJuIHVjcyAmIFVOSV9ESVJFQ1RfTUFTSzsKKyAgCisJaWYgKCEqY29ucC0+dmNfdW5pX3BhZ2VkaXJfbG9jKQorCQlyZXR1cm4gLTM7CisKKwlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSpjb25wLT52Y191bmlfcGFnZWRpcl9sb2M7ICAKKwlpZiAoKHAxID0gcC0+dW5pX3BnZGlyW3VjcyA+PiAxMV0pICYmCisJICAgIChwMiA9IHAxWyh1Y3MgPj4gNikgJiAweDFmXSkgJiYKKwkgICAgKGggPSBwMlt1Y3MgJiAweDNmXSkgPCBNQVhfR0xZUEgpCisJCXJldHVybiBoOworCisJcmV0dXJuIC00OwkJLyogbm90IGZvdW5kICovCit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBhdCBzeXNfc2V0dXAgdGltZSwgYWZ0ZXIgbWVtb3J5IGFuZCB0aGUgY29uc29sZSBhcmUKKyAqIGluaXRpYWxpemVkLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBjYWxsIGttYWxsb2MoLi4uLCBHRlBfS0VSTkVMKQorICogZnJvbSB0aGlzIGZ1bmN0aW9uLCBoZW5jZSB0aGUgY2FsbCBmcm9tIHN5c19zZXR1cC4KKyAqLwordm9pZCBfX2luaXQgCitjb25zb2xlX21hcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKQorCQlpZiAodmNfY29uc19hbGxvY2F0ZWQoaSkgJiYgISp2Y19jb25zW2ldLmQtPnZjX3VuaV9wYWdlZGlyX2xvYykKKwkJCWNvbl9zZXRfZGVmYXVsdF91bmltYXAodmNfY29uc1tpXS5kKTsKK30KKworRVhQT1JUX1NZTUJPTChjb25fY29weV91bmltYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NwNDM3LnVuaSBiL2RyaXZlcnMvY2hhci9jcDQzNy51bmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwNjg4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9jcDQzNy51bmkKQEAgLTAsMCArMSwyOTEgQEAKKyMKKyMgVW5pY29kZSB0YWJsZSBmb3IgSUJNIENvZGVwYWdlIDQzNy4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgbWFueSBtb3JlCisjIHN1YnN0aXR1dGlvbnMgdGhhdCBjb3VsZCBiZSBjb25jZWl2ZWQgKGZvciBleGFtcGxlLCB0aGljay1saW5lCisjIGdyYXBocyBwcm9iYWJseSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBkb3VibGUtbGluZSBvbmVzLCBhY2NlbnRlZAorIyBMYXRpbiBjaGFyYWN0ZXJzIHNob3VsZCByZXBsYWNlZCB3aXRoIHRoZWlyIG5vbmFjY2VudGVkIHZlcnNpb25zLAorIyBhbmQgc29tZSB1cHBlciBjYXNlIEdyZWVrIGNoYXJhY3RlcnMgY291bGQgYmUgcmVwbGFjZWQgYnkgTGF0aW4pLCBob3dldmVyLAorIyBJIGhhdmUgbGltaXRlZCBteXNlbGYgdG8gdGhlIFVuaWNvZGVzIHVzZWQgYnkgdGhlIGtlcm5lbCBJU08gODg1OS0xLAorIyBERUMgVlQsIGFuZCBJQk0gQ1AgNDM3IHRhYmxlcy4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgQmFzaWMgSUJNIGRpbmdiYXRzLCBzb21lIG9mIHdoaWNoIHdpbGwgbmV2ZXIgaGF2ZSBhIHB1cnBvc2UgY2xlYXIKKyMgdG8gbWFua2luZAorIworMHgwMAlVKzAwMDAKKzB4MDEJVSsyNjNhCisweDAyCVUrMjYzYgorMHgwMwlVKzI2NjUKKzB4MDQJVSsyNjY2IFUrMjVjNgorMHgwNQlVKzI2NjMKKzB4MDYJVSsyNjYwCisweDA3CVUrMjAyMgorMHgwOAlVKzI1ZDgKKzB4MDkJVSsyNWNiCisweDBhCVUrMjVkOQorMHgwYglVKzI2NDIKKzB4MGMJVSsyNjQwCisweDBkCVUrMjY2YQorMHgwZQlVKzI2NmIKKzB4MGYJVSsyNjNjCisweDEwCVUrMjViNiBVKzI1YmEKKzB4MTEJVSsyNWMwIFUrMjVjNAorMHgxMglVKzIxOTUKKzB4MTMJVSsyMDNjCisweDE0CVUrMDBiNgorMHgxNQlVKzAwYTcKKzB4MTYJVSsyNWFjCisweDE3CVUrMjFhOAorMHgxOAlVKzIxOTEKKzB4MTkJVSsyMTkzCisweDFhCVUrMjE5MgorMHgxYglVKzIxOTAKKzB4MWMJVSsyMjFmCisweDFkCVUrMjE5NAorMHgxZQlVKzI1YjIKKzB4MWYJVSsyNWJjCisjCisjIFRoZSBBU0NJSSByYW5nZSBpcyBpZGVudGl0eS1tYXBwZWQsIGJ1dCBzb21lIG9mIHRoZSBjaGFyYWN0ZXJzIGFsc28KKyMgaGF2ZSB0byBhY3QgYXMgc3Vic3RpdHV0ZXMsIGVzcGVjaWFsbHkgdGhlIHVwcGVyLWNhc2UgY2hhcmFjdGVycy4KKyMKKzB4MjAJVSswMDIwCisweDIxCVUrMDAyMQorMHgyMglVKzAwMjIgVSswMGE4CisweDIzCVUrMDAyMworMHgyNAlVKzAwMjQKKzB4MjUJVSswMDI1CisweDI2CVUrMDAyNgorMHgyNwlVKzAwMjcKKzB4MjgJVSswMDI4CisweDI5CVUrMDAyOQorMHgyYQlVKzAwMmEKKzB4MmIJVSswMDJiCisweDJjCVUrMDAyYyBVKzAwYjgKKzB4MmQJVSswMDJkIFUrMDBhZAorMHgyZQlVKzAwMmUKKzB4MmYJVSswMDJmCisweDMwCVUrMDAzMAorMHgzMQlVKzAwMzEKKzB4MzIJVSswMDMyCisweDMzCVUrMDAzMworMHgzNAlVKzAwMzQKKzB4MzUJVSswMDM1CisweDM2CVUrMDAzNgorMHgzNwlVKzAwMzcKKzB4MzgJVSswMDM4CisweDM5CVUrMDAzOQorMHgzYQlVKzAwM2EKKzB4M2IJVSswMDNiCisweDNjCVUrMDAzYworMHgzZAlVKzAwM2QKKzB4M2UJVSswMDNlCisweDNmCVUrMDAzZgorMHg0MAlVKzAwNDAKKzB4NDEJVSswMDQxIFUrMDBjMCBVKzAwYzEgVSswMGMyIFUrMDBjMworMHg0MglVKzAwNDIKKzB4NDMJVSswMDQzIFUrMDBhOQorMHg0NAlVKzAwNDQKKzB4NDUJVSswMDQ1IFUrMDBjOCBVKzAwY2EgVSswMGNiCisweDQ2CVUrMDA0NgorMHg0NwlVKzAwNDcKKzB4NDgJVSswMDQ4CisweDQ5CVUrMDA0OSBVKzAwY2MgVSswMGNkIFUrMDBjZSBVKzAwY2YKKzB4NGEJVSswMDRhCisweDRiCVUrMDA0YiBVKzIxMmEKKzB4NGMJVSswMDRjCisweDRkCVUrMDA0ZAorMHg0ZQlVKzAwNGUKKzB4NGYJVSswMDRmIFUrMDBkMiBVKzAwZDMgVSswMGQ0IFUrMDBkNQorMHg1MAlVKzAwNTAKKzB4NTEJVSswMDUxCisweDUyCVUrMDA1MiBVKzAwYWUKKzB4NTMJVSswMDUzCisweDU0CVUrMDA1NAorMHg1NQlVKzAwNTUgVSswMGQ5IFUrMDBkYSBVKzAwZGIKKzB4NTYJVSswMDU2CisweDU3CVUrMDA1NworMHg1OAlVKzAwNTgKKzB4NTkJVSswMDU5IFUrMDBkZAorMHg1YQlVKzAwNWEKKzB4NWIJVSswMDViCisweDVjCVUrMDA1YworMHg1ZAlVKzAwNWQKKzB4NWUJVSswMDVlCisweDVmCVUrMDA1ZiBVKzIzYmQgVStmODA0CisweDYwCVUrMDA2MAorMHg2MQlVKzAwNjEgVSswMGUzCisweDYyCVUrMDA2MgorMHg2MwlVKzAwNjMKKzB4NjQJVSswMDY0CisweDY1CVUrMDA2NQorMHg2NglVKzAwNjYKKzB4NjcJVSswMDY3CisweDY4CVUrMDA2OAorMHg2OQlVKzAwNjkKKzB4NmEJVSswMDZhCisweDZiCVUrMDA2YgorMHg2YwlVKzAwNmMKKzB4NmQJVSswMDZkCisweDZlCVUrMDA2ZQorMHg2ZglVKzAwNmYgVSswMGY1CisweDcwCVUrMDA3MAorMHg3MQlVKzAwNzEKKzB4NzIJVSswMDcyCisweDczCVUrMDA3MworMHg3NAlVKzAwNzQKKzB4NzUJVSswMDc1CisweDc2CVUrMDA3NgorMHg3NwlVKzAwNzcKKzB4NzgJVSswMDc4IFUrMDBkNworMHg3OQlVKzAwNzkgVSswMGZkCisweDdhCVUrMDA3YQorMHg3YglVKzAwN2IKKzB4N2MJVSswMDdjIFUrMDBhNQorMHg3ZAlVKzAwN2QKKzB4N2UJVSswMDdlCisjCisjIE9rYXksIHdoYXQgb24gRWFydGggaXMgdGhpcyBvbmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3I/CisjCisweDdmCVUrMjMwMgorIworIyBOb24tRW5nbGlzaCBjaGFyYWN0ZXJzLCBtb3N0bHkgbG93ZXIgY2FzZSBsZXR0ZXJzLi4uCisjCisweDgwCVUrMDBjNworMHg4MQlVKzAwZmMKKzB4ODIJVSswMGU5CisweDgzCVUrMDBlMgorMHg4NAlVKzAwZTQKKzB4ODUJVSswMGUwCisweDg2CVUrMDBlNQorMHg4NwlVKzAwZTcKKzB4ODgJVSswMGVhCisweDg5CVUrMDBlYgorMHg4YQlVKzAwZTgKKzB4OGIJVSswMGVmCisweDhjCVUrMDBlZQorMHg4ZAlVKzAwZWMKKzB4OGUJVSswMGM0CisweDhmCVUrMDBjNSBVKzIxMmIKKzB4OTAJVSswMGM5CisweDkxCVUrMDBlNgorMHg5MglVKzAwYzYKKzB4OTMJVSswMGY0CisweDk0CVUrMDBmNgorMHg5NQlVKzAwZjIKKzB4OTYJVSswMGZiCisweDk3CVUrMDBmOQorMHg5OAlVKzAwZmYKKzB4OTkJVSswMGQ2CisweDlhCVUrMDBkYworMHg5YglVKzAwYTIKKzB4OWMJVSswMGEzCisweDlkCVUrMDBhNQorMHg5ZQlVKzIwYTcKKzB4OWYJVSswMTkyCisweGEwCVUrMDBlMQorMHhhMQlVKzAwZWQKKzB4YTIJVSswMGYzCisweGEzCVUrMDBmYQorMHhhNAlVKzAwZjEKKzB4YTUJVSswMGQxCisweGE2CVUrMDBhYQorMHhhNwlVKzAwYmEKKzB4YTgJVSswMGJmCisweGE5CVUrMjMxMAorMHhhYQlVKzAwYWMKKzB4YWIJVSswMGJkCisweGFjCVUrMDBiYworMHhhZAlVKzAwYTEKKzB4YWUJVSswMGFiCisweGFmCVUrMDBiYgorIworIyBCbG9jayBncmFwaGljcworIworMHhiMAlVKzI1OTEKKzB4YjEJVSsyNTkyCisweGIyCVUrMjU5MworMHhiMwlVKzI1MDIKKzB4YjQJVSsyNTI0CisweGI1CVUrMjU2MQorMHhiNglVKzI1NjIKKzB4YjcJVSsyNTU2CisweGI4CVUrMjU1NQorMHhiOQlVKzI1NjMKKzB4YmEJVSsyNTUxCisweGJiCVUrMjU1NworMHhiYwlVKzI1NWQKKzB4YmQJVSsyNTVjCisweGJlCVUrMjU1YgorMHhiZglVKzI1MTAKKzB4YzAJVSsyNTE0CisweGMxCVUrMjUzNAorMHhjMglVKzI1MmMKKzB4YzMJVSsyNTFjCisweGM0CVUrMjUwMAorMHhjNQlVKzI1M2MKKzB4YzYJVSsyNTVlCisweGM3CVUrMjU1ZgorMHhjOAlVKzI1NWEKKzB4YzkJVSsyNTU0CisweGNhCVUrMjU2OQorMHhjYglVKzI1NjYKKzB4Y2MJVSsyNTYwCisweGNkCVUrMjU1MAorMHhjZQlVKzI1NmMKKzB4Y2YJVSsyNTY3CisweGQwCVUrMjU2OAorMHhkMQlVKzI1NjQKKzB4ZDIJVSsyNTY1CisweGQzCVUrMjU1OQorMHhkNAlVKzI1NTgKKzB4ZDUJVSsyNTUyCisweGQ2CVUrMjU1MworMHhkNwlVKzI1NmIKKzB4ZDgJVSsyNTZhCisweGQ5CVUrMjUxOAorMHhkYQlVKzI1MGMKKzB4ZGIJVSsyNTg4CisweGRjCVUrMjU4NAorMHhkZAlVKzI1OGMKKzB4ZGUJVSsyNTkwCisweGRmCVUrMjU4MAorIworIyBHcmVlayBsZXR0ZXJzIGFuZCBtYXRoZW1hdGljYWwgc3ltYm9scworIworMHhlMAlVKzAzYjEKKzB4ZTEJVSswM2IyIFUrMDBkZgorMHhlMglVKzAzOTMKKzB4ZTMJVSswM2MwCisweGU0CVUrMDNhMworMHhlNQlVKzAzYzMKKzB4ZTYJVSswMGI1IFUrMDNiYworMHhlNwlVKzAzYzQKKzB4ZTgJVSswM2E2IFUrMDBkOAorMHhlOQlVKzAzOTgKKzB4ZWEJVSswM2E5IFUrMjEyNgorMHhlYglVKzAzYjQKKzB4ZWMJVSsyMjFlCisweGVkCVUrMDNjNiBVKzAwZjgKKzB4ZWUJVSswM2I1CisweGVmCVUrMjIyOQorMHhmMAlVKzIyNjEKKzB4ZjEJVSswMGIxCisweGYyCVUrMjI2NQorMHhmMwlVKzIyNjQKKzB4ZjQJVSsyMzIwCisweGY1CVUrMjMyMQorMHhmNglVKzAwZjcKKzB4ZjcJVSsyMjQ4CisweGY4CVUrMDBiMAorMHhmOQlVKzIyMTkKKzB4ZmEJVSswMGI3CisweGZiCVUrMjIxYQorMHhmYwlVKzIwN2YKKzB4ZmQJVSswMGIyCisjCisjIFNxdWFyZSBidWxsZXQsIG5vbi1zcGFjaW5nIGJsYW5rCisjIE1hcHBpbmcgVStmZmZkIHRvIHRoZSBzcXVhcmUgYnVsbGV0IG1lYW5zIGl0IGlzIHRoZSBzdWJzdGl0dXRpb24KKyMgY2hhcmFjdGVyCisjIAorMHhmZQlVKzI1YTAgVStmZmZkCisweGZmCVUrMDBhMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTUzMzdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTAsMCArMSw1NTQwIEBACisjdW5kZWYJQkxPQ0tNT1ZFCisjZGVmaW5lCVpfV0FLRQorI3VuZGVmCVpfRVhUX0NIQVJTX0lOX0JVRkZFUgorc3RhdGljIGNoYXIgcmNzaWRbXSA9CisiJFJldmlzaW9uOiAyLjMuMi4yMCAkJERhdGU6IDIwMDQvMDIvMjUgMTg6MTQ6MTYgJCI7CisKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRyaXZlciBmb3IgdGhlIEN5Y2xhZGVzIGFzeW5jIG11bHRpcG9ydAorICogc2VyaWFsIGJvYXJkcy4KKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBSYW5kb2xwaCBCZW50c29uIDxiZW50c29uQGdyaWVnLnNlYXNsdWcub3JnPi4KKyAqIE1vZGlmaWVkIGFuZCBtYWludGFpbmVkIGJ5IE1hcmNpbyBTYWl0byA8bWFyY2lvQGN5Y2xhZGVzLmNvbT4uCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieSBDeWNsYWRlcyB0ZWFtIDxhc3luY0BjeWNsYWRlcy5jb20+LgorICoKKyAqIEZvciBUZWNobmljYWwgc3VwcG9ydCBhbmQgaW5zdGFsbGF0aW9uIHByb2JsZW1zLCBwbGVhc2Ugc2VuZCBlLW1haWwKKyAqIHRvIHN1cHBvcnRAY3ljbGFkZXMuY29tLgorICoKKyAqIE11Y2ggb2YgdGhlIGRlc2lnbiBhbmQgc29tZSBvZiB0aGUgY29kZSBjYW1lIGZyb20gc2VyaWFsLmMKKyAqIHdoaWNoIHdhcyBjb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzLiAgSXQgd2FzCisgKiBleHRlbnNpdmVseSByZXdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgOC8xNi85MiAtLSA5LzE0LzkyLAorICogYW5kIHRoZW4gZml4ZWQgYXMgc3VnZ2VzdGVkIGJ5IE1pY2hhZWwgSy4gSm9obnNvbiAxMi8xMi85Mi4KKyAqCisgKiBUaGlzIHZlcnNpb24gc3VwcG9ydHMgc2hhcmVkIElSUSdzIChvbmx5IGZvciBQQ0kgYm9hcmRzKS4KKyAqCisgKiAkTG9nOiBjeWNsYWRlcy5jLHYgJAorICogUHJldmVudCB1c2VycyBmcm9tIG9wZW5pbmcgbm9uLWV4aXN0aW5nIFogcG9ydHMuCisgKgorICogUmV2aXNpb24gMi4zLjIuOCAgIDIwMDAvMDcvMDYgMTg6MTQ6MTYgaXZhbgorICogRml4ZWQgdGhlIFBDSSBkZXRlY3Rpb24gZnVuY3Rpb24gdG8gd29yayBwcm9wZXJseSBvbiBBbHBoYSBzeXN0ZW1zLgorICogSW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgVElPQ1NFUkdFVExTUiBpb2N0bC4KKyAqIEltcGxlbWVudGVkIGZ1bGwgc3VwcG9ydCBmb3Igbm9uLXN0YW5kYXJkIGJhdWQgcmF0ZXMuCisgKgorICogUmV2aXNpb24gMi4zLjIuNyAgIDIwMDAvMDYvMDEgMTg6MjY6MzQgaXZhbgorICogUmVxdWVzdCBQTFggSS9PIHJlZ2lvbiwgYWx0aG91Z2ggZHJpdmVyIGRvZXNuJ3QgdXNlIGl0LCB0byBhdm9pZAorICogcHJvYmxlbXMgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4KKyAqIFJlbW92ZWQgY291bnQgZm9yIG9uLWJvYXJkIGJ1ZmZlciBjaGFyYWN0ZXJzIGluIGN5X2NoYXJzX2luX2J1ZmZlcgorICogKEN5Y2xhZGVzLVogb25seSkuCisgKgorICogUmV2aXNpb24gMi4zLjIuNiAgIDIwMDAvMDUvMDUgMTM6NTY6MDUgaXZhbgorICogRHJpdmVyIG5vdyByZXBvcnRzIHBoeXNpY2FsIGluc3RlYWQgb2YgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzLgorICogTWFza3Mgd2VyZSBhZGRlZCB0byBzb21lIEN5Y2xhZGVzLVogcmVhZCBhY2Nlc3Nlcy4KKyAqIEltcGxlbWVudGVkIHdvcmthcm91bmQgZm9yIFBMWDkwNTAgYnVnIHRoYXQgd291bGQgY2F1c2UgYSBzeXN0ZW0gbG9ja3VwCisgKiBpbiBjZXJ0YWluIHN5c3RlbXMsIGRlcGVuZGluZyBvbiB0aGUgTU1JTyBhZGRyZXNzZXMgYWxsb2NhdGVkIHRvIHRoZQorICogYm9hcmQuCisgKiBDaGFuZ2VkIHRoZSBUeCBpbnRlcnJ1cHQgcHJvZ3JhbW1pbmcgaW4gdGhlIENEMTQwMCBjaGlwcyB0byBib29zdCB1cAorICogcGVyZm9ybWFuY2UgKEN5Y2xvbS1ZIG9ubHkpLgorICogQ29kZSBpcyBub3cgY29tcGxpYW50IHdpdGggdGhlIG5ldyBtb2R1bGUgaW50ZXJmYWNlIChtb2R1bGVfW2luaXR8ZXhpdF0pLgorICogTWFrZSB1c2Ugb2YgdGhlIFBDSSBoZWxwZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBQQ0kgcmVzb3VyY2VzLgorICogRGlkIHNvbWUgY29kZSAiaG91c2VrZWVwaW5nIi4KKyAqCisgKiBSZXZpc2lvbiAyLjMuMi41ICAgMjAwMC8wMS8xOSAxNDozNTozMyBpdmFuCisgKiBGaXhlZCBidWcgaW4gY3lfc2V0X3Rlcm1pb3Mgb24gQ1JUU0NUUyBmbGFnIHR1cm5vZmYuCisgKgorICogUmV2aXNpb24gMi4zLjIuNCAgIDIwMDAvMDEvMTcgMDk6MTk6NDAgaXZhbgorICogRml4ZWQgU01QIGxvY2tpbmcgaW4gQ3ljbG9tLVkgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogUmV2aXNpb24gMi4zLjIuMyAgIDE5OTkvMTIvMjggMTI6MTE6MzkgaXZhbgorICogQWRkZWQgYSBuZXcgY3ljbGFkZXNfY2FyZCBmaWVsZCBjYWxsZWQgbnBvcnRzIHRvIGFsbG93IHRoZSBkcml2ZXIgdG8KKyAqIGtub3cgdGhlIGV4YWN0IG51bWJlciBvZiBwb3J0cyBmb3VuZCBieSB0aGUgWiBmaXJtd2FyZSBhZnRlciBpdHMgbG9hZDsKKyAqIFJYIGJ1ZmZlciBjb250ZW50aW9uIHByZXZlbnRpb24gbG9naWMgb24gaW50ZXJydXB0IG9wIG1vZGUgcmV2aXNpdGVkCisgKiAoQ3ljbGFkZXMtWiBvbmx5KTsKKyAqIFJldmlzaXRlZCBwcmludGsncyBmb3IgWiBkZWJ1ZzsKKyAqIERyaXZlciBub3cgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb25zdGFudCBTRVJJQUxfWE1JVF9TSVpFIGlzIGRlZmluZWQ7CisgKgorICogUmV2aXNpb24gMi4zLjIuMiAgIDE5OTkvMTAvMDEgMTE6Mjc6NDMgaXZhbgorICogRml4ZWQgYnVnIGluIGN5el9wb2xsIHRoYXQgd291bGQgbWFrZSBhbGwgcG9ydHMgYnV0IHBvcnQgMCAKKyAqIHVuYWJsZSB0byB0cmFuc21pdC9yZWNlaXZlIGRhdGEgKEN5Y2xhZGVzLVogb25seSk7CisgKiBJbXBsZW1lbnRlZCBsb2dpYyB0byBwcmV2ZW50IHRoZSBSWCBidWZmZXIgZnJvbSBiZWluZyBzdHVjayB3aXRoIGRhdGEKKyAqIGR1ZSB0byBhIGRyaXZlciAvIGZpcm13YXJlIHJhY2UgY29uZGl0aW9uIGluIGludGVycnVwdCBvcCBtb2RlCisgKiAoQ3ljbGFkZXMtWiBvbmx5KTsKKyAqIEZpeGVkIGJ1ZyBpbiBibG9ja190aWxfcmVhZHkgbG9naWMgdGhhdCB3b3VsZCBsZWFkIHRvIGEgc3lzdGVtIGNyYXNoOworICogUmV2aXNpdGVkIGN5X2Nsb3NlIHNwaW5sb2NrIHVzYWdlOworICoKKyAqIFJldmlzaW9uIDIuMy4yLjEgICAxOTk5LzA5LzI4IDExOjAxOjIyIGl2YW4KKyAqIFJldmlzaXRlZCBDT05GSUdfUENJIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciBQQ0kgYm9hcmQgc3VwcG9ydDsKKyAqIEltcGxlbWVudGVkIFRJT0NHSUNPVU5UIGFuZCBUSU9DTUlXQUlUIGlvY3RsIHN1cHBvcnQ7CisgKiBfTWFqb3JfIGNsZWFudXAgb24gdGhlIEN5Y2xhZGVzLVogaW50ZXJydXB0IHN1cHBvcnQgY29kZSAvIGxvZ2ljOworICogUmVtb3ZlZCBDVFMgaGFuZGxpbmcgZnJvbSB0aGUgZHJpdmVyIC0tIHRoaXMgaXMgbm93IGNvbXBsZXRlbHkgaGFuZGxlZAorICogYnkgdGhlIGZpcm13YXJlIChDeWNsYWRlcy1aIG9ubHkpOworICogRmx1c2ggUlggb24tYm9hcmQgYnVmZmVycyBvbiBhIHBvcnQgb3BlbiAoQ3ljbGFkZXMtWiBvbmx5KTsKKyAqIEZpeGVkIGhhbmRsaW5nIG9mIEFTWU5DX1NQRF8qIFRUWSBmbGFnczsKKyAqIE1vZHVsZSB1bmxvYWQgbm93IHVubWFwcyBhbGwgbWVtb3J5IGFyZWEgYWxsb2NhdGVkIGJ5IGlvcmVtYXA7CisgKgorICogUmV2aXNpb24gMi4zLjEuMSAgIDE5OTkvMDcvMTUgMTY6NDU6NTMgaXZhbgorICogUmVtb3ZlZCBDWV9QUk9DIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uOworICogSW1wbGVtZW50ZWQgU01QLWF3YXJlbmVzcyBmb3IgdGhlIGRyaXZlcjsKKyAqIEltcGxlbWVudGVkIGEgbmV3IElTQSBJUlEgYXV0b3Byb2JlIHRoYXQgdXNlcyB0aGUgaXJxX3Byb2JlX1tvbnxvZmZdIAorICogZnVuY3Rpb25zOworICogVGhlIGRyaXZlciBub3cgYWNjZXB0cyBtZW1vcnkgYWRkcmVzc2VzIChtYWRkcj0weE1NTU1NKSBhbmQgSVJRcworICogKGlycT1OTikgYXMgcGFyYW1ldGVycyAob25seSBmb3IgSVNBIGJvYXJkcyk7CisgKiBGaXhlZCBidWcgaW4gc2V0X2xpbmVfY2hhciB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIEN5Y2xhZGVzLVogCisgKiBwb3J0cyBmcm9tIGJlaW5nIGNvbmZpZ3VyZWQgYXQgc3BlZWRzIGFib3ZlIDExNS4yS2JwczsKKyAqIEZpeGVkIGJ1ZyBpbiBjeV9zZXRfdGVybWlvcyB0aGF0IHdvdWxkIHByZXZlbnQgWE9OL1hPRkYgZmxvdyBjb250cm9sCisgKiBzd2l0Y2hpbmcgZnJvbSB3b3JraW5nIHByb3Blcmx5OworICogVGhlIGRyaXZlciBub3cgb25seSBwcmludHMgSVJRIGluZm8gZm9yIHRoZSBDeWNsYWRlcy1aIGlmIGl0J3MgCisgKiBjb25maWd1cmVkIHRvIHdvcmsgaW4gaW50ZXJydXB0IG1vZGU7CisgKgorICogUmV2aXNpb24gMi4yLjIuMyAgIDE5OTkvMDYvMjggMTE6MTM6MjkgaXZhbgorICogQWRkZWQgc3VwcG9ydCBmb3IgaW50ZXJydXB0IG1vZGUgb3BlcmF0aW9uIGZvciB0aGUgWiBjYXJkczsKKyAqIFJlbW92ZWQgdGhlIGRyaXZlciBpbmFjdGl2aXR5IGNvbnRyb2wgZm9yIHRoZSBaOworICogQWRkZWQgYSBtaXNzaW5nIE1PRF9ERUNfVVNFX0NPVU5UIGluIHRoZSBjeV9vcGVuIGZ1bmN0aW9uIGZvciB3aGVuIAorICogdGhlIFogZmlybXdhcmUgaXMgbm90IGxvYWRlZCB5ZXQ7CisgKiBSZXBsYWNlZCB0aGUgIm1hbnVhbCIgWiBUeCBmbHVzaCBidWZmZXIgYnkgYSBjYWxsIHRvIGEgRlcgY29tbWFuZCBvZiAKKyAqIHNhbWUgZnVuY3Rpb25hbGl0eTsKKyAqIEltcGxlbWVudGVkIHdvcmthcm91bmQgZm9yIElSUSBzZXR0aW5nIGxvc3Mgb24gdGhlIFBDSSBjb25maWd1cmF0aW9uIAorICogcmVnaXN0ZXJzIGFmdGVyIGEgUENJIGJyaWRnZSBFRVBST00gcmVsb2FkIChhZmZlY3RzIFBMWDkwNjAgb25seSk7CisgKgorICogUmV2aXNpb24gMi4yLjIuMiAgMTk5OS8wNS8xNCAxNzoxODoxNSBpdmFuCisgKiAvcHJvYyBlbnRyeSBsb2NhdGlvbiBjaGFuZ2VkIHRvIC9wcm9jL3R0eS9kcml2ZXIvY3ljbGFkZXM7CisgKiBBZGRlZCBzdXBwb3J0IHRvIHNoYXJlZCBJUlEncyAob25seSBmb3IgUENJIGJvYXJkcyk7CisgKiBBZGRlZCBzdXBwb3J0IGZvciBDb2JhbHQgUXViZTIgc3lzdGVtczsKKyAqIElSUSBbZGVdYWxsb2NhdGlvbiBzY2hlbWUgcmV2aXNpdGVkOworICogQlJFQUsgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBpbiBvcmRlciB0byBtYWtlIHVzZSBvZiB0aGUgJ2JyZWFrX2N0bCcKKyAqIFRUWSBmYWNpbGl0eTsKKyAqIEZpeGVkIHR5cG8gaW4gVFRZIHN0cnVjdHVyZSBmaWVsZCAnZHJpdmVyX25hbWUnOworICogSW5jbHVkZWQgYSBQQ0kgYnJpZGdlIHJlc2V0IGFuZCBFRVBST00gcmVsb2FkIGluIHRoZSBib2FyZCAKKyAqIGluaXRpYWxpemF0aW9uIGNvZGUgKGZvciBib3RoIFkgYW5kIFogc2VyaWVzKS4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMi4xICAxOTk5LzA0LzA4IDE2OjE3OjQzIGl2YW4KKyAqIEZpeGVkIGEgYnVnIGluIGN5X3dhaXRfdW50aWxfc2VudCB0aGF0IHdhcyBwcmV2ZW50aW5nIHRoZSBwb3J0IHRvIGJlIAorICogY2xvc2VkIHByb3Blcmx5IGFmdGVyIGEgU0lHSU5UOworICogTW9kdWxlIHVzYWdlIGNvdW50ZXIgc2NoZW1lIHJldmlzaXRlZDsKKyAqIEFkZGVkIHN1cHBvcnQgdG8gdGhlIHVwY29taW5nIFkgUENJIGJvYXJkcyAoaS5lLiwgc3VwcG9ydCB0byBhZGRpdGlvbmFsCisgKiBQQ0kgRGV2aWNlIElEJ3MpLgorICogCisgKiBSZXZpc2lvbiAyLjIuMS4xMCAxOTk5LzAxLzIwIDE2OjE0OjI5IGl2YW4KKyAqIFJlbW92ZWQgYWxsIHVubmVjZXNzYXJ5IHBhZ2UtYWxpZ25lbWVudCBvcGVyYXRpb25zIGluIGlvcmVtYXAgY2FsbHMKKyAqIChpb3JlbWFwIGlzIGN1cnJlbnRseSBzYWZlIGZvciB0aGVzZSBvcGVyYXRpb25zKS4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMS45ICAxOTk4LzEyLzMwIDE4OjE4OjMwIGl2YW4KKyAqIENoYW5nZWQgYWNjZXNzIHRvIFBMWCBQQ0kgYnJpZGdlIHJlZ2lzdGVycyBmcm9tIEkvTyB0byBNTUlPLCBpbiAKKyAqIG9yZGVyIHRvIG1ha2UgUExYOTA1MC1iYXNlZCBib2FyZHMgd29yayB3aXRoIGNlcnRhaW4gbW90aGVyYm9hcmRzLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjggIDE5OTgvMTEvMTMgMTI6NDY6MjAgaXZhbgorICogY3lfY2xvc2UgZnVuY3Rpb24gbm93IHJlc2V0cyAoY29ycmVjdGx5KSB0aGUgdHR5LT5jbG9zaW5nIGZsYWc7CisgKiBKSUZGSUVTX0RJRkYgbWFjcm8gZml4ZWQuCisgKgorICogUmV2aXNpb24gMi4yLjEuNyAgMTk5OC8wOS8wMyAxMjowNzoyOCBpdmFuCisgKiBGaXhlZCBidWcgaW4gY3lfY2xvc2UgZnVuY3Rpb24sIHdoaWNoIHdhcyBub3QgaW5mb3JtaW5nIEhXIG9mCisgKiB3aGljaCBwb3J0IHNob3VsZCBoYXZlIHRoZSByZWNlcHRpb24gZGlzYWJsZWQgYmVmb3JlIGRvaW5nIHNvOworICogZml4ZWQgQ3ljbG9tLThZb1AgaGFyZHdhcmUgZGV0ZWN0aW9uIGJ1Zy4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMS42ICAxOTk4LzA4LzIwIDE3OjE1OjM5IGl2YW4KKyAqIEZpeGVkIGJ1ZyBpbiBjeV9jbG9zZSBmdW5jdGlvbiwgd2hpY2ggY2F1c2VzIG1hbGZ1bmN0aW9uCisgKiBvZiBvbmUgb2YgdGhlIGZpcnN0IDQgcG9ydHMgd2hlbiBhIGhpZ2hlciBwb3J0IGlzIGNsb3NlZAorICogKEN5Y2xvbS1ZIG9ubHkpLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjUgIDE5OTgvMDgvMTAgMTg6MTA6MjggaXZhbgorICogRml4ZWQgQ3ljbG9tLTRZbyBoYXJkd2FyZSBkZXRlY3Rpb24gYnVnLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjQgIDE5OTgvMDgvMDQgMTE6MDI6NTAgaXZhbgorICogL3Byb2MvY3ljbGFkZXMgaW1wbGVtZW50YXRpb24gd2l0aCBncmVhdCBjb2xsYWJvcmF0aW9uIG9mIAorICogTWFyYyBMZXdpcyA8bWFyY0BibGFyZy5uZXQ+OworICogY3l5X2ludGVycnVwdCB3YXMgY2hhbmdlZCB0byBhdm9pZCBvY2N1cnJlbmNlIG9mIGtlcm5lbCBvb3BzZXMKKyAqIGR1cmluZyBQUFAgb3BlcmF0aW9uLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjMgIDE5OTgvMDYvMDEgMTI6MDk6MTAgaXZhbgorICogR2VuZXJhbCBjb2RlIHJldmlldyBpbiBvcmRlciB0byBjb21wbHkgd2l0aCAyLjEga2VybmVsIHN0YW5kYXJkczsKKyAqIGRhdGEgbG9zcyBwcmV2ZW50aW9uIGZvciBzbG93IGRldmljZXMgcmV2aXNpdGVkIChjeV93YWl0X3VudGlsX3NlbnQKKyAqIHdhcyBjcmVhdGVkKTsKKyAqIHJlbW92ZWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZm9yIG5ldy9vbGQgUENJIHN0cnVjdHVyZSBzdXBwb3J0IAorICogKG5vdyB0aGUgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIG5ldyBQQ0kgc3RydWN0dXJlKS4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMS4xICAxOTk4LzAzLzE5IDE2OjQzOjEyIGl2YW4KKyAqIGFkZGVkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciBuZXcvb2xkIFBDSSBzdHJ1Y3R1cmUgc3VwcG9ydDsKKyAqIHJlbW92ZWQga2VybmVsIHNlcmllcyAoMi4wLnggLyAyLjEueCkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uCisgKgorICogUmV2aXNpb24gMi4xLjEuMyAgMTk5OC8wMy8xNiAxODowMToxMiBpdmFuCisgKiBjbGVhbmVkIHVwIHRoZSBkYXRhIGxvc3MgZml4OworICogZml4ZWQgWE9OL1hPRkYgaGFuZGxpbmcgb25jZSBtb3JlIChDeWNsYWRlcy1aKTsKKyAqIGdlbmVyYWwgcmV2aWV3IG9mIHRoZSBkcml2ZXIgcm91dGluZXM7CisgKiBpbnRyb2R1Y3Rpb24gb2YgYSBtZWNoYW5pc20gdG8gcHJldmVudCBkYXRhIGxvc3Mgd2l0aCBzbG93IAorICogcHJpbnRlcnMsIGJ5IGZvcmNpbmcgYSBkZWxheSBiZWZvcmUgY2xvc2luZyB0aGUgcG9ydC4KKyAqCisgKiBSZXZpc2lvbiAyLjEuMS4yICAxOTk4LzAyLzE3IDE2OjUwOjAwIGl2YW4KKyAqIGZpeGVkIGRldGVjdGlvbi9oYW5kbGluZyBvZiBuZXcgQ0QxNDAwIGluIFllIGJvYXJkczsKKyAqIGZpeGVkIFhPTi9YT0ZGIGhhbmRsaW5nIChDeWNsYWRlcy1aKTsKKyAqIGZpeGVkIGRhdGEgbG9zcyBjYXVzZWQgYnkgYSBwcmVtYXR1cmUgcG9ydCBjbG9zZTsKKyAqIGludHJvZHVjdGlvbiBvZiBhIGZsYWcgdGhhdCBob2xkcyB0aGUgQ0QxNDAwIHZlcnNpb24gSUQgcGVyIHBvcnQKKyAqICh1c2VkIGJ5IHRoZSBDWUdFVENEMTQwMFZFUiBuZXcgaW9jdGwpLgorICoKKyAqIFJldmlzaW9uIDIuMS4xLjEgIDE5OTcvMTIvMDMgMTc6MzE6MTkgaXZhbgorICogQ29kZSByZXZpZXcgZm9yIHRoZSBtb2R1bGUgY2xlYW51cCByb3V0aW5lOworICogZml4ZWQgUlRTIGFuZCBEVFIgc3RhdHVzIHJlcG9ydCBmb3IgbmV3IENEMTQwMCdzIGluIGdldF9tb2RlbV9pbmZvOworICogaW5jbHVkZXMgYW5vbnltb3VzIGNoYW5nZXMgcmVnYXJkaW5nIHNpZ25hbF9wZW5kaW5nLgorICogCisgKiBSZXZpc2lvbiAyLjEgIDE5OTcvMTEvMDEgMTc6NDI6NDEgaXZhbgorICogQ2hhbmdlcyBpbiB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgQWxwaGEgc3lzdGVtcyAoZXhjZXB0IDhabyBWXzEpOworICogQlJFQUsgZml4IGZvciB0aGUgQ3ljbGFkZXMtWiBib2FyZHM7CisgKiBkcml2ZXIgaW5hY3Rpdml0eSBjb250cm9sIGJ5IEZXIGltcGxlbWVudGVkOworICogaW50cm9kdWN0aW9uIG9mIGZsYWcgdGhhdCBhbGxvd3MgZHJpdmVyIHRvIHRha2UgYWR2YW50YWdlIG9mIAorICogYSBzcGVjaWFsIENEMTQwMCBmZWF0dXJlIHJlbGF0ZWQgdG8gSFcgZmxvdyBjb250cm9sOworICogYWRkZWQgc3VwcG9ydCBmb3IgdGhlIENEMTQwMCAgcmV2LiBKIChDeWNsb20tWSBib2FyZHMpOworICogaW50cm9kdWN0aW9uIG9mIGlvY3RscyB0bzoKKyAqICAtIGNvbnRyb2wgdGhlIHJ0c2R0cl9pbnYgZmxhZyAoQ3ljbG9tLVkpOworICogIC0gY29udHJvbCB0aGUgcmZsb3cgZmxhZyAoQ3ljbG9tLVkpOworICogIC0gYWRqdXN0IHRoZSBwb2xsaW5nIGludGVydmFsIChDeWNsYWRlcy1aKTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMzMgIDE5OTcvMDYvMjcgMTk6MDA6MDAgIGl2YW4KKyAqIEZpeGVzIHJlbGF0ZWQgdG8ga2VybmVsIHZlcnNpb24gY29uZGl0aW9uYWwgCisgKiBjb21waWxhdGlvbi4KKyAqICAKKyAqIFJldmlzaW9uIDEuMzYuNC4zMiAgMTk5Ny8wNi8xNCAxOTozMDowMCAgaXZhbgorICogQ29tcGF0aWJpbGl0eSBpc3N1ZXMgYmV0d2VlbiBrZXJuZWxzIDIuMC54IGFuZCAKKyAqIDIuMS54IChtYWlubHkgcmVsYXRlZCB0byBjbGVhcl9iaXQgZnVuY3Rpb24pLgorICogIAorICogUmV2aXNpb24gMS4zNi40LjMxICAxOTk3LzA2LzAzIDE1OjMwOjAwICBpdmFuCisgKiBDaGFuZ2VzIHRvIGRlZmluZSB0aGUgbWVtb3J5IHdpbmRvdyBhY2NvcmRpbmcgdG8gdGhlIAorICogYm9hcmQgdHlwZS4KKyAqICAKKyAqIFJldmlzaW9uIDEuMzYuNC4zMCAgMTk5Ny8wNS8xNiAxNTozMDowMCAgZGFuaWVsCisgKiBDaGFuZ2VzIHRvIHN1cHBvcnQgbmV3IGN5Y2xhZGVzWiBib2FyZHMuCisgKgorICogUmV2aXNpb24gMS4zNi40LjI5ICAxOTk3LzA1LzEyIDExOjMwOjAwICBkYW5pZWwKKyAqIE1lcmdlIG9mIEJlbnRzb24ncyBhbmQgRGFuaWVsJ3MgdmVyc2lvbiAxLjM2LjQuMjguCisgKiBDb3JyZWN0cyBidWcgaW4gY3lfZGV0ZWN0X3BjaTogY2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUKKyAqIHBvcnRzIHRoYW4gdGhlIG51bWJlciBvZiBzdGF0aWMgc3RydWN0cyBhbGxvY2F0ZWQuCisgKiBXYXJuaW5nIG1lc3NhZ2UgZHVyaW5nIGluaXRpYWxpemF0aW9uIGlmIHRoaXMgZHJpdmVyIGlzCisgKiB1c2VkIHdpdGggdGhlIG5ldyBnZW5lcmF0aW9uIG9mIGN5Y2xhZGVzWiBib2FyZHMuICBUaG9zZQorICogd2lsbCBiZSBzdXBwb3J0ZWQgb25seSBpbiBuZXh0IHJlbGVhc2Ugb2YgdGhlIGRyaXZlci4KKyAqIENvcnJlY3RzIGJ1ZyBpbiBjeV9kZXRlY3RfcGNpIGFuZCBjeV9kZXRlY3RfaXNhIHRoYXQKKyAqIHJldHVybmVkIHdyb25nIG51bWJlciBvZiBWQUxJRCBib2FyZHMsIHdoZW4gYSBjeWNsb21ZCisgKiB3YXMgZm91bmQgd2l0aCBubyBzZXJpYWwgbW9kdWxlcyBjb25uZWN0ZWQuCisgKiBDaGFuZ2VzIHRvIHVzZSBjdXJyZW50ICgyLjEueCkga2VybmVsIHN1YnJvdXRpbmUgbmFtZXMKKyAqIGFuZCBjcmVhdGVkIG1hY3JvcyBmb3IgY29tcGlsYXRpb24gd2l0aCAyLjAueCBrZXJuZWwsCisgKiBpbnN0ZWFkIG9mIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yOCAgMTk5Ny8wNS8/PyA/PzowMDowMCAgYmVudHNvbgorICogQ2hhbmdlIHF1ZXVlX3Rhc2tfaXJxX29mZiB0byBxdWV1ZV90YXNrX2lycS4KKyAqIFRoZSBpbmxpbmUgZnVuY3Rpb24gcXVldWVfdGFza19pcnFfb2ZmICh0cXVldWUuaCkKKyAqIHdhcyByZW1vdmVkIGZyb20gbGF0ZXN0IHJlbGVhc2VzIG9mIDIuMS54IGtlcm5lbC4KKyAqIFVzZSBvZiBtYWNybyBfX2luaXQgdG8gbWFyayB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIHJvdXRpbmVzLCBzbyBtZW1vcnkgY2FuIGJlIHJldXNlZC4KKyAqIEFsc28gaW5jb3Jwb3JhdGUgaW1wbGVtZW50YXRpb24gb2YgY3JpdGljYWwgcmVnaW9uCisgKiBpbiBmdW5jdGlvbiBjbGVhbnVwX21vZHVsZSgpIGNyZWF0ZWQgYnkgYW5vbnltb3VzCisgKiBsaW51eGVyLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yOCAgMTk5Ny8wNC8yNSAxNjowMDowMCAgZGFuaWVsCisgKiBDaGFuZ2UgdG8gc3VwcG9ydCBuZXcgZmlybXdhcmUgdGhhdCBzb2x2ZXMgRENEIHByb2JsZW06CisgKiBhcHBsaWNhdGlvbiBjb3VsZCBmYWlsIHRvIHJlY2VpdmUgU0lHSFVQIHNpZ25hbCB3aGVuIERDRAorICogdmFyeWluZyB0b28gZmFzdC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMjcgIDE5OTcvMDMvMjYgMTA6MzA6MDAgIGRhbmllbAorICogQ2hhbmdlZCBmb3Igc3VwcG9ydCBsaW51eCB2ZXJzaW9ucyAyLjEuWC4KKyAqIEJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBsaW51eCB2ZXJzaW9ucyAyLjAuWC4KKyAqIENvcnJlY3RlZCBpbGxlZ2FsIHVzZSBvZiBmaWxsZXIgZmllbGQgaW4KKyAqIENIX0NUUkwgc3RydWN0LgorICogRGVsZXRlZCBzb21lIGRlYnVnIG1lc3NhZ2VzLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yNiAgMTk5Ny8wMi8yNyAxMjowMDowMCAgZGFuaWVsCisgKiBJbmNsdWRlZCBjaGVjayBmb3IgTlVMTCB0dHkgcG9pbnRlciBpbiBjeXpfcG9sbC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMjUgIDE5OTcvMDIvMjYgMTY6Mjg6MzAgIGJlbnRzb24KKyAqIEJpbGwgRm9zdGVyIGF0IEJsYXJnISBPbmxpbmUgc2VydmljZXMgbm90aWNlZCB0aGF0CisgKiBzb21lIG9mIHRoZSBzd2l0Y2ggZWxlbWVudHMgb2YgLVogbW9kZW0gY29udHJvbAorICogbGFja2VkIGEgY2xvc2luZyAiYnJlYWs7IgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yNCAgMTk5Ny8wMi8yNCAxMTowMDowMCAgZGFuaWVsCisgKiBDaGFuZ2VkIGxvdyB3YXRlciB0aHJlc2hvbGQgZm9yIGJ1ZmZlciB4bWl0X2J1ZgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yMyAgMTk5Ni8xMi8wMiAyMTo1MDoxNiAgYmVudHNvbgorICogTWFyY2lvIHByb3ZpZGVkIGZpeCB0byBtb2RlbSBzdGF0dXMgZmV0Y2ggZm9yIC1aCisgKgorICogUmV2aXNpb24gMS4zNi40LjIyICAxOTk2LzEwLzI4IDIyOjQxOjE3ICBiZW50c29uCisgKiBpbXByb3ZlIG1hcHBpbmcgb2YgLVogY29udHJvbCBwYWdlICh0aGFua3MgdG8gU3RldmUKKyAqIFByaWNlIDxzdGV2ZXBAZmEudGRrdGNhLmNvbT4gZm9yIGhlbHAgb24gdGhpcykKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMjEgIDE5OTYvMDkvMTAgMTc6MDA6MTAgIGJlbnRzb24KKyAqIHNoaWZ0IGZyb20gQ1BVLWJvdW5kIHRvIG1lbWNvcHkgaW4gY3l6X3BvbGxpbmcgb3BlcmF0aW9uCisgKgorICogUmV2aXNpb24gMS4zNi40LjIwICAxOTk2LzA5LzA5IDE4OjMwOjMyICBCZW50c29uCisgKiBBZGRlZCBzdXBwb3J0IHRvIHNldCBhbmQgcmVwb3J0IGhpZ2hlciBzcGVlZHMuCisgKgorICogUmV2aXNpb24gMS4zNi40LjE5YyAgMTk5Ni8wOC8wOSAxMDowMDowMCAgTWFyY2lvIFNhaXRvCisgKiBTb21lIGZpeGVzIGluIHRoZSBIVyBmbG93IGNvbnRyb2wgZm9yIHRoZSBCRVRBIHJlbGVhc2UuCisgKiBEb24ndCB0cnkgdG8gcmVnaXN0ZXIgdGhlIElSUS4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMTkgIDE5OTYvMDgvMDggMTY6MjM6MTggIEJlbnRzb24KKyAqIG1ha2Ugc3VyZSAiY3ljIiBhcHBlYXJzIGluIGFsbCBrZXJuZWwgbWVzc2FnZXM7IGFsbCBzb2Z0IGludGVycnVwdHMKKyAqIGhhbmRsZWQgYnkgc2FtZSByb3V0aW5lOyByZWNvZ25pemUgb3V0LW9mLWJhbmQgcmVjZXB0aW9uOyBjb21tZW50CisgKiBvdXQgc29tZSBkaWFnbm9zdGljIG1lc3NhZ2VzOyBsZWF2ZSBSVFMvQ1RTIGZsb3cgY29udHJvbCB0byBoYXJkd2FyZTsKKyAqIGZpeCByYWNlIGNvbmRpdGlvbiBpbiAtWiBidWZmZXIgbWFuYWdlbWVudDsgb25seSAtWSBuZWVkcyB0byBleHBsaWN0bHkKKyAqIGZsdXNoIGNoYXJzOyB0aWR5IHVwIHNvbWUgc3RhcnR1cCBtZXNzYWdlczsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMTggIDE5OTYvMDcvMjUgMTg6NTc6MzEgIGJlbnRzb24KKyAqIHNoaWZ0IE1PRF9JTkNfVVNFX0NPVU5UIGxvY2F0aW9uIHRvIG1hdGNoCisgKiBzZXJpYWwuYzsgcHVyZ2Ugc29tZSBkaWFnbm9zdGljIG1lc3NhZ2VzOworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xNyAgMTk5Ni8wNy8yNSAxODowMTowOCAgYmVudHNvbgorICogZW5hYmxlIG1vZGVtIHN0YXR1cyBtZXNzYWdlcyBhbmQgZmV0Y2ggJiBwcm9jZXNzIHRoZW07IG5vdGUKKyAqIHRpbWUgb2YgbGFzdCBhY3Rpdml0eSB0eXBlIGZvciBlYWNoIHBvcnQ7IHNldF9saW5lX2NoYXIgbm93CisgKiBzdXBwb3J0cyBtb3JlIHRoYW4gbGluZSAwIGFuZCB0cmVhdHMgMCBiYXVkIGNvcnJlY3RseTsKKyAqIGdldF9tb2RlbV9pbmZvIHNlbnNlcyByc19zdGF0dXM7CisgKgorICogUmV2aXNpb24gMS4zNi40LjE2ICAxOTk2LzA3LzIwIDA4OjQzOjE1ICBiZW50c29uCisgKiBiYXJlbHkgd29ya3MtLW5vdydzIHRpbWUgdG8gdHVybiBvbgorICogbW9yZSBmZWF0dXJlcyAndGlsIGl0IGJyZWFrcworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xNSAgMTk5Ni8wNy8xOSAyMjozMDowNiAgYmVudHNvbgorICogY2hlY2sgbW9yZSAtWiBib2FyZCBzdGF0dXM7IHNob3J0ZW4gYm9vdCBtZXNzYWdlCisgKgorICogUmV2aXNpb24gMS4zNi40LjE0ICAxOTk2LzA3LzE5IDIyOjIwOjM3ICBiZW50c29uCisgKiBmaXggcmVmZXJlbmNlIHRvIGNoX2N0cmwgaW4gc3RhcnR1cDsgdmVyaWZ5IHJldHVybgorICogdmFsdWVzIGZyb20gY3l6X2lzc3VlX2NtZCBhbmQgY3l6X3VwZGF0ZV9jaGFubmVsOworICogbW9yZSBzdHVmZiB0byBnZXQgbW9kZW0gY29udHJvbCBjb3JyZWN0OworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xMyAgMTk5Ni8wNy8xMSAxOTo1MzozMyAgYmVudHNvbgorICogbW9yZSAtWiBzdHVmZiBmb2xkZWQgaW47IHJlLW9yZGVyIGNoYW5nZXMgdG8gcHV0IC1aIHN0dWZmCisgKiBhZnRlciAtWSBzdHVmZiAodG8gbWFrZSBjaGFuZ2VzIGNsZWFyZXIpCisgKgorICogUmV2aXNpb24gMS4zNi40LjEyICAxOTk2LzA3LzExIDE1OjQwOjU1ICBiZW50c29uCisgKiBBZGQgY29kZSB0byBwb2xsIEN5Y2xhZGVzLVouICBBZGQgY29kZSB0byBnZXQgJiBzZXQgUlMtMjMyIGNvbnRyb2wuCisgKiBBZGQgY29kZSB0byBzZW5kIGJyZWFrLiAgQ2xlYXIgZmlybXdhcmUgSUQgd29yZCBhdCBzdGFydHVwIChzbworICogdGhhdCBvdGhlciBjb2RlIHdvbid0IHRhbGsgdG8gaW5hY3RpdmUgYm9hcmQpLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xMSAgMTk5Ni8wNy8wOSAwNToyODoyOSAgYmVudHNvbgorICogYWRkIGNvZGUgZm9yIC1aIGluIHNldF9saW5lX2NoYXIKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMTAgIDE5OTYvMDcvMDggMTk6Mjg6MzcgIGJlbnRzb24KKyAqIGZvbGQgbW9yZSAtWiBzdHVmZiAob3IgaW4gc29tZSBjYXNlcywgZXJyb3IgbWVzc2FnZXMpCisgKiBpbnRvIGRyaXZlcjsgYWRkIHRleHQgdG8gImRvbid0IGtub3cgd2hhdCB0byBkbyIgbWVzc2FnZXMuCisgKgorICogUmV2aXNpb24gMS4zNi40LjkgIDE5OTYvMDcvMDggMTg6Mzg6MzggIGJlbnRzb24KKyAqIG1vdmVkIGNvbXBpbGUtdGltZSBmbGFncyBuZWFyIHRvcCBvZiBmaWxlOyBjb3NtZXRpYyBjaGFuZ2VzCisgKiB0byBuYXJyb3cgdGV4dCAodG8gYWxsb3cgMi11cCBwcmludGluZyk7IGNoYW5nZWQgbWFueSBkZWNsYXJhdGlvbnMKKyAqIHRvICJzdGF0aWMiIHRvIGxpbWl0IGV4dGVybmFsIHN5bWJvbHM7IHNodWZmbGVkIGNvZGUgb3JkZXIgdG8KKyAqIGNvYWxlc2NlIC1ZIGFuZCAtWiBzcGVjaWZpYyBjb2RlLCBhbHNvIHRvIHB1dCBpbnRlcm5hbCBmdW5jdGlvbnMKKyAqIGluIG9yZGVyIG9mIHR0eV9kcml2ZXIgc3RydWN0dXJlOyBhZGRlZCBjb2RlIHRvIHJlY29nbml6ZSAtWgorICogcG9ydHMgKGFuZCBmb3IgbW9tZW50LCBkbyBub3RoaW5nIG9yIHJlcG9ydCBlcnJvcik7IGFkZCBjeV9zdGFydHVwCisgKiB0byBwYXJzZSBib290IGNvbW1hbmQgbGluZSBmb3IgZXh0cmEgYmFzZSBhZGRyZXNzZXMgZm9yIElTQSBwcm9iZXM7CisgKgorICogUmV2aXNpb24gMS4zNi40LjggIDE5OTYvMDYvMjUgMTc6NDA6MTkgIGJlbnRzb24KKyAqIHJlb3JkZXIgc29tZSBjb2RlLCBmaXggdHlwZXMgb2Ygc29tZSB2YXJzIChpbnQgdnMuIGxvbmcpLAorICogYWRkIGN5X3NldHVwIHRvIHN1cHBvcnQgdXNlciBkZWNsYXJlZCBJU0EgYWRkcmVzc2VzCisgKgorICogUmV2aXNpb24gMS4zNi40LjcgIDE5OTYvMDYvMjEgMjM6MDY6MTggIGJlbnRzb24KKyAqIGR1bXAgaW9jdGwgYmFzZWQgZmlybXdhcmUgbG9hZCAoaXQncyBub3cgYSB1c2VyIGxldmVsCisgKiBwcm9ncmFtKTsgZW5zdXJlIHVuaW5pdGlhbHplZCBwb3J0cyBjYW5ub3QgYmUgdXNlZAorICoKKyAqIFJldmlzaW9uIDEuMzYuNC42ICAxOTk2LzA2LzIwIDIzOjE3OjE5ICBiZW50c29uCisgKiByZW5hbWUgdmFycyBhbmQgcmVzdHJ1Y3R1cmUgc29tZSBjb2RlCisgKgorICogUmV2aXNpb24gMS4zNi40LjUgIDE5OTYvMDYvMTQgMTU6MDk6NDQgIGJlbnRzb24KKyAqIGdldCByaWdodCBzdGF0dXMgYmFjayBhZnRlciBib290IGxvYWQKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuNCAgMTk5Ni8wNi8xMyAxOTo1MTo0NCAgYmVudHNvbgorICogc3VjY2Vzc2Z1bGx5IGxvYWRzIGZpcm13YXJlCisgKgorICogUmV2aXNpb24gMS4zNi40LjMgIDE5OTYvMDYvMTMgMDY6MDg6MzMgIGJlbnRzb24KKyAqIGFkZCBtb3JlIG9mIHRoZSBjb2RlIGZvciB0aGUgYm9vdC9sb2FkIGlvY3RscworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yICAxOTk2LzA2LzExIDIxOjAwOjUxICBiZW50c29uCisgKiBzdGFydCB0byBhZGQgWiBmdW5jdGlvbmFsaXR5LS1zdGFydGluZyB3aXRoIGlvY3RsCisgKiBmb3IgbG9hZGluZyBmaXJtd2FyZQorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xICAxOTk2LzA2LzEwIDE4OjAzOjAyICBiZW50c29uCisgKiBhZGRlZCBjb2RlIHRvIHJlY29nbml6ZSBaL1BDSSBjYXJkIGF0IGluaXRpYWxpemF0aW9uOyByZXBvcnQKKyAqIHByZXNlbmNlLCBidXQgY2FyZCBpcyBub3QgaW5pdGlhbGl6ZWQgKGJlY2F1c2UgZmlybXdhcmUgbmVlZHMKKyAqIHRvIGJlIGxvYWRlZCkKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMuOCAgMTk5Ni8wNi8wNyAxNjoyOTowMCAgYmVudHNvbgorICogc3RhcnRpbmcgbWlub3IgbnVtYmVyIGF0IHplcm87IGFkZGVkIG1pc3NpbmcgdmVyaWZ5X2FyZWEKKyAqIGFzIG5vdGVkIGJ5IEhlaWtvIEVpc3NmZWxkdCA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPgorICoKKyAqIFJldmlzaW9uIDEuMzYuMy43ICAxOTk2LzA0LzE5IDIxOjA2OjE4ICBiZW50c29uCisgKiByZW1vdmUgdW5uZWVkZWQgYm9vdCBtZXNzYWdlICYgZml4IENMT0NBTCBoYXJkd2FyZSBmbG93CisgKiBjb250cm9sIChNaXF1ZWwgdmFuIFNtb29yZW5idXJnIDxtaXF1ZWxzQFEuY2lzdHJvbi5ubD4pOworICogcmVtb3ZlIHVudXNlZCBkaWFnbm9zdGljIHN0YXRlbWVudHM7IG1pbm9yIDAgaXMgZmlyc3Q7CisgKgorICogUmV2aXNpb24gMS4zNi4zLjYgIDE5OTYvMDMvMTMgMTM6MjE6MTcgIG1hcmNpbworICogVGhlIGtlcm5lbCBmdW5jdGlvbiB2cmVtYXAgKGF2YWlsYWJsZSBvbmx5IGluIGxhdGVyIDEuMy54eCBrZXJuZWxzKQorICogYWxsb3dzIHRoZSBhY2Nlc3MgdG8gbWVtb3J5IGFkZHJlc3NlcyBhYm92ZSB0aGUgUkFNLiBUaGlzIHJldmlzaW9uCisgKiBvZiB0aGUgZHJpdmVyIHN1cHBvcnRzIFBDSSBib2FyZHMgYmVsb3cgMU1iIChkZXZpY2UgaWQgMHgxMDApIGFuZAorICogYWJvdmUgMU1iIChkZXZpY2UgaWQgMHgxMDEpLgorICoKKyAqIFJldmlzaW9uIDEuMzYuMy41ICAxOTk2LzAzLzA3IDE1OjIwOjE3ICBiZW50c29uCisgKiBTb21lIGdsb2JhbCBjaGFuZ2VzIHRvIGludGVycnVwdCBoYW5kbGluZyBzcGlsbGVkIGludG8KKyAqIHRoaXMgZHJpdmVyLS1tb3N0bHkgdW51c2VkIGFyZ3VtZW50cyBpbiBzeXN0ZW0gZnVuY3Rpb24KKyAqIGNhbGxzLiAgQWxzbyBhZGRlZCBjaGFuZ2UgYnkgTWFyY2lvIFNhaXRvIHdoaWNoIHNob3VsZAorICogcmVkdWNlIGxvc3QgaW50ZXJydXB0cyBhdCBzdGFydHVwIGJ5IGZhc3QgcHJvY2Vzc29ycy4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMuNCAgMTk5NS8xMS8xMyAgMjA6NDU6MTAgIGJlbnRzb24KKyAqIENoYW5nZXMgYnkgQ29yZXkgTWlueWFyZCA8bWlueWFyZEB3Zi1yY2guY2lyci5jb20+IGRpc3RyaWJ1dGVkCisgKiBpbiAxLjMuNDEga2VybmVsIHRvIHJlbW92ZSBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uLCBleHRlbmQKKyAqIHNvbWUgZXJyb3IgbWVzc2FnZXMsIGFuZCBsZXQgdGhlIGRyaXZlciBydW4gYXMgYSBsb2FkYWJsZSBtb2R1bGUKKyAqIENoYW5nZSBieSBBbGFuIFdlbmR0IDxhbGFuQGV6MC5lemxpbmsuY29tPiB0byByZW1vdmUgYQorICogcG9zc2libGUgcmFjZSBjb25kaXRpb24uCisgKiBDaGFuZ2UgYnkgTWFyY2lvIFNhaXRvIDxtYXJjaW9AY3ljbGFkZXMuY29tPiB0byBmaXggUENJIGFkZHJlc3NpbmcuCisgKgorICogUmV2aXNpb24gMS4zNi4zLjMgIDE5OTUvMTEvMTMgIDE5OjQ0OjQ4ICBiZW50c29uCisgKiBDaGFuZ2VzIGJ5IExpbnVzIFRvcnZhbGRzIGluIDEuMy4zMyBrZXJuZWwgZGlzdHJpYnV0aW9uCisgKiByZXF1aXJlZCBkdWUgdG8gcmVvcmRlcmluZyBvZiBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgKiBEcml2ZXJzIGFyZSBub3cgaW5pdGlhbGl6ZWQgKmFmdGVyKiBtZW1vcnkgbWFuYWdlbWVudC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMuMiAgMTk5NS8wOS8wOCAgMjI6MDc6MTQgIGJlbnRzb24KKyAqIHJlbW92ZSBwcmludGsgZnJvbSBJU1I7IGZpeCB0eXBvCisgKgorICogUmV2aXNpb24gMS4zNi4zLjEgIDE5OTUvMDkvMDEgIDEyOjAwOjQyICBtYXJjaW8KKyAqIE1pbm9yIGZpeGVzIGluIHRoZSBQQ0kgYm9hcmQgc3VwcG9ydC4gUENJIGZ1bmN0aW9uIGNhbGxzIGluCisgKiBjb25kaXRpb25hbCBjb21waWxhdGlvbiAoQ09ORklHX1BDSSkuIFRoYW5rcyB0byBKaW0gRHVuY2FuCisgKiA8ZHVuY2FuQG9rYXkuY29tPi4gImJhZCBzZXJpYWwgY291bnQiIG1lc3NhZ2UgcmVtb3ZlZC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMgIDE5OTUvMDgvMjIgIDA5OjE5OjQyICBtYXJjaW8KKyAqIEN5Y2xvbS1ZL1BDSSBzdXBwb3J0IGFkZGVkLiBDaGFuZ2VzIGluIHRoZSBjeV9pbml0IHJvdXRpbmUgYW5kCisgKiBib2FyZCBpbml0aWFsaXphdGlvbi4gQ2hhbmdlcyBpbiB0aGUgYm9vdCBtZXNzYWdlcy4gVGhlIGRyaXZlcgorICogc3VwcG9ydHMgdXAgdG8gNCBib2FyZHMgYW5kIDY0IHBvcnRzIGJ5IGRlZmF1bHQuCisgKgorICogUmV2aXNpb24gMS4zNi4xLjQgIDE5OTUvMDMvMjkgIDA2OjE0OjE0ICBiZW50c29uCisgKiBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBDeWNsb20tMTZZIGFuZCBDeWNsb20tMzJZZTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjEuMyAgMTk5NS8wMy8yMyAgMjI6MTU6MzUgIGJlbnRzb24KKyAqIGFkZCBtaXNzaW5nIGJyZWFrIGluIG1vZGVtIGNvbnRyb2wgYmxvY2sgaW4gaW9jdGwgc3dpdGNoIHN0YXRlbWVudAorICogKGRpc2NvdmVyZWQgYnkgTWljaGFlbCBFZHdhcmQgQ2hhc3RhaW4gPG1lY0Bqb2JlLnNoZWxsLnBvcnRhbC5jb20+KTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjEuMiAgMTk5NS8wMy8yMiAgMTk6MTY6MjIgIGJlbnRzb24KKyAqIG1ha2Ugc3VyZSBDVFMgZmxvdyBjb250cm9sIGlzIHNldCBhcyBzb29uIGFzIHBvc3NpYmxlICh0aGFua3MKKyAqIHRvIG5vdGUgZnJvbSBEYXZpZCBMYW1iZXJ0IDxsYW1iZXJ0QGNoZXNhcGVha2UucnBzLnNsYi5jb20+KTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjEuMSAgMTk5NS8wMy8xMyAgMTU6NDQ6NDMgIGJlbnRzb24KKyAqIGluaXRpYWxpemUgZGVmYXVsdHMgZm9yIHJlY2VpdmUgdGhyZXNob2xkIGFuZCBzdGFsZSBkYXRhIHRpbWVvdXQ7CisgKiBjb3NtZXRpYyBjaGFuZ2VzOworICoKKyAqIFJldmlzaW9uIDEuMzYgIDE5OTUvMDMvMTAgIDIzOjMzOjUzICBiZW50c29uCisgKiBhZGRlZCBzdXBwb3J0IG9mIGNoaXBzIDQtNyBpbiAzMiBwb3J0IEN5Y2xvbS1ZZTsKKyAqIGZpeCBjeV9pbnRlcnJ1cHQgcG9pbnRlciBkZXJlZmVyZW5jZSBwcm9ibGVtCisgKiAoSm9lIFBvcnRtYW4gPGJhcm9uQGFhLm5ldD4pOworICogZ2l2ZSBiZXR0ZXIgZXJyb3IgcmVzcG9uc2UgaWYgb3BlbiBpcyBhdHRlbXB0ZWQgb24gbm9uLWV4aXN0ZW50IHBvcnQKKyAqIChaYWNoYXJpYWggVmF1bSA8amNocnlzbHJAbmV0Y29tLmNvbT4pOworICogY29ycmVjdCBjb21tYW5kIHRpbWVvdXQgKEtlbm5ldGggTGVybWFuIDxsZXJtYW5AQHNlbHRkLm5ld25ldC5jb20+KTsKKyAqIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciAtMTZZIG9uIHN5c3RlbXMgd2l0aCBmYXN0LCBub2lzeSBidXM7CisgKiBjb21tZW50IG91dCBkaWFnbm9zdGljIHByaW50IGZ1bmN0aW9uOworICogY2xlYW5lZCB1cCB0YWJsZSBvZiBiYXNlIGFkZHJlc3NlczsKKyAqIHNldCByZWNlaXZlciB0aW1lLW91dCBwZXJpb2QgcmVnaXN0ZXIgdG8gY29ycmVjdCB2YWx1ZSwKKyAqIHNldCByZWNlaXZlIHRocmVzaG9sZCB0byBiZXR0ZXIgZGVmYXVsdCB2YWx1ZXMsCisgKiBzZXQgY2hpcCB0aW1lciB0byBtb3JlIGFjY3VyYXRlIDIwMCBIeiB0aWNraW5nLAorICogYWRkIGNvZGUgdG8gbW9uaXRvciBhbmQgbW9kaWZ5IHJlY2VpdmUgcGFyYW1ldGVycworICogKFJpayBGYWl0aCA8ZmFpdGhAY3MudW5jLmVkdT4gTmljayBTaW1pY2ljaAorICogPG5qc0BzY2lmaS5lbWkubmV0Pik7CisgKgorICogUmV2aXNpb24gMS4zNSAgMTk5NC8xMi8xNiAgMTM6NTQ6MTggIHN0ZWZmZW4KKyAqIGFkZGl0aW9uYWwgcGF0Y2ggYnkgTWFyY2lvIFNhaXRvIGZvciBib2FyZCBkZXRlY3Rpb24KKyAqIEFjY2lkZW50bHkgbGVmdCBvdXQgaW4gMS4zNAorICoKKyAqIFJldmlzaW9uIDEuMzQgIDE5OTQvMTIvMTAgIDEyOjM3OjEyICBzdGVmZmVuCisgKiBUaGlzIGlzIHRoZSBjb3JyZWN0ZWQgdmVyc2lvbiBhcyBzdWdnZXN0ZWQgYnkgTWFyY2lvIFNhaXRvCisgKgorICogUmV2aXNpb24gMS4zMyAgMTk5NC8xMi8wMSAgMjI6NDE6MTggIGJlbnRzb24KKyAqIGFkZCBob29rcyB0byBzdXBwb3J0IG1vcmUgaGlnaCBzcGVlZHMgZGlyZWN0bHk7IGFkZCB0eXRzbworICogcGF0Y2ggcmVnYXJkaW5nIENMT0NBTCB3YWtldXBzCisgKgorICogUmV2aXNpb24gMS4zMiAgMTk5NC8xMS8yMyAgMTk6NTA6MDQgIGJlbnRzb24KKyAqIGFsbG93IGRpcmVjdCBrZXJuZWwgY29udHJvbCBvZiBoaWdoZXIgc2lnbmFsbGluZyByYXRlczsKKyAqIGxvb2sgZm9yIGNhcmRzIGF0IGFkZGl0aW9uYWwgbG9jYXRpb25zCisgKgorICogUmV2aXNpb24gMS4zMSAgMTk5NC8xMS8xNiAgMDQ6MzM6MjggIGJlbnRzb24KKyAqIEFOT1RIRVIgZml4IGZyb20gQ29yZXkgTWlueWFyZCwgbWlueWFyZEB3Zi1yY2guY2lyci5jb20tLQorICogYSBwcm9ibGVtIGluIGNoYXJzX2luX2J1ZmZlciBoYXMgYmVlbiByZXNvbHZlZCBieSBzb21lCisgKiBzbWFsbCBjaGFuZ2VzOyAgdGhpcyBzaG91bGQgeWllbGQgc21vb3RoZXIgb3V0cHV0CisgKgorICogUmV2aXNpb24gMS4zMCAgMTk5NC8xMS8xNiAgMDQ6Mjg6MDUgIGJlbnRzb24KKyAqIEZpeCBmcm9tIENvcmV5IE1pbnlhcmQsIEludGVybmV0OiBtaW55YXJkQG1ldHJvbmV0LmNvbSwKKyAqIFVVQ1A6IG1pbnlhcmRAd2YtcmNoLmNpcnIuY29tLCBXT1JLOiBtaW55YXJkYm5yLmNhLCB0bworICogY3lfaGFuZ3VwIHRoYXQgYXBwZWFycyB0byBjbGVhciB1cCBtdWNoIChhbGw/KSBvZiB0aGUKKyAqIERUUiBnbGl0Y2hlczsgYWxzbyBoZSdzIGFkZGVkL2NsZWFuZWQtdXAgZGlhZ25vc3RpYyBtZXNzYWdlcworICoKKyAqIFJldmlzaW9uIDEuMjkgIDE5OTQvMTEvMTYgIDA0OjE2OjA3ICBiZW50c29uCisgKiBhZGQgY2hhbmdlIHByb3Bvc2VkIGJ5IFJhbHBoIFNpbXMsIHJhbHBoc0BoYWxjeW9uLmNvbSwgdG8KKyAqIG9wZXJhdGUgaGlnaGVyIHNwZWVkcyBpbiBzYW1lIHdheSBhcyBvdGhlciBzZXJpYWwgcG9ydHM7CisgKiBhZGQgbW9yZSBzZXJpYWwgcG9ydHMgKGZvciB1cCB0byB0d28gMTYtcG9ydCBtdXhlcykuCisgKgorICogUmV2aXNpb24gMS4yOCAgMTk5NC8xMS8wNCAgMDA6MTM6MTYgIHJvb3QKKyAqIHR1cm4gb2ZmIGRpYWdub3N0aWMgbWVzc2FnZXMKKyAqCisgKiBSZXZpc2lvbiAxLjI3ICAxOTk0LzExLzAzICAyMzo0NjozNyAgcm9vdAorICogYnVuY2ggb2YgY2hhbmdlcyB0byBicmluZyBkcml2ZXIgaW50byBncmVhdGVyIGNvbmZvcm1hbmNlCisgKiB3aXRoIHRoZSBzZXJpYWwuYyBkcml2ZXIgKGxvb2tpbmcgZm9yIG1pc3NlZCBmaXhlcykKKyAqCisgKiBSZXZpc2lvbiAxLjI2ICAxOTk0LzExLzAzICAyMjo0MDozNiAgcm9vdAorICogYXV0b21hdGljIGludGVycnVwdCBwcm9iaW5nIGZpeGVkLgorICoKKyAqIFJldmlzaW9uIDEuMjUgIDE5OTQvMTEvMDMgIDIwOjE3OjAyICByb290CisgKiBzdGFydCB0byBpbXBsZW1lbnQgYXV0by1pcnEKKyAqCisgKiBSZXZpc2lvbiAxLjI0ICAxOTk0LzExLzAzICAxODowMTo1NSAgcm9vdAorICogc3RpbGwgd29ya2luZyBvbiBtb2RlbSBzaWduYWxzLS10cnlpbmcgbm90IHRvIGRyb3AgRFRSCisgKiBkdXJpbmcgdGhlIGdldHR5L2xvZ2luIHByb2Nlc3NlcworICoKKyAqIFJldmlzaW9uIDEuMjMgIDE5OTQvMTEvMDMgIDE3OjUxOjM2ICByb290CisgKiBleHRlbmQgYmF1ZCByYXRlIHN1cHBvcnQ7IHNldCByZWNlaXZlIHRocmVzaG9sZCBhcyBmdW5jdGlvbgorICogb2YgYmF1ZCByYXRlOyBmaXggc29tZSBwcm9ibGVtcyB3aXRoIFJUUy9DVFM7CisgKgorICogUmV2aXNpb24gMS4yMiAgMTk5NC8xMS8wMiAgMTg6MDU6MzUgIHJvb3QKKyAqIGNoYW5nZWQgYXJndW1lbnRzIHRvIHVkZWxheSB0byB0eXBlIGxvbmcgdG8gZ2V0CisgKiBkZWxheXMgdG8gYmUgb2YgY29ycmVjdCBkdXJhdGlvbgorICoKKyAqIFJldmlzaW9uIDEuMjEgIDE5OTQvMTEvMDIgIDE3OjM3OjMwICByb290CisgKiBlbXBsb3kgdWRlbGF5IChhZnRlciBjYWxpYnJhdGluZyBsb29wc19wZXJfc2Vjb25kIGVhcmxpZXIKKyAqIGluIGluaXQvbWFpbi5jKSBpbnN0ZWFkIG9mIHVzaW5nIGhvbWUtZ3Jvd24gZGVsYXkgcm91dGluZXMKKyAqCisgKiBSZXZpc2lvbiAxLjIwICAxOTk0LzExLzAyICAwMzoxMTozOCAgcm9vdAorICogY3lfY2hhcnNfaW5fYnVmZmVyIGZvcmNlcyBhIHJldHVybiB2YWx1ZSBvZiAwIHRvIGxldAorICogbG9naW4gd29yayAoZG9uJ3Qga25vdyB3aHkgaXQgZG9lcyk7IHNvbWUgZnVuY3Rpb25zCisgKiB0aGF0IHdlcmUgcmV0dXJuaW5nIEVGQVVMVCwgbm93IGV4ZWN1dGVzIHRoZSBjb2RlOworICogbW9yZSB3b3JrIG9uIGRlY2lkaW5nIHdoZW4gdG8gZGlzYWJsZSB4bWl0IGludGVycnVwdHM7CisgKgorICogUmV2aXNpb24gMS4xOSAgMTk5NC8xMS8wMSAgMjA6MTA6MTQgIHJvb3QKKyAqIGRlZmluZSByb3V0aW5lIHRvIHN0YXJ0IHRyYW5zbWlzc2lvbiBpbnRlcnJ1cHRzIChieSBlbmFibGluZworICogdHJhbnNtaXQgaW50ZXJydXB0cyk7IGRpcmVjdGx5IGVuYWJsZS9kaXNhYmxlIG1vZGVtIGludGVycnVwdHM7CisgKgorICogUmV2aXNpb24gMS4xOCAgMTk5NC8xMS8wMSAgMTg6NDA6NDUgIGJlbnRzb24KKyAqIERvbid0IGFsd2F5cyBlbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cyBpbiBzdGFydHVwOyBpbnRlcnJ1cHQgb24KKyAqIFR4TXB0eSBpbnN0ZWFkIG9mIFR4UmR5IHRvIGhlbHAgY2hhcmFjdGVycyBnZXQgb3V0IGJlZm9yZSBzaHV0ZG93bjsKKyAqIHJlc3RydWN0dXJlIHhtaXQgaW50ZXJydXB0IHRvIGNoZWNrIGZvciBjaGFycyBmaXJzdCBhbmQgcXVpdCBpZgorICogbm9uZSBhcmUgcmVhZHkgdG8gZ287IG1vZGVtIHN0YXR1cyAoTVhWUngpIGlzIHVwcmlnaHQsIF9ub3RfIGludmVydGVkCisgKiAodG8gbXkgdmlldyk7CisgKgorICogUmV2aXNpb24gMS4xNyAgMTk5NC8xMC8zMCAgMDQ6Mzk6NDUgIGJlbnRzb24KKyAqIHJlbmFtZSBzZXJpYWxfZHJpdmVyIGFuZCBjYWxsb3V0X2RyaXZlciB0byBjeV9zZXJpYWxfZHJpdmVyIGFuZAorICogY3lfY2FsbG91dF9kcml2ZXIgdG8gYXZvaWQgbGlua2FnZSBpbnRlcmZlcmVuY2U7IGluaXRpYWxpemUKKyAqIGluZm8tPnR5cGUgdG8gUE9SVF9DSVJSVVM7IHJ1Z2dlZGl6ZSBwYXJhbm9pYSB0ZXN0OyBlbGlkZSAtPnBvcnQKKyAqIGZyb20gY3ljbGFkZXNfcG9ydCBzdHJ1Y3R1cmU7IGFkZCBwYXJhbm9pYSBjaGVjayB0byBjeV9jbG9zZTsKKyAqCisgKiBSZXZpc2lvbiAxLjE2ICAxOTk0LzEwLzMwICAwMToxNDozMyAgYmVudHNvbgorICogY2hhbmdlIG1ham9yIG51bWJlcnM7IGFkZCBzb21lIF9lYXJseV8gcmV0dXJuIHN0YXRlbWVudHM7CisgKgorICogUmV2aXNpb24gMS4xNSAgMTk5NC8xMC8yOSAgMDY6NDM6MTUgIGJlbnRzb24KKyAqIGZpbmFsIHRpZHlpbmcgdXAgZm9yIGNsZWFuIGNvbXBpbGU7ICBlbmFibGUgc29tZSBlcnJvciByZXBvcnRpbmcKKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk0LzEwLzI4ICAyMDozMDoyMiAgQmVudHNvbgorICogbG90cyBvZiBjaGFuZ2VzIHRvIGRyYWcgdGhlIGRyaXZlciB0b3dhcmRzIHRoZSBuZXcgdHR5X2lvCisgKiBzdHJ1Y3R1cmVzIGFuZCBvcGVyYXRpb24uICBub3QgZXhwZWN0ZWQgdG8gd29yaywgYnV0IG1heQorICogY29tcGlsZSBjbGVhbmx5LgorICoKKyAqIFJldmlzaW9uIDEuMTMgIDE5OTQvMDcvMjEgIDIzOjA4OjU3ICBCZW50c29uCisgKiBhZGQgc29tZSBkaWFnbm9zdGljIGNydWZ0OyBzdXBwb3J0IDI0IGxpbmVzIChmb3IgdGVzdGluZworICogYm90aCAtOFkgYW5kIC0xNlkgY2FyZHM7IGJlIG1vcmUgdGhvcm91Z2ggaW4gc2VydmljaW5nIGFsbAorICogY2hpcHMgZHVyaW5nIGludGVycnVwdDsgYWRkICJ2b2xhdGlsZSIgYSBmZXcgcGxhY2VzIHRvCisgKiBjaXJjdW12ZW50IGNvbXBpbGVyIG9wdGltaXphdGlvbnM7IGZpeCBiYXNlICYgb2Zmc2V0CisgKiBjb21wdXRhdGlvbnMgaW4gYmxvY2tfdGlsX3JlYWR5ICh3YXMgY2F1c2luZyBjaGlwIDAgdG8KKyAqIHN0b3Agb3BlcmF0aW9uKQorICoKKyAqIFJldmlzaW9uIDEuMTIgIDE5OTQvMDcvMTkgIDE2OjQyOjExICBCZW50c29uCisgKiBhZGQgc29tZSBoYWNrZXJ5IGZvciBrZXJuZWwgdmVyc2lvbiAxLjEuODsgZXhwYW5kCisgKiBlcnJvciBtZXNzYWdlczsgcmVmaW5lIHRpbWluZyBmb3IgZGVsYXkgbG9vcHMgYW5kCisgKiBkZWNsYXJlIGxvb3AgcGFyYW1zIHZvbGF0aWxlCisgKgorICogUmV2aXNpb24gMS4xMSAgMTk5NC8wNi8xMSAgMjE6NTM6MTAgIGJlbnRzb24KKyAqIGdldCB1c2Ugb2Ygc2F2ZV9jYXIgcmlnaHQgaW4gdHJhbnNtaXQgaW50ZXJydXB0IHNlcnZpY2UKKyAqCisgKiBSZXZpc2lvbiAxLjEwLjEuMSAgMTk5NC8wNi8xMSAgMjE6MzE6MTggIGJlbnRzb24KKyAqIGFkZCBzb21lIGRpYWdub3N0aWMgcHJpbnRpbmc7IHRyeSB0byBmaXggc2F2ZV9jYXIgc3R1ZmYKKyAqCisgKiBSZXZpc2lvbiAxLjEwICAxOTk0LzA2LzExICAyMDozNjowOCAgYmVudHNvbgorICogY2xlYW4gdXAgY29tcGlsZXIgd2FybmluZ3MKKyAqCisgKiBSZXZpc2lvbiAxLjkgIDE5OTQvMDYvMTEgIDE5OjQyOjQ2ICBiZW50c29uCisgKiBhZGRlZCBhIGJ1bmNoIG9mIGNvZGUgdG8gc3VwcG9ydCBtb2RlbSBzaWduYWxsaW5nCisgKgorICogUmV2aXNpb24gMS44ICAxOTk0LzA2LzExICAxNzo1NzowNyAgYmVudHNvbgorICogcmVjb2duaXplIGJyZWFrICYgcGFyaXR5IGVycm9yCisgKgorICogUmV2aXNpb24gMS43ICAxOTk0LzA2LzA1ICAwNTo1MTozNCAgYmVudHNvbgorICogUmVvcmRlciBiYXVkIHRhYmxlIHRvIGJlIG1vbm90b25pYzsgYWRkIGNsaSB0byBDUDsgZGlzY2FyZAorICogaW5jb21pbmcgY2hhcmFjdGVycyBhbmQgc3RhdHVzIGlmIHRoZSBsaW5lIGlzbid0IG9wZW47IHN0YXJ0IHRvCisgKiBmb2xkIGNvZGUgaW50byBjeV90aHJvdHRsZTsgc3RhcnQgdG8gcG9ydCBnZXRfc2VyaWFsX2luZm8sCisgKiBzZXRfc2VyaWFsX2luZm8sIGdldF9tb2RlbV9pbmZvLCBzZXRfbW9kZW1faW5mbywgYW5kIHNlbmRfYnJlYWsKKyAqIGZyb20gc2VyaWFsLmM7IGV4cGFuZCBjeV9pb2N0bDsgcmVsb2NhdGUgYW5kIGV4cGFuZCBjb25maWdfc2V0dXA7CisgKiBnZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMgZnJvbSB0dHkgc3RydWN0OyBpbnZhbGlkYXRlIHBvcnRzIHcvbworICogaGFyZHdhcmU7CisgKgorICogUmV2aXNpb24gMS42ICAxOTk0LzA1LzMxICAxODo0MjoyMSAgYmVudHNvbgorICogYWRkIGEgbG9vcC1icmVha2VyIGluIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lOworICogbm90ZSB3aGVuIHBvcnQgaXMgaW5pdGlhbGl6ZWQgc28gdGhhdCBpdCBjYW4gYmUgc2h1dAorICogZG93biB1bmRlciB0aGUgcmlnaHQgY29uZGl0aW9uczsgcmVjZWl2ZSB3b3JrcyB3aXRob3V0CisgKiBhbnkgb2J2aW91cyBlcnJvcnMKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTQvMDUvMzAgIDAwOjU1OjAyICBiZW50c29uCisgKiB0cmFuc21pdCB3b3JrcyB3aXRob3V0IG9idmlvdXMgZXJyb3JzCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzA1LzI3ICAxODo0NjoyNyAgYmVudHNvbgorICogaW5jb3Jwb3JhdGVkIG1vcmUgY29kZSBmcm9tIGxpYl95LmM7IGNhbiBub3cgcHJpbnQgc2hvcnQKKyAqIHN0cmluZ3MgdW5kZXIgaW50ZXJydXB0IGNvbnRyb2wgdG8gcG9ydCB6ZXJvOyBzZWVtcyB0bworICogc2VsZWN0IHBvcnRzL2NoYW5uZWxzL2xpbmVzIGNvcnJlY3RseQorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8wNS8yNSAgMjI6MTI6NDQgIGJlbnRzb24KKyAqIHNoaWZ0aW5nIGZyb20gbXVsdGktcG9ydCBvbiBhIGNhcmQgdG8gcHJvcGVyIG11bHRpcGxleG9yCisgKiBkYXRhIHN0cnVjdHVyZXM7ICBhZGRlZCBza2VsZXRvbnMgb2YgbW9zdCByb3V0aW5lcworICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NC8wNS8xOSAgMTM6MjE6NDMgIGJlbnRzb24KKyAqIHN0YXJ0IHRvIGNyaWIgZnJvbSBvdGhlciBzb3VyY2VzCisgKgorICovCisKKy8qIElmIHlvdSBuZWVkIHRvIGluc3RhbGwgbW9yZSBib2FyZHMgdGhhbiBOUl9DQVJEUywgY2hhbmdlIHRoZSBjb25zdGFudAorICAgaW4gdGhlIGRlZmluaXRpb24gYmVsb3cuIE5vIG90aGVyIGNoYW5nZSBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCB1cCB0bworICAgZWlnaHQgYm9hcmRzLiBCZXlvbmQgdGhhdCB5b3UnbGwgaGF2ZSB0byBleHRlbmQgY3lfaXNhX2FkZHJlc3Nlcy4gKi8KKworI2RlZmluZSBOUl9DQVJEUyAgICAgICAgNAorCisvKgorICAgSWYgdGhlIHRvdGFsIG51bWJlciBvZiBwb3J0cyBpcyBsYXJnZXIgdGhhbiBOUl9QT1JUUywgY2hhbmdlIHRoaXMKKyAgIGNvbnN0YW50IGluIHRoZSBkZWZpbml0aW9uIGJlbG93LiBObyBvdGhlciBjaGFuZ2UgaXMgbmVjZXNzYXJ5IHRvCisgICBzdXBwb3J0IG1vcmUgYm9hcmRzL3BvcnRzLiAqLworCisjZGVmaW5lIE5SX1BPUlRTICAgICAgICAyNTYKKworI2RlZmluZSBaRV9WMV9OUE9SVFMJNjQKKyNkZWZpbmUgWk9fVjEJMAorI2RlZmluZSBaT19WMgkxCisjZGVmaW5lIFpFX1YxCTIKKworI2RlZmluZQlTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyN1bmRlZglDWV9ERUJVR19PUEVOCisjdW5kZWYJQ1lfREVCVUdfVEhST1RUTEUKKyN1bmRlZglDWV9ERUJVR19PVEhFUgorI3VuZGVmCUNZX0RFQlVHX0lPCisjdW5kZWYJQ1lfREVCVUdfQ09VTlQKKyN1bmRlZglDWV9ERUJVR19EVFIKKyN1bmRlZglDWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKKyN1bmRlZglDWV9ERUJVR19JTlRFUlJVUFRTCisjdW5kZWYJQ1lfMTZZX0hBQ0sKKyN1bmRlZglDWV9FTkFCTEVfTU9OSVRPUklORworI3VuZGVmCUNZX1BDSV9ERUJVRworCisjaWYgMAorI2RlZmluZSBQQVVTRSBfX2FzbV9fKCJub3AiKTsKKyNlbHNlCisjZGVmaW5lIFBBVVNFIDsKKyNlbmRpZgorCisvKgorICogSW5jbHVkZSBzZWN0aW9uIAorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N5Y2xhZGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lCUNZX0xPQ0soaW5mbyxmbGFncykJCQkJCVwKKwkJZG8gewkJCQkJCVwKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN5X2NhcmRbaW5mby0+Y2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7IFwKKwkJfSB3aGlsZSAoMCkKKwkJCisjZGVmaW5lCUNZX1VOTE9DSyhpbmZvLGZsYWdzKQkJCQkJXAorCQlkbyB7CQkJCQkJXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjeV9jYXJkW2luZm8tPmNhcmRdLmNhcmRfbG9jaywgZmxhZ3MpOyBcCisJCX0gd2hpbGUgKDApCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworc3RhdGljIHZvaWQgY3lfdGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgY3lfc2VuZF94Y2hhciAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CisKKyNkZWZpbmUgSVNfQ1lDX1ooY2FyZCkgKChjYXJkKS5udW1fY2hpcHMgPT0gLTEpCisKKyNkZWZpbmUgWl9GUEdBX0NIRUNLKGNhcmQpIFwKKyAgICAoKGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSBcCisJCSAoKGNhcmQpLmN0bF9hZGRyKSktPmluaXRfY3RybCkgJiAoMTw8MTcpKSAhPSAwKQorCisjZGVmaW5lIElTWkxPQURFRChjYXJkKQkoKChaT19WMT09Y3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopIFwKKwkJCSgoY2FyZCkuY3RsX2FkZHIpKS0+bWFpbF9ib3hfMCkpIHx8IFwKKwkJCVpfRlBHQV9DSEVDSyhjYXJkKSkgJiYgXAorCQkJKFpGSVJNX0lEPT1jeV9yZWFkbCgmKChzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICopIFwKKwkJCSgoY2FyZCkuYmFzZV9hZGRyK0lEX0FERFJFU1MpKS0+c2lnbmF0dXJlKSkpCisKKyNpZm5kZWYgU0VSSUFMX1hNSVRfU0laRQorI2RlZmluZQlTRVJJQUxfWE1JVF9TSVpFCShtaW4oUEFHRV9TSVpFLCA0MDk2KSkKKyNlbmRpZgorI2RlZmluZSBXQUtFVVBfQ0hBUlMJCTI1NgorCisjZGVmaW5lIFNURF9DT01fRkxBR1MgKDApCisKKyNkZWZpbmUJSklGRklFU19ESUZGKG4sIGopCSgoaikgLSAobikpCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqY3lfc2VyaWFsX2RyaXZlcjsKKworI2lmZGVmIENPTkZJR19JU0EKKy8qIFRoaXMgaXMgdGhlIGFkZHJlc3MgbG9va3VwIHRhYmxlLiBUaGUgZHJpdmVyIHdpbGwgcHJvYmUgZm9yCisgICBDeWNsb20tWS9JU0EgYm9hcmRzIGF0IGFsbCBhZGRyZXNzZXMgaW4gaGVyZS4gSWYgeW91IHdhbnQgdGhlCisgICBkcml2ZXIgdG8gcHJvYmUgYWRkcmVzc2VzIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIGFkZCBpdCB0bworICAgdGhpcyB0YWJsZS4gIElmIHRoZSBkcml2ZXIgaXMgcHJvYmluZyBzb21lIG90aGVyIGJvYXJkIGFuZAorICAgY2F1c2luZyBwcm9ibGVtcywgcmVtb3ZlIHRoZSBvZmZlbmRpbmcgYWRkcmVzcyBmcm9tIHRoaXMgdGFibGUuCisgICBUaGUgY3lfc2V0dXAgZnVuY3Rpb24gZXh0cmFjdHMgYWRkaXRpb25hbCBhZGRyZXNzZXMgZnJvbSB0aGUKKyAgIGJvb3Qgb3B0aW9ucyBsaW5lLiAgVGhlIGZvcm0gaXMgImN5Y2xhZGVzPWFkZHJlc3MsYWRkcmVzcy4uLiIKKyovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3lfaXNhX2FkZHJlc3Nlc1tdID0geworICAgICAgICAweEQwMDAwLAorICAgICAgICAweEQyMDAwLAorICAgICAgICAweEQ0MDAwLAorICAgICAgICAweEQ2MDAwLAorICAgICAgICAweEQ4MDAwLAorICAgICAgICAweERBMDAwLAorICAgICAgICAweERDMDAwLAorICAgICAgICAweERFMDAwLAorICAgICAgICAwLDAsMCwwLDAsMCwwLDAKK307CisjZGVmaW5lIE5SX0lTQV9BRERSUyAoc2l6ZW9mKGN5X2lzYV9hZGRyZXNzZXMpL3NpemVvZih1bnNpZ25lZCBjaGFyKikpCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBsb25nIG1hZGRyW05SX0NBUkRTXSA9IHsgMCwgfTsKK3N0YXRpYyBpbnQgaXJxW05SX0NBUkRTXSAgPSB7IDAsIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShtYWRkciwgbG9uZywgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKy8qIFRoaXMgaXMgdGhlIHBlci1jYXJkIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWRkcmVzcywgaXJxLCBudW1iZXIgb2YKKyAgIGNoYW5uZWxzLCBldGMuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgbWF4aW11bSBvZiBOUl9DQVJEUyBjYXJkcy4KKyovCitzdGF0aWMgc3RydWN0IGN5Y2xhZGVzX2NhcmQgY3lfY2FyZFtOUl9DQVJEU107CisKKy8qIFRoaXMgaXMgdGhlIHBlci1jaGFubmVsIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMsIGZsYWdzCisgYW5kIHZhcmlhYmxlcyBmb3IgdGhlIHBvcnQuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgbWF4aW11bSBvZiBOUl9QT1JUUy4KKyovCitzdGF0aWMgc3RydWN0IGN5Y2xhZGVzX3BvcnQgY3lfcG9ydFtOUl9QT1JUU107CisKK3N0YXRpYyBpbnQgY3lfbmV4dF9jaGFubmVsOyAvKiBuZXh0IG1pbm9yIGF2YWlsYWJsZSAqLworCisvKgorICogdG1wX2J1ZiBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBieSBzZXJpYWxfd3JpdGUuICBXZSBuZWVkIHRvCisgKiBsb2NrIGl0IGluIGNhc2UgdGhlIGNvcHlfZnJvbV91c2VyIGJsb2NrcyB3aGlsZSBzd2FwcGluZyBpbiBhIHBhZ2UsCisgKiBhbmQgc29tZSBvdGhlciBwcm9ncmFtIHRyaWVzIHRvIGRvIGEgc2VyaWFsIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuCisgKiBTaW5jZSB0aGUgbG9jayB3aWxsIG9ubHkgY29tZSB1bmRlciBjb250ZW50aW9uIHdoZW4gdGhlIHN5c3RlbSBpcworICogc3dhcHBpbmcgYW5kIGF2YWlsYWJsZSBtZW1vcnkgaXMgbG93LCBpdCBtYWtlcyBzZW5zZSB0byBzaGFyZSBvbmUKKyAqIGJ1ZmZlciBhY3Jvc3MgYWxsIHRoZSBzZXJpYWwgcG9ydHMsIHNpbmNlIGl0IHNpZ25pZmljYW50bHkgc2F2ZXMKKyAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4gIFRoaXMgYnVmZmVyIGlzCisgKiBhbGxvY2F0ZWQgd2hlbiB0aGUgZmlyc3QgY3lfb3BlbiBvY2N1cnMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGxvb2sgdXAgdGhlIGRpdmlzb3Igc3BlZWRzIGFuZCB0aGUgdGltZW91dHMKKyAqIFdlJ3JlIG5vcm1hbGx5IGxpbWl0ZWQgdG8gMTUgZGlzdGluY3QgYmF1ZCByYXRlcy4gIFRoZSBleHRyYQorICogYXJlIGFjY2Vzc2VkIHZpYSBzZXR0aW5ncyBpbiBpbmZvLT5mbGFncy4KKyAqICAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAqICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISSAgICAgICAgICAgIFZISQorICogICAgIDIwCisgKi8KK3N0YXRpYyBpbnQgYmF1ZF90YWJsZVtdID0geworICAgICAgIDAsICAgIDUwLCAgICA3NSwgICAxMTAsICAgMTM0LCAgIDE1MCwgICAyMDAsICAgMzAwLCAgIDYwMCwgIDEyMDAsCisgICAgMTgwMCwgIDI0MDAsICA0ODAwLCAgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgNzY4MDAsMTE1MjAwLDE1MDAwMCwKKyAgMjMwNDAwLCAgICAgMH07CisKK3N0YXRpYyBjaGFyIGJhdWRfY29fMjVbXSA9IHsgIC8qIDI1IE1IeiBjbG9jayBvcHRpb24gdGFibGUgKi8KKyAgICAvKiB2YWx1ZSA9PiAgICAwMCAgICAwMSAgIDAyICAgIDAzICAgIDA0ICovCisgICAgLyogZGl2aWRlIGJ5ICAgIDggICAgMzIgICAxMjggICA1MTIgIDIwNDggKi8KKyAgICAweDAwLCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDAzLCAgMHgwMywgIDB4MDMsICAweDAyLAorICAgIDB4MDIsICAweDAyLCAgMHgwMSwgIDB4MDEsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDB9OworCitzdGF0aWMgY2hhciBiYXVkX2Jwcl8yNVtdID0geyAgLyogMjUgTUh6IGJhdWQgcmF0ZSBwZXJpb2QgdGFibGUgKi8KKyAgICAweDAwLCAgMHhmNSwgIDB4YTMsICAweDZmLCAgMHg1YywgIDB4NTEsICAweGY1LCAgMHhhMywgIDB4NTEsICAweGEzLAorICAgIDB4NmQsICAweDUxLCAgMHhhMywgIDB4NTEsICAweGEzLCAgMHg1MSwgIDB4MzYsICAweDI5LCAgMHgxYiwgIDB4MTV9OworCitzdGF0aWMgY2hhciBiYXVkX2NvXzYwW10gPSB7ICAvKiA2MCBNSHogY2xvY2sgb3B0aW9uIHRhYmxlIChDRDE0MDAgSikgKi8KKyAgICAvKiB2YWx1ZSA9PiAgICAwMCAgICAwMSAgIDAyICAgIDAzICAgIDA0ICovCisgICAgLyogZGl2aWRlIGJ5ICAgIDggICAgMzIgICAxMjggICA1MTIgIDIwNDggKi8KKyAgICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDMsICAweDAzLAorICAgIDB4MDMsICAweDAyLCAgMHgwMiwgIDB4MDEsICAweDAxLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgICAgMHgwMH07CisKK3N0YXRpYyBjaGFyIGJhdWRfYnByXzYwW10gPSB7ICAvKiA2MCBNSHogYmF1ZCByYXRlIHBlcmlvZCB0YWJsZSAoQ0QxNDAwIEopICovCisgICAgMHgwMCwgIDB4ODIsICAweDIxLCAgMHhmZiwgIDB4ZGIsICAweGMzLCAgMHg5MiwgIDB4NjIsICAweGMzLCAgMHg2MiwKKyAgICAweDQxLCAgMHhjMywgIDB4NjIsICAweGMzLCAgMHg2MiwgIDB4YzMsICAweDgyLCAgMHg2MiwgIDB4NDEsICAweDMyLAorICAgIDB4MjF9OworCitzdGF0aWMgY2hhciBiYXVkX2NvcjNbXSA9IHsgIC8qIHJlY2VpdmUgdGhyZXNob2xkICovCisgICAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwKKyAgICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDA5LCAgMHgwOSwgIDB4MDgsICAweDA4LCAgMHgwOCwgIDB4MDgsICAweDA3LAorICAgIDB4MDd9OworCisvKgorICogVGhlIEN5Y2xhZGVzIGRyaXZlciBpbXBsZW1lbnRzIEhXIGZsb3cgY29udHJvbCBhcyBhbnkgc2VyaWFsIGRyaXZlci4KKyAqIFRoZSBjeWNsYWRlc19wb3J0IHN0cnVjdHVyZSBtZW1iZXIgcmZsb3cgYW5kIHRoZSB2ZWN0b3IgcmZsb3dfdGhyIAorICogYWxsb3dzIHVzIHRvIHRha2UgYWR2YW50YWdlIG9mIGEgc3BlY2lhbCBmZWF0dXJlIGluIHRoZSBDRDE0MDAgdG8gYXZvaWQgCisgKiBkYXRhIGxvc3MgZXZlbiB3aGVuIHRoZSBzeXN0ZW0gaW50ZXJydXB0IGxhdGVuY3kgaXMgdG9vIGhpZ2guIFRoZXNlIGZsYWdzIAorICogYXJlIHRvIGJlIHVzZWQgb25seSB3aXRoIHZlcnkgc3BlY2lhbCBhcHBsaWNhdGlvbnMuIFNldHRpbmcgdGhlc2UgZmxhZ3MgCisgKiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgc3BlY2lhbCBjYWJsZSAoRFRSIGFuZCBSVFMgcmV2ZXJzZWQpLiBJbiB0aGUgbmV3IAorICogQ0QxNDAwLWJhc2VkIGJvYXJkcyAocmV2LiA2LjAwIG9yIGxhdGVyKSwgdGhlcmUgaXMgbm8gbmVlZCBmb3Igc3BlY2lhbCAKKyAqIGNhYmxlcy4KKyAqLworCitzdGF0aWMgY2hhciByZmxvd190aHJbXSA9IHsgIC8qIHJmbG93IHRocmVzaG9sZCAqLworICAgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgICAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwKKyAgICAweDBhfTsKKworLyogIFRoZSBDeWNsb20tWWUgaGFzIHBsYWNlZCB0aGUgc2VxdWVudGlhbCBjaGlwcyBpbiBub24tc2VxdWVudGlhbAorICogIGFkZHJlc3Mgb3JkZXIuICBUaGlzIGxvb2stdXAgdGFibGUgb3ZlcmNvbWVzIHRoYXQgcHJvYmxlbS4KKyAqLworc3RhdGljIGludCBjeV9jaGlwX29mZnNldCBbXSA9CisgICAgeyAweDAwMDAsCisgICAgICAweDA0MDAsCisgICAgICAweDA4MDAsCisgICAgICAweDBDMDAsCisgICAgICAweDAyMDAsCisgICAgICAweDA2MDAsCisgICAgICAweDBBMDAsCisgICAgICAweDBFMDAKKyAgICB9OworCisvKiBQQ0kgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJY3lfcGNpX25ib2FyZDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAljeV9pc2FfbmJvYXJkOworc3RhdGljIHVuc2lnbmVkIHNob3J0CWN5X25ib2FyZDsKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJY3lfcGNpX2Rldl9pZFtdID0geworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8sCS8qIFBDSSA8IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGksCS8qIFBDSSA+IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzRZX0xvLAkvKiA0WSBQQ0kgPCAxTWIgKi8KKwkJCSAgICBQQ0lfREVWSUNFX0lEX0NZQ0xPTV80WV9IaSwJLyogNFkgUENJID4gMU1iICovCisJCQkgICAgUENJX0RFVklDRV9JRF9DWUNMT01fOFlfTG8sCS8qIDhZIFBDSSA8IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzhZX0hpLAkvKiA4WSBQQ0kgPiAxTWIgKi8KKwkJCSAgICBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0xvLAkvKiBaIFBDSSA8IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGksCS8qIFogUENJID4gMU1iICovCisJCQkgICAgMAkJCQkvKiBlbmQgb2YgdGFibGUgKi8KKwkJCX07CisjZW5kaWYKKworc3RhdGljIHZvaWQgY3lfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBzZXRfbGluZV9jaGFyKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopOworc3RhdGljIGludCBjeXpfaXNzdWVfY21kKHN0cnVjdCBjeWNsYWRlc19jYXJkICosIHVjbG9uZywgdWNjaGFyLCB1Y2xvbmcpOworI2lmZGVmIENPTkZJR19JU0EKK3N0YXRpYyB1bnNpZ25lZCBkZXRlY3RfaXNhX2lycSh2b2lkIF9faW9tZW0gKik7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitzdGF0aWMgaW50IGN5Y2xhZGVzX2dldF9wcm9jX2luZm8oY2hhciAqLCBjaGFyICoqLCBvZmZfdCAsIGludCAsIGludCAqLCB2b2lkICopOworCisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorc3RhdGljIHZvaWQgY3l6X3BvbGwodW5zaWduZWQgbG9uZyk7CisKKy8qIFRoZSBDeWNsYWRlcy1aIHBvbGxpbmcgY3ljbGUgaXMgZGVmaW5lZCBieSB0aGlzIHZhcmlhYmxlICovCitzdGF0aWMgbG9uZyBjeXpfcG9sbGluZ19jeWNsZSA9IENaX0RFRl9QT0xMOworCitzdGF0aWMgaW50IGN5el90aW1lcm9uID0gMDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBjeXpfdGltZXJsaXN0ID0gVElNRVJfSU5JVElBTElaRVIoY3l6X3BvbGwsIDAsIDApOworCisjZWxzZSAvKiBDT05GSUdfQ1laX0lOVFIgKi8KK3N0YXRpYyB2b2lkIGN5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGN5el9yeF9mdWxsX3RpbWVyW05SX1BPUlRTXTsKKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3NlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKyAgICAgICAgImN5YyBXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorICAgICAgICAiY3ljIFdhcm5pbmc6IG51bGwgY3ljbGFkZXNfcG9ydCBmb3IgKCVzKSBpbiAlc1xuIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYmFkcmFuZ2UgPQorICAgICAgICAiY3ljIFdhcm5pbmc6IGN5Y2xhZGVzX3BvcnQgb3V0IG9mIHJhbmdlIGZvciAoJXMpIGluICVzXG4iOworCisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIHByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIChsb25nKWluZm8gPCAobG9uZykoJmN5X3BvcnRbMF0pCisgICAgfHwgKGxvbmcpKCZjeV9wb3J0W05SX1BPUlRTXSkgPCAobG9uZylpbmZvICl7CisgICAgICAgIHByaW50ayhiYWRyYW5nZSwgbmFtZSwgcm91dGluZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChpbmZvLT5tYWdpYyAhPSBDWUNMQURFU19NQUdJQykgeworICAgICAgICBwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7Cit9IC8qIHNlcmlhbF9wYXJhbm9pYV9jaGVjayAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHNjaGVkdWxlCisgKiBwcm9jZXNzaW5nIGluIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgcG9ydGlvbiBvZiB0aGUgZHJpdmVyCisgKiAoYWxzbyBrbm93biBhcyB0aGUgImJvdHRvbSBoYWxmIikuICBUaGlzIGNhbiBiZSBjYWxsZWQgYW55CisgKiBudW1iZXIgb2YgdGltZXMgZm9yIGFueSBjaGFubmVsIHdpdGhvdXQgaGFybS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjeV9zY2hlZF9ldmVudChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywgaW50IGV2ZW50KQoreworICAgIGluZm8tPmV2ZW50IHw9IDEgPDwgZXZlbnQ7IC8qIHJlbWVtYmVyIHdoYXQga2luZCBvZiBldmVudCBhbmQgd2hvICovCisgICAgc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKK30gLyogY3lfc2NoZWRfZXZlbnQgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSAiYm90dG9tIGhhbGYiIHByb2Nlc3NpbmcgZm9yIHRoZQorICogc2VyaWFsIGRyaXZlciwga25vd24gYWxzbyB0aGUgInNvZnR3YXJlIGludGVycnVwdCIgcHJvY2Vzc2luZy4KKyAqIFRoaXMgcHJvY2Vzc2luZyBpcyBkb25lIGF0IHRoZSBrZXJuZWwgaW50ZXJydXB0IGxldmVsLCBhZnRlciB0aGUKKyAqIGN5Iy9faW50ZXJydXB0KCkgaGFzIHJldHVybmVkLCBCVVQgV0lUSCBJTlRFUlJVUFRTIFRVUk5FRCBPTi4gIFRoaXMKKyAqIGlzIHdoZXJlIHRpbWUtY29uc3VtaW5nIGFjdGl2aXRpZXMgd2hpY2ggY2FuIG5vdCBiZSBkb25lIGluIHRoZQorICogaW50ZXJydXB0IGRyaXZlciBwcm9wZXIgYXJlIGRvbmU7IHRoZSBpbnRlcnJ1cHQgZHJpdmVyIHNjaGVkdWxlcworICogdGhlbSB1c2luZyBjeV9zY2hlZF9ldmVudCgpLCBhbmQgdGhleSBnZXQgZG9uZSBoZXJlLgorICoKKyAqIFRoaXMgaXMgZG9uZSB0aHJvdWdoIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbi0tdGhlIHRhc2sgcXVldWUuCisgKiBXaGVuIGEgaGFyZHdhcmUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB3YW50cyBzZXJ2aWNlIGJ5IHRoZQorICogZHJpdmVyJ3MgYm90dG9tIGhhbGYsIGl0IGVucXVldWVzIHRoZSBhcHByb3ByaWF0ZSB0cV9zdHJ1Y3QgKG9uZQorICogcGVyIHBvcnQpIHRvIHRoZSBrZXZlbnRkIHdvcmsgcXVldWUgYW5kIHNldHMgYSByZXF1ZXN0IGZsYWcKKyAqIHRoYXQgdGhlIHdvcmsgcXVldWUgYmUgcHJvY2Vzc2VkLgorICoKKyAqIEFsdGhvdWdoIHRoaXMgbWF5IHNlZW0gdW53aWVsZHksIGl0IGdpdmVzIHRoZSBzeXN0ZW0gYSB3YXkgdG8KKyAqIHBhc3MgYW4gYXJndW1lbnQgKGluIHRoaXMgY2FzZSB0aGUgcG9pbnRlciB0byB0aGUgY3ljbGFkZXNfcG9ydAorICogc3RydWN0dXJlKSB0byB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIGRyaXZlci4gIFByZXZpb3VzIGtlcm5lbHMKKyAqIGhhZCB0byBwb2xsIGV2ZXJ5IHBvcnQgdG8gc2VlIGlmIHRoYXQgcG9ydCBuZWVkZWQgc2VydmljaW5nLgorICovCitzdGF0aWMgdm9pZAorZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKikgcHJpdmF0ZV87CisgIHN0cnVjdCB0dHlfc3RydWN0ICAgICp0dHk7CisKKyAgICB0dHkgPSBpbmZvLT50dHk7CisgICAgaWYgKCF0dHkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfSEFOR1VQLCAmaW5mby0+ZXZlbnQpKSB7CisgICAgICAgIHR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworICAgICAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9PUEVOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisgICAgfQorI2lmZGVmIENPTkZJR19DWVpfSU5UUgorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfWl9SWF9GVUxMLCAmaW5mby0+ZXZlbnQpKSB7CisJaWYgKGN5el9yeF9mdWxsX3RpbWVyW2luZm8tPmxpbmVdLmZ1bmN0aW9uID09IE5VTEwpIHsKKwkgICAgY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCSAgICBjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5mdW5jdGlvbiA9IGN5el9yeF9yZXN0YXJ0OworCSAgICBjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwkgICAgYWRkX3RpbWVyKCZjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXSk7CisJfQorICAgIH0KKyNlbmRpZgorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfREVMVEFfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisgICAgfQorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfV1JJVEVfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisgICAgICAgIHR0eV93YWtldXAodHR5KTsKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworICAgIH0KKyNpZmRlZiBaX1dBS0UKKyAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnNodXRkb3duX3dhaXQpOworICAgIH0KKyNlbmRpZgorfSAvKiBkb19zb2Z0aW50ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiBTdGFydCBvZiBibG9jayBvZiBDeWNsb20tWSBzcGVjaWZpYyBjb2RlICoqKioqKioqLworCisvKiBUaGlzIHJvdXRpbmUgd2FpdHMgdXAgdG8gMTAwMCBtaWNyby1zZWNvbmRzIGZvciB0aGUgcHJldmlvdXMKKyAgIGNvbW1hbmQgdG8gdGhlIENpcnJ1cyBjaGlwIHRvIGNvbXBsZXRlIGFuZCB0aGVuIGlzc3VlcyB0aGUKKyAgIG5ldyBjb21tYW5kLiAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHByZXZpb3VzIGNvbW1hbmQKKyAgIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZSB0aW1lIGxpbWl0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gaW5zaWRlIHNwaW5sb2NrLXByb3RlY3RlZCBjb2RlLgorICovCitzdGF0aWMgaW50CitjeXlfaXNzdWVfY21kKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyLCB1X2NoYXIgY21kLCBpbnQgaW5kZXgpCit7CisgIHZvbGF0aWxlIGludCAgaTsKKworICAgIC8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwcmV2aW91cyBjb21tYW5kIGhhcyBjb21wbGV0ZWQgKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgMTAwIDsgaSsrKXsKKwlpZiAoY3lfcmVhZGIoYmFzZV9hZGRyKyhDeUNDUjw8aW5kZXgpKSA9PSAwKXsKKwkgICAgYnJlYWs7CisJfQorCXVkZWxheSgxMEwpOworICAgIH0KKyAgICAvKiBpZiB0aGUgQ0NSIG5ldmVyIGNsZWFyZWQsIHRoZSBwcmV2aW91cyBjb21tYW5kCisgICAgICAgZGlkbid0IGZpbmlzaCB3aXRoaW4gdGhlICJyZWFzb25hYmxlIHRpbWUiICovCisgICAgaWYgKGkgPT0gMTAwKQlyZXR1cm4gKC0xKTsKKworICAgIC8qIElzc3VlIHRoZSBuZXcgY29tbWFuZCAqLworICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0NSPDxpbmRleCksIGNtZCk7CisKKyAgICByZXR1cm4oMCk7Cit9IC8qIGN5eV9pc3N1ZV9jbWQgKi8KKworI2lmZGVmIENPTkZJR19JU0EKKy8qIElTQSBpbnRlcnJ1cHQgZGV0ZWN0aW9uIGNvZGUgKi8KK3N0YXRpYyB1bnNpZ25lZCAKK2RldGVjdF9pc2FfaXJxKHZvaWQgX19pb21lbSAqYWRkcmVzcykKK3sKKyAgaW50IGlycTsKKyAgdW5zaWduZWQgbG9uZyBpcnFzLCBmbGFnczsKKyAgaW50IHNhdmVfeGlyLCBzYXZlX2NhcjsKKyAgaW50IGluZGV4ID0gMDsgLyogSVJRIHByb2JpbmcgaXMgb25seSBmb3IgSVNBICovCisKKyAgICAvKiBmb3JnZXQgcG9zc2libGUgaW5pdGlhbGx5IG1hc2tlZCBhbmQgcGVuZGluZyBJUlEgKi8KKyAgICBpcnEgPSBwcm9iZV9pcnFfb2ZmKHByb2JlX2lycV9vbigpKTsKKworICAgIC8qIENsZWFyIGludGVycnVwdHMgb24gdGhlIGJvYXJkIGZpcnN0ICovCisgICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsKKwkJCSAgICAgIC8qIEN5X0NsckludHIgaXMgMHgxODAwICovCisKKyAgICBpcnFzID0gcHJvYmVfaXJxX29uKCk7CisgICAgLyogV2FpdCAuLi4gKi8KKyAgICB1ZGVsYXkoNTAwMEwpOworCisgICAgLyogRW5hYmxlIHRoZSBUeCBpbnRlcnJ1cHRzIG9uIHRoZSBDRDE0MDAgKi8KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lDQVI8PGluZGV4KSwgMCk7CisJY3l5X2lzc3VlX2NtZChhZGRyZXNzLCBDeUNIQU5fQ1RMfEN5RU5CX1hNVFIsIGluZGV4KTsKKworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5Q0FSPDxpbmRleCksIDApOworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5U1JFUjw8aW5kZXgpLCAKKwkJY3lfcmVhZGIoYWRkcmVzcyArIChDeVNSRVI8PGluZGV4KSkgfCBDeVR4UmR5KTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICAvKiBXYWl0IC4uLiAqLworICAgIHVkZWxheSg1MDAwTCk7CisKKyAgICAvKiBDaGVjayB3aGljaCBpbnRlcnJ1cHQgaXMgaW4gdXNlICovCisgICAgaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKworICAgIC8qIENsZWFuIHVwICovCisgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihhZGRyZXNzICsgKEN5VElSPDxpbmRleCkpOworICAgIHNhdmVfY2FyID0gY3lfcmVhZGIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpKTsKKyAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDMpKTsKKyAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeVNSRVI8PGluZGV4KSwKKwljeV9yZWFkYihhZGRyZXNzICsgKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKyAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeVRJUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7CisgICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lDQVI8PGluZGV4KSwgKHNhdmVfY2FyKSk7CisgICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsKKwkJCSAgICAgIC8qIEN5X0NsckludHIgaXMgMHgxODAwICovCisKKyAgICByZXR1cm4gKGlycSA+IDApPyBpcnEgOiAwOworfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKworLyogVGhlIHJlYWwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBpcyBjYWxsZWQKKyAgIHdoZW5ldmVyIHRoZSBjYXJkIHdhbnRzIGl0cyBoYW5kIGhlbGQtLWNoYXJzCisgICByZWNlaXZlZCwgb3V0IGJ1ZmZlciBlbXB0eSwgbW9kZW0gY2hhbmdlLCBldGMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorY3l5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICBpbnQgc3RhdHVzOworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwgKmNhcmRfYmFzZV9hZGRyOworICBpbnQgY2hpcDsKKyAgaW50IHNhdmVfeGlyLCBjaGFubmVsLCBzYXZlX2NhcjsKKyAgY2hhciBkYXRhOworICB2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKKyAgaW50IG91dGNoOworICBpbnQgaSxqLGluZGV4OworICBpbnQgdG9vX21hbnk7CisgIGludCBoYWRfd29yazsKKyAgaW50IG1kbV9jaGFuZ2U7CisgIGludCBtZG1fc3RhdHVzOworCisgICAgaWYoKGNpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19jYXJkICopZGV2X2lkKSA9PSAwKXsKKyNpZmRlZiBDWV9ERUJVR19JTlRFUlJVUFRTCisJcHJpbnRrKCJjeXlfaW50ZXJydXB0OiBzcHVyaW91cyBpbnRlcnJ1cHQgJWRcblxyIiwgaXJxKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gSVJRX05PTkU7IC8qIHNwdXJpb3VzIGludGVycnVwdCAqLworICAgIH0KKworICAgIGNhcmRfYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkcjsKKyAgICBpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CisKKworICAgIC8qIFRoaXMgbG9vcCBjaGVja3MgYWxsIGNoaXBzIGluIHRoZSBjYXJkLiAgTWFrZSBhIG5vdGUgd2hlbmV2ZXIKKyAgICAgICBfYW55XyBjaGlwIGhhZCBzb21lIHdvcmsgdG8gZG8sIGFzIHRoaXMgaXMgY29uc2lkZXJlZCBhbgorICAgICAgIGluZGljYXRpb24gdGhhdCB0aGVyZSB3aWxsIGJlIG1vcmUgdG8gZG8uICBPbmx5IHdoZW4gbm8gY2hpcAorICAgICAgIGhhcyBhbnkgd29yayBkb2VzIHRoaXMgb3V0ZXJtb3N0IGxvb3AgZXhpdC4KKyAgICAgKi8KKyAgICBkb3sKKyAgICAgICAgaGFkX3dvcmsgPSAwOworICAgICAgICBmb3IgKCBjaGlwID0gMCA7IGNoaXAgPCBjaW5mby0+bnVtX2NoaXBzIDsgY2hpcCArKykgeworICAgICAgICAgICAgYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworICAgICAgICAgICAgdG9vX21hbnkgPSAwOworICAgICAgICAgICAgd2hpbGUgKCAoc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNWUlI8PGluZGV4KSkpICE9IDB4MDApIHsKKyAgICAgICAgICAgICAgICBoYWRfd29yaysrOworICAgICAgICAgICAgICAgIC8qIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0byBlbnN1cmUgdGhhdAorICAgICAgICAgICAgICAgICAgIG5vIGNoaXAgY2FuIG1vbm9wb2xpemUgdGhlIGRyaXZlci4gIFRoaXMgZm9yY2VzIHRoZQorICAgICAgICAgICAgICAgICAgIGNoaXBzIHRvIGJlIGNoZWNrZWQgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uIChhZnRlcgorICAgICAgICAgICAgICAgICAgIGRyYWluaW5nIGVhY2ggb2YgYSBidW5jaCAoMTAwMCkgb2YgY2hhcmFjdGVycykuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoMTAwMDx0b29fbWFueSsrKXsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBDeVNSUmVjZWl2ZSkgeyAvKiByZWNlcHRpb24gaW50ZXJydXB0ICovCisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCQkgICAgcHJpbnRrKCJjeXlfaW50ZXJydXB0OiByY3ZkIGludHIsIGNoaXAgJWRcblxyIiwgY2hpcCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsICYgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworCQkgICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UklSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoc2F2ZV94aXIgJiBDeUlSQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBjaGFubmVsICsgY2hpcCAqIDQgKyBjaW5mby0+Zmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2ldOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgIHNhdmVfY2FyID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgc2F2ZV94aXIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG5vd2hlcmUgdG8gcHV0IHRoZSBkYXRhLCBkaXNjYXJkIGl0ICovCisgICAgICAgICAgICAgICAgICAgIGlmKGluZm8tPnR0eSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSAoY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJJVlI8PGluZGV4KSkgJiBDeUlWUk1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqID09IEN5SVZSUnhFeCApIHsgLyogZXhjZXB0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogbm9ybWFsIGNoYXJhY3RlciByZWNlcHRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NvdW50ID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEQ1I8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoY2hhcl9jb3VudC0tKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7IC8qIHRoZXJlIGlzIGFuIG9wZW4gcG9ydCBmb3IgdGhpcyBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICB0dHkgPSBpbmZvLT50dHk7CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSSVZSPDxpbmRleCkpICYgQ3lJVlJNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaiA9PSBDeUlWUlJ4RXggKSB7IC8qIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKworCQkJICAgIC8qIEZvciBzdGF0aXN0aWNzIG9ubHkgKi8KKwkJCSAgICBpZiAoZGF0YSAmIEN5QlJFQUspCisJCQkJaW5mby0+aWNvdW50LmJyaysrOworCQkJICAgIGVsc2UgaWYoZGF0YSAmIEN5RlJBTUUpCisJCQkJaW5mby0+aWNvdW50LmZyYW1lKys7CisJCQkgICAgZWxzZSBpZihkYXRhICYgQ3lQQVJJVFkpCisJCQkJaW5mby0+aWNvdW50LnBhcml0eSsrOworCQkJICAgIGVsc2UgaWYoZGF0YSAmIEN5T1ZFUlJVTikKKwkJCQlpbmZvLT5pY291bnQub3ZlcnJ1bisrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayl7CisJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2speworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSAmIEN5QlJFQUspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPQorCSAgICAJCQkJCQkgICAgVFRZX0JSRUFLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPQorCQkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworCQkJCQlpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19TQUsodHR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkYXRhICYgQ3lGUkFNRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9CisJCQkJCQkJICAgIFRUWV9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0KKwkJCQkJICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKwkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJCWluZm8tPmlkbGVfc3RhdHMuZnJhbWVfZXJycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YSAmIEN5UEFSSVRZKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0KKwkJCQkJCQkgICAgVFRZX1BBUklUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0KKwkJCQkJICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKwkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJCWluZm8tPmlkbGVfc3RhdHMucGFyaXR5X2VycnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRhdGEgJiBDeU9WRVJSVU4peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPQorCQkJCQkJCSAgICBUVFlfT1ZFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGZsaXAgYnVmZmVyIGl0c2VsZiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93aW5nLCB3ZSBzdGlsbCBsb3NlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW5jb21pbmcgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR0eS0+ZmxpcC5jb3VudAorCQkJCQkgICAgICAgICAgIDwgVFRZX0ZMSVBCVUZfU0laRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0KKwkJCQkJCQkgICAgIFRUWV9OT1JNQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9CisJCQkJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKwkJCQkJICAgIGluZm8tPmljb3VudC5yeCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJaW5mby0+aWRsZV9zdGF0cy5vdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlc2UgdHdvIGNvbmRpdGlvbnMgbWF5IGltcGx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhIG5vcm1hbCByZWFkIHNob3VsZCBiZSBkb25lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogfWVsc2UgaWYoZGF0YSAmIEN5VElNRU9VVCl7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB9ZWxzZSBpZihkYXRhICYgQ3lTUEVDSEFSKXsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQkJCQlpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQkJCSAgICBpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVyZSB3YXMgYSBzb2Z0d2FyZSBidWZmZXIKKwkJCQkgICBvdmVycnVuIGFuZCBub3RoaW5nIGNvdWxkIGJlCisJCQkJICAgZG9uZSBhYm91dCBpdCEhISAqLworCQkJCWluZm8tPmljb3VudC5idWZfb3ZlcnJ1bisrOworCQkJCWluZm8tPmlkbGVfc3RhdHMub3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBub3JtYWwgY2hhcmFjdGVyIHJlY2VwdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgIyBjaGFycyBhdmFpbGFibGUgZnJvbSB0aGUgY2hpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRDUjw8aW5kZXgpKTsKKworI2lmZGVmIENZX0VOQUJMRV9NT05JVE9SSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbmZvLT5tb24uaW50X2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1vbi5jaGFyX2NvdW50ICs9IGNoYXJfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJfY291bnQgPiBpbmZvLT5tb24uY2hhcl9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bW9uLmNoYXJfbWF4ID0gY2hhcl9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tb24uY2hhcl9sYXN0ID0gY2hhcl9jb3VudDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGNoYXJfY291bnQtLSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5LT5mbGlwLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQkJCWluZm8tPmlkbGVfc3RhdHMucmVjdl9ieXRlcysrOworCQkJCWluZm8tPmljb3VudC5yeCsrOworI2lmZGVmIENZXzE2WV9IQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMEwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJJUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7CisgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIChzYXZlX2NhcikpOworCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEN5U1JUcmFuc21pdCkgeyAvKiB0cmFuc21pc3Npb24gaW50ZXJydXB0ICovCisgICAgICAgICAgICAgICAgICAgIC8qIFNpbmNlIHdlIG9ubHkgZ2V0IGhlcmUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgIGlzIGVtcHR5LCB3ZSBrbm93IHdlIGNhbiBhbHdheXMgc3R1ZmYgYSBkb3plbgorICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLiAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJICAgIHByaW50aygiY3l5X2ludGVycnVwdDogeG1pdCBpbnRyLCBjaGlwICVkXG5cciIsIGNoaXApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsICYgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworCQkgICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5VElSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoc2F2ZV94aXIgJiBDeUlSQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBjaGFubmVsICsgY2hpcCAqIDQgKyBjaW5mby0+Zmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9jYXIgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCBzYXZlX3hpcik7CisKKyAgICAgICAgICAgICAgICAgICAgLyogdmFsaWRhdGUgdGhlIHBvcnQjIChhcyBjb25maWd1cmVkIGFuZCBvcGVuKSAqLworICAgICAgICAgICAgICAgICAgICBpZiggKGkgPCAwKSB8fCAoTlJfUE9SVFMgPD0gaSkgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHhlbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2ldOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgIGlmKGluZm8tPnR0eSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHhkb25lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogbG9hZCB0aGUgb24tY2hpcCBzcGFjZSBmb3Igb3V0Ym91bmQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICBjaGFyX2NvdW50ID0gaW5mby0+eG1pdF9maWZvX3NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+eF9jaGFyKSB7IC8qIHNlbmQgc3BlY2lhbCBjaGFyICovCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRjaCA9IGluZm8tPnhfY2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VERSPDxpbmRleCksIG91dGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQtLTsKKwkJCWluZm8tPmljb3VudC50eCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+eF9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5icmVha29uIHx8IGluZm8tPmJyZWFrb2ZmKSB7CisJCQlpZiAoaW5mby0+YnJlYWtvbikgeworCQkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFI8PGluZGV4KSwgMCk7IAorCQkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFI8PGluZGV4KSwgMHg4MSk7CisJCQkgICAgaW5mby0+YnJlYWtvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudCAtPSAyOworCQkJfQorCQkJaWYgKGluZm8tPmJyZWFrb2ZmKSB7CisJCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUjw8aW5kZXgpLCAwKTsgCisJCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUjw8aW5kZXgpLCAweDgzKTsKKwkJCSAgICBpbmZvLT5icmVha29mZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudCAtPSAyOworCQkJfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoYXJfY291bnQtLSA+IDApeworCQkJaWYgKCFpbmZvLT54bWl0X2NudCl7CisJCQkgICAgaWYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpJkN5VHhNcHR5KSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCisJCQkJCSAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgJgorCQkJCQkgIH5DeVR4TXB0eSk7CisJCQkgICAgfSBlbHNlIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKwkJCQkJICAoKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpCisJCQkJCSAgICAmIH5DeVR4UmR5KQorCQkJCQkgICB8IEN5VHhNcHR5KSk7CisJCQkgICAgfQorCQkJICAgIGdvdG8gdHhkb25lOworCQkJfQorCQkJaWYgKGluZm8tPnhtaXRfYnVmID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorCQkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgCisJCQkJCX5DeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHR4ZG9uZTsKKwkJCX0KKwkJCWlmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKwkJCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIAorCQkJCQl+Q3lUeFJkeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0eGRvbmU7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIHRoZSBFbWJlZGRlZCBUcmFuc21pdCBDb21tYW5kcyBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGVuYWJsZWQsIHdlIG11c3QgY2hlY2sgdG8gc2VlIGlmIHRoZQorCQkJICAgZXNjYXBlIGNoYXJhY3RlciwgTlVMTCwgaXMgYmVpbmcgc2VudC4gIElmIGl0CisJCQkgICBpcywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcyByb29tIGZvciBpdAorCQkJICAgdG8gYmUgZG91YmxlZCBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gIFRoZXJlZm9yZQorCQkJICAgd2Ugbm8gbG9uZ2VyIGFkdmFuY2UgdGhlIHBvaW50ZXIgd2hlbiB0aGUKKwkJCSAgIGNoYXJhY3RlciBpcyBmZXRjaGVkLCBidXQgcmF0aGVyIHdhaXQgdW50aWwKKwkJCSAgIGFmdGVyIHRoZSBjaGVjayBmb3IgYSBOVUxMIG91dHB1dCBjaGFyYWN0ZXIuCisJCQkgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXJlIG1heSBub3QgYmUKKwkJCSAgIHJvb20gZm9yIHRoZSB0d28gY2hhcnMgbmVlZGVkIHRvIHNlbmQgYSBOVUxMLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y2ggPSBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dGNoICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+eG1pdF9jbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT54bWl0X3RhaWwgPSAoaW5mby0+eG1pdF90YWlsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVREUjw8aW5kZXgpLCBvdXRjaCk7CisJCQkgICAgaW5mby0+aWNvdW50LnR4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjaGFyX2NvdW50ID4gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKQorCQkJCQkJICAgICAgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVREUjw8aW5kZXgpLCAKKwkJCQkJICBvdXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VERSPDxpbmRleCksIDApOworCQkJCWluZm8tPmljb3VudC50eCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgdHhkb25lOgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1dSSVRFX1dBS0VVUCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgdHhlbmQ6CisgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VElSPDxpbmRleCksIAorCQkJICAgICAgKHNhdmVfeGlyICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAoc2F2ZV9jYXIpKTsKKwkJICAgIHNwaW5fdW5sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgQ3lTUk1vZGVtKSB7ICAgICAgICAvKiBtb2RlbSBpbnRlcnJ1cHQgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgJiBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCisJCSAgICBzcGluX2xvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgICAgICAgICAgICAgICAgICBzYXZlX3hpciA9ICh1X2NoYXIpIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNSVI8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChzYXZlX3hpciAmIEN5SVJDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWwgKyBjaGlwICogNAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNpbmZvLT5maXJzdF9saW5lXTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICBzYXZlX2NhciA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIHNhdmVfeGlyKTsKKworICAgICAgICAgICAgICAgICAgICBtZG1fY2hhbmdlID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1JU1I8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIG1kbV9zdGF0dXMgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5ID09IDApey8qIG5vIHBsYWNlIGZvciBkYXRhLCBpZ25vcmUgaXQqLworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKwkJCWlmIChtZG1fY2hhbmdlICYgQ3lBTllfREVMVEEpIHsKKwkJCSAgICAvKiBGb3Igc3RhdGlzdGljcyBvbmx5ICovCisJCQkgICAgaWYgKG1kbV9jaGFuZ2UgJiBDeURDRCkJaW5mby0+aWNvdW50LmRjZCsrOworCQkJICAgIGlmIChtZG1fY2hhbmdlICYgQ3lDVFMpCWluZm8tPmljb3VudC5jdHMrKzsKKwkJCSAgICBpZiAobWRtX2NoYW5nZSAmIEN5RFNSKQlpbmZvLT5pY291bnQuZHNyKys7CisJCQkgICAgaWYgKG1kbV9jaGFuZ2UgJiBDeVJJKQlpbmZvLT5pY291bnQucm5nKys7CisKKwkJCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOworCQkJfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZigobWRtX2NoYW5nZSAmIEN5RENEKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtZG1fc3RhdHVzICYgQ3lEQ0QpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9zY2hlZF9ldmVudChpbmZvLAorCQkJCSAgICBDeV9FVkVOVF9PUEVOX1dBS0VVUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sCisJCQkJICAgIEN5X0VWRU5UX0hBTkdVUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1kbV9jaGFuZ2UgJiBDeUNUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5LT5od19zdG9wcGVkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWRtX3N0YXR1cyAmIEN5Q1RTKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5X3N0YXJ0IGlzbid0IHVzZWQKKwkJCQkgICAgICAgICBiZWNhdXNlLi4uICEhISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sCisJCQkJICAgICAgICBDeV9FVkVOVF9XUklURV9XQUtFVVApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEobWRtX3N0YXR1cyAmIEN5Q1RTKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeV9zdG9wIGlzbid0IHVzZWQKKwkJCQkgICAgICAgICBiZWNhdXNlIC4uLiAhISEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkN5VHhSZHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYobWRtX2NoYW5nZSAmIEN5RFNSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1kbV9jaGFuZ2UgJiBDeVJJKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1JUjw8aW5kZXgpLCAKKwkJCSAgICAgIChzYXZlX3hpciAmIDB4M2YpKTsKKyAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgc2F2ZV9jYXIpOworCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgLyogZW5kIHdoaWxlIHN0YXR1cyAhPSAwICovCisgICAgICAgIH0gICAgICAgICAgICAvKiBlbmQgbG9vcCBmb3IgY2hpcHMuLi4gKi8KKyAgICB9IHdoaWxlKGhhZF93b3JrKTsKKworICAgLyogY2xlYXIgaW50ZXJydXB0cyAqLworICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgIGN5X3dyaXRlYihjYXJkX2Jhc2VfYWRkciArIChDeV9DbHJJbnRyPDxpbmRleCksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiBjeXlfaW50ZXJydXB0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKiogRW5kIG9mIGJsb2NrIG9mIEN5Y2xvbS1ZIHNwZWNpZmljIGNvZGUgKioqKioqKioqKi8KKy8qKioqKioqKiBTdGFydCBvZiBibG9jayBvZiBDeWNsYWRlcy1aIHNwZWNpZmljIGNvZGUgKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitjeXpfZmV0Y2hfbXNnKCBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8sCisJICAgIHVjbG9uZyAqY2hhbm5lbCwgdWNjaGFyICpjbWQsIHVjbG9uZyAqcGFyYW0pCit7CisgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKyAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKyAgdW5zaWduZWQgbG9uZyBsb2NfZG9vcmJlbGw7CisKKyAgICBmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSl7CisJcmV0dXJuICgtMSk7CisgICAgfQorICAgIHpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKyAgICBsb2NfZG9vcmJlbGwgPSBjeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikKKyAgICAgICAgICAgICAgICAgICAgIChjaW5mby0+Y3RsX2FkZHIpKS0+bG9jX2Rvb3JiZWxsKTsKKyAgICBpZiAobG9jX2Rvb3JiZWxsKXsKKwkqY21kID0gKGNoYXIpKDB4ZmYgJiBsb2NfZG9vcmJlbGwpOworCSpjaGFubmVsID0gY3lfcmVhZGwoJmJvYXJkX2N0cmwtPmZ3Y21kX2NoYW5uZWwpOworCSpwYXJhbSA9ICh1Y2xvbmcpY3lfcmVhZGwoJmJvYXJkX2N0cmwtPmZ3Y21kX3BhcmFtKTsKKwljeV93cml0ZWwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopKGNpbmZvLT5jdGxfYWRkcikpLT5sb2NfZG9vcmJlbGwsIAorICAgICAgICAgICAgICAgICAweGZmZmZmZmZmKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGN5el9mZXRjaF9tc2cgKi8KKworc3RhdGljIGludAorY3l6X2lzc3VlX2NtZCggc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvLAorCSAgICB1Y2xvbmcgY2hhbm5lbCwgdWNjaGFyIGNtZCwgdWNsb25nIHBhcmFtKQoreworICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgIHN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisgIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqcGNpX2Rvb3JiZWxsOworICBpbnQgaW5kZXg7CisKKyAgICBmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSl7CisJcmV0dXJuICgtMSk7CisgICAgfQorICAgIHpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKyAgICBpbmRleCA9IDA7CisgICAgcGNpX2Rvb3JiZWxsID0gJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopIChjaW5mby0+Y3RsX2FkZHIpKS0+cGNpX2Rvb3JiZWxsOworICAgIHdoaWxlKCAoY3lfcmVhZGwocGNpX2Rvb3JiZWxsKSAmIDB4ZmYpICE9IDApeworICAgICAgICBpZiAoaW5kZXgrKyA9PSAxMDAwKXsKKwkgICAgcmV0dXJuKChpbnQpKGN5X3JlYWRsKHBjaV9kb29yYmVsbCkgJiAweGZmKSk7CisgICAgICAgIH0KKwl1ZGVsYXkoNTBMKTsKKyAgICB9CisgICAgY3lfd3JpdGVsKCZib2FyZF9jdHJsLT5oY21kX2NoYW5uZWwsIGNoYW5uZWwpOworICAgIGN5X3dyaXRlbCgmYm9hcmRfY3RybC0+aGNtZF9wYXJhbSAsIHBhcmFtKTsKKyAgICBjeV93cml0ZWwocGNpX2Rvb3JiZWxsLCAobG9uZyljbWQpOworCisgICAgcmV0dXJuKDApOworfSAvKiBjeXpfaXNzdWVfY21kICovCisKK3N0YXRpYyB2b2lkCitjeXpfaGFuZGxlX3J4KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLAorCSAgICAgIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmwsCisJICAgICAgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAgdm9sYXRpbGUgaW50IGNoYXJfY291bnQ7CisjaWZkZWYgQkxPQ0tNT1ZFCisgIGludCBzbWFsbF9jb3VudDsKKyNlbHNlCisgIGNoYXIgZGF0YTsKKyNlbmRpZgorICB2b2xhdGlsZSB1Y2xvbmcgcnhfcHV0LCByeF9nZXQsIG5ld19yeF9nZXQsIHJ4X2J1ZnNpemUsIHJ4X2J1ZmFkZHI7CisKKyAgICByeF9nZXQgPSBuZXdfcnhfZ2V0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9nZXQpOworICAgIHJ4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+cnhfcHV0KTsKKyAgICByeF9idWZzaXplID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9idWZzaXplKTsKKyAgICByeF9idWZhZGRyID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9idWZhZGRyKTsKKyAgICBpZiAocnhfcHV0ID49IHJ4X2dldCkKKwljaGFyX2NvdW50ID0gcnhfcHV0IC0gcnhfZ2V0OworICAgIGVsc2UKKwljaGFyX2NvdW50ID0gcnhfcHV0IC0gcnhfZ2V0ICsgcnhfYnVmc2l6ZTsKKworICAgIGlmICggY2hhcl9jb3VudCApIHsKKwlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisJaW5mby0+amlmZmllc1sxXSA9IGppZmZpZXM7CisKKyNpZmRlZiBDWV9FTkFCTEVfTU9OSVRPUklORworCWluZm8tPm1vbi5pbnRfY291bnQrKzsKKwlpbmZvLT5tb24uY2hhcl9jb3VudCArPSBjaGFyX2NvdW50OworCWlmIChjaGFyX2NvdW50ID4gaW5mby0+bW9uLmNoYXJfbWF4KQorCSAgICBpbmZvLT5tb24uY2hhcl9tYXggPSBjaGFyX2NvdW50OworCWluZm8tPm1vbi5jaGFyX2xhc3QgPSBjaGFyX2NvdW50OworI2VuZGlmCisJaWYodHR5ID09IDApeworCSAgICAvKiBmbHVzaCByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisJICAgIG5ld19yeF9nZXQgPSAobmV3X3J4X2dldCArIGNoYXJfY291bnQpICYgKHJ4X2J1ZnNpemUgLSAxKTsKKwkgICAgaW5mby0+cmZsdXNoX2NvdW50Kys7CisJfWVsc2V7CisjaWZkZWYgQkxPQ0tNT1ZFCisJICAgIC8qIHdlJ2QgbGlrZSB0byB1c2UgbWVtY3B5KHQsIGYsIG4pIGFuZCBtZW1zZXQocywgYywgY291bnQpCisJICAgICAgIGZvciBwZXJmb3JtYW5jZSwgYnV0IGJlY2F1c2Ugb2YgYnVmZmVyIGJvdW5kYXJpZXMsIHRoZXJlCisJICAgICAgIG1heSBiZSBzZXZlcmFsIHN0ZXBzIHRvIHRoZSBvcGVyYXRpb24gKi8KKwkgICAgd2hpbGUoMCA8IChzbWFsbF9jb3VudCA9IAorCQkgICAgICAgbWluX3QodW5zaWduZWQgaW50LCAocnhfYnVmc2l6ZSAtIG5ld19yeF9nZXQpLAorCQkgICAgICAgbWluX3QodW5zaWduZWQgaW50LCAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCksIGNoYXJfY291bnQpKQorCQkgKSkgeworCQltZW1jcHlfZnJvbWlvKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsCisJCQkgICAgICAoY2hhciAqKShjaW5mby0+YmFzZV9hZGRyCisJCQkJICAgICAgICsgcnhfYnVmYWRkciArIG5ld19yeF9nZXQpLAorCQkJICAgICAgc21hbGxfY291bnQpOworCisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gc21hbGxfY291bnQ7CisJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCBUVFlfTk9STUFMLCBzbWFsbF9jb3VudCk7CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gc21hbGxfY291bnQ7CisJCW5ld19yeF9nZXQgPSAobmV3X3J4X2dldCArIHNtYWxsX2NvdW50KSAmIChyeF9idWZzaXplIC0gMSk7CisJCWNoYXJfY291bnQgLT0gc21hbGxfY291bnQ7CisJCWluZm8tPmljb3VudC5yeCArPSBzbWFsbF9jb3VudDsKKwkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzICs9IHNtYWxsX2NvdW50OworCQl0dHktPmZsaXAuY291bnQgKz0gc21hbGxfY291bnQ7CisJICAgIH0KKyNlbHNlCisJICAgIHdoaWxlKGNoYXJfY291bnQtLSl7CisJCWlmICh0dHktPmZsaXAuY291bnQgPj0gTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCisJCSAgICBicmVhazsKKworCQlkYXRhID0gY3lfcmVhZGIoY2luZm8tPmJhc2VfYWRkciArIHJ4X2J1ZmFkZHIgKyBuZXdfcnhfZ2V0KTsKKwkJbmV3X3J4X2dldCA9IChuZXdfcnhfZ2V0ICsgMSkgJiAocnhfYnVmc2l6ZSAtIDEpOworCQl0dHktPmZsaXAuY291bnQrKzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMrKzsKKwkJaW5mby0+aWNvdW50LnJ4Kys7CisJICAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCSAgICAvKiBSZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBSWCBidWZmZXIgYW5kIGlzc3VlCisJICAgICAgIGEgY21kIGluIGNhc2UgaXQncyBoaWdoZXIgdGhhbiB0aGUgUlggaGlnaCB3YXRlciBtYXJrICovCisJICAgIHJ4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+cnhfcHV0KTsKKwkgICAgaWYgKHJ4X3B1dCA+PSByeF9nZXQpCisJCWNoYXJfY291bnQgPSByeF9wdXQgLSByeF9nZXQ7CisJICAgIGVsc2UKKwkJY2hhcl9jb3VudCA9IHJ4X3B1dCAtIHJ4X2dldCArIHJ4X2J1ZnNpemU7CisJICAgIGlmKGNoYXJfY291bnQgPj0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF90aHJlc2hvbGQpKSB7CisJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1pfUlhfRlVMTCk7CisJICAgIH0KKyNlbmRpZgorCSAgICBpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9IGppZmZpZXM7CisJICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCX0KKwkvKiBVcGRhdGUgcnhfZ2V0ICovCisJY3lfd3JpdGVsKCZidWZfY3RybC0+cnhfZ2V0LCBuZXdfcnhfZ2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjeXpfaGFuZGxlX3R4KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLAorCSAgICAgIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmwsCisJICAgICAgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAgY2hhciBkYXRhOworICB2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKKyNpZmRlZiBCTE9DS01PVkUKKyAgaW50IHNtYWxsX2NvdW50OworI2VuZGlmCisgIHZvbGF0aWxlIHVjbG9uZyB0eF9wdXQsIHR4X2dldCwgdHhfYnVmc2l6ZSwgdHhfYnVmYWRkcjsKKworICAgIGlmIChpbmZvLT54bWl0X2NudCA8PSAwKQkvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCisJcmV0dXJuOworCisgICAgdHhfZ2V0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9nZXQpOworICAgIHR4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfcHV0KTsKKyAgICB0eF9idWZzaXplID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9idWZzaXplKTsKKyAgICB0eF9idWZhZGRyID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9idWZhZGRyKTsKKyAgICBpZiAodHhfcHV0ID49IHR4X2dldCkKKwljaGFyX2NvdW50ID0gdHhfZ2V0IC0gdHhfcHV0IC0gMSArIHR4X2J1ZnNpemU7CisgICAgZWxzZQorCWNoYXJfY291bnQgPSB0eF9nZXQgLSB0eF9wdXQgLSAxOworCisgICAgaWYgKCBjaGFyX2NvdW50ICkgeworCisJaWYoIHR0eSA9PSAwICl7CisJICAgIGdvdG8genR4ZG9uZTsKKwl9CisKKwlpZihpbmZvLT54X2NoYXIpIHsgLyogc2VuZCBzcGVjaWFsIGNoYXIgKi8KKwkgICAgZGF0YSA9IGluZm8tPnhfY2hhcjsKKworCSAgICBjeV93cml0ZWIoKGNpbmZvLT5iYXNlX2FkZHIgKyB0eF9idWZhZGRyICsgdHhfcHV0KSwgZGF0YSk7CisJICAgIHR4X3B1dCA9ICh0eF9wdXQgKyAxKSAmICh0eF9idWZzaXplIC0gMSk7CisJICAgIGluZm8tPnhfY2hhciA9IDA7CisJICAgIGNoYXJfY291bnQtLTsKKwkgICAgaW5mby0+aWNvdW50LnR4Kys7CisJICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKwkgICAgaW5mby0+amlmZmllc1syXSA9IGppZmZpZXM7CisJfQorI2lmZGVmIEJMT0NLTU9WRQorCXdoaWxlKDAgPCAoc21hbGxfY291bnQgPSAKKwkJICAgbWluX3QodW5zaWduZWQgaW50LCAodHhfYnVmc2l6ZSAtIHR4X3B1dCksCisJCSAgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIChTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF90YWlsKSwKKwkJCSAgIG1pbl90KHVuc2lnbmVkIGludCwgaW5mby0+eG1pdF9jbnQsIGNoYXJfY291bnQpKSkpKSB7CisKKwkgICAgbWVtY3B5X3RvaW8oKGNoYXIgKikoY2luZm8tPmJhc2VfYWRkciArIHR4X2J1ZmFkZHIgKyB0eF9wdXQpLAorCQkJJmluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0sCisJCQlzbWFsbF9jb3VudCk7CisKKwkgICAgdHhfcHV0ID0gKHR4X3B1dCArIHNtYWxsX2NvdW50KSAmICh0eF9idWZzaXplIC0gMSk7CisJICAgIGNoYXJfY291bnQgLT0gc21hbGxfY291bnQ7CisJICAgIGluZm8tPmljb3VudC50eCArPSBzbWFsbF9jb3VudDsKKwkgICAgaW5mby0+eG1pdF9jbnQgLT0gc21hbGxfY291bnQ7CisJICAgIGluZm8tPnhtaXRfdGFpbCA9IAorCQkoaW5mby0+eG1pdF90YWlsICsgc21hbGxfY291bnQpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCSAgICBpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKKwl9CisjZWxzZQorCXdoaWxlIChpbmZvLT54bWl0X2NudCAmJiBjaGFyX2NvdW50KXsKKwkgICAgZGF0YSA9IGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF07CisJICAgIGluZm8tPnhtaXRfY250LS07CisJICAgIGluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisKKwkgICAgY3lfd3JpdGViKGNpbmZvLT5iYXNlX2FkZHIgKyB0eF9idWZhZGRyICsgdHhfcHV0LCBkYXRhKTsKKwkgICAgdHhfcHV0ID0gKHR4X3B1dCArIDEpICYgKHR4X2J1ZnNpemUgLSAxKTsKKwkgICAgY2hhcl9jb3VudC0tOworCSAgICBpbmZvLT5pY291bnQudHgrKzsKKwkgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCSAgICBpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKKwl9CisjZW5kaWYKKyAgICB6dHhkb25lOgorCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9XUklURV9XQUtFVVApOworCX0KKwkvKiBVcGRhdGUgdHhfcHV0ICovCisJY3lfd3JpdGVsKCZidWZfY3RybC0+dHhfcHV0LCB0eF9wdXQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2N5el9oYW5kbGVfY21kKHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbykKK3sKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKyAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqYnVmX2N0cmw7CisgIHVjbG9uZyBjaGFubmVsOworICB1Y2NoYXIgY21kOworICB1Y2xvbmcgcGFyYW07CisgIHVjbG9uZyBod192ZXIsIGZ3X3ZlcjsKKyAgaW50IHNwZWNpYWxfY291bnQ7CisgIGludCBkZWx0YV9jb3VudDsKKworICAgIGZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKyAgICB6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKyAgICBib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOworICAgIGZ3X3ZlciA9IGN5X3JlYWRsKCZib2FyZF9jdHJsLT5md192ZXJzaW9uKTsKKyAgICBod192ZXIgPSBjeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikoY2luZm8tPmN0bF9hZGRyKSktPm1haWxfYm94XzApOworCisKKyAgICB3aGlsZShjeXpfZmV0Y2hfbXNnKGNpbmZvLCAmY2hhbm5lbCwgJmNtZCwgJnBhcmFtKSA9PSAxKSB7CisJc3BlY2lhbF9jb3VudCA9IDA7CisJZGVsdGFfY291bnQgPSAwOworCWluZm8gPSAmY3lfcG9ydFtjaGFubmVsICsgY2luZm8tPmZpcnN0X2xpbmVdOworCWlmKCh0dHkgPSBpbmZvLT50dHkpID09IDApIHsKKwkgICAgY29udGludWU7CisJfQorCWNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW2NoYW5uZWxdKTsKKwlidWZfY3RybCA9ICYoemZ3X2N0cmwtPmJ1Zl9jdHJsW2NoYW5uZWxdKTsKKworCXN3aXRjaChjbWQpIHsKKwkgICAgY2FzZSBDX0NNX1BSX0VSUk9SOgorCQl0dHktPmZsaXAuY291bnQrKzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9QQVJJVFk7CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQlpbmZvLT5pY291bnQucngrKzsKKwkJc3BlY2lhbF9jb3VudCsrOworCQlicmVhazsKKwkgICAgY2FzZSBDX0NNX0ZSX0VSUk9SOgorCQl0dHktPmZsaXAuY291bnQrKzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9GUkFNRTsKKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCWluZm8tPmljb3VudC5yeCsrOworCQlzcGVjaWFsX2NvdW50Kys7CisJCWJyZWFrOworCSAgICBjYXNlIENfQ01fUlhCUks6CisJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJaW5mby0+aWNvdW50LnJ4Kys7CisJCXNwZWNpYWxfY291bnQrKzsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ19DTV9NRENEOgorCQlpbmZvLT5pY291bnQuZGNkKys7CisJCWRlbHRhX2NvdW50Kys7CisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKXsKKwkJICAgIGlmICgoZndfdmVyID4gMjQxID8gCisJCQkgICgodV9sb25nKXBhcmFtKSA6IAorCQkJICBjeV9yZWFkbCgmY2hfY3RybC0+cnNfc3RhdHVzKSkgJiBDX1JTX0RDRCkgeworCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfT1BFTl9XQUtFVVApOworCQkgICAgfWVsc2V7CisJCQljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9IQU5HVVApOworCQkgICAgfQorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIENfQ01fTUNUUzoKKwkJaW5mby0+aWNvdW50LmN0cysrOworCQlkZWx0YV9jb3VudCsrOworCQlicmVhazsKKwkgICAgY2FzZSBDX0NNX01SSToKKwkJaW5mby0+aWNvdW50LnJuZysrOworCQlkZWx0YV9jb3VudCsrOworCQlicmVhazsKKwkgICAgY2FzZSBDX0NNX01EU1I6CisJCWluZm8tPmljb3VudC5kc3IrKzsKKwkJZGVsdGFfY291bnQrKzsKKwkJYnJlYWs7CisjaWZkZWYgWl9XQUtFCisJICAgIGNhc2UgQ19DTV9JT0NUTFc6CisJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJICAgIGNhc2UgQ19DTV9SWEhJV006CisJICAgIGNhc2UgQ19DTV9SWE5ORFQ6CisJICAgIGNhc2UgQ19DTV9JTlRCQUNLMjoKKwkJLyogUmVjZXB0aW9uIEludGVycnVwdCAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiByY3ZkIGludHIsIGNhcmQgJWQsIHBvcnQgJWxkXG5cciIsIAorCQkJaW5mby0+Y2FyZCwgY2hhbm5lbCk7CisjZW5kaWYKKwkJY3l6X2hhbmRsZV9yeChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7CisJCWJyZWFrOworCSAgICBjYXNlIENfQ01fVFhCRU1QVFk6CisJICAgIGNhc2UgQ19DTV9UWExPV1dNOgorCSAgICBjYXNlIENfQ01fSU5UQkFDSzoKKwkJLyogVHJhbnNtaXNzaW9uIEludGVycnVwdCAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiB4bWl0IGludHIsIGNhcmQgJWQsIHBvcnQgJWxkXG5cciIsIAorCQkJaW5mby0+Y2FyZCwgY2hhbm5lbCk7CisjZW5kaWYKKwkJY3l6X2hhbmRsZV90eChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCSAgICBjYXNlIENfQ01fRkFUQUw6CisJCS8qIHNob3VsZCBkbyBzb21ldGhpbmcgd2l0aCB0aGlzICEhISAqLworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmKGRlbHRhX2NvdW50KQorCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOworCWlmKHNwZWNpYWxfY291bnQpCisJICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworICAgIH0KK30KKworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorc3RhdGljIGlycXJldHVybl90CitjeXpfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKworICAgIGlmKChjaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqKWRldl9pZCkgPT0gMCl7CisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCXByaW50aygiY3l6X2ludGVycnVwdDogc3B1cmlvdXMgaW50ZXJydXB0ICVkXG5cciIsIGlycSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOyAvKiBzcHVyaW91cyBpbnRlcnJ1cHQgKi8KKyAgICB9CisKKyAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKSB7CisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCXByaW50aygiY3l6X2ludGVycnVwdDogYm9hcmQgbm90IHlldCBsb2FkZWQgKElSUSVkKS5cblxyIiwgaXJxKTsKKyNlbmRpZgorCXJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgdGhlIGludGVycnVwdHMgKi8KKyAgICBjeXpfaGFuZGxlX2NtZChjaW5mbyk7CisKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIGN5el9pbnRlcnJ1cHQgKi8KKworc3RhdGljIHZvaWQKK2N5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopYXJnOworICAgIGludCByZXR2YWw7CisgICAgaW50IGNhcmQgPSBpbmZvLT5jYXJkOworICAgIHVjbG9uZyBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fSU5UQkFDSzIsIDBMKTsKKyAgICBpZiAocmV0dmFsICE9IDApeworCXByaW50aygiY3ljOmN5el9yeF9yZXN0YXJ0IHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLCAKKwkgICAgICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKyAgICB9CisgICAgY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZnVuY3Rpb24gPSBOVUxMOworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19DWVpfSU5UUiAqLworCitzdGF0aWMgdm9pZAorY3l6X3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgRklSTV9JRCAqZmlybV9pZDsKKyAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBaRldfQ1RSTCAqemZ3X2N0cmw7CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQk9BUkRfQ1RSTCAqYm9hcmRfY3RybDsKKyAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMICpjaF9jdHJsOworICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKKyAgaW50IGNhcmQsIHBvcnQ7CisKKyAgICBjeXpfdGltZXJsaXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaKTsKKyAgICBmb3IgKGNhcmQgPSAwIDsgY2FyZCA8IE5SX0NBUkRTIDsgY2FyZCsrKXsKKwljaW5mbyA9ICZjeV9jYXJkW2NhcmRdOworCisJaWYgKCFJU19DWUNfWigqY2luZm8pKSBjb250aW51ZTsKKwlpZiAoIUlTWkxPQURFRCgqY2luZm8pKSBjb250aW51ZTsKKworCWZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwlib2FyZF9jdHJsID0gJih6ZndfY3RybC0+Ym9hcmRfY3RybCk7CisKKwkvKiBTa2lwIGZpcnN0IHBvbGxpbmcgY3ljbGUgdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgd2l0aCB0aGUgRlcgKi8KKwlpZiAoIWNpbmZvLT5pbnRyX2VuYWJsZWQpIHsKKwkgICAgY2luZm8tPm5wb3J0cyA9IChpbnQpIGN5X3JlYWRsKCZib2FyZF9jdHJsLT5uX2NoYW5uZWwpOworCSAgICBjaW5mby0+aW50cl9lbmFibGVkID0gMTsKKwkgICAgY29udGludWU7CisJfQorCisJY3l6X2hhbmRsZV9jbWQoY2luZm8pOworCisJZm9yIChwb3J0ID0gMCA7IHBvcnQgPCBjaW5mby0+bnBvcnRzIDsgcG9ydCsrKSB7CisJICAgIGluZm8gPSAmY3lfcG9ydFsgcG9ydCArIGNpbmZvLT5maXJzdF9saW5lIF07CisgICAgICAgICAgICB0dHkgPSBpbmZvLT50dHk7CisJICAgIGNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW3BvcnRdKTsKKwkgICAgYnVmX2N0cmwgPSAmKHpmd19jdHJsLT5idWZfY3RybFtwb3J0XSk7CisKKwkgICAgaWYgKCFpbmZvLT50aHJvdHRsZSkKKwkgICAgICAgIGN5el9oYW5kbGVfcngoaW5mbywgY2hfY3RybCwgYnVmX2N0cmwpOworCSAgICBjeXpfaGFuZGxlX3R4KGluZm8sIGNoX2N0cmwsIGJ1Zl9jdHJsKTsKKwl9CisJLyogcG9sbCBldmVyeSAnY3l6X3BvbGxpbmdfY3ljbGUnIHBlcmlvZCAqLworCWN5el90aW1lcmxpc3QuZXhwaXJlcyA9IGppZmZpZXMgKyBjeXpfcG9sbGluZ19jeWNsZTsKKyAgICB9CisgICAgYWRkX3RpbWVyKCZjeXpfdGltZXJsaXN0KTsKKworICAgIHJldHVybjsKK30gLyogY3l6X3BvbGwgKi8KKworI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCisvKioqKioqKioqKiBFbmQgb2YgYmxvY2sgb2YgQ3ljbGFkZXMtWiBzcGVjaWZpYyBjb2RlICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIHBvcnQgYmVjb21lcyBhY3RpdmU7CisgICBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGFuZCBEVFIgJiBSVFMgYXJlIHR1cm5lZCBvbi4KKyAqLworc3RhdGljIGludAorc3RhcnR1cChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCByZXR2YWwgPSAwOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB1bnNpZ25lZCBsb25nIHBhZ2U7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisKKyAgICBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworICAgIGlmICghcGFnZSkKKwlyZXR1cm4gLUVOT01FTTsKKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpeworCWZyZWVfcGFnZShwYWdlKTsKKwlnb3RvIGVycm91dDsKKyAgICB9CisKKyAgICBpZiAoIWluZm8tPnR5cGUpeworICAgICAgICBpZiAoaW5mby0+dHR5KXsKKyAgICAgICAgICAgIHNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisgICAgICAgIH0KKwlmcmVlX3BhZ2UocGFnZSk7CisJZ290byBlcnJvdXQ7CisgICAgfQorCisgICAgaWYgKGluZm8tPnhtaXRfYnVmKQorCWZyZWVfcGFnZShwYWdlKTsKKyAgICBlbHNlCisJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworICAgIHNldF9saW5lX2NoYXIoaW5mbyk7CisKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworI2lmZGVmIENZX0RFQlVHX09QRU4KKwlwcmludGsoImN5YyBzdGFydHVwIGNhcmQgJWQsIGNoaXAgJWQsIGNoYW5uZWwgJWQsIGJhc2VfYWRkciAlbHhcbiIsCisJICAgICBjYXJkLCBjaGlwLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOy8qKi8KKyNlbmRpZgorCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisKKwljeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworCisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCksIChpbmZvLT5kZWZhdWx0X3RpbWVvdXQKKwkJID8gaW5mby0+ZGVmYXVsdF90aW1lb3V0IDogMHgwMikpOyAvKiAxMG1zIHJ4IHRpbWVvdXQgKi8KKworCWN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLEN5Q0hBTl9DVEx8Q3lFTkJfUkNWUnxDeUVOQl9YTVRSLGluZGV4KTsKKworCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7CisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisKKyNpZmRlZiBDWV9ERUJVR19EVFIKKwlwcmludGsoImN5YzpzdGFydHVwIHJhaXNpbmcgRFRSXG4iKTsKKwlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAorCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7CisjZW5kaWYKKworCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5UnhEYXRhKTsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKworCWlmIChpbmZvLT50dHkpeworCSAgICBjbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJfQorCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlpbmZvLT5icmVha29uID0gaW5mby0+YnJlYWtvZmYgPSAwOworCW1lbXNldCgoY2hhciAqKSZpbmZvLT5pZGxlX3N0YXRzLCAwLCBzaXplb2YoaW5mby0+aWRsZV9zdGF0cykpOworCWluZm8tPmlkbGVfc3RhdHMuaW5fdXNlICAgID0KKwlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9CisJaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUgPSBqaWZmaWVzOworCisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworICAgICAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICAgICAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKyAgICAgIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7CisgICAgICBpbnQgcmV0dmFsOworCisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisKKyAgICAgICAgZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgICAgIGlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKXsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCisJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorCXByaW50aygiY3ljIHN0YXJ0dXAgWiBjYXJkICVkLCBjaGFubmVsICVkLCBiYXNlX2FkZHIgJWx4XG4iLAorCSAgICAgY2FyZCwgY2hhbm5lbCwgKGxvbmcpYmFzZV9hZGRyKTsvKiovCisjZW5kaWYKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCisJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLm9wX21vZGUsIENfQ0hfRU5BQkxFKTsKKyNpZmRlZiBaX1dBS0UKKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKKwljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0uaW50cl9lbmFibGUsIAorCQkgIENfSU5fVFhCRU1QVFl8Q19JTl9UWExPV1dNfENfSU5fUlhISVdNfENfSU5fUlhOTkRUfAorCQkgIENfSU5fSU9DVExXfAorCQkgIENfSU5fTURDRCk7CisjZWxzZQorCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5pbnRyX2VuYWJsZSwgCisJCSAgQ19JTl9JT0NUTFd8CisJCSAgQ19JTl9NRENEKTsKKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKyNlbHNlCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLmludHJfZW5hYmxlLCAKKwkJICBDX0lOX1RYQkVNUFRZfENfSU5fVFhMT1dXTXxDX0lOX1JYSElXTXxDX0lOX1JYTk5EVHwKKwkJICBDX0lOX01EQ0QpOworI2Vsc2UKKwljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0uaW50cl9lbmFibGUsIAorCQkgIENfSU5fTURDRCk7CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisjZW5kaWYgLyogWl9XQUtFICovCisKKwlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMLCAwTCk7CisJaWYgKHJldHZhbCAhPSAwKXsKKwkgICAgcHJpbnRrKCJjeWM6c3RhcnR1cCgxKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKwl9CisKKwkvKiBGbHVzaCBSWCBidWZmZXJzIGJlZm9yZSByYWlzaW5nIERUUiBhbmQgUlRTICovCisJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9GTFVTSF9SWCwgMEwpOworCWlmIChyZXR2YWwgIT0gMCl7CisJICAgIHByaW50aygiY3ljOnN0YXJ0dXAoMikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCisJLyogc2V0IHRpbWVvdXQgISEhICovCisJLyogc2V0IFJUUyBhbmQgRFRSICEhISAqLworCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpIHwgQ19SU19SVFMgfCBDX1JTX0RUUikgOworCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJICAgIGNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7CisJaWYgKHJldHZhbCAhPSAwKXsKKwkgICAgcHJpbnRrKCJjeWM6c3RhcnR1cCgzKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKwl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJICAgIHByaW50aygiY3ljOnN0YXJ0dXAgcmFpc2luZyBaIERUUlxuIik7CisjZW5kaWYKKworCS8qIGVuYWJsZSBzZW5kLCByZWN2LCBtb2RlbSAhISEgKi8KKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCWlmIChpbmZvLT50dHkpeworCSAgICBjbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJfQorCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlpbmZvLT5icmVha29uID0gaW5mby0+YnJlYWtvZmYgPSAwOworCW1lbXNldCgoY2hhciAqKSZpbmZvLT5pZGxlX3N0YXRzLCAwLCBzaXplb2YoaW5mby0+aWRsZV9zdGF0cykpOworCWluZm8tPmlkbGVfc3RhdHMuaW5fdXNlICAgID0KKwlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9CisJaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUgPSBqaWZmaWVzOworCisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICB9CisKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisJcHJpbnRrKCIgY3ljIHN0YXJ0dXAgZG9uZVxuIik7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30gLyogc3RhcnR1cCAqLworCisKK3N0YXRpYyB2b2lkCitzdGFydF94bWl0KCBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyApCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgY2hhbm5lbCk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLCAKKyAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpIHwgQ3lUeFJkeSk7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorICAgICAgaW50IHJldHZhbDsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lOVEJBQ0ssIDBMKTsKKwkgICAgaWYgKHJldHZhbCAhPSAwKXsKKwkJcHJpbnRrKCJjeWM6c3RhcnRfeG1pdCByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJICAgIH0KKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworI2Vsc2UgLyogQ09ORklHX0NZWl9JTlRSICovCisJLyogRG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBhdCB0aGlzIHRpbWUgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKyAgICB9Cit9IC8qIHN0YXJ0X3htaXQgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBzaHV0cyBkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLAorICogYW5kIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkCitzaHV0ZG93bihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisKKyAgICBpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSl7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworI2lmZGVmIENZX0RFQlVHX09QRU4KKyAgICBwcmludGsoImN5YyBzaHV0ZG93biBZIGNhcmQgJWQsIGNoaXAgJWQsIGNoYW5uZWwgJWQsIGJhc2VfYWRkciAlbHhcbiIsCisJCWNhcmQsIGNoaXAsIGNoYW5uZWwsIChsb25nKWJhc2VfYWRkcik7CisjZW5kaWYKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCisJICAgIC8qIENsZWFyIGRlbHRhX21zcl93YWl0IHF1ZXVlIHRvIGF2b2lkIG1lbSBsZWFrcy4gKi8KKwkgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkgICAgaWYgKGluZm8tPnhtaXRfYnVmKXsKKwkJdW5zaWduZWQgY2hhciAqIHRlbXA7CisJCXRlbXAgPSBpbmZvLT54bWl0X2J1ZjsKKwkJaW5mby0+eG1pdF9idWYgPSBOVUxMOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHRlbXApOworCSAgICB9CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJICAgIGlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpIHsKKwkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIH5DeURUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljIHNodXRkb3duIGRyb3BwaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJICAgIH0KKwkgICAgY3l5X2lzc3VlX2NtZChiYXNlX2FkZHIsQ3lDSEFOX0NUTHxDeURJU19SQ1ZSLGluZGV4KTsKKwkgICAgIC8qIGl0IG1heSBiZSBhcHByb3ByaWF0ZSB0byBjbGVhciBfWE1JVCBhdAorCSAgICAgICBzb21lIGxhdGVyIGRhdGUgKGFmdGVyIHRlc3RpbmcpISEhICovCisKKwkgICAgaWYgKGluZm8tPnR0eSl7CisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJICAgIH0KKwkgICAgaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgICAgICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgICAgICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICAgICAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKyAgICAgIGludCByZXR2YWw7CisKKwliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkcjsKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWMgc2h1dGRvd24gWiBjYXJkICVkLCBjaGFubmVsICVkLCBiYXNlX2FkZHIgJWx4XG4iLAorCQljYXJkLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOworI2VuZGlmCisKKyAgICAgICAgZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgICAgIGlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJICAgIHJldHVybjsKKwl9CisKKwl6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwljaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKworCSAgICBpZiAoaW5mby0+eG1pdF9idWYpeworCQl1bnNpZ25lZCBjaGFyICogdGVtcDsKKwkJdGVtcCA9IGluZm8tPnhtaXRfYnVmOworCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgdGVtcCk7CisJICAgIH0KKwkgICAgCisJICAgIGlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpIHsKKwkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgKHVjbG9uZykoY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgJiAKKyAgICAgICAgICAgICAgICAgICB+KENfUlNfUlRTIHwgQ19SU19EVFIpKSk7CisJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJCQljaGFubmVsLCBDX0NNX0lPQ1RMTSwgMEwpOworCQlpZiAocmV0dmFsICE9IDApeworCQkgICAgcHJpbnRrKCJjeWM6c2h1dGRvd24gcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCQkgICBpbmZvLT5saW5lLCByZXR2YWwpOworCQl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljOnNodXRkb3duIGRyb3BwaW5nIFogRFRSXG4iKTsKKyNlbmRpZgorCSAgICB9CisJICAgIAorCSAgICBpZiAoaW5mby0+dHR5KXsKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkgICAgfQorCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0KKworI2lmZGVmIENZX0RFQlVHX09QRU4KKyAgICBwcmludGsoIiBjeWMgc2h1dGRvd24gZG9uZVxuIik7CisjZW5kaWYKKyAgICByZXR1cm47Cit9IC8qIHNodXRkb3duICovCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3lfb3BlbigpIGFuZCBmcmllbmRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50CitibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8pCit7CisgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCBjaGlwLCBjaGFubmVsLGluZGV4OworICBpbnQgcmV0dmFsOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKworICAgIGNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjaW5mby0+Zmlyc3RfbGluZTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworICAgICAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorICAgICAqLworICAgIGlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8IChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpKSB7CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7CisJfQorICAgICAgICByZXR1cm4gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQKKyAgICAgKiBhbmQgdGhlbiBleGl0LgorICAgICAqLworICAgIGlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworICAgICAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisgICAgICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKyAgICAgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisgICAgICogY3lfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisgICAgICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKyAgICAgKi8KKyAgICByZXR2YWwgPSAwOworICAgIGFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5QyVkLCBjb3VudCA9ICVkXG4iLAorICAgICAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7LyoqLworI2VuZGlmCisgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisgICAgaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCWluZm8tPmNvdW50LS07CisgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyNpZmRlZiBDWV9ERUJVR19DT1VOVAorICAgIHByaW50aygiY3ljIGJsb2NrX3RpbF9yZWFkeTogKCVkKTogZGVjcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAorICAgICAgICBjdXJyZW50LT5waWQsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorICAgIGluZm8tPmJsb2NrZWRfb3BlbisrOworCisgICAgaWYgKCFJU19DWUNfWigqY2luZm8pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKwliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwl3aGlsZSAoMSkgeworCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpeworCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKwkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgQ3lSVFMpOworCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCSAgICBwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgcmFpc2luZyBEVFJcbiIpOworCQkgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwKKwkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJCX0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworCSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCSAgICBpZiAodHR5X2h1bmdfdXBfcChmaWxwKQorCSAgICB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICl7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/IAorCQkgICAgLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJJiYgKENfQ0xPQ0FMKHR0eSkKKwkJICAgIHx8IChjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSkgJiBDeURDRCkpKSB7CisJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKKwkgICAgfQorI2lmZGVmIENZX0RFQlVHX09QRU4KKwkgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisJCSAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKwkgICAgc2NoZWR1bGUoKTsKKwl9CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgICAgICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgICAgICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICAgICAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKyAgICAgIGludCByZXR2YWw7CisKKwliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyOworCWZpcm1faWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOworICAgICAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKXsKKyAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisJICAgIHJldHVybiAtRUlOVkFMOworCX0KKworCXpmd19jdHJsID0gYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwljaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisKKwl3aGlsZSAoMSkgeworCSAgICBpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSl7CisJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorCQkJY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgfAorCQkJKENfUlNfUlRTIHwgQ19SU19EVFIpKTsKKwkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtpbmZvLT5jYXJkXSwKKwkJCQkgICAgICAgY2hhbm5lbCwgQ19DTV9JT0NUTE0sIDBMKTsKKwkJaWYgKHJldHZhbCAhPSAwKXsKKwkJICAgIHByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJCX0KKyNpZmRlZiBDWV9ERUJVR19EVFIKKwkJcHJpbnRrKCJjeWM6YmxvY2tfdGlsX3JlYWR5IHJhaXNpbmcgWiBEVFJcbiIpOworI2VuZGlmCisJICAgIH0KKworCSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCSAgICBpZiAodHR5X2h1bmdfdXBfcChmaWxwKQorCSAgICB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICl7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCSAgICAtRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCSAgICAmJiAoQ19DTE9DQUwodHR5KQorCSAgICAgIHx8IChjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19zdGF0dXMpICYgQ19SU19EQ0QpKSkgeworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKKwkgICAgfQorI2lmZGVmIENZX0RFQlVHX09QRU4KKwkgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisJCSAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKwkgICAgc2NoZWR1bGUoKTsKKwl9CisgICAgfQorICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyAgICBpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpeworCWluZm8tPmNvdW50Kys7CisjaWZkZWYgQ1lfREVCVUdfQ09VTlQKKwlwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgKCVkKTogaW5jcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAorCSAgICBjdXJyZW50LT5waWQsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorICAgIH0KKyAgICBpbmZvLT5ibG9ja2VkX29wZW4tLTsKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWM6YmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisJICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOy8qKi8KKyNlbmRpZgorICAgIGlmIChyZXR2YWwpCisJcmV0dXJuIHJldHZhbDsKKyAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworICAgIHJldHVybiAwOworfSAvKiBibG9ja190aWxfcmVhZHkgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CisgKiBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludAorY3lfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICAqaW5mbzsKKyAgaW50IHJldHZhbCwgbGluZTsKKyAgdW5zaWduZWQgbG9uZyBwYWdlOworCisgICAgbGluZSA9IHR0eS0+aW5kZXg7CisgICAgaWYgKChsaW5lIDwgMCkgfHwgKE5SX1BPUlRTIDw9IGxpbmUpKXsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIGluZm8gPSAmY3lfcG9ydFtsaW5lXTsKKyAgICBpZiAoaW5mby0+bGluZSA8IDApeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgCisgICAgLyogSWYgdGhlIGNhcmQncyBmaXJtd2FyZSBoYXNuJ3QgYmVlbiBsb2FkZWQsCisgICAgICAgdHJlYXQgaXQgYXMgYWJzZW50IGZyb20gdGhlIHN5c3RlbS4gIFRoaXMKKyAgICAgICB3aWxsIG1ha2UgdGhlIHVzZXIgcGF5IGF0dGVudGlvbi4KKyAgICAqLworICAgIGlmIChJU19DWUNfWihjeV9jYXJkW2luZm8tPmNhcmRdKSkgeworCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOworCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKworICAgICAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKSB7CisJICAgIGlmICgoKFpFX1YxID09Y3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopCisJCShjaW5mby0+Y3RsX2FkZHIpKS0+bWFpbF9ib3hfMCkpICYmCisJCVpfRlBHQV9DSEVDSyAoKmNpbmZvKSkgJiYKKwkJKFpGSVJNX0hMVCA9PSBjeV9yZWFkbCAoJmZpcm1faWQtPnNpZ25hdHVyZSkpKQorCSAgICB7CisJCXByaW50ayAoImN5YzpDeWNsYWRlcy1aIEVycm9yOiB5b3UgbmVlZCBhbiBleHRlcm5hbCBwb3dlciBzdXBwbHkgZm9yIHRoaXMgbnVtYmVyIG9mIHBvcnRzLlxuXHJGaXJtd2FyZSBoYWx0ZWQuXHJcbiIpOworCSAgICB9IGVsc2UgeworCQlwcmludGsoImN5YzpDeWNsYWRlcy1aIGZpcm13YXJlIG5vdCB5ZXQgbG9hZGVkXG4iKTsKKwkgICAgfQorCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJZWxzZSB7CisJICAgIC8qIEluIGNhc2UgdGhpcyBaIGJvYXJkIGlzIG9wZXJhdGluZyBpbiBpbnRlcnJ1cHQgbW9kZSwgaXRzIAorCSAgICAgICBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkIGFzIHNvb24gYXMgdGhlIGZpcnN0IG9wZW4gaGFwcGVucyAKKwkgICAgICAgdG8gb25lIG9mIGl0cyBwb3J0cy4gKi8KKyAgICAgICAgICAgIGlmICghY2luZm8tPmludHJfZW5hYmxlZCkgeworCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisKKwkJemZ3X2N0cmwgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X3JlYWRsICgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCisJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKwkJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBjaGlwICovCisJCWN5X3dyaXRldyhjaW5mby0+Y3RsX2FkZHIrMHg2OCwKKwkJCWN5X3JlYWR3KGNpbmZvLT5jdGxfYWRkcisweDY4KXwweDA5MDApOworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgRlcgKi8KKwkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZChjaW5mbywKKwkJCQkJMCwgQ19DTV9JUlFfRU5CTCwgMEwpOworCQlpZiAocmV0dmFsICE9IDApeworCQkgICAgcHJpbnRrKCJjeWM6SVJRIGVuYWJsZSByZXR2YWwgd2FzICV4XG4iLCByZXR2YWwpOworCQl9CisJCWNpbmZvLT5ucG9ydHMgPSAoaW50KSBjeV9yZWFkbCAoJmJvYXJkX2N0cmwtPm5fY2hhbm5lbCk7CisJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAxOworCSAgICB9CisJfQorI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCS8qIE1ha2Ugc3VyZSB0aGlzIFogcG9ydCByZWFsbHkgZXhpc3RzIGluIGhhcmR3YXJlICovCisJaWYgKGluZm8tPmxpbmUgPiAoY2luZm8tPmZpcnN0X2xpbmUgKyBjaW5mby0+bnBvcnRzIC0gMSkpCisJCXJldHVybiAtRU5PREVWOworICAgIH0KKyNpZmRlZiBDWV9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3ljOmN5X29wZW4gdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKyNlbmRpZgorICAgIHR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworICAgIGluZm8tPnR0eSA9IHR0eTsKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X29wZW4iKSl7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisgICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKyAgICBpbmZvLT5jb3VudCsrOworI2lmZGVmIENZX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiAoJWQpOiBpbmNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCisgICAgICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQpOworI2VuZGlmCisgICAgaWYgKCF0bXBfYnVmKSB7CisJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJICAgIHJldHVybiAtRU5PTUVNOworCWlmICh0bXBfYnVmKQorCSAgICBmcmVlX3BhZ2UocGFnZSk7CisJZWxzZQorCSAgICB0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBwb3J0IGlzIHRoZSBtaWRkbGUgb2YgY2xvc2luZywgYmFpbCBvdXQgbm93CisgICAgICovCisgICAgaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCSAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwlyZXR1cm4gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAorICAgICAqLworICAgIHJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisgICAgaWYgKHJldHZhbCl7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisgICAgaWYgKHJldHZhbCkgeworI2lmZGVmIENZX0RFQlVHX09QRU4KKyAgICAgICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCisgICAgICAgICAgICAgICByZXR2YWwpOworI2VuZGlmCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgaW5mby0+dGhyb3R0bGUgPSAwOworCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorICAgIHByaW50aygiIGN5YzpjeV9vcGVuIGRvbmVcbiIpOy8qKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9IC8qIGN5X29wZW4gKi8KKworCisvKgorICogY3lfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CisgKi8KK3N0YXRpYyB2b2lkIAorY3lfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllczsKKyAgaW50IGNoYXJfdGltZTsKKwkKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3dhaXRfdW50aWxfc2VudCIpKQorCXJldHVybjsKKworICAgIGlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQorCXJldHVybjsgLyogSnVzdCBpbiBjYXNlLi4uLiAqLworCisKKyAgICBvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworICAgIC8qCisgICAgICogU2V0IHRoZSBjaGVjayBpbnRlcnZhbCB0byBiZSAxLzUgb2YgdGhlIGVzdGltYXRlZCB0aW1lIHRvCisgICAgICogc2VuZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuICBUaGUgY2hlY2sKKyAgICAgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCisgICAgICogCisgICAgICogTm90ZTogd2UgaGF2ZSB0byB1c2UgcHJldHR5IHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5CisgICAgICogdGhlIE5JU1QtUENUUy4KKyAgICAgKi8KKyAgICBjaGFyX3RpbWUgPSAoaW5mby0+dGltZW91dCAtIEhaLzUwKSAvIGluZm8tPnhtaXRfZmlmb19zaXplOworICAgIGNoYXJfdGltZSA9IGNoYXJfdGltZSAvIDU7CisgICAgaWYgKGNoYXJfdGltZSA8PSAwKQorCWNoYXJfdGltZSA9IDE7CisgICAgaWYgKHRpbWVvdXQgPCAwKQorCXRpbWVvdXQgPSAwOworICAgIGlmICh0aW1lb3V0KQorCWNoYXJfdGltZSA9IG1pbihjaGFyX3RpbWUsIHRpbWVvdXQpOworICAgIC8qCisgICAgICogSWYgdGhlIHRyYW5zbWl0dGVyIGhhc24ndCBjbGVhcmVkIGluIHR3aWNlIHRoZSBhcHByb3hpbWF0ZQorICAgICAqIGFtb3VudCBvZiB0aW1lIHRvIHNlbmQgdGhlIGVudGlyZSBGSUZPLCBpdCBwcm9iYWJseSB3b24ndAorICAgICAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdworICAgICAqIGNvbnRyb2wsIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gIEhlbmNlLCBpZiBpdCBldmVyCisgICAgICogdGFrZXMgbG9uZ2VyIHRoYW4gaW5mby0+dGltZW91dCwgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYQorICAgICAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKKyAgICAgKiAyKmluZm8tPnRpbWVvdXQuCisgICAgICovCisgICAgaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyKmluZm8tPnRpbWVvdXQpCisJdGltZW91dCA9IDIqaW5mby0+dGltZW91dDsKKyNpZmRlZiBDWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKKyAgICBwcmludGsoIkluIGN5X3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwgdGltZW91dCwgY2hhcl90aW1lKTsKKyAgICBwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CisjZW5kaWYKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisJd2hpbGUgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgQ3lUeFJkeSkgeworI2lmZGVmIENZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCSAgICBwcmludGsoIk5vdCBjbGVhbiAoamlmZj0lbHUpLi4uIiwgamlmZmllcyk7CisjZW5kaWYKKwkgICAgaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSkpCisJCWJyZWFrOworCSAgICBpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQorCQlicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwkvLyBOb3RoaW5nIHRvIGRvIQorICAgIH0KKyAgICAvKiBSdW4gb25lIG1vcmUgY2hhciBjeWNsZSAqLworICAgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lICogNSkpOworI2lmZGVmIENZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorICAgIHByaW50aygiQ2xlYW4gKGppZmY9JWx1KS4uLmRvbmVcbiIsIGppZmZpZXMpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UgaXMgY2xvc2VkLgorICovCitzdGF0aWMgdm9pZAorY3lfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfY2xvc2UgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCisgICAgaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9jbG9zZSIpKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIC8qIElmIHRoZSBUVFkgaXMgYmVpbmcgaHVuZyB1cCwgbm90aGluZyB0byBkbyAqLworICAgIGlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAgCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorICAgIHByaW50aygiY3ljOmN5X2Nsb3NlIHR0eUMlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisgICAgaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworICAgICAgICAvKgorICAgICAgICAgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorICAgICAgICAgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKKyAgICAgICAgICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorICAgICAgICAgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKyAgICAgICAgICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisgICAgICAgICAqLworICAgICAgICBwcmludGsoImN5YzpjeV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKyAgICAgICAgICAgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisgICAgICAgIGluZm8tPmNvdW50ID0gMTsKKyAgICB9CisjaWZkZWYgQ1lfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzpjeV9jbG9zZSBhdCAoJWQpOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCisgICAgICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQgLSAxKTsKKyNlbmRpZgorICAgIGlmICgtLWluZm8tPmNvdW50IDwgMCkgeworI2lmZGVmIENZX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6Y3ljX2Nsb3NlIHNldHRpbmcgY291bnQgdG8gMFxuIik7CisjZW5kaWYKKyAgICAgICAgaW5mby0+Y291bnQgPSAwOworICAgIH0KKyAgICBpZiAoaW5mby0+Y291bnQpIHsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKyAgICAvKgorICAgICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKKyAgICAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisgICAgKi8KKyAgICB0dHktPmNsb3NpbmcgPSAxOworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBDWV9DTE9TSU5HX1dBSVRfTk9ORSkgeworCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOworICAgIH0KKyAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKworICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKKwlpbnQgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmU7CisJaW50IGluZGV4ID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5idXNfaW5kZXg7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHIgPSBjeV9jYXJkW2luZm8tPmNhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGFubmVsPj4yXSA8PCBpbmRleCk7CisJLyogU3RvcCBhY2NlcHRpbmcgaW5wdXQgKi8KKwljaGFubmVsICY9IDB4MDM7CisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKwljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKwkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgfkN5UnhEYXRhKTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCSAgICAvKiBXYWl0aW5nIGZvciBvbi1ib2FyZCBidWZmZXJzIHRvIGJlIGVtcHR5IGJlZm9yZSBjbG9zaW5nIAorCSAgICAgICB0aGUgcG9ydCAqLworCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCSAgICBjeV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJfQorICAgIH0gZWxzZSB7CisjaWZkZWYgWl9XQUtFCisJLyogV2FpdGluZyBmb3Igb24tYm9hcmQgYnVmZmVycyB0byBiZSBlbXB0eSBiZWZvcmUgY2xvc2luZyB0aGUgcG9ydCAqLworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHI7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsID0gYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCWludCBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbaW5mby0+Y2FyZF0uZmlyc3RfbGluZTsKKwlpbnQgcmV0dmFsOworCisJaWYgKGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLmZsb3dfc3RhdHVzKSAhPSBDX0ZTX1RYSURMRSkgeworCSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLCBjaGFubmVsLCAKKwkJCQkgICBDX0NNX0lPQ1RMVywgMEwpOworCSAgICBpZiAocmV0dmFsICE9IDApeworCQlwcmludGsoImN5YzpjeV9jbG9zZSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJICAgIH0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+c2h1dGRvd25fd2FpdCk7CisJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgc2h1dGRvd24oaW5mbyk7CisgICAgaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisgICAgICAgIHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKyAgICB0dHlfbGRpc2NfZmx1c2godHR5KTsgICAgICAgIAorICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCisgICAgdHR5LT5jbG9zaW5nID0gMDsKKyAgICBpbmZvLT5ldmVudCA9IDA7CisgICAgaW5mby0+dHR5ID0gTlVMTDsKKyAgICBpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICAgICAgaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisgICAgICAgICAgICBtc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisgICAgICAgIH0KKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIH0KKyAgICBpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCIgY3ljOmN5X2Nsb3NlIGRvbmVcbiIpOworI2VuZGlmCisKKyAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIHJldHVybjsKK30gLyogY3lfY2xvc2UgKi8KKworCisvKiBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgd2hlbiB0dHlfd3JpdGUgaGFzIHB1dCBzb21ldGhpbmcgaW50bworICogdGhlIHdyaXRlX3F1ZXVlLiAgVGhlIGNoYXJhY3RlcnMgbWF5IGNvbWUgZnJvbSB1c2VyIHNwYWNlIG9yCisgKiBrZXJuZWwgc3BhY2UuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseQorICogYWNjZXB0ZWQgZm9yIHdyaXRpbmcuCisgKgorICogSWYgdGhlIHBvcnQgaXMgbm90IGFscmVhZHkgdHJhbnNtaXR0aW5nIHN0dWZmLCBzdGFydCBpdCBvZmYgYnkKKyAqIGVuYWJsaW5nIGludGVycnVwdHMuICBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB3aWxsIHRoZW4KKyAqIGVuc3VyZSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSBzZW50LgorICogSWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2ljayBpdC4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK2N5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgYywgcmV0ID0gMDsKKworI2lmZGVmIENZX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeWM6Y3lfd3JpdGUgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV93cml0ZSIpKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICAgICAKKyAgICBpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYgfHwgIXRtcF9idWYpeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKyAgICB3aGlsZSAoMSkgeworCWMgPSBtaW4oY291bnQsIG1pbigoaW50KShTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxKSwKKwkJCShpbnQpKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQpKSk7CisJICAgICAgICAKKwlpZiAoYyA8PSAwKQorCSAgICBicmVhazsKKworCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwlpbmZvLT54bWl0X2NudCArPSBjOworCWJ1ZiArPSBjOworCWNvdW50IC09IGM7CisJcmV0ICs9IGM7CisgICAgfQorICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKyAgICBpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMgKz0gcmV0OworICAgIGluZm8tPmlkbGVfc3RhdHMueG1pdF9pZGxlICAgPSBqaWZmaWVzOworCisgICAgaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkgeworICAgICAgICBzdGFydF94bWl0KGluZm8pOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfSAvKiBjeV93cml0ZSAqLworCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgdG8gd3JpdGUgYSBzaW5nbGUKKyAqIGNoYXJhY3RlciB0byB0aGUgdHR5IGRldmljZS4gIElmIHRoZSBrZXJuZWwgdXNlcyB0aGlzIHJvdXRpbmUsCisgKiBpdCBtdXN0IGNhbGwgdGhlIGZsdXNoX2NoYXJzKCkgcm91dGluZSAoaWYgZGVmaW5lZCkgd2hlbiBpdCBpcworICogZG9uZSBzdHVmZmluZyBjaGFyYWN0ZXJzIGludG8gdGhlIGRyaXZlci4gIElmIHRoZXJlIGlzIG5vIHJvb20KKyAqIGluIHRoZSBxdWV1ZSwgdGhlIGNoYXJhY3RlciBpcyBpZ25vcmVkLgorICovCitzdGF0aWMgdm9pZAorY3lfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ1lfREVCVUdfSU8KKyAgICBwcmludGsoImN5YzpjeV9wdXRfY2hhciB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3B1dF9jaGFyIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKyAgICAgICAgcmV0dXJuOworCisgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisgICAgICAgIGlmIChpbmZvLT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgeworCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisgICAgICAgIGluZm8tPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKyAgICAgICAgaW5mby0+eG1pdF9jbnQrKzsKKwlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMrKzsKKwlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSA9IGppZmZpZXM7CisgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKK30gLyogY3lfcHV0X2NoYXIgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2VybmVsIGFmdGVyIGl0IGhhcyB3cml0dGVuIGEKKyAqIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHRvIHRoZSB0dHkgZGV2aWNlIHVzaW5nIHB1dF9jaGFyKCkuICAKKyAqLworc3RhdGljIHZvaWQKK2N5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWZkZWYgQ1lfREVCVUdfSU8KKyAgICBwcmludGsoImN5YzpjeV9mbHVzaF9jaGFycyB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2ZsdXNoX2NoYXJzIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZAorICAgIHx8IHR0eS0+aHdfc3RvcHBlZCB8fCAhaW5mby0+eG1pdF9idWYpCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXJ0X3htaXQoaW5mbyk7Cit9IC8qIGN5X2ZsdXNoX2NoYXJzICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBudW1iZXJzIG9mIGNoYXJhY3RlcnMgdGhlIHR0eSBkcml2ZXIKKyAqIHdpbGwgYWNjZXB0IGZvciBxdWV1aW5nIHRvIGJlIHdyaXR0ZW4uICBUaGlzIG51bWJlciBpcyBzdWJqZWN0CisgKiB0byBjaGFuZ2UgYXMgb3V0cHV0IGJ1ZmZlcnMgZ2V0IGVtcHRpZWQsIG9yIGlmIHRoZSBvdXRwdXQgZmxvdworICogY29udHJvbCBpcyBhY3RpdmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK2N5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICBpbnQgICByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2lmZGVmIENZX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeWM6Y3lfd3JpdGVfcm9vbSB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3dyaXRlX3Jvb20iKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0ID0gMDsKKyAgICByZXR1cm4gcmV0OworfSAvKiBjeV93cml0ZV9yb29tICovCisKKworc3RhdGljIGludAorY3lfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsIGNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfY2hhcnNfaW5fYnVmZmVyIikpCisgICAgICAgIHJldHVybiAwOworCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCisjaWZkZWYgWl9FWFRfQ0hBUlNfSU5fQlVGRkVSCisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworI2VuZGlmIC8qIFpfRVhUX0NIQVJTX0lOX0JVRkZFUiAqLworI2lmZGVmIENZX0RFQlVHX0lPCisJcHJpbnRrKCJjeWM6Y3lfY2hhcnNfaW5fYnVmZmVyIHR0eUMlZCAlZFxuIiwKKwkJaW5mby0+bGluZSwgaW5mby0+eG1pdF9jbnQpOyAvKiAqLworI2VuZGlmCisJcmV0dXJuIGluZm8tPnhtaXRfY250OworI2lmZGVmIFpfRVhUX0NIQVJTX0lOX0JVRkZFUgorICAgIH0gZWxzZSB7CisJc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQ0hfQ1RSTCAqY2hfY3RybDsKKwlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKKwlpbnQgY2hhcl9jb3VudDsKKwl2b2xhdGlsZSB1Y2xvbmcgdHhfcHV0LCB0eF9nZXQsIHR4X2J1ZnNpemU7CisKKwlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCXpmd19jdHJsID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwljaF9jdHJsID0gJih6ZndfY3RybC0+Y2hfY3RybFtjaGFubmVsXSk7CisJYnVmX2N0cmwgPSAmKHpmd19jdHJsLT5idWZfY3RybFtjaGFubmVsXSk7CisKKwl0eF9nZXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X2dldCk7CisJdHhfcHV0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9wdXQpOworCXR4X2J1ZnNpemUgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X2J1ZnNpemUpOworCWlmICh0eF9wdXQgPj0gdHhfZ2V0KQorCSAgICBjaGFyX2NvdW50ID0gdHhfcHV0IC0gdHhfZ2V0OworCWVsc2UKKwkgICAgY2hhcl9jb3VudCA9IHR4X3B1dCAtIHR4X2dldCArIHR4X2J1ZnNpemU7CisjaWZkZWYgQ1lfREVCVUdfSU8KKwlwcmludGsoImN5YzpjeV9jaGFyc19pbl9idWZmZXIgdHR5QyVkICVkXG4iLAorCQlpbmZvLT5saW5lLCBpbmZvLT54bWl0X2NudCArIGNoYXJfY291bnQpOyAvKiAqLworI2VuZGlmCisJcmV0dXJuIChpbmZvLT54bWl0X2NudCArIGNoYXJfY291bnQpOworICAgIH0KKyNlbmRpZiAvKiBaX0VYVF9DSEFSU19JTl9CVUZGRVIgKi8KK30gLyogY3lfY2hhcnNfaW5fYnVmZmVyICovCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3lfaW9jdGwoKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIHZvaWQKK2N5eV9iYXVkX2NhbGMoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sIHVjbG9uZyBiYXVkKQoreworICAgIGludCBjbywgY29fdmFsLCBicHI7CisgICAgdWNsb25nIGN5X2Nsb2NrID0gKChpbmZvLT5jaGlwX3JldiA+PSBDRDE0MDBfUkVWX0opID8gNjAwMDAwMDAgOiAyNTAwMDAwMCk7CisKKyAgICBpZiAoYmF1ZCA9PSAwKSB7CisJaW5mby0+dGJwciA9IGluZm8tPnRjbyA9IGluZm8tPnJicHIgPSBpbmZvLT5yY28gPSAwOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBkZXRlcm1pbmUgd2hpY2ggcHJlc2NhbGVyIHRvIHVzZSAqLworICAgIGZvciAoY28gPSA0LCBjb192YWwgPSAyMDQ4OyBjbzsgY28tLSwgY29fdmFsID4+PSAyKSB7CisJaWYgKGN5X2Nsb2NrIC8gY29fdmFsIC8gYmF1ZCA+IDYzKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICBicHIgPSAoY3lfY2xvY2sgLyBjb192YWwgKiAyIC8gYmF1ZCArIDEpIC8gMjsKKyAgICBpZiAoYnByID4gMjU1KQorCWJwciA9IDI1NTsKKworICAgIGluZm8tPnRicHIgPSBpbmZvLT5yYnByID0gYnByOworICAgIGluZm8tPnRjbyA9IGluZm8tPnJjbyA9IGNvOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGZpbmRzIG9yIGNvbXB1dGVzIHRoZSB2YXJpb3VzIGxpbmUgY2hhcmFjdGVyaXN0aWNzLgorICogSXQgdXNlZCB0byBiZSBjYWxsZWQgY29uZmlnX3NldHVwCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbGluZV9jaGFyKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbykKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisgIGludCBjYXJkLGNoaXAsY2hhbm5lbCxpbmRleDsKKyAgdW5zaWduZWQgY2ZsYWcsIGlmbGFnOworICB1bnNpZ25lZCBzaG9ydCBjaGlwX251bWJlcjsKKyAgaW50IGJhdWQsIGJhdWRfcmF0ZSA9IDA7CisgIGludCAgIGk7CisKKworICAgIGlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpbmZvLT5saW5lID09IC0xKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKyAgICBpZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKworICAgIC8qCisgICAgICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKyAgICAgKi8KKyAgICBpZiAoaW5mby0+dHR5KSB7CisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJICAgIGluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCSAgICBpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJICAgIGluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJICAgIGluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworICAgIH0KKworICAgIGNhcmQgPSBpbmZvLT5jYXJkOworICAgIGNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKKyAgICBjaGlwX251bWJlciA9IGNoYW5uZWwgLyA0OworCisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCisJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKworCS8qIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCWlmICgoYmF1ZCA9PSAzODQwMCkgJiYKKwkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpIHsKKwkgICAgaWYgKGluZm8tPmN1c3RvbV9kaXZpc29yKQorCQliYXVkX3JhdGUgPSBpbmZvLT5iYXVkIC8gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisJICAgIGVsc2UKKwkJYmF1ZF9yYXRlID0gaW5mby0+YmF1ZDsKKwl9IGVsc2UgaWYgKGJhdWQgPiBDRDE0MDBfTUFYX1NQRUVEKSB7CisJICAgIGJhdWQgPSBDRDE0MDBfTUFYX1NQRUVEOworCX0KKwkvKiBmaW5kIHRoZSBiYXVkIGluZGV4ICovCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkgICAgaWYgKGJhdWQgPT0gYmF1ZF90YWJsZVtpXSkgeworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAoaSA9PSAyMCkgeworCSAgICBpID0gMTk7IC8qIENEMTQwMF9NQVhfU1BFRUQgKi8KKwl9IAorCisJaWYgKChiYXVkID09IDM4NDAwKSAmJgorCSAgICAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkgeworCSAgICBjeXlfYmF1ZF9jYWxjKGluZm8sIGJhdWRfcmF0ZSk7CisJfSBlbHNlIHsKKwkgICAgaWYoaW5mby0+Y2hpcF9yZXYgPj0gQ0QxNDAwX1JFVl9KKSB7CisJCS8qIEl0IGlzIGEgQ0QxNDAwIHJldi4gSiBvciBsYXRlciAqLworCQlpbmZvLT50YnByID0gYmF1ZF9icHJfNjBbaV07IC8qIFR4IEJQUiAqLworCQlpbmZvLT50Y28gPSBiYXVkX2NvXzYwW2ldOyAvKiBUeCBDTyAqLworCQlpbmZvLT5yYnByID0gYmF1ZF9icHJfNjBbaV07IC8qIFJ4IEJQUiAqLworCQlpbmZvLT5yY28gPSBiYXVkX2NvXzYwW2ldOyAvKiBSeCBDTyAqLworCSAgICB9IGVsc2UgeworCQlpbmZvLT50YnByID0gYmF1ZF9icHJfMjVbaV07IC8qIFR4IEJQUiAqLworCQlpbmZvLT50Y28gPSBiYXVkX2NvXzI1W2ldOyAvKiBUeCBDTyAqLworCQlpbmZvLT5yYnByID0gYmF1ZF9icHJfMjVbaV07IC8qIFJ4IEJQUiAqLworCQlpbmZvLT5yY28gPSBiYXVkX2NvXzI1W2ldOyAvKiBSeCBDTyAqLworCSAgICB9CisJfQorCWlmIChiYXVkX3RhYmxlW2ldID09IDEzNCkgeworCSAgICAvKiBnZXQgaXQgcmlnaHQgZm9yIDEzNC41IGJhdWQgKi8KKwkgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWiozMC8yNjkpICsgMjsKKwl9IGVsc2UgaWYgKChiYXVkID09IDM4NDAwKSAmJgorCQkgICAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkgeworCSAgICBpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKjE1L2JhdWRfcmF0ZSkgKyAyOworCX0gZWxzZSBpZiAoYmF1ZF90YWJsZVtpXSkgeworCSAgICBpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKjE1L2JhdWRfdGFibGVbaV0pICsgMjsKKwkgICAgLyogdGhpcyBuZWVkcyB0byBiZSBwcm9wYWdhdGVkIGludG8gdGhlIGNhcmQgaW5mbyAqLworCX0gZWxzZSB7CisJICAgIGluZm8tPnRpbWVvdXQgPSAwOworCX0KKwkvKiBCeSB0cmFkaXRpb24gKGlzIGl0IGEgc3RhbmRhcmQ/KSBhIGJhdWQgcmF0ZSBvZiB6ZXJvCisJICAgaW1wbGllcyB0aGUgbGluZSBzaG91bGQgYmUvaGFzIGJlZW4gY2xvc2VkLiAgQSBiaXQKKwkgICBsYXRlciBpbiB0aGlzIHJvdXRpbmUgc3VjaCBhIHRlc3QgaXMgcGVyZm9ybWVkLiAqLworCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlpbmZvLT5jb3I1ID0gMDsKKwlpbmZvLT5jb3I0ID0gMDsKKwlpbmZvLT5jb3IzID0gKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkCisJCSAgICAgID8gaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQKKwkJICAgICAgOiBiYXVkX2NvcjNbaV0pOyAvKiByZWNlaXZlIHRocmVzaG9sZCAqLworCWluZm8tPmNvcjIgPSBDeUVUQzsKKwlzd2l0Y2goY2ZsYWcgJiBDU0laRSl7CisJY2FzZSBDUzU6CisJICAgIGluZm8tPmNvcjEgPSBDeV81X0JJVFM7CisJICAgIGJyZWFrOworCWNhc2UgQ1M2OgorCSAgICBpbmZvLT5jb3IxID0gQ3lfNl9CSVRTOworCSAgICBicmVhazsKKwljYXNlIENTNzoKKwkgICAgaW5mby0+Y29yMSA9IEN5XzdfQklUUzsKKwkgICAgYnJlYWs7CisJY2FzZSBDUzg6CisJICAgIGluZm8tPmNvcjEgPSBDeV84X0JJVFM7CisJICAgIGJyZWFrOworCX0KKwlpZihjZmxhZyAmIENTVE9QQil7CisJICAgIGluZm8tPmNvcjEgfD0gQ3lfMl9TVE9QOworCX0KKwlpZiAoY2ZsYWcgJiBQQVJFTkIpeworCSAgICBpZiAoY2ZsYWcgJiBQQVJPREQpeworCQlpbmZvLT5jb3IxIHw9IEN5UEFSSVRZX087CisJICAgIH1lbHNleworCQlpbmZvLT5jb3IxIHw9IEN5UEFSSVRZX0U7CisJICAgIH0KKwl9ZWxzZXsKKwkgICAgaW5mby0+Y29yMSB8PSBDeVBBUklUWV9OT05FOworCX0KKwkgICAgCisJLyogQ1RTIGZsb3cgY29udHJvbCBmbGFnICovCisJaWYgKGNmbGFnICYgQ1JUU0NUUyl7CisJICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCSAgICBpbmZvLT5jb3IyIHw9IEN5Q3RzQUU7CisJfWVsc2V7CisJICAgIGluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkgICAgaW5mby0+Y29yMiAmPSB+Q3lDdHNBRTsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCSAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgICAgVGhlIGhhcmR3YXJlIG9wdGlvbiwgQ3lSdHNBTywgcHJlc2VudHMgUlRTIHdoZW4KKwkgICAgdGhlIGNoaXAgaGFzIGNoYXJhY3RlcnMgdG8gc2VuZC4gIFNpbmNlIG1vc3QgbW9kZW1zCisJICAgIHVzZSBSVFMgYXMgcmV2ZXJzZSAoaW5ib3VuZCkgZmxvdyBjb250cm9sLCB0aGlzCisJICAgIG9wdGlvbiBpcyBub3QgdXNlZC4gIElmIGluYm91bmQgZmxvdyBjb250cm9sIGlzCisJICAgIG5lY2Vzc2FyeSwgRFRSIGNhbiBiZSBwcm9ncmFtbWVkIHRvIHByb3ZpZGUgdGhlCisJICAgIGFwcHJvcHJpYXRlIHNpZ25hbHMgZm9yIHVzZSB3aXRoIGEgbm9uLXN0YW5kYXJkCisJICAgIGNhYmxlLiAgQ29udGFjdCBNYXJjaW8gU2FpdG8gZm9yIGRldGFpbHMuCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKworCSAgIC8qIHR4IGFuZCByeCBiYXVkIHJhdGUgKi8KKworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVRDT1I8PGluZGV4KSwgaW5mby0+dGNvKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lUQlBSPDxpbmRleCksIGluZm8tPnRicHIpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJDT1I8PGluZGV4KSwgaW5mby0+cmNvKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSQlBSPDxpbmRleCksIGluZm8tPnJicHIpOworCisJICAgIC8qIHNldCBsaW5lIGNoYXJhY3RlcmlzdGljcyAgYWNjb3JkaW5nIGNvbmZpZ3VyYXRpb24gKi8KKworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNDSFIxPDxpbmRleCksIAorCQkgICAgICBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNDSFIyPDxpbmRleCksIAorCQkgICAgICBTVE9QX0NIQVIoaW5mby0+dHR5KSk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SMTw8aW5kZXgpLCBpbmZvLT5jb3IxKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDT1IyPDxpbmRleCksIGluZm8tPmNvcjIpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNPUjM8PGluZGV4KSwgaW5mby0+Y29yMyk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SNDw8aW5kZXgpLCBpbmZvLT5jb3I0KTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDT1I1PDxpbmRleCksIGluZm8tPmNvcjUpOworCisJICAgIGN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLAorCQkgICAgIEN5Q09SX0NIQU5HRXxDeUNPUjFjaHxDeUNPUjJjaHxDeUNPUjNjaCxpbmRleCk7CisKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgCisJCSAgICAgICh1X2NoYXIpY2hhbm5lbCk7IC8qICEhISBJcyB0aGlzIG5lZWRlZD8gKi8KKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCksIChpbmZvLT5kZWZhdWx0X3RpbWVvdXQKKwkJCQkJICAgICAgICAgPyBpbmZvLT5kZWZhdWx0X3RpbWVvdXQKKwkJCQkJICAgICAgICAgOiAweDAyKSk7IC8qIDEwbXMgcnggdGltZW91dCAqLworCisJICAgIGlmIChDX0NMT0NBTChpbmZvLT50dHkpKSB7CisJCS8qIHdpdGhvdXQgbW9kZW0gaW50ciAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5TWRtQ2gpOyAKKwkJCQkJLyogYWN0IG9uIDEtPjAgbW9kZW0gdHJhbnNpdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGNmbGFnICYgQ1JUU0NUUykgJiYgaW5mby0+cmZsb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjE8PGluZGV4KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEN5Q1RTfHJmbG93X3RocltpXSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IxPDxpbmRleCksIEN5Q1RTKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJCS8qIGFjdCBvbiAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCisJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjI8PGluZGV4KSwgQ3lDVFMpOworCSAgICB9IGVsc2UgeworCQkvKiB3aXRob3V0IG1vZGVtIGludHIgKi8KKwkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCisgICAgICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgfCBDeU1kbUNoKTsgCisJCQkJCS8qIGFjdCBvbiAxLT4wIG1vZGVtIHRyYW5zaXRpb25zICovCisgICAgICAgICAgICAgICAgaWYgKChjZmxhZyAmIENSVFNDVFMpICYmIGluZm8tPnJmbG93KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IxPDxpbmRleCksIAorICAgICAgICAJICAgICAgICAgICAgICAgICAgKEN5RFNSfEN5Q1RTfEN5Ukl8Q3lEQ0R8cmZsb3dfdGhyW2ldKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjE8PGluZGV4KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3lEU1J8Q3lDVFN8Q3lSSXxDeURDRCk7CisgICAgICAgICAgICAgICAgfQorCQkJCQkvKiBhY3Qgb24gMC0+MSBtb2RlbSB0cmFuc2l0aW9ucyAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IyPDxpbmRleCksIAorCQkJICBDeURTUnxDeUNUU3xDeVJJfEN5RENEKTsKKwkgICAgfQorCisJICAgIGlmKGkgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCisJICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCB+Q3lEVFIpOworCQl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljOnNldF9saW5lX2NoYXIgZHJvcHBpbmcgRFRSXG4iKTsKKwkJcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIEN5UlRTKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENZX0RFQlVHX0RUUgorCQlwcmludGsoImN5YzpzZXRfbGluZV9jaGFyIHJhaXNpbmcgRFRSXG4iKTsKKwkJcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwKKwkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwKKwkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7CisjZW5kaWYKKwkgICAgfQorCisJICAgIGlmIChpbmZvLT50dHkpeworCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJICAgIH0KKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgICAgICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgICAgICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICAgICAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKyAgICAgIHN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKKyAgICAgIHVjbG9uZyBzd19mbG93OworICAgICAgaW50IHJldHZhbDsKKworICAgICAgICBmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworICAgICAgICBpZiAoIUlTWkxPQURFRChjeV9jYXJkW2NhcmRdKSkgeworCSAgICByZXR1cm47CisJfQorCisJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJY2hfY3RybCA9ICYoemZ3X2N0cmwtPmNoX2N0cmxbY2hhbm5lbF0pOworCWJ1Zl9jdHJsID0gJnpmd19jdHJsLT5idWZfY3RybFtjaGFubmVsXTsKKworCS8qIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCWlmICgoYmF1ZCA9PSAzODQwMCkgJiYKKwkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpIHsKKwkgICAgaWYgKGluZm8tPmN1c3RvbV9kaXZpc29yKQorCQliYXVkX3JhdGUgPSBpbmZvLT5iYXVkIC8gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisJICAgIGVsc2UKKwkJYmF1ZF9yYXRlID0gaW5mby0+YmF1ZDsKKwl9IGVsc2UgaWYgKGJhdWQgPiBDWVpfTUFYX1NQRUVEKSB7CisJICAgIGJhdWQgPSBDWVpfTUFYX1NQRUVEOworCX0KKwljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fYmF1ZCAsIGJhdWQpOworCisJaWYgKGJhdWQgPT0gMTM0KSB7CisJICAgIC8qIGdldCBpdCByaWdodCBmb3IgMTM0LjUgYmF1ZCAqLworCSAgICBpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKjMwLzI2OSkgKyAyOworCX0gZWxzZSBpZiAoKGJhdWQgPT0gMzg0MDApICYmCisJCSAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKSB7CisJICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMTUvYmF1ZF9yYXRlKSArIDI7CisJfSBlbHNlIGlmIChiYXVkKSB7CisJICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMTUvYmF1ZCkgKyAyOworCSAgICAvKiB0aGlzIG5lZWRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUgY2FyZCBpbmZvICovCisJfSBlbHNlIHsKKwkgICAgaW5mby0+dGltZW91dCA9IDA7CisJfQorCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2goY2ZsYWcgJiBDU0laRSl7CisJY2FzZSBDUzU6IGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wgLCBDX0RMX0NTNSk7IGJyZWFrOworCWNhc2UgQ1M2OiBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sICwgQ19ETF9DUzYpOyBicmVhazsKKwljYXNlIENTNzogY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCAsIENfRExfQ1M3KTsgYnJlYWs7CisJY2FzZSBDUzg6IGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wgLCBDX0RMX0NTOCk7IGJyZWFrOworCX0KKwlpZihjZmxhZyAmIENTVE9QQil7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wsCisgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wpIHwgQ19ETF8yU1RPUCk7CisJfWVsc2V7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wsCisgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wpIHwgQ19ETF8xU1RPUCk7CisJfQorCWlmIChjZmxhZyAmIFBBUkVOQil7CisJICAgIGlmIChjZmxhZyAmIFBBUk9ERCl7CisJCWN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9wYXJpdHkgLCBDX1BSX09ERCk7CisJICAgIH1lbHNleworCQljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fcGFyaXR5ICwgQ19QUl9FVkVOKTsKKwkgICAgfQorCX1lbHNleworCSAgICBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fcGFyaXR5ICwgQ19QUl9OT05FKTsKKwl9CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgKi8KKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKXsKKwkgICAgY3lfd3JpdGVsKCZjaF9jdHJsLT5od19mbG93LAorICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmwtPmh3X2Zsb3cpIHwgQ19SU19DVFMgfCBDX1JTX1JUUyk7CisJfWVsc2V7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+aHdfZmxvdywKKyAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5od19mbG93KSAmIH4oQ19SU19DVFMgfCBDX1JTX1JUUykpOworCX0KKwkvKiBBcyB0aGUgSFcgZmxvdyBjb250cm9sIGlzIGRvbmUgaW4gZmlybXdhcmUsIHRoZSBkcml2ZXIgZG9lc24ndAorCSAgIG5lZWQgdG8gY2FyZSBhYm91dCBpdCAqLworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKworCS8qIFhPTi9YT0ZGL1hBTlkgZmxvdyBjb250cm9sIGZsYWdzICovCisJc3dfZmxvdyA9IDA7CisJaWYgKGlmbGFnICYgSVhPTil7CisJICAgIHN3X2Zsb3cgfD0gQ19GTF9PWFg7CisJICAgIGlmIChpZmxhZyAmIElYQU5ZKQorCQlzd19mbG93IHw9IENfRkxfT0lYQU5ZOworCX0KKwljeV93cml0ZWwoJmNoX2N0cmwtPnN3X2Zsb3csIHN3X2Zsb3cpOworCisJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9JT0NUTCwgMEwpOworCWlmIChyZXR2YWwgIT0gMCl7CisJICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCisJLyogQ0Qgc2Vuc2l0aXZpdHkgKi8KKwlpZiAoY2ZsYWcgJiBDTE9DQUwpeworCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJfWVsc2V7CisJICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCX0KKworCWlmKGJhdWQgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+cnNfY29udHJvbCwKKyAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19jb250cm9sKSAmIH5DX1JTX0RUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIgZHJvcHBpbmcgWiBEVFJcbiIpOworI2VuZGlmCisJfWVsc2V7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+cnNfY29udHJvbCwKKyAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19jb250cm9sKSB8IENfUlNfRFRSKTsKKyNpZmRlZiBDWV9ERUJVR19EVFIKKwkgICAgcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhciByYWlzaW5nIFogRFRSXG4iKTsKKyNlbmRpZgorCX0KKworCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoICZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMTSwgMEwpOworCWlmIChyZXR2YWwgIT0gMCl7CisJICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIoMikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCisJaWYgKGluZm8tPnR0eSl7CisJICAgIGNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwl9CisgICAgfQorfSAvKiBzZXRfbGluZV9jaGFyICovCisKKworc3RhdGljIGludAorZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCit7CisgIHN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKyAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CisKKyAgICBpZiAoIXJldGluZm8pCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBtZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworICAgIHRtcC50eXBlID0gaW5mby0+dHlwZTsKKyAgICB0bXAubGluZSA9IGluZm8tPmxpbmU7CisgICAgdG1wLnBvcnQgPSBpbmZvLT5jYXJkICogMHgxMDAgKyBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7CisgICAgdG1wLmlycSA9IGNpbmZvLT5pcnE7CisgICAgdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisgICAgdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisgICAgdG1wLmJhdWRfYmFzZSA9IGluZm8tPmJhdWQ7CisgICAgdG1wLmN1c3RvbV9kaXZpc29yID0gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisgICAgdG1wLmh1YjYgPSAwOyAgICAgICAgICAgICAgIC8qISEhKi8KKyAgICByZXR1cm4gY29weV90b191c2VyKHJldGluZm8sJnRtcCxzaXplb2YoKnJldGluZm8pKT8tRUZBVUxUOjA7Cit9IC8qIGdldF9zZXJpYWxfaW5mbyAqLworCisKK3N0YXRpYyBpbnQKK3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdfaW5mbykKK3sKKyAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgb2xkX2luZm87CisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwlyZXR1cm4gLUVGQVVMVDsKKyAgICBvbGRfaW5mbyA9ICppbmZvOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisgICAgICAgICAgICBpZiAoKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkKSB8fAorCQkoKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJIChpbmZvLT5mbGFncyAmIEFTWU5DX0ZMQUdTICYgfkFTWU5DX1VTUl9NQVNLKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgICAgICBpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKyAgICAgICAgICAgIGluZm8tPmJhdWQgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKKwkgICAgaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworICAgICAgICAgICAgZ290byBjaGVja19hbmRfZXhpdDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgorICAgICAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KKyAgICAgKi8KKworICAgIGluZm8tPmJhdWQgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKKyAgICBpbmZvLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CisgICAgaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisgICAgICAgICAgICAgICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKyAgICBpbmZvLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgKiBIWi8xMDA7CisKK2NoZWNrX2FuZF9leGl0OgorICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKXsKKyAgICAgICAgc2V0X2xpbmVfY2hhcihpbmZvKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBzdGFydHVwKGluZm8pOworICAgIH0KK30gLyogc2V0X3NlcmlhbF9pbmZvICovCisKKy8qCisgKiBnZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbworICoKKyAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKKyAqCSAgICBpcyBlbXB0aWVkLiAgT24gYnVzIHR5cGVzIGxpa2UgUlM0ODUsIHRoZSB0cmFuc21pdHRlciBtdXN0CisgKgkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgorICoJICAgIHRoZSB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eSwgbm90IGJlIGRvbmUgd2hlbiB0aGUKKyAqCSAgICB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGlzIGVtcHR5LiAgVGhpcyBmdW5jdGlvbmFsaXR5CisgKgkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKyAgICBpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgICAgdW5zaWduZWQgaW50IHJlc3VsdDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwljaGlwID0gY2hhbm5lbD4+MjsKKwljaGFubmVsICY9IDB4MDM7CisJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKwliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgJiAoQ3lUeFJkeXxDeVR4TXB0eSk7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwlyZXN1bHQgPSAoc3RhdHVzID8gMCA6IFRJT0NTRVJfVEVNVCk7CisgICAgfSBlbHNlIHsKKwkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gcHV0X3VzZXIocmVzdWx0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgdmFsdWUpOworfQorCitzdGF0aWMgaW50CitjeV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgIHVuc2lnbmVkIGxvbmcgbHN0YXR1czsKKyAgdW5zaWduZWQgaW50IHJlc3VsdDsKKyAgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKyAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKwkgICAgc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCkpOworCSAgICBzdGF0dXMgfD0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCkpOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKyAgICAgICAgaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkgICAgcmVzdWx0ID0gICgoc3RhdHVzICAmIEN5UlRTKSA/IFRJT0NNX0RUUiA6IDApCisJCSAgICB8ICgoc3RhdHVzICAmIEN5RFRSKSA/IFRJT0NNX1JUUyA6IDApOworCX0gZWxzZSB7CisJICAgIHJlc3VsdCA9ICAoKHN0YXR1cyAgJiBDeVJUUykgPyBUSU9DTV9SVFMgOiAwKQorCQkgICAgfCAoKHN0YXR1cyAgJiBDeURUUikgPyBUSU9DTV9EVFIgOiAwKTsKKwl9CisJcmVzdWx0IHw9ICAoKHN0YXR1cyAgJiBDeURDRCkgPyBUSU9DTV9DQVIgOiAwKQorCQkgfCAoKHN0YXR1cyAgJiBDeVJJKSA/IFRJT0NNX1JORyA6IDApCisJCSB8ICgoc3RhdHVzICAmIEN5RFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCSB8ICgoc3RhdHVzICAmIEN5Q1RTKSA/IFRJT0NNX0NUUyA6IDApOworICAgIH0gZWxzZSB7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisKKyAgICAgICAgaWYgKGN5X2NhcmRbY2FyZF0ubnVtX2NoaXBzICE9IC0xKXsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmlybV9pZCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKyAgICAgICAgaWYgKElTWkxPQURFRChjeV9jYXJkW2NhcmRdKSkgeworCSAgICB6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJICAgIGNoX2N0cmwgPSB6ZndfY3RybC0+Y2hfY3RybDsKKwkgICAgbHN0YXR1cyA9IGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX3N0YXR1cyk7CisJICAgIHJlc3VsdCA9ICAoKGxzdGF0dXMgICYgQ19SU19SVFMpID8gVElPQ01fUlRTIDogMCkKKwkJICAgIHwgKChsc3RhdHVzICAmIENfUlNfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJICAgICAgICAgICAgfCAoKGxzdGF0dXMgICYgQ19SU19EQ0QpID8gVElPQ01fQ0FSIDogMCkKKwkJICAgIHwgKChsc3RhdHVzICAmIENfUlNfUkkpID8gVElPQ01fUk5HIDogMCkKKwkJICAgIHwgKChsc3RhdHVzICAmIENfUlNfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCSAgICB8ICgobHN0YXR1cyAgJiBDX1JTX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwl9ZWxzZXsKKwkgICAgcmVzdWx0ID0gMDsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9IC8qIGN5X3Rpb21nZXQgKi8KKworCitzdGF0aWMgaW50CitjeV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKyAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworICBpbnQgcmV0dmFsOworCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKXsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIEN5RFRSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7CisgICAgICAgICAgICAgICAgfQorCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCX0KKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgfkN5RFRSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworICAgICAgICAgICAgICAgIH0KKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwl9CisJaWYgKHNldCAmIFRJT0NNX0RUUil7CisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIEN5UlRTKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENZX0RFQlVHX0RUUgorCQlwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyByYWlzaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJfQorCWlmIChjbGVhciAmIFRJT0NNX0RUUikgeworCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIH5DeURUUik7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljOnNldF9tb2RlbV9pbmZvIGRyb3BwaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJfQorICAgIH0gZWxzZSB7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisKKwlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworICAgICAgICBpZiAoSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJICAgIHpmd19jdHJsID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkgICAgYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwkgICAgY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCisJICAgIGlmIChzZXQgJiBUSU9DTV9SVFMpeworCQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCSAgICBjeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgfCBDX1JTX1JUUyk7CisJCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCSAgICB9CisJICAgIGlmIChjbGVhciAmIFRJT0NNX1JUUykgeworCQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCSAgICBjeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgJiB+Q19SU19SVFMpOworCQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgfQorCSAgICBpZiAoc2V0ICYgVElPQ01fRFRSKXsKKwkJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCQkgICAgY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpIHwgQ19SU19EVFIpOworI2lmZGVmIENZX0RFQlVHX0RUUgorCQkgICAgcHJpbnRrKCJjeWM6c2V0X21vZGVtX2luZm8gcmFpc2luZyBaIERUUlxuIik7CisjZW5kaWYKKwkJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIH0KKwkgICAgaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7CisJCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJICAgIGN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sKSAmIH5DX1JTX0RUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCSAgICBwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyBjbGVhcmluZyBaIERUUlxuIik7CisjZW5kaWYKKwkJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIH0KKwl9ZWxzZXsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLAorCQkJCSAgICBjaGFubmVsLCBDX0NNX0lPQ1RMTSwwTCk7CisJaWYgKHJldHZhbCAhPSAwKXsKKwkgICAgcHJpbnRrKCJjeWM6c2V0X21vZGVtX2luZm8gcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBjeV90aW9jbXNldCAqLworCisvKgorICogY3lfYnJlYWsoKSAtLS0gcm91dGluZSB3aGljaCB0dXJucyB0aGUgYnJlYWsgaGFuZGxpbmcgb24gb3Igb2ZmCisgKi8KK3N0YXRpYyB2b2lkCitjeV9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9icmVhayIpKQorCXJldHVybjsKKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKKyAgICAgICAgLyogTGV0IHRoZSB0cmFuc21pdCBJU1IgdGFrZSBjYXJlIG9mIHRoaXMgKHNpbmNlIGl0CisJICAgcmVxdWlyZXMgc3R1ZmZpbmcgY2hhcmFjdGVycyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtKS4KKyAgICAgICAgKi8KKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpIHsKKwkgICAgaWYgKCFpbmZvLT5icmVha29uKSB7CisJCWluZm8tPmJyZWFrb24gPSAxOworCQlpZiAoIWluZm8tPnhtaXRfY250KSB7CisJCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkgICAgc3RhcnRfeG1pdChpbmZvKTsKKwkJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoIWluZm8tPmJyZWFrb2ZmKSB7CisJCWluZm8tPmJyZWFrb2ZmID0gMTsKKwkJaWYgKCFpbmZvLT54bWl0X2NudCkgeworCQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJICAgIHN0YXJ0X3htaXQoaW5mbyk7CisJCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJaW50IHJldHZhbDsKKworCWlmIChicmVha19zdGF0ZSA9PSAtMSkgeworCSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLAorCQkoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtpbmZvLT5jYXJkXS5maXJzdF9saW5lKSwKKwkJQ19DTV9TRVRfQlJFQUssIDBMKTsKKwkgICAgaWYgKHJldHZhbCAhPSAwKSB7CisJCXByaW50aygiY3ljOmN5X2JyZWFrIChzZXQpIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkgICAgICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJCShpbmZvLT5saW5lKSAtIChjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmUpLAorCQlDX0NNX0NMUl9CUkVBSywgMEwpOworCSAgICBpZiAocmV0dmFsICE9IDApIHsKKwkJcHJpbnRrKCJjeWM6Y3lfYnJlYWsgKGNscikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgICAgICBpbmZvLT5saW5lLCByZXR2YWwpOworCSAgICB9CisJfQorICAgIH0KKyAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworfSAvKiBjeV9icmVhayAqLworCitzdGF0aWMgaW50CitnZXRfbW9uX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCBzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciBfX3VzZXIgKiBtb24pCit7CisKKyAgICBpZihjb3B5X3RvX3VzZXIobW9uLCAmaW5mby0+bW9uLCBzaXplb2Yoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IpKSkKKyAgICAJcmV0dXJuIC1FRkFVTFQ7CisgICAgaW5mby0+bW9uLmludF9jb3VudCAgPSAwOworICAgIGluZm8tPm1vbi5jaGFyX2NvdW50ID0gMDsKKyAgICBpbmZvLT5tb24uY2hhcl9tYXggICA9IDA7CisgICAgaW5mby0+bW9uLmNoYXJfbGFzdCAgPSAwOworICAgIHJldHVybiAwOworfS8qIGdldF9tb25faW5mbyAqLworCisKK3N0YXRpYyBpbnQKK3NldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hhbm5lbCxjaGlwLGluZGV4OworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlpbmZvLT5jb3IzICY9IH5DeVJFQ19GSUZPOworCWluZm8tPmNvcjMgfD0gdmFsdWUgJiBDeVJFQ19GSUZPOworCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SMzw8aW5kZXgpLCBpbmZvLT5jb3IzKTsKKwkgICAgY3l5X2lzc3VlX2NtZChiYXNlX2FkZHIsQ3lDT1JfQ0hBTkdFfEN5Q09SM2NoLGluZGV4KTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9Lyogc2V0X3RocmVzaG9sZCAqLworCisKK3N0YXRpYyBpbnQKK2dldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCit7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGFubmVsLGNoaXAsaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgdG1wOworICAgCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwl0bXAgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5Q09SMzw8aW5kZXgpKSAmIEN5UkVDX0ZJRk87CisJcmV0dXJuIHB1dF91c2VyKHRtcCx2YWx1ZSk7CisgICAgfSBlbHNlIHsKKwkvLyBOb3RoaW5nIHRvIGRvIQorCXJldHVybiAwOworICAgIH0KK30vKiBnZXRfdGhyZXNob2xkICovCisKKworc3RhdGljIGludAorc2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IHZhbHVlICYgMHgwZjsKKyAgICByZXR1cm4gMDsKK30vKiBzZXRfZGVmYXVsdF90aHJlc2hvbGQgKi8KKworCitzdGF0aWMgaW50CitnZXRfZGVmYXVsdF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCit7CisgICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkLHZhbHVlKTsKK30vKiBnZXRfZGVmYXVsdF90aHJlc2hvbGQgKi8KKworCitzdGF0aWMgaW50CitzZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGFubmVsLGNoaXAsaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJUUFI8PGluZGV4KSwgdmFsdWUgJiAweGZmKTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9Lyogc2V0X3RpbWVvdXQgKi8KKworCitzdGF0aWMgaW50CitnZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICp2YWx1ZSkKK3sKKyAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisgIGludCBjYXJkLGNoYW5uZWwsY2hpcCxpbmRleDsKKyAgdW5zaWduZWQgbG9uZyB0bXA7CisgICAKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCXRtcCA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCkpOworCXJldHVybiBwdXRfdXNlcih0bXAsdmFsdWUpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKwlyZXR1cm4gMDsKKyAgICB9Cit9LyogZ2V0X3RpbWVvdXQgKi8KKworCitzdGF0aWMgaW50CitzZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyAgICBpbmZvLT5kZWZhdWx0X3RpbWVvdXQgPSB2YWx1ZSAmIDB4ZmY7CisgICAgcmV0dXJuIDA7Cit9Lyogc2V0X2RlZmF1bHRfdGltZW91dCAqLworCisKK3N0YXRpYyBpbnQKK2dldF9kZWZhdWx0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCit7CisgICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGltZW91dCx2YWx1ZSk7Cit9LyogZ2V0X2RlZmF1bHRfdGltZW91dCAqLworCisvKgorICogVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgdHR5IGRyaXZlciB0byBpbXBsZW1lbnQgZGV2aWNlLQorICogc3BlY2lmaWMgaW9jdGwncy4gIElmIHRoZSBpb2N0bCBudW1iZXIgcGFzc2VkIGluIGNtZCBpcworICogbm90IHJlY29nbml6ZWQgYnkgdGhlIGRyaXZlciwgaXQgc2hvdWxkIHJldHVybiBFTk9JT0NUTENNRC4KKyAqLworc3RhdGljIGludAorY3lfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHN0cnVjdCBjeWNsYWRlc19pY291bnQgY3ByZXYsIGNub3c7CQkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworICBzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CS8qIHVzZXIgc3BhY2UgKi8KKyAgaW50IHJldF92YWwgPSAwOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaW9jdGwiKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfaW9jdGwgdHR5QyVkLCBjbWQgPSAleCBhcmcgPSAlbHhcbiIsCisgICAgICAgIGluZm8tPmxpbmUsIGNtZCwgYXJnKTsgLyogKi8KKyNlbmRpZgorCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBDWUdFVE1PTjoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfbW9uX2luZm8oaW5mbywgYXJncCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWUdFVFRIUkVTSDoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X3RocmVzaG9sZChpbmZvLCBhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lHRVRERUZUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRERUZUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWUdFVFRJTUVPVVQ6CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X3RpbWVvdXQoaW5mbywgYXJncCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWVNFVFRJTUVPVVQ6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X3RpbWVvdXQoaW5mbywgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENZR0VUREVGVElNRU9VVDoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfZGVmYXVsdF90aW1lb3V0KGluZm8sIGFyZ3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRERUZUSU1FT1VUOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgQ1lTRVRSRkxPVzoKKyAgICAJICAgIGluZm8tPnJmbG93ID0gKGludClhcmc7CisJICAgIHJldF92YWwgPSAwOworCSAgICBicmVhazsKKwljYXNlIENZR0VUUkZMT1c6CisJICAgIHJldF92YWwgPSBpbmZvLT5yZmxvdzsKKwkgICAgYnJlYWs7CisJY2FzZSBDWVNFVFJUU0RUUl9JTlY6CisgICAgCSAgICBpbmZvLT5ydHNkdHJfaW52ID0gKGludClhcmc7CisJICAgIHJldF92YWwgPSAwOworCSAgICBicmVhazsKKwljYXNlIENZR0VUUlRTRFRSX0lOVjoKKwkgICAgcmV0X3ZhbCA9IGluZm8tPnJ0c2R0cl9pbnY7CisJICAgIGJyZWFrOworCWNhc2UgQ1lHRVRDQVJESU5GTzoKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN5X2NhcmRbaW5mby0+Y2FyZF0sIAorCQkJc2l6ZW9mIChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCkpKSB7CisJCXJldF92YWwgPSAtRUZBVUxUOworCQlicmVhazsKKwkgICAgfQorCSAgICByZXRfdmFsID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgQ1lHRVRDRDE0MDBWRVI6CisJICAgIHJldF92YWwgPSBpbmZvLT5jaGlwX3JldjsKKwkgICAgYnJlYWs7CisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorCWNhc2UgQ1laU0VUUE9MTENZQ0xFOgorICAgICAgICAgICAgY3l6X3BvbGxpbmdfY3ljbGUgPSAoYXJnICogSFopIC8gMTAwMDsKKwkgICAgcmV0X3ZhbCA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgQ1laR0VUUE9MTENZQ0xFOgorICAgICAgICAgICAgcmV0X3ZhbCA9IChjeXpfcG9sbGluZ19jeWNsZSAqIDEwMDApIC8gSFo7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCWNhc2UgQ1lTRVRXQUlUOgorICAgIAkgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gKHVuc2lnbmVkIHNob3J0KWFyZyAqIEhaLzEwMDsKKwkgICAgcmV0X3ZhbCA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgQ1lHRVRXQUlUOgorCSAgICByZXRfdmFsID0gaW5mby0+Y2xvc2luZ193YWl0IC8gKEhaLzEwMCk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NHU0VSSUFMOgorICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NTU0VSSUFMOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisJICAgIHJldF92YWwgPSBnZXRfbHNyX2luZm8oaW5mbywgYXJncCk7CisJICAgIGJyZWFrOworCS8qCisJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZSAKKwkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKKwkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcworCSAqLworCWNhc2UgVElPQ01JV0FJVDoKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIC8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJICAgIGNwcmV2ID0gaW5mby0+aWNvdW50OworCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCSAgICB3aGlsZSAoMSkgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCSAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7IC8qIGF0b21pYyBjb3B5ICovCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKwkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYgCisJCSAgICBjbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKSB7CisJCSAgICByZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCisJCX0KKwkJaWYgKCAoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNub3cucm5nICE9IGNwcmV2LnJuZykpIHx8IAorCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwgCisJCSAgICAgKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fCAKKwkJICAgICAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpICkgeworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkJY3ByZXYgPSBjbm93OworCSAgICB9CisJICAgIC8qIE5PVFJFQUNIRUQgKi8KKworCS8qCisJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKKwkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJICovCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIGNub3cgPSBpbmZvLT5pY291bnQ7CisJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIHBfY3VzZXIgPSBhcmdwOworCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcik7CisJICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKKwkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cucm5nLCAmcF9jdXNlci0+cm5nKTsKKwkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOworCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LnR4LCAmcF9jdXNlci0+dHgpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKTsKKwkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOworCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmJyaywgJnBfY3VzZXItPmJyayk7CisJICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKKwkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bik7CisJICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKKwkgICAgcmV0X3ZhbCA9IDA7CisJICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0X3ZhbCA9IC1FTk9JT0NUTENNRDsKKyAgICB9CisKKyNpZmRlZiBDWV9ERUJVR19PVEhFUgorICAgIHByaW50aygiIGN5YzpjeV9pb2N0bCBkb25lXG4iKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldF92YWw7Cit9IC8qIGN5X2lvY3RsICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSBhbGxvd3MgdGhlIHR0eSBkcml2ZXIgdG8gYmUgbm90aWZpZWQgd2hlbgorICogZGV2aWNlJ3MgdGVybWlvcyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuICBOb3RlIHRoYXQgYQorICogd2VsbC1kZXNpZ25lZCB0dHkgZHJpdmVyIHNob3VsZCBiZSBwcmVwYXJlZCB0byBhY2NlcHQgdGhlIGNhc2UKKyAqIHdoZXJlIG9sZCA9PSBOVUxMLCBhbmQgdHJ5IHRvIGRvIHNvbWV0aGluZyByYXRpb25hbC4KKyAqLworc3RhdGljIHZvaWQKK2N5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkX3Rlcm1pb3MpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfc2V0X3Rlcm1pb3MgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCisgICAgaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpICYmCisJKCh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTnxJWEFOWSkpID09IAorCSAob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTnxJWEFOWSkpKSkKKyAgICAgICAgcmV0dXJuOworICAgIHNldF9saW5lX2NoYXIoaW5mbyk7CisKKyAgICBpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKyAgICAgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworICAgICAgICAgICAgdHR5LT5od19zdG9wcGVkID0gMDsKKyAgICAgICAgICAgIGN5X3N0YXJ0KHR0eSk7CisgICAgfQorI2lmIDAKKyAgICAvKgorICAgICAqIE5vIG5lZWQgdG8gd2FrZSB1cCBwcm9jZXNzZXMgaW4gb3BlbiB3YWl0LCBzaW5jZSB0aGV5CisgICAgICogc2FtcGxlIHRoZSBDTE9DQUwgZmxhZyBvbmNlLCBhbmQgZG9uJ3QgcmVjaGVjayBpdC4KKyAgICAgKiBYWFggIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgY29ycmVjdAorICAgICAqIG9yIG5vdC4gIEhlbmNlLCB0aGlzIG1heSBjaGFuZ2UuLi4uLgorICAgICAqLworICAgIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorICAgICAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKyAgICAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuOworfSAvKiBjeV9zZXRfdGVybWlvcyAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyIHRvCisgICB0aGUgZGV2aWNlLgorKi8KK3N0YXRpYyB2b2lkCitjeV9zZW5kX3hjaGFyIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGNhcmQsIGNoYW5uZWw7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrIChpbmZvLCB0dHktPm5hbWUsICJjeV9zZW5kX3hjaGFyIikpCisJCXJldHVybjsKKworICAJaW5mby0+eF9jaGFyID0gY2g7CisKKwlpZiAoY2gpCisJCWN5X3N0YXJ0ICh0dHkpOworCisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisKKwlpZiAoSVNfQ1lDX1ogKGN5X2NhcmRbY2FyZF0pKSB7CisJCWlmIChjaCA9PSBTVE9QX0NIQVIgKHR0eSkpCisJICAJCWN5el9pc3N1ZV9jbWQgKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX1NFTkRYT0ZGLCAwTCk7CisJCWVsc2UgaWYgKGNoID09IFNUQVJUX0NIQVIgKHR0eSkpCisJCQljeXpfaXNzdWVfY21kICgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9TRU5EWE9OLCAwTCk7CisJfQorfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsCisgICB0aGF0IGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZCBiZWNhdXNlIHRoZSBpbnB1dAorICAgYnVmZmVycyBhcmUgY2xvc2UgdG8gZnVsbC4KKyAqLworc3RhdGljIHZvaWQKK2N5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisKKyNpZmRlZiBDWV9ERUJVR19USFJPVFRMRQorICBjaGFyIGJ1Zls2NF07CisKKyAgICBwcmludGsoImN5Yzp0aHJvdHRsZSAlczogJWQuLi4udHR5QyVkXG4iLCAKKwkgICB0dHlfbmFtZSh0dHksIGJ1ZiksCisgICAgICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSksIGluZm8tPmxpbmUpOworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3Rocm90dGxlIikpeworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhcmQgPSBpbmZvLT5jYXJkOworCisgICAgaWYgKElfSVhPRkYodHR5KSkgeworICAgICAgICBpZiAoIUlTX0NZQ19aIChjeV9jYXJkW2NhcmRdKSkKKyAgICAgICAgICAgIGN5X3NlbmRfeGNoYXIgKHR0eSwgU1RPUF9DSEFSICh0dHkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mby0+dGhyb3R0bGUgPSAxOworICAgIH0KKworICAgIGlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisgICAgICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworICAgICAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisgICAgICAgICAgICBjaGlwID0gY2hhbm5lbD4+MjsKKyAgICAgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKKyAgICAgICAgICAgIGluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisgICAgICAgICAgICBiYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCisgICAgICAgICAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKyAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgeworICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgfkN5RFRSKTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgfkN5UlRTKTsKKwkgICAgIH0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwl9IGVsc2UgeworCSAgICBpbmZvLT50aHJvdHRsZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3Rocm90dGxlICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgdHR5IGRyaXZlciB0aGF0IGl0IHNob3VsZCBzaWduYWwKKyAqIHRoYXQgY2hhcmFjdGVycyBjYW4gbm93IGJlIHNlbnQgdG8gdGhlIHR0eSB3aXRob3V0IGZlYXIgb2YKKyAqIG92ZXJydW5uaW5nIHRoZSBpbnB1dCBidWZmZXJzIG9mIHRoZSBsaW5lIGRpc2NpcGxpbmVzLgorICovCitzdGF0aWMgdm9pZAorY3lfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworCisjaWZkZWYgQ1lfREVCVUdfVEhST1RUTEUKKyAgY2hhciBidWZbNjRdOworICAgICAgICAKKyAgICBwcmludGsoImN5Yzp1bnRocm90dGxlICVzOiAlZC4uLi50dHlDJWRcbiIsIAorCSAgIHR0eV9uYW1lKHR0eSwgYnVmKSwKKyAgICAgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSwgaW5mby0+bGluZSk7CisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfdW50aHJvdHRsZSIpKXsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoSV9JWE9GRih0dHkpKSB7CisJaWYgKGluZm8tPnhfY2hhcikKKwkgICAgaW5mby0+eF9jaGFyID0gMDsKKwllbHNlCisJICAgIGN5X3NlbmRfeGNoYXIgKHR0eSwgU1RBUlRfQ0hBUiAodHR5KSk7CisgICAgfQorCisgICAgaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKyAgICAgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworICAgICAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJICAgIGNoaXAgPSBjaGFubmVsPj4yOworCSAgICBjaGFubmVsICY9IDB4MDM7CisJICAgIGluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJICAgIGJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIEN5RFRSKTsKKwkgICAgfSBlbHNlIHsKKwkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgQ3lSVFMpOworCSAgICB9CisJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisJICAgIGluZm8tPnRocm90dGxlID0gMDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvKiBjeV91bnRocm90dGxlICovCisKKworLyogY3lfc3RhcnQgYW5kIGN5X3N0b3AgcHJvdmlkZSBzb2Z0d2FyZSBvdXRwdXQgZmxvdyBjb250cm9sIGFzIGEKKyAgIGZ1bmN0aW9uIG9mIFhPTi9YT0ZGLCBzb2Z0d2FyZSBDVFMsIGFuZCBvdGhlciBzdWNoIHN0dWZmLgorKi8KK3N0YXRpYyB2b2lkCitjeV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNoaXAsY2hhbm5lbCxpbmRleDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfc3RvcCB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3N0b3AiKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7CisgICAgaWYgKCFJU19DWUNfWigqY2luZm8pKSB7CisgICAgICAgIGluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKyAgICAgICAgY2hpcCA9IGNoYW5uZWw+PjI7CisgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKKyAgICAgICAgYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwKKwkgICAgICAgKHVfY2hhcikoY2hhbm5lbCAmIDB4MDAwMykpOyAvKiBpbmRleCBjaGFubmVsICovCisgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwgCisgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3N0b3AgKi8KKworCitzdGF0aWMgdm9pZAorY3lfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2hpcCxjaGFubmVsLGluZGV4OworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ1lfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5YzpjeV9zdGFydCB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3N0YXJ0IikpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGNpbmZvLT5maXJzdF9saW5lOworICAgIGluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKyAgICBpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKKyAgICAgICAgY2hpcCA9IGNoYW5uZWw+PjI7CisgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKKyAgICAgICAgYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwKKwkgICAgICAgKHVfY2hhcikoY2hhbm5lbCAmIDB4MDAwMykpOyAvKiBpbmRleCBjaGFubmVsICovCisgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwgCisgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5VHhSZHkpOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKwkvLyBOb3RoaW5nIHRvIGRvIQorICAgIH0KKworICAgIHJldHVybjsKK30gLyogY3lfc3RhcnQgKi8KKworCitzdGF0aWMgdm9pZAorY3lfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsIGNoYW5uZWwsIHJldHZhbDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWZkZWYgQ1lfREVCVUdfSU8KKyAgICBwcmludGsoImN5YzpjeV9mbHVzaF9idWZmZXIgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9idWZmZXIiKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCisgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisgICAgaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKyAgICBpZiAoSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsgLyogSWYgaXQgaXMgYSBaIGNhcmQsIGZsdXNoIHRoZSBvbi1ib2FyZCAKKwkJCQkgICAgICBidWZmZXJzIGFzIHdlbGwgKi8KKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0ZMVVNIX1RYLCAwTCk7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJICAgIHByaW50aygiY3ljOiBmbHVzaF9idWZmZXIgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfQorICAgIHR0eV93YWtldXAodHR5KTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9IC8qIGN5X2ZsdXNoX2J1ZmZlciAqLworCisKKy8qCisgKiBjeV9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCitzdGF0aWMgdm9pZAorY3lfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgICAgICAgIAorI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfaGFuZ3VwIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaGFuZ3VwIikpCisgICAgICAgIHJldHVybjsKKworICAgIGN5X2ZsdXNoX2J1ZmZlcih0dHkpOworICAgIHNodXRkb3duKGluZm8pOworICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICBpbmZvLT5jb3VudCA9IDA7CisjaWZkZWYgQ1lfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzpjeV9oYW5ndXAgKCVkKTogc2V0dGluZyBjb3VudCB0byAwXG4iLCBjdXJyZW50LT5waWQpOworI2VuZGlmCisgICAgaW5mby0+dHR5ID0gTlVMTDsKKyAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9IC8qIGN5X2hhbmd1cCAqLworCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X2luaXQoKSBhbmQgZnJpZW5kcworICoKKyAqIGN5X2luaXQoKSBpcyBjYWxsZWQgYXQgYm9vdC10aW1lIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBkcml2ZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBpbml0aWFsaXplIGNoaXBzIG9uIEN5Y2xvbS1ZIGNhcmQgLS0gcmV0dXJuIG51bWJlciBvZiB2YWxpZAorICAgY2hpcHMgKHdoaWNoIGlzIG51bWJlciBvZiBwb3J0cy80KSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdAorY3l5X2luaXRfY2FyZCh2b2lkIF9faW9tZW0gKnRydWVfYmFzZV9hZGRyLGludCBpbmRleCkKK3sKKyAgdW5zaWduZWQgaW50IGNoaXBfbnVtYmVyOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKworICAgIGN5X3dyaXRlYih0cnVlX2Jhc2VfYWRkcisoQ3lfSHdSZXNldDw8aW5kZXgpLCAwKTsgCisJCQkJCQkvKiBDeV9Id1Jlc2V0IGlzIDB4MTQwMCAqLworICAgIGN5X3dyaXRlYih0cnVlX2Jhc2VfYWRkcisoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsgCisJCQkJCQkvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworICAgIHVkZWxheSg1MDBMKTsKKworICAgIGZvcihjaGlwX251bWJlcj0wOyBjaGlwX251bWJlcjxDeU1BWF9DSElQU19QRVJfQ0FSRDsgY2hpcF9udW1iZXIrKyl7CisgICAgICAgIGJhc2VfYWRkciA9IHRydWVfYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBfbnVtYmVyXTw8aW5kZXgpOworICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIGlmKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSkgIT0gMHgwMCl7CisgICAgICAgICAgICAvKioqKioqKioqKioqKgorICAgICAgICAgICAgcHJpbnRrKCIgY2hpcCAjJWQgYXQgJSM2bHggaXMgbmV2ZXIgaWRsZSAoQ0NSICE9IDApXG4iLAorICAgICAgICAgICAgICAgY2hpcF9udW1iZXIsICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkcik7CisgICAgICAgICAgICAqKioqKioqKioqKioqLworICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpLCAwKTsKKyAgICAgICAgdWRlbGF5KDEwTCk7CisKKyAgICAgICAgLyogVGhlIEN5Y2xvbS0xNlkgZG9lcyBub3QgZGVjb2RlIGFkZHJlc3MgYml0IDkgYW5kIHRoZXJlZm9yZQorICAgICAgICAgICBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiByZWZlcmVuY2VzIHRvIGNoaXAgMCBhbmQgYSBub24tCisgICAgICAgICAgIGV4aXN0ZW50IGNoaXAgNC4gIElmIHRoZSBwcmVjZWRpbmcgY2xlYXJpbmcgb2YgdGhlIHN1cHBvc2VkCisgICAgICAgICAgIGNoaXAgNCBHRlJDUiByZWdpc3RlciBhcHBlYXJzIGF0IGNoaXAgMCwgdGhlcmUgaXMgbm8gY2hpcCA0CisgICAgICAgICAgIGFuZCB0aGlzIG11c3QgYmUgYSBDeWNsb20tMTZZLCBub3QgYSBDeWNsb20tMzJZZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGNoaXBfbnVtYmVyID09IDQKKyAgICAgICAgJiYgY3lfcmVhZGIodHJ1ZV9iYXNlX2FkZHIKKwkgICAgKyAoY3lfY2hpcF9vZmZzZXRbMF08PGluZGV4KQorCSAgICArIChDeUdGUkNSPDxpbmRleCkpID09IDApeworICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSwgQ3lDSElQX1JFU0VUKTsKKyAgICAgICAgbWRlbGF5KDEpOworCisgICAgICAgIGlmKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSA9PSAweDAwKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBwcmludGsoIiBjaGlwICMlZCBhdCAlIzZseCBpcyBub3QgcmVzcG9uZGluZyAiLAorICAgICAgICAgICAgICAgY2hpcF9udW1iZXIsICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkcik7CisgICAgICAgICAgICBwcmludGsoIihHRlJDUiBzdGF5ZWQgMClcbiIsCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworICAgICAgICB9CisgICAgICAgIGlmKCgweGYwICYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSkpICE9IDB4NDApeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHByaW50aygiIGNoaXAgIyVkIGF0ICUjNmx4IGlzIG5vdCB2YWxpZCAoR0ZSQ1IgPT0gJSMyeClcbiIsCisgICAgICAgICAgICAgICBjaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLAorCSAgICAgICBiYXNlX2FkZHJbQ3lHRlJDUjw8aW5kZXhdKTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gY2hpcF9udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lHQ1I8PGluZGV4KSwgQ3lDSDBfU0VSSUFMKTsKKyAgICAgICAgaWYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSA+PSBDRDE0MDBfUkVWX0opeworCSAgICAvKiBJdCBpcyBhIENEMTQwMCByZXYuIEogb3IgbGF0ZXIgKi8KKwkgICAgLyogSW1wb3NzaWJsZSB0byByZWFjaCA1bXMgd2l0aCB0aGlzIGNoaXAuIAorCSAgICAgICBDaGFuZ2VkIHRvIDJtcyBpbnN0ZWFkIChmID0gNTAwIEh6KS4gKi8KKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lQUFI8PGluZGV4KSwgQ3lDTE9DS182MF8yTVMpOworCX0gZWxzZSB7CisJICAgIC8qIGYgPSAyMDAgSHogKi8KKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lQUFI8PGluZGV4KSwgQ3lDTE9DS18yNV81TVMpOworCX0KKworICAgIC8qCisgICAgICAgIHByaW50aygiIGNoaXAgIyVkIGF0ICUjNmx4IGlzIHJldiAweCUyeFxuIiwKKyAgICAgICAgICAgICAgIGNoaXBfbnVtYmVyLCAodW5zaWduZWQgbG9uZyliYXNlX2FkZHIsCisJICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSk7CisgICAgKi8KKyAgICB9CisgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworfSAvKiBjeXlfaW5pdF9jYXJkICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X2RldGVjdF9pc2EoKSAtIFByb2JlIGZvciBDeWNsb20tWS9JU0EgYm9hcmRzLgorICogc2V0cyBnbG9iYWwgdmFyaWFibGVzIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBJU0EgYm9hcmRzIGZvdW5kLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitjeV9kZXRlY3RfaXNhKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0lTQQorICB1bnNpZ25lZCBzaG9ydAljeV9pc2FfaXJxLG5ib2FyZDsKKyAgdm9pZCBfX2lvbWVtCQkqY3lfaXNhX2FkZHJlc3M7CisgIHVuc2lnbmVkIHNob3J0CWksaixjeV9pc2FfbmNoYW47CisjaWZkZWYgTU9EVUxFCisgIGludCBpc3BhcmFtID0gMDsKKyNlbmRpZgorCisgICAgICAgIG5ib2FyZCA9IDA7CisKKyNpZmRlZiBNT0RVTEUKKwkvKiBDaGVjayBmb3IgbW9kdWxlIHBhcmFtZXRlcnMgKi8KKwlmb3IoaSA9IDAgOyBpIDwgTlJfQ0FSRFM7IGkrKykgeworCSAgICBpZiAobWFkZHJbaV0gfHwgaSkgeworCQlpc3BhcmFtID0gMTsKKwkJY3lfaXNhX2FkZHJlc3Nlc1tpXSA9IG1hZGRyW2ldOworCSAgICB9CisJICAgIGlmICghbWFkZHJbaV0pCisJCWJyZWFrOworCX0KKyNlbmRpZgorCisgICAgICAgIC8qIHNjYW4gdGhlIGFkZHJlc3MgdGFibGUgcHJvYmluZyBmb3IgQ3ljbG9tLVkvSVNBIGJvYXJkcyAqLworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IE5SX0lTQV9BRERSUyA7IGkrKykgeworICAgICAgICAJdW5zaWduZWQgaW50IGlzYV9hZGRyZXNzID0gY3lfaXNhX2FkZHJlc3Nlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoaXNhX2FkZHJlc3MgID09IDB4MDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKG5ib2FyZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcHJvYmUgZm9yIENEMTQwMC4uLiAqLworCQljeV9pc2FfYWRkcmVzcyA9IGlvcmVtYXAoaXNhX2FkZHJlc3MsIEN5SVNBX1l3aW4pOworICAgICAgICAgICAgICAgIGN5X2lzYV9uY2hhbiA9IEN5UE9SVFNfUEVSX0NISVAgKiAKKyAgICAgICAgICAgICAgICAgICAgIGN5eV9pbml0X2NhcmQoY3lfaXNhX2FkZHJlc3MsMCk7CisgICAgICAgICAgICAgICAgaWYgKGN5X2lzYV9uY2hhbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBNT0RVTEUKKwkJaWYgKGlzcGFyYW0gJiYgaXJxW2ldKQorCQkgICAgY3lfaXNhX2lycSA9IGlycVtpXTsKKwkJZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgLyogZmluZCBvdXQgdGhlIGJvYXJkJ3MgaXJxIGJ5IHByb2JpbmcgKi8KKyAgICAgICAgICAgICAgICBjeV9pc2FfaXJxID0gZGV0ZWN0X2lzYV9pcnEoY3lfaXNhX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIGlmIChjeV9pc2FfaXJxID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCB0aGUgSVJRIGNvdWxkIG5vdCBiZSBkZXRlY3RlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9pc2FfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBubyBtb3JlIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX1BPUlRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTlJfQ0FSRFMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeV9jYXJkW2pdLmJhc2VfYWRkciA9PSAwKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IE5SX0NBUkRTKSB7ICAgIC8qIG5vIG1vcmUgY3lfY2FyZHMgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL0lTQSBmb3VuZCBhdCAweCVseCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgY3lfaXNhX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZCAuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIElSUSAqLworICAgICAgICAgICAgICAgIGlmKHJlcXVlc3RfaXJxKGN5X2lzYV9pcnEsIGN5eV9pbnRlcnJ1cHQsCisJCQkJICAgU0FfSU5URVJSVVBULCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9JU0EgZm91bmQgYXQgMHglbHggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGN5X2lzYV9hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlEjJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9pc2FfaXJxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX2FkZHIgPSBjeV9pc2FfYWRkcmVzczsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9hZGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmlycSA9IChpbnQpIGN5X2lzYV9pcnE7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5idXNfaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uZmlyc3RfbGluZSA9IGN5X25leHRfY2hhbm5lbDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLm51bV9jaGlwcyA9IGN5X2lzYV9uY2hhbi80OworICAgICAgICAgICAgICAgIG5ib2FyZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogcHJpbnQgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBICMlZDogMHglbHgtMHglbHgsIElSUSVkLCAiLAorICAgICAgICAgICAgICAgICAgICBqKzEsICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGN5X2lzYV9hZGRyZXNzICsgKEN5SVNBX1l3aW4gLSAxKSksCisJCSAgICBjeV9pc2FfaXJxKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjeV9pc2FfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgY3lfbmV4dF9jaGFubmVsICs9IGN5X2lzYV9uY2hhbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4obmJvYXJkKTsKKyNlbHNlCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCit9IC8qIGN5X2RldGVjdF9pc2EgKi8KKworc3RhdGljIHZvaWQgCitwbHhfaW5pdCh2b2lkIF9faW9tZW0gKmFkZHIsIHVjbG9uZyBpbml0Y3RsKQoreworICAgIC8qIFJlc2V0IFBMWCAqLworICAgIGN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpIHwgMHg0MDAwMDAwMCk7CisgICAgdWRlbGF5KDEwMEwpOworICAgIGN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpICYgfjB4NDAwMDAwMDApOworCisgICAgLyogUmVsb2FkIENvbmZpZy4gUmVnaXN0ZXJzIGZyb20gRUVQUk9NICovCisgICAgY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgfCAweDIwMDAwMDAwKTsKKyAgICB1ZGVsYXkoMTAwTCk7CisgICAgY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgJiB+MHgyMDAwMDAwMCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X2RldGVjdF9wY2koKSAtIFRlc3QgUENJIGJ1cyBwcmVzZW5jZSBhbmQgQ3ljbG9tLVllL1BDSS4KKyAqIHNldHMgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgUENJIGJvYXJkcyBmb3VuZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IF9faW5pdAorY3lfZGV0ZWN0X3BjaSh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKworICBzdHJ1Y3QgcGNpX2RldgkqcGRldiA9IE5VTEw7CisgIHVuc2lnbmVkIGNoYXIJCWN5eV9yZXZfaWQ7CisgIHVuc2lnbmVkIGNoYXIJCWN5X3BjaV9pcnEgPSAwOworICB1Y2xvbmcJCWN5X3BjaV9waHlzMCwgY3lfcGNpX3BoeXMyOworICB2b2lkIF9faW9tZW0JCSpjeV9wY2lfYWRkcjAsICpjeV9wY2lfYWRkcjI7CisgIHVuc2lnbmVkIHNob3J0CWksaixjeV9wY2lfbmNoYW4sIHBseF92ZXI7CisgIHVuc2lnbmVkIHNob3J0CWRldmljZV9pZCxkZXZfaW5kZXggPSAwOworICB1Y2xvbmcJCW1haWxib3g7CisgIHVjbG9uZwkJWmVJbmRleCA9IDA7CisgIHZvaWQgX19pb21lbQkJKlplX2FkZHIwW05SX0NBUkRTXSwgKlplX2FkZHIyW05SX0NBUkRTXTsKKyAgdWNsb25nCQlaZV9waHlzMFtOUl9DQVJEU10sIFplX3BoeXMyW05SX0NBUkRTXTsKKyAgdW5zaWduZWQgY2hhcgkJWmVfaXJxW05SX0NBUkRTXTsKKyAgc3RydWN0IHBjaV9kZXYJKlplX3BkZXZbTlJfQ0FSRFNdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9DQVJEUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogbG9vayBmb3IgYSBDeWNsYWRlcyBjYXJkIGJ5IHZlbmRvciBhbmQgZGV2aWNlIGlkICovCisgICAgICAgICAgICAgICAgd2hpbGUoKGRldmljZV9pZCA9IGN5X3BjaV9kZXZfaWRbZGV2X2luZGV4XSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NZQ0xBREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9pZCwgcGRldikpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZGV4Kys7ICAgIC8qIHRyeSBuZXh0IGRldmljZSBpZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIGZvdW5kIGEgYm9hcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKwkJaWYgKGRldmljZV9pZCA9PSAwKQorCQkgICAgYnJlYWs7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQkgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvKiByZWFkIFBDSSBjb25maWd1cmF0aW9uIGFyZWEgKi8KKwkJY3lfcGNpX2lycSA9IHBkZXYtPmlycTsKKwkJY3lfcGNpX3BoeXMwID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQljeV9wY2lfcGh5czIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmN5eV9yZXZfaWQpOworCisJCWRldmljZV9pZCAmPSB+UENJX0RFVklDRV9JRF9NQVNLOworCisgICAgaWYgKChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWV9MbykKKwkgICB8fCAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGkpKXsKKyNpZmRlZiBDWV9QQ0lfREVCVUcKKyAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAorCQlwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworICAgICAgICAgICAgcHJpbnRrKCJyZXZfaWQ9JWQpIElSUSVkXG4iLAorCQljeXlfcmV2X2lkLCAoaW50KWN5X3BjaV9pcnEpOworICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0k6Zm91bmQgIHdpbmFkZHI9MHglbHggY3RsYWRkcj0weCVseFxuIiwKKwkJKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7CisjZW5kaWYKKworCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDIpICYgSU9SRVNPVVJDRV9JTykgeworCQkgICAgcHJpbnRrKCIgIFdhcm5pbmc6IFBDSSBJL08gYml0IGluY29ycmVjdGx5IHNldC4gIgorCQkJICAgIklnbm9yaW5nIGl0Li4uXG4iKTsKKwkJICAgIHBkZXYtPnJlc291cmNlWzJdLmZsYWdzICY9IH5JT1JFU09VUkNFX0lPOworCQl9CisKKwkJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgSS9PIHJlZ2lvbiwgd2Ugc2hvdWxkCisJCSAgIHJlcXVlc3QgaXQgZnJvbSB0aGUga2VybmVsIGFueXdheSwgdG8gYXZvaWQgcHJvYmxlbXMKKwkJICAgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4gKi8KKwkJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIkN5Y2xvbS1ZIikgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjeWNsYWRlczogZmFpbGVkIHRvIHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9pZCAgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWV9MbykgeyAvKiBiZWxvdyAxTT8gKi8KKwkJICAgIHByaW50aygiQ3ljbG9tLVkvUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAorCQkJcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKwkJICAgIHByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJICAgICAgICBjeXlfcmV2X2lkLCAoaW50KWN5X3BjaV9pcnEpOworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSTpmb3VuZCAgd2luYWRkcj0weCVseCBjdGxhZGRyPTB4JWx4XG4iLAorCQkgICAgICAgICh1bG9uZyljeV9wY2lfcGh5czIsICh1bG9uZyljeV9wY2lfcGh5czApOworCSAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIG5vdCBzdXBwb3J0ZWQgZm9yIGxvdyBhZGRyZXNzZXMgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFscGhhIHN5c3RlbXMuXG4iKTsKKwkJICAgIGktLTsKKwkgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKwkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1ljdGwpOworCQljeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMiwgQ3lQQ0lfWXdpbik7CisKKyNpZmRlZiBDWV9QQ0lfREVCVUcKKyAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisJCSh1X2xvbmcpY3lfcGNpX2FkZHIyLCAodV9sb25nKWN5X3BjaV9hZGRyMCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjeV9wY2lfbmNoYW4gPSAodW5zaWduZWQgc2hvcnQpKEN5UE9SVFNfUEVSX0NISVAgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgY3l5X2luaXRfY2FyZChjeV9wY2lfYWRkcjIsIDEpKTsKKyAgICAgICAgICAgICAgICBpZihjeV9wY2lfbmNoYW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWSBQQ0kgaG9zdCBjYXJkIHdpdGggIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm5vIFNlcmlhbC1Nb2R1bGVzIGF0IDB4JWx4LlxuIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkgICAgKHVsb25nKSBjeV9wY2lfcGh5czIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTlJfQ0FSRFMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeV9jYXJkW2pdLmJhc2VfYWRkciA9PSAwKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IE5SX0NBUkRTKSB7ICAgIC8qIG5vIG1vcmUgY3lfY2FyZHMgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJICAgICh1bG9uZykgY3lfcGNpX3BoeXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IG5vIG1vcmUgY2FyZHMgY2FuIGJlIHVzZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBJUlEgKi8KKyAgICAgICAgICAgICAgICBpZihyZXF1ZXN0X2lycShjeV9wY2lfaXJxLCBjeXlfaW50ZXJydXB0LAorCQkgICAgICAgIFNBX1NISVJRLCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJICAgIGN5X3BjaV9pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX3BoeXMgPSAodWxvbmcpY3lfcGNpX3BoeXMyOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX3BoeXMgPSAodWxvbmcpY3lfcGNpX3BoeXMwOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYmFzZV9hZGRyID0gY3lfcGNpX2FkZHIyOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX2FkZHIgPSBjeV9wY2lfYWRkcjA7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5pcnEgPSAoaW50KSBjeV9wY2lfaXJxOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYnVzX2luZGV4ID0gMTsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmZpcnN0X2xpbmUgPSBjeV9uZXh0X2NoYW5uZWw7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5udW1fY2hpcHMgPSBjeV9wY2lfbmNoYW4vNDsKKwkJY3lfY2FyZFtqXS5wZGV2ID0gcGRldjsKKwkKKyAgICAgICAgICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyBpbiB0aGUgUENJIGludGVyZmFjZSAqLworCQlwbHhfdmVyID0gY3lfcmVhZGIoY3lfcGNpX2FkZHIyICsgQ3lQTFhfVkVSKSAmIDB4MGY7CisJCXN3aXRjaCAocGx4X3ZlcikgeworCQkgICAgY2FzZSBQTFhfOTA1MDoKKworCQkgICAgY3lfd3JpdGViKGN5X3BjaV9hZGRyMCsweDRjLCAweDQzKTsKKwkJICAgIGJyZWFrOworCisJCSAgICBjYXNlIFBMWF85MDYwOgorCQkgICAgY2FzZSBQTFhfOTA4MDoKKwkJICAgIGRlZmF1bHQ6IC8qIE9sZCBib2FyZHMsIHVzZSBQTFhfOTA2MCAqLworCisJCSAgICBwbHhfaW5pdChjeV9wY2lfYWRkcjAsIDB4NmMpOworCQkgICAgLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKKwkJICAgICAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KKwkJICAgICAgIHJlLXdyaXRlIGl0IHRvIHRoZSBQQ0kgY29uZmlnLiByZWdpc3RlcnMuCisJCSAgICAgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudCBmaXguICovCisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBjeV9wY2lfaXJxKTsKKworCQkgICAgY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCsweDY4LCAKKwkJCWN5X3JlYWR3KGN5X3BjaV9hZGRyMCsweDY4KXwweDA5MDApOworCQkgICAgYnJlYWs7CisJCX0KKworICAgICAgICAgICAgICAgIC8qIHByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJICAgICAgIGorMSwgCisJCSAgICAgICAodWxvbmcpY3lfcGNpX3BoeXMyLCAKKwkJICAgICAgICh1bG9uZykoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWXdpbiAtIDEpLAorCQkgICAgICAgKGludCljeV9wY2lfaXJxKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCisJCSAgICBjeV9wY2lfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisKKyAgICAgICAgICAgICAgICBjeV9uZXh0X2NoYW5uZWwgKz0gY3lfcGNpX25jaGFuOworICAgIH1lbHNlIGlmIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWl9Mbyl7CisJICAgIC8qIHByaW50IG1lc3NhZ2UgKi8KKwkJcHJpbnRrKCJDeWNsYWRlcy1aL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKKwkJICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisJCXByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJICAgIGN5eV9yZXZfaWQsIChpbnQpY3lfcGNpX2lycSk7CisJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IGZvdW5kIHdpbmFkZHI9MHglbHggY3RsYWRkcj0weCVseFxuIiwKKwkJICAgICh1bG9uZyljeV9wY2lfcGh5czIsICh1bG9uZyljeV9wY2lfcGh5czApOworCSAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJIG5vdCBzdXBwb3J0ZWQgZm9yIGxvdyBhZGRyZXNzZXNcbiIpOworCSAgICBicmVhazsKKyAgICB9ZWxzZSBpZiAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGkpeworI2lmZGVmIENZX1BDSV9ERUJVRworICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKKwkgICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisgICAgICAgICAgICBwcmludGsoInJldl9pZD0lZCkgSVJRJWRcbiIsCisJCWN5eV9yZXZfaWQsIChpbnQpY3lfcGNpX2lycSk7CisgICAgICAgICAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiBmb3VuZCB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisgICAgICAgICAgICAgICAgKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7CisjZW5kaWYKKwkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1pjdGwpOworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYIGJlZm9yZSByZXNldHRpbmcgaXQgKi8KKwkJY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCsweDY4LAorCQkJY3lfcmVhZHcoY3lfcGNpX2FkZHIwKzB4NjgpICYgfjB4MDkwMCk7CisKKwkJcGx4X2luaXQoY3lfcGNpX2FkZHIwLCAweDZjKTsKKwkJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKKwkJICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bworCQkgICByZS13cml0ZSBpdCB0byB0aGUgUENJIGNvbmZpZy4gcmVnaXN0ZXJzLgorCQkgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudCBmaXguICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGN5X3BjaV9pcnEpOworCisJCW1haWxib3ggPSAodWNsb25nKWN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSAKKwkJCSAgIGN5X3BjaV9hZGRyMCktPm1haWxfYm94XzApOworCisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMikgJiBJT1JFU09VUkNFX0lPKSB7CisJCSAgICBwcmludGsoIiAgV2FybmluZzogUENJIEkvTyBiaXQgaW5jb3JyZWN0bHkgc2V0LiAiCisJCQkgICAiSWdub3JpbmcgaXQuLi5cbiIpOworCQkgICAgcGRldi0+cmVzb3VyY2VbMl0uZmxhZ3MgJj0gfklPUkVTT1VSQ0VfSU87CisJCX0KKworCQkvKiBBbHRob3VnaCB3ZSBkb24ndCB1c2UgdGhpcyBJL08gcmVnaW9uLCB3ZSBzaG91bGQKKwkJICAgcmVxdWVzdCBpdCBmcm9tIHRoZSBrZXJuZWwgYW55d2F5LCB0byBhdm9pZCBwcm9ibGVtcworCQkgICB3aXRoIG90aGVyIGRyaXZlcnMgYWNjZXNzaW5nIGl0LiAqLworCQlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiQ3ljbGFkZXMtWiIpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY3ljbGFkZXM6IGZhaWxlZCB0byByZXNlcnZlIFBDSSByZXNvdXJjZXNcbiIpOworCQkJY29udGludWU7CisJCX0KKwkKKwkJaWYgKG1haWxib3ggPT0gWkVfVjEpIHsKKwkJICAgIGN5X3BjaV9hZGRyMiA9IGlvcmVtYXAoY3lfcGNpX3BoeXMyLCBDeVBDSV9aZV93aW4pOworCQkgICAgaWYgKFplSW5kZXggPT0gTlJfQ0FSRFMpIHsKKwkJCXByaW50aygiQ3ljbGFkZXMtWmUvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkJKHVsb25nKWN5X3BjaV9waHlzMik7CisJCQlwcmludGsoImJ1dCBubyBtb3JlIGNhcmRzIGNhbiBiZSB1c2VkLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7CisJCSAgICB9IGVsc2UgeworCQkJWmVfcGh5czBbWmVJbmRleF0gPSBjeV9wY2lfcGh5czA7CisJCQlaZV9waHlzMltaZUluZGV4XSA9IGN5X3BjaV9waHlzMjsKKwkJCVplX2FkZHIwW1plSW5kZXhdID0gY3lfcGNpX2FkZHIwOworCQkJWmVfYWRkcjJbWmVJbmRleF0gPSBjeV9wY2lfYWRkcjI7CisJCQlaZV9pcnFbWmVJbmRleF0gPSBjeV9wY2lfaXJxOworCQkJWmVfcGRldltaZUluZGV4XSA9IHBkZXY7CisJCQlaZUluZGV4Kys7CisJCSAgICB9CisJCSAgICBpLS07CisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJICAgIGN5X3BjaV9hZGRyMiA9IGlvcmVtYXAoY3lfcGNpX3BoeXMyLCBDeVBDSV9ad2luKTsKKwkJfQorCisjaWZkZWYgQ1lfUENJX0RFQlVHCisgICAgICAgICAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisgICAgICAgICAgICAgICAgKHVsb25nKWN5X3BjaV9hZGRyMiwgKHVsb25nKWN5X3BjaV9hZGRyMCk7CisJICAgIGlmIChtYWlsYm94ID09IFpPX1YxKSB7CisJCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwICopCisJCQkgIChjeV9wY2lfYWRkcjApKS0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCQlQQVVTRQorCQlwcmludGsoIkN5Y2xhZGVzLThaby9QQ0k6IEZQR0EgaWQgJWx4LCB2ZXIgJWx4XG4iLAorCQkgICAgICAgKHVsb25nKSgweGZmICYgY3lfcmVhZGwoJigoc3RydWN0IENVU1RPTV9SRUcgKikKKwkJICAgICAgICAoY3lfcGNpX2FkZHIyKSktPmZwZ2FfaWQpKSwKKwkJICAgICAgICh1bG9uZykoMHhmZiAmIGN5X3JlYWRsKCYoKHN0cnVjdCBDVVNUT01fUkVHICopCisJCSAgICAgICAgKGN5X3BjaV9hZGRyMikpLT5mcGdhX3ZlcnNpb24pKSk7CisJCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwICopCisJCQkgIChjeV9wY2lfYWRkcjApKS0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSk7CisJICAgIH0gZWxzZSB7CisJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IE5ldyBDeWNsYWRlcy1aIGJvYXJkLiAgRlBHQSBub3QgbG9hZGVkXG4iKTsKKwkgICAgfQorI2VuZGlmCisJICAgIC8qIFRoZSBmb2xsb3dpbmcgY2xlYXJzIHRoZSBmaXJtd2FyZSBpZCB3b3JkLiAgVGhpcyBlbnN1cmVzCisJICAgICAgIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBhdHRlbXB0IHRvIHRhbGsgdG8gdGhlIGJvYXJkCisJICAgICAgIHVudGlsIGl0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgorCSAgICAgKi8KKwkJUEFVU0UKKwkJaWYgKChtYWlsYm94ID09IFpPX1YxKSB8fCAobWFpbGJveCA9PSBaT19WMikpCisJCSAgICBjeV93cml0ZWwoY3lfcGNpX2FkZHIyICsgSURfQUREUkVTUywgMEwpOworCisgICAgICAgICAgICAgICAgLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCisgICAgICAgICAgICAgICAgICAgdmVyc2lvbiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgZGV2aWNlX2lkIGFuZCB3aWxsCisgICAgICAgICAgICAgICAgICAgYmUgYWxsb2NhdGVkIGl0cyBtYXhpbXVtIG51bWJlciBvZiBwb3J0cy4gKi8KKyAgICAgICAgICAgICAgICBjeV9wY2lfbmNoYW4gPSA4OworCisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJICAgICh1bG9uZyljeV9wY2lfcGh5czIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG5leHQgY3lfY2FyZCBzdHJ1Y3R1cmUgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBOUl9DQVJEUyA7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gTlJfQ0FSRFMpIHsgICAgLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KKwkJICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJKHVsb25nKWN5X3BjaV9waHlzMik7CisJCSAgICBwcmludGsoImJ1dCBubyBtb3JlIGNhcmRzIGNhbiBiZSB1c2VkLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKwkJICAgIHJldHVybihpKTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKKyAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBJUlEgb25seSBpZiBib2FyZCBoYXMgYW4gSVJRICovCisJCWlmKCAoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpICkgeworCQkgICAgaWYocmVxdWVzdF9pcnEoY3lfcGNpX2lycSwgY3l6X2ludGVycnVwdCwKKwkJCVNBX1NISVJRLCAiQ3ljbGFkZXMtWiIsICZjeV9jYXJkW2pdKSkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLThaby9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJICAgIGN5X3BjaV9pcnEpOworCQkJcmV0dXJuKGkpOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisKKworICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX3BoeXMgPSBjeV9wY2lfcGh5czI7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5jdGxfcGh5cyA9IGN5X3BjaV9waHlzMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X3BjaV9hZGRyMjsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9hZGRyID0gY3lfcGNpX2FkZHIwOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uaXJxID0gKGludCkgY3lfcGNpX2lycTsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJ1c19pbmRleCA9IDE7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0ubnVtX2NoaXBzID0gLTE7CisJCWN5X2NhcmRbal0ucGRldiA9IHBkZXY7CisKKyAgICAgICAgICAgICAgICAvKiBwcmludCBtZXNzYWdlICovCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJCS8qIGRvbid0IHJlcG9ydCBJUlEgaWYgYm9hcmQgaXMgbm8gSVJRICovCisJCWlmKCAoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpICkKKwkJICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9ad2luIC0gMSksCisJCQkoaW50KWN5X3BjaV9pcnEpOworCQllbHNlCisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisJCSAgICBwcmludGsoIkN5Y2xhZGVzLThaby9QQ0kgIyVkOiAweCVseC0weCVseCwgIiwKKwkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9ad2luIC0gMSkpOworCisgICAgICAgICAgICAgICAgcHJpbnRrKCIlZCBjaGFubmVscyBzdGFydGluZyBmcm9tIHBvcnQgJWQuXG4iLAorCQkgICAgY3lfcGNpX25jaGFuLGN5X25leHRfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgY3lfbmV4dF9jaGFubmVsICs9IGN5X3BjaV9uY2hhbjsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IFplSW5kZXggIT0gMCAmJiBpIDwgTlJfQ0FSRFM7IGkrKykgeworCSAgICBjeV9wY2lfcGh5czAgPSBaZV9waHlzMFswXTsKKwkgICAgY3lfcGNpX3BoeXMyID0gWmVfcGh5czJbMF07CisJICAgIGN5X3BjaV9hZGRyMCA9IFplX2FkZHIwWzBdOworCSAgICBjeV9wY2lfYWRkcjIgPSBaZV9hZGRyMlswXTsKKwkgICAgY3lfcGNpX2lycSA9IFplX2lycVswXTsKKwkgICAgcGRldiA9IFplX3BkZXZbMF07CisJICAgIGZvciAoaiA9IDAgOyBqIDwgWmVJbmRleC0xIDsgaisrKSB7CisJCVplX3BoeXMwW2pdID0gWmVfcGh5czBbaisxXTsKKwkJWmVfcGh5czJbal0gPSBaZV9waHlzMltqKzFdOworCQlaZV9hZGRyMFtqXSA9IFplX2FkZHIwW2orMV07CisJCVplX2FkZHIyW2pdID0gWmVfYWRkcjJbaisxXTsKKwkJWmVfaXJxW2pdID0gWmVfaXJxW2orMV07CisJCVplX3BkZXZbal0gPSBaZV9wZGV2W2orMV07CisJICAgIH0KKwkgICAgWmVJbmRleC0tOworCQltYWlsYm94ID0gKHVjbG9uZyljeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikgCisJCQkJCSAgIGN5X3BjaV9hZGRyMCktPm1haWxfYm94XzApOworI2lmZGVmIENZX1BDSV9ERUJVRworICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aL1BDSTogcmVsb2NhdGUgd2luYWRkcj0weCVseCBjdGxhZGRyPTB4JWx4XG4iLAorICAgICAgICAgICAgICAgICh1bG9uZyljeV9wY2lfYWRkcjIsICh1bG9uZyljeV9wY2lfYWRkcjApOworCSAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiBOZXcgQ3ljbGFkZXMtWiBib2FyZC4gIEZQR0Egbm90IGxvYWRlZFxuIik7CisjZW5kaWYKKwkJUEFVU0UKKyAgICAgICAgICAgICAgICAvKiBUaGlzIG11c3QgYmUgdGhlIG5ldyBDeWNsYWRlcy1aZS9QQ0kuICovCisgICAgICAgICAgICAgICAgY3lfcGNpX25jaGFuID0gWkVfVjFfTlBPUlRTOworCisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbGFkZXMtWmUvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkgICAgKHVsb25nKWN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBubyBjaGFubmVscyBhcmUgYXZhaWxhYmxlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9QT1JUUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgbmV4dCBjeV9jYXJkIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IE5SX0NBUkRTIDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3lfY2FyZFtqXS5iYXNlX2FkZHIgPT0gMCkgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBOUl9DQVJEUykgeyAgICAvKiBubyBtb3JlIGN5X2NhcmRzIGF2YWlsYWJsZSAqLworCQkgICAgcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSh1bG9uZyljeV9wY2lfcGh5czIpOworCQkgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7CisJCSAgICByZXR1cm4oaSk7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgSVJRIG9ubHkgaWYgYm9hcmQgaGFzIGFuIElSUSAqLworCQlpZiggKGN5X3BjaV9pcnEgIT0gMCkgJiYgKGN5X3BjaV9pcnEgIT0gMjU1KSApIHsKKwkJICAgIGlmKHJlcXVlc3RfaXJxKGN5X3BjaV9pcnEsIGN5el9pbnRlcnJ1cHQsCisJCQlTQV9TSElSUSwgIkN5Y2xhZGVzLVoiLCAmY3lfY2FyZFtqXSkpCisJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1aZS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJICAgIGN5X3BjaV9pcnEpOworCQkJcmV0dXJuKGkpOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisKKyAgICAgICAgICAgICAgICAvKiBzZXQgY3lfY2FyZCAqLworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYmFzZV9waHlzID0gY3lfcGNpX3BoeXMyOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX3BoeXMgPSBjeV9wY2lfcGh5czA7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX2FkZHIgPSBjeV9wY2lfYWRkcjI7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5jdGxfYWRkciA9IGN5X3BjaV9hZGRyMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmlycSA9IChpbnQpIGN5X3BjaV9pcnE7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5idXNfaW5kZXggPSAxOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uZmlyc3RfbGluZSA9IGN5X25leHRfY2hhbm5lbDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLm51bV9jaGlwcyA9IC0xOworCQljeV9jYXJkW2pdLnBkZXYgPSBwZGV2OworCisgICAgICAgICAgICAgICAgLyogcHJpbnQgbWVzc2FnZSAqLworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCQkvKiBkb24ndCByZXBvcnQgSVJRIGlmIGJvYXJkIGlzIG5vIElSUSAqLworCQlpZiggKGN5X3BjaV9pcnEgIT0gMCkgJiYgKGN5X3BjaV9pcnEgIT0gMjU1KSApCisJCSAgICBwcmludGsoIkN5Y2xhZGVzLVplL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9aZV93aW4gLSAxKSwKKwkJCShpbnQpY3lfcGNpX2lycSk7CisJCWVsc2UKKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwkJICAgIHByaW50aygiQ3ljbGFkZXMtWmUvUENJICMlZDogMHglbHgtMHglbHgsICIsCisJCQlqKzEsKHVsb25nKWN5X3BjaV9waHlzMiwKKwkJCSh1bG9uZykoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWmVfd2luIC0gMSkpOworCisgICAgICAgICAgICAgICAgcHJpbnRrKCIlZCBjaGFubmVscyBzdGFydGluZyBmcm9tIHBvcnQgJWQuXG4iLAorCQkgICAgY3lfcGNpX25jaGFuLGN5X25leHRfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgY3lfbmV4dF9jaGFubmVsICs9IGN5X3BjaV9uY2hhbjsKKyAgICAgICAgfQorCWlmIChaZUluZGV4ICE9IDApIHsKKwkgICAgcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgZm91bmQgYXQgMHgleCAiLAorCQkodW5zaWduZWQgaW50KSBaZV9waHlzMlswXSk7CisJICAgIHByaW50aygiYnV0IG5vIG1vcmUgY2FyZHMgY2FuIGJlIHVzZWQuXG4iKTsKKyAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKwl9CisgICAgICAgIHJldHVybihpKTsKKyNlbHNlCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfUENJICovCit9IC8qIGN5X2RldGVjdF9wY2kgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIHByaW50cyBvdXQgdGhlIGFwcHJvcHJpYXRlIHNlcmlhbCBkcml2ZXIgdmVyc2lvbiBudW1iZXIKKyAqIGFuZCBpZGVudGlmaWVzIHdoaWNoIG9wdGlvbnMgd2VyZSBjb25maWd1cmVkIGludG8gdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2hvd192ZXJzaW9uKHZvaWQpCit7CisgIGNoYXIgKnJjc3ZlcnMsICpyY3NkYXRlLCAqdG1wOworICAgIHJjc3ZlcnMgPSBzdHJjaHIocmNzaWQsICcgJyk7IHJjc3ZlcnMrKzsKKyAgICB0bXAgPSBzdHJjaHIocmNzdmVycywgJyAnKTsgKnRtcCsrID0gJ1wwJzsKKyAgICByY3NkYXRlID0gc3RyY2hyKHRtcCwgJyAnKTsgcmNzZGF0ZSsrOworICAgIHRtcCA9IHN0cnJjaHIocmNzZGF0ZSwgJyAnKTsgKnRtcCA9ICdcMCc7CisgICAgcHJpbnRrKCJDeWNsYWRlcyBkcml2ZXIgJXMgJXNcbiIsCisgICAgICAgIHJjc3ZlcnMsIHJjc2RhdGUpOworICAgIHByaW50aygiICAgICAgICBidWlsdCAlcyAlc1xuIiwKKwlfX0RBVEVfXywgX19USU1FX18pOworfSAvKiBzaG93X3ZlcnNpb24gKi8KKworc3RhdGljIGludCAKK2N5Y2xhZGVzX2dldF9wcm9jX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICAqaW5mbzsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuPTA7CisgICAgb2ZmX3QgYmVnaW49MDsKKyAgICBvZmZfdCBwb3M9MDsKKyAgICBpbnQgc2l6ZTsKKyAgICBfX3UzMiBjdXJfamlmcyA9IGppZmZpZXM7CisKKyAgICBzaXplID0gc3ByaW50ZihidWYsICJEZXYgVGltZU9wZW4gICBCeXRlc091dCAgSWRsZU91dCAgICBCeXRlc0luICAgSWRsZUluICBPdmVycnVucyAgTGRpc2NcbiIpOworCisgICAgcG9zICs9IHNpemU7CisgICAgbGVuICs9IHNpemU7CisKKyAgICAvKiBPdXRwdXQgb25lIGxpbmUgZm9yIGVhY2gga25vd24gcG9ydCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUyAmJiBjeV9wb3J0W2ldLmxpbmUgPj0gMDsgaSsrKSB7CisJaW5mbyA9ICZjeV9wb3J0W2ldOworCisJaWYgKGluZm8tPmNvdW50KQorCSAgICBzaXplID0gc3ByaW50ZihidWYrbGVuLAorCQkJIiUzZCAlOGx1ICUxMGx1ICU4bHUgJTEwbHUgJThsdSAlOWx1ICU2bGRcbiIsCisJCQlpbmZvLT5saW5lLAorCQkJSklGRklFU19ESUZGKGluZm8tPmlkbGVfc3RhdHMuaW5fdXNlLCBjdXJfamlmcykgLyBIWiwKKwkJCWluZm8tPmlkbGVfc3RhdHMueG1pdF9ieXRlcywKKwkJCUpJRkZJRVNfRElGRihpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSwgY3VyX2ppZnMpIC8gSFosCisJCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMsCisJCQlKSUZGSUVTX0RJRkYoaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUsIGN1cl9qaWZzKSAvIEhaLAorCQkJaW5mby0+aWRsZV9zdGF0cy5vdmVycnVucywKKwkJCShsb25nKSBpbmZvLT50dHktPmxkaXNjLm51bSk7CisJZWxzZQorCSAgICBzaXplID0gc3ByaW50ZihidWYrbGVuLAorCQkJIiUzZCAlOGx1ICUxMGx1ICU4bHUgJTEwbHUgJThsdSAlOWx1ICU2bGRcbiIsCisJCQlpbmZvLT5saW5lLCAwTCwgMEwsIDBMLCAwTCwgMEwsIDBMLCAwTCk7CisJbGVuICs9IHNpemU7CisJcG9zID0gYmVnaW4gKyBsZW47CisKKwlpZiAocG9zIDwgb2Zmc2V0KSB7CisJICAgIGxlbiAgID0gMDsKKwkgICAgYmVnaW4gPSBwb3M7CisJfQorCWlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisJICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgKmVvZiA9IDE7Citkb25lOgorICAgICpzdGFydCA9IGJ1ZiArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisgICAgbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CQkvKiBTdGFydCBzbG9wICovCisgICAgaWYgKGxlbiA+IGxlbmd0aCkKKwlsZW4gPSBsZW5ndGg7CQkJLyogRW5kaW5nIHNsb3AgKi8KKyAgICBpZiAobGVuIDwgMCkKKwlsZW4gPSAwOworICAgIHJldHVybiBsZW47Cit9CisKKy8qIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICAgIEhhcmR3YXJlIEkvTyBwb3J0cyBhcmUgbWFwcGVkIHRvIGNoYXJhY3RlciBzcGVjaWFsIGRldmljZXMgb24gYQorICAgIGZpcnN0IGZvdW5kLCBmaXJzdCBhbGxvY2F0ZWQgbWFubmVyLiAgVGhhdCBpcywgdGhpcyBjb2RlIHNlYXJjaGVzCisgICAgZm9yIEN5Y2xvbSBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgQXMgZWFjaCBpcyBmb3VuZCwgaXQgaXMgcHJvYmVkCisgICAgdG8gZGlzY292ZXIgaG93IG1hbnkgY2hpcHMgKGFuZCB0aHVzIGhvdyBtYW55IHBvcnRzKSBhcmUgcHJlc2VudC4KKyAgICBUaGVzZSBwb3J0cyBhcmUgbWFwcGVkIHRvIHRoZSB0dHkgcG9ydHMgMzIgYW5kIHVwd2FyZCBpbiBtb25vdG9uaWMKKyAgICBmYXNoaW9uLiAgSWYgYW4gOC1wb3J0IGNhcmQgaXMgcmVwbGFjZWQgd2l0aCBhIDE2LXBvcnQgY2FyZCwgdGhlCisgICAgcG9ydCBtYXBwaW5nIG9uIGEgZm9sbG93aW5nIGNhcmQgd2lsbCBzaGlmdC4KKworICAgIFRoaXMgYXBwcm9hY2ggaXMgZGlmZmVyZW50IGZyb20gd2hhdCBpcyB1c2VkIGluIHRoZSBvdGhlciBzZXJpYWwKKyAgICBkZXZpY2UgZHJpdmVyIGJlY2F1c2UgdGhlIEN5Y2xvbSBpcyBtb3JlIHByb3Blcmx5IGEgbXVsdGlwbGV4ZXIsCisgICAgbm90IGp1c3QgYW4gYWdncmVnYXRpb24gb2Ygc2VyaWFsIHBvcnRzIG9uIG9uZSBjYXJkLgorCisgICAgSWYgdGhlcmUgYXJlIG1vcmUgY2FyZHMgd2l0aCBtb3JlIHBvcnRzIHRoYW4gaGF2ZSBiZWVuCisgICAgc3RhdGljYWxseSBhbGxvY2F0ZWQgYWJvdmUsIGEgd2FybmluZyBpcyBwcmludGVkIGFuZCB0aGUKKyAgICBleHRyYSBwb3J0cyBhcmUgaWdub3JlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGN5X29wcyA9IHsKKyAgICAub3BlbiA9IGN5X29wZW4sCisgICAgLmNsb3NlID0gY3lfY2xvc2UsCisgICAgLndyaXRlID0gY3lfd3JpdGUsCisgICAgLnB1dF9jaGFyID0gY3lfcHV0X2NoYXIsCisgICAgLmZsdXNoX2NoYXJzID0gY3lfZmx1c2hfY2hhcnMsCisgICAgLndyaXRlX3Jvb20gPSBjeV93cml0ZV9yb29tLAorICAgIC5jaGFyc19pbl9idWZmZXIgPSBjeV9jaGFyc19pbl9idWZmZXIsCisgICAgLmZsdXNoX2J1ZmZlciA9IGN5X2ZsdXNoX2J1ZmZlciwKKyAgICAuaW9jdGwgPSBjeV9pb2N0bCwKKyAgICAudGhyb3R0bGUgPSBjeV90aHJvdHRsZSwKKyAgICAudW50aHJvdHRsZSA9IGN5X3VudGhyb3R0bGUsCisgICAgLnNldF90ZXJtaW9zID0gY3lfc2V0X3Rlcm1pb3MsCisgICAgLnN0b3AgPSBjeV9zdG9wLAorICAgIC5zdGFydCA9IGN5X3N0YXJ0LAorICAgIC5oYW5ndXAgPSBjeV9oYW5ndXAsCisgICAgLmJyZWFrX2N0bCA9IGN5X2JyZWFrLAorICAgIC53YWl0X3VudGlsX3NlbnQgPSBjeV93YWl0X3VudGlsX3NlbnQsCisgICAgLnJlYWRfcHJvYyA9IGN5Y2xhZGVzX2dldF9wcm9jX2luZm8sCisgICAgLnRpb2NtZ2V0ID0gY3lfdGlvY21nZXQsCisgICAgLnRpb2Ntc2V0ID0gY3lfdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorY3lfaW5pdCh2b2lkKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAgKmluZm87CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKyAgaW50IG51bWJlcl96X2JvYXJkcyA9IDA7CisgIGludCBib2FyZCxwb3J0LGksaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgbWFpbGJveDsKKyAgdW5zaWduZWQgc2hvcnQgY2hpcF9udW1iZXI7CisgIGludCBucG9ydHM7CisKKyAgICBjeV9zZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7CisgICAgaWYgKCFjeV9zZXJpYWxfZHJpdmVyKQorCXJldHVybiAtRU5PTUVNOworICAgIHNob3dfdmVyc2lvbigpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKyAgICAKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImN5Y2xhZGVzIjsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eUMiOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0MiOworICAgIGN5X3NlcmlhbF9kcml2ZXItPm1ham9yID0gQ1lDTEFERVNfTUFKT1I7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworICAgIGN5X3NlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworICAgIGN5X3NlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKyAgICAgICAgICAgIEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisgICAgdHR5X3NldF9vcGVyYXRpb25zKGN5X3NlcmlhbF9kcml2ZXIsICZjeV9vcHMpOworCisgICAgaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcikpCisgICAgICAgICAgICBwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlclxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQ0FSRFM7IGkrKykgeworICAgICAgICAgICAgLyogYmFzZV9hZGRyPTAgaW5kaWNhdGVzIGJvYXJkIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgY3lfY2FyZFtpXS5iYXNlX2FkZHIgPSBOVUxMOworICAgIH0KKworICAgIC8qIHRoZSBjb2RlIGJlbG93IGlzIHJlc3BvbnNpYmxlIHRvIGZpbmQgdGhlIGJvYXJkcy4gRWFjaCBkaWZmZXJlbnQKKyAgICAgICB0eXBlIG9mIGJvYXJkIGhhcyBpdHMgb3duIGRldGVjdGlvbiByb3V0aW5lLiBJZiBhIGJvYXJkIGlzIGZvdW5kLAorICAgICAgIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSBpcyBzZXQgYnkgdGhlIGRldGVjdGlvbgorICAgICAgIHJvdXRpbmUuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZQorICAgICAgIGF2YWlsYWJpbGl0eSBvZiBjeV9jYXJkIGFuZCBjeV9wb3J0IGRhdGEgc3RydWN0dXJlcyBhbmQgdXBkYXRpbmcKKyAgICAgICB0aGUgY3lfbmV4dF9jaGFubmVsLiAqLworCisgICAgLyogbG9vayBmb3IgaXNhIGJvYXJkcyAqLworICAgIGN5X2lzYV9uYm9hcmQgPSBjeV9kZXRlY3RfaXNhKCk7CisKKyAgICAvKiBsb29rIGZvciBwY2kgYm9hcmRzICovCisgICAgY3lfcGNpX25ib2FyZCA9IGN5X2RldGVjdF9wY2koKTsKKworICAgIGN5X25ib2FyZCA9IGN5X2lzYV9uYm9hcmQgKyBjeV9wY2lfbmJvYXJkOworCisgICAgLyogaW52YWxpZGF0ZSByZW1haW5pbmcgY3lfY2FyZCBzdHJ1Y3R1cmVzICovCisgICAgZm9yIChpID0gMCA7IGkgPCBOUl9DQVJEUyA7IGkrKykgeworICAgICAgICBpZiAoY3lfY2FyZFtpXS5iYXNlX2FkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uZmlyc3RfbGluZSA9IC0xOworICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uY3RsX2FkZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uaXJxID0gMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2ldLmJ1c19pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtpXS5maXJzdF9saW5lID0gMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2ldLm51bV9jaGlwcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogaW52YWxpZGF0ZSByZW1haW5pbmcgY3lfcG9ydCBzdHJ1Y3R1cmVzICovCisgICAgZm9yIChpID0gY3lfbmV4dF9jaGFubmVsIDsgaSA8IE5SX1BPUlRTIDsgaSsrKSB7CisgICAgICAgIGN5X3BvcnRbaV0ubGluZSA9IC0xOworICAgICAgICBjeV9wb3J0W2ldLm1hZ2ljID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBwZXItcG9ydCBkYXRhIHN0cnVjdHVyZXMgZm9yIGVhY2ggdmFsaWQgYm9hcmQgZm91bmQgKi8KKyAgICBmb3IgKGJvYXJkID0gMCA7IGJvYXJkIDwgY3lfbmJvYXJkIDsgYm9hcmQrKykgeworICAgICAgICAgICAgY2luZm8gPSAmY3lfY2FyZFtib2FyZF07CisgICAgICAgICAgICBpZiAoY2luZm8tPm51bV9jaGlwcyA9PSAtMSkgeyAvKiBDeWNsYWRlcy1aICovCisJCW51bWJlcl96X2JvYXJkcysrOworCQltYWlsYm94ID0gY3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopCisJCQkgICAgIGN5X2NhcmRbYm9hcmRdLmN0bF9hZGRyKS0+bWFpbF9ib3hfMCk7CisJCW5wb3J0cyA9IChtYWlsYm94ID09IFpFX1YxKSA/IFpFX1YxX05QT1JUUyA6IDg7CisJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAwOworCQljaW5mby0+bnBvcnRzID0gMDsgLyogV2lsbCBiZSBjb3JyZWN0bHkgc2V0IGxhdGVyLCBhZnRlciAKKwkJCQkgICAgICBaIEZXIGlzIGxvYWRlZCAqLworCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7CisgICAgICAgICAgICAgICAgZm9yIChwb3J0ID0gY2luZm8tPmZpcnN0X2xpbmUgOworICAgICAgICAgICAgICAgICAgICAgcG9ydCA8IGNpbmZvLT5maXJzdF9saW5lICsgbnBvcnRzOworICAgICAgICAgICAgICAgICAgICAgcG9ydCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W3BvcnRdOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5tYWdpYyA9IENZQ0xBREVTX01BR0lDOworICAgICAgICAgICAgICAgICAgICBpbmZvLT50eXBlID0gUE9SVF9TVEFSVEVDSDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2FyZCA9IGJvYXJkOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5saW5lID0gcG9ydDsKKwkJICAgIGluZm8tPmNoaXBfcmV2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOworICAgICAgICAgICAgICAgICAgICBpbmZvLT50dHkgPSBOVUxMOworCQkgICAgaWYgKG1haWxib3ggPT0gWk9fVjEpCisJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IENZWl9GSUZPX1NJWkU7CisJCSAgICBlbHNlCisJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDQgKiBDWVpfRklGT19TSVpFOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmNvcjMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3I0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yNSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnRicHIgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT50Y28gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYnByID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+cmNvID0gMDsKKwkJICAgIGluZm8tPmN1c3RvbV9kaXZpc29yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCQkgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gQ0xPU0lOR19XQUlUX0RFTEFZOworCQkgICAgaW5mby0+aWNvdW50LmN0cyA9IGluZm8tPmljb3VudC5kc3IgPSAKKwkJCWluZm8tPmljb3VudC5ybmcgPSBpbmZvLT5pY291bnQuZGNkID0gMDsKKwkJICAgIGluZm8tPmljb3VudC5yeCA9IGluZm8tPmljb3VudC50eCA9IDA7CisJCSAgICBpbmZvLT5pY291bnQuZnJhbWUgPSBpbmZvLT5pY291bnQucGFyaXR5ID0gMDsKKwkJICAgIGluZm8tPmljb3VudC5vdmVycnVuID0gaW5mby0+aWNvdW50LmJyayA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7CisJCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKKwkJICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+c2Vzc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT5wZ3JwICovCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT50aW1lb3V0ICovCisJCSAgICAvKiBCZW50c29uJ3MgdmFycyAqLworICAgICAgICAgICAgICAgICAgICBpbmZvLT5qaWZmaWVzWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+amlmZmllc1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmppZmZpZXNbMl0gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZmx1c2hfY291bnQgPSAwOworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCQkgICAgaW5pdF90aW1lcigmY3l6X3J4X2Z1bGxfdGltZXJbcG9ydF0pOworCQkgICAgY3l6X3J4X2Z1bGxfdGltZXJbcG9ydF0uZnVuY3Rpb24gPSBOVUxMOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfWVsc2V7IC8qIEN5Y2xvbS1ZIG9mIHNvbWUga2luZCovCisgICAgICAgICAgICAgICAgaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OworCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7CisJCWNpbmZvLT5ucG9ydHMgPSBDeVBPUlRTX1BFUl9DSElQICogY2luZm8tPm51bV9jaGlwczsKKyAgICAgICAgICAgICAgICBmb3IgKHBvcnQgPSBjaW5mby0+Zmlyc3RfbGluZSA7CisgICAgICAgICAgICAgICAgICAgICBwb3J0IDwgY2luZm8tPmZpcnN0X2xpbmUgKyBjaW5mby0+bnBvcnRzIDsKKyAgICAgICAgICAgICAgICAgICAgIHBvcnQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSAmY3lfcG9ydFtwb3J0XTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bWFnaWMgPSBDWUNMQURFU19NQUdJQzsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+dHlwZSA9IFBPUlRfQ0lSUlVTOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jYXJkID0gYm9hcmQ7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmxpbmUgPSBwb3J0OworICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnR0eSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfZmlmb19zaXplID0gQ3lNQVhfQ0hBUl9GSUZPOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORXxDeV8xX1NUT1B8Q3lfOF9CSVRTOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IyID0gQ3lFVEM7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmNvcjMgPSAweDA4OyAvKiBfdmVyeV8gc21hbGwgcmN2IHRocmVzaG9sZCAqLworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3I0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yNSA9IDA7CisJCSAgICBpbmZvLT5jdXN0b21fZGl2aXNvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJICAgIGluZm8tPmNsb3Npbmdfd2FpdCA9IENMT1NJTkdfV0FJVF9ERUxBWTsKKwkJICAgIGluZm8tPmljb3VudC5jdHMgPSBpbmZvLT5pY291bnQuZHNyID0gCisJCQlpbmZvLT5pY291bnQucm5nID0gaW5mby0+aWNvdW50LmRjZCA9IDA7CisJCSAgICBpbmZvLT5pY291bnQucnggPSBpbmZvLT5pY291bnQudHggPSAwOworCQkgICAgaW5mby0+aWNvdW50LmZyYW1lID0gaW5mby0+aWNvdW50LnBhcml0eSA9IDA7CisJCSAgICBpbmZvLT5pY291bnQub3ZlcnJ1biA9IGluZm8tPmljb3VudC5icmsgPSAwOworCQkgICAgY2hpcF9udW1iZXIgPSAocG9ydCAtIGNpbmZvLT5maXJzdF9saW5lKSAvIDQ7CisJCSAgICBpZiAoKGluZm8tPmNoaXBfcmV2ID0KKwkJCSBjeV9yZWFkYihjaW5mby0+YmFzZV9hZGRyICsKKwkJCQkgIChjeV9jaGlwX29mZnNldFtjaGlwX251bWJlcl08PGluZGV4KSArCisJCQkJICAoQ3lHRlJDUjw8aW5kZXgpKSkgPj0gQ0QxNDAwX1JFVl9KKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBpcyBhIENEMTQwMCByZXYuIEogb3IgbGF0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRicHIgPSBiYXVkX2Jwcl82MFsxM107IC8qIFR4IEJQUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGNvID0gYmF1ZF9jb182MFsxM107IC8qIFR4IENPICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYnByID0gYmF1ZF9icHJfNjBbMTNdOyAvKiBSeCBCUFIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJjbyA9IGJhdWRfY29fNjBbMTNdOyAvKiBSeCBDTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cmZsb3cgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cnRzZHRyX2ludiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT50YnByID0gYmF1ZF9icHJfMjVbMTNdOyAvKiBUeCBCUFIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRjbyA9IGJhdWRfY29fMjVbMTNdOyAvKiBUeCBDTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cmJwciA9IGJhdWRfYnByXzI1WzEzXTsgLyogUnggQlBSICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yY28gPSBiYXVkX2NvXzI1WzEzXTsgLyogUnggQ08gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJmbG93ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJ0c2R0cl9pbnYgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7CisJCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKKwkJICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+c2Vzc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT5wZ3JwICovCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPQorCQkgICAgICAgICAgICAgICAgICBDeVRJTUVPVVR8IEN5U1BFQ0hBUnwgQ3lCUkVBSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ3lQQVJJVFl8IEN5RlJBTUV8IEN5T1ZFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+dGltZW91dCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgQ09ORklHX0NZWl9JTlRSCisgICAgaWYgKG51bWJlcl96X2JvYXJkcyAmJiAhY3l6X3RpbWVyb24peworCWN5el90aW1lcm9uKys7CisJY3l6X3RpbWVybGlzdC5leHBpcmVzID0gamlmZmllcyArIDE7CisJYWRkX3RpbWVyKCZjeXpfdGltZXJsaXN0KTsKKyNpZmRlZiBDWV9QQ0lfREVCVUcKKwlwcmludGsoIkN5Y2xhZGVzLVogcG9sbGluZyBpbml0aWFsaXplZFxuIik7CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisKKyAgICByZXR1cm4gMDsKKyAgICAKK30gLyogY3lfaW5pdCAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQKK2N5X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgaW50IGksIGUxOworCisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorICAgIGlmIChjeXpfdGltZXJvbil7CisJY3l6X3RpbWVyb24gPSAwOworCWRlbF90aW1lcigmY3l6X3RpbWVybGlzdCk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCisgICAgaWYgKChlMSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKSkpCisgICAgICAgICAgICBwcmludGsoImN5YzogZmFpbGVkIHRvIHVucmVnaXN0ZXIgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlciglZClcbiIsCisJCWUxKTsKKworICAgIHB1dF90dHlfZHJpdmVyKGN5X3NlcmlhbF9kcml2ZXIpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5SX0NBUkRTOyBpKyspIHsKKyAgICAgICAgaWYgKGN5X2NhcmRbaV0uYmFzZV9hZGRyKSB7CisJICAgIGlvdW5tYXAoY3lfY2FyZFtpXS5iYXNlX2FkZHIpOworCSAgICBpZiAoY3lfY2FyZFtpXS5jdGxfYWRkcikKKwkJaW91bm1hcChjeV9jYXJkW2ldLmN0bF9hZGRyKTsKKwkgICAgaWYgKGN5X2NhcmRbaV0uaXJxCisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorCQkmJiBjeV9jYXJkW2ldLm51bV9jaGlwcyAhPSAtMSAvKiBub3QgYSBaIGNhcmQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwkgICAgKQorCQlmcmVlX2lycShjeV9jYXJkW2ldLmlycSwgJmN5X2NhcmRbaV0pOworI2lmZGVmIENPTkZJR19QQ0kKKwkJaWYgKGN5X2NhcmRbaV0ucGRldikKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY3lfY2FyZFtpXS5wZGV2KTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIGlmICh0bXBfYnVmKSB7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0bXBfYnVmKTsKKwl0bXBfYnVmID0gTlVMTDsKKyAgICB9Cit9IC8qIGN5X2NsZWFudXBfbW9kdWxlICovCisKK21vZHVsZV9pbml0KGN5X2luaXQpOworbW9kdWxlX2V4aXQoY3lfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGVjc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZGVjc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExNDQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kZWNzZXJpYWwuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIHNlcmNvbnMuYworICogICAgICBjaG9vc2UgdGhlIHJpZ2h0IHNlcmlhbCBkZXZpY2UgYXQgYm9vdCB0aW1lCisgKgorICogdHJpZW1lciA2LVNFUC0xOTk4CisgKiAgICAgIHNlcmNvbnMuYyBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIAorICogICAgICBvZiBzZXJpYWwgZGV2aWNlcyB1bmRlciB0aGUgZGVjc3RhdGlvbiB3b3JsZCB0byBjby1leGlzdAorICogICAgICBpbiB0aGUgc2FtZSBrZXJuZWwuICBUaGUgaWRlYSBoZXJlIGlzIHRvIGFic3RyYWN0IAorICogICAgICB0aGUgcGllY2VzIG9mIHRoZSBkcml2ZXJzIHRoYXQgYXJlIGNvbW1vbiB0byB0aGlzIGZpbGUKKyAqICAgICAgc28gdGhhdCB0aGV5IGRvIG5vdCBjbGFzaCBhdCBjb21waWxlIHRpbWUgYW5kIHJ1bnRpbWUuCisgKgorICogSEsgMTYtU0VQLTE5OTggdjAuMDAyCisgKiAgICAgIHJlbW92ZWQgdGhlIFBST00gY29uc29sZSBhcyB0aGlzIGlzIG5vdCBhIHJlYWwgc2VyaWFsCisgKiAgICAgIGRldmljZS4gQWRkZWQgc3VwcG9ydCBmb3IgUFJPTSBjb25zb2xlIGluIGRyaXZlcnMvY2hhci90dHlfaW8uYworICogICAgICBpbnN0ZWFkLiBBbHRob3VnaCBpdCBtYXkgd29yayB0byBlbmFibGUgbW9yZSB0aGFuIG9uZSAKKyAqICAgICAgY29uc29sZSBkZXZpY2UgSSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIG9ubHkgb25lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2RlYy9tYWNodHlwZS5oPgorCisjaWZkZWYgQ09ORklHX1pTCitleHRlcm4gaW50IHpzX2luaXQodm9pZCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EWgorZXh0ZXJuIGludCBkel9pbml0KHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKKworI2lmZGVmIENPTkZJR19aUworZXh0ZXJuIHZvaWQgenNfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RaCitleHRlcm4gdm9pZCBkel9zZXJpYWxfY29uc29sZV9pbml0KHZvaWQpOworI2VuZGlmCisKKyNlbmRpZgorCisvKiByc19pbml0IC0gc3RhcnRzIHVwIHRoZSBzZXJpYWwgaW50ZXJmYWNlIC0KKyAgIGhhbmRsZSBub3JtYWwgY2FzZSBvZiBzdGFydGluZyB1cCB0aGUgc2VyaWFsIGludGVyZmFjZSAqLworCisjaWZkZWYgQ09ORklHX1NFUklBTAorCitpbnQgX19pbml0IHJzX2luaXQodm9pZCkKK3sKKworI2lmIGRlZmluZWQoQ09ORklHX1pTKSAmJiBkZWZpbmVkKENPTkZJR19EWikKKyAgICBpZiAoSU9BU0lDKQorCXJldHVybiB6c19pbml0KCk7CisgICAgZWxzZQorCXJldHVybiBkel9pbml0KCk7CisjZWxzZQorCisjaWZkZWYgQ09ORklHX1pTCisgICAgcmV0dXJuIHpzX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RaCisgICAgcmV0dXJuIGR6X2luaXQoKTsKKyNlbmRpZgorCisjZW5kaWYKK30KKworX19pbml0Y2FsbChyc19pbml0KTsKKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKKworLyogc2VyaWFsX2NvbnNvbGVfaW5pdCBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2Ygc3RhcnRpbmcKKyAqICAgdXAgdGhlIGNvbnNvbGUgb24gdGhlIHNlcmlhbCBwb3J0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGRlY3NlcmlhbF9jb25zb2xlX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19aUykgJiYgZGVmaW5lZChDT05GSUdfRFopCisgICAgaWYgKElPQVNJQykKKwl6c19zZXJpYWxfY29uc29sZV9pbml0KCk7CisgICAgZWxzZQorCWR6X3NlcmlhbF9jb25zb2xlX2luaXQoKTsKKyNlbHNlCisKKyNpZmRlZiBDT05GSUdfWlMKKyAgICB6c19zZXJpYWxfY29uc29sZV9pbml0KCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EWgorICAgIGR6X3NlcmlhbF9jb25zb2xlX2luaXQoKTsKKyNlbmRpZgorCisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoZGVjc2VyaWFsX2NvbnNvbGVfaW5pdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RlZmtleW1hcC5jX3NoaXBwZWQgYi9kcml2ZXJzL2NoYXIvZGVma2V5bWFwLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTNhMmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RlZmtleW1hcC5jX3NoaXBwZWQKQEAgLTAsMCArMSwyNjIgQEAKKy8qIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICAgKi8KKy8qICAgIGxvYWRrZXlzIC0tbWt0YWJsZSBkZWZrZXltYXAubWFwID4gZGVma2V5bWFwLmMgICAgICAgICAgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCit1X3Nob3J0IHBsYWluX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjAxYiwJMHhmMDMxLAkweGYwMzIsCTB4ZjAzMywJMHhmMDM0LAkweGYwMzUsCTB4ZjAzNiwKKwkweGYwMzcsCTB4ZjAzOCwJMHhmMDM5LAkweGYwMzAsCTB4ZjAyZCwJMHhmMDNkLAkweGYwN2YsCTB4ZjAwOSwKKwkweGZiNzEsCTB4ZmI3NywJMHhmYjY1LAkweGZiNzIsCTB4ZmI3NCwJMHhmYjc5LAkweGZiNzUsCTB4ZmI2OSwKKwkweGZiNmYsCTB4ZmI3MCwJMHhmMDViLAkweGYwNWQsCTB4ZjIwMSwJMHhmNzAyLAkweGZiNjEsCTB4ZmI3MywKKwkweGZiNjQsCTB4ZmI2NiwJMHhmYjY3LAkweGZiNjgsCTB4ZmI2YSwJMHhmYjZiLAkweGZiNmMsCTB4ZjAzYiwKKwkweGYwMjcsCTB4ZjA2MCwJMHhmNzAwLAkweGYwNWMsCTB4ZmI3YSwJMHhmYjc4LAkweGZiNjMsCTB4ZmI3NiwKKwkweGZiNjIsCTB4ZmI2ZSwJMHhmYjZkLAkweGYwMmMsCTB4ZjAyZSwJMHhmMDJmLAkweGY3MDAsCTB4ZjMwYywKKwkweGY3MDMsCTB4ZjAyMCwJMHhmMjA3LAkweGYxMDAsCTB4ZjEwMSwJMHhmMTAyLAkweGYxMDMsCTB4ZjEwNCwKKwkweGYxMDUsCTB4ZjEwNiwJMHhmMTA3LAkweGYxMDgsCTB4ZjEwOSwJMHhmMjA4LAkweGYyMDksCTB4ZjMwNywKKwkweGYzMDgsCTB4ZjMwOSwJMHhmMzBiLAkweGYzMDQsCTB4ZjMwNSwJMHhmMzA2LAkweGYzMGEsCTB4ZjMwMSwKKwkweGYzMDIsCTB4ZjMwMywJMHhmMzAwLAkweGYzMTAsCTB4ZjIwNiwJMHhmMjAwLAkweGYwM2MsCTB4ZjEwYSwKKwkweGYxMGIsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYzMGUsCTB4ZjcwMiwJMHhmMzBkLAkweGYwMWMsCTB4ZjcwMSwJMHhmMjA1LAkweGYxMTQsCTB4ZjYwMywKKwkweGYxMTgsCTB4ZjYwMSwJMHhmNjAyLAkweGYxMTcsCTB4ZjYwMCwJMHhmMTE5LAkweGYxMTUsCTB4ZjExNiwKKwkweGYxMWEsCTB4ZjEwYywJMHhmMTBkLAkweGYxMWIsCTB4ZjExYywJMHhmMTEwLAkweGYzMTEsCTB4ZjExZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgc2hpZnRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMDFiLAkweGYwMjEsCTB4ZjA0MCwJMHhmMDIzLAkweGYwMjQsCTB4ZjAyNSwJMHhmMDVlLAorCTB4ZjAyNiwJMHhmMDJhLAkweGYwMjgsCTB4ZjAyOSwJMHhmMDVmLAkweGYwMmIsCTB4ZjA3ZiwJMHhmMDA5LAorCTB4ZmI1MSwJMHhmYjU3LAkweGZiNDUsCTB4ZmI1MiwJMHhmYjU0LAkweGZiNTksCTB4ZmI1NSwJMHhmYjQ5LAorCTB4ZmI0ZiwJMHhmYjUwLAkweGYwN2IsCTB4ZjA3ZCwJMHhmMjAxLAkweGY3MDIsCTB4ZmI0MSwJMHhmYjUzLAorCTB4ZmI0NCwJMHhmYjQ2LAkweGZiNDcsCTB4ZmI0OCwJMHhmYjRhLAkweGZiNGIsCTB4ZmI0YywJMHhmMDNhLAorCTB4ZjAyMiwJMHhmMDdlLAkweGY3MDAsCTB4ZjA3YywJMHhmYjVhLAkweGZiNTgsCTB4ZmI0MywJMHhmYjU2LAorCTB4ZmI0MiwJMHhmYjRlLAkweGZiNGQsCTB4ZjAzYywJMHhmMDNlLAkweGYwM2YsCTB4ZjcwMCwJMHhmMzBjLAorCTB4ZjcwMywJMHhmMDIwLAkweGYyMDcsCTB4ZjEwYSwJMHhmMTBiLAkweGYxMGMsCTB4ZjEwZCwJMHhmMTBlLAorCTB4ZjEwZiwJMHhmMTEwLAkweGYxMTEsCTB4ZjExMiwJMHhmMTEzLAkweGYyMTMsCTB4ZjIwMywJMHhmMzA3LAorCTB4ZjMwOCwJMHhmMzA5LAkweGYzMGIsCTB4ZjMwNCwJMHhmMzA1LAkweGYzMDYsCTB4ZjMwYSwJMHhmMzAxLAorCTB4ZjMwMiwJMHhmMzAzLAkweGYzMDAsCTB4ZjMxMCwJMHhmMjA2LAkweGYyMDAsCTB4ZjAzZSwJMHhmMTBhLAorCTB4ZjEwYiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjMwZSwJMHhmNzAyLAkweGYzMGQsCTB4ZjIwMCwJMHhmNzAxLAkweGYyMDUsCTB4ZjExNCwJMHhmNjAzLAorCTB4ZjIwYiwJMHhmNjAxLAkweGY2MDIsCTB4ZjExNywJMHhmNjAwLAkweGYyMGEsCTB4ZjExNSwJMHhmMTE2LAorCTB4ZjExYSwJMHhmMTBjLAkweGYxMGQsCTB4ZjExYiwJMHhmMTFjLAkweGYxMTAsCTB4ZjMxMSwJMHhmMTFkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBhbHRncl9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDQwLAkweGYyMDAsCTB4ZjAyNCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMDdiLAkweGYwNWIsCTB4ZjA1ZCwJMHhmMDdkLAkweGYwNWMsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmYjcxLAkweGZiNzcsCTB4ZjkxOCwJMHhmYjcyLAkweGZiNzQsCTB4ZmI3OSwJMHhmYjc1LAkweGZiNjksCisJMHhmYjZmLAkweGZiNzAsCTB4ZjIwMCwJMHhmMDdlLAkweGYyMDEsCTB4ZjcwMiwJMHhmOTE0LAkweGZiNzMsCisJMHhmOTE3LAkweGY5MTksCTB4ZmI2NywJMHhmYjY4LAkweGZiNmEsCTB4ZmI2YiwJMHhmYjZjLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjcwMCwJMHhmMjAwLAkweGZiN2EsCTB4ZmI3OCwJMHhmOTE2LAkweGZiNzYsCisJMHhmOTE1LAkweGZiNmUsCTB4ZmI2ZCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNzAwLAkweGYzMGMsCisJMHhmNzAzLAkweGYyMDAsCTB4ZjIwNywJMHhmNTBjLAkweGY1MGQsCTB4ZjUwZSwJMHhmNTBmLAkweGY1MTAsCisJMHhmNTExLAkweGY1MTIsCTB4ZjUxMywJMHhmNTE0LAkweGY1MTUsCTB4ZjIwOCwJMHhmMjAyLAkweGY5MTEsCisJMHhmOTEyLAkweGY5MTMsCTB4ZjMwYiwJMHhmOTBlLAkweGY5MGYsCTB4ZjkxMCwJMHhmMzBhLAkweGY5MGIsCisJMHhmOTBjLAkweGY5MGQsCTB4ZjkwYSwJMHhmMzEwLAkweGYyMDYsCTB4ZjIwMCwJMHhmMDdjLAkweGY1MTYsCisJMHhmNTE3LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMzBlLAkweGY3MDIsCTB4ZjMwZCwJMHhmMjAwLAkweGY3MDEsCTB4ZjIwNSwJMHhmMTE0LAkweGY2MDMsCisJMHhmMTE4LAkweGY2MDEsCTB4ZjYwMiwJMHhmMTE3LAkweGY2MDAsCTB4ZjExOSwJMHhmMTE1LAkweGYxMTYsCisJMHhmMTFhLAkweGYxMGMsCTB4ZjEwZCwJMHhmMTFiLAkweGYxMWMsCTB4ZjExMCwJMHhmMzExLAkweGYxMWQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCit9OworCit1X3Nob3J0IGN0cmxfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAwMCwJMHhmMDFiLAkweGYwMWMsCTB4ZjAxZCwJMHhmMDFlLAorCTB4ZjAxZiwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDFmLAkweGYyMDAsCTB4ZjAwOCwJMHhmMjAwLAorCTB4ZjAxMSwJMHhmMDE3LAkweGYwMDUsCTB4ZjAxMiwJMHhmMDE0LAkweGYwMTksCTB4ZjAxNSwJMHhmMDA5LAorCTB4ZjAwZiwJMHhmMDEwLAkweGYwMWIsCTB4ZjAxZCwJMHhmMjAxLAkweGY3MDIsCTB4ZjAwMSwJMHhmMDEzLAorCTB4ZjAwNCwJMHhmMDA2LAkweGYwMDcsCTB4ZjAwOCwJMHhmMDBhLAkweGYwMGIsCTB4ZjAwYywJMHhmMjAwLAorCTB4ZjAwNywJMHhmMDAwLAkweGY3MDAsCTB4ZjAxYywJMHhmMDFhLAkweGYwMTgsCTB4ZjAwMywJMHhmMDE2LAorCTB4ZjAwMiwJMHhmMDBlLAkweGYwMGQsCTB4ZjIwMCwJMHhmMjBlLAkweGYwN2YsCTB4ZjcwMCwJMHhmMzBjLAorCTB4ZjcwMywJMHhmMDAwLAkweGYyMDcsCTB4ZjEwMCwJMHhmMTAxLAkweGYxMDIsCTB4ZjEwMywJMHhmMTA0LAorCTB4ZjEwNSwJMHhmMTA2LAkweGYxMDcsCTB4ZjEwOCwJMHhmMTA5LAkweGYyMDgsCTB4ZjIwNCwJMHhmMzA3LAorCTB4ZjMwOCwJMHhmMzA5LAkweGYzMGIsCTB4ZjMwNCwJMHhmMzA1LAkweGYzMDYsCTB4ZjMwYSwJMHhmMzAxLAorCTB4ZjMwMiwJMHhmMzAzLAkweGYzMDAsCTB4ZjMxMCwJMHhmMjA2LAkweGYyMDAsCTB4ZjIwMCwJMHhmMTBhLAorCTB4ZjEwYiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjMwZSwJMHhmNzAyLAkweGYzMGQsCTB4ZjAxYywJMHhmNzAxLAkweGYyMDUsCTB4ZjExNCwJMHhmNjAzLAorCTB4ZjExOCwJMHhmNjAxLAkweGY2MDIsCTB4ZjExNywJMHhmNjAwLAkweGYxMTksCTB4ZjExNSwJMHhmMTE2LAorCTB4ZjExYSwJMHhmMTBjLAkweGYxMGQsCTB4ZjExYiwJMHhmMTFjLAkweGYxMTAsCTB4ZjMxMSwJMHhmMTFkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBzaGlmdF9jdHJsX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYwMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAxZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYwMTEsCTB4ZjAxNywJMHhmMDA1LAkweGYwMTIsCTB4ZjAxNCwJMHhmMDE5LAkweGYwMTUsCTB4ZjAwOSwKKwkweGYwMGYsCTB4ZjAxMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAyLAkweGYwMDEsCTB4ZjAxMywKKwkweGYwMDQsCTB4ZjAwNiwJMHhmMDA3LAkweGYwMDgsCTB4ZjAwYSwJMHhmMDBiLAkweGYwMGMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmNzAwLAkweGYyMDAsCTB4ZjAxYSwJMHhmMDE4LAkweGYwMDMsCTB4ZjAxNiwKKwkweGYwMDIsCTB4ZjAwZSwJMHhmMDBkLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY3MDAsCTB4ZjMwYywKKwkweGY3MDMsCTB4ZjIwMCwJMHhmMjA3LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjA4LAkweGYyMDAsCTB4ZjMwNywKKwkweGYzMDgsCTB4ZjMwOSwJMHhmMzBiLAkweGYzMDQsCTB4ZjMwNSwJMHhmMzA2LAkweGYzMGEsCTB4ZjMwMSwKKwkweGYzMDIsCTB4ZjMwMywJMHhmMzAwLAkweGYzMTAsCTB4ZjIwNiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYzMGUsCTB4ZjcwMiwJMHhmMzBkLAkweGYyMDAsCTB4ZjcwMSwJMHhmMjA1LAkweGYxMTQsCTB4ZjYwMywKKwkweGYxMTgsCTB4ZjYwMSwJMHhmNjAyLAkweGYxMTcsCTB4ZjYwMCwJMHhmMTE5LAkweGYxMTUsCTB4ZjExNiwKKwkweGYxMWEsCTB4ZjEwYywJMHhmMTBkLAkweGYxMWIsCTB4ZjExYywJMHhmMTEwLAkweGYzMTEsCTB4ZjExZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgYWx0X21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjgxYiwJMHhmODMxLAkweGY4MzIsCTB4ZjgzMywJMHhmODM0LAkweGY4MzUsCTB4ZjgzNiwKKwkweGY4MzcsCTB4ZjgzOCwJMHhmODM5LAkweGY4MzAsCTB4ZjgyZCwJMHhmODNkLAkweGY4N2YsCTB4ZjgwOSwKKwkweGY4NzEsCTB4Zjg3NywJMHhmODY1LAkweGY4NzIsCTB4Zjg3NCwJMHhmODc5LAkweGY4NzUsCTB4Zjg2OSwKKwkweGY4NmYsCTB4Zjg3MCwJMHhmODViLAkweGY4NWQsCTB4ZjgwZCwJMHhmNzAyLAkweGY4NjEsCTB4Zjg3MywKKwkweGY4NjQsCTB4Zjg2NiwJMHhmODY3LAkweGY4NjgsCTB4Zjg2YSwJMHhmODZiLAkweGY4NmMsCTB4ZjgzYiwKKwkweGY4MjcsCTB4Zjg2MCwJMHhmNzAwLAkweGY4NWMsCTB4Zjg3YSwJMHhmODc4LAkweGY4NjMsCTB4Zjg3NiwKKwkweGY4NjIsCTB4Zjg2ZSwJMHhmODZkLAkweGY4MmMsCTB4ZjgyZSwJMHhmODJmLAkweGY3MDAsCTB4ZjMwYywKKwkweGY3MDMsCTB4ZjgyMCwJMHhmMjA3LAkweGY1MDAsCTB4ZjUwMSwJMHhmNTAyLAkweGY1MDMsCTB4ZjUwNCwKKwkweGY1MDUsCTB4ZjUwNiwJMHhmNTA3LAkweGY1MDgsCTB4ZjUwOSwJMHhmMjA4LAkweGYyMDksCTB4ZjkwNywKKwkweGY5MDgsCTB4ZjkwOSwJMHhmMzBiLAkweGY5MDQsCTB4ZjkwNSwJMHhmOTA2LAkweGYzMGEsCTB4ZjkwMSwKKwkweGY5MDIsCTB4ZjkwMywJMHhmOTAwLAkweGYzMTAsCTB4ZjIwNiwJMHhmMjAwLAkweGY4M2MsCTB4ZjUwYSwKKwkweGY1MGIsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYzMGUsCTB4ZjcwMiwJMHhmMzBkLAkweGYwMWMsCTB4ZjcwMSwJMHhmMjA1LAkweGYxMTQsCTB4ZjYwMywKKwkweGYxMTgsCTB4ZjIxMCwJMHhmMjExLAkweGYxMTcsCTB4ZjYwMCwJMHhmMTE5LAkweGYxMTUsCTB4ZjExNiwKKwkweGYxMWEsCTB4ZjEwYywJMHhmMTBkLAkweGYxMWIsCTB4ZjExYywJMHhmMTEwLAkweGYzMTEsCTB4ZjExZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgY3RybF9hbHRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjgxMSwJMHhmODE3LAkweGY4MDUsCTB4ZjgxMiwJMHhmODE0LAkweGY4MTksCTB4ZjgxNSwJMHhmODA5LAorCTB4ZjgwZiwJMHhmODEwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAxLAkweGY3MDIsCTB4ZjgwMSwJMHhmODEzLAorCTB4ZjgwNCwJMHhmODA2LAkweGY4MDcsCTB4ZjgwOCwJMHhmODBhLAkweGY4MGIsCTB4ZjgwYywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGY3MDAsCTB4ZjIwMCwJMHhmODFhLAkweGY4MTgsCTB4ZjgwMywJMHhmODE2LAorCTB4ZjgwMiwJMHhmODBlLAkweGY4MGQsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjcwMCwJMHhmMzBjLAorCTB4ZjcwMywJMHhmMjAwLAkweGYyMDcsCTB4ZjUwMCwJMHhmNTAxLAkweGY1MDIsCTB4ZjUwMywJMHhmNTA0LAorCTB4ZjUwNSwJMHhmNTA2LAkweGY1MDcsCTB4ZjUwOCwJMHhmNTA5LAkweGYyMDgsCTB4ZjIwMCwJMHhmMzA3LAorCTB4ZjMwOCwJMHhmMzA5LAkweGYzMGIsCTB4ZjMwNCwJMHhmMzA1LAkweGYzMDYsCTB4ZjMwYSwJMHhmMzAxLAorCTB4ZjMwMiwJMHhmMzAzLAkweGYzMDAsCTB4ZjIwYywJMHhmMjA2LAkweGYyMDAsCTB4ZjIwMCwJMHhmNTBhLAorCTB4ZjUwYiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjMwZSwJMHhmNzAyLAkweGYzMGQsCTB4ZjIwMCwJMHhmNzAxLAkweGYyMDUsCTB4ZjExNCwJMHhmNjAzLAorCTB4ZjExOCwJMHhmNjAxLAkweGY2MDIsCTB4ZjExNywJMHhmNjAwLAkweGYxMTksCTB4ZjExNSwJMHhmMjBjLAorCTB4ZjExYSwJMHhmMTBjLAkweGYxMGQsCTB4ZjExYiwJMHhmMTFjLAkweGYxMTAsCTB4ZjMxMSwJMHhmMTFkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorfTsKKwordXNob3J0ICprZXlfbWFwc1tNQVhfTlJfS0VZTUFQU10gPSB7CisJcGxhaW5fbWFwLCBzaGlmdF9tYXAsIGFsdGdyX21hcCwgTlVMTCwKKwljdHJsX21hcCwgc2hpZnRfY3RybF9tYXAsIE5VTEwsIE5VTEwsCisJYWx0X21hcCwgTlVMTCwgTlVMTCwgTlVMTCwKKwljdHJsX2FsdF9tYXAsIE5VTEwKK307CisKK3Vuc2lnbmVkIGludCBrZXltYXBfY291bnQgPSA3OworCisvKgorICogUGhpbG9zb3BoeTogbW9zdCBwZW9wbGUgZG8gbm90IGRlZmluZSBtb3JlIHN0cmluZ3MsIGJ1dCB0aGV5IHdobyBkbworICogb2Z0ZW4gd2FudCBxdWl0ZSBhIGxvdCBvZiBzdHJpbmcgc3BhY2UuIFNvLCB3ZSBzdGF0aWNhbGx5IGFsbG9jYXRlCisgKiB0aGUgZGVmYXVsdCBhbmQgYWxsb2NhdGUgZHluYW1pY2FsbHkgaW4gY2h1bmtzIG9mIDUxMiBieXRlcy4KKyAqLworCitjaGFyIGZ1bmNfYnVmW10gPSB7CisJJ1wwMzMnLCAnWycsICdbJywgJ0EnLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnQicsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdDJywgMCwgCisJJ1wwMzMnLCAnWycsICdbJywgJ0QnLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnRScsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICc3JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzEnLCAnOCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJzknLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICcwJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnMScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzMnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc0JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnNScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzYnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc4JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnOScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzEnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICcyJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnMycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzQnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnNCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICc1JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzYnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnTScsIDAsIAorCSdcMDMzJywgJ1snLCAnUCcsIDAsIAorfTsKKworY2hhciAqZnVuY2J1ZnB0ciA9IGZ1bmNfYnVmOworaW50IGZ1bmNidWZzaXplID0gc2l6ZW9mKGZ1bmNfYnVmKTsKK2ludCBmdW5jYnVmbGVmdCA9IDA7ICAgICAgICAgIC8qIHNwYWNlIGxlZnQgKi8KKworY2hhciAqZnVuY190YWJsZVtNQVhfTlJfRlVOQ10gPSB7CisJZnVuY19idWYgKyAwLAorCWZ1bmNfYnVmICsgNSwKKwlmdW5jX2J1ZiArIDEwLAorCWZ1bmNfYnVmICsgMTUsCisJZnVuY19idWYgKyAyMCwKKwlmdW5jX2J1ZiArIDI1LAorCWZ1bmNfYnVmICsgMzEsCisJZnVuY19idWYgKyAzNywKKwlmdW5jX2J1ZiArIDQzLAorCWZ1bmNfYnVmICsgNDksCisJZnVuY19idWYgKyA1NSwKKwlmdW5jX2J1ZiArIDYxLAorCWZ1bmNfYnVmICsgNjcsCisJZnVuY19idWYgKyA3MywKKwlmdW5jX2J1ZiArIDc5LAorCWZ1bmNfYnVmICsgODUsCisJZnVuY19idWYgKyA5MSwKKwlmdW5jX2J1ZiArIDk3LAorCWZ1bmNfYnVmICsgMTAzLAorCWZ1bmNfYnVmICsgMTA5LAorCWZ1bmNfYnVmICsgMTE1LAorCWZ1bmNfYnVmICsgMTIwLAorCWZ1bmNfYnVmICsgMTI1LAorCWZ1bmNfYnVmICsgMTMwLAorCWZ1bmNfYnVmICsgMTM1LAorCWZ1bmNfYnVmICsgMTQwLAorCWZ1bmNfYnVmICsgMTQ1LAorCU5VTEwsCisJTlVMTCwKKwlmdW5jX2J1ZiArIDE0OSwKKwlOVUxMLAorfTsKKworc3RydWN0IGtiZGlhY3IgYWNjZW50X3RhYmxlW01BWF9ESUFDUl0gPSB7CisJeydgJywgJ0EnLCAnXDMwMCd9LAl7J2AnLCAnYScsICdcMzQwJ30sCisJeydcJycsICdBJywgJ1wzMDEnfSwJeydcJycsICdhJywgJ1wzNDEnfSwKKwl7J14nLCAnQScsICdcMzAyJ30sCXsnXicsICdhJywgJ1wzNDInfSwKKwl7J34nLCAnQScsICdcMzAzJ30sCXsnficsICdhJywgJ1wzNDMnfSwKKwl7JyInLCAnQScsICdcMzA0J30sCXsnIicsICdhJywgJ1wzNDQnfSwKKwl7J08nLCAnQScsICdcMzA1J30sCXsnbycsICdhJywgJ1wzNDUnfSwKKwl7JzAnLCAnQScsICdcMzA1J30sCXsnMCcsICdhJywgJ1wzNDUnfSwKKwl7J0EnLCAnQScsICdcMzA1J30sCXsnYScsICdhJywgJ1wzNDUnfSwKKwl7J0EnLCAnRScsICdcMzA2J30sCXsnYScsICdlJywgJ1wzNDYnfSwKKwl7JywnLCAnQycsICdcMzA3J30sCXsnLCcsICdjJywgJ1wzNDcnfSwKKwl7J2AnLCAnRScsICdcMzEwJ30sCXsnYCcsICdlJywgJ1wzNTAnfSwKKwl7J1wnJywgJ0UnLCAnXDMxMSd9LAl7J1wnJywgJ2UnLCAnXDM1MSd9LAorCXsnXicsICdFJywgJ1wzMTInfSwJeydeJywgJ2UnLCAnXDM1Mid9LAorCXsnIicsICdFJywgJ1wzMTMnfSwJeyciJywgJ2UnLCAnXDM1Myd9LAorCXsnYCcsICdJJywgJ1wzMTQnfSwJeydgJywgJ2knLCAnXDM1NCd9LAorCXsnXCcnLCAnSScsICdcMzE1J30sCXsnXCcnLCAnaScsICdcMzU1J30sCisJeydeJywgJ0knLCAnXDMxNid9LAl7J14nLCAnaScsICdcMzU2J30sCisJeyciJywgJ0knLCAnXDMxNyd9LAl7JyInLCAnaScsICdcMzU3J30sCisJeyctJywgJ0QnLCAnXDMyMCd9LAl7Jy0nLCAnZCcsICdcMzYwJ30sCisJeyd+JywgJ04nLCAnXDMyMSd9LAl7J34nLCAnbicsICdcMzYxJ30sCisJeydgJywgJ08nLCAnXDMyMid9LAl7J2AnLCAnbycsICdcMzYyJ30sCisJeydcJycsICdPJywgJ1wzMjMnfSwJeydcJycsICdvJywgJ1wzNjMnfSwKKwl7J14nLCAnTycsICdcMzI0J30sCXsnXicsICdvJywgJ1wzNjQnfSwKKwl7J34nLCAnTycsICdcMzI1J30sCXsnficsICdvJywgJ1wzNjUnfSwKKwl7JyInLCAnTycsICdcMzI2J30sCXsnIicsICdvJywgJ1wzNjYnfSwKKwl7Jy8nLCAnTycsICdcMzMwJ30sCXsnLycsICdvJywgJ1wzNzAnfSwKKwl7J2AnLCAnVScsICdcMzMxJ30sCXsnYCcsICd1JywgJ1wzNzEnfSwKKwl7J1wnJywgJ1UnLCAnXDMzMid9LAl7J1wnJywgJ3UnLCAnXDM3Mid9LAorCXsnXicsICdVJywgJ1wzMzMnfSwJeydeJywgJ3UnLCAnXDM3Myd9LAorCXsnIicsICdVJywgJ1wzMzQnfSwJeyciJywgJ3UnLCAnXDM3NCd9LAorCXsnXCcnLCAnWScsICdcMzM1J30sCXsnXCcnLCAneScsICdcMzc1J30sCisJeydUJywgJ0gnLCAnXDMzNid9LAl7J3QnLCAnaCcsICdcMzc2J30sCisJeydzJywgJ3MnLCAnXDMzNyd9LAl7JyInLCAneScsICdcMzc3J30sCisJeydzJywgJ3onLCAnXDMzNyd9LAl7J2knLCAnaicsICdcMzc3J30sCit9OworCit1bnNpZ25lZCBpbnQgYWNjZW50X3RhYmxlX3NpemUgPSA2ODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kZWZrZXltYXAubWFwIGIvZHJpdmVycy9jaGFyL2RlZmtleW1hcC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMzBjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kZWZrZXltYXAubWFwCkBAIC0wLDAgKzEsMzU3IEBACisjIERlZmF1bHQga2VybmVsIGtleW1hcC4gVGhpcyB1c2VzIDcgbW9kaWZpZXIgY29tYmluYXRpb25zLgora2V5bWFwcyAwLTIsNC01LDgsMTIKKyMgQ2hhbmdlIHRoZSBhYm92ZSBsaW5lIGludG8KKyMJa2V5bWFwcyAwLTIsNC02LDgsMTIKKyMgaW4gY2FzZSB5b3Ugd2FudCB0aGUgZW50cmllcworIwlhbHRnciAgIGNvbnRyb2wga2V5Y29kZSAgODMgPSBCb290ICAgICAgICAgICAgCisjCWFsdGdyICAgY29udHJvbCBrZXljb2RlIDExMSA9IEJvb3QgICAgICAgICAgICAKKyMgYmVsb3cuCisjCisjIEluIGZhY3QgQWx0R3IgaXMgdXNlZCB2ZXJ5IGxpdHRsZSwgYW5kIG9uZSBtb3JlIGtleW1hcCBjYW4KKyMgYmUgc2F2ZWQgYnkgbWFwcGluZyBBbHRHciB0byBBbHQgKGFuZCBhZGFwdGluZyBhIGZldyBlbnRyaWVzKToKKyMga2V5Y29kZSAxMDAgPSBBbHQKKyMKK2tleWNvZGUgICAxID0gRXNjYXBlICAgICAgICAgICBFc2NhcGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMSA9IE1ldGFfRXNjYXBlICAgICAKK2tleWNvZGUgICAyID0gb25lICAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMiA9IE1ldGFfb25lICAgICAgICAKK2tleWNvZGUgICAzID0gdHdvICAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICAKKwljb250cm9sCWtleWNvZGUgICAzID0gbnVsICAgICAgICAgICAgIAorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgIDMgPSBudWwgICAgICAgICAgICAgCisJYWx0CWtleWNvZGUgICAzID0gTWV0YV90d28gICAgICAgIAora2V5Y29kZSAgIDQgPSB0aHJlZSAgICAgICAgICAgIG51bWJlcnNpZ24gICAgICAKKwljb250cm9sIGtleWNvZGUgICA0ID0gRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgIDQgPSBNZXRhX3RocmVlICAgICAgCitrZXljb2RlICAgNSA9IGZvdXIgICAgICAgICAgICAgZG9sbGFyICAgICAgICAgICBkb2xsYXIgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAgNSA9IE1ldGFfZm91ciAgICAgICAKK2tleWNvZGUgICA2ID0gZml2ZSAgICAgICAgICAgICBwZXJjZW50ICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNiA9IENvbnRyb2xfYnJhY2tldHJpZ2h0CisJYWx0ICAgICBrZXljb2RlICAgNiA9IE1ldGFfZml2ZSAgICAgICAKK2tleWNvZGUgICA3ID0gc2l4ICAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgCisJY29udHJvbCBrZXljb2RlICAgNyA9IENvbnRyb2xfYXNjaWljaXJjdW0KKwlhbHQgICAgIGtleWNvZGUgICA3ID0gTWV0YV9zaXggICAgICAgIAora2V5Y29kZSAgIDggPSBzZXZlbiAgICAgICAgICAgIGFtcGVyc2FuZCAgICAgICAgYnJhY2VsZWZ0ICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDggPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQgICAgIGtleWNvZGUgICA4ID0gTWV0YV9zZXZlbiAgICAgIAora2V5Y29kZSAgIDkgPSBlaWdodCAgICAgICAgICAgIGFzdGVyaXNrICAgICAgICAgYnJhY2tldGxlZnQgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDkgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgOSA9IE1ldGFfZWlnaHQgICAgICAKK2tleWNvZGUgIDEwID0gbmluZSAgICAgICAgICAgICBwYXJlbmxlZnQgICAgICAgIGJyYWNrZXRyaWdodCAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEwID0gTWV0YV9uaW5lICAgICAgIAora2V5Y29kZSAgMTEgPSB6ZXJvICAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICAgYnJhY2VyaWdodCAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEgPSBNZXRhX3plcm8gICAgICAgCitrZXljb2RlICAxMiA9IG1pbnVzICAgICAgICAgICAgdW5kZXJzY29yZSAgICAgICBiYWNrc2xhc2ggICAgICAgCisJY29udHJvbAlrZXljb2RlICAxMiA9IENvbnRyb2xfdW5kZXJzY29yZQorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgMTIgPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQJa2V5Y29kZSAgMTIgPSBNZXRhX21pbnVzICAgICAgCitrZXljb2RlICAxMyA9IGVxdWFsICAgICAgICAgICAgcGx1cyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTMgPSBNZXRhX2VxdWFsICAgICAgCitrZXljb2RlICAxNCA9IERlbGV0ZSAgICAgICAgICAgRGVsZXRlICAgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTQgPSBCYWNrU3BhY2UKKwlhbHQgICAgIGtleWNvZGUgIDE0ID0gTWV0YV9EZWxldGUgICAgIAora2V5Y29kZSAgMTUgPSBUYWIgICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDE1ID0gTWV0YV9UYWIgICAgICAgIAora2V5Y29kZSAgMTYgPSBxICAgICAgICAgICAgICAgCitrZXljb2RlICAxNyA9IHcgICAgICAgICAgICAgICAKK2tleWNvZGUgIDE4ID0gZQorCWFsdGdyICAga2V5Y29kZSAgMTggPSBIZXhfRSAgIAora2V5Y29kZSAgMTkgPSByICAgICAgICAgICAgICAgCitrZXljb2RlICAyMCA9IHQgICAgICAgICAgICAgICAKK2tleWNvZGUgIDIxID0geSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjIgPSB1ICAgICAgICAgICAgICAgCitrZXljb2RlICAyMyA9IGkgICAgICAgICAgICAgICAKK2tleWNvZGUgIDI0ID0gbyAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjUgPSBwICAgICAgICAgICAgICAgCitrZXljb2RlICAyNiA9IGJyYWNrZXRsZWZ0ICAgICAgYnJhY2VsZWZ0ICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMjYgPSBFc2NhcGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAyNiA9IE1ldGFfYnJhY2tldGxlZnQKK2tleWNvZGUgIDI3ID0gYnJhY2tldHJpZ2h0ICAgICBicmFjZXJpZ2h0ICAgICAgIGFzY2lpdGlsZGUgICAgICAKKwljb250cm9sIGtleWNvZGUgIDI3ID0gQ29udHJvbF9icmFja2V0cmlnaHQKKwlhbHQgICAgIGtleWNvZGUgIDI3ID0gTWV0YV9icmFja2V0cmlnaHQKK2tleWNvZGUgIDI4ID0gUmV0dXJuICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMjggPSBNZXRhX0NvbnRyb2xfbSAgCitrZXljb2RlICAyOSA9IENvbnRyb2wgICAgICAgICAKK2tleWNvZGUgIDMwID0gYQorCWFsdGdyICAga2V5Y29kZSAgMzAgPSBIZXhfQQora2V5Y29kZSAgMzEgPSBzICAgICAgICAgICAgICAgCitrZXljb2RlICAzMiA9IGQKKwlhbHRnciAgIGtleWNvZGUgIDMyID0gSGV4X0QgICAKK2tleWNvZGUgIDMzID0gZgorCWFsdGdyICAga2V5Y29kZSAgMzMgPSBIZXhfRiAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzQgPSBnICAgICAgICAgICAgICAgCitrZXljb2RlICAzNSA9IGggICAgICAgICAgICAgICAKK2tleWNvZGUgIDM2ID0gaiAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzcgPSBrICAgICAgICAgICAgICAgCitrZXljb2RlICAzOCA9IGwgICAgICAgICAgICAgICAKK2tleWNvZGUgIDM5ID0gc2VtaWNvbG9uICAgICAgICBjb2xvbiAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAzOSA9IE1ldGFfc2VtaWNvbG9uICAKK2tleWNvZGUgIDQwID0gYXBvc3Ryb3BoZSAgICAgICBxdW90ZWRibCAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MCA9IENvbnRyb2xfZyAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDQwID0gTWV0YV9hcG9zdHJvcGhlIAora2V5Y29kZSAgNDEgPSBncmF2ZSAgICAgICAgICAgIGFzY2lpdGlsZGUgICAgICAKKwljb250cm9sIGtleWNvZGUgIDQxID0gbnVsICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNDEgPSBNZXRhX2dyYXZlICAgICAgCitrZXljb2RlICA0MiA9IFNoaWZ0ICAgICAgICAgICAKK2tleWNvZGUgIDQzID0gYmFja3NsYXNoICAgICAgICBiYXIgICAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MyA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICA0MyA9IE1ldGFfYmFja3NsYXNoICAKK2tleWNvZGUgIDQ0ID0geiAgICAgICAgICAgICAgIAora2V5Y29kZSAgNDUgPSB4ICAgICAgICAgICAgICAgCitrZXljb2RlICA0NiA9IGMKKwlhbHRnciAgIGtleWNvZGUgIDQ2ID0gSGV4X0MgICAKK2tleWNvZGUgIDQ3ID0gdiAgICAgICAgICAgICAgIAora2V5Y29kZSAgNDggPSBiCisJYWx0Z3IgICBrZXljb2RlICA0OCA9IEhleF9CCitrZXljb2RlICA0OSA9IG4gICAgICAgICAgICAgICAKK2tleWNvZGUgIDUwID0gbSAgICAgICAgICAgICAgIAora2V5Y29kZSAgNTEgPSBjb21tYSAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDUxID0gTWV0YV9jb21tYSAgICAgIAora2V5Y29kZSAgNTIgPSBwZXJpb2QgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDUyID0gQ29tcG9zZSAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNTIgPSBNZXRhX3BlcmlvZCAgICAgCitrZXljb2RlICA1MyA9IHNsYXNoICAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNTMgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA1MyA9IE1ldGFfc2xhc2ggICAgICAKK2tleWNvZGUgIDU0ID0gU2hpZnQgICAgICAgICAgIAora2V5Y29kZSAgNTUgPSBLUF9NdWx0aXBseSAgICAgCitrZXljb2RlICA1NiA9IEFsdCAgICAgICAgICAgICAKK2tleWNvZGUgIDU3ID0gc3BhY2UgICAgICAgICAgICBzcGFjZSAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA1NyA9IG51bCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDU3ID0gTWV0YV9zcGFjZSAgICAgIAora2V5Y29kZSAgNTggPSBDYXBzX0xvY2sgICAgICAgCitrZXljb2RlICA1OSA9IEYxICAgICAgICAgICAgICAgRjExICAgICAgICAgICAgICBDb25zb2xlXzEzICAgICAgCisJY29udHJvbCBrZXljb2RlICA1OSA9IEYxICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDU5ID0gQ29uc29sZV8xICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA1OSA9IENvbnNvbGVfMSAgICAgICAKK2tleWNvZGUgIDYwID0gRjIgICAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgIENvbnNvbGVfMTQgICAgICAKKwljb250cm9sIGtleWNvZGUgIDYwID0gRjIgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjAgPSBDb25zb2xlXzIgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDYwID0gQ29uc29sZV8yICAgICAgIAora2V5Y29kZSAgNjEgPSBGMyAgICAgICAgICAgICAgIEYxMyAgICAgICAgICAgICAgQ29uc29sZV8xNSAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNjEgPSBGMyAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA2MSA9IENvbnNvbGVfMyAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgNjEgPSBDb25zb2xlXzMgICAgICAgCitrZXljb2RlICA2MiA9IEY0ICAgICAgICAgICAgICAgRjE0ICAgICAgICAgICAgICBDb25zb2xlXzE2ICAgICAgCisJY29udHJvbCBrZXljb2RlICA2MiA9IEY0ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDYyID0gQ29uc29sZV80ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA2MiA9IENvbnNvbGVfNCAgICAgICAKK2tleWNvZGUgIDYzID0gRjUgICAgICAgICAgICAgICBGMTUgICAgICAgICAgICAgIENvbnNvbGVfMTcgICAgICAKKwljb250cm9sIGtleWNvZGUgIDYzID0gRjUgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjMgPSBDb25zb2xlXzUgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDYzID0gQ29uc29sZV81ICAgICAgIAora2V5Y29kZSAgNjQgPSBGNiAgICAgICAgICAgICAgIEYxNiAgICAgICAgICAgICAgQ29uc29sZV8xOCAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNjQgPSBGNiAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA2NCA9IENvbnNvbGVfNiAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgNjQgPSBDb25zb2xlXzYgICAgICAgCitrZXljb2RlICA2NSA9IEY3ICAgICAgICAgICAgICAgRjE3ICAgICAgICAgICAgICBDb25zb2xlXzE5ICAgICAgCisJY29udHJvbCBrZXljb2RlICA2NSA9IEY3ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDY1ID0gQ29uc29sZV83ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA2NSA9IENvbnNvbGVfNyAgICAgICAKK2tleWNvZGUgIDY2ID0gRjggICAgICAgICAgICAgICBGMTggICAgICAgICAgICAgIENvbnNvbGVfMjAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDY2ID0gRjggICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjYgPSBDb25zb2xlXzggICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDY2ID0gQ29uc29sZV84ICAgICAgIAora2V5Y29kZSAgNjcgPSBGOSAgICAgICAgICAgICAgIEYxOSAgICAgICAgICAgICAgQ29uc29sZV8yMSAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNjcgPSBGOSAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA2NyA9IENvbnNvbGVfOSAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgNjcgPSBDb25zb2xlXzkgICAgICAgCitrZXljb2RlICA2OCA9IEYxMCAgICAgICAgICAgICAgRjIwICAgICAgICAgICAgICBDb25zb2xlXzIyICAgICAgCisJY29udHJvbCBrZXljb2RlICA2OCA9IEYxMCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDY4ID0gQ29uc29sZV8xMCAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA2OCA9IENvbnNvbGVfMTAgICAgICAKK2tleWNvZGUgIDY5ID0gTnVtX0xvY2sKKwlzaGlmdCAgIGtleWNvZGUgIDY5ID0gQmFyZV9OdW1fTG9jawora2V5Y29kZSAgNzAgPSBTY3JvbGxfTG9jayAgICAgIFNob3dfTWVtb3J5ICAgICAgU2hvd19SZWdpc3RlcnMgIAorCWNvbnRyb2wga2V5Y29kZSAgNzAgPSBTaG93X1N0YXRlICAgICAgCisJYWx0ICAgICBrZXljb2RlICA3MCA9IFNjcm9sbF9Mb2NrICAgICAKK2tleWNvZGUgIDcxID0gS1BfNyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNzEgPSBBc2NpaV83ICAgICAgICAgCisJYWx0Z3IgICBrZXljb2RlICA3MSA9IEhleF83ICAgICAgICAgCitrZXljb2RlICA3MiA9IEtQXzggICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDcyID0gQXNjaWlfOCAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgNzIgPSBIZXhfOCAgICAgICAgIAora2V5Y29kZSAgNzMgPSBLUF85ICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA3MyA9IEFzY2lpXzkgICAgICAgICAKKwlhbHRnciAgIGtleWNvZGUgIDczID0gSGV4XzkgICAgICAgICAKK2tleWNvZGUgIDc0ID0gS1BfU3VidHJhY3QgICAgIAora2V5Y29kZSAgNzUgPSBLUF80ICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA3NSA9IEFzY2lpXzQgICAgICAgICAKKwlhbHRnciAgIGtleWNvZGUgIDc1ID0gSGV4XzQgICAgICAgICAKK2tleWNvZGUgIDc2ID0gS1BfNSAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNzYgPSBBc2NpaV81ICAgICAgICAgCisJYWx0Z3IgICBrZXljb2RlICA3NiA9IEhleF81ICAgICAgICAgCitrZXljb2RlICA3NyA9IEtQXzYgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDc3ID0gQXNjaWlfNiAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgNzcgPSBIZXhfNiAgICAgICAgIAora2V5Y29kZSAgNzggPSBLUF9BZGQgICAgICAgICAgCitrZXljb2RlICA3OSA9IEtQXzEgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDc5ID0gQXNjaWlfMSAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgNzkgPSBIZXhfMSAgICAgICAgIAora2V5Y29kZSAgODAgPSBLUF8yICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA4MCA9IEFzY2lpXzIgICAgICAgICAKKwlhbHRnciAgIGtleWNvZGUgIDgwID0gSGV4XzIgICAgICAgICAKK2tleWNvZGUgIDgxID0gS1BfMyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgODEgPSBBc2NpaV8zICAgICAgICAgCisJYWx0Z3IgICBrZXljb2RlICA4MSA9IEhleF8zICAgICAgICAgCitrZXljb2RlICA4MiA9IEtQXzAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDgyID0gQXNjaWlfMCAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgODIgPSBIZXhfMCAgICAgICAgIAora2V5Y29kZSAgODMgPSBLUF9QZXJpb2QgICAgICAgCisjCWFsdGdyICAgY29udHJvbCBrZXljb2RlICA4MyA9IEJvb3QgICAgICAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgODMgPSBCb290ICAgICAgICAgICAgCitrZXljb2RlICA4NCA9IExhc3RfQ29uc29sZSAgICAKK2tleWNvZGUgIDg1ID0KK2tleWNvZGUgIDg2ID0gbGVzcyAgICAgICAgICAgICBncmVhdGVyICAgICAgICAgIGJhciAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDg2ID0gTWV0YV9sZXNzICAgICAgIAora2V5Y29kZSAgODcgPSBGMTEgICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICAgQ29uc29sZV8yMyAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgODcgPSBGMTEgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA4NyA9IENvbnNvbGVfMTEgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgODcgPSBDb25zb2xlXzExICAgICAgCitrZXljb2RlICA4OCA9IEYxMiAgICAgICAgICAgICAgRjEyICAgICAgICAgICAgICBDb25zb2xlXzI0ICAgICAgCisJY29udHJvbCBrZXljb2RlICA4OCA9IEYxMiAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDg4ID0gQ29uc29sZV8xMiAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA4OCA9IENvbnNvbGVfMTIgICAgICAKK2tleWNvZGUgIDg5ID0KK2tleWNvZGUgIDkwID0KK2tleWNvZGUgIDkxID0KK2tleWNvZGUgIDkyID0KK2tleWNvZGUgIDkzID0KK2tleWNvZGUgIDk0ID0KK2tleWNvZGUgIDk1ID0KK2tleWNvZGUgIDk2ID0gS1BfRW50ZXIgICAgICAgIAora2V5Y29kZSAgOTcgPSBDb250cm9sICAgICAgICAgCitrZXljb2RlICA5OCA9IEtQX0RpdmlkZSAgICAgICAKK2tleWNvZGUgIDk5ID0gQ29udHJvbF9iYWNrc2xhc2gKKwljb250cm9sIGtleWNvZGUgIDk5ID0gQ29udHJvbF9iYWNrc2xhc2gKKwlhbHQgICAgIGtleWNvZGUgIDk5ID0gQ29udHJvbF9iYWNrc2xhc2gKK2tleWNvZGUgMTAwID0gQWx0R3IgICAgICAgICAgIAora2V5Y29kZSAxMDEgPSBCcmVhayAgICAgICAgICAgCitrZXljb2RlIDEwMiA9IEZpbmQgICAgICAgICAgICAKK2tleWNvZGUgMTAzID0gVXAgICAgICAgICAgICAgIAora2V5Y29kZSAxMDQgPSBQcmlvciAgICAgICAgICAgCisJc2hpZnQgICBrZXljb2RlIDEwNCA9IFNjcm9sbF9CYWNrd2FyZCAKK2tleWNvZGUgMTA1ID0gTGVmdCAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAxMDUgPSBEZWNyX0NvbnNvbGUKK2tleWNvZGUgMTA2ID0gUmlnaHQgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAxMDYgPSBJbmNyX0NvbnNvbGUKK2tleWNvZGUgMTA3ID0gU2VsZWN0ICAgICAgICAgIAora2V5Y29kZSAxMDggPSBEb3duICAgICAgICAgICAgCitrZXljb2RlIDEwOSA9IE5leHQgICAgICAgICAgICAKKwlzaGlmdCAgIGtleWNvZGUgMTA5ID0gU2Nyb2xsX0ZvcndhcmQgIAora2V5Y29kZSAxMTAgPSBJbnNlcnQgICAgICAgICAgCitrZXljb2RlIDExMSA9IFJlbW92ZSAgICAgICAgICAKKyMJYWx0Z3IgICBjb250cm9sIGtleWNvZGUgMTExID0gQm9vdCAgICAgICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlIDExMSA9IEJvb3QgICAgICAgICAgICAKK2tleWNvZGUgMTEyID0gTWFjcm8gICAgICAgICAgIAora2V5Y29kZSAxMTMgPSBGMTMgICAgICAgICAgICAgCitrZXljb2RlIDExNCA9IEYxNCAgICAgICAgICAgICAKK2tleWNvZGUgMTE1ID0gSGVscCAgICAgICAgICAgIAora2V5Y29kZSAxMTYgPSBEbyAgICAgICAgICAgICAgCitrZXljb2RlIDExNyA9IEYxNyAgICAgICAgICAgICAKK2tleWNvZGUgMTE4ID0gS1BfTWluUGx1cyAgICAgIAora2V5Y29kZSAxMTkgPSBQYXVzZSAgICAgICAgICAgCitrZXljb2RlIDEyMCA9CitrZXljb2RlIDEyMSA9CitrZXljb2RlIDEyMiA9CitrZXljb2RlIDEyMyA9CitrZXljb2RlIDEyNCA9CitrZXljb2RlIDEyNSA9CitrZXljb2RlIDEyNiA9CitrZXljb2RlIDEyNyA9CitzdHJpbmcgRjEgPSAiXDAzM1tbQSIKK3N0cmluZyBGMiA9ICJcMDMzW1tCIgorc3RyaW5nIEYzID0gIlwwMzNbW0MiCitzdHJpbmcgRjQgPSAiXDAzM1tbRCIKK3N0cmluZyBGNSA9ICJcMDMzW1tFIgorc3RyaW5nIEY2ID0gIlwwMzNbMTd+Igorc3RyaW5nIEY3ID0gIlwwMzNbMTh+Igorc3RyaW5nIEY4ID0gIlwwMzNbMTl+Igorc3RyaW5nIEY5ID0gIlwwMzNbMjB+Igorc3RyaW5nIEYxMCA9ICJcMDMzWzIxfiIKK3N0cmluZyBGMTEgPSAiXDAzM1syM34iCitzdHJpbmcgRjEyID0gIlwwMzNbMjR+Igorc3RyaW5nIEYxMyA9ICJcMDMzWzI1fiIKK3N0cmluZyBGMTQgPSAiXDAzM1syNn4iCitzdHJpbmcgRjE1ID0gIlwwMzNbMjh+Igorc3RyaW5nIEYxNiA9ICJcMDMzWzI5fiIKK3N0cmluZyBGMTcgPSAiXDAzM1szMX4iCitzdHJpbmcgRjE4ID0gIlwwMzNbMzJ+Igorc3RyaW5nIEYxOSA9ICJcMDMzWzMzfiIKK3N0cmluZyBGMjAgPSAiXDAzM1szNH4iCitzdHJpbmcgRmluZCA9ICJcMDMzWzF+Igorc3RyaW5nIEluc2VydCA9ICJcMDMzWzJ+Igorc3RyaW5nIFJlbW92ZSA9ICJcMDMzWzN+Igorc3RyaW5nIFNlbGVjdCA9ICJcMDMzWzR+Igorc3RyaW5nIFByaW9yID0gIlwwMzNbNX4iCitzdHJpbmcgTmV4dCA9ICJcMDMzWzZ+Igorc3RyaW5nIE1hY3JvID0gIlwwMzNbTSIKK3N0cmluZyBQYXVzZSA9ICJcMDMzW1AiCitjb21wb3NlICdgJyAnQScgdG8gJ8AnCitjb21wb3NlICdgJyAnYScgdG8gJ+AnCitjb21wb3NlICdcJycgJ0EnIHRvICfBJworY29tcG9zZSAnXCcnICdhJyB0byAn4ScKK2NvbXBvc2UgJ14nICdBJyB0byAnwicKK2NvbXBvc2UgJ14nICdhJyB0byAn4icKK2NvbXBvc2UgJ34nICdBJyB0byAnwycKK2NvbXBvc2UgJ34nICdhJyB0byAn4ycKK2NvbXBvc2UgJyInICdBJyB0byAnxCcKK2NvbXBvc2UgJyInICdhJyB0byAn5CcKK2NvbXBvc2UgJ08nICdBJyB0byAnxScKK2NvbXBvc2UgJ28nICdhJyB0byAn5ScKK2NvbXBvc2UgJzAnICdBJyB0byAnxScKK2NvbXBvc2UgJzAnICdhJyB0byAn5ScKK2NvbXBvc2UgJ0EnICdBJyB0byAnxScKK2NvbXBvc2UgJ2EnICdhJyB0byAn5ScKK2NvbXBvc2UgJ0EnICdFJyB0byAnxicKK2NvbXBvc2UgJ2EnICdlJyB0byAn5icKK2NvbXBvc2UgJywnICdDJyB0byAnxycKK2NvbXBvc2UgJywnICdjJyB0byAn5ycKK2NvbXBvc2UgJ2AnICdFJyB0byAnyCcKK2NvbXBvc2UgJ2AnICdlJyB0byAn6CcKK2NvbXBvc2UgJ1wnJyAnRScgdG8gJ8knCitjb21wb3NlICdcJycgJ2UnIHRvICfpJworY29tcG9zZSAnXicgJ0UnIHRvICfKJworY29tcG9zZSAnXicgJ2UnIHRvICfqJworY29tcG9zZSAnIicgJ0UnIHRvICfLJworY29tcG9zZSAnIicgJ2UnIHRvICfrJworY29tcG9zZSAnYCcgJ0knIHRvICfMJworY29tcG9zZSAnYCcgJ2knIHRvICfsJworY29tcG9zZSAnXCcnICdJJyB0byAnzScKK2NvbXBvc2UgJ1wnJyAnaScgdG8gJ+0nCitjb21wb3NlICdeJyAnSScgdG8gJ84nCitjb21wb3NlICdeJyAnaScgdG8gJ+4nCitjb21wb3NlICciJyAnSScgdG8gJ88nCitjb21wb3NlICciJyAnaScgdG8gJ+8nCitjb21wb3NlICctJyAnRCcgdG8gJ9AnCitjb21wb3NlICctJyAnZCcgdG8gJ/AnCitjb21wb3NlICd+JyAnTicgdG8gJ9EnCitjb21wb3NlICd+JyAnbicgdG8gJ/EnCitjb21wb3NlICdgJyAnTycgdG8gJ9InCitjb21wb3NlICdgJyAnbycgdG8gJ/InCitjb21wb3NlICdcJycgJ08nIHRvICfTJworY29tcG9zZSAnXCcnICdvJyB0byAn8ycKK2NvbXBvc2UgJ14nICdPJyB0byAn1CcKK2NvbXBvc2UgJ14nICdvJyB0byAn9CcKK2NvbXBvc2UgJ34nICdPJyB0byAn1ScKK2NvbXBvc2UgJ34nICdvJyB0byAn9ScKK2NvbXBvc2UgJyInICdPJyB0byAn1icKK2NvbXBvc2UgJyInICdvJyB0byAn9icKK2NvbXBvc2UgJy8nICdPJyB0byAn2CcKK2NvbXBvc2UgJy8nICdvJyB0byAn+CcKK2NvbXBvc2UgJ2AnICdVJyB0byAn2ScKK2NvbXBvc2UgJ2AnICd1JyB0byAn+ScKK2NvbXBvc2UgJ1wnJyAnVScgdG8gJ9onCitjb21wb3NlICdcJycgJ3UnIHRvICf6JworY29tcG9zZSAnXicgJ1UnIHRvICfbJworY29tcG9zZSAnXicgJ3UnIHRvICf7JworY29tcG9zZSAnIicgJ1UnIHRvICfcJworY29tcG9zZSAnIicgJ3UnIHRvICf8JworY29tcG9zZSAnXCcnICdZJyB0byAn3ScKK2NvbXBvc2UgJ1wnJyAneScgdG8gJ/0nCitjb21wb3NlICdUJyAnSCcgdG8gJ94nCitjb21wb3NlICd0JyAnaCcgdG8gJ/4nCitjb21wb3NlICdzJyAncycgdG8gJ98nCitjb21wb3NlICciJyAneScgdG8gJ/8nCitjb21wb3NlICdzJyAneicgdG8gJ98nCitjb21wb3NlICdpJyAnaicgdG8gJ/8nCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlnaS5oIGIvZHJpdmVycy9jaGFyL2RpZ2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRmMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RpZ2kuaApAQCAtMCwwICsxLDcxIEBACisvKiAgICAgICAgICBEZWZpbml0aW9ucyBmb3IgRGlnaUJvYXJkIGRpdHR5KDEpIGNvbW1hbmQuICAgICAgICAgICAgICAgICAqLworCisjaWYgIWRlZmluZWQoVElPQ01PREcpCisjZGVmaW5lCVRJT0NNT0RHCSgoJ2QnPDw4KSB8IDI1MCkJCS8qIGdldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNT0RTCSgoJ2QnPDw4KSB8IDI1MSkJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRJT0NNU0VUKQorI2RlZmluZQlUSU9DTVNFVAkoKCdkJzw8OCkgfCAyNTIpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTUdFVAkoKCdkJzw8OCkgfCAyNTMpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChUSU9DTUJJQykKKyNkZWZpbmUJVElPQ01CSUMJKCgnZCc8PDgpIHwgMjU0KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNkZWZpbmUJVElPQ01CSVMJKCgnZCc8PDgpIHwgMjU1KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ1NEVFIpCisjZGVmaW5lCVRJT0NTRFRSCSgoJ2UnPDw4KSB8IDApCQkvKiBzZXQgRFRSCQkqLworI2RlZmluZQlUSU9DQ0RUUgkoKCdlJzw8OCkgfCAxKQkJLyogY2xlYXIgRFRSCQkqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElvY3RsIGNvbW1hbmQgYXJndW1lbnRzIGZvciBESUdJIHBhcmFtZXRlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBESUdJX0dFVEEJKCgnZSc8PDgpIHwgOTQpCQkvKiBSZWFkIHBhcmFtcwkJKi8KKworI2RlZmluZSBESUdJX1NFVEEJKCgnZSc8PDgpIHwgOTUpCQkvKiBTZXQgcGFyYW1zCQkqLworI2RlZmluZSBESUdJX1NFVEFXCSgoJ2UnPDw4KSB8IDk2KQkJLyogRHJhaW4gJiBzZXQgcGFyYW1zCSovCisjZGVmaW5lIERJR0lfU0VUQUYJKCgnZSc8PDgpIHwgOTcpCQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCisKKyNkZWZpbmUJRElHSV9HRVRGTE9XCSgoJ2UnPDw4KSB8IDk5KQkJLyogR2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCisJCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMgCSAqLworI2RlZmluZQlESUdJX1NFVEZMT1cJKCgnZSc8PDgpIHwgMTAwKQkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCisJCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCisjZGVmaW5lCURJR0lfR0VUQUZMT1cJKCgnZSc8PDgpIHwgMTAxKQkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCisJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLworI2RlZmluZQlESUdJX1NFVEFGTE9XCSgoJ2UnPDw4KSB8IDEwMikJCS8qIFNldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLworCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzCSAqLworCitzdHJ1Y3QJZGlnaWZsb3dfc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyCXN0YXJ0YzsJCQkJLyogZmxvdyBjbnRsIHN0YXJ0IGNoYXIJKi8KKwl1bnNpZ25lZCBjaGFyCXN0b3BjOwkJCQkvKiBmbG93IGNudGwgc3RvcCBjaGFyCSovCit9OworCit0eXBlZGVmIHN0cnVjdCBkaWdpZmxvd19zdHJ1Y3QgZGlnaWZsb3dfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYWx1ZXMgZm9yIGRpZ2lfZmxhZ3MgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBESUdJX0lYT04JMHgwMDAxCQkvKiBIYW5kbGUgSVhPTiBpbiB0aGUgRkVQCSovCisjZGVmaW5lIERJR0lfRkFTVAkweDAwMDIJCS8qIEZhc3QgYmF1ZCByYXRlcwkJKi8KKyNkZWZpbmUgUlRTUEFDRQkJMHgwMDA0CQkvKiBSVFMgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIENUU1BBQ0UJCTB4MDAwOAkJLyogQ1RTIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFNSUEFDRQkJMHgwMDEwCQkvKiBEU1Igb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEQ0RQQUNFCQkweDAwMjAJCS8qIERDRCBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERUUlBBQ0UJCTB4MDA0MAkJLyogRFRSIGlucHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBESUdJX0ZPUkNFRENECTB4MDEwMAkJLyogRm9yY2UgY2FycmllcgkJKi8KKyNkZWZpbmUJRElHSV9BTFRQSU4JMHgwMjAwCQkvKiBBbHRlcm5hdGUgUkotNDUgcGluIGNvbmZpZwkqLworI2RlZmluZQlESUdJX0FJWE9OCTB4MDQwMAkJLyogQXV4IGZsb3cgY29udHJvbCBpbiBmZXAJKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBESUdJIHBhcmFtZXRlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRpZ2lfc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydAlkaWdpX2ZsYWdzOwkJLyogRmxhZ3MgKHNlZSBhYm92ZSkJKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRpZ2lfc3RydWN0IGRpZ2lfdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWdpMS5oIGIvZHJpdmVycy9jaGFyL2RpZ2kxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0Mzc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kaWdpMS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiAgICAgICAgICBEZWZpbml0aW9ucyBmb3IgRGlnaUJvYXJkIGRpdHR5KDEpIGNvbW1hbmQuICAgICAgICAgICAgICAgICAqLworCisjaWYgIWRlZmluZWQoVElPQ01PREcpCisjZGVmaW5lCVRJT0NNT0RHCSgnZCc8PDgpIHwgMjUwCQkvKiBnZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTU9EUwkoJ2QnPDw4KSB8IDI1MQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ01TRVQpCisjZGVmaW5lCVRJT0NNU0VUCSgnZCc8PDgpIHwgMjUyCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTUdFVAkoJ2QnPDw4KSB8IDI1MwkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ01CSUMpCisjZGVmaW5lCVRJT0NNQklDCSgnZCc8PDgpIHwgMjU0CQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLworI2RlZmluZQlUSU9DTUJJUwkoJ2QnPDw4KSB8IDI1NQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ1NEVFIpCisjZGVmaW5lCVRJT0NTRFRSCSgnZSc8PDgpIHwgMAkJLyogc2V0IERUUgkJKi8KKyNkZWZpbmUJVElPQ0NEVFIJKCdlJzw8OCkgfCAxCQkvKiBjbGVhciBEVFIJCSovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfR0VUQQkoJ2UnPDw4KSB8IDk0CQkvKiBSZWFkIHBhcmFtcwkJKi8KKworI2RlZmluZSBESUdJX1NFVEEJKCdlJzw8OCkgfCA5NQkJLyogU2V0IHBhcmFtcwkJKi8KKyNkZWZpbmUgRElHSV9TRVRBVwkoJ2UnPDw4KSB8IDk2CQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KKyNkZWZpbmUgRElHSV9TRVRBRgkoJ2UnPDw4KSB8IDk3CQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCisKKyNkZWZpbmUJRElHSV9HRVRGTE9XCSgnZSc8PDgpIHwgOTkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLworCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzIAkgKi8KKyNkZWZpbmUJRElHSV9TRVRGTE9XCSgnZSc8PDgpIHwgMTAwCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKwkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KKyNkZWZpbmUJRElHSV9HRVRBRkxPVwkoJ2UnPDw4KSB8IDEwMQkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCisJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLworI2RlZmluZQlESUdJX1NFVEFGTE9XCSgnZSc8PDgpIHwgMTAyCQkvKiBTZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKwkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycwkgKi8KKworI2RlZmluZQlESUdJX0dFVElORk8JKCdlJzw8OCkgfCAxMDMJCS8qIEZpbGwgaW4gZGlnaV9pbmZvICovCisjZGVmaW5lCURJR0lfUE9MTEVSCSgnZSc8PDgpIHwgMTA0CQkvKiBUdXJuIG9uL29mZiBwb2xsZXIgKi8KKyNkZWZpbmUJRElHSV9JTklUCSgnZSc8PDgpIHwgMTA1CQkvKiBBbGxvdyB0aGluZ3MgdG8gcnVuLiAqLworCitzdHJ1Y3QJZGlnaWZsb3dfc3RydWN0IAoreworCXVuc2lnbmVkIGNoYXIJc3RhcnRjOwkJCQkvKiBmbG93IGNudGwgc3RhcnQgY2hhcgkqLworCXVuc2lnbmVkIGNoYXIJc3RvcGM7CQkJCS8qIGZsb3cgY250bCBzdG9wIGNoYXIJKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRpZ2lmbG93X3N0cnVjdCBkaWdpZmxvd190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhbHVlcyBmb3IgZGlnaV9mbGFncyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfSVhPTgkweDAwMDEJCS8qIEhhbmRsZSBJWE9OIGluIHRoZSBGRVAJKi8KKyNkZWZpbmUgRElHSV9GQVNUCTB4MDAwMgkJLyogRmFzdCBiYXVkIHJhdGVzCQkqLworI2RlZmluZSBSVFNQQUNFCQkweDAwMDQJCS8qIFJUUyBpbnB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgQ1RTUEFDRQkJMHgwMDA4CQkvKiBDVFMgb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEU1JQQUNFCQkweDAwMTAJCS8qIERTUiBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERDRFBBQ0UJCTB4MDAyMAkJLyogRENEIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFRSUEFDRQkJMHgwMDQwCQkvKiBEVFIgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERJR0lfRk9SQ0VEQ0QJMHgwMTAwCQkvKiBGb3JjZSBjYXJyaWVyCQkqLworI2RlZmluZQlESUdJX0FMVFBJTgkweDAyMDAJCS8qIEFsdGVybmF0ZSBSSi00NSBwaW4gY29uZmlnCSovCisjZGVmaW5lCURJR0lfQUlYT04JMHgwNDAwCQkvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcAkqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhbHVlcyBmb3IgZGlnaURsb2FkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOT1JNQUwgIDAKKyNkZWZpbmUgUENJX0NUTCAxCisKKyNkZWZpbmUgU0laRTggIDAKKyNkZWZpbmUgU0laRTE2IDEKKyNkZWZpbmUgU0laRTMyIDIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgRElHSSBwYXJhbWV0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX3N0cnVjdCAKK3sKKwl1bnNpZ25lZCBzaG9ydAlkaWdpX2ZsYWdzOwkJLyogRmxhZ3MgKHNlZSBhYm92ZSkJKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRpZ2lfc3RydWN0IGRpZ2lfdDsKKworc3RydWN0IGRpZ2lfaW5mbyAKK3sKKwl1bnNpZ25lZCBsb25nIGJvYXJkOyAgICAgICAgLyogV2hpY2ggYm9hcmQgaXMgdGhpcyA/ICovCisJdW5zaWduZWQgY2hhciBzdGF0dXM7ICAgICAgIC8qIEFsaXZlIG9yIGRlYWQgKi8KKwl1bnNpZ25lZCBjaGFyIHR5cGU7ICAgICAgICAgLyogc2VlIGVwY2EuaCAqLworCXVuc2lnbmVkIGNoYXIgc3VidHlwZTsgICAgICAvKiBGb3IgZnV0dXJlIFhFTSwgWFIsIGV0YyAuLi4gKi8KKwl1bnNpZ25lZCBzaG9ydCBudW1wb3J0czsgICAgLyogTnVtYmVyIG9mIHBvcnRzIGNvbmZpZ3VyZWQgKi8KKwl1bnNpZ25lZCBjaGFyICpwb3J0OyAgICAgICAgLyogSS9PIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICptZW1iYXNlOyAgICAgLyogRFBSIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICp2ZXJzaW9uOyAgICAgLyogRm9yIGZ1dHVyZSAuLi4gKi8KKwl1bnNpZ25lZCBzaG9ydCB3aW5kb3dEYXRhOyAgLyogRm9yIGZ1dHVyZSAuLi4gKi8KK30gOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RpZ2lGZXAxLmggYi9kcml2ZXJzL2NoYXIvZGlnaUZlcDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdkN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RpZ2lGZXAxLmgKQEAgLTAsMCArMSwxMzYgQEAKKworI2RlZmluZSBDU1RBUlQgICAgICAgMHg0MDBMCisjZGVmaW5lIENNQVggICAgICAgICAweDgwMEwKKyNkZWZpbmUgSVNUQVJUICAgICAgIDB4ODAwTAorI2RlZmluZSBJTUFYICAgICAgICAgMHhDMDBMCisjZGVmaW5lIENJTiAgICAgICAgICAweEQxMEwKKyNkZWZpbmUgR0xPQkFMICAgICAgIDB4RDEwTAorI2RlZmluZSBFSU4gICAgICAgICAgMHhEMThMCisjZGVmaW5lIEZFUFNUQVQgICAgICAweEQyMEwKKyNkZWZpbmUgQ0hBTlNUUlVDVCAgIDB4MTAwMEwKKyNkZWZpbmUgUlhUWEJVRiAgICAgIDB4NDAwMEwKKworCitzdHJ1Y3QgZ2xvYmFsX2RhdGEgCit7CisJdm9sYXRpbGUgdXNob3J0IGNpbjsKKwl2b2xhdGlsZSB1c2hvcnQgY291dDsKKwl2b2xhdGlsZSB1c2hvcnQgY3N0YXJ0OworCXZvbGF0aWxlIHVzaG9ydCBjbWF4OworCXZvbGF0aWxlIHVzaG9ydCBlaW47CisJdm9sYXRpbGUgdXNob3J0IGVvdXQ7CisJdm9sYXRpbGUgdXNob3J0IGlzdGFydDsKKwl2b2xhdGlsZSB1c2hvcnQgaW1heDsKK307CisKKworc3RydWN0IGJvYXJkX2NoYW4gCit7CisJaW50IGZpbGxlcjE7IAorCWludCBmaWxsZXIyOworCXZvbGF0aWxlIHVzaG9ydCB0c2VnOworCXZvbGF0aWxlIHVzaG9ydCB0aW47CisJdm9sYXRpbGUgdXNob3J0IHRvdXQ7CisJdm9sYXRpbGUgdXNob3J0IHRtYXg7CisJCisJdm9sYXRpbGUgdXNob3J0IHJzZWc7CisJdm9sYXRpbGUgdXNob3J0IHJpbjsKKwl2b2xhdGlsZSB1c2hvcnQgcm91dDsKKwl2b2xhdGlsZSB1c2hvcnQgcm1heDsKKwkKKwl2b2xhdGlsZSB1c2hvcnQgdGxvdzsKKwl2b2xhdGlsZSB1c2hvcnQgcmxvdzsKKwl2b2xhdGlsZSB1c2hvcnQgcmhpZ2g7CisJdm9sYXRpbGUgdXNob3J0IGluY3I7CisJCisJdm9sYXRpbGUgdXNob3J0IGV0aW1lOworCXZvbGF0aWxlIHVzaG9ydCBlZGVsYXk7CisJdm9sYXRpbGUgdW5jaGFyICpkZXY7CisJCisJdm9sYXRpbGUgdXNob3J0IGlmbGFnOworCXZvbGF0aWxlIHVzaG9ydCBvZmxhZzsKKwl2b2xhdGlsZSB1c2hvcnQgY2ZsYWc7CisJdm9sYXRpbGUgdXNob3J0IGdtYXNrOworCQorCXZvbGF0aWxlIHVzaG9ydCBjb2w7CisJdm9sYXRpbGUgdXNob3J0IGRlbGF5OworCXZvbGF0aWxlIHVzaG9ydCBpbWFzazsKKwl2b2xhdGlsZSB1c2hvcnQgdGZsdXNoOworCisJaW50IGZpbGxlcjM7CisJaW50IGZpbGxlcjQ7CisJaW50IGZpbGxlcjU7CisJaW50IGZpbGxlcjY7CisJCisJdm9sYXRpbGUgdW5jaGFyIG51bTsKKwl2b2xhdGlsZSB1bmNoYXIgcmFjdDsKKwl2b2xhdGlsZSB1bmNoYXIgYnN0YXQ7CisJdm9sYXRpbGUgdW5jaGFyIHRidXN5OworCXZvbGF0aWxlIHVuY2hhciBpZW1wdHk7CisJdm9sYXRpbGUgdW5jaGFyIGlsb3c7CisJdm9sYXRpbGUgdW5jaGFyIGlkYXRhOworCXZvbGF0aWxlIHVuY2hhciBlZmxhZzsKKwkKKwl2b2xhdGlsZSB1bmNoYXIgdGZsYWc7CisJdm9sYXRpbGUgdW5jaGFyIHJmbGFnOworCXZvbGF0aWxlIHVuY2hhciB4bWFzazsKKwl2b2xhdGlsZSB1bmNoYXIgeHZhbDsKKwl2b2xhdGlsZSB1bmNoYXIgbXN0YXQ7CisJdm9sYXRpbGUgdW5jaGFyIG1jaGFuZ2U7CisJdm9sYXRpbGUgdW5jaGFyIG1pbnQ7CisJdm9sYXRpbGUgdW5jaGFyIGxzdGF0OworCisJdm9sYXRpbGUgdW5jaGFyIG10cmFuOworCXZvbGF0aWxlIHVuY2hhciBvcnVuOworCXZvbGF0aWxlIHVuY2hhciBzdGFydGNhOworCXZvbGF0aWxlIHVuY2hhciBzdG9wY2E7CisJdm9sYXRpbGUgdW5jaGFyIHN0YXJ0YzsKKwl2b2xhdGlsZSB1bmNoYXIgc3RvcGM7CisJdm9sYXRpbGUgdW5jaGFyIHZuZXh0OworCXZvbGF0aWxlIHVuY2hhciBoZmxvdzsKKworCXZvbGF0aWxlIHVuY2hhciBmaWxsYzsKKwl2b2xhdGlsZSB1bmNoYXIgb2NoYXI7CisJdm9sYXRpbGUgdW5jaGFyIG9tYXNrOworCisJdW5jaGFyIGZpbGxlcjc7CisJdW5jaGFyIGZpbGxlcjhbMjhdOworfTsgCisKKworI2RlZmluZSBTUlhMV0FURVIgICAgICAweEUwCisjZGVmaW5lIFNSWEhXQVRFUiAgICAgIDB4RTEKKyNkZWZpbmUgU1RPVVQgICAgICAgICAgMHhFMgorI2RlZmluZSBQQVVTRVRYICAgICAgICAweEUzCisjZGVmaW5lIFJFU1VNRVRYICAgICAgIDB4RTQKKyNkZWZpbmUgU0FVWE9OT0ZGQyAgICAgMHhFNgorI2RlZmluZSBTRU5EQlJFQUsgICAgICAweEU4CisjZGVmaW5lIFNFVE1PREVNICAgICAgIDB4RTkKKyNkZWZpbmUgU0VUSUZMQUdTICAgICAgMHhFQQorI2RlZmluZSBTT05PRkZDICAgICAgICAweEVCCisjZGVmaW5lIFNUWExXQVRFUiAgICAgIDB4RUMKKyNkZWZpbmUgUEFVU0VSWCAgICAgICAgMHhFRQorI2RlZmluZSBSRVNVTUVSWCAgICAgICAweEVGCisjZGVmaW5lIFNFVEJVRkZFUiAgICAgIDB4RjIKKyNkZWZpbmUgU0VUQ09PS0VEICAgICAgMHhGMworI2RlZmluZSBTRVRIRkxPVyAgICAgICAweEY0CisjZGVmaW5lIFNFVENUUkxGTEFHUyAgIDB4RjUKKyNkZWZpbmUgU0VUVk5FWFQgICAgICAgMHhGNgorCisKKworI2RlZmluZSBCUkVBS19JTkQgICAgICAgIDB4MDEKKyNkZWZpbmUgTE9XVFhfSU5EICAgICAgICAweDAyCisjZGVmaW5lIEVNUFRZVFhfSU5EICAgICAgMHgwNAorI2RlZmluZSBEQVRBX0lORCAgICAgICAgIDB4MDgKKyNkZWZpbmUgTU9ERU1DSEdfSU5EICAgICAweDIwCisKKyNkZWZpbmUgRkVQX0hVUENMICAwMDAyMDAwCisjaWYgMAorI2RlZmluZSBSVFMgICAweDAyCisjZGVmaW5lIENEICAgIDB4MDgKKyNkZWZpbmUgRFNSICAgMHgxMAorI2RlZmluZSBDVFMgICAweDIwCisjZGVmaW5lIFJJICAgIDB4NDAKKyNkZWZpbmUgRFRSICAgMHg4MAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlnaVBDSS5oIGIvZHJpdmVycy9jaGFyL2RpZ2lQQ0kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E3ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RpZ2lQQ0kuaApAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBQQ0kgQklPUyBJbnRlcmZhY2UgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJUENJTUFYICAzMgkJLyogbWF4aW11bSBudW1iZXIgb2YgUENJIGJvYXJkcyAqLworCisKKyNkZWZpbmUJUENJX1ZFTkRPUl9ESUdJCQkweDExNEYKKyNkZWZpbmUJUENJX0RFVklDRV9FUEMJCTB4MDAwMgorI2RlZmluZQlQQ0lfREVWSUNFX1JJR0hUU1dJVENIIDB4MDAwMyAgLyogRm9yIHRlc3RpbmcgKi8KKyNkZWZpbmUJUENJX0RFVklDRV9YRU0JCTB4MDAwNAorI2RlZmluZQlQQ0lfREVWSUNFX1hSCQkweDAwMDUKKyNkZWZpbmUJUENJX0RFVklDRV9DWAkJMHgwMDA2CisjZGVmaW5lCVBDSV9ERVZJQ0VfWFJKCQkweDAwMDkgICAvKiBKdXBpdGVyIGJvYXJkcyB3aXRoICovCisjZGVmaW5lCVBDSV9ERVZJQ0VfRVBDSgkJMHgwMDBhICAgLyogUExYIDkwNjAgY2hpcCBmb3IgUENJICAqLworCisKKy8qCisgKiBPbiB0aGUgUENJIGJvYXJkcywgdGhlcmUgaXMgbm8gSU8gc3BhY2UgYWxsb2NhdGVkIAorICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUgICAKKyAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkgCisgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlIAorICovCisKKy8qIFBvdGVudGlhbCBsb2NhdGlvbiBvZiBQQ0kgQmlvcyBmcm9tIEUwMDAwIHRvIEZGRkZGKi8KKyNkZWZpbmUgUENJX0JJT1NfU0laRQkJMHgwMDAyMDAwMAkKKworLyogU2l6ZSBvZiBNZW1vcnkgYW5kIEkvTyBmb3IgUENJICg0TUIpICovCisjZGVmaW5lIFBDSV9SQU1fU0laRQkJMHgwMDQwMDAwMAkKKworLyogU2l6ZSBvZiBNZW1vcnkgKDJNQikgKi8KKyNkZWZpbmUgUENJX01FTV9TSVpFCQkweDAwMjAwMDAwCQorCisvKiBPZmZzZXQgb2YgSS8wIGluIE1lbW9yeSAoMk1CKSAqLworI2RlZmluZSBQQ0lfSU9fT0ZGU0VUIAkJMHgwMDIwMDAwMAkKKworI2RlZmluZSBNRU1PVVRCKGJhc2VtZW0sIHBudW0sIHNldG1lbXZhbCkgICooY2FkZHJfdCkoKGJhc2VtZW0pICsgKCBQQ0lfSU9fT0ZGU0VUIHwgcG51bSA8PCA0IHwgcG51bSApKSA9IChzZXRtZW12YWwpCisjZGVmaW5lIE1FTUlOQihiYXNlbWVtLCBwbnVtKSAgKihjYWRkcl90KSgoYmFzZW1lbSkgKyAoUENJX0lPX09GRlNFVCB8IHBudW0gPDwgNCB8IHBudW0gKSkgICAvKiBmb3IgUENJIEkvTyAqLworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEwMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCkBAIC0wLDAgKzEsOTggQEAKKyMKKyMgRHJtIGRldmljZSBjb25maWd1cmF0aW9uCisjCisjIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZQorIyBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpIGluIFhGcmVlODYgNC4xLjAgYW5kIGhpZ2hlci4KKyMKK2NvbmZpZyBEUk0KKwl0cmlzdGF0ZSAiRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIChYRnJlZTg2IDQuMS4wIGFuZCBoaWdoZXIgRFJJIHN1cHBvcnQpIgorCWRlcGVuZHMgb24gQUdQIHx8IEFHUD1uCisJaGVscAorCSAgS2VybmVsLWxldmVsIHN1cHBvcnQgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpCisJICBpbnRyb2R1Y2VkIGluIFhGcmVlODYgNC4wLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IG5lZWQgdG8gc2VsZWN0CisJICB0aGUgbW9kdWxlIHRoYXQncyByaWdodCBmb3IgeW91ciBncmFwaGljcyBjYXJkIGZyb20gdGhlIGxpc3QgYmVsb3cuCisJICBUaGVzZSBtb2R1bGVzIHByb3ZpZGUgc3VwcG9ydCBmb3Igc3luY2hyb25pemF0aW9uLCBzZWN1cml0eSwgYW5kCisJICBETUEgdHJhbnNmZXJzLiBQbGVhc2Ugc2VlIDxodHRwOi8vZHJpLnNvdXJjZWZvcmdlLm5ldC8+IGZvciBtb3JlCisJICBkZXRhaWxzLiAgWW91IHNob3VsZCBhbHNvIHNlbGVjdCBhbmQgY29uZmlndXJlIEFHUAorCSAgKC9kZXYvYWdwZ2FydCkgc3VwcG9ydC4KKworY29uZmlnIERSTV9UREZYCisJdHJpc3RhdGUgIjNkZnggQmFuc2hlZS9Wb29kb28zKyIKKwlkZXBlbmRzIG9uIERSTSAmJiBQQ0kKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSAzZGZ4IEJhbnNoZWUgb3IgVm9vZG9vMyAob3IgbGF0ZXIpLAorCSAgZ3JhcGhpY3MgY2FyZC4gIElmIE0gaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGRmeC4KKworY29uZmlnIERSTV9HQU1NQQorCXRyaXN0YXRlICIzZGxhYnMgR01YIDIwMDAiCisJZGVwZW5kcyBvbiBEUk0gJiYgQlJPS0VOCisJaGVscAorCSAgVGhpcyBpcyB0aGUgb2xkIGdhbW1hIGRyaXZlciwgcGxlYXNlIHRlbGwgbWUgaWYgaXQgbWlnaHQgYWN0dWFsbHkKKwkgIHdvcmsuCisKK2NvbmZpZyBEUk1fUjEyOAorCXRyaXN0YXRlICJBVEkgUmFnZSAxMjgiCisJZGVwZW5kcyBvbiBEUk0gJiYgUENJCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGFuIEFUSSBSYWdlIDEyOCBncmFwaGljcyBjYXJkLiAgSWYgTQorCSAgaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcjEyOC4gIEFHUCBzdXBwb3J0IGZvcgorCSAgdGhpcyBjYXJkIGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCAodW5sZXNzIHlvdSBoYXZlIGEgUENJIHZlcnNpb24pLgorCitjb25maWcgRFJNX1JBREVPTgorCXRyaXN0YXRlICJBVEkgUmFkZW9uIgorCWRlcGVuZHMgb24gRFJNICYmIFBDSQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhbiBBVEkgUmFkZW9uIGdyYXBoaWNzIGNhcmQuICBUaGVyZQorCSAgYXJlIGJvdGggUENJIGFuZCBBR1AgdmVyc2lvbnMuICBZb3UgZG9uJ3QgbmVlZCB0byBjaG9vc2UgdGhpcyB0bworCSAgcnVuIHRoZSBSYWRlb24gaW4gcGxhaW4gVkdBIG1vZGUuICBUaGVyZSBpcyBhIHByb2R1Y3QgcGFnZSBhdAorCSAgPGh0dHA6Ly93d3cuYXRpLmNvbS9uYS9wYWdlcy9wcm9kdWN0cy9wYy9yYWRlb24zMi9pbmRleC5odG1sPi4KKwkgIElmIE0gaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmFkZW9uLgorCitjb25maWcgRFJNX0k4MTAKKwl0cmlzdGF0ZSAiSW50ZWwgSTgxMCIKKwlkZXBlbmRzIG9uIERSTSAmJiBBR1AgJiYgQUdQX0lOVEVMCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGFuIEludGVsIEk4MTAgZ3JhcGhpY3MgY2FyZC4gIElmIE0gaXMKKwkgIHNlbGVjdGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGk4MTAuICBBR1Agc3VwcG9ydCBpcyByZXF1aXJlZAorCSAgZm9yIHRoaXMgZHJpdmVyIHRvIHdvcmsuCisKK2Nob2ljZQorCXByb21wdCAiSW50ZWwgODMwTSwgODQ1RywgODUyR00sIDg1NUdNLCA4NjVHIgorCWRlcGVuZHMgb24gRFJNICYmIEFHUCAmJiBBR1BfSU5URUwKKwlvcHRpb25hbAorCitjb25maWcgRFJNX0k4MzAKKwl0cmlzdGF0ZSAiaTgzMCBkcml2ZXIiCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgc3lzdGVtIHRoYXQgaGFzIEludGVsIDgzME0sIDg0NUcsCisJICA4NTJHTSwgODU1R00gb3IgODY1RyBpbnRlZ3JhdGVkIGdyYXBoaWNzLiAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTgzMC4gIEFHUCBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGRyaXZlcgorCSAgdG8gd29yay4gVGhpcyBkcml2ZXIgd2lsbCBldmVudHVhbGx5IGJlIHJlcGxhY2VkIGJ5IHRoZSBpOTE1IG9uZS4KKworY29uZmlnIERSTV9JOTE1CisJdHJpc3RhdGUgImk5MTUgZHJpdmVyIgorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIHN5c3RlbSB0aGF0IGhhcyBJbnRlbCA4MzBNLCA4NDVHLAorCSAgODUyR00sIDg1NUdNIDg2NUcgb3IgOTE1RyBpbnRlZ3JhdGVkIGdyYXBoaWNzLiAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTkxNS4gIEFHUCBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGRyaXZlcgorCSAgdG8gd29yay4gVGhpcyBkcml2ZXIgd2lsbCBldmVudHVhbGx5IHJlcGxhY2UgdGhlIEk4MzAgZHJpdmVyLCB3aGVuCisJICBsYXRlciByZWxlYXNlIG9mIFggc3RhcnQgdG8gdXNlIHRoZSBuZXcgRERYIGFuZCBEUkkuCisJCitlbmRjaG9pY2UKKworY29uZmlnIERSTV9NR0EKKwl0cmlzdGF0ZSAiTWF0cm94IGcyMDAvZzQwMCIKKwlkZXBlbmRzIG9uIERSTSAmJiBBR1AKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBNYXRyb3ggRzIwMCwgRzQwMCBvciBHNDUwIGdyYXBoaWNzCisJICBjYXJkLiAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtZ2EuICBBR1AKKwkgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZHJpdmVyIHRvIHdvcmsuCisKK2NvbmZpZyBEUk1fU0lTCisJdHJpc3RhdGUgIlNpUyB2aWRlbyBjYXJkcyIKKwlkZXBlbmRzIG9uIERSTSAmJiBBR1AKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBTaVMgNjMwIG9yIGNvbXBhdGlibGUgdmlkZW8gCisgICAgICAgICAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNpcy4gQUdQCisgICAgICAgICAgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgdGhpcyBkcml2ZXIgdG8gd29yay4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhYjI2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGRybSBkZXZpY2UgZHJpdmVyLiAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlCisjIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkgaW4gWEZyZWU4NiA0LjEuMCBhbmQgaGlnaGVyLgorCitkcm0tb2JqcyAgICA6PQlkcm1fYXV0aC5vIGRybV9idWZzLm8gZHJtX2NvbnRleHQubyBkcm1fZG1hLm8gZHJtX2RyYXdhYmxlLm8gXAorCQlkcm1fZHJ2Lm8gZHJtX2ZvcHMubyBkcm1faW5pdC5vIGRybV9pb2N0bC5vIGRybV9pcnEubyBcCisJCWRybV9sb2NrLm8gZHJtX21lbW9yeS5vIGRybV9wcm9jLm8gZHJtX3N0dWIubyBkcm1fdm0ubyBcCisJCWRybV9hZ3BzdXBwb3J0Lm8gZHJtX3NjYXR0ZXIubyBhdGlfcGNpZ2FydC5vIGRybV9wY2kubyBcCisJCWRybV9zeXNmcy5vCisKK2dhbW1hLW9ianMgIDo9IGdhbW1hX2Rydi5vIGdhbW1hX2RtYS5vCit0ZGZ4LW9ianMgICA6PSB0ZGZ4X2Rydi5vCityMTI4LW9ianMgICA6PSByMTI4X2Rydi5vIHIxMjhfY2NlLm8gcjEyOF9zdGF0ZS5vIHIxMjhfaXJxLm8KK21nYS1vYmpzICAgIDo9IG1nYV9kcnYubyBtZ2FfZG1hLm8gbWdhX3N0YXRlLm8gbWdhX3dhcnAubyBtZ2FfaXJxLm8KK2k4MTAtb2JqcyAgIDo9IGk4MTBfZHJ2Lm8gaTgxMF9kbWEubworaTgzMC1vYmpzICAgOj0gaTgzMF9kcnYubyBpODMwX2RtYS5vIGk4MzBfaXJxLm8KK2k5MTUtb2JqcyAgIDo9IGk5MTVfZHJ2Lm8gaTkxNV9kbWEubyBpOTE1X2lycS5vIGk5MTVfbWVtLm8KK3JhZGVvbi1vYmpzIDo9IHJhZGVvbl9kcnYubyByYWRlb25fY3AubyByYWRlb25fc3RhdGUubyByYWRlb25fbWVtLm8gcmFkZW9uX2lycS5vCitmZmItb2JqcyAgICA6PSBmZmJfZHJ2Lm8gZmZiX2NvbnRleHQubworc2lzLW9ianMgICAgOj0gc2lzX2Rydi5vIHNpc19kcy5vIHNpc19tbS5vCisKK29iai0kKENPTkZJR19EUk0pCSs9IGRybS5vCitvYmotJChDT05GSUdfRFJNX0dBTU1BKSArPSBnYW1tYS5vCitvYmotJChDT05GSUdfRFJNX1RERlgpCSs9IHRkZngubworb2JqLSQoQ09ORklHX0RSTV9SMTI4KQkrPSByMTI4Lm8KK29iai0kKENPTkZJR19EUk1fUkFERU9OKSs9IHJhZGVvbi5vCitvYmotJChDT05GSUdfRFJNX01HQSkJKz0gbWdhLm8KK29iai0kKENPTkZJR19EUk1fSTgxMCkJKz0gaTgxMC5vCitvYmotJChDT05GSUdfRFJNX0k4MzApCSs9IGk4MzAubworb2JqLSQoQ09ORklHX0RSTV9JOTE1KSAgKz0gaTkxNS5vCitvYmotJChDT05GSUdfRFJNX0ZGQikgICArPSBmZmIubworb2JqLSQoQ09ORklHX0RSTV9TSVMpICAgKz0gc2lzLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9SRUFETUUuZHJtIGIvZHJpdmVycy9jaGFyL2RybS9SRUFETUUuZHJtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDFlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL1JFQURNRS5kcm0KQEAgLTAsMCArMSw0NiBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZvciB0aGUgdmVyeSBsYXRlc3Qgb24gRFJJIGRldmVsb3BtZW50LCBwbGVhc2Ugc2VlOiAgICAgICoKKyogICAgIGh0dHA6Ly9kcmkuc291cmNlZm9yZ2UubmV0LyAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1RoZSBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgKGRybSkgaXMgYSBkZXZpY2UtaW5kZXBlbmRlbnQga2VybmVsLWxldmVsCitkZXZpY2UgZHJpdmVyIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFhGcmVlODYgRGlyZWN0IFJlbmRlcmluZworSW5mcmFzdHJ1Y3R1cmUgKERSSSkuCisKK1RoZSBEUk0gc3VwcG9ydHMgdGhlIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkgaW4gZm91ciBtYWpvcgord2F5czoKKworICAgIDEuIFRoZSBEUk0gcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byB0aGUgZ3JhcGhpY3MgaGFyZHdhcmUgdmlhCisgICAgICAgdGhlIHVzZSBvZiBhbiBvcHRpbWl6ZWQgdHdvLXRpZXJlZCBsb2NrLgorCisgICAgMi4gVGhlIERSTSBlbmZvcmNlcyB0aGUgRFJJIHNlY3VyaXR5IHBvbGljeSBmb3IgYWNjZXNzIHRvIHRoZSBncmFwaGljcworICAgICAgIGhhcmR3YXJlIGJ5IG9ubHkgYWxsb3dpbmcgYXV0aGVudGljYXRlZCBYMTEgY2xpZW50cyBhY2Nlc3MgdG8KKyAgICAgICByZXN0cmljdGVkIHJlZ2lvbnMgb2YgbWVtb3J5LgorCisgICAgMy4gVGhlIERSTSBwcm92aWRlcyBhIGdlbmVyaWMgRE1BIGVuZ2luZSwgY29tcGxldGUgd2l0aCBtdWx0aXBsZQorICAgICAgIHF1ZXVlcyBhbmQgdGhlIGFiaWxpdHkgdG8gZGV0ZWN0IHRoZSBuZWVkIGZvciBhbiBPcGVuR0wgY29udGV4dAorICAgICAgIHN3aXRjaC4KKworICAgIDQuIFRoZSBEUk0gaXMgZXh0ZW5zaWJsZSB2aWEgdGhlIHVzZSBvZiBzbWFsbCBkZXZpY2Utc3BlY2lmaWMgbW9kdWxlcworICAgICAgIHRoYXQgcmVseSBleHRlbnNpdmVseSBvbiB0aGUgQVBJIGV4cG9ydGVkIGJ5IHRoZSBEUk0gbW9kdWxlLgorCisKK0RvY3VtZW50YXRpb24gb24gdGhlIERSSSBpcyBhdmFpbGFibGUgZnJvbToKKyAgICBodHRwOi8vcHJlY2lzaW9uaW5zaWdodC5jb20vcGlpbnNpZ2h0cy5odG1sCisKK0ZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBrZXJuZWwtbGV2ZWwgc3VwcG9ydCwgc2VlOgorCisgICAgVGhlIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciwgS2VybmVsIFN1cHBvcnQgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nCisgICAgSW5mcmFzdHJ1Y3R1cmUKKyAgICBodHRwOi8vcHJlY2lzaW9uaW5zaWdodC5jb20vZHIvZHJtLmh0bWwKKworICAgIEhhcmR3YXJlIExvY2tpbmcgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlCisgICAgaHR0cDovL3ByZWNpc2lvbmluc2lnaHQuY29tL2RyL2xvY2tpbmcuaHRtbAorCisgICAgQSBTZWN1cml0eSBBbmFseXNpcyBvZiB0aGUgRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZQorICAgIGh0dHA6Ly9wcmVjaXNpb25pbnNpZ2h0LmNvbS9kci9zZWN1cml0eS5odG1sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGb3IgdGhlIHZlcnkgbGF0ZXN0IG9uIERSSSBkZXZlbG9wbWVudCwgcGxlYXNlIHNlZTogICAgICAqCisqICAgICBodHRwOi8vZHJpLnNvdXJjZWZvcmdlLm5ldC8gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2ExODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogXGZpbGUgYXRpX3BjaWdhcnQuaCAKKyAqIEFUSSBQQ0kgR0FSVCBzdXBwb3J0CisgKgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFdlZCBEZWMgMTMgMjE6NTI6MTkgMjAwMCBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaWYgUEFHRV9TSVpFID09IDY1NTM2CisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9PUkRFUgkwCisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9QQUdFUwkoMSA8PCAwKQorI2VsaWYgUEFHRV9TSVpFID09IDE2Mzg0CisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9PUkRFUgkxCisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9QQUdFUwkoMSA8PCAxKQorI2VsaWYgUEFHRV9TSVpFID09IDgxOTIKKyMgZGVmaW5lIEFUSV9QQ0lHQVJUX1RBQkxFX09SREVSIAkyCisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9QQUdFUyAJKDEgPDwgMikKKyNlbGlmIFBBR0VfU0laRSA9PSA0MDk2CisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9PUkRFUiAJMworIyBkZWZpbmUgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgCSgxIDw8IDMpCisjZWxzZQorIyBlcnJvciAtIFBBR0VfU0laRSBub3QgNjRLLCAxNkssIDhLIG9yIDRLCisjZW5kaWYKKworIyBkZWZpbmUgQVRJX01BWF9QQ0lHQVJUX1BBR0VTCQk4MTkyCS8qKjwgMzIgTUIgYXBlcnR1cmUsIDRLIHBhZ2VzICovCisjIGRlZmluZSBBVElfUENJR0FSVF9QQUdFX1NJWkUJCTQwOTYJLyoqPCBQQ0kgR0FSVCBwYWdlIHNpemUgKi8KKwordW5zaWduZWQgbG9uZyBkcm1fYXRpX2FsbG9jX3BjaWdhcnRfdGFibGUoIHZvaWQgKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlhZGRyZXNzID0gX19nZXRfZnJlZV9wYWdlcyggR0ZQX0tFUk5FTCwgQVRJX1BDSUdBUlRfVEFCTEVfT1JERVIgKTsKKwlpZiAoIGFkZHJlc3MgPT0gMFVMICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwYWdlID0gdmlydF90b19wYWdlKCBhZGRyZXNzICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBBVElfUENJR0FSVF9UQUJMRV9QQUdFUyA7IGkrKywgcGFnZSsrICkgeworCQlnZXRfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVJlc2VydmVkKCBwYWdlICk7CisJfQorCisJRFJNX0RFQlVHKCAiJXM6IHJldHVybmluZyAweCUwOGx4XG4iLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MgKTsKKwlyZXR1cm4gYWRkcmVzczsKK30KKworc3RhdGljIHZvaWQgZHJtX2F0aV9mcmVlX3BjaWdhcnRfdGFibGUoIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyApCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJcGFnZSA9IHZpcnRfdG9fcGFnZSggYWRkcmVzcyApOworCisJZm9yICggaSA9IDAgOyBpIDwgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgOyBpKyssIHBhZ2UrKyApIHsKKwkJX19wdXRfcGFnZShwYWdlKTsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQoIHBhZ2UgKTsKKwl9CisKKwlmcmVlX3BhZ2VzKCBhZGRyZXNzLCBBVElfUENJR0FSVF9UQUJMRV9PUkRFUiApOworfQorCitpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgZG1hX2FkZHJfdCBidXNfYWRkcikKK3sKKwlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCWludCBpOworCisJLyogd2UgbmVlZCB0byBzdXBwb3J0IGxhcmdlIG1lbW9yeSBjb25maWd1cmF0aW9ucyAqLworCWlmICggIWVudHJ5ICkgeworCQlEUk1fRVJST1IoICJubyBzY2F0dGVyL2dhdGhlciBtZW1vcnkhXG4iICk7CisJCXJldHVybiAwOworCX0KKworCWlmICggYnVzX2FkZHIgKSB7CisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBidXNfYWRkciwKKwkJCQkgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgKiBQQUdFX1NJWkUsCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCXBhZ2VzID0gKCBlbnRyeS0+cGFnZXMgPD0gQVRJX01BWF9QQ0lHQVJUX1BBR0VTICkKKwkJICAgICAgICA/IGVudHJ5LT5wYWdlcyA6IEFUSV9NQVhfUENJR0FSVF9QQUdFUzsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBwYWdlcyA7IGkrKyApIHsKKwkJCWlmICggIWVudHJ5LT5idXNhZGRyW2ldICkgYnJlYWs7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgZW50cnktPmJ1c2FkZHJbaV0sCisJCQkJCSBQQUdFX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisJfQorCisJaWYgKCBhZGRyICkgeworCQlkcm1fYXRpX2ZyZWVfcGNpZ2FydF90YWJsZSggYWRkciApOworCX0KKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChkcm1fYXRpX3BjaWdhcnRfY2xlYW51cCk7CisKK2ludCBkcm1fYXRpX3BjaWdhcnRfaW5pdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkgICB1bnNpZ25lZCBsb25nICphZGRyLAorCQkJICAgZG1hX2FkZHJfdCAqYnVzX2FkZHIpCit7CisJZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCXUzMiAqcGNpX2dhcnQsIHBhZ2VfYmFzZSwgYnVzX2FkZHJlc3MgPSAwOworCWludCBpLCBqLCByZXQgPSAwOworCisJaWYgKCAhZW50cnkgKSB7CisJCURSTV9FUlJPUiggIm5vIHNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSFcbiIgKTsKKwkJZ290byBkb25lOworCX0KKworCWFkZHJlc3MgPSBkcm1fYXRpX2FsbG9jX3BjaWdhcnRfdGFibGUoKTsKKwlpZiAoICFhZGRyZXNzICkgeworCQlEUk1fRVJST1IoICJjYW5ub3QgYWxsb2NhdGUgUENJIEdBUlQgcGFnZSFcbiIgKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICggIWRldi0+cGRldiApIHsKKwkJRFJNX0VSUk9SKCAiUENJIGRldmljZSB1bmtub3duIVxuIiApOworCQlnb3RvIGRvbmU7CisJfQorCisJYnVzX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsICh2b2lkICopYWRkcmVzcywKKwkJCQkgIEFUSV9QQ0lHQVJUX1RBQkxFX1BBR0VTICogUEFHRV9TSVpFLAorCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGJ1c19hZGRyZXNzID09IDApIHsKKwkJRFJNX0VSUk9SKCAidW5hYmxlIHRvIG1hcCBQQ0lHQVJUIHBhZ2VzIVxuIiApOworCQlkcm1fYXRpX2ZyZWVfcGNpZ2FydF90YWJsZSggYWRkcmVzcyApOworCQlhZGRyZXNzID0gMDsKKwkJZ290byBkb25lOworCX0KKworCXBjaV9nYXJ0ID0gKHUzMiAqKWFkZHJlc3M7CisKKwlwYWdlcyA9ICggZW50cnktPnBhZ2VzIDw9IEFUSV9NQVhfUENJR0FSVF9QQUdFUyApCisJCT8gZW50cnktPnBhZ2VzIDogQVRJX01BWF9QQ0lHQVJUX1BBR0VTOworCisJbWVtc2V0KCBwY2lfZ2FydCwgMCwgQVRJX01BWF9QQ0lHQVJUX1BBR0VTICogc2l6ZW9mKHUzMikgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IHBhZ2VzIDsgaSsrICkgeworCQkvKiB3ZSBuZWVkIHRvIHN1cHBvcnQgbGFyZ2UgbWVtb3J5IGNvbmZpZ3VyYXRpb25zICovCisJCWVudHJ5LT5idXNhZGRyW2ldID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCQkgICBwYWdlX2FkZHJlc3MoIGVudHJ5LT5wYWdlbGlzdFtpXSApLAorCQkJCQkgICBQQUdFX1NJWkUsCisJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoZW50cnktPmJ1c2FkZHJbaV0gPT0gMCkgeworCQkJRFJNX0VSUk9SKCAidW5hYmxlIHRvIG1hcCBQQ0lHQVJUIHBhZ2VzIVxuIiApOworCQkJZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoIGRldiwgYWRkcmVzcywgYnVzX2FkZHJlc3MgKTsKKwkJCWFkZHJlc3MgPSAwOworCQkJYnVzX2FkZHJlc3MgPSAwOworCQkJZ290byBkb25lOworCQl9CisJCXBhZ2VfYmFzZSA9ICh1MzIpIGVudHJ5LT5idXNhZGRyW2ldOworCisJCWZvciAoaiA9IDA7IGogPCAoUEFHRV9TSVpFIC8gQVRJX1BDSUdBUlRfUEFHRV9TSVpFKTsgaisrKSB7CisJCQkqcGNpX2dhcnQrKyA9IGNwdV90b19sZTMyKCBwYWdlX2Jhc2UgKTsKKwkJCXBhZ2VfYmFzZSArPSBBVElfUENJR0FSVF9QQUdFX1NJWkU7CisJCX0KKwl9CisKKwlyZXQgPSAxOworCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCXdiaW52ZCgpOworI2Vsc2UKKwltYigpOworI2VuZGlmCisKK2RvbmU6CisJKmFkZHIgPSBhZGRyZXNzOworCSpidXNfYWRkciA9IGJ1c19hZGRyZXNzOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9hdGlfcGNpZ2FydF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzMwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCkBAIC0wLDAgKzEsNjc1IEBACisvKioKKyAqIFxmaWxlIGRybS5oIAorICogSGVhZGVyIGZvciB0aGUgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgorICogXHBhciBBY2tub3dsZWRnbWVudHM6CisgKiBEZWMgMTk5OSwgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0d2lkZGxlLm5ldD4sIG1vdmUgdG8gZ2VuZXJpYyBcYyBjbXB4Y2hnLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfRFJNX0hfCisjZGVmaW5lIF9EUk1fSF8KKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgkJLyogRm9yIF9JTyogbWFjcm9zICovCisjZGVmaW5lIERSTV9JT0NUTF9OUihuKQkJX0lPQ19OUihuKQorI2RlZmluZSBEUk1fSU9DX1ZPSUQJCV9JT0NfTk9ORQorI2RlZmluZSBEUk1fSU9DX1JFQUQJCV9JT0NfUkVBRAorI2RlZmluZSBEUk1fSU9DX1dSSVRFCQlfSU9DX1dSSVRFCisjZGVmaW5lIERSTV9JT0NfUkVBRFdSSVRFCV9JT0NfUkVBRHxfSU9DX1dSSVRFCisjZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChJTl9NT0RVTEUpCisvKiBQcmV2ZW50IG5hbWUgY29sbGlzaW9uIHdoZW4gaW5jbHVkaW5nIHN5cy9pb2Njb20uaCAqLworI3VuZGVmIGlvY3RsCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2RlZmluZSBpb2N0bChhLGIsYykJCXhmODZpb2N0bChhLGIsYykKKyNlbHNlCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2VuZGlmIC8qIF9fRnJlZUJTRF9fICYmIHhmODZpb2N0bCAqLworI2RlZmluZSBEUk1fSU9DVExfTlIobikJCSgobikgJiAweGZmKQorI2RlZmluZSBEUk1fSU9DX1ZPSUQJCUlPQ19WT0lECisjZGVmaW5lIERSTV9JT0NfUkVBRAkJSU9DX09VVAorI2RlZmluZSBEUk1fSU9DX1dSSVRFCQlJT0NfSU4KKyNkZWZpbmUgRFJNX0lPQ19SRUFEV1JJVEUJSU9DX0lOT1VUCisjZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisjZW5kaWYKKworI2RlZmluZSBYRlJFRTg2X1ZFUlNJT04obWFqb3IsbWlub3IscGF0Y2gsc25hcCkgXAorCQkoKG1ham9yIDw8IDE2KSB8IChtaW5vciA8PCA4KSB8IHBhdGNoKQorCisjaWZuZGVmIENPTkZJR19YRlJFRTg2X1ZFUlNJT04KKyNkZWZpbmUgQ09ORklHX1hGUkVFODZfVkVSU0lPTiBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKyNlbmRpZgorCisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorI2RlZmluZSBEUk1fUFJPQ19ERVZJQ0VTICIvcHJvYy9kZXZpY2VzIgorI2RlZmluZSBEUk1fUFJPQ19NSVNDCSAiL3Byb2MvbWlzYyIKKyNkZWZpbmUgRFJNX1BST0NfRFJNCSAiL3Byb2MvZHJtIgorI2RlZmluZSBEUk1fREVWX0RSTQkgIi9kZXYvZHJtIgorI2RlZmluZSBEUk1fREVWX01PREUJIChTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lXR1JQKQorI2RlZmluZSBEUk1fREVWX1VJRAkgMAorI2RlZmluZSBEUk1fREVWX0dJRAkgMAorI2VuZGlmCisKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OID49IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorI2RlZmluZSBEUk1fTUFKT1IgICAgICAgMjI2CisjZGVmaW5lIERSTV9NQVhfTUlOT1IgICAxNQorI2VuZGlmCisjZGVmaW5lIERSTV9OQU1FCSJkcm0iCSAgLyoqPCBOYW1lIGluIGtlcm5lbCwgL2RldiwgYW5kIC9wcm9jICovCisjZGVmaW5lIERSTV9NSU5fT1JERVIJNQkgIC8qKjwgQXQgbGVhc3QgMl41IGJ5dGVzID0gMzIgYnl0ZXMgKi8KKyNkZWZpbmUgRFJNX01BWF9PUkRFUgkyMgkgIC8qKjwgVXAgdG8gMl4yMiBieXRlcyA9IDRNQiAqLworI2RlZmluZSBEUk1fUkFNX1BFUkNFTlQgMTAJICAvKio8IEhvdyBtdWNoIHN5c3RlbSByYW0gY2FuIHdlIGxvY2s/ICovCisKKyNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMCAvKio8IEhhcmR3YXJlIGxvY2sgaXMgaGVsZCAqLworI2RlZmluZSBfRFJNX0xPQ0tfQ09OVAkweDQwMDAwMDAwIC8qKjwgSGFyZHdhcmUgbG9jayBpcyBjb250ZW5kZWQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0lTX0hFTEQobG9jaykJICAgKChsb2NrKSAmIF9EUk1fTE9DS19IRUxEKQorI2RlZmluZSBfRFJNX0xPQ0tfSVNfQ09OVChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0NPTlQpCisjZGVmaW5lIF9EUk1fTE9DS0lOR19DT05URVhUKGxvY2spICgobG9jaykgJiB+KF9EUk1fTE9DS19IRUxEfF9EUk1fTE9DS19DT05UKSkKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZHJtX2hhbmRsZV90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgIGRybV9jb250ZXh0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX21hZ2ljX3Q7CisKKworLyoqCisgKiBDbGlwcmVjdC4KKyAqIAorICogXHdhcm5pbmc6IElmIHlvdSBjaGFuZ2UgdGhpcyBzdHJ1Y3R1cmUsIG1ha2Ugc3VyZSB5b3UgY2hhbmdlCisgKiBYRjg2RFJJQ2xpcFJlY3RSZWMgaW4gdGhlIHNlcnZlciBhcyB3ZWxsCisgKgorICogXG5vdGUgS1c6IEFjdHVhbGx5IGl0J3MgaWxsZWdhbCB0byBjaGFuZ2UgZWl0aGVyIGZvcgorICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcmVhc29ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CisJdW5zaWduZWQgc2hvcnQJeDE7CisJdW5zaWduZWQgc2hvcnQJeTE7CisJdW5zaWduZWQgc2hvcnQJeDI7CisJdW5zaWduZWQgc2hvcnQJeTI7Cit9IGRybV9jbGlwX3JlY3RfdDsKKworCisvKioKKyAqIFRleHR1cmUgcmVnaW9uLAorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhcgluZXh0OworCXVuc2lnbmVkIGNoYXIJcHJldjsKKwl1bnNpZ25lZCBjaGFyCWluX3VzZTsKKwl1bnNpZ25lZCBjaGFyCXBhZGRpbmc7CisJdW5zaWduZWQgaW50CWFnZTsKK30gZHJtX3RleF9yZWdpb25fdDsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NrLgorICoKKyAqIFRoZSBsb2NrIHN0cnVjdHVyZSBpcyBhIHNpbXBsZSBjYWNoZS1saW5lIGFsaWduZWQgaW50ZWdlci4gIFRvIGF2b2lkCisgKiBwcm9jZXNzb3IgYnVzIGNvbnRlbnRpb24gb24gYSBtdWx0aXByb2Nlc3NvciBzeXN0ZW0sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55CisgKiBvdGhlciBkYXRhIHN0b3JlZCBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faHdfbG9jayB7CisJX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBsb2NrOwkJLyoqPCBsb2NrIHZhcmlhYmxlICovCisJY2hhcgkJCSAgcGFkZGluZ1s2MF07CS8qKjwgUGFkIHRvIGNhY2hlIGxpbmUgKi8KK30gZHJtX2h3X2xvY2tfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKiAKKyAqIFxzYSBkcm1HZXRWZXJzaW9uKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV92ZXJzaW9uIHsKKwlpbnQgICAgdmVyc2lvbl9tYWpvcjsJICAvKio8IE1ham9yIHZlcnNpb24gKi8KKwlpbnQgICAgdmVyc2lvbl9taW5vcjsJICAvKio8IE1pbm9yIHZlcnNpb24gKi8KKwlpbnQgICAgdmVyc2lvbl9wYXRjaGxldmVsOy8qKjwgUGF0Y2ggbGV2ZWwgKi8KKwlzaXplX3QgbmFtZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgbmFtZSBidWZmZXIgKi8KKwljaGFyICAgX191c2VyICpuYW1lOwkgIC8qKjwgTmFtZSBvZiBkcml2ZXIgKi8KKwlzaXplX3QgZGF0ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgZGF0ZSBidWZmZXIgKi8KKwljaGFyICAgX191c2VyICpkYXRlOwkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkYXRlICovCisJc2l6ZV90IGRlc2NfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRlc2MgYnVmZmVyICovCisJY2hhciAgIF9fdXNlciAqZGVzYzsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGVzYyAqLworfSBkcm1fdmVyc2lvbl90OworCisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9VTklRVUUgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0QnVzaWQoKSBhbmQgZHJtU2V0QnVzSWQoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZSB7CisJc2l6ZV90IHVuaXF1ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgdW5pcXVlICovCisJY2hhciAgIF9fdXNlciAqdW5pcXVlOwkgIC8qKjwgVW5pcXVlIG5hbWUgZm9yIGRyaXZlciBpbnN0YW50aWF0aW9uICovCit9IGRybV91bmlxdWVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBkcm1fbGlzdCB7CisJaW50CQkgY291bnQ7CSAgLyoqPCBMZW5ndGggb2YgdXNlci1zcGFjZSBzdHJ1Y3R1cmVzICovCisJZHJtX3ZlcnNpb25fdAkgX191c2VyICp2ZXJzaW9uOworfSBkcm1fbGlzdF90OworCisKK3R5cGVkZWYgc3RydWN0IGRybV9ibG9jayB7CisJaW50CQkgdW51c2VkOworfSBkcm1fYmxvY2tfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgeworCWVudW0geworCQlEUk1fQUREX0NPTU1BTkQsCisJCURSTV9STV9DT01NQU5ELAorCQlEUk1fSU5TVF9IQU5ETEVSLAorCQlEUk1fVU5JTlNUX0hBTkRMRVIKKwl9CQkgZnVuYzsKKwlpbnQJCSBpcnE7Cit9IGRybV9jb250cm9sX3Q7CisKKworLyoqCisgKiBUeXBlIG9mIG1lbW9yeSB0byBtYXAuCisgKi8KK3R5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgeworCV9EUk1fRlJBTUVfQlVGRkVSICAgPSAwLCAgLyoqPCBXQyAobm8gY2FjaGluZyksIG5vIGNvcmUgZHVtcCAqLworCV9EUk1fUkVHSVNURVJTCSAgICA9IDEsICAvKio8IG5vIGNhY2hpbmcsIG5vIGNvcmUgZHVtcCAqLworCV9EUk1fU0hNCSAgICA9IDIsICAvKio8IHNoYXJlZCwgY2FjaGVkICovCisJX0RSTV9BR1AgICAgICAgICAgICA9IDMsICAvKio8IEFHUC9HQVJUICovCisJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQJICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLworfSBkcm1fbWFwX3R5cGVfdDsKKworCisvKioKKyAqIE1lbW9yeSBtYXBwaW5nIGZsYWdzLgorICovCit0eXBlZGVmIGVudW0gZHJtX21hcF9mbGFncyB7CisJX0RSTV9SRVNUUklDVEVECSAgICAgPSAweDAxLCAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gdXNlci12aXJ0dWFsICovCisJX0RSTV9SRUFEX09OTFkJICAgICA9IDB4MDIsCisJX0RSTV9MT0NLRUQJICAgICA9IDB4MDQsIC8qKjwgc2hhcmVkLCBjYWNoZWQsIGxvY2tlZCAqLworCV9EUk1fS0VSTkVMCSAgICAgPSAweDA4LCAvKio8IGtlcm5lbCByZXF1aXJlcyBhY2Nlc3MgKi8KKwlfRFJNX1dSSVRFX0NPTUJJTklORyA9IDB4MTAsIC8qKjwgdXNlIHdyaXRlLWNvbWJpbmluZyBpZiBhdmFpbGFibGUgKi8KKwlfRFJNX0NPTlRBSU5TX0xPQ0sgICA9IDB4MjAsIC8qKjwgU0hNIHBhZ2UgdGhhdCBjb250YWlucyBsb2NrICovCisJX0RSTV9SRU1PVkFCTEUJICAgICA9IDB4NDAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KK30gZHJtX21hcF9mbGFnc190OworCisKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgeworCXVuc2lnbmVkIGludAljdHhfaWQ7ICAvKio8IENvbnRleHQgcmVxdWVzdGluZyBwcml2YXRlIG1hcHBpbmcgKi8KKwl2b2lkCQkqaGFuZGxlOyAvKio8IEhhbmRsZSBvZiBtYXAgKi8KK30gZHJtX2N0eF9wcml2X21hcF90OworCisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9NQVAsIERSTV9JT0NUTF9BRERfTUFQIGFuZCBEUk1fSU9DVExfUk1fTUFQIGlvY3RscworICogYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWRkTWFwKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9tYXAgeworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwkgLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KKwl1bnNpZ25lZCBsb25nCXNpemU7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KKwlkcm1fbWFwX3R5cGVfdAl0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwlkcm1fbWFwX2ZsYWdzX3QgZmxhZ3M7CSAvKio8IEZsYWdzICovCisJdm9pZAkJKmhhbmRsZTsgLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLworCQkJCSAvKio8IEtlcm5lbC1zcGFjZToga2VybmVsLXZpcnR1YWwgYWRkcmVzcyAqLworCWludAkJbXRycjsJIC8qKjwgTVRSUiBzbG90IHVzZWQgKi8KKwkJCQkgLyogICBQcml2YXRlIGRhdGEgKi8KK30gZHJtX21hcF90OworCisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9DTElFTlQgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaWVudCB7CisJaW50CQlpZHg7CS8qKjwgV2hpY2ggY2xpZW50IGRlc2lyZWQ/ICovCisJaW50CQlhdXRoOwkvKio8IElzIGNsaWVudCBhdXRoZW50aWNhdGVkPyAqLworCXVuc2lnbmVkIGxvbmcJcGlkOwkvKio8IFByb2Nlc3MgSUQgKi8KKwl1bnNpZ25lZCBsb25nCXVpZDsJLyoqPCBVc2VyIElEICovCisJdW5zaWduZWQgbG9uZwltYWdpYzsJLyoqPCBNYWdpYyAqLworCXVuc2lnbmVkIGxvbmcJaW9jczsJLyoqPCBJb2N0bCBjb3VudCAqLworfSBkcm1fY2xpZW50X3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlfRFJNX1NUQVRfTE9DSywKKwlfRFJNX1NUQVRfT1BFTlMsCisJX0RSTV9TVEFUX0NMT1NFUywKKwlfRFJNX1NUQVRfSU9DVExTLAorCV9EUk1fU1RBVF9MT0NLUywKKwlfRFJNX1NUQVRfVU5MT0NLUywKKwlfRFJNX1NUQVRfVkFMVUUsCS8qKjwgR2VuZXJpYyB2YWx1ZSAqLworCV9EUk1fU1RBVF9CWVRFLAkJLyoqPCBHZW5lcmljIGJ5dGUgY291bnRlciAoMTAyNGJ5dGVzL0spICovCisJX0RSTV9TVEFUX0NPVU5ULAkvKio8IEdlbmVyaWMgbm9uLWJ5dGUgY291bnRlciAoMTAwMC9rKSAqLworCisJX0RSTV9TVEFUX0lSUSwJCS8qKjwgSVJRICovCisJX0RSTV9TVEFUX1BSSU1BUlksCS8qKjwgUHJpbWFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfU0VDT05EQVJZLAkvKio8IFNlY29uZGFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfRE1BLAkJLyoqPCBETUEgKi8KKwlfRFJNX1NUQVRfU1BFQ0lBTCwJLyoqPCBTcGVjaWFsIERNQSAoZS5nLiwgcHJpb3JpdHkgb3IgcG9sbGVkKSAqLworCV9EUk1fU1RBVF9NSVNTRUQJLyoqPCBNaXNzZWQgRE1BIG9wcG9ydHVuaXR5ICovCisKKwkJCQkvKiBBZGQgdG8gdGhlICpFTkQqIG9mIHRoZSBsaXN0ICovCit9IGRybV9zdGF0X3R5cGVfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfU1RBVFMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgICB2YWx1ZTsKKwkJZHJtX3N0YXRfdHlwZV90IHR5cGU7CisJfSBkYXRhWzE1XTsKK30gZHJtX3N0YXRzX3Q7CisKKworLyoqCisgKiBIYXJkd2FyZSBsb2NraW5nIGZsYWdzLgorICovCit0eXBlZGVmIGVudW0gZHJtX2xvY2tfZmxhZ3MgeworCV9EUk1fTE9DS19SRUFEWQkgICAgID0gMHgwMSwgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIGlzIHJlYWR5IGZvciBETUEgKi8KKwlfRFJNX0xPQ0tfUVVJRVNDRU5UICA9IDB4MDIsIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KKwlfRFJNX0xPQ0tfRkxVU0gJICAgICA9IDB4MDQsIC8qKjwgRmx1c2ggdGhpcyBjb250ZXh0J3MgRE1BIHF1ZXVlIGZpcnN0ICovCisJX0RSTV9MT0NLX0ZMVVNIX0FMTCAgPSAweDA4LCAvKio8IEZsdXNoIGFsbCBETUEgcXVldWVzIGZpcnN0ICovCisJCQkJLyogVGhlc2UgKkhBTFQqIGZsYWdzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0CisJCQkJICAgLS0gdGhleSB3aWxsIGJlIHVzZWQgdG8gc3VwcG9ydCB0aGUKKwkJCQkgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLworCV9EUk1fSEFMVF9BTExfUVVFVUVTID0gMHgxMCwgLyoqPCBIYWx0IGFsbCBjdXJyZW50IGFuZCBmdXR1cmUgcXVldWVzICovCisJX0RSTV9IQUxUX0NVUl9RVUVVRVMgPSAweDIwICAvKio8IEhhbHQgYWxsIGN1cnJlbnQgcXVldWVzICovCit9IGRybV9sb2NrX2ZsYWdzX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfTE9DSywgRFJNX0lPQ1RMX1VOTE9DSyBhbmQgRFJNX0lPQ1RMX0ZJTklTSCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICogCisgKiBcc2EgZHJtR2V0TG9jaygpIGFuZCBkcm1VbmxvY2soKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgeworCWludAkJIGNvbnRleHQ7CisJZHJtX2xvY2tfZmxhZ3NfdCBmbGFnczsKK30gZHJtX2xvY2tfdDsKKworCisvKioKKyAqIERNQSBmbGFncworICoKKyAqIFx3YXJuaW5nIAorICogVGhlc2UgdmFsdWVzIFxlIG11c3QgbWF0Y2ggeGY4NmRybS5oLgorICoKKyAqIFxzYSBkcm1fZG1hLgorICovCit0eXBlZGVmIGVudW0gZHJtX2RtYV9mbGFncyB7CSAgICAgIAorCQkJCSAgICAgIC8qIEZsYWdzIGZvciBETUEgYnVmZmVyIGRpc3BhdGNoICovCisJX0RSTV9ETUFfQkxPQ0sJICAgICAgPSAweDAxLCAvKio8CisJCQkJICAgICAgICogQmxvY2sgdW50aWwgYnVmZmVyIGRpc3BhdGNoZWQuCisJCQkJICAgICAgICogCisJCQkJICAgICAgICogXG5vdGUgVGhlIGJ1ZmZlciBtYXkgbm90IHlldCBoYXZlCisJCQkJICAgICAgICogYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlIC0tCisJCQkJICAgICAgICogZ2V0dGluZyBhIGhhcmR3YXJlIGxvY2sgd2l0aCB0aGUKKwkJCQkgICAgICAgKiBoYXJkd2FyZSBxdWllc2NlbnQgd2lsbCBlbnN1cmUKKwkJCQkgICAgICAgKiB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4KKwkJCQkgICAgICAgKiBwcm9jZXNzZWQuCisJCQkJICAgICAgICovCisJX0RSTV9ETUFfV0hJTEVfTE9DS0VEID0gMHgwMiwgLyoqPCBEaXNwYXRjaCB3aGlsZSBsb2NrIGhlbGQgKi8KKwlfRFJNX0RNQV9QUklPUklUWSAgICAgPSAweDA0LCAvKio8IEhpZ2ggcHJpb3JpdHkgZGlzcGF0Y2ggKi8KKworCQkJCSAgICAgIC8qIEZsYWdzIGZvciBETUEgYnVmZmVyIHJlcXVlc3QgKi8KKwlfRFJNX0RNQV9XQUlUCSAgICAgID0gMHgxMCwgLyoqPCBXYWl0IGZvciBmcmVlIGJ1ZmZlcnMgKi8KKwlfRFJNX0RNQV9TTUFMTEVSX09LICAgPSAweDIwLCAvKio8IFNtYWxsZXItdGhhbi1yZXF1ZXN0ZWQgYnVmZmVycyBPSyAqLworCV9EUk1fRE1BX0xBUkdFUl9PSyAgICA9IDB4NDAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KK30gZHJtX2RtYV9mbGFnc190OworCisKKy8qKgorICogRFJNX0lPQ1RMX0FERF9CVUZTIGFuZCBEUk1fSU9DVExfTUFSS19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFkZEJ1ZnMoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHsKKwlpbnQJICAgICAgY291bnQ7CSAvKio8IE51bWJlciBvZiBidWZmZXJzIG9mIHRoaXMgc2l6ZSAqLworCWludAkgICAgICBzaXplOwkgLyoqPCBTaXplIGluIGJ5dGVzICovCisJaW50CSAgICAgIGxvd19tYXJrOwkgLyoqPCBMb3cgd2F0ZXIgbWFyayAqLworCWludAkgICAgICBoaWdoX21hcms7IC8qKjwgSGlnaCB3YXRlciBtYXJrICovCisJZW51bSB7CisJCV9EUk1fUEFHRV9BTElHTiA9IDB4MDEsIC8qKjwgQWxpZ24gb24gcGFnZSBib3VuZGFyaWVzIGZvciBETUEgKi8KKwkJX0RSTV9BR1BfQlVGRkVSID0gMHgwMiwgLyoqPCBCdWZmZXIgaXMgaW4gQUdQIHNwYWNlICovCisJCV9EUk1fU0dfQlVGRkVSICA9IDB4MDQgIC8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGJ1ZmZlciAqLworCX0JICAgICAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7IC8qKjwgCisJCQkJICAqIFN0YXJ0IGFkZHJlc3Mgb2Ygd2hlcmUgdGhlIEFHUCBidWZmZXJzIGFyZQorCQkJCSAgKiBpbiB0aGUgQUdQIGFwZXJ0dXJlCisJCQkJICAqLworfSBkcm1fYnVmX2Rlc2NfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9JTkZPX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKKwlpbnQJICAgICAgIGNvdW50OwkvKio8IEVudHJpZXMgaW4gbGlzdCAqLworCWRybV9idWZfZGVzY190IF9fdXNlciAqbGlzdDsKK30gZHJtX2J1Zl9pbmZvX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfRlJFRV9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZSB7CisJaW50CSAgICAgICBjb3VudDsKKwlpbnQJICAgICAgIF9fdXNlciAqbGlzdDsKK30gZHJtX2J1Zl9mcmVlX3Q7CisKKworLyoqCisgKiBCdWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBcc2EgZHJtX2J1Zl9tYXAuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIHsKKwlpbnQJCSAgaWR4OwkgICAgICAgLyoqPCBJbmRleCBpbnRvIHRoZSBtYXN0ZXIgYnVmZmVyIGxpc3QgKi8KKwlpbnQJCSAgdG90YWw7ICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KKwlpbnQJCSAgdXNlZDsJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisJdm9pZAkgIF9fdXNlciAqYWRkcmVzczsgICAgIC8qKjwgQWRkcmVzcyBvZiBidWZmZXIgKi8KK30gZHJtX2J1Zl9wdWJfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX21hcCB7CisJaW50CSAgICAgIGNvdW50OwkvKio8IExlbmd0aCBvZiB0aGUgYnVmZmVyIGxpc3QgKi8KKwl2b2lkCSAgICAgIF9fdXNlciAqdmlydHVhbDsJLyoqPCBNbWFwJ2QgYXJlYSBpbiB1c2VyLXZpcnR1YWwgKi8KKwlkcm1fYnVmX3B1Yl90IF9fdXNlciAqbGlzdDsJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KK30gZHJtX2J1Zl9tYXBfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9ETUEgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBJbmRpY2VzIGhlcmUgcmVmZXIgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgbGlzdCBpbiBkcm1fYnVmX2dldC4KKyAqCisgKiBcc2EgZHJtRE1BKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9kbWEgeworCWludAkJY29udGV4dDsJICAvKio8IENvbnRleHQgaGFuZGxlICovCisJaW50CQlzZW5kX2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc2VuZCAqLworCWludAlfX3VzZXIgKnNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCisJaW50CV9fdXNlciAqc2VuZF9zaXplczsJICAvKio8IExlbmd0aHMgb2YgZGF0YSB0byBzZW5kICovCisJZHJtX2RtYV9mbGFnc190IGZsYWdzOwkJICAvKio8IEZsYWdzICovCisJaW50CQlyZXF1ZXN0X2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisJaW50CQlyZXF1ZXN0X3NpemU7CSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KKwlpbnQJX191c2VyICpyZXF1ZXN0X2luZGljZXM7ICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCWludAlfX3VzZXIgKnJlcXVlc3Rfc2l6ZXM7CisJaW50CQlncmFudGVkX2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZ3JhbnRlZCAqLworfSBkcm1fZG1hX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlfRFJNX0NPTlRFWFRfUFJFU0VSVkVEID0gMHgwMSwKKwlfRFJNX0NPTlRFWFRfMkRPTkxZICAgID0gMHgwMgorfSBkcm1fY3R4X2ZsYWdzX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1DcmVhdGVDb250ZXh0KCkgYW5kIGRybURlc3Ryb3lDb250ZXh0KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9jdHggeworCWRybV9jb250ZXh0X3QJaGFuZGxlOworCWRybV9jdHhfZmxhZ3NfdCBmbGFnczsKK30gZHJtX2N0eF90OworCisKKy8qKgorICogRFJNX0lPQ1RMX1JFU19DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgeworCWludAkJY291bnQ7CisJZHJtX2N0eF90CV9fdXNlciAqY29udGV4dHM7Cit9IGRybV9jdHhfcmVzX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0RSQVcgYW5kIERSTV9JT0NUTF9STV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3IHsKKwlkcm1fZHJhd2FibGVfdAloYW5kbGU7Cit9IGRybV9kcmF3X3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX01BR0lDIGFuZCBEUk1fSU9DVExfQVVUSF9NQUdJQyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCB7CisJZHJtX21hZ2ljX3QJbWFnaWM7Cit9IGRybV9hdXRoX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfSVJRX0JVU0lEIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldEludGVycnVwdEZyb21CdXNJRCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faXJxX2J1c2lkIHsKKwlpbnQgaXJxOwkvKio8IElSUSBudW1iZXIgKi8KKwlpbnQgYnVzbnVtOwkvKio8IGJ1cyBudW1iZXIgKi8KKwlpbnQgZGV2bnVtOwkvKio8IGRldmljZSBudW1iZXIgKi8KKwlpbnQgZnVuY251bTsJLyoqPCBmdW5jdGlvbiBudW1iZXIgKi8KK30gZHJtX2lycV9idXNpZF90OworCisKK3R5cGVkZWYgZW51bSB7CisgICAgX0RSTV9WQkxBTktfQUJTT0xVVEUgPSAweDAsCQkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJCS8qKjwgV2FpdCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIHZibGFua3MgKi8KKyAgICBfRFJNX1ZCTEFOS19TSUdOQUwgICA9IDB4NDAwMDAwMDAJLyoqPCBTZW5kIHNpZ25hbCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCit9IGRybV92Ymxhbmtfc2VxX3R5cGVfdDsKKworCisjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgX0RSTV9WQkxBTktfU0lHTkFMCisKKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHsKKwlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJdW5zaWduZWQgbG9uZyBzaWduYWw7Cit9OworCisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgeworCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwlsb25nIHR2YWxfc2VjOworCWxvbmcgdHZhbF91c2VjOworfTsKKworCisvKioKKyAqIERSTV9JT0NUTF9XQUlUX1ZCTEFOSyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1XYWl0VkJsYW5rKCkuCisgKi8KK3R5cGVkZWYgdW5pb24gZHJtX3dhaXRfdmJsYW5rIHsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfSBkcm1fd2FpdF92YmxhbmtfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfRU5BQkxFIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFncEVuYWJsZSgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21vZGUgeworCXVuc2lnbmVkIGxvbmcgbW9kZTsJLyoqPCBBR1AgbW9kZSAqLworfSBkcm1fYWdwX21vZGVfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfQUxMT0MgYW5kIERSTV9JT0NUTF9BR1BfRlJFRSBpb2N0bHMgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwQWxsb2MoKSBhbmQgZHJtQWdwRnJlZSgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciB7CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIGJpbmRpbmcgLyB1bmJpbmRpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHR5cGU7ICAgICAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c2ljYWw7IC8qKjwgUGh5c2ljYWwgdXNlZCBieSBpODEwICovCit9IGRybV9hZ3BfYnVmZmVyX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0JJTkQgYW5kIERSTV9JT0NUTF9BR1BfVU5CSU5EIGlvY3RscyBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BCaW5kKCkgYW5kIGRybUFncFVuYmluZCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgeworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOyAgIC8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworfSBkcm1fYWdwX2JpbmRpbmdfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BWZXJzaW9uTWFqb3IoKSwgZHJtQWdwVmVyc2lvbk1pbm9yKCksIGRybUFncEdldE1vZGUoKSwKKyAqIGRybUFncEJhc2UoKSwgZHJtQWdwU2l6ZSgpLCBkcm1BZ3BNZW1vcnlVc2VkKCksIGRybUFncE1lbW9yeUF2YWlsKCksCisgKiBkcm1BZ3BWZW5kb3JJZCgpIGFuZCBkcm1BZ3BEZXZpY2VJZCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8geworCWludCAgICAgICAgICAgIGFncF92ZXJzaW9uX21ham9yOworCWludCAgICAgICAgICAgIGFncF92ZXJzaW9uX21pbm9yOworCXVuc2lnbmVkIGxvbmcgIG1vZGU7CisJdW5zaWduZWQgbG9uZyAgYXBlcnR1cmVfYmFzZTsgIC8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICBhcGVydHVyZV9zaXplOyAgLyogYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nICBtZW1vcnlfYWxsb3dlZDsgLyogYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nICBtZW1vcnlfdXNlZDsKKworCQkJCS8qIFBDSSBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IGlkX3ZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBpZF9kZXZpY2U7Cit9IGRybV9hZ3BfaW5mb190OworCisKKy8qKgorICogRFJNX0lPQ1RMX1NHX0FMTE9DIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciB7CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIG1hcHBpbmcgLyB1bm1hcHBpbmcgKi8KK30gZHJtX3NjYXR0ZXJfZ2F0aGVyX3Q7CisKKy8qKgorICogRFJNX0lPQ1RMX1NFVF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zZXRfdmVyc2lvbiB7CisJaW50IGRybV9kaV9tYWpvcjsKKwlpbnQgZHJtX2RpX21pbm9yOworCWludCBkcm1fZGRfbWFqb3I7CisJaW50IGRybV9kZF9taW5vcjsKK30gZHJtX3NldF92ZXJzaW9uX3Q7CisKKworI2RlZmluZSBEUk1fSU9DVExfQkFTRQkJCSdkJworI2RlZmluZSBEUk1fSU8obnIpCQkJX0lPKERSTV9JT0NUTF9CQVNFLG5yKQorI2RlZmluZSBEUk1fSU9SKG5yLHR5cGUpCQlfSU9SKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCisjZGVmaW5lIERSTV9JT1cobnIsdHlwZSkJCV9JT1coRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKyNkZWZpbmUgRFJNX0lPV1IobnIsdHlwZSkJCV9JT1dSKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04JCURSTV9JT1dSKDB4MDAsIGRybV92ZXJzaW9uX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfVU5JUVVFCQlEUk1fSU9XUigweDAxLCBkcm1fdW5pcXVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIGRybV9hdXRoX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JUlFfQlVTSUQJCURSTV9JT1dSKDB4MDMsIGRybV9pcnFfYnVzaWRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQVAgICAgICAgICAgICAgICBEUk1fSU9XUigweDA0LCBkcm1fbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgZHJtX2NsaWVudF90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NUQVRTICAgICAgICAgICAgIERSTV9JT1IoIDB4MDYsIGRybV9zdGF0c190KQorI2RlZmluZSBEUk1fSU9DVExfU0VUX1ZFUlNJT04JCURSTV9JT1dSKDB4MDcsIGRybV9zZXRfdmVyc2lvbl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBkcm1fdW5pcXVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BVVRIX01BR0lDCQlEUk1fSU9XKCAweDExLCBkcm1fYXV0aF90KQorI2RlZmluZSBEUk1fSU9DVExfQkxPQ0sJCQlEUk1fSU9XUigweDEyLCBkcm1fYmxvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIGRybV9ibG9ja190KQorI2RlZmluZSBEUk1fSU9DVExfQ09OVFJPTAkJRFJNX0lPVyggMHgxNCwgZHJtX2NvbnRyb2xfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9NQVAJCURSTV9JT1dSKDB4MTUsIGRybV9tYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBkcm1fYnVmX2Rlc2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01BUktfQlVGUwkJRFJNX0lPVyggMHgxNywgZHJtX2J1Zl9kZXNjX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JTkZPX0JVRlMJCURSTV9JT1dSKDB4MTgsIGRybV9idWZfaW5mb190KQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIGRybV9idWZfbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9GUkVFX0JVRlMJCURSTV9JT1coIDB4MWEsIGRybV9idWZfZnJlZV90KQorCisjZGVmaW5lIERSTV9JT0NUTF9STV9NQVAJCURSTV9JT1coIDB4MWIsIGRybV9tYXBfdCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgZHJtX2N0eF9wcml2X21hcF90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCAJRFJNX0lPV1IoMHgxZCwgZHJtX2N0eF9wcml2X21hcF90KQorCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBkcm1fY3R4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9STV9DVFgJCURSTV9JT1dSKDB4MjEsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NXSVRDSF9DVFgJCURSTV9JT1coIDB4MjQsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIGRybV9jdHhfcmVzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfRFJBVwkJRFJNX0lPV1IoMHgyNywgZHJtX2RyYXdfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIGRybV9kcmF3X3QpCisjZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBkcm1fZG1hX3QpCisjZGVmaW5lIERSTV9JT0NUTF9MT0NLCQkJRFJNX0lPVyggMHgyYSwgZHJtX2xvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgZHJtX2xvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgZHJtX2xvY2tfdCkKKworI2RlZmluZSBEUk1fSU9DVExfQUdQX0FDUVVJUkUJCURSTV9JTyggIDB4MzApCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfUkVMRUFTRQkJRFJNX0lPKCAgMHgzMSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9FTkFCTEUJCURSTV9JT1coIDB4MzIsIGRybV9hZ3BfbW9kZV90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIGRybV9hZ3BfaW5mb190KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0FMTE9DCQlEUk1fSU9XUigweDM0LCBkcm1fYWdwX2J1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0ZSRUUJCURSTV9JT1coIDB4MzUsIGRybV9hZ3BfYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgZHJtX2FncF9iaW5kaW5nX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfVU5CSU5ECQlEUk1fSU9XKCAweDM3LCBkcm1fYWdwX2JpbmRpbmdfdCkKKworI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MJCURSTV9JT1coIDB4MzgsIGRybV9zY2F0dGVyX2dhdGhlcl90KQorI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRQkJRFJNX0lPVyggMHgzOSwgZHJtX3NjYXR0ZXJfZ2F0aGVyX3QpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LCQlEUk1fSU9XUigweDNhLCBkcm1fd2FpdF92YmxhbmtfdCkKKworLyoqCisgKiBEZXZpY2Ugc3BlY2lmaWMgaW9jdGxzIHNob3VsZCBvbmx5IGJlIGluIHRoZWlyIHJlc3BlY3RpdmUgaGVhZGVycworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyBmcm9tIDB4NDAgdG8gMHg3OS4KKyAqCisgKiBcc2EgZHJtQ29tbWFuZE5vbmUoKSwgZHJtQ29tbWFuZFJlYWQoKSwgZHJtQ29tbWFuZFdyaXRlKCksIGFuZAorICogZHJtQ29tbWFuZFJlYWRXcml0ZSgpLgorICovCisjZGVmaW5lIERSTV9DT01NQU5EX0JBU0UgICAgICAgICAgICAgICAgMHg0MAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmNGM1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCkBAIC0wLDAgKzEsMTA3MyBAQAorLyoqCisgKiBcZmlsZSBkcm1QLmggCisgKiBQcml2YXRlIGhlYWRlciBmb3IgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fUF9IXworI2RlZmluZSBfRFJNX1BfSF8KKworLyogSWYgeW91IHdhbnQgdGhlIG1lbW9yeSBhbGxvYyBkZWJ1ZyBmdW5jdGlvbmFsaXR5LCBjaGFuZ2UgZGVmaW5lIGJlbG93ICovCisvKiAjZGVmaW5lIERFQlVHX01FTU9SWSAqLworCisjaWZkZWYgX19LRVJORUxfXworI2lmZGVmIF9fYWxwaGFfXworLyogYWRkIGluY2x1ZGUgb2YgY3VycmVudC5oIHNvIHRoYXQgImN1cnJlbnQiIGlzIGRlZmluZWQKKyAqIGJlZm9yZSBzdGF0aWMgaW5saW5lIGZ1bmNzIGluIHdhaXQuaC4gRG9pbmcgdGhpcyBzbyB3ZQorICogY2FuIGJ1aWxkIHRoZSBEUk0gKHBhcnQgb2YgUEkgRFJJKS4gNC8yMS8yMDAwIFMgKyBCICovCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNlbmRpZiAvKiBfX2FscGhhX18gKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CS8qIEZvciAodW4pbG9ja19rZXJuZWwgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPiAvKiBGb3IgcHRlX3dycHJvdGVjdCAqLworI2VuZGlmCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2lmZGVmIENPTkZJR19NVFJSCisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FHUCkgfHwgZGVmaW5lZChDT05GSUdfQUdQX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlICJkcm0uaCIKKworI2RlZmluZSBfX09TX0hBU19BR1AgKGRlZmluZWQoQ09ORklHX0FHUCkgfHwgKGRlZmluZWQoQ09ORklHX0FHUF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkpCisjZGVmaW5lIF9fT1NfSEFTX01UUlIgKGRlZmluZWQoQ09ORklHX01UUlIpKQorCisjaW5jbHVkZSAiZHJtX29zX2xpbnV4LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBEUk0gdGVtcGxhdGUgY3VzdG9taXphdGlvbiBkZWZhdWx0cyAqLworLypAeyovCisKKy8qIGRyaXZlciBjYXBhYmlsaXRpZXMgYW5kIHJlcXVpcmVtZW50cyBtYXNrICovCisjZGVmaW5lIERSSVZFUl9VU0VfQUdQICAgICAweDEKKyNkZWZpbmUgRFJJVkVSX1JFUVVJUkVfQUdQIDB4MgorI2RlZmluZSBEUklWRVJfVVNFX01UUlIgICAgMHg0CisjZGVmaW5lIERSSVZFUl9QQ0lfRE1BICAgICAweDgKKyNkZWZpbmUgRFJJVkVSX1NHICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRFJJVkVSX0hBVkVfRE1BICAgIDB4MjAKKyNkZWZpbmUgRFJJVkVSX0hBVkVfSVJRICAgIDB4NDAKKyNkZWZpbmUgRFJJVkVSX0lSUV9TSEFSRUQgIDB4ODAKKyNkZWZpbmUgRFJJVkVSX0lSUV9WQkwgICAgIDB4MTAwCisjZGVmaW5lIERSSVZFUl9ETUFfUVVFVUUgICAweDIwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgQmVnaW4gdGhlIERSTS4uLiAqLworLypAeyovCisKKyNkZWZpbmUgRFJNX0RFQlVHX0NPREUgMgkgIC8qKjwgSW5jbHVkZSBkZWJ1Z2dpbmcgY29kZSBpZiA+IDEsIHRoZW4KKwkJCQkgICAgIGFsc28gaW5jbHVkZSBsb29waW5nIGRldGVjdGlvbi4gKi8KKworI2RlZmluZSBEUk1fSEFTSF9TSVpFCSAgICAgIDE2IC8qKjwgU2l6ZSBvZiBrZXkgaGFzaCB0YWJsZS4gTXVzdCBiZSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBEUk1fS0VSTkVMX0NPTlRFWFQgICAgMAkgLyoqPCBDaGFuZ2UgZHJtX3Jlc2N0eCBpZiBjaGFuZ2VkICovCisjZGVmaW5lIERSTV9SRVNFUlZFRF9DT05URVhUUyAxCSAvKio8IENoYW5nZSBkcm1fcmVzY3R4IGlmIGNoYW5nZWQgKi8KKyNkZWZpbmUgRFJNX0xPT1BJTkdfTElNSVQgICAgIDUwMDAwMDAKKyNkZWZpbmUgRFJNX0JTWgkJICAgICAgMTAyNCAvKio8IEJ1ZmZlciBzaXplIGZvciAvZGV2L2RybT8gb3V0cHV0ICovCisjZGVmaW5lIERSTV9USU1FX1NMSUNFCSAgICAgIChIWi8yMCkgIC8qKjwgVGltZSBzbGljZSBmb3IgR0xYQ29udGV4dHMgKi8KKyNkZWZpbmUgRFJNX0xPQ0tfU0xJQ0UJICAgICAgMQkvKio8IFRpbWUgc2xpY2UgZm9yIGxvY2ssIGluIGppZmZpZXMgKi8KKworI2RlZmluZSBEUk1fRkxBR19ERUJVRwkgIDB4MDEKKworI2RlZmluZSBEUk1fTUVNX0RNQQkgICAwCisjZGVmaW5lIERSTV9NRU1fU0FSRUEJICAgMQorI2RlZmluZSBEUk1fTUVNX0RSSVZFUgkgICAyCisjZGVmaW5lIERSTV9NRU1fTUFHSUMJICAgMworI2RlZmluZSBEUk1fTUVNX0lPQ1RMUwkgICA0CisjZGVmaW5lIERSTV9NRU1fTUFQUwkgICA1CisjZGVmaW5lIERSTV9NRU1fVk1BUwkgICA2CisjZGVmaW5lIERSTV9NRU1fQlVGUwkgICA3CisjZGVmaW5lIERSTV9NRU1fU0VHUwkgICA4CisjZGVmaW5lIERSTV9NRU1fUEFHRVMJICAgOQorI2RlZmluZSBEUk1fTUVNX0ZJTEVTCSAgMTAKKyNkZWZpbmUgRFJNX01FTV9RVUVVRVMJICAxMQorI2RlZmluZSBEUk1fTUVNX0NNRFMJICAxMgorI2RlZmluZSBEUk1fTUVNX01BUFBJTkdTICAxMworI2RlZmluZSBEUk1fTUVNX0JVRkxJU1RTICAxNAorI2RlZmluZSBEUk1fTUVNX0FHUExJU1RTICAxNQorI2RlZmluZSBEUk1fTUVNX1RPVEFMQUdQICAxNgorI2RlZmluZSBEUk1fTUVNX0JPVU5EQUdQICAxNworI2RlZmluZSBEUk1fTUVNX0NUWEJJVE1BUCAxOAorI2RlZmluZSBEUk1fTUVNX1NUVUIgICAgICAxOQorI2RlZmluZSBEUk1fTUVNX1NHTElTVFMgICAyMAorI2RlZmluZSBEUk1fTUVNX0NUWExJU1QgIDIxCisKKyNkZWZpbmUgRFJNX01BWF9DVFhCSVRNQVAgKFBBR0VfU0laRSAqIDgpCisJCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBzZWN0aW9uICovCisvKkB7Ki8KKworI2lmbmRlZiBNT0RVTEVfTElDRU5TRQorI2RlZmluZSBNT0RVTEVfTElDRU5TRSh4KSAKKyNlbmRpZgorCisjaWZuZGVmIHByZWVtcHRfZGlzYWJsZQorI2RlZmluZSBwcmVlbXB0X2Rpc2FibGUoKQorI2RlZmluZSBwcmVlbXB0X2VuYWJsZSgpCisjZW5kaWYKKworI2lmbmRlZiBwdGVfb2Zmc2V0X21hcCAKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAgcHRlX29mZnNldAorI2RlZmluZSBwdGVfdW5tYXAocHRlKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMTkpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICogdm1hbGxvY190b19wYWdlKHZvaWQgKiB2bWFsbG9jX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZtYWxsb2NfYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwLCBwdGU7CisgIAorCWlmICghcGdkX25vbmUoKnBnZCkpIHsKKwkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHIpOworCQlpZiAoIXBtZF9ub25lKCpwbWQpKSB7CisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOworCQkJcHRlID0gKnB0ZXA7CisJCQlpZiAocHRlX3ByZXNlbnQocHRlKSkKKwkJCQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKKwkJCXB0ZV91bm1hcChwdGVwKTsKKwkJCXByZWVtcHRfZW5hYmxlKCk7CisJCX0KKwl9CisJcmV0dXJuIHBhZ2U7Cit9CisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBEUk1fUlBSX0FSRyh2bWEpCisjZWxzZQorI2RlZmluZSBEUk1fUlBSX0FSRyh2bWEpIHZtYSwKKyNlbmRpZgorCisjZGVmaW5lIFZNX09GRlNFVCh2bWEpICgodm1hKS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCkKKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIE1hY3JvcyB0byBtYWtlIHByaW50ayBlYXNpZXIgKi8KKy8qQHsqLworCisvKioKKyAqIEVycm9yIG91dHB1dC4KKyAqCisgKiBccGFyYW0gZm10IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqIFxwYXJhbSBhcmcgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgRFJNX0VSUk9SKGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSICJbIiBEUk1fTkFNRSAiOiVzXSAqRVJST1IqICIgZm10ICwgX19GVU5DVElPTl9fICwgIyNhcmcpCisKKy8qKgorICogTWVtb3J5IGVycm9yIG91dHB1dC4KKyAqCisgKiBccGFyYW0gYXJlYSBtZW1vcnkgYXJlYSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgKiBccGFyYW0gZm10IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqIFxwYXJhbSBhcmcgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgRFJNX01FTV9FUlJPUihhcmVhLCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0VSUiAiWyIgRFJNX05BTUUgIjolczolc10gKkVSUk9SKiAiIGZtdCAsIF9fRlVOQ1RJT05fXywgXAorCSAgICAgICBkcm1fbWVtX3N0YXRzW2FyZWFdLm5hbWUgLCAjI2FyZykKKworI2RlZmluZSBEUk1fSU5GTyhmbXQsIGFyZy4uLikgIHByaW50ayhLRVJOX0lORk8gIlsiIERSTV9OQU1FICJdICIgZm10ICwgIyNhcmcpCisKKy8qKgorICogRGVidWcgb3V0cHV0LgorICogCisgKiBccGFyYW0gZm10IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqIFxwYXJhbSBhcmcgYXJndW1lbnRzCisgKi8KKyNpZiBEUk1fREVCVUdfQ09ERQorI2RlZmluZSBEUk1fREVCVUcoZm10LCBhcmcuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKCBkcm1fZGVidWcgKQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHCQkJCVwKKwkJCSAgICAgICAiWyIgRFJNX05BTUUgIjolc10gIiBmbXQgLAlcCisJCQkgICAgICAgX19GVU5DVElPTl9fICwgIyNhcmcpOwkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFJNX0RFQlVHKGZtdCwgYXJnLi4uKQkJIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIERSTV9QUk9DX0xJTUlUIChQQUdFX1NJWkUtODApCisKKyNkZWZpbmUgRFJNX1BST0NfUFJJTlQoZm10LCBhcmcuLi4pCQkJCQlcCisgICBsZW4gKz0gc3ByaW50ZigmYnVmW2xlbl0sIGZtdCAsICMjYXJnKTsJCQkJXAorICAgaWYgKGxlbiA+IERSTV9QUk9DX0xJTUlUKSB7ICplb2YgPSAxOyByZXR1cm4gbGVuIC0gb2Zmc2V0OyB9CisKKyNkZWZpbmUgRFJNX1BST0NfUFJJTlRfUkVUKHJldCwgZm10LCBhcmcuLi4pCQkJCVwKKyAgIGxlbiArPSBzcHJpbnRmKCZidWZbbGVuXSwgZm10ICwgIyNhcmcpOwkJCQlcCisgICBpZiAobGVuID4gRFJNX1BST0NfTElNSVQpIHsgcmV0OyAqZW9mID0gMTsgcmV0dXJuIGxlbiAtIG9mZnNldDsgfQorCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgSW50ZXJuYWwgdHlwZXMgYW5kIHN0cnVjdHVyZXMgKi8KKy8qQHsqLworCisjZGVmaW5lIERSTV9BUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorI2RlZmluZSBEUk1fTUlOKGEsYikgKChhKTwoYik/KGEpOihiKSkKKyNkZWZpbmUgRFJNX01BWChhLGIpICgoYSk+KGIpPyhhKTooYikpCisKKyNkZWZpbmUgRFJNX0xFRlRDT1VOVCh4KSAoKCh4KS0+cnAgKyAoeCktPmNvdW50IC0gKHgpLT53cCkgJSAoKHgpLT5jb3VudCArIDEpKQorI2RlZmluZSBEUk1fQlVGQ09VTlQoeCkgKCh4KS0+Y291bnQgLSBEUk1fTEVGVENPVU5UKHgpKQorI2RlZmluZSBEUk1fV0FJVENPVU5UKGRldixpZHgpIERSTV9CVUZDT1VOVCgmZGV2LT5xdWV1ZWxpc3RbaWR4XS0+d2FpdGxpc3QpCisKKyNkZWZpbmUgRFJNX0lGX1ZFUlNJT04obWFqLCBtaW4pIChtYWogPDwgMTYgfCBtaW4pCisvKioKKyAqIEdldCB0aGUgcHJpdmF0ZSBTQVJFQSBtYXBwaW5nLgorICoKKyAqIFxwYXJhbSBfZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gX2N0eCBjb250ZXh0IG51bWJlci4KKyAqIFxwYXJhbSBfbWFwIG91dHB1dCBtYXBwaW5nLgorICovCisjZGVmaW5lIERSTV9HRVRfUFJJVl9TQVJFQShfZGV2LCBfY3R4LCBfbWFwKSBkbyB7CVwKKwkoX21hcCkgPSAoX2RldiktPmNvbnRleHRfc2FyZWFzW19jdHhdOwkJXAorfSB3aGlsZSgwKQorCisvKioKKyAqIFRlc3QgdGhhdCB0aGUgaGFyZHdhcmUgbG9jayBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIsIHJldHVybmluZyBvdGhlcndpc2UuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyIG9mIHRoZSBjYWxsZXIuCisgKi8KKyNkZWZpbmUgTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICggIV9EUk1fTE9DS19JU19IRUxEKCBkZXYtPmxvY2suaHdfbG9jay0+bG9jayApIHx8CQlcCisJICAgICBkZXYtPmxvY2suZmlscCAhPSBmaWxwICkgewkJCQlcCisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZFxuIiwJCVwKKwkJCSAgIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKioKKyAqIENvcHkgYW5kIElPQ1RMIHJldHVybiBzdHJpbmcgdG8gdXNlciBzcGFjZQorICovCisjZGVmaW5lIERSTV9DT1BZKCBuYW1lLCB2YWx1ZSApCQkJCQkJXAorCWxlbiA9IHN0cmxlbiggdmFsdWUgKTsJCQkJCQlcCisJaWYgKCBsZW4gPiBuYW1lIyNfbGVuICkgbGVuID0gbmFtZSMjX2xlbjsJCQlcCisJbmFtZSMjX2xlbiA9IHN0cmxlbiggdmFsdWUgKTsJCQkJCVwKKwlpZiAoIGxlbiAmJiBuYW1lICkgewkJCQkJCVwKKwkJaWYgKCBjb3B5X3RvX3VzZXIoIG5hbWUsIHZhbHVlLCBsZW4gKSApCQkJXAorCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCQlcCisJfQorCQorLyoqCisgKiBJb2N0bCBmdW5jdGlvbiB0eXBlLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIGFyZ3VtZW50LgorICovCit0eXBlZGVmIGludCBkcm1faW9jdGxfdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgeworCWRybV9pb2N0bF90CSAgICAgKmZ1bmM7CisJaW50CQkgICAgIGF1dGhfbmVlZGVkOworCWludAkJICAgICByb290X29ubHk7Cit9IGRybV9pb2N0bF9kZXNjX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9kZXZzdGF0ZSB7CisJcGlkX3QJCSAgb3duZXI7CS8qKjwgWCBzZXJ2ZXIgcGlkIGhvbGRpbmcgeF9sb2NrICovCit9IGRybV9kZXZzdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFnaWNfZW50cnkgeworCWRybV9tYWdpY190CSAgICAgICBtYWdpYzsKKwlzdHJ1Y3QgZHJtX2ZpbGUJICAgICAgICpwcml2OworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKm5leHQ7Cit9IGRybV9tYWdpY19lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFnaWNfaGVhZCB7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqaGVhZDsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICp0YWlsOworfSBkcm1fbWFnaWNfaGVhZF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fdm1hX2VudHJ5IHsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAgKm5leHQ7CisJcGlkX3QJCSAgICAgIHBpZDsKK30gZHJtX3ZtYV9lbnRyeV90OworCisvKioKKyAqIERNQSBidWZmZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9idWYgeworCWludAkJICBpZHg7CSAgICAgICAvKio8IEluZGV4IGludG8gbWFzdGVyIGJ1Zmxpc3QgKi8KKwlpbnQJCSAgdG90YWw7ICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KKwlpbnQJCSAgb3JkZXI7ICAgICAgIC8qKjwgbG9nLWJhc2UtMih0b3RhbCkgKi8KKwlpbnQJCSAgdXNlZDsJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisJdW5zaWduZWQgbG9uZwkgIG9mZnNldDsgICAgICAvKio8IEJ5dGUgb2Zmc2V0ICh1c2VkIGludGVybmFsbHkpICovCisJdm9pZAkJICAqYWRkcmVzczsgICAgLyoqPCBBZGRyZXNzIG9mIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcJICBidXNfYWRkcmVzczsgLyoqPCBCdXMgYWRkcmVzcyBvZiBidWZmZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZgkgICpuZXh0OyAgICAgICAvKio8IEtlcm5lbC1vbmx5OiB1c2VkIGZvciBmcmVlIGxpc3QgKi8KKwlfX3ZvbGF0aWxlX18gaW50ICB3YWl0aW5nOyAgICAgLyoqPCBPbiBrZXJuZWwgRE1BIHF1ZXVlICovCisJX192b2xhdGlsZV9fIGludCAgcGVuZGluZzsgICAgIC8qKjwgT24gaGFyZHdhcmUgRE1BIHF1ZXVlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZG1hX3dhaXQ7ICAgIC8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgKi8KKwlzdHJ1Y3QgZmlsZSAgICAgICAqZmlscDsgICAgICAgLyoqPCBQb2ludGVyIHRvIGhvbGRpbmcgZmlsZSBkZXNjciAqLworCWludAkJICBjb250ZXh0OyAgICAgLyoqPCBLZXJuZWwgcXVldWUgZm9yIHRoaXMgYnVmZmVyICovCisJaW50CQkgIHdoaWxlX2xvY2tlZDsvKio8IERpc3BhdGNoIHRoaXMgYnVmZmVyIHdoaWxlIGxvY2tlZCAqLworCWVudW0geworCQlEUk1fTElTVF9OT05FCSA9IDAsCisJCURSTV9MSVNUX0ZSRUUJID0gMSwKKwkJRFJNX0xJU1RfV0FJVAkgPSAyLAorCQlEUk1fTElTVF9QRU5ECSA9IDMsCisJCURSTV9MSVNUX1BSSU8JID0gNCwKKwkJRFJNX0xJU1RfUkVDTEFJTSA9IDUKKwl9CQkgIGxpc3Q7CSAgICAgICAvKio8IFdoaWNoIGxpc3Qgd2UncmUgb24gKi8KKworCWludAkJICBkZXZfcHJpdl9zaXplOyAvKio8IFNpemUgb2YgYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLworCXZvaWQJCSAgKmRldl9wcml2YXRlOyAgLyoqPCBQZXItYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLworfSBkcm1fYnVmX3Q7CisKKworLyoqIGJ1ZnMgaXMgb25lIGxvbmdlciB0aGFuIGl0IGhhcyB0byBiZSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3dhaXRsaXN0IHsKKwlpbnQJCSAgY291bnQ7CS8qKjwgTnVtYmVyIG9mIHBvc3NpYmxlIGJ1ZmZlcnMgKi8KKwlkcm1fYnVmX3QJICAqKmJ1ZnM7CS8qKjwgTGlzdCBvZiBwb2ludGVycyB0byBidWZmZXJzICovCisJZHJtX2J1Zl90CSAgKipycDsJCS8qKjwgUmVhZCBwb2ludGVyICovCisJZHJtX2J1Zl90CSAgKip3cDsJCS8qKjwgV3JpdGUgcG9pbnRlciAqLworCWRybV9idWZfdAkgICoqZW5kOwkvKio8IEVuZCBwb2ludGVyICovCisJc3BpbmxvY2tfdAkgIHJlYWRfbG9jazsKKwlzcGlubG9ja190CSAgd3JpdGVfbG9jazsKK30gZHJtX3dhaXRsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9mcmVlbGlzdCB7CisJaW50CQkgIGluaXRpYWxpemVkOyAvKio8IEZyZWVsaXN0IGluIHVzZSAqLworCWF0b21pY190CSAgY291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGZyZWUgYnVmZmVycyAqLworCWRybV9idWZfdAkgICpuZXh0OyAgICAgICAvKio8IEVuZCBwb2ludGVyICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0aW5nOyAgICAgLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBmcmVlIGJ1ZnMgKi8KKwlpbnQJCSAgbG93X21hcms7ICAgIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KKwlpbnQJCSAgaGlnaF9tYXJrOyAgIC8qKjwgSGlnaCB3YXRlciBtYXJrICovCisJYXRvbWljX3QJICB3Zmg7CSAgICAgICAvKio8IElmIHdhaXRpbmcgZm9yIGhpZ2ggbWFyayAqLworCXNwaW5sb2NrX3QgICAgICAgIGxvY2s7Cit9IGRybV9mcmVlbGlzdF90OworCisvKioKKyAqIEJ1ZmZlciBlbnRyeS4gIFRoZXJlIGlzIG9uZSBvZiB0aGlzIGZvciBlYWNoIGJ1ZmZlciBzaXplIG9yZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2VudHJ5IHsKKwlpbnQJCSAgYnVmX3NpemU7CS8qKjwgc2l6ZSAqLworCWludAkJICBidWZfY291bnQ7CS8qKjwgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KKwlkcm1fYnVmX3QJICAqYnVmbGlzdDsJLyoqPCBidWZmZXIgbGlzdCAqLworCWludAkJICBzZWdfY291bnQ7CisJaW50CQkgIHBhZ2Vfb3JkZXI7CisJdW5zaWduZWQgbG9uZwkgICpzZWdsaXN0OworCisJZHJtX2ZyZWVsaXN0X3QJICBmcmVlbGlzdDsKK30gZHJtX2J1Zl9lbnRyeV90OworCisvKiogRmlsZSBwcml2YXRlIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9maWxlIHsKKwlpbnQJCSAgYXV0aGVudGljYXRlZDsKKwlpbnQJCSAgbWlub3I7CisJcGlkX3QJCSAgcGlkOworCXVpZF90CQkgIHVpZDsKKwlkcm1fbWFnaWNfdAkgIG1hZ2ljOworCXVuc2lnbmVkIGxvbmcJICBpb2N0bF9jb3VudDsKKwlzdHJ1Y3QgZHJtX2ZpbGUJICAqbmV4dDsKKwlzdHJ1Y3QgZHJtX2ZpbGUJICAqcHJldjsKKwlzdHJ1Y3QgZHJtX2hlYWQgICAqaGVhZDsKKwlpbnQgCQkgIHJlbW92ZV9hdXRoX29uX2Nsb3NlOworCXVuc2lnbmVkIGxvbmcgICAgIGxvY2tfY291bnQ7CisJdm9pZCAgICAgICAgICAgICAgKmRyaXZlcl9wcml2OworfSBkcm1fZmlsZV90OworCisvKiogV2FpdCBxdWV1ZSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3F1ZXVlIHsKKwlhdG9taWNfdAkgIHVzZV9jb3VudDsJLyoqPCBPdXRzdGFuZGluZyB1c2VzICgrMSkgKi8KKwlhdG9taWNfdAkgIGZpbmFsaXphdGlvbjsJLyoqPCBGaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwlhdG9taWNfdAkgIGJsb2NrX2NvdW50OwkvKio8IENvdW50IG9mIHByb2Nlc3NlcyB3YWl0aW5nICovCisJYXRvbWljX3QJICBibG9ja19yZWFkOwkvKio8IFF1ZXVlIGJsb2NrZWQgZm9yIHJlYWRzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF9xdWV1ZTsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBibG9ja19yZWFkICovCisJYXRvbWljX3QJICBibG9ja193cml0ZTsJLyoqPCBRdWV1ZSBibG9ja2VkIGZvciB3cml0ZXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV9xdWV1ZTsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBibG9ja193cml0ZSAqLworI2lmIDEKKwlhdG9taWNfdAkgIHRvdGFsX3F1ZXVlZDsJLyoqPCBUb3RhbCBxdWV1ZWQgc3RhdGlzdGljICovCisJYXRvbWljX3QJICB0b3RhbF9mbHVzaGVkOy8qKjwgVG90YWwgZmx1c2hlcyBzdGF0aXN0aWMgKi8KKwlhdG9taWNfdAkgIHRvdGFsX2xvY2tzOwkvKio8IFRvdGFsIGxvY2tzIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCWRybV9jdHhfZmxhZ3NfdAkgIGZsYWdzOwkvKio8IENvbnRleHQgcHJlc2VydmluZyBhbmQgMkQtb25seSAqLworCWRybV93YWl0bGlzdF90CSAgd2FpdGxpc3Q7CS8qKjwgUGVuZGluZyBidWZmZXJzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZmx1c2hfcXVldWU7CS8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgdW50aWwgZmx1c2ggKi8KK30gZHJtX3F1ZXVlX3Q7CisKKy8qKgorICogTG9jayBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fbG9ja19kYXRhIHsKKwlkcm1faHdfbG9ja190CSAgKmh3X2xvY2s7CS8qKjwgSGFyZHdhcmUgbG9jayAqLworCXN0cnVjdCBmaWxlICAgICAgICpmaWxwOwkvKio8IEZpbGUgZGVzY3Igb2YgbG9jayBob2xkZXIgKDA9a2VybmVsKSAqLworCXdhaXRfcXVldWVfaGVhZF90IGxvY2tfcXVldWU7CS8qKjwgUXVldWUgb2YgYmxvY2tlZCBwcm9jZXNzZXMgKi8KKwl1bnNpZ25lZCBsb25nCSAgbG9ja190aW1lOwkvKio8IFRpbWUgb2YgbGFzdCBsb2NrIGluIGppZmZpZXMgKi8KK30gZHJtX2xvY2tfZGF0YV90OworCisvKioKKyAqIERNQSBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlX2RtYSB7CisKKwlkcm1fYnVmX2VudHJ5X3QJICBidWZzW0RSTV9NQVhfT1JERVIrMV07CS8qKjwgYnVmZmVycywgZ3JvdXBlZCBieSB0aGVpciBzaXplIG9yZGVyICovCisJaW50CQkgIGJ1Zl9jb3VudDsJLyoqPCB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyAqLworCWRybV9idWZfdAkgICoqYnVmbGlzdDsJLyoqPCBWZWN0b3Igb2YgcG9pbnRlcnMgaW50byBkcm1fZGV2aWNlX2RtYTo6YnVmcyAqLworCWludAkJICBzZWdfY291bnQ7CisJaW50CQkgIHBhZ2VfY291bnQ7CS8qKjwgbnVtYmVyIG9mIHBhZ2VzICovCisJdW5zaWduZWQgbG9uZwkgICpwYWdlbGlzdDsJLyoqPCBwYWdlIGxpc3QgKi8KKwl1bnNpZ25lZCBsb25nCSAgYnl0ZV9jb3VudDsKKwllbnVtIHsKKwkJX0RSTV9ETUFfVVNFX0FHUCA9IDB4MDEsCisJCV9EUk1fRE1BX1VTRV9TRyAgPSAweDAyCisJfSBmbGFnczsKKworfSBkcm1fZGV2aWNlX2RtYV90OworCisvKiogCisgKiBBR1AgbWVtb3J5IGVudHJ5LiAgU3RvcmVkIGFzIGEgZG91Ymx5IGxpbmtlZCBsaXN0LgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21lbSB7CisJdW5zaWduZWQgbG9uZyAgICAgIGhhbmRsZTsJLyoqPCBoYW5kbGUgKi8KKwlEUk1fQUdQX01FTSAgICAgICAgKm1lbW9yeTsJCisJdW5zaWduZWQgbG9uZyAgICAgIGJvdW5kOwkvKio8IGFkZHJlc3MgKi8KKwlpbnQgICAgICAgICAgICAgICAgcGFnZXM7CisJc3RydWN0IGRybV9hZ3BfbWVtICpwcmV2OwkvKio8IHByZXZpb3VzIGVudHJ5ICovCisJc3RydWN0IGRybV9hZ3BfbWVtICpuZXh0OwkvKio8IG5leHQgZW50cnkgKi8KK30gZHJtX2FncF9tZW1fdDsKKworLyoqCisgKiBBR1AgZGF0YS4KKyAqCisgKiBcc2EgZHJtX2FncF9pbml0KCkgYW5kIGRybV9kZXZpY2U6OmFncC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9oZWFkIHsKKwlEUk1fQUdQX0tFUk4gICAgICAgYWdwX2luZm87CS8qKjwgQUdQIGRldmljZSBpbmZvcm1hdGlvbiAqLworCWRybV9hZ3BfbWVtX3QgICAgICAqbWVtb3J5OwkvKio8IG1lbW9yeSBlbnRyaWVzICovCisJdW5zaWduZWQgbG9uZyAgICAgIG1vZGU7CS8qKjwgQUdQIG1vZGUgKi8KKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICAqYnJpZGdlOworCWludCAgICAgICAgICAgICAgICBlbmFibGVkOwkvKio8IHdoZXRoZXIgdGhlIEFHUCBidXMgYXMgYmVlbiBlbmFibGVkICovCisJaW50ICAgICAgICAgICAgICAgIGFjcXVpcmVkOwkvKio8IHdoZXRoZXIgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgYmFzZTsKKyAgIAlpbnQgCQkgICBhZ3BfbXRycjsKKwlpbnQJCSAgIGNhbnRfdXNlX2FwZXJ0dXJlOworCXVuc2lnbmVkIGxvbmcJICAgcGFnZV9tYXNrOworfSBkcm1fYWdwX2hlYWRfdDsKKworLyoqCisgKiBTY2F0dGVyLWdhdGhlciBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zZ19tZW0geworCXVuc2lnbmVkIGxvbmcgICBoYW5kbGU7CisJdm9pZCAgICAgICAgICAgICp2aXJ0dWFsOworCWludCAgICAgICAgICAgICBwYWdlczsKKwlzdHJ1Y3QgcGFnZSAgICAgKipwYWdlbGlzdDsKKwlkbWFfYWRkcl90CSpidXNhZGRyOworfSBkcm1fc2dfbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9zaWdkYXRhIHsKKwlpbnQgICAgICAgICAgIGNvbnRleHQ7CisJZHJtX2h3X2xvY2tfdCAqbG9jazsKK30gZHJtX3NpZ2RhdGFfdDsKKworLyoqCisgKiBNYXBwaW5ncyBsaXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9tYXBfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZAloZWFkOwkvKio8IGxpc3QgaGVhZCAqLworCWRybV9tYXBfdAkJKm1hcDsJLyoqPCBtYXBwaW5nICovCit9IGRybV9tYXBfbGlzdF90OworCit0eXBlZGVmIGRybV9tYXBfdCBkcm1fbG9jYWxfbWFwX3Q7CisKKy8qKgorICogQ29udGV4dCBoYW5kbGUgbGlzdAorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQJaGVhZDsgICAvKio8IGxpc3QgaGVhZCAqLworCWRybV9jb250ZXh0X3QJCWhhbmRsZTsgLyoqPCBjb250ZXh0IGhhbmRsZSAqLworCWRybV9maWxlX3QJCSp0YWc7ICAgLyoqPCBhc3NvY2lhdGVkIGZkIHByaXZhdGUgZGF0YSAqLworfSBkcm1fY3R4X2xpc3RfdDsKKworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmJsX3NpZyB7CisJc3RydWN0IGxpc3RfaGVhZAloZWFkOworCXVuc2lnbmVkIGludAkJc2VxdWVuY2U7CisJc3RydWN0IHNpZ2luZm8JCWluZm87CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworfSBkcm1fdmJsX3NpZ190OworCisKKy8qKgorICogRFJNIGRyaXZlciBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCB0aGUgY29tbW9uIGNvZGUgZm9yCisgKiBhIGZhbWlseSBvZiBjYXJkcy4gVGhlcmUgd2lsbCBvbmUgZHJtX2RldmljZSBmb3IgZWFjaCBjYXJkIHByZXNlbnQKKyAqIGluIHRoaXMgZmFtaWx5CisgKi8KK3N0cnVjdCBkcm1fZGV2aWNlOworCitzdHJ1Y3QgZHJtX2RyaXZlciB7CisJaW50ICgqcHJlaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJdm9pZCAoKnByZXJlbGVhc2UpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICpmaWxwKTsKKwl2b2lkICgqcHJldGFrZWRvd24pKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAoKnBvc3RjbGVhbnVwKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpwcmVzZXR1cCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJaW50ICgqcG9zdHNldHVwKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKyAJaW50ICgqZG1hX2lvY3RsKSggRFJNX0lPQ1RMX0FSR1MgKTsKKwlpbnQgKCpvcGVuX2hlbHBlcikoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKKwl2b2lkICgqZnJlZV9maWxwX3ByaXYpKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICpmaWxwKTsKKwl2b2lkICgqZG1hX3JlYWR5KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpkbWFfcXVpZXNjZW50KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpjb250ZXh0X2N0b3IpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KTsKKyAJaW50ICgqY29udGV4dF9kdG9yKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCk7CisgCWludCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG9sZCwgaW50IG5ldyk7CisJdm9pZCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NrX3QgKmxvY2spOworCWludCAoKnZibGFua193YWl0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKwkvKiB0aGVzZSBoYXZlIHRvIGJlIGZpbGxlZCBpbiAqLworIAlpbnQgKCpwb3N0aW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlcikoIERSTV9JUlFfQVJHUyApOworIAl2b2lkICgqaXJxX3ByZWluc3RhbGwpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworIAl2b2lkICgqaXJxX3Bvc3RpbnN0YWxsKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKyAJdm9pZCAoKmlycV91bmluc3RhbGwpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnMpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X21hcF9vZnMpKGRybV9tYXBfdCAqbWFwKTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X3JlZ19vZnMpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCpzZXRfdmVyc2lvbikoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX3NldF92ZXJzaW9uX3QgKnN2KTsKKyAJaW50ICgqdmVyc2lvbikoZHJtX3ZlcnNpb25fdCAqdmVyc2lvbik7CisJdTMyIGRyaXZlcl9mZWF0dXJlczsKKwlpbnQgZGV2X3ByaXZfc2l6ZTsKKwlkcm1faW9jdGxfZGVzY190ICppb2N0bHM7CisJaW50IG51bV9pb2N0bHM7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOworCXN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXI7Cit9OworCisvKioKKyAqIERSTSBoZWFkIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50IGEgdmlkZW8gaGVhZCBvbiBhIGNhcmQKKyAqIHRoYXQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuIEVtYmVkIG9uZSBwZXIgaGVhZCBvZiB0aGVzZSBpbiB0aGUKKyAqIHByaXZhdGUgZHJtX2RldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9oZWFkIHsKKwlpbnQgbWlub3I7CQkJLyoqPCBNaW5vciBkZXZpY2UgbnVtYmVyICovCisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290OyAgLyoqPCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLworCWRldl90IGRldmljZTsJCQkvKio8IERldmljZSBudW1iZXIgZm9yIG1rbm9kICovCisJc3RydWN0IGNsYXNzX2RldmljZSAqZGV2X2NsYXNzOworfSBkcm1faGVhZF90OworCisvKioKKyAqIERSTSBkZXZpY2Ugc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgYSBjb21wbGV0ZSBjYXJkIHRoYXQKKyAqIG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlIHsKKwljaGFyCQkgICp1bmlxdWU7CS8qKjwgVW5pcXVlIGlkZW50aWZpZXI6IGUuZy4sIGJ1c2lkICovCisJaW50CQkgIHVuaXF1ZV9sZW47CS8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSBmaWVsZCAqLworCWNoYXIJCSAgKmRldm5hbWU7CS8qKjwgRm9yIC9wcm9jL2ludGVycnVwdHMgKi8KKwlpbnQJCSAgaWZfdmVyc2lvbjsJLyoqPCBIaWdoZXN0IGludGVyZmFjZSB2ZXJzaW9uIHNldCAqLworCisJaW50CQkgIGJsb2NrZWQ7CS8qKjwgQmxvY2tlZCBkdWUgdG8gVkMgc3dpdGNoPyAqLworCisJLyoqIFxuYW1lIExvY2tzICovCisJLypAeyovCisJc3BpbmxvY2tfdAkgIGNvdW50X2xvY2s7CS8qKjwgRm9yIGludXNlLCBkcm1fZGV2aWNlOjpvcGVuX2NvdW50LCBkcm1fZGV2aWNlOjpidWZfdXNlICovCisJc3RydWN0IHNlbWFwaG9yZSAgc3RydWN0X3NlbTsJLyoqPCBGb3Igb3RoZXJzICovCisJLypAfSovCisKKwkvKiogXG5hbWUgVXNhZ2UgQ291bnRlcnMgKi8KKwkvKkB7Ki8KKwlpbnQJCSAgb3Blbl9jb3VudDsJLyoqPCBPdXRzdGFuZGluZyBmaWxlcyBvcGVuICovCisJYXRvbWljX3QJICBpb2N0bF9jb3VudDsJLyoqPCBPdXRzdGFuZGluZyBJT0NUTHMgcGVuZGluZyAqLworCWF0b21pY190CSAgdm1hX2NvdW50OwkvKio8IE91dHN0YW5kaW5nIHZtYSBhcmVhcyBvcGVuICovCisJaW50CQkgIGJ1Zl91c2U7CS8qKjwgQnVmZmVycyBpbiB1c2UgLS0gY2Fubm90IGFsbG9jICovCisJYXRvbWljX3QJICBidWZfYWxsb2M7CS8qKjwgQnVmZmVyIGFsbG9jYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwkvKkB9Ki8KKworCS8qKiBcbmFtZSBQZXJmb3JtYW5jZSBjb3VudGVycyAqLworCS8qQHsqLworCXVuc2lnbmVkIGxvbmcgICAgIGNvdW50ZXJzOworCWRybV9zdGF0X3R5cGVfdCAgIHR5cGVzWzE1XTsKKwlhdG9taWNfdCAgICAgICAgICBjb3VudHNbMTVdOworCS8qQH0qLworCisJLyoqIFxuYW1lIEF1dGhlbnRpY2F0aW9uICovCisJLypAeyovCisJZHJtX2ZpbGVfdAkgICpmaWxlX2ZpcnN0OwkvKio8IGZpbGUgbGlzdCBoZWFkICovCisJZHJtX2ZpbGVfdAkgICpmaWxlX2xhc3Q7CS8qKjwgZmlsZSBsaXN0IHRhaWwgKi8KKwlkcm1fbWFnaWNfaGVhZF90ICBtYWdpY2xpc3RbRFJNX0hBU0hfU0laRV07CS8qKjwgbWFnaWMgaGFzaCB0YWJsZSAqLworCS8qQH0qLworCisJLyoqIFxuYW1lIE1lbW9yeSBtYW5hZ2VtZW50ICovCisJLypAeyovCisJZHJtX21hcF9saXN0X3QJICAqbWFwbGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiByZWdpb25zICovCisJaW50CQkgIG1hcF9jb3VudDsJLyoqPCBOdW1iZXIgb2YgbWFwcGFibGUgcmVnaW9ucyAqLworCisJLyoqIFxuYW1lIENvbnRleHQgaGFuZGxlIG1hbmFnZW1lbnQgKi8KKwkvKkB7Ki8KKwlkcm1fY3R4X2xpc3RfdAkgICpjdHhsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIGNvbnRleHQgaGFuZGxlcyAqLworCWludAkJICBjdHhfY291bnQ7CS8qKjwgTnVtYmVyIG9mIGNvbnRleHQgaGFuZGxlcyAqLworCXN0cnVjdCBzZW1hcGhvcmUgIGN0eGxpc3Rfc2VtOwkvKio8IEZvciBjdHhsaXN0ICovCisKKwlkcm1fbWFwX3QJICAqKmNvbnRleHRfc2FyZWFzOyAvKio8IHBlci1jb250ZXh0IFNBUkVBJ3MgKi8KKwlpbnQJCSAgbWF4X2NvbnRleHQ7CisKKwlkcm1fdm1hX2VudHJ5X3QJICAqdm1hbGlzdDsJLyoqPCBMaXN0IG9mIHZtYXMgKGZvciBkZWJ1Z2dpbmcpICovCisJZHJtX2xvY2tfZGF0YV90CSAgbG9jazsJCS8qKjwgSW5mb3JtYXRpb24gb24gaGFyZHdhcmUgbG9jayAqLworCS8qQH0qLworCisJLyoqIFxuYW1lIERNQSBxdWV1ZXMgKGNvbnRleHRzKSAqLworCS8qQHsqLworCWludAkJICBxdWV1ZV9jb3VudDsJLyoqPCBOdW1iZXIgb2YgYWN0aXZlIERNQSBxdWV1ZXMgKi8KKwlpbnQJCSAgcXVldWVfcmVzZXJ2ZWQ7IC8qKjwgTnVtYmVyIG9mIHJlc2VydmVkIERNQSBxdWV1ZXMgKi8KKwlpbnQJCSAgcXVldWVfc2xvdHM7CS8qKjwgQWN0dWFsIGxlbmd0aCBvZiBxdWV1ZWxpc3QgKi8KKwlkcm1fcXVldWVfdAkgICoqcXVldWVsaXN0OwkvKio8IFZlY3RvciBvZiBwb2ludGVycyB0byBETUEgcXVldWVzICovCisJZHJtX2RldmljZV9kbWFfdCAgKmRtYTsJCS8qKjwgT3B0aW9uYWwgcG9pbnRlciBmb3IgRE1BIHN1cHBvcnQgKi8KKwkvKkB9Ki8KKworCS8qKiBcbmFtZSBDb250ZXh0IHN1cHBvcnQgKi8KKwkvKkB7Ki8KKwlpbnQJCSAgaXJxOwkJLyoqPCBJbnRlcnJ1cHQgdXNlZCBieSBib2FyZCAqLworCWludAkJICBpcnFfZW5hYmxlZDsJLyoqPCBUcnVlIGlmIGlycSBoYW5kbGVyIGlzIGVuYWJsZWQgKi8KKwlfX3ZvbGF0aWxlX18gbG9uZyBjb250ZXh0X2ZsYWc7CS8qKjwgQ29udGV4dCBzd2FwcGluZyBmbGFnICovCisJX192b2xhdGlsZV9fIGxvbmcgaW50ZXJydXB0X2ZsYWc7IC8qKjwgSW50ZXJydXB0aW9uIGhhbmRsZXIgZmxhZyAqLworCV9fdm9sYXRpbGVfXyBsb25nIGRtYV9mbGFnOwkvKio8IERNQSBkaXNwYXRjaCBmbGFnICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qKjwgVGltZXIgZm9yIGRlbGF5aW5nIGN0eCBzd2l0Y2ggKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBjb250ZXh0X3dhaXQ7IC8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgb24gY3R4IHN3aXRjaCAqLworCWludAkJICBsYXN0X2NoZWNrZWQ7CS8qKjwgTGFzdCBjb250ZXh0IGNoZWNrZWQgZm9yIERNQSAqLworCWludAkJICBsYXN0X2NvbnRleHQ7CS8qKjwgTGFzdCBjdXJyZW50IGNvbnRleHQgKi8KKwl1bnNpZ25lZCBsb25nCSAgbGFzdF9zd2l0Y2g7CS8qKjwgamlmZmllcyBhdCBsYXN0IGNvbnRleHQgc3dpdGNoICovCisJLypAfSovCisJCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJLyoqIFxuYW1lIFZCTEFOSyBJUlEgc3VwcG9ydCAqLworCS8qQHsqLworCisgICAJd2FpdF9xdWV1ZV9oZWFkX3QgdmJsX3F1ZXVlOwkvKio8IFZCTEFOSyB3YWl0IHF1ZXVlICovCisgICAJYXRvbWljX3QgICAgICAgICAgdmJsX3JlY2VpdmVkOworCXNwaW5sb2NrX3QgICAgICAgIHZibF9sb2NrOworCWRybV92Ymxfc2lnX3QgICAgIHZibF9zaWdzOwkvKio8IHNpZ25hbCBsaXN0IHRvIHNlbmQgb24gVkJMQU5LICovCisJdW5zaWduZWQgaW50ICAgICAgdmJsX3BlbmRpbmc7CisKKwkvKkB9Ki8KKwljeWNsZXNfdAkgIGN0eF9zdGFydDsKKwljeWNsZXNfdAkgIGxja19zdGFydDsKKworCWNoYXIJCSAgYnVmW0RSTV9CU1pdOyAvKio8IE91dHB1dCBidWZmZXIgKi8KKwljaGFyCQkgICpidWZfcnA7CS8qKjwgUmVhZCBwb2ludGVyICovCisJY2hhcgkJICAqYnVmX3dwOwkvKio8IFdyaXRlIHBvaW50ZXIgKi8KKwljaGFyCQkgICpidWZfZW5kOwkvKio8IEVuZCBwb2ludGVyICovCisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmJ1Zl9hc3luYzsvKio8IFByb2Nlc3NlcyB3YWl0aW5nIGZvciBTSUdJTyAqLworCXdhaXRfcXVldWVfaGVhZF90IGJ1Zl9yZWFkZXJzOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHRvIHJlYWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBidWZfd3JpdGVyczsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyB0byBjdHggc3dpdGNoICovCisKKwlkcm1fYWdwX2hlYWRfdCAgICAqYWdwOwkvKio8IEFHUCBkYXRhICovCisKKwlzdHJ1Y3QgcGNpX2RldiAgICAqcGRldjsJLyoqPCBQQ0kgZGV2aWNlIHN0cnVjdHVyZSAqLworCWludCAgICAgICAgICAgICAgIHBjaV9kb21haW47CS8qKjwgUENJIGJ1cyBkb21haW4gbnVtYmVyICovCisJaW50ICAgICAgICAgICAgICAgcGNpX2J1czsJLyoqPCBQQ0kgYnVzIG51bWJlciAqLworCWludCAgICAgICAgICAgICAgIHBjaV9zbG90OwkvKio8IFBDSSBzbG90IG51bWJlciAqLworCWludCAgICAgICAgICAgICAgIHBjaV9mdW5jOwkvKio8IFBDSSBmdW5jdGlvbiBudW1iZXIgKi8KKyNpZmRlZiBfX2FscGhhX18KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMykKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xlciAqaG9zZTsKKyNlbHNlCisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworI2VuZGlmCisjZW5kaWYKKwlkcm1fc2dfbWVtX3QgICAgICAqc2c7ICAvKio8IFNjYXR0ZXIgZ2F0aGVyIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcgICAgICpjdHhfYml0bWFwOwkvKio8IGNvbnRleHQgYml0bWFwICovCisJdm9pZAkJICAqZGV2X3ByaXZhdGU7IC8qKjwgZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCWRybV9zaWdkYXRhX3QgICAgIHNpZ2RhdGE7IC8qKjwgRm9yIGJsb2NrX2FsbF9zaWduYWxzICovCisJc2lnc2V0X3QgICAgICAgICAgc2lnbWFzazsKKworCXN0cnVjdCAgICAgICAgICAgIGRybV9kcml2ZXIgKmRyaXZlcjsKKwlkcm1fbG9jYWxfbWFwX3QgICAqYWdwX2J1ZmZlcl9tYXA7CisJZHJtX2hlYWRfdCBwcmltYXJ5OwkJLyoqPCBwcmltYXJ5IHNjcmVlbiBoZWFkICovCit9IGRybV9kZXZpY2VfdDsKKworc3RhdGljIF9faW5saW5lX18gaW50IGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZlYXR1cmUpCit7CisJcmV0dXJuICgoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIGZlYXR1cmUpID8gMSA6IDApOworfQorCisjaWYgX19PU19IQVNfQUdQCitzdGF0aWMgaW5saW5lIGludCBkcm1fY29yZV9oYXNfQUdQKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisgIHJldHVybiBkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1VTRV9BR1ApOworfQorI2Vsc2UKKyNkZWZpbmUgZHJtX2NvcmVfaGFzX0FHUChkZXYpICgwKQorI2VuZGlmCisKKyNpZiBfX09TX0hBU19NVFJSCitzdGF0aWMgaW5saW5lIGludCBkcm1fY29yZV9oYXNfTVRSUihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworICByZXR1cm4gZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9VU0VfTVRSUik7Cit9CisjZWxzZQorI2RlZmluZSBkcm1fY29yZV9oYXNfTVRSUihkZXYpICgwKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgSW50ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KKy8qQHsqLworCisJCQkJLyogTWlzYy4gc3VwcG9ydCAoZHJtX2luaXQuaCkgKi8KK2V4dGVybiBpbnQJICAgICBkcm1fZmxhZ3M7CitleHRlcm4gdm9pZAkgICAgIGRybV9wYXJzZV9vcHRpb25zKCBjaGFyICpzICk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fY3B1X3ZhbGlkKCB2b2lkICk7CisKKwkJCQkvKiBEcml2ZXIgc3VwcG9ydCAoZHJtX2Rydi5oKSAqLworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1fZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybV92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOworCisJCQkJLyogRGV2aWNlIHN1cHBvcnQgKGRybV9mb3BzLmgpICovCitleHRlcm4gaW50ICAgICAgICAgICBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQJICAgICBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludAkgICAgIGRybV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50CSAgICAgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworCisJCQkJLyogTWFwcGluZyBzdXBwb3J0IChkcm1fdm0uaCkgKi8KK2V4dGVybiB2b2lkCSAgICAgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK2V4dGVybiBpbnQJICAgICBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIGludAkgICAgIGRybV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitleHRlcm4gdW5zaWduZWQgaW50ICBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKK2V4dGVybiBzc2l6ZV90ICAgICAgIGRybV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKTsKKworCQkJCS8qIE1lbW9yeSBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9tZW1vcnkuaCkgKi8KKyNpbmNsdWRlICJkcm1fbWVtb3J5LmgiCitleHRlcm4gdm9pZAkgICAgIGRybV9tZW1faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJICAgICBkcm1fbWVtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQkgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQJICAgICAqZHJtX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CitleHRlcm4gdm9pZAkgICAgICpkcm1fcmVhbGxvYyh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLAorCQkJCSAgIGludCBhcmVhKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9hbGxvY19wYWdlcyhpbnQgb3JkZXIsIGludCBhcmVhKTsKK2V4dGVybiB2b2lkCSAgICAgZHJtX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgb3JkZXIsCisJCQkJICAgICBpbnQgYXJlYSk7CitleHRlcm4gdm9pZAkgICAgICpkcm1faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZAkgICAgICpkcm1faW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgIGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkCSAgICAgZHJtX2lvcmVtYXBmcmVlKHZvaWQgKnB0LCB1bnNpZ25lZCBsb25nIHNpemUsIGRybV9kZXZpY2VfdCAqZGV2KTsKKworZXh0ZXJuIERSTV9BR1BfTUVNICAgKmRybV9hbGxvY19hZ3Aoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCBpbnQgcGFnZXMsIHUzMiB0eXBlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybV9mcmVlX2FncChEUk1fQUdQX01FTSAqaGFuZGxlLCBpbnQgcGFnZXMpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2JpbmRfYWdwKERSTV9BR1BfTUVNICpoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fdW5iaW5kX2FncChEUk1fQUdQX01FTSAqaGFuZGxlKTsKKworCQkJCS8qIE1pc2MuIElPQ1RMIHN1cHBvcnQgKGRybV9pb2N0bC5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9pcnFfYnlfYnVzaWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0dW5pcXVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX3NldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludAkgICAgIGRybV9nZXRtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0Y2xpZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX2dldHN0YXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fc2V0dmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworCQkJCS8qIENvbnRleHQgSU9DVEwgc3VwcG9ydCAoZHJtX2NvbnRleHQuaCkgKi8KK2V4dGVybiBpbnQJICAgICBkcm1fcmVzY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX2FkZGN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9tb2RjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0Y3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX3N3aXRjaGN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9uZXdjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fcm1jdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworCitleHRlcm4gaW50CSAgICAgZHJtX2NvbnRleHRfc3dpdGNoKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3KTsKK2V4dGVybiBpbnQJICAgICBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoZHJtX2RldmljZV90ICpkZXYsIGludCBuZXcpOworCitleHRlcm4gaW50CSAgICAgZHJtX2N0eGJpdG1hcF9pbml0KCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQJICAgICBkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1fY3R4Yml0bWFwX2ZyZWUoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY3R4X2hhbmRsZSApOworCitleHRlcm4gaW50CSAgICAgZHJtX3NldHNhcmVhY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0c2FyZWFjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworCisJCQkJLyogRHJhd2FibGUgSU9DVEwgc3VwcG9ydCAoZHJtX2RyYXdhYmxlLmgpICovCitleHRlcm4gaW50CSAgICAgZHJtX2FkZGRyYXcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX3JtZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisKKwkJCQkvKiBBdXRoZW50aWNhdGlvbiBJT0NUTCBzdXBwb3J0IChkcm1fYXV0aC5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsCisJCQkJICAgIGRybV9tYWdpY190IG1hZ2ljKTsKK2V4dGVybiBpbnQJICAgICBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYyk7CitleHRlcm4gaW50CSAgICAgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fYXV0aG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGlvY3RscyBwYXN0ICovCitleHRlcm4gaW50CSAgICAgZHJtX25vb3Aoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKwkJCQkvKiBMb2NraW5nIElPQ1RMIHN1cHBvcnQgKGRybV9sb2NrLmgpICovCitleHRlcm4gaW50ICAgICAgICAgICBkcm1fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX2xvY2tfdGFrZShfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50CSAgICAgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCisJCQkJCXVuc2lnbmVkIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQJICAgICBkcm1fbG9ja19mcmVlKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fbm90aWZpZXIodm9pZCAqcHJpdik7CisKKwkJCQkvKiBCdWZmZXIgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fYnVmcy5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9vcmRlciggdW5zaWduZWQgbG9uZyBzaXplICk7CitleHRlcm4gaW50CSAgICAgZHJtX2FkZG1hcCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9ybW1hcCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX2FkZGJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX2luZm9idWZzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fbWFya2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9mcmVlYnVmcyggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX21hcGJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CisKKwkJCQkvKiBETUEgc3VwcG9ydCAoZHJtX2RtYS5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9kbWFfc2V0dXAoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQJICAgICBkcm1fZG1hX3Rha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkCSAgICAgZHJtX2ZyZWVfYnVmZmVyKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1Zik7CitleHRlcm4gdm9pZAkgICAgIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworCisJCQkJLyogSVJRIHN1cHBvcnQgKGRybV9pcnEuaCkgKi8KK2V4dGVybiBpbnQgICAgICAgICAgIGRybV9jb250cm9sKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lycV9pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gaXJxcmV0dXJuX3QgICBkcm1faXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkICAgICAgICAgIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworCitleHRlcm4gaW50ICAgICAgICAgICBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnZibF9zZXEpOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKKwkJCQkvKiBBR1AvR0FSVCBzdXBwb3J0IChkcm1fYWdwc3VwcG9ydC5oKSAqLworZXh0ZXJuIGRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIHZvaWQgICAgICAgICAgIGRybV9hZ3BfZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9lbmFibGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF91bmJpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIERSTV9BR1BfTUVNICAgICpkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHNpemVfdCBwYWdlcywgdTMyIHR5cGUpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfZnJlZV9tZW1vcnkoRFJNX0FHUF9NRU0gKmhhbmRsZSk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9iaW5kX21lbW9yeShEUk1fQUdQX01FTSAqaGFuZGxlLCBvZmZfdCBzdGFydCk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF91bmJpbmRfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUpOworCisJCQkJLyogU3R1YiBzdXBwb3J0IChkcm1fc3R1Yi5oKSAqLworZXh0ZXJuIGludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkJICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiBpbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2hlYWRfdCAqaGVhZCk7CitleHRlcm4gaW50IGRybV9wdXRfaGVhZChkcm1faGVhZF90ICogaGVhZCk7CitleHRlcm4gdW5zaWduZWQgaW50ICAgZHJtX2RlYnVnOworZXh0ZXJuIHVuc2lnbmVkIGludCAgIGRybV9jYXJkc19saW1pdDsKK2V4dGVybiBkcm1faGVhZF90ICoqZHJtX2hlYWRzOworZXh0ZXJuIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgKmRybV9jbGFzczsKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRybV9wcm9jX3Jvb3Q7CisKKwkJCQkvKiBQcm9jIHN1cHBvcnQgKGRybV9wcm9jLmgpICovCitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgICBpbnQgbWlub3IsCisJCQkJCSAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkJCQkgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKmRldl9yb290KTsKK2V4dGVybiBpbnQgICAgICAgICAgICBkcm1fcHJvY19jbGVhbnVwKGludCBtaW5vciwKKwkJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290KTsKKworCQkJCS8qIFNjYXR0ZXIgR2F0aGVyIFN1cHBvcnQgKGRybV9zY2F0dGVyLmgpICovCitleHRlcm4gdm9pZCAgICAgICAgICAgZHJtX3NnX2NsZWFudXAoZHJtX3NnX21lbV90ICplbnRyeSk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX3NnX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX3NnX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVRJIFBDSUdBUlQgc3VwcG9ydCAoYXRpX3BjaWdhcnQuaCkgKi8KK2V4dGVybiBpbnQgICAgICAgICAgICBkcm1fYXRpX3BjaWdhcnRfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmFkZHIsCisJCQkJCSAgICBkbWFfYWRkcl90ICpidXNfYWRkcik7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgICAgICBkbWFfYWRkcl90IGJ1c19hZGRyKTsKKworZXh0ZXJuIHZvaWQgKmRybV9wY2lfYWxsb2MoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgIHNpemVfdCBhbGlnbiwgZG1hX2FkZHJfdCBtYXhhZGRyLAorCQkJICAgZG1hX2FkZHJfdCAqIGJ1c2FkZHIpOworCitleHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBidXNhZGRyKTsKKworCQkJICAgICAgIC8qIHN5c2ZzIHN1cHBvcnQgKGRybV9zeXNmcy5jKSAqLworc3RydWN0IGRybV9zeXNmc19jbGFzczsKK2V4dGVybiBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpkcm1fc3lzZnNfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQkJCQkJY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGVzdHJveShzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcyk7CitleHRlcm4gc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9zeXNmc19jbGFzcyAqY3MsCisJCQkJCQkgZGV2X3QgZGV2LAorCQkJCQkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQkJCSBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShkZXZfdCBkZXYpOworCisKKy8qIElubGluZSByZXBsYWNlbWVudHMgZm9yIERSTV9JT1JFTUFQIG1hY3JvcyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fY29yZV9pb3JlbWFwKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbWFwLT5oYW5kbGUgPSBkcm1faW9yZW1hcCggbWFwLT5vZmZzZXQsIG1hcC0+c2l6ZSwgZGV2ICk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZHJtX2NvcmVfaW9yZW1hcF9ub2NhY2hlKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbWFwLT5oYW5kbGUgPSBkcm1faW9yZW1hcF9ub2NhY2hlKG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsIGRldik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZHJtX2NvcmVfaW9yZW1hcGZyZWUoc3RydWN0IGRybV9tYXAgKm1hcCwgc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpZiAoIG1hcC0+aGFuZGxlICYmIG1hcC0+c2l6ZSApCisJCWRybV9pb3JlbWFwZnJlZSggbWFwLT5oYW5kbGUsIG1hcC0+c2l6ZSwgZGV2ICk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBkcm1fbWFwICpkcm1fY29yZV9maW5kbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9saXN0OworCWxpc3RfZm9yX2VhY2goIF9saXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkICkgeworCQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5ID0gbGlzdF9lbnRyeSggX2xpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkICk7CisJCWlmICggX2VudHJ5LT5tYXAgJiYKKwkJICAgICBfZW50cnktPm1hcC0+b2Zmc2V0ID09IG9mZnNldCApIHsKKwkJCXJldHVybiBfZW50cnktPm1hcDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fY29yZV9kcm9wbWFwKHN0cnVjdCBkcm1fbWFwICptYXApCit7Cit9CisKKyNpZm5kZWYgREVCVUdfTUVNT1JZCisvKiogV3JhcHBlciBhcm91bmQga21hbGxvYygpICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICpkcm1fYWxsb2Moc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworfQorCisvKiogV3JhcHBlciBhcm91bmQga2ZyZWUoKSAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fZnJlZSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCWtmcmVlKHB0KTsKK30KKyNlbHNlCitleHRlcm4gdm9pZCAqZHJtX2FsbG9jKHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CitleHRlcm4gdm9pZCBkcm1fZnJlZSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKTsKKyNlbmRpZgorCisvKkB9Ki8KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICptYXApOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X3JlZ19vZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk0YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKioKKyAqIFxmaWxlIGRybV9hZ3BzdXBwb3J0LmggCisgKiBEUk0gc3VwcG9ydCBmb3IgQUdQL0dBUlQgYmFja2VuZAorICogICAgCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2lmIF9fT1NfSEFTX0FHUAorCisvKioKKyAqIEFHUCBpbmZvcm1hdGlvbiBpb2N0bC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgKG91dHB1dCkgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGFjcXVpcmVkIGFuZCBmaWxscyBpbiB0aGUKKyAqIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mb3JtYXRpb24gaW4gZHJtX2FncF9oZWFkOjphZ3BfaW5mby4KKyAqLworaW50IGRybV9hZ3BfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAqZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlEUk1fQUdQX0tFUk4gICAgICprZXJuOworCWRybV9hZ3BfaW5mb190ICAgaW5mbzsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZXJuICAgICAgICAgICAgICAgICAgID0gJmRldi0+YWdwLT5hZ3BfaW5mbzsKKwlpbmZvLmFncF92ZXJzaW9uX21ham9yID0ga2Vybi0+dmVyc2lvbi5tYWpvcjsKKwlpbmZvLmFncF92ZXJzaW9uX21pbm9yID0ga2Vybi0+dmVyc2lvbi5taW5vcjsKKwlpbmZvLm1vZGUgICAgICAgICAgICAgID0ga2Vybi0+bW9kZTsKKwlpbmZvLmFwZXJ0dXJlX2Jhc2UgICAgID0ga2Vybi0+YXBlcl9iYXNlOworCWluZm8uYXBlcnR1cmVfc2l6ZSAgICAgPSBrZXJuLT5hcGVyX3NpemUgKiAxMDI0ICogMTAyNDsKKwlpbmZvLm1lbW9yeV9hbGxvd2VkICAgID0ga2Vybi0+bWF4X21lbW9yeSA8PCBQQUdFX1NISUZUOworCWluZm8ubWVtb3J5X3VzZWQgICAgICAgPSBrZXJuLT5jdXJyZW50X21lbW9yeSA8PCBQQUdFX1NISUZUOworCWluZm8uaWRfdmVuZG9yICAgICAgICAgPSBrZXJuLT5kZXZpY2UtPnZlbmRvcjsKKwlpbmZvLmlkX2RldmljZSAgICAgICAgID0ga2Vybi0+ZGV2aWNlLT5kZXZpY2U7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fYWdwX2luZm9fdCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBY3F1aXJlIHRoZSBBR1AgZGV2aWNlIChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuIAorICoKKyAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhc24ndCBiZWVuIGFjcXVpcmVkIGJlZm9yZSBhbmQgY2FsbHMKKyAqIGFncF9hY3F1aXJlKCkuCisgKi8KK2ludCBkcm1fYWdwX2FjcXVpcmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisKKwlpZiAoIWRldi0+YWdwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQlyZXR1cm4gLUVCVVNZOworCWlmICghKGRldi0+YWdwLT5icmlkZ2UgPSBhZ3BfYmFja2VuZF9hY3F1aXJlKGRldi0+cGRldikpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYtPmFncC0+YWNxdWlyZWQgPSAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIEFHUCBkZXZpY2UgKGlvY3RsKS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBhbmQgY2FsbHMgYWdwX2JhY2tlbmRfcmVsZWFzZSgpLgorICovCitpbnQgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCisJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhZ3BfYmFja2VuZF9yZWxlYXNlKGRldi0+YWdwLT5icmlkZ2UpOworCWRldi0+YWdwLT5hY3F1aXJlZCA9IDA7CisJcmV0dXJuIDA7CisKK30KKworLyoqCisgKiBSZWxlYXNlIHRoZSBBR1AgZGV2aWNlLgorICoKKyAqIENhbGxzIGFncF9iYWNrZW5kX3JlbGVhc2UoKS4KKyAqLwordm9pZCBkcm1fYWdwX2RvX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYpCit7CisgIGFncF9iYWNrZW5kX3JlbGVhc2UoZGV2LT5hZ3AtPmJyaWRnZSk7Cit9CisKKy8qKgorICogRW5hYmxlIHRoZSBBR1AgYnVzLgorICogCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2FncF9tb2RlIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgYnV0IG5vdCBlbmFibGVkLCBhbmQgY2FsbHMKKyAqIGFncF9lbmFibGUoKS4KKyAqLworaW50IGRybV9hZ3BfZW5hYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9tb2RlX3QgICBtb2RlOworCisJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgKGRybV9hZ3BfbW9kZV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKG1vZGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXYtPmFncC0+bW9kZSAgICA9IG1vZGUubW9kZTsKKwlhZ3BfZW5hYmxlKGRldi0+YWdwLT5icmlkZ2UsIG1vZGUubW9kZSk7CisJZGV2LT5hZ3AtPmJhc2UgICAgPSBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9iYXNlOworCWRldi0+YWdwLT5lbmFibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBBR1AgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYWdwX2J1ZmZlciBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICogCisgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBpcyBwcmVzZW50IGFuZCBoYXMgYmVlbiBhY3F1aXJlZCwgYWxsb2NhdGVzIHRoZQorICogbWVtb3J5IHZpYSBhbGxvY19hZ3AoKSBhbmQgY3JlYXRlcyBhIGRybV9hZ3BfbWVtIGVudHJ5IGZvciBpdC4KKyAqLworaW50IGRybV9hZ3BfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKwlkcm1fYWdwX21lbV90ICAgICplbnRyeTsKKwlEUk1fQUdQX01FTSAgICAgICptZW1vcnk7CisJdW5zaWduZWQgbG9uZyAgICBwYWdlczsKKwl1MzIgCQkgdHlwZTsKKwlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIShlbnRyeSA9IGRybV9hbGxvYyhzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUykpKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCisJcGFnZXMgPSAocmVxdWVzdC5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJdHlwZSA9ICh1MzIpIHJlcXVlc3QudHlwZTsKKworCWlmICghKG1lbW9yeSA9IGRybV9hbGxvY19hZ3AoZGV2LT5hZ3AtPmJyaWRnZSwgcGFnZXMsIHR5cGUpKSkgeworCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllbnRyeS0+aGFuZGxlICAgID0gKHVuc2lnbmVkIGxvbmcpbWVtb3J5LT5rZXkgKyAxOworCWVudHJ5LT5tZW1vcnkgICAgPSBtZW1vcnk7CisJZW50cnktPmJvdW5kICAgICA9IDA7CisJZW50cnktPnBhZ2VzICAgICA9IHBhZ2VzOworCWVudHJ5LT5wcmV2ICAgICAgPSBOVUxMOworCWVudHJ5LT5uZXh0ICAgICAgPSBkZXYtPmFncC0+bWVtb3J5OworCWlmIChkZXYtPmFncC0+bWVtb3J5KQorCQlkZXYtPmFncC0+bWVtb3J5LT5wcmV2ID0gZW50cnk7CisJZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5OworCisJcmVxdWVzdC5oYW5kbGUgICA9IGVudHJ5LT5oYW5kbGU7CisJcmVxdWVzdC5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKSB7CisJCWRldi0+YWdwLT5tZW1vcnkgICAgICAgPSBlbnRyeS0+bmV4dDsKKwkJZGV2LT5hZ3AtPm1lbW9yeS0+cHJldiA9IE5VTEw7CisJCWRybV9mcmVlX2FncChtZW1vcnksIHBhZ2VzKTsKKwkJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIFNlYXJjaCBmb3IgdGhlIEFHUCBtZW1vcnkgZW50cnkgYXNzb2NpYXRlZCB3aXRoIGEgaGFuZGxlLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gaGFuZGxlIEFHUCBtZW1vcnkgaGFuZGxlLgorICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBkcm1fYWdwX21lbSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIFxwIGhhbmRsZS4KKyAqIAorICogV2Fsa3MgdGhyb3VnaCBkcm1fYWdwX2hlYWQ6Om1lbW9yeSB1bnRpbCBmaW5kaW5nIGEgbWF0Y2hpbmcgaGFuZGxlLgorICovCitzdGF0aWMgZHJtX2FncF9tZW1fdCAqZHJtX2FncF9sb29rdXBfZW50cnkoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwlkcm1fYWdwX21lbV90ICplbnRyeTsKKworCWZvciAoZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQlpZiAoZW50cnktPmhhbmRsZSA9PSBoYW5kbGUpCisJCQlyZXR1cm4gZW50cnk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFVuYmluZCBBR1AgbWVtb3J5IGZyb20gdGhlIEdBVFQgKGlvY3RsKS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2FncF9iaW5kaW5nIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgYWNxdWlyZWQsIGxvb2tzLXVwIHRoZSBBR1AgbWVtb3J5CisgKiBlbnRyeSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB1bmJpbmRfYWdwKCkgZnVuY3Rpb24uCisgKi8KK2ludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKKwlkcm1fYWdwX21lbV90ICAgICAqZW50cnk7CisJaW50IHJldDsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIShlbnRyeSA9IGRybV9hZ3BfbG9va3VwX2VudHJ5KGRldiwgcmVxdWVzdC5oYW5kbGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFlbnRyeS0+Ym91bmQpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGRybV91bmJpbmRfYWdwKGVudHJ5LT5tZW1vcnkpOworCWlmIChyZXQgPT0gMCkKKwkgICAgZW50cnktPmJvdW5kID0gMDsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIEJpbmQgQUdQIG1lbW9yeSBpbnRvIHRoZSBHQVRUIChpb2N0bCkKKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2FncF9iaW5kaW5nIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIHRoYXQgbm8gbWVtb3J5CisgKiBpcyBjdXJyZW50bHkgYm91bmQgaW50byB0aGUgR0FUVC4gTG9va3MtdXAgdGhlIEFHUCBtZW1vcnkgZW50cnkgYW5kIHBhc3NlcworICogaXQgdG8gYmluZF9hZ3AoKSBmdW5jdGlvbi4KKyAqLworaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYmluZGluZ190IHJlcXVlc3Q7CisJZHJtX2FncF9tZW1fdCAgICAgKmVudHJ5OworCWludCAgICAgICAgICAgICAgIHJldGNvZGU7CisJaW50ICAgICAgICAgICAgICAgcGFnZTsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIShlbnRyeSA9IGRybV9hZ3BfbG9va3VwX2VudHJ5KGRldiwgcmVxdWVzdC5oYW5kbGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVudHJ5LT5ib3VuZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFnZSA9IChyZXF1ZXN0Lm9mZnNldCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCWlmICgocmV0Y29kZSA9IGRybV9iaW5kX2FncChlbnRyeS0+bWVtb3J5LCBwYWdlKSkpCisJCXJldHVybiByZXRjb2RlOworCWVudHJ5LT5ib3VuZCA9IGRldi0+YWdwLT5iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7CisJRFJNX0RFQlVHKCJiYXNlID0gMHglbHggZW50cnktPmJvdW5kID0gMHglbHhcbiIsCisJCSAgZGV2LT5hZ3AtPmJhc2UsIGVudHJ5LT5ib3VuZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRnJlZSBBR1AgbWVtb3J5IChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9hZ3BfYnVmZmVyIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIGxvb2tzIHVwIHRoZQorICogQUdQIG1lbW9yeSBlbnRyeS4gSWYgdGhlIG1lbW9yeSBpdCdzIGN1cnJlbnRseSBib3VuZCwgdW5iaW5kIGl0IHZpYQorICogdW5iaW5kX2FncCgpLiBGcmVlcyBpdCB2aWEgZnJlZV9hZ3AoKSBhcyB3ZWxsIGFzIHRoZSBlbnRyeSBpdHNlbGYKKyAqIGFuZCB1bmxpbmtzIGZyb20gdGhlIGRvdWJseSBsaW5rZWQgbGlzdCBpdCdzIGluc2VydGVkIGluLgorICovCitpbnQgZHJtX2FncF9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKwlkcm1fYWdwX21lbV90ICAgICplbnRyeTsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKilhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LmhhbmRsZSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZW50cnktPmJvdW5kKQorCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKKworCWlmIChlbnRyeS0+cHJldikKKwkJZW50cnktPnByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKKwllbHNlCisJCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeS0+bmV4dDsKKworCWlmIChlbnRyeS0+bmV4dCkKKwkJZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKKworCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOworCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgQUdQIHJlc291cmNlcy4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gYSBkcm1fYWdwX2hlYWQgc3RydWN0dXJlLgorICoKKyAqLworZHJtX2FncF9oZWFkX3QgKmRybV9hZ3BfaW5pdChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fYWdwX2hlYWRfdCAqaGVhZCAgICAgICAgID0gTlVMTDsKKworCWlmICghKGhlYWQgPSBkcm1fYWxsb2Moc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUykpKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoKHZvaWQgKiloZWFkLCAwLCBzaXplb2YoKmhlYWQpKTsKKwloZWFkLT5icmlkZ2UgPSBhZ3BfZmluZF9icmlkZ2UoZGV2LT5wZGV2KTsKKwlpZiAoIWhlYWQtPmJyaWRnZSkgeworCQlpZiAoIShoZWFkLT5icmlkZ2UgPSBhZ3BfYmFja2VuZF9hY3F1aXJlKGRldi0+cGRldikpKSB7CisJCQlkcm1fZnJlZShoZWFkLCBzaXplb2YoKmhlYWQpLCBEUk1fTUVNX0FHUExJU1RTKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFncF9jb3B5X2luZm8oaGVhZC0+YnJpZGdlLCAmaGVhZC0+YWdwX2luZm8pOworCQlhZ3BfYmFja2VuZF9yZWxlYXNlKGhlYWQtPmJyaWRnZSk7CisJfSBlbHNlIHsKKwkJYWdwX2NvcHlfaW5mbyhoZWFkLT5icmlkZ2UsICZoZWFkLT5hZ3BfaW5mbyk7CisJfQorCWlmIChoZWFkLT5hZ3BfaW5mby5jaGlwc2V0ID09IE5PVF9TVVBQT1JURUQpIHsKKwkJZHJtX2ZyZWUoaGVhZCwgc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUyk7CisJCXJldHVybiBOVUxMOworCX0KKwloZWFkLT5tZW1vcnkgPSBOVUxMOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwOAorCWhlYWQtPmNhbnRfdXNlX2FwZXJ0dXJlID0gMDsKKwloZWFkLT5wYWdlX21hc2sgPSB+KDB4ZmZmKTsKKyNlbHNlCisJaGVhZC0+Y2FudF91c2VfYXBlcnR1cmUgPSBoZWFkLT5hZ3BfaW5mby5jYW50X3VzZV9hcGVydHVyZTsKKwloZWFkLT5wYWdlX21hc2sgPSBoZWFkLT5hZ3BfaW5mby5wYWdlX21hc2s7CisjZW5kaWYKKworCXJldHVybiBoZWFkOworfQorCisvKiogQ2FsbHMgYWdwX2FsbG9jYXRlX21lbW9yeSgpICovCitEUk1fQUdQX01FTSAqZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCBzaXplX3QgcGFnZXMsIHUzMiB0eXBlKQoreworCXJldHVybiBhZ3BfYWxsb2NhdGVfbWVtb3J5KGJyaWRnZSwgcGFnZXMsIHR5cGUpOworfQorCisvKiogQ2FsbHMgYWdwX2ZyZWVfbWVtb3J5KCkgKi8KK2ludCBkcm1fYWdwX2ZyZWVfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUpCit7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAwOworCWFncF9mcmVlX21lbW9yeShoYW5kbGUpOworCXJldHVybiAxOworfQorCisvKiogQ2FsbHMgYWdwX2JpbmRfbWVtb3J5KCkgKi8KK2ludCBkcm1fYWdwX2JpbmRfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUsIG9mZl90IHN0YXJ0KQoreworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYWdwX2JpbmRfbWVtb3J5KGhhbmRsZSwgc3RhcnQpOworfQorCisvKiogQ2FsbHMgYWdwX3VuYmluZF9tZW1vcnkoKSAqLworaW50IGRybV9hZ3BfdW5iaW5kX21lbW9yeShEUk1fQUdQX01FTSAqaGFuZGxlKQoreworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYWdwX3VuYmluZF9tZW1vcnkoaGFuZGxlKTsKK30KKworI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Mjg3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qKgorICogXGZpbGUgZHJtX2F1dGguaCAKKyAqIElPQ1RMcyBmb3IgYXV0aGVudGljYXRpb24KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFR1ZSBGZWIgIDIgMDg6Mzc6NTQgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworLyoqCisgKiBHZW5lcmF0ZSBhIGhhc2gga2V5IGZyb20gYSBtYWdpYy4KKyAqCisgKiBccGFyYW0gbWFnaWMgbWFnaWMuCisgKiBccmV0dXJuIGhhc2gga2V5LgorICoKKyAqIFRoZSBrZXkgaXMgdGhlIG1vZHVsdXMgb2YgdGhlIGhhc2ggdGFibGUgc2l6ZSwgI0RSTV9IQVNIX1NJWkUsIHdoaWNoIG11c3QgYmUKKyAqIGEgcG93ZXIgb2YgMi4KKyAqLworc3RhdGljIGludCBkcm1faGFzaF9tYWdpYyhkcm1fbWFnaWNfdCBtYWdpYykKK3sKKwlyZXR1cm4gbWFnaWMgJiAoRFJNX0hBU0hfU0laRS0xKTsKK30KKworLyoqCisgKiBGaW5kIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIG1hZ2ljIG51bWJlci4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gbWFnaWMgbWFnaWMgbnVtYmVyLgorICoKKyAqIFNlYXJjaGVzIGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCB3aXRoaW4gYWxsIGZpbGVzIHdpdGggdGhlIHNhbWUgaGFzaCBrZXkKKyAqIHRoZSBvbmUgd2l0aCBtYXRjaGluZyBtYWdpYyBudW1iZXIsIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0KKyAqIGxvY2suCisgKi8KK3N0YXRpYyBkcm1fZmlsZV90ICpkcm1fZmluZF9maWxlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKK3sKKwlkcm1fZmlsZV90CSAgKnJldHZhbCA9IE5VTEw7CisJZHJtX21hZ2ljX2VudHJ5X3QgKnB0OworCWludAkJICBoYXNoCSAgPSBkcm1faGFzaF9tYWdpYyhtYWdpYyk7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWZvciAocHQgPSBkZXYtPm1hZ2ljbGlzdFtoYXNoXS5oZWFkOyBwdDsgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAocHQtPm1hZ2ljID09IG1hZ2ljKSB7CisJCQlyZXR2YWwgPSBwdC0+cHJpdjsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQWRkcyBhIG1hZ2ljIG51bWJlci4KKyAqIAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIHByaXYgZmlsZSBwcml2YXRlIGRhdGEuCisgKiBccGFyYW0gbWFnaWMgbWFnaWMgbnVtYmVyLgorICoKKyAqIENyZWF0ZXMgYSBkcm1fbWFnaWNfZW50cnkgc3RydWN0dXJlIGFuZCBhcHBlbmRzIHRvIHRoZSBsaW5rZWQgbGlzdAorICogYXNzb2NpYXRlZCB0aGUgbWFnaWMgbnVtYmVyIGhhc2gga2V5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCwgd2hpbGUgaG9sZGluZworICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsIGRybV9tYWdpY190IG1hZ2ljKQoreworCWludAkJICBoYXNoOworCWRybV9tYWdpY19lbnRyeV90ICplbnRyeTsKKworCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKKworCWhhc2gJICAgICA9IGRybV9oYXNoX21hZ2ljKG1hZ2ljKTsKKwllbnRyeQkgICAgID0gZHJtX2FsbG9jKHNpemVvZigqZW50cnkpLCBEUk1fTUVNX01BR0lDKTsKKwlpZiAoIWVudHJ5KSByZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKwllbnRyeS0+bWFnaWMgPSBtYWdpYzsKKwllbnRyeS0+cHJpdiAgPSBwcml2OworCWVudHJ5LT5uZXh0ICA9IE5VTEw7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmIChkZXYtPm1hZ2ljbGlzdFtoYXNoXS50YWlsKSB7CisJCWRldi0+bWFnaWNsaXN0W2hhc2hdLnRhaWwtPm5leHQgPSBlbnRyeTsKKwkJZGV2LT5tYWdpY2xpc3RbaGFzaF0udGFpbAk9IGVudHJ5OworCX0gZWxzZSB7CisJCWRldi0+bWFnaWNsaXN0W2hhc2hdLmhlYWQJPSBlbnRyeTsKKwkJZGV2LT5tYWdpY2xpc3RbaGFzaF0udGFpbAk9IGVudHJ5OworCX0KKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbW92ZSBhIG1hZ2ljIG51bWJlci4KKyAqIAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIG1hZ2ljIG1hZ2ljIG51bWJlci4KKyAqCisgKiBTZWFyY2hlcyBhbmQgdW5saW5rcyB0aGUgZW50cnkgaW4gZHJtX2RldmljZTo6bWFnaWNsaXN0IHdpdGggdGhlIG1hZ2ljCisgKiBudW1iZXIgaGFzaCBrZXksIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9yZW1vdmVfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9tYWdpY190IG1hZ2ljKQoreworCWRybV9tYWdpY19lbnRyeV90ICpwcmV2ID0gTlVMTDsKKwlkcm1fbWFnaWNfZW50cnlfdCAqcHQ7CisJaW50CQkgIGhhc2g7CisKKworCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKKwloYXNoID0gZHJtX2hhc2hfbWFnaWMobWFnaWMpOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlmb3IgKHB0ID0gZGV2LT5tYWdpY2xpc3RbaGFzaF0uaGVhZDsgcHQ7IHByZXYgPSBwdCwgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAocHQtPm1hZ2ljID09IG1hZ2ljKSB7CisJCQlpZiAoZGV2LT5tYWdpY2xpc3RbaGFzaF0uaGVhZCA9PSBwdCkgeworCQkJCWRldi0+bWFnaWNsaXN0W2hhc2hdLmhlYWQgPSBwdC0+bmV4dDsKKwkJCX0KKwkJCWlmIChkZXYtPm1hZ2ljbGlzdFtoYXNoXS50YWlsID09IHB0KSB7CisJCQkJZGV2LT5tYWdpY2xpc3RbaGFzaF0udGFpbCA9IHByZXY7CisJCQl9CisJCQlpZiAocHJldikgeworCQkJCXByZXYtPm5leHQgPSBwdC0+bmV4dDsKKwkJCX0KKwkJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlkcm1fZnJlZShwdCwgc2l6ZW9mKCpwdCksIERSTV9NRU1fTUFHSUMpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogR2V0IGEgdW5pcXVlIG1hZ2ljIG51bWJlciAoaW9jdGwpLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSByZXN1bHRpbmcgZHJtX2F1dGggc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlcmUgaXMgYSBtYWdpYyBudW1iZXIgaW4gZHJtX2ZpbGU6Om1hZ2ljIHRoZW4gdXNlIGl0LCBvdGhlcndpc2UKKyAqIHNlYXJjaGVzIGFuIHVuaXF1ZSBub24temVybyBtYWdpYyBudW1iZXIgYW5kIGFkZCBpdCBhc3NvY2lhdGluZyBpdCB3aXRoIFxwCisgKiBmaWxwLgorICovCitpbnQgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBkcm1fbWFnaWNfdCBzZXF1ZW5jZSA9IDA7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKwlkcm1fZmlsZV90CSAgICpwcml2ICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fYXV0aF90CSAgIGF1dGg7CisKKwkJCQkvKiBGaW5kIHVuaXF1ZSBtYWdpYyAqLworCWlmIChwcml2LT5tYWdpYykgeworCQlhdXRoLm1hZ2ljID0gcHJpdi0+bWFnaWM7CisJfSBlbHNlIHsKKwkJZG8geworCQkJc3Bpbl9sb2NrKCZsb2NrKTsKKwkJCWlmICghc2VxdWVuY2UpICsrc2VxdWVuY2U7IC8qIHJlc2VydmUgMCAqLworCQkJYXV0aC5tYWdpYyA9IHNlcXVlbmNlKys7CisJCQlzcGluX3VubG9jaygmbG9jayk7CisJCX0gd2hpbGUgKGRybV9maW5kX2ZpbGUoZGV2LCBhdXRoLm1hZ2ljKSk7CisJCXByaXYtPm1hZ2ljID0gYXV0aC5tYWdpYzsKKwkJZHJtX2FkZF9tYWdpYyhkZXYsIHByaXYsIGF1dGgubWFnaWMpOworCX0KKworCURSTV9ERUJVRygiJXVcbiIsIGF1dGgubWFnaWMpOworCWlmIChjb3B5X3RvX3VzZXIoKGRybV9hdXRoX3QgX191c2VyICopYXJnLCAmYXV0aCwgc2l6ZW9mKGF1dGgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQXV0aGVudGljYXRlIHdpdGggYSBtYWdpYy4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2F1dGggc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIGlmIGF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NlZCwgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICoKKyAqIENoZWNrcyBpZiBccCBmaWxwIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFnaWMgbnVtYmVyIHBhc3NlZCBpbiBcYXJnLgorICovCitpbnQgZHJtX2F1dGhtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgICAqcHJpdiAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2F1dGhfdAkgICBhdXRoOworCWRybV9maWxlX3QJICAgKmZpbGU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmF1dGgsIChkcm1fYXV0aF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGF1dGgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC5tYWdpYyk7CisJaWYgKChmaWxlID0gZHJtX2ZpbmRfZmlsZShkZXYsIGF1dGgubWFnaWMpKSkgeworCQlmaWxlLT5hdXRoZW50aWNhdGVkID0gMTsKKwkJZHJtX3JlbW92ZV9tYWdpYyhkZXYsIGF1dGgubWFnaWMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExM2JjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMCwwICsxLDEyNzAgQEAKKy8qKgorICogXGZpbGUgZHJtX2J1ZnMuaCAKKyAqIEdlbmVyaWMgYnVmZmVyIHRlbXBsYXRlCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogVGh1IE5vdiAyMyAwMzoxMDo1MCAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKgorICogQ29tcHV0ZSBzaXplIG9yZGVyLiAgUmV0dXJucyB0aGUgZXhwb25lbnQgb2YgdGhlIHNtYWxsZXIgcG93ZXIgb2YgdHdvIHdoaWNoCisgKiBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIGdpdmVuIG51bWJlci4KKyAqIAorICogXHBhcmFtIHNpemUgc2l6ZS4KKyAqIFxyZXR1cm4gb3JkZXIuCisgKgorICogXHRvZG8gQ2FuIGJlIG1hZGUgZmFzdGVyLgorICovCitpbnQgZHJtX29yZGVyKCB1bnNpZ25lZCBsb25nIHNpemUgKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWZvciAob3JkZXIgPSAwLCB0bXAgPSBzaXplID4+IDE7IHRtcDsgdG1wID4+PSAxLCBvcmRlcisrKQorCQk7CisKKwlpZiAoc2l6ZSAmIChzaXplIC0gMSkpCisJCSsrb3JkZXI7CisKKwlyZXR1cm4gb3JkZXI7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9vcmRlcik7CisKKy8qKgorICogSW9jdGwgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIG1lbW9yeSB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgbWFwcGluZyBieSBhIG5vbi1yb290IHByb2Nlc3MuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9tYXAgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqCisgKiBBZGp1c3RzIHRoZSBtZW1vcnkgb2Zmc2V0IHRvIGl0cyBhYnNvbHV0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcKKyAqIHR5cGUuICBBZGRzIHRoZSBtYXAgdG8gdGhlIG1hcCBsaXN0IGRybV9kZXZpY2U6Om1hcGxpc3QuIEFkZHMgTVRSUidzIHdoZXJlCisgKiBhcHBsaWNhYmxlIGFuZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KKyAqLworaW50IGRybV9hZGRtYXAoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX21hcF90ICptYXA7CisJZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKKworCWlmICggIShmaWxwLT5mX21vZGUgJiAzKSApIHJldHVybiAtRUFDQ0VTOyAvKiBSZXF1aXJlIHJlYWQvd3JpdGUgKi8KKworCW1hcCA9IGRybV9hbGxvYyggc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwlpZiAoICFtYXAgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICggY29weV9mcm9tX3VzZXIoIG1hcCwgYXJncCwgc2l6ZW9mKCptYXApICkgKSB7CisJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIE9ubHkgYWxsb3cgc2hhcmVkIG1lbW9yeSB0byBiZSByZW1vdmFibGUgc2luY2Ugd2Ugb25seSBrZWVwIGVub3VnaAorCSAqIGJvb2sga2VlcGluZyBpbmZvcm1hdGlvbiBhYm91dCBzaGFyZWQgbWVtb3J5IHRvIGFsbG93IGZvciByZW1vdmFsCisJICogd2hlbiBwcm9jZXNzZXMgZm9yay4KKwkgKi8KKwlpZiAoIChtYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpICYmIG1hcC0+dHlwZSAhPSBfRFJNX1NITSApIHsKKwkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCURSTV9ERUJVRyggIm9mZnNldCA9IDB4JTA4bHgsIHNpemUgPSAweCUwOGx4LCB0eXBlID0gJWRcbiIsCisJCSAgIG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsIG1hcC0+dHlwZSApOworCWlmICggKG1hcC0+b2Zmc2V0ICYgKH5QQUdFX01BU0spKSB8fCAobWFwLT5zaXplICYgKH5QQUdFX01BU0spKSApIHsKKwkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1hcC0+bXRyciAgID0gLTE7CisJbWFwLT5oYW5kbGUgPSBOVUxMOworCisJc3dpdGNoICggbWFwLT50eXBlICkgeworCWNhc2UgX0RSTV9SRUdJU1RFUlM6CisJY2FzZSBfRFJNX0ZSQU1FX0JVRkZFUjoKKyNpZiAhZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19pYTY0X18pCisJCWlmICggbWFwLT5vZmZzZXQgKyBtYXAtPnNpemUgPCBtYXAtPm9mZnNldCB8fAorCQkgICAgIG1hcC0+b2Zmc2V0IDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSApIHsKKwkJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2VuZGlmCisjaWZkZWYgX19hbHBoYV9fCisJCW1hcC0+b2Zmc2V0ICs9IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKKyNlbmRpZgorCQlpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgeworCQkJaWYgKCBtYXAtPnR5cGUgPT0gX0RSTV9GUkFNRV9CVUZGRVIgfHwKKwkJCSAgICAgKG1hcC0+ZmxhZ3MgJiBfRFJNX1dSSVRFX0NPTUJJTklORykgKSB7CisJCQkJbWFwLT5tdHJyID0gbXRycl9hZGQoIG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsCisJCQkJCQkgICAgICBNVFJSX1RZUEVfV1JDT01CLCAxICk7CisJCQl9CisJCX0KKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCW1hcC0+aGFuZGxlID0gZHJtX2lvcmVtYXAoIG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsCisJCQkJCQkgICAgZGV2ICk7CisJCWJyZWFrOworCisJY2FzZSBfRFJNX1NITToKKwkJbWFwLT5oYW5kbGUgPSB2bWFsbG9jXzMyKG1hcC0+c2l6ZSk7CisJCURSTV9ERUJVRyggIiVsdSAlZCAlcFxuIiwKKwkJCSAgIG1hcC0+c2l6ZSwgZHJtX29yZGVyKCBtYXAtPnNpemUgKSwgbWFwLT5oYW5kbGUgKTsKKwkJaWYgKCAhbWFwLT5oYW5kbGUgKSB7CisJCQlkcm1fZnJlZSggbWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWFwLT5vZmZzZXQgPSAodW5zaWduZWQgbG9uZyltYXAtPmhhbmRsZTsKKwkJaWYgKCBtYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgeworCQkJLyogUHJldmVudCBhIDJuZCBYIFNlcnZlciBmcm9tIGNyZWF0aW5nIGEgMm5kIGxvY2sgKi8KKwkJCWlmIChkZXYtPmxvY2suaHdfbG9jayAhPSBOVUxMKSB7CisJCQkJdmZyZWUoIG1hcC0+aGFuZGxlICk7CisJCQkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJZGV2LT5zaWdkYXRhLmxvY2sgPQorCQkJZGV2LT5sb2NrLmh3X2xvY2sgPSBtYXAtPmhhbmRsZTsgLyogUG9pbnRlciB0byBsb2NrICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSBfRFJNX0FHUDoKKwkJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSkgeworI2lmZGVmIF9fYWxwaGFfXworCQkJbWFwLT5vZmZzZXQgKz0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OworI2VuZGlmCisJCQltYXAtPm9mZnNldCArPSBkZXYtPmFncC0+YmFzZTsKKwkJCW1hcC0+bXRyciAgID0gZGV2LT5hZ3AtPmFncF9tdHJyOyAvKiBmb3IgZ2V0bWFwICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQlpZiAoIWRldi0+c2cpIHsKKwkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWFwLT5vZmZzZXQgKz0gZGV2LT5zZy0+aGFuZGxlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKKwlpZighbGlzdCkgeworCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbXNldChsaXN0LCAwLCBzaXplb2YoKmxpc3QpKTsKKwlsaXN0LT5tYXAgPSBtYXA7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWxpc3RfYWRkKCZsaXN0LT5oZWFkLCAmZGV2LT5tYXBsaXN0LT5oZWFkKTsKKyAJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgbWFwLCBzaXplb2YoKm1hcCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCWlmICggbWFwLT50eXBlICE9IF9EUk1fU0hNICkgeworCQlpZiAoIGNvcHlfdG9fdXNlciggJmFyZ3AtPmhhbmRsZSwKKwkJCQkgICAmbWFwLT5vZmZzZXQsCisJCQkJICAgc2l6ZW9mKG1hcC0+b2Zmc2V0KSApICkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIFJlbW92ZSBhIG1hcCBwcml2YXRlIGZyb20gbGlzdCBhbmQgZGVhbGxvY2F0ZSByZXNvdXJjZXMgaWYgdGhlIG1hcHBpbmcKKyAqIGlzbid0IGluIHVzZS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX21hcF90IHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKgorICogU2VhcmNoZXMgdGhlIG1hcCBvbiBkcm1fZGV2aWNlOjptYXBsaXN0LCByZW1vdmVzIGl0IGZyb20gdGhlIGxpc3QsIHNlZSBpZgorICogaXRzIGJlaW5nIHVzZWQsIGFuZCBmcmVlIGFueSBhc3NvY2lhdGUgcmVzb3VyY2UgKHN1Y2ggYXMgTVRSUidzKSBpZiBpdCdzIG5vdAorICogYmVpbmcgb24gdXNlLgorICoKKyAqIFxzYSBhZGRtYXAoKS4KKyAqLworaW50IGRybV9ybW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCWRybV92bWFfZW50cnlfdCAqcHQsICpwcmV2OworCWRybV9tYXBfdCAqbWFwOworCWRybV9tYXBfdCByZXF1ZXN0OworCWludCBmb3VuZF9tYXBzID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKGRybV9tYXBfdCBfX3VzZXIgKilhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJbGlzdCA9ICZkZXYtPm1hcGxpc3QtPmhlYWQ7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCisJCWlmKHJfbGlzdC0+bWFwICYmCisJCSAgIHJfbGlzdC0+bWFwLT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUgJiYKKwkJICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpIGJyZWFrOworCX0KKworCS8qIExpc3QgaGFzIHdyYXBwZWQgYXJvdW5kIHRvIHRoZSBoZWFkIHBvaW50ZXIsIG9yIGl0cyBlbXB0eSB3ZSBkaWRuJ3QKKwkgKiBmaW5kIGFueXRoaW5nLgorCSAqLworCWlmKGxpc3QgPT0gKCZkZXYtPm1hcGxpc3QtPmhlYWQpKSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWFwID0gcl9saXN0LT5tYXA7CisJbGlzdF9kZWwobGlzdCk7CisJZHJtX2ZyZWUobGlzdCwgc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKKworCWZvciAocHQgPSBkZXYtPnZtYWxpc3QsIHByZXYgPSBOVUxMOyBwdDsgcHJldiA9IHB0LCBwdCA9IHB0LT5uZXh0KSB7CisJCWlmIChwdC0+dm1hLT52bV9wcml2YXRlX2RhdGEgPT0gbWFwKSBmb3VuZF9tYXBzKys7CisJfQorCisJaWYoIWZvdW5kX21hcHMpIHsKKwkJc3dpdGNoIChtYXAtPnR5cGUpIHsKKwkJY2FzZSBfRFJNX1JFR0lTVEVSUzoKKwkJY2FzZSBfRFJNX0ZSQU1FX0JVRkZFUjoKKwkJICBpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgeworCQkJCWlmIChtYXAtPm10cnIgPj0gMCkgeworCQkJCQlpbnQgcmV0Y29kZTsKKwkJCQkJcmV0Y29kZSA9IG10cnJfZGVsKG1hcC0+bXRyciwKKwkJCQkJCQkgICBtYXAtPm9mZnNldCwKKwkJCQkJCQkgICBtYXAtPnNpemUpOworCQkJCQlEUk1fREVCVUcoIm10cnJfZGVsID0gJWRcbiIsIHJldGNvZGUpOworCQkJCX0KKwkJCX0KKwkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgX0RSTV9TSE06CisJCQl2ZnJlZShtYXAtPmhhbmRsZSk7CisJCQlicmVhazsKKwkJY2FzZSBfRFJNX0FHUDoKKwkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQkJYnJlYWs7CisJCX0KKwkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiAwOworfQorCisvKioKKyAqIENsZWFudXAgYWZ0ZXIgYW4gZXJyb3Igb24gb25lIG9mIHRoZSBhZGRidWZzKCkgZnVuY3Rpb25zLgorICoKKyAqIFxwYXJhbSBlbnRyeSBidWZmZXIgZW50cnkgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorICoKKyAqIEZyZWVzIGFueSBwYWdlcyBhbmQgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGVudHJ5LgorICovCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cF9idWZfZXJyb3IoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZW50cnlfdCAqZW50cnkpCit7CisJaW50IGk7CisKKwlpZiAoZW50cnktPnNlZ19jb3VudCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZW50cnktPnNlZ19jb3VudDsgaSsrKSB7CisJCQlpZiAoZW50cnktPnNlZ2xpc3RbaV0pIHsKKwkJCQlkcm1fZnJlZV9wYWdlcyhlbnRyeS0+c2VnbGlzdFtpXSwKKwkJCQkJICAgICAgICBlbnRyeS0+cGFnZV9vcmRlciwKKwkJCQkJICAgICAgICBEUk1fTUVNX0RNQSk7CisJCQl9CisJCX0KKwkJZHJtX2ZyZWUoZW50cnktPnNlZ2xpc3QsCisJCQkgIGVudHJ5LT5zZWdfY291bnQgKgorCQkJICBzaXplb2YoKmVudHJ5LT5zZWdsaXN0KSwKKwkJCSAgRFJNX01FTV9TRUdTKTsKKworCQllbnRyeS0+c2VnX2NvdW50ID0gMDsKKwl9CisKKyAgIAlpZiAoZW50cnktPmJ1Zl9jb3VudCkgeworCSAgIAlmb3IgKGkgPSAwOyBpIDwgZW50cnktPmJ1Zl9jb3VudDsgaSsrKSB7CisJCQlpZiAoZW50cnktPmJ1Zmxpc3RbaV0uZGV2X3ByaXZhdGUpIHsKKwkJCQlkcm1fZnJlZShlbnRyeS0+YnVmbGlzdFtpXS5kZXZfcHJpdmF0ZSwKKwkJCQkJICBlbnRyeS0+YnVmbGlzdFtpXS5kZXZfcHJpdl9zaXplLAorCQkJCQkgIERSTV9NRU1fQlVGUyk7CisJCQl9CisJCX0KKwkJZHJtX2ZyZWUoZW50cnktPmJ1Zmxpc3QsCisJCQkgIGVudHJ5LT5idWZfY291bnQgKgorCQkJICBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSwKKwkJCSAgRFJNX01FTV9CVUZTKTsKKworCQllbnRyeS0+YnVmX2NvdW50ID0gMDsKKwl9Cit9CisKKyNpZiBfX09TX0hBU19BR1AKKy8qKgorICogQWRkIEFHUCBidWZmZXJzIGZvciBETUEgdHJhbnNmZXJzIChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IHJlcXVlc3QuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICogCisgKiBBZnRlciBzb21lIHNhbml0eSBjaGVja3MgY3JlYXRlcyBhIGRybV9idWYgc3RydWN0dXJlIGZvciBlYWNoIGJ1ZmZlciBhbmQKKyAqIHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgbGlzdCBvZiB0aGUgc2FtZSBzaXplIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcKKyAqIGJ1ZmZlcnMuCisgKi8KK2ludCBkcm1fYWRkYnVmc19hZ3AoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJZHJtX2J1Zl90ICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OworCWludCBjb3VudDsKKwlpbnQgb3JkZXI7CisJaW50IHNpemU7CisJaW50IGFsaWdubWVudDsKKwlpbnQgcGFnZV9vcmRlcjsKKwlpbnQgdG90YWw7CisJaW50IGJ5dGVfY291bnQ7CisJaW50IGk7CisJZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCWRybV9idWZfZGVzY190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsCisJCQkgICAgIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCA9IHJlcXVlc3QuY291bnQ7CisJb3JkZXIgPSBkcm1fb3JkZXIoIHJlcXVlc3Quc2l6ZSApOworCXNpemUgPSAxIDw8IG9yZGVyOworCisJYWxpZ25tZW50ICA9IChyZXF1ZXN0LmZsYWdzICYgX0RSTV9QQUdFX0FMSUdOKQorCQk/IFBBR0VfQUxJR04oc2l6ZSkgOiBzaXplOworCXBhZ2Vfb3JkZXIgPSBvcmRlciAtIFBBR0VfU0hJRlQgPiAwID8gb3JkZXIgLSBQQUdFX1NISUZUIDogMDsKKwl0b3RhbCA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOworCisJYnl0ZV9jb3VudCA9IDA7CisJYWdwX29mZnNldCA9IGRldi0+YWdwLT5iYXNlICsgcmVxdWVzdC5hZ3Bfc3RhcnQ7CisKKwlEUk1fREVCVUcoICJjb3VudDogICAgICAlZFxuIiwgIGNvdW50ICk7CisJRFJNX0RFQlVHKCAib3JkZXI6ICAgICAgJWRcbiIsICBvcmRlciApOworCURSTV9ERUJVRyggInNpemU6ICAgICAgICVkXG4iLCAgc2l6ZSApOworCURSTV9ERUJVRyggImFncF9vZmZzZXQ6ICVsdVxuIiwgYWdwX29mZnNldCApOworCURSTV9ERUJVRyggImFsaWdubWVudDogICVkXG4iLCAgYWxpZ25tZW50ICk7CisJRFJNX0RFQlVHKCAicGFnZV9vcmRlcjogJWRcbiIsICBwYWdlX29yZGVyICk7CisJRFJNX0RFQlVHKCAidG90YWw6ICAgICAgJWRcbiIsICB0b3RhbCApOworCisJaWYgKCBvcmRlciA8IERSTV9NSU5fT1JERVIgfHwgb3JkZXIgPiBEUk1fTUFYX09SREVSICkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKCBkZXYtPnF1ZXVlX2NvdW50ICkgcmV0dXJuIC1FQlVTWTsgLyogTm90IHdoaWxlIGluIHVzZSAqLworCisJc3Bpbl9sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJaWYgKCBkZXYtPmJ1Zl91c2UgKSB7CisJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWF0b21pY19pbmMoICZkZXYtPmJ1Zl9hbGxvYyApOworCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisKKwlkb3duKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJZW50cnkgPSAmZG1hLT5idWZzW29yZGVyXTsKKwlpZiAoIGVudHJ5LT5idWZfY291bnQgKSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVOT01FTTsgLyogTWF5IG9ubHkgY2FsbCBvbmNlIGZvciBlYWNoIG9yZGVyICovCisJfQorCisJaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IDQwOTYpIHsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVudHJ5LT5idWZsaXN0ID0gZHJtX2FsbG9jKCBjb3VudCAqIHNpemVvZigqZW50cnktPmJ1Zmxpc3QpLAorCQkJCSAgICBEUk1fTUVNX0JVRlMgKTsKKwlpZiAoICFlbnRyeS0+YnVmbGlzdCApIHsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGVudHJ5LT5idWZsaXN0LCAwLCBjb3VudCAqIHNpemVvZigqZW50cnktPmJ1Zmxpc3QpICk7CisKKwllbnRyeS0+YnVmX3NpemUgPSBzaXplOworCWVudHJ5LT5wYWdlX29yZGVyID0gcGFnZV9vcmRlcjsKKworCW9mZnNldCA9IDA7CisKKwl3aGlsZSAoIGVudHJ5LT5idWZfY291bnQgPCBjb3VudCApIHsKKwkJYnVmICAgICAgICAgID0gJmVudHJ5LT5idWZsaXN0W2VudHJ5LT5idWZfY291bnRdOworCQlidWYtPmlkeCAgICAgPSBkbWEtPmJ1Zl9jb3VudCArIGVudHJ5LT5idWZfY291bnQ7CisJCWJ1Zi0+dG90YWwgICA9IGFsaWdubWVudDsKKwkJYnVmLT5vcmRlciAgID0gb3JkZXI7CisJCWJ1Zi0+dXNlZCAgICA9IDA7CisKKwkJYnVmLT5vZmZzZXQgID0gKGRtYS0+Ynl0ZV9jb3VudCArIG9mZnNldCk7CisJCWJ1Zi0+YnVzX2FkZHJlc3MgPSBhZ3Bfb2Zmc2V0ICsgb2Zmc2V0OworCQlidWYtPmFkZHJlc3MgPSAodm9pZCAqKShhZ3Bfb2Zmc2V0ICsgb2Zmc2V0KTsKKwkJYnVmLT5uZXh0ICAgID0gTlVMTDsKKwkJYnVmLT53YWl0aW5nID0gMDsKKwkJYnVmLT5wZW5kaW5nID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCggJmJ1Zi0+ZG1hX3dhaXQgKTsKKwkJYnVmLT5maWxwICAgID0gTlVMTDsKKworCQlidWYtPmRldl9wcml2X3NpemUgPSBkZXYtPmRyaXZlci0+ZGV2X3ByaXZfc2l6ZTsKKwkJYnVmLT5kZXZfcHJpdmF0ZSA9IGRybV9hbGxvYyggYnVmLT5kZXZfcHJpdl9zaXplLAorCQkJCQkgICAgICAgRFJNX01FTV9CVUZTICk7CisJCWlmKCFidWYtPmRldl9wcml2YXRlKSB7CisJCQkvKiBTZXQgY291bnQgY29ycmVjdGx5IHNvIHdlIGZyZWUgdGhlIHByb3BlciBhbW91bnQuICovCisJCQllbnRyeS0+YnVmX2NvdW50ID0gY291bnQ7CisJCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldCggYnVmLT5kZXZfcHJpdmF0ZSwgMCwgYnVmLT5kZXZfcHJpdl9zaXplICk7CisKKwkJRFJNX0RFQlVHKCAiYnVmZmVyICVkIEAgJXBcbiIsCisJCQkgICBlbnRyeS0+YnVmX2NvdW50LCBidWYtPmFkZHJlc3MgKTsKKworCQlvZmZzZXQgKz0gYWxpZ25tZW50OworCQllbnRyeS0+YnVmX2NvdW50Kys7CisJCWJ5dGVfY291bnQgKz0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXI7CisJfQorCisJRFJNX0RFQlVHKCAiYnl0ZV9jb3VudDogJWRcbiIsIGJ5dGVfY291bnQgKTsKKworCXRlbXBfYnVmbGlzdCA9IGRybV9yZWFsbG9jKCBkbWEtPmJ1Zmxpc3QsCisJCQkJICAgICBkbWEtPmJ1Zl9jb3VudCAqIHNpemVvZigqZG1hLT5idWZsaXN0KSwKKwkJCQkgICAgIChkbWEtPmJ1Zl9jb3VudCArIGVudHJ5LT5idWZfY291bnQpCisJCQkJICAgICAqIHNpemVvZigqZG1hLT5idWZsaXN0KSwKKwkJCQkgICAgIERSTV9NRU1fQlVGUyApOworCWlmKCF0ZW1wX2J1Zmxpc3QpIHsKKwkJLyogRnJlZSB0aGUgZW50cnkgYmVjYXVzZSBpdCBpc24ndCB2YWxpZCAqLworCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkbWEtPmJ1Zmxpc3QgPSB0ZW1wX2J1Zmxpc3Q7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBlbnRyeS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlkbWEtPmJ1Zmxpc3RbaSArIGRtYS0+YnVmX2NvdW50XSA9ICZlbnRyeS0+YnVmbGlzdFtpXTsKKwl9CisKKwlkbWEtPmJ1Zl9jb3VudCArPSBlbnRyeS0+YnVmX2NvdW50OworCWRtYS0+Ynl0ZV9jb3VudCArPSBieXRlX2NvdW50OworCisJRFJNX0RFQlVHKCAiZG1hLT5idWZfY291bnQgOiAlZFxuIiwgZG1hLT5idWZfY291bnQgKTsKKwlEUk1fREVCVUcoICJlbnRyeS0+YnVmX2NvdW50IDogJWRcbiIsIGVudHJ5LT5idWZfY291bnQgKTsKKworCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlyZXF1ZXN0LmNvdW50ID0gZW50cnktPmJ1Zl9jb3VudDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJZG1hLT5mbGFncyA9IF9EUk1fRE1BX1VTRV9BR1A7CisKKwlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBfX09TX0hBU19BR1AgKi8KKworaW50IGRybV9hZGRidWZzX3BjaSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKyAgIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfZGVzY190IHJlcXVlc3Q7CisJaW50IGNvdW50OworCWludCBvcmRlcjsKKwlpbnQgc2l6ZTsKKwlpbnQgdG90YWw7CisJaW50IHBhZ2Vfb3JkZXI7CisJZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJZHJtX2J1Zl90ICpidWY7CisJaW50IGFsaWdubWVudDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgaTsKKwlpbnQgYnl0ZV9jb3VudDsKKwlpbnQgcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nICp0ZW1wX3BhZ2VsaXN0OworCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfUENJX0RNQSkpIHJldHVybiAtRUlOVkFMOworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCA9IHJlcXVlc3QuY291bnQ7CisJb3JkZXIgPSBkcm1fb3JkZXIoIHJlcXVlc3Quc2l6ZSApOworCXNpemUgPSAxIDw8IG9yZGVyOworCisJRFJNX0RFQlVHKCAiY291bnQ9JWQsIHNpemU9JWQgKCVkKSwgb3JkZXI9JWQsIHF1ZXVlX2NvdW50PSVkXG4iLAorCQkgICByZXF1ZXN0LmNvdW50LCByZXF1ZXN0LnNpemUsIHNpemUsCisJCSAgIG9yZGVyLCBkZXYtPnF1ZXVlX2NvdW50ICk7CisKKwlpZiAoIG9yZGVyIDwgRFJNX01JTl9PUkRFUiB8fCBvcmRlciA+IERSTV9NQVhfT1JERVIgKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIGRldi0+cXVldWVfY291bnQgKSByZXR1cm4gLUVCVVNZOyAvKiBOb3Qgd2hpbGUgaW4gdXNlICovCisKKwlhbGlnbm1lbnQgPSAocmVxdWVzdC5mbGFncyAmIF9EUk1fUEFHRV9BTElHTikKKwkJPyBQQUdFX0FMSUdOKHNpemUpIDogc2l6ZTsKKwlwYWdlX29yZGVyID0gb3JkZXIgLSBQQUdFX1NISUZUID4gMCA/IG9yZGVyIC0gUEFHRV9TSElGVCA6IDA7CisJdG90YWwgPSBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcjsKKworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggZGV2LT5idWZfdXNlICkgeworCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlhdG9taWNfaW5jKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCisJZG93biggJmRldi0+c3RydWN0X3NlbSApOworCWVudHJ5ID0gJmRtYS0+YnVmc1tvcmRlcl07CisJaWYgKCBlbnRyeS0+YnVmX2NvdW50ICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CS8qIE1heSBvbmx5IGNhbGwgb25jZSBmb3IgZWFjaCBvcmRlciAqLworCX0KKworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiA0MDk2KSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbnRyeS0+YnVmbGlzdCA9IGRybV9hbGxvYyggY291bnQgKiBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSwKKwkJCQkgICAgRFJNX01FTV9CVUZTICk7CisJaWYgKCAhZW50cnktPmJ1Zmxpc3QgKSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBlbnRyeS0+YnVmbGlzdCwgMCwgY291bnQgKiBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSApOworCisJZW50cnktPnNlZ2xpc3QgPSBkcm1fYWxsb2MoIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+c2VnbGlzdCksCisJCQkJICAgIERSTV9NRU1fU0VHUyApOworCWlmICggIWVudHJ5LT5zZWdsaXN0ICkgeworCQlkcm1fZnJlZSggZW50cnktPmJ1Zmxpc3QsCisJCQkgIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCksCisJCQkgIERSTV9NRU1fQlVGUyApOworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZW50cnktPnNlZ2xpc3QsIDAsIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+c2VnbGlzdCkgKTsKKworCS8qIEtlZXAgdGhlIG9yaWdpbmFsIHBhZ2VsaXN0IHVudGlsIHdlIGtub3cgYWxsIHRoZSBhbGxvY2F0aW9ucworCSAqIGhhdmUgc3VjY2VlZGVkCisJICovCisJdGVtcF9wYWdlbGlzdCA9IGRybV9hbGxvYyggKGRtYS0+cGFnZV9jb3VudCArIChjb3VudCA8PCBwYWdlX29yZGVyKSkKKwkJCQkgICAgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpLAorCQkJCSAgICBEUk1fTUVNX1BBR0VTICk7CisJaWYgKCF0ZW1wX3BhZ2VsaXN0KSB7CisJCWRybV9mcmVlKCBlbnRyeS0+YnVmbGlzdCwKKwkJCSAgIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCksCisJCQkgICBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIGVudHJ5LT5zZWdsaXN0LAorCQkJICAgY291bnQgKiBzaXplb2YoKmVudHJ5LT5zZWdsaXN0KSwKKwkJCSAgIERSTV9NRU1fU0VHUyApOworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweSh0ZW1wX3BhZ2VsaXN0LAorCSAgICAgICBkbWEtPnBhZ2VsaXN0LAorCSAgICAgICBkbWEtPnBhZ2VfY291bnQgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpKTsKKwlEUk1fREVCVUcoICJwYWdlbGlzdDogJWQgZW50cmllc1xuIiwKKwkJICAgZG1hLT5wYWdlX2NvdW50ICsgKGNvdW50IDw8IHBhZ2Vfb3JkZXIpICk7CisKKwllbnRyeS0+YnVmX3NpemUJPSBzaXplOworCWVudHJ5LT5wYWdlX29yZGVyID0gcGFnZV9vcmRlcjsKKwlieXRlX2NvdW50ID0gMDsKKwlwYWdlX2NvdW50ID0gMDsKKworCXdoaWxlICggZW50cnktPmJ1Zl9jb3VudCA8IGNvdW50ICkgeworCQlwYWdlID0gZHJtX2FsbG9jX3BhZ2VzKCBwYWdlX29yZGVyLCBEUk1fTUVNX0RNQSApOworCQlpZiAoICFwYWdlICkgeworCQkJLyogU2V0IGNvdW50IGNvcnJlY3RseSBzbyB3ZSBmcmVlIHRoZSBwcm9wZXIgYW1vdW50LiAqLworCQkJZW50cnktPmJ1Zl9jb3VudCA9IGNvdW50OworCQkJZW50cnktPnNlZ19jb3VudCA9IGNvdW50OworCQkJZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRldiwgZW50cnkpOworCQkJZHJtX2ZyZWUoIHRlbXBfcGFnZWxpc3QsCisJCQkJICAgKGRtYS0+cGFnZV9jb3VudCArIChjb3VudCA8PCBwYWdlX29yZGVyKSkKKwkJCQkgICAqIHNpemVvZigqZG1hLT5wYWdlbGlzdCksCisJCQkJICAgRFJNX01FTV9QQUdFUyApOworCQkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZW50cnktPnNlZ2xpc3RbZW50cnktPnNlZ19jb3VudCsrXSA9IHBhZ2U7CisJCWZvciAoIGkgPSAwIDsgaSA8ICgxIDw8IHBhZ2Vfb3JkZXIpIDsgaSsrICkgeworCQkJRFJNX0RFQlVHKCAicGFnZSAlZCBAIDB4JTA4bHhcbiIsCisJCQkJICAgZG1hLT5wYWdlX2NvdW50ICsgcGFnZV9jb3VudCwKKwkJCQkgICBwYWdlICsgUEFHRV9TSVpFICogaSApOworCQkJdGVtcF9wYWdlbGlzdFtkbWEtPnBhZ2VfY291bnQgKyBwYWdlX2NvdW50KytdCisJCQkJPSBwYWdlICsgUEFHRV9TSVpFICogaTsKKwkJfQorCQlmb3IgKCBvZmZzZXQgPSAwIDsKKwkJICAgICAgb2Zmc2V0ICsgc2l6ZSA8PSB0b3RhbCAmJiBlbnRyeS0+YnVmX2NvdW50IDwgY291bnQgOworCQkgICAgICBvZmZzZXQgKz0gYWxpZ25tZW50LCArK2VudHJ5LT5idWZfY291bnQgKSB7CisJCQlidWYJICAgICA9ICZlbnRyeS0+YnVmbGlzdFtlbnRyeS0+YnVmX2NvdW50XTsKKwkJCWJ1Zi0+aWR4ICAgICA9IGRtYS0+YnVmX2NvdW50ICsgZW50cnktPmJ1Zl9jb3VudDsKKwkJCWJ1Zi0+dG90YWwgICA9IGFsaWdubWVudDsKKwkJCWJ1Zi0+b3JkZXIgICA9IG9yZGVyOworCQkJYnVmLT51c2VkICAgID0gMDsKKwkJCWJ1Zi0+b2Zmc2V0ICA9IChkbWEtPmJ5dGVfY291bnQgKyBieXRlX2NvdW50ICsgb2Zmc2V0KTsKKwkJCWJ1Zi0+YWRkcmVzcyA9ICh2b2lkICopKHBhZ2UgKyBvZmZzZXQpOworCQkJYnVmLT5uZXh0ICAgID0gTlVMTDsKKwkJCWJ1Zi0+d2FpdGluZyA9IDA7CisJCQlidWYtPnBlbmRpbmcgPSAwOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCggJmJ1Zi0+ZG1hX3dhaXQgKTsKKwkJCWJ1Zi0+ZmlscCAgICA9IE5VTEw7CisKKwkJCWJ1Zi0+ZGV2X3ByaXZfc2l6ZSA9IGRldi0+ZHJpdmVyLT5kZXZfcHJpdl9zaXplOworCQkJYnVmLT5kZXZfcHJpdmF0ZSA9IGRybV9hbGxvYyggYnVmLT5kZXZfcHJpdl9zaXplLAorCQkJCQkJICAgICAgIERSTV9NRU1fQlVGUyApOworCQkJaWYoIWJ1Zi0+ZGV2X3ByaXZhdGUpIHsKKwkJCQkvKiBTZXQgY291bnQgY29ycmVjdGx5IHNvIHdlIGZyZWUgdGhlIHByb3BlciBhbW91bnQuICovCisJCQkJZW50cnktPmJ1Zl9jb3VudCA9IGNvdW50OworCQkJCWVudHJ5LT5zZWdfY291bnQgPSBjb3VudDsKKwkJCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJCQlkcm1fZnJlZSggdGVtcF9wYWdlbGlzdCwKKwkJCQkJICAgKGRtYS0+cGFnZV9jb3VudCArIChjb3VudCA8PCBwYWdlX29yZGVyKSkKKwkJCQkJICAgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpLAorCQkJCQkgICBEUk1fTUVNX1BBR0VTICk7CisJCQkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCW1lbXNldCggYnVmLT5kZXZfcHJpdmF0ZSwgMCwgYnVmLT5kZXZfcHJpdl9zaXplICk7CisKKwkJCURSTV9ERUJVRyggImJ1ZmZlciAlZCBAICVwXG4iLAorCQkJCSAgIGVudHJ5LT5idWZfY291bnQsIGJ1Zi0+YWRkcmVzcyApOworCQl9CisJCWJ5dGVfY291bnQgKz0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXI7CisJfQorCisJdGVtcF9idWZsaXN0ID0gZHJtX3JlYWxsb2MoIGRtYS0+YnVmbGlzdCwKKwkJCQkgICAgIGRtYS0+YnVmX2NvdW50ICogc2l6ZW9mKCpkbWEtPmJ1Zmxpc3QpLAorCQkJCSAgICAgKGRtYS0+YnVmX2NvdW50ICsgZW50cnktPmJ1Zl9jb3VudCkKKwkJCQkgICAgICogc2l6ZW9mKCpkbWEtPmJ1Zmxpc3QpLAorCQkJCSAgICAgRFJNX01FTV9CVUZTICk7CisJaWYgKCF0ZW1wX2J1Zmxpc3QpIHsKKwkJLyogRnJlZSB0aGUgZW50cnkgYmVjYXVzZSBpdCBpc24ndCB2YWxpZCAqLworCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJZHJtX2ZyZWUoIHRlbXBfcGFnZWxpc3QsCisJCQkgICAoZG1hLT5wYWdlX2NvdW50ICsgKGNvdW50IDw8IHBhZ2Vfb3JkZXIpKQorCQkJICAgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpLAorCQkJICAgRFJNX01FTV9QQUdFUyApOworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRtYS0+YnVmbGlzdCA9IHRlbXBfYnVmbGlzdDsKKworCWZvciAoIGkgPSAwIDsgaSA8IGVudHJ5LT5idWZfY291bnQgOyBpKysgKSB7CisJCWRtYS0+YnVmbGlzdFtpICsgZG1hLT5idWZfY291bnRdID0gJmVudHJ5LT5idWZsaXN0W2ldOworCX0KKworCS8qIE5vIGFsbG9jYXRpb25zIGZhaWxlZCwgc28gbm93IHdlIGNhbiByZXBsYWNlIHRoZSBvcmdpbmFsIHBhZ2VsaXN0CisJICogd2l0aCB0aGUgbmV3IG9uZS4KKwkgKi8KKwlpZiAoZG1hLT5wYWdlX2NvdW50KSB7CisJCWRybV9mcmVlKGRtYS0+cGFnZWxpc3QsCisJCQkgIGRtYS0+cGFnZV9jb3VudCAqIHNpemVvZigqZG1hLT5wYWdlbGlzdCksCisJCQkgIERSTV9NRU1fUEFHRVMpOworCX0KKwlkbWEtPnBhZ2VsaXN0ID0gdGVtcF9wYWdlbGlzdDsKKworCWRtYS0+YnVmX2NvdW50ICs9IGVudHJ5LT5idWZfY291bnQ7CisJZG1hLT5zZWdfY291bnQgKz0gZW50cnktPnNlZ19jb3VudDsKKwlkbWEtPnBhZ2VfY291bnQgKz0gZW50cnktPnNlZ19jb3VudCA8PCBwYWdlX29yZGVyOworCWRtYS0+Ynl0ZV9jb3VudCArPSBQQUdFX1NJWkUgKiAoZW50cnktPnNlZ19jb3VudCA8PCBwYWdlX29yZGVyKTsKKworCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlyZXF1ZXN0LmNvdW50ID0gZW50cnktPmJ1Zl9jb3VudDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJcmV0dXJuIDA7CisKK30KKworaW50IGRybV9hZGRidWZzX3NnKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfZGVzY190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJZHJtX2J1Zl90ICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OworCWludCBjb3VudDsKKwlpbnQgb3JkZXI7CisJaW50IHNpemU7CisJaW50IGFsaWdubWVudDsKKwlpbnQgcGFnZV9vcmRlcjsKKwlpbnQgdG90YWw7CisJaW50IGJ5dGVfY291bnQ7CisJaW50IGk7CisJZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSkgcmV0dXJuIC1FSU5WQUw7CisJCisJaWYgKCAhZG1hICkgcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNvdW50ID0gcmVxdWVzdC5jb3VudDsKKwlvcmRlciA9IGRybV9vcmRlciggcmVxdWVzdC5zaXplICk7CisJc2l6ZSA9IDEgPDwgb3JkZXI7CisKKwlhbGlnbm1lbnQgID0gKHJlcXVlc3QuZmxhZ3MgJiBfRFJNX1BBR0VfQUxJR04pCisJCQk/IFBBR0VfQUxJR04oc2l6ZSkgOiBzaXplOworCXBhZ2Vfb3JkZXIgPSBvcmRlciAtIFBBR0VfU0hJRlQgPiAwID8gb3JkZXIgLSBQQUdFX1NISUZUIDogMDsKKwl0b3RhbCA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOworCisJYnl0ZV9jb3VudCA9IDA7CisJYWdwX29mZnNldCA9IHJlcXVlc3QuYWdwX3N0YXJ0OworCisJRFJNX0RFQlVHKCAiY291bnQ6ICAgICAgJWRcbiIsICBjb3VudCApOworCURSTV9ERUJVRyggIm9yZGVyOiAgICAgICVkXG4iLCAgb3JkZXIgKTsKKwlEUk1fREVCVUcoICJzaXplOiAgICAgICAlZFxuIiwgIHNpemUgKTsKKwlEUk1fREVCVUcoICJhZ3Bfb2Zmc2V0OiAlbHVcbiIsIGFncF9vZmZzZXQgKTsKKwlEUk1fREVCVUcoICJhbGlnbm1lbnQ6ICAlZFxuIiwgIGFsaWdubWVudCApOworCURSTV9ERUJVRyggInBhZ2Vfb3JkZXI6ICVkXG4iLCAgcGFnZV9vcmRlciApOworCURSTV9ERUJVRyggInRvdGFsOiAgICAgICVkXG4iLCAgdG90YWwgKTsKKworCWlmICggb3JkZXIgPCBEUk1fTUlOX09SREVSIHx8IG9yZGVyID4gRFJNX01BWF9PUkRFUiApIHJldHVybiAtRUlOVkFMOworCWlmICggZGV2LT5xdWV1ZV9jb3VudCApIHJldHVybiAtRUJVU1k7IC8qIE5vdCB3aGlsZSBpbiB1c2UgKi8KKworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggZGV2LT5idWZfdXNlICkgeworCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlhdG9taWNfaW5jKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCisJZG93biggJmRldi0+c3RydWN0X3NlbSApOworCWVudHJ5ID0gJmRtYS0+YnVmc1tvcmRlcl07CisJaWYgKCBlbnRyeS0+YnVmX2NvdW50ICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07IC8qIE1heSBvbmx5IGNhbGwgb25jZSBmb3IgZWFjaCBvcmRlciAqLworCX0KKworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiA0MDk2KSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbnRyeS0+YnVmbGlzdCA9IGRybV9hbGxvYyggY291bnQgKiBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSwKKwkJCQkgICAgIERSTV9NRU1fQlVGUyApOworCWlmICggIWVudHJ5LT5idWZsaXN0ICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZW50cnktPmJ1Zmxpc3QsIDAsIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCkgKTsKKworCWVudHJ5LT5idWZfc2l6ZSA9IHNpemU7CisJZW50cnktPnBhZ2Vfb3JkZXIgPSBwYWdlX29yZGVyOworCisJb2Zmc2V0ID0gMDsKKworCXdoaWxlICggZW50cnktPmJ1Zl9jb3VudCA8IGNvdW50ICkgeworCQlidWYgICAgICAgICAgPSAmZW50cnktPmJ1Zmxpc3RbZW50cnktPmJ1Zl9jb3VudF07CisJCWJ1Zi0+aWR4ICAgICA9IGRtYS0+YnVmX2NvdW50ICsgZW50cnktPmJ1Zl9jb3VudDsKKwkJYnVmLT50b3RhbCAgID0gYWxpZ25tZW50OworCQlidWYtPm9yZGVyICAgPSBvcmRlcjsKKwkJYnVmLT51c2VkICAgID0gMDsKKworCQlidWYtPm9mZnNldCAgPSAoZG1hLT5ieXRlX2NvdW50ICsgb2Zmc2V0KTsKKwkJYnVmLT5idXNfYWRkcmVzcyA9IGFncF9vZmZzZXQgKyBvZmZzZXQ7CisJCWJ1Zi0+YWRkcmVzcyA9ICh2b2lkICopKGFncF9vZmZzZXQgKyBvZmZzZXQgKyBkZXYtPnNnLT5oYW5kbGUpOworCQlidWYtPm5leHQgICAgPSBOVUxMOworCQlidWYtPndhaXRpbmcgPSAwOworCQlidWYtPnBlbmRpbmcgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmYnVmLT5kbWFfd2FpdCApOworCQlidWYtPmZpbHAgICAgPSBOVUxMOworCisJCWJ1Zi0+ZGV2X3ByaXZfc2l6ZSA9IGRldi0+ZHJpdmVyLT5kZXZfcHJpdl9zaXplOworCQlidWYtPmRldl9wcml2YXRlID0gZHJtX2FsbG9jKCBidWYtPmRldl9wcml2X3NpemUsCisJCQkJCSAgICAgICBEUk1fTUVNX0JVRlMgKTsKKwkJaWYoIWJ1Zi0+ZGV2X3ByaXZhdGUpIHsKKwkJCS8qIFNldCBjb3VudCBjb3JyZWN0bHkgc28gd2UgZnJlZSB0aGUgcHJvcGVyIGFtb3VudC4gKi8KKwkJCWVudHJ5LT5idWZfY291bnQgPSBjb3VudDsKKwkJCWRybV9jbGVhbnVwX2J1Zl9lcnJvcihkZXYsZW50cnkpOworCQkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQltZW1zZXQoIGJ1Zi0+ZGV2X3ByaXZhdGUsIDAsIGJ1Zi0+ZGV2X3ByaXZfc2l6ZSApOworCisJCURSTV9ERUJVRyggImJ1ZmZlciAlZCBAICVwXG4iLAorCQkJICAgZW50cnktPmJ1Zl9jb3VudCwgYnVmLT5hZGRyZXNzICk7CisKKwkJb2Zmc2V0ICs9IGFsaWdubWVudDsKKwkJZW50cnktPmJ1Zl9jb3VudCsrOworCQlieXRlX2NvdW50ICs9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOworCX0KKworCURSTV9ERUJVRyggImJ5dGVfY291bnQ6ICVkXG4iLCBieXRlX2NvdW50ICk7CisKKwl0ZW1wX2J1Zmxpc3QgPSBkcm1fcmVhbGxvYyggZG1hLT5idWZsaXN0LAorCQkJCSAgICAgZG1hLT5idWZfY291bnQgKiBzaXplb2YoKmRtYS0+YnVmbGlzdCksCisJCQkJICAgICAoZG1hLT5idWZfY291bnQgKyBlbnRyeS0+YnVmX2NvdW50KQorCQkJCSAgICAgKiBzaXplb2YoKmRtYS0+YnVmbGlzdCksCisJCQkJICAgICBEUk1fTUVNX0JVRlMgKTsKKwlpZighdGVtcF9idWZsaXN0KSB7CisJCS8qIEZyZWUgdGhlIGVudHJ5IGJlY2F1c2UgaXQgaXNuJ3QgdmFsaWQgKi8KKwkJZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRldixlbnRyeSk7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG1hLT5idWZsaXN0ID0gdGVtcF9idWZsaXN0OworCisJZm9yICggaSA9IDAgOyBpIDwgZW50cnktPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJZG1hLT5idWZsaXN0W2kgKyBkbWEtPmJ1Zl9jb3VudF0gPSAmZW50cnktPmJ1Zmxpc3RbaV07CisJfQorCisJZG1hLT5idWZfY291bnQgKz0gZW50cnktPmJ1Zl9jb3VudDsKKwlkbWEtPmJ5dGVfY291bnQgKz0gYnl0ZV9jb3VudDsKKworCURSTV9ERUJVRyggImRtYS0+YnVmX2NvdW50IDogJWRcbiIsIGRtYS0+YnVmX2NvdW50ICk7CisJRFJNX0RFQlVHKCAiZW50cnktPmJ1Zl9jb3VudCA6ICVkXG4iLCBlbnRyeS0+YnVmX2NvdW50ICk7CisKKwl1cCggJmRldi0+c3RydWN0X3NlbSApOworCisJcmVxdWVzdC5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7CisJcmVxdWVzdC5zaXplID0gc2l6ZTsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRtYS0+ZmxhZ3MgPSBfRFJNX0RNQV9VU0VfU0c7CisKKwlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBZGQgYnVmZmVycyBmb3IgRE1BIHRyYW5zZmVycyAoaW9jdGwpLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBBY2NvcmRpbmcgd2l0aCB0aGUgbWVtb3J5IHR5cGUgc3BlY2lmaWVkIGluIGRybV9idWZfZGVzYzo6ZmxhZ3MgYW5kIHRoZQorICogYnVpbGQgb3B0aW9ucywgaXQgZGlzcGF0Y2hlcyB0aGUgY2FsbCBlaXRoZXIgdG8gYWRkYnVmc19hZ3AoKSwKKyAqIGFkZGJ1ZnNfc2coKSBvciBhZGRidWZzX3BjaSgpIGZvciBBR1AsIHNjYXR0ZXItZ2F0aGVyIG9yIGNvbnNpc3RlbnQKKyAqIFBDSSBtZW1vcnkgcmVzcGVjdGl2ZWx5LgorICovCitpbnQgZHJtX2FkZGJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgKGRybV9idWZfZGVzY190IF9fdXNlciAqKWFyZywKKwkJCSAgICAgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggcmVxdWVzdC5mbGFncyAmIF9EUk1fQUdQX0JVRkZFUiApCisJCXJldHVybiBkcm1fYWRkYnVmc19hZ3AoIGlub2RlLCBmaWxwLCBjbWQsIGFyZyApOworCWVsc2UKKyNlbmRpZgorCWlmICggcmVxdWVzdC5mbGFncyAmIF9EUk1fU0dfQlVGRkVSICkKKwkJcmV0dXJuIGRybV9hZGRidWZzX3NnKCBpbm9kZSwgZmlscCwgY21kLCBhcmcgKTsKKwllbHNlCisJCXJldHVybiBkcm1fYWRkYnVmc19wY2koIGlub2RlLCBmaWxwLCBjbWQsIGFyZyApOworfQorCisKKy8qKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBidWZmZXIgbWFwcGluZ3MuCisgKgorICogVGhpcyB3YXMgb3JpZ2luYWxseSBtZWFuIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9yIGJ5IGEgc29waGlzdGljYXRlZAorICogY2xpZW50IGxpYnJhcnkgdG8gZGV0ZXJtaW5lIGhvdyBiZXN0IHRvIHVzZSB0aGUgYXZhaWxhYmxlIGJ1ZmZlcnMgKGUuZy4sCisgKiBsYXJnZSBidWZmZXJzIGNhbiBiZSB1c2VkIGZvciBpbWFnZSB0cmFuc2ZlcikuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfaW5mbyBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEluY3JlbWVudHMgZHJtX2RldmljZTo6YnVmX3VzZSB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpjb3VudF9sb2NrCisgKiBsb2NrLCBwcmV2ZW50aW5nIG9mIGFsbG9jYXRpbmcgbW9yZSBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbC4gSW5mb3JtYXRpb24KKyAqIGFib3V0IGVhY2ggcmVxdWVzdGVkIGJ1ZmZlciBpcyB0aGVuIGNvcGllZCBpbnRvIHVzZXIgc3BhY2UuCisgKi8KK2ludCBkcm1faW5mb2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2luZm9fdCByZXF1ZXN0OworCWRybV9idWZfaW5mb190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgaTsKKwlpbnQgY291bnQ7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJaWYgKCBhdG9taWNfcmVhZCggJmRldi0+YnVmX2FsbG9jICkgKSB7CisJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCSsrZGV2LT5idWZfdXNlOwkJLyogQ2FuJ3QgYWxsb2NhdGUgbW9yZSBhZnRlciB0aGlzIGNhbGwgKi8KKwlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKCBpID0gMCwgY291bnQgPSAwIDsgaSA8IERSTV9NQVhfT1JERVIgKyAxIDsgaSsrICkgeworCQlpZiAoIGRtYS0+YnVmc1tpXS5idWZfY291bnQgKSArK2NvdW50OworCX0KKworCURSTV9ERUJVRyggImNvdW50ID0gJWRcbiIsIGNvdW50ICk7CisKKwlpZiAoIHJlcXVlc3QuY291bnQgPj0gY291bnQgKSB7CisJCWZvciAoIGkgPSAwLCBjb3VudCA9IDAgOyBpIDwgRFJNX01BWF9PUkRFUiArIDEgOyBpKysgKSB7CisJCQlpZiAoIGRtYS0+YnVmc1tpXS5idWZfY291bnQgKSB7CisJCQkJZHJtX2J1Zl9kZXNjX3QgX191c2VyICp0byA9ICZyZXF1ZXN0Lmxpc3RbY291bnRdOworCQkJCWRybV9idWZfZW50cnlfdCAqZnJvbSA9ICZkbWEtPmJ1ZnNbaV07CisJCQkJZHJtX2ZyZWVsaXN0X3QgKmxpc3QgPSAmZG1hLT5idWZzW2ldLmZyZWVsaXN0OworCQkJCWlmICggY29weV90b191c2VyKCAmdG8tPmNvdW50LAorCQkJCQkJICAgJmZyb20tPmJ1Zl9jb3VudCwKKwkJCQkJCSAgIHNpemVvZihmcm9tLT5idWZfY291bnQpICkgfHwKKwkJCQkgICAgIGNvcHlfdG9fdXNlciggJnRvLT5zaXplLAorCQkJCQkJICAgJmZyb20tPmJ1Zl9zaXplLAorCQkJCQkJICAgc2l6ZW9mKGZyb20tPmJ1Zl9zaXplKSApIHx8CisJCQkJICAgICBjb3B5X3RvX3VzZXIoICZ0by0+bG93X21hcmssCisJCQkJCQkgICAmbGlzdC0+bG93X21hcmssCisJCQkJCQkgICBzaXplb2YobGlzdC0+bG93X21hcmspICkgfHwKKwkJCQkgICAgIGNvcHlfdG9fdXNlciggJnRvLT5oaWdoX21hcmssCisJCQkJCQkgICAmbGlzdC0+aGlnaF9tYXJrLAorCQkJCQkJICAgc2l6ZW9mKGxpc3QtPmhpZ2hfbWFyaykgKSApCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJRFJNX0RFQlVHKCAiJWQgJWQgJWQgJWQgJWRcbiIsCisJCQkJCSAgIGksCisJCQkJCSAgIGRtYS0+YnVmc1tpXS5idWZfY291bnQsCisJCQkJCSAgIGRtYS0+YnVmc1tpXS5idWZfc2l6ZSwKKwkJCQkJICAgZG1hLT5idWZzW2ldLmZyZWVsaXN0Lmxvd19tYXJrLAorCQkJCQkgICBkbWEtPmJ1ZnNbaV0uZnJlZWxpc3QuaGlnaF9tYXJrICk7CisJCQkJKytjb3VudDsKKwkJCX0KKwkJfQorCX0KKwlyZXF1ZXN0LmNvdW50ID0gY291bnQ7CisKKwlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTcGVjaWZpZXMgYSBsb3cgYW5kIGhpZ2ggd2F0ZXIgbWFyayBmb3IgYnVmZmVyIGFsbG9jYXRpb24KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBhIHBvaW50ZXIgdG8gYSBkcm1fYnVmX2Rlc2Mgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBzaXplIG9yZGVyIGlzIGJvdW5kZWQgYmV0d2VlbiB0aGUgYWRtaXNzaWJsZSBvcmRlcnMgYW5kCisgKiB1cGRhdGVzIHRoZSByZXNwZWN0aXZlIGRybV9kZXZpY2VfZG1hOjpidWZzIGVudHJ5IGxvdyBhbmQgaGlnaCB3YXRlciBtYXJrLgorICoKKyAqIFxub3RlIFRoaXMgaW9jdGwgaXMgZGVwcmVjYXRlZCBhbmQgbW9zdGx5IG5ldmVyIHVzZWQuCisgKi8KK2ludCBkcm1fbWFya2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWludCBvcmRlcjsKKwlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoICFkbWEgKSByZXR1cm4gLUVJTlZBTDsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZyZXF1ZXN0LAorCQkJICAgICAoZHJtX2J1Zl9kZXNjX3QgX191c2VyICopYXJnLAorCQkJICAgICBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJRFJNX0RFQlVHKCAiJWQsICVkLCAlZFxuIiwKKwkJICAgcmVxdWVzdC5zaXplLCByZXF1ZXN0Lmxvd19tYXJrLCByZXF1ZXN0LmhpZ2hfbWFyayApOworCW9yZGVyID0gZHJtX29yZGVyKCByZXF1ZXN0LnNpemUgKTsKKwlpZiAoIG9yZGVyIDwgRFJNX01JTl9PUkRFUiB8fCBvcmRlciA+IERSTV9NQVhfT1JERVIgKSByZXR1cm4gLUVJTlZBTDsKKwllbnRyeSA9ICZkbWEtPmJ1ZnNbb3JkZXJdOworCisJaWYgKCByZXF1ZXN0Lmxvd19tYXJrIDwgMCB8fCByZXF1ZXN0Lmxvd19tYXJrID4gZW50cnktPmJ1Zl9jb3VudCApCisJCXJldHVybiAtRUlOVkFMOworCWlmICggcmVxdWVzdC5oaWdoX21hcmsgPCAwIHx8IHJlcXVlc3QuaGlnaF9tYXJrID4gZW50cnktPmJ1Zl9jb3VudCApCisJCXJldHVybiAtRUlOVkFMOworCisJZW50cnktPmZyZWVsaXN0Lmxvd19tYXJrICA9IHJlcXVlc3QubG93X21hcms7CisJZW50cnktPmZyZWVsaXN0LmhpZ2hfbWFyayA9IHJlcXVlc3QuaGlnaF9tYXJrOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5yZXNlcnZlIHRoZSBidWZmZXJzIGluIGxpc3QsIHByZXZpb3VzbHkgcmVzZXJ2ZWQgdXNpbmcgZHJtRE1BLiAKKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2J1Zl9mcmVlIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKiAKKyAqIENhbGxzIGZyZWVfYnVmZmVyKCkgZm9yIGVhY2ggdXNlZCBidWZmZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByaW1hcmlseSB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgKi8KK2ludCBkcm1fZnJlZWJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2ZyZWVfdCByZXF1ZXN0OworCWludCBpOworCWludCBpZHg7CisJZHJtX2J1Zl90ICpidWY7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsCisJCQkgICAgIChkcm1fYnVmX2ZyZWVfdCBfX3VzZXIgKilhcmcsCisJCQkgICAgIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlEUk1fREVCVUcoICIlZFxuIiwgcmVxdWVzdC5jb3VudCApOworCWZvciAoIGkgPSAwIDsgaSA8IHJlcXVlc3QuY291bnQgOyBpKysgKSB7CisJCWlmICggY29weV9mcm9tX3VzZXIoICZpZHgsCisJCQkJICAgICAmcmVxdWVzdC5saXN0W2ldLAorCQkJCSAgICAgc2l6ZW9mKGlkeCkgKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJCURSTV9FUlJPUiggIkluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJCSAgIGlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaWR4XTsKKwkJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgZnJlZWluZyBidWZmZXIgbm90IG93bmVkXG4iLAorCQkJCSAgIGN1cnJlbnQtPnBpZCApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZHJtX2ZyZWVfYnVmZmVyKCBkZXYsIGJ1ZiApOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIE1hcHMgYWxsIG9mIHRoZSBETUEgYnVmZmVycyBpbnRvIGNsaWVudC12aXJ0dWFsIHNwYWNlIChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfbWFwIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogTWFwcyB0aGUgQUdQIG9yIFNHIGJ1ZmZlciByZWdpb24gd2l0aCBkb19tbWFwKCksIGFuZCBjb3BpZXMgaW5mb3JtYXRpb24KKyAqIGFib3V0IGVhY2ggYnVmZmVyIGludG8gdXNlciBzcGFjZS4gVGhlIFBDSSBidWZmZXJzIGFyZSBhbHJlYWR5IG1hcHBlZCBvbiB0aGUKKyAqIGFkZGJ1ZnNfcGNpKCkgY2FsbC4KKyAqLworaW50IGRybV9tYXBidWZzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0Y29kZSA9IDA7CisJY29uc3QgaW50IHplcm8gPSAwOworCXVuc2lnbmVkIGxvbmcgdmlydHVhbDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJZHJtX2J1Zl9tYXBfdCByZXF1ZXN0OworCWludCBpOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoICFkbWEgKSByZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggYXRvbWljX3JlYWQoICZkZXYtPmJ1Zl9hbGxvYyApICkgeworCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkZXYtPmJ1Zl91c2UrKzsJCS8qIENhbid0IGFsbG9jYXRlIG1vcmUgYWZ0ZXIgdGhpcyBjYWxsICovCisJc3Bpbl91bmxvY2soICZkZXYtPmNvdW50X2xvY2sgKTsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCByZXF1ZXN0LmNvdW50ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlpZiAoKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9BR1ApKSB8fAorCQkgICAgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpICYmIChkbWEtPmZsYWdzICYgX0RSTV9ETUFfVVNFX1NHKSkgKSB7CisJCQlkcm1fbWFwX3QgKm1hcCA9IGRldi0+YWdwX2J1ZmZlcl9tYXA7CisKKwkJCWlmICggIW1hcCApIHsKKwkJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKKwkJCWRvd24oICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKyNlbHNlCisJCQlkb3duX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZW5kaWYKKwkJCXZpcnR1YWwgPSBkb19tbWFwKCBmaWxwLCAwLCBtYXAtPnNpemUsCisJCQkJCSAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkJCSAgIE1BUF9TSEFSRUQsCisJCQkJCSAgICh1bnNpZ25lZCBsb25nKW1hcC0+b2Zmc2V0ICk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MDIwNDAyCisJCQl1cCggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworI2Vsc2UKKwkJCXVwX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKKwkJCWRvd24oICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKyNlbHNlCisJCQlkb3duX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZW5kaWYKKwkJCXZpcnR1YWwgPSBkb19tbWFwKCBmaWxwLCAwLCBkbWEtPmJ5dGVfY291bnQsCisJCQkJCSAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkJCSAgIE1BUF9TSEFSRUQsIDAgKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKKwkJCXVwKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZWxzZQorCQkJdXBfd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKyNlbmRpZgorCQl9CisJCWlmICggdmlydHVhbCA+IC0xMDI0VUwgKSB7CisJCQkvKiBSZWFsIGVycm9yICovCisJCQlyZXRjb2RlID0gKHNpZ25lZCBsb25nKXZpcnR1YWw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmVxdWVzdC52aXJ0dWFsID0gKHZvaWQgX191c2VyICopdmlydHVhbDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJCWlmICggY29weV90b191c2VyKCAmcmVxdWVzdC5saXN0W2ldLmlkeCwKKwkJCQkJICAgJmRtYS0+YnVmbGlzdFtpXS0+aWR4LAorCQkJCQkgICBzaXplb2YocmVxdWVzdC5saXN0WzBdLmlkeCkgKSApIHsKKwkJCQlyZXRjb2RlID0gLUVGQVVMVDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlpZiAoIGNvcHlfdG9fdXNlciggJnJlcXVlc3QubGlzdFtpXS50b3RhbCwKKwkJCQkJICAgJmRtYS0+YnVmbGlzdFtpXS0+dG90YWwsCisJCQkJCSAgIHNpemVvZihyZXF1ZXN0Lmxpc3RbMF0udG90YWwpICkgKSB7CisJCQkJcmV0Y29kZSA9IC1FRkFVTFQ7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJaWYgKCBjb3B5X3RvX3VzZXIoICZyZXF1ZXN0Lmxpc3RbaV0udXNlZCwKKwkJCQkJICAgJnplcm8sCisJCQkJCSAgIHNpemVvZih6ZXJvKSApICkgeworCQkJCXJldGNvZGUgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWFkZHJlc3MgPSB2aXJ0dWFsICsgZG1hLT5idWZsaXN0W2ldLT5vZmZzZXQ7IC8qICoqKiAqLworCQkJaWYgKCBjb3B5X3RvX3VzZXIoICZyZXF1ZXN0Lmxpc3RbaV0uYWRkcmVzcywKKwkJCQkJICAgJmFkZHJlc3MsCisJCQkJCSAgIHNpemVvZihhZGRyZXNzKSApICkgeworCQkJCXJldGNvZGUgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCX0KKyBkb25lOgorCXJlcXVlc3QuY291bnQgPSBkbWEtPmJ1Zl9jb3VudDsKKwlEUk1fREVCVUcoICIlZCBidWZmZXJzLCByZXRjb2RlID0gJWRcbiIsIHJlcXVlc3QuY291bnQsIHJldGNvZGUgKTsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZXRjb2RlOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1Yzg2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoqCisgKiBcZmlsZSBkcm1fY29udGV4dC5oIAorICogSU9DVExzIGZvciBnZW5lcmljIGNvbnRleHRzCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogRnJpIE5vdiAyNCAxODozMTozNyAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENoYW5nZUxvZzoKKyAqICAyMDAxLTExLTE2CVRvcnN0ZW4gRHV3ZSA8ZHV3ZUBjYWxkZXJhLmRlPgorICoJCWFkZGVkIGNvbnRleHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBob29rcywKKyAqCQluZWVkZWQgYnkgU2lTIGRyaXZlcidzIG1lbW9yeSBtYW5hZ2VtZW50LgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgQ29udGV4dCBiaXRtYXAgc3VwcG9ydCAqLworLypAeyovCisKKy8qKgorICogRnJlZSBhIGhhbmRsZSBmcm9tIHRoZSBjb250ZXh0IGJpdG1hcC4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gY3R4X2hhbmRsZSBjb250ZXh0IGhhbmRsZS4KKyAqCisgKiBDbGVhcnMgdGhlIGJpdCBzcGVjaWZpZWQgYnkgXHAgY3R4X2hhbmRsZSBpbiBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCB0aGUgZW50cnkKKyAqIGluIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3Rfc2VtCisgKiBsb2NrLgorICovCit2b2lkIGRybV9jdHhiaXRtYXBfZnJlZSggZHJtX2RldmljZV90ICpkZXYsIGludCBjdHhfaGFuZGxlICkKK3sKKwlpZiAoIGN0eF9oYW5kbGUgPCAwICkgZ290byBmYWlsZWQ7CisJaWYgKCAhZGV2LT5jdHhfYml0bWFwICkgZ290byBmYWlsZWQ7CisKKwlpZiAoIGN0eF9oYW5kbGUgPCBEUk1fTUFYX0NUWEJJVE1BUCApIHsKKwkJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJY2xlYXJfYml0KCBjdHhfaGFuZGxlLCBkZXYtPmN0eF9iaXRtYXAgKTsKKwkJZGV2LT5jb250ZXh0X3NhcmVhc1tjdHhfaGFuZGxlXSA9IE5VTEw7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm47CisJfQorZmFpbGVkOgorICAgICAgIAlEUk1fRVJST1IoICJBdHRlbXB0IHRvIGZyZWUgaW52YWxpZCBjb250ZXh0IGhhbmRsZTogJWRcbiIsCisJCSAgIGN0eF9oYW5kbGUgKTsKKyAgICAgICAJcmV0dXJuOworfQorCisvKiogCisgKiBDb250ZXh0IGJpdG1hcCBhbGxvY2F0aW9uLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqIFxyZXR1cm4gKG5vbi1uZWdhdGl2ZSkgY29udGV4dCBoYW5kbGUgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEZpbmQgdGhlIGZpcnN0IHplcm8gYml0IGluIGRybV9kZXZpY2U6OmN0eF9iaXRtYXAgYW5kIChyZSlhbGxvY2F0ZXMKKyAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgZW50cnkgd2hpbGUgaG9sZGluZyB0aGUKKyAqIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9jdHhiaXRtYXBfbmV4dCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWludCBiaXQ7CisKKwlpZighZGV2LT5jdHhfYml0bWFwKSByZXR1cm4gLTE7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWJpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQoIGRldi0+Y3R4X2JpdG1hcCwgRFJNX01BWF9DVFhCSVRNQVAgKTsKKwlpZiAoIGJpdCA8IERSTV9NQVhfQ1RYQklUTUFQICkgeworCQlzZXRfYml0KCBiaXQsIGRldi0+Y3R4X2JpdG1hcCApOworCSAgIAlEUk1fREVCVUcoICJkcm1fY3R4Yml0bWFwX25leHQgYml0IDogJWRcbiIsIGJpdCApOworCQlpZigoYml0KzEpID4gZGV2LT5tYXhfY29udGV4dCkgeworCQkJZGV2LT5tYXhfY29udGV4dCA9IChiaXQrMSk7CisJCQlpZihkZXYtPmNvbnRleHRfc2FyZWFzKSB7CisJCQkJZHJtX21hcF90ICoqY3R4X3NhcmVhczsKKworCQkJCWN0eF9zYXJlYXMgPSBkcm1fcmVhbGxvYyhkZXYtPmNvbnRleHRfc2FyZWFzLAorCQkJCQkJKGRldi0+bWF4X2NvbnRleHQgLSAxKSAqIAorCQkJCQkJc2l6ZW9mKCpkZXYtPmNvbnRleHRfc2FyZWFzKSwKKwkJCQkJCWRldi0+bWF4X2NvbnRleHQgKiAKKwkJCQkJCXNpemVvZigqZGV2LT5jb250ZXh0X3NhcmVhcyksCisJCQkJCQlEUk1fTUVNX01BUFMpOworCQkJCWlmKCFjdHhfc2FyZWFzKSB7CisJCQkJCWNsZWFyX2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7CisJCQkJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPSBjdHhfc2FyZWFzOworCQkJCWRldi0+Y29udGV4dF9zYXJlYXNbYml0XSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCS8qIG1heF9jb250ZXh0ID09IDEgYXQgdGhpcyBwb2ludCAqLworCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPSBkcm1fYWxsb2MoCisJCQkJCQlkZXYtPm1heF9jb250ZXh0ICogCisJCQkJCQlzaXplb2YoKmRldi0+Y29udGV4dF9zYXJlYXMpLAorCQkJCQkJRFJNX01FTV9NQVBTKTsKKwkJCQlpZighZGV2LT5jb250ZXh0X3NhcmVhcykgeworCQkJCQljbGVhcl9iaXQoYml0LCBkZXYtPmN0eF9iaXRtYXApOworCQkJCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlkZXYtPmNvbnRleHRfc2FyZWFzW2JpdF0gPSBOVUxMOworCQkJfQorCQl9CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gYml0OworCX0KKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogQ29udGV4dCBiaXRtYXAgaW5pdGlhbGl6YXRpb24uCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICoKKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZworICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9jdHhiaXRtYXBfaW5pdCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWludCBpOworICAgCWludCB0ZW1wOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlkZXYtPmN0eF9iaXRtYXAgPSAodW5zaWduZWQgbG9uZyAqKSBkcm1fYWxsb2MoIFBBR0VfU0laRSwKKwkJCQkJCQlEUk1fTUVNX0NUWEJJVE1BUCApOworCWlmICggZGV2LT5jdHhfYml0bWFwID09IE5VTEwgKSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCAodm9pZCAqKWRldi0+Y3R4X2JpdG1hcCwgMCwgUEFHRV9TSVpFICk7CisJZGV2LT5jb250ZXh0X3NhcmVhcyA9IE5VTEw7CisJZGV2LT5tYXhfY29udGV4dCA9IC0xOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJZm9yICggaSA9IDAgOyBpIDwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTIDsgaSsrICkgeworCQl0ZW1wID0gZHJtX2N0eGJpdG1hcF9uZXh0KCBkZXYgKTsKKwkgICAJRFJNX0RFQlVHKCAiZHJtX2N0eGJpdG1hcF9pbml0IDogJWRcbiIsIHRlbXAgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDb250ZXh0IGJpdG1hcCBjbGVhbnVwLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqCisgKiBGcmVlcyBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZworICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLwordm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmKCBkZXYtPmNvbnRleHRfc2FyZWFzICkgZHJtX2ZyZWUoIGRldi0+Y29udGV4dF9zYXJlYXMsCisJCQkJCSAgICAgc2l6ZW9mKCpkZXYtPmNvbnRleHRfc2FyZWFzKSAqIAorCQkJCQkgICAgIGRldi0+bWF4X2NvbnRleHQsCisJCQkJCSAgICAgRFJNX01FTV9NQVBTICk7CisJZHJtX2ZyZWUoICh2b2lkICopZGV2LT5jdHhfYml0bWFwLCBQQUdFX1NJWkUsIERSTV9NRU1fQ1RYQklUTUFQICk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7Cit9CisKKy8qQH0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIFBlciBDb250ZXh0IFNBUkVBIFN1cHBvcnQgKi8KKy8qQHsqLworCisvKioKKyAqIEdldCBwZXItY29udGV4dCBTQVJFQS4KKyAqIAorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCBwb2ludGluZyB0byBhIGRybV9jdHhfcHJpdl9tYXAgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBHZXRzIHRoZSBtYXAgZnJvbSBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB3aXRoIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGFuZAorICogcmV0dXJucyBpdHMgaGFuZGxlLgorICovCitpbnQgZHJtX2dldHNhcmVhY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKKwlkcm1fbWFwX3QgKm1hcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmIChkZXYtPm1heF9jb250ZXh0IDwgMCB8fCByZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpIGRldi0+bWF4X2NvbnRleHQpIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hcCA9IGRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJcmVxdWVzdC5oYW5kbGUgPSBtYXAtPmhhbmRsZTsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTZXQgcGVyLWNvbnRleHQgU0FSRUEuCisgKiAKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4X3ByaXZfbWFwIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogU2VhcmNoZXMgdGhlIG1hcHBpbmcgc3BlY2lmaWVkIGluIFxwIGFyZyBhbmQgdXBkYXRlIHRoZSBlbnRyeSBpbgorICogZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMgd2l0aCBpdC4KKyAqLworaW50IGRybV9zZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OworCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKKwlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAorCQkJICAgKGRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKilhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlpZihyX2xpc3QtPm1hcCAmJgorCQkgICByX2xpc3QtPm1hcC0+aGFuZGxlID09IHJlcXVlc3QuaGFuZGxlKQorCQkJZ290byBmb3VuZDsKKwl9CitiYWQ6CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCW1hcCA9IHJfbGlzdC0+bWFwOworCWlmICghbWFwKSBnb3RvIGJhZDsKKwlpZiAoZGV2LT5tYXhfY29udGV4dCA8IDApCisJCWdvdG8gYmFkOworCWlmIChyZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpIGRldi0+bWF4X2NvbnRleHQpCisJCWdvdG8gYmFkOworCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiAwOworfQorCisvKkB9Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBUaGUgYWN0dWFsIERSTSBjb250ZXh0IGhhbmRsaW5nIHJvdXRpbmVzICovCisvKkB7Ki8KKworLyoqCisgKiBTd2l0Y2ggY29udGV4dC4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gb2xkIG9sZCBjb250ZXh0IGhhbmRsZS4KKyAqIFxwYXJhbSBuZXcgbmV3IGNvbnRleHQgaGFuZGxlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBBdHRlbXB0IHRvIHNldCBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcuCisgKi8KK2ludCBkcm1fY29udGV4dF9zd2l0Y2goIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3ICkKK3sKKyAgICAgICAgaWYgKCB0ZXN0X2FuZF9zZXRfYml0KCAwLCAmZGV2LT5jb250ZXh0X2ZsYWcgKSApIHsKKyAgICAgICAgICAgICAgICBEUk1fRVJST1IoICJSZWVudGVyaW5nIC0tIEZJWE1FXG4iICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisKKyAgICAgICAgRFJNX0RFQlVHKCAiQ29udGV4dCBzd2l0Y2ggZnJvbSAlZCB0byAlZFxuIiwgb2xkLCBuZXcgKTsKKworICAgICAgICBpZiAoIG5ldyA9PSBkZXYtPmxhc3RfY29udGV4dCApIHsKKyAgICAgICAgICAgICAgICBjbGVhcl9iaXQoIDAsICZkZXYtPmNvbnRleHRfZmxhZyApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29tcGxldGUgY29udGV4dCBzd2l0Y2guCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIG5ldyBuZXcgY29udGV4dCBoYW5kbGUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIFVwZGF0ZXMgZHJtX2RldmljZTo6bGFzdF9jb250ZXh0IGFuZCBkcm1fZGV2aWNlOjpsYXN0X3N3aXRjaC4gVmVyaWZpZXMgdGhlCisgKiBoYXJkd2FyZSBsb2NrIGlzIGhlbGQsIGNsZWFycyB0aGUgZHJtX2RldmljZTo6Y29udGV4dF9mbGFnIGFuZCB3YWtlcyB1cAorICogZHJtX2RldmljZTo6Y29udGV4dF93YWl0LgorICovCitpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldyApCit7CisgICAgICAgIGRldi0+bGFzdF9jb250ZXh0ID0gbmV3OyAgLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCisgICAgICAgIGRldi0+bGFzdF9zd2l0Y2ggID0gamlmZmllczsKKworICAgICAgICBpZiAoICFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykgKSB7CisgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCAiTG9jayBpc24ndCBoZWxkIGFmdGVyIGNvbnRleHQgc3dpdGNoXG4iICk7CisgICAgICAgIH0KKworCQkJCS8qIElmIGEgY29udGV4dCBzd2l0Y2ggaXMgZXZlciBpbml0aWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUga2VybmVsIGhvbGRzIHRoZSBsb2NrLCByZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbG9jayBoZXJlLiAqLworICAgICAgICBjbGVhcl9iaXQoIDAsICZkZXYtPmNvbnRleHRfZmxhZyApOworICAgICAgICB3YWtlX3VwKCAmZGV2LT5jb250ZXh0X3dhaXQgKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXNlcnZlIGNvbnRleHRzLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4X3JlcyBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQgZHJtX3Jlc2N0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2N0eF9yZXNfdCByZXM7CisJZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3QgY3R4OworCWludCBpOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcywgYXJncCwgc2l6ZW9mKHJlcykgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCByZXMuY291bnQgPj0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTICkgeworCQltZW1zZXQoICZjdHgsIDAsIHNpemVvZihjdHgpICk7CisJCWZvciAoIGkgPSAwIDsgaSA8IERSTV9SRVNFUlZFRF9DT05URVhUUyA7IGkrKyApIHsKKwkJCWN0eC5oYW5kbGUgPSBpOworCQkJaWYgKCBjb3B5X3RvX3VzZXIoICZyZXMuY29udGV4dHNbaV0sCisJCQkJCSAgICZpLCBzaXplb2YoaSkgKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmVzLmNvdW50ID0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXMsIHNpemVvZihyZXMpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBZGQgY29udGV4dC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50IHBvaW50aW5nIHRvIGEgZHJtX2N0eCBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEdldCBhIG5ldyBoYW5kbGUgZm9yIHRoZSBjb250ZXh0IGFuZCBjb3B5IHRvIHVzZXJzcGFjZS4KKyAqLworaW50IGRybV9hZGRjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2N0eF9saXN0X3QgKiBjdHhfZW50cnk7CisJZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3QgY3R4OworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJY3R4LmhhbmRsZSA9IGRybV9jdHhiaXRtYXBfbmV4dCggZGV2ICk7CisJaWYgKCBjdHguaGFuZGxlID09IERSTV9LRVJORUxfQ09OVEVYVCApIHsKKwkJCQkvKiBTa2lwIGtlcm5lbCdzIGNvbnRleHQgYW5kIGdldCBhIG5ldyBvbmUuICovCisJCWN0eC5oYW5kbGUgPSBkcm1fY3R4Yml0bWFwX25leHQoIGRldiApOworCX0KKwlEUk1fREVCVUcoICIlZFxuIiwgY3R4LmhhbmRsZSApOworCWlmICggY3R4LmhhbmRsZSA9PSAtMSApIHsKKwkJRFJNX0RFQlVHKCAiTm90IGVub3VnaCBmcmVlIGNvbnRleHRzLlxuIiApOworCQkJCS8qIFNob3VsZCB0aGlzIHJldHVybiAtRUJVU1kgaW5zdGVhZD8gKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCBjdHguaGFuZGxlICE9IERSTV9LRVJORUxfQ09OVEVYVCApCisJeworCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfY3RvcikKKwkJCWRldi0+ZHJpdmVyLT5jb250ZXh0X2N0b3IoZGV2LCBjdHguaGFuZGxlKTsKKwl9CisKKwljdHhfZW50cnkgPSBkcm1fYWxsb2MoIHNpemVvZigqY3R4X2VudHJ5KSwgRFJNX01FTV9DVFhMSVNUICk7CisJaWYgKCAhY3R4X2VudHJ5ICkgeworCQlEUk1fREVCVUcoIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCggJmN0eF9lbnRyeS0+aGVhZCApOworCWN0eF9lbnRyeS0+aGFuZGxlID0gY3R4LmhhbmRsZTsKKwljdHhfZW50cnktPnRhZyA9IHByaXY7CisKKwlkb3duKCAmZGV2LT5jdHhsaXN0X3NlbSApOworCWxpc3RfYWRkKCAmY3R4X2VudHJ5LT5oZWFkLCAmZGV2LT5jdHhsaXN0LT5oZWFkICk7CisJKytkZXYtPmN0eF9jb3VudDsKKwl1cCggJmRldi0+Y3R4bGlzdF9zZW0gKTsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmY3R4LCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fbW9kY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwkvKiBUaGlzIGRvZXMgbm90aGluZyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBjb250ZXh0LgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fZ2V0Y3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fY3R4X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfdCBjdHg7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBUaGlzIGlzIDAsIGJlY2F1c2Ugd2UgZG9uJ3QgaGFuZGxlIGFueSBjb250ZXh0IGZsYWdzICovCisJY3R4LmZsYWdzID0gMDsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmY3R4LCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3dpdGNoIGNvbnRleHQuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCBwb2ludGluZyB0byBhIGRybV9jdHggc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBDYWxscyBjb250ZXh0X3N3aXRjaCgpLgorICovCitpbnQgZHJtX3N3aXRjaGN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fY3R4X3QgY3R4OworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCURSTV9ERUJVRyggIiVkXG4iLCBjdHguaGFuZGxlICk7CisJcmV0dXJuIGRybV9jb250ZXh0X3N3aXRjaCggZGV2LCBkZXYtPmxhc3RfY29udGV4dCwgY3R4LmhhbmRsZSApOworfQorCisvKioKKyAqIE5ldyBjb250ZXh0LgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQ2FsbHMgY29udGV4dF9zd2l0Y2hfY29tcGxldGUoKS4KKyAqLworaW50IGRybV9uZXdjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2N0eF90IGN0eDsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlEUk1fREVCVUcoICIlZFxuIiwgY3R4LmhhbmRsZSApOworCWRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZSggZGV2LCBjdHguaGFuZGxlICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZW1vdmUgY29udGV4dC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50IHBvaW50aW5nIHRvIGEgZHJtX2N0eCBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIElmIG5vdCB0aGUgc3BlY2lhbCBrZXJuZWwgY29udGV4dCwgY2FsbHMgY3R4Yml0bWFwX2ZyZWUoKSB0byBmcmVlIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KKyAqLworaW50IGRybV9ybWN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9jdHhfdCBjdHg7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJRFJNX0RFQlVHKCAiJWRcbiIsIGN0eC5oYW5kbGUgKTsKKwlpZiAoIGN0eC5oYW5kbGUgPT0gRFJNX0tFUk5FTF9DT05URVhUICsgMSApIHsKKwkJcHJpdi0+cmVtb3ZlX2F1dGhfb25fY2xvc2UgPSAxOworCX0KKwlpZiAoIGN0eC5oYW5kbGUgIT0gRFJNX0tFUk5FTF9DT05URVhUICkgeworCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcikKKwkJCWRldi0+ZHJpdmVyLT5jb250ZXh0X2R0b3IoZGV2LCBjdHguaGFuZGxlKTsKKwkJZHJtX2N0eGJpdG1hcF9mcmVlKCBkZXYsIGN0eC5oYW5kbGUgKTsKKwl9CisKKwlkb3duKCAmZGV2LT5jdHhsaXN0X3NlbSApOworCWlmICggIWxpc3RfZW1wdHkoICZkZXYtPmN0eGxpc3QtPmhlYWQgKSApIHsKKwkJZHJtX2N0eF9saXN0X3QgKnBvcywgKm47CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKCBwb3MsIG4sICZkZXYtPmN0eGxpc3QtPmhlYWQsIGhlYWQgKSB7CisJCQlpZiAoIHBvcy0+aGFuZGxlID09IGN0eC5oYW5kbGUgKSB7CisJCQkJbGlzdF9kZWwoICZwb3MtPmhlYWQgKTsKKwkJCQlkcm1fZnJlZSggcG9zLCBzaXplb2YoKnBvcyksIERSTV9NRU1fQ1RYTElTVCApOworCQkJCS0tZGV2LT5jdHhfY291bnQ7CisJCQl9CisJCX0KKwl9CisJdXAoICZkZXYtPmN0eGxpc3Rfc2VtICk7CisKKwlyZXR1cm4gMDsKK30KKworLypAfSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk3YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29yZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBKb24gU21pcmwgPGpvbnNtaXJsQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjZGVmaW5lIENPUkVfQVVUSE9SCQkiR2FyZXRoIEh1Z2hlcywgTGVpZiBEZWxnYXNzLCBKb3PDqSBGb25zZWNhLCBKb24gU21pcmwiCisKKyNkZWZpbmUgQ09SRV9OQU1FCQkiZHJtIgorI2RlZmluZSBDT1JFX0RFU0MJCSJEUk0gc2hhcmVkIGNvcmUgcm91dGluZXMiCisjZGVmaW5lIENPUkVfREFURQkJIjIwMDQwOTI1IgorCisjZGVmaW5lIERSTV9JRl9NQUpPUgkxCisjZGVmaW5lIERSTV9JRl9NSU5PUgkyCisKKyNkZWZpbmUgQ09SRV9NQUpPUgkxCisjZGVmaW5lIENPUkVfTUlOT1IJMAorI2RlZmluZSBDT1JFX1BBVENITEVWRUwgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI4YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogXGZpbGUgZHJtX2RtYS5oIAorICogRE1BIElPQ1RMIGFuZCBmdW5jdGlvbiBzdXBwb3J0CisgKgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDcmVhdGVkOiBGcmkgTWFyIDE5IDE0OjMwOjE2IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgRE1BIGRhdGEuCisgKiAKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRybV9kZXZpY2VfZG1hIHN0cnVjdHVyZS4KKyAqLworaW50IGRybV9kbWFfc2V0dXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlpbnQgaTsKKworCWRldi0+ZG1hID0gZHJtX2FsbG9jKCBzaXplb2YoKmRldi0+ZG1hKSwgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoICFkZXYtPmRtYSApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCBkZXYtPmRtYSwgMCwgc2l6ZW9mKCpkZXYtPmRtYSkgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8PSBEUk1fTUFYX09SREVSIDsgaSsrICkKKwkJbWVtc2V0KCZkZXYtPmRtYS0+YnVmc1tpXSwgMCwgc2l6ZW9mKGRldi0+ZG1hLT5idWZzWzBdKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDbGVhbnVwIHRoZSBETUEgcmVzb3VyY2VzLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqCisgKiBGcmVlIGFsbCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggRE1BIGJ1ZmZlcnMsIHRoZSBidWZmZXJzIGFuZCBwYWdlcyBsaXN0cywgYW5kCisgKiBmaW5hbGx5IHRoZSB0aGUgZHJtX2RldmljZTo6ZG1hIHN0cnVjdHVyZSBpdHNlbGYuCisgKi8KK3ZvaWQgZHJtX2RtYV90YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICAqZG1hID0gZGV2LT5kbWE7CisJaW50CQkgIGksIGo7CisKKwlpZiAoIWRtYSkgcmV0dXJuOworCisJCQkJLyogQ2xlYXIgZG1hIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IERSTV9NQVhfT1JERVI7IGkrKykgeworCQlpZiAoZG1hLT5idWZzW2ldLnNlZ19jb3VudCkgeworCQkJRFJNX0RFQlVHKCJvcmRlciAlZDogYnVmX2NvdW50ID0gJWQsIgorCQkJCSAgIiBzZWdfY291bnQgPSAlZFxuIiwKKwkJCQkgIGksCisJCQkJICBkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50LAorCQkJCSAgZG1hLT5idWZzW2ldLnNlZ19jb3VudCk7CisJCQlmb3IgKGogPSAwOyBqIDwgZG1hLT5idWZzW2ldLnNlZ19jb3VudDsgaisrKSB7CisJCQkJaWYgKGRtYS0+YnVmc1tpXS5zZWdsaXN0W2pdKSB7CisJCQkJCWRybV9mcmVlX3BhZ2VzKGRtYS0+YnVmc1tpXS5zZWdsaXN0W2pdLAorCQkJCQkJCWRtYS0+YnVmc1tpXS5wYWdlX29yZGVyLAorCQkJCQkJCURSTV9NRU1fRE1BKTsKKwkJCQl9CisJCQl9CisJCQlkcm1fZnJlZShkbWEtPmJ1ZnNbaV0uc2VnbGlzdCwKKwkJCQkgIGRtYS0+YnVmc1tpXS5zZWdfY291bnQKKwkJCQkgICogc2l6ZW9mKCpkbWEtPmJ1ZnNbMF0uc2VnbGlzdCksCisJCQkJICBEUk1fTUVNX1NFR1MpOworCQl9CisJICAgCWlmIChkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50KSB7CisJCSAgIAlmb3IgKGogPSAwOyBqIDwgZG1hLT5idWZzW2ldLmJ1Zl9jb3VudDsgaisrKSB7CisJCQkJaWYgKGRtYS0+YnVmc1tpXS5idWZsaXN0W2pdLmRldl9wcml2YXRlKSB7CisJCQkJCWRybV9mcmVlKGRtYS0+YnVmc1tpXS5idWZsaXN0W2pdLmRldl9wcml2YXRlLAorCQkJCQkJICBkbWEtPmJ1ZnNbaV0uYnVmbGlzdFtqXS5kZXZfcHJpdl9zaXplLAorCQkJCQkJICBEUk1fTUVNX0JVRlMpOworCQkJCX0KKwkJCX0KKwkJICAgCWRybV9mcmVlKGRtYS0+YnVmc1tpXS5idWZsaXN0LAorCQkJCSAgZG1hLT5idWZzW2ldLmJ1Zl9jb3VudCAqCisJCQkJICBzaXplb2YoKmRtYS0+YnVmc1swXS5idWZsaXN0KSwKKwkJCQkgIERSTV9NRU1fQlVGUyk7CisJCX0KKwl9CisKKwlpZiAoZG1hLT5idWZsaXN0KSB7CisJCWRybV9mcmVlKGRtYS0+YnVmbGlzdCwKKwkJCSAgZG1hLT5idWZfY291bnQgKiBzaXplb2YoKmRtYS0+YnVmbGlzdCksCisJCQkgIERSTV9NRU1fQlVGUyk7CisJfQorCisJaWYgKGRtYS0+cGFnZWxpc3QpIHsKKwkJZHJtX2ZyZWUoZG1hLT5wYWdlbGlzdCwKKwkJCSAgZG1hLT5wYWdlX2NvdW50ICogc2l6ZW9mKCpkbWEtPnBhZ2VsaXN0KSwKKwkJCSAgRFJNX01FTV9QQUdFUyk7CisJfQorCWRybV9mcmVlKGRldi0+ZG1hLCBzaXplb2YoKmRldi0+ZG1hKSwgRFJNX01FTV9EUklWRVIpOworCWRldi0+ZG1hID0gTlVMTDsKK30KKworCisvKioKKyAqIEZyZWUgYSBidWZmZXIuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIGJ1ZiBidWZmZXIgdG8gZnJlZS4KKyAqIAorICogUmVzZXRzIHRoZSBmaWVsZHMgb2YgXHAgYnVmLgorICovCit2b2lkIGRybV9mcmVlX2J1ZmZlcihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYpCit7CisJaWYgKCFidWYpIHJldHVybjsKKworCWJ1Zi0+d2FpdGluZyAgPSAwOworCWJ1Zi0+cGVuZGluZyAgPSAwOworCWJ1Zi0+ZmlscCAgICAgPSBOVUxMOworCWJ1Zi0+dXNlZCAgICAgPSAwOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSAmJiB3YWl0cXVldWVfYWN0aXZlKCZidWYtPmRtYV93YWl0KSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJ1Zi0+ZG1hX3dhaXQpOworCX0KK30KKworLyoqCisgKiBSZWNsYWltIHRoZSBidWZmZXJzLgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqCisgKiBGcmVlcyBlYWNoIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggXHAgZmlscCBub3QgYWxyZWFkeSBvbiB0aGUgaGFyZHdhcmUuCisgKi8KK3ZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQJCSBpOworCisJaWYgKCFkbWEpIHJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCQlpZiAoZG1hLT5idWZsaXN0W2ldLT5maWxwID09IGZpbHApIHsKKwkJCXN3aXRjaCAoZG1hLT5idWZsaXN0W2ldLT5saXN0KSB7CisJCQljYXNlIERSTV9MSVNUX05PTkU6CisJCQkJZHJtX2ZyZWVfYnVmZmVyKGRldiwgZG1hLT5idWZsaXN0W2ldKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFJNX0xJU1RfV0FJVDoKKwkJCQlkbWEtPmJ1Zmxpc3RbaV0tPmxpc3QgPSBEUk1fTElTVF9SRUNMQUlNOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBCdWZmZXIgYWxyZWFkeSBvbiBoYXJkd2FyZS4gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlOGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKQEAgLTAsMCArMSw1NiBAQAorLyoqCisgKiBcZmlsZSBkcm1fZHJhd2FibGUuaCAKKyAqIElPQ1RMcyBmb3IgZHJhd2FibGVzCisgKgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDcmVhdGVkOiBUdWUgRmViICAyIDA4OjM3OjU0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKiBOby1vcC4gKi8KK2ludCBkcm1fYWRkZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9kcmF3X3QgZHJhdzsKKworCWRyYXcuaGFuZGxlID0gMDsJLyogTk9PUCAqLworCURSTV9ERUJVRygiJWRcbiIsIGRyYXcuaGFuZGxlKTsKKwlpZiAoY29weV90b191c2VyKChkcm1fZHJhd190IF9fdXNlciAqKWFyZywgJmRyYXcsIHNpemVvZihkcmF3KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiogTm8tb3AuICovCitpbnQgZHJtX3JtZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7CQkvKiBOT09QICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzdlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwpAQCAtMCwwICsxLDUzMSBAQAorLyoqCisgKiBcZmlsZSBkcm1fZHJ2LmggCisgKiBHZW5lcmljIGRyaXZlciB0ZW1wbGF0ZQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBUbyB1c2UgdGhpcyB0ZW1wbGF0ZSwgeW91IG11c3QgYXQgbGVhc3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgKHNhbXBsZXMKKyAqIGdpdmVuIGZvciB0aGUgTUdBIGRyaXZlcik6CisgKgorICogXGNvZGUKKyAqICNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiVkEgTGludXggU3lzdGVtcywgSW5jLiIKKyAqCisgKiAjZGVmaW5lIERSSVZFUl9OQU1FCQkibWdhIgorICogI2RlZmluZSBEUklWRVJfREVTQwkJIk1hdHJveCBHMjAwL0c0MDAiCisgKiAjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMDExMjciCisgKgorICogI2RlZmluZSBEUklWRVJfSU9DVExfQ09VTlQJRFJNX0FSUkFZX1NJWkUoIG1nYV9pb2N0bHMgKQorICoKKyAqICNkZWZpbmUgZHJtX3gJCW1nYV8jI3gKKyAqIFxlbmRjb2RlCisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFRodSBOb3YgMjMgMDM6MTA6NTAgMjAwMCBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NvcmUuaCIKKworLyoqIElvY3RsIHRhYmxlICovCitkcm1faW9jdGxfZGVzY190CQkgIGRybV9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9WRVJTSU9OKV0gICAgICAgPSB7IGRybV92ZXJzaW9uLCAgICAgMCwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9VTklRVUUpXSAgICA9IHsgZHJtX2dldHVuaXF1ZSwgICAwLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX01BR0lDKV0gICAgID0geyBkcm1fZ2V0bWFnaWMsICAgIDAsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9JUlFfQlVTSUQpXSAgICAgPSB7IGRybV9pcnFfYnlfYnVzaWQsIDAsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfTUFQKV0gICAgICAgPSB7IGRybV9nZXRtYXAsICAgICAgMCwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DTElFTlQpXSAgICA9IHsgZHJtX2dldGNsaWVudCwgICAwLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NUQVRTKV0gICAgID0geyBkcm1fZ2V0c3RhdHMsICAgIDAsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfVkVSU0lPTildICAgPSB7IGRybV9zZXR2ZXJzaW9uLCAgMCwgMSB9LAorCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1VOSVFVRSldICAgID0geyBkcm1fc2V0dW5pcXVlLCAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9CTE9DSyldICAgICAgICAgPSB7IGRybV9ub29wLCAgICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VOQkxPQ0spXSAgICAgICA9IHsgZHJtX25vb3AsICAgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQVVUSF9NQUdJQyldICAgID0geyBkcm1fYXV0aG1hZ2ljLCAgIDEsIDEgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9NQVApXSAgICAgICA9IHsgZHJtX2FkZG1hcCwgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fTUFQKV0gICAgICAgID0geyBkcm1fcm1tYXAsICAgICAgIDEsIDAgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgpXSA9IHsgZHJtX3NldHNhcmVhY3R4LCAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCldID0geyBkcm1fZ2V0c2FyZWFjdHgsIDEsIDAgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9DVFgpXSAgICAgICA9IHsgZHJtX2FkZGN0eCwgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fQ1RYKV0gICAgICAgID0geyBkcm1fcm1jdHgsICAgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NT0RfQ1RYKV0gICAgICAgPSB7IGRybV9tb2RjdHgsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DVFgpXSAgICAgICA9IHsgZHJtX2dldGN0eCwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU1dJVENIX0NUWCldICAgID0geyBkcm1fc3dpdGNoY3R4LCAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9ORVdfQ1RYKV0gICAgICAgPSB7IGRybV9uZXdjdHgsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JFU19DVFgpXSAgICAgICA9IHsgZHJtX3Jlc2N0eCwgICAgICAxLCAwIH0sCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfRFJBVyldICAgICAgPSB7IGRybV9hZGRkcmF3LCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0RSQVcpXSAgICAgICA9IHsgZHJtX3JtZHJhdywgICAgICAxLCAxIH0sCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9MT0NLKV0JICAgICAgICA9IHsgZHJtX2xvY2ssICAgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVU5MT0NLKV0gICAgICAgID0geyBkcm1fdW5sb2NrLCAgICAgIDEsIDAgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldICAgICAgICA9IHsgZHJtX25vb3AsICAgICAgMSwgMCB9LAorCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0JVRlMpXSAgICAgID0geyBkcm1fYWRkYnVmcywgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVJLX0JVRlMpXSAgICAgPSB7IGRybV9tYXJrYnVmcywgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0lORk9fQlVGUyldICAgICA9IHsgZHJtX2luZm9idWZzLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTUFQX0JVRlMpXSAgICAgID0geyBkcm1fbWFwYnVmcywgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9GUkVFX0JVRlMpXSAgICAgPSB7IGRybV9mcmVlYnVmcywgICAgMSwgMCB9LAorCS8qIFRoZSBEUk1fSU9DVExfRE1BIGlvY3RsIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBkcml2ZXIuICovCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9DT05UUk9MKV0gICAgICAgPSB7IGRybV9jb250cm9sLCAgICAgMSwgMSB9LAorCisjaWYgX19PU19IQVNfQUdQCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FDUVVJUkUpXSAgID0geyBkcm1fYWdwX2FjcXVpcmUsIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfUkVMRUFTRSldICAgPSB7IGRybV9hZ3BfcmVsZWFzZSwgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9FTkFCTEUpXSAgICA9IHsgZHJtX2FncF9lbmFibGUsICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0lORk8pXSAgICAgID0geyBkcm1fYWdwX2luZm8sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfQUxMT0MpXSAgICAgPSB7IGRybV9hZ3BfYWxsb2MsICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9GUkVFKV0gICAgICA9IHsgZHJtX2FncF9mcmVlLCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0JJTkQpXSAgICAgID0geyBkcm1fYWdwX2JpbmQsICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfVU5CSU5EKV0gICAgPSB7IGRybV9hZ3BfdW5iaW5kLCAgMSwgMSB9LAorI2VuZGlmCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19BTExPQyldICAgICAgPSB7IGRybV9zZ19hbGxvYywgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0ZSRUUpXSAgICAgICA9IHsgZHJtX3NnX2ZyZWUsICAgICAxLCAxIH0sCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9XQUlUX1ZCTEFOSyldICAgPSB7IGRybV93YWl0X3ZibGFuaywgMCwgMCB9LAorfTsKKworI2RlZmluZSBEUklWRVJfSU9DVExfQ09VTlQJRFJNX0FSUkFZX1NJWkUoIGRybV9pb2N0bHMgKQorCisvKioKKyAqIFRha2UgZG93biB0aGUgRFJNIGRldmljZS4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqIEZyZWVzIGV2ZXJ5IHJlc291cmNlIGluIFxwIGRldi4KKyAqCisgKiBcc2EgZHJtX2RldmljZSBhbmQgc2V0dXAoKS4KKyAqLworaW50IGRybV90YWtlZG93biggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9tYWdpY19lbnRyeV90ICpwdCwgKm5leHQ7CisJZHJtX21hcF90ICptYXA7CisJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqbGlzdF9uZXh0OworCWRybV92bWFfZW50cnlfdCAqdm1hLCAqdm1hX25leHQ7CisJaW50IGk7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWlmIChkZXYtPmRyaXZlci0+cHJldGFrZWRvd24pCisJICBkZXYtPmRyaXZlci0+cHJldGFrZWRvd24oZGV2KTsKKworCWlmIChkZXYtPnVuaXF1ZSkgeworCQlkcm1fZnJlZShkZXYtPnVuaXF1ZSwgc3RybGVuKGRldi0+dW5pcXVlKSArIDEsIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT51bmlxdWUgPSBOVUxMOworCQlkZXYtPnVuaXF1ZV9sZW4gPSAwOworCX0KKworCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIGRybV9pcnFfdW5pbnN0YWxsKCBkZXYgKTsKKworCWRvd24oICZkZXYtPnN0cnVjdF9zZW0gKTsKKwlkZWxfdGltZXIoICZkZXYtPnRpbWVyICk7CisKKwkJCQkvKiBDbGVhciBwaWQgbGlzdCAqLworCWZvciAoIGkgPSAwIDsgaSA8IERSTV9IQVNIX1NJWkUgOyBpKysgKSB7CisJCWZvciAoIHB0ID0gZGV2LT5tYWdpY2xpc3RbaV0uaGVhZCA7IHB0IDsgcHQgPSBuZXh0ICkgeworCQkJbmV4dCA9IHB0LT5uZXh0OworCQkJZHJtX2ZyZWUoIHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9NQUdJQyApOworCQl9CisJCWRldi0+bWFnaWNsaXN0W2ldLmhlYWQgPSBkZXYtPm1hZ2ljbGlzdFtpXS50YWlsID0gTlVMTDsKKwl9CisKKwkJCQkvKiBDbGVhciBBR1AgaW5mb3JtYXRpb24gKi8KKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7CisJCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCQlkcm1fYWdwX21lbV90ICpuZXh0ZTsKKworCQkJCS8qIFJlbW92ZSBBR1AgcmVzb3VyY2VzLCBidXQgbGVhdmUgZGV2LT5hZ3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YWN0IHVudGlsIGRydl9jbGVhbnVwIGlzIGNhbGxlZC4gKi8KKwkJZm9yICggZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5IDsgZW50cnkgOyBlbnRyeSA9IG5leHRlICkgeworCQkJbmV4dGUgPSBlbnRyeS0+bmV4dDsKKwkJCWlmICggZW50cnktPmJvdW5kICkgZHJtX3VuYmluZF9hZ3AoIGVudHJ5LT5tZW1vcnkgKTsKKwkJCWRybV9mcmVlX2FncCggZW50cnktPm1lbW9yeSwgZW50cnktPnBhZ2VzICk7CisJCQlkcm1fZnJlZSggZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTICk7CisJCX0KKwkJZGV2LT5hZ3AtPm1lbW9yeSA9IE5VTEw7CisKKwkJaWYgKCBkZXYtPmFncC0+YWNxdWlyZWQgKSBkcm1fYWdwX2RvX3JlbGVhc2UoZGV2KTsKKworCQlkZXYtPmFncC0+YWNxdWlyZWQgPSAwOworCQlkZXYtPmFncC0+ZW5hYmxlZCAgPSAwOworCX0KKworCQkJCS8qIENsZWFyIHZtYSBsaXN0IChvbmx5IGJ1aWx0IGZvciBkZWJ1Z2dpbmcpICovCisJaWYgKCBkZXYtPnZtYWxpc3QgKSB7CisJCWZvciAoIHZtYSA9IGRldi0+dm1hbGlzdCA7IHZtYSA7IHZtYSA9IHZtYV9uZXh0ICkgeworCQkJdm1hX25leHQgPSB2bWEtPm5leHQ7CisJCQlkcm1fZnJlZSggdm1hLCBzaXplb2YoKnZtYSksIERSTV9NRU1fVk1BUyApOworCQl9CisJCWRldi0+dm1hbGlzdCA9IE5VTEw7CisJfQorCisJaWYoIGRldi0+bWFwbGlzdCApIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKCBsaXN0LCBsaXN0X25leHQsICZkZXYtPm1hcGxpc3QtPmhlYWQgKSB7CisJCQlyX2xpc3QgPSAoZHJtX21hcF9saXN0X3QgKilsaXN0OworCisJCQlpZiAoICggbWFwID0gcl9saXN0LT5tYXAgKSApIHsKKwkJCQlzd2l0Y2ggKCBtYXAtPnR5cGUgKSB7CisJCQkJY2FzZSBfRFJNX1JFR0lTVEVSUzoKKwkJCQljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgorCQkJCQlpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgeworCQkJCQkJaWYgKCBtYXAtPm10cnIgPj0gMCApIHsKKwkJCQkJCQlpbnQgcmV0Y29kZTsKKwkJCQkJCQlyZXRjb2RlID0gbXRycl9kZWwoIG1hcC0+bXRyciwKKwkJCQkJCQkJCSAgICBtYXAtPm9mZnNldCwKKwkJCQkJCQkJCSAgICBtYXAtPnNpemUgKTsKKwkJCQkJCQlEUk1fREVCVUcoICJtdHJyX2RlbD0lZFxuIiwgcmV0Y29kZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWRybV9pb3JlbWFwZnJlZSggbWFwLT5oYW5kbGUsIG1hcC0+c2l6ZSwgZGV2ICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgX0RSTV9TSE06CisJCQkJCXZmcmVlKG1hcC0+aGFuZGxlKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIF9EUk1fQUdQOgorCQkJCQkvKiBEbyBub3RoaW5nIGhlcmUsIGJlY2F1c2UgdGhpcyBpcyBhbGwKKwkJCQkJICogaGFuZGxlZCBpbiB0aGUgQUdQL0dBUlQgZHJpdmVyLgorCQkJCQkgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQkJCQkvKiBIYW5kbGUgaXQgKi8KKwkJCQkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpICYmIGRldi0+c2cpIHsKKwkJCQkJCWRybV9zZ19jbGVhbnVwKGRldi0+c2cpOworCQkJCQkJZGV2LT5zZyA9IE5VTEw7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOworCQkJfQorCQkJbGlzdF9kZWwoIGxpc3QgKTsKKwkJCWRybV9mcmVlKHJfbGlzdCwgc2l6ZW9mKCpyX2xpc3QpLCBEUk1fTUVNX01BUFMpOworIAkJfQorCQlkcm1fZnJlZShkZXYtPm1hcGxpc3QsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKKwkJZGV2LT5tYXBsaXN0ID0gTlVMTDsKKyAJfQorCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSAmJiBkZXYtPnF1ZXVlbGlzdCApIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgZGV2LT5xdWV1ZV9jb3VudCA7IGkrKyApIHsKKwkJCWlmICggZGV2LT5xdWV1ZWxpc3RbaV0gKSB7CisJCQkJZHJtX2ZyZWUoIGRldi0+cXVldWVsaXN0W2ldLAorCQkJCQkgIHNpemVvZigqZGV2LT5xdWV1ZWxpc3RbMF0pLAorCQkJCQkgIERSTV9NRU1fUVVFVUVTICk7CisJCQkJZGV2LT5xdWV1ZWxpc3RbaV0gPSBOVUxMOworCQkJfQorCQl9CisJCWRybV9mcmVlKCBkZXYtPnF1ZXVlbGlzdCwKKwkJCSAgZGV2LT5xdWV1ZV9zbG90cyAqIHNpemVvZigqZGV2LT5xdWV1ZWxpc3QpLAorCQkJICBEUk1fTUVNX1FVRVVFUyApOworCQlkZXYtPnF1ZXVlbGlzdCA9IE5VTEw7CisJfQorCWRldi0+cXVldWVfY291bnQgPSAwOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCQlkcm1fZG1hX3Rha2Vkb3duKCBkZXYgKTsKKworCWlmICggZGV2LT5sb2NrLmh3X2xvY2sgKSB7CisJCWRldi0+c2lnZGF0YS5sb2NrID0gZGV2LT5sb2NrLmh3X2xvY2sgPSBOVUxMOyAvKiBTSE0gcmVtb3ZlZCAqLworCQlkZXYtPmxvY2suZmlscCA9IE5VTEw7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSggJmRldi0+bG9jay5sb2NrX3F1ZXVlICk7CisJfQorCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uLiBDYWxsZWQgdmlhIGluaXRfbW9kdWxlIGF0IG1vZHVsZSBsb2FkIHRpbWUsIG9yIHZpYQorICogbGludXgvaW5pdC9tYWluLmMgKHRoaXMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgb2YgZHJtX2RldmljZSBzdHJ1Y3R1cmVzLCBhbmQgYXR0ZW1wdHMgdG8KKyAqIGluaXRpYWxpemUgYWxsIGF2YWlsYWJsZSBkZXZpY2VzLCB1c2luZyBjb25zZWN1dGl2ZSBtaW5vcnMsIHJlZ2lzdGVyaW5nIHRoZQorICogc3R1YnMgYW5kIGluaXRpYWxpemluZyB0aGUgQUdQIGRldmljZS4KKyAqIAorICogRXhwYW5kcyB0aGUgXGMgRFJJVkVSX1BSRUlOSVQgYW5kIFxjIERSSVZFUl9QT1NUX0lOSVQgbWFjcm9zIGJlZm9yZSBhbmQKKyAqIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBmb3IgZHJpdmVyIGN1c3RvbWl6YXRpb24uCisgKi8KK2ludCBkcm1faW5pdCggc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2aWNlX2lkICpwaWQ7CisJaW50IGk7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWRybV9tZW1faW5pdCgpOworCisJZm9yIChpPTA7IGRyaXZlci0+cGNpX2RyaXZlci5pZF90YWJsZVtpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXBpZCA9IChzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKSZkcml2ZXItPnBjaV9kcml2ZXIuaWRfdGFibGVbaV07CisJCQorCQlwZGV2PU5VTEw7CisJCS8qIHBhc3MgYmFjayBpbiBwZGV2IHRvIGFjY291bnQgZm9yIG11bHRpcGxlIGlkZW50aWNhbCBjYXJkcyAqLwkJCisJCXdoaWxlICgocGRldiA9IHBjaV9nZXRfc3Vic3lzKHBpZC0+dmVuZG9yLCBwaWQtPmRldmljZSwgcGlkLT5zdWJ2ZW5kb3IsIHBpZC0+c3ViZGV2aWNlLCBwZGV2KSkgIT0gTlVMTCkgeworCQkJLyogc3RlYWx0aCBtb2RlIHJlcXVpcmVzIGEgbWFudWFsIHByb2JlICovCisJCQlwY2lfZGV2X2dldChwZGV2KTsKKwkJCWRybV9nZXRfZGV2KHBkZXYsIHBpZCwgZHJpdmVyKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2luaXQpOworCisvKioKKyAqIENhbGxlZCB2aWEgY2xlYW51cF9tb2R1bGUoKSBhdCBtb2R1bGUgdW5sb2FkIHRpbWUuCisgKgorICogQ2xlYW5zIHVwIGFsbCBEUk0gZGV2aWNlLCBjYWxsaW5nIHRha2Vkb3duKCkuCisgKiAKKyAqIFxzYSBkcm1faW5pdCgpLgorICovCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cCggZHJtX2RldmljZV90ICpkZXYgKQoreworCURSTV9ERUJVRyggIlxuIiApOworCisJaWYgKCFkZXYpIHsKKwkJRFJNX0VSUk9SKCJjbGVhbnVwIGNhbGxlZCBubyBkZXZcbiIpOworCQlyZXR1cm47CisJfQorCisJZHJtX3Rha2Vkb3duKCBkZXYgKTsJCisKKwlkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRldiApOworCQorCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpICYmIGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJgorCSAgICBkZXYtPmFncCAmJiBkZXYtPmFncC0+YWdwX210cnIgPj0gMCkgeworCQlpbnQgcmV0dmFsOworCQlyZXR2YWwgPSBtdHJyX2RlbCggZGV2LT5hZ3AtPmFncF9tdHJyLAorCQkJCSAgIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX2Jhc2UsCisJCQkJICAgZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfc2l6ZSoxMDI0KjEwMjQgKTsKKwkJRFJNX0RFQlVHKCAibXRycl9kZWw9JWRcbiIsIHJldHZhbCApOworCX0KKwkKKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwICkgeworCQlkcm1fZnJlZSggZGV2LT5hZ3AsIHNpemVvZigqZGV2LT5hZ3ApLCBEUk1fTUVNX0FHUExJU1RTICk7CisJCWRldi0+YWdwID0gTlVMTDsKKwl9CisKKwlpZiAoZGV2LT5kcml2ZXItPnBvc3RjbGVhbnVwKQorCQlkZXYtPmRyaXZlci0+cG9zdGNsZWFudXAoZGV2KTsKKwkKKwlkcm1fcHV0X2hlYWQoJmRldi0+cHJpbWFyeSk7CisJaWYgKCBkcm1fcHV0X2RldihkZXYpICkKKwkJRFJNX0VSUk9SKCAiQ2Fubm90IHVubG9hZCBtb2R1bGVcbiIgKTsKK30KKwordm9pZCBkcm1fZXhpdCAoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKK3sKKwlpbnQgaTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7CisJZHJtX2hlYWRfdCAqaGVhZDsKKwkKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWZvciAoaSA9IDA7IGkgPCBkcm1fY2FyZHNfbGltaXQ7IGkrKykgeworCQloZWFkID0gZHJtX2hlYWRzW2ldOworCQlpZiAoIWhlYWQpCisJCQljb250aW51ZTsKKwkJaWYgKCFoZWFkLT5kZXYpCisJCQljb250aW51ZTsKKwkJaWYgKGhlYWQtPmRldi0+ZHJpdmVyIT1kcml2ZXIpCisJCQljb250aW51ZTsKKwkJZGV2PWhlYWQtPmRldjsKKwl9CisJaWYgKGRldikgeworCQkvKiByZWxlYXNlIHRoZSBwY2kgZHJpdmVyICovCisJCWlmIChkZXYtPnBkZXYpCisJCQlwY2lfZGV2X3B1dChkZXYtPnBkZXYpOworCQlkcm1fY2xlYW51cChkZXYpOworCX0KKwlEUk1fSU5GTyggIk1vZHVsZSB1bmxvYWRlZFxuIiApOworfQorRVhQT1JUX1NZTUJPTChkcm1fZXhpdCk7CisKKy8qKiBGaWxlIG9wZXJhdGlvbnMgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcm1fc3R1Yl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuICA9IGRybV9zdHViX29wZW4KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRybV9jb3JlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwkKKwlkcm1fY2FyZHNfbGltaXQgPSAoZHJtX2NhcmRzX2xpbWl0IDwgRFJNX01BWF9NSU5PUiArIDEgPyBkcm1fY2FyZHNfbGltaXQgOiBEUk1fTUFYX01JTk9SICsgMSk7CisJZHJtX2hlYWRzID0gZHJtX2NhbGxvYyhkcm1fY2FyZHNfbGltaXQsCisJCQkJc2l6ZW9mKCpkcm1faGVhZHMpLCBEUk1fTUVNX1NUVUIpOworCWlmKCFkcm1faGVhZHMpIAorCQlnb3RvIGVycl9wMTsKKwkKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIsICZkcm1fc3R1Yl9mb3BzKSkKKwkJZ290byBlcnJfcDE7CisJCisJZHJtX2NsYXNzID0gZHJtX3N5c2ZzX2NyZWF0ZShUSElTX01PRFVMRSwgImRybSIpOworCWlmIChJU19FUlIoZHJtX2NsYXNzKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJEUk06IEVycm9yIGNyZWF0aW5nIGRybSBjbGFzcy5cbiIpOworCQlyZXQgPSBQVFJfRVJSKGRybV9jbGFzcyk7CisJCWdvdG8gZXJyX3AyOworCX0KKworCWRybV9wcm9jX3Jvb3QgPSBjcmVhdGVfcHJvY19lbnRyeSgiZHJpIiwgU19JRkRJUiwgTlVMTCk7CisJaWYgKCFkcm1fcHJvY19yb290KSB7CisJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmlcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBlcnJfcDM7CisJfQorCQkKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzXG4iLAorCQlDT1JFX05BTUUsIENPUkVfTUFKT1IsIENPUkVfTUlOT1IsIENPUkVfUEFUQ0hMRVZFTCwKKwkJQ09SRV9EQVRFKTsKKwlyZXR1cm4gMDsKK2Vycl9wMzoKKwlkcm1fc3lzZnNfZGVzdHJveShkcm1fY2xhc3MpOworZXJyX3AyOgorCXVucmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIpOworCWRybV9mcmVlKGRybV9oZWFkcywgc2l6ZW9mKCpkcm1faGVhZHMpICogZHJtX2NhcmRzX2xpbWl0LCBEUk1fTUVNX1NUVUIpOworZXJyX3AxOgkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJtX2NvcmVfZXhpdCAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZHJpIiwgTlVMTCk7CisJZHJtX3N5c2ZzX2Rlc3Ryb3koZHJtX2NsYXNzKTsKKworCXVucmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIpOworCisJZHJtX2ZyZWUoZHJtX2hlYWRzLCBzaXplb2YoKmRybV9oZWFkcykgKgorCQkJCWRybV9jYXJkc19saW1pdCwgRFJNX01FTV9TVFVCKTsKK30KKworCittb2R1bGVfaW5pdCggZHJtX2NvcmVfaW5pdCApOworbW9kdWxlX2V4aXQoIGRybV9jb3JlX2V4aXQgKTsKKworCisvKioKKyAqIEdldCB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fdmVyc2lvbiBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBGaWxscyBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBccCBhcmcuCisgKi8KK2ludCBkcm1fdmVyc2lvbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3ZlcnNpb25fdCB2ZXJzaW9uOworCWludCByZXQ7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmdmVyc2lvbiwgYXJncCwgc2l6ZW9mKHZlcnNpb24pICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHZlcnNpb24gaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHBlcnNvbmFsaXR5IG1vZHVsZSB2ZXJzaW9uICovCisJaWYgKChyZXQgPSBkZXYtPmRyaXZlci0+dmVyc2lvbigmdmVyc2lvbikpKQorCQlyZXR1cm4gcmV0OworCQkKKwlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiogCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSBwcm9jZXNzIHBlcmZvcm1zIGFuIGlvY3RsIG9uIC9kZXYvZHJtLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBMb29rcyB1cCB0aGUgaW9jdGwgZnVuY3Rpb24gaW4gdGhlIDo6aW9jdGxzIHRhYmxlLCBjaGVja2luZyBmb3Igcm9vdAorICogcHJldmlsZWdlcyBpZiBzbyByZXF1aXJlZCwgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb24uCisgKi8KK2ludCBkcm1faW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faW9jdGxfZGVzY190ICppb2N0bDsKKwlkcm1faW9jdGxfdCAqZnVuYzsKKwl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKKwlpbnQgcmV0Y29kZSA9IC1FSU5WQUw7CisKKwlhdG9taWNfaW5jKCAmZGV2LT5pb2N0bF9jb3VudCApOworCWF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfSU9DVExTXSApOworCSsrcHJpdi0+aW9jdGxfY291bnQ7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQsIGNtZD0weCUwMngsIG5yPTB4JTAyeCwgZGV2IDB4JWx4LCBhdXRoPSVkXG4iLAorCQkgICBjdXJyZW50LT5waWQsIGNtZCwgbnIsIChsb25nKW9sZF9lbmNvZGVfZGV2KHByaXYtPmhlYWQtPmRldmljZSksIAorCQkgICBwcml2LT5hdXRoZW50aWNhdGVkICk7CisJCisJaWYgKG5yIDwgRFJJVkVSX0lPQ1RMX0NPVU5UKQorCQlpb2N0bCA9ICZkcm1faW9jdGxzW25yXTsKKwllbHNlIGlmICgobnIgPj0gRFJNX0NPTU1BTkRfQkFTRSkgJiYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIGRldi0+ZHJpdmVyLT5udW1faW9jdGxzKSkKKwkJaW9jdGwgPSAmZGV2LT5kcml2ZXItPmlvY3Rsc1tuciAtIERSTV9DT01NQU5EX0JBU0VdOworCWVsc2UKKwkJZ290byBlcnJfaTE7CisJCisJZnVuYyA9IGlvY3RsLT5mdW5jOworCS8qIGlzIHRoZXJlIGEgbG9jYWwgb3ZlcnJpZGU/ICovCisJaWYgKChuciA9PSBEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0RNQSkpICYmIGRldi0+ZHJpdmVyLT5kbWFfaW9jdGwpCisJCWZ1bmMgPSBkZXYtPmRyaXZlci0+ZG1hX2lvY3RsOworCQorCWlmICggIWZ1bmMgKSB7CisJCURSTV9ERUJVRyggIm5vIGZ1bmN0aW9uXG4iICk7CisJCXJldGNvZGUgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoICggaW9jdGwtPnJvb3Rfb25seSAmJiAhY2FwYWJsZSggQ0FQX1NZU19BRE1JTiApICl8fAorCQkgICAgKCBpb2N0bC0+YXV0aF9uZWVkZWQgJiYgIXByaXYtPmF1dGhlbnRpY2F0ZWQgKSApIHsKKwkJcmV0Y29kZSA9IC1FQUNDRVM7CisJfSBlbHNlIHsKKwkJcmV0Y29kZSA9IGZ1bmMoIGlub2RlLCBmaWxwLCBjbWQsIGFyZyApOworCX0KKwkKK2Vycl9pMToKKwlhdG9taWNfZGVjKCAmZGV2LT5pb2N0bF9jb3VudCApOworCWlmIChyZXRjb2RlKSBEUk1fREVCVUcoICJyZXQgPSAleFxuIiwgcmV0Y29kZSk7CisJcmV0dXJuIHJldGNvZGU7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9pb2N0bCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY3OTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCkBAIC0wLDAgKzEsNDUxIEBACisvKioKKyAqIFxmaWxlIGRybV9mb3BzLmggCisgKiBGaWxlIG9wZXJhdGlvbnMgZm9yIERSTQorICogCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBEYXJ5bGwgU3RyYXVzcyA8ZGFyeWxsQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMDg6NTg6MzEgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKK3N0YXRpYyBpbnQgZHJtX3NldHVwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmIChkZXYtPmRyaXZlci0+cHJlc2V0dXApCisJeworCQlyZXQ9ZGV2LT5kcml2ZXItPnByZXNldHVwKGRldik7CisJCWlmIChyZXQhPTApIAorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlhdG9taWNfc2V0KCAmZGV2LT5pb2N0bF9jb3VudCwgMCApOworCWF0b21pY19zZXQoICZkZXYtPnZtYV9jb3VudCwgMCApOworCWRldi0+YnVmX3VzZSA9IDA7CisJYXRvbWljX3NldCggJmRldi0+YnVmX2FsbG9jLCAwICk7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCisJeworCQlpID0gZHJtX2RtYV9zZXR1cCggZGV2ICk7CisJCWlmICggaSA8IDAgKQorCQkJcmV0dXJuIGk7CisJfQorCisJZm9yICggaSA9IDAgOyBpIDwgRFJNX0FSUkFZX1NJWkUoZGV2LT5jb3VudHMpIDsgaSsrICkKKwkJYXRvbWljX3NldCggJmRldi0+Y291bnRzW2ldLCAwICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBEUk1fSEFTSF9TSVpFIDsgaSsrICkgeworCQlkZXYtPm1hZ2ljbGlzdFtpXS5oZWFkID0gTlVMTDsKKwkJZGV2LT5tYWdpY2xpc3RbaV0udGFpbCA9IE5VTEw7CisJfQorCisJZGV2LT5tYXBsaXN0ID0gZHJtX2FsbG9jKHNpemVvZigqZGV2LT5tYXBsaXN0KSwKKwkJCQkgIERSTV9NRU1fTUFQUyk7CisJaWYoZGV2LT5tYXBsaXN0ID09IE5VTEwpIHJldHVybiAtRU5PTUVNOworCW1lbXNldChkZXYtPm1hcGxpc3QsIDAsIHNpemVvZigqZGV2LT5tYXBsaXN0KSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdC0+aGVhZCk7CisKKwlkZXYtPmN0eGxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpkZXYtPmN0eGxpc3QpLAorCQkJCSAgRFJNX01FTV9DVFhMSVNUKTsKKwlpZihkZXYtPmN0eGxpc3QgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldi0+Y3R4bGlzdCwgMCwgc2l6ZW9mKCpkZXYtPmN0eGxpc3QpKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5jdHhsaXN0LT5oZWFkKTsKKworCWRldi0+dm1hbGlzdCA9IE5VTEw7CisJZGV2LT5zaWdkYXRhLmxvY2sgPSBkZXYtPmxvY2suaHdfbG9jayA9IE5VTEw7CisJaW5pdF93YWl0cXVldWVfaGVhZCggJmRldi0+bG9jay5sb2NrX3F1ZXVlICk7CisJZGV2LT5xdWV1ZV9jb3VudCA9IDA7CisJZGV2LT5xdWV1ZV9yZXNlcnZlZCA9IDA7CisJZGV2LT5xdWV1ZV9zbG90cyA9IDA7CisJZGV2LT5xdWV1ZWxpc3QgPSBOVUxMOworCWRldi0+aXJxX2VuYWJsZWQgPSAwOworCWRldi0+Y29udGV4dF9mbGFnID0gMDsKKwlkZXYtPmludGVycnVwdF9mbGFnID0gMDsKKwlkZXYtPmRtYV9mbGFnID0gMDsKKwlkZXYtPmxhc3RfY29udGV4dCA9IDA7CisJZGV2LT5sYXN0X3N3aXRjaCA9IDA7CisJZGV2LT5sYXN0X2NoZWNrZWQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoICZkZXYtPmNvbnRleHRfd2FpdCApOworCWRldi0+aWZfdmVyc2lvbiA9IDA7CisKKwlkZXYtPmN0eF9zdGFydCA9IDA7CisJZGV2LT5sY2tfc3RhcnQgPSAwOworCisJZGV2LT5idWZfcnAgPSBkZXYtPmJ1ZjsKKwlkZXYtPmJ1Zl93cCA9IGRldi0+YnVmOworCWRldi0+YnVmX2VuZCA9IGRldi0+YnVmICsgRFJNX0JTWjsKKwlkZXYtPmJ1Zl9hc3luYyA9IE5VTEw7CisJaW5pdF93YWl0cXVldWVfaGVhZCggJmRldi0+YnVmX3JlYWRlcnMgKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmZGV2LT5idWZfd3JpdGVycyApOworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKgorCSAqIFRoZSBrZXJuZWwncyBjb250ZXh0IGNvdWxkIGJlIGNyZWF0ZWQgaGVyZSwgYnV0IGlzIG5vdyBjcmVhdGVkCisJICogaW4gZHJtX2RtYV9lbnF1ZXVlLglUaGlzIGlzIG1vcmUgcmVzb3VyY2UtZWZmaWNpZW50IGZvcgorCSAqIGhhcmR3YXJlIHRoYXQgZG9lcyBub3QgZG8gRE1BLCBidXQgbWF5IG1lYW4gdGhhdAorCSAqIGRybV9zZWxlY3RfcXVldWUgZmFpbHMgYmV0d2VlbiB0aGUgdGltZSB0aGUgaW50ZXJydXB0IGlzCisJICogaW5pdGlhbGl6ZWQgYW5kIHRoZSB0aW1lIHRoZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkLgorCSAqLworCWlmIChkZXYtPmRyaXZlci0+cG9zdHNldHVwKQorCQlkZXYtPmRyaXZlci0+cG9zdHNldHVwKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBPcGVuIGZpbGUuCisgKiAKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogU2VhcmNoZXMgdGhlIERSTSBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBtaW5vciBudW1iZXIsIGNhbGxzIG9wZW5faGVscGVyKCksIGFuZAorICogaW5jcmVtZW50cyB0aGUgZGV2aWNlIG9wZW4gY291bnQuIElmIHRoZSBvcGVuIGNvdW50IHdhcyBwcmV2aW91cyBhdCB6ZXJvLAorICogaS5lLiwgaXQncyB0aGUgZmlyc3QgdGhhdCB0aGUgZGV2aWNlIGlzIG9wZW4sIHRoZW4gY2FsbHMgc2V0dXAoKS4KKyAqLworaW50IGRybV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYgKCEoKG1pbm9yID49IDApICYmIChtaW5vciA8IGRybV9jYXJkc19saW1pdCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkJCisJaWYgKCFkcm1faGVhZHNbbWlub3JdKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghKGRldiA9IGRybV9oZWFkc1ttaW5vcl0tPmRldikpCisJCXJldHVybiAtRU5PREVWOworCQorCXJldGNvZGUgPSBkcm1fb3Blbl9oZWxwZXIoIGlub2RlLCBmaWxwLCBkZXYgKTsKKwlpZiAoICFyZXRjb2RlICkgeworCQlhdG9taWNfaW5jKCAmZGV2LT5jb3VudHNbX0RSTV9TVEFUX09QRU5TXSApOworCQlzcGluX2xvY2soICZkZXYtPmNvdW50X2xvY2sgKTsKKwkJaWYgKCAhZGV2LT5vcGVuX2NvdW50KysgKSB7CisJCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQkJcmV0dXJuIGRybV9zZXR1cCggZGV2ICk7CisJCX0KKwkJc3Bpbl91bmxvY2soICZkZXYtPmNvdW50X2xvY2sgKTsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX29wZW4pOworCisvKioKKyAqIFJlbGVhc2UgZmlsZS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSBoYXJkd2FyZSBsb2NrIGlzIGhlbGQgdGhlbiBmcmVlIGl0LCBhbmQgdGFrZSBpdCBhZ2FpbiBmb3IgdGhlIGtlcm5lbAorICogY29udGV4dCBzaW5jZSBpdCdzIG5lY2Vzc2FyeSB0byByZWNsYWltIGJ1ZmZlcnMuIFVubGluayB0aGUgZmlsZSBwcml2YXRlCisgKiBkYXRhIGZyb20gaXRzIGxpc3QgYW5kIGZyZWUgaXQuIERlY3JlYXNlcyB0aGUgb3BlbiBjb3VudCBhbmQgaWYgaXQgcmVhY2hlcworICogemVybyBjYWxscyB0YWtlZG93bigpLgorICovCitpbnQgZHJtX3JlbGVhc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2OworCWludCByZXRjb2RlID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCisJRFJNX0RFQlVHKCAib3Blbl9jb3VudCA9ICVkXG4iLCBkZXYtPm9wZW5fY291bnQgKTsKKworCWlmIChkZXYtPmRyaXZlci0+cHJlcmVsZWFzZSkKKwkJZGV2LT5kcml2ZXItPnByZXJlbGVhc2UoZGV2LCBmaWxwKTsKKworCS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICogQmVnaW4gaW5saW5lIGRybV9yZWxlYXNlCisJICovCisKKwlEUk1fREVCVUcoICJwaWQgPSAlZCwgZGV2aWNlID0gMHglbHgsIG9wZW5fY291bnQgPSAlZFxuIiwKKwkJICAgY3VycmVudC0+cGlkLCAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpLCBkZXYtPm9wZW5fY291bnQgKTsKKworCWlmICggcHJpdi0+bG9ja19jb3VudCAmJiBkZXYtPmxvY2suaHdfbG9jayAmJgorCSAgICAgX0RSTV9MT0NLX0lTX0hFTEQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spICYmCisJICAgICBkZXYtPmxvY2suZmlscCA9PSBmaWxwICkgeworCQlEUk1fREVCVUcoICJGaWxlICVwIHJlbGVhc2VkLCBmcmVlaW5nIGxvY2sgZm9yIGNvbnRleHQgJWRcbiIsCisJCQlmaWxwLAorCQkJX0RSTV9MT0NLSU5HX0NPTlRFWFQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spICk7CisJCQorCQlpZiAoZGV2LT5kcml2ZXItPnJlbGVhc2UpCisJCQlkZXYtPmRyaXZlci0+cmVsZWFzZShkZXYsIGZpbHApOworCisJCWRybV9sb2NrX2ZyZWUoIGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCV9EUk1fTE9DS0lOR19DT05URVhUKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSApOworCisJCQkJLyogRklYTUU6IG1heSByZXF1aXJlIGhlYXZ5LWhhbmRlZCByZXNldCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBhdCB0aGlzIHBvaW50LCBwb3NzaWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgdmlhIGEgY2FsbGJhY2sgdG8gdGhlIFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLiAqLworCX0KKwllbHNlIGlmICggZGV2LT5kcml2ZXItPnJlbGVhc2UgJiYgcHJpdi0+bG9ja19jb3VudCAmJiBkZXYtPmxvY2suaHdfbG9jayApIHsKKwkJLyogVGhlIGxvY2sgaXMgcmVxdWlyZWQgdG8gcmVjbGFpbSBidWZmZXJzICovCisJCURFQ0xBUkVfV0FJVFFVRVVFKCBlbnRyeSwgY3VycmVudCApOworCisJCWFkZF93YWl0X3F1ZXVlKCAmZGV2LT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSApOworCQlmb3IgKDs7KSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoICFkZXYtPmxvY2suaHdfbG9jayApIHsKKwkJCQkvKiBEZXZpY2UgaGFzIGJlZW4gdW5yZWdpc3RlcmVkICovCisJCQkJcmV0Y29kZSA9IC1FSU5UUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggZHJtX2xvY2tfdGFrZSggJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCQkgICAgIERSTV9LRVJORUxfQ09OVEVYVCApICkgeworCQkJCWRldi0+bG9jay5maWxwCSAgICA9IGZpbHA7CisJCQkJZGV2LT5sb2NrLmxvY2tfdGltZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfTE9DS1NdICk7CisJCQkJYnJlYWs7CS8qIEdvdCBsb2NrICovCisJCQl9CisJCQkJLyogQ29udGVudGlvbiAqLworCQkJc2NoZWR1bGUoKTsKKwkJCWlmICggc2lnbmFsX3BlbmRpbmcoIGN1cnJlbnQgKSApIHsKKwkJCQlyZXRjb2RlID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoICZkZXYtPmxvY2subG9ja19xdWV1ZSwgJmVudHJ5ICk7CisJCWlmKCAhcmV0Y29kZSApIHsKKwkJCWlmIChkZXYtPmRyaXZlci0+cmVsZWFzZSkKKwkJCQlkZXYtPmRyaXZlci0+cmVsZWFzZShkZXYsIGZpbHApOworCQkJZHJtX2xvY2tfZnJlZSggZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJCURSTV9LRVJORUxfQ09OVEVYVCApOworCQl9CisJfQorCQorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwl7CisJCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKKwl9CisKKwlkcm1fZmFzeW5jKCAtMSwgZmlscCwgMCApOworCisJZG93biggJmRldi0+Y3R4bGlzdF9zZW0gKTsKKwlpZiAoICFsaXN0X2VtcHR5KCAmZGV2LT5jdHhsaXN0LT5oZWFkICkgKSB7CisJCWRybV9jdHhfbGlzdF90ICpwb3MsICpuOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSggcG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkICkgeworCQkJaWYgKCBwb3MtPnRhZyA9PSBwcml2ICYmCisJCQkgICAgIHBvcy0+aGFuZGxlICE9IERSTV9LRVJORUxfQ09OVEVYVCApIHsKKwkJCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcikKKwkJCQkJZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcihkZXYsIHBvcy0+aGFuZGxlKTsKKworCQkJCWRybV9jdHhiaXRtYXBfZnJlZSggZGV2LCBwb3MtPmhhbmRsZSApOworCisJCQkJbGlzdF9kZWwoICZwb3MtPmhlYWQgKTsKKwkJCQlkcm1fZnJlZSggcG9zLCBzaXplb2YoKnBvcyksIERSTV9NRU1fQ1RYTElTVCApOworCQkJCS0tZGV2LT5jdHhfY291bnQ7CisJCQl9CisJCX0KKwl9CisJdXAoICZkZXYtPmN0eGxpc3Rfc2VtICk7CisKKwlkb3duKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJaWYgKCBwcml2LT5yZW1vdmVfYXV0aF9vbl9jbG9zZSA9PSAxICkgeworCQlkcm1fZmlsZV90ICp0ZW1wID0gZGV2LT5maWxlX2ZpcnN0OworCQl3aGlsZSAoIHRlbXAgKSB7CisJCQl0ZW1wLT5hdXRoZW50aWNhdGVkID0gMDsKKwkJCXRlbXAgPSB0ZW1wLT5uZXh0OworCQl9CisJfQorCWlmICggcHJpdi0+cHJldiApIHsKKwkJcHJpdi0+cHJldi0+bmV4dCA9IHByaXYtPm5leHQ7CisJfSBlbHNlIHsKKwkJZGV2LT5maWxlX2ZpcnN0CSA9IHByaXYtPm5leHQ7CisJfQorCWlmICggcHJpdi0+bmV4dCApIHsKKwkJcHJpdi0+bmV4dC0+cHJldiA9IHByaXYtPnByZXY7CisJfSBlbHNlIHsKKwkJZGV2LT5maWxlX2xhc3QJID0gcHJpdi0+cHJldjsKKwl9CisJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkKKwlpZiAoZGV2LT5kcml2ZXItPmZyZWVfZmlscF9wcml2KQorCQlkZXYtPmRyaXZlci0+ZnJlZV9maWxwX3ByaXYoZGV2LCBwcml2KTsKKworCWRybV9mcmVlKCBwcml2LCBzaXplb2YoKnByaXYpLCBEUk1fTUVNX0ZJTEVTICk7CisKKwkvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAqIEVuZCBpbmxpbmUgZHJtX3JlbGVhc2UKKwkgKi8KKworCWF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfQ0xPU0VTXSApOworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggIS0tZGV2LT5vcGVuX2NvdW50ICkgeworCQlpZiAoIGF0b21pY19yZWFkKCAmZGV2LT5pb2N0bF9jb3VudCApIHx8IGRldi0+YmxvY2tlZCApIHsKKwkJCURSTV9FUlJPUiggIkRldmljZSBidXN5OiAlZCAlZFxuIiwKKwkJCQkgICBhdG9taWNfcmVhZCggJmRldi0+aW9jdGxfY291bnQgKSwKKwkJCQkgICBkZXYtPmJsb2NrZWQgKTsKKwkJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIGRybV90YWtlZG93biggZGV2ICk7CisJfQorCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3JlbGVhc2UpOworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9kcm0uIAorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gZGV2IGRldmljZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKiAKKyAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgZHJtX2ZpbGUgc3RydWN0dXJlIGZvciB0aGUgZmlsZSBwcml2YXRlIGRhdGEgaW4gXHAKKyAqIGZpbHAgYW5kIGFkZCBpdCBpbnRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgaW4gXHAgZGV2LgorICovCitpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpbnQJICAgICBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJZHJtX2ZpbGVfdCAgICpwcml2OworCWludCByZXQ7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkgICByZXR1cm4gLUVCVVNZOyAvKiBObyBleGNsdXNpdmUgb3BlbnMgKi8KKwlpZiAoIWRybV9jcHVfdmFsaWQoKSkgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJRFJNX0RFQlVHKCJwaWQgPSAlZCwgbWlub3IgPSAlZFxuIiwgY3VycmVudC0+cGlkLCBtaW5vcik7CisKKwlwcml2CQkgICAgPSBkcm1fYWxsb2Moc2l6ZW9mKCpwcml2KSwgRFJNX01FTV9GSUxFUyk7CisJaWYoIXByaXYpIHJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCWZpbHAtPnByaXZhdGVfZGF0YSAgPSBwcml2OworCXByaXYtPnVpZAkgICAgPSBjdXJyZW50LT5ldWlkOworCXByaXYtPnBpZAkgICAgPSBjdXJyZW50LT5waWQ7CisJcHJpdi0+bWlub3IJICAgID0gbWlub3I7CisJcHJpdi0+aGVhZCAgICAgICAgICA9IGRybV9oZWFkc1ttaW5vcl07CisJcHJpdi0+aW9jdGxfY291bnQgICA9IDA7CisJcHJpdi0+YXV0aGVudGljYXRlZCA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CisJcHJpdi0+bG9ja19jb3VudCAgICA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXItPm9wZW5faGVscGVyKSB7CisJCXJldD1kZXYtPmRyaXZlci0+b3Blbl9oZWxwZXIoZGV2LCBwcml2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKCFkZXYtPmZpbGVfbGFzdCkgeworCQlwcml2LT5uZXh0CT0gTlVMTDsKKwkJcHJpdi0+cHJldgk9IE5VTEw7CisJCWRldi0+ZmlsZV9maXJzdCA9IHByaXY7CisJCWRldi0+ZmlsZV9sYXN0CT0gcHJpdjsKKwl9IGVsc2UgeworCQlwcml2LT5uZXh0CSAgICAgPSBOVUxMOworCQlwcml2LT5wcmV2CSAgICAgPSBkZXYtPmZpbGVfbGFzdDsKKwkJZGV2LT5maWxlX2xhc3QtPm5leHQgPSBwcml2OworCQlkZXYtPmZpbGVfbGFzdAkgICAgID0gcHJpdjsKKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKyNpZmRlZiBfX2FscGhhX18KKwkvKgorCSAqIERlZmF1bHQgdGhlIGhvc2UKKwkgKi8KKwlpZiAoIWRldi0+aG9zZSkgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwkJcGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIE5VTEwpOworCQlpZiAocGNpX2RldikgeworCQkJZGV2LT5ob3NlID0gcGNpX2Rldi0+c3lzZGF0YTsKKwkJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQl9CisJCWlmICghZGV2LT5ob3NlKSB7CisJCQlzdHJ1Y3QgcGNpX2J1cyAqYiA9IHBjaV9idXNfYihwY2lfcm9vdF9idXNlcy5uZXh0KTsKKwkJCWlmIChiKSBkZXYtPmhvc2UgPSBiLT5zeXNkYXRhOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK291dF9mcmVlOgorCWRybV9mcmVlKHByaXYsIHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOworCWZpbHAtPnByaXZhdGVfZGF0YT1OVUxMOworCXJldHVybiByZXQ7Cit9CisKKy8qKiBOby1vcC4gKi8KK2ludCBkcm1fZmx1c2goc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmhlYWQtPmRldjsKKworCURSTV9ERUJVRygicGlkID0gJWQsIGRldmljZSA9IDB4JWx4LCBvcGVuX2NvdW50ID0gJWRcbiIsCisJCSAgY3VycmVudC0+cGlkLCAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpLCBkZXYtPm9wZW5fY291bnQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmx1c2gpOworCisvKiogTm8tb3AuICovCitpbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmhlYWQtPmRldjsKKwlpbnQJICAgICAgcmV0Y29kZTsKKworCURSTV9ERUJVRygiZmQgPSAlZCwgZGV2aWNlID0gMHglbHhcbiIsIGZkLCAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpKTsKKwlyZXRjb2RlID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZkZXYtPmJ1Zl9hc3luYyk7CisJaWYgKHJldGNvZGUgPCAwKSByZXR1cm4gcmV0Y29kZTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Zhc3luYyk7CisKKy8qKiBOby1vcC4gKi8KK3Vuc2lnbmVkIGludCBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fcG9sbCk7CisKKworLyoqIE5vLW9wLiAqLworc3NpemVfdCBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2luaXQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg4M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW5pdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qKgorICogXGZpbGUgZHJtX2luaXQuaCAKKyAqIFNldHVwL0NsZWFudXAgZm9yIERSTQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogTW9uIEphbiAgNCAwODo1ODozMSAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgRFJJIHdpbGwgcnVuIG9uIHRoaXMgQ1BVLgorICoKKyAqIFxyZXR1cm4gbm9uLXplcm8gaWYgdGhlIERSSSB3aWxsIHJ1biBvbiB0aGlzIENQVSwgb3IgemVybyBvdGhlcndpc2UuCisgKi8KK2ludCBkcm1fY3B1X3ZhbGlkKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMykgcmV0dXJuIDA7IC8qIE5vIGNtcHhjaGcgb24gYSAzODYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pCisJcmV0dXJuIDA7IC8qIE5vIGNtcHhjaGcgYmVmb3JlIHY5IHNwYXJjLiAqLworI2VuZGlmCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWFmZGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoqCisgKiBcZmlsZSBkcm1faW9jdGwuaCAKKyAqIElPQ1RMIHByb2Nlc3NpbmcgZm9yIERSTQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogRnJpIEphbiAgOCAwOTowMToyNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jb3JlLmgiCisKKyNpbmNsdWRlICJsaW51eC9wY2kuaCIKKworLyoqCisgKiBHZXQgdGhlIGJ1cyBpZC4KKyAqIAorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fdW5pcXVlIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQ29waWVzIHRoZSBidXMgaWQgZnJvbSBkcm1fZGV2aWNlOjp1bmlxdWUgaW50byB1c2VyIHNwYWNlLgorICovCitpbnQgZHJtX2dldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3VuaXF1ZV90CSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3VuaXF1ZV90CSB1OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCBhcmdwLCBzaXplb2YodSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodS51bmlxdWVfbGVuID49IGRldi0+dW5pcXVlX2xlbikgeworCQlpZiAoY29weV90b191c2VyKHUudW5pcXVlLCBkZXYtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwl1LnVuaXF1ZV9sZW4gPSBkZXYtPnVuaXF1ZV9sZW47CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdSwgc2l6ZW9mKHUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IHRoZSBidXMgaWQuCisgKiAKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQsIHBvaW50aW5nIHRvIGEgZHJtX3VuaXF1ZSBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIENvcGllcyB0aGUgYnVzIGlkIGZyb20gdXNlcnNwYWNlIGludG8gZHJtX2RldmljZTo6dW5pcXVlLCBhbmQgdmVyaWZpZXMgdGhhdAorICogaXQgbWF0Y2hlcyB0aGUgZGV2aWNlIHRoaXMgRFJNIGlzIGF0dGFjaGVkIHRvIChFSU5WQUwgb3RoZXJ3aXNlKS4gIERlcHJlY2F0ZWQKKyAqIGluIGludGVyZmFjZSB2ZXJzaW9uIDEuMSBhbmQgd2lsbCByZXR1cm4gRUJVU1kgd2hlbiBzZXR2ZXJzaW9uIGhhcyByZXF1ZXN0ZWQKKyAqIHZlcnNpb24gMS4xIG9yIGdyZWF0ZXIuCisgKi8KK2ludCBkcm1fc2V0dW5pcXVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAqZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdW5pcXVlX3QJIHU7CisJaW50CQkgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMsIHJldDsKKworCWlmIChkZXYtPnVuaXF1ZV9sZW4gfHwgZGV2LT51bmlxdWUpIHJldHVybiAtRUJVU1k7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnUsIChkcm1fdW5pcXVlX3QgX191c2VyICopYXJnLCBzaXplb2YodSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghdS51bmlxdWVfbGVuIHx8IHUudW5pcXVlX2xlbiA+IDEwMjQpIHJldHVybiAtRUlOVkFMOworCisJZGV2LT51bmlxdWVfbGVuID0gdS51bmlxdWVfbGVuOworCWRldi0+dW5pcXVlCT0gZHJtX2FsbG9jKHUudW5pcXVlX2xlbiArIDEsIERSTV9NRU1fRFJJVkVSKTsKKwlpZighZGV2LT51bmlxdWUpIHJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPnVuaXF1ZSwgdS51bmlxdWUsIGRldi0+dW5pcXVlX2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2LT51bmlxdWVbZGV2LT51bmlxdWVfbGVuXSA9ICdcMCc7CisKKwlkZXYtPmRldm5hbWUgPSBkcm1fYWxsb2Moc3RybGVuKGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpICsgc3RybGVuKGRldi0+dW5pcXVlKSArIDIsCisJCQkJICBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCFkZXYtPmRldm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3ByaW50ZihkZXYtPmRldm5hbWUsICIlc0AlcyIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsIGRldi0+dW5pcXVlKTsKKworCS8qIFJldHVybiBlcnJvciBpZiB0aGUgYnVzaWQgc3VibWl0dGVkIGRvZXNuJ3QgbWF0Y2ggdGhlIGRldmljZSdzIGFjdHVhbAorCSAqIGJ1c2lkLgorCSAqLworCXJldCA9IHNzY2FuZihkZXYtPnVuaXF1ZSwgIlBDSTolZDolZDolZCIsICZidXMsICZzbG90LCAmZnVuYyk7CisJaWYgKHJldCAhPSAzKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCWRvbWFpbiA9IGJ1cyA+PiA4OworCWJ1cyAmPSAweGZmOworCQorCWlmICgoZG9tYWluICE9IGRldi0+cGNpX2RvbWFpbikgfHwKKwkgICAgKGJ1cyAhPSBkZXYtPnBjaV9idXMpIHx8CisJICAgIChzbG90ICE9IGRldi0+cGNpX3Nsb3QpIHx8CisJICAgIChmdW5jICE9IGRldi0+cGNpX2Z1bmMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1fc2V0X2J1c2lkKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWlmIChkZXYtPnVuaXF1ZSAhPSBOVUxMKQorCQlyZXR1cm4gRUJVU1k7CisKKwlkZXYtPnVuaXF1ZV9sZW4gPSAyMDsKKwlkZXYtPnVuaXF1ZSA9IGRybV9hbGxvYyhkZXYtPnVuaXF1ZV9sZW4gKyAxLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKGRldi0+dW5pcXVlID09IE5VTEwpCisJCXJldHVybiBFTk9NRU07CisKKwlzbnByaW50ZihkZXYtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuLCAicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwKKwkJZGV2LT5wY2lfZG9tYWluLCBkZXYtPnBjaV9idXMsIGRldi0+cGNpX3Nsb3QsIGRldi0+cGNpX2Z1bmMpOworCisJZGV2LT5kZXZuYW1lID0gZHJtX2FsbG9jKHN0cmxlbihkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKSArIGRldi0+dW5pcXVlX2xlbiArIDIsCisJCQkJRFJNX01FTV9EUklWRVIpOworCWlmIChkZXYtPmRldm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIEVOT01FTTsKKworCXNwcmludGYoZGV2LT5kZXZuYW1lLCAiJXNAJXMiLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lLCBkZXYtPnVuaXF1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIEdldCBhIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fbWFwIHN0cnVjdHVyZS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZWFyY2hlcyBmb3IgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgY29waWVzIGl0cyBpbmZvcm1hdGlvbgorICogaW50byB1c2Vyc3BhY2UKKyAqLworaW50IGRybV9nZXRtYXAoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgICAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX21hcF90ICAgIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fbWFwX3QgICAgbWFwOworCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50ICAgICAgICAgIGlkeDsKKwlpbnQJICAgICBpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtYXAsIGFyZ3AsIHNpemVvZihtYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWR4ID0gbWFwLm9mZnNldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKGlkeCA8IDApIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWkgPSAwOworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlpZihpID09IGlkeCkgeworCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCWlmKCFyX2xpc3QgfHwgIXJfbGlzdC0+bWFwKSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAub2Zmc2V0ID0gcl9saXN0LT5tYXAtPm9mZnNldDsKKwltYXAuc2l6ZSAgID0gcl9saXN0LT5tYXAtPnNpemU7CisJbWFwLnR5cGUgICA9IHJfbGlzdC0+bWFwLT50eXBlOworCW1hcC5mbGFncyAgPSByX2xpc3QtPm1hcC0+ZmxhZ3M7CisJbWFwLmhhbmRsZSA9IHJfbGlzdC0+bWFwLT5oYW5kbGU7CisJbWFwLm10cnIgICA9IHJfbGlzdC0+bWFwLT5tdHJyOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbWFwLCBzaXplb2YobWFwKSkpIHJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBjbGllbnQgaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fY2xpZW50IHN0cnVjdHVyZS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZWFyY2hlcyBmb3IgdGhlIGNsaWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIGNvcGllcyBpdHMgaW5mb3JtYXRpb24KKyAqIGludG8gdXNlcnNwYWNlCisgKi8KK2ludCBkcm1fZ2V0Y2xpZW50KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICAgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9jbGllbnRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2NsaWVudF90IGNsaWVudDsKKwlkcm1fZmlsZV90ICAgKnB0OworCWludCAgICAgICAgICBpZHg7CisJaW50ICAgICAgICAgIGk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNsaWVudCwgYXJncCwgc2l6ZW9mKGNsaWVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZHggPSBjbGllbnQuaWR4OworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJZm9yIChpID0gMCwgcHQgPSBkZXYtPmZpbGVfZmlyc3Q7IGkgPCBpZHggJiYgcHQ7IGkrKywgcHQgPSBwdC0+bmV4dCkKKwkJOworCisJaWYgKCFwdCkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNsaWVudC5hdXRoICA9IHB0LT5hdXRoZW50aWNhdGVkOworCWNsaWVudC5waWQgICA9IHB0LT5waWQ7CisJY2xpZW50LnVpZCAgID0gcHQtPnVpZDsKKwljbGllbnQubWFnaWMgPSBwdC0+bWFnaWM7CisJY2xpZW50LmlvY3MgID0gcHQtPmlvY3RsX2NvdW50OworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2NsaWVudF90IF9fdXNlciAqKWFyZywgJmNsaWVudCwgc2l6ZW9mKGNsaWVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogR2V0IHN0YXRpc3RpY3MgaW5mb3JtYXRpb24uIAorICogCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9zdGF0cyBzdHJ1Y3R1cmUuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fZ2V0c3RhdHMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAgICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fc3RhdHNfdCAgc3RhdHM7CisJaW50ICAgICAgICAgIGk7CisKKwltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKKwkKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+Y291bnRlcnM7IGkrKykgeworCQlpZiAoZGV2LT50eXBlc1tpXSA9PSBfRFJNX1NUQVRfTE9DSykKKwkJCXN0YXRzLmRhdGFbaV0udmFsdWUKKwkJCQk9IChkZXYtPmxvY2suaHdfbG9jaworCQkJCSAgID8gZGV2LT5sb2NrLmh3X2xvY2stPmxvY2sgOiAwKTsKKwkJZWxzZSAKKwkJCXN0YXRzLmRhdGFbaV0udmFsdWUgPSBhdG9taWNfcmVhZCgmZGV2LT5jb3VudHNbaV0pOworCQlzdGF0cy5kYXRhW2ldLnR5cGUgID0gZGV2LT50eXBlc1tpXTsKKwl9CisJCisJc3RhdHMuY291bnQgPSBkZXYtPmNvdW50ZXJzOworCisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fc3RhdHNfdCBfX3VzZXIgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKKyAqIFNldHZlcnNpb24gaW9jdGwuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fbG9jayBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZXRzIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlIHZlcnNpb24KKyAqLworaW50IGRybV9zZXR2ZXJzaW9uKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3NldF92ZXJzaW9uX3Qgc3Y7CisJZHJtX3NldF92ZXJzaW9uX3QgcmV0djsKKwlpbnQgaWZfdmVyc2lvbjsKKwlkcm1fc2V0X3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV92ZXJzaW9uX3QgdmVyc2lvbjsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChzdiwgYXJncCwgc2l6ZW9mKHN2KSk7CisKKwltZW1zZXQoJnZlcnNpb24sIDAsIHNpemVvZih2ZXJzaW9uKSk7CisKKwlkZXYtPmRyaXZlci0+dmVyc2lvbigmdmVyc2lvbik7CisJcmV0di5kcm1fZGlfbWFqb3IgPSBEUk1fSUZfTUFKT1I7CisJcmV0di5kcm1fZGlfbWlub3IgPSBEUk1fSUZfTUlOT1I7CisJcmV0di5kcm1fZGRfbWFqb3IgPSB2ZXJzaW9uLnZlcnNpb25fbWFqb3I7CisJcmV0di5kcm1fZGRfbWlub3IgPSB2ZXJzaW9uLnZlcnNpb25fbWlub3I7CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIHJldHYsIHNpemVvZihzdikpOworCisJaWYgKHN2LmRybV9kaV9tYWpvciAhPSAtMSkgeworCQlpZiAoc3YuZHJtX2RpX21ham9yICE9IERSTV9JRl9NQUpPUiB8fAorCQkgICAgc3YuZHJtX2RpX21pbm9yIDwgMCB8fCBzdi5kcm1fZGlfbWlub3IgPiBEUk1fSUZfTUlOT1IpCisJCQlyZXR1cm4gRUlOVkFMOworCQlpZl92ZXJzaW9uID0gRFJNX0lGX1ZFUlNJT04oc3YuZHJtX2RpX21ham9yLCBzdi5kcm1fZGRfbWlub3IpOworCQlkZXYtPmlmX3ZlcnNpb24gPSBEUk1fTUFYKGlmX3ZlcnNpb24sIGRldi0+aWZfdmVyc2lvbik7CisJCWlmIChzdi5kcm1fZGlfbWlub3IgPj0gMSkgeworCQkJLyoKKwkJCSAqIFZlcnNpb24gMS4xIGluY2x1ZGVzIHR5aW5nIG9mIERSTSB0byBzcGVjaWZpYyBkZXZpY2UKKwkJCSAqLworCQkJZHJtX3NldF9idXNpZChkZXYpOworCQl9CisJfQorCisJaWYgKHN2LmRybV9kZF9tYWpvciAhPSAtMSkgeworCQlpZiAoc3YuZHJtX2RkX21ham9yICE9IHZlcnNpb24udmVyc2lvbl9tYWpvciB8fAorCQkgICAgc3YuZHJtX2RkX21pbm9yIDwgMCB8fCBzdi5kcm1fZGRfbWlub3IgPiB2ZXJzaW9uLnZlcnNpb25fbWlub3IpCisJCQlyZXR1cm4gRUlOVkFMOworCisJCWlmIChkZXYtPmRyaXZlci0+c2V0X3ZlcnNpb24pCisJCQlkZXYtPmRyaXZlci0+c2V0X3ZlcnNpb24oZGV2LCAmc3YpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqIE5vLW9wIGlvY3RsLiAqLworaW50IGRybV9ub29wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlEUk1fREVCVUcoIlxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjM2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoqCisgKiBcZmlsZSBkcm1faXJxLmggCisgKiBJUlEgc3VwcG9ydAorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogRnJpIE1hciAxOSAxNDozMDoxNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKworLyoqCisgKiBHZXQgaW50ZXJydXB0IGZyb20gYnVzIGlkLgorICogCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9pcnFfYnVzaWQgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqIAorICogRmluZHMgdGhlIFBDSSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGJ1cyBpZCBhbmQgZ2V0cyBpdHMgSVJRIG51bWJlci4KKyAqIFRoaXMgSU9DVEwgaXMgZGVwcmVjYXRlZCwgYW5kIHdpbGwgbm93IHJldHVybiBFSU5WQUwgZm9yIGFueSBidXNpZCBub3QgZXF1YWwKKyAqIHRvIHRoYXQgb2YgdGhlIGRldmljZSB0aGF0IHRoaXMgRFJNIGluc3RhbmNlIGF0dGFjaGVkIHRvLgorICovCitpbnQgZHJtX2lycV9ieV9idXNpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faXJxX2J1c2lkX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9pcnFfYnVzaWRfdCBwOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGFyZ3AsIHNpemVvZihwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChwLmJ1c251bSA+PiA4KSAhPSBkZXYtPnBjaV9kb21haW4gfHwKKwkgICAgKHAuYnVzbnVtICYgMHhmZikgIT0gZGV2LT5wY2lfYnVzIHx8CisJICAgIHAuZGV2bnVtICE9IGRldi0+cGNpX3Nsb3QgfHwKKwkgICAgcC5mdW5jbnVtICE9IGRldi0+cGNpX2Z1bmMpCisJCXJldHVybiAtRUlOVkFMOworCisJcC5pcnEgPSBkZXYtPmlycTsKKworCURSTV9ERUJVRygiJWQ6JWQ6JWQgPT4gSVJRICVkXG4iLAorCQkgIHAuYnVzbnVtLCBwLmRldm51bSwgcC5mdW5jbnVtLCBwLmlycSk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcCwgc2l6ZW9mKHApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5zdGFsbCBJUlEgaGFuZGxlci4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gaXJxIElSUSBudW1iZXIuCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIElSUSByZWxhdGVkIGRhdGEsIGFuZCBzZXR1cHMgZHJtX2RldmljZTo6dmJsX3F1ZXVlLiBJbnN0YWxscyB0aGUgaGFuZGxlciwgY2FsbGluZyB0aGUgZHJpdmVyCisgKiBcYyBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCkgYW5kIFxjIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCkgZnVuY3Rpb25zCisgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uCisgKi8KK2ludCBkcm1faXJxX2luc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2hfZmxhZ3M9MDsKKworCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBkZXYtPmlycSA9PSAwICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwkvKiBEcml2ZXIgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKwlpZiAoICFkZXYtPmRldl9wcml2YXRlICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWRldi0+aXJxX2VuYWJsZWQgPSAxOworCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlEUk1fREVCVUcoICIlczogaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+aXJxICk7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9JUlFfVkJMKSkgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnZibF9xdWV1ZSk7CisJCQorCQlzcGluX2xvY2tfaW5pdCggJmRldi0+dmJsX2xvY2sgKTsKKwkJCisJCUlOSVRfTElTVF9IRUFEKCAmZGV2LT52Ymxfc2lncy5oZWFkICk7CisJCQorCQlkZXYtPnZibF9wZW5kaW5nID0gMDsKKwl9CisKKwkJCQkvKiBCZWZvcmUgaW5zdGFsbGluZyBoYW5kbGVyICovCisJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsKGRldik7CisKKwkJCQkvKiBJbnN0YWxsIGhhbmRsZXIgKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9JUlFfU0hBUkVEKSkKKwkJc2hfZmxhZ3MgPSBTQV9TSElSUTsKKwkKKwlyZXQgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIGRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciwKKwkJCSAgIHNoX2ZsYWdzLCBkZXYtPmRldm5hbWUsIGRldiApOworCWlmICggcmV0IDwgMCApIHsKKwkJZG93biggJmRldi0+c3RydWN0X3NlbSApOworCQlkZXYtPmlycV9lbmFibGVkID0gMDsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkJCQkvKiBBZnRlciBpbnN0YWxsaW5nIGhhbmRsZXIgKi8KKwlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBVbmluc3RhbGwgdGhlIElSUSBoYW5kbGVyLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqCisgKiBDYWxscyB0aGUgZHJpdmVyJ3MgXGMgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCkgZnVuY3Rpb24sIGFuZCBzdG9wcyB0aGUgaXJxLgorICovCitpbnQgZHJtX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlpbnQgaXJxX2VuYWJsZWQ7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oICZkZXYtPnN0cnVjdF9zZW0gKTsKKwlpcnFfZW5hYmxlZCA9IGRldi0+aXJxX2VuYWJsZWQ7CisJZGV2LT5pcnFfZW5hYmxlZCA9IDA7CisJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKworCWlmICggIWlycV9lbmFibGVkICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEUk1fREVCVUcoICIlczogaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+aXJxICk7CisKKwlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbChkZXYpOworCisJZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1faXJxX3VuaW5zdGFsbCk7CisKKy8qKgorICogSVJRIGNvbnRyb2wgaW9jdGwuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fY29udHJvbCBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIENhbGxzIGlycV9pbnN0YWxsKCkgb3IgaXJxX3VuaW5zdGFsbCgpIGFjY29yZGluZyB0byBccCBhcmcuCisgKi8KK2ludCBkcm1fY29udHJvbCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2NvbnRyb2xfdCBjdGw7CisJCisJLyogaWYgd2UgaGF2ZW4ndCBpcnEgd2UgZmFsbGJhY2sgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAtIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaCAqLworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmN0bCwgKGRybV9jb250cm9sX3QgX191c2VyICopYXJnLCBzaXplb2YoY3RsKSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKCBjdGwuZnVuYyApIHsKKwljYXNlIERSTV9JTlNUX0hBTkRMRVI6CisJCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGRldi0+aWZfdmVyc2lvbiA8IERSTV9JRl9WRVJTSU9OKDEsIDIpICYmCisJCSAgICBjdGwuaXJxICE9IGRldi0+aXJxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBkcm1faXJxX2luc3RhbGwoIGRldiApOworCWNhc2UgRFJNX1VOSU5TVF9IQU5ETEVSOgorCQlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBkcm1faXJxX3VuaW5zdGFsbCggZGV2ICk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKioKKyAqIFdhaXQgZm9yIFZCTEFOSy4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGRhdGEgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGUgSVJRIGlzIGluc3RhbGxlZC4gCisgKgorICogSWYgYSBzaWduYWwgaXMgcmVxdWVzdGVkIGNoZWNrcyBpZiB0aGlzIHRhc2sgaGFzIGFscmVhZHkgc2NoZWR1bGVkIHRoZSBzYW1lIHNpZ25hbAorICogZm9yIHRoZSBzYW1lIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgLSBub3RoaW5nIHRvIGJlIGRvbmUgaW4KKyAqIHRoYXQgY2FzZS4gSWYgdGhlIG51bWJlciBvZiB0YXNrcyB3YWl0aW5nIGZvciB0aGUgaW50ZXJydXB0IGV4Y2VlZHMgMTAwIHRoZQorICogZnVuY3Rpb24gZmFpbHMuIE90aGVyd2lzZSBhZGRzIGEgbmV3IGVudHJ5IHRvIGRybV9kZXZpY2U6OnZibF9zaWdzIGZvciB0aGlzCisgKiB0YXNrLgorICoKKyAqIElmIGEgc2lnbmFsIGlzIG5vdCByZXF1ZXN0ZWQsIHRoZW4gY2FsbHMgdmJsYW5rX3dhaXQoKS4KKyAqLworaW50IGRybV93YWl0X3ZibGFuayggRFJNX0lPQ1RMX0FSR1MgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3dhaXRfdmJsYW5rX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fd2FpdF92YmxhbmtfdCB2Ymx3YWl0OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSVJRX1ZCTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXYtPmlycSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZibHdhaXQsIGFyZ3AsIHNpemVvZih2Ymx3YWl0KSApOworCisJc3dpdGNoICggdmJsd2FpdC5yZXF1ZXN0LnR5cGUgJiB+X0RSTV9WQkxBTktfRkxBR1NfTUFTSyApIHsKKwljYXNlIF9EUk1fVkJMQU5LX1JFTEFUSVZFOgorCQl2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UgKz0gYXRvbWljX3JlYWQoICZkZXYtPnZibF9yZWNlaXZlZCApOworCQl2Ymx3YWl0LnJlcXVlc3QudHlwZSAmPSB+X0RSTV9WQkxBTktfUkVMQVRJVkU7CisJY2FzZSBfRFJNX1ZCTEFOS19BQlNPTFVURToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmxhZ3MgPSB2Ymx3YWl0LnJlcXVlc3QudHlwZSAmIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0s7CisJCisJaWYgKCBmbGFncyAmIF9EUk1fVkJMQU5LX1NJR05BTCApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKKwkJCisJCXZibHdhaXQucmVwbHkuc2VxdWVuY2UgPSBhdG9taWNfcmVhZCggJmRldi0+dmJsX3JlY2VpdmVkICk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoICZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyApOworCisJCS8qIENoZWNrIGlmIHRoaXMgdGFzayBoYXMgYWxyZWFkeSBzY2hlZHVsZWQgdGhlIHNhbWUgc2lnbmFsCisJCSAqIGZvciB0aGUgc2FtZSB2Ymxhbmsgc2VxdWVuY2UgbnVtYmVyOyBub3RoaW5nIHRvIGJlIGRvbmUgaW4KKwkJICogdGhhdCBjYXNlCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KCB2Ymxfc2lnLCAmZGV2LT52Ymxfc2lncy5oZWFkLCBoZWFkICkgeworCQkJaWYgKHZibF9zaWctPnNlcXVlbmNlID09IHZibHdhaXQucmVxdWVzdC5zZXF1ZW5jZQorCQkJICAgICYmIHZibF9zaWctPmluZm8uc2lfc2lnbm8gPT0gdmJsd2FpdC5yZXF1ZXN0LnNpZ25hbAorCQkJICAgICYmIHZibF9zaWctPnRhc2sgPT0gY3VycmVudCkKKwkJCXsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MgKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKworCQlpZiAoIGRldi0+dmJsX3BlbmRpbmcgPj0gMTAwICkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzICk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZGV2LT52YmxfcGVuZGluZysrOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyApOworCisJCWlmICggISggdmJsX3NpZyA9IGRybV9hbGxvYyggc2l6ZW9mKCBkcm1fdmJsX3NpZ190ICksIERSTV9NRU1fRFJJVkVSICkgKSApIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KCAodm9pZCAqKXZibF9zaWcsIDAsIHNpemVvZigqdmJsX3NpZykgKTsKKworCQl2Ymxfc2lnLT5zZXF1ZW5jZSA9IHZibHdhaXQucmVxdWVzdC5zZXF1ZW5jZTsKKwkJdmJsX3NpZy0+aW5mby5zaV9zaWdubyA9IHZibHdhaXQucmVxdWVzdC5zaWduYWw7CisJCXZibF9zaWctPnRhc2sgPSBjdXJyZW50OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCAmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MgKTsKKworCQlsaXN0X2FkZF90YWlsKCAoc3RydWN0IGxpc3RfaGVhZCAqKSB2Ymxfc2lnLCAmZGV2LT52Ymxfc2lncy5oZWFkICk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzICk7CisJfSBlbHNlIHsKKwkJaWYgKGRldi0+ZHJpdmVyLT52Ymxhbmtfd2FpdCkKKwkJCXJldCA9IGRldi0+ZHJpdmVyLT52Ymxhbmtfd2FpdCggZGV2LCAmdmJsd2FpdC5yZXF1ZXN0LnNlcXVlbmNlICk7CisKKwkJZG9fZ2V0dGltZW9mZGF5KCAmbm93ICk7CisJCXZibHdhaXQucmVwbHkudHZhbF9zZWMgPSBub3cudHZfc2VjOworCQl2Ymx3YWl0LnJlcGx5LnR2YWxfdXNlYyA9IG5vdy50dl91c2VjOworCX0KKworZG9uZToKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKCBhcmdwLCB2Ymx3YWl0LCBzaXplb2YodmJsd2FpdCkgKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogU2VuZCB0aGUgVkJMQU5LIHNpZ25hbHMuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICoKKyAqIFNlbmRzIGEgc2lnbmFsIGZvciBlYWNoIHRhc2sgaW4gZHJtX2RldmljZTo6dmJsX3NpZ3MgYW5kIGVtcHRpZXMgdGhlIGxpc3QuCisgKgorICogSWYgYSBzaWduYWwgaXMgbm90IHJlcXVlc3RlZCwgdGhlbiBjYWxscyB2Ymxhbmtfd2FpdCgpLgorICovCit2b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRtcDsKKwlkcm1fdmJsX3NpZ190ICp2Ymxfc2lnOworCXVuc2lnbmVkIGludCB2Ymxfc2VxID0gYXRvbWljX3JlYWQoICZkZXYtPnZibF9yZWNlaXZlZCApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSggJmRldi0+dmJsX2xvY2ssIGZsYWdzICk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoIGxpc3QsIHRtcCwgJmRldi0+dmJsX3NpZ3MuaGVhZCApIHsKKwkJdmJsX3NpZyA9IGxpc3RfZW50cnkoIGxpc3QsIGRybV92Ymxfc2lnX3QsIGhlYWQgKTsKKwkJaWYgKCAoIHZibF9zZXEgLSB2Ymxfc2lnLT5zZXF1ZW5jZSApIDw9ICgxPDwyMykgKSB7CisJCQl2Ymxfc2lnLT5pbmZvLnNpX2NvZGUgPSB2Ymxfc2VxOworCQkJc2VuZF9zaWdfaW5mbyggdmJsX3NpZy0+aW5mby5zaV9zaWdubywgJnZibF9zaWctPmluZm8sIHZibF9zaWctPnRhc2sgKTsKKworCQkJbGlzdF9kZWwoIGxpc3QgKTsKKworCQkJZHJtX2ZyZWUoIHZibF9zaWcsIHNpemVvZigqdmJsX3NpZyksIERSTV9NRU1fRFJJVkVSICk7CisKKwkJCWRldi0+dmJsX3BlbmRpbmctLTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZkZXYtPnZibF9sb2NrLCBmbGFncyApOworfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsX3NlbmRfc2lnbmFscyk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDZmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qKgorICogXGZpbGUgZHJtX2xvY2suaCAKKyAqIElPQ1RMcyBmb3IgbG9ja2luZworICogCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFR1ZSBGZWIgIDIgMDg6Mzc6NTQgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworLyoqIAorICogTG9jayBpb2N0bC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9sb2NrIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEFkZCB0aGUgY3VycmVudCB0YXNrIHRvIHRoZSBsb2NrIHdhaXQgcXVldWUsIGFuZCBhdHRlbXB0IHRvIHRha2UgdG8gbG9jay4KKyAqLworaW50IGRybV9sb2NrKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworICAgICAgICBkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworICAgICAgICBkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUoIGVudHJ5LCBjdXJyZW50ICk7CisgICAgICAgIGRybV9sb2NrX3QgbG9jazsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKwkrK3ByaXYtPmxvY2tfY291bnQ7CisKKyAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciggJmxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKWFyZywgc2l6ZW9mKGxvY2spICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBpZiAoIGxvY2suY29udGV4dCA9PSBEUk1fS0VSTkVMX0NPTlRFWFQgKSB7CisgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB1c2luZyBrZXJuZWwgY29udGV4dCAlZFxuIiwKKwkJCSAgIGN1cnJlbnQtPnBpZCwgbG9jay5jb250ZXh0ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBEUk1fREVCVUcoICIlZCAocGlkICVkKSByZXF1ZXN0cyBsb2NrICgweCUwOHgpLCBmbGFncyA9IDB4JTA4eFxuIiwKKwkJICAgbG9jay5jb250ZXh0LCBjdXJyZW50LT5waWQsCisJCSAgIGRldi0+bG9jay5od19sb2NrLT5sb2NrLCBsb2NrLmZsYWdzICk7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9ETUFfUVVFVUUpKQorCQlpZiAoIGxvY2suY29udGV4dCA8IDAgKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSggJmRldi0+bG9jay5sb2NrX3F1ZXVlLCAmZW50cnkgKTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKCAhZGV2LT5sb2NrLmh3X2xvY2sgKSB7CisJCQkvKiBEZXZpY2UgaGFzIGJlZW4gdW5yZWdpc3RlcmVkICovCisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIGRybV9sb2NrX3Rha2UoICZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKKwkJCQkgICAgIGxvY2suY29udGV4dCApICkgeworCQkJZGV2LT5sb2NrLmZpbHAgICAgICA9IGZpbHA7CisJCQlkZXYtPmxvY2subG9ja190aW1lID0gamlmZmllczsKKwkJCWF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfTE9DS1NdICk7CisJCQlicmVhazsgIC8qIEdvdCBsb2NrICovCisJCX0KKwkJCisJCS8qIENvbnRlbnRpb24gKi8KKwkJc2NoZWR1bGUoKTsKKwkJaWYgKCBzaWduYWxfcGVuZGluZyggY3VycmVudCApICkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCAmZGV2LT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSApOworCisJc2lnZW1wdHlzZXQoICZkZXYtPnNpZ21hc2sgKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1NUT1AgKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1RTVFAgKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1RUSU4gKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1RUT1UgKTsKKwlkZXYtPnNpZ2RhdGEuY29udGV4dCA9IGxvY2suY29udGV4dDsKKwlkZXYtPnNpZ2RhdGEubG9jayAgICA9IGRldi0+bG9jay5od19sb2NrOworCWJsb2NrX2FsbF9zaWduYWxzKCBkcm1fbm90aWZpZXIsCisJCQkgICAmZGV2LT5zaWdkYXRhLCAmZGV2LT5zaWdtYXNrICk7CisJCisJaWYgKGRldi0+ZHJpdmVyLT5kbWFfcmVhZHkgJiYgKGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfUkVBRFkpKQorCQlkZXYtPmRyaXZlci0+ZG1hX3JlYWR5KGRldik7CisJCisJaWYgKCBkZXYtPmRyaXZlci0+ZG1hX3F1aWVzY2VudCAmJiAobG9jay5mbGFncyAmIF9EUk1fTE9DS19RVUlFU0NFTlQgKSkKKwkJcmV0dXJuIGRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KGRldik7CisJCisJLyogZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaCBpc24ndCB1c2VkIGJ5IGFueSBvZiB0aGUgeDg2IAorCSAqICBkcml2ZXJzIGJ1dCBpcyB1c2VkIGJ5IHRoZSBTcGFyYyBkcml2ZXIuCisJICovCisJCisJaWYgKGRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2ggJiYgCisJICAgIGRldi0+bGFzdF9jb250ZXh0ICE9IGxvY2suY29udGV4dCkgeworCSAgZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaChkZXYsIGRldi0+bGFzdF9jb250ZXh0LCAKKwkJCQkJICAgIGxvY2suY29udGV4dCk7CisJfQorICAgICAgICBEUk1fREVCVUcoICIlZCAlc1xuIiwgbG9jay5jb250ZXh0LCByZXQgPyAiaW50ZXJydXB0ZWQiIDogImhhcyBsb2NrIiApOworCisgICAgICAgIHJldHVybiByZXQ7Cit9CisKKy8qKiAKKyAqIFVubG9jayBpb2N0bC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9sb2NrIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIFRyYW5zZmVyIGFuZCBmcmVlIHRoZSBsb2NrLgorICovCitpbnQgZHJtX3VubG9jayggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fbG9ja190IGxvY2s7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopYXJnLCBzaXplb2YobG9jaykgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCBsb2NrLmNvbnRleHQgPT0gRFJNX0tFUk5FTF9DT05URVhUICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHVzaW5nIGtlcm5lbCBjb250ZXh0ICVkXG4iLAorCQkJICAgY3VycmVudC0+cGlkLCBsb2NrLmNvbnRleHQgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXRvbWljX2luYyggJmRldi0+Y291bnRzW19EUk1fU1RBVF9VTkxPQ0tTXSApOworCisJLyoga2VybmVsX2NvbnRleHRfc3dpdGNoIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSB4ODYgZHJtCisJICogbW9kdWxlcyBidXQgaXMgcmVxdWlyZWQgYnkgdGhlIFNwYXJjIGRyaXZlci4KKwkgKi8KKwlpZiAoZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spCisJCWRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2hfdW5sb2NrKGRldiwgJmxvY2spOworCWVsc2UgeworCQlkcm1fbG9ja190cmFuc2ZlciggZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssIAorCQkJCSAgICBEUk1fS0VSTkVMX0NPTlRFWFQgKTsKKwkJCisJCWlmICggZHJtX2xvY2tfZnJlZSggZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJICAgICBEUk1fS0VSTkVMX0NPTlRFWFQgKSApIHsKKwkJCURSTV9FUlJPUiggIlxuIiApOworCQl9CisJfQorCisJdW5ibG9ja19hbGxfc2lnbmFscygpOworCXJldHVybiAwOworfQorCisvKioKKyAqIFRha2UgdGhlIGhlYXZ5d2VpZ2h0IGxvY2suCisgKgorICogXHBhcmFtIGxvY2sgbG9jayBwb2ludGVyLgorICogXHBhcmFtIGNvbnRleHQgbG9ja2luZyBjb250ZXh0LgorICogXHJldHVybiBvbmUgaWYgdGhlIGxvY2sgaXMgaGVsZCwgb3IgemVybyBvdGhlcndpc2UuCisgKgorICogQXR0ZW1wdCB0byBtYXJrIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAqLworaW50IGRybV9sb2NrX3Rha2UoX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywgdW5zaWduZWQgaW50IGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OworCisJZG8geworCQlvbGQgPSAqbG9jazsKKwkJaWYgKG9sZCAmIF9EUk1fTE9DS19IRUxEKSBuZXcgPSBvbGQgfCBfRFJNX0xPQ0tfQ09OVDsKKwkJZWxzZQkJCSAgbmV3ID0gY29udGV4dCB8IF9EUk1fTE9DS19IRUxEOworCQlwcmV2ID0gY21weGNoZyhsb2NrLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAocHJldiAhPSBvbGQpOworCWlmIChfRFJNX0xPQ0tJTkdfQ09OVEVYVChvbGQpID09IGNvbnRleHQpIHsKKwkJaWYgKG9sZCAmIF9EUk1fTE9DS19IRUxEKSB7CisJCQlpZiAoY29udGV4dCAhPSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKKwkJCQlEUk1fRVJST1IoIiVkIGhvbGRzIGhlYXZ5d2VpZ2h0IGxvY2tcbiIsCisJCQkJCSAgY29udGV4dCk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAobmV3ID09IChjb250ZXh0IHwgX0RSTV9MT0NLX0hFTEQpKSB7CisJCQkJLyogSGF2ZSBsb2NrICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIHRha2VzIGEgbG9jayBmb3JjaWJseSBhbmQgaGFuZHMgaXQgdG8gY29udGV4dC4JU2hvdWxkIE9OTFkgYmUgdXNlZAorICogaW5zaWRlICpfdW5sb2NrIHRvIGdpdmUgbG9jayB0byBrZXJuZWwgYmVmb3JlIGNhbGxpbmcgKl9kbWFfc2NoZWR1bGUuIAorICogCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gbG9jayBsb2NrIHBvaW50ZXIuCisgKiBccGFyYW0gY29udGV4dCBsb2NraW5nIGNvbnRleHQuCisgKiBccmV0dXJuIGFsd2F5cyBvbmUuCisgKgorICogUmVzZXRzIHRoZSBsb2NrIGZpbGUgcG9pbnRlci4KKyAqIE1hcmtzIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAqLworaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9kZXZpY2VfdCAqZGV2LAorCQkgICAgICAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywgdW5zaWduZWQgaW50IGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OworCisJZGV2LT5sb2NrLmZpbHAgPSBOVUxMOworCWRvIHsKKwkJb2xkICA9ICpsb2NrOworCQluZXcgID0gY29udGV4dCB8IF9EUk1fTE9DS19IRUxEOworCQlwcmV2ID0gY21weGNoZyhsb2NrLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAocHJldiAhPSBvbGQpOworCXJldHVybiAxOworfQorCisvKioKKyAqIEZyZWUgbG9jay4KKyAqIAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIGxvY2sgbG9jay4KKyAqIFxwYXJhbSBjb250ZXh0IGNvbnRleHQuCisgKiAKKyAqIFJlc2V0cyB0aGUgbG9jayBmaWxlIHBvaW50ZXIuCisgKiBNYXJrcyB0aGUgbG9jayBhcyBub3QgaGVsZCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLiBXYWtlcyBhbnkgdGFzaworICogd2FpdGluZyBvbiB0aGUgbG9jayBxdWV1ZS4KKyAqLworaW50IGRybV9sb2NrX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsCisJCSAgIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssIHVuc2lnbmVkIGludCBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKKworCWRldi0+bG9jay5maWxwID0gTlVMTDsKKwlkbyB7CisJCW9sZCAgPSAqbG9jazsKKwkJbmV3ICA9IDA7CisJCXByZXYgPSBjbXB4Y2hnKGxvY2ssIG9sZCwgbmV3KTsKKwl9IHdoaWxlIChwcmV2ICE9IG9sZCk7CisJaWYgKF9EUk1fTE9DS19JU19IRUxEKG9sZCkgJiYgX0RSTV9MT0NLSU5HX0NPTlRFWFQob2xkKSAhPSBjb250ZXh0KSB7CisJCURSTV9FUlJPUigiJWQgZnJlZWQgaGVhdnl3ZWlnaHQgbG9jayBoZWxkIGJ5ICVkXG4iLAorCQkJICBjb250ZXh0LAorCQkJICBfRFJNX0xPQ0tJTkdfQ09OVEVYVChvbGQpKTsKKwkJcmV0dXJuIDE7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5sb2NrLmxvY2tfcXVldWUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIElmIHdlIGdldCBoZXJlLCBpdCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGhhcyBjYWxsZWQgRFJNX0lPQ1RMX0xPQ0sKKyAqIHdpdGhvdXQgY2FsbGluZyBEUk1fSU9DVExfVU5MT0NLLgorICoKKyAqIElmIHRoZSBsb2NrIGlzIG5vdCBoZWxkLCB0aGVuIGxldCB0aGUgc2lnbmFsIHByb2NlZWQgYXMgdXN1YWwuICBJZiB0aGUgbG9jaworICogaXMgaGVsZCwgdGhlbiBzZXQgdGhlIGNvbnRlbmRlZCBmbGFnIGFuZCBrZWVwIHRoZSBzaWduYWwgYmxvY2tlZC4KKyAqCisgKiBccGFyYW0gcHJpdiBwb2ludGVyIHRvIGEgZHJtX3NpZ2RhdGEgc3RydWN0dXJlLgorICogXHJldHVybiBvbmUgaWYgdGhlIHNpZ25hbCBzaG91bGQgYmUgZGVsaXZlcmVkIG5vcm1hbGx5LCBvciB6ZXJvIGlmIHRoZQorICogc2lnbmFsIHNob3VsZCBiZSBibG9ja2VkLgorICovCitpbnQgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpCit7CisJZHJtX3NpZ2RhdGFfdCAqcyA9IChkcm1fc2lnZGF0YV90ICopcHJpdjsKKwl1bnNpZ25lZCBpbnQgIG9sZCwgbmV3LCBwcmV2OworCisKKwkJCQkvKiBBbGxvdyBzaWduYWwgZGVsaXZlcnkgaWYgbG9jayBpc24ndCBoZWxkICovCisJaWYgKCFzLT5sb2NrIHx8ICFfRFJNX0xPQ0tfSVNfSEVMRChzLT5sb2NrLT5sb2NrKQorCSAgICB8fCBfRFJNX0xPQ0tJTkdfQ09OVEVYVChzLT5sb2NrLT5sb2NrKSAhPSBzLT5jb250ZXh0KSByZXR1cm4gMTsKKworCQkJCS8qIE90aGVyd2lzZSwgc2V0IGZsYWcgdG8gZm9yY2UgY2FsbCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1VbmxvY2sgKi8KKwlkbyB7CisJCW9sZCAgPSBzLT5sb2NrLT5sb2NrOworCQluZXcgID0gb2xkIHwgX0RSTV9MT0NLX0NPTlQ7CisJCXByZXYgPSBjbXB4Y2hnKCZzLT5sb2NrLT5sb2NrLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAocHJldiAhPSBvbGQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjUzZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKQEAgLTAsMCArMSwxODEgQEAKKy8qKiAKKyAqIFxmaWxlIGRybV9tZW1vcnkuaCAKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyogCisgKiBDcmVhdGVkOiBUaHUgRmViICA0IDE0OjAwOjM0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorCisjaWZkZWYgREVCVUdfTUVNT1JZCisjaW5jbHVkZSAiZHJtX21lbW9yeV9kZWJ1Zy5oIgorI2Vsc2UKKworLyoqIE5vLW9wLiAqLwordm9pZCBkcm1fbWVtX2luaXQodm9pZCkKK3sKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiAiL3Byb2MvZHJpLyVkZXYlL21lbSIgaXMgcmVhZC4KKyAqIAorICogXHBhcmFtIGJ1ZiBvdXRwdXQgYnVmZmVyLgorICogXHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIG9mZnNldCByZXF1ZXN0ZWQgc3RhcnQgb2Zmc2V0LgorICogXHBhcmFtIGxlbiByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICoKKyAqIE5vLW9wLiAKKyAqLworaW50IGRybV9tZW1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCisvKiogV3JhcHBlciBhcm91bmQga21hbGxvYygpICovCit2b2lkICpkcm1fY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXZvaWQgKmFkZHI7CisKKwlhZGRyID0ga21hbGxvYyhzaXplICogbm1lbWIsIEdGUF9LRVJORUwpOworCWlmIChhZGRyICE9IE5VTEwpCisJCW1lbXNldCgodm9pZCAqKWFkZHIsIDAsIHNpemUgKiBubWVtYik7CisKKwlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NhbGxvYyk7CisKKy8qKiBXcmFwcGVyIGFyb3VuZCBrbWFsbG9jKCkgYW5kIGtmcmVlKCkgKi8KK3ZvaWQgKmRybV9yZWFsbG9jKHZvaWQgKm9sZHB0LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXZvaWQgKnB0OworCisJaWYgKCEocHQgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgcmV0dXJuIE5VTEw7CisJaWYgKG9sZHB0ICYmIG9sZHNpemUpIHsKKwkJbWVtY3B5KHB0LCBvbGRwdCwgb2xkc2l6ZSk7CisJCWtmcmVlKG9sZHB0KTsKKwl9CisJcmV0dXJuIHB0OworfQorCisvKioKKyAqIEFsbG9jYXRlIHBhZ2VzLgorICoKKyAqIFxwYXJhbSBvcmRlciBzaXplIG9yZGVyLgorICogXHBhcmFtIGFyZWEgbWVtb3J5IGFyZWEuIChOb3QgdXNlZC4pCisgKiBccmV0dXJuIHBhZ2UgYWRkcmVzcyBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKgorICogQWxsb2NhdGUgYW5kIHJlc2VydmUgZnJlZSBwYWdlcy4KKyAqLwordW5zaWduZWQgbG9uZyBkcm1fYWxsb2NfcGFnZXMoaW50IG9yZGVyLCBpbnQgYXJlYSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBieXRlcwkgID0gUEFHRV9TSVpFIDw8IG9yZGVyOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBpbnQgIHN6OworCisJYWRkcmVzcyA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworCWlmICghYWRkcmVzcykgCisJCXJldHVybiAwOworCisJCQkJLyogWmVybyAqLworCW1lbXNldCgodm9pZCAqKWFkZHJlc3MsIDAsIGJ5dGVzKTsKKworCQkJCS8qIFJlc2VydmUgKi8KKwlmb3IgKGFkZHIgPSBhZGRyZXNzLCBzeiA9IGJ5dGVzOworCSAgICAgc3ogPiAwOworCSAgICAgYWRkciArPSBQQUdFX1NJWkUsIHN6IC09IFBBR0VfU0laRSkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gYWRkcmVzczsKK30KKworLyoqCisgKiBGcmVlIHBhZ2VzLgorICogCisgKiBccGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIHRoZSBwYWdlcyB0byBmcmVlLgorICogXHBhcmFtIG9yZGVyIHNpemUgb3JkZXIuCisgKiBccGFyYW0gYXJlYSBtZW1vcnkgYXJlYS4gKE5vdCB1c2VkLikKKyAqCisgKiBVbnJlc2VydmUgYW5kIGZyZWUgcGFnZXMgYWxsb2NhdGVkIGJ5IGFsbG9jX3BhZ2VzKCkuCisgKi8KK3ZvaWQgZHJtX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgb3JkZXIsIGludCBhcmVhKQoreworCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBQQUdFX1NJWkUgPDwgb3JkZXI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCAgc3o7CisKKwlpZiAoIWFkZHJlc3MpIAorCQlyZXR1cm47CisKKwkvKiBVbnJlc2VydmUgKi8KKwlmb3IgKGFkZHIgPSBhZGRyZXNzLCBzeiA9IGJ5dGVzOworCSAgICAgc3ogPiAwOworCSAgICAgYWRkciArPSBQQUdFX1NJWkUsIHN6IC09IFBBR0VfU0laRSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCX0KKworCWZyZWVfcGFnZXMoYWRkcmVzcywgb3JkZXIpOworfQorCisKKyNpZiBfX09TX0hBU19BR1AKKy8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfYWxsb2NhdGVfbWVtb3J5KCkgKi8KK0RSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgaW50IHBhZ2VzLCB1MzIgdHlwZSkKK3sKKwlyZXR1cm4gZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoYnJpZGdlLCBwYWdlcywgdHlwZSk7Cit9CisKKy8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfZnJlZV9tZW1vcnkoKSAqLworaW50IGRybV9mcmVlX2FncChEUk1fQUdQX01FTSAqaGFuZGxlLCBpbnQgcGFnZXMpCit7CisJcmV0dXJuIGRybV9hZ3BfZnJlZV9tZW1vcnkoaGFuZGxlKSA/IDAgOiAtRUlOVkFMOworfQorCisvKiogV3JhcHBlciBhcm91bmQgYWdwX2JpbmRfbWVtb3J5KCkgKi8KK2ludCBkcm1fYmluZF9hZ3AoRFJNX0FHUF9NRU0gKmhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQoreworCXJldHVybiBkcm1fYWdwX2JpbmRfbWVtb3J5KGhhbmRsZSwgc3RhcnQpOworfQorCisvKiogV3JhcHBlciBhcm91bmQgYWdwX3VuYmluZF9tZW1vcnkoKSAqLworaW50IGRybV91bmJpbmRfYWdwKERSTV9BR1BfTUVNICpoYW5kbGUpCit7CisJcmV0dXJuIGRybV9hZ3BfdW5iaW5kX21lbW9yeShoYW5kbGUpOworfQorI2VuZGlmIC8qIGFncCAqLworI2VuZGlmIC8qIGRlYnVnX21lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJiOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qKiAKKyAqIFxmaWxlIGRybV9tZW1vcnkuaCAKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyogCisgKiBDcmVhdGVkOiBUaHUgRmViICA0IDE0OjAwOjM0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgImRybVAuaCIKKworLyoqCisgKiBDdXQgZG93biB2ZXJzaW9uIG9mIGRybV9tZW1vcnlfZGVidWcuaCwgd2hpY2ggdXNlZCB0byBiZSBjYWxsZWQKKyAqIGRybV9tZW1vcnkuaC4gIAorICovCisKKyNpZiBfX09TX0hBU19BR1AKKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2lmZGVmIEhBVkVfUEFHRV9BR1AKKyNpbmNsdWRlIDxhc20vYWdwLmg+CisjZWxzZQorIyBpZmRlZiBfX3Bvd2VycGNfXworIyAgZGVmaW5lIFBBR0VfQUdQCV9fcGdwcm90KF9QQUdFX0tFUk5FTCB8IF9QQUdFX05PX0NBQ0hFKQorIyBlbHNlCisjICBkZWZpbmUgUEFHRV9BR1AJUEFHRV9LRVJORUwKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogRmluZCB0aGUgZHJtX21hcCB0aGF0IGNvdmVycyB0aGUgcmFuZ2UgW29mZnNldCwgb2Zmc2V0K3NpemUpLgorICovCitzdGF0aWMgaW5saW5lIGRybV9tYXBfdCAqCitkcm1fbG9va3VwX21hcCAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OworCWRybV9tYXBfdCAqbWFwOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCXJfbGlzdCA9IChkcm1fbWFwX2xpc3RfdCAqKSBsaXN0OworCQltYXAgPSByX2xpc3QtPm1hcDsKKwkJaWYgKCFtYXApCisJCQljb250aW51ZTsKKwkJaWYgKG1hcC0+b2Zmc2V0IDw9IG9mZnNldCAmJiAob2Zmc2V0ICsgc2l6ZSkgPD0gKG1hcC0+b2Zmc2V0ICsgbWFwLT5zaXplKSkKKwkJCXJldHVybiBtYXA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYWdwX3JlbWFwICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nICpwaHlzX2FkZHJfbWFwLCBpLCBudW1fcGFnZXMgPSBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCXN0cnVjdCBkcm1fYWdwX21lbSAqYWdwbWVtOworCXN0cnVjdCBwYWdlICoqcGFnZV9tYXA7CisJdm9pZCAqYWRkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisjaWZkZWYgX19hbHBoYV9fCisJb2Zmc2V0IC09IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKKyNlbmRpZgorCisJZm9yIChhZ3BtZW0gPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BtZW07IGFncG1lbSA9IGFncG1lbS0+bmV4dCkKKwkJaWYgKGFncG1lbS0+Ym91bmQgPD0gb2Zmc2V0CisJCSAgICAmJiAoYWdwbWVtLT5ib3VuZCArIChhZ3BtZW0tPnBhZ2VzIDw8IFBBR0VfU0hJRlQpKSA+PSAob2Zmc2V0ICsgc2l6ZSkpCisJCQlicmVhazsKKwlpZiAoIWFncG1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIE9LLCB3ZSdyZSBtYXBwaW5nIEFHUCBzcGFjZSBvbiBhIGNoaXBzZXQvcGxhdGZvcm0gb24gd2hpY2ggbWVtb3J5IGFjY2Vzc2VzIGJ5CisJICogdGhlIENQVSBkbyBub3QgZ2V0IHJlbWFwcGVkIGJ5IHRoZSBHQVJULiAgV2UgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGtlcm5lbCdzCisJICogcGFnZS10YWJsZSBpbnN0ZWFkICh0aGF0J3MgcHJvYmFibHkgZmFzdGVyIGFueWhvdy4uLikuCisJICovCisJLyogbm90ZTogdXNlIHZtYWxsb2MoKSBiZWNhdXNlIG51bV9wYWdlcyBjb3VsZCBiZSBsYXJnZS4uLiAqLworCXBhZ2VfbWFwID0gdm1hbGxvYyhudW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCWlmICghcGFnZV9tYXApCisJCXJldHVybiBOVUxMOworCisJcGh5c19hZGRyX21hcCA9IGFncG1lbS0+bWVtb3J5LT5tZW1vcnkgKyAob2Zmc2V0IC0gYWdwbWVtLT5ib3VuZCkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKytpKQorCQlwYWdlX21hcFtpXSA9IHBmbl90b19wYWdlKHBoeXNfYWRkcl9tYXBbaV0gPj4gUEFHRV9TSElGVCk7CisJYWRkciA9IHZtYXAocGFnZV9tYXAsIG51bV9wYWdlcywgVk1fSU9SRU1BUCwgUEFHRV9BR1ApOworCXZmcmVlKHBhZ2VfbWFwKTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2RybV9mb2xsb3dfcGFnZSAodm9pZCAqdmFkZHIpCit7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfaygodW5zaWduZWQgbG9uZykgdmFkZHIpOworCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgKHVuc2lnbmVkIGxvbmcpIHZhZGRyKTsKKwlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsICh1bnNpZ25lZCBsb25nKSB2YWRkcik7CisJcHRlX3QgKnB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsICh1bnNpZ25lZCBsb25nKSB2YWRkcik7CisJcmV0dXJuIHB0ZV9wZm4oKnB0ZXApIDw8IFBBR0VfU0hJRlQ7Cit9CisKKyNlbHNlIC8qIF9fT1NfSEFTX0FHUCAqLworCitzdGF0aWMgaW5saW5lIGRybV9tYXBfdCAqZHJtX2xvb2t1cF9tYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmFncF9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkcm1fZm9sbG93X3BhZ2UgKHZvaWQgKnZhZGRyKQoreworICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZHJtX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiBkZXYtPmFncCAmJiBkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUpIHsKKwkJZHJtX21hcF90ICptYXAgPSBkcm1fbG9va3VwX21hcChvZmZzZXQsIHNpemUsIGRldik7CisKKwkJaWYgKG1hcCAmJiBtYXAtPnR5cGUgPT0gX0RSTV9BR1ApCisJCQlyZXR1cm4gYWdwX3JlbWFwKG9mZnNldCwgc2l6ZSwgZGV2KTsKKwl9CisJcmV0dXJuIGlvcmVtYXAob2Zmc2V0LCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpkcm1faW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCWRybV9kZXZpY2VfdCAqZGV2KQoreworCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlKSB7CisJCWRybV9tYXBfdCAqbWFwID0gZHJtX2xvb2t1cF9tYXAob2Zmc2V0LCBzaXplLCBkZXYpOworCisJCWlmIChtYXAgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKQorCQkJcmV0dXJuIGFncF9yZW1hcChvZmZzZXQsIHNpemUsIGRldik7CisJfQorCXJldHVybiBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRybV9pb3JlbWFwZnJlZSh2b2lkICpwdCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwkvKgorCSAqIFRoaXMgaXMgYSBiaXQgdWdseS4gIEl0IHdvdWxkIGJlIG11Y2ggY2xlYW5lciBpZiB0aGUgRFJNIEFQSSB3b3VsZCB1c2Ugc2VwYXJhdGUKKwkgKiByb3V0aW5lcyBmb3IgaGFuZGxpbmcgbWFwcGluZ3MgaW4gdGhlIEFHUCBzcGFjZS4gIEhvcGVmdWxseSB0aGlzIGNhbiBiZSBkb25lIGluCisJICogYSBmdXR1cmUgcmV2aXNpb24gb2YgdGhlIGludGVyZmFjZS4uLgorCSAqLworCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlCisJICAgICYmICgodW5zaWduZWQgbG9uZykgcHQgPj0gVk1BTExPQ19TVEFSVCAmJiAodW5zaWduZWQgbG9uZykgcHQgPCBWTUFMTE9DX0VORCkpCisJeworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwkJZHJtX21hcF90ICptYXA7CisKKwkJb2Zmc2V0ID0gZHJtX2ZvbGxvd19wYWdlKHB0KSB8ICgodW5zaWduZWQgbG9uZykgcHQgJiB+UEFHRV9NQVNLKTsKKwkJbWFwID0gZHJtX2xvb2t1cF9tYXAob2Zmc2V0LCBzaXplLCBkZXYpOworCQlpZiAobWFwICYmIG1hcC0+dHlwZSA9PSBfRFJNX0FHUCkgeworCQkJdnVubWFwKHB0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlvdW5tYXAocHQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeV9kZWJ1Zy5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5X2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4MmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeV9kZWJ1Zy5oCkBAIC0wLDAgKzEsNDU5IEBACisvKioKKyAqIFxmaWxlIGRybV9tZW1vcnkuaCAKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0uCisgKgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisKK3R5cGVkZWYgc3RydWN0IGRybV9tZW1fc3RhdHMgeworCWNvbnN0IGNoYXIJICAqbmFtZTsKKwlpbnQJCSAgc3VjY2VlZF9jb3VudDsKKwlpbnQJCSAgZnJlZV9jb3VudDsKKwlpbnQJCSAgZmFpbF9jb3VudDsKKwl1bnNpZ25lZCBsb25nCSAgYnl0ZXNfYWxsb2NhdGVkOworCXVuc2lnbmVkIGxvbmcJICBieXRlc19mcmVlZDsKK30gZHJtX21lbV9zdGF0c190OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKERSTShtZW1fbG9jaykpOworc3RhdGljIHVuc2lnbmVkIGxvbmcJICBEUk0ocmFtX2F2YWlsYWJsZSkgPSAwOyAvKiBJbiBwYWdlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJICBEUk0ocmFtX3VzZWQpICAgICAgPSAwOworc3RhdGljIGRybV9tZW1fc3RhdHNfdAkgIERSTShtZW1fc3RhdHMpW10gICA9IHsKKwlbRFJNX01FTV9ETUFdCSAgICA9IHsgImRtYWJ1ZnMiICB9LAorCVtEUk1fTUVNX1NBUkVBXQkgICAgPSB7ICJzYXJlYXMiICAgfSwKKwlbRFJNX01FTV9EUklWRVJdICAgID0geyAiZHJpdmVyIiAgIH0sCisJW0RSTV9NRU1fTUFHSUNdCSAgICA9IHsgIm1hZ2ljIgkgICB9LAorCVtEUk1fTUVNX0lPQ1RMU10gICAgPSB7ICJpb2N0bHRhYiIgfSwKKwlbRFJNX01FTV9NQVBTXQkgICAgPSB7ICJtYXBsaXN0IiAgfSwKKwlbRFJNX01FTV9WTUFTXQkgICAgPSB7ICJ2bWFsaXN0IiAgfSwKKwlbRFJNX01FTV9CVUZTXQkgICAgPSB7ICJidWZsaXN0IiAgfSwKKwlbRFJNX01FTV9TRUdTXQkgICAgPSB7ICJzZWdsaXN0IiAgfSwKKwlbRFJNX01FTV9QQUdFU10JICAgID0geyAicGFnZWxpc3QiIH0sCisJW0RSTV9NRU1fRklMRVNdCSAgICA9IHsgImZpbGVzIgkgICB9LAorCVtEUk1fTUVNX1FVRVVFU10gICAgPSB7ICJxdWV1ZXMiICAgfSwKKwlbRFJNX01FTV9DTURTXQkgICAgPSB7ICJjb21tYW5kcyIgfSwKKwlbRFJNX01FTV9NQVBQSU5HU10gID0geyAibWFwcGluZ3MiIH0sCisJW0RSTV9NRU1fQlVGTElTVFNdICA9IHsgImJ1Zmxpc3RzIiB9LAorCVtEUk1fTUVNX0FHUExJU1RTXSAgPSB7ICJhZ3BsaXN0IiAgfSwKKwlbRFJNX01FTV9TR0xJU1RTXSAgID0geyAic2dsaXN0IiAgIH0sCisJW0RSTV9NRU1fVE9UQUxBR1BdICA9IHsgInRvdGFsYWdwIiB9LAorCVtEUk1fTUVNX0JPVU5EQUdQXSAgPSB7ICJib3VuZGFncCIgfSwKKwlbRFJNX01FTV9DVFhCSVRNQVBdID0geyAiY3R4Yml0bWFwIn0sCisJW0RSTV9NRU1fQ1RYTElTVF0gICA9IHsgImN0eGxpc3QiICB9LAorCVtEUk1fTUVNX1NUVUJdICAgICAgPSB7ICJzdHViIiAgICAgfSwKKwl7IE5VTEwsIDAsIH0JCS8qIExhc3QgZW50cnkgbXVzdCBiZSBudWxsICovCit9OworCit2b2lkIERSTShtZW1faW5pdCkodm9pZCkKK3sKKwlkcm1fbWVtX3N0YXRzX3QgKm1lbTsKKwlzdHJ1Y3Qgc3lzaW5mbwlzaTsKKworCWZvciAobWVtID0gRFJNKG1lbV9zdGF0cyk7IG1lbS0+bmFtZTsgKyttZW0pIHsKKwkJbWVtLT5zdWNjZWVkX2NvdW50ICAgPSAwOworCQltZW0tPmZyZWVfY291bnQJICAgICA9IDA7CisJCW1lbS0+ZmFpbF9jb3VudAkgICAgID0gMDsKKwkJbWVtLT5ieXRlc19hbGxvY2F0ZWQgPSAwOworCQltZW0tPmJ5dGVzX2ZyZWVkICAgICA9IDA7CisJfQorCisJc2lfbWVtaW5mbygmc2kpOworCURSTShyYW1fYXZhaWxhYmxlKSA9IHNpLnRvdGFscmFtOworCURSTShyYW1fdXNlZCkJICAgPSAwOworfQorCisvKiBkcm1fbWVtX2luZm8gaXMgY2FsbGVkIHdoZW5ldmVyIGEgcHJvY2VzcyByZWFkcyAvZGV2L2RybS9tZW0uICovCisKK3N0YXRpYyBpbnQgRFJNKF9tZW1faW5mbykoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9tZW1fc3RhdHNfdCAqcHQ7CisJaW50ICAgICAgICAgICAgIGxlbiA9IDA7CisKKwlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCSplb2YgICA9IDA7CisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCisJRFJNX1BST0NfUFJJTlQoIgkJICB0b3RhbCBjb3VudHMJCQkiCisJCSAgICAgICAiIHwgICAgb3V0c3RhbmRpbmcgIFxuIik7CisJRFJNX1BST0NfUFJJTlQoInR5cGUJICAgYWxsb2MgZnJlZWQgZmFpbAlieXRlcwkgICBmcmVlZCIKKwkJICAgICAgICIgfCBhbGxvY3MgICAgICBieXRlc1xuXG4iKTsKKwlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1IGtCICAgICAgICAgfFxuIiwKKwkJICAgICAgICJzeXN0ZW0iLCAwLCAwLCAwLAorCQkgICAgICAgRFJNKHJhbV9hdmFpbGFibGUpIDw8IChQQUdFX1NISUZUIC0gMTApKTsKKwlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1IGtCICAgICAgICAgfFxuIiwKKwkJICAgICAgICJsb2NrZWQiLCAwLCAwLCAwLCBEUk0ocmFtX3VzZWQpID4+IDEwKTsKKwlEUk1fUFJPQ19QUklOVCgiXG4iKTsKKwlmb3IgKHB0ID0gRFJNKG1lbV9zdGF0cyk7IHB0LT5uYW1lOyBwdCsrKSB7CisJCURSTV9QUk9DX1BSSU5UKCIlLTkuOXMgJTVkICU1ZCAlNGQgJTEwbHUgJTEwbHUgfCAlNmQgJTEwbGRcbiIsCisJCQkgICAgICAgcHQtPm5hbWUsCisJCQkgICAgICAgcHQtPnN1Y2NlZWRfY291bnQsCisJCQkgICAgICAgcHQtPmZyZWVfY291bnQsCisJCQkgICAgICAgcHQtPmZhaWxfY291bnQsCisJCQkgICAgICAgcHQtPmJ5dGVzX2FsbG9jYXRlZCwKKwkJCSAgICAgICBwdC0+Ynl0ZXNfZnJlZWQsCisJCQkgICAgICAgcHQtPnN1Y2NlZWRfY291bnQgLSBwdC0+ZnJlZV9jb3VudCwKKwkJCSAgICAgICAobG9uZylwdC0+Ynl0ZXNfYWxsb2NhdGVkCisJCQkgICAgICAgLSAobG9uZylwdC0+Ynl0ZXNfZnJlZWQpOworCX0KKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCitpbnQgRFJNKG1lbV9pbmZvKShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCXJldCA9IERSTShfbWVtX2luZm8pKGJ1Ziwgc3RhcnQsIG9mZnNldCwgbGVuLCBlb2YsIGRhdGEpOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpEUk0oYWxsb2MpKHNpemVfdCBzaXplLCBpbnQgYXJlYSkKK3sKKwl2b2lkICpwdDsKKworCWlmICghc2l6ZSkgeworCQlEUk1fTUVNX0VSUk9SKGFyZWEsICJBbGxvY2F0aW5nIDAgYnl0ZXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShwdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCSsrRFJNKG1lbV9zdGF0cylbYXJlYV0uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkrK0RSTShtZW1fc3RhdHMpW2FyZWFdLnN1Y2NlZWRfY291bnQ7CisJRFJNKG1lbV9zdGF0cylbYXJlYV0uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7CisJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXJldHVybiBwdDsKK30KKwordm9pZCAqRFJNKGNhbGxvYykoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCit7CisJdm9pZCAqYWRkcjsKKworCWFkZHIgPSBEUk0oYWxsb2MpKG5tZW1iICogc2l6ZSwgYXJlYSk7CisJaWYgKGFkZHIgIT0gTlVMTCkKKwkJbWVtc2V0KCh2b2lkICopYWRkciwgMCwgc2l6ZSAqIG5tZW1iKTsKKworCXJldHVybiBhZGRyOworfQorCit2b2lkICpEUk0ocmVhbGxvYykodm9pZCAqb2xkcHQsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCit7CisJdm9pZCAqcHQ7CisKKwlpZiAoIShwdCA9IERSTShhbGxvYykoc2l6ZSwgYXJlYSkpKSByZXR1cm4gTlVMTDsKKwlpZiAob2xkcHQgJiYgb2xkc2l6ZSkgeworCQltZW1jcHkocHQsIG9sZHB0LCBvbGRzaXplKTsKKwkJRFJNKGZyZWUpKG9sZHB0LCBvbGRzaXplLCBhcmVhKTsKKwl9CisJcmV0dXJuIHB0OworfQorCit2b2lkIERSTShmcmVlKSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCWludCBhbGxvY19jb3VudDsKKwlpbnQgZnJlZV9jb3VudDsKKworCWlmICghcHQpIERSTV9NRU1fRVJST1IoYXJlYSwgIkF0dGVtcHQgdG8gZnJlZSBOVUxMIHBvaW50ZXJcbiIpOworCWVsc2UJIGtmcmVlKHB0KTsKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCURSTShtZW1fc3RhdHMpW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IHNpemU7CisJZnJlZV9jb3VudCAgPSArK0RSTShtZW1fc3RhdHMpW2FyZWFdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPQlEUk0obWVtX3N0YXRzKVthcmVhXS5zdWNjZWVkX2NvdW50OworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCURSTV9NRU1fRVJST1IoYXJlYSwgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKKwkJCSAgICAgIGZyZWVfY291bnQsIGFsbG9jX2NvdW50KTsKKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgRFJNKGFsbG9jX3BhZ2VzKShpbnQgb3JkZXIsIGludCBhcmVhKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzCSAgPSBQQUdFX1NJWkUgPDwgb3JkZXI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCAgc3o7CisKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCWlmICgoRFJNKHJhbV91c2VkKSA+PiBQQUdFX1NISUZUKQorCSAgICA+IChEUk1fUkFNX1BFUkNFTlQgKiBEUk0ocmFtX2F2YWlsYWJsZSkpIC8gMTAwKSB7CisJCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKworCWFkZHJlc3MgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlpZiAoIWFkZHJlc3MpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJKytEUk0obWVtX3N0YXRzKVthcmVhXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXJldHVybiAwOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlEUk0obWVtX3N0YXRzKVthcmVhXS5ieXRlc19hbGxvY2F0ZWQgKz0gYnl0ZXM7CisJRFJNKHJhbV91c2VkKQkJICAgICAgICAgICAgICs9IGJ5dGVzOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKworCisJCQkJLyogWmVybyBvdXRzaWRlIHRoZSBsb2NrICovCisJbWVtc2V0KCh2b2lkICopYWRkcmVzcywgMCwgYnl0ZXMpOworCisJCQkJLyogUmVzZXJ2ZSAqLworCWZvciAoYWRkciA9IGFkZHJlc3MsIHN6ID0gYnl0ZXM7CisJICAgICBzeiA+IDA7CisJICAgICBhZGRyICs9IFBBR0VfU0laRSwgc3ogLT0gUEFHRV9TSVpFKSB7CisJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCX0KKworCXJldHVybiBhZGRyZXNzOworfQorCit2b2lkIERSTShmcmVlX3BhZ2VzKSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBvcmRlciwgaW50IGFyZWEpCit7CisJdW5zaWduZWQgbG9uZyBieXRlcyA9IFBBR0VfU0laRSA8PCBvcmRlcjsKKwlpbnQJCSAgYWxsb2NfY291bnQ7CisJaW50CQkgIGZyZWVfY291bnQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCAgc3o7CisKKwlpZiAoIWFkZHJlc3MpIHsKKwkJRFJNX01FTV9FUlJPUihhcmVhLCAiQXR0ZW1wdCB0byBmcmVlIGFkZHJlc3MgMFxuIik7CisJfSBlbHNlIHsKKwkJCQkvKiBVbnJlc2VydmUgKi8KKwkJZm9yIChhZGRyID0gYWRkcmVzcywgc3ogPSBieXRlczsKKwkJICAgICBzeiA+IDA7CisJCSAgICAgYWRkciArPSBQQUdFX1NJWkUsIHN6IC09IFBBR0VfU0laRSkgeworCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwkJfQorCQlmcmVlX3BhZ2VzKGFkZHJlc3MsIG9yZGVyKTsKKwl9CisKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCWZyZWVfY291bnQgID0gKytEUk0obWVtX3N0YXRzKVthcmVhXS5mcmVlX2NvdW50OworCWFsbG9jX2NvdW50ID0JRFJNKG1lbV9zdGF0cylbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlEUk0obWVtX3N0YXRzKVthcmVhXS5ieXRlc19mcmVlZCArPSBieXRlczsKKwlEUk0ocmFtX3VzZWQpCQkJIC09IGJ5dGVzOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCURSTV9NRU1fRVJST1IoYXJlYSwKKwkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCisJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CisJfQorfQorCit2b2lkICpEUk0oaW9yZW1hcCkodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisJdm9pZCAqcHQ7CisKKwlpZiAoIXNpemUpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX01BUFBJTkdTLAorCQkJICAgICAgIk1hcHBpbmcgMCBieXRlcyBhdCAweCUwOGx4XG4iLCBvZmZzZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShwdCA9IGRybV9pb3JlbWFwKG9mZnNldCwgc2l6ZSwgZGV2KSkpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uc3VjY2VlZF9jb3VudDsKKwlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5ieXRlc19hbGxvY2F0ZWQgKz0gc2l6ZTsKKwlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJcmV0dXJuIHB0OworfQorCit2b2lkICpEUk0oaW9yZW1hcF9ub2NhY2hlKSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwl2b2lkICpwdDsKKworCWlmICghc2l6ZSkgeworCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fTUFQUElOR1MsCisJCQkgICAgICAiTWFwcGluZyAwIGJ5dGVzIGF0IDB4JTA4bHhcbiIsIG9mZnNldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHB0ID0gZHJtX2lvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemUsIGRldikpKSB7CisJCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7CisJRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7CisJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXJldHVybiBwdDsKK30KKwordm9pZCBEUk0oaW9yZW1hcGZyZWUpKHZvaWQgKnB0LCB1bnNpZ25lZCBsb25nIHNpemUsIGRybV9kZXZpY2VfdCAqZGV2KQoreworCWludCBhbGxvY19jb3VudDsKKwlpbnQgZnJlZV9jb3VudDsKKworCWlmICghcHQpCisJCURSTV9NRU1fRVJST1IoRFJNX01FTV9NQVBQSU5HUywKKwkJCSAgICAgICJBdHRlbXB0IHRvIGZyZWUgTlVMTCBwb2ludGVyXG4iKTsKKwllbHNlCisJCWRybV9pb3JlbWFwZnJlZShwdCwgc2l6ZSwgZGV2KTsKKworCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfZnJlZWQgKz0gc2l6ZTsKKwlmcmVlX2NvdW50ICA9ICsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uZnJlZV9jb3VudDsKKwlhbGxvY19jb3VudCA9CURSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7CisJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCWlmIChmcmVlX2NvdW50ID4gYWxsb2NfY291bnQpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX01BUFBJTkdTLAorCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKKwkJCSAgICAgIGZyZWVfY291bnQsIGFsbG9jX2NvdW50KTsKKwl9Cit9CisKKyNpZiBfX09TX0hBU19BR1AKKworRFJNX0FHUF9NRU0gKkRSTShhbGxvY19hZ3ApKGludCBwYWdlcywgdTMyIHR5cGUpCit7CisJRFJNX0FHUF9NRU0gKmhhbmRsZTsKKworCWlmICghcGFnZXMpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX1RPVEFMQUdQLCAiQWxsb2NhdGluZyAwIHBhZ2VzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChoYW5kbGUgPSBEUk0oYWdwX2FsbG9jYXRlX21lbW9yeSkocGFnZXMsIHR5cGUpKSkgeworCQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLnN1Y2NlZWRfY291bnQ7CisJCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmJ5dGVzX2FsbG9jYXRlZAorCQkJKz0gcGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlyZXR1cm4gaGFuZGxlOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9UT1RBTEFHUF0uZmFpbF9jb3VudDsKKwlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBEUk0oZnJlZV9hZ3ApKERSTV9BR1BfTUVNICpoYW5kbGUsIGludCBwYWdlcykKK3sKKwlpbnQgICAgICAgICAgIGFsbG9jX2NvdW50OworCWludCAgICAgICAgICAgZnJlZV9jb3VudDsKKwlpbnQgICAgICAgICAgIHJldHZhbCA9IC1FSU5WQUw7CisKKwlpZiAoIWhhbmRsZSkgeworCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fVE9UQUxBR1AsCisJCQkgICAgICAiQXR0ZW1wdCB0byBmcmVlIE5VTEwgQUdQIGhhbmRsZVxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKERSTShhZ3BfZnJlZV9tZW1vcnkpKGhhbmRsZSkpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJZnJlZV9jb3VudCAgPSArK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmZyZWVfY291bnQ7CisJCWFsbG9jX2NvdW50ID0gICBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5zdWNjZWVkX2NvdW50OworCQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5ieXRlc19mcmVlZAorCQkJKz0gcGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fVE9UQUxBR1AsCisJCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKKwkJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBEUk0oYmluZF9hZ3ApKERSTV9BR1BfTUVNICpoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCkKK3sKKwlpbnQgcmV0Y29kZSA9IC1FSU5WQUw7CisKKwlpZiAoIWhhbmRsZSkgeworCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fQk9VTkRBR1AsCisJCQkgICAgICAiQXR0ZW1wdCB0byBiaW5kIE5VTEwgQUdQIGhhbmRsZVxuIik7CisJCXJldHVybiByZXRjb2RlOworCX0KKworCWlmICghKHJldGNvZGUgPSBEUk0oYWdwX2JpbmRfbWVtb3J5KShoYW5kbGUsIHN0YXJ0KSkpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5zdWNjZWVkX2NvdW50OworCQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5ieXRlc19hbGxvY2F0ZWQKKwkJCSs9IGhhbmRsZS0+cGFnZV9jb3VudCA8PCBQQUdFX1NISUZUOworCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9CT1VOREFHUF0uZmFpbF9jb3VudDsKKwlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK2ludCBEUk0odW5iaW5kX2FncCkoRFJNX0FHUF9NRU0gKmhhbmRsZSkKK3sKKwlpbnQgYWxsb2NfY291bnQ7CisJaW50IGZyZWVfY291bnQ7CisJaW50IHJldGNvZGUgPSAtRUlOVkFMOworCisJaWYgKCFoYW5kbGUpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX0JPVU5EQUdQLAorCQkJICAgICAgIkF0dGVtcHQgdG8gdW5iaW5kIE5VTEwgQUdQIGhhbmRsZVxuIik7CisJCXJldHVybiByZXRjb2RlOworCX0KKworCWlmICgocmV0Y29kZSA9IERSTShhZ3BfdW5iaW5kX21lbW9yeSkoaGFuZGxlKSkpIHJldHVybiByZXRjb2RlOworCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJZnJlZV9jb3VudCAgPSArK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPSBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5zdWNjZWVkX2NvdW50OworCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmJ5dGVzX2ZyZWVkCisJCSs9IGhhbmRsZS0+cGFnZV9jb3VudCA8PCBQQUdFX1NISUZUOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCURSTV9NRU1fRVJST1IoRFJNX01FTV9CT1VOREFHUCwKKwkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCisJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CisJfQorCXJldHVybiByZXRjb2RlOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRjZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaApAQCAtMCwwICsxLDE0OSBAQAorLyoqCisgKiBcZmlsZSBkcm1fb3NfbGludXguaAorICogT1MgYWJzdHJhY3Rpb24gbWFjcm9zLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFzayBxdWV1ZSBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyoqIEZpbGUgcG9pbnRlciB0eXBlICovCisjZGVmaW5lIERSTUZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKgorLyoqIElvY3RsIGFyZ3VtZW50cyAqLworI2RlZmluZSBEUk1fSU9DVExfQVJHUwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGRhdGEKKyNkZWZpbmUgRFJNX0VSUihkKQkJCS0oZCkKKy8qKiBDdXJyZW50IHByb2Nlc3MgSUQgKi8KKyNkZWZpbmUgRFJNX0NVUlJFTlRQSUQJCQljdXJyZW50LT5waWQKKyNkZWZpbmUgRFJNX1VERUxBWShkKQkJCXVkZWxheShkKQorLyoqIFJlYWQgYSBieXRlIGZyb20gYSBNTUlPIHJlZ2lvbiAqLworI2RlZmluZSBEUk1fUkVBRDgobWFwLCBvZmZzZXQpCQlyZWFkYigoKHZvaWQgX19pb21lbSAqKShtYXApLT5oYW5kbGUpICsgKG9mZnNldCkpCisvKiogUmVhZCBhIHdvcmQgZnJvbSBhIE1NSU8gcmVnaW9uICovCisjZGVmaW5lIERSTV9SRUFEMTYobWFwLCBvZmZzZXQpICAgICAgICAgcmVhZHcoKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQorLyoqIFJlYWQgYSBkd29yZCBmcm9tIGEgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgRFJNX1JFQUQzMihtYXAsIG9mZnNldCkJCXJlYWRsKCgodm9pZCBfX2lvbWVtICopKG1hcCktPmhhbmRsZSkgKyAob2Zmc2V0KSkKKy8qKiBXcml0ZSBhIGJ5dGUgaW50byBhIE1NSU8gcmVnaW9uICovCisjZGVmaW5lIERSTV9XUklURTgobWFwLCBvZmZzZXQsIHZhbCkJd3JpdGViKHZhbCwgKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQorLyoqIFdyaXRlIGEgd29yZCBpbnRvIGEgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgRFJNX1dSSVRFMTYobWFwLCBvZmZzZXQsIHZhbCkgICB3cml0ZXcodmFsLCAoKHZvaWQgX19pb21lbSAqKShtYXApLT5oYW5kbGUpICsgKG9mZnNldCkpCisvKiogV3JpdGUgYSBkd29yZCBpbnRvIGEgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgRFJNX1dSSVRFMzIobWFwLCBvZmZzZXQsIHZhbCkJd3JpdGVsKHZhbCwgKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQorLyoqIFJlYWQgbWVtb3J5IGJhcnJpZXIgKi8KKyNkZWZpbmUgRFJNX1JFQURNRU1PUllCQVJSSUVSKCkJCXJtYigpCisvKiogV3JpdGUgbWVtb3J5IGJhcnJpZXIgKi8KKyNkZWZpbmUgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpCXdtYigpCisvKiogUmVhZC93cml0ZSBtZW1vcnkgYmFycmllciAqLworI2RlZmluZSBEUk1fTUVNT1JZQkFSUklFUigpCQltYigpCisvKiogRFJNIGRldmljZSBsb2NhbCBkZWNsYXJhdGlvbiAqLworI2RlZmluZSBEUk1fREVWSUNFCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7IFwKKwkJCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2CisKKy8qKiBJUlEgaGFuZGxlciBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlIGFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRFJNX0lSUV9BUkdTCQlpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzCisKKy8qKiBBR1AgdHlwZXMgKi8KKyNpZiBfX09TX0hBU19BR1AKKyNkZWZpbmUgRFJNX0FHUF9NRU0JCXN0cnVjdCBhZ3BfbWVtb3J5CisjZGVmaW5lIERSTV9BR1BfS0VSTgkJc3RydWN0IGFncF9rZXJuX2luZm8KKyNlbHNlCisvKiBkZWZpbmUgc29tZSBkdW1teSB0eXBlcyBmb3Igbm9uIEFHUCBzdXBwb3J0aW5nIGtlcm5lbHMgKi8KK3N0cnVjdCBub19hZ3Bfa2VybiB7CisgIHVuc2lnbmVkIGxvbmcgYXBlcl9iYXNlOworICB1bnNpZ25lZCBsb25nIGFwZXJfc2l6ZTsKK307CisjZGVmaW5lIERSTV9BR1BfTUVNICAgICAgICAgICAgIGludAorI2RlZmluZSBEUk1fQUdQX0tFUk4gICAgICAgICAgICBzdHJ1Y3Qgbm9fYWdwX2tlcm4KKyNlbmRpZgorCisjaWYgIShfX09TX0hBU19NVFJSKQorc3RhdGljIF9faW5saW5lX18gaW50IG10cnJfYWRkICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50KQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbXRycl9kZWwgKGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiAtRU5PREVWOworfQorI2RlZmluZSBNVFJSX1RZUEVfV1JDT01CICAgICAxCisKKyNlbmRpZgorCisvKiogVGFzayBxdWV1ZSBoYW5kbGVyIGFyZ3VtZW50cyAqLworI2RlZmluZSBEUk1fVEFTS1FVRVVFX0FSR1MJdm9pZCAqYXJnCisKKy8qKiBGb3IgZGF0YSBnb2luZyBpbnRvIHRoZSBrZXJuZWwgdGhyb3VnaCB0aGUgaW9jdGwgYXJndW1lbnQgKi8KKyNkZWZpbmUgRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFyZzEsIGFyZzIsIGFyZzMpCVwKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCZhcmcxLCBhcmcyLCBhcmczKSApCVwKKwkJcmV0dXJuIC1FRkFVTFQKKy8qKiBGb3IgZGF0YSBnb2luZyBmcm9tIHRoZSBrZXJuZWwgdGhyb3VnaCB0aGUgaW9jdGwgYXJndW1lbnQgKi8KKyNkZWZpbmUgRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmcxLCBhcmcyLCBhcmczKQlcCisJaWYgKCBjb3B5X3RvX3VzZXIoYXJnMSwgJmFyZzIsIGFyZzMpICkJCVwKKwkJcmV0dXJuIC1FRkFVTFQKKy8qKiBPdGhlciBjb3B5aW5nIG9mIGRhdGEgdG8ga2VybmVsIHNwYWNlICovCisjZGVmaW5lIERSTV9DT1BZX0ZST01fVVNFUihhcmcxLCBhcmcyLCBhcmczKQkJXAorCWNvcHlfZnJvbV91c2VyKGFyZzEsIGFyZzIsIGFyZzMpCisvKiogT3RoZXIgY29weWluZyBvZiBkYXRhIGZyb20ga2VybmVsIHNwYWNlICovCisjZGVmaW5lIERSTV9DT1BZX1RPX1VTRVIoYXJnMSwgYXJnMiwgYXJnMykJCVwKKwljb3B5X3RvX3VzZXIoYXJnMSwgYXJnMiwgYXJnMykKKy8qIE1hY3JvcyBmb3IgY29weWZyb20gdXNlciwgYnV0IGNoZWNraW5nIHJlYWRhYmlsaXR5IG9ubHkgb25jZSAqLworI2RlZmluZSBEUk1fVkVSSUZZQVJFQV9SRUFEKCB1YWRkciwgc2l6ZSApIAkJXAorCShhY2Nlc3Nfb2soIFZFUklGWV9SRUFELCB1YWRkciwgc2l6ZSApID8gMCA6IC1FRkFVTFQpCisjZGVmaW5lIERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoYXJnMSwgYXJnMiwgYXJnMykgCVwKKwlfX2NvcHlfZnJvbV91c2VyKGFyZzEsIGFyZzIsIGFyZzMpCisjZGVmaW5lIERSTV9DT1BZX1RPX1VTRVJfVU5DSEVDS0VEKGFyZzEsIGFyZzIsIGFyZzMpCVwKKwlfX2NvcHlfdG9fdXNlcihhcmcxLCBhcmcyLCBhcmczKQorI2RlZmluZSBEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKHZhbCwgdWFkZHIpCQlcCisJX19nZXRfdXNlcih2YWwsIHVhZGRyKQorCisjZGVmaW5lIERSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihfcHJpdiwgX2ZpbHApIF9wcml2ID0gX2ZpbHAtPnByaXZhdGVfZGF0YQorCisvKiogCisgKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIFNBUkVBLgorICoKKyAqIFNlYXJjaGVzIHRoZSBTQVJFQSBvbiB0aGUgbWFwcGluZyBsaXN0cyBhbmQgcG9pbnRzIGRybV9kZXZpY2U6OnNhcmVhIHRvIGl0LgorICovCisjZGVmaW5lIERSTV9HRVRTQVJFQSgpCQkJCQkJCSBcCitkbyB7IAkJCQkJCQkJCSBcCisJZHJtX21hcF9saXN0X3QgKmVudHJ5OwkJCQkJCSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeSggZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQgKSB7CSBcCisJCWlmICggZW50cnktPm1hcCAmJgkJCQkJIFwKKwkJICAgICBlbnRyeS0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCQkJIFwKKwkJICAgICAoZW50cnktPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0spICkgewkgXAorCQkJZGV2X3ByaXYtPnNhcmVhID0gZW50cnktPm1hcDsJCQkgXAorIAkJCWJyZWFrOwkJCQkJCSBcCisgCQl9CQkJCQkJCSBcCisgCX0JCQkJCQkJCSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERSTV9IWiBIWgorCisjZGVmaW5lIERSTV9XQUlUX09OKCByZXQsIHF1ZXVlLCB0aW1lb3V0LCBjb25kaXRpb24gKQkJXAorZG8gewkJCQkJCQkJXAorCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsJCQlcCisJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgKHRpbWVvdXQpOwkJXAorCWFkZF93YWl0X3F1ZXVlKCYocXVldWUpLCAmZW50cnkpOwkJCVwKKwkJCQkJCQkJXAorCWZvciAoOzspIHsJCQkJCQlcCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsJXAorCQlpZiAoY29uZGl0aW9uKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZCkpIHsJCVwKKwkJCXJldCA9IC1FQlVTWTsJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJCX0JCQkJCQlcCisJCXNjaGVkdWxlX3RpbWVvdXQoKEhaLzEwMCA+IDEpID8gSFovMTAwIDogMSk7CVwKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CQkJXAorCQkJcmV0ID0gLUVJTlRSOwkJCQlcCisJCQlicmVhazsJCQkJCVwKKwkJfQkJCQkJCVwKKwl9CQkJCQkJCVwKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CQkJXAorCXJlbW92ZV93YWl0X3F1ZXVlKCYocXVldWUpLCAmZW50cnkpOwkJCVwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBEUk1fV0FLRVVQKCBxdWV1ZSApIHdha2VfdXBfaW50ZXJydXB0aWJsZSggcXVldWUgKQorI2RlZmluZSBEUk1fSU5JVF9XQUlUUVVFVUUoIHF1ZXVlICkgaW5pdF93YWl0cXVldWVfaGVhZCggcXVldWUgKQorIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJlODc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGRybV9wY2kuaCAtLSBQQ0kgRE1BIG1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0gLSotIGxpbnV4LWMgLSotICovCisvKioKKyAqIFxmaWxlIGRybV9wY2kuYworICogXGJyaWVmIEZ1bmN0aW9ucyBhbmQgaW9jdGxzIHRvIG1hbmFnZSBQQ0kgbWVtb3J5CisgKgorICogXHdhcm5pbmcgVGhlc2UgaW50ZXJmYWNlcyBhcmVuJ3Qgc3RhYmxlIHlldC4KKyAqCisgKiBcdG9kbyBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyBpb2N0bCdzIGZvciB0aGUgUENJIHBvb2xzLgorICogXHRvZG8gVGhlIHdyYXBwZXJzIGhlcmUgYXJlIHNvIHRoaW4gdGhhdCB0aGV5IHdvdWxkIGJlIGJldHRlciBvZmYgaW5saW5lZC4uCisgKgorICogXGF1dGhvciBKb3NlIEZvbnNlY2EgPGpyZm9uc2VjYUB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqIFxhdXRob3IgTGVpZiBEZWxnYXNzIDxsZGVsZ2Fzc0ByZXRpbmFsYnVybi5uZXQ+CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAyMDAzIEpvc++/vUZvbnNlY2EuCisgKiBDb3B5cmlnaHQgMjAwMyBMZWlmIERlbGdhc3MuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIFBDSSBtZW1vcnkgKi8KKy8qQHsqLworCisvKioKKyAqIFxicmllZiBBbGxvY2F0ZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jaywgZm9yIERNQS4KKyAqLwordm9pZCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisJCSAgICBkbWFfYWRkcl90IG1heGFkZHIsIGRtYV9hZGRyX3QgKiBidXNhZGRyKQoreworCXZvaWQgKmFkZHJlc3M7CisjaWYgRFJNX0RFQlVHX01FTU9SWQorCWludCBhcmVhID0gRFJNX01FTV9ETUE7CisKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJaWYgKChkcm1fcmFtX3VzZWQgPj4gUEFHRV9TSElGVCkKKwkgICAgPiAoRFJNX1JBTV9QRVJDRU5UICogZHJtX3JhbV9hdmFpbGFibGUpIC8gMTAwKSB7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CisjZW5kaWYKKworCS8qIHBjaV9hbGxvY19jb25zaXN0ZW50IG9ubHkgZ3VhcmFudGVlcyBhbGlnbm1lbnQgdG8gdGhlIHNtYWxsZXN0CisJICogUEFHRV9TSVpFIG9yZGVyIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVxdWVzdGVkIHNpemUuCisJICogUmV0dXJuIE5VTEwgaGVyZSBmb3Igbm93IHRvIG1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgZm9yIGxhcmdlciBhbGlnbm1lbnQKKwkgKi8KKwlpZiAoYWxpZ24gPiBzaXplKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKGRldi0+cGRldiwgbWF4YWRkcikgIT0gMCkgeworCQlEUk1fRVJST1IoIlNldHRpbmcgcGNpIGRtYSBtYXNrIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWFkZHJlc3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsIGJ1c2FkZHIpOworCisjaWYgRFJNX0RFQlVHX01FTU9SWQorCWlmIChhZGRyZXNzID09IE5VTEwpIHsKKwkJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCQkrK2RybV9tZW1fc3RhdHNbYXJlYV0uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOworCWRybV9yYW1fdXNlZCArPSBzaXplOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOworI2Vsc2UKKwlpZiAoYWRkcmVzcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisJbWVtc2V0KGFkZHJlc3MsIDAsIHNpemUpOworCisJcmV0dXJuIGFkZHJlc3M7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wY2lfYWxsb2MpOworCisvKioKKyAqIFxicmllZiBGcmVlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrLgorICovCit2b2lkCitkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzYWRkcikKK3sKKyNpZiBEUk1fREVCVUdfTUVNT1JZCisJaW50IGFyZWEgPSBEUk1fTUVNX0RNQTsKKwlpbnQgYWxsb2NfY291bnQ7CisJaW50IGZyZWVfY291bnQ7CisjZW5kaWYKKworCWlmICghdmFkZHIpIHsKKyNpZiBEUk1fREVCVUdfTUVNT1JZCisJCURSTV9NRU1fRVJST1IoYXJlYSwgIkF0dGVtcHQgdG8gZnJlZSBhZGRyZXNzIDBcbiIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsIHZhZGRyLCBidXNhZGRyKTsKKwl9CisKKyNpZiBEUk1fREVCVUdfTUVNT1JZCisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCWZyZWVfY291bnQgPSArK2RybV9tZW1fc3RhdHNbYXJlYV0uZnJlZV9jb3VudDsKKwlhbGxvY19jb3VudCA9IGRybV9tZW1fc3RhdHNbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IHNpemU7CisJZHJtX3JhbV91c2VkIC09IHNpemU7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CisJaWYgKGZyZWVfY291bnQgPiBhbGxvY19jb3VudCkgeworCQlEUk1fTUVNX0VSUk9SKGFyZWEsCisJCQkgICAgICAiRXhjZXNzIGZyZWVzOiAlZCBmcmVlcywgJWQgYWxsb2NzXG4iLAorCQkJICAgICAgZnJlZV9jb3VudCwgYWxsb2NfY291bnQpOworCX0KKyNlbmRpZgorCit9CitFWFBPUlRfU1lNQk9MKGRybV9wY2lfZnJlZSk7CisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGEyOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgICBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSB0aGUgZHJtX3BjaWlkcy50eHQgaW4gdGhlIERSTSBDVlMKKyAgIFBsZWFzZSBjb250YWN0IGRyaS1kZXZlbEBsaXN0cy5zZi5uZXQgdG8gYWRkIG5ldyBjYXJkcyB0byB0aGlzIGxpc3QKKyovCisjZGVmaW5lIHJhZGVvbl9QQ0lfSURTIFwKKwl7MHgxMDAyLCAweDQxMzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMxMDB8Q0hJUF9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg0MTM3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMjAwfENISVBfSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4NDE0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MH0sIFwKKwl7MHgxMDAyLCAweDQxNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCisJezB4MTAwMiwgMHg0MTUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfSwgXAorCXsweDEwMDIsIDB4NDE1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MH0sIFwKKwl7MHgxMDAyLCAweDQxNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCisJezB4MTAwMiwgMHg0MTU2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfSwgXAorCXsweDEwMDIsIDB4NDIzNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzI1MHxDSElQX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDQyNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDQyNDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDQzMzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMxMDB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDQzMzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMyMDB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDQ0MzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMyNTB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDQ5NjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDQ5NjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDQ5NjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDQ5NjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDRDNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNUEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MHxDSElQX0lTX01PQklMSVRZfSwgXAorCXsweDEwMDIsIDB4NEM2NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMjUwfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg0QzY2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MHxDSElQX0lTX01PQklMSVRZfSwgXAorCXsweDEwMDIsIDB4NEU1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MHxDSElQX0lTX01PQklMSVRZfSwgXAorCXsweDEwMDIsIDB4NTE0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCisJezB4MTAwMiwgMHg1MTQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IxMDB8Q0hJUF9TSU5HTEVfQ1JUQ30sIFwKKwl7MHgxMDAyLCAweDUxNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjEwMHxDSElQX1NJTkdMRV9DUlRDfSwgXAorCXsweDEwMDIsIDB4NTE0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCisJezB4MTAwMiwgMHg1MTQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjAwfSwgXAorCXsweDEwMDIsIDB4NTE1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB9LCBcCisJezB4MTAwMiwgMHg1MTVBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMTAwfSwgXAorCXsweDEwMDIsIDB4NTE1RSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjEwMH0sIFwKKwl7MHgxMDAyLCAweDUxNjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNkEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNkIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNkMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDU4MzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMzMDB8Q0hJUF9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg1ODM1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfENISVBfSVNfSUdQfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg1ODM2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfENISVBfSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4NTgzNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDU5NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCisJezB4MTAwMiwgMHg1OTYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NTk2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDU5NjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCisJezB4MTAwMiwgMHg1OTY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NTk2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDU5NjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB9LCBcCisJezB4MTAwMiwgMHg1OTZBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NTk2QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDVjNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDVjNjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCisJezB4MTAwMiwgMHg1YzYzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg1YzY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXswLCAwLCAwfQorCisjZGVmaW5lIHIxMjhfUENJX0lEUyBcCisJezB4MTAwMiwgMHg0YzQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRkNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0ZDRjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDRDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0RCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNEUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDRGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA1NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTI0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUyNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MjQ3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTI0YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUyNGMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MzRkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTQ0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDU0NEMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1NDUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXswLCAwLCAwfQorCisjZGVmaW5lIG1nYV9QQ0lfSURTIFwKKwl7MHgxMDJiLCAweDA1MjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAyYiwgMHgwNTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMmIsIDB4MjUyNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBtYWNoNjRfUENJX0lEUyBcCisJezB4MTAwMiwgMHg0NzQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDQ3NTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0NzQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRjNDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0YzUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM1MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRjNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0YzQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc0YywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDQ3NGYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0NzUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDQ3NGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0NzRlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRjNTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0YzRkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBzaXNkcnZfUENJX0lEUyBcCisJezB4MTAzOSwgMHgwMzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMzksIDB4NTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDM5LCAweDYzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAzOSwgMHg3MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXswLCAwLCAwfQorCisjZGVmaW5lIHRkZnhfUENJX0lEUyBcCisJezB4MTIxYSwgMHgwMDAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEyMWEsIDB4MDAwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMjFhLCAweDAwMDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTIxYSwgMHgwMDA3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEyMWEsIDB4MDAwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMjFhLCAweDAwMGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezAsIDAsIDB9CisKKyNkZWZpbmUgdmlhZHJ2X1BDSV9JRFMgXAorCXsweDExMDYsIDB4MzAyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMTA2LCAweDMxMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHg3MjA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDExMDYsIDB4NzIwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBpODEwX1BDSV9JRFMgXAorCXsweDgwODYsIDB4NzEyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg4MDg2LCAweDcxMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHg3MTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MTEzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBpODMwX1BDSV9JRFMgXAorCXsweDgwODYsIDB4MzU3NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg4MDg2LCAweDI1NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgzNTgyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MjU3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBnYW1tYV9QQ0lfSURTIFwKKwl7MHgzZDNkLCAweDAwMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezAsIDAsIDB9CisKKyNkZWZpbmUgc2F2YWdlX1BDSV9JRFMgXAorCXsweDUzMzMsIDB4OGEyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhhMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzEzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzJhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMmMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzJkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMmYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGEyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhkMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4ZDAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGQwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBmZmJfUENJX0lEUyBcCisJezAsIDAsIDB9CisKKyNkZWZpbmUgaTkxNV9QQ0lfSURTIFwKKwl7MHg4MDg2LCAweDM1NzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgyNTYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MzU4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg4MDg2LCAweDI1NzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgyNTgyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MjU5MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDZlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKQEAgLTAsMCArMSw1MzkgQEAKKy8qKgorICogXGZpbGUgZHJtX3Byb2MuaCAKKyAqIC9wcm9jIHN1cHBvcnQgZm9yIERSTQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBccGFyIEFja25vd2xlZGdlbWVudHM6CisgKiAgICBNYXR0aGV3IEogU290dGVrIDxtYXR0aGV3Lmouc290dGVrQGludGVsLmNvbT4gc2VudCBpbiBhIHBhdGNoIHRvIGZpeAorICogICAgdGhlIHByb2JsZW0gd2l0aCB0aGUgcHJvYyBmaWxlcyBub3Qgb3V0cHV0dGluZyBhbGwgdGhlaXIgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IE1vbiBKYW4gMTEgMDk6NDg6NDcgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworc3RhdGljIGludAkgICBkcm1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludAkgICBkcm1fdm1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCWludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50CSAgIGRybV9jbGllbnRzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50CSAgIGRybV9xdWV1ZXNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludAkgICBkcm1fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworI2lmIERSTV9ERUJVR19DT0RFCitzdGF0aWMgaW50CSAgIGRybV92bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCSBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworI2VuZGlmCisKKy8qKgorICogUHJvYyBmaWxlIGxpc3QuCisgKi8KK3N0cnVjdCBkcm1fcHJvY19saXN0IHsKKwljb25zdCBjaGFyICpuYW1lOwkvKio8IGZpbGUgbmFtZSAqLworCWludAkgICAoKmYpKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CS8qKjwgcHJvYyBjYWxsYmFjayovCit9IGRybV9wcm9jX2xpc3RbXSA9IHsKKwl7ICJuYW1lIiwgICAgZHJtX25hbWVfaW5mbyAgICB9LAorCXsgIm1lbSIsICAgICBkcm1fbWVtX2luZm8gICAgIH0sCisJeyAidm0iLAkgICAgIGRybV92bV9pbmZvICAgICAgfSwKKwl7ICJjbGllbnRzIiwgZHJtX2NsaWVudHNfaW5mbyB9LAorCXsgInF1ZXVlcyIsICBkcm1fcXVldWVzX2luZm8gIH0sCisJeyAiYnVmcyIsICAgIGRybV9idWZzX2luZm8gICAgfSwKKyNpZiBEUk1fREVCVUdfQ09ERQorCXsgInZtYSIsICAgICBkcm1fdm1hX2luZm8gICAgIH0sCisjZW5kaWYKK307CisjZGVmaW5lIERSTV9QUk9DX0VOVFJJRVMgKHNpemVvZihkcm1fcHJvY19saXN0KS9zaXplb2YoZHJtX3Byb2NfbGlzdFswXSkpCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgRFJJIHByb2MgZmlsZXN5c3RlbSBmb3IgYSBkZXZpY2UuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIG1pbm9yIGRldmljZSBtaW5vciBudW1iZXIuCisgKiBccGFyYW0gcm9vdCBEUkkgcHJvYyBkaXIgZW50cnkuCisgKiBccGFyYW0gZGV2X3Jvb3QgcmVzdWx0aW5nIERSSSBkZXZpY2UgcHJvYyBkaXIgZW50cnkuCisgKiBccmV0dXJuIHJvb3QgZW50cnkgcG9pbnRlciBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgKiAKKyAqIENyZWF0ZSB0aGUgRFJJIHByb2Mgcm9vdCBlbnRyeSAiL3Byb2MvZHJpIiwgdGhlIGRldmljZSBwcm9jIHJvb3QgZW50cnkKKyAqICIvcHJvYy9kcmkvJW1pbm9yJS8iLCBhbmQgZWFjaCBlbnRyeSBpbiBwcm9jX2xpc3QgYXMKKyAqICIvcHJvYy9kcmkvJW1pbm9yJS8lbmFtZSUiLgorICovCitpbnQgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwgaW50IG1pbm9yLAorCQkgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqZGV2X3Jvb3QpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJaW50CQkgICAgICBpLCBqOworCWNoYXIgICAgICAgICAgICAgICAgICBuYW1lWzY0XTsKKworCXNwcmludGYobmFtZSwgIiVkIiwgbWlub3IpOworCSpkZXZfcm9vdCA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZESVIsIHJvb3QpOworCWlmICghKmRldl9yb290KSB7CisJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmkvJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERSTV9QUk9DX0VOVFJJRVM7IGkrKykgeworCQllbnQgPSBjcmVhdGVfcHJvY19lbnRyeShkcm1fcHJvY19saXN0W2ldLm5hbWUsCisJCQkJCVNfSUZSRUd8U19JUlVHTywgKmRldl9yb290KTsKKwkJaWYgKCFlbnQpIHsKKwkJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmkvJXMvJXNcbiIsCisJCQkJICBuYW1lLCBkcm1fcHJvY19saXN0W2ldLm5hbWUpOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQlyZW1vdmVfcHJvY19lbnRyeShkcm1fcHJvY19saXN0W2ldLm5hbWUsCisJCQkJCQkgICpkZXZfcm9vdCk7CisJCQlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCByb290KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQllbnQtPnJlYWRfcHJvYyA9IGRybV9wcm9jX2xpc3RbaV0uZjsKKwkJZW50LT5kYXRhICAgICAgPSBkZXY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBDbGVhbnVwIHRoZSBwcm9jIGZpbGVzeXN0ZW0gcmVzb3VyY2VzLgorICoKKyAqIFxwYXJhbSBtaW5vciBkZXZpY2UgbWlub3IgbnVtYmVyLgorICogXHBhcmFtIHJvb3QgRFJJIHByb2MgZGlyIGVudHJ5LgorICogXHBhcmFtIGRldl9yb290IERSSSBkZXZpY2UgcHJvYyBkaXIgZW50cnkuCisgKiBccmV0dXJuIGFsd2F5cyB6ZXJvLgorICoKKyAqIFJlbW92ZSBhbGwgcHJvYyBlbnRyaWVzIGNyZWF0ZWQgYnkgcHJvY19pbml0KCkuCisgKi8KK2ludCBkcm1fcHJvY19jbGVhbnVwKGludCBtaW5vciwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkgICAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290KQoreworCWludCAgaTsKKwljaGFyIG5hbWVbNjRdOworCisJaWYgKCFyb290IHx8ICFkZXZfcm9vdCkgcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFJNX1BST0NfRU5UUklFUzsgaSsrKQorCQlyZW1vdmVfcHJvY19lbnRyeShkcm1fcHJvY19saXN0W2ldLm5hbWUsIGRldl9yb290KTsKKwlzcHJpbnRmKG5hbWUsICIlZCIsIG1pbm9yKTsKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCByb290KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuICIvcHJvYy9kcmkvLi4uL25hbWUiIGlzIHJlYWQuCisgKiAKKyAqIFxwYXJhbSBidWYgb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBzdGFydCBzdGFydCBvZiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBvZmZzZXQgcmVxdWVzdGVkIHN0YXJ0IG9mZnNldC4KKyAqIFxwYXJhbSByZXF1ZXN0IHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuCisgKiBccGFyYW0gZW9mIHdoZXRoZXIgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJldHVybi4KKyAqIFxwYXJhbSBkYXRhIHByaXZhdGUgZGF0YS4KKyAqIFxyZXR1cm4gbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMuCisgKiAKKyAqIFByaW50cyB0aGUgZGV2aWNlIG5hbWUgdG9nZXRoZXIgd2l0aCB0aGUgYnVzIGlkIGlmIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBkcm1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludCAgICAgICAgICBsZW4gID0gMDsKKworCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCSplb2YgICA9IDA7CisKKwlpZiAoZGV2LT51bmlxdWUpIHsKKwkJRFJNX1BST0NfUFJJTlQoIiVzICVzICVzXG4iLAorCQkJICAgICAgIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsIHBjaV9uYW1lKGRldi0+cGRldiksIGRldi0+dW5pcXVlKTsKKwl9IGVsc2UgeworCQlEUk1fUFJPQ19QUklOVCgiJXMgJXNcbiIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsIHBjaV9uYW1lKGRldi0+cGRldikpOworCX0KKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCisvKioKKyAqIENhbGxlZCB3aGVuICIvcHJvYy9kcmkvLi4uL3ZtIiBpcyByZWFkLgorICogCisgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RhcnQgc3RhcnQgb2Ygb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gb2Zmc2V0IHJlcXVlc3RlZCBzdGFydCBvZmZzZXQuCisgKiBccGFyYW0gcmVxdWVzdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICogCisgKiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG1hcHBpbmdzIGluIGRybV9kZXZpY2U6Om1hcGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgZHJtX192bV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50ICAgICAgICAgIGxlbiAgPSAwOworCWRybV9tYXBfdCAgICAqbWFwOworCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCQkJCS8qIEhhcmRjb2RlZCBmcm9tIF9EUk1fRlJBTUVfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRFJNX1JFR0lTVEVSUywgX0RSTV9TSE0sIF9EUk1fQUdQLCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RSTV9TQ0FUVEVSX0dBVEhFUi4gKi8KKwljb25zdCBjaGFyICAgKnR5cGVzW10gPSB7ICJGQiIsICJSRUciLCAiU0hNIiwgIkFHUCIsICJTRyIgfTsKKwljb25zdCBjaGFyICAgKnR5cGU7CisJaW50CSAgICAgaTsKKworCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCSplb2YgICA9IDA7CisKKwlEUk1fUFJPQ19QUklOVCgic2xvdAkgb2Zmc2V0CSAgICAgIHNpemUgdHlwZSBmbGFncwkgIgorCQkgICAgICAgImFkZHJlc3MgbXRyclxuXG4iKTsKKwlpID0gMDsKKwlpZiAoZGV2LT5tYXBsaXN0ICE9IE5VTEwpIGxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmKCFtYXApIGNvbnRpbnVlOworCQlpZiAobWFwLT50eXBlIDwgMCB8fCBtYXAtPnR5cGUgPiA0KSB0eXBlID0gIj8/IjsKKwkJZWxzZQkJCQkgICAgdHlwZSA9IHR5cGVzW21hcC0+dHlwZV07CisJCURSTV9QUk9DX1BSSU5UKCIlNGQgMHglMDhseCAweCUwOGx4ICU0LjRzICAweCUwMnggMHglMDhseCAiLAorCQkJICAgICAgIGksCisJCQkgICAgICAgbWFwLT5vZmZzZXQsCisJCQkgICAgICAgbWFwLT5zaXplLAorCQkJICAgICAgIHR5cGUsCisJCQkgICAgICAgbWFwLT5mbGFncywKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyltYXAtPmhhbmRsZSk7CisJCWlmIChtYXAtPm10cnIgPCAwKSB7CisJCQlEUk1fUFJPQ19QUklOVCgibm9uZVxuIik7CisJCX0gZWxzZSB7CisJCQlEUk1fUFJPQ19QUklOVCgiJTRkXG4iLCBtYXAtPm10cnIpOworCQl9CisJCWkrKzsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkgcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX3ZtX2luZm8oKSB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3Rfc2VtIGxvY2suCisgKi8KK3N0YXRpYyBpbnQgZHJtX3ZtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCisJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX192bV9pbmZvKGJ1Ziwgc3RhcnQsIG9mZnNldCwgcmVxdWVzdCwgZW9mLCBkYXRhKTsKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIENhbGxlZCB3aGVuICIvcHJvYy9kcmkvLi4uL3F1ZXVlcyIgaXMgcmVhZC4KKyAqIAorICogXHBhcmFtIGJ1ZiBvdXRwdXQgYnVmZmVyLgorICogXHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIG9mZnNldCByZXF1ZXN0ZWQgc3RhcnQgb2Zmc2V0LgorICogXHBhcmFtIHJlcXVlc3QgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcy4KKyAqIFxwYXJhbSBlb2Ygd2hldGhlciB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gcmV0dXJuLgorICogXHBhcmFtIGRhdGEgcHJpdmF0ZSBkYXRhLgorICogXHJldHVybiBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcy4KKyAqLworc3RhdGljIGludCBkcm1fX3F1ZXVlc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludCAgICAgICAgICBsZW4gID0gMDsKKwlpbnQJICAgICBpOworCWRybV9xdWV1ZV90ICAqcTsKKworCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCSplb2YgICA9IDA7CisKKwlEUk1fUFJPQ19QUklOVCgiICBjdHgvZmxhZ3MgICB1c2UgICBmaW4iCisJCSAgICAgICAiICAgYmxrL3J3L3J3ZiAgd2FpdCAgICBmbHVzaGVkCSAgIHF1ZXVlZCIKKwkJICAgICAgICIgICAgICBsb2Nrc1xuXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCXEgPSBkZXYtPnF1ZXVlbGlzdFtpXTsKKwkJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwkJRFJNX1BST0NfUFJJTlRfUkVUKGF0b21pY19kZWMoJnEtPnVzZV9jb3VudCksCisJCQkJICAgIiU1ZC8weCUwM3ggJTVkICU1ZCIKKwkJCQkgICAiICU1ZC8lYyVjLyVjJWMlYyAlNVpkXG4iLAorCQkJCSAgIGksCisJCQkJICAgcS0+ZmxhZ3MsCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCksCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbiksCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPmJsb2NrX2NvdW50KSwKKwkJCQkgICBhdG9taWNfcmVhZCgmcS0+YmxvY2tfcmVhZCkgPyAncicgOiAnLScsCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPmJsb2NrX3dyaXRlKSA/ICd3JyA6ICctJywKKwkJCQkgICB3YWl0cXVldWVfYWN0aXZlKCZxLT5yZWFkX3F1ZXVlKSA/ICdyJzonLScsCisJCQkJICAgd2FpdHF1ZXVlX2FjdGl2ZSgmcS0+d3JpdGVfcXVldWUpID8gJ3cnOictJywKKwkJCQkgICB3YWl0cXVldWVfYWN0aXZlKCZxLT5mbHVzaF9xdWV1ZSkgPyAnZic6Jy0nLAorCQkJCSAgIERSTV9CVUZDT1VOVCgmcS0+d2FpdGxpc3QpKTsKKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkgcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX3F1ZXVlc19pbmZvKCkgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgorICovCitzdGF0aWMgaW50IGRybV9xdWV1ZXNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKKwkJCSAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX19xdWV1ZXNfaW5mbyhidWYsIHN0YXJ0LCBvZmZzZXQsIHJlcXVlc3QsIGVvZiwgZGF0YSk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiAiL3Byb2MvZHJpLy4uLi9idWZzIiBpcyByZWFkLgorICogCisgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RhcnQgc3RhcnQgb2Ygb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gb2Zmc2V0IHJlcXVlc3RlZCBzdGFydCBvZmZzZXQuCisgKiBccGFyYW0gcmVxdWVzdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICovCitzdGF0aWMgaW50IGRybV9fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJZHJtX2RldmljZV90CSAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50ICAgICAgICAgICAgICBsZW4gID0gMDsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQJCSBpOworCisJaWYgKCFkbWEgfHwgb2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCSpzdGFydCA9ICZidWZbb2Zmc2V0XTsKKwkqZW9mICAgPSAwOworCisJRFJNX1BST0NfUFJJTlQoIiBvICAgICBzaXplIGNvdW50ICBmcmVlCSBzZWdzIHBhZ2VzICAgIGtCXG5cbiIpOworCWZvciAoaSA9IDA7IGkgPD0gRFJNX01BWF9PUkRFUjsgaSsrKSB7CisJCWlmIChkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50KQorCQkJRFJNX1BST0NfUFJJTlQoIiUyZCAlOGQgJTVkICU1ZCAlNWQgJTVkICU1bGRcbiIsCisJCQkJICAgICAgIGksCisJCQkJICAgICAgIGRtYS0+YnVmc1tpXS5idWZfc2l6ZSwKKwkJCQkgICAgICAgZG1hLT5idWZzW2ldLmJ1Zl9jb3VudCwKKwkJCQkgICAgICAgYXRvbWljX3JlYWQoJmRtYS0+YnVmc1tpXQorCQkJCQkJICAgLmZyZWVsaXN0LmNvdW50KSwKKwkJCQkgICAgICAgZG1hLT5idWZzW2ldLnNlZ19jb3VudCwKKwkJCQkgICAgICAgZG1hLT5idWZzW2ldLnNlZ19jb3VudAorCQkJCSAgICAgICAqKDEgPDwgZG1hLT5idWZzW2ldLnBhZ2Vfb3JkZXIpLAorCQkJCSAgICAgICAoZG1hLT5idWZzW2ldLnNlZ19jb3VudAorCQkJCQkqICgxIDw8IGRtYS0+YnVmc1tpXS5wYWdlX29yZGVyKSkKKwkJCQkgICAgICAgKiBQQUdFX1NJWkUgLyAxMDI0KTsKKwl9CisJRFJNX1BST0NfUFJJTlQoIlxuIik7CisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkJaWYgKGkgJiYgIShpJTMyKSkgRFJNX1BST0NfUFJJTlQoIlxuIik7CisJCURSTV9QUk9DX1BSSU5UKCIgJWQiLCBkbWEtPmJ1Zmxpc3RbaV0tPmxpc3QpOworCX0KKwlEUk1fUFJPQ19QUklOVCgiXG4iKTsKKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCisvKioKKyAqIFNpbXBseSBjYWxscyBfYnVmc19pbmZvKCkgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgorICovCitzdGF0aWMgaW50IGRybV9idWZzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50CSAgICAgcmV0OworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyZXQgPSBkcm1fX2J1ZnNfaW5mbyhidWYsIHN0YXJ0LCBvZmZzZXQsIHJlcXVlc3QsIGVvZiwgZGF0YSk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiAiL3Byb2MvZHJpLy4uLi9jbGllbnRzIiBpcyByZWFkLgorICogCisgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RhcnQgc3RhcnQgb2Ygb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gb2Zmc2V0IHJlcXVlc3RlZCBzdGFydCBvZmZzZXQuCisgKiBccGFyYW0gcmVxdWVzdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICovCitzdGF0aWMgaW50IGRybV9fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopZGF0YTsKKwlpbnQgICAgICAgICAgbGVuICA9IDA7CisJZHJtX2ZpbGVfdCAgICpwcml2OworCisJaWYgKG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhcnQgPSAmYnVmW29mZnNldF07CisJKmVvZiAgID0gMDsKKworCURSTV9QUk9DX1BSSU5UKCJhIGRldglwaWQgICAgdWlkCW1hZ2ljCSAgaW9jdGxzXG5cbiIpOworCWZvciAocHJpdiA9IGRldi0+ZmlsZV9maXJzdDsgcHJpdjsgcHJpdiA9IHByaXYtPm5leHQpIHsKKwkJRFJNX1BST0NfUFJJTlQoIiVjICUzZCAlNWQgJTVkICUxMHUgJTEwbHVcbiIsCisJCQkgICAgICAgcHJpdi0+YXV0aGVudGljYXRlZCA/ICd5JyA6ICduJywKKwkJCSAgICAgICBwcml2LT5taW5vciwKKwkJCSAgICAgICBwcml2LT5waWQsCisJCQkgICAgICAgcHJpdi0+dWlkLAorCQkJICAgICAgIHByaXYtPm1hZ2ljLAorCQkJICAgICAgIHByaXYtPmlvY3RsX2NvdW50KTsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkgcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX2NsaWVudHNfaW5mbygpIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworc3RhdGljIGludCBkcm1fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX19jbGllbnRzX2luZm8oYnVmLCBzdGFydCwgb2Zmc2V0LCByZXF1ZXN0LCBlb2YsIGRhdGEpOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyNpZiBEUk1fREVCVUdfQ09ERQorCitzdGF0aWMgaW50IGRybV9fdm1hX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9kZXZpY2VfdAkgICAgICAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50ICAgICAgICAgICAgICAgICAgIGxlbiAgPSAwOworCWRybV92bWFfZW50cnlfdAkgICAgICAqcHQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwl1bnNpZ25lZCBpbnQJICAgICAgcGdwcm90OworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCSpzdGFydCA9ICZidWZbb2Zmc2V0XTsKKwkqZW9mICAgPSAwOworCisJRFJNX1BST0NfUFJJTlQoInZtYSB1c2UgY291bnQ6ICVkLCBoaWdoX21lbW9yeSA9ICVwLCAweCUwOGx4XG4iLAorCQkgICAgICAgYXRvbWljX3JlYWQoJmRldi0+dm1hX2NvdW50KSwKKwkJICAgICAgIGhpZ2hfbWVtb3J5LCB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKTsKKwlmb3IgKHB0ID0gZGV2LT52bWFsaXN0OyBwdDsgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAoISh2bWEgPSBwdC0+dm1hKSkgY29udGludWU7CisJCURSTV9QUk9DX1BSSU5UKCJcbiU1ZCAweCUwOGx4LTB4JTA4bHggJWMlYyVjJWMlYyVjIDB4JTA4bHgiLAorCQkJICAgICAgIHB0LT5waWQsCisJCQkgICAgICAgdm1hLT52bV9zdGFydCwKKwkJCSAgICAgICB2bWEtPnZtX2VuZCwKKwkJCSAgICAgICB2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRAkgICA/ICdyJyA6ICctJywKKwkJCSAgICAgICB2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUJICAgPyAndycgOiAnLScsCisJCQkgICAgICAgdm1hLT52bV9mbGFncyAmIFZNX0VYRUMJICAgPyAneCcgOiAnLScsCisJCQkgICAgICAgdm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFID8gJ3MnIDogJ3AnLAorCQkJICAgICAgIHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQgICA/ICdsJyA6ICctJywKKwkJCSAgICAgICB2bWEtPnZtX2ZsYWdzICYgVk1fSU8JICAgPyAnaScgOiAnLScsCisJCQkgICAgICAgVk1fT0ZGU0VUKHZtYSkpOworCisjaWYgZGVmaW5lZChfX2kzODZfXykKKwkJcGdwcm90ID0gcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJCURSTV9QUk9DX1BSSU5UKCIgJWMlYyVjJWMlYyVjJWMlYyVjIiwKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QUkVTRU5UICA/ICdwJyA6ICctJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9SVyAgICAgICA/ICd3JyA6ICdyJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9VU0VSICAgICA/ICd1JyA6ICdzJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QV1QgICAgICA/ICd0JyA6ICdiJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QQ0QgICAgICA/ICd1JyA6ICdjJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9BQ0NFU1NFRCA/ICdhJyA6ICctJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9ESVJUWSAgICA/ICdkJyA6ICctJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QU0UgICAgICA/ICdtJyA6ICdrJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9HTE9CQUwgICA/ICdnJyA6ICdsJyApOworI2VuZGlmCisJCURSTV9QUk9DX1BSSU5UKCJcbiIpOworCX0KKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IGRybV92bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKKwkJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX192bWFfaW5mbyhidWYsIHN0YXJ0LCBvZmZzZXQsIHJlcXVlc3QsIGVvZiwgZGF0YSk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzgyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogXGZpbGUgZHJtX3NhcmVhLmggCisgKiBcYnJpZWYgU0FSRUEgZGVmaW5pdGlvbnMKKyAqCisgKiBcYXV0aG9yIE1pY2hlbCBE5G56ZXIgPG1pY2hlbEBkYWVuemVyLm5ldD4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX1NBUkVBX0hfCisjZGVmaW5lIF9EUk1fU0FSRUFfSF8KKworI2luY2x1ZGUgImRybS5oIgorCisvKiBTQVJFQSBhcmVhIG5lZWRzIHRvIGJlIGF0IGxlYXN0IGEgcGFnZSAqLworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKKyNkZWZpbmUgU0FSRUFfTUFYICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwICAgICAgICAgLyogNjRrQiAqLworI2Vsc2UKKy8qIEludGVsIDgzME0gZHJpdmVyIG5lZWRzIGF0IGxlYXN0IDhrIFNBUkVBICovCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZW5kaWYKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGRyYXdhYmxlcyBpbiB0aGUgU0FSRUEgKi8KKyNkZWZpbmUgU0FSRUFfTUFYX0RSQVdBQkxFUyAJCTI1NgorCisjZGVmaW5lIFNBUkVBX0RSQVdBQkxFX0NMQUlNRURfRU5UUlkgICAgMHg4MDAwMDAwMAorCisvKiogU0FSRUEgZHJhd2FibGUgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSB7CisgICAgdW5zaWduZWQgaW50CXN0YW1wOworICAgIHVuc2lnbmVkIGludAlmbGFnczsKK30gZHJtX3NhcmVhX2RyYXdhYmxlX3Q7CisKKy8qKiBTQVJFQSBmcmFtZSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIHg7CisgICAgdW5zaWduZWQgaW50ICAgICAgICB5OworICAgIHVuc2lnbmVkIGludCAgICAgICAgd2lkdGg7CisgICAgdW5zaWduZWQgaW50ICAgICAgICBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50ICAgICAgICBmdWxsc2NyZWVuOworfSBkcm1fc2FyZWFfZnJhbWVfdDsKKworLyoqIFNBUkVBICovCit0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWEgeworICAgIC8qKiBmaXJzdCB0aGluZyBpcyBhbHdheXMgdGhlIERSTSBsb2NraW5nIHN0cnVjdHVyZSAqLworICAgIGRybV9od19sb2NrX3QJCWxvY2s7CisgICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KKyAgICBkcm1faHdfbG9ja190CQlkcmF3YWJsZV9sb2NrOworICAgIGRybV9zYXJlYV9kcmF3YWJsZV90CWRyYXdhYmxlVGFibGVbU0FSRUFfTUFYX0RSQVdBQkxFU107CS8qKjwgZHJhd2FibGVzICovCisgICAgZHJtX3NhcmVhX2ZyYW1lX3QJCWZyYW1lOwkvKio8IGZyYW1lICovCisgICAgZHJtX2NvbnRleHRfdAkJZHVtbXlfY29udGV4dDsKK30gZHJtX3NhcmVhX3Q7CisKKyNlbmRpZgkvKiBfRFJNX1NBUkVBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmZGRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoqCisgKiBcZmlsZSBkcm1fc2NhdHRlci5oIAorICogSU9DVExzIHRvIG1hbmFnZSBzY2F0dGVyL2dhdGhlciBtZW1vcnkKKyAqCisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogTW9uIERlYyAxOCAyMzoyMDo1NCAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorCisjZGVmaW5lIERFQlVHX1NDQVRURVIgMAorCit2b2lkIGRybV9zZ19jbGVhbnVwKCBkcm1fc2dfbWVtX3QgKmVudHJ5ICkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGVudHJ5LT5wYWdlcyA7IGkrKyApIHsKKwkJcGFnZSA9IGVudHJ5LT5wYWdlbGlzdFtpXTsKKwkJaWYgKCBwYWdlICkKKwkJCUNsZWFyUGFnZVJlc2VydmVkKCBwYWdlICk7CisJfQorCisJdmZyZWUoIGVudHJ5LT52aXJ0dWFsICk7CisKKwlkcm1fZnJlZSggZW50cnktPmJ1c2FkZHIsCisJCSAgIGVudHJ5LT5wYWdlcyAqIHNpemVvZigqZW50cnktPmJ1c2FkZHIpLAorCQkgICBEUk1fTUVNX1BBR0VTICk7CisJZHJtX2ZyZWUoIGVudHJ5LT5wYWdlbGlzdCwKKwkJICAgZW50cnktPnBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpLAorCQkgICBEUk1fTUVNX1BBR0VTICk7CisJZHJtX2ZyZWUoIGVudHJ5LAorCQkgICBzaXplb2YoKmVudHJ5KSwKKwkJICAgRFJNX01FTV9TR0xJU1RTICk7Cit9CisKK2ludCBkcm1fc2dfYWxsb2MoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgcmVxdWVzdDsKKwlkcm1fc2dfbWVtX3QgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgcGFnZXMsIGksIGo7CisKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggZGV2LT5zZyApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllbnRyeSA9IGRybV9hbGxvYyggc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fU0dMSVNUUyApOworCWlmICggIWVudHJ5ICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKyAgIAltZW1zZXQoIGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSApOworCisJcGFnZXMgPSAocmVxdWVzdC5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJRFJNX0RFQlVHKCAic2cgc2l6ZT0lbGQgcGFnZXM9JWxkXG4iLCByZXF1ZXN0LnNpemUsIHBhZ2VzICk7CisKKwllbnRyeS0+cGFnZXMgPSBwYWdlczsKKwllbnRyeS0+cGFnZWxpc3QgPSBkcm1fYWxsb2MoIHBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpLAorCQkJCSAgICAgRFJNX01FTV9QQUdFUyApOworCWlmICggIWVudHJ5LT5wYWdlbGlzdCApIHsKKwkJZHJtX2ZyZWUoIGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9TR0xJU1RTICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChlbnRyeS0+cGFnZWxpc3QsIDAsIHBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpKTsKKworCWVudHJ5LT5idXNhZGRyID0gZHJtX2FsbG9jKCBwYWdlcyAqIHNpemVvZigqZW50cnktPmJ1c2FkZHIpLAorCQkJCSAgICAgRFJNX01FTV9QQUdFUyApOworCWlmICggIWVudHJ5LT5idXNhZGRyICkgeworCQlkcm1fZnJlZSggZW50cnktPnBhZ2VsaXN0LAorCQkJICAgZW50cnktPnBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpLAorCQkJICAgRFJNX01FTV9QQUdFUyApOworCQlkcm1fZnJlZSggZW50cnksCisJCQkgICBzaXplb2YoKmVudHJ5KSwKKwkJCSAgIERSTV9NRU1fU0dMSVNUUyApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCAodm9pZCAqKWVudHJ5LT5idXNhZGRyLCAwLCBwYWdlcyAqIHNpemVvZigqZW50cnktPmJ1c2FkZHIpICk7CisKKwllbnRyeS0+dmlydHVhbCA9IHZtYWxsb2NfMzIoIHBhZ2VzIDw8IFBBR0VfU0hJRlQgKTsKKwlpZiAoICFlbnRyeS0+dmlydHVhbCApIHsKKwkJZHJtX2ZyZWUoIGVudHJ5LT5idXNhZGRyLAorCQkJICAgZW50cnktPnBhZ2VzICogc2l6ZW9mKCplbnRyeS0+YnVzYWRkciksCisJCQkgICBEUk1fTUVNX1BBR0VTICk7CisJCWRybV9mcmVlKCBlbnRyeS0+cGFnZWxpc3QsCisJCQkgICBlbnRyeS0+cGFnZXMgKiBzaXplb2YoKmVudHJ5LT5wYWdlbGlzdCksCisJCQkgICBEUk1fTUVNX1BBR0VTICk7CisJCWRybV9mcmVlKCBlbnRyeSwKKwkJCSAgIHNpemVvZigqZW50cnkpLAorCQkJICAgRFJNX01FTV9TR0xJU1RTICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFRoaXMgYWxzbyBmb3JjZXMgdGhlIG1hcHBpbmcgb2YgQ09XIHBhZ2VzLCBzbyBvdXIgcGFnZSBsaXN0CisJICogd2lsbCBiZSB2YWxpZC4gIFBsZWFzZSBkb24ndCByZW1vdmUgaXQuLi4KKwkgKi8KKwltZW1zZXQoIGVudHJ5LT52aXJ0dWFsLCAwLCBwYWdlcyA8PCBQQUdFX1NISUZUICk7CisKKwllbnRyeS0+aGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpZW50cnktPnZpcnR1YWw7CisKKwlEUk1fREVCVUcoICJzZyBhbGxvYyBoYW5kbGUgID0gJTA4bHhcbiIsIGVudHJ5LT5oYW5kbGUgKTsKKwlEUk1fREVCVUcoICJzZyBhbGxvYyB2aXJ0dWFsID0gJXBcbiIsIGVudHJ5LT52aXJ0dWFsICk7CisKKwlmb3IgKCBpID0gZW50cnktPmhhbmRsZSwgaiA9IDAgOyBqIDwgcGFnZXMgOyBpICs9IFBBR0VfU0laRSwgaisrICkgeworCQllbnRyeS0+cGFnZWxpc3Rbal0gPSB2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilpKTsKKwkJaWYgKCFlbnRyeS0+cGFnZWxpc3Rbal0pCisJCQlnb3RvIGZhaWxlZDsKKwkJU2V0UGFnZVJlc2VydmVkKGVudHJ5LT5wYWdlbGlzdFtqXSk7CisJfQorCisJcmVxdWVzdC5oYW5kbGUgPSBlbnRyeS0+aGFuZGxlOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKSApIHsKKwkJZHJtX3NnX2NsZWFudXAoIGVudHJ5ICk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRldi0+c2cgPSBlbnRyeTsKKworI2lmIERFQlVHX1NDQVRURVIKKwkvKiBWZXJpZnkgdGhhdCBlYWNoIHBhZ2UgcG9pbnRzIHRvIGl0cyB2aXJ0dWFsIGFkZHJlc3MsIGFuZCB2aWNlCisJICogdmVyc2EuCisJICovCisJeworCWludCBlcnJvciA9IDA7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBwYWdlcyA7IGkrKyApIHsKKwkJdW5zaWduZWQgbG9uZyAqdG1wOworCisJCXRtcCA9IHBhZ2VfYWRkcmVzcyggZW50cnktPnBhZ2VsaXN0W2ldICk7CisJCWZvciAoIGogPSAwIDsKKwkJICAgICAgaiA8IFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSA7CisJCSAgICAgIGorKywgdG1wKysgKSB7CisJCQkqdG1wID0gMHhjYWZlYmFiZTsKKwkJfQorCQl0bXAgPSAodW5zaWduZWQgbG9uZyAqKSgodTggKillbnRyeS0+dmlydHVhbCArCisJCQkJCShQQUdFX1NJWkUgKiBpKSk7CisJCWZvciggaiA9IDAgOworCQkgICAgIGogPCBQQUdFX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykgOworCQkgICAgIGorKywgdG1wKysgKSB7CisJCQlpZiAoICp0bXAgIT0gMHhjYWZlYmFiZSAmJiBlcnJvciA9PSAwICkgeworCQkJCWVycm9yID0gMTsKKwkJCQlEUk1fRVJST1IoICJTY2F0dGVyIGFsbG9jYXRpb24gZXJyb3IsICIKKwkJCQkJICAgInBhZ2VsaXN0IGRvZXMgbm90IG1hdGNoICIKKwkJCQkJICAgInZpcnR1YWwgbWFwcGluZ1xuIiApOworCQkJfQorCQl9CisJCXRtcCA9IHBhZ2VfYWRkcmVzcyggZW50cnktPnBhZ2VsaXN0W2ldICk7CisJCWZvcihqID0gMCA7CisJCSAgICBqIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDsKKwkJICAgIGorKywgdG1wKyspIHsKKwkJCSp0bXAgPSAwOworCQl9CisJfQorCWlmIChlcnJvciA9PSAwKQorCQlEUk1fRVJST1IoICJTY2F0dGVyIGFsbG9jYXRpb24gbWF0Y2hlcyBwYWdlbGlzdFxuIiApOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyBmYWlsZWQ6CisJZHJtX3NnX2NsZWFudXAoIGVudHJ5ICk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK2ludCBkcm1fc2dfZnJlZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fc2NhdHRlcl9nYXRoZXJfdCByZXF1ZXN0OworCWRybV9zZ19tZW1fdCAqZW50cnk7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZyZXF1ZXN0LAorCQkJICAgICAoZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICopYXJnLAorCQkJICAgICBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJZW50cnkgPSBkZXYtPnNnOworCWRldi0+c2cgPSBOVUxMOworCisJaWYgKCAhZW50cnkgfHwgZW50cnktPmhhbmRsZSAhPSByZXF1ZXN0LmhhbmRsZSApCisJCXJldHVybiAtRUlOVkFMOworCisJRFJNX0RFQlVHKCAic2cgZnJlZSB2aXJ0dWFsICA9ICVwXG4iLCBlbnRyeS0+dmlydHVhbCApOworCisJZHJtX3NnX2NsZWFudXAoIGVudHJ5ICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NiZGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCkBAIC0wLDAgKzEsMzE5IEBACisvKioKKyAqIFxmaWxlIGRybV9zdHViLmgKKyAqIFN0dWIgc3VwcG9ydAorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IEZyaSBKYW4gMTkgMTA6NDg6MzUgMjAwMSBieSBmYWl0aEBhY20ub3JnCisgKgorICogQ29weXJpZ2h0IDIwMDEgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jb3JlLmgiCisKK3Vuc2lnbmVkIGludCBkcm1fY2FyZHNfbGltaXQgPSAxNjsJLyogRW5vdWdoIGZvciBvbmUgbWFjaGluZSAqLwordW5zaWduZWQgaW50IGRybV9kZWJ1ZyA9IDA7CQkvKiAxIHRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgKi8KK0VYUE9SVF9TWU1CT0woZHJtX2RlYnVnKTsKKworTU9EVUxFX0FVVEhPUiggQ09SRV9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggQ09SRV9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOworTU9EVUxFX1BBUk1fREVTQyhjYXJkc19saW1pdCwgIk1heGltdW0gbnVtYmVyIG9mIGdyYXBoaWNzIGNhcmRzIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG91dHB1dCIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoY2FyZHNfbGltaXQsIGRybV9jYXJkc19saW1pdCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHJtX2RlYnVnLCBpbnQsIDA2NjYpOworCitkcm1faGVhZF90ICoqZHJtX2hlYWRzOworc3RydWN0IGRybV9zeXNmc19jbGFzcyAqZHJtX2NsYXNzOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcm1fcHJvY19yb290OworCitzdGF0aWMgaW50IGRybV9maWxsX2luX2Rldihkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCit7CisJaW50IHJldGNvZGU7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5jb3VudF9sb2NrKTsKKwlpbml0X3RpbWVyKCAmZGV2LT50aW1lciApOworCXNlbWFfaW5pdCggJmRldi0+c3RydWN0X3NlbSwgMSApOworCXNlbWFfaW5pdCggJmRldi0+Y3R4bGlzdF9zZW0sIDEgKTsKKworCWRldi0+cGRldiAgID0gcGRldjsKKworI2lmZGVmIF9fYWxwaGFfXworCWRldi0+aG9zZSAgID0gcGRldi0+c3lzZGF0YTsKKwlkZXYtPnBjaV9kb21haW4gPSBkZXYtPmhvc2UtPmJ1cy0+bnVtYmVyOworI2Vsc2UKKwlkZXYtPnBjaV9kb21haW4gPSAwOworI2VuZGlmCisJZGV2LT5wY2lfYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJZGV2LT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwlkZXYtPnBjaV9mdW5jID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogdGhlIERSTSBoYXMgNiBiYXNpYyBjb3VudGVycyAqLworCWRldi0+Y291bnRlcnMgPSA2OworCWRldi0+dHlwZXNbMF0gID0gX0RSTV9TVEFUX0xPQ0s7CisJZGV2LT50eXBlc1sxXSAgPSBfRFJNX1NUQVRfT1BFTlM7CisJZGV2LT50eXBlc1syXSAgPSBfRFJNX1NUQVRfQ0xPU0VTOworCWRldi0+dHlwZXNbM10gID0gX0RSTV9TVEFUX0lPQ1RMUzsKKwlkZXYtPnR5cGVzWzRdICA9IF9EUk1fU1RBVF9MT0NLUzsKKwlkZXYtPnR5cGVzWzVdICA9IF9EUk1fU1RBVF9VTkxPQ0tTOworCisJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CisJCisJaWYgKGRldi0+ZHJpdmVyLT5wcmVpbml0KQorCQlpZiAoKHJldGNvZGUgPSBkZXYtPmRyaXZlci0+cHJlaW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCisJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSkgeworCQlkZXYtPmFncCA9IGRybV9hZ3BfaW5pdChkZXYpOworCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9SRVFVSVJFX0FHUCkgJiYgKGRldi0+YWdwID09IE5VTEwpKSB7CisJCQlEUk1fRVJST1IoICJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgYWdwZ2FydCBtb2R1bGUuXG4iICk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCQl9CisJCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpKSB7CisJCQlpZiAoZGV2LT5hZ3ApCisJCQkJZGV2LT5hZ3AtPmFncF9tdHJyID0gbXRycl9hZGQoIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX2Jhc2UsCisJCQkJCQkJICAgICAgIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX3NpemUqMTAyNCoxMDI0LAorCQkJCQkJCSAgICAgICBNVFJSX1RZUEVfV1JDT01CLAorCQkJCQkJCSAgICAgICAxICk7CisJCX0KKwl9CisKKwlyZXRjb2RlID0gZHJtX2N0eGJpdG1hcF9pbml0KCBkZXYgKTsKKwlpZiggcmV0Y29kZSApIHsKKwkJRFJNX0VSUk9SKCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGV4dCBiaXRtYXAuXG4iICk7CisJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCX0KKworCXJldHVybiAwOworCQorZXJyb3Jfb3V0X3VucmVnOgorCWRybV90YWtlZG93bihkZXYpOworCXJldHVybiByZXRjb2RlOworfQorCisvKioKKyAqIEZpbGUgXGMgb3BlbiBvcGVyYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqCisgKiBQdXRzIHRoZSBkZXYtPmZvcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZGV2aWNlIG1pbm9yIG51bWJlciBpbnRvCisgKiBccCBmaWxwLCBjYWxsIHRoZSBcYyBvcGVuIG1ldGhvZCwgYW5kIHJlc3RvcmUgdGhlIGZpbGUgb3BlcmF0aW9ucy4KKyAqLworaW50IGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IGVyciA9IC1FTk9ERVY7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CisJCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKCEoKG1pbm9yID49IDApICYmIChtaW5vciA8IGRybV9jYXJkc19saW1pdCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZHJtX2hlYWRzW21pbm9yXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJaWYgKCEoZGV2ID0gZHJtX2hlYWRzW21pbm9yXS0+ZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbGRfZm9wcyA9IGZpbHAtPmZfb3A7CisJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KCZkZXYtPmRyaXZlci0+Zm9wcyk7CisJaWYgKGZpbHAtPmZfb3AtPm9wZW4gJiYgKGVyciA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbHApKSkgeworCQlmb3BzX3B1dChmaWxwLT5mX29wKTsKKwkJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKKwl9CisJZm9wc19wdXQob2xkX2ZvcHMpOworCisJcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIFJlZ2lzdGVyLgorICoKKyAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0CisgKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCisgKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCisgKi8KK2ludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCWRybV9kZXZpY2VfdCAqZGV2OworCWludCByZXQ7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlkZXYgPSBkcm1fY2FsbG9jKDEsIHNpemVvZigqZGV2KSwgRFJNX01FTV9TVFVCKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmICgocmV0ID0gZHJtX2ZpbGxfaW5fZGV2KGRldiwgcGRldiwgZW50LCBkcml2ZXIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRSTTogRmlsbF9pbl9kZXYgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2cxOworCX0KKwlpZiAoKHJldCA9IGRybV9nZXRfaGVhZChkZXYsICZkZXYtPnByaW1hcnkpKSkKKwkJZ290byBlcnJfZzE7CisKKwkvKiBwb3N0aW5pdCBpcyBhIHJlcXVpcmVkIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHNpZ25vbiBiYW5uZXIgKi8KKwkvKiBkcml2ZXJzIGFkZCBzZWNvbmRhcnkgaGVhZHMgaGVyZSBpZiBuZWVkZWQgKi8KKwlpZiAoKHJldCA9IGRldi0+ZHJpdmVyLT5wb3N0aW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwkJZ290byBlcnJfZzE7CisKKwlyZXR1cm4gMDsKKworZXJyX2cxOgorCWRybV9mcmVlKGRldiwgc2l6ZW9mKCpkZXYpLCBEUk1fTUVNX1NUVUIpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfZGV2KTsKKworLyoqCisgKiBHZXQgYSBzZWNvbmRhcnkgbWlub3IgbnVtYmVyLgorICoKKyAqIFxwYXJhbSBkZXYgZGV2aWNlIGRhdGEgc3RydWN0dXJlCisgKiBccGFyYW0gc2VjLW1pbm9yIHN0cnVjdHVyZSB0byBob2xkIHRoZSBhc3NpZ25lZCBtaW5vcgorICogXHJldHVybiBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZWFyY2ggYW4gZW1wdHkgZW50cnkgYW5kIGluaXRpYWxpemUgaXQgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnMsIGFuZAorICogY3JlYXRlIHRoZSBwcm9jIGluaXQgZW50cnkgdmlhIHByb2NfaW5pdCgpLiBUaGlzIHJvdXRpbmVzIGFzc2lnbnMKKyAqIG1pbm9yIG51bWJlcnMgdG8gc2Vjb25kYXJ5IGhlYWRzIG9mIG11bHRpLWhlYWRlZCBjYXJkcworICovCitpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faGVhZF90ICpoZWFkKQoreworCWRybV9oZWFkX3QgKipoZWFkcyA9IGRybV9oZWFkczsKKwlpbnQgcmV0OworCWludCBtaW5vcjsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWZvciAobWlub3IgPSAwOyBtaW5vciA8IGRybV9jYXJkc19saW1pdDsgbWlub3IrKywgaGVhZHMrKykgeworCQlpZiAoISpoZWFkcykgeworCQkJCisJCQkqaGVhZCA9IChkcm1faGVhZF90KSB7CisJCQkJLmRldiA9IGRldiwKKwkJCQkuZGV2aWNlID0gTUtERVYoRFJNX01BSk9SLCBtaW5vciksCisJCQkJLm1pbm9yID0gbWlub3IsCisJCQl9OworCQkJCisJCQlpZiAoKHJldCA9IGRybV9wcm9jX2luaXQoZGV2LCBtaW5vciwgZHJtX3Byb2Nfcm9vdCwgJmhlYWQtPmRldl9yb290KSkpIHsKKwkJCQlwcmludGsgKEtFUk5fRVJSICJEUk06IEZhaWxlZCB0byBpbml0aWFsaXplIC9wcm9jL2RyaS5cbiIpOworCQkJCWdvdG8gZXJyX2cxOworCQkJfQorCisJCQkKKwkJCWhlYWQtPmRldl9jbGFzcyA9IGRybV9zeXNmc19kZXZpY2VfYWRkKGRybV9jbGFzcywKKwkJCQkJCQkgICAgICAgTUtERVYoRFJNX01BSk9SLAorCQkJCQkJCQkgICAgIG1pbm9yKSwKKwkJCQkJCQkgICAgICAgJmRldi0+cGRldi0+ZGV2LAorCQkJCQkJCSAgICAgICAiY2FyZCVkIiwgbWlub3IpOworCQkJaWYgKElTX0VSUihoZWFkLT5kZXZfY2xhc3MpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJEUk06IEVycm9yIHN5c2ZzX2RldmljZV9hZGQuXG4iKTsKKwkJCQlyZXQgPSBQVFJfRVJSKGhlYWQtPmRldl9jbGFzcyk7CisJCQkJZ290byBlcnJfZzI7CisJCQl9CisJCQkqaGVhZHMgPSBoZWFkOworCisJCQlEUk1fREVCVUcoIm5ldyBtaW5vciBhc3NpZ25lZCAlZFxuIiwgbWlub3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJRFJNX0VSUk9SKCJvdXQgb2YgbWlub3JzXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK2Vycl9nMjoKKwlkcm1fcHJvY19jbGVhbnVwKG1pbm9yLCBkcm1fcHJvY19yb290LCBoZWFkLT5kZXZfcm9vdCk7CitlcnJfZzE6CisJKmhlYWQgPSAoZHJtX2hlYWRfdCkgey5kZXYgPSBOVUxMfTsKKwlyZXR1cm4gcmV0OworfQorCQkKKworLyoqCisgKiBQdXQgYSBkZXZpY2UgbWlub3IgbnVtYmVyLgorICoKKyAqIFxwYXJhbSBkZXYgZGV2aWNlIGRhdGEgc3RydWN0dXJlCisgKiBccmV0dXJuIGFsd2F5cyB6ZXJvCisgKgorICogQ2xlYW5zIHVwIHRoZSBwcm9jIHJlc291cmNlcy4gSWYgaXQgaXMgdGhlIGxhc3QgbWlub3IgdGhlbiByZWxlYXNlIHRoZSBmb3JlaWduCisgKiAiZHJtIiBkYXRhLCBvdGhlcndpc2UgdW5yZWdpc3RlcnMgdGhlICJkcm0iIGRhdGEsIGZyZWVzIHRoZSBkZXYgbGlzdCBhbmQKKyAqIHVucmVnaXN0ZXJzIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLgorICovCitpbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KQoreworCURSTV9ERUJVRygicmVsZWFzZSBwcmltYXJ5ICVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKTsKKworCWlmIChkZXYtPnVuaXF1ZSkgeworCQlkcm1fZnJlZShkZXYtPnVuaXF1ZSwgc3RybGVuKGRldi0+dW5pcXVlKSArIDEsIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT51bmlxdWUgPSBOVUxMOworCQlkZXYtPnVuaXF1ZV9sZW4gPSAwOworCX0KKwlpZiAoZGV2LT5kZXZuYW1lKSB7CisJCWRybV9mcmVlKGRldi0+ZGV2bmFtZSwgc3RybGVuKGRldi0+ZGV2bmFtZSkgKyAxLAorCQkJIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT5kZXZuYW1lID0gTlVMTDsKKwl9CisJZHJtX2ZyZWUoZGV2LCBzaXplb2YoKmRldiksIERSTV9NRU1fU1RVQik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHV0IGEgc2Vjb25kYXJ5IG1pbm9yIG51bWJlci4KKyAqCisgKiBccGFyYW0gc2VjX21pbm9yIC0gc3RydWN0dXJlIHRvIGJlIHJlbGVhc2VkCisgKiBccmV0dXJuIGFsd2F5cyB6ZXJvCisgKgorICogQ2xlYW5zIHVwIHRoZSBwcm9jIHJlc291cmNlcy4gTm90IGxlZ2FsIGZvciB0aGlzIHRvIGJlIHRoZQorICogbGFzdCBtaW5vciByZWxlYXNlZC4KKyAqCisgKi8KK2ludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqaGVhZCkKK3sKKwlpbnQgbWlub3IgPSBoZWFkLT5taW5vcjsKKwkKKwlEUk1fREVCVUcoInJlbGVhc2Ugc2Vjb25kYXJ5IG1pbm9yICVkXG4iLCBtaW5vcik7CisJCisJZHJtX3Byb2NfY2xlYW51cChtaW5vciwgZHJtX3Byb2Nfcm9vdCwgaGVhZC0+ZGV2X3Jvb3QpOworCWRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKE1LREVWKERSTV9NQUpPUiwgaGVhZC0+bWlub3IpKTsKKwkKKwkqaGVhZCA9IChkcm1faGVhZF90KXsuZGV2ID0gTlVMTH07CisKKwlkcm1faGVhZHNbbWlub3JdID0gTlVMTDsKKwkKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBkcm1fc3lzZnMuYyAtIE1vZGlmaWNhdGlvbnMgdG8gZHJtX3N5c2ZzX2NsYXNzLmMgdG8gc3VwcG9ydAorICogICAgICAgICAgICAgICBleHRyYSBzeXNmcyBhdHRyaWJ1dGUgZnJvbSBEUk0uIE5vcm1hbCBkcm1fc3lzZnNfY2xhc3MKKyAqICAgICAgICAgICAgICAgZG9lcyBub3QgYWxsb3cgYWRkaW5nIGF0dHJpYnV0ZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEpvbiBTbWlybCA8am9uc21pcmxAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IElCTSBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSAiZHJtX2NvcmUuaCIKKworc3RydWN0IGRybV9zeXNmc19jbGFzcyB7CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgYXR0cjsKKwlzdHJ1Y3QgY2xhc3MgY2xhc3M7Cit9OworI2RlZmluZSB0b19kcm1fc3lzZnNfY2xhc3MoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MsIGNsYXNzKQorCitzdHJ1Y3Qgc2ltcGxlX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWRldl90IGRldjsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlIGNsYXNzX2RldjsKK307CisjZGVmaW5lIHRvX3NpbXBsZV9kZXYoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzaW1wbGVfZGV2LCBjbGFzc19kZXYpCisKK3N0YXRpYyBMSVNUX0hFQUQoc2ltcGxlX2Rldl9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2ltcGxlX2Rldl9saXN0X2xvY2spOworCitzdGF0aWMgdm9pZCByZWxlYXNlX3NpbXBsZV9kZXYoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IHRvX3NpbXBsZV9kZXYoY2xhc3NfZGV2KTsKKwlrZnJlZShzX2Rldik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZGV2KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IHRvX3NpbXBsZV9kZXYoY2xhc3NfZGV2KTsKKwlyZXR1cm4gcHJpbnRfZGV2X3QoYnVmLCBzX2Rldi0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgZHJtX3N5c2ZzX2NsYXNzX3JlbGVhc2Uoc3RydWN0IGNsYXNzICpjbGFzcykKK3sKKwlzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcyA9IHRvX2RybV9zeXNmc19jbGFzcyhjbGFzcyk7CisJa2ZyZWUoY3MpOworfQorCisvKiBEaXNwbGF5IHRoZSB2ZXJzaW9uIG9mIGRybV9jb3JlLiBUaGlzIGRvZXNuJ3Qgd29yayByaWdodCBpbiBjdXJyZW50IGRlc2lnbiAqLworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzcyAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWQuJWQuJWQgJXNcbiIsIENPUkVfTkFNRSwgQ09SRV9NQUpPUiwKKwkJICAgICAgIENPUkVfTUlOT1IsIENPUkVfUEFUQ0hMRVZFTCwgQ09SRV9EQVRFKTsKK30KKworc3RhdGljIENMQVNTX0FUVFIodmVyc2lvbiwgU19JUlVHTywgdmVyc2lvbl9zaG93LCBOVUxMKTsKKworLyoqCisgKiBkcm1fc3lzZnNfY3JlYXRlIC0gY3JlYXRlIGEgc3RydWN0IGRybV9zeXNmc19jbGFzcyBzdHJ1Y3R1cmUKKyAqIEBvd25lcjogcG9pbnRlciB0byB0aGUgbW9kdWxlIHRoYXQgaXMgdG8gIm93biIgdGhpcyBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzCisgKiBAbmFtZTogcG9pbnRlciB0byBhIHN0cmluZyBmb3IgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcy4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0IGRybV9zeXNmc19jbGFzcyBwb2ludGVyIHRoYXQgY2FuIHRoZW4gYmUgdXNlZAorICogaW4gY2FsbHMgdG8gZHJtX3N5c2ZzX2RldmljZV9hZGQoKS4KKyAqCisgKiBOb3RlLCB0aGUgcG9pbnRlciBjcmVhdGVkIGhlcmUgaXMgdG8gYmUgZGVzdHJveWVkIHdoZW4gZmluaXNoZWQgYnkgbWFraW5nIGEKKyAqIGNhbGwgdG8gZHJtX3N5c2ZzX2Rlc3Ryb3koKS4KKyAqLworc3RydWN0IGRybV9zeXNmc19jbGFzcyAqZHJtX3N5c2ZzX2NyZWF0ZShzdHJ1Y3QgbW9kdWxlICpvd25lciwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjczsKKwlpbnQgcmV0dmFsOworCisJY3MgPSBrbWFsbG9jKHNpemVvZigqY3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbXNldChjcywgMHgwMCwgc2l6ZW9mKCpjcykpOworCisJY3MtPmNsYXNzLm5hbWUgPSBuYW1lOworCWNzLT5jbGFzcy5jbGFzc19yZWxlYXNlID0gZHJtX3N5c2ZzX2NsYXNzX3JlbGVhc2U7CisJY3MtPmNsYXNzLnJlbGVhc2UgPSByZWxlYXNlX3NpbXBsZV9kZXY7CisKKwljcy0+YXR0ci5hdHRyLm5hbWUgPSAiZGV2IjsKKwljcy0+YXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWNzLT5hdHRyLmF0dHIub3duZXIgPSBvd25lcjsKKwljcy0+YXR0ci5zaG93ID0gc2hvd19kZXY7CisJY3MtPmF0dHIuc3RvcmUgPSBOVUxMOworCisJcmV0dmFsID0gY2xhc3NfcmVnaXN0ZXIoJmNzLT5jbGFzcyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKwljbGFzc19jcmVhdGVfZmlsZSgmY3MtPmNsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKworCXJldHVybiBjczsKKworICAgICAgZXJyb3I6CisJa2ZyZWUoY3MpOworCXJldHVybiBFUlJfUFRSKHJldHZhbCk7Cit9CisKKy8qKgorICogZHJtX3N5c2ZzX2Rlc3Ryb3kgLSBkZXN0cm95cyBhIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3Mgc3RydWN0dXJlCisgKiBAY3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgdGhhdCBpcyB0byBiZSBkZXN0cm95ZWQKKyAqCisgKiBOb3RlLCB0aGUgcG9pbnRlciB0byBiZSBkZXN0cm95ZWQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgY2FsbCB0bworICogZHJtX3N5c2ZzX2NyZWF0ZSgpLgorICovCit2b2lkIGRybV9zeXNmc19kZXN0cm95KHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgKmNzKQoreworCWlmICgoY3MgPT0gTlVMTCkgfHwgKElTX0VSUihjcykpKQorCQlyZXR1cm47CisKKwljbGFzc191bnJlZ2lzdGVyKCZjcy0+Y2xhc3MpOworfQorCisvKioKKyAqIGRybV9zeXNmc19kZXZpY2VfYWRkIC0gYWRkcyBhIGNsYXNzIGRldmljZSB0byBzeXNmcyBmb3IgYSBjaGFyYWN0ZXIgZHJpdmVyCisgKiBAY3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgdGhhdCB0aGlzIGRldmljZSBzaG91bGQgYmUgcmVnaXN0ZXJlZCB0by4KKyAqIEBkZXY6IHRoZSBkZXZfdCBmb3IgdGhlIGRldmljZSB0byBiZSBhZGRlZC4KKyAqIEBkZXZpY2U6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXZpY2UgdGhhdCBpcyBhc3Npb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgZGV2aWNlLgorICogQGZtdDogc3RyaW5nIGZvciB0aGUgY2xhc3MgZGV2aWNlJ3MgbmFtZQorICoKKyAqIEEgc3RydWN0IGNsYXNzX2RldmljZSB3aWxsIGJlIGNyZWF0ZWQgaW4gc3lzZnMsIHJlZ2lzdGVyZWQgdG8gdGhlIHNwZWNpZmllZAorICogY2xhc3MuICBBICJkZXYiIGZpbGUgd2lsbCBiZSBjcmVhdGVkLCBzaG93aW5nIHRoZSBkZXZfdCBmb3IgdGhlIGRldmljZS4gIFRoZQorICogcG9pbnRlciB0byB0aGUgc3RydWN0IGNsYXNzX2RldmljZSB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGNhbGwuICBBbnkgZnVydGhlcgorICogc3lzZnMgZmlsZXMgdGhhdCBtaWdodCBiZSByZXF1aXJlZCBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIHBvaW50ZXIuCisgKiBOb3RlOiB0aGUgc3RydWN0IGRybV9zeXNmc19jbGFzcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCisgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGRybV9zeXNmc19jcmVhdGUoKS4KKyAqLworc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9zeXNmc19jbGFzcyAqY3MsIGRldl90IGRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IE5VTEw7CisJaW50IHJldHZhbDsKKworCWlmICgoY3MgPT0gTlVMTCkgfHwgKElTX0VSUihjcykpKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc19kZXYgPSBrbWFsbG9jKHNpemVvZigqc19kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNfZGV2KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbXNldChzX2RldiwgMHgwMCwgc2l6ZW9mKCpzX2RldikpOworCisJc19kZXYtPmRldiA9IGRldjsKKwlzX2Rldi0+Y2xhc3NfZGV2LmRldiA9IGRldmljZTsKKwlzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzID0gJmNzLT5jbGFzczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKHNfZGV2LT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlyZXR2YWwgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJnNfZGV2LT5jbGFzc19kZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CisKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJnNfZGV2LT5jbGFzc19kZXYsICZjcy0+YXR0cik7CisKKwlzcGluX2xvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZCgmc19kZXYtPm5vZGUsICZzaW1wbGVfZGV2X2xpc3QpOworCXNwaW5fdW5sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7CisKKwlyZXR1cm4gJnNfZGV2LT5jbGFzc19kZXY7CisKKyAgICAgIGVycm9yOgorCWtmcmVlKHNfZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOworfQorCisvKioKKyAqIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlIC0gcmVtb3ZlcyBhIGNsYXNzIGRldmljZSB0aGF0IHdhcyBjcmVhdGVkIHdpdGggZHJtX3N5c2ZzX2RldmljZV9hZGQoKQorICogQGRldjogdGhlIGRldl90IG9mIHRoZSBkZXZpY2UgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkLgorICoKKyAqIFRoaXMgY2FsbCB1bnJlZ2lzdGVycyBhbmQgY2xlYW5zIHVwIGEgY2xhc3MgZGV2aWNlIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBhCisgKiBjYWxsIHRvIGRybV9zeXNmc19kZXZpY2VfYWRkKCkKKyAqLwordm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShkZXZfdCBkZXYpCit7CisJc3RydWN0IHNpbXBsZV9kZXYgKnNfZGV2ID0gTlVMTDsKKwlpbnQgZm91bmQgPSAwOworCisJc3Bpbl9sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzX2RldiwgJnNpbXBsZV9kZXZfbGlzdCwgbm9kZSkgeworCQlpZiAoc19kZXYtPmRldiA9PSBkZXYpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmb3VuZCkgeworCQlsaXN0X2RlbCgmc19kZXYtPm5vZGUpOworCQlzcGluX3VubG9jaygmc2ltcGxlX2Rldl9saXN0X2xvY2spOworCQljbGFzc19kZXZpY2VfdW5yZWdpc3Rlcigmc19kZXYtPmNsYXNzX2Rldik7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzcyZjMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtMCwwICsxLDY3OCBAQAorLyoqCisgKiBcZmlsZSBkcm1fdm0uaAorICogTWVtb3J5IG1hcHBpbmcgZm9yIERSTQorICogCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMDg6NTg6MzEgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpZiBkZWZpbmVkKF9faWE2NF9fKQorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2VuZGlmCisKKworLyoqCisgKiBcYyBub3BhZ2UgbWV0aG9kIGZvciBBR1AgdmlydHVhbCBtZW1vcnkuCisgKgorICogXHBhcmFtIHZtYSB2aXJ0dWFsIG1lbW9yeSBhcmVhLgorICogXHBhcmFtIGFkZHJlc3MgYWNjZXNzIGFkZHJlc3MuCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHBhZ2Ugc3RydWN0dXJlLgorICogCisgKiBGaW5kIHRoZSByaWdodCBtYXAgYW5kIGlmIGl0J3MgQUdQIG1lbW9yeSBmaW5kIHRoZSByZWFsIHBoeXNpY2FsIHBhZ2UgdG8KKyAqIG1hcCwgZ2V0IHRoZSBwYWdlLCBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudCBhbmQgcmV0dXJuIGl0LgorICovCisjaWYgX19PU19IQVNfQUdQCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiAgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fbWFwX3QgKm1hcCAgICA9IE5VTEw7CisJZHJtX21hcF9saXN0X3QgICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCS8qCisgICAgICAgICAqIEZpbmQgdGhlIHJpZ2h0IG1hcAorICAgICAgICAgKi8KKwlpZiAoIWRybV9jb3JlX2hhc19BR1AoZGV2KSkKKwkJZ290byB2bV9ub3BhZ2VfZXJyb3I7CisKKwlpZighZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5jYW50X3VzZV9hcGVydHVyZSkgZ290byB2bV9ub3BhZ2VfZXJyb3I7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCW1hcCA9IHJfbGlzdC0+bWFwOworCQlpZiAoIW1hcCkgY29udGludWU7CisJCWlmIChtYXAtPm9mZnNldCA9PSBWTV9PRkZTRVQodm1hKSkgYnJlYWs7CisJfQorCisJaWYgKG1hcCAmJiBtYXAtPnR5cGUgPT0gX0RSTV9BR1ApIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKKwkJdW5zaWduZWQgbG9uZyBiYWRkciA9IFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0OworCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmFncG1lbTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKyNpZmRlZiBfX2FscGhhX18KKwkJLyoKKyAgICAgICAgICAgICAgICAgKiBBZGp1c3QgdG8gYSBidXMtcmVsYXRpdmUgYWRkcmVzcworICAgICAgICAgICAgICAgICAqLworCQliYWRkciAtPSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CisjZW5kaWYKKworCQkvKgorICAgICAgICAgICAgICAgICAqIEl0J3MgQUdQIG1lbW9yeSAtIGZpbmQgdGhlIHJlYWwgcGh5c2ljYWwgcGFnZSB0byBtYXAKKyAgICAgICAgICAgICAgICAgKi8KKwkJZm9yKGFncG1lbSA9IGRldi0+YWdwLT5tZW1vcnk7IGFncG1lbTsgYWdwbWVtID0gYWdwbWVtLT5uZXh0KSB7CisJCQlpZiAoYWdwbWVtLT5ib3VuZCA8PSBiYWRkciAmJgorCQkJICAgIGFncG1lbS0+Ym91bmQgKyBhZ3BtZW0tPnBhZ2VzICogUEFHRV9TSVpFID4gYmFkZHIpIAorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFhZ3BtZW0pIGdvdG8gdm1fbm9wYWdlX2Vycm9yOworCisJCS8qCisgICAgICAgICAgICAgICAgICogR2V0IHRoZSBwYWdlLCBpbmMgdGhlIHVzZSBjb3VudCwgYW5kIHJldHVybiBpdAorICAgICAgICAgICAgICAgICAqLworCQlvZmZzZXQgPSAoYmFkZHIgLSBhZ3BtZW0tPmJvdW5kKSA+PiBQQUdFX1NISUZUOworCQlwYWdlID0gdmlydF90b19wYWdlKF9fdmEoYWdwbWVtLT5tZW1vcnktPm1lbW9yeVtvZmZzZXRdKSk7CisJCWdldF9wYWdlKHBhZ2UpOworCisJCURSTV9ERUJVRygiYmFkZHIgPSAweCVseCBwYWdlID0gMHglcCwgb2Zmc2V0ID0gMHglbHgsIGNvdW50PSVkXG4iLAorCQkJICBiYWRkciwgX192YShhZ3BtZW0tPm1lbW9yeS0+bWVtb3J5W29mZnNldF0pLCBvZmZzZXQsCisJCQkgIHBhZ2VfY291bnQocGFnZSkpOworCisJCXJldHVybiBwYWdlOworICAgICAgICB9Cit2bV9ub3BhZ2VfZXJyb3I6CisJcmV0dXJuIE5PUEFHRV9TSUdCVVM7CQkvKiBEaXNhbGxvdyBtcmVtYXAgKi8KK30KKyNlbHNlIC8qIF9fT1NfSEFTX0FHUCAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiBOT1BBR0VfU0lHQlVTOworfQorI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLworCisvKioKKyAqIFxjIG5vcGFnZSBtZXRob2QgZm9yIHNoYXJlZCB2aXJ0dWFsIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiBccGFyYW0gYWRkcmVzcyBhY2Nlc3MgYWRkcmVzcy4KKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgcGFnZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIEdldCB0aGUgdGhlIG1hcHBpbmcsIGZpbmQgdGhlIHJlYWwgcGh5c2ljYWwgcGFnZSB0byBtYXAsIGdldCB0aGUgcGFnZSwgYW5kCisgKiByZXR1cm4gaXQuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fc2htX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCWRybV9tYXBfdAkgKm1hcAkgPSAoZHJtX21hcF90ICopdm1hLT52bV9wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZwkgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJIGk7CisJc3RydWN0IHBhZ2UJICpwYWdlOworCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCWlmICghbWFwKSAgICAJCSAgIHJldHVybiBOT1BBR0VfT09NOyAgLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KKworCW9mZnNldAkgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKKwlpID0gKHVuc2lnbmVkIGxvbmcpbWFwLT5oYW5kbGUgKyBvZmZzZXQ7CisJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWkpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5PUEFHRV9PT007CisJZ2V0X3BhZ2UocGFnZSk7CisKKwlEUk1fREVCVUcoInNobV9ub3BhZ2UgMHglbHhcbiIsIGFkZHJlc3MpOworCXJldHVybiBwYWdlOworfQorCisKKy8qKgorICogXGMgY2xvc2UgbWV0aG9kIGZvciBzaGFyZWQgdmlydHVhbCBtZW1vcnkuCisgKiAKKyAqIFxwYXJhbSB2bWEgdmlydHVhbCBtZW1vcnkgYXJlYS4KKyAqIAorICogRGVsZXRlcyBtYXAgaW5mb3JtYXRpb24gaWYgd2UgYXJlIHRoZSBsYXN0CisgKiBwZXJzb24gdG8gY2xvc2UgYSBtYXBwaW5nIGFuZCBpdCdzIG5vdCBpbiB0aGUgZ2xvYmFsIG1hcGxpc3QuCisgKi8KK3ZvaWQgZHJtX3ZtX3NobV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3ZtYV9lbnRyeV90ICpwdCwgKnByZXYsICpuZXh0OworCWRybV9tYXBfdCAqbWFwOworCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlpbnQgZm91bmRfbWFwcyA9IDA7CisKKwlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKKwkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOworCWF0b21pY19kZWMoJmRldi0+dm1hX2NvdW50KTsKKworCW1hcCA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHB0ID0gbmV4dCkgeworCQluZXh0ID0gcHQtPm5leHQ7CisJCWlmIChwdC0+dm1hLT52bV9wcml2YXRlX2RhdGEgPT0gbWFwKSBmb3VuZF9tYXBzKys7CisJCWlmIChwdC0+dm1hID09IHZtYSkgeworCQkJaWYgKHByZXYpIHsKKwkJCQlwcmV2LT5uZXh0ID0gcHQtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCWRldi0+dm1hbGlzdCA9IHB0LT5uZXh0OworCQkJfQorCQkJZHJtX2ZyZWUocHQsIHNpemVvZigqcHQpLCBEUk1fTUVNX1ZNQVMpOworCQl9IGVsc2UgeworCQkJcHJldiA9IHB0OworCQl9CisJfQorCS8qIFdlIHdlcmUgdGhlIG9ubHkgbWFwIHRoYXQgd2FzIGZvdW5kICovCisJaWYoZm91bmRfbWFwcyA9PSAxICYmCisJICAgbWFwLT5mbGFncyAmIF9EUk1fUkVNT1ZBQkxFKSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1hcGxpc3QsIGlmIHdlIGFyZSBub3QsIHRoZW4KKwkJICogd2UgZGVsZXRlIHRoaXMgbWFwcGluZ3MgaW5mb3JtYXRpb24uCisJCSAqLworCQlmb3VuZF9tYXBzID0gMDsKKwkJbGlzdCA9ICZkZXYtPm1hcGxpc3QtPmhlYWQ7CisJCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCQlpZiAocl9saXN0LT5tYXAgPT0gbWFwKSBmb3VuZF9tYXBzKys7CisJCX0KKworCQlpZighZm91bmRfbWFwcykgeworCQkJc3dpdGNoIChtYXAtPnR5cGUpIHsKKwkJCWNhc2UgX0RSTV9SRUdJU1RFUlM6CisJCQljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgorCQkJCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpICYmIG1hcC0+bXRyciA+PSAwKSB7CisJCQkJCWludCByZXRjb2RlOworCQkJCQlyZXRjb2RlID0gbXRycl9kZWwobWFwLT5tdHJyLAorCQkJCQkJCSAgIG1hcC0+b2Zmc2V0LAorCQkJCQkJCSAgIG1hcC0+c2l6ZSk7CisJCQkJCURSTV9ERUJVRygibXRycl9kZWwgPSAlZFxuIiwgcmV0Y29kZSk7CisJCQkJfQorCQkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBfRFJNX1NITToKKwkJCQl2ZnJlZShtYXAtPmhhbmRsZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIF9EUk1fQUdQOgorCQkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQkJCWJyZWFrOworCQkJfQorCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CisJCX0KKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7Cit9CisKKy8qKgorICogXGMgbm9wYWdlIG1ldGhvZCBmb3IgRE1BIHZpcnR1YWwgbWVtb3J5LgorICoKKyAqIFxwYXJhbSB2bWEgdmlydHVhbCBtZW1vcnkgYXJlYS4KKyAqIFxwYXJhbSBhZGRyZXNzIGFjY2VzcyBhZGRyZXNzLgorICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBwYWdlIHN0cnVjdHVyZS4KKyAqIAorICogRGV0ZXJtaW5lIHRoZSBwYWdlIG51bWJlciBmcm9tIHRoZSBwYWdlIG9mZnNldCBhbmQgZ2V0IGl0IGZyb20gZHJtX2RldmljZV9kbWE6OnBhZ2VsaXN0LgorICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX2RtYV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYQkgPSBkZXYtPmRtYTsKKwl1bnNpZ25lZCBsb25nCSBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZwkgcGFnZV9ucjsKKwlzdHJ1Y3QgcGFnZQkgKnBhZ2U7CisKKwlpZiAoIWRtYSkJCSAgIHJldHVybiBOT1BBR0VfU0lHQlVTOyAvKiBFcnJvciAqLworCWlmIChhZGRyZXNzID4gdm1hLT52bV9lbmQpIHJldHVybiBOT1BBR0VfU0lHQlVTOyAvKiBEaXNhbGxvdyBtcmVtYXAgKi8KKwlpZiAoIWRtYS0+cGFnZWxpc3QpCSAgIHJldHVybiBOT1BBR0VfT09NIDsgLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KKworCW9mZnNldAkgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsgLyogdm1fW3BnXW9mZltzZXRdIHNob3VsZCBiZSAwICovCisJcGFnZV9uciAgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKKwlwYWdlID0gdmlydF90b19wYWdlKChkbWEtPnBhZ2VsaXN0W3BhZ2VfbnJdICsgCisJCQkgICAgIChvZmZzZXQgJiAoflBBR0VfTUFTSykpKSk7CisKKwlnZXRfcGFnZShwYWdlKTsKKworCURSTV9ERUJVRygiZG1hX25vcGFnZSAweCVseCAocGFnZSAlbHUpXG4iLCBhZGRyZXNzLCBwYWdlX25yKTsKKwlyZXR1cm4gcGFnZTsKK30KKworLyoqCisgKiBcYyBub3BhZ2UgbWV0aG9kIGZvciBzY2F0dGVyLWdhdGhlciB2aXJ0dWFsIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiBccGFyYW0gYWRkcmVzcyBhY2Nlc3MgYWRkcmVzcy4KKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgcGFnZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIERldGVybWluZSB0aGUgbWFwIG9mZnNldCBmcm9tIHRoZSBwYWdlIG9mZnNldCBhbmQgZ2V0IGl0IGZyb20gZHJtX3NnX21lbTo6cGFnZWxpc3QuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fc2dfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlkcm1fbWFwX3QgICAgICAgICptYXAgICAgPSAoZHJtX21hcF90ICopdm1hLT52bV9wcml2YXRlX2RhdGE7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbWFwX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCFlbnRyeSkgICAgICAgICAgICAgICAgcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIEVycm9yICovCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCWlmICghZW50cnktPnBhZ2VsaXN0KSAgICAgIHJldHVybiBOT1BBR0VfT09NIDsgIC8qIE5vdGhpbmcgYWxsb2NhdGVkICovCisKKworCW9mZnNldCA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0OworCW1hcF9vZmZzZXQgPSBtYXAtPm9mZnNldCAtIGRldi0+c2ctPmhhbmRsZTsKKwlwYWdlX29mZnNldCA9IChvZmZzZXQgPj4gUEFHRV9TSElGVCkgKyAobWFwX29mZnNldCA+PiBQQUdFX1NISUZUKTsKKwlwYWdlID0gZW50cnktPnBhZ2VsaXN0W3BhZ2Vfb2Zmc2V0XTsKKwlnZXRfcGFnZShwYWdlKTsKKworCXJldHVybiBwYWdlOworfQorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMCkKKworc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICBpbnQgKnR5cGUpIHsKKwlpZiAodHlwZSkgKnR5cGUgPSBWTV9GQVVMVF9NSU5PUjsKKwlyZXR1cm4gZHJtX2RvX3ZtX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zaG1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgIGludCAqdHlwZSkgeworCWlmICh0eXBlKSAqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkcm1fZG9fdm1fc2htX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9kbWFfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgIGludCAqdHlwZSkgeworCWlmICh0eXBlKSAqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkcm1fZG9fdm1fZG1hX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zZ19ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgIGludCAqdHlwZSkgeworCWlmICh0eXBlKSAqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkcm1fZG9fdm1fc2dfbm9wYWdlKHZtYSwgYWRkcmVzcyk7Cit9CisKKyNlbHNlCS8qIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMCkgKi8KKworc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICBpbnQgdW51c2VkKSB7CisJcmV0dXJuIGRybV9kb192bV9ub3BhZ2Uodm1hLCBhZGRyZXNzKTsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fc2htX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgICBpbnQgdW51c2VkKSB7CisJcmV0dXJuIGRybV9kb192bV9zaG1fbm9wYWdlKHZtYSwgYWRkcmVzcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZHJtX3ZtX2RtYV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgICAgaW50IHVudXNlZCkgeworCXJldHVybiBkcm1fZG9fdm1fZG1hX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zZ19ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgIGludCB1bnVzZWQpIHsKKwlyZXR1cm4gZHJtX2RvX3ZtX3NnX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCisjZW5kaWYKKworCisvKiogQUdQIHZpcnR1YWwgbWVtb3J5IG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgICBkcm1fdm1fb3BzID0geworCS5ub3BhZ2UgPSBkcm1fdm1fbm9wYWdlLAorCS5vcGVuCT0gZHJtX3ZtX29wZW4sCisJLmNsb3NlCT0gZHJtX3ZtX2Nsb3NlLAorfTsKKworLyoqIFNoYXJlZCB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICAgZHJtX3ZtX3NobV9vcHMgPSB7CisJLm5vcGFnZSA9IGRybV92bV9zaG1fbm9wYWdlLAorCS5vcGVuCT0gZHJtX3ZtX29wZW4sCisJLmNsb3NlCT0gZHJtX3ZtX3NobV9jbG9zZSwKK307CisKKy8qKiBETUEgdmlydHVhbCBtZW1vcnkgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAgIGRybV92bV9kbWFfb3BzID0geworCS5ub3BhZ2UgPSBkcm1fdm1fZG1hX25vcGFnZSwKKwkub3Blbgk9IGRybV92bV9vcGVuLAorCS5jbG9zZQk9IGRybV92bV9jbG9zZSwKK307CisKKy8qKiBTY2F0dGVyLWdhdGhlciB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICAgZHJtX3ZtX3NnX29wcyA9IHsKKwkubm9wYWdlID0gZHJtX3ZtX3NnX25vcGFnZSwKKwkub3BlbiAgID0gZHJtX3ZtX29wZW4sCisJLmNsb3NlICA9IGRybV92bV9jbG9zZSwKK307CisKKworLyoqCisgKiBcYyBvcGVuIG1ldGhvZCBmb3Igc2hhcmVkIHZpcnR1YWwgbWVtb3J5LgorICogCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiAKKyAqIENyZWF0ZSBhIG5ldyBkcm1fdm1hX2VudHJ5IHN0cnVjdHVyZSBhcyB0aGUgXHAgdm1hIHByaXZhdGUgZGF0YSBlbnRyeSBhbmQKKyAqIGFkZCBpdCB0byBkcm1fZGV2aWNlOjp2bWFsaXN0LgorICovCit2b2lkIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdm1hX2VudHJ5X3QgKnZtYV9lbnRyeTsKKworCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAorCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJYXRvbWljX2luYygmZGV2LT52bWFfY291bnQpOworCisJdm1hX2VudHJ5ID0gZHJtX2FsbG9jKHNpemVvZigqdm1hX2VudHJ5KSwgRFJNX01FTV9WTUFTKTsKKwlpZiAodm1hX2VudHJ5KSB7CisJCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJCXZtYV9lbnRyeS0+dm1hCT0gdm1hOworCQl2bWFfZW50cnktPm5leHQgPSBkZXYtPnZtYWxpc3Q7CisJCXZtYV9lbnRyeS0+cGlkCT0gY3VycmVudC0+cGlkOworCQlkZXYtPnZtYWxpc3QJPSB2bWFfZW50cnk7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCX0KK30KKworLyoqCisgKiBcYyBjbG9zZSBtZXRob2QgZm9yIGFsbCB2aXJ0dWFsIG1lbW9yeSB0eXBlcy4KKyAqIAorICogXHBhcmFtIHZtYSB2aXJ0dWFsIG1lbW9yeSBhcmVhLgorICogCisgKiBTZWFyY2ggdGhlIFxwIHZtYSBwcml2YXRlIGRhdGEgZW50cnkgaW4gZHJtX2RldmljZTo6dm1hbGlzdCwgdW5saW5rIGl0LCBhbmQKKyAqIGZyZWUgaXQuCisgKi8KK3ZvaWQgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdm1hX2VudHJ5X3QgKnB0LCAqcHJldjsKKworCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAorCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJYXRvbWljX2RlYygmZGV2LT52bWFfY291bnQpOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHByZXYgPSBwdCwgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAocHQtPnZtYSA9PSB2bWEpIHsKKwkJCWlmIChwcmV2KSB7CisJCQkJcHJldi0+bmV4dCA9IHB0LT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnZtYWxpc3QgPSBwdC0+bmV4dDsKKwkJCX0KKwkJCWRybV9mcmVlKHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9WTUFTKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworfQorCisvKioKKyAqIG1tYXAgRE1BIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICogCisgKiBTZXRzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIG9wZXJhdGlvbnMgc3RydWN0dXJlIHRvIHZtX2RtYV9vcHMsIHRoZSBmaWxlCisgKiBwb2ludGVyLCBhbmQgY2FsbHMgdm1fb3BlbigpLgorICovCitpbnQgZHJtX21tYXBfZG1hKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAqZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYTsKKwl1bnNpZ25lZCBsb25nCSBsZW5ndGgJID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJbG9ja19rZXJuZWwoKTsKKwlkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRtYQkgPSBkZXYtPmRtYTsKKwlEUk1fREVCVUcoInN0YXJ0ID0gMHglbHgsIGVuZCA9IDB4JWx4LCBvZmZzZXQgPSAweCVseFxuIiwKKwkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgVk1fT0ZGU0VUKHZtYSkpOworCisJCQkJLyogTGVuZ3RoIG11c3QgbWF0Y2ggZXhhY3QgcGFnZSBjb3VudCAqLworCWlmICghZG1hIHx8IChsZW5ndGggPj4gUEFHRV9TSElGVCkgIT0gZG1hLT5wYWdlX2NvdW50KSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKworCXZtYS0+dm1fb3BzICAgPSAmZHJtX3ZtX2RtYV9vcHM7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MGUgLyogS0VSTkVMX1ZFUlNJT04oMiw0LDE0KSAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEIHwgVk1fU0hNOyAvKiBEb24ndCBzd2FwICovCisjZWxzZQorCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7IC8qIERvbid0IHN3YXAgKi8KKyNlbmRpZgorCisJdm1hLT52bV9maWxlICA9CSBmaWxwOwkvKiBOZWVkZWQgZm9yIGRybV92bV9vcGVuKCkgKi8KKwlkcm1fdm1fb3Blbih2bWEpOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKGRybV9tYXBfdCAqbWFwKQoreworCXJldHVybiBtYXAtPm9mZnNldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NvcmVfZ2V0X21hcF9vZnMpOworCit1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9yZWdfb2ZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisjaWZkZWYgX19hbHBoYV9fCisJcmV0dXJuIGRldi0+aG9zZS0+ZGVuc2VfbWVtX2Jhc2UgLSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGRybV9jb3JlX2dldF9yZWdfb2ZzKTsKKworLyoqCisgKiBtbWFwIERNQSBtZW1vcnkuCisgKgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIHZtYSB2aXJ0dWFsIG1lbW9yeSBhcmVhLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqIAorICogSWYgdGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEgaGFzIG5vIG9mZnNldCBhc3NvY2lhdGVkIHdpdGggaXQgdGhlbiBpdCdzIGEgRE1BCisgKiBhcmVhLCBzbyBjYWxscyBtbWFwX2RtYSgpLiBPdGhlcndpc2Ugc2VhcmNoZXMgdGhlIG1hcCBpbiBkcm1fZGV2aWNlOjptYXBsaXN0LAorICogY2hlY2tzIHRoYXQgdGhlIHJlc3RyaWN0ZWQgZmxhZyBpcyBub3Qgc2V0LCBzZXRzIHRoZSB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zCisgKiBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcgdHlwZSBhbmQgcmVtYXBzIHRoZSBwYWdlcy4gRmluYWxseSBzZXRzIHRoZSBmaWxlCisgKiBwb2ludGVyIGFuZCBjYWxscyB2bV9vcGVuKCkuCisgKi8KK2ludCBkcm1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fbWFwX3QJKm1hcAk9IE5VTEw7CisJZHJtX21hcF9saXN0X3QgICpyX2xpc3Q7CisJdW5zaWduZWQgbG9uZyAgIG9mZnNldCAgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlEUk1fREVCVUcoInN0YXJ0ID0gMHglbHgsIGVuZCA9IDB4JWx4LCBvZmZzZXQgPSAweCVseFxuIiwKKwkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgVk1fT0ZGU0VUKHZtYSkpOworCisJaWYgKCAhcHJpdi0+YXV0aGVudGljYXRlZCApIHJldHVybiAtRUFDQ0VTOworCisJLyogV2UgY2hlY2sgZm9yICJkbWEiLiBPbiBBcHBsZSdzIFVuaU5vcnRoLCBpdCdzIHZhbGlkIHRvIGhhdmUKKwkgKiB0aGUgQUdQIG1hcHBlZCBhdCBwaHlzaWNhbCBhZGRyZXNzIDAKKwkgKiAtLUJlbkguCisJICovCisJaWYgKCFWTV9PRkZTRVQodm1hKQorI2lmIF9fT1NfSEFTX0FHUAorCSAgICAmJiAoIWRldi0+YWdwIHx8IGRldi0+YWdwLT5hZ3BfaW5mby5kZXZpY2UtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0FQUExFKQorI2VuZGlmCisJICAgICkKKwkJcmV0dXJuIGRybV9tbWFwX2RtYShmaWxwLCB2bWEpOworCisJCQkJLyogQSBzZXF1ZW50aWFsIHNlYXJjaCBvZiBhIGxpbmtlZCBsaXN0IGlzCisJCQkJICAgZmluZSBoZXJlIGJlY2F1c2U6IDEpIHRoZXJlIHdpbGwgb25seSBiZQorCQkJCSAgIGFib3V0IDUtMTAgZW50cmllcyBpbiB0aGUgbGlzdCBhbmQsIDIpIGEKKwkJCQkgICBEUkkgY2xpZW50IG9ubHkgaGFzIHRvIGRvIHRoaXMgbWFwcGluZworCQkJCSAgIG9uY2UsIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBvcHRpbWl6ZWQKKwkJCQkgICBmb3IgcGVyZm9ybWFuY2UsIGV2ZW4gaWYgdGhlIGxpc3Qgd2FzIGEKKwkJCQkgICBiaXQgbG9uZ2VyLiAqLworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQl1bnNpZ25lZCBsb25nIG9mZjsKKworCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmICghbWFwKSBjb250aW51ZTsKKwkJb2ZmID0gZGV2LT5kcml2ZXItPmdldF9tYXBfb2ZzKG1hcCk7CisJCWlmIChvZmYgPT0gVk1fT0ZGU0VUKHZtYSkpIGJyZWFrOworCX0KKworCWlmICghbWFwIHx8ICgobWFwLT5mbGFncyZfRFJNX1JFU1RSSUNURUQpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCQkJCS8qIENoZWNrIGZvciB2YWxpZCBzaXplLiAqLworCWlmIChtYXAtPnNpemUgIT0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSByZXR1cm4gLUVJTlZBTDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiAobWFwLT5mbGFncyAmIF9EUk1fUkVBRF9PTkxZKSkgeworCQl2bWEtPnZtX2ZsYWdzICY9IH4oVk1fV1JJVEUgfCBWTV9NQVlXUklURSk7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSB+X1BBR0VfUlc7CisjZWxzZQorCQkJCS8qIFllIGdhZHMgdGhpcyBpcyB1Z2x5LiAgV2l0aCBtb3JlIHRob3VnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgY291bGQgbW92ZSB0aGlzIHVwIGhpZ2hlciBhbmQgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBwcm90ZWN0aW9uX21hcCcgaW5zdGVhZC4gICovCisJCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocHRlX3ZhbChwdGVfd3Jwcm90ZWN0KAorCQkJX19wdGUocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpKSkpOworI2VuZGlmCisJfQorCisJc3dpdGNoIChtYXAtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBfRFJNX0FHUDoKKwkgIGlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBPbiBzb21lIHBsYXRmb3JtcyB3ZSBjYW4ndCB0YWxrIHRvIGJ1cyBkbWEgYWRkcmVzcyBmcm9tIHRoZSBDUFUsIHNvIGZvcgorICAgICAgICAgICAgICAgICAqIG1lbW9yeSBvZiB0eXBlIERSTV9BR1AsIHdlJ2xsIGRlYWwgd2l0aCBzb3J0aW5nIG91dCB0aGUgcmVhbCBwaHlzaWNhbAorICAgICAgICAgICAgICAgICAqIHBhZ2VzIGFuZCBtYXBwaW5ncyBpbiBub3BhZ2UoKQorICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PX0NBQ0hFOworI2VuZGlmCisgICAgICAgICAgICAgICAgdm1hLT52bV9vcHMgPSAmZHJtX3ZtX29wczsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gX0RSTV9GUkFNRV9CVUZGRVIuLi4gKi8gICAgICAgIAorCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6CisJY2FzZSBfRFJNX1JFR0lTVEVSUzoKKwkJaWYgKFZNX09GRlNFVCh2bWEpID49IF9fcGEoaGlnaF9tZW1vcnkpKSB7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMyAmJiBtYXAtPnR5cGUgIT0gX0RSTV9BR1ApIHsKKwkJCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7CisJCQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgJj0gfl9QQUdFX1BXVDsKKwkJCX0KKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7CisjZW5kaWYKKwkJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CS8qIG5vdCBpbiBjb3JlIGR1bXAgKi8KKwkJfQorI2lmIGRlZmluZWQoX19pYTY0X18pCisJCWlmIChlZmlfcmFuZ2VfaXNfd2Modm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLQorCQkJCSAgICB2bWEtPnZtX3N0YXJ0KSkKKwkJCXZtYS0+dm1fcGFnZV9wcm90ID0KKwkJCQlwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJZWxzZQorCQkJdm1hLT52bV9wYWdlX3Byb3QgPQorCQkJCXBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworI2VuZGlmCisJCW9mZnNldCA9IGRldi0+ZHJpdmVyLT5nZXRfcmVnX29mcyhkZXYpOworI2lmZGVmIF9fc3BhcmNfXworCQlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKERSTV9SUFJfQVJHKHZtYSkgdm1hLT52bV9zdGFydCwKKwkJCQkJKFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJCXZtYS0+dm1fcGFnZV9wcm90KSkKKyNlbHNlCisJCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgKFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgdm1hLT52bV9wYWdlX3Byb3QpKQorI2VuZGlmCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCURSTV9ERUJVRygiICAgVHlwZSA9ICVkOyBzdGFydCA9IDB4JWx4LCBlbmQgPSAweCVseCwiCisJCQkgICIgb2Zmc2V0ID0gMHglbHhcbiIsCisJCQkgIG1hcC0+dHlwZSwKKwkJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KTsKKwkJdm1hLT52bV9vcHMgPSAmZHJtX3ZtX29wczsKKwkJYnJlYWs7CisJY2FzZSBfRFJNX1NITToKKwkJdm1hLT52bV9vcHMgPSAmZHJtX3ZtX3NobV9vcHM7CisJCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gKHZvaWQgKiltYXA7CisJCQkJLyogRG9uJ3QgbGV0IHRoaXMgYXJlYSBzd2FwLiAgQ2hhbmdlIHdoZW4KKwkJCQkgICBEUk1fS0VSTkVMIGFkdmlzb3J5IGlzIHN1cHBvcnRlZC4gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MGUgLyogS0VSTkVMX1ZFUlNJT04oMiw0LDE0KSAqLworCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0xPQ0tFRDsKKyNlbHNlCisJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQl2bWEtPnZtX29wcyA9ICZkcm1fdm1fc2dfb3BzOworCQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9ICh2b2lkICopbWFwOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwZSAvKiBLRVJORUxfVkVSU0lPTigyLDQsMTQpICovCisJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEOworI2Vsc2UKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwZSAvKiBLRVJORUxfVkVSU0lPTigyLDQsMTQpICovCisJdm1hLT52bV9mbGFncyB8PSBWTV9MT0NLRUQgfCBWTV9TSE07IC8qIERvbid0IHN3YXAgKi8KKyNlbHNlCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsgLyogRG9uJ3Qgc3dhcCAqLworI2VuZGlmCisKKwl2bWEtPnZtX2ZpbGUgID0JIGZpbHA7CS8qIE5lZWRlZCBmb3IgZHJtX3ZtX29wZW4oKSAqLworCWRybV92bV9vcGVuKHZtYSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2NvbnRleHQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZmZiX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTE4MTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfY29udGV4dC5jCkBAIC0wLDAgKzEsNTUxIEBACisvKiAkSWQ6IGZmYl9jb250ZXh0LmMsdiAxLjUgMjAwMS8wOC8wOSAxNzo0Nzo1MSBkYXZlbSBFeHAgJAorICogZmZiX2NvbnRleHQuYzogQ3JlYXRvci9DcmVhdG9yM0QgRFJJL0RSTSBjb250ZXh0IHN3aXRjaGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIEFsbW9zdCBlbnRpcmVseSBzdG9sZW4gZnJvbSB0ZGZ4X2NvbnRleHQuYywgc2VlIHRoZXJlCisgKiBmb3IgYXV0aG9ycy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CisKKyNpbmNsdWRlICJmZmIuaCIKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJmZmJfZHJ2LmgiCisKK3N0YXRpYyBpbnQgRFJNKGFsbG9jX3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGlzXzJkX29ubHkpCit7CisJZmZiX2Rldl9wcml2X3QgKmZwcml2ID0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkZCX01BWF9DVFhTOyBpKyspIHsKKwkJaWYgKGZwcml2LT5od19zdGF0ZVtpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IEZGQl9NQVhfQ1RYUykKKwkJcmV0dXJuIC0xOworCisJZnByaXYtPmh3X3N0YXRlW2ldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZmYl9od19jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZwcml2LT5od19zdGF0ZVtpXSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmcHJpdi0+aHdfc3RhdGVbaV0tPmlzXzJkX29ubHkgPSBpc18yZF9vbmx5OworCisJLyogUGx1cyBvbmUgYmVjYXVzZSAwIGlzIHRoZSBzcGVjaWFsIERSTV9LRVJORUxfQ09OVEVYVC4gKi8KKwlyZXR1cm4gaSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZmYl9zYXZlX2NvbnRleHQoZmZiX2Rldl9wcml2X3QgKmZwcml2LCBpbnQgaWR4KQoreworCWZmYl9mYmNQdHIgZmZiID0gZnByaXYtPnJlZ3M7CisJc3RydWN0IGZmYl9od19jb250ZXh0ICpjdHg7CisJaW50IGk7CisKKwljdHggPSBmcHJpdi0+aHdfc3RhdGVbaWR4IC0gMV07CisJaWYgKGlkeCA9PSAwIHx8IGN0eCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoY3R4LT5pc18yZF9vbmx5KSB7CisJCS8qIDJEIGFwcGxpY2F0aW9ucyBvbmx5IGNhcmUgYWJvdXQgY2VydGFpbiBwaWVjZXMKKwkJICogb2Ygc3RhdGUuCisJCSAqLworCQljdHgtPmRyYXdvcCA9IHVwYV9yZWFkbCgmZmZiLT5kcmF3b3ApOworCQljdHgtPnBwYyA9IHVwYV9yZWFkbCgmZmZiLT5wcGMpOworCQljdHgtPndpZCA9IHVwYV9yZWFkbCgmZmZiLT53aWQpOworCQljdHgtPmZnID0gdXBhX3JlYWRsKCZmZmItPmZnKTsKKwkJY3R4LT5iZyA9IHVwYV9yZWFkbCgmZmZiLT5iZyk7CisJCWN0eC0+eGNsaXAgPSB1cGFfcmVhZGwoJmZmYi0+eGNsaXApOworCQljdHgtPmZiYyA9IHVwYV9yZWFkbCgmZmZiLT5mYmMpOworCQljdHgtPnJvcCA9IHVwYV9yZWFkbCgmZmZiLT5yb3ApOworCQljdHgtPmNtcCA9IHVwYV9yZWFkbCgmZmZiLT5jbXApOworCQljdHgtPm1hdGNoYWIgPSB1cGFfcmVhZGwoJmZmYi0+bWF0Y2hhYik7CisJCWN0eC0+bWFnbmFiID0gdXBhX3JlYWRsKCZmZmItPm1hZ25hYik7CisJCWN0eC0+cG1hc2sgPSB1cGFfcmVhZGwoJmZmYi0+cG1hc2spOworCQljdHgtPnhwbWFzayA9IHVwYV9yZWFkbCgmZmZiLT54cG1hc2spOworCQljdHgtPmxwYXQgPSB1cGFfcmVhZGwoJmZmYi0+bHBhdCk7CisJCWN0eC0+Zm9udHh5ID0gdXBhX3JlYWRsKCZmZmItPmZvbnR4eSk7CisJCWN0eC0+Zm9udHcgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udHcpOworCQljdHgtPmZvbnRpbmMgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udGluYyk7CisKKwkJLyogc3RlbmNpbC9zdGVuY2lsY3RsIG9ubHkgZXhpc3RzIG9uIEZGQjIrIGFuZCBsYXRlcgorCQkgKiBkdWUgdG8gdGhlIGludHJvZHVjdGlvbiBvZiAzRFJBTS1JSUkuCisJCSAqLworCQlpZiAoZnByaXYtPmZmYl90eXBlID09IGZmYjJfdmVydGljYWxfcGx1cyB8fAorCQkgICAgZnByaXYtPmZmYl90eXBlID09IGZmYjJfaG9yaXpvbnRhbF9wbHVzKSB7CisJCQljdHgtPnN0ZW5jaWwgPSB1cGFfcmVhZGwoJmZmYi0+c3RlbmNpbCk7CisJCQljdHgtPnN0ZW5jaWxjdGwgPSB1cGFfcmVhZGwoJmZmYi0+c3RlbmNpbGN0bCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCWN0eC0+YXJlYV9wYXR0ZXJuW2ldID0gdXBhX3JlYWRsKCZmZmItPnBhdHRlcm5baV0pOworCQljdHgtPnVjc3IgPSB1cGFfcmVhZGwoJmZmYi0+dWNzcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBGZXRjaCBkcmF3b3AuICovCisJY3R4LT5kcmF3b3AgPSB1cGFfcmVhZGwoJmZmYi0+ZHJhd29wKTsKKworCS8qIElmIHdlIHdlcmUgc2F2aW5nIHRoZSB2ZXJ0ZXggcmVnaXN0ZXJzLCB0aGlzIGlzIHdoZXJlCisJICogd2Ugd291bGQgZG8gaXQuICBXZSB3b3VsZCBzYXZlIDMyIDMyLWJpdCB3b3JkcyBzdGFydGluZworCSAqIGF0IGZmYi0+c3V2dHguCisJICovCisKKwkvKiBDYXB0dXJlIHJlbmRlcmluZyBhdHRyaWJ1dGVzLiAqLworCisJY3R4LT5wcGMgPSB1cGFfcmVhZGwoJmZmYi0+cHBjKTsJCS8qIFBpeGVsIFByb2Nlc3NvciBDb250cm9sICovCisJY3R4LT53aWQgPSB1cGFfcmVhZGwoJmZmYi0+d2lkKTsJCS8qIEN1cnJlbnQgV0lEICovCisJY3R4LT5mZyA9IHVwYV9yZWFkbCgmZmZiLT5mZyk7CQkJLyogQ29uc3RhbnQgRkcgY29sb3IgKi8KKwljdHgtPmJnID0gdXBhX3JlYWRsKCZmZmItPmJnKTsJCQkvKiBDb25zdGFudCBCRyBjb2xvciAqLworCWN0eC0+Y29uc3R5ID0gdXBhX3JlYWRsKCZmZmItPmNvbnN0eSk7CQkvKiBDb25zdGFudCBZICovCisJY3R4LT5jb25zdHogPSB1cGFfcmVhZGwoJmZmYi0+Y29uc3R6KTsJCS8qIENvbnN0YW50IFogKi8KKwljdHgtPnhjbGlwID0gdXBhX3JlYWRsKCZmZmItPnhjbGlwKTsJCS8qIFggcGxhbmUgY2xpcCAqLworCWN0eC0+ZGNzcyA9IHVwYV9yZWFkbCgmZmZiLT5kY3NzKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAqLworCWN0eC0+dmNsaXBtaW4gPSB1cGFfcmVhZGwoJmZmYi0+dmNsaXBtaW4pOwkvKiBQcmltYXJ5IFhZIGNsaXAsIG1pbmltdW0gKi8KKwljdHgtPnZjbGlwbWF4ID0gdXBhX3JlYWRsKCZmZmItPnZjbGlwbWF4KTsJLyogUHJpbWFyeSBYWSBjbGlwLCBtYXhpbXVtICovCisJY3R4LT52Y2xpcHptaW4gPSB1cGFfcmVhZGwoJmZmYi0+dmNsaXB6bWluKTsJLyogUHJpbWFyeSBaIGNsaXAsIG1pbmltdW0gKi8KKwljdHgtPnZjbGlwem1heCA9IHVwYV9yZWFkbCgmZmZiLT52Y2xpcHptYXgpOwkvKiBQcmltYXJ5IFogY2xpcCwgbWF4aW11bSAqLworCWN0eC0+ZGNzZiA9IHVwYV9yZWFkbCgmZmZiLT5kY3NmKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBGcm9udCBCb3VuZCAqLworCWN0eC0+ZGNzYiA9IHVwYV9yZWFkbCgmZmZiLT5kY3NiKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBCYWNrIEJvdW5kICovCisJY3R4LT5kY3pmID0gdXBhX3JlYWRsKCZmZmItPmRjemYpOwkJLyogRGVwdGggQ3VlIFNjYWxlIFogRnJvbnQgKi8KKwljdHgtPmRjemIgPSB1cGFfcmVhZGwoJmZmYi0+ZGN6Yik7CQkvKiBEZXB0aCBDdWUgU2NhbGUgWiBCYWNrICovCisJY3R4LT5ibGVuZGMgPSB1cGFfcmVhZGwoJmZmYi0+YmxlbmRjKTsJCS8qIEFscGhhIEJsZW5kIENvbnRyb2wgKi8KKwljdHgtPmJsZW5kYzEgPSB1cGFfcmVhZGwoJmZmYi0+YmxlbmRjMSk7CS8qIEFscGhhIEJsZW5kIENvbG9yIDEgKi8KKwljdHgtPmJsZW5kYzIgPSB1cGFfcmVhZGwoJmZmYi0+YmxlbmRjMik7CS8qIEFscGhhIEJsZW5kIENvbG9yIDIgKi8KKwljdHgtPmZiYyA9IHVwYV9yZWFkbCgmZmZiLT5mYmMpOwkJLyogRnJhbWUgQnVmZmVyIENvbnRyb2wgKi8KKwljdHgtPnJvcCA9IHVwYV9yZWFkbCgmZmZiLT5yb3ApOwkJLyogUmFzdGVyIE9wZXJhdGlvbiAqLworCWN0eC0+Y21wID0gdXBhX3JlYWRsKCZmZmItPmNtcCk7CQkvKiBDb21wYXJlIENvbnRyb2xzICovCisJY3R4LT5tYXRjaGFiID0gdXBhX3JlYWRsKCZmZmItPm1hdGNoYWIpOwkvKiBCdWZmZXIgQS9CIE1hdGNoIE9wcyAqLworCWN0eC0+bWF0Y2hjID0gdXBhX3JlYWRsKCZmZmItPm1hdGNoYyk7CQkvKiBCdWZmZXIgQyBNYXRjaCBPcHMgKi8KKwljdHgtPm1hZ25hYiA9IHVwYV9yZWFkbCgmZmZiLT5tYWduYWIpOwkJLyogQnVmZmVyIEEvQiBNYWduaXR1ZGUgT3BzICovCisJY3R4LT5tYWduYyA9IHVwYV9yZWFkbCgmZmZiLT5tYWduYyk7CQkvKiBCdWZmZXIgQyBNYWduaXR1ZGUgT3BzICovCisJY3R4LT5wbWFzayA9IHVwYV9yZWFkbCgmZmZiLT5wbWFzayk7CQkvKiBSR0IgUGxhbmUgTWFzayAqLworCWN0eC0+eHBtYXNrID0gdXBhX3JlYWRsKCZmZmItPnhwbWFzayk7CQkvKiBYIFBsYW5lIE1hc2sgKi8KKwljdHgtPnlwbWFzayA9IHVwYV9yZWFkbCgmZmZiLT55cG1hc2spOwkJLyogWSBQbGFuZSBNYXNrICovCisJY3R4LT56cG1hc2sgPSB1cGFfcmVhZGwoJmZmYi0+enBtYXNrKTsJCS8qIFogUGxhbmUgTWFzayAqLworCisJLyogQXV4aWxpYXJ5IENsaXBzLiAqLworCWN0eC0+YXV4Y2xpcDBtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFswXS5taW4pOworCWN0eC0+YXV4Y2xpcDBtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFswXS5tYXgpOworCWN0eC0+YXV4Y2xpcDFtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsxXS5taW4pOworCWN0eC0+YXV4Y2xpcDFtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsxXS5tYXgpOworCWN0eC0+YXV4Y2xpcDJtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsyXS5taW4pOworCWN0eC0+YXV4Y2xpcDJtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsyXS5tYXgpOworCWN0eC0+YXV4Y2xpcDNtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFszXS5taW4pOworCWN0eC0+YXV4Y2xpcDNtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFszXS5tYXgpOworCisJY3R4LT5scGF0ID0gdXBhX3JlYWRsKCZmZmItPmxwYXQpOwkJLyogTGluZSBQYXR0ZXJuICovCisJY3R4LT5mb250eHkgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udHh5KTsJCS8qIFhZIEZvbnQgQ29vcmRpbmF0ZSAqLworCWN0eC0+Zm9udHcgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udHcpOwkJLyogRm9udCBXaWR0aCAqLworCWN0eC0+Zm9udGluYyA9IHVwYV9yZWFkbCgmZmZiLT5mb250aW5jKTsJLyogRm9udCBYL1kgSW5jcmVtZW50ICovCisKKwkvKiBUaGVzZSByZWdpc3RlcnMvZmVhdHVyZXMgb25seSBleGlzdCBvbiBGRkIyIGFuZCBsYXRlciBjaGlwcy4gKi8KKwlpZiAoZnByaXYtPmZmYl90eXBlID49IGZmYjJfcHJvdG90eXBlKSB7CisJCWN0eC0+ZGNzczEgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzczEpOwkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMSAqLworCQljdHgtPmRjc3MyID0gdXBhX3JlYWRsKCZmZmItPmRjc3MyKTsJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDIgKi8KKwkJY3R4LT5kY3NzMiA9IHVwYV9yZWFkbCgmZmZiLT5kY3NzMyk7CS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAzICovCisJCWN0eC0+ZGNzMiAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzMik7CS8qIERlcHRoIEN1ZSBTY2FsZSAyICovCisJCWN0eC0+ZGNzMyAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzMyk7CS8qIERlcHRoIEN1ZSBTY2FsZSAzICovCisJCWN0eC0+ZGNzNCAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzNCk7CS8qIERlcHRoIEN1ZSBTY2FsZSA0ICovCisJCWN0eC0+ZGNkMiAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNkMik7CS8qIERlcHRoIEN1ZSBEZXB0aCAyICovCisJCWN0eC0+ZGNkMyAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNkMyk7CS8qIERlcHRoIEN1ZSBEZXB0aCAzICovCisJCWN0eC0+ZGNkNCAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNkNCk7CS8qIERlcHRoIEN1ZSBEZXB0aCA0ICovCisKKwkJLyogQW5kIHN0ZW5jaWwvc3RlbmNpbGN0bCBvbmx5IGV4aXN0cyBvbiBGRkIyKyBhbmQgbGF0ZXIKKwkJICogZHVlIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2YgM0RSQU0tSUlJLgorCQkgKi8KKwkJaWYgKGZwcml2LT5mZmJfdHlwZSA9PSBmZmIyX3ZlcnRpY2FsX3BsdXMgfHwKKwkJICAgIGZwcml2LT5mZmJfdHlwZSA9PSBmZmIyX2hvcml6b250YWxfcGx1cykgeworCQkJY3R4LT5zdGVuY2lsID0gdXBhX3JlYWRsKCZmZmItPnN0ZW5jaWwpOworCQkJY3R4LT5zdGVuY2lsY3RsID0gdXBhX3JlYWRsKCZmZmItPnN0ZW5jaWxjdGwpOworCQl9CisJfQorCisJLyogU2F2ZSB0aGUgMzJ4MzIgYXJlYSBwYXR0ZXJuLiAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQljdHgtPmFyZWFfcGF0dGVybltpXSA9IHVwYV9yZWFkbCgmZmZiLT5wYXR0ZXJuW2ldKTsKKworCS8qIEZpbmFsbHksIHN0YXNoIGF3YXkgdGhlIFVzZXIgQ29uc3RvbC9TdGF0dXMgUmVnaXN0ZXIuICovCisJY3R4LT51Y3NyID0gdXBhX3JlYWRsKCZmZmItPnVjc3IpOworfQorCitzdGF0aWMgdm9pZCBmZmJfcmVzdG9yZV9jb250ZXh0KGZmYl9kZXZfcHJpdl90ICpmcHJpdiwgaW50IG9sZCwgaW50IGlkeCkKK3sKKwlmZmJfZmJjUHRyIGZmYiA9IGZwcml2LT5yZWdzOworCXN0cnVjdCBmZmJfaHdfY29udGV4dCAqY3R4OworCWludCBpOworCisJY3R4ID0gZnByaXYtPmh3X3N0YXRlW2lkeCAtIDFdOworCWlmIChpZHggPT0gMCB8fCBjdHggPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGN0eC0+aXNfMmRfb25seSkgeworCQkvKiAyRCBhcHBsaWNhdGlvbnMgb25seSBjYXJlIGFib3V0IGNlcnRhaW4gcGllY2VzCisJCSAqIG9mIHN0YXRlLgorCQkgKi8KKwkJdXBhX3dyaXRlbChjdHgtPmRyYXdvcCwgJmZmYi0+ZHJhd29wKTsKKworCQkvKiBJZiB3ZSB3ZXJlIHJlc3RvcmluZyB0aGUgdmVydGV4IHJlZ2lzdGVycywgdGhpcyBpcyB3aGVyZQorCQkgKiB3ZSB3b3VsZCBkbyBpdC4gIFdlIHdvdWxkIHJlc3RvcmUgMzIgMzItYml0IHdvcmRzIHN0YXJ0aW5nCisJCSAqIGF0IGZmYi0+c3V2dHguCisJCSAqLworCisJCXVwYV93cml0ZWwoY3R4LT5wcGMsICZmZmItPnBwYyk7CisJCXVwYV93cml0ZWwoY3R4LT53aWQsICZmZmItPndpZCk7CisJCXVwYV93cml0ZWwoY3R4LT5mZywgICZmZmItPmZnKTsKKwkJdXBhX3dyaXRlbChjdHgtPmJnLCAmZmZiLT5iZyk7CisJCXVwYV93cml0ZWwoY3R4LT54Y2xpcCwgJmZmYi0+eGNsaXApOworCQl1cGFfd3JpdGVsKGN0eC0+ZmJjLCAmZmZiLT5mYmMpOworCQl1cGFfd3JpdGVsKGN0eC0+cm9wLCAmZmZiLT5yb3ApOworCQl1cGFfd3JpdGVsKGN0eC0+Y21wLCAmZmZiLT5jbXApOworCQl1cGFfd3JpdGVsKGN0eC0+bWF0Y2hhYiwgJmZmYi0+bWF0Y2hhYik7CisJCXVwYV93cml0ZWwoY3R4LT5tYWduYWIsICZmZmItPm1hZ25hYik7CisJCXVwYV93cml0ZWwoY3R4LT5wbWFzaywgJmZmYi0+cG1hc2spOworCQl1cGFfd3JpdGVsKGN0eC0+eHBtYXNrLCAmZmZiLT54cG1hc2spOworCQl1cGFfd3JpdGVsKGN0eC0+bHBhdCwgJmZmYi0+bHBhdCk7CisJCXVwYV93cml0ZWwoY3R4LT5mb250eHksICZmZmItPmZvbnR4eSk7CisJCXVwYV93cml0ZWwoY3R4LT5mb250dywgJmZmYi0+Zm9udHcpOworCQl1cGFfd3JpdGVsKGN0eC0+Zm9udGluYywgJmZmYi0+Zm9udGluYyk7CisKKwkJLyogc3RlbmNpbC9zdGVuY2lsY3RsIG9ubHkgZXhpc3RzIG9uIEZGQjIrIGFuZCBsYXRlcgorCQkgKiBkdWUgdG8gdGhlIGludHJvZHVjdGlvbiBvZiAzRFJBTS1JSUkuCisJCSAqLworCQlpZiAoZnByaXYtPmZmYl90eXBlID09IGZmYjJfdmVydGljYWxfcGx1cyB8fAorCQkgICAgZnByaXYtPmZmYl90eXBlID09IGZmYjJfaG9yaXpvbnRhbF9wbHVzKSB7CisJCQl1cGFfd3JpdGVsKGN0eC0+c3RlbmNpbCwgJmZmYi0+c3RlbmNpbCk7CisJCQl1cGFfd3JpdGVsKGN0eC0+c3RlbmNpbGN0bCwgJmZmYi0+c3RlbmNpbGN0bCk7CisJCQl1cGFfd3JpdGVsKDB4ODAwMDAwMDAsICZmZmItPmZiYyk7CisJCQl1cGFfd3JpdGVsKChjdHgtPnN0ZW5jaWxjdGwgfCAweDgwMDAwKSwKKwkJCQkgICAmZmZiLT5yYXdzdGVuY2lsY3RsKTsKKwkJCXVwYV93cml0ZWwoY3R4LT5mYmMsICZmZmItPmZiYyk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCXVwYV93cml0ZWwoY3R4LT5hcmVhX3BhdHRlcm5baV0sICZmZmItPnBhdHRlcm5baV0pOworCQl1cGFfd3JpdGVsKChjdHgtPnVjc3IgJiAweGYwMDAwKSwgJmZmYi0+dWNzcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXN0b3JlIGRyYXdvcC4gKi8KKwl1cGFfd3JpdGVsKGN0eC0+ZHJhd29wLCAmZmZiLT5kcmF3b3ApOworCisJLyogSWYgd2Ugd2VyZSByZXN0b3JpbmcgdGhlIHZlcnRleCByZWdpc3RlcnMsIHRoaXMgaXMgd2hlcmUKKwkgKiB3ZSB3b3VsZCBkbyBpdC4gIFdlIHdvdWxkIHJlc3RvcmUgMzIgMzItYml0IHdvcmRzIHN0YXJ0aW5nCisJICogYXQgZmZiLT5zdXZ0eC4KKwkgKi8KKworCS8qIFJlc3RvcmUgcmVuZGVyaW5nIGF0dHJpYnV0ZXMuICovCisKKwl1cGFfd3JpdGVsKGN0eC0+cHBjLCAmZmZiLT5wcGMpOwkJLyogUGl4ZWwgUHJvY2Vzc29yIENvbnRyb2wgKi8KKwl1cGFfd3JpdGVsKGN0eC0+d2lkLCAmZmZiLT53aWQpOwkJLyogQ3VycmVudCBXSUQgKi8KKwl1cGFfd3JpdGVsKGN0eC0+ZmcsICZmZmItPmZnKTsJCQkvKiBDb25zdGFudCBGRyBjb2xvciAqLworCXVwYV93cml0ZWwoY3R4LT5iZywgJmZmYi0+YmcpOwkJCS8qIENvbnN0YW50IEJHIGNvbG9yICovCisJdXBhX3dyaXRlbChjdHgtPmNvbnN0eSwgJmZmYi0+Y29uc3R5KTsJCS8qIENvbnN0YW50IFkgKi8KKwl1cGFfd3JpdGVsKGN0eC0+Y29uc3R6LCAmZmZiLT5jb25zdHopOwkJLyogQ29uc3RhbnQgWiAqLworCXVwYV93cml0ZWwoY3R4LT54Y2xpcCwgJmZmYi0+eGNsaXApOwkJLyogWCBwbGFuZSBjbGlwICovCisJdXBhX3dyaXRlbChjdHgtPmRjc3MsICZmZmItPmRjc3MpOwkJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlICovCisJdXBhX3dyaXRlbChjdHgtPnZjbGlwbWluLCAmZmZiLT52Y2xpcG1pbik7CS8qIFByaW1hcnkgWFkgY2xpcCwgbWluaW11bSAqLworCXVwYV93cml0ZWwoY3R4LT52Y2xpcG1heCwgJmZmYi0+dmNsaXBtYXgpOwkvKiBQcmltYXJ5IFhZIGNsaXAsIG1heGltdW0gKi8KKwl1cGFfd3JpdGVsKGN0eC0+dmNsaXB6bWluLCAmZmZiLT52Y2xpcHptaW4pOwkvKiBQcmltYXJ5IFogY2xpcCwgbWluaW11bSAqLworCXVwYV93cml0ZWwoY3R4LT52Y2xpcHptYXgsICZmZmItPnZjbGlwem1heCk7CS8qIFByaW1hcnkgWiBjbGlwLCBtYXhpbXVtICovCisJdXBhX3dyaXRlbChjdHgtPmRjc2YsICZmZmItPmRjc2YpOwkJLyogRGVwdGggQ3VlIFNjYWxlIEZyb250IEJvdW5kICovCisJdXBhX3dyaXRlbChjdHgtPmRjc2IsICZmZmItPmRjc2IpOwkJLyogRGVwdGggQ3VlIFNjYWxlIEJhY2sgQm91bmQgKi8KKwl1cGFfd3JpdGVsKGN0eC0+ZGN6ZiwgJmZmYi0+ZGN6Zik7CQkvKiBEZXB0aCBDdWUgU2NhbGUgWiBGcm9udCAqLworCXVwYV93cml0ZWwoY3R4LT5kY3piLCAmZmZiLT5kY3piKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBaIEJhY2sgKi8KKwl1cGFfd3JpdGVsKGN0eC0+YmxlbmRjLCAmZmZiLT5ibGVuZGMpOwkJLyogQWxwaGEgQmxlbmQgQ29udHJvbCAqLworCXVwYV93cml0ZWwoY3R4LT5ibGVuZGMxLCAmZmZiLT5ibGVuZGMxKTsJLyogQWxwaGEgQmxlbmQgQ29sb3IgMSAqLworCXVwYV93cml0ZWwoY3R4LT5ibGVuZGMyLCAmZmZiLT5ibGVuZGMyKTsJLyogQWxwaGEgQmxlbmQgQ29sb3IgMiAqLworCXVwYV93cml0ZWwoY3R4LT5mYmMsICZmZmItPmZiYyk7CQkvKiBGcmFtZSBCdWZmZXIgQ29udHJvbCAqLworCXVwYV93cml0ZWwoY3R4LT5yb3AsICZmZmItPnJvcCk7CQkvKiBSYXN0ZXIgT3BlcmF0aW9uICovCisJdXBhX3dyaXRlbChjdHgtPmNtcCwgJmZmYi0+Y21wKTsJCS8qIENvbXBhcmUgQ29udHJvbHMgKi8KKwl1cGFfd3JpdGVsKGN0eC0+bWF0Y2hhYiwgJmZmYi0+bWF0Y2hhYik7CS8qIEJ1ZmZlciBBL0IgTWF0Y2ggT3BzICovCisJdXBhX3dyaXRlbChjdHgtPm1hdGNoYywgJmZmYi0+bWF0Y2hjKTsJCS8qIEJ1ZmZlciBDIE1hdGNoIE9wcyAqLworCXVwYV93cml0ZWwoY3R4LT5tYWduYWIsICZmZmItPm1hZ25hYik7CQkvKiBCdWZmZXIgQS9CIE1hZ25pdHVkZSBPcHMgKi8KKwl1cGFfd3JpdGVsKGN0eC0+bWFnbmMsICZmZmItPm1hZ25jKTsJCS8qIEJ1ZmZlciBDIE1hZ25pdHVkZSBPcHMgKi8KKwl1cGFfd3JpdGVsKGN0eC0+cG1hc2ssICZmZmItPnBtYXNrKTsJCS8qIFJHQiBQbGFuZSBNYXNrICovCisJdXBhX3dyaXRlbChjdHgtPnhwbWFzaywgJmZmYi0+eHBtYXNrKTsJCS8qIFggUGxhbmUgTWFzayAqLworCXVwYV93cml0ZWwoY3R4LT55cG1hc2ssICZmZmItPnlwbWFzayk7CQkvKiBZIFBsYW5lIE1hc2sgKi8KKwl1cGFfd3JpdGVsKGN0eC0+enBtYXNrLCAmZmZiLT56cG1hc2spOwkJLyogWiBQbGFuZSBNYXNrICovCisKKwkvKiBBdXhpbGlhcnkgQ2xpcHMuICovCisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAwbWluLCAmZmZiLT5hdXhjbGlwWzBdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAwbWF4LCAmZmZiLT5hdXhjbGlwWzBdLm1heCk7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAxbWluLCAmZmZiLT5hdXhjbGlwWzFdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAxbWF4LCAmZmZiLT5hdXhjbGlwWzFdLm1heCk7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAybWluLCAmZmZiLT5hdXhjbGlwWzJdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAybWF4LCAmZmZiLT5hdXhjbGlwWzJdLm1heCk7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAzbWluLCAmZmZiLT5hdXhjbGlwWzNdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAzbWF4LCAmZmZiLT5hdXhjbGlwWzNdLm1heCk7CisKKwl1cGFfd3JpdGVsKGN0eC0+bHBhdCwgJmZmYi0+bHBhdCk7CQkvKiBMaW5lIFBhdHRlcm4gKi8KKwl1cGFfd3JpdGVsKGN0eC0+Zm9udHh5LCAmZmZiLT5mb250eHkpOwkJLyogWFkgRm9udCBDb29yZGluYXRlICovCisJdXBhX3dyaXRlbChjdHgtPmZvbnR3LCAmZmZiLT5mb250dyk7CQkvKiBGb250IFdpZHRoICovCisJdXBhX3dyaXRlbChjdHgtPmZvbnRpbmMsICZmZmItPmZvbnRpbmMpOwkvKiBGb250IFgvWSBJbmNyZW1lbnQgKi8KKworCS8qIFRoZXNlIHJlZ2lzdGVycy9mZWF0dXJlcyBvbmx5IGV4aXN0IG9uIEZGQjIgYW5kIGxhdGVyIGNoaXBzLiAqLworCWlmIChmcHJpdi0+ZmZiX3R5cGUgPj0gZmZiMl9wcm90b3R5cGUpIHsKKwkJdXBhX3dyaXRlbChjdHgtPmRjc3MxLCAmZmZiLT5kY3NzMSk7CS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAxICovCisJCXVwYV93cml0ZWwoY3R4LT5kY3NzMiwgJmZmYi0+ZGNzczIpOwkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMiAqLworCQl1cGFfd3JpdGVsKGN0eC0+ZGNzczMsICZmZmItPmRjc3MyKTsJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDMgKi8KKwkJdXBhX3dyaXRlbChjdHgtPmRjczIsICZmZmItPmRjczIpOwkvKiBEZXB0aCBDdWUgU2NhbGUgMiAqLworCQl1cGFfd3JpdGVsKGN0eC0+ZGNzMywgJmZmYi0+ZGNzMyk7CS8qIERlcHRoIEN1ZSBTY2FsZSAzICovCisJCXVwYV93cml0ZWwoY3R4LT5kY3M0LCAmZmZiLT5kY3M0KTsJLyogRGVwdGggQ3VlIFNjYWxlIDQgKi8KKwkJdXBhX3dyaXRlbChjdHgtPmRjZDIsICZmZmItPmRjZDIpOwkvKiBEZXB0aCBDdWUgRGVwdGggMiAqLworCQl1cGFfd3JpdGVsKGN0eC0+ZGNkMywgJmZmYi0+ZGNkMyk7CS8qIERlcHRoIEN1ZSBEZXB0aCAzICovCisJCXVwYV93cml0ZWwoY3R4LT5kY2Q0LCAmZmZiLT5kY2Q0KTsJLyogRGVwdGggQ3VlIERlcHRoIDQgKi8KKworCQkvKiBBbmQgc3RlbmNpbC9zdGVuY2lsY3RsIG9ubHkgZXhpc3RzIG9uIEZGQjIrIGFuZCBsYXRlcgorCQkgKiBkdWUgdG8gdGhlIGludHJvZHVjdGlvbiBvZiAzRFJBTS1JSUkuCisJCSAqLworCQlpZiAoZnByaXYtPmZmYl90eXBlID09IGZmYjJfdmVydGljYWxfcGx1cyB8fAorCQkgICAgZnByaXYtPmZmYl90eXBlID09IGZmYjJfaG9yaXpvbnRhbF9wbHVzKSB7CisJCQkvKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBhIGhhcmR3YXJlIGJ1ZyBvbgorCQkJICogdGhlIEZGQjIrIGNoaXBzIHdoaWNoIHByZXZlbnRzIGEgbm9ybWFsIHdyaXRlCisJCQkgKiB0byB0aGUgc3RlbmNpbCBjb250cm9sIHJlZ2lzdGVyIGZyb20gd29ya2luZworCQkJICogYXMgaXQgc2hvdWxkLgorCQkJICoKKwkJCSAqIFRoZSBzdGF0ZSBjb250cm9sbGVkIGJ5IHRoZSBGRkIgc3RlbmNpbGN0bCByZWdpc3RlcgorCQkJICogcmVhbGx5IGdldHMgdHJhbnNmZXJyZWQgdG8gdGhlIHBlci1idWZmZXIgaW5zdGFuY2VzCisJCQkgKiBvZiB0aGUgc3RlbmNpbGN0bCByZWdpc3RlciBpbiB0aGUgM0RSQU0gY2hpcHMuCisJCQkgKgorCQkJICogVGhlIGJ1ZyBpcyB0aGF0IEZGQiBkb2VzIG5vdCB1cGRhdGUgYnVmZmVyIEMgY29ycmVjdGx5LAorCQkJICogc28gd2UgaGF2ZSB0byBkbyBpdCBieSBoYW5kIGZvciB0aGVtLgorCQkJICovCisKKwkJCS8qIFRoaXMgd2lsbCB1cGRhdGUgYnVmZmVycyBBIGFuZCBCLiAqLworCQkJdXBhX3dyaXRlbChjdHgtPnN0ZW5jaWwsICZmZmItPnN0ZW5jaWwpOworCQkJdXBhX3dyaXRlbChjdHgtPnN0ZW5jaWxjdGwsICZmZmItPnN0ZW5jaWxjdGwpOworCisJCQkvKiBGb3JjZSBGRkIgdG8gdXNlIGJ1ZmZlciBDIDNkcmFtIHJlZ3MuICovCisJCQl1cGFfd3JpdGVsKDB4ODAwMDAwMDAsICZmZmItPmZiYyk7CisJCQl1cGFfd3JpdGVsKChjdHgtPnN0ZW5jaWxjdGwgfCAweDgwMDAwKSwKKwkJCQkgICAmZmZiLT5yYXdzdGVuY2lsY3RsKTsKKworCQkJLyogTm93IHJlc3RvcmUgdGhlIGNvcnJlY3QgRkJDIGNvbnRyb2xzLiAqLworCQkJdXBhX3dyaXRlbChjdHgtPmZiYywgJmZmYi0+ZmJjKTsKKwkJfQorCX0KKworCS8qIFJlc3RvcmUgdGhlIDMyeDMyIGFyZWEgcGF0dGVybi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJdXBhX3dyaXRlbChjdHgtPmFyZWFfcGF0dGVybltpXSwgJmZmYi0+cGF0dGVybltpXSk7CisKKwkvKiBGaW5hbGx5LCBzdGFzaCBhd2F5IHRoZSBVc2VyIENvbnN0b2wvU3RhdHVzIFJlZ2lzdGVyLgorCSAqIFRoZSBvbmx5IHN0YXRlIHdlIHJlYWxseSBwcmVzZXJ2ZSBoZXJlIGlzIHRoZSBwaWNraW5nCisJICogY29udHJvbC4KKwkgKi8KKwl1cGFfd3JpdGVsKChjdHgtPnVjc3IgJiAweGYwMDAwKSwgJmZmYi0+dWNzcik7Cit9CisKKyNkZWZpbmUgRkZCX1VDU1JfRkJfQlVTWSAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEZGQl9VQ1NSX1JQX0JVU1kgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBGRkJfVUNTUl9BTExfQlVTWSAgICAgIChGRkJfVUNTUl9SUF9CVVNZfEZGQl9VQ1NSX0ZCX0JVU1kpCisKK3N0YXRpYyB2b2lkIEZGQldhaXQoZmZiX2ZiY1B0ciBmZmIpCit7CisJaW50IGxpbWl0ID0gMTAwMDAwOworCisJZG8geworCQl1MzIgcmVndmFsID0gdXBhX3JlYWRsKCZmZmItPnVjc3IpOworCisJCWlmICgocmVndmFsICYgRkZCX1VDU1JfQUxMX0JVU1kpID09IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgtLWxpbWl0KTsKK30KKworaW50IGZmYl9kcml2ZXJfY29udGV4dF9zd2l0Y2goZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpCit7CisJZmZiX2Rldl9wcml2X3QgKmZwcml2ID0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKyNpZmRlZiBEUk1fRE1BX0hJU1RPR1JBTQorICAgICAgICBkZXYtPmN0eF9zdGFydCA9IGdldF9jeWNsZXMoKTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgRFJNX0RFQlVHKCJDb250ZXh0IHN3aXRjaCBmcm9tICVkIHRvICVkXG4iLCBvbGQsIG5ldyk7CisKKyAgICAgICAgaWYgKG5ldyA9PSBkZXYtPmxhc3RfY29udGV4dCB8fAorCSAgICBkZXYtPmxhc3RfY29udGV4dCA9PSAwKSB7CisJCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KKyAgICAgICAgCisJRkZCV2FpdChmcHJpdi0+cmVncyk7CisJZmZiX3NhdmVfY29udGV4dChmcHJpdiwgb2xkKTsKKwlmZmJfcmVzdG9yZV9jb250ZXh0KGZwcml2LCBvbGQsIG5ldyk7CisJRkZCV2FpdChmcHJpdi0+cmVncyk7CisgICAgICAgIAorCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OworCisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgZmZiX2RyaXZlcl9yZXNjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfcmVzX3QJcmVzOworCWRybV9jdHhfdAljdHg7CisJaW50CQlpOworCisJRFJNX0RFQlVHKCIlZFxuIiwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgKGRybV9jdHhfcmVzX3QgX191c2VyICopYXJnLCBzaXplb2YocmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChyZXMuY291bnQgPj0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTKSB7CisJCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CisJCWZvciAoaSA9IDA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFM7IGkrKykgeworCQkJY3R4LmhhbmRsZSA9IGk7CisJCQlpZiAoY29weV90b191c2VyKCZyZXMuY29udGV4dHNbaV0sCisJCQkJCSAmaSwKKwkJCQkJIHNpemVvZihpKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmVzLmNvdW50ID0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTOworCWlmIChjb3B5X3RvX3VzZXIoKGRybV9jdHhfcmVzX3QgX191c2VyICopYXJnLCAmcmVzLCBzaXplb2YocmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisKK2ludCBmZmJfZHJpdmVyX2FkZGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWludCBpZHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWR4ID0gRFJNKGFsbG9jX3F1ZXVlKShkZXYsIChjdHguZmxhZ3MgJiBfRFJNX0NPTlRFWFRfMkRPTkxZKSk7CisJaWYgKGlkeCA8IDApCisJCXJldHVybiAtRU5GSUxFOworCisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJY3R4LmhhbmRsZSA9IGlkeDsKKwlpZiAoY29weV90b191c2VyKChkcm1fY3R4X3QgX191c2VyICopYXJnLCAmY3R4LCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgZmZiX2RyaXZlcl9tb2RjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZmZiX2Rldl9wcml2X3QJKmZwcml2CT0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGZmYl9od19jb250ZXh0ICpod2N0eDsKKwlkcm1fY3R4X3QgY3R4OworCWludCBpZHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZHggPSBjdHguaGFuZGxlOworCWlmIChpZHggPD0gMCB8fCBpZHggPj0gRkZCX01BWF9DVFhTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3Y3R4ID0gZnByaXYtPmh3X3N0YXRlW2lkeCAtIDFdOworCWlmIChod2N0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoY3R4LmZsYWdzICYgX0RSTV9DT05URVhUXzJET05MWSkgPT0gMCkKKwkJaHdjdHgtPmlzXzJkX29ubHkgPSAwOworCWVsc2UKKwkJaHdjdHgtPmlzXzJkX29ubHkgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBmZmJfZHJpdmVyX2dldGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlmZmJfZGV2X3ByaXZfdAkqZnByaXYJPSAoZmZiX2Rldl9wcml2X3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZmZiX2h3X2NvbnRleHQgKmh3Y3R4OworCWRybV9jdHhfdCBjdHg7CisJaW50IGlkeDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlkeCA9IGN0eC5oYW5kbGU7CisJaWYgKGlkeCA8PSAwIHx8IGlkeCA+PSBGRkJfTUFYX0NUWFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdjdHggPSBmcHJpdi0+aHdfc3RhdGVbaWR4IC0gMV07CisJaWYgKGh3Y3R4ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGh3Y3R4LT5pc18yZF9vbmx5ICE9IDApCisJCWN0eC5mbGFncyA9IF9EUk1fQ09OVEVYVF8yRE9OTFk7CisJZWxzZQorCQljdHguZmxhZ3MgPSAwOworCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgJmN0eCwgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitpbnQgZmZiX2RyaXZlcl9zd2l0Y2hjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CWN0eDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90ICBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJcmV0dXJuIGZmYl9kcml2ZXJfY29udGV4dF9zd2l0Y2goZGV2LCBkZXYtPmxhc3RfY29udGV4dCwgY3R4LmhhbmRsZSk7Cit9CisKK2ludCBmZmJfZHJpdmVyX25ld2N0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2N0eF90CWN0eDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90ICBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGZmYl9kcml2ZXJfcm1jdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfdAljdHg7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlmZmJfZGV2X3ByaXZfdAkqZnByaXYJPSAoZmZiX2Rldl9wcml2X3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaWR4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWR4ID0gY3R4LmhhbmRsZSAtIDE7CisJaWYgKGlkeCA8IDAgfHwgaWR4ID49IEZGQl9NQVhfQ1RYUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnByaXYtPmh3X3N0YXRlW2lkeF0gIT0gTlVMTCkgeworCQlrZnJlZShmcHJpdi0+aHdfc3RhdGVbaWR4XSk7CisJCWZwcml2LT5od19zdGF0ZVtpZHhdID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZiX3NldF9jb250ZXh0X2lvY3Rscyh2b2lkKQoreworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX2FkZGN0eDsKKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX3JtY3R4OworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTU9EX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX21vZGN0eDsKKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DVFgpXS5mdW5jID0gZmZiX2RyaXZlcl9nZXRjdHg7CisJRFJNKGlvY3RscylbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TV0lUQ0hfQ1RYKV0uZnVuYyA9IGZmYl9kcml2ZXJfc3dpdGNoY3R4OworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTkVXX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX25ld2N0eDsKKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JFU19DVFgpXS5mdW5jID0gZmZiX2RyaXZlcl9yZXNjdHg7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2MTRmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5jCkBAIC0wLDAgKzEsMzY1IEBACisvKiAkSWQ6IGZmYl9kcnYuYyx2IDEuMTYgMjAwMS8xMC8xOCAxNjowMDoyNCBkYXZlbSBFeHAgJAorICogZmZiX2Rydi5jOiBDcmVhdG9yL0NyZWF0b3IzRCBkaXJlY3QgcmVuZGVyaW5nIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJmZmIuaCIKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJmZmJfZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3VwYS5oPgorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJEYXZpZCBTLiBNaWxsZXIiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJmZmIiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiQ3JlYXRvci9DcmVhdG9yM0QiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMDA1MTciCisKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkwCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMAorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkxCisKK3R5cGVkZWYgc3RydWN0IF9mZmJfcG9zaXRpb25fdCB7CisJaW50IG5vZGU7CisJaW50IHJvb3Q7Cit9IGZmYl9wb3NpdGlvbl90OworCitzdGF0aWMgZmZiX3Bvc2l0aW9uX3QgKmZmYl9wb3NpdGlvbjsKKworc3RhdGljIHZvaWQgZ2V0X2ZmYl90eXBlKGZmYl9kZXZfcHJpdl90ICpmZmJfcHJpdiwgaW50IGluc3RhbmNlKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnN0cmFwX2JpdHM7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzdHJhcF9iaXRzID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKKwkJKGZmYl9wcml2LT5jYXJkX3BoeXNfYmFzZSArIDB4MDAyMDAwMDBVTCk7CisKKwkvKiBEb24ndCBhc2ssIHlvdSBoYXZlIHRvIHJlYWQgdGhlIHZhbHVlIHR3aWNlIGZvciB3aGF0ZXZlcgorCSAqIHJlYXNvbiB0byBnZXQgY29ycmVjdCBjb250ZW50cy4KKwkgKi8KKwl2YWwgPSB1cGFfcmVhZGIoc3RyYXBfYml0cyk7CisJdmFsID0gdXBhX3JlYWRiKHN0cmFwX2JpdHMpOworCXN3aXRjaCAodmFsICYgMHg3OCkgeworCWNhc2UgKDB4MCA8PCA1KSB8ICgweDAgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjFfcHJvdG90eXBlOworCQlwcmludGsoImZmYiVkOiBEZXRlY3RlZCBGRkIxIHByZS1GQ1MgcHJvdG90eXBlXG4iLCBpbnN0YW5jZSk7CisJCWJyZWFrOworCWNhc2UgKDB4MCA8PCA1KSB8ICgweDEgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjFfc3RhbmRhcmQ7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjFcbiIsIGluc3RhbmNlKTsKKwkJYnJlYWs7CisJY2FzZSAoMHgwIDw8IDUpIHwgKDB4MyA8PCAzKToKKwkJZmZiX3ByaXYtPmZmYl90eXBlID0gZmZiMV9zcGVlZHNvcnQ7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjEtU3BlZWRTb3J0XG4iLCBpbnN0YW5jZSk7CisJCWJyZWFrOworCWNhc2UgKDB4MSA8PCA1KSB8ICgweDAgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjJfcHJvdG90eXBlOworCQlwcmludGsoImZmYiVkOiBEZXRlY3RlZCBGRkIyL3ZlcnRpY2FsIHByZS1GQ1MgcHJvdG90eXBlXG4iLCBpbnN0YW5jZSk7CisJCWJyZWFrOworCWNhc2UgKDB4MSA8PCA1KSB8ICgweDEgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjJfdmVydGljYWw7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjIvdmVydGljYWxcbiIsIGluc3RhbmNlKTsKKwkJYnJlYWs7CisJY2FzZSAoMHgxIDw8IDUpIHwgKDB4MiA8PCAzKToKKwkJZmZiX3ByaXYtPmZmYl90eXBlID0gZmZiMl92ZXJ0aWNhbF9wbHVzOworCQlwcmludGsoImZmYiVkOiBEZXRlY3RlZCBGRkIyKy92ZXJ0aWNhbFxuIiwgaW5zdGFuY2UpOworCQlicmVhazsKKwljYXNlICgweDIgPDwgNSkgfCAoMHgwIDw8IDMpOgorCQlmZmJfcHJpdi0+ZmZiX3R5cGUgPSBmZmIyX2hvcml6b250YWw7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjIvaG9yaXpvbnRhbFxuIiwgaW5zdGFuY2UpOworCQlicmVhazsKKwljYXNlICgweDIgPDwgNSkgfCAoMHgyIDw8IDMpOgorCQlmZmJfcHJpdi0+ZmZiX3R5cGUgPSBmZmIyX2hvcml6b250YWw7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjIrL2hvcml6b250YWxcbiIsIGluc3RhbmNlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmZiX3ByaXYtPmZmYl90eXBlID0gZmZiMl92ZXJ0aWNhbDsKKwkJcHJpbnRrKCJmZmIlZDogVW5rbm93biBib2FyZElEWyUwOHhdLCBhc3N1bWluZyBGRkIyXG4iLCBpbnN0YW5jZSwgdmFsKTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIHZvaWQgZmZiX2FwcGx5X3VwYV9wYXJlbnRfcmFuZ2VzKGludCBwYXJlbnQsIAorCQkJCQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVncykKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbTY0X3JhbmdlcyByYW5nZXNbUFJPTVJFR19NQVhdOworCWNoYXIgbmFtZVsxMjhdOworCWludCBsZW4sIGk7CisKKwlwcm9tX2dldHByb3BlcnR5KHBhcmVudCwgIm5hbWUiLCBuYW1lLCBzaXplb2YobmFtZSkpOworCWlmIChzdHJjbXAobmFtZSwgInVwYSIpICE9IDApCisJCXJldHVybjsKKworCWxlbiA9IHByb21fZ2V0cHJvcGVydHkocGFyZW50LCAicmFuZ2VzIiwgKHZvaWQgKikgcmFuZ2VzLCBzaXplb2YocmFuZ2VzKSk7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm47CisKKwlsZW4gLz0gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tNjRfcmFuZ2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJc3RydWN0IGxpbnV4X3Byb202NF9yYW5nZXMgKnJuZyA9ICZyYW5nZXNbaV07CisJCXU2NCBwaHlzX2FkZHIgPSByZWdzLT5waHlzX2FkZHI7CisKKwkJaWYgKHBoeXNfYWRkciA+PSBybmctPm90X2NoaWxkX2Jhc2UgJiYKKwkJICAgIHBoeXNfYWRkciA8IChybmctPm90X2NoaWxkX2Jhc2UgKyBybmctPm9yX3NpemUpKSB7CisJCQlyZWdzLT5waHlzX2FkZHIgLT0gcm5nLT5vdF9jaGlsZF9iYXNlOworCQkJcmVncy0+cGh5c19hZGRyICs9IHJuZy0+b3RfcGFyZW50X2Jhc2U7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZmZiX2luaXRfb25lKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgcHJvbV9ub2RlLCBpbnQgcGFyZW50X25vZGUsCisJCQlpbnQgaW5zdGFuY2UpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcmVnc1syKlBST01SRUdfTUFYXTsKKwlmZmJfZGV2X3ByaXZfdCAqZmZiX3ByaXYgPSAoZmZiX2Rldl9wcml2X3QgKilkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCisJZmZiX3ByaXYtPnByb21fbm9kZSA9IHByb21fbm9kZTsKKwlpZiAocHJvbV9nZXRwcm9wZXJ0eShmZmJfcHJpdi0+cHJvbV9ub2RlLCAicmVnIiwKKwkJCSAgICAgKHZvaWQgKilyZWdzLCBzaXplb2YocmVncykpIDw9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZmYl9hcHBseV91cGFfcGFyZW50X3JhbmdlcyhwYXJlbnRfbm9kZSwgJnJlZ3NbMF0pOworCWZmYl9wcml2LT5jYXJkX3BoeXNfYmFzZSA9IHJlZ3NbMF0ucGh5c19hZGRyOworCWZmYl9wcml2LT5yZWdzID0gKGZmYl9mYmNQdHIpCisJCShyZWdzWzBdLnBoeXNfYWRkciArIDB4MDA2MDAwMDBVTCk7CisJZ2V0X2ZmYl90eXBlKGZmYl9wcml2LCBpbnN0YW5jZSk7CisJZm9yIChpID0gMDsgaSA8IEZGQl9NQVhfQ1RYUzsgaSsrKQorCQlmZmJfcHJpdi0+aHdfc3RhdGVbaV0gPSBOVUxMOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgZHJtX21hcF90ICpmZmJfZmluZF9tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXY7CisJZHJtX21hcF9saXN0X3QgICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlkcm1fbWFwX3QJKm1hcDsKKworCWlmICghcHJpdiB8fCAoZGV2ID0gcHJpdi0+ZGV2KSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQl1bnNpZ25lZCBsb25nIHVvZmY7CisKKwkJcl9saXN0ID0gKGRybV9tYXBfbGlzdF90ICopbGlzdDsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmICghbWFwKQorCQkJY29udGludWU7CisJCXVvZmYgPSAobWFwLT5vZmZzZXQgJiAweGZmZmZmZmZmKTsKKwkJaWYgKHVvZmYgPT0gb2ZmKQorCQkJcmV0dXJuIG1hcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordW5zaWduZWQgbG9uZyBmZmJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgaGludCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZHJtX21hcF90ICptYXAgPSBmZmJfZmluZF9tYXAoZmlscCwgcGdvZmYgPDwgUEFHRV9TSElGVCk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gLUVOT01FTTsKKworCWlmICghbWFwKQorCQlyZXR1cm4gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgaGludCwgbGVuLCBwZ29mZiwgZmxhZ3MpOworCisJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX0ZSQU1FX0JVRkZFUiB8fAorCSAgICBtYXAtPnR5cGUgPT0gX0RSTV9SRUdJU1RFUlMpIHsKKyNpZmRlZiBIQVZFX0FSQ0hfRkJfVU5NQVBQRURfQVJFQQorCQlhZGRyID0gZ2V0X2ZiX3VubWFwcGVkX2FyZWEoZmlscCwgaGludCwgbGVuLCBwZ29mZiwgZmxhZ3MpOworI2Vsc2UKKwkJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIGhpbnQsIGxlbiwgcGdvZmYsIGZsYWdzKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAobWFwLT50eXBlID09IF9EUk1fU0hNICYmIFNITUxCQSA+IFBBR0VfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIHNsYWNrID0gU0hNTEJBIC0gUEFHRV9TSVpFOworCisJCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCBoaW50LCBsZW4gKyBzbGFjaywgcGdvZmYsIGZsYWdzKTsKKwkJaWYgKCEoYWRkciAmIH5QQUdFX01BU0spKSB7CisJCQl1bnNpZ25lZCBsb25nIGt2aXJ0ID0gKHVuc2lnbmVkIGxvbmcpIG1hcC0+aGFuZGxlOworCisJCQlpZiAoKGt2aXJ0ICYgKFNITUxCQSAtIDEpKSAhPSAoYWRkciAmIChTSE1MQkEgLSAxKSkpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGtvZmYsIGFvZmY7CisKKwkJCQlrb2ZmID0ga3ZpcnQgJiAoU0hNTEJBIC0gMSk7CisJCQkJYW9mZiA9IGFkZHIgJiAoU0hNTEJBIC0gMSk7CisJCQkJaWYgKGtvZmYgPCBhb2ZmKQorCQkJCQlrb2ZmICs9IFNITUxCQTsKKworCQkJCWFkZHIgKz0gKGtvZmYgLSBhb2ZmKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCBoaW50LCBsZW4sIHBnb2ZmLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgZmZiX3ByZXNldHVwKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWZmYl9kZXZfcHJpdl90CSpmZmJfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gZGV2aWNlIHdhcyBmb3VuZC4gKi8KKwlpZiAoZmZiX3Bvc2l0aW9uID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY29kZSB1c2VkIHRvIHVzZSBudW1kZXZzIG5vIG51bWRldnMgYW55bW9yZSAqLworCWZmYl9wcml2ID0ga21hbGxvYyhzaXplb2YoZmZiX2Rldl9wcml2X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZmYl9wcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmZiX3ByaXYsIDAsIHNpemVvZigqZmZiX3ByaXYpKTsKKwlkZXYtPmRldl9wcml2YXRlID0gZmZiX3ByaXY7CisKKwlyZXQgPSBmZmJfaW5pdF9vbmUoZGV2LAorCQkJICAgZmZiX3Bvc2l0aW9uW2ldLm5vZGUsCisJCQkgICBmZmJfcG9zaXRpb25baV0ucm9vdCwKKwkJCSAgIGkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZmYl9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZmZiX2Rldl9wcml2X3QgKmZwcml2ID0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNvbnRleHQgPSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChkZXYtPmxvY2suaHdfbG9jay0+bG9jayk7CisJaW50IGlkeDsKKworCWlkeCA9IGNvbnRleHQgLSAxOworCWlmIChmcHJpdiAmJgorCSAgICBjb250ZXh0ICE9IERSTV9LRVJORUxfQ09OVEVYVCAmJgorCSAgICBmcHJpdi0+aHdfc3RhdGVbaWR4XSAhPSBOVUxMKSB7CisJCWtmcmVlKGZwcml2LT5od19zdGF0ZVtpZHhdKTsKKwkJZnByaXYtPmh3X3N0YXRlW2lkeF0gPSBOVUxMOworCX0JCit9CisKK3N0YXRpYyB2b2lkIGZmYl9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIGtmcmVlKGRldi0+ZGV2X3ByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGZmYl9kcml2ZXJfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKGZmYl9wb3NpdGlvbiAhPSBOVUxMKSBrZnJlZShmZmJfcG9zaXRpb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmZmJfZHJpdmVyX2tlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2tfdCAqbG9jaykKK3sKKwlkZXYtPmxvY2suZmlscCA9IDA7CisJeworCQlfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpwbG9jayA9ICZkZXYtPmxvY2suaHdfbG9jay0+bG9jazsKKwkJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2LCBjdHg7CisJCQorCQljdHggPSBsb2NrLT5jb250ZXh0OworCQlkbyB7CisJCQlvbGQgID0gKnBsb2NrOworCQkJbmV3ICA9IGN0eDsKKwkJCXByZXYgPSBjbXB4Y2hnKHBsb2NrLCBvbGQsIG5ldyk7CisJCX0gd2hpbGUgKHByZXYgIT0gb2xkKTsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmxvY2subG9ja19xdWV1ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZmYl9kcml2ZXJfZ2V0X21hcF9vZnMoZHJtX21hcF90ICptYXApCit7CisJcmV0dXJuIChtYXAtPm9mZnNldCAmIDB4ZmZmZmZmZmYpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmZmJfZHJpdmVyX2dldF9yZWdfb2ZzKGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgICAgIGZmYl9kZXZfcHJpdl90ICpmZmJfcHJpdiA9IChmZmJfZGV2X3ByaXZfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAgCisgICAgICAgaWYgKGZmYl9wcml2KQorICAgICAgICAgICAgICAgcmV0dXJuIGZmYl9wcml2LT5jYXJkX3BoeXNfYmFzZTsKKyAgICAgICAKKyAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApIAoreworCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWRcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPm1pbm9yCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGRybV9pb2N0bF9kZXNjX3QgaW9jdGxzW10gPSB7CisJCit9OworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSAwLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKHUzMiksCisJLnJlbGVhc2UgPSBmZmJfZHJpdmVyX3JlbGVhc2UsCisJLnByZXNldHVwID0gZmZiX3ByZXNldHVwLAorCS5wcmV0YWtlZG93biA9IGZmYl9kcml2ZXJfcHJldGFrZWRvd24sCisJLnBvc3RjbGVhbnVwID0gZmZiX2RyaXZlcl9wb3N0Y2xlYW51cCwKKwkua2VybmVsX2NvbnRleHRfc3dpdGNoID0gZmZiX2RyaXZlcl9jb250ZXh0X3N3aXRjaCwKKwkua2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jayA9IGZmYl9kcml2ZXJfa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaywKKwkuZ2V0X21hcF9vZnMgPSBmZmJfZHJpdmVyX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGZmYl9kcml2ZXJfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpb2N0bHMsCisJLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShpb2N0bHMpLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmZiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZmYl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGZmYl9pbml0KTsKK21vZHVsZV9leGl0KGZmYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmN2YxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2ZmYl9kcnYuaApAQCAtMCwwICsxLDI4NiBAQAorLyogJElkOiBmZmJfZHJ2LmgsdiAxLjEgMjAwMC8wNi8wMSAwNDoyNDozOSBkYXZlbSBFeHAgJAorICogZmZiX2Rydi5oOiBDcmVhdG9yL0NyZWF0b3IzRCBkaXJlY3QgcmVuZGVyaW5nIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKy8qIEF1eGlsbGlhcnkgY2xpcHMuICovCit0eXBlZGVmIHN0cnVjdCAgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBtaW47CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG1heDsKK30gZmZiX2F1eGNsaXAsICpmZmJfYXV4Y2xpcFB0cjsKKworLyogRkZCIHJlZ2lzdGVyIHNldC4gKi8KK3R5cGVkZWYgc3RydWN0IF9mZmJfZmJjIHsKKwkvKiBOZXh0IHZlcnRleCByZWdpc3RlcnMsIG9uIHRoZSByaWdodCB3ZSBsaXN0IHdoaWNoIGRyYXdvcHMKKwkgKiB1c2Ugc2FpZCByZWdpc3RlciBhbmQgdGhlIGxvZ2ljYWwgbmFtZSB0aGUgcmVnaXN0ZXIgaGFzIGluCisJICogdGhhdCBjb250ZXh0LgorCSAqLwkJCQkJLyogREVTQ1JJUFRJT04JCURSQVdPUChOQU1FKQkqLworLyoweDAwKi91bnNpZ25lZCBpbnQJCXBhZDFbM107CS8qIFJlc2VydmVkCQkJCSovCisvKjB4MGMqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlhbHBoYTsJCS8qIEFMUEhBIFRyYW5zcGFyZW5jeQkJCSovCisvKjB4MTAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlyZWQ7CQkvKiBSRUQJCQkJCSovCisvKjB4MTQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlncmVlbjsJCS8qIEdSRUVOCQkJCSovCisvKjB4MTgqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlibHVlOwkJLyogQkxVRQkJCQkJKi8KKy8qMHgxYyovdm9sYXRpbGUgdW5zaWduZWQgaW50CXo7CQkvKiBERVBUSAkJCQkqLworLyoweDIwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJeTsJCS8qIFkJCQl0cmlhbmdsZShET1lGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgYWFkb3QoRFlGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgZGRsaW5lKERZRikJKi8KKwkJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgIGFhbGluZShEWUYpCSovCisvKjB4MjQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAl4OwkJLyogWAkJCXRyaWFuZ2xlKERPWEYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBhYWRvdChEWEYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBkZGxpbmUoRFhGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgYWFsaW5lKERYRikJKi8KKy8qMHgyOCovdW5zaWduZWQgaW50CQlwYWQyWzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyoweDMwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJcnlmOwkJLyogWSAoYWxpYXMgdG8gRE9ZRikJZGRsaW5lKFJZRikJKi8KKwkJCQkJCS8qCQkJYWFsaW5lKFJZRikJKi8KKwkJCQkJCS8qCQkJdHJpYW5nbGUoUllGKQkqLworLyoweDM0Ki92b2xhdGlsZSB1bnNpZ25lZCBpbnQJcnhmOwkJLyogWAkJCWRkbGluZShSWEYpCSovCisJCQkJCQkvKgkJCWFhbGluZShSWEYpCSovCisJCQkJCQkvKgkJCXRyaWFuZ2xlKFJYRikJKi8KKy8qMHgzOCovdW5zaWduZWQgaW50CQlwYWQzWzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyoweDQwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJZG15ZjsJCS8qIFkgKGFsaWFzIHRvIERPWUYpCXRyaWFuZ2xlKERNWUYpCSovCisvKjB4NDQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlkbXhmOwkJLyogWAkJCXRyaWFuZ2xlKERNWEYpCSovCisvKjB4NDgqL3Vuc2lnbmVkIGludAkJcGFkNFsyXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMHg1MCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWVieWk7CQkvKiBZIChhbGlhcyB0byBSWUkpCXBvbHlnb24oRUJZSSkJKi8KKy8qMHg1NCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWVieGk7CQkvKiBYCQkJcG9seWdvbihFQlhJKQkqLworLyoweDU4Ki91bnNpZ25lZCBpbnQJCXBhZDVbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjB4NjAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlieTsJCS8qIFkJCQlicmxpbmUoUllJKQkqLworCQkJCQkJLyoJCQlmYXN0ZmlsbChPUCkJKi8KKwkJCQkJCS8qCQkJcG9seWdvbihZSSkJKi8KKwkJCQkJCS8qCQkJcmVjdGFuZ2xlKFlJKQkqLworCQkJCQkJLyoJCQliY29weShTUkNZKQkqLworCQkJCQkJLyoJCQl2c2Nyb2xsKFNSQ1kpCSovCisvKjB4NjQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlieDsJCS8qIFgJCQlicmxpbmUoUlhJKQkqLworCQkJCQkJLyoJCQlwb2x5Z29uKFhJKQkqLworCQkJCQkJLyoJCQlyZWN0YW5nbGUoWEkpCSovCisJCQkJCQkvKgkJCWJjb3B5KFNSQ1gpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoU1JDWCkJKi8KKwkJCQkJCS8qCQkJZmFzdGZpbGwoR08pCSovCisvKjB4NjgqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlkeTsJCS8qIGRlc3RpbmF0aW9uIFkJZmFzdGZpbGwoRFNUWSkJKi8KKwkJCQkJCS8qCQkJYmNvcHkoRFNSWSkJKi8KKwkJCQkJCS8qCQkJdnNjcm9sbChEU1JZKQkqLworLyoweDZjKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJZHg7CQkvKiBkZXN0aW5hdGlvbiBYCWZhc3RmaWxsKERTVFgpCSovCisJCQkJCQkvKgkJCWJjb3B5KERTVFgpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoRFNUWCkJKi8KKy8qMHg3MCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWJoOwkJLyogWSAoYWxpYXMgdG8gUllJKQlicmxpbmUoRFlJKQkqLworCQkJCQkJLyoJCQlkb3QoRFlJKQkqLworCQkJCQkJLyoJCQlwb2x5Z29uKEVUWUkpCSovCisJCQkJCQkvKiBIZWlnaHQJCWZhc3RmaWxsKEgpCSovCisJCQkJCQkvKgkJCWJjb3B5KEgpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoSCkJKi8KKwkJCQkJCS8qIFkgY291bnQJCWZhc3RmaWxsKE5ZKQkqLworLyoweDc0Ki92b2xhdGlsZSB1bnNpZ25lZCBpbnQJYnc7CQkvKiBYCQkJZG90KERYSSkJKi8KKwkJCQkJCS8qCQkJYnJsaW5lKERYSSkJKi8KKwkJCQkJCS8qCQkJcG9seWdvbihFVFhJKQkqLworCQkJCQkJLyoJCQlmYXN0ZmlsbChXKQkqLworCQkJCQkJLyoJCQliY29weShXKQkqLworCQkJCQkJLyoJCQl2c2Nyb2xsKFcpCSovCisJCQkJCQkvKgkJCWZhc3RmaWxsKE5YKQkqLworLyoweDc4Ki91bnNpZ25lZCBpbnQJCXBhZDZbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjB4ODAqL3Vuc2lnbmVkIGludAkJcGFkN1szMl07CS8qIFJlc2VydmVkCQkJCSovCisJCisJLyogU2V0dXAgVW5pdCdzIHZlcnRleCBzdGF0ZSByZWdpc3RlciAqLworLyoxMDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJc3V2dHg7CisvKjEwNCovCXVuc2lnbmVkIGludAkJcGFkOFs2M107CS8qIFJlc2VydmVkCQkJCSovCisJCisJLyogRnJhbWUgQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXJzICovCisvKjIwMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwcGM7CQkvKiBQaXhlbCBQcm9jZXNzb3IgQ29udHJvbAkJKi8KKy8qMjA0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXdpZDsJCS8qIEN1cnJlbnQgV0lECQkJCSovCisvKjIwOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmZzsJCS8qIEZHIGRhdGEJCQkJKi8KKy8qMjBjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWJnOwkJLyogQkcgZGF0YQkJCQkqLworLyoyMTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJY29uc3R5OwkJLyogQ29uc3RhbnQgWQkJCQkqLworLyoyMTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJY29uc3R6OwkJLyogQ29uc3RhbnQgWgkJCQkqLworLyoyMTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJeGNsaXA7CQkvKiBYIENsaXAJCQkJKi8KKy8qMjFjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc3M7CQkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUJCSovCisvKjIyMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl2Y2xpcG1pbjsJLyogVmlld2NsaXAgWFkgTWluIEJvdW5kcwkJKi8KKy8qMjI0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXZjbGlwbWF4OwkvKiBWaWV3Y2xpcCBYWSBNYXggQm91bmRzCQkqLworLyoyMjgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdmNsaXB6bWluOwkvKiBWaWV3Y2xpcCBaIE1pbiBCb3VuZHMJCSovCisvKjIyYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl2Y2xpcHptYXg7CS8qIFZpZXdjbGlwIFogTWF4IEJvdW5kcwkJKi8KKy8qMjMwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc2Y7CQkvKiBEZXB0aCBDdWUgU2NhbGUgRnJvbnQgQm91bmQJCSovCisvKjIzNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3NiOwkJLyogRGVwdGggQ3VlIFNjYWxlIEJhY2sgQm91bmQJCSovCisvKjIzOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3pmOwkJLyogRGVwdGggQ3VlIFogRnJvbnQJCQkqLworLyoyM2MqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGN6YjsJCS8qIERlcHRoIEN1ZSBaIEJhY2sJCQkqLworLyoyNDAqLwl1bnNpZ25lZCBpbnQJCXBhZDk7CQkvKiBSZXNlcnZlZAkJCQkqLworLyoyNDQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJYmxlbmRjOwkJLyogQWxwaGEgQmxlbmQgQ29udHJvbAkJCSovCisvKjI0OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlibGVuZGMxOwkvKiBBbHBoYSBCbGVuZCBDb2xvciAxCQkJKi8KKy8qMjRjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWJsZW5kYzI7CS8qIEFscGhhIEJsZW5kIENvbG9yIDIJCQkqLworLyoyNTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJyYW1pdGM7CS8qIEZCIFJBTSBJbnRlcmxlYXZlIFRlc3QgQ29udHJvbAkqLworLyoyNTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjOwkJLyogRnJhbWUgQnVmZmVyIENvbnRyb2wJCQkqLworLyoyNTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcm9wOwkJLyogUmFzdGVyIE9QZXJhdGlvbgkJCSovCisvKjI1YyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAljbXA7CQkvKiBGcmFtZSBCdWZmZXIgQ29tcGFyZQkJCSovCisvKjI2MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAltYXRjaGFiOwkvKiBCdWZmZXIgQUIgTWF0Y2ggTWFzawkJCSovCisvKjI2NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAltYXRjaGM7CQkvKiBCdWZmZXIgQyhZWikgTWF0Y2ggTWFzawkJKi8KKy8qMjY4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1hZ25hYjsJCS8qIEJ1ZmZlciBBQiBNYWduaXR1ZGUgTWFzawkJKi8KKy8qMjZjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1hZ25jOwkJLyogQnVmZmVyIEMoWVopIE1hZ25pdHVkZSBNYXNrCQkqLworLyoyNzAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmcwOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAwCQkqLworLyoyNzQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmcxOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAxCQkqLworLyoyNzgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmcyOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAyCQkqLworLyoyN2MqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmczOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAzCQkqLworLyoyODAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcHBjZmc7CQkvKiBQaXhlbCBQcm9jZXNzb3IgQ29uZmlnCQkqLworLyoyODQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcGljazsJCS8qIFBpY2tpbmcgQ29udHJvbAkJCSovCisvKjI4OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmaWxsbW9kZTsJLyogRmlsbE1vZGUJCQkJKi8KKy8qMjhjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZicmFtd2FjOwkvKiBGQiBSQU0gV3JpdGUgQWRkcmVzcyBDb250cm9sCQkqLworLyoyOTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcG1hc2s7CQkvKiBSR0IgUGxhbmVNYXNrCQkJKi8KKy8qMjk0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXhwbWFzazsJCS8qIFggUGxhbmVNYXNrCQkJCSovCisvKjI5OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl5cG1hc2s7CQkvKiBZIFBsYW5lTWFzawkJCQkqLworLyoyOWMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJenBtYXNrOwkJLyogWiBQbGFuZU1hc2sJCQkJKi8KKy8qMmEwKi8JZmZiX2F1eGNsaXAJCWF1eGNsaXBbNF07IAkvKiBBdXhpbGxpYXJ5IFZpZXdwb3J0IENsaXAJCSovCisJCisJLyogTmV3IDNkUkFNIElJSSBzdXBwb3J0IHJlZ3MgKi8KKy8qMmMwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd2JsZW5kMjsKKy8qMmM0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd3ByZWJsZW5kOworLyoyYzgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3c3RlbmNpbDsKKy8qMmNjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd3N0ZW5jaWxjdGw7CisvKjJkMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl0aHJlZWRyYW0xOworLyoyZDQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdGhyZWVkcmFtMjsKKy8qMmQ4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXBhc3NpbjsKKy8qMmRjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd2NscmRlcHRoOworLyoyZTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3cG1hc2s7CisvKjJlNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdjc3JjOworLyoyZTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3bWF0Y2g7CisvKjJlYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdtYWduOworLyoyZjAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3cm9wYmxlbmQ7CisvKjJmNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdjbXA7CisvKjJmOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXd3YWM7CisvKjJmYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYnJhbWlkOworCQorLyozMDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZHJhd29wOwkJLyogRHJhdyBPUGVyYXRpb24JCQkqLworLyozMDQqLwl1bnNpZ25lZCBpbnQJCXBhZDEwWzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyozMGMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJbHBhdDsJCS8qIExpbmUgUGF0dGVybiBjb250cm9sCQkJKi8KKy8qMzEwKi8JdW5zaWduZWQgaW50CQlwYWQxMTsJCS8qIFJlc2VydmVkCQkJCSovCisvKjMxNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250eHk7CQkvKiBYWSBGb250IGNvb3JkaW5hdGUJCQkqLworLyozMTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZm9udHc7CQkvKiBGb250IFdpZHRoCQkJCSovCisvKjMxYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250aW5jOwkvKiBGb250IEluY3JlbWVudAkJCSovCisvKjMyMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250OwkJLyogRm9udCBiaXRzCQkJCSovCisvKjMyNCovCXVuc2lnbmVkIGludAkJcGFkMTJbM107CS8qIFJlc2VydmVkCQkJCSovCisvKjMzMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlibGVuZDI7CisvKjMzNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwcmVibGVuZDsKKy8qMzM4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXN0ZW5jaWw7CisvKjMzYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlzdGVuY2lsY3RsOworCisvKjM0MCovCXVuc2lnbmVkIGludAkJcGFkMTNbNF07CS8qIFJlc2VydmVkCQkJCSovCisvKjM1MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3NzMTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAxCQkqLworLyozNTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzczI7CQkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMgkJKi8KKy8qMzU4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc3MzOwkJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDMJCSovCisvKjM1YyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl3aWRwbWFzazsKKy8qMzYwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjczI7CisvKjM2NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3MzOworLyozNjgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzNDsKKy8qMzZjKi8JdW5zaWduZWQgaW50CQlwYWQxNDsJCS8qIFJlc2VydmVkCQkJCSovCisvKjM3MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY2QyOworLyozNzQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNkMzsKKy8qMzc4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjZDQ7CisvKjM3YyovCXVuc2lnbmVkIGludAkJcGFkMTU7CQkvKiBSZXNlcnZlZAkJCQkqLworLyozODAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcGF0dGVyblszMl07CS8qIGFyZWEgUGF0dGVybgkJCQkqLworLyo0MDAqLwl1bnNpZ25lZCBpbnQJCXBhZDE2WzhdOwkvKiBSZXNlcnZlZAkJCQkqLworLyo0MjAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmVzZXQ7CQkvKiBjaGlwIFJFU0VUCQkJCSovCisvKjQyNCovCXVuc2lnbmVkIGludAkJcGFkMTdbMjQ3XTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qODAwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRldmlkOwkJLyogRGV2aWNlIElECQkJCSovCisvKjgwNCovCXVuc2lnbmVkIGludAkJcGFkMThbNjNdOwkvKiBSZXNlcnZlZAkJCQkqLworLyo5MDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdWNzcjsJCS8qIFVzZXIgQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlcgkqLworLyo5MDQqLwl1bnNpZ25lZCBpbnQJCXBhZDE5WzMxXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qOTgwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1lcjsJCS8qIE1vZGUgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KKy8qOTg0Ki8JdW5zaWduZWQgaW50CQlwYWQyMFsxNDM5XTsJLyogUmVzZXJ2ZWQJCQkJKi8KK30gZmZiX2ZiYywgKmZmYl9mYmNQdHI7CisKK3N0cnVjdCBmZmJfaHdfY29udGV4dCB7CisJaW50IGlzXzJkX29ubHk7CisKKwl1bnNpZ25lZCBpbnQgcHBjOworCXVuc2lnbmVkIGludCB3aWQ7CisJdW5zaWduZWQgaW50IGZnOworCXVuc2lnbmVkIGludCBiZzsKKwl1bnNpZ25lZCBpbnQgY29uc3R5OworCXVuc2lnbmVkIGludCBjb25zdHo7CisJdW5zaWduZWQgaW50IHhjbGlwOworCXVuc2lnbmVkIGludCBkY3NzOworCXVuc2lnbmVkIGludCB2Y2xpcG1pbjsKKwl1bnNpZ25lZCBpbnQgdmNsaXBtYXg7CisJdW5zaWduZWQgaW50IHZjbGlwem1pbjsKKwl1bnNpZ25lZCBpbnQgdmNsaXB6bWF4OworCXVuc2lnbmVkIGludCBkY3NmOworCXVuc2lnbmVkIGludCBkY3NiOworCXVuc2lnbmVkIGludCBkY3pmOworCXVuc2lnbmVkIGludCBkY3piOworCXVuc2lnbmVkIGludCBibGVuZGM7CisJdW5zaWduZWQgaW50IGJsZW5kYzE7CisJdW5zaWduZWQgaW50IGJsZW5kYzI7CisJdW5zaWduZWQgaW50IGZiYzsKKwl1bnNpZ25lZCBpbnQgcm9wOworCXVuc2lnbmVkIGludCBjbXA7CisJdW5zaWduZWQgaW50IG1hdGNoYWI7CisJdW5zaWduZWQgaW50IG1hdGNoYzsKKwl1bnNpZ25lZCBpbnQgbWFnbmFiOworCXVuc2lnbmVkIGludCBtYWduYzsKKwl1bnNpZ25lZCBpbnQgcG1hc2s7CisJdW5zaWduZWQgaW50IHhwbWFzazsKKwl1bnNpZ25lZCBpbnQgeXBtYXNrOworCXVuc2lnbmVkIGludCB6cG1hc2s7CisJdW5zaWduZWQgaW50IGF1eGNsaXAwbWluOworCXVuc2lnbmVkIGludCBhdXhjbGlwMG1heDsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDFtaW47CisJdW5zaWduZWQgaW50IGF1eGNsaXAxbWF4OworCXVuc2lnbmVkIGludCBhdXhjbGlwMm1pbjsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDJtYXg7CisJdW5zaWduZWQgaW50IGF1eGNsaXAzbWluOworCXVuc2lnbmVkIGludCBhdXhjbGlwM21heDsKKwl1bnNpZ25lZCBpbnQgZHJhd29wOworCXVuc2lnbmVkIGludCBscGF0OworCXVuc2lnbmVkIGludCBmb250eHk7CisJdW5zaWduZWQgaW50IGZvbnR3OworCXVuc2lnbmVkIGludCBmb250aW5jOworCXVuc2lnbmVkIGludCBhcmVhX3BhdHRlcm5bMzJdOworCXVuc2lnbmVkIGludCB1Y3NyOworCXVuc2lnbmVkIGludCBzdGVuY2lsOworCXVuc2lnbmVkIGludCBzdGVuY2lsY3RsOworCXVuc2lnbmVkIGludCBkY3NzMTsKKwl1bnNpZ25lZCBpbnQgZGNzczI7CisJdW5zaWduZWQgaW50IGRjc3MzOworCXVuc2lnbmVkIGludCBkY3MyOworCXVuc2lnbmVkIGludCBkY3MzOworCXVuc2lnbmVkIGludCBkY3M0OworCXVuc2lnbmVkIGludCBkY2QyOworCXVuc2lnbmVkIGludCBkY2QzOworCXVuc2lnbmVkIGludCBkY2Q0OworCXVuc2lnbmVkIGludCBtZXI7Cit9OworCisjZGVmaW5lIEZGQl9NQVhfQ1RYUwkzMgorCitlbnVtIGZmYl9jaGlwX3R5cGUgeworCWZmYjFfcHJvdG90eXBlID0gMCwJLyogRWFybHkgcHJlLUZDUyBGRkIgKi8KKwlmZmIxX3N0YW5kYXJkLAkJLyogRmlyc3QgRkNTIEZGQiwgMTAwTWh6IFVQQSwgNjZNSHogZ2NsayAqLworCWZmYjFfc3BlZWRzb3J0LAkJLyogU2Vjb25kIEZDUyBGRkIsIDEwME1oeiBVUEEsIDc1TUh6IGdjbGsgKi8KKwlmZmIyX3Byb3RvdHlwZSwJCS8qIEVhcmx5IHByZS1GQ1MgdmVydGljYWwgRkZCMiAqLworCWZmYjJfdmVydGljYWwsCQkvKiBGaXJzdCBGQ1MgRkZCMi92ZXJ0aWNhbCwgMTAwTWh6IFVQQSwgMTAwTUhaIGdjbGssCisJCQkJICAgNzUoU2luZ2xlQnVmZmVyKS84MyhEb3VibGVCdWZmZXIpIE1IeiBmY2xrICovCisJZmZiMl92ZXJ0aWNhbF9wbHVzLAkvKiBTZWNvbmQgRkNTIEZGQjIvdmVydGljYWwsIHNhbWUgdGltaW5ncyAqLworCWZmYjJfaG9yaXpvbnRhbCwJLyogRmlyc3QgRkNTIEZGQjIvaG9yaXpvbnRhbCwgc2FtZSB0aW1pbmdzIGFzIEZGQjIvdmVydCAqLworCWZmYjJfaG9yaXpvbnRhbF9wbHVzLAkvKiBTZWNvbmQgRkNTIEZGQjIvaG9yaXpvbnRhbCwgc2FtZSB0aW1pbmdzICovCisJYWZiX20zLAkJCS8qIEZDUyBFbGl0ZTNELCAzIGZsb2F0IGNoaXBzICovCisJYWZiX202CQkJLyogRkNTIEVsaXRlM0QsIDYgZmxvYXQgY2hpcHMgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGZmYl9kZXZfcHJpdiB7CisJLyogTWlzYyBzb2Z0d2FyZSBzdGF0ZS4gKi8KKwlpbnQJCQlwcm9tX25vZGU7CisJZW51bSBmZmJfY2hpcF90eXBlCWZmYl90eXBlOworCXU2NAkJCWNhcmRfcGh5c19iYXNlOworCXN0cnVjdCBtaXNjZGV2aWNlIAltaXNjZGV2OworCisJLyogQ29udHJvbGxlciByZWdpc3RlcnMuICovCisJZmZiX2ZiY1B0cgkJcmVnczsKKworCS8qIENvbnRleHQgdGFibGUuICovCisJc3RydWN0IGZmYl9od19jb250ZXh0CSpod19zdGF0ZVtGRkJfTUFYX0NUWFNdOworfSBmZmJfZGV2X3ByaXZfdDsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmZiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGhpbnQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIGZmYl9zZXRfY29udGV4dF9pb2N0bHModm9pZCk7CitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBEUk0oaW9jdGxzKVtdOworCitleHRlcm4gaW50IGZmYl9kcml2ZXJfY29udGV4dF9zd2l0Y2goZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9jb250ZXh0LmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFiNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9jb250ZXh0LmgKQEAgLTAsMCArMSw0OTIgQEAKKy8qIGRybV9jb250ZXh0LmggLS0gSU9DVExzIGZvciBnZW5lcmljIGNvbnRleHRzIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogRnJpIE5vdiAyNCAxODozMTozNyAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogQ2hhbmdlTG9nOgorICogIDIwMDEtMTEtMTYJVG9yc3RlbiBEdXdlIDxkdXdlQGNhbGRlcmEuZGU+CisgKgkJYWRkZWQgY29udGV4dCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGhvb2tzLAorICoJCW5lZWRlZCBieSBTaVMgZHJpdmVyJ3MgbWVtb3J5IG1hbmFnZW1lbnQuCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT2xkLXN0eWxlIGNvbnRleHQgc3VwcG9ydCAtLSBvbmx5IHVzZWQgYnkgZ2FtbWEuICAKKyAqLworCisKKy8qIFRoZSBkcm1fcmVhZCBhbmQgZHJtX3dyaXRlX3N0cmluZyBjb2RlIChlc3BlY2lhbGx5IHRoYXQgd2hpY2ggbWFuYWdlcworICAgdGhlIGNpcmN1bGFyIGJ1ZmZlciksIGlzIGJhc2VkIG9uIEFsZXNzYW5kcm8gUnViaW5pJ3MgTElOVVggREVWSUNFCisgICBEUklWRVJTIChDYW1icmlkZ2U6IE8nUmVpbGx5LCAxOTk4KSwgcGFnZXMgMTExLTExMy4gKi8KKworc3NpemVfdCBnYW1tYV9mb3BzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmRldjsKKwlpbnQJICAgICAgbGVmdDsKKwlpbnQJICAgICAgYXZhaWw7CisJaW50CSAgICAgIHNlbmQ7CisJaW50CSAgICAgIGN1cjsKKworCURSTV9ERUJVRygiJXAsICVwXG4iLCBkZXYtPmJ1Zl9ycCwgZGV2LT5idWZfd3ApOworCisJd2hpbGUgKGRldi0+YnVmX3JwID09IGRldi0+YnVmX3dwKSB7CisJCURSTV9ERUJVRygiICBzbGVlcGluZ1xuIik7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGV2LT5idWZfcmVhZGVycyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJRFJNX0RFQlVHKCIgIGludGVycnVwdGVkXG4iKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwkJRFJNX0RFQlVHKCIgIGF3YWtlXG4iKTsKKwl9CisKKwlsZWZ0ICA9IChkZXYtPmJ1Zl9ycCArIERSTV9CU1ogLSBkZXYtPmJ1Zl93cCkgJSBEUk1fQlNaOworCWF2YWlsID0gRFJNX0JTWiAtIGxlZnQ7CisJc2VuZCAgPSBEUk1fTUlOKGF2YWlsLCBjb3VudCk7CisKKwl3aGlsZSAoc2VuZCkgeworCQlpZiAoZGV2LT5idWZfd3AgPiBkZXYtPmJ1Zl9ycCkgeworCQkJY3VyID0gRFJNX01JTihzZW5kLCBkZXYtPmJ1Zl93cCAtIGRldi0+YnVmX3JwKTsKKwkJfSBlbHNlIHsKKwkJCWN1ciA9IERSTV9NSU4oc2VuZCwgZGV2LT5idWZfZW5kIC0gZGV2LT5idWZfcnApOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkZXYtPmJ1Zl9ycCwgY3VyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlkZXYtPmJ1Zl9ycCArPSBjdXI7CisJCWlmIChkZXYtPmJ1Zl9ycCA9PSBkZXYtPmJ1Zl9lbmQpIGRldi0+YnVmX3JwID0gZGV2LT5idWY7CisJCXNlbmQgLT0gY3VyOworCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5idWZfd3JpdGVycyk7CisJcmV0dXJuIERSTV9NSU4oYXZhaWwsIGNvdW50KTsKK30KKworCisvKiBJbiBhbiBpbmNyZWRpYmx5IGNvbnZvbHV0ZWQgc2V0dXAsIHRoZSBrZXJuZWwgbW9kdWxlIGFjdHVhbGx5IGNhbGxzCisgKiBiYWNrIGludG8gdGhlIFggc2VydmVyIHRvIHBlcmZvcm0gY29udGV4dCBzd2l0Y2hlcyBvbiBiZWhhbGYgb2YgdGhlCisgKiAzZCBjbGllbnRzLgorICovCitpbnQgRFJNKHdyaXRlX3N0cmluZykoZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGxlZnQgICA9IChkZXYtPmJ1Zl9ycCArIERSTV9CU1ogLSBkZXYtPmJ1Zl93cCkgJSBEUk1fQlNaOworCWludCBzZW5kICAgPSBzdHJsZW4ocyk7CisJaW50IGNvdW50OworCisJRFJNX0RFQlVHKCIlZCBsZWZ0LCAlZCB0byBzZW5kICglcCwgJXApXG4iLAorCQkgIGxlZnQsIHNlbmQsIGRldi0+YnVmX3JwLCBkZXYtPmJ1Zl93cCk7CisKKwlpZiAobGVmdCA9PSAxIHx8IGRldi0+YnVmX3dwICE9IGRldi0+YnVmX3JwKSB7CisJCURSTV9FUlJPUigiQnVmZmVyIG5vdCBlbXB0eSAoJWQgbGVmdCwgd3AgPSAlcCwgcnAgPSAlcClcbiIsCisJCQkgIGxlZnQsCisJCQkgIGRldi0+YnVmX3dwLAorCQkJICBkZXYtPmJ1Zl9ycCk7CisJfQorCisJd2hpbGUgKHNlbmQpIHsKKwkJaWYgKGRldi0+YnVmX3dwID49IGRldi0+YnVmX3JwKSB7CisJCQljb3VudCA9IERSTV9NSU4oc2VuZCwgZGV2LT5idWZfZW5kIC0gZGV2LT5idWZfd3ApOworCQkJaWYgKGNvdW50ID09IGxlZnQpIC0tY291bnQ7IC8qIExlYXZlIGEgaG9sZSAqLworCQl9IGVsc2UgeworCQkJY291bnQgPSBEUk1fTUlOKHNlbmQsIGRldi0+YnVmX3JwIC0gZGV2LT5idWZfd3AgLSAxKTsKKwkJfQorCQlzdHJuY3B5KGRldi0+YnVmX3dwLCBzLCBjb3VudCk7CisJCWRldi0+YnVmX3dwICs9IGNvdW50OworCQlpZiAoZGV2LT5idWZfd3AgPT0gZGV2LT5idWZfZW5kKSBkZXYtPmJ1Zl93cCA9IGRldi0+YnVmOworCQlzZW5kIC09IGNvdW50OworCX0KKworCWlmIChkZXYtPmJ1Zl9hc3luYykga2lsbF9mYXN5bmMoJmRldi0+YnVmX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7CisKKwlEUk1fREVCVUcoIndha2luZ1xuIik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1Zl9yZWFkZXJzKTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGdhbW1hX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCWRybV9maWxlX3QgICAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiAgPSBwcml2LT5kZXY7CisKKwlwb2xsX3dhaXQoZmlscCwgJmRldi0+YnVmX3JlYWRlcnMsIHdhaXQpOworCWlmIChkZXYtPmJ1Zl93cCAhPSBkZXYtPmJ1Zl9ycCkgcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oY29udGV4dF9zd2l0Y2gpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3KQoreworCWNoYXIJICAgIGJ1Zls2NF07CisJZHJtX3F1ZXVlX3QgKnE7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5jb250ZXh0X2ZsYWcpKSB7CisJCURSTV9FUlJPUigiUmVlbnRlcmluZyAtLSBGSVhNRVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJRFJNX0RFQlVHKCJDb250ZXh0IHN3aXRjaCBmcm9tICVkIHRvICVkXG4iLCBvbGQsIG5ldyk7CisKKwlpZiAobmV3ID49IGRldi0+cXVldWVfY291bnQpIHsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZXcgPT0gZGV2LT5sYXN0X2NvbnRleHQpIHsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZyk7CisJCXJldHVybiAwOworCX0KKworCXEgPSBkZXYtPnF1ZXVlbGlzdFtuZXddOworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpID09IDEpIHsKKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoaXMgY2F1c2VzIHRoZSBYIHNlcnZlciB0byB3YWtlIHVwICYgZG8gYSBidW5jaCBvZiBoYXJkd2FyZQorCSAqIGludGVyYWN0aW9uIHRvIGFjdHVhbGx5IGVmZmVjdCB0aGUgY29udGV4dCBzd2l0Y2guCisJICovCisJc3ByaW50ZihidWYsICJDICVkICVkXG4iLCBvbGQsIG5ldyk7CisJRFJNKHdyaXRlX3N0cmluZykoZGV2LCBidWYpOworCisJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKworCXJldHVybiAwOworfQorCitpbnQgRFJNKGNvbnRleHRfc3dpdGNoX2NvbXBsZXRlKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldykKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OyAgLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCisJZGV2LT5sYXN0X3N3aXRjaCAgPSBqaWZmaWVzOworCisJaWYgKCFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpIHsKKwkJRFJNX0VSUk9SKCJMb2NrIGlzbid0IGhlbGQgYWZ0ZXIgY29udGV4dCBzd2l0Y2hcbiIpOworCX0KKworCWlmICghZG1hIHx8ICEoZG1hLT5uZXh0X2J1ZmZlciAmJiBkbWEtPm5leHRfYnVmZmVyLT53aGlsZV9sb2NrZWQpKSB7CisJCWlmIChEUk0obG9ja19mcmVlKShkZXYsICZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKKwkJCQkgIERSTV9LRVJORUxfQ09OVEVYVCkpIHsKKwkJCURSTV9FUlJPUigiQ2Fubm90IGZyZWUgbG9ja1xuIik7CisJCX0KKwl9CisKKwljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+Y29udGV4dF93YWl0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IERSTShpbml0X3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3F1ZXVlX3QgKnEsIGRybV9jdHhfdCAqY3R4KQoreworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSAhPSAxCisJICAgIHx8IGF0b21pY19yZWFkKCZxLT5maW5hbGl6YXRpb24pCisJICAgIHx8IGF0b21pY19yZWFkKCZxLT5ibG9ja19jb3VudCkpIHsKKwkJRFJNX0VSUk9SKCJOZXcgcXVldWUgaXMgYWxyZWFkeSBpbiB1c2U6IHUlZCBmJWQgYiVkXG4iLAorCQkJICBhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSwKKwkJCSAgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbiksCisJCQkgIGF0b21pY19yZWFkKCZxLT5ibG9ja19jb3VudCkpOworCX0KKworCWF0b21pY19zZXQoJnEtPmZpbmFsaXphdGlvbiwgIDApOworCWF0b21pY19zZXQoJnEtPmJsb2NrX2NvdW50LCAgIDApOworCWF0b21pY19zZXQoJnEtPmJsb2NrX3JlYWQsICAgIDApOworCWF0b21pY19zZXQoJnEtPmJsb2NrX3dyaXRlLCAgIDApOworCWF0b21pY19zZXQoJnEtPnRvdGFsX3F1ZXVlZCwgIDApOworCWF0b21pY19zZXQoJnEtPnRvdGFsX2ZsdXNoZWQsIDApOworCWF0b21pY19zZXQoJnEtPnRvdGFsX2xvY2tzLCAgIDApOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+d3JpdGVfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPnJlYWRfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPmZsdXNoX3F1ZXVlKTsKKworCXEtPmZsYWdzID0gY3R4LT5mbGFnczsKKworCURSTSh3YWl0bGlzdF9jcmVhdGUpKCZxLT53YWl0bGlzdCwgZGV2LT5kbWEtPmJ1Zl9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBkcm1fYWxsb2NfcXVldWU6CitQUkU6IDEpIGRldi0+cXVldWVsaXN0WzAuLmRldi0+cXVldWVfY291bnRdIGlzIGFsbG9jYXRlZCBhbmQgd2lsbCBub3QKKwlkaXNhcHBlYXIgKHNvIGFsbCBkZWFsbG9jYXRpb24gbXVzdCBiZSBkb25lIGFmdGVyIElPQ1RMcyBhcmUgb2ZmKQorICAgICAyKSBkZXYtPnF1ZXVlX2NvdW50IDwgZGV2LT5xdWV1ZV9zbG90cworICAgICAzKSBkZXYtPnF1ZXVlbGlzdFtpXS51c2VfY291bnQgPT0gMCBhbmQKKwlkZXYtPnF1ZXVlbGlzdFtpXS5maW5hbGl6YXRpb24gPT0gMCBpZiBpIG5vdCBpbiB1c2UKK1BPU1Q6IDEpIGRldi0+cXVldWVsaXN0W2ldLnVzZV9jb3VudCA9PSAxCisgICAgICAyKSBkZXYtPnF1ZXVlX2NvdW50IDwgZGV2LT5xdWV1ZV9zbG90cyAqLworCitzdGF0aWMgaW50IERSTShhbGxvY19xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYpCit7CisJaW50CSAgICBpOworCWRybV9xdWV1ZV90ICpxdWV1ZTsKKwlpbnQJICAgIG9sZHNsb3RzOworCWludAkgICAgbmV3c2xvdHM7CisJCQkJLyogQ2hlY2sgZm9yIGEgZnJlZSBxdWV1ZSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKKwkJYXRvbWljX2luYygmZGV2LT5xdWV1ZWxpc3RbaV0tPnVzZV9jb3VudCk7CisJCWlmIChhdG9taWNfcmVhZCgmZGV2LT5xdWV1ZWxpc3RbaV0tPnVzZV9jb3VudCkgPT0gMQorCQkgICAgJiYgIWF0b21pY19yZWFkKCZkZXYtPnF1ZXVlbGlzdFtpXS0+ZmluYWxpemF0aW9uKSkgeworCQkJRFJNX0RFQlVHKCIlZCAoZnJlZSlcbiIsIGkpOworCQkJcmV0dXJuIGk7CisJCX0KKwkJYXRvbWljX2RlYygmZGV2LT5xdWV1ZWxpc3RbaV0tPnVzZV9jb3VudCk7CisJfQorCQkJCS8qIEFsbG9jYXRlIGEgbmV3IHF1ZXVlICovCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCXF1ZXVlID0gRFJNKGFsbG9jKShzaXplb2YoKnF1ZXVlKSwgRFJNX01FTV9RVUVVRVMpOworCW1lbXNldChxdWV1ZSwgMCwgc2l6ZW9mKCpxdWV1ZSkpOworCWF0b21pY19zZXQoJnF1ZXVlLT51c2VfY291bnQsIDEpOworCisJKytkZXYtPnF1ZXVlX2NvdW50OworCWlmIChkZXYtPnF1ZXVlX2NvdW50ID49IGRldi0+cXVldWVfc2xvdHMpIHsKKwkJb2xkc2xvdHMgPSBkZXYtPnF1ZXVlX3Nsb3RzICogc2l6ZW9mKCpkZXYtPnF1ZXVlbGlzdCk7CisJCWlmICghZGV2LT5xdWV1ZV9zbG90cykgZGV2LT5xdWV1ZV9zbG90cyA9IDE7CisJCWRldi0+cXVldWVfc2xvdHMgKj0gMjsKKwkJbmV3c2xvdHMgPSBkZXYtPnF1ZXVlX3Nsb3RzICogc2l6ZW9mKCpkZXYtPnF1ZXVlbGlzdCk7CisKKwkJZGV2LT5xdWV1ZWxpc3QgPSBEUk0ocmVhbGxvYykoZGV2LT5xdWV1ZWxpc3QsCisJCQkJCSAgICAgIG9sZHNsb3RzLAorCQkJCQkgICAgICBuZXdzbG90cywKKwkJCQkJICAgICAgRFJNX01FTV9RVUVVRVMpOworCQlpZiAoIWRldi0+cXVldWVsaXN0KSB7CisJCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJCURSTV9ERUJVRygib3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlkZXYtPnF1ZXVlbGlzdFtkZXYtPnF1ZXVlX2NvdW50LTFdID0gcXVldWU7CisKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlEUk1fREVCVUcoIiVkIChuZXcpXG4iLCBkZXYtPnF1ZXVlX2NvdW50IC0gMSk7CisJcmV0dXJuIGRldi0+cXVldWVfY291bnQgLSAxOworfQorCitpbnQgRFJNKHJlc2N0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfcmVzX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfcmVzX3QJcmVzOworCWRybV9jdHhfdAljdHg7CisJaW50CQlpOworCisJRFJNX0RFQlVHKCIlZFxuIiwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgYXJncCwgc2l6ZW9mKHJlcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocmVzLmNvdW50ID49IERSTV9SRVNFUlZFRF9DT05URVhUUykgeworCQltZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOworCQlmb3IgKGkgPSAwOyBpIDwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTOyBpKyspIHsKKwkJCWN0eC5oYW5kbGUgPSBpOworCQkJaWYgKGNvcHlfdG9fdXNlcigmcmVzLmNvbnRleHRzW2ldLAorCQkJCQkgJmksCisJCQkJCSBzaXplb2YoaSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJlcy5jb3VudCA9IERSTV9SRVNFUlZFRF9DT05URVhUUzsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXMsIHNpemVvZihyZXMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oYWRkY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9jdHhfdAlfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKGN0eC5oYW5kbGUgPSBEUk0oYWxsb2NfcXVldWUpKGRldikpID09IERSTV9LRVJORUxfQ09OVEVYVCkgeworCQkJCS8qIEluaXQga2VybmVsJ3MgY29udGV4dCBhbmQgZ2V0IGEgbmV3IG9uZS4gKi8KKwkJRFJNKGluaXRfcXVldWUpKGRldiwgZGV2LT5xdWV1ZWxpc3RbY3R4LmhhbmRsZV0sICZjdHgpOworCQljdHguaGFuZGxlID0gRFJNKGFsbG9jX3F1ZXVlKShkZXYpOworCX0KKwlEUk0oaW5pdF9xdWV1ZSkoZGV2LCBkZXYtPnF1ZXVlbGlzdFtjdHguaGFuZGxlXSwgJmN0eCk7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY3R4LCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgRFJNKG1vZGN0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CWN0eDsKKwlkcm1fcXVldWVfdAkqcTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWYgKGN0eC5oYW5kbGUgPCAwIHx8IGN0eC5oYW5kbGUgPj0gZGV2LT5xdWV1ZV9jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisJcSA9IGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgeworCQkJCS8qIE5vIGxvbmdlciBpbiB1c2UgKi8KKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKERSTV9CVUZDT1VOVCgmcS0+d2FpdGxpc3QpKSB7CisJCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcS0+ZmxhZ3MgPSBjdHguZmxhZ3M7CisKKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCXJldHVybiAwOworfQorCitpbnQgRFJNKGdldGN0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CV9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9xdWV1ZV90CSpxOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIGFyZ3AsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKKworCWlmIChjdHguaGFuZGxlID49IGRldi0+cXVldWVfY291bnQpIHJldHVybiAtRUlOVkFMOworCXEgPSBkZXYtPnF1ZXVlbGlzdFtjdHguaGFuZGxlXTsKKworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpID09IDEpIHsKKwkJCQkvKiBObyBsb25nZXIgaW4gdXNlICovCisJCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0eC5mbGFncyA9IHEtPmZsYWdzOworCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZjdHgsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IERSTShzd2l0Y2hjdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfdAljdHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJcmV0dXJuIERSTShjb250ZXh0X3N3aXRjaCkoZGV2LCBkZXYtPmxhc3RfY29udGV4dCwgY3R4LmhhbmRsZSk7Cit9CisKK2ludCBEUk0obmV3Y3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCURSTShjb250ZXh0X3N3aXRjaF9jb21wbGV0ZSkoZGV2LCBjdHguaGFuZGxlKTsKKworCXJldHVybiAwOworfQorCitpbnQgRFJNKHJtY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9xdWV1ZV90CSpxOworCWRybV9idWZfdAkqYnVmOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWYgKGN0eC5oYW5kbGUgPj0gZGV2LT5xdWV1ZV9jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisJcSA9IGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgeworCQkJCS8qIE5vIGxvbmdlciBpbiB1c2UgKi8KKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXRvbWljX2luYygmcS0+ZmluYWxpemF0aW9uKTsgLyogTWFyayBxdWV1ZSBpbiBmaW5hbGl6YXRpb24gc3RhdGUgKi8KKwlhdG9taWNfc3ViKDIsICZxLT51c2VfY291bnQpOyAvKiBNYXJrIHF1ZXVlIGFzIHVudXNlZCAocGVuZGluZworCQkJCQkgZmluYWxpemF0aW9uKSAqLworCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpKSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJY2xlYXJfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwl9CisJCQkJLyogUmVtb3ZlIHF1ZXVlZCBidWZmZXJzICovCisJd2hpbGUgKChidWYgPSBEUk0od2FpdGxpc3RfZ2V0KSgmcS0+d2FpdGxpc3QpKSkgeworCQlEUk0oZnJlZV9idWZmZXIpKGRldiwgYnVmKTsKKwl9CisJY2xlYXJfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKTsKKworCQkJCS8qIFdha2V1cCBibG9ja2VkIHByb2Nlc3NlcyAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcS0+cmVhZF9xdWV1ZSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT53cml0ZV9xdWV1ZSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT5mbHVzaF9xdWV1ZSk7CisKKwkJCQkvKiBGaW5hbGl6YXRpb24gb3Zlci4gIFF1ZXVlIGlzIG1hZGUKKwkJCQkgICBhdmFpbGFibGUgd2hlbiBib3RoIHVzZV9jb3VudCBhbmQKKwkJCQkgICBmaW5hbGl6YXRpb24gYmVjb21lIDAsIHdoaWNoIHdvbid0CisJCQkJICAgaGFwcGVuIHVudGlsIGFsbCB0aGUgd2FpdGluZyBwcm9jZXNzZXMKKwkJCQkgICBzdG9wIHdhaXRpbmcuICovCisJYXRvbWljX2RlYygmcS0+ZmluYWxpemF0aW9uKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4NmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZG1hLmMKQEAgLTAsMCArMSw5NDYgQEAKKy8qIGdhbW1hX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciBHTVggMjAwMCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IEZyaSBNYXIgMTkgMTQ6MzA6MTYgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImdhbW1hLmgiCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImdhbW1hX2RybS5oIgorI2luY2x1ZGUgImdhbW1hX2Rydi5oIgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2FtbWFfZG1hX2Rpc3BhdGNoKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwltYigpOworCXdoaWxlICggR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKQorCQljcHVfcmVsYXgoKTsKKworCUdBTU1BX1dSSVRFKEdBTU1BX0RNQUFERFJFU1MsIGFkZHJlc3MpOworCisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfR0NPTU1BTkRTVEFUVVMpICE9IDQpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfRE1BQ09VTlQsIGxlbmd0aCAvIDQpOworfQorCit2b2lkIGdhbW1hX2RtYV9xdWllc2NlbnRfc2luZ2xlKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQorCQljcHVfcmVsYXgoKTsKKworCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDIpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfRklMVEVSTU9ERSwgMSA8PCAxMCk7CisJR0FNTUFfV1JJVEUoR0FNTUFfU1lOQywgMCk7CisKKwlkbyB7CisJCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMpKQorCQkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9PVVRQVVRGSUZPKSAhPSBHQU1NQV9TWU5DX1RBRyk7Cit9CisKK3ZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQorCQljcHVfcmVsYXgoKTsKKworCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfQlJPQURDQVNUTUFTSywgMyk7CisJR0FNTUFfV1JJVEUoR0FNTUFfRklMVEVSTU9ERSwgMSA8PCAxMCk7CisJR0FNTUFfV1JJVEUoR0FNTUFfU1lOQywgMCk7CisKKwkvKiBSZWFkIGZyb20gZmlyc3QgTVggKi8KKwlkbyB7CisJCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMpKQorCQkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9PVVRQVVRGSUZPKSAhPSBHQU1NQV9TWU5DX1RBRyk7CisKKwkvKiBSZWFkIGZyb20gc2Vjb25kIE1YICovCisJZG8geworCQl3aGlsZSAoIUdBTU1BX1JFQUQoR0FNTUFfT1VURklGT1dPUkRTICsgMHgxMDAwMCkpCisJCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX09VVFBVVEZJRk8gKyAweDEwMDAwKSAhPSBHQU1NQV9TWU5DX1RBRyk7Cit9CisKK3ZvaWQgZ2FtbWFfZG1hX3JlYWR5KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2FtbWFfZG1hX2lzX3JlYWR5KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuICghR0FNTUFfUkVBRChHQU1NQV9ETUFDT1VOVCkpOworfQorCitpcnFyZXR1cm5fdCBnYW1tYV9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90CSAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWFyZzsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCQkJKGRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJLyogRklYTUU6IHNob3VsZCBjaGVjayB3aGV0aGVyIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGludGVycnVwdD8gKi8KKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1s2XSk7IC8qIF9EUk1fU1RBVF9JUlEgKi8KKworCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfR0RFTEFZVElNRVIsIDB4YzM1MC8yKTsgLyogMHgwNVMgKi8KKwlHQU1NQV9XUklURShHQU1NQV9HQ09NTUFORElOVEZMQUdTLCA4KTsKKwlHQU1NQV9XUklURShHQU1NQV9HSU5URkxBR1MsIDB4MjAwMSk7CisJaWYgKGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSB7CisJCQkJLyogRnJlZSBwcmV2aW91cyBidWZmZXIgKi8KKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQlpZiAoZG1hLT50aGlzX2J1ZmZlcikgeworCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBkbWEtPnRoaXNfYnVmZmVyKTsKKwkJCWRtYS0+dGhpc19idWZmZXIgPSBOVUxMOworCQl9CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisKKwkJLyogRGlzcGF0Y2ggbmV3IGJ1ZmZlciAqLworCQlzY2hlZHVsZV93b3JrKCZkZXYtPndvcmspOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIE9ubHkgY2FsbGVkIGJ5IGdhbW1hX2RtYV9zY2hlZHVsZS4gKi8KK3N0YXRpYyBpbnQgZ2FtbWFfZG9fZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbG9ja2VkKQoreworCXVuc2lnbmVkIGxvbmcJIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZwkgbGVuZ3RoOworCWRybV9idWZfdAkgKmJ1ZjsKKwlpbnQJCSByZXRjb2RlID0gMDsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmRtYV9mbGFnKSkgcmV0dXJuIC1FQlVTWTsKKworCisJaWYgKCFkbWEtPm5leHRfYnVmZmVyKSB7CisJCURSTV9FUlJPUigiTm8gbmV4dF9idWZmZXJcbiIpOworCQljbGVhcl9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidWYJPSBkbWEtPm5leHRfYnVmZmVyOworCS8qIFdFIE5PVyBBUkUgT04gTE9HSUNBTCBQQUdFUyEhIC0gdXNpbmcgcGFnZSB0YWJsZSBzZXR1cCBpbiBkbWFfaW5pdCAqLworCS8qIFNvIHdlIHBhc3MgdGhlIGJ1ZmZlciBpbmRleCB2YWx1ZSBpbnRvIHRoZSBwaHlzaWNhbCBwYWdlIG9mZnNldCAqLworCWFkZHJlc3MgPSBidWYtPmlkeCA8PCAxMjsKKwlsZW5ndGgJPSBidWYtPnVzZWQ7CisKKwlEUk1fREVCVUcoImNvbnRleHQgJWQsIGJ1ZmZlciAlZCAoJWxkIGJ5dGVzKVxuIiwKKwkJICBidWYtPmNvbnRleHQsIGJ1Zi0+aWR4LCBsZW5ndGgpOworCisJaWYgKGJ1Zi0+bGlzdCA9PSBEUk1fTElTVF9SRUNMQUlNKSB7CisJCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7CisJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgYnVmKTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsZW5ndGgpIHsKKwkJRFJNX0VSUk9SKCIwIGxlbmd0aCBidWZmZXJcbiIpOworCQlnYW1tYV9jbGVhcl9uZXh0X2J1ZmZlcihkZXYpOworCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGJ1Zik7CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZ2FtbWFfZG1hX2lzX3JlYWR5KGRldikpIHsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoYnVmLT53aGlsZV9sb2NrZWQpIHsKKwkJaWYgKCFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpIHsKKwkJCURSTV9FUlJPUigiRGlzcGF0Y2hpbmcgYnVmZmVyICVkIGZyb20gcGlkICVkIgorCQkJCSAgIiBcIndoaWxlIGxvY2tlZFwiLCBidXQgbm8gbG9jayBoZWxkXG4iLAorCQkJCSAgYnVmLT5pZHgsIGN1cnJlbnQtPnBpZCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWxvY2tlZCAmJiAhZ2FtbWFfbG9ja190YWtlKCZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKKwkJCQkJICAgICAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0CisJICAgICYmICEoZGV2LT5xdWV1ZWxpc3RbYnVmLT5jb250ZXh0XS0+ZmxhZ3MKKwkJICYgX0RSTV9DT05URVhUX1BSRVNFUlZFRCkpIHsKKwkJCQkvKiBQUkU6IGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCAqLworCQlpZiAoRFJNKGNvbnRleHRfc3dpdGNoKShkZXYsIGRldi0+bGFzdF9jb250ZXh0LAorCQkJCQlidWYtPmNvbnRleHQpKSB7CisJCQlEUk0oY2xlYXJfbmV4dF9idWZmZXIpKGRldik7CisJCQlEUk0oZnJlZV9idWZmZXIpKGRldiwgYnVmKTsKKwkJfQorCQlyZXRjb2RlID0gLUVCVVNZOworCQlnb3RvIGNsZWFudXA7CisKKwkJCQkvKiBQT1NUOiB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBjb250ZXh0CisJCQkJICAgc3dpdGNoIGFuZCB3aWxsIGRpc3BhdGNoIG9uIGEgbGF0ZXIgY2FsbAorCQkJCSAgIHdoZW4gZGV2LT5sYXN0X2NvbnRleHQgPT0gYnVmLT5jb250ZXh0LgorCQkJCSAgIE5PVEUgV0UgSE9MRCBUSEUgTE9DSyBUSFJPVUdIT1VUIFRISVMKKwkJCQkgICBUSU1FISAqLworCX0KKworCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7CisJYnVmLT5wZW5kaW5nCSA9IDE7CisJYnVmLT53YWl0aW5nCSA9IDA7CisJYnVmLT5saXN0CSA9IERSTV9MSVNUX1BFTkQ7CisKKwkvKiBXRSBOT1cgQVJFIE9OIExPR0lDQUwgUEFHRVMhISEgLSBvdmVycmlkaW5nIGFkZHJlc3MgKi8KKwlhZGRyZXNzID0gYnVmLT5pZHggPDwgMTI7CisKKwlnYW1tYV9kbWFfZGlzcGF0Y2goZGV2LCBhZGRyZXNzLCBsZW5ndGgpOworCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgZG1hLT50aGlzX2J1ZmZlcik7CisJZG1hLT50aGlzX2J1ZmZlciA9IGJ1ZjsKKworCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzddKTsgLyogX0RSTV9TVEFUX0RNQSAqLworCWF0b21pY19hZGQobGVuZ3RoLCAmZGV2LT5jb3VudHNbOF0pOyAvKiBfRFJNX1NUQVRfUFJJTUFSWSAqLworCisJaWYgKCFidWYtPndoaWxlX2xvY2tlZCAmJiAhZGV2LT5jb250ZXh0X2ZsYWcgJiYgIWxvY2tlZCkgeworCQlpZiAoZ2FtbWFfbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJRFJNX0VSUk9SKCJcbiIpOworCQl9CisJfQorY2xlYW51cDoKKworCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgdm9pZCBnYW1tYV9kbWFfdGltZXJfYmgodW5zaWduZWQgbG9uZyBkZXYpCit7CisJZ2FtbWFfZG1hX3NjaGVkdWxlKChkcm1fZGV2aWNlX3QgKilkZXYsIDApOworfQorCit2b2lkIGdhbW1hX2lycV9pbW1lZGlhdGVfYmgodm9pZCAqZGV2KQoreworCWdhbW1hX2RtYV9zY2hlZHVsZShkZXYsIDApOworfQorCitpbnQgZ2FtbWFfZG1hX3NjaGVkdWxlKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbG9ja2VkKQoreworCWludAkJIG5leHQ7CisJZHJtX3F1ZXVlX3QJICpxOworCWRybV9idWZfdAkgKmJ1ZjsKKwlpbnQJCSByZXRjb2RlICAgPSAwOworCWludAkJIHByb2Nlc3NlZCA9IDA7CisJaW50CQkgbWlzc2VkOworCWludAkJIGV4cGlyZQkgICA9IDIwOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYQkgICA9IGRldi0+ZG1hOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpKSB7CisJCQkJLyogTm90IHJlZW50cmFudCAqLworCQlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1sxMF0pOyAvKiBfRFJNX1NUQVRfTUlTU0VEICovCisJCXJldHVybiAtRUJVU1k7CisJfQorCW1pc3NlZCA9IGF0b21pY19yZWFkKCZkZXYtPmNvdW50c1sxMF0pOworCisKK2FnYWluOgorCWlmIChkZXYtPmNvbnRleHRfZmxhZykgeworCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoZG1hLT5uZXh0X2J1ZmZlcikgeworCQkJCS8qIFVuc2VudCBidWZmZXIgdGhhdCB3YXMgcHJldmlvdXNseQorCQkJCSAgIHNlbGVjdGVkLCBidXQgdGhhdCBjb3VsZG4ndCBiZSBzZW50CisJCQkJICAgYmVjYXVzZSB0aGUgbG9jayBjb3VsZCBub3QgYmUgb2J0YWluZWQKKwkJCQkgICBvciB0aGUgRE1BIGVuZ2luZSB3YXNuJ3QgcmVhZHkuICBUcnkKKwkJCQkgICBhZ2Fpbi4gKi8KKwkJaWYgKCEocmV0Y29kZSA9IGdhbW1hX2RvX2RtYShkZXYsIGxvY2tlZCkpKSArK3Byb2Nlc3NlZDsKKwl9IGVsc2UgeworCQlkbyB7CisJCQluZXh0ID0gZ2FtbWFfc2VsZWN0X3F1ZXVlKGRldiwgZ2FtbWFfZG1hX3RpbWVyX2JoKTsKKwkJCWlmIChuZXh0ID49IDApIHsKKwkJCQlxICAgPSBkZXYtPnF1ZXVlbGlzdFtuZXh0XTsKKwkJCQlidWYgPSBnYW1tYV93YWl0bGlzdF9nZXQoJnEtPndhaXRsaXN0KTsKKwkJCQlkbWEtPm5leHRfYnVmZmVyID0gYnVmOworCQkJCWRtYS0+bmV4dF9xdWV1ZQkgPSBxOworCQkJCWlmIChidWYgJiYgYnVmLT5saXN0ID09IERSTV9MSVNUX1JFQ0xBSU0pIHsKKwkJCQkJZ2FtbWFfY2xlYXJfbmV4dF9idWZmZXIoZGV2KTsKKwkJCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBidWYpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAobmV4dCA+PSAwICYmICFkbWEtPm5leHRfYnVmZmVyKTsKKwkJaWYgKGRtYS0+bmV4dF9idWZmZXIpIHsKKwkJCWlmICghKHJldGNvZGUgPSBnYW1tYV9kb19kbWEoZGV2LCBsb2NrZWQpKSkgeworCQkJCSsrcHJvY2Vzc2VkOworCQkJfQorCQl9CisJfQorCisJaWYgKC0tZXhwaXJlKSB7CisJCWlmIChtaXNzZWQgIT0gYXRvbWljX3JlYWQoJmRldi0+Y291bnRzWzEwXSkpIHsKKwkJCWlmIChnYW1tYV9kbWFfaXNfcmVhZHkoZGV2KSkgZ290byBhZ2FpbjsKKwkJfQorCQlpZiAocHJvY2Vzc2VkICYmIGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSB7CisJCQlwcm9jZXNzZWQgPSAwOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBnYW1tYV9kbWFfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbHAsIAorCQkJICAgICAgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCkKK3sKKwl1bnNpZ25lZCBsb25nCSAgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nCSAgbGVuZ3RoOworCWludAkJICBtdXN0X2ZyZWUgPSAwOworCWludAkJICByZXRjb2RlICAgPSAwOworCWludAkJICBpOworCWludAkJICBpZHg7CisJZHJtX2J1Zl90CSAgKmJ1ZjsKKwlkcm1fYnVmX3QJICAqbGFzdF9idWYgPSBOVUxMOworCWRybV9kZXZpY2VfZG1hX3QgICpkbWEJICAgID0gZGV2LT5kbWE7CisJaW50CQkgICpzZW5kX2luZGljZXMgPSBOVUxMOworCWludAkJICAqc2VuZF9zaXplcyA9IE5VTEw7CisKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisKKwkJCQkvKiBUdXJuIG9mZiBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZykpIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSByZXR1cm4gLUVJTlRSOworCX0KKwlpZiAoIShkLT5mbGFncyAmIF9EUk1fRE1BX1dISUxFX0xPQ0tFRCkpIHsKKwkJd2hpbGUgKCFnYW1tYV9sb2NrX3Rha2UoJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgICAgIERSTV9LRVJORUxfQ09OVEVYVCkpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCX0KKwkJKyttdXN0X2ZyZWU7CisJfQorCisJc2VuZF9pbmRpY2VzID0gRFJNKGFsbG9jKShkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX2luZGljZXMpLAorCQkJCSAgRFJNX01FTV9EUklWRVIpOworCWlmIChzZW5kX2luZGljZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKHNlbmRfaW5kaWNlcywgZC0+c2VuZF9pbmRpY2VzLCAKKwkJCSAgIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfaW5kaWNlcykpKSB7CisJCXJldGNvZGUgPSAtRUZBVUxUOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKwl9CisJCisJc2VuZF9zaXplcyA9IERSTShhbGxvYykoZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcyksCisJCQkJRFJNX01FTV9EUklWRVIpOworCWlmIChzZW5kX3NpemVzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihzZW5kX3NpemVzLCBkLT5zZW5kX3NpemVzLCAKKwkJCSAgIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfc2l6ZXMpKSkgeworCQlyZXRjb2RlID0gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGQtPnNlbmRfY291bnQ7IGkrKykgeworCQlpZHggPSBzZW5kX2luZGljZXNbaV07CisJCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgeworCQkJRFJNX0VSUk9SKCJJbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkgIHNlbmRfaW5kaWNlc1tpXSwgZG1hLT5idWZfY291bnQgLSAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFsgaWR4IF07CisJCWlmIChidWYtPmZpbHAgIT0gZmlscCkgeworCQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBub3Qgb3duZWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQpOworCQkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKGJ1Zi0+bGlzdCAhPSBEUk1fTElTVF9OT05FKSB7CisJCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG9uIGxpc3QgJWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQsIGJ1Zi0+bGlzdCk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQkJCS8qIFRoaXMgaXNuJ3QgYSByYWNlIGNvbmRpdGlvbiBvbgorCQkJCSAgIGJ1Zi0+bGlzdCwgc2luY2Ugb3VyIGNvbmNlcm4gaXMgdGhlCisJCQkJICAgYnVmZmVyIHJlY2xhaW0gZHVyaW5nIHRoZSB0aW1lIHRoZQorCQkJCSAgIHByb2Nlc3MgY2xvc2VzIHRoZSAvZGV2L2RybT8gaGFuZGxlLCBzbworCQkJCSAgIGl0IGNhbid0IGFsc28gYmUgZG9pbmcgRE1BLiAqLworCQlidWYtPmxpc3QJICA9IERSTV9MSVNUX1BSSU87CisJCWJ1Zi0+dXNlZAkgID0gc2VuZF9zaXplc1tpXTsKKwkJYnVmLT5jb250ZXh0CSAgPSBkLT5jb250ZXh0OworCQlidWYtPndoaWxlX2xvY2tlZCA9IGQtPmZsYWdzICYgX0RSTV9ETUFfV0hJTEVfTE9DS0VEOworCQlhZGRyZXNzCQkgID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5hZGRyZXNzOworCQlsZW5ndGgJCSAgPSBidWYtPnVzZWQ7CisJCWlmICghbGVuZ3RoKSB7CisJCQlEUk1fRVJST1IoIjAgbGVuZ3RoIGJ1ZmZlclxuIik7CisJCX0KKwkJaWYgKGJ1Zi0+cGVuZGluZykgeworCQkJRFJNX0VSUk9SKCJTZW5kaW5nIHBlbmRpbmcgYnVmZmVyOiIKKwkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCisJCQkJICBzZW5kX2luZGljZXNbaV0sIGkpOworCQkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKGJ1Zi0+d2FpdGluZykgeworCQkJRFJNX0VSUk9SKCJTZW5kaW5nIHdhaXRpbmcgYnVmZmVyOiIKKwkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCisJCQkJICBzZW5kX2luZGljZXNbaV0sIGkpOworCQkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJYnVmLT5wZW5kaW5nID0gMTsKKworCQlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0CisJCSAgICAmJiAhKGRldi0+cXVldWVsaXN0W2J1Zi0+Y29udGV4dF0tPmZsYWdzCisJCQkgJiBfRFJNX0NPTlRFWFRfUFJFU0VSVkVEKSkgeworCQkJYWRkX3dhaXRfcXVldWUoJmRldi0+Y29udGV4dF93YWl0LCAmZW50cnkpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQkJLyogUFJFOiBkZXYtPmxhc3RfY29udGV4dCAhPSBidWYtPmNvbnRleHQgKi8KKwkJCURSTShjb250ZXh0X3N3aXRjaCkoZGV2LCBkZXYtPmxhc3RfY29udGV4dCwKKwkJCQkJICAgIGJ1Zi0+Y29udGV4dCk7CisJCQkJLyogUE9TVDogd2Ugd2lsbCB3YWl0IGZvciB0aGUgY29udGV4dAorCQkJCSAgIHN3aXRjaCBhbmQgd2lsbCBkaXNwYXRjaCBvbiBhIGxhdGVyIGNhbGwKKwkJCQkgICB3aGVuIGRldi0+bGFzdF9jb250ZXh0ID09IGJ1Zi0+Y29udGV4dC4KKwkJCQkgICBOT1RFIFdFIEhPTEQgVEhFIExPQ0sgVEhST1VHSE9VVCBUSElTCisJCQkJICAgVElNRSEgKi8KKwkJCXNjaGVkdWxlKCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPmNvbnRleHRfd2FpdCwgJmVudHJ5KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldGNvZGUgPSAtRUlOVFI7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJaWYgKGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCkgeworCQkJCURSTV9FUlJPUigiQ29udGV4dCBtaXNtYXRjaDogJWQgJWRcbiIsCisJCQkJCSAgZGV2LT5sYXN0X2NvbnRleHQsCisJCQkJCSAgYnVmLT5jb250ZXh0KTsKKwkJCX0KKwkJfQorCisJCWdhbW1hX2RtYV9kaXNwYXRjaChkZXYsIGFkZHJlc3MsIGxlbmd0aCk7CisJCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzldKTsgLyogX0RSTV9TVEFUX1NQRUNJQUwgKi8KKwkJYXRvbWljX2FkZChsZW5ndGgsICZkZXYtPmNvdW50c1s4XSk7IC8qIF9EUk1fU1RBVF9QUklNQVJZICovCisKKwkJaWYgKGxhc3RfYnVmKSB7CisJCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGxhc3RfYnVmKTsKKwkJfQorCQlsYXN0X2J1ZiA9IGJ1ZjsKKwl9CisKKworY2xlYW51cDoKKwlpZiAobGFzdF9idWYpIHsKKwkJZ2FtbWFfZG1hX3JlYWR5KGRldik7CisJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOworCX0KKwlpZiAoc2VuZF9pbmRpY2VzKQorCQlEUk0oZnJlZSkoc2VuZF9pbmRpY2VzLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX2luZGljZXMpLCAKKwkJCSAgRFJNX01FTV9EUklWRVIpOworCWlmIChzZW5kX3NpemVzKQorCQlEUk0oZnJlZSkoc2VuZF9zaXplcywgZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcyksIAorCQkJICBEUk1fTUVNX0RSSVZFUik7CisKKwlpZiAobXVzdF9mcmVlICYmICFkZXYtPmNvbnRleHRfZmxhZykgeworCQlpZiAoZ2FtbWFfbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJRFJNX0VSUk9SKCJcbiIpOworCQl9CisJfQorCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgZ2FtbWFfZG1hX3NlbmRfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCWRybV9idWZfdAkgICpsYXN0X2J1ZiA9IE5VTEw7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYQkgICAgPSBkZXYtPmRtYTsKKwlpbnQgICAgICAgICAgICAgICBzZW5kX2luZGV4OworCisJaWYgKGdldF91c2VyKHNlbmRfaW5kZXgsICZkLT5zZW5kX2luZGljZXNbZC0+c2VuZF9jb3VudC0xXSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGQtPmZsYWdzICYgX0RSTV9ETUFfQkxPQ0spIHsKKwkJbGFzdF9idWYgPSBkbWEtPmJ1Zmxpc3Rbc2VuZF9pbmRleF07CisJCWFkZF93YWl0X3F1ZXVlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQsICZlbnRyeSk7CisJfQorCisJaWYgKChyZXRjb2RlID0gZ2FtbWFfZG1hX2VucXVldWUoZmlscCwgZCkpKSB7CisJCWlmIChkLT5mbGFncyAmIF9EUk1fRE1BX0JMT0NLKQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmxhc3RfYnVmLT5kbWFfd2FpdCwgJmVudHJ5KTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorCisJZ2FtbWFfZG1hX3NjaGVkdWxlKGRldiwgMCk7CisKKwlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9CTE9DSykgeworCQlEUk1fREVCVUcoIiVkIHdhaXRpbmdcbiIsIGN1cnJlbnQtPnBpZCk7CisJCWZvciAoOzspIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJaWYgKCFsYXN0X2J1Zi0+d2FpdGluZyAmJiAhbGFzdF9idWYtPnBlbmRpbmcpCisJCQkJYnJlYWs7IC8qIGZpbmlzaGVkICovCisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0Y29kZSA9IC1FSU5UUjsgLyogQ2FuJ3QgcmVzdGFydCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlEUk1fREVCVUcoIiVkIHJ1bm5pbmdcbiIsIGN1cnJlbnQtPnBpZCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQsICZlbnRyeSk7CisJCWlmICghcmV0Y29kZQorCQkgICAgfHwgKGxhc3RfYnVmLT5saXN0PT1EUk1fTElTVF9QRU5EICYmICFsYXN0X2J1Zi0+cGVuZGluZykpIHsKKwkJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmbGFzdF9idWYtPmRtYV93YWl0KSkgeworCQkJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOworCQkJfQorCQl9CisJCWlmIChyZXRjb2RlKSB7CisJCQlEUk1fRVJST1IoImN0eCVkIHclZCBwJWQgYyVsZCBpJWQgbCVkIHBpZDolZFxuIiwKKwkJCQkgIGQtPmNvbnRleHQsCisJCQkJICBsYXN0X2J1Zi0+d2FpdGluZywKKwkJCQkgIGxhc3RfYnVmLT5wZW5kaW5nLAorCQkJCSAgKGxvbmcpRFJNX1dBSVRDT1VOVChkZXYsIGQtPmNvbnRleHQpLAorCQkJCSAgbGFzdF9idWYtPmlkeCwKKwkJCQkgIGxhc3RfYnVmLT5saXN0LAorCQkJCSAgY3VycmVudC0+cGlkKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0Y29kZTsKK30KKworaW50IGdhbW1hX2RtYShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgICpkbWEJICAgID0gZGV2LT5kbWE7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJZHJtX2RtYV90CSAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9kbWFfdAkgIGQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmQsIGFyZ3AsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGQuc2VuZF9jb3VudCA8IDAgfHwgZC5zZW5kX2NvdW50ID4gZG1hLT5idWZfY291bnQpIHsKKwkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgIGN1cnJlbnQtPnBpZCwgZC5zZW5kX2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50KSB7CisJCURSTV9FUlJPUigiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgIGN1cnJlbnQtPnBpZCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkLnNlbmRfY291bnQpIHsKKwkJaWYgKGQuZmxhZ3MgJiBfRFJNX0RNQV9QUklPUklUWSkKKwkJCXJldGNvZGUgPSBnYW1tYV9kbWFfcHJpb3JpdHkoZmlscCwgZGV2LCAmZCk7CisJCWVsc2UKKwkJCXJldGNvZGUgPSBnYW1tYV9kbWFfc2VuZF9idWZmZXJzKGZpbHAsIGRldiwgJmQpOworCX0KKworCWQuZ3JhbnRlZF9jb3VudCA9IDA7CisKKwlpZiAoIXJldGNvZGUgJiYgZC5yZXF1ZXN0X2NvdW50KSB7CisJCXJldGNvZGUgPSBnYW1tYV9kbWFfZ2V0X2J1ZmZlcnMoZmlscCwgJmQpOworCX0KKworCURSTV9ERUJVRygiJWQgcmV0dXJuaW5nLCBncmFudGVkID0gJWRcbiIsCisJCSAgY3VycmVudC0+cGlkLCBkLmdyYW50ZWRfY291bnQpOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmQsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBpbml0aWFsaXphdGlvbiwgY2xlYW51cAorICovCisKK3N0YXRpYyBpbnQgZ2FtbWFfZG9faW5pdF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZ2FtbWFfaW5pdF90ICppbml0ICkKK3sKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICAgICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QJICAgICpidWY7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAgICAqbGlzdDsKKwl1bnNpZ25lZCBsb25nCSAgICAqcGd0OworCisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZGV2X3ByaXYgPSBEUk0oYWxsb2MpKCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCksCisJCQkJCQkJRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoICFkZXZfcHJpdiApCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKwltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCkgKTsKKworCWRldl9wcml2LT5udW1fcmFzdCA9IGluaXQtPm51bV9yYXN0OworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJaWYoIHJfbGlzdC0+bWFwICYmCisJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgorCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgeworCQkJZGV2X3ByaXYtPnNhcmVhID0gcl9saXN0LT5tYXA7CisgCQkJYnJlYWs7CisgCQl9CisgCX0KKwkKKwlkZXZfcHJpdi0+bW1pbzAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzApOworCWRldl9wcml2LT5tbWlvMSA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvMSk7CisJZGV2X3ByaXYtPm1taW8yID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW8yKTsKKwlkZXZfcHJpdi0+bW1pbzMgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzMpOworCQorCWRldl9wcml2LT5zYXJlYV9wcml2ID0gKGRybV9nYW1tYV9zYXJlYV90ICopCisJCSgodTggKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZSArCisJCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKwlpZiAoaW5pdC0+cGNpbW9kZSkgeworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbR0xJTlRfRFJJX0JVRl9DT1VOVF07CisJCXBndCA9IGJ1Zi0+YWRkcmVzczsKKworIAkJZm9yIChpID0gMDsgaSA8IEdMSU5UX0RSSV9CVUZfQ09VTlQ7IGkrKykgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJKnBndCA9IHZpcnRfdG9fcGh5cygodm9pZCopYnVmLT5hZGRyZXNzKSB8IDB4MDc7CisJCQlwZ3QrKzsKKwkJfQorCisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKKwl9IGVsc2UgeworCQlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKKworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbR0xJTlRfRFJJX0JVRl9DT1VOVF07CisJCXBndCA9IGJ1Zi0+YWRkcmVzczsKKworIAkJZm9yIChpID0gMDsgaSA8IEdMSU5UX0RSSV9CVUZfQ09VTlQ7IGkrKykgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJKnBndCA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YWRkcmVzcyArIDB4MDc7CisJCQlwZ3QrKzsKKwkJfQorCisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKKworCQl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAxKTsKKwkJR0FNTUFfV1JJVEUoIEdBTU1BX0dETUFDT05UUk9MLCAweGUpOworCX0KKwl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKTsKKwlHQU1NQV9XUklURSggR0FNTUFfUEFHRVRBQkxFQUREUiwgdmlydF90b19waHlzKCh2b2lkKilidWYtPmFkZHJlc3MpICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX1BBR0VUQUJMRUxFTkdUSCwgMiApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYW1tYV9kb19jbGVhbnVwX2RtYSggZHJtX2RldmljZV90ICpkZXYgKQoreworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCisJCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIAorCQkJRFJNKGlycV91bmluc3RhbGwpKGRldik7CisKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisKKwkJaWYgKCBkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCisJCURSTShmcmVlKSggZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9nYW1tYV9wcml2YXRlX3QpLAorCQkJICAgRFJNX01FTV9EUklWRVIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYW1tYV9kbWFfaW5pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5kZXY7CisJZHJtX2dhbW1hX2luaXRfdCBpbml0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZpbml0LCAoZHJtX2dhbW1hX2luaXRfdCBfX3VzZXIgKilhcmcsIHNpemVvZihpbml0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBHQU1NQV9JTklUX0RNQToKKwkJcmV0dXJuIGdhbW1hX2RvX2luaXRfZG1hKCBkZXYsICZpbml0ICk7CisJY2FzZSBHQU1NQV9DTEVBTlVQX0RNQToKKwkJcmV0dXJuIGdhbW1hX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBnYW1tYV9kb19jb3B5X2RtYSggZHJtX2RldmljZV90ICpkZXYsIGRybV9nYW1tYV9jb3B5X3QgKmNvcHkgKQoreworCWRybV9kZXZpY2VfZG1hX3QgICAgKmRtYSA9IGRldi0+ZG1hOworCXVuc2lnbmVkIGludCAgICAgICAgKnNjcmVlbmJ1ZjsKKworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFdlJ3ZlIERSTV9SRVNUUklDVEVEIHRoaXMgRE1BIGJ1ZmZlciAqLworCisJc2NyZWVuYnVmID0gZG1hLT5idWZsaXN0WyBHTElOVF9EUklfQlVGX0NPVU5UICsgMSBdLT5hZGRyZXNzOworCisjaWYgMAorCSpidWZmZXIrKyA9IDB4MTgwOwkvKiBUYWcgKEZpbHRlck1vZGUpICovCisJKmJ1ZmZlcisrID0gMHgyMDA7CS8qIEFsbG93IEZCQ29sb3IgdGhyb3VnaCAqLworCSpidWZmZXIrKyA9IDB4NTNCOwkvKiBUYWcgKi8KKwkqYnVmZmVyKysgPSBjb3B5LT5QaXRjaDsKKwkqYnVmZmVyKysgPSAweDUzQTsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+U3JjQWRkcmVzczsKKwkqYnVmZmVyKysgPSAweDUzOTsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+V2lkdGhIZWlnaHQ7IC8qIEluaXRpYXRlcyB0cmFuc2ZlciAqLworCSpidWZmZXIrKyA9IDB4NTNDOwkvKiBUYWcgLSBETUFPdXRwdXRBZGRyZXNzICovCisJKmJ1ZmZlcisrID0gdmlydF90b19waHlzKCh2b2lkKilzY3JlZW5idWYpOworCSpidWZmZXIrKyA9IDB4NTNEOwkvKiBUYWcgLSBETUFPdXRwdXRDb3VudCAqLworCSpidWZmZXIrKyA9IGNvcHktPkNvdW50OyAvKiBSZWFkcyBIb3N0T3V0RmlmbyBCTE9DS1MgdW50aWwgLi4qLworCisJLyogRGF0YSBub3cgc2l0dGluZyBpbiBkbWEtPmJ1Zmxpc3RbIEdMSU5UX0RSSV9CVUZfQ09VTlQgKyAxIF0gKi8KKwkvKiBOb3cgcHV0IGl0IGJhY2sgdG8gdGhlIHNjcmVlbiAqLworCisJKmJ1ZmZlcisrID0gMHgxODA7CS8qIFRhZyAoRmlsdGVyTW9kZSkgKi8KKwkqYnVmZmVyKysgPSAweDQwMDsJLyogQWxsb3cgU3luYyB0aHJvdWdoICovCisJKmJ1ZmZlcisrID0gMHg1Mzg7CS8qIFRhZyAtIERNQVJlY3RhbmdsZVJlYWRUYXJnZXQgKi8KKwkqYnVmZmVyKysgPSAweDE1NTsJLyogRkJTb3VyY2VEYXRhIHwgY291bnQgKi8KKwkqYnVmZmVyKysgPSAweDUzNzsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+UGl0Y2g7CisJKmJ1ZmZlcisrID0gMHg1MzY7CS8qIFRhZyAqLworCSpidWZmZXIrKyA9IGNvcHktPkRzdEFkZHJlc3M7CisJKmJ1ZmZlcisrID0gMHg1MzU7CS8qIFRhZyAqLworCSpidWZmZXIrKyA9IGNvcHktPldpZHRoSGVpZ2h0OyAvKiBJbml0aWF0ZXMgdHJhbnNmZXIgKi8KKwkqYnVmZmVyKysgPSAweDUzMDsJLyogVGFnIC0gRE1BQWRkciAqLworCSpidWZmZXIrKyA9IHZpcnRfdG9fcGh5cygodm9pZCopc2NyZWVuYnVmKTsKKwkqYnVmZmVyKysgPSAweDUzMTsKKwkqYnVmZmVyKysgPSBjb3B5LT5Db3VudDsgLyogaW5pdGlhdGVzIERNQSB0cmFuc2ZlciBvZiBjb2xvciBkYXRhICovCisjZW5kaWYKKworCS8qIG5lZWQgdG8gZGlzcGF0Y2ggaXQgbm93ICovCisKKwlyZXR1cm4gMDsKK30KKworaW50IGdhbW1hX2RtYV9jb3B5KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmRldjsKKwlkcm1fZ2FtbWFfY29weV90IGNvcHk7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY29weSwgKGRybV9nYW1tYV9jb3B5X3QgX191c2VyICopYXJnLCBzaXplb2YoY29weSkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGdhbW1hX2RvX2NvcHlfZG1hKCBkZXYsICZjb3B5ICk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlciBDb250ZXh0IFNBUkVBIFN1cHBvcnQKKyAqLworCitpbnQgZ2FtbWFfZ2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OworCWRybV9tYXBfdCAqbWFwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKChpbnQpcmVxdWVzdC5jdHhfaWQgPj0gZGV2LT5tYXhfY29udGV4dCkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFwID0gZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF07CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlyZXF1ZXN0LmhhbmRsZSA9IG1hcC0+aGFuZGxlOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgZ2FtbWFfc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKKwlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7CisJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAorCQkJICAgKGRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKilhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcl9saXN0ID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCWlmKHJfbGlzdC0+bWFwICYmCisJCSAgIHJfbGlzdC0+bWFwLT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUpIGJyZWFrOworCX0KKwlpZiAobGlzdCA9PSAmKGRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltYXAgPSByX2xpc3QtPm1hcDsKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCWlmICghbWFwKSByZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKChpbnQpcmVxdWVzdC5jdHhfaWQgPj0gZGV2LT5tYXhfY29udGV4dCkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiAwOworfQorCit2b2lkIGdhbW1hX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCXdoaWxlKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMikKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURSggR0FNTUFfR0NPTU1BTkRNT0RFLAkweDAwMDAwMDA0ICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX0dETUFDT05UUk9MLAkJMHgwMDAwMDAwMCApOworfQorCit2b2lkIGdhbW1hX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwl3aGlsZShHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoIEdBTU1BX0dJTlRFTkFCTEUsCQkweDAwMDAyMDAxICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX0NPTU1BTkRJTlRFTkFCTEUsCTB4MDAwMDAwMDggKTsKKwlHQU1NQV9XUklURSggR0FNTUFfR0RFTEFZVElNRVIsCQkweDAwMDM5MDkwICk7Cit9CisKK3ZvaWQgZ2FtbWFfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJd2hpbGUoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAzKQorCQljcHVfcmVsYXgoKTsKKworCUdBTU1BX1dSSVRFKCBHQU1NQV9HREVMQVlUSU1FUiwJCTB4MDAwMDAwMDAgKTsKKwlHQU1NQV9XUklURSggR0FNTUFfQ09NTUFORElOVEVOQUJMRSwJMHgwMDAwMDAwMCApOworCUdBTU1BX1dSSVRFKCBHQU1NQV9HSU5URU5BQkxFLAkJMHgwMDAwMDAwMCApOworfQorCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBEUk0oaW9jdGxzKVtdOworCitzdGF0aWMgaW50IGdhbW1hX2RyaXZlcl9wcmVpbml0KGRybV9kZXZpY2VfdCAqZGV2KQoreworCS8qIHJlc2V0IHRoZSBmaW5pc2ggaW9jdGwgKi8KKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldLmZ1bmMgPSBEUk0oZmluaXNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2FtbWFfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWdhbW1hX2RvX2NsZWFudXBfZG1hKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGdhbW1hX2RyaXZlcl9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpCit7CisJZ2FtbWFfZG1hX3JlYWR5KGRldik7Cit9CisKK3N0YXRpYyBpbnQgZ2FtbWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQkoCisJCWRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWlmIChkZXZfcHJpdi0+bnVtX3Jhc3QgPT0gMikKKwkJZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRldik7CisJZWxzZSBnYW1tYV9kbWFfcXVpZXNjZW50X3NpbmdsZShkZXYpOworCXJldHVybiAwOworfQorCit2b2lkIGdhbW1hX2RyaXZlcl9yZWdpc3Rlcl9mbnMoZHJtX2RldmljZV90ICpkZXYpCit7CisJZGV2LT5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0hBVkVfSVJROworCURSTShmb3BzKS5yZWFkID0gZ2FtbWFfZm9wc19yZWFkOworCURSTShmb3BzKS5wb2xsID0gZ2FtbWFfZm9wc19wb2xsOworCWRldi0+ZHJpdmVyLnByZWluaXQgPSBnYW1tYV9kcml2ZXJfcHJlaW5pdDsKKwlkZXYtPmRyaXZlci5wcmV0YWtlZG93biA9IGdhbW1hX2RyaXZlcl9wcmV0YWtlZG93bjsKKwlkZXYtPmRyaXZlci5kbWFfcmVhZHkgPSBnYW1tYV9kcml2ZXJfZG1hX3JlYWR5OworCWRldi0+ZHJpdmVyLmRtYV9xdWllc2NlbnQgPSBnYW1tYV9kcml2ZXJfZG1hX3F1aWVzY2VudDsKKwlkZXYtPmRyaXZlci5kbWFfZmx1c2hfYmxvY2tfYW5kX2ZsdXNoID0gZ2FtbWFfZmx1c2hfYmxvY2tfYW5kX2ZsdXNoOworCWRldi0+ZHJpdmVyLmRtYV9mbHVzaF91bmJsb2NrID0gZ2FtbWFfZmx1c2hfdW5ibG9jazsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODE5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RybS5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX0dBTU1BX0RSTV9IXworI2RlZmluZSBfR0FNTUFfRFJNX0hfCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fZ2FtbWFfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OyAvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpbl91c2U7CS8qIG93bmVkIGJ5IGEgY2xpZW50LCBvciBmcmVlPyAqLworCWludCBhZ2U7CQkvKiB0cmFja2VkIGJ5IGNsaWVudHMgdG8gdXBkYXRlIGxvY2FsIExSVSdzICovCit9IGRybV9nYW1tYV90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJR0RlbHRhTW9kZTsKKwl1bnNpZ25lZCBpbnQJR0RlcHRoTW9kZTsKKwl1bnNpZ25lZCBpbnQJR0dlb21ldHJ5TW9kZTsKKwl1bnNpZ25lZCBpbnQJR1RyYW5zZm9ybU1vZGU7Cit9IGRybV9nYW1tYV9jb250ZXh0X3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9nYW1tYV9zYXJlYSB7CisgICAJZHJtX2dhbW1hX2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisKKworCS8qIE1haW50YWluIGFuIExSVSBvZiBjb250aWd1b3VzIHJlZ2lvbnMgb2YgdGV4dHVyZSBzcGFjZS4gIElmCisJICogeW91IHRoaW5rIHlvdSBvd24gYSByZWdpb24gb2YgdGV4dHVyZSBtZW1vcnksIGFuZCBpdCBoYXMgYW4KKwkgKiBhZ2UgZGlmZmVyZW50IHRvIHRoZSBvbmUgeW91IHNldCwgdGhlbiB5b3UgYXJlIG1pc3Rha2VuIGFuZAorCSAqIGl0IGhhcyBiZWVuIHN0b2xlbiBieSBhbm90aGVyIGNsaWVudC4gIElmIGdsb2JhbCB0ZXhBZ2UKKwkgKiBoYXNuJ3QgY2hhbmdlZCwgdGhlcmUgaXMgbm8gbmVlZCB0byB3YWxrIHRoZSBsaXN0LgorCSAqCisJICogVGhlc2UgcmVnaW9ucyBjYW4gYmUgdXNlZCBhcyBhIHByb3h5IGZvciB0aGUgZmluZS1ncmFpbmVkCisJICogdGV4dHVyZSBpbmZvcm1hdGlvbiBvZiBvdGhlciBjbGllbnRzIC0gYnkgbWFpbnRhaW5pbmcgdGhlbQorCSAqIGluIHRoZSBzYW1lIGxydSB3aGljaCBpcyB1c2VkIHRvIGFnZSB0aGVpciBvd24gdGV4dHVyZXMsCisJICogY2xpZW50cyBoYXZlIGFuIGFwcHJveGltYXRlIGxydSBmb3IgdGhlIHdob2xlIG9mIGdsb2JhbAorCSAqIHRleHR1cmUgc3BhY2UsIGFuZCBjYW4gbWFrZSBpbmZvcm1lZCBkZWNpc2lvbnMgYXMgdG8gd2hpY2gKKwkgKiBhcmVhcyB0byBraWNrIG91dC4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hvb3NlIHdoZXRoZXIgdG8KKwkgKiBraWNrIG91dCB5b3VyIG93biB0ZXh0dXJlIG9yIHNvbWVvbmUgZWxzZSdzIC0gc2ltcGx5IGVqZWN0CisJICogdGhlbSBhbGwgaW4gTFJVIG9yZGVyLiAgCisJICovCisgICAKKyNkZWZpbmUgR0FNTUFfTlJfVEVYX1JFR0lPTlMgNjQKKwlkcm1fZ2FtbWFfdGV4X3JlZ2lvbl90IHRleExpc3RbR0FNTUFfTlJfVEVYX1JFR0lPTlMrMV07IAorCQkJCS8qIExhc3QgZWx0IGlzIHNlbnRpbmFsICovCisgICAgICAgIGludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKyAgICAgICAgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7ICAgICAvKiAgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisKKwlpbnQgdmVydGV4X3ByaW07Cit9IGRybV9nYW1tYV9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtR2FtbWEuaCkKKyAqLworCisvKiBHYW1tYSBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JT0NUTF9HQU1NQV9JTklUCQlEUk1fSU9XKCAweDQwLCBkcm1fZ2FtbWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfR0FNTUFfQ09QWQkJRFJNX0lPVyggMHg0MSwgZHJtX2dhbW1hX2NvcHlfdCkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2dhbW1hX2NvcHkgeworCXVuc2lnbmVkIGludAlETUFPdXRwdXRBZGRyZXNzOworCXVuc2lnbmVkIGludAlETUFPdXRwdXRDb3VudDsKKwl1bnNpZ25lZCBpbnQJRE1BUmVhZEdMSU5UU291cmNlOworCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVXcml0ZUFkZHJlc3M7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVdyaXRlTGluZVBpdGNoOworCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVXcml0ZTsKKwl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlUmVhZEFkZHJlc3M7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWRMaW5lUGl0Y2g7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWQ7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWRUYXJnZXQ7Cit9IGRybV9nYW1tYV9jb3B5X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9nYW1tYV9pbml0IHsKKyAgIAllbnVtIHsKKwkgICAJR0FNTUFfSU5JVF9ETUEgICAgPSAweDAxLAorCSAgICAgICAJR0FNTUFfQ0xFQU5VUF9ETUEgPSAweDAyCisJfSBmdW5jOworCisgICAJaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBwY2ltb2RlOworCXVuc2lnbmVkIGludCBtbWlvMDsKKwl1bnNpZ25lZCBpbnQgbW1pbzE7CisJdW5zaWduZWQgaW50IG1taW8yOworCXVuc2lnbmVkIGludCBtbWlvMzsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJaW50IG51bV9yYXN0OworfSBkcm1fZ2FtbWFfaW5pdF90OworCisjZW5kaWYgLyogX0dBTU1BX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlNjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmMKQEAgLTAsMCArMSw1OSBAQAorLyogZ2FtbWEuYyAtLSAzZGxhYnMgR01YIDIwMDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEphbiAgNCAwODo1ODozMSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJnYW1tYS5oIgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJnYW1tYV9kcm0uaCIKKyNpbmNsdWRlICJnYW1tYV9kcnYuaCIKKworI2luY2x1ZGUgImRybV9hdXRoLmgiCisjaW5jbHVkZSAiZHJtX2FncHN1cHBvcnQuaCIKKyNpbmNsdWRlICJkcm1fYnVmcy5oIgorI2luY2x1ZGUgImdhbW1hX2NvbnRleHQuaCIJLyogTk9URSEgKi8KKyNpbmNsdWRlICJkcm1fZG1hLmgiCisjaW5jbHVkZSAiZ2FtbWFfb2xkX2RtYS5oIgkvKiBOT1RFICovCisjaW5jbHVkZSAiZHJtX2RyYXdhYmxlLmgiCisjaW5jbHVkZSAiZHJtX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX2ZvcHMuaCIKKyNpbmNsdWRlICJkcm1faW5pdC5oIgorI2luY2x1ZGUgImRybV9pb2N0bC5oIgorI2luY2x1ZGUgImRybV9pcnEuaCIKKyNpbmNsdWRlICJnYW1tYV9saXN0cy5oIiAgICAgICAgLyogTk9URSAqLworI2luY2x1ZGUgImRybV9sb2NrLmgiCisjaW5jbHVkZSAiZ2FtbWFfbG9jay5oIgkJLyogTk9URSAqLworI2luY2x1ZGUgImRybV9tZW1vcnkuaCIKKyNpbmNsdWRlICJkcm1fcHJvYy5oIgorI2luY2x1ZGUgImRybV92bS5oIgorI2luY2x1ZGUgImRybV9zdHViLmgiCisjaW5jbHVkZSAiZHJtX3NjYXR0ZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NmZjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2Rydi5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBnYW1tYV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgM2RsYWJzIEdNWCAyMDAwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMTA6MDU6MDUgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfR0FNTUFfRFJWX0hfCisjZGVmaW5lIF9HQU1NQV9EUlZfSF8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2dhbW1hX3ByaXZhdGUgeworCWRybV9nYW1tYV9zYXJlYV90ICpzYXJlYV9wcml2OworCWRybV9tYXBfdCAqc2FyZWE7CisJZHJtX21hcF90ICptbWlvMDsKKwlkcm1fbWFwX3QgKm1taW8xOworCWRybV9tYXBfdCAqbW1pbzI7CisJZHJtX21hcF90ICptbWlvMzsKKwlpbnQgbnVtX3Jhc3Q7Cit9IGRybV9nYW1tYV9wcml2YXRlX3Q7CisKKwkJCQkvKiBnYW1tYV9kbWEuYyAqLworZXh0ZXJuIGludCBnYW1tYV9kbWFfaW5pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQgZ2FtbWFfZG1hX2NvcHkoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CisKK2V4dGVybiBpbnQgZ2FtbWFfZG9fY2xlYW51cF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBnYW1tYV9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9zaW5nbGUoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRybV9kZXZpY2VfdCAqZGV2KTsKKworCQkJCS8qIGdhbW1hX2RtYS5jICovCitleHRlcm4gaW50ICBnYW1tYV9kbWFfc2NoZWR1bGUoZHJtX2RldmljZV90ICpkZXYsIGludCBsb2NrZWQpOworZXh0ZXJuIGludCAgZ2FtbWFfZG1hKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICBnYW1tYV9maW5kX2RldmljZXModm9pZCk7CitleHRlcm4gaW50ICBnYW1tYV9mb3VuZCh2b2lkKTsKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fZm9wcy5oOgorICovCitleHRlcm4gaW50CSAgICAgRFJNKGZpbmlzaCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZmx1c2hfdW5ibG9jaykoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0LAorCQkJCQlkcm1fbG9ja19mbGFnc190IGZsYWdzKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQsCisJCQkJCQlkcm1fbG9ja19mbGFnc190IGZsYWdzKTsKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fZG1hLmg6CisgKi8KK2V4dGVybiB2b2lkCSAgICAgRFJNKGNsZWFyX25leHRfYnVmZmVyKShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50CSAgICAgRFJNKHNlbGVjdF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIHZvaWQgKCp3cmFwcGVyKSh1bnNpZ25lZCBsb25nKSk7CitleHRlcm4gaW50CSAgICAgRFJNKGRtYV9lbnF1ZXVlKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkbWEpOworZXh0ZXJuIGludAkgICAgIERSTShkbWFfZ2V0X2J1ZmZlcnMpKHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZG1hX3QgKmRtYSk7CisKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fbGlzdHMuaCAobm93IHJlbmFtZWQgZ2FtbWFfbGlzdHMuaCk6CisgKi8KK2V4dGVybiBpbnQJICAgICBEUk0od2FpdGxpc3RfY3JlYXRlKShkcm1fd2FpdGxpc3RfdCAqYmwsIGludCBjb3VudCk7CitleHRlcm4gaW50CSAgICAgRFJNKHdhaXRsaXN0X2Rlc3Ryb3kpKGRybV93YWl0bGlzdF90ICpibCk7CitleHRlcm4gaW50CSAgICAgRFJNKHdhaXRsaXN0X3B1dCkoZHJtX3dhaXRsaXN0X3QgKmJsLCBkcm1fYnVmX3QgKmJ1Zik7CitleHRlcm4gZHJtX2J1Zl90ICAgICAqRFJNKHdhaXRsaXN0X2dldCkoZHJtX3dhaXRsaXN0X3QgKmJsKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZnJlZWxpc3RfY3JlYXRlKShkcm1fZnJlZWxpc3RfdCAqYmwsIGludCBjb3VudCk7CitleHRlcm4gaW50CSAgICAgRFJNKGZyZWVsaXN0X2Rlc3Ryb3kpKGRybV9mcmVlbGlzdF90ICpibCk7CitleHRlcm4gaW50CSAgICAgRFJNKGZyZWVsaXN0X3B1dCkoZHJtX2RldmljZV90ICpkZXYsIGRybV9mcmVlbGlzdF90ICpibCwKKwkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYpOworZXh0ZXJuIGRybV9idWZfdCAgICAgKkRSTShmcmVlbGlzdF9nZXQpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGJsb2NrKTsKKworLyogZXh0ZXJucyBmb3IgZ2FtbWEgY2hhbmdlcyB0byB0aGUgb3BzICovCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBEUk0oZm9wcyk7CitleHRlcm4gdW5zaWduZWQgaW50IGdhbW1hX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKK2V4dGVybiBzc2l6ZV90IGdhbW1hX2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZik7CisKKworI2RlZmluZSBHTElOVF9EUklfQlVGX0NPVU5UIDI1NgorCisjZGVmaW5lIEdBTU1BX09GRihyZWcpCQkJCQkJICAgXAorCSgocmVnIDwgMHgxMDAwKQkJCQkJCSAgIFwKKwkgPyByZWcJCQkJCQkJICAgXAorCSA6ICgocmVnIDwgMHgxMDAwMCkJCQkJCSAgIFwKKwkgICAgPyAocmVnIC0gMHgxMDAwKQkJCQkJICAgXAorCSAgICA6ICgocmVnIDwgMHgxMTAwMCkJCQkJCSAgIFwKKwkgICAgICAgPyAocmVnIC0gMHgxMDAwMCkJCQkJICAgXAorCSAgICAgICA6IChyZWcgLSAweDExMDAwKSkpKQorCisjZGVmaW5lIEdBTU1BX0JBU0UocmVnKQkgKCh1bnNpZ25lZCBsb25nKQkJCQkgICAgIFwKKwkJCSAgKChyZWcgPCAweDEwMDApICAgID8gZGV2X3ByaXYtPm1taW8wLT5oYW5kbGUgOiAgICAgXAorCQkJICAgKChyZWcgPCAweDEwMDAwKSAgPyBkZXZfcHJpdi0+bW1pbzEtPmhhbmRsZSA6ICAgICBcCisJCQkgICAgKChyZWcgPCAweDExMDAwKSA/IGRldl9wcml2LT5tbWlvMi0+aGFuZGxlIDogICAgIFwKKwkJCQkJICAgICAgIGRldl9wcml2LT5tbWlvMy0+aGFuZGxlKSkpKQorI2RlZmluZSBHQU1NQV9BRERSKHJlZykJIChHQU1NQV9CQVNFKHJlZykgKyBHQU1NQV9PRkYocmVnKSkKKyNkZWZpbmUgR0FNTUFfREVSRUYocmVnKSAqKF9fdm9sYXRpbGVfXyBpbnQgKilHQU1NQV9BRERSKHJlZykKKyNkZWZpbmUgR0FNTUFfUkVBRChyZWcpCSBHQU1NQV9ERVJFRihyZWcpCisjZGVmaW5lIEdBTU1BX1dSSVRFKHJlZyx2YWwpIGRvIHsgR0FNTUFfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHQU1NQV9CUk9BRENBU1RNQVNLICAgIDB4OTM3OAorI2RlZmluZSBHQU1NQV9DT01NQU5ESU5URU5BQkxFIDB4MGM0OAorI2RlZmluZSBHQU1NQV9ETUFBRERSRVNTICAgICAgIDB4MDAyOAorI2RlZmluZSBHQU1NQV9ETUFDT1VOVAkgICAgICAgMHgwMDMwCisjZGVmaW5lIEdBTU1BX0ZJTFRFUk1PREUgICAgICAgMHg4YzAwCisjZGVmaW5lIEdBTU1BX0dDT01NQU5ESU5URkxBR1MgMHgwYzUwCisjZGVmaW5lIEdBTU1BX0dDT01NQU5ETU9ERSAgICAgMHgwYzQwCisjZGVmaW5lCQlHQU1NQV9RVUVVRURfRE1BX01PREUJCTE8PDEKKyNkZWZpbmUgR0FNTUFfR0NPTU1BTkRTVEFUVVMgICAweDBjNjAKKyNkZWZpbmUgR0FNTUFfR0RFTEFZVElNRVIgICAgICAweDBjMzgKKyNkZWZpbmUgR0FNTUFfR0RNQUNPTlRST0wgICAgICAweDAwNjAKKyNkZWZpbmUgCUdBTU1BX1VTRV9BR1AJCQkxPDwxCisjZGVmaW5lIEdBTU1BX0dJTlRFTkFCTEUgICAgICAgMHgwODA4CisjZGVmaW5lIEdBTU1BX0dJTlRGTEFHUwkgICAgICAgMHgwODEwCisjZGVmaW5lIEdBTU1BX0lORklGT1NQQUNFICAgICAgMHgwMDE4CisjZGVmaW5lIEdBTU1BX09VVEZJRk9XT1JEUyAgICAgMHgwMDIwCisjZGVmaW5lIEdBTU1BX09VVFBVVEZJRk8gICAgICAgMHgyMDAwCisjZGVmaW5lIEdBTU1BX1NZTkMJICAgICAgIDB4OGM0MAorI2RlZmluZSBHQU1NQV9TWU5DX1RBRwkgICAgICAgMHgwMTg4CisjZGVmaW5lIEdBTU1BX1BBR0VUQUJMRUFERFIgICAgMHgwQzAwCisjZGVmaW5lIEdBTU1BX1BBR0VUQUJMRUxFTkdUSCAgMHgwQzA4CisKKyNkZWZpbmUgR0FNTUFfUEFTU1RIUk9VR0gJMHgxRkUKKyNkZWZpbmUgR0FNTUFfRE1BQUREUlRBRwkweDUzMAorI2RlZmluZSBHQU1NQV9ETUFDT1VOVFRBRwkweDUzMQorI2RlZmluZSBHQU1NQV9DT01NQU5ESU5UVEFHCTB4NTMyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9saXN0cy5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9saXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTNmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xpc3RzLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qIGRybV9saXN0cy5oIC0tIEJ1ZmZlciBsaXN0IGhhbmRsaW5nIHJvdXRpbmVzIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEFwciAxOSAyMDo1NDoyMiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworCitpbnQgRFJNKHdhaXRsaXN0X2NyZWF0ZSkoZHJtX3dhaXRsaXN0X3QgKmJsLCBpbnQgY291bnQpCit7CisJaWYgKGJsLT5jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisKKwlibC0+YnVmcyAgICAgICA9IERSTShhbGxvYykoKGJsLT5jb3VudCArIDIpICogc2l6ZW9mKCpibC0+YnVmcyksCisJCQkJICAgIERSTV9NRU1fQlVGTElTVFMpOworCisJaWYoIWJsLT5idWZzKSByZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoYmwtPmJ1ZnMsIDAsIHNpemVvZigqYmwtPmJ1ZnMpKTsKKwlibC0+Y291bnQgICAgICA9IGNvdW50OworCWJsLT5ycAkgICAgICAgPSBibC0+YnVmczsKKwlibC0+d3AJICAgICAgID0gYmwtPmJ1ZnM7CisJYmwtPmVuZAkgICAgICAgPSAmYmwtPmJ1ZnNbYmwtPmNvdW50KzFdOworCXNwaW5fbG9ja19pbml0KCZibC0+d3JpdGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmJsLT5yZWFkX2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgRFJNKHdhaXRsaXN0X2Rlc3Ryb3kpKGRybV93YWl0bGlzdF90ICpibCkKK3sKKwlpZiAoYmwtPnJwICE9IGJsLT53cCkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJsLT5idWZzKSBEUk0oZnJlZSkoYmwtPmJ1ZnMsCisJCQkJKGJsLT5jb3VudCArIDIpICogc2l6ZW9mKCpibC0+YnVmcyksCisJCQkJRFJNX01FTV9CVUZMSVNUUyk7CisJYmwtPmNvdW50ID0gMDsKKwlibC0+YnVmcyAgPSBOVUxMOworCWJsLT5ycAkgID0gTlVMTDsKKwlibC0+d3AJICA9IE5VTEw7CisJYmwtPmVuZAkgID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworaW50IERSTSh3YWl0bGlzdF9wdXQpKGRybV93YWl0bGlzdF90ICpibCwgZHJtX2J1Zl90ICpidWYpCit7CisJaW50CSAgICAgIGxlZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxlZnQgPSBEUk1fTEVGVENPVU5UKGJsKTsKKwlpZiAoIWxlZnQpIHsKKwkJRFJNX0VSUk9SKCJPdmVyZmxvdyB3aGlsZSBhZGRpbmcgYnVmZmVyICVkIGZyb20gZmlscCAlcFxuIiwKKwkJCSAgYnVmLT5pZHgsIGJ1Zi0+ZmlscCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlidWYtPmxpc3QJID0gRFJNX0xJU1RfV0FJVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibC0+d3JpdGVfbG9jaywgZmxhZ3MpOworCSpibC0+d3AgPSBidWY7CisJaWYgKCsrYmwtPndwID49IGJsLT5lbmQpIGJsLT53cCA9IGJsLT5idWZzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsLT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworZHJtX2J1Zl90ICpEUk0od2FpdGxpc3RfZ2V0KShkcm1fd2FpdGxpc3RfdCAqYmwpCit7CisJZHJtX2J1Zl90ICAgICAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmwtPnJlYWRfbG9jaywgZmxhZ3MpOworCWJ1ZiA9ICpibC0+cnA7CisJaWYgKGJsLT5ycCA9PSBibC0+d3ApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmwtPnJlYWRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCsrYmwtPnJwID49IGJsLT5lbmQpIGJsLT5ycCA9IGJsLT5idWZzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsLT5yZWFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBidWY7Cit9CisKK2ludCBEUk0oZnJlZWxpc3RfY3JlYXRlKShkcm1fZnJlZWxpc3RfdCAqYmwsIGludCBjb3VudCkKK3sKKwlhdG9taWNfc2V0KCZibC0+Y291bnQsIDApOworCWJsLT5uZXh0ICAgICAgPSBOVUxMOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJsLT53YWl0aW5nKTsKKwlibC0+bG93X21hcmsgID0gMDsKKwlibC0+aGlnaF9tYXJrID0gMDsKKwlhdG9taWNfc2V0KCZibC0+d2ZoLCAgIDApOworCXNwaW5fbG9ja19pbml0KCZibC0+bG9jayk7CisJKytibC0+aW5pdGlhbGl6ZWQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oZnJlZWxpc3RfZGVzdHJveSkoZHJtX2ZyZWVsaXN0X3QgKmJsKQoreworCWF0b21pY19zZXQoJmJsLT5jb3VudCwgMCk7CisJYmwtPm5leHQgPSBOVUxMOworCXJldHVybiAwOworfQorCitpbnQgRFJNKGZyZWVsaXN0X3B1dCkoZHJtX2RldmljZV90ICpkZXYsIGRybV9mcmVlbGlzdF90ICpibCwgZHJtX2J1Zl90ICpidWYpCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hICA9IGRldi0+ZG1hOworCisJaWYgKCFkbWEpIHsKKwkJRFJNX0VSUk9SKCJObyBETUEgc3VwcG9ydFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChidWYtPndhaXRpbmcgfHwgYnVmLT5wZW5kaW5nIHx8IGJ1Zi0+bGlzdCA9PSBEUk1fTElTVF9GUkVFKSB7CisJCURSTV9FUlJPUigiRnJlZWQgYnVmZmVyICVkOiB3JWQsIHAlZCwgbCVkXG4iLAorCQkJICBidWYtPmlkeCwgYnVmLT53YWl0aW5nLCBidWYtPnBlbmRpbmcsIGJ1Zi0+bGlzdCk7CisJfQorCWlmICghYmwpIHJldHVybiAxOworCWJ1Zi0+bGlzdAk9IERSTV9MSVNUX0ZSRUU7CisKKwlzcGluX2xvY2soJmJsLT5sb2NrKTsKKwlidWYtPm5leHQJPSBibC0+bmV4dDsKKwlibC0+bmV4dAk9IGJ1ZjsKKwlzcGluX3VubG9jaygmYmwtPmxvY2spOworCisJYXRvbWljX2luYygmYmwtPmNvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJmJsLT5jb3VudCkgPiBkbWEtPmJ1Zl9jb3VudCkgeworCQlEUk1fRVJST1IoIiVkIG9mICVkIGJ1ZmZlcnMgZnJlZSBhZnRlciBhZGRpdGlvbiBvZiAlZFxuIiwKKwkJCSAgYXRvbWljX3JlYWQoJmJsLT5jb3VudCksIGRtYS0+YnVmX2NvdW50LCBidWYtPmlkeCk7CisJCXJldHVybiAxOworCX0KKwkJCQkvKiBDaGVjayBmb3IgaGlnaCB3YXRlciBtYXJrICovCisJaWYgKGF0b21pY19yZWFkKCZibC0+d2ZoKSAmJiBhdG9taWNfcmVhZCgmYmwtPmNvdW50KT49YmwtPmhpZ2hfbWFyaykgeworCQlhdG9taWNfc2V0KCZibC0+d2ZoLCAwKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZibC0+d2FpdGluZyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgZHJtX2J1Zl90ICpEUk0oZnJlZWxpc3RfdHJ5KShkcm1fZnJlZWxpc3RfdCAqYmwpCit7CisJZHJtX2J1Zl90CSAgKmJ1ZjsKKworCWlmICghYmwpIHJldHVybiBOVUxMOworCisJCQkJLyogR2V0IGJ1ZmZlciAqLworCXNwaW5fbG9jaygmYmwtPmxvY2spOworCWlmICghYmwtPm5leHQpIHsKKwkJc3Bpbl91bmxvY2soJmJsLT5sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWJ1ZgkgID0gYmwtPm5leHQ7CisJYmwtPm5leHQgID0gYmwtPm5leHQtPm5leHQ7CisJc3Bpbl91bmxvY2soJmJsLT5sb2NrKTsKKworCWF0b21pY19kZWMoJmJsLT5jb3VudCk7CisJYnVmLT5uZXh0ID0gTlVMTDsKKwlidWYtPmxpc3QgPSBEUk1fTElTVF9OT05FOworCWlmIChidWYtPndhaXRpbmcgfHwgYnVmLT5wZW5kaW5nKSB7CisJCURSTV9FUlJPUigiRnJlZSBidWZmZXIgJWQ6IHclZCwgcCVkLCBsJWRcbiIsCisJCQkgIGJ1Zi0+aWR4LCBidWYtPndhaXRpbmcsIGJ1Zi0+cGVuZGluZywgYnVmLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitkcm1fYnVmX3QgKkRSTShmcmVlbGlzdF9nZXQpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGJsb2NrKQoreworCWRybV9idWZfdAkgICpidWYJPSBOVUxMOworCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKKworCWlmICghYmwgfHwgIWJsLT5pbml0aWFsaXplZCkgcmV0dXJuIE5VTEw7CisKKwkJCQkvKiBDaGVjayBmb3IgbG93IHdhdGVyIG1hcmsgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmJsLT5jb3VudCkgPD0gYmwtPmxvd19tYXJrKSAvKiBCZWNhbWUgbG93ICovCisJCWF0b21pY19zZXQoJmJsLT53ZmgsIDEpOworCWlmIChhdG9taWNfcmVhZCgmYmwtPndmaCkpIHsKKwkJaWYgKGJsb2NrKSB7CisJCQlhZGRfd2FpdF9xdWV1ZSgmYmwtPndhaXRpbmcsICZlbnRyeSk7CisJCQlmb3IgKDs7KSB7CisJCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQkJaWYgKCFhdG9taWNfcmVhZCgmYmwtPndmaCkKKwkJCQkgICAgJiYgKGJ1ZiA9IERSTShmcmVlbGlzdF90cnkpKGJsKSkpIGJyZWFrOworCQkJCXNjaGVkdWxlKCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSBicmVhazsKKwkJCX0KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmJsLT53YWl0aW5nLCAmZW50cnkpOworCQl9CisJCXJldHVybiBidWY7CisJfQorCisJcmV0dXJuIERSTShmcmVlbGlzdF90cnkpKGJsKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9sb2NrLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVjNjdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9sb2NrLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGxvY2suYyAtLSBJT0NUTHMgZm9yIGxvY2tpbmcgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUdWUgRmViICAyIDA4OjM3OjU0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisKKy8qIEdhbW1hLXNwZWNpZmljIGNvZGUgZXh0cmFjdGVkIGZyb20gZHJtX2xvY2suaDoKKyAqLworc3RhdGljIGludCBEUk0oZmx1c2hfcXVldWUpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisJaW50CQkgIHJldAk9IDA7CisJZHJtX3F1ZXVlX3QJICAqcQk9IGRldi0+cXVldWVsaXN0W2NvbnRleHRdOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPiAxKSB7CisJCWF0b21pY19pbmMoJnEtPmJsb2NrX3dyaXRlKTsKKwkJYWRkX3dhaXRfcXVldWUoJnEtPmZsdXNoX3F1ZXVlLCAmZW50cnkpOworCQlhdG9taWNfaW5jKCZxLT5ibG9ja19jb3VudCk7CisJCWZvciAoOzspIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJaWYgKCFEUk1fQlVGQ09VTlQoJnEtPndhaXRsaXN0KSkgYnJlYWs7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVJTlRSOyAvKiBDYW4ndCByZXN0YXJ0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXRvbWljX2RlYygmcS0+YmxvY2tfY291bnQpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnEtPmZsdXNoX3F1ZXVlLCAmZW50cnkpOworCX0KKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCisJCQkJLyogTk9URTogYmxvY2tfd3JpdGUgaXMgc3RpbGwgaW5jcmVtZW50ZWQhCisJCQkJICAgVXNlIGRybV9mbHVzaF91bmxvY2tfcXVldWUgdG8gZGVjcmVtZW50LiAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgRFJNKGZsdXNoX3VuYmxvY2tfcXVldWUpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlkcm1fcXVldWVfdAkgICpxCT0gZGV2LT5xdWV1ZWxpc3RbY29udGV4dF07CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA+IDEpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZxLT5ibG9ja193cml0ZSkpIHsKKwkJCWF0b21pY19kZWMoJnEtPmJsb2NrX3dyaXRlKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcS0+d3JpdGVfcXVldWUpOworCQl9CisJfQorCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQsCisJCQkgICAgICAgZHJtX2xvY2tfZmxhZ3NfdCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChmbGFncyAmIF9EUk1fTE9DS19GTFVTSCkgeworCQlyZXQgPSBEUk0oZmx1c2hfcXVldWUpKGRldiwgRFJNX0tFUk5FTF9DT05URVhUKTsKKwkJaWYgKCFyZXQpIHJldCA9IERSTShmbHVzaF9xdWV1ZSkoZGV2LCBjb250ZXh0KTsKKwl9CisJaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgeworCQlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKKwkJCXJldCA9IERSTShmbHVzaF9xdWV1ZSkoZGV2LCBpKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgRFJNKGZsdXNoX3VuYmxvY2spKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCwgZHJtX2xvY2tfZmxhZ3NfdCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChmbGFncyAmIF9EUk1fTE9DS19GTFVTSCkgeworCQlyZXQgPSBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZGV2LCBEUk1fS0VSTkVMX0NPTlRFWFQpOworCQlpZiAoIXJldCkgcmV0ID0gRFJNKGZsdXNoX3VuYmxvY2tfcXVldWUpKGRldiwgY29udGV4dCk7CisJfQorCWlmIChmbGFncyAmIF9EUk1fTE9DS19GTFVTSF9BTEwpIHsKKwkJZm9yIChpID0gMDsgIXJldCAmJiBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZGV2LCBpKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBEUk0oZmluaXNoKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgID0gcHJpdi0+ZGV2OworCWludAkJICByZXQJICA9IDA7CisJZHJtX2xvY2tfdAkgIGxvY2s7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKWFyZywgc2l6ZW9mKGxvY2spKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gRFJNKGZsdXNoX2Jsb2NrX2FuZF9mbHVzaCkoZGV2LCBsb2NrLmNvbnRleHQsIGxvY2suZmxhZ3MpOworCURSTShmbHVzaF91bmJsb2NrKShkZXYsIGxvY2suY29udGV4dCwgbG9jay5mbGFncyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfb2xkX2RtYS5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9vbGRfZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkZDQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfb2xkX2RtYS5oCkBAIC0wLDAgKzEsMzEzIEBACisvKiBkcm1fZG1hLmMgLS0gRE1BIElPQ1RMIGFuZCBmdW5jdGlvbiBzdXBwb3J0IC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogRnJpIE1hciAxOSAxNDozMDoxNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworCisvKiBHYW1tYS1zcGVjaWZpYyBjb2RlIHB1bGxlZCBmcm9tIGRybV9kbWEuaDoKKyAqLworCit2b2lkIERSTShjbGVhcl9uZXh0X2J1ZmZlcikoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisKKwlkbWEtPm5leHRfYnVmZmVyID0gTlVMTDsKKwlpZiAoZG1hLT5uZXh0X3F1ZXVlICYmICFEUk1fQlVGQ09VTlQoJmRtYS0+bmV4dF9xdWV1ZS0+d2FpdGxpc3QpKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZG1hLT5uZXh0X3F1ZXVlLT5mbHVzaF9xdWV1ZSk7CisJfQorCWRtYS0+bmV4dF9xdWV1ZQkgPSBOVUxMOworfQorCitpbnQgRFJNKHNlbGVjdF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIHZvaWQgKCp3cmFwcGVyKSh1bnNpZ25lZCBsb25nKSkKK3sKKwlpbnQJICAgaTsKKwlpbnQJICAgY2FuZGlkYXRlID0gLTE7CisJaW50CSAgIGoJICAgICA9IGppZmZpZXM7CisKKwlpZiAoIWRldikgeworCQlEUk1fRVJST1IoIk5vIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFkZXYtPnF1ZXVlbGlzdCB8fCAhZGV2LT5xdWV1ZWxpc3RbRFJNX0tFUk5FTF9DT05URVhUXSkgeworCQkJCS8qIFRoaXMgb25seSBoYXBwZW5zIGJldHdlZW4gdGhlIHRpbWUgdGhlCisJCQkJICAgaW50ZXJydXB0IGlzIGluaXRpYWxpemVkIGFuZCB0aGUgdGltZQorCQkJCSAgIHRoZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkLiAqLworCQlyZXR1cm4gLTE7CisJfQorCisJCQkJLyogRG9pbmcgIndoaWxlIGxvY2tlZCIgRE1BPyAqLworCWlmIChEUk1fV0FJVENPVU5UKGRldiwgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQlyZXR1cm4gRFJNX0tFUk5FTF9DT05URVhUOworCX0KKworCQkJCS8qIElmIHRoZXJlIGFyZSBidWZmZXJzIG9uIHRoZSBsYXN0X2NvbnRleHQKKwkJCQkgICBxdWV1ZSwgYW5kIHdlIGhhdmUgbm90IGJlZW4gZXhlY3V0aW5nCisJCQkJICAgdGhpcyBjb250ZXh0IHZlcnkgbG9uZywgY29udGludWUgdG8KKwkJCQkgICBleGVjdXRlIHRoaXMgY29udGV4dC4gKi8KKwlpZiAoZGV2LT5sYXN0X3N3aXRjaCA8PSBqCisJICAgICYmIGRldi0+bGFzdF9zd2l0Y2ggKyBEUk1fVElNRV9TTElDRSA+IGoKKwkgICAgJiYgRFJNX1dBSVRDT1VOVChkZXYsIGRldi0+bGFzdF9jb250ZXh0KSkgeworCQlyZXR1cm4gZGV2LT5sYXN0X2NvbnRleHQ7CisJfQorCisJCQkJLyogT3RoZXJ3aXNlLCBmaW5kIGEgY2FuZGlkYXRlICovCisJZm9yIChpID0gZGV2LT5sYXN0X2NoZWNrZWQgKyAxOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCWlmIChEUk1fV0FJVENPVU5UKGRldiwgaSkpIHsKKwkJCWNhbmRpZGF0ZSA9IGRldi0+bGFzdF9jaGVja2VkID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGNhbmRpZGF0ZSA8IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgeworCQkJaWYgKERSTV9XQUlUQ09VTlQoZGV2LCBpKSkgeworCQkJCWNhbmRpZGF0ZSA9IGRldi0+bGFzdF9jaGVja2VkID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICh3cmFwcGVyCisJICAgICYmIGNhbmRpZGF0ZSA+PSAwCisJICAgICYmIGNhbmRpZGF0ZSAhPSBkZXYtPmxhc3RfY29udGV4dAorCSAgICAmJiBkZXYtPmxhc3Rfc3dpdGNoIDw9IGoKKwkgICAgJiYgZGV2LT5sYXN0X3N3aXRjaCArIERSTV9USU1FX1NMSUNFID4gaikgeworCQlpZiAoZGV2LT50aW1lci5leHBpcmVzICE9IGRldi0+bGFzdF9zd2l0Y2ggKyBEUk1fVElNRV9TTElDRSkgeworCQkJZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwkJCWRldi0+dGltZXIuZnVuY3Rpb24gPSB3cmFwcGVyOworCQkJZGV2LT50aW1lci5kYXRhCSAgICA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwkJCWRldi0+dGltZXIuZXhwaXJlcyAgPSBkZXYtPmxhc3Rfc3dpdGNoK0RSTV9USU1FX1NMSUNFOworCQkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGNhbmRpZGF0ZTsKK30KKworCitpbnQgRFJNKGRtYV9lbnF1ZXVlKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkKQoreworCWRybV9maWxlX3QgICAgKnByaXYgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgICpkZXYgICAgPSBwcml2LT5kZXY7CisJaW50CQkgIGk7CisJZHJtX3F1ZXVlX3QJICAqcTsKKwlkcm1fYnVmX3QJICAqYnVmOworCWludAkJICBpZHg7CisJaW50CQkgIHdoaWxlX2xvY2tlZCA9IDA7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYSA9IGRldi0+ZG1hOworCWludAkJICAqaW5kOworCWludAkJICBlcnI7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCisJRFJNX0RFQlVHKCIlZFxuIiwgZC0+c2VuZF9jb3VudCk7CisKKwlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XSElMRV9MT0NLRUQpIHsKKwkJaW50IGNvbnRleHQgPSBkZXYtPmxvY2suaHdfbG9jay0+bG9jazsKKworCQlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGNvbnRleHQpKSB7CisJCQlEUk1fRVJST1IoIk5vIGxvY2sgaGVsZCBkdXJpbmcgXCJ3aGlsZSBsb2NrZWRcIiIKKwkJCQkgICIgcmVxdWVzdFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoZC0+Y29udGV4dCAhPSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChjb250ZXh0KQorCQkgICAgJiYgX0RSTV9MT0NLSU5HX0NPTlRFWFQoY29udGV4dCkgIT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CisJCQlEUk1fRVJST1IoIkxvY2sgaGVsZCBieSAlZCB3aGlsZSAlZCBtYWtlcyIKKwkJCQkgICIgXCJ3aGlsZSBsb2NrZWRcIiByZXF1ZXN0XG4iLAorCQkJCSAgX0RSTV9MT0NLSU5HX0NPTlRFWFQoY29udGV4dCksCisJCQkJICBkLT5jb250ZXh0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXEgPSBkZXYtPnF1ZXVlbGlzdFtEUk1fS0VSTkVMX0NPTlRFWFRdOworCQl3aGlsZV9sb2NrZWQgPSAxOworCX0gZWxzZSB7CisJCXEgPSBkZXYtPnF1ZXVlbGlzdFtkLT5jb250ZXh0XTsKKwl9CisKKworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT5ibG9ja193cml0ZSkpIHsKKwkJYWRkX3dhaXRfcXVldWUoJnEtPndyaXRlX3F1ZXVlLCAmZW50cnkpOworCQlhdG9taWNfaW5jKCZxLT5ibG9ja19jb3VudCk7CisJCWZvciAoOzspIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJaWYgKCFhdG9taWNfcmVhZCgmcS0+YmxvY2tfd3JpdGUpKSBicmVhazsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZxLT53cml0ZV9xdWV1ZSwgJmVudHJ5KTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQl9CisJCWF0b21pY19kZWMoJnEtPmJsb2NrX2NvdW50KTsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZxLT53cml0ZV9xdWV1ZSwgJmVudHJ5KTsKKwl9CisKKwlpbmQgPSBEUk0oYWxsb2MpKGQtPnNlbmRfY291bnQgKiBzaXplb2YoaW50KSwgRFJNX01FTV9EUklWRVIpOworCWlmICghaW5kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihpbmQsIGQtPnNlbmRfaW5kaWNlcywgZC0+c2VuZF9jb3VudCAqIHNpemVvZihpbnQpKSkgeworCQllcnIgPSAtRUZBVUxUOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCX0KKworCWVyciA9IC1FSU5WQUw7CisJZm9yIChpID0gMDsgaSA8IGQtPnNlbmRfY291bnQ7IGkrKykgeworCQlpZHggPSBpbmRbaV07CisJCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgeworCQkJRFJNX0VSUk9SKCJJbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkgIGluZFtpXSwgZG1hLT5idWZfY291bnQgLSAxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFsgaWR4IF07CisJCWlmIChidWYtPmZpbHAgIT0gZmlscCkgeworCQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBub3Qgb3duZWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGJ1Zi0+bGlzdCAhPSBEUk1fTElTVF9OT05FKSB7CisJCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyICVkIG9uIGxpc3QgJWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQsIGJ1Zi0+aWR4LCBidWYtPmxpc3QpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnVmLT51c2VkCSAgPSBpbmRbaV07CisJCWJ1Zi0+d2hpbGVfbG9ja2VkID0gd2hpbGVfbG9ja2VkOworCQlidWYtPmNvbnRleHQJICA9IGQtPmNvbnRleHQ7CisJCWlmICghYnVmLT51c2VkKSB7CisJCQlEUk1fRVJST1IoIlF1ZXVlaW5nIDAgbGVuZ3RoIGJ1ZmZlclxuIik7CisJCX0KKwkJaWYgKGJ1Zi0+cGVuZGluZykgeworCQkJRFJNX0VSUk9SKCJRdWV1ZWluZyBwZW5kaW5nIGJ1ZmZlcjoiCisJCQkJICAiIGJ1ZmZlciAlZCwgb2Zmc2V0ICVkXG4iLAorCQkJCSAgaW5kW2ldLCBpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChidWYtPndhaXRpbmcpIHsKKwkJCURSTV9FUlJPUigiUXVldWVpbmcgd2FpdGluZyBidWZmZXI6IgorCQkJCSAgIiBidWZmZXIgJWQsIG9mZnNldCAlZFxuIiwKKwkJCQkgIGluZFtpXSwgaSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlidWYtPndhaXRpbmcgPSAxOworCQlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMQorCQkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbikpIHsKKwkJCURSTShmcmVlX2J1ZmZlcikoZGV2LCBidWYpOworCQl9IGVsc2UgeworCQkJRFJNKHdhaXRsaXN0X3B1dCkoJnEtPndhaXRsaXN0LCBidWYpOworCQkJYXRvbWljX2luYygmcS0+dG90YWxfcXVldWVkKTsKKwkJfQorCX0KKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCisJcmV0dXJuIDA7CisKK291dDoKKwlEUk0oZnJlZSkoaW5kLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKGludCksIERSTV9NRU1fRFJJVkVSKTsKKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoc3RydWN0IGZpbGUgKmZpbHAsIGRybV9kbWFfdCAqZCwKKwkJCQkJIGludCBvcmRlcikKK3sKKwlkcm1fZmlsZV90ICAgICpwcml2ICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICAqZGV2ICAgID0gcHJpdi0+ZGV2OworCWludAkJICBpOworCWRybV9idWZfdAkgICpidWY7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYSA9IGRldi0+ZG1hOworCisJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgeworCQlidWYgPSBEUk0oZnJlZWxpc3RfZ2V0KSgmZG1hLT5idWZzW29yZGVyXS5mcmVlbGlzdCwKKwkJCQkJZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XQUlUKTsKKwkJaWYgKCFidWYpIGJyZWFrOworCQlpZiAoYnVmLT5wZW5kaW5nIHx8IGJ1Zi0+d2FpdGluZykgeworCQkJRFJNX0VSUk9SKCJGcmVlIGJ1ZmZlciAlZCBpbiB1c2U6IGZpbHAgJXAgKHclZCwgcCVkKVxuIiwKKwkJCQkgIGJ1Zi0+aWR4LAorCQkJCSAgYnVmLT5maWxwLAorCQkJCSAgYnVmLT53YWl0aW5nLAorCQkJCSAgYnVmLT5wZW5kaW5nKTsKKwkJfQorCQlidWYtPmZpbHAgICAgID0gZmlscDsKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLAorCQkJCSAmYnVmLT5pZHgsCisJCQkJIHNpemVvZihidWYtPmlkeCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9zaXplc1tpXSwKKwkJCQkgJmJ1Zi0+dG90YWwsCisJCQkJIHNpemVvZihidWYtPnRvdGFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkrK2QtPmdyYW50ZWRfY291bnQ7CisJfQorCXJldHVybiAwOworfQorCisKK2ludCBEUk0oZG1hX2dldF9idWZmZXJzKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkbWEpCit7CisJaW50CQkgIG9yZGVyOworCWludAkJICByZXRjb2RlID0gMDsKKwlpbnQJCSAgdG1wX29yZGVyOworCisJb3JkZXIgPSBEUk0ob3JkZXIpKGRtYS0+cmVxdWVzdF9zaXplKTsKKworCWRtYS0+Z3JhbnRlZF9jb3VudCA9IDA7CisJcmV0Y29kZQkJICAgPSBEUk0oZG1hX2dldF9idWZmZXJzX29mX29yZGVyKShmaWxwLCBkbWEsIG9yZGVyKTsKKworCWlmIChkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKKwkgICAgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9TTUFMTEVSX09LKSkgeworCQlmb3IgKHRtcF9vcmRlciA9IG9yZGVyIC0gMTsKKwkJICAgICAhcmV0Y29kZQorCQkJICAgICAmJiBkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKKwkJCSAgICAgJiYgdG1wX29yZGVyID49IERSTV9NSU5fT1JERVI7CisJCSAgICAgLS10bXBfb3JkZXIpIHsKKworCQkJcmV0Y29kZSA9IERSTShkbWFfZ2V0X2J1ZmZlcnNfb2Zfb3JkZXIpKGZpbHAsIGRtYSwKKwkJCQkJCQkJdG1wX29yZGVyKTsKKwkJfQorCX0KKworCWlmIChkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKKwkgICAgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9MQVJHRVJfT0spKSB7CisJCWZvciAodG1wX29yZGVyID0gb3JkZXIgKyAxOworCQkgICAgICFyZXRjb2RlCisJCQkgICAgICYmIGRtYS0+Z3JhbnRlZF9jb3VudCA8IGRtYS0+cmVxdWVzdF9jb3VudAorCQkJICAgICAmJiB0bXBfb3JkZXIgPD0gRFJNX01BWF9PUkRFUjsKKwkJICAgICArK3RtcF9vcmRlcikgeworCisJCQlyZXRjb2RlID0gRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoZmlscCwgZG1hLAorCQkJCQkJCQl0bXBfb3JkZXIpOworCQl9CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4NTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpAQCAtMCwwICsxLDEzODUgQEAKKy8qIGk4MTBfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBpODEwIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqICAgICAgICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpODEwX2RybS5oIgorI2luY2x1ZGUgImk4MTBfZHJ2LmgiCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2RlZmluZSBJODEwX0JVRl9GUkVFCQkyCisjZGVmaW5lIEk4MTBfQlVGX0NMSUVOVAkJMQorI2RlZmluZSBJODEwX0JVRl9IQVJEV0FSRSAgICAgIAkwCisKKyNkZWZpbmUgSTgxMF9CVUZfVU5NQVBQRUQgMAorI2RlZmluZSBJODEwX0JVRl9NQVBQRUQgICAxCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIpCisjZGVmaW5lIGRvd25fd3JpdGUgZG93bgorI2RlZmluZSB1cF93cml0ZSB1cAorI2VuZGlmCisKK3N0YXRpYyBkcm1fYnVmX3QgKmk4MTBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisgICAJaW50IAkJIHVzZWQ7CisKKwkvKiBMaW5lYXIgc2VhcmNoIG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCBzb2x1dGlvbiAqLworCisgICAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KKwkgICAJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfRlJFRSwKKwkJCSAgICAgICBJODEwX0JVRl9DTElFTlQpOworCQlpZiAodXNlZCA9PSBJODEwX0JVRl9GUkVFKSB7CisJCQlyZXR1cm4gYnVmOworCQl9CisJfQorICAgCXJldHVybiBOVUxMOworfQorCisvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBzZW50IHRvIHRoZSBoYXJkd2FyZQorICogeWV0LCB0aGUgaGFyZHdhcmUgdXBkYXRlcyBpbiB1c2UgZm9yIHVzIG9uY2UgaXRzIG9uIHRoZSByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZikKK3sKKyAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisgICAJaW50IHVzZWQ7CisKKyAgIAkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KKyAgIAl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9DTElFTlQsIEk4MTBfQlVGX0ZSRUUpOworCWlmICh1c2VkICE9IEk4MTBfQlVGX0NMSUVOVCkgeworCSAgIAlEUk1fRVJST1IoIkZyZWVpbmcgYnVmZmVyIHRoYXRzIG5vdCBpbiB1c2UgOiAlZFxuIiwgYnVmLT5pZHgpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgxMF9idWZmZXJfZm9wcyA9IHsKKwkub3BlbgkgPSBkcm1fb3BlbiwKKwkuZmx1c2gJID0gZHJtX2ZsdXNoLAorCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJLmlvY3RsCSA9IGRybV9pb2N0bCwKKwkubW1hcAkgPSBpODEwX21tYXBfYnVmZmVycywKKwkuZmFzeW5jICA9IGRybV9mYXN5bmMsCit9OworCitpbnQgaTgxMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJICAgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgICAqZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAgKmRldl9wcml2OworCWRybV9idWZfdCAgICAgICAgICAgKmJ1ZjsKKwlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdjsKKworCWxvY2tfa2VybmVsKCk7CisJZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJYnVmICAgICAgPSBkZXZfcHJpdi0+bW1hcF9idWZmZXI7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9ET05UQ09QWSk7CisJdm1hLT52bV9maWxlID0gZmlscDsKKworICAgCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgxMF9CVUZfTUFQUEVEOworCXVubG9ja19rZXJuZWwoKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICBWTV9PRkZTRVQodm1hKSA+PiBQQUdFX1NISUZULAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOworCWludCByZXRjb2RlID0gMDsKKworCWlmIChidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9PSBJODEwX0JVRl9NQVBQRUQpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKwlvbGRfZm9wcyA9IGZpbHAtPmZfb3A7CisJZmlscC0+Zl9vcCA9ICZpODEwX2J1ZmZlcl9mb3BzOworCWRldl9wcml2LT5tbWFwX2J1ZmZlciA9IGJ1ZjsKKwlidWZfcHJpdi0+dmlydHVhbCA9ICh2b2lkICopZG9fbW1hcChmaWxwLCAwLCBidWYtPnRvdGFsLAorCQkJCQkgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsCisJCQkJCSAgICBNQVBfU0hBUkVELAorCQkJCQkgICAgYnVmLT5idXNfYWRkcmVzcyk7CisJZGV2X3ByaXYtPm1tYXBfYnVmZmVyID0gTlVMTDsKKwlmaWxwLT5mX29wID0gb2xkX2ZvcHM7CisJaWYgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wcml2LT52aXJ0dWFsID4gLTEwMjRVTCkgeworCQkvKiBSZWFsIGVycm9yICovCisJCURSTV9FUlJPUigibW1hcCBlcnJvclxuIik7CisJCXJldGNvZGUgPSAoc2lnbmVkIGludClidWZfcHJpdi0+dmlydHVhbDsKKwkJYnVmX3ByaXYtPnZpcnR1YWwgPSBOVUxMOworCX0KKwl1cF93cml0ZSggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF91bm1hcF9idWZmZXIoZHJtX2J1Zl90ICpidWYpCit7CisJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWludCByZXRjb2RlID0gMDsKKworCWlmIChidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCAhPSBJODEwX0JVRl9NQVBQRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXRjb2RlID0gZG9fbXVubWFwKGN1cnJlbnQtPm1tLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJ1Zl9wcml2LT52aXJ0dWFsLAorCQkJICAgIChzaXplX3QpIGJ1Zi0+dG90YWwpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisgICAJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODEwX0JVRl9VTk1BUFBFRDsKKyAgIAlidWZfcHJpdi0+dmlydHVhbCA9IE5VTEw7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODEwX2RtYV9nZXRfYnVmZmVyKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faTgxMF9kbWFfdCAqZCwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fYnVmX3QJICAqYnVmOworCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWludCByZXRjb2RlID0gMDsKKworCWJ1ZiA9IGk4MTBfZnJlZWxpc3RfZ2V0KGRldik7CisJaWYgKCFidWYpIHsKKwkJcmV0Y29kZSA9IC1FTk9NRU07CisJICAgCURSTV9ERUJVRygicmV0Y29kZT0lZFxuIiwgcmV0Y29kZSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKworCXJldGNvZGUgPSBpODEwX21hcF9idWZmZXIoYnVmLCBmaWxwKTsKKwlpZiAocmV0Y29kZSkgeworCQlpODEwX2ZyZWVsaXN0X3B1dChkZXYsIGJ1Zik7CisJICAgCURSTV9FUlJPUigibWFwYnVmIGZhaWxlZCwgcmV0Y29kZSAlZFxuIiwgcmV0Y29kZSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKwlidWYtPmZpbHAgPSBmaWxwOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkLT5ncmFudGVkID0gMTsKKyAgIAlkLT5yZXF1ZXN0X2lkeCA9IGJ1Zi0+aWR4OworICAgCWQtPnJlcXVlc3Rfc2l6ZSA9IGJ1Zi0+dG90YWw7CisgICAJZC0+dmlydHVhbCA9IGJ1Zl9wcml2LT52aXJ0dWFsOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkgJiYgZGV2LT5pcnFfZW5hYmxlZCkKKwkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CisJCWludCBpOworCSAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkgICAgIAkJKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJCSAgIAlkcm1faW9yZW1hcGZyZWUoKHZvaWQgKikgZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCwKKwkJCQkJIGRldl9wcml2LT5yaW5nLlNpemUsIGRldik7CisJCX0KKwkgICAJaWYgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQkgICAJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJICAgIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwKKwkJCQkJICAgIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworCQkgICAJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCisJCSAgIAlJODEwX1dSSVRFKDB4MDIwODAsIDB4MWZmZmYwMDApOworCQl9CisJICAgCWRybV9mcmVlKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpLAorCQkJIERSTV9NRU1fRFJJVkVSKTsKKwkgICAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCAmJiBidWYtPnRvdGFsICkKKwkJCQlkcm1faW9yZW1hcGZyZWUoYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsLCBidWYtPnRvdGFsLCBkZXYpOworCQl9CisJfQorICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbikKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisgICAJaW50IGl0ZXJzID0gMDsKKyAgIAl1bnNpZ25lZCBsb25nIGVuZDsKKwl1bnNpZ25lZCBpbnQgbGFzdF9oZWFkID0gSTgxMF9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworCisJZW5kID0gamlmZmllcyArIChIWiozKTsKKyAgIAl3aGlsZSAocmluZy0+c3BhY2UgPCBuKSB7CisJICAgCXJpbmctPmhlYWQgPSBJODEwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworCQlpZiAocmluZy0+c3BhY2UgPCAwKSByaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCSAgIAorCQlpZiAocmluZy0+aGVhZCAhPSBsYXN0X2hlYWQpIHsKKwkJCWVuZCA9IGppZmZpZXMgKyAoSFoqMyk7CisJCQlsYXN0X2hlYWQgPSByaW5nLT5oZWFkOworCQl9CisJICAKKwkgICAJaXRlcnMrKzsKKwkJaWYgKHRpbWVfYmVmb3JlKGVuZCwgamlmZmllcykpIHsKKwkJICAgCURSTV9FUlJPUigic3BhY2U6ICVkIHdhbnRlZCAlZFxuIiwgcmluZy0+c3BhY2UsIG4pOworCQkgICAJRFJNX0VSUk9SKCJsb2NrdXBcbiIpOworCQkgICAJZ290byBvdXRfd2FpdF9yaW5nOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKK291dF93YWl0X3Jpbmc6CisgICAJcmV0dXJuIGl0ZXJzOworfQorCitzdGF0aWMgdm9pZCBpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICpkZXYpCit7CisgICAgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOworCisgICAJcmluZy0+aGVhZCA9IEk4MTBfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKyAgICAgCXJpbmctPnRhaWwgPSBJODEwX1JFQUQoTFBfUklORyArIFJJTkdfVEFJTCk7CisgICAgIAlyaW5nLT5zcGFjZSA9IHJpbmctPmhlYWQgLSAocmluZy0+dGFpbCs4KTsKKyAgICAgCWlmIChyaW5nLT5zcGFjZSA8IDApIHJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2KQoreworICAgICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworICAgCWludCBteV9pZHggPSAyNDsKKyAgIAl1MzIgKmh3X3N0YXR1cyA9ICh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKKyAgIAlpbnQgaTsKKworCWlmIChkbWEtPmJ1Zl9jb3VudCA+IDEwMTkpIHsKKwkgICAJLyogTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgc3RhdHVzIHBhZ2UgZm9yIHRoZSBmcmVlbGlzdCAqLworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkgICAJYnVmX3ByaXYtPmluX3VzZSA9IGh3X3N0YXR1cysrOworCSAgIAlidWZfcHJpdi0+bXlfdXNlX2lkeCA9IG15X2lkeDsKKwkgICAJbXlfaWR4ICs9IDQ7CisKKwkgICAJKmJ1Zl9wcml2LT5pbl91c2UgPSBJODEwX0JVRl9GUkVFOworCisJCWJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCA9IGRybV9pb3JlbWFwKGJ1Zi0+YnVzX2FkZHJlc3MsCisJCQkJCQkJYnVmLT50b3RhbCwgZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgICAgICBkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgIGRybV9pODEwX2luaXRfdCAqaW5pdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisgICAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k4MTBfcHJpdmF0ZV90KSk7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlpZiAocl9saXN0LT5tYXAgJiYKKwkJICAgIHJfbGlzdC0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCisJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0sgKSB7CisJCQlkZXZfcHJpdi0+c2FyZWFfbWFwID0gcl9saXN0LT5tYXA7CisgCQkJYnJlYWs7CisgCQl9CisgCX0KKwlpZiAoIWRldl9wcml2LT5zYXJlYV9tYXApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9wcml2LT5tbWlvX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+bW1pb19tYXApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgbW1pbyBtYXAhXG4iKTsKKwkgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YnVmZmVyc19vZmZzZXQpOworCWlmICghZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgZmluZCBkbWEgYnVmZmVyIG1hcCFcbiIpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisJCSgodTggKilkZXZfcHJpdi0+c2FyZWFfbWFwLT5oYW5kbGUgKworCQkgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisgICAJZGV2X3ByaXYtPnJpbmcuU3RhcnQgPSBpbml0LT5yaW5nX3N0YXJ0OworICAgCWRldl9wcml2LT5yaW5nLkVuZCA9IGluaXQtPnJpbmdfZW5kOworICAgCWRldl9wcml2LT5yaW5nLlNpemUgPSBpbml0LT5yaW5nX3NpemU7CisKKyAgIAlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZHJtX2lvcmVtYXAoZGV2LT5hZ3AtPmJhc2UgKworCQkJCQkJICAgIGluaXQtPnJpbmdfc3RhcnQsCisJCQkJCQkgICAgaW5pdC0+cmluZ19zaXplLCBkZXYpOworCisgICAJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKikgZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJjYW4gbm90IGlvcmVtYXAgdmlydHVhbCBhZGRyZXNzIGZvciIKKwkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CisJICAgCXJldHVybiAtRU5PTUVNOworCX0KKworICAgCWRldl9wcml2LT5yaW5nLnRhaWxfbWFzayA9IGRldl9wcml2LT5yaW5nLlNpemUgLSAxOworCisJZGV2X3ByaXYtPncgPSBpbml0LT53OworCWRldl9wcml2LT5oID0gaW5pdC0+aDsKKwlkZXZfcHJpdi0+cGl0Y2ggPSBpbml0LT5waXRjaDsKKwlkZXZfcHJpdi0+YmFja19vZmZzZXQgPSBpbml0LT5iYWNrX29mZnNldDsKKwlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0ID0gaW5pdC0+ZGVwdGhfb2Zmc2V0OworCWRldl9wcml2LT5mcm9udF9vZmZzZXQgPSBpbml0LT5mcm9udF9vZmZzZXQ7CisKKwlkZXZfcHJpdi0+b3ZlcmxheV9vZmZzZXQgPSBpbml0LT5vdmVybGF5X29mZnNldDsKKwlkZXZfcHJpdi0+b3ZlcmxheV9waHlzaWNhbCA9IGluaXQtPm92ZXJsYXlfcGh5c2ljYWw7CisKKwlkZXZfcHJpdi0+ZnJvbnRfZGkxID0gaW5pdC0+ZnJvbnRfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKwlkZXZfcHJpdi0+YmFja19kaTEgPSBpbml0LT5iYWNrX29mZnNldCB8IGluaXQtPnBpdGNoX2JpdHM7CisJZGV2X3ByaXYtPnppMSA9IGluaXQtPmRlcHRoX29mZnNldCB8IGluaXQtPnBpdGNoX2JpdHM7CisKKyAgIAkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCisgICAJZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkmZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisgICAJaWYgKCFkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJDYW4gbm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorICAgCW1lbXNldChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsIDAsIFBBR0VfU0laRSk7CisgICAJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworCisJSTgxMF9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKyAgIAlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCisgICAJLyogTm93IHdlIG5lZWQgdG8gaW5pdCBvdXIgZnJlZWxpc3QgKi8KKwlpZiAoaTgxMF9mcmVlbGlzdF9pbml0KGRldiwgZGV2X3ByaXYpICE9IDApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzdGF0dXMgcGFnZSBmb3IiCisJCQkgICIgdGhlIGZyZWVsaXN0XG4iKTsKKwkgICAJcmV0dXJuIC1FTk9NRU07CisJfQorCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCisgICAJcmV0dXJuIDA7Cit9CisKKy8qIGk4MTAgRFJNIHZlcnNpb24gMS4xIHVzZWQgYSBzbWFsbGVyIGluaXQgc3RydWN0dXJlIHdpdGggZGlmZmVyZW50CisgKiBvcmRlcmluZyBvZiB2YWx1ZXMgdGhhbiBpcyBjdXJyZW50bHkgdXNlZCAoZHJtID49IDEuMikuIFRoZXJlIGlzCisgKiBubyBkZWZpbmVkIHdheSB0byBkZXRlY3QgdGhlIFhGcmVlIHZlcnNpb24gdG8gY29ycmVjdCB0aGlzIHByb2JsZW0sCisgKiBob3dldmVyIGJ5IGNoZWNraW5nIHVzaW5nIHRoaXMgcHJvY2VkdXJlIHdlIGNhbiBkZXRlY3QgdGhlIGNvcnJlY3QKKyAqIHRoaW5nIHRvIGRvLgorICoKKyAqICMxIFJlYWQgdGhlIFNtYWxsZXIgaW5pdCBzdHJ1Y3R1cmUgZnJvbSB1c2VyLXNwYWNlCisgKiAjMiBWZXJpZnkgdGhlIG92ZXJsYXlfcGh5c2ljYWwgaXMgYSB2YWxpZCBwaHlzaWNhbCBhZGRyZXNzLCBvciBOVUxMCisgKiAgICBJZiBpdCBpc24ndCB0aGVuIHdlIGhhdmUgYSB2MS4xIGNsaWVudC4gRml4IHVwIHBhcmFtcy4KKyAqICAgIElmIGl0IGlzLCB0aGVuIHdlIGhhdmUgYSAxLjIgY2xpZW50Li4uIGdldCB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KKyAqLworc3RhdGljIGludCBpODEwX2RtYV9pbml0X2NvbXBhdChkcm1faTgxMF9pbml0X3QgKmluaXQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCisJLyogR2V0IHYxLjEgaW5pdCBkYXRhICovCisJaWYgKGNvcHlfZnJvbV91c2VyKGluaXQsIChkcm1faTgxMF9wcmUxMl9pbml0X3QgX191c2VyICopYXJnLAorCQkJICBzaXplb2YoZHJtX2k4MTBfcHJlMTJfaW5pdF90KSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCghaW5pdC0+b3ZlcmxheV9waHlzaWNhbCkgfHwgKGluaXQtPm92ZXJsYXlfcGh5c2ljYWwgPiA0MDk2KSkgeworCisJCS8qIFRoaXMgaXMgYSB2MS4yIGNsaWVudCwganVzdCBnZXQgdGhlIHYxLjIgaW5pdCBkYXRhICovCisJCURSTV9JTkZPKCJVc2luZyBQT1NUIHYxLjIgaW5pdC5cbiIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoaW5pdCwgKGRybV9pODEwX2luaXRfdCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKGRybV9pODEwX2luaXRfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisKKwkJLyogVGhpcyBpcyBhIHYxLjEgY2xpZW50LCBmaXggdGhlIHBhcmFtcyAqLworCQlEUk1fSU5GTygiVXNpbmcgUFJFIHYxLjIgaW5pdC5cbiIpOworCSAJaW5pdC0+cGl0Y2hfYml0cyA9IGluaXQtPmg7CisJIAlpbml0LT5waXRjaCA9IGluaXQtPnc7CisJIAlpbml0LT5oID0gaW5pdC0+b3ZlcmxheV9waHlzaWNhbDsKKwkgCWluaXQtPncgPSBpbml0LT5vdmVybGF5X29mZnNldDsKKwkgCWluaXQtPm92ZXJsYXlfcGh5c2ljYWwgPSAwOworCSAJaW5pdC0+b3ZlcmxheV9vZmZzZXQgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZG1hX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKyAgIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2OworICAgCWRybV9pODEwX2luaXRfdCBpbml0OworICAgCWludCByZXRjb2RlID0gMDsKKworCS8qIEdldCBvbmx5IHRoZSBpbml0IGZ1bmMgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGRybV9pODEwX2luaXRfZnVuY190KSkpIAorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgCXN3aXRjaChpbml0LmZ1bmMpIHsKKwkgCWNhc2UgSTgxMF9JTklUX0RNQToKKwkgCSAgICAgICAJLyogVGhpcyBjYXNlIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBJdAorCQkJICogaGFuZGxlcyBYRnJlZSA0LjEuMCBhbmQgNC4yLjAsIGFuZCBoYXMgdG8KKwkJCSAqIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nIGFzIGRlc2NyaWJlZCBiZWxvdy4KKwkJCSAqIEl0IHdpbGwgc29tZWRheSBnbyBhd2F5LgorCQkJICovCisJCQlyZXRjb2RlID0gaTgxMF9kbWFfaW5pdF9jb21wYXQoJmluaXQsIGFyZyk7CisJCQlpZiAocmV0Y29kZSkKKwkJCQlyZXR1cm4gcmV0Y29kZTsKKworCSAgIAkJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV9pODEwX3ByaXZhdGVfdCksCisJCQkJCSAgICAgRFJNX01FTV9EUklWRVIpOworCSAgIAkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJICAgCQlyZXRjb2RlID0gaTgxMF9kbWFfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCAmaW5pdCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCSAJY2FzZSBJODEwX0lOSVRfRE1BXzFfNDoKKwkJCURSTV9JTkZPKCJVc2luZyB2MS40IGluaXQuXG4iKTsKKyAgCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbml0LCAoZHJtX2k4MTBfaW5pdF90IF9fdXNlciAqKWFyZywKKwkJCQkJICBzaXplb2YoZHJtX2k4MTBfaW5pdF90KSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkgICAJCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpLAorCQkJCQkgICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJCWlmIChkZXZfcHJpdiA9PSBOVUxMKSAKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkgICAJCXJldGNvZGUgPSBpODEwX2RtYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJCWJyZWFrOworCisJIAljYXNlIEk4MTBfQ0xFQU5VUF9ETUE6CisJCSAgICAgICAgRFJNX0lORk8oIkRNQSBDbGVhbnVwXG4iKTsKKwkgICAJCXJldGNvZGUgPSBpODEwX2RtYV9jbGVhbnVwKGRldik7CisgICAgICAgICAgICAgIAkgICAJYnJlYWs7CisJfQorCisgICAJcmV0dXJuIHJldGNvZGU7Cit9CisKKworCisvKiBNb3N0IGVmZmljaWVudCB3YXkgdG8gdmVyaWZ5IHN0YXRlIGZvciB0aGUgaTgxMCBpcyBhcyBpdCBpcworICogZW1pdHRlZC4gIE5vbi1jb25mb3JtYW50IHN0YXRlIGlzIHNpbGVudGx5IGRyb3BwZWQuCisgKgorICogVXNlICd2b2xhdGlsZScgJiBsb2NhbCB2YXIgdG1wIHRvIGZvcmNlIHRoZSBlbWl0dGVkIHZhbHVlcyB0byBiZQorICogaWRlbnRpY2FsIHRvIHRoZSB2ZXJpZmllZCBvbmVzLgorICovCitzdGF0aWMgdm9pZCBpODEwRW1pdENvbnRleHRWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUgKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCBqID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggSTgxMF9DVFhfU0VUVVBfU0laRSApOworCisJT1VUX1JJTkcoIEdGWF9PUF9DT0xPUl9GQUNUT1IgKTsKKwlPVVRfUklORyggY29kZVtJODEwX0NUWFJFR19DRjFdICk7CisKKwlPVVRfUklORyggR0ZYX09QX1NUSVBQTEUgKTsKKwlPVVRfUklORyggY29kZVtJODEwX0NUWFJFR19TVDFdICk7CisKKwlmb3IgKCBpID0gNCA7IGkgPCBJODEwX0NUWF9TRVRVUF9TSVpFIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCisJCWlmICgodG1wICYgKDc8PDI5KSkgPT0gKDM8PDI5KSAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkKKwkJeworCQkJT1VUX1JJTkcoIHRtcCApOworCQkJaisrOworCQl9CisJCWVsc2UgcHJpbnRrKCJjb25zdGV4dCBzdGF0ZSBkcm9wcGVkISEhXG4iKTsKKwl9CisKKwlpZiAoaiAmIDEpCisJCU9VVF9SSU5HKCAwICk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgaTgxMEVtaXRUZXhWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCB0bXA7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9MUF9SSU5HKCBJODEwX1RFWF9TRVRVUF9TSVpFICk7CisKKwlPVVRfUklORyggR0ZYX09QX01BUF9JTkZPICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9URVhSRUdfTUkxXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfVEVYUkVHX01JMl0gKTsKKwlPVVRfUklORyggY29kZVtJODEwX1RFWFJFR19NSTNdICk7CisKKwlmb3IgKCBpID0gNCA7IGkgPCBJODEwX1RFWF9TRVRVUF9TSVpFIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCisJCWlmICgodG1wICYgKDc8PDI5KSkgPT0gKDM8PDI5KSAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkKKwkJeworCQkJT1VUX1JJTkcoIHRtcCApOworCQkJaisrOworCQl9CisJCWVsc2UgcHJpbnRrKCJ0ZXh0dXJlIHN0YXRlIGRyb3BwZWQhISFcbiIpOworCX0KKworCWlmIChqICYgMSkKKwkJT1VUX1JJTkcoIDAgKTsKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCisKKy8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGk4MTBFbWl0RGVzdFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MTBfREVTVF9TRVRVUF9TSVpFICsgMiApOworCisJdG1wID0gY29kZVtJODEwX0RFU1RSRUdfREkxXTsKKwlpZiAodG1wID09IGRldl9wcml2LT5mcm9udF9kaTEgfHwgdG1wID09IGRldl9wcml2LT5iYWNrX2RpMSkgeworCQlPVVRfUklORyggQ01EX09QX0RFU1RCVUZGRVJfSU5GTyApOworCQlPVVRfUklORyggdG1wICk7CisJfSBlbHNlCisJICAgRFJNX0RFQlVHKCJiYWQgZGkxICV4IChhbGxvdyAleCBvciAleClcbiIsCisJCSAgICAgdG1wLCBkZXZfcHJpdi0+ZnJvbnRfZGkxLCBkZXZfcHJpdi0+YmFja19kaTEpOworCisJLyogaW52YXJpZW50OgorCSAqLworCU9VVF9SSU5HKCBDTURfT1BfWl9CVUZGRVJfSU5GTyApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+emkxICk7CisKKwlPVVRfUklORyggR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfREVTVFJFR19EVjFdICk7CisKKwlPVVRfUklORyggR0ZYX09QX0RSQVdSRUNUX0lORk8gKTsKKwlPVVRfUklORyggY29kZVtJODEwX0RFU1RSRUdfRFIxXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfREVTVFJFR19EUjJdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9ERVNUUkVHX0RSM10gKTsKKwlPVVRfUklORyggY29kZVtJODEwX0RFU1RSRUdfRFI0XSApOworCU9VVF9SSU5HKCAwICk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGk4MTBFbWl0U3RhdGUoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CisJCisJRFJNX0RFQlVHKCIlcyAleFxuIiwgX19GVU5DVElPTl9fLCBkaXJ0eSk7CisKKwlpZiAoZGlydHkgJiBJODEwX1VQTE9BRF9CVUZGRVJTKSB7CisJCWk4MTBFbWl0RGVzdFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPkJ1ZmZlclN0YXRlICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODEwX1VQTE9BRF9CVUZGRVJTOworCX0KKworCWlmIChkaXJ0eSAmIEk4MTBfVVBMT0FEX0NUWCkgeworCQlpODEwRW1pdENvbnRleHRWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5Db250ZXh0U3RhdGUgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MTBfVVBMT0FEX0NUWDsKKwl9CisKKwlpZiAoZGlydHkgJiBJODEwX1VQTE9BRF9URVgwKSB7CisJCWk4MTBFbWl0VGV4VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4U3RhdGVbMF0gKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MTBfVVBMT0FEX1RFWDA7CisJfQorCisJaWYgKGRpcnR5ICYgSTgxMF9VUExPQURfVEVYMSkgeworCQlpODEwRW1pdFRleFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleFN0YXRlWzFdICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODEwX1VQTE9BRF9URVgxOworCX0KK30KKworCisKKy8qIG5lZWQgdG8gdmVyaWZ5CisgKi8KK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNsZWFyX3p2YWwgKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOworCWludCBjcHAgPSAyOworCWludCBpOworCVJJTkdfTE9DQUxTOworCQorCWlmICggZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxICkgeworCSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOworCSAgICAgICAKKwkJZmxhZ3MgJj0gfihJODEwX0ZST05UIHwgSTgxMF9CQUNLKTsKKwkJaWYgKHRtcCAmIEk4MTBfRlJPTlQpIGZsYWdzIHw9IEk4MTBfQkFDSzsKKwkJaWYgKHRtcCAmIEk4MTBfQkFDSykgZmxhZ3MgfD0gSTgxMF9GUk9OVDsKKwl9CisKKyAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAgICAJaWYgKG5ib3ggPiBJODEwX05SX1NBUkVBX0NMSVBSRUNUUykKKyAgICAgCQluYm94ID0gSTgxMF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG5ib3ggOyBpKyssIHBib3grKykgeworCQl1bnNpZ25lZCBpbnQgeCA9IHBib3gtPngxOworCQl1bnNpZ25lZCBpbnQgeSA9IHBib3gtPnkxOworCQl1bnNpZ25lZCBpbnQgd2lkdGggPSAocGJveC0+eDIgLSB4KSAqIGNwcDsKKwkJdW5zaWduZWQgaW50IGhlaWdodCA9IHBib3gtPnkyIC0geTsKKwkJdW5zaWduZWQgaW50IHN0YXJ0ID0geSAqIHBpdGNoICsgeCAqIGNwcDsKKworCQlpZiAocGJveC0+eDEgPiBwYm94LT54MiB8fAorCQkgICAgcGJveC0+eTEgPiBwYm94LT55MiB8fAorCQkgICAgcGJveC0+eDIgPiBkZXZfcHJpdi0+dyB8fAorCQkgICAgcGJveC0+eTIgPiBkZXZfcHJpdi0+aCkKKwkJCWNvbnRpbnVlOworCisJICAgCWlmICggZmxhZ3MgJiBJODEwX0ZST05UICkgeworCQkJQkVHSU5fTFBfUklORyggNiApOworCQkJT1VUX1JJTkcoIEJSMDBfQklUQkxUX0NMSUVOVCB8CisJCQkJICBCUjAwX09QX0NPTE9SX0JMVCB8IDB4MyApOworCQkJT1VUX1JJTkcoIEJSMTNfU09MSURfUEFUVEVSTiB8ICgweEYwIDw8IDE2KSB8IHBpdGNoICk7CisJCQlPVVRfUklORyggKGhlaWdodCA8PCAxNikgfCB3aWR0aCApOworCQkJT1VUX1JJTkcoIHN0YXJ0ICk7CisJCQlPVVRfUklORyggY2xlYXJfY29sb3IgKTsKKwkJCU9VVF9SSU5HKCAwICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBJODEwX0JBQ0sgKSB7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCQlPVVRfUklORyggQlIwMF9CSVRCTFRfQ0xJRU5UIHwKKwkJCQkgIEJSMDBfT1BfQ09MT1JfQkxUIHwgMHgzICk7CisJCQlPVVRfUklORyggQlIxM19TT0xJRF9QQVRURVJOIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2ggKTsKKwkJCU9VVF9SSU5HKCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICsgc3RhcnQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJT1VUX1JJTkcoIDAgKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CisKKwkJaWYgKCBmbGFncyAmIEk4MTBfREVQVEggKSB7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCQlPVVRfUklORyggQlIwMF9CSVRCTFRfQ0xJRU5UIHwKKwkJCQkgIEJSMDBfT1BfQ09MT1JfQkxUIHwgMHgzICk7CisJCQlPVVRfUklORyggQlIxM19TT0xJRF9QQVRURVJOIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2ggKTsKKwkJCU9VVF9SSU5HKCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX29mZnNldCArIHN0YXJ0ICk7CisJCQlPVVRfUklORyggY2xlYXJfenZhbCApOworCQkJT1VUX1JJTkcoIDAgKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CisJaW50IGNwcCA9IDI7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoInN3YXBidWZmZXJzXG4iKTsKKworICAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgICAgIAlpZiAobmJveCA+IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODEwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveDsgaSsrLCBwYm94KyspCisJeworCQl1bnNpZ25lZCBpbnQgdyA9IHBib3gtPngyIC0gcGJveC0+eDE7CisJCXVuc2lnbmVkIGludCBoID0gcGJveC0+eTIgLSBwYm94LT55MTsKKwkJdW5zaWduZWQgaW50IGRzdCA9IHBib3gtPngxKmNwcCArIHBib3gtPnkxKnBpdGNoOworCQl1bnNpZ25lZCBpbnQgc3RhcnQgPSBkc3Q7CisKKwkJaWYgKHBib3gtPngxID4gcGJveC0+eDIgfHwKKwkJICAgIHBib3gtPnkxID4gcGJveC0+eTIgfHwKKwkJICAgIHBib3gtPngyID4gZGV2X3ByaXYtPncgfHwKKwkJICAgIHBib3gtPnkyID4gZGV2X3ByaXYtPmgpCisJCQljb250aW51ZTsKKworCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCU9VVF9SSU5HKCBCUjAwX0JJVEJMVF9DTElFTlQgfCBCUjAwX09QX1NSQ19DT1BZX0JMVCB8IDB4NCApOworCQlPVVRfUklORyggcGl0Y2ggfCAoMHhDQyA8PCAxNikpOworCQlPVVRfUklORyggKGggPDwgMTYpIHwgKHcgKiBjcHApKTsKKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICsgc3RhcnQpOworCQllbHNlCisJCSAgT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICsgc3RhcnQpOworCQlPVVRfUklORyggcGl0Y2ggKTsKKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+YmFja19vZmZzZXQgKyBzdGFydCk7CisJCWVsc2UKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICsgc3RhcnQpOworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICBpbnQgZGlzY2FyZCwKKwkJCQkgICAgIGludCB1c2VkKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisgICAJZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKyAgIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOworCWludCBpID0gMDsKKyAgIAlSSU5HX0xPQ0FMUzsKKworICAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAJaWYgKG5ib3ggPiBJODEwX05SX1NBUkVBX0NMSVBSRUNUUykKKwkJbmJveCA9IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKHVzZWQgPiA0KjEwMjQpCisJCXVzZWQgPSAwOworCisJaWYgKHNhcmVhX3ByaXYtPmRpcnR5KQorCSAgIGk4MTBFbWl0U3RhdGUoIGRldiApOworCisJaWYgKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MTBfQlVGX01BUFBFRCkgeworCQl1bnNpZ25lZCBpbnQgcHJpbSA9IChzYXJlYV9wcml2LT52ZXJ0ZXhfcHJpbSAmIFBSX01BU0spOworCisJCSoodTMyICopYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsID0gKChHRlhfT1BfUFJJTUlUSVZFIHwgcHJpbSB8ICgodXNlZC80KS0yKSkpOworCisJCWlmICh1c2VkICYgNCkgeworCQkJKih1MzIgKikoKHUzMilidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgKyB1c2VkKSA9IDA7CisJCQl1c2VkICs9IDQ7CisJCX0KKworCQlpODEwX3VubWFwX2J1ZmZlcihidWYpOworCX0KKworCWlmICh1c2VkKSB7CisJCWRvIHsKKwkJCWlmIChpIDwgbmJveCkgeworCQkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQkJT1VUX1JJTkcoIEdGWF9PUF9TQ0lTU09SIHwgU0NfVVBEQVRFX1NDSVNTT1IgfAorCQkJCQkgIFNDX0VOQUJMRSApOworCQkJCU9VVF9SSU5HKCBHRlhfT1BfU0NJU1NPUl9JTkZPICk7CisJCQkJT1VUX1JJTkcoIGJveFtpXS54MSB8IChib3hbaV0ueTE8PDE2KSApOworCQkJCU9VVF9SSU5HKCAoYm94W2ldLngyLTEpIHwgKChib3hbaV0ueTItMSk8PDE2KSApOworCQkJCUFEVkFOQ0VfTFBfUklORygpOworCQkJfQorCisJCQlCRUdJTl9MUF9SSU5HKDQpOworCQkJT1VUX1JJTkcoIENNRF9PUF9CQVRDSF9CVUZGRVIgKTsKKwkJCU9VVF9SSU5HKCBzdGFydCB8IEJCMV9QUk9URUNURUQgKTsKKwkJCU9VVF9SSU5HKCBzdGFydCArIHVzZWQgLSA0ICk7CisJCQlPVVRfUklORyggMCApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisKKwkJfSB3aGlsZSAoKytpIDwgbmJveCk7CisJfQorCisJaWYgKGRpc2NhcmQpIHsKKwkJZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCQkodm9pZCkgY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9DTElFTlQsCisJCQkgICAgICAgSTgxMF9CVUZfSEFSRFdBUkUpOworCisJCUJFR0lOX0xQX1JJTkcoOCk7CisJCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJCU9VVF9SSU5HKCAyMCApOworCQlPVVRfUklORyggZGV2X3ByaXYtPmNvdW50ZXIgKTsKKwkJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5teV91c2VfaWR4ICk7CisJCU9VVF9SSU5HKCBJODEwX0JVRl9GUkVFICk7CisJCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKwkJT1VUX1JJTkcoIDAgKTsKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAgICAgIGRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsIAorCQlfX0ZVTkNUSU9OX18sIAorCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlKTsKKwkKKyAgICAgICAgaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwlCRUdJTl9MUF9SSU5HKCAyICk7CisgICAJT1VUX1JJTkcoIElOU1RfUEFSU0VSX0NMSUVOVCB8IElOU1RfT1BfRkxVU0ggfCBJTlNUX0ZMVVNIX01BUF9DQUNIRSApOyAKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJQkVHSU5fTFBfUklORyggSTgxMF9ERVNUX1NFVFVQX1NJWkUgKyAyICk7CisJLyogT24gaTgxNSBhdCBsZWFzdCBBU1lOQyBpcyBidWdneSAqLworCS8qIHBpdGNoPDw1IGlzIGZyb20gMTEuMi44IHAxNTgsCisJICAgaXRzIHRoZSBwaXRjaCAvIDggdGhlbiBsZWZ0IHNoaWZ0ZWQgOCwKKwkgICBzbyAocGl0Y2ggPj4gMykgPDwgOCAqLworCU9VVF9SSU5HKCBDTURfT1BfRlJPTlRCVUZGRVJfSU5GTyB8IChwaXRjaDw8NSkgLyp8IEFTWU5DX0ZMSVAgKi8gKTsKKwlpZiAoIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCApIHsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOworCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMTsKKwl9IGVsc2UgeworCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X29mZnNldCApOworCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKKwl9CisJT1VUX1JJTkcoMCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlCRUdJTl9MUF9SSU5HKDIpOworCU9VVF9SSU5HKCBDTURfT1BfV0FJVF9GT1JfRVZFTlQgfCBXQUlUX0ZPUl9QTEFORV9BX0ZMSVAgKTsKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJLyogSW5jcmVtZW50IHRoZSBmcmFtZSBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CisJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQorCSAqIHBlcmZvcm1pbmcgdGhlIHN3YXBidWZmZXIgaW9jdGwuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKK30KKworc3RhdGljIHZvaWQgaTgxMF9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCVJJTkdfTE9DQUxTOworCisvKiAgCXByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7ICovCisKKyAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAJQkVHSU5fTFBfUklORyg0KTsKKyAgIAlPVVRfUklORyggSU5TVF9QQVJTRVJfQ0xJRU5UIHwgSU5TVF9PUF9GTFVTSCB8IElOU1RfRkxVU0hfTUFQX0NBQ0hFICk7CisgICAJT1VUX1JJTkcoIENNRF9SRVBPUlRfSEVBRCApOworICAgICAgCU9VVF9SSU5HKCAwICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgIAlBRFZBTkNFX0xQX1JJTkcoKTsKKworCWk4MTBfd2FpdF9yaW5nKCBkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4ICk7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9mbHVzaF9xdWV1ZShkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKyAgIAlpbnQgaSwgcmV0ID0gMDsKKyAgIAlSSU5HX0xPQ0FMUzsKKwkKKy8qICAJcHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKTsgKi8KKworICAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAJQkVHSU5fTFBfUklORygyKTsKKyAgICAgIAlPVVRfUklORyggQ01EX1JFUE9SVF9IRUFEICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlBRFZBTkNFX0xQX1JJTkcoKTsKKworCWk4MTBfd2FpdF9yaW5nKCBkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4ICk7CisKKyAgIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0hBUkRXQVJFLAorCQkJCSAgIEk4MTBfQlVGX0ZSRUUpOworCisJCWlmICh1c2VkID09IEk4MTBfQlVGX0hBUkRXQVJFKQorCQkJRFJNX0RFQlVHKCJyZWNsYWltZWQgZnJvbSBIQVJEV0FSRVxuIik7CisJCWlmICh1c2VkID09IEk4MTBfQlVGX0NMSUVOVCkKKwkJCURSTV9ERUJVRygic3RpbGwgb24gY2xpZW50XG4iKTsKKwl9CisKKyAgIAlyZXR1cm4gcmV0OworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KK3ZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisKKwlpZiAoIWRtYSkgcmV0dXJuOworICAgICAgCWlmICghZGV2LT5kZXZfcHJpdmF0ZSkgcmV0dXJuOworCWlmICghZG1hLT5idWZsaXN0KSByZXR1cm47CisKKyAgICAgICAgaTgxMF9mbHVzaF9xdWV1ZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgeworCQkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0NMSUVOVCwKKwkJCQkJICAgSTgxMF9CVUZfRlJFRSk7CisKKwkJCWlmICh1c2VkID09IEk4MTBfQlVGX0NMSUVOVCkKKwkJCQlEUk1fREVCVUcoInJlY2xhaW1lZCBmcm9tIGNsaWVudFxuIik7CisJCQlpZiAoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgxMF9CVUZfTUFQUEVEKQorCQkgICAgIAkJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODEwX0JVRl9VTk1BUFBFRDsKKwkJfQorCX0KK30KKworaW50IGk4MTBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisgICAJZHJtX2RldmljZV90CSAgKmRldgkgID0gcHJpdi0+aGVhZC0+ZGV2OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKyAgIAlpODEwX2ZsdXNoX3F1ZXVlKGRldik7CisgICAJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpODEwX2RtYV92ZXJ0ZXgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgICAgCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworICAgCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9pODEwX3ZlcnRleF90IHZlcnRleDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdmVydGV4LCAoZHJtX2k4MTBfdmVydGV4X3QgX191c2VyICopYXJnLCBzaXplb2YodmVydGV4KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlEUk1fREVCVUcoImk4MTAgZG1hIHZlcnRleCwgaWR4ICVkIHVzZWQgJWQgZGlzY2FyZCAlZFxuIiwKKwkJICB2ZXJ0ZXguaWR4LCB2ZXJ0ZXgudXNlZCwgdmVydGV4LmRpc2NhcmQpOworCisJaWYgKHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgCisJCXJldHVybiAtRUlOVkFMOworCisJaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KCBkZXYsCisJCQkJICBkbWEtPmJ1Zmxpc3RbIHZlcnRleC5pZHggXSwKKwkJCQkgIHZlcnRleC5kaXNjYXJkLCB2ZXJ0ZXgudXNlZCApOworCisgICAJYXRvbWljX2FkZCh2ZXJ0ZXgudXNlZCwgJmRldi0+Y291bnRzW19EUk1fU1RBVF9TRUNPTkRBUlldKTsKKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1tfRFJNX1NUQVRfRE1BXSk7CisJc2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXItMTsKKyAgIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGk4MTBfY2xlYXJfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9jbGVhcl90IGNsZWFyOworCisgICAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbGVhciwgKGRybV9pODEwX2NsZWFyX3QgX191c2VyICopYXJnLCBzaXplb2YoY2xlYXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworIAkvKiBHSDogU29tZW9uZSdzIGRvaW5nIG5hc3R5IHRoaW5ncy4uLiAqLworIAlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpIHsKKyAJCXJldHVybiAtRUlOVkFMOworIAl9CisKKwlpODEwX2RtYV9kaXNwYXRjaF9jbGVhciggZGV2LCBjbGVhci5mbGFncywKKwkJCQkgY2xlYXIuY2xlYXJfY29sb3IsCisJCQkJIGNsZWFyLmNsZWFyX2RlcHRoICk7CisgICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9zd2FwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKworCURSTV9ERUJVRygiaTgxMF9zd2FwX2J1ZnNcbiIpOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpODEwX2RtYV9kaXNwYXRjaF9zd2FwKCBkZXYgKTsKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX2dldGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisKKyAgICAgIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZ2V0YnVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWludAkJICByZXRjb2RlICAgPSAwOworCWRybV9pODEwX2RtYV90CSAgZDsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmQsIChkcm1faTgxMF9kbWFfdCBfX3VzZXIgKilhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlkLmdyYW50ZWQgPSAwOworCisJcmV0Y29kZSA9IGk4MTBfZG1hX2dldF9idWZmZXIoZGV2LCAmZCwgZmlscCk7CisKKwlEUk1fREVCVUcoImk4MTBfZG1hOiAlZCByZXR1cm5pbmcgJWQsIGdyYW50ZWQgPSAlZFxuIiwKKwkJICBjdXJyZW50LT5waWQsIHJldGNvZGUsIGQuZ3JhbnRlZCk7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fZG1hX3QgX191c2VyICopYXJnLCAmZCwgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgICAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpIGh3X3N0YXR1c1s1XTsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MTBfY29weWJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBOZXZlciBjb3B5IC0gMi40LnggZG9lc24ndCBuZWVkIGl0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kb2NvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBOZXZlciBjb3B5IC0gMi40LnggZG9lc24ndCBuZWVkIGl0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX21jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiwgaW50IHVzZWQsCisJCXVuc2lnbmVkIGludCBsYXN0X3JlbmRlcikKK3sKKwlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YnVzX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3MgLSBkZXYtPmFncC0+YmFzZTsKKwlpbnQgdTsKKwlSSU5HX0xPQ0FMUzsKKworCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJdSA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfQ0xJRU5ULAorCQlJODEwX0JVRl9IQVJEV0FSRSk7CisJaWYgKHUgIT0gSTgxMF9CVUZfQ0xJRU5UKSB7CisJCURSTV9ERUJVRygiTUMgZm91bmQgYnVmZmVyIHRoYXQgaXNuJ3QgbWluZSFcbiIpOworCX0KKworCWlmICh1c2VkID4gNCoxMDI0KQorCQl1c2VkID0gMDsKKworCXNhcmVhX3ByaXYtPmRpcnR5ID0gMHg3ZjsKKworCURSTV9ERUJVRygiZGlzcGF0Y2ggbWMgYWRkciAweCVseCwgdXNlZCAweCV4XG4iLAorCQlhZGRyZXNzLCB1c2VkKTsKKworCWRldl9wcml2LT5jb3VudGVyKys7CisJRFJNX0RFQlVHKCJkaXNwYXRjaCBjb3VudGVyIDogJWxkXG4iLCBkZXZfcHJpdi0+Y291bnRlcik7CisJRFJNX0RFQlVHKCJpODEwX2RtYV9kaXNwYXRjaF9tY1xuIik7CisJRFJNX0RFQlVHKCJzdGFydCA6ICVseFxuIiwgc3RhcnQpOworCURSTV9ERUJVRygidXNlZCA6ICVkXG4iLCB1c2VkKTsKKwlEUk1fREVCVUcoInN0YXJ0ICsgdXNlZCAtIDQgOiAlbGRcbiIsIHN0YXJ0ICsgdXNlZCAtIDQpOworCisJaWYgKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MTBfQlVGX01BUFBFRCkgeworCQlpZiAodXNlZCAmIDQpIHsKKwkJCSoodTMyICopKCh1MzIpYnVmX3ByaXYtPnZpcnR1YWwgKyB1c2VkKSA9IDA7CisJCQl1c2VkICs9IDQ7CisJCX0KKworCQlpODEwX3VubWFwX2J1ZmZlcihidWYpOworCX0KKwlCRUdJTl9MUF9SSU5HKDQpOworCU9VVF9SSU5HKCBDTURfT1BfQkFUQ0hfQlVGRkVSICk7CisJT1VUX1JJTkcoIHN0YXJ0IHwgQkIxX1BST1RFQ1RFRCApOworCU9VVF9SSU5HKCBzdGFydCArIHVzZWQgLSA0ICk7CisJT1VUX1JJTkcoIDAgKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCisJQkVHSU5fTFBfUklORyg4KTsKKwlPVVRfUklORyggQ01EX1NUT1JFX0RXT1JEX0lEWCApOworCU9VVF9SSU5HKCBidWZfcHJpdi0+bXlfdXNlX2lkeCApOworCU9VVF9SSU5HKCBJODEwX0JVRl9GUkVFICk7CisJT1VUX1JJTkcoIDAgKTsKKworCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJT1VUX1JJTkcoIDE2ICk7CisJT1VUX1JJTkcoIGxhc3RfcmVuZGVyICk7CisJT1VUX1JJTkcoIDAgKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIGludCBpODEwX2RtYV9tYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKwlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k4MTBfbWNfdCBtYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbWMsIChkcm1faTgxMF9tY190IF9fdXNlciAqKWFyZywgc2l6ZW9mKG1jKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAobWMuaWR4ID49IGRtYS0+YnVmX2NvdW50IHx8IG1jLmlkeCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaTgxMF9kbWFfZGlzcGF0Y2hfbWMoZGV2LCBkbWEtPmJ1Zmxpc3RbbWMuaWR4XSwgbWMudXNlZCwKKwkJbWMubGFzdF9yZW5kZXIgKTsKKworCWF0b21pY19hZGQobWMudXNlZCwgJmRldi0+Y291bnRzW19EUk1fU1RBVF9TRUNPTkRBUlldKTsKKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1tfRFJNX1NUQVRfRE1BXSk7CisJc2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXItMTsKKwlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9yc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gKGludCkoKCh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSlbNF0pOworfQorCitzdGF0aWMgaW50IGk4MTBfb3YwX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgxMF9vdmVybGF5X3QgZGF0YTsKKworCWRhdGEub2Zmc2V0ID0gZGV2X3ByaXYtPm92ZXJsYXlfb2Zmc2V0OworCWRhdGEucGh5c2ljYWwgPSBkZXZfcHJpdi0+b3ZlcmxheV9waHlzaWNhbDsKKwlpZiAoY29weV90b191c2VyKChkcm1faTgxMF9vdmVybGF5X3QgX191c2VyICopYXJnLCZkYXRhLHNpemVvZihkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZnN0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlyZXR1cm4gSTgxMF9SRUFEKDB4MzAwMDgpOworfQorCitzdGF0aWMgaW50IGk4MTBfb3YwX2ZsaXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJLy9UZWxsIHRoZSBvdmVybGF5IHRvIHVwZGF0ZQorCUk4MTBfV1JJVEUoMHgzMDAwMCxkZXZfcHJpdi0+b3ZlcmxheV9waHlzaWNhbCB8IDB4ODAwMDAwMDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKKyAqLyAKK3N0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQorCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworfQorCitzdGF0aWMgaW50IGk4MTBfZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlpODEwX2RtYV9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX2ZsaXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoIWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSAKKwkJaTgxMF9kb19pbml0X3BhZ2VmbGlwKCBkZXYgKTsKKworCWk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworICAgCXJldHVybiAwOworfQorCit2b2lkIGk4MTBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWk4MTBfZG1hX2NsZWFudXAoIGRldiApOworfQorCit2b2lkIGk4MTBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSB7CisJCQlpODEwX2RvX2NsZWFudXBfcGFnZWZsaXAoZGV2KTsKKwkJfQorCX0KK30KKwordm9pZCBpODEwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpODEwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOworfQorCitpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpODEwX2RtYV9xdWllc2NlbnQoIGRldiApOworCXJldHVybiAwOworfQorCitkcm1faW9jdGxfZGVzY190IGk4MTBfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9JTklUKV0gICAgPSB7IGk4MTBfZG1hX2luaXQsICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1ZFUlRFWCldICA9IHsgaTgxMF9kbWFfdmVydGV4LCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ0xFQVIpXSAgID0geyBpODEwX2NsZWFyX2J1ZnMsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GTFVTSCldICAgPSB7IGk4MTBfZmx1c2hfaW9jdGwsIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0dFVEFHRSldICA9IHsgaTgxMF9nZXRhZ2UsICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfR0VUQlVGKV0gID0geyBpODEwX2dldGJ1ZiwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9TV0FQKV0gICAgPSB7IGk4MTBfc3dhcF9idWZzLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0NPUFkpXSAgICA9IHsgaTgxMF9jb3B5YnVmLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRE9DT1BZKV0gID0geyBpODEwX2RvY29weSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9PVjBJTkZPKV0gPSB7IGk4MTBfb3YwX2luZm8sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZTVEFUVVMpXSA9IHsgaTgxMF9mc3RhdHVzLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfT1YwRkxJUCldID0geyBpODEwX292MF9mbGlwLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9NQyldICAgICAgPSB7IGk4MTBfZG1hX21jLCAgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1JTVEFUVVMpXSA9IHsgaTgxMF9yc3RhdHVzLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRkxJUCldICAgID0geyBpODEwX2ZsaXBfYnVmcywgICAxLCAwIH0KK307CisKK2ludCBpODEwX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk4MTBfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2FjNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCkBAIC0wLDAgKzEsMjg5IEBACisjaWZuZGVmIF9JODEwX0RSTV9IXworI2RlZmluZSBfSTgxMF9EUk1fSF8KKworLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KKyAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgorICovCisKKyNpZm5kZWYgX0k4MTBfREVGSU5FU18KKyNkZWZpbmUgX0k4MTBfREVGSU5FU18KKworI2RlZmluZSBJODEwX0RNQV9CVUZfT1JERVIJCTEyCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9TWiAJCSgxPDxJODEwX0RNQV9CVUZfT1JERVIpCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9OUiAJCTI1NgorI2RlZmluZSBJODEwX05SX1NBUkVBX0NMSVBSRUNUUyAJOAorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJODEwX05SX1RFWF9SRUdJT05TIDY0CisjZGVmaW5lIEk4MTBfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDBJTUFHRSAgMHgxIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODEwX1VQTE9BRF9URVgxSU1BR0UgIDB4MiAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgxMF9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgSTgxMF9VUExPQURfQlVGRkVSUyAgICAweDgKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMCAgICAgICAweDEwCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBJODEwX1VQTE9BRF9DTElQUkVDVFMgIDB4NDAKKworCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworLyogRGVzdGJ1ZmZlciBzdGF0ZSAKKyAqICAgIC0gYmFja2J1ZmZlciBsaW5lYXIgb2Zmc2V0IGFuZCBwaXRjaCAtLSBpbnZhcmllbnQgaW4gdGhlIGN1cnJlbnQgZHJpCisgKiAgICAtIHpidWZmZXIgbGluZWFyIG9mZnNldCBhbmQgcGl0Y2ggLS0gYWxzbyBpbnZhcmllbnQKKyAqICAgIC0gZHJhd2luZyBvcmlnaW4gaW4gYmFjayBhbmQgZGVwdGggYnVmZmVycy4KKyAqCisgKiBLZWVwIHRoZSBkZXB0aC9iYWNrIGJ1ZmZlciBzdGF0ZSBoZXJlIHRvIGFjY29tbW9kYXRlIHByaXZhdGUgYnVmZmVycworICogaW4gdGhlIGZ1dHVyZS4KKyAqLworI2RlZmluZSBJODEwX0RFU1RSRUdfREkwICAwCS8qIENNRF9PUF9ERVNUQlVGRkVSX0lORk8gKDIgZHdvcmRzKSAqLworI2RlZmluZSBJODEwX0RFU1RSRUdfREkxICAxCisjZGVmaW5lIEk4MTBfREVTVFJFR19EVjAgIDIJLyogR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAoMiBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19EVjEgIDMKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMCAgNAkvKiBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAoNCBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjEgIDUKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMiAgNgorI2RlZmluZSBJODEwX0RFU1RSRUdfRFIzICA3CisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjQgIDgKKyNkZWZpbmUgSTgxMF9ERVNUX1NFVFVQX1NJWkUgMTAKKworLyogQ29udGV4dCBzdGF0ZQorICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0NGMCAgIDAJLyogR0ZYX09QX0NPTE9SX0ZBQ1RPUiAqLworI2RlZmluZSBJODEwX0NUWFJFR19DRjEgICAxCQorI2RlZmluZSBJODEwX0NUWFJFR19TVDAgICAyICAgICAvKiBHRlhfT1BfU1RJUFBMRSAqLworI2RlZmluZSBJODEwX0NUWFJFR19TVDEgICAzCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1ZGICAgIDQJLyogR0ZYX09QX1ZFUlRFWF9GTVQgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTVQgICAgNQkvKiBHRlhfT1BfTUFQX1RFWEVMUyAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzAgICA2CS8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMCAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzEgICA3ICAgICAvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUMyICAgOAkvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDIgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUEwICAgOQkvKiBHRlhfT1BfTUFQX0FMUEhBX1NUQUdFUyAtIHN0YWdlIDAgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUExICAgMTAJLyogR0ZYX09QX01BUF9BTFBIQV9TVEFHRVMgLSBzdGFnZSAxICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX01BMiAgIDExCS8qIEdGWF9PUF9NQVBfQUxQSEFfU1RBR0VTIC0gc3RhZ2UgMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19TRE0gICAxMgkvKiBHRlhfT1BfU1JDX0RFU1RfTU9OTyAqLworI2RlZmluZSBJODEwX0NUWFJFR19GT0cgICAxMwkvKiBHRlhfT1BfRk9HX0NPTE9SICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0IxICAgIDE0CS8qIEdGWF9PUF9CT09MXzEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQjIgICAgMTUJLyogR0ZYX09QX0JPT0xfMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19MQ1MgICAxNgkvKiBHRlhfT1BfTElORVdJRFRIX0NVTExfU0hBREVfTU9ERSAqLworI2RlZmluZSBJODEwX0NUWFJFR19QViAgICAxNwkvKiBHRlhfT1BfUFZfUlVMRSAtLSBJbnZhcmllbnQhICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1pBICAgIDE4CS8qIEdGWF9PUF9aQklBU19BTFBIQUZVTkMgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQUEgICAgMTkJLyogR0ZYX09QX0FOVElBTElBUyAqLworI2RlZmluZSBJODEwX0NUWF9TRVRVUF9TSVpFIDIwIAorCisvKiBUZXh0dXJlIHN0YXRlIChwZXIgdGV4IHVuaXQpCisgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkwICAwCS8qIEdGWF9PUF9NQVBfSU5GTyAoNCBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01JMSAgMQkKKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkyICAyCQorI2RlZmluZSBJODEwX1RFWFJFR19NSTMgIDMJCisjZGVmaW5lIEk4MTBfVEVYUkVHX01GICAgNAkvKiBHRlhfT1BfTUFQX0ZJTFRFUiAqLworI2RlZmluZSBJODEwX1RFWFJFR19NTEMgIDUJLyogR0ZYX09QX01BUF9MT0RfQ1RMICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01MTCAgNgkvKiBHRlhfT1BfTUFQX0xPRF9MSU1JVFMgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUNTICA3CS8qIEdGWF9PUF9NQVBfQ09PUkRfU0VUUyA/Pz8gKi8KKyNkZWZpbmUgSTgxMF9URVhfU0VUVVBfU0laRSA4CisKKy8qIEZsYWdzIGZvciBjbGVhciBpb2N0bAorICovCisjZGVmaW5lIEk4MTBfRlJPTlQgICAweDEKKyNkZWZpbmUgSTgxMF9CQUNLICAgIDB4MgorI2RlZmluZSBJODEwX0RFUFRIICAgMHg0CisKK3R5cGVkZWYgZW51bSBfZHJtX2k4MTBfaW5pdF9mdW5jIHsKKwlJODEwX0lOSVRfRE1BID0gMHgwMSwKKwlJODEwX0NMRUFOVVBfRE1BID0gMHgwMiwKKwlJODEwX0lOSVRfRE1BXzFfNCA9IDB4MDMKKyB9IGRybV9pODEwX2luaXRfZnVuY190OworCisvKiBUaGlzIGlzIHRoZSBpbml0IHN0cnVjdHVyZSBhZnRlciB2MS4yICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfaW5pdCB7CisJZHJtX2k4MTBfaW5pdF9mdW5jX3QgZnVuYzsKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OIDwgWEZSRUU4Nl9WRVJTSU9OKDQsMSwwLDApCisJaW50IHJpbmdfbWFwX2lkeDsKKwlpbnQgYnVmZmVyX21hcF9pZHg7CisjZWxzZQorCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisjZW5kaWYKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgb3ZlcmxheV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG92ZXJsYXlfcGh5c2ljYWw7CisJdW5zaWduZWQgaW50IHc7CisJdW5zaWduZWQgaW50IGg7CisJdW5zaWduZWQgaW50IHBpdGNoOworCXVuc2lnbmVkIGludCBwaXRjaF9iaXRzOyAKK30gZHJtX2k4MTBfaW5pdF90OworCisvKiBUaGlzIGlzIHRoZSBpbml0IHN0cnVjdHVyZSBwcmlvciB0byB2MS4yICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfcHJlMTJfaW5pdCB7CisJZHJtX2k4MTBfaW5pdF9mdW5jX3QgZnVuYzsKKwl1bnNpZ25lZCBpbnQgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJ1ZmZlcnNfb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCB3OworCXVuc2lnbmVkIGludCBoOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfYml0czsgCit9IGRybV9pODEwX3ByZTEyX2luaXRfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsgLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1faTgxMF90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9zYXJlYSB7CisgICAJdW5zaWduZWQgaW50IENvbnRleHRTdGF0ZVtJODEwX0NUWF9TRVRVUF9TSVpFXTsKKyAgIAl1bnNpZ25lZCBpbnQgQnVmZmVyU3RhdGVbSTgxMF9ERVNUX1NFVFVQX1NJWkVdOworICAgCXVuc2lnbmVkIGludCBUZXhTdGF0ZVsyXVtJODEwX1RFWF9TRVRVUF9TSVpFXTsKKyAgIAl1bnNpZ25lZCBpbnQgZGlydHk7CisKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbSTgxMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKKwkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgorCSAqIGFnZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSB5b3Ugc2V0LCB0aGVuIHlvdSBhcmUgbWlzdGFrZW4gYW5kCisJICogaXQgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LiAgSWYgZ2xvYmFsIHRleEFnZQorCSAqIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICoKKwkgKiBUaGVzZSByZWdpb25zIGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBmaW5lLWdyYWluZWQKKwkgKiB0ZXh0dXJlIGluZm9ybWF0aW9uIG9mIG90aGVyIGNsaWVudHMgLSBieSBtYWludGFpbmluZyB0aGVtCisJICogaW4gdGhlIHNhbWUgbHJ1IHdoaWNoIGlzIHVzZWQgdG8gYWdlIHRoZWlyIG93biB0ZXh0dXJlcywKKwkgKiBjbGllbnRzIGhhdmUgYW4gYXBwcm94aW1hdGUgbHJ1IGZvciB0aGUgd2hvbGUgb2YgZ2xvYmFsCisJICogdGV4dHVyZSBzcGFjZSwgYW5kIGNhbiBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyBhcyB0byB3aGljaAorCSAqIGFyZWFzIHRvIGtpY2sgb3V0LiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjaG9vc2Ugd2hldGhlciB0bworCSAqIGtpY2sgb3V0IHlvdXIgb3duIHRleHR1cmUgb3Igc29tZW9uZSBlbHNlJ3MgLSBzaW1wbHkgZWplY3QKKwkgKiB0aGVtIGFsbCBpbiBMUlUgb3JkZXIuICAKKwkgKi8KKyAgIAorCWRybV9pODEwX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k4MTBfTlJfVEVYX1JFR0lPTlMrMV07IAorCQkJCS8qIExhc3QgZWx0IGlzIHNlbnRpbmFsICovCisgICAgICAgIGludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKyAgICAgICAgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7ICAgICAvKiAgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisKKwlpbnQgdmVydGV4X3ByaW07CisKKwlpbnQgcGZfZW5hYmxlZDsgICAgICAgICAgICAgICAvKiBpcyBwYWdlZmxpcHBpbmcgYWxsb3dlZD8gKi8KKwlpbnQgcGZfYWN0aXZlOworCWludCBwZl9jdXJyZW50X3BhZ2U7CSAgICAvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworfSBkcm1faTgxMF9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtTWdhLmgpCisgKi8KKworLyogaTgxMCBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JODEwX0lOSVQJCTB4MDAKKyNkZWZpbmUgRFJNX0k4MTBfVkVSVEVYCQkweDAxCisjZGVmaW5lIERSTV9JODEwX0NMRUFSCQkweDAyCisjZGVmaW5lIERSTV9JODEwX0ZMVVNICQkweDAzCisjZGVmaW5lIERSTV9JODEwX0dFVEFHRQkJMHgwNAorI2RlZmluZSBEUk1fSTgxMF9HRVRCVUYJCTB4MDUKKyNkZWZpbmUgRFJNX0k4MTBfU1dBUAkJMHgwNgorI2RlZmluZSBEUk1fSTgxMF9DT1BZCQkweDA3CisjZGVmaW5lIERSTV9JODEwX0RPQ09QWQkJMHgwOAorI2RlZmluZSBEUk1fSTgxMF9PVjBJTkZPCTB4MDkKKyNkZWZpbmUgRFJNX0k4MTBfRlNUQVRVUwkweDBhCisjZGVmaW5lIERSTV9JODEwX09WMEZMSVAJMHgwYgorI2RlZmluZSBEUk1fSTgxMF9NQwkJMHgwYworI2RlZmluZSBEUk1fSTgxMF9SU1RBVFVTCTB4MGQKKyNkZWZpbmUgRFJNX0k4MTBfRkxJUAkJMHgwZQorCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9JTklULCBkcm1faTgxMF9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX1ZFUlRFWAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX1ZFUlRFWCwgZHJtX2k4MTBfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0NMRUFSCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfQ0xFQVIsIGRybV9pODEwX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0ZMVVNICQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRkxVU0gpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0dFVEFHRQkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0dFVEFHRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfR0VUQlVGCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfR0VUQlVGLCBkcm1faTgxMF9kbWFfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfU1dBUAkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0NPUFkJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9DT1BZLCBkcm1faTgxMF9jb3B5X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0RPQ09QWQkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0RPQ09QWSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfT1YwSU5GTwkJRFJNX0lPUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX09WMElORk8sIGRybV9pODEwX292ZXJsYXlfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRlNUQVRVUwkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0ZTVEFUVVMpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX09WMEZMSVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9PVjBGTElQKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9NQwkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX01DLCBkcm1faTgxMF9tY190KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9SU1RBVFVTCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfUlNUQVRVUykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRkxJUCAgICAgICAgICAgICBEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRkxJUCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX2NsZWFyIHsKKwlpbnQgY2xlYXJfY29sb3I7CisJaW50IGNsZWFyX2RlcHRoOworCWludCBmbGFnczsKK30gZHJtX2k4MTBfY2xlYXJfdDsKKworLyogVGhlc2UgbWF5IGJlIHBsYWNlaG9sZGVycyBpZiB3ZSBoYXZlIG1vcmUgY2xpcHJlY3RzIHRoYW4KKyAqIEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTLiAgSW4gdGhhdCBjYXNlLCB0aGUgY2xpZW50IHNldHMgZGlzY2FyZCB0bworICogZmFsc2UsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIHdpbGwgYmUgZGlzcGF0Y2hlZCBhZ2FpbiB3aXRoIGEKKyAqIG5ldyBzZXQgb2YgY2xpcHJlY3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfdmVydGV4IHsKKyAgIAlpbnQgaWR4OwkJLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIGNsaWVudCBpcyBmaW5pc2hlZCB3aXRoIHRoZSBidWZmZXI/ICovCit9IGRybV9pODEwX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfY29weV90IHsKKyAgIAlpbnQgaWR4OwkJLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwl2b2lkICphZGRyZXNzOwkJLyogQWRkcmVzcyB0byBjb3B5IGZyb20gKi8KK30gZHJtX2k4MTBfY29weV90OworCisjZGVmaW5lIFBSX1RSSUFOR0xFUyAgICAgICAgICgweDA8PDE4KQorI2RlZmluZSBQUl9UUklTVFJJUF8wICAgICAgICAoMHgxPDwxOCkKKyNkZWZpbmUgUFJfVFJJU1RSSVBfMSAgICAgICAgKDB4Mjw8MTgpCisjZGVmaW5lIFBSX1RSSUZBTiAgICAgICAgICAgICgweDM8PDE4KQorI2RlZmluZSBQUl9QT0xZR09OICAgICAgICAgICAoMHg0PDwxOCkKKyNkZWZpbmUgUFJfTElORVMgICAgICAgICAgICAgKDB4NTw8MTgpCisjZGVmaW5lIFBSX0xJTkVTVFJJUCAgICAgICAgICgweDY8PDE4KQorI2RlZmluZSBQUl9SRUNUUyAgICAgICAgICAgICAoMHg3PDwxOCkKKyNkZWZpbmUgUFJfTUFTSyAgICAgICAgICAgICAgKDB4Nzw8MTgpCisKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfZG1hIHsKKwl2b2lkICp2aXJ0dWFsOworCWludCByZXF1ZXN0X2lkeDsKKwlpbnQgcmVxdWVzdF9zaXplOworCWludCBncmFudGVkOworfSBkcm1faTgxMF9kbWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX292ZXJsYXlfdCB7CisJdW5zaWduZWQgaW50IG9mZnNldDsgICAgLyogQWRkcmVzcyBvZiB0aGUgT3ZlcmxheSBSZWdzICovCisJdW5zaWduZWQgaW50IHBoeXNpY2FsOworfSBkcm1faTgxMF9vdmVybGF5X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9tYyB7CisJaW50IGlkeDsgICAgICAgICAgICAgICAgLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7ICAgICAgICAgICAgICAgLyogbnIgYnl0ZXMgaW4gdXNlICovCisJaW50IG51bV9ibG9ja3M7ICAgICAgICAgLyogbnVtYmVyIG9mIEdGWEJsb2NrcyAqLworCWludCAqbGVuZ3RoOyAgICAgICAgICAgIC8qIExpc3Qgb2YgbGVuZ3RocyBmb3IgR0ZYQmxvY2tzIChGVVRVUkUpKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9yZW5kZXI7IC8qIExhc3QgUmVuZGVyIFJlcXVlc3QgKi8KK30gZHJtX2k4MTBfbWNfdDsKKworCisjZW5kaWYgLyogX0k4MTBfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1MWIzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogaTgxMF9kcnYuYyAtLSBJODEwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDE6NTY6MjIgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk4MTBfZHJtLmgiCisjaW5jbHVkZSAiaTgxMF9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJLyogaTgxMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCisJZGV2LT5jb3VudGVycyArPSA0OworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKwlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKKwkKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJaTgxMF9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpODEwX2lvY3Rsc1tdOworZXh0ZXJuIGludCBpODEwX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfRE1BX1FVRVVFLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9pODEwX2J1Zl9wcml2X3QpLAorCS5wcmV0YWtlZG93biA9IGk4MTBfZHJpdmVyX3ByZXRha2Vkb3duLAorCS5wcmVyZWxlYXNlID0gaTgxMF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucmVsZWFzZSA9IGk4MTBfZHJpdmVyX3JlbGVhc2UsCisJLmRtYV9xdWllc2NlbnQgPSBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50LAorCS5yZWNsYWltX2J1ZmZlcnMgPSBpODEwX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IGk4MTBfaW9jdGxzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgICAgICA9IHBjaWlkbGlzdCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTgxMF9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBpODEwX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpODEwX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTgxMF9pbml0KTsKK21vZHVsZV9leGl0KGk4MTBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyM2NhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApAQCAtMCwwICsxLDIzNiBAQAorLyogaTgxMF9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIE1hdHJveCBnMjAwL2c0MDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogCSAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKgorICovCisKKyNpZm5kZWYgX0k4MTBfRFJWX0hfCisjZGVmaW5lIF9JODEwX0RSVl9IXworCisvKiBHZW5lcmFsIGN1c3RvbWl6YXRpb246CisgKi8KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCQkiVkEgTGludXggU3lzdGVtcyBJbmMuIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiaTgxMCIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJJbnRlbCBpODEwIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDMwNjA1IgorCisvKiBJbnRlcmZhY2UgaGlzdG9yeQorICoKKyAqIDEuMSAgIC0gWEZyZWU4NiA0LjEKKyAqIDEuMiAgIC0gWHZNQyBpbnRlcmZhY2VzCisgKiAgICAgICAtIFhGcmVlODYgNC4yCisgKiAxLjIuMSAtIERpc2FibGUgY29weWluZyBjb2RlIChsZWF2ZSBzdHViIGlvY3RscyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCisgKiAgICAgICAtIFJlbW92ZSByZXF1aXJlbWVudCBmb3IgaW50ZXJydXB0IChsZWF2ZSBzdHVicyBhZ2FpbikKKyAqIDEuMyAgIC0gQWRkIHBhZ2UgZmxpcHBpbmcuCisgKiAxLjQgICAtIGZpeCBEUk0gaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJNAorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODEwX2J1Zl9wcml2IHsKKyAgIAl1MzIgKmluX3VzZTsKKyAgIAlpbnQgbXlfdXNlX2lkeDsKKwlpbnQgY3VycmVudGx5X21hcHBlZDsKKwl2b2lkICp2aXJ0dWFsOworCXZvaWQgKmtlcm5lbF92aXJ0dWFsOworfSBkcm1faTgxMF9idWZfcHJpdl90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfcmluZ19idWZmZXJ7CisJaW50IHRhaWxfbWFzazsKKwl1bnNpZ25lZCBsb25nIFN0YXJ0OworCXVuc2lnbmVkIGxvbmcgRW5kOworCXVuc2lnbmVkIGxvbmcgU2l6ZTsKKwl1OCAqdmlydHVhbF9zdGFydDsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgc3BhY2U7Cit9IGRybV9pODEwX3JpbmdfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pODEwX3ByaXZhdGUgeworCWRybV9tYXBfdCAqc2FyZWFfbWFwOworCWRybV9tYXBfdCAqbW1pb19tYXA7CisKKwlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2OworICAgCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgcmluZzsKKworICAgICAgCXZvaWQgKmh3X3N0YXR1c19wYWdlOworICAgCXVuc2lnbmVkIGxvbmcgY291bnRlcjsKKworCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOworCisJZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKworCisJdTMyIGZyb250X2RpMSwgYmFja19kaTEsIHppMTsKKworCWludCBiYWNrX29mZnNldDsKKwlpbnQgZGVwdGhfb2Zmc2V0OworCWludCBvdmVybGF5X29mZnNldDsKKwlpbnQgb3ZlcmxheV9waHlzaWNhbDsKKwlpbnQgdywgaDsKKwlpbnQgcGl0Y2g7CisgIAlpbnQgYmFja19waXRjaDsKKwlpbnQgZGVwdGhfcGl0Y2g7CisKKwlpbnQgZG9fYm94ZXM7CisJaW50IGRtYV91c2VkOworCisJaW50IGN1cnJlbnRfcGFnZTsKKwlpbnQgcGFnZV9mbGlwcGluZzsKKworCXdhaXRfcXVldWVfaGVhZF90IGlycV9xdWV1ZTsKKyAgIAlhdG9taWNfdCBpcnFfcmVjZWl2ZWQ7CisgICAJYXRvbWljX3QgaXJxX2VtaXR0ZWQ7CisgIAorICAgICAgICBpbnQgZnJvbnRfb2Zmc2V0OworfSBkcm1faTgxMF9wcml2YXRlX3Q7CisKKwkJCQkvKiBpODEwX2RtYS5jICovCitleHRlcm4gdm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKKworI2RlZmluZSBJODEwX0JBU0UocmVnKQkJKCh1bnNpZ25lZCBsb25nKSBcCisJCQkJZGV2X3ByaXYtPm1taW9fbWFwLT5oYW5kbGUpCisjZGVmaW5lIEk4MTBfQUREUihyZWcpCQkoSTgxMF9CQVNFKHJlZykgKyByZWcpCisjZGVmaW5lIEk4MTBfREVSRUYocmVnKQkJKihfX3ZvbGF0aWxlX18gaW50ICopSTgxMF9BRERSKHJlZykKKyNkZWZpbmUgSTgxMF9SRUFEKHJlZykJCUk4MTBfREVSRUYocmVnKQorI2RlZmluZSBJODEwX1dSSVRFKHJlZyx2YWwpIAlkbyB7IEk4MTBfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSTgxMF9ERVJFRjE2KHJlZykJKihfX3ZvbGF0aWxlX18gdTE2ICopSTgxMF9BRERSKHJlZykKKyNkZWZpbmUgSTgxMF9SRUFEMTYocmVnKQlJODEwX0RFUkVGMTYocmVnKQorI2RlZmluZSBJODEwX1dSSVRFMTYocmVnLHZhbCkJZG8geyBJODEwX0RFUkVGMTYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBJODEwX1ZFUkJPU0UgMAorI2RlZmluZSBSSU5HX0xPQ0FMUwl1bnNpZ25lZCBpbnQgb3V0cmluZywgcmluZ21hc2s7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGNoYXIgKnZpcnQ7CisKKyNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSBkbyB7CQkJCQkJXAorCWlmIChJODEwX1ZFUkJPU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIERSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZCkgaW4gJXNcbiIsIG4sIF9fRlVOQ1RJT05fXyk7CVwKKwlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCBuKjQpCQkJCQlcCisJCWk4MTBfd2FpdF9yaW5nKGRldiwgbio0KTsJCQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG4qNDsJCQkJCVwKKwlvdXRyaW5nID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKKwlyaW5nbWFzayA9IGRldl9wcml2LT5yaW5nLnRhaWxfbWFzazsJCQkJXAorCXZpcnQgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFEVkFOQ0VfTFBfUklORygpIGRvIHsJCQkJICAgICAgICBcCisJaWYgKEk4MTBfVkVSQk9TRSkgRFJNX0RFQlVHKCJBRFZBTkNFX0xQX1JJTkdcbiIpOyAgICAJXAorCWRldl9wcml2LT5yaW5nLnRhaWwgPSBvdXRyaW5nOwkJICAgICAgICAJXAorCUk4MTBfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CSAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE9VVF9SSU5HKG4pIGRvIHsgIAkJCQkgICAgICAgICAgICAgICAgXAorCWlmIChJODEwX1ZFUkJPU0UpIERSTV9ERUJVRygiICAgT1VUX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJXAorCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHZpcnQgKyBvdXRyaW5nKSA9IG47CSAgICAgICAgICAgICAgICBcCisJb3V0cmluZyArPSA0OwkJCQkJICAgICAgICAgICAgICAgIFwKKwlvdXRyaW5nICY9IHJpbmdtYXNrOwkJCSAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKKyNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCisjZGVmaW5lIENNRF9SRVBPUlRfSEVBRAkJCSg3PDwyMykKKyNkZWZpbmUgQ01EX1NUT1JFX0RXT1JEX0lEWAkJKCgweDIxPDwyMykgfCAweDEpCisjZGVmaW5lIENNRF9PUF9CQVRDSF9CVUZGRVIgICgoMHgwPDwyOSl8KDB4MzA8PDIzKXwweDEpCisKKyNkZWZpbmUgSU5TVF9QQVJTRVJfQ0xJRU5UICAgMHgwMDAwMDAwMAorI2RlZmluZSBJTlNUX09QX0ZMVVNIICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIElOU1RfRkxVU0hfTUFQX0NBQ0hFIDB4MDAwMDAwMDEKKworCisjZGVmaW5lIEJCMV9TVEFSVF9BRERSX01BU0sgICAofjB4NykKKyNkZWZpbmUgQkIxX1BST1RFQ1RFRCAgICAgICAgICgxPDwwKQorI2RlZmluZSBCQjFfVU5QUk9URUNURUQgICAgICAgKDA8PDApCisjZGVmaW5lIEJCMl9FTkRfQUREUl9NQVNLICAgICAofjB4NykKKworI2RlZmluZSBJODEwUkVHX0hXU1RBTQkJMHgwMjA5OAorI2RlZmluZSBJODEwUkVHX0lOVF9JREVOVElUWV9SCTB4MDIwYTQKKyNkZWZpbmUgSTgxMFJFR19JTlRfTUFTS19SIAkweDAyMGE4CisjZGVmaW5lIEk4MTBSRUdfSU5UX0VOQUJMRV9SCTB4MDIwYTAKKworI2RlZmluZSBMUF9SSU5HICAgICAJCTB4MjAzMAorI2RlZmluZSBIUF9SSU5HICAgICAJCTB4MjA0MAorI2RlZmluZSBSSU5HX1RBSUwgICAgICAJCTB4MDAKKyNkZWZpbmUgVEFJTF9BRERSCQkweDAwMEZGRkY4CisjZGVmaW5lIFJJTkdfSEVBRCAgICAgIAkJMHgwNAorI2RlZmluZSBIRUFEX1dSQVBfQ09VTlQgICAgIAkweEZGRTAwMDAwCisjZGVmaW5lIEhFQURfV1JBUF9PTkUgICAgICAgCTB4MDAyMDAwMDAKKyNkZWZpbmUgSEVBRF9BRERSICAgICAgICAgICAJMHgwMDFGRkZGQworI2RlZmluZSBSSU5HX1NUQVJUICAgICAJCTB4MDgKKyNkZWZpbmUgU1RBUlRfQUREUiAgICAgICAgICAJMHgwMEZGRkZGOAorI2RlZmluZSBSSU5HX0xFTiAgICAgICAJCTB4MEMKKyNkZWZpbmUgUklOR19OUl9QQUdFUyAgICAgICAJMHgwMDBGRjAwMAorI2RlZmluZSBSSU5HX1JFUE9SVF9NQVNLICAgIAkweDAwMDAwMDA2CisjZGVmaW5lIFJJTkdfUkVQT1JUXzY0SyAgICAgCTB4MDAwMDAwMDIKKyNkZWZpbmUgUklOR19SRVBPUlRfMTI4SyAgICAJMHgwMDAwMDAwNAorI2RlZmluZSBSSU5HX05PX1JFUE9SVCAgICAgIAkweDAwMDAwMDAwCisjZGVmaW5lIFJJTkdfVkFMSURfTUFTSyAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19WQUxJRCAgICAgICAgICAJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX0lOVkFMSUQgICAgICAgIAkweDAwMDAwMDAwCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1IgICAgICAgICAoKDB4Mzw8MjkpfCgweDFjPDwyNCl8KDB4MTA8PDE5KSkKKyNkZWZpbmUgU0NfVVBEQVRFX1NDSVNTT1IgICAgICAgKDB4MTw8MSkKKyNkZWZpbmUgU0NfRU5BQkxFX01BU0sgICAgICAgICAgKDB4MTw8MCkKKyNkZWZpbmUgU0NfRU5BQkxFICAgICAgICAgICAgICAgKDB4MTw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9JTkZPICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MTw8MTYpfCgweDEpKQorI2RlZmluZSBTQ0lfWU1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUlOX01BU0sgICAgICAoMHhmZmZmPDwwKQorI2RlZmluZSBTQ0lfWU1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUFYX01BU0sgICAgICAoMHhmZmZmPDwwKQorCisjZGVmaW5lIEdGWF9PUF9DT0xPUl9GQUNUT1IgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX1NUSVBQTEUgICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4Mzw8MTYpKQorI2RlZmluZSBHRlhfT1BfTUFQX0lORk8gICAgICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfDB4MikKKyNkZWZpbmUgR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4NTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX0RSQVdSRUNUX0lORk8gICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MDw8MTYpfCgweDMpKQorI2RlZmluZSBHRlhfT1BfUFJJTUlUSVZFICAgICAgICAgKCgweDM8PDI5KXwoMHgxZjw8MjQpKQorCisjZGVmaW5lIENNRF9PUF9aX0JVRkZFUl9JTkZPICAgICAoKDB4MDw8MjkpfCgweDE2PDwyMykpCisjZGVmaW5lIENNRF9PUF9ERVNUQlVGRkVSX0lORk8gICAoKDB4MDw8MjkpfCgweDE1PDwyMykpCisjZGVmaW5lIENNRF9PUF9GUk9OVEJVRkZFUl9JTkZPICAoKDB4MDw8MjkpfCgweDE0PDwyMykpCisjZGVmaW5lIENNRF9PUF9XQUlUX0ZPUl9FVkVOVCAgICAoKDB4MDw8MjkpfCgweDAzPDwyMykpCisKKyNkZWZpbmUgQlIwMF9CSVRCTFRfQ0xJRU5UICAgMHg0MDAwMDAwMAorI2RlZmluZSBCUjAwX09QX0NPTE9SX0JMVCAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJSMDBfT1BfU1JDX0NPUFlfQkxUIDB4MTBDMDAwMDAKKyNkZWZpbmUgQlIxM19TT0xJRF9QQVRURVJOICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIFdBSVRfRk9SX1BMQU5FX0FfU0NBTkxJTkVTICgxPDwxKSAKKyNkZWZpbmUgV0FJVF9GT1JfUExBTkVfQV9GTElQICAgICAgKDE8PDIpIAorI2RlZmluZSBXQUlUX0ZPUl9WQkxBTksgKDE8PDMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YWRjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTAsMCArMSwxNTg4IEBACisvKiBpODMwX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTgzMCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDE6NTA6MDEgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqCSAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgkgICAgQWJyYWhhbSB2ZCBNZXJ3ZSA8YWJyYWhhbUAyZDNkLmNvLnphPgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk4MzBfZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2sgcXVldWUgc3VwcG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4JLyogRm9yIEZBU1RDQUxMIG9uIHVubG9ja19wYWdlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgSTgzMF9CVUZfRlJFRQkJMgorI2RlZmluZSBJODMwX0JVRl9DTElFTlQJCTEKKyNkZWZpbmUgSTgzMF9CVUZfSEFSRFdBUkUgICAgICAJMAorCisjZGVmaW5lIEk4MzBfQlVGX1VOTUFQUEVEIDAKKyNkZWZpbmUgSTgzMF9CVUZfTUFQUEVEICAgMQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNCwyKQorI2RlZmluZSBkb3duX3dyaXRlIGRvd24KKyNkZWZpbmUgdXBfd3JpdGUgdXAKKyNlbmRpZgorCitzdGF0aWMgZHJtX2J1Zl90ICppODMwX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQJCSBpOworICAgCWludCAJCSB1c2VkOworICAgCisJLyogTGluZWFyIHNlYXJjaCBtaWdodCBub3QgYmUgdGhlIGJlc3Qgc29sdXRpb24gKi8KKworICAgCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJICAgCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJICAgCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCisJICAgCXVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0ZSRUUsIAorCQkJICAgICAgIEk4MzBfQlVGX0NMSUVOVCk7CisJICAgCWlmKHVzZWQgPT0gSTgzMF9CVUZfRlJFRSkgeworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCX0KKyAgIAlyZXR1cm4gTlVMTDsKK30KKworLyogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIGJ1ZmZlciBpcyBub3Qgc2VudCB0byB0aGUgaGFyZHdhcmUKKyAqIHlldCwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgaW4gdXNlIGZvciB1cyBvbmNlIGl0cyBvbiB0aGUgcmluZyBidWZmZXIuCisgKi8KKworc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYpCit7CisgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgCWludCB1c2VkOworICAgCisgICAJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCisgICAJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfQ0xJRU5ULCBJODMwX0JVRl9GUkVFKTsKKyAgIAlpZih1c2VkICE9IEk4MzBfQlVGX0NMSUVOVCkgeworCSAgIAlEUk1fRVJST1IoIkZyZWVpbmcgYnVmZmVyIHRoYXRzIG5vdCBpbiB1c2UgOiAlZFxuIiwgYnVmLT5pZHgpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisgICAKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgzMF9idWZmZXJfZm9wcyA9IHsKKwkub3BlbgkgPSBkcm1fb3BlbiwKKwkuZmx1c2gJID0gZHJtX2ZsdXNoLAorCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJLmlvY3RsCSA9IGRybV9pb2N0bCwKKwkubW1hcAkgPSBpODMwX21tYXBfYnVmZmVycywKKwkuZmFzeW5jICA9IGRybV9mYXN5bmMsCit9OworCitpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJICAgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgICAqZGV2OworCWRybV9pODMwX3ByaXZhdGVfdCAgKmRldl9wcml2OworCWRybV9idWZfdCAgICAgICAgICAgKmJ1ZjsKKwlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdjsKKworCWxvY2tfa2VybmVsKCk7CisJZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJYnVmICAgICAgPSBkZXZfcHJpdi0+bW1hcF9idWZmZXI7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgCisJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9ET05UQ09QWSk7CisJdm1hLT52bV9maWxlID0gZmlscDsKKyAgIAorICAgCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgzMF9CVUZfTUFQUEVEOworCXVubG9ja19rZXJuZWwoKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICBWTV9PRkZTRVQodm1hKSA+PiBQQUdFX1NISUZULAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOworCXVuc2lnbmVkIGxvbmcgdmlydHVhbDsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlpZihidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9PSBJODMwX0JVRl9NQVBQRUQpIHJldHVybiAtRUlOVkFMOworCisJZG93bl93cml0ZSggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworCW9sZF9mb3BzID0gZmlscC0+Zl9vcDsKKwlmaWxwLT5mX29wID0gJmk4MzBfYnVmZmVyX2ZvcHM7CisJZGV2X3ByaXYtPm1tYXBfYnVmZmVyID0gYnVmOworCXZpcnR1YWwgPSBkb19tbWFwKGZpbHAsIDAsIGJ1Zi0+dG90YWwsIFBST1RfUkVBRHxQUk9UX1dSSVRFLAorCQkJICAgIE1BUF9TSEFSRUQsIGJ1Zi0+YnVzX2FkZHJlc3MpOworCWRldl9wcml2LT5tbWFwX2J1ZmZlciA9IE5VTEw7CisJZmlscC0+Zl9vcCA9IG9sZF9mb3BzOworCWlmIChJU19FUlIoKHZvaWQgKil2aXJ0dWFsKSkgewkJLyogdWdoICovCisJCS8qIFJlYWwgZXJyb3IgKi8KKwkJRFJNX0VSUk9SKCJtbWFwIGVycm9yXG4iKTsKKwkJcmV0Y29kZSA9IHZpcnR1YWw7CisJCWJ1Zl9wcml2LT52aXJ0dWFsID0gTlVMTDsKKwl9IGVsc2UgeworCQlidWZfcHJpdi0+dmlydHVhbCA9ICh2b2lkIF9fdXNlciAqKXZpcnR1YWw7CisJfQorCXVwX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODMwX3VubWFwX2J1ZmZlcihkcm1fYnVmX3QgKmJ1ZikKK3sKKwlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgIT0gSTgzMF9CVUZfTUFQUEVEKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldGNvZGUgPSBkb19tdW5tYXAoY3VycmVudC0+bW0sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnVmX3ByaXYtPnZpcnR1YWwsCisJCQkgICAgKHNpemVfdCkgYnVmLT50b3RhbCk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKyAgIAlidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9IEk4MzBfQlVGX1VOTUFQUEVEOworICAgCWJ1Zl9wcml2LT52aXJ0dWFsID0gTlVMTDsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9pODMwX2RtYV90ICpkLCAKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fYnVmX3QJICAqYnVmOworCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWludCByZXRjb2RlID0gMDsKKworCWJ1ZiA9IGk4MzBfZnJlZWxpc3RfZ2V0KGRldik7CisJaWYgKCFidWYpIHsKKwkJcmV0Y29kZSA9IC1FTk9NRU07CisJICAgCURSTV9ERUJVRygicmV0Y29kZT0lZFxuIiwgcmV0Y29kZSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKyAgIAorCXJldGNvZGUgPSBpODMwX21hcF9idWZmZXIoYnVmLCBmaWxwKTsKKwlpZihyZXRjb2RlKSB7CisJCWk4MzBfZnJlZWxpc3RfcHV0KGRldiwgYnVmKTsKKwkgICAJRFJNX0VSUk9SKCJtYXBidWYgZmFpbGVkLCByZXRjb2RlICVkXG4iLCByZXRjb2RlKTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorCWJ1Zi0+ZmlscCA9IGZpbHA7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwkKKwlkLT5ncmFudGVkID0gMTsKKyAgIAlkLT5yZXF1ZXN0X2lkeCA9IGJ1Zi0+aWR4OworICAgCWQtPnJlcXVlc3Rfc2l6ZSA9IGJ1Zi0+dG90YWw7CisgICAJZC0+dmlydHVhbCA9IGJ1Zl9wcml2LT52aXJ0dWFsOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSBkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJaW50IGk7CisJICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAgIAkJKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCSAgIAorCSAgIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCkgeworCQkgICAJZHJtX2lvcmVtYXBmcmVlKCh2b2lkICopIGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQsCisJCQkJCSBkZXZfcHJpdi0+cmluZy5TaXplLCBkZXYpOworCQl9CisJICAgCWlmIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCSAgICBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsCisJCQkJCSAgICBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwkJICAgCS8qIE5lZWQgdG8gcmV3cml0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZSAqLworCQkgICAJSTgzMF9XUklURSgweDAyMDgwLCAweDFmZmZmMDAwKTsKKwkJfQorCisJICAgCWRybV9mcmVlKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1faTgzMF9wcml2YXRlX3QpLCAKKwkJCSBEUk1fTUVNX0RSSVZFUik7CisJICAgCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCisJCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCQkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkJaWYgKCBidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgJiYgYnVmLT50b3RhbCApCisJCQkJZHJtX2lvcmVtYXBmcmVlKGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCwgYnVmLT50b3RhbCwgZGV2KTsKKwkJfQorCX0KKyAgIAlyZXR1cm4gMDsKK30KKworaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKKyAgIAlpbnQgaXRlcnMgPSAwOworICAgCXVuc2lnbmVkIGxvbmcgZW5kOworCXVuc2lnbmVkIGludCBsYXN0X2hlYWQgPSBJODMwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisKKwllbmQgPSBqaWZmaWVzICsgKEhaKjMpOworICAgCXdoaWxlIChyaW5nLT5zcGFjZSA8IG4pIHsJCisJICAgCXJpbmctPmhlYWQgPSBJODMwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworCQlpZiAocmluZy0+c3BhY2UgPCAwKSByaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCSAgIAorCQlpZiAocmluZy0+aGVhZCAhPSBsYXN0X2hlYWQpIHsKKwkJCWVuZCA9IGppZmZpZXMgKyAoSFoqMyk7CisJCQlsYXN0X2hlYWQgPSByaW5nLT5oZWFkOworCQl9CisJICAKKwkgICAJaXRlcnMrKzsKKwkJaWYodGltZV9iZWZvcmUoZW5kLCBqaWZmaWVzKSkgeworCQkgICAJRFJNX0VSUk9SKCJzcGFjZTogJWQgd2FudGVkICVkXG4iLCByaW5nLT5zcGFjZSwgbik7CisJCSAgIAlEUk1fRVJST1IoImxvY2t1cFxuIik7CisJCSAgIAlnb3RvIG91dF93YWl0X3Jpbmc7CisJCX0KKwkJdWRlbGF5KDEpOworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9XQUlUOworCX0KKworb3V0X3dhaXRfcmluZzogICAKKyAgIAlyZXR1cm4gaXRlcnM7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgICAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisgICAgICAKKyAgIAlyaW5nLT5oZWFkID0gSTgzMF9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworICAgICAJcmluZy0+dGFpbCA9IEk4MzBfUkVBRChMUF9SSU5HICsgUklOR19UQUlMKSAmIFRBSUxfQUREUjsKKyAgICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworICAgICAJaWYgKHJpbmctPnNwYWNlIDwgMCkgcmluZy0+c3BhY2UgKz0gcmluZy0+U2l6ZTsKKworCWlmIChyaW5nLT5oZWFkID09IHJpbmctPnRhaWwpCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX1JJTkdfRU1QVFk7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2KQoreworICAgICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworICAgCWludCBteV9pZHggPSAzNjsKKyAgIAl1MzIgKmh3X3N0YXR1cyA9ICh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKKyAgIAlpbnQgaTsKKworICAgCWlmKGRtYS0+YnVmX2NvdW50ID4gMTAxOSkgeworCSAgIAkvKiBOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzdGF0dXMgcGFnZSBmb3IgdGhlIGZyZWVsaXN0ICovCisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKworICAgCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJICAgCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJICAgCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCSAgIAlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CisJICAgCWJ1Zl9wcml2LT5teV91c2VfaWR4ID0gbXlfaWR4OworCSAgIAlteV9pZHggKz0gNDsKKworCSAgIAkqYnVmX3ByaXYtPmluX3VzZSA9IEk4MzBfQlVGX0ZSRUU7CisKKwkJYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsID0gZHJtX2lvcmVtYXAoYnVmLT5idXNfYWRkcmVzcywgCisJCQkJCQkJYnVmLT50b3RhbCwgZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKmRldiwgCisJCQkgICAgICAgZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgICBkcm1faTgzMF9pbml0X3QgKmluaXQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworICAgCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pODMwX3ByaXZhdGVfdCkpOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJaWYoIHJfbGlzdC0+bWFwICYmCisJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgorCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgeworCQkJZGV2X3ByaXYtPnNhcmVhX21hcCA9IHJfbGlzdC0+bWFwOworIAkJCWJyZWFrOworIAkJfQorIAl9CisKKwlpZighZGV2X3ByaXYtPnNhcmVhX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X3ByaXYtPm1taW9fbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPm1taW9fbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpODMwX2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIG1taW8gbWFwIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwlpZighZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBkbWEgYnVmZmVyIG1hcCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopCisJCSgodTggKilkZXZfcHJpdi0+c2FyZWFfbWFwLT5oYW5kbGUgKworCQkgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisgICAJZGV2X3ByaXYtPnJpbmcuU3RhcnQgPSBpbml0LT5yaW5nX3N0YXJ0OworICAgCWRldl9wcml2LT5yaW5nLkVuZCA9IGluaXQtPnJpbmdfZW5kOworICAgCWRldl9wcml2LT5yaW5nLlNpemUgPSBpbml0LT5yaW5nX3NpemU7CisKKyAgIAlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZHJtX2lvcmVtYXAoZGV2LT5hZ3AtPmJhc2UgKyAKKwkJCQkJCSAgICBpbml0LT5yaW5nX3N0YXJ0LCAKKwkJCQkJCSAgICBpbml0LT5yaW5nX3NpemUsIGRldik7CisKKyAgIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9PSBOVUxMKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKSBkZXZfcHJpdjsKKwkgICAJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgorCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKKwkgICAJcmV0dXJuIC1FTk9NRU07CisJfQorCisgICAJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0gZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDE7CisgICAKKwlkZXZfcHJpdi0+dyA9IGluaXQtPnc7CisJZGV2X3ByaXYtPmggPSBpbml0LT5oOworCWRldl9wcml2LT5waXRjaCA9IGluaXQtPnBpdGNoOworCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5kZXB0aF9vZmZzZXQgPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X29mZnNldCA9IGluaXQtPmZyb250X29mZnNldDsKKworCWRldl9wcml2LT5mcm9udF9kaTEgPSBpbml0LT5mcm9udF9vZmZzZXQgfCBpbml0LT5waXRjaF9iaXRzOworCWRldl9wcml2LT5iYWNrX2RpMSA9IGluaXQtPmJhY2tfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKwlkZXZfcHJpdi0+emkxID0gaW5pdC0+ZGVwdGhfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKworCURSTV9ERUJVRygiZnJvbnRfZGkxICV4XG4iLCAgICBkZXZfcHJpdi0+ZnJvbnRfZGkxKTsKKwlEUk1fREVCVUcoImJhY2tfb2Zmc2V0ICV4XG4iLCBkZXZfcHJpdi0+YmFja19vZmZzZXQpOworCURSTV9ERUJVRygiYmFja19kaTEgJXhcbiIsICAgIGRldl9wcml2LT5iYWNrX2RpMSk7CisJRFJNX0RFQlVHKCJwaXRjaF9iaXRzICV4XG4iLCAgICBpbml0LT5waXRjaF9iaXRzKTsKKworCWRldl9wcml2LT5jcHAgPSBpbml0LT5jcHA7CisJLyogV2UgYXJlIHVzaW5nIHNlcGFyYXRlIHZhbHVlcyBhcyBwbGFjZWhvbGRlcnMgZm9yIG1lY2hhbmlzbXMgZm9yCisJICogcHJpdmF0ZSBiYWNrYnVmZmVyL2RlcHRoYnVmZmVyIHVzYWdlLgorCSAqLworCisJZGV2X3ByaXYtPmJhY2tfcGl0Y2ggPSBpbml0LT5iYWNrX3BpdGNoOworCWRldl9wcml2LT5kZXB0aF9waXRjaCA9IGluaXQtPmRlcHRoX3BpdGNoOworCWRldl9wcml2LT5kb19ib3hlcyA9IDA7CisJZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCA9IDA7CisKKyAgIAkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCisgICAJZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkmZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisgICAJaWYgKCFkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJDYW4gbm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorICAgCW1lbXNldChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsIDAsIFBBR0VfU0laRSk7CisJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworICAgCisgICAJSTgzMF9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworICAgCisgICAJLyogTm93IHdlIG5lZWQgdG8gaW5pdCBvdXIgZnJlZWxpc3QgKi8KKyAgIAlpZihpODMwX2ZyZWVsaXN0X2luaXQoZGV2LCBkZXZfcHJpdikgIT0gMCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHN0YXR1cyBwYWdlIGZvciIKKwkJCSAgIiB0aGUgZnJlZWxpc3RcbiIpOworCSAgIAlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2RtYV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisgICAJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKyAgIAlkcm1faTgzMF9pbml0X3QgaW5pdDsKKyAgIAlpbnQgcmV0Y29kZSA9IDA7CisJCisgIAlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQsICh2b2lkICogX191c2VyKSBhcmcsIHNpemVvZihpbml0KSkpCisJCXJldHVybiAtRUZBVUxUOworCQorICAgCXN3aXRjaChpbml0LmZ1bmMpIHsKKwkgCWNhc2UgSTgzMF9JTklUX0RNQToKKwkJCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1faTgzMF9wcml2YXRlX3QpLCAKKwkJCQkJICAgICAgRFJNX01FTV9EUklWRVIpOworCSAgIAkJaWYoZGV2X3ByaXYgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CisJICAgCQlyZXRjb2RlID0gaTgzMF9kbWFfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCAmaW5pdCk7CisJICAgCWJyZWFrOworCSAJY2FzZSBJODMwX0NMRUFOVVBfRE1BOgorCSAgIAkJcmV0Y29kZSA9IGk4MzBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJYnJlYWs7CisJIAlkZWZhdWx0OgorCSAgIAkJcmV0Y29kZSA9IC1FSU5WQUw7CisJICAgCWJyZWFrOworCX0KKyAgIAorICAgCXJldHVybiByZXRjb2RlOworfQorCisjZGVmaW5lIEdGWF9PUF9TVElQUExFICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODM8PDE2KSkKKyNkZWZpbmUgU1QxX0VOQUJMRSAgICAgICAgICAgICAgICgxPDwxNikKKyNkZWZpbmUgU1QxX01BU0sgICAgICAgICAgICAgICAgICgweGZmZmYpCisKKy8qIE1vc3QgZWZmaWNpZW50IHdheSB0byB2ZXJpZnkgc3RhdGUgZm9yIHRoZSBpODMwIGlzIGFzIGl0IGlzCisgKiBlbWl0dGVkLiAgTm9uLWNvbmZvcm1hbnQgc3RhdGUgaXMgc2lsZW50bHkgZHJvcHBlZC4KKyAqLworc3RhdGljIHZvaWQgaTgzMEVtaXRDb250ZXh0VmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb2RlICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgaiA9IDA7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MzBfQ1RYX1NFVFVQX1NJWkUgKyA0ICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBJODMwX0NUWFJFR19CTEVORENPTFIwIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCQlpZiAoKHRtcCAmICg3PDwyOSkpID09IENNRF8zRCAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkgeworCQkJT1VUX1JJTkcoIHRtcCApOyAKKwkJCWorKzsKKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigiU2tpcHBpbmcgJWRcbiIsIGkpOworCQl9CisJfQorCisJT1VUX1JJTkcoIFNUQVRFM0RfQ09OU1RfQkxFTkRfQ09MT1JfQ01EICk7IAorCU9VVF9SSU5HKCBjb2RlW0k4MzBfQ1RYUkVHX0JMRU5EQ09MUl0gKTsgCisJaiArPSAyOworCisJZm9yICggaSA9IEk4MzBfQ1RYUkVHX1ZGIDsgaSA8IEk4MzBfQ1RYUkVHX01DU0IwIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCQlpZiAoKHRtcCAmICg3PDwyOSkpID09IENNRF8zRCAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkgeworCQkJT1VUX1JJTkcoIHRtcCApOyAKKwkJCWorKzsKKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigiU2tpcHBpbmcgJWRcbiIsIGkpOworCQl9CisJfQorCisJT1VUX1JJTkcoIFNUQVRFM0RfTUFQX0NPT1JEX1NFVEJJTkRfQ01EICk7IAorCU9VVF9SSU5HKCBjb2RlW0k4MzBfQ1RYUkVHX01DU0IxXSApOyAKKwlqICs9IDI7CisKKwlpZiAoaiAmIDEpIAorCQlPVVRfUklORyggMCApOyAKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpjb2RlICkgCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCB0bXA7CisJUklOR19MT0NBTFM7CisKKwlpZiAoY29kZVtJODMwX1RFWFJFR19NSTBdID09IEdGWF9PUF9NQVBfSU5GTyB8fAorCSAgICAoY29kZVtJODMwX1RFWFJFR19NSTBdICYgfigweGYqTE9BRF9URVhUVVJFX01BUDApKSA9PSAKKwkgICAgKFNUQVRFM0RfTE9BRF9TVEFURV9JTU1FRElBVEVfMnw0KSkgeworCisJCUJFR0lOX0xQX1JJTkcoIEk4MzBfVEVYX1NFVFVQX1NJWkUgKTsKKworCQlPVVRfUklORyggY29kZVtJODMwX1RFWFJFR19NSTBdICk7IC8qIFRNMExJICovCisJCU9VVF9SSU5HKCBjb2RlW0k4MzBfVEVYUkVHX01JMV0gKTsgLyogVE0wUzAgKi8KKwkJT1VUX1JJTkcoIGNvZGVbSTgzMF9URVhSRUdfTUkyXSApOyAvKiBUTTBTMSAqLworCQlPVVRfUklORyggY29kZVtJODMwX1RFWFJFR19NSTNdICk7IC8qIFRNMFMyICovCisJCU9VVF9SSU5HKCBjb2RlW0k4MzBfVEVYUkVHX01JNF0gKTsgLyogVE0wUzMgKi8KKwkJT1VUX1JJTkcoIGNvZGVbSTgzMF9URVhSRUdfTUk1XSApOyAvKiBUTTBTNCAqLworCQkKKwkJZm9yICggaSA9IDYgOyBpIDwgSTgzMF9URVhfU0VUVVBfU0laRSA7IGkrKyApIHsKKwkJCXRtcCA9IGNvZGVbaV07CisJCQlPVVRfUklORyggdG1wICk7IAorCQkJaisrOworCQl9IAorCisJCWlmIChqICYgMSkgCisJCQlPVVRfUklORyggMCApOyAKKworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9CisJZWxzZQorCQlwcmludGsoInJlamVjdGVkIHBhY2tldCAleFxuIiwgY29kZVswXSk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsIAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqY29kZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCBqID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJaWYgKCFudW0pCisJCXJldHVybjsKKworCUJFR0lOX0xQX1JJTkcoIG51bSArIDEgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG51bSA7IGkrKyApIHsKKwkJdG1wID0gY29kZVtpXTsKKwkJT1VUX1JJTkcoIHRtcCApOworCQlqKys7CisJfQorCisJaWYgKGogJiAxKSAKKwkJT1VUX1JJTkcoIDAgKTsgCisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhQYWxldHRlKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgICAgICAgdW5zaWduZWQgaW50ICpwYWxldHRlLAorCQkJICAgICAgICBpbnQgbnVtYmVyLAorCQkJICAgICAgICBpbnQgaXNfc2hhcmVkICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKworCXJldHVybjsKKworCUJFR0lOX0xQX1JJTkcoIDI1OCApOworCisJaWYoaXNfc2hhcmVkID09IDEpIHsKKwkJT1VUX1JJTkcoQ01EX09QX01BUF9QQUxFVFRFX0xPQUQgfAorCQkJIE1BUF9QQUxFVFRFX05VTSgwKSB8CisJCQkgTUFQX1BBTEVUVEVfQk9USCk7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoQ01EX09QX01BUF9QQUxFVFRFX0xPQUQgfCBNQVBfUEFMRVRURV9OVU0obnVtYmVyKSk7CisJfQorCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCU9VVF9SSU5HKHBhbGV0dGVbaV0pOworCX0KKwlPVVRfUklORygwKTsKKwkvKiBLVzogIFdIRVJFIElTIFRIRSBBRFZBTkNFX0xQX1JJTkc/ICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgbm9vcCEgCisJICovCit9CisKKy8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGk4MzBFbWl0RGVzdFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwgCisJCQkJICB1bnNpZ25lZCBpbnQgKmNvZGUgKSAKK3sJCisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MzBfREVTVF9TRVRVUF9TSVpFICsgMTAgKTsKKworCisJdG1wID0gY29kZVtJODMwX0RFU1RSRUdfQ0JVRkFERFJdOworCWlmICh0bXAgPT0gZGV2X3ByaXYtPmZyb250X2RpMSB8fCB0bXAgPT0gZGV2X3ByaXYtPmJhY2tfZGkxKSB7CisJCWlmICgoKGludClvdXRyaW5nKSAmIDgpIHsKKwkJCU9VVF9SSU5HKDApOworCQkJT1VUX1JJTkcoMCk7CisJCX0KKworCQlPVVRfUklORyggQ01EX09QX0RFU1RCVUZGRVJfSU5GTyApOworCQlPVVRfUklORyggQlVGXzNEX0lEX0NPTE9SX0JBQ0sgfCAKKwkJCSAgQlVGXzNEX1BJVENIKGRldl9wcml2LT5iYWNrX3BpdGNoICogZGV2X3ByaXYtPmNwcCkgfAorCQkJICBCVUZfM0RfVVNFX0ZFTkNFKTsKKwkJT1VUX1JJTkcoIHRtcCApOworCQlPVVRfUklORyggMCApOworCisJCU9VVF9SSU5HKCBDTURfT1BfREVTVEJVRkZFUl9JTkZPICk7CisJCU9VVF9SSU5HKCBCVUZfM0RfSURfREVQVEggfCBCVUZfM0RfVVNFX0ZFTkNFIHwgCisJCQkgIEJVRl8zRF9QSVRDSChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggKiBkZXZfcHJpdi0+Y3BwKSk7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+emkxICk7CisJCU9VVF9SSU5HKCAwICk7CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJiYWQgZGkxICV4IChhbGxvdyAleCBvciAleClcbiIsCisJCQkgIHRtcCwgZGV2X3ByaXYtPmZyb250X2RpMSwgZGV2X3ByaXYtPmJhY2tfZGkxKTsKKwl9CisKKwkvKiBpbnZhcmllbnQ6CisJICovCisKKworCU9VVF9SSU5HKCBHRlhfT1BfREVTVEJVRkZFUl9WQVJTICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX0RWMV0gKTsKKworCU9VVF9SSU5HKCBHRlhfT1BfRFJBV1JFQ1RfSU5GTyApOworCU9VVF9SSU5HKCBjb2RlW0k4MzBfREVTVFJFR19EUjFdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX0RSMl0gKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfRFIzXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MzBfREVTVFJFR19EUjRdICk7CisKKwkvKiBOZWVkIHRvIHZlcmlmeSB0aGlzICovCisJdG1wID0gY29kZVtJODMwX0RFU1RSRUdfU0VOQUJMRV07CisJaWYoKHRtcCAmIH4weDMpID09IEdGWF9PUF9TQ0lTU09SX0VOQUJMRSkgeworCQlPVVRfUklORyggdG1wICk7CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJiYWQgc2Npc3NvciBlbmFibGVcbiIpOworCQlPVVRfUklORyggMCApOworCX0KKworCU9VVF9SSU5HKCBHRlhfT1BfU0NJU1NPUl9SRUNUICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX1NSMV0gKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfU1IyXSApOworCU9VVF9SSU5HKCAwICk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgaTgzMEVtaXRTdGlwcGxlVmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LCAKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqY29kZSApIAoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggMiApOworCU9VVF9SSU5HKCBHRlhfT1BfU1RJUFBMRSApOworCU9VVF9SSU5HKCBjb2RlWzFdICk7CisJQURWQU5DRV9MUF9SSU5HKCk7CQorfQorCisKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RhdGUoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CisKKwlEUk1fREVCVUcoIiVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIGRpcnR5KTsKKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0JVRkZFUlMpIHsKKwkJaTgzMEVtaXREZXN0VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+QnVmZmVyU3RhdGUgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX0JVRkZFUlM7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfQ1RYKSB7CisJCWk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPkNvbnRleHRTdGF0ZSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfQ1RYOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWDApIHsKKwkJaTgzMEVtaXRUZXhWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhTdGF0ZVswXSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYMDsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVgxKSB7CisJCWk4MzBFbWl0VGV4VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4U3RhdGVbMV0gKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWDE7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQwKSB7CisJCWk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlWzBdLAorCQkJCXNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGVXb3Jkc1VzZWRbMF0pOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYQkxFTkQwOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWEJMRU5EMSkgeworCQlpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZVsxXSwKKwkJCQlzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlV29yZHNVc2VkWzFdKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWEJMRU5EMTsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhfUEFMRVRURV9TSEFSRUQpIHsKKwkJaTgzMEVtaXRUZXhQYWxldHRlKGRldiwgc2FyZWFfcHJpdi0+UGFsZXR0ZVswXSwgMCwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfTigwKSkgeworCQkJaTgzMEVtaXRUZXhQYWxldHRlKGRldiwgc2FyZWFfcHJpdi0+UGFsZXR0ZVswXSwgMCwgMCk7CisJCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYX1BBTEVUVEVfTigwKTsKKwkJfQorCQlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDEpKSB7CisJCQlpODMwRW1pdFRleFBhbGV0dGUoZGV2LCBzYXJlYV9wcml2LT5QYWxldHRlWzFdLCAxLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDEpOworCQl9CisKKwkJLyogMS4zOgorCQkgKi8KKyNpZiAwCisJCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMikpIHsKKwkJCWk4MzBFbWl0VGV4UGFsZXR0ZShkZXYsIHNhcmVhX3ByaXYtPlBhbGV0dGUyWzBdLCAwLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDIpOworCQl9CisJCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMykpIHsKKwkJCWk4MzBFbWl0VGV4UGFsZXR0ZShkZXYsIHNhcmVhX3ByaXYtPlBhbGV0dGUyWzFdLCAxLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDIpOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiAxLjM6CisJICovCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfU1RJUFBMRSkgeworCQlpODMwRW1pdFN0aXBwbGVWZXJpZmllZCggZGV2LCAKKwkJCQkJIHNhcmVhX3ByaXYtPlN0aXBwbGVTdGF0ZSk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9TVElQUExFOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWDIpIHsKKwkJaTgzMEVtaXRUZXhWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhTdGF0ZTIgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWDI7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYMykgeworCQlpODMwRW1pdFRleFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleFN0YXRlMyApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYMzsKKwl9CisKKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWEJMRU5EMikgeworCQlpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoIAorCQkJZGV2LCAKKwkJCXNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGUyLAorCQkJc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZVdvcmRzVXNlZDIpOworCisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhCTEVORDI7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQzKSB7CisJCWk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggCisJCQlkZXYsIAorCQkJc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZTMsCisJCQlzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlV29yZHNVc2VkMyk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhCTEVORDM7CisJfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGk4MzBfZmlsbF9ib3goIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICBpbnQgciwgaW50IGcsIGludCBiICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgY29sb3I7CisJdW5zaWduZWQgaW50IEJSMTMsIENNRDsKKwlSSU5HX0xPQ0FMUzsKKworCUJSMTMgPSAoMHhGMCA8PCAxNikgfCAoZGV2X3ByaXYtPnBpdGNoICogZGV2X3ByaXYtPmNwcCkgfCAoMTw8MjQpOworCUNNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7CisJeCArPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Ym94ZXNbMF0ueDE7CisJeSArPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Ym94ZXNbMF0ueTE7CisKKwlpZiAoZGV2X3ByaXYtPmNwcCA9PSA0KSB7CisJCUJSMTMgfD0gKDE8PDI1KTsKKwkJQ01EIHw9IChYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEEgfCBYWV9DT0xPUl9CTFRfV1JJVEVfUkdCKTsKKwkJY29sb3IgPSAoKCgweGZmKSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCAgOCkgfCBiKTsJCisJfSBlbHNlIHsKKwkJY29sb3IgPSAoKChyICYgMHhmOCkgPDwgOCkgfAorCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwKKwkJCSAoKGIgJiAweGY4KSA+PiAzKSk7CisJfQorCisJQkVHSU5fTFBfUklORyggNiApOwkgICAgCisJT1VUX1JJTkcoIENNRCApOworCU9VVF9SSU5HKCBCUjEzICk7CisJT1VUX1JJTkcoICh5IDw8IDE2KSB8IHggKTsKKwlPVVRfUklORyggKCh5K2gpIDw8IDE2KSB8ICh4K3cpICk7CisKKyAJaWYgKCBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7IAorCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X29mZnNldCApOworIAl9IGVsc2UgewkgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKyAJfSAKKworCU9VVF9SSU5HKCBjb2xvciApOworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBQdXJwbGUgYm94IGZvciBwYWdlIGZsaXBwaW5nCisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX0ZMSVAgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSApOworCisJLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50CisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX1dBSVQgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCAxNiwgNCwgOCwgOCwgMjU1LCAwLCAwICk7CisKKwkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PworCSAqLworCWlmICggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgJiBJODMwX0JPWF9MT1NUX0NPTlRFWFQgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCAyOCwgNCwgOCwgOCwgMCwgMCwgMjU1ICk7CisKKwkvKiBZZWxsb3cgYm94IGZvciB0ZXh0dXJlIHN3YXBzCisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX1RFWFRVUkVfTE9BRCApIAorCQlpODMwX2ZpbGxfYm94KCBkZXYsIDQwLCA0LCA4LCA4LCAyNTUsIDI1NSwgMCApOworCisJLyogR3JlZW4gYm94IGlmIGhhcmR3YXJlIG5ldmVyIGlkbGVzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwpCisJICovCisJaWYgKCAhKGRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzICYgSTgzMF9CT1hfUklOR19FTVBUWSkgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCA2NCwgNCwgOCwgOCwgMCwgMjU1LCAwICk7CisKKworCS8qIERyYXcgYmFycyBpbmRpY2F0aW5nIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCAKKwkgKiAobm90IGEgZ3JlYXQgbWVhc3VyZSwgZWFzaWx5IGNvbmZ1c2VkKQorCSAqLworCWlmIChkZXZfcHJpdi0+ZG1hX3VzZWQpIHsKKwkJaW50IGJhciA9IGRldl9wcml2LT5kbWFfdXNlZCAvIDEwMjQwOworCQlpZiAoYmFyID4gMTAwKSBiYXIgPSAxMDA7CisJCWlmIChiYXIgPCAxKSBiYXIgPSAxOworCQlpODMwX2ZpbGxfYm94KCBkZXYsIDQsIDE2LCBiYXIsIDQsIDE5NiwgMTI4LCAxMjggKTsKKwkJZGV2X3ByaXYtPmRtYV91c2VkID0gMDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzLCAKKwkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfenZhbCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2RlcHRobWFzaykKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKKwlpbnQgY3BwID0gZGV2X3ByaXYtPmNwcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgQlIxMywgQ01ELCBEX0NNRDsKKwlSSU5HX0xPQ0FMUzsKKworCisJaWYgKCBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBmbGFnczsKKworCQlmbGFncyAmPSB+KEk4MzBfRlJPTlQgfCBJODMwX0JBQ0spOworCQlpZiAoIHRtcCAmIEk4MzBfRlJPTlQgKSBmbGFncyB8PSBJODMwX0JBQ0s7CisJCWlmICggdG1wICYgSTgzMF9CQUNLICkgIGZsYWdzIHw9IEk4MzBfRlJPTlQ7CisJfQorCisgIAlpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCXN3aXRjaChjcHApIHsKKwljYXNlIDI6IAorCQlCUjEzID0gKDB4RjAgPDwgMTYpIHwgKHBpdGNoICogY3BwKSB8ICgxPDwyNCk7CisJCURfQ01EID0gQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlCUjEzID0gKDB4RjAgPDwgMTYpIHwgKHBpdGNoICogY3BwKSB8ICgxPDwyNCkgfCAoMTw8MjUpOworCQlDTUQgPSAoWFlfQ09MT1JfQkxUX0NNRCB8IFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQSB8IAorCQkgICAgICAgWFlfQ09MT1JfQkxUX1dSSVRFX1JHQik7CisJCURfQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKKwkJaWYoY2xlYXJfZGVwdGhtYXNrICYgMHgwMGZmZmZmZikKKwkJCURfQ01EIHw9IFhZX0NPTE9SX0JMVF9XUklURV9SR0I7CisJCWlmKGNsZWFyX2RlcHRobWFzayAmIDB4ZmYwMDAwMDApCisJCQlEX0NNRCB8PSBYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJSMTMgPSAoMHhGMCA8PCAxNikgfCAocGl0Y2ggKiBjcHApIHwgKDE8PDI0KTsKKwkJRF9DTUQgPSBDTUQgPSBYWV9DT0xPUl9CTFRfQ01EOworCQlicmVhazsKKwl9CisKKyAgICAgIAlpZiAobmJveCA+IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODMwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveCA7IGkrKywgcGJveCsrKSB7CisJCWlmIChwYm94LT54MSA+IHBib3gtPngyIHx8CisJCSAgICBwYm94LT55MSA+IHBib3gtPnkyIHx8CisJCSAgICBwYm94LT54MiA+IGRldl9wcml2LT53IHx8CisJCSAgICBwYm94LT55MiA+IGRldl9wcml2LT5oKQorCQkJY29udGludWU7CisKKwkgICAJaWYgKCBmbGFncyAmIEk4MzBfRlJPTlQgKSB7CSAgICAKKwkJICAgCURSTV9ERUJVRygiY2xlYXIgZnJvbnRcbiIpOworCQkJQkVHSU5fTFBfUklORyggNiApOwkgICAgCisJCQlPVVRfUklORyggQ01EICk7CisJCQlPVVRfUklORyggQlIxMyApOworCQkJT1VUX1JJTkcoIChwYm94LT55MSA8PCAxNikgfCBwYm94LT54MSApOworCQkJT1VUX1JJTkcoIChwYm94LT55MiA8PCAxNikgfCBwYm94LT54MiApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgSTgzMF9CQUNLICkgeworCQkJRFJNX0RFQlVHKCJjbGVhciBiYWNrXG4iKTsKKwkJCUJFR0lOX0xQX1JJTkcoIDYgKTsJICAgIAorCQkJT1VUX1JJTkcoIENNRCApOworCQkJT1VUX1JJTkcoIEJSMTMgKTsKKwkJCU9VVF9SSU5HKCAocGJveC0+eTEgPDwgMTYpIHwgcGJveC0+eDEgKTsKKwkJCU9VVF9SSU5HKCAocGJveC0+eTIgPDwgMTYpIHwgcGJveC0+eDIgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgSTgzMF9ERVBUSCApIHsKKwkJCURSTV9ERUJVRygiY2xlYXIgZGVwdGhcbiIpOworCQkJQkVHSU5fTFBfUklORyggNiApOworCQkJT1VUX1JJTkcoIERfQ01EICk7CisJCQlPVVRfUklORyggQlIxMyApOworCQkJT1VUX1JJTkcoIChwYm94LT55MSA8PCAxNikgfCBwYm94LT54MSApOworCQkJT1VUX1JJTkcoIChwYm94LT55MiA8PCAxNikgfCBwYm94LT54MiApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl96dmFsICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfc3dhcCggZHJtX2RldmljZV90ICpkZXYgKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOworCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOworCWludCBpOworCXVuc2lnbmVkIGludCBDTUQsIEJSMTM7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoInN3YXBidWZmZXJzXG4iKTsKKworICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKQorCQlpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkZXYgKTsKKworCXN3aXRjaChjcHApIHsKKwljYXNlIDI6IAorCQlCUjEzID0gKHBpdGNoICogY3BwKSB8ICgweENDIDw8IDE2KSB8ICgxPDwyNCk7CisJCUNNRCA9IFhZX1NSQ19DT1BZX0JMVF9DTUQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJQlIxMyA9IChwaXRjaCAqIGNwcCkgfCAoMHhDQyA8PCAxNikgfCAoMTw8MjQpIHwgKDE8PDI1KTsKKwkJQ01EID0gKFhZX1NSQ19DT1BZX0JMVF9DTUQgfCBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgfAorCQkgICAgICAgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJSMTMgPSAocGl0Y2ggKiBjcHApIHwgKDB4Q0MgPDwgMTYpIHwgKDE8PDI0KTsKKwkJQ01EID0gWFlfU1JDX0NPUFlfQkxUX0NNRDsKKwkJYnJlYWs7CisJfQorCisKKyAgICAgIAlpZiAobmJveCA+IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODMwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveDsgaSsrLCBwYm94KyspIAorCXsKKwkJaWYgKHBib3gtPngxID4gcGJveC0+eDIgfHwKKwkJICAgIHBib3gtPnkxID4gcGJveC0+eTIgfHwKKwkJICAgIHBib3gtPngyID4gZGV2X3ByaXYtPncgfHwKKwkJICAgIHBib3gtPnkyID4gZGV2X3ByaXYtPmgpCisJCQljb250aW51ZTsKKyAKKwkJRFJNX0RFQlVHKCJkaXNwYXRjaCBzd2FwICVkLCVkLSVkLCVkIVxuIiwKKwkJCSAgcGJveC0+eDEsIHBib3gtPnkxLAorCQkJICBwYm94LT54MiwgcGJveC0+eTIpOworCisJCUJFR0lOX0xQX1JJTkcoIDggKTsKKwkJT1VUX1JJTkcoIENNRCApOworCQlPVVRfUklORyggQlIxMyApOworCQlPVVRfUklORyggKHBib3gtPnkxIDw8IDE2KSB8IHBib3gtPngxICk7CisJCU9VVF9SSU5HKCAocGJveC0+eTIgPDwgMTYpIHwgcGJveC0+eDIgKTsKKworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSAKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJCWVsc2UKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsJCQkKKworCQlPVVRfUklORyggKHBib3gtPnkxIDw8IDE2KSB8IHBib3gtPngxICk7CisJCU9VVF9SSU5HKCBCUjEzICYgMHhmZmZmICk7CisKKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkgCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICk7CQkJCisJCWVsc2UKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoICIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCAKKwkJICAgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKKwkJICAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSk7CisKKyAgCWk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJaWYgKGRldl9wcml2LT5kb19ib3hlcykgeworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9GTElQOworCQlpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkZXYgKTsKKwl9CisKKworCUJFR0lOX0xQX1JJTkcoIDIgKTsKKyAgICAJT1VUX1JJTkcoIElOU1RfUEFSU0VSX0NMSUVOVCB8IElOU1RfT1BfRkxVU0ggfCBJTlNUX0ZMVVNIX01BUF9DQUNIRSApOyAKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJQkVHSU5fTFBfUklORyggNiApOworCU9VVF9SSU5HKCBDTURfT1BfRElTUExBWUJVRkZFUl9JTkZPIHwgQVNZTkNfRkxJUCApOwkKKwlPVVRfUklORyggMCApOworCWlmICggZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwICkgeworCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAxOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCX0KKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCisJQkVHSU5fTFBfUklORyggMiApOworCU9VVF9SSU5HKCBNSV9XQUlUX0ZPUl9FVkVOVCB8CisJCSAgTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQICk7CisJT1VUX1JJTkcoIDAgKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKwkKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworfQorCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICpkZXYsIAorCQkJCSAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICBpbnQgZGlzY2FyZCwKKwkJCQkgICAgIGludCB1c2VkKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisgICAJZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKyAgIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOyAgICAgCisJaW50IGkgPSAwLCB1OworICAgCVJJTkdfTE9DQUxTOworCisgICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlpZiAobmJveCA+IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTKSAKKwkJbmJveCA9IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKGRpc2NhcmQpIHsKKwkJdSA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfQ0xJRU5ULCAKKwkJCSAgICBJODMwX0JVRl9IQVJEV0FSRSk7CisJCWlmKHUgIT0gSTgzMF9CVUZfQ0xJRU5UKSB7CisJCQlEUk1fREVCVUcoInh4eHggMlxuIik7CisJCX0KKwl9CisKKwlpZiAodXNlZCA+IDQqMTAyMykgCisJCXVzZWQgPSAwOworCisJaWYgKHNhcmVhX3ByaXYtPmRpcnR5KQorCSAgIGk4MzBFbWl0U3RhdGUoIGRldiApOworCisgIAlEUk1fREVCVUcoImRpc3BhdGNoIHZlcnRleCBhZGRyIDB4JWx4LCB1c2VkIDB4JXggbmJveCAlZFxuIiwgCisJCSAgYWRkcmVzcywgdXNlZCwgbmJveCk7CisKKyAgIAlkZXZfcHJpdi0+Y291bnRlcisrOworICAgCURSTV9ERUJVRyggICJkaXNwYXRjaCBjb3VudGVyIDogJWxkXG4iLCBkZXZfcHJpdi0+Y291bnRlcik7CisgICAJRFJNX0RFQlVHKCAgImk4MzBfZG1hX2Rpc3BhdGNoXG4iKTsKKyAgIAlEUk1fREVCVUcoICAic3RhcnQgOiAlbHhcbiIsIHN0YXJ0KTsKKwlEUk1fREVCVUcoICAidXNlZCA6ICVkXG4iLCB1c2VkKTsKKyAgIAlEUk1fREVCVUcoICAic3RhcnQgKyB1c2VkIC0gNCA6ICVsZFxuIiwgc3RhcnQgKyB1c2VkIC0gNCk7CisKKwlpZiAoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgzMF9CVUZfTUFQUEVEKSB7CisJCXUzMiAqdnAgPSBidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWw7CisKKwkJdnBbMF0gPSAoR0ZYX09QX1BSSU1JVElWRSB8CisJCQlzYXJlYV9wcml2LT52ZXJ0ZXhfcHJpbSB8CisJCQkoKHVzZWQvNCktMikpOworCisJCWlmIChkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0KSB7CisJCQl2cFt1c2VkLzRdID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwkJCXVzZWQgKz0gNDsgCisJCX0KKwkJCisJCWlmICh1c2VkICYgNCkgeworCQkJdnBbdXNlZC80XSA9IDA7CisJCQl1c2VkICs9IDQ7CisJCX0KKworCQlpODMwX3VubWFwX2J1ZmZlcihidWYpOworCX0KKwkJICAgCisJaWYgKHVzZWQpIHsKKwkJZG8geworCQkJaWYgKGkgPCBuYm94KSB7CisJCQkJQkVHSU5fTFBfUklORyg2KTsKKwkJCQlPVVRfUklORyggR0ZYX09QX0RSQVdSRUNUX0lORk8gKTsKKwkJCQlPVVRfUklORyggc2FyZWFfcHJpdi0+QnVmZmVyU3RhdGVbSTgzMF9ERVNUUkVHX0RSMV0gKTsKKwkJCQlPVVRfUklORyggYm94W2ldLngxIHwgKGJveFtpXS55MTw8MTYpICk7CisJCQkJT1VUX1JJTkcoIGJveFtpXS54MiB8IChib3hbaV0ueTI8PDE2KSApOworCQkJCU9VVF9SSU5HKCBzYXJlYV9wcml2LT5CdWZmZXJTdGF0ZVtJODMwX0RFU1RSRUdfRFI0XSApOworCQkJCU9VVF9SSU5HKCAwICk7CisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCQl9CisKKwkJCWlmIChkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0KSB7CisJCQkJQkVHSU5fTFBfUklORygyKTsKKwkJCQlPVVRfUklORyggTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDI8PDYpICk7CisJCQkJT1VUX1JJTkcoIHN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSApOworCQkJCUFEVkFOQ0VfTFBfUklORygpOworCQkJfSAKKwkJCWVsc2UgeworCQkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQkJT1VUX1JJTkcoIE1JX0JBVENIX0JVRkZFUiApOworCQkJCU9VVF9SSU5HKCBzdGFydCB8IE1JX0JBVENIX05PTl9TRUNVUkUgKTsKKwkJCQlPVVRfUklORyggc3RhcnQgKyB1c2VkIC0gNCApOworCQkJCU9VVF9SSU5HKCAwICk7CisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCQl9CisKKwkJfSB3aGlsZSAoKytpIDwgbmJveCk7CisJfQorCisJaWYgKGRpc2NhcmQpIHsKKwkJZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCQkodm9pZCkgY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsCisJCQkgICAgICAgSTgzMF9CVUZfSEFSRFdBUkUpOworCisJCUJFR0lOX0xQX1JJTkcoOCk7CisJCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJCU9VVF9SSU5HKCAyMCApOworCQlPVVRfUklORyggZGV2X3ByaXYtPmNvdW50ZXIgKTsKKwkJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5teV91c2VfaWR4ICk7CisJCU9VVF9SSU5HKCBJODMwX0JVRl9GUkVFICk7CisJCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKwkJT1VUX1JJTkcoIDAgKTsKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgICAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlSSU5HX0xPQ0FMUzsKKworICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlCRUdJTl9MUF9SSU5HKDQpOworICAgCU9VVF9SSU5HKCBJTlNUX1BBUlNFUl9DTElFTlQgfCBJTlNUX09QX0ZMVVNIIHwgSU5TVF9GTFVTSF9NQVBfQ0FDSEUgKTsKKyAgIAlPVVRfUklORyggQ01EX1JFUE9SVF9IRUFEICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgCUFEVkFOQ0VfTFBfUklORygpOworCisJaTgzMF93YWl0X3JpbmcoIGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyApOworfQorCitzdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoZHJtX2RldmljZV90ICpkZXYpCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJaW50IGksIHJldCA9IDA7CisgICAJUklOR19MT0NBTFM7CisJCisgICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlCRUdJTl9MUF9SSU5HKDIpOworICAgICAgCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgICAgCUFEVkFOQ0VfTFBfUklORygpOworCisJaTgzMF93YWl0X3JpbmcoIGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyApOworCisgICAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCSAgIAorCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfSEFSRFdBUkUsIAorCQkJCSAgIEk4MzBfQlVGX0ZSRUUpOworCisJCWlmICh1c2VkID09IEk4MzBfQlVGX0hBUkRXQVJFKQorCQkJRFJNX0RFQlVHKCJyZWNsYWltZWQgZnJvbSBIQVJEV0FSRVxuIik7CisJCWlmICh1c2VkID09IEk4MzBfQlVGX0NMSUVOVCkKKwkJCURSTV9ERUJVRygic3RpbGwgb24gY2xpZW50XG4iKTsKKwl9CisKKyAgIAlyZXR1cm4gcmV0OworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KK3ZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisKKwlpZiAoIWRtYSkgcmV0dXJuOworICAgICAgCWlmICghZGV2LT5kZXZfcHJpdmF0ZSkgcmV0dXJuOworCWlmICghZG1hLT5idWZsaXN0KSByZXR1cm47CisKKyAgICAgICAgaTgzMF9mbHVzaF9xdWV1ZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCSAgIAorCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYpIHsKKwkJCWludCB1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsIAorCQkJCQkgICBJODMwX0JVRl9GUkVFKTsKKworCQkJaWYgKHVzZWQgPT0gSTgzMF9CVUZfQ0xJRU5UKQorCQkJCURSTV9ERUJVRygicmVjbGFpbWVkIGZyb20gY2xpZW50XG4iKTsKKwkJICAgCWlmKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MzBfQlVGX01BUFBFRCkKKwkJICAgICAJCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgzMF9CVUZfVU5NQVBQRUQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworICAgCWRybV9kZXZpY2VfdAkgICpkZXYJICA9IHByaXYtPmhlYWQtPmRldjsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisgICAJaTgzMF9mbHVzaF9xdWV1ZShkZXYpOworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgICAgCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MzBfc2FyZWFfdCAqKSAKKyAgICAgCQkJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdjsgCisJZHJtX2k4MzBfdmVydGV4X3QgdmVydGV4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZXJ0ZXgsIChkcm1faTgzMF92ZXJ0ZXhfdCBfX3VzZXIgKilhcmcsIHNpemVvZih2ZXJ0ZXgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCURSTV9ERUJVRygiaTgzMCBkbWEgdmVydGV4LCBpZHggJWQgdXNlZCAlZCBkaXNjYXJkICVkXG4iLAorCQkgIHZlcnRleC5pZHgsIHZlcnRleC51c2VkLCB2ZXJ0ZXguZGlzY2FyZCk7CisKKwlpZih2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID4gZG1hLT5idWZfY291bnQpIHJldHVybiAtRUlOVkFMOworCisJaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIAorCQkJCSAgZG1hLT5idWZsaXN0WyB2ZXJ0ZXguaWR4IF0sIAorCQkJCSAgdmVydGV4LmRpc2NhcmQsIHZlcnRleC51c2VkICk7CisKKwlzYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlci0xOworICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisgICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2NsZWFyX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODMwX2NsZWFyX3QgY2xlYXI7CisKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmNsZWFyLCAoZHJtX2k4MzBfY2xlYXJfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjbGVhcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKyAgIAorCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJLyogR0g6IFNvbWVvbmUncyBkb2luZyBuYXN0eSB0aGluZ3MuLi4gKi8KKwlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaTgzMF9kbWFfZGlzcGF0Y2hfY2xlYXIoIGRldiwgY2xlYXIuZmxhZ3MsIAorCQkJCSBjbGVhci5jbGVhcl9jb2xvciwgCisJCQkJIGNsZWFyLmNsZWFyX2RlcHRoLAorCQkJICAgICAgICAgY2xlYXIuY2xlYXJfZGVwdGhtYXNrKTsKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAorCURSTV9ERUJVRygiaTgzMF9zd2FwX2J1ZnNcbiIpOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpODMwX2RtYV9kaXNwYXRjaF9zd2FwKCBkZXYgKTsKKyAgIAlyZXR1cm4gMDsKK30KKworCisKKy8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CisgKi8gCitzdGF0aWMgdm9pZCBpODMwX2RvX2luaXRfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworfQorCitzdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlpODMwX2RtYV9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2ZsaXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoIWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSAKKwkJaTgzMF9kb19pbml0X3BhZ2VmbGlwKCBkZXYgKTsKKworCWk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZ2V0YWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopIAorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OyAKKworICAgICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9nZXRidWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWludAkJICByZXRjb2RlICAgPSAwOworCWRybV9pODMwX2RtYV90CSAgZDsKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopIAorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OyAKKworCURSTV9ERUJVRygiZ2V0YnVmXG4iKTsKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmQsIChkcm1faTgzMF9kbWFfdCBfX3VzZXIgKilhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworICAgCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisJCisJZC5ncmFudGVkID0gMDsKKworCXJldGNvZGUgPSBpODMwX2RtYV9nZXRfYnVmZmVyKGRldiwgJmQsIGZpbHApOworCisJRFJNX0RFQlVHKCJpODMwX2RtYTogJWQgcmV0dXJuaW5nICVkLCBncmFudGVkID0gJWRcbiIsCisJCSAgY3VycmVudC0+cGlkLCByZXRjb2RlLCBkLmdyYW50ZWQpOworCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2RtYV90IF9fdXNlciAqKWFyZywgJmQsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODMwX2NvcHlidWYoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogTmV2ZXIgY29weSAtIDIuNC54IGRvZXNuJ3QgbmVlZCBpdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZG9jb3B5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGk4MzBfZ2V0cGFyYW0oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCAKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODMwX2dldHBhcmFtX3QgcGFyYW07CisJaW50IHZhbHVlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbSwgKGRybV9pODMwX2dldHBhcmFtX3QgX191c2VyICopYXJnLCBzaXplb2YocGFyYW0pICkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIEk4MzBfUEFSQU1fSVJRX0FDVElWRToKKwkJdmFsdWUgPSBkZXYtPmlycV9lbmFibGVkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIGNvcHlfdG9fdXNlciggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGk4MzBfc2V0cGFyYW0oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfc2V0cGFyYW1fdCBwYXJhbTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sIChkcm1faTgzMF9zZXRwYXJhbV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKHBhcmFtKSApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCggcGFyYW0ucGFyYW0gKSB7CisJY2FzZSBJODMwX1NFVFBBUkFNX1VTRV9NSV9CQVRDSEJVRkZFUl9TVEFSVDoKKwkJZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCA9IHBhcmFtLnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWk4MzBfZG1hX2NsZWFudXAoIGRldiApOworfQorCit2b2lkIGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSB7CisJCQlpODMwX2RvX2NsZWFudXBfcGFnZWZsaXAoZGV2KTsKKwkJfQorCX0KK30KKwordm9pZCBpODMwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpODMwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOworfQorCitpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpODMwX2RtYV9xdWllc2NlbnQoIGRldiApOworCXJldHVybiAwOworfQorCitkcm1faW9jdGxfZGVzY190IGk4MzBfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JTklUKV0gICAgID0geyBpODMwX2RtYV9pbml0LCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9WRVJURVgpXSAgID0geyBpODMwX2RtYV92ZXJ0ZXgsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DTEVBUildICAgID0geyBpODMwX2NsZWFyX2J1ZnMsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTFVTSCldICAgID0geyBpODMwX2ZsdXNoX2lvY3RsLCAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRBR0UpXSAgID0geyBpODMwX2dldGFnZSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRCVUYpXSAgID0geyBpODMwX2dldGJ1ZiwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9TV0FQKV0gICAgID0geyBpODMwX3N3YXBfYnVmcywgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DT1BZKV0gICAgID0geyBpODMwX2NvcHlidWYsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9ET0NPUFkpXSAgID0geyBpODMwX2RvY29weSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTElQKV0gICAgID0geyBpODMwX2ZsaXBfYnVmcywgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfRU1JVCldID0geyBpODMwX2lycV9lbWl0LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfV0FJVCldID0geyBpODMwX2lycV93YWl0LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRQQVJBTSldID0geyBpODMwX2dldHBhcmFtLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9TRVRQQVJBTSldID0geyBpODMwX3NldHBhcmFtLCAgICAxLCAwIH0gCit9OworCitpbnQgaTgzMF9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpODMwX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzODJjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaApAQCAtMCwwICsxLDM1MCBAQAorI2lmbmRlZiBfSTgzMF9EUk1fSF8KKyNkZWZpbmUgX0k4MzBfRFJNX0hfCisKKy8qIFdBUk5JTkc6IFRoZXNlIGRlZmluZXMgbXVzdCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSBYc2VydmVyIHVzZXMuCisgKiBpZiB5b3UgY2hhbmdlIHRoZW0sIHlvdSBtdXN0IGNoYW5nZSB0aGUgZGVmaW5lcyBpbiB0aGUgWHNlcnZlci4KKyAqCisgKiBLVzogQWN0dWFsbHksIHlvdSBjYW4ndCBldmVyIGNoYW5nZSB0aGVtIGJlY2F1c2UgZG9pbmcgc28gd291bGQKKyAqIGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICovCisKKyNpZm5kZWYgX0k4MzBfREVGSU5FU18KKyNkZWZpbmUgX0k4MzBfREVGSU5FU18KKworI2RlZmluZSBJODMwX0RNQV9CVUZfT1JERVIJCTEyCisjZGVmaW5lIEk4MzBfRE1BX0JVRl9TWiAJCSgxPDxJODMwX0RNQV9CVUZfT1JERVIpCisjZGVmaW5lIEk4MzBfRE1BX0JVRl9OUiAJCTI1NgorI2RlZmluZSBJODMwX05SX1NBUkVBX0NMSVBSRUNUUyAJOAorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJODMwX05SX1RFWF9SRUdJT05TIDY0CisjZGVmaW5lIEk4MzBfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKworLyogS1c6IFRoZXNlIGFyZW4ndCBjb3JyZWN0IGJ1dCBzb21lb25lIHNldCB0aGVtIHRvIHR3byBhbmQgdGhlbgorICogcmVsZWFzZWQgdGhlIG1vZHVsZS4gIE5vdyB3ZSBjYW4ndCBjaGFuZ2UgdGhlbSBhcyBkb2luZyBzbyB3b3VsZAorICogYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgSTgzMF9URVhUVVJFX0NPVU5UCTIKKyNkZWZpbmUgSTgzMF9URVhCTEVORF9DT1VOVAlJODMwX1RFWFRVUkVfQ09VTlQKKworI2RlZmluZSBJODMwX1RFWEJMRU5EX1NJWkUJMTIJLyogKDQgYXJncyArIG9wKSAqIDIgKyBDT0xPUl9GQUNUT1IgKi8KKworI2RlZmluZSBJODMwX1VQTE9BRF9DVFgJCQkweDEKKyNkZWZpbmUgSTgzMF9VUExPQURfQlVGRkVSUwkJMHgyCisjZGVmaW5lIEk4MzBfVVBMT0FEX0NMSVBSRUNUUwkJMHg0CisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDBfSU1BR0UJCTB4MTAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgwX0NVQkUJCTB4MjAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgxX0lNQUdFCQkweDQwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMV9DVUJFCQkweDgwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMl9JTUFHRQkJMHgxMDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgyX0NVQkUJCTB4MjAwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYM19JTUFHRQkJMHg0MDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgzX0NVQkUJCTB4ODAwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX05fSU1BR0UobikJKDB4MTAwIDw8IChuICogMikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9OX0NVQkUobikJKDB4MjAwIDw8IChuICogMikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWElNQUdFX01BU0sJMHhmZjAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDAJCQkweDEwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDEJCQkweDIwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDIJCQkweDQwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDMJCQkweDgwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9OKG4pCQkoMHgxMDAwMCA8PCAobikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9NQVNLCQkweGYwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EMAkJMHgxMDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYQkxFTkQxCQkweDIwMDAwMAorI2RlZmluZSBJODMwX1VQTE9BRF9URVhCTEVORDIJCTB4NDAwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EMwkJMHg4MDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYQkxFTkRfTihuKQkoMHgxMDAwMDAgPDwgKG4pKQorI2RlZmluZSBJODMwX1VQTE9BRF9URVhCTEVORF9NQVNLCTB4ZjAwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04obikgICAgKDB4MTAwMDAwMCA8PCAobikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX1NIQVJFRAkweDQwMDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfU1RJUFBMRSAgICAgICAgIAkweDgwMDAwMDAKKworLyogSW5kaWNlcyBpbnRvIGJ1Zi5TZXR1cCB3aGVyZSB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgYXJlIG1pcnJvcmVkIHBlcgorICogY29udGV4dCBhbmQgcGVyIGJ1ZmZlci4gIFRoZXNlIGNhbiBiZSBmaXJlZCBhdCB0aGUgY2FyZCBhcyBhIHVuaXQsCisgKiBvciBpbiBhIHBpZWNld2lzZSBmYXNoaW9uIGFzIHJlcXVpcmVkLgorICovCisKKy8qIERlc3RidWZmZXIgc3RhdGUgCisgKiAgICAtIGJhY2tidWZmZXIgbGluZWFyIG9mZnNldCBhbmQgcGl0Y2ggLS0gaW52YXJpZW50IGluIHRoZSBjdXJyZW50IGRyaQorICogICAgLSB6YnVmZmVyIGxpbmVhciBvZmZzZXQgYW5kIHBpdGNoIC0tIGFsc28gaW52YXJpZW50CisgKiAgICAtIGRyYXdpbmcgb3JpZ2luIGluIGJhY2sgYW5kIGRlcHRoIGJ1ZmZlcnMuCisgKgorICogS2VlcCB0aGUgZGVwdGgvYmFjayBidWZmZXIgc3RhdGUgaGVyZSB0byBhY2NvbW1vZGF0ZSBwcml2YXRlIGJ1ZmZlcnMKKyAqIGluIHRoZSBmdXR1cmUuCisgKi8KKworI2RlZmluZSBJODMwX0RFU1RSRUdfQ0JVRkFERFIgMAorI2RlZmluZSBJODMwX0RFU1RSRUdfREJVRkFERFIgMQorI2RlZmluZSBJODMwX0RFU1RSRUdfRFYwIDIKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RWMSAzCisjZGVmaW5lIEk4MzBfREVTVFJFR19TRU5BQkxFIDQKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX1NSMCA1CisjZGVmaW5lIEk4MzBfREVTVFJFR19TUjEgNgorI2RlZmluZSBJODMwX0RFU1RSRUdfU1IyIDcKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RSMCA4CisjZGVmaW5lIEk4MzBfREVTVFJFR19EUjEgOQorI2RlZmluZSBJODMwX0RFU1RSRUdfRFIyIDEwCisjZGVmaW5lIEk4MzBfREVTVFJFR19EUjMgMTEKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RSNCAxMgorI2RlZmluZSBJODMwX0RFU1RfU0VUVVBfU0laRSAxMworCisvKiBDb250ZXh0IHN0YXRlCisgKi8KKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEUxCQkwCisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NUQVRFMgkJMQorI2RlZmluZSBJODMwX0NUWFJFR19TVEFURTMJCTIKKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEU0CQkzCisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NUQVRFNQkJNAorI2RlZmluZSBJODMwX0NUWFJFR19JQUxQSEFCCQk1CisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NURU5DSUxUU1QJCTYKKyNkZWZpbmUgSTgzMF9DVFhSRUdfRU5BQkxFU18xCQk3CisjZGVmaW5lIEk4MzBfQ1RYUkVHX0VOQUJMRVNfMgkJOAorI2RlZmluZSBJODMwX0NUWFJFR19BQQkJCTkKKyNkZWZpbmUgSTgzMF9DVFhSRUdfRk9HQ09MT1IJCTEwCisjZGVmaW5lIEk4MzBfQ1RYUkVHX0JMRU5EQ09MUjAJCTExCisjZGVmaW5lIEk4MzBfQ1RYUkVHX0JMRU5EQ09MUgkJMTIgLyogRHdvcmQgMSBvZiAyIGR3b3JkIGNvbW1hbmQgKi8KKyNkZWZpbmUgSTgzMF9DVFhSRUdfVkYJCQkxMworI2RlZmluZSBJODMwX0NUWFJFR19WRjIJCQkxNAorI2RlZmluZSBJODMwX0NUWFJFR19NQ1NCMAkJMTUKKyNkZWZpbmUgSTgzMF9DVFhSRUdfTUNTQjEJCTE2CisjZGVmaW5lIEk4MzBfQ1RYX1NFVFVQX1NJWkUJCTE3CisKKy8qIDEuMzogU3RpcHBsZSBzdGF0ZQorICovIAorI2RlZmluZSBJODMwX1NUUFJFR19TVDAgMAorI2RlZmluZSBJODMwX1NUUFJFR19TVDEgMQorI2RlZmluZSBJODMwX1NUUF9TRVRVUF9TSVpFIDIKKworCisvKiBUZXh0dXJlIHN0YXRlIChwZXIgdGV4IHVuaXQpCisgKi8KKworI2RlZmluZSBJODMwX1RFWFJFR19NSTAJMAkvKiBHRlhfT1BfTUFQX0lORk8gKDYgZHdvcmRzKSAqLworI2RlZmluZSBJODMwX1RFWFJFR19NSTEJMQorI2RlZmluZSBJODMwX1RFWFJFR19NSTIJMgorI2RlZmluZSBJODMwX1RFWFJFR19NSTMJMworI2RlZmluZSBJODMwX1RFWFJFR19NSTQJNAorI2RlZmluZSBJODMwX1RFWFJFR19NSTUJNQorI2RlZmluZSBJODMwX1RFWFJFR19NRgk2CS8qIEdGWF9PUF9NQVBfRklMVEVSICovCisjZGVmaW5lIEk4MzBfVEVYUkVHX01MQwk3CS8qIEdGWF9PUF9NQVBfTE9EX0NUTCAqLworI2RlZmluZSBJODMwX1RFWFJFR19NTEwJOAkvKiBHRlhfT1BfTUFQX0xPRF9MSU1JVFMgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTUNTCTkJLyogR0ZYX09QX01BUF9DT09SRF9TRVRTICovCisjZGVmaW5lIEk4MzBfVEVYX1NFVFVQX1NJWkUgMTAKKworI2RlZmluZSBJODMwX1RFWFJFR19UTTBMSSAgICAgIDAgLyogbG9hZCBpbW1lZGlhdGUgMiB0ZXh0dXJlIG1hcCBuICovCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMwICAgICAgMQorI2RlZmluZSBJODMwX1RFWFJFR19UTTBTMSAgICAgIDIKKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzIgICAgICAzCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMzICAgICAgNAorI2RlZmluZSBJODMwX1RFWFJFR19UTTBTNCAgICAgIDUKKyNkZWZpbmUgSTgzMF9URVhSRUdfTk9QMCAgICAgICA2ICAgICAgIC8qIG5vb3AgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTk9QMSAgICAgICA3ICAgICAgIC8qIG5vb3AgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTk9QMiAgICAgICA4ICAgICAgIC8qIG5vb3AgKi8KKyNkZWZpbmUgX19JODMwX1RFWFJFR19NQ1MgICAgICA5ICAgICAgIC8qIEdGWF9PUF9NQVBfQ09PUkRfU0VUUyAtLSBzaGFyZWQgKi8KKyNkZWZpbmUgX19JODMwX1RFWF9TRVRVUF9TSVpFICAgMTAKKworI2RlZmluZSBJODMwX0ZST05UICAgMHgxCisjZGVmaW5lIEk4MzBfQkFDSyAgICAweDIKKyNkZWZpbmUgSTgzMF9ERVBUSCAgIDB4NAorCisjZW5kaWYgLyogX0k4MzBfREVGSU5FU18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX2luaXQgeworCWVudW0geworCQlJODMwX0lOSVRfRE1BID0gMHgwMSwKKwkJSTgzMF9DTEVBTlVQX0RNQSA9IDB4MDIKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7CisJdW5zaWduZWQgaW50IGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7Cit9IGRybV9pODMwX2luaXRfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsgLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1faTgzMF90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF9zYXJlYSB7CisJdW5zaWduZWQgaW50IENvbnRleHRTdGF0ZVtJODMwX0NUWF9TRVRVUF9TSVpFXTsKKyAgIAl1bnNpZ25lZCBpbnQgQnVmZmVyU3RhdGVbSTgzMF9ERVNUX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhTdGF0ZVtJODMwX1RFWFRVUkVfQ09VTlRdW0k4MzBfVEVYX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlW0k4MzBfVEVYQkxFTkRfQ09VTlRdW0k4MzBfVEVYQkxFTkRfU0laRV07CisJdW5zaWduZWQgaW50IFRleEJsZW5kU3RhdGVXb3Jkc1VzZWRbSTgzMF9URVhCTEVORF9DT1VOVF07CisJdW5zaWduZWQgaW50IFBhbGV0dGVbMl1bMjU2XTsKKyAgIAl1bnNpZ25lZCBpbnQgZGlydHk7CisKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbSTgzMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKKwkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgorCSAqIGFnZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSB5b3Ugc2V0LCB0aGVuIHlvdSBhcmUgbWlzdGFrZW4gYW5kCisJICogaXQgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LiAgSWYgZ2xvYmFsIHRleEFnZQorCSAqIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICoKKwkgKiBUaGVzZSByZWdpb25zIGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBmaW5lLWdyYWluZWQKKwkgKiB0ZXh0dXJlIGluZm9ybWF0aW9uIG9mIG90aGVyIGNsaWVudHMgLSBieSBtYWludGFpbmluZyB0aGVtCisJICogaW4gdGhlIHNhbWUgbHJ1IHdoaWNoIGlzIHVzZWQgdG8gYWdlIHRoZWlyIG93biB0ZXh0dXJlcywKKwkgKiBjbGllbnRzIGhhdmUgYW4gYXBwcm94aW1hdGUgbHJ1IGZvciB0aGUgd2hvbGUgb2YgZ2xvYmFsCisJICogdGV4dHVyZSBzcGFjZSwgYW5kIGNhbiBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyBhcyB0byB3aGljaAorCSAqIGFyZWFzIHRvIGtpY2sgb3V0LiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjaG9vc2Ugd2hldGhlciB0bworCSAqIGtpY2sgb3V0IHlvdXIgb3duIHRleHR1cmUgb3Igc29tZW9uZSBlbHNlJ3MgLSBzaW1wbHkgZWplY3QKKwkgKiB0aGVtIGFsbCBpbiBMUlUgb3JkZXIuICAKKwkgKi8KKworCWRybV9pODMwX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k4MzBfTlJfVEVYX1JFR0lPTlMrMV07IAorCQkJCS8qIExhc3QgZWx0IGlzIHNlbnRpbmFsICovCisgICAgICAgIGludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKyAgICAgICAgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7ICAgICAvKiAgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisKKwlpbnQgdmVydGV4X3ByaW07CisKKyAgICAgICAgaW50IHBmX2VuYWJsZWQ7ICAgICAgICAgICAgICAgLyogaXMgcGFnZWZsaXBwaW5nIGFsbG93ZWQ/ICovCisgICAgICAgIGludCBwZl9hY3RpdmU7ICAgICAgICAgICAgICAgCisgICAgICAgIGludCBwZl9jdXJyZW50X3BhZ2U7CSAgICAvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCisgICAgICAgIGludCBwZXJmX2JveGVzOyAgICAgICAgICAgICAvKiBwZXJmb3JtYW5jZSBib3hlcyB0byBiZSBkaXNwbGF5ZWQgKi8KKyAgIAorICAgICAgICAvKiBIZXJlJ3MgdGhlIHN0YXRlIGZvciB0ZXh1bml0cyAyLDM6CisJICovCisJdW5zaWduZWQgaW50IFRleFN0YXRlMltJODMwX1RFWF9TRVRVUF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVGV4QmxlbmRTdGF0ZTJbSTgzMF9URVhCTEVORF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVGV4QmxlbmRTdGF0ZVdvcmRzVXNlZDI7CisKKwl1bnNpZ25lZCBpbnQgVGV4U3RhdGUzW0k4MzBfVEVYX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlM1tJODMwX1RFWEJMRU5EX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlV29yZHNVc2VkMzsKKworCXVuc2lnbmVkIGludCBTdGlwcGxlU3RhdGVbSTgzMF9TVFBfU0VUVVBfU0laRV07Cit9IGRybV9pODMwX3NhcmVhX3Q7CisKKy8qIEZsYWdzIGZvciBwZXJmX2JveGVzCisgKi8KKyNkZWZpbmUgSTgzMF9CT1hfUklOR19FTVBUWSAgICAweDEgLyogcG9wdWxhdGVkIGJ5IGtlcm5lbCAqLworI2RlZmluZSBJODMwX0JPWF9GTElQICAgICAgICAgIDB4MiAvKiBwb3B1bGF0ZWQgYnkga2VybmVsICovCisjZGVmaW5lIEk4MzBfQk9YX1dBSVQgICAgICAgICAgMHg0IC8qIHBvcHVsYXRlZCBieSBrZXJuZWwgJiBjbGllbnQgKi8KKyNkZWZpbmUgSTgzMF9CT1hfVEVYVFVSRV9MT0FEICAweDggLyogcG9wdWxhdGVkIGJ5IGtlcm5lbCAqLworI2RlZmluZSBJODMwX0JPWF9MT1NUX0NPTlRFWFQgIDB4MTAgLyogcG9wdWxhdGVkIGJ5IGNsaWVudCAqLworCisKKy8qIEk4MzAgc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fSTgzMF9JTklUCTB4MDAKKyNkZWZpbmUgRFJNX0k4MzBfVkVSVEVYCTB4MDEKKyNkZWZpbmUgRFJNX0k4MzBfQ0xFQVIJMHgwMgorI2RlZmluZSBEUk1fSTgzMF9GTFVTSAkweDAzCisjZGVmaW5lIERSTV9JODMwX0dFVEFHRQkweDA0CisjZGVmaW5lIERSTV9JODMwX0dFVEJVRgkweDA1CisjZGVmaW5lIERSTV9JODMwX1NXQVAJMHgwNgorI2RlZmluZSBEUk1fSTgzMF9DT1BZCTB4MDcKKyNkZWZpbmUgRFJNX0k4MzBfRE9DT1BZCTB4MDgKKyNkZWZpbmUgRFJNX0k4MzBfRkxJUAkweDA5CisjZGVmaW5lIERSTV9JODMwX0lSUV9FTUlUCTB4MGEKKyNkZWZpbmUgRFJNX0k4MzBfSVJRX1dBSVQJMHgwYgorI2RlZmluZSBEUk1fSTgzMF9HRVRQQVJBTQkweDBjCisjZGVmaW5lIERSTV9JODMwX1NFVFBBUkFNCTB4MGQKKworI2RlZmluZSBEUk1fSU9DVExfSTgzMF9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfSU5JVCwgZHJtX2k4MzBfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9WRVJURVgJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9WRVJURVgsIGRybV9pODMwX3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9DTEVBUgkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0NMRUFSLCBkcm1faTgzMF9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9HRVRBR0UJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9HRVRBR0UpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0dFVEJVRgkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0dFVEJVRiwgZHJtX2k4MzBfZG1hX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX1NXQVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9TV0FQKQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9DT1BZCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfQ09QWSwgZHJtX2k4MzBfY29weV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9ET0NPUFkJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9ET0NPUFkpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0ZMSVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9GTElQKQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9JUlFfRU1JVCAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9JUlFfRU1JVCwgZHJtX2k4MzBfaXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MzBfSVJRX1dBSVQgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfSVJRX1dBSVQsIGRybV9pODMwX2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0dFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0dFVFBBUkFNLCBkcm1faTgzMF9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9TRVRQQVJBTSAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9TRVRQQVJBTSwgZHJtX2k4MzBfc2V0cGFyYW1fdCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX2NsZWFyIHsKKwlpbnQgY2xlYXJfY29sb3I7CisJaW50IGNsZWFyX2RlcHRoOworCWludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3JtYXNrOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aG1hc2s7Cit9IGRybV9pODMwX2NsZWFyX3Q7CisKKworCisvKiBUaGVzZSBtYXkgYmUgcGxhY2Vob2xkZXJzIGlmIHdlIGhhdmUgbW9yZSBjbGlwcmVjdHMgdGhhbgorICogSTgzMF9OUl9TQVJFQV9DTElQUkVDVFMuICBJbiB0aGF0IGNhc2UsIHRoZSBjbGllbnQgc2V0cyBkaXNjYXJkIHRvCisgKiBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBkaXNwYXRjaGVkIGFnYWluIHdpdGggYQorICogbmV3IHNldCBvZiBjbGlwcmVjdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF92ZXJ0ZXggeworICAgCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBkaXNjYXJkOwkJLyogY2xpZW50IGlzIGZpbmlzaGVkIHdpdGggdGhlIGJ1ZmZlcj8gKi8KK30gZHJtX2k4MzBfdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF9jb3B5X3QgeworICAgCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCXZvaWQgX191c2VyICphZGRyZXNzOwkJLyogQWRkcmVzcyB0byBjb3B5IGZyb20gKi8KK30gZHJtX2k4MzBfY29weV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9kbWEgeworCXZvaWQgX191c2VyICp2aXJ0dWFsOworCWludCByZXF1ZXN0X2lkeDsKKwlpbnQgcmVxdWVzdF9zaXplOworCWludCBncmFudGVkOworfSBkcm1faTgzMF9kbWFfdDsKKworCisvKiAxLjM6IFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2lycV9lbWl0IHsKKwlpbnQgX191c2VyICppcnFfc2VxOworfSBkcm1faTgzMF9pcnFfZW1pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9pcnFfd2FpdCB7CisJaW50IGlycV9zZXE7Cit9IGRybV9pODMwX2lycV93YWl0X3Q7CisKKworLyogMS4zOiBOZXcgaW9jdGwgdG8gcXVlcnkga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJODMwX1BBUkFNX0lSUV9BQ1RJVkUgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJaW50IF9fdXNlciAqdmFsdWU7Cit9IGRybV9pODMwX2dldHBhcmFtX3Q7CisKKworLyogMS4zOiBOZXcgaW9jdGwgdG8gc2V0IGtlcm5lbCBwYXJhbXM6CisgKi8KKyNkZWZpbmUgSTgzMF9TRVRQQVJBTV9VU0VfTUlfQkFUQ0hCVUZGRVJfU1RBUlQgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX3NldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJaW50IHZhbHVlOworfSBkcm1faTgzMF9zZXRwYXJhbV90OworCisKKyNlbmRpZiAvKiBfSTgzMF9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgwYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBpODMwX2Rydi5jIC0tIEk4MTAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1NjoyMiAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgQWJyYWhhbSB2ZCBNZXJ3ZSA8YWJyYWhhbUAyZDNkLmNvLnphPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcm0uaCIKKyNpbmNsdWRlICJpODMwX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCWRldi0+Y291bnRlcnMgKz0gNDsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisJZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7CisJCisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCWk4MzBfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTgzMF9pb2N0bHNbXTsKK2V4dGVybiBpbnQgaTgzMF9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0RNQV9RVUVVRSwKKyNpZiBVU0VfSVJRUworCS5kcml2ZXJfZmVhdHVyZXMgfD0gRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX1NIQVJFRF9JUlEsCisjZW5kaWYKKwkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1faTgzMF9idWZfcHJpdl90KSwKKwkucHJldGFrZWRvd24gPSBpODMwX2RyaXZlcl9wcmV0YWtlZG93biwKKwkucHJlcmVsZWFzZSA9IGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UsCisJLnJlbGVhc2UgPSBpODMwX2RyaXZlcl9yZWxlYXNlLAorCS5kbWFfcXVpZXNjZW50ID0gaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudCwKKwkucmVjbGFpbV9idWZmZXJzID0gaTgzMF9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisjaWYgVVNFX0lSUVMKKwkuaXJxX3ByZWluc3RhbGwgPSBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKKwkuaXJxX3Bvc3RpbnN0YWxsID0gaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSBpODMwX2RyaXZlcl9pcnFfaGFuZGxlciwKKyNlbmRpZgorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gaTgzMF9pb2N0bHMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KKworfTsKKworc3RhdGljIGludCBfX2luaXQgaTgzMF9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBpODMwX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpODMwX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTgzMF9pbml0KTsKK21vZHVsZV9leGl0KGk4MzBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiMmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtMCwwICsxLDMwMSBAQAorLyogaTgzMF9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIEk4MzAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfSTgzMF9EUlZfSF8KKyNkZWZpbmUgX0k4MzBfRFJWX0hfCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJpODMwIgorI2RlZmluZSBEUklWRVJfREVTQwkJIkludGVsIDgzME0iCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMjExMDgiCisKKy8qIEludGVyZmFjZSBoaXN0b3J5OgorICoKKyAqIDEuMTogT3JpZ2luYWwuCisgKiAxLjI6ID8KKyAqIDEuMzogTmV3IGlycSBlbWl0L3dhaXQgaW9jdGxzLgorICogICAgICBOZXcgcGFnZWZsaXAgaW9jdGwuCisgKiAgICAgIE5ldyBnZXRwYXJhbSBpb2N0bC4KKyAqICAgICAgU3RhdGUgZm9yIHRleHVuaXRzIDMmNCBpbiBzYXJlYS4KKyAqICAgICAgTmV3IChhbHRlcm5hdGl2ZSkgbGF5b3V0IGZvciB0ZXh0dXJlIHN0YXRlLgorICovCisjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTMKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMgorCisvKiBEcml2ZXIgd2lsbCB3b3JrIGVpdGhlciB3YXk6IElSUSdzIHNhdmUgY3B1IHRpbWUgd2hlbiB3YWl0aW5nIGZvcgorICogdGhlIGNhcmQsIGJ1dCBhcmUgc3ViamVjdCB0byBzdWJ0bGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gYmlvcywKKyAqIGhhcmR3YXJlIGFuZCB0aGUgZHJpdmVyLgorICovCisvKiBYWFg6IEFkZCB2Ymxhbmsgc3VwcG9ydD8gKi8KKyNkZWZpbmUgVVNFX0lSUVMgMAorCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9idWZfcHJpdiB7CisgICAJdTMyICppbl91c2U7CisgICAJaW50IG15X3VzZV9pZHg7CisJaW50IGN1cnJlbnRseV9tYXBwZWQ7CisJdm9pZCBfX3VzZXIgKnZpcnR1YWw7CisJdm9pZCAqa2VybmVsX3ZpcnR1YWw7Cit9IGRybV9pODMwX2J1Zl9wcml2X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF9yaW5nX2J1ZmZlcnsKKwlpbnQgdGFpbF9tYXNrOworCXVuc2lnbmVkIGxvbmcgU3RhcnQ7CisJdW5zaWduZWQgbG9uZyBFbmQ7CisJdW5zaWduZWQgbG9uZyBTaXplOworCXU4ICp2aXJ0dWFsX3N0YXJ0OworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBzcGFjZTsKK30gZHJtX2k4MzBfcmluZ19idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfcHJpdmF0ZSB7CisJZHJtX21hcF90ICpzYXJlYV9tYXA7CisJZHJtX21hcF90ICptbWlvX21hcDsKKworCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisgICAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCByaW5nOworCisgICAgICAJdm9pZCAqIGh3X3N0YXR1c19wYWdlOworICAgCXVuc2lnbmVkIGxvbmcgY291bnRlcjsKKworCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOworCisJZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKwkKKwl1MzIgZnJvbnRfZGkxLCBiYWNrX2RpMSwgemkxOworCQorCWludCBiYWNrX29mZnNldDsKKwlpbnQgZGVwdGhfb2Zmc2V0OworCWludCBmcm9udF9vZmZzZXQ7CisJaW50IHcsIGg7CisJaW50IHBpdGNoOworCWludCBiYWNrX3BpdGNoOworCWludCBkZXB0aF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgY3BwOworCisJaW50IGRvX2JveGVzOworCWludCBkbWFfdXNlZDsKKworCWludCBjdXJyZW50X3BhZ2U7CisJaW50IHBhZ2VfZmxpcHBpbmc7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7CisgICAJYXRvbWljX3QgaXJxX3JlY2VpdmVkOworICAgCWF0b21pY190IGlycV9lbWl0dGVkOworCisJaW50IHVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydDsKKworfSBkcm1faTgzMF9wcml2YXRlX3Q7CisKKy8qIGk4MzBfZG1hLmMgKi8KK2V4dGVybiB2b2lkIGk4MzBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CisKK2V4dGVybiBpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworLyogaTgzMF9pcnEuYyAqLworZXh0ZXJuIGludCBpODMwX2lycV9lbWl0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50IGk4MzBfaXJxX3dhaXQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworCitleHRlcm4gaXJxcmV0dXJuX3QgaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CisKKyNkZWZpbmUgSTgzMF9CQVNFKHJlZykJCSgodW5zaWduZWQgbG9uZykgXAorCQkJCWRldl9wcml2LT5tbWlvX21hcC0+aGFuZGxlKQorI2RlZmluZSBJODMwX0FERFIocmVnKQkJKEk4MzBfQkFTRShyZWcpICsgcmVnKQorI2RlZmluZSBJODMwX0RFUkVGKHJlZykJCSooX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqKUk4MzBfQUREUihyZWcpCisjZGVmaW5lIEk4MzBfUkVBRChyZWcpCQlyZWFkbCgodm9sYXRpbGUgdTMyICopSTgzMF9BRERSKHJlZykpCisjZGVmaW5lIEk4MzBfV1JJVEUocmVnLHZhbCkgCXdyaXRlbCh2YWwsICh2b2xhdGlsZSB1MzIgKilJODMwX0FERFIocmVnKSkKKyNkZWZpbmUgSTgzMF9ERVJFRjE2KHJlZykJKihfX3ZvbGF0aWxlX18gdTE2ICopSTgzMF9BRERSKHJlZykKKyNkZWZpbmUgSTgzMF9SRUFEMTYocmVnKSAJSTgzMF9ERVJFRjE2KHJlZykKKyNkZWZpbmUgSTgzMF9XUklURTE2KHJlZyx2YWwpCWRvIHsgSTgzMF9ERVJFRjE2KHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCisKKworCisjZGVmaW5lIEk4MzBfVkVSQk9TRSAwCisKKyNkZWZpbmUgUklOR19MT0NBTFMJdW5zaWduZWQgaW50IG91dHJpbmcsIHJpbmdtYXNrLCBvdXRjb3VudDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgY2hhciAqdmlydDsKKworI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJXAorCWlmIChJODMwX1ZFUkJPU0UpCQkJCVwKKwkJcHJpbnRrKCJCRUdJTl9MUF9SSU5HKCVkKSBpbiAlc1xuIiwJXAorCQkJICBuLCBfX0ZVTkNUSU9OX18pOwkJXAorCWlmIChkZXZfcHJpdi0+cmluZy5zcGFjZSA8IG4qNCkJCQlcCisJCWk4MzBfd2FpdF9yaW5nKGRldiwgbio0LCBfX0ZVTkNUSU9OX18pOwkJXAorCW91dGNvdW50ID0gMDsJCQkJCVwKKwlvdXRyaW5nID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQlcCisJcmluZ21hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQlcCisJdmlydCA9IGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQ7CQlcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgT1VUX1JJTkcobikgZG8gewkJCQkJXAorCWlmIChJODMwX1ZFUkJPU0UpIHByaW50aygiICAgT1VUX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJXAorCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHZpcnQgKyBvdXRyaW5nKSA9IG47CQlcCisgICAgICAgIG91dGNvdW50Kys7CQkJCQkJXAorCW91dHJpbmcgKz0gNDsJCQkJCQlcCisJb3V0cmluZyAmPSByaW5nbWFzazsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoSTgzMF9WRVJCT1NFKSBwcmludGsoIkFEVkFOQ0VfTFBfUklORyAleFxuIiwgb3V0cmluZyk7CVwKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gb3V0cmluZzsJCQkJCVwKKwlkZXZfcHJpdi0+cmluZy5zcGFjZSAtPSBvdXRjb3VudCAqIDQ7CQkJCVwKKwlJODMwX1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkJCVwKK30gd2hpbGUoMCkKKworZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKmRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CisKKworI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQorI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKKyNkZWZpbmUgQ01EX1JFUE9SVF9IRUFECQkJKDc8PDIzKQorI2RlZmluZSBDTURfU1RPUkVfRFdPUkRfSURYCQkoKDB4MjE8PDIzKSB8IDB4MSkKKyNkZWZpbmUgQ01EX09QX0JBVENIX0JVRkZFUiAgKCgweDA8PDI5KXwoMHgzMDw8MjMpfDB4MSkKKworI2RlZmluZSBTVEFURTNEX0xPQURfU1RBVEVfSU1NRURJQVRFXzIgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MDM8PDE2KSkKKyNkZWZpbmUgTE9BRF9URVhUVVJFX01BUDAgICAgICAgICAgICAgICAgICAgKDE8PDExKQorCisjZGVmaW5lIElOU1RfUEFSU0VSX0NMSUVOVCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSU5TVF9PUF9GTFVTSCAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBJTlNUX0ZMVVNIX01BUF9DQUNIRSAweDAwMDAwMDAxCisKKworI2RlZmluZSBCQjFfU1RBUlRfQUREUl9NQVNLICAgKH4weDcpCisjZGVmaW5lIEJCMV9QUk9URUNURUQgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQkIxX1VOUFJPVEVDVEVEICAgICAgICgwPDwwKQorI2RlZmluZSBCQjJfRU5EX0FERFJfTUFTSyAgICAgKH4weDcpCisKKyNkZWZpbmUgSTgzMFJFR19IV1NUQU0JCTB4MDIwOTgKKyNkZWZpbmUgSTgzMFJFR19JTlRfSURFTlRJVFlfUgkweDAyMGE0CisjZGVmaW5lIEk4MzBSRUdfSU5UX01BU0tfUiAJMHgwMjBhOAorI2RlZmluZSBJODMwUkVHX0lOVF9FTkFCTEVfUgkweDAyMGEwCisKKyNkZWZpbmUgSTgzMF9JUlFfUkVTRVJWRUQgKCgxPDwxMyl8KDM8PDIpKQorCisKKyNkZWZpbmUgTFBfUklORyAgICAgCQkweDIwMzAKKyNkZWZpbmUgSFBfUklORyAgICAgCQkweDIwNDAKKyNkZWZpbmUgUklOR19UQUlMICAgICAgCQkweDAwCisjZGVmaW5lIFRBSUxfQUREUgkJMHgwMDFGRkZGOAorI2RlZmluZSBSSU5HX0hFQUQgICAgICAJCTB4MDQKKyNkZWZpbmUgSEVBRF9XUkFQX0NPVU5UICAgICAJMHhGRkUwMDAwMAorI2RlZmluZSBIRUFEX1dSQVBfT05FICAgICAgIAkweDAwMjAwMDAwCisjZGVmaW5lIEhFQURfQUREUiAgICAgICAgICAgCTB4MDAxRkZGRkMKKyNkZWZpbmUgUklOR19TVEFSVCAgICAgCQkweDA4CisjZGVmaW5lIFNUQVJUX0FERFIgICAgICAgICAgCTB4MHhGRkZGRjAwMAorI2RlZmluZSBSSU5HX0xFTiAgICAgICAJCTB4MEMKKyNkZWZpbmUgUklOR19OUl9QQUdFUyAgICAgICAJMHgwMDFGRjAwMCAKKyNkZWZpbmUgUklOR19SRVBPUlRfTUFTSyAgICAJMHgwMDAwMDAwNgorI2RlZmluZSBSSU5HX1JFUE9SVF82NEsgICAgIAkweDAwMDAwMDAyCisjZGVmaW5lIFJJTkdfUkVQT1JUXzEyOEsgICAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgUklOR19OT19SRVBPUlQgICAgICAJMHgwMDAwMDAwMAorI2RlZmluZSBSSU5HX1ZBTElEX01BU0sgICAgIAkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfVkFMSUQgICAgICAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19JTlZBTElEICAgICAgICAJMHgwMDAwMDAwMAorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SICAgICAgICAgKCgweDM8PDI5KXwoMHgxYzw8MjQpfCgweDEwPDwxOSkpCisjZGVmaW5lIFNDX1VQREFURV9TQ0lTU09SICAgICAgICgweDE8PDEpCisjZGVmaW5lIFNDX0VOQUJMRV9NQVNLICAgICAgICAgICgweDE8PDApCisjZGVmaW5lIFNDX0VOQUJMRSAgICAgICAgICAgICAgICgweDE8PDApCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1JfSU5GTyAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwoMHgxKSkKKyNkZWZpbmUgU0NJX1lNSU5fTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKyNkZWZpbmUgU0NJX1lNQVhfTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9FTkFCTEUJICgoMHgzPDwyOSl8KDB4MWM8PDI0KXwoMHgxMDw8MTkpKQorI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9SRUNUCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwxKQorI2RlZmluZSBHRlhfT1BfQ09MT1JfRkFDVE9SICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDE8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9TVElQUExFICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODM8PDE2KSkKKyNkZWZpbmUgR0ZYX09QX01BUF9JTkZPICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwweDQpCisjZGVmaW5lIEdGWF9PUF9ERVNUQlVGRkVSX1ZBUlMgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODU8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9EUkFXUkVDVF9JTkZPICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODA8PDE2KXwoMHgzKSkKKyNkZWZpbmUgR0ZYX09QX1BSSU1JVElWRSAgICAgICAgICgoMHgzPDwyOSl8KDB4MWY8PDI0KSkKKworI2RlZmluZSBDTURfT1BfREVTVEJVRkZFUl9JTkZPCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4OGU8PDE2KXwxKQorCisjZGVmaW5lIENNRF9PUF9ESVNQTEFZQlVGRkVSX0lORk8gKCgweDA8PDI5KXwoMHgxNDw8MjMpfDIpCisjZGVmaW5lIEFTWU5DX0ZMSVAgICAgICAgICAgICAgICAgKDE8PDIyKQorCisjZGVmaW5lIENNRF8zRCAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4Mzw8MjkpCisjZGVmaW5lIFNUQVRFM0RfQ09OU1RfQkxFTkRfQ09MT1JfQ01EICAgKENNRF8zRHwoMHgxZDw8MjQpfCgweDg4PDwxNikpCisjZGVmaW5lIFNUQVRFM0RfTUFQX0NPT1JEX1NFVEJJTkRfQ01EICAgKENNRF8zRHwoMHgxZDw8MjQpfCgweDAyPDwxNikpCisKKyNkZWZpbmUgQlIwMF9CSVRCTFRfQ0xJRU5UICAgMHg0MDAwMDAwMAorI2RlZmluZSBCUjAwX09QX0NPTE9SX0JMVCAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJSMDBfT1BfU1JDX0NPUFlfQkxUIDB4MTBDMDAwMDAKKyNkZWZpbmUgQlIxM19TT0xJRF9QQVRURVJOICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIEJVRl8zRF9JRF9DT0xPUl9CQUNLICAgICgweDM8PDI0KQorI2RlZmluZSBCVUZfM0RfSURfREVQVEggICAgICAgICAoMHg3PDwyNCkKKyNkZWZpbmUgQlVGXzNEX1VTRV9GRU5DRSAgICAgICAgKDE8PDIzKQorI2RlZmluZSBCVUZfM0RfUElUQ0goeCkgICAgICAgICAoKCh4KS80KTw8MikKKworI2RlZmluZSBDTURfT1BfTUFQX1BBTEVUVEVfTE9BRAkoKDM8PDI5KXwoMHgxZDw8MjQpfCgweDgyPDwxNil8MjU1KQorI2RlZmluZSBNQVBfUEFMRVRURV9OVU0oeCkJKCh4PDw4KSAmICgxPDw4KSkKKyNkZWZpbmUgTUFQX1BBTEVUVEVfQk9USAkoMTw8MTEpCisKKyNkZWZpbmUgWFlfQ09MT1JfQkxUX0NNRAkJKCgyPDwyOSl8KDB4NTA8PDIyKXwweDQpCisjZGVmaW5lIFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQQkoMTw8MjEpCisjZGVmaW5lIFhZX0NPTE9SX0JMVF9XUklURV9SR0IJCSgxPDwyMCkKKworI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfQ01EICAgICAgICAgICAgICgoMjw8MjkpfCgweDUzPDwyMil8NikKKyNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBICAgICAoMTw8MjEpCisjZGVmaW5lIFhZX1NSQ19DT1BZX0JMVF9XUklURV9SR0IgICAgICAgKDE8PDIwKQorCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUiAJKCgweDMwPDwyMyl8MSkKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIAkoMHgzMTw8MjMpCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9FTkQgCSgweEE8PDIzKQorI2RlZmluZSBNSV9CQVRDSF9OT05fU0VDVVJFCSgxKQorCisjZGVmaW5lIE1JX1dBSVRfRk9SX0VWRU5UICAgICAgICgoMHgzPDwyMykpCisjZGVmaW5lIE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUCAgICAgICgxPDwyKSAKKyNkZWZpbmUgTUlfV0FJVF9GT1JfUExBTkVfQV9TQ0FOTElORVMgKDE8PDEpIAorCisjZGVmaW5lIE1JX0xPQURfU0NBTl9MSU5FU19JTkNMICAoKDB4MTI8PDIzKSkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDc3MjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiBpODMwX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTgzMCAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcm0uaCIKKyNpbmNsdWRlICJpODMwX2Rydi5oIgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFzayBxdWV1ZSBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworCitpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICkKK3sKKwlkcm1fZGV2aWNlX3QJICpkZXYgPSAoZHJtX2RldmljZV90ICopYXJnOworICAgICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAl1MTYgdGVtcDsKKworICAgICAgCXRlbXAgPSBJODMwX1JFQUQxNihJODMwUkVHX0lOVF9JREVOVElUWV9SKTsKKwlEUk1fREVCVUcoIiV4XG4iLCB0ZW1wKTsKKworICAgCWlmICggISggdGVtcCAmIDIgKSApIAorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlJODMwX1dSSVRFMTYoSTgzMFJFR19JTlRfSURFTlRJVFlfUiwgdGVtcCk7IAorCisJYXRvbWljX2luYygmZGV2X3ByaXYtPmlycV9yZWNlaXZlZCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsgCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworaW50IGk4MzBfZW1pdF9pcnEoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJYXRvbWljX2luYygmZGV2X3ByaXYtPmlycV9lbWl0dGVkKTsKKworICAgCUJFR0lOX0xQX1JJTkcoMik7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlPVVRfUklORyggR0ZYX09QX1VTRVJfSU5URVJSVVBUICk7CisgICAgICAJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfZW1pdHRlZCk7Cit9CisKKworaW50IGk4MzBfd2FpdF9pcnEoZHJtX2RldmljZV90ICpkZXYsIGludCBpcnFfbnIpCit7CisgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZW5kID0gamlmZmllcyArIEhaKjM7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisgCWlmIChhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmlycV9yZWNlaXZlZCkgPj0gaXJxX25yKSAgCisgCQlyZXR1cm4gMDsgCisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9XQUlUOworCisJYWRkX3dhaXRfcXVldWUoJmRldl9wcml2LT5pcnFfcXVldWUsICZlbnRyeSk7CisKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkgICAJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+aXJxX3JlY2VpdmVkKSA+PSBpcnFfbnIpIAorCQkgICBicmVhazsKKwkJaWYoKHNpZ25lZCkoZW5kIC0gamlmZmllcykgPD0gMCkgeworCQkJRFJNX0VSUk9SKCJ0aW1lb3V0IGlpciAleCBpbXIgJXggaWVyICV4IGh3c3RhbSAleFxuIiwKKwkJCQkgIEk4MzBfUkVBRDE2KCBJODMwUkVHX0lOVF9JREVOVElUWV9SICksCisJCQkJICBJODMwX1JFQUQxNiggSTgzMFJFR19JTlRfTUFTS19SICksCisJCQkJICBJODMwX1JFQUQxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IgKSwKKwkJCQkgIEk4MzBfUkVBRDE2KCBJODMwUkVHX0hXU1RBTSApKTsKKworCQkgICAJcmV0ID0gLUVCVVNZOwkvKiBMb2NrdXA/ICBNaXNzZWQgaXJxPyAqLworCQkJYnJlYWs7CisJCX0KKwkgICAgICAJc2NoZWR1bGVfdGltZW91dChIWiozKTsKKwkgICAgICAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCSAgIAlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0KKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2X3ByaXYtPmlycV9xdWV1ZSwgJmVudHJ5KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIE5lZWRzIHRoZSBsb2NrIGFzIGl0IHRvdWNoZXMgdGhlIHJpbmcuCisgKi8KK2ludCBpODMwX2lycV9lbWl0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfaXJxX2VtaXRfdCBlbWl0OworCWludCByZXN1bHQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlciggJmVtaXQsIChkcm1faTgzMF9pcnFfZW1pdF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGVtaXQpICkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVzdWx0ID0gaTgzMF9lbWl0X2lycSggZGV2ICk7CisKKwlpZiAoIGNvcHlfdG9fdXNlciggZW1pdC5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogRG9lc24ndCBuZWVkIHRoZSBoYXJkd2FyZSBsb2NrLgorICovCitpbnQgaTgzMF9pcnFfd2FpdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODMwX2lycV93YWl0X3QgaXJxd2FpdDsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlciggJmlycXdhaXQsIChkcm1faTgzMF9pcnFfd2FpdF90IF9fdXNlciAqKWFyZywgCisJCQkgICAgc2l6ZW9mKGlycXdhaXQpICkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGk4MzBfd2FpdF9pcnEoIGRldiwgaXJxd2FpdC5pcnFfc2VxICk7Cit9CisKKworLyogZHJtX2RtYS5oIGhvb2tzCisqLwordm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCShkcm1faTgzMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJSTgzMF9XUklURTE2KCBJODMwUkVHX0hXU1RBTSwgMHhmZmZmICk7CisJSTgzMF9XUklURTE2KCBJODMwUkVHX0lOVF9NQVNLX1IsIDB4MCApOworCUk4MzBfV1JJVEUxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4MCApOworCWF0b21pY19zZXQoJmRldl9wcml2LT5pcnFfcmVjZWl2ZWQsIDApOworCWF0b21pY19zZXQoJmRldl9wcml2LT5pcnFfZW1pdHRlZCwgMCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7Cit9CisKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlJODMwX1dSSVRFMTYoIEk4MzBSRUdfSU5UX0VOQUJMRV9SLCAweDIgKTsKK30KKwordm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJSTgzMF9XUklURTE2KCBJODMwUkVHX0lOVF9NQVNLX1IsIDB4ZmZmZiApOworCUk4MzBfV1JJVEUxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4MCApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDBhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qIGk5MTVfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworZHJtX2lvY3RsX2Rlc2NfdCBpOTE1X2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVCldID0ge2k5MTVfZG1hX2luaXQsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxVU0gpXSA9IHtpOTE1X2ZsdXNoX2lvY3RsLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMSVApXSA9IHtpOTE1X2ZsaXBfYnVmcywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9CQVRDSEJVRkZFUildID0ge2k5MTVfYmF0Y2hidWZmZXIsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX0VNSVQpXSA9IHtpOTE1X2lycV9lbWl0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9XQUlUKV0gPSB7aTkxNV9pcnFfd2FpdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9HRVRQQVJBTSldID0ge2k5MTVfZ2V0cGFyYW0sIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfU0VUUEFSQU0pXSA9IHtpOTE1X3NldHBhcmFtLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0FMTE9DKV0gPSB7aTkxNV9tZW1fYWxsb2MsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRlJFRSldID0ge2k5MTVfbWVtX2ZyZWUsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVF9IRUFQKV0gPSB7aTkxNV9tZW1faW5pdF9oZWFwLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0NNREJVRkZFUildID0ge2k5MTVfY21kYnVmZmVyLCAxLCAwfQorfTsKKworaW50IGk5MTVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOworCisvKiBSZWFsbHkgd2FudCBhbiBPUy1pbmRlcGVuZGVudCByZXNldHRhYmxlIHRpbWVyLiAgV291bGQgbGlrZSB0byBoYXZlCisgKiB0aGlzIGxvb3AgcnVuIGZvciAoZWcpIDMgc2VjLCBidXQgaGF2ZSB0aGUgdGltZXIgcmVzZXQgZXZlcnkgdGltZQorICogdGhlIGhlYWQgcG9pbnRlciBjaGFuZ2VzLCBzbyB0aGF0IEVCVVNZIG9ubHkgaGFwcGVucyBpZiB0aGUgcmluZworICogYWN0dWFsbHkgc3RhbGxzIGZvciAoZWcpIDMgc2Vjb25kcy4KKyAqLworaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisJdTMyIGxhc3RfaGVhZCA9IEk5MTVfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXJpbmctPmhlYWQgPSBJOTE1X1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsICsgOCk7CisJCWlmIChyaW5nLT5zcGFjZSA8IDApCisJCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCQlpZiAocmluZy0+c3BhY2UgPj0gbikKKwkJCXJldHVybiAwOworCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1dBSVQ7CisKKwkJaWYgKHJpbmctPmhlYWQgIT0gbGFzdF9oZWFkKQorCQkJaSA9IDA7CisKKwkJbGFzdF9oZWFkID0gcmluZy0+aGVhZDsKKwl9CisKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3ZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisKKwlyaW5nLT5oZWFkID0gSTkxNV9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworCXJpbmctPnRhaWwgPSBJOTE1X1JFQUQoTFBfUklORyArIFJJTkdfVEFJTCkgJiBUQUlMX0FERFI7CisJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyA4KTsKKwlpZiAocmluZy0+c3BhY2UgPCAwKQorCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCisJaWYgKHJpbmctPmhlYWQgPT0gcmluZy0+dGFpbCkKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfUklOR19FTVBUWTsKK30KKworaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQoreworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoZGV2LT5pcnEpCisJCWRybV9pcnFfdW5pbnN0YWxsIChkZXYpOworCisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCSAgICAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQpIHsKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCAmZGV2X3ByaXYtPnJpbmcubWFwLCBkZXYpOworCQl9CisKKwkJaWYgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQkJZHJtX3BjaV9mcmVlKGRldiwgUEFHRV9TSVpFLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsCisJCQkJICAgICBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwkJCS8qIE5lZWQgdG8gcmV3cml0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZSAqLworCQkJSTkxNV9XUklURSgweDAyMDgwLCAweDFmZmZmMDAwKTsKKwkJfQorCisJCWRybV9mcmVlIChkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSwKKwkJCSAgIERSTV9NRU1fRFJJVkVSKTsKKworCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorCQkJICAgZHJtX2k5MTVfcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkgICBkcm1faTkxNV9pbml0X3QgKiBpbml0KQoreworCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCkpOworCisJRFJNX0dFVFNBUkVBKCk7CisJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+bW1pb19tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmICghZGV2X3ByaXYtPm1taW9fbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIG1taW8gbWFwIVxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQorCSAgICAoKHU4ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisJZGV2X3ByaXYtPnJpbmcuU3RhcnQgPSBpbml0LT5yaW5nX3N0YXJ0OworCWRldl9wcml2LT5yaW5nLkVuZCA9IGluaXQtPnJpbmdfZW5kOworCWRldl9wcml2LT5yaW5nLlNpemUgPSBpbml0LT5yaW5nX3NpemU7CisJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0gZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDE7CisKKwlkZXZfcHJpdi0+cmluZy5tYXAub2Zmc2V0ID0gaW5pdC0+cmluZ19zdGFydDsKKwlkZXZfcHJpdi0+cmluZy5tYXAuc2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKwlkZXZfcHJpdi0+cmluZy5tYXAudHlwZSA9IDA7CisJZGV2X3ByaXYtPnJpbmcubWFwLmZsYWdzID0gMDsKKwlkZXZfcHJpdi0+cmluZy5tYXAubXRyciA9IDA7CisKKwlkcm1fY29yZV9pb3JlbWFwKCAmZGV2X3ByaXYtPnJpbmcubWFwLCBkZXYgKTsKKworCWlmIChkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID09IE5VTEwpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGlvcmVtYXAgdmlydHVhbCBhZGRyZXNzIGZvciIKKwkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9IGRldl9wcml2LT5yaW5nLm1hcC5oYW5kbGU7CisKKwlkZXZfcHJpdi0+YmFja19vZmZzZXQgPSBpbml0LT5iYWNrX29mZnNldDsKKwlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ID0gaW5pdC0+ZnJvbnRfb2Zmc2V0OworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJLyogV2UgYXJlIHVzaW5nIHNlcGFyYXRlIHZhbHVlcyBhcyBwbGFjZWhvbGRlcnMgZm9yIG1lY2hhbmlzbXMgZm9yCisJICogcHJpdmF0ZSBiYWNrYnVmZmVyL2RlcHRoYnVmZmVyIHVzYWdlLgorCSAqLworCWRldl9wcml2LT51c2VfbWlfYmF0Y2hidWZmZXJfc3RhcnQgPSAwOworCisJLyogQWxsb3cgaGFyZHdhcmUgYmF0Y2hidWZmZXJzIHVubGVzcyB0b2xkIG90aGVyd2lzZS4KKwkgKi8KKwlkZXZfcHJpdi0+YWxsb3dfYmF0Y2hidWZmZXIgPSAxOworCisJLyogUHJvZ3JhbSBIYXJkd2FyZSBTdGF0dXMgUGFnZSAqLworCWRldl9wcml2LT5od19zdGF0dXNfcGFnZSA9IGRybV9wY2lfYWxsb2MoZGV2LCBQQUdFX1NJWkUsIFBBR0VfU0laRSwKKwkJCQkJCSAweGZmZmZmZmZmLCAKKwkJCQkJCSAmZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisKKwlpZiAoIWRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTkxNV9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoIkNhbiBub3QgYWxsb2NhdGUgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwltZW1zZXQoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlLCAwLCBQQUdFX1NJWkUpOworCURSTV9ERUJVRygiaHcgc3RhdHVzIHBhZ2UgQCAlcFxuIiwgZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKTsKKworCUk5MTVfV1JJVEUoMHgwMjA4MCwgZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisJRFJNX0RFQlVHKCJFbmFibGVkIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9yZXN1bWUoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIWRldl9wcml2LT5tbWlvX21hcCkgeworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBtbWlvIG1hcCFcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGlvcmVtYXAgdmlydHVhbCBhZGRyZXNzIGZvciIKKwkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJLyogUHJvZ3JhbSBIYXJkd2FyZSBTdGF0dXMgUGFnZSAqLworCWlmICghZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSB7CisJCURSTV9FUlJPUigiQ2FuIG5vdCBmaW5kIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworCisJSTkxNV9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlkcm1faTkxNV9pbml0X3QgaW5pdDsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5pdCwgKGRybV9pOTE1X2luaXRfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGluaXQpKTsKKworCXN3aXRjaCAoaW5pdC5mdW5jKSB7CisJY2FzZSBJOTE1X0lOSVRfRE1BOgorCQlkZXZfcHJpdiA9IGRybV9hbGxvYyAoc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCksCisJCQkJICAgICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQlyZXRjb2RlID0gaTkxNV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0NMRUFOVVBfRE1BOgorCQlyZXRjb2RlID0gaTkxNV9kbWFfY2xlYW51cChkZXYpOworCQlicmVhazsKKwljYXNlIEk5MTVfUkVTVU1FX0RNQToKKwkJcmV0Y29kZSA9IGk5MTVfcmVzdW1lKGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldGNvZGUgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyogSW1wbGVtZW50IGJhc2ljYWxseSB0aGUgc2FtZSBzZWN1cml0eSByZXN0cmljdGlvbnMgYXMgaGFyZHdhcmUgZG9lcworICogZm9yIE1JX0JBVENIX05PTl9TRUNVUkUuICBUaGVzZSBjYW4gYmUgbWFkZSBzdHJpY3RlciBhdCBhbnkgdGltZS4KKyAqCisgKiBNb3N0IG9mIHRoZSBjYWxjdWxhdGlvbnMgYmVsb3cgaW52b2x2ZSBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBhCisgKiBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgSXQncyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSBzaXplIHJpZ2h0IGFzCisgKiB0aGF0IHRlbGxzIHVzIHdoZXJlIHRoZSBuZXh0IGluc3RydWN0aW9uIHRvIGNoZWNrIGlzLiAgQW55IGlsbGVnYWwKKyAqIGluc3RydWN0aW9uIGRldGVjdGVkIHdpbGwgYmUgZ2l2ZW4gYSBzaXplIG9mIHplcm8sIHdoaWNoIGlzIGEKKyAqIHNpZ25hbCB0byBhYm9ydCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGRvX3ZhbGlkYXRlX2NtZChpbnQgY21kKQoreworCXN3aXRjaCAoKChjbWQgPj4gMjkpICYgMHg3KSkgeworCWNhc2UgMHgwOgorCQlzd2l0Y2ggKChjbWQgPj4gMjMpICYgMHgzZikgeworCQljYXNlIDB4MDoKKwkJCXJldHVybiAxOwkvKiBNSV9OT09QICovCisJCWNhc2UgMHg0OgorCQkJcmV0dXJuIDE7CS8qIE1JX0ZMVVNIICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsJLyogZGlzYWxsb3cgZXZlcnl0aGluZyBlbHNlICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDE6CisJCXJldHVybiAwOwkvKiByZXNlcnZlZCAqLworCWNhc2UgMHgyOgorCQlyZXR1cm4gKGNtZCAmIDB4ZmYpICsgMjsJLyogMmQgY29tbWFuZHMgKi8KKwljYXNlIDB4MzoKKwkJaWYgKCgoY21kID4+IDI0KSAmIDB4MWYpIDw9IDB4MTgpCisJCQlyZXR1cm4gMTsKKworCQlzd2l0Y2ggKChjbWQgPj4gMjQpICYgMHgxZikgeworCQljYXNlIDB4MWM6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAweDFkOgorCQkJc3dpdGNoICgoY21kPj4xNikmMHhmZikgeworCQkJY2FzZSAweDM6CisJCQkJcmV0dXJuIChjbWQgJiAweDFmKSArIDI7CisJCQljYXNlIDB4NDoKKwkJCQlyZXR1cm4gKGNtZCAmIDB4ZikgKyAyOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gKGNtZCAmIDB4ZmZmZikgKyAyOworCQkJfQorCQljYXNlIDB4MWU6CisJCQlpZiAoY21kICYgKDEgPDwgMjMpKQorCQkJCXJldHVybiAoY21kICYgMHhmZmZmKSArIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisJCWNhc2UgMHgxZjoKKwkJCWlmICgoY21kICYgKDEgPDwgMjMpKSA9PSAwKQkvKiBpbmxpbmUgdmVydGljZXMgKi8KKwkJCQlyZXR1cm4gKGNtZCAmIDB4MWZmZmYpICsgMjsKKwkJCWVsc2UgaWYgKGNtZCAmICgxIDw8IDE3KSkJLyogaW5kaXJlY3QgcmFuZG9tICovCisJCQkJaWYgKChjbWQgJiAweGZmZmYpID09IDApCisJCQkJCXJldHVybiAwOwkvKiB1bmtub3duIGxlbmd0aCwgdG9vIGhhcmQgKi8KKwkJCQllbHNlCisJCQkJCXJldHVybiAoKChjbWQgJiAweGZmZmYpICsgMSkgLyAyKSArIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDI7CS8qIGluZGlyZWN0IHNlcXVlbnRpYWwgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfY21kKGludCBjbWQpCit7CisJaW50IHJldCA9IGRvX3ZhbGlkYXRlX2NtZChjbWQpOworCisvKiAJcHJpbnRrKCJ2YWxpZGF0ZV9jbWQoICV4ICk6ICVkXG4iLCBjbWQsIHJldCk7ICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IF9fdXNlciAqIGJ1ZmZlciwgaW50IGR3b3JkcykKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKworCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7KSB7CisJCWludCBjbWQsIHN6OworCisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZjbWQsICZidWZmZXJbaV0sIHNpemVvZihjbWQpKSkKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKy8qIAkJcHJpbnRrKCIlZC8lZCAiLCBpLCBkd29yZHMpOyAqLworCisJCWlmICgoc3ogPSB2YWxpZGF0ZV9jbWQoY21kKSkgPT0gMCB8fCBpICsgc3ogPiBkd29yZHMpCisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJCUJFR0lOX0xQX1JJTkcoc3opOworCQlPVVRfUklORyhjbWQpOworCisJCXdoaWxlICgrK2ksIC0tc3opIHsKKwkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZjbWQsICZidWZmZXJbaV0sCisJCQkJCQkJIHNpemVvZihjbWQpKSkgeworCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQl9CisJCQlPVVRfUklORyhjbWQpOworCQl9CisJCUFEVkFOQ0VfTFBfUklORygpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfZW1pdF9ib3goZHJtX2RldmljZV90ICogZGV2LAorCQkJIGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKiBib3hlcywKKwkJCSBpbnQgaSwgaW50IERSMSwgaW50IERSNCkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fY2xpcF9yZWN0X3QgYm94OworCVJJTkdfTE9DQUxTOworCisJaWYgKERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmJveCwgJmJveGVzW2ldLCBzaXplb2YoYm94KSkpIHsKKwkJcmV0dXJuIEVGQVVMVDsKKwl9CisKKwlpZiAoYm94LnkyIDw9IGJveC55MSB8fCBib3gueDIgPD0gYm94LngxIHx8IGJveC55MiA8PSAwIHx8IGJveC54MiA8PSAwKSB7CisJCURSTV9FUlJPUigiQmFkIGJveCAlZCwlZC4uJWQsJWRcbiIsCisJCQkgIGJveC54MSwgYm94LnkxLCBib3gueDIsIGJveC55Mik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJQkVHSU5fTFBfUklORyg2KTsKKwlPVVRfUklORyhHRlhfT1BfRFJBV1JFQ1RfSU5GTyk7CisJT1VUX1JJTkcoRFIxKTsKKwlPVVRfUklORygoYm94LngxICYgMHhmZmZmKSB8IChib3gueTEgPDwgMTYpKTsKKwlPVVRfUklORygoKGJveC54MiAtIDEpICYgMHhmZmZmKSB8ICgoYm94LnkyIC0gMSkgPDwgMTYpKTsKKwlPVVRfUklORyhEUjQpOworCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorCQkJCSAgIGRybV9pOTE1X2NtZGJ1ZmZlcl90ICogY21kKQoreworCWludCBuYm94ID0gY21kLT5udW1fY2xpcHJlY3RzOworCWludCBpID0gMCwgY291bnQsIHJldDsKKworCWlmIChjbWQtPnN6ICYgMHgzKSB7CisJCURSTV9FUlJPUigiYWxpZ25tZW50Iik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwljb3VudCA9IG5ib3ggPyBuYm94IDogMTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChpIDwgbmJveCkgeworCQkJcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGNtZC0+Y2xpcHJlY3RzLCBpLAorCQkJCQkgICAgY21kLT5EUjEsIGNtZC0+RFI0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IGk5MTVfZW1pdF9jbWRzKGRldiwgKGludCBfX3VzZXIgKiljbWQtPmJ1ZiwgY21kLT5zeiAvIDQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgIGRybV9pOTE1X2JhdGNoYnVmZmVyX3QgKiBiYXRjaCkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGJhdGNoLT5jbGlwcmVjdHM7CisJaW50IG5ib3ggPSBiYXRjaC0+bnVtX2NsaXByZWN0czsKKwlpbnQgaSA9IDAsIGNvdW50OworCVJJTkdfTE9DQUxTOworCisJaWYgKChiYXRjaC0+c3RhcnQgfCBiYXRjaC0+dXNlZCkgJiAweDcpIHsKKwkJRFJNX0VSUk9SKCJhbGlnbm1lbnQiKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCWNvdW50ID0gbmJveCA/IG5ib3ggOiAxOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGkgPCBuYm94KSB7CisJCQlpbnQgcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGJveGVzLCBpLAorCQkJCQkJYmF0Y2gtPkRSMSwgYmF0Y2gtPkRSNCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCkgeworCQkJQkVHSU5fTFBfUklORygyKTsKKwkJCU9VVF9SSU5HKE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8ICgyIDw8IDYpKTsKKwkJCU9VVF9SSU5HKGJhdGNoLT5zdGFydCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0gZWxzZSB7CisJCQlCRUdJTl9MUF9SSU5HKDQpOworCQkJT1VUX1JJTkcoTUlfQkFUQ0hfQlVGRkVSKTsKKwkJCU9VVF9SSU5HKGJhdGNoLT5zdGFydCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOworCQkJT1VUX1JJTkcoYmF0Y2gtPnN0YXJ0ICsgYmF0Y2gtPnVzZWQgLSA0KTsKKwkJCU9VVF9SSU5HKDApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCUJFR0lOX0xQX1JJTkcoNCk7CisJT1VUX1JJTkcoQ01EX1NUT1JFX0RXT1JEX0lEWCk7CisJT1VUX1JJTkcoMjApOworCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsCisJCSAgX19GVU5DVElPTl9fLAorCQkgIGRldl9wcml2LT5jdXJyZW50X3BhZ2UsCisJCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSk7CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCUJFR0lOX0xQX1JJTkcoMik7CisJT1VUX1JJTkcoSU5TVF9QQVJTRVJfQ0xJRU5UIHwgSU5TVF9PUF9GTFVTSCB8IElOU1RfRkxVU0hfTUFQX0NBQ0hFKTsKKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCUJFR0lOX0xQX1JJTkcoNik7CisJT1VUX1JJTkcoQ01EX09QX0RJU1BMQVlCVUZGRVJfSU5GTyB8IEFTWU5DX0ZMSVApOworCU9VVF9SSU5HKDApOworCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIHsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0KTsKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDE7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmZyb250X29mZnNldCk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCX0KKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCUJFR0lOX0xQX1JJTkcoMik7CisJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVApOworCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZW5xdWV1ZSA9IGRldl9wcml2LT5jb3VudGVyKys7CisKKwlCRUdJTl9MUF9SSU5HKDQpOworCU9VVF9SSU5HKENNRF9TVE9SRV9EV09SRF9JRFgpOworCU9VVF9SSU5HKDIwKTsKKwlPVVRfUklORyhkZXZfcHJpdi0+Y291bnRlcik7CisJT1VUX1JJTkcoMCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKwlyZXR1cm4gaTkxNV93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fKTsKK30KKworaW50IGk5MTVfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJcmV0dXJuIGk5MTVfcXVpZXNjZW50KGRldik7Cit9CisKK2ludCBpOTE1X2JhdGNoYnVmZmVyKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKwlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pOTE1X3NhcmVhX3QgKikKKwkgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCBiYXRjaDsKKwlpbnQgcmV0OworCisJaWYgKCFkZXZfcHJpdi0+YWxsb3dfYmF0Y2hidWZmZXIpIHsKKwkJRFJNX0VSUk9SKCJCYXRjaGJ1ZmZlciBpb2N0bCBkaXNhYmxlZFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGJhdGNoLCAoZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGJhdGNoKSk7CisKKwlEUk1fREVCVUcoImk5MTUgYmF0Y2hidWZmZXIsIHN0YXJ0ICV4IHVzZWQgJWQgY2xpcHJlY3RzICVkXG4iLAorCQkgIGJhdGNoLnN0YXJ0LCBiYXRjaC51c2VkLCBiYXRjaC5udW1fY2xpcHJlY3RzKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJaWYgKGJhdGNoLm51bV9jbGlwcmVjdHMgJiYgRFJNX1ZFUklGWUFSRUFfUkVBRChiYXRjaC5jbGlwcmVjdHMsCisJCQkJCQkgICAgICAgYmF0Y2gubnVtX2NsaXByZWN0cyAqCisJCQkJCQkgICAgICAgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJcmV0ID0gaTkxNV9kaXNwYXRjaF9iYXRjaGJ1ZmZlcihkZXYsICZiYXRjaCk7CisKKwlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludClod19zdGF0dXNbNV07CisJcmV0dXJuIHJldDsKK30KKworaW50IGk5MTVfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKwlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pOTE1X3NhcmVhX3QgKikKKwkgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k5MTVfY21kYnVmZmVyX3QgY21kYnVmOworCWludCByZXQ7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY21kYnVmLCAoZHJtX2k5MTVfY21kYnVmZmVyX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihjbWRidWYpKTsKKworCURSTV9ERUJVRygiaTkxNSBjbWRidWZmZXIsIGJ1ZiAlcCBzeiAlZCBjbGlwcmVjdHMgJWRcbiIsCisJCSAgY21kYnVmLmJ1ZiwgY21kYnVmLnN6LCBjbWRidWYubnVtX2NsaXByZWN0cyk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmIChjbWRidWYubnVtX2NsaXByZWN0cyAmJgorCSAgICBEUk1fVkVSSUZZQVJFQV9SRUFEKGNtZGJ1Zi5jbGlwcmVjdHMsCisJCQkJY21kYnVmLm51bV9jbGlwcmVjdHMgKgorCQkJCXNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkgeworCQlEUk1fRVJST1IoIkZhdWx0IGFjY2Vzc2luZyBjbGlwcmVjdHNcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldCA9IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKGRldiwgJmNtZGJ1Zik7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpaHdfc3RhdHVzWzVdOworCXJldHVybiAwOworfQorCitpbnQgaTkxNV9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkKKwkJaTkxNV9kaXNwYXRjaF9mbGlwKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfZmxpcF9idWZzKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlyZXR1cm4gaTkxNV9kaXNwYXRjaF9mbGlwKGRldik7Cit9CisKK2ludCBpOTE1X2dldHBhcmFtKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfZ2V0cGFyYW1fdCBwYXJhbTsKKwlpbnQgdmFsdWU7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHBhcmFtLCAoZHJtX2k5MTVfZ2V0cGFyYW1fdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKHBhcmFtKSk7CisKKwlzd2l0Y2ggKHBhcmFtLnBhcmFtKSB7CisJY2FzZSBJOTE1X1BBUkFNX0lSUV9BQ1RJVkU6CisJCXZhbHVlID0gZGV2LT5pcnEgPyAxIDogMDsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X1BBUkFNX0FMTE9XX0JBVENIQlVGRkVSOgorCQl2YWx1ZSA9IGRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA/IDEgOiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVua293biBwYXJhbWV0ZXIgJWRcbiIsIHBhcmFtLnBhcmFtKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoRFJNX0NPUFlfVE9fVVNFUihwYXJhbS52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSkpIHsKKwkJRFJNX0VSUk9SKCJEUk1fQ09QWV9UT19VU0VSIGZhaWxlZFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfc2V0cGFyYW1fdCBwYXJhbTsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwocGFyYW0sIChkcm1faTkxNV9zZXRwYXJhbV90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YocGFyYW0pKTsKKworCXN3aXRjaCAocGFyYW0ucGFyYW0pIHsKKwljYXNlIEk5MTVfU0VUUEFSQU1fVVNFX01JX0JBVENIQlVGRkVSX1NUQVJUOgorCQlkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0ID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWNhc2UgSTkxNV9TRVRQQVJBTV9URVhfTFJVX0xPR19HUkFOVUxBUklUWToKKwkJZGV2X3ByaXYtPnRleF9scnVfbG9nX2dyYW51bGFyaXR5ID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWNhc2UgSTkxNV9TRVRQQVJBTV9BTExPV19CQVRDSEJVRkZFUjoKKwkJZGV2X3ByaXYtPmFsbG93X2JhdGNoYnVmZmVyID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigidW5rbm93biBwYXJhbWV0ZXIgJWRcbiIsIHBhcmFtLnBhcmFtKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCSAgICAgICAgaTkxNV9tZW1fdGFrZWRvd24oICYoZGV2X3ByaXYtPmFncF9oZWFwKSApOworIAl9CisJaTkxNV9kbWFfY2xlYW51cCggZGV2ICk7Cit9CisKK3ZvaWQgaTkxNV9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAgICAgICAgICAgaTkxNV9tZW1fcmVsZWFzZSggZGV2LCBmaWxwLCBkZXZfcHJpdi0+YWdwX2hlYXAgKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU1ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCkBAIC0wLDAgKzEsMTY3IEBACisjaWZuZGVmIF9JOTE1X0RSTV9IXworI2RlZmluZSBfSTkxNV9EUk1fSF8KKworLyogUGxlYXNlIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHRvIGFsbCBzdHJ1Y3RzIGRlZmluZWQgaGVyZSBhcmUKKyAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHMuCisgKi8KKworI2luY2x1ZGUgImRybS5oIgorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgMTZrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgMjU1IG9mIHRoZW0uCisgKi8KKyNkZWZpbmUgSTkxNV9OUl9URVhfUkVHSU9OUyAyNTUJLyogdGFibGUgc2l6ZSAyayAtIG1heGltdW0gZHVlIHRvIHVzZQorCQkJCSAqIG9mIGNoYXJzIGZvciBuZXh0L3ByZXYgaW5kaWNlcyAqLworI2RlZmluZSBJOTE1X0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFIDE0CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9pbml0IHsKKwllbnVtIHsKKwkJSTkxNV9JTklUX0RNQSA9IDB4MDEsCisJCUk5MTVfQ0xFQU5VUF9ETUEgPSAweDAyLAorCQlJOTE1X1JFU1VNRV9ETUEgPSAweDAzCisJfSBmdW5jOworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7CisJdW5zaWduZWQgaW50IGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7CisJdW5zaWduZWQgaW50IGNoaXBzZXQ7Cit9IGRybV9pOTE1X2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhIHsKKwlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbSTkxNV9OUl9URVhfUkVHSU9OUyArIDFdOworCWludCBsYXN0X3VwbG9hZDsJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisJaW50IHRleEFnZTsKKwlpbnQgcGZfZW5hYmxlZDsJCS8qIGlzIHBhZ2VmbGlwcGluZyBhbGxvd2VkPyAqLworCWludCBwZl9hY3RpdmU7CisJaW50IHBmX2N1cnJlbnRfcGFnZTsJLyogd2hpY2ggYnVmZmVyIGlzIGJlaW5nIGRpc3BsYXllZD8gKi8KKwlpbnQgcGVyZl9ib3hlczsJCS8qIHBlcmZvcm1hbmNlIGJveGVzIHRvIGJlIGRpc3BsYXllZCAqLworfSBkcm1faTkxNV9zYXJlYV90OworCisvKiBGbGFncyBmb3IgcGVyZl9ib3hlcworICovCisjZGVmaW5lIEk5MTVfQk9YX1JJTkdfRU1QVFkgICAgMHgxCisjZGVmaW5lIEk5MTVfQk9YX0ZMSVAgICAgICAgICAgMHgyCisjZGVmaW5lIEk5MTVfQk9YX1dBSVQgICAgICAgICAgMHg0CisjZGVmaW5lIEk5MTVfQk9YX1RFWFRVUkVfTE9BRCAgMHg4CisjZGVmaW5lIEk5MTVfQk9YX0xPU1RfQ09OVEVYVCAgMHgxMAorCisvKiBJOTE1IHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0k5MTVfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTkxNV9GTFVTSAkJMHgwMQorI2RlZmluZSBEUk1fSTkxNV9GTElQCQkweDAyCisjZGVmaW5lIERSTV9JOTE1X0JBVENIQlVGRkVSCTB4MDMKKyNkZWZpbmUgRFJNX0k5MTVfSVJRX0VNSVQJMHgwNAorI2RlZmluZSBEUk1fSTkxNV9JUlFfV0FJVAkweDA1CisjZGVmaW5lIERSTV9JOTE1X0dFVFBBUkFNCTB4MDYKKyNkZWZpbmUgRFJNX0k5MTVfU0VUUEFSQU0JMHgwNworI2RlZmluZSBEUk1fSTkxNV9BTExPQwkJMHgwOAorI2RlZmluZSBEUk1fSTkxNV9GUkVFCQkweDA5CisjZGVmaW5lIERSTV9JOTE1X0lOSVRfSEVBUAkweDBhCisjZGVmaW5lIERSTV9JOTE1X0NNREJVRkZFUgkweDBiCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lOSVQsIGRybV9pOTE1X2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxVU0gJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxJUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0JBVENIQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9CQVRDSEJVRkZFUiwgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX0VNSVQgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX0VNSVQsIGRybV9pOTE1X2lycV9lbWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0lSUV9XQUlUICAgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lSUV9XQUlULCBkcm1faTkxNV9pcnFfd2FpdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRQQVJBTSwgZHJtX2k5MTVfZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUUEFSQU0gICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfU0VUUEFSQU0sIGRybV9pOTE1X3NldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0FMTE9DICAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0FMTE9DLCBkcm1faTkxNV9tZW1fYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRlJFRSAgICAgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRlJFRSwgZHJtX2k5MTVfbWVtX2ZyZWVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVF9IRUFQICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVF9IRUFQLCBkcm1faTkxNV9tZW1faW5pdF9oZWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0NNREJVRkZFUglEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQ01EQlVGRkVSLCBkcm1faTkxNV9jbWRidWZmZXJfdCkKKworLyogQWxsb3cgZHJpdmVycyB0byBzdWJtaXQgYmF0Y2hidWZmZXJzIGRpcmVjdGx5IHRvIGhhcmR3YXJlLCByZWx5aW5nCisgKiBvbiB0aGUgc2VjdXJpdHkgbWVjaGFuaXNtcyBwcm92aWRlZCBieSBoYXJkd2FyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2JhdGNoYnVmZmVyIHsKKwlpbnQgc3RhcnQ7CQkvKiBhZ3Agb2Zmc2V0ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90OworCisvKiBBcyBhYm92ZSwgYnV0IHBhc3MgYSBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgd2hpY2ggY2FuIGJlCisgKiB2YWxpZGF0ZWQgYnkgdGhlIGtlcm5lbCBwcmlvciB0byBzZW5kaW5nIHRvIGhhcmR3YXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfY21kYnVmZmVyIHsKKwljaGFyIF9fdXNlciAqYnVmOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjb21tYW5kIGJ1ZmZlciAqLworCWludCBzejsJCQkvKiBuciBieXRlcyBpbiBidWYgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9jbWRidWZmZXJfdDsKKworLyogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX2VtaXQgeworCWludCBfX3VzZXIgKmlycV9zZXE7Cit9IGRybV9pOTE1X2lycV9lbWl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2lycV93YWl0IHsKKwlpbnQgaXJxX3NlcTsKK30gZHJtX2k5MTVfaXJxX3dhaXRfdDsKKworLyogSW9jdGwgdG8gcXVlcnkga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJOTE1X1BBUkFNX0lSUV9BQ1RJVkUgICAgICAgICAgICAxCisjZGVmaW5lIEk5MTVfUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVIgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgX191c2VyICp2YWx1ZTsKK30gZHJtX2k5MTVfZ2V0cGFyYW1fdDsKKworLyogSW9jdGwgdG8gc2V0IGtlcm5lbCBwYXJhbXM6CisgKi8KKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9VU0VfTUlfQkFUQ0hCVUZGRVJfU1RBUlQgICAgICAgICAgICAxCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fVEVYX0xSVV9MT0dfR1JBTlVMQVJJVFkgICAgICAgICAgICAgMgorI2RlZmluZSBJOTE1X1NFVFBBUkFNX0FMTE9XX0JBVENIQlVGRkVSICAgICAgICAgICAgICAgICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfc2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgdmFsdWU7Cit9IGRybV9pOTE1X3NldHBhcmFtX3Q7CisKKy8qIEEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBJOTE1X01FTV9SRUdJT05fQUdQIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50IF9fdXNlciAqcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgYWdwICovCit9IGRybV9pOTE1X21lbV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1fZnJlZSB7CisJaW50IHJlZ2lvbjsKKwlpbnQgcmVnaW9uX29mZnNldDsKK30gZHJtX2k5MTVfbWVtX2ZyZWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2luaXRfaGVhcCB7CisJaW50IHJlZ2lvbjsKKwlpbnQgc2l6ZTsKKwlpbnQgc3RhcnQ7Cit9IGRybV9pOTE1X21lbV9pbml0X2hlYXBfdDsKKworI2VuZGlmCQkJCS8qIF9JOTE1X0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMmI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qIGk5MTVfZHJ2LmMgLS0gaTgzMCxpODQ1LGk4NTUsaTg2NSxpOTE1IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlkZXYtPmNvdW50ZXJzICs9IDQ7CisJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CisJZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOworCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOworCWRldi0+dHlwZXNbOV0gPSBfRFJNX1NUQVRfRE1BOworCQorCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAorCQlEUklWRVJfTkFNRSwKKwkJRFJJVkVSX01BSk9SLAorCQlEUklWRVJfTUlOT1IsCisJCURSSVZFUl9QQVRDSExFVkVMLAorCQlEUklWRVJfREFURSwKKwkJZGV2LT5wcmltYXJ5Lm1pbm9yLAorCQlwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkoIHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwlpOTE1X1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IGk5MTVfaW9jdGxzW107CitleHRlcm4gaW50IGk5MTVfbWF4X2lvY3RsOworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8CisJCQkJRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQsCisJLnByZXRha2Vkb3duID0gaTkxNV9kcml2ZXJfcHJldGFrZWRvd24sCisJLnByZXJlbGVhc2UgPSBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlLAorCS5pcnFfcHJlaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCisJLmlycV91bmluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyLAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpOTE1X2lvY3RscywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgaTkxNV9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBpOTE1X21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpOTE1X2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTkxNV9pbml0KTsKK21vZHVsZV9leGl0KGk5MTVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjYTkyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtMCwwICsxLDI0MyBAQAorLyogaTkxNV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIEk5MTUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JOTE1X0RSVl9IXworI2RlZmluZSBfSTkxNV9EUlZfSF8KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiaTkxNSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJJbnRlbCBHcmFwaGljcyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA0MDQwNSIKKworLyogSW50ZXJmYWNlIGhpc3Rvcnk6CisgKgorICogMS4xOiBPcmlnaW5hbC4KKyAqLworI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkxCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKworLyogV2UgdXNlIG91ciBvd24gZG1hIG1lY2hhbmlzbXMsIG5vdCB0aGUgZHJtIHRlbXBsYXRlIGNvZGUuICBIb3dldmVyLAorICogdGhlIHNoYXJlZCBJUlEgY29kZSBpcyB1c2VmdWwgdG8gdXM6CisgKi8KKyNkZWZpbmUgX19IQVZFX1BNCQkxCisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9yaW5nX2J1ZmZlciB7CisJaW50IHRhaWxfbWFzazsKKwl1bnNpZ25lZCBsb25nIFN0YXJ0OworCXVuc2lnbmVkIGxvbmcgRW5kOworCXVuc2lnbmVkIGxvbmcgU2l6ZTsKKwl1OCAqdmlydHVhbF9zdGFydDsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgc3BhY2U7CisJZHJtX2xvY2FsX21hcF90IG1hcDsKK30gZHJtX2k5MTVfcmluZ19idWZmZXJfdDsKKworc3RydWN0IG1lbV9ibG9jayB7CisJc3RydWN0IG1lbV9ibG9jayAqbmV4dDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwcmV2OworCWludCBzdGFydDsKKwlpbnQgc2l6ZTsKKwlEUk1GSUxFIGZpbHA7CQkvKiAwOiBmcmVlLCAtMTogaGVhcCwgb3RoZXI6IHJlYWwgZmlsZXMgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgeworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICptbWlvX21hcDsKKworCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXY7CisJZHJtX2k5MTVfcmluZ19idWZmZXJfdCByaW5nOworCisJdm9pZCAqaHdfc3RhdHVzX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyOworCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOworCisJaW50IGJhY2tfb2Zmc2V0OworCWludCBmcm9udF9vZmZzZXQ7CisJaW50IGN1cnJlbnRfcGFnZTsKKwlpbnQgcGFnZV9mbGlwcGluZzsKKwlpbnQgdXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0OworCisJd2FpdF9xdWV1ZV9oZWFkX3QgaXJxX3F1ZXVlOworCWF0b21pY190IGlycV9yZWNlaXZlZDsKKwlhdG9taWNfdCBpcnFfZW1pdHRlZDsKKworCWludCB0ZXhfbHJ1X2xvZ19ncmFudWxhcml0eTsKKwlpbnQgYWxsb3dfYmF0Y2hidWZmZXI7CisJc3RydWN0IG1lbV9ibG9jayAqYWdwX2hlYXA7Cit9IGRybV9pOTE1X3ByaXZhdGVfdDsKKworCQkJCS8qIGk5MTVfZG1hLmMgKi8KK2V4dGVybiBpbnQgaTkxNV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgaTkxNV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfYmF0Y2hidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X2ZsaXBfYnVmcyhEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfZ2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworCisvKiBpOTE1X2lycS5jICovCitleHRlcm4gaW50IGk5MTVfaXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpOworZXh0ZXJuIGludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldik7CisKK2V4dGVybiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICpkZXYpOworCisvKiBpOTE1X21lbS5jICovCitleHRlcm4gaW50IGk5MTVfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9tZW1fZnJlZShEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfbWVtX2luaXRfaGVhcChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gdm9pZCBpOTE1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCk7CitleHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCSAgICAgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKKworI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQorI2RlZmluZSBJOTE1X1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQorI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQorI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLHZhbCkJRFJNX1dSSVRFMTYoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKKworI2RlZmluZSBJOTE1X1ZFUkJPU0UgMAorCisjZGVmaW5lIFJJTkdfTE9DQUxTCXVuc2lnbmVkIGludCBvdXRyaW5nLCByaW5nbWFzaywgb3V0Y291bnQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGNoYXIgKnZpcnQ7CisKKyNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSBkbyB7CQkJCVwKKwlpZiAoSTkxNV9WRVJCT1NFKQkJCQlcCisJCURSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZCkgaW4gJXNcbiIsCVwKKwkJCSAgbiwgX19GVU5DVElPTl9fKTsJCVwKKwlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCBuKjQpCQkJXAorCQlpOTE1X3dhaXRfcmluZyhkZXYsIG4qNCwgX19GVU5DVElPTl9fKTsJCVwKKwlvdXRjb3VudCA9IDA7CQkJCQlcCisJb3V0cmluZyA9IGRldl9wcml2LT5yaW5nLnRhaWw7CQkJXAorCXJpbmdtYXNrID0gZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrOwkJXAorCXZpcnQgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBPVVRfUklORyhuKSBkbyB7CQkJCQlcCisJaWYgKEk5MTVfVkVSQk9TRSkgRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJCVwKKyAgICAgICAgb3V0Y291bnQrKzsJCQkJCQlcCisJb3V0cmluZyArPSA0OwkJCQkJCVwKKwlvdXRyaW5nICY9IHJpbmdtYXNrOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRFZBTkNFX0xQX1JJTkcoKSBkbyB7CQkJCQkJXAorCWlmIChJOTE1X1ZFUkJPU0UpIERSTV9ERUJVRygiQURWQU5DRV9MUF9SSU5HICV4XG4iLCBvdXRyaW5nKTsJXAorCWRldl9wcml2LT5yaW5nLnRhaWwgPSBvdXRyaW5nOwkJCQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG91dGNvdW50ICogNDsJCQkJXAorCUk5MTVfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CQkJXAorfSB3aGlsZSgwKQorCitleHRlcm4gaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CisKKyNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKKyNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCisjZGVmaW5lIENNRF9SRVBPUlRfSEVBRAkJCSg3PDwyMykKKyNkZWZpbmUgQ01EX1NUT1JFX0RXT1JEX0lEWAkJKCgweDIxPDwyMykgfCAweDEpCisjZGVmaW5lIENNRF9PUF9CQVRDSF9CVUZGRVIgICgoMHgwPDwyOSl8KDB4MzA8PDIzKXwweDEpCisKKyNkZWZpbmUgSU5TVF9QQVJTRVJfQ0xJRU5UICAgMHgwMDAwMDAwMAorI2RlZmluZSBJTlNUX09QX0ZMVVNIICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIElOU1RfRkxVU0hfTUFQX0NBQ0hFIDB4MDAwMDAwMDEKKworI2RlZmluZSBCQjFfU1RBUlRfQUREUl9NQVNLICAgKH4weDcpCisjZGVmaW5lIEJCMV9QUk9URUNURUQgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQkIxX1VOUFJPVEVDVEVEICAgICAgICgwPDwwKQorI2RlZmluZSBCQjJfRU5EX0FERFJfTUFTSyAgICAgKH4weDcpCisKKyNkZWZpbmUgSTkxNVJFR19IV1NUQU0JCTB4MDIwOTgKKyNkZWZpbmUgSTkxNVJFR19JTlRfSURFTlRJVFlfUgkweDAyMGE0CisjZGVmaW5lIEk5MTVSRUdfSU5UX01BU0tfUiAJMHgwMjBhOAorI2RlZmluZSBJOTE1UkVHX0lOVF9FTkFCTEVfUgkweDAyMGEwCisKKyNkZWZpbmUgU1JYX0lOREVYCQkweDNjNAorI2RlZmluZSBTUlhfREFUQQkJMHgzYzUKKyNkZWZpbmUgU1IwMQkJCTEKKyNkZWZpbmUgU1IwMV9TQ1JFRU5fT0ZGIAkoMTw8NSkKKworI2RlZmluZSBQUENSCQkJMHg2MTIwNAorI2RlZmluZSBQUENSX09OCQkJKDE8PDApCisKKyNkZWZpbmUgQURQQQkJCTB4NjExMDAKKyNkZWZpbmUgQURQQV9EUE1TX01BU0sJCSh+KDM8PDEwKSkKKyNkZWZpbmUgQURQQV9EUE1TX09OCQkoMDw8MTApCisjZGVmaW5lIEFEUEFfRFBNU19TVVNQRU5ECSgxPDwxMCkKKyNkZWZpbmUgQURQQV9EUE1TX1NUQU5EQlkJKDI8PDEwKQorI2RlZmluZSBBRFBBX0RQTVNfT0ZGCQkoMzw8MTApCisKKyNkZWZpbmUgTk9QSUQgICAgICAgICAgICAgICAgICAgMHgyMDk0CisjZGVmaW5lIExQX1JJTkcgICAgIAkJMHgyMDMwCisjZGVmaW5lIEhQX1JJTkcgICAgIAkJMHgyMDQwCisjZGVmaW5lIFJJTkdfVEFJTCAgICAgIAkJMHgwMAorI2RlZmluZSBUQUlMX0FERFIJCTB4MDAxRkZGRjgKKyNkZWZpbmUgUklOR19IRUFEICAgICAgCQkweDA0CisjZGVmaW5lIEhFQURfV1JBUF9DT1VOVCAgICAgCTB4RkZFMDAwMDAKKyNkZWZpbmUgSEVBRF9XUkFQX09ORSAgICAgICAJMHgwMDIwMDAwMAorI2RlZmluZSBIRUFEX0FERFIgICAgICAgICAgIAkweDAwMUZGRkZDCisjZGVmaW5lIFJJTkdfU1RBUlQgICAgIAkJMHgwOAorI2RlZmluZSBTVEFSVF9BRERSICAgICAgICAgIAkweDB4RkZGRkYwMDAKKyNkZWZpbmUgUklOR19MRU4gICAgICAgCQkweDBDCisjZGVmaW5lIFJJTkdfTlJfUEFHRVMgICAgICAgCTB4MDAxRkYwMDAKKyNkZWZpbmUgUklOR19SRVBPUlRfTUFTSyAgICAJMHgwMDAwMDAwNgorI2RlZmluZSBSSU5HX1JFUE9SVF82NEsgICAgIAkweDAwMDAwMDAyCisjZGVmaW5lIFJJTkdfUkVQT1JUXzEyOEsgICAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgUklOR19OT19SRVBPUlQgICAgICAJMHgwMDAwMDAwMAorI2RlZmluZSBSSU5HX1ZBTElEX01BU0sgICAgIAkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfVkFMSUQgICAgICAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19JTlZBTElEICAgICAgICAJMHgwMDAwMDAwMAorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SICAgICAgICAgKCgweDM8PDI5KXwoMHgxYzw8MjQpfCgweDEwPDwxOSkpCisjZGVmaW5lIFNDX1VQREFURV9TQ0lTU09SICAgICAgICgweDE8PDEpCisjZGVmaW5lIFNDX0VOQUJMRV9NQVNLICAgICAgICAgICgweDE8PDApCisjZGVmaW5lIFNDX0VOQUJMRSAgICAgICAgICAgICAgICgweDE8PDApCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1JfSU5GTyAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwoMHgxKSkKKyNkZWZpbmUgU0NJX1lNSU5fTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKyNkZWZpbmUgU0NJX1lNQVhfTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9FTkFCTEUJICgoMHgzPDwyOSl8KDB4MWM8PDI0KXwoMHgxMDw8MTkpKQorI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9SRUNUCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwxKQorI2RlZmluZSBHRlhfT1BfQ09MT1JfRkFDVE9SICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDE8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9TVElQUExFICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODM8PDE2KSkKKyNkZWZpbmUgR0ZYX09QX01BUF9JTkZPICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwweDQpCisjZGVmaW5lIEdGWF9PUF9ERVNUQlVGRkVSX1ZBUlMgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODU8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9EUkFXUkVDVF9JTkZPICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODA8PDE2KXwoMHgzKSkKKworI2RlZmluZSBNSV9CQVRDSF9CVUZGRVIgCSgoMHgzMDw8MjMpfDEpCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9TVEFSVCAJKDB4MzE8PDIzKQorI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5EIAkoMHhBPDwyMykKKyNkZWZpbmUgTUlfQkFUQ0hfTk9OX1NFQ1VSRQkoMSkKKworI2RlZmluZSBNSV9XQUlUX0ZPUl9FVkVOVCAgICAgICAoKDB4Mzw8MjMpKQorI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVAgICAgICAoMTw8MikKKyNkZWZpbmUgTUlfV0FJVF9GT1JfUExBTkVfQV9TQ0FOTElORVMgKDE8PDEpCisKKyNkZWZpbmUgTUlfTE9BRF9TQ0FOX0xJTkVTX0lOQ0wgICgoMHgxMjw8MjMpKQorCisjZGVmaW5lIENNRF9PUF9ESVNQTEFZQlVGRkVSX0lORk8gKCgweDA8PDI5KXwoMHgxNDw8MjMpfDIpCisjZGVmaW5lIEFTWU5DX0ZMSVAgICAgICAgICAgICAgICAgKDE8PDIyKQorCisjZGVmaW5lIENNRF9PUF9ERVNUQlVGRkVSX0lORk8JICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4ZTw8MTYpfDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjM5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qIGk5MTVfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworI2RlZmluZSBVU0VSX0lOVF9GTEFHIDB4MgorI2RlZmluZSBNQVhfTk9QSUQgKCh1MzIpfjApCisjZGVmaW5lIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgICgoKHUzMiopKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpWzVdKQorCitpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUxNiB0ZW1wOworCisJdGVtcCA9IEk5MTVfUkVBRDE2KEk5MTVSRUdfSU5UX0lERU5USVRZX1IpOworCXRlbXAgJj0gVVNFUl9JTlRfRkxBRzsKKworCURSTV9ERUJVRygiJXMgZmxhZz0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHRlbXApOworCisJaWYgKHRlbXAgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX0lERU5USVRZX1IsIHRlbXApOworCURSTV9XQUtFVVAoJmRldl9wcml2LT5pcnFfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgaTkxNV9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHJldDsKKwlSSU5HX0xPQ0FMUzsKKworCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXJldCA9IGRldl9wcml2LT5jb3VudGVyOworCisJQkVHSU5fTFBfUklORygyKTsKKwlPVVRfUklORygwKTsKKwlPVVRfUklORyhHRlhfT1BfVVNFUl9JTlRFUlJVUFQpOworCUFEVkFOQ0VfTFBfUklORygpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGk5MTVfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIiVzIGlycV9ucj0lZCBicmVhZGNydW1iPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycV9uciwKKwkJICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpKTsKKworCWlmIChSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpID49IGlycV9ucikKKwkJcmV0dXJuIDA7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9XQUlUOworCisJRFJNX1dBSVRfT04ocmV0LCBkZXZfcHJpdi0+aXJxX3F1ZXVlLCAzICogRFJNX0haLAorCQkgICAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIpOworCisJaWYgKHJldCA9PSBEUk1fRVJSKEVCVVNZKSkgeworCQlEUk1fRVJST1IoIiVzOiBFQlVTWSAtLSByZWM6ICVkIGVtaXR0ZWQ6ICVkXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sCisJCQkgIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdiksIChpbnQpZGV2X3ByaXYtPmNvdW50ZXIpOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgorICovCitpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X2lycV9lbWl0X3QgZW1pdDsKKwlpbnQgcmVzdWx0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGVtaXQsIChkcm1faTkxNV9pcnFfZW1pdF90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoZW1pdCkpOworCisJcmVzdWx0ID0gaTkxNV9lbWl0X2lycShkZXYpOworCisJaWYgKERSTV9DT1BZX1RPX1VTRVIoZW1pdC5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpIHsKKwkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEb2Vzbid0IG5lZWQgdGhlIGhhcmR3YXJlIGxvY2suCisgKi8KK2ludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfaXJxX3dhaXRfdCBpcnF3YWl0OworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpcnF3YWl0LCAoZHJtX2k5MTVfaXJxX3dhaXRfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGlycXdhaXQpKTsKKworCXJldHVybiBpOTE1X3dhaXRfaXJxKGRldiwgaXJxd2FpdC5pcnFfc2VxKTsKK30KKworLyogZHJtX2RtYS5oIGhvb2tzCisqLwordm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0hXU1RBTSwgMHhmZmZlKTsKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfTUFTS19SLCAweDApOworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgMHgwKTsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIFVTRVJfSU5UX0ZMQUcpOworCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7Cit9CisKK3ZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19IV1NUQU0sIDB4ZmZmZik7CisJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX01BU0tfUiwgMHhmZmZmKTsKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIDB4MCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0YTMwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwpAQCAtMCwwICsxLDM0NiBAQAorLyogaTkxNV9tZW0uYyAtLSBTaW1wbGUgYWdwL2ZiIG1lbW9yeSBtYW5hZ2VyIGZvciBpOTE1IC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworLyogVGhpcyBtZW1vcnkgbWFuYWdlciBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGdsb2JhbC9sb2NhbCBscnUKKyAqIG1lY2hhbmlzbXMgdXNlZCBieSB0aGUgY2xpZW50cy4gIFNwZWNpZmljYWxseSwgaXQgb3BlcmF0ZXMgYnkKKyAqIHNldHRpbmcgdGhlICdpbl91c2UnIGZpZWxkcyBvZiB0aGUgZ2xvYmFsIExSVSB0byBpbmRpY2F0ZSB3aGV0aGVyCisgKiB0aGlzIHJlZ2lvbiBpcyBwcml2YXRlbHkgYWxsb2NhdGVkIHRvIGEgY2xpZW50LgorICoKKyAqIFRoaXMgZG9lcyByZXF1aXJlIHRoZSBjbGllbnQgdG8gYWN0dWFsbHkgcmVzcGVjdCB0aGF0IGZpZWxkLgorICoKKyAqIEN1cnJlbnRseSBubyBlZmZvcnQgaXMgbWFkZSB0byBhbGxvY2F0ZSAncHJpdmF0ZScgbWVtb3J5IGluIGFueQorICogY2xldmVyIHdheSAtIHRoZSBMUlUgaW5mb3JtYXRpb24gaXNuJ3QgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKKyAqIGJsb2NrIHRvIGFsbG9jYXRlLCBhbmQgdGhlIHJpbmcgaXMgZHJhaW5lZCBwcmlvciB0byBhbGxvY2F0aW9ucyAtLQorICogaW4gb3RoZXIgd29yZHMgYWxsb2NhdGlvbiBpcyBleHBlbnNpdmUuCisgKi8KK3N0YXRpYyB2b2lkIG1hcmtfYmxvY2soZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgbWVtX2Jsb2NrICpwLCBpbnQgaW5fdXNlKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fdGV4X3JlZ2lvbl90ICpsaXN0OworCXVuc2lnbmVkIHNoaWZ0LCBucjsKKwl1bnNpZ25lZCBzdGFydDsKKwl1bnNpZ25lZCBlbmQ7CisJdW5zaWduZWQgaTsKKwlpbnQgYWdlOworCisJc2hpZnQgPSBkZXZfcHJpdi0+dGV4X2xydV9sb2dfZ3JhbnVsYXJpdHk7CisJbnIgPSBJOTE1X05SX1RFWF9SRUdJT05TOworCisJc3RhcnQgPSBwLT5zdGFydCA+PiBzaGlmdDsKKwllbmQgPSAocC0+c3RhcnQgKyBwLT5zaXplIC0gMSkgPj4gc2hpZnQ7CisKKwlhZ2UgPSArK3NhcmVhX3ByaXYtPnRleEFnZTsKKwlsaXN0ID0gc2FyZWFfcHJpdi0+dGV4TGlzdDsKKworCS8qIE1hcmsgdGhlIHJlZ2lvbnMgd2l0aCB0aGUgbmV3IGZsYWcgYW5kIHVwZGF0ZSB0aGVpciBhZ2UuICBNb3ZlCisJICogdGhlbSB0byBoZWFkIG9mIGxpc3QgdG8gcHJlc2VydmUgTFJVIHNlbWFudGljcy4KKwkgKi8KKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgeworCQlsaXN0W2ldLmluX3VzZSA9IGluX3VzZTsKKwkJbGlzdFtpXS5hZ2UgPSBhZ2U7CisKKwkJLyogcmVtb3ZlX2Zyb21fbGlzdChpKQorCQkgKi8KKwkJbGlzdFsodW5zaWduZWQpbGlzdFtpXS5uZXh0XS5wcmV2ID0gbGlzdFtpXS5wcmV2OworCQlsaXN0Wyh1bnNpZ25lZClsaXN0W2ldLnByZXZdLm5leHQgPSBsaXN0W2ldLm5leHQ7CisKKwkJLyogaW5zZXJ0X2F0X2hlYWQobGlzdCwgaSkKKwkJICovCisJCWxpc3RbaV0ucHJldiA9IG5yOworCQlsaXN0W2ldLm5leHQgPSBsaXN0W25yXS5uZXh0OworCQlsaXN0Wyh1bnNpZ25lZClsaXN0W25yXS5uZXh0XS5wcmV2ID0gaTsKKwkJbGlzdFtucl0ubmV4dCA9IGk7CisJfQorfQorCisvKiBWZXJ5IHNpbXBsZSBhbGxvY2F0b3IgZm9yIGFncCBtZW1vcnksIHdvcmtpbmcgb24gYSBzdGF0aWMgcmFuZ2UKKyAqIGFscmVhZHkgbWFwcGVkIGludG8gZWFjaCBjbGllbnQncyBhZGRyZXNzIHNwYWNlLiAgCisgKi8KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKnNwbGl0X2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBzdGFydCwgaW50IHNpemUsCisJCQkJICAgICBEUk1GSUxFIGZpbHApCit7CisJLyogTWF5YmUgY3V0IG9mZiB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc3RhcnQgPiBwLT5zdGFydCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9IGRybV9hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJCWlmICghbmV3YmxvY2spCisJCQlnb3RvIG91dDsKKwkJbmV3YmxvY2stPnN0YXJ0ID0gc3RhcnQ7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIChzdGFydCAtIHAtPnN0YXJ0KTsKKwkJbmV3YmxvY2stPmZpbHAgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAgPSBuZXdibG9jazsKKwl9CisKKwkvKiBNYXliZSBjdXQgb2ZmIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc2l6ZSA8IHAtPnNpemUpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqbmV3YmxvY2sgPSBkcm1fYWxsb2Moc2l6ZW9mKCpuZXdibG9jayksIERSTV9NRU1fQlVGTElTVFMpOworCQlpZiAoIW5ld2Jsb2NrKQorCQkJZ290byBvdXQ7CisJCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0ICsgc2l6ZTsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gc2l6ZTsKKwkJbmV3YmxvY2stPmZpbHAgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgPSBzaXplOworCX0KKworICAgICAgb3V0OgorCS8qIE91ciBibG9jayBpcyBpbiB0aGUgbWlkZGxlICovCisJcC0+ZmlscCA9IGZpbHA7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICphbGxvY19ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwLCBpbnQgc2l6ZSwKKwkJCQkgICAgIGludCBhbGlnbjIsIERSTUZJTEUgZmlscCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCWludCBtYXNrID0gKDEgPDwgYWxpZ24yKSAtIDE7CisKKwlmb3IgKHAgPSBoZWFwLT5uZXh0OyBwICE9IGhlYXA7IHAgPSBwLT5uZXh0KSB7CisJCWludCBzdGFydCA9IChwLT5zdGFydCArIG1hc2spICYgfm1hc2s7CisJCWlmIChwLT5maWxwID09IE5VTEwgJiYgc3RhcnQgKyBzaXplIDw9IHAtPnN0YXJ0ICsgcC0+c2l6ZSkKKwkJCXJldHVybiBzcGxpdF9ibG9jayhwLCBzdGFydCwgc2l6ZSwgZmlscCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICpmaW5kX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzdGFydCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJZm9yIChwID0gaGVhcC0+bmV4dDsgcCAhPSBoZWFwOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPnN0YXJ0ID09IHN0YXJ0KQorCQkJcmV0dXJuIHA7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpwKQoreworCXAtPmZpbHAgPSBOVUxMOworCisJLyogQXNzdW1lcyBhIHNpbmdsZSBjb250aWd1b3VzIHJhbmdlLiAgTmVlZHMgYSBzcGVjaWFsIGZpbHAgaW4KKwkgKiAnaGVhcCcgdG8gc3RvcCBpdCBiZWluZyBzdWJzdW1lZC4KKwkgKi8KKwlpZiAocC0+bmV4dC0+ZmlscCA9PSBOVUxMKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OworCQlwLT5zaXplICs9IHEtPnNpemU7CisJCXAtPm5leHQgPSBxLT5uZXh0OworCQlwLT5uZXh0LT5wcmV2ID0gcDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJfQorCisJaWYgKHAtPnByZXYtPmZpbHAgPT0gTlVMTCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+cHJldjsKKwkJcS0+c2l6ZSArPSBwLT5zaXplOworCQlxLT5uZXh0ID0gcC0+bmV4dDsKKwkJcS0+bmV4dC0+cHJldiA9IHE7CisJCWRybV9mcmVlKHAsIHNpemVvZigqcSksIERSTV9NRU1fQlVGTElTVFMpOworCX0KK30KKworLyogSW5pdGlhbGl6ZS4gIEhvdyB0byBjaGVjayBmb3IgYW4gdW5pbml0aWFsaXplZCBoZWFwPworICovCitzdGF0aWMgaW50IGluaXRfaGVhcChzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9ja3MgPSBkcm1fYWxsb2Moc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKworCWlmICghYmxvY2tzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpoZWFwID0gZHJtX2FsbG9jKHNpemVvZigqKmhlYXApLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwlpZiAoISpoZWFwKSB7CisJCWRybV9mcmVlKGJsb2Nrcywgc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmxvY2tzLT5zdGFydCA9IHN0YXJ0OworCWJsb2Nrcy0+c2l6ZSA9IHNpemU7CisJYmxvY2tzLT5maWxwID0gTlVMTDsKKwlibG9ja3MtPm5leHQgPSBibG9ja3MtPnByZXYgPSAqaGVhcDsKKworCW1lbXNldCgqaGVhcCwgMCwgc2l6ZW9mKCoqaGVhcCkpOworCSgqaGVhcCktPmZpbHAgPSAoRFJNRklMRSkgLSAxOworCSgqaGVhcCktPm5leHQgPSAoKmhlYXApLT5wcmV2ID0gYmxvY2tzOworCXJldHVybiAwOworfQorCisvKiBGcmVlIGFsbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNpbmcgZmlsZS4KKyAqLwordm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlpZiAoIWhlYXAgfHwgIWhlYXAtPm5leHQpCisJCXJldHVybjsKKworCWZvciAocCA9IGhlYXAtPm5leHQ7IHAgIT0gaGVhcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmZpbHAgPT0gZmlscCkgeworCQkJcC0+ZmlscCA9IE5VTEw7CisJCQltYXJrX2Jsb2NrKGRldiwgcCwgMCk7CisJCX0KKwl9CisKKwkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlscCBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWZvciAocCA9IGhlYXAtPm5leHQ7IHAgIT0gaGVhcDsgcCA9IHAtPm5leHQpIHsKKwkJd2hpbGUgKHAtPmZpbHAgPT0gTlVMTCAmJiBwLT5uZXh0LT5maWxwID09IE5VTEwpIHsKKwkJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OworCQkJcC0+c2l6ZSArPSBxLT5zaXplOworCQkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCQlwLT5uZXh0LT5wcmV2ID0gcDsKKwkJCWRybV9mcmVlKHEsIHNpemVvZigqcSksIERSTV9NRU1fQlVGTElTVFMpOworCQl9CisJfQorfQorCisvKiBTaHV0ZG93bi4KKyAqLwordm9pZCBpOTE1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCEqaGVhcCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gKCpoZWFwKS0+bmV4dDsgcCAhPSAqaGVhcDspIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHA7CisJCXAgPSBwLT5uZXh0OworCQlkcm1fZnJlZShxLCBzaXplb2YoKnEpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwl9CisKKwlkcm1fZnJlZSgqaGVhcCwgc2l6ZW9mKCoqaGVhcCksIERSTV9NRU1fQlVGTElTVFMpOworCSpoZWFwID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKipnZXRfaGVhcChkcm1faTkxNV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IHJlZ2lvbikKK3sKKwlzd2l0Y2ggKHJlZ2lvbikgeworCWNhc2UgSTkxNV9NRU1fUkVHSU9OX0FHUDoKKwkJcmV0dXJuICZkZXZfcHJpdi0+YWdwX2hlYXA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBJT0NUTCBIQU5ETEVSUyAqLworCitpbnQgaTkxNV9tZW1fYWxsb2MoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9tZW1fYWxsb2NfdCBhbGxvYzsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9jaywgKipoZWFwOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhbGxvYywgKGRybV9pOTE1X21lbV9hbGxvY190IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoYWxsb2MpKTsKKworCWhlYXAgPSBnZXRfaGVhcChkZXZfcHJpdiwgYWxsb2MucmVnaW9uKTsKKwlpZiAoIWhlYXAgfHwgISpoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJLyogTWFrZSB0aGluZ3MgZWFzaWVyIG9uIG91cnNlbHZlczogYWxsIGFsbG9jYXRpb25zIGF0IGxlYXN0CisJICogNGsgYWxpZ25lZC4KKwkgKi8KKwlpZiAoYWxsb2MuYWxpZ25tZW50IDwgMTIpCisJCWFsbG9jLmFsaWdubWVudCA9IDEyOworCisJYmxvY2sgPSBhbGxvY19ibG9jaygqaGVhcCwgYWxsb2Muc2l6ZSwgYWxsb2MuYWxpZ25tZW50LCBmaWxwKTsKKworCWlmICghYmxvY2spCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltYXJrX2Jsb2NrKGRldiwgYmxvY2ssIDEpOworCisJaWYgKERSTV9DT1BZX1RPX1VTRVIoYWxsb2MucmVnaW9uX29mZnNldCwgJmJsb2NrLT5zdGFydCwgc2l6ZW9mKGludCkpKSB7CisJCURSTV9FUlJPUigiY29weV90b191c2VyXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfbWVtX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9tZW1fZnJlZV90IG1lbWZyZWU7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2ssICoqaGVhcDsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtZnJlZSwgKGRybV9pOTE1X21lbV9mcmVlX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihtZW1mcmVlKSk7CisKKwloZWFwID0gZ2V0X2hlYXAoZGV2X3ByaXYsIG1lbWZyZWUucmVnaW9uKTsKKwlpZiAoIWhlYXAgfHwgISpoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJYmxvY2sgPSBmaW5kX2Jsb2NrKCpoZWFwLCBtZW1mcmVlLnJlZ2lvbl9vZmZzZXQpOworCWlmICghYmxvY2spCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlpZiAoYmxvY2stPmZpbHAgIT0gZmlscCkKKwkJcmV0dXJuIERSTV9FUlIoRVBFUk0pOworCisJbWFya19ibG9jayhkZXYsIGJsb2NrLCAwKTsKKwlmcmVlX2Jsb2NrKGJsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfbWVtX2luaXRfaGVhcChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X21lbV9pbml0X2hlYXBfdCBpbml0aGVhcDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcDsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5pdGhlYXAsCisJCQkJIChkcm1faTkxNV9tZW1faW5pdF9oZWFwX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihpbml0aGVhcCkpOworCisJaGVhcCA9IGdldF9oZWFwKGRldl9wcml2LCBpbml0aGVhcC5yZWdpb24pOworCWlmICghaGVhcCkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCWlmICgqaGVhcCkgeworCQlEUk1fRVJST1IoImhlYXAgYWxyZWFkeSBpbml0aWFsaXplZD8iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gaW5pdF9oZWFwKGhlYXAsIGluaXRoZWFwLnN0YXJ0LCBpbml0aGVhcC5zaXplKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyZWFmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC0wLDAgKzEsNzU0IEBACisvKiBtZ2FfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIG1nYSBnMjAwL2c0MDAgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisKKyNkZWZpbmUgTUdBX0RFRkFVTFRfVVNFQ19USU1FT1VUCTEwMDAwCisjZGVmaW5lIE1HQV9GUkVFTElTVF9ERUJVRwkJMAorCitzdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYSggZHJtX2RldmljZV90ICpkZXYgKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5naW5lIGNvbnRyb2wKKyAqLworCitpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHN0YXR1cyA9IDA7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlzdGF0dXMgPSBNR0FfUkVBRCggTUdBX1NUQVRVUyApICYgTUdBX0VOR0lORV9JRExFX01BU0s7CisJCWlmICggc3RhdHVzID09IE1HQV9FTkRQUkRNQVNUUyApIHsKKwkJCU1HQV9XUklURTgoIE1HQV9DUlRDX0lOREVYLCAwICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgTUdBX0RNQV9ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlEUk1fSU5GTyggIiAgIHN0YXR1cz0weCUwOHhcbiIsIHN0YXR1cyApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IG1nYV9kb19kbWFfcmVzZXQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90ICpwcmltYXJ5ID0gJmRldl9wcml2LT5wcmltOworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKiBUaGUgcHJpbWFyeSBETUEgc3RyZWFtIHNob3VsZCBsb29rIGxpa2UgbmV3IHJpZ2h0IGFib3V0IG5vdy4KKwkgKi8KKwlwcmltYXJ5LT50YWlsID0gMDsKKwlwcmltYXJ5LT5zcGFjZSA9IHByaW1hcnktPnNpemU7CisJcHJpbWFyeS0+bGFzdF9mbHVzaCA9IDA7CisKKwlzYXJlYV9wcml2LT5sYXN0X3dyYXAgPSAwOworCisJLyogRklYTUU6IFJlc2V0IGNvdW50ZXJzLCBidWZmZXIgYWdlcyBldGMuLi4KKwkgKi8KKworCS8qIEZJWE1FOiBXaGF0IGVsc2UgZG8gd2UgbmVlZCB0byByZWluaXRpYWxpemU/ICBXQVJQIHN0dWZmPworCSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByaW1hcnkgRE1BIHN0cmVhbQorICovCisKK3ZvaWQgbWdhX2RvX2RtYV9mbHVzaCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3QgKnByaW1hcnkgPSAmZGV2X3ByaXYtPnByaW07CisJdTMyIGhlYWQsIHRhaWw7CisJdTMyIHN0YXR1cyA9IDA7CisJaW50IGk7CisgCURNQV9MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKyAgICAgICAgLyogV2UgbmVlZCB0byB3YWl0IHNvIHRoYXQgd2UgY2FuIGRvIGFuIHNhZmUgZmx1c2ggKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlzdGF0dXMgPSBNR0FfUkVBRCggTUdBX1NUQVRVUyApICYgTUdBX0VOR0lORV9JRExFX01BU0s7CisJCWlmICggc3RhdHVzID09IE1HQV9FTkRQUkRNQVNUUyApIGJyZWFrOworCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisJaWYgKCBwcmltYXJ5LT50YWlsID09IHByaW1hcnktPmxhc3RfZmx1c2ggKSB7CisJCURSTV9ERUJVRyggIiAgIGJhaWxpbmcgb3V0Li4uXG4iICk7CisJCXJldHVybjsKKwl9CisKKwl0YWlsID0gcHJpbWFyeS0+dGFpbCArIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQ7CisKKwkvKiBXZSBuZWVkIHRvIHBhZCB0aGUgc3RyZWFtIGJldHdlZW4gZmx1c2hlcywgYXMgdGhlIGNhcmQKKwkgKiBhY3R1YWxseSAocGFydGlhbGx5PykgcmVhZHMgdGhlIGZpcnN0IG9mIHRoZXNlIGNvbW1hbmRzLgorCSAqIFNlZSBwYWdlIDQtMTYgaW4gdGhlIEc0MDAgbWFudWFsLCBtaWRkbGUgb2YgdGhlIHBhZ2Ugb3Igc28uCisJICovCisJQkVHSU5fRE1BKCAxICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsICAweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELCAgMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwgIDB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAgKTsKKworCUFEVkFOQ0VfRE1BKCk7CisKKwlwcmltYXJ5LT5sYXN0X2ZsdXNoID0gcHJpbWFyeS0+dGFpbDsKKworCWhlYWQgPSBNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICk7CisKKwlpZiAoIGhlYWQgPD0gdGFpbCApIHsKKwkJcHJpbWFyeS0+c3BhY2UgPSBwcmltYXJ5LT5zaXplIC0gcHJpbWFyeS0+dGFpbDsKKwl9IGVsc2UgeworCQlwcmltYXJ5LT5zcGFjZSA9IGhlYWQgLSB0YWlsOworCX0KKworCURSTV9ERUJVRyggIiAgIGhlYWQgPSAweCUwNmx4XG4iLCBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOworCURSTV9ERUJVRyggIiAgIHRhaWwgPSAweCUwNmx4XG4iLCB0YWlsIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOworCURSTV9ERUJVRyggIiAgc3BhY2UgPSAweCUwNnhcbiIsIHByaW1hcnktPnNwYWNlICk7CisKKwltZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCU1HQV9XUklURSggTUdBX1BSSU1FTkQsIHRhaWwgfCBNR0FfUEFHUFhGRVIgKTsKKworCURSTV9ERUJVRyggImRvbmUuXG4iICk7Cit9CisKK3ZvaWQgbWdhX2RvX2RtYV93cmFwX3N0YXJ0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2FfcHJpbWFyeV9idWZmZXJfdCAqcHJpbWFyeSA9ICZkZXZfcHJpdi0+cHJpbTsKKwl1MzIgaGVhZCwgdGFpbDsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fRE1BX1dSQVAoKTsKKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCXRhaWwgPSBwcmltYXJ5LT50YWlsICsgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKworCXByaW1hcnktPnRhaWwgPSAwOworCXByaW1hcnktPmxhc3RfZmx1c2ggPSAwOworCXByaW1hcnktPmxhc3Rfd3JhcCsrOworCisJaGVhZCA9IE1HQV9SRUFEKCBNR0FfUFJJTUFERFJFU1MgKTsKKworCWlmICggaGVhZCA9PSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICkgeworCQlwcmltYXJ5LT5zcGFjZSA9IHByaW1hcnktPnNpemU7CisJfSBlbHNlIHsKKwkJcHJpbWFyeS0+c3BhY2UgPSBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKwl9CisKKwlEUk1fREVCVUcoICIgICBoZWFkID0gMHglMDZseFxuIiwKKwkJICBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOworCURSTV9ERUJVRyggIiAgIHRhaWwgPSAweCUwNnhcbiIsIHByaW1hcnktPnRhaWwgKTsKKwlEUk1fREVCVUcoICIgICB3cmFwID0gJWRcbiIsIHByaW1hcnktPmxhc3Rfd3JhcCApOworCURSTV9ERUJVRyggIiAgc3BhY2UgPSAweCUwNnhcbiIsIHByaW1hcnktPnNwYWNlICk7CisKKwltZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCU1HQV9XUklURSggTUdBX1BSSU1FTkQsIHRhaWwgfCBNR0FfUEFHUFhGRVIgKTsKKworCXNldF9iaXQoIDAsICZwcmltYXJ5LT53cmFwcGVkICk7CisJRFJNX0RFQlVHKCAiZG9uZS5cbiIgKTsKK30KKwordm9pZCBtZ2FfZG9fZG1hX3dyYXBfZW5kKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2FfcHJpbWFyeV9idWZmZXJfdCAqcHJpbWFyeSA9ICZkZXZfcHJpdi0+cHJpbTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1MzIgaGVhZCA9IGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlzYXJlYV9wcml2LT5sYXN0X3dyYXArKzsKKwlEUk1fREVCVUcoICIgICB3cmFwID0gJWRcbiIsIHNhcmVhX3ByaXYtPmxhc3Rfd3JhcCApOworCisJbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKTsKKwlNR0FfV1JJVEUoIE1HQV9QUklNQUREUkVTUywgaGVhZCB8IE1HQV9ETUFfR0VORVJBTCApOworCisJY2xlYXJfYml0KCAwLCAmcHJpbWFyeS0+d3JhcHBlZCApOworCURSTV9ERUJVRyggImRvbmUuXG4iICk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnJlZWxpc3QgbWFuYWdlbWVudAorICovCisKKyNkZWZpbmUgTUdBX0JVRkZFUl9VU0VECQl+MAorI2RlZmluZSBNR0FfQlVGRkVSX0ZSRUUJCTAKKworI2lmIE1HQV9GUkVFTElTVF9ERUJVRworc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3ByaW50KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OworCisJRFJNX0lORk8oICJcbiIgKTsKKwlEUk1fSU5GTyggImN1cnJlbnQgZGlzcGF0Y2g6IGxhc3Q9MHgleCBkb25lPTB4JXhcbiIsCisJCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2gsCisJCSAgKHVuc2lnbmVkIGludCkoTUdBX1JFQUQoIE1HQV9QUklNQUREUkVTUyApIC0KKwkJCQkgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCkgKTsKKwlEUk1fSU5GTyggImN1cnJlbnQgZnJlZWxpc3Q6XG4iICk7CisKKwlmb3IgKCBlbnRyeSA9IGRldl9wcml2LT5oZWFkLT5uZXh0IDsgZW50cnkgOyBlbnRyeSA9IGVudHJ5LT5uZXh0ICkgeworCQlEUk1fSU5GTyggIiAgICVwICAgaWR4PSUyZCAgYWdlPTB4JXggMHglMDZseFxuIiwKKwkJCSAgZW50cnksIGVudHJ5LT5idWYtPmlkeCwgZW50cnktPmFnZS5oZWFkLAorCQkJICBlbnRyeS0+YWdlLmhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICk7CisJfQorCURSTV9JTkZPKCAiXG4iICk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtZ2FfZnJlZWxpc3RfaW5pdCggZHJtX2RldmljZV90ICpkZXYsIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OworCWludCBpOworCURSTV9ERUJVRyggImNvdW50PSVkXG4iLCBkbWEtPmJ1Zl9jb3VudCApOworCisJZGV2X3ByaXYtPmhlYWQgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fbWdhX2ZyZWVsaXN0X3QpLAorCQkJCSAgICAgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoIGRldl9wcml2LT5oZWFkID09IE5VTEwgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KCBkZXZfcHJpdi0+aGVhZCwgMCwgc2l6ZW9mKGRybV9tZ2FfZnJlZWxpc3RfdCkgKTsKKwlTRVRfQUdFKCAmZGV2X3ByaXYtPmhlYWQtPmFnZSwgTUdBX0JVRkZFUl9VU0VELCAwICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCSAgICAgICAgYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJCWVudHJ5ID0gZHJtX2FsbG9jKCBzaXplb2YoZHJtX21nYV9mcmVlbGlzdF90KSwKKwkJCQkgICAgRFJNX01FTV9EUklWRVIgKTsKKwkJaWYgKCBlbnRyeSA9PSBOVUxMICkKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwkJbWVtc2V0KCBlbnRyeSwgMCwgc2l6ZW9mKGRybV9tZ2FfZnJlZWxpc3RfdCkgKTsKKworCQllbnRyeS0+bmV4dCA9IGRldl9wcml2LT5oZWFkLT5uZXh0OworCQllbnRyeS0+cHJldiA9IGRldl9wcml2LT5oZWFkOworCQlTRVRfQUdFKCAmZW50cnktPmFnZSwgTUdBX0JVRkZFUl9GUkVFLCAwICk7CisJCWVudHJ5LT5idWYgPSBidWY7CisKKwkJaWYgKCBkZXZfcHJpdi0+aGVhZC0+bmV4dCAhPSBOVUxMICkKKwkJCWRldl9wcml2LT5oZWFkLT5uZXh0LT5wcmV2ID0gZW50cnk7CisJCWlmICggZW50cnktPm5leHQgPT0gTlVMTCApCisJCQlkZXZfcHJpdi0+dGFpbCA9IGVudHJ5OworCisJCWJ1Zl9wcml2LT5saXN0X2VudHJ5ID0gZW50cnk7CisJCWJ1Zl9wcml2LT5kaXNjYXJkID0gMDsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCisJCWRldl9wcml2LT5oZWFkLT5uZXh0ID0gZW50cnk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9jbGVhbnVwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OworCWRybV9tZ2FfZnJlZWxpc3RfdCAqbmV4dDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWVudHJ5ID0gZGV2X3ByaXYtPmhlYWQ7CisJd2hpbGUgKCBlbnRyeSApIHsKKwkJbmV4dCA9IGVudHJ5LT5uZXh0OworCQlkcm1fZnJlZSggZW50cnksIHNpemVvZihkcm1fbWdhX2ZyZWVsaXN0X3QpLCBEUk1fTUVNX0RSSVZFUiApOworCQllbnRyeSA9IG5leHQ7CisJfQorCisJZGV2X3ByaXYtPmhlYWQgPSBkZXZfcHJpdi0+dGFpbCA9IE5VTEw7Cit9CisKKyNpZiAwCisvKiBGSVhNRTogU3RpbGwgbmVlZGVkPworICovCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkgICAgICAgIGJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJU0VUX0FHRSggJmJ1Zl9wcml2LT5saXN0X2VudHJ5LT5hZ2UsCisJCQkgTUdBX0JVRkZFUl9GUkVFLCAwICk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBkcm1fYnVmX3QgKm1nYV9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfZnJlZWxpc3RfdCAqbmV4dDsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKnByZXY7CisJZHJtX21nYV9mcmVlbGlzdF90ICp0YWlsID0gZGV2X3ByaXYtPnRhaWw7CisJdTMyIGhlYWQsIHdyYXA7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwloZWFkID0gTUdBX1JFQUQoIE1HQV9QUklNQUREUkVTUyApOworCXdyYXAgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF93cmFwOworCisJRFJNX0RFQlVHKCAiICAgdGFpbD0weCUwNmx4ICVkXG4iLAorCQkgICB0YWlsLT5hZ2UuaGVhZCA/CisJCSAgIHRhaWwtPmFnZS5oZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCA6IDAsCisJCSAgIHRhaWwtPmFnZS53cmFwICk7CisJRFJNX0RFQlVHKCAiICAgaGVhZD0weCUwNmx4ICVkXG4iLAorCQkgICBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCwgd3JhcCApOworCisJaWYgKCBURVNUX0FHRSggJnRhaWwtPmFnZSwgaGVhZCwgd3JhcCApICkgeworCQlwcmV2ID0gZGV2X3ByaXYtPnRhaWwtPnByZXY7CisJCW5leHQgPSBkZXZfcHJpdi0+dGFpbDsKKwkJcHJldi0+bmV4dCA9IE5VTEw7CisJCW5leHQtPnByZXYgPSBuZXh0LT5uZXh0ID0gTlVMTDsKKwkJZGV2X3ByaXYtPnRhaWwgPSBwcmV2OworCQlTRVRfQUdFKCAmbmV4dC0+YWdlLCBNR0FfQlVGRkVSX1VTRUQsIDAgKTsKKwkJcmV0dXJuIG5leHQtPmJ1ZjsKKwl9CisKKwlEUk1fREVCVUcoICJyZXR1cm5pbmcgTlVMTCFcbiIgKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IG1nYV9mcmVlbGlzdF9wdXQoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmhlYWQsICplbnRyeSwgKnByZXY7CisKKwlEUk1fREVCVUcoICJhZ2U9MHglMDZseCB3cmFwPSVkXG4iLAorCQkgICBidWZfcHJpdi0+bGlzdF9lbnRyeS0+YWdlLmhlYWQgLQorCQkgICBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0LAorCQkgICBidWZfcHJpdi0+bGlzdF9lbnRyeS0+YWdlLndyYXAgKTsKKworCWVudHJ5ID0gYnVmX3ByaXYtPmxpc3RfZW50cnk7CisJaGVhZCA9IGRldl9wcml2LT5oZWFkOworCisJaWYgKCBidWZfcHJpdi0+bGlzdF9lbnRyeS0+YWdlLmhlYWQgPT0gTUdBX0JVRkZFUl9VU0VEICkgeworCQlTRVRfQUdFKCAmZW50cnktPmFnZSwgTUdBX0JVRkZFUl9GUkVFLCAwICk7CisJCXByZXYgPSBkZXZfcHJpdi0+dGFpbDsKKwkJcHJldi0+bmV4dCA9IGVudHJ5OworCQllbnRyeS0+cHJldiA9IHByZXY7CisJCWVudHJ5LT5uZXh0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlwcmV2ID0gaGVhZC0+bmV4dDsKKwkJaGVhZC0+bmV4dCA9IGVudHJ5OworCQlwcmV2LT5wcmV2ID0gZW50cnk7CisJCWVudHJ5LT5wcmV2ID0gaGVhZDsKKwkJZW50cnktPm5leHQgPSBwcmV2OworCX0KKworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBpbml0aWFsaXphdGlvbiwgY2xlYW51cAorICovCisKK3N0YXRpYyBpbnQgbWdhX2RvX2luaXRfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX21nYV9pbml0X3QgKmluaXQgKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlpbnQgcmV0OworCURSTV9ERUJVRyggIlxuIiApOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fbWdhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSICk7CisJaWYgKCAhZGV2X3ByaXYgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KCBkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSApOworCisJZGV2X3ByaXYtPmNoaXBzZXQgPSBpbml0LT5jaGlwc2V0OworCisJZGV2X3ByaXYtPnVzZWNfdGltZW91dCA9IE1HQV9ERUZBVUxUX1VTRUNfVElNRU9VVDsKKworCWlmICggaW5pdC0+c2dyYW0gKSB7CisJCWRldl9wcml2LT5jbGVhcl9jbWQgPSBNR0FfRFdHQ1RMX0NMRUFSIHwgTUdBX0FUWVBFX0JMSzsKKwl9IGVsc2UgeworCQlkZXZfcHJpdi0+Y2xlYXJfY21kID0gTUdBX0RXR0NUTF9DTEVBUiB8IE1HQV9BVFlQRV9SU1RSOworCX0KKwlkZXZfcHJpdi0+bWFjY2Vzcwk9IGluaXQtPm1hY2Nlc3M7CisKKwlkZXZfcHJpdi0+ZmJfY3BwCT0gaW5pdC0+ZmJfY3BwOworCWRldl9wcml2LT5mcm9udF9vZmZzZXQJPSBpbml0LT5mcm9udF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X3BpdGNoCT0gaW5pdC0+ZnJvbnRfcGl0Y2g7CisJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0CT0gaW5pdC0+YmFja19vZmZzZXQ7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2gJPSBpbml0LT5iYWNrX3BpdGNoOworCisJZGV2X3ByaXYtPmRlcHRoX2NwcAk9IGluaXQtPmRlcHRoX2NwcDsKKwlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0CT0gaW5pdC0+ZGVwdGhfb2Zmc2V0OworCWRldl9wcml2LT5kZXB0aF9waXRjaAk9IGluaXQtPmRlcHRoX3BpdGNoOworCisJLyogRklYTUU6IE5lZWQgdG8gc3VwcG9ydCBBR1AgdGV4dHVyZXMuLi4KKwkgKi8KKwlkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgPSBpbml0LT50ZXh0dXJlX29mZnNldFswXTsKKwlkZXZfcHJpdi0+dGV4dHVyZV9zaXplID0gaW5pdC0+dGV4dHVyZV9zaXplWzBdOworCisJRFJNX0dFVFNBUkVBKCk7CisKKwlpZighZGV2X3ByaXYtPnNhcmVhKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBmaW5kIHNhcmVhIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWRldl9wcml2LT5tbWlvID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPm1taW8pIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgbW1pbyByZWdpb24hXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT5zdGF0dXMgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+c3RhdHVzX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5zdGF0dXMpIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgc3RhdHVzIHBhZ2UhXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT53YXJwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPndhcnBfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPndhcnApIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgd2FycCBtaWNyb2NvZGUgcmVnaW9uIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+cHJpbWFyeSA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5wcmltYXJ5X29mZnNldCk7CisJaWYoIWRldl9wcml2LT5wcmltYXJ5KSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBmaW5kIHByaW1hcnkgZG1hIHJlZ2lvbiFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgZG1hIGJ1ZmZlciByZWdpb24hXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCQkoZHJtX21nYV9zYXJlYV90ICopKCh1OCAqKWRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKKwkJCQkgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPndhcnAsIGRldiApOworCWRybV9jb3JlX2lvcmVtYXAoIGRldl9wcml2LT5wcmltYXJ5LCBkZXYgKTsKKwlkcm1fY29yZV9pb3JlbWFwKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKKworCWlmKCFkZXZfcHJpdi0+d2FycC0+aGFuZGxlIHx8CisJICAgIWRldl9wcml2LT5wcmltYXJ5LT5oYW5kbGUgfHwKKwkgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICkgeworCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gaW9yZW1hcCBhZ3AgcmVnaW9ucyFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwlyZXQgPSBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKwlpZiAoIHJldCA8IDAgKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBpbnN0YWxsIFdBUlAgdWNvZGUhXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWdhX3dhcnBfaW5pdCggZGV2X3ByaXYgKTsKKwlpZiAoIHJldCA8IDAgKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBpbml0IFdBUlAgZW5naW5lIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT5wcmltLnN0YXR1cyA9ICh1MzIgKilkZXZfcHJpdi0+c3RhdHVzLT5oYW5kbGU7CisKKwltZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCS8qIEluaXQgdGhlIHByaW1hcnkgRE1BIHJlZ2lzdGVycy4KKwkgKi8KKwlNR0FfV1JJVEUoIE1HQV9QUklNQUREUkVTUywKKwkJICAgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCB8IE1HQV9ETUFfR0VORVJBTCApOworI2lmIDAKKwlNR0FfV1JJVEUoIE1HQV9QUklNUFRSLAorCQkgICB2aXJ0X3RvX2J1cygodm9pZCAqKWRldl9wcml2LT5wcmltLnN0YXR1cykgfAorCQkgICBNR0FfUFJJTVBUUkVOMCB8CS8qIFNvZnQgdHJhcCwgU0VDRU5ELCBTRVRVUEVORCAqLworCQkgICBNR0FfUFJJTVBUUkVOMSApOwkvKiBEV0dTWU5DICovCisjZW5kaWYKKworCWRldl9wcml2LT5wcmltLnN0YXJ0ID0gKHU4ICopZGV2X3ByaXYtPnByaW1hcnktPmhhbmRsZTsKKwlkZXZfcHJpdi0+cHJpbS5lbmQgPSAoKHU4ICopZGV2X3ByaXYtPnByaW1hcnktPmhhbmRsZQorCQkJICAgICAgKyBkZXZfcHJpdi0+cHJpbWFyeS0+c2l6ZSk7CisJZGV2X3ByaXYtPnByaW0uc2l6ZSA9IGRldl9wcml2LT5wcmltYXJ5LT5zaXplOworCisJZGV2X3ByaXYtPnByaW0udGFpbCA9IDA7CisJZGV2X3ByaXYtPnByaW0uc3BhY2UgPSBkZXZfcHJpdi0+cHJpbS5zaXplOworCWRldl9wcml2LT5wcmltLndyYXBwZWQgPSAwOworCisJZGV2X3ByaXYtPnByaW0ubGFzdF9mbHVzaCA9IDA7CisJZGV2X3ByaXYtPnByaW0ubGFzdF93cmFwID0gMDsKKworCWRldl9wcml2LT5wcmltLmhpZ2hfbWFyayA9IDI1NiAqIERNQV9CTE9DS19TSVpFOworCisJZGV2X3ByaXYtPnByaW0uc3RhdHVzWzBdID0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKwlkZXZfcHJpdi0+cHJpbS5zdGF0dXNbMV0gPSAwOworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3Rfd3JhcCA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUuaGVhZCA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUud3JhcCA9IDA7CisKKwlpZiAoIG1nYV9mcmVlbGlzdF9pbml0KCBkZXYsIGRldl9wcml2ICkgPCAwICkgeworCQlEUk1fRVJST1IoICJjb3VsZCBub3QgaW5pdGlhbGl6ZSBmcmVlbGlzdFxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCS8qIE1ha2UgZGV2X3ByaXZhdGUgdmlzYWJsZSB0byBvdGhlcnMuICovCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKKwkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCisJICogaXMgZnJlZWQsIGl0J3MgdG9vIGxhdGUuCisJICovCisJaWYgKCBkZXYtPmlycV9lbmFibGVkICkgZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCQlpZiAoIGRldl9wcml2LT53YXJwICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldl9wcml2LT53YXJwLCBkZXYgKTsKKwkJaWYgKCBkZXZfcHJpdi0+cHJpbWFyeSAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+cHJpbWFyeSwgZGV2ICk7CisJCWlmICggZGV2LT5hZ3BfYnVmZmVyX21hcCAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKKworCQlpZiAoIGRldl9wcml2LT5oZWFkICE9IE5VTEwgKSB7CisJCQltZ2FfZnJlZWxpc3RfY2xlYW51cCggZGV2ICk7CisJCX0KKworCQlkcm1fZnJlZSggZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwKKwkJCSAgIERSTV9NRU1fRFJJVkVSICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWdhX2RtYV9pbml0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX2luaXRfdCBpbml0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5pdCwgKGRybV9tZ2FfaW5pdF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihpbml0KSApOworCisJc3dpdGNoICggaW5pdC5mdW5jICkgeworCWNhc2UgTUdBX0lOSVRfRE1BOgorCQlyZXR1cm4gbWdhX2RvX2luaXRfZG1hKCBkZXYsICZpbml0ICk7CisJY2FzZSBNR0FfQ0xFQU5VUF9ETUE6CisJCXJldHVybiBtZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCX0KKworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJpbWFyeSBETUEgc3RyZWFtIG1hbmFnZW1lbnQKKyAqLworCitpbnQgbWdhX2RtYV9mbHVzaCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbG9ja190IGxvY2s7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YobG9jaykgKTsKKworCURSTV9ERUJVRyggIiVzJXMlc1xuIiwKKwkJICAgKGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfRkxVU0gpID8JImZsdXNoLCAiIDogIiIsCisJCSAgIChsb2NrLmZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgPwkiZmx1c2ggYWxsLCAiIDogIiIsCisJCSAgIChsb2NrLmZsYWdzICYgX0RSTV9MT0NLX1FVSUVTQ0VOVCkgPwkiaWRsZSwgIiA6ICIiICk7CisKKwlXUkFQX1dBSVRfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIGxvY2suZmxhZ3MgJiAoX0RSTV9MT0NLX0ZMVVNIIHwgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgKSB7CisJCW1nYV9kb19kbWFfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJaWYgKCBsb2NrLmZsYWdzICYgX0RSTV9MT0NLX1FVSUVTQ0VOVCApIHsKKyNpZiBNR0FfRE1BX0RFQlVHCisJCWludCByZXQgPSBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKwkJaWYgKCByZXQgPCAwICkKKwkJCURSTV9JTkZPKCAiJXM6IC1FQlVTWVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiByZXQ7CisjZWxzZQorCQlyZXR1cm4gbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBtZ2FfZG1hX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiBtZ2FfZG9fZG1hX3Jlc2V0KCBkZXZfcHJpdiApOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBidWZmZXIgbWFuYWdlbWVudAorICovCisKK3N0YXRpYyBpbnQgbWdhX2RtYV9nZXRfYnVmZmVycyggRFJNRklMRSBmaWxwLAorCQkJCWRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQgKQoreworCWRybV9idWZfdCAqYnVmOworCWludCBpOworCisJZm9yICggaSA9IGQtPmdyYW50ZWRfY291bnQgOyBpIDwgZC0+cmVxdWVzdF9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gbWdhX2ZyZWVsaXN0X2dldCggZGV2ICk7CisJCWlmICggIWJ1ZiApIHJldHVybiBEUk1fRVJSKEVBR0FJTik7CisKKwkJYnVmLT5maWxwID0gZmlscDsKKworCQlpZiAoIERSTV9DT1BZX1RPX1VTRVIoICZkLT5yZXF1ZXN0X2luZGljZXNbaV0sCisJCQkJICAgJmJ1Zi0+aWR4LCBzaXplb2YoYnVmLT5pZHgpICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCAmZC0+cmVxdWVzdF9zaXplc1tpXSwKKwkJCQkgICAmYnVmLT50b3RhbCwgc2l6ZW9mKGJ1Zi0+dG90YWwpICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCQlkLT5ncmFudGVkX2NvdW50Kys7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWdhX2RtYV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9kbWFfdCBkOworCWludCByZXQgPSAwOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggZCwgYXJncCwgc2l6ZW9mKGQpICk7CisKKwkvKiBQbGVhc2UgZG9uJ3Qgc2VuZCB1cyBidWZmZXJzLgorCSAqLworCWlmICggZC5zZW5kX2NvdW50ICE9IDAgKSB7CisJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIHNlbmQgJWQgYnVmZmVycyB2aWEgZHJtRE1BXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGQuc2VuZF9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIFdlJ2xsIHNlbmQgeW91IGJ1ZmZlcnMuCisJICovCisJaWYgKCBkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBnZXQgJWQgYnVmZmVycyAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnJlcXVlc3RfY291bnQsIGRtYS0+YnVmX2NvdW50ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJZC5ncmFudGVkX2NvdW50ID0gMDsKKworCWlmICggZC5yZXF1ZXN0X2NvdW50ICkgeworCQlyZXQgPSBtZ2FfZG1hX2dldF9idWZmZXJzKCBmaWxwLCBkZXYsICZkICk7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCggYXJncCwgZCwgc2l6ZW9mKGQpICk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKK30KKworaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxZDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKiBtZ2FfZHJtLmggLS0gUHVibGljIGhlYWRlciBmb3IgdGhlIE1hdHJveCBnMjAwL2c0MDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVHVlIEphbiAyNSAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqCisgKiBSZXdyaXR0ZW4gYnk6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2lmbmRlZiBfX01HQV9EUk1fSF9fCisjZGVmaW5lIF9fTUdBX0RSTV9IX18KKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAobWdhX3NhcmVhLmgpCisgKi8KKworI2lmbmRlZiBfX01HQV9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19NR0FfU0FSRUFfREVGSU5FU19fCisKKy8qIFdBUlAgcGlwZSBmbGFncworICovCisjZGVmaW5lIE1HQV9GCQkJMHgxCQkvKiBmb2cgKi8KKyNkZWZpbmUgTUdBX0EJCQkweDIJCS8qIGFscGhhICovCisjZGVmaW5lIE1HQV9TCQkJMHg0CQkvKiBzcGVjdWxhciAqLworI2RlZmluZSBNR0FfVDIJCQkweDgJCS8qIG11bHRpdGV4dHVyZSAqLworCisjZGVmaW5lIE1HQV9XQVJQX1RHWgkJMAorI2RlZmluZSBNR0FfV0FSUF9UR1pGCQkoTUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1RHWkEJCShNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaQUYJCShNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaUwkJKE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTRgkJKE1HQV9TfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQQkJKE1HQV9TfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQUYJCShNR0FfU3xNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWgkJKE1HQV9UMikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWkYJCShNR0FfVDJ8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pBCQkoTUdBX1QyfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaQUYJCShNR0FfVDJ8TUdBX0F8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTCQkoTUdBX1QyfE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaU0YJCShNR0FfVDJ8TUdBX1N8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTQQkJKE1HQV9UMnxNR0FfU3xNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlNBRgkoTUdBX1QyfE1HQV9TfE1HQV9GfE1HQV9BKQorCisjZGVmaW5lIE1HQV9NQVhfRzIwMF9QSVBFUwk4CQkvKiBubyBtdWx0aXRleCAqLworI2RlZmluZSBNR0FfTUFYX0c0MDBfUElQRVMJMTYKKyNkZWZpbmUgTUdBX01BWF9XQVJQX1BJUEVTCU1HQV9NQVhfRzQwMF9QSVBFUworI2RlZmluZSBNR0FfV0FSUF9VQ09ERV9TSVpFCTMyNzY4CQkvKiBpbiBieXRlcyAqLworCisjZGVmaW5lIE1HQV9DQVJEX1RZUEVfRzIwMAkxCisjZGVmaW5lIE1HQV9DQVJEX1RZUEVfRzQwMAkyCisKKworI2RlZmluZSBNR0FfRlJPTlQJCTB4MQorI2RlZmluZSBNR0FfQkFDSwkJMHgyCisjZGVmaW5lIE1HQV9ERVBUSAkJMHg0CisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGRtYSBidWZmZXI/CisgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DT05URVhUCTB4MQorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDAJCTB4MgorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDEJCTB4NAorI2RlZmluZSBNR0FfVVBMT0FEX1BJUEUJCTB4OAorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDBJTUFHRQkweDEwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgxSU1BR0UJMHgyMCAvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIE1HQV9VUExPQURfMkQJCTB4NDAKKyNkZWZpbmUgTUdBX1dBSVRfQUdFCQkweDgwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DTElQUkVDVFMJMHgxMDAgLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2lmIDAKKyNkZWZpbmUgTUdBX0RNQV9GTFVTSAkJMHgyMDAgLyogc2V0IHdoZW4gc29tZW9uZSBnZXRzIHRoZSBsb2NrCisJCQkJCSBxdWllc2NlbnQgKi8KKyNlbmRpZgorCisvKiAzMiBidWZmZXJzIG9mIDY0ayBlYWNoLCB0b3RhbCAyIG1lZy4KKyAqLworI2RlZmluZSBNR0FfQlVGRkVSX1NJWkUJCSgxIDw8IDE2KQorI2RlZmluZSBNR0FfTlVNX0JVRkZFUlMJCTEyOAorCisvKiBLZWVwIHRoZXNlIHNtYWxsIGZvciB0ZXN0aW5nLgorICovCisjZGVmaW5lIE1HQV9OUl9TQVJFQV9DTElQUkVDVFMJOAorCisvKiAyIGhlYXBzICgxIGZvciBjYXJkLCAxIGZvciBhZ3ApLCBlYWNoIGRpdmlkZWQgaW50byB1cHRvIDEyOAorICogcmVnaW9ucywgc3ViamVjdCB0byBhIG1pbmltdW0gcmVnaW9uIHNpemUgb2YgKDE8PDE2KSA9PSA2NGsuCisgKgorICogQ2xpZW50cyBtYXkgc3ViZGl2aWRlIHJlZ2lvbnMgaW50ZXJuYWxseSwgYnV0IHdoZW4gc2hhcmluZyBiZXR3ZWVuCisgKiBjbGllbnRzLCB0aGUgcmVnaW9uIHNpemUgaXMgdGhlIG1pbmltdW0gZ3JhbnVsYXJpdHkuCisgKi8KKworI2RlZmluZSBNR0FfQ0FSRF9IRUFQCQkJMAorI2RlZmluZSBNR0FfQUdQX0hFQVAJCQkxCisjZGVmaW5lIE1HQV9OUl9URVhfSEVBUFMJCTIKKyNkZWZpbmUgTUdBX05SX1RFWF9SRUdJT05TCQkxNgorI2RlZmluZSBNR0FfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUJMTYKKworI2RlZmluZSAgRFJNX01HQV9JRExFX1JFVFJZICAgICAgICAgIDIwNDgKKworI2VuZGlmIC8qIF9fTUdBX1NBUkVBX0RFRklORVNfXyAqLworCisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgM0QgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwl1bnNpZ25lZCBpbnQgbWFjY2VzczsKKwl1bnNpZ25lZCBpbnQgcGxud3Q7CisJdW5zaWduZWQgaW50IGR3Z2N0bDsKKwl1bnNpZ25lZCBpbnQgYWxwaGFjdHJsOworCXVuc2lnbmVkIGludCBmb2djb2xvcjsKKwl1bnNpZ25lZCBpbnQgd2ZsYWc7CisJdW5zaWduZWQgaW50IHRkdWFsc3RhZ2UwOworCXVuc2lnbmVkIGludCB0ZHVhbHN0YWdlMTsKKwl1bnNpZ25lZCBpbnQgZmNvbDsKKwl1bnNpZ25lZCBpbnQgc3RlbmNpbDsKKwl1bnNpZ25lZCBpbnQgc3RlbmNpbGN0bDsKK30gZHJtX21nYV9jb250ZXh0X3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciAyRCwgWCBzZXJ2ZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwaXRjaDsKK30gZHJtX21nYV9zZXJ2ZXJfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdGV4Y3RsOworCXVuc2lnbmVkIGludCB0ZXhjdGwyOworCXVuc2lnbmVkIGludCB0ZXhmaWx0ZXI7CisJdW5zaWduZWQgaW50IHRleGJvcmRlcmNvbDsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnOworCXVuc2lnbmVkIGludCB0ZXh3aWR0aDsKKwl1bnNpZ25lZCBpbnQgdGV4aGVpZ2h0OworCXVuc2lnbmVkIGludCB0ZXhvcmcxOworCXVuc2lnbmVkIGludCB0ZXhvcmcyOworCXVuc2lnbmVkIGludCB0ZXhvcmczOworCXVuc2lnbmVkIGludCB0ZXhvcmc0OworfSBkcm1fbWdhX3RleHR1cmVfcmVnc190OworCisvKiBHZW5lcmFsIGFnaW5nIG1lY2hhbmlzbQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhlYWQ7CQkvKiBQb3NpdGlvbiBvZiBoZWFkIHBvaW50ZXIgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgd3JhcDsJCS8qIFByaW1hcnkgRE1BIHdyYXAgY291bnQgICAgICAgICAgICAqLworfSBkcm1fbWdhX2FnZV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9zYXJlYSB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbAorCSAqIG9uIGZpcmluZyBhIHZlcnRleCBkbWEgYnVmZmVyLgorCSAqLworICAgCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKyAgIAlkcm1fbWdhX3NlcnZlcl9yZWdzX3Qgc2VydmVyX3N0YXRlOworICAgCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlWzJdOworICAgCXVuc2lnbmVkIGludCB3YXJwX3BpcGU7CisgICAJdW5zaWduZWQgaW50IGRpcnR5OworICAgCXVuc2lnbmVkIGludCB2ZXJ0c2l6ZTsKKworCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KKwkgKi8KKyAgIAlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisgICAJdW5zaWduZWQgaW50IG5ib3g7CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIDNkIGRyYXdhYmxlLiAgVGhlCisJICogY2xpZW50IGZpbGxzIGluIHRoZSByZXFfKiBmaWVsZHMsIHRoZSBzZXJ2ZXIgZmlsbHMgaW4gdGhlCisJICogZXhwb3J0ZWRfIGZpZWxkcyBhbmQgcHV0cyB0aGUgY2xpcHJlY3RzIGludG8gYm94ZXMsIGFib3ZlLgorCSAqCisJICogVGhlIGNsaWVudCBjbGVhcnMgdGhlIGV4cG9ydGVkX2RyYXdhYmxlIGZpZWxkIGJlZm9yZQorCSAqIGNsb2JiZXJpbmcgdGhlIGJveGVzIGRhdGEuCisJICovCisgICAgICAgIHVuc2lnbmVkIGludCByZXFfZHJhd2FibGU7CSAvKiB0aGUgWCBkcmF3YWJsZSBpZCAqLworCXVuc2lnbmVkIGludCByZXFfZHJhd19idWZmZXI7CSAvKiBNR0FfRlJPTlQgb3IgTUdBX0JBQ0sgKi8KKworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfZHJhd2FibGU7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX2luZGV4OworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfc3RhbXA7CisgICAgICAgIHVuc2lnbmVkIGludCBleHBvcnRlZF9idWZmZXJzOworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmZyb250OworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmJhY2s7CisJaW50IGV4cG9ydGVkX2JhY2tfeCwgZXhwb3J0ZWRfZnJvbnRfeCwgZXhwb3J0ZWRfdzsKKwlpbnQgZXhwb3J0ZWRfYmFja195LCBleHBvcnRlZF9mcm9udF95LCBleHBvcnRlZF9oOworICAgCWRybV9jbGlwX3JlY3RfdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKworCS8qIENvdW50ZXJzIGZvciBhZ2luZyB0ZXh0dXJlcyBhbmQgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcuCisJICovCisJdW5zaWduZWQgaW50IHN0YXR1c1s0XTsKKwl1bnNpZ25lZCBpbnQgbGFzdF93cmFwOworCisJZHJtX21nYV9hZ2VfdCBsYXN0X2ZyYW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBsYXN0X3F1aWVzY2VudDsgICAgIC8qICAqLworCisJLyogTFJVIGxpc3RzIGZvciB0ZXh0dXJlIG1lbW9yeSBpbiBhZ3Agc3BhY2UgYW5kIG9uIHRoZSBjYXJkLgorCSAqLworCWRybV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtNR0FfTlJfVEVYX0hFQVBTXVtNR0FfTlJfVEVYX1JFR0lPTlMrMV07CisJdW5zaWduZWQgaW50IHRleEFnZVtNR0FfTlJfVEVYX0hFQVBTXTsKKworCS8qIE1lY2hhbmlzbSB0byB2YWxpZGF0ZSBjYXJkIHN0YXRlLgorCSAqLworICAgCWludCBjdHhPd25lcjsKK30gZHJtX21nYV9zYXJlYV90OworCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1NZ2EuaCkKKyAqLworCisvKiBNR0Egc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fTUdBX0lOSVQgICAgIDB4MDAKKyNkZWZpbmUgRFJNX01HQV9GTFVTSCAgICAweDAxCisjZGVmaW5lIERSTV9NR0FfUkVTRVQgICAgMHgwMgorI2RlZmluZSBEUk1fTUdBX1NXQVAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX01HQV9DTEVBUiAgICAweDA0CisjZGVmaW5lIERSTV9NR0FfVkVSVEVYICAgMHgwNQorI2RlZmluZSBEUk1fTUdBX0lORElDRVMgIDB4MDYKKyNkZWZpbmUgRFJNX01HQV9JTE9BRCAgICAweDA3CisjZGVmaW5lIERSTV9NR0FfQkxJVCAgICAgMHgwOAorI2RlZmluZSBEUk1fTUdBX0dFVFBBUkFNIDB4MDkKKworI2RlZmluZSBEUk1fSU9DVExfTUdBX0lOSVQgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0lOSVQsIGRybV9tZ2FfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0ZMVVNIICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0ZMVVNILCBkcm1fbG9ja190KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1JFU0VUICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1NXQVAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfQ0xFQVIgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfQ0xFQVIsIGRybV9tZ2FfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9WRVJURVggICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9WRVJURVgsIGRybV9tZ2FfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5ESUNFUyAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5ESUNFUywgZHJtX21nYV9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSUxPQUQgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSUxPQUQsIGRybV9tZ2FfaWxvYWRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9CTElUICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9CTElULCBkcm1fbWdhX2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9HRVRQQVJBTSwgZHJtX21nYV9nZXRwYXJhbV90KQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV93YXJwX2luZGV4IHsKKyAgIAlpbnQgaW5zdGFsbGVkOworICAgCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworICAgCWludCBzaXplOworfSBkcm1fbWdhX3dhcnBfaW5kZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbml0IHsKKyAgIAllbnVtIHsKKwkgICAJTUdBX0lOSVRfRE1BICAgID0gMHgwMSwKKwkgICAgICAgCU1HQV9DTEVBTlVQX0RNQSA9IDB4MDIKKwl9IGZ1bmM7CisKKyAgIAl1bnNpZ25lZCBsb25nIHNhcmVhX3ByaXZfb2Zmc2V0OworCisJaW50IGNoaXBzZXQ7CisgICAJaW50IHNncmFtOworCisJdW5zaWduZWQgaW50IG1hY2Nlc3M7CisKKyAgIAl1bnNpZ25lZCBpbnQgZmJfY3BwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworICAgCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKworICAgCXVuc2lnbmVkIGludCBkZXB0aF9jcHA7CisgICAJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKyAgIAl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXRbTUdBX05SX1RFWF9IRUFQU107CisgICAJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZVtNR0FfTlJfVEVYX0hFQVBTXTsKKworCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgd2FycF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBwcmltYXJ5X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworfSBkcm1fbWdhX2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9mdWxsc2NyZWVuIHsKKwllbnVtIHsKKwkJTUdBX0lOSVRfRlVMTFNDUkVFTiAgICA9IDB4MDEsCisJCU1HQV9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fbWdhX2Z1bGxzY3JlZW5fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7Cit9IGRybV9tZ2FfY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV92ZXJ0ZXggeworICAgCWludCBpZHg7CQkJLyogYnVmZmVyIHRvIHF1ZXVlICovCisJaW50IHVzZWQ7CQkJLyogYnl0ZXMgaW4gdXNlICovCisJaW50IGRpc2NhcmQ7CQkJLyogY2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAgKi8KK30gZHJtX21nYV92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbmRpY2VzIHsKKyAgIAlpbnQgaWR4OwkJCS8qIGJ1ZmZlciB0byBxdWV1ZSAqLworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCWludCBkaXNjYXJkOwkJCS8qIGNsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gICovCit9IGRybV9tZ2FfaW5kaWNlc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2lsb2FkIHsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGludCBkc3Rvcmc7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK30gZHJtX21nYV9pbG9hZF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9ibGl0IHsKKwl1bnNpZ25lZCBpbnQgcGxhbmVtYXNrOworCXVuc2lnbmVkIGludCBzcmNvcmc7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwlpbnQgc3JjX3BpdGNoLCBkc3RfcGl0Y2g7CisJaW50IGRlbHRhX3N4LCBkZWx0YV9zeTsKKwlpbnQgZGVsdGFfZHgsIGRlbHRhX2R5OworCWludCBoZWlnaHQsIHlkaXI7CQkvKiBmbGlwIGltYWdlIHZlcnRpY2FsbHkgKi8KKwlpbnQgc291cmNlX3BpdGNoLCBkZXN0X3BpdGNoOworfSBkcm1fbWdhX2JsaXRfdDsKKworLyogMy4xOiBBbiBpb2N0bCB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIDNkCisgKiBjbGllbnQgYW55IG90aGVyIHdheS4gIAorICovCisjZGVmaW5lIE1HQV9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwl2b2lkIF9fdXNlciAqdmFsdWU7Cit9IGRybV9tZ2FfZ2V0cGFyYW1fdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGFiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogbWdhX2Rydi5jIC0tIE1hdHJveCBHMjAwL0c0MDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1NjoyMiAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibWdhX2RybS5oIgorI2luY2x1ZGUgIm1nYV9kcnYuaCIKKworICAKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisKK3N0YXRpYyBpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCWRldi0+Y291bnRlcnMgKz0gMzsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJbWdhX1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IG1nYV9pb2N0bHNbXTsKK2V4dGVybiBpbnQgbWdhX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5wcmV0YWtlZG93biA9IG1nYV9kcml2ZXJfcHJldGFrZWRvd24sCisJLmRtYV9xdWllc2NlbnQgPSBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQsCisJLnZibGFua193YWl0ID0gbWdhX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyLAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBtZ2FfaW9jdGxzLAorCS5kbWFfaW9jdGwgPSBtZ2FfZG1hX2J1ZmZlcnMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBtZ2FfaW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gbWdhX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZ2FfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtZ2FfaW5pdCk7Cittb2R1bGVfZXhpdChtZ2FfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODRhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaApAQCAtMCwwICsxLDYzOCBAQAorLyogbWdhX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgTWF0cm94IEcyMDAvRzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19NR0FfRFJWX0hfXworI2RlZmluZSBfX01HQV9EUlZfSF9fCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJHYXJldGggSHVnaGVzLCBWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJtZ2EiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiTWF0cm94IEcyMDAvRzQwMCIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAyMTAyOSIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTMKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkxCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9wcmltYXJ5X2J1ZmZlciB7CisJdTggKnN0YXJ0OworCXU4ICplbmQ7CisJaW50IHNpemU7CisKKwl1MzIgdGFpbDsKKwlpbnQgc3BhY2U7CisJdm9sYXRpbGUgbG9uZyB3cmFwcGVkOworCisJdm9sYXRpbGUgdTMyICpzdGF0dXM7CisKKwl1MzIgbGFzdF9mbHVzaDsKKwl1MzIgbGFzdF93cmFwOworCisJdTMyIGhpZ2hfbWFyazsKK30gZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0IHsKKyAgIAlzdHJ1Y3QgZHJtX21nYV9mcmVlbGlzdCAqbmV4dDsKKyAgIAlzdHJ1Y3QgZHJtX21nYV9mcmVlbGlzdCAqcHJldjsKKwlkcm1fbWdhX2FnZV90IGFnZTsKKyAgIAlkcm1fYnVmX3QgKmJ1ZjsKK30gZHJtX21nYV9mcmVlbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAJZHJtX21nYV9mcmVlbGlzdF90ICpsaXN0X2VudHJ5OworCWludCBkaXNjYXJkOworCWludCBkaXNwYXRjaGVkOworfSBkcm1fbWdhX2J1Zl9wcml2X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfcHJpdmF0ZSB7CisJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90IHByaW07CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2OworCisgICAJZHJtX21nYV9mcmVlbGlzdF90ICpoZWFkOworICAgCWRybV9tZ2FfZnJlZWxpc3RfdCAqdGFpbDsKKworCXVuc2lnbmVkIGludCB3YXJwX3BpcGU7CisJdW5zaWduZWQgbG9uZyB3YXJwX3BpcGVfcGh5c1tNR0FfTUFYX1dBUlBfUElQRVNdOworCisJaW50IGNoaXBzZXQ7CisJaW50IHVzZWNfdGltZW91dDsKKworCXUzMiBjbGVhcl9jbWQ7CisJdTMyIG1hY2Nlc3M7CisKKwl1bnNpZ25lZCBpbnQgZmJfY3BwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKworCXVuc2lnbmVkIGludCBkZXB0aF9jcHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZTsKKworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICptbWlvOworCWRybV9sb2NhbF9tYXBfdCAqc3RhdHVzOworCWRybV9sb2NhbF9tYXBfdCAqd2FycDsKKwlkcm1fbG9jYWxfbWFwX3QgKnByaW1hcnk7CisJZHJtX2xvY2FsX21hcF90ICpidWZmZXJzOworCWRybV9sb2NhbF9tYXBfdCAqYWdwX3RleHR1cmVzOworfSBkcm1fbWdhX3ByaXZhdGVfdDsKKworCQkJCS8qIG1nYV9kbWEuYyAqLworZXh0ZXJuIGludCBtZ2FfZG1hX2luaXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IG1nYV9kbWFfZmx1c2goIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IG1nYV9kbWFfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IG1nYV9kbWFfYnVmZmVycyggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOworCitleHRlcm4gaW50IG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKKworZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV9mbHVzaCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOworZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX2VuZCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CisKK2V4dGVybiBpbnQgbWdhX2ZyZWVsaXN0X3B1dCggZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmICk7CisKKwkJCQkvKiBtZ2Ffd2FycC5jICovCitleHRlcm4gaW50IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKK2V4dGVybiBpbnQgbWdhX3dhcnBfaW5pdCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CisKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaXJxcmV0dXJuX3QgbWdhX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKKyNkZWZpbmUgbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKQlEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCkKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKKyNkZWZpbmUgTUdBX0JBU0UoIHJlZyApCQkoKHVuc2lnbmVkIGxvbmcpKGRldl9wcml2LT5tbWlvLT5oYW5kbGUpKQorI2RlZmluZSBNR0FfQUREUiggcmVnICkJCShNR0FfQkFTRShyZWcpICsgcmVnKQorCisjZGVmaW5lIE1HQV9ERVJFRiggcmVnICkJKih2b2xhdGlsZSB1MzIgKilNR0FfQUREUiggcmVnICkKKyNkZWZpbmUgTUdBX0RFUkVGOCggcmVnICkJKih2b2xhdGlsZSB1OCAqKU1HQV9BRERSKCByZWcgKQorCisjZGVmaW5lIE1HQV9SRUFEKCByZWcgKQkJKF9NR0FfUkVBRCgodTMyICopTUdBX0FERFIocmVnKSkpCisjZGVmaW5lIE1HQV9SRUFEOCggcmVnICkJKF9NR0FfUkVBRCgodTggKilNR0FfQUREUihyZWcpKSkKKyNkZWZpbmUgTUdBX1dSSVRFKCByZWcsIHZhbCApCWRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUYoIHJlZyApID0gdmFsOyB9IHdoaWxlICgwKQorI2RlZmluZSBNR0FfV1JJVEU4KCByZWcsIHZhbCApICBkbyB7IERSTV9XUklURU1FTU9SWUJBUlJJRVIoKTsgTUdBX0RFUkVGOCggcmVnICkgPSB2YWw7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdTMyIF9NR0FfUkVBRCh1MzIgKmFkZHIpCit7CisJRFJNX01FTU9SWUJBUlJJRVIoKTsKKwlyZXR1cm4gKih2b2xhdGlsZSB1MzIgKilhZGRyOworfQorI2Vsc2UKKyNkZWZpbmUgTUdBX1JFQUQ4KCByZWcgKQlEUk1fUkVBRDgoZGV2X3ByaXYtPm1taW8sIChyZWcpKQorI2RlZmluZSBNR0FfUkVBRCggcmVnICkJCURSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW8sIChyZWcpKQorI2RlZmluZSBNR0FfV1JJVEU4KCByZWcsIHZhbCApICBEUk1fV1JJVEU4KGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIE1HQV9XUklURSggcmVnLCB2YWwgKQlEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpKQorI2VuZGlmCisKKyNkZWZpbmUgRFdHUkVHMCAJMHgxYzAwCisjZGVmaW5lIERXR1JFRzBfRU5EIAkweDFkZmYKKyNkZWZpbmUgRFdHUkVHMQkJMHgyYzAwCisjZGVmaW5lIERXR1JFRzFfRU5ECTB4MmRmZgorCisjZGVmaW5lIElTUkVHMChyKQkociA+PSBEV0dSRUcwICYmIHIgPD0gRFdHUkVHMF9FTkQpCisjZGVmaW5lIERNQVJFRzAocikJKHU4KSgociAtIERXR1JFRzApID4+IDIpCisjZGVmaW5lIERNQVJFRzEocikJKHU4KSgoKHIgLSBEV0dSRUcxKSA+PiAyKSB8IDB4ODApCisjZGVmaW5lIERNQVJFRyhyKQkoSVNSRUcwKHIpID8gRE1BUkVHMChyKSA6IERNQVJFRzEocikpCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIZWxwZXIgbWFjcm9zcy4uLgorICovCisKKyNkZWZpbmUgTUdBX0VNSVRfU1RBVEUoIGRldl9wcml2LCBkaXJ0eSApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCAoZGlydHkpICYgfk1HQV9VUExPQURfQ0xJUFJFQ1RTICkgewkJCVwKKwkJaWYgKCBkZXZfcHJpdi0+Y2hpcHNldCA9PSBNR0FfQ0FSRF9UWVBFX0c0MDAgKSB7CVwKKwkJCW1nYV9nNDAwX2VtaXRfc3RhdGUoIGRldl9wcml2ICk7CQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJbWdhX2cyMDBfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIHRlc3RfYml0KCAwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCApICkgewkJCVwKKwkJaWYgKCBtZ2FfaXNfaWRsZSggZGV2X3ByaXYgKSApIHsJCQlcCisJCQltZ2FfZG9fZG1hX3dyYXBfZW5kKCBkZXZfcHJpdiApOwkJXAorCQl9IGVsc2UgaWYgKCBkZXZfcHJpdi0+cHJpbS5zcGFjZSA8CQkJXAorCQkJICAgIGRldl9wcml2LT5wcmltLmhpZ2hfbWFyayApIHsJCVwKKwkJCWlmICggTUdBX0RNQV9ERUJVRyApCQkJCVwKKwkJCQlEUk1fSU5GTyggIiVzOiB3cmFwLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsJXAorCQkJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUkFQX1dBSVRfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIHRlc3RfYml0KCAwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCApICkgewkJCVwKKwkJaWYgKCBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKSA8IDAgKSB7CQlcCisJCQlpZiAoIE1HQV9ETUFfREVCVUcgKQkJCQlcCisJCQkJRFJNX0lORk8oICIlczogd3JhcC4uLlxuIiwgX19GVU5DVElPTl9fICk7CVwKKwkJCXJldHVybiBEUk1fRVJSKEVCVVNZKTsJCQlcCisJCX0JCQkJCQkJXAorCQltZ2FfZG9fZG1hX3dyYXBfZW5kKCBkZXZfcHJpdiApOwkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByaW1hcnkgRE1BIGNvbW1hbmQgc3RyZWFtCisgKi8KKworI2RlZmluZSBNR0FfVkVSQk9TRQkwCisKKyNkZWZpbmUgRE1BX0xPQ0FMUwl1bnNpZ25lZCBpbnQgd3JpdGU7IHZvbGF0aWxlIHU4ICpwcmltOworCisjZGVmaW5lIERNQV9CTE9DS19TSVpFCSg1ICogc2l6ZW9mKHUzMikpCisKKyNkZWZpbmUgQkVHSU5fRE1BKCBuICkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJCRUdJTl9ETUEoICVkICkgaW4gJXNcbiIsCQkJXAorCQkJICAobiksIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCURSTV9JTkZPKCAiICAgc3BhY2U9MHgleCByZXE9MHglWnhcbiIsCQkJXAorCQkJICBkZXZfcHJpdi0+cHJpbS5zcGFjZSwgKG4pICogRE1BX0JMT0NLX1NJWkUgKTsJXAorCX0JCQkJCQkJCVwKKwlwcmltID0gZGV2X3ByaXYtPnByaW0uc3RhcnQ7CQkJCQlcCisJd3JpdGUgPSBkZXZfcHJpdi0+cHJpbS50YWlsOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCRUdJTl9ETUFfV1JBUCgpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJCRUdJTl9ETUEoKSBpbiAlc1xuIiwgX19GVU5DVElPTl9fICk7CQlcCisJCURSTV9JTkZPKCAiICAgc3BhY2U9MHgleFxuIiwgZGV2X3ByaXYtPnByaW0uc3BhY2UgKTsJXAorCX0JCQkJCQkJCVwKKwlwcmltID0gZGV2X3ByaXYtPnByaW0uc3RhcnQ7CQkJCQlcCisJd3JpdGUgPSBkZXZfcHJpdi0+cHJpbS50YWlsOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRFZBTkNFX0RNQSgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJZGV2X3ByaXYtPnByaW0udGFpbCA9IHdyaXRlOwkJCQkJXAorCWlmICggTUdBX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkFEVkFOQ0VfRE1BKCkgdGFpbD0weCUwNXggc3A9MHgleFxuIiwJXAorCQkJICB3cml0ZSwgZGV2X3ByaXYtPnByaW0uc3BhY2UgKTsJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZMVVNIX0RNQSgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCAwICkgewkJCQkJCQlcCisJCURSTV9JTkZPKCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsJCQkJXAorCQlEUk1fSU5GTyggIiAgIHRhaWw9MHglMDZ4IGhlYWQ9MHglMDZseFxuIiwJCVwKKwkJCSAgZGV2X3ByaXYtPnByaW0udGFpbCwJCQkJXAorCQkJICBNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICkgLQkJCVwKKwkJCSAgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOwkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCAhdGVzdF9iaXQoIDAsICZkZXZfcHJpdi0+cHJpbS53cmFwcGVkICkgKSB7CQlcCisJCWlmICggZGV2X3ByaXYtPnByaW0uc3BhY2UgPAkJCQlcCisJCSAgICAgZGV2X3ByaXYtPnByaW0uaGlnaF9tYXJrICkgewkJCVwKKwkJCW1nYV9kb19kbWFfd3JhcF9zdGFydCggZGV2X3ByaXYgKTsJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQltZ2FfZG9fZG1hX2ZsdXNoKCBkZXZfcHJpdiApOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogTmV2ZXIgdXNlIHRoaXMsIGFsd2F5cyB1c2UgRE1BX0JMT0NLKC4uLikgZm9yIHByaW1hcnkgRE1BIG91dHB1dC4KKyAqLworI2RlZmluZSBETUFfV1JJVEUoIG9mZnNldCwgdmFsICkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCBNR0FfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiICAgRE1BX1dSSVRFKCAweCUwOHggKSBhdCAweCUwNFp4XG4iLAlcCisJCQkgICh1MzIpKHZhbCksIHdyaXRlICsgKG9mZnNldCkgKiBzaXplb2YodTMyKSApOwlcCisJfQkJCQkJCQkJXAorCSoodm9sYXRpbGUgdTMyICopKHByaW0gKyB3cml0ZSArIChvZmZzZXQpICogc2l6ZW9mKHUzMikpID0gdmFsOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERNQV9CTE9DSyggcmVnMCwgdmFsMCwgcmVnMSwgdmFsMSwgcmVnMiwgdmFsMiwgcmVnMywgdmFsMyApCVwKK2RvIHsJCQkJCQkJCQlcCisJRE1BX1dSSVRFKCAwLCAoKERNQVJFRyggcmVnMCApIDw8IDApIHwJCQkJXAorCQkgICAgICAgKERNQVJFRyggcmVnMSApIDw8IDgpIHwJCQkJXAorCQkgICAgICAgKERNQVJFRyggcmVnMiApIDw8IDE2KSB8CQkJCVwKKwkJICAgICAgIChETUFSRUcoIHJlZzMgKSA8PCAyNCkpICk7CQkJXAorCURNQV9XUklURSggMSwgdmFsMCApOwkJCQkJCVwKKwlETUFfV1JJVEUoIDIsIHZhbDEgKTsJCQkJCQlcCisJRE1BX1dSSVRFKCAzLCB2YWwyICk7CQkJCQkJXAorCURNQV9XUklURSggNCwgdmFsMyApOwkJCQkJCVwKKwl3cml0ZSArPSBETUFfQkxPQ0tfU0laRTsJCQkJCVwKK30gd2hpbGUgKDApCisKKworLyogQnVmZmVyIGFnaW5nIHZpYSBwcmltYXJ5IERNQSBzdHJlYW0gaGVhZCBwb2ludGVyLgorICovCisKKyNkZWZpbmUgU0VUX0FHRSggYWdlLCBoLCB3ICkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCShhZ2UpLT5oZWFkID0gaDsJCQkJCQlcCisJKGFnZSktPndyYXAgPSB3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9BR0UoIGFnZSwgaCwgdyApCQkoIChhZ2UpLT53cmFwIDwgdyB8fAkJXAorCQkJCQkgICggKGFnZSktPndyYXAgPT0gdyAmJgkJXAorCQkJCQkgICAgKGFnZSktPmhlYWQgPCBoICkgKQorCisjZGVmaW5lIEFHRV9CVUZGRVIoIGJ1Zl9wcml2ICkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnkgPSAoYnVmX3ByaXYpLT5saXN0X2VudHJ5OwkJXAorCWlmICggKGJ1Zl9wcml2KS0+ZGlzcGF0Y2hlZCApIHsJCQkJCVwKKwkJZW50cnktPmFnZS5oZWFkID0gKGRldl9wcml2LT5wcmltLnRhaWwgKwkJXAorCQkJCSAgIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQpOwkJXAorCQllbnRyeS0+YWdlLndyYXAgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF93cmFwOwlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQllbnRyeS0+YWdlLmhlYWQgPSAwOwkJCQkJXAorCQllbnRyeS0+YWdlLndyYXAgPSAwOwkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBNR0FfRU5HSU5FX0lETEVfTUFTSwkJKE1HQV9TT0ZUUkFQRU4gfAkJXAorCQkJCQkgTUdBX0RXR0VOR1NUUyB8CQlcCisJCQkJCSBNR0FfRU5EUFJETUFTVFMpCisjZGVmaW5lIE1HQV9ETUFfSURMRV9NQVNLCQkoTUdBX1NPRlRSQVBFTiB8CQlcCisJCQkJCSBNR0FfRU5EUFJETUFTVFMpCisKKyNkZWZpbmUgTUdBX0RNQV9ERUJVRwkJCTAKKworCisKKy8qIEEgcmVkdWNlZCBzZXQgb2YgdGhlIG1nYSByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgTUdBX0NSVENfSU5ERVgJCQkweDFmZDQKKyNkZWZpbmUgTUdBX0NSVENfREFUQQkJCTB4MWZkNQorCisvKiBDUlRDMTEgKi8KKyNkZWZpbmUgTUdBX1ZJTlRDTFIJCQkoMSA8PCA0KQorI2RlZmluZSBNR0FfVklOVEVOCQkJKDEgPDwgNSkKKworI2RlZmluZSBNR0FfQUxQSEFDVFJMIAkJCTB4MmM3YworI2RlZmluZSBNR0FfQVIwIAkJCTB4MWM2MAorI2RlZmluZSBNR0FfQVIxIAkJCTB4MWM2NAorI2RlZmluZSBNR0FfQVIyIAkJCTB4MWM2OAorI2RlZmluZSBNR0FfQVIzIAkJCTB4MWM2YworI2RlZmluZSBNR0FfQVI0IAkJCTB4MWM3MAorI2RlZmluZSBNR0FfQVI1IAkJCTB4MWM3NAorI2RlZmluZSBNR0FfQVI2IAkJCTB4MWM3OAorCisjZGVmaW5lIE1HQV9DWEJORFJZCQkJMHgxYzgwCisjZGVmaW5lIE1HQV9DWExFRlQgCQkJMHgxY2EwCisjZGVmaW5lIE1HQV9DWFJJR0hUCQkJMHgxY2E0CisKKyNkZWZpbmUgTUdBX0RNQVBBRCAJCQkweDFjNTQKKyNkZWZpbmUgTUdBX0RTVE9SRyAJCQkweDJjYjgKKyNkZWZpbmUgTUdBX0RXR0NUTCAJCQkweDFjMDAKKyMJZGVmaW5lIE1HQV9PUENPRF9NQVNLCQkJKDE1IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfVFJBUAkJCSg0IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfVEVYVFVSRV9UUkFQCQkoNiA8PCAwKQorIwlkZWZpbmUgTUdBX09QQ09EX0JJVEJMVAkJCSg4IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfSUxPQUQJCQkoOSA8PCAwKQorIwlkZWZpbmUgTUdBX0FUWVBFX01BU0sJCQkoNyA8PCA0KQorIwlkZWZpbmUgTUdBX0FUWVBFX1JQTAkJCSgwIDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfUlNUUgkJCSgxIDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfWkkJCQkoMyA8PCA0KQorIwlkZWZpbmUgTUdBX0FUWVBFX0JMSwkJCSg0IDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfSQkJCSg3IDw8IDQpCisjCWRlZmluZSBNR0FfTElORUFSCQkJKDEgPDwgNykKKyMJZGVmaW5lIE1HQV9aTU9ERV9NQVNLCQkJKDcgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9OT1pDTVAJCQkoMCA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX1pFCQkJKDIgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9aTkUJCQkoMyA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX1pMVAkJCSg0IDw8IDgpCisjCWRlZmluZSBNR0FfWk1PREVfWkxURQkJCSg1IDw8IDgpCisjCWRlZmluZSBNR0FfWk1PREVfWkdUCQkJKDYgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9aR1RFCQkJKDcgPDwgOCkKKyMJZGVmaW5lIE1HQV9TT0xJRAkJCSgxIDw8IDExKQorIwlkZWZpbmUgTUdBX0FSWkVSTwkJCSgxIDw8IDEyKQorIwlkZWZpbmUgTUdBX1NHTlpFUk8JCQkoMSA8PCAxMykKKyMJZGVmaW5lIE1HQV9TSElGVFpFUk8JCQkoMSA8PCAxNCkKKyMJZGVmaW5lIE1HQV9CT1BfTUFTSwkJCSgxNSA8PCAxNikKKyMJZGVmaW5lIE1HQV9CT1BfWkVSTwkJCSgwIDw8IDE2KQorIwlkZWZpbmUgTUdBX0JPUF9EU1QJCQkoMTAgPDwgMTYpCisjCWRlZmluZSBNR0FfQk9QX1NSQwkJCSgxMiA8PCAxNikKKyMJZGVmaW5lIE1HQV9CT1BfT05FCQkJKDE1IDw8IDE2KQorIwlkZWZpbmUgTUdBX1RSQU5TX1NISUZUCQkJMjAKKyMJZGVmaW5lIE1HQV9UUkFOU19NQVNLCQkJKDE1IDw8IDIwKQorIwlkZWZpbmUgTUdBX0JMVE1PRF9NQVNLCQkJKDE1IDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CTU9OT0xFRgkJKDAgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JNT05PV0YJCSg0IDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9QTEFOCQkJKDEgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JGQ09MCQkJKDIgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JVMzJCR1IJCSgzIDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CVTMyUkdCCQkoNyA8PCAyNSkKKyMJZGVmaW5lIE1HQV9CTFRNT0RfQlUyNEJHUgkJKDExIDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CVTI0UkdCCQkoMTUgPDwgMjUpCisjCWRlZmluZSBNR0FfUEFUVEVSTgkJCSgxIDw8IDI5KQorIwlkZWZpbmUgTUdBX1RSQU5TQwkJCSgxIDw8IDMwKQorIwlkZWZpbmUgTUdBX0NMSVBESVMJCQkoMSA8PCAzMSkKKyNkZWZpbmUgTUdBX0RXR1NZTkMJCQkweDJjNGMKKworI2RlZmluZSBNR0FfRkNPTCAJCQkweDFjMjQKKyNkZWZpbmUgTUdBX0ZJRk9TVEFUVVMgCQkJMHgxZTEwCisjZGVmaW5lIE1HQV9GT0dDT0wgCQkJMHgxY2Y0CisjZGVmaW5lIE1HQV9GWEJORFJZCQkJMHgxYzg0CisjZGVmaW5lIE1HQV9GWExFRlQgCQkJMHgxY2E4CisjZGVmaW5lIE1HQV9GWFJJR0hUCQkJMHgxY2FjCisKKyNkZWZpbmUgTUdBX0lDTEVBUiAJCQkweDFlMTgKKyMJZGVmaW5lIE1HQV9TT0ZUUkFQSUNMUgkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfVkxJTkVJQ0xSCQkJKDEgPDwgNSkKKyNkZWZpbmUgTUdBX0lFTiAJCQkweDFlMWMKKyMJZGVmaW5lIE1HQV9TT0ZUUkFQSUVOCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9WTElORUlFTgkJCSgxIDw8IDUpCisKKyNkZWZpbmUgTUdBX0xFTiAJCQkweDFjNWMKKworI2RlZmluZSBNR0FfTUFDQ0VTUwkJCTB4MWMwNAorCisjZGVmaW5lIE1HQV9QSVRDSCAJCQkweDFjOGMKKyNkZWZpbmUgTUdBX1BMTldUIAkJCTB4MWMxYworI2RlZmluZSBNR0FfUFJJTUFERFJFU1MgCQkweDFlNTgKKyMJZGVmaW5lIE1HQV9ETUFfR0VORVJBTAkJCSgwIDw8IDApCisjCWRlZmluZSBNR0FfRE1BX0JMSVQJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX0RNQV9WRUNUT1IJCQkoMiA8PCAwKQorIwlkZWZpbmUgTUdBX0RNQV9WRVJURVgJCQkoMyA8PCAwKQorI2RlZmluZSBNR0FfUFJJTUVORAkJCTB4MWU1YworIwlkZWZpbmUgTUdBX1BSSU1OT1NUQVJUCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9QQUdQWEZFUgkJCSgxIDw8IDEpCisjZGVmaW5lIE1HQV9QUklNUFRSCQkJMHgxZTUwCisjCWRlZmluZSBNR0FfUFJJTVBUUkVOMAkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfUFJJTVBUUkVOMQkJCSgxIDw8IDEpCisKKyNkZWZpbmUgTUdBX1JTVCAJCQkweDFlNDAKKyMJZGVmaW5lIE1HQV9TT0ZUUkVTRVQJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1NPRlRFWFRSU1QJCQkoMSA8PCAxKQorCisjZGVmaW5lIE1HQV9TRUNBRERSRVNTIAkJCTB4MmM0MAorI2RlZmluZSBNR0FfU0VDRU5EIAkJCTB4MmM0NAorI2RlZmluZSBNR0FfU0VUVVBBRERSRVNTIAkJMHgyY2QwCisjZGVmaW5lIE1HQV9TRVRVUEVORCAJCQkweDJjZDQKKyNkZWZpbmUgTUdBX1NHTgkJCQkweDFjNTgKKyNkZWZpbmUgTUdBX1NPRlRSQVAJCQkweDJjNDgKKyNkZWZpbmUgTUdBX1NSQ09SRyAJCQkweDJjYjQKKyMJZGVmaW5lIE1HQV9TUk1NQVBfTUFTSwkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfU1JDTUFQX0ZCCQkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9TUkNNQVBfU1lTTUVNCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1NSQ0FDQ19NQVNLCQkJKDEgPDwgMSkKKyMJZGVmaW5lIE1HQV9TUkNBQ0NfUENJCQkJKDAgPDwgMSkKKyMJZGVmaW5lIE1HQV9TUkNBQ0NfQUdQCQkJKDEgPDwgMSkKKyNkZWZpbmUgTUdBX1NUQVRVUyAJCQkweDFlMTQKKyMJZGVmaW5lIE1HQV9TT0ZUUkFQRU4JCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1ZTWU5DUEVOCQkJKDEgPDwgNCkKKyMJZGVmaW5lIE1HQV9WTElORVBFTgkJCSgxIDw8IDUpCisjCWRlZmluZSBNR0FfRFdHRU5HU1RTCQkJKDEgPDwgMTYpCisjCWRlZmluZSBNR0FfRU5EUFJETUFTVFMJCQkoMSA8PCAxNykKKyNkZWZpbmUgTUdBX1NURU5DSUwJCQkweDJjYzgKKyNkZWZpbmUgTUdBX1NURU5DSUxDVEwgCQkJMHgyY2NjCisKKyNkZWZpbmUgTUdBX1REVUFMU1RBR0UwIAkJMHgyY2Y4CisjZGVmaW5lIE1HQV9URFVBTFNUQUdFMSAJCTB4MmNmYworI2RlZmluZSBNR0FfVEVYQk9SREVSQ09MIAkJMHgyYzVjCisjZGVmaW5lIE1HQV9URVhDVEwgCQkJMHgyYzMwCisjZGVmaW5lIE1HQV9URVhDVEwyCQkJMHgyYzNjCisjCWRlZmluZSBNR0FfRFVBTFRFWAkJCSgxIDw8IDcpCisjCWRlZmluZSBNR0FfRzQwMF9UQzJfTUFHSUMJCSgxIDw8IDE1KQorIwlkZWZpbmUgTUdBX01BUDFfRU5BQkxFCQkJKDEgPDwgMzEpCisjZGVmaW5lIE1HQV9URVhGSUxURVIgCQkJMHgyYzU4CisjZGVmaW5lIE1HQV9URVhIRUlHSFQgCQkJMHgyYzJjCisjZGVmaW5lIE1HQV9URVhPUkcgCQkJMHgyYzI0CisjCWRlZmluZSBNR0FfVEVYT1JHTUFQX01BU0sJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfVEVYT1JHTUFQX0ZCCQkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9URVhPUkdNQVBfU1lTTUVNCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1RFWE9SR0FDQ19NQVNLCQkoMSA8PCAxKQorIwlkZWZpbmUgTUdBX1RFWE9SR0FDQ19QQ0kJCSgwIDw8IDEpCisjCWRlZmluZSBNR0FfVEVYT1JHQUNDX0FHUAkJKDEgPDwgMSkKKyNkZWZpbmUgTUdBX1RFWE9SRzEJCQkweDJjYTQKKyNkZWZpbmUgTUdBX1RFWE9SRzIJCQkweDJjYTgKKyNkZWZpbmUgTUdBX1RFWE9SRzMJCQkweDJjYWMKKyNkZWZpbmUgTUdBX1RFWE9SRzQJCQkweDJjYjAKKyNkZWZpbmUgTUdBX1RFWFRSQU5TIAkJCTB4MmMzNAorI2RlZmluZSBNR0FfVEVYVFJBTlNISUdIIAkJMHgyYzM4CisjZGVmaW5lIE1HQV9URVhXSURUSCAJCQkweDJjMjgKKworI2RlZmluZSBNR0FfV0FDQ0VQVFNFUSAJCQkweDFkZDQKKyNkZWZpbmUgTUdBX1dDT0RFQUREUiAJCQkweDFlNmMKKyNkZWZpbmUgTUdBX1dGTEFHIAkJCTB4MWRjNAorI2RlZmluZSBNR0FfV0ZMQUcxIAkJCTB4MWRlMAorI2RlZmluZSBNR0FfV0ZMQUdOQgkJCTB4MWU2NAorI2RlZmluZSBNR0FfV0ZMQUdOQjEgCQkJMHgxZTA4CisjZGVmaW5lIE1HQV9XR0VUTVNCCQkJMHgxZGM4CisjZGVmaW5lIE1HQV9XSUFERFIgCQkJMHgxZGMwCisjZGVmaW5lIE1HQV9XSUFERFIyCQkJMHgxZGQ4CisjCWRlZmluZSBNR0FfV01PREVfU1VTUEVORAkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9XTU9ERV9SRVNVTUUJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1dNT0RFX0pVTVAJCQkoMiA8PCAwKQorIwlkZWZpbmUgTUdBX1dNT0RFX1NUQVJUCQkJKDMgPDwgMCkKKyMJZGVmaW5lIE1HQV9XQUdQX0VOQUJMRQkJCSgxIDw8IDIpCisjZGVmaW5lIE1HQV9XTUlTQyAJCQkweDFlNzAKKyMJZGVmaW5lIE1HQV9XVUNPREVDQUNIRV9FTkFCTEUJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfV01BU1RFUl9FTkFCTEUJCSgxIDw8IDEpCisjCWRlZmluZSBNR0FfV0NBQ0hFRkxVU0hfRU5BQkxFCQkoMSA8PCAzKQorI2RlZmluZSBNR0FfV1ZSVFhTWgkJCTB4MWRjYworCisjZGVmaW5lIE1HQV9ZQk9UIAkJCTB4MWM5YworI2RlZmluZSBNR0FfWURTVCAJCQkweDFjOTAKKyNkZWZpbmUgTUdBX1lEU1RMRU4JCQkweDFjODgKKyNkZWZpbmUgTUdBX1lEU1RPUkcJCQkweDFjOTQKKyNkZWZpbmUgTUdBX1lUT1AgCQkJMHgxYzk4CisKKyNkZWZpbmUgTUdBX1pPUkcgCQkJMHgxYzBjCisKKy8qIFRoaXMgZmluaXNoZXMgdGhlIGN1cnJlbnQgYmF0Y2ggb2YgY29tbWFuZHMKKyAqLworI2RlZmluZSBNR0FfRVhFQyAJCQkweDAxMDAKKworLyogV2FycCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBNR0FfV1IwCQkJCTB4MmQwMAorI2RlZmluZSBNR0FfV1IxCQkJCTB4MmQwNAorI2RlZmluZSBNR0FfV1IyCQkJCTB4MmQwOAorI2RlZmluZSBNR0FfV1IzCQkJCTB4MmQwYworI2RlZmluZSBNR0FfV1I0CQkJCTB4MmQxMAorI2RlZmluZSBNR0FfV1I1CQkJCTB4MmQxNAorI2RlZmluZSBNR0FfV1I2CQkJCTB4MmQxOAorI2RlZmluZSBNR0FfV1I3CQkJCTB4MmQxYworI2RlZmluZSBNR0FfV1I4CQkJCTB4MmQyMAorI2RlZmluZSBNR0FfV1I5CQkJCTB4MmQyNAorI2RlZmluZSBNR0FfV1IxMAkJCTB4MmQyOAorI2RlZmluZSBNR0FfV1IxMQkJCTB4MmQyYworI2RlZmluZSBNR0FfV1IxMgkJCTB4MmQzMAorI2RlZmluZSBNR0FfV1IxMwkJCTB4MmQzNAorI2RlZmluZSBNR0FfV1IxNAkJCTB4MmQzOAorI2RlZmluZSBNR0FfV1IxNQkJCTB4MmQzYworI2RlZmluZSBNR0FfV1IxNgkJCTB4MmQ0MAorI2RlZmluZSBNR0FfV1IxNwkJCTB4MmQ0NAorI2RlZmluZSBNR0FfV1IxOAkJCTB4MmQ0OAorI2RlZmluZSBNR0FfV1IxOQkJCTB4MmQ0YworI2RlZmluZSBNR0FfV1IyMAkJCTB4MmQ1MAorI2RlZmluZSBNR0FfV1IyMQkJCTB4MmQ1NAorI2RlZmluZSBNR0FfV1IyMgkJCTB4MmQ1OAorI2RlZmluZSBNR0FfV1IyMwkJCTB4MmQ1YworI2RlZmluZSBNR0FfV1IyNAkJCTB4MmQ2MAorI2RlZmluZSBNR0FfV1IyNQkJCTB4MmQ2NAorI2RlZmluZSBNR0FfV1IyNgkJCTB4MmQ2OAorI2RlZmluZSBNR0FfV1IyNwkJCTB4MmQ2YworI2RlZmluZSBNR0FfV1IyOAkJCTB4MmQ3MAorI2RlZmluZSBNR0FfV1IyOQkJCTB4MmQ3NAorI2RlZmluZSBNR0FfV1IzMAkJCTB4MmQ3OAorI2RlZmluZSBNR0FfV1IzMQkJCTB4MmQ3YworI2RlZmluZSBNR0FfV1IzMgkJCTB4MmQ4MAorI2RlZmluZSBNR0FfV1IzMwkJCTB4MmQ4NAorI2RlZmluZSBNR0FfV1IzNAkJCTB4MmQ4OAorI2RlZmluZSBNR0FfV1IzNQkJCTB4MmQ4YworI2RlZmluZSBNR0FfV1IzNgkJCTB4MmQ5MAorI2RlZmluZSBNR0FfV1IzNwkJCTB4MmQ5NAorI2RlZmluZSBNR0FfV1IzOAkJCTB4MmQ5OAorI2RlZmluZSBNR0FfV1IzOQkJCTB4MmQ5YworI2RlZmluZSBNR0FfV1I0MAkJCTB4MmRhMAorI2RlZmluZSBNR0FfV1I0MQkJCTB4MmRhNAorI2RlZmluZSBNR0FfV1I0MgkJCTB4MmRhOAorI2RlZmluZSBNR0FfV1I0MwkJCTB4MmRhYworI2RlZmluZSBNR0FfV1I0NAkJCTB4MmRiMAorI2RlZmluZSBNR0FfV1I0NQkJCTB4MmRiNAorI2RlZmluZSBNR0FfV1I0NgkJCTB4MmRiOAorI2RlZmluZSBNR0FfV1I0NwkJCTB4MmRiYworI2RlZmluZSBNR0FfV1I0OAkJCTB4MmRjMAorI2RlZmluZSBNR0FfV1I0OQkJCTB4MmRjNAorI2RlZmluZSBNR0FfV1I1MAkJCTB4MmRjOAorI2RlZmluZSBNR0FfV1I1MQkJCTB4MmRjYworI2RlZmluZSBNR0FfV1I1MgkJCTB4MmRkMAorI2RlZmluZSBNR0FfV1I1MwkJCTB4MmRkNAorI2RlZmluZSBNR0FfV1I1NAkJCTB4MmRkOAorI2RlZmluZSBNR0FfV1I1NQkJCTB4MmRkYworI2RlZmluZSBNR0FfV1I1NgkJCTB4MmRlMAorI2RlZmluZSBNR0FfV1I1NwkJCTB4MmRlNAorI2RlZmluZSBNR0FfV1I1OAkJCTB4MmRlOAorI2RlZmluZSBNR0FfV1I1OQkJCTB4MmRlYworI2RlZmluZSBNR0FfV1I2MAkJCTB4MmRmMAorI2RlZmluZSBNR0FfV1I2MQkJCTB4MmRmNAorI2RlZmluZSBNR0FfV1I2MgkJCTB4MmRmOAorI2RlZmluZSBNR0FfV1I2MwkJCTB4MmRmYworIwlkZWZpbmUgTUdBX0c0MDBfV1JfTUFHSUMJCSgxIDw8IDYpCisjCWRlZmluZSBNR0FfRzQwMF9XUjU2X01BR0lDCQkweDQ2NDgwMDAwCS8qIDEyODAwLjBmICovCisKKworI2RlZmluZSBNR0FfSUxPQURfQUxJR04JCTY0CisjZGVmaW5lIE1HQV9JTE9BRF9NQVNLCQkoTUdBX0lMT0FEX0FMSUdOIC0gMSkKKworI2RlZmluZSBNR0FfRFdHQ1RMX0ZMVVNICShNR0FfT1BDT0RfVEVYVFVSRV9UUkFQIHwJCVwKKwkJCQkgTUdBX0FUWVBFX0kgfAkJCQlcCisJCQkJIE1HQV9aTU9ERV9OT1pDTVAgfAkJCVwKKwkJCQkgTUdBX0FSWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NHTlpFUk8gfAkJCQlcCisJCQkJIE1HQV9CT1BfU1JDIHwJCQkJXAorCQkJCSAoMTUgPDwgTUdBX1RSQU5TX1NISUZUKSkKKworI2RlZmluZSBNR0FfRFdHQ1RMX0NMRUFSCShNR0FfT1BDT0RfVFJBUCB8CQkJXAorCQkJCSBNR0FfWk1PREVfTk9aQ01QIHwJCQlcCisJCQkJIE1HQV9TT0xJRCB8CQkJCVwKKwkJCQkgTUdBX0FSWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NHTlpFUk8gfAkJCQlcCisJCQkJIE1HQV9TSElGVFpFUk8gfAkJCVwKKwkJCQkgTUdBX0JPUF9TUkMgfAkJCQlcCisJCQkJICgwIDw8IE1HQV9UUkFOU19TSElGVCkgfAkJXAorCQkJCSBNR0FfQkxUTU9EX0JNT05PTEVGIHwJCQlcCisJCQkJIE1HQV9UUkFOU0MgfAkJCQlcCisJCQkJIE1HQV9DTElQRElTKQorCisjZGVmaW5lIE1HQV9EV0dDVExfQ09QWQkJKE1HQV9PUENPRF9CSVRCTFQgfAkJCVwKKwkJCQkgTUdBX0FUWVBFX1JQTCB8CQkJXAorCQkJCSBNR0FfU0dOWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NISUZUWkVSTyB8CQkJXAorCQkJCSBNR0FfQk9QX1NSQyB8CQkJCVwKKwkJCQkgKDAgPDwgTUdBX1RSQU5TX1NISUZUKSB8CQlcCisJCQkJIE1HQV9CTFRNT0RfQkZDT0wgfAkJCVwKKwkJCQkgTUdBX0NMSVBESVMpCisKKy8qIFNpbXBsZSBpZGxlIHRlc3QuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBtZ2FfaXNfaWRsZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgc3RhdHVzID0gTUdBX1JFQUQoIE1HQV9TVEFUVVMgKSAmIE1HQV9FTkdJTkVfSURMRV9NQVNLOworCXJldHVybiAoIHN0YXR1cyA9PSBNR0FfRU5EUFJETUFTVFMgKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGI2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogbWdhX2lycS5jIC0tIElSUSBoYW5kbGluZyBmb3IgcmFkZW9uIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAoQykgVGhlIFdlYXRoZXIgQ2hhbm5lbCwgSW5jLiAgMjAwMi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoZSBXZWF0aGVyIENoYW5uZWwgKFRNKSBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8gZGV2ZWxvcCB0aGUKKyAqIGluaXRpYWwgcmVsZWFzZSBvZiB0aGUgUmFkZW9uIDg1MDAgZHJpdmVyIHVuZGVyIHRoZSBYRnJlZTg2IGxpY2Vuc2UuCisgKiBUaGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqICAgIEVyaWMgQW5ob2x0IDxhbmhvbHRARnJlZUJTRC5vcmc+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJtLmgiCisjaW5jbHVkZSAibWdhX2Rydi5oIgorCitpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKCBEUk1fSVJRX0FSR1MgKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gTUdBX1JFQUQoIE1HQV9TVEFUVVMgKTsKKwkKKwkvKiBWQkxBTksgaW50ZXJydXB0ICovCisJaWYgKCBzdGF0dXMgJiBNR0FfVkxJTkVQRU4gKSB7CisJCU1HQV9XUklURSggTUdBX0lDTEVBUiwgTUdBX1ZMSU5FSUNMUiApOworCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRldiApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK30KKworaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CisJaW50IHJldCA9IDA7CisKKwkvKiBBc3N1bWUgdGhhdCB0aGUgdXNlciBoYXMgbWlzc2VkIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlcgorCSAqIGJ5IGFib3V0IGEgZGF5IHJhdGhlciB0aGFuIHNoZSB3YW50cyB0byB3YWl0IGZvciB5ZWFycworCSAqIHVzaW5nIHZlcnRpY2FsIGJsYW5rcy4uLiAKKwkgKi8KKwlEUk1fV0FJVF9PTiggcmV0LCBkZXYtPnZibF9xdWV1ZSwgMypEUk1fSFosIAorCQkgICAgICggKCAoIGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQgKSApCisJCQkgLSAqc2VxdWVuY2UgKSA8PSAoMTw8MjMpICkgKTsKKworCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworICAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLworICAgICAgCU1HQV9XUklURSggTUdBX0lFTiwgMCApOworCS8qIENsZWFyIGJpdHMgaWYgdGhleSdyZSBhbHJlYWR5IGhpZ2ggKi8KKyAgIAlNR0FfV1JJVEUoIE1HQV9JQ0xFQVIsIH4wICk7Cit9CisKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworICAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIFR1cm4gb24gVkJMIGludGVycnVwdCAqLworICAgCU1HQV9XUklURSggTUdBX0lFTiwgTUdBX1ZMSU5FSUVOICk7Cit9CisKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKyAgCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fbWdhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisJTUdBX1dSSVRFKCBNR0FfSUVOLCAwICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdhOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtMCwwICsxLDExMjMgQEAKKy8qIG1nYV9zdGF0ZS5jIC0tIFN0YXRlIHN1cHBvcnQgZm9yIE1HQSBHMjAwL0c0MDAgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUaHUgSmFuIDI3IDAyOjUzOjQzIDIwMDAgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBtZ2FfZW1pdF9jbGlwX3JlY3QoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQlkcm1fY2xpcF9yZWN0X3QgKmJveCApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJdW5zaWduZWQgaW50IHBpdGNoID0gZGV2X3ByaXYtPmZyb250X3BpdGNoOworCURNQV9MT0NBTFM7CisKKwlCRUdJTl9ETUEoIDIgKTsKKworCS8qIEZvcmNlIHJlc2V0IG9mIERXR0NUTCBvbiBHNDAwIChlbGltaW5hdGVzIGNsaXAgZGlzYWJsZSBiaXQpLgorCSAqLworCWlmICggZGV2X3ByaXYtPmNoaXBzZXQgPT0gTUdBX0NBUkRfVFlQRV9HNDAwICkgeworCQlETUFfQkxPQ0soIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCwKKwkJCSAgIE1HQV9MRU4gKyBNR0FfRVhFQywJMHg4MDAwMDAwMCwKKwkJCSAgIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCwKKwkJCSAgIE1HQV9MRU4gKyBNR0FfRVhFQywJMHg4MDAwMDAwMCApOworCX0KKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9DWEJORFJZLAkoYm94LT54MiA8PCAxNikgfCBib3gtPngxLAorCQkgICBNR0FfWVRPUCwJYm94LT55MSAqIHBpdGNoLAorCQkgICBNR0FfWUJPVCwJYm94LT55MiAqIHBpdGNoICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nMjAwX2VtaXRfY29udGV4dCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlETUFfTE9DQUxTOworCisJQkVHSU5fRE1BKCAzICk7CisKKwlETUFfQkxPQ0soIE1HQV9EU1RPUkcsCQljdHgtPmRzdG9yZywKKwkJICAgTUdBX01BQ0NFU1MsCQljdHgtPm1hY2Nlc3MsCisJCSAgIE1HQV9QTE5XVCwJCWN0eC0+cGxud3QsCisJCSAgIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCApOworCisJRE1BX0JMT0NLKCBNR0FfQUxQSEFDVFJMLAljdHgtPmFscGhhY3RybCwKKwkJICAgTUdBX0ZPR0NPTCwJCWN0eC0+Zm9nY29sb3IsCisJCSAgIE1HQV9XRkxBRywJCWN0eC0+d2ZsYWcsCisJCSAgIE1HQV9aT1JHLAkJZGV2X3ByaXYtPmRlcHRoX29mZnNldCApOworCisJRE1BX0JMT0NLKCBNR0FfRkNPTCwJCWN0eC0+ZmNvbCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X2NvbnRleHQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJRE1BX0xPQ0FMUzsKKworCUJFR0lOX0RNQSggNCApOworCisJRE1BX0JMT0NLKCBNR0FfRFNUT1JHLAkJY3R4LT5kc3RvcmcsCisJCSAgIE1HQV9NQUNDRVNTLAkJY3R4LT5tYWNjZXNzLAorCQkgICBNR0FfUExOV1QsCQljdHgtPnBsbnd0LAorCQkgICBNR0FfRFdHQ1RMLAkJY3R4LT5kd2djdGwgKTsKKworCURNQV9CTE9DSyggTUdBX0FMUEhBQ1RSTCwJY3R4LT5hbHBoYWN0cmwsCisJCSAgIE1HQV9GT0dDT0wsCQljdHgtPmZvZ2NvbG9yLAorCQkgICBNR0FfV0ZMQUcsCQljdHgtPndmbGFnLAorCQkgICBNR0FfWk9SRywJCWRldl9wcml2LT5kZXB0aF9vZmZzZXQgKTsKKworCURNQV9CTE9DSyggTUdBX1dGTEFHMSwJCWN0eC0+d2ZsYWcsCisJCSAgIE1HQV9URFVBTFNUQUdFMCwJY3R4LT50ZHVhbHN0YWdlMCwKKwkJICAgTUdBX1REVUFMU1RBR0UxLAljdHgtPnRkdWFsc3RhZ2UxLAorCQkgICBNR0FfRkNPTCwJCWN0eC0+ZmNvbCApOworCisJRE1BX0JMT0NLKCBNR0FfU1RFTkNJTCwJCWN0eC0+c3RlbmNpbCwKKwkJICAgTUdBX1NURU5DSUxDVEwsCWN0eC0+c3RlbmNpbGN0bCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nMjAwX2VtaXRfdGV4MCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzBdOworCURNQV9MT0NBTFM7CisKKwlCRUdJTl9ETUEoIDQgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWENUTDIsCQl0ZXgtPnRleGN0bDIsCisJCSAgIE1HQV9URVhDVEwsCQl0ZXgtPnRleGN0bCwKKwkJICAgTUdBX1RFWEZJTFRFUiwJdGV4LT50ZXhmaWx0ZXIsCisJCSAgIE1HQV9URVhCT1JERVJDT0wsCXRleC0+dGV4Ym9yZGVyY29sICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkcsCQl0ZXgtPnRleG9yZywKKwkJICAgTUdBX1RFWE9SRzEsCQl0ZXgtPnRleG9yZzEsCisJCSAgIE1HQV9URVhPUkcyLAkJdGV4LT50ZXhvcmcyLAorCQkgICBNR0FfVEVYT1JHMywJCXRleC0+dGV4b3JnMyApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYT1JHNCwJCXRleC0+dGV4b3JnNCwKKwkJICAgTUdBX1RFWFdJRFRILAl0ZXgtPnRleHdpZHRoLAorCQkgICBNR0FfVEVYSEVJR0hULAl0ZXgtPnRleGhlaWdodCwKKwkJICAgTUdBX1dSMjQsCQl0ZXgtPnRleHdpZHRoICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjM0LAkJdGV4LT50ZXhoZWlnaHQsCisJCSAgIE1HQV9URVhUUkFOUywJMHgwMDAwZmZmZiwKKwkJICAgTUdBX1RFWFRSQU5TSElHSCwJMHgwMDAwZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF90ZXgwKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMF07CisJRE1BX0xPQ0FMUzsKKworLyogIAlwcmludGsoIm1nYV9nNDAwX2VtaXRfdGV4MCAleCAleCAleFxuIiwgdGV4LT50ZXhvcmcsICovCisvKiAgCSAgICAgICB0ZXgtPnRleGN0bCwgdGV4LT50ZXhjdGwyKTsgKi8KKworCUJFR0lOX0RNQSggNiApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCXRleC0+dGV4Y3RsMiB8IE1HQV9HNDAwX1RDMl9NQUdJQywKKwkJICAgTUdBX1RFWENUTCwJCXRleC0+dGV4Y3RsLAorCQkgICBNR0FfVEVYRklMVEVSLAl0ZXgtPnRleGZpbHRlciwKKwkJICAgTUdBX1RFWEJPUkRFUkNPTCwJdGV4LT50ZXhib3JkZXJjb2wgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWE9SRywJCXRleC0+dGV4b3JnLAorCQkgICBNR0FfVEVYT1JHMSwJCXRleC0+dGV4b3JnMSwKKwkJICAgTUdBX1RFWE9SRzIsCQl0ZXgtPnRleG9yZzIsCisJCSAgIE1HQV9URVhPUkczLAkJdGV4LT50ZXhvcmczICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkc0LAkJdGV4LT50ZXhvcmc0LAorCQkgICBNR0FfVEVYV0lEVEgsCXRleC0+dGV4d2lkdGgsCisJCSAgIE1HQV9URVhIRUlHSFQsCXRleC0+dGV4aGVpZ2h0LAorCQkgICBNR0FfV1I0OSwJCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSNTcsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I1MywJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjYxLAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTIsCQlNR0FfRzQwMF9XUl9NQUdJQyApOworCisJRE1BX0JMT0NLKCBNR0FfV1I2MCwJCU1HQV9HNDAwX1dSX01BR0lDLAorCQkgICBNR0FfV1I1NCwJCXRleC0+dGV4d2lkdGggfCBNR0FfRzQwMF9XUl9NQUdJQywKKwkJICAgTUdBX1dSNjIsCQl0ZXgtPnRleGhlaWdodCB8IE1HQV9HNDAwX1dSX01BR0lDLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9URVhUUkFOUywJMHgwMDAwZmZmZiwKKwkJICAgTUdBX1RFWFRSQU5TSElHSCwJMHgwMDAwZmZmZiApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X3RleDEoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVsxXTsKKwlETUFfTE9DQUxTOworCisvKiAgCXByaW50aygibWdhX2c0MDBfZW1pdF90ZXgxICV4ICV4ICV4XG4iLCB0ZXgtPnRleG9yZywgICovCisvKiAgCSAgICAgICB0ZXgtPnRleGN0bCwgdGV4LT50ZXhjdGwyKTsgKi8KKworCUJFR0lOX0RNQSggNSApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCSh0ZXgtPnRleGN0bDIgfAorCQkJCQkgTUdBX01BUDFfRU5BQkxFIHwKKwkJCQkJIE1HQV9HNDAwX1RDMl9NQUdJQyksCisJCSAgIE1HQV9URVhDVEwsCQl0ZXgtPnRleGN0bCwKKwkJICAgTUdBX1RFWEZJTFRFUiwJdGV4LT50ZXhmaWx0ZXIsCisJCSAgIE1HQV9URVhCT1JERVJDT0wsCXRleC0+dGV4Ym9yZGVyY29sICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkcsCQl0ZXgtPnRleG9yZywKKwkJICAgTUdBX1RFWE9SRzEsCQl0ZXgtPnRleG9yZzEsCisJCSAgIE1HQV9URVhPUkcyLAkJdGV4LT50ZXhvcmcyLAorCQkgICBNR0FfVEVYT1JHMywJCXRleC0+dGV4b3JnMyApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYT1JHNCwJCXRleC0+dGV4b3JnNCwKKwkJICAgTUdBX1RFWFdJRFRILAl0ZXgtPnRleHdpZHRoLAorCQkgICBNR0FfVEVYSEVJR0hULAl0ZXgtPnRleGhlaWdodCwKKwkJICAgTUdBX1dSNDksCQkweDAwMDAwMDAwICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjU3LAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTMsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I2MSwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjUyLAkJdGV4LT50ZXh3aWR0aCB8IE1HQV9HNDAwX1dSX01BR0lDICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjYwLAkJdGV4LT50ZXhoZWlnaHQgfCBNR0FfRzQwMF9XUl9NQUdJQywKKwkJICAgTUdBX1RFWFRSQU5TLAkweDAwMDBmZmZmLAorCQkgICBNR0FfVEVYVFJBTlNISUdILAkweDAwMDBmZmZmLAorCQkgICBNR0FfVEVYQ1RMMiwJCXRleC0+dGV4Y3RsMiB8IE1HQV9HNDAwX1RDMl9NQUdJQyApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzIwMF9lbWl0X3BpcGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IHBpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CisJRE1BX0xPQ0FMUzsKKworCUJFR0lOX0RNQSggMyApOworCisJRE1BX0JMT0NLKCBNR0FfV0lBRERSLAlNR0FfV01PREVfU1VTUEVORCwKKwkJICAgTUdBX1dWUlRYU1osCTB4MDAwMDAwMDcsCisJCSAgIE1HQV9XRkxBRywJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSMjQsCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSMjUsCTB4MDAwMDAxMDAsCisJCSAgIE1HQV9XUjM0LAkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I0MiwJMHgwMDAwZmZmZiwKKwkJICAgTUdBX1dSNjAsCTB4MDAwMGZmZmYgKTsKKworCS8qIFBhZGRpbmcgcmVxdWlyZWQgdG8gdG8gaGFyZHdhcmUgYnVnLgorCSAqLworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX1dJQUREUiwJKGRldl9wcml2LT53YXJwX3BpcGVfcGh5c1twaXBlXSB8CisJCQkJIE1HQV9XTU9ERV9TVEFSVCB8CisJCQkJIE1HQV9XQUdQX0VOQUJMRSkgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF9waXBlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBwaXBlID0gc2FyZWFfcHJpdi0+d2FycF9waXBlOworCURNQV9MT0NBTFM7CisKKy8qICAJcHJpbnRrKCJtZ2FfZzQwMF9lbWl0X3BpcGUgJXhcbiIsIHBpcGUpOyAqLworCisJQkVHSU5fRE1BKCAxMCApOworCisJRE1BX0JMT0NLKCBNR0FfV0lBRERSMiwJTUdBX1dNT0RFX1NVU1BFTkQsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAgKTsKKworCWlmICggcGlwZSAmIE1HQV9UMiApIHsKKwkJRE1BX0JMT0NLKCBNR0FfV1ZSVFhTWiwJCTB4MDAwMDFlMDksCisJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAgKTsKKworCQlETUFfQkxPQ0soIE1HQV9XQUNDRVBUU0VRLAkweDAwMDAwMDAwLAorCQkJICAgTUdBX1dBQ0NFUFRTRVEsCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfV0FDQ0VQVFNFUSwJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9XQUNDRVBUU0VRLAkweDFlMDAwMDAwICk7CisJfSBlbHNlIHsKKwkJaWYgKCBkZXZfcHJpdi0+d2FycF9waXBlICYgTUdBX1QyICkgeworCQkJLyogRmx1c2ggdGhlIFdBUlAgcGlwZSAqLworCQkJRE1BX0JMT0NLKCBNR0FfWURTVCwJCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZYTEVGVCwJCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZYUklHSFQsCQkweDAwMDAwMDAxLAorCQkJCSAgIE1HQV9EV0dDVEwsCQlNR0FfRFdHQ1RMX0ZMVVNIICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0xFTiArIE1HQV9FWEVDLAkweDAwMDAwMDAxLAorCQkJCSAgIE1HQV9EV0dTWU5DLAkJMHgwMDAwNzAwMCwKKwkJCQkgICBNR0FfVEVYQ1RMMiwJCU1HQV9HNDAwX1RDMl9NQUdJQywKKwkJCQkgICBNR0FfTEVOICsgTUdBX0VYRUMsCTB4MDAwMDAwMDAgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCShNR0FfRFVBTFRFWCB8CisJCQkJCQkJIE1HQV9HNDAwX1RDMl9NQUdJQyksCisJCQkJICAgTUdBX0xFTiArIE1HQV9FWEVDLAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9URVhDVEwyLAkJTUdBX0c0MDBfVEMyX01BR0lDLAorCQkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisJCX0KKworCQlETUFfQkxPQ0soIE1HQV9XVlJUWFNaLAkJMHgwMDAwMTgwNywKKwkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJCURNQV9CTE9DSyggTUdBX1dBQ0NFUFRTRVEsCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfV0FDQ0VQVFNFUSwJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9XQUNDRVBUU0VRLAkweDAwMDAwMDAwLAorCQkJICAgTUdBX1dBQ0NFUFRTRVEsCTB4MTgwMDAwMDAgKTsKKwl9CisKKwlETUFfQkxPQ0soIE1HQV9XRkxBRywJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dGTEFHMSwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTYsCU1HQV9HNDAwX1dSNTZfTUFHSUMsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSNDksCTB4MDAwMDAwMDAsCQkvKiB0ZXgwICAgICAgICAgICAgICAqLworCQkgICBNR0FfV1I1NywJMHgwMDAwMDAwMCwJCS8qIHRleDAgICAgICAgICAgICAgICovCisJCSAgIE1HQV9XUjUzLAkweDAwMDAwMDAwLAkJLyogdGV4MSAgICAgICAgICAgICAgKi8KKwkJICAgTUdBX1dSNjEsCTB4MDAwMDAwMDAgKTsJCS8qIHRleDEgICAgICAgICAgICAgICovCisKKwlETUFfQkxPQ0soIE1HQV9XUjU0LAlNR0FfRzQwMF9XUl9NQUdJQywJLyogdGV4MCB3aWR0aCAgICAgICAgKi8KKwkJICAgTUdBX1dSNjIsCU1HQV9HNDAwX1dSX01BR0lDLAkvKiB0ZXgwIGhlaWdodCAgICAgICAqLworCQkgICBNR0FfV1I1MiwJTUdBX0c0MDBfV1JfTUFHSUMsCS8qIHRleDEgd2lkdGggICAgICAgICovCisJCSAgIE1HQV9XUjYwLAlNR0FfRzQwMF9XUl9NQUdJQyApOwkvKiB0ZXgxIGhlaWdodCAgICAgICAqLworCisJLyogUGFkZGluZyByZXF1aXJlZCB0byB0byBoYXJkd2FyZSBidWcgKi8KKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9ETUFQQUQsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9ETUFQQUQsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9XSUFERFIyLAkoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzW3BpcGVdIHwKKwkJCQkgTUdBX1dNT0RFX1NUQVJUIHwKKwkJCQkgTUdBX1dBR1BfRU5BQkxFKSApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2cyMDBfZW1pdF9zdGF0ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKKworCWlmICggc2FyZWFfcHJpdi0+d2FycF9waXBlICE9IGRldl9wcml2LT53YXJwX3BpcGUgKSB7CisJCW1nYV9nMjAwX2VtaXRfcGlwZSggZGV2X3ByaXYgKTsKKwkJZGV2X3ByaXYtPndhcnBfcGlwZSA9IHNhcmVhX3ByaXYtPndhcnBfcGlwZTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9DT05URVhUICkgeworCQltZ2FfZzIwMF9lbWl0X2NvbnRleHQoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5NR0FfVVBMT0FEX0NPTlRFWFQ7CisJfQorCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfVEVYMCApIHsKKwkJbWdhX2cyMDBfZW1pdF90ZXgwKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+TUdBX1VQTE9BRF9URVgwOworCX0KK30KKworc3RhdGljIHZvaWQgbWdhX2c0MDBfZW1pdF9zdGF0ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKKwlpbnQgbXVsdGl0ZXggPSBzYXJlYV9wcml2LT53YXJwX3BpcGUgJiBNR0FfVDI7CisKKwlpZiAoIHNhcmVhX3ByaXYtPndhcnBfcGlwZSAhPSBkZXZfcHJpdi0+d2FycF9waXBlICkgeworCQltZ2FfZzQwMF9lbWl0X3BpcGUoIGRldl9wcml2ICk7CisJCWRldl9wcml2LT53YXJwX3BpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CisJfQorCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfQ09OVEVYVCApIHsKKwkJbWdhX2c0MDBfZW1pdF9jb250ZXh0KCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+TUdBX1VQTE9BRF9DT05URVhUOworCX0KKworCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1RFWDAgKSB7CisJCW1nYV9nNDAwX2VtaXRfdGV4MCggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfk1HQV9VUExPQURfVEVYMDsKKwl9CisKKwlpZiAoIChkaXJ0eSAmIE1HQV9VUExPQURfVEVYMSkgJiYgbXVsdGl0ZXggKSB7CisJCW1nYV9nNDAwX2VtaXRfdGV4MSggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfk1HQV9VUExPQURfVEVYMTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0FSRUEgc3RhdGUgdmVyaWZpY2F0aW9uCisgKi8KKworLyogRGlzYWxsb3cgYWxsIHdyaXRlIGRlc3RpbmF0aW9ucyBleGNlcHQgdGhlIGZyb250IGFuZCBiYWNrYnVmZmVyLgorICovCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfY29udGV4dCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKworCWlmICggY3R4LT5kc3RvcmcgIT0gZGV2X3ByaXYtPmZyb250X29mZnNldCAmJgorCSAgICAgY3R4LT5kc3RvcmcgIT0gZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIERTVE9SRzogJXggKGZyb250ICV4LCBiYWNrICV4KVxuXG4iLAorCQkJICAgY3R4LT5kc3RvcmcsIGRldl9wcml2LT5mcm9udF9vZmZzZXQsCisJCQkgICBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKwkJY3R4LT5kc3RvcmcgPSAwOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEaXNhbGxvdyB0ZXh0dXJlIHJlYWRzIGZyb20gUENJIHNwYWNlLgorICovCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfdGV4KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCB1bml0ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlW3VuaXRdOworCXVuc2lnbmVkIGludCBvcmc7CisKKwlvcmcgPSB0ZXgtPnRleG9yZyAmIChNR0FfVEVYT1JHTUFQX01BU0sgfCBNR0FfVEVYT1JHQUNDX01BU0spOworCisJaWYgKCBvcmcgPT0gKE1HQV9URVhPUkdNQVBfU1lTTUVNIHwgTUdBX1RFWE9SR0FDQ19QQ0kpICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIFRFWE9SRzogMHgleCwgdW5pdCAlZFxuIiwKKwkJCSAgIHRleC0+dGV4b3JnLCB1bml0ICk7CisJCXRleC0+dGV4b3JnID0gMDsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfdmVyaWZ5X3N0YXRlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBkaXJ0eSA9IHNhcmVhX3ByaXYtPmRpcnR5OworCWludCByZXQgPSAwOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gTUdBX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfQ09OVEVYVCApCisJCXJldCB8PSBtZ2FfdmVyaWZ5X2NvbnRleHQoIGRldl9wcml2ICk7CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9URVgwICkKKwkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KCBkZXZfcHJpdiwgMCApOworCisJaWYgKCBkZXZfcHJpdi0+Y2hpcHNldCA9PSBNR0FfQ0FSRF9UWVBFX0c0MDAgKSB7CisJCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1RFWDEgKQorCQkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KCBkZXZfcHJpdiwgMSApOworCisJCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1BJUEUgKQorCQkJcmV0IHw9ICggc2FyZWFfcHJpdi0+d2FycF9waXBlID4gTUdBX01BWF9HNDAwX1BJUEVTICk7CisJfSBlbHNlIHsKKwkJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfUElQRSApCisJCQlyZXQgfD0gKCBzYXJlYV9wcml2LT53YXJwX3BpcGUgPiBNR0FfTUFYX0cyMDBfUElQRVMgKTsKKwl9CisKKwlyZXR1cm4gKCByZXQgPT0gMCApOworfQorCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfaWxvYWQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGRzdG9yZywgdW5zaWduZWQgaW50IGxlbmd0aCApCit7CisJaWYgKCBkc3RvcmcgPCBkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgfHwKKwkgICAgIGRzdG9yZyArIGxlbmd0aCA+IChkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgKworCQkJCWRldl9wcml2LT50ZXh0dXJlX3NpemUpICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIGlsb2FkIERTVE9SRzogMHgleFxuIiwgZHN0b3JnICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBsZW5ndGggJiBNR0FfSUxPQURfTUFTSyApIHsKKwkJRFJNX0VSUk9SKCAiKioqIGJhZCBpbG9hZCBsZW5ndGg6IDB4JXhcbiIsCisJCQkgICBsZW5ndGggJiBNR0FfSUxPQURfTUFTSyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfYmxpdCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgIHVuc2lnbmVkIGludCBzcmNvcmcsIHVuc2lnbmVkIGludCBkc3RvcmcgKQoreworCWlmICggKHNyY29yZyAmIDB4MykgPT0gKE1HQV9TUkNBQ0NfUENJIHwgTUdBX1NSQ01BUF9TWVNNRU0pIHx8CisJICAgICAoZHN0b3JnICYgMHgzKSA9PSAoTUdBX1NSQ0FDQ19QQ0kgfCBNR0FfU1JDTUFQX1NZU01FTSkgKSB7CisJCURSTV9FUlJPUiggIioqKiBiYWQgYmxpdDogc3JjPTB4JXggZHN0PTB4JXhcbiIsCisJCQkgICBzcmNvcmcsIGRzdG9yZyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICBkcm1fbWdhX2NsZWFyX3QgKmNsZWFyICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlpbnQgaTsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fRE1BKCAxICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MTAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gJnBib3hbaV07CisJCXUzMiBoZWlnaHQgPSBib3gtPnkyIC0gYm94LT55MTsKKworCQlEUk1fREVCVUcoICIgICBmcm9tPSVkLCVkIHRvPSVkLCVkXG4iLAorCQkJICAgYm94LT54MSwgYm94LT55MSwgYm94LT54MiwgYm94LT55MiApOworCisJCWlmICggY2xlYXItPmZsYWdzICYgTUdBX0ZST05UICkgeworCQkJQkVHSU5fRE1BKCAyICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfUExOV1QsCWNsZWFyLT5jb2xvcl9tYXNrLAorCQkJCSAgIE1HQV9ZRFNUTEVOLCAoYm94LT55MSA8PCAxNikgfCBoZWlnaHQsCisJCQkJICAgTUdBX0ZYQk5EUlksIChib3gtPngyIDw8IDE2KSB8IGJveC0+eDEgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9GQ09MLAljbGVhci0+Y2xlYXJfY29sb3IsCisJCQkJICAgTUdBX0RTVE9SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJCQkgICBNR0FfRFdHQ1RMICsgTUdBX0VYRUMsCisJCQkJCQlkZXZfcHJpdi0+Y2xlYXJfY21kICk7CisKKwkJCUFEVkFOQ0VfRE1BKCk7CisJCX0KKworCisJCWlmICggY2xlYXItPmZsYWdzICYgTUdBX0JBQ0sgKSB7CisJCQlCRUdJTl9ETUEoIDIgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9QTE5XVCwJY2xlYXItPmNvbG9yX21hc2ssCisJCQkJICAgTUdBX1lEU1RMRU4sIChib3gtPnkxIDw8IDE2KSB8IGhlaWdodCwKKwkJCQkgICBNR0FfRlhCTkRSWSwgKGJveC0+eDIgPDwgMTYpIHwgYm94LT54MSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZDT0wsCWNsZWFyLT5jbGVhcl9jb2xvciwKKwkJCQkgICBNR0FfRFNUT1JHLAlkZXZfcHJpdi0+YmFja19vZmZzZXQsCisJCQkJICAgTUdBX0RXR0NUTCArIE1HQV9FWEVDLAorCQkJCQkJZGV2X3ByaXYtPmNsZWFyX2NtZCApOworCisJCQlBRFZBTkNFX0RNQSgpOworCQl9CisKKwkJaWYgKCBjbGVhci0+ZmxhZ3MgJiBNR0FfREVQVEggKSB7CisJCQlCRUdJTl9ETUEoIDIgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9QTE5XVCwJY2xlYXItPmRlcHRoX21hc2ssCisJCQkJICAgTUdBX1lEU1RMRU4sIChib3gtPnkxIDw8IDE2KSB8IGhlaWdodCwKKwkJCQkgICBNR0FfRlhCTkRSWSwgKGJveC0+eDIgPDwgMTYpIHwgYm94LT54MSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZDT0wsCWNsZWFyLT5jbGVhcl9kZXB0aCwKKwkJCQkgICBNR0FfRFNUT1JHLAlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0LAorCQkJCSAgIE1HQV9EV0dDVEwgKyBNR0FfRVhFQywKKwkJCQkJCWRldl9wcml2LT5jbGVhcl9jbWQgKTsKKworCQkJQURWQU5DRV9ETUEoKTsKKwkJfQorCisJfQorCisJQkVHSU5fRE1BKCAxICk7CisKKwkvKiBGb3JjZSByZXNldCBvZiBEV0dDVEwgKi8KKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9QTE5XVCwJY3R4LT5wbG53dCwKKwkJICAgTUdBX0RXR0NUTCwJY3R4LT5kd2djdGwgKTsKKworCUFEVkFOQ0VfRE1BKCk7CisKKwlGTFVTSF9ETUEoKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJaW50IGk7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCXNhcmVhX3ByaXYtPmxhc3RfZnJhbWUuaGVhZCA9IGRldl9wcml2LT5wcmltLnRhaWw7CisJc2FyZWFfcHJpdi0+bGFzdF9mcmFtZS53cmFwID0gZGV2X3ByaXYtPnByaW0ubGFzdF93cmFwOworCisJQkVHSU5fRE1BKCA0ICsgbmJveCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzEwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX0RTVE9SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJICAgTUdBX01BQ0NFU1MsCWRldl9wcml2LT5tYWNjZXNzLAorCQkgICBNR0FfU1JDT1JHLAlkZXZfcHJpdi0+YmFja19vZmZzZXQsCisJCSAgIE1HQV9BUjUsCWRldl9wcml2LT5mcm9udF9waXRjaCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfUExOV1QsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9EV0dDVEwsCU1HQV9EV0dDVExfQ09QWSApOworCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmcGJveFtpXTsKKwkJdTMyIGhlaWdodCA9IGJveC0+eTIgLSBib3gtPnkxOworCQl1MzIgc3RhcnQgPSBib3gtPnkxICogZGV2X3ByaXYtPmZyb250X3BpdGNoOworCisJCURSTV9ERUJVRyggIiAgIGZyb209JWQsJWQgdG89JWQsJWRcbiIsCisJCQkgICBib3gtPngxLCBib3gtPnkxLCBib3gtPngyLCBib3gtPnkyICk7CisKKwkJRE1BX0JMT0NLKCBNR0FfQVIwLAlzdGFydCArIGJveC0+eDIgLSAxLAorCQkJICAgTUdBX0FSMywJc3RhcnQgKyBib3gtPngxLAorCQkJICAgTUdBX0ZYQk5EUlksCSgoYm94LT54MiAtIDEpIDw8IDE2KSB8IGJveC0+eDEsCisJCQkgICBNR0FfWURTVExFTiArIE1HQV9FWEVDLAorCQkJCQkoYm94LT55MSA8PCAxNikgfCBoZWlnaHQgKTsKKwl9CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9QTE5XVCwJY3R4LT5wbG53dCwKKwkJICAgTUdBX1NSQ09SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJICAgTUdBX0RXR0NUTCwJY3R4LT5kd2djdGwgKTsKKworCUFEVkFOQ0VfRE1BKCk7CisKKwlGTFVTSF9ETUEoKTsKKworCURSTV9ERUJVRyggIiVzLi4uIGRvbmUuXG4iLCBfX0ZVTkNUSU9OX18gKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1MzIgYWRkcmVzcyA9ICh1MzIpIGJ1Zi0+YnVzX2FkZHJlc3M7CisJdTMyIGxlbmd0aCA9ICh1MzIpIGJ1Zi0+dXNlZDsKKwlpbnQgaSA9IDA7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJ2ZXJ0ZXg6IGJ1Zj0lZCB1c2VkPSVkXG4iLCBidWYtPmlkeCwgYnVmLT51c2VkICk7CisKKwlpZiAoIGJ1Zi0+dXNlZCApIHsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAxOworCisJCU1HQV9FTUlUX1NUQVRFKCBkZXZfcHJpdiwgc2FyZWFfcHJpdi0+ZGlydHkgKTsKKworCQlkbyB7CisJCQlpZiAoIGkgPCBzYXJlYV9wcml2LT5uYm94ICkgeworCQkJCW1nYV9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCQkgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCQl9CisKKwkJCUJFR0lOX0RNQSggMSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9TRUNBRERSRVNTLAkoYWRkcmVzcyB8CisJCQkJCQkJIE1HQV9ETUFfVkVSVEVYKSwKKwkJCQkgICBNR0FfU0VDRU5ELAkJKChhZGRyZXNzICsgbGVuZ3RoKSB8CisJCQkJCQkJIE1HQV9QQUdQWEZFUikgKTsKKworCQkJQURWQU5DRV9ETUEoKTsKKwkJfSB3aGlsZSAoICsraSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlBR0VfQlVGRkVSKCBidWZfcHJpdiApOworCQlidWYtPnBlbmRpbmcgPSAwOworCQlidWYtPnVzZWQgPSAwOworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisKKwkJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKwl9CisKKwlGTFVTSF9ETUEoKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbmRpY2VzKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXUzMiBhZGRyZXNzID0gKHUzMikgYnVmLT5idXNfYWRkcmVzczsKKwlpbnQgaSA9IDA7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJpbmRpY2VzOiBidWY9JWQgc3RhcnQ9JWQgZW5kPSVkXG4iLCBidWYtPmlkeCwgc3RhcnQsIGVuZCApOworCisJaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMTsKKworCQlNR0FfRU1JVF9TVEFURSggZGV2X3ByaXYsIHNhcmVhX3ByaXYtPmRpcnR5ICk7CisKKwkJZG8geworCQkJaWYgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApIHsKKwkJCQltZ2FfZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LAorCQkJCQkJICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCQkJfQorCisJCQlCRUdJTl9ETUEoIDEgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfU0VUVVBBRERSRVNTLAlhZGRyZXNzICsgc3RhcnQsCisJCQkJICAgTUdBX1NFVFVQRU5ELAkoKGFkZHJlc3MgKyBlbmQpIHwKKwkJCQkJCQkgTUdBX1BBR1BYRkVSKSApOworCisJCQlBRFZBTkNFX0RNQSgpOworCQl9IHdoaWxlICggKytpIDwgc2FyZWFfcHJpdi0+bmJveCApOworCX0KKworCWlmICggYnVmX3ByaXYtPmRpc2NhcmQgKSB7CisJCUFHRV9CVUZGRVIoIGJ1Zl9wcml2ICk7CisJCWJ1Zi0+cGVuZGluZyA9IDA7CisJCWJ1Zi0+dXNlZCA9IDA7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMDsKKworCQltZ2FfZnJlZWxpc3RfcHV0KCBkZXYsIGJ1ZiApOworCX0KKworCUZMVVNIX0RNQSgpOworfQorCisvKiBUaGlzIGNvcGllcyBhIDY0IGJ5dGUgYWxpZ25lZCBhZ3AgcmVnaW9uIHRvIHRoZSBmcmFtYnVmZmVyIHdpdGggYQorICogc3RhbmRhcmQgYmxpdCwgdGhlIGlvY3RsIG5lZWRzIHRvIGRvIGNoZWNraW5nLgorICovCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGludCBkc3RvcmcsIHVuc2lnbmVkIGludCBsZW5ndGggKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJmRldl9wcml2LT5zYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCXUzMiBzcmNvcmcgPSBidWYtPmJ1c19hZGRyZXNzIHwgTUdBX1NSQ0FDQ19BR1AgfCBNR0FfU1JDTUFQX1NZU01FTTsKKwl1MzIgeTI7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJidWY9JWQgdXNlZD0lZFxuIiwgYnVmLT5pZHgsIGJ1Zi0+dXNlZCApOworCisJeTIgPSBsZW5ndGggLyA2NDsKKworCUJFR0lOX0RNQSggNSApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzEwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX0RTVE9SRywJZHN0b3JnLAorCQkgICBNR0FfTUFDQ0VTUywJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1NSQ09SRywJc3Jjb3JnLAorCQkgICBNR0FfQVI1LAk2NCApOworCisJRE1BX0JMT0NLKCBNR0FfUElUQ0gsCTY0LAorCQkgICBNR0FfUExOV1QsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9EV0dDVEwsCU1HQV9EV0dDVExfQ09QWSApOworCisJRE1BX0JMT0NLKCBNR0FfQVIwLAk2MywKKwkJICAgTUdBX0FSMywJMCwKKwkJICAgTUdBX0ZYQk5EUlksCSg2MyA8PCAxNikgfCAwLAorCQkgICBNR0FfWURTVExFTiArIE1HQV9FWEVDLCB5MiApOworCisJRE1BX0JMT0NLKCBNR0FfUExOV1QsCWN0eC0+cGxud3QsCisJCSAgIE1HQV9TUkNPUkcsCWRldl9wcml2LT5mcm9udF9vZmZzZXQsCisJCSAgIE1HQV9QSVRDSCwJZGV2X3ByaXYtPmZyb250X3BpdGNoLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCUFHRV9CVUZGRVIoIGJ1Zl9wcml2ICk7CisKKwlidWYtPnBlbmRpbmcgPSAwOworCWJ1Zi0+dXNlZCA9IDA7CisJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCisJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKworCUZMVVNIX0RNQSgpOworfQorCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgIGRybV9tZ2FfYmxpdF90ICpibGl0ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwl1MzIgc2NhbmRpciA9IDAsIGk7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUJFR0lOX0RNQSggNCArIG5ib3ggKTsKKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcxMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MDAwICk7CisKKwlETUFfQkxPQ0soIE1HQV9EV0dDVEwsCU1HQV9EV0dDVExfQ09QWSwKKwkJICAgTUdBX1BMTldULAlibGl0LT5wbGFuZW1hc2ssCisJCSAgIE1HQV9TUkNPUkcsCWJsaXQtPnNyY29yZywKKwkJICAgTUdBX0RTVE9SRywJYmxpdC0+ZHN0b3JnICk7CisKKwlETUFfQkxPQ0soIE1HQV9TR04sCXNjYW5kaXIsCisJCSAgIE1HQV9NQUNDRVNTLAlkZXZfcHJpdi0+bWFjY2VzcywKKwkJICAgTUdBX0FSNSwJYmxpdC0+eWRpciAqIGJsaXQtPnNyY19waXRjaCwKKwkJICAgTUdBX1BJVENILAlibGl0LT5kc3RfcGl0Y2ggKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWludCBzcmN4ID0gcGJveFtpXS54MSArIGJsaXQtPmRlbHRhX3N4OworCQlpbnQgc3JjeSA9IHBib3hbaV0ueTEgKyBibGl0LT5kZWx0YV9zeTsKKwkJaW50IGRzdHggPSBwYm94W2ldLngxICsgYmxpdC0+ZGVsdGFfZHg7CisJCWludCBkc3R5ID0gcGJveFtpXS55MSArIGJsaXQtPmRlbHRhX2R5OworCQlpbnQgaCA9IHBib3hbaV0ueTIgLSBwYm94W2ldLnkxOworCQlpbnQgdyA9IHBib3hbaV0ueDIgLSBwYm94W2ldLngxIC0gMTsKKwkJaW50IHN0YXJ0OworCisJCWlmICggYmxpdC0+eWRpciA9PSAtMSApIHsKKwkJCXNyY3kgPSBibGl0LT5oZWlnaHQgLSBzcmN5IC0gMTsKKwkJfQorCisJCXN0YXJ0ID0gc3JjeSAqIGJsaXQtPnNyY19waXRjaCArIHNyY3g7CisKKwkJRE1BX0JMT0NLKCBNR0FfQVIwLAlzdGFydCArIHcsCisJCQkgICBNR0FfQVIzLAlzdGFydCwKKwkJCSAgIE1HQV9GWEJORFJZLAkoKGRzdHggKyB3KSA8PCAxNikgfCAoZHN0eCAmIDB4ZmZmZiksCisJCQkgICBNR0FfWURTVExFTiArIE1HQV9FWEVDLCAoZHN0eSA8PCAxNikgfCBoICk7CisJfQorCisJLyogRG8gc29tZXRoaW5nIHRvIGZsdXNoIEFHUD8KKwkgKi8KKworCS8qIEZvcmNlIHJlc2V0IG9mIERXR0NUTCAqLworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1BMTldULAljdHgtPnBsbnd0LAorCQkgICBNR0FfUElUQ0gsCWRldl9wcml2LT5mcm9udF9waXRjaCwKKwkJICAgTUdBX0RXR0NUTCwJY3R4LT5kd2djdGwgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCitzdGF0aWMgaW50IG1nYV9kbWFfY2xlYXIoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jbGVhcl90IGNsZWFyOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggY2xlYXIsIChkcm1fbWdhX2NsZWFyX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGNsZWFyKSApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gTUdBX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF9jbGVhciggZGV2LCAmY2xlYXIgKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmRpcnR5IHw9IE1HQV9VUExPQURfQ09OVEVYVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV9kbWFfc3dhcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IE1HQV9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX3N3YXAoIGRldiApOworCisJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+ZGlydHkgfD0gTUdBX1VQTE9BRF9DT05URVhUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV92ZXJ0ZXgoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fbWdhX3ZlcnRleF90IHZlcnRleDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZlcnRleCwKKwkJCSAgICAgKGRybV9tZ2FfdmVydGV4X3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworICAgICAgICBpZih2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID4gZG1hLT5idWZfY291bnQpIHJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWJ1Zi0+dXNlZCA9IHZlcnRleC51c2VkOworCWJ1Zl9wcml2LT5kaXNjYXJkID0gdmVydGV4LmRpc2NhcmQ7CisKKwlpZiAoICFtZ2FfdmVyaWZ5X3N0YXRlKCBkZXZfcHJpdiApICkgeworCQlpZiAoIHZlcnRleC5kaXNjYXJkICkgeworCQkJaWYgKCBidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9PSAxICkKKwkJCQlBR0VfQlVGRkVSKCBidWZfcHJpdiApOworCQkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCQkJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKwkJfQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVdSQVBfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCW1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIGJ1ZiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV9pbmRpY2VzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX21nYV9pbmRpY2VzX3QgaW5kaWNlczsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluZGljZXMsCisJCQkgICAgIChkcm1fbWdhX2luZGljZXNfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoaW5kaWNlcykgKTsKKworICAgICAgICBpZihpbmRpY2VzLmlkeCA8IDAgfHwgaW5kaWNlcy5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpY2VzLmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJYnVmX3ByaXYtPmRpc2NhcmQgPSBpbmRpY2VzLmRpc2NhcmQ7CisKKwlpZiAoICFtZ2FfdmVyaWZ5X3N0YXRlKCBkZXZfcHJpdiApICkgeworCQlpZiAoIGluZGljZXMuZGlzY2FyZCApIHsKKwkJCWlmICggYnVmX3ByaXYtPmRpc3BhdGNoZWQgPT0gMSApCisJCQkJQUdFX0JVRkZFUiggYnVmX3ByaXYgKTsKKwkJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMDsKKwkJCW1nYV9mcmVlbGlzdF9wdXQoIGRldiwgYnVmICk7CisJCX0KKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCBpbmRpY2VzLnN0YXJ0LCBpbmRpY2VzLmVuZCApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV9pbG9hZCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9tZ2FfaWxvYWRfdCBpbG9hZDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGlsb2FkLCAoZHJtX21nYV9pbG9hZF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihpbG9hZCkgKTsKKworI2lmIDAKKwlpZiAoIG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApIDwgMCApIHsKKwkJaWYgKCBNR0FfRE1BX0RFQlVHICkKKwkJCURSTV9JTkZPKCAiJXM6IC1FQlVTWVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKKwl9CisjZW5kaWYKKyAgICAgICAgaWYoaWxvYWQuaWR4IDwgMCB8fCBpbG9hZC5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbG9hZC5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggbWdhX3ZlcmlmeV9pbG9hZCggZGV2X3ByaXYsIGlsb2FkLmRzdG9yZywgaWxvYWQubGVuZ3RoICkgKSB7CisJCW1nYV9mcmVlbGlzdF9wdXQoIGRldiwgYnVmICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF9pbG9hZCggZGV2LCBidWYsIGlsb2FkLmRzdG9yZywgaWxvYWQubGVuZ3RoICk7CisKKwkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5kaXJ0eSB8PSBNR0FfVVBMT0FEX0NPTlRFWFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZG1hX2JsaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9ibGl0X3QgYmxpdDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGJsaXQsIChkcm1fbWdhX2JsaXRfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoYmxpdCkgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IE1HQV9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gTUdBX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWlmICggbWdhX3ZlcmlmeV9ibGl0KCBkZXZfcHJpdiwgYmxpdC5zcmNvcmcsIGJsaXQuZHN0b3JnICkgKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF9ibGl0KCBkZXYsICZibGl0ICk7CisKKwkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5kaXJ0eSB8PSBNR0FfVVBMT0FEX0NPTlRFWFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZ2V0cGFyYW0oIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9nZXRwYXJhbV90IHBhcmFtOworCWludCB2YWx1ZTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBwYXJhbSwgKGRybV9tZ2FfZ2V0cGFyYW1fdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YocGFyYW0pICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWRcbiIsIERSTV9DVVJSRU5UUElEICk7CisKKwlzd2l0Y2goIHBhcmFtLnBhcmFtICkgeworCWNhc2UgTUdBX1BBUkFNX0lSUV9OUjoKKwkJdmFsdWUgPSBkZXYtPmlycTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIERSTV9DT1BZX1RPX1VTRVIoIHBhcmFtLnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCBtZ2FfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lOSVQpXSAgICA9IHsgbWdhX2RtYV9pbml0LCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0ZMVVNIKV0gICA9IHsgbWdhX2RtYV9mbHVzaCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1JFU0VUKV0gICA9IHsgbWdhX2RtYV9yZXNldCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1NXQVApXSAgICA9IHsgbWdhX2RtYV9zd2FwLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0NMRUFSKV0gICA9IHsgbWdhX2RtYV9jbGVhciwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1ZFUlRFWCldICA9IHsgbWdhX2RtYV92ZXJ0ZXgsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lORElDRVMpXSA9IHsgbWdhX2RtYV9pbmRpY2VzLCAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lMT0FEKV0gICA9IHsgbWdhX2RtYV9pbG9hZCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0JMSVQpXSAgICA9IHsgbWdhX2RtYV9ibGl0LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0dFVFBBUkFNKV09IHsgbWdhX2dldHBhcmFtLCAgICAxLCAwIH0sCit9OworCitpbnQgbWdhX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKG1nYV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfdWNvZGUuaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3Vjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwZjgyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3Vjb2RlLmgKQEAgLTAsMCArMSwxMTY0NSBAQAorLyogbWdhX3Vjb2RlLmggLS0gTWF0cm94IEcyMDAvRzQwMCBXQVJQIGVuZ2luZSBtaWNyb2NvZGUgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUaHUgSmFuIDExIDIxOjIwOjQzIDIwMDEgYnkgZ2FyZXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgTWF0cm94IEdyYXBoaWNzIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBNQVRST1ggR1JBUEhJQ1MgSU5DLiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBLZXJuZWwtYmFzZWQgV0FSUCBlbmdpbmUgbWFuYWdlbWVudDoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogV0FSUCBwaXBlcyBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBmdW5jdGlvbnMgdGhleSBwZXJmb3JtLCB3aGVyZToKKyAqCisgKiAgIC0gVCBzdGFuZHMgZm9yIGNvbXB1dGF0aW9uIG9mIHRleHR1cmUgc3RhZ2UgMAorICogICAtIFQyIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgYm90aCB0ZXh0dXJlIHN0YWdlIDAgYW5kIHRleHR1cmUgc3RhZ2UgMQorICogICAtIEcgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiB0cmlhbmdsZSBpbnRlbnNpdHkgKEdvdXJhdWQgaW50ZXJwb2xhdGlvbikKKyAqICAgLSBaIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgWiBidWZmZXIgaW50ZXJwb2xhdGlvbgorICogICAtIFMgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiBzcGVjdWxhciBoaWdobGlnaHQKKyAqICAgLSBBIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgdGhlIGFscGhhIGNoYW5uZWwKKyAqICAgLSBGIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgdmVydGV4IGZvZyBpbnRlcnBvbGF0aW9uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nMjAwX3RneltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4OTgsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4ODEsIDB4MDQsCisweDg5LCAweDA0LAorMHgwMSwgMHgwNCwKKzB4MDksIDB4MDQsCisKKzB4QzksIDB4NDEsIDB4QzAsIDB4RUMsCisweDExLCAweDA0LAorMHgwMCwgMHhFMCwKKworMHg0MSwgMHhDQywgMHg0MSwgMHhDRCwKKzB4NDksIDB4Q0MsIDB4NDksIDB4Q0QsCisKKzB4RDEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDUxLCAweENDLCAweDUxLCAweENELAorCisweDgwLCAweDA0LAorMHgxMCwgMHgwNCwKKzB4MDgsIDB4MDQsCisweDAwLCAweEUwLAorCisweDAwLCAweENDLCAweEMwLCAweENELAorMHhEMSwgMHg0OSwgMHhDMCwgMHhFQywKKworMHg4QSwgMHgxRiwgMHgyMCwgMHhFOSwKKzB4OEIsIDB4M0YsIDB4MjAsIDB4RTksCisKKzB4NDEsIDB4M0MsIDB4NDEsIDB4QUQsCisweDQ5LCAweDNDLCAweDQ5LCAweEFELAorCisweDEwLCAweENDLCAweDEwLCAweENELAorMHgwOCwgMHhDQywgMHgwOCwgMHhDRCwKKworMHhCOSwgMHg0MSwgMHg0OSwgMHhCQiwKKzB4MUYsIDB4RjAsIDB4NDEsIDB4Q0QsCisKKzB4NTEsIDB4M0MsIDB4NTEsIDB4QUQsCisweDAwLCAweDk4LCAweDgwLCAweEU5LAorCisweDcyLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHgxRiwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDYwLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMywgMHg4MCwgMHgwQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4QjMsIDB4MDUsCisweDAwLCAweEUwLAorMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKworMHgyMywgMHgzQiwgMHgzMywgMHhBRCwKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDg1LCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg4NCwgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg4MiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg3RiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6YVtdID0geworCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg3RCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg2QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjYsCisweDI1LCAweDQ0LCAweDU0LCAweEI2LAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgyRCwgMHgyMCwKKzB4MjUsIDB4MjAsCisweDA3LCAweEMwLCAweDQ0LCAweEM2LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFGLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzRiwgMHgzRCwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDA3LCAweDIwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHhCMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHgyNiwgMHgxRiwgMHhERiwKKzB4OUQsIDB4MUYsIDB4NEYsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg5RSwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgwNywgMHgwNywgMHgxRiwgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDlDLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4N0EsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDc5LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDc3LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDc0LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3phZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4ODMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg2RiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDJELCAweDQ0LCAweDRDLCAweEI2LAorMHgyNSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MEQsIDB4MjAsCisweDA1LCAweDIwLAorMHgyRiwgMHhDMCwgMHgyMSwgMHhDNiwKKworMHhCMywgMHg2OCwKKzB4OTcsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweEMwLCAweDMzLCAweEFGLAorMHgzQywgMHgyNywgMHg0RiwgMHhFOSwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDA3LCAweEMwLCAweDQ0LCAweEM2LAorCisweDE3LCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4MjAsCisKKzB4MzcsIDB4MEYsIDB4NUMsIDB4OUYsCisweDAwLCAweEUwLAorMHgyRiwgMHgyMCwKKworMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDA3LCAweDIwLAorCisweDNGLCAweDNELCAweDVELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4QjMsIDB4MDUsCisweDAwLCAweEUwLAorMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKworMHgyMywgMHgzQiwgMHgzMywgMHhBRCwKKzB4MzUsIDB4MTcsIDB4NEYsIDB4RTksCisKKzB4MUYsIDB4MjYsIDB4MUYsIDB4REYsCisweDlELCAweDFGLCAweDRGLCAweEU5LAorCisweDlFLCAweDNGLCAweDRGLCAweEU5LAorMHgzOSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxNywgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDcsIDB4MDcsIDB4MUYsIDB4QUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMxLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg5QywgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorCisweDE2LCAweDI4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzQiwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgyQiwgMHgyMCwgMHhFOSwKKzB4MkIsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4MjMsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDc0LCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg3MywgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg3MSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2RSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6ZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4N0YsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg2QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDE3LCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHhCMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKzB4MzUsIDB4MTcsIDB4NEYsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgzOSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxNywgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMxLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NzgsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDc3LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDc1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDcyLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzW10gPSB7CisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg4QiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MjEsIDB4NDUsIDB4ODAsIDB4RTgsCisweDFBLCAweDRELCAweDgwLCAweEU4LAorCisweDMxLCAweDU1LCAweDgwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDc3LCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyRCwgMHgyMSwgMHgxQSwgMHhCMCwKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjAsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjIsCisweDA1LCAweDIxLCAweDMxLCAweEIyLAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgyRCwgMHgyMCwKKzB4MjUsIDB4MjAsCisweDA1LCAweDIwLAorMHgwRCwgMHgyMCwKKworMHhCMywgMHg2OCwKKzB4OTcsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweEMwLCAweDMzLCAweEFGLAorMHgyRiwgMHhDMCwgMHgyMSwgMHhDMCwKKworMHgxNiwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDIxLCAweDMxLCAweEI0LAorMHgyRCwgMHgyMSwgMHgxQSwgMHhCNCwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4MDUsCisweDAwLCAweEUwLAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgxRSwgMHgyNiwgMHgxRSwgMHhERiwKKworMHhBNywgMHgxRSwgMHg0RiwgMHhFOSwKKzB4MTcsIDB4MjYsIDB4MTYsIDB4REYsCisKKzB4MkQsIDB4MjAsCisweDAwLCAweEUwLAorMHhBOCwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxRSwgMHhBRiwKKzB4MjUsIDB4MjAsCisweDAwLCAweEUwLAorCisweEE0LCAweDE2LCAweDRGLCAweEU5LAorMHgwRiwgMHhDMCwgMHgyMSwgMHhDMiwKKworMHhBNiwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweEUwLAorMHg4RiwgMHgyMCwKKworMHhBNSwgMHgzNywgMHg0RiwgMHhFOSwKKzB4MEYsIDB4MTcsIDB4MEYsIDB4QUYsCisKKzB4MDYsIDB4QzAsIDB4MjEsIDB4QzQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHhBMywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweEExLCAweDFGLCAweDRGLCAweEU5LAorMHhBMiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorCisweDE2LCAweDI4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzQiwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgyQiwgMHgyMCwgMHhFOSwKKzB4MkIsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4MjMsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDZDLCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QiwgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg2OSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6c2FbXSA9IHsKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4OTgsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4ODEsIDB4MDQsCisweDg5LCAweDA0LAorMHgwMSwgMHgwNCwKKzB4MDksIDB4MDQsCisKKzB4QzksIDB4NDEsIDB4QzAsIDB4RUMsCisweDExLCAweDA0LAorMHgwMCwgMHhFMCwKKworMHg0MSwgMHhDQywgMHg0MSwgMHhDRCwKKzB4NDksIDB4Q0MsIDB4NDksIDB4Q0QsCisKKzB4RDEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDUxLCAweENDLCAweDUxLCAweENELAorCisweDgwLCAweDA0LAorMHgxMCwgMHgwNCwKKzB4MDgsIDB4MDQsCisweDAwLCAweEUwLAorCisweDAwLCAweENDLCAweEMwLCAweENELAorMHhEMSwgMHg0OSwgMHhDMCwgMHhFQywKKworMHg4QSwgMHgxRiwgMHgyMCwgMHhFOSwKKzB4OEIsIDB4M0YsIDB4MjAsIDB4RTksCisKKzB4NDEsIDB4M0MsIDB4NDEsIDB4QUQsCisweDQ5LCAweDNDLCAweDQ5LCAweEFELAorCisweDEwLCAweENDLCAweDEwLCAweENELAorMHgwOCwgMHhDQywgMHgwOCwgMHhDRCwKKworMHhCOSwgMHg0MSwgMHg0OSwgMHhCQiwKKzB4MUYsIDB4RjAsIDB4NDEsIDB4Q0QsCisKKzB4NTEsIDB4M0MsIDB4NTEsIDB4QUQsCisweDAwLCAweDk4LCAweDgwLCAweEU5LAorCisweDhGLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHgxRiwgMHgyMCwgMHhFOSwKKworMHgyMSwgMHg0NSwgMHg4MCwgMHhFOCwKKzB4MUEsIDB4NEQsIDB4ODAsIDB4RTgsCisKKzB4MzEsIDB4NTUsIDB4ODAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweDQxLCAweDQ5LCAweEJELAorMHgxRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgyRSwgMHg0MSwgMHgyQSwgMHhCOCwKKzB4MzQsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4MzAsCisweDFELCAweDMwLAorMHg1OCwgMHhFMywKKzB4MDAsIDB4RTAsCisKKzB4QjUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDI0LCAweDQzLCAweEEwLCAweEU4LAorMHgyQywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgxNSwgMHg3MiwKKzB4MDksIDB4RTMsCisweDAwLCAweEUwLAorMHgxRCwgMHg3MiwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHg5NywgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NkMsIDB4NjQsIDB4QzgsIDB4RUMsCisweDk4LCAweEUxLAorMHhCNSwgMHgwNSwKKworMHhCRCwgMHgwNSwKKzB4MkUsIDB4MzAsCisweDMyLCAweEMwLCAweEEwLCAweEU4LAorCisweDMzLCAweEMwLCAweEEwLCAweEU4LAorMHg3NCwgMHg2NCwgMHhDOCwgMHhFQywKKworMHg0MCwgMHgzQywgMHg0MCwgMHhBRCwKKzB4MzIsIDB4NkEsCisweDJBLCAweDMwLAorCisweDIwLCAweDczLAorMHgzMywgMHg2QSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDczLAorCisweDFDLCAweDcyLAorMHg4MywgMHhFMiwKKzB4N0IsIDB4ODAsIDB4MTUsIDB4RUEsCisKKzB4QjgsIDB4M0QsIDB4MjgsIDB4REYsCisweDMwLCAweDM1LCAweDIwLCAweERGLAorCisweDQwLCAweDMwLAorMHgwMCwgMHhFMCwKKzB4Q0MsIDB4RTIsCisweDY0LCAweDcyLAorCisweDI1LCAweDQyLCAweDUyLCAweEJGLAorMHgyRCwgMHg0MiwgMHg0QSwgMHhCRiwKKworMHgzMCwgMHgyRSwgMHgzMCwgMHhERiwKKzB4MzgsIDB4MkUsIDB4MzgsIDB4REYsCisKKzB4MTgsIDB4MUQsIDB4NDUsIDB4RTksCisweDFFLCAweDE1LCAweDQ1LCAweEU5LAorCisweDJCLCAweDQ5LCAweDUxLCAweEJELAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4NzMsCisKKzB4MzgsIDB4MzgsIDB4NDAsIDB4QUYsCisweDMwLCAweDMwLCAweDQwLCAweEFGLAorCisweDI0LCAweDFGLCAweDI0LCAweERGLAorMHgxRCwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgyQywgMHgxRiwgMHgyQywgMHhERiwKKzB4MUEsIDB4MzMsIDB4MjAsIDB4RTksCisKKzB4QjAsIDB4MTAsCisweDA4LCAweEUzLAorMHg0MCwgMHgxMCwKKzB4QjgsIDB4MTAsCisKKzB4MjYsIDB4RjAsIDB4MzAsIDB4Q0QsCisweDJGLCAweEYwLCAweDM4LCAweENELAorCisweDJCLCAweDgwLCAweDIwLCAweEU5LAorMHgyQSwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHhBNiwgMHgyMCwKKzB4ODgsIDB4RTIsCisweDAwLCAweEUwLAorMHhBRiwgMHgyMCwKKworMHgyOCwgMHgyQSwgMHgyNiwgMHhBRiwKKzB4MjAsIDB4MkEsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4REYsCisweDQ2LCAweDI0LCAweDQ2LCAweERGLAorCisweDI4LCAweDMwLCAweDgwLCAweEJGLAorMHgyMCwgMHgzOCwgMHg4MCwgMHhCRiwKKworMHg0NywgMHgyNCwgMHg0NywgMHhERiwKKzB4NEUsIDB4MkMsIDB4NEUsIDB4REYsCisKKzB4NEYsIDB4MkMsIDB4NEYsIDB4REYsCisweDU2LCAweDM0LCAweDU2LCAweERGLAorCisweDI4LCAweDE1LCAweDI4LCAweERGLAorMHgyMCwgMHgxRCwgMHgyMCwgMHhERiwKKworMHg1NywgMHgzNCwgMHg1NywgMHhERiwKKzB4MDAsIDB4RTAsCisweDFELCAweDA1LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4OSwgMHhFMiwKKzB4MkIsIDB4MzAsCisKKzB4M0YsIDB4QzEsIDB4MUQsIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg2OCwKKzB4QkYsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIwLCAweEMwLCAweDIwLCAweEFGLAorMHgyOCwgMHgwNSwKKzB4OTcsIDB4NzQsCisKKzB4MDAsIDB4RTAsCisweDJBLCAweDEwLAorMHgxNiwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4OEMsIDB4RTIsCisweDk1LCAweDA1LAorCisweDI4LCAweEMxLCAweDI4LCAweEFELAorMHgxRiwgMHhDMSwgMHgxNSwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTgsIDB4NjcsCisweDlGLCAweDZCLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyOCwgMHhDMCwgMHgyOCwgMHhBRCwKKzB4MUQsIDB4MjUsCisweDIwLCAweDA1LAorCisweDI4LCAweDMyLCAweDgwLCAweEFELAorMHg0MCwgMHgyQSwgMHg0MCwgMHhCRCwKKworMHgxQywgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MjAsIDB4MzMsIDB4MjAsIDB4QUQsCisKKzB4MjAsIDB4NzMsCisweDAwLCAweEUwLAorMHhCNiwgMHg0OSwgMHg1MSwgMHhCQiwKKworMHgyNiwgMHgyRiwgMHhCMCwgMHhFOCwKKzB4MTksIDB4MjAsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MjAsIDB4MzUsIDB4REYsCisweDNELCAweDIwLCAweDNELCAweERGLAorCisweDE1LCAweDIwLCAweDE1LCAweERGLAorMHgxRCwgMHgyMCwgMHgxRCwgMHhERiwKKworMHgyNiwgMHhEMCwgMHgyNiwgMHhDRCwKKzB4MjksIDB4NDksIDB4MkEsIDB4QjgsCisKKzB4MjYsIDB4NDAsIDB4ODAsIDB4QkQsCisweDNCLCAweDQ4LCAweDUwLCAweEJELAorCisweDNFLCAweDU0LCAweDU3LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4ODIsIDB4RTEsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI2LCAweDMwLAorMHgyOSwgMHgzMCwKKzB4NDgsIDB4M0MsIDB4NDgsIDB4QUQsCisKKzB4MkIsIDB4NzIsCisweEMyLCAweEUxLAorMHgyQywgMHhDMCwgMHg0NCwgMHhDMiwKKworMHgwNSwgMHgyNCwgMHgzNCwgMHhCRiwKKzB4MEQsIDB4MjQsIDB4MkMsIDB4QkYsCisKKzB4MkQsIDB4NDYsIDB4NEUsIDB4QkYsCisweDI1LCAweDQ2LCAweDU2LCAweEJGLAorCisweDIwLCAweDFELCAweDZGLCAweDhGLAorMHgzMiwgMHgzRSwgMHg1RiwgMHhFOSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDMwLAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgzMywgMHgxRSwgMHg1RiwgMHhFOSwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjIsCisKKzB4MTksIDB4QzAsIDB4QjAsIDB4RTgsCisweDM0LCAweEMwLCAweDQ0LCAweEM0LAorCisweDMzLCAweDczLAorMHgwMCwgMHhFMCwKKzB4M0UsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKworMHg4NCwgMHgzRSwgMHg1OCwgMHhFOSwKKzB4MjgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MDUsIDB4MjAsCisweDAwLCAweEUwLAorMHg4NSwgMHgxRSwgMHg1OCwgMHhFOSwKKworMHg5QiwgMHgzQiwgMHgzMywgMHhERiwKKzB4MjAsIDB4MjAsIDB4NDIsIDB4QUYsCisKKzB4MzAsIDB4NDIsIDB4NTYsIDB4OUYsCisweDgwLCAweDNFLCAweDU3LCAweEU5LAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzMCwgMHg4MCwgMHg1RiwgMHhFOSwKKworMHgyOCwgMHgyOCwgMHgyNCwgMHhBRiwKKzB4ODEsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MDUsIDB4NDcsIDB4NTcsIDB4QkYsCisweDBELCAweDQ3LCAweDRGLCAweEJGLAorCisweDg4LCAweDgwLCAweDU4LCAweEU5LAorMHgxQiwgMHgyOSwgMHgxQiwgMHhERiwKKworMHgzMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4M0EsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MUMsIDB4MzAsIDB4MjYsIDB4REYsCisweDA5LCAweEUzLAorMHgzQiwgMHgwNSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4M0IsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDAwLCAweEUwLAorMHhBQywgMHgyMCwKKworMHgyRCwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MkMsIDB4MUMsIDB4QzAsIDB4QUYsCisKKzB4MjUsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAwLCAweEUwLAorMHhDOCwgMHgzMCwKKworMHgzMCwgMHg0NiwgMHgzMCwgMHhBRiwKKzB4MUIsIDB4MUIsIDB4NDgsIDB4QUYsCisKKzB4MDAsIDB4RTAsCisweDI1LCAweDIwLAorMHgzOCwgMHgyQywgMHg0RiwgMHhFOSwKKworMHg4NiwgMHg4MCwgMHg1NywgMHhFOSwKKzB4MzgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MjgsIDB4NzQsCisweDAwLCAweEUwLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMCwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MkQsIDB4MjAsCisweDlCLCAweDEwLAorCisweDgyLCAweDNFLCAweDU3LCAweEU5LAorMHgzMiwgMHhGMCwgMHgxQiwgMHhDRCwKKworMHgxRSwgMHhCRCwgMHg1OSwgMHg5RiwKKzB4ODMsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4NDcsIDB4MzgsIDB4QUYsCisweDM0LCAweDIwLAorMHgyQSwgMHgzMCwKKworMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisweDMyLCAweDIwLAorMHgwNSwgMHgyMCwKKworMHg4NywgMHg4MCwgMHg1NywgMHhFOSwKKzB4MUYsIDB4NTQsIDB4NTcsIDB4OUYsCisKKzB4MTcsIDB4NDIsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHg2QSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzcsIDB4MUUsIDB4NEYsIDB4RTksCisKKzB4MzcsIDB4MzIsIDB4MkEsIDB4QUYsCisweDAwLCAweEUwLAorMHgzMiwgMHgwMCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjcsIDB4QzAsIDB4NDQsIDB4QzAsCisKKzB4MzYsIDB4MUYsIDB4NEYsIDB4RTksCisweDFGLCAweDFGLCAweDI2LCAweERGLAorCisweDM3LCAweDFCLCAweDM3LCAweEJGLAorMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKworMHgzRSwgMHgxNywgMHg0RiwgMHhFOSwKKzB4M0YsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4QUYsCisweDJCLCAweDA1LAorMHhBNywgMHgyMCwKKworMHgzMywgMHgyQiwgMHgzNywgMHhERiwKKzB4MjcsIDB4MTcsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDJELCAweDIxLCAweDFBLCAweEIwLAorMHgyNSwgMHgyMSwgMHgzMSwgMHhCMCwKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCMiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjIsCisKKzB4MDMsIDB4ODAsIDB4MkEsIDB4RUEsCisweDE3LCAweEMxLCAweDJCLCAweEJELAorCisweDJELCAweDIwLAorMHgyNSwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDBELCAweDIwLAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDJGLCAweEMwLCAweDIxLCAweEMwLAorCisweDE2LCAweDQyLCAweDU2LCAweDlGLAorMHgzQywgMHgyNywgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg2MiwgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjQsCisweDJELCAweDIxLCAweDFBLCAweEI0LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDE5LCAweDYwLCAweEVDLAorCisweDBELCAweDQ0LCAweDRDLCAweEI2LAorMHgwNSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgxRSwgMHgyNiwgMHgxRSwgMHhERiwKKworMHhBNywgMHgxRSwgMHg0RiwgMHhFOSwKKzB4MTcsIDB4MjYsIDB4MTYsIDB4REYsCisKKzB4MkQsIDB4MjAsCisweDAwLCAweEUwLAorMHhBOCwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxRSwgMHhBRiwKKzB4MjUsIDB4MjAsCisweDAwLCAweEUwLAorCisweEE0LCAweDE2LCAweDRGLCAweEU5LAorMHgwRiwgMHhDMCwgMHgyMSwgMHhDMiwKKworMHhBNiwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4MEQsIDB4MjAsCisweDA1LCAweDIwLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBGLCAweDIwLAorCisweDE3LCAweDUwLCAweDU2LCAweDlGLAorMHhBNSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgwNiwgMHhDMCwgMHgyMSwgMHhDNCwKKzB4MEYsIDB4MTcsIDB4MEYsIDB4QUYsCisKKzB4MzcsIDB4MEYsIDB4NUMsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDJGLCAweEMwLCAweDQ0LCAweEM2LAorMHhBMywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHg5RCwgMHgxNywgMHg0RiwgMHhFOSwKKworMHhBMSwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4QTIsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDAwLCAweEUwLAorMHhBRiwgMHgyMCwKKworMHg5RSwgMHgzNywgMHg0RiwgMHhFOSwKKzB4MkYsIDB4MTcsIDB4MkYsIDB4QUYsCisKKzB4QTAsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg5QywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NjgsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY3LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDY1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDYyLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzYWZbXSA9IHsKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4OTQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg4MCwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjAsCisweDI1LCAweDIxLCAweDMxLCAweEIwLAorCisweDBELCAweDIxLCAweDFBLCAweEIyLAorMHgwNSwgMHgyMSwgMHgzMSwgMHhCMiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MkQsIDB4MjAsCisweDI1LCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MEQsIDB4MjAsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzAsCisKKzB4MTYsIDB4NDIsIDB4NTYsIDB4OUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFFLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHgyMSwgMHgzMSwgMHhCNCwKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjQsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDFFLCAweDI2LCAweDFFLCAweERGLAorCisweEE3LCAweDFFLCAweDRGLCAweEU5LAorMHgxNywgMHgyNiwgMHgxNiwgMHhERiwKKworMHgyRCwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEE4LCAweDNGLCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDFFLCAweEFGLAorMHgyNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisKKzB4QTQsIDB4MTYsIDB4NEYsIDB4RTksCisweDBGLCAweEMwLCAweDIxLCAweEMyLAorCisweEE2LCAweDgwLCAweDRGLCAweEU5LAorMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweDJELCAweDQ0LCAweDRDLCAweEI2LAorMHgyNSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBGLCAweDIwLAorCisweDJELCAweDIwLAorMHgyNSwgMHgyMCwKKzB4MDcsIDB4QzAsIDB4NDQsIDB4QzYsCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweEE1LCAweDM3LCAweDRGLCAweEU5LAorCisweDA2LCAweEMwLCAweDIxLCAweEM0LAorMHgwRiwgMHgxNywgMHgwRiwgMHhBRiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUUsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDNFLCAweDNELCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MDcsIDB4MjAsCisKKzB4MkYsIDB4MjAsCisweDAwLCAweEUwLAorMHhBMywgMHgwRiwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHhBMSwgMHgxRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHgyNiwgMHgxRSwgMHhERiwKKzB4OUQsIDB4MUUsIDB4NEYsIDB4RTksCisKKzB4MzUsIDB4MTcsIDB4NEYsIDB4RTksCisweEEyLCAweDNGLCAweDRGLCAweEU5LAorCisweDA2LCAweDA2LCAweDFGLCAweEFGLAorMHgzOSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxNywgMHhBRiwKKzB4MDcsIDB4MDcsIDB4MUUsIDB4QUYsCisKKzB4QTAsIDB4ODAsIDB4NEYsIDB4RTksCisweDlFLCAweDNFLCAweDRGLCAweEU5LAorCisweDMxLCAweDgwLCAweDRGLCAweEU5LAorMHg5QywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NjMsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDYyLCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDYwLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDVELCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4OEYsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg3QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjAsCisweDI1LCAweDIxLCAweDMxLCAweEIwLAorCisweDBELCAweDIxLCAweDFBLCAweEIyLAorMHgwNSwgMHgyMSwgMHgzMSwgMHhCMiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MkQsIDB4MjAsCisweDI1LCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MEQsIDB4MjAsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzAsCisKKzB4MTYsIDB4NDIsIDB4NTYsIDB4OUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFFLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHgyMSwgMHgzMSwgMHhCNCwKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjQsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDFFLCAweDI2LCAweDFFLCAweERGLAorCisweEE3LCAweDFFLCAweDRGLCAweEU5LAorMHgxNywgMHgyNiwgMHgxNiwgMHhERiwKKworMHgyRCwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEE4LCAweDNGLCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDFFLCAweEFGLAorMHgyNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisKKzB4QTQsIDB4MTYsIDB4NEYsIDB4RTksCisweDBGLCAweEMwLCAweDIxLCAweEMyLAorCisweEE2LCAweDgwLCAweDRGLCAweEU5LAorMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEYsIDB4MjAsCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweEE1LCAweDM3LCAweDRGLCAweEU5LAorCisweDA2LCAweEMwLCAweDIxLCAweEM0LAorMHgwRiwgMHgxNywgMHgwRiwgMHhBRiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkYsIDB4MjAsCisweDAwLCAweEUwLAorMHhBMywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHgzNSwgMHgxNywgMHg0RiwgMHhFOSwKKworMHhBMSwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4QTIsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDM5LCAweDM3LCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDE3LCAweEFGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzEsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg1NywgMHgzOSwgMHgyMCwgMHhFOSwKKworMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorCisweDFDLCAweDIzLCAweDIwLCAweEU5LAorMHg1NywgMHgzNiwgMHgyMCwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDkwLCAweEUyLAorMHgwMCwgMHhFMCwKKworMHg2OCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MTksIDB4QzgsIDB4QzEsIDB4Q0QsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDlGLCAweDQxLCAweDQ5LCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MkQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MEQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjUsIDB4MzAsCisweDJELCAweDMwLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweEE3LCAweDVCLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjcsIDB4RkYsIDB4MEEsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM5LCAweDQxLCAweEM4LCAweEVDLAorMHg0MiwgMHhFMSwKKzB4MDAsIDB4RTAsCisKKzB4NjUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOCwgMHg0MCwgMHhDMCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NzgsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg2OSwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyNSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDFBLCAweDQ0LCAweDY0LCAweEI0LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4OUYsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QkUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg3RCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdDJnemFbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4N0MsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg2RCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyOSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDBGLCAweENGLCAweDc0LCAweEM2LAorMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDBGLCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEI0LAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5QiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCQSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDc5LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6YWZbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4ODEsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg3MiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDU0LCAweEIwLAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyRSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDBGLCAweENGLCAweDc0LCAweEM2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDBGLCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEI0LAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDNELCAweENGLCAweDc1LCAweEM2LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDU1LCAweEI2LAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCNiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM4LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5NiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCNSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDc0LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6ZltdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg3RCwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDZFLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEIwLAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCMCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjIsCisKKzB4MjgsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDMxLCAweDBGLCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEI0LAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCNiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5QSwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCQiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDc4LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6c1tdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg4NSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDc2LCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHgwRiwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzgsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgzMSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDBGLCAweENGLCAweDc1LCAweEMwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzUsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE2LCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjQsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjAsCisweDAyLCAweDQ1LCAweDY1LCAweEIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTAsIDB4MzcsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgyQSwgMHg0NiwgMHg1NiwgMHhCRiwKKzB4MUEsIDB4NDYsIDB4NjYsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4QTEsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweEEyLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4OTIsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QjIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg3MCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdDJnenNhW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDhBLCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4N0IsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDBGLCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDM2LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI0LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDBGLCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI2LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg4RCwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhBRCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDZCLCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6c2FmW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDhFLCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4N0YsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDBGLCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDNBLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI0LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDBGLCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI2LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDU1LCAweEI2LAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCNiwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg1MywgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NjMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0OCwgMHg1OCwgMHhCRiwKKzB4MDIsIDB4NDgsIDB4NjgsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgyQSwgMHg0OSwgMHg1OSwgMHhCRiwKKzB4MUEsIDB4NDksIDB4NjksIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4QkYsIDB4RUEsCisKKzB4ODAsIDB4MzAsIDB4NTcsIDB4RTksCisweDgxLCAweDM4LCAweDU3LCAweEU5LAorCisweDgyLCAweDMxLCAweDU3LCAweEU5LAorMHg4NiwgMHg3OCwgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOSwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzksIDB4NTcsIDB4RTksCisKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisweDhBLCAweDM0LCAweDIwLCAweEU5LAorCisweDhCLCAweDNDLCAweDIwLCAweEU5LAorMHgzNywgMHg1MCwgMHg2MCwgMHhCRCwKKworMHg1NywgMHgwRCwgMHgyMCwgMHhFOSwKKzB4MzUsIDB4NTEsIDB4NjEsIDB4QkQsCisKKzB4MkIsIDB4NTAsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MEUsIDB4NzcsCisKKzB4MjQsIDB4NTEsIDB4MjAsIDB4RTksCisweDg5LCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDBFLCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgwQiwgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTYsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjYsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ3LCAweEEwLCAweEU4LAorCisweDFDLCAweDU3LCAweEEwLCAweEU4LAorMHgyQywgMHg2NywgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NTcsIDB4ODAsIDB4NTcsIDB4Q0YsCisKKzB4NjYsIDB4MzMsIDB4NjYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg2NywgMHgzQiwgMHg2NywgMHhDRiwKKworMHgwQiwgMHg0OCwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTgsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjgsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ5LCAweEEwLCAweEU4LAorCisweDFDLCAweDU5LCAweEEwLCAweEU4LAorMHgyQywgMHg2OSwgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzQsIDB4RDcsIDB4MzQsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNDLCAweEQ3LCAweDNDLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzQsIDB4ODAsIDB4MzQsIDB4QkQsCisweDNDLCAweDgwLCAweDNDLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0OCwgMHg4MCwgMHg0OCwgMHhDRiwKKzB4NTksIDB4ODAsIDB4NTksIDB4Q0YsCisKKzB4NjgsIDB4MzMsIDB4NjgsIDB4Q0YsCisweDQ5LCAweDNCLCAweDQ5LCAweENGLAorCisweEE5LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OCwgMHgzMywgMHg1OCwgMHhDRiwKKzB4NjksIDB4M0IsIDB4NjksIDB4Q0YsCisKKzB4NjcsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pzZltdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg4QSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDdCLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHgwRiwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzgsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgzNiwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDBGLCAweENGLCAweDc1LCAweEMwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzUsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE2LCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjQsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjAsCisweDAyLCAweDQ1LCAweDY1LCAweEIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTAsIDB4MzcsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDUsIDB4NTUsIDB4QjIsCisweDFBLCAweDQ1LCAweDY1LCAweEIyLAorCisweDBBLCAweDQ1LCAweDU1LCAweEI0LAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCNCwKKworMHgwRiwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEE3LCAweDMwLCAweDRGLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDMxLCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBOCwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCNiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM2LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzNywgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTEsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEyLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzUsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM5LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4OEQsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QUQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg2QiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6W10gPSB7CisKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjIsIDB4NDAsIDB4NDgsIDB4QkYsCisweDJBLCAweDQwLCAweDUwLCAweEJGLAorCisweDMyLCAweDQxLCAweDQ5LCAweEJGLAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4Q0IsIDB4NkIsCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDRCLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDI5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NDksIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDUxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg0OSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzksIDB4NTcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDU4LCAweDgwLCAweDE1LCAweEVBLAorMHgwOCwgMHgwNCwKKzB4MTAsIDB4MDQsCisKKzB4NTEsIDB4NDksIDB4QzAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NEEsIDB4QkYsCisweDI3LCAweDRBLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDUyLCAweEJGLAorMHgxRSwgMHg0OSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MjYsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NDgsIDB4QkQsCisweDIyLCAweDQwLCAweDUwLCAweEJELAorCisweDEyLCAweDQxLCAweDQ5LCAweEJELAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgyNiwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg0RSwgMHgzMSwgMHg0RSwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDRGLCAweDM5LCAweDRGLCAweEJGLAorMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKworMHg0QSwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4NDIsIDB4NzMsIDB4RjgsIDB4RUMsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweEE1LCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg0QiwgMHg0QiwgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgyNiwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDUzLCAweDUzLCAweDJELCAweERGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKzB4MDAsIDB4RTAsCisweDU5LCAweEUzLAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4M0YsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NDgsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDQ4LCAweDNDLCAweEU5LAorCisweDFGLCAweDI3LCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU2LCAweDNELCAweDU2LCAweERGLAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg0RSwgMHgzRiwgMHg0RSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NEYsIDB4M0YsIDB4NEYsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0QsIDB4NTcsIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgxRCwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDFBLCAweDQ0LCAweDU0LCAweEI0LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweEFGLCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweEQ2LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OUQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnemFbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NUMsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDRFLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyNywgMHhDRiwgMHg3NCwgMHhDNiwKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgyMCwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDAyLCAweDQ0LCAweDU0LCAweEI0LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI2LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzgsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHhBQiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhEMywgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDk5LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3phZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2MSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NTMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MjYsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyNywgMHhDRiwgMHg3NCwgMHhDNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5QywgMHgyNywgMHgyMCwgMHhFOSwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjQsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjYsCisweDFBLCAweDQ0LCAweDU0LCAweEI2LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCNiwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHgzRCwgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgwQSwgMHg0NywgMHg0RiwgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NTcsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzUsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM5LCAweDM4LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweEE2LCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweENELCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OTQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnemZbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NUQsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDRGLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDRDLCAweEIwLAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCMCwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MjAsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDMxLCAweDI3LCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDRDLCAweEI0LAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCNiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4QUEsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4RDMsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg5OCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6c1tdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2NSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NTcsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDI5LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDRELCAweEIyLAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjQsCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4QTIsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4Q0EsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg5MCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6c2FbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NkEsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDVDLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0QsIDB4NTcsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHgyNywgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzgsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgyRSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDI3LCAweENGLCAweDc1LCAweEMwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzUsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE2LCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjQsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjAsCisweDAyLCAweDQ1LCAweDU1LCAweEIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTAsIDB4MzcsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDUsIDB4NEQsIDB4QjIsCisweDFBLCAweDQ1LCAweDU1LCAweEIyLAorCisweDBBLCAweDQ1LCAweDRELCAweEI0LAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCNCwKKworMHgyNywgMHhDRiwgMHg3NCwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEE3LCAweDMwLCAweDRGLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBOCwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM2LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzNywgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTEsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEyLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweDlELCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweEM1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OEIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnenNhZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2RSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NjAsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDMyLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjQsCisweDAyLCAweDQ1LCAweDU1LCAweEI0LAorCisweDI3LCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI2LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDRELCAweEI2LAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCNiwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHg5OSwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhDMSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDg3LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3pzZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2QSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NUMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDJFLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjQsCisweDAyLCAweDQ1LCAweDU1LCAweEI0LAorCisweDI3LCAweENGLCAweDc1LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzEsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDRELCAweEI2LAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4OUQsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4QzUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg4QiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2Ffd2FycC5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffd2FycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2EwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV93YXJwLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIG1nYV93YXJwLmMgLS0gTWF0cm94IEcyMDAvRzQwMCBXQVJQIGVuZ2luZSBtYW5hZ2VtZW50IC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVGh1IEphbiAxMSAyMToyOTozMiAyMDAxIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisjaW5jbHVkZSAibWdhX3Vjb2RlLmgiCisKKworI2RlZmluZSBNR0FfV0FSUF9DT0RFX0FMSUdOCQkyNTYJCS8qIGluIGJ5dGVzICovCisKKyNkZWZpbmUgV0FSUF9VQ09ERV9TSVpFKCB3aGljaCApCQkJCQlcCisJKChzaXplb2Yod2hpY2gpIC8gTUdBX1dBUlBfQ09ERV9BTElHTiArIDEpICogTUdBX1dBUlBfQ09ERV9BTElHTikKKworI2RlZmluZSBXQVJQX1VDT0RFX0lOU1RBTEwoIHdoaWNoLCB3aGVyZSApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJRFJNX0RFQlVHKCAiIHBjYmFzZSA9IDB4JTA4bHggIHZjYmFzZSA9ICVwXG4iLCBwY2Jhc2UsIHZjYmFzZSApO1wKKwlkZXZfcHJpdi0+d2FycF9waXBlX3BoeXNbd2hlcmVdID0gcGNiYXNlOwkJCVwKKwltZW1jcHkoIHZjYmFzZSwgd2hpY2gsIHNpemVvZih3aGljaCkgKTsJCQkJXAorCXBjYmFzZSArPSBXQVJQX1VDT0RFX1NJWkUoIHdoaWNoICk7CQkJCVwKKwl2Y2Jhc2UgKz0gV0FSUF9VQ09ERV9TSVpFKCB3aGljaCApOwkJCQlcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWdhX3dhcnBfZzQwMF9taWNyb2NvZGVfc2l6ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNpemUgPSAoIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RneiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemEgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3phZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdGd6c2EgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzYWYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3ogKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6YSApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3phZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3pmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnenMgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2EgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2FmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnenNmICkgKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKCBzaXplICk7CisKKwlEUk1fREVCVUcoICJHNDAwIHVjb2RlIHNpemUgPSAlZCBieXRlc1xuIiwgc2l6ZSApOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzaXplID0gKCBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3ogKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3phICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6YWYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3pmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6cyApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nMjAwX3RnenNhICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2FmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2YgKSApOworCisJc2l6ZSA9IFBBR0VfQUxJR04oIHNpemUgKTsKKworCURSTV9ERUJVRyggIkcyMDAgdWNvZGUgc2l6ZSA9ICVkIGJ5dGVzXG4iLCBzaXplICk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgbWdhX3dhcnBfaW5zdGFsbF9nNDAwX21pY3JvY29kZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1bnNpZ25lZCBjaGFyICp2Y2Jhc2UgPSBkZXZfcHJpdi0+d2FycC0+aGFuZGxlOworCXVuc2lnbmVkIGxvbmcgcGNiYXNlID0gZGV2X3ByaXYtPndhcnAtPm9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNpemUgPSBtZ2Ffd2FycF9nNDAwX21pY3JvY29kZV9zaXplKCBkZXZfcHJpdiApOworCWlmICggc2l6ZSA+IGRldl9wcml2LT53YXJwLT5zaXplICkgeworCQlEUk1fRVJST1IoICJtaWNyb2NvZGUgdG9vIGxhcmdlISAoJXUgPiAlbHUpXG4iLAorCQkJICAgc2l6ZSwgZGV2X3ByaXYtPndhcnAtPnNpemUgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwltZW1zZXQoIGRldl9wcml2LT53YXJwX3BpcGVfcGh5cywgMCwKKwkJc2l6ZW9mKGRldl9wcml2LT53YXJwX3BpcGVfcGh5cykgKTsKKworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3RneiwJTUdBX1dBUlBfVEdaICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6ZiwJTUdBX1dBUlBfVEdaRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3RnemEsCU1HQV9XQVJQX1RHWkEgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3phZiwJTUdBX1dBUlBfVEdaQUYgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3pzLAlNR0FfV0FSUF9UR1pTICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6c2YsCU1HQV9XQVJQX1RHWlNGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6c2EsCU1HQV9XQVJQX1RHWlNBICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6c2FmLAlNR0FfV0FSUF9UR1pTQUYgKTsKKworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3osCU1HQV9XQVJQX1QyR1ogKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6ZiwJTUdBX1dBUlBfVDJHWkYgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6YSwJTUdBX1dBUlBfVDJHWkEgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6YWYsCU1HQV9XQVJQX1QyR1pBRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3pzLAlNR0FfV0FSUF9UMkdaUyApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3pzZiwJTUdBX1dBUlBfVDJHWlNGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdDJnenNhLAlNR0FfV0FSUF9UMkdaU0EgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6c2FmLAlNR0FfV0FSUF9UMkdaU0FGICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2Ffd2FycF9pbnN0YWxsX2cyMDBfbWljcm9jb2RlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXVuc2lnbmVkIGNoYXIgKnZjYmFzZSA9IGRldl9wcml2LT53YXJwLT5oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBwY2Jhc2UgPSBkZXZfcHJpdi0+d2FycC0+b2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCisJc2l6ZSA9IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUoIGRldl9wcml2ICk7CisJaWYgKCBzaXplID4gZGV2X3ByaXYtPndhcnAtPnNpemUgKSB7CisJCURSTV9FUlJPUiggIm1pY3JvY29kZSB0b28gbGFyZ2UhICgldSA+ICVsdSlcbiIsCisJCQkgICBzaXplLCBkZXZfcHJpdi0+d2FycC0+c2l6ZSApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCW1lbXNldCggZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzLCAwLAorCQlzaXplb2YoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzKSApOworCisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6LAlNR0FfV0FSUF9UR1ogKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pmLAlNR0FfV0FSUF9UR1pGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6YSwJTUdBX1dBUlBfVEdaQSApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnemFmLAlNR0FfV0FSUF9UR1pBRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnenMsCU1HQV9XQVJQX1RHWlMgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzZiwJTUdBX1dBUlBfVEdaU0YgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzYSwJTUdBX1dBUlBfVEdaU0EgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzYWYsCU1HQV9XQVJQX1RHWlNBRiApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZSgJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlzd2l0Y2ggKCBkZXZfcHJpdi0+Y2hpcHNldCApIHsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzQwMDoKKwkJcmV0dXJuIG1nYV93YXJwX2luc3RhbGxfZzQwMF9taWNyb2NvZGUoIGRldl9wcml2ICk7CisJY2FzZSBNR0FfQ0FSRF9UWVBFX0cyMDA6CisJCXJldHVybiBtZ2Ffd2FycF9pbnN0YWxsX2cyMDBfbWljcm9jb2RlKCBkZXZfcHJpdiApOworCWRlZmF1bHQ6CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorfQorCisjZGVmaW5lIFdNSVNDX0VYUEVDVEVECQkoTUdBX1dVQ09ERUNBQ0hFX0VOQUJMRSB8IE1HQV9XTUFTVEVSX0VOQUJMRSkKKworaW50IG1nYV93YXJwX2luaXQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHdtaXNjOworCisJLyogRklYTUU6IEdldCByaWQgb2YgdGhlc2UgZGFtbmVkIG1hZ2ljIG51bWJlcnMuLi4KKwkgKi8KKwlzd2l0Y2ggKCBkZXZfcHJpdi0+Y2hpcHNldCApIHsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzQwMDoKKwkJTUdBX1dSSVRFKCBNR0FfV0lBRERSMiwgTUdBX1dNT0RFX1NVU1BFTkQgKTsKKwkJTUdBX1dSSVRFKCBNR0FfV0dFVE1TQiwgMHgwMDAwMEUwMCApOworCQlNR0FfV1JJVEUoIE1HQV9XVlJUWFNaLCAweDAwMDAxODA3ICk7CisJCU1HQV9XUklURSggTUdBX1dBQ0NFUFRTRVEsIDB4MTgwMDAwMDAgKTsKKwkJYnJlYWs7CisJY2FzZSBNR0FfQ0FSRF9UWVBFX0cyMDA6CisJCU1HQV9XUklURSggTUdBX1dJQUREUiwgTUdBX1dNT0RFX1NVU1BFTkQgKTsKKwkJTUdBX1dSSVRFKCBNR0FfV0dFVE1TQiwgMHgxNjA2ICk7CisJCU1HQV9XUklURSggTUdBX1dWUlRYU1osIDcgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlNR0FfV1JJVEUoIE1HQV9XTUlTQywgKE1HQV9XVUNPREVDQUNIRV9FTkFCTEUgfAorCQkJICAgICAgIE1HQV9XTUFTVEVSX0VOQUJMRSB8CisJCQkgICAgICAgTUdBX1dDQUNIRUZMVVNIX0VOQUJMRSkgKTsKKwl3bWlzYyA9IE1HQV9SRUFEKCBNR0FfV01JU0MgKTsKKwlpZiAoIHdtaXNjICE9IFdNSVNDX0VYUEVDVEVEICkgeworCQlEUk1fRVJST1IoICJXQVJQIGVuZ2luZSBjb25maWcgZmFpbGVkISAweCV4ICE9IDB4JXhcbiIsCisJCQkgICB3bWlzYywgV01JU0NfRVhQRUNURUQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVkOGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCkBAIC0wLDAgKzEsOTQzIEBACisvKiByMTI4X2NjZS5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBXZWQgQXByICA1IDE5OjI0OjE5IDIwMDAgYnkga2V2aW5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKyNpbmNsdWRlICJyMTI4X2Rydi5oIgorCisjZGVmaW5lIFIxMjhfRklGT19ERUJVRwkJMAorCisvKiBDQ0UgbWljcm9jb2RlIChmcm9tIEFUSSkgKi8KK3N0YXRpYyB1MzIgcjEyOF9jY2VfbWljcm9jb2RlW10gPSB7CisJMCwgMjc2ODM4NDAwLCAwLCAyNjg0NDk3OTIsIDIsIDE0MiwgMiwgMTQ1LCAwLCAxMDc2NzY1NzMxLCAwLAorCTE2MTcwMzk5NTEsIDAsIDc3NDU5Mjg3NywgMCwgMTk4NzU0MDI4NiwgMCwgMjMwNzQ5MDk0NlUsIDAsCisJNTk5NTU4OTI1LCAwLCA1ODk1MDUzMTUsIDAsIDU5NjQ4NzA5MiwgMCwgNTg5NTA1MzE1LCAxLAorCTExNTQ0NTc2LCAxLCAyMDY4NDgsIDEsIDMxMTI5NiwgMSwgMTk4NjU2LCAyLCA5MTIyNzM0MjIsIDExLAorCTI2MjE0NCwgMCwgMCwgMSwgMzM1NTk4MzcsIDEsIDc0MzgsIDEsIDE0ODA5LCAxLCA2NjE1LCAxMiwgMjgsCisJMSwgNjYxNCwgMTIsIDI4LCAyLCAyMywgMTEsIDE4ODc0MzY4LCAwLCAxNjc5MDkyMiwgMSwgNDA5NjAwLCA5LAorCTMwLCAxLCAxNDc4NTQ3NzIsIDE2LCA0MjA0ODMwNzIsIDMsIDgxOTIsIDAsIDEwMjQwLCAxLCAxOTg2NTYsCisJMSwgMTU2MzAsIDEsIDUxMjAwLCAxMCwgMzQ4NTgsIDksIDQyLCAxLCAzMzU1OTgyMywgMiwgMTAyNzYsIDEsCisJMTU3MTcsIDEsIDE1NzE4LCAyLCA0MywgMSwgMTU5MzY5NDgsIDEsIDU3MDQ4MDgzMSwgMSwgMTQ3MTUwNzEsCisJMTIsIDMyMjEyMzgzMSwgMSwgMzM5NTMxMjUsIDEyLCA1NSwgMSwgMzM1NTk5MDgsIDEsIDE1NzE4LCAyLAorCTQ2LCA0LCAyMDk5MjU4LCAxLCA1MjYzMzYsIDEsIDQ0MjYyMywgNCwgNDE5NDM2NSwgMSwgNTA5OTUyLCAxLAorCTQ1OTAwNywgMywgMCwgMTIsIDkyLCAyLCA0NiwgMTIsIDE3NiwgMSwgMTU3MzQsIDEsIDIwNjg0OCwgMSwKKwkxODQzMiwgMSwgMTMzMTIwLCAxLCAxMDA2NzA3MzQsIDEsIDE0OTUwNCwgMSwgMTY1ODg4LCAxLAorCTE1OTc1OTI4LCAxLCAxMDQ4NTc2LCA2LCAzMTQ1ODA2LCAxLCAxNTcxNSwgMTYsIDIxNTA2NDUyMzJVLCAyLAorCTI2ODQ0OTg1OSwgMiwgMTAzMDcsIDEyLCAxNzYsIDEsIDE1NzM0LCAxLCAxNTczNSwgMSwgMTU2MzAsIDEsCisJMTU2MzEsIDEsIDUyNTMxMjAsIDYsIDMxNDU4MTAsIDE2LCAyMTUwNjQ1MjMyVSwgMSwgMTU4NjQsIDIsIDgyLAorCTEsIDM0MzMxMCwgMSwgMTA2NDIwNywgMiwgMzE0NTgxMywgMSwgMTU3MjgsIDEsIDc4MTcsIDEsIDE1NzI5LAorCTMsIDE1NzMwLCAxMiwgOTIsIDIsIDk4LCAxLCAxNjE2OCwgMSwgMTYxNjcsIDEsIDE2MDAyLCAxLCAxNjAwOCwKKwkxLCAxNTk3NCwgMSwgMTU5NzUsIDEsIDE1OTkwLCAxLCAxNTk3NiwgMSwgMTU5NzcsIDEsIDE1OTgwLCAwLAorCTE1OTgxLCAxLCAxMDI0MCwgMSwgNTI1MzEyMCwgMSwgMTU3MjAsIDEsIDE5ODY1NiwgNiwgMTEwLCAxLAorCTE4MDIyNCwgMSwgMTAzODI0NzM4LCAyLCAxMTIsIDIsIDMxNDU4MzksIDAsIDUzNjg4NTQ0MCwgMSwKKwkxMTQ4ODAsIDE0LCAxMjUsIDEyLCAyMDY5NzUsIDEsIDMzNTU5OTk1LCAxMiwgMTk4Nzg0LCAwLAorCTMzNTcwMjM2LCAxLCAxNTgwMywgMCwgMTU4MDQsIDMsIDI5NDkxMiwgMSwgMjk0OTEyLCAzLCA0NDIzNzAsCisJMSwgMTE1NDQ1NzYsIDAsIDgxMTYxMjE2MCwgMSwgMTI1OTMxNTIsIDEsIDExNTM2Mzg0LCAxLAorCTE0MDI0NzA0LCA3LCAzMTAzODI3MjYsIDAsIDEwMjQwLCAxLCAxNDc5NiwgMSwgMTQ3OTcsIDEsIDE0NzkzLAorCTEsIDE0Nzk0LCAwLCAxNDc5NSwgMSwgMjY4Njc5MTY4LCAxLCA5NDM3MTg0LCAxLCAyNjg0NDk3OTIsIDEsCisJMTk4NjU2LCAxLCA5NDUyODI3LCAxLCAxMDc1ODU0NjAyLCAxLCAxMDc1ODU0NjAzLCAxLCA1NTcwNTYsIDEsCisJMTE0ODgwLCAxNCwgMTU5LCAxMiwgMTk4Nzg0LCAxLCAxMTA5NDA5MjEzLCAxMiwgMTk4NzgzLCAxLAorCTExMDczMTIwNTksIDEyLCAxOTg3ODQsIDEsIDExMDk0MDkyMTIsIDIsIDE2MiwgMSwgMTA3NTg1NDc4MSwgMSwKKwkxMDczNzU3NjI3LCAxLCAxMDc1ODU0NzgwLCAxLCA1NDA2NzIsIDEsIDEwNDg1NzYwLCA2LCAzMTQ1ODk0LAorCTE2LCAyNzQ3NDEyNDgsIDksIDE2OCwgMywgNDE5NDMwNCwgMywgNDIwOTk0OSwgMCwgMCwgMCwgMjU2LCAxNCwKKwkxNzQsIDEsIDExNDg1NywgMSwgMzM1NjAwMDcsIDEyLCAxNzYsIDAsIDEwMjQwLCAxLCAxMTQ4NTgsIDEsCisJMzM1NjAwMTgsIDEsIDExNDg1NywgMywgMzM1NjAwMDcsIDEsIDE2MDA4LCAxLCAxMTQ4NzQsIDEsCisJMzM1NjAzNjAsIDEsIDExNDg3NSwgMSwgMzM1NjAxNTQsIDAsIDE1OTYzLCAwLCAyNTYsIDAsIDQwOTYsIDEsCisJNDA5NjExLCA5LCAxODgsIDAsIDEwMjQwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgaW50IFIxMjhfUkVBRF9QTEwoZHJtX2RldmljZV90ICpkZXYsIGludCBhZGRyKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJUjEyOF9XUklURTgoUjEyOF9DTE9DS19DTlRMX0lOREVYLCBhZGRyICYgMHgxZik7CisJcmV0dXJuIFIxMjhfUkVBRChSMTI4X0NMT0NLX0NOVExfREFUQSk7Cit9CisKKyNpZiBSMTI4X0ZJRk9fREVCVUcKK3N0YXRpYyB2b2lkIHIxMjhfc3RhdHVzKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlwcmludGsoICJHVUlfU1RBVCAgICAgICAgICAgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X0dVSV9TVEFUICkgKTsKKwlwcmludGsoICJQTTRfU1RBVCAgICAgICAgICAgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X1BNNF9TVEFUICkgKTsKKwlwcmludGsoICJQTTRfQlVGRkVSX0RMX1dQVFIgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiApICk7CisJcHJpbnRrKCAiUE00X0JVRkZFUl9ETF9SUFRSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIgKSApOworCXByaW50ayggIlBNNF9NSUNST19DTlRMICAgICA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfUE00X01JQ1JPX0NOVEwgKSApOworCXByaW50ayggIlBNNF9CVUZGRVJfQ05UTCAgICA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfUE00X0JVRkZFUl9DTlRMICkgKTsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuZ2luZSwgRklGTyBjb250cm9sCisgKi8KKworc3RhdGljIGludCByMTI4X2RvX3BpeGNhY2hlX2ZsdXNoKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgdG1wOworCWludCBpOworCisJdG1wID0gUjEyOF9SRUFEKCBSMTI4X1BDX05HVUlfQ1RMU1RBVCApIHwgUjEyOF9QQ19GTFVTSF9BTEw7CisJUjEyOF9XUklURSggUjEyOF9QQ19OR1VJX0NUTFNUQVQsIHRtcCApOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaWYgKCAhKFIxMjhfUkVBRCggUjEyOF9QQ19OR1VJX0NUTFNUQVQgKSAmIFIxMjhfUENfQlVTWSkgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHIxMjhfZG9fd2FpdF9mb3JfZmlmbyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGVudHJpZXMgKQoreworCWludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaW50IHNsb3RzID0gUjEyOF9SRUFEKCBSMTI4X0dVSV9TVEFUICkgJiBSMTI4X0dVSV9GSUZPQ05UX01BU0s7CisJCWlmICggc2xvdHMgPj0gZW50cmllcyApIHJldHVybiAwOworCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHIxMjhfZG9fd2FpdF9mb3JfaWRsZSggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGksIHJldDsKKworCXJldCA9IHIxMjhfZG9fd2FpdF9mb3JfZmlmbyggZGV2X3ByaXYsIDY0ICk7CisJaWYgKCByZXQgKSByZXR1cm4gcmV0OworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaWYgKCAhKFIxMjhfUkVBRCggUjEyOF9HVUlfU1RBVCApICYgUjEyOF9HVUlfQUNUSVZFKSApIHsKKwkJCXIxMjhfZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENDRSBjb250cm9sLCBpbml0aWFsaXphdGlvbgorICovCisKKy8qIExvYWQgdGhlIG1pY3JvY29kZSBmb3IgdGhlIENDRSAqLworc3RhdGljIHZvaWQgcjEyOF9jY2VfbG9hZF9taWNyb2NvZGUoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWludCBpOworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyMTI4X2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9NSUNST0NPREVfQUREUiwgMCApOworCWZvciAoIGkgPSAwIDsgaSA8IDI1NiA7IGkrKyApIHsKKwkJUjEyOF9XUklURSggUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFILAorCQkJICAgIHIxMjhfY2NlX21pY3JvY29kZVtpICogMl0gKTsKKwkJUjEyOF9XUklURSggUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFMLAorCQkJICAgIHIxMjhfY2NlX21pY3JvY29kZVtpICogMiArIDFdICk7CisJfQorfQorCisvKiBGbHVzaCBhbnkgcGVuZGluZyBjb21tYW5kcyB0byB0aGUgQ0NFLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGp1c3QKKyAqIHByaW9yIHRvIGEgd2FpdCBmb3IgaWRsZSwgYXMgaXQgaW5mb3JtcyB0aGUgZW5naW5lIHRoYXQgdGhlIGNvbW1hbmQKKyAqIHN0cmVhbSBpcyBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX2ZsdXNoKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgdG1wOworCisJdG1wID0gUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiApIHwgUjEyOF9QTTRfQlVGRkVSX0RMX0RPTkU7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIHRtcCApOworfQorCisvKiBXYWl0IGZvciB0aGUgQ0NFIHRvIGdvIGlkbGUuCisgKi8KK2ludCByMTI4X2RvX2NjZV9pZGxlKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCWlmICggR0VUX1JJTkdfSEVBRCggZGV2X3ByaXYgKSA9PSBkZXZfcHJpdi0+cmluZy50YWlsICkgeworCQkJaW50IHBtNHN0YXQgPSBSMTI4X1JFQUQoIFIxMjhfUE00X1NUQVQgKTsKKwkJCWlmICggKCAocG00c3RhdCAmIFIxMjhfUE00X0ZJRk9DTlRfTUFTSykgPj0KKwkJCSAgICAgICBkZXZfcHJpdi0+Y2NlX2ZpZm9fc2l6ZSApICYmCisJCQkgICAgICEocG00c3RhdCAmIChSMTI4X1BNNF9CVVNZIHwKKwkJCQkJICBSMTI4X1BNNF9HVUlfQUNUSVZFKSkgKSB7CisJCQkJcmV0dXJuIHIxMjhfZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisJCQl9CisJCX0KKwkJRFJNX1VERUxBWSggMSApOworCX0KKworI2lmIFIxMjhfRklGT19ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlyMTI4X3N0YXR1cyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworLyogU3RhcnQgdGhlIENvbmN1cnJlbnQgQ29tbWFuZCBFbmdpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX3N0YXJ0KCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlyMTI4X2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfQ05UTCwKKwkJICAgIGRldl9wcml2LT5jY2VfbW9kZSB8IGRldl9wcml2LT5yaW5nLnNpemVfbDJxdworCQkgICAgfCBSMTI4X1BNNF9CVUZGRVJfQ05UTF9OT1VQREFURSApOworCVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0FERFIgKTsgLyogYXMgcGVyIHRoZSBzYW1wbGUgY29kZSAqLworCVIxMjhfV1JJVEUoIFIxMjhfUE00X01JQ1JPX0NOVEwsIFIxMjhfUE00X01JQ1JPX0ZSRUVSVU4gKTsKKworCWRldl9wcml2LT5jY2VfcnVubmluZyA9IDE7Cit9CisKKy8qIFJlc2V0IHRoZSBDb25jdXJyZW50IENvbW1hbmQgRW5naW5lLiAgVGhpcyB3aWxsIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICogY29tbWFuZHMsIHNvIHlvdSBtdXN0IHdhaXQgZm9yIHRoZSBDQ0UgY29tbWFuZCBzdHJlYW0gdG8gY29tcGxldGUKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgcjEyOF9kb19jY2VfcmVzZXQoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVIxMjhfV1JJVEUoIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSLCAwICk7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIsIDAgKTsKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gMDsKK30KKworLyogU3RvcCB0aGUgQ29uY3VycmVudCBDb21tYW5kIEVuZ2luZS4gIFRoaXMgd2lsbCBub3QgZmx1c2ggYW55IHBlbmRpbmcKKyAqIGNvbW1hbmRzLCBzbyB5b3UgbXVzdCBmbHVzaCB0aGUgY29tbWFuZCBzdHJlYW0gYW5kIHdhaXQgZm9yIHRoZSBDQ0UKKyAqIHRvIGdvIGlkbGUgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCByMTI4X2RvX2NjZV9zdG9wKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9NSUNST19DTlRMLCAwICk7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0NOVEwsCisJCSAgICBSMTI4X1BNNF9OT05QTTQgfCBSMTI4X1BNNF9CVUZGRVJfQ05UTF9OT1VQREFURSApOworCisJZGV2X3ByaXYtPmNjZV9ydW5uaW5nID0gMDsKK30KKworLyogUmVzZXQgdGhlIGVuZ2luZS4gIFRoaXMgd2lsbCBzdG9wIHRoZSBDQ0UgaWYgaXQgaXMgcnVubmluZy4KKyAqLworc3RhdGljIGludCByMTI4X2RvX2VuZ2luZV9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBjbG9ja19jbnRsX2luZGV4LCBtY2xrX2NudGwsIGdlbl9yZXNldF9jbnRsOworCisJcjEyOF9kb19waXhjYWNoZV9mbHVzaCggZGV2X3ByaXYgKTsKKworCWNsb2NrX2NudGxfaW5kZXggPSBSMTI4X1JFQUQoIFIxMjhfQ0xPQ0tfQ05UTF9JTkRFWCApOworCW1jbGtfY250bCA9IFIxMjhfUkVBRF9QTEwoIGRldiwgUjEyOF9NQ0xLX0NOVEwgKTsKKworCVIxMjhfV1JJVEVfUExMKCBSMTI4X01DTEtfQ05UTCwKKwkJCW1jbGtfY250bCB8IFIxMjhfRk9SQ0VfR0NQIHwgUjEyOF9GT1JDRV9QSVBFM0RfQ1AgKTsKKworCWdlbl9yZXNldF9jbnRsID0gUjEyOF9SRUFEKCBSMTI4X0dFTl9SRVNFVF9DTlRMICk7CisKKwkvKiBUYWtlbiBmcm9tIHRoZSBzYW1wbGUgY29kZSAtIGRvIG5vdCBjaGFuZ2UgKi8KKwlSMTI4X1dSSVRFKCBSMTI4X0dFTl9SRVNFVF9DTlRMLAorCQkgICAgZ2VuX3Jlc2V0X2NudGwgfCBSMTI4X1NPRlRfUkVTRVRfR1VJICk7CisJUjEyOF9SRUFEKCBSMTI4X0dFTl9SRVNFVF9DTlRMICk7CisJUjEyOF9XUklURSggUjEyOF9HRU5fUkVTRVRfQ05UTCwKKwkJICAgIGdlbl9yZXNldF9jbnRsICYgflIxMjhfU09GVF9SRVNFVF9HVUkgKTsKKwlSMTI4X1JFQUQoIFIxMjhfR0VOX1JFU0VUX0NOVEwgKTsKKworCVIxMjhfV1JJVEVfUExMKCBSMTI4X01DTEtfQ05UTCwgbWNsa19jbnRsICk7CisJUjEyOF9XUklURSggUjEyOF9DTE9DS19DTlRMX0lOREVYLCBjbG9ja19jbnRsX2luZGV4ICk7CisJUjEyOF9XUklURSggUjEyOF9HRU5fUkVTRVRfQ05UTCwgZ2VuX3Jlc2V0X2NudGwgKTsKKworCS8qIFJlc2V0IHRoZSBDQ0UgcmluZyAqLworCXIxMjhfZG9fY2NlX3Jlc2V0KCBkZXZfcHJpdiApOworCisJLyogVGhlIENDRSBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgPSAwOworCisJLyogUmVzZXQgYW55IHBlbmRpbmcgdmVydGV4LCBpbmRpcmVjdCBidWZmZXJzICovCisJcjEyOF9mcmVlbGlzdF9yZXNldCggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfaW5pdF9yaW5nX2J1ZmZlciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiByaW5nX3N0YXJ0OworCXUzMiB0bXA7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIFRoZSBtYW51YWwgKHAuIDIpIHNheXMgdGhpcyBhZGRyZXNzIGlzIGluICJWTSBzcGFjZSIuICBUaGlzCisJICogbWVhbnMgaXQncyBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgQUdQIHNwYWNlLgorCSAqLworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKQorCQlyaW5nX3N0YXJ0ID0gZGV2X3ByaXYtPmNjZV9yaW5nLT5vZmZzZXQgLSBkZXYtPmFncC0+YmFzZTsKKwllbHNlCisjZW5kaWYKKwkJcmluZ19zdGFydCA9IGRldl9wcml2LT5jY2VfcmluZy0+b2Zmc2V0IC0gZGV2LT5zZy0+aGFuZGxlOworCisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX09GRlNFVCwgcmluZ19zdGFydCB8IFIxMjhfQUdQX09GRlNFVCApOworCisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIDAgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUiwgMCApOworCisJLyogU2V0IHdhdGVybWFyayBjb250cm9sICovCisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX1dNX0NOVEwsCisJCSAgICAoKFIxMjhfV0FURVJNQVJLX0wvNCkgPDwgUjEyOF9XTUFfU0hJRlQpCisJCSAgICB8ICgoUjEyOF9XQVRFUk1BUktfTS80KSA8PCBSMTI4X1dNQl9TSElGVCkKKwkJICAgIHwgKChSMTI4X1dBVEVSTUFSS19OLzQpIDw8IFIxMjhfV01DX1NISUZUKQorCQkgICAgfCAoKFIxMjhfV0FURVJNQVJLX0svNjQpIDw8IFIxMjhfV0JfV01fU0hJRlQpICk7CisKKwkvKiBGb3JjZSByZWFkLiAgV2h5PyAgQmVjYXVzZSBpdCdzIGluIHRoZSBleGFtcGxlcy4uLiAqLworCVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0FERFIgKTsKKworCS8qIFR1cm4gb24gYnVzIG1hc3RlcmluZyAqLworCXRtcCA9IFIxMjhfUkVBRCggUjEyOF9CVVNfQ05UTCApICYgflIxMjhfQlVTX01BU1RFUl9ESVM7CisJUjEyOF9XUklURSggUjEyOF9CVVNfQ05UTCwgdG1wICk7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9kb19pbml0X2NjZSggZHJtX2RldmljZV90ICpkZXYsIGRybV9yMTI4X2luaXRfdCAqaW5pdCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKworCURSTV9ERUJVRyggIlxuIiApOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fcjEyOF9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUiApOworCWlmICggZGV2X3ByaXYgPT0gTlVMTCApCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX3IxMjhfcHJpdmF0ZV90KSApOworCisJZGV2X3ByaXYtPmlzX3BjaSA9IGluaXQtPmlzX3BjaTsKKworCWlmICggZGV2X3ByaXYtPmlzX3BjaSAmJiAhZGV2LT5zZyApIHsKKwkJRFJNX0VSUk9SKCAiUENJIEdBUlQgbWVtb3J5IG5vdCBhbGxvY2F0ZWQhXG4iICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+dXNlY190aW1lb3V0ID0gaW5pdC0+dXNlY190aW1lb3V0OworCWlmICggZGV2X3ByaXYtPnVzZWNfdGltZW91dCA8IDEgfHwKKwkgICAgIGRldl9wcml2LT51c2VjX3RpbWVvdXQgPiBSMTI4X01BWF9VU0VDX1RJTUVPVVQgKSB7CisJCURSTV9ERUJVRyggIlRJTUVPVVQgcHJvYmxlbSFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWRldl9wcml2LT5jY2VfbW9kZSA9IGluaXQtPmNjZV9tb2RlOworCisJLyogR0g6IFNpbXBsZSBpZGxlIGNoZWNrLgorCSAqLworCWF0b21pY19zZXQoICZkZXZfcHJpdi0+aWRsZV9jb3VudCwgMCApOworCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGJ1cy1tYXN0ZXJpbmcgcmluZyBtb2RlLAorCSAqIGJ1dCB0aGUgcmluZyBjYW4gYmUgaW4gZWl0aGVyIEFHUCBvciBQQ0kgc3BhY2UgZm9yIHRoZSByaW5nCisJICogcmVhZCBwb2ludGVyLgorCSAqLworCWlmICggKCBpbml0LT5jY2VfbW9kZSAhPSBSMTI4X1BNNF8xOTJCTSApICYmCisJICAgICAoIGluaXQtPmNjZV9tb2RlICE9IFIxMjhfUE00XzEyOEJNXzY0SU5EQk0gKSAmJgorCSAgICAgKCBpbml0LT5jY2VfbW9kZSAhPSBSMTI4X1BNNF82NEJNXzEyOElOREJNICkgJiYKKwkgICAgICggaW5pdC0+Y2NlX21vZGUgIT0gUjEyOF9QTTRfNjRCTV82NFZDQk1fNjRJTkRCTSApICkgeworCQlEUk1fREVCVUcoICJCYWQgY2NlX21vZGUhXG4iICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlzd2l0Y2ggKCBpbml0LT5jY2VfbW9kZSApIHsKKwljYXNlIFIxMjhfUE00X05PTlBNNDoKKwkJZGV2X3ByaXYtPmNjZV9maWZvX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIFIxMjhfUE00XzE5MlBJTzoKKwljYXNlIFIxMjhfUE00XzE5MkJNOgorCQlkZXZfcHJpdi0+Y2NlX2ZpZm9fc2l6ZSA9IDE5MjsKKwkJYnJlYWs7CisJY2FzZSBSMTI4X1BNNF8xMjhQSU9fNjRJTkRCTToKKwljYXNlIFIxMjhfUE00XzEyOEJNXzY0SU5EQk06CisJCWRldl9wcml2LT5jY2VfZmlmb19zaXplID0gMTI4OworCQlicmVhazsKKwljYXNlIFIxMjhfUE00XzY0UElPXzEyOElOREJNOgorCWNhc2UgUjEyOF9QTTRfNjRCTV8xMjhJTkRCTToKKwljYXNlIFIxMjhfUE00XzY0UElPXzY0VkNCTV82NElOREJNOgorCWNhc2UgUjEyOF9QTTRfNjRCTV82NFZDQk1fNjRJTkRCTToKKwljYXNlIFIxMjhfUE00XzY0UElPXzY0VkNQSU9fNjRJTkRQSU86CisJCWRldl9wcml2LT5jY2VfZmlmb19zaXplID0gNjQ7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoIGluaXQtPmZiX2JwcCApIHsKKwljYXNlIDE2OgorCQlkZXZfcHJpdi0+Y29sb3JfZm10ID0gUjEyOF9EQVRBVFlQRV9SR0I1NjU7CisJCWJyZWFrOworCWNhc2UgMzI6CisJZGVmYXVsdDoKKwkJZGV2X3ByaXYtPmNvbG9yX2ZtdCA9IFIxMjhfREFUQVRZUEVfQVJHQjg4ODg7CisJCWJyZWFrOworCX0KKwlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0CT0gaW5pdC0+ZnJvbnRfb2Zmc2V0OworCWRldl9wcml2LT5mcm9udF9waXRjaAk9IGluaXQtPmZyb250X3BpdGNoOworCWRldl9wcml2LT5iYWNrX29mZnNldAk9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5iYWNrX3BpdGNoCT0gaW5pdC0+YmFja19waXRjaDsKKworCXN3aXRjaCAoIGluaXQtPmRlcHRoX2JwcCApIHsKKwljYXNlIDE2OgorCQlkZXZfcHJpdi0+ZGVwdGhfZm10ID0gUjEyOF9EQVRBVFlQRV9SR0I1NjU7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+ZGVwdGhfZm10ID0gUjEyOF9EQVRBVFlQRV9BUkdCODg4ODsKKwkJYnJlYWs7CisJfQorCWRldl9wcml2LT5kZXB0aF9vZmZzZXQJPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoCT0gaW5pdC0+ZGVwdGhfcGl0Y2g7CisJZGV2X3ByaXYtPnNwYW5fb2Zmc2V0CT0gaW5pdC0+c3Bhbl9vZmZzZXQ7CisKKwlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+ZnJvbnRfcGl0Y2gvOCkgPDwgMjEpIHwKKwkJCQkJICAoZGV2X3ByaXYtPmZyb250X29mZnNldCA+PiA1KSk7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+YmFja19waXRjaC84KSA8PCAyMSkgfAorCQkJCQkgKGRldl9wcml2LT5iYWNrX29mZnNldCA+PiA1KSk7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jID0gKCgoZGV2X3ByaXYtPmRlcHRoX3BpdGNoLzgpIDw8IDIxKSB8CisJCQkJCSAgKGRldl9wcml2LT5kZXB0aF9vZmZzZXQgPj4gNSkgfAorCQkJCQkgIFIxMjhfRFNUX1RJTEUpOworCWRldl9wcml2LT5zcGFuX3BpdGNoX29mZnNldF9jID0gKCgoZGV2X3ByaXYtPmRlcHRoX3BpdGNoLzgpIDw8IDIxKSB8CisJCQkJCSAoZGV2X3ByaXYtPnNwYW5fb2Zmc2V0ID4+IDUpKTsKKworCURSTV9HRVRTQVJFQSgpOworCQorCWlmKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIG1taW8gcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPmNjZV9yaW5nID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnJpbmdfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPmNjZV9yaW5nKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgY2NlIHJpbmcgcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPnJpbmdfcnB0ciA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5yaW5nX3JwdHJfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPnJpbmdfcnB0cikgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHJpbmcgcmVhZCBwb2ludGVyIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJZGV2X3ByaXYtPmFncF90ZXh0dXJlcyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5hZ3BfdGV4dHVyZXNfb2Zmc2V0KTsKKwkJaWYoIWRldl9wcml2LT5hZ3BfdGV4dHVyZXMpIHsKKwkJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgYWdwIHRleHR1cmUgcmVnaW9uIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2ID0KKwkJKGRybV9yMTI4X3NhcmVhX3QgKikoKHU4ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKworCQkJCSAgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPmNjZV9yaW5nLCBkZXYgKTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPnJpbmdfcnB0ciwgZGV2ICk7CisJCWRybV9jb3JlX2lvcmVtYXAoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCQlpZighZGV2X3ByaXYtPmNjZV9yaW5nLT5oYW5kbGUgfHwKKwkJICAgIWRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSB8fAorCQkgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlKSB7CisJCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBpb3JlbWFwIGFncCByZWdpb25zIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQlkZXZfcHJpdi0+Y2NlX3JpbmctPmhhbmRsZSA9CisJCQkodm9pZCAqKWRldl9wcml2LT5jY2VfcmluZy0+b2Zmc2V0OworCQlkZXZfcHJpdi0+cmluZ19ycHRyLT5oYW5kbGUgPQorCQkJKHZvaWQgKilkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQ7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSA9ICh2b2lkICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0OworCX0KKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKQorCQlkZXZfcHJpdi0+Y2NlX2J1ZmZlcnNfb2Zmc2V0ID0gZGV2LT5hZ3AtPmJhc2U7CisJZWxzZQorI2VuZGlmCisJCWRldl9wcml2LT5jY2VfYnVmZmVyc19vZmZzZXQgPSBkZXYtPnNnLT5oYW5kbGU7CisKKwlkZXZfcHJpdi0+cmluZy5zdGFydCA9ICh1MzIgKilkZXZfcHJpdi0+Y2NlX3JpbmctPmhhbmRsZTsKKwlkZXZfcHJpdi0+cmluZy5lbmQgPSAoKHUzMiAqKWRldl9wcml2LT5jY2VfcmluZy0+aGFuZGxlCisJCQkgICAgICArIGluaXQtPnJpbmdfc2l6ZSAvIHNpemVvZih1MzIpKTsKKwlkZXZfcHJpdi0+cmluZy5zaXplID0gaW5pdC0+cmluZ19zaXplOworCWRldl9wcml2LT5yaW5nLnNpemVfbDJxdyA9IGRybV9vcmRlciggaW5pdC0+cmluZ19zaXplIC8gOCApOworCisJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0KKwkJKGRldl9wcml2LT5yaW5nLnNpemUgLyBzaXplb2YodTMyKSkgLSAxOworCisJZGV2X3ByaXYtPnJpbmcuaGlnaF9tYXJrID0gMTI4OworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgPSAwOworCVIxMjhfV1JJVEUoIFIxMjhfTEFTVF9GUkFNRV9SRUcsIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lICk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IDA7CisJUjEyOF9XUklURSggUjEyOF9MQVNUX0RJU1BBVENIX1JFRywKKwkJICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoICk7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoIGRldl9wcml2LT5pc19wY2kgKSB7CisjZW5kaWYKKwkJaWYgKCFkcm1fYXRpX3BjaWdhcnRfaW5pdCggZGV2LCAmZGV2X3ByaXYtPnBoeXNfcGNpX2dhcnQsCisgICAgIAkJCQkJICAgICZkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0KSApIHsKKwkJCURSTV9FUlJPUiggImZhaWxlZCB0byBpbml0IFBDSSBHQVJUIVxuIiApOworCQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwkJUjEyOF9XUklURSggUjEyOF9QQ0lfR0FSVF9QQUdFLCBkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0ICk7CisjaWYgX19PU19IQVNfQUdQCisJfQorI2VuZGlmCisKKwlyMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKCBkZXYsIGRldl9wcml2ICk7CisJcjEyOF9jY2VfbG9hZF9taWNyb2NvZGUoIGRldl9wcml2ICk7CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworCXIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCitpbnQgcjEyOF9kb19jbGVhbnVwX2NjZSggZHJtX2RldmljZV90ICpkZXYgKQoreworCisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIGRybV9pcnFfdW5pbnN0YWxsKGRldik7CisKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisJCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisjaWYgX19PU19IQVNfQUdQCisJCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCQlpZiAoIGRldl9wcml2LT5jY2VfcmluZyAhPSBOVUxMICkKKwkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2X3ByaXYtPmNjZV9yaW5nLCBkZXYgKTsKKwkJCWlmICggZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMICkKKwkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2X3ByaXYtPnJpbmdfcnB0ciwgZGV2ICk7CisJCQlpZiAoIGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCApCisJCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKCBkZXYsCisJCQkJCQlkZXZfcHJpdi0+cGh5c19wY2lfZ2FydCwKKwkJCQkJCWRldl9wcml2LT5idXNfcGNpX2dhcnQgKSkKKwkJCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gY2xlYW51cCBQQ0kgR0FSVCFcbiIgKTsKKwkJfQorCisJCWRybV9mcmVlKCBkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX3IxMjhfcHJpdmF0ZV90KSwKKwkJCSAgIERSTV9NRU1fRFJJVkVSICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcjEyOF9jY2VfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfaW5pdF90IGluaXQ7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluaXQsIChkcm1fcjEyOF9pbml0X3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGluaXQpICk7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBSMTI4X0lOSVRfQ0NFOgorCQlyZXR1cm4gcjEyOF9kb19pbml0X2NjZSggZGV2LCAmaW5pdCApOworCWNhc2UgUjEyOF9DTEVBTlVQX0NDRToKKwkJcmV0dXJuIHIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCX0KKworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKK2ludCByMTI4X2NjZV9zdGFydCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCBkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgfHwgZGV2X3ByaXYtPmNjZV9tb2RlID09IFIxMjhfUE00X05PTlBNNCApIHsKKwkJRFJNX0RFQlVHKCAiJXMgd2hpbGUgQ0NFIHJ1bm5pbmdcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyMTI4X2RvX2NjZV9zdGFydCggZGV2X3ByaXYgKTsKKworCXJldHVybiAwOworfQorCisvKiBTdG9wIHRoZSBDQ0UuICBUaGUgZW5naW5lIG11c3QgaGF2ZSBiZWVuIGlkbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHJvdXRpbmUuCisgKi8KK2ludCByMTI4X2NjZV9zdG9wKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9jY2Vfc3RvcF90IHN0b3A7CisJaW50IHJldDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3RvcCwgKGRybV9yMTI4X2NjZV9zdG9wX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHN0b3ApICk7CisKKwkvKiBGbHVzaCBhbnkgcGVuZGluZyBDQ0UgY29tbWFuZHMuICBUaGlzIGVuc3VyZXMgYW55IG91dHN0YW5kaW5nCisJICogY29tbWFuZHMgYXJlIGV4ZWN0dXRlZCBieSB0aGUgZW5naW5lIGJlZm9yZSB3ZSB0dXJuIGl0IG9mZi4KKwkgKi8KKwlpZiAoIHN0b3AuZmx1c2ggKSB7CisJCXIxMjhfZG9fY2NlX2ZsdXNoKCBkZXZfcHJpdiApOworCX0KKworCS8qIElmIHdlIGZhaWwgdG8gbWFrZSB0aGUgZW5naW5lIGdvIGlkbGUsIHdlIHJldHVybiBhbiBlcnJvcgorCSAqIGNvZGUgc28gdGhhdCB0aGUgRFJNIGlvY3RsIHdyYXBwZXIgY2FuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAoIHN0b3AuaWRsZSApIHsKKwkJcmV0ID0gcjEyOF9kb19jY2VfaWRsZSggZGV2X3ByaXYgKTsKKwkJaWYgKCByZXQgKSByZXR1cm4gcmV0OworCX0KKworCS8qIEZpbmFsbHksIHdlIGNhbiB0dXJuIG9mZiB0aGUgQ0NFLiAgSWYgdGhlIGVuZ2luZSBpc24ndCBpZGxlLAorCSAqIHdlIHdpbGwgZ2V0IHNvbWUgZHJvcHBlZCB0cmlhbmdsZXMgYXMgdGhleSB3b24ndCBiZSBmdWxseQorCSAqIHJlbmRlcmVkIGJlZm9yZSB0aGUgQ0NFIGlzIHNodXQgZG93bi4KKwkgKi8KKwlyMTI4X2RvX2NjZV9zdG9wKCBkZXZfcHJpdiApOworCisJLyogUmVzZXQgdGhlIGVuZ2luZSAqLworCXIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCisvKiBKdXN0IHJlc2V0IHRoZSBDQ0UgcmluZy4gIENhbGxlZCBhcyBwYXJ0IG9mIGFuIFggU2VydmVyIGVuZ2luZSByZXNldC4KKyAqLworaW50IHIxMjhfY2NlX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0RFQlVHKCAiJXMgY2FsbGVkIGJlZm9yZSBpbml0IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXIxMjhfZG9fY2NlX3Jlc2V0KCBkZXZfcHJpdiApOworCisJLyogVGhlIENDRSBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2NjZV9pZGxlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoIGRldl9wcml2LT5jY2VfcnVubmluZyApIHsKKwkJcjEyOF9kb19jY2VfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJcmV0dXJuIHIxMjhfZG9fY2NlX2lkbGUoIGRldl9wcml2ICk7Cit9CisKK2ludCByMTI4X2VuZ2luZV9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIHIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKK30KKworaW50IHIxMjhfZnVsbHNjcmVlbiggRFJNX0lPQ1RMX0FSR1MgKQoreworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnJlZWxpc3QgbWFuYWdlbWVudAorICovCisjZGVmaW5lIFIxMjhfQlVGRkVSX1VTRUQJMHhmZmZmZmZmZgorI2RlZmluZSBSMTI4X0JVRkZFUl9GUkVFCTAKKworI2lmIDAKK3N0YXRpYyBpbnQgcjEyOF9mcmVlbGlzdF9pbml0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX3IxMjhfZnJlZWxpc3RfdCAqZW50cnk7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+aGVhZCA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9yMTI4X2ZyZWVsaXN0X3QpLAorCQkJCSAgICAgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoIGRldl9wcml2LT5oZWFkID09IE5VTEwgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KCBkZXZfcHJpdi0+aGVhZCwgMCwgc2l6ZW9mKGRybV9yMTI4X2ZyZWVsaXN0X3QpICk7CisJZGV2X3ByaXYtPmhlYWQtPmFnZSA9IFIxMjhfQlVGRkVSX1VTRUQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkJZW50cnkgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fcjEyOF9mcmVlbGlzdF90KSwKKwkJCQkgICAgRFJNX01FTV9EUklWRVIgKTsKKwkJaWYgKCAhZW50cnkgKSByZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJCWVudHJ5LT5hZ2UgPSBSMTI4X0JVRkZFUl9GUkVFOworCQllbnRyeS0+YnVmID0gYnVmOworCQllbnRyeS0+cHJldiA9IGRldl9wcml2LT5oZWFkOworCQllbnRyeS0+bmV4dCA9IGRldl9wcml2LT5oZWFkLT5uZXh0OworCQlpZiAoICFlbnRyeS0+bmV4dCApCisJCQlkZXZfcHJpdi0+dGFpbCA9IGVudHJ5OworCisJCWJ1Zl9wcml2LT5kaXNjYXJkID0gMDsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCQlidWZfcHJpdi0+bGlzdF9lbnRyeSA9IGVudHJ5OworCisJCWRldl9wcml2LT5oZWFkLT5uZXh0ID0gZW50cnk7CisKKwkJaWYgKCBkZXZfcHJpdi0+aGVhZC0+bmV4dCApCisJCQlkZXZfcHJpdi0+aGVhZC0+bmV4dC0+cHJldiA9IGVudHJ5OworCX0KKworCXJldHVybiAwOworCit9CisjZW5kaWYKKworc3RhdGljIGRybV9idWZfdCAqcjEyOF9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlpbnQgaSwgdDsKKworCS8qIEZJWE1FOiBPcHRpbWl6ZSAtLSB1c2UgZnJlZWxpc3QgY29kZSAqLworCisJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQlpZiAoIGJ1Zi0+ZmlscCA9PSAwICkKKwkJCXJldHVybiBidWY7CisJfQorCisJZm9yICggdCA9IDAgOyB0IDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IHQrKyApIHsKKwkJdTMyIGRvbmVfYWdlID0gUjEyOF9SRUFEKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHICk7CisKKwkJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zi0+cGVuZGluZyAmJiBidWZfcHJpdi0+YWdlIDw9IGRvbmVfYWdlICkgeworCQkJCS8qIFRoZSBidWZmZXIgaGFzIGJlZW4gcHJvY2Vzc2VkLCBzbyBpdAorCQkJCSAqIGNhbiBub3cgYmUgdXNlZC4KKwkJCQkgKi8KKwkJCQlidWYtPnBlbmRpbmcgPSAwOworCQkJCXJldHVybiBidWY7CisJCQl9CisJCX0KKwkJRFJNX1VERUxBWSggMSApOworCX0KKworCURSTV9ERUJVRyggInJldHVybmluZyBOVUxMIVxuIiApOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQlidWZfcHJpdi0+YWdlID0gMDsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ0NFIGNvbW1hbmQgc3VibWlzc2lvbgorICovCisKK2ludCByMTI4X3dhaXRfcmluZyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IG4gKQoreworCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlyMTI4X3VwZGF0ZV9yaW5nX3NuYXBzaG90KCBkZXZfcHJpdiApOworCQlpZiAoIHJpbmctPnNwYWNlID49IG4gKQorCQkJcmV0dXJuIDA7CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKwkvKiBGSVhNRTogVGhpcyBpcyBiZWluZyBpZ25vcmVkLi4uICovCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9nZXRfYnVmZmVycyggRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV90ICpkICkKK3sKKwlpbnQgaTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKworCWZvciAoIGkgPSBkLT5ncmFudGVkX2NvdW50IDsgaSA8IGQtPnJlcXVlc3RfY291bnQgOyBpKysgKSB7CisJCWJ1ZiA9IHIxMjhfZnJlZWxpc3RfZ2V0KCBkZXYgKTsKKwkJaWYgKCAhYnVmICkgcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKKworCQlidWYtPmZpbHAgPSBmaWxwOworCisJCWlmICggRFJNX0NPUFlfVE9fVVNFUiggJmQtPnJlcXVlc3RfaW5kaWNlc1tpXSwgJmJ1Zi0+aWR4LAorCQkJCSAgIHNpemVvZihidWYtPmlkeCkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQlpZiAoIERSTV9DT1BZX1RPX1VTRVIoICZkLT5yZXF1ZXN0X3NpemVzW2ldLCAmYnVmLT50b3RhbCwKKwkJCQkgICBzaXplb2YoYnVmLT50b3RhbCkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJCWQtPmdyYW50ZWRfY291bnQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2NjZV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQgcmV0ID0gMDsKKwlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fZG1hX3QgZDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGQsIGFyZ3AsIHNpemVvZihkKSApOworCisJLyogUGxlYXNlIGRvbid0IHNlbmQgdXMgYnVmZmVycy4KKwkgKi8KKwlpZiAoIGQuc2VuZF9jb3VudCAhPSAwICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgdmlhIGRybURNQVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnNlbmRfY291bnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKiBXZSdsbCBzZW5kIHlvdSBidWZmZXJzLgorCSAqLworCWlmICggZC5yZXF1ZXN0X2NvdW50IDwgMCB8fCBkLnJlcXVlc3RfY291bnQgPiBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWQuZ3JhbnRlZF9jb3VudCA9IDA7CisKKwlpZiAoIGQucmVxdWVzdF9jb3VudCApIHsKKwkJcmV0ID0gcjEyOF9jY2VfZ2V0X2J1ZmZlcnMoIGZpbHAsIGRldiwgJmQgKTsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIGQsIHNpemVvZihkKSApOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JhMTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKiByMTI4X2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFdlZCBBcHIgIDUgMTk6MjQ6MTkgMjAwMCBieSBrZXZpbkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fUjEyOF9EUk1fSF9fCisjZGVmaW5lIF9fUjEyOF9EUk1fSF9fCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyMTI4X3NhcmVhLmgpCisgKi8KKyNpZm5kZWYgX19SMTI4X1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX1IxMjhfU0FSRUFfREVGSU5FU19fCisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGJ1ZmZlcj8KKyAqLworI2RlZmluZSBSMTI4X1VQTE9BRF9DT05URVhUCQkweDAwMQorI2RlZmluZSBSMTI4X1VQTE9BRF9TRVRVUAkJMHgwMDIKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMAkJMHgwMDQKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMQkJMHgwMDgKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMElNQUdFUwkJMHgwMTAKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMUlNQUdFUwkJMHgwMjAKKyNkZWZpbmUgUjEyOF9VUExPQURfQ09SRQkJMHgwNDAKKyNkZWZpbmUgUjEyOF9VUExPQURfTUFTS1MJCTB4MDgwCisjZGVmaW5lIFIxMjhfVVBMT0FEX1dJTkRPVwkJMHgxMDAKKyNkZWZpbmUgUjEyOF9VUExPQURfQ0xJUFJFQ1RTCQkweDIwMAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIFIxMjhfUkVRVUlSRV9RVUlFU0NFTkNFCQkweDQwMAorI2RlZmluZSBSMTI4X1VQTE9BRF9BTEwJCQkweDdmZgorCisjZGVmaW5lIFIxMjhfRlJPTlQJCQkweDEKKyNkZWZpbmUgUjEyOF9CQUNLCQkJMHgyCisjZGVmaW5lIFIxMjhfREVQVEgJCQkweDQKKworLyogUHJpbWl0aXZlIHR5cGVzCisgKi8KKyNkZWZpbmUgUjEyOF9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUjEyOF9MSU5FUwkJCTB4MgorI2RlZmluZSBSMTI4X0xJTkVfU1RSSVAJCQkweDMKKyNkZWZpbmUgUjEyOF9UUklBTkdMRVMJCQkweDQKKyNkZWZpbmUgUjEyOF9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSMTI4X1RSSUFOR0xFX1NUUklQCQkweDYKKworLyogVmVydGV4L2luZGlyZWN0IGJ1ZmZlciBzaXplCisgKi8KKyNkZWZpbmUgUjEyOF9CVUZGRVJfU0laRQkJMTYzODQKKworLyogQnl0ZSBvZmZzZXRzIGZvciBpbmRpcmVjdCBidWZmZXIgZGF0YQorICovCisjZGVmaW5lIFIxMjhfSU5ERVhfUFJJTV9PRkZTRVQJCTIwCisjZGVmaW5lIFIxMjhfSE9TVERBVEFfQkxJVF9PRkZTRVQJMzIKKworLyogS2VlcCB0aGVzZSBzbWFsbCBmb3IgdGVzdGluZy4KKyAqLworI2RlZmluZSBSMTI4X05SX1NBUkVBX0NMSVBSRUNUUwkJMTIKKworLyogVGhlcmUgYXJlIDIgaGVhcHMgKGxvY2FsL0FHUCkuICBFYWNoIHJlZ2lvbiB3aXRoaW4gYSBoZWFwIGlzIGEKKyAqICBtaW5pbXVtIG9mIDY0aywgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDY0IG9mIHRoZW0gcGVyIGhlYXAuCisgKi8KKyNkZWZpbmUgUjEyOF9MT0NBTF9URVhfSEVBUAkJMAorI2RlZmluZSBSMTI4X0FHUF9URVhfSEVBUAkJMQorI2RlZmluZSBSMTI4X05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBSMTI4X05SX1RFWF9SRUdJT05TCQk2NAorI2RlZmluZSBSMTI4X0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBSMTI4X05SX0NPTlRFWFRfUkVHUwkJMTIKKworI2RlZmluZSBSMTI4X01BWF9URVhUVVJFX0xFVkVMUwkJMTEKKyNkZWZpbmUgUjEyOF9NQVhfVEVYVFVSRV9VTklUUwkJMgorCisjZW5kaWYgLyogX19SMTI4X1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogQ29udGV4dCBzdGF0ZSAtIGNhbiBiZSB3cml0dGVuIGluIG9uZSBsYXJnZSBjaHVuayAqLworCXVuc2lnbmVkIGludCBkc3RfcGl0Y2hfb2Zmc2V0X2M7CisJdW5zaWduZWQgaW50IGRwX2d1aV9tYXN0ZXJfY250bF9jOworCXVuc2lnbmVkIGludCBzY190b3BfbGVmdF9jOworCXVuc2lnbmVkIGludCBzY19ib3R0b21fcmlnaHRfYzsKKwl1bnNpZ25lZCBpbnQgel9vZmZzZXRfYzsKKwl1bnNpZ25lZCBpbnQgel9waXRjaF9jOworCXVuc2lnbmVkIGludCB6X3N0ZW5fY250bF9jOworCXVuc2lnbmVkIGludCB0ZXhfY250bF9jOworCXVuc2lnbmVkIGludCBtaXNjXzNkX3N0YXRlX2NudGxfcmVnOworCXVuc2lnbmVkIGludCB0ZXh0dXJlX2Nscl9jbXBfY2xyX2M7CisJdW5zaWduZWQgaW50IHRleHR1cmVfY2xyX2NtcF9tc2tfYzsKKwl1bnNpZ25lZCBpbnQgZm9nX2NvbG9yX2M7CisKKwkvKiBUZXh0dXJlIHN0YXRlICovCisJdW5zaWduZWQgaW50IHRleF9zaXplX3BpdGNoX2M7CisJdW5zaWduZWQgaW50IGNvbnN0YW50X2NvbG9yX2M7CisKKwkvKiBTZXR1cCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBwbTRfdmNfZnB1X3NldHVwOworCXVuc2lnbmVkIGludCBzZXR1cF9jbnRsOworCisJLyogTWFzayBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBkcF93cml0ZV9tYXNrOworCXVuc2lnbmVkIGludCBzdGVuX3JlZl9tYXNrX2M7CisJdW5zaWduZWQgaW50IHBsYW5lXzNkX21hc2tfYzsKKworCS8qIFdpbmRvdyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCB3aW5kb3dfeHlfb2Zmc2V0OworCisJLyogQ29yZSBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzY2FsZV8zZF9jbnRsOworfSBkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciBlYWNoIHRleHR1cmUgdW5pdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHRleF9jbnRsOworCXVuc2lnbmVkIGludCB0ZXhfY29tYmluZV9jbnRsOworCXVuc2lnbmVkIGludCB0ZXhfc2l6ZV9waXRjaDsKKwl1bnNpZ25lZCBpbnQgdGV4X29mZnNldFtSMTI4X01BWF9URVhUVVJFX0xFVkVMU107CisJdW5zaWduZWQgaW50IHRleF9ib3JkZXJfY29sb3I7Cit9IGRybV9yMTI4X3RleHR1cmVfcmVnc190OworCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3NhcmVhIHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsCisJICogb24gZmlyaW5nIGEgdmVydGV4IGJ1ZmZlci4KKwkgKi8KKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworCWRybV9yMTI4X3RleHR1cmVfcmVnc190IHRleF9zdGF0ZVtSMTI4X01BWF9URVhUVVJFX1VOSVRTXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJZHJtX2NsaXBfcmVjdF90IGJveGVzW1IxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwl1bnNpZ25lZCBpbnQgbmJveDsKKworCS8qIENvdW50ZXJzIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nIG9mIHJlbmRlcmluZyBjbGllbnRzLgorCSAqLworCXVuc2lnbmVkIGludCBsYXN0X2ZyYW1lOworCXVuc2lnbmVkIGludCBsYXN0X2Rpc3BhdGNoOworCisJZHJtX3RleF9yZWdpb25fdCB0ZXhfbGlzdFtSMTI4X05SX1RFWF9IRUFQU11bUjEyOF9OUl9URVhfUkVHSU9OUysxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSMTI4X05SX1RFWF9IRUFQU107CisJaW50IGN0eF9vd25lcjsKKwlpbnQgcGZBbGxvd1BhZ2VGbGlwOyAgICAgICAgLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyIG9yIG1vcmUpICovCisJaW50IHBmQ3VycmVudFBhZ2U7CSAgICAvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworfSBkcm1fcjEyOF9zYXJlYV90OworCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1SMTI4LmgpCisgKi8KKworLyogUmFnZSAxMjggc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fUjEyOF9JTklUICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX1NUQVJUICAweDAxCisjZGVmaW5lIERSTV9SMTI4X0NDRV9TVE9QICAgMHgwMgorI2RlZmluZSBEUk1fUjEyOF9DQ0VfUkVTRVQgIDB4MDMKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX0lETEUgICAweDA0CisvKiAweDA1IG5vdCB1c2VkICovCisjZGVmaW5lIERSTV9SMTI4X1JFU0VUICAgICAgMHgwNgorI2RlZmluZSBEUk1fUjEyOF9TV0FQICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX1IxMjhfQ0xFQVIgICAgICAweDA4CisjZGVmaW5lIERSTV9SMTI4X1ZFUlRFWCAgICAgMHgwOQorI2RlZmluZSBEUk1fUjEyOF9JTkRJQ0VTICAgIDB4MGEKKyNkZWZpbmUgRFJNX1IxMjhfQkxJVCAgICAgICAweDBiCisjZGVmaW5lIERSTV9SMTI4X0RFUFRIICAgICAgMHgwYworI2RlZmluZSBEUk1fUjEyOF9TVElQUExFICAgIDB4MGQKKy8qIDB4MGUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX1IxMjhfSU5ESVJFQ1QgICAweDBmCisjZGVmaW5lIERSTV9SMTI4X0ZVTExTQ1JFRU4gMHgxMAorI2RlZmluZSBEUk1fUjEyOF9DTEVBUjIgICAgIDB4MTEKKyNkZWZpbmUgRFJNX1IxMjhfR0VUUEFSQU0gICAweDEyCisjZGVmaW5lIERSTV9SMTI4X0ZMSVAgICAgICAgMHgxMworCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lOSVQgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lOSVQsIGRybV9yMTI4X2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1NUQVJUICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1NUQVJUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfU1RPUCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfU1RPUCwgZHJtX3IxMjhfY2NlX3N0b3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1JFU0VUICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfSURMRSAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfSURMRSkKKy8qIDB4MDUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfUkVTRVQgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1NXQVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NMRUFSICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NMRUFSLCBkcm1fcjEyOF9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9WRVJURVggICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9WRVJURVgsIGRybV9yMTI4X3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9JTkRJQ0VTICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9JTkRJQ0VTLCBkcm1fcjEyOF9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0JMSVQgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0JMSVQsIGRybV9yMTI4X2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfREVQVEggICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfREVQVEgsIGRybV9yMTI4X2RlcHRoX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1NUSVBQTEUgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1NUSVBQTEUsIGRybV9yMTI4X3N0aXBwbGVfdCkKKy8qIDB4MGUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfSU5ESVJFQ1QgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfSU5ESVJFQ1QsIGRybV9yMTI4X2luZGlyZWN0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZVTExTQ1JFRU4gRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZVTExTQ1JFRU4sIGRybV9yMTI4X2Z1bGxzY3JlZW5fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0xFQVIyICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0xFQVIyLCBkcm1fcjEyOF9jbGVhcjJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfR0VUUEFSQU0gICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfR0VUUEFSQU0sIGRybV9yMTI4X2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZMSVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZMSVApCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luaXQgeworCWVudW0geworCQlSMTI4X0lOSVRfQ0NFICAgID0gMHgwMSwKKwkJUjEyOF9DTEVBTlVQX0NDRSA9IDB4MDIKKwl9IGZ1bmM7CisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorCWludCBzYXJlYV9wcml2X29mZnNldDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKyNlbmRpZgorCWludCBpc19wY2k7CisJaW50IGNjZV9tb2RlOworCWludCBjY2Vfc2VjdXJlOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IHNwYW5fb2Zmc2V0OworCisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorCXVuc2lnbmVkIGludCBmYl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGFncF90ZXh0dXJlc19vZmZzZXQ7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7CisjZW5kaWYKK30gZHJtX3IxMjhfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9jY2Vfc3RvcCB7CisJaW50IGZsdXNoOworCWludCBpZGxlOworfSBkcm1fcjEyOF9jY2Vfc3RvcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2lmIENPTkZJR19YRlJFRTg2X1ZFUlNJT04gPCBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKwlpbnQgeCwgeSwgdywgaDsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA+PSBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsKKyNlbmRpZgorfSBkcm1fcjEyOF9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF92ZXJ0ZXggeworCWludCBwcmltOworCWludCBpZHg7CQkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBjb3VudDsJCQkvKiBOdW1iZXIgb2YgdmVydGljZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcjEyOF92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5kaWNlcyB7CisJaW50IHByaW07CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yMTI4X2luZGljZXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYmxpdCB7CisJaW50IGlkeDsKKwlpbnQgcGl0Y2g7CisJaW50IG9mZnNldDsKKwlpbnQgZm9ybWF0OworCXVuc2lnbmVkIHNob3J0IHgsIHk7CisJdW5zaWduZWQgc2hvcnQgd2lkdGgsIGhlaWdodDsKK30gZHJtX3IxMjhfYmxpdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9kZXB0aCB7CisJZW51bSB7CisJCVIxMjhfV1JJVEVfU1BBTgkJPSAweDAxLAorCQlSMTI4X1dSSVRFX1BJWEVMUwk9IDB4MDIsCisJCVIxMjhfUkVBRF9TUEFOCQk9IDB4MDMsCisJCVIxMjhfUkVBRF9QSVhFTFMJPSAweDA0CisJfSBmdW5jOworCWludCBuOworCWludCBfX3VzZXIgKng7CisJaW50IF9fdXNlciAqeTsKKwl1bnNpZ25lZCBpbnQgX191c2VyICpidWZmZXI7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKm1hc2s7Cit9IGRybV9yMTI4X2RlcHRoX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3N0aXBwbGUgeworCXVuc2lnbmVkIGludCBfX3VzZXIgKm1hc2s7Cit9IGRybV9yMTI4X3N0aXBwbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5kaXJlY3QgeworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7Cit9IGRybV9yMTI4X2luZGlyZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2Z1bGxzY3JlZW4geworCWVudW0geworCQlSMTI4X0lOSVRfRlVMTFNDUkVFTiAgICA9IDB4MDEsCisJCVIxMjhfQ0xFQU5VUF9GVUxMU0NSRUVOID0gMHgwMgorCX0gZnVuYzsKK30gZHJtX3IxMjhfZnVsbHNjcmVlbl90OworCisvKiAyLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LiAgCisgKi8KKyNkZWZpbmUgUjEyOF9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCBfX3VzZXIgKnZhbHVlOworfSBkcm1fcjEyOF9nZXRwYXJhbV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ2MzgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiByMTI4X2Rydi5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDA5OjQ3OjI3IDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInIxMjhfZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXIxMjhfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgcjEyOF9pb2N0bHNbXTsKK2V4dGVybiBpbnQgcjEyOF9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfU0cgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9yMTI4X2J1Zl9wcml2X3QpLAorCS5wcmVyZWxlYXNlID0gcjEyOF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucHJldGFrZWRvd24gPSByMTI4X2RyaXZlcl9wcmV0YWtlZG93biwKKwkudmJsYW5rX3dhaXQgPSByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKKwkuaXJxX3Bvc3RpbnN0YWxsID0gcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSByMTI4X2RyaXZlcl9pcnFfaGFuZGxlciwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gcjEyOF9pb2N0bHMsCisJLmRtYV9pb2N0bCA9IHIxMjhfY2NlX2J1ZmZlcnMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHIxMjhfaW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gcjEyOF9tYXhfaW9jdGw7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcjEyOF9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHIxMjhfaW5pdCk7Cittb2R1bGVfZXhpdChyMTI4X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWFhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKQEAgLTAsMCArMSw1MjEgQEAKKy8qIHIxMjhfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHIxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwOTo1MToxMSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBNaWNoZWwgRO+/vXplciA8ZGFlbnplcm1Ac3R1ZGVudC5ldGh6LmNoPgorICovCisKKyNpZm5kZWYgX19SMTI4X0RSVl9IX18KKyNkZWZpbmUgX19SMTI4X0RSVl9IX18KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJHYXJldGggSHVnaGVzLCBWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJyMTI4IgorI2RlZmluZSBEUklWRVJfREVTQwkJIkFUSSBSYWdlIDEyOCIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAzMDcyNSIKKworLyogSW50ZXJmYWNlIGhpc3Rvcnk6CisgKgorICogPz8gIC0gPz8KKyAqIDIuNCAtIEFkZCBzdXBwb3J0IGZvciB5Y2JjciB0ZXh0dXJlcyAobm8gbmV3IGlvY3RscykKKyAqIDIuNSAtIEFkZCBGTElQIGlvY3RsLCBkaXNhYmxlIEZVTExTQ1JFRU4uCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkyCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJNQorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKKworI2RlZmluZSBHRVRfUklOR19IRUFEKGRldl9wcml2KQkJUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUiApCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0IHsKKyAgIAl1bnNpZ25lZCBpbnQgYWdlOworICAgCWRybV9idWZfdCAqYnVmOworICAgCXN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCAqbmV4dDsKKyAgIAlzdHJ1Y3QgZHJtX3IxMjhfZnJlZWxpc3QgKnByZXY7Cit9IGRybV9yMTI4X2ZyZWVsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3JpbmdfYnVmZmVyIHsKKwl1MzIgKnN0YXJ0OworCXUzMiAqZW5kOworCWludCBzaXplOworCWludCBzaXplX2wycXc7CisKKwl1MzIgdGFpbDsKKwl1MzIgdGFpbF9tYXNrOworCWludCBzcGFjZTsKKworCWludCBoaWdoX21hcms7Cit9IGRybV9yMTI4X3JpbmdfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3ByaXZhdGUgeworCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgcmluZzsKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2OworCisJaW50IGNjZV9tb2RlOworCWludCBjY2VfZmlmb19zaXplOworCWludCBjY2VfcnVubmluZzsKKworICAgCWRybV9yMTI4X2ZyZWVsaXN0X3QgKmhlYWQ7CisgICAJZHJtX3IxMjhfZnJlZWxpc3RfdCAqdGFpbDsKKworCWludCB1c2VjX3RpbWVvdXQ7CisJaW50IGlzX3BjaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGNpX2dhcnQ7CisJZG1hX2FkZHJfdCBidXNfcGNpX2dhcnQ7CisJdW5zaWduZWQgbG9uZyBjY2VfYnVmZmVyc19vZmZzZXQ7CisKKwlhdG9taWNfdCBpZGxlX2NvdW50OworCisJaW50IHBhZ2VfZmxpcHBpbmc7CisJaW50IGN1cnJlbnRfcGFnZTsKKwl1MzIgY3J0Y19vZmZzZXQ7CisJdTMyIGNydGNfb2Zmc2V0X2NudGw7CisKKwl1MzIgY29sb3JfZm10OworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKworCXUzMiBkZXB0aF9mbXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IHNwYW5fb2Zmc2V0OworCisJdTMyIGZyb250X3BpdGNoX29mZnNldF9jOworCXUzMiBiYWNrX3BpdGNoX29mZnNldF9jOworCXUzMiBkZXB0aF9waXRjaF9vZmZzZXRfYzsKKwl1MzIgc3Bhbl9waXRjaF9vZmZzZXRfYzsKKworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICptbWlvOworCWRybV9sb2NhbF9tYXBfdCAqY2NlX3Jpbmc7CisJZHJtX2xvY2FsX21hcF90ICpyaW5nX3JwdHI7CisJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7Cit9IGRybV9yMTI4X3ByaXZhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYnVmX3ByaXYgeworCXUzMiBhZ2U7CisJaW50IHByaW07CisJaW50IGRpc2NhcmQ7CisJaW50IGRpc3BhdGNoZWQ7CisgICAJZHJtX3IxMjhfZnJlZWxpc3RfdCAqbGlzdF9lbnRyeTsKK30gZHJtX3IxMjhfYnVmX3ByaXZfdDsKKworCQkJCS8qIHIxMjhfY2NlLmMgKi8KK2V4dGVybiBpbnQgcjEyOF9jY2VfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcjEyOF9jY2Vfc3RhcnQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfY2NlX3N0b3AoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfY2NlX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2NjZV9pZGxlKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2VuZ2luZV9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcjEyOF9mdWxsc2NyZWVuKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2NjZV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApOworCitleHRlcm4gdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApOworCitleHRlcm4gaW50IHIxMjhfd2FpdF9yaW5nKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApOworCitleHRlcm4gaW50IHIxMjhfZG9fY2NlX2lkbGUoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKK2V4dGVybiBpbnQgcjEyOF9kb19jbGVhbnVwX2NjZSggZHJtX2RldmljZV90ICpkZXYgKTsKKworZXh0ZXJuIGludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisKK2V4dGVybiBpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucywgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyBhbmQgZHJtQWRkTWFwIGNvbnN0YW50cworICogZm9yIFJhZ2UgMTI4IGtlcm5lbCBkcml2ZXIuCisgKi8KKworI2RlZmluZSBSMTI4X0FVWF9TQ19DTlRMCQkweDE2NjAKKyMJZGVmaW5lIFIxMjhfQVVYMV9TQ19FTgkJCSgxIDw8IDApCisjCWRlZmluZSBSMTI4X0FVWDFfU0NfTU9ERV9PUgkJKDAgPDwgMSkKKyMJZGVmaW5lIFIxMjhfQVVYMV9TQ19NT0RFX05BTkQJCSgxIDw8IDEpCisjCWRlZmluZSBSMTI4X0FVWDJfU0NfRU4JCQkoMSA8PCAyKQorIwlkZWZpbmUgUjEyOF9BVVgyX1NDX01PREVfT1IJCSgwIDw8IDMpCisjCWRlZmluZSBSMTI4X0FVWDJfU0NfTU9ERV9OQU5ECQkoMSA8PCAzKQorIwlkZWZpbmUgUjEyOF9BVVgzX1NDX0VOCQkJKDEgPDwgNCkKKyMJZGVmaW5lIFIxMjhfQVVYM19TQ19NT0RFX09SCQkoMCA8PCA1KQorIwlkZWZpbmUgUjEyOF9BVVgzX1NDX01PREVfTkFORAkJKDEgPDwgNSkKKyNkZWZpbmUgUjEyOF9BVVgxX1NDX0xFRlQJCTB4MTY2NAorI2RlZmluZSBSMTI4X0FVWDFfU0NfUklHSFQJCTB4MTY2OAorI2RlZmluZSBSMTI4X0FVWDFfU0NfVE9QCQkweDE2NmMKKyNkZWZpbmUgUjEyOF9BVVgxX1NDX0JPVFRPTQkJMHgxNjcwCisjZGVmaW5lIFIxMjhfQVVYMl9TQ19MRUZUCQkweDE2NzQKKyNkZWZpbmUgUjEyOF9BVVgyX1NDX1JJR0hUCQkweDE2NzgKKyNkZWZpbmUgUjEyOF9BVVgyX1NDX1RPUAkJMHgxNjdjCisjZGVmaW5lIFIxMjhfQVVYMl9TQ19CT1RUT00JCTB4MTY4MAorI2RlZmluZSBSMTI4X0FVWDNfU0NfTEVGVAkJMHgxNjg0CisjZGVmaW5lIFIxMjhfQVVYM19TQ19SSUdIVAkJMHgxNjg4CisjZGVmaW5lIFIxMjhfQVVYM19TQ19UT1AJCTB4MTY4YworI2RlZmluZSBSMTI4X0FVWDNfU0NfQk9UVE9NCQkweDE2OTAKKworI2RlZmluZSBSMTI4X0JSVVNIX0RBVEEwCQkweDE0ODAKKyNkZWZpbmUgUjEyOF9CVVNfQ05UTAkJCTB4MDAzMAorIwlkZWZpbmUgUjEyOF9CVVNfTUFTVEVSX0RJUwkJKDEgPDwgNikKKworI2RlZmluZSBSMTI4X0NMT0NLX0NOVExfSU5ERVgJCTB4MDAwOAorI2RlZmluZSBSMTI4X0NMT0NLX0NOVExfREFUQQkJMHgwMDBjCisjCWRlZmluZSBSMTI4X1BMTF9XUl9FTgkJCSgxIDw8IDcpCisjZGVmaW5lIFIxMjhfQ09OU1RBTlRfQ09MT1JfQwkJMHgxZDM0CisjZGVmaW5lIFIxMjhfQ1JUQ19PRkZTRVQJCTB4MDIyNAorI2RlZmluZSBSMTI4X0NSVENfT0ZGU0VUX0NOVEwJCTB4MDIyOAorIwlkZWZpbmUgUjEyOF9DUlRDX09GRlNFVF9GTElQX0NOVEwJKDEgPDwgMTYpCisKKyNkZWZpbmUgUjEyOF9EUF9HVUlfTUFTVEVSX0NOVEwJCTB4MTQ2YworIyAgICAgICBkZWZpbmUgUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCSgxICAgIDw8ICAwKQorIyAgICAgICBkZWZpbmUgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMCSgxICAgIDw8ICAxKQorIwlkZWZpbmUgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IJKDEzICAgPDwgIDQpCisjCWRlZmluZSBSMTI4X0dNQ19CUlVTSF9OT05FCQkoMTUgICA8PCAgNCkKKyMJZGVmaW5lIFIxMjhfR01DX0RTVF8xNkJQUAkJKDQgICAgPDwgIDgpCisjCWRlZmluZSBSMTI4X0dNQ19EU1RfMjRCUFAJCSg1ICAgIDw8ICA4KQorIwlkZWZpbmUgUjEyOF9HTUNfRFNUXzMyQlBQCQkoNiAgICA8PCAgOCkKKyMgICAgICAgZGVmaW5lIFIxMjhfR01DX0RTVF9EQVRBVFlQRV9TSElGVAk4CisjCWRlZmluZSBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IJKDMgICAgPDwgMTIpCisjCWRlZmluZSBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZCSgyICAgIDw8IDI0KQorIwlkZWZpbmUgUjEyOF9EUF9TUkNfU09VUkNFX0hPU1RfREFUQQkoMyAgICA8PCAyNCkKKyMJZGVmaW5lIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMJKDEgICAgPDwgMjgpCisjCWRlZmluZSBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMJCSgxICAgIDw8IDI5KQorIwlkZWZpbmUgUjEyOF9HTUNfV1JfTVNLX0RJUwkJKDEgICAgPDwgMzApCisjCWRlZmluZSBSMTI4X1JPUDNfUwkJCTB4MDBjYzAwMDAKKyMJZGVmaW5lIFIxMjhfUk9QM19QCQkJMHgwMGYwMDAwMAorI2RlZmluZSBSMTI4X0RQX1dSSVRFX01BU0sJCTB4MTZjYworI2RlZmluZSBSMTI4X0RTVF9QSVRDSF9PRkZTRVRfQwkJMHgxYzgwCisjCWRlZmluZSBSMTI4X0RTVF9USUxFCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9HRU5fSU5UX0NOVEwJCTB4MDA0MAorIwlkZWZpbmUgUjEyOF9DUlRDX1ZCTEFOS19JTlRfRU4JCSgxIDw8ICAwKQorI2RlZmluZSBSMTI4X0dFTl9JTlRfU1RBVFVTCQkweDAwNDQKKyMJZGVmaW5lIFIxMjhfQ1JUQ19WQkxBTktfSU5UCQkoMSA8PCAgMCkKKyMJZGVmaW5lIFIxMjhfQ1JUQ19WQkxBTktfSU5UX0FLCQkoMSA8PCAgMCkKKyNkZWZpbmUgUjEyOF9HRU5fUkVTRVRfQ05UTAkJMHgwMGYwCisjCWRlZmluZSBSMTI4X1NPRlRfUkVTRVRfR1VJCQkoMSA8PCAgMCkKKworI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzAJCTB4MTVlMAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzEJCTB4MTVlNAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzIJCTB4MTVlOAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzMJCTB4MTVlYworI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzQJCTB4MTVmMAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzUJCTB4MTVmNAorCisjZGVmaW5lIFIxMjhfR1VJX1NUQVQJCQkweDE3NDAKKyMJZGVmaW5lIFIxMjhfR1VJX0ZJRk9DTlRfTUFTSwkJMHgwZmZmCisjCWRlZmluZSBSMTI4X0dVSV9BQ1RJVkUJCQkoMSA8PCAzMSkKKworI2RlZmluZSBSMTI4X01DTEtfQ05UTAkJCTB4MDAwZgorIwlkZWZpbmUgUjEyOF9GT1JDRV9HQ1AJCQkoMSA8PCAxNikKKyMJZGVmaW5lIFIxMjhfRk9SQ0VfUElQRTNEX0NQCQkoMSA8PCAxNykKKyMJZGVmaW5lIFIxMjhfRk9SQ0VfUkNQCQkJKDEgPDwgMTgpCisKKyNkZWZpbmUgUjEyOF9QQ19HVUlfQ1RMU1RBVAkJMHgxNzQ4CisjZGVmaW5lIFIxMjhfUENfTkdVSV9DVExTVEFUCQkweDAxODQKKyMJZGVmaW5lIFIxMjhfUENfRkxVU0hfR1VJCQkoMyA8PCAwKQorIwlkZWZpbmUgUjEyOF9QQ19SSV9HVUkJCQkoMSA8PCAyKQorIwlkZWZpbmUgUjEyOF9QQ19GTFVTSF9BTEwJCTB4MDBmZgorIwlkZWZpbmUgUjEyOF9QQ19CVVNZCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9QQ0lfR0FSVF9QQUdFCQkweDAxN2MKKyNkZWZpbmUgUjEyOF9QUklNX1RFWF9DTlRMX0MJCTB4MWNiMAorCisjZGVmaW5lIFIxMjhfU0NBTEVfM0RfQ05UTAkJMHgxYTAwCisjZGVmaW5lIFIxMjhfU0VDX1RFWF9DTlRMX0MJCTB4MWQwMAorI2RlZmluZSBSMTI4X1NFQ19URVhUVVJFX0JPUkRFUl9DT0xPUl9DCTB4MWQzYworI2RlZmluZSBSMTI4X1NFVFVQX0NOVEwJCQkweDFiYzQKKyNkZWZpbmUgUjEyOF9TVEVOX1JFRl9NQVNLX0MJCTB4MWQ0MAorCisjZGVmaW5lIFIxMjhfVEVYX0NOVExfQwkJCTB4MWM5YworIwlkZWZpbmUgUjEyOF9URVhfQ0FDSEVfRkxVU0gJCSgxIDw8IDIzKQorCisjZGVmaW5lIFIxMjhfV0FJVF9VTlRJTAkJCTB4MTcyMAorIwlkZWZpbmUgUjEyOF9FVkVOVF9DUlRDX09GRlNFVAkJKDEgPDwgMCkKKyNkZWZpbmUgUjEyOF9XSU5ET1dfWFlfT0ZGU0VUCQkweDFiY2MKKworCisvKiBDQ0UgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX09GRlNFVAkJMHgwNzAwCisjZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9DTlRMCQkweDA3MDQKKyMJZGVmaW5lIFIxMjhfUE00X01BU0sJCQkoMTUgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF9OT05QTTQJCQkoMCAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF8xOTJQSU8JCQkoMSAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF8xOTJCTQkJCSgyICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzEyOFBJT182NElOREJNCQkoMyAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF8xMjhCTV82NElOREJNCQkoNCAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NFBJT18xMjhJTkRCTQkJKDUgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfNjRCTV8xMjhJTkRCTQkJKDYgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfNjRQSU9fNjRWQ0JNXzY0SU5EQk0JKDcgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfNjRCTV82NFZDQk1fNjRJTkRCTQkoOCAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NFBJT182NFZDUElPXzY0SU5EUElPCSgxNSA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9DTlRMX05PVVBEQVRFCSgxICA8PCAyNykKKworI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfV01fQ05UTAkJMHgwNzA4CisjCWRlZmluZSBSMTI4X1dNQV9TSElGVAkJCTAKKyMJZGVmaW5lIFIxMjhfV01CX1NISUZUCQkJOAorIwlkZWZpbmUgUjEyOF9XTUNfU0hJRlQJCQkxNgorIwlkZWZpbmUgUjEyOF9XQl9XTV9TSElGVAkJCTI0CisKKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFJfQUREUgkweDA3MGMKKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIJCTB4MDcxMAorI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUgkJMHgwNzE0CisjCWRlZmluZSBSMTI4X1BNNF9CVUZGRVJfRExfRE9ORQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9QTTRfVkNfRlBVX1NFVFVQCQkweDA3MWMKKworI2RlZmluZSBSMTI4X1BNNF9JV19JTkRPRkYJCTB4MDczOAorI2RlZmluZSBSMTI4X1BNNF9JV19JTkRTSVpFCQkweDA3M2MKKworI2RlZmluZSBSMTI4X1BNNF9TVEFUCQkJMHgwN2I4CisjCWRlZmluZSBSMTI4X1BNNF9GSUZPQ05UX01BU0sJCTB4MGZmZgorIwlkZWZpbmUgUjEyOF9QTTRfQlVTWQkJCSgxIDw8IDE2KQorIwlkZWZpbmUgUjEyOF9QTTRfR1VJX0FDVElWRQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9DT0RFX0FERFIJCTB4MDdkNAorI2RlZmluZSBSMTI4X1BNNF9NSUNST0NPREVfUkFERFIJMHgwN2Q4CisjZGVmaW5lIFIxMjhfUE00X01JQ1JPQ09ERV9EQVRBSAkweDA3ZGMKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFMCTB4MDdlMAorCisjZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9BRERSCQkweDA3ZjAKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9fQ05UTAkJMHgwN2ZjCisjCWRlZmluZSBSMTI4X1BNNF9NSUNST19GUkVFUlVOCQkoMSA8PCAzMCkKKworI2RlZmluZSBSMTI4X1BNNF9GSUZPX0RBVEFfRVZFTgkJMHgxMDAwCisjZGVmaW5lIFIxMjhfUE00X0ZJRk9fREFUQV9PREQJCTB4MTAwNAorCisKKy8qIENDRSBjb21tYW5kIHBhY2tldHMKKyAqLworI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQwCQkweDAwMDAwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDEJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUjEyOF9DQ0VfUEFDS0VUMgkJMHg4MDAwMDAwMAorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQzCQkweEMwMDAwMDAwCisjCWRlZmluZSBSMTI4X0NOVExfSE9TVERBVEFfQkxUCQkweDAwMDA5NDAwCisjCWRlZmluZSBSMTI4X0NOVExfUEFJTlRfTVVMVEkJCTB4MDAwMDlBMDAKKyMJZGVmaW5lIFIxMjhfQ05UTF9CSVRCTFRfTVVMVEkJCTB4MDAwMDlCMDAKKyMJZGVmaW5lIFIxMjhfM0RfUk5EUl9HRU5fSU5EWF9QUklNCTB4MDAwMDIzMDAKKworI2RlZmluZSBSMTI4X0NDRV9QQUNLRVRfTUFTSwkJMHhDMDAwMDAwMAorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVRfQ09VTlRfTUFTSwkweDNmZmYwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDBfUkVHX01BU0sJMHgwMDAwMDdmZgorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQxX1JFRzBfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDFfUkVHMV9NQVNLCTB4MDAzZmY4MDAKKworI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1BPSU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1RZUEVfTElORQkJMHgwMDAwMDAwMgorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9QT0xZX0xJTkUJMHgwMDAwMDAwMworI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfTElTVAkweDAwMDAwMDA0CisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1RSSV9GQU4JMHgwMDAwMDAwNQorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfU1RSSVAJMHgwMDAwMDAwNgorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfVFlQRTIJMHgwMDAwMDAwNworI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19JTkQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1dBTEtfTElTVAkJMHgwMDAwMDAyMAorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19SSU5HCQkweDAwMDAwMDMwCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfTlVNX1NISUZUCQkxNgorCisjZGVmaW5lIFIxMjhfREFUQVRZUEVfVlEJCTAKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9DSTQJCTEKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9DSTgJCTIKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9BUkdCMTU1NQkJMworI2RlZmluZSBSMTI4X0RBVEFUWVBFX1JHQjU2NQkJNAorI2RlZmluZSBSMTI4X0RBVEFUWVBFX1JHQjg4OAkJNQorI2RlZmluZSBSMTI4X0RBVEFUWVBFX0FSR0I4ODg4CQk2CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfUkdCMzMyCQk3CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfWTgJCTgKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9SR0I4CQk5CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfQ0kxNgkJMTAKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9ZVllVNDIyCQkxMQorI2RlZmluZSBSMTI4X0RBVEFUWVBFX1ZZVVk0MjIJCTEyCisjZGVmaW5lIFIxMjhfREFUQVRZUEVfQVlVVjQ0NAkJMTQKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9BUkdCNDQ0NAkJMTUKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIFIxMjhfQUdQX09GRlNFVAkJCTB4MDIwMDAwMDAKKworI2RlZmluZSBSMTI4X1dBVEVSTUFSS19MCQkxNgorI2RlZmluZSBSMTI4X1dBVEVSTUFSS19NCQk4CisjZGVmaW5lIFIxMjhfV0FURVJNQVJLX04JCTgKKyNkZWZpbmUgUjEyOF9XQVRFUk1BUktfSwkJMTI4CisKKyNkZWZpbmUgUjEyOF9NQVhfVVNFQ19USU1FT1VUCQkxMDAwMDAJLyogMTAwIG1zICovCisKKyNkZWZpbmUgUjEyOF9MQVNUX0ZSQU1FX1JFRwkJUjEyOF9HVUlfU0NSQVRDSF9SRUcwCisjZGVmaW5lIFIxMjhfTEFTVF9ESVNQQVRDSF9SRUcJCVIxMjhfR1VJX1NDUkFUQ0hfUkVHMQorI2RlZmluZSBSMTI4X01BWF9WQl9BR0UJCQkweDdmZmZmZmZmCisjZGVmaW5lIFIxMjhfTUFYX1ZCX1ZFUlRTCQkoMHhmZmZmKQorCisjZGVmaW5lIFIxMjhfUklOR19ISUdIX01BUksJCTEyOAorCisjZGVmaW5lIFIxMjhfUEVSRk9STUFOQ0VfQk9YRVMJCTAKKworI2RlZmluZSBSMTI4X1JFQUQocmVnKQkJRFJNX1JFQUQzMiggIGRldl9wcml2LT5tbWlvLCAocmVnKSApCisjZGVmaW5lIFIxMjhfV1JJVEUocmVnLHZhbCkJRFJNX1dSSVRFMzIoIGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkgKQorI2RlZmluZSBSMTI4X1JFQUQ4KHJlZykJCURSTV9SRUFEOCggICBkZXZfcHJpdi0+bW1pbywgKHJlZykgKQorI2RlZmluZSBSMTI4X1dSSVRFOChyZWcsdmFsKQlEUk1fV1JJVEU4KCAgZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSApCisKKyNkZWZpbmUgUjEyOF9XUklURV9QTEwoYWRkcix2YWwpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCVIxMjhfV1JJVEU4KFIxMjhfQ0xPQ0tfQ05UTF9JTkRFWCwJCQkJXAorCQkgICAgKChhZGRyKSAmIDB4MWYpIHwgUjEyOF9QTExfV1JfRU4pOwkJCVwKKwlSMTI4X1dSSVRFKFIxMjhfQ0xPQ0tfQ05UTF9EQVRBLCAodmFsKSk7CQkJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIENDRV9QQUNLRVQwKCByZWcsIG4gKQkJKFIxMjhfQ0NFX1BBQ0tFVDAgfAkJXAorCQkJCQkgKChuKSA8PCAxNikgfCAoKHJlZykgPj4gMikpCisjZGVmaW5lIENDRV9QQUNLRVQxKCByZWcwLCByZWcxICkJKFIxMjhfQ0NFX1BBQ0tFVDEgfAkJXAorCQkJCQkgKCgocmVnMSkgPj4gMikgPDwgMTEpIHwgKChyZWcwKSA+PiAyKSkKKyNkZWZpbmUgQ0NFX1BBQ0tFVDIoKQkJCShSMTI4X0NDRV9QQUNLRVQyKQorI2RlZmluZSBDQ0VfUEFDS0VUMyggcGt0LCBuICkJCShSMTI4X0NDRV9QQUNLRVQzIHwJCVwKKwkJCQkJIChwa3QpIHwgKChuKSA8PCAxNikpCisKKworc3RhdGljIF9faW5saW5lX18gdm9pZAorcjEyOF91cGRhdGVfcmluZ19zbmFwc2hvdCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfcmluZ19idWZmZXJfdCAqcmluZyA9ICZkZXZfcHJpdi0+cmluZzsKKwlyaW5nLT5zcGFjZSA9IChHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApIC0gcmluZy0+dGFpbCkgKiBzaXplb2YodTMyKTsKKwlpZiAoIHJpbmctPnNwYWNlIDw9IDAgKQorCQlyaW5nLT5zcGFjZSArPSByaW5nLT5zaXplOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNaXNjIGhlbHBlciBtYWNyb3MKKyAqLworCisjZGVmaW5lIFJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7IGludCBpOwkJXAorCWlmICggcmluZy0+c3BhY2UgPCByaW5nLT5oaWdoX21hcmsgKSB7CQkJCVwKKwkJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsJXAorCQkJcjEyOF91cGRhdGVfcmluZ19zbmFwc2hvdCggZGV2X3ByaXYgKTsJCVwKKwkJCWlmICggcmluZy0+c3BhY2UgPj0gcmluZy0+aGlnaF9tYXJrICkJCVwKKwkJCQlnb3RvIF9fcmluZ19zcGFjZV9kb25lOwkJCVwKKwkJCURSTV9VREVMQVkoMSk7CQkJCVwKKwkJfQkJCQkJCQlcCisJCURSTV9FUlJPUiggInJpbmcgc3BhY2UgY2hlY2sgZmFpbGVkIVxuIiApOwkJXAorCQlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CQkJCVwKKwl9CQkJCQkJCQlcCisgX19yaW5nX3NwYWNlX2RvbmU6CQkJCQkJCVwKKwk7CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwkJXAorCWlmICggc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA+PSBSMTI4X01BWF9WQl9BR0UgKSB7CQlcCisJCWludCBfX3JldCA9IHIxMjhfZG9fY2NlX2lkbGUoIGRldl9wcml2ICk7CQlcCisJCWlmICggX19yZXQgKSByZXR1cm4gX19yZXQ7CQkJCVwKKwkJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IDA7CQkJCVwKKwkJcjEyOF9mcmVlbGlzdF9yZXNldCggZGV2ICk7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFIxMjhfV0FJVF9VTlRJTF9QQUdFX0ZMSVBQRUQoKSBkbyB7CQkJCVwKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfV0FJVF9VTlRJTCwgMCApICk7CQkJXAorCU9VVF9SSU5HKCBSMTI4X0VWRU5UX0NSVENfT0ZGU0VUICk7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmluZyBjb250cm9sCisgKi8KKworI2RlZmluZSBSMTI4X1ZFUkJPU0UJMAorCisjZGVmaW5lIFJJTkdfTE9DQUxTCQkJCQkJCVwKKwlpbnQgd3JpdGUsIF9ucjsgdW5zaWduZWQgaW50IHRhaWxfbWFzazsgdm9sYXRpbGUgdTMyICpyaW5nOworCisjZGVmaW5lIEJFR0lOX1JJTkcoIG4gKSBkbyB7CQkJCQkJXAorCWlmICggUjEyOF9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJCRUdJTl9SSU5HKCAlZCApIGluICVzXG4iLAkJCVwKKwkJCSAgIChuKSwgX19GVU5DVElPTl9fICk7CQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCBkZXZfcHJpdi0+cmluZy5zcGFjZSA8PSAobikgKiBzaXplb2YodTMyKSApIHsJCVwKKwkJQ09NTUlUX1JJTkcoKTsJCQkJCQlcCisJCXIxMjhfd2FpdF9yaW5nKCBkZXZfcHJpdiwgKG4pICogc2l6ZW9mKHUzMikgKTsJCVwKKwl9CQkJCQkJCQlcCisJX25yID0gbjsgZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gKG4pICogc2l6ZW9mKHUzMik7CQlcCisJcmluZyA9IGRldl9wcml2LT5yaW5nLnN0YXJ0OwkJCQkJXAorCXdyaXRlID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKKwl0YWlsX21hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFlvdSBjYW4gc2V0IHRoaXMgdG8gemVybyBpZiB5b3Ugd2FudC4gIElmIHRoZSBjYXJkIGxvY2tzIHVwLCB5b3UnbGwKKyAqIG5lZWQgdG8ga2VlcCB0aGlzIHNldC4gIEl0IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBlYXJseSByZXZzIG9mIHRoZQorICogUmFnZSAxMjggY2hpcHNldCwgd2hlcmUgdGhlIENDRSB3b3VsZCByZWFkIDMyIGR3b3JkcyBwYXN0IHRoZSBlbmQgb2YKKyAqIHRoZSByaW5nIGJ1ZmZlciBiZWZvcmUgd3JhcHBpbmcgYXJvdW5kLgorICovCisjZGVmaW5lIFIxMjhfQlJPS0VOX0NDRQkxCisKKyNkZWZpbmUgQURWQU5DRV9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQURWQU5DRV9SSU5HKCkgd3I9MHglMDZ4IHRhaWw9MHglMDZ4XG4iLAlcCisJCQkgIHdyaXRlLCBkZXZfcHJpdi0+cmluZy50YWlsICk7CQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoIFIxMjhfQlJPS0VOX0NDRSAmJiB3cml0ZSA8IDMyICkgewkJCQlcCisJCW1lbWNweSggZGV2X3ByaXYtPnJpbmcuZW5kLAkJCQlcCisJCQlkZXZfcHJpdi0+cmluZy5zdGFydCwJCQkJXAorCQkJd3JpdGUgKiBzaXplb2YodTMyKSApOwkJCQlcCisJfQkJCQkJCQkJXAorCWlmICgoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgdGFpbF9tYXNrKSAhPSB3cml0ZSkgewlcCisJCURSTV9FUlJPUiggCQkJCQkJXAorCQkJIkFEVkFOQ0VfUklORygpOiBtaXNtYXRjaDogbnI6ICV4IHdyaXRlOiAleCBsaW5lOiAlZFxuIiwJXAorCQkJKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIHRhaWxfbWFzayksCVwKKwkJCXdyaXRlLCBfX0xJTkVfXyk7CQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJZGV2X3ByaXYtPnJpbmcudGFpbCA9IHdyaXRlOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTU1JVF9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQ09NTUlUX1JJTkcoKSB0YWlsPTB4JTA2eFxuIiwJCVwKKwkJCWRldl9wcml2LT5yaW5nLnRhaWwgKTsJCQkJXAorCX0JCQkJCQkJCVwKKwlEUk1fTUVNT1JZQkFSUklFUigpOwkJCQkJCVwKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiwgZGV2X3ByaXYtPnJpbmcudGFpbCApOwlcCisJUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiApOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVF9SSU5HKCB4ICkgZG8gewkJCQkJCVwKKwlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiICAgT1VUX1JJTkcoIDB4JTA4eCApIGF0IDB4JXhcbiIsCQlcCisJCQkgICAodW5zaWduZWQgaW50KSh4KSwgd3JpdGUgKTsJCQlcCisJfQkJCQkJCQkJXAorCXJpbmdbd3JpdGUrK10gPSBjcHVfdG9fbGUzMiggeCApOwkJCQlcCisJd3JpdGUgJj0gdGFpbF9tYXNrOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX1IxMjhfRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0M2EzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIHIxMjhfaXJxLmMgLS0gSVJRIGhhbmRsaW5nIGZvciByYWRlb24gLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQorICogaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBSYWRlb24gODUwMCBkcml2ZXIgdW5kZXIgdGhlIFhGcmVlODYgbGljZW5zZS4KKyAqIFRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogICAgRXJpYyBBbmhvbHQgPGFuaG9sdEBGcmVlQlNELm9yZz4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInIxMjhfZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcnYuaCIKKworaXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yMTI4X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IFIxMjhfUkVBRCggUjEyOF9HRU5fSU5UX1NUQVRVUyApOworCQorCS8qIFZCTEFOSyBpbnRlcnJ1cHQgKi8KKwlpZiAoIHN0YXR1cyAmIFIxMjhfQ1JUQ19WQkxBTktfSU5UICkgeworCQlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfU1RBVFVTLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9BSyApOworCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRldiApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK30KKworaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOworCWludCByZXQgPSAwOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHVzZXIgaGFzIG1pc3NlZCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIKKwkgKiBieSBhYm91dCBhIGRheSByYXRoZXIgdGhhbiBzaGUgd2FudHMgdG8gd2FpdCBmb3IgeWVhcnMKKwkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4gCisJICovCisJRFJNX1dBSVRfT04oIHJldCwgZGV2LT52YmxfcXVldWUsIDMqRFJNX0haLCAKKwkJICAgICAoICggKCBjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkICkgKQorCQkJIC0gKnNlcXVlbmNlICkgPD0gKDE8PDIzKSApICk7CisKKwkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisgIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yMTI4X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKyAgICAgIAlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfQ05UTCwgMCApOworCS8qIENsZWFyIHZibGFuayBiaXQgaWYgaXQncyBhbHJlYWR5IGhpZ2ggKi8KKyAgIAlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfU1RBVFVTLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9BSyApOworfQorCit2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisgIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yMTI4X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBUdXJuIG9uIFZCTCBpbnRlcnJ1cHQgKi8KKyAgIAlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfQ05UTCwgUjEyOF9DUlRDX1ZCTEFOS19JTlRfRU4gKTsKK30KKwordm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKyAgCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3IxMjhfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKwlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfQ05UTCwgMCApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGIzY2JkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKQEAgLTAsMCArMSwxNzMyIEBACisvKiByMTI4X3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgcjEyOCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFRodSBKYW4gMjcgMDI6NTM6NDMgMjAwMCBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKyNpbmNsdWRlICJyMTI4X2Rydi5oIgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENDRSBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCByMTI4X2VtaXRfY2xpcF9yZWN0cyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgIGRybV9jbGlwX3JlY3RfdCAqYm94ZXMsIGludCBjb3VudCApCit7CisJdTMyIGF1eF9zY19jbnRsID0gMHgwMDAwMDAwMDsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggKGNvdW50IDwgMz8gY291bnQ6IDMpICogNSArIDIgKTsKKworCWlmICggY291bnQgPj0gMSApIHsKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0FVWDFfU0NfTEVGVCwgMyApICk7CisJCU9VVF9SSU5HKCBib3hlc1swXS54MSApOworCQlPVVRfUklORyggYm94ZXNbMF0ueDIgLSAxICk7CisJCU9VVF9SSU5HKCBib3hlc1swXS55MSApOworCQlPVVRfUklORyggYm94ZXNbMF0ueTIgLSAxICk7CisKKwkJYXV4X3NjX2NudGwgfD0gKFIxMjhfQVVYMV9TQ19FTiB8IFIxMjhfQVVYMV9TQ19NT0RFX09SKTsKKwl9CisJaWYgKCBjb3VudCA+PSAyICkgeworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQVVYMl9TQ19MRUZULCAzICkgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzFdLngxICk7CisJCU9VVF9SSU5HKCBib3hlc1sxXS54MiAtIDEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzFdLnkxICk7CisJCU9VVF9SSU5HKCBib3hlc1sxXS55MiAtIDEgKTsKKworCQlhdXhfc2NfY250bCB8PSAoUjEyOF9BVVgyX1NDX0VOIHwgUjEyOF9BVVgyX1NDX01PREVfT1IpOworCX0KKwlpZiAoIGNvdW50ID49IDMgKSB7CisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9BVVgzX1NDX0xFRlQsIDMgKSApOworCQlPVVRfUklORyggYm94ZXNbMl0ueDEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzJdLngyIC0gMSApOworCQlPVVRfUklORyggYm94ZXNbMl0ueTEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzJdLnkyIC0gMSApOworCisJCWF1eF9zY19jbnRsIHw9IChSMTI4X0FVWDNfU0NfRU4gfCBSMTI4X0FVWDNfU0NfTU9ERV9PUik7CisJfQorCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0FVWF9TQ19DTlRMLCAwICkgKTsKKwlPVVRfUklORyggYXV4X3NjX2NudGwgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9jb3JlKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfU0NBTEVfM0RfQ05UTCwgMCApICk7CisJT1VUX1JJTkcoIGN0eC0+c2NhbGVfM2RfY250bCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X2NvbnRleHQoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDEzICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfRFNUX1BJVENIX09GRlNFVF9DLCAxMSApICk7CisJT1VUX1JJTkcoIGN0eC0+ZHN0X3BpdGNoX29mZnNldF9jICk7CisJT1VUX1JJTkcoIGN0eC0+ZHBfZ3VpX21hc3Rlcl9jbnRsX2MgKTsKKwlPVVRfUklORyggY3R4LT5zY190b3BfbGVmdF9jICk7CisJT1VUX1JJTkcoIGN0eC0+c2NfYm90dG9tX3JpZ2h0X2MgKTsKKwlPVVRfUklORyggY3R4LT56X29mZnNldF9jICk7CisJT1VUX1JJTkcoIGN0eC0+el9waXRjaF9jICk7CisJT1VUX1JJTkcoIGN0eC0+el9zdGVuX2NudGxfYyApOworCU9VVF9SSU5HKCBjdHgtPnRleF9jbnRsX2MgKTsKKwlPVVRfUklORyggY3R4LT5taXNjXzNkX3N0YXRlX2NudGxfcmVnICk7CisJT1VUX1JJTkcoIGN0eC0+dGV4dHVyZV9jbHJfY21wX2Nscl9jICk7CisJT1VUX1JJTkcoIGN0eC0+dGV4dHVyZV9jbHJfY21wX21za19jICk7CisJT1VUX1JJTkcoIGN0eC0+Zm9nX2NvbG9yX2MgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9zZXR1cCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggMyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQxKCBSMTI4X1NFVFVQX0NOVEwsIFIxMjhfUE00X1ZDX0ZQVV9TRVRVUCApICk7CisJT1VUX1JJTkcoIGN0eC0+c2V0dXBfY250bCApOworCU9VVF9SSU5HKCBjdHgtPnBtNF92Y19mcHVfc2V0dXAgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9tYXNrcyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggNSApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0RQX1dSSVRFX01BU0ssIDAgKSApOworCU9VVF9SSU5HKCBjdHgtPmRwX3dyaXRlX21hc2sgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9TVEVOX1JFRl9NQVNLX0MsIDEgKSApOworCU9VVF9SSU5HKCBjdHgtPnN0ZW5fcmVmX21hc2tfYyApOworCU9VVF9SSU5HKCBjdHgtPnBsYW5lXzNkX21hc2tfYyApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3dpbmRvdyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1dJTkRPV19YWV9PRkZTRVQsIDAgKSApOworCU9VVF9SSU5HKCBjdHgtPndpbmRvd194eV9vZmZzZXQgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF90ZXgwKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9yMTI4X3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzBdOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCA3ICsgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9QUklNX1RFWF9DTlRMX0MsCisJCQkgICAgICAgMiArIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTICkgKTsKKwlPVVRfUklORyggdGV4LT50ZXhfY250bCApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9jb21iaW5lX2NudGwgKTsKKwlPVVRfUklORyggY3R4LT50ZXhfc2l6ZV9waXRjaF9jICk7CisJZm9yICggaSA9IDAgOyBpIDwgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgOyBpKysgKSB7CisJCU9VVF9SSU5HKCB0ZXgtPnRleF9vZmZzZXRbaV0gKTsKKwl9CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQ09OU1RBTlRfQ09MT1JfQywgMSApICk7CisJT1VUX1JJTkcoIGN0eC0+Y29uc3RhbnRfY29sb3JfYyApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9ib3JkZXJfY29sb3IgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF90ZXgxKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMV07CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDUgKyBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1NFQ19URVhfQ05UTF9DLAorCQkJICAgICAgIDEgKyBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyApICk7CisJT1VUX1JJTkcoIHRleC0+dGV4X2NudGwgKTsKKwlPVVRfUklORyggdGV4LT50ZXhfY29tYmluZV9jbnRsICk7CisJZm9yICggaSA9IDAgOyBpIDwgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgOyBpKysgKSB7CisJCU9VVF9SSU5HKCB0ZXgtPnRleF9vZmZzZXRbaV0gKTsKKwl9CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfU0VDX1RFWFRVUkVfQk9SREVSX0NPTE9SX0MsIDAgKSApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9ib3JkZXJfY29sb3IgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9zdGF0ZSggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBkaXJ0eSA9IHNhcmVhX3ByaXYtPmRpcnR5OworCisJRFJNX0RFQlVHKCAiJXM6IGRpcnR5PTB4JTA4eFxuIiwgX19GVU5DVElPTl9fLCBkaXJ0eSApOworCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX0NPUkUgKSB7CisJCXIxMjhfZW1pdF9jb3JlKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfQ09SRTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfQ09OVEVYVCApIHsKKwkJcjEyOF9lbWl0X2NvbnRleHQoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9DT05URVhUOworCX0KKworCWlmICggZGlydHkgJiBSMTI4X1VQTE9BRF9TRVRVUCApIHsKKwkJcjEyOF9lbWl0X3NldHVwKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfU0VUVVA7CisJfQorCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX01BU0tTICkgeworCQlyMTI4X2VtaXRfbWFza3MoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9NQVNLUzsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfV0lORE9XICkgeworCQlyMTI4X2VtaXRfd2luZG93KCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfV0lORE9XOworCX0KKworCWlmICggZGlydHkgJiBSMTI4X1VQTE9BRF9URVgwICkgeworCQlyMTI4X2VtaXRfdGV4MCggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gflIxMjhfVVBMT0FEX1RFWDA7CisJfQorCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX1RFWDEgKSB7CisJCXIxMjhfZW1pdF90ZXgxKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfVEVYMTsKKwl9CisKKwkvKiBUdXJuIG9mZiB0aGUgdGV4dHVyZSBjYWNoZSBmbHVzaGluZyAqLworCXNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUudGV4X2NudGxfYyAmPSB+UjEyOF9URVhfQ0FDSEVfRkxVU0g7CisKKwlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0U7Cit9CisKKworI2lmIFIxMjhfUEVSRk9STUFOQ0VfQk9YRVMKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcjEyOF9jbGVhcl9ib3goIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICAgaW50IHIsIGludCBnLCBpbnQgYiApCit7CisJdTMyIHBpdGNoLCBvZmZzZXQ7CisJdTMyIGZiX2JwcCwgY29sb3I7CisJUklOR19MT0NBTFM7CisKKwlzd2l0Y2ggKCBkZXZfcHJpdi0+ZmJfYnBwICkgeworCWNhc2UgMTY6CisJCWZiX2JwcCA9IFIxMjhfR01DX0RTVF8xNkJQUDsKKwkJY29sb3IgPSAoKChyICYgMHhmOCkgPDwgOCkgfAorCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwKKwkJCSAoKGIgJiAweGY4KSA+PiAzKSk7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWZiX2JwcCA9IFIxMjhfR01DX0RTVF8yNEJQUDsKKwkJY29sb3IgPSAoKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJZmJfYnBwID0gUjEyOF9HTUNfRFNUXzMyQlBQOworCQljb2xvciA9ICgoKDB4ZmYpIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8ICA4KSB8IGIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJb2Zmc2V0ID0gZGV2X3ByaXYtPmJhY2tfb2Zmc2V0OworCXBpdGNoID0gZGV2X3ByaXYtPmJhY2tfcGl0Y2ggPj4gMzsKKworCUJFR0lOX1JJTkcoIDYgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwlPVVRfUklORyggUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCSAgZmJfYnBwIHwKKwkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkgIFIxMjhfUk9QM19QIHwKKwkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJICBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgKTsKKworCU9VVF9SSU5HKCAocGl0Y2ggPDwgMjEpIHwgKG9mZnNldCA+PiA1KSApOworCU9VVF9SSU5HKCBjb2xvciApOworCisJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX3BlcmZvcm1hbmNlX2JveGVzKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpZiAoIGF0b21pY19yZWFkKCAmZGV2X3ByaXYtPmlkbGVfY291bnQgKSA9PSAwICkgeworCQlyMTI4X2NsZWFyX2JveCggZGV2X3ByaXYsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDAgKTsKKwl9IGVsc2UgeworCQlhdG9taWNfc2V0KCAmZGV2X3ByaXYtPmlkbGVfY291bnQsIDAgKTsKKwl9Cit9CisKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENDRSBjb21tYW5kIGRpc3BhdGNoIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIHIxMjhfcHJpbnRfZGlydHkoIGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIiVzOiAoMHgleCkgJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkgIG1zZywKKwkJICBmbGFncywKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9DT1JFKSAgICAgICAgPyAiY29yZSwgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX0NPTlRFWFQpICAgICA/ICJjb250ZXh0LCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfU0VUVVApICAgICAgID8gInNldHVwLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfVEVYMCkgICAgICAgID8gInRleDAsICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9URVgxKSAgICAgICAgPyAidGV4MSwgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX01BU0tTKSAgICAgICA/ICJtYXNrcywgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX1dJTkRPVykgICAgICA/ICJ3aW5kb3csICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9DTElQUkVDVFMpICAgPyAiY2xpcHJlY3RzLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UpID8gInF1aWVzY2VuY2UsICIgOiAiIiApOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9jbGVhciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICBkcm1fcjEyOF9jbGVhcl90ICpjbGVhciApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbGVhci0+ZmxhZ3M7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKCBkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyAmJiBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBmbGFnczsKKworCQlmbGFncyAmPSB+KFIxMjhfRlJPTlQgfCBSMTI4X0JBQ0spOworCQlpZiAoIHRtcCAmIFIxMjhfRlJPTlQgKSBmbGFncyB8PSBSMTI4X0JBQ0s7CisJCWlmICggdG1wICYgUjEyOF9CQUNLICkgIGZsYWdzIHw9IFIxMjhfRlJPTlQ7CisJfQorCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJaW50IHggPSBwYm94W2ldLngxOworCQlpbnQgeSA9IHBib3hbaV0ueTE7CisJCWludCB3ID0gcGJveFtpXS54MiAtIHg7CisJCWludCBoID0gcGJveFtpXS55MiAtIHk7CisKKwkJRFJNX0RFQlVHKCAiZGlzcGF0Y2ggY2xlYXIgJWQsJWQtJWQsJWQgZmxhZ3MgMHgleFxuIiwKKwkJCSAgIHBib3hbaV0ueDEsIHBib3hbaV0ueTEsIHBib3hbaV0ueDIsCisJCQkgICBwYm94W2ldLnkyLCBmbGFncyApOworCisJCWlmICggZmxhZ3MgJiAoUjEyOF9GUk9OVCB8IFIxMjhfQkFDSykgKSB7CisJCQlCRUdJTl9SSU5HKCAyICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9EUF9XUklURV9NQVNLLCAwICkgKTsKKwkJCU9VVF9SSU5HKCBjbGVhci0+Y29sb3JfbWFzayApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSMTI4X0ZST05UICkgeworCQkJQkVHSU5fUklORyggNiApOworCisJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7CisJCQlPVVRfUklORyggUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCQkgIFIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQkgIFIxMjhfR01DX0FVWF9DTElQX0RJUyApOworCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggY2xlYXItPmNsZWFyX2NvbG9yICk7CisKKwkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSMTI4X0JBQ0sgKSB7CisJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkgIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfQVVYX0NMSVBfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyApOworCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOworCisJCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgUjEyOF9ERVBUSCApIHsKKwkJCUJFR0lOX1JJTkcoIDYgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCSAgUjEyOF9ST1AzX1AgfAorCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJICBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggY2xlYXItPmNsZWFyX2RlcHRoICk7CisKKwkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3dhcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisjaWYgUjEyOF9QRVJGT1JNQU5DRV9CT1hFUworCS8qIERvIHNvbWUgdHJpdmlhbCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLi4uCisJICovCisJcjEyOF9jY2VfcGVyZm9ybWFuY2VfYm94ZXMoIGRldl9wcml2ICk7CisjZW5kaWYKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWludCB4ID0gcGJveFtpXS54MTsKKwkJaW50IHkgPSBwYm94W2ldLnkxOworCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OworCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OworCisJCUJFR0lOX1JJTkcoIDcgKTsKKworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOworCQlPVVRfUklORyggUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfQlJVU0hfTk9ORSB8CisJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSAgUjEyOF9ST1AzX1MgfAorCQkJICBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgIFIxMjhfR01DX0FVWF9DTElQX0RJUyB8CisJCQkgIFIxMjhfR01DX1dSX01TS19ESVMgKTsKKworCQkvKiBNYWtlIHRoaXMgd29yayBldmVuIGlmIGZyb250ICYgYmFjayBhcmUgZmxpcHBlZDoKKwkJICovCisJCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXRfYyApOworCQl9IAorCQllbHNlIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyApOworCQl9CisKKwkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOworCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRlJBTUVfUkVHLCAwICkgKTsKKwlPVVRfUklORyggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKKwkJX19GVU5DVElPTl9fLAorCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSk7CisKKyNpZiBSMTI4X1BFUkZPUk1BTkNFX0JPWEVTCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlyMTI4X2NjZV9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCisJQkVHSU5fUklORyggNCApOworCisJUjEyOF9XQUlUX1VOVElMX1BBR0VfRkxJUFBFRCgpOworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9DUlRDX09GRlNFVCwgMCApICk7CisKKwlpZiAoIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCApIHsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJfQorCisJQURWQU5DRV9SSU5HKCk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9CisJCQkJCSAgICAgIDEgLSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRlJBTUVfUkVHLCAwICkgKTsKKwlPVVRfUklORyggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF92ZXJ0ZXgoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgIGRybV9idWZfdCAqYnVmICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBmb3JtYXQgPSBzYXJlYV9wcml2LT52Y19mb3JtYXQ7CisJaW50IG9mZnNldCA9IGJ1Zi0+YnVzX2FkZHJlc3M7CisJaW50IHNpemUgPSBidWYtPnVzZWQ7CisJaW50IHByaW0gPSBidWZfcHJpdi0+cHJpbTsKKwlpbnQgaSA9IDA7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiYnVmPSVkIG5ib3g9JWRcbiIsIGJ1Zi0+aWR4LCBzYXJlYV9wcml2LT5uYm94ICk7CisKKwlpZiAoIDAgKQorCQlyMTI4X3ByaW50X2RpcnR5KCAiZGlzcGF0Y2hfdmVydGV4Iiwgc2FyZWFfcHJpdi0+ZGlydHkgKTsKKworCWlmICggYnVmLT51c2VkICkgeworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CisKKwkJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SMTI4X1VQTE9BRF9DTElQUkVDVFMgKSB7CisJCQlyMTI4X2VtaXRfc3RhdGUoIGRldl9wcml2ICk7CisJCX0KKworCQlkbyB7CisJCQkvKiBFbWl0IHRoZSBuZXh0IHNldCBvZiB1cCB0byB0aHJlZSBjbGlwcmVjdHMgKi8KKwkJCWlmICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKSB7CisJCQkJcjEyOF9lbWl0X2NsaXBfcmVjdHMoIGRldl9wcml2LAorCQkJCQkJICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldLAorCQkJCQkJICAgICAgc2FyZWFfcHJpdi0+bmJveCAtIGkgKTsKKwkJCX0KKworCQkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciByZW5kZXJpbmcgY29tbWFuZHMgKi8KKwkJCUJFR0lOX1JJTkcoIDUgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4XzNEX1JORFJfR0VOX0lORFhfUFJJTSwgMyApICk7CisJCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCQlPVVRfUklORyggc2l6ZSApOworCQkJT1VUX1JJTkcoIGZvcm1hdCApOworCQkJT1VUX1JJTkcoIHByaW0gfCBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19MSVNUIHwKKwkJCQkgIChzaXplIDw8IFIxMjhfQ0NFX1ZDX0NOVExfTlVNX1NISUZUKSApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKworCQkJaSArPSAzOworCQl9IHdoaWxlICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlidWZfcHJpdi0+YWdlID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KKwkJQkVHSU5fUklORyggMiApOworCisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9MQVNUX0RJU1BBVENIX1JFRywgMCApICk7CisJCU9VVF9SSU5HKCBidWZfcHJpdi0+YWdlICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJYnVmLT5wZW5kaW5nID0gMTsKKwkJYnVmLT51c2VkID0gMDsKKwkJLyogRklYTUU6IENoZWNrIGRpc3BhdGNoZWQgZmllbGQgKi8KKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKys7CisKKwlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfQ0xJUFJFQ1RTOworCXNhcmVhX3ByaXYtPm5ib3ggPSAwOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCWRybV9idWZfdCAqYnVmLAorCQkJCQlpbnQgc3RhcnQsIGludCBlbmQgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJpbmRpcmVjdDogYnVmPSVkIHM9MHgleCBlPTB4JXhcbiIsCisJCSAgIGJ1Zi0+aWR4LCBzdGFydCwgZW5kICk7CisKKwlpZiAoIHN0YXJ0ICE9IGVuZCApIHsKKwkJaW50IG9mZnNldCA9IGJ1Zi0+YnVzX2FkZHJlc3MgKyBzdGFydDsKKwkJaW50IGR3b3JkcyA9IChlbmQgLSBzdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CisKKwkJLyogSW5kaXJlY3QgYnVmZmVyIGRhdGEgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZgorCQkgKiBkd29yZHMsIHNvIGlmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gb2RkIG51bWJlciB3ZSBtdXN0CisJCSAqIHBhZCB0aGUgZGF0YSB3aXRoIGEgVHlwZS0yIENDRSBwYWNrZXQuCisJCSAqLworCQlpZiAoIGR3b3JkcyAmIDEgKSB7CisJCQl1MzIgKmRhdGEgPSAodTMyICopCisJCQkJKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCisJCQkJICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCQlkYXRhW2R3b3JkcysrXSA9IGNwdV90b19sZTMyKCBSMTI4X0NDRV9QQUNLRVQyICk7CisJCX0KKworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CisKKwkJLyogRmlyZSBvZmYgdGhlIGluZGlyZWN0IGJ1ZmZlciAqLworCQlCRUdJTl9SSU5HKCAzICk7CisKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1BNNF9JV19JTkRPRkYsIDEgKSApOworCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBkd29yZHMgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlidWZfcHJpdi0+YWdlID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkJLyogRW1pdCB0aGUgaW5kaXJlY3QgYnVmZmVyIGFnZSAqLworCQlCRUdJTl9SSU5HKCAyICk7CisKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHLCAwICkgKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5hZ2UgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlidWYtPnBlbmRpbmcgPSAxOworCQlidWYtPnVzZWQgPSAwOworCQkvKiBGSVhNRTogQ2hlY2sgZGlzcGF0Y2hlZCBmaWVsZCAqLworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2grKzsKK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaWNlcyggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIGRybV9idWZfdCAqYnVmLAorCQkJCSAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisJCQkJICAgICAgIGludCBjb3VudCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgZm9ybWF0ID0gc2FyZWFfcHJpdi0+dmNfZm9ybWF0OworCWludCBvZmZzZXQgPSBkZXYtPmFncF9idWZmZXJfbWFwLT5vZmZzZXQgLSBkZXZfcHJpdi0+Y2NlX2J1ZmZlcnNfb2Zmc2V0OworCWludCBwcmltID0gYnVmX3ByaXYtPnByaW07CisJdTMyICpkYXRhOworCWludCBkd29yZHM7CisJaW50IGkgPSAwOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImluZGljZXM6IHM9JWQgZT0lZCBjPSVkXG4iLCBzdGFydCwgZW5kLCBjb3VudCApOworCisJaWYgKCAwICkKKwkJcjEyOF9wcmludF9kaXJ0eSggImRpc3BhdGNoX2luZGljZXMiLCBzYXJlYV9wcml2LT5kaXJ0eSApOworCisJaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMTsKKworCQlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflIxMjhfVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJCXIxMjhfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsKKwkJfQorCisJCWR3b3JkcyA9IChlbmQgLSBzdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CisKKwkJZGF0YSA9ICh1MzIgKikoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUKKwkJCSAgICAgICArIGJ1Zi0+b2Zmc2V0ICsgc3RhcnQpOworCisJCWRhdGFbMF0gPSBjcHVfdG9fbGUzMiggQ0NFX1BBQ0tFVDMoIFIxMjhfM0RfUk5EUl9HRU5fSU5EWF9QUklNLAorCQkJCQkJICAgIGR3b3Jkcy0yICkgKTsKKworCQlkYXRhWzFdID0gY3B1X3RvX2xlMzIoIG9mZnNldCApOworCQlkYXRhWzJdID0gY3B1X3RvX2xlMzIoIFIxMjhfTUFYX1ZCX1ZFUlRTICk7CisJCWRhdGFbM10gPSBjcHVfdG9fbGUzMiggZm9ybWF0ICk7CisJCWRhdGFbNF0gPSBjcHVfdG9fbGUzMiggKHByaW0gfCBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19JTkQgfAorCQkJCQkoY291bnQgPDwgMTYpKSApOworCisJCWlmICggY291bnQgJiAweDEgKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJCQlkYXRhW2R3b3Jkcy0xXSAmPSAweDAwMDBmZmZmOworI2Vsc2UKKwkJCWRhdGFbZHdvcmRzLTFdICY9IDB4ZmZmZjAwMDA7CisjZW5kaWYKKwkJfQorCisJCWRvIHsKKwkJCS8qIEVtaXQgdGhlIG5leHQgc2V0IG9mIHVwIHRvIHRocmVlIGNsaXByZWN0cyAqLworCQkJaWYgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApIHsKKwkJCQlyMTI4X2VtaXRfY2xpcF9yZWN0cyggZGV2X3ByaXYsCisJCQkJCQkgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0sCisJCQkJCQkgICAgICBzYXJlYV9wcml2LT5uYm94IC0gaSApOworCQkJfQorCisJCQlyMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIHN0YXJ0LCBlbmQgKTsKKworCQkJaSArPSAzOworCQl9IHdoaWxlICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlidWZfcHJpdi0+YWdlID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KKwkJQkVHSU5fUklORyggMiApOworCisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9MQVNUX0RJU1BBVENIX1JFRywgMCApICk7CisJCU9VVF9SSU5HKCBidWZfcHJpdi0+YWdlICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJYnVmLT5wZW5kaW5nID0gMTsKKwkJLyogRklYTUU6IENoZWNrIGRpc3BhdGNoZWQgZmllbGQgKi8KKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKys7CisKKwlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfQ0xJUFJFQ1RTOworCXNhcmVhX3ByaXYtPm5ib3ggPSAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX2JsaXQoIERSTUZJTEUgZmlscCwKKwkJCQkgICBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICBkcm1fcjEyOF9ibGl0X3QgKmJsaXQgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCXUzMiAqZGF0YTsKKwlpbnQgZHdvcmRfc2hpZnQsIGR3b3JkczsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIFRoZSBjb21waWxlciB3b24ndCBvcHRpbWl6ZSBhd2F5IGEgZGl2aXNpb24gYnkgYSB2YXJpYWJsZSwKKwkgKiBldmVuIGlmIHRoZSBvbmx5IGxlZ2FsIHZhbHVlcyBhcmUgcG93ZXJzIG9mIHR3by4gIFRodXMsIHdlJ2xsCisJICogdXNlIGEgc2hpZnQgaW5zdGVhZC4KKwkgKi8KKwlzd2l0Y2ggKCBibGl0LT5mb3JtYXQgKSB7CisJY2FzZSBSMTI4X0RBVEFUWVBFX0FSR0I4ODg4OgorCQlkd29yZF9zaGlmdCA9IDA7CisJCWJyZWFrOworCWNhc2UgUjEyOF9EQVRBVFlQRV9BUkdCMTU1NToKKwljYXNlIFIxMjhfREFUQVRZUEVfUkdCNTY1OgorCWNhc2UgUjEyOF9EQVRBVFlQRV9BUkdCNDQ0NDoKKwljYXNlIFIxMjhfREFUQVRZUEVfWVZZVTQyMjoKKwljYXNlIFIxMjhfREFUQVRZUEVfVllVWTQyMjoKKwkJZHdvcmRfc2hpZnQgPSAxOworCQlicmVhazsKKwljYXNlIFIxMjhfREFUQVRZUEVfQ0k4OgorCWNhc2UgUjEyOF9EQVRBVFlQRV9SR0I4OgorCQlkd29yZF9zaGlmdCA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUiggImludmFsaWQgYmxpdCBmb3JtYXQgJWRcbiIsIGJsaXQtPmZvcm1hdCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSwgYW5kIG1hcmsgdGhlIGNvbnRlbnRzIGFzIFJlYWQgSW52YWxpZC4KKwkgKiBUaGlzIGVuc3VyZXMgbm8gcGl4ZWwgZGF0YSBnZXRzIG1peGVkIHVwIHdpdGggdGhlIHRleHR1cmUKKwkgKiBkYXRhIGZyb20gdGhlIGhvc3QgZGF0YSBibGl0LCBvdGhlcndpc2UgcGFydCBvZiB0aGUgdGV4dHVyZQorCSAqIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCisJICovCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1BDX0dVSV9DVExTVEFULCAwICkgKTsKKwlPVVRfUklORyggUjEyOF9QQ19SSV9HVUkgfCBSMTI4X1BDX0ZMVVNIX0dVSSApOworCisJQURWQU5DRV9SSU5HKCk7CisKKwkvKiBEaXNwYXRjaCB0aGUgaW5kaXJlY3QgYnVmZmVyLgorCSAqLworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtibGl0LT5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgYmxpdC0+aWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmX3ByaXYtPmRpc2NhcmQgPSAxOworCisJZHdvcmRzID0gKGJsaXQtPndpZHRoICogYmxpdC0+aGVpZ2h0KSA+PiBkd29yZF9zaGlmdDsKKworCWRhdGEgPSAodTMyICopKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOworCisJZGF0YVswXSA9IGNwdV90b19sZTMyKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX0hPU1REQVRBX0JMVCwgZHdvcmRzICsgNiApICk7CisJZGF0YVsxXSA9IGNwdV90b19sZTMyKCAoUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCQlSMTI4X0dNQ19CUlVTSF9OT05FIHwKKwkJCQkoYmxpdC0+Zm9ybWF0IDw8IDgpIHwKKwkJCQlSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCVIxMjhfUk9QM19TIHwKKwkJCQlSMTI4X0RQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBIHwKKwkJCQlSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQlSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgfAorCQkJCVIxMjhfR01DX1dSX01TS19ESVMpICk7CisKKwlkYXRhWzJdID0gY3B1X3RvX2xlMzIoIChibGl0LT5waXRjaCA8PCAyMSkgfCAoYmxpdC0+b2Zmc2V0ID4+IDUpICk7CisJZGF0YVszXSA9IGNwdV90b19sZTMyKCAweGZmZmZmZmZmICk7CisJZGF0YVs0XSA9IGNwdV90b19sZTMyKCAweGZmZmZmZmZmICk7CisJZGF0YVs1XSA9IGNwdV90b19sZTMyKCAoYmxpdC0+eSA8PCAxNikgfCBibGl0LT54ICk7CisJZGF0YVs2XSA9IGNwdV90b19sZTMyKCAoYmxpdC0+aGVpZ2h0IDw8IDE2KSB8IGJsaXQtPndpZHRoICk7CisJZGF0YVs3XSA9IGNwdV90b19sZTMyKCBkd29yZHMgKTsKKworCWJ1Zi0+dXNlZCA9IChkd29yZHMgKyA4KSAqIHNpemVvZih1MzIpOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgYnVmLCAwLCBidWYtPnVzZWQgKTsKKworCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSBhZnRlciB0aGUgYmxpdCBjb21wbGV0ZXMuICBUaGlzIGVuc3VyZXMKKwkgKiB0aGUgdGV4dHVyZSBkYXRhIGlzIHdyaXR0ZW4gb3V0IHRvIG1lbW9yeSBiZWZvcmUgcmVuZGVyaW5nCisJICogY29udGludWVzLgorCSAqLworCUJFR0lOX1JJTkcoIDIgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9QQ19HVUlfQ1RMU1RBVCwgMCApICk7CisJT1VUX1JJTkcoIFIxMjhfUENfRkxVU0hfR1VJICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRpbGVkIGRlcHRoIGJ1ZmZlciBtYW5hZ2VtZW50CisgKgorICogRklYTUU6IFRoZXNlIHNob3VsZCBhbGwgc2V0IHRoZSBkZXN0aW5hdGlvbiB3cml0ZSBtYXNrIGZvciB3aGVuIHdlCisgKiBoYXZlIGhhcmR3YXJlIHN0ZW5jaWwgc3VwcG9ydC4KKyAqLworCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgeCwgeTsKKwl1MzIgKmJ1ZmZlcjsKKwl1OCAqbWFzazsKKwlpbnQgaSwgYnVmZmVyX3NpemUsIG1hc2tfc2l6ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWNvdW50ID0gZGVwdGgtPm47CisJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQorCQlyZXR1cm4gRFJNX0VSUihFTVNHU0laRSk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJngsIGRlcHRoLT54LCBzaXplb2YoeCkgKSApIHsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpICkgKSB7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJYnVmZmVyX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1MzIpOworCWJ1ZmZlciA9IGRybV9hbGxvYyggYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCWlmICggYnVmZmVyID09IE5VTEwgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCBidWZmZXIsIGRlcHRoLT5idWZmZXIsIGJ1ZmZlcl9zaXplICkgKSB7CisJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCW1hc2tfc2l6ZSA9IGRlcHRoLT5uICogc2l6ZW9mKHU4KTsKKwlpZiAoIGRlcHRoLT5tYXNrICkgeworCQltYXNrID0gZHJtX2FsbG9jKCBtYXNrX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlpZiAoIG1hc2sgPT0gTlVMTCApIHsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIG1hc2ssIGRlcHRoLT5tYXNrLCBtYXNrX3NpemUgKSApIHsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCWRybV9mcmVlKCBtYXNrLCBtYXNrX3NpemUsIERSTV9NRU1fQlVGUyApOworCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJfQorCisJCWZvciAoIGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrLCB4KysgKSB7CisJCQlpZiAoIG1hc2tbaV0gKSB7CisJCQkJQkVHSU5fUklORyggNiApOworCisJCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCQkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQkJT1VUX1JJTkcoICgxIDw8IDE2KSB8IDEgKTsKKworCQkJCUFEVkFOQ0VfUklORygpOworCQkJfQorCQl9CisKKwkJZHJtX2ZyZWUoIG1hc2ssIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKyssIHgrKyApIHsKKwkJCUJFR0lOX1JJTkcoIDYgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCSAgUjEyOF9ST1AzX1AgfAorCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCU9VVF9SSU5HKCAoMSA8PCAxNikgfCAxICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisJfQorCisJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgKngsICp5OworCXUzMiAqYnVmZmVyOworCXU4ICptYXNrOworCWludCBpLCB4YnVmX3NpemUsIHlidWZfc2l6ZSwgYnVmZmVyX3NpemUsIG1hc2tfc2l6ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWNvdW50ID0gZGVwdGgtPm47CisJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQorCQlyZXR1cm4gRFJNX0VSUihFTVNHU0laRSk7CisKKwl4YnVmX3NpemUgPSBjb3VudCAqIHNpemVvZigqeCk7CisJeWJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKnkpOworCXggPSBkcm1fYWxsb2MoIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCB4ID09IE5VTEwgKSB7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCXkgPSBkcm1fYWxsb2MoIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCB5ID09IE5VTEwgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggeCwgZGVwdGgtPngsIHhidWZfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCB5LCBkZXB0aC0+eSwgeGJ1Zl9zaXplICkgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlidWZmZXJfc2l6ZSA9IGRlcHRoLT5uICogc2l6ZW9mKHUzMik7CisJYnVmZmVyID0gZHJtX2FsbG9jKCBidWZmZXJfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKwkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggYnVmZmVyLCBkZXB0aC0+YnVmZmVyLCBidWZmZXJfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlpZiAoIGRlcHRoLT5tYXNrICkgeworCQltYXNrX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1OCk7CisJCW1hc2sgPSBkcm1fYWxsb2MoIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWlmICggbWFzayA9PSBOVUxMICkgeworCQkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIG1hc2ssIGRlcHRoLT5tYXNrLCBtYXNrX3NpemUgKSApIHsKKwkJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyAgKTsKKwkJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyAgKTsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgICk7CisJCQlkcm1fZnJlZSggbWFzaywgbWFza19zaXplLCBEUk1fTUVNX0JVRlMgICk7CisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQl9CisKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCQlpZiAoIG1hc2tbaV0gKSB7CisJCQkJQkVHSU5fUklORyggNiApOworCisJCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCQkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJCU9VVF9SSU5HKCAoeFtpXSA8PCAxNikgfCB5W2ldICk7CisJCQkJT1VUX1JJTkcoICgxIDw8IDE2KSB8IDEgKTsKKworCQkJCUFEVkFOQ0VfUklORygpOworCQkJfQorCQl9CisKKwkJZHJtX2ZyZWUoIG1hc2ssIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCSAgKGRldl9wcml2LT5kZXB0aF9mbXQgPDwgOCkgfAorCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkgIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggYnVmZmVyW2ldICk7CisKKwkJCU9VVF9SSU5HKCAoeFtpXSA8PCAxNikgfCB5W2ldICk7CisJCQlPVVRfUklORyggKDEgPDwgMTYpIHwgMSApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0KKworCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3BhbiggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCWRybV9yMTI4X2RlcHRoX3QgKmRlcHRoICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgY291bnQsIHgsIHk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwljb3VudCA9IGRlcHRoLT5uOworCWlmIChjb3VudCA+IDQwOTYgfHwgY291bnQgPD0gMCkKKwkJcmV0dXJuIERSTV9FUlIoRU1TR1NJWkUpOworCisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZ4LCBkZXB0aC0+eCwgc2l6ZW9mKHgpICkgKSB7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmeSwgZGVwdGgtPnksIHNpemVvZih5KSApICkgeworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCUJFR0lOX1JJTkcoIDcgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX0JJVEJMVF9NVUxUSSwgNSApICk7CisJT1VUX1JJTkcoIFIxMjhfR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTCB8CisJCSAgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJICBSMTI4X0dNQ19CUlVTSF9OT05FIHwKKwkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJICBSMTI4X1JPUDNfUyB8CisJCSAgUjEyOF9EUF9TUkNfU09VUkNFX01FTU9SWSB8CisJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+c3Bhbl9waXRjaF9vZmZzZXRfYyApOworCisJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwlPVVRfUklORyggKDAgPDwgMTYpIHwgMCApOworCU9VVF9SSU5HKCAoY291bnQgPDwgMTYpIHwgMSApOworCisJQURWQU5DRV9SSU5HKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSAgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgKngsICp5OworCWludCBpLCB4YnVmX3NpemUsIHlidWZfc2l6ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwljb3VudCA9IGRlcHRoLT5uOworCWlmIChjb3VudCA+IDQwOTYgfHwgY291bnQgPD0gMCkKKwkJcmV0dXJuIERSTV9FUlIoRU1TR1NJWkUpOworCisJaWYgKCBjb3VudCA+IGRldl9wcml2LT5kZXB0aF9waXRjaCApIHsKKwkJY291bnQgPSBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2g7CisJfQorCisJeGJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKngpOworCXlidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCp5KTsKKwl4ID0gZHJtX2FsbG9jKCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWlmICggeCA9PSBOVUxMICkgeworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwl5ID0gZHJtX2FsbG9jKCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWlmICggeSA9PSBOVUxMICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIHgsIGRlcHRoLT54LCB4YnVmX3NpemUgKSApIHsKKwkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggeSwgZGVwdGgtPnksIHlidWZfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCUJFR0lOX1JJTkcoIDcgKTsKKworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOworCQlPVVRfUklORyggUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfQlJVU0hfTk9ORSB8CisJCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSAgUjEyOF9ST1AzX1MgfAorCQkJICBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgIFIxMjhfR01DX1dSX01TS19ESVMgKTsKKworCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+c3Bhbl9waXRjaF9vZmZzZXRfYyApOworCisJCU9VVF9SSU5HKCAoeFtpXSA8PCAxNikgfCB5W2ldICk7CisJCU9VVF9SSU5HKCAoaSA8PCAxNikgfCAwICk7CisJCU9VVF9SSU5HKCAoMSA8PCAxNikgfCAxICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQb2x5Z29uIHN0aXBwbGUKKyAqLworCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zdGlwcGxlKCBkcm1fZGV2aWNlX3QgKmRldiwgdTMyICpzdGlwcGxlICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAzMyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0JSVVNIX0RBVEEwLCAzMSApICk7CisJZm9yICggaSA9IDAgOyBpIDwgMzIgOyBpKysgKSB7CisJCU9VVF9SSU5HKCBzdGlwcGxlW2ldICk7CisJfQorCisJQURWQU5DRV9SSU5HKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSU9DVEwgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCByMTI4X2NjZV9jbGVhciggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NsZWFyX3QgY2xlYXI7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbGVhciwgKGRybV9yMTI4X2NsZWFyX3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihjbGVhcikgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IFIxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IFIxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfY2xlYXIoIGRldiwgJmNsZWFyICk7CisJQ09NTUlUX1JJTkcoKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmRpcnR5IHw9IFIxMjhfVVBMT0FEX0NPTlRFWFQgfCBSMTI4X1VQTE9BRF9NQVNLUzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJZGV2X3ByaXYtPmNydGNfb2Zmc2V0ID0gICAgICBSMTI4X1JFQUQoIFIxMjhfQ1JUQ19PRkZTRVQgKTsKKwlkZXZfcHJpdi0+Y3J0Y19vZmZzZXRfY250bCA9IFIxMjhfUkVBRCggUjEyOF9DUlRDX09GRlNFVF9DTlRMICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X0NSVENfT0ZGU0VULCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJUjEyOF9XUklURSggUjEyOF9DUlRDX09GRlNFVF9DTlRMLAorCQkgICAgZGV2X3ByaXYtPmNydGNfb2Zmc2V0X2NudGwgfCBSMTI4X0NSVENfT0ZGU0VUX0ZMSVBfQ05UTCApOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKworCXJldHVybiAwOworfQorCitpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X0NSVENfT0ZGU0VULCAgICAgIGRldl9wcml2LT5jcnRjX29mZnNldCApOworCVIxMjhfV1JJVEUoIFIxMjhfQ1JUQ19PRkZTRVRfQ05UTCwgZGV2X3ByaXYtPmNydGNfb2Zmc2V0X2NudGwgKTsKKworCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApIHsKKwkJcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisJCUNPTU1JVF9SSU5HKCk7CisJfQorCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAwOworCXJldHVybiAwOworfQorCisvKiBTd2FwcGluZyBhbmQgZmxpcHBpbmcgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zLCBuZWVkIGRpZmZlcmVudCBpb2N0bHMuCisgKiBUaGV5IGNhbiAmIHNob3VsZCBiZSBpbnRlcm1peGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgM2Qgd2luZG93cy4gIAorICovCisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZmxpcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIAorCQlyMTI4X2RvX2luaXRfcGFnZWZsaXAoIGRldiApOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX3N3YXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gUjEyOF9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gUjEyOF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlyMTI4X2NjZV9kaXNwYXRjaF9zd2FwKCBkZXYgKTsKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+ZGlydHkgfD0gKFIxMjhfVVBMT0FEX0NPTlRFWFQgfAorCQkJCQlSMTI4X1VQTE9BRF9NQVNLUyk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX3ZlcnRleCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX3IxMjhfdmVydGV4X3QgdmVydGV4OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB2ZXJ0ZXgsIChkcm1fcjEyOF92ZXJ0ZXhfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBjb3VudD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgICBEUk1fQ1VSUkVOVFBJRCwKKwkJICAgdmVydGV4LmlkeCwgdmVydGV4LmNvdW50LCB2ZXJ0ZXguZGlzY2FyZCApOworCisJaWYgKCB2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCB2ZXJ0ZXgucHJpbSA8IDAgfHwKKwkgICAgIHZlcnRleC5wcmltID4gUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1RZUEVfVFJJX1RZUEUyICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgdmVydGV4LnByaW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbdmVydGV4LmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmLT51c2VkID0gdmVydGV4LmNvdW50OworCWJ1Zl9wcml2LT5wcmltID0gdmVydGV4LnByaW07CisJYnVmX3ByaXYtPmRpc2NhcmQgPSB2ZXJ0ZXguZGlzY2FyZDsKKworCXIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfaW5kaWNlcyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX3IxMjhfaW5kaWNlc190IGVsdHM7CisJaW50IGNvdW50OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBlbHRzLCAoZHJtX3IxMjhfaW5kaWNlc190IF9fdXNlciAqKSBkYXRhLAorCQkJICAgICBzaXplb2YoZWx0cykgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBidWY9JWQgcz0lZCBlPSVkIGQ9JWRcbiIsIERSTV9DVVJSRU5UUElELAorCQkgICBlbHRzLmlkeCwgZWx0cy5zdGFydCwgZWx0cy5lbmQsIGVsdHMuZGlzY2FyZCApOworCisJaWYgKCBlbHRzLmlkeCA8IDAgfHwgZWx0cy5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGVsdHMuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnByaW0gPCAwIHx8CisJICAgICBlbHRzLnByaW0gPiBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfVFlQRTIgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbZWx0cy5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgZWx0cy5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwljb3VudCA9IChlbHRzLmVuZCAtIGVsdHMuc3RhcnQpIC8gc2l6ZW9mKHUxNik7CisJZWx0cy5zdGFydCAtPSBSMTI4X0lOREVYX1BSSU1fT0ZGU0VUOworCisJaWYgKCBlbHRzLnN0YXJ0ICYgMHg3ICkgeworCQlEUk1fRVJST1IoICJtaXNhbGlnbmVkIGJ1ZmZlciAweCV4XG4iLCBlbHRzLnN0YXJ0ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggZWx0cy5zdGFydCA8IGJ1Zi0+dXNlZCApIHsKKwkJRFJNX0VSUk9SKCAibm8gaGVhZGVyIDB4JXggLSAweCV4XG4iLCBlbHRzLnN0YXJ0LCBidWYtPnVzZWQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlidWYtPnVzZWQgPSBlbHRzLmVuZDsKKwlidWZfcHJpdi0+cHJpbSA9IGVsdHMucHJpbTsKKwlidWZfcHJpdi0+ZGlzY2FyZCA9IGVsdHMuZGlzY2FyZDsKKworCXIxMjhfY2NlX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgY291bnQgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfYmxpdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfYmxpdF90IGJsaXQ7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGJsaXQsIChkcm1fcjEyOF9ibGl0X3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihibGl0KSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkIGluZGV4PSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCwgYmxpdC5pZHggKTsKKworCWlmICggYmxpdC5pZHggPCAwIHx8IGJsaXQuaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICBibGl0LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmV0ID0gcjEyOF9jY2VfZGlzcGF0Y2hfYmxpdCggZmlscCwgZGV2LCAmYmxpdCApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2RlcHRoKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9kZXB0aF90IGRlcHRoOworCWludCByZXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBkZXB0aCwgKGRybV9yMTI4X2RlcHRoX3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihkZXB0aCkgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCXJldCA9IERSTV9FUlIoRUlOVkFMKTsKKwlzd2l0Y2ggKCBkZXB0aC5mdW5jICkgeworCWNhc2UgUjEyOF9XUklURV9TUEFOOgorCQlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9zcGFuKCBkZXYsICZkZXB0aCApOworCWNhc2UgUjEyOF9XUklURV9QSVhFTFM6CisJCXJldCA9IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3BpeGVscyggZGV2LCAmZGVwdGggKTsKKwljYXNlIFIxMjhfUkVBRF9TUEFOOgorCQlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3NwYW4oIGRldiwgJmRlcHRoICk7CisJY2FzZSBSMTI4X1JFQURfUElYRUxTOgorCQlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyggZGV2LCAmZGVwdGggKTsKKwl9CisKKwlDT01NSVRfUklORygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2Vfc3RpcHBsZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc3RpcHBsZV90IHN0aXBwbGU7CisJdTMyIG1hc2tbMzJdOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggc3RpcHBsZSwgKGRybV9yMTI4X3N0aXBwbGVfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHN0aXBwbGUpICk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJm1hc2ssIHN0aXBwbGUubWFzaywKKwkJCSAgICAgMzIgKiBzaXplb2YodTMyKSApICkKKwkJcmV0dXJuIERSTV9FUlIoIEVGQVVMVCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfc3RpcHBsZSggZGV2LCBtYXNrICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2luZGlyZWN0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fcjEyOF9pbmRpcmVjdF90IGluZGlyZWN0OworI2lmIDAKKwlSSU5HX0xPQ0FMUzsKKyNlbmRpZgorCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbmRpcmVjdCwgKGRybV9yMTI4X2luZGlyZWN0X3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihpbmRpcmVjdCkgKTsKKworCURSTV9ERUJVRyggImluZGlyZWN0OiBpZHg9JWQgcz0lZCBlPSVkIGQ9JWRcbiIsCisJCSAgIGluZGlyZWN0LmlkeCwgaW5kaXJlY3Quc3RhcnQsCisJCSAgIGluZGlyZWN0LmVuZCwgaW5kaXJlY3QuZGlzY2FyZCApOworCisJaWYgKCBpbmRpcmVjdC5pZHggPCAwIHx8IGluZGlyZWN0LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgaW5kaXJlY3QuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbaW5kaXJlY3QuaWR4XTsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGluZGlyZWN0LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggaW5kaXJlY3Quc3RhcnQgPCBidWYtPnVzZWQgKSB7CisJCURSTV9FUlJPUiggInJldXNpbmcgaW5kaXJlY3Q6IHN0YXJ0PTB4JXggYWN0dWFsPTB4JXhcbiIsCisJCQkgICBpbmRpcmVjdC5zdGFydCwgYnVmLT51c2VkICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmLT51c2VkID0gaW5kaXJlY3QuZW5kOworCWJ1Zl9wcml2LT5kaXNjYXJkID0gaW5kaXJlY3QuZGlzY2FyZDsKKworI2lmIDAKKwkvKiBXYWl0IGZvciB0aGUgM0Qgc3RyZWFtIHRvIGlkbGUgYmVmb3JlIHRoZSBpbmRpcmVjdCBidWZmZXIKKwkgKiBjb250YWluaW5nIDJEIGFjY2VsZXJhdGlvbiBjb21tYW5kcyBpcyBwcm9jZXNzZWQuCisJICovCisJQkVHSU5fUklORyggMiApOworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlBRFZBTkNFX1JJTkcoKTsKKyNlbmRpZgorCisJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlciBmdWxsIG9mIGNvbW1hbmRzIGZyb20gdGhlCisJICogWCBzZXJ2ZXIuICBUaGlzIGlzIGluc2VjdXJlIGFuZCBpcyB0aHVzIG9ubHkgYXZhaWxhYmxlIHRvCisJICogcHJpdmlsZWdlZCBjbGllbnRzLgorCSAqLworCXIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1ZiwgaW5kaXJlY3Quc3RhcnQsIGluZGlyZWN0LmVuZCApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2dldHBhcmFtKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9nZXRwYXJhbV90IHBhcmFtOworCWludCB2YWx1ZTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBwYXJhbSwgKGRybV9yMTI4X2dldHBhcmFtX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHBhcmFtKSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCApOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIFIxMjhfUEFSQU1fSVJRX05SOgorCQl2YWx1ZSA9IGRldi0+aXJxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCQorCXJldHVybiAwOworfQorCit2b2lkIHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisJCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICkgeworCQkJcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkZXYgKTsKKwkJfQorCX0JCQkKK30KKwordm9pZCByMTI4X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCByMTI4X2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5JVCldICAgICAgID0geyByMTI4X2NjZV9pbml0LCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1NUQVJUKV0gID0geyByMTI4X2NjZV9zdGFydCwgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1NUT1ApXSAgID0geyByMTI4X2NjZV9zdG9wLCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1JFU0VUKV0gID0geyByMTI4X2NjZV9yZXNldCwgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX0lETEUpXSAgID0geyByMTI4X2NjZV9pZGxlLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfUkVTRVQpXSAgICAgID0geyByMTI4X2VuZ2luZV9yZXNldCwgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRlVMTFNDUkVFTildID0geyByMTI4X2Z1bGxzY3JlZW4sICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1dBUCldICAgICAgID0geyByMTI4X2NjZV9zd2FwLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRkxJUCldICAgICAgID0geyByMTI4X2NjZV9mbGlwLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0xFQVIpXSAgICAgID0geyByMTI4X2NjZV9jbGVhciwgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfVkVSVEVYKV0gICAgID0geyByMTI4X2NjZV92ZXJ0ZXgsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESUNFUyldICAgID0geyByMTI4X2NjZV9pbmRpY2VzLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQkxJVCldICAgICAgID0geyByMTI4X2NjZV9ibGl0LCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfREVQVEgpXSAgICAgID0geyByMTI4X2NjZV9kZXB0aCwgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1RJUFBMRSldICAgID0geyByMTI4X2NjZV9zdGlwcGxlLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESVJFQ1QpXSAgID0geyByMTI4X2NjZV9pbmRpcmVjdCwgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfR0VUUEFSQU0pXSAgID0geyByMTI4X2dldHBhcmFtLCAxLCAwIH0sCit9OworCitpbnQgcjEyOF9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShyMTI4X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGJjZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpAQCAtMCwwICsxLDIwNjEgQEAKKy8qIHJhZGVvbl9jcC5jIC0tIENQIHN1cHBvcnQgZm9yIFJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworI2RlZmluZSBSQURFT05fRklGT19ERUJVRwkwCisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKKy8qIENQIG1pY3JvY29kZSAoZnJvbSBBVEkpICovCitzdGF0aWMgdTMyIFIyMDBfY3BfbWljcm9jb2RlW11bMl0gPSB7CisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sICAgICAgICAKKwl7IDB4MjAwMDcwMDAsIDAwMDAwMDAwMDAgfSwgCisJeyAweDAwMDAwMGFiLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMGFmLCAweDAwMDAwMDA0IH0sCisJeyAweDY2NTQ0YTQ5LCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5NDk0MTc0LCAwMDAwMDAwMDAwIH0sCisJeyAweDU0NTE3ZDgzLCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5OGQ4YjY0LCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5NDk0OTQ5LCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5ZGE0OTNjLCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5OTg5ODk4LCAwMDAwMDAwMDAwIH0sCisJeyAweGQzNDk0OWQ1LCAwMDAwMDAwMDAwIH0sCisJeyAweDlkYzkwZTExLCAwMDAwMDAwMDAwIH0sCisJeyAweGNlOWI5YjliLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAweDM1MmUyMzJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDEzLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAweDM1MmUyNzJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGYwMDAxLCAweDAwMDAwMDE2IH0sCisJeyAweDMyMzkzNjJmLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3N2VmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIwLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIwLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIwLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDAwMDE2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MDJhLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDE2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAzN2UxLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UxLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3N2UxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3N2UxLCAweDAwMDAwMDA2IH0sCisJeyAweGZmZmZmZmZmLCAwMDAwMDAwMDAwIH0sCisJeyAweDEwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MDJhLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3Njc1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc4LCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDM4MDJiLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNjc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc4LCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDJlLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDJlLCAweDAwMDAwMDE4IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDJmLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDJmLCAweDAwMDAwMDE4IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAxNjA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDk4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDY0YzA2MDNkLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDgwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDA0MDAyNTFkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTgwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3NTgxLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNTgwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3NTgxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDQ2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA1MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDE5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDExMDU1LCAweDAwMDAwMDE0IH0sCisJeyAweDAwMDAwMDU1LCAweDAwMDAwMDEyIH0sCisJeyAweDA0MDAyNTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA1MDRhLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTY1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDUxLCAweDAwMDAwMDA0IH0sCisJeyAweDAxZTY1NWI0LCAweDAwMDAwMDAyIH0sCisJeyAweDQ0MDFiMGRjLCAweDAwMDAwMDAyIH0sCisJeyAweDAxYzExMGRjLCAweDAwMDAwMDAyIH0sCisJeyAweDI2NjY3MDVkLCAweDAwMDAwMDE4IH0sCisJeyAweDA0MGMyNTY1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDVkLCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDAyNTY0LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwNDAxMDYwLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMTAxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGQ4MGZmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwODAwMDYzLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMGY5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGUwMGZmLCAweDAwMDAwMDAyIH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDgwLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDQxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDBjMDAzNTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDQ5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDUxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxZTc4NWY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDczLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDA3NTYzLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjA3NWYwLCAweDAwMDAwMDIxIH0sCisJeyAweDIwMDA3MDY4LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA1MDY4LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDc2LCAweDAwMDAwMDBjIH0sCisJeyAweDAwNjA3NWYwLCAweDAwMDAwMDIxIH0sCisJeyAweDAwMDA3NWY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDc2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGE3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMjA3NTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDc5LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTcwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTcxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTcyLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDg0LCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDU4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDBjNjA3NTYyLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDg2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwNjAwMDg1LCAweDAwMDAwMDA0IH0sCisJeyAweDQwMDA3MGRkLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGRkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDkzLCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDY1MDk1LCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDAyNWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDk2LCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDA3NWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDkwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDkwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGQ4MDAyLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODIxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3ODIxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxNjY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3MWNjLCAweDAwMDAwMDAyIH0sCisJeyAweDAyODZmMWNkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGEzLCAweDAwMDAwMDEwIH0sCisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMGFhLCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGIwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDM4MDY3MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGEwMGE2LCAweDAwMDAwMDA0IH0sCisJeyAweDIwMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDIwMDc3MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDIwMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxMjA3NTFiLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NTBhLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NTBiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMTEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGRkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGJkLCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDYxMDk2LCAweDAwMDAwMDE4IH0sCisJeyAweDg0NDA3NWJkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDk1LCAweDAwMDAwMDE4IH0sCisJeyAweDg0MDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDk2LCAweDAwMDAwMDE4IH0sCisJeyAweDg0NDA3NWJjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGMwLCAweDAwMDAwMDA0IH0sCisJeyAweDgwNDA3NWJkLCAweDAwMDAwMDAyIH0sCisJeyAweDgwMDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NWJjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMTA4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxNDAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMGM0LCAweDAwMDAwMDBjIH0sCisJeyAweDIwYzA3MDAwLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDAwMGM2LCAweDAwMDAwMDEyIH0sCisJeyAweDAwODAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwODA3NTFkLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAyNWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA0MGMwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NzVjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0NjAyNzVkLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDA0MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3OTk5LCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0NjAyOTliLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDA0MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxZTAwODMwLCAweDAwMDAwMDAyIH0sCisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MDQyLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWUwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NWUxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDAxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGQ5LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA3Mzk0LCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCit9OworCisKK3N0YXRpYyB1MzIgcmFkZW9uX2NwX21pY3JvY29kZVtdWzJdID0geworCXsgMHgyMTAwNzAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgyMDAwNzAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDBiNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDBiOCwgMHgwMDAwMDAwNCB9LAorCXsgMHg2ZjViNGQ0YywgMDAwMDAwMDAwMCB9LAorCXsgMHg0YzRjNDI3ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHg1YjU2OGE5MiwgMDAwMDAwMDAwMCB9LAorCXsgMHg0Y2EwOWM2ZCwgMDAwMDAwMDAwMCB9LAorCXsgMHhhZDRjNGM0YywgMDAwMDAwMDAwMCB9LAorCXsgMHg0Y2UxYWYzZCwgMDAwMDAwMDAwMCB9LAorCXsgMHhkOGFmYWZhZiwgMDAwMDAwMDAwMCB9LAorCXsgMHhkNjRjNGNkYywgMDAwMDAwMDAwMCB9LAorCXsgMHg0Y2QxMGQxMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBmMDAwMCwgMHgwMDAwMDAxNiB9LAorCXsgMHgzNjJmMjQyZCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAxMiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBmMDAwMCwgMHgwMDAwMDAxNiB9LAorCXsgMHgzNjJmMjgyZCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlNywgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMmM5NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBmMDAwMSwgMHgwMDAwMDAxNiB9LAorCXsgMHgzMzNhMzczMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNzdlZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAyMSwgMHgwMDAwMDAxYSB9LAorCXsgMHgwMDAwNDAwMCwgMHgwMDAwMDAxZSB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAyMSwgMHgwMDAwMDAxYSB9LAorCXsgMHgwMDAwNDAwMCwgMHgwMDAwMDAxZSB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAyMSwgMHgwMDAwMDAxYSB9LAorCXsgMHgwMDAwNDAwMCwgMHgwMDAwMDAxZSB9LAorCXsgMHgwMDAwMDAxNywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODAyYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwNjdlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAxNywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNzdlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMzdlMSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwNjdlMSwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwNzdlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzdlMSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzdlMSwgMHgwMDAwMDAwNiB9LAorCXsgMHhmZmZmZmZmZiwgMDAwMDAwMDAwMCB9LAorCXsgMHgxMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODAyYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwNjdlMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwNzY3NSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3OCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAzODAyYywgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjY3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3OCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwMDAyZiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwMDAyZiwgMHgwMDAwMDAxOCB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwMDAzMCwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwMDAzMCwgMHgwMDAwMDAxOCB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMTYwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA5ODAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHg2NGMwNjAzZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA4MDAwMCwgMHgwMDAwMDAxNiB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwNDAwMjUxZCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU4MCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NzU4MSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjU4MCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NzU4MSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA0OSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAxOTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAxMTA1NSwgMHgwMDAwMDAxNCB9LAorCXsgMHgwMDAwMDA1NSwgMHgwMDAwMDAxMiB9LAorCXsgMHgwNDAwMjUwZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTA0ZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2NSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA1OCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMWU2NTViNCwgMHgwMDAwMDAwMiB9LAorCXsgMHg0NDAxYjBlNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMWMxMTBlNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyNjY2NzA2NiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDBjMjU2NSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA2NiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDAwMjU2NCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA1ZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDQwMTA2OSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDEwMTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBkODBmZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDgwMDA2YywgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDBmOTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBlMDBmZiwgMHgwMDAwMDAwMiB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwMDA4ZiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwMDA1YiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwOTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA0MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwYzAwMzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA0OTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA1MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMWU3ODVmOCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDIwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA3ZSwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwNzU2MywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwNzVmMCwgMHgwMDAwMDAyMSB9LAorCXsgMHgyMDAwNzA3MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNTA3MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzUwZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMGEwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA4MywgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDYwNzVmMCwgMHgwMDAwMDAyMSB9LAorCXsgMHgwMDAwNzVmOCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA4MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBhNzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDIwNzUwZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA4NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNzU3MCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3MSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3MiwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMGEwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2OCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA5NSwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDA1ODAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwYzYwNzU2MiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA5NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA5NiwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MDAwNzBlNSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDBhOCwgMHgwMDAwMDAxYyB9LAorCXsgMHgwMDA2NTBhYSwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDAwMjViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTBhYiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDAwNzViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNzViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDA5MDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDA5MDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBkODAwMiwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwNzgzMiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNywgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMmM5NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzgyMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzgyMSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzgwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMTIwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyMDA3NzAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMTIwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyMDAwNzAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMTIwNzUxYiwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDQwNzUwYSwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDQwNzUwYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDExMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDAxYyB9LAorCXsgMHgwMDA2MTBhYiwgMHgwMDAwMDAxOCB9LAorCXsgMHg4NDQwNzViZCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTBhYSwgMHgwMDAwMDAxOCB9LAorCXsgMHg4NDAwNzViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTBhYiwgMHgwMDAwMDAxOCB9LAorCXsgMHg4NDQwNzViYywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDBjOSwgMHgwMDAwMDAwNCB9LAorCXsgMHg4MDQwNzViZCwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDAwNzViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDQwNzViYywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDEwODAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMTQwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDBjZCwgMHgwMDAwMDAwYyB9LAorCXsgMHgyMGMwNzAwMCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDAwMDBjZiwgMHgwMDAwMDAxMiB9LAorCXsgMHgwMDgwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDgwNzUxZCwgMHgwMDAwMDAwNiB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNzc1YywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMGEwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDY2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDYwMjc1ZCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDAwNDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMWUwMDgzMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyMTAwNzAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHg2NDY0NjE0ZCwgMDAwMDAwMDAwMCB9LAorCXsgMHg2OTY4NzQyMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDA3MywgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBkMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzVlMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjM5NCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwOCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwNCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorfTsKKworc3RhdGljIHUzMiBSMzAwX2NwX21pY3JvY29kZVtdWzJdID0geworCXsgMHg0MjAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0MDAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDBhZiwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwMDBiMywgMHgwMDAwMDAwOCB9LAorCXsgMHg2YzVhNTA0ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjRmNDk3YSwgMDAwMDAwMDAwMCB9LAorCXsgMHg1YTU3ODI4OCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjkxOTA2YSwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjRmNGY0ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZmUyNGY0NCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjljOWM5YywgMDAwMDAwMDAwMCB9LAorCXsgMHhkYzRmNGZkZSwgMDAwMDAwMDAwMCB9LAorCXsgMHhhMWNkNGY0ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHhkMjlkOWQ5ZCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjBmOWZkNywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxMiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZThiNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxNCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZThiNiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxNiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxOCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxYSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxYywgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxZSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTgyNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyMCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTgyNSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyMiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTgzMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyNCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjBjMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyNiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjBjMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyOCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjA0MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyYSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyYywgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyZSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzMCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzMiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzNCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjM5MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzNiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjM4YSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzOCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjM4ZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgyMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA0MywgMHgwMDAwMDAxOCB9LAorCXsgMHgwMGNjZTgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDAzYSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwYTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMmMwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDEzMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHhjOTgwYzA0NSwgMHgwMDAwMDAwOCB9LAorCXsgMHgyMDAwNDUxZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU4MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjZTU4MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDU4MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjZTU4MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA0YywgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwYTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAyMjA1NiwgMHgwMDAwMDAyOCB9LAorCXsgMHgwMDAwMDA1NiwgMHgwMDAwMDAyNCB9LAorCXsgMHgwODAwNDUwZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwYTA1MCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU2NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU2NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA1NywgMHgwMDAwMDAwOCB9LAorCXsgMHgwM2NjYTViNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwNTQzMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAyMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0Y2NjZTA2MywgMHgwMDAwMDAzMCB9LAorCXsgMHgwODI3NDU2NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA2MywgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwNDU2NCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU2NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA1YSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDgwMjA2NiwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDIwMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDBmZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTAwMDA2OSwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDFmMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFjMDBmZiwgMHgwMDAwMDAwNCB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwMDA4NSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwMDAwMDA1YSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU3NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAxMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDA4MjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgxODAwNjUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDA5MjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBhMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBmMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDQwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA3OSwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwZTU2MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGMwZTVmOSwgMHgwMDAwMDBjMiB9LAorCXsgMHgwMDAwMDA2ZSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwYTA2ZSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU3NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU3NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTUwZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA3YywgMHgwMDAwMDAxOCB9LAorCXsgMHgwMGMwZTVmOSwgMHgwMDAwMDBjMiB9LAorCXsgMHgwMDAwMDA3YywgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDE0ZTUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDQwZTUwZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGMwMDA3ZiwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU3MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU3MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU3MiwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU2OCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA4OSwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDBiMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgxOGMwZTU2MiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA4YiwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMGMwMDA4YSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDA3MDBlNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA5NywgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDBjYTA5OSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwNDViYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjA5YSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwZTViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZTViYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDEyMDAwMCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDEyMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMiwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgyMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZTgyMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgyZSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMmNjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE0MDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjZTFjYywgMHgwMDAwMDAwNCB9LAorCXsgMHgwNTBkZTFjZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDBhNywgMHgwMDAwMDAyMCB9LAorCXsgMHg0MjAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDBhZSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE0MDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE2MDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg3MDBjZTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE0MDBhYSwgMHgwMDAwMDAwOCB9LAorCXsgMHg0MDAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMjQwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MDBlZTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMjQwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MDAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMjQwZTUxYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDgwZTUwYSwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDgwZTUwYiwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDIyMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDA3MDBlNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDBjMSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDBjMjA5YSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODgwZTViZCwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDBjMjA5OSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwZTViYiwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDBjMjA5YSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODgwZTViYywgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDAwMDBjNCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDgwZTViZCwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDAwZTViYiwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDgwZTViYywgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDIxMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMjgwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGMwMDBjOCwgMHgwMDAwMDAxOCB9LAorCXsgMHg0MTgwZTAwMCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwMDBjYSwgMHgwMDAwMDAyNCB9LAorCXsgMHgwMTAwMDAwMCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMTAwZTUxZCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwNDViYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwODBjNCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZjNjZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGNjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwOGMwNTNjZiwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwODAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZjNkMiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGNjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwOGMwNTNkMywgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwODAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZjM5ZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGNjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwOGMwNTM5ZSwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwODAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwM2MwMDgzMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MjAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgyMDAwNDVlMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTVlMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDA3MDBlMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwZTM5NCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorfTsKKworc3RhdGljIGludCBSQURFT05fUkVBRF9QTEwoZHJtX2RldmljZV90ICpkZXYsIGludCBhZGRyKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlSQURFT05fV1JJVEU4KFJBREVPTl9DTE9DS19DTlRMX0lOREVYLCBhZGRyICYgMHgxZik7CisJcmV0dXJuIFJBREVPTl9SRUFEKFJBREVPTl9DTE9DS19DTlRMX0RBVEEpOworfQorCisjaWYgUkFERU9OX0ZJRk9fREVCVUcKK3N0YXRpYyB2b2lkIHJhZGVvbl9zdGF0dXMoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJcHJpbnRrKCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlwcmludGsoICJSQkJNX1NUQVRVUyA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU1RBVFVTICkgKTsKKwlwcmludGsoICJDUF9SQl9SVFBSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQ1BfUkJfUlBUUiApICk7CisJcHJpbnRrKCAiQ1BfUkJfV1RQUiA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1dQVFIgKSApOworCXByaW50ayggIkFJQ19DTlRMID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX0NOVEwgKSApOworCXByaW50ayggIkFJQ19TVEFUID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1NUQVQgKSApOworCXByaW50ayggIkFJQ19QVF9CQVNFID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1BUX0JBU0UgKSApOworCXByaW50ayggIlRMQl9BRERSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1RMQl9BRERSICkgKTsKKwlwcmludGsoICJUTEJfREFUQSA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSQURFT05fUkVBRCggUkFERU9OX0FJQ19UTEJfREFUQSApICk7Cit9CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmdpbmUsIEZJRk8gY29udHJvbAorICovCisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3BpeGNhY2hlX2ZsdXNoKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiB0bXA7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisKKwl0bXAgID0gUkFERU9OX1JFQUQoIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQgKTsKKwl0bXAgfD0gUkFERU9OX1JCMkRfRENfRkxVU0hfQUxMOworCVJBREVPTl9XUklURSggUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVCwgdG1wICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpZiAoICEoUkFERU9OX1JFQUQoIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQgKQorCQkgICAgICAgJiBSQURFT05fUkIyRF9EQ19CVVNZKSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBSQURFT05fRklGT19ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlyYWRlb25fc3RhdHVzKCBkZXZfcHJpdiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9kb193YWl0X2Zvcl9maWZvKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICAgIGludCBlbnRyaWVzICkKK3sKKwlpbnQgaTsKKworCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCWludCBzbG90cyA9ICggUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NUQVRVUyApCisJCQkgICAgICAmIFJBREVPTl9SQkJNX0ZJRk9DTlRfTUFTSyApOworCQlpZiAoIHNsb3RzID49IGVudHJpZXMgKSByZXR1cm4gMDsKKwkJRFJNX1VERUxBWSggMSApOworCX0KKworI2lmIFJBREVPTl9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCXJhZGVvbl9zdGF0dXMoIGRldl9wcml2ICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGksIHJldDsKKworCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKworCXJldCA9IHJhZGVvbl9kb193YWl0X2Zvcl9maWZvKCBkZXZfcHJpdiwgNjQgKTsKKwlpZiAoIHJldCApIHJldHVybiByZXQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpZiAoICEoUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NUQVRVUyApCisJCSAgICAgICAmIFJBREVPTl9SQkJNX0FDVElWRSkgKSB7CisJCQlyYWRlb25fZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUkFERU9OX0ZJRk9fREVCVUcKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisJcmFkZW9uX3N0YXR1cyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBjb250cm9sLCBpbml0aWFsaXphdGlvbgorICovCisKKy8qIExvYWQgdGhlIG1pY3JvY29kZSBmb3IgdGhlIENQICovCitzdGF0aWMgdm9pZCByYWRlb25fY3BfbG9hZF9taWNyb2NvZGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9BRERSLCAwICk7CisKKwlpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPT1VQ09ERV9SMjAwKSB7CisJCURSTV9JTkZPKCJMb2FkaW5nIFIyMDAgTWljcm9jb2RlXG4iKTsKKwkJZm9yICggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkgCisJCXsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBSCwKKwkJCQkgICAgICBSMjAwX2NwX21pY3JvY29kZVtpXVsxXSApOworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFMLAorCQkJCSAgICAgIFIyMDBfY3BfbWljcm9jb2RlW2ldWzBdICk7CisJCX0KKwl9IGVsc2UgaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjMwMCkgeworCQlEUk1fSU5GTygiTG9hZGluZyBSMzAwIE1pY3JvY29kZVxuIik7CisJCWZvciAoIGkgPSAwIDsgaSA8IDI1NiA7IGkrKyApIAorCQl7CisJCQlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9NRV9SQU1fREFUQUgsCisJCQkJICAgICAgUjMwMF9jcF9taWNyb2NvZGVbaV1bMV0gKTsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBTCwKKwkJCQkgICAgICBSMzAwX2NwX21pY3JvY29kZVtpXVswXSApOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkgeworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFILAorCQkJCSAgICAgIHJhZGVvbl9jcF9taWNyb2NvZGVbaV1bMV0gKTsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBTCwKKwkJCQkgICAgICByYWRlb25fY3BfbWljcm9jb2RlW2ldWzBdICk7CisJCX0KKwl9Cit9CisKKy8qIEZsdXNoIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSBDUC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBqdXN0CisgKiBwcmlvciB0byBhIHdhaXQgZm9yIGlkbGUsIGFzIGl0IGluZm9ybXMgdGhlIGVuZ2luZSB0aGF0IHRoZSBjb21tYW5kCisgKiBzdHJlYW0gaXMgZW5kaW5nLgorICovCitzdGF0aWMgdm9pZCByYWRlb25fZG9fY3BfZmx1c2goIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJRFJNX0RFQlVHKCAiXG4iICk7CisjaWYgMAorCXUzMiB0bXA7CisKKwl0bXAgPSBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1dQVFIgKSB8ICgxIDw8IDMxKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9SQl9XUFRSLCB0bXAgKTsKKyNlbmRpZgorfQorCisvKiBXYWl0IGZvciB0aGUgQ1AgdG8gZ28gaWRsZS4KKyAqLworaW50IHJhZGVvbl9kb19jcF9pZGxlKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fUklORyggNiApOworCisJUkFERU9OX1BVUkdFX0NBQ0hFKCk7CisJUkFERU9OX1BVUkdFX1pDQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworCUNPTU1JVF9SSU5HKCk7CisKKwlyZXR1cm4gcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7Cit9CisKKy8qIFN0YXJ0IHRoZSBDb21tYW5kIFByb2Nlc3Nvci4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2RvX2NwX3N0YXJ0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9DU1FfQ05UTCwgZGV2X3ByaXYtPmNwX21vZGUgKTsKKworCWRldl9wcml2LT5jcF9ydW5uaW5nID0gMTsKKworCUJFR0lOX1JJTkcoIDYgKTsKKworCVJBREVPTl9QVVJHRV9DQUNIRSgpOworCVJBREVPTl9QVVJHRV9aQ0FDSEUoKTsKKwlSQURFT05fV0FJVF9VTlRJTF9JRExFKCk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKwlDT01NSVRfUklORygpOworfQorCisvKiBSZXNldCB0aGUgQ29tbWFuZCBQcm9jZXNzb3IuICBUaGlzIHdpbGwgbm90IGZsdXNoIGFueSBwZW5kaW5nCisgKiBjb21tYW5kcywgc28geW91IG11c3Qgd2FpdCBmb3IgdGhlIENQIGNvbW1hbmQgc3RyZWFtIHRvIGNvbXBsZXRlCisgKiBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHJhZGVvbl9kb19jcF9yZXNldCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgY3VyX3JlYWRfcHRyOworCURSTV9ERUJVRyggIlxuIiApOworCisJY3VyX3JlYWRfcHRyID0gUkFERU9OX1JFQUQoIFJBREVPTl9DUF9SQl9SUFRSICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfV1BUUiwgY3VyX3JlYWRfcHRyICk7CisJU0VUX1JJTkdfSEVBRCggZGV2X3ByaXYsIGN1cl9yZWFkX3B0ciApOworCWRldl9wcml2LT5yaW5nLnRhaWwgPSBjdXJfcmVhZF9wdHI7Cit9CisKKy8qIFN0b3AgdGhlIENvbW1hbmQgUHJvY2Vzc29yLiAgVGhpcyB3aWxsIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICogY29tbWFuZHMsIHNvIHlvdSBtdXN0IGZsdXNoIHRoZSBjb21tYW5kIHN0cmVhbSBhbmQgd2FpdCBmb3IgdGhlIENQCisgKiB0byBnbyBpZGxlIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2RvX2NwX3N0b3AoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9DU1FfQ05UTCwgUkFERU9OX0NTUV9QUklESVNfSU5ERElTICk7CisKKwlkZXZfcHJpdi0+Y3BfcnVubmluZyA9IDA7Cit9CisKKy8qIFJlc2V0IHRoZSBlbmdpbmUuICBUaGlzIHdpbGwgc3RvcCB0aGUgQ1AgaWYgaXQgaXMgcnVubmluZy4KKyAqLworc3RhdGljIGludCByYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCByYmJtX3NvZnRfcmVzZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyYWRlb25fZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisKKwljbG9ja19jbnRsX2luZGV4ID0gUkFERU9OX1JFQUQoIFJBREVPTl9DTE9DS19DTlRMX0lOREVYICk7CisJbWNsa19jbnRsID0gUkFERU9OX1JFQURfUExMKCBkZXYsIFJBREVPTl9NQ0xLX0NOVEwgKTsKKworCVJBREVPTl9XUklURV9QTEwoIFJBREVPTl9NQ0xLX0NOVEwsICggbWNsa19jbnRsIHwKKwkJCQkJICAgICAgUkFERU9OX0ZPUkNFT05fTUNMS0EgfAorCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9NQ0xLQiB8CisgCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9ZQ0xLQSB8CisJCQkJCSAgICAgIFJBREVPTl9GT1JDRU9OX1lDTEtCIHwKKwkJCQkJICAgICAgUkFERU9OX0ZPUkNFT05fTUMgfAorCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9BSUMgKSApOworCisJcmJibV9zb2Z0X3Jlc2V0ID0gUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NPRlRfUkVTRVQgKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX1JCQk1fU09GVF9SRVNFVCwgKCByYmJtX3NvZnRfcmVzZXQgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfQ1AgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfSEkgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfU0UgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUkUgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUFAgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfRTIgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUkIgKSApOworCVJBREVPTl9SRUFEKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VUICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAoIHJiYm1fc29mdF9yZXNldCAmCisJCQkJCQl+KCBSQURFT05fU09GVF9SRVNFVF9DUCB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9ISSB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9TRSB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9SRSB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9QUCB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9FMiB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9SQiApICkgKTsKKwlSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU09GVF9SRVNFVCApOworCisKKwlSQURFT05fV1JJVEVfUExMKCBSQURFT05fTUNMS19DTlRMLCBtY2xrX2NudGwgKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DTE9DS19DTlRMX0lOREVYLCBjbG9ja19jbnRsX2luZGV4ICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAgcmJibV9zb2Z0X3Jlc2V0ICk7CisKKwkvKiBSZXNldCB0aGUgQ1AgcmluZyAqLworCXJhZGVvbl9kb19jcF9yZXNldCggZGV2X3ByaXYgKTsKKworCS8qIFRoZSBDUCBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y3BfcnVubmluZyA9IDA7CisKKwkvKiBSZXNldCBhbnkgcGVuZGluZyB2ZXJ0ZXgsIGluZGlyZWN0IGJ1ZmZlcnMgKi8KKwlyYWRlb25fZnJlZWxpc3RfcmVzZXQoIGRldiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHJpbmdfc3RhcnQsIGN1cl9yZWFkX3B0cjsKKwl1MzIgdG1wOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgKi8KKwlSQURFT05fV1JJVEUoIFJBREVPTl9NQ19GQl9MT0NBVElPTiwKKwkJICAgICAgKCAoIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0IC0gMSApICYgMHhmZmZmMDAwMCApCisJCSAgICB8ICggZGV2X3ByaXYtPmZiX2xvY2F0aW9uID4+IDE2ICkgKTsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCVJBREVPTl9XUklURSggUkFERU9OX01DX0FHUF9MT0NBVElPTiwKKwkJCSAgICAgICgoKGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0IC0gMSArCisJCQkJIGRldl9wcml2LT5nYXJ0X3NpemUpICYgMHhmZmZmMDAwMCkgfAorCQkJICAgICAgIChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCA+PiAxNikpICk7CisKKwkJcmluZ19zdGFydCA9IChkZXZfcHJpdi0+Y3BfcmluZy0+b2Zmc2V0CisJCQkgICAgICAtIGRldi0+YWdwLT5iYXNlCisJCQkgICAgICArIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKyAgICAgICB9IGVsc2UKKyNlbmRpZgorCQlyaW5nX3N0YXJ0ID0gKGRldl9wcml2LT5jcF9yaW5nLT5vZmZzZXQKKwkJCSAgICAgIC0gZGV2LT5zZy0+aGFuZGxlCisJCQkgICAgICArIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKworCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX0JBU0UsIHJpbmdfc3RhcnQgKTsKKworCS8qIFNldCB0aGUgd3JpdGUgcG9pbnRlciBkZWxheSAqLworCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1dQVFJfREVMQVksIDAgKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJpbmcgYnVmZmVyJ3MgcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMgKi8KKwljdXJfcmVhZF9wdHIgPSBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1JQVFIgKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9SQl9XUFRSLCBjdXJfcmVhZF9wdHIgKTsKKwlTRVRfUklOR19IRUFEKCBkZXZfcHJpdiwgY3VyX3JlYWRfcHRyICk7CisJZGV2X3ByaXYtPnJpbmcudGFpbCA9IGN1cl9yZWFkX3B0cjsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1JQVFJfQUREUiwKKwkJCSAgICAgIGRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldAorCQkJICAgICAgLSBkZXYtPmFncC0+YmFzZQorCQkJICAgICAgKyBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCQl1bnNpZ25lZCBsb25nIHRtcF9vZnMsIHBhZ2Vfb2ZzOworCisJCXRtcF9vZnMgPSBkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQgLSBkZXYtPnNnLT5oYW5kbGU7CisJCXBhZ2Vfb2ZzID0gdG1wX29mcyA+PiBQQUdFX1NISUZUOworCisJCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1JQVFJfQUREUiwKKwkJCSAgICAgZW50cnktPmJ1c2FkZHJbcGFnZV9vZnNdKTsKKwkJRFJNX0RFQlVHKCAicmluZyBycHRyOiBvZmZzZXQ9MHglMDhseCBoYW5kbGU9MHglMDhseFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+YnVzYWRkcltwYWdlX29mc10sCisJCQkgICBlbnRyeS0+aGFuZGxlICsgdG1wX29mcyApOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgcG9pbnRlci4gIFRoaXMgd2lsbCBjYXVzZQorCSAqIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSB3cml0dGVuIG91dCB0byBtZW1vcnkKKwkgKiB3aGVuZXZlciB0aGV5IGFyZSB1cGRhdGVkLgorCSAqCisJICogV2Ugc2ltcGx5IHB1dCB0aGlzIGJlaGluZCB0aGUgcmluZyByZWFkIHBvaW50ZXIsIHRoaXMgd29ya3MKKwkgKiB3aXRoIFBDSSBHQVJUIGFzIHdlbGwgYXMgKHdoYXRldmVyIGtpbmQgb2YpIEFHUCBHQVJUCisJICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fU0NSQVRDSF9BRERSLCBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1JQVFJfQUREUiApCisJCQkJCSArIFJBREVPTl9TQ1JBVENIX1JFR19PRkZTRVQgKTsKKworCWRldl9wcml2LT5zY3JhdGNoID0gKChfX3ZvbGF0aWxlX18gdTMyICopCisJCQkgICAgIGRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSArCisJCQkgICAgIChSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUIC8gc2l6ZW9mKHUzMikpKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX1NDUkFUQ0hfVU1TSywgMHg3ICk7CisKKwkvKiBXcml0ZWJhY2sgZG9lc24ndCBzZWVtIHRvIHdvcmsgZXZlcnl3aGVyZSwgdGVzdCBpdCBmaXJzdCAqLworCURSTV9XUklURTMyKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRigxKSwgMCApOworCVJBREVPTl9XUklURSggUkFERU9OX1NDUkFUQ0hfUkVHMSwgMHhkZWFkYmVlZiApOworCisJZm9yICggdG1wID0gMCA7IHRtcCA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyB0bXArKyApIHsKKwkJaWYgKCBEUk1fUkVBRDMyKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRigxKSApID09IDB4ZGVhZGJlZWYgKQorCQkJYnJlYWs7CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKwlpZiAoIHRtcCA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgKSB7CisJCWRldl9wcml2LT53cml0ZWJhY2tfd29ya3MgPSAxOworCQlEUk1fREVCVUcoICJ3cml0ZWJhY2sgdGVzdCBzdWNjZWVkZWQsIHRtcD0lZFxuIiwgdG1wICk7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPndyaXRlYmFja193b3JrcyA9IDA7CisJCURSTV9ERUJVRyggIndyaXRlYmFjayB0ZXN0IGZhaWxlZFxuIiApOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lID0gZGV2X3ByaXYtPnNjcmF0Y2hbMF0gPSAwOworCVJBREVPTl9XUklURSggUkFERU9OX0xBU1RfRlJBTUVfUkVHLAorCQkgICAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSBkZXZfcHJpdi0+c2NyYXRjaFsxXSA9IDA7CisJUkFERU9OX1dSSVRFKCBSQURFT05fTEFTVF9ESVNQQVRDSF9SRUcsCisJCSAgICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoICk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhciA9IGRldl9wcml2LT5zY3JhdGNoWzJdID0gMDsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9MQVNUX0NMRUFSX1JFRywKKwkJICAgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfY2xlYXIgKTsKKworCS8qIFNldCByaW5nIGJ1ZmZlciBzaXplICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfQ05UTCwgZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3IHwgUkFERU9OX0JVRl9TV0FQXzMyQklUICk7CisjZWxzZQorCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX0NOVEwsIGRldl9wcml2LT5yaW5nLnNpemVfbDJxdyApOworI2VuZGlmCisKKwlyYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCS8qIFR1cm4gb24gYnVzIG1hc3RlcmluZyAqLworCXRtcCA9IFJBREVPTl9SRUFEKCBSQURFT05fQlVTX0NOVEwgKSAmIH5SQURFT05fQlVTX01BU1RFUl9ESVM7CisJUkFERU9OX1dSSVRFKCBSQURFT05fQlVTX0NOVEwsIHRtcCApOworCisJLyogU3luYyBldmVyeXRoaW5nIHVwICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fSVNZTkNfQ05UTCwKKwkJICAgICAgKFJBREVPTl9JU1lOQ19BTlkyRF9JRExFM0QgfAorCQkgICAgICAgUkFERU9OX0lTWU5DX0FOWTNEX0lETEUyRCB8CisJCSAgICAgICBSQURFT05fSVNZTkNfV0FJVF9JRExFR1VJIHwKKwkJICAgICAgIFJBREVPTl9JU1lOQ19DUFNDUkFUQ0hfSURMRUdVSSkgKTsKK30KKworLyogRW5hYmxlIG9yIGRpc2FibGUgUENJIEdBUlQgb24gdGhlIGNoaXAgKi8KK3N0YXRpYyB2b2lkIHJhZGVvbl9zZXRfcGNpZ2FydCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgb24gKQoreworCXUzMiB0bXAJPSBSQURFT05fUkVBRCggUkFERU9OX0FJQ19DTlRMICk7CisKKwlpZiAoIG9uICkgeworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfQ05UTCwgdG1wIHwgUkFERU9OX1BDSUdBUlRfVFJBTlNMQVRFX0VOICk7CisKKwkJLyogc2V0IFBDSSBHQVJUIHBhZ2UtdGFibGUgYmFzZSBhZGRyZXNzCisJCSAqLworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfUFRfQkFTRSwgZGV2X3ByaXYtPmJ1c19wY2lfZ2FydCApOworCisJCS8qIHNldCBhZGRyZXNzIHJhbmdlIGZvciBQQ0kgYWRkcmVzcyB0cmFuc2xhdGUKKwkJICovCisJCVJBREVPTl9XUklURSggUkFERU9OX0FJQ19MT19BRERSLCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCApOworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfSElfQUREUiwgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQKKwkJCQkJCSAgKyBkZXZfcHJpdi0+Z2FydF9zaXplIC0gMSk7CisKKwkJLyogVHVybiBvZmYgQUdQIGFwZXJ0dXJlIC0tIGlzIHRoaXMgcmVxdWlyZWQgZm9yIFBDSSBHQVJUPworCQkgKi8KKwkJUkFERU9OX1dSSVRFKCBSQURFT05fTUNfQUdQX0xPQ0FUSU9OLCAweGZmZmZmZmMwICk7IC8qID8/ICovCisJCVJBREVPTl9XUklURSggUkFERU9OX0FHUF9DT01NQU5ELCAwICk7IC8qIGNsZWFyIEFHUF9DT01NQU5EICovCisJfSBlbHNlIHsKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fQUlDX0NOVEwsIHRtcCAmIH5SQURFT05fUENJR0FSVF9UUkFOU0xBVEVfRU4gKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfY3AoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fcmFkZW9uX2luaXRfdCAqaW5pdCApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTs7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlkZXZfcHJpdi0+aXNfcGNpID0gaW5pdC0+aXNfcGNpOworCisJaWYgKCBkZXZfcHJpdi0+aXNfcGNpICYmICFkZXYtPnNnICkgeworCQlEUk1fRVJST1IoICJQQ0kgR0FSVCBtZW1vcnkgbm90IGFsbG9jYXRlZCFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPnVzZWNfdGltZW91dCA9IGluaXQtPnVzZWNfdGltZW91dDsKKwlpZiAoIGRldl9wcml2LT51c2VjX3RpbWVvdXQgPCAxIHx8CisJICAgICBkZXZfcHJpdi0+dXNlY190aW1lb3V0ID4gUkFERU9OX01BWF9VU0VDX1RJTUVPVVQgKSB7CisJCURSTV9ERUJVRyggIlRJTUVPVVQgcHJvYmxlbSFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJc3dpdGNoKGluaXQtPmZ1bmMpIHsKKwljYXNlIFJBREVPTl9JTklUX1IyMDBfQ1A6CisJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj1VQ09ERV9SMjAwOworCQlicmVhazsKKwljYXNlIFJBREVPTl9JTklUX1IzMDBfQ1A6CisJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj1VQ09ERV9SMzAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249VUNPREVfUjEwMDsKKwl9CisJCisJZGV2X3ByaXYtPmRvX2JveGVzID0gMDsKKwlkZXZfcHJpdi0+Y3BfbW9kZSA9IGluaXQtPmNwX21vZGU7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gYnVzLW1hc3RlcmluZyByaW5nIG1vZGUsCisJICogYnV0IHRoZSByaW5nIGNhbiBiZSBpbiBlaXRoZXIgQUdQIG9yIFBDSSBzcGFjZSBmb3IgdGhlIHJpbmcKKwkgKiByZWFkIHBvaW50ZXIuCisJICovCisJaWYgKCAoIGluaXQtPmNwX21vZGUgIT0gUkFERU9OX0NTUV9QUklCTV9JTkRESVMgKSAmJgorCSAgICAgKCBpbml0LT5jcF9tb2RlICE9IFJBREVPTl9DU1FfUFJJQk1fSU5EQk0gKSApIHsKKwkJRFJNX0RFQlVHKCAiQkFEIGNwX21vZGUgKCV4KSFcbiIsIGluaXQtPmNwX21vZGUgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJc3dpdGNoICggaW5pdC0+ZmJfYnBwICkgeworCWNhc2UgMTY6CisJCWRldl9wcml2LT5jb2xvcl9mbXQgPSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+Y29sb3JfZm10ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODsKKwkJYnJlYWs7CisJfQorCWRldl9wcml2LT5mcm9udF9vZmZzZXQJPSBpbml0LT5mcm9udF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X3BpdGNoCT0gaW5pdC0+ZnJvbnRfcGl0Y2g7CisJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0CT0gaW5pdC0+YmFja19vZmZzZXQ7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2gJPSBpbml0LT5iYWNrX3BpdGNoOworCisJc3dpdGNoICggaW5pdC0+ZGVwdGhfYnBwICkgeworCWNhc2UgMTY6CisJCWRldl9wcml2LT5kZXB0aF9mbXQgPSBSQURFT05fREVQVEhfRk9STUFUXzE2QklUX0lOVF9aOworCQlicmVhazsKKwljYXNlIDMyOgorCWRlZmF1bHQ6CisJCWRldl9wcml2LT5kZXB0aF9mbXQgPSBSQURFT05fREVQVEhfRk9STUFUXzI0QklUX0lOVF9aOworCQlicmVhazsKKwl9CisJZGV2X3ByaXYtPmRlcHRoX29mZnNldAk9IGluaXQtPmRlcHRoX29mZnNldDsKKwlkZXZfcHJpdi0+ZGVwdGhfcGl0Y2gJPSBpbml0LT5kZXB0aF9waXRjaDsKKworCS8qIEhhcmR3YXJlIHN0YXRlIGZvciBkZXB0aCBjbGVhcnMuICBSZW1vdmUgdGhpcyBpZi93aGVuIHdlIG5vCisJICogbG9uZ2VyIGNsZWFyIHRoZSBkZXB0aCBidWZmZXIgd2l0aCBhIDNEIHJlY3RhbmdsZS4gIEhhcmQtY29kZQorCSAqIGFsbCB2YWx1ZXMgdG8gcHJldmVudCB1bndhbnRlZCAzRCBzdGF0ZSBmcm9tIHNsaXBwaW5nIHRocm91Z2gKKwkgKiBhbmQgc2NyZXdpbmcgd2l0aCB0aGUgY2xlYXIgb3BlcmF0aW9uLgorCSAqLworCWRldl9wcml2LT5kZXB0aF9jbGVhci5yYjNkX2NudGwgPSAoUkFERU9OX1BMQU5FX01BU0tfRU5BQkxFIHwKKwkJCQkJICAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgMTApIHwKKwkJCQkJICAgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMTAwID8gUkFERU9OX1pCTE9DSzE2IDogMCkpOworCisJZGV2X3ByaXYtPmRlcHRoX2NsZWFyLnJiM2RfenN0ZW5jaWxjbnRsID0gCisJCShkZXZfcHJpdi0+ZGVwdGhfZm10IHwKKwkJIFJBREVPTl9aX1RFU1RfQUxXQVlTIHwKKwkJIFJBREVPTl9TVEVOQ0lMX1RFU1RfQUxXQVlTIHwKKwkJIFJBREVPTl9TVEVOQ0lMX1NfRkFJTF9SRVBMQUNFIHwKKwkJIFJBREVPTl9TVEVOQ0lMX1pQQVNTX1JFUExBQ0UgfAorCQkgUkFERU9OX1NURU5DSUxfWkZBSUxfUkVQTEFDRSB8CisJCSBSQURFT05fWl9XUklURV9FTkFCTEUpOworCisJZGV2X3ByaXYtPmRlcHRoX2NsZWFyLnNlX2NudGwgPSAoUkFERU9OX0ZGQUNFX0NVTExfQ1cgfAorCQkJCQkgUkFERU9OX0JGQUNFX1NPTElEIHwKKwkJCQkJIFJBREVPTl9GRkFDRV9TT0xJRCB8CisJCQkJCSBSQURFT05fRkxBVF9TSEFERV9WVFhfTEFTVCB8CisJCQkJCSBSQURFT05fRElGRlVTRV9TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9BTFBIQV9TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9TUEVDVUxBUl9TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9GT0dfU0hBREVfRkxBVCB8CisJCQkJCSBSQURFT05fVlRYX1BJWF9DRU5URVJfT0dMIHwKKwkJCQkJIFJBREVPTl9ST1VORF9NT0RFX1RSVU5DIHwKKwkJCQkJIFJBREVPTl9ST1VORF9QUkVDXzhUSF9QSVgpOworCisJRFJNX0dFVFNBUkVBKCk7CisKKwlkZXZfcHJpdi0+ZmJfb2Zmc2V0ID0gaW5pdC0+ZmJfb2Zmc2V0OworCWRldl9wcml2LT5tbWlvX29mZnNldCA9IGluaXQtPm1taW9fb2Zmc2V0OworCWRldl9wcml2LT5yaW5nX29mZnNldCA9IGluaXQtPnJpbmdfb2Zmc2V0OworCWRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0ID0gaW5pdC0+cmluZ19ycHRyX29mZnNldDsKKwlkZXZfcHJpdi0+YnVmZmVyc19vZmZzZXQgPSBpbml0LT5idWZmZXJzX29mZnNldDsKKwlkZXZfcHJpdi0+Z2FydF90ZXh0dXJlc19vZmZzZXQgPSBpbml0LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKKwkKKwlpZighZGV2X3ByaXYtPnNhcmVhKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIG1taW8gcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+Y3BfcmluZyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5yaW5nX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5jcF9yaW5nKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgY3AgcmluZyByZWdpb24hXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT5yaW5nX3JwdHIgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+cmluZ19ycHRyX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5yaW5nX3JwdHIpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCByaW5nIHJlYWQgcG9pbnRlciFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0ICkgeworCQlkZXZfcHJpdi0+Z2FydF90ZXh0dXJlcyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5nYXJ0X3RleHR1cmVzX29mZnNldCk7CisJCWlmICggIWRldl9wcml2LT5nYXJ0X3RleHR1cmVzICkgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBHQVJUIHRleHR1cmUgcmVnaW9uIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCQkoZHJtX3JhZGVvbl9zYXJlYV90ICopKCh1OCAqKWRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKKwkJCQkgICAgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPmNwX3JpbmcsIGRldiApOworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYgKTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCWlmKCFkZXZfcHJpdi0+Y3BfcmluZy0+aGFuZGxlIHx8CisJCSAgICFkZXZfcHJpdi0+cmluZ19ycHRyLT5oYW5kbGUgfHwKKwkJICAgIWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSkgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBpb3JlbWFwIGFncCByZWdpb25zIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUgPQorCQkJKHZvaWQgKilkZXZfcHJpdi0+Y3BfcmluZy0+b2Zmc2V0OworCQlkZXZfcHJpdi0+cmluZ19ycHRyLT5oYW5kbGUgPQorCQkJKHZvaWQgKilkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQ7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSA9ICh2b2lkICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0OworCisJCURSTV9ERUJVRyggImRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUgJXBcbiIsCisJCQkgICBkZXZfcHJpdi0+Y3BfcmluZy0+aGFuZGxlICk7CisJCURSTV9ERUJVRyggImRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSAlcFxuIiwKKwkJCSAgIGRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSApOworCQlEUk1fREVCVUcoICJkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgJXBcbiIsCisJCQkgICBkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKTsKKwl9CisKKwlkZXZfcHJpdi0+ZmJfbG9jYXRpb24gPSAoIFJBREVPTl9SRUFEKCBSQURFT05fTUNfRkJfTE9DQVRJT04gKQorCQkJCSYgMHhmZmZmICkgPDwgMTY7CisKKwlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ID0gKCgoZGV2X3ByaXYtPmZyb250X3BpdGNoLzY0KSA8PCAyMikgfAorCQkJCQkoICggZGV2X3ByaXYtPmZyb250X29mZnNldAorCQkJCQkgICsgZGV2X3ByaXYtPmZiX2xvY2F0aW9uICkgPj4gMTAgKSApOworCisJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ID0gKCgoZGV2X3ByaXYtPmJhY2tfcGl0Y2gvNjQpIDw8IDIyKSB8CisJCQkJICAgICAgICggKCBkZXZfcHJpdi0+YmFja19vZmZzZXQKKwkJCQkJICsgZGV2X3ByaXYtPmZiX2xvY2F0aW9uICkgPj4gMTAgKSApOworCisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldCA9ICgoKGRldl9wcml2LT5kZXB0aF9waXRjaC82NCkgPDwgMjIpIHwKKwkJCQkJKCAoIGRldl9wcml2LT5kZXB0aF9vZmZzZXQKKwkJCQkJICArIGRldl9wcml2LT5mYl9sb2NhdGlvbiApID4+IDEwICkgKTsKKworCisJZGV2X3ByaXYtPmdhcnRfc2l6ZSA9IGluaXQtPmdhcnRfc2l6ZTsKKwlkZXZfcHJpdi0+Z2FydF92bV9zdGFydCA9IGRldl9wcml2LT5mYl9sb2NhdGlvbgorCQkJCSsgUkFERU9OX1JFQUQoIFJBREVPTl9DT05GSUdfQVBFUl9TSVpFICk7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkKKwkJZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgPSAoZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0CisJCQkJCQktIGRldi0+YWdwLT5iYXNlCisJCQkJCQkrIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKwllbHNlCisjZW5kaWYKKwkJZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgPSAoZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0CisJCQkJCQktIGRldi0+c2ctPmhhbmRsZQorCQkJCQkJKyBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCk7CisKKwlEUk1fREVCVUcoICJkZXZfcHJpdi0+Z2FydF9zaXplICVkXG4iLAorCQkgICBkZXZfcHJpdi0+Z2FydF9zaXplICk7CisJRFJNX0RFQlVHKCAiZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgMHgleFxuIiwKKwkJICAgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKTsKKwlEUk1fREVCVUcoICJkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCAweCVseFxuIiwKKwkJICAgZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKTsKKworCWRldl9wcml2LT5yaW5nLnN0YXJ0ID0gKHUzMiAqKWRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGU7CisJZGV2X3ByaXYtPnJpbmcuZW5kID0gKCh1MzIgKilkZXZfcHJpdi0+Y3BfcmluZy0+aGFuZGxlCisJCQkgICAgICArIGluaXQtPnJpbmdfc2l6ZSAvIHNpemVvZih1MzIpKTsKKwlkZXZfcHJpdi0+cmluZy5zaXplID0gaW5pdC0+cmluZ19zaXplOworCWRldl9wcml2LT5yaW5nLnNpemVfbDJxdyA9IGRybV9vcmRlciggaW5pdC0+cmluZ19zaXplIC8gOCApOworCisJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0KKwkJKGRldl9wcml2LT5yaW5nLnNpemUgLyBzaXplb2YodTMyKSkgLSAxOworCisJZGV2X3ByaXYtPnJpbmcuaGlnaF9tYXJrID0gUkFERU9OX1JJTkdfSElHSF9NQVJLOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJLyogVHVybiBvZmYgUENJIEdBUlQgKi8KKwkJcmFkZW9uX3NldF9wY2lnYXJ0KCBkZXZfcHJpdiwgMCApOworCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9pbml0KCBkZXYsICZkZXZfcHJpdi0+cGh5c19wY2lfZ2FydCwKKwkJCQkJICAgICZkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0KSkgeworCQkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGluaXQgUENJIEdBUlQhXG4iICk7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQl9CisKKwkJLyogVHVybiBvbiBQQ0kgR0FSVCAqLworCQlyYWRlb25fc2V0X3BjaWdhcnQoIGRldl9wcml2LCAxICk7CisJfQorCisJcmFkZW9uX2NwX2xvYWRfbWljcm9jb2RlKCBkZXZfcHJpdiApOworCXJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKCBkZXYsIGRldl9wcml2ICk7CisKKwlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKwlyYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX2NwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSBkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJaWYgKCBkZXZfcHJpdi0+Y3BfcmluZyAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+Y3BfcmluZywgZGV2ICk7CisJCWlmICggZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYgKTsKKwkJaWYgKCBkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwgKQorCQl7CisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCQlkZXYtPmFncF9idWZmZXJfbWFwID0gTlVMTDsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKCBkZXYsCisJCQkJCSAgICAgIGRldl9wcml2LT5waHlzX3BjaV9nYXJ0LAorCQkJCQkgICAgICBkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0ICkpCisJCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gY2xlYW51cCBQQ0kgR0FSVCFcbiIgKTsKKwl9CisJCisJLyogb25seSBjbGVhciB0byB0aGUgc3RhcnQgb2YgZmxhZ3MgKi8KKwltZW1zZXQoZGV2X3ByaXYsIDAsIG9mZnNldG9mKGRybV9yYWRlb25fcHJpdmF0ZV90LCBmbGFncykpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgY29kZSB3aWxsIHJlaW5pdCB0aGUgUmFkZW9uIENQIGhhcmR3YXJlIGFmdGVyIGEgcmVzdW1lIGZyb20gZGlzYy4gIAorICogQUZBSUssIGl0IHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0IHRvIHBpY2tsZSB0aGUgc3RhdGUgYXQgc3VzcGVuZCB0aW1lLCBzbyAKKyAqIGhlcmUgd2UgbWFrZSBzdXJlIHRoYXQgYWxsIFJhZGVvbiBoYXJkd2FyZSBpbml0aWFsaXNhdGlvbiBpcyByZS1kb25lIHdpdGhvdXQKKyAqIGFmZmVjdGluZyBydW5uaW5nIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBDaGFybCBQLiBCb3RoYSA8aHR0cDovL2NwYm90aGEubmV0PgorICovCitzdGF0aWMgaW50IHJhZGVvbl9kb19yZXN1bWVfY3AoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIkNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlEUk1fREVCVUcoIlN0YXJ0aW5nIHJhZGVvbl9kb19yZXN1bWVfY3AoKVxuIik7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQkvKiBUdXJuIG9mZiBQQ0kgR0FSVCAqLworCQlyYWRlb25fc2V0X3BjaWdhcnQoIGRldl9wcml2LCAwICk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8qIFR1cm4gb24gUENJIEdBUlQgKi8KKwkJcmFkZW9uX3NldF9wY2lnYXJ0KCBkZXZfcHJpdiwgMSApOworCX0KKworCXJhZGVvbl9jcF9sb2FkX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKwlyYWRlb25fY3BfaW5pdF9yaW5nX2J1ZmZlciggZGV2LCBkZXZfcHJpdiApOworCisJcmFkZW9uX2RvX2VuZ2luZV9yZXNldCggZGV2ICk7CisKKwlEUk1fREVCVUcoInJhZGVvbl9kb19yZXN1bWVfY3AoKSBjb21wbGV0ZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcmFkZW9uX2NwX2luaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25faW5pdF90IGluaXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbml0LCAoZHJtX3JhZGVvbl9pbml0X3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGluaXQpICk7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBSQURFT05fSU5JVF9DUDoKKwljYXNlIFJBREVPTl9JTklUX1IyMDBfQ1A6CisJY2FzZSBSQURFT05fSU5JVF9SMzAwX0NQOgorCQlyZXR1cm4gcmFkZW9uX2RvX2luaXRfY3AoIGRldiwgJmluaXQgKTsKKwljYXNlIFJBREVPTl9DTEVBTlVQX0NQOgorCQlyZXR1cm4gcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRldiApOworCX0KKworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKK2ludCByYWRlb25fY3Bfc3RhcnQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCBkZXZfcHJpdi0+Y3BfcnVubmluZyApIHsKKwkJRFJNX0RFQlVHKCAiJXMgd2hpbGUgQ1AgcnVubmluZ1xuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIGRldl9wcml2LT5jcF9tb2RlID09IFJBREVPTl9DU1FfUFJJRElTX0lORERJUyApIHsKKwkJRFJNX0RFQlVHKCAiJXMgY2FsbGVkIHdpdGggYm9ndXMgQ1AgbW9kZSAoJWQpXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkZXZfcHJpdi0+Y3BfbW9kZSApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYWRlb25fZG9fY3Bfc3RhcnQoIGRldl9wcml2ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcCB0aGUgQ1AuICBUaGUgZW5naW5lIG11c3QgaGF2ZSBiZWVuIGlkbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHJvdXRpbmUuCisgKi8KK2ludCByYWRlb25fY3Bfc3RvcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2NwX3N0b3BfdCBzdG9wOworCWludCByZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzdG9wLCAoZHJtX3JhZGVvbl9jcF9zdG9wX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHN0b3ApICk7CisKKwlpZiAoIWRldl9wcml2LT5jcF9ydW5uaW5nKQorCQlyZXR1cm4gMDsKKworCS8qIEZsdXNoIGFueSBwZW5kaW5nIENQIGNvbW1hbmRzLiAgVGhpcyBlbnN1cmVzIGFueSBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIGFyZSBleGVjdHV0ZWQgYnkgdGhlIGVuZ2luZSBiZWZvcmUgd2UgdHVybiBpdCBvZmYuCisJICovCisJaWYgKCBzdG9wLmZsdXNoICkgeworCQlyYWRlb25fZG9fY3BfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJLyogSWYgd2UgZmFpbCB0byBtYWtlIHRoZSBlbmdpbmUgZ28gaWRsZSwgd2UgcmV0dXJuIGFuIGVycm9yCisJICogY29kZSBzbyB0aGF0IHRoZSBEUk0gaW9jdGwgd3JhcHBlciBjYW4gdHJ5IGFnYWluLgorCSAqLworCWlmICggc3RvcC5pZGxlICkgeworCQlyZXQgPSByYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKKwkJaWYgKCByZXQgKSByZXR1cm4gcmV0OworCX0KKworCS8qIEZpbmFsbHksIHdlIGNhbiB0dXJuIG9mZiB0aGUgQ1AuICBJZiB0aGUgZW5naW5lIGlzbid0IGlkbGUsCisJICogd2Ugd2lsbCBnZXQgc29tZSBkcm9wcGVkIHRyaWFuZ2xlcyBhcyB0aGV5IHdvbid0IGJlIGZ1bGx5CisJICogcmVuZGVyZWQgYmVmb3JlIHRoZSBDUCBpcyBzaHV0IGRvd24uCisJICovCisJcmFkZW9uX2RvX2NwX3N0b3AoIGRldl9wcml2ICk7CisKKwkvKiBSZXNldCB0aGUgZW5naW5lICovCisJcmFkZW9uX2RvX2VuZ2luZV9yZXNldCggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHJhZGVvbl9kb19yZWxlYXNlKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgcmV0OworCisJaWYgKGRldl9wcml2KSB7CisJCWlmIChkZXZfcHJpdi0+Y3BfcnVubmluZykgeworCQkJLyogU3RvcCB0aGUgY3AgKi8KKwkJCXdoaWxlICgocmV0ID0gcmFkZW9uX2RvX2NwX2lkbGUoIGRldl9wcml2ICkpICE9IDApIHsKKwkJCQlEUk1fREVCVUcoInJhZGVvbl9kb19jcF9pZGxlICVkXG4iLCByZXQpOworI2lmZGVmIF9fbGludXhfXworCQkJCXNjaGVkdWxlKCk7CisjZWxzZQorCQkJCXRzbGVlcCgmcmV0LCBQWkVSTywgInJkbnJlbCIsIDEpOworI2VuZGlmCisJCQl9CisJCQlyYWRlb25fZG9fY3Bfc3RvcCggZGV2X3ByaXYgKTsKKwkJCXJhZGVvbl9kb19lbmdpbmVfcmVzZXQoIGRldiApOworCQl9CisKKwkJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisJCWlmIChkZXZfcHJpdi0+bW1pbykJLyogcmVtb3ZlIHRoaXMgYWZ0ZXIgcGVybWFuZW50IGFkZG1hcHMgKi8KKwkJCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwgMCApOworCisJCWlmIChkZXZfcHJpdi0+bW1pbykgey8qIHJlbW92ZSBhbGwgc3VyZmFjZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwkJCQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0lORk8gKyAxNippLCAwKTsKKwkJCQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYqaSwgMCk7CisJCQkJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORCArIDE2KmksIDApOworCQkJfQorCQl9CisKKwkJLyogRnJlZSBtZW1vcnkgaGVhcCBzdHJ1Y3R1cmVzICovCisJCXJhZGVvbl9tZW1fdGFrZWRvd24oICYoZGV2X3ByaXYtPmdhcnRfaGVhcCkgKTsKKwkJcmFkZW9uX21lbV90YWtlZG93biggJihkZXZfcHJpdi0+ZmJfaGVhcCkgKTsKKworCQkvKiBkZWFsbG9jYXRlIGtlcm5lbCByZXNvdXJjZXMgKi8KKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRldiApOworCX0KK30KKworLyogSnVzdCByZXNldCB0aGUgQ1AgcmluZy4gIENhbGxlZCBhcyBwYXJ0IG9mIGFuIFggU2VydmVyIGVuZ2luZSByZXNldC4KKyAqLworaW50IHJhZGVvbl9jcF9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0RFQlVHKCAiJXMgY2FsbGVkIGJlZm9yZSBpbml0IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJhZGVvbl9kb19jcF9yZXNldCggZGV2X3ByaXYgKTsKKworCS8qIFRoZSBDUCBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y3BfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJhZGVvbl9jcF9pZGxlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiByYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKK30KKworLyogQWRkZWQgYnkgQ2hhcmwgUC4gQm90aGEgdG8gY2FsbCByYWRlb25fZG9fcmVzdW1lX2NwKCkuCisgKi8KK2ludCByYWRlb25fY3BfcmVzdW1lKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKworCXJldHVybiByYWRlb25fZG9fcmVzdW1lX2NwKGRldik7Cit9CisKKworaW50IHJhZGVvbl9lbmdpbmVfcmVzZXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiByYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdWxsc2NyZWVuIG1vZGUKKyAqLworCisvKiBLVzogRGVwcmVjYXRlZCB0byBzYXkgdGhlIGxlYXN0OgorICovCitpbnQgcmFkZW9uX2Z1bGxzY3JlZW4oIERSTV9JT0NUTF9BUkdTICkKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcmVlbGlzdCBtYW5hZ2VtZW50CisgKi8KKworLyogT3JpZ2luYWwgY29tbWVudDogRklYTUU6IFJPVEFURV9CVUZTIGlzIGEgaGFjayB0byBjeWNsZSB0aHJvdWdoCisgKiAgIGJ1ZnMgdW50aWwgZnJlZWxpc3QgY29kZSBpcyB1c2VkLiAgTm90ZSB0aGlzIGhpZGVzIGEgcHJvYmxlbSB3aXRoCisgKiAgIHRoZSBzY3JhdGNoIHJlZ2lzdGVyICogKHVzZWQgdG8ga2VlcCB0cmFjayBvZiBsYXN0IGJ1ZmZlcgorICogICBjb21wbGV0ZWQpIGJlaW5nIHdyaXR0ZW4gdG8gYmVmb3JlICogdGhlIGxhc3QgYnVmZmVyIGhhcyBhY3R1YWxseQorICogICBjb21wbGV0ZWQgcmVuZGVyaW5nLiAgCisgKgorICogS1c6ICBJdCdzIGFsc28gYSBnb29kIHdheSB0byBmaW5kIGZyZWUgYnVmZmVycyBxdWlja2x5LgorICoKKyAqIEtXOiBJZGVhbGx5IHRoaXMgbG9vcCB3b3VsZG4ndCBleGlzdCwgYW5kIGZyZWVsaXN0X2dldCB3b3VsZG4ndAorICogc2xlZXAuICBIb3dldmVyLCBidWdzIGluIG9sZGVyIHZlcnNpb25zIG9mIHJhZGVvbl9hY2NlbC5jIG1lYW4gdGhhdAorICogd2UgZXNzZW50aWFsbHkgaGF2ZSB0byBkbyB0aGlzLCBlbHNlIG9sZCBjbGllbnRzIHdpbGwgYnJlYWsuCisgKiAKKyAqIEhvd2V2ZXIsIGl0IGRvZXMgbGVhdmUgb3BlbiBhIHBvdGVudGlhbCBkZWFkbG9jayB3aGVyZSBhbGwgdGhlCisgKiBidWZmZXJzIGFyZSBoZWxkIGJ5IG90aGVyIGNsaWVudHMsIHdoaWNoIGNhbid0IHJlbGVhc2UgdGhlbSBiZWNhdXNlCisgKiB0aGV5IGNhbid0IGdldCB0aGUgbG9jay4gIAorICovCisKK2RybV9idWZfdCAqcmFkZW9uX2ZyZWVsaXN0X2dldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlpbnQgaSwgdDsKKwlpbnQgc3RhcnQ7CisKKwlpZiAoICsrZGV2X3ByaXYtPmxhc3RfYnVmID49IGRtYS0+YnVmX2NvdW50ICkKKwkJZGV2X3ByaXYtPmxhc3RfYnVmID0gMDsKKworCXN0YXJ0ID0gZGV2X3ByaXYtPmxhc3RfYnVmOworCisJZm9yICggdCA9IDAgOyB0IDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IHQrKyApIHsKKwkJdTMyIGRvbmVfYWdlID0gR0VUX1NDUkFUQ0goIDEgKTsKKwkJRFJNX0RFQlVHKCJkb25lX2FnZSA9ICVkXG4iLGRvbmVfYWdlKTsKKwkJZm9yICggaSA9IHN0YXJ0IDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkJaWYgKCBidWYtPmZpbHAgPT0gMCB8fCAoYnVmLT5wZW5kaW5nICYmIAorCQkJCQkgICAgICAgYnVmX3ByaXYtPmFnZSA8PSBkb25lX2FnZSkgKSB7CisJCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKys7CisJCQkJYnVmLT5wZW5kaW5nID0gMDsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQkJc3RhcnQgPSAwOworCQl9CisKKwkJaWYgKHQpIHsKKwkJCURSTV9VREVMQVkoIDEgKTsKKwkJCWRldl9wcml2LT5zdGF0cy5mcmVlbGlzdF9sb29wcysrOworCQl9CisJfQorCisJRFJNX0RFQlVHKCAicmV0dXJuaW5nIE5VTEwhXG4iICk7CisJcmV0dXJuIE5VTEw7Cit9CisjaWYgMAorZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9idWZfdCAqYnVmOworCWludCBpLCB0OworCWludCBzdGFydDsKKwl1MzIgZG9uZV9hZ2UgPSBEUk1fUkVBRDMyKGRldl9wcml2LT5yaW5nX3JwdHIsIFJBREVPTl9TQ1JBVENIT0ZGKDEpKTsKKworCWlmICggKytkZXZfcHJpdi0+bGFzdF9idWYgPj0gZG1hLT5idWZfY291bnQgKQorCQlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCisJc3RhcnQgPSBkZXZfcHJpdi0+bGFzdF9idWY7CisJZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKys7CisJCisJZm9yICggdCA9IDAgOyB0IDwgMiA7IHQrKyApIHsKKwkJZm9yICggaSA9IHN0YXJ0IDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkJaWYgKCBidWYtPmZpbHAgPT0gMCB8fCAoYnVmLT5wZW5kaW5nICYmIAorCQkJCQkgICAgICAgYnVmX3ByaXYtPmFnZSA8PSBkb25lX2FnZSkgKSB7CisJCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKys7CisJCQkJYnVmLT5wZW5kaW5nID0gMDsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQl9CisJCXN0YXJ0ID0gMDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCit2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCWZvciAoIGkgPSAwIDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCWJ1Zl9wcml2LT5hZ2UgPSAwOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBjb21tYW5kIHN1Ym1pc3Npb24KKyAqLworCitpbnQgcmFkZW9uX3dhaXRfcmluZyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApCit7CisJZHJtX3JhZGVvbl9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJmRldl9wcml2LT5yaW5nOworCWludCBpOworCXUzMiBsYXN0X2hlYWQgPSBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJdTMyIGhlYWQgPSBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOworCisJCXJpbmctPnNwYWNlID0gKGhlYWQgLSByaW5nLT50YWlsKSAqIHNpemVvZih1MzIpOworCQlpZiAoIHJpbmctPnNwYWNlIDw9IDAgKQorCQkJcmluZy0+c3BhY2UgKz0gcmluZy0+c2l6ZTsKKwkJaWYgKCByaW5nLT5zcGFjZSA+IG4gKQorCQkJcmV0dXJuIDA7CisJCQorCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisKKwkJaWYgKGhlYWQgIT0gbGFzdF9oZWFkKQorCQkJaSA9IDA7CisJCWxhc3RfaGVhZCA9IGhlYWQ7CisKKwkJRFJNX1VERUxBWSggMSApOworCX0KKworCS8qIEZJWE1FOiBUaGlzIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkIGluIHRoZSBCRUdJTl9SSU5HIG1hY3JvISAqLworI2lmIFJBREVPTl9GSUZPX0RFQlVHCisJcmFkZW9uX3N0YXR1cyggZGV2X3ByaXYgKTsKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2dldF9idWZmZXJzKCBEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQgKQoreworCWludCBpOworCWRybV9idWZfdCAqYnVmOworCisJZm9yICggaSA9IGQtPmdyYW50ZWRfY291bnQgOyBpIDwgZC0+cmVxdWVzdF9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gcmFkZW9uX2ZyZWVsaXN0X2dldCggZGV2ICk7CisJCWlmICggIWJ1ZiApIHJldHVybiBEUk1fRVJSKEVCVVNZKTsgLyogTk9URTogYnJva2VuIGNsaWVudCAqLworCisJCWJ1Zi0+ZmlscCA9IGZpbHA7CisKKwkJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCAmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLCAmYnVmLT5pZHgsCisJCQkJICAgc2l6ZW9mKGJ1Zi0+aWR4KSApICkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCWlmICggRFJNX0NPUFlfVE9fVVNFUiggJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sICZidWYtPnRvdGFsLAorCQkJCSAgIHNpemVvZihidWYtPnRvdGFsKSApICkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkJZC0+Z3JhbnRlZF9jb3VudCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJhZGVvbl9jcF9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQgcmV0ID0gMDsKKwlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fZG1hX3QgZDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGQsIGFyZ3AsIHNpemVvZihkKSApOworCisJLyogUGxlYXNlIGRvbid0IHNlbmQgdXMgYnVmZmVycy4KKwkgKi8KKwlpZiAoIGQuc2VuZF9jb3VudCAhPSAwICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgdmlhIGRybURNQVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnNlbmRfY291bnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKiBXZSdsbCBzZW5kIHlvdSBidWZmZXJzLgorCSAqLworCWlmICggZC5yZXF1ZXN0X2NvdW50IDwgMCB8fCBkLnJlcXVlc3RfY291bnQgPiBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWQuZ3JhbnRlZF9jb3VudCA9IDA7CisKKwlpZiAoIGQucmVxdWVzdF9jb3VudCApIHsKKwkJcmV0ID0gcmFkZW9uX2NwX2dldF9idWZmZXJzKCBmaWxwLCBkZXYsICZkICk7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCggYXJncCwgZCwgc2l6ZW9mKGQpICk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2RyaXZlcl9wcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2OworCWludCByZXQgPSAwOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV9yYWRlb25fcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX3JhZGVvbl9wcml2YXRlX3QpKTsKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwlkZXZfcHJpdi0+ZmxhZ3MgPSBmbGFnczsKKworCXN3aXRjaCAoZmxhZ3MgJiBDSElQX0ZBTUlMWV9NQVNLKSB7CisJY2FzZSBDSElQX1IxMDA6CisJY2FzZSBDSElQX1JWMjAwOgorCWNhc2UgQ0hJUF9SMjAwOgorCWNhc2UgQ0hJUF9SMzAwOgorCQlkZXZfcHJpdi0+ZmxhZ3MgfD0gQ0hJUF9IQVNfSElFUlo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJLyogYWxsIG90aGVyIGNoaXBzIGhhdmUgbm8gaGllcmFyY2hpY2FsIHogYnVmZmVyICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKCpkZXZfcHJpdiksIERSTV9NRU1fRFJJVkVSKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU2MmQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8qIHJhZGVvbl9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgcmFkZW9uIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpZm5kZWYgX19SQURFT05fRFJNX0hfXworI2RlZmluZSBfX1JBREVPTl9EUk1fSF9fCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyYWRlb25fc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19SQURFT05fU0FSRUFfREVGSU5FU19fCisKKy8qIE9sZCBzdHlsZSBzdGF0ZSBmbGFncywgcmVxdWlyZWQgZm9yIHNhcmVhIGludGVyZmFjZSAoMS4xIGFuZCAxLjIKKyAqIGNsZWFycykgYW5kIDEuMiBkcm1fdmVydGV4MiBpb2N0bC4KKyAqLworI2RlZmluZSBSQURFT05fVVBMT0FEX0NPTlRFWFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9WRVJURk1UCQkweDAwMDAwMDAyCisjZGVmaW5lIFJBREVPTl9VUExPQURfTElORQkJMHgwMDAwMDAwNAorI2RlZmluZSBSQURFT05fVVBMT0FEX0JVTVBNQVAJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NQVNLUwkJMHgwMDAwMDAxMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1ZJRVdQT1JUCQkweDAwMDAwMDIwCisjZGVmaW5lIFJBREVPTl9VUExPQURfU0VUVVAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9UQ0wJCTB4MDAwMDAwODAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NSVNDCQkweDAwMDAwMTAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMAkJMHgwMDAwMDIwMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RFWDEJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgyCQkweDAwMDAwODAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMElNQUdFUwkweDAwMDAxMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUwkweDAwMDAyMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMklNQUdFUwkweDAwMDA0MDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ0xJUFJFQ1RTCQkweDAwMDA4MDAwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRQkweDAwMDEwMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfWkJJQVMJCTB4MDAwMjAwMDAgLyogdmVyc2lvbiAxLjIgYW5kIG5ld2VyICovCisjZGVmaW5lIFJBREVPTl9VUExPQURfQUxMCQkweDAwM2VmZmZmCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ09OVEVYVF9BTEwgICAgICAgMHgwMDNlMDFmZgorCisKKy8qIE5ldyBzdHlsZSBwZXItcGFja2V0IGlkZW50aWZpZXJzIGZvciB1c2UgaW4gY21kX2J1ZmZlciBpb2N0bCB3aXRoCisgKiB0aGUgUkFERU9OX0VNSVRfUEFDS0VUIGNvbW1hbmQuICBDb21tZW50cyByZWxhdGUgbmV3IHBhY2tldHMgdG8gb2xkCisgKiBzdGF0ZSBiaXRzIGFuZCB0aGUgcGFja2V0IHNpemU6CisgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGNvbnRleHQvNyAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogY29udGV4dC8zICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JCM0RfQ09MT1JQSVRDSCAgICAgICAgICAgICAgICAgMiAvKiBjb250ZXh0LzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkVfTElORV9QQVRURVJOICAgICAgICAgICAgICAgICAzIC8qIGxpbmUvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgIDQgLyogbGluZS8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0xVTV9NQVRSSVggICAgICAgICAgICAgICAgICAgNSAvKiBidW1wbWFwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfUk9UX01BVFJJWF8wICAgICAgICAgICAgICAgICA2IC8qIGJ1bXBtYXAvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9SQjNEX1NURU5DSUxSRUZNQVNLICAgICAgICAgICAgIDcgLyogbWFza3MvMyAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9WUE9SVF9YU0NBTEUgICAgICAgICAgICAgICAgIDggLyogdmlld3BvcnQvNiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDkgLyogc2V0dXAvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9DTlRMX1NUQVRVUyAgICAgICAgICAgICAgICAgIDEwIC8qIHNldHVwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkVfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAxMSAvKiBtaXNjLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAgICAxMiAvKiB0ZXgwLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgICAxMyAvKiB0ZXgwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAgICAxNCAvKiB0ZXgxLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzEgICAgICAgICAgICAgICAxNSAvKiB0ZXgxLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAgICAxNiAvKiB0ZXgyLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzIgICAgICAgICAgICAgICAxNyAvKiB0ZXgyLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfWkJJQVNfRkFDVE9SICAgICAgICAgICAgICAgICAxOCAvKiB6Ymlhcy8yICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCAgICAgICAgICAgMTkgLyogdGNsLzExICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEICAgMjAgLyogbWF0ZXJpYWwvMTcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzAgICAgICAgICAgICAgICAgICAgICAyMSAvKiB0ZXgwLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzEgICAgICAgICAgICAgICAgICAgICAyMiAvKiB0ZXgxLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzIgICAgICAgICAgICAgICAgICAgICAyMyAvKiB0ZXgyLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzMgICAgICAgICAgICAgICAgICAgICAyNCAvKiB0ZXgzLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzQgICAgICAgICAgICAgICAgICAgICAyNSAvKiB0ZXg0LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzUgICAgICAgICAgICAgICAgICAgICAyNiAvKiB0ZXg1LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzYgICAgICAgICAgICAgICAgICAgICAyNyAvKiAvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNyAgICAgICAgICAgICAgICAgICAgIDI4IC8qIC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAgICAgICAgICAgICAgMjkgLyogdGNsLzcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RGQUNUT1JfMCAgICAgICAgICAgICAgICAgICAgICAgICAzMCAvKiB0Zi83ICovCisjZGVmaW5lIFIyMDBfRU1JVF9WVFhfRk1UXzAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgLyogdnR4LzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1ZBUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAvKiB2YXAvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfTUFUUklYX1NFTEVDVF8wICAgICAgICAgICAgICAgICAgIDMzIC8qIG1zbC81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9URVhfUFJPQ19DVExfMiAgICAgICAgICAgICAgICAgICAgMzQgLyogdGNnLzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwgICAgICAgICAgICAzNSAvKiB0Y2wvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAgICAgIDM2IC8qIHRleDAvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAgICAgIDM3IC8qIHRleDEvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAgICAgIDM4IC8qIHRleDIvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMyAgICAgICAgICAgICAgICAgICAgIDM5IC8qIHRleDMvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNCAgICAgICAgICAgICAgICAgICAgIDQwIC8qIHRleDQvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNSAgICAgICAgICAgICAgICAgICAgIDQxIC8qIHRleDUvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMCAgICAgICAgICAgICAgICAgICAgIDQyIC8qIHRleDAvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMSAgICAgICAgICAgICAgICAgICAgIDQzIC8qIHRleDEvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMiAgICAgICAgICAgICAgICAgICAgIDQ0IC8qIHRleDIvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMyAgICAgICAgICAgICAgICAgICAgIDQ1IC8qIHRleDMvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNCAgICAgICAgICAgICAgICAgICAgIDQ2IC8qIHRleDQvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNSAgICAgICAgICAgICAgICAgICAgIDQ3IC8qIHRleDUvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfVlRFX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4IC8qIHZ0ZS8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9PVVRQVVRfVlRYX0NPTVBfU0VMICAgICAgICAgICAgICAgNDkgLyogdnR4LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RBTV9ERUJVRzMgICAgICAgICAgICAgICAgICAgICA1MCAvKiB0YW0vMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ05UTF9YICAgICAgICAgICAgICAgICAgICAgICAgIDUxIC8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SQjNEX0RFUFRIWFlfT0ZGU0VUICAgICAgICAgICAgICAgNTIgLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX0FVWF9TQ0lTU09SX0NOVEwgICAgICAgICAgICAgICA1MyAvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8wICAgICAgICAgICAgICAgICAgIDU0IC8qIGNzdC8yICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzEgICAgICAgICAgICAgICAgICAgNTUgLyogY3N0LzIgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMiAgICAgICAgICAgICAgICAgICA1NiAvKiBjc3QvMiAqLworI2RlZmluZSBSMjAwX0VNSVRfU0VfVkFQX0NOVExfU1RBVFVTICAgICAgICAgICAgICAgIDU3IC8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9TRV9WVFhfU1RBVEVfQ05UTCAgICAgICAgICAgICAgICAgNTggLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1BPSU5UU0laRSAgICAgICAgICAgICAgICAgICAgICA1OSAvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wICAgICAgIDYwIC8qIGNzdC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgICAgICAgNjEKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMCAgICAgICAgICAgICAgICA2MgorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzEgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgICAgICA2NQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18yICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18zICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMyAgICAgICAgICAgICAgICA2OAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNCAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQgICAgICAgICAgICAgICAgNzAKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzUgICAgICAgICAgICAgICAgICA3MQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181ICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMSAgICAgICAgICAgICAgICAgICA3NAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8yICAgICAgICAgICAgICAgICAgIDc1CisjZGVmaW5lIFIyMDBfRU1JVF9SQjNEX0JMRU5EQ09MT1IgICAgICAgICAgICAgICAgICAgNzYKKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCAgICAgICAgICAgICA3NworI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgICAgIDc4CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDAgICAgICAgICAgICAgNzkKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QxICAgICAgICAgICAgIDgxCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgICAgODIKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMiAgICAgICAgICAgICA4MworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTCAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIFJBREVPTl9NQVhfU1RBVEVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgODUKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsLiAgTW9yZSBjYW4gYmUgYWRkZWQgYnV0CisgKiBvYnZpb3VzbHkgdGhlc2UgY2FuJ3QgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkOgorICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUICAgICAgMSAvKiBlbWl0IG9uZSBvZiB0aGUgcmVnaXN0ZXIgcGFja2V0cyBhYm92ZSAqLworI2RlZmluZSBSQURFT05fQ01EX1NDQUxBUlMgICAgIDIgLyogZW1pdCBzY2FsYXIgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ1RPUlMgICAgIDMgLyogZW1pdCB2ZWN0b3IgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX0RNQV9ESVNDQVJEIDQgLyogZGlzY2FyZCBjdXJyZW50IGRtYSBidWYgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQzICAgICA1IC8qIGVtaXQgaHcgcGFja2V0ICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUM19DTElQIDYgLyogZW1pdCBodyBwYWNrZXQgd3JhcHBlZCBpbiBjbGlwcmVjdHMgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9TQ0FMQVJTMiAgICAgNyAvKiByMjAwIHN0b3BnYXAgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9XQUlUICAgICAgICAgOCAvKiBlbWl0IGh3IHdhaXQgY29tbWFuZHMgLS0gbm90ZToKKwkJCQkgICAqICBkb2Vzbid0IG1ha2UgdGhlIGNwdSB3YWl0LCBqdXN0CisJCQkJICAgKiAgdGhlIGdyYXBoaWNzIGhhcmR3YXJlICovCisKKwordHlwZWRlZiB1bmlvbiB7CisJaW50IGk7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhZDAsIHBhZDEsIHBhZDI7CisJfSBoZWFkZXI7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhY2tldF9pZCwgcGFkMCwgcGFkMTsKKwl9IHBhY2tldDsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgb2Zmc2V0LCBzdHJpZGUsIGNvdW50OyAKKwl9IHNjYWxhcnM7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIG9mZnNldCwgc3RyaWRlLCBjb3VudDsgCisJfSB2ZWN0b3JzOworCXN0cnVjdCB7IAorCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBidWZfaWR4LCBwYWQwLCBwYWQxOyAKKwl9IGRtYTsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgZmxhZ3MsIHBhZDAsIHBhZDE7IAorCX0gd2FpdDsKK30gZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3Q7CisKKyNkZWZpbmUgUkFERU9OX1dBSVRfMkQgIDB4MQorI2RlZmluZSBSQURFT05fV0FJVF8zRCAgMHgyCisKKworI2RlZmluZSBSQURFT05fRlJPTlQJCQkweDEKKyNkZWZpbmUgUkFERU9OX0JBQ0sJCQkweDIKKyNkZWZpbmUgUkFERU9OX0RFUFRICQkJMHg0CisjZGVmaW5lIFJBREVPTl9TVEVOQ0lMCQkJMHg4CisjZGVmaW5lIFJBREVPTl9DTEVBUl9GQVNUWgkJMHg4MDAwMDAwMAorI2RlZmluZSBSQURFT05fVVNFX0hJRVJaCQkweDQwMDAwMDAwCisjZGVmaW5lIFJBREVPTl9VU0VfQ09NUF9aQlVGCQkweDIwMDAwMDAwCisKKy8qIFByaW1pdGl2ZSB0eXBlcworICovCisjZGVmaW5lIFJBREVPTl9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUkFERU9OX0xJTkVTCQkJMHgyCisjZGVmaW5lIFJBREVPTl9MSU5FX1NUUklQCQkweDMKKyNkZWZpbmUgUkFERU9OX1RSSUFOR0xFUwkJMHg0CisjZGVmaW5lIFJBREVPTl9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSQURFT05fVFJJQU5HTEVfU1RSSVAJCTB4NgorCisvKiBWZXJ0ZXgvaW5kaXJlY3QgYnVmZmVyIHNpemUKKyAqLworI2RlZmluZSBSQURFT05fQlVGRkVSX1NJWkUJCTY1NTM2CisKKy8qIEJ5dGUgb2Zmc2V0cyBmb3IgaW5kaXJlY3QgYnVmZmVyIGRhdGEKKyAqLworI2RlZmluZSBSQURFT05fSU5ERVhfUFJJTV9PRkZTRVQJMjAKKworI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUCTMyCisKKyNkZWZpbmUgUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUwkxMgorCisvKiBUaGVyZSBhcmUgMiBoZWFwcyAobG9jYWwvR0FSVCkuICBFYWNoIHJlZ2lvbiB3aXRoaW4gYSBoZWFwIGlzIGEKKyAqIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbSBwZXIgaGVhcC4KKyAqLworI2RlZmluZSBSQURFT05fTE9DQUxfVEVYX0hFQVAJCTAKKyNkZWZpbmUgUkFERU9OX0dBUlRfVEVYX0hFQVAJCTEKKyNkZWZpbmUgUkFERU9OX05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBSQURFT05fTlJfVEVYX1JFR0lPTlMJCTY0CisjZGVmaW5lIFJBREVPTl9MT0dfVEVYX0dSQU5VTEFSSVRZCTE2CisKKyNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX0xFVkVMUwkxMgorI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfVU5JVFMJMworCisjZGVmaW5lIFJBREVPTl9NQVhfU1VSRkFDRVMJCTgKKworLyogQmxpdHMgaGF2ZSBzdHJpY3Qgb2Zmc2V0IHJ1bGVzLiAgQWxsIGJsaXQgb2Zmc2V0IG11c3QgYmUgYWxpZ25lZCBvbgorICogYSAxSy1ieXRlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIFJBREVPTl9PRkZTRVRfU0hJRlQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUkFERU9OX09GRlNFVF9BTElHTiAgICAgICAgICAgICAoMSA8PCBSQURFT05fT0ZGU0VUX1NISUZUKQorI2RlZmluZSBSQURFT05fT0ZGU0VUX01BU0sgICAgICAgICAgICAgIChSQURFT05fT0ZGU0VUX0FMSUdOIC0gMSkKKworI2VuZGlmIC8qIF9fUkFERU9OX1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHJlZDsKKwl1bnNpZ25lZCBpbnQgZ3JlZW47CisJdW5zaWduZWQgaW50IGJsdWU7CisJdW5zaWduZWQgaW50IGFscGhhOworfSByYWRlb25fY29sb3JfcmVnc190OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogQ29udGV4dCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBwcF9taXNjOwkJCQkvKiAweDFjMTQgKi8KKwl1bnNpZ25lZCBpbnQgcHBfZm9nX2NvbG9yOworCXVuc2lnbmVkIGludCByZV9zb2xpZF9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgcmIzZF9ibGVuZGNudGw7CisJdW5zaWduZWQgaW50IHJiM2RfZGVwdGhvZmZzZXQ7CisJdW5zaWduZWQgaW50IHJiM2RfZGVwdGhwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcmIzZF96c3RlbmNpbGNudGw7CisKKwl1bnNpZ25lZCBpbnQgcHBfY250bDsJCQkJLyogMHgxYzM4ICovCisJdW5zaWduZWQgaW50IHJiM2RfY250bDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9jb2xvcm9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmVfd2lkdGhfaGVpZ2h0OworCXVuc2lnbmVkIGludCByYjNkX2NvbG9ycGl0Y2g7CisJdW5zaWduZWQgaW50IHNlX2NudGw7CisKKwkvKiBWZXJ0ZXggZm9ybWF0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX2Nvb3JkX2ZtdDsJCQkvKiAweDFjNTAgKi8KKworCS8qIExpbmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbGluZV9wYXR0ZXJuOwkJCS8qIDB4MWNkMCAqLworCXVuc2lnbmVkIGludCByZV9saW5lX3N0YXRlOworCisJdW5zaWduZWQgaW50IHNlX2xpbmVfd2lkdGg7CQkJLyogMHgxZGI4ICovCisKKwkvKiBCdW1wbWFwIHN0YXRlICovCisJdW5zaWduZWQgaW50IHBwX2x1bV9tYXRyaXg7CQkJLyogMHgxZDAwICovCisKKwl1bnNpZ25lZCBpbnQgcHBfcm90X21hdHJpeF8wOwkJCS8qIDB4MWQ1OCAqLworCXVuc2lnbmVkIGludCBwcF9yb3RfbWF0cml4XzE7CisKKwkvKiBNYXNrIHN0YXRlICovCisJdW5zaWduZWQgaW50IHJiM2Rfc3RlbmNpbHJlZm1hc2s7CQkvKiAweDFkN2MgKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9yb3BjbnRsOworCXVuc2lnbmVkIGludCByYjNkX3BsYW5lbWFzazsKKworCS8qIFZpZXdwb3J0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3hzY2FsZTsJCQkvKiAweDFkOTggKi8KKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeXNjYWxlOworCXVuc2lnbmVkIGludCBzZV92cG9ydF95b2Zmc2V0OworCXVuc2lnbmVkIGludCBzZV92cG9ydF96c2NhbGU7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3pvZmZzZXQ7CisKKwkvKiBTZXR1cCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV9jbnRsX3N0YXR1czsJCQkvKiAweDIxNDAgKi8KKworCS8qIE1pc2Mgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVfdG9wX2xlZnQ7CQkJLyogMHgyNmMwICovCisJdW5zaWduZWQgaW50IHJlX21pc2M7Cit9IGRybV9yYWRlb25fY29udGV4dF9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBaYmlhcyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV96Ymlhc19mYWN0b3I7CQkJLyogMHgxZGFjICovCisJdW5zaWduZWQgaW50IHNlX3piaWFzX2NvbnN0YW50OworfSBkcm1fcmFkZW9uX2NvbnRleHQyX3JlZ3NfdDsKKworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcHBfdHhmaWx0ZXI7CisJdW5zaWduZWQgaW50IHBwX3R4Zm9ybWF0OworCXVuc2lnbmVkIGludCBwcF90eG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcHBfdHhjYmxlbmQ7CisJdW5zaWduZWQgaW50IHBwX3R4YWJsZW5kOworCXVuc2lnbmVkIGludCBwcF90ZmFjdG9yOworCXVuc2lnbmVkIGludCBwcF9ib3JkZXJfY29sb3I7Cit9IGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGZpbmlzaDsKKwl1bnNpZ25lZCBpbnQgcHJpbTo4OworCXVuc2lnbmVkIGludCBzdGF0ZWlkeDo4OworCXVuc2lnbmVkIGludCBudW12ZXJ0czoxNjsgLyogb3ZlcmxvYWRlZCBhcyBvZmZzZXQvNjQgZm9yIGVsdCBwcmltcyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OyAgIC8qIHZlcnRleCBmb3JtYXQgKi8KK30gZHJtX3JhZGVvbl9wcmltX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgY29udGV4dDsKKwlkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190IHRleFtSQURFT05fTUFYX1RFWFRVUkVfVU5JVFNdOworCWRybV9yYWRlb25fY29udGV4dDJfcmVnc190IGNvbnRleHQyOworCXVuc2lnbmVkIGludCBkaXJ0eTsKK30gZHJtX3JhZGVvbl9zdGF0ZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKwkgKiBrZXJuZWwgb24gZmlyaW5nIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGVpdGhlciBvZiB0aGUKKwkgKiBvYnNvbGV0ZWQgdmVydGV4L2luZGV4IGlvY3Rscy4KKwkgKi8KKwlkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisJZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdCB0ZXhfc3RhdGVbUkFERU9OX01BWF9URVhUVVJFX1VOSVRTXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJZHJtX2NsaXBfcmVjdF90IGJveGVzW1JBREVPTl9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CisJdW5zaWduZWQgaW50IGxhc3RfY2xlYXI7CisKKwlkcm1fdGV4X3JlZ2lvbl90IHRleF9saXN0W1JBREVPTl9OUl9URVhfSEVBUFNdW1JBREVPTl9OUl9URVhfUkVHSU9OUysxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSQURFT05fTlJfVEVYX0hFQVBTXTsKKwlpbnQgY3R4X293bmVyOworICAgICAgICBpbnQgcGZTdGF0ZTsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyb3Jtb3JlKSAqLworICAgICAgICBpbnQgcGZDdXJyZW50UGFnZTsJICAgIC8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCisJaW50IGNydGMyX2Jhc2U7CQkgICAgLyogQ1JUQzIgZnJhbWUgb2Zmc2V0ICovCisJaW50IHRpbGluZ19lbmFibGVkOwkvKiBzZXQgYnkgZHJtLCByZWFkIGJ5IDJkICsgM2QgY2xpZW50cyAqLworfSBkcm1fcmFkZW9uX3NhcmVhX3Q7CisKKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybVJhZGVvbi5oKQorICoKKyAqIEtXOiBhY3R1YWxseSBpdCdzIGlsbGVnYWwgdG8gY2hhbmdlIGFueSBvZiB0aGlzIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuCisgKi8KKworLyogUmFkZW9uIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9JTklUICAgIDB4MDAgCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RBUlQgICAweDAxIAorI2RlZmluZSBEUk1fUkFERU9OX0NQX1NUT1AgICAgMHgwMgorI2RlZmluZSBEUk1fUkFERU9OX0NQX1JFU0VUICAgMHgwMworI2RlZmluZSBEUk1fUkFERU9OX0NQX0lETEUgICAgMHgwNAorI2RlZmluZSBEUk1fUkFERU9OX1JFU0VUICAgICAgMHgwNSAKKyNkZWZpbmUgRFJNX1JBREVPTl9GVUxMU0NSRUVOIDB4MDYKKyNkZWZpbmUgRFJNX1JBREVPTl9TV0FQICAgICAgIDB4MDcgCisjZGVmaW5lIERSTV9SQURFT05fQ0xFQVIgICAgICAweDA4IAorI2RlZmluZSBEUk1fUkFERU9OX1ZFUlRFWCAgICAgMHgwOQorI2RlZmluZSBEUk1fUkFERU9OX0lORElDRVMgICAgMHgwQQorI2RlZmluZSBEUk1fUkFERU9OX05PVF9VU0VECisjZGVmaW5lIERSTV9SQURFT05fU1RJUFBMRSAgICAweDBDCisjZGVmaW5lIERSTV9SQURFT05fSU5ESVJFQ1QgICAweDBECisjZGVmaW5lIERSTV9SQURFT05fVEVYVFVSRSAgICAweDBFCisjZGVmaW5lIERSTV9SQURFT05fVkVSVEVYMiAgICAweDBGCisjZGVmaW5lIERSTV9SQURFT05fQ01EQlVGICAgICAweDEwCisjZGVmaW5lIERSTV9SQURFT05fR0VUUEFSQU0gICAweDExCisjZGVmaW5lIERSTV9SQURFT05fRkxJUCAgICAgICAweDEyCisjZGVmaW5lIERSTV9SQURFT05fQUxMT0MgICAgICAweDEzCisjZGVmaW5lIERSTV9SQURFT05fRlJFRSAgICAgICAweDE0CisjZGVmaW5lIERSTV9SQURFT05fSU5JVF9IRUFQICAweDE1CisjZGVmaW5lIERSTV9SQURFT05fSVJRX0VNSVQgICAweDE2CisjZGVmaW5lIERSTV9SQURFT05fSVJRX1dBSVQgICAweDE3CisjZGVmaW5lIERSTV9SQURFT05fQ1BfUkVTVU1FICAweDE4CisjZGVmaW5lIERSTV9SQURFT05fU0VUUEFSQU0gICAweDE5CisjZGVmaW5lIERSTV9SQURFT05fU1VSRl9BTExPQyAweDFhCisjZGVmaW5lIERSTV9SQURFT05fU1VSRl9GUkVFICAweDFiCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9JTklUICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX0lOSVQsIGRybV9yYWRlb25faW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1NUQVJUICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfU1RBUlQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfU1RPUCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9TVE9QLCBkcm1fcmFkZW9uX2NwX3N0b3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9SRVNFVCAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX0lETEUgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfSURMRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9SRVNFVCAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0ZVTExTQ1JFRU4gRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fRlVMTFNDUkVFTiwgZHJtX3JhZGVvbl9mdWxsc2NyZWVuX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1dBUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TV0FQKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NMRUFSICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ0xFQVIsIGRybV9yYWRlb25fY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9WRVJURVggICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1ZFUlRFWCwgZHJtX3JhZGVvbl92ZXJ0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JTkRJQ0VTICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lORElDRVMsIGRybV9yYWRlb25faW5kaWNlc190KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NUSVBQTEUgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1RJUFBMRSwgZHJtX3JhZGVvbl9zdGlwcGxlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5ESVJFQ1QgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JTkRJUkVDVCwgZHJtX3JhZGVvbl9pbmRpcmVjdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1RFWFRVUkUgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fVEVYVFVSRSwgZHJtX3JhZGVvbl90ZXh0dXJlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fVkVSVEVYMiAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9WRVJURVgyLCBkcm1fcmFkZW9uX3ZlcnRleDJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DTURCVUYgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NNREJVRiwgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VUUEFSQU0gICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRVRQQVJBTSwgZHJtX3JhZGVvbl9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0ZMSVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fRkxJUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9BTExPQyAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0FMTE9DLCBkcm1fcmFkZW9uX21lbV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0ZSRUUgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fRlJFRSwgZHJtX3JhZGVvbl9tZW1fZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lOSVRfSEVBUCAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5JVF9IRUFQLCBkcm1fcmFkZW9uX21lbV9pbml0X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JUlFfRU1JVCAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lSUV9FTUlULCBkcm1fcmFkZW9uX2lycV9lbWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSVJRX1dBSVQgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JUlFfV0FJVCwgZHJtX3JhZGVvbl9pcnFfd2FpdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1JFU1VNRSAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfUkVTVU1FKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NFVFBBUkFNICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU0VUUEFSQU0sIGRybV9yYWRlb25fc2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TVVJGX0FMTE9DIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NVUkZfQUxMT0MsIGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NVUkZfRlJFRSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1VSRl9GUkVFLCBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90KQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luaXQgeworCWVudW0geworCQlSQURFT05fSU5JVF9DUCAgICA9IDB4MDEsCisJCVJBREVPTl9DTEVBTlVQX0NQID0gMHgwMiwKKwkJUkFERU9OX0lOSVRfUjIwMF9DUCA9IDB4MDMsCisJCVJBREVPTl9JTklUX1IzMDBfQ1AgPSAweDA0CisJfSBmdW5jOworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGlzX3BjaTsKKwlpbnQgY3BfbW9kZTsKKwlpbnQgZ2FydF9zaXplOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX3JwdHJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBnYXJ0X3RleHR1cmVzX29mZnNldDsKK30gZHJtX3JhZGVvbl9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY3Bfc3RvcCB7CisJaW50IGZsdXNoOworCWludCBpZGxlOworfSBkcm1fcmFkZW9uX2NwX3N0b3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9mdWxsc2NyZWVuIHsKKwllbnVtIHsKKwkJUkFERU9OX0lOSVRfRlVMTFNDUkVFTiAgICA9IDB4MDEsCisJCVJBREVPTl9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fcmFkZW9uX2Z1bGxzY3JlZW5fdDsKKworI2RlZmluZSBDTEVBUl9YMQkwCisjZGVmaW5lIENMRUFSX1kxCTEKKyNkZWZpbmUgQ0xFQVJfWDIJMgorI2RlZmluZSBDTEVBUl9ZMgkzCisjZGVmaW5lIENMRUFSX0RFUFRICTQKKwordHlwZWRlZiB1bmlvbiBkcm1fcmFkZW9uX2NsZWFyX3JlY3QgeworCWZsb2F0IGZbNV07CisJdW5zaWduZWQgaW50IHVpWzVdOworfSBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7ICAgLyogbWlzbmFtZWQgZmllbGQ6ICBzaG91bGQgYmUgc3RlbmNpbCAqLworCWRybV9yYWRlb25fY2xlYXJfcmVjdF90IF9fdXNlciAqZGVwdGhfYm94ZXM7Cit9IGRybV9yYWRlb25fY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl92ZXJ0ZXggeworCWludCBwcmltOworCWludCBpZHg7CQkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBjb3VudDsJCQkvKiBOdW1iZXIgb2YgdmVydGljZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcmFkZW9uX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luZGljZXMgeworCWludCBwcmltOworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcmFkZW9uX2luZGljZXNfdDsKKworLyogdjEuMiAtIG9ic29sZXRlcyBkcm1fcmFkZW9uX3ZlcnRleCBhbmQgZHJtX3JhZGVvbl9pbmRpY2VzCisgKiAgICAgIC0gYWxsb3dzIG11bHRpcGxlIHByaW1pdGl2ZXMgYW5kIHN0YXRlIGNoYW5nZXMgaW4gYSBzaW5nbGUgaW9jdGwKKyAqICAgICAgLSBzdXBwb3J0cyBkcml2ZXIgY2hhbmdlIHRvIGVtaXQgbmF0aXZlIHByaW1pdGl2ZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl92ZXJ0ZXgyIHsKKwlpbnQgaWR4OwkJCS8qIEluZGV4IG9mIHZlcnRleCBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCisJaW50IG5yX3N0YXRlczsKKwlkcm1fcmFkZW9uX3N0YXRlX3QgX191c2VyICpzdGF0ZTsKKwlpbnQgbnJfcHJpbXM7CisJZHJtX3JhZGVvbl9wcmltX3QgX191c2VyICpwcmltOworfSBkcm1fcmFkZW9uX3ZlcnRleDJfdDsKKworLyogdjEuMyAtIG9ic29sZXRlcyBkcm1fcmFkZW9uX3ZlcnRleDIKKyAqICAgICAgLSBhbGxvd3MgYXJiaXRhcmlseSBsYXJnZSBjbGlwcmVjdCBsaXN0IAorICogICAgICAtIGFsbG93cyB1cGRhdGluZyBvZiB0Y2wgcGFja2V0LCB2ZWN0b3IgYW5kIHNjYWxhciBzdGF0ZQorICogICAgICAtIGFsbG93cyBtZW1vcnktZWZmaWNpZW50IGRlc2NyaXB0aW9uIG9mIHN0YXRlIHVwZGF0ZXMKKyAqICAgICAgLSBhbGxvd3Mgc3RhdGUgdG8gYmUgZW1pdHRlZCB3aXRob3V0IGEgcHJpbWl0aXZlIAorICogICAgICAgICAgIChmb3IgY2xlYXJzLCBjdHggc3dpdGNoZXMpCisgKiAgICAgIC0gYWxsb3dzIG1vcmUgdGhhbiBvbmUgZG1hIGJ1ZmZlciB0byBiZSByZWZlcmVuY2VkIHBlciBpb2N0bAorICogICAgICAtIHN1cHBvcnRzIHRjbCBkcml2ZXIKKyAqICAgICAgLSBtYXkgYmUgZXh0ZW5kZWQgaW4gZnV0dXJlIHZlcnNpb25zIHdpdGggbmV3IGNtZCB0eXBlcywgcGFja2V0cworICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NtZF9idWZmZXIgeworCWludCBidWZzejsKKwljaGFyIF9fdXNlciAqYnVmOworCWludCBuYm94OworCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzOworfSBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXhfaW1hZ2UgeworCXVuc2lnbmVkIGludCB4LCB5OwkJLyogQmxpdCBjb29yZGluYXRlcyAqLworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCWNvbnN0IHZvaWQgX191c2VyICpkYXRhOworfSBkcm1fcmFkZW9uX3RleF9pbWFnZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleHR1cmUgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJaW50IHBpdGNoOworCWludCBmb3JtYXQ7CisJaW50IHdpZHRoOwkJCS8qIFRleHR1cmUgaW1hZ2UgY29vcmRpbmF0ZXMgKi8KKwlpbnQgaGVpZ2h0OworCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICppbWFnZTsKK30gZHJtX3JhZGVvbl90ZXh0dXJlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3RpcHBsZSB7CisJdW5zaWduZWQgaW50IF9fdXNlciAqbWFzazsKK30gZHJtX3JhZGVvbl9zdGlwcGxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5kaXJlY3QgeworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7Cit9IGRybV9yYWRlb25faW5kaXJlY3RfdDsKKworCisvKiAxLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LiAgCisgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfQlVGRkVSX09GRlNFVCAgICAxIC8qIGNhcmQgb2Zmc2V0IG9mIDFzdCBHQVJUIGJ1ZmZlciAqLworI2RlZmluZSBSQURFT05fUEFSQU1fTEFTVF9GUkFNRSAgICAgICAgICAgIDIKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0xBU1RfRElTUEFUQ0ggICAgICAgICAzCisjZGVmaW5lIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSICAgICAgICAgICAgNAorLyogQWRkZWQgd2l0aCBEUk0gdmVyc2lvbiAxLjYuICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9JUlFfTlIgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFICAgICAgICAgICAgIDYgLyogY2FyZCBvZmZzZXQgb2YgR0FSVCBiYXNlICovCisvKiBBZGRlZCB3aXRoIERSTSB2ZXJzaW9uIDEuOC4gKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX1JFR0lTVEVSX0hBTkRMRSAgICAgICA3IC8qIGZvciBkcm1NYXAoKSAqLworI2RlZmluZSBSQURFT05fUEFSQU1fU1RBVFVTX0hBTkRMRSAgICAgICAgIDgKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRSAgICAgICAgICA5CisjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEUgICAgICAgMTAKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAxMQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCBfX3VzZXIgKnZhbHVlOworfSBkcm1fcmFkZW9uX2dldHBhcmFtX3Q7CisKKy8qIDEuNjogU2V0IHVwIGEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBSQURFT05fTUVNX1JFR0lPTl9HQVJUIDEKKyNkZWZpbmUgUkFERU9OX01FTV9SRUdJT05fRkIgICAyCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50IF9fdXNlciAqcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgR0FSVCAqLworfSBkcm1fcmFkZW9uX21lbV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX21lbV9mcmVlIHsKKwlpbnQgcmVnaW9uOworCWludCByZWdpb25fb2Zmc2V0OworfSBkcm1fcmFkZW9uX21lbV9mcmVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2luaXRfaGVhcCB7CisJaW50IHJlZ2lvbjsKKwlpbnQgc2l6ZTsKKwlpbnQgc3RhcnQ7CQorfSBkcm1fcmFkZW9uX21lbV9pbml0X2hlYXBfdDsKKworCisvKiAxLjY6IFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faXJxX2VtaXQgeworCWludCBfX3VzZXIgKmlycV9zZXE7Cit9IGRybV9yYWRlb25faXJxX2VtaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pcnFfd2FpdCB7CisJaW50IGlycV9zZXE7Cit9IGRybV9yYWRlb25faXJxX3dhaXRfdDsKKworCisvKiAxLjEwOiBDbGllbnRzIHRlbGwgdGhlIERSTSB3aGVyZSB0aGV5IHRoaW5rIHRoZSBmcmFtZWJ1ZmZlciBpcyBsb2NhdGVkIGluCisgKiB0aGUgY2FyZCdzIGFkZHJlc3Mgc3BhY2UsIHZpYSBhIG5ldyBnZW5lcmljIGlvY3RsIHRvIHNldCBwYXJhbWV0ZXJzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zZXRwYXJhbSB7CisJdW5zaWduZWQgaW50IHBhcmFtOworCWludDY0X3QgICAgICB2YWx1ZTsKK30gZHJtX3JhZGVvbl9zZXRwYXJhbV90OworCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9GQl9MT0NBVElPTiAgICAxCS8qIGRldGVybWluZWQgZnJhbWVidWZmZXIgbG9jYXRpb24gKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1NXSVRDSF9USUxJTkcgIDIJLyogZW5hYmxlL2Rpc2FibGUgY29sb3IgdGlsaW5nICovCisKKy8qIDEuMTQ6IENsaWVudHMgY2FuIGFsbG9jYXRlL2ZyZWUgYSBzdXJmYWNlCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3VyZmFjZV9hbGxvYyB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOworfSBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWUgeworCXVuc2lnbmVkIGludCBhZGRyZXNzOworfSBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCkBAIC0wLDAgKzEsMTI3IEBACisvKioKKyAqIFxmaWxlIHJhZGVvbl9kcnYuYworICogQVRJIFJhZGVvbiBkcml2ZXIKKyAqCisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXJhZGVvbl9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCByYWRlb25faW9jdGxzW107CitleHRlcm4gaW50IHJhZGVvbl9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfU0cgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9yYWRlb25fYnVmX3ByaXZfdCksCisJLnByZWluaXQgPSByYWRlb25fZHJpdmVyX3ByZWluaXQsCisJLnBvc3RjbGVhbnVwID0gcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cCwKKwkucHJlcmVsZWFzZSA9IHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucHJldGFrZWRvd24gPSByYWRlb25fZHJpdmVyX3ByZXRha2Vkb3duLAorCS5vcGVuX2hlbHBlciA9IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIsCisJLnZibGFua193YWl0ID0gcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyLAorCS5mcmVlX2ZpbHBfcHJpdiA9IHJhZGVvbl9kcml2ZXJfZnJlZV9maWxwX3ByaXYsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IHJhZGVvbl9pb2N0bHMsCisJLmRtYV9pb2N0bCA9IHJhZGVvbl9jcF9idWZmZXJzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgICAgICA9IHBjaWlkbGlzdCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCByYWRlb25faW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gcmFkZW9uX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByYWRlb25fZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChyYWRlb25faW5pdCk7Cittb2R1bGVfZXhpdChyYWRlb25fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzcwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaApAQCAtMCwwICsxLDEwNDQgQEAKKy8qIHJhZGVvbl9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgcmFkZW9uIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19SQURFT05fRFJWX0hfXworI2RlZmluZSBfX1JBREVPTl9EUlZfSF9fCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJHYXJldGggSHVnaGVzLCBLZWl0aCBXaGl0d2VsbCwgb3RoZXJzLiIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJInJhZGVvbiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJBVEkgUmFkZW9uIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUwMzExIgorCisvKiBJbnRlcmZhY2UgaGlzdG9yeToKKyAqCisgKiAxLjEgLSA/PworICogMS4yIC0gQWRkIHZlcnRleDIgaW9jdGwgKGtlaXRoKQorICogICAgIC0gQWRkIHN0ZW5jaWwgY2FwYWJpbGl0eSB0byBjbGVhciBpb2N0bCAoZ2FyZXRoLCBrZWl0aCkKKyAqICAgICAtIEluY3JlYXNlIE1BWF9URVhUVVJFX0xFVkVMUyAoYnJpYW4pCisgKiAxLjMgLSBBZGQgY21kYnVmIGlvY3RsIChrZWl0aCkKKyAqICAgICAtIEFkZCBzdXBwb3J0IGZvciBuZXcgcmFkZW9uIHBhY2tldHMgKGtlaXRoKQorICogICAgIC0gQWRkIGdldHBhcmFtIGlvY3RsIChrZWl0aCkKKyAqICAgICAtIEFkZCBmbGlwLWJ1ZmZlcnMgaW9jdGwsIGRlcHJlY2F0ZSBmdWxsc2NyZWVuIGZvbyAoa2VpdGgpLgorICogMS40IC0gQWRkIHNjcmF0Y2ggcmVnaXN0ZXJzIHRvIGdldF9wYXJhbSBpb2N0bC4KKyAqIDEuNSAtIEFkZCByMjAwIHBhY2tldHMgdG8gY21kYnVmIGlvY3RsCisgKiAgICAgLSBBZGQgcjIwMCBmdW5jdGlvbiB0byBpbml0IGlvY3RsCisgKiAgICAgLSBBZGQgJ3NjYWxhcjInIGluc3RydWN0aW9uIHRvIGNtZGJ1ZgorICogMS42IC0gQWRkIHN0YXRpYyBHQVJUIG1lbW9yeSBtYW5hZ2VyCisgKiAgICAgICBBZGQgaXJxIGhhbmRsZXIgKHdvbid0IGJlIHR1cm5lZCBvbiB1bmxlc3MgWCBzZXJ2ZXIga25vd3MgdG8pCisgKiAgICAgICBBZGQgaXJxIGlvY3RscyBhbmQgaXJxX2FjdGl2ZSBnZXRwYXJhbS4KKyAqICAgICAgIEFkZCB3YWl0IGNvbW1hbmQgZm9yIGNtZGJ1ZiBpb2N0bAorICogICAgICAgQWRkIEdBUlQgb2Zmc2V0IHF1ZXJ5IGZvciBnZXRwYXJhbQorICogMS43IC0gQWRkIHN1cHBvcnQgZm9yIGN1YmUgbWFwIHJlZ2lzdGVyczogUjIwMF9QUF9DVUJJQ19GQUNFU19bMC4uNV0KKyAqICAgICAgIGFuZCBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV9bMC4uNV0uCisgKiAgICAgICBBZGRlZCBwYWNrZXRzIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU19bMC4uNV0gYW5kCisgKiAgICAgICBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19bMC4uNV0uICAoYnJpYW4pCisgKiAxLjggLSBSZW1vdmUgbmVlZCB0byBjYWxsIGNsZWFudXAgaW9jdGxzIG9uIGxhc3QgY2xpZW50IGV4aXQgKGtlaXRoKQorICogICAgICAgQWRkICdHRVQnIHF1ZXJpZXMgZm9yIHN0YXJ0aW5nIGFkZGl0aW9uYWwgY2xpZW50cyBvbiBkaWZmZXJlbnQgVlQncy4KKyAqIDEuOSAtIEFkZCBEUk1fSU9DVExfUkFERU9OX0NQX1JFU1VNRSBpb2N0bC4KKyAqICAgICAgIEFkZCB0ZXh0dXJlIHJlY3RhbmdsZSBzdXBwb3J0IGZvciByMTAwLgorICogMS4xMC0gQWRkIFNFVFBBUkFNIGlvY3RsOyBmaXJzdCBwYXJhbWV0ZXIgdG8gc2V0IGlzIEZCX0xPQ0FUSU9OLCB3aGljaAorICogICAgICAgY2xpZW50cyB1c2UgdG8gdGVsbCB0aGUgRFJNIHdoZXJlIHRoZXkgdGhpbmsgdGhlIGZyYW1lYnVmZmVyIGlzIAorICogICAgICAgbG9jYXRlZCBpbiB0aGUgY2FyZCdzIGFkZHJlc3Mgc3BhY2UKKyAqIDEuMTEtIEFkZCBwYWNrZXQgUjIwMF9FTUlUX1JCM0RfQkxFTkRDT0xPUiB0byBzdXBwb3J0IEdMX0VYVF9ibGVuZF9jb2xvcgorICogICAgICAgYW5kIEdMX0VYVF9ibGVuZF9bZnVuY3xlcXVhdGlvbl1fc2VwYXJhdGUgb24gcjIwMAorICogMS4xMi0gQWRkIFIzMDAgQ1AgbWljcm9jb2RlIHN1cHBvcnQgLSB0aGlzIGp1c3QgbG9hZHMgdGhlIENQIG9uIHIzMDAKKyAqICAgICAgIChObyAzRCBzdXBwb3J0IHlldCAtIGp1c3QgbWljcm9jb2RlIGxvYWRpbmcpCisgKiAxLjEzLSBBZGQgcGFja2V0IFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwgZm9yIEFSQl9wb2ludF9wYXJhbWV0ZXJzCisgKiAgICAgLSBBZGQgaHlwZXJ6IHN1cHBvcnQsIGFkZCBoeXBlcnogZmxhZ3MgdG8gY2xlYXIgaW9jdGwuCisgKiAxLjE0LSBBZGQgc3VwcG9ydCBmb3IgY29sb3IgdGlsaW5nCisgKiAgICAgLSBBZGQgUjEwMC9SMjAwIHN1cmZhY2UgYWxsb2NhdGlvbi9mcmVlIHN1cHBvcnQKKyAqIDEuMTUtIEFkZCBzdXBwb3J0IGZvciB0ZXh0dXJlIG1pY3JvIHRpbGluZworICogICAgIC0gQWRkIHN1cHBvcnQgZm9yIHIxMDAgY3ViZSBtYXBzCisgKiAxLjE2LSBBZGQgUjIwMF9FTUlUX1BQX1RSSV9QRVJGX0NOVEwgcGFja2V0IHRvIHN1cHBvcnQgYnJpbGluZWFyCisgKiAgICAgICB0ZXh0dXJlIGZpbHRlcmluZyBvbiByMjAwCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMTYKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAorCisjZGVmaW5lIEdFVF9SSU5HX0hFQUQoZGV2X3ByaXYpCQlEUk1fUkVBRDMyKCAgKGRldl9wcml2KS0+cmluZ19ycHRyLCAwICkKKyNkZWZpbmUgU0VUX1JJTkdfSEVBRChkZXZfcHJpdix2YWwpCURSTV9XUklURTMyKCAoZGV2X3ByaXYpLT5yaW5nX3JwdHIsIDAsICh2YWwpICkKKworLyoKKyAqIFJhZGVvbiBjaGlwIGZhbWlsaWVzCisgKi8KK2VudW0gcmFkZW9uX2ZhbWlseSB7CisJQ0hJUF9SMTAwLAorCUNISVBfUlMxMDAsCisJQ0hJUF9SVjEwMCwKKwlDSElQX1IyMDAsCisJQ0hJUF9SVjIwMCwKKwlDSElQX1JTMjAwLAorCUNISVBfUjI1MCwKKwlDSElQX1JTMjUwLAorCUNISVBfUlYyNTAsCisJQ0hJUF9SVjI4MCwKKwlDSElQX1IzMDAsCisJQ0hJUF9SUzMwMCwKKwlDSElQX1JWMzUwLAorCUNISVBfTEFTVCwKK307CisKK2VudW0gcmFkZW9uX2NwX21pY3JvY29kZV92ZXJzaW9uIHsKKwlVQ09ERV9SMTAwLAorCVVDT0RFX1IyMDAsCisJVUNPREVfUjMwMCwKK307CisKKy8qCisgKiBDaGlwIGZsYWdzCisgKi8KK2VudW0gcmFkZW9uX2NoaXBfZmxhZ3MgeworCUNISVBfRkFNSUxZX01BU0sgPSAweDAwMDBmZmZmVUwsCisJQ0hJUF9GTEFHU19NQVNLID0gMHhmZmZmMDAwMFVMLAorCUNISVBfSVNfTU9CSUxJVFkgPSAweDAwMDEwMDAwVUwsCisJQ0hJUF9JU19JR1AgPSAweDAwMDIwMDAwVUwsCisJQ0hJUF9TSU5HTEVfQ1JUQyA9IDB4MDAwNDAwMDBVTCwKKwlDSElQX0lTX0FHUCA9IDB4MDAwODAwMDBVTCwKKwlDSElQX0hBU19ISUVSWiA9IDB4MDAxMDAwMDBVTCwgCit9OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0IHsKKyAgIAl1bnNpZ25lZCBpbnQgYWdlOworICAgCWRybV9idWZfdCAqYnVmOworICAgCXN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0ICpuZXh0OworICAgCXN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0ICpwcmV2OworfSBkcm1fcmFkZW9uX2ZyZWVsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fcmluZ19idWZmZXIgeworCXUzMiAqc3RhcnQ7CisJdTMyICplbmQ7CisJaW50IHNpemU7CisJaW50IHNpemVfbDJxdzsKKworCXUzMiB0YWlsOworCXUzMiB0YWlsX21hc2s7CisJaW50IHNwYWNlOworCisJaW50IGhpZ2hfbWFyazsKK30gZHJtX3JhZGVvbl9yaW5nX2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgeworCXUzMiByYjNkX2NudGw7CisJdTMyIHJiM2RfenN0ZW5jaWxjbnRsOworCXUzMiBzZV9jbnRsOworfSBkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3Q7CisKK3N0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyB7CisJaW50NjRfdCByYWRlb25fZmJfZGVsdGE7Cit9OworCitzdHJ1Y3QgbWVtX2Jsb2NrIHsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0OworCXN0cnVjdCBtZW1fYmxvY2sgKnByZXY7CisJaW50IHN0YXJ0OworCWludCBzaXplOworCURSTUZJTEUgZmlscDsJCS8qIDA6IGZyZWUsIC0xOiBoZWFwLCBvdGhlcjogcmVhbCBmaWxlcyAqLworfTsKKworc3RydWN0IHJhZGVvbl9zdXJmYWNlIHsKKwlpbnQgcmVmY291bnQ7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSB7CisJaW50IHN1cmZhY2VfaW5kZXg7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwl1MzIgZmxhZ3M7CisJRFJNRklMRSBmaWxwOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9wcml2YXRlIHsKKwlkcm1fcmFkZW9uX3JpbmdfYnVmZmVyX3QgcmluZzsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisKKwl1MzIgZmJfbG9jYXRpb247CisKKwlpbnQgZ2FydF9zaXplOworCXUzMiBnYXJ0X3ZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZ2FydF9idWZmZXJzX29mZnNldDsKKworCWludCBjcF9tb2RlOworCWludCBjcF9ydW5uaW5nOworCisgICAJZHJtX3JhZGVvbl9mcmVlbGlzdF90ICpoZWFkOworICAgCWRybV9yYWRlb25fZnJlZWxpc3RfdCAqdGFpbDsKKwlpbnQgbGFzdF9idWY7CisJdm9sYXRpbGUgdTMyICpzY3JhdGNoOworCWludCB3cml0ZWJhY2tfd29ya3M7CisKKwlpbnQgdXNlY190aW1lb3V0OworCisJaW50IG1pY3JvY29kZV92ZXJzaW9uOworCisJaW50IGlzX3BjaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGNpX2dhcnQ7CisJZG1hX2FkZHJfdCBidXNfcGNpX2dhcnQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgYm94ZXM7CisJCWludCBmcmVlbGlzdF90aW1lb3V0czsKKwkJaW50IGZyZWVsaXN0X2xvb3BzOworCQlpbnQgcmVxdWVzdGVkX2J1ZnM7CisJCWludCBsYXN0X2ZyYW1lX3JlYWRzOworCQlpbnQgbGFzdF9jbGVhcl9yZWFkczsKKwkJaW50IGNsZWFyczsKKwkJaW50IHRleHR1cmVfdXBsb2FkczsKKwl9IHN0YXRzOworCisJaW50IGRvX2JveGVzOworCWludCBwYWdlX2ZsaXBwaW5nOworCWludCBjdXJyZW50X3BhZ2U7CisKKwl1MzIgY29sb3JfZm10OworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKworCXUzMiBkZXB0aF9mbXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisKKwl1MzIgZnJvbnRfcGl0Y2hfb2Zmc2V0OworCXUzMiBiYWNrX3BpdGNoX29mZnNldDsKKwl1MzIgZGVwdGhfcGl0Y2hfb2Zmc2V0OworCisJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90IGRlcHRoX2NsZWFyOworCQorCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGdhcnRfdGV4dHVyZXNfb2Zmc2V0OworCisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1taW87CisJZHJtX2xvY2FsX21hcF90ICpjcF9yaW5nOworCWRybV9sb2NhbF9tYXBfdCAqcmluZ19ycHRyOworCWRybV9sb2NhbF9tYXBfdCAqZ2FydF90ZXh0dXJlczsKKworCXN0cnVjdCBtZW1fYmxvY2sgKmdhcnRfaGVhcDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpmYl9oZWFwOworCisJLyogU1cgaW50ZXJydXB0ICovCisgICAJd2FpdF9xdWV1ZV9oZWFkX3Qgc3dpX3F1ZXVlOworICAgCWF0b21pY190IHN3aV9lbWl0dGVkOworCisJc3RydWN0IHJhZGVvbl9zdXJmYWNlIHN1cmZhY2VzW1JBREVPTl9NQVhfU1VSRkFDRVNdOworCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlIHZpcnRfc3VyZmFjZXNbMipSQURFT05fTUFYX1NVUkZBQ0VTXTsKKworCS8qIHN0YXJ0aW5nIGZyb20gaGVyZSBvbiwgZGF0YSBpcyBwcmVzZXJ2ZWQgYWNjcm9zcyBhbiBvcGVuICovCisJdWludDMyX3QgZmxhZ3M7CQkvKiBzZWUgcmFkZW9uX2NoaXBfZmxhZ3MgKi8KK30gZHJtX3JhZGVvbl9wcml2YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fYnVmX3ByaXYgeworCXUzMiBhZ2U7Cit9IGRybV9yYWRlb25fYnVmX3ByaXZfdDsKKworCQkJCS8qIHJhZGVvbl9jcC5jICovCitleHRlcm4gaW50IHJhZGVvbl9jcF9pbml0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3Bfc3RhcnQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9zdG9wKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3BfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9pZGxlKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3BfcmVzdW1lKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fZW5naW5lX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fZnVsbHNjcmVlbiggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX2NwX2J1ZmZlcnMoIERSTV9JT0NUTF9BUkdTICk7CisKK2V4dGVybiB2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiBkcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKK2V4dGVybiBpbnQgcmFkZW9uX3dhaXRfcmluZyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApOworCitleHRlcm4gaW50IHJhZGVvbl9kb19jcF9pZGxlKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKKworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3ByZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfcG9zdGNsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKK2V4dGVybiBpbnQgcmFkZW9uX21lbV9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX21lbV9mcmVlKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fbWVtX2luaXRfaGVhcCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9tZW1fdGFrZWRvd24oIHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwICk7CitleHRlcm4gdm9pZCByYWRlb25fbWVtX3JlbGVhc2UoIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCApOworCisJCQkJLyogcmFkZW9uX2lycS5jICovCitleHRlcm4gaW50IHJhZGVvbl9pcnFfZW1pdCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX2lycV93YWl0KCBEUk1fSU9DVExfQVJHUyApOworCitleHRlcm4gdm9pZCByYWRlb25fZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGlycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKmZpbHBfcHJpdik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpmaWxwX3ByaXYpOworCitleHRlcm4gaW50IHJhZGVvbl9wcmVpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICk7CitleHRlcm4gaW50IHJhZGVvbl9wb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApOworZXh0ZXJuIGludCByYWRlb25fcG9zdGNsZWFudXAoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgKTsKKworLyogRmxhZ3MgZm9yIHN0YXRzLmJveGVzCisgKi8KKyNkZWZpbmUgUkFERU9OX0JPWF9ETUFfSURMRSAgICAgIDB4MQorI2RlZmluZSBSQURFT05fQk9YX1JJTkdfRlVMTCAgICAgMHgyCisjZGVmaW5lIFJBREVPTl9CT1hfRkxJUCAgICAgICAgICAweDQKKyNkZWZpbmUgUkFERU9OX0JPWF9XQUlUX0lETEUgICAgIDB4OAorI2RlZmluZSBSQURFT05fQk9YX1RFWFRVUkVfTE9BRCAgMHgxMAorCisKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMsIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgYW5kIGRybUFkZE1hcCBjb25zdGFudHMKKyAqIGZvciBSYWRlb24ga2VybmVsIGRyaXZlci4KKyAqLworCisjZGVmaW5lIFJBREVPTl9BR1BfQ09NTUFORAkJMHgwZjYwCisjZGVmaW5lIFJBREVPTl9BVVhfU0NJU1NPUl9DTlRMCQkweDI2ZjAKKyMJZGVmaW5lIFJBREVPTl9FWENMVVNJVkVfU0NJU1NPUl8wCSgxIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX0VYQ0xVU0lWRV9TQ0lTU09SXzEJKDEgPDwgMjUpCisjCWRlZmluZSBSQURFT05fRVhDTFVTSVZFX1NDSVNTT1JfMgkoMSA8PCAyNikKKyMJZGVmaW5lIFJBREVPTl9TQ0lTU09SXzBfRU5BQkxFCQkoMSA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9TQ0lTU09SXzFfRU5BQkxFCQkoMSA8PCAyOSkKKyMJZGVmaW5lIFJBREVPTl9TQ0lTU09SXzJfRU5BQkxFCQkoMSA8PCAzMCkKKworI2RlZmluZSBSQURFT05fQlVTX0NOVEwJCQkweDAwMzAKKyMJZGVmaW5lIFJBREVPTl9CVVNfTUFTVEVSX0RJUwkJKDEgPDwgNikKKworI2RlZmluZSBSQURFT05fQ0xPQ0tfQ05UTF9EQVRBCQkweDAwMGMKKyMJZGVmaW5lIFJBREVPTl9QTExfV1JfRU4JCQkoMSA8PCA3KQorI2RlZmluZSBSQURFT05fQ0xPQ0tfQ05UTF9JTkRFWAkJMHgwMDA4CisjZGVmaW5lIFJBREVPTl9DT05GSUdfQVBFUl9TSVpFCQkweDAxMDgKKyNkZWZpbmUgUkFERU9OX0NSVENfT0ZGU0VUCQkweDAyMjQKKyNkZWZpbmUgUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwJCTB4MDIyOAorIwlkZWZpbmUgUkFERU9OX0NSVENfVElMRV9FTgkJKDEgPDwgMTUpCisjCWRlZmluZSBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMCSgxIDw8IDE2KQorI2RlZmluZSBSQURFT05fQ1JUQzJfT0ZGU0VUCQkweDAzMjQKKyNkZWZpbmUgUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMCTB4MDMyOAorCisjZGVmaW5lIFJBREVPTl9SQjNEX0NPTE9ST0ZGU0VUCQkweDFjNDAKKyNkZWZpbmUgUkFERU9OX1JCM0RfQ09MT1JQSVRDSAkJMHgxYzQ4CisKKyNkZWZpbmUgUkFERU9OX0RQX0dVSV9NQVNURVJfQ05UTAkweDE0NmMKKyMJZGVmaW5lIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTAkoMSA8PCAxKQorIwlkZWZpbmUgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUgkoMTMgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfQlJVU0hfTk9ORQkJKDE1IDw8IDQpCisjCWRlZmluZSBSQURFT05fR01DX0RTVF8xNkJQUAkJKDQgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfRFNUXzI0QlBQCQkoNSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0dNQ19EU1RfMzJCUFAJCSg2IDw8IDgpCisjCWRlZmluZSBSQURFT05fR01DX0RTVF9EQVRBVFlQRV9TSElGVAk4CisjCWRlZmluZSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUgkoMyA8PCAxMikKKyMJZGVmaW5lIFJBREVPTl9EUF9TUkNfU09VUkNFX01FTU9SWQkoMiA8PCAyNCkKKyMJZGVmaW5lIFJBREVPTl9EUF9TUkNfU09VUkNFX0hPU1RfREFUQQkoMyA8PCAyNCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUwkoMSA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfV1JfTVNLX0RJUwkJKDEgPDwgMzApCisjCWRlZmluZSBSQURFT05fUk9QM19TCQkJMHgwMGNjMDAwMAorIwlkZWZpbmUgUkFERU9OX1JPUDNfUAkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgUkFERU9OX0RQX1dSSVRFX01BU0sJCTB4MTZjYworI2RlZmluZSBSQURFT05fRFNUX1BJVENIX09GRlNFVAkJMHgxNDJjCisjZGVmaW5lIFJBREVPTl9EU1RfUElUQ0hfT0ZGU0VUX0MJMHgxYzgwCisjCWRlZmluZSBSQURFT05fRFNUX1RJTEVfTElORUFSCQkoMCA8PCAzMCkKKyMJZGVmaW5lIFJBREVPTl9EU1RfVElMRV9NQUNSTwkJKDEgPDwgMzApCisjCWRlZmluZSBSQURFT05fRFNUX1RJTEVfTUlDUk8JCSgyIDw8IDMwKQorIwlkZWZpbmUgUkFERU9OX0RTVF9USUxFX0JPVEgJCSgzIDw8IDMwKQorCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFRzAJCTB4MTVlMAorI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUcxCQkweDE1ZTQKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfUkVHMgkJMHgxNWU4CisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFRzMJCTB4MTVlYworI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUc0CQkweDE1ZjAKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfUkVHNQkJMHgxNWY0CisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1VNU0sJCTB4MDc3MAorI2RlZmluZSBSQURFT05fU0NSQVRDSF9BRERSCQkweDA3NzQKKworI2RlZmluZSBSQURFT05fU0NSQVRDSE9GRiggeCApCQkoUkFERU9OX1NDUkFUQ0hfUkVHX09GRlNFVCArIDQqKHgpKQorCisjZGVmaW5lIEdFVF9TQ1JBVENIKCB4ICkJKGRldl9wcml2LT53cml0ZWJhY2tfd29ya3MJCQlcCisJCQkJPyBEUk1fUkVBRDMyKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRih4KSApIFwKKwkJCQk6IFJBREVPTl9SRUFEKCBSQURFT05fU0NSQVRDSF9SRUcwICsgNCooeCkgKSApCisKKworI2RlZmluZSBSQURFT05fR0VOX0lOVF9DTlRMCQkweDAwNDAKKyMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0dVSV9JRExFX0lOVF9FTkFCTEUJKDEgPDwgMTkpCisjCWRlZmluZSBSQURFT05fU1dfSU5UX0VOQUJMRQkJKDEgPDwgMjUpCisKKyNkZWZpbmUgUkFERU9OX0dFTl9JTlRfU1RBVFVTCQkweDAwNDQKKyMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVRfQUNLICAgCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX1RFU1RfQUNLICAgICAoMSA8PCAxOSkKKyMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVAkJKDEgPDwgMjUpCisjCWRlZmluZSBSQURFT05fU1dfSU5UX1RFU1RfQUNLICAgCSgxIDw8IDI1KQorIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9GSVJFCQkoMSA8PCAyNikKKworI2RlZmluZSBSQURFT05fSE9TVF9QQVRIX0NOVEwJCTB4MDEzMAorIwlkZWZpbmUgUkFERU9OX0hEUF9TT0ZUX1JFU0VUCQkoMSA8PCAyNikKKyMJZGVmaW5lIFJBREVPTl9IRFBfV0NfVElNRU9VVF9NQVNLCSg3IDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0hEUF9XQ19USU1FT1VUXzI4QkNMSwkoNyA8PCAyOCkKKworI2RlZmluZSBSQURFT05fSVNZTkNfQ05UTAkJMHgxNzI0CisjCWRlZmluZSBSQURFT05fSVNZTkNfQU5ZMkRfSURMRTNECSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fSVNZTkNfQU5ZM0RfSURMRTJECSgxIDw8IDEpCisjCWRlZmluZSBSQURFT05fSVNZTkNfVFJJRzJEX0lETEUzRAkoMSA8PCAyKQorIwlkZWZpbmUgUkFERU9OX0lTWU5DX1RSSUczRF9JRExFMkQJKDEgPDwgMykKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19XQUlUX0lETEVHVUkJKDEgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19DUFNDUkFUQ0hfSURMRUdVSQkoMSA8PCA1KQorCisjZGVmaW5lIFJBREVPTl9SQkJNX0dVSUNOVEwJCTB4MTcyYworIwlkZWZpbmUgUkFERU9OX0hPU1RfREFUQV9TV0FQX05PTkUJKDAgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9IT1NUX0RBVEFfU1dBUF8xNkJJVAkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0hPU1RfREFUQV9TV0FQXzMyQklUCSgyIDw8IDApCisjCWRlZmluZSBSQURFT05fSE9TVF9EQVRBX1NXQVBfSERXCSgzIDw8IDApCisKKyNkZWZpbmUgUkFERU9OX01DX0FHUF9MT0NBVElPTgkJMHgwMTRjCisjZGVmaW5lIFJBREVPTl9NQ19GQl9MT0NBVElPTgkJMHgwMTQ4CisjZGVmaW5lIFJBREVPTl9NQ0xLX0NOVEwJCTB4MDAxMgorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fTUNMS0EJCSgxIDw8IDE2KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fTUNMS0IJCSgxIDw8IDE3KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fWUNMS0EJCSgxIDw8IDE4KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fWUNMS0IJCSgxIDw8IDE5KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fTUMJCSgxIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fQUlDCQkoMSA8PCAyMSkKKworI2RlZmluZSBSQURFT05fUFBfQk9SREVSX0NPTE9SXzAJMHgxZDQwCisjZGVmaW5lIFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMQkweDFkNDQKKyNkZWZpbmUgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yCTB4MWQ0OAorI2RlZmluZSBSQURFT05fUFBfQ05UTAkJCTB4MWMzOAorIwlkZWZpbmUgUkFERU9OX1NDSVNTT1JfRU5BQkxFCQkoMSA8PCAgMSkKKyNkZWZpbmUgUkFERU9OX1BQX0xVTV9NQVRSSVgJCTB4MWQwMAorI2RlZmluZSBSQURFT05fUFBfTUlTQwkJCTB4MWMxNAorI2RlZmluZSBSQURFT05fUFBfUk9UX01BVFJJWF8wCQkweDFkNTgKKyNkZWZpbmUgUkFERU9OX1BQX1RYRklMVEVSXzAJCTB4MWM1NAorI2RlZmluZSBSQURFT05fUFBfVFhPRkZTRVRfMAkJMHgxYzVjCisjZGVmaW5lIFJBREVPTl9QUF9UWEZJTFRFUl8xCQkweDFjNmMKKyNkZWZpbmUgUkFERU9OX1BQX1RYRklMVEVSXzIJCTB4MWM4NAorCisjZGVmaW5lIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQJMHgzNDJjCisjCWRlZmluZSBSQURFT05fUkIyRF9EQ19GTFVTSAkJKDMgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9SQjJEX0RDX0ZSRUUJCSgzIDw8IDIpCisjCWRlZmluZSBSQURFT05fUkIyRF9EQ19GTFVTSF9BTEwJCTB4ZgorIwlkZWZpbmUgUkFERU9OX1JCMkRfRENfQlVTWQkJKDEgPDwgMzEpCisjZGVmaW5lIFJBREVPTl9SQjNEX0NOVEwJCTB4MWMzYworIwlkZWZpbmUgUkFERU9OX0FMUEhBX0JMRU5EX0VOQUJMRQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1BMQU5FX01BU0tfRU5BQkxFCQkoMSA8PCAxKQorIwlkZWZpbmUgUkFERU9OX0RJVEhFUl9FTkFCTEUJCSgxIDw8IDIpCisjCWRlZmluZSBSQURFT05fUk9VTkRfRU5BQkxFCQkoMSA8PCAzKQorIwlkZWZpbmUgUkFERU9OX1NDQUxFX0RJVEhFUl9FTkFCTEUJKDEgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9ESVRIRVJfSU5JVAkJKDEgPDwgNSkKKyMJZGVmaW5lIFJBREVPTl9ST1BfRU5BQkxFCQkoMSA8PCA2KQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfRU5BQkxFCQkoMSA8PCA3KQorIwlkZWZpbmUgUkFERU9OX1pfRU5BQkxFCQkJKDEgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9aQkxPQ0sxNgkJCSgxIDw8IDE1KQorI2RlZmluZSBSQURFT05fUkIzRF9ERVBUSE9GRlNFVAkJMHgxYzI0CisjZGVmaW5lIFJBREVPTl9SQjNEX0RFUFRIQ0xFQVJWQUxVRQkweDMyMzAKKyNkZWZpbmUgUkFERU9OX1JCM0RfREVQVEhQSVRDSAkJMHgxYzI4CisjZGVmaW5lIFJBREVPTl9SQjNEX1BMQU5FTUFTSwkJMHgxZDg0CisjZGVmaW5lIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLCTB4MWQ3YworI2RlZmluZSBSQURFT05fUkIzRF9aQ0FDSEVfTU9ERQkJMHgzMjUwCisjZGVmaW5lIFJBREVPTl9SQjNEX1pDQUNIRV9DVExTVEFUCTB4MzI1NAorIwlkZWZpbmUgUkFERU9OX1JCM0RfWkNfRkxVU0gJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fUkIzRF9aQ19GUkVFCQkoMSA8PCAyKQorIwlkZWZpbmUgUkFERU9OX1JCM0RfWkNfRkxVU0hfQUxMCQkweDUKKyMJZGVmaW5lIFJBREVPTl9SQjNEX1pDX0JVU1kJCSgxIDw8IDMxKQorI2RlZmluZSBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwJMHgxYzJjCisjCWRlZmluZSBSQURFT05fWl9URVNUX01BU0sJCSg3IDw8IDQpCisjCWRlZmluZSBSQURFT05fWl9URVNUX0FMV0FZUwkJKDcgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEUJKDEgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9TVEVOQ0lMX1RFU1RfQUxXQVlTCSg3IDw8IDEyKQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfU19GQUlMX1JFUExBQ0UJKDIgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1RFTkNJTF9aUEFTU19SRVBMQUNFCSgyIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfWkZBSUxfUkVQTEFDRQkoMiA8PCAyNCkKKyMJZGVmaW5lIFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRQkoMSA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9GT1JDRV9aX0RJUlRZCQkoMSA8PCAyOSkKKyMJZGVmaW5lIFJBREVPTl9aX1dSSVRFX0VOQUJMRQkJKDEgPDwgMzApCisjCWRlZmluZSBSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRQkoMSA8PCAzMSkKKyNkZWZpbmUgUkFERU9OX1JCQk1fU09GVF9SRVNFVAkJMHgwMGYwCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9DUAkJKDEgPDwgIDApCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9ISQkJKDEgPDwgIDEpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9TRQkJKDEgPDwgIDIpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9SRQkJKDEgPDwgIDMpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9QUAkJKDEgPDwgIDQpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9FMgkJKDEgPDwgIDUpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9SQgkJKDEgPDwgIDYpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9IRFAJCSgxIDw8ICA3KQorI2RlZmluZSBSQURFT05fUkJCTV9TVEFUVVMJCTB4MGU0MAorIwlkZWZpbmUgUkFERU9OX1JCQk1fRklGT0NOVF9NQVNLCQkweDAwN2YKKyMJZGVmaW5lIFJBREVPTl9SQkJNX0FDVElWRQkJKDEgPDwgMzEpCisjZGVmaW5lIFJBREVPTl9SRV9MSU5FX1BBVFRFUk4JCTB4MWNkMAorI2RlZmluZSBSQURFT05fUkVfTUlTQwkJCTB4MjZjNAorI2RlZmluZSBSQURFT05fUkVfVE9QX0xFRlQJCTB4MjZjMAorI2RlZmluZSBSQURFT05fUkVfV0lEVEhfSEVJR0hUCQkweDFjNDQKKyNkZWZpbmUgUkFERU9OX1JFX1NUSVBQTEVfQUREUgkJMHgxY2M4CisjZGVmaW5lIFJBREVPTl9SRV9TVElQUExFX0RBVEEJCTB4MWNjYworCisjZGVmaW5lIFJBREVPTl9TQ0lTU09SX1RMXzAJCTB4MWNkOAorI2RlZmluZSBSQURFT05fU0NJU1NPUl9CUl8wCQkweDFjZGMKKyNkZWZpbmUgUkFERU9OX1NDSVNTT1JfVExfMQkJMHgxY2UwCisjZGVmaW5lIFJBREVPTl9TQ0lTU09SX0JSXzEJCTB4MWNlNAorI2RlZmluZSBSQURFT05fU0NJU1NPUl9UTF8yCQkweDFjZTgKKyNkZWZpbmUgUkFERU9OX1NDSVNTT1JfQlJfMgkJMHgxY2VjCisjZGVmaW5lIFJBREVPTl9TRV9DT09SRF9GTVQJCTB4MWM1MAorI2RlZmluZSBSQURFT05fU0VfQ05UTAkJCTB4MWM0YworIwlkZWZpbmUgUkFERU9OX0ZGQUNFX0NVTExfQ1cJCSgwIDw8IDApCisjCWRlZmluZSBSQURFT05fQkZBQ0VfU09MSUQJCSgzIDw8IDEpCisjCWRlZmluZSBSQURFT05fRkZBQ0VfU09MSUQJCSgzIDw8IDMpCisjCWRlZmluZSBSQURFT05fRkxBVF9TSEFERV9WVFhfTEFTVAkoMyA8PCA2KQorIwlkZWZpbmUgUkFERU9OX0RJRkZVU0VfU0hBREVfRkxBVAkoMSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0RJRkZVU0VfU0hBREVfR09VUkFVRAkoMiA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0FMUEhBX1NIQURFX0ZMQVQJCSgxIDw8IDEwKQorIwlkZWZpbmUgUkFERU9OX0FMUEhBX1NIQURFX0dPVVJBVUQJKDIgPDwgMTApCisjCWRlZmluZSBSQURFT05fU1BFQ1VMQVJfU0hBREVfRkxBVAkoMSA8PCAxMikKKyMJZGVmaW5lIFJBREVPTl9TUEVDVUxBUl9TSEFERV9HT1VSQVVECSgyIDw8IDEyKQorIwlkZWZpbmUgUkFERU9OX0ZPR19TSEFERV9GTEFUCQkoMSA8PCAxNCkKKyMJZGVmaW5lIFJBREVPTl9GT0dfU0hBREVfR09VUkFVRAkJKDIgPDwgMTQpCisjCWRlZmluZSBSQURFT05fVlBPUlRfWFlfWEZPUk1fRU5BQkxFCSgxIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX1ZQT1JUX1pfWEZPUk1fRU5BQkxFCSgxIDw8IDI1KQorIwlkZWZpbmUgUkFERU9OX1ZUWF9QSVhfQ0VOVEVSX09HTAkoMSA8PCAyNykKKyMJZGVmaW5lIFJBREVPTl9ST1VORF9NT0RFX1RSVU5DCQkoMCA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9ST1VORF9QUkVDXzhUSF9QSVgJKDEgPDwgMzApCisjZGVmaW5lIFJBREVPTl9TRV9DTlRMX1NUQVRVUwkJMHgyMTQwCisjZGVmaW5lIFJBREVPTl9TRV9MSU5FX1dJRFRICQkweDFkYjgKKyNkZWZpbmUgUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRQkJMHgxZDk4CisjZGVmaW5lIFJBREVPTl9TRV9aQklBU19GQUNUT1IJCTB4MWRiMAorI2RlZmluZSBSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQgMHgyMjEwCisjZGVmaW5lIFJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQgICAgICAgICAweDIyNTQKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9WRUNUT1JfSU5EWF9SRUcgICAgICAgIDB4MjIwMAorIyAgICAgICBkZWZpbmUgUkFERU9OX1ZFQ19JTkRYX09DVFdPUkRfU1RSSURFX1NISUZUICAxNgorIyAgICAgICBkZWZpbmUgUkFERU9OX1ZFQ19JTkRYX0RXT1JEX0NPVU5UX1NISUZUICAgICAyOAorI2RlZmluZSBSQURFT05fU0VfVENMX1ZFQ1RPUl9EQVRBX1JFRyAgICAgICAweDIyMDQKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcgICAgICAgMHgyMjA4CisjICAgICAgIGRlZmluZSBSQURFT05fU0NBTF9JTkRYX0RXT1JEX1NUUklERV9TSElGVCAgMTYKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9TQ0FMQVJfREFUQV9SRUcgICAgICAgMHgyMjBDCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFX0FDQ0VTU19GTEFHUwkweDBiZjgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0VfQUNDRVNTX0NMUgkweDBiZmMKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0VfQ05UTAkJMHgwYjAwCisjCWRlZmluZSBSQURFT05fU1VSRl9UUkFOU0xBVElPTl9ESVMJKDEgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMF9TV1BfTUFTSwkoMyA8PCAyMCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMF9TV1BfTElUVExFCSgwIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX05PTlNVUkZfQVAwX1NXUF9CSUcxNgkoMSA8PCAyMCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMF9TV1BfQklHMzIJKDIgPDwgMjApCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDFfU1dQX01BU0sJKDMgPDwgMjIpCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDFfU1dQX0xJVFRMRQkoMCA8PCAyMikKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMV9TV1BfQklHMTYJKDEgPDwgMjIpCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDFfU1dQX0JJRzMyCSgyIDw8IDIyKQorI2RlZmluZSBSQURFT05fU1VSRkFDRTBfSU5GTwkJMHgwYjBjCisjCWRlZmluZSBSQURFT05fU1VSRl9QSVRDSFNFTF9NQVNLCSgweDFmZiA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1NVUkZfVElMRV9NT0RFX01BU0sJKDMgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfTUFDUk8JKDAgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfTUlDUk8JKDEgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfMzJCSVRfWgkoMiA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1RJTEVfTU9ERV8xNkJJVF9aCSgzIDw8IDE2KQorI2RlZmluZSBSQURFT05fU1VSRkFDRTBfTE9XRVJfQk9VTkQJMHgwYjA0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORAkweDBiMDgKKyMJZGVmaW5lIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UxX0lORk8JCTB4MGIxYworI2RlZmluZSBSQURFT05fU1VSRkFDRTFfTE9XRVJfQk9VTkQJMHgwYjE0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMV9VUFBFUl9CT1VORAkweDBiMTgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UyX0lORk8JCTB4MGIyYworI2RlZmluZSBSQURFT05fU1VSRkFDRTJfTE9XRVJfQk9VTkQJMHgwYjI0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMl9VUFBFUl9CT1VORAkweDBiMjgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UzX0lORk8JCTB4MGIzYworI2RlZmluZSBSQURFT05fU1VSRkFDRTNfTE9XRVJfQk9VTkQJMHgwYjM0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFM19VUFBFUl9CT1VORAkweDBiMzgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U0X0lORk8JCTB4MGI0YworI2RlZmluZSBSQURFT05fU1VSRkFDRTRfTE9XRVJfQk9VTkQJMHgwYjQ0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNF9VUFBFUl9CT1VORAkweDBiNDgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U1X0lORk8JCTB4MGI1YworI2RlZmluZSBSQURFT05fU1VSRkFDRTVfTE9XRVJfQk9VTkQJMHgwYjU0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNV9VUFBFUl9CT1VORAkweDBiNTgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U2X0lORk8JCTB4MGI2YworI2RlZmluZSBSQURFT05fU1VSRkFDRTZfTE9XRVJfQk9VTkQJMHgwYjY0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNl9VUFBFUl9CT1VORAkweDBiNjgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U3X0lORk8JCTB4MGI3YworI2RlZmluZSBSQURFT05fU1VSRkFDRTdfTE9XRVJfQk9VTkQJMHgwYjc0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFN19VUFBFUl9CT1VORAkweDBiNzgKKyNkZWZpbmUgUkFERU9OX1NXX1NFTUFQSE9SRQkJMHgwMTNjCisKKyNkZWZpbmUgUkFERU9OX1dBSVRfVU5USUwJCTB4MTcyMAorIwlkZWZpbmUgUkFERU9OX1dBSVRfQ1JUQ19QRkxJUAkJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTgkJKDEgPDwgMTYpCisjCWRlZmluZSBSQURFT05fV0FJVF8zRF9JRExFQ0xFQU4JCSgxIDw8IDE3KQorIwlkZWZpbmUgUkFERU9OX1dBSVRfSE9TVF9JRExFQ0xFQU4JKDEgPDwgMTgpCisKKyNkZWZpbmUgUkFERU9OX1JCM0RfWk1BU0tPRkZTRVQJCTB4MzIzNAorI2RlZmluZSBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwJMHgxYzJjCisjCWRlZmluZSBSQURFT05fREVQVEhfRk9STUFUXzE2QklUX0lOVF9aCSgwIDw8IDApCisjCWRlZmluZSBSQURFT05fREVQVEhfRk9STUFUXzI0QklUX0lOVF9aCSgyIDw8IDApCisKKworLyogQ1AgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJBREVPTl9DUF9NRV9SQU1fQUREUgkJMHgwN2Q0CisjZGVmaW5lIFJBREVPTl9DUF9NRV9SQU1fUkFERFIJCTB4MDdkOAorI2RlZmluZSBSQURFT05fQ1BfTUVfUkFNX0RBVEFICQkweDA3ZGMKKyNkZWZpbmUgUkFERU9OX0NQX01FX1JBTV9EQVRBTAkJMHgwN2UwCisKKyNkZWZpbmUgUkFERU9OX0NQX1JCX0JBU0UJCTB4MDcwMAorI2RlZmluZSBSQURFT05fQ1BfUkJfQ05UTAkJMHgwNzA0CisjCWRlZmluZSBSQURFT05fQlVGX1NXQVBfMzJCSVQJCSgyIDw8IDE2KQorI2RlZmluZSBSQURFT05fQ1BfUkJfUlBUUl9BRERSCQkweDA3MGMKKyNkZWZpbmUgUkFERU9OX0NQX1JCX1JQVFIJCTB4MDcxMAorI2RlZmluZSBSQURFT05fQ1BfUkJfV1BUUgkJMHgwNzE0CisKKyNkZWZpbmUgUkFERU9OX0NQX1JCX1dQVFJfREVMQVkJCTB4MDcxOAorIwlkZWZpbmUgUkFERU9OX1BSRV9XUklURV9USU1FUl9TSElGVAkwCisjCWRlZmluZSBSQURFT05fUFJFX1dSSVRFX0xJTUlUX1NISUZUCTIzCisKKyNkZWZpbmUgUkFERU9OX0NQX0lCX0JBU0UJCTB4MDczOAorCisjZGVmaW5lIFJBREVPTl9DUF9DU1FfQ05UTAkJMHgwNzQwCisjCWRlZmluZSBSQURFT05fQ1NRX0NOVF9QUklNQVJZX01BU0sJKDB4ZmYgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9DU1FfUFJJRElTX0lORERJUwkJKDAgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSVBJT19JTkRESVMJCSgxIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklCTV9JTkRESVMJCSgyIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklQSU9fSU5EQk0JCSgzIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklCTV9JTkRCTQkJKDQgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSVBJT19JTkRQSU8JCSgxNSA8PCAyOCkKKworI2RlZmluZSBSQURFT05fQUlDX0NOVEwJCQkweDAxZDAKKyMJZGVmaW5lIFJBREVPTl9QQ0lHQVJUX1RSQU5TTEFURV9FTgkoMSA8PCAwKQorI2RlZmluZSBSQURFT05fQUlDX1NUQVQJCQkweDAxZDQKKyNkZWZpbmUgUkFERU9OX0FJQ19QVF9CQVNFCQkweDAxZDgKKyNkZWZpbmUgUkFERU9OX0FJQ19MT19BRERSCQkweDAxZGMKKyNkZWZpbmUgUkFERU9OX0FJQ19ISV9BRERSCQkweDAxZTAKKyNkZWZpbmUgUkFERU9OX0FJQ19UTEJfQUREUgkJMHgwMWU0CisjZGVmaW5lIFJBREVPTl9BSUNfVExCX0RBVEEJCTB4MDFlOAorCisvKiBDUCBjb21tYW5kIHBhY2tldHMgKi8KKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDAJCTB4MDAwMDAwMDAKKyMJZGVmaW5lIFJBREVPTl9PTkVfUkVHX1dSCQkoMSA8PCAxNSkKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDEJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDIJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDMJCTB4QzAwMDAwMDAKKyMJZGVmaW5lIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0JMHgwMDAwMjMwMAorIwlkZWZpbmUgUkFERU9OX1dBSVRfRk9SX0lETEUJCTB4MDAwMDI2MDAKKyMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX1ZCVUYJCTB4MDAwMDI4MDAKKyMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX0lNTUQJCTB4MDAwMDI5MDAKKyMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX0lORFgJCTB4MDAwMDJBMDAKKyMJZGVmaW5lIFJBREVPTl8zRF9MT0FEX1ZCUE5UUgkJMHgwMDAwMkYwMAorIwlkZWZpbmUgUkFERU9OX01QRUdfSURDVF9NQUNST0JMT0NLCTB4MDAwMDMwMDAKKyMJZGVmaW5lIFJBREVPTl9NUEVHX0lEQ1RfTUFDUk9CTE9DS19SRVYJMHgwMDAwMzEwMAorIwlkZWZpbmUgUkFERU9OXzNEX0NMRUFSX1pNQVNLCQkweDAwMDAzMjAwCisjCWRlZmluZSBSQURFT05fM0RfQ0xFQVJfSElaCQkweDAwMDAzNzAwCisjCWRlZmluZSBSQURFT05fQ05UTF9IT1NUREFUQV9CTFQJCTB4MDAwMDk0MDAKKyMJZGVmaW5lIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJCQkweDAwMDA5QTAwCisjCWRlZmluZSBSQURFT05fQ05UTF9CSVRCTFRfTVVMVEkJCTB4MDAwMDlCMDAKKyMJZGVmaW5lIFJBREVPTl9DTlRMX1NFVF9TQ0lTU09SUwkJMHhDMDAwMUUwMAorCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVRfTUFTSwkJMHhDMDAwMDAwMAorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUX0NPVU5UX01BU0sJMHgzZmZmMDAwMAorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUMF9SRUdfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQxX1JFRzBfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQxX1JFRzFfTUFTSwkweDAwM2ZmODAwCisKKyNkZWZpbmUgUkFERU9OX1ZUWF9aX1BSRVNFTlQJCQkoMSA8PCAzMSkKKyNkZWZpbmUgUkFERU9OX1ZUWF9QS0NPTE9SX1BSRVNFTlQJCSgxIDw8IDMpCisKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9OT05FCQkJKDAgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9QT0lOVAkJCSgxIDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfTElORQkJCSgyIDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfTElORV9TVFJJUAkJKDMgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9UUklfTElTVAkJKDQgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9UUklfRkFOCQkoNSA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX1RSSV9TVFJJUAkJKDYgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9UUklfVFlQRTIJCSg3IDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUCQkoOCA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVAkoOSA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUCQkoMTAgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgIDB4ZgorI2RlZmluZSBSQURFT05fUFJJTV9XQUxLX0lORAkJCSgxIDw8IDQpCisjZGVmaW5lIFJBREVPTl9QUklNX1dBTEtfTElTVAkJCSgyIDw8IDQpCisjZGVmaW5lIFJBREVPTl9QUklNX1dBTEtfUklORwkJCSgzIDw8IDQpCisjZGVmaW5lIFJBREVPTl9DT0xPUl9PUkRFUl9CR1JBCQkJKDAgPDwgNikKKyNkZWZpbmUgUkFERU9OX0NPTE9SX09SREVSX1JHQkEJCQkoMSA8PCA2KQorI2RlZmluZSBSQURFT05fTUFPU19FTkFCTEUJCQkoMSA8PCA3KQorI2RlZmluZSBSQURFT05fVlRYX0ZNVF9SMTI4X01PREUJCSgwIDw8IDgpCisjZGVmaW5lIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFCQkoMSA8PCA4KQorI2RlZmluZSBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUCQkxNgorCisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQ0k4CQkyCisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjE1NTUJMworI2RlZmluZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NQk0CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjg4ODgJNgorI2RlZmluZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjMzMgk3CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCOAk5CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjQ0NDQJMTUKKworI2RlZmluZSBSQURFT05fVFhGT1JNQVRfSTgJCTAKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0FJODgJCTEKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX1JHQjMzMgkJMgorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfQVJHQjE1NTUJMworI2RlZmluZSBSQURFT05fVFhGT1JNQVRfUkdCNTY1CQk0CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9BUkdCNDQ0NAk1CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9BUkdCODg4OAk2CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9SR0JBODg4OAk3CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9ZOAkJOAorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfVllVWTQyMiAgICAgICAgIDEwCisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9ZVllVNDIyICAgICAgICAgMTEKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0RYVDEgICAgICAgICAgICAxMgorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfRFhUMjMgICAgICAgICAgIDE0CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9EWFQ0NSAgICAgICAgICAgMTUKKworI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzAgICAgICAgICAgICAgICAgMHgyZjAwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfMSAgICAgICAgICAgICAgICAweDJmMTAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF8yICAgICAgICAgICAgICAgIDB4MmYyMAorI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzMgICAgICAgICAgICAgICAgMHgyZjMwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfNCAgICAgICAgICAgICAgICAweDJmNDAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF81ICAgICAgICAgICAgICAgIDB4MmY1MAorI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzYgICAgICAgICAgICAgICAgMHgyZjYwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfNyAgICAgICAgICAgICAgICAweDJmNzAKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAgICAgIDB4MjI2OCAKKyNkZWZpbmUgUjIwMF9QUF9URkFDVE9SXzAgICAgICAgICAgICAgICAgIDB4MmVlMAorI2RlZmluZSBSMjAwX1NFX1ZUWF9GTVRfMCAgICAgICAgICAgICAgICAgMHgyMDg4CisjZGVmaW5lIFIyMDBfU0VfVkFQX0NOVEwgICAgICAgICAgICAgICAgICAweDIwODAKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wICAgICAgICAgIDB4MjIzMAorI2RlZmluZSBSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiAgICAgICAgMHgyMmE4IAorI2RlZmluZSBSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwgICAgMHgyMmMwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzUgICAgICAgICAgICAgICAgMHgyY2EwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzQgICAgICAgICAgICAgICAgMHgyYzgwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzMgICAgICAgICAgICAgICAgMHgyYzYwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzIgICAgICAgICAgICAgICAgMHgyYzQwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzEgICAgICAgICAgICAgICAgMHgyYzIwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzAgICAgICAgICAgICAgICAgMHgyYzAwIAorI2RlZmluZSBSMjAwX1BQX1RYT0ZGU0VUXzUgICAgICAgICAgICAgICAgMHgyZDc4CisjZGVmaW5lIFIyMDBfUFBfVFhPRkZTRVRfNCAgICAgICAgICAgICAgICAweDJkNjAKKyNkZWZpbmUgUjIwMF9QUF9UWE9GRlNFVF8zICAgICAgICAgICAgICAgIDB4MmQ0OAorI2RlZmluZSBSMjAwX1BQX1RYT0ZGU0VUXzIgICAgICAgICAgICAgICAgMHgyZDMwCisjZGVmaW5lIFIyMDBfUFBfVFhPRkZTRVRfMSAgICAgICAgICAgICAgICAweDJkMTgKKyNkZWZpbmUgUjIwMF9QUF9UWE9GRlNFVF8wICAgICAgICAgICAgICAgIDB4MmQwMAorCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAweDJjMTgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19GQUNFU18xICAgICAgICAgICAgIDB4MmMzOAorI2RlZmluZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgMHgyYzU4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfRkFDRVNfMyAgICAgICAgICAgICAweDJjNzgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19GQUNFU180ICAgICAgICAgICAgIDB4MmM5OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzUgICAgICAgICAgICAgMHgyY2I4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAgICAgICAgICAweDJkMDQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjJfMCAgICAgICAgIDB4MmQwOAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GM18wICAgICAgICAgMHgyZDBjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y0XzAgICAgICAgICAweDJkMTAKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjVfMCAgICAgICAgIDB4MmQxNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xICAgICAgICAgMHgyZDFjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YyXzEgICAgICAgICAweDJkMjAKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjNfMSAgICAgICAgIDB4MmQyNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNF8xICAgICAgICAgMHgyZDI4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y1XzEgICAgICAgICAweDJkMmMKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiAgICAgICAgIDB4MmQzNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMl8yICAgICAgICAgMHgyZDM4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YzXzIgICAgICAgICAweDJkM2MKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjRfMiAgICAgICAgIDB4MmQ0MAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNV8yICAgICAgICAgMHgyZDQ0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMgICAgICAgICAweDJkNGMKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjJfMyAgICAgICAgIDB4MmQ1MAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GM18zICAgICAgICAgMHgyZDU0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y0XzMgICAgICAgICAweDJkNTgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjVfMyAgICAgICAgIDB4MmQ1YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80ICAgICAgICAgMHgyZDY0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YyXzQgICAgICAgICAweDJkNjgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjNfNCAgICAgICAgIDB4MmQ2YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNF80ICAgICAgICAgMHgyZDcwCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y1XzQgICAgICAgICAweDJkNzQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSAgICAgICAgIDB4MmQ3YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMl81ICAgICAgICAgMHgyZDgwCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YzXzUgICAgICAgICAweDJkODQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjRfNSAgICAgICAgIDB4MmQ4OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNV81ICAgICAgICAgMHgyZDhjCisKKyNkZWZpbmUgUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMICAgICAgICAgIDB4MjZmMAorI2RlZmluZSBSMjAwX1NFX1ZURV9DTlRMICAgICAgICAgICAgICAgICAgMHgyMGIwCisjZGVmaW5lIFIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwgICAweDIyNTAKKyNkZWZpbmUgUjIwMF9QUF9UQU1fREVCVUczICAgICAgICAgICAgICAgIDB4MmQ5YworI2RlZmluZSBSMjAwX1BQX0NOVExfWCAgICAgICAgICAgICAgICAgICAgMHgyY2M0CisjZGVmaW5lIFIyMDBfU0VfVkFQX0NOVExfU1RBVFVTICAgICAgICAgICAweDIxNDAKKyNkZWZpbmUgUjIwMF9SRV9TQ0lTU09SX1RMXzAgICAgICAgICAgICAgIDB4MWNkOAorI2RlZmluZSBSMjAwX1JFX1NDSVNTT1JfVExfMSAgICAgICAgICAgICAgMHgxY2UwCisjZGVmaW5lIFIyMDBfUkVfU0NJU1NPUl9UTF8yICAgICAgICAgICAgICAweDFjZTgKKyNkZWZpbmUgUjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VUICAgICAgICAgIDB4MWQ2MCAKKyNkZWZpbmUgUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMICAgICAgICAgIDB4MjZmMAorI2RlZmluZSBSMjAwX1NFX1ZUWF9TVEFURV9DTlRMICAgICAgICAgICAgMHgyMTgwCisjZGVmaW5lIFIyMDBfUkVfUE9JTlRTSVpFICAgICAgICAgICAgICAgICAweDI2NDgKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAgMHgyMjU0CisKKyNkZWZpbmUgUkFERU9OX1BQX1RFWF9TSVpFXzAgICAgICAgICAgICAgICAgMHgxZDA0ICAvKiBOUE9UICovCisjZGVmaW5lIFJBREVPTl9QUF9URVhfU0laRV8xICAgICAgICAgICAgICAgIDB4MWQwYworI2RlZmluZSBSQURFT05fUFBfVEVYX1NJWkVfMiAgICAgICAgICAgICAgICAweDFkMTQKKworI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAweDFkMjQKKyNkZWZpbmUgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgMHgxZDI4CisjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19GQUNFU18yICAgICAgICAgICAgIDB4MWQyYworI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzAgICAgICAgICAweDFkZDAJLyogYml0cyBbMzE6NV0gKi8KKyNkZWZpbmUgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wICAgICAgICAgMHgxZTAwCisjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDJfMCAgICAgICAgIDB4MWUxNAorCisjZGVmaW5lIFNFX1ZBUF9DTlRMX19UQ0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBTRV9WQVBfQ05UTF9fVkZfTUFYX1ZUWF9OVU1fX1NISUZUICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCisjZGVmaW5lIFNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU0VfVlRFX0NOVExfX1ZUWF9aX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTRV9WVFhfRk1UXzBfX1ZUWF9aMF9QUkVTRU5UX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFX1ZUWF9GTVRfMF9fVlRYX1cwX1BSRVNFTlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VfVlRYX0ZNVF8wX19WVFhfQ09MT1JfMF9GTVRfX1NISUZUICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorI2RlZmluZSBSMjAwXzNEX0RSQVdfSU1NRF8yICAgICAgMHhDMDAwMzUwMAorI2RlZmluZSBSMjAwX1NFX1ZUWF9GTVRfMSAgICAgICAgICAgICAgICAgMHgyMDhjCisjZGVmaW5lIFIyMDBfUkVfQ05UTCAgICAgICAgICAgICAgICAgICAgICAweDFjNTAgCisKKyNkZWZpbmUgUjIwMF9SQjNEX0JMRU5EQ09MT1IgICAgICAgICAgICAgIDB4MzIxOAorCisjZGVmaW5lIFIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMICAgICAweDIyYzQKKworI2RlZmluZSBSMjAwX1BQX1RSSV9QRVJGIDB4MmNmOAorCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgUkFERU9OX01BWF9VU0VDX1RJTUVPVVQJCTEwMDAwMAkvKiAxMDAgbXMgKi8KKworI2RlZmluZSBSQURFT05fTEFTVF9GUkFNRV9SRUcJCVJBREVPTl9TQ1JBVENIX1JFRzAKKyNkZWZpbmUgUkFERU9OX0xBU1RfRElTUEFUQ0hfUkVHCVJBREVPTl9TQ1JBVENIX1JFRzEKKyNkZWZpbmUgUkFERU9OX0xBU1RfQ0xFQVJfUkVHCQlSQURFT05fU0NSQVRDSF9SRUcyCisjZGVmaW5lIFJBREVPTl9MQVNUX1NXSV9SRUcJCVJBREVPTl9TQ1JBVENIX1JFRzMKKyNkZWZpbmUgUkFERU9OX0xBU1RfRElTUEFUQ0gJCTEKKworI2RlZmluZSBSQURFT05fTUFYX1ZCX0FHRQkJMHg3ZmZmZmZmZgorI2RlZmluZSBSQURFT05fTUFYX1ZCX1ZFUlRTCQkoMHhmZmZmKQorCisjZGVmaW5lIFJBREVPTl9SSU5HX0hJR0hfTUFSSwkJMTI4CisKKyNkZWZpbmUgUkFERU9OX1JFQUQocmVnKQlEUk1fUkVBRDMyKCAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKKyNkZWZpbmUgUkFERU9OX1dSSVRFKHJlZyx2YWwpCURSTV9XUklURTMyKCBkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpICkKKyNkZWZpbmUgUkFERU9OX1JFQUQ4KHJlZykJRFJNX1JFQUQ4KCAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKKyNkZWZpbmUgUkFERU9OX1dSSVRFOChyZWcsdmFsKQlEUk1fV1JJVEU4KCBkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpICkKKworI2RlZmluZSBSQURFT05fV1JJVEVfUExMKCBhZGRyLCB2YWwgKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlSQURFT05fV1JJVEU4KCBSQURFT05fQ0xPQ0tfQ05UTF9JTkRFWCwJCQkJXAorCQkgICAgICAgKChhZGRyKSAmIDB4MWYpIHwgUkFERU9OX1BMTF9XUl9FTiApOwkJXAorCVJBREVPTl9XUklURSggUkFERU9OX0NMT0NLX0NOVExfREFUQSwgKHZhbCkgKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENQX1BBQ0tFVDAoIHJlZywgbiApCQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMCB8ICgobikgPDwgMTYpIHwgKChyZWcpID4+IDIpKQorI2RlZmluZSBDUF9QQUNLRVQwX1RBQkxFKCByZWcsIG4gKQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMCB8IFJBREVPTl9PTkVfUkVHX1dSIHwgKChuKSA8PCAxNikgfCAoKHJlZykgPj4gMikpCisjZGVmaW5lIENQX1BBQ0tFVDEoIHJlZzAsIHJlZzEgKQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMSB8ICgoKHJlZzEpID4+IDIpIDw8IDE1KSB8ICgocmVnMCkgPj4gMikpCisjZGVmaW5lIENQX1BBQ0tFVDIoKQkJCQkJCQlcCisJKFJBREVPTl9DUF9QQUNLRVQyKQorI2RlZmluZSBDUF9QQUNLRVQzKCBwa3QsIG4gKQkJCQkJCVwKKwkoUkFERU9OX0NQX1BBQ0tFVDMgfCAocGt0KSB8ICgobikgPDwgMTYpKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuZ2luZSBjb250cm9sIGhlbHBlciBtYWNyb3MKKyAqLworCisjZGVmaW5lIFJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKSBkbyB7CQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1dBSVRfVU5USUwsIDAgKSApOwkJCVwKKwlPVVRfUklORyggKFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTiB8CQkJCVwKKwkJICAgUkFERU9OX1dBSVRfSE9TVF9JRExFQ0xFQU4pICk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCkgZG8gewkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9XQUlUX1VOVElMLCAwICkgKTsJCQlcCisJT1VUX1JJTkcoIChSQURFT05fV0FJVF8zRF9JRExFQ0xFQU4gfAkJCQlcCisJCSAgIFJBREVPTl9XQUlUX0hPU1RfSURMRUNMRUFOKSApOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX1dBSVRfVU5USUxfSURMRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1dBSVRfVU5USUwsIDAgKSApOwkJCVwKKwlPVVRfUklORyggKFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTiB8CQkJCVwKKwkJICAgUkFERU9OX1dBSVRfM0RfSURMRUNMRUFOIHwJCQkJXAorCQkgICBSQURFT05fV0FJVF9IT1NUX0lETEVDTEVBTikgKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9XQUlUX1VOVElMX1BBR0VfRkxJUFBFRCgpIGRvIHsJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fV0FJVF9VTlRJTCwgMCApICk7CQkJXAorCU9VVF9SSU5HKCBSQURFT05fV0FJVF9DUlRDX1BGTElQICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0ZMVVNIX0NBQ0hFKCkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIyRF9EU1RDQUNIRV9DVExTVEFULCAwICkgKTsJXAorCU9VVF9SSU5HKCBSQURFT05fUkIyRF9EQ19GTFVTSCApOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9QVVJHRV9DQUNIRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVCwgMCApICk7CVwKKwlPVVRfUklORyggUkFERU9OX1JCMkRfRENfRkxVU0hfQUxMICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0ZMVVNIX1pDQUNIRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDAgKSApOwlcCisJT1VUX1JJTkcoIFJBREVPTl9SQjNEX1pDX0ZMVVNIICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX1BVUkdFX1pDQUNIRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDAgKSApOwlcCisJT1VUX1JJTkcoIFJBREVPTl9SQjNEX1pDX0ZMVVNIX0FMTCApOwkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1pc2MgaGVscGVyIG1hY3JvcworICovCisKKy8qIFBlcmZib3ggZnVuY3Rpb25hbGl0eSBvbmx5LiAgCisgKi8KKyNkZWZpbmUgUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCEoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9ETUFfSURMRSkpIHsJCVwKKwkJdTMyIGhlYWQgPSBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOwkJCVwKKwkJaWYgKGhlYWQgPT0gZGV2X3ByaXYtPnJpbmcudGFpbCkJCQlcCisJCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9ETUFfSURMRTsJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsJCVwKKwlpZiAoIHNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPj0gUkFERU9OX01BWF9WQl9BR0UgKSB7CQlcCisJCWludCBfX3JldCA9IHJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOwkJXAorCQlpZiAoIF9fcmV0ICkgcmV0dXJuIF9fcmV0OwkJCQlcCisJCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAwOwkJCQlcCisJCXJhZGVvbl9mcmVlbGlzdF9yZXNldCggZGV2ICk7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9ESVNQQVRDSF9BR0UoIGFnZSApIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0xBU1RfRElTUEFUQ0hfUkVHLCAwICkgKTsJCVwKKwlPVVRfUklORyggYWdlICk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fRlJBTUVfQUdFKCBhZ2UgKSBkbyB7CQkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9MQVNUX0ZSQU1FX1JFRywgMCApICk7CQlcCisJT1VUX1JJTkcoIGFnZSApOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0NMRUFSX0FHRSggYWdlICkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fTEFTVF9DTEVBUl9SRUcsIDAgKSApOwkJXAorCU9VVF9SSU5HKCBhZ2UgKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJpbmcgY29udHJvbAorICovCisKKyNkZWZpbmUgUkFERU9OX1ZFUkJPU0UJMAorCisjZGVmaW5lIFJJTkdfTE9DQUxTCWludCB3cml0ZSwgX25yOyB1bnNpZ25lZCBpbnQgbWFzazsgdTMyICpyaW5nOworCisjZGVmaW5lIEJFR0lOX1JJTkcoIG4gKSBkbyB7CQkJCQkJXAorCWlmICggUkFERU9OX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkJFR0lOX1JJTkcoICVkICkgaW4gJXNcbiIsCQkJXAorCQkJICAgbiwgX19GVU5DVElPTl9fICk7CQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCBkZXZfcHJpdi0+cmluZy5zcGFjZSA8PSAobikgKiBzaXplb2YodTMyKSApIHsJCVwKKyAgICAgICAgICAgICAgICBDT01NSVRfUklORygpOwkJCQkJCVwKKwkJcmFkZW9uX3dhaXRfcmluZyggZGV2X3ByaXYsIChuKSAqIHNpemVvZih1MzIpICk7CVwKKwl9CQkJCQkJCQlcCisJX25yID0gbjsgZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gKG4pICogc2l6ZW9mKHUzMik7CQlcCisJcmluZyA9IGRldl9wcml2LT5yaW5nLnN0YXJ0OwkJCQkJXAorCXdyaXRlID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKKwltYXNrID0gZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFEVkFOQ0VfUklORygpIGRvIHsJCQkJCQlcCisJaWYgKCBSQURFT05fVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQURWQU5DRV9SSU5HKCkgd3I9MHglMDZ4IHRhaWw9MHglMDZ4XG4iLAlcCisJCQkgIHdyaXRlLCBkZXZfcHJpdi0+cmluZy50YWlsICk7CQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIG1hc2spICE9IHdyaXRlKSB7CQlcCisJCURSTV9FUlJPUiggCQkJCQkJXAorCQkJIkFEVkFOQ0VfUklORygpOiBtaXNtYXRjaDogbnI6ICV4IHdyaXRlOiAleCBsaW5lOiAlZFxuIiwJXAorCQkJKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIG1hc2spLAkJXAorCQkJd3JpdGUsIF9fTElORV9fKTsJCQkJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCWRldl9wcml2LT5yaW5nLnRhaWwgPSB3cml0ZTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT01NSVRfUklORygpIGRvIHsJCQkJCQlcCisJLyogRmx1c2ggd3JpdGVzIHRvIHJpbmcgKi8JCQkJCVwKKwlEUk1fTUVNT1JZQkFSUklFUigpOwkJCQkJCVwKKwlHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOwkJCQkJXAorCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1dQVFIsIGRldl9wcml2LT5yaW5nLnRhaWwgKTsJCVwKKwkvKiByZWFkIGZyb20gUENJIGJ1cyB0byBlbnN1cmUgY29ycmVjdCBwb3N0aW5nICovCQlcCisJUkFERU9OX1JFQUQoIFJBREVPTl9DUF9SQl9SUFRSICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgT1VUX1JJTkcoIHggKSBkbyB7CQkJCQkJXAorCWlmICggUkFERU9OX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIiAgIE9VVF9SSU5HKCAweCUwOHggKSBhdCAweCV4XG4iLAkJXAorCQkJICAgKHVuc2lnbmVkIGludCkoeCksIHdyaXRlICk7CQkJXAorCX0JCQkJCQkJCVwKKwlyaW5nW3dyaXRlKytdID0gKHgpOwkJCQkJCVwKKwl3cml0ZSAmPSBtYXNrOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVF9SSU5HX1JFRyggcmVnLCB2YWwgKSBkbyB7CQkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIHJlZywgMCApICk7CQkJCVwKKwlPVVRfUklORyggdmFsICk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIE9VVF9SSU5HX1RBQkxFKCB0YWIsIHN6ICkgZG8gewkJCQkJXAorCWludCBfc2l6ZSA9IChzeik7CQkJCQlcCisJaW50ICpfdGFiID0gKGludCAqKSh0YWIpOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAod3JpdGUgKyBfc2l6ZSA+IG1hc2spIHsJCQkJXAorCQlpbnQgX2kgPSAobWFzaysxKSAtIHdyaXRlOwkJCVwKKwkJX3NpemUgLT0gX2k7CQkJCQlcCisJCXdoaWxlIChfaSA+IDAgKSB7CQkJCVwKKwkJCSooaW50ICopKHJpbmcgKyB3cml0ZSkgPSAqX3RhYisrOwlcCisJCQl3cml0ZSsrOwkJCQlcCisJCQlfaS0tOwkJCQkJXAorCQl9CQkJCQkJXAorCQl3cml0ZSA9IDA7CQkJCQlcCisJCV90YWIgKz0gX2k7CQkJCQlcCisJfQkJCQkJCQlcCisJCQkJCQkJCVwKKwl3aGlsZSAoX3NpemUgPiAwKSB7CQkJCQlcCisJCSoocmluZyArIHdyaXRlKSA9ICpfdGFiKys7CQkJXAorCQl3cml0ZSsrOwkJCQkJXAorCQlfc2l6ZS0tOwkJCQkJXAorCX0JCQkJCQkJXAorCXdyaXRlICY9IG1hc2s7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjZW5kaWYgLyogX19SQURFT05fRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjE4YmVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qIHJhZGVvbl9pcnEuYyAtLSBJUlEgaGFuZGxpbmcgZm9yIHJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBXZWF0aGVyIENoYW5uZWwsIEluYy4gIDIwMDIuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGUgV2VhdGhlciBDaGFubmVsIChUTSkgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvIGRldmVsb3AgdGhlCisgKiBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFJhZGVvbiA4NTAwIGRyaXZlciB1bmRlciB0aGUgWEZyZWU4NiBsaWNlbnNlLgorICogVGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiAgICBNaWNoZWwgRO+/vXplciA8bWljaGVsQGRhZW56ZXIubmV0PgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworLyogSW50ZXJydXB0cyAtIFVzZWQgZm9yIGRldmljZSBzeW5jaHJvbml6YXRpb24gYW5kIGZsdXNoaW5nIGluIHRoZQorICogZm9sbG93aW5nIGNpcmN1bXN0YW5jZXM6CisgKgorICogLSBFeGNsdXNpdmUgRkIgYWNjZXNzIHdpdGggaHcgaWRsZToKKyAqICAgIC0gV2FpdCBmb3IgR1VJIElkbGUgKD8pIGludGVycnVwdCwgdGhlbiBkbyBub3JtYWwgZmx1c2guCisgKgorICogLSBGcmFtZSB0aHJvdHRsaW5nLCBOVl9mZW5jZToKKyAqICAgIC0gRHJvcCBtYXJrZXIgaXJxJ3MgaW50byBjb21tYW5kIHN0cmVhbSBhaGVhZCBvZiB0aW1lLgorICogICAgLSBXYWl0IG9uIGlycSdzIHdpdGggbG9jayAqbm90IGhlbGQqCisgKiAgICAtIENoZWNrIGVhY2ggZm9yIHRlcm1pbmF0aW9uIGNvbmRpdGlvbgorICoKKyAqIC0gSW50ZXJuYWxseSBpbiBjcF9nZXRidWZmZXIsIGV0YzoKKyAqICAgIC0gYXMgYWJvdmUsIGJ1dCB3YWl0IHdpdGggbG9jayBoZWxkPz8/CisgKgorICogTk9URTogVGhlc2UgZnVuY3Rpb25zIGFyZSBtaXNsZWFkaW5nbHkgbmFtZWQgLS0gdGhlIGlycSdzIGFyZW4ndAorICogdGllZCB0byBkbWEgYXQgYWxsLCB0aGlzIGlzIGp1c3QgYSBoYW5nb3ZlciBmcm9tIGRyaSBwcmVoaXN0b3J5LgorICovCisKK2lycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgCXUzMiBzdGF0OworCisJLyogT25seSBjb25zaWRlciB0aGUgYml0cyB3ZSdyZSBpbnRlcmVzdGVkIGluIC0gb3RoZXJzIGNvdWxkIGJlIHVzZWQKKwkgKiBvdXRzaWRlIHRoZSBEUk0KKwkgKi8KKwlzdGF0ID0gUkFERU9OX1JFQUQoUkFERU9OX0dFTl9JTlRfU1RBVFVTKQorCSAgICAgJiAoUkFERU9OX1NXX0lOVF9URVNUIHwgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpOworCWlmICghc3RhdCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogU1cgaW50ZXJydXB0ICovCisJaWYgKHN0YXQgJiBSQURFT05fU1dfSU5UX1RFU1QpIHsKKwkJRFJNX1dBS0VVUCggJmRldl9wcml2LT5zd2lfcXVldWUgKTsKKwl9CisKKwkvKiBWQkxBTksgaW50ZXJydXB0ICovCisJaWYgKHN0YXQgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkgeworCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRldiApOworCX0KKworCS8qIEFja25vd2xlZGdlIGludGVycnVwdHMgd2UgaGFuZGxlICovCisJUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX1NUQVRVUywgc3RhdCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1MzIgdG1wID0gUkFERU9OX1JFQUQoIFJBREVPTl9HRU5fSU5UX1NUQVRVUyApCisJCSYgKFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgfCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CisJaWYgKHRtcCkKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9TVEFUVVMsIHRtcCApOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X2lycShkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCByZXQ7CisJUklOR19MT0NBTFM7CisKKwlhdG9taWNfaW5jKCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQpOworCXJldCA9IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQpOworCisJQkVHSU5fUklORyggNCApOworCU9VVF9SSU5HX1JFRyggUkFERU9OX0xBU1RfU1dJX1JFRywgcmV0ICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fR0VOX0lOVF9TVEFUVVMsIFJBREVPTl9TV19JTlRfRklSRSApOworCUFEVkFOQ0VfUklORygpOyAKKyAJQ09NTUlUX1JJTkcoKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByYWRlb25fd2FpdF9pcnEoZHJtX2RldmljZV90ICpkZXYsIGludCBzd2lfbnIpCit7CisgIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWludCByZXQgPSAwOworCisgCWlmIChSQURFT05fUkVBRCggUkFERU9OX0xBU1RfU1dJX1JFRyApID49IHN3aV9ucikgIAorIAkJcmV0dXJuIDA7IAorCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOworCisJLyogVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgbXlzdGVyaW91cyBmcmVlemVzIG9uIGNlcnRhaW4KKwkgKiBzeXN0ZW1zOgorCSAqLyAKKwlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyggZGV2X3ByaXYgKTsKKworCURSTV9XQUlUX09OKCByZXQsIGRldl9wcml2LT5zd2lfcXVldWUsIDMgKiBEUk1fSFosIAorCQkgICAgIFJBREVPTl9SRUFEKCBSQURFT05fTEFTVF9TV0lfUkVHICkgPj0gc3dpX25yICk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKyAgCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CisJaW50IHJldCA9IDA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHVzZXIgaGFzIG1pc3NlZCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIKKwkgKiBieSBhYm91dCBhIGRheSByYXRoZXIgdGhhbiBzaGUgd2FudHMgdG8gd2FpdCBmb3IgeWVhcnMKKwkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4gCisJICovCisJRFJNX1dBSVRfT04oIHJldCwgZGV2LT52YmxfcXVldWUsIDMqRFJNX0haLCAKKwkJICAgICAoICggKCBjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkICkgKQorCQkJIC0gKnNlcXVlbmNlICkgPD0gKDE8PDIzKSApICk7CisKKwkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOworCisJcmV0dXJuIHJldDsKK30KKworCisvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgorICovCitpbnQgcmFkZW9uX2lycV9lbWl0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25faXJxX2VtaXRfdCBlbWl0OworCWludCByZXN1bHQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGVtaXQsIChkcm1fcmFkZW9uX2lycV9lbWl0X3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihlbWl0KSApOworCisJcmVzdWx0ID0gcmFkZW9uX2VtaXRfaXJxKCBkZXYgKTsKKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggZW1pdC5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBEb2Vzbid0IG5lZWQgdGhlIGhhcmR3YXJlIGxvY2suCisgKi8KK2ludCByYWRlb25faXJxX3dhaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9pcnFfd2FpdF90IGlycXdhaXQ7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaXJxd2FpdCwgKGRybV9yYWRlb25faXJxX3dhaXRfdCBfX3VzZXIqKWRhdGEsCisJCQkJICBzaXplb2YoaXJxd2FpdCkgKTsKKworCXJldHVybiByYWRlb25fd2FpdF9pcnEoIGRldiwgaXJxd2FpdC5pcnFfc2VxICk7Cit9CisKKworLyogZHJtX2RtYS5oIGhvb2tzCisqLwordm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisgCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLworICAgICAgCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwgMCApOworCisJLyogQ2xlYXIgYml0cyBpZiB0aGV5J3JlIGFscmVhZHkgaGlnaCAqLworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworfQorCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisgICAJYXRvbWljX3NldCgmZGV2X3ByaXYtPnN3aV9lbWl0dGVkLCAwKTsKKwlEUk1fSU5JVF9XQUlUUVVFVUUoICZkZXZfcHJpdi0+c3dpX3F1ZXVlICk7CisKKwkvKiBUdXJuIG9uIFNXIGFuZCBWQkwgaW50cyAqLworICAgCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwKKwkJICAgICAgUkFERU9OX0NSVENfVkJMQU5LX01BU0sgfAkKKwkJICAgICAgUkFERU9OX1NXX0lOVF9FTkFCTEUgKTsKK30KKwordm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9DTlRMLCAwICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGY4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9tZW0uYwpAQCAtMCwwICsxLDMyMiBAQAorLyogcmFkZW9uX21lbS5jIC0tIFNpbXBsZSBHQVJUL2ZiIG1lbW9yeSBtYW5hZ2VyIGZvciByYWRlb24gLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQorICogaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBSYWRlb24gODUwMCBkcml2ZXIgdW5kZXIgdGhlIFhGcmVlODYgbGljZW5zZS4KKyAqIFRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworLyogVmVyeSBzaW1wbGUgYWxsb2NhdG9yIGZvciBHQVJUIG1lbW9yeSwgd29ya2luZyBvbiBhIHN0YXRpYyByYW5nZQorICogYWxyZWFkeSBtYXBwZWQgaW50byBlYWNoIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UuICAKKyAqLworCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqc3BsaXRfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSwKKwkJCQkgICAgIERSTUZJTEUgZmlscCApCit7CisJLyogTWF5YmUgY3V0IG9mZiB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc3RhcnQgPiBwLT5zdGFydCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9IGRybV9hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgRFJNX01FTV9CVUZTICk7CisJCWlmICghbmV3YmxvY2spIAorCQkJZ290byBvdXQ7CisJCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0OworCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSAoc3RhcnQgLSBwLT5zdGFydCk7CisJCW5ld2Jsb2NrLT5maWxwID0gTlVMTDsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQluZXdibG9jay0+cHJldiA9IHA7CisJCXAtPm5leHQtPnByZXYgPSBuZXdibG9jazsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCQlwLT5zaXplIC09IG5ld2Jsb2NrLT5zaXplOworCQlwID0gbmV3YmxvY2s7CisJfQorICAgCisJLyogTWF5YmUgY3V0IG9mZiB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGJsb2NrICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrID0gZHJtX2FsbG9jKHNpemVvZigqbmV3YmxvY2spLCBEUk1fTUVNX0JVRlMgKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCWdvdG8gb3V0OworCQluZXdibG9jay0+c3RhcnQgPSBzdGFydCArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5maWxwID0gTlVMTDsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQluZXdibG9jay0+cHJldiA9IHA7CisJCXAtPm5leHQtPnByZXYgPSBuZXdibG9jazsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCQlwLT5zaXplID0gc2l6ZTsKKwl9CisKKyBvdXQ6CisJLyogT3VyIGJsb2NrIGlzIGluIHRoZSBtaWRkbGUgKi8KKwlwLT5maWxwID0gZmlscDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKmFsbG9jX2Jsb2NrKCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwLCBpbnQgc2l6ZSwgCisJCQkJICAgICAgaW50IGFsaWduMiwgRFJNRklMRSBmaWxwICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCWludCBtYXNrID0gKDEgPDwgYWxpZ24yKS0xOworCisJbGlzdF9mb3JfZWFjaChwLCBoZWFwKSB7CisJCWludCBzdGFydCA9IChwLT5zdGFydCArIG1hc2spICYgfm1hc2s7CisJCWlmIChwLT5maWxwID09IDAgJiYgc3RhcnQgKyBzaXplIDw9IHAtPnN0YXJ0ICsgcC0+c2l6ZSkKKwkJCXJldHVybiBzcGxpdF9ibG9jayggcCwgc3RhcnQsIHNpemUsIGZpbHAgKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKmZpbmRfYmxvY2soIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzdGFydCApCit7CisJc3RydWN0IG1lbV9ibG9jayAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkKKwkJaWYgKHAtPnN0YXJ0ID09IHN0YXJ0KQorCQkJcmV0dXJuIHA7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2Jsb2NrKCBzdHJ1Y3QgbWVtX2Jsb2NrICpwICkKK3sKKwlwLT5maWxwID0gTlVMTDsKKworCS8qIEFzc3VtZXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gIE5lZWRzIGEgc3BlY2lhbCBmaWxwIGluCisJICogJ2hlYXAnIHRvIHN0b3AgaXQgYmVpbmcgc3Vic3VtZWQuCisJICovCisJaWYgKHAtPm5leHQtPmZpbHAgPT0gMCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSArPSBxLT5zaXplOworCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJcC0+bmV4dC0+cHJldiA9IHA7CisJCWRybV9mcmVlKHEsIHNpemVvZigqcSksIERSTV9NRU1fQlVGUyApOworCX0KKworCWlmIChwLT5wcmV2LT5maWxwID09IDApIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPnByZXY7CisJCXEtPnNpemUgKz0gcC0+c2l6ZTsKKwkJcS0+bmV4dCA9IHAtPm5leHQ7CisJCXEtPm5leHQtPnByZXYgPSBxOworCQlkcm1fZnJlZShwLCBzaXplb2YoKnEpLCBEUk1fTUVNX0JVRlMgKTsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUuICBIb3cgdG8gY2hlY2sgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgaGVhcD8KKyAqLworc3RhdGljIGludCBpbml0X2hlYXAoc3RydWN0IG1lbV9ibG9jayAqKmhlYXAsIGludCBzdGFydCwgaW50IHNpemUpCit7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2tzID0gZHJtX2FsbG9jKHNpemVvZigqYmxvY2tzKSwgRFJNX01FTV9CVUZTICk7CisKKwlpZiAoIWJsb2NrcykgCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCisJKmhlYXAgPSBkcm1fYWxsb2Moc2l6ZW9mKCoqaGVhcCksIERSTV9NRU1fQlVGUyApOworCWlmICghKmhlYXApIHsKKwkJZHJtX2ZyZWUoIGJsb2Nrcywgc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwlibG9ja3MtPnN0YXJ0ID0gc3RhcnQ7CisJYmxvY2tzLT5zaXplID0gc2l6ZTsKKwlibG9ja3MtPmZpbHAgPSBOVUxMOworCWJsb2Nrcy0+bmV4dCA9IGJsb2Nrcy0+cHJldiA9ICpoZWFwOworCisJbWVtc2V0KCAqaGVhcCwgMCwgc2l6ZW9mKCoqaGVhcCkgKTsKKwkoKmhlYXApLT5maWxwID0gKERSTUZJTEUpIC0xOworCSgqaGVhcCktPm5leHQgPSAoKmhlYXApLT5wcmV2ID0gYmxvY2tzOworCXJldHVybiAwOworfQorCisKKy8qIEZyZWUgYWxsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2luZyBmaWxlLgorICovCit2b2lkIHJhZGVvbl9tZW1fcmVsZWFzZSggRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCFoZWFwIHx8ICFoZWFwLT5uZXh0KQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoKHAsIGhlYXApIHsKKwkJaWYgKHAtPmZpbHAgPT0gZmlscCkgCisJCQlwLT5maWxwID0gTlVMTDsKKwl9CisKKwkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlscCBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkgeworCQl3aGlsZSAocC0+ZmlscCA9PSAwICYmIHAtPm5leHQtPmZpbHAgPT0gMCkgeworCQkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisJCQlwLT5zaXplICs9IHEtPnNpemU7CisJCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJCXAtPm5leHQtPnByZXYgPSBwOworCQkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSxEUk1fTUVNX0RSSVZFUik7CisJCX0KKwl9Cit9CisKKy8qIFNodXRkb3duLgorICovCit2b2lkIHJhZGVvbl9tZW1fdGFrZWRvd24oIHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCQorCWlmICghKmhlYXApCisJCXJldHVybjsKKworCWZvciAocCA9ICgqaGVhcCktPm5leHQgOyBwICE9ICpoZWFwIDsgKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwOworCQlwID0gcC0+bmV4dDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSxEUk1fTUVNX0RSSVZFUik7CisJfQorCisJZHJtX2ZyZWUoICpoZWFwLCBzaXplb2YoKipoZWFwKSxEUk1fTUVNX0RSSVZFUiApOworCSpoZWFwID0gTlVMTDsKK30KKworCisKKy8qIElPQ1RMIEhBTkRMRVJTICovCisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICoqZ2V0X2hlYXAoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICBpbnQgcmVnaW9uICkKK3sKKwlzd2l0Y2goIHJlZ2lvbiApIHsKKwljYXNlIFJBREVPTl9NRU1fUkVHSU9OX0dBUlQ6CisgCQlyZXR1cm4gJmRldl9wcml2LT5nYXJ0X2hlYXA7IAorCWNhc2UgUkFERU9OX01FTV9SRUdJT05fRkI6CisJCXJldHVybiAmZGV2X3ByaXYtPmZiX2hlYXA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitpbnQgcmFkZW9uX21lbV9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX21lbV9hbGxvY190IGFsbG9jOworCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrLCAqKmhlYXA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggYWxsb2MsIChkcm1fcmFkZW9uX21lbV9hbGxvY190IF9fdXNlciAqKWRhdGEsCisJCQkJICBzaXplb2YoYWxsb2MpICk7CisKKwloZWFwID0gZ2V0X2hlYXAoIGRldl9wcml2LCBhbGxvYy5yZWdpb24gKTsKKwlpZiAoIWhlYXAgfHwgISpoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQorCS8qIE1ha2UgdGhpbmdzIGVhc2llciBvbiBvdXJzZWx2ZXM6IGFsbCBhbGxvY2F0aW9ucyBhdCBsZWFzdAorCSAqIDRrIGFsaWduZWQuCisJICovCisJaWYgKGFsbG9jLmFsaWdubWVudCA8IDEyKQorCQlhbGxvYy5hbGlnbm1lbnQgPSAxMjsKKworCWJsb2NrID0gYWxsb2NfYmxvY2soICpoZWFwLCBhbGxvYy5zaXplLCBhbGxvYy5hbGlnbm1lbnQsCisJCQkgICAgIGZpbHAgKTsKKworCWlmICghYmxvY2spIAorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCBhbGxvYy5yZWdpb25fb2Zmc2V0LCAmYmxvY2stPnN0YXJ0LCAKKwkJCSAgICAgICBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworCitpbnQgcmFkZW9uX21lbV9mcmVlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fbWVtX2ZyZWVfdCBtZW1mcmVlOworCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrLCAqKmhlYXA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggbWVtZnJlZSwgKGRybV9yYWRlb25fbWVtX2ZyZWVfdCBfX3VzZXIgKilkYXRhLAorCQkJCSAgc2l6ZW9mKG1lbWZyZWUpICk7CisKKwloZWFwID0gZ2V0X2hlYXAoIGRldl9wcml2LCBtZW1mcmVlLnJlZ2lvbiApOworCWlmICghaGVhcCB8fCAhKmhlYXApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCisJYmxvY2sgPSBmaW5kX2Jsb2NrKCAqaGVhcCwgbWVtZnJlZS5yZWdpb25fb2Zmc2V0ICk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCWlmIChibG9jay0+ZmlscCAhPSBmaWxwKQorCQlyZXR1cm4gRFJNX0VSUihFUEVSTSk7CisKKwlmcmVlX2Jsb2NrKCBibG9jayApOwkKKwlyZXR1cm4gMDsKK30KKworaW50IHJhZGVvbl9tZW1faW5pdF9oZWFwKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fbWVtX2luaXRfaGVhcF90IGluaXRoZWFwOworCXN0cnVjdCBtZW1fYmxvY2sgKipoZWFwOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluaXRoZWFwLCAoZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihpbml0aGVhcCkgKTsKKworCWhlYXAgPSBnZXRfaGVhcCggZGV2X3ByaXYsIGluaXRoZWFwLnJlZ2lvbiApOworCWlmICghaGVhcCkgCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCisJaWYgKCpoZWFwKSB7CisJCURSTV9FUlJPUigiaGVhcCBhbHJlYWR5IGluaXRpYWxpemVkPyIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkJCisJcmV0dXJuIGluaXRfaGVhcCggaGVhcCwgaW5pdGhlYXAuc3RhcnQsIGluaXRoZWFwLnNpemUgKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc5ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtMCwwICsxLDMxMDIgQEAKKy8qIHJhZGVvbl9zdGF0ZS5jIC0tIFN0YXRlIHN1cHBvcnQgZm9yIFJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgY2xpZW50IHN0YXRlIGNoZWNraW5nIGFuZCBmaXh1cAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkJICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgIHUzMiAqb2Zmc2V0ICkgeworCXUzMiBvZmYgPSAqb2Zmc2V0OworCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CisKKwlpZiAoIG9mZiA+PSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gJiYKKwkgICAgIG9mZiA8ICggZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKyBkZXZfcHJpdi0+Z2FydF9zaXplICkgKQorCQlyZXR1cm4gMDsKKworCXJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKKwlvZmYgKz0gcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YTsKKworCURSTV9ERUJVRyggIm9mZnNldCBmaXhlZCB1cCB0byAweCV4XG4iLCBvZmYgKTsKKworCWlmICggb2ZmIDwgZGV2X3ByaXYtPmZiX2xvY2F0aW9uIHx8CisJICAgICBvZmYgPj0gKCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCArIGRldl9wcml2LT5nYXJ0X3NpemUgKSApCisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKworCSpvZmZzZXQgPSBvZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICAgaW50IGlkLAorCQkJCQkJICAgICAgdTMyIF9fdXNlciAqZGF0YSApIHsKKwlzd2l0Y2ggKCBpZCApIHsKKworCWNhc2UgUkFERU9OX0VNSVRfUFBfTUlTQzoKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9SQjNEX0RFUFRIT0ZGU0VUCisJCQkJCQkJICAgIC0gUkFERU9OX1BQX01JU0MgKSAvIDRdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0VNSVRfUFBfQ05UTDoKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9SQjNEX0NPTE9ST0ZGU0VUCisJCQkJCQkJICAgIC0gUkFERU9OX1BQX0NOVEwgKSAvIDRdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIGNvbG91ciBidWZmZXIgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8wOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzE6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMjoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8zOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzQ6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNToKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVswXSApICkgeworCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBSMjAwIHRleHR1cmUgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzA6CisJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8xOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMjoKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9QUF9UWE9GRlNFVF8wCisJCQkJCQkJICAgIC0gUkFERU9OX1BQX1RYRklMVEVSXzAgKSAvIDRdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIxMDAgdGV4dHVyZSBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzE6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18yOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQ6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181OiB7CisJCWludCBpOworCQlmb3IgKCBpID0gMDsgaSA8IDU7IGkrKyApIHsKKwkJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkJICAgICZkYXRhW2ldICkgKSB7CisJCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBSMjAwIGN1YmljIHRleHR1cmUgb2Zmc2V0XG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QyOnsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwKKwkJCQkJCQkJICBmaWxwX3ByaXYsCisJCQkJCQkJCSAgJmRhdGFbaV0pKSB7CisJCQkJCURSTV9FUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIFIxMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIpOworCQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0VNSVRfUkIzRF9DT0xPUlBJVENIOgorCWNhc2UgUkFERU9OX0VNSVRfUkVfTElORV9QQVRURVJOOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfTElORV9XSURUSDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0xVTV9NQVRSSVg6CisJY2FzZSBSQURFT05fRU1JVF9QUF9ST1RfTUFUUklYXzA6CisJY2FzZSBSQURFT05fRU1JVF9SQjNEX1NURU5DSUxSRUZNQVNLOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfVlBPUlRfWFNDQUxFOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfQ05UTDoKKwljYXNlIFJBREVPTl9FTUlUX1NFX0NOVExfU1RBVFVTOgorCWNhc2UgUkFERU9OX0VNSVRfUkVfTUlTQzoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8wOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMjoKKwljYXNlIFJBREVPTl9FTUlUX1NFX1pCSUFTX0ZBQ1RPUjoKKwljYXNlIFJBREVPTl9FTUlUX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVDoKKwljYXNlIFJBREVPTl9FTUlUX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF8yOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF81OgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzY6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNzoKKwljYXNlIFIyMDBfRU1JVF9UQ0xfTElHSFRfTU9ERUxfQ1RMXzA6CisJY2FzZSBSMjAwX0VNSVRfVEZBQ1RPUl8wOgorCWNhc2UgUjIwMF9FTUlUX1ZUWF9GTVRfMDoKKwljYXNlIFIyMDBfRU1JVF9WQVBfQ1RMOgorCWNhc2UgUjIwMF9FTUlUX01BVFJJWF9TRUxFQ1RfMDoKKwljYXNlIFIyMDBfRU1JVF9URVhfUFJPQ19DVExfMjoKKwljYXNlIFIyMDBfRU1JVF9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8yOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl81OgorCWNhc2UgUjIwMF9FTUlUX1ZURV9DTlRMOgorCWNhc2UgUjIwMF9FTUlUX09VVFBVVF9WVFhfQ09NUF9TRUw6CisJY2FzZSBSMjAwX0VNSVRfUFBfVEFNX0RFQlVHMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9DTlRMX1g6CisJY2FzZSBSMjAwX0VNSVRfUkIzRF9ERVBUSFhZX09GRlNFVDoKKwljYXNlIFIyMDBfRU1JVF9SRV9BVVhfU0NJU1NPUl9DTlRMOgorCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMDoKKwljYXNlIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzE6CisJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8yOgorCWNhc2UgUjIwMF9FTUlUX1NFX1ZBUF9DTlRMX1NUQVRVUzoKKwljYXNlIFIyMDBfRU1JVF9TRV9WVFhfU1RBVEVfQ05UTDoKKwljYXNlIFIyMDBfRU1JVF9SRV9QT0lOVFNJWkU6CisJY2FzZSBSMjAwX0VNSVRfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18yOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU181OgorCWNhc2UgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8yOgorCWNhc2UgUjIwMF9FTUlUX1JCM0RfQkxFTkRDT0xPUjoKKwljYXNlIFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEw6CisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18wOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTDoKKwkJLyogVGhlc2UgcGFja2V0cyBkb24ndCBjb250YWluIG1lbW9yeSBvZmZzZXRzICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCAiVW5rbm93biBzdGF0ZSBwYWNrZXQgSUQgJWRcbiIsIGlkICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICAgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCAqY21kc3ogKSB7CisJdTMyICpjbWQgPSAodTMyICopIGNtZGJ1Zi0+YnVmOworCisJKmNtZHN6ID0gMiArICggKCBjbWRbMF0gJiBSQURFT05fQ1BfUEFDS0VUX0NPVU5UX01BU0sgKSA+PiAxNiApOworCisJaWYgKCAoIGNtZFswXSAmIDB4YzAwMDAwMDAgKSAhPSBSQURFT05fQ1BfUEFDS0VUMyApIHsKKwkJRFJNX0VSUk9SKCAiTm90IGEgdHlwZSAzIHBhY2tldFxuIiApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJaWYgKCA0ICogKmNtZHN6ID4gY21kYnVmLT5idWZzeiApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHNpemUgbGFyZ2VyIHRoYW4gc2l6ZSBvZiBkYXRhIHByb3ZpZGVkXG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwkvKiBDaGVjayBjbGllbnQgc3RhdGUgYW5kIGZpeCBpdCB1cCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIGNtZFswXSAmIDB4ODAwMCApIHsgLyogTVNCIG9mIG9wY29kZTogbmV4dCBEV09SRCBHVUlfQ05UTCAqLworCQl1MzIgb2Zmc2V0OworCisJCWlmICggY21kWzFdICYgKCBSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTAorCQkJICAgICAgfCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCApICkgeworCQkJb2Zmc2V0ID0gY21kWzJdIDw8IDEwOworCQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJm9mZnNldCApICkgeworCQkJCURSTV9FUlJPUiggIkludmFsaWQgZmlyc3QgcGFja2V0IG9mZnNldFxuIiApOworCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCX0KKwkJCWNtZFsyXSA9ICggY21kWzJdICYgMHhmZmMwMDAwMCApIHwgb2Zmc2V0ID4+IDEwOworCQl9CisKKwkJaWYgKCAoIGNtZFsxXSAmIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMICkgJiYKKwkJICAgICAoIGNtZFsxXSAmIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMICkgKSB7CisJCQlvZmZzZXQgPSBjbWRbM10gPDwgMTA7CisJCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0ICkgKSB7CisJCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBzZWNvbmQgcGFja2V0IG9mZnNldFxuIiApOworCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCX0KKwkJCWNtZFszXSA9ICggY21kWzNdICYgMHhmZmMwMDAwMCApIHwgb2Zmc2V0ID4+IDEwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ1AgaGFyZHdhcmUgc3RhdGUgcHJvZ3JhbW1pbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkJICBkcm1fY2xpcF9yZWN0X3QgKmJveCApCit7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoICIgICBib3g6ICB4MT0lZCB5MT0lZCAgeDI9JWQgeTI9JWRcbiIsCisJCSAgIGJveC0+eDEsIGJveC0+eTEsIGJveC0+eDIsIGJveC0+eTIgKTsKKworCUJFR0lOX1JJTkcoIDQgKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX1RPUF9MRUZULCAwICkgKTsKKwlPVVRfUklORyggKGJveC0+eTEgPDwgMTYpIHwgYm94LT54MSApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfV0lEVEhfSEVJR0hULCAwICkgKTsKKwlPVVRfUklORyggKChib3gtPnkyIC0gMSkgPDwgMTYpIHwgKGJveC0+eDIgLSAxKSApOworCUFEVkFOQ0VfUklORygpOworfQorCisvKiBFbWl0IDEuMSBzdGF0ZQorICovCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkgICAgICBkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190ICpjdHgsCisJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190ICp0ZXgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGlydHkgKQoreworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImRpcnR5PTB4JTA4eFxuIiwgZGlydHkgKTsKKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0NPTlRFWFQgKSB7CisJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgJmN0eC0+cmIzZF9kZXB0aG9mZnNldCApICkgeworCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZjdHgtPnJiM2RfY29sb3JvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgZGVwdGggYnVmZmVyIG9mZnNldFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggMTQgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9NSVNDLCA2ICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfbWlzYyApOworCQlPVVRfUklORyggY3R4LT5wcF9mb2dfY29sb3IgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmVfc29saWRfY29sb3IgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9ibGVuZGNudGwgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9kZXB0aG9mZnNldCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2RlcHRocGl0Y2ggKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF96c3RlbmNpbGNudGwgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9DTlRMLCAyICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2NudGwgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9jb2xvcm9mZnNldCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfQ09MT1JQSVRDSCwgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2RfY29sb3JwaXRjaCApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WRVJURk1UICkgeworCQlCRUdJTl9SSU5HKCAyICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ09PUkRfRk1ULCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfY29vcmRfZm10ICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0xJTkUgKSB7CisJCUJFR0lOX1JJTkcoIDUgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9MSU5FX1BBVFRFUk4sIDEgKSApOworCQlPVVRfUklORyggY3R4LT5yZV9saW5lX3BhdHRlcm4gKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmVfbGluZV9zdGF0ZSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX0xJTkVfV0lEVEgsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9saW5lX3dpZHRoICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0JVTVBNQVAgKSB7CisJCUJFR0lOX1JJTkcoIDUgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9MVU1fTUFUUklYLCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfbHVtX21hdHJpeCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1JPVF9NQVRSSVhfMCwgMSApICk7CisJCU9VVF9SSU5HKCBjdHgtPnBwX3JvdF9tYXRyaXhfMCApOworCQlPVVRfUklORyggY3R4LT5wcF9yb3RfbWF0cml4XzEgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfTUFTS1MgKSB7CisJCUJFR0lOX1JJTkcoIDQgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAyICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9zdGVuY2lscmVmbWFzayApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3JvcGNudGwgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9wbGFuZW1hc2sgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVklFV1BPUlQgKSB7CisJCUJFR0lOX1JJTkcoIDcgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9WUE9SVF9YU0NBTEUsIDUgKSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF94c2NhbGUgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfeG9mZnNldCApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF95c2NhbGUgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfeW9mZnNldCApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF96c2NhbGUgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfem9mZnNldCApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9TRVRVUCApIHsKKwkJQkVHSU5fUklORyggNCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX0NOVEwsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9jbnRsICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ05UTF9TVEFUVVMsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9jbnRsX3N0YXR1cyApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NSVNDICkgeworCQlCRUdJTl9SSU5HKCAyICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfTUlTQywgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnJlX21pc2MgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMCApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmdGV4WzBdLnBwX3R4b2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDBcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDkgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8wLCA1ICkgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90eGZpbHRlciApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4Zm9ybWF0ICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90eGNibGVuZCApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4YWJsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdGZhY3RvciApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8wLCAwICkgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMSApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmdGV4WzFdLnBwX3R4b2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDFcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDkgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8xLCA1ICkgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90eGZpbHRlciApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4Zm9ybWF0ICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90eGNibGVuZCApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4YWJsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdGZhY3RvciApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xLCAwICkgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMiApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmdGV4WzJdLnBwX3R4b2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDJcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDkgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8yLCA1ICkgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90eGZpbHRlciApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4Zm9ybWF0ICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90eGNibGVuZCApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4YWJsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdGZhY3RvciApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLCAwICkgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEVtaXQgMS4yIHN0YXRlCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUyKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJICAgICAgIGRybV9yYWRlb25fc3RhdGVfdCAqc3RhdGUgKQoreworCVJJTkdfTE9DQUxTOworCisJaWYgKHN0YXRlLT5kaXJ0eSAmIFJBREVPTl9VUExPQURfWkJJQVMpIHsKKwkJQkVHSU5fUklORyggMyApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiwgMSApICk7CisJCU9VVF9SSU5HKCBzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfZmFjdG9yICk7IAorCQlPVVRfUklORyggc3RhdGUtPmNvbnRleHQyLnNlX3piaWFzX2NvbnN0YW50ICk7IAorCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlyZXR1cm4gcmFkZW9uX2VtaXRfc3RhdGUoIGRldl9wcml2LCBmaWxwX3ByaXYsICZzdGF0ZS0+Y29udGV4dCwKKwkJCSAgIHN0YXRlLT50ZXgsIHN0YXRlLT5kaXJ0eSApOworfQorCisvKiBOZXcgKDEuMykgc3RhdGUgbWVjaGFuaXNtLiAgMyBjb21tYW5kcyAocGFja2V0LCBzY2FsYXIsIHZlY3RvcikgaW4KKyAqIDEuMyBjbWRidWZmZXJzIGFsbG93IGFsbCBwcmV2aW91cyBzdGF0ZSB0byBiZSB1cGRhdGVkIGFzIHdlbGwgYXMKKyAqIHRoZSB0Y2wgc2NhbGFyIGFuZCB2ZWN0b3IgYXJlYXMuICAKKyAqLworc3RhdGljIHN0cnVjdCB7IAorCWludCBzdGFydDsgCisJaW50IGxlbjsgCisJY29uc3QgY2hhciAqbmFtZTsKK30gcGFja2V0W1JBREVPTl9NQVhfU1RBVEVfUEFDS0VUU10gPSB7CisJeyBSQURFT05fUFBfTUlTQyw3LCJSQURFT05fUFBfTUlTQyIgfSwKKwl7IFJBREVPTl9QUF9DTlRMLDMsIlJBREVPTl9QUF9DTlRMIiB9LAorCXsgUkFERU9OX1JCM0RfQ09MT1JQSVRDSCwxLCJSQURFT05fUkIzRF9DT0xPUlBJVENIIiB9LAorCXsgUkFERU9OX1JFX0xJTkVfUEFUVEVSTiwyLCJSQURFT05fUkVfTElORV9QQVRURVJOIiB9LAorCXsgUkFERU9OX1NFX0xJTkVfV0lEVEgsMSwiUkFERU9OX1NFX0xJTkVfV0lEVEgiIH0sCisJeyBSQURFT05fUFBfTFVNX01BVFJJWCwxLCJSQURFT05fUFBfTFVNX01BVFJJWCIgfSwKKwl7IFJBREVPTl9QUF9ST1RfTUFUUklYXzAsMiwiUkFERU9OX1BQX1JPVF9NQVRSSVhfMCIgfSwKKwl7IFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLDMsIlJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLIiB9LAorCXsgUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSw2LCJSQURFT05fU0VfVlBPUlRfWFNDQUxFIiB9LAorCXsgUkFERU9OX1NFX0NOVEwsMiwiUkFERU9OX1NFX0NOVEwiIH0sCisJeyBSQURFT05fU0VfQ05UTF9TVEFUVVMsMSwiUkFERU9OX1NFX0NOVExfU1RBVFVTIiB9LAorCXsgUkFERU9OX1JFX01JU0MsMSwiUkFERU9OX1JFX01JU0MiIH0sCisJeyBSQURFT05fUFBfVFhGSUxURVJfMCw2LCJSQURFT05fUFBfVFhGSUxURVJfMCIgfSwKKwl7IFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCwxLCJSQURFT05fUFBfQk9SREVSX0NPTE9SXzAiIH0sCisJeyBSQURFT05fUFBfVFhGSUxURVJfMSw2LCJSQURFT05fUFBfVFhGSUxURVJfMSIgfSwKKwl7IFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMSwxLCJSQURFT05fUFBfQk9SREVSX0NPTE9SXzEiIH0sCisJeyBSQURFT05fUFBfVFhGSUxURVJfMiw2LCJSQURFT05fUFBfVFhGSUxURVJfMiIgfSwKKwl7IFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiwxLCJSQURFT05fUFBfQk9SREVSX0NPTE9SXzIiIH0sCisJeyBSQURFT05fU0VfWkJJQVNfRkFDVE9SLDIsIlJBREVPTl9TRV9aQklBU19GQUNUT1IiIH0sCisJeyBSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1ULDExLCJSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1UIiB9LAorCXsgUkFERU9OX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVELDE3LCJSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzAsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzAiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzEsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzEiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzIsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzIiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzMsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzMiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzQsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzQiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzUsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzUiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzYsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzYiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzcsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzciIH0sCisJeyBSMjAwX1NFX1RDTF9MSUdIVF9NT0RFTF9DVExfMCwgNiwgIlIyMDBfU0VfVENMX0xJR0hUX01PREVMX0NUTF8wIiB9LAorCXsgUjIwMF9QUF9URkFDVE9SXzAsIDYsICJSMjAwX1BQX1RGQUNUT1JfMCIgfSwKKwl7IFIyMDBfU0VfVlRYX0ZNVF8wLCA0LCAiUjIwMF9TRV9WVFhfRk1UXzAiIH0sCisJeyBSMjAwX1NFX1ZBUF9DTlRMLCAxLCAiUjIwMF9TRV9WQVBfQ05UTCIgfSwKKwl7IFIyMDBfU0VfVENMX01BVFJJWF9TRUxfMCwgNSwgIlIyMDBfU0VfVENMX01BVFJJWF9TRUxfMCIgfSwKKwl7IFIyMDBfU0VfVENMX1RFWF9QUk9DX0NUTF8yLCA1LCAiUjIwMF9TRV9UQ0xfVEVYX1BST0NfQ1RMXzIiIH0sCisJeyBSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwsIDEsICJSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzAsIDYsICJSMjAwX1BQX1RYRklMVEVSXzAiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzEsIDYsICJSMjAwX1BQX1RYRklMVEVSXzEiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzIsIDYsICJSMjAwX1BQX1RYRklMVEVSXzIiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzMsIDYsICJSMjAwX1BQX1RYRklMVEVSXzMiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzQsIDYsICJSMjAwX1BQX1RYRklMVEVSXzQiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzUsIDYsICJSMjAwX1BQX1RYRklMVEVSXzUiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzAsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzAiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzEsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzEiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzIsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzIiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzMsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzMiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzQsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzQiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzUsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzUiIH0sCisJeyBSMjAwX1NFX1ZURV9DTlRMLCAxLCAiUjIwMF9TRV9WVEVfQ05UTCIgfSwKKwl7IFIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwsIDEsICJSMjAwX1NFX1RDTF9PVVRQVVRfVlRYX0NPTVBfU0VMIiB9LAorCXsgUjIwMF9QUF9UQU1fREVCVUczLCAxLCAiUjIwMF9QUF9UQU1fREVCVUczIiB9LAorCXsgUjIwMF9QUF9DTlRMX1gsIDEsICJSMjAwX1BQX0NOVExfWCIgfSwgCisJeyBSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQsIDEsICJSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQiIH0sIAorCXsgUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCAxLCAiUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMIiB9LCAKKwl7IFIyMDBfUkVfU0NJU1NPUl9UTF8wLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzAiIH0sIAorCXsgUjIwMF9SRV9TQ0lTU09SX1RMXzEsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMSIgfSwgCisJeyBSMjAwX1JFX1NDSVNTT1JfVExfMiwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8yIiB9LCAKKwl7IFIyMDBfU0VfVkFQX0NOVExfU1RBVFVTLCAxLCAiUjIwMF9TRV9WQVBfQ05UTF9TVEFUVVMiIH0sIAorCXsgUjIwMF9TRV9WVFhfU1RBVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRYX1NUQVRFX0NOVEwiIH0sIAorCXsgUjIwMF9SRV9QT0lOVFNJWkUsIDEsICJSMjAwX1JFX1BPSU5UU0laRSIgfSwgCisJeyBSMjAwX1NFX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCwgNCwgIlIyMDBfU0VfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18wIiB9LCAvKiA2MSAqLworCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAiIH0sIC8qIDYyICovCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzEsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzEiIH0sCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMiIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzIsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8yIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18zLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18zIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMywgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMiIH0sCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzQsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzQiIH0sCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80LCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNCIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfNSwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfNSIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzUsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV81IiB9LAorCXsgUkFERU9OX1BQX1RFWF9TSVpFXzAsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMCIgfSwKKwl7IFJBREVPTl9QUF9URVhfU0laRV8xLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzEiIH0sCisJeyBSQURFT05fUFBfVEVYX1NJWkVfMiwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8yIiB9LAorCXsgUjIwMF9SQjNEX0JMRU5EQ09MT1IsIDMsICJSMjAwX1JCM0RfQkxFTkRDT0xPUiIgfSwKKwl7IFIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMLCAxLCAiUjIwMF9TRV9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwiIH0sCisJeyBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18wIn0sCisJeyBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzAifSwKKwl7IFJBREVPTl9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEifSwKKwl7IFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDFfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDFfMCJ9LAorCXsgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiJ9LAorCXsgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wIn0sCisJeyBSMjAwX1BQX1RSSV9QRVJGLCAyLCAiUjIwMF9QUF9UUklfUEVSRiJ9LAorfTsKKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcmFkZW9uX2NsZWFyX2JveCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICAgICBpbnQgciwgaW50IGcsIGludCBiICkKK3sKKwl1MzIgY29sb3I7CisJUklOR19MT0NBTFM7CisKKwl4ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS54MTsKKwl5ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS55MTsKKworCXN3aXRjaCAoIGRldl9wcml2LT5jb2xvcl9mbXQgKSB7CisJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NToKKwkJY29sb3IgPSAoKChyICYgMHhmOCkgPDwgOCkgfAorCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwKKwkJCSAoKGIgJiAweGY4KSA+PiAzKSk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODoKKwlkZWZhdWx0OgorCQljb2xvciA9ICgoKDB4ZmYpIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8ICA4KSB8IGIpOworCQlicmVhazsKKwl9CisKKwlCRUdJTl9SSU5HKCA0ICk7CisJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOwkJCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9EUF9XUklURV9NQVNLLCAwICkgKTsKKwlPVVRfUklORyggMHhmZmZmZmZmZiApOworCUFEVkFOQ0VfUklORygpOworCisJQkVHSU5fUklORyggNiApOworCisJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwlPVVRfUklORyggUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkgIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCSAgUkFERU9OX1JPUDNfUCB8CisJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTICk7CisKKyAJaWYgKCBkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyAmJiBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7IAorCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOworIAl9IGVsc2UgewkgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKKyAJfSAKKworCU9VVF9SSU5HKCBjb2xvciApOworCisJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwkvKiBDb2xsYXBzZSB2YXJpb3VzIHRoaW5ncyBpbnRvIGEgd2FpdCBmbGFnIC0tIHRyeWluZyB0bworCSAqIGd1ZXNzIGlmIHVzZXJzcGFzZSBzbGVwdCAtLSBiZXR0ZXIganVzdCB0byBoYXZlIHRoZW0gdGVsbCB1cy4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPnN0YXRzLmxhc3RfZnJhbWVfcmVhZHMgPiAxIHx8CisJICAgIGRldl9wcml2LT5zdGF0cy5sYXN0X2NsZWFyX3JlYWRzID4gZGV2X3ByaXYtPnN0YXRzLmNsZWFycykgeworCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisJfQorCisJaWYgKGRldl9wcml2LT5zdGF0cy5mcmVlbGlzdF9sb29wcykgeworCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisJfQorCisJLyogUHVycGxlIGJveCBmb3IgcGFnZSBmbGlwcGluZworCSAqLworCWlmICggZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9GTElQICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSApOworCisJLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50CisJICovCisJaWYgKCBkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX1dBSVRfSURMRSApIAorCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgMTYsIDQsIDgsIDgsIDI1NSwgMCwgMCApOworCisJLyogQmx1ZSBib3g6IGxvc3QgY29udGV4dD8KKwkgKi8KKworCS8qIFllbGxvdyBib3ggZm9yIHRleHR1cmUgc3dhcHMKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA0MCwgNCwgOCwgOCwgMjU1LCAyNTUsIDAgKTsKKworCS8qIEdyZWVuIGJveCBpZiBoYXJkd2FyZSBuZXZlciBpZGxlcyAoYXMgZmFyIGFzIHdlIGNhbiB0ZWxsKQorCSAqLworCWlmICggIShkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0RNQV9JRExFKSApIAorCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgNjQsIDQsIDgsIDgsIDAsIDI1NSwgMCApOworCisKKwkvKiBEcmF3IGJhcnMgaW5kaWNhdGluZyBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgCisJICogKG5vdCBhIGdyZWF0IG1lYXN1cmUsIGVhc2lseSBjb25mdXNlZCkKKwkgKi8KKwlpZiAoZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKSB7CisJCWlmIChkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMgPiAxMDApCisJCQlkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMgPSAxMDA7CisKKwkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQsIDE2LCAgCisJCQkJICBkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMsIDQsCisJCQkJICAxOTYsIDEyOCwgMTI4ICk7CisJfQorCisJbWVtc2V0KCAmZGV2X3ByaXYtPnN0YXRzLCAwLCBzaXplb2YoZGV2X3ByaXYtPnN0YXRzKSApOworCit9CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBjb21tYW5kIGRpc3BhdGNoIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICpjbGVhciwKKwkJCQkgICAgICBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqZGVwdGhfYm94ZXMgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90ICpkZXB0aF9jbGVhciA9ICZkZXZfcHJpdi0+ZGVwdGhfY2xlYXI7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKKwl1MzIgcmIzZF9jbnRsID0gMCwgcmIzZF9zdGVuY2lscmVmbWFzaz0gMDsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJmbGFncyA9IDB4JXhcbiIsIGZsYWdzICk7CisKKwlkZXZfcHJpdi0+c3RhdHMuY2xlYXJzKys7CisKKwlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsKKwkJdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOworCisJCWZsYWdzICY9IH4oUkFERU9OX0ZST05UIHwgUkFERU9OX0JBQ0spOworCQlpZiAoIHRtcCAmIFJBREVPTl9GUk9OVCApIGZsYWdzIHw9IFJBREVPTl9CQUNLOworCQlpZiAoIHRtcCAmIFJBREVPTl9CQUNLICkgIGZsYWdzIHw9IFJBREVPTl9GUk9OVDsKKwl9CisKKwlpZiAoIGZsYWdzICYgKFJBREVPTl9GUk9OVCB8IFJBREVPTl9CQUNLKSApIHsKKworCQlCRUdJTl9SSU5HKCA0ICk7CisKKwkJLyogRW5zdXJlIHRoZSAzRCBzdHJlYW0gaXMgaWRsZSBiZWZvcmUgZG9pbmcgYQorCQkgKiAyRCBmaWxsIHRvIGNsZWFyIHRoZSBmcm9udCBvciBiYWNrIGJ1ZmZlci4KKwkJICovCisJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwkJCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fRFBfV1JJVEVfTUFTSywgMCApICk7CisJCU9VVF9SSU5HKCBjbGVhci0+Y29sb3JfbWFzayApOworCisJCUFEVkFOQ0VfUklORygpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJCSAqLworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQkJaW50IHggPSBwYm94W2ldLngxOworCQkJaW50IHkgPSBwYm94W2ldLnkxOworCQkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKKwkJCWludCBoID0gcGJveFtpXS55MiAtIHk7CisKKwkJCURSTV9ERUJVRyggImRpc3BhdGNoIGNsZWFyICVkLCVkLSVkLCVkIGZsYWdzIDB4JXhcbiIsCisJCQkJICAgeCwgeSwgdywgaCwgZmxhZ3MgKTsKKworCQkJaWYgKCBmbGFncyAmIFJBREVPTl9GUk9OVCApIHsKKwkJCQlCRUdJTl9SSU5HKCA2ICk7CisJCQkJCisJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCQlPVVRfUklORyggUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCQkJICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJCSAgUkFERU9OX1JPUDNfUCB8CisJCQkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTICk7CisKKwkJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOworCQkJCU9VVF9SSU5HKCBjbGVhci0+Y2xlYXJfY29sb3IgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQkJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisJCQkJCisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCQkKKwkJCWlmICggZmxhZ3MgJiBSQURFT05fQkFDSyApIHsKKwkJCQlCRUdJTl9SSU5HKCA2ICk7CisJCQkJCisJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCQlPVVRfUklORyggUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCQkJICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJCSAgUkFERU9OX1JPUDNfUCB8CisJCQkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTICk7CisJCQkJCisJCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCApOworCQkJCU9VVF9SSU5HKCBjbGVhci0+Y2xlYXJfY29sb3IgKTsKKworCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKworCQkJCUFEVkFOQ0VfUklORygpOworCQkJfQorCQl9CisJfQorCQorCS8qIGh5cGVyIHogY2xlYXIgKi8KKwkvKiBubyBkb2NzIGF2YWlsYWJsZSwgYmFzZWQgb24gcmV2ZXJzZSBlbmdlbmVlcmluZyBieSBTdGVwaGFuZSBNYXJjaGVzaW4gKi8KKwlpZiAoKGZsYWdzICYgKFJBREVPTl9ERVBUSCB8IFJBREVPTl9TVEVOQ0lMKSkgJiYgKGZsYWdzICYgUkFERU9OX0NMRUFSX0ZBU1RaKSkgeworCisJCWludCBpOworCQlpbnQgZGVwdGhwaXhwZXJsaW5lID0gZGV2X3ByaXYtPmRlcHRoX2ZtdD09UkFERU9OX0RFUFRIX0ZPUk1BVF8xNkJJVF9JTlRfWj8gCisJCQkoZGV2X3ByaXYtPmRlcHRoX3BpdGNoIC8gMik6IChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyA0KTsKKwkJCisJCXUzMiBjbGVhcm1hc2s7CisKKwkJdTMyIHRlbXBSQjNEX0RFUFRIQ0xFQVJWQUxVRSA9IGNsZWFyLT5jbGVhcl9kZXB0aCB8CisJCQkoKGNsZWFyLT5kZXB0aF9tYXNrICYgMHhmZikgPDwgMjQpOworCQorCQkKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICogd2UgaGF2ZW4ndCB0b3VjaGVkIGFueSAibm9ybWFsIiBzdGF0ZSAtIHN0aWxsIG5lZWQgdGhpcz8KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopICYmIChmbGFncyAmIFJBREVPTl9VU0VfSElFUlopKSB7CisJCS8qIEZJWE1FIDogcmV2ZXJzZSBlbmdpbmVlciB0aGF0IGZvciBSeDAwIGNhcmRzICovCisJCS8qIEZJWE1FIDogdGhlIG1hc2sgc3VwcG9zZWRseSBjb250YWlucyBsb3ctcmVzIHogdmFsdWVzLiBTbyBjYW4ndCBzZXQKKwkJICAganVzdCB0byB0aGUgbWF4ICgweGZmPyBvciBhY3R1YWxseSAweDNmZmY/KSwgbmVlZCB0byB0YWtlIHogY2xlYXIKKwkJICAgdmFsdWUgaW50byBhY2NvdW50PyAqLworCQkvKiBwYXR0ZXJuIHNlZW1zIHRvIHdvcmsgZm9yIHIxMDAsIHRob3VnaCBnZXQgc2xpZ2h0CisJCSAgIHJlbmRlcmluZyBlcnJvcnMgd2l0aCBnbHhnZWFycy4gSWYgaGllcnogaXMgbm90IGVuYWJsZWQgZm9yIHIxMDAsCisJCSAgIG9ubHkgNCBiaXRzIHdoaWNoIGluZGljYXRlIGNsZWFyICgxNSwxNiwzMSwzMiwgYWxsIHplcm8pIG1hdHRlciwgdGhlCisJCSAgIG90aGVyIG9uZXMgYXJlIGlnbm9yZWQsIGFuZCB0aGUgc2FtZSBjbGVhciBtYXNrIGNhbiBiZSB1c2VkLiBUaGF0J3MKKwkJICAgdmVyeSBkaWZmZXJlbnQgYmVoYXZpb3VyIHRoYW4gUjIwMCB3aGljaCBuZWVkcyBkaWZmZXJlbnQgY2xlYXIgbWFzaworCQkgICBhbmQgZGlmZmVyZW50IG51bWJlciBvZiB0aWxlcyB0byBjbGVhciBpZiBoaWVyeiBpcyBlbmFibGVkIG9yIG5vdCAhPyEKKwkJKi8KKwkJCWNsZWFybWFzayA9ICgweGZmPDwyMil8KDB4ZmY8PDYpfCAweDAwM2YwMDNmOworCQl9CisJCWVsc2UgeworCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4KKwkJICAgcnYyNTA6IGNvdWxkIGJlIHVzZWQgdG8gY2xlYXIgb25seSBwYXJ0cyBvZiBtYWNyb3RpbGVzCisJCSAgIChidXQgdGhhdCB3b3VsZCBnZXQgcmVhbGx5IGNvbXBsaWNhdGVkLi4uKT8KKwkJICAgYml0IDAgYW5kIDEgKGVpdGhlciBvciBib3RoIG9mIHRoZW0gPyE/ISkgYXJlIHVzZWQgdG8KKwkJICAgbm90IGNsZWFyIHRpbGUgKG9yIG1heWJlIG9uZSBvZiB0aGUgYml0cyBpbmRpY2F0ZXMgaWYgdGhlIHRpbGUgaXMKKwkJICAgY29tcHJlc3NlZCBvciBub3QpLCBiaXQgMiBhbmQgMyB0byBub3QgY2xlYXIgdGlsZSAxLC4uLiwuCisJCSAgIFBhdHRlcm4gaXMgYXMgZm9sbG93czoKKwkJICAgICAgICB8IDAsMSB8IDQsNSB8IDgsOSB8MTIsMTN8MTYsMTd8MjAsMjF8MjQsMjV8MjgsMjl8CisJCSAgIGJpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICAgICAgIHwgMiwzIHwgNiw3IHwxMCwxMXwxNCwxNXwxOCwxOXwyMiwyM3wyNiwyN3wzMCwzMXwKKwkJICAgcnYxMDA6IGNsZWFybWFzayBjb3ZlcnMgMng4IDR4MSB0aWxlcywgYnV0IG9uZSBjbGVhciBzdGlsbAorCQkgICBjb3ZlcnMgMjU2IHBpeGVscyA/IT8KKwkJKi8KKwkJCWNsZWFybWFzayA9IDB4MDsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDggKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX0RFUFRIQ0xFQVJWQUxVRSwKKwkJCXRlbXBSQjNEX0RFUFRIQ0xFQVJWQUxVRSk7CisJCS8qIHdoYXQgb2Zmc2V0IGlzIHRoaXMgZXhhY3RseSA/ICovCisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfWk1BU0tPRkZTRVQsIDAgKTsKKwkJLyogbmVlZCBjdGxzdGF0LCBvdGhlcndpc2UgZ2V0IHNvbWUgc3RyYW5nZSBibGFjayBmbGlja2VyaW5nICovCisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIFJBREVPTl9SQjNEX1pDX0ZMVVNIX0FMTCApOworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CisJCQlpbnQgdGlsZW9mZnNldCwgbnJ0aWxlc3gsIG5ydGlsZXN5LCBqOworCQkJLyogaXQgbG9va3MgbGlrZSByMjAwIG5lZWRzIHJ2LXN0eWxlIGNsZWFycywgYXQgbGVhc3QgaWYgaGllcnogaXMgbm90IGVuYWJsZWQ/ICovCisJCQlpZiAoKGRldl9wcml2LT5mbGFncyZDSElQX0hBU19ISUVSWikgJiYgIShkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApKSB7CisJCQkJLyogRklYTUUgOiBmaWd1cmUgdGhpcyBvdXQgZm9yIHIyMDAgKHdoZW4gaGllcnogaXMgZW5hYmxlZCkuIE9yCisJCQkJICAgbWF5YmUgcjIwMCBhY3R1YWxseSBkb2Vzbid0IG5lZWQgdG8gcHV0IHRoZSBsb3ctcmVzIHogdmFsdWUgaW50bworCQkJCSAgIHRoZSB0aWxlIGNhY2hlIGxpa2UgcjEwMCwgYnV0IGp1c3QgbmVlZHMgdG8gY2xlYXIgdGhlIGhpLWxldmVsIHotYnVmZmVyPworCQkJCSAgIFdvcmtzIGZvciBSMTAwLCBib3RoIHdpdGggaGllcnogYW5kIHdpdGhvdXQuCisJCQkJICAgUjEwMCBzZWVtcyB0byBvcGVyYXRlIG9uIDJ4MSA4eDggdGlsZXMsIGJ1dC4uLgorCQkJCSAgIG9kZDogb2Zmc2V0L25ydGlsZXMgbmVlZCB0byBiZSA2NCBwaXggKDQgYmxvY2spIGFsaWduZWQ/IFBvdGVudGlhbGx5CisJCQkJICAgcHJvYmxlbWF0aWMgd2l0aCByZXNvbHV0aW9ucyB3aGljaCBhcmUgbm90IDY0IHBpeCBhbGlnbmVkPyAqLworCQkJCXRpbGVvZmZzZXQgPSAoKHBib3hbaV0ueTEgPj4gMykgKiBkZXB0aHBpeHBlcmxpbmUgKyBwYm94W2ldLngxKSA+PiA2OworCQkJCW5ydGlsZXN4ID0gKChwYm94W2ldLngyICYgfjYzKSAtIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKKwkJCQlucnRpbGVzeSA9IChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CisJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CisJCQkJCUJFR0lOX1JJTkcoIDQgKTsKKwkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCS8qIGZpcnN0IHRpbGUgKi8KKwkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiA4ICk7CisJCQkJCS8qIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgKi8KKwkJCQkJT1VUX1JJTkcoIG5ydGlsZXN4ICsgNCApOworCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KKwkJCQkJT1VUX1JJTkcoIGNsZWFybWFzayApOworCQkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCQkJdGlsZW9mZnNldCArPSBkZXB0aHBpeHBlcmxpbmUgPj4gNjsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApIHsKKwkJCQkvKiB3b3JrcyBmb3IgcnYyNTAuICovCisJCQkJLyogZmluZCBmaXJzdCBtYWNybyB0aWxlICg4eDIgNHg0IHotcGl4ZWxzIG9uIHJ2MjUwKSAqLworCQkJCXRpbGVvZmZzZXQgPSAoKHBib3hbaV0ueTEgPj4gMykgKiBkZXB0aHBpeHBlcmxpbmUgKyBwYm94W2ldLngxKSA+PiA1OworCQkJCW5ydGlsZXN4ID0gKHBib3hbaV0ueDIgPj4gNSkgLSAocGJveFtpXS54MSA+PiA1KTsKKwkJCQlucnRpbGVzeSA9IChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CisJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CisJCQkJCUJFR0lOX1JJTkcoIDQgKTsKKwkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCS8qIGZpcnN0IHRpbGUgKi8KKwkJCQkJLyoganVkZ2luZyBieSB0aGUgZmlyc3QgdGlsZSBvZmZzZXQgbmVlZGVkLCBjb3VsZCBwb3NzaWJseQorCQkJCQkgICBkaXJlY3RseSBhZGRyZXNzL2NsZWFyIDR4NCB0aWxlcyBpbnN0ZWFkIG9mIDh4MiAqIDR4NAorCQkJCQkgICBtYWNybyB0aWxlcywgdGhvdWdoIHdvdWxkIHN0aWxsIG5lZWQgY2xlYXIgbWFzayBmb3IKKwkJCQkJICAgcmlnaHQvYm90dG9tIGlmIHRydWVseSA0eDQgZ3JhbnVsYXJpdHkgaXMgZGVzaXJlZCA/ICovCisJCQkJCU9VVF9SSU5HKCB0aWxlb2Zmc2V0ICogMTYgKTsKKwkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLworCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyAxICk7CisJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLworCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCUFEVkFOQ0VfUklORygpOworCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA1OworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeyAvKiBydiAxMDAgKi8KKwkJCQkvKiBydjEwMCBtaWdodCBub3QgbmVlZCA2NCBwaXggYWxpZ25tZW50LCB3aG8ga25vd3MgKi8KKwkJCQkvKiBvZmZzZXRzIGFyZSwgaG1tLCB3ZWlyZCAqLworCQkJCXRpbGVvZmZzZXQgPSAoKHBib3hbaV0ueTEgPj4gNCkgKiBkZXB0aHBpeHBlcmxpbmUgKyBwYm94W2ldLngxKSA+PiA2OworCQkJCW5ydGlsZXN4ID0gKChwYm94W2ldLngyICYgfjYzKSAtIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKKwkJCQlucnRpbGVzeSA9IChwYm94W2ldLnkyID4+IDQpIC0gKHBib3hbaV0ueTEgPj4gNCk7CisJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CisJCQkJCUJFR0lOX1JJTkcoIDQgKTsKKwkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCU9VVF9SSU5HKCB0aWxlb2Zmc2V0ICogMTI4ICk7CisJCQkJCS8qIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgKi8KKwkJCQkJT1VUX1JJTkcoIG5ydGlsZXN4ICsgNCApOworCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KKwkJCQkJT1VUX1JJTkcoIGNsZWFybWFzayApOworCQkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCQkJdGlsZW9mZnNldCArPSBkZXB0aHBpeHBlcmxpbmUgPj4gNjsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBUT0RPIGRvbid0IGFsd2F5cyBjbGVhciBhbGwgaGktbGV2ZWwgeiB0aWxlcyAqLworCQlpZiAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSEFTX0hJRVJaKSAmJiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPT1VQ09ERV9SMjAwKQorCQkJJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpCisJCS8qIHIxMDAgYW5kIGNhcmRzIHdpdGhvdXQgaGllcmFyY2hpY2FsIHotYnVmZmVyIGhhdmUgbm8gaGlnaC1sZXZlbCB6LWJ1ZmZlciAqLworCQkvKiBGSVhNRSA6IHRoZSBtYXNrIHN1cHBvc2VkbHkgY29udGFpbnMgbG93LXJlcyB6IHZhbHVlcy4gU28gY2FuJ3Qgc2V0CisJCSAgIGp1c3QgdG8gdGhlIG1heCAoMHhmZj8gb3IgYWN0dWFsbHkgMHgzZmZmPyksIG5lZWQgdG8gdGFrZSB6IGNsZWFyCisJCSAgIHZhbHVlIGludG8gYWNjb3VudD8gKi8KKwkJeworCQkJQkVHSU5fUklORyggNCApOworCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9ISVosIDIgKSApOworCQkJT1VUX1JJTkcoIDB4MCApOyAvKiBGaXJzdCB0aWxlICovCisJCQlPVVRfUklORyggMHgzY2MwICk7CisJCQlPVVRfUklORyggKDB4ZmY8PDIyKXwoMHhmZjw8Nil8IDB4MDAzZjAwM2YpOworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9CisKKwkvKiBXZSBoYXZlIHRvIGNsZWFyIHRoZSBkZXB0aCBhbmQvb3Igc3RlbmNpbCBidWZmZXJzIGJ5CisJICogcmVuZGVyaW5nIGEgcXVhZCBpbnRvIGp1c3QgdGhvc2UgYnVmZmVycy4gIFRodXMsIHdlIGhhdmUgdG8KKwkgKiBtYWtlIHN1cmUgdGhlIDNEIGVuZ2luZSBpcyBjb25maWd1cmVkIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAoKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMjAwKSAmJgorCSAgICAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSkgeworCisJCWludCB0ZW1wUFBfQ05UTDsKKwkJaW50IHRlbXBSRV9DTlRMOworCQlpbnQgdGVtcFJCM0RfQ05UTDsKKwkJaW50IHRlbXBSQjNEX1pTVEVOQ0lMQ05UTDsKKwkJaW50IHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLOworCQlpbnQgdGVtcFJCM0RfUExBTkVNQVNLOworCQlpbnQgdGVtcFNFX0NOVEw7CisJCWludCB0ZW1wU0VfVlRFX0NOVEw7CisJCWludCB0ZW1wU0VfVlRYX0ZNVF8wOworCQlpbnQgdGVtcFNFX1ZUWF9GTVRfMTsKKwkJaW50IHRlbXBTRV9WQVBfQ05UTDsKKwkJaW50IHRlbXBSRV9BVVhfU0NJU1NPUl9DTlRMOworCisJCXRlbXBQUF9DTlRMID0gMDsKKwkJdGVtcFJFX0NOVEwgPSAwOworCisJCXRlbXBSQjNEX0NOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF9jbnRsOworCisJCXRlbXBSQjNEX1pTVEVOQ0lMQ05UTCA9IGRlcHRoX2NsZWFyLT5yYjNkX3pzdGVuY2lsY250bDsKKwkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSAweDA7CisKKwkJdGVtcFNFX0NOVEwgPSBkZXB0aF9jbGVhci0+c2VfY250bDsKKworCisKKwkJLyogRGlzYWJsZSBUQ0wgKi8KKworCQl0ZW1wU0VfVkFQX0NOVEwgPSAoLyogU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgfCAgKi8KKwkJCQkgICAoMHg5IDw8IFNFX1ZBUF9DTlRMX19WRl9NQVhfVlRYX05VTV9fU0hJRlQpKTsKKworCQl0ZW1wUkIzRF9QTEFORU1BU0sgPSAweDA7CisKKwkJdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgPSAweDA7CisKKwkJdGVtcFNFX1ZURV9DTlRMID0KKwkJCVNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgfAorCQkJU0VfVlRFX0NOVExfX1ZUWF9aX0ZNVF9NQVNLOworCisJCS8qIFZlcnRleCBmb3JtYXQgKFgsIFksIFosIFcpKi8KKwkJdGVtcFNFX1ZUWF9GTVRfMCA9CisJCQlTRV9WVFhfRk1UXzBfX1ZUWF9aMF9QUkVTRU5UX01BU0sgfAorCQkJU0VfVlRYX0ZNVF8wX19WVFhfVzBfUFJFU0VOVF9NQVNLOworCQl0ZW1wU0VfVlRYX0ZNVF8xID0gMHgwOworCisKKwkJLyogCisJCSAqIERlcHRoIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzIAorCQkgKi8KKwkJaWYgKGZsYWdzICYgUkFERU9OX0RFUFRIKSB7CisJCQkvKiBFbmFibGUgZGVwdGggYnVmZmVyICovCisJCQl0ZW1wUkIzRF9DTlRMIHw9IFJBREVPTl9aX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCS8qIERpc2FibGUgZGVwdGggYnVmZmVyICovCisJCQl0ZW1wUkIzRF9DTlRMICY9IH5SQURFT05fWl9FTkFCTEU7CisJCX0KKworCQkvKiAKKwkJICogU3RlbmNpbCBidWZmZXIgc3BlY2lmaWMgZW5hYmxlcworCQkgKi8KKwkJaWYgKCBmbGFncyAmIFJBREVPTl9TVEVOQ0lMICkgeworCQkJdGVtcFJCM0RfQ05UTCB8PSAgUkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSBjbGVhci0+ZGVwdGhfbWFzazsgCisJCX0gZWxzZSB7CisJCQl0ZW1wUkIzRF9DTlRMICY9IH5SQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IDB4MDAwMDAwMDA7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRSB8CisJCQkJUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CisJCX0KKwkJaWYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CisJCX0KKworCQlCRUdJTl9SSU5HKCAyNiApOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUFBfQ05UTCwgdGVtcFBQX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1JFX0NOVEwsIHRlbXBSRV9DTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfQ05UTCwgdGVtcFJCM0RfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTCwKKwkJCSAgICAgIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAKKwkJCSAgICAgIHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfUExBTkVNQVNLLCB0ZW1wUkIzRF9QTEFORU1BU0sgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fU0VfQ05UTCwgdGVtcFNFX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZURV9DTlRMLCB0ZW1wU0VfVlRFX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZUWF9GTVRfMCwgdGVtcFNFX1ZUWF9GTVRfMCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVlRYX0ZNVF8xLCB0ZW1wU0VfVlRYX0ZNVF8xICk7CisJCU9VVF9SSU5HX1JFRyggUjIwMF9TRV9WQVBfQ05UTCwgdGVtcFNFX1ZBUF9DTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCAKKwkJCSAgICAgIHRlbXBSRV9BVVhfU0NJU1NPUl9DTlRMICk7CisJCUFEVkFOQ0VfUklORygpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJCSAqLworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQkJCisJCQkvKiBGdW5ueSB0aGF0IHRoaXMgc2hvdWxkIGJlIHJlcXVpcmVkIC0tIAorCQkJICogIHNldHMgdG9wLWxlZnQ/CisJCQkgKi8KKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCSAgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKworCQkJQkVHSU5fUklORyggMTQgKTsKKwkJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSMjAwXzNEX0RSQVdfSU1NRF8yLCAxMiApICk7CisJCQlPVVRfUklORyggKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKKwkJCQkgICBSQURFT05fUFJJTV9XQUxLX1JJTkcgfAorCQkJCSAgICgzIDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpKSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4M2Y4MDAwMDAgKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDNmODAwMDAwICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgzZjgwMDAwMCApOworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9IAorCWVsc2UgaWYgKCAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSApIHsKKworCQlpbnQgdGVtcFJCM0RfWlNURU5DSUxDTlRMID0gZGVwdGhfY2xlYXItPnJiM2RfenN0ZW5jaWxjbnRsOworCisJCXJiM2RfY250bCA9IGRlcHRoX2NsZWFyLT5yYjNkX2NudGw7CisKKwkJaWYgKCBmbGFncyAmIFJBREVPTl9ERVBUSCApIHsKKwkJCXJiM2RfY250bCB8PSAgUkFERU9OX1pfRU5BQkxFOworCQl9IGVsc2UgeworCQkJcmIzZF9jbnRsICY9IH5SQURFT05fWl9FTkFCTEU7CisJCX0KKworCQlpZiAoIGZsYWdzICYgUkFERU9OX1NURU5DSUwgKSB7CisJCQlyYjNkX2NudGwgfD0gIFJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKKwkJCXJiM2Rfc3RlbmNpbHJlZm1hc2sgPSBjbGVhci0+ZGVwdGhfbWFzazsgLyogbWlzbmFtZWQgZmllbGQgKi8KKwkJfSBlbHNlIHsKKwkJCXJiM2RfY250bCAmPSB+UkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJcmIzZF9zdGVuY2lscmVmbWFzayA9IDB4MDAwMDAwMDA7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRSB8CisJCQkJUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CisJCX0KKwkJaWYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CisJCX0KKworCQlCRUdJTl9SSU5HKCAxMyApOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9DTlRMLCAxICkgKTsKKwkJT1VUX1JJTkcoIDB4MDAwMDAwMDAgKTsKKwkJT1VUX1JJTkcoIHJiM2RfY250bCApOworCQkKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLAorCQkJICAgICAgcmIzZF9zdGVuY2lscmVmbWFzayApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1BMQU5FTUFTSywKKwkJCSAgICAgIDB4MDAwMDAwMDAgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fU0VfQ05UTCwKKwkJCSAgICAgIGRlcHRoX2NsZWFyLT5zZV9jbnRsICk7CisJCUFEVkFOQ0VfUklORygpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJCSAqLworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQkJCisJCQkvKiBGdW5ueSB0aGF0IHRoaXMgc2hvdWxkIGJlIHJlcXVpcmVkIC0tIAorCQkJICogIHNldHMgdG9wLWxlZnQ/CisJCQkgKi8KKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCSAgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKworCQkJQkVHSU5fUklORyggMTUgKTsKKworCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9EUkFXX0lNTUQsIDEzICkgKTsKKwkJCU9VVF9SSU5HKCBSQURFT05fVlRYX1pfUFJFU0VOVCB8CisJCQkJICBSQURFT05fVlRYX1BLQ09MT1JfUFJFU0VOVCk7CisJCQlPVVRfUklORyggKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKKwkJCQkgICBSQURFT05fUFJJTV9XQUxLX1JJTkcgfAorCQkJCSAgIFJBREVPTl9NQU9TX0VOQUJMRSB8CisJCQkJICAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkJCSAgICgzIDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpKSApOworCisKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMV0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDAgKTsKKworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4MCApOworCisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgwICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisJfQorCisJLyogSW5jcmVtZW50IHRoZSBjbGVhciBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CisJICogd2FpdCBvbiB0aGlzIHZhbHVlIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBjbGVhciBpb2N0bC4gIFdlCisJICogbmVlZCB0aGlzIGJlY2F1c2UgdGhlIGNhcmQncyBzbyBkYW1uZWQgZmFzdC4uLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKys7CisKKwlCRUdJTl9SSU5HKCA0ICk7CisKKwlSQURFT05fQ0xFQVJfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhciApOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3dhcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKQorCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoIGRldl9wcml2ICk7CisKKworCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlIGJpdGJsdC4KKwkgKiBUaGlzIHdpbGwgcHJldmVudCBkYXRhIGNvcnJ1cHRpb24gYmV0d2VlbiB0aGUgdHdvIHN0cmVhbXMuCisJICovCisJQkVHSU5fUklORyggMiApOworCisJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQlpbnQgeCA9IHBib3hbaV0ueDE7CisJCWludCB5ID0gcGJveFtpXS55MTsKKwkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKKwkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKKworCQlEUk1fREVCVUcoICJkaXNwYXRjaCBzd2FwICVkLCVkLSVkLCVkXG4iLAorCQkJICAgeCwgeSwgdywgaCApOworCisJCUJFR0lOX1JJTkcoIDcgKTsKKworCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfQklUQkxUX01VTFRJLCA1ICkgKTsKKwkJT1VUX1JJTkcoIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSQURFT05fR01DX0JSVVNIX05PTkUgfAorCQkJICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8CisJCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSAgUkFERU9OX1JPUDNfUyB8CisJCQkgIFJBREVPTl9EUF9TUkNfU09VUkNFX01FTU9SWSB8CisJCQkgIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgIFJBREVPTl9HTUNfV1JfTVNLX0RJUyApOworCQkKKwkJLyogTWFrZSB0aGlzIHdvcmsgZXZlbiBpZiBmcm9udCAmIGJhY2sgYXJlIGZsaXBwZWQ6CisJCSAqLworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOworCQl9IAorCQllbHNlIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCX0KKworCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCUFEVkFOQ0VfUklORygpOworCX0KKworCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAorCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CisKKwlCRUdJTl9SSU5HKCA0ICk7CisKKwlSQURFT05fRlJBTUVfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3NhcmVhX3QgKnNhcmVhID0gKGRybV9zYXJlYV90ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CisJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEpCisJCSAgID8gZGV2X3ByaXYtPmZyb250X29mZnNldCA6IGRldl9wcml2LT5iYWNrX29mZnNldDsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKKwkJX19GVU5DVElPTl9fLCAKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UpOworCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKSB7CisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX0ZMSVA7CisJCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGZyYW1lIG9mZnNldHMgZm9yIGJvdGggQ1JUQ3MKKwkgKi8KKwlCRUdJTl9SSU5HKCA2ICk7CisKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fQ1JUQ19PRkZTRVQsICggKCBzYXJlYS0+ZnJhbWUueSAqIGRldl9wcml2LT5mcm9udF9waXRjaAorCQkJCQkgICAgICArIHNhcmVhLT5mcmFtZS54IAorCQkJCQkgICAgICAqICggZGV2X3ByaXYtPmNvbG9yX2ZtdCAtIDIgKSApICYgfjcgKQorCQkJCQkgICsgb2Zmc2V0ICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fQ1JUQzJfT0ZGU0VULCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3J0YzJfYmFzZQorCQkJCQkgICArIG9mZnNldCApOworCisJQURWQU5DRV9SSU5HKCk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9CisJCQkJCSAgICAgIDEgLSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJQkVHSU5fUklORyggMiApOworCisJUkFERU9OX0ZSQU1FX0FHRSggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgaW50IGJhZF9wcmltX3ZlcnRleF9uciggaW50IHByaW1pdGl2ZSwgaW50IG5yICkKK3sKKwlzd2l0Y2ggKHByaW1pdGl2ZSAmIFJBREVPTl9QUklNX1RZUEVfTUFTSykgeworCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9OT05FOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9QT0lOVDoKKwkJcmV0dXJuIG5yIDwgMTsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfTElORToKKwkJcmV0dXJuIChuciAmIDEpIHx8IG5yID09IDA7CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX0xJTkVfU1RSSVA6CisJCXJldHVybiBuciA8IDI7CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX1RSSV9MSVNUOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV8zVlJUX1BPSU5UX0xJU1Q6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1Q6CisJCXJldHVybiBuciAlIDMgfHwgbnIgPT0gMDsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX0ZBTjoKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX1NUUklQOgorCQlyZXR1cm4gbnIgPCAzOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0JCit9CisKKworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBmaW5pc2g7CisJdW5zaWduZWQgaW50IHByaW07CisJdW5zaWduZWQgaW50IG51bXZlcnRzOworCXVuc2lnbmVkIGludCBvZmZzZXQ7ICAgCisgICAgICAgIHVuc2lnbmVkIGludCB2Y19mb3JtYXQ7Cit9IGRybV9yYWRlb25fdGNsX3ByaW1fdDsKKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIGRybV9idWZfdCAqYnVmLAorCQkJCSAgICAgICBkcm1fcmFkZW9uX3RjbF9wcmltX3QgKnByaW0gKQorCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBidWYtPm9mZnNldCArIHByaW0tPnN0YXJ0OworCWludCBudW12ZXJ0cyA9IChpbnQpcHJpbS0+bnVtdmVydHM7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWludCBpID0gMDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiaHdwcmltIDB4JXggdmZtdCAweCV4ICVkLi4lZCAlZCB2ZXJ0c1xuIiwKKwkJICBwcmltLT5wcmltLAorCQkgIHByaW0tPnZjX2Zvcm1hdCwKKwkJICBwcmltLT5zdGFydCwKKwkJICBwcmltLT5maW5pc2gsCisJCSAgcHJpbS0+bnVtdmVydHMpOworCisJaWYgKGJhZF9wcmltX3ZlcnRleF9uciggcHJpbS0+cHJpbSwgcHJpbS0+bnVtdmVydHMgKSkgeworCQlEUk1fRVJST1IoICJiYWQgcHJpbSAleCBudW12ZXJ0cyAlZFxuIiwgCisJCQkgICBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyApOworCQlyZXR1cm47CisJfQorCisJZG8geworCQkvKiBFbWl0IHRoZSBuZXh0IGNsaXByZWN0ICovCisJCWlmICggaSA8IG5ib3ggKSB7CisJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LCAKKwkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCQl9CisKKwkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciByZW5kZXJpbmcgY29tbWFuZHMgKi8KKwkJQkVHSU5fUklORyggNSApOworCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzICkgKTsKKwkJT1VUX1JJTkcoIG9mZnNldCApOworCQlPVVRfUklORyggbnVtdmVydHMgKTsKKwkJT1VUX1JJTkcoIHByaW0tPnZjX2Zvcm1hdCApOworCQlPVVRfUklORyggcHJpbS0+cHJpbSB8IFJBREVPTl9QUklNX1dBTEtfTElTVCB8CisJCQkgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKKwkJCSAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkJICAobnVtdmVydHMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlpKys7CisJfSB3aGlsZSAoIGkgPCBuYm94ICk7Cit9CisKKworCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCWJ1Zl9wcml2LT5hZ2UgPSArK2Rldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoOworCisJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisJUkFERU9OX0RJU1BBVENIX0FHRSggYnVmX3ByaXYtPmFnZSApOworCUFEVkFOQ0VfUklORygpOworCisJYnVmLT5wZW5kaW5nID0gMTsKKwlidWYtPnVzZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgZHJtX2J1Zl90ICpidWYsCisJCQkJCSBpbnQgc3RhcnQsIGludCBlbmQgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiaW5kaXJlY3Q6IGJ1Zj0lZCBzPTB4JXggZT0weCV4XG4iLAorCQkgICBidWYtPmlkeCwgc3RhcnQsIGVuZCApOworCisJaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQKKwkJCSAgICAgICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCWludCBkd29yZHMgPSAoZW5kIC0gc3RhcnQgKyAzKSAvIHNpemVvZih1MzIpOworCisJCS8qIEluZGlyZWN0IGJ1ZmZlciBkYXRhIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YKKwkJICogZHdvcmRzLCBzbyBpZiB3ZSd2ZSBiZWVuIGdpdmVuIGFuIG9kZCBudW1iZXIgd2UgbXVzdAorCQkgKiBwYWQgdGhlIGRhdGEgd2l0aCBhIFR5cGUtMiBDUCBwYWNrZXQuCisJCSAqLworCQlpZiAoIGR3b3JkcyAmIDEgKSB7CisJCQl1MzIgKmRhdGEgPSAodTMyICopCisJCQkJKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCisJCQkJICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCQlkYXRhW2R3b3JkcysrXSA9IFJBREVPTl9DUF9QQUNLRVQyOworCQl9CisKKwkJLyogRmlyZSBvZmYgdGhlIGluZGlyZWN0IGJ1ZmZlciAqLworCQlCRUdJTl9SSU5HKCAzICk7CisKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUF9JQl9CQVNFLCAxICkgKTsKKwkJT1VUX1JJTkcoIG9mZnNldCApOworCQlPVVRfUklORyggZHdvcmRzICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJZHJtX2J1Zl90ICplbHRfYnVmLAorCQkJCQlkcm1fcmFkZW9uX3RjbF9wcmltX3QgKnByaW0gKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG9mZnNldCA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ICsgcHJpbS0+b2Zmc2V0OworCXUzMiAqZGF0YTsKKwlpbnQgZHdvcmRzOworCWludCBpID0gMDsKKwlpbnQgc3RhcnQgPSBwcmltLT5zdGFydCArIFJBREVPTl9JTkRFWF9QUklNX09GRlNFVDsKKwlpbnQgY291bnQgPSAocHJpbS0+ZmluaXNoIC0gc3RhcnQpIC8gc2l6ZW9mKHUxNik7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCisJRFJNX0RFQlVHKCJod3ByaW0gMHgleCB2Zm10IDB4JXggJWQuLiVkIG9mZnNldDogJXggbnIgJWRcbiIsCisJCSAgcHJpbS0+cHJpbSwKKwkJICBwcmltLT52Y19mb3JtYXQsCisJCSAgcHJpbS0+c3RhcnQsCisJCSAgcHJpbS0+ZmluaXNoLAorCQkgIHByaW0tPm9mZnNldCwKKwkJICBwcmltLT5udW12ZXJ0cyk7CisKKwlpZiAoYmFkX3ByaW1fdmVydGV4X25yKCBwcmltLT5wcmltLCBjb3VudCApKSB7CisJCURSTV9FUlJPUiggImJhZCBwcmltICV4IGNvdW50ICVkXG4iLCAKKwkJCSAgIHByaW0tPnByaW0sIGNvdW50ICk7CisJCXJldHVybjsKKwl9CisKKworCWlmICggc3RhcnQgPj0gcHJpbS0+ZmluaXNoIHx8CisJICAgICAocHJpbS0+c3RhcnQgJiAweDcpICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgcHJpbS0+cHJpbSApOworCQlyZXR1cm47CisJfQorCisJZHdvcmRzID0gKHByaW0tPmZpbmlzaCAtIHByaW0tPnN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKKworCWRhdGEgPSAodTMyICopKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsKKwkJICAgICAgIGVsdF9idWYtPm9mZnNldCArIHByaW0tPnN0YXJ0KTsKKworCWRhdGFbMF0gPSBDUF9QQUNLRVQzKCBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCBkd29yZHMtMiApOworCWRhdGFbMV0gPSBvZmZzZXQ7CisJZGF0YVsyXSA9IHByaW0tPm51bXZlcnRzOworCWRhdGFbM10gPSBwcmltLT52Y19mb3JtYXQ7CisJZGF0YVs0XSA9IChwcmltLT5wcmltIHwKKwkJICAgUkFERU9OX1BSSU1fV0FMS19JTkQgfAorCQkgICBSQURFT05fQ09MT1JfT1JERVJfUkdCQSB8CisJCSAgIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFIHwKKwkJICAgKGNvdW50IDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpICk7CisKKwlkbyB7CisJCWlmICggaSA8IG5ib3ggKSAKKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsIAorCQkJCQkgICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGVsdF9idWYsCisJCQkJCSAgICAgcHJpbS0+c3RhcnQsCisJCQkJCSAgICAgcHJpbS0+ZmluaXNoICk7CisKKwkJaSsrOworCX0gd2hpbGUgKCBpIDwgbmJveCApOworCit9CisKKyNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgKFJBREVPTl9CVUZGRVJfU0laRSAtIDggKiBzaXplb2YodTMyKSkKKworc3RhdGljIGludCByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZSggRFJNRklMRSBmaWxwLAorCQkJCSAgICAgICBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgZHJtX3JhZGVvbl90ZXh0dXJlX3QgKnRleCwKKwkJCQkgICAgICAgZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCAqaW1hZ2UgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCWRybV9idWZfdCAqYnVmOworCXUzMiBmb3JtYXQ7CisJdTMyICpidWZmZXI7CisJY29uc3QgdTggX191c2VyICpkYXRhOworCWludCBzaXplLCBkd29yZHMsIHRleF93aWR0aCwgYmxpdF93aWR0aDsKKwl1MzIgaGVpZ2h0OworCWludCBpOworCXUzMiB0ZXhwaXRjaCwgbWljcm90aWxlOworCVJJTkdfTE9DQUxTOworCisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKworCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsICZ0ZXgtPm9mZnNldCApICkgeworCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlc3RpbmF0aW9uIG9mZnNldFxuIiApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEOworCisJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlLiAgVGhpcyBlbnN1cmVzIG5vIHBpeGVsIGRhdGEgZ2V0cyBtaXhlZAorCSAqIHVwIHdpdGggdGhlIHRleHR1cmUgZGF0YSBmcm9tIHRoZSBob3N0IGRhdGEgYmxpdCwgb3RoZXJ3aXNlCisJICogcGFydCBvZiB0aGUgdGV4dHVyZSBpbWFnZSBtYXkgYmUgY29ycnVwdGVkLgorCSAqLworCUJFR0lOX1JJTkcoIDQgKTsKKwlSQURFT05fRkxVU0hfQ0FDSEUoKTsKKwlSQURFT05fV0FJVF9VTlRJTF9JRExFKCk7CisJQURWQU5DRV9SSU5HKCk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkvKiBUaGUgTWVzYSB0ZXh0dXJlIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBkYXRhIGluIGxpdHRsZSBlbmRpYW4gYXMgdGhlCisJICogY2hpcCB3YW50cyBpdCwgYnV0IHdlIG5lZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgQ1AKKwkgKiByaW5nIGdldHMgYnl0ZS1zd2FwcGVkCisJICovCisJQkVHSU5fUklORyggMiApOworCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCQk1fR1VJQ05UTCwgUkFERU9OX0hPU1RfREFUQV9TV0FQXzMyQklUICk7CisJQURWQU5DRV9SSU5HKCk7CisjZW5kaWYKKworCisJLyogVGhlIGNvbXBpbGVyIHdvbid0IG9wdGltaXplIGF3YXkgYSBkaXZpc2lvbiBieSBhIHZhcmlhYmxlLAorCSAqIGV2ZW4gaWYgdGhlIG9ubHkgbGVnYWwgdmFsdWVzIGFyZSBwb3dlcnMgb2YgdHdvLiAgVGh1cywgd2UnbGwKKwkgKiB1c2UgYSBzaGlmdCBpbnN0ZWFkLgorCSAqLworCXN3aXRjaCAoIHRleC0+Zm9ybWF0ICkgeworCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I4ODg4OgorCWNhc2UgUkFERU9OX1RYRk9STUFUX1JHQkE4ODg4OgorCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OworCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogNDsKKwkJYmxpdF93aWR0aCA9IGltYWdlLT53aWR0aCAqIDQ7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1RYRk9STUFUX0FJODg6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjE1NTU6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCNTY1OgorCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I0NDQ0OgorCWNhc2UgUkFERU9OX1RYRk9STUFUX1ZZVVk0MjI6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfWVZZVTQyMjoKKwkJZm9ybWF0ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9SR0I1NjU7CisJCXRleF93aWR0aCA9IHRleC0+d2lkdGggKiAyOworCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogMjsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fVFhGT1JNQVRfSTg6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCMzMyOgorCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0NJODsKKwkJdGV4X3dpZHRoID0gdGV4LT53aWR0aCAqIDE7CisJCWJsaXRfd2lkdGggPSBpbWFnZS0+d2lkdGggKiAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoICJpbnZhbGlkIHRleHR1cmUgZm9ybWF0ICVkXG4iLCB0ZXgtPmZvcm1hdCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwl0ZXhwaXRjaCA9IHRleC0+cGl0Y2g7CisJaWYgKCh0ZXhwaXRjaCA8PCAyMikgJiBSQURFT05fRFNUX1RJTEVfTUlDUk8pIHsKKwkJbWljcm90aWxlID0gMTsKKwkJaWYgKHRleF93aWR0aCA8IDY0KSB7CisJCQl0ZXhwaXRjaCAmPSB+KFJBREVPTl9EU1RfVElMRV9NSUNSTyA+PiAyMik7CisJCQkvKiB3ZSBnb3QgdGlsZWQgY29vcmRpbmF0ZXMsIHVudGlsZSB0aGVtICovCisJCQlpbWFnZS0+eCAqPSAyOworCQl9CisJfQorCWVsc2UgbWljcm90aWxlID0gMDsKKworCURSTV9ERUJVRygidGV4PSVkeCVkIGJsaXQ9JWRcbiIsIHRleF93aWR0aCwgdGV4LT5oZWlnaHQsIGJsaXRfd2lkdGggKTsKKworCWRvIHsKKwkJRFJNX0RFQlVHKCAidGV4OiBvZnM9MHgleCBwPSVkIGY9JWQgeD0laGQgeT0laGQgdz0laGQgaD0laGRcbiIsCisJCQkgICB0ZXgtPm9mZnNldCA+PiAxMCwgdGV4LT5waXRjaCwgdGV4LT5mb3JtYXQsCisJCQkgICBpbWFnZS0+eCwgaW1hZ2UtPnksIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCApOworCisJCS8qIE1ha2UgYSBjb3B5IG9mIHNvbWUgcGFyYW1ldGVycyBpbiBjYXNlIHdlIGhhdmUgdG8KKwkJICogdXBkYXRlIHRoZW0gZm9yIGEgbXVsdGktcGFzcyB0ZXh0dXJlIGJsaXQuCisJCSAqLworCQloZWlnaHQgPSBpbWFnZS0+aGVpZ2h0OworCQlkYXRhID0gKGNvbnN0IHU4IF9fdXNlciAqKWltYWdlLT5kYXRhOworCQkKKwkJc2l6ZSA9IGhlaWdodCAqIGJsaXRfd2lkdGg7CisKKwkJaWYgKCBzaXplID4gUkFERU9OX01BWF9URVhUVVJFX1NJWkUgKSB7CisJCQloZWlnaHQgPSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSAvIGJsaXRfd2lkdGg7CisJCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKKwkJfSBlbHNlIGlmICggc2l6ZSA8IDQgJiYgc2l6ZSA+IDAgKSB7CisJCQlzaXplID0gNDsKKwkJfSBlbHNlIGlmICggc2l6ZSA9PSAwICkgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KCBkZXYgKTsKKwkJaWYgKCAwICYmICFidWYgKSB7CisJCQlyYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKKwkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoIGRldiApOworCQl9CisJCWlmICggIWJ1ZiApIHsKKwkJCURSTV9ERUJVRygicmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmU6IEVBR0FJTlxuIik7CisJCQlpZiAoRFJNX0NPUFlfVE9fVVNFUiggdGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpICkpCisJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCXJldHVybiBEUk1fRVJSKEVBR0FJTik7CisJCX0KKworCisJCS8qIERpc3BhdGNoIHRoZSBpbmRpcmVjdCBidWZmZXIuCisJCSAqLworCQlidWZmZXIgPSAodTMyKikoKGNoYXIqKWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSArIGJ1Zi0+b2Zmc2V0KTsKKwkJZHdvcmRzID0gc2l6ZSAvIDQ7CisJCWJ1ZmZlclswXSA9IENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX0hPU1REQVRBX0JMVCwgZHdvcmRzICsgNiApOworCQlidWZmZXJbMV0gPSAoUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICAgICBSQURFT05fR01DX0JSVVNIX05PTkUgfAorCQkJICAgICAoZm9ybWF0IDw8IDgpIHwKKwkJCSAgICAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICAgICBSQURFT05fUk9QM19TIHwKKwkJCSAgICAgUkFERU9OX0RQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBIHwKKwkJCSAgICAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCSAgICAgUkFERU9OX0dNQ19XUl9NU0tfRElTKTsKKwkJCisJCWJ1ZmZlclsyXSA9ICh0ZXhwaXRjaCA8PCAyMikgfCAodGV4LT5vZmZzZXQgPj4gMTApOworCQlidWZmZXJbM10gPSAweGZmZmZmZmZmOworCQlidWZmZXJbNF0gPSAweGZmZmZmZmZmOworCQlidWZmZXJbNV0gPSAoaW1hZ2UtPnkgPDwgMTYpIHwgaW1hZ2UtPng7CisJCWJ1ZmZlcls2XSA9IChoZWlnaHQgPDwgMTYpIHwgaW1hZ2UtPndpZHRoOworCQlidWZmZXJbN10gPSBkd29yZHM7CisJCWJ1ZmZlciArPSA4OworCisJCQorCisJCWlmIChtaWNyb3RpbGUpIHsKKwkJCS8qIHRleHR1cmUgbWljcm8gdGlsaW5nIGluIHVzZSwgbWluaW11bSB0ZXh0dXJlIHdpZHRoIGlzIHRodXMgMTYgYnl0ZXMuCisJCQkgICBob3dldmVyLCB3ZSBjYW5ub3QgdXNlIGJsaXR0ZXIgZGlyZWN0bHkgZm9yIHRleHR1cmUgd2lkdGggPCA2NCBieXRlcywKKwkJCSAgIHNpbmNlIG1pbmltdW0gdGV4IHBpdGNoIGlzIDY0IGJ5dGVzIGFuZCB3ZSBuZWVkIHRoaXMgdG8gbWF0Y2gKKwkJCSAgIHRoZSB0ZXh0dXJlIHdpZHRoLCBvdGhlcndpc2UgdGhlIGJsaXR0ZXIgd2lsbCB0aWxlIGl0IHdyb25nLgorCQkJICAgVGh1cywgdGlsaW5nIG1hbnVhbGx5IGluIHRoaXMgY2FzZS4gQWRkaXRpb25hbGx5LCBuZWVkIHRvIHNwZWNpYWwKKwkJCSAgIGNhc2UgdGV4IGhlaWdodCA9IDEsIHNpbmNlIG91ciBhY3R1YWwgaW1hZ2Ugd2lsbCBoYXZlIGhlaWdodCAyCisJCQkgICBhbmQgd2UgbmVlZCB0byBlbnN1cmUgd2UgZG9uJ3QgcmVhZCBiZXlvbmQgdGhlIHRleHR1cmUgc2l6ZQorCQkJICAgZnJvbSB1c2VyIHNwYWNlLiAqLworCQkJaWYgKHRleC0+aGVpZ2h0ID09IDEpIHsKKwkJCQlpZiAodGV4X3dpZHRoID49IDY0IHx8IHRleF93aWR0aCA8PSAxNikgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKKwkJCQkJCQkgICAgICAgdGV4X3dpZHRoICogc2l6ZW9mKHUzMikpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA9PSAzMikgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyA4LCBkYXRhICsgMTYsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoID09IDE2KSB7CisJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCisJCQkJCQkgICAgICAgZHdvcmRzICogc2l6ZW9mKHUzMikpKSB7CisJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIGRhdGEsICVkIGR3b3Jkc1xuIiwKKwkJCQkJCSAgZHdvcmRzKTsKKwkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA8IDE2KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHRleC0+aGVpZ2h0OyBpKyspIHsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsIHRleF93aWR0aCkpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlidWZmZXIgKz0gNDsKKwkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CisJCQkJfQorCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPT0gMzIpIHsKKwkJCQkvKiBUT0RPOiBtYWtlIHN1cmUgdGhpcyB3b3JrcyB3aGVuIG5vdCBmaXR0aW5nIGluIG9uZSBidWZmZXIKKwkJCQkgICAoaS5lLiAzMmJ5dGVzIHggMjA0OC4uLikgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkgKz0gMikgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJZGF0YSArPSAxNjsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyA4LCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlkYXRhICs9IDE2OworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDQsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWRhdGEgKz0gMTY7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyICsgMTIsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWRhdGEgKz0gMTY7CisJCQkJCWJ1ZmZlciArPSAxNjsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodGV4X3dpZHRoID49IDMyKSB7CisJCQkJLyogVGV4dHVyZSBpbWFnZSB3aWR0aCBpcyBsYXJnZXIgdGhhbiB0aGUgbWluaW11bSwgc28gd2UKKwkJCQkgKiBjYW4gdXBsb2FkIGl0IGRpcmVjdGx5LgorCQkJCSAqLworCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAorCQkJCQkJICAgICAgIGR3b3JkcyAqIHNpemVvZih1MzIpKSkgeworCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBkYXRhLCAlZCBkd29yZHNcbiIsCisJCQkJCQkgIGR3b3Jkcyk7CisJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSwgc28gd2UKKwkJCQkgKiBuZWVkIHRvIHBhZCBvdXQgZWFjaCBpbWFnZSBzY2FubGluZSB0byB0aGUgbWluaW11bQorCQkJCSAqIHdpZHRoLgorCQkJCSAqLworCQkJCWZvciAoaSA9IDAgOyBpIDwgdGV4LT5oZWlnaHQgOyBpKyspIHsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsIHRleF93aWR0aCApKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLCB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlidWZmZXIgKz0gODsKKwkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYnVmLT5maWxwID0gZmlscDsKKwkJYnVmLT51c2VkID0gKGR3b3JkcyArIDgpICogc2l6ZW9mKHUzMik7CisJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIDAsIGJ1Zi0+dXNlZCApOworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisKKwkJLyogVXBkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBuZXh0IHRpbWUgKi8KKwkJaW1hZ2UtPnkgKz0gaGVpZ2h0OworCQlpbWFnZS0+aGVpZ2h0IC09IGhlaWdodDsKKwkJaW1hZ2UtPmRhdGEgPSAoY29uc3QgdTggX191c2VyICopaW1hZ2UtPmRhdGEgKyBzaXplOworCX0gd2hpbGUgKGltYWdlLT5oZWlnaHQgPiAwKTsKKworCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSBhZnRlciB0aGUgYmxpdCBjb21wbGV0ZXMuICBUaGlzIGVuc3VyZXMKKwkgKiB0aGUgdGV4dHVyZSBkYXRhIGlzIHdyaXR0ZW4gb3V0IHRvIG1lbW9yeSBiZWZvcmUgcmVuZGVyaW5nCisJICogY29udGludWVzLgorCSAqLworCUJFR0lOX1JJTkcoIDQgKTsKKwlSQURFT05fRkxVU0hfQ0FDSEUoKTsKKwlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisJQURWQU5DRV9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoIGRybV9kZXZpY2VfdCAqZGV2LCB1MzIgKnN0aXBwbGUgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlCRUdJTl9SSU5HKCAzNSApOworCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9TVElQUExFX0FERFIsIDAgKSApOworCU9VVF9SSU5HKCAweDAwMDAwMDAwICk7CisKKwlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1JFX1NUSVBQTEVfREFUQSwgMzEgKSApOworCWZvciAoIGkgPSAwIDsgaSA8IDMyIDsgaSsrICkgeworCQlPVVRfUklORyggc3RpcHBsZVtpXSApOworCX0KKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKGludCBzdXJmX2luZGV4LCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisJaWYgKCFkZXZfcHJpdi0+bW1pbykKKwkJcmV0dXJuOworCisJcmFkZW9uX2RvX2NwX2lkbGUoZGV2X3ByaXYpOworCisJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9JTkZPICsgMTYqc3VyZl9pbmRleCwKKwkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmZsYWdzKTsKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYqc3VyZl9pbmRleCwKKwkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmxvd2VyKTsKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX1VQUEVSX0JPVU5EICsgMTYqc3VyZl9pbmRleCwKKwkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLnVwcGVyKTsKK30KKworCisvKiBBbGxvY2F0ZXMgYSB2aXJ0dWFsIHN1cmZhY2UKKyAqIGRvZXNuJ3QgYWx3YXlzIGFsbG9jYXRlIGEgcmVhbCBzdXJmYWNlLCB3aWxsIHN0cmV0Y2ggYW4gZXhpc3RpbmcgCisgKiBzdXJmYWNlIHdoZW4gcG9zc2libGUuCisgKgorICogTm90ZSB0aGF0IHJlZmNvdW50IGNhbiBiZSBhdCBtb3N0IDIsIHNpbmNlIGR1cmluZyBhIGZyZWUgcmVmY291bnQ9MworICogbWlnaHQgbWVhbiB3ZSBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IHN1cmZhY2Ugd2hpY2ggbWlnaHQgbm90IGFsd2F5cworICogYmUgYXZhaWxhYmxlLgorICogRm9yIGV4YW1wbGUgOiB3ZSBhbGxvY2F0ZSB0aHJlZSBjb250aWdvdXMgc3VyZmFjZXMgQUJDLiBJZiBCIGlzIAorICogZnJlZWQsIHdlIHN1ZGRlbmx5IG5lZWQgdHdvIHN1cmZhY2VzIHRvIHN0b3JlIEEgYW5kIEMsIHdoaWNoIG1pZ2h0CisgKiBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBhbGxvY19zdXJmYWNlKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190KiBuZXcsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgRFJNRklMRSBmaWxwKQoreworCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlICpzOworCWludCBpOworCWludCB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJdWludDMyX3QgbmV3X3VwcGVyLCBuZXdfbG93ZXI7CisKKwluZXdfbG93ZXIgPSBuZXctPmFkZHJlc3M7CisJbmV3X3VwcGVyID0gbmV3X2xvd2VyICsgbmV3LT5zaXplIC0gMTsKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmICgobmV3X2xvd2VyID49IG5ld191cHBlcikgfHwgKG5ldy0+ZmxhZ3MgPT0gMCkgfHwgKG5ldy0+c2l6ZSA9PSAwKSB8fAorCQkoKG5ld191cHBlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0gUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSB8fAorCQkoKG5ld19sb3dlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0gMCkpCisJCXJldHVybiAtMTsKKworCS8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3VyZmFjZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ICE9IDApICYmCisJCSgoIChuZXdfbG93ZXIgPj0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSAmJgorCQkJKG5ld19sb3dlciA8IGRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlcikgKSB8fAorCQkgKCAobmV3X2xvd2VyIDwgZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSAmJgorCQkJKG5ld191cHBlciA+IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikgKSkgKXsKKwkJcmV0dXJuIC0xO30KKwl9CisKKwkvKiBmaW5kIGEgdmlydHVhbCBzdXJmYWNlICovCisJZm9yIChpID0gMDsgaSA8IDIqUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKQorCQlpZiAoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbaV0uZmlscCA9PSAwKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gMipSQURFT05fTUFYX1NVUkZBQ0VTKSB7CisJCXJldHVybiAtMTt9CisJdmlydF9zdXJmYWNlX2luZGV4ID0gaTsKKworCS8qIHRyeSB0byByZXVzZSBhbiBleGlzdGluZyBzdXJmYWNlICovCisJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgeworCQkvKiBleHRlbmQgYmVmb3JlICovCisJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCisJCSAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgorCQkgIChuZXdfdXBwZXIgKyAxID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikpIHsKKwkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOworCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CisJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKKwkJCXMtPnVwcGVyID0gbmV3X3VwcGVyOworCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOworCQkJcy0+ZmlscCA9IGZpbHA7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQrKzsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlciA9IHMtPmxvd2VyOworCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CisJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OworCQl9CisKKwkJLyogZXh0ZW5kIGFmdGVyICovCisJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCisJCSAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgorCQkgIChuZXdfbG93ZXIgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyICsgMSkpIHsKKwkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOworCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CisJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKKwkJCXMtPnVwcGVyID0gbmV3X3VwcGVyOworCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOworCQkJcy0+ZmlscCA9IGZpbHA7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQrKzsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciA9IHMtPnVwcGVyOworCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CisJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OworCQl9CisJfQorCisJLyogb2theSwgd2UgbmVlZCBhIG5ldyBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMCkgeworCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CisJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKKwkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOworCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CisJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CisJCQlzLT5maWxwID0gZmlscDsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCA9IDE7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIgPSBzLT5sb3dlcjsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciA9IHMtPnVwcGVyOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzID0gcy0+ZmxhZ3M7CisJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJCX0KKwl9CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBmcmVlX3N1cmZhY2UoRFJNRklMRSBmaWxwLCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBsb3dlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSAqczsKKwlpbnQgaTsKKwkvKiBmaW5kIHRoZSB2aXJ0dWFsIHN1cmZhY2UgKi8KKwlmb3IoaSA9IDA7IGkgPCAyKlJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgeworCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXSk7CisJCWlmIChzLT5maWxwKSB7CisJCQlpZiAoKGxvd2VyID09IHMtPmxvd2VyKSAmJiAoZmlscCA9PSBzLT5maWxwKSkgeworCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ubG93ZXIgPT0gcy0+bG93ZXIpCisJCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5sb3dlciA9IHMtPnVwcGVyOworCisJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS51cHBlciA9PSBzLT51cHBlcikKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnVwcGVyID0gcy0+bG93ZXI7CisKKwkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ucmVmY291bnQtLTsKKwkJCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnJlZmNvdW50ID09IDApCisJCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5mbGFncyA9IDA7CisJCQkJcy0+ZmlscCA9IE5VTEw7CisJCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9zdXJmYWNlc19yZWxlYXNlKERSTUZJTEUgZmlscCwgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQoreworCWludCBpOworCWZvciggaSA9IDA7IGkgPCAyKlJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykKKwl7CisJCWlmIChkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5maWxwID09IGZpbHApCisJCQlmcmVlX3N1cmZhY2UoZmlscCwgZGV2X3ByaXYsIGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmxvd2VyKTsKKwl9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIElPQ1RMIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IHJhZGVvbl9zdXJmYWNlX2FsbG9jKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCBhbGxvYzsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhbGxvYywgKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190IF9fdXNlciAqKWRhdGEsCisJCQkJICBzaXplb2YoYWxsb2MpKTsKKworCWlmIChhbGxvY19zdXJmYWNlKCZhbGxvYywgZGV2X3ByaXYsIGZpbHApID09IC0xKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX3N1cmZhY2VfZnJlZShEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCBtZW1mcmVlOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbWZyZWUsIChkcm1fcmFkZW9uX21lbV9mcmVlX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihtZW1mcmVlKSApOworCisJaWYgKGZyZWVfc3VyZmFjZShmaWxwLCBkZXZfcHJpdiwgbWVtZnJlZS5hZGRyZXNzKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9jbGVhciggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcmFkZW9uX2NsZWFyX3QgY2xlYXI7CisJZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgZGVwdGhfYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbGVhciwgKGRybV9yYWRlb25fY2xlYXJfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoY2xlYXIpICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJmRlcHRoX2JveGVzLCBjbGVhci5kZXB0aF9ib3hlcywKKwkJCSAgICAgc2FyZWFfcHJpdi0+bmJveCAqIHNpemVvZihkZXB0aF9ib3hlc1swXSkgKSApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlyYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoIGRldiwgJmNsZWFyLCBkZXB0aF9ib3hlcyApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgorICovIAorc3RhdGljIGludCByYWRlb25fZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUJFR0lOX1JJTkcoIDYgKTsKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUlRDX09GRlNFVF9DTlRMLCAwICkgKTsKKwlPVVRfUklORyggUkFERU9OX1JFQUQoIFJBREVPTl9DUlRDX09GRlNFVF9DTlRMICkgfCBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUlRDMl9PRkZTRVRfQ05UTCwgMCApICk7CisJT1VUX1JJTkcoIFJBREVPTl9SRUFEKCBSQURFT05fQ1JUQzJfT0ZGU0VUX0NOVEwgKSB8IFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMTsKKwlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW5ldmVyIGEgY2xpZW50IGRpZXMsIGZyb20gZHJtX3JlbGVhc2UuCisgKiBOT1RFOiAgTG9jayBpc24ndCBuZWNlc3NhcmlseSBoZWxkIHdoZW4gdGhpcyBpcyBjYWxsZWQhCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAwOworCXJldHVybiAwOworfQorCisvKiBTd2FwcGluZyBhbmQgZmxpcHBpbmcgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zLCBuZWVkIGRpZmZlcmVudCBpb2N0bHMuCisgKiBUaGV5IGNhbiAmIHNob3VsZCBiZSBpbnRlcm1peGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgM2Qgd2luZG93cy4gIAorICovCitzdGF0aWMgaW50IHJhZGVvbl9jcF9mbGlwKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIAorCQlyYWRlb25fZG9faW5pdF9wYWdlZmxpcCggZGV2ICk7CisJCQorCXJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3N3YXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoIGRldiApOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcmFkZW9uX3ZlcnRleF90IHZlcnRleDsKKwlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleF90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZih2ZXJ0ZXgpICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQgaW5kZXg9JWQgY291bnQ9JWQgZGlzY2FyZD0lZFxuIiwKKwkJICAgRFJNX0NVUlJFTlRQSUQsCisJCSAgIHZlcnRleC5pZHgsIHZlcnRleC5jb3VudCwgdmVydGV4LmRpc2NhcmQgKTsKKworCWlmICggdmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggdmVydGV4LnByaW0gPCAwIHx8CisJICAgICB2ZXJ0ZXgucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCB2ZXJ0ZXgucHJpbSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFt2ZXJ0ZXguaWR4XTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgdmVydGV4LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKKwkgKi8KKwlpZiAodmVydGV4LmNvdW50KSB7CisJCWJ1Zi0+dXNlZCA9IHZlcnRleC5jb3VudDsgLyogbm90IHVzZWQ/ICovCisKKwkJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJCWlmICggcmFkZW9uX2VtaXRfc3RhdGUoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKKwkJCQkJCXNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKKwkJCQkJCXNhcmVhX3ByaXYtPmRpcnR5ICkgKSB7CisJCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUgZmFpbGVkXG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCisJCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+KFJBREVPTl9VUExPQURfVEVYMElNQUdFUyB8CisJCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDFJTUFHRVMgfAorCQkJCQkgICAgICAgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTIHwKKwkJCQkJICAgICAgIFJBREVPTl9SRVFVSVJFX1FVSUVTQ0VOQ0UpOworCQl9CisKKwkJcHJpbS5zdGFydCA9IDA7CisJCXByaW0uZmluaXNoID0gdmVydGV4LmNvdW50OyAvKiB1bnVzZWQgKi8KKwkJcHJpbS5wcmltID0gdmVydGV4LnByaW07CisJCXByaW0ubnVtdmVydHMgPSB2ZXJ0ZXguY291bnQ7CisJCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKKwkJCisJCXJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoIGRldiwgYnVmLCAmcHJpbSApOworCX0KKworCWlmICh2ZXJ0ZXguZGlzY2FyZCkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfaW5kaWNlcyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3JhZGVvbl9pbmRpY2VzX3QgZWx0czsKKwlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKKwlpbnQgY291bnQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBlbHRzLCAoZHJtX3JhZGVvbl9pbmRpY2VzX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGVsdHMpICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQgaW5kZXg9JWQgc3RhcnQ9JWQgZW5kPSVkIGRpc2NhcmQ9JWRcbiIsCisJCSAgIERSTV9DVVJSRU5UUElELAorCQkgICBlbHRzLmlkeCwgZWx0cy5zdGFydCwgZWx0cy5lbmQsIGVsdHMuZGlzY2FyZCApOworCisJaWYgKCBlbHRzLmlkeCA8IDAgfHwgZWx0cy5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGVsdHMuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnByaW0gPCAwIHx8CisJICAgICBlbHRzLnByaW0gPiBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgZWx0cy5wcmltICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmID0gZG1hLT5idWZsaXN0W2VsdHMuaWR4XTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgZWx0cy5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwljb3VudCA9IChlbHRzLmVuZCAtIGVsdHMuc3RhcnQpIC8gc2l6ZW9mKHUxNik7CisJZWx0cy5zdGFydCAtPSBSQURFT05fSU5ERVhfUFJJTV9PRkZTRVQ7CisKKwlpZiAoIGVsdHMuc3RhcnQgJiAweDcgKSB7CisJCURSTV9FUlJPUiggIm1pc2FsaWduZWQgYnVmZmVyIDB4JXhcbiIsIGVsdHMuc3RhcnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnN0YXJ0IDwgYnVmLT51c2VkICkgeworCQlEUk1fRVJST1IoICJubyBoZWFkZXIgMHgleCAtIDB4JXhcbiIsIGVsdHMuc3RhcnQsIGJ1Zi0+dXNlZCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWJ1Zi0+dXNlZCA9IGVsdHMuZW5kOworCisJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJaWYgKCByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUsCisJCQkJCXNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKKwkJCQkJc2FyZWFfcHJpdi0+ZGlydHkgKSApIHsKKwkJCURSTV9FUlJPUiggInJhZGVvbl9lbWl0X3N0YXRlIGZhaWxlZFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfihSQURFT05fVVBMT0FEX1RFWDBJTUFHRVMgfAorCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDFJTUFHRVMgfAorCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDJJTUFHRVMgfAorCQkJCSAgICAgICBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFKTsKKwl9CisKKworCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKKwkgKi8KKwlwcmltLnN0YXJ0ID0gZWx0cy5zdGFydDsKKwlwcmltLmZpbmlzaCA9IGVsdHMuZW5kOyAKKwlwcmltLnByaW0gPSBlbHRzLnByaW07CisJcHJpbS5vZmZzZXQgPSAwOwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBkbWEgYnVmZmVycyAqLworCXByaW0ubnVtdmVydHMgPSBSQURFT05fTUFYX1ZCX1ZFUlRTOyAvKiBkdWggKi8KKwlwcmltLnZjX2Zvcm1hdCA9IGRldl9wcml2LT5zYXJlYV9wcml2LT52Y19mb3JtYXQ7CisJCisJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCAmcHJpbSApOworCWlmIChlbHRzLmRpc2NhcmQpIHsKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKCBkZXYsIGJ1ZiApOworCX0KKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3RleHR1cmUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl90ZXh0dXJlX3QgdGV4OworCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgaW1hZ2U7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHRleCwgKGRybV9yYWRlb25fdGV4dHVyZV90IF9fdXNlciAqKWRhdGEsIHNpemVvZih0ZXgpICk7CisKKwlpZiAoIHRleC5pbWFnZSA9PSBOVUxMICkgeworCQlEUk1fRVJST1IoICJudWxsIHRleHR1cmUgaW1hZ2UhXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZpbWFnZSwKKwkJCSAgICAgKGRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICopdGV4LmltYWdlLAorCQkJICAgICBzaXplb2YoaW1hZ2UpICkgKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmV0ID0gcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoIGZpbHAsIGRldiwgJnRleCwgJmltYWdlICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3N0aXBwbGUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zdGlwcGxlX3Qgc3RpcHBsZTsKKwl1MzIgbWFza1szMl07CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzdGlwcGxlLCAoZHJtX3JhZGVvbl9zdGlwcGxlX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHN0aXBwbGUpICk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJm1hc2ssIHN0aXBwbGUubWFzaywgMzIgKiBzaXplb2YodTMyKSApICkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCXJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKCBkZXYsIG1hc2sgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2luZGlyZWN0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yYWRlb25faW5kaXJlY3RfdCBpbmRpcmVjdDsKKwlSSU5HX0xPQ0FMUzsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5kaXJlY3QsIChkcm1fcmFkZW9uX2luZGlyZWN0X3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGluZGlyZWN0KSApOworCisJRFJNX0RFQlVHKCAiaW5kaXJlY3Q6IGlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKKwkJICAgaW5kaXJlY3QuaWR4LCBpbmRpcmVjdC5zdGFydCwKKwkJICAgaW5kaXJlY3QuZW5kLCBpbmRpcmVjdC5kaXNjYXJkICk7CisKKwlpZiAoIGluZGlyZWN0LmlkeCA8IDAgfHwgaW5kaXJlY3QuaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICBpbmRpcmVjdC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpcmVjdC5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBpbmRpcmVjdC5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGluZGlyZWN0LnN0YXJ0IDwgYnVmLT51c2VkICkgeworCQlEUk1fRVJST1IoICJyZXVzaW5nIGluZGlyZWN0OiBzdGFydD0weCV4IGFjdHVhbD0weCV4XG4iLAorCQkJICAgaW5kaXJlY3Quc3RhcnQsIGJ1Zi0+dXNlZCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWJ1Zi0+dXNlZCA9IGluZGlyZWN0LmVuZDsKKworCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgdGhlIGluZGlyZWN0IGJ1ZmZlcgorCSAqIGNvbnRhaW5pbmcgMkQgYWNjZWxlcmF0aW9uIGNvbW1hbmRzIGlzIHByb2Nlc3NlZC4KKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCS8qIERpc3BhdGNoIHRoZSBpbmRpcmVjdCBidWZmZXIgZnVsbCBvZiBjb21tYW5kcyBmcm9tIHRoZQorCSAqIFggc2VydmVyLiAgVGhpcyBpcyBpbnNlY3VyZSBhbmQgaXMgdGh1cyBvbmx5IGF2YWlsYWJsZSB0bworCSAqIHByaXZpbGVnZWQgY2xpZW50cy4KKwkgKi8KKwlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgYnVmLCBpbmRpcmVjdC5zdGFydCwgaW5kaXJlY3QuZW5kICk7CisJaWYgKGluZGlyZWN0LmRpc2NhcmQpIHsKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKCBkZXYsIGJ1ZiApOworCX0KKworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4MiggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgdmVydGV4OworCWludCBpOworCXVuc2lnbmVkIGNoYXIgbGFzdHN0YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdmVydGV4LCAoZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgICBEUk1fQ1VSUkVOVFBJRCwKKwkJICAgdmVydGV4LmlkeCwgdmVydGV4LmRpc2NhcmQgKTsKKworCWlmICggdmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIHZlcnRleC5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJCisJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJZm9yIChsYXN0c3RhdGUgPSAweGZmLCBpID0gMCA7IGkgPCB2ZXJ0ZXgubnJfcHJpbXMgOyBpKyspIHsKKwkJZHJtX3JhZGVvbl9wcmltX3QgcHJpbTsKKwkJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHRjbHByaW07CisJCQorCQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJnByaW0sICZ2ZXJ0ZXgucHJpbVtpXSwgc2l6ZW9mKHByaW0pICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCisJCWlmICggcHJpbS5zdGF0ZWlkeCAhPSBsYXN0c3RhdGUgKSB7CisJCQlkcm1fcmFkZW9uX3N0YXRlX3Qgc3RhdGU7CQkJICAgICAgIAorCQkJCQorCQkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZzdGF0ZSwgCisJCQkJCSAgICAgJnZlcnRleC5zdGF0ZVtwcmltLnN0YXRlaWR4XSwgCisJCQkJCSAgICAgc2l6ZW9mKHN0YXRlKSApICkKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJCQlpZiAoIHJhZGVvbl9lbWl0X3N0YXRlMiggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnN0YXRlICkgKSB7CisJCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUyIGZhaWxlZFxuIiApOworCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCX0KKworCQkJbGFzdHN0YXRlID0gcHJpbS5zdGF0ZWlkeDsKKwkJfQorCisJCXRjbHByaW0uc3RhcnQgPSBwcmltLnN0YXJ0OworCQl0Y2xwcmltLmZpbmlzaCA9IHByaW0uZmluaXNoOworCQl0Y2xwcmltLnByaW0gPSBwcmltLnByaW07CisJCXRjbHByaW0udmNfZm9ybWF0ID0gcHJpbS52Y19mb3JtYXQ7CisKKwkJaWYgKCBwcmltLnByaW0gJiBSQURFT05fUFJJTV9XQUxLX0lORCApIHsKKwkJCXRjbHByaW0ub2Zmc2V0ID0gcHJpbS5udW12ZXJ0cyAqIDY0OworCQkJdGNscHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7IC8qIGR1aCAqLworCisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsICZ0Y2xwcmltICk7CisJCX0gZWxzZSB7CisJCQl0Y2xwcmltLm51bXZlcnRzID0gcHJpbS5udW12ZXJ0czsKKwkJCXRjbHByaW0ub2Zmc2V0ID0gMDsgLyogbm90IHVzZWQgKi8KKworCQkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYsICZ0Y2xwcmltICk7CisJCX0KKwkJCisJCWlmIChzYXJlYV9wcml2LT5uYm94ID09IDEpCisJCQlzYXJlYV9wcml2LT5uYm94ID0gMDsKKwl9CisKKwlpZiAoIHZlcnRleC5kaXNjYXJkICkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldHMoIAorCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWludCBpZCA9IChpbnQpaGVhZGVyLnBhY2tldC5wYWNrZXRfaWQ7CisJaW50IHN6LCByZWc7CisJaW50ICpkYXRhID0gKGludCAqKWNtZGJ1Zi0+YnVmOworCVJJTkdfTE9DQUxTOworICAgCisJaWYgKGlkID49IFJBREVPTl9NQVhfU1RBVEVfUEFDS0VUUykKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCXN6ID0gcGFja2V0W2lkXS5sZW47CisJcmVnID0gcGFja2V0W2lkXS5zdGFydDsKKworCWlmIChzeiAqIHNpemVvZihpbnQpID4gY21kYnVmLT5idWZzeikgeworCQlEUk1fRVJST1IoICJQYWNrZXQgc2l6ZSBwcm92aWRlZCBsYXJnZXIgdGhhbiBkYXRhIHByb3ZpZGVkXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldHMoIGRldl9wcml2LCBmaWxwX3ByaXYsIGlkLCBkYXRhICkgKSB7CisJCURSTV9FUlJPUiggIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlCRUdJTl9SSU5HKHN6KzEpOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCByZWcsIChzei0xKSApICk7CisJT1VUX1JJTkdfVEFCTEUoIGRhdGEsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwljbWRidWYtPmJ1ZiArPSBzeiAqIHNpemVvZihpbnQpOworCWNtZGJ1Zi0+YnVmc3ogLT0gc3ogKiBzaXplb2YoaW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMoIAorCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CisJaW50IHN0YXJ0ID0gaGVhZGVyLnNjYWxhcnMub2Zmc2V0OworCWludCBzdHJpZGUgPSBoZWFkZXIuc2NhbGFycy5zdHJpZGU7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9SSU5HKCAzK3N6ICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0lORFhfUkVHLCAwICkgKTsKKwlPVVRfUklORyggc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzei0xICkgKTsKKwlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdvZCB0aGlzIGlzIHVnbHkKKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKCAKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWludCBzeiA9IGhlYWRlci5zY2FsYXJzLmNvdW50OworCWludCBzdGFydCA9ICgodW5zaWduZWQgaW50KWhlYWRlci5zY2FsYXJzLm9mZnNldCkgKyAweDEwMDsKKwlpbnQgc3RyaWRlID0gaGVhZGVyLnNjYWxhcnMuc3RyaWRlOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fUklORyggMytzeiApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRywgMCApICk7CisJT1VUX1JJTkcoIHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fU0NBTF9JTkRYX0RXT1JEX1NUUklERV9TSElGVCkpOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwX1RBQkxFKCBSQURFT05fU0VfVENMX1NDQUxBUl9EQVRBX1JFRywgc3otMSApICk7CisJT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBzeiApOworCUFEVkFOQ0VfUklORygpOworCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CisJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfdmVjdG9ycyggCisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKKwlkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmICkKK3sKKwlpbnQgc3ogPSBoZWFkZXIudmVjdG9ycy5jb3VudDsKKwlpbnQgc3RhcnQgPSBoZWFkZXIudmVjdG9ycy5vZmZzZXQ7CisJaW50IHN0cmlkZSA9IGhlYWRlci52ZWN0b3JzLnN0cmlkZTsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX1JJTkcoIDMrc3ogKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1RDTF9WRUNUT1JfSU5EWF9SRUcsIDAgKSApOworCU9VVF9SSU5HKCBzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1ZFQ19JTkRYX09DVFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfVkVDVE9SX0RBVEFfUkVHLCAoc3otMSkgKSApOworCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1Ziwgc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CisJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0MyggZHJtX2RldmljZV90ICpkZXYsCisJCQkJZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IGNtZHN6OworCWludCByZXQ7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlpZiAoICggcmV0ID0gcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICBjbWRidWYsICZjbWRzeiApICkgKSB7CisJCURSTV9FUlJPUiggIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iICk7CisJCXJldHVybiByZXQ7CisJfQorCisJQkVHSU5fUklORyggY21kc3ogKTsKKwlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIGNtZHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CisJY21kYnVmLT5idWZzeiAtPSBjbWRzeiAqIDQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCQkJIGRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYsCisJCQkJCSBpbnQgb3JpZ19uYm94ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9jbGlwX3JlY3RfdCBib3g7CisJdW5zaWduZWQgaW50IGNtZHN6OworCWludCByZXQ7CisJZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOworCWludCBpID0gMDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmICggKCByZXQgPSByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgIGNtZGJ1ZiwgJmNtZHN6ICkgKSApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIW9yaWdfbmJveCkKKwkJZ290byBvdXQ7CisKKwlkbyB7CisJCWlmICggaSA8IGNtZGJ1Zi0+bmJveCApIHsKKwkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoICZib3gsICZib3hlc1tpXSwgc2l6ZW9mKGJveCkgKSkKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJLyogRklYTUUgVGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCB0aW1lcyByb3VuZAorCQkJICogdGhpcyBsb29wLCBzZW5kIGEgV0FJVF9VTlRJTF8zRF9JRExFIGJlZm9yZQorCQkJICogY2FsbGluZyBlbWl0X2NsaXBfcmVjdCgpLiBUaGlzIGZpeGVzIGEKKwkJCSAqIGxvY2t1cCBvbiBmYXN0IG1hY2hpbmVzIHdoZW4gc2VuZGluZworCQkJICogc2V2ZXJhbCBjbGlwcmVjdHMgd2l0aCBhIGNtZGJ1ZiwgYXMgd2hlbgorCQkJICogd2F2aW5nIGEgMkQgd2luZG93IG92ZXIgYSAzRAorCQkJICogd2luZG93LiBTb21ldGhpbmcgaW4gdGhlIGNvbW1hbmRzIGZyb20gdXNlcgorCQkJICogc3BhY2Ugc2VlbXMgdG8gaGFuZyB0aGUgY2FyZCB3aGVuIHRoZXkncmUKKwkJCSAqIHNlbnQgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdy4gVGhhdCB3b3VsZCBiZQorCQkJICogdGhlIGNvcnJlY3QgcGxhY2UgdG8gZml4IGl0IGJ1dCB0aGlzIHdvcmtzCisJCQkgKiBhcm91bmQgaXQgdW50aWwgSSBjYW4gZmlndXJlIHRoYXQgb3V0IC0gVGltCisJCQkgKiBTbWl0aCAqLworCQkJaWYgKCBpICkgeworCQkJCUJFR0lOX1JJTkcoIDIgKTsKKwkJCQlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LCAmYm94ICk7CisJCX0KKwkJCisJCUJFR0lOX1JJTkcoIGNtZHN6ICk7CisJCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1ZiwgY21kc3ogKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwl9IHdoaWxlICggKytpIDwgY21kYnVmLT5uYm94ICk7CisgCWlmIChjbWRidWYtPm5ib3ggPT0gMSkKKwkJY21kYnVmLT5uYm94ID0gMDsKKworIG91dDoKKwljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CisJY21kYnVmLT5idWZzeiAtPSBjbWRzeiAqIDQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIFJBREVPTl9XQUlUXzJEOgorCQlCRUdJTl9SSU5HKCAyICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsgCisJCUFEVkFOQ0VfUklORygpOworCQlicmVhazsKKwljYXNlIFJBREVPTl9XQUlUXzNEOgorCQlCRUdJTl9SSU5HKCAyICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsgCisJCUFEVkFOQ0VfUklORygpOworCQlicmVhazsKKwljYXNlIFJBREVPTl9XQUlUXzJEfFJBREVPTl9XQUlUXzNEOgorCQlCRUdJTl9SSU5HKCAyICk7CisJCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsgCisJCUFEVkFOQ0VfUklORygpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9jbWRidWYoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmID0gTlVMTDsKKwlpbnQgaWR4OworCWRybV9yYWRlb25fY21kX2J1ZmZlcl90IGNtZGJ1ZjsKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXI7CisJaW50IG9yaWdfbmJveCwgb3JpZ19idWZzejsKKwljaGFyICprYnVmPU5VTEw7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbWRidWYsIChkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoY21kYnVmKSApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKGNtZGJ1Zi5idWZzeiA+IDY0KjEwMjQgfHwgY21kYnVmLmJ1ZnN6PDApIHsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbiBpbi1rZXJuZWwgYXJlYSBhbmQgY29weSBpbiB0aGUgY21kYnVmLiAgRG8gdGhpcyB0byBhdm9pZAorCSAqIHJhY2VzIGJldHdlZW4gY2hlY2tpbmcgdmFsdWVzIGFuZCB1c2luZyB0aG9zZSB2YWx1ZXMgaW4gb3RoZXIgY29kZSwKKwkgKiBhbmQgc2ltcGx5IHRvIGF2b2lkIGEgbG90IG9mIGZ1bmN0aW9uIGNhbGxzIHRvIGNvcHkgaW4gZGF0YS4KKwkgKi8KKwlvcmlnX2J1ZnN6ID0gY21kYnVmLmJ1ZnN6OworCWlmIChvcmlnX2J1ZnN6ICE9IDApIHsKKwkJa2J1ZiA9IGRybV9hbGxvYyhjbWRidWYuYnVmc3osIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGtidWYgPT0gTlVMTCkKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2J1ZiwgY21kYnVmLmJ1ZiwgY21kYnVmLmJ1ZnN6KSkgeworCQkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJfQorCQljbWRidWYuYnVmID0ga2J1ZjsKKwl9CisKKwlvcmlnX25ib3ggPSBjbWRidWYubmJveDsKKworCXdoaWxlICggY21kYnVmLmJ1ZnN6ID49IHNpemVvZihoZWFkZXIpICkgeworCisJCWhlYWRlci5pID0gKihpbnQgKiljbWRidWYuYnVmOworCQljbWRidWYuYnVmICs9IHNpemVvZihoZWFkZXIpOworCQljbWRidWYuYnVmc3ogLT0gc2l6ZW9mKGhlYWRlcik7CisKKwkJc3dpdGNoIChoZWFkZXIuaGVhZGVyLmNtZF90eXBlKSB7CisJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQ6IAorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVFxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0cyggZGV2X3ByaXYsIGZpbHBfcHJpdiwgaGVhZGVyLCAmY21kYnVmICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldHMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9TQ0FMQVJTOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1NDQUxBUlNcbiIpOworCQkJaWYgKHJhZGVvbl9lbWl0X3NjYWxhcnMoIGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc2NhbGFycyBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1ZFQ1RPUlM6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfVkVDVE9SU1xuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfdmVjdG9ycyggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF92ZWN0b3JzIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfRE1BX0RJU0NBUkQ6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfRE1BX0RJU0NBUkRcbiIpOworCQkJaWR4ID0gaGVhZGVyLmRtYS5idWZfaWR4OworCQkJaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkJCSAgIGlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpZHhdOworCQkJaWYgKCBidWYtPmZpbHAgIT0gZmlscCB8fCBidWYtPnBlbmRpbmcgKSB7CisJCQkJRFJNX0VSUk9SKCAiYmFkIGJ1ZmZlciAlcCAlcCAlZFxuIiwKKwkJCQkJICAgYnVmLT5maWxwLCBmaWxwLCBidWYtPnBlbmRpbmcpOworCQkJCWdvdG8gZXJyOworCQkJfQorCisJCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfUEFDS0VUMzoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVQzXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzKCBkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXQzIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfUEFDS0VUM19DTElQOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVDNfQ0xJUFxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdCggZGV2LCBmaWxwX3ByaXYsICZjbWRidWYsIG9yaWdfbmJveCApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXQzX2NsaXAgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9TQ0FMQVJTMjoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9TQ0FMQVJTMlxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfc2NhbGFyczIoIGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc2NhbGFyczIgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9XQUlUOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1dBSVRcbiIpOworCQkJaWYgKHJhZGVvbl9lbWl0X3dhaXQoIGRldiwgaGVhZGVyLndhaXQuZmxhZ3MgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfd2FpdCBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoImJhZCBjbWRfdHlwZSAlZCBhdCAlcFxuIiwgCisJCQkJICBoZWFkZXIuaGVhZGVyLmNtZF90eXBlLAorCQkJCSAgY21kYnVmLmJ1ZiAtIHNpemVvZihoZWFkZXIpKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKG9yaWdfYnVmc3ogIT0gMCkKKwkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCisJRFJNX0RFQlVHKCJET05FXG4iKTsKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworCitlcnI6CisJaWYgKG9yaWdfYnVmc3ogIT0gMCkKKwkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKKworCitzdGF0aWMgaW50IHJhZGVvbl9jcF9nZXRwYXJhbSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2dldHBhcmFtX3QgcGFyYW07CisJaW50IHZhbHVlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHBhcmFtLCAoZHJtX3JhZGVvbl9nZXRwYXJhbV90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihwYXJhbSkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZFxuIiwgRFJNX0NVUlJFTlRQSUQgKTsKKworCXN3aXRjaCggcGFyYW0ucGFyYW0gKSB7CisJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CVUZGRVJfT0ZGU0VUOgorCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0OworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0ZSQU1FOgorCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcysrOworCQl2YWx1ZSA9IEdFVF9TQ1JBVENIKCAwICk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0xBU1RfRElTUEFUQ0g6CisJCXZhbHVlID0gR0VUX1NDUkFUQ0goIDEgKTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9DTEVBUjoKKwkJZGV2X3ByaXYtPnN0YXRzLmxhc3RfY2xlYXJfcmVhZHMrKzsKKwkJdmFsdWUgPSBHRVRfU0NSQVRDSCggMiApOworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9JUlFfTlI6CisJCXZhbHVlID0gZGV2LT5pcnE7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0dBUlRfQkFTRToKKwkJdmFsdWUgPSBkZXZfcHJpdi0+Z2FydF92bV9zdGFydDsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fUkVHSVNURVJfSEFORExFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5tbWlvX29mZnNldDsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fU1RBVFVTX0hBTkRMRToKKwkJdmFsdWUgPSBkZXZfcHJpdi0+cmluZ19ycHRyX29mZnNldDsKKwkJYnJlYWs7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCS8qCisJICogVGhpcyBpb2N0bCgpIGRvZXNuJ3Qgd29yayBvbiA2NC1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgaHdfbG9jayBpcyBhCisJICogcG9pbnRlciB3aGljaCBjYW4ndCBmaXQgaW50byBhbiBpbnQtc2l6ZWQgdmFyaWFibGUuICBBY2NvcmRpbmcgdG8KKwkgKiBNaWNoZWwgRORuemVyLCB0aGUgaW9jdGwoKSBpcyBvbmx5IHVzZWQgb24gZW1iZWRkZWQgcGxhdGZvcm1zLCBzbworCSAqIG5vdCBzdXBwb3J0aW5nIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICBJZiB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5CisJICogaXMgbmVlZGVkIG9uIDY0LWJpdCBwbGF0Zm9ybXMsIGEgbmV3IGlvY3RsKCkgd291bGQgaGF2ZSB0byBiZSBhZGRlZCwKKwkgKiBzbyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIGVtYmVkZGVkIHBsYXRmb3JtcyBjYW4gYmUKKwkgKiBtYWludGFpbmVkLiAgLS1kYXZpZG0gNC1GZWItMjAwNC4KKwkgKi8KKwljYXNlIFJBREVPTl9QQVJBTV9TQVJFQV9IQU5ETEU6CisJCS8qIFRoZSBsb2NrIGlzIHRoZSBmaXJzdCBkd29yZCBpbiB0aGUgc2FyZWEuICovCisJCXZhbHVlID0gKGxvbmcpZGV2LT5sb2NrLmh3X2xvY2s7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIERSTV9DT1BZX1RPX1VTRVIoIHBhcmFtLnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3Bfc2V0cGFyYW0oIERSTV9JT0NUTF9BUkdTICkgeworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX3JhZGVvbl9zZXRwYXJhbV90IHNwOworCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggc3AsICggZHJtX3JhZGVvbl9zZXRwYXJhbV90IF9fdXNlciAqIClkYXRhLAorCQkJCSAgc2l6ZW9mKCBzcCApICk7CisKKwlzd2l0Y2goIHNwLnBhcmFtICkgeworCWNhc2UgUkFERU9OX1NFVFBBUkFNX0ZCX0xPQ0FUSU9OOgorCQlyYWRlb25fcHJpdiA9IGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CisJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gLSBzcC52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fU0VUUEFSQU1fU1dJVENIX1RJTElORzoKKwkJaWYgKHNwLnZhbHVlID09IDApIHsKKwkJCURSTV9ERUJVRyggImNvbG9yIHRpbGluZyBkaXNhYmxlZFxuIiApOworCQkJZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCAmPSB+UkFERU9OX0RTVF9USUxFX01BQ1JPOworCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CisJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAwOworCQl9CisJCWVsc2UgaWYgKHNwLnZhbHVlID09IDEpIHsKKwkJCURSTV9ERUJVRyggImNvbG9yIHRpbGluZyBlbmFibGVkXG4iICk7CisJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwkJCWRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87CisJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAxOworCQl9CisJCWJyZWFrOwkKKwlkZWZhdWx0OgorCQlEUk1fREVCVUcoICJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgc3AucGFyYW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCXJldHVybiAwOworfQorCisvKiBXaGVuIGEgY2xpZW50IGRpZXM6CisgKiAgICAtIENoZWNrIGZvciBhbmQgY2xlYW4gdXAgZmxpcHBlZCBwYWdlIHN0YXRlCisgKiAgICAtIEZyZWUgYW55IGFsbG9jZWQgR0FSVCBtZW1vcnkuCisgKgorICogRFJNIGluZnJhc3RydWN0dXJlIHRha2VzIGNhcmUgb2YgcmVjbGFpbWluZyBkbWEgYnVmZmVycy4KKyAqLwordm9pZCByYWRlb25fZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CQkJCQorCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOyAKKwkJaWYgKCBkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyApIHsJCQorCQkJcmFkZW9uX2RvX2NsZWFudXBfcGFnZWZsaXAoIGRldiApOwkKKwkJfQkJCQkJCQorCQlyYWRlb25fbWVtX3JlbGVhc2UoIGZpbHAsIGRldl9wcml2LT5nYXJ0X2hlYXAgKTsgCisJCXJhZGVvbl9tZW1fcmVsZWFzZSggZmlscCwgZGV2X3ByaXYtPmZiX2hlYXAgKTsJCisJCXJhZGVvbl9zdXJmYWNlc19yZWxlYXNlKGZpbHAsIGRldl9wcml2KTsKKwl9CQkJCQorfQorCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJcmFkZW9uX2RvX3JlbGVhc2UoZGV2KTsKK30KKworaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKmZpbHBfcHJpdikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CisJCisJcmFkZW9uX3ByaXYgPSAoc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICopZHJtX2FsbG9jKHNpemVvZigqcmFkZW9uX3ByaXYpLCBEUk1fTUVNX0ZJTEVTKTsKKwkKKwlpZiAoIXJhZGVvbl9wcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpbHBfcHJpdi0+ZHJpdmVyX3ByaXYgPSByYWRlb25fcHJpdjsKKwlpZiAoIGRldl9wcml2ICkKKwkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IGRldl9wcml2LT5mYl9sb2NhdGlvbjsKKwllbHNlCisJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSAwOworCXJldHVybiAwOworfQorCisKK3ZvaWQgcmFkZW9uX2RyaXZlcl9mcmVlX2ZpbHBfcHJpdihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqZmlscF9wcml2KQoreworCSBzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKKwkgCisJIGRybV9mcmVlKHJhZGVvbl9wcml2LCBzaXplb2YoKnJhZGVvbl9wcml2KSwgRFJNX01FTV9GSUxFUyk7Cit9CisKK2RybV9pb2N0bF9kZXNjX3QgcmFkZW9uX2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JTklUKV0gICAgPSB7IHJhZGVvbl9jcF9pbml0LCAgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RBUlQpXSAgID0geyByYWRlb25fY3Bfc3RhcnQsICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUT1ApXSAgICA9IHsgcmFkZW9uX2NwX3N0b3AsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9SRVNFVCldICAgPSB7IHJhZGVvbl9jcF9yZXNldCwgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSURMRSldICAgID0geyByYWRlb25fY3BfaWRsZSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU1VNRSldICA9IHsgcmFkZW9uX2NwX3Jlc3VtZSwgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9SRVNFVCldICAgICAgPSB7IHJhZGVvbl9lbmdpbmVfcmVzZXQsIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlVMTFNDUkVFTildID0geyByYWRlb25fZnVsbHNjcmVlbiwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NXQVApXSAgICAgICA9IHsgcmFkZW9uX2NwX3N3YXAsICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTEVBUildICAgICAgPSB7IHJhZGVvbl9jcF9jbGVhciwgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYKV0gICAgID0geyByYWRlb25fY3BfdmVydGV4LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElDRVMpXSAgICA9IHsgcmFkZW9uX2NwX2luZGljZXMsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9URVhUVVJFKV0gICAgPSB7IHJhZGVvbl9jcF90ZXh0dXJlLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1RJUFBMRSldICAgID0geyByYWRlb25fY3Bfc3RpcHBsZSwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElSRUNUKV0gICA9IHsgcmFkZW9uX2NwX2luZGlyZWN0LCAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9WRVJURVgyKV0gICAgPSB7IHJhZGVvbl9jcF92ZXJ0ZXgyLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ01EQlVGKV0gICAgID0geyByYWRlb25fY3BfY21kYnVmLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0dFVFBBUkFNKV0gICA9IHsgcmFkZW9uX2NwX2dldHBhcmFtLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GTElQKV0gICAgICAgPSB7IHJhZGVvbl9jcF9mbGlwLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQUxMT0MpXSAgICAgID0geyByYWRlb25fbWVtX2FsbG9jLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZSRUUpXSAgICAgICA9IHsgcmFkZW9uX21lbV9mcmVlLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTklUX0hFQVApXSAgPSB7IHJhZGVvbl9tZW1faW5pdF9oZWFwLDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX0VNSVQpXSAgID0geyByYWRlb25faXJxX2VtaXQsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lSUV9XQUlUKV0gICA9IHsgcmFkZW9uX2lycV93YWl0LCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TRVRQQVJBTSldICAgPSB7IHJhZGVvbl9jcF9zZXRwYXJhbSwgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9BTExPQyldID0geyByYWRlb25fc3VyZmFjZV9hbGxvYywxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfRlJFRSldICA9IHsgcmFkZW9uX3N1cmZhY2VfZnJlZSwgMSwgMCB9Cit9OworCitpbnQgcmFkZW9uX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHJhZGVvbl9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTljM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJtLmgKQEAgLTAsMCArMSw0MiBAQAorCisjaWZuZGVmIF9fU0lTX0RSTV9IX18KKyNkZWZpbmUgX19TSVNfRFJNX0hfXworCisvKiBTaVMgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIE5PVF9VU0VEXzBfMworI2RlZmluZSBEUk1fU0lTX0ZCX0FMTE9DCTB4MDQKKyNkZWZpbmUgRFJNX1NJU19GQl9GUkVFCSAgICAgICAgMHgwNQorI2RlZmluZSBOT1RfVVNFRF82XzEyCisjZGVmaW5lIERSTV9TSVNfQUdQX0lOSVQJMHgxMworI2RlZmluZSBEUk1fU0lTX0FHUF9BTExPQwkweDE0CisjZGVmaW5lIERSTV9TSVNfQUdQX0ZSRUUJMHgxNQorI2RlZmluZSBEUk1fU0lTX0ZCX0lOSVQJICAgICAgICAweDE2CisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GQl9BTExPQwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkJfRlJFRQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfRlJFRSwgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfSU5JVAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfQUdQX0lOSVQsIGRybV9zaXNfYWdwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0FMTE9DCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19BR1BfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0ZSRUUJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0FHUF9GUkVFLCBkcm1fc2lzX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZCX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0ZCX0lOSVQsIGRybV9zaXNfZmJfdCkKKy8qCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUAkJRFJNX0lPVyggMHg0OCwgZHJtX3Npc19mbGlwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUF9JTklUCQlEUk1fSU8oICAweDQ5KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZMSVBfRklOQUwJRFJNX0lPKCAgMHg1MCkKKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgZnJlZTsKK30gZHJtX3Npc19tZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7Cit9IGRybV9zaXNfYWdwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplOworfSBkcm1fc2lzX2ZiX3Q7CisKKyNlbmRpZiAvKiBfX1NJU19EUk1fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDE3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwpAQCAtMCwwICsxLDExMCBAQAorLyogc2lzLmMgLS0gc2lzIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInNpc19kcm0uaCIKKyNpbmNsdWRlICJzaXNfZHJ2LmgiCisKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisgIAorc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXNpc2Rydl9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBzaXNfaW9jdGxzW107CitleHRlcm4gaW50IHNpc19tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSLAorCS5jb250ZXh0X2N0b3IgPSBzaXNfaW5pdF9jb250ZXh0LAorCS5jb250ZXh0X2R0b3IgPSBzaXNfZmluYWxfY29udGV4dCwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gc2lzX2lvY3RscywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgc2lzX2luaXQodm9pZCkKK3sKKwlkcml2ZXIubnVtX2lvY3RscyA9IHNpc19tYXhfaW9jdGw7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2lzX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2lzX2luaXQpOworbW9kdWxlX2V4aXQoc2lzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmUzNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKQEAgLTAsMCArMSw1MiBAQAorLyogc2lzX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciBzaXMgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqLworCisjaWZuZGVmIF9TSVNfRFJWX0hfCisjZGVmaW5lIF9TSVNfRFJWX0hfCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJTSVMiCisjZGVmaW5lIERSSVZFUl9OQU1FCQkic2lzIgorI2RlZmluZSBEUklWRVJfREVTQwkJIlNJUyAzMDAvNjMwLzU0MCIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAzMDgyNiIKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMQorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKKyNpbmNsdWRlICJzaXNfZHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3Npc19wcml2YXRlIHsKKwltZW1IZWFwX3QgKkFHUEhlYXA7CisJbWVtSGVhcF90ICpGQkhlYXA7Cit9IGRybV9zaXNfcHJpdmF0ZV90OworCitleHRlcm4gaW50IHNpc19pbml0X2NvbnRleHQoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgc2lzX2ZpbmFsX2NvbnRleHQoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzdlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuYwpAQCAtMCwwICsxLDMwMSBAQAorLyogc2lzX2RzLmMgLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMTA6MDU6MDUgMTk5OSBieSBzY2xpbkBzaXMuY29tLnR3CisgKgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCwgSW5jLiwgSHNpbkNodSwgVGFpd2FuLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICogQXV0aG9yczoKKyAqICAgIFN1bmctQ2hpbmcgTGluIDxzY2xpbkBzaXMuY29tLnR3PgorICogCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJzaXNfZHMuaCIKKworLyogU2V0IERhdGEgU3RydWN0dXJlLCBub3QgY2hlY2sgcmVwZWF0ZWQgdmFsdWUKKyAqIHRlbXBvcmFyaWx5IHVzZWQKKyAqLworCitzZXRfdCAqc2V0SW5pdCh2b2lkKQoreworCWludCBpOworCXNldF90ICpzZXQ7CisKKwlzZXQgPSAoc2V0X3QgKilkcm1fYWxsb2Moc2l6ZW9mKHNldF90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChzZXQgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgU0VUX1NJWkU7IGkrKykgeworCQkJc2V0LT5saXN0W2ldLmZyZWVfbmV4dCA9IGkgKyAxOyAgICAKKwkJCXNldC0+bGlzdFtpXS5hbGxvY19uZXh0ID0gLTE7CisJCX0KKwkJc2V0LT5saXN0W1NFVF9TSVpFLTFdLmZyZWVfbmV4dCA9IC0xOworCQlzZXQtPmZyZWUgPSAwOworCQlzZXQtPmFsbG9jID0gLTE7CisJCXNldC0+dHJhY2UgPSAtMTsKKwl9CisJcmV0dXJuIHNldDsKK30KKworaW50IHNldEFkZChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgaXRlbSkKK3sKKwlpbnQgZnJlZSA9IHNldC0+ZnJlZTsKKyAgCisJaWYgKGZyZWUgIT0gLTEpIHsKKwkJc2V0LT5saXN0W2ZyZWVdLnZhbCA9IGl0ZW07CisJCXNldC0+ZnJlZSA9IHNldC0+bGlzdFtmcmVlXS5mcmVlX25leHQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJc2V0LT5saXN0W2ZyZWVdLmFsbG9jX25leHQgPSBzZXQtPmFsbG9jOworCXNldC0+YWxsb2MgPSBmcmVlOyAgCisJc2V0LT5saXN0W2ZyZWVdLmZyZWVfbmV4dCA9IC0xOyAgICAKKworCXJldHVybiAxOworfQorCitpbnQgc2V0RGVsKHNldF90ICpzZXQsIElURU1fVFlQRSBpdGVtKQoreworCWludCBhbGxvYyA9IHNldC0+YWxsb2M7CisJaW50IHByZXYgPSAtMTsgIAorCisJd2hpbGUgKGFsbG9jICE9IC0xKSB7CisJCWlmIChzZXQtPmxpc3RbYWxsb2NdLnZhbCA9PSBpdGVtKSB7CisJCQlpZiAocHJldiAhPSAtMSkKKwkJCQlzZXQtPmxpc3RbcHJldl0uYWxsb2NfbmV4dCA9CisJCQkJICAgIHNldC0+bGlzdFthbGxvY10uYWxsb2NfbmV4dDsKKwkJCWVsc2UKKwkJCQlzZXQtPmFsbG9jID0gc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCQkJYnJlYWs7CisJCX0KKwkJcHJldiA9IGFsbG9jOworCQlhbGxvYyA9IHNldC0+bGlzdFthbGxvY10uYWxsb2NfbmV4dDsKKwl9CisKKwlpZiAoYWxsb2MgPT0gLTEpCisJCXJldHVybiAwOworCisJc2V0LT5saXN0W2FsbG9jXS5mcmVlX25leHQgPSBzZXQtPmZyZWU7CisJc2V0LT5mcmVlID0gYWxsb2M7CisJc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0ID0gLTE7CisKKwlyZXR1cm4gMTsKK30KKworLyogc2V0Rmlyc3QgLT4gc2V0QWRkIC0+IHNldE5leHQgaXMgd3JvbmcgKi8KKworaW50IHNldEZpcnN0KHNldF90ICpzZXQsIElURU1fVFlQRSAqaXRlbSkKK3sKKwlpZiAoc2V0LT5hbGxvYyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkqaXRlbSA9IHNldC0+bGlzdFtzZXQtPmFsbG9jXS52YWw7CisJc2V0LT50cmFjZSA9IHNldC0+bGlzdFtzZXQtPmFsbG9jXS5hbGxvY19uZXh0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCBzZXROZXh0KHNldF90ICpzZXQsIElURU1fVFlQRSAqaXRlbSkKK3sKKwlpZiAoc2V0LT50cmFjZSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkqaXRlbSA9IHNldC0+bGlzdFtzZXQtPnRyYWNlXS52YWw7CisJc2V0LT50cmFjZSA9IHNldC0+bGlzdFtzZXQtPnRyYWNlXS5hbGxvY19uZXh0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCBzZXREZXN0cm95KHNldF90ICpzZXQpCit7CisJZHJtX2ZyZWUoc2V0LCBzaXplb2Yoc2V0X3QpLCBEUk1fTUVNX0RSSVZFUik7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEdMWCBIYXJkd2FyZSBEZXZpY2UgRHJpdmVyIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV2l0dGF3YXQgWWFtd29uZworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogV0lUVEFXQVQgWUFNV09ORywgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2RlZmluZSBJU0ZSRUUoYnB0cikgKChicHRyKS0+ZnJlZSkKKworbWVtSGVhcF90ICptbUluaXQoaW50IG9mcywKKwkJICBpbnQgc2l6ZSkKK3sKKwlQTWVtQmxvY2sgYmxvY2tzOworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9ja3MgPSAoVE1lbUJsb2NrICopZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwgRFJNX01FTV9EUklWRVIpOworCWlmIChibG9ja3MgIT0gTlVMTCkgeworCQlibG9ja3MtPm9mcyA9IG9mczsKKwkJYmxvY2tzLT5zaXplID0gc2l6ZTsKKwkJYmxvY2tzLT5mcmVlID0gMTsKKwkJcmV0dXJuIChtZW1IZWFwX3QgKilibG9ja3M7CisJfSBlbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKiBDaGVja3MgaWYgYSBwb2ludGVyICdiJyBpcyBwYXJ0IG9mIHRoZSBoZWFwICdoZWFwJyAqLworaW50IG1tQmxvY2tJbkhlYXAobWVtSGVhcF90ICpoZWFwLCBQTWVtQmxvY2sgYikKK3sKKwlUTWVtQmxvY2sgKnA7CisKKwlpZiAoaGVhcCA9PSBOVUxMIHx8IGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwID0gaGVhcDsKKwl3aGlsZSAocCAhPSBOVUxMICYmIHAgIT0gYikgeworCQlwID0gcC0+bmV4dDsKKwl9CisJaWYgKHAgPT0gYikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIFRNZW1CbG9jayogU2xpY2VCbG9jayhUTWVtQmxvY2sgKnAsIAorCQkJICAgICBpbnQgc3RhcnRvZnMsIGludCBzaXplLCAKKwkJCSAgICAgaW50IHJlc2VydmVkLCBpbnQgYWxpZ25tZW50KQoreworCVRNZW1CbG9jayAqbmV3YmxvY2s7CisKKwkvKiBicmVhayBsZWZ0ICovCisJaWYgKHN0YXJ0b2ZzID4gcC0+b2ZzKSB7CisJCW5ld2Jsb2NrID0gKFRNZW1CbG9jayopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mczsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gKHN0YXJ0b2ZzIC0gcC0+b2ZzKTsKKwkJbmV3YmxvY2stPmZyZWUgPSAxOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIGJyZWFrIHJpZ2h0ICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCW5ld2Jsb2NrID0gKFRNZW1CbG9jayopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mcyArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5mcmVlID0gMTsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQlwLT5zaXplID0gc2l6ZTsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCX0KKworCS8qIHAgPSBtaWRkbGUgYmxvY2sgKi8KKwlwLT5hbGlnbiA9IGFsaWdubWVudDsKKwlwLT5mcmVlID0gMDsKKwlwLT5yZXNlcnZlZCA9IHJlc2VydmVkOworCXJldHVybiBwOworfQorCitQTWVtQmxvY2sgbW1BbGxvY01lbSggbWVtSGVhcF90ICpoZWFwLCBpbnQgc2l6ZSwgaW50IGFsaWduMiwgaW50IHN0YXJ0U2VhcmNoKQoreworCWludCBtYXNrLHN0YXJ0b2ZzLCBlbmRvZnM7CisJVE1lbUJsb2NrICpwOworCQorCWlmIChoZWFwID09IE5VTEwgfHwgYWxpZ24yIDwgMCB8fCBzaXplIDw9IDApCisJCXJldHVybiBOVUxMOworCisJbWFzayA9ICgxIDw8IGFsaWduMiktMTsKKwlzdGFydG9mcyA9IDA7CisJcCA9IChUTWVtQmxvY2sgKiloZWFwOworCXdoaWxlIChwICE9IE5VTEwpIHsKKwkJaWYgKElTRlJFRShwKSkgeworCQkJc3RhcnRvZnMgPSAocC0+b2ZzICsgbWFzaykgJiB+bWFzazsKKwkJCWlmICggc3RhcnRvZnMgPCBzdGFydFNlYXJjaCApIHsKKwkJCQlzdGFydG9mcyA9IHN0YXJ0U2VhcmNoOworCQkJfQorCQkJZW5kb2ZzID0gc3RhcnRvZnMrc2l6ZTsKKwkJCWlmIChlbmRvZnMgPD0gKHAtPm9mcytwLT5zaXplKSkKKwkJCQlicmVhazsKKwkJfQorCQlwID0gcC0+bmV4dDsKKwl9CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IFNsaWNlQmxvY2socCxzdGFydG9mcyxzaXplLDAsbWFzaysxKTsKKwlwLT5oZWFwID0gaGVhcDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IEpvaW4yQmxvY2tzKFRNZW1CbG9jayAqcCkKK3sKKwlpZiAocC0+ZnJlZSAmJiBwLT5uZXh0ICYmIHAtPm5leHQtPmZyZWUpIHsKKwkJVE1lbUJsb2NrICpxID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSArPSBxLT5zaXplOworCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKFRNZW1CbG9jayksIERSTV9NRU1fRFJJVkVSKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbW1GcmVlTWVtKFBNZW1CbG9jayBiKQoreworCVRNZW1CbG9jayAqcCwgKnByZXY7CisKKwlpZiAoYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoYi0+aGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwID0gYi0+aGVhcDsKKwlwcmV2ID0gTlVMTDsKKwl3aGlsZSAocCAhPSBOVUxMICYmIHAgIT0gYikgeworCQlwcmV2ID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJfQorCWlmIChwID09IE5VTEwgfHwgcC0+ZnJlZSB8fCBwLT5yZXNlcnZlZCkKKwkJcmV0dXJuIC0xOworCisJcC0+ZnJlZSA9IDE7CisJSm9pbjJCbG9ja3MocCk7CisJaWYgKHByZXYpCisJSm9pbjJCbG9ja3MocHJldik7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MWVlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBzaXNfZHMuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEphbiAgNCAxMDowNTowNSAxOTk5IGJ5IHNjbGluQHNpcy5jb20udHcKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLCBJbmMuLCBIc2luQ2h1LCBUYWl3YW4uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBBdXRob3JzOgorICogICAgU3VuZy1DaGluZyBMaW4gPHNjbGluQHNpcy5jb20udHc+CisgKiAKKyAqLworCisjaWZuZGVmIF9fU0lTX0RTX0hfXworI2RlZmluZSBfX1NJU19EU19IX18KKworLyogU2V0IERhdGEgU3RydWN0dXJlICovCisKKyNkZWZpbmUgU0VUX1NJWkUgNTAwMAorCit0eXBlZGVmIHVuc2lnbmVkIGludCBJVEVNX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlJVEVNX1RZUEUgdmFsOworCWludCBhbGxvY19uZXh0LCBmcmVlX25leHQ7Cit9IGxpc3RfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGFsbG9jOworCWludCBmcmVlOworCWludCB0cmFjZTsKKwlsaXN0X2l0ZW1fdCBsaXN0W1NFVF9TSVpFXTsKK30gc2V0X3Q7CisKK3NldF90ICpzZXRJbml0KHZvaWQpOworaW50IHNldEFkZChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgaXRlbSk7CitpbnQgc2V0RGVsKHNldF90ICpzZXQsIElURU1fVFlQRSBpdGVtKTsKK2ludCBzZXRGaXJzdChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgKml0ZW0pOworaW50IHNldE5leHQoc2V0X3QgKnNldCwgSVRFTV9UWVBFICppdGVtKTsKK2ludCBzZXREZXN0cm95KHNldF90ICpzZXQpOworCisvKgorICogR0xYIEhhcmR3YXJlIERldmljZSBEcml2ZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXaXR0YXdhdCBZYW13b25nCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBXSVRUQVdBVCBZQU1XT05HLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCitzdHJ1Y3QgbWVtX2Jsb2NrX3QgeworCXN0cnVjdCBtZW1fYmxvY2tfdCAqbmV4dDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrX3QgKmhlYXA7CisJaW50IG9mcyxzaXplOworCWludCBhbGlnbjsKKwl1bnNpZ25lZCBpbnQgZnJlZToxOworCXVuc2lnbmVkIGludCByZXNlcnZlZDoxOworfTsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190IFRNZW1CbG9jazsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190ICpQTWVtQmxvY2s7CisKKy8qIGEgaGVhcCBpcyBqdXN0IHRoZSBmaXJzdCBibG9jayBpbiBhIGNoYWluICovCit0eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2tfdCBtZW1IZWFwX3Q7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBtbUJsb2NrU2l6ZShQTWVtQmxvY2sgYikKK3sKKwlyZXR1cm4gYi0+c2l6ZTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IG1tT2Zmc2V0KFBNZW1CbG9jayBiKQoreworCXJldHVybiBiLT5vZnM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbW1NYXJrUmVzZXJ2ZWQoUE1lbUJsb2NrIGIpCit7CisJYi0+cmVzZXJ2ZWQgPSAxOworfQorCisvKiAKKyAqIGlucHV0OiB0b3RhbCBzaXplIGluIGJ5dGVzCisgKiByZXR1cm46IGEgaGVhcCBwb2ludGVyIGlmIE9LLCBOVUxMIGlmIGVycm9yCisgKi8KK21lbUhlYXBfdCAqbW1Jbml0KCBpbnQgb2ZzLCBpbnQgc2l6ZSApOworCisvKgorICogQWxsb2NhdGUgJ3NpemUnIGJ5dGVzIHdpdGggMl5hbGlnbjIgYnl0ZXMgYWxpZ25tZW50LAorICogcmVzdHJpY3QgdGhlIHNlYXJjaCB0byBmcmVlIG1lbW9yeSBhZnRlciAnc3RhcnRTZWFyY2gnCisgKiBkZXB0aCBhbmQgYmFjayBidWZmZXJzIHNob3VsZCBiZSBpbiBkaWZmZXJlbnQgNG1iIGJhbmtzCisgKiB0byBnZXQgYmV0dGVyIHBhZ2UgaGl0cyBpZiBwb3NzaWJsZQorICogaW5wdXQ6CXNpemUgPSBzaXplIG9mIGJsb2NrCisgKiAgICAgICAJYWxpZ24yID0gMl5hbGlnbjIgYnl0ZXMgYWxpZ25tZW50CisgKgkJc3RhcnRTZWFyY2ggPSBsaW5lYXIgb2Zmc2V0IGZyb20gc3RhcnQgb2YgaGVhcCB0byBiZWdpbiBzZWFyY2gKKyAqIHJldHVybjogcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCAwIGlmIGVycm9yCisgKi8KK1BNZW1CbG9jayBtbUFsbG9jTWVtKCBtZW1IZWFwX3QgKmhlYXAsIGludCBzaXplLCBpbnQgYWxpZ24yLCBpbnQgc3RhcnRTZWFyY2ggKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiB0aGUgYmxvY2sgJ2InIGlzIHBhcnQgb2YgdGhlIGhlYXAgJ2hlYXAnCisgKi8KK2ludCBtbUJsb2NrSW5IZWFwKCBQTWVtQmxvY2sgaGVhcCwgUE1lbUJsb2NrIGIgKTsKKworLyoKKyAqIEZyZWUgYmxvY2sgc3RhcnRzIGF0IG9mZnNldAorICogaW5wdXQ6IHBvaW50ZXIgdG8gYSBibG9jaworICogcmV0dXJuOiAwIGlmIE9LLCAtMSBpZiBlcnJvcgorICovCitpbnQgbW1GcmVlTWVtKCBQTWVtQmxvY2sgYiApOworCisvKiBGb3IgZGVidWdpbmcgcHVycG9zZS4gKi8KK3ZvaWQgbW1EdW1wTWVtSW5mbyggbWVtSGVhcF90ICptbUluaXQgKTsKKworI2VuZGlmIC8qIF9fU0lTX0RTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMGM1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qIHNpc19tbS5jIC0tIFByaXZhdGUgaGVhZGVyIGZvciBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gSmFuICA0IDEwOjA1OjA1IDE5OTkgYnkgc2NsaW5Ac2lzLmNvbS50dworICoKKyAqIENvcHlyaWdodCAyMDAwIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAsIEluYy4sIEhzaW5DaHUsIFRhaXdhbi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEF1dGhvcnM6CisgKiAgICBTdW5nLUNoaW5nIExpbiA8c2NsaW5Ac2lzLmNvbS50dz4KKyAqIAorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAic2lzX2RybS5oIgorI2luY2x1ZGUgInNpc19kcnYuaCIKKyNpbmNsdWRlICJzaXNfZHMuaCIKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQorI2luY2x1ZGUgPHZpZGVvL3Npc2ZiLmg+CisjZW5kaWYKKworI2RlZmluZSBNQVhfQ09OVEVYVCAxMDAKKyNkZWZpbmUgVklERU9fVFlQRSAwIAorI2RlZmluZSBBR1BfVFlQRSAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdXNlZDsKKwlpbnQgY29udGV4dDsKKwlzZXRfdCAqc2V0c1syXTsgLyogMCBmb3IgdmlkZW8sIDEgZm9yIEFHUCAqLworfSBzaXNfY29udGV4dF90OworCitzdGF0aWMgc2lzX2NvbnRleHRfdCBnbG9iYWxfcHByaXZbTUFYX0NPTlRFWFRdOworCisKK3N0YXRpYyBpbnQgYWRkX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUOyBpKyspIHsKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmIGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpCisJCXsKKwkJCXJldHZhbCA9IHNldEFkZChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZGVsX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7ICAKKwlpbnQgaSwgcmV0dmFsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKSB7CisJCWlmIChnbG9iYWxfcHByaXZbaV0udXNlZCAmJiBnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KQorCQl7CisJCQlyZXR2YWwgPSBzZXREZWwoZ2xvYmFsX3Bwcml2W2ldLnNldHNbdHlwZV0sIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBmYiBtYW5hZ2VtZW50IHZpYSBmYiBkZXZpY2UgKi8gCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX1NJUykKKworc3RhdGljIGludCBzaXNfZmJfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpc19mYl9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCWRybV9zaXNfbWVtX3QgZmI7CisJc3RydWN0IHNpc19tZW1yZXEgcmVxOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlpbnQgcmV0dmFsID0gMDsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgYXJncCwgc2l6ZW9mKGZiKSk7CisKKwlyZXEuc2l6ZSA9IGZiLnNpemU7CisJc2lzX21hbGxvYygmcmVxKTsKKwlpZiAocmVxLm9mZnNldCkgeworCQkvKiBUT0RPICovCisJCWZiLm9mZnNldCA9IHJlcS5vZmZzZXQ7CisJCWZiLmZyZWUgPSByZXEub2Zmc2V0OworCQlpZiAoIWFkZF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU9fVFlQRSwgZmIuZnJlZSkpIHsKKwkJCURSTV9ERUJVRygiYWRkaW5nIHRvIGFsbG9jYXRpb24gc2V0IGZhaWxzXG4iKTsKKwkJCXNpc19mcmVlKHJlcS5vZmZzZXQpOworCQkJcmV0dmFsID0gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlIHsgIAorCQlmYi5vZmZzZXQgPSAwOworCQlmYi5zaXplID0gMDsKKwkJZmIuZnJlZSA9IDA7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBmYiwgc2l6ZW9mKGZiKSk7CisKKwlEUk1fREVCVUcoImFsbG9jIGZiLCBzaXplID0gJWQsIG9mZnNldCA9ICVkXG4iLCBmYi5zaXplLCByZXEub2Zmc2V0KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2ZiX2ZyZWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlkcm1fc2lzX21lbV90IGZiOworCWludCByZXR2YWwgPSAwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoZmIpKTsKKworCWlmICghZmIuZnJlZSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWlmICghZGVsX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSURFT19UWVBFLCBmYi5mcmVlKSkKKwkJcmV0dmFsID0gRFJNX0VSUihFSU5WQUwpOworCXNpc19mcmVlKCh1MzIpZmIuZnJlZSk7CisKKwlEUk1fREVCVUcoImZyZWUgZmIsIG9mZnNldCA9ICVsdVxuIiwgZmIuZnJlZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZWxzZQorCisvKiBDYWxsZWQgYnkgdGhlIFggU2VydmVyIHRvIGluaXRpYWxpemUgdGhlIEZCIGhlYXAuICBBbGxvY2F0aW9ucyB3aWxsIGZhaWwKKyAqIHVubGVzcyB0aGlzIGlzIGNhbGxlZC4gIE9mZnNldCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFwIGZyb20gdGhlCisgKiBmcmFtZWJ1ZmZlciBvZmZzZXQgKE1heFhGQk1lbSBpbiBYRnJlZTg2KS4KKyAqCisgKiBNZW1vcnkgbGF5b3V0IGFjY29yZGluZyB0byBUaG9tYXMgV2luaXNjaG9mZXI6CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfEREREREREREREREREREREREREREREREREREREREfEhISEh8Q0NDQ0NDQ0NDQ0N8CisgKgorICogICAgWCBkcml2ZXIvc2lzZmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFctICAgQ29tbWFuZC0KKyAqICBmcmFtZWJ1ZmZlciBtZW1vcnkgICAgICAgICAgIERSSSBoZWFwICAgICAgICAgICBDdXJzb3IgICBxdWV1ZQorICovCitzdGF0aWMgaW50IHNpc19mYl9pbml0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfZmJfdCBmYjsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgKGRybV9zaXNfZmJfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoZmIpKTsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBkcm1fY2FsbG9jKDEsIHNpemVvZihkcm1fc2lzX3ByaXZhdGVfdCksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQlyZXR1cm4gRU5PTUVNOworCX0KKworCWlmIChkZXZfcHJpdi0+RkJIZWFwICE9IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlkZXZfcHJpdi0+RkJIZWFwID0gbW1Jbml0KGZiLm9mZnNldCwgZmIuc2l6ZSk7CisKKwlEUk1fREVCVUcoIm9mZnNldCA9ICV1LCBzaXplID0gJXUiLCBmYi5vZmZzZXQsIGZiLnNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2ZiX2FsbG9jKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fc2lzX21lbV90IGZiOworCVBNZW1CbG9jayBibG9jazsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMIHx8IGRldl9wcml2LT5GQkhlYXAgPT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKyAgCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCBhcmdwLCBzaXplb2YoZmIpKTsKKyAgCisJYmxvY2sgPSBtbUFsbG9jTWVtKGRldl9wcml2LT5GQkhlYXAsIGZiLnNpemUsIDAsIDApOworCWlmIChibG9jaykgeworCQkvKiBUT0RPICovCisJCWZiLm9mZnNldCA9IGJsb2NrLT5vZnM7CisJCWZiLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPX1RZUEUsIGZiLmZyZWUpKSB7CisJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CisJCQltbUZyZWVNZW0oKFBNZW1CbG9jaylmYi5mcmVlKTsKKwkJCXJldHZhbCA9IERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCWZiLm9mZnNldCA9IDA7CisJCWZiLnNpemUgPSAwOworCQlmYi5mcmVlID0gMDsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIGZiLCBzaXplb2YoZmIpKTsKKworCURSTV9ERUJVRygiYWxsb2MgZmIsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsIGZiLnNpemUsIGZiLm9mZnNldCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNpc19mYl9mcmVlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfbWVtX3QgZmI7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCB8fCBkZXZfcHJpdi0+RkJIZWFwID09IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmIsIChkcm1fc2lzX21lbV90IF9fdXNlciAqKWRhdGEsIHNpemVvZihmYikpOworCisJaWYgKCFtbUJsb2NrSW5IZWFwKGRldl9wcml2LT5GQkhlYXAsIChQTWVtQmxvY2spZmIuZnJlZSkpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlpZiAoIWRlbF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU9fVFlQRSwgZmIuZnJlZSkpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJbW1GcmVlTWVtKChQTWVtQmxvY2spZmIuZnJlZSk7CisKKwlEUk1fREVCVUcoImZyZWUgZmIsIGZyZWUgPSAweCVseFxuIiwgZmIuZnJlZSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qIGFncCBtZW1vcnkgbWFuYWdlbWVudCAqLyAKKworc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2luaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19hZ3BfdCBhZ3A7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gZHJtX2NhbGxvYygxLCBzaXplb2YoZHJtX3Npc19wcml2YXRlX3QpLAorCQkgICAgRFJNX01FTV9EUklWRVIpOworCQlkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQkJcmV0dXJuIEVOT01FTTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPkFHUEhlYXAgIT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhZ3AsIChkcm1fc2lzX2FncF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihhZ3ApKTsKKworCWRldl9wcml2LT5BR1BIZWFwID0gbW1Jbml0KGFncC5vZmZzZXQsIGFncC5zaXplKTsKKworCURSTV9ERUJVRygib2Zmc2V0ID0gJXUsIHNpemUgPSAldSIsIGFncC5vZmZzZXQsIGFncC5zaXplKTsKKyAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2lvY3RsX2FncF9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fc2lzX21lbV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJZHJtX3Npc19tZW1fdCBhZ3A7CisJUE1lbUJsb2NrIGJsb2NrOworCWludCByZXR2YWwgPSAwOworICAgCisJaWYgKGRldl9wcml2ID09IE5VTEwgfHwgZGV2X3ByaXYtPkFHUEhlYXAgPT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKyAgCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgYXJncCwgc2l6ZW9mKGFncCkpOworICAKKwlibG9jayA9IG1tQWxsb2NNZW0oZGV2X3ByaXYtPkFHUEhlYXAsIGFncC5zaXplLCAwLCAwKTsKKwlpZiAoYmxvY2spIHsKKwkJLyogVE9ETyAqLworCQlhZ3Aub2Zmc2V0ID0gYmxvY2stPm9mczsKKwkJYWdwLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBBR1BfVFlQRSwgYWdwLmZyZWUpKSB7CisJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CisJCQltbUZyZWVNZW0oKFBNZW1CbG9jaylhZ3AuZnJlZSk7CisJCQlyZXR2YWwgPSAtMTsKKwkJfQorCX0gZWxzZSB7ICAKKwkJYWdwLm9mZnNldCA9IDA7CisJCWFncC5zaXplID0gMDsKKwkJYWdwLmZyZWUgPSAwOworCX0KKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgYWdwLCBzaXplb2YoYWdwKSk7CisKKwlEUk1fREVCVUcoImFsbG9jIGFncCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgYWdwLnNpemUsIGFncC5vZmZzZXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2ZyZWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19tZW1fdCBhZ3A7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCB8fCBkZXZfcHJpdi0+QUdQSGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgKGRybV9zaXNfbWVtX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGFncCkpOworCisJaWYgKCFtbUJsb2NrSW5IZWFwKGRldl9wcml2LT5BR1BIZWFwLCAoUE1lbUJsb2NrKWFncC5mcmVlKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCW1tRnJlZU1lbSgoUE1lbUJsb2NrKWFncC5mcmVlKTsKKwlpZiAoIWRlbF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUF9UWVBFLCBhZ3AuZnJlZSkpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlEUk1fREVCVUcoImZyZWUgYWdwLCBmcmVlID0gMHglbHhcbiIsIGFncC5mcmVlKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2lzX2luaXRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVCA7IGkrKykgeworCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IE1BWF9DT05URVhUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVCA7IGkrKykgeworCQkJaWYgKCFnbG9iYWxfcHByaXZbaV0udXNlZCkgeworCQkJCWdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID0gY29udGV4dDsKKwkJCQlnbG9iYWxfcHByaXZbaV0udXNlZCA9IDE7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF0gPSBzZXRJbml0KCk7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV0gPSBzZXRJbml0KCk7CisJCQkJRFJNX0RFQlVHKCJpbml0IGFsbG9jYXRpb24gc2V0LCBzb2NrZXQ9JWQsICIKKwkJCQkgICAgImNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKChpID49IE1BWF9DT05URVhUKSB8fCAoZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF0gPT0gTlVMTCkgfHwKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uc2V0c1sxXSA9PSBOVUxMKSkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJCisJcmV0dXJuIDE7Cit9CisKK2ludCBzaXNfZmluYWxfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE1BWF9DT05URVhUOyBpKyspIHsKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmCisJCSAgICAoZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA8IE1BWF9DT05URVhUKSB7CisJCXNldF90ICpzZXQ7CisJCXVuc2lnbmVkIGludCBpdGVtOworCQlpbnQgcmV0dmFsOworCisJCURSTV9ERUJVRygiZmluZCBzb2NrZXQgJWQsIGNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CisKKwkJLyogVmlkZW8gTWVtb3J5ICovCisJCXNldCA9IGdsb2JhbF9wcHJpdltpXS5zZXRzWzBdOworCQlyZXR2YWwgPSBzZXRGaXJzdChzZXQsICZpdGVtKTsKKwkJd2hpbGUgKHJldHZhbCkgeworCQkJRFJNX0RFQlVHKCJmcmVlIHZpZGVvIG1lbW9yeSAweCV4XG4iLCBpdGVtKTsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQorCQkJc2lzX2ZyZWUoaXRlbSk7CisjZWxzZQorCQkJbW1GcmVlTWVtKChQTWVtQmxvY2spaXRlbSk7CisjZW5kaWYKKwkJCXJldHZhbCA9IHNldE5leHQoc2V0LCAmaXRlbSk7CisJCX0KKwkJc2V0RGVzdHJveShzZXQpOworCisJCS8qIEFHUCBNZW1vcnkgKi8KKwkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV07CisJCXJldHZhbCA9IHNldEZpcnN0KHNldCwgJml0ZW0pOworCQl3aGlsZSAocmV0dmFsKSB7CisJCQlEUk1fREVCVUcoImZyZWUgYWdwIG1lbW9yeSAweCV4XG4iLCBpdGVtKTsKKwkJCW1tRnJlZU1lbSgoUE1lbUJsb2NrKWl0ZW0pOworCQkJcmV0dmFsID0gc2V0TmV4dChzZXQsICZpdGVtKTsKKwkJfQorCQlzZXREZXN0cm95KHNldCk7CisKKwkJZ2xvYmFsX3Bwcml2W2ldLnVzZWQgPSAwOwkgIAorICAgICAgICB9CisJCisJcmV0dXJuIDE7Cit9CisKK2RybV9pb2N0bF9kZXNjX3Qgc2lzX2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9BTExPQyldICA9IHsgc2lzX2ZiX2FsbG9jLCAgICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9GUkVFKV0gICA9IHsgc2lzX2ZiX2ZyZWUsICAgICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfSU5JVCldICA9IHsgc2lzX2lvY3RsX2FncF9pbml0LCAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfQUxMT0MpXSA9IHsgc2lzX2lvY3RsX2FncF9hbGxvYywgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfRlJFRSldICA9IHsgc2lzX2lvY3RsX2FncF9mcmVlLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9JTklUKV0gICA9IHsgc2lzX2ZiX2luaXQsICAgICAgICAgMSwgMSB9Cit9OworCitpbnQgc2lzX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHNpc19pb2N0bHMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3OTQzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogdGRmeF9kcnYuYyAtLSB0ZGZ4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFRodSBPY3QgIDcgMTA6Mzg6MzIgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIERhcnlsbCBTdHJhdXNzIDxkYXJ5bGxAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ0ZGZ4X2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJdGRmeF9QQ0lfSURTCit9OworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX01UUlIsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRkZnhfaW5pdCh2b2lkKQoreworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRkZnhfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0ZGZ4X2luaXQpOworbW9kdWxlX2V4aXQodGRmeF9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTgyYTNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIHRkZnguaCAtLSAzZGZ4IERSTSB0ZW1wbGF0ZSBjdXN0b21pemF0aW9uIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogV2VkIEZlYiAxNCAxMjozMjozMiAyMDAxIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fVERGWF9IX18KKyNkZWZpbmUgX19UREZYX0hfXworCisvKiBUaGlzIHJlbWFpbnMgY29uc3RhbnQgZm9yIGFsbCBEUk0gdGVtcGxhdGUgZmlsZXMuCisgKi8KKyNkZWZpbmUgRFJNKHgpIHRkZnhfIyN4CisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJ0ZGZ4IgorI2RlZmluZSBEUklWRVJfREVTQwkJIjNkZnggQmFuc2hlZS9Wb29kb28zKyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAxMDIxNiIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkwCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHMxMjg2LmMgYi9kcml2ZXJzL2NoYXIvZHMxMjg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NWNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kczEyODYuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIERTMTI4NiBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBSYWxmIEJhZWNobGUKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuCisgKgorICogVGhpcyBkcml2ZXIgYWxsb3dzIHVzZSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIChidWlsdCBpbnRvIG5lYXJseSBhbGwKKyAqIGNvbXB1dGVycykgZnJvbSB1c2VyIHNwYWNlLiBJdCBleHBvcnRzIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2Ugc3VwcG9ydGluZworICogdmFyaW91cyBpb2N0bCgpIGFuZCBhbHNvIHRoZSAvcHJvYy9ydGMgcHNldWRvLWZpbGUgZm9yIHN0YXR1cworICogaW5mb3JtYXRpb24uCisgKgorICogVGhlIGlvY3RscyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGludGVycnVwdCBiZWhhdmlvdXIgYW5kIGdlbmVyYXRpb24gcmF0ZQorICogZnJvbSB0aGUgUlRDIHZpYSBJUlEgOC4gVGhlbiB0aGUgL2Rldi9ydGMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIG1ha2UKKyAqIHVzZSBvZiB0aGVzZSB0aW1lciBpbnRlcnJ1cHRzLCBiZSB0aGV5IGludGVydmFsIG9yIGFsYXJtIGJhc2VkLgorICoKKyAqIFRoZSAvZGV2L3J0YyBpbnRlcmZhY2Ugd2lsbCBibG9jayBvbiByZWFkcyB1bnRpbCBhbiBpbnRlcnJ1cHQgaGFzIGJlZW4KKyAqIHJlY2VpdmVkLiBJZiBhIFJUQyBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgaGFwcGVuZWQsIGl0IHdpbGwgb3V0cHV0IGFuCisgKiB1bnNpZ25lZCBsb25nIGFuZCB0aGVuIGJsb2NrLiBUaGUgb3V0cHV0IHZhbHVlIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQKKyAqIHN0YXR1cyBpbiB0aGUgbG93IGJ5dGUgYW5kIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBzaW5jZSB0aGUgbGFzdCByZWFkCisgKiBpbiB0aGUgcmVtYWluaW5nIGhpZ2ggYnl0ZXMuIFRoZSAvZGV2L3J0YyBpbnRlcmZhY2UgY2FuIGFsc28gYmUgdXNlZCB3aXRoCisgKiB0aGUgc2VsZWN0KDIpIGNhbGwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RzMTI4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIERTMTI4Nl9WRVJTSU9OCQkiMS4wIgorCisvKgorICoJV2Ugc3BvbmdlIGEgbWlub3Igb2ZmIG9mIHRoZSBtaXNjIG1ham9yLiBObyBuZWVkIHNsdXJwaW5nCisgKgl1cCBhbm90aGVyIHZhbHVhYmxlIG1ham9yIGRldiBudW1iZXIgZm9yIHRoaXMuIElmIHlvdSBhZGQKKyAqCWFuIGlvY3RsLCBtYWtlIHN1cmUgeW91IGRvbid0IGNvbmZsaWN0IHdpdGggU1BBUkMncyBSVEMKKyAqCWlvY3Rscy4KKyAqLworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZHMxMjg2X3dhaXQpOworCitzdGF0aWMgc3NpemVfdCBkczEyODZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgaW50IGRzMTI4Nl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkczEyODZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CisKK3N0YXRpYyB2b2lkIGRzMTI4Nl9nZXRfYWxtX3RpbWUgKHN0cnVjdCBydGNfdGltZSAqYWxtX3RtKTsKK3N0YXRpYyB2b2lkIGRzMTI4Nl9nZXRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSk7CitzdGF0aWMgaW50IGRzMTI4Nl9zZXRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBkczEyODZfaXNfdXBkYXRpbmcodm9pZCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHMxMjg2X2xvY2spOworCitzdGF0aWMgaW50IGRzMTI4Nl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKKy8qCisgKglCaXRzIGluIHJ0Y19zdGF0dXMuICg3IGJpdHMgb2Ygcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbikKKyAqLworCisjZGVmaW5lIFJUQ19JU19PUEVOCQkweDAxCS8qIG1lYW5zIC9kZXYvcnRjIGlzIGluIHVzZQkqLworI2RlZmluZSBSVENfVElNRVJfT04JCTB4MDIJLyogbWlzc2VkIGlycSB0aW1lciBhY3RpdmUJKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHMxMjg2X3N0YXR1czsJLyogYml0bWFwcGVkIHN0YXR1cyBieXRlLgkqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkYXlzX2luX21vW10gPSB7CisJMCwgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQorfTsKKworLyoKKyAqCU5vdyBhbGwgdGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHRoYXQgd2UgZXhwb3J0LgorICovCisKK3N0YXRpYyBzc2l6ZV90IGRzMTI4Nl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkczEyODZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CS8qIE1hc2sgYWxhcm0gaW50LiBlbmFiLiBiaXQJKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCB8PSAgUlRDX1RETTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX0FJRV9PTjoJLyogQWxsb3cgYWxhcm0gaW50ZXJydXB0cy4JKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCAmPSAgflJUQ19URE07CisJCXJ0Y193cml0ZSh2YWwsIFJUQ19DTUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19XSUVfT0ZGOgkvKiBNYXNrIHdhdGNoZG9nIGludC4gZW5hYi4gYml0CSovCisJeworCQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJCXVuc2lnbmVkIGNoYXIgdmFsOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisJCXZhbCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCQl2YWwgfD0gUlRDX1dBTTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1dJRV9PTjoJLyogQWxsb3cgd2F0Y2hkb2cgaW50ZXJydXB0cy4JKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCAmPSB+UlRDX1dBTTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX0FMTV9SRUFEOgkvKiBSZWFkIHRoZSBwcmVzZW50IGFsYXJtIHRpbWUgKi8KKwl7CisJCS8qCisJCSAqIFRoaXMgcmV0dXJucyBhIHN0cnVjdCBydGNfdGltZS4gUmVhZGluZyA+PSAweGMwCisJCSAqIG1lYW5zICJkb24ndCBjYXJlIiBvciAibWF0Y2ggYWxsIi4gT25seSB0aGUgdG1faG91ciwKKwkJICogdG1fbWluLCBhbmQgdG1fc2VjIHZhbHVlcyBhcmUgZmlsbGVkIGluLgorCQkgKi8KKworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yod3RpbWUpKTsKKwkJZHMxMjg2X2dldF9hbG1fdGltZSgmd3RpbWUpOworCQlicmVhazsKKwl9CisJY2FzZSBSVENfQUxNX1NFVDoJLyogU3RvcmUgYSB0aW1lIGludG8gdGhlIGFsYXJtICovCisJeworCQkvKgorCQkgKiBUaGlzIGV4cGVjdHMgYSBzdHJ1Y3QgcnRjX3RpbWUuIFdyaXRpbmcgMHhmZiBtZWFucworCQkgKiAiZG9uJ3QgY2FyZSIgb3IgIm1hdGNoIGFsbCIuIE9ubHkgdGhlIHRtX2hvdXIsCisJCSAqIHRtX21pbiBhbmQgdG1fc2VjIGFyZSB1c2VkLgorCQkgKi8KKwkJdW5zaWduZWQgY2hhciBocnMsIG1pbiwgc2VjOworCQlzdHJ1Y3QgcnRjX3RpbWUgYWxtX3RtOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbG1fdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlocnMgPSBhbG1fdG0udG1faG91cjsKKwkJbWluID0gYWxtX3RtLnRtX21pbjsKKworCQlpZiAoaHJzID49IDI0KQorCQkJaHJzID0gMHhmZjsKKworCQlpZiAobWluID49IDYwKQorCQkJbWluID0gMHhmZjsKKworCQlCSU5fVE9fQkNEKHNlYyk7CisJCUJJTl9UT19CQ0QobWluKTsKKwkJQklOX1RPX0JDRChocnMpOworCisJCXNwaW5fbG9jaygmZHMxMjg2X2xvY2spOworCQlydGNfd3JpdGUoaHJzLCBSVENfSE9VUlNfQUxBUk0pOworCQlydGNfd3JpdGUobWluLCBSVENfTUlOVVRFU19BTEFSTSk7CisJCXNwaW5fdW5sb2NrKCZkczEyODZfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLworCXsKKwkJbWVtc2V0KCZ3dGltZSwgMCwgc2l6ZW9mKHd0aW1lKSk7CisJCWRzMTI4Nl9nZXRfdGltZSgmd3RpbWUpOworCQlicmVhazsKKwl9CisJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCisJeworCQlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gZHMxMjg2X3NldF90aW1lKCZydGNfdG0pOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBkczEyODZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2tfaXJxKCZkczEyODZfbG9jayk7CisKKwlpZiAoZHMxMjg2X3N0YXR1cyAmIFJUQ19JU19PUEVOKQorCQlnb3RvIG91dF9idXN5OworCisJZHMxMjg2X3N0YXR1cyB8PSBSVENfSVNfT1BFTjsKKworCXNwaW5fdW5sb2NrX2lycSgmZHMxMjg2X2xvY2spOworCXJldHVybiAwOworCitvdXRfYnVzeToKKwlzcGluX2xvY2tfaXJxKCZkczEyODZfbG9jayk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBkczEyODZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkczEyODZfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTI4Nl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmZHMxMjg2X3dhaXQsIHdhaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkczEyODZfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBkczEyODZfcmVhZCwKKwkucG9sbAkJPSBkczEyODZfcG9sbCwKKwkuaW9jdGwJCT0gZHMxMjg2X2lvY3RsLAorCS5vcGVuCQk9IGRzMTI4Nl9vcGVuLAorCS5yZWxlYXNlCT0gZHMxMjg2X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZHMxMjg2X2Rldj0KK3sKKwkubWlub3IJPSBSVENfTUlOT1IsCisJLm5hbWUJPSAicnRjIiwKKwkuZm9wcwk9ICZkczEyODZfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTI4Nl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0lORk8gIkRTMTI4NiBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIHYlc1xuIiwgRFMxMjg2X1ZFUlNJT04pOworCisJZXJyID0gbWlzY19yZWdpc3RlcigmZHMxMjg2X2Rldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9ydGMiLCAwLCAwLCBkczEyODZfcmVhZF9wcm9jLCBOVUxMKSkgeworCQllcnIgPSAtRU5PTUVNOworCisJCWdvdG8gb3V0X2RlcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9kZXJlZ2lzdGVyOgorCW1pc2NfZGVyZWdpc3RlcigmZHMxMjg2X2Rldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMjg2X2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3J0YyIsIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlcigmZHMxMjg2X2Rldik7Cit9CisKK3N0YXRpYyBjaGFyICpkYXlzW10gPSB7CisJIioqKiIsICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiCit9OworCisvKgorICoJSW5mbyBleHBvcnRlZCB2aWEgIi9wcm9jL3J0YyIuCisgKi8KK3N0YXRpYyBpbnQgZHMxMjg2X3Byb2Nfb3V0cHV0KGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwLCAqczsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdW5zaWduZWQgY2hhciBodW5kcmVkdGgsIG1vbnRoLCBjbWQsIGFtb2RlOworCisJcCA9IGJ1ZjsKKworCWRzMTI4Nl9nZXRfdGltZSgmdG0pOworCWh1bmRyZWR0aCA9IHJ0Y19yZWFkKFJUQ19IVU5EUkVEVEhfU0VDT05EKTsKKwlCQ0RfVE9fQklOKGh1bmRyZWR0aCk7CisKKwlwICs9IHNwcmludGYocCwKKwkgICAgICAgICAgICAgInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkLiUwMmRcbiIKKwkgICAgICAgICAgICAgInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iLAorCQkgICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjLCBodW5kcmVkdGgsCisJCSAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXkpOworCisJLyoKKwkgKiBXZSBpbXBsaWNpdGx5IGFzc3VtZSAyNGhyIG1vZGUgaGVyZS4gQWxhcm0gdmFsdWVzID49IDB4YzAgd2lsbAorCSAqIG1hdGNoIGFueSB2YWx1ZSBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZpZWxkLiBWYWx1ZXMgdGhhdCBhcmUKKwkgKiBncmVhdGVyIHRoYW4gYSB2YWxpZCB0aW1lLCBidXQgbGVzcyB0aGFuIDB4YzAgc2hvdWxkbid0IGFwcGVhci4KKwkgKi8KKwlkczEyODZfZ2V0X2FsbV90aW1lKCZ0bSk7CisJcCArPSBzcHJpbnRmKHAsICJhbGFybVx0XHQ6ICVzICIsIGRheXNbdG0udG1fd2RheV0pOworCWlmICh0bS50bV9ob3VyIDw9IDI0KQorCQlwICs9IHNwcmludGYocCwgIiUwMmQ6IiwgdG0udG1faG91cik7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqOiIpOworCisJaWYgKHRtLnRtX21pbiA8PSA1OSkKKwkJcCArPSBzcHJpbnRmKHAsICIlMDJkXG4iLCB0bS50bV9taW4pOworCWVsc2UKKwkJcCArPSBzcHJpbnRmKHAsICIqKlxuIik7CisKKwltb250aCA9IHJ0Y19yZWFkKFJUQ19NT05USCk7CisJcCArPSBzcHJpbnRmKHAsCisJICAgICAgICAgICAgICJvc2NpbGxhdG9yXHQ6ICVzXG4iCisJICAgICAgICAgICAgICJzcXVhcmVfd2F2ZVx0OiAlc1xuIiwKKwkgICAgICAgICAgICAgKG1vbnRoICYgUlRDX0VPU0MpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkgICAgICAgICAgICAgKG1vbnRoICYgUlRDX0VTUVcpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisKKwlhbW9kZSA9ICgocnRjX3JlYWQoUlRDX01JTlVURVNfQUxBUk0pICYgMHg4MCkgPj4gNSkgfAorCSAgICAgICAgKChydGNfcmVhZChSVENfSE9VUlNfQUxBUk0pICYgMHg4MCkgPj4gNikgfAorCSAgICAgICAgKChydGNfcmVhZChSVENfREFZX0FMQVJNKSAmIDB4ODApID4+IDcpOworCWlmIChhbW9kZSA9PSA3KSAgICAgIHMgPSAiZWFjaCBtaW51dGUiOworCWVsc2UgaWYgKGFtb2RlID09IDMpIHMgPSAibWludXRlcyBtYXRjaCI7CisJZWxzZSBpZiAoYW1vZGUgPT0gMSkgcyA9ICJob3VycyBhbmQgbWludXRlcyBtYXRjaCI7CisJZWxzZSBpZiAoYW1vZGUgPT0gMCkgcyA9ICJkYXlzLCBob3VycyBhbmQgbWludXRlcyBtYXRjaCI7CisJZWxzZSAgICAgICAgICAgICAgICAgcyA9ICJpbnZhbGlkIjsKKwlwICs9IHNwcmludGYocCwgImFsYXJtX21vZGVcdDogJXNcbiIsIHMpOworCisJY21kID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJcCArPSBzcHJpbnRmKHAsCisJICAgICAgICAgICAgICJhbGFybV9lbmFibGVcdDogJXNcbiIKKwkgICAgICAgICAgICAgIndkb2dfYWxhcm1cdDogJXNcbiIKKwkgICAgICAgICAgICAgImFsYXJtX21hc2tcdDogJXNcbiIKKwkgICAgICAgICAgICAgIndkb2dfYWxhcm1fbWFza1x0OiAlc1xuIgorCSAgICAgICAgICAgICAiaW50ZXJydXB0X21vZGVcdDogJXNcbiIKKwkgICAgICAgICAgICAgIklOVEJfbW9kZVx0OiAlc19hY3RpdmVcbiIKKwkgICAgICAgICAgICAgImludGVycnVwdF9waW5zXHQ6ICVzXG4iLAorCQkgICAgIChjbWQgJiBSVENfVERGKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICAoY21kICYgUlRDX1dBRikgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGNtZCAmIFJUQ19URE0pID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkJICAgICAoY21kICYgUlRDX1dBTSkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAgIChjbWQgJiBSVENfUFVfTFZMKSA/ICJwdWxzZSIgOiAibGV2ZWwiLAorCQkgICAgIChjbWQgJiBSVENfSUJIX0xPKSA/ICJsb3ciIDogImhpZ2giLAorCSAgICAgICAgICAgICAoY21kICYgUlRDX0lQU1cpID8gInVuc3dhcHBlZCIgOiAic3dhcHBlZCIpOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGRzMTI4Nl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gZHMxMjg2X3Byb2Nfb3V0cHV0IChwYWdlKTsKKwlpZiAobGVuIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKwlsZW4gLT0gb2ZmOworCWlmIChsZW4+Y291bnQpCisJCWxlbiA9IGNvdW50OworCWlmIChsZW48MCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgYSBjbG9jayB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3MKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGRzMTI4Nl9pc191cGRhdGluZyh2b2lkKQoreworCXJldHVybiBydGNfcmVhZChSVENfQ01EKSAmIFJUQ19URTsKK30KKworCitzdGF0aWMgdm9pZCBkczEyODZfZ2V0X3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2w7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdWlwX3dhdGNoZG9nID0gamlmZmllczsKKworCS8qCisJICogcmVhZCBSVEMgb25jZSBhbnkgdXBkYXRlIGluIHByb2dyZXNzIGlzIGRvbmUuIFRoZSB1cGRhdGUKKwkgKiBjYW4gdGFrZSBqdXN0IG92ZXIgMm1zLiBXZSB3YWl0IDEwIHRvIDIwbXMuIFRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiB0byBwb2xsLXdhaXQgKHVwIHRvIDFzIC0gZWVjY2NoKSBmb3IgdGhlIGZhbGxpbmcgZWRnZSBvZiBSVENfVUlQLgorCSAqIElmIHlvdSBuZWVkIHRvIGtub3cgKmV4YWN0bHkqIHdoZW4gYSBzZWNvbmQgaGFzIHN0YXJ0ZWQsIGVuYWJsZQorCSAqIHBlcmlvZGljIHVwZGF0ZSBjb21wbGV0ZSBpbnRlcnJ1cHRzLCAodmlhIGlvY3RsKSBhbmQgdGhlbgorCSAqIGltbWVkaWF0ZWx5IHJlYWQgL2Rldi9ydGMgd2hpY2ggd2lsbCBibG9jayB1bnRpbCB5b3UgZ2V0IHRoZSBJUlEuCisJICogT25jZSB0aGUgcmVhZCBjbGVhcnMsIHJlYWQgdGhlIFJUQyB0aW1lIChhZ2FpbiB2aWEgaW9jdGwpLiBFYXN5LgorCSAqLworCisJaWYgKGRzMTI4Nl9pc191cGRhdGluZygpICE9IDApCisJCXdoaWxlIChqaWZmaWVzIC0gdWlwX3dhdGNoZG9nIDwgMipIWi8xMDApCisJCQliYXJyaWVyKCk7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCisJICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKKwkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCXNhdmVfY29udHJvbCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCXJ0Y193cml0ZSgoc2F2ZV9jb250cm9sfFJUQ19URSksIFJUQ19DTUQpOworCisJcnRjX3RtLT50bV9zZWMgPSBydGNfcmVhZChSVENfU0VDT05EUyk7CisJcnRjX3RtLT50bV9taW4gPSBydGNfcmVhZChSVENfTUlOVVRFUyk7CisJcnRjX3RtLT50bV9ob3VyID0gcnRjX3JlYWQoUlRDX0hPVVJTKSAmIDB4M2Y7CisJcnRjX3RtLT50bV9tZGF5ID0gcnRjX3JlYWQoUlRDX0RBVEUpOworCXJ0Y190bS0+dG1fbW9uID0gcnRjX3JlYWQoUlRDX01PTlRIKSAmIDB4MWY7CisJcnRjX3RtLT50bV95ZWFyID0gcnRjX3JlYWQoUlRDX1lFQVIpOworCisJcnRjX3dyaXRlKHNhdmVfY29udHJvbCwgUlRDX0NNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9zZWMpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9taW4pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21vbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwlpZiAocnRjX3RtLT50bV95ZWFyIDwgNDUpCisJCXJ0Y190bS0+dG1feWVhciArPSAzMDsKKwlpZiAoKHJ0Y190bS0+dG1feWVhciArPSA0MCkgPCA3MCkKKwkJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKKworCXJ0Y190bS0+dG1fbW9uLS07Cit9CisKK3N0YXRpYyBpbnQgZHMxMjg2X3NldF90aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIGxlYXBfeXI7CisJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2w7CisJdW5zaWduZWQgaW50IHlycywgZmxhZ3M7CisKKworCXlycyA9IHJ0Y190bS0+dG1feWVhciArIDE5MDA7CisJbW9uID0gcnRjX3RtLT50bV9tb24gKyAxOyAgIC8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCWRheSA9IHJ0Y190bS0+dG1fbWRheTsKKwlocnMgPSBydGNfdG0tPnRtX2hvdXI7CisJbWluID0gcnRjX3RtLT50bV9taW47CisJc2VjID0gcnRjX3RtLT50bV9zZWM7CisKKwlpZiAoeXJzIDwgMTk3MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZWFwX3lyID0gKCghKHlycyAlIDQpICYmICh5cnMgJSAxMDApKSB8fCAhKHlycyAlIDQwMCkpOworCisJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF5ID4gKGRheXNfaW5fbW9bbW9uXSArICgobW9uID09IDIpICYmIGxlYXBfeXIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGhycyA+PSAyNCkgfHwgKG1pbiA+PSA2MCkgfHwgKHNlYyA+PSA2MCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh5cnMgLT0gMTk0MCkgPiAyNTUpICAgIC8qIFRoZXkgYXJlIHVuc2lnbmVkICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHlycyA+PSAxMDApCisJCXlycyAtPSAxMDA7CisKKwlCSU5fVE9fQkNEKHNlYyk7CisJQklOX1RPX0JDRChtaW4pOworCUJJTl9UT19CQ0QoaHJzKTsKKwlCSU5fVE9fQkNEKGRheSk7CisJQklOX1RPX0JDRChtb24pOworCUJJTl9UT19CQ0QoeXJzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCXNhdmVfY29udHJvbCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCXJ0Y193cml0ZSgoc2F2ZV9jb250cm9sfFJUQ19URSksIFJUQ19DTUQpOworCisJcnRjX3dyaXRlKHlycywgUlRDX1lFQVIpOworCXJ0Y193cml0ZShtb24sIFJUQ19NT05USCk7CisJcnRjX3dyaXRlKGRheSwgUlRDX0RBVEUpOworCXJ0Y193cml0ZShocnMsIFJUQ19IT1VSUyk7CisJcnRjX3dyaXRlKG1pbiwgUlRDX01JTlVURVMpOworCXJ0Y193cml0ZShzZWMsIFJUQ19TRUNPTkRTKTsKKwlydGNfd3JpdGUoMCwgUlRDX0hVTkRSRURUSF9TRUNPTkQpOworCisJcnRjX3dyaXRlKHNhdmVfY29udHJvbCwgUlRDX0NNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkczEyODZfZ2V0X2FsbV90aW1lKHN0cnVjdCBydGNfdGltZSAqYWxtX3RtKQoreworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gVGhhdAorCSAqIG1lYW5zIG9ubHkgdG1fd2RheSwgdG1faG91ciwgdG1fbWluLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCWFsbV90bS0+dG1fbWluID0gcnRjX3JlYWQoUlRDX01JTlVURVNfQUxBUk0pICYgMHg3ZjsKKwlhbG1fdG0tPnRtX2hvdXIgPSBydGNfcmVhZChSVENfSE9VUlNfQUxBUk0pICAmIDB4MWY7CisJYWxtX3RtLT50bV93ZGF5ID0gcnRjX3JlYWQoUlRDX0RBWV9BTEFSTSkgICAgJiAweDA3OworCWNtZCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWluKTsKKwlCQ0RfVE9fQklOKGFsbV90bS0+dG1faG91cik7CisJYWxtX3RtLT50bV9zZWMgPSAwOworfQorCittb2R1bGVfaW5pdChkczEyODZfaW5pdCk7Cittb2R1bGVfZXhpdChkczEyODZfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJhbGYgQmFlY2hsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoUlRDX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kczEzMDIuYyBiL2RyaXZlcnMvY2hhci9kczEzMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVlODYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RzMTMwMi5jCkBAIC0wLDAgKzEsMzU0IEBACisvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyohCisqISBGSUxFIE5BTUUgIDogZHMxMzAyLmMKKyohCisqISBERVNDUklQVElPTjogSW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBEUzEzMDIgUlRDCisqIQorKiEgRnVuY3Rpb25zIGV4cG9ydGVkOiBkczEzMDJfcmVhZHJlZywgZHMxMzAyX3dyaXRlcmVnLCBkczEzMDJfaW5pdCwgZ2V0X3J0Y19zdGF0dXMKKyohCisqISAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyohCisqISAoQykgQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIsIExVTkQsIFNXRURFTgorKiEKKyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorI2lmIGRlZmluZWQoQ09ORklHX00zMlIpCisjaW5jbHVkZSA8YXNtL20zMnIuaD4KKyNlbmRpZgorCisjZGVmaW5lIFJUQ19NQUpPUl9OUiAxMjEgLyogbG9jYWwgbWFqb3IsIGNoYW5nZSBsYXRlciAqLworCitzdGF0aWMgY29uc3QgY2hhciBkczEzMDJfbmFtZVtdID0gImRzMTMwMiI7CisKKy8qIFNlbmQgOCBiaXRzLiAqLworc3RhdGljIHZvaWQKK291dF9ieXRlX3J0Yyh1bnNpZ25lZCBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGNoYXIgeCkKK3sKKwkvL1JTVCBICisJb3V0dygweDAwMDEsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisJLy93cml0ZSBkYXRhCisJb3V0dygoKHg8PDgpfChyZWdfYWRkciYweGZmKSksKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1dSREFUQSk7CisJLy9XRQorCW91dHcoMHgwMDAyLCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUik7CisJLy93YWl0CisJd2hpbGUoaW53KCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUikpOworCisJLy9SU1QgTAorCW91dHcoMHgwMDAwLCh1bnNpZ25lZCBsb25nKVBMRF9SVENSU1RPRFQpOworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitpbl9ieXRlX3J0Yyh1bnNpZ25lZCBpbnQgcmVnX2FkZHIpCit7CisJdW5zaWduZWQgY2hhciByZXR2YWw7CisKKwkvL1JTVCBICisJb3V0dygweDAwMDEsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisJLy93cml0ZSBkYXRhCisJb3V0dygocmVnX2FkZHImMHhmZiksKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JEREFUQSk7CisJLy9SRQorCW91dHcoMHgwMDAxLCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUik7CisJLy93YWl0CisJd2hpbGUoaW53KCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUikpOworCisJLy9yZWFkIGRhdGEKKwlyZXR2YWw9KGludygodW5zaWduZWQgbG9uZylQTERfUlRDUkREQVRBKSAmIDB4ZmYwMCk+Pjg7CisKKwkvL1JTVCBMCisJb3V0dygweDAwMDAsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBFbmFibGUgd3JpdGluZy4gKi8KKworc3RhdGljIHZvaWQKK2RzMTMwMl93ZW5hYmxlKHZvaWQpCit7CisJb3V0X2J5dGVfcnRjKDB4OGUsMHgwMCk7Cit9CisKKy8qIERpc2FibGUgd3JpdGluZy4gKi8KKworc3RhdGljIHZvaWQKK2RzMTMwMl93ZGlzYWJsZSh2b2lkKQoreworCW91dF9ieXRlX3J0YygweDhlLDB4ODApOworfQorCisKKworLyogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgaW4gdGhlIERTMTMwMi4gKi8KKwordW5zaWduZWQgY2hhcgorZHMxMzAyX3JlYWRyZWcoaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHg7CisKKwl4PWluX2J5dGVfcnRjKCgweDgxIHwgKHJlZyA8PCAxKSkpOyAvKiByZWFkIHJlZ2lzdGVyICovCisKKwlyZXR1cm4geDsKK30KKworLyogV3JpdGUgYSBieXRlIHRvIHRoZSBzZWxlY3RlZCByZWdpc3Rlci4gKi8KKwordm9pZAorZHMxMzAyX3dyaXRlcmVnKGludCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWRzMTMwMl93ZW5hYmxlKCk7CisJb3V0X2J5dGVfcnRjKCgweDgwIHwgKHJlZyA8PCAxKSksdmFsKTsKKwlkczEzMDJfd2Rpc2FibGUoKTsKK30KKwordm9pZAorZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXJ0Y190bS0+dG1fc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKKwlydGNfdG0tPnRtX21pbiA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7CisJcnRjX3RtLT50bV9ob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSUyk7CisJcnRjX3RtLT50bV9tZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOworCXJ0Y190bS0+dG1fbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7CisJcnRjX3RtLT50bV95ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9zZWMpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9taW4pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21vbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKworCWlmIChydGNfdG0tPnRtX3llYXIgPD0gNjkpCisJCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisKKwlydGNfdG0tPnRtX21vbi0tOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkYXlzX2luX21vW10gPQorICAgIHswLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworLyogaW9jdGwgdGhhdCBzdXBwb3J0cyBSVENfUkRfVElNRSBhbmQgUlRDX1NFVF9USU1FIChyZWFkIGFuZCBzZXQgdGltZS9kYXRlKS4gKi8KKworc3RhdGljIGludAorcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBSVENfUkRfVElNRToJLyogcmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCisJCXsKKwkJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisKKwkJCW1lbXNldCgmcnRjX3RtLCAwLCBzaXplb2YgKHN0cnVjdCBydGNfdGltZSkpOworCQkJZ2V0X3J0Y190aW1lKCZydGNfdG0pOworCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IHJ0Y190aW1lKilhcmcsICZydGNfdG0sIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBSVENfU0VUX1RJTUU6CS8qIHNldCB0aGUgUlRDICovCisJCXsKKwkJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisJCQl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjLCBsZWFwX3lyOworCQkJdW5zaWduZWQgaW50IHlyczsKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQl5cnMgPSBydGNfdG0udG1feWVhciArIDE5MDA7CisJCQltb24gPSBydGNfdG0udG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJCWRheSA9IHJ0Y190bS50bV9tZGF5OworCQkJaHJzID0gcnRjX3RtLnRtX2hvdXI7CisJCQltaW4gPSBydGNfdG0udG1fbWluOworCQkJc2VjID0gcnRjX3RtLnRtX3NlYzsKKworCisJCQlpZiAoKHlycyA8IDE5NzApIHx8ICh5cnMgPiAyMDY5KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJbGVhcF95ciA9ICgoISh5cnMgJSA0KSAmJiAoeXJzICUgMTAwKSkgfHwgISh5cnMgJSA0MDApKTsKKworCQkJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGRheSA+IChkYXlzX2luX21vW21vbl0gKyAoKG1vbiA9PSAyKSAmJiBsZWFwX3lyKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICgoaHJzID49IDI0KSB8fCAobWluID49IDYwKSB8fCAoc2VjID49IDYwKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKHlycyA+PSAyMDAwKQorCQkJCXlycyAtPSAyMDAwOwkvKiBSVEMgKDAsIDEsIC4uLiA2OSkgKi8KKwkJCWVsc2UKKwkJCQl5cnMgLT0gMTkwMDsJLyogUlRDICg3MCwgNzEsIC4uLiA5OSkgKi8KKworCQkJQklOX1RPX0JDRChzZWMpOworCQkJQklOX1RPX0JDRChtaW4pOworCQkJQklOX1RPX0JDRChocnMpOworCQkJQklOX1RPX0JDRChkYXkpOworCQkJQklOX1RPX0JDRChtb24pOworCQkJQklOX1RPX0JDRCh5cnMpOworCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJQ01PU19XUklURSh5cnMsIFJUQ19ZRUFSKTsKKwkJCUNNT1NfV1JJVEUobW9uLCBSVENfTU9OVEgpOworCQkJQ01PU19XUklURShkYXksIFJUQ19EQVlfT0ZfTU9OVEgpOworCQkJQ01PU19XUklURShocnMsIFJUQ19IT1VSUyk7CisJCQlDTU9TX1dSSVRFKG1pbiwgUlRDX01JTlVURVMpOworCQkJQ01PU19XUklURShzZWMsIFJUQ19TRUNPTkRTKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQkJLyogTm90aWNlIHRoYXQgYXQgdGhpcyBwb2ludCwgdGhlIFJUQyBpcyB1cGRhdGVkIGJ1dAorCQkJICogdGhlIGtlcm5lbCBpcyBzdGlsbCBydW5uaW5nIHdpdGggdGhlIG9sZCB0aW1lLgorCQkJICogWW91IG5lZWQgdG8gc2V0IHRoYXQgc2VwYXJhdGVseSB3aXRoIHNldHRpbWVvZmRheQorCQkJICogb3IgYWRqdGltZXguCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBSVENfU0VUX0NIQVJHRTogLyogc2V0IHRoZSBSVEMgVFJJQ0tMRSBDSEFSR0UgcmVnaXN0ZXIgKi8KKwkJeworCQkJaW50IHRjc192YWw7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZ0Y3NfdmFsLCAoaW50KilhcmcsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJdGNzX3ZhbCA9IFJUQ19UQ1JfUEFUVEVSTiB8ICh0Y3NfdmFsICYgMHgwRik7CisJCQlkczEzMDJfd3JpdGVyZWcoUlRDX1RSSUNLTEVDSEFSR0VSLCB0Y3NfdmFsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK2ludAorZ2V0X3J0Y19zdGF0dXMoY2hhciAqYnVmKQoreworCWNoYXIgKnA7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJcCA9IGJ1ZjsKKworCWdldF9ydGNfdGltZSgmdG0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgbHVzZXIgaGFzIHRoZSBSVEMgc2V0IGZvciBsb2NhbAorCSAqIHRpbWUgb3IgZm9yIFVuaXZlcnNhbCBTdGFuZGFyZCBUaW1lIChHTVQpLiBQcm9iYWJseSBsb2NhbCB0aG91Z2guCisJICovCisKKwlwICs9IHNwcmludGYocCwKKwkJInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSJydGNfZGF0ZVx0OiAlMDRkLSUwMmQtJTAyZFxuIiwKKwkJdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCXRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5KTsKKworCXJldHVybiAgcCAtIGJ1ZjsKK30KKworCisvKiBUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4gKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBydGNfaW9jdGwsCit9OworCisvKiBQcm9iZSBmb3IgdGhlIGNoaXAgYnkgd3JpdGluZyBzb21ldGhpbmcgdG8gaXRzIFJBTSBhbmQgdHJ5IHJlYWRpbmcgaXQgYmFjay4gKi8KKworI2RlZmluZSBNQUdJQ19QQVRURVJOIDB4NDIKKworc3RhdGljIGludCBfX2luaXQKK2RzMTMwMl9wcm9iZSh2b2lkKQoreworCWludCByZXR2YWwsIHJlcywgYmF1cjsKKworCWJhdXI9KGJvb3RfY3B1X2RhdGEuYnVzX2Nsb2NrLygyKjEwMDAqMTAwMCkpOworCisJcHJpbnRrKCIlczogU2V0IFBMRF9SVENCQVVSID0gJWRcbiIsIGRzMTMwMl9uYW1lLGJhdXIpOworCisJb3V0dygweDAwMDAsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0NSKTsKKwlvdXR3KDB4MDAwMCwodW5zaWduZWQgbG9uZylQTERfUlRDUlNUT0RUKTsKKwlvdXR3KGJhdXIsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0JBVVIpOworCisJLyogVHJ5IHRvIHRhbGsgdG8gdGltZWtlZXBlci4gKi8KKworCWRzMTMwMl93ZW5hYmxlKCk7CisJLyogd3JpdGUgUkFNIGJ5dGUgMCAqLworCS8qIHdyaXRlIHNvbWV0aGluZyBtYWdpYyAqLworCW91dF9ieXRlX3J0YygweGMwLE1BR0lDX1BBVFRFUk4pOworCisJLyogcmVhZCBSQU0gYnl0ZSAwICovCisJaWYoKHJlcyA9IGluX2J5dGVfcnRjKDB4YzEpKSA9PSBNQUdJQ19QQVRURVJOKSB7CisJCWNoYXIgYnVmWzEwMF07CisJCWRzMTMwMl93ZGlzYWJsZSgpOworCQlwcmludGsoIiVzOiBSVEMgZm91bmQuXG4iLCBkczEzMDJfbmFtZSk7CisJCWdldF9ydGNfc3RhdHVzKGJ1Zik7CisJCXByaW50ayhidWYpOworCQlyZXR2YWwgPSAxOworCX0gZWxzZSB7CisJCXByaW50aygiJXM6IFJUQyBub3QgZm91bmQuXG4iLCBkczEzMDJfbmFtZSk7CisJCXJldHZhbCA9IDA7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBKdXN0IHByb2JlIGZvciB0aGUgUlRDIGFuZCByZWdpc3RlciB0aGUgZGV2aWNlIHRvIGhhbmRsZSB0aGUgaW9jdGwgbmVlZGVkLiAqLworCitpbnQgX19pbml0CitkczEzMDJfaW5pdCh2b2lkKQoreworCWlmICghZHMxMzAyX3Byb2JlKCkpIHsKKwkJcmV0dXJuIC0xOworICAJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkczEzMDJfcmVnaXN0ZXIodm9pZCkKK3sKKwlkczEzMDJfaW5pdCgpOworCWlmIChyZWdpc3Rlcl9jaHJkZXYoUlRDX01BSk9SX05SLCBkczEzMDJfbmFtZSwgJnJ0Y19mb3BzKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgcnRjXG4iLAorCQkgICAgICAgZHMxMzAyX25hbWUsIFJUQ19NQUpPUl9OUik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGRzMTMwMl9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHMxNjIwLmMgYi9kcml2ZXJzL2NoYXIvZHMxNjIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlZjZhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kczE2MjAuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9kczE2MjAuYzogRGFsbGFzIFNlbWljb25kdWN0b3JzIERTMTYyMAorICogICB0aGVybW9tZXRlciBkcml2ZXIgKGFzIHVzZWQgaW4gdGhlIFJlYmVsLmNvbSBOZXRXaW5kZXIpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3RoZXJtLmg+CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogZGVmaW5lIGZvciAvcHJvYyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgVEhFUk1fVVNFX1BST0MKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyBmb3IgRFMxNjIwIGNoaXAgKi8KKyNkZWZpbmUgVEhFUk1fU1RBUlRfQ09OVkVSVAkweGVlCisjZGVmaW5lIFRIRVJNX1JFU0VUCQkweGFmCisjZGVmaW5lIFRIRVJNX1JFQURfQ09ORklHCTB4YWMKKyNkZWZpbmUgVEhFUk1fUkVBRF9URU1QCQkweGFhCisjZGVmaW5lIFRIRVJNX1JFQURfVEwJCTB4YTIKKyNkZWZpbmUgVEhFUk1fUkVBRF9USAkJMHhhMQorI2RlZmluZSBUSEVSTV9XUklURV9DT05GSUcJMHgwYworI2RlZmluZSBUSEVSTV9XUklURV9UTAkJMHgwMgorI2RlZmluZSBUSEVSTV9XUklURV9USAkJMHgwMQorCisjZGVmaW5lIENGR19DUFUJCQkyCisjZGVmaW5lIENGR18xU0hPVAkJMQorCitzdGF0aWMgY29uc3QgY2hhciAqZmFuX3N0YXRlW10gPSB7ICJvZmYiLCAib24iLCAib24gKGhhcmR3aXJlZCkiIH07CisKKy8qCisgKiBTdGFydCBvZiBOZXRXaW5kZXIgc3BlY2lmaWNzCisgKiAgTm90ZSEgIFdlIGhhdmUgdG8gaG9sZCB0aGUgZ3BpbyBsb2NrIHdpdGggSVJRcyBkaXNhYmxlZCBvdmVyIHRoZQorICogIHdob2xlIG9mIG91ciB0cmFuc2FjdGlvbiB0byB0aGUgRGFsbGFzIGNoaXAsIHNpbmNlIHRoZXJlIGlzIGEKKyAqICBjaGFuY2UgdGhhdCB0aGUgV2F2ZUFydGlzdCBkcml2ZXIgY291bGQgdG91Y2ggdGhlc2UgYml0cyB0bworICogIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVha2VyLgorICovCitleHRlcm4gc3BpbmxvY2tfdCBncGlvX2xvY2s7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c3RlbV9yZXY7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoaW50IGNsaykKK3sKKwlncGlvX21vZGlmeV9vcChHUElPX0RTQ0xLLCBjbGsgPyBHUElPX0RTQ0xLIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfZHMxNjIwX3NldF9kYXRhKGludCBkYXQpCit7CisJZ3Bpb19tb2RpZnlfb3AoR1BJT19EQVRBLCBkYXQgPyBHUElPX0RBVEEgOiAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0d2luZGVyX2RzMTYyMF9nZXRfZGF0YSh2b2lkKQoreworCXJldHVybiBncGlvX3JlYWQoKSAmIEdQSU9fREFUQTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKGludCBkaXIpCit7CisJZ3Bpb19tb2RpZnlfaW8oR1BJT19EQVRBLCBkaXIgPyBHUElPX0RBVEEgOiAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfcmVzZXQodm9pZCkKK3sKKwljcGxkX21vZGlmeShDUExEX0RTX0VOQUJMRSwgMCk7CisJY3BsZF9tb2RpZnkoQ1BMRF9EU19FTkFCTEUsIENQTERfRFNfRU5BQkxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfdW5sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgKmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9zZXRfZmFuKGludCBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJZ3Bpb19tb2RpZnlfb3AoR1BJT19GQU4sIGkgPyBHUElPX0ZBTiA6IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXR3aW5kZXJfZ2V0X2Zhbih2b2lkKQoreworCWlmICgoc3lzdGVtX3JldiAmIDB4ZjAwMCkgPT0gMHg0MDAwKQorCQlyZXR1cm4gRkFOX0FMV0FZU19PTjsKKworCXJldHVybiAoZ3Bpb19yZWFkKCkgJiBHUElPX0ZBTikgPyBGQU5fT04gOiBGQU5fT0ZGOworfQorCisvKgorICogRW5kIG9mIE5ldFdpbmRlciBzcGVjaWZpY3MKKyAqLworCitzdGF0aWMgdm9pZCBkczE2MjBfc2VuZF9iaXRzKGludCBuciwgaW50IHZhbHVlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YSh2YWx1ZSAmIDEpOworCQluZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoMCk7CisJCXVkZWxheSgxKTsKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCQl1ZGVsYXkoMSk7CisKKwkJdmFsdWUgPj49IDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTYyMF9yZWN2X2JpdHMoaW50IG5yKQoreworCXVuc2lnbmVkIGludCB2YWx1ZSA9IDAsIG1hc2sgPSAxOworCWludCBpOworCisJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YSgwKTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCW5ldHdpbmRlcl9kczE2MjBfc2V0X2NsaygwKTsKKwkJdWRlbGF5KDEpOworCisJCWlmIChuZXR3aW5kZXJfZHMxNjIwX2dldF9kYXRhKCkpCisJCQl2YWx1ZSB8PSBtYXNrOworCisJCW1hc2sgPDw9IDE7CisKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBkczE2MjBfb3V0KGludCBjbWQsIGludCBiaXRzLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5ldHdpbmRlcl9sb2NrKCZmbGFncyk7CisJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCW5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKDApOworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKworCXVkZWxheSgxKTsKKworCWRzMTYyMF9zZW5kX2JpdHMoOCwgY21kKTsKKwlpZiAoYml0cykKKwkJZHMxNjIwX3NlbmRfYml0cyhiaXRzLCB2YWx1ZSk7CisKKwl1ZGVsYXkoMSk7CisKKwluZXR3aW5kZXJfZHMxNjIwX3Jlc2V0KCk7CisJbmV0d2luZGVyX3VubG9jaygmZmxhZ3MpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KDIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTYyMF9pbihpbnQgY21kLCBpbnQgYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCW5ldHdpbmRlcl9sb2NrKCZmbGFncyk7CisJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCW5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKDApOworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKworCXVkZWxheSgxKTsKKworCWRzMTYyMF9zZW5kX2JpdHMoOCwgY21kKTsKKworCW5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKDEpOworCXZhbHVlID0gZHMxNjIwX3JlY3ZfYml0cyhiaXRzKTsKKworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKwluZXR3aW5kZXJfdW5sb2NrKCZmbGFncyk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgY3Z0XzlfdG9faW50KHVuc2lnbmVkIGludCB2YWwpCit7CisJaWYgKHZhbCAmIDB4MTAwKQorCQl2YWwgfD0gMHhmZmZmZmUwMDsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRzMTYyMF93cml0ZV9zdGF0ZShzdHJ1Y3QgdGhlcm0gKnRoZXJtKQoreworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfQ09ORklHLCA4LCBDRkdfQ1BVKTsKKwlkczE2MjBfb3V0KFRIRVJNX1dSSVRFX1RMLCA5LCB0aGVybS0+bG8pOworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfVEgsIDksIHRoZXJtLT5oaSk7CisJZHMxNjIwX291dChUSEVSTV9TVEFSVF9DT05WRVJULCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZHMxNjIwX3JlYWRfc3RhdGUoc3RydWN0IHRoZXJtICp0aGVybSkKK3sKKwl0aGVybS0+bG8gPSBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEwsIDkpKTsKKwl0aGVybS0+aGkgPSBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEgsIDkpKTsKK30KKworc3RhdGljIHNzaXplX3QKK2RzMTYyMF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHRyKQoreworCXNpZ25lZCBpbnQgY3VyX3RlbXA7CisJc2lnbmVkIGNoYXIgY3VyX3RlbXBfZGVnRjsKKworCWN1cl90ZW1wID0gY3Z0XzlfdG9faW50KGRzMTYyMF9pbihUSEVSTV9SRUFEX1RFTVAsIDkpKSA+PiAxOworCisJLyogY29udmVydCB0byBGYWhyZW5oZWl0LCBhcyBwZXIgd2R0LmMgKi8KKwljdXJfdGVtcF9kZWdGID0gKGN1cl90ZW1wICogOSkgLyA1ICsgMzI7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJmN1cl90ZW1wX2RlZ0YsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkczE2MjBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0aGVybSB0aGVybTsKKwl1bmlvbiB7CisJCXN0cnVjdCB0aGVybSBfX3VzZXIgKnRoZXJtOworCQlpbnQgX191c2VyICppOworCX0gdWFyZzsKKwlpbnQgaTsKKworCXVhcmcuaSA9IChpbnQgX191c2VyICopYXJnOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgQ01EX1NFVF9USEVSTU9TVEFURToKKwljYXNlIENNRF9TRVRfVEhFUk1PU1RBVEUyOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjbWQgPT0gQ01EX1NFVF9USEVSTU9TVEFURSkgeworCQkJaWYgKGdldF91c2VyKHRoZXJtLmhpLCB1YXJnLmkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdGhlcm0ubG8gPSB0aGVybS5oaSAtIDM7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRoZXJtLCB1YXJnLnRoZXJtLCBzaXplb2YodGhlcm0pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXRoZXJtLmxvIDw8PSAxOworCQl0aGVybS5oaSA8PD0gMTsKKworCQlkczE2MjBfd3JpdGVfc3RhdGUoJnRoZXJtKTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9HRVRfVEhFUk1PU1RBVEU6CisJY2FzZSBDTURfR0VUX1RIRVJNT1NUQVRFMjoKKwkJZHMxNjIwX3JlYWRfc3RhdGUoJnRoZXJtKTsKKworCQl0aGVybS5sbyA+Pj0gMTsKKwkJdGhlcm0uaGkgPj49IDE7CisKKwkJaWYgKGNtZCA9PSBDTURfR0VUX1RIRVJNT1NUQVRFKSB7CisJCQlpZiAocHV0X3VzZXIodGhlcm0uaGksIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV90b191c2VyKHVhcmcudGhlcm0sICZ0aGVybSwgc2l6ZW9mKHRoZXJtKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNRF9HRVRfVEVNUEVSQVRVUkU6CisJY2FzZSBDTURfR0VUX1RFTVBFUkFUVVJFMjoKKwkJaSA9IGN2dF85X3RvX2ludChkczE2MjBfaW4oVEhFUk1fUkVBRF9URU1QLCA5KSk7CisKKwkJaWYgKGNtZCA9PSBDTURfR0VUX1RFTVBFUkFUVVJFKQorCQkJaSA+Pj0gMTsKKworCQlyZXR1cm4gcHV0X3VzZXIoaSwgdWFyZy5pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBDTURfR0VUX1NUQVRVUzoKKwkJaSA9IGRzMTYyMF9pbihUSEVSTV9SRUFEX0NPTkZJRywgOCkgJiAweGUzOworCisJCXJldHVybiBwdXRfdXNlcihpLCB1YXJnLmkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIENNRF9HRVRfRkFOOgorCQlpID0gbmV0d2luZGVyX2dldF9mYW4oKTsKKworCQlyZXR1cm4gcHV0X3VzZXIoaSwgdWFyZy5pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBDTURfU0VUX0ZBTjoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoZ2V0X3VzZXIoaSwgdWFyZy5pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW5ldHdpbmRlcl9zZXRfZmFuKGkpOworCQlicmVhazsKKwkJCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFRIRVJNX1VTRV9QUk9DCitzdGF0aWMgaW50Citwcm9jX3RoZXJtX2RzMTYyMF9yZWFkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCB0aGVybSB0aDsKKwlpbnQgdGVtcDsKKworCWRzMTYyMF9yZWFkX3N0YXRlKCZ0aCk7CisJdGVtcCA9ICBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEVNUCwgOSkpOworCisJbGVuID0gc3ByaW50ZihidWYsICJUaGVybW9zdGF0OiBISSAlaS4laSwgTE9XICVpLiVpOyAiCisJCSAgICAgICJ0ZW1wZXJhdHVyZTogJWkuJWkgQywgZmFuICVzXG4iLAorCQkgICAgICB0aC5oaSA+PiAxLCB0aC5oaSAmIDEgPyA1IDogMCwKKwkJICAgICAgdGgubG8gPj4gMSwgdGgubG8gJiAxID8gNSA6IDAsCisJCSAgICAgIHRlbXAgID4+IDEsIHRlbXAgICYgMSA/IDUgOiAwLAorCQkgICAgICBmYW5fc3RhdGVbbmV0d2luZGVyX2dldF9mYW4oKV0pOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY190aGVybV9kczE2MjA7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHMxNjIwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IG5vbnNlZWthYmxlX29wZW4sCisJLnJlYWQJCT0gZHMxNjIwX3JlYWQsCisJLmlvY3RsCQk9IGRzMTYyMF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBkczE2MjBfbWlzY2RldiA9IHsKKwlURU1QX01JTk9SLAorCSJ0ZW1wIiwKKwkmZHMxNjIwX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTYyMF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdGhlcm0gdGgsIHRoX3N0YXJ0OworCisJaWYgKCFtYWNoaW5lX2lzX25ldHdpbmRlcigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRzMTYyMF9vdXQoVEhFUk1fUkVTRVQsIDAsIDApOworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfQ09ORklHLCA4LCBDRkdfQ1BVKTsKKwlkczE2MjBfb3V0KFRIRVJNX1NUQVJUX0NPTlZFUlQsIDAsIDApOworCisJLyoKKwkgKiBUcmlnZ2VyIHRoZSBmYW4gdG8gc3RhcnQgYnkgc2V0dGluZworCSAqIHRlbXBlcmF0dXJlIGhpZ2ggcG9pbnQgbG93LiAgVGhpcyBraWNrcworCSAqIHRoZSBmYW4gaW50byBhY3Rpb24uCisJICovCisJZHMxNjIwX3JlYWRfc3RhdGUoJnRoKTsKKwl0aF9zdGFydC5sbyA9IDA7CisJdGhfc3RhcnQuaGkgPSAxOworCWRzMTYyMF93cml0ZV9zdGF0ZSgmdGhfc3RhcnQpOworCisJbXNsZWVwKDIwMDApOworCisJZHMxNjIwX3dyaXRlX3N0YXRlKCZ0aCk7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZkczE2MjBfbWlzY2Rldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKyNpZmRlZiBUSEVSTV9VU0VfUFJPQworCXByb2NfdGhlcm1fZHMxNjIwID0gY3JlYXRlX3Byb2NfZW50cnkoInRoZXJtIiwgMCwgTlVMTCk7CisJaWYgKHByb2NfdGhlcm1fZHMxNjIwKQorCQlwcm9jX3RoZXJtX2RzMTYyMC0+cmVhZF9wcm9jID0gcHJvY190aGVybV9kczE2MjBfcmVhZDsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAidGhlcm06IHVuYWJsZSB0byByZWdpc3RlciAvcHJvYy90aGVybVxuIik7CisjZW5kaWYKKworCWRzMTYyMF9yZWFkX3N0YXRlKCZ0aCk7CisJcmV0ID0gY3Z0XzlfdG9faW50KGRzMTYyMF9pbihUSEVSTV9SRUFEX1RFTVAsIDkpKTsKKworCXByaW50ayhLRVJOX0lORk8gIlRoZXJtb3N0YXQ6IGhpZ2ggJWkuJWksIGxvdyAlaS4laSwgIgorCSAgICAgICAiY3VycmVudCAlaS4laSBDLCBmYW4gJXMuXG4iLAorCSAgICAgICB0aC5oaSA+PiAxLCB0aC5oaSAmIDEgPyA1IDogMCwKKwkgICAgICAgdGgubG8gPj4gMSwgdGgubG8gJiAxID8gNSA6IDAsCisJICAgICAgIHJldCAgID4+IDEsIHJldCAgICYgMSA/IDUgOiAwLAorCSAgICAgICBmYW5fc3RhdGVbbmV0d2luZGVyX2dldF9mYW4oKV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczE2MjBfZXhpdCh2b2lkKQoreworI2lmZGVmIFRIRVJNX1VTRV9QUk9DCisJcmVtb3ZlX3Byb2NfZW50cnkoInRoZXJtIiwgTlVMTCk7CisjZW5kaWYKKwltaXNjX2RlcmVnaXN0ZXIoJmRzMTYyMF9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoZHMxNjIwX2luaXQpOworbW9kdWxlX2V4aXQoZHMxNjIwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHNwNTZrLmMgYi9kcml2ZXJzL2NoYXIvZHNwNTZrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNjY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kc3A1NmsuYwpAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAqIFRoZSBEU1A1NjAwMSBEZXZpY2UgRHJpdmVyLCBzYXZpb3VyIG9mIHRoZSBGcmVlIFdvcmxkKHRtKQorICoKKyAqIEF1dGhvcnM6IEZyZWRyaWsgTm9yaW5nICAgPG5vcmluZ0Bub2NyZXcub3JnPgorICogICAgICAgICAgbGFycyBicmlua2hvZmYgICA8bGFyc0Bub2NyZXcub3JnPgorICogICAgICAgICAgVG9tYXMgQmVybmR0c3NvbiA8dG9tYXNAbm9jcmV3Lm9yZz4KKyAqCisgKiBGaXJzdCB2ZXJzaW9uIE1heSAxOTk2CisgKgorICogSGlzdG9yeToKKyAqICA5Ny0wMS0yOSAgIFRvbWFzIEJlcm5kdHNzb24sCisgKiAgICAgICAgICAgICAgIEludGVncmF0ZWQgd2l0aCBMaW51eCAyLjEuMjEga2VybmVsIHNvdXJjZXMuCisgKiAgOTctMDItMTUgICBUb21hcyBCZXJuZHRzc29uLAorICogICAgICAgICAgICAgICBGaXhlZCBmb3Iga2VybmVsIDIuMS4yNgorICoKKyAqIEJVR1M6CisgKiAgSG1tLi4uIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIGhlcmUgOikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NyBGcmVkcmlrIE5vcmluZywgbGFycyBicmlua2hvZmYgJiBUb21hcyBCZXJuZHRzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CS8qIGZvciBrbWFsbG9jKCkgYW5kIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3Igc3RydWN0IHdhaXRfcXVldWUgZXRjICovCisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZ3Vlc3Mgd2hhdCAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogRm9yIHB1dF91c2VyIGFuZCBnZXRfdXNlciAqLworCisjaW5jbHVkZSA8YXNtL2RzcDU2ay5oPgorCisvKiBtaW5vciBkZXZpY2VzICovCisjZGVmaW5lIERTUDU2S19ERVZfNTYwMDEgICAgICAgIDAgICAgLyogVGhlIG9ubHkgZGV2aWNlIHNvIGZhciAqLworCisjZGVmaW5lIFRJTUVPVVQgICAgMTAgICAvKiBIb3N0IHBvcnQgdGltZW91dCBpbiBudW1iZXIgb2YgdHJpZXMgKi8KKyNkZWZpbmUgTUFYSU8gICAgMjA0OCAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHdvcmRzIGJlZm9yZSBzbGVlcCAqLworI2RlZmluZSBEU1A1NktfTUFYX0JJTkFSWV9MRU5HVEggKDMqNjQqMTAyNCkKKworI2RlZmluZSBEU1A1NktfVFhfSU5UX09OCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gIERTUDU2S19JQ1JfVFJFUQorI2RlZmluZSBEU1A1NktfUlhfSU5UX09OCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gIERTUDU2S19JQ1JfUlJFUQorI2RlZmluZSBEU1A1NktfVFhfSU5UX09GRglkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyICY9IH5EU1A1NktfSUNSX1RSRVEKKyNkZWZpbmUgRFNQNTZLX1JYX0lOVF9PRkYJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9SUkVRCisKKyNkZWZpbmUgRFNQNTZLX1RSQU5TTUlUCQkoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmlzciAmIERTUDU2S19JU1JfVFhERSkKKyNkZWZpbmUgRFNQNTZLX1JFQ0VJVkUJCShkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaXNyICYgRFNQNTZLX0lTUl9SWERGKQorCisjZGVmaW5lIGhhbmRzaGFrZShjb3VudCwgbWF4aW8sIHRpbWVvdXQsIEVOQUJMRSwgZikgXAoreyBcCisJbG9uZyBpLCB0LCBtOyBcCisJd2hpbGUgKGNvdW50ID4gMCkgeyBcCisJCW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCwgbWF4aW8pOyBcCisJCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsgXAorCQkJZm9yICh0ID0gMDsgdCA8IHRpbWVvdXQgJiYgIUVOQUJMRTsgdCsrKSBcCisJCQkJbXNsZWVwKDIwKTsgXAorCQkJaWYoIUVOQUJMRSkgXAorCQkJCXJldHVybiAtRUlPOyBcCisJCQlmOyBcCisJCX0gXAorCQljb3VudCAtPSBtOyBcCisJCWlmIChtID09IG1heGlvKSBtc2xlZXAoMjApOyBcCisJfSBcCit9CisKKyNkZWZpbmUgdHhfd2FpdChuKSBcCit7IFwKKwlpbnQgdDsgXAorCWZvcih0ID0gMDsgdCA8IG4gJiYgIURTUDU2S19UUkFOU01JVDsgdCsrKSBcCisJCW1zbGVlcCgxMCk7IFwKKwlpZighRFNQNTZLX1RSQU5TTUlUKSB7IFwKKwkJcmV0dXJuIC1FSU87IFwKKwl9IFwKK30KKworI2RlZmluZSByeF93YWl0KG4pIFwKK3sgXAorCWludCB0OyBcCisJZm9yKHQgPSAwOyB0IDwgbiAmJiAhRFNQNTZLX1JFQ0VJVkU7IHQrKykgXAorCQltc2xlZXAoMTApOyBcCisJaWYoIURTUDU2S19SRUNFSVZFKSB7IFwKKwkJcmV0dXJuIC1FSU87IFwKKwl9IFwKK30KKworLyogRFNQNTYwMDEgYm9vdHN0cmFwIGNvZGUgKi8KK3N0YXRpYyBjaGFyIGJvb3RzdHJhcFtdID0geworCTB4MGMsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHg2MCwgMHhmNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0ZiwgMHg2MSwgMHhmNCwKKwkweDAwLCAweDAwLCAweDdlLCAweGE5LCAweDA2LCAweDJlLCAweDgwLCAweDAwLCAweDAwLCAweDQ3LAorCTB4MDcsIDB4ZDgsIDB4ODQsIDB4MDcsIDB4NTksIDB4ODQsIDB4MDgsIDB4ZjQsIDB4YTgsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwOCwgMHhmNCwgMHhiZiwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHhmZSwKKwkweGI4LCAweDBhLCAweGYwLCAweDgwLCAweDAwLCAweDdlLCAweGE5LCAweDA4LCAweGY0LCAweGEwLAorCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDgsIDB4ZjQsIDB4YmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsCisJMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhhZCwgMHgwOCwgMHg0ZSwgMHgyYiwgMHg0NCwgMHhmNCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDQ0LCAweGY0LCAweDQ1LCAweDAwLCAweDAwLCAweDAxLAorCTB4MGUsIDB4YTAsIDB4MDAsIDB4MGEsIDB4YTksIDB4ODAsIDB4MDAsIDB4N2UsIDB4YjUsIDB4MDgsCisJMHg1MCwgMHgyYiwgMHgwYSwgMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhiOCwgMHgwOCwgMHg0NiwKKwkweDJiLCAweDQ0LCAweGY0LCAweDQ1LCAweDAwLCAweDAwLCAweDAyLCAweDBhLCAweGYwLCAweGFhLAorCTB4MDAsIDB4N2UsIDB4YzksIDB4MjAsIDB4MDAsIDB4NDUsIDB4MGEsIDB4ZjAsIDB4YWEsIDB4MDAsCisJMHg3ZSwgMHhkMCwgMHgwNiwgMHhjNiwgMHgwMCwgMHgwMCwgMHg3ZSwgMHhjNiwgMHgwYSwgMHhhOSwKKwkweDgwLCAweDAwLCAweDdlLCAweGM0LCAweDA4LCAweDU4LCAweDZiLCAweDBhLCAweGYwLCAweDgwLAorCTB4MDAsIDB4N2UsIDB4YWQsIDB4MDYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4N2UsIDB4Y2QsIDB4MGEsCisJMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhjYiwgMHgwOCwgMHg1OCwgMHhhYiwgMHgwYSwgMHhmMCwKKwkweDgwLCAweDAwLCAweDdlLCAweGFkLCAweDA2LCAweGM2LCAweDAwLCAweDAwLCAweDdlLCAweGQ0LAorCTB4MGEsIDB4YTksIDB4ODAsIDB4MDAsIDB4N2UsIDB4ZDIsIDB4MDgsIDB4NTgsIDB4ZWIsIDB4MGEsCisJMHhmMCwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhhZH07CitzdGF0aWMgaW50IHNpemVvZl9ib290c3RyYXAgPSAzNzU7CisKKworc3RhdGljIHN0cnVjdCBkc3A1NmtfZGV2aWNlIHsKKwlsb25nIGluX3VzZTsKKwlsb25nIG1heGlvLCB0aW1lb3V0OworCWludCB0eF93c2l6ZSwgcnhfd3NpemU7Cit9IGRzcDU2azsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmRzcDU2a19jbGFzczsKKworc3RhdGljIGludCBkc3A1NmtfcmVzZXQodm9pZCkKK3sKKwl1X2NoYXIgc3RhdHVzOworCQorCS8qIFBvd2VyIGRvd24gdGhlIERTUCAqLworCXNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCA9IDE0OworCXN0YXR1cyA9IHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCAmIDB4ZWY7CisJc291bmRfeW0ud2RfZGF0YSA9IHN0YXR1czsKKwlzb3VuZF95bS53ZF9kYXRhID0gc3RhdHVzIHwgMHgxMDsKKyAgCisJdWRlbGF5KDEwKTsKKyAgCisJLyogUG93ZXIgdXAgdGhlIERTUCAqLworCXNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCA9IDE0OworCXNvdW5kX3ltLndkX2RhdGEgPSBzb3VuZF95bS5yZF9kYXRhX3JlZ19zZWwgJiAweGVmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwNTZrX3VwbG9hZCh1X2NoYXIgKmJpbiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1X2NoYXIgKnA7CisJCisJZHNwNTZrX3Jlc2V0KCk7CisgIAorCXAgPSBib290c3RyYXA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZl9ib290c3RyYXAvMzsgaSsrKSB7CisJCS8qIHR4X3dhaXQoMTApOyAqLworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdID0gKnArKzsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSA9ICpwKys7CisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10gPSAqcCsrOworCX0KKwlmb3IgKDsgaSA8IDUxMjsgaSsrKSB7CisJCS8qIHR4X3dhaXQoMTApOyAqLworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdID0gMDsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSA9IDA7CisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10gPSAwOworCX0KKyAgCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXR4X3dhaXQoMTApOworCQlnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdLCBiaW4rKyk7CisJCWdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMl0sIGJpbisrKTsKKwkJZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlszXSwgYmluKyspOworCX0KKworCXR4X3dhaXQoMTApOworCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwgPSAzOyAgICAvKiBNYWdpYyBleGVjdXRlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZHNwNTZrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisKKwlzd2l0Y2goZGV2KQorCXsKKwljYXNlIERTUDU2S19ERVZfNTYwMDE6CisJeworCisJCWxvbmcgbjsKKworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiBub3RoaW5nIGlzIHRvIGJlIGRvbmUgKi8KKwkJaWYgKCFjb3VudCkgcmV0dXJuIDA7CisKKwkJbiA9IDA7CisJCXN3aXRjaCAoZHNwNTZrLnJ4X3dzaXplKSB7CisJCWNhc2UgMTogIC8qIDggYml0ICovCisJCXsKKwkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1JFQ0VJVkUsCisJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBidWYrbisrKSk7CisJCQlyZXR1cm4gbjsKKwkJfQorCQljYXNlIDI6ICAvKiAxNiBiaXQgKi8KKwkJeworCQkJc2hvcnQgKmRhdGE7CisKKwkJCWNvdW50IC89IDI7CisJCQlkYXRhID0gKHNob3J0KikgYnVmOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLndbMV0sIGRhdGErbisrKSk7CisJCQlyZXR1cm4gMipuOworCQl9CisJCWNhc2UgMzogIC8qIDI0IGJpdCAqLworCQl7CisJCQljb3VudCAvPSAzOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMV0sIGJ1ZituKyspOworCQkJCSAgcHV0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSwgYnVmK24rKyk7CisJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBidWYrbisrKSk7CisJCQlyZXR1cm4gMypuOworCQl9CisJCWNhc2UgNDogIC8qIDMyIGJpdCAqLworCQl7CisJCQlsb25nICpkYXRhOworCisJCQljb3VudCAvPSA0OworCQkJZGF0YSA9IChsb25nKikgYnVmOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwsIGRhdGErbisrKSk7CisJCQlyZXR1cm4gNCpuOworCQl9CisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJEU1A1NmsgZHJpdmVyOiBVbmtub3duIG1pbm9yIGRldmljZTogJWRcbiIsIGRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBkc3A1Nmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCXsKKwkJbG9uZyBuOworCisJCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIG5vdGhpbmcgaXMgdG8gYmUgZG9uZSAqLworCQlpZiAoIWNvdW50KSByZXR1cm4gMDsKKworCQluID0gMDsKKwkJc3dpdGNoIChkc3A1NmsudHhfd3NpemUpIHsKKwkJY2FzZSAxOiAgLyogOCBiaXQgKi8KKwkJeworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBidWYrbisrKSk7CisJCQlyZXR1cm4gbjsKKwkJfQorCQljYXNlIDI6ICAvKiAxNiBiaXQgKi8KKwkJeworCQkJY29uc3Qgc2hvcnQgKmRhdGE7CisKKwkJCWNvdW50IC89IDI7CisJCQlkYXRhID0gKGNvbnN0IHNob3J0ICopYnVmOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS53WzFdLCBkYXRhK24rKykpOworCQkJcmV0dXJuIDIqbjsKKwkJfQorCQljYXNlIDM6ICAvKiAyNCBiaXQgKi8KKwkJeworCQkJY291bnQgLz0gMzsKKwkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1RSQU5TTUlULAorCQkJCSAgZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsxXSwgYnVmK24rKyk7CisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzJdLCBidWYrbisrKTsKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10sIGJ1ZituKyspKTsKKwkJCXJldHVybiAzKm47CisJCX0KKwkJY2FzZSA0OiAgLyogMzIgYml0ICovCisJCXsKKwkJCWNvbnN0IGxvbmcgKmRhdGE7CisKKwkJCWNvdW50IC89IDQ7CisJCQlkYXRhID0gKGNvbnN0IGxvbmcgKilidWY7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19UUkFOU01JVCwKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwsIGRhdGErbisrKSk7CisJCQlyZXR1cm4gNCpuOworCQl9CisJCX0KKworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJEU1A1NmsgZHJpdmVyOiBVbmtub3duIG1pbm9yIGRldmljZTogJWRcbiIsIGRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgaW50IGRzcDU2a19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpICYgMHgwZjsKKworCXN3aXRjaChkZXYpCisJeworCWNhc2UgRFNQNTZLX0RFVl81NjAwMToKKworCQlzd2l0Y2goY21kKSB7CisJCWNhc2UgRFNQNTZLX1VQTE9BRDoKKwkJeworCQkJY2hhciAqYmluOworCQkJaW50IHIsIGxlbjsKKwkJCXN0cnVjdCBkc3A1NmtfdXBsb2FkICpiaW5hcnkgPSAoc3RydWN0IGRzcDU2a191cGxvYWQgKikgYXJnOworICAgIAorCQkJaWYoZ2V0X3VzZXIobGVuLCAmYmluYXJ5LT5sZW4pIDwgMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmKGdldF91c2VyKGJpbiwgJmJpbmFyeS0+YmluKSA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCQkJaWYgKGxlbiA9PSAwKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7ICAgICAgLyogbm90aGluZyB0byB1cGxvYWQ/IT8gKi8KKwkJCX0KKwkJCWlmIChsZW4gPiBEU1A1NktfTUFYX0JJTkFSWV9MRU5HVEgpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKyAgICAKKwkJCXIgPSBkc3A1NmtfdXBsb2FkKGJpbiwgbGVuKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCXJldHVybiByOworCQkJfQorICAgIAorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBEU1A1NktfU0VUX1RYX1dTSVpFOgorCQkJaWYgKGFyZyA+IDQgfHwgYXJnIDwgMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRzcDU2ay50eF93c2l6ZSA9IChpbnQpIGFyZzsKKwkJCWJyZWFrOworCQljYXNlIERTUDU2S19TRVRfUlhfV1NJWkU6CisJCQlpZiAoYXJnID4gNCB8fCBhcmcgPCAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZHNwNTZrLnJ4X3dzaXplID0gKGludCkgYXJnOworCQkJYnJlYWs7CisJCWNhc2UgRFNQNTZLX0hPU1RfRkxBR1M6CisJCXsKKwkJCWludCBkaXIsIG91dCwgc3RhdHVzOworCQkJc3RydWN0IGRzcDU2a19ob3N0X2ZsYWdzICpoZiA9IChzdHJ1Y3QgZHNwNTZrX2hvc3RfZmxhZ3MqKSBhcmc7CisgICAgCisJCQlpZihnZXRfdXNlcihkaXIsICZoZi0+ZGlyKSA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZihnZXRfdXNlcihvdXQsICZoZi0+b3V0KSA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICgoZGlyICYgMHgxKSAmJiAob3V0ICYgMHgxKSkKKwkJCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyIHw9IERTUDU2S19JQ1JfSEYwOworCQkJZWxzZSBpZiAoZGlyICYgMHgxKQorCQkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJj0gfkRTUDU2S19JQ1JfSEYwOworCQkJaWYgKChkaXIgJiAweDIpICYmIChvdXQgJiAweDIpKQorCQkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gRFNQNTZLX0lDUl9IRjE7CisJCQllbHNlIGlmIChkaXIgJiAweDIpCisJCQkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9IRjE7CisKKwkJCXN0YXR1cyA9IDA7CisJCQlpZiAoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmIERTUDU2S19JQ1JfSEYwKSBzdGF0dXMgfD0gMHgxOworCQkJaWYgKGRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJiBEU1A1NktfSUNSX0hGMSkgc3RhdHVzIHw9IDB4MjsKKwkJCWlmIChkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaXNyICYgRFNQNTZLX0lTUl9IRjIpIHN0YXR1cyB8PSAweDQ7CisJCQlpZiAoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmlzciAmIERTUDU2S19JU1JfSEYzKSBzdGF0dXMgfD0gMHg4OworCisJCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCAmaGYtPnN0YXR1cyk7CisJCX0KKwkJY2FzZSBEU1A1NktfSE9TVF9DTUQ6CisJCQlpZiAoYXJnID4gMzEgfHwgYXJnIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5jdnIgPSAodV9jaGFyKSgoYXJnICYgRFNQNTZLX0NWUl9IVl9NQVNLKSB8CisJCQkJCQkJICAgICBEU1A1NktfQ1ZSX0hDKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9Cit9CisKKy8qIEFzIG9mIDIuMS4yNiB0aGlzIHNob3VsZCBiZSBkc3A1NmtfcG9sbCwKKyAqIGJ1dCBob3cgZG8gSSB0aGVuIGNoZWNrIGRldmljZSBtaW5vciBudW1iZXI/CisgKiBEbyBJIG5lZWQgdGhpcyBmdW5jdGlvbiBhdCBhbGw/Pz8KKyAqLworI2lmIDAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHNwNTZrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCQkvKiBwb2xsX3dhaXQoZmlsZSwgPz8/LCB3YWl0KTsgKi8KKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMT1VUOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJEU1A1NmsgZHJpdmVyOiBVbmtub3duIG1pbm9yIGRldmljZTogJWRcbiIsIGRldik7CisJCXJldHVybiAwOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRzcDU2a19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpICYgMHgwZjsKKworCXN3aXRjaChkZXYpCisJeworCWNhc2UgRFNQNTZLX0RFVl81NjAwMToKKworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZHNwNTZrLmluX3VzZSkpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWRzcDU2ay50aW1lb3V0ID0gVElNRU9VVDsKKwkJZHNwNTZrLm1heGlvID0gTUFYSU87CisJCWRzcDU2ay5yeF93c2l6ZSA9IGRzcDU2ay50eF93c2l6ZSA9IDQ7IAorCisJCURTUDU2S19UWF9JTlRfT0ZGOworCQlEU1A1NktfUlhfSU5UX09GRjsKKworCQkvKiBaZXJvIGhvc3QgZmxhZ3MgKi8KKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9IRjA7CisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJj0gfkRTUDU2S19JQ1JfSEYxOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwNTZrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCQljbGVhcl9iaXQoMCwgJmRzcDU2ay5pbl91c2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHNwNTZrX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGRzcDU2a19yZWFkLAorCS53cml0ZQkJPSBkc3A1Nmtfd3JpdGUsCisJLmlvY3RsCQk9IGRzcDU2a19pb2N0bCwKKwkub3BlbgkJPSBkc3A1Nmtfb3BlbiwKKwkucmVsZWFzZQk9IGRzcDU2a19yZWxlYXNlLAorfTsKKworCisvKioqKioqIEluaXQgYW5kIG1vZHVsZSBmdW5jdGlvbnMgKioqKioqLworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJEU1A1NmsgZHJpdmVyIGluc3RhbGxlZFxuIjsKKworc3RhdGljIGludCBfX2luaXQgZHNwNTZrX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwlpZighTUFDSF9JU19BVEFSSSB8fCAhQVRBUklIV19QUkVTRU5UKERTUDU2SykpIHsKKwkJcHJpbnRrKCJEU1A1NmsgZHJpdmVyOiBIYXJkd2FyZSBub3QgcHJlc2VudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmKHJlZ2lzdGVyX2NocmRldihEU1A1NktfTUFKT1IsICJkc3A1NmsiLCAmZHNwNTZrX2ZvcHMpKSB7CisJCXByaW50aygiRFNQNTZrIGRyaXZlcjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkc3A1NmtfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiZHNwNTZrIik7CisJaWYgKElTX0VSUihkc3A1NmtfY2xhc3MpKSB7CisJCWVyciA9IFBUUl9FUlIoZHNwNTZrX2NsYXNzKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChkc3A1NmtfY2xhc3MsIE1LREVWKERTUDU2S19NQUpPUiwgMCksIE5VTEwsICJkc3A1NmsiKTsKKworCWVyciA9IGRldmZzX21rX2NkZXYoTUtERVYoRFNQNTZLX01BSk9SLCAwKSwKKwkJICAgICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLCAiZHNwNTZrIik7CisJaWYoZXJyKQorCQlnb3RvIG91dF9jbGFzczsKKworCXByaW50ayhiYW5uZXIpOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoRFNQNTZLX01BSk9SLCAwKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koZHNwNTZrX2NsYXNzKTsKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoRFNQNTZLX01BSk9SLCAiZHNwNTZrIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGRzcDU2a19pbml0X2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkc3A1NmtfY2xlYW51cF9kcml2ZXIodm9pZCkKK3sKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihEU1A1NktfTUFKT1IsIDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShkc3A1NmtfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2KERTUDU2S19NQUpPUiwgImRzcDU2ayIpOworCWRldmZzX3JlbW92ZSgiZHNwNTZrIik7Cit9Cittb2R1bGVfZXhpdChkc3A1NmtfY2xlYW51cF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHRsay5jIGIvZHJpdmVycy9jaGFyL2R0bGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNlNGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2R0bGsuYwpAQCAtMCwwICsxLDY1OSBAQAorLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIGxpbnV4LWMgLSotCisgKiBkdGxrLmMgLSBEb3VibGVUYWxrIFBDIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBPcmlnaW5hbCBhdXRob3I6IENocmlzIFBhbGxvdHRhIDxjaHJpc0BhbGxtZWRpYS5jb20+CisgKiBDdXJyZW50IG1haW50YWluZXI6IEppbSBWYW4gWmFuZHQgPGpydkB2YW56YW5kdC5tdi5jb20+CisgKiAKKyAqIDIwMDAtMDMtMTggSmltIFZhbiBaYW5kdDogRml4IHBvbGxpbmcuCisgKiAgRWxpbWluYXRlIGR0bGtfdGltZXJfYWN0aXZlIGZsYWcgYW5kIHNlcGFyYXRlIGR0bGtfc3RvcF90aW1lcgorICogIGZ1bmN0aW9uLiAgRG9uJ3QgcmVzdGFydCB0aW1lciBpbiBkdGxrX3RpbWVyX3RpY2suICBSZXN0YXJ0IHRpbWVyCisgKiAgaW4gZHRsa19wb2xsIGFmdGVyIGV2ZXJ5IHBvbGwuICBkdGxrX3BvbGwgcmV0dXJucyBtYXNrIChkdWgpLgorICogIEVsaW1pbmF0ZSB1bnVzZWQgZnVuY3Rpb24gZHRsa193cml0ZV9ieXRlLiAgTWlzYy4gY29kZSBjbGVhbnVwcy4KKyAqLworCisvKiBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIERvdWJsZVRhbGsgUEMsIGEgc3BlZWNoIHN5bnRoZXNpemVyCisgICBtYW51ZmFjdHVyZWQgYnkgUkMgU3lzdGVtcyAoaHR0cDovL3d3dy5yY3N5cy5jb20vKS4gIEl0IHdhcyB3cml0dGVuCisgICBiYXNlZCBvbiBkb2N1bWVudGF0aW9uIGluIHRoZWlyIFVzZXIncyBNYW51YWwgZmlsZSBhbmQgRGV2ZWxvcGVyJ3MKKyAgIFRvb2xzIGRpc2suCisKKyAgIFRoZSBEb3VibGVUYWxrIFBDIGNvbnRhaW5zIGZvdXIgdm9pY2Ugc3ludGhlc2l6ZXJzOiB0ZXh0LXRvLXNwZWVjaAorICAgKFRUUyksIGxpbmVhciBwcmVkaWN0aXZlIGNvZGluZyAoTFBDKSwgUENNL0FEUENNLCBhbmQgQ1ZTRC4gIEl0CisgICBhbHNvIGhhcyBhIHRvbmUgZ2VuZXJhdG9yLiAgT3V0cHV0IGRhdGEgZm9yIExQQyBhcmUgd3JpdHRlbiB0byB0aGUKKyAgIExQQyBwb3J0LCBhbmQgb3V0cHV0IGRhdGEgZm9yIHRoZSBvdGhlciBtb2RlcyBhcmUgd3JpdHRlbiB0byB0aGUKKyAgIFRUUyBwb3J0LgorCisgICBUd28ga2luZHMgb2YgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBEb3VibGVUYWxrOiBzdGF0dXMKKyAgIGluZm9ybWF0aW9uIChpbiByZXNwb25zZSB0byB0aGUgIlwwMDE/IiBpbnRlcnJvZ2F0aW9uIGNvbW1hbmQpIGlzCisgICByZWFkIGZyb20gdGhlIFRUUyBwb3J0LCBhbmQgaW5kZXggbWFya2VycyAod2hpY2ggbWFyayB0aGUgcHJvZ3Jlc3MKKyAgIG9mIHRoZSBzcGVlY2gpIGFyZSByZWFkIGZyb20gdGhlIExQQyBwb3J0LiAgTm90IGFsbCBtb2RlbHMgb2YgdGhlCisgICBEb3VibGVUYWxrIFBDIGltcGxlbWVudCBpbmRleCBtYXJrZXJzLiAgQm90aCB0aGUgVFRTIGFuZCBMUEMgcG9ydHMKKyAgIGNhbiBhbHNvIGRpc3BsYXkgc3RhdHVzIGZsYWdzLgorCisgICBUaGUgRG91YmxlVGFsayBQQyBnZW5lcmF0ZXMgbm8gaW50ZXJydXB0cy4KKworICAgVGhlc2UgY2hhcmFjdGVyaXN0aWNzIGFyZSBtYXBwZWQgaW50byB0aGUgVW5peCBzdHJlYW0gSS9PIG1vZGVsIGFzCisgICBmb2xsb3dzOgorCisgICAid3JpdGUiIHNlbmRzIGJ5dGVzIHRvIHRoZSBUVFMgcG9ydC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICAgdGhlIHVzZXIgcHJvZ3JhbSB0byBzd2l0Y2ggbW9kZXMgYW1vbmcgVFRTLCBQQ00vQURQQ00sIGFuZCBDVlNELgorICAgVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gZm9yIHVzZSB3aXRoIHRoZSB0ZXh0LXRvLXNwZWVjaAorICAgc3ludGhlc2l6ZXIuICBJZiBMUEMgb3V0cHV0IGlzIG5lZWRlZCBzb21lIGRheSwgb3RoZXIgbWlub3IgZGV2aWNlCisgICBudW1iZXJzIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBhbW9uZyBvdXRwdXQgbW9kZXMuCisKKyAgICJyZWFkIiBnZXRzIGluZGV4IG1hcmtlcnMgZnJvbSB0aGUgTFBDIHBvcnQuICBJZiB0aGUgZGV2aWNlIGRvZXMKKyAgIG5vdCBpbXBsZW1lbnQgaW5kZXggbWFya2VycywgdGhlIHJlYWQgd2lsbCBmYWlsIHdpdGggZXJyb3IgRUlOVkFMLgorCisgICBTdGF0dXMgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSBEVExLX0lOVEVSUk9HQVRFIGlvY3RsLgorCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgkJLyogZm9yIHZlcmlmeV9hcmVhICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogZm9yIC1FQlVTWSAqLworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiBmb3IgcmVxdWVzdF9yZWdpb24gKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgbG9vcHNfcGVyX2ppZmZ5ICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBmb3IgaW5iX3AsIG91dGJfcCwgaW5iLCBvdXRiLCBldGMuICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogZm9yIGdldF91c2VyLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgkJLyogZm9yIHdhaXRfcXVldWUgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBmb3IgX19pbml0LCBtb2R1bGVfe2luaXQsZXhpdH0gKi8KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CQkvKiBmb3IgUE9MTElOLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZHRsay5oPgkJLyogbG9jYWwgaGVhZGVyIGZpbGUgZm9yIERvdWJsZVRhbGsgdmFsdWVzICovCisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2lmZGVmIFRSQUNJTkcKKyNkZWZpbmUgVFJBQ0VfVEVYVChzdHIpIHByaW50ayhzdHIpOworI2RlZmluZSBUUkFDRV9SRVQgcHJpbnRrKCIpIikKKyNlbHNlCQkJCS8qICFUUkFDSU5HICovCisjZGVmaW5lIFRSQUNFX1RFWFQoc3RyKSAoKHZvaWQpIDApCisjZGVmaW5lIFRSQUNFX1JFVCAoKHZvaWQpIDApCisjZW5kaWYJCQkJLyogVFJBQ0lORyAqLworCisKK3N0YXRpYyBpbnQgZHRsa19tYWpvcjsKK3N0YXRpYyBpbnQgZHRsa19wb3J0X2xwYzsKK3N0YXRpYyBpbnQgZHRsa19wb3J0X3R0czsKK3N0YXRpYyBpbnQgZHRsa19idXN5Oworc3RhdGljIGludCBkdGxrX2hhc19pbmRleGluZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHRsa19wb3J0bGlzdFtdID0KK3sweDI1ZSwgMHgyOWUsIDB4MmRlLCAweDMxZSwgMHgzNWUsIDB4MzllLCAwfTsKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBkdGxrX3Byb2Nlc3NfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkdGxrX3RpbWVyOworCisvKiBwcm90b3R5cGVzIGZvciBmaWxlX29wZXJhdGlvbnMgc3RydWN0ICovCitzdGF0aWMgc3NpemVfdCBkdGxrX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwKKwkJCSBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKiBwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGR0bGtfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwKKwkJCSAgc2l6ZV90IG5ieXRlcywgbG9mZl90ICogcHBvcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IGR0bGtfcG9sbChzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOworc3RhdGljIGludCBkdGxrX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBkdGxrX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBkdGxrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR0bGtfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGR0bGtfcmVhZCwKKwkud3JpdGUJCT0gZHRsa193cml0ZSwKKwkucG9sbAkJPSBkdGxrX3BvbGwsCisJLmlvY3RsCQk9IGR0bGtfaW9jdGwsCisJLm9wZW4JCT0gZHRsa19vcGVuLAorCS5yZWxlYXNlCT0gZHRsa19yZWxlYXNlLAorfTsKKworLyogbG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGludCBkdGxrX2Rldl9wcm9iZSh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgZHRsa19zZXR0aW5ncyAqZHRsa19pbnRlcnJvZ2F0ZSh2b2lkKTsKK3N0YXRpYyBpbnQgZHRsa19yZWFkYWJsZSh2b2lkKTsKK3N0YXRpYyBjaGFyIGR0bGtfcmVhZF9scGModm9pZCk7CitzdGF0aWMgY2hhciBkdGxrX3JlYWRfdHRzKHZvaWQpOworc3RhdGljIGludCBkdGxrX3dyaXRlYWJsZSh2b2lkKTsKK3N0YXRpYyBjaGFyIGR0bGtfd3JpdGVfYnl0ZXMoY29uc3QgY2hhciAqYnVmLCBpbnQgbik7CitzdGF0aWMgY2hhciBkdGxrX3dyaXRlX3R0cyhjaGFyKTsKKy8qCisgICBzdGF0aWMgdm9pZCBkdGxrX2hhbmRsZV9lcnJvcihjaGFyLCBjaGFyLCB1bnNpZ25lZCBpbnQpOworICovCitzdGF0aWMgdm9pZCBkdGxrX3RpbWVyX3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHNzaXplX3QgZHRsa19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgY2g7CisJaW50IGkgPSAwLCByZXRyaWVzOworCisJVFJBQ0VfVEVYVCgiKGR0bGtfcmVhZCIpOworCS8qICBwcmludGsoIkRvdWJsZVRhbGsgUEMgLSBkdGxrX3JlYWQoKVxuIik7ICovCisKKwlpZiAobWlub3IgIT0gRFRMS19NSU5PUiB8fCAhZHRsa19oYXNfaW5kZXhpbmcpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IGxvb3BzX3Blcl9qaWZmeTsgcmV0cmllcysrKSB7CisJCXdoaWxlIChpIDwgY291bnQgJiYgZHRsa19yZWFkYWJsZSgpKSB7CisJCQljaCA9IGR0bGtfcmVhZF9scGMoKTsKKwkJCS8qICAgICAgICBwcmludGsoImR0bGtfcmVhZCgpIHJlYWRzIDB4JTAyeFxuIiwgY2gpOyAqLworCQkJaWYgKHB1dF91c2VyKGNoLCBidWYrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpKys7CisJCX0KKwkJaWYgKGkpCisJCQlyZXR1cm4gaTsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJYnJlYWs7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJfQorCWlmIChyZXRyaWVzID09IGxvb3BzX3Blcl9qaWZmeSkKKwkJcHJpbnRrKEtFUk5fRVJSICJkdGxrX3JlYWQgdGltZXMgb3V0XG4iKTsKKwlUUkFDRV9SRVQ7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR0bGtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlpbnQgaSA9IDAsIHJldHJpZXMgPSAwLCBjaDsKKworCVRSQUNFX1RFWFQoIihkdGxrX3dyaXRlIik7CisjaWZkZWYgVFJBQ0lORworCXByaW50aygiIFwiIik7CisJeworCQlpbnQgaSwgY2g7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoZ2V0X3VzZXIoY2gsIGJ1ZiArIGkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKCcgJyA8PSBjaCAmJiBjaCA8PSAnficpCisJCQkJcHJpbnRrKCIlYyIsIGNoKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIlxcJTAzbyIsIGNoKTsKKwkJfQorCQlwcmludGsoIlwiIik7CisJfQorI2VuZGlmCisKKwlpZiAoaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSBEVExLX01JTk9SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlICgxKSB7CisJCXdoaWxlIChpIDwgY291bnQgJiYgIWdldF91c2VyKGNoLCBidWYpICYmCisJCSAgICAgICAoY2ggPT0gRFRMS19DTEVBUiB8fCBkdGxrX3dyaXRlYWJsZSgpKSkgeworCQkJZHRsa193cml0ZV90dHMoY2gpOworCQkJYnVmKys7CisJCQlpKys7CisJCQlpZiAoaSAlIDUgPT0gMCkKKwkJCQkvKiBXZSB5aWVsZCBvdXIgdGltZSB1bnRpbCBzY2hlZHVsZWQKKwkJCQkgICBhZ2Fpbi4gIFRoaXMgcmVkdWNlcyB0aGUgdHJhbnNmZXIKKwkJCQkgICByYXRlIHRvIDUwMCBieXRlcy9zZWMsIGJ1dCB0aGF0J3MKKwkJCQkgICBzdGlsbCBlbm91Z2ggdG8ga2VlcCB1cCB3aXRoIHRoZQorCQkJCSAgIHNwZWVjaCBzeW50aGVzaXplci4gKi8KKwkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKKwkJCWVsc2UgeworCQkJCS8qIHRoZSBSRFkgYml0IGdvZXMgemVybyAyLTMgdXNlYworCQkJCSAgIGFmdGVyIHdyaXRpbmcsIGFuZCBnb2VzIDEgYWdhaW4KKwkJCQkgICAxODAtMTkwIHVzZWMgbGF0ZXIuICBIZXJlLCB3ZSB3YWl0CisJCQkJICAgdXAgdG8gMjUwIHVzZWMgZm9yIHRoZSBSRFkgYml0IHRvCisJCQkJICAgZ28gbm9uemVyby4gKi8KKwkJCQlmb3IgKHJldHJpZXMgPSAwOworCQkJCSAgICAgcmV0cmllcyA8IGxvb3BzX3Blcl9qaWZmeSAvICg0MDAwL0haKTsKKwkJCQkgICAgIHJldHJpZXMrKykKKwkJCQkJaWYgKGluYl9wKGR0bGtfcG9ydF90dHMpICYKKwkJCQkJICAgIFRUU19XUklUQUJMRSkKKwkJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0cmllcyA9IDA7CisJCX0KKwkJaWYgKGkgPT0gY291bnQpCisJCQlyZXR1cm4gaTsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMSk7CisKKwkJaWYgKCsrcmV0cmllcyA+IDEwICogSFopIHsgLyogd2FpdCBubyBtb3JlIHRoYW4gMTAgc2VjCisJCQkJCSAgICAgIGZyb20gbGFzdCB3cml0ZSAqLworCQkJcHJpbnRrKCJkdGxrOiB3cml0ZSB0aW1lb3V0LiAgIgorCQkJICAgICAgICJpbmJfcChkdGxrX3BvcnRfdHRzKSA9IDB4JTAyeFxuIiwKKwkJCSAgICAgICBpbmJfcChkdGxrX3BvcnRfdHRzKSk7CisJCQlUUkFDRV9SRVQ7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCVRSQUNFX1JFVDsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkdGxrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCWludCBtYXNrID0gMDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CisKKwlUUkFDRV9URVhUKCIgZHRsa19wb2xsIik7CisJLyoKKwkgICBzdGF0aWMgbG9uZyBpbnQgajsKKwkgICBwcmludGsoIi4iKTsKKwkgICBwcmludGsoIjwlbGQ+IiwgamlmZmllcy1qKTsKKwkgICBqPWppZmZpZXM7CisJICovCisJcG9sbF93YWl0KGZpbGUsICZkdGxrX3Byb2Nlc3NfbGlzdCwgd2FpdCk7CisKKwlpZiAoZHRsa19oYXNfaW5kZXhpbmcgJiYgZHRsa19yZWFkYWJsZSgpKSB7CisJICAgICAgICBkZWxfdGltZXIoJmR0bGtfdGltZXIpOworCQltYXNrID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGR0bGtfd3JpdGVhYmxlKCkpIHsKKwkgICAgICAgIGRlbF90aW1lcigmZHRsa190aW1lcik7CisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCS8qIHRoZXJlIGFyZSBubyBleGNlcHRpb24gY29uZGl0aW9ucyAqLworCisJLyogVGhlcmUgd29uJ3QgYmUgYW55IGludGVycnVwdHMsIHNvIHdlIHNldCBhIHRpbWVyIGluc3RlYWQuICovCisJZXhwaXJlcyA9IGppZmZpZXMgKyAzKkhaIC8gMTAwOworCW1vZF90aW1lcigmZHRsa190aW1lciwgZXhwaXJlcyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHZvaWQgZHRsa190aW1lcl90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlUUkFDRV9URVhUKCIgZHRsa190aW1lcl90aWNrIik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkdGxrX3Byb2Nlc3NfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgZHRsa19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhciBfX3VzZXIgKmFyZ3AgPSAoY2hhciBfX3VzZXIgKilhcmc7CisJc3RydWN0IGR0bGtfc2V0dGluZ3MgKnNwOworCWNoYXIgcG9ydHZhbDsKKwlUUkFDRV9URVhUKCIgZHRsa19pb2N0bCIpOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgRFRMS19JTlRFUlJPR0FURToKKwkJc3AgPSBkdGxrX2ludGVycm9nYXRlKCk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgc3AsIHNpemVvZihzdHJ1Y3QgZHRsa19zZXR0aW5ncykpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCisJY2FzZSBEVExLX1NUQVRVUzoKKwkJcG9ydHZhbCA9IGluYl9wKGR0bGtfcG9ydF90dHMpOworCQlyZXR1cm4gcHV0X3VzZXIocG9ydHZhbCwgYXJncCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHRsa19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCVRSQUNFX1RFWFQoIihkdGxrX29wZW4iKTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN3aXRjaCAoaW1pbm9yKGlub2RlKSkgeworCWNhc2UgRFRMS19NSU5PUjoKKwkJaWYgKGR0bGtfYnVzeSkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgaW50IGR0bGtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlUUkFDRV9URVhUKCIoZHRsa19yZWxlYXNlIik7CisKKwlzd2l0Y2ggKGltaW5vcihpbm9kZSkpIHsKKwljYXNlIERUTEtfTUlOT1I6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCVRSQUNFX1JFVDsKKwkKKwlkZWxfdGltZXIoJmR0bGtfdGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGR0bGtfaW5pdCh2b2lkKQoreworCWR0bGtfcG9ydF9scGMgPSAwOworCWR0bGtfcG9ydF90dHMgPSAwOworCWR0bGtfYnVzeSA9IDA7CisJZHRsa19tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCAiZHRsayIsICZkdGxrX2ZvcHMpOworCWlmIChkdGxrX21ham9yID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEb3VibGVUYWxrIFBDIC0gY2Fubm90IHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZHRsa19kZXZfcHJvYmUoKSA9PSAwKQorCQlwcmludGsoIiwgTUFKT1IgJWRcbiIsIGR0bGtfbWFqb3IpOworCisJZGV2ZnNfbWtfY2RldihNS0RFVihkdGxrX21ham9yLCBEVExLX01JTk9SKSwKKwkJICAgICAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwgImR0bGsiKTsKKworCWluaXRfdGltZXIoJmR0bGtfdGltZXIpOworCWR0bGtfdGltZXIuZnVuY3Rpb24gPSBkdGxrX3RpbWVyX3RpY2s7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZHRsa19wcm9jZXNzX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkdGxrX2NsZWFudXAgKHZvaWQpCit7CisJZHRsa193cml0ZV9ieXRlcygiZ29vZGJ5ZSIsIDgpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDUwMCk7CQkvKiBuYXAgMC41MCBzZWMgYnV0CisJCQkJCQkgICBjb3VsZCBiZSBhd2FrZW5lZAorCQkJCQkJICAgZWFybGllciBieQorCQkJCQkJICAgc2lnbmFscy4uLiAqLworCisJZHRsa193cml0ZV90dHMoRFRMS19DTEVBUik7CisJdW5yZWdpc3Rlcl9jaHJkZXYoZHRsa19tYWpvciwgImR0bGsiKTsKKwlkZXZmc19yZW1vdmUoImR0bGsiKTsKKwlyZWxlYXNlX3JlZ2lvbihkdGxrX3BvcnRfbHBjLCBEVExLX0lPX0VYVEVOVCk7Cit9CisKK21vZHVsZV9pbml0KGR0bGtfaW5pdCk7Cittb2R1bGVfZXhpdChkdGxrX2NsZWFudXApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkdGxrX3JlYWRhYmxlKHZvaWQpCit7CisjaWZkZWYgVFJBQ0lORworCXByaW50aygiIGR0bGtfcmVhZGFibGU9JXVAJXUiLCBpbmJfcChkdGxrX3BvcnRfbHBjKSAhPSAweDdmLCBqaWZmaWVzKTsKKyNlbmRpZgorCXJldHVybiBpbmJfcChkdGxrX3BvcnRfbHBjKSAhPSAweDdmOworfQorCitzdGF0aWMgaW50IGR0bGtfd3JpdGVhYmxlKHZvaWQpCit7CisJLyogVFJBQ0VfVEVYVCgiIGR0bGtfd3JpdGVhYmxlIik7ICovCisjaWZkZWYgVFJBQ0lOR01PUkUKKwlwcmludGsoIiBkdGxrX3dyaXRlYWJsZT0ldSIsIChpbmJfcChkdGxrX3BvcnRfdHRzKSAmIFRUU19XUklUQUJMRSkhPTApOworI2VuZGlmCisJcmV0dXJuIGluYl9wKGR0bGtfcG9ydF90dHMpICYgVFRTX1dSSVRBQkxFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkdGxrX2Rldl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB0ZXN0dmFsID0gMDsKKwlpbnQgaSA9IDA7CisJc3RydWN0IGR0bGtfc2V0dGluZ3MgKnNwOworCisJaWYgKGR0bGtfcG9ydF9scGMgfCBkdGxrX3BvcnRfdHRzKQorCQlyZXR1cm4gLUVCVVNZOworCisJZm9yIChpID0gMDsgZHRsa19wb3J0bGlzdFtpXTsgaSsrKSB7CisjaWYgMAorCQlwcmludGsoIkRvdWJsZVRhbGsgUEMgLSBQb3J0ICUwM3ggPSAlMDR4XG4iLAorCQkgICAgICAgZHRsa19wb3J0bGlzdFtpXSwgKHRlc3R2YWwgPSBpbndfcChkdGxrX3BvcnRsaXN0W2ldKSkpOworI2VuZGlmCisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkdGxrX3BvcnRsaXN0W2ldLCBEVExLX0lPX0VYVEVOVCwgCisJCQkgICAgICAgImR0bGsiKSkKKwkJCWNvbnRpbnVlOworCQl0ZXN0dmFsID0gaW53X3AoZHRsa19wb3J0bGlzdFtpXSk7CisJCWlmICgodGVzdHZhbCAmPSAweGZiZmYpID09IDB4MTA3ZikgeworCQkJZHRsa19wb3J0X2xwYyA9IGR0bGtfcG9ydGxpc3RbaV07CisJCQlkdGxrX3BvcnRfdHRzID0gZHRsa19wb3J0X2xwYyArIDE7CisKKwkJCXNwID0gZHRsa19pbnRlcnJvZ2F0ZSgpOworCQkJcHJpbnRrKCJEb3VibGVUYWxrIFBDIGF0ICUwM3gtJTAzeCwgIgorCQkJICAgICAgICJST00gdmVyc2lvbiAlcywgc2VyaWFsIG51bWJlciAldSIsCisJCQkgICAgICAgZHRsa19wb3J0bGlzdFtpXSwgZHRsa19wb3J0bGlzdFtpXSArCisJCQkgICAgICAgRFRMS19JT19FWFRFTlQgLSAxLAorCQkJICAgICAgIHNwLT5yb21fdmVyc2lvbiwgc3AtPnNlcmlhbF9udW1iZXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgTFBDIHBvcnQgaW50byBrbm93biBzdGF0ZSwgc28KKwkJCSAgIGR0bGtfcmVhZGFibGUoKSBnaXZlcyB2YWxpZCByZXN1bHQgKi8KKwkJCW91dGJfcCgweGZmLCBkdGxrX3BvcnRfbHBjKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOSVQgc3RyaW5nIGFuZCBpbmRleCBtYXJrZXIgKi8KKwkJCWR0bGtfd3JpdGVfYnl0ZXMoIlwwMzZcMUBcMFwwMDEySVxyIiwgOCk7CisJCQkvKiBwb3N0aW5nIGFuIGluZGV4IHRha2VzIDE4IG1zZWMuICBIZXJlLCB3ZQorCQkJICAgd2FpdCB1cCB0byAxMDAgbXNlYyB0byBzZWUgd2hldGhlciBpdAorCQkJICAgYXBwZWFycy4gKi8KKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJCQlkdGxrX2hhc19pbmRleGluZyA9IGR0bGtfcmVhZGFibGUoKTsKKyNpZmRlZiBUUkFDSU5HCisJCQlwcmludGsoIiwgaW5kZXhpbmcgJWRcbiIsIGR0bGtfaGFzX2luZGV4aW5nKTsKKyNlbmRpZgorI2lmZGVmIElOU0NPUEUKKwkJCXsKKy8qIFRoaXMgbWFjcm8gcmVjb3JkcyB0ZW4gc2FtcGxlcyByZWFkIGZyb20gdGhlIExQQyBwb3J0LCBmb3IgbGF0ZXIgZGlzcGxheSAqLworI2RlZmluZSBMT09LCQkJCQlcCitmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykJCQlcCisgIHsJCQkJCQlcCisgICAgYnVmZmVyW2IrK10gPSBpbmJfcChkdGxrX3BvcnRfbHBjKTsJCVwKKyAgICBfX2RlbGF5KGxvb3BzX3Blcl9qaWZmeS8oMTAwMDAwMC9IWikpOyAgICAgICAgICAgICBcCisgIH0KKwkJCQljaGFyIGJ1ZmZlclsxMDAwXTsKKwkJCQlpbnQgYiA9IDAsIGksIGo7CisKKwkJCQlMT09LCisJCQkJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlMT09LCisJCQkJZHRsa193cml0ZV9ieXRlcygiXDAwMTJJXHIiLCA0KTsKKwkJCQlidWZmZXJbYisrXSA9IDA7CisJCQkJX19kZWxheSg1MCAqIGxvb3BzX3Blcl9qaWZmeSAvICgxMDAwL0haKSk7CisJCQkJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlMT09LCisKKwkJCQlwcmludGsoIlxuIik7CisJCQkJZm9yIChqID0gMDsgaiA8IGI7IGorKykKKwkJCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZmZlcltqXSk7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorI2VuZGlmCQkJCS8qIElOU0NPUEUgKi8KKworI2lmZGVmIE9VVFNDT1BFCisJCQl7CisvKiBUaGlzIG1hY3JvIHJlY29yZHMgdGVuIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBUVFMgcG9ydCwgZm9yIGxhdGVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgTE9PSwkJCQkJXAorZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCQkJXAorICB7CQkJCQkJXAorICAgIGJ1ZmZlcltiKytdID0gaW5iX3AoZHRsa19wb3J0X3R0cyk7CQlcCisgICAgX19kZWxheShsb29wc19wZXJfamlmZnkvKDEwMDAwMDAvSFopKTsgIC8qIDEgdXMgKi8gXAorICB9CisJCQkJY2hhciBidWZmZXJbMTAwMF07CisJCQkJaW50IGIgPSAwLCBpLCBqOworCisJCQkJbWRlbGF5KDEwKTsJLyogMTAgbXMgKi8KKwkJCQlMT09LCisJCQkJb3V0Yl9wKDB4MDMsIGR0bGtfcG9ydF90dHMpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlMT09LCisJCQkJTE9PSworCisJCQkJcHJpbnRrKCJcbiIpOworCQkJCWZvciAoaiA9IDA7IGogPCBiOyBqKyspCisJCQkJCXByaW50aygiICUwMngiLCBidWZmZXJbal0pOworCQkJCXByaW50aygiXG4iKTsKKwkJCX0KKyNlbmRpZgkJCQkvKiBPVVRTQ09QRSAqLworCisJCQlkdGxrX3dyaXRlX2J5dGVzKCJEb3VibGUgVGFsayBmb3VuZCIsIDE4KTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oZHRsa19wb3J0bGlzdFtpXSwgRFRMS19JT19FWFRFTlQpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlxuRG91YmxlVGFsayBQQyAtIG5vdCBmb3VuZFxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgICBzdGF0aWMgdm9pZCBkdGxrX2hhbmRsZV9lcnJvcihjaGFyIG9wLCBjaGFyIHJjLCB1bnNpZ25lZCBpbnQgbWlub3IpCisgICB7CisgICBwcmludGsoS0VSTl9JTkZPIlxuRG91YmxlVGFsayBQQyAtIE1JTk9SOiAlZCwgT1BDT0RFOiAlZCwgRVJST1I6ICVkXG4iLCAKKyAgIG1pbm9yLCBvcCwgcmMpOworICAgcmV0dXJuOworICAgfQorICovCisKKy8qIGludGVycm9nYXRlIHRoZSBEb3VibGVUYWxrIFBDIGFuZCByZXR1cm4gaXRzIHNldHRpbmdzICovCitzdGF0aWMgc3RydWN0IGR0bGtfc2V0dGluZ3MgKmR0bGtfaW50ZXJyb2dhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0OworCXN0YXRpYyBjaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGR0bGtfc2V0dGluZ3MpICsgMV07CisJaW50IHRvdGFsLCBpOworCXN0YXRpYyBzdHJ1Y3QgZHRsa19zZXR0aW5ncyBzdGF0dXM7CisJVFJBQ0VfVEVYVCgiKGR0bGtfaW50ZXJyb2dhdGUiKTsKKwlkdGxrX3dyaXRlX2J5dGVzKCJcMDMwXDAwMT8iLCAzKTsKKwlmb3IgKHRvdGFsID0gMCwgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCWJ1Zlt0b3RhbF0gPSBkdGxrX3JlYWRfdHRzKCk7CisJCWlmICh0b3RhbCA+IDIgJiYgYnVmW3RvdGFsXSA9PSAweDdmKQorCQkJYnJlYWs7CisJCWlmICh0b3RhbCA8IHNpemVvZihzdHJ1Y3QgZHRsa19zZXR0aW5ncykpCisJCQl0b3RhbCsrOworCX0KKwkvKgorCSAgIGlmIChpPT01MCkgcHJpbnRrKCJpbnRlcnJvZ2F0ZSgpIHJlYWQgb3ZlcnJ1blxuIik7CisJICAgZm9yIChpPTA7IGk8c2l6ZW9mKGJ1Zik7IGkrKykKKwkgICBwcmludGsoIiAlMDJ4IiwgYnVmW2ldKTsKKwkgICBwcmludGsoIlxuIik7CisJICovCisJdCA9IGJ1ZjsKKwlzdGF0dXMuc2VyaWFsX251bWJlciA9IHRbMF0gKyB0WzFdICogMjU2OyAvKiBzZXJpYWwgbnVtYmVyIGlzCisJCQkJCQkgICAgIGxpdHRsZSBlbmRpYW4gKi8KKwl0ICs9IDI7CisKKwlpID0gMDsKKwl3aGlsZSAoKnQgIT0gJ1xyJykgeworCQlzdGF0dXMucm9tX3ZlcnNpb25baV0gPSAqdDsKKwkJaWYgKGkgPCBzaXplb2Yoc3RhdHVzLnJvbV92ZXJzaW9uKSAtIDEpCisJCQlpKys7CisJCXQrKzsKKwl9CisJc3RhdHVzLnJvbV92ZXJzaW9uW2ldID0gMDsKKwl0Kys7CisKKwlzdGF0dXMubW9kZSA9ICp0Kys7CisJc3RhdHVzLnB1bmNfbGV2ZWwgPSAqdCsrOworCXN0YXR1cy5mb3JtYW50X2ZyZXEgPSAqdCsrOworCXN0YXR1cy5waXRjaCA9ICp0Kys7CisJc3RhdHVzLnNwZWVkID0gKnQrKzsKKwlzdGF0dXMudm9sdW1lID0gKnQrKzsKKwlzdGF0dXMudG9uZSA9ICp0Kys7CisJc3RhdHVzLmV4cHJlc3Npb24gPSAqdCsrOworCXN0YXR1cy5leHRfZGljdF9sb2FkZWQgPSAqdCsrOworCXN0YXR1cy5leHRfZGljdF9zdGF0dXMgPSAqdCsrOworCXN0YXR1cy5mcmVlX3JhbSA9ICp0Kys7CisJc3RhdHVzLmFydGljdWxhdGlvbiA9ICp0Kys7CisJc3RhdHVzLnJldmVyYiA9ICp0Kys7CisJc3RhdHVzLmVvYiA9ICp0Kys7CisJc3RhdHVzLmhhc19pbmRleGluZyA9IGR0bGtfaGFzX2luZGV4aW5nOworCVRSQUNFX1JFVDsKKwlyZXR1cm4gJnN0YXR1czsKK30KKworc3RhdGljIGNoYXIgZHRsa19yZWFkX3R0cyh2b2lkKQoreworCWludCBwb3J0dmFsLCByZXRyaWVzID0gMDsKKwljaGFyIGNoOworCVRSQUNFX1RFWFQoIihkdGxrX3JlYWRfdHRzIik7CisKKwkvKiB2ZXJpZnkgRFQgaXMgcmVhZHksIHJlYWQgY2hhciwgd2FpdCBmb3IgQUNLICovCisJZG8geworCQlwb3J0dmFsID0gaW5iX3AoZHRsa19wb3J0X3R0cyk7CisJfSB3aGlsZSAoKHBvcnR2YWwgJiBUVFNfUkVBREFCTEUpID09IDAgJiYKKwkJIHJldHJpZXMrKyA8IERUTEtfTUFYX1JFVFJJRVMpOworCWlmIChyZXRyaWVzID09IERUTEtfTUFYX1JFVFJJRVMpCisJCXByaW50ayhLRVJOX0VSUiAiZHRsa19yZWFkX3R0cygpIHRpbWVvdXRcbiIpOworCisJY2ggPSBpbmJfcChkdGxrX3BvcnRfdHRzKTsJLyogaW5wdXQgZnJvbSBUVFMgcG9ydCAqLworCWNoICY9IDB4N2Y7CisJb3V0Yl9wKGNoLCBkdGxrX3BvcnRfdHRzKTsKKworCXJldHJpZXMgPSAwOworCWRvIHsKKwkJcG9ydHZhbCA9IGluYl9wKGR0bGtfcG9ydF90dHMpOworCX0gd2hpbGUgKChwb3J0dmFsICYgVFRTX1JFQURBQkxFKSAhPSAwICYmCisJCSByZXRyaWVzKysgPCBEVExLX01BWF9SRVRSSUVTKTsKKwlpZiAocmV0cmllcyA9PSBEVExLX01BWF9SRVRSSUVTKQorCQlwcmludGsoS0VSTl9FUlIgImR0bGtfcmVhZF90dHMoKSB0aW1lb3V0XG4iKTsKKworCVRSQUNFX1JFVDsKKwlyZXR1cm4gY2g7Cit9CisKK3N0YXRpYyBjaGFyIGR0bGtfcmVhZF9scGModm9pZCkKK3sKKwlpbnQgcmV0cmllcyA9IDA7CisJY2hhciBjaDsKKwlUUkFDRV9URVhUKCIoZHRsa19yZWFkX2xwYyIpOworCisJLyogbm8gbmVlZCB0byB0ZXN0IC0tIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgcG9ydCBpcyByZWFkYWJsZSAqLworCisJY2ggPSBpbmJfcChkdGxrX3BvcnRfbHBjKTsJLyogaW5wdXQgZnJvbSBMUEMgcG9ydCAqLworCisJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOworCisJLyogYWNrbm93bGVkZ2luZyBhIHJlYWQgdGFrZXMgMy00CisJICAgdXNlYy4gIEhlcmUsIHdlIHdhaXQgdXAgdG8gMjAgdXNlYworCSAgIGZvciB0aGUgYWNrbm93bGVkZ2VtZW50ICovCisJcmV0cmllcyA9IChsb29wc19wZXJfamlmZnkgKiAyMCkgLyAoMTAwMDAwMC9IWik7CisJd2hpbGUgKGluYl9wKGR0bGtfcG9ydF9scGMpICE9IDB4N2YgJiYgLS1yZXRyaWVzID4gMCk7CisJaWYgKHJldHJpZXMgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkdGxrX3JlYWRfbHBjKCkgdGltZW91dFxuIik7CisKKwlUUkFDRV9SRVQ7CisJcmV0dXJuIGNoOworfQorCisvKiB3cml0ZSBuIGJ5dGVzIHRvIHR0cyBwb3J0ICovCitzdGF0aWMgY2hhciBkdGxrX3dyaXRlX2J5dGVzKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJY2hhciB2YWwgPSAwOworCS8qICBwcmludGsoImR0bGtfd3JpdGVfYnl0ZXMoXCIlLSpzXCIsICVkKVxuIiwgbiwgYnVmLCBuKTsgKi8KKwlUUkFDRV9URVhUKCIoZHRsa193cml0ZV9ieXRlcyIpOworCXdoaWxlIChuLS0gPiAwKQorCQl2YWwgPSBkdGxrX3dyaXRlX3R0cygqYnVmKyspOworCVRSQUNFX1JFVDsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgY2hhciBkdGxrX3dyaXRlX3R0cyhjaGFyIGNoKQoreworCWludCByZXRyaWVzID0gMDsKKyNpZmRlZiBUUkFDSU5HTU9SRQorCXByaW50aygiICBkdGxrX3dyaXRlX3R0cygiKTsKKwlpZiAoJyAnIDw9IGNoICYmIGNoIDw9ICd+JykKKwkJcHJpbnRrKCInJWMnIiwgY2gpOworCWVsc2UKKwkJcHJpbnRrKCIweCUwMngiLCBjaCk7CisjZW5kaWYKKwlpZiAoY2ggIT0gRFRMS19DTEVBUikJLyogbm8gZmxvdyBjb250cm9sIGZvciBDTEVBUiBjb21tYW5kICovCisJCXdoaWxlICgoaW5iX3AoZHRsa19wb3J0X3R0cykgJiBUVFNfV1JJVEFCTEUpID09IDAgJiYKKwkJICAgICAgIHJldHJpZXMrKyA8IERUTEtfTUFYX1JFVFJJRVMpCS8qIERUIHJlYWR5PyAqLworCQkJOworCWlmIChyZXRyaWVzID09IERUTEtfTUFYX1JFVFJJRVMpCisJCXByaW50ayhLRVJOX0VSUiAiZHRsa193cml0ZV90dHMoKSB0aW1lb3V0XG4iKTsKKworCW91dGJfcChjaCwgZHRsa19wb3J0X3R0cyk7CS8qIG91dHB1dCB0byBUVFMgcG9ydCAqLworCS8qIHRoZSBSRFkgYml0IGdvZXMgemVybyAyLTMgdXNlYyBhZnRlciB3cml0aW5nLCBhbmQgZ29lcworCSAgIDEgYWdhaW4gMTgwLTE5MCB1c2VjIGxhdGVyLiAgSGVyZSwgd2Ugd2FpdCB1cCB0byAxMAorCSAgIHVzZWMgZm9yIHRoZSBSRFkgYml0IHRvIGdvIHplcm8uICovCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IGxvb3BzX3Blcl9qaWZmeSAvICgxMDAwMDAvSFopOyByZXRyaWVzKyspCisJCWlmICgoaW5iX3AoZHRsa19wb3J0X3R0cykgJiBUVFNfV1JJVEFCTEUpID09IDApCisJCQlicmVhazsKKworI2lmZGVmIFRSQUNJTkdNT1JFCisJcHJpbnRrKCIpXG4iKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZWMzMTA0X2tleWIuYyBiL2RyaXZlcnMvY2hhci9lYzMxMDRfa2V5Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWQ2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZWMzMTA0X2tleWIuYwpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9lYzMxMDRfa2V5Yi5jCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KKyAqCisgKiBiYXNlZCBvbiBsaW51eC9kcml2ZXJzL2NoYXIvcGNfa2V5Yi5jLCB3aGljaCBoYWQgdGhlIGZvbGxvd2luZyBjb21tZW50czoKKyAqCisgKiBTZXBhcmF0aW9uIG9mIHRoZSBQQyBsb3ctbGV2ZWwgcGFydCBieSBHZWVydCBVeXR0ZXJob2V2ZW4sIE1heSAxOTk3CisgKiBTZWUga2V5Ym9hcmQuYyBmb3IgdGhlIHdob2xlIGhpc3RvcnkuCisgKgorICogTWFqb3IgY2xlYW51cCBieSBNYXJ0aW4gTWFyZXMsIE1heSAxOTk3CisgKgorICogQ29tYmluZWQgdGhlIGtleWJvYXJkIGFuZCBQUy8yIG1vdXNlIGhhbmRsaW5nIGludG8gb25lIGZpbGUsCisgKiBiZWNhdXNlIHRoZXkgc2hhcmUgdGhlIHNhbWUgaGFyZHdhcmUuCisgKiBKb2hhbiBNeXJlZW4gPGplbUBpa2kuZmk+IDE5OTgtMTAtMDguCisgKgorICogQ29kZSBmaXhlcyB0byBoYW5kbGUgbW91c2UgQUNLcyBwcm9wZXJseS4KKyAqIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiAxOTk5LTAxLTI5LgorICovCisvKiBFQzMxMDQgbm90ZToKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB3aXRob3V0IGFueSBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBFQzMxMDQgY2hpcC4gIFdoaWxlCisgKiBJIGhvcGUgSSBnb3QgbW9zdCBvZiB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSByaWdodCwgdGhlIHJlZ2lzdGVyIG5hbWVzIEkgdXNlCisgKiBhcmUgbW9zdCBsaWtlbHkgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBpbiB0aGUgY2hpcCBkb2N1bWVudGF0aW9uLgorICoKKyAqIElmIHlvdSBoYXZlIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBFQzMxMDQsIHBsZWFzZSB0ZWxsIG1lCisgKiAocHJ1bXBmQHR1eC5vcmcpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZWMzMTA0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogU29tZSBjb25maWd1cmF0aW9uIHN3aXRjaGVzIGFyZSBwcmVzZW50IGluIHRoZSBpbmNsdWRlIGZpbGUuLi4gKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjX2tleWIuaD4KKworI2RlZmluZSBNU1JfQ1RTIDB4MTAKKyNkZWZpbmUgTUNSX1JUUyAweDAyCisjZGVmaW5lIExTUl9EUiAweDAxCisjZGVmaW5lIExTUl9CT1RIX0VNUFRZIDB4NjAKKworc3RhdGljIHN0cnVjdCBlNV9zdHJ1Y3QgeworCXU4IHBhY2tldFs4XTsKKwlpbnQgcG9zOworCWludCBsZW5ndGg7CisKKwl1OCBjYWNoZWRfbWNyOworCXU4IGxhc3RfbXNyOworfSBlYzMxMDRfa2V5YjsKKwkKKy8qIFNpbXBsZSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgdGhlIFN5c1JxIGtleXMgKi8KKworCisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCit1bnNpZ25lZCBjaGFyIGVjMzEwNF9rYmRfc3lzcnFfeGxhdGVbMTI4XSA9CisJIlwwMDBcMDMzMTIzNDU2Nzg5MC09XDE3N1x0IgkJCS8qIDB4MDAgLSAweDBmICovCisJInF3ZXJ0eXVpb3BbXVxyXDAwMGFzIgkJCQkvKiAweDEwIC0gMHgxZiAqLworCSJkZmdoamtsOydgXDAwMFxcenhjdiIJCQkJLyogMHgyMCAtIDB4MmYgKi8KKwkiYm5tLC4vXDAwMCpcMDAwIFwwMDBcMjAxXDIwMlwyMDNcMjA0XDIwNSIJLyogMHgzMCAtIDB4M2YgKi8KKwkiXDIwNlwyMDdcMjEwXDIxMVwyMTJcMDAwXDAwMDc4OS00NTYrMSIJCS8qIDB4NDAgLSAweDRmICovCisJIjIzMFwxNzdcMDAwXDAwMFwyMTNcMjE0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIgLyogMHg1MCAtIDB4NWYgKi8KKwkiXHJcMDAwLyI7CQkJCQkvKiAweDYwIC0gMHg2ZiAqLworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGtiZF93cml0ZV9jb21tYW5kX3coaW50IGRhdGEpOworc3RhdGljIHZvaWQga2JkX3dyaXRlX291dHB1dF93KGludCBkYXRhKTsKKyNpZmRlZiBDT05GSUdfUFNNT1VTRQorc3RhdGljIHZvaWQgYXV4X3dyaXRlX2FjayhpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIF9fYXV4X3dyaXRlX2FjayhpbnQgdmFsKTsKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtiZF9jb250cm9sbGVyX2xvY2spOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGFuZGxlX2tiZF9ldmVudCh2b2lkKTsKKworLyogdXNlZCBvbmx5IGJ5IHNlbmRfZGF0YSAtIHNldCBieSBrZXlib2FyZF9pbnRlcnJ1cHQgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlcGx5X2V4cGVjdGVkOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYWNrbm93bGVkZ2U7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciByZXNlbmQ7CisKKworaW50IGVjMzEwNF9rYmRfc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQoreworCXJldHVybiAwOworfQorCitpbnQgZWMzMTA0X2tiZF9nZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKiB5ZXMsIGl0IHByb2JhYmx5IHdvdWxkIGJlIGZhc3RlciB0byB1c2UgYW4gYXJyYXkuICBJIGRvbid0IGNhcmUuICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBlYzMxMDRfc2NhbjJrZXkodW5zaWduZWQgY2hhciBzY2FuY29kZSkKK3sKKwlzd2l0Y2ggKHNjYW5jb2RlKSB7CisJY2FzZSAgMTogLyogJ2AnICovCisJCXJldHVybiA0MTsKKwkJCisJY2FzZSAgMiAuLi4gMjc6CisJCXJldHVybiBzY2FuY29kZTsKKwkJCisJY2FzZSAyODogLyogJ1xcJyAqLworCQlyZXR1cm4gNDM7CisKKwljYXNlIDI5IC4uLiAzOToKKwkJcmV0dXJuIHNjYW5jb2RlICsgMTsKKworCWNhc2UgNDA6IC8qICdccicgKi8KKwkJcmV0dXJuIDI4OworCisJY2FzZSA0MSAuLi4gNTA6CisJCXJldHVybiBzY2FuY29kZSArIDM7CisKKwljYXNlIDUxOiAvKiAnICcgKi8KKwkJcmV0dXJuIDU3OworCQkKKwljYXNlIDUyOiAvKiBlc2NhcGUgKi8KKwkJcmV0dXJuIDE7CisKKwljYXNlIDU0OiAvKiBpbnNlcnQvZGVsZXRlIChsYWJlbGxlZCBkZWxldGUpICovCisJCS8qIHRoaXMgc2hvdWxkIGFyZ3VhYmx5IGJlIDExMCwgYnV0IEknZCBsaWtlIHRvIGhhdmUgY3RybC1hbHQtZGVsCisJCSAqIHdvcmtpbmcgd2l0aCBhIHN0YW5kYXJkIGtleW1hcCAqLworCQlyZXR1cm4gMTExOworCisJY2FzZSA1NTogLyogbGVmdCAqLworCQlyZXR1cm4gMTA1OworCWNhc2UgNTY6IC8qIGhvbWUgKi8KKwkJcmV0dXJuIDEwMjsKKwljYXNlIDU3OiAvKiBlbmQgKi8KKwkJcmV0dXJuIDEwNzsKKwljYXNlIDU4OiAvKiB1cCAqLworCQlyZXR1cm4gMTAzOworCWNhc2UgNTk6IC8qIGRvd24gKi8KKwkJcmV0dXJuIDEwODsKKwljYXNlIDYwOiAvKiBwZ3VwICovCisJCXJldHVybiAxMDQ7CisJY2FzZSA2MTogLyogcGdkb3duICovCisJCXJldHVybiAxMDk7CisJY2FzZSA2MjogLyogcmlnaHQgKi8KKwkJcmV0dXJuIDEwNjsKKworCWNhc2UgNzkgLi4uIDg4OiAvKiBmMSAtIGYxMCAqLworCQlyZXR1cm4gc2NhbmNvZGUgLSAyMDsKKworCWNhc2UgODkgLi4uIDkwOiAvKiBmMTEgLSBmMTIgKi8KKwkJcmV0dXJuIHNjYW5jb2RlIC0gMjsKKworCWNhc2UgOTE6IC8qIGxlZnQgc2hpZnQgKi8KKwkJcmV0dXJuIDQyOworCisJY2FzZSA5MjogLyogcmlnaHQgc2hpZnQgKi8KKwkJcmV0dXJuIDU0OworCisJY2FzZSA5MzogLyogbGVmdCBhbHQgKi8KKwkJcmV0dXJuIDU2OworCWNhc2UgOTQ6IC8qIHJpZ2h0IGFsdCAqLworCQlyZXR1cm4gMTAwOworCWNhc2UgOTU6IC8qIGxlZnQgY3RybCAqLworCQlyZXR1cm4gMjk7CisJY2FzZSA5NjogLyogcmlnaHQgY3RybCAqLworCQlyZXR1cm4gOTc7CisKKwljYXNlIDk3OiAvKiBjYXBzIGxvY2sgKi8KKwkJcmV0dXJuIDU4OworCWNhc2UgMTAyOiAvKiBsZWZ0IHdpbmRvd3MgKi8KKwkJcmV0dXJuIDEyNTsKKwljYXNlIDEwMzogLyogcmlnaHQgd2luZG93cyAqLworCQlyZXR1cm4gMTI2OworCisJY2FzZSAxMDY6IC8qIEZuICovCisJCS8qIHRoaXMgaXMgd3JvbmcuICovCisJCXJldHVybiA4NDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKwkJCitpbnQgZWMzMTA0X2tiZF90cmFuc2xhdGUodW5zaWduZWQgY2hhciBzY2FuY29kZSwgdW5zaWduZWQgY2hhciAqa2V5Y29kZSwKKwkJICAgIGNoYXIgcmF3X21vZGUpCit7CisJc2NhbmNvZGUgJj0gMHg3ZjsKKworCSprZXljb2RlID0gZWMzMTA0X3NjYW4ya2V5KHNjYW5jb2RlKTsKKworIAlyZXR1cm4gMTsKK30KKworY2hhciBlYzMxMDRfa2JkX3VuZXhwZWN0ZWRfdXAodW5zaWduZWQgY2hhciBrZXljb2RlKQoreworCXJldHVybiAwMjAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2tleWJvYXJkX2V2ZW50KHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUpCit7CisjaWZkZWYgQ09ORklHX1ZUCisJaGFuZGxlX3NjYW5jb2RlKHNjYW5jb2RlLCAhKHNjYW5jb2RlICYgMHg4MCkpOworI2VuZGlmCQkJCQorCXRhc2tsZXRfc2NoZWR1bGUoJmtleWJvYXJkX3Rhc2tsZXQpOworfQkKKwordm9pZCBlYzMxMDRfa2JkX2xlZHModW5zaWduZWQgY2hhciBsZWRzKQoreworfQorCitzdGF0aWMgdTggZTVfY2hlY2tzdW0odTggKnBhY2tldCwgaW50IGNvdW50KQoreworCWludCBpOworCXU4IHN1bSA9IDA7CisKKwlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKQorCQlzdW0gXj0gcGFja2V0W2ldOworCQkKKwlpZiAoc3VtICYgMHg4MCkKKwkJc3VtIF49IDB4YzA7CisKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBlNV93YWl0X2Zvcl9jdHMoc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwl1OCBtc3I7CisJCQorCWRvIHsKKwkJbXNyID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTVNSKTsKKwl9IHdoaWxlICghKG1zciAmIE1TUl9DVFMpKTsKK30KKworCitzdGF0aWMgdm9pZCBlNV9zZW5kX2J5dGUodTggYnl0ZSwgc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwl1OCBzdGF0dXM7CisJCQorCWRvIHsKKwkJc3RhdHVzID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTFNSKTsKKwl9IHdoaWxlICgoc3RhdHVzICYgTFNSX0JPVEhfRU1QVFkpICE9IExTUl9CT1RIX0VNUFRZKTsKKwkKKwlwcmludGsoIjwlMDJ4PiIsIGJ5dGUpOworCisJY3RybF9vdXRiKGJ5dGUsIEVDMzEwNF9TRVI0X0RBVEEpOworCisJZG8geworCQlzdGF0dXMgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9MU1IpOworCX0gd2hpbGUgKChzdGF0dXMgJiBMU1JfQk9USF9FTVBUWSkgIT0gTFNSX0JPVEhfRU1QVFkpOworCQorfQorCitzdGF0aWMgaW50IGU1X3NlbmRfcGFja2V0KHU4ICpwYWNrZXQsIGludCBjb3VudCwgc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwlpbnQgaTsKKworCWRpc2FibGVfaXJxKEVDMzEwNF9JUlFfU0VSNCk7CisJCisJaWYgKGstPmNhY2hlZF9tY3IgJiBNQ1JfUlRTKSB7CisJCXByaW50aygiZTVfc2VuZF9wYWNrZXQ6IHRvbyBzbG93XG4iKTsKKwkJZW5hYmxlX2lycShFQzMxMDRfSVJRX1NFUjQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlrLT5jYWNoZWRfbWNyIHw9IE1DUl9SVFM7CisJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisKKwllNV93YWl0X2Zvcl9jdHMoayk7CisKKwlwcmludGsoInA6ICIpOworCisJZm9yKGk9MDsgaTxjb3VudDsgaSsrKQorCQllNV9zZW5kX2J5dGUocGFja2V0W2ldLCBrKTsKKworCWU1X3NlbmRfYnl0ZShlNV9jaGVja3N1bShwYWNrZXQsIGNvdW50KSwgayk7CisKKwlwcmludGsoIlxuIik7CisKKwl1ZGVsYXkoMTUwMCk7CisKKwlrLT5jYWNoZWRfbWNyICY9IH5NQ1JfUlRTOworCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQorCQorCisJZW5hYmxlX2lycShFQzMxMDRfSVJRX1NFUjQpOworCisJCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEU1IHBhY2tldHMgd2Uga25vdyBhYm91dDoKKyAqIEU1LT5ob3N0IDB4ODAgMHgwNSA8Y2hlY2tzdW0+IC0gcmVzZW5kIHBhY2tldAorICogaG9zdC0+RTUgMHg4MyAweDQzIDxjb250cmFzdD4gLSBzZXQgTENEIGNvbnRyYXN0CisgKiBob3N0LT5FNSAweDg1IDB4NDEgMHgwMiA8YnJpZ2h0bmVzcz4gMHgwMiAtIHNldCBMQ0QgYmFja2xpZ2h0CisgKiBFNS0+aG9zdCAweDg3IDxwczIgcGFja2V0PiAweDAwIDxjaGVja3N1bT4gLSBleHRlcm5hbCBQUzIgCisgKiBFNS0+aG9zdCAweDg4IDxzY2FuY29kZT4gPGNoZWNrc3VtPiAtIGtleSBwcmVzcworICovCisKK3N0YXRpYyB2b2lkIGU1X3JlY2VpdmUoc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwlrLT5wYWNrZXRbay0+cG9zKytdID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfREFUQSk7CisKKwlpZiAoay0+cG9zID09IDEpIHsKKwkJc3dpdGNoKGstPnBhY2tldFswXSkgeworCQljYXNlIDB4ODA6CisJCQlrLT5sZW5ndGggPSAzOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAweDg3OiAvKiBQUzIgZXh0ICovCisJCQlrLT5sZW5ndGggPSA2OworCQkJYnJlYWs7CisKKwkJY2FzZSAweDg4OiAvKiBrZXlib2FyZCAqLworCQkJay0+bGVuZ3RoID0gMzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlrLT5sZW5ndGggPSAxOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5rbm93biBFNSBwYWNrZXQgJTAyeFxuIiwKKwkJCSAgICAgICBrLT5wYWNrZXRbMF0pOworCQl9CisJfQorCisJaWYgKGstPnBvcyA9PSBrLT5sZW5ndGgpIHsKKwkJaW50IGk7CisKKwkJaWYgKGU1X2NoZWNrc3VtKGstPnBhY2tldCwgay0+bGVuZ3RoKSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRTU6IHdyb25nIGNoZWNrc3VtXG4iKTsKKworI2lmIDAKKwkJcHJpbnRrKCJFNSBwYWNrZXQgWyIpOworCQlmb3IoaT0wOyBpPGstPmxlbmd0aDsgaSsrKSB7CisJCQlwcmludGsoIiUwMnggIiwgay0+cGFja2V0W2ldKTsKKwkJfQorCisJCXByaW50aygiKCUwMngpXVxuIiwgZTVfY2hlY2tzdW0oay0+cGFja2V0LCBrLT5sZW5ndGgtMSkpOworI2VuZGlmCisKKwkJc3dpdGNoKGstPnBhY2tldFswXSkgeworCQljYXNlIDB4ODA6CisJCWNhc2UgMHg4ODoKKwkJCWhhbmRsZV9rZXlib2FyZF9ldmVudChrLT5wYWNrZXRbMV0pOworCQkJYnJlYWs7CisJCX0KKworCQlrLT5wb3MgPSBrLT5sZW5ndGggPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgZWMzMTA0X2tleWJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlNV9zdHJ1Y3QgKmsgPSAmZWMzMTA0X2tleWI7CisJdTggbXNyLCBsc3I7CisKKwltc3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NU1IpOworCQorCWlmICgobXNyICYgTVNSX0NUUykgJiYgIShrLT5sYXN0X21zciAmIE1TUl9DVFMpKSB7CisJCWlmIChrLT5jYWNoZWRfbWNyICYgTUNSX1JUUykKKwkJCXByaW50aygiY29uZnVzZWQ6IFJUUyBhbHJlYWR5IGhpZ2hcbiIpOworCQkvKiBDVFMgd2VudCBoaWdoLiAgU2VuZCBSVFMuICovCisJCWstPmNhY2hlZF9tY3IgfD0gTUNSX1JUUzsKKwkJCisJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCX0gZWxzZSBpZiAoKCEobXNyICYgTVNSX0NUUykpICYmIChrLT5sYXN0X21zciAmIE1TUl9DVFMpKSB7CisJCS8qIENUUyB3ZW50IGxvdy4gKi8KKwkJaWYgKCEoay0+Y2FjaGVkX21jciAmIE1DUl9SVFMpKQorCQkJcHJpbnRrKCJjb25mdXNlZDogUlRTIGFscmVhZHkgbG93XG4iKTsKKworCQlrLT5jYWNoZWRfbWNyICY9IH5NQ1JfUlRTOworCisJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCX0KKworCWstPmxhc3RfbXNyID0gbXNyOworCisJbHNyID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTFNSKTsKKworCWlmIChsc3IgJiBMU1JfRFIpCisJCWU1X3JlY2VpdmUoayk7Cit9CisKK3N0YXRpYyB2b2lkIGVjMzEwNF9rZXliX2NsZWFyX3N0YXRlKHZvaWQpCit7CisJc3RydWN0IGU1X3N0cnVjdCAqayA9ICZlYzMxMDRfa2V5YjsKKwl1OCBtc3IsIGxzcjsKKwkKKwkvKiB3ZSB3YW50IENUUyB0byBiZSBsb3cgKi8KKwlrLT5sYXN0X21zciA9IDA7CisKKwlmb3IgKDs7KSB7CisJCW1zbGVlcCgxMDApOworCisJCW1zciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X01TUik7CisJCisJCWxzciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X0xTUik7CisJCQorCQlpZiAobHNyICYgTFNSX0RSKSB7CisJCQllNV9yZWNlaXZlKGspOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKG1zciAmIE1TUl9DVFMpICYmICEoay0+bGFzdF9tc3IgJiBNU1JfQ1RTKSkgeworCQkJaWYgKGstPmNhY2hlZF9tY3IgJiBNQ1JfUlRTKQorCQkJCXByaW50aygiY29uZnVzZWQ6IFJUUyBhbHJlYWR5IGhpZ2hcbiIpOworCQkJLyogQ1RTIHdlbnQgaGlnaC4gIFNlbmQgUlRTLiAqLworCQkJay0+Y2FjaGVkX21jciB8PSBNQ1JfUlRTOworCQkKKwkJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCQl9IGVsc2UgaWYgKCghKG1zciAmIE1TUl9DVFMpKSAmJiAoay0+bGFzdF9tc3IgJiBNU1JfQ1RTKSkgeworCQkJLyogQ1RTIHdlbnQgbG93LiAqLworCQkJaWYgKCEoay0+Y2FjaGVkX21jciAmIE1DUl9SVFMpKQorCQkJCXByaW50aygiY29uZnVzZWQ6IFJUUyBhbHJlYWR5IGxvd1xuIik7CisJCQkKKwkJCWstPmNhY2hlZF9tY3IgJj0gfk1DUl9SVFM7CisJCQkKKwkJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCisJCWstPmxhc3RfbXNyID0gbXNyOworCisJCWNvbnRpbnVlOworCX0KK30KKwordm9pZCBfX2luaXQgZWMzMTA0X2tiZF9pbml0X2h3KHZvaWQpCit7CisJZWMzMTA0X2tleWIubGFzdF9tc3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NU1IpOworCWVjMzEwNF9rZXliLmNhY2hlZF9tY3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NQ1IpOworCisJZWMzMTA0X2tleWJfY2xlYXJfc3RhdGUoKTsKKworCS8qIE9rLCBmaW5hbGx5IGFsbG9jYXRlIHRoZSBJUlEsIGFuZCBvZmYgd2UgZ28uLiAqLworCXJlcXVlc3RfaXJxKEVDMzEwNF9JUlFfU0VSNCwgZWMzMTA0X2tleWJfaW50ZXJydXB0LCAwLCAia2V5Ym9hcmQiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lZmlydGMuYyBiL2RyaXZlcnMvY2hhci9lZmlydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkwZTdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VmaXJ0Yy5jCkBAIC0wLDAgKzEsNDE3IEBACisvKgorICogRUZJIFRpbWUgU2VydmljZXMgRHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28KKyAqIENvcHlyaWdodCAoQykgMTk5OSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogQmFzZWQgb24gc2tlbGV0b24gZnJvbSB0aGUgZHJpdmVycy9jaGFyL3J0Yy5jIGRyaXZlciBieSBQLiBHb3J0bWFrZXIKKyAqCisgKiBUaGlzIGNvZGUgcHJvdmlkZXMgYW4gYXJjaGl0ZWN0ZWQgJiBwb3J0YWJsZSBpbnRlcmZhY2UgdG8gdGhlIHJlYWwgdGltZQorICogY2xvY2sgYnkgdXNpbmcgRUZJIGluc3RlYWQgb2YgZGlyZWN0IGJpdCBmaWRkbGluZy4gVGhlIGZ1bmN0aW9uYWxpdGllcyBhcmUgCisgKiBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgcnRjLmMgZHJpdmVyLiBUaGUgb25seSB3YXkgdG8gdGFsayB0byB0aGUgZGV2aWNlIAorICogaXMgYnkgdXNpbmcgaW9jdGwoKS4gVGhlcmUgaXMgYSAvcHJvYyBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgdGhlIHJhdyAKKyAqIGluZm9ybWF0aW9uLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgd2UgaGF2ZSBrZXB0IHRoZSBBUEkgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlCisgKiBsZWdhY3kgUlRDLiBUaGUgc3RhbmRhcmQgL3NiaW4vaHdjbG9jayBwcm9ncmFtIHNob3VsZCB3b3JrIG5vcm1hbGx5IAorICogd2hlbiB1c2VkIHRvIGdldC9zZXQgdGhlIHRpbWUuCisgKgorICogTk9URVM6CisgKgktIExvY2tpbmcgaXMgcmVxdWlyZWQgZm9yIHNhZmUgZXhlY3V0aW9uIG9mIEVGSSBjYWxscyB3aXRoIHJlZ2FyZHMKKyAqCSAgdG8gaW50ZXJycnVwdHMgYW5kIFNNUC4KKyAqCisgKiBUT0RPIChEZWNlbWJlciAxOTk5KToKKyAqIAktIHByb3ZpZGUgdGhlIEFQSSB0byBzZXQvZ2V0IHRoZSBXYWtlVXAgQWxhcm0gKGRpZmZlcmVudCBmcm9tIHRoZQorICoJICBydGMuYyBhbGFybSkuCisgKgktIFNNUCB0ZXN0aW5nCisgKiAJLSBBZGQgbW9kdWxlIHN1cHBvcnQKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBFRklfUlRDX1ZFUlNJT04JCSIwLjQiCisKKyNkZWZpbmUgRUZJX0lTRFNUIChFRklfVElNRV9BREpVU1RfREFZTElHSFR8RUZJX1RJTUVfSU5fREFZTElHSFQpCisvKgorICogRUZJIEVwb2NoIGlzIDEvMS8xOTk4CisgKi8KKyNkZWZpbmUgRUZJX1JUQ19FUE9DSAkJMTk5OAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVmaV9ydGNfbG9jayk7CisKK3N0YXRpYyBpbnQgZWZpX3J0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyNkZWZpbmUgaXNfbGVhcCh5ZWFyKSBcCisgICAgICAgICAgKCh5ZWFyKSAlIDQgPT0gMCAmJiAoKHllYXIpICUgMTAwICE9IDAgfHwgKHllYXIpICUgNDAwID09IDApKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50IF9fbW9uX3lkYXlbMl1bMTNdID0KK3sKKwkvKiBOb3JtYWwgeWVhcnMuICAqLworCXsgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NSB9LAorCS8qIExlYXAgeWVhcnMuICAqLyAgCisJeyAwLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNSwgMzY2IH0KK307CisKKy8qCisgKiByZXR1cm5zIGRheSBvZiB0aGUgeWVhciBbMC0zNjVdCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb21wdXRlX3lkYXkoZWZpX3RpbWVfdCAqZWZ0KQoreworCS8qIGVmaV90aW1lX3QubW9udGggaXMgaW4gdGhlIFsxLTEyXSBzbywgd2UgbmVlZCAtMSAqLworCXJldHVybiAgX19tb25feWRheVtpc19sZWFwKGVmdC0+eWVhcildW2VmdC0+bW9udGgtMV0rIGVmdC0+ZGF5IC0xOworfQorLyoKKyAqIHJldHVybnMgZGF5IG9mIHRoZSB3ZWVrIFswLTZdIDA9U3VuZGF5CisgKgorICogRG9uJ3QgdHJ5IHRvIHByb3ZpZGUgYSB5ZWFyIHRoYXQncyBiZWZvcmUgMTk5OCwgcGxlYXNlICEKKyAqLworc3RhdGljIGludAorY29tcHV0ZV93ZGF5KGVmaV90aW1lX3QgKmVmdCkKK3sKKwlpbnQgeTsKKwlpbnQgbmRheXMgPSAwOworCisJaWYgKCBlZnQtPnllYXIgPCAxOTk4ICkgeworCQlwcmludGsoS0VSTl9FUlIgImVmaXJ0YzogRUZJIHllYXIgPCAxOTk4LCBpbnZhbGlkIGRhdGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yKHk9RUZJX1JUQ19FUE9DSDsgeSA8IGVmdC0+eWVhcjsgeSsrICkgeworCQluZGF5cyArPSAzNjUgKyAoaXNfbGVhcCh5KSA/IDEgOiAwKTsKKwl9CisJbmRheXMgKz0gY29tcHV0ZV95ZGF5KGVmdCk7CisKKwkvKgorCSAqIDQ9MS8xLzE5OTggd2FzIGEgVGh1cnNkYXkKKwkgKi8KKwlyZXR1cm4gKG5kYXlzICsgNCkgJSA3OworfQorCitzdGF0aWMgdm9pZAorY29udmVydF90b19lZmlfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnd0aW1lLCBlZmlfdGltZV90ICplZnQpCit7CisKKwllZnQtPnllYXIJPSB3dGltZS0+dG1feWVhciArIDE5MDA7CisJZWZ0LT5tb250aAk9IHd0aW1lLT50bV9tb24gKyAxOyAKKwllZnQtPmRheQk9IHd0aW1lLT50bV9tZGF5OworCWVmdC0+aG91cgk9IHd0aW1lLT50bV9ob3VyOworCWVmdC0+bWludXRlCT0gd3RpbWUtPnRtX21pbjsKKwllZnQtPnNlY29uZCAJPSB3dGltZS0+dG1fc2VjOworCWVmdC0+bmFub3NlY29uZCA9IDA7IAorCWVmdC0+ZGF5bGlnaHQJPSB3dGltZS0+dG1faXNkc3QgPyBFRklfSVNEU1Q6IDA7CisJZWZ0LT50aW1lem9uZQk9IEVGSV9VTlNQRUNJRklFRF9USU1FWk9ORTsKK30KKworc3RhdGljIHZvaWQKK2NvbnZlcnRfZnJvbV9lZmlfdGltZShlZmlfdGltZV90ICplZnQsIHN0cnVjdCBydGNfdGltZSAqd3RpbWUpCit7CisJbWVtc2V0KHd0aW1lLCAwLCBzaXplb2YoKnd0aW1lKSk7CisJd3RpbWUtPnRtX3NlYyAgPSBlZnQtPnNlY29uZDsKKwl3dGltZS0+dG1fbWluICA9IGVmdC0+bWludXRlOworCXd0aW1lLT50bV9ob3VyID0gZWZ0LT5ob3VyOworCXd0aW1lLT50bV9tZGF5ID0gZWZ0LT5kYXk7CisJd3RpbWUtPnRtX21vbiAgPSBlZnQtPm1vbnRoIC0gMTsKKwl3dGltZS0+dG1feWVhciA9IGVmdC0+eWVhciAtIDE5MDA7CisKKwkvKiBkYXkgb2YgdGhlIHdlZWsgWzAtNl0sIFN1bmRheT0wICovCisJd3RpbWUtPnRtX3dkYXkgPSBjb21wdXRlX3dkYXkoZWZ0KTsKKworCS8qIGRheSBpbiB0aGUgeWVhciBbMS0zNjVdKi8KKwl3dGltZS0+dG1feWRheSA9IGNvbXB1dGVfeWRheShlZnQpOworCisKKwlzd2l0Y2ggKGVmdC0+ZGF5bGlnaHQgJiBFRklfSVNEU1QpIHsKKwkJY2FzZSBFRklfSVNEU1Q6CisJCQl3dGltZS0+dG1faXNkc3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX1RJTUVfQURKVVNUX0RBWUxJR0hUOgorCQkJd3RpbWUtPnRtX2lzZHN0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJd3RpbWUtPnRtX2lzZHN0ID0gLTE7CisJfQorfQorCitzdGF0aWMgaW50CitlZmlfcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCisJZWZpX3N0YXR1c190CXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWVmaV90aW1lX3QJZWZ0OworCWVmaV90aW1lX2NhcF90CWNhcDsKKwlzdHJ1Y3QgcnRjX3RpbWUJd3RpbWU7CisJc3RydWN0IHJ0Y193a2Fscm0gX191c2VyICpld3A7CisJdW5zaWduZWQgY2hhcgllbmFibGVkLCBwZW5kaW5nOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBSVENfVUlFX09OOgorCQljYXNlIFJUQ19VSUVfT0ZGOgorCQljYXNlIFJUQ19QSUVfT046CisJCWNhc2UgUlRDX1BJRV9PRkY6CisJCWNhc2UgUlRDX0FJRV9PTjoKKwkJY2FzZSBSVENfQUlFX09GRjoKKwkJY2FzZSBSVENfQUxNX1NFVDoKKwkJY2FzZSBSVENfQUxNX1JFQUQ6CisJCWNhc2UgUlRDX0lSUVBfUkVBRDoKKwkJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWNhc2UgUlRDX0VQT0NIX1JFQUQ6CisJCWNhc2UgUlRDX0VQT0NIX1NFVDoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgUlRDX1JEX1RJTUU6CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZmlfcnRjX2xvY2ssIGZsYWdzKTsKKworCQkJc3RhdHVzID0gZWZpLmdldF90aW1lKCZlZnQsICZjYXApOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZmlfcnRjX2xvY2ssZmxhZ3MpOworCisJCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiZWZpdGltZTogY2FuJ3QgcmVhZCB0aW1lXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJY29udmVydF9mcm9tX2VmaV90aW1lKCZlZnQsICZ3dGltZSk7CisKKyAJCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnd0aW1lLAorCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgcnRjX3RpbWUpKSA/IC0gRUZBVUxUIDogMDsKKworCQljYXNlIFJUQ19TRVRfVElNRToKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpIHJldHVybiAtRUFDQ0VTOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnd0aW1lLCAoc3RydWN0IHJ0Y190aW1lIF9fdXNlciAqKWFyZywKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJY29udmVydF90b19lZmlfdGltZSgmd3RpbWUsICZlZnQpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CisKKwkJCXN0YXR1cyA9IGVmaS5zZXRfdGltZSgmZWZ0KTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKKworCQkJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworCisJCWNhc2UgUlRDX1dLQUxNX1NFVDoKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpIHJldHVybiAtRUFDQ0VTOworCisJCQlld3AgPSAoc3RydWN0IHJ0Y193a2Fscm0gX191c2VyICopYXJnOworCisJCQlpZiAoICBnZXRfdXNlcihlbmFibGVkLCAmZXdwLT5lbmFibGVkKQorCQkJICAgfHwgY29weV9mcm9tX3VzZXIoJnd0aW1lLCAmZXdwLT50aW1lLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQljb252ZXJ0X3RvX2VmaV90aW1lKCZ3dGltZSwgJmVmdCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZmlfcnRjX2xvY2ssIGZsYWdzKTsKKwkJCS8qCisJCQkgKiBYWFggRml4bWU6CisJCQkgKiBBcyBvZiBFRkkgMC45MiB3aXRoIHRoZSBmaXJtd2FyZSBJIGhhdmUgb24gbXkKKwkJCSAqIG1hY2hpbmUgdGhpcyBjYWxsIGRvZXMgbm90IHNlZW0gdG8gd29yayBxdWl0ZQorCQkJICogcmlnaHQKKwkJCSAqLworCQkJc3RhdHVzID0gZWZpLnNldF93YWtldXBfdGltZSgoZWZpX2Jvb2xfdCllbmFibGVkLCAmZWZ0KTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKKworCQkJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworCisJCWNhc2UgUlRDX1dLQUxNX1JEOgorCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CisKKwkJCXN0YXR1cyA9IGVmaS5nZXRfd2FrZXVwX3RpbWUoKGVmaV9ib29sX3QgKikmZW5hYmxlZCwgKGVmaV9ib29sX3QgKikmcGVuZGluZywgJmVmdCk7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmaV9ydGNfbG9jayxmbGFncyk7CisKKwkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisJCQlld3AgPSAoc3RydWN0IHJ0Y193a2Fscm0gX191c2VyICopYXJnOworCisJCQlpZiAoICBwdXRfdXNlcihlbmFibGVkLCAmZXdwLT5lbmFibGVkKQorCQkJICAgfHwgcHV0X3VzZXIocGVuZGluZywgJmV3cC0+cGVuZGluZykpIHJldHVybiAtRUZBVUxUOworCisJCQljb252ZXJ0X2Zyb21fZWZpX3RpbWUoJmVmdCwgJnd0aW1lKTsKKworCQkJcmV0dXJuIGNvcHlfdG9fdXNlcigmZXdwLT50aW1lLCAmd3RpbWUsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkgPyAtRUZBVUxUIDogMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludAorZWZpX3J0Y19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUKKwkgKiBXZSBkbyBhY2NlcHQgbXVsdGlwbGUgb3BlbiBmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHdlCisJICogc3luY2hyb25pemUgb24gdGhlIHBlciBjYWxsIG9wZXJhdGlvbi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWZpX3J0Y19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVmaV9ydGNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IGVmaV9ydGNfaW9jdGwsCisJLm9wZW4JCT0gZWZpX3J0Y19vcGVuLAorCS5yZWxlYXNlCT0gZWZpX3J0Y19jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBlZmlfcnRjX2Rldj0KK3sKKwlFRklfUlRDX01JTk9SLAorCSJlZmlydGMiLAorCSZlZmlfcnRjX2ZvcHMKK307CisKKy8qCisgKglXZSBleHBvcnQgUkFXIEVGSSBpbmZvcm1hdGlvbiB0byAvcHJvYy9kcml2ZXIvZWZpcnRjCisgKi8KK3N0YXRpYyBpbnQKK2VmaV9ydGNfZ2V0X3N0YXR1cyhjaGFyICpidWYpCit7CisJZWZpX3RpbWVfdCAJZWZ0LCBhbG07CisJZWZpX3RpbWVfY2FwX3QJY2FwOworCWNoYXIJCSpwID0gYnVmOworCWVmaV9ib29sX3QJZW5hYmxlZCwgcGVuZGluZzsJCisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCW1lbXNldCgmZWZ0LCAwLCBzaXplb2YoZWZ0KSk7CisJbWVtc2V0KCZhbG0sIDAsIHNpemVvZihhbG0pKTsKKwltZW1zZXQoJmNhcCwgMCwgc2l6ZW9mKGNhcCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVmaV9ydGNfbG9jaywgZmxhZ3MpOworCisJZWZpLmdldF90aW1lKCZlZnQsICZjYXApOworCWVmaS5nZXRfd2FrZXVwX3RpbWUoJmVuYWJsZWQsICZwZW5kaW5nLCAmYWxtKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmaV9ydGNfbG9jayxmbGFncyk7CisKKwlwICs9IHNwcmludGYocCwKKwkJICAgICAiVGltZSAgICAgICAgICAgOiAldToldToldS4lMDl1XG4iCisJCSAgICAgIkRhdGUgICAgICAgICAgIDogJXUtJXUtJXVcbiIKKwkJICAgICAiRGF5bGlnaHQgICAgICAgOiAldVxuIiwKKwkJICAgICBlZnQuaG91ciwgZWZ0Lm1pbnV0ZSwgZWZ0LnNlY29uZCwgZWZ0Lm5hbm9zZWNvbmQsIAorCQkgICAgIGVmdC55ZWFyLCBlZnQubW9udGgsIGVmdC5kYXksCisJCSAgICAgZWZ0LmRheWxpZ2h0KTsKKworCWlmIChlZnQudGltZXpvbmUgPT0gRUZJX1VOU1BFQ0lGSUVEX1RJTUVaT05FKQorCQlwICs9IHNwcmludGYocCwgIlRpbWV6b25lICAgICAgIDogdW5zcGVjaWZpZWRcbiIpOworCWVsc2UKKwkJLyogWFhYIGZpeG1lOiBjb252ZXJ0IHRvIHN0cmluZz8gKi8KKwkJcCArPSBzcHJpbnRmKHAsICJUaW1lem9uZSAgICAgICA6ICV1XG4iLCBlZnQudGltZXpvbmUpOworCQkKKworCXAgKz0gc3ByaW50ZihwLAorCQkgICAgICJBbGFybSBUaW1lICAgICA6ICV1OiV1OiV1LiUwOXVcbiIKKwkJICAgICAiQWxhcm0gRGF0ZSAgICAgOiAldS0ldS0ldVxuIgorCQkgICAgICJBbGFybSBEYXlsaWdodCA6ICV1XG4iCisJCSAgICAgIkVuYWJsZWQgICAgICAgIDogJXNcbiIKKwkJICAgICAiUGVuZGluZyAgICAgICAgOiAlc1xuIiwKKwkJICAgICBhbG0uaG91ciwgYWxtLm1pbnV0ZSwgYWxtLnNlY29uZCwgYWxtLm5hbm9zZWNvbmQsIAorCQkgICAgIGFsbS55ZWFyLCBhbG0ubW9udGgsIGFsbS5kYXksIAorCQkgICAgIGFsbS5kYXlsaWdodCwKKwkJICAgICBlbmFibGVkID09IDEgPyAieWVzIiA6ICJubyIsCisJCSAgICAgcGVuZGluZyA9PSAxID8gInllcyIgOiAibm8iKTsKKworCWlmIChlZnQudGltZXpvbmUgPT0gRUZJX1VOU1BFQ0lGSUVEX1RJTUVaT05FKQorCQlwICs9IHNwcmludGYocCwgIlRpbWV6b25lICAgICAgIDogdW5zcGVjaWZpZWRcbiIpOworCWVsc2UKKwkJLyogWFhYIGZpeG1lOiBjb252ZXJ0IHRvIHN0cmluZz8gKi8KKwkJcCArPSBzcHJpbnRmKHAsICJUaW1lem9uZSAgICAgICA6ICV1XG4iLCBhbG0udGltZXpvbmUpOworCisJLyoKKwkgKiBub3cgcHJpbnRzIHRoZSBjYXBhYmlsaXRpZXMKKwkgKi8KKwlwICs9IHNwcmludGYocCwKKwkJICAgICAiUmVzb2x1dGlvbiAgICAgOiAldVxuIgorCQkgICAgICJBY2N1cmFjeSAgICAgICA6ICV1XG4iCisJCSAgICAgIlNldHN0b1plcm8gICAgIDogJXVcbiIsCisJCSAgICAgIGNhcC5yZXNvbHV0aW9uLCBjYXAuYWNjdXJhY3ksIGNhcC5zZXRzX3RvX3plcm8pOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50CitlZmlfcnRjX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIGludCBsZW4gPSBlZmlfcnRjX2dldF9zdGF0dXMocGFnZSk7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7CisgICAgICAgIGlmIChsZW48MCkgbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBfX2luaXQgCitlZmlfcnRjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRUZJIFRpbWUgU2VydmljZXMgRHJpdmVyIHYlc1xuIiwgRUZJX1JUQ19WRVJTSU9OKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmVmaV9ydGNfZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWZpcnRjOiBjYW4ndCBtaXNjX3JlZ2lzdGVyIG9uIG1pbm9yPSVkXG4iLAorCQkJCUVGSV9SVENfTUlOT1IpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRpciA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKCJkcml2ZXIvZWZpcnRjIiwgMCwgTlVMTCwKKwkJCSAgICAgICAgICAgICAgZWZpX3J0Y19yZWFkX3Byb2MsIE5VTEwpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImVmaXJ0YzogY2FuJ3QgY3JlYXRlIC9wcm9jL2RyaXZlci9lZmlydGMuXG4iKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZlZmlfcnRjX2Rldik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZWZpX3J0Y19leGl0KHZvaWQpCit7CisJLyogbm90IHlldCB1c2VkICovCit9CisKK21vZHVsZV9pbml0KGVmaV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChlZmlfcnRjX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5jIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI1ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtMCwwICsxLDM3ODkgQEAKKy8qCisKKyAKKwlDb3B5cmlnaHQgKEMpIDE5OTYgIERpZ2kgSW50ZXJuYXRpb25hbC4KKyAKKwlGb3IgdGVjaG5pY2FsIHN1cHBvcnQgcGxlYXNlIGVtYWlsIGRpZ2lMaW51eEBkZ2lpLmNvbSBvcgorCWNhbGwgRGlnaSB0ZWNoIHN1cHBvcnQgYXQgKDYxMikgOTEyLTM0NTYKKworCU11Y2ggb2YgdGhpcyBkZXNpZ24gYW5kIGNvZGUgY2FtZSBmcm9tIGVwY2EuYyB3aGljaCB3YXMgCisJY29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IFRyb3kgRGUgSm9uZ2gsIGFuZCBzdWJzcXVlbnRseSAKKwltb2RpZmllZCBieSBEYXZpZCBOdWdlbnQsIENocmlzdG9waCBMYW1ldGVyLCBNaWtlIE1jTGFnYW4uIAorIAorIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIAlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIAl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIAkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIAlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIAlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU2VlIFJFQURNRS5lcGNhIGZvciBjaGFuZ2UgaGlzdG9yeSAtLURBVCovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBFTkFCTEVfUENJCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisjZGVmaW5lIHB1dFVzZXIoYXJnMSwgYXJnMikgcHV0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnMikKKyNkZWZpbmUgZ2V0VXNlcihhcmcxLCBhcmcyKSBnZXRfdXNlcihhcmcxLCAodW5zaWduZWQgX191c2VyICopYXJnMikKKworI2lmZGVmIEVOQUJMRV9QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJkaWdpUENJLmgiCisjZW5kaWYgLyogRU5BQkxFX1BDSSAqLworCisjaW5jbHVkZSAiZGlnaTEuaCIKKyNpbmNsdWRlICJkaWdpRmVwMS5oIgorI2luY2x1ZGUgImVwY2EuaCIKKyNpbmNsdWRlICJlcGNhY29uZmlnLmgiCisKKyNpZiBCSVRTX1BFUl9MT05HICE9IDMyCisjICBlcnJvciBGSVhNRTogdGhpcyBkcml2ZXIgb25seSB3b3JrcyBvbiAzMi1iaXQgcGxhdGZvcm1zCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAgICAiMS4zLjAuMS1MSyIKKworLyogVGhpcyBtYWpvciBuZWVkcyB0byBiZSBzdWJtaXR0ZWQgdG8gTGludXggdG8gam9pbiB0aGUgbWFqb3JzIGxpc3QgKi8KKworI2RlZmluZSBESUdJSU5GT01BSk9SICAgICAgIDM1ICAvKiBGb3IgRGlnaSBzcGVjaWZpYyBpb2N0bCAqLyAKKworCisjZGVmaW5lIE1BWENBUkRTIDcKKyNkZWZpbmUgZXBjYWFzc2VydCh4LCBtc2cpICBpZiAoISh4KSkgZXBjYV9lcnJvcihfX0xJTkVfXywgbXNnKQorCisjZGVmaW5lIFBGWCAiZXBjYTogIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBnbG9iYWwgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciBtZXNnWzEwMF07CitzdGF0aWMgaW50IG5iZGV2cywgbnVtX2NhcmRzLCBsaWxvY29uZmlnOworc3RhdGljIGludCBkaWdpX3BvbGxlcl9pbmhpYml0ZWQgPSAxIDsKKworc3RhdGljIGludCBzZXR1cF9lcnJvcl9jb2RlOworc3RhdGljIGludCBpbnZhbGlkX2xpbG9fY29uZmlnOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU1BWEJPQVJEUyBpcyB0eXBpY2FsbHkgMTIsIGJ1dCBJU0EgYW5kIEVJU0EgY2FyZHMgYXJlIHJlc3RyaWN0ZWQgdG8gCisJNyBiZWxvdy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgYm9hcmRfaW5mbyBib2FyZHNbTUFYQk9BUkRTXTsKKworCisvKiAtLS0tLS0tLS0tLS0tIEJlZ2luIHN0cnVjdHVyZXMgdXNlZCBmb3IgZHJpdmVyIHJlZ2lzdGVyYXRpb24gLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnBjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcGNfaW5mbzsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIERpZ2kgc3BlY2lmaWMgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlkaWdpX2NoYW5uZWxzIHJlcHJlc2VudHMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcyB0aGF0IGtlZXAgdHJhY2sgb2YKKwllYWNoIGNoYW5uZWwgb2YgdGhlIERpZ2kgcHJvZHVjdC4gIEluZm9ybWF0aW9uIHN1Y2ggYXMgdHJhbnNtaXQgYW5kCisJcmVjZWl2ZSBwb2ludGVycywgdGVybWlvIGRhdGEsIGFuZCBzaWduYWwgZGVmaW5pdGlvbnMgKERUUiwgQ1RTLCBldGMgLi4uKQorCWFyZSBzdG9yZWQgaGVyZS4gIFRoaXMgc3RydWN0dXJlIGlzIE5PVCB1c2VkIHRvIG92ZXJsYXkgdGhlIGNhcmRzIAorCXBoeXNpY2FsIGNoYW5uZWwgc3RydWN0dXJlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgCitzdGF0aWMgc3RydWN0IGNoYW5uZWwgZGlnaV9jaGFubmVsc1tNQVhfQUxMT0NdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXJkX3B0ciBpcyBhbiBhcnJheSB1c2VkIHRvIGhvbGQgdGhlIGFkZHJlc3Mgb2YgdGhlCisJZmlyc3QgY2hhbm5lbCBzdHJ1Y3R1cmUgb2YgZWFjaCBjYXJkLiAgVGhpcyBhcnJheSB3aWxsIGhvbGQKKwl0aGUgYWRkcmVzc2VzIG9mIHZhcmlvdXMgY2hhbm5lbHMgbG9jYXRlZCBpbiBkaWdpX2NoYW5uZWxzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqY2FyZF9wdHJbTUFYQ0FSRFNdOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZXBjYV90aW1lcjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQmVnaW4gZ2VuZXJpYyBtZW1vcnkgZnVuY3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgYWxpYXMKKwkocG9pbnQgYXQpIG1vcmUgc3BlY2lmaWMgZnVuY3Rpb25zIGRlcGVuZGVudCBvbiB0aGUgYm9hcmQgYmVpbmcKKwljb25maWd1cmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0tLS0gQmVnaW4gbW9yZSAnc3BlY2lmaWMnIG1lbW9yeSBmdW5jdGlvbnMgZm9yIGN4X2xpa2UgcHJvZHVjdHMgLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0tLS0tLSBCZWdpbiBtb3JlICdzcGVjaWZpYycgbWVtb3J5IGZ1bmN0aW9ucyBmb3IgdGhlIHBjeGUgLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworCisvKiAtLS0tIEJlZ2luIG1vcmUgJ3NwZWNpZmljJyBtZW1vcnkgZnVuY3Rpb25zIGZvciB0aGUgcGM2NHhlIGFuZCBwY3hpIC0tLS0gKi8KKy8qIE5vdGUgOiBwYzY0eGUgYW5kIHBjeGkgc2hhcmUgdGhlIHNhbWUgd2luZG93aW5nIHJvdXRpbmVzICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0gQmVnaW4gJ3NwZWNpZmljJyBkbyBub3RoaW5nIG1lbW9yeSBmdW5jdGlvbnMgbmVlZGVkIGZvciBzb21lIGNhcmRzIC0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkZWNsYXJlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaGFubmVsICp2ZXJpZnlDaGFubmVsKHJlZ2lzdGVyIHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGlubGluZSB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICosIGludCk7CitzdGF0aWMgdm9pZCBlcGNhX2Vycm9yKGludCwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGNoYW5uZWwgKik7CitzdGF0aWMgdm9pZCBwY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBwY19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgcGNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgcGNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgcGNfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgcGNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNoYW5uZWwgKik7CitzdGF0aWMgaW50IHBjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBwb3N0X2ZlcF9pbml0KHVuc2lnbmVkIGludCBjcmQpOworc3RhdGljIHZvaWQgZXBjYXBvbGwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBkb2V2ZW50KGludCk7CitzdGF0aWMgdm9pZCBmZXBjbWQoc3RydWN0IGNoYW5uZWwgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9oKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQpOworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9pKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQpOworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9jKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZXBjYXBhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBjaGFubmVsICopOworc3RhdGljIHZvaWQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBjaGFubmVsICopOworc3RhdGljIGludCBwY19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCBpbmZvX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBwY19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHBjX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBwY19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIHBjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKK3N0YXRpYyB2b2lkIHBjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkaWdpX3NlbmRfYnJlYWsoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgbXNlYyk7CitzdGF0aWMgdm9pZCBzZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpOwordm9pZCBlcGNhX3NldHVwKGNoYXIgKiwgaW50ICopOwordm9pZCBjb25zb2xlX3ByaW50KGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvIF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgcGNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworaW50IHBjX2luaXQodm9pZCk7CisKKyNpZmRlZiBFTkFCTEVfUENJCitzdGF0aWMgaW50IGluaXRfUENJKHZvaWQpOworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUYWJsZSBvZiBmdW5jdGlvbnMgZm9yIGVhY2ggYm9hcmQgdG8gaGFuZGxlIG1lbW9yeS4gIE1hbnRhaW5pbmcgCisJcGFyYWxsZWxpc20gaXMgYSAqdmVyeSogZ29vZCBpZGVhIGhlcmUuICBUaGUgaWRlYSBpcyBmb3IgdGhlIAorCXJ1bnRpbWUgY29kZSB0byBibGluZGx5IGNhbGwgdGhlc2UgZnVuY3Rpb25zLCBub3Qga25vd2luZy9jYXJpbmcgICAgCisJYWJvdXQgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUuICBUaGlzIHN0dWZmIHNob3VsZCBjb250YWluIG5vCisJY29uZGl0aW9uYWxzOyBpZiBtb3JlIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkIGEgZGlmZmVyZW50IGVudHJ5CisJc2hvdWxkIGJlIGVzdGFibGlzaGVkLiAgVGhlc2UgY2FsbHMgYXJlIHRoZSBpbnRlcmZhY2UgY2FsbHMgYW5kIAorCWFyZSB0aGUgb25seSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgYWNjZXNzZWQuICBBbnlvbmUgY2F1Z2h0CisJbWFraW5nIGRpcmVjdCBjYWxscyBkZXNlcnZlcyB3aGF0IHRoZXkgZ2V0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworCShiLT5tZW13aW5vbikoYiwgd2luKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwkoYi0+bWVtd2lub2ZmKShiLCB3aW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPmdsb2JhbHdpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkoY2gtPmJvYXJkLT5yeHdpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkoY2gtPmJvYXJkLT50eHdpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPm1lbW9mZikoY2gpOworfQorc3RhdGljIGlubGluZSB2b2lkIGFzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJKGNoLT5ib2FyZC0+YXNzZXJ0Z3dpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPmFzc2VydG1lbW9mZikoY2gpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQQ1hFTSB3aW5kb3dpbmcgaXMgdGhlIHNhbWUgYXMgdGhhdCB1c2VkIGluIHRoZSBQQ1hSIAorCWFuZCBDWCBzZXJpZXMgY2FyZHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworICAgICAgICBvdXRiX3AoRkVQV0lOfHdpbiwgKGludCliLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisJb3V0Yl9wKDAsIChpbnQpYi0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcCggRkVQV0lOLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKGNoLT5yeHdpbiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcChjaC0+dHh3aW4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY3hlIG1lbW9yeSB3aW5kb3cgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworICAgICAgICAgICAgICAgb3V0Yl9wKEZFUFdJTiB8IHdpbiwgKGludCliLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwlvdXRiX3AoaW5iKChpbnQpYi0+cG9ydCkgJiB+RkVQTUVNLAorCSAgICAgICAgICAgKGludCliLT5wb3J0ICsgMSk7CisJb3V0Yl9wKDAsIChpbnQpYi0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKCBGRVBXSU4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCQlvdXRiX3AoY2gtPnJ4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkJb3V0Yl9wKGNoLT50eHdpbiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tIEJlZ2luIHBjNjR4ZSBhbmQgcGN4aSBtZW1vcnkgd2luZG93IHN0dWZmIC0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworICAgICAgICAgICAgICAgb3V0Yl9wKGluYigoaW50KWItPnBvcnQpIHwgRkVQTUVNLCAoaW50KWItPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisJb3V0Yl9wKGluYigoaW50KWItPnBvcnQpICYgfkZFUE1FTSwgKGludCliLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCWVwY2Fhc3NlcnQoaW5iKChpbnQpY2gtPmJvYXJkLT5wb3J0KSAmIEZFUE1FTSwgIkdsb2JhbCBtZW1vcnkgb2ZmIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJZXBjYWFzc2VydCghKGluYigoaW50KWNoLT5ib2FyZC0+cG9ydCkgJiBGRVBNRU0pLCAiTWVtb3J5IG9uIik7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5vdCBhbGwgb2YgdGhlIGNhcmRzIG5lZWQgc3BlY2lmaWMgbWVtb3J5IHdpbmRvd2luZyByb3V0aW5lcy4gIFNvbWUKKwljYXJkcyAoU3VjaCBhcyBQQ0kpIG5lZWRzIG5vIHdpbmRvd2luZyByb3V0aW5lcyBhdCBhbGwuICBXZSBwcm92aWRlCisJdGhlc2UgZG8gbm90aGluZyByb3V0aW5lcyBzbyB0aGF0IHRoZSBzYW1lIGNvZGUgYmFzZSBjYW4gYmUgdXNlZC4KKwlUaGUgZHJpdmVyIHdpbGwgQUxXQVlTIGNhbGwgYSB3aW5kb3dpbmcgcm91dGluZSBpZiBpdCB0aGlua3MgaXQgbmVlZHMKKwl0bzsgcmVnYXJkbGVzcyBvZiB0aGUgY2FyZC4gIEhvd2V2ZXIsIGRlcGVuZGVudCBvbiB0aGUgY2FyZCB0aGUgcm91dGluZQorCW1heSBvciBtYXkgbm90IGRvIGFueXRoaW5nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdmVyaWZ5Q2hhbm5lbCBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2hhbm5lbCAqdmVyaWZ5Q2hhbm5lbChyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiB2ZXJpZnlDaGFubmVsICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIHJvdXRpbmUgYmFzaWNhbGx5IHByb3ZpZGVzIGEgc2FuaXR5IGNoZWNrLiAgSXQgaW5zdXJlcyB0aGF0CisJCXRoZSBjaGFubmVsIHJldHVybmVkIGlzIHdpdGhpbiB0aGUgcHJvcGVyIHJhbmdlIG9mIGFkZHJlc3NlcyBhcworCQl3ZWxsIGFzIHByb3Blcmx5IGluaXRpYWxpemVkLiAgSWYgc29tZSBib2d1cyBpbmZvIGdldHMgcGFzc2VkIGluCisJCXRocm91Z2ggdHR5LT5kcml2ZXJfZGF0YSB0aGlzIHNob3VsZCBjYXRjaCBpdC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICh0dHkpIAorCXsgLyogQmVnaW4gaWYgdHR5ICovCisKKwkJcmVnaXN0ZXIgc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopdHR5LT5kcml2ZXJfZGF0YTsKKworCQlpZiAoKGNoID49ICZkaWdpX2NoYW5uZWxzWzBdKSAmJiAoY2ggPCAmZGlnaV9jaGFubmVsc1tuYmRldnNdKSkgCisJCXsKKwkJCWlmIChjaC0+bWFnaWMgPT0gRVBDQV9NQUdJQykKKwkJCQlyZXR1cm4gY2g7CisJCX0KKworCX0gLyogRW5kIGlmIHR0eSAqLworCisJLyogRWxzZSByZXR1cm4gYSBOVUxMIGZvciBpbnZhbGlkICovCisJcmV0dXJuIE5VTEw7CisKK30gLyogRW5kIHZlcmlmeUNoYW5uZWwgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3NjaGVkX2V2ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICpjaCwgaW50IGV2ZW50KQoreyAvKiBCZWdpbiBwY19zY2hlZF9ldmVudCAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVdlIGNhbGwgdGhpcyB0byBzY2hlZHVsZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBvbiBzb21lIGV2ZW50LiAgVGhlIAorCQlrZXJuZWwgc2VlcyBvdXIgcmVxdWVzdCBhbmQgY2FsbHMgdGhlIHJlbGF0ZWQgcm91dGluZSBpbiBPVVIgZHJpdmVyLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJY2gtPmV2ZW50IHw9IDEgPDwgZXZlbnQ7CisJc2NoZWR1bGVfd29yaygmY2gtPnRxdWV1ZSk7CisKKworfSAvKiBFbmQgcGNfc2NoZWRfZXZlbnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2FfZXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBlcGNhX2Vycm9yKGludCBsaW5lLCBjaGFyICptc2cpCit7IC8qIEJlZ2luIGVwY2FfZXJyb3IgKi8KKworCXByaW50ayhLRVJOX0VSUiAiZXBjYV9lcnJvciAoRGlnaSk6IGxpbmUgPSAlZCAlc1xuIixsaW5lLG1zZyk7CisJcmV0dXJuOworCit9IC8qIEVuZCBlcGNhX2Vycm9yICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19jbG9zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBwY19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreyAvKiBCZWdpbiBwY19jbG9zZSAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIAorCQl7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbm5lbCBpcyBvcGVuIG1vcmUgdGhhbiBvbmNlICovCisJCWlmIChjaC0+Y291bnQtLSA+IDEpIAorCQl7IC8qIEJlZ2luIGNoYW5uZWwgaXMgb3BlbiBtb3JlIHRoYW4gb25jZSAqLworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJUmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuICBTb21lb25lIG1pZ2h0IHN0aWxsIGJlIHVzaW5nCisJCQkJdGhlIGNoYW5uZWwuCisJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJcmV0dXJuOworCQl9IC8qIEVuZCBjaGFubmVsIGlzIG9wZW4gbW9yZSB0aGFuIG9uY2UgKi8KKworCQkvKiBQb3J0IG9wZW4gb25seSBvbmNlIGdvIGFoZWFkIHdpdGggc2h1dGRvd24gJiByZXNldCAqLworCisJCWlmIChjaC0+Y291bnQgPCAwKSAKKwkJeworCQkJY2gtPmNvdW50ID0gMDsKKwkJfQorCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJTGV0IHRoZSByZXN0IG9mIHRoZSBkcml2ZXIga25vdyB0aGUgY2hhbm5lbCBpcyBiZWluZyBjbG9zZWQuCisJCQlUaGlzIGJlY29tZXMgaW1wb3J0YW50IGlmIGFuIG9wZW4gaXMgYXR0ZW1wdGVkIGJlZm9yZSBjbG9zZSAKKwkJCWlzIGZpbmlzaGVkLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCQorCQl0dHktPmNsb3NpbmcgPSAxOworCisJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSAKKwkJeworCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSwgY2gpOwkJCisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMzAwMCk7IC8qIDMwIHNlY29uZHMgdGltZW91dCAqLworCQl9CisJCisJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCisJCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQlzaHV0ZG93bihjaCk7CisJCXR0eS0+Y2xvc2luZyA9IDA7CisJCWNoLT5ldmVudCA9IDA7CisJCWNoLT50dHkgPSBOVUxMOworCisJCWlmIChjaC0+YmxvY2tlZF9vcGVuKSAKKwkJeyAvKiBCZWdpbiBpZiBibG9ja2VkX29wZW4gKi8KKworCQkJaWYgKGNoLT5jbG9zZV9kZWxheSkgCisJCQl7CisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaC0+Y2xvc2VfZGVsYXkpKTsKKwkJCX0KKworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKworCQl9IC8qIEVuZCBpZiBibG9ja2VkX29wZW4gKi8KKworCQljaC0+YXN5bmNmbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkUgfCBBU1lOQ19JTklUSUFMSVpFRCB8IAorCQkgICAgICAgICAgICAgICAgICAgICAgQVNZTkNfQ0xPU0lORyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNsb3NlX3dhaXQpOworCisKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl9IC8qIEVuZCBpZiBjaCAhPSBOVUxMICovCisKK30gLyogRW5kIHBjX2Nsb3NlICovIAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gc2h1dGRvd24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGNoYW5uZWwgKmNoKQoreyAvKiBCZWdpbiBzaHV0ZG93biAqLworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSAKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCisJYmMgPSBjaC0+YnJkY2hhbjsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJbiBvcmRlciBmb3IgYW4gZXZlbnQgdG8gYmUgZ2VuZXJhdGVkIG9uIHRoZSByZWNlaXB0IG9mIGRhdGEgdGhlCisJCWlkYXRhIGZsYWcgbXVzdCBiZSBzZXQuIFNpbmNlIHdlIGFyZSBzaHV0dGluZyBkb3duLCB0aGlzIGlzIG5vdCAKKwkJbmVjZXNzYXJ5IGNsZWFyIHRoaXMgZmxhZy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKwlpZiAoYmMpCisJCWJjLT5pZGF0YSA9IDA7CisKKwl0dHkgPSBjaC0+dHR5OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIElmIHdlJ3JlIGEgbW9kZW0gY29udHJvbCBkZXZpY2UgYW5kIEhVUENMIGlzIG9uLCBkcm9wIFJUUyAmIERUUi4KKyAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIAorCXsKKwkJY2gtPm9tb2RlbSAmPSB+KGNoLT5tX3J0cyB8IGNoLT5tX2R0cik7CisJCWZlcGNtZChjaCwgU0VUTU9ERU0sIDAsIGNoLT5tX2R0ciB8IGNoLT5tX3J0cywgMTAsIDEpOworCX0KKworCW1lbW9mZihjaCk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhlIGNoYW5uZWwgaGFzIG9mZmljaWFseSBiZWVuIGNsb3NlZC4gIFRoZSBuZXh0IHRpbWUgaXQgaXMgb3BlbmVkCisJCWl0IHdpbGwgaGF2ZSB0byByZWluaXRpYWxpemVkLiAgU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGlzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIFByZXZlbnQgZnV0dXJlIERpZ2kgcHJvZ3JhbW1lZCBpbnRlcnJ1cHRzIGZyb20gY29taW5nIGFjdGl2ZSAqLworCisJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCit9IC8qIEVuZCBzaHV0ZG93biAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfaGFuZ3VwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19oYW5ndXAgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwkKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KKworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQlzaHV0ZG93bihjaCk7CisKKwkJY2gtPnR0eSAgID0gTlVMTDsKKwkJY2gtPmV2ZW50ID0gMDsKKwkJY2gtPmNvdW50ID0gMDsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCWNoLT5hc3luY2ZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0lOSVRJQUxJWkVEKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKworCX0gLyogRW5kIGlmIGNoICE9IE5VTEwgKi8KKworfSAvKiBFbmQgcGNfaGFuZ3VwICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY193cml0ZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBieXRlc0F2YWlsYWJsZSkKK3sgLyogQmVnaW4gcGNfd3JpdGUgKi8KKworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCXJlZ2lzdGVyIGludCBkYXRhTGVuOworCXJlZ2lzdGVyIGludCBzaXplOworCXJlZ2lzdGVyIGludCBhbW91bnRDb3BpZWQ7CisKKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZW1haW47CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXBjX3dyaXRlIGlzIHByaW1hcmlseSBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIGtlcm5lbCByb3V0aW5lCisJCXR0eV93cml0ZSAoVGhvdWdoIGl0IGNhbiBhbHNvIGJlIGNhbGxlZCBieSBwdXRfY2hhcikgZm91bmQgaW4KKwkJdHR5X2lvLmMuICBwY193cml0ZSBpcyBwYXNzZWQgYSBsaW5lIGRpc2NpcGxpbmUgYnVmZmVyIHdoZXJlIAorCQl0aGUgZGF0YSB0byBiZSB3cml0dGVuIG91dCBpcyBzdG9yZWQuICBUaGUgbGluZSBkaXNjaXBsaW5lIAorCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYgaXMgZG9uZSBhdCB0aGUga2VybmVsIGxldmVsIGFuZCBpcyBub3QgCisJCWJyb3VnaHQgaW50byB0aGUgZHJpdmVyLiAgCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBNYWtlIGEgcG9pbnRlciB0byB0aGUgY2hhbm5lbCBkYXRhIHN0cnVjdHVyZSBmb3VuZCBvbiB0aGUgYm9hcmQuICovCisKKwliYyAgID0gY2gtPmJyZGNoYW47CisJc2l6ZSA9IGNoLT50eGJ1ZnNpemU7CisKKwlhbW91bnRDb3BpZWQgPSAwOworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZ2xvYmFsd2lub24oY2gpOworCisJaGVhZCA9IGJjLT50aW4gJiAoc2l6ZSAtIDEpOworCXRhaWwgPSBiYy0+dG91dDsKKworCWlmICh0YWlsICE9IGJjLT50b3V0KQorCQl0YWlsID0gYmMtPnRvdXQ7CisJdGFpbCAmPSAoc2l6ZSAtIDEpOworCisJLyoJSWYgaGVhZCA+PSB0YWlsLCBoZWFkIGhhcyBub3Qgd3JhcHBlZCBhcm91bmQuICovIAorCWlmIChoZWFkID49IHRhaWwpIAorCXsgLyogQmVnaW4gaGVhZCBoYXMgbm90IHdyYXBwZWQgKi8KKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCXJlbWFpbiAobXVjaCBsaWtlIGRhdGFMZW4gYWJvdmUpIHJlcHJlc2VudHMgdGhlIHRvdGFsIGFtb3VudCBvZgorCQkJc3BhY2UgYXZhaWxhYmxlIG9uIHRoZSBjYXJkIGZvciBkYXRhLiAgSGVyZSBkYXRhTGVuIHJlcHJlc2VudHMKKwkJCXRoZSBzcGFjZSBleGlzdGluZyBiZXR3ZWVuIHRoZSBoZWFkIHBvaW50ZXIgYW5kIHRoZSBlbmQgb2YgCisJCQlidWZmZXIuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGEgbWVtY3B5IGNhbm5vdCBiZSB0b2xkIHRvCisJCQlhdXRvbWF0aWNhbGx5IHdyYXAgYXJvdW5kIHdoZW4gaXQgaGl0cyB0aGUgYnVmZmVyIGVuZC4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAorCisJCWRhdGFMZW4gPSBzaXplIC0gaGVhZDsKKwkJcmVtYWluID0gc2l6ZSAtIChoZWFkIC0gdGFpbCkgLSAxOworCisJfSAvKiBFbmQgaGVhZCBoYXMgbm90IHdyYXBwZWQgKi8KKwllbHNlIAorCXsgLyogQmVnaW4gaGVhZCBoYXMgd3JhcHBlZCBhcm91bmQgKi8KKworCQlyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDE7CisJCWRhdGFMZW4gPSByZW1haW47CisKKwl9IC8qIEVuZCBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJQ2hlY2sgdGhlIHNwYWNlIG9uIHRoZSBjYXJkLiAgSWYgd2UgaGF2ZSBtb3JlIGRhdGEgdGhhbiAKKwkJCXNwYWNlOyByZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhIHRvIGZpdCB0aGUgc3BhY2UuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJYnl0ZXNBdmFpbGFibGUgPSBtaW4ocmVtYWluLCBieXRlc0F2YWlsYWJsZSk7CisKKwl0eHdpbm9uKGNoKTsKKwl3aGlsZSAoYnl0ZXNBdmFpbGFibGUgPiAwKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGRhdGEgdG8gY29weSBvbnRvIGNhcmQgKi8KKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSWYgaGVhZCBpcyBub3Qgd3JhcHBlZCwgdGhlIGJlbG93IHdpbGwgbWFrZSBzdXJlIHRoZSBmaXJzdCAKKwkJCWRhdGEgY29weSBmaWxscyB0byB0aGUgZW5kIG9mIGNhcmQgYnVmZmVyLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZGF0YUxlbiA9IG1pbihieXRlc0F2YWlsYWJsZSwgZGF0YUxlbik7CisJCW1lbWNweShjaC0+dHhwdHIgKyBoZWFkLCBidWYsIGRhdGFMZW4pOworCQlidWYgKz0gZGF0YUxlbjsKKwkJaGVhZCArPSBkYXRhTGVuOworCQlhbW91bnRDb3BpZWQgKz0gZGF0YUxlbjsKKwkJYnl0ZXNBdmFpbGFibGUgLT0gZGF0YUxlbjsKKworCQlpZiAoaGVhZCA+PSBzaXplKSAKKwkJeworCQkJaGVhZCA9IDA7CisJCQlkYXRhTGVuID0gdGFpbDsKKwkJfQorCisJfSAvKiBFbmQgd2hpbGUgdGhlcmUgaXMgZGF0YSB0byBjb3B5IG9udG8gY2FyZCAqLworCisJY2gtPnN0YXR1c2ZsYWdzIHw9IFRYQlVTWTsKKwlnbG9iYWx3aW5vbihjaCk7CisJYmMtPnRpbiA9IGhlYWQ7CisKKwlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpID09IDApIAorCXsKKwkJY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7CisJCWJjLT5pbG93ID0gMTsKKwl9CisJbWVtb2ZmKGNoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybihhbW91bnRDb3BpZWQpOworCit9IC8qIEVuZCBwY193cml0ZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfcHV0X2NoYXIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKQoreyAvKiBCZWdpbiBwY19wdXRfY2hhciAqLworCisgICAKKwlwY193cml0ZSh0dHksICZjLCAxKTsKKwlyZXR1cm47CisKK30gLyogRW5kIHBjX3B1dF9jaGFyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY193cml0ZV9yb29tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY193cml0ZV9yb29tICovCisKKwlpbnQgcmVtYWluOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCXJlbWFpbiA9IDA7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJZ2xvYmFsd2lub24oY2gpOworCisJCWJjICAgPSBjaC0+YnJkY2hhbjsKKwkJaGVhZCA9IGJjLT50aW4gJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCQl0YWlsID0gYmMtPnRvdXQ7CisKKwkJaWYgKHRhaWwgIT0gYmMtPnRvdXQpCisJCQl0YWlsID0gYmMtPnRvdXQ7CisJCS8qIFdyYXAgdGFpbCBpZiBuZWNlc3NhcnkgKi8KKwkJdGFpbCAmPSAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCisJCWlmICgocmVtYWluID0gdGFpbCAtIGhlYWQgLSAxKSA8IDAgKQorCQkJcmVtYWluICs9IGNoLT50eGJ1ZnNpemU7CisKKwkJaWYgKHJlbWFpbiAmJiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgPT0gMCkgCisJCXsKKwkJCWNoLT5zdGF0dXNmbGFncyB8PSBMT1dXQUlUOworCQkJYmMtPmlsb3cgPSAxOworCQl9CisJCW1lbW9mZihjaCk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKworCS8qIFJldHVybiBob3cgbXVjaCByb29tIGlzIGxlZnQgb24gY2FyZCAqLworCXJldHVybiByZW1haW47CisKK30gLyogRW5kIHBjX3dyaXRlX3Jvb20gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2NoYXJzX2luX2J1ZmZlciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19jaGFyc19pbl9idWZmZXIgKi8KKworCWludCBjaGFyczsKKwl1bnNpZ25lZCBpbnQgY3RhaWwsIGhlYWQsIHRhaWw7CisJaW50IHJlbWFpbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpID09IE5VTEwpCisJCXJldHVybigwKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWdsb2JhbHdpbm9uKGNoKTsKKworCWJjID0gY2gtPmJyZGNoYW47CisJdGFpbCA9IGJjLT50b3V0OworCWhlYWQgPSBiYy0+dGluOworCWN0YWlsID0gY2gtPm1haWxib3gtPmNvdXQ7CisKKwlpZiAodGFpbCA9PSBoZWFkICYmIGNoLT5tYWlsYm94LT5jaW4gPT0gY3RhaWwgJiYgYmMtPnRidXN5ID09IDApCisJCWNoYXJzID0gMDsKKwllbHNlIAorCXsgLyogQmVnaW4gaWYgc29tZSBzcGFjZSBvbiB0aGUgY2FyZCBoYXMgYmVlbiB1c2VkICovCisKKwkJaGVhZCA9IGJjLT50aW4gJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCQl0YWlsICY9IChjaC0+dHhidWZzaXplIC0gMSk7CisKKwkJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGUgbG9naWMgaGVyZSBpcyBiYXNpY2FsbHkgb3Bwb3NpdGUgb2YgdGhlIGFib3ZlIHBjX3dyaXRlX3Jvb20KKwkJCWhlcmUgd2UgYXJlIGZpbmRpbmcgdGhlIGFtb3VudCBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIGZpbGxlZC4KKwkJCU5vdCB0aGUgYW1vdW50IG9mIGJ5dGVzIGVtcHR5LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKChyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDEpIDwgMCApCisJCQlyZW1haW4gKz0gY2gtPnR4YnVmc2l6ZTsKKworCQljaGFycyA9IChpbnQpKGNoLT50eGJ1ZnNpemUgLSByZW1haW4pOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorCQkJTWFrZSBpdCBwb3NzaWJsZSB0byB3YWtldXAgYW55dGhpbmcgd2FpdGluZyBmb3Igb3V0cHV0CisJCQlpbiB0dHlfaW9jdGwuYywgZXRjLgorCisJCQlJZiBub3QgYWxyZWFkeSBzZXQuICBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZQorCQkJdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CisKKwl9IC8qIEVuZCBpZiBzb21lIHNwYWNlIG9uIHRoZSBjYXJkIGhhcyBiZWVuIHVzZWQgKi8KKworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkvKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVzaWRpbmcgb24gY2FyZC4gKi8KKwlyZXR1cm4oY2hhcnMpOworCit9IC8qIEVuZCBwY19jaGFyc19pbl9idWZmZXIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2ZsdXNoX2J1ZmZlciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sgLyogQmVnaW4gcGNfZmx1c2hfYnVmZmVyICovCisKKwl1bnNpZ25lZCBpbnQgdGFpbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpID09IE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZ2xvYmFsd2lub24oY2gpOworCisJYmMgICA9IGNoLT5icmRjaGFuOworCXRhaWwgPSBiYy0+dG91dDsKKworCS8qIEhhdmUgRkVQIG1vdmUgdG91dCBwb2ludGVyOyBlZmZlY3RpdmVseSBmbHVzaGluZyB0cmFuc21pdCBidWZmZXIgKi8KKworCWZlcGNtZChjaCwgU1RPVVQsICh1bnNpZ25lZCkgdGFpbCwgMCwgMCwgMCk7CisKKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKKworfSAvKiBFbmQgcGNfZmx1c2hfYnVmZmVyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19mbHVzaF9jaGFycyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19mbHVzaF9jaGFycyAqLworCisJc3RydWN0IGNoYW5uZWwgKiBjaDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSWYgbm90IGFscmVhZHkgc2V0IGFuZCB0aGUgdHJhbnNtaXR0ZXIgaXMgYnVzeSBzZXR1cCBhbiBldmVudAorCQkJdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgZW1wdGllcy4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgVFhCVVNZKSAmJiAhKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkpCisJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOworCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKworfSAvKiBFbmQgcGNfZmx1c2hfY2hhcnMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGJsb2NrX3RpbF9yZWFkeSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7IC8qIEJlZ2luIGJsb2NrX3RpbF9yZWFkeSAqLworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKwlpbnQJcmV0dmFsLCBkb19jbG9jYWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCXsKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsJCisJCXJldHVybihyZXR2YWwpOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCQlJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJCXVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykgCisJeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjaC0+Y2xvc2Vfd2FpdCk7CisKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybiAtRUFHQUlOOworCQllbHNlCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgCisJeworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKwkgIAkgSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250CisJICAJIGFuZCB0aGVuIGV4aXQuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworCQlyZXR1cm4gMDsKKwl9CisKKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisJCisgICAvKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZSBmcmVlICovCisJCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmY2gtPm9wZW5fd2FpdCwgJndhaXQpOworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisKKwkvKiBXZSBkZWMgY291bnQgc28gdGhhdCBwY19jbG9zZSB3aWxsIGtub3cgd2hlbiB0byBmcmVlIHRoaW5ncyAqLworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJY2gtPmNvdW50LS07CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWNoLT5ibG9ja2VkX29wZW4rKzsKKworCXdoaWxlKDEpIAorCXsgLyogQmVnaW4gZm9yZXZlciB3aGlsZSAgKi8KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSAKKwkJeworCQkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsJCisJCQlicmVhazsKKwkJfQorCisJCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYgCisJCQkgIChkb19jbG9jYWwgfHwgKGNoLT5pbW9kZW0gJiBjaC0+ZGNkKSkpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAorCQl7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJQWxsb3cgc29tZW9uZSBlbHNlIHRvIGJlIHNjaGVkdWxlZC4gIFdlIHdpbGwgb2NjYXNpb25hbGx5IGdvCisJCQl0aHJvdWdoIHRoaXMgbG9vcCB1bnRpbCBvbmUgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgY2hhbmdlLgorCQkJVGhlIGJlbG93IHNjaGVkdWxlIGNhbGwgd2lsbCBhbGxvdyBvdGhlciBwcm9jZXNzZXMgdG8gZW50ZXIgYW5kCisJCQlwcmV2ZW50IHRoaXMgbG9vcCBmcm9tIGhvZ2dpbmcgdGhlIGNwdS4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJCXNjaGVkdWxlKCk7CisKKwl9IC8qIEVuZCBmb3JldmVyIHdoaWxlICAqLworCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwljbGkoKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWNoLT5jb3VudCsrOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJY2gtPmJsb2NrZWRfb3Blbi0tOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisKKwlyZXR1cm4gMDsKKworfSAvKiBFbmQgYmxvY2tfdGlsX3JlYWR5ICovCQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfb3BlbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreyAvKiBCZWdpbiBwY19vcGVuICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGluZSwgcmV0dmFsLCBib2FyZG51bTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGhlYWQ7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+PSBuYmRldnMpIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbiA6IGxpbmUgb3V0IG9mIHJhbmdlIGluIHBjX29wZW5cbiIpOworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKworCisJY2ggPSAmZGlnaV9jaGFubmVsc1tsaW5lXTsKKwlib2FyZG51bSA9IGNoLT5ib2FyZG51bTsKKworCS8qIENoZWNrIHN0YXR1cyBvZiBib2FyZCBjb25maWd1cmVkIGluIHN5c3RlbS4gICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXBjYV9zZXR1cCByb3V0aW5lIGRldGVjdGVkIGFuIHVzZXIgZXJyb3IuICAKKwkJSXQgbWlnaHQgYmUgYmV0dGVyIHRvIHB1dCB0aGlzIGluIHBjX2luaXQsIGJ1dCBmb3IgdGhlIG1vbWVudCBpdAorCQlnb2VzIGhlcmUuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKGludmFsaWRfbGlsb19jb25maWcpCisJeworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfQk9BUkRfVFlQRSkKKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgdHlwZSBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfTlVNX1BPUlRTKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBudW1iZXIgb2YgcG9ydHMgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7CisKKwkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX01FTV9CQVNFKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBtZW1vcnkgYWRkcmVzcyBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfUE9SVF9CQVNFKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBwb3J0IGFkZHJlc3Mgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7CisKKwkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX0JPQVJEX1NUQVRVUykKKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgc3RhdHVzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOworCisJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9BTFRQSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIGFsdHBpbiBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsgICAvKiBNYXJrIHRoaXMgZGV2aWNlIGFzICdkb3duJyAqLworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJaWYgKChib2FyZG51bSA+PSBudW1fY2FyZHMpIHx8IChib2FyZHNbYm9hcmRudW1dLnN0YXR1cyA9PSBESVNBQkxFRCkpIAorCXsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7ICAgLyogTWFyayB0aGlzIGRldmljZSBhcyAnZG93bicgKi8KKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKwkKKwlpZiAoKCBiYyA9IGNoLT5icmRjaGFuKSA9PSAwKSAKKwl7CisJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUV2ZXJ5IHRpbWUgYSBjaGFubmVsIGlzIG9wZW5lZCwgaW5jcmVtZW50IGEgY291bnRlci4gIFRoaXMgaXMgCisJCW5lY2Vzc2FyeSBiZWNhdXNlIHdlIGRvIG5vdCB3aXNoIHRvIGZsdXNoIGFuZCBzaHV0ZG93biB0aGUgY2hhbm5lbAorCQl1bnRpbCB0aGUgbGFzdCBhcHAgaG9sZGluZyB0aGUgY2hhbm5lbCBvcGVuLCBjbG9zZXMgaXQuCSAJCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwljaC0+Y291bnQrKzsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IGEga2VybmVsIHN0cnVjdHVyZXMgcG9pbnRlciB0byBvdXIgbG9jYWwgY2hhbm5lbCAKKwkJc3RydWN0dXJlLiAgVGhpcyB3YXkgd2UgY2FuIGdldCB0byBpdCB3aGVuIHBhc3NlZCBvbmx5CisJCWEgdHR5IHN0cnVjdC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBjaDsKKwkKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGNoYW5uZWwgaGFzIGJlZW4gb3BlbmVkLCBpbml0aWFsaXplCisJCXRoZSB0dHktPnRlcm1pb3Mgc3RydWN0IG90aGVyd2lzZSBsZXQgcGNfY2xvc2UgaGFuZGxlIGl0LgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCWdsb2JhbHdpbm9uKGNoKTsKKwljaC0+c3RhdHVzZmxhZ3MgPSAwOworCisJLyogU2F2ZSBib2FyZHMgY3VycmVudCBtb2RlbSBzdGF0dXMgKi8KKwljaC0+aW1vZGVtID0gYmMtPm1zdGF0OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIFNldCByZWNlaXZlIGhlYWQgYW5kIHRhaWwgcHRycyB0byBlYWNoIG90aGVyLiAgVGhpcyBpbmRpY2F0ZXMKKwkgICBubyBkYXRhIGF2YWlsYWJsZSB0byByZWFkLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaGVhZCA9IGJjLT5yaW47CisJYmMtPnJvdXQgPSBoZWFkOworCisJLyogU2V0IHRoZSBjaGFubmVscyBhc3NvY2lhdGVkIHR0eSBzdHJ1Y3R1cmUgKi8KKwljaC0+dHR5ID0gdHR5OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhlIGJlbG93IHJvdXRpbmUgZ2VuZXJhbGx5IHNldHMgdXAgcGFyaXR5LCBiYXVkLCBmbG93IGNvbnRyb2wgCisJCWlzc3VlcywgZXRjLi4uLiBJdCBlZmZlY3QgYm90aCBjb250cm9sIGZsYWdzIGFuZCBpbnB1dCBmbGFncy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWVwY2FwYXJhbSh0dHksY2gpOworCisJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJbWVtb2ZmKGNoKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgY2gpOworCWlmIChyZXR2YWwpCisJeworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IHRoaXMgYWdhaW4gaW4gY2FzZSBhIGhhbmd1cCBzZXQgaXQgdG8gemVybyB3aGlsZSB0aGlzIAorCQlvcGVuKCkgd2FzIHdhaXRpbmcgZm9yIHRoZSBsaW5lLi4uCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2gtPnR0eSA9IHR0eTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWdsb2JhbHdpbm9uKGNoKTsKKworCS8qIEVuYWJsZSBEaWdpIERhdGEgZXZlbnRzICovCisJYmMtPmlkYXRhID0gMTsKKworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4gMDsKKworfSAvKiBFbmQgcGNfb3BlbiAqLworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBlcGNhX21vZHVsZV9pbml0KHZvaWQpCit7IC8qIEJlZ2luIGluaXRfbW9kdWxlICovCisKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlwY19pbml0KCk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybigwKTsKK30KKworbW9kdWxlX2luaXQoZXBjYV9tb2R1bGVfaW5pdCk7CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlcGNhX2RyaXZlcjsKKyNlbmRpZgorCisjaWZkZWYgTU9EVUxFCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBjbGVhbnVwX21vZHVsZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXBjYV9tb2R1bGVfZXhpdCh2b2lkKQoreworCisJaW50ICAgICAgICAgICAgICAgY291bnQsIGNyZDsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CisJc3RydWN0IGNoYW5uZWwgICAgKmNoOworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCisJZGVsX3RpbWVyX3N5bmMoJmVwY2FfdGltZXIpOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlpZiAoKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihwY19kcml2ZXIpKSB8fCAgCisJICAgICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocGNfaW5mbykpKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiPEVycm9yPiAtIERJR0kgOiBjbGVhbnVwX21vZHVsZSBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlclxuIik7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXB1dF90dHlfZHJpdmVyKHBjX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIocGNfaW5mbyk7CisKKwlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAorCXsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLworCisJCWJkID0gJmJvYXJkc1tjcmRdOworCisJCWlmICghYmQpCisJCXsgLyogQmVnaW4gc2FuaXR5IGNoZWNrICovCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBEaWdpIDogY2xlYW51cF9tb2R1bGUgZmFpbGVkXG4iKTsKKwkJCXJldHVybjsKKwkJfSAvKiBFbmQgc2FuaXR5IGNoZWNrICovCisKKwkJY2ggPSBjYXJkX3B0cltjcmRdOyAKKworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBiZC0+bnVtcG9ydHM7IGNvdW50KyssIGNoKyspIAorCQl7IC8qIEJlZ2luIGZvciBlYWNoIHBvcnQgKi8KKworCQkJaWYgKGNoKSAKKwkJCXsKKwkJCQlpZiAoY2gtPnR0eSkKKwkJCQkJdHR5X2hhbmd1cChjaC0+dHR5KTsKKwkJCQlrZnJlZShjaC0+dG1wX2J1Zik7CisJCQl9CisKKwkJfSAvKiBFbmQgZm9yIGVhY2ggcG9ydCAqLworCX0gLyogRW5kIGZvciBlYWNoIGNhcmQgKi8KKworI2lmZGVmIEVOQUJMRV9QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZlcGNhX2RyaXZlcik7CisjZW5kaWYKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCit9Cittb2R1bGVfZXhpdChlcGNhX21vZHVsZV9leGl0KTsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBwY19vcHMgPSB7CisJLm9wZW4gPSBwY19vcGVuLAorCS5jbG9zZSA9IHBjX2Nsb3NlLAorCS53cml0ZSA9IHBjX3dyaXRlLAorCS53cml0ZV9yb29tID0gcGNfd3JpdGVfcm9vbSwKKwkuZmx1c2hfYnVmZmVyID0gcGNfZmx1c2hfYnVmZmVyLAorCS5jaGFyc19pbl9idWZmZXIgPSBwY19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2NoYXJzID0gcGNfZmx1c2hfY2hhcnMsCisJLnB1dF9jaGFyID0gcGNfcHV0X2NoYXIsCisJLmlvY3RsID0gcGNfaW9jdGwsCisJLnNldF90ZXJtaW9zID0gcGNfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBwY19zdG9wLAorCS5zdGFydCA9IHBjX3N0YXJ0LAorCS50aHJvdHRsZSA9IHBjX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcGNfdW50aHJvdHRsZSwKKwkuaGFuZ3VwID0gcGNfaGFuZ3VwLAorfTsKKworc3RhdGljIGludCBpbmZvX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGluZm9fb3BzID0geworCS5vcGVuID0gaW5mb19vcGVuLAorCS5pb2N0bCA9IGluZm9faW9jdGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfaW5pdCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgX19pbml0IHBjX2luaXQodm9pZCkKK3sgLyogQmVnaW4gcGNfaW5pdCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlwY19pbml0IGlzIGNhbGxlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkdXJpbmcgYm9vdCB1cCBwcmlvciB0bworCQlhbnkgb3BlbiBjYWxscyBiZWluZyBtYWRlLiAgSW4gdGhlIG9sZGVyIHZlcnNpb25zIG9mIExpbnV4IChQcmlvcgorCQl0byAyLjAuMCkgYW4gZW50cnkgaXMgbWFkZSBpbnRvIHR0eV9pby5jLiAgQSBwb2ludGVyIHRvIHRoZSBsYXN0CisJCW1lbW9yeSBsb2NhdGlvbiAoZnJvbSBrZXJuZWwgc3BhY2UpIHVzZWQgKGttZW1fc3RhcnQpIGlzIHBhc3NlZAorCQl0byBwY19pbml0LiAgSXQgaXMgcGNfaW5pdHMgcmVzcG9uc2liaWxpdHkgdG8gbW9kaWZ5IHRoaXMgdmFsdWUgCisJCWZvciBhbnkgbWVtb3J5IHRoYXQgdGhlIERpZ2kgZHJpdmVyIG1pZ2h0IG5lZWQgYW5kIHRoZW4gcmV0dXJuCisJCXRoaXMgdmFsdWUgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBGb3IgZXhhbXBsZSBpZiB0aGUgZHJpdmVyCisJCXdpc2hlcyB0byBhbGxvY2F0ZSAxSyBvZiBrZXJuZWwgbWVtb3J5LCBwY19pbml0IHdvdWxkIHJldHVybiAKKwkJKGttZW1fc3RhcnQgKyAxMDI0KS4gIFRoaXMgbWVtb3J5IChCZXR3ZWVuIGttZW1fc3RhcnQgYW5kIGttZW1fc3RhcnQKKwkJKyAxMDI0KSB3b3VsZCB0aGVuIGJlIGF2YWlsYWJsZSBmb3IgdXNlIGV4Y2x1c2l2ZWx5IGJ5IHRoZSBkcml2ZXIuICAKKwkJSW4gdGhpcyBjYXNlIG91ciBkcml2ZXIgZG9lcyBub3QgYWxsb2NhdGUgYW55IG9mIHRoaXMga2VybmVsIAorCQltZW1vcnkuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCXVsb25nIGZsYWdzOworCWludCBjcmQ7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXVuc2lnbmVkIGNoYXIgYm9hcmRfaWQgPSAwOworCisjaWZkZWYgRU5BQkxFX1BDSQorCWludCBwY2lfYm9hcmRzX2ZvdW5kLCBwY2lfY291bnQ7CisKKwlwY2lfY291bnQgPSAwOworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworCXBjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX0FMTE9DKTsKKwlpZiAoIXBjX2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY19pbmZvID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfQUxMT0MpOworCWlmICghcGNfaW5mbykgeworCQlwdXRfdHR5X2RyaXZlcihwY19kcml2ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJZiBlcGNhX3NldHVwIGhhcyBub3QgYmVlbiByYW4gYnkgTElMTyBzZXQgbnVtX2NhcmRzIHRvIGRlZmF1bHRzOyBjb3B5CisJCWJvYXJkIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IGRpZ2lDb25maWcgaW50byBkcml2ZXJzIGJvYXJkIHN0cnVjdHVyZS4KKwkJTm90ZSA6IElmIExJTE8gaGFzIHJhbiBlcGNhX3NldHVwIHRoZW4gZXBjYV9zZXR1cCB3aWxsIGhhbmRsZSBkZWZpbmluZworCQludW1fY2FyZHMgYXMgd2VsbCBhcyBjb3B5aW5nIHRoZSBkYXRhIGludG8gdGhlIGJvYXJkIHN0cnVjdHVyZS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWlmICghbGlsb2NvbmZpZykKKwl7IC8qIEJlZ2luIGRyaXZlciBoYXMgYmVlbiBjb25maWd1cmVkIHZpYS4gZXBjYWNvbmZpZyAqLworCisJCW5iZGV2cyA9IE5CREVWUzsKKwkJbnVtX2NhcmRzID0gTlVNQ0FSRFM7CisJCW1lbWNweSgodm9pZCAqKSZib2FyZHMsICh2b2lkICopJnN0YXRpY19ib2FyZHMsCisJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBib2FyZF9pbmZvKSAqIE5VTUNBUkRTKSk7CisJfSAvKiBFbmQgZHJpdmVyIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdmlhLiBlcGNhY29uZmlnICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlOb3RlIDogSWYgbGlsbyB3YXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGRyaXZlciBhbmQgdGhlIAorCQlpZ25vcmUgZXBjYWNvbmZpZyBvcHRpb24gd2FzIGNob29zZW4gKGRpZ2llcGNhPTIpIHRoZW4gCisJCW5iZGV2cyBhbmQgbnVtX2NhcmRzIHdpbGwgZXF1YWwgMCBhdCB0aGlzIHBvaW50LiAgVGhpcyBpcworCQlva2F5OyBQQ0kgY2FyZHMgd2lsbCBzdGlsbCBiZSBwaWNrZWQgdXAgaWYgZGV0ZWN0ZWQuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IHVwIGludGVycnVwdCwgd2Ugd2lsbCB3b3JyeSBhYm91dCBtZW1vcnkgYWxsb2NhdGlvbiBpbgorCQlwb3N0X2ZlcF9pbml0LiAKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisJcHJpbnRrKEtFUk5fSU5GTyAiRElHSSBlcGNhIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZC5cbiIsVkVSU0lPTik7CisKKyNpZmRlZiBFTkFCTEVfUENJCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJTk9URSA6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG51bWJlciBvZiBwb3J0cyBmb3VuZCBpbiAKKwkJICAgICAgIHRoZSBib2FyZHMgYXJyYXkgaXMgY29ycmVjdC4gIFRoaXMgY291bGQgYmUgd3JvbmcgaWYKKwkJICAgICAgIHRoZSBjYXJkIGluIHF1ZXN0aW9uIGlzIFBDSSAoQW5kIHRoZXJlZm9yZSBoYXMgbm8gcG9ydHMgCisJCSAgICAgICBlbnRyeSBpbiB0aGUgYm9hcmRzIHN0cnVjdHVyZS4pICBUaGUgcmVzdCBvZiB0aGUgCisJCSAgICAgICBpbmZvcm1hdGlvbiB3aWxsIGJlIHZhbGlkIGZvciBQQ0kgYmVjYXVzZSB0aGUgYmVnaW5uaW5nCisJCSAgICAgICBvZiBwY19pbml0IHNjYW5zIGZvciBQQ0kgYW5kIGRldGVybWluZXMgaS9vIGFuZCBiYXNlCisJCSAgICAgICBtZW1vcnkgYWRkcmVzc2VzLiAgSSBhbSBub3Qgc3VyZSBpZiBpdCBpcyBwb3NzaWJsZSB0byAKKwkJICAgICAgIHJlYWQgdGhlIG51bWJlciBvZiBwb3J0cyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQgcHJpb3IgdG8KKwkJICAgICAgIGl0IGJlaW5nIGJvb3RlZCAoU2luY2UgdGhhdCBpcyB0aGUgc3RhdGUgaXQgaXMgaW4gd2hlbiAKKwkJICAgICAgIHBjX2luaXQgaXMgcnVuKS4gIEJlY2F1c2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHF1ZXJ5IHRoZQorCQkgICAgICAgbnVtYmVyIG9mIHN1cHBvcnRlZCBwb3J0cyB1bnRpbCBhZnRlciB0aGUgY2FyZCBoYXMgYm9vdGVkOworCQkgICAgICAgd2UgYXJlIHJlcXVpcmVkIHRvIGNhbGN1bGF0ZSB0aGUgY2FyZF9wdHJzIGFzIHRoZSBjYXJkIGlzCSAKKwkJICAgICAgIGlzIGluaXRpYWxpemVkIChJbnNpZGUgcG9zdF9mZXBfaW5pdCkuICBUaGUgbmVnYXRpdmUgdGhpbmcKKwkJICAgICAgIGFib3V0IHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBkaWdpRGxvYWQncyBjYWxsIHRvIEdFVF9JTkZPCisJCSAgICAgICB3aWxsIGhhdmUgYSBiYWQgcG9ydCB2YWx1ZS4gIChTaW5jZSB0aGlzIGlzIGNhbGxlZCBwcmlvcgorCQkgICAgICAgdG8gcG9zdF9mZXBfaW5pdC4pCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgCisJcGNpX2JvYXJkc19mb3VuZCA9IDA7CisJaWYobnVtX2NhcmRzIDwgTUFYQk9BUkRTKQorCQlwY2lfYm9hcmRzX2ZvdW5kICs9IGluaXRfUENJKCk7CisJbnVtX2NhcmRzICs9IHBjaV9ib2FyZHNfZm91bmQ7CisKKyNlbmRpZiAvKiBFTkFCTEVfUENJICovCisKKwlwY19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcGNfZHJpdmVyLT5uYW1lID0gInR0eUQiOyAKKwlwY19kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0QiOworCXBjX2RyaXZlci0+bWFqb3IgPSBESUdJX01BSk9SOyAKKwlwY19kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwY19kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXBjX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2lmbGFnID0gMDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IENMT0NBTCB8IEhVUENMOworCXBjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXBjX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwY19kcml2ZXIsICZwY19vcHMpOworCisJcGNfaW5mby0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwY19pbmZvLT5uYW1lID0gImRpZ2lfY3RsIjsKKwlwY19pbmZvLT5tYWpvciA9IERJR0lJTkZPTUFKT1I7CisJcGNfaW5mby0+bWlub3Jfc3RhcnQgPSAwOworCXBjX2luZm8tPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXBjX2luZm8tPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9JTkZPOworCXBjX2luZm8tPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJcGNfaW5mby0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXBjX2luZm8tPmluaXRfdGVybWlvcy5jX2xmbGFnID0gMDsKKwlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTDsKKwlwY19pbmZvLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHBjX2luZm8sICZpbmZvX29wcyk7CisKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKKwl7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KKworCQkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGlzIGlzIHdoZXJlIHRoZSBhcHByb3ByaWF0ZSBtZW1vcnkgaGFuZGxlcnMgZm9yIHRoZSBoYXJkd2FyZSBpcworCQkJc2V0LiAgRXZlcnl0aGluZyBhdCBydW50aW1lIGJsaW5kbHkganVtcHMgdGhyb3VnaCB0aGVzZSB2ZWN0b3JzLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJLyogZGVmaW5lZCBpbiBlcGNhY29uZmlnLmggKi8KKwkJYmQgPSAmYm9hcmRzW2NyZF07CisKKwkJc3dpdGNoIChiZC0+dHlwZSkKKwkJeyAvKiBCZWdpbiBzd2l0Y2ggb24gYmQtPnR5cGUge2JvYXJkIHR5cGV9ICovCisJCQljYXNlIFBDWEVNOgorCQkJY2FzZSBFSVNBWEVNOgorCQkJCWJkLT5tZW13aW5vbiAgICAgPSBwY3hlbV9tZW13aW5vbiA7CisJCQkJYmQtPm1lbXdpbm9mZiAgICA9IHBjeGVtX21lbXdpbm9mZiA7CisJCQkJYmQtPmdsb2JhbHdpbm9uICA9IHBjeGVtX2dsb2JhbHdpbm9uIDsKKwkJCQliZC0+dHh3aW5vbiAgICAgID0gcGN4ZW1fdHh3aW5vbiA7CisJCQkJYmQtPnJ4d2lub24gICAgICA9IHBjeGVtX3J4d2lub24gOworCQkJCWJkLT5tZW1vZmYgICAgICAgPSBwY3hlbV9tZW1vZmYgOworCQkJCWJkLT5hc3NlcnRnd2lub24gPSBkdW1teV9hc3NlcnRnd2lub247CisJCQkJYmQtPmFzc2VydG1lbW9mZiA9IGR1bW15X2Fzc2VydG1lbW9mZjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ0lYRU06CisJCQljYXNlIFBDSVhSSjoKKwkJCWNhc2UgUENJWFI6CisJCQkJYmQtPm1lbXdpbm9uICAgICA9IGR1bW15X21lbXdpbm9uOworCQkJCWJkLT5tZW13aW5vZmYgICAgPSBkdW1teV9tZW13aW5vZmY7CisJCQkJYmQtPmdsb2JhbHdpbm9uICA9IGR1bW15X2dsb2JhbHdpbm9uOworCQkJCWJkLT50eHdpbm9uICAgICAgPSBkdW1teV90eHdpbm9uOworCQkJCWJkLT5yeHdpbm9uICAgICAgPSBkdW1teV9yeHdpbm9uOworCQkJCWJkLT5tZW1vZmYgICAgICAgPSBkdW1teV9tZW1vZmY7CisJCQkJYmQtPmFzc2VydGd3aW5vbiA9IGR1bW15X2Fzc2VydGd3aW5vbjsKKwkJCQliZC0+YXNzZXJ0bWVtb2ZmID0gZHVtbXlfYXNzZXJ0bWVtb2ZmOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDWEU6CisJCQljYXNlIFBDWEVWRToKKworCQkJCWJkLT5tZW13aW5vbiAgICAgPSBwY3hlX21lbXdpbm9uOworCQkJCWJkLT5tZW13aW5vZmYgICAgPSBwY3hlX21lbXdpbm9mZjsKKwkJCQliZC0+Z2xvYmFsd2lub24gID0gcGN4ZV9nbG9iYWx3aW5vbjsKKwkJCQliZC0+dHh3aW5vbiAgICAgID0gcGN4ZV90eHdpbm9uOworCQkJCWJkLT5yeHdpbm9uICAgICAgPSBwY3hlX3J4d2lub247CisJCQkJYmQtPm1lbW9mZiAgICAgICA9IHBjeGVfbWVtb2ZmOworCQkJCWJkLT5hc3NlcnRnd2lub24gPSBkdW1teV9hc3NlcnRnd2lub247CisJCQkJYmQtPmFzc2VydG1lbW9mZiA9IGR1bW15X2Fzc2VydG1lbW9mZjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hJOgorCQkJY2FzZSBQQzY0WEU6CisKKwkJCQliZC0+bWVtd2lub24gICAgID0gcGN4aV9tZW13aW5vbjsKKwkJCQliZC0+bWVtd2lub2ZmICAgID0gcGN4aV9tZW13aW5vZmY7CisJCQkJYmQtPmdsb2JhbHdpbm9uICA9IHBjeGlfZ2xvYmFsd2lub247CisJCQkJYmQtPnR4d2lub24gICAgICA9IHBjeGlfdHh3aW5vbjsKKwkJCQliZC0+cnh3aW5vbiAgICAgID0gcGN4aV9yeHdpbm9uOworCQkJCWJkLT5tZW1vZmYgICAgICAgPSBwY3hpX21lbW9mZjsKKwkJCQliZC0+YXNzZXJ0Z3dpbm9uID0gcGN4aV9hc3NlcnRnd2lub247CisJCQkJYmQtPmFzc2VydG1lbW9mZiA9IHBjeGlfYXNzZXJ0bWVtb2ZmOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCisJCX0gLyogRW5kIHN3aXRjaCBvbiBiZC0+dHlwZSAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJU29tZSBjYXJkcyBuZWVkIGEgbWVtb3J5IHNlZ21lbnQgdG8gYmUgZGVmaW5lZCBmb3IgdXNlIGluIAorCQkJdHJhbnNtaXQgYW5kIHJlY2VpdmUgd2luZG93aW5nIG9wZXJhdGlvbnMuICBUaGVzZSBib2FyZHMKKwkJCWFyZSBsaXN0ZWQgaW4gdGhlIGJlbG93IHN3aXRjaC4gIEluIHRoZSBjYXNlIG9mIHRoZSBYSSB0aGUKKwkJCWFtb3VudCBvZiBtZW1vcnkgb24gdGhlIGJvYXJkIGlzIHZhcmlhYmxlIHNvIHRoZSBtZW1vcnlfc2VnCisJCQlpcyBhbHNvIHZhcmlhYmxlLiAgVGhpcyBjb2RlIGRldGVybWluZXMgd2hhdCB0aGV5IHNlZ21lbnQgCisJCQlzaG91bGQgYmUuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJc3dpdGNoIChiZC0+dHlwZSkKKwkJeyAvKiBCZWdpbiBzd2l0Y2ggb24gYmQtPnR5cGUge2JvYXJkIHR5cGV9ICovCisKKwkJCWNhc2UgUENYRToKKwkJCWNhc2UgUENYRVZFOgorCQkJY2FzZSBQQzY0WEU6CisJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGYwMDA7CisJCQlicmVhazsKKworCQkJY2FzZSBQQ1hJOgorCQkJCWJvYXJkX2lkID0gaW5iKChpbnQpYmQtPnBvcnQpOworCQkJCWlmICgoYm9hcmRfaWQgJiAweDEpID09IDB4MSkgCisJCQkJeyAvKiBCZWdpbiBpdCdzIGFuIFhJIGNhcmQgKi8gCisKKwkJCQkJLyogSXMgaXQgYSA2NEsgYm9hcmQgKi8KKwkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDApIAorCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGYwMDA7CisKKwkJCQkJLyogSXMgaXQgYSAxMjhLIGJvYXJkICovCisJCQkJCWlmICgoYm9hcmRfaWQgJiAweDMwKSA9PSAweDEwKSAKKwkJCQkJCWJkLT5tZW1vcnlfc2VnID0gMHhlMDAwOworCisJCQkJCS8qIElzIGlzIGEgMjU2SyBib2FyZCAqLwkKKwkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDB4MjApIAorCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGMwMDA7CisKKwkJCQkJLyogSXMgaXQgYSA1MTJLIGJvYXJkICovCisJCQkJCWlmICgoYm9hcmRfaWQgJiAweDMwKSA9PSAweDMwKSAKKwkJCQkJCWJkLT5tZW1vcnlfc2VnID0gMHg4MDAwOworCisJCQkJfSAvKiBFbmQgaXQgaXMgYW4gWEkgY2FyZCAqLworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIEJvYXJkIGF0IDB4JXggZG9lc24ndCBhcHBlYXIgdG8gYmUgYW4gWElcbiIsKGludCliZC0+cG9ydCk7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJfSAvKiBFbmQgc3dpdGNoIG9uIGJkLT50eXBlICovCisKKwl9IC8qIEVuZCBmb3IgZWFjaCBjYXJkICovCisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwY19kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gZHJpdmVyIik7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwY19pbmZvKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIERpZ2kgUEMvIGluZm8gIik7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgU3RhcnQgdXAgdGhlIHBvbGxlciB0byBjaGVjayBmb3IgZXZlbnRzIG9uIGFsbCBlbmFibGVkIGJvYXJkcworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWluaXRfdGltZXIoJmVwY2FfdGltZXIpOworCWVwY2FfdGltZXIuZnVuY3Rpb24gPSBlcGNhcG9sbDsKKwltb2RfdGltZXIoJmVwY2FfdGltZXIsIGppZmZpZXMgKyBIWi8yNSk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybiAwOworCit9IC8qIEVuZCBwY19pbml0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwb3N0X2ZlcF9pbml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBvc3RfZmVwX2luaXQodW5zaWduZWQgaW50IGNyZCkKK3sgLyogQmVnaW4gcG9zdF9mZXBfaW5pdCAqLworCisJaW50IGk7CisJdW5jaGFyICptZW1hZGRyOworCXZvbGF0aWxlIHN0cnVjdCBnbG9iYWxfZGF0YSAqZ2Q7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7IAorCWludCBzaHJpbmttZW0gPSAwLCBsb3d3YXRlciA7IAorIAorCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgY2FsbCBpcyBtYWRlIGJ5IHRoZSB1c2VyIHZpYS4gdGhlIGlvY3RsIGNhbGwgRElHSV9JTklULgorCQlJdCBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB1cCBhbGwgdGhlIGNhcmQgc3BlY2lmaWMgc3R1ZmYuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWJkID0gJmJvYXJkc1tjcmRdOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJSWYgdGhpcyBpcyBhIFBDSSBib2FyZCwgZ2V0IHRoZSBwb3J0IGluZm8uICBSZW1lbWJlciBQQ0kgY2FyZHMKKwkJZG8gbm90IGhhdmUgZW50cmllcyBpbnRvIHRoZSBlcGNhY29uZmlnLmggZmlsZSwgc28gd2UgY2FuJ3QgZ2V0IAorCQl0aGUgbnVtYmVyIG9mIHBvcnRzIGZyb20gaXQuICBVbmZvcnR1bmV0bHksIHRoaXMgbWVhbnMgdGhhdCBhbnlvbmUKKwkJZG9pbmcgYSBESUdJX0dFVElORk8gYmVmb3JlIHRoZSBib2FyZCBoYXMgYm9vdGVkIHdpbGwgZ2V0IGFuIGludmFsaWQKKwkJbnVtYmVyIG9mIHBvcnRzIHJldHVybmVkIChJdCBzaG91bGQgcmV0dXJuIDApLiAgQ2FsbHMgdG8gRElHSV9HRVRJTkZPCisJCWFmdGVyIERJR0lfSU5JVCBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXR1cm4gdGhlIHByb3BlciB2YWx1ZXMuIAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmIChiZC0+dHlwZSA+PSBQQ0lYRU0pIC8qIElmIHRoZSBib2FyZCBpbiBxdWVzdGlvbiBpcyBQQ0kgKi8KKwl7IC8qIEJlZ2luIGdldCBQQ0kgbnVtYmVyIG9mIHBvcnRzICovCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUJlbG93IHdlIHVzZSBYRU1QT1JUUyBhcyBhIG1lbW9yeSBvZmZzZXQgcmVnYXJkbGVzcyBvZiB3aGljaCBQQ0kKKwkJCWNhcmQgaXQgaXMuICBUaGlzIGlzIGJlY2F1c2UgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgUENJIGNhcmRzIGhhdmUKKwkJCXRoZSBzYW1lIG1lbW9yeSBvZmZzZXQgZm9yIHRoZSBjaGFubmVsIGRhdGEuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQorCQkJY2hhbmdlZCBpZiB3ZSBldmVyIGRldmVsb3AgYSBQQ0kvWEUgY2FyZC4gIE5PVEUgOiBUaGUgRkVQIG1hbnVhbAorCQkJc3RhdGVzIHRoYXQgdGhlIHBvcnQgb2Zmc2V0IGlzIDB4QzIyIGFzIG9wcG9zZWQgdG8gMHhDMDIuICBUaGlzIGlzCisJCQlvbmx5IHRydWUgZm9yIFBDL1hFLCBhbmQgUEMvWEkgY2FyZHM7IG5vdCBmb3IgdGhlIFhFTSwgb3IgQ1ggc2VyaWVzLgorCQkJT24gdGhlIFBDSSBjYXJkcyB0aGUgbnVtYmVyIG9mIHBvcnRzIGlzIGRldGVybWluZWQgYnkgcmVhZGluZyBhIAorCQkJSUQgUFJPTSBsb2NhdGVkIGluIHRoZSBib3ggYXR0YWNoZWQgdG8gdGhlIGNhcmQuICBUaGUgY2FyZCBjYW4gdGhlbgorCQkJZGV0ZXJtaW5lIHRoZSBpbmRleCB0aGUgaWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcG9ydHMgYXZhaWxhYmxlLgorCQkJKEZZSSAtIFRoZSBpZCBzaG91bGQgYmUgbG9jYXRlZCBhdCAweDFhYyAoQW5kIG1heSB1c2UgdXAgdG8gNCBieXRlcworCQkJaWYgdGhlIGJveCBpbiBxdWVzdGlvbiBpcyBhIFhFTSBvciBDWCkpLiAgCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKKworCQliZC0+bnVtcG9ydHMgPSAodW5zaWduZWQgc2hvcnQpKih1bnNpZ25lZCBjaGFyICopYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJkLT5yZV9tYXBfbWVtYmFzZSArIFhFTVBPUlRTKSk7CisKKwkJCisJCWVwY2Fhc3NlcnQoYmQtPm51bXBvcnRzIDw9IDY0LCJQQ0kgcmV0dXJuZWQgYSBpbnZhbGlkIG51bWJlciBvZiBwb3J0cyIpOworCQluYmRldnMgKz0gKGJkLT5udW1wb3J0cyk7CisKKwl9IC8qIEVuZCBnZXQgUENJIG51bWJlciBvZiBwb3J0cyAqLworCisJaWYgKGNyZCAhPSAwKQorCQljYXJkX3B0cltjcmRdID0gY2FyZF9wdHJbY3JkLTFdICsgYm9hcmRzW2NyZC0xXS5udW1wb3J0czsKKwllbHNlCisJCWNhcmRfcHRyW2NyZF0gPSAmZGlnaV9jaGFubmVsc1tjcmRdOyAvKiA8LSBGb3IgY2FyZCAwIG9ubHkgKi8KKworCWNoID0gY2FyZF9wdHJbY3JkXTsKKworCisJZXBjYWFzc2VydChjaCA8PSAmZGlnaV9jaGFubmVsc1tuYmRldnMgLSAxXSwgImNoIG91dCBvZiByYW5nZSIpOworCisJbWVtYWRkciA9ICh1bmNoYXIgKiliZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKiAKKwkgICBUaGUgYmVsb3cgY29tbWFuZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBuZXdlciBrZXJuZWxzICgyLjEueCBhbmQKKwkgICB1cCkgZG8gbm90IGhhdmUgYSAxOjEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLiAgVGhlIGJlbG93CisJICAgY2FsbCBhZGp1c3QgZm9yIHRoYXQuCisJKi8KKworCW1lbWFkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW1lbWFkZHIpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhlIGJlbG93IGFzc2lnbm1lbnQgd2lsbCBzZXQgYmMgdG8gcG9pbnQgYXQgdGhlIEJFR0lOSU5HIG9mCisJCXRoZSBjYXJkcyBjaGFubmVsIHN0cnVjdHVyZXMuICBGb3IgMSBjYXJkIHRoZXJlIHdpbGwgYmUgYmV0d2VlbgorCQk4IGFuZCA2NCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwliYyA9ICh2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqKSgodWxvbmcpbWVtYWRkciArIENIQU5TVFJVQ1QpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgYmVsb3cgYXNzaWdubWVudCB3aWxsIHNldCBnZCB0byBwb2ludCBhdCB0aGUgQkVHSU5JTkcgb2YKKwkJZ2xvYmFsIG1lbW9yeSBhZGRyZXNzIDB4YzAwLiAgVGhlIGZpcnN0IGRhdGEgaW4gdGhhdCBnbG9iYWwKKwkJbWVtb3J5IGFjdHVhbGx5IHN0YXJ0cyBhdCBhZGRyZXNzIDB4YzFhLiAgVGhlIGNvbW1hbmQgaW4gCisJCXBvaW50ZXIgYmVnaW5zIGF0IDB4ZDEwLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWdkID0gKHZvbGF0aWxlIHN0cnVjdCBnbG9iYWxfZGF0YSAqKSgodWxvbmcpbWVtYWRkciArIEdMT0JBTCk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlYRVBPUlRTIChhZGRyZXNzIDB4YzIyKSBwb2ludHMgYXQgdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGUKKwkJY2FyZCBzdXBwb3J0cy4gKEZvciA2NFhFLCBYSSwgWEVNLCBhbmQgWFIgdXNlIDB4YzAyKQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKChiZC0+dHlwZSA9PSBQQ1hFVkUpIHwgKGJkLT50eXBlID09IFBDWEUpKSAmJgorCSAgICAoKih1c2hvcnQgKikoKHVsb25nKW1lbWFkZHIgKyBYRVBPUlRTKSA8IDMpKQorCQlzaHJpbmttZW0gPSAxOworCWlmIChiZC0+dHlwZSA8IFBDSVhFTSkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigoaW50KWJkLT5wb3J0LCA0LCBib2FyZF9kZXNjW2JkLT50eXBlXSkpCisJCQlyZXR1cm47CQkKKworCW1lbXdpbm9uKGJkLCAwKTsKKworCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlSZW1lbWJlciBjaCBpcyB0aGUgbWFpbiBkcml2ZXJzIGNoYW5uZWxzIHN0cnVjdHVyZSwgd2hpbGUgYmMgaXMgCisJICAgdGhlIGNhcmRzIGNoYW5uZWwgc3RydWN0dXJlLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogRm9yIGV2ZXJ5IHBvcnQgb24gdGhlIGNhcmQgZG8gLi4uLi4gKi8KKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bnVtcG9ydHM7IGkrKywgY2grKywgYmMrKykgCisJeyAvKiBCZWdpbiBmb3IgZWFjaCBwb3J0ICovCisKKwkJY2gtPmJyZGNoYW4gICAgICAgID0gYmM7CisJCWNoLT5tYWlsYm94ICAgICAgICA9IGdkOyAKKwkJSU5JVF9XT1JLKCZjaC0+dHF1ZXVlLCBkb19zb2Z0aW50LCBjaCk7CisJCWNoLT5ib2FyZCAgICAgICAgICA9ICZib2FyZHNbY3JkXTsKKworCQlzd2l0Y2ggKGJkLT50eXBlKQorCQl7IC8qIEJlZ2luIHN3aXRjaCBiZC0+dHlwZSAqLworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJU2luY2Ugc29tZSBvZiB0aGUgYm9hcmRzIHVzZSBkaWZmZXJlbnQgYml0bWFwcyBmb3IgdGhlaXIKKwkJCQljb250cm9sIHNpZ25hbHMgd2UgY2Fubm90IGhhcmQgY29kZSB0aGVzZSB2YWx1ZXMgYW5kIHJldGFpbgorCQkJCXBvcnRhYmlsaXR5LiAgV2UgdmlydHVhbGl6ZSB0aGlzIGRhdGEgaGVyZS4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkJCWNhc2UgRUlTQVhFTToKKwkJCWNhc2UgUENYRU06CisJCQljYXNlIFBDSVhFTToKKwkJCWNhc2UgUENJWFJKOgorCQkJY2FzZSBQQ0lYUjoKKwkJCQljaC0+bV9ydHMgPSAweDAyIDsKKwkJCQljaC0+bV9kY2QgPSAweDgwIDsgCisJCQkJY2gtPm1fZHNyID0gMHgyMCA7CisJCQkJY2gtPm1fY3RzID0gMHgxMCA7CisJCQkJY2gtPm1fcmkgID0gMHg0MCA7CisJCQkJY2gtPm1fZHRyID0gMHgwMSA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUENYRToKKwkJCWNhc2UgUENYRVZFOgorCQkJY2FzZSBQQ1hJOgorCQkJY2FzZSBQQzY0WEU6CisJCQkJY2gtPm1fcnRzID0gMHgwMiA7CisJCQkJY2gtPm1fZGNkID0gMHgwOCA7IAorCQkJCWNoLT5tX2RzciA9IDB4MTAgOworCQkJCWNoLT5tX2N0cyA9IDB4MjAgOworCQkJCWNoLT5tX3JpICA9IDB4NDAgOworCQkJCWNoLT5tX2R0ciA9IDB4ODAgOworCQkJCWJyZWFrOworCQorCQl9IC8qIEVuZCBzd2l0Y2ggYmQtPnR5cGUgKi8KKworCQlpZiAoYm9hcmRzW2NyZF0uYWx0cGluKSAKKwkJeworCQkJY2gtPmRzciA9IGNoLT5tX2RjZDsKKwkJCWNoLT5kY2QgPSBjaC0+bV9kc3I7CisJCQljaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzIHw9IERJR0lfQUxUUElOOworCQl9CisJCWVsc2UgCisJCXsgCisJCQljaC0+ZGNkID0gY2gtPm1fZGNkOworCQkJY2gtPmRzciA9IGNoLT5tX2RzcjsKKwkJfQorCQorCQljaC0+Ym9hcmRudW0gICA9IGNyZDsKKwkJY2gtPmNoYW5uZWxudW0gPSBpOworCQljaC0+bWFnaWMgICAgICA9IEVQQ0FfTUFHSUM7CisJCWNoLT50dHkgICAgICAgID0gTlVMTDsKKworCQlpZiAoc2hyaW5rbWVtKSAKKwkJeworCQkJZmVwY21kKGNoLCBTRVRCVUZGRVIsIDMyLCAwLCAwLCAwKTsKKwkJCXNocmlua21lbSA9IDA7CisJCX0KKworCQlzd2l0Y2ggKGJkLT50eXBlKQorCQl7IC8qIEJlZ2luIHN3aXRjaCBiZC0+dHlwZSAqLworCisJCQljYXNlIFBDSVhFTToKKwkJCWNhc2UgUENJWFJKOgorCQkJY2FzZSBQQ0lYUjoKKwkJCQkvKiBDb3ZlciBhbGwgdGhlIDJNRUcgY2FyZHMgKi8KKwkJCQljaC0+dHhwdHIgPSBtZW1hZGRyICsgKCgoYmMtPnRzZWcpIDw8IDQpICYgMHgxZmZmZmYpOworCQkJCWNoLT5yeHB0ciA9IG1lbWFkZHIgKyAoKChiYy0+cnNlZykgPDwgNCkgJiAweDFmZmZmZik7CisJCQkJY2gtPnR4d2luID0gRkVQV0lOIHwgKChiYy0+dHNlZykgPj4gMTEpOworCQkJCWNoLT5yeHdpbiA9IEZFUFdJTiB8ICgoYmMtPnJzZWcpID4+IDExKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hFTToKKwkJCWNhc2UgRUlTQVhFTToKKwkJCQkvKiBDb3ZlciBhbGwgdGhlIDMySyB3aW5kb3dlZCBjYXJkcyAqLworCQkJCS8qIE1hc2sgZXF1YWwgdG8gd2luZG93IHNpemUgLSAxICovCisJCQkJY2gtPnR4cHRyID0gbWVtYWRkciArICgoKGJjLT50c2VnKSA8PCA0KSAmIDB4N2ZmZik7CisJCQkJY2gtPnJ4cHRyID0gbWVtYWRkciArICgoKGJjLT5yc2VnKSA8PCA0KSAmIDB4N2ZmZik7CisJCQkJY2gtPnR4d2luID0gRkVQV0lOIHwgKChiYy0+dHNlZykgPj4gMTEpOworCQkJCWNoLT5yeHdpbiA9IEZFUFdJTiB8ICgoYmMtPnJzZWcpID4+IDExKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hFVkU6CisJCQljYXNlIFBDWEU6CisJCQkJY2gtPnR4cHRyID0gbWVtYWRkciArICgoKGJjLT50c2VnIC0gYmQtPm1lbW9yeV9zZWcpIDw8IDQpICYgMHgxZmZmKTsKKwkJCQljaC0+dHh3aW4gPSBGRVBXSU4gfCAoKGJjLT50c2VnIC0gYmQtPm1lbW9yeV9zZWcpID4+IDkpOworCQkJCWNoLT5yeHB0ciA9IG1lbWFkZHIgKyAoKChiYy0+cnNlZyAtIGJkLT5tZW1vcnlfc2VnKSA8PCA0KSAmIDB4MWZmZik7CisJCQkJY2gtPnJ4d2luID0gRkVQV0lOIHwgKChiYy0+cnNlZyAtIGJkLT5tZW1vcnlfc2VnKSA+PjkgKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hJOgorCQkJY2FzZSBQQzY0WEU6CisJCQkJY2gtPnR4cHRyID0gbWVtYWRkciArICgoYmMtPnRzZWcgLSBiZC0+bWVtb3J5X3NlZykgPDwgNCk7CisJCQkJY2gtPnJ4cHRyID0gbWVtYWRkciArICgoYmMtPnJzZWcgLSBiZC0+bWVtb3J5X3NlZykgPDwgNCk7CisJCQkJY2gtPnR4d2luID0gY2gtPnJ4d2luID0gMDsKKwkJCQlicmVhazsKKworCQl9IC8qIEVuZCBzd2l0Y2ggYmQtPnR5cGUgKi8KKworCQljaC0+dHhidWZoZWFkID0gMDsKKwkJY2gtPnR4YnVmc2l6ZSA9IGJjLT50bWF4ICsgMTsKKwkKKwkJY2gtPnJ4YnVmaGVhZCA9IDA7CisJCWNoLT5yeGJ1ZnNpemUgPSBiYy0+cm1heCArIDE7CisJCisJCWxvd3dhdGVyID0gY2gtPnR4YnVmc2l6ZSA+PSAyMDAwID8gMTAyNCA6IChjaC0+dHhidWZzaXplIC8gMik7CisKKwkJLyogU2V0IHRyYW5zbWl0dGVyIGxvdyB3YXRlciBtYXJrICovCisJCWZlcGNtZChjaCwgU1RYTFdBVEVSLCBsb3d3YXRlciwgMCwgMTAsIDApOworCisJCS8qIFNldCByZWNlaXZlciBsb3cgd2F0ZXIgbWFyayAqLworCisJCWZlcGNtZChjaCwgU1JYTFdBVEVSLCAoY2gtPnJ4YnVmc2l6ZSAvIDQpLCAwLCAxMCwgMCk7CisKKwkJLyogU2V0IHJlY2VpdmVyIGhpZ2ggd2F0ZXIgbWFyayAqLworCisJCWZlcGNtZChjaCwgU1JYSFdBVEVSLCAoMyAqIGNoLT5yeGJ1ZnNpemUgLyA0KSwgMCwgMTAsIDApOworCisJCWJjLT5lZGVsYXkgPSAxMDA7CisJCWJjLT5pZGF0YSA9IDE7CisJCisJCWNoLT5zdGFydGMgID0gYmMtPnN0YXJ0YzsKKwkJY2gtPnN0b3BjICAgPSBiYy0+c3RvcGM7CisJCWNoLT5zdGFydGNhID0gYmMtPnN0YXJ0Y2E7CisJCWNoLT5zdG9wY2EgID0gYmMtPnN0b3BjYTsKKwkKKwkJY2gtPmZlcGNmbGFnID0gMDsKKwkJY2gtPmZlcGlmbGFnID0gMDsKKwkJY2gtPmZlcG9mbGFnID0gMDsKKwkJY2gtPmZlcHN0YXJ0YyA9IDA7CisJCWNoLT5mZXBzdG9wYyA9IDA7CisJCWNoLT5mZXBzdGFydGNhID0gMDsKKwkJY2gtPmZlcHN0b3BjYSA9IDA7CisJCisJCWNoLT5jbG9zZV9kZWxheSA9IDUwOworCQljaC0+Y291bnQgPSAwOworCQljaC0+YmxvY2tlZF9vcGVuID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jbG9zZV93YWl0KTsKKwkJY2gtPnRtcF9idWYgPSBrbWFsbG9jKGNoLT50eGJ1ZnNpemUsR0ZQX0tFUk5FTCk7CisJCWlmICghKGNoLT50bXBfYnVmKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJQT1NUIEZFUCBJTklUIDoga21hbGxvYyBmYWlsZWQgZm9yIHBvcnQgMHgleFxuIixpKTsKKwkJCXJlbGVhc2VfcmVnaW9uKChpbnQpYmQtPnBvcnQsIDQpOworCQkJd2hpbGUoaS0tID4gMCkKKwkJCQlrZnJlZSgoY2gtLSktPnRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgCisJCQltZW1zZXQoKHZvaWQgKiljaC0+dG1wX2J1ZiwwLGNoLT50eGJ1ZnNpemUpOworCX0gLyogRW5kIGZvciBlYWNoIHBvcnQgKi8KKworCXByaW50ayhLRVJOX0lORk8gCisJICAgICAgICAiRGlnaSBQQy9YeCBEcml2ZXIgViVzOiAgJXMgSS9PID0gMHglbHggTWVtID0gMHglbHggUG9ydHMgPSAlZFxuIiwgCisJICAgICAgICBWRVJTSU9OLCBib2FyZF9kZXNjW2JkLT50eXBlXSwgKGxvbmcpYmQtPnBvcnQsIChsb25nKWJkLT5tZW1iYXNlLCBiZC0+bnVtcG9ydHMpOworCXNwcmludGYobWVzZywgCisJICAgICAgICAiRGlnaSBQQy9YeCBEcml2ZXIgViVzOiAgJXMgSS9PID0gMHglbHggTWVtID0gMHglbHggUG9ydHMgPSAlZFxuIiwgCisJICAgICAgICBWRVJTSU9OLCBib2FyZF9kZXNjW2JkLT50eXBlXSwgKGxvbmcpYmQtPnBvcnQsIChsb25nKWJkLT5tZW1iYXNlLCBiZC0+bnVtcG9ydHMpOworCWNvbnNvbGVfcHJpbnQobWVzZyk7CisKKwltZW13aW5vZmYoYmQsIDApOworCit9IC8qIEVuZCBwb3N0X2ZlcF9pbml0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhcG9sbCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwY2Fwb2xsKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKK3sgLyogQmVnaW4gZXBjYXBvbGwgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNyZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHVwb24gZXZlcnkgdGltZXIgaW50ZXJydXB0LiAgRXZlbiB0aG91Z2gKKwkJdGhlIERpZ2kgc2VyaWVzIGNhcmRzIGFyZSBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgaW50ZXJydXB0cyB0aGlzIAorCQltZXRob2Qgb2Ygbm9uLWxvb3BpbmcgcG9sbGluZyBpcyBtb3JlIGVmZmljaWVudC4gIFRoaXMgcm91dGluZQorCQljaGVja3MgZm9yIGNhcmQgZ2VuZXJhdGVkIGV2ZW50cyAoU3VjaCBhcyByZWNlaXZlIGRhdGEsIGFyZSB0cmFuc21pdAorCQlidWZmZXIgZW1wdHkpIGFuZCBhY3RzIG9uIHRob3NlIGV2ZW50cy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKKwl7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KKworCQliZCA9ICZib2FyZHNbY3JkXTsKKwkJY2ggPSBjYXJkX3B0cltjcmRdOworCisJCWlmICgoYmQtPnN0YXR1cyA9PSBESVNBQkxFRCkgfHwgZGlnaV9wb2xsZXJfaW5oaWJpdGVkKQorCQkJY29udGludWU7IC8qIEJlZ2luIGxvb3AgbmV4dCBpbnRlcmF0aW9uICovCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCWFzc2VydG1lbW9mZiBpcyBub3QgbmVlZGVkIGhlcmU7IGluZGVlZCBpdCBpcyBhbiBlbXB0eSBzdWJyb3V0aW5lLgorCQkJSXQgaXMgYmVpbmcga2VwdCBiZWNhdXNlIGZ1dHVyZSBib2FyZHMgbWF5IG5lZWQgdGhpcyBhcyB3ZWxsIGFzCisJCQlzb21lIGxlZ2FjeSBib2FyZHMuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlhc3NlcnRtZW1vZmYoY2gpOworCisJCWdsb2JhbHdpbm9uKGNoKTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUluIHRoaXMgY2FzZSBoZWFkIGFuZCB0YWlsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSBldmVudCBxdWV1ZSBub3QKKwkJCXRoZSB0cmFuc21pdCBvciByZWNlaXZlIHF1ZXVlLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaGVhZCA9IGNoLT5tYWlsYm94LT5laW47CisJCXRhaWwgPSBjaC0+bWFpbGJveC0+ZW91dDsKKwkJCisJCS8qIElmIGhlYWQgaXNuJ3QgZXF1YWwgdG8gdGFpbCB3ZSBoYXZlIGFuIGV2ZW50ICovCisKKwkJaWYgKGhlYWQgIT0gdGFpbCkKKwkJCWRvZXZlbnQoY3JkKTsKKworCQltZW1vZmYoY2gpOworCisJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLworCisJbW9kX3RpbWVyKCZlcGNhX3RpbWVyLCBqaWZmaWVzICsgKEhaIC8gMjUpKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfSAvKiBFbmQgZXBjYXBvbGwgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRvZXZlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBkb2V2ZW50KGludCBjcmQpCit7IC8qIEJlZ2luIGRvZXZlbnQgKi8KKworCXZvbGF0aWxlIHVuY2hhciAqZXZlbnRidWY7CisJc3RydWN0IGNoYW5uZWwgKmNoLCAqY2hhbjA7CisJc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlyZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKKwlyZWdpc3RlciBpbnQgZXZlbnQsIGNoYW5uZWw7CisJcmVnaXN0ZXIgaW50IG1zdGF0LCBsc3RhdDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCBieSBlcGNhcG9sbCB3aGVuIGFuIGV2ZW50IGlzIGRldGVjdGVkIAorCQlpbiB0aGUgZXZlbnQgcXVldWUuICBUaGlzIHJvdXRpbmUgcmVzcG9uZHMgdG8gdGhvc2UgZXZlbnRzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJYmQgPSAmYm9hcmRzW2NyZF07CisKKwljaGFuMCA9IGNhcmRfcHRyW2NyZF07CisJZXBjYWFzc2VydChjaGFuMCA8PSAmZGlnaV9jaGFubmVsc1tuYmRldnMgLSAxXSwgImNoIG91dCBvZiByYW5nZSIpOworCisJYXNzZXJ0Z3dpbm9uKGNoYW4wKTsKKworCXdoaWxlICgodGFpbCA9IGNoYW4wLT5tYWlsYm94LT5lb3V0KSAhPSAoaGVhZCA9IGNoYW4wLT5tYWlsYm94LT5laW4pKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHNvbWV0aGluZyBpbiBldmVudCBxdWV1ZSAqLworCisJCWFzc2VydGd3aW5vbihjaGFuMCk7CisKKwkJZXZlbnRidWYgPSAodm9sYXRpbGUgdW5jaGFyICopYnVzX3RvX3ZpcnQoKHVsb25nKShiZC0+cmVfbWFwX21lbWJhc2UgKyB0YWlsICsgSVNUQVJUKSk7CisKKwkJLyogR2V0IHRoZSBjaGFubmVsIHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLworCQljaGFubmVsID0gZXZlbnRidWZbMF07CisKKwkJLyogR2V0IHRoZSBhY3R1YWwgZXZlbnQgY29kZSB0aGF0IG9jY3VycmVkICovCisJCWV2ZW50ID0gZXZlbnRidWZbMV07CisKKwkJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoZSB0d28gYXNzaWdubWVudHMgYmVsb3cgZ2V0IHRoZSBjdXJyZW50IG1vZGVtIHN0YXR1cyAobXN0YXQpCisJCQlhbmQgdGhlIHByZXZpb3VzIG1vZGVtIHN0YXR1cyAobHN0YXQpLiAgVGhlc2UgYXJlIHVzZWZ1bCBiZWN1YXNlCisJCQlhbiBldmVudCBjb3VsZCBzaWduYWwgYSBjaGFuZ2UgaW4gbW9kZW0gc2lnbmFscyBpdHNlbGYuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQltc3RhdCA9IGV2ZW50YnVmWzJdOworCQlsc3RhdCA9IGV2ZW50YnVmWzNdOworCisJCWNoID0gY2hhbjAgKyBjaGFubmVsOworCisJCWlmICgodW5zaWduZWQpY2hhbm5lbCA+PSBiZC0+bnVtcG9ydHMgfHwgIWNoKSAKKwkJeyAKKwkJCWlmIChjaGFubmVsID49IGJkLT5udW1wb3J0cykKKwkJCQljaCA9IGNoYW4wOworCQkJYmMgPSBjaC0+YnJkY2hhbjsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmICgoYmMgPSBjaC0+YnJkY2hhbikgPT0gTlVMTCkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoZXZlbnQgJiBEQVRBX0lORCkgCisJCXsgLyogQmVnaW4gREFUQV9JTkQgKi8KKworCQkJcmVjZWl2ZV9kYXRhKGNoKTsKKwkJCWFzc2VydGd3aW5vbihjaCk7CisKKwkJfSAvKiBFbmQgREFUQV9JTkQgKi8KKwkJLyogZWxzZSAqLy8qIEZpeCBmb3IgRENEIHRyYW5zaXRpb24gbWlzc2VkIGJ1ZyAqLworCQlpZiAoZXZlbnQgJiBNT0RFTUNIR19JTkQpIAorCQl7IC8qIEJlZ2luIE1PREVNQ0hHX0lORCAqLworCisJCQkvKiBBIG1vZGVtIHNpZ25hbCBjaGFuZ2UgaGFzIGJlZW4gaW5kaWNhdGVkICovCisKKwkJCWNoLT5pbW9kZW0gPSBtc3RhdDsKKworCQkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIAorCQkJeworCQkJCWlmIChtc3RhdCAmIGNoLT5kY2QpICAvKiBXZSBhcmUgbm93IHJlY2VpdmluZyBkY2QgKi8KKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKwkJCQllbHNlCisJCQkJCXBjX3NjaGVkX2V2ZW50KGNoLCBFUENBX0VWRU5UX0hBTkdVUCk7IC8qIE5vIGRjZDsgaGFuZ3VwICovCisJCQl9CisKKwkJfSAvKiBFbmQgTU9ERU1DSEdfSU5EICovCisKKwkJdHR5ID0gY2gtPnR0eTsKKwkJaWYgKHR0eSkgCisJCXsgLyogQmVnaW4gaWYgdmFsaWQgdHR5ICovCisKKwkJCWlmIChldmVudCAmIEJSRUFLX0lORCkgCisJCQl7IC8qIEJlZ2luIGlmIEJSRUFLX0lORCAqLworCisJCQkJLyogQSBicmVhayBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KKworCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfQlJFQUs7CisKKwkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKworCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7IAorCisJCQl9IC8qIEVuZCBpZiBCUkVBS19JTkQgKi8KKwkJCWVsc2UKKwkJCWlmIChldmVudCAmIExPV1RYX0lORCkgCisJCQl7IC8qIEJlZ2luIExPV1RYX0lORCAqLworCisJCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpIAorCQkJCXsgLyogQmVnaW4gaWYgTE9XV0FJVCAqLworCisJCQkJCWNoLT5zdGF0dXNmbGFncyAmPSB+TE9XV0FJVDsKKwkJCQkJdHR5X3dha2V1cCh0dHkpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisKKwkJCQl9IC8qIEVuZCBpZiBMT1dXQUlUICovCisKKwkJCX0gLyogRW5kIExPV1RYX0lORCAqLworCQkJZWxzZQorCQkJaWYgKGV2ZW50ICYgRU1QVFlUWF9JTkQpIAorCQkJeyAvKiBCZWdpbiBFTVBUWVRYX0lORCAqLworCisJCQkJLyogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgc2V0dXBfZW1wdHlfZXZlbnQgKi8KKworCQkJCWNoLT5zdGF0dXNmbGFncyAmPSB+VFhCVVNZOworCQkJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpIAorCQkJCXsgLyogQmVnaW4gaWYgRU1QVFlXQUlUICovCisKKwkJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5FTVBUWVdBSVQ7CisJCQkJCXR0eV93YWtldXAodHR5KTsKKworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisKKwkJCQl9IC8qIEVuZCBpZiBFTVBUWVdBSVQgKi8KKworCQkJfSAvKiBFbmQgRU1QVFlUWF9JTkQgKi8KKworCQl9IC8qIEVuZCBpZiB2YWxpZCB0dHkgKi8KKworCisJbmV4dDoKKwkJZ2xvYmFsd2lub24oY2gpOworCisJCWlmICghYmMpCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBiYyA9PSBOVUxMIGluIGRvZXZlbnQhXG4iKTsKKwkJZWxzZSAKKwkJCWJjLT5pZGF0YSA9IDE7CisKKwkJY2hhbjAtPm1haWxib3gtPmVvdXQgPSAodGFpbCArIDQpICYgKElNQVggLSBJU1RBUlQgLSA0KTsKKwkJZ2xvYmFsd2lub24oY2hhbjApOworCisJfSAvKiBFbmQgd2hpbGUgc29tZXRoaW5nIGluIGV2ZW50IHF1ZXVlICovCisKK30gLyogRW5kIGRvZXZlbnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGZlcGNtZCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGZlcGNtZChzdHJ1Y3QgY2hhbm5lbCAqY2gsIGludCBjbWQsIGludCB3b3JkX29yX2J5dGUsCisgICAgICAgICAgICAgICAgICAgaW50IGJ5dGUyLCBpbnQgbmNtZHMsIGludCBieXRlY21kKQoreyAvKiBCZWdpbiBmZXBjbWQgKi8KKworCXVuY2hhciAqbWVtYWRkcjsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgY21kVGFpbCwgY21kU3RhcnQsIGNtZE1heDsKKwlsb25nIGNvdW50OworCWludCBuOworCisJLyogVGhpcyBpcyB0aGUgcm91dGluZSBpbiB3aGljaCBjb21tYW5kcyBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYXJkLiAqLworCisJaWYgKGNoLT5ib2FyZC0+c3RhdHVzID09IERJU0FCTEVEKQorCXsKKwkJcmV0dXJuOworCX0KKworCWFzc2VydGd3aW5vbihjaCk7CisKKwkvKiBSZW1lbWJlciBoZWFkIChBcyB3ZWxsIGFzIG1heCkgaXMganVzdCBhbiBvZmZzZXQgbm90IGEgYmFzZSBhZGRyICovCisJaGVhZCA9IGNoLT5tYWlsYm94LT5jaW47CisKKwkvKiBjbWRTdGFydCBpcyBhIGJhc2UgYWRkcmVzcyAqLworCWNtZFN0YXJ0ID0gY2gtPm1haWxib3gtPmNzdGFydDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlXZSBkbyB0aGUgYWRkaXRpb24gYmVsb3cgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCBhIG1heCBwb2ludGVyIAorCQlyZWxhdGl2ZSB0byBjbWRTdGFydC4gIFdlIHdhbnQgYSBtYXggcG9pbnRlciB0aGF0IHBvaW50cyBhdCB0aGUgCisJCXBoeXNpY2FsIGVuZCBvZiB0aGUgY29tbWFuZCBxdWV1ZS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJY21kTWF4ID0gKGNtZFN0YXJ0ICsgNCArIChjaC0+bWFpbGJveC0+Y21heCkpOworCisJbWVtYWRkciA9IGNoLT5ib2FyZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKiAKKwkgICBUaGUgYmVsb3cgY29tbWFuZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBuZXdlciBrZXJuZWxzICgyLjEueCBhbmQKKwkgICB1cCkgZG8gbm90IGhhdmUgYSAxOjEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLiAgVGhlIGJlbG93CisJICAgY2FsbCBhZGp1c3QgZm9yIHRoYXQuCisJKi8KKworCW1lbWFkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW1lbWFkZHIpOworCisJaWYgKGhlYWQgPj0gKGNtZE1heCAtIGNtZFN0YXJ0KSB8fCAoaGVhZCAmIDAzKSkgCisJeworCQlwcmludGsoS0VSTl9FUlIgImxpbmUgJWQ6IE91dCBvZiByYW5nZSwgY21kID0gJXgsIGhlYWQgPSAleFxuIiwgX19MSU5FX18sIAorICAgICAgICAgICAgICBjbWQsIGhlYWQpOworCQlwcmludGsoS0VSTl9FUlIgImxpbmUgJWQ6IE91dCBvZiByYW5nZSwgY21kTWF4ID0gJXgsIGNtZFN0YXJ0ID0gJXhcbiIsIF9fTElORV9fLCAKKyAgICAgICAgICAgICAgY21kTWF4LCBjbWRTdGFydCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYnl0ZWNtZCkgCisJeworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMCkgPSAodW5jaGFyKWNtZDsKKworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSkgPSAodW5jaGFyKWNoLT5jaGFubmVsbnVtOworCQkvKiBCZWxvdyB3b3JkX29yX2J5dGUgaXMgYml0cyB0byBzZXQgKi8KKwkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDIpID0gKHVuY2hhcil3b3JkX29yX2J5dGU7CisJCS8qIEJlbG93IGJ5dGUyIGlzIGJpdHMgdG8gcmVzZXQgKi8KKwkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDMpID0gKHVuY2hhcilieXRlMjsKKworCX0gCisJZWxzZSAKKwl7CisJCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAwKSA9ICh1bmNoYXIpY21kOworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSkgPSAodW5jaGFyKWNoLT5jaGFubmVsbnVtOworCQkqKHZvbGF0aWxlIHVzaG9ydCopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAyKSA9ICh1c2hvcnQpd29yZF9vcl9ieXRlOworCX0KKworCWhlYWQgPSAoaGVhZCArIDQpICYgKGNtZE1heCAtIGNtZFN0YXJ0IC0gNCk7CisJY2gtPm1haWxib3gtPmNpbiA9IGhlYWQ7CisKKwljb3VudCA9IEZFUFRJTUVPVVQ7CisKKwlmb3IgKDs7KSAKKwl7IC8qIEJlZ2luIGZvcmV2ZXIgbG9vcCAqLworCisJCWNvdW50LS07CisJCWlmIChjb3VudCA9PSAwKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gRmVwIG5vdCByZXNwb25kaW5nIGluIGZlcGNtZCgpXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWhlYWQgPSBjaC0+bWFpbGJveC0+Y2luOworCQljbWRUYWlsID0gY2gtPm1haWxib3gtPmNvdXQ7CisKKwkJbiA9IChoZWFkIC0gY21kVGFpbCkgJiAoY21kTWF4IC0gY21kU3RhcnQgLSA0KTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlCYXNpY2FsbHkgdGhpcyB3aWxsIGJyZWFrIHdoZW4gdGhlIEZFUCBhY2tub3dsZWRnZXMgdGhlIAorCQkJY29tbWFuZCBieSBpbmNyZW1lbnRpbmcgY21kVGFpbCAoTWFraW5nIGl0IGVxdWFsIHRvIGhlYWQpLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKG4gPD0gbmNtZHMgKiAoc2l6ZW9mKHNob3J0KSAqIDQpKQorCQkJYnJlYWs7IC8qIFdlbGwgbmVhcmx5IGZvcmV2ZXIgOi0pICovCisKKwl9IC8qIEVuZCBmb3JldmVyIGxvb3AgKi8KKworfSAvKiBFbmQgZmVwY21kICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCURpZ2kgcHJvZHVjdHMgdXNlIGZpZWxkcyBpbiB0aGVpciBjaGFubmVscyBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHZlcnkKKwlzaW1pbGFyIHRvIHRoZSBjX2NmbGFnIGFuZCBjX2lmbGFnIGZpZWxkcyB0eXBpY2FsbHkgZm91bmQgaW4gVU5JWAorCXRlcm1pb3Mgc3RydWN0dXJlcy4gIFRoZSBiZWxvdyB0aHJlZSByb3V0aW5lcyBhbGxvdyBtYXBwaW5ncyAKKwliZXR3ZWVuIHRoZXNlIGhhcmR3YXJlICJmbGFncyIgYW5kIHRoZWlyIHJlc3BlY3RpdmUgTGludXggZmxhZ3MuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdGVybWlvczJkaWdpX2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9oKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQgY2ZsYWcpCit7IC8qIEJlZ2luIHRlcm1pb3MyZGlnaV9oICovCisKKwl1bnNpZ25lZCByZXMgPSAwOworCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgCisJeworCQljaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzIHw9IChSVFNQQUNFIHwgQ1RTUEFDRSk7CisJCXJlcyB8PSAoKGNoLT5tX2N0cykgfCAoY2gtPm1fcnRzKSk7CisJfQorCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBSVFNQQUNFKQorCQlyZXMgfD0gY2gtPm1fcnRzOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBEVFJQQUNFKQorCQlyZXMgfD0gY2gtPm1fZHRyOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBDVFNQQUNFKQorCQlyZXMgfD0gY2gtPm1fY3RzOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBEU1JQQUNFKQorCQlyZXMgfD0gY2gtPmRzcjsKKworCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRENEUEFDRSkKKwkJcmVzIHw9IGNoLT5kY2Q7CisKKwlpZiAocmVzICYgKGNoLT5tX3J0cykpCisJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gUlRTUEFDRTsKKworCWlmIChyZXMgJiAoY2gtPm1fY3RzKSkKKwkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSBDVFNQQUNFOworCisJcmV0dXJuIHJlczsKKworfSAvKiBFbmQgdGVybWlvczJkaWdpX2ggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHRlcm1pb3MyZGlnaV9pIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2koc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCBpZmxhZykKK3sgLyogQmVnaW4gdGVybWlvczJkaWdpX2kgKi8KKworCXVuc2lnbmVkIHJlcyA9IGlmbGFnICYgKElHTkJSSyB8IEJSS0lOVCB8IElHTlBBUiB8IFBBUk1SSyB8IAorCSAgICAgICAgICAgICAgICAgICAgICAgIElOUENLIHwgSVNUUklQfElYT058SVhBTll8SVhPRkYpOworCQorCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9BSVhPTikKKwkJcmVzIHw9IElBSVhPTjsKKwlyZXR1cm4gcmVzOworCit9IC8qIEVuZCB0ZXJtaW9zMmRpZ2lfaSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdGVybWlvczJkaWdpX2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9jKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQgY2ZsYWcpCit7IC8qIEJlZ2luIHRlcm1pb3MyZGlnaV9jICovCisKKwl1bnNpZ25lZCByZXMgPSAwOworCisjaWZkZWYgU1BFRURfSEFDSworCS8qIENMOiBIQUNLIHRvIGZvcmNlIDExNTIwMCBhdCAzODQwMCBhbmQgNTc2MDAgYXQgMTkyMDAgQmF1ZCAqLworCWlmICgoY2ZsYWcgJiBDQkFVRCk9PSBCMzg0MDApIGNmbGFnPWNmbGFnIC0gQjM4NDAwICsgQjExNTIwMDsKKwlpZiAoKGNmbGFnICYgQ0JBVUQpPT0gQjE5MjAwKSBjZmxhZz1jZmxhZyAtIEIxOTIwMCArIEI1NzYwMDsKKyNlbmRpZiAvKiBTUEVFRF9IQUNLICovCisKKwlpZiAoY2ZsYWcgJiBDQkFVREVYKQorCXsgLyogQmVnaW4gZGV0ZWN0ZWQgQ0JBVURFWCAqLworCisJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gRElHSV9GQVNUOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICAgSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAorCQkgICB0YWJsZSBpcyB0byBiZSB1c2VkLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCXJlcyB8PSBGRVBfSFVQQ0w7CisKKwl9IC8qIEVuZCBkZXRlY3RlZCBDQkFVREVYICovCisJZWxzZSBjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICY9IH5ESUdJX0ZBU1Q7IAorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlDQkFVRCBoYXMgYml0IHBvc2l0aW9uIDB4MTAwMCBzZXQgdGhlc2UgZGF5cyB0byBpbmRpY2F0ZSBMaW51eAorCQliYXVkIHJhdGUgcmVtYXAuICBEaWdpIGhhcmR3YXJlIGNhbid0IGhhbmRsZSB0aGUgYml0IGFzc2lnbm1lbnQuCisJCShXZSB1c2UgYSBkaWZmZXJlbnQgYml0IGFzc2lnbm1lbnQgZm9yIGhpZ2ggc3BlZWQuKS4gIENsZWFyIHRoaXMKKwkJYml0IG91dC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJcmVzIHw9IGNmbGFnICYgKChDQkFVRCBeIENCQVVERVgpIHwgUEFST0REIHwgUEFSRU5CIHwgQ1NUT1BCIHwgQ1NJWkUpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIGdldHMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIERpZ2kgY2FyZHMgaGF2ZSB0aGVpciBvd24KKwkJcmVwcmVzZW50YXRpb24gb2YgY19jZmxhZ3MgY29udHJvbGluZyBiYXVkIHJhdGUuICBGb3IgdGhlIG1vc3QKKwkJcGFydCB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgTGludXggaW1wbGVtZW50YXRpb24uICBIb3dldmVyOworCQlEaWdpIHN1cHBvcnRzIG9uZSByYXRlICg3NjgwMCkgdGhhdCBMaW51eCBkb2Vzbid0LiAgVGhpcyBtZWFucyAKKwkJdGhhdCB0aGUgY19jZmxhZyBlbnRyeSB0aGF0IHdvdWxkIG5vcm1hbGx5IG1lYW4gNzY4MDAgZm9yIERpZ2kKKwkJYWN0dWFsbHkgbWVhbnMgMTE1MjAwIHVuZGVyIExpbnV4LiAgV2l0aG91dCB0aGUgYmVsb3cgbWFwcGluZywKKwkJYSBzdHR5IDExNTIwMCB3b3VsZCBvbmx5IGRyaXZlIHRoZSBib2FyZCBhdCA3NjgwMC4gIFNpbmNlIAorCQl0aGUgcmF0ZSAyMzA0MDAgaXMgYWxzbyBmb3VuZCBhZnRlciA3NjgwMCwgdGhlIHNhbWUgcHJvYmxlbSBhZmZsaWN0cwkKKwkJdXMgd2hlbiB3ZSBjaG9vc2UgYSByYXRlIG9mIDIzMDQwMC4gIFdpdGhvdXQgdGhlIGJlbG93IG1vZGlmaWNpYXRpb24KKwkJc3R0eSAyMzA0MDAgd291bGQgYWN0dWFsbHkgZ2l2ZSB1cyAxMTUyMDAuCisKKwkJVGhlcmUgYXJlIHR3byBhZGRpdGlvbmFsIGRpZmZlcmVuY2VzLiAgVGhlIExpbnV4IHZhbHVlIGZvciBDTE9DQUwKKwkJKDB4ODAwOyAwMDA0MDAwKSBoYXMgbm8gbWVhbmluZyB0byB0aGUgRGlnaSBoYXJkd2FyZS4gIEFsc28gaW4gCisJCWxhdGVyIHJlbGVhc2VzIG9mIExpbnV4OyB0aGUgQ0JBVUQgZGVmaW5lIGhhcyBDQkFVREVYICgweDEwMDA7CisJCTAwMTAwMDApIG9yZWQgaW50byBpdCAoQ0JBVUQgPSAweDEwMGYgYXMgb3Bwb3NlZCB0byAweGYpLiBDQkFVREVYCisJCXNob3VsZCBiZSBjaGVja2VkIGZvciBhIHNjcmVlbmVkIG91dCBwcmlvciB0byB0ZXJtaW9zMmRpZ2lfYyAKKwkJcmV0dXJuaW5nLiAgU2luY2UgQ0xPQ0FMIGlzbid0IHVzZWQgYnkgdGhlIGJvYXJkIHRoaXMgY2FuIGJlCisJCWlnbm9yZWQgYXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdXNlZCBvbmx5IGJ5IERpZ2kgaGFyZHdhcmUuIAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoY2ZsYWcgJiBDQkFVREVYKQorCXsKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJVGhlIGJlbG93IGNvZGUgaXMgdHJ5aW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYmF1ZCByYXRlcworCQkJMTE1MjAwIGFuZCAyMzA0MDAgYXJlIHJlbWFwcGVkLiAgV2UgdXNlIGV4Y2x1c2l2ZSBvciBiZWNhdXNlCisJCQl0aGUgdmFyaW91cyBiYXVkIHJhdGVzIHNoYXJlIGNvbW1vbiBiaXQgcG9zaXRpb25zIGFuZCB0aGVyZWZvcmUKKwkJCWNhbid0IGJlIHRlc3RlZCBmb3IgZWFzaWx5LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCQkJCisJCWlmICgoISgoY2ZsYWcgJiAweDcpIF4gKEIxMTUyMDAgJiB+Q0JBVURFWCkpKSB8fCAKKwkJICAgICghKChjZmxhZyAmIDB4NykgXiAoQjIzMDQwMCAmIH5DQkFVREVYKSkpKQorCQl7CisJCQlyZXMgKz0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXM7CisKK30gLyogRW5kIHRlcm1pb3MyZGlnaV9jICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhcGFyYW0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwY2FwYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7IC8qIEJlZ2luIGVwY2FwYXJhbSAqLworCisJdW5zaWduZWQgaW50IGNtZEhlYWQ7CisJc3RydWN0IHRlcm1pb3MgKnRzOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwl1bnNpZ25lZCBtdmFsLCBoZmxvdywgY2ZsYWcsIGlmbGFnOworCisJYmMgPSBjaC0+YnJkY2hhbjsKKwllcGNhYXNzZXJ0KGJjICE9MCwgImJjIG91dCBvZiByYW5nZSIpOworCisJYXNzZXJ0Z3dpbm9uKGNoKTsKKworCXRzID0gdHR5LT50ZXJtaW9zOworCisJaWYgKCh0cy0+Y19jZmxhZyAmIENCQVVEKSA9PSAwKSAKKwl7IC8qIEJlZ2luIENCQVVEIGRldGVjdGVkICovCisKKwkJY21kSGVhZCA9IGJjLT5yaW47CisJCWJjLT5yb3V0ID0gY21kSGVhZDsKKwkJY21kSGVhZCA9IGJjLT50aW47CisKKwkJLyogQ2hhbmdpbmcgYmF1ZCBpbiBtaWQtc3RyZWFtIHRyYW5zbWlzc2lvbiBjYW4gYmUgd29uZGVyZnVsICovCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJRmx1c2ggY3VycmVudCB0cmFuc21pdCBidWZmZXIgYnkgc2V0dGluZyBjbWRUYWlsIHBvaW50ZXIgKHRvdXQpCisJCQl0byBjbWRIZWFkIHBvaW50ZXIgKHRpbikuICBIb3BlZnVsbHkgdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyBlbXB0eS4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlmZXBjbWQoY2gsIFNUT1VULCAodW5zaWduZWQpIGNtZEhlYWQsIDAsIDAsIDApOworCQltdmFsID0gMDsKKworCX0gLyogRW5kIENCQVVEIGRldGVjdGVkICovCisJZWxzZSAKKwl7IC8qIEJlZ2luIENCQVVEIG5vdCBkZXRlY3RlZCAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCWNfY2ZsYWdzIGhhdmUgY2hhbmdlZCBidXQgdGhhdCBjaGFuZ2UgaGFkIG5vdGhpbmcgdG8gZG8gd2l0aCBCQVVELgorCQkJUHJvcGFnYXRlIHRoZSBjaGFuZ2UgdG8gdGhlIGNhcmQuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKwkJY2ZsYWcgPSB0ZXJtaW9zMmRpZ2lfYyhjaCwgdHMtPmNfY2ZsYWcpOworCisJCWlmIChjZmxhZyAhPSBjaC0+ZmVwY2ZsYWcpIAorCQl7CisJCQljaC0+ZmVwY2ZsYWcgPSBjZmxhZzsKKwkJCS8qIFNldCBiYXVkIHJhdGUsIGNoYXIgc2l6ZSwgc3RvcCBiaXRzLCBwYXJpdHkgKi8KKwkJCWZlcGNtZChjaCwgU0VUQ1RSTEZMQUdTLCAodW5zaWduZWQpIGNmbGFnLCAwLCAwLCAwKTsKKwkJfQorCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSWYgdGhlIHVzZXIgaGFzIG5vdCBmb3JjZWQgQ0xPQ0FMIGFuZCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBhIAorCQkJQ0FMTE9VVCBkZXZpY2UgKFdoaWNoIGlzIGFsd2F5cyBDTE9DQUwpIHdlIHNldCBmbGFncyBzdWNoIHRoYXQKKwkJCXRoZSBkcml2ZXIgd2lsbCB3YWl0IG9uIGNhcnJpZXIgZGV0ZWN0LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKHRzLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQl7IC8qIEJlZ2luIGl0IGlzIGEgY3VkIGRldmljZSBvciBhIHR0eUQgZGV2aWNlIHdpdGggQ0xPQ0FMIG9uICovCisJCQljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJCX0gLyogRW5kIGl0IGlzIGEgY3VkIGRldmljZSBvciBhIHR0eUQgZGV2aWNlIHdpdGggQ0xPQ0FMIG9uICovCisJCWVsc2UKKwkJeyAvKiBCZWdpbiBpdCBpcyBhIHR0eUQgZGV2aWNlICovCisJCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwkJfSAvKiBFbmQgaXQgaXMgYSB0dHlEIGRldmljZSAqLworCisJCW12YWwgPSBjaC0+bV9kdHIgfCBjaC0+bV9ydHM7CisKKwl9IC8qIEVuZCBDQkFVRCBub3QgZGV0ZWN0ZWQgKi8KKworCWlmbGFnID0gdGVybWlvczJkaWdpX2koY2gsIHRzLT5jX2lmbGFnKTsKKworCS8qIENoZWNrIGlucHV0IG1vZGUgZmxhZ3MgKi8KKworCWlmIChpZmxhZyAhPSBjaC0+ZmVwaWZsYWcpIAorCXsKKwkJY2gtPmZlcGlmbGFnID0gaWZsYWc7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlDb21tYW5kIHNldHMgY2hhbm5lbHMgaWZsYWcgc3RydWN0dXJlIG9uIHRoZSBib2FyZC4gU3VjaCB0aGluZ3MgCisJCQlhcyBpbnB1dCBzb2Z0IGZsb3cgY29udHJvbCwgaGFuZGxpbmcgb2YgcGFyaXR5IGVycm9ycywgYW5kCisJCQlicmVhayBoYW5kbGluZyBhcmUgYWxsIHNldCBoZXJlLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJLyogYnJlYWsgaGFuZGxpbmcsIHBhcml0eSBoYW5kbGluZywgaW5wdXQgc3RyaXBwaW5nLCBmbG93IGNvbnRyb2wgY2hhcnMgKi8KKwkJZmVwY21kKGNoLCBTRVRJRkxBR1MsICh1bnNpZ25lZCBpbnQpIGNoLT5mZXBpZmxhZywgMCwgMCwgMCk7CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVNldCB0aGUgYm9hcmQgbWludCB2YWx1ZSBmb3IgdGhpcyBjaGFubmVsLiAgVGhpcyB3aWxsIGNhdXNlIGhhcmR3YXJlCisJCWV2ZW50cyB0byBiZSBnZW5lcmF0ZWQgZWFjaCB0aW1lIHRoZSBEQ0Qgc2lnbmFsIChEZXNjcmliZWQgaW4gbWludCkgCisJCWNoYW5nZXMuCQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwliYy0+bWludCA9IGNoLT5kY2Q7CisKKwlpZiAoKHRzLT5jX2NmbGFnICYgQ0xPQ0FMKSB8fCAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfRk9SQ0VEQ0QpKQorCQlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfRk9SQ0VEQ0QpCisJCQliYy0+bWludCA9IDA7CisKKwljaC0+aW1vZGVtID0gYmMtPm1zdGF0OworCisJaGZsb3cgPSB0ZXJtaW9zMmRpZ2lfaChjaCwgdHMtPmNfY2ZsYWcpOworCisJaWYgKGhmbG93ICE9IGNoLT5oZmxvdykgCisJeworCQljaC0+aGZsb3cgPSBoZmxvdzsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSGFyZCBmbG93IGNvbnRyb2wgaGFzIGJlZW4gc2VsZWN0ZWQgYnV0IHRoZSBib2FyZCBpcyBub3QKKwkJCXVzaW5nIGl0LiAgQWN0aXZhdGUgaGFyZCBmbG93IGNvbnRyb2wgbm93LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWZlcGNtZChjaCwgU0VUSEZMT1csIGhmbG93LCAweGZmLCAwLCAxKTsKKwl9CisJCisKKwltdmFsIF49IGNoLT5tb2RlbWZha2UgJiAobXZhbCBeIGNoLT5tb2RlbSk7CisKKwlpZiAoY2gtPm9tb2RlbSBeIG12YWwpIAorCXsKKwkJY2gtPm9tb2RlbSA9IG12YWw7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoZSBiZWxvdyBjb21tYW5kIHNldHMgdGhlIERUUiBhbmQgUlRTIG1zdGF0IHN0cnVjdHVyZS4gIElmCisJCQloYXJkIGZsb3cgY29udHJvbCBpcyBOT1QgYWN0aXZlIHRoZXNlIGNoYW5nZXMgd2lsbCBkcml2ZSB0aGUKKwkJCW91dHB1dCBvZiB0aGUgYWN0dWFsIERUUiBhbmQgUlRTIGxpbmVzLiAgSWYgaGFyZCBmbG93IGNvbnRyb2wgCisJCQlpcyBhY3RpdmUsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIG1zdGF0IHN0cnVjdHVyZSBhbmQKKwkJCW9ubHkgYXNzZXJ0ZWQgd2hlbiBoYXJkIGZsb3cgY29udHJvbCBpcyB0dXJuZWQgb2ZmLiAKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkvKiBGaXJzdCByZXNldCBEVFIgJiBSVFM7IHRoZW4gc2V0IHRoZW0gKi8KKwkJZmVwY21kKGNoLCBTRVRNT0RFTSwgMCwgKChjaC0+bV9kdHIpfChjaC0+bV9ydHMpKSwgMCwgMSk7CisJCWZlcGNtZChjaCwgU0VUTU9ERU0sIG12YWwsIDAsIDAsIDEpOworCisJfQorCisJaWYgKGNoLT5zdGFydGMgIT0gY2gtPmZlcHN0YXJ0YyB8fCBjaC0+c3RvcGMgIT0gY2gtPmZlcHN0b3BjKSAKKwl7CisJCWNoLT5mZXBzdGFydGMgPSBjaC0+c3RhcnRjOworCQljaC0+ZmVwc3RvcGMgPSBjaC0+c3RvcGM7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGUgWE9OIC8gWE9GRiBjaGFyYWN0ZXJzIGhhdmUgY2hhbmdlZDsgcHJvcGFnYXRlIHRoZXNlCisJCQljaGFuZ2VzIHRvIHRoZSBjYXJkLgkKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZmVwY21kKGNoLCBTT05PRkZDLCBjaC0+ZmVwc3RhcnRjLCBjaC0+ZmVwc3RvcGMsIDAsIDEpOworCX0KKworCWlmIChjaC0+c3RhcnRjYSAhPSBjaC0+ZmVwc3RhcnRjYSB8fCBjaC0+c3RvcGNhICE9IGNoLT5mZXBzdG9wY2EpIAorCXsKKwkJY2gtPmZlcHN0YXJ0Y2EgPSBjaC0+c3RhcnRjYTsKKwkJY2gtPmZlcHN0b3BjYSA9IGNoLT5zdG9wY2E7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlTaW1pbGFyIHRvIHRoZSBhYm92ZSwgdGhpcyB0aW1lIHRoZSBhdXhpbGFybHkgWE9OIC8gWE9GRiAKKwkJCWNoYXJhY3RlcnMgaGF2ZSBjaGFuZ2VkOyBwcm9wYWdhdGUgdGhlc2UgY2hhbmdlcyB0byB0aGUgY2FyZC4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZmVwY21kKGNoLCBTQVVYT05PRkZDLCBjaC0+ZmVwc3RhcnRjYSwgY2gtPmZlcHN0b3BjYSwgMCwgMSk7CisJfQorCit9IC8qIEVuZCBlcGNhcGFyYW0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHJlY2VpdmVfZGF0YSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBjaGFubmVsICpjaCkKK3sgLyogQmVnaW4gcmVjZWl2ZV9kYXRhICovCisKKwl1bmNoYXIgKnJwdHI7CisJc3RydWN0IHRlcm1pb3MgKnRzID0gTlVMTDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlyZWdpc3RlciBpbnQgZGF0YVRvUmVhZCwgd3JhcGdhcCwgYnl0ZXNBdmFpbGFibGU7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHRhaWwsIGhlYWQ7CisJdW5zaWduZWQgaW50IHdyYXBtYXNrOworCWludCByYzsKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgZG9pbnQgd2hlbiBhIHJlY2VpdmUgZGF0YSBldmVudCAKKwkJaGFzIHRha2VuIHBsYWNlLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWdsb2JhbHdpbm9uKGNoKTsKKworCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpCisJCXJldHVybjsKKworCXR0eSA9IGNoLT50dHk7CisJaWYgKHR0eSkKKwkJdHMgPSB0dHktPnRlcm1pb3M7CisKKwliYyA9IGNoLT5icmRjaGFuOworCisJaWYgKCFiYykgCisJeworCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBiYyBpcyBOVUxMIGluIHJlY2VpdmVfZGF0YSFcbiIpOworCQlyZXR1cm47CisJfQorCisJd3JhcG1hc2sgPSBjaC0+cnhidWZzaXplIC0gMTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKwkJR2V0IHRoZSBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIHRoZSByZWNlaXZlciBxdWV1ZS4gIFdyYXAgdGhlIAorCQloZWFkIHBvaW50ZXIgaWYgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaGVhZCA9IGJjLT5yaW47CisJaGVhZCAmPSB3cmFwbWFzazsKKwl0YWlsID0gYmMtPnJvdXQgJiB3cmFwbWFzazsKKworCWJ5dGVzQXZhaWxhYmxlID0gKGhlYWQgLSB0YWlsKSAmIHdyYXBtYXNrOworCisJaWYgKGJ5dGVzQXZhaWxhYmxlID09IDApCisJCXJldHVybjsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIElmIENSRUFEIGJpdCBpcyBvZmYgb3IgZGV2aWNlIG5vdCBvcGVuLCBzZXQgVFggdGFpbCB0byBoZWFkCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoIXR0eSB8fCAhdHMgfHwgISh0cy0+Y19jZmxhZyAmIENSRUFEKSkgCisJeworCQliYy0+cm91dCA9IGhlYWQ7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHR5LT5mbGlwLmNvdW50ID09IFRUWV9GTElQQlVGX1NJWkUpIAorCQlyZXR1cm47CisKKwlpZiAoYmMtPm9ydW4pIAorCXsKKwkJYmMtPm9ydW4gPSAwOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvdmVycnVuISBEaWdpQm9hcmQgZGV2aWNlICVzXG4iLHR0eS0+bmFtZSk7CisJfQorCisJcnh3aW5vbihjaCk7CisJcnB0ciA9IHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHI7CisJcmMgPSB0dHktPmZsaXAuY291bnQ7CisKKwl3aGlsZSAoYnl0ZXNBdmFpbGFibGUgPiAwKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGRhdGEgb24gdGhlIGNhcmQgKi8KKworCQl3cmFwZ2FwID0gKGhlYWQgPj0gdGFpbCkgPyBoZWFkIC0gdGFpbCA6IGNoLT5yeGJ1ZnNpemUgLSB0YWlsOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJRXZlbiBpZiBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCBvbmx5IHJlcG9ydCB0aGUgYW1vdW50IG9mCisJCQlkYXRhIHRvIGJlIGVxdWFsIHRvIHRoZSBzaXplIC0gdGFpbC4gIFJlbWVtYmVyIG1lbWNweSBjYW4ndAorCQkJYXV0b21hdGljbHkgd3JhcCBhcm91bmQgdGhlIHJlY2VpdmUgYnVmZmVyLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWRhdGFUb1JlYWQgPSAod3JhcGdhcCA8IGJ5dGVzQXZhaWxhYmxlKSA/IHdyYXBnYXAgOiBieXRlc0F2YWlsYWJsZTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlcgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWlmICgocmMgKyBkYXRhVG9SZWFkKSA+IFRUWV9GTElQQlVGX1NJWkUpCisJCQlkYXRhVG9SZWFkID0gVFRZX0ZMSVBCVUZfU0laRSAtIHJjOworCisJCWlmIChkYXRhVG9SZWFkID09IDApCisJCQlicmVhazsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCU1vdmUgZGF0YSByZWFkIGZyb20gb3VyIGNhcmQgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lcyBidWZmZXIKKwkJCWZvciB0cmFuc2xhdGlvbiBpZiBuZWNlc3NhcnkuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWlmICgobWVtY3B5KHJwdHIsIGNoLT5yeHB0ciArIHRhaWwsIGRhdGFUb1JlYWQpKSAhPSBycHRyKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcmVjZWl2ZV9kYXRhIDogbWVtY3B5IGZhaWxlZFxuIik7CisJCQkKKwkJcmMgICArPSBkYXRhVG9SZWFkOworCQlycHRyICs9IGRhdGFUb1JlYWQ7CisJCXRhaWwgPSAodGFpbCArIGRhdGFUb1JlYWQpICYgd3JhcG1hc2s7CisJCWJ5dGVzQXZhaWxhYmxlIC09IGRhdGFUb1JlYWQ7CisKKwl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBkYXRhIG9uIHRoZSBjYXJkICovCisKKworCXR0eS0+ZmxpcC5jb3VudCA9IHJjOworCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBycHRyOworCWdsb2JhbHdpbm9uKGNoKTsKKwliYy0+cm91dCA9IHRhaWw7CisKKwkvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGdsb2JhbCBkYXRhICovCisJdHR5X3NjaGVkdWxlX2ZsaXAoY2gtPnR0eSk7IAorCXJldHVybjsKKworfSAvKiBFbmQgcmVjZWl2ZV9kYXRhICovCisKK3N0YXRpYyBpbnQgaW5mb19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgCisJeyAvKiBCZWdpbiBzd2l0Y2ggY21kICovCisKKwkJY2FzZSBESUdJX0dFVElORk86CisJCXsgLyogQmVnaW4gY2FzZSBESUdJX0dFVElORk8gKi8KKworCQkJc3RydWN0IGRpZ2lfaW5mbyBkaSA7CisJCQlpbnQgYnJkOworCisJCQlnZXRVc2VyKGJyZCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOworCisJCQlpZiAoKGJyZCA8IDApIHx8IChicmQgPj0gbnVtX2NhcmRzKSB8fCAobnVtX2NhcmRzID09IDApKQorCQkJCXJldHVybiAoLUVOT0RFVik7CisKKwkJCW1lbXNldCgmZGksIDAsIHNpemVvZihkaSkpOworCisJCQlkaS5ib2FyZCA9IGJyZCA7IAorCQkJZGkuc3RhdHVzID0gYm9hcmRzW2JyZF0uc3RhdHVzOworCQkJZGkudHlwZSA9IGJvYXJkc1ticmRdLnR5cGUgOworCQkJZGkubnVtcG9ydHMgPSBib2FyZHNbYnJkXS5udW1wb3J0cyA7CisJCQlkaS5wb3J0ID0gYm9hcmRzW2JyZF0ucG9ydCA7CisJCQlkaS5tZW1iYXNlID0gYm9hcmRzW2JyZF0ubWVtYmFzZSA7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGksIHNpemVvZiAoZGkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCX0gLyogRW5kIGNhc2UgRElHSV9HRVRJTkZPICovCisKKwkJY2FzZSBESUdJX1BPTExFUjoKKwkJeyAvKiBCZWdpbiBjYXNlIERJR0lfUE9MTEVSICovCisKKwkJCWludCBicmQgPSBhcmcgJiAweGZmMDAwMDAwID4+IDE2IDsgCisJCQl1bnNpZ25lZCBjaGFyIHN0YXRlID0gYXJnICYgMHhmZiA7IAorCisJCQlpZiAoKGJyZCA8IDApIHx8IChicmQgPj0gbnVtX2NhcmRzKSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBESUdJIFBPTExFUiA6IGJyZCBub3QgdmFsaWQhXG4iKTsKKwkJCQlyZXR1cm4gKC1FTk9ERVYpOworCQkJfQorCisJCQlkaWdpX3BvbGxlcl9pbmhpYml0ZWQgPSBzdGF0ZSA7CisJCQlicmVhayA7IAorCisJCX0gLyogRW5kIGNhc2UgRElHSV9QT0xMRVIgKi8KKworCQljYXNlIERJR0lfSU5JVDoKKwkJeyAvKiBCZWdpbiBjYXNlIERJR0lfSU5JVCAqLworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlUaGlzIGNhbGwgaXMgbWFkZSBieSB0aGUgYXBwcyB0byBjb21wbGV0ZSB0aGUgaW5pdGlsaXphdGlvbgorCQkJCW9mIHRoZSBib2FyZChzKS4gIFRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZworCQkJCXRoZSBjYXJkIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZCBzZXR0aW5nIHRoZSBkcml2ZXJzIGNvbnRyb2wKKwkJCQlmaWVsZHMgdG8gdGhlIHN1dGlhbmxlIHNldHRpbmdzIGZvciB0aGUgY2FyZCBpbiBxdWVzdGlvbi4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkJCisJCQlpbnQgY3JkIDsgCisJCQlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAorCQkJCXBvc3RfZmVwX2luaXQgKGNyZCk7CisKKwkJCWJyZWFrIDsgCisKKwkJfSAvKiBFbmQgY2FzZSBESUdJX0lOSVQgKi8KKworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJfSAvKiBFbmQgc3dpdGNoIGNtZCAqLworCXJldHVybiAoMCkgOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2lvY3RsICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwl1bnNpZ25lZCBpbnQgbXN0YXQsIG1mbGFnID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoKQorCQliYyA9IGNoLT5icmRjaGFuOworCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGNoIGlzIE5VTEwgaW4gcGNfdGlvY21nZXQhXG4iKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWdsb2JhbHdpbm9uKGNoKTsKKwltc3RhdCA9IGJjLT5tc3RhdDsKKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKG1zdGF0ICYgY2gtPm1fZHRyKQorCQltZmxhZyB8PSBUSU9DTV9EVFI7CisKKwlpZiAobXN0YXQgJiBjaC0+bV9ydHMpCisJCW1mbGFnIHw9IFRJT0NNX1JUUzsKKworCWlmIChtc3RhdCAmIGNoLT5tX2N0cykKKwkJbWZsYWcgfD0gVElPQ01fQ1RTOworCisJaWYgKG1zdGF0ICYgY2gtPmRzcikKKwkJbWZsYWcgfD0gVElPQ01fRFNSOworCisJaWYgKG1zdGF0ICYgY2gtPm1fcmkpCisJCW1mbGFnIHw9IFRJT0NNX1JJOworCisJaWYgKG1zdGF0ICYgY2gtPmRjZCkKKwkJbWZsYWcgfD0gVElPQ01fQ0Q7CisKKwlyZXR1cm4gbWZsYWc7Cit9CisKK3N0YXRpYyBpbnQgcGNfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gY2ggaXMgTlVMTCBpbiBwY190aW9jbXNldCFcbiIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJLyoKKwkgKiBJIHRoaW5rIHRoaXMgbW9kZW1mYWtlIHN0dWZmIGlzIGJyb2tlbi4gIEl0IGRvZXNuJ3QKKwkgKiBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgYmVoYXZpb3VyIGRlc2lyZWQgYnkgdGhlIFRJT0NNKgorCSAqIGlvY3Rscy4gIFRoZXJlZm9yZSB0aGlzIGlzIHByb2JhYmx5IGJyb2tlbi4KKwkgKi8KKwlpZiAoc2V0ICYgVElPQ01fUlRTKSB7CisJCWNoLT5tb2RlbWZha2UgfD0gY2gtPm1fcnRzOworCQljaC0+bW9kZW0gfD0gY2gtPm1fcnRzOworCX0KKwlpZiAoc2V0ICYgVElPQ01fRFRSKSB7CisJCWNoLT5tb2RlbWZha2UgfD0gY2gtPm1fZHRyOworCQljaC0+bW9kZW0gfD0gY2gtPm1fZHRyOworCX0KKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKKwkJY2gtPm1vZGVtZmFrZSB8PSBjaC0+bV9ydHM7CisJCWNoLT5tb2RlbSAmPSB+Y2gtPm1fcnRzOworCX0KKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKKwkJY2gtPm1vZGVtZmFrZSB8PSBjaC0+bV9kdHI7CisJCWNoLT5tb2RlbSAmPSB+Y2gtPm1fZHRyOworCX0KKworCWdsb2JhbHdpbm9uKGNoKTsKKworCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgYmVsb3cgcm91dGluZSBnZW5lcmFsbHkgc2V0cyB1cCBwYXJpdHksIGJhdWQsIGZsb3cgY29udHJvbAorCQlpc3N1ZXMsIGV0Yy4uLi4gSXQgZWZmZWN0IGJvdGggY29udHJvbCBmbGFncyBhbmQgaW5wdXQgZmxhZ3MuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwllcGNhcGFyYW0odHR5LGNoKTsKKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreyAvKiBCZWdpbiBwY19pb2N0bCAqLworCisJZGlnaWZsb3dfdCBkZmxvdzsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1mbGFnLCBtc3RhdDsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0Yywgc3RvcGM7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCQorCWlmIChjaCkKKwkJYmMgPSBjaC0+YnJkY2hhbjsKKwllbHNlIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gY2ggaXMgTlVMTCBpbiBwY19pb2N0bCFcbiIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisJc2F2ZV9mbGFncyhmbGFncyk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUZvciBQT1NJWCBjb21wbGlhbmNlIHdlIG5lZWQgdG8gYWRkIG1vcmUgaW9jdGxzLiAgU2VlIHR0eV9pb2N0bC5jCisJCWluIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2hhciBmb3IgYSBnb29kIGV4YW1wbGUuICBJbiBwYXJ0aWN1bGFyIAorCQl0aGluayBhYm91dCBhZGRpbmcgVENTRVRBRiwgVENTRVRBVywgVENTRVRBLCBUQ1NFVFNGLCBUQ1NFVFNXLCBUQ1NFVFMuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJc3dpdGNoIChjbWQpIAorCXsgLyogQmVnaW4gc3dpdGNoIGNtZCAqLworCisJCWNhc2UgVENHRVRTOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAKKwkJCQkJIHR0eS0+dGVybWlvcywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4oMCk7CisKKwkJY2FzZSBUQ0dFVEE6CisJCQlyZXR1cm4gZ2V0X3Rlcm1pbyh0dHksIGFyZ3ApOworCisJCWNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKworCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLworCisJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlpZiAoIWFyZykKKwkJCQlkaWdpX3NlbmRfYnJlYWsoY2gsIEhaLzQpOyAgICAvKiAxLzQgc2Vjb25kICovCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKworCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLworCisJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlkaWdpX3NlbmRfYnJlYWsoY2gsIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJT0NHU09GVENBUjoKKwkJCWlmIChwdXRfdXNlcihDX0NMT0NBTCh0dHkpPzE6MCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwkJCWlmIChnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKwkJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCQkgKHZhbHVlID8gQ0xPQ0FMIDogMCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFRJT0NNT0RHOgorCQkJbWZsYWcgPSBwY190aW9jbWdldCh0dHksIGZpbGUpOworCQkJaWYgKHB1dF91c2VyKG1mbGFnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgVElPQ01PRFM6CisJCQlpZiAoZ2V0X3VzZXIobXN0YXQsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBwY190aW9jbXNldCh0dHksIGZpbGUsIG1zdGF0LCB+bXN0YXQpOworCisJCWNhc2UgVElPQ1NEVFI6CisJCQljaC0+b21vZGVtIHw9IGNoLT5tX2R0cjsKKwkJCWNsaSgpOworCQkJZ2xvYmFsd2lub24oY2gpOworCQkJZmVwY21kKGNoLCBTRVRNT0RFTSwgY2gtPm1fZHRyLCAwLCAxMCwgMSk7CisJCQltZW1vZmYoY2gpOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIFRJT0NDRFRSOgorCQkJY2gtPm9tb2RlbSAmPSB+Y2gtPm1fZHRyOworCQkJY2xpKCk7CisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQlmZXBjbWQoY2gsIFNFVE1PREVNLCAwLCBjaC0+bV9kdHIsIDEwLCAxKTsKKwkJCW1lbW9mZihjaCk7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9HRVRBOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2gtPmRpZ2lleHQsIHNpemVvZihkaWdpX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9TRVRBVzoKKwkJY2FzZSBESUdJX1NFVEFGOgorCQkJaWYgKChjbWQpID09IChESUdJX1NFVEFXKSkgCisJCQl7CisJCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KKworCQkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CQkKKwkJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQl9CisJCQllbHNlIAorCQkJeworCQkJCS8qIGxkaXNjIGxvY2sgYWxyZWFkeSBoZWxkIGluIGlvY3RsICovCisJCQkJaWYgKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKQorCQkJCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcih0dHkpOworCQkJfQorCisJCQkvKiBGYWxsIFRocnUgKi8KKworCQljYXNlIERJR0lfU0VUQToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2gtPmRpZ2lleHQsIGFyZ3AsIHNpemVvZihkaWdpX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQorCQkJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikgCisJCQl7CisJCQkJY2gtPmRjZCA9IGNoLT5tX2RzcjsKKwkJCQljaC0+ZHNyID0gY2gtPm1fZGNkOworCQkJfSAKKwkJCWVsc2UgCisJCQl7CisJCQkJY2gtPmRjZCA9IGNoLT5tX2RjZDsKKwkJCQljaC0+ZHNyID0gY2gtPm1fZHNyOworCQkJfQorCQkKKwkJCWNsaSgpOworCQkJZ2xvYmFsd2lub24oY2gpOworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVRoZSBiZWxvdyByb3V0aW5lIGdlbmVyYWxseSBzZXRzIHVwIHBhcml0eSwgYmF1ZCwgZmxvdyBjb250cm9sIAorCQkJCWlzc3VlcywgZXRjLi4uLiBJdCBlZmZlY3QgYm90aCBjb250cm9sIGZsYWdzIGFuZCBpbnB1dCBmbGFncy4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkJZXBjYXBhcmFtKHR0eSxjaCk7CisJCQltZW1vZmYoY2gpOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIERJR0lfR0VURkxPVzoKKwkJY2FzZSBESUdJX0dFVEFGTE9XOgorCQkJY2xpKCk7CQorCQkJZ2xvYmFsd2lub24oY2gpOworCQkJaWYgKChjbWQpID09IChESUdJX0dFVEZMT1cpKSAKKwkJCXsKKwkJCQlkZmxvdy5zdGFydGMgPSBiYy0+c3RhcnRjOworCQkJCWRmbG93LnN0b3BjID0gYmMtPnN0b3BjOworCQkJfQorCQkJZWxzZSAKKwkJCXsKKwkJCQlkZmxvdy5zdGFydGMgPSBiYy0+c3RhcnRjYTsKKwkJCQlkZmxvdy5zdG9wYyA9IGJjLT5zdG9wY2E7CisJCQl9CisJCQltZW1vZmYoY2gpOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRmbG93LCBzaXplb2YoZGZsb3cpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9TRVRBRkxPVzoKKwkJY2FzZSBESUdJX1NFVEZMT1c6CisJCQlpZiAoKGNtZCkgPT0gKERJR0lfU0VURkxPVykpIAorCQkJeworCQkJCXN0YXJ0YyA9IGNoLT5zdGFydGM7CisJCQkJc3RvcGMgPSBjaC0+c3RvcGM7CisJCQl9IAorCQkJZWxzZSAKKwkJCXsKKwkJCQlzdGFydGMgPSBjaC0+c3RhcnRjYTsKKwkJCQlzdG9wYyA9IGNoLT5zdG9wY2E7CisJCQl9CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZGZsb3csIGFyZ3AsIHNpemVvZihkZmxvdykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoZGZsb3cuc3RhcnRjICE9IHN0YXJ0YyB8fCBkZmxvdy5zdG9wYyAhPSBzdG9wYykgCisJCQl7IC8qIEJlZ2luICBpZiBzZXRmbG93IHRvZ2dsZWQgKi8KKwkJCQljbGkoKTsKKwkJCQlnbG9iYWx3aW5vbihjaCk7CisKKwkJCQlpZiAoKGNtZCkgPT0gKERJR0lfU0VURkxPVykpIAorCQkJCXsKKwkJCQkJY2gtPmZlcHN0YXJ0YyA9IGNoLT5zdGFydGMgPSBkZmxvdy5zdGFydGM7CisJCQkJCWNoLT5mZXBzdG9wYyA9IGNoLT5zdG9wYyA9IGRmbG93LnN0b3BjOworCQkJCQlmZXBjbWQoY2gsIFNPTk9GRkMsIGNoLT5mZXBzdGFydGMsIGNoLT5mZXBzdG9wYywgMCwgMSk7CisJCQkJfSAKKwkJCQllbHNlIAorCQkJCXsKKwkJCQkJY2gtPmZlcHN0YXJ0Y2EgPSBjaC0+c3RhcnRjYSA9IGRmbG93LnN0YXJ0YzsKKwkJCQkJY2gtPmZlcHN0b3BjYSAgPSBjaC0+c3RvcGNhID0gZGZsb3cuc3RvcGM7CisJCQkJCWZlcGNtZChjaCwgU0FVWE9OT0ZGQywgY2gtPmZlcHN0YXJ0Y2EsIGNoLT5mZXBzdG9wY2EsIDAsIDEpOworCQkJCX0KKworCQkJCWlmCShjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpCisJCQkJCXBjX3N0YXJ0KHR0eSk7CisKKwkJCQltZW1vZmYoY2gpOworCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJCQl9IC8qIEVuZCBpZiBzZXRmbG93IHRvZ2dsZWQgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJfSAvKiBFbmQgc3dpdGNoIGNtZCAqLworCisJcmV0dXJuIDA7CisKK30gLyogRW5kIHBjX2lvY3RsICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zZXRfdGVybWlvcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreyAvKiBCZWdpbiBwY19zZXRfdGVybWlvcyAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisJCWdsb2JhbHdpbm9uKGNoKTsKKwkJZXBjYXBhcmFtKHR0eSwgY2gpOworCQltZW1vZmYoY2gpOworCisJCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCQkJICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMCkpCisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCisJCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCQkJICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworfSAvKiBFbmQgcGNfc2V0X3Rlcm1pb3MgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRvX3NvZnRpbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7IC8qIEJlZ2luIGRvX3NvZnRpbnQgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBwcml2YXRlXzsKKwkKKworCS8qIENhbGxlZCBpbiByZXNwb25zZSB0byBhIG1vZGVtIGNoYW5nZSBldmVudCAqLworCisJaWYgKGNoICYmIGNoLT5tYWdpYyA9PSBFUENBX01BR0lDKSAKKwl7IC8qIEJlZ2luIEVQQ0FfTUFHSUMgKi8KKworCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gY2gtPnR0eTsKKworCQlpZiAodHR5ICYmIHR0eS0+ZHJpdmVyX2RhdGEpIAorCQl7IAorCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFUENBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCkpIAorCQkJeyAvKiBCZWdpbiBpZiBjbGVhcl9iaXQgKi8KKworCQkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCQkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCisJCQl9IC8qIEVuZCBpZiBjbGVhcl9iaXQgKi8KKwkJfQorCisJfSAvKiBFbmQgRVBDQV9NQUdJQyAqLworfSAvKiBFbmQgZG9fc29mdGludCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwY19zdG9wIGFuZCBwY19zdGFydCBwcm92aWRlIHNvZnR3YXJlIGZsb3cgY29udHJvbCB0byB0aGUgCisJcm91dGluZSBhbmQgdGhlIHBjX2lvY3RsIHJvdXRpbmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zdG9wICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX3N0b3AgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCisJeyAvKiBCZWdpbiBpZiB2YWxpZCBjaGFubmVsICovCisKKwkJc2F2ZV9mbGFncyhmbGFncyk7IAorCQljbGkoKTsKKworCQlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgPT0gMCkgCisJCXsgLyogQmVnaW4gaWYgdHJhbnNtaXQgc3RvcCByZXF1ZXN0ZWQgKi8KKworCQkJZ2xvYmFsd2lub24oY2gpOworCisJCQkvKiBTVE9QIHRyYW5zbWl0dGluZyBub3cgISEgKi8KKworCQkJZmVwY21kKGNoLCBQQVVTRVRYLCAwLCAwLCAwLCAwKTsKKworCQkJY2gtPnN0YXR1c2ZsYWdzIHw9IFRYU1RPUFBFRDsKKwkJCW1lbW9mZihjaCk7CisKKwkJfSAvKiBFbmQgaWYgdHJhbnNtaXQgc3RvcCByZXF1ZXN0ZWQgKi8KKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIHZhbGlkIGNoYW5uZWwgKi8KKworfSAvKiBFbmQgcGNfc3RvcCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfc3RhcnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX3N0YXJ0ICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKworCQkvKiBKdXN0IGluIGNhc2Ugb3V0cHV0IHdhcyByZXN1bWVkIGJlY2F1c2Ugb2YgYSBjaGFuZ2UgaW4gRGlnaS1mbG93ICovCisJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpIAorCQl7IC8qIEJlZ2luIHRyYW5zbWl0IHJlc3VtZSByZXF1ZXN0ZWQgKi8KKworCQkJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQliYyA9IGNoLT5icmRjaGFuOworCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpCisJCQkJYmMtPmlsb3cgPSAxOworCisJCQkvKiBPa2F5LCB5b3UgY2FuIHN0YXJ0IHRyYW5zbWl0dGluZyBhZ2Fpbi4uLiAqLworCisJCQlmZXBjbWQoY2gsIFJFU1VNRVRYLCAwLCAwLCAwLCAwKTsKKworCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5UWFNUT1BQRUQ7CisJCQltZW1vZmYoY2gpOworCisJCX0gLyogRW5kIHRyYW5zbWl0IHJlc3VtZSByZXF1ZXN0ZWQgKi8KKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworfSAvKiBFbmQgcGNfc3RhcnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVGhlIGJlbG93IHJvdXRpbmVzIHBjX3Rocm90dGxlIGFuZCBwY191bnRocm90dGxlIGFyZSB1c2VkIAorCXRvIHNsb3cgKEFuZCByZXN1bWUpIHRoZSByZWNlaXB0IG9mIGRhdGEgaW50byB0aGUga2VybmVscworCXJlY2VpdmUgYnVmZmVycy4gIFRoZSBleGFjdCBvY2N1cnJlbmNlIG9mIHRoaXMgZGVwZW5kcyBvbiB0aGUKKwlzaXplIG9mIHRoZSBrZXJuZWxzIHJlY2VpdmUgYnVmZmVyIGFuZCB3aGF0IHRoZSAnd2F0ZXJtYXJrcycKKwlhcmUgc2V0IHRvIGZvciB0aGF0IGJ1ZmZlci4gIFNlZSB0aGUgbl90dHlzLmMgZmlsZSBmb3IgbW9yZQorCWRldGFpbHMuIAorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHRocm90dGxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sgLyogQmVnaW4gcGNfdGhyb3R0bGUgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCisJeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCisKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpID09IDApCisJCXsKKwkJCWdsb2JhbHdpbm9uKGNoKTsKKwkJCWZlcGNtZChjaCwgUEFVU0VSWCwgMCwgMCwgMCwgMCk7CisKKwkJCWNoLT5zdGF0dXNmbGFncyB8PSBSWFNUT1BQRUQ7CisJCQltZW1vZmYoY2gpOworCQl9CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJfSAvKiBFbmQgaWYgY2hhbm5lbCB2YWxpZCAqLworCit9IC8qIEVuZCBwY190aHJvdHRsZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdW50aHJvdHRsZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY191bnRocm90dGxlICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLworCisKKwkJLyogSnVzdCBpbiBjYXNlIG91dHB1dCB3YXMgcmVzdW1lZCBiZWNhdXNlIG9mIGEgY2hhbmdlIGluIERpZ2ktZmxvdyAqLworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkgCisJCXsKKworCQkJZ2xvYmFsd2lub24oY2gpOworCQkJYmMgPSBjaC0+YnJkY2hhbjsKKwkJCWZlcGNtZChjaCwgUkVTVU1FUlgsIDAsIDAsIDAsIDApOworCisJCQljaC0+c3RhdHVzZmxhZ3MgJj0gflJYU1RPUFBFRDsKKwkJCW1lbW9mZihjaCk7CisJCX0KKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl9IC8qIEVuZCBpZiBjaGFubmVsIHZhbGlkICovCisKK30gLyogRW5kIHBjX3VudGhyb3R0bGUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRpZ2lfc2VuZF9icmVhayAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBkaWdpX3NlbmRfYnJlYWsoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgbXNlYykKK3sgLyogQmVnaW4gZGlnaV9zZW5kX2JyZWFrICovCisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisJICAgTWF5YmUgSSBzaG91bGQgc2VuZCBhbiBpbmZpbml0ZSBicmVhayBoZXJlLCBzY2hlZHVsZSgpIGZvcgorCSAgIG1zZWMgYW1vdW50IG9mIHRpbWUsIGFuZCB0aGVuIHN0b3AgdGhlIGJyZWFrLiAgVGhpcyB3YXksCisJICAgdGhlIHVzZXIgY2FuJ3Qgc2NyZXcgdXAgdGhlIEZFUCBieSBjYXVzaW5nIGRpZ2lfc2VuZF9icmVhaygpCisJICAgdG8gYmUgY2FsbGVkIChpLmUuIHZpYSBhbiBpb2N0bCgpKSBtb3JlIHRoYW4gb25jZSBpbiBtc2VjIGFtb3VudCAKKwkgICBvZiB0aW1lLiAgVHJ5IHRoaXMgZm9yIG5vdy4uLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJZmVwY21kKGNoLCBTRU5EQlJFQUssIG1zZWMsIDAsIDEwLCAwKTsKKwltZW1vZmYoY2gpOworCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKK30gLyogRW5kIGRpZ2lfc2VuZF9icmVhayAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gc2V0dXBfZW1wdHlfZXZlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBjaGFubmVsICpjaCkKK3sgLyogQmVnaW4gc2V0dXBfZW1wdHlfZXZlbnQgKi8KKworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYyA9IGNoLT5icmRjaGFuOworCXVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCWNoLT5zdGF0dXNmbGFncyB8PSBFTVBUWVdBSVQ7CisJCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVdoZW4gc2V0IHRoZSBpZW1wdHkgZmxhZyByZXF1ZXN0IGEgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkIHdoZW4gdGhlIAorCQl0cmFuc21pdCBidWZmZXIgaXMgZW1wdHkgKElmIHRoZXJlIGlzIG5vIEJSRUFLIGluIHByb2dyZXNzKS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWJjLT5pZW1wdHkgPSAxOworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKK30gLyogRW5kIHNldHVwX2VtcHR5X2V2ZW50ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBnZXRfdGVybWlvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pbyBfX3VzZXIgKiB0ZXJtaW8pCit7IC8qIEJlZ2luIGdldF90ZXJtaW8gKi8KKwlyZXR1cm4ga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0dHktPnRlcm1pb3MpOworfSAvKiBFbmQgZ2V0X3Rlcm1pbyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhX3NldHVwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBlcGNhX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreyAvKiBCZWdpbiBlcGNhX3NldHVwICovCisKKwlzdHJ1Y3QgYm9hcmRfaW5mbyBib2FyZDsKKwlpbnQgICAgICAgICAgICAgICBpbmRleCwgbG9vcCwgbGFzdDsKKwljaGFyICAgICAgICAgICAgICAqdGVtcCwgKnQyOworCXVuc2lnbmVkICAgICAgICAgIGxlbjsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJSWYgdGhpcyByb3V0aW5lIGxvb2tzIGEgbGl0dGxlIHN0cmFuZ2UgaXQgaXMgYmVjYXVzZSBpdCBpcyBvbmx5IGNhbGxlZAorCQlpZiBhIExJTE8gYXBwZW5kIGNvbW1hbmQgaXMgZ2l2ZW4gdG8gYm9vdCB0aGUga2VybmVsIHdpdGggcGFyYW1ldGVycy4gIAorCQlJbiB0aGlzIHdheSwgd2UgY2FuIHByb3ZpZGUgdGhlIHVzZXIgYSBtZXRob2Qgb2YgY2hhbmdpbmcgaGlzIGJvYXJkCisJCWNvbmZpZ3VyYXRpb24gd2l0aG91dCByZWJ1aWxkaW5nIHRoZSBrZXJuZWwuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpZiAoIWxpbG9jb25maWcpIAorCQlsaWxvY29uZmlnID0gMTsgCisKKwltZW1zZXQoJmJvYXJkLCAwLCBzaXplb2YoYm9hcmQpKTsKKworCS8qIEFzc3VtZSB0aGUgZGF0YSBpcyBpbnQgZmlyc3QsIGxhdGVyIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKwkvKiBJIHRoaW5rIHRoYXQgYXJyYXkgcG9zaXRpb24gMCBvZiBpbnRzIGhvbGRzIHRoZSBudW1iZXIgb2YgYXJncyAqLworCWZvciAobGFzdCA9IDAsIGluZGV4ID0gMTsgaW5kZXggPD0gaW50c1swXTsgaW5kZXgrKykKKwkJc3dpdGNoKGluZGV4KQorCQl7IC8qIEJlZ2luIHBhcnNlIHN3aXRjaCAqLworCisJCQljYXNlIDE6CisJCQkJYm9hcmQuc3RhdHVzID0gaW50c1tpbmRleF07CisJCQkJCisJCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCVdlIGNoZWNrIGZvciAyIChBcyBvcHBvc2VkIHRvIDE7IGJlY2F1c2UgMiBpcyBhIGZsYWcKKwkJCQkJaW5zdHJ1Y3RpbmcgdGhlIGRyaXZlciB0byBpZ25vcmUgZXBjYWNvbmZpZy4pICBGb3IgdGhpcworCQkJCQlyZWFzb24gd2UgY2hlY2sgZm9yIDIuCisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAorCQkJCWlmIChib2FyZC5zdGF0dXMgPT0gMikKKwkJCQl7IC8qIEJlZ2luIGlnbm9yZSBlcGNhY29uZmlnIGFzIHdlbGwgYXMgbGlsbyBjbWQgbGluZSAqLworCQkJCQluYmRldnMgPSAwOworCQkJCQludW1fY2FyZHMgPSAwOworCQkJCQlyZXR1cm47CisJCQkJfSAvKiBFbmQgaWdub3JlIGVwY2Fjb25maWcgYXMgd2VsbCBhcyBsaWxvIGNtZCBsaW5lICovCisJCisJCQkJaWYgKGJvYXJkLnN0YXR1cyA+IDIpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHN0YXR1cyAweCV4XG4iLCBib2FyZC5zdGF0dXMpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1NUQVRVUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQlib2FyZC50eXBlID0gaW50c1tpbmRleF07CisJCQkJaWYgKGJvYXJkLnR5cGUgPj0gUENJWEVNKSAKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgdHlwZSAweCV4XG4iLCBib2FyZC50eXBlKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9UWVBFOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCWJvYXJkLmFsdHBpbiA9IGludHNbaW5kZXhdOworCQkJCWlmIChib2FyZC5hbHRwaW4gPiAxKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBhbHRwaW4gMHgleFxuIiwgYm9hcmQuYWx0cGluKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9BTFRQSU47CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6CisJCQkJYm9hcmQubnVtcG9ydHMgPSBpbnRzW2luZGV4XTsKKwkJCQlpZiAoKGJvYXJkLm51bXBvcnRzIDwgMikgfHwgKGJvYXJkLm51bXBvcnRzID4gMjU2KSkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgbnVtcG9ydHMgMHgleFxuIiwgYm9hcmQubnVtcG9ydHMpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX05VTV9QT1JUUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQluYmRldnMgKz0gYm9hcmQubnVtcG9ydHM7CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDU6CisJCQkJYm9hcmQucG9ydCA9ICh1bnNpZ25lZCBjaGFyICopaW50c1tpbmRleF07CisJCQkJaWYgKGludHNbaW5kZXhdIDw9IDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGlvIHBvcnQgMHgleFxuIiwgKHVuc2lnbmVkIGludClib2FyZC5wb3J0KTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9QT1JUX0JBU0U7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDY6CisJCQkJYm9hcmQubWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopaW50c1tpbmRleF07CisJCQkJaWYgKGludHNbaW5kZXhdIDw9IDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIG1lbW9yeSBiYXNlIDB4JXhcbiIsKHVuc2lnbmVkIGludClib2FyZC5tZW1iYXNlKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9NRU1fQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogVG9vIG1hbnkgaW50ZWdlciBwYXJtc1xuIik7CisJCQkJcmV0dXJuOworCisJCX0gLyogRW5kIHBhcnNlIHN3aXRjaCAqLworCisJd2hpbGUgKHN0ciAmJiAqc3RyKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGEgc3RyaW5nIGFyZyAqLworCisJCS8qIGZpbmQgdGhlIG5leHQgY29tbWEgb3IgdGVybWluYXRvciAqLworCQl0ZW1wID0gc3RyOworCisJCS8qIFdoaWxlIHN0cmluZyBpcyBub3QgbnVsbCwgYW5kIGEgY29tbWEgaGFzbid0IGJlZW4gZm91bmQgKi8KKwkJd2hpbGUgKCp0ZW1wICYmICgqdGVtcCAhPSAnLCcpKQorCQkJdGVtcCsrOworCisJCWlmICghKnRlbXApCisJCQl0ZW1wID0gTlVMTDsKKwkJZWxzZQorCQkJKnRlbXArKyA9IDA7CisKKwkJLyogU2V0IGluZGV4IHRvIHRoZSBudW1iZXIgb2YgYXJncyArIDEgKi8KKwkJaW5kZXggPSBsYXN0ICsgMTsKKworCQlzd2l0Y2goaW5kZXgpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlsZW4gPSBzdHJsZW4oc3RyKTsKKwkJCQlpZiAoc3RybmNtcCgiRGlzYWJsZSIsIHN0ciwgbGVuKSA9PSAwKSAKKwkJCQkJYm9hcmQuc3RhdHVzID0gMDsKKwkJCQllbHNlCisJCQkJaWYgKHN0cm5jbXAoIkVuYWJsZSIsIHN0ciwgbGVuKSA9PSAwKQorCQkJCQlib2FyZC5zdGF0dXMgPSAxOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgc3RhdHVzICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1NUQVRVUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKworCQkJCWZvcihsb29wID0gMDsgbG9vcCA8IEVQQ0FfTlVNX1RZUEVTOyBsb29wKyspCisJCQkJCWlmIChzdHJjbXAoYm9hcmRfZGVzY1tsb29wXSwgc3RyKSA9PSAwKQorCQkJCQkJYnJlYWs7CisKKworCQkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQlJZiB0aGUgaW5kZXggaW5jcmVtZW50ZWQgYWJvdmUgcmVmZXJzIHRvIGEgbGVnaXRhbWF0ZSBib2FyZCAKKwkJCQkJdHlwZSBzZXQgaXQgaGVyZS4gCisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQkJCWlmIChpbmRleCA8IEVQQ0FfTlVNX1RZUEVTKSAKKwkJCQkJYm9hcmQudHlwZSA9IGxvb3A7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCB0eXBlOiAlc1xuIiwgc3RyKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9UWVBFOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCWxlbiA9IHN0cmxlbihzdHIpOworCQkJCWlmIChzdHJuY21wKCJEaXNhYmxlIiwgc3RyLCBsZW4pID09IDApIAorCQkJCQlib2FyZC5hbHRwaW4gPSAwOworCQkJCWVsc2UKKwkJCQlpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCisJCQkJCWJvYXJkLmFsdHBpbiA9IDE7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBhbHRwaW4gJXNcbiIsIHN0cik7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQUxUUElOOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA0OgorCQkJCXQyID0gc3RyOworCQkJCXdoaWxlIChpc2RpZ2l0KCp0MikpCisJCQkJCXQyKys7CisKKwkJCQlpZiAoKnQyKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBwb3J0IGNvdW50ICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX05VTV9QT1JUUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQlUaGVyZSBpcyBub3QgYSBtYW4gcGFnZSBmb3Igc2ltcGxlX3N0cnRvdWwgYnV0IHRoZSBjb2RlIGNhbiBiZSAKKwkJCQkJZm91bmQgaW4gdnNwcmludGYuYy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgc3RyaW5nIHRvIAorCQkJCQl0cmFuc2xhdGUgKFRvIGFuIHVuc2lnbmVkIGxvbmcgb2J2aW91c2x5KSwgIHRoZSBzZWNvbmQgYXJndW1lbnQKKwkJCQkJY2FuIGJlIHRoZSBhZGRyZXNzIG9mIGFueSBjaGFyYWN0ZXIgdmFyaWFibGUgb3IgYSBOVUxMLiAgSWYgYQorCQkJCQl2YXJpYWJsZSBpcyBnaXZlbiwgdGhlIGVuZCBwb2ludGVyIG9mIHRoZSBzdHJpbmcgd2lsbCBiZSBzdG9yZWQgCisJCQkJCWluIHRoYXQgdmFyaWFibGU7IGlmIGEgTlVMTCBpcyBnaXZlbiB0aGUgZW5kIHBvaW50ZXIgd2lsbCAKKwkJCQkJbm90IGJlIHJldHVybmVkLiAgVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIGJhc2UgdG8gdXNlLiAgSWYgCisJCQkJCWEgMCBpcyBpbmRpY2F0ZWQsIHRoZSByb3V0aW5lIHdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIAorCQkJCQlwcm9wZXIgYmFzZSBieSBsb29raW5nIGF0IHRoZSB2YWx1ZXMgcHJlZml4IChBICcwJyBmb3Igb2N0YWwsCisJCQkJCWEgJ3gnIGZvciBoZXgsIGV0YyAuLi4gIElmIGEgdmFsdWUgaXMgZ2l2ZW4gaXQgd2lsbCB1c2UgdGhhdCAKKwkJCQkJdmFsdWUgYXMgdGhlIGJhc2UuIAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisJCQkJYm9hcmQubnVtcG9ydHMgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOworCQkJCW5iZGV2cyArPSBib2FyZC5udW1wb3J0czsKKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNToKKwkJCQl0MiA9IHN0cjsKKwkJCQl3aGlsZSAoaXN4ZGlnaXQoKnQyKSkKKwkJCQkJdDIrKzsKKworCQkJCWlmICgqdDIpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGkvbyBhZGRyZXNzICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX1BPUlRfQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWJvYXJkLnBvcnQgPSAodW5zaWduZWQgY2hhciAqKXNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTYpOworCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA2OgorCQkJCXQyID0gc3RyOworCQkJCXdoaWxlIChpc3hkaWdpdCgqdDIpKQorCQkJCQl0MisrOworCisJCQkJaWYgKCp0MikKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgbWVtb3J5IGJhc2UgJXNcbiIsc3RyKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9NRU1fQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWJvYXJkLm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciAqKXNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTYpOworCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBDL1h4OiBUb28gbWFueSBzdHJpbmcgcGFybXNcbiIpOworCQkJCXJldHVybjsKKwkJfQorCQlzdHIgPSB0ZW1wOworCisJfSAvKiBFbmQgd2hpbGUgdGhlcmUgaXMgYSBzdHJpbmcgYXJnICovCisKKworCWlmIChsYXN0IDwgNikgIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQy9YeDogSW5zdWZmaWNpZW50IHBhcm1zIHNwZWNpZmllZFxuIik7CisJCXJldHVybjsKKwl9CisgCisJLyogSSBzaG91bGQgUkVBTExZIHZhbGlkYXRlIHRoZSBzdHVmZiBoZXJlICovCisKKwkvKiBDb3BpZXMgb3VyIGxvY2FsIGNvcHkgb2YgYm9hcmQgaW50byBib2FyZHMgKi8KKwltZW1jcHkoKHZvaWQgKikmYm9hcmRzW251bV9jYXJkc10sKHZvaWQgKikmYm9hcmQsIHNpemVvZihib2FyZCkpOworCisKKwkvKiBEb2VzIHRoaXMgZ2V0IGNhbGxlZCBvbmNlIHBlciBsaWxvIGFyZyBhcmUgd2hhdCA/ICovCisKKwlwcmludGsoS0VSTl9JTkZPICJQQy9YeDogQWRkZWQgYm9hcmQgJWksICVzICVpIHBvcnRzIGF0IDB4JTQuNFggYmFzZSAweCU2LjZYXG4iLCAKKwkJbnVtX2NhcmRzLCBib2FyZF9kZXNjW2JvYXJkLnR5cGVdLCAKKwkJYm9hcmQubnVtcG9ydHMsIChpbnQpYm9hcmQucG9ydCwgKHVuc2lnbmVkIGludCkgYm9hcmQubWVtYmFzZSk7CisKKwludW1fY2FyZHMrKzsKKworfSAvKiBFbmQgZXBjYV9zZXR1cCAqLworCisKKworI2lmZGVmIEVOQUJMRV9QQ0kKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBpbml0X1BDSSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gZXBpY19ib2FyZF90eXBlcyB7CisJYnJkX3hyID0gMCwKKwlicmRfeGVtLAorCWJyZF9jeCwKKwlicmRfeHJqLAorfTsKKworCisvKiBpbmRleGVkIGRpcmVjdGx5IGJ5IGVwaWNfYm9hcmRfdHlwZXMgZW51bSAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBib2FyZF90eXBlOworCXVuc2lnbmVkIGJhcl9pZHg7CQkvKiBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lvbiAqLworfSBlcGNhX2luZm9fdGJsW10gPSB7CisJeyBQQ0lYUiwgMCwgfSwKKwl7IFBDSVhFTSwgMCwgfSwKKwl7IFBDSUNYLCAwLCB9LAorCXsgUENJWFJKLCAyLCB9LAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlcGNhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGJvYXJkX251bSA9IC0xOworCWludCBib2FyZF9pZHgsIGluZm9faWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRUlPOworCisJYm9hcmRfbnVtKys7CisJYm9hcmRfaWR4ID0gYm9hcmRfbnVtICsgbnVtX2NhcmRzOworCWlmIChib2FyZF9pZHggPj0gTUFYQk9BUkRTKQorCQlnb3RvIGVycl9vdXQ7CisJCisJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgZXBjYV9pbmZvX3RibFtpbmZvX2lkeF0uYmFyX2lkeCk7CisJaWYgKCFhZGRyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJQQ0kgcmVnaW9uICMlZCBub3QgYXZhaWxhYmxlIChzaXplIDApXG4iLAorCQkJZXBjYV9pbmZvX3RibFtpbmZvX2lkeF0uYmFyX2lkeCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlib2FyZHNbYm9hcmRfaWR4XS5zdGF0dXMgPSBFTkFCTEVEOworCWJvYXJkc1tib2FyZF9pZHhdLnR5cGUgPSBlcGNhX2luZm9fdGJsW2luZm9faWR4XS5ib2FyZF90eXBlOworCWJvYXJkc1tib2FyZF9pZHhdLm51bXBvcnRzID0gMHgwOworCWJvYXJkc1tib2FyZF9pZHhdLnBvcnQgPQorCQkodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKSBhZGRyICsgUENJX0lPX09GRlNFVCk7CisJYm9hcmRzW2JvYXJkX2lkeF0ubWVtYmFzZSA9CisJCSh1bnNpZ25lZCBjaGFyICopKChjaGFyICopIGFkZHIpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGFkZHIgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCwgImVwY2EiKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAicmVzb3VyY2UgMHgleCBAIDB4JWx4IHVuYXZhaWxhYmxlXG4iLAorCQkJMHgyMDAwMDAsIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWJvYXJkc1tib2FyZF9pZHhdLnJlX21hcF9wb3J0ID0gaW9yZW1hcChhZGRyICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworCWlmICghYm9hcmRzW2JvYXJkX2lkeF0ucmVfbWFwX3BvcnQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCBtYXAgMHgleCBAIDB4JWx4XG4iLAorCQkJMHgyMDAwMDAsIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcGNpaW87CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGFkZHIsIDB4MjAwMDAwLCAiZXBjYSIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJyZXNvdXJjZSAweCV4IEAgMHglbHggdW5hdmFpbGFibGVcbiIsCisJCQkweDIwMDAwMCwgYWRkcik7CisJCWdvdG8gZXJyX291dF9mcmVlX2lvdW5tYXA7CisJfQorCisJYm9hcmRzW2JvYXJkX2lkeF0ucmVfbWFwX21lbWJhc2UgPSBpb3JlbWFwKGFkZHIsIDB4MjAwMDAwKTsKKwlpZiAoIWJvYXJkc1tib2FyZF9pZHhdLnJlX21hcF9tZW1iYXNlKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgbWFwIDB4JXggQCAweCVseFxuIiwKKwkJCTB4MjAwMDAwLCBhZGRyICsgUENJX0lPX09GRlNFVCk7CisJCWdvdG8gZXJyX291dF9mcmVlX21lbXJlZ2lvbjsKKwl9CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJIGRvbid0IGtub3cgd2hhdCB0aGUgYmVsb3cgZG9lcywgYnV0IHRoZSBoYXJkd2FyZSBndXlzIHNheQorCQlpdHMgcmVxdWlyZWQgb24gZXZlcnl0aGluZyBleGNlcHQgUExYIChJbiB0aGlzIGNhc2UgWFJKKS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKGluZm9faWR4ICE9IGJyZF94cmopIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsIDApOyAgCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQ2LCAwKTsKKwl9CisJCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9tZW1yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uIChhZGRyLCAweDIwMDAwMCk7CitlcnJfb3V0X2ZyZWVfaW91bm1hcDoKKwlpb3VubWFwIChib2FyZHNbYm9hcmRfaWR4XS5yZV9tYXBfcG9ydCk7CitlcnJfb3V0X2ZyZWVfcGNpaW86CisJcmVsZWFzZV9tZW1fcmVnaW9uIChhZGRyICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworZXJyX291dDoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXBjYV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0RJR0ksIFBDSV9ERVZJQ0VfWFIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGJyZF94ciB9LAorCXsgUENJX1ZFTkRPUl9ESUdJLCBQQ0lfREVWSUNFX1hFTSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYnJkX3hlbSB9LAorCXsgUENJX1ZFTkRPUl9ESUdJLCBQQ0lfREVWSUNFX0NYLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBicmRfY3ggfSwKKwl7IFBDSV9WRU5ET1JfRElHSSwgUENJX0RFVklDRV9YUkosIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGJyZF94cmogfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlcGNhX3BjaV90YmwpOworCitpbnQgX19pbml0IGluaXRfUENJICh2b2lkKQoreyAvKiBCZWdpbiBpbml0X1BDSSAqLworCW1lbXNldCAoJmVwY2FfZHJpdmVyLCAwLCBzaXplb2YgKGVwY2FfZHJpdmVyKSk7CisJZXBjYV9kcml2ZXIubmFtZSA9ICJlcGNhIjsKKwllcGNhX2RyaXZlci5pZF90YWJsZSA9IGVwY2FfcGNpX3RibDsKKwllcGNhX2RyaXZlci5wcm9iZSA9IGVwY2FfaW5pdF9vbmU7CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZXBjYV9kcml2ZXIpOworfSAvKiBFbmQgaW5pdF9QQ0kgKi8KKworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuaCBiL2RyaXZlcnMvY2hhci9lcGNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMDVlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhLmgKQEAgLTAsMCArMSwxNjUgQEAKKyNkZWZpbmUgWEVNUE9SVFMgICAgMHhDMDIKKyNkZWZpbmUgWEVQT1JUUyAgICAgMHhDMjIKKworI2RlZmluZSBNQVhfQUxMT0MgICAweDEwMAorCisjZGVmaW5lIE1BWEJPQVJEUyAgIDEyCisjZGVmaW5lIEZFUENPREVTRUcgIDB4MDIwMEwKKyNkZWZpbmUgRkVQQ09ERSAgICAgMHgyMDAwTAorI2RlZmluZSBCSU9TQ09ERSAgICAweGY4MDBMCisKKyNkZWZpbmUgTUlTQ0dMT0JBTCAgMHgwQzAwTAorI2RlZmluZSBOUE9SVCAgICAgICAweDBDMjJMCisjZGVmaW5lIE1CT1ggICAgICAgIDB4MEM0MEwKKyNkZWZpbmUgUE9SVEJBU0UgICAgMHgwQzkwTAorCisvKiBCZWdpbiBjb2RlIGRlZmluZXMgdXNlZCBmb3IgZXBjYV9zZXR1cCAqLworCisjZGVmaW5lIElOVkFMSURfQk9BUkRfVFlQRSAgIDB4MQorI2RlZmluZSBJTlZBTElEX05VTV9QT1JUUyAgICAweDIKKyNkZWZpbmUgSU5WQUxJRF9NRU1fQkFTRSAgICAgMHg0CisjZGVmaW5lIElOVkFMSURfUE9SVF9CQVNFICAgIDB4OAorI2RlZmluZSBJTlZBTElEX0JPQVJEX1NUQVRVUyAweDEwCisjZGVmaW5lIElOVkFMSURfQUxUUElOICAgICAgIDB4MjAKKworLyogRW5kIGNvZGUgZGVmaW5lcyB1c2VkIGZvciBlcGNhX3NldHVwICovCisKKworI2RlZmluZSBGRVBDTFIgICAgICAweDAwCisjZGVmaW5lIEZFUE1FTSAgICAgIDB4MDIKKyNkZWZpbmUgRkVQUlNUICAgICAgMHgwNAorI2RlZmluZSBGRVBJTlQgICAgICAweDA4CisjZGVmaW5lCUZFUE1BU0sgICAgIDB4MGUKKyNkZWZpbmUJRkVQV0lOICAgICAgMHg4MAorCisjZGVmaW5lIFBDWEUgICAgMAorI2RlZmluZSBQQ1hFVkUgIDEKKyNkZWZpbmUgUENYRU0gICAyICAgCisjZGVmaW5lIEVJU0FYRU0gMworI2RlZmluZSBQQzY0WEUgIDQKKyNkZWZpbmUgUENYSSAgICA1CisjZGVmaW5lIFBDSVhFTSAgNworI2RlZmluZSBQQ0lDWCAgIDgKKyNkZWZpbmUgUENJWFIgICA5CisjZGVmaW5lIFBDSVhSSiAgMTAKKyNkZWZpbmUgRVBDQV9OVU1fVFlQRVMgNgorCisKK3N0YXRpYyBjaGFyICpib2FyZF9kZXNjW10gPSAKK3sKKwkiUEMvWGUiLAorCSJQQy9YZXZlIiwKKwkiUEMvWGVtIiwKKwkiRUlTQS9YZW0iLAorCSJQQy82NFhlIiwKKwkiUEMvWGkiLAorCSJ1bmtub3duIiwKKwkiUENJL1hlbSIsCisJIlBDSS9DWCIsCisJIlBDSS9YciIsCisJIlBDSS9YcmoiLAorfTsKKworI2RlZmluZSBTVEFSVEMgICAgICAwMjEKKyNkZWZpbmUgU1RPUEMgICAgICAgMDIzCisjZGVmaW5lIElBSVhPTiAgICAgIDB4MjAwMAorCisKKyNkZWZpbmUgVFhTVE9QUEVEICAweDEKKyNkZWZpbmUgTE9XV0FJVCAgICAweDIKKyNkZWZpbmUgRU1QVFlXQUlUICAweDQKKyNkZWZpbmUgUlhTVE9QUEVEICAweDgKKyNkZWZpbmUgVFhCVVNZICAgICAweDEwCisKKyNkZWZpbmUgRElTQUJMRUQgICAwCisjZGVmaW5lIEVOQUJMRUQgICAgMQorI2RlZmluZSBPRkYgICAgICAgIDAKKyNkZWZpbmUgT04gICAgICAgICAxCisKKyNkZWZpbmUgRkVQVElNRU9VVCAyMDAwMDAgIAorI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwgIDEKKyNkZWZpbmUgU0VSSUFMX1RZUEVfSU5GTyAgICAzCisjZGVmaW5lIEVQQ0FfRVZFTlRfSEFOR1VQICAgMQorI2RlZmluZSBFUENBX01BR0lDICAgICAgICAgIDB4NWM2ZGYxMDRMCisKK3N0cnVjdCBjaGFubmVsIAoreworCWxvbmcgICBtYWdpYzsKKwl1bmNoYXIgYm9hcmRudW07CisJdW5jaGFyIGNoYW5uZWxudW07CisJdW5jaGFyIG9tb2RlbTsgICAgICAgICAvKiBGRVAgb3V0cHV0IG1vZGVtIHN0YXR1cyAgICAgKi8KKwl1bmNoYXIgaW1vZGVtOyAgICAgICAgIC8qIEZFUCBpbnB1dCBtb2RlbSBzdGF0dXMgICAgICAqLworCXVuY2hhciBtb2RlbWZha2U7ICAgICAgLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICovCisJdW5jaGFyIG1vZGVtOyAgICAgICAgICAvKiBGb3JjZSB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgaGZsb3c7CisJdW5jaGFyIGRzcjsKKwl1bmNoYXIgZGNkOworCXVuY2hhciBtX3J0cyA7IAkJLyogVGhlIGJpdHMgdXNlZCBpbiB3aGF0ZXZlciBGRVAgKi8KKwl1bmNoYXIgbV9kY2QgOwkJLyogaXMgaW5kaWdpbm91cyB0byB0aGlzIGJvYXJkIHRvICovCisJdW5jaGFyIG1fZHNyIDsJCS8qIHJlcHJlc2VudCBlYWNoIG9mIHRoZSBwaHlzaWNhbCAqLworCXVuY2hhciBtX2N0cyA7CQkvKiBoYW5kc2hha2UgbGluZXMgKi8KKwl1bmNoYXIgbV9yaSA7CisJdW5jaGFyIG1fZHRyIDsKKwl1bmNoYXIgc3RvcGM7CisJdW5jaGFyIHN0YXJ0YzsKKwl1bmNoYXIgc3RvcGNhOworCXVuY2hhciBzdGFydGNhOworCXVuY2hhciBmZXBzdG9wYzsKKwl1bmNoYXIgZmVwc3RhcnRjOworCXVuY2hhciBmZXBzdG9wY2E7CisJdW5jaGFyIGZlcHN0YXJ0Y2E7CisJdW5jaGFyIHR4d2luOworCXVuY2hhciByeHdpbjsKKwl1c2hvcnQgZmVwaWZsYWc7CisJdXNob3J0IGZlcGNmbGFnOworCXVzaG9ydCBmZXBvZmxhZzsKKwl1c2hvcnQgdHhidWZoZWFkOworCXVzaG9ydCB0eGJ1ZnNpemU7CisJdXNob3J0IHJ4YnVmaGVhZDsKKwl1c2hvcnQgcnhidWZzaXplOworCWludCAgICBjbG9zZV9kZWxheTsKKwlpbnQgICAgY291bnQ7CisJaW50ICAgIGJsb2NrZWRfb3BlbjsKKwl1bG9uZyAgZXZlbnQ7CisJaW50ICAgIGFzeW5jZmxhZ3M7CisJdWludCAgIGRldjsKKwl1bG9uZyAgc3RhdHVzZmxhZ3M7CisJdWxvbmcgIGNfaWZsYWc7CisJdWxvbmcgIGNfY2ZsYWc7CisJdWxvbmcgIGNfbGZsYWc7CisJdWxvbmcgIGNfb2ZsYWc7CisJdW5jaGFyICp0eHB0cjsKKwl1bmNoYXIgKnJ4cHRyOworCXVuY2hhciAqdG1wX2J1ZjsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAgICAgICAgICAgKmJvYXJkOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICAqYnJkY2hhbjsKKwlzdHJ1Y3QgZGlnaV9zdHJ1Y3QgICAgICAgICAgZGlnaWV4dDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAgICAgICAgICAgKnR0eTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICAgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgICBjbG9zZV93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICAgIHRxdWV1ZTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZ2xvYmFsX2RhdGEgKm1haWxib3g7Cit9OworCitzdHJ1Y3QgYm9hcmRfaW5mbwkKK3sKKwl1bmNoYXIgc3RhdHVzOworCXVuY2hhciB0eXBlOworCXVuY2hhciBhbHRwaW47CisJdXNob3J0IG51bXBvcnRzOworCXVuY2hhciAqcG9ydDsKKwl1bmNoYXIgKm1lbWJhc2U7CisJdW5jaGFyIF9faW9tZW0gKnJlX21hcF9wb3J0OworCXVuY2hhciAqcmVfbWFwX21lbWJhc2U7CisJdWxvbmcgIG1lbW9yeV9zZWc7CisJdm9pZCAoICogbWVtd2lub24gKQkoc3RydWN0IGJvYXJkX2luZm8gKiwgdW5zaWduZWQgaW50KSA7CisJdm9pZCAoICogbWVtd2lub2ZmICkgCShzdHJ1Y3QgYm9hcmRfaW5mbyAqLCB1bnNpZ25lZCBpbnQpIDsKKwl2b2lkICggKiBnbG9iYWx3aW5vbiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdm9pZCAoICogdHh3aW5vbiApIAkoc3RydWN0IGNoYW5uZWwgKikgOworCXZvaWQgKCAqIHJ4d2lub24gKQkoc3RydWN0IGNoYW5uZWwgKikgOworCXZvaWQgKCAqIG1lbW9mZiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdm9pZCAoICogYXNzZXJ0Z3dpbm9uICkJKHN0cnVjdCBjaGFubmVsICopIDsKKwl2b2lkICggKiBhc3NlcnRtZW1vZmYgKQkoc3RydWN0IGNoYW5uZWwgKikgOworCXVuY2hhciBwb2xsZXJfaW5oaWJpdGVkIDsKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhY29uZmlnLmggYi9kcml2ZXJzL2NoYXIvZXBjYWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZGVjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZXBjYWNvbmZpZy5oCkBAIC0wLDAgKzEsNyBAQAorI2RlZmluZSBOVU1DQVJEUyAwCisjZGVmaW5lIE5CREVWUyAwCisKK3N0cnVjdCBib2FyZF9pbmZvIHN0YXRpY19ib2FyZHNbTlVNQ0FSRFNdPXsKK307CisKKy8qIERPIE5PVCBIQU5EIEVESVQgVEhJUyBGSUxFISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VzcC5jIGIvZHJpdmVycy9jaGFyL2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTNkMmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC0wLDAgKzEsMjYzMCBAQAorLyoKKyAqICBlc3AuYyAtIGRyaXZlciBmb3IgSGF5ZXMgRVNQIHNlcmlhbCBjYXJkcworICoKKyAqICAtLS0gTm90aWNlcyBmcm9tIHNlcmlhbC5jLCB1cG9uIHdoaWNoIHRoaXMgZHJpdmVyIGlzIGJhc2VkIC0tLQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEV4dGVuc2l2ZWx5IHJld3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCA4LzE2LzkyIC0tIDkvMTQvOTIuICBOb3cKKyAqICBtdWNoIG1vcmUgZXh0ZW5zaWJsZSB0byBzdXBwb3J0IG90aGVyIHNlcmlhbCBjYXJkcyBiYXNlZCBvbiB0aGUKKyAqICAxNjQ1MC8xNjU1MEEgVUFSVCdzLiAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIEFTVCBGb3VyUG9ydCBhbmQgdGhlCisgKiAgQWNjZW50IEFzeW5jIGJvYXJkLiAgCisgKgorICogIHNldF9zZXJpYWxfaW5mbyBmaXhlZCB0byBzZXQgdGhlIGZsYWdzLCBjdXN0b20gZGl2aXNvciwgYW5kIHVhcnQKKyAqIAl0eXBlIGZpZWxkcy4gIEZpeCBzdWdnZXN0ZWQgYnkgTWljaGFlbCBLLiBKb2huc29uIDEyLzEyLzkyLgorICoKKyAqICAxMS85NTogVElPQ01JV0FJVCwgVElPQ0dJQ09VTlQgYnkgQW5nZWxvIEhhcml0c2lzIDxhaEBkb2MuaWMuYWMudWs+CisgKgorICogIDAzLzk2OiBNb2R1bGFyaXNlZCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KKyAqCisgKiAgcnNfc2V0X3Rlcm1pb3MgZml4ZWQgdG8gbG9vayBhbHNvIGZvciBjaGFuZ2VzIG9mIHRoZSBpbnB1dAorICogICAgICBmbGFncyBJTlBDSywgQlJLSU5ULCBQQVJNUkssIElHTlBBUiBhbmQgSUdOQlJLLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlcm5kIEFuaO+/vXBsIDA1LzE3Lzk2LgorICoKKyAqIC0tLSBFbmQgb2Ygbm90aWNlcyBmcm9tIHNlcmlhbC5jIC0tLQorICoKKyAqIFN1cHBvcnQgZm9yIHRoZSBFU1Agc2VyaWFsIGNhcmQgYnkgQW5kcmV3IEouIFJvYmluc29uCisgKiAgICAgPGFyb2JpbnNvQG55eC5uZXQ+IChDYXJkIGRldGVjdGlvbiByb3V0aW5lIHRha2VuIGZyb20gYSBwYXRjaAorICogICAgIGJ5IERlbm5pcyBKLiBCb3lsYW4pLiAgUGF0Y2hlcyB0byBhbGxvdyB1c2Ugd2l0aCAyLjEueCBjb250cmlidXRlZAorICogICAgIGJ5IENocmlzIEZheWxvci4KKyAqCisgKiBNb3N0IHJlY2VudCBjaGFuZ2VzOiAoQW5kcmV3IEouIFJvYmluc29uKQorICogICBTdXBwb3J0IGZvciBQSU8gbW9kZS4gIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gd29yayBwcm9wZXJseSB3aXRoCisgKiAgICAgbXVsdGlwb3J0IGNhcmRzLgorICoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtCisgKiBzZXZlcmFsIGNsZWFudXBzLCB1c2UgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQsIGV0YworICoKKyAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgdGhlIGZvbGxvd2luZyByczIzMiBpbyBmdW5jdGlvbnM6CisgKgorICoJaW50IGVzcHNlcmlhbF9pbml0KHZvaWQpOworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxQLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hheWVzZXNwLmg+CisKKyNkZWZpbmUgTlJfUE9SVFMgNjQJLyogbWF4aW11bSBudW1iZXIgb2YgcG9ydHMgKi8KKyNkZWZpbmUgTlJfUFJJTUFSWSA4CS8qIG1heGltdW0gbnVtYmVyIG9mIHByaW1hcnkgcG9ydHMgKi8KKyNkZWZpbmUgUkVHSU9OX1NJWkUgOCAgIC8qIHNpemUgb2YgaW8gcmVnaW9uIHRvIHJlcXVlc3QgKi8KKworLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgY2FuIGJlIHNldCBieSBnaXZpbmcgbW9kdWxlIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgaXJxW05SX1BSSU1BUlldOwkvKiBJUlEgZm9yIGVhY2ggYmFzZSBwb3J0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRpdmlzb3JbTlJfUFJJTUFSWV07IC8qIGN1c3RvbSBkaXZpc29yIGZvciBlYWNoIHBvcnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG1hID0gRVNQX0RNQV9DSEFOTkVMOyAvKiBETUEgY2hhbm5lbCAqLworc3RhdGljIHVuc2lnbmVkIGludCByeF90cmlnZ2VyID0gRVNQX1JYX1RSSUdHRVI7CitzdGF0aWMgdW5zaWduZWQgaW50IHR4X3RyaWdnZXIgPSBFU1BfVFhfVFJJR0dFUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmxvd19vZmYgPSBFU1BfRkxPV19PRkY7CitzdGF0aWMgdW5zaWduZWQgaW50IGZsb3dfb24gPSBFU1BfRkxPV19PTjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfdGltZW91dCA9IEVTUF9SWF9UTU9VVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGlvX3RocmVzaG9sZCA9IEVTUF9QSU9fVEhSRVNIT0xEOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZGl2aXNvciwgdWludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF90cmlnZ2VyLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eF90cmlnZ2VyLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShmbG93X29mZiwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oZmxvd19vbiwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfdGltZW91dCwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0ocGlvX3RocmVzaG9sZCwgdWludCwgMCk7CisKKy8qIEVORCAqLworCitzdGF0aWMgY2hhciAqZG1hX2J1ZmZlcjsKK3N0YXRpYyBpbnQgZG1hX2J5dGVzOworc3RhdGljIHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqZnJlZV9waW9fYnVmOworCisjZGVmaW5lIERNQV9CVUZGRVJfU1ogMTAyNAorCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAxMDI0CisKK3N0YXRpYyBjaGFyIHNlcmlhbF9uYW1lW10gX19pbml0ZGF0YSA9ICJFU1Agc2VyaWFsIGRyaXZlciI7CitzdGF0aWMgY2hhciBzZXJpYWxfdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiMi4yIjsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICplc3BfZHJpdmVyOworCisvKiBzZXJpYWwgc3VidHlwZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwJMQorCisvKgorICogU2VyaWFsIGRyaXZlciBjb25maWd1cmF0aW9uIHNlY3Rpb24uICBIZXJlIGFyZSB0aGUgdmFyaW91cyBvcHRpb25zOgorICoKKyAqIFNFUklBTF9QQVJBTk9JQV9DSEVDSworICogCQlDaGVjayB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGUgZXNwX3N0cnVjdHVyZSB3aGVyZQorICogCQlldmVyIHBvc3NpYmxlLgorICovCisKKyN1bmRlZiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyNkZWZpbmUgU0VSSUFMX0RPX1JFU1RBUlQKKworI3VuZGVmIFNFUklBTF9ERUJVR19JTlRSCisjdW5kZWYgU0VSSUFMX0RFQlVHX09QRU4KKyN1bmRlZiBTRVJJQUxfREVCVUdfRkxPVworCisjaWYgZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoU0VSSUFMX0RFQlVHX01DT1VOVCkKKyNkZWZpbmUgREJHX0NOVChzKSBwcmludGsoIiglcyk6IFsleF0gcmVmYz0lZCwgc2VyYz0lZCwgdHR5Yz0lZCAtPiAlc1xuIiwgXAorIHR0eS0+bmFtZSwgKGluZm8tPmZsYWdzKSwgc2VyaWFsX2RyaXZlci5yZWZjb3VudCxpbmZvLT5jb3VudCx0dHktPmNvdW50LHMpCisjZWxzZQorI2RlZmluZSBEQkdfQ05UKHMpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBlc3Bfc3RydWN0ICpwb3J0czsKKworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIHJzX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBpbnQpOworCisvKgorICogVGhlIEVTUCBjYXJkIGhhcyBhIGNsb2NrIHJhdGUgb2YgMTQuNzQ1NiBNSHogKHRoYXQgaXMsIDIqKkVTUENfU0NBTEUKKyAqIHRpbWVzIHRoZSBub3JtYWwgMS44NDMyIE1oeiBjbG9jayBvZiBtb3N0IHNlcmlhbCBib2FyZHMpLgorICovCisjZGVmaW5lIEJBU0VfQkFVRCAoKDE4NDMyMDAgLyAxNikgKiAoMSA8PCBFU1BDX1NDQUxFKSkKKworLyogU3RhbmRhcmQgQ09NIGZsYWdzIChleGNlcHQgZm9yIENPTTQsIGJlY2F1c2Ugb2YgdGhlIDg1MTQgcHJvYmxlbSkgKi8KKyNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCkKKworLyoKKyAqIHRtcF9idWYgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgYnkgc2VyaWFsX3dyaXRlLiAgV2UgbmVlZCB0bworICogbG9jayBpdCBpbiBjYXNlIHRoZSBtZW1jcHlfZnJvbWZzIGJsb2NrcyB3aGlsZSBzd2FwcGluZyBpbiBhIHBhZ2UsCisgKiBhbmQgc29tZSBvdGhlciBwcm9ncmFtIHRyaWVzIHRvIGRvIGEgc2VyaWFsIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuCisgKiBTaW5jZSB0aGUgbG9jayB3aWxsIG9ubHkgY29tZSB1bmRlciBjb250ZW50aW9uIHdoZW4gdGhlIHN5c3RlbSBpcworICogc3dhcHBpbmcgYW5kIGF2YWlsYWJsZSBtZW1vcnkgaXMgbG93LCBpdCBtYWtlcyBzZW5zZSB0byBzaGFyZSBvbmUKKyAqIGJ1ZmZlciBhY3Jvc3MgYWxsIHRoZSBzZXJpYWwgcG9ydHMsIHNpbmNlIGl0IHNpZ25pZmljYW50bHkgc2F2ZXMKKyAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKwlzdGF0aWMgY29uc3QgY2hhciBiYWRtYWdpY1tdID0gS0VSTl9XQVJOSU5HCisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgYmFkaW5mb1tdID0gS0VSTl9XQVJOSU5HCisJCSJXYXJuaW5nOiBudWxsIGVzcF9zdHJ1Y3QgZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IEVTUF9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2VyaWFsX2luKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBpbmIoaW5mby0+cG9ydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXJpYWxfb3V0KHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgb2Zmc2V0LAorCQkJICAgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlvdXRiKHZhbHVlLCBpbmZvLT5wb3J0K29mZnNldCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX3N0b3AoKSBhbmQgcnNfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zdG9wIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3N0YXJ0IikpCisJCXJldHVybjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIZXJlIHN0YXJ0cyB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzLiAgQWxsIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHN1YnJvdXRpbmVzIGFyZSBkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGFyZSBmb2xkZWQgaW50bworICogcnNfaW50ZXJydXB0KCkuICBUaGV5IHdlcmUgc2VwYXJhdGVkIG91dCBmb3IgcmVhZGFiaWxpdHkncyBzYWtlLgorICoKKyAqIE5vdGU6IHJzX2ludGVycnVwdCgpIGlzIGEgImZhc3QiIGludGVycnVwdCwgd2hpY2ggbWVhbnMgdGhhdCBpdAorICogcnVucyB3aXRoIGludGVycnVwdHMgdHVybmVkIG9mZi4gIFBlb3BsZSB3aG8gbWF5IHdhbnQgdG8gbW9kaWZ5CisgKiByc19pbnRlcnJ1cHQoKSBzaG91bGQgdHJ5IHRvIGtlZXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGFzIGZhc3QgYXMKKyAqIHBvc3NpYmxlLiAgQWZ0ZXIgeW91IGFyZSBkb25lIG1ha2luZyBtb2RpZmljYXRpb25zLCBpdCBpcyBub3QgYSBiYWQKKyAqIGlkZWEgdG8gZG86CisgKiAKKyAqIGdjYyAtUyAtREtFUk5FTCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciBzZXJpYWwuYworICoKKyAqIGFuZCBsb29rIGF0IHRoZSByZXN1bHRpbmcgYXNzZW1ibGUgY29kZSBpbiBzZXJpYWwucy4KKyAqCisgKiAJCQkJLSBUZWQgVHMnbyAodHl0c29AbWl0LmVkdSksIDctTWFyLTkzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc2NoZWR1bGUKKyAqIHByb2Nlc3NpbmcgaW4gdGhlIHNvZnR3YXJlIGludGVycnVwdCBwb3J0aW9uIG9mIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByc19zY2hlZF9ldmVudChzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkgIGludCBldmVudCkKK3sKKwlpbmZvLT5ldmVudCB8PSAxIDw8IGV2ZW50OworCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGlvX2xvY2spOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqZ2V0X3Bpb19idWZmZXIodm9pZCkKK3sKKwlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpb19sb2NrLCBmbGFncyk7CisJaWYgKGZyZWVfcGlvX2J1ZikgeworCQlidWYgPSBmcmVlX3Bpb19idWY7CisJCWZyZWVfcGlvX2J1ZiA9IGJ1Zi0+bmV4dDsKKwl9IGVsc2UgeworCQlidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX3Bpb19idWZmZXIpLCBHRlBfQVRPTUlDKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlvX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9waW9fYnVmZmVyKHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpb19sb2NrLCBmbGFncyk7CisJYnVmLT5uZXh0ID0gZnJlZV9waW9fYnVmOworCWZyZWVfcGlvX2J1ZiA9IGJ1ZjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjZWl2ZV9jaGFyc19waW8oc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBudW1fYnl0ZXMpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpbnQgaTsKKwlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKnBpb19idWY7CisJc3RydWN0IGVzcF9waW9fYnVmZmVyICplcnJfYnVmOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzX21hc2s7CisKKwlwaW9fYnVmID0gZ2V0X3Bpb19idWZmZXIoKTsKKworCWlmICghcGlvX2J1ZikKKwkJcmV0dXJuOworCisJZXJyX2J1ZiA9IGdldF9waW9fYnVmZmVyKCk7CisKKwlpZiAoIWVycl9idWYpIHsKKwkJcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzX21hc2sgPSAoaW5mby0+cmVhZF9zdGF0dXNfbWFzayA+PiAyKSAmIDB4MDc7CisJCQorCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXMgLSAxOyBpICs9IDIpIHsKKwkJKigodW5zaWduZWQgc2hvcnQgKikocGlvX2J1Zi0+ZGF0YSArIGkpKSA9CisJCQlpbncoaW5mby0+cG9ydCArIFVBUlRfRVNJX1JYKTsKKwkJZXJyX2J1Zi0+ZGF0YVtpXSA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9SV1MpOworCQllcnJfYnVmLT5kYXRhW2kgKyAxXSA9IChlcnJfYnVmLT5kYXRhW2ldID4+IDMpICYgc3RhdHVzX21hc2s7CisJCWVycl9idWYtPmRhdGFbaV0gJj0gc3RhdHVzX21hc2s7CisJfQorCisJaWYgKG51bV9ieXRlcyAmIDB4MDAwMSkgeworCQlwaW9fYnVmLT5kYXRhW251bV9ieXRlcyAtIDFdID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JYKTsKKwkJZXJyX2J1Zi0+ZGF0YVtudW1fYnl0ZXMgLSAxXSA9CisJCQkoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JXUykgPj4gMykgJiBzdGF0dXNfbWFzazsKKwl9CisKKwkvKiBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBzdGlsbCBvayBzaW5jZSBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCAqLworCXR0eSA9IGluZm8tPnR0eTsKKworCWlmICghdHR5KSB7CisJCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKKwkJcmVsZWFzZV9waW9fYnVmZmVyKGVycl9idWYpOworCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzX21hc2sgPSAoaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID4+IDIpICYgMHgwNzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXM7IGkrKykgeworCQlpZiAoIShlcnJfYnVmLT5kYXRhW2ldICYgc3RhdHVzX21hc2spKSB7CisJCQkqKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKykgPSBwaW9fYnVmLT5kYXRhW2ldOworCisJCQlpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDQpIHsKKwkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSBUVFlfQlJFQUs7CisKKwkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCWRvX1NBSyh0dHkpOworCQkJfQorCQkJZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDIpCisJCQkJKih0dHktPmZsaXAuZmxhZ19idWZfcHRyKyspID0gVFRZX0ZSQU1FOworCQkJZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDEpCisJCQkJKih0dHktPmZsaXAuZmxhZ19idWZfcHRyKyspID0gVFRZX1BBUklUWTsKKwkJCWVsc2UKKwkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSAwOworCQkKKwkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQl9CisJfQorCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisKKwlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOworCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKKwlyZWxlYXNlX3Bpb19idWZmZXIoZXJyX2J1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzX2RtYShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG51bV9ieXRlcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX1JYX1RJTUVPVVQ7CisJZG1hX2J5dGVzID0gbnVtX2J5dGVzOworCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfRE1BX1JYOworCQorCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisgICAgICAgIGRpc2FibGVfZG1hKGRtYSk7CisgICAgICAgIGNsZWFyX2RtYV9mZihkbWEpOworICAgICAgICBzZXRfZG1hX21vZGUoZG1hLCBETUFfTU9ERV9SRUFEKTsKKyAgICAgICAgc2V0X2RtYV9hZGRyKGRtYSwgaXNhX3ZpcnRfdG9fYnVzKGRtYV9idWZmZXIpKTsKKyAgICAgICAgc2V0X2RtYV9jb3VudChkbWEsIGRtYV9ieXRlcyk7CisgICAgICAgIGVuYWJsZV9kbWEoZG1hKTsKKyAgICAgICAgcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisgICAgICAgIAorICAgICAgICBzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TVEFSVF9ETUFfUlgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjZWl2ZV9jaGFyc19kbWFfZG9uZShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkJICAgIGludCBzdGF0dXMpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpbnQgbnVtX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShkbWEpOworCWNsZWFyX2RtYV9mZihkbWEpOworCisJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfRE1BX1JYOworCW51bV9ieXRlcyA9IGRtYV9ieXRlcyAtIGdldF9kbWFfcmVzaWR1ZShkbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQorCWluZm8tPmljb3VudC5yeCArPSBudW1fYnl0ZXM7CisKKwltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgZG1hX2J1ZmZlciwgbnVtX2J5dGVzKTsKKwl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IG51bV9ieXRlczsKKwl0dHktPmZsaXAuY291bnQgKz0gbnVtX2J5dGVzOworCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBudW1fYnl0ZXMpOworCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gbnVtX2J5dGVzOworCisJaWYgKG51bV9ieXRlcyA+IDApIHsKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ci0tOworCisJCXN0YXR1cyAmPSAoMHgxYyAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2spOworCisJCWlmIChzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spIHsKKwkJCXR0eS0+ZmxpcC5jb3VudC0tOworCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ci0tOworCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ci0tOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MTApIHsKKwkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJKGluZm8tPmljb3VudC5icmspKys7CisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJZG9fU0FLKHR0eSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwOCkgeworCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkoaW5mby0+aWNvdW50LmZyYW1lKSsrOworCQl9CisJCWVsc2UgaWYgKHN0YXR1cyAmIDB4MDQpIHsKKwkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCShpbmZvLT5pY291bnQucGFyaXR5KSsrOworCQl9CisKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJfQorCisJaWYgKGRtYV9ieXRlcyAhPSBudW1fYnl0ZXMpIHsKKwkJbnVtX2J5dGVzID0gZG1hX2J5dGVzIC0gbnVtX2J5dGVzOworCQlkbWFfYnl0ZXMgPSAwOworCQlyZWNlaXZlX2NoYXJzX2RtYShpbmZvLCBudW1fYnl0ZXMpOworCX0gZWxzZQorCQlkbWFfYnl0ZXMgPSAwOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGluZm8tPmxvY2sgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zbWl0X2NoYXJzX3BpbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkJaW50IHNwYWNlX2F2YWlsKQoreworCWludCBpOworCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKKworCXBpb19idWYgPSBnZXRfcGlvX2J1ZmZlcigpOworCisJaWYgKCFwaW9fYnVmKQorCQlyZXR1cm47CisKKwl3aGlsZSAoc3BhY2VfYXZhaWwgJiYgaW5mby0+eG1pdF9jbnQpIHsKKwkJaWYgKGluZm8tPnhtaXRfdGFpbCArIHNwYWNlX2F2YWlsIDw9IEVTUF9YTUlUX1NJWkUpIHsKKwkJCW1lbWNweShwaW9fYnVmLT5kYXRhLAorCQkJICAgICAgICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksCisJCQkgICAgICAgc3BhY2VfYXZhaWwpOworCQl9IGVsc2UgeworCQkJaSA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWw7CisJCQltZW1jcHkocGlvX2J1Zi0+ZGF0YSwKKwkJCSAgICAgICAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLCBpKTsKKwkJCW1lbWNweSgmKHBpb19idWYtPmRhdGFbaV0pLCBpbmZvLT54bWl0X2J1ZiwKKwkJCSAgICAgICBzcGFjZV9hdmFpbCAtIGkpOworCQl9CisKKwkJaW5mby0+eG1pdF9jbnQgLT0gc3BhY2VfYXZhaWw7CisJCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBzcGFjZV9hdmFpbCkgJgorCQkJKEVTUF9YTUlUX1NJWkUgLSAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc3BhY2VfYXZhaWwgLSAxOyBpICs9IDIpIHsKKwkJCW91dHcoKigodW5zaWduZWQgc2hvcnQgKikocGlvX2J1Zi0+ZGF0YSArIGkpKSwKKwkJCSAgICAgaW5mby0+cG9ydCArIFVBUlRfRVNJX1RYKTsKKwkJfQorCisJCWlmIChzcGFjZV9hdmFpbCAmIDB4MDAwMSkKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfVFgsCisJCQkJICAgcGlvX2J1Zi0+ZGF0YVtzcGFjZV9hdmFpbCAtIDFdKTsKKworCQlpZiAoaW5mby0+eG1pdF9jbnQpIHsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKKwkJCXNwYWNlX2F2YWlsID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OworCQkJc3BhY2VfYXZhaWwgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCQkJaWYgKHNwYWNlX2F2YWlsID4gaW5mby0+eG1pdF9jbnQpCisJCQkJc3BhY2VfYXZhaWwgPSBpbmZvLT54bWl0X2NudDsKKwkJfQorCX0KKworCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQlyc19zY2hlZF9ldmVudChpbmZvLCBFU1BfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJCXByaW50aygiVEhSRS4uLiIpOworI2VuZGlmCisKKwkJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKKwkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwKKwkJCQkgICBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkJfQorCX0KKworCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBpbmZvLT5sb2NrICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNtaXRfY2hhcnNfZG1hKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgbnVtX2J5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZG1hX2J5dGVzID0gbnVtX2J5dGVzOworCisJaWYgKGluZm8tPnhtaXRfdGFpbCArIGRtYV9ieXRlcyA8PSBFU1BfWE1JVF9TSVpFKSB7CisJCW1lbWNweShkbWFfYnVmZmVyLCAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLAorCQkgICAgICAgZG1hX2J5dGVzKTsKKwl9IGVsc2UgeworCQlpbnQgaSA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWw7CisJCW1lbWNweShkbWFfYnVmZmVyLCAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLAorCQkJaSk7CisJCW1lbWNweSgmKGRtYV9idWZmZXJbaV0pLCBpbmZvLT54bWl0X2J1ZiwgZG1hX2J5dGVzIC0gaSk7CisJfQorCisJaW5mby0+eG1pdF9jbnQgLT0gZG1hX2J5dGVzOworCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBkbWFfYnl0ZXMpICYgKEVTUF9YTUlUX1NJWkUgLSAxKTsKKworCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQlyc19zY2hlZF9ldmVudChpbmZvLCBFU1BfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJCXByaW50aygiVEhSRS4uLiIpOworI2VuZGlmCisKKwkJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKKwkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJCX0KKwl9CisKKwlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX0RNQV9UWDsKKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworICAgICAgICBkaXNhYmxlX2RtYShkbWEpOworICAgICAgICBjbGVhcl9kbWFfZmYoZG1hKTsKKyAgICAgICAgc2V0X2RtYV9tb2RlKGRtYSwgRE1BX01PREVfV1JJVEUpOworICAgICAgICBzZXRfZG1hX2FkZHIoZG1hLCBpc2FfdmlydF90b19idXMoZG1hX2J1ZmZlcikpOworICAgICAgICBzZXRfZG1hX2NvdW50KGRtYSwgZG1hX2J5dGVzKTsKKyAgICAgICAgZW5hYmxlX2RtYShkbWEpOworICAgICAgICByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKyAgICAgICAgCisgICAgICAgIHNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9UWCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc21pdF9jaGFyc19kbWFfZG9uZShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgbnVtX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisKKwludW1fYnl0ZXMgPSBkbWFfYnl0ZXMgLSBnZXRfZG1hX3Jlc2lkdWUoZG1hKTsKKwlpbmZvLT5pY291bnQudHggKz0gZG1hX2J5dGVzOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJaWYgKGRtYV9ieXRlcyAhPSBudW1fYnl0ZXMpIHsKKwkJZG1hX2J5dGVzIC09IG51bV9ieXRlczsKKwkJbWVtbW92ZShkbWFfYnVmZmVyLCBkbWFfYnVmZmVyICsgbnVtX2J5dGVzLCBkbWFfYnl0ZXMpOworCQkKKwkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKyAgICAgICAgCWRpc2FibGVfZG1hKGRtYSk7CisgICAgICAgIAljbGVhcl9kbWFfZmYoZG1hKTsKKyAgICAgICAgCXNldF9kbWFfbW9kZShkbWEsIERNQV9NT0RFX1dSSVRFKTsKKyAgICAgICAgCXNldF9kbWFfYWRkcihkbWEsIGlzYV92aXJ0X3RvX2J1cyhkbWFfYnVmZmVyKSk7CisgICAgICAgIAlzZXRfZG1hX2NvdW50KGRtYSwgZG1hX2J5dGVzKTsKKyAgICAgICAgCWVuYWJsZV9kbWEoZG1hKTsKKyAgICAgICAgCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworICAgICAgICAJCisgICAgICAgIAlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TVEFSVF9ETUFfVFgpOworCX0gZWxzZSB7CisJCWRtYV9ieXRlcyA9IDA7CisJCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX0RNQV9UWDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pCit7CisJaW50CXN0YXR1czsKKwkKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKKwlzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSkgeworCQkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKKwkJCWluZm8tPmljb3VudC5ybmcrKzsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCisJCQlpbmZvLT5pY291bnQuZHNyKys7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQkJaW5mby0+aWNvdW50LmRjZCsrOworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKKwkJCWluZm8tPmljb3VudC5jdHMrKzsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJfQorCisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKKyNpZiAoZGVmaW5lZChTRVJJQUxfREVCVUdfT1BFTikgfHwgZGVmaW5lZChTRVJJQUxfREVCVUdfSU5UUikpCisJCXByaW50aygidHR5cyVkIENEIG5vdyAlcy4uLiIsIGluZm8tPmxpbmUsCisJCSAgICAgICAoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/ICJvbiIgOiAib2ZmIik7CisjZW5kaWYJCQorCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQllbHNlIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCQkJcHJpbnRrKCJzY2hlZHVsaW5nIGhhbmd1cC4uLiIpOworI2VuZGlmCisJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWVfaGFuZ3VwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHNlcmlhbCBkcml2ZXIncyBpbnRlcnJ1cHQgcm91dGluZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcnNfaW50ZXJydXB0X3NpbmdsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbzsKKwl1bnNpZ25lZCBlcnJfc3RhdHVzOworCXVuc2lnbmVkIGludCBzY3JhdGNoOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwlwcmludGsoInJzX2ludGVycnVwdF9zaW5nbGUoJWQpLi4uIiwgaXJxKTsKKyNlbmRpZgorCWluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKilkZXZfaWQ7CisJZXJyX3N0YXR1cyA9IDA7CisJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TSUQpOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwkKKwlpZiAoIWluZm8tPnR0eSkgeworCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoc2NyYXRjaCAmIDB4MDQpIHsgLyogZXJyb3IgKi8KKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX0VSUl9TVEFUKTsKKwkJZXJyX3N0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7CisJCXNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7CisKKwkJaWYgKGVycl9zdGF0dXMgJiAweDAxKQorCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9SWF9USU1FT1VUOworCisJCWlmIChlcnJfc3RhdHVzICYgMHgyMCkgLyogVUFSVCBzdGF0dXMgKi8KKwkJCWNoZWNrX21vZGVtX3N0YXR1cyhpbmZvKTsKKworCQlpZiAoZXJyX3N0YXR1cyAmIDB4ODApIC8qIFN0YXJ0IGJyZWFrICovCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmJyZWFrX3dhaXQpOworCX0KKwkJCisJaWYgKChzY3JhdGNoICYgMHg4OCkgfHwgLyogRE1BIGNvbXBsZXRlZCBvciB0aW1lZCBvdXQgKi8KKwkgICAgKGVycl9zdGF0dXMgJiAweDFjKSAvKiByZWNlaXZlIGVycm9yICovKSB7CisJCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfRE1BX1JYKQorCQkJcmVjZWl2ZV9jaGFyc19kbWFfZG9uZShpbmZvLCBlcnJfc3RhdHVzKTsKKwkJZWxzZSBpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX0RNQV9UWCkKKwkJCXRyYW5zbWl0X2NoYXJzX2RtYV9kb25lKGluZm8pOworCX0KKworCWlmICghKGluZm8tPnN0YXRfZmxhZ3MgJiAoRVNQX1NUQVRfRE1BX1JYIHwgRVNQX1NUQVRfRE1BX1RYKSkgJiYKKwkgICAgKChzY3JhdGNoICYgMHgwMSkgfHwgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9SWF9USU1FT1VUKSkgJiYKKwkgICAgKGluZm8tPklFUiAmIFVBUlRfSUVSX1JESSkpIHsKKwkJaW50IG51bV9ieXRlczsKKworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1JYX0FWQUlMKTsKKwkJbnVtX2J5dGVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OworCQludW1fYnl0ZXMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCQlpZiAobnVtX2J5dGVzID4gKFRUWV9GTElQQlVGX1NJWkUgLSBpbmZvLT50dHktPmZsaXAuY291bnQpKQorCQkgIG51bV9ieXRlcyA9IFRUWV9GTElQQlVGX1NJWkUgLSBpbmZvLT50dHktPmZsaXAuY291bnQ7CisKKwkJaWYgKG51bV9ieXRlcykgeworCQkJaWYgKGRtYV9ieXRlcyB8fAorCQkJICAgIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgfHwKKwkJCSAgICAobnVtX2J5dGVzIDw9IGluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkKSkKKwkJCQlyZWNlaXZlX2NoYXJzX3BpbyhpbmZvLCBudW1fYnl0ZXMpOworCQkJZWxzZQorCQkJCXJlY2VpdmVfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7CisJCX0KKwl9CisJCisJaWYgKCEoaW5mby0+c3RhdF9mbGFncyAmIChFU1BfU1RBVF9ETUFfUlggfCBFU1BfU1RBVF9ETUFfVFgpKSAmJgorCSAgICAoc2NyYXRjaCAmIDB4MDIpICYmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpZiAoKGluZm8tPnhtaXRfY250IDw9IDApIHx8IGluZm8tPnR0eS0+c3RvcHBlZCkgeworCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkJfSBlbHNlIHsKKwkJCWludCBudW1fYnl0ZXM7CisKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKKwkJCW51bV9ieXRlcyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgPDwgODsKKwkJCW51bV9ieXRlcyB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJCQlpZiAobnVtX2J5dGVzID4gaW5mby0+eG1pdF9jbnQpCisJCQkJbnVtX2J5dGVzID0gaW5mby0+eG1pdF9jbnQ7CisKKwkJCWlmIChudW1fYnl0ZXMpIHsKKwkJCQlpZiAoZG1hX2J5dGVzIHx8CisJCQkJICAgIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgfHwKKwkJCQkgICAgKG51bV9ieXRlcyA8PSBpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCkpCisJCQkJCXRyYW5zbWl0X2NoYXJzX3BpbyhpbmZvLCBudW1fYnl0ZXMpOworCQkJCWVsc2UKKwkJCQkJdHJhbnNtaXRfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7CisJCQl9CisJCX0KKwl9CisKKwlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygiZW5kLlxuIik7CisjZW5kaWYKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGVyZSBlbmRzIHRoZSBzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmVzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QJKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwkKKwl0dHkgPSBpbmZvLT50dHk7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRVNQX0VWRU5UX1dSSVRFX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBzY2hlZHVsZXIgdHF1ZXVlIHdoZW4gdGhlIGludGVycnVwdAorICogcm91dGluZSBoYXMgc2lnbmFsbGVkIHRoYXQgYSBoYW5ndXAgaGFzIG9jY3VycmVkLiAgVGhlIHBhdGggb2YKKyAqIGhhbmd1cCBwcm9jZXNzaW5nIGlzOgorICoKKyAqIAlzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmUgLT4gKHNjaGVkdWxlciB0cXVldWUpIC0+CisgKiAJZG9fc2VyaWFsX2hhbmd1cCgpIC0+IHR0eS0+aGFuZ3VwKCkgLT4gZXNwX2hhbmd1cCgpCisgKiAKKyAqLworc3RhdGljIHZvaWQgZG9fc2VyaWFsX2hhbmd1cCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCQorCXR0eSA9IGluZm8tPnR0eTsKKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvdyBsZXZlbCB1dGlsaXR5IHN1YnJvdXRpbmVzIGZvciB0aGUgc2VyaWFsIGRyaXZlcjogIHJvdXRpbmVzIHRvCisgKiBmaWd1cmUgb3V0IHRoZSBhcHByb3ByaWF0ZSB0aW1lb3V0IGZvciBhbiBpbnRlcnJ1cHQgY2hhaW4sIHJvdXRpbmVzCisgKiB0byBpbml0aWFsaXplIGFuZCBzdGFydHVwIGEgc2VyaWFsIHBvcnQsIGFuZCByb3V0aW5lcyB0byBzaHV0ZG93biBhCisgKiBzZXJpYWwgcG9ydC4gIFVzZWZ1bCBzdHVmZiBsaWtlIHRoYXQuCisgKgorICogQ2FsbGVyIHNob3VsZCBob2xkIGxvY2sKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfYmFzaWNfaW5pdChzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8pCit7CisJLyogcHV0IEVTUEMgaW4gZW5oYW5jZWQgbW9kZSAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9NT0RFKTsKKwkKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAxKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgzMSk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIG5vdyAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCS8qIHNldCBpbnRlcnJ1cHQgYW5kIERNQSBjaGFubmVsICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0lSUSk7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAxKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgKGRtYSA8PCA0KSB8IDB4MDEpOworCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0VOSF9JUlEpOworCisJaWYgKGluZm8tPmxpbmUgJSA4KQkvKiBzZWNvbmRhcnkgcG9ydCAqLworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MGQpOwkvKiBzaGFyZWQgKi8KKwllbHNlIGlmIChpbmZvLT5pcnEgPT0gOSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAyKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+aXJxKTsKKworCS8qIHNldCBlcnJvciBzdGF0dXMgbWFzayAoY2hlY2sgdGhpcykgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRVJSX01BU0spOworCisJaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhhMSk7CisJZWxzZQorCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4YmQpOworCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCS8qIHNldCBETUEgdGltZW91dCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9ETUFfVE1PVVQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhmZik7CisKKwkvKiBzZXQgRklGTyB0cmlnZ2VyIGxldmVscyAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9UUklHR0VSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID4+IDgpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPj4gOCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcudHhfdHJpZ2dlcik7CisKKwkvKiBTZXQgY2xvY2sgc2NhbGluZyBhbmQgd2FpdCBzdGF0ZXMgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUFJFU0NBTEFSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDQgfCBFU1BDX1NDQUxFKTsKKworCS8qIHNldCByZWludGVycnVwdCBwYWNpbmcgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUkVJTlRSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOworfQorCitzdGF0aWMgaW50IHN0YXJ0dXAoc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50CXJldHZhbD0wOworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NoYXJzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWluZm8tPnhtaXRfYnVmKSB7CisJCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWlmICghaW5mby0+eG1pdF9idWYpCisJCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygic3RhcnRpbmcgdXAgdHR5cyVkIChpcnEgJWQpLi4uIiwgaW5mby0+bGluZSwgaW5mby0+aXJxKTsKKyNlbmRpZgorCisJLyogRmx1c2ggdGhlIFJYIGJ1ZmZlci4gIFVzaW5nIHRoZSBFU0kgZmx1c2ggY29tbWFuZCBtYXkgY2F1c2UgKi8KKwkvKiB3aWxkIGludGVycnVwdHMsIHNvIHJlYWQgYWxsIHRoZSBkYXRhIGluc3RlYWQuICovCisKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfUlhfQVZBSUwpOworCW51bV9jaGFycyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgPDwgODsKKwludW1fY2hhcnMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCXdoaWxlIChudW1fY2hhcnMgPiAxKSB7CisJCWludyhpbmZvLT5wb3J0ICsgVUFSVF9FU0lfUlgpOworCQludW1fY2hhcnMgLT0gMjsKKwl9CisKKwlpZiAobnVtX2NoYXJzKQorCQlzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUlgpOworCisJLyogc2V0IHJlY2VpdmUgY2hhcmFjdGVyIHRpbWVvdXQgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUlhfVElNRU9VVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcucnhfdGltZW91dCk7CisKKwkvKiBjbGVhciBhbGwgZmxhZ3MgZXhjZXB0IHRoZSAibmV2ZXIgRE1BIiBmbGFnICovCisJaW5mby0+c3RhdF9mbGFncyAmPSBFU1BfU1RBVF9ORVZFUl9ETUE7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9VU0VfUElPOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgSVJRCisJICovCisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShpbmZvLT5pcnEsIHJzX2ludGVycnVwdF9zaW5nbGUsIFNBX1NISVJRLAorCQkJICAgICAiZXNwIHNlcmlhbCIsIGluZm8pOworCisJaWYgKHJldHZhbCkgeworCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKGluZm8tPnR0eSkKKwkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwKKwkJCQkJJmluZm8tPnR0eS0+ZmxhZ3MpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCQlnb3RvIG91dF91bmxvY2tlZDsKKwl9CisKKwlpZiAoIShpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgJiYgIWRtYV9idWZmZXIpIHsKKwkJZG1hX2J1ZmZlciA9IChjaGFyICopX19nZXRfZG1hX3BhZ2VzKAorCQkJR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKKworCQkvKiB1c2UgUElPIG1vZGUgaWYgRE1BIGJ1Zi9jaGFuIGNhbm5vdCBiZSBhbGxvY2F0ZWQgKi8KKwkJaWYgKCFkbWFfYnVmZmVyKQorCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9VU0VfUElPOworCQllbHNlIGlmIChyZXF1ZXN0X2RtYShkbWEsICJlc3Agc2VyaWFsIikpIHsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKKwkJCQkgICBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOworCQkJZG1hX2J1ZmZlciA9IE5VTEw7CisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87CisJCX0KKwkJCQorCX0KKworCWluZm8tPk1DUiA9IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKwkKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSBpbnRlcnJ1cHRzCisJICovCisJLyogaW5mby0+SUVSID0gVUFSVF9JRVJfTVNJIHwgVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsgKi8KKwlpbmZvLT5JRVIgPSBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHwgVUFSVF9JRVJfRE1BX1RNT1VUIHwKKwkJCVVBUlRfSUVSX0RNQV9UQzsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKwkgKi8KKwlpZiAoaW5mby0+dHR5KSB7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisJfQorCQorCS8qCisJICogc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKwljaGFuZ2Vfc3BlZWQoaW5mbyk7CisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJcmV0dXJuIDA7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CitvdXRfdW5sb2NrZWQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBhbmQKKyAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzLCBmOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJTaHV0dGluZyBkb3duIHNlcmlhbCBwb3J0ICVkIChpcnEgJWQpLi4uLiIsIGluZm8tPmxpbmUsCisJICAgICAgIGluZm8tPmlycSk7CisjZW5kaWYKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCS8qCisJICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCisJICogaGVyZSBzbyB0aGUgcXVldWUgbWlnaHQgbmV2ZXIgYmUgd2FrZW4gdXAKKwkgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmJyZWFrX3dhaXQpOworCisJLyogc3RvcCBhIERNQSB0cmFuc2ZlciBvbiB0aGUgcG9ydCBiZWluZyBjbG9zZWQgKi8KKwkvKiBETUEgbG9jayBpcyBoaWdoZXIgcHJpb3JpdHkgYWx3YXlzICovCisJaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiAoRVNQX1NUQVRfRE1BX1JYIHwgRVNQX1NUQVRfRE1BX1RYKSkgeworCQlmPWNsYWltX2RtYV9sb2NrKCk7CisJCWRpc2FibGVfZG1hKGRtYSk7CisJCWNsZWFyX2RtYV9mZihkbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGYpOworCQkKKwkJZG1hX2J5dGVzID0gMDsKKwl9CisJCisJLyoKKwkgKiBGcmVlIHRoZSBJUlEKKwkgKi8KKwlmcmVlX2lycShpbmZvLT5pcnEsIGluZm8pOworCisJaWYgKGRtYV9idWZmZXIpIHsKKwkJc3RydWN0IGVzcF9zdHJ1Y3QgKmN1cnJlbnRfcG9ydCA9IHBvcnRzOworCisJCXdoaWxlIChjdXJyZW50X3BvcnQpIHsKKwkJCWlmICgoY3VycmVudF9wb3J0ICE9IGluZm8pICYmCisJCQkgICAgKGN1cnJlbnRfcG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCQkJYnJlYWs7CisKKwkJCWN1cnJlbnRfcG9ydCA9IGN1cnJlbnRfcG9ydC0+bmV4dF9wb3J0OworCQl9CisKKwkJaWYgKCFjdXJyZW50X3BvcnQpIHsKKwkJCWZyZWVfZG1hKGRtYSk7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRtYV9idWZmZXIsCisJCQkJICAgZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKKwkJCWRtYV9idWZmZXIgPSBOVUxMOworCQl9CQkKKwl9CisKKwlpZiAoaW5mby0+eG1pdF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpbmZvLT5JRVIgPSAwOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpCisJCWluZm8tPk1DUiAmPSB+KFVBUlRfTUNSX0RUUnxVQVJUX01DUl9SVFMpOworCisJaW5mby0+TUNSICY9IH5VQVJUX01DUl9PVVQyOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKworCWlmIChpbmZvLT50dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCisgKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIHNob3J0IHBvcnQ7CisJaW50CXF1b3QgPSAwOworCXVuc2lnbmVkIGNmbGFnLGN2YWw7CisJaW50CWJhdWQsIGJpdHM7CisJdW5zaWduZWQgY2hhciBmbG93MSA9IDAsIGZsb3cyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuOworCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCXBvcnQgPSBpbmZvLT5wb3J0OworCQorCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJICAgICAgY2FzZSBDUzU6IGN2YWwgPSAweDAwOyBiaXRzID0gNzsgYnJlYWs7CisJICAgICAgY2FzZSBDUzY6IGN2YWwgPSAweDAxOyBiaXRzID0gODsgYnJlYWs7CisJICAgICAgY2FzZSBDUzc6IGN2YWwgPSAweDAyOyBiaXRzID0gOTsgYnJlYWs7CisJICAgICAgY2FzZSBDUzg6IGN2YWwgPSAweDAzOyBiaXRzID0gMTA7IGJyZWFrOworCSAgICAgIGRlZmF1bHQ6ICBjdmFsID0gMHgwMDsgYml0cyA9IDc7IGJyZWFrOworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJY3ZhbCB8PSAweDA0OworCQliaXRzKys7CisJfQorCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQljdmFsIHw9IFVBUlRfTENSX1BBUklUWTsKKwkJYml0cysrOworCX0KKwlpZiAoIShjZmxhZyAmIFBBUk9ERCkpCisJCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKKyNpZmRlZiBDTVNQQVIKKwlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCWN2YWwgfD0gVUFSVF9MQ1JfU1BBUjsKKyNlbmRpZgorCisJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CisJaWYgKGJhdWQgPT0gMzg0MDAgJiYKKwkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpCisJCXF1b3QgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwllbHNlIHsKKwkJaWYgKGJhdWQgPT0gMTM0KQorCQkJLyogU3BlY2lhbCBjYXNlIHNpbmNlIDEzNCBpcyByZWFsbHkgMTM0LjUgKi8KKwkJCXF1b3QgPSAoMipCQVNFX0JBVUQgLyAyNjkpOworCQllbHNlIGlmIChiYXVkKQorCQkJcXVvdCA9IEJBU0VfQkFVRCAvIGJhdWQ7CisJfQorCS8qIElmIHRoZSBxdW90aWVudCBpcyBldmVyIHplcm8sIGRlZmF1bHQgdG8gOTYwMCBicHMgKi8KKwlpZiAoIXF1b3QpCisJCXF1b3QgPSBCQVNFX0JBVUQgLyA5NjAwOworCQorCWluZm8tPnRpbWVvdXQgPSAoKDEwMjQgKiBIWiAqIGJpdHMgKiBxdW90KSAvIEJBU0VfQkFVRCkgKyAoSFogLyA1MCk7CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJLyogaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7ICovCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwkJLyogaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsgKi8KKwkJZmxvdzEgPSAweDA0OworCQlmbG93MiA9IDB4MTA7CisJfSBlbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlIHsKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJCS8qIGluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7ICovCisJfQorCisJLyoKKwkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKKwkgKi8KKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQorCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKKwlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQorCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisjaWYgMAorCS8qIFRoaXMgc2hvdWxkIGJlIHNhZmUsIGJ1dCBmb3Igc29tZSBicm9rZW4gYml0cyBvZiBoYXJkd2FyZS4uLiAqLworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7CisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOworCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJfQorI2VuZGlmCisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUgCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkgeworCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgXAorCQkJCVVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgXAorCQkJCVVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCX0KKwl9CisKKwlpZiAoSV9JWE9GRihpbmZvLT50dHkpKQorCQlmbG93MSB8PSAweDgxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkvKiBzZXQgYmF1ZCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9CQVVEKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIHF1b3QgPj4gOCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBxdW90ICYgMHhmZik7CisKKwkvKiBzZXQgZGF0YSBiaXRzLCBwYXJpdHksIGV0Yy4gKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTENSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGN2YWwpOworCisJLyogRW5hYmxlIGZsb3cgY29udHJvbCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0NOVEwpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgZmxvdzEpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgZmxvdzIpOworCisJLyogc2V0IGZsb3cgY29udHJvbCBjaGFyYWN0ZXJzIChYT04vWE9GRiBvbmx5KSAqLworCWlmIChJX0lYT0ZGKGluZm8tPnR0eSkpIHsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfQ0hBUlMpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MTApOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MjEpOworCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkJCWNhc2UgQ1M1OgorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgxZik7CisJCQkJYnJlYWs7CisJCQljYXNlIENTNjoKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4M2YpOworCQkJCWJyZWFrOworCQkJY2FzZSBDUzc6CisJCQljYXNlIENTODoKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4N2YpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJLyogU2V0IGhpZ2gvbG93IHdhdGVyICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfTFZMKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29mZiA+PiA4KTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29mZik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcuZmxvd19vbiA+PiA4KTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCisJaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCA8IEVTUF9YTUlUX1NJWkUgLSAxKSB7CisJCWluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfaGVhZCsrXSA9IGNoOworCQlpbmZvLT54bWl0X2hlYWQgJj0gRVNQX1hNSVRfU0laRS0xOworCQlpbmZvLT54bWl0X2NudCsrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJzX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8ICFpbmZvLT54bWl0X2J1ZikKKwkJZ290byBvdXQ7CisKKwlpZiAoIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcnNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQJYywgdCwgcmV0ID0gMDsKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd3JpdGUiKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAwOworCSAgICAKKwl3aGlsZSAoMSkgeworCQkvKiBUaGFua3MgdG8gUi4gV29sZmYgZm9yIHN1Z2dlc3RpbmcgaG93IHRvIGRvIHRoaXMgd2l0aCAqLworCQkvKiBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KKworCQljID0gY291bnQ7CisJCXQgPSBFU1BfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCQkKKwkJaWYgKHQgPCBjKQorCQkJYyA9IHQ7CisKKwkJdCA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQ7CisJCQorCQlpZiAodCA8IGMpCisJCQljID0gdDsKKworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBidWYsIGMpOworCisJCWluZm8tPnhtaXRfaGVhZCA9IChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChFU1BfWE1JVF9TSVpFLTEpOworCQlpbmZvLT54bWl0X2NudCArPSBjOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0ICs9IGM7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJcmV0ID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkJCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGluZm8tPnhtaXRfY250OworfQorCitzdGF0aWMgdm9pZCByc19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXR0eV93YWtldXAodHR5KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfdGhyb3R0bGUoKQorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsIHRoYXQKKyAqIGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBTRVJJQUxfREVCVUdfVEhST1RUTEUKKwljaGFyCWJ1Zls2NF07CisJCisJcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3Rocm90dGxlIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9SREk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQorCWNoYXIJYnVmWzY0XTsKKwkKKwlwcmludGsoInVudGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKKyNlbmRpZgorCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCisJCXJldHVybjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWluZm8tPklFUiB8PSBVQVJUX0lFUl9SREk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfaW9jdGwoKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvLAorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKyAgCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IFBPUlRfMTY1NTBBOworCXRtcC5saW5lID0gaW5mby0+bGluZTsKKwl0bXAucG9ydCA9IGluZm8tPnBvcnQ7CisJdG1wLmlycSA9IGluZm8tPmlycTsKKwl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKwl0bXAueG1pdF9maWZvX3NpemUgPSAxMDI0OworCXRtcC5iYXVkX2Jhc2UgPSBCQVNFX0JBVUQ7CisJdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisJdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwl0bXAuaHViNiA9IDA7CisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9lc3BfY29uZmlnKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbywKKwkJCSAgc3RydWN0IGhheWVzX2VzcF9jb25maWcgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBoYXllc19lc3BfY29uZmlnIHRtcDsKKyAgCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnJ4X3RpbWVvdXQgPSBpbmZvLT5jb25maWcucnhfdGltZW91dDsKKwl0bXAucnhfdHJpZ2dlciA9IGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyOworCXRtcC50eF90cmlnZ2VyID0gaW5mby0+Y29uZmlnLnR4X3RyaWdnZXI7CisJdG1wLmZsb3dfb2ZmID0gaW5mby0+Y29uZmlnLmZsb3dfb2ZmOworCXRtcC5mbG93X29uID0gaW5mby0+Y29uZmlnLmZsb3dfb247CisJdG1wLnBpb190aHJlc2hvbGQgPSBpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZDsKKwl0bXAuZG1hX2NoYW5uZWwgPSAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSA/IDAgOiBkbWEpOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8sCisJCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJc3RydWN0IGVzcF9zdHJ1Y3Qgb2xkX2luZm87CisJdW5zaWduZWQgaW50IGNoYW5nZV9pcnE7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmN1cnJlbnRfYXN5bmM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2xkX2luZm8gPSAqaW5mbzsKKworCWlmICgobmV3X3NlcmlhbC50eXBlICE9IFBPUlRfMTY1NTBBKSB8fAorCSAgICAobmV3X3NlcmlhbC5odWI2KSB8fAorCSAgICAoaW5mby0+cG9ydCAhPSBuZXdfc2VyaWFsLnBvcnQpIHx8CisJICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBCQVNFX0JBVUQpIHx8CisJICAgIChuZXdfc2VyaWFsLmlycSA+IDE1KSB8fAorCSAgICAobmV3X3NlcmlhbC5pcnEgPCAyKSB8fAorCSAgICAobmV3X3NlcmlhbC5pcnEgPT0gNikgfHwKKwkgICAgKG5ld19zZXJpYWwuaXJxID09IDgpIHx8CisJICAgIChuZXdfc2VyaWFsLmlycSA9PSAxMykpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hhbmdlX2lycSA9IG5ld19zZXJpYWwuaXJxICE9IGluZm8tPmlycTsKKworCWlmIChjaGFuZ2VfaXJxICYmIChpbmZvLT5saW5lICUgOCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmIChjaGFuZ2VfaXJxIHx8IAorCQkgICAgKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CisJCSAgICAgKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKKwl9IGVsc2UgeworCQlpZiAobmV3X3NlcmlhbC5pcnEgPT0gMikKKwkJCW5ld19zZXJpYWwuaXJxID0gOTsKKworCQlpZiAoY2hhbmdlX2lycSkgeworCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOworCisJCQl3aGlsZSAoY3VycmVudF9hc3luYykgeworCQkJCWlmICgoY3VycmVudF9hc3luYy0+bGluZSA+PSBpbmZvLT5saW5lKSAmJgorCQkJCSAgICAoY3VycmVudF9hc3luYy0+bGluZSA8IChpbmZvLT5saW5lICsgOCkpKSB7CisJCQkJCWlmIChjdXJyZW50X2FzeW5jID09IGluZm8pIHsKKwkJCQkJCWlmIChjdXJyZW50X2FzeW5jLT5jb3VudCA+IDEpCisJCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJfSBlbHNlIGlmIChjdXJyZW50X2FzeW5jLT5jb3VudCkKKwkJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorCisJCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKwkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCQkgKi8KKworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFovMTAwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaLzEwMDsKKworCQlpZiAoY2hhbmdlX2lycSkgeworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gc2h1dGRvd24gdGhlIHNlcmlhbCBwb3J0IGF0IHRoZSBvbGQKKwkJCSAqIHBvcnQvaXJxIGNvbWJpbmF0aW9uLgorCQkJICovCisJCQlzaHV0ZG93bihpbmZvKTsKKworCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOworCisJCQl3aGlsZSAoY3VycmVudF9hc3luYykgeworCQkJCWlmICgoY3VycmVudF9hc3luYy0+bGluZSA+PSBpbmZvLT5saW5lKSAmJgorCQkJCSAgICAoY3VycmVudF9hc3luYy0+bGluZSA8IChpbmZvLT5saW5lICsgOCkpKQorCQkJCQljdXJyZW50X2FzeW5jLT5pcnEgPSBuZXdfc2VyaWFsLmlycTsKKworCQkJCWN1cnJlbnRfYXN5bmMgPSBjdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7CisJCQl9CisKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9FTkhfSVJRKTsKKwkJCWlmIChpbmZvLT5pcnEgPT0gOSkKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDIpOworCQkJZWxzZQorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+aXJxKTsKKwkJfQorCX0KKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWlmICgoKG9sZF9pbmZvLmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CisJCSAgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB8fAorCQkgICAgKG9sZF9pbmZvLmN1c3RvbV9kaXZpc29yICE9IGluZm8tPmN1c3RvbV9kaXZpc29yKSkgeworCQkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisJCQljaGFuZ2Vfc3BlZWQoaW5mbyk7CisJCX0KKwl9IGVsc2UKKwkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2VzcF9jb25maWcoc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvLAorCQkJICBzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBfX3VzZXIgKiBuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBuZXdfY29uZmlnOworCXVuc2lnbmVkIGludCBjaGFuZ2VfZG1hOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBlc3Bfc3RydWN0ICpjdXJyZW50X2FzeW5jOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBQZXJoYXBzIGEgbm9uLXN5c2FkbWluIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZG8gc29tZSBvZiB0aGVzZSAqLworCS8qIG9wZXJhdGlvbnMuICBJIGhhdmVuJ3QgZGVjaWRlZCB5ZXQuICovCisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19jb25maWcsIG5ld19pbmZvLCBzaXplb2YobmV3X2NvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobmV3X2NvbmZpZy5mbG93X29uID49IG5ld19jb25maWcuZmxvd19vZmYpIHx8CisJICAgIChuZXdfY29uZmlnLnJ4X3RyaWdnZXIgPCAxKSB8fAorCSAgICAobmV3X2NvbmZpZy50eF90cmlnZ2VyIDwgMSkgfHwKKwkgICAgKG5ld19jb25maWcuZmxvd19vZmYgPCAxKSB8fAorCSAgICAobmV3X2NvbmZpZy5mbG93X29uIDwgMSkgfHwKKwkgICAgKG5ld19jb25maWcucnhfdHJpZ2dlciA+IDEwMjMpIHx8CisJICAgIChuZXdfY29uZmlnLnR4X3RyaWdnZXIgPiAxMDIzKSB8fAorCSAgICAobmV3X2NvbmZpZy5mbG93X29mZiA+IDEwMjMpIHx8CisJICAgIChuZXdfY29uZmlnLmZsb3dfb24gPiAxMDIzKSB8fAorCSAgICAobmV3X2NvbmZpZy5waW9fdGhyZXNob2xkIDwgMCkgfHwKKwkgICAgKG5ld19jb25maWcucGlvX3RocmVzaG9sZCA+IDEwMjQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSAxKSAmJiAobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSAzKSkKKwkJbmV3X2NvbmZpZy5kbWFfY2hhbm5lbCA9IDA7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJY2hhbmdlX2RtYSA9IG5ld19jb25maWcuZG1hX2NoYW5uZWw7CisJZWxzZQorCQljaGFuZ2VfZG1hID0gKG5ld19jb25maWcuZG1hX2NoYW5uZWwgIT0gZG1hKTsKKworCWlmIChjaGFuZ2VfZG1hKSB7CisJCWlmIChuZXdfY29uZmlnLmRtYV9jaGFubmVsKSB7CisJCQkvKiBQSU8gbW9kZSB0byBETUEgbW9kZSB0cmFuc2l0aW9uIE9SICovCisJCQkvKiBjaGFuZ2UgY3VycmVudCBETUEgY2hhbm5lbCAqLworCQkJCisJCQljdXJyZW50X2FzeW5jID0gcG9ydHM7CisKKwkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7CisJCQkJaWYgKGN1cnJlbnRfYXN5bmMgPT0gaW5mbykgeworCQkJCQlpZiAoY3VycmVudF9hc3luYy0+Y291bnQgPiAxKQorCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9IGVsc2UgaWYgKGN1cnJlbnRfYXN5bmMtPmNvdW50KQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCQkKKwkJCQljdXJyZW50X2FzeW5jID0KKwkJCQkJY3VycmVudF9hc3luYy0+bmV4dF9wb3J0OworCQkJfQorCisJCQlzaHV0ZG93bihpbmZvKTsKKwkJCWRtYSA9IG5ld19jb25maWcuZG1hX2NoYW5uZWw7CisJCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9ORVZFUl9ETUE7CisJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBwb3J0cyBtdXN0IHVzZSB0aGUgc2FtZSBETUEgY2hhbm5lbCAqLworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOworCisJCQl3aGlsZSAoY3VycmVudF9hc3luYykgeworCQkJCWVzcF9iYXNpY19pbml0KGN1cnJlbnRfYXN5bmMpOworCQkJCWN1cnJlbnRfYXN5bmMgPSBjdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKiBETUEgbW9kZSB0byBQSU8gbW9kZSBvbmx5ICovCisJCQkKKwkJCWlmIChpbmZvLT5jb3VudCA+IDEpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJc2h1dGRvd24oaW5mbyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7CisJCQllc3BfYmFzaWNfaW5pdChpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCWluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkID0gbmV3X2NvbmZpZy5waW9fdGhyZXNob2xkOworCisJaWYgKChuZXdfY29uZmlnLmZsb3dfb2ZmICE9IGluZm8tPmNvbmZpZy5mbG93X29mZikgfHwKKwkgICAgKG5ld19jb25maWcuZmxvd19vbiAhPSBpbmZvLT5jb25maWcuZmxvd19vbikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpbmZvLT5jb25maWcuZmxvd19vZmYgPSBuZXdfY29uZmlnLmZsb3dfb2ZmOworCQlpbmZvLT5jb25maWcuZmxvd19vbiA9IG5ld19jb25maWcuZmxvd19vbjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRkxPV19MVkwpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcuZmxvd19vZmYgPj4gOCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29mZik7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29uID4+IDgpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcuZmxvd19vbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoKG5ld19jb25maWcucnhfdHJpZ2dlciAhPSBpbmZvLT5jb25maWcucnhfdHJpZ2dlcikgfHwKKwkgICAgKG5ld19jb25maWcudHhfdHJpZ2dlciAhPSBpbmZvLT5jb25maWcudHhfdHJpZ2dlcikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IG5ld19jb25maWcucnhfdHJpZ2dlcjsKKwkJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSBuZXdfY29uZmlnLnR4X3RyaWdnZXI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9UUklHR0VSKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJICAgbmV3X2NvbmZpZy5yeF90cmlnZ2VyID4+IDgpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcucnhfdHJpZ2dlcik7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwKKwkJCSAgIG5ld19jb25maWcudHhfdHJpZ2dlciA+PiA4KTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLnR4X3RyaWdnZXIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKG5ld19jb25maWcucnhfdGltZW91dCAhPSBpbmZvLT5jb25maWcucnhfdGltZW91dCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWluZm8tPmNvbmZpZy5yeF90aW1lb3V0ID0gbmV3X2NvbmZpZy5yeF90aW1lb3V0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9SREkpIHsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwKKwkJCQkgICBFU0lfU0VUX1JYX1RJTUVPVVQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJCSAgIG5ld19jb25maWcucnhfdGltZW91dCk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5CisgKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgorICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCisgKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAorICovCitzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8sIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7CisJc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gKChzdGF0dXMgJiBVQVJUX0xTUl9URU1UKSA/IFRJT0NTRVJfVEVNVCA6IDApOworCXJldHVybiBwdXRfdXNlcihyZXN1bHQsdmFsdWUpOworfQorCisKK3N0YXRpYyBpbnQgZXNwX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJY29udHJvbCA9IGluZm8tPk1DUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7CisJc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gICAgKChjb250cm9sICYgVUFSVF9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApCisJCXwgKChjb250cm9sICYgVUFSVF9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApCisJCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfUkkpID8gVElPQ01fUk5HIDogMCkKKwkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCkKKwkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0RUUjsKKworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgorICovCitzdGF0aWMgdm9pZCBlc3BfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9icmVhayIpKQorCQlyZXR1cm47CisKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfSVNTVUVfQlJFQUspOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkJLyogRklYTUUgLSBuZXcgc3R5bGUgd2FpdCBuZWVkZWQgaGVyZSAqLworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5icmVha193YWl0KTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9JU1NVRV9CUkVBSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2lvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisJICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1dJTEQpICAmJgorCSAgICAoY21kICE9IFRJT0NTRVJTV0lMRCkgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSAmJgorCSAgICAoY21kICE9IFRJT0NHSEFZRVNFU1ApICYmIChjbWQgIT0gVElPQ1NIQVlFU0VTUCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkgICAgcmV0dXJuIC1FSU87CisJfQorCQorCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElPQ0dTRVJJQUw6CisJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCQljYXNlIFRJT0NTU0VSSUFMOgorCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKwkJY2FzZSBUSU9DU0VSQ09ORklHOgorCQkJLyogZG8gbm90IHJlY29uZmlndXJlIGFmdGVyIGluaXRpYWwgY29uZmlndXJhdGlvbiAqLworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUSU9DU0VSR1dJTEQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoMEwsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCisJCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisJCQkgICAgcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCBhcmdwKTsKKworCQljYXNlIFRJT0NTRVJTV0lMRDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZQorCQkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKKyAJCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQorCQkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcworCQkgKi8KKwkJIGNhc2UgVElPQ01JV0FJVDoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQljcHJldiA9IGluZm8tPmljb3VudDsJLyogbm90ZSB0aGUgY291bnRlcnMgb24gZW50cnkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCXdoaWxlICgxKSB7CisJCQkJLyogRklYTUU6IGNvbnZlcnQgdG8gbmV3IHN0eWxlIHdha2V1cCAqLworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQkJY25vdyA9IGluZm8tPmljb3VudDsJLyogYXRvbWljIGNvcHkgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJgorCQkJCSAgICBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYgCisJCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJgorCQkJCSAgICBjbm93LmN0cyA9PSBjcHJldi5jdHMpCisJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KKwkJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmCisJCQkJICAgICAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJgorCQkJCSAgICAgIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAorCQkJCSAgICAgKChhcmcgJiBUSU9DTV9DRCkgJiYKKwkJCQkgICAgICAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJgorCQkJCSAgICAgIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSApIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWNwcmV2ID0gY25vdzsKKwkJCX0KKwkJCS8qIE5PVFJFQUNIRUQgKi8KKworCQkvKiAKKwkJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJCSAqIE5COiBib3RoIDEtPjAgYW5kIDAtPjEgdHJhbnNpdGlvbnMgYXJlIGNvdW50ZWQgZXhjZXB0IGZvcgorCQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJCSAqLworCQljYXNlIFRJT0NHSUNPVU5UOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQlwX2N1c2VyID0gYXJncDsKKwkJCWlmIChwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cykgfHwKKwkJCSAgICBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcikgfHwKKwkJCSAgICBwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZykgfHwKKwkJCSAgICBwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCWNhc2UgVElPQ0dIQVlFU0VTUDoKKwkJcmV0dXJuIGdldF9lc3BfY29uZmlnKGluZm8sIGFyZ3ApOworCWNhc2UgVElPQ1NIQVlFU0VTUDoKKwkJcmV0dXJuIHNldF9lc3BfY29uZmlnKGluZm8sIGFyZ3ApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQorCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKKwkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKKwkJcmV0dXJuOworCisJY2hhbmdlX3NwZWVkKGluZm8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOworCX0KKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCQkodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPk1DUiB8PSAoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJLyogSGFuZGxlIHR1cm5pbmcgb2YgQ1JUU0NUUyAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXJzX3N0YXJ0KHR0eSk7CisJfQorfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByc19jbG9zZSgpCisgKiAKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsIHBvcnQgZ2V0cyBjbG9zZWQuICBGaXJzdCwgd2UKKyAqIHdhaXQgZm9yIHRoZSBsYXN0IHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQuICBUaGVuLCB3ZSB1bmxpbmsgaXRzCisgKiBhc3luYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW50ZXJydXB0IGNoYWluIGlmIG5lY2Vzc2FyeSwgYW5kIHdlIGZyZWUKKyAqIHRoYXQgSVJRIGlmIG5vdGhpbmcgaXMgbGVmdCBpbiB0aGUgY2hhaW4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mbyB8fCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfY2xvc2UiKSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJREJHX0NOVCgiYmVmb3JlIERFQy1odW5nIik7CisJCWdvdG8gb3V0OworCX0KKwkKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygicnNfY2xvc2UgdHR5cyVkLCBjb3VudCA9ICVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJCS8qCisJCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5CisJCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKCJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLAorCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlEQkdfQ05UKCJiZWZvcmUgREVDLTIiKTsKKwkJZ290byBvdXQ7CisJfQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBjbGVhcjsgYW5kIHdlIG5vdGlmeSAKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJLyogaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOyAqLworCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfUkRJOworCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCisJCS8qIGRpc2FibGUgcmVjZWl2ZSB0aW1lb3V0ICovCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJCSAqLworCQlyc193YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKwl9CisJc2h1dGRvd24oaW5mbyk7CisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwl0dHktPmNsb3NpbmcgPSAwOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJfQorCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOworCXJldHVybjsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCWNoYXJfdGltZSA9ICgoaW5mby0+dGltZW91dCAtIEhaIC8gNTApIC8gMTAyNCkgLyA1OworCisJaWYgKCFjaGFyX3RpbWUpCisJCWNoYXJfdGltZSA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9UWF9BVkFJTCk7CisKKwl3aGlsZSAoKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgIT0gMHgwMykgfHwKKwkJKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMikgIT0gMHhmZikpIHsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVFhfQVZBSUwpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK30KKworLyoKKyAqIGVzcF9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCitzdGF0aWMgdm9pZCBlc3BfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9oYW5ndXAiKSkKKwkJcmV0dXJuOworCQorCXJzX2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVzcF9vcGVuKCkgYW5kIGZyaWVuZHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICBzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworCSAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJICAgIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpKSB7CisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKyNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAorCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIHJzX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIAorCQlpbmZvLT5jb3VudC0tOworCWluZm8tPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCQl1bnNpZ25lZCBpbnQgc2NyYXRjaDsKKworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfUkVBRF9VQVJUKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQkJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJCXNjcmF0Y2ggfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisjaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKKwkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQorI2Vsc2UKKwkJCXJldHZhbCA9IC1FQUdBSU47CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7CisJCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpICYgVUFSVF9NU1JfRENEKQorCQkJZG9fY2xvY2FsID0gMTsKKworCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCSAgICAoZG9fY2xvY2FsKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJaW5mby0+Y291bnQrKzsKKwlpbmZvLT5ibG9ja2VkX29wZW4tLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuIDA7Cit9CQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CisgKiBlbmFibGVzIGludGVycnVwdHMgZm9yIGEgc2VyaWFsIHBvcnQsIGxpbmtpbmcgaW4gaXRzIGFzeW5jIHN0cnVjdHVyZSBpbnRvCisgKiB0aGUgSVJRIGNoYWluLiAgIEl0IGFsc28gcGVyZm9ybXMgdGhlIHNlcmlhbC1zcGVjaWZpYworICogaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB0dHkgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IGVzcF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbzsKKwlpbnQgCQkJcmV0dmFsLCBsaW5lOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJbGluZSA9IHR0eS0+aW5kZXg7CisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTlJfUE9SVFMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGZpbmQgdGhlIHBvcnQgaW4gdGhlIGNoYWluICovCisKKwlpbmZvID0gcG9ydHM7CisKKwl3aGlsZSAoaW5mbyAmJiAoaW5mby0+bGluZSAhPSBsaW5lKSkKKwkJaW5mbyA9IGluZm8tPm5leHRfcG9ydDsKKworCWlmICghaW5mbykgeworCQlzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZXNwX29wZW4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImVzcF9vcGVuICVzLCBjb3VudCA9ICVkXG4iLCB0dHktPm5hbWUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+Y291bnQrKzsKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisKKwlpZiAoIXRtcF9idWYpIHsKKwkJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCF0bXBfYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCS8qCisJICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKKwkgKi8KKwlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJlc3Bfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCisJCSAgICAgICByZXR2YWwpOworI2VuZGlmCisJCXJldHVybiByZXR2YWw7CisJfQorCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImVzcF9vcGVuICVzIHN1Y2Nlc3NmdWwuLi4iLCB0dHktPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVzcHNlcmlhbF9pbml0KCkgYW5kIGZyaWVuZHMKKyAqCisgKiBlc3BzZXJpYWxfaW5pdCgpIGlzIGNhbGxlZCBhdCBib290LXRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIGRyaXZlci4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcHJpbnRzIG91dCB0aGUgYXBwcm9wcmlhdGUgc2VyaWFsIGRyaXZlciB2ZXJzaW9uCisgKiBudW1iZXIsIGFuZCBpZGVudGlmaWVzIHdoaWNoIG9wdGlvbnMgd2VyZSBjb25maWd1cmVkIGludG8gdGhpcworICogZHJpdmVyLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgc2hvd19zZXJpYWxfdmVyc2lvbih2b2lkKQoreworIAlwcmludGsoS0VSTl9JTkZPICIlcyB2ZXJzaW9uICVzIChETUEgJXUpXG4iLAorCQlzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24sIGRtYSk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGVzcHNlcmlhbF9pbml0KCkgdG8gaW5pdGlhbGl6ZSBhIHNwZWNpZmljIHNlcmlhbAorICogcG9ydC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2NvbmZpZyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8pCit7CisJaW50IHBvcnRfZGV0ZWN0ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGluZm8tPnBvcnQsIFJFR0lPTl9TSVpFLCAiZXNwIHNlcmlhbCIpKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBDaGVjayBmb3IgRVNQIGNhcmQKKwkgKi8KKworCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfQkFTRSkgPT0gMHhmMykgeworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIDB4MDApOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIDB4MDEpOworCisJCWlmICgoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKSAmIDB4NzApID09IDB4MjApIHsKKwkJCXBvcnRfZGV0ZWN0ZWQgPSAxOworCisJCQlpZiAoIShpbmZvLT5pcnEpKSB7CisJCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCAweDAyKTsKKworCQkJCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpICYgMHgwMSkKKwkJCQkJaW5mby0+aXJxID0gMzsKKwkJCQllbHNlCisJCQkJCWluZm8tPmlycSA9IDQ7CisJCQl9CisKKworCQkJLyogcHV0IGNhcmQgaW4gZW5oYW5jZWQgbW9kZSAqLworCQkJLyogdGhpcyBwcmV2ZW50cyBhY2Nlc3MgdGhyb3VnaCAqLworCQkJLyogdGhlICJvbGQiIElPIHBvcnRzICovCisJCQllc3BfYmFzaWNfaW5pdChpbmZvKTsKKworCQkJLyogY2xlYXIgb3V0IE1DUiAqLworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7CisJCX0KKwl9CisJaWYgKCFwb3J0X2RldGVjdGVkKQorCQlyZWxlYXNlX3JlZ2lvbihpbmZvLT5wb3J0LCBSRUdJT05fU0laRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIChwb3J0X2RldGVjdGVkKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBlc3Bfb3BzID0geworCS5vcGVuID0gZXNwX29wZW4sCisJLmNsb3NlID0gcnNfY2xvc2UsCisJLndyaXRlID0gcnNfd3JpdGUsCisJLnB1dF9jaGFyID0gcnNfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gcnNfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSByc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSByc19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IHJzX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSByc19pb2N0bCwKKwkudGhyb3R0bGUgPSByc190aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHJzX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gcnNfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSByc19zdG9wLAorCS5zdGFydCA9IHJzX3N0YXJ0LAorCS5oYW5ndXAgPSBlc3BfaGFuZ3VwLAorCS5icmVha19jdGwgPSBlc3BfYnJlYWssCisJLndhaXRfdW50aWxfc2VudCA9IHJzX3dhaXRfdW50aWxfc2VudCwKKwkudGlvY21nZXQgPSBlc3BfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gZXNwX3Rpb2Ntc2V0LAorfTsKKworLyoKKyAqIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICovCitzdGF0aWMgaW50IF9faW5pdCBlc3BzZXJpYWxfaW5pdCh2b2lkKQoreworCWludCBpLCBvZmZzZXQ7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvOworCXN0cnVjdCBlc3Bfc3RydWN0ICpsYXN0X3ByaW1hcnkgPSBOVUxMOworCWludCBlc3BbXSA9IHsweDEwMCwweDE0MCwweDE4MCwweDIwMCwweDI0MCwweDI4MCwweDMwMCwweDM4MH07CisKKwllc3BfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7CisJaWYgKCFlc3BfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUFJJTUFSWTsgaSsrKSB7CisJCWlmIChpcnFbaV0gIT0gMCkgeworCQkJaWYgKChpcnFbaV0gPCAyKSB8fCAoaXJxW2ldID4gMTUpIHx8IChpcnFbaV0gPT0gNikgfHwKKwkJCSAgICAoaXJxW2ldID09IDgpIHx8IChpcnFbaV0gPT0gMTMpKQorCQkJCWlycVtpXSA9IDA7CisJCQllbHNlIGlmIChpcnFbaV0gPT0gMikKKwkJCQlpcnFbaV0gPSA5OworCQl9CisJfQorCisJaWYgKChkbWEgIT0gMSkgJiYgKGRtYSAhPSAzKSkKKwkJZG1hID0gMDsKKworCWlmICgocnhfdHJpZ2dlciA8IDEpIHx8IChyeF90cmlnZ2VyID4gMTAyMykpCisJCXJ4X3RyaWdnZXIgPSA3Njg7CisKKwlpZiAoKHR4X3RyaWdnZXIgPCAxKSB8fCAodHhfdHJpZ2dlciA+IDEwMjMpKQorCQl0eF90cmlnZ2VyID0gNzY4OworCisJaWYgKChmbG93X29mZiA8IDEpIHx8IChmbG93X29mZiA+IDEwMjMpKQorCQlmbG93X29mZiA9IDEwMTY7CisJCisJaWYgKChmbG93X29uIDwgMSkgfHwgKGZsb3dfb24gPiAxMDIzKSkKKwkJZmxvd19vbiA9IDk0NDsKKworCWlmICgocnhfdGltZW91dCA8IDApIHx8IChyeF90aW1lb3V0ID4gMjU1KSkKKwkJcnhfdGltZW91dCA9IDEyODsKKwkKKwlpZiAoZmxvd19vbiA+PSBmbG93X29mZikKKwkJZmxvd19vbiA9IGZsb3dfb2ZmIC0gMTsKKworCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisJCisJZXNwX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllc3BfZHJpdmVyLT5uYW1lID0gInR0eVAiOworCWVzcF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL1AiOworCWVzcF9kcml2ZXItPm1ham9yID0gRVNQX0lOX01BSk9SOworCWVzcF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwllc3BfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwllc3BfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwllc3BfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwllc3BfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGVzcF9kcml2ZXIsICZlc3Bfb3BzKTsKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihlc3BfZHJpdmVyKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgZXNwIHNlcmlhbCBkcml2ZXIiKTsKKwkJcHV0X3R0eV9kcml2ZXIoZXNwX2RyaXZlcik7CisJCXJldHVybiAxOworCX0KKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX3N0cnVjdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFpbmZvKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVzcCBzZXJpYWwgZGV2aWNlIGluZm9ybWF0aW9uXG4iKTsKKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGVzcF9kcml2ZXIpOworCQlwdXRfdHR5X2RyaXZlcihlc3BfZHJpdmVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtc2V0KCh2b2lkICopaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlc3Bfc3RydWN0KSk7CisJLyogcnhfdHJpZ2dlciwgdHhfdHJpZ2dlciBhcmUgbmVlZGVkIGJ5IGF1dG9jb25maWcgKi8KKwlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IHJ4X3RyaWdnZXI7CisJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSB0eF90cmlnZ2VyOworCisJaSA9IDA7CisJb2Zmc2V0ID0gMDsKKworCWRvIHsKKwkJaW5mby0+cG9ydCA9IGVzcFtpXSArIG9mZnNldDsKKwkJaW5mby0+aXJxID0gaXJxW2ldOworCQlpbmZvLT5saW5lID0gKGkgKiA4KSArIChvZmZzZXQgLyA4KTsKKworCQlpZiAoIWF1dG9jb25maWcoaW5mbykpIHsKKwkJCWkrKzsKKwkJCW9mZnNldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gKGRpdmlzb3JbaV0gPj4gKG9mZnNldCAvIDIpKSAmIDB4ZjsKKwkJaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOworCQlpZiAoaW5mby0+Y3VzdG9tX2Rpdmlzb3IpCisJCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKKwkJaW5mby0+bWFnaWMgPSBFU1BfTUFHSUM7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50LCBpbmZvKTsKKwkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWVfaGFuZ3VwLCBkb19zZXJpYWxfaGFuZ3VwLCBpbmZvKTsKKwkJaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQgPSByeF90aW1lb3V0OworCQlpbmZvLT5jb25maWcuZmxvd19vbiA9IGZsb3dfb247CisJCWluZm8tPmNvbmZpZy5mbG93X29mZiA9IGZsb3dfb2ZmOworCQlpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCA9IHBpb190aHJlc2hvbGQ7CisJCWluZm8tPm5leHRfcG9ydCA9IHBvcnRzOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5icmVha193YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOworCQlwb3J0cyA9IGluZm87CisJCXByaW50ayhLRVJOX0lORk8gInR0eVAlZCBhdCAweCUwNHggKGlycSA9ICVkKSBpcyBhbiBFU1AgIiwKKwkJCWluZm8tPmxpbmUsIGluZm8tPnBvcnQsIGluZm8tPmlycSk7CisKKwkJaWYgKGluZm8tPmxpbmUgJSA4KSB7CisJCQlwcmludGsoInNlY29uZGFyeSBwb3J0XG4iKTsKKwkJCS8qIDggcG9ydCBjYXJkcyBjYW4ndCBkbyBETUEgKi8KKwkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfTkVWRVJfRE1BOworCisJCQlpZiAobGFzdF9wcmltYXJ5KQorCQkJCWxhc3RfcHJpbWFyeS0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoInByaW1hcnkgcG9ydFxuIik7CisJCQlsYXN0X3ByaW1hcnkgPSBpbmZvOworCQkJaXJxW2ldID0gaW5mby0+aXJxOworCQl9CisKKwkJaWYgKCFkbWEpCisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX05FVkVSX0RNQTsKKworCQlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXNwIHNlcmlhbCBkZXZpY2UgaW5mb3JtYXRpb25cbiIpOyAKKworCQkJLyogYWxsb3cgdXNlIG9mIHRoZSBhbHJlYWR5IGRldGVjdGVkIHBvcnRzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCW1lbXNldCgodm9pZCAqKWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZXNwX3N0cnVjdCkpOworCQkvKiByeF90cmlnZ2VyLCB0eF90cmlnZ2VyIGFyZSBuZWVkZWQgYnkgYXV0b2NvbmZpZyAqLworCQlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IHJ4X3RyaWdnZXI7CisJCWluZm8tPmNvbmZpZy50eF90cmlnZ2VyID0gdHhfdHJpZ2dlcjsKKworCQlpZiAob2Zmc2V0ID09IDU2KSB7CisJCQlpKys7CisJCQlvZmZzZXQgPSAwOworCQl9IGVsc2UgeworCQkJb2Zmc2V0ICs9IDg7CisJCX0KKwl9IHdoaWxlIChpIDwgTlJfUFJJTUFSWSk7CisKKwkvKiBmcmVlIHRoZSBsYXN0IHBvcnQgbWVtb3J5IGFsbG9jYXRpb24gKi8KKwlrZnJlZShpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXNwc2VyaWFsX2V4aXQodm9pZCkgCit7CisJaW50IGUxOworCXN0cnVjdCBlc3Bfc3RydWN0ICp0ZW1wX2FzeW5jOworCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKKworCS8qIHByaW50aygiVW5sb2FkaW5nICVzOiB2ZXJzaW9uICVzXG4iLCBzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24pOyAqLworCWlmICgoZTEgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoZXNwX2RyaXZlcikpKQorCQlwcmludGsoIlNFUklBTDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgc2VyaWFsIGRyaXZlciAoJWQpXG4iLAorCQkgICAgICAgZTEpOworCXB1dF90dHlfZHJpdmVyKGVzcF9kcml2ZXIpOworCisJd2hpbGUgKHBvcnRzKSB7CisJCWlmIChwb3J0cy0+cG9ydCkgeworCQkJcmVsZWFzZV9yZWdpb24ocG9ydHMtPnBvcnQsIFJFR0lPTl9TSVpFKTsKKwkJfQorCQl0ZW1wX2FzeW5jID0gcG9ydHMtPm5leHRfcG9ydDsKKwkJa2ZyZWUocG9ydHMpOworCQlwb3J0cyA9IHRlbXBfYXN5bmM7CisJfQorCisJaWYgKGRtYV9idWZmZXIpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKKwkJCWdldF9vcmRlcihETUFfQlVGRkVSX1NaKSk7CisKKwlpZiAodG1wX2J1ZikKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcF9idWYpOworCisJd2hpbGUgKGZyZWVfcGlvX2J1ZikgeworCQlwaW9fYnVmID0gZnJlZV9waW9fYnVmLT5uZXh0OworCQlrZnJlZShmcmVlX3Bpb19idWYpOworCQlmcmVlX3Bpb19idWYgPSBwaW9fYnVmOworCX0KK30KKworbW9kdWxlX2luaXQoZXNwc2VyaWFsX2luaXQpOworbW9kdWxlX2V4aXQoZXNwc2VyaWFsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNlY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL0tjb25maWcKQEAgLTAsMCArMSwzNDAgQEAKKyMKKyMgRnRhcGUgY29uZmlndXJhdGlvbgorIworY29uZmlnIFpGVEFQRQorCXRyaXN0YXRlICJaZnRhcGUsIHRoZSBWRlMgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gRlRBUEUKKwktLS1oZWxwLS0tCisJICBOb3JtYWxseSwgeW91IHdhbnQgdG8gc2F5IFkgb3IgTS4gRE9OJ1Qgc2F5IE4gaGVyZSBvciB5b3UKKwkgIFdPTidUIEJFIEFCTEUgVE8gVVNFIFlPVVIgRkxPUFBZIFRBUEUgRFJJVkUuCisKKwkgIFRoZSBmdGFwZSBtb2R1bGUgaXRzZWxmIG5vIGxvbmdlciBjb250YWlucyB0aGUgcm91dGluZXMgbmVjZXNzYXJ5CisJICB0byBpbnRlcmZhY2Ugd2l0aCB0aGUga2VybmVsIFZGUyBsYXllciAoaS5lLiB0byBhY3R1YWxseSB3cml0ZSBkYXRhCisJICB0byBhbmQgcmVhZCBkYXRhIGZyb20gdGhlIHRhcGUgZHJpdmUpLiAgSW5zdGVhZCB0aGUgZmlsZSBzeXN0ZW0KKwkgIGludGVyZmFjZSAoaS5lLiB0aGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQgcGFydCBvZiB0aGUgZHJpdmVyKSBoYXMKKwkgIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBtb2R1bGUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpmdGFwZS4KKworCSAgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdSBzYXkgWSBvciBNIGhlcmUsIGFuIGFkZGl0aW9uYWwgcnVudGltZQorCSAgbG9hZGFibGUgbW9kdWxlIGNhbGxlZCBgemZ0LWNvbXByZXNzb3InIHdoaWNoIGNvbnRhaW5zIGNvZGUgdG8KKwkgIHN1cHBvcnQgdXNlciB0cmFuc3BhcmVudCBvbi10aGUtZmx5IGNvbXByZXNzaW9uIGJhc2VkIG9uIFJvc3MKKwkgIFdpbGxpYW0ncyBsenJ3MyBhbGdvcml0aG0gd2lsbCBiZSBwcm9kdWNlZC4gIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhlCisJICBrZXJuZWwgbW9kdWxlIGxvYWRlciAoaS5lLiBoYXZlIHNhaWQgWSB0byAiS2VybmVsIG1vZHVsZSBsb2FkZXIKKwkgIHN1cHBvcnQiLCBhYm92ZSkgdGhlbiBgemZ0LWNvbXByZXNzb3InIHdpbGwgYmUgbG9hZGVkCisJICBhdXRvbWF0aWNhbGx5IGJ5IHpmdGFwZSB3aGVuIG5lZWRlZC4KKworCSAgRGVzcGl0ZSBpdHMgbmFtZSwgemZ0YXBlIGRvZXMgTk9UIHVzZSBjb21wcmVzc2lvbiBieSBkZWZhdWx0LiAgVGhlCisJICBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vZnRhcGUudHh0PiBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mCisJICB0aGUgbW9zdCBpbXBvcnRhbnQgY2hhbmdlcyBpbiB0aGUgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIGNvbXBhcmVkIHRvCisJICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBmdGFwZS4gIFRoZSBmdGFwZSBob21lIHBhZ2UKKwkgIDxodHRwOi8vd3d3Lmluc3RtYXRoLnJ3dGgtYWFjaGVuLmRlL35oZWluZS9mdGFwZS8+IGNvbnRhaW5zCisJICBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCisJICBJTVBPUlRBTlQgTk9URTogemZ0YXBlIGNhbiByZWFkIGFyY2hpdmVzIGNyZWF0ZWQgYnkgcHJldmlvdXMKKwkgIHZlcnNpb25zIG9mIGZ0YXBlIGFuZCBwcm92aWRlIGZpbGUgbWFyayBzdXBwb3J0IChpLmUuIGZhc3Qgc2tpcHBpbmcKKwkgIGJldHdlZW4gdGFwZSBhcmNoaXZlcykgYnV0IHByZXZpb3VzIHZlcnNpb24gb2YgZnRhcGUgd2lsbCBsYWNrIGZpbGUKKwkgIG1hcmsgc3VwcG9ydCB3aGVuIHJlYWRpbmcgYXJjaGl2ZXMgcHJvZHVjZWQgYnkgemZ0YXBlLgorCitjb25maWcgWkZUX0RGTFRfQkxLX1NaCisJaW50ICJEZWZhdWx0IGJsb2NrIHNpemUiCisJZGVwZW5kcyBvbiBaRlRBUEUKKwlkZWZhdWx0ICIxMDI0MCIKKwktLS1oZWxwLS0tCisJICBJZiB1bnN1cmUgbGVhdmUgdGhpcyBhdCBpdHMgZGVmYXVsdCB2YWx1ZSwgaS5lLiAxMDI0MC4gTm90ZSB0aGF0CisJICB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaGVyZS4gVGhlIGJsb2NrIHNpemUgY2FuIGJlCisJICBjaGFuZ2VkIGF0IHJ1biB0aW1lIHVzaW5nIHRoZSBNVFNFVEJMSyB0YXBlIG9wZXJhdGlvbiB3aXRoIHRoZQorCSAgTVRJT0NUT1AgaW9jdGwgKGkuZS4gd2l0aCAibXQgLWYgL2Rldi9xZnQwIHNldGJsayAjQkxLU1oiIGZyb20gdGhlCisJICBzaGVsbCBjb21tYW5kIGxpbmUpLgorCisJICBUaGUgcHJvYmFibHkgbW9zdCBzdHJpa2luZyBkaWZmZXJlbmNlIGJldHdlZW4gemZ0YXBlIGFuZCBwcmV2aW91cworCSAgdmVyc2lvbnMgb2YgZnRhcGUgaXMgdGhlIGZhY3QgdGhhdCBhbGwgZGF0YSBtdXN0IGJlIHdyaXR0ZW4gb3IgcmVhZAorCSAgaW4gbXVsdGlwbGVzIG9mIGEgZml4ZWQgYmxvY2sgc2l6ZS4gVGhlIGJsb2NrIHNpemUgZGVmYXVsdHMgdG8KKwkgIDEwMjQwIHdoaWNoIGlzIHdoYXQgR05VIHRhciB1c2VzLiBUaGUgdmFsdWVzIGZvciB0aGUgYmxvY2sgc2l6ZQorCSAgc2hvdWxkIGJlIGVpdGhlciAxIG9yIG11bHRpcGxlcyBvZiAxMDI0IHVwIHRvIGEgbWF4aW11bSB2YWx1ZSBvZgorCSAgNjM0ODggKGkuZS4gNjIgSykuIElmIHlvdSBzcGVjaWZ5IGAxJyB0aGVuIHpmdGFwZSdzIGJ1aWx0aW4KKwkgIGNvbXByZXNzaW9uIHdpbGwgYmUgZGlzYWJsZWQuCisKKwkgIFJlYXNvbmFibGUgdmFsdWVzIGFyZSBgMTAyNDAnIChHTlUgdGFyJ3MgZGVmYXVsdCBibG9jayBzaXplKSwKKwkgIGA1MTIwJyAoYWZpbydzIGRlZmF1bHQgYmxvY2sgc2l6ZSksIGAzMjc2OCcgKGRlZmF1bHQgYmxvY2sgc2l6ZSBzb21lCisJICBiYWNrdXAgcHJvZ3JhbXMgYXNzdW1lIGZvciBTQ1NJIHRhcGUgZHJpdmVzKSBvciBgMScgKG5vIHJlc3RyaWN0aW9uCisJICBvbiBibG9jayBzaXplLCBidXQgZGlzYWJsZXMgYnVpbHRpbiBjb21wcmVzc2lvbikuCisKK2NvbW1lbnQgIlRoZSBjb21wcmVzc29yIHdpbGwgYmUgYnVpbHQgYXMgYSBtb2R1bGUgb25seSEiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBaRlRBUEUKKworY29uZmlnIFpGVF9DT01QUkVTU09SCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIEZUQVBFIT1uICYmIFpGVEFQRSE9bgorCWRlZmF1bHQgbQorCitjb25maWcgRlRfTlJfQlVGRkVSUworCWludCAiTnVtYmVyIG9mIGZ0YXBlIGJ1ZmZlcnMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0ICIzIgorCWhlbHAKKwkgIFBsZWFzZSBsZWF2ZSB0aGlzIGF0IGAzJyB1bmxlc3MgeW91IFJFQUxMWSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKwkgIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoaXMgdmFsdWUuIFZhbHVlcyBiZWxvdyAzIG1ha2UgdGhlCisJICBwcm9wZXIgdXNlIG9mIGZ0YXBlIGltcG9zc2libGUsIHZhbHVlcyBncmVhdGVyIHRoYW4gMyBhcmUgYSB3YXN0ZSBvZgorCSAgbWVtb3J5LiBZb3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIERNQSBtZW1vcnkgdXNlZCBieSBmdGFwZSBhdAorCSAgcnVudGltZSB3aXRoICJtdCAtZiAvZGV2L3FmdDAgc2V0ZHJ2YnVmZmVyICNOVU1CVUZGRVJTIi4gRWFjaCBidWZmZXIKKwkgIHdhc3RlcyAzMiBLQiBvZiBtZW1vcnkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZW1vcnkgY2Fubm90IGJlCisJICBzd2FwcGVkIG91dC4KKworY29uZmlnIEZUX1BST0NfRlMKKwlib29sICJFbmFibGUgcHJvY2ZzIHN0YXR1cyByZXBvcnQgKCsya2IpIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgUFJPQ19GUworCS0tLWhlbHAtLS0KKwkgIE9wdGlvbmFsLiBTYXlpbmcgWSB3aWxsIHJlc3VsdCBpbiBjcmVhdGlvbiBvZiBhIGRpcmVjdG9yeQorCSAgYC9wcm9jL2Z0YXBlJyB1bmRlciB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uIFRoZSBmaWxlcyBjYW4gYmUgdmlld2VkCisJICB3aXRoIHlvdXIgZmF2b3JpdGUgcGFnZXIgKGkuZS4gdXNlICJtb3JlIC9wcm9jL2Z0YXBlL2hpc3RvcnkiIG9yCisJICAibGVzcyAvcHJvYy9mdGFwZS9oaXN0b3J5IiBvciBzaW1wbHkgImNhdCAvcHJvYy9mdGFwZS9oaXN0b3J5IikuIFRoZQorCSAgZmlsZSB3aWxsIGNvbnRhaW4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc2VydGVkCisJICBjYXJ0cmlkZ2UsIHRoZSBrZXJuZWwgZHJpdmVyLCB5b3VyIHRhcGUgZHJpdmUsIHRoZSBmbG9wcHkgZGlzaworCSAgY29udHJvbGxlciBhbmQgdGhlIGVycm9yIGhpc3RvcnkgZm9yIHRoZSBtb3N0IHJlY2VudCB1c2Ugb2YgdGhlCisJICBrZXJuZWwgZHJpdmVyLiBTYXlpbmcgWSB3aWxsIGVubGFyZ2UgdGhlIHNpemUgb2YgdGhlIGZ0YXBlIGRyaXZlcgorCSAgYnkgYXBwcm94aW1hdGVseSAyIEtCLgorCisJICBXQVJOSU5HOiBXaGVuIGNvbXBpbGluZyBmdGFwZSBhcyBhIG1vZHVsZSAoaS5lLiBzYXlpbmcgTSB0byAiRmxvcHB5CisJICB0YXBlIGRyaXZlIikgaXQgaXMgZGFuZ2Vyb3VzIHRvIHVzZSBmdGFwZSdzIC9wcm9jIGZpbGUgc3lzdGVtCisJICBpbnRlcmZhY2UuIEFjY2Vzc2luZyBgL3Byb2MvZnRhcGUnIHdoaWxlIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQgd2lsbAorCSAgcmVzdWx0IGluIGEga2VybmVsIE9vcHMuIFRoaXMgY2Fubm90IGJlIGZpeGVkIGZyb20gaW5zaWRlIGZ0YXBlLgorCitjaG9pY2UKKwlwcm9tcHQgIkRlYnVnZ2luZyBvdXRwdXQiCisJZGVwZW5kcyBvbiBGVEFQRQorCWRlZmF1bHQgRlRfTk9STUFMX0RFQlVHCisKK2NvbmZpZyBGVF9OT1JNQUxfREVCVUcKKwlib29sICJOb3JtYWwiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gY29udHJvbHMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IHRoZSBmdGFwZSBkcml2ZXIKKwkgIGlzIEFCTEUgdG8gcHJvZHVjZTsgaXQgZG9lcyBub3QgaW5jcmVhc2Ugb3IgZGltaW5pc2ggdGhlIGRlYnVnZ2luZworCSAgbGV2ZWwgaXRzZWxmLiBJZiB1bnN1cmUsIGxlYXZlIHRoaXMgYXQgaXRzIGRlZmF1bHQgc2V0dGluZywKKwkgIGkuZS4gY2hvb3NlICJOb3JtYWwiLgorCisJICBGdGFwZSBjYW4gcHJpbnQgbG90cyBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBjb25zb2xlCisJICByZXNwLiBrZXJuZWwgbG9nIGZpbGVzLiBSZWR1Y2luZyB0aGUgYW1vdW50IG9mIHBvc3NpYmxlIGRlYnVnZ2luZworCSAgb3V0cHV0IHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBtb2R1bGUgYnkgc29tZSBLQiwgc28gaXQgbWlnaHQKKwkgIGJlIGEgZ29vZCBpZGVhIHRvIHVzZSAiTm9uZSIgZm9yIGVtZXJnZW5jeSBib290IGZsb3BwaWVzLgorCisJICBJZiB5b3Ugd2FudCB0byBzYXZlIG1lbW9yeSB0aGVuIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgaXMKKwkgIHJlY29tbWVuZGVkOiBsZWF2ZSB0aGlzIG9wdGlvbiBhdCBpdHMgZGVmYXVsdCBzZXR0aW5nICJOb3JtYWwiIHVudGlsCisJICB5b3Uga25vdyB0aGF0IHRoZSBkcml2ZXIgd29ya3MgYXMgZXhwZWN0ZWQsIGFmdGVyd2FyZHMgcmVjb25maWd1cmUKKwkgIHRoZSBrZXJuZWwsIHRoaXMgdGltZSBzcGVjaWZ5aW5nICJSZWR1Y2VkIiBvciAiTm9uZSIgYW5kIHJlY29tcGlsZQorCSAgYW5kIGluc3RhbGwgdGhlIGtlcm5lbCBhcyB1c3VhbC4gTm90ZSB0aGF0IGNob29zaW5nICJFeGNlc3NpdmUiCisJICBkZWJ1Z2dpbmcgb3V0cHV0IGRvZXMgbm90IGluY3JlYXNlIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dAorCSAgcHJpbnRlZCB0byB0aGUgY29uc29sZSBidXQgb25seSBtYWtlcyBpdCBwb3NzaWJsZSB0byBwcm9kdWNlCisJICAiRXhjZXNzaXZlIiBkZWJ1Z2dpbmcgb3V0cHV0LgorCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gZm9yIGEgc2hvcnQgZGVzY3JpcHRpb24KKwkgIGhvdyB0byBjb250cm9sIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dC4KKworY29uZmlnIEZUX0ZVTExfREVCVUcKKwlib29sICJFeGNlc3NpdmUiCisJaGVscAorCSAgRXh0cmVtZWx5IHZlcmJvc2Ugb3V0cHV0IGZvciBkcml2ZXIgZGVidWdnaW5nIHB1cnBvc2VzLgorCitjb25maWcgRlRfTk9fVFJBQ0UKKwlib29sICJSZWR1Y2VkIgorCWhlbHAKKwkgIFJlZHVjZWQgdGFwZSBkcml2ZXIgZGVidWdnaW5nIG91dHB1dC4KKworY29uZmlnIEZUX05PX1RSQUNFX0FUX0FMTAorCWJvb2wgIk5vbmUiCisJaGVscAorCSAgU3VwcHJlc3MgYWxsIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSB0aGUgdGFwZSBkcml2ZS4KKworZW5kY2hvaWNlCisKK2NvbW1lbnQgIkhhcmR3YXJlIGNvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBGVEFQRQorCitjaG9pY2UKKwlwcm9tcHQgIkZsb3BweSB0YXBlIGNvbnRyb2xsZXJzIgorCWRlcGVuZHMgb24gRlRBUEUKKwlkZWZhdWx0IEZUX1NURF9GREMKKworY29uZmlnIEZUX1NURF9GREMKKwlib29sICJTdGFuZGFyZCIKKwktLS1oZWxwLS0tCisJICBPbmx5IGNoYW5nZSB0aGlzIHNldHRpbmcgaWYgeW91IGhhdmUgYSBzcGVjaWFsIGNvbnRyb2xsZXIuIElmIHlvdQorCSAgZGlkbid0IHBsdWcgYW55IGFkZC1vbiBjYXJkIGludG8geW91ciBjb21wdXRlciBzeXN0ZW0gYnV0IGp1c3QKKwkgIHBsdWdnZWQgdGhlIGZsb3BweSB0YXBlIGNhYmxlIGludG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgZmxvcHB5IGRyaXZlCisJICBjb250cm9sbGVyIHRoZW4geW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHNldHRpbmcsCisJICBpLmUuIGNob29zZSAiU3RhbmRhcmQiLgorCisJICBDaG9vc2UgIk1BQ0gtMiIgaWYgeW91IGhhdmUgYSBNb3VudGFpbiBNYWNoLTIgY29udHJvbGxlci4KKwkgIENob29zZSAiRkMtMTAvRkMtMjAiIGlmIHlvdSBoYXZlIGEgQ29sb3JhZG8gRkMtMTAgb3IgRkMtMjAKKwkgIGNvbnRyb2xsZXIuCisJICBDaG9vc2UgIkFsdC84MjA3OCIgaWYgeW91IGhhdmUgYW5vdGhlciBjb250cm9sbGVyIHRoYXQgaXMgbG9jYXRlZCBhdAorCSAgYW4gSU8gYmFzZSBhZGRyZXNzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFuZGFyZCBmbG9wcHkgZHJpdmUKKwkgIGNvbnRyb2xsZXIncyBiYXNlIGFkZHJlc3Mgb2YgYDB4M2YwJywgb3IgdXNlcyBhbiBJUlEgKGludGVycnVwdCkKKwkgIGNoYW5uZWwgZGlmZmVyZW50IGZyb20gYDYnLCBvciBhIERNQSBjaGFubmVsIGRpZmZlcmVudCBmcm9tCisJICBgMicuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBhbnkgY29udHJvbGxlciBjYXJkIHRoYXQgaXMgYmFzZWQgb24KKwkgIEludGVsJ3MgODIwNzggRkRDIHN1Y2ggYXMgU2VhZ2F0ZSdzLCBFeGFieXRlJ3MgYW5kIElvbWVnYSdzICJoaWdoCisJICBzcGVlZCIgY29udHJvbGxlcnMuCisKKwkgIElmIHlvdSBjaG9vc2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIlN0YW5kYXJkIiB0aGVuIHBsZWFzZSBtYWtlCisJICBzdXJlIHRoYXQgdGhlIHNldHRpbmdzIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzIGFuZCB0aGUgSVJRIGFuZCBETUEKKwkgIGNoYW5uZWwgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbWVudXMgYmVsb3cgYXJlIGNvcnJlY3QuIFVzZSB0aGUgbWFudWFsCisJICBvZiB5b3VyIHRhcGUgZHJpdmUgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHNldHRpbmdzIQorCisJICBJZiB5b3UgYXJlIGFscmVhZHkgc3VjY2Vzc2Z1bGx5IHVzaW5nIHlvdXIgdGFwZSBkcml2ZSB3aXRoIGFub3RoZXIKKwkgIG9wZXJhdGluZyBzeXN0ZW0gdGhlbiB5b3UgZGVmaW5pdGVseSBzaG91bGQgdXNlIHRoZSBzYW1lIHNldHRpbmdzCisJICBmb3IgdGhlIElPIGJhc2UsIHRoZSBJUlEgYW5kIERNQSBjaGFubmVsIHRoYXQgaGF2ZSBwcm92ZW4gdG8gd29yaworCSAgd2l0aCB0aGF0IG90aGVyIE9TLgorCisJICBOb3RlIHRoYXQgdGhpcyBtZW51IGxldHMgeW91IHNwZWNpZnkgb25seSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvcgorCSAgdGhlIGhhcmR3YXJlIHNldHVwLiBUaGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBhdAorCSAgYm9vdCB0aW1lICh3aGVuIGZ0YXBlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgaS5lLiBpZiB5b3UKKwkgIGhhdmUgc2FpZCBZIHRvICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91CisJICBoYXZlIHNhaWQgTSB0byAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KKworCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKKwkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0CisJICBib290IG9yIGxvYWQgdGltZS4gSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgZmxvcHB5IHRhcGUgZHJpdmUgb24gYQorCSAgUENJLWJ1cyBiYXNlZCBzeXN0ZW0sIHBsZWFzZSByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpkcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDST4uCisKK2NvbmZpZyBGVF9NQUNIMgorCWJvb2wgIk1BQ0gtMiIKKworY29uZmlnIEZUX1BST0JFX0ZDMTAKKwlib29sICJGQy0xMC9GQy0yMCIKKworY29uZmlnIEZUX0FMVF9GREMKKwlib29sICJBbHQvODIwNzgiCisKK2VuZGNob2ljZQorCitjb21tZW50ICJDb25zdWx0IHRoZSBtYW51YWxzIG9mIHlvdXIgdGFwZSBkcml2ZSBmb3IgdGhlIGNvcnJlY3Qgc2V0dGluZ3MhIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKKworY29uZmlnIEZUX0ZEQ19CQVNFCisJaGV4ICJJTyBiYXNlIG9mIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKKwlkZWZhdWx0ICIwIgorCS0tLWhlbHAtLS0KKwkgIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBpZiB0aGUgZm9sbG93aW5nIGRlZmF1bHQKKwkgIHNldHRpbmdzIGZvciB0aGUgYmFzZSBJTyBhZGRyZXNzIGFyZSBjb3JyZWN0OgorCSAgPDw8IE1BQ0gtMiAgICAgOiAweDFFMCA+Pj4KKwkgIDw8PCBGQy0xMC9GQy0yMDogMHgxODAgPj4+CisJICA8PDwgU2Vjb25kYXJ5ICA6IDB4MzcwID4+PgorCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBhIHNlY29uZGFyeSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KKwkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcworCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCisJICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQorCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KKwkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCisJICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgSU8gYmFzZS4gVGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm9vdCB0aW1lCisJICAod2hlbiBmdGFwZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGkuZS4gaWYgeW91IHNwZWNpZmllZCBZIHRvCisJICAiRmxvcHB5IHRhcGUgZHJpdmUiKSBvciBtb2R1bGUgbG9hZCB0aW1lIChpLmUuIGlmIHlvdSBoYXZlIHNhaWQgTSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCisKKwkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCisJICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAorCSAgYm9vdCBvciBsb2FkIHRpbWUuCisKK2NvbmZpZyBGVF9GRENfSVJRCisJaW50ICJJUlEgY2hhbm5lbCBvZiB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEZUQVBFICYmICFGVF9TVERfRkRDCisJZGVmYXVsdCAiMCIKKwktLS1oZWxwLS0tCisJICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBkZWZhdWx0CisJICBzZXR0aW5ncyBmb3IgdGhlIGludGVycnVwdCBjaGFubmVsIGFyZSBjb3JyZWN0OgorCSAgPDw8IE1BQ0gtMiAgICAgOiA2ID4+PgorCSAgPDw8IEZDLTEwL0ZDLTIwOiA5ID4+PgorCSAgPDw8IFNlY29uZGFyeSAgOiA2ID4+PgorCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBzZWNvbmRhcnkgYSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KKwkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcworCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCisJICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQorCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KKwkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCisJICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgSVJRIGNoYW5uZWwuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QKKwkgIHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdSBzYWlkIFkgdG8KKwkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IHNhaWQgTSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCisKKwkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCisJICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAorCSAgYm9vdCBvciBsb2FkIHRpbWUuCisKK2NvbmZpZyBGVF9GRENfRE1BCisJaW50ICJETUEgY2hhbm5lbCBvZiB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEZUQVBFICYmICFGVF9TVERfRkRDCisJZGVmYXVsdCAiMCIKKwktLS1oZWxwLS0tCisJICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBkZWZhdWx0CisJICBzZXR0aW5ncyBmb3IgdGhlIERNQSBjaGFubmVsIGFyZSBjb3JyZWN0OgorCSAgPDw8IE1BQ0gtMiAgICAgOiAyID4+PgorCSAgPDw8IEZDLTEwL0ZDLTIwOiAzID4+PgorCSAgPDw8IFNlY29uZGFyeSAgOiAyID4+PgorCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBhIHNlY29uZGFyeSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KKwkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcworCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCisJICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQorCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KKwkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCisJICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgRE1BIGNoYW5uZWwuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QKKwkgIHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdSBzYWlkIFkgdG8KKwkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IHNhaWQgTSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCisKKwkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCisJICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAorCSAgYm9vdCBvciBsb2FkIHRpbWUuCisKK2NvbmZpZyBGVF9GRENfVEhSCisJaW50ICJEZWZhdWx0IEZJRk8gdGhyZXNob2xkIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCAiOCIKKwloZWxwCisJICBTZXQgdGhlIEZJRk8gdGhyZXNob2xkIG9mIHRoZSBGREMuIElmIHRoaXMgaXMgaGlnaGVyIHRoZSBETUEKKwkgIGNvbnRyb2xsZXIgbWF5IHNlcnZlIHRoZSBGREMgYWZ0ZXIgYSBoaWdoZXIgbGF0ZW5jeSB0aW1lLiBJZiB0aGlzIGlzCisJICBsb3dlciwgZmV3ZXIgRE1BIHRyYW5zZmVycyBvY2N1ciBsZWFkaW5nIHRvIGxlc3MgYnVzIGNvbnRlbnRpb24uCisJICBZb3UgbWF5IHRyeSB0byB0dW5lIHRoaXMgaWYgZnRhcGUgYW5ub3lzIHlvdSB3aXRoICJyZWR1Y2VkIGRhdGEKKwkgIHJhdGUgYmVjYXVzZSBvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIG1lc3NhZ2VzLiBIb3dldmVyLCB0aGlzCisJICBkb2Vzbid0IHNlZW0gdG8gaGF2ZSB0b28gbXVjaCBlZmZlY3QuCisKKwkgIElmIHVuc3VyZSwgZG9uJ3QgdG91Y2ggdGhlIGluaXRpYWwgdmFsdWUsIGkuZS4gbGVhdmUgaXQgYXQgIjgiLgorCitjb25maWcgRlRfRkRDX01BWF9SQVRFCisJaW50ICJNYXhpbWFsIGRhdGEgcmF0ZSB0byB1c2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0ICIyMDAwIgorCS0tLWhlbHAtLS0KKwkgIFdpdGggc29tZSBtb3RoZXJib2FyZC9GREMgY29tYmluYXRpb25zIGZ0YXBlIHdpbGwgbm90IGJlIGFibGUgdG8KKwkgIHJ1biB5b3VyIEZEQy90YXBlIGRyaXZlIGNvbWJpbmF0aW9uIGF0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZQorCSAgc3BlZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgeW91J2xsIGVuY291bnRlciAicmVkdWNlZCBkYXRhIHJhdGUKKwkgIGJlY2F1c2Ugb2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIiBtZXNzYWdlcyBhbmQgbG90cyBvZiByZXRyaWVzCisJICBiZWZvcmUgZnRhcGUgZmluYWxseSBkZWNpZGVzIHRvIHJlZHVjZSB0aGUgZGF0YSByYXRlLgorCisJICBJbiB0aGlzIGNhc2UgaXQgbWlnaHQgYmUgZGVzaXJhYmxlIHRvIHRlbGwgZnRhcGUgYmVmb3JlaGFuZCB0aGF0CisJICBpdCBuZWVkIG5vdCB0cnkgdG8gcnVuIHRoZSB0YXBlIGRyaXZlIGF0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZQorCSAgc3BlZWQuIElmIHVuc3VyZSwgbGVhdmUgdGhpcyBkaXNhYmxlZCwgaS5lLiBsZWF2ZSBpdCBhdCAyMDAwCisJICBiaXRzL3NlYy4KKworY29uZmlnIEZUX0FMUEhBX0NMT0NLCisJaW50ICJDUFUgY2xvY2sgZnJlcXVlbmN5IG9mIHlvdXIgREVDIEFscGhhIiBpZiBBTFBIQQorCWRlcGVuZHMgb24gRlRBUEUKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIE9uIHNvbWUgREVDIEFscGhhIG1hY2hpbmVzIHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGNhbm5vdCBiZQorCSAgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LCBzbyB5b3UgbmVlZCB0byBzcGVjaWZ5IGl0IGhlcmUgT05MWSBpZgorCSAgcnVubmluZyBhIERFQyBBbHBoYSwgb3RoZXJ3aXNlIHRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0LgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2N2QyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI4IEBACisjCisjICAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cyBIZWluZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvTWFrZWZpbGUsdiAkCisjICRSZXZpc2lvbjogMS40ICQKKyMgJERhdGU6IDE5OTcvMTAvMDUgMTk6MTc6NTYgJAorIworIyAgICAgIE1ha2VmaWxlIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yCisjICAgICAgTGludXguCisjCisKK29iai0kKENPTkZJR19GVEFQRSkJCSs9IGxvd2xldmVsLworb2JqLSQoQ09ORklHX1pGVEFQRSkJCSs9IHpmdGFwZS8KK29iai0kKENPTkZJR19aRlRfQ09NUFJFU1NPUikJKz0gY29tcHJlc3Nvci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJIGIvZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkZTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJCkBAIC0wLDAgKzEsODEgQEAKK1NvbWUgbm90ZXMgZm9yIGZ0YXBlIHVzZXJzIHdpdGggUENJIG1vdGhlcmJvYXJkczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHByb2JsZW06CistLS0tLS0tLS0tLS0KKworVGhlcmUgaGF2ZSBiZWVuIHNvbWUgcHJvYmxlbSByZXBvcnRzIGZyb20gcGVvcGxlIHVzaW5nIFBDSS1idXMgYmFzZWQKK3N5c3RlbXMgZ2V0dGluZyBvdmVycnVuIGVycm9ycy4KK0kgd2Fzbid0IGFibGUgdG8gcmVwcm9kdWNlIHRoZXNlIHVudGlsIEkgcmFuIGZ0YXBlIG9uIGEgSW50ZWwgUGxhdG8KKyhQcmVtaWVyZSBQQ0kgSUkpIG1vdGhlcmJvYXJkIHdpdGggYmlvcyB2ZXJzaW9uIDEuMDAuMDhBWDEuCitJdCB0dXJuZWQgb3V0IHRoYXQgaWYgR0FUIChHdWFyYW50ZWVkIEFjY2VzcyBUaW1pbmcpIGlzIGVuYWJsZWQgKD8pCitmdGFwZSBnZXRzIGEgbG90IG9mIG92ZXJydW4gZXJyb3JzLgorVGhlIHByb2JsZW0gZGlzYXBwZWFycyB3aGVuIGRpc2FibGluZyBHQVQgaW4gdGhlIGJpb3MuCitOb3RlIHRoYXQgSW50ZWwgcmVtb3ZlZCB0aGlzIHNldHRpbmcgKHBlcm1hbmVudGx5IGRpc2FibGVkKSBmcm9tIHRoZQorMS4wMC4xMEFYMSBiaW9zICEKKworSXQgbG9va3MgbGlrZSB0aGF0IGlmIEdBVCBpcyBlbmFibGVkIHRoZXJlIGFyZSBvZnRlbiBsYXJnZSBwZXJpb2RzCisoZ3JlYXRlciB0aGFuIDEyMCB1cyAhPz8pIG9uIHRoZSBJU0EgYnVzIHRoYXQgdGhlIERNQSBjb250cm9sbGVyIGNhbm5vdAorc2VydmljZSB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlci4KK0kgY2Fubm90IGltYWdpbmUgdGhpcyBiZWluZyBhY2NlcHRhYmxlIGluIGEgZGVjZW50IFBDSSBpbXBsZW1lbnRhdGlvbi4KK01heWJlIHRoaXMgaXMgYSBgZmVhdHVyZScgb2YgdGhlIGNoaXBzZXQuIEkgY2FuIG9ubHkgc3BlY3VsYXRlIHdoeQorSW50ZWwgY2hvb3NlIHRvIHJlbW92ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGxhdGVzdCBCaW9zLi4uCisKK1RoZSBsZXNzb24gb2YgdGhpcyBhbGwgaXMgdGhhdCB0aGVyZSBtYXkgYmUgb3RoZXIgbW90aGVyYm9hcmQKK2ltcGxlbWVudGF0aW9ucyBoYXZpbmcgdGhlIHNhbWUgb2Ygc2ltaWxhciBwcm9ibGVtcy4KK0lmIHlvdSBleHBlcmllbmNlIGEgbG90IG9mIG92ZXJydW4gZXJyb3JzIGR1cmluZyBhIGJhY2t1cCB0byB0YXBlLAorc2VlIGlmIHRoZXJlIGlzIHNvbWUgc2V0dGluZyBpbiB0aGUgQmlvcyB0aGF0IG1heSBpbmZsdWVuY2UgdGhlCitidXMgdGltaW5nLgorCitJIGp1ZGdlIHRoaXMgYSBoYXJkd2FyZSBwcm9ibGVtIGFuZCBub3QgYSBsaW1pdGF0aW9uIG9mIGZ0YXBlIDstKQorTXkgRE9TIGJhY2t1cCBzb2Z0d2FyZSBzZWVtcyB0byBiZSBzdWZmZXJpbmcgZnJvbSB0aGUgc2FtZSBwcm9ibGVtcworYW5kIGV2ZW4gcmVmdXNlcyB0byBydW4gYXQgMSBNYnBzICEKK0Z0YXBlIHdpbGwgcmVkdWNlIHRoZSBkYXRhLXJhdGUgZnJvbSAxIE1icHMgdG8gNTAwIEticHMgaWYgdGhlIG51bWJlcgorb2Ygb3ZlcnJ1biBlcnJvcnMgb24gYSB0cmFjayBleGNlZWRzIGEgdGhyZXNob2xkLgorCisKK1Bvc3NpYmxlIHNvbHV0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSBvZiB0aGUgcHJvYmxlbXMgd2VyZSBzb2x2ZWQgYnkgdXBncmFkaW5nIHRoZSAoZmxhc2gpIGJpb3MuCitPdGhlciBzdWdnZXN0IHRoYXQgaXQgaGFzIHRvIGRvIHdpdGggdGhlIEZEQyBiZWluZyBvbiB0aGUgUENJCitidXMsIGJ1dCB0aGF0IGlzIG5vdCB0aGUgY2FzZSB3aXRoIHRoZSBJbnRlbCBQcmVtaWVyZSBJSSBib2FyZHMuCitbSWYgdXBncmFkaW5nIHRoZSBiaW9zIGRvZXNuJ3Qgc29sdmUgdGhlIHByb2JsZW0geW91IGNvdWxkIHRyeQorYSBmbG9wcHkgZGlzayBjb250cm9sbGVyIG9uIHRoZSBpc2EtYnVzXS4KKworSGVyZSBpcyBhIGxpc3Qgb2Ygc3lzdGVtcyBhbmQgcmVjb21tZW5kZWQgQklPUyBzZXR0aW5nczoKKworCisgICAgICAgIEludGVsIFByZW1pZXJlIFBDSSAoUmV2ZW5nZSk6CisKK0Jpb3MgdmVyc2lvbiAxLjAwLjA5LkFGMiBpcyByZXBvcnRlZCB0byB3b3JrLgorCisKKworICAgICAgICBJbnRlbCBQcmVtaWVyZSBQQ0kgSUkgKFBsYXRvKToKKworQmlvcyB2ZXJzaW9uIDEuMDAuMTAuQVgxIGFuZCB2ZXJzaW9uIDExIGJldGEgYXJlIG9rLgorSWYgdXNpbmcgdmVyc2lvbiAxLjAwLjA4LkFYMSwgR0FUIG11c3QgYmUgZGlzYWJsZWQgIQorCisKKworICAgICAgICBBU1VTIFBDSS9JLVNQM0c6CisKK1ByZWZlcnJlZCBzZXR0aW5nczogICAgIElTQS1HQVQtbW9kZSA6IGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgICAgICBETUEtbGluZWJ1ZmZlci1tb2RlIDogc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQS1tYXN0ZXJidWZmZXItbW9kZSA6IHN0YW5kYXJkCisKKworICAgICAgICBERUxMIERpbWVuc2lvbiBYUFMgUDkwCisKK0Jpb3MgdmVyc2lvbiBBMiBpcyByZXBvcnRlZCB0byBiZSBicm9rZW4sIHdoaWxlIGJpb3MgdmVyc2lvbiBBNSB3b3Jrcy4KK1lvdSBjYW4gZ2V0IGEgZmxhc2ggYmlvcyB1cGdyYWRlIGZyb20gaHR0cDovL3d3dy5kZWxsLmNvbQorCisKK1RvIHNlZSBpZiB5b3UncmUgaGF2aW5nIHRoZSBHQVQgcHJvYmxlbSwgdHJ5IG1ha2luZyBhIGJhY2t1cAordW5kZXIgRE9TLiBJZiBpdCdzIHZlcnkgc2xvdyBhbmQgb2Z0ZW4gcmVwb3NpdGlvbnMgeW91J3JlCitwcm9iYWJseSBoYXZpbmcgdGhpcyBwcm9ibGVtLgorCisgICAgICAgICAgICAgICAgICAgICAgICAtLS8vLS0KKyBMb2NhbFdvcmRzOiAgZnRhcGUgUENJIGJpb3MgR0FUIElTQSBETUEgY2hpcHNldCBNYnBzIEticHMgRkRDIGlzYSBBRiBvayBBU1VTCisgTG9jYWxXb3JkczogIFNQIGxpbmVidWZmZXIgbWFzdGVyYnVmZmVyIFhQUyBodHRwIHd3dyBjb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9SRUxFQVNFLU5PVEVTIGIvZHJpdmVycy9jaGFyL2Z0YXBlL1JFTEVBU0UtTk9URVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3OTlkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9SRUxFQVNFLU5PVEVTCkBAIC0wLDAgKzEsOTY2IEBACitIZXksIEVtYWNzLCB3ZSdyZSAtKi1UZXh0LSotIG1vZGUhCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRkIDI1LzExLzk3ID09PT09CistIFRoZSBjb3JyZWN0IHByZS1wcm9jZXNzb3Igc3RhdGVtZW50IGZvciAiZWxzZSBpZiIgaXMgIiNlbGlmIiBub3QKKyAgImVsc2lmIi4KKy0gTmVlZCB0byBjYWxsIHpmdF9yZXNldF9wb3NpdGlvbigpIHdoZW4gb3ZlcndyaXRpbmcgY2FydHJpZGdlcworICBwcmV2aW91c2x5IHdyaXR0ZW4gd2l0aCBmdGFwZS0yLngsIHNmdGFwZSwgb3IgYW5jaWVudAorICAocHJlLWZ0YXBlLTMueCkgdmVyc2lvbnMgb2YgemZ0YXBlLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjA0YyAxNi8xMS85NyA9PT09PQorLSBmZGNfcHJvYmUoKSB3YXMgY2FsbGluZyBEVU1QUkVHUyB3aXRoIGEgcmVzdWx0IGxlbmd0aCBvZiAiMSIgd2hpY2gKKyAgd2FzIGp1c3QgZmluZS4gVW5kbyBwcmV2aW91cyBjaGFuZ2UuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRiIDE0LzExLzk3ID09PT09CisKKy0gcGF0Y2hlcy8yLngueC9mbG9wcHkuYy5kaWZmIHdhcyBzb21ld2hhdCBicm9rZW4sIHJlbGVhc2luZyBpL28KKyAgcmVnaW9ucyBpdCBuZXZlciBoYWQgYWxsb2NhdGVkLgorLSBmZGNfcHJvYmUoKSB3YXMgY2FsbGluZyBEVU1QUkVHUyB3aXRoIGEgcmVzdWx0IGxlbmd0aCBvZiAiMSIgaW5zdGVhZAorICBvZiAiMTAiCistIFdyaXRpbmcgZGVsZXRlZCBkYXRhIG1hcmtzIGlmIHRoZSBmaXJzdCBzZWdlbnRzIG9uIHRyYWNrIHplcm8gYXJlCisgIHNob3VsZCB3b3JrIG5vdy4KKy0gZnRmb3JtYXQgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgdGFwZQorICBkcml2ZSBzZXRzIHRoZSByZWFkIG9ubHkgc3RhdHVzIGJpdCAoUUlDLTQwLzgwIGNhcnRyaWRnZXMgd2l0aAorICBRSUMtMzAxMC8zMDIwIHRhcGUgZHJpdmVzKSBiZWNhdXNlIHRoZSBoZWFkZXIgc2VnbWVudCBpcyBkYW1hZ2VkLgorLSB0aGUgTVRJT0NGVENNRCBpb2N0bCBtYXkgbm93IGJlIGlzc3VlZCBieSB0aGUgc3VwZXJ1c2VyIE9OTFkuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRhIDEyLzExLzk3ID09PT09CistIEZpeCBhbiAiaW5maW5pdGUgbG9vcCBjYW4ndCBiZSBraWxsZWQgYnkgc2lnbmFsIiBidWcgaW4KKyAgZnRhcGVfZ2V0X2RyaXZlX3N0YXR1cygpLiBPbmx5IHJlbGV2YW50IHdoZW4gdHJ5aW5nIHRvIGFjY2VzcworICBidWdneS9taXNjb25maWd1cmVkIGhhcmR3YXJlCistIFRyeSB0byBjb21wZW5zYXRlIGEgYnVnIGluIHRoZSBIUCBDb2xvcmFkbyBUMzAwMCdzIGZpcm13YXJlOiBpdAorICBkb2Vzbid0IHNldCB0aGUgd3JpdGUgcHJvdGVjdCBiaXQgZm9yIFFJQzgwL1FJQzQwIGNhcnRyaWRnZXMuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDQgMDYvMTEvOTcgPT09PT0KKy0gSWYgcG9zaXRpb25pbmcgd2l0aCBmYXN0IHNlZWtpbmcgZmFpbHMgZmFsbCBiYWNrIHRvIGEgc2xvdyBzZWVrCisgIGJlZm9yZSBnaXZpbmcgdXAuCistIChuZWFybHkpIG5vIHJldHJpZXMgb24gIm5vIGRhdGEgZXJyb3JzIiB3aGVuIHZlcmlmeWluZyBhZnRlcgorICBmb3JtYXR0aW5nLiBJbXByb3ZlZCB0dW5pbmcgb2YgdGhlIGJhZCBzZWN0b3IgbWFwIGFmdGVyIGZvcm1hdHRpbmcuCistIHRoZSBkaXJlY3RvcnkgbGF5b3V0IGhhcyBjaGFuZ2VkIGFnYWluIHRvIGFsbG93IGZvciBlYXNpZXIga2VybmVsCisgIGludGVncmF0aW9uCistIE1vZHVsZSBwYXJhbWV0ZXIgImZ0YXBlX3RyYWNpbmciIG5vdyBpcyBjYWxsZWQgImZ0X3RyYWNpbmciIGJlY2F1c2UKKyAgdGhlICJmdGFwZV90cmFjaW5nIiB2YXJpYWJsZSBoYXMgdGhlIHZlcnNpb24gY2hlY2tzdW0gYXR0YWNoZWQgdG8gaXQuCistIGAvcHJvYy9mdGFwZScgaW50ZXJmYWNlIGZvciAyLjAuKiBrZXJuZWxzLiBgL3Byb2MvZnRhcGUnIG5vIGxvbmdlcgorICBpcyBhIGRpcmVjdG9yeSBidXQgYSBmaWxlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBmb3JtZXJseQorICBwcm92aWRlZCBpbiBzZXBhcmF0ZSBmaWxlcyB1bmRlciB0aGUgYC9wcm9jL2Z0YXBlLycgZGlyZWN0b3J5LgorLSBNb3N0IG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaGF2ZSBiZWVuIHByZWZpeGVkIGJ5ICJDT05GSUdfRlRfIgorICBpbiBwcmVwYXJhdGlvbiBvZiB0aGUga2VybmVsIGluY2x1c2lvbi4gVGhlIE1ha2VmaWxlcyB1bmRlcgorICAiLi9mdGFwZS8iIHNob3VsZCBiZSBkaXJlY3RseSB1c2FibGUgYnkgdGhlIGtlcm5lbC4KKy0gVGhlIE1PRFZFUlNJT05TIHN0dWZmIGlzIG5vdyBhdXRvLWRldGVjdGVkLgorLSBCcm9rZSBiYWNrc2xhc2hlZCBtdWx0aSBsaW5lIG9wdGlvbnMgaW4gTUNPTkZJRyBpbnRvIHNlcGFyYXRlIGxpbmVzCisgIHVzaW5nIEdOVS1tYWtlJ3MgIis9IiBmZWF0dXJlLgorLSBUaGUgaHRtbCBhbmQgZHZpIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBpcyBub3cgaW5zdGFsbGVkIHVuZGVyCisgICcvdXNyL2RvYy9mdGFwZWAgd2l0aCAnbWFrZSBpbnN0YWxsYAorLSBOZXcgU01QIGRlZmluZSBpbiBNQ09ORklHLiBmdGFwZSB3b3JrcyB3aXRoIFNNUCBpZiB0aGlzIGlzIGRlZmluZWQuCistIGF0dGVtcHQgdG8gY29wZSB3aXRoICJleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIGJ5IGdyYWR1YWxseQorICBpbmNyZWFzaW5nIEZEQyBGSUZPIHRocmVzaG9sZC4gQnV0IHRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgdG9vCisgIG11Y2ggYW4gZWZmZWN0LgorLSBOZXcgbG9hZCB0aW1lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICJmdF9mZGNfcmF0ZV9saW1pdCIuIElmIHlvdQorICBlbmNvdW50ZXIgdG9vIG1hbnkgb3ZlcnJ1biBlcnJvcnMgd2l0aCBhIDJNYiBjb250cm9sbGVyIHRoZW4geW91CisgIG1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgdG8gMTAwMC4KKy0gb3ZlcnJ1biBlcnJvcnMgb24gdGhlIGxhc3Qgc2VjdG9yIGluIGEgc2VnbWVudCBzb21ldGltZXMgcmVzdWx0IGluCisgIGEgemVybyBETUEgcmVzaWR1ZS4gRHVubm8gd2h5LCBidXQgY29tcGVuc2F0ZSBmb3IgaXQuCistIHRoZXJlIHdlcmUgc3RpbGwgZmRjX3JlYWQoKSB0aW1lb3V0IGVycm9ycy4gSSB0aGluayBJIGhhdmUgZml4ZWQgaXQKKyAgbm93LCBwbGVhc2UgRklYTUUuCistIFNvbWV0aW1lcyBmdGFwZV93cml0ZSgpIGZhaWxlZCB0byByZS1zdGFydCB0aGUgdGFwZSBkcml2ZSB3aGVuIGEKKyAgc2VnbWVudCB3aXRob3V0IGEgZ29vZCBzZWN0b3Igd2FzIHJlYWNoZWQgKCJ3YWl0IGZvciBlbXB0eSBzZWdtZW50CisgIGZhaWxlZCIpLiBUaGlzIGlzIGZpeGVkLiBFc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgPiBRSUMtMzAxMC4KKy0gc2Z0YXBlIChha2EgZnRhcGUtMi54KSBoYXMgdmFuaXNoZWQuIEkgZGlkbid0IHdvcmsgb24gaXQgZm9yCisgIGFnZXMuIEl0IGlzIHByb2JhYmx5IHN0aWxsIHBvc3NpYmxlIHRvIHVzZSB0aGUgb2xkIGNvZGUgd2l0aAorICBmdGFwZS0zLjA0LCBpZiBvbmUgcmVhbGx5IG5lZWRzIGl0IChCVVQgUkVDT01QSUxFIElUKQorLSB6ZnRhcGUgbm8gbG9uZ2VyIGFsdGVycyB0aGUgY29udGVudHMgb2YgYWxyZWFkeSBleGlzdGluZyB2b2x1bWUKKyAgdGFibGUgZW50cmllcywgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gZmlsbCBpbiBtaXNzaW5nIGZpZWxkcywKKyAgbGlrZSB0aW1lIHN0YW1wcyB1c2luZyBzb21lIHVzZXIgc3BhY2UgcHJvZ3JhbS4KKy0gLi9jb250cmliL3Z0YmxjLyBjb250YWlucyBzdWNoIGEgcHJvZ3JhbS4KKy0gbmV3IHBlcmwgc2NyaXB0IC4vY29udHJpYi9zY3JpcHRzL2xpc3R0YXBlIHRoYXQgbGlzdCB0aGUgY29udGVudHMgb2YgYQorICBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2UgcGFyc2luZyB0aGUgb3V0cHV0IG9mICJtdCB2b2xpbmZvIiArICJtdCBmc2YiCistIHRoZSBNVFdFT0YgaW1wbGVtZW50YXRpb24gaGFzIGNoYW5nZWQgYSBsaXR0bGUgYml0IChhZnRlciBJIGhhZCBhCisgIGxvb2sgYXQgYW1hbmRhKS4gQ2FsbGluZyBNVFdFT0Ygd2hpbGUgdGhlIHRhcGUgaXMgc3RpbGwgaGVsZCBvcGVuCisgIGFmdGVyIHdyaXRpbmcgc29tZXRoaW5nIHRvIHRoZSB0YXBlIG5vdyB3aWxsIHRlcm1pbmF0ZSB0aGUgY3VycmVudAorICB2b2x1bWUsIGFuZCBzdGFydCBhIG5ldyBvbmUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCistIHRoZSB2b2x1bWUgdGFibGUgbWFpbnRhaW5lZCBieSB6ZnRhcGUgbm93IGlzIGEgZG91Ymx5IGxpbmtlZCBsaXN0CisgIHRoYXQgZ3Jvd3MgZHluYW1pY2FsbHkgYXMgbmVlZGVkLgorCisgIGZvcm1hdHRpbmcgZmxvcHB5IHRhcGUgY2FydHJpZGdlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiB0aGVyZSBpcyBhIG5ldyB1c2VyIHNwYWNlIGZvcm1hdHRpbmcgcHJvZ3JhbSB0aGF0IGRvZXMgbW9zdCBvZiB0aGUKKyAgICBkaXJ0eSB3b3JrIGluIHVzZXIgc3BhY2UgKGF1dG8tZGV0ZWN0LCBjb21wdXRpbmcgdGhlIHNlY3RvcgorICAgIGNvb3JkaW5hdGVzLCBhZGp1c3RpbmcgdGltZSBzdGFtcHMgYW5kIHN0YXRpc3RpY3MpLiBJdCBoYXMgYQorICAgIHNpbXBsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgorICAqIGZ0YXBlLWZvcm1hdC5vIGhhcyB2YW5pc2hlZCwgaXQgaGFzIGJlZW4gZm9sZGVkIGludG8gdGhlIGxvdyBsZXZlbAorICAgIGZ0YXBlLm8gbW9kdWxlLCBhbmQgdGhlIGlvY3RsIGludGVyZmFjZSBpbnRvIHpmdGFwZS5vLiBNb3N0IG9mIHRoZQorICAgIGNvbXBsaWNhdGVkIHN0dWZmIGhhcyBiZWVuIG1vdmVkIHRvIHVzZXIgc3BhY2UsIHNvIHRoZXJlIHdhcyBubworICAgIG5lZWQgZm9yIGEgc2VwYXJhdGUgbW9kdWxlIGFueW1vcmUuCisgICogdGhlcmUgaXMgYSBuZXcgaW9jdGwgTVRJT0NGVENNRCB0aGF0IHNlbmRzIGEgYmFyZSBRSUMtMTE3IGNvbW1hbmQKKyAgICB0byB0aGUgdGFwZSBkcml2ZS4KKyAgKiB0aGVyZSBpcyBhIG5ldyBtbWFwKCkgZmVhdHVyZSB0byBtYXAgdGhlIGRtYSBidWZmZXJzIGludG8gdXNlcgorICAgIHNwYWNlIHRvIGJlIHVzZWQgYnkgdGhlIHVzZXIgbGV2ZWwgZm9ybWF0dGluZyBwcm9ncmFtLgorICAqIEZvcm1hdHRpbmcgb2YgeWV0IHVuZm9ybWF0dGVkIG9yIHRvdGFsbHkgZGVnYXVzc2VkIGNhcnRyaWRnZXMKKyAgICBzaG91bGQgYmUgcG9zc2libGUgbm93LiBGSVhNRS4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wM2IsIDxmb3Jnb3QgdGhlIGV4YWN0IGRhdGU+ID09PT0KKworZnRhcGUtMy4wM2Igd2FzIHJlbGVhc2VkIGFzIGEgYmV0YSByZWxlYXNlIG9ubHkuIEl0cyBtYWluIG5ldyBmZWF0dXJlCit3YXMgc3VwcG9ydCBvZiB0aGUgRElUVE8tMkdCIGRyaXZlLiBUaGlzIHdhcyBtYWRlIHBvc3NpYmxlIGJ5IHJldmVyc2UKK2VuZ2luZWVyaW5nIGRvbmUgYnkgPGZpbGwgaW4gaGlzIG5hbWU+IGFmdGVyIElvbWVnYSBmYWlsZWQgdG8gc3VwcG9ydAorZnRhcGUuIEFsdGhvdWdoIHRoZXkgaGFkIHByb21pc2VkIHRvIGRvIHNvICh0aGlzIG1ha2VzIG1lIGZlZWwgYSBiaXQKK3NhZCBhbmQgdW5jb21mb3J0YWJsZSBhYm91dCBJb21lZ2EpLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzYSwgMjIvMDUvOTcgPT09PQorCistIEZpbmFsbHkgZml4ZWQgYXV0by11bi1sb2FkaW5nIG9mIG1vZHVsZXMgZm9yIGtlcm5lbHMgPiAyLjEuMTgKKy0gQWRkIGFuICJ1bmluc3RhbGwiIHRhcmdldCB0byB0aGUgTWFrZWZpbGUKKy0gcmVtb3ZlZCB0aGUga2R0aW1lIGhhY2sKKy0gdGV4aTJ3d3cgZGlkbid0IHByb3Blcmx5IHNldCB0aGUgYmFjay1yZWZlcmVuY2UgZnJvbSBhIGZvb3Rub3RlIGJhY2sKKyAgdG8gdGhlIHJlZ3VsYXIgdGV4dC4KKworICB6ZnRhcGUgc3BlY2lmaWMKKyAgLS0tLS0tLS0tLS0tLS0tCisgICogaGlkZSB0aGUgb2xkIGNvbXByZXNzaW9uIG1hcCB2b2x1bWUuIFRhcGVyIGRvZXNuJ3QgYWNjZXB0IHRoZQorICAgIHByZXNlbmNlIG9mIG5vbi1UYXBlciB2b2x1bWVzIGFuZCBUYXBlci13cml0dGVuIHZvbHVtZSBvbiB0aGUgc2FtZQorICAgIHRhcGUuCisgICogRU9EIChFbmQgT2YgRGF0YSkgaGFuZGxpbmcgd2FzIHN0aWxsIGJyb2tlbjogdGhlIGV4cGVjdGVkIGJlaGF2aW9yCisgICAgaXMgdG8gcmV0dXJuIGEgemVybyBieXRlIGNvdW50IGF0IHRoZSBmaXJzdCBhdHRlbXB0IHRvIHJlYWQgcGFzdAorICAgIEVPRCwgcmV0dXJuIGEgemVybyBieXRlIGNvdW50IGF0IHRoZSBzZWNvbmQgYXR0ZW1wdCB0byByZWFkIHBhc3QKKyAgICBFT0QgYW5kIFRIRU4gcmV0dXJuIC1FSU8uCisgIAorICBmdGFwZS1mb3JtYXQgc3BlY2lmaWMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogRGV0ZWN0aW9uIG9mIFFJQy00MCBjYXJ0cmlkZ2VzIGluIHNlbGVjdF90YXBlX2Zvcm1hdCgpIHdhcyBicm9rZW4KKyAgICBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIGZvcm1hdCBRSUMtMzAxMC8zMDIwIGNhcnRyaWRnZXMuCisgICogVGhlcmUgYXJlIHN0cmFuZ2UgIlRSLTEgRXh0cmEiIGNhcnRyaWRnZXMgb3V0IHRoZXJlIHdoaWNoIHdlcmVuJ3QKKyAgICBkZXRlY3RlZCBwcm9wZXJseSBiZWNhdXNlIHRoZSBkb24ndCBzdHJpY3RseSBjb25mb3JtIHRvIHRoZQorICAgIFFJQy04MCwgUmV2LiBOLCBzcGVjLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzLCAzMC8wNC85NyA9PT09PQorCistIFJlbW92ZWQga2VybmVsIGludGVncmF0aW9uIGNvZGUgZnJvbSB0aGUgcGFja2FnZS4gSSBwbGFuIHRvIHByb3ZpZGUKKyAgYSBwYWNrYWdlIHRoYXQgY2FuIGJlIGludGVncmF0ZWQgaW50byB0aGUgc3RvY2sga2VybmVsIHNlcGFyYXRlbHkKKyAgKGhvcGVmdWxseSBzb29uKS4KKyAgQXMgYSByZXN1bHQsIGEgc2ltcGxlIGBtYWtlJyBjb21tYW5kIG5vdyB3aWxsIGJ1aWxkIGV2ZXJ5dGhpbmcuCistIEFMTCBjb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZmlsZQorICBgTUNPTkZJRycuCistIFF1aXRlIGEgZmV3IGBsb3cgbGV2ZWwnIGNoYW5nZXMgdG8gYWxsb3cgZm9ybWF0dGluZyBvZiBjYXJ0cmlkZ2VzLgorLSBmb3JtYXR0aW5nIGlzIGltcGxlbWVudGVkIGFzIGEgc2VwYXJhdGUgbW9kdWxlIGBmdGFwZS1mb3JtYXQubycuIFRoZQorICBtb2RpZmllZCBgbXQnIHByb2dyYW0gY29udGFpbnMgc2FtcGxlIGNvZGUgdGhhdCBzaG93cyBob3cgdG8gdXNlIGl0LgorLSBUaGUgVkZTIGludGVyZmFjZSBoYXMgYmVlbiBtb3ZlZCBmcm9tIHRoZSBgZnRhcGUubycgbW9kdWxlIHRvIHRoZQorICBoaWdoIGxldmVsIG1vZHVsZXMgYHpmdGFwZS5vJyByZXNwLiBgc2Z0YXBlLm8nLiBgZnRhcGUubycgY29udGFpbnMKKyAgdGhlIGhhcmR3YXJlIHN1cHBvcnQgb25seS4KKy0gQSBiaXQgb2YgL3Byb2Mgc3VwcG9ydCBmb3Iga2VybmVscyA+IDIuMS4yOAorLSBNb3ZlZCBkb2N1bWVudGF0aW9uIHRvIERvYyBzdWJkaXIuIElOU1RBTEwgbm93IGNvbnRhaW5zIHNvbWUgcmVhbAorICBpbnN0YWxsYXRpb24gbm90ZXMuCistIGBpbnN0YWxsJyB0YXJnZXQgaW4gTWFrZWZpbGUuCisKK3pmdGFwZSBzcGVjaWZpYzoKKy0tLS0tLS0tLS0tLS0tLS0KKworLSB6ZnRhcGUgd29ya3MgZm9yIGxhcmdlIGNhcnRyaWRnZXMgbm93ICggPiAyXjMxIGJ5dGVzKQorLSBNVElPQ1ZPTElORk8gYW5kIE1USU9DR0VUU0laRSBub3cgcmV0dXJuIHRoZSBzaXplIGluIEtJTE9CWVRFUywKKyAgTk8gTE9OR0VSIGluIGJ5dGVzLgorCistIHBlcm1pc3Npb25zIGZvciB3cml0ZSBhY2Nlc3MgdG8gYSBjYXJ0cmlkZ2UgaGF2ZSBjaGFuZ2VkOgorICAqIHpmdGFwZSBub3cgYWxzbyB0YWtlcyB0aGUgZmlsZSBhY2Nlc3MgbW9kZSBpbnRvIGFjY291bnQKKyAgKiB6ZnRhcGUgbm8gbG9uZ2VyIGFsbG93cyB3cml0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJlY29yZGVkCisgICAgbWVkaWEuIFRoZSB0YXBlIGhhcyB0byBiZSBwb3NpdGlvbmVkIGF0IEJPVCBvciBFT0QgZm9yIHdyaXRlCisgICAgYWNjZXNzLgorCistIE1UQlNGIGhhcyBjaGFuZ2VkLiBJdCB1c2VkIHRvIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIHByZXZpb3VzIGZpbGUgd2hlbiBjYWxsZWQgd2l0aCBjb3VudCAxLiBUaGlzIHdhcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgZXhwZWN0ZWQgYmVoYXZpb3IgZm9yIG90aGVyIFVuKnggdGFwZSBkcml2ZXJzIChpLmUuIFNDU0kpLiBNVEJTRgorICB3aXRoIGNvdW50IDEgc2hvdWxkIG1lcmVseSBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50CisgIHZvbHVtZS4gRml4ZWQuIEFzIGEgcmVzdWx0LCBgdGFyIC0tdmVyaWZ5JyBub3cgcHJvZHVjZXMgdGhlIGRlc2lyZWQKKyAgcmVzdWx0OiBpdCB2ZXJpZmllcyB0aGUgbGFzdCB3cml0dGVuIHZvbHVtZSwgbm90IHRoZSBwcmUtbGFzdAorICB3cml0dGVuIHZvbHVtZS4KKworLSBUaGUgY29tcHJlc3Npb24gbWFwIGhhcyB2YW5pc2hlZCAtLT4gbm8gbmVlZCBmb3IgYG10IGVyYXNlJyBhbnkKKyAgbW9yZS4gRmFzdCBzZWVraW5nIGluIGEgY29tcHJlc3NlZCB2b2x1bWUgaXMgc3RpbGwgYmUgcG9zc2libGUsIGJ1dAorICB0YWtlcyBzbGlnaHRseSBsb25nZXIuIEFzIGEgc2lkZSBlZmZlY3QsIHlvdSBtYXkgZXhwZXJpZW5jZSBhbgorICBhZGRpdGlvbmFsIHZvbHVtZSBzaG93aW5nIHVwIGluIGZyb250IG9mIGFsbCBvdGhlcnMgZm9yIG9sZAorICBjYXJ0cmlkZ2VzLiBUaGlzIGlzIHRoZSB0YXBlIHZvbHVtZSB0aGF0IGhvbGRzIHRoZSBjb21wcmVzc2lvbiBtYXAuCisKKy0gVGhlIGNvbXByZXNzaW9uIHN1cHBvcnQgZm9yIHpmdGFwZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlCisgIG1vZHVsZSBgemZ0LWNvbXByZXNzb3InLiBET04nVCBmb3JnZXQgdG8gbG9hZCBpdCBiZWZvcmUgdHJ5aW5nIHRvCisgIHJlYWQgYmFjayBjb21wcmVzc2VkIHZvbHVtZXMuIFRoZSBzdG9jayBgemZ0YXBlLm8nIG1vZHVsZSBwcm9iZXMgZm9yCisgIHRoZSBtb2R1bGUgYHpmdC1jb21wcmVzc29yJyB1c2luZyB0aGUga2VybmVsZCBtZXNzYWdlIGNoYW5uZWw7IHlvdQorICBoYXZlIHRvIGluc3RhbGwgYHpmdC1jb21wcmVzc29yLm8nIGluIGEgcGxhY2Ugd2hlcmUgbW9kcHJvYmUgY2FuCisgIGZpbmQgaXQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMuCisKKy0gTmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgdHJpZXMgdG8gZ2V0IHRoZSBicm9rZW4gZG93biBHTVQgdGltZQorICBmcm9tIHVzZXIgc3BhY2UgdmlhIGEga2VybmVsIGRhZW1vbiBtZXNzYWdlIGNoYW5uZWwuIFlvdSBuZWVkIHRvCisgIGNvbXBpbGUgYW5kIHN0YXJ0IHRoZSBga2R0aW1lJyBkYWVtb24gY29udGFpbmVkIGluIHRoZSBjb250cmliCisgIGRpcmVjdG9yeSB0byB1c2UgaXQuIE5lZWRlZCAoPykgZm9yIHRpbWUgc3RhbXBzIGluIHRoZSBoZWFkZXIKKyAgc2VnbWVudHMgYW5kIHRoZSB2b2x1bWUgdGFibGUuCisKKy0gdmFyaWFibGUgYmxvY2sgc2l6ZSBtb2RlIHZpYSBNVFNFVEJMSyAwCisKKy0ga2VlcCBtb2R1bGVzIGxvY2tlZCBpbiBtZW1vcnkgYWZ0ZXIgdGhlIGJsb2NrIHNpemUgaGFzIGJlZW4gY2hhbmdlZAorCitzZnRhcGUgc3BlY2lmaWM6CistLS0tLS0tLS0tLS0tLS0tCisKKy0gZW5kIG9mIHRhcGUgaGFuZGxpbmcgc2hvdWxkIGJlIGZpeGVkLCBpLmUuIG11bHRpIHZvbHVtZSBhcmNoaXZlcworICB3cml0dGVuIHdpdGggYGFmaW8nIGNhbiBiZSByZWFkIGJhY2sgbm93LgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDJhLCAwOS8wMS85NyA9PT09PQorCitObyBiaWcgbmV3czoKKy0gY2FsbCB6ZnRfaW5pdCgpIHJlc3AuIHNmdF9pbml0KCkgd2hlbiBjb21waWxpbmcgdGhlIGVudGlyZSBzdHVmZgorICBpbnRvIHRoZSBrZXJuZWwgaW1hZ2UuCistIGZpeCBidWcgaW4gZnRhcGUtc2V0dXAuYyB3aGVuIE5PX1RSQUNFX0FUX0FMTCB3YXMgZGVmaW5lZC4KKy0gZml4IGJ1ZyBpbiBzZnRhcGUtZW9mLmMvemZ0YXBlLWVvZi5jIGZvciBvbGQga2VybmVscyAoMS4yLiopCistIGFkZCBzdXBwb3J0IGZvciBuZXcgbW9kdWxlIGludGVyZmFjZSBmb3IgcmVjZW50IGtlcm5lbHMKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wMiwgMTYvMTIvOTYgPT09PT0KKy0gRml4ZWQgdGhlIGBGREMgdW5sb2NrIGNvbW1hbmQgZmFpbGVkJyBidWcgaW4gZmRjLWlvLmMuIFdoZW4gdGhlIEZJRk8KKyAgd2FzIGFscmVhZHkgbG9ja2VkIHdoZW4gZnRhcGUgd2FzIGxvYWRlZCwgZnRhcGUgZmFpbGVkIHRvIHVubG9jayBpdC4KKy0gRml4ZWQgY29tcGlsYXRpb24gb2YgYGNvbnRyaWIvZ251bXQnLiBJdCBub3cgZmluZHMgYG10aW8uaCcgZXZlbiBpZgorICBmdGFwZSBpcyBOT1QgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHNvdXJjZSB0cmVlLgorLSBmYy0xMC5jOiBpbmNsdWRlIDxhc20vaW8uaD4gZm9yIGluYigpIGFuZCBvdXRiKCkuCistIGZ0YXBlL3NmdGFwZS96ZnRhcGU6IGFsbCBnbG9iYWwgdmFyaWFibGUgbm93IGhhdmUgZWl0aGVyIGEgYGZ0YXBlXycsCisgIGEgYGZ0XycsIGBzZnRfJywgYHpmdF8nIG9yIGBxaWNfJyBwcmVmaXggdG8gcHJldmVudCBuYW1lIGNsYXNoZXMKKyAgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsIHdoZW4gaW5jbHVkaW5nIGZ0YXBlIGludG8gdGhlIGtlcm5lbAorICBzb3VyY2UgdHJlZS4KKy0gS2VybmVsZCBzdXBwb3J0IGhhcyBjaGFuZ2VkLiBgZnRhcGUnIG5vdyBzZWFyY2hlcyBmb3IgYSBtb2R1bGUKKyAgYGZ0YXBlLWZyb250ZW5kJyB3aGVuIG5vbmUgb2YgdGhlIGZyb250ZW5kIChgc2Z0YXBlJyBvciBgemZ0YXBlJykgaXMKKyAgbG9hZGVkLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGBJbnN0YWxsYXRpb24vTG9hZGluZyBmdGFwZScgc2VjdGlvbiBvZgorICB0aGUgVGVYaW5mbyBtYW51YWwuCistIEFkZCBsb2FkIHJlc3AuIGJvb3QtdGltZSBjb25maWd1cmF0aW9uIG9mIGZ0YXBlLiBUaGVyZSBhcmUgbm93CisgIHZhcmlhYmxlcyBmdF9mZGNfYmFzZSwgZnRfZmRjX2RtYSBhbmQgZnRfZmRjX2lycSBjb3JyZXNwb25kaW5nIHRvCisgIHRoZSBmb3JtZXIgRkRDX0JBU0UgZXRjLiBjb21waWxlIHRpbWUgZGVmaW5pdGlvbnMuIE9uZSBjYW4gYWxzbyB1c2UKKyAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyB0byBjb25maWd1cmUgdGhlIGRyaXZlciBpZiBpdCBpcworICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIEFsc28sIHRoZSBGQy0xMC9GQy0yMCBzdXBwb3J0IGlzIGxvYWQtdGltZQorICBjb25maWd1cmFibGUgbm93IGFzIHdlbGwgYXMgdGhlIE1BQ0gtSUkgaGFjayAoZnRfcHJvYmVfZmMxMCwKKyAgcmVzcC4gZnRfbWFjaDIpLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHNlY3Rpb24gYEluc3RhbGxhdGlvbi9Db25maWd1cmUKKyAgZnRhcGUnIG9mIHRoZSBUZVhpbmZvIG1hbnVhbC4KKy0gSSByZW1vdmVkIHRoZSBNT0RWRVJTSU9OUyBvcHRpb24gZnJvbSBgTWFrZWZpbGUubW9kdWxlJy4gTGV0IG1lIGFsb25lCisgIHdpdGggZnRhcGUgYW5kIE1PRFZFUlNJT05TIHVubGVzcyB5b3UgaW5jbHVkZSB0aGUgZnRhcGUgc291cmNlcyBpbnRvCisgIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuCistIG5ldyB2ZW5kb3JzIGluIGB2ZW5kb3JzLmgnOgorICAqIEhQIENvbG9yYWRvIFQzMDAwIAorICAqIENvbUJ5dGUgRG91YmxlUGxheSAoaW5jbHVkaW5nIGEgYnVnIGZpeCBmb3IgdGhlaXIgYnJva2VuCisgICAgZm9ybWF0dGluZyBzb2Z0d2FyZSwgdGhhbmtzIHRvIHdocmF2ZW5AbmphY2tuLmNvbSkKKyAgKiBJb21lZ2EgRElUVE8gMkdJRy4gTk9URTogdGhpcyBkcml2ZSBjYW5ub3Qgd29yayB3aXRoIGZ0YXBlIGJlY2F1c2UKKyAgICB0aGUgbG9naWNhbCBkYXRhIGxheW91dCBvZiB0aGUgY2FydHJpZGdlcyB1c2VkIGJ5IHRoaXMgZHJpdmUgZG9lcworICAgIE5PVCBjb25mb3JtIHRvIHRoZSBRSUMgc3RhbmRhcmRzLCBpdCBpcyBhIHNwZWNpYWwgSW9tZWdhIHNwZWNpZmljCisgICAgZm9ybWF0LiBJJ3ZlIHNlbnQgbWFpbCB0byBJb21lZ2EgYnV0IGRpZG4ndCByZWNlaXZlIGFuIGFuc3dlcgorICAgIHlldC4gSWYgeW91IHdhbnQgdGhpcyBkcml2ZSB0byBiZSBzdXBwb3J0ZWQgYnkgZnRhcGUsIGFzayBJb21lZ2EKKyAgICB0byBnaXZlIG1lIGluZm9ybWF0aW9uIGFib3V0IGl0LgorLSB6ZnRhcGU6CisgICogcmUtaW50cm9kdWNlZCB0aGUgTVRJT0NfWkZUQVBFX0dFVEJMS1NaIGlvY3RsIGZvciBjb21wYXRpYmlsaXR5CisgICAgd2l0aCB6ZnRhcGUgMS4wNmEgYW5kIGVhcmxpZXIuIFBsZWFzZSBkb24ndCB1c2UgaXQgd2hlbiB3cml0aW5nCisgICAgbmV3IHNvZnR3YXJlLCB1c2UgdGhlIE1USU9DVk9MSU5GTyBpb2N0bCBpbnN0ZWFkLgorICAqIE1ham9yIG92ZXJoYXVsIG9mIHRoZSBjb2RlIHRoYXQgdXBkYXRlcyB0aGUgaGVhZGVyIHNlZ21lbnRzLiBOZXZlcgorICAgIGNoYW5nZSB0aGUgdGFwZSBsYWJlbCB1bmxlc3MgZXJhc2luZyB0aGUgdGFwZS4gVGh1cyB3ZSBhbG1vc3QKKyAgICBuZXZlciBuZWVkIHRvIHdyaXRlIHRoZSBoZWFkZXIgc2VnbWVudHMsIHVubGVzcyB3ZSB3b3VsZCBtb2RpZnkKKyAgICB0aGUgYmFkIHNlY3RvciBtYXAgd2hpY2ggaXNuJ3QgZG9uZSB5ZXQuIFVwZGF0aW5nIG9mIHZvbHVtZSB0YWJsZQorICAgIGFuZCBjb21wcmVzc2lvbiBtYXAgbW9yZSBzZWN1cmUgbm93IGFsdGhvdWdoIGl0IHRha2VzIGEgYml0CisgICAgbG9uZ2VyLgorICAqIEZpeGVkIGJ1ZyB3aGVuIGFib3J0aW5nIGEgd3JpdGUgb3BlcmF0aW9uIHdpdGggYSBzaWduYWw6IHpmdGFwZQorICAgIG5vdyBmaW5pc2hlcyB0aGUgY3VycmVudCB2b2x1bWUgKGkuZS4gd3JpdGVzIGFuIGVvZiBtYXJrZXIpIGF0IHRoZQorICAgIGN1cnJlbnQgcG9zaXRpb24uIEl0IGRpZG4ndCBiZWZvcmUgd2hpY2ggbGVkIHRvIHNvbWVob3cgKnN0cmFuZ2UqCisgICAgYmVoYXZpb3IgaW4gdGhpcyBjYXNlcy4KKyAgKiBLZWVwIG1vZHVsZSBsb2NrZWQgaW4gbWVtb3J5IHdoZW4gdXNpbmcgaXQgd2l0aCAgdGhlIG5vbi1yZXdpbmRpbmcKKyAgICBkZXZpY2VzIGFuZCB0aGUgdGFwZSBpcyBub3QgbG9naWNhbCBhdCBCT1QuIE5lZWRlZCBmb3Iga2VybmVsZAorICAgIHN1cHBvcnQuCistIHNmdGFwZToKKyAgKiBLZWVwIG1vZHVsZSBsb2NrZWQgaW4gbWVtb3J5IHdoZW4gdXNpbmcgaXQgd2l0aCAgdGhlIG5vbi1yZXdpbmRpbmcKKyAgICBkZXZpY2VzIGFuZCB0aGUgdGFwZSBpcyBub3QgbG9naWNhbCBhdCBCT1QuIE5lZWRlZCBmb3Iga2VybmVsZAorICAgIHN1cHBvcnQuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDEsIDE0LzExLzk2ID09PT09CisKKy0gRml4ZWQgc2lsbHkgYnVncyBpbiBmdGFwZS0zLjAwOgorICAqIE1BS0VERVYuZnRhcGU6IG1ham9yIGRldmljZSBudW1iZXIgbXVzdCBiZSAyNywgbm90IDIzIAorICAqIHNmdGFwZS9zZnRhcGUtcmVhZC5jOiBzZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudHMoKSBjYWxsZWQgCisgICAgaXRzZWxmIHJlY3Vyc2l2ZWx5IGluc3RlYWQgb2YgY2FsbGluZyBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KCkKKyAgKiB6ZnRhcGUvcWljLXZ0YmwuaDogY29udmVyc2lvbiBvZiBmdGFwZSdzIGZpbGUgbWFya3MgdG8gemZ0YXBlJ3MKKyAgICBpbnRlcm5hbCB2b2x1bWUgdGFibGUgd2FzIGJyb2tlbi4KKyAgKiBwYXRjaGVzLzIueC54L2xpbnV4LTIuMC4yMS5kaWY6IG15IFJDUyAocmVzcC4gQ1ZTKSBzeXN0ZW0gcmVwbGFjZWQKKyAgICB0aGUgYCRSZXZpc29uOicgZXRjLiBtYWNyb3MgaW4gdGhlIGBmdGFwZS5oJyBjb25jZXJuaW5nIHBhcnQgb2YgdGhlCisgICAgcGF0Y2ggOi0oIEZpeGVkLgorICAqIGluZm8vZnRhcGUuaW5mbzogRml4ZWQgbWlzc3BlbGxpbmdzIChgY3AnIDwtPiBgY3AgLXInIGV0Yy4pCisgICogd2hlbiBmdGFwZS9zZnRhcGUgb3IgZnRhcGUvemZ0YXBlIHdhcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgdGhlCisgICAgdmFyaWFibGUgZnRhcGVfc3RhdHVzIHdhcyBkZWNsYXJlZCB0d2ljZS4gRml4ZWQuCisgICogcmVtb3ZlZCByZWZlcmVuY2UgdG8gdW5kZWNsYXJlZCB2YXJpYWJsZSBrZXJuZWxfdmVyc2lvbiB3aGVuIG5vdAorICAgIGNvbXBpbGluZyBhcyBtb2R1bGUKKyAgKiBmaXhlZCBhIGJ1ZyBpbnRyb2R1Y2VkIGJ5IHRoZSB1c2Ugb2YgYml0LWZpZWxkcyBmb3Igc29tZSBmbGFncworICAgIChpLmUuIHdyaXRlX3Byb3RlY3RlZCwgbm9fY2FydHJpZGdlLCBmb3JtYXR0ZWQpCisgICogZmxhZyBgaGVhZGVyX3JlYWQnIGlzIG5vdyByZXNldCBjb3JyZWN0bHkgdG8gemVybyB3aGVuIHRhcGUgaXMKKyAgICByZW1vdmVkLgorLSBmaXhlZCBhIGJ1ZyBpbiBzZnRhcGUvc2Z0YXBlLWVvZi5jIHRoYXQgd2FzIGFscmVhZHkgaW4gdGhlIG9yaWdpbmFsCisgIGZ0YXBlIGNvZGUuIE1URlNGL0JTRiB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gcG9zaXRpb25lZAorICByaWdodCBiZWZvcmUgdGhlIGZpbGUgbWFyayAodGhpbmsgb2YgdGFyKQorLSBDaGFuZ2VkIFRSQUNFIG1hY3JvcyAoZm9sbG93aW5nIGEgc3VnZ2VzdGlvbiBvZiBNYXJjaW4gRGFsZWNraSkgdG8gdXNlCisgIHRoZSBwcmVkZWZpbmVkIF9fRlVOQ1RJT05fXyBtYWNybyBvZiBHQ0MuIFNwYXJlcyBhYm91dCA0ayBvZiBjb2RlLgorLSBhZGRlZCBuZXcgdmVuZG9yIGlkIGZvciBJb21lZ2EgRElUVE8gMkdJRworLSBmaXhlZCBhIGJ1ZyBhbHJlYWR5IHByZXNlbnQgaW4gemZ0YXBlLTEuMDYgd2hlbiBhYm9ydGluZyBhIHdyaXRlCisgIHdpdGggYSBzaWduYWw6IHdlIG5vdyBmaW5pc2ggdGhlIGN1cnJlbnQgdm9sdW1lIGF0IHRoYXQKKyAgcG9zaXRpb24uIEhlYWRlciBzZWdtZW50cyByZW1haW4gTk9UIHVwIHRvIGRhdGUgdW50aWwgYW4gZXhwbGljaXQgY2FsbAorICB0byBNVFJFVyBvciBNVE9GRkwgaXMgZG9uZS4gIAorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAwLCAxNC8xMC85NiA9PT09PQorCistIE1lcmdlZCBmdGFwZSB3aXRoIHpmdGFwZS4gVGhlcmUgYXJlIHRocmVlIG1vZHVsZXMgbm93OgorICBmdGFwZSBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnQsIHNmdGFwZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICBvcmlnaW5hbCBmdGFwZSBlb2YgbWFyayBzdHVmZiBhbmQgemZ0YXBlIHRoYXQgaW1wbGVtZW50cyB6ZnRhcGUncyB3YXkKKyAgb2YgaGFuZGxpbmcgdGhpbmdzIChjb21wcmVzc2lvbiwgdm9sdW1lIHRhYmxlLCB0YXBlIGJsb2NrcyBvZgorICBjb25zdGFudCBsZW5ndGgpCistIERvY3VtZW50YXRpb24gaW4gVGVYaW5mbyBmb3JtYXQgaW4gdGhlIGBpbmZvJyBzdWJkaXJlY3RvcnkuCistIE5ldyBpb2N0bHMgZm9yIHpmdGFwZS4gU2VlIHpmdGFwZS96ZnRhcGUuaAorLSBEdW1teSBmb3JtYXR0aW5nIGlvY3RsIGZvciBmdGFwZS4gU2VlIGZ0YXBlLmgKKy0gS2VybmVsIHBhdGNoIGZpbGVzIGZvciB0aGUgMi4qLiogc2VyaWVzIHRvIGluY2x1ZGUgZnRhcGUtMy4wMCBpbiB0aGUKKyAga2VybmVsIHNvdXJjZSB0cmVlLiBUaGVzZSBpbmNsdWRlcyBhIGtlcm5lbCBjb21wYXRpYmxlIENvbmZpZy5pbgorICBzY3JpcHQgYW5kIGZhaXJseSBsYXJnZSBvbmxpbmUgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXJuZWwgY29uZmlndXJlCisgIHNjcmlwdC4KKy0gU3VwcG9ydCBmb3IgY29tcGlsaW5nIHdpdGggTGludXgtMS4yLjEzLiAKKy0gTW9kaWZpZWQgR05VIG10IGZyb20gdGhlaXIgY3BpbyBwYWNrYWdlIHRoYXQgY2FuIGhhbmRsZSB0aGUgbmV3CisgIGlvY3Rscy4KKy0gZnRhcGUvc2Z0YXBlL3pmdGFwZSBpcyBrZXJuZWxkIHNhdmUgbm93IQorCitOb3RlcyBvbiBzZnRhcGU6CistIHNmdGFwZSBpbXBsZW1lbnRzIHRoZSBlb2YgaGFuZGxpbmcgY29kZSBvZiB0aGUgb3JpZ2luYWwgZnRhcGUuIElmCisgIHlvdSBsaWtlIHRvIHN0aWNrIHdpdGggdGhlIG9yaWdpbmFsIGZ0YXBlIHN0dWZmLCB5b3UgaGF2ZSB0byB1c2UKKyAgdGhpcyBtb2R1bGUsIG5vdCB6ZnRhcGUuCistIHNmdGFwZSBpcyBrZXJuZWxkIHNhdmUsIHVubGlrZSB0aGUgb3JpZ2luYWwgZnRhcGUuCistIHdlIGtlZXAgdGhlIGVudGlyZSBoZWFkZXIgc2VnbWVudCBub3cgaW4gbWVtb3J5LCBzbyBubyBuZWVkIHRvIHJlYWQKKyAgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkZXIgc2VnbWVudHMuIEFkZGl0aW9uYWwgbWVtb3J5CisgIGNvbnN1bXB0aW9uOiAyNTYgYnl0ZXMuIAorCitOb3RlcyBmb3IgemZ0YXBlOgorLSB6ZnRhcGUgaGFzIHN1cHBvcnQgZm9yIHRhcGVzIHdpdGggZm9ybWF0IGNvZGUgNiBub3csIHdoaWNoIHVzZSBhCisgIHNsaWdodGx5IGRpZmZlcmVudCB2b2x1bWUgdGFibGUgZm9ybWF0IGNvbXBhcmVkIHdpdGggb3RoZXIgZmxvcHB5CisgIHRhcGVzLgorLSBuZXcgaW9jdGxzIGZvciB6ZnRhcGUuIEhhdmUgYSBsb29rIGF0IHpmdGFwZS96ZnRhcGUuaAorLSBUaGUgaW50ZXJuYWwgdm9sdW1lIHRhYmxlIHJlcHJlc2VudGF0aW9uIGhhcyBjaGFuZ2VkIGZvciB6ZnRhcGUuIE9sZAorICBjYXJ0cmlkZ2VzIGFyZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseS4KKy0gemZ0YXBlIG5vIGxvbmdlciB1c2VzIGNvbXByZXNzaW9uIG1hcCBzZWdtZW50cywgd2hpY2ggaGF2ZSB2YW5pc2hlZAorICBmcm9tIHRoZSBRSUMgc3BlY3MsIGJ1dCBjcmVhdGVzIHZvbHVtZSB0YWJsZSBlbnRyeSB0aGF0IHJlc2VydmVzCisgIGVub3VnaCBzcGFjZSBmb3IgdGhlIGNvbXByZXNzaW9uIG1hcC4gCistIHpmdGFwZSBpcyBrZXJuZWxkIHNhdmUgbm93LgorLSB3ZSBrZWVwIHRoZSBlbnRpcmUgaGVhZGVyIHNlZ21lbnQgbm93IGluIG1lbW9yeSwgc28gbm8gbmVlZCB0byByZWFkCisgIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZGVyIHNlZ21lbnRzLiBBZGRpdGlvbmFsIG1lbW9yeQorICBjb25zdW1wdGlvbjogMjU2IGJ5dGVzLiAKKworTm90ZXMgZm9yIGNvbnRyaWIvZ251bXQ6CistIG1vZGlmaWVkIG10IGZyb20gdGhlIEdOVSBjcGlvIHBhY2thZ2UgdGhhdCBzdXBwb3J0cyBhbGwgdGhlIG5ldworICBpb2N0bHMgb2YgemZ0YXBlLgorTm90ZXMgZm9yIGNvbnRyaWIvc3dhcG91dDoKKy0gVGhpcyBjb250YWlucyB0aGUgc3dhcG91dC5jIHByb2dyYW0gdGhhdCB3YXMgd3JpdHRlbiBieSBLYWkKKyAgSGFycmVraWxkZS1QZWRlcnNvbi4gSSBzaW1wbHkgYWRkZWQgYSBNYWtlZmlsZS4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4xMCwgMTQvMTAvOTYgPT09PT0KKworVGhlIGZ0YXBlIG1haW50YWluZXIgaGFzIGNoYW5nZWQuIAorS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gPGtocEBkb2xwaGluaWNzLm5vPgoraGFzIHJlc2lnbmVkIGZyb20gbWFpbnRhaW5pbmcgZnRhcGUsIGFuZCBJLAorQ2xhdXMtSnVzdHVzIEhlaW5lIDxjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGU+LAoraGF2ZSB0YWtlbiBvdmVyLgorCistIEFkZGVkIHN1cHBvcnQgZm9yIHRhcGVzIHdpdGggYGZvcm1hdCBjb2RlIDYnLCBpLmUuIFFJQy0zMDIwIHRhcGVzCisgIHdpdGggbW9yZSB0aGFuIDJeMTYgc2VnbWVudHMuCistIG1lcmdlZCBjaGFuZ2VzIG1hZGUgYnkgQmFzIExhYXJob3ZlbiB3aXRoIGZ0YXBlLTIuMDkuIFJlZmVyCisgIHRvIGhpcyByZWxlYXNlIG5vdGVzIGJlbG93LiBJJ3ZlIGluY2x1ZGVkIHRoZW0gaW50byB0aGlzCisgIGZpbGUgdW5jaGFuZ2VkIGZvciB5b3VyIHJlZmVyZW5jZS4KKy0gZGlzYWJsZWQgY2FsbCBzdGFjayBiYWNrIHRyYWNlIGZvciBub3cuIFRoaXMgbmV3IGZlYXR1cmUKKyAgaW50cm9kdWNlZCBieSB0aGUgaW50ZXJpbSByZWxlYXNlIDIuMC54IHN0aWxsIHNlZW1zIHRvCisgIGJlIGJ1Z2d5LgorLSBUcmllZCB0byBtaW5pbWl6ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBmdGFwZSB2ZXJzaW9uCisgIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBhbmQgdGhlIHN0YW5kYWxvbmUKKyAgbW9kdWxlIHZlcnNpb24uCistIFJlaW50cm9kdWNlZCBzdXBwb3J0IGZvciBMaW51eC0xLjIuMTMuIFBsZWFzZSByZWZlciB0byB0aGUKKyAgSW5zdGFsbC1ndWlkZS4gCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDksIDE2LzA2Lzk2ID09PT09CisKK1RoZXJlIGFyZW4ndCBhbnkgcmVhbGx5IGJpZyBuZXdzIGluIHRoaXMgcmVsZWFzZSwgbW9zdGx5IGp1c3QgdGhhdCBJCisodGhlIG1haW50YWluZXIpIGhhdmUgY2hhbmdlZCBteSBlbWFpbCBhZGRyZXNzIChkdWUgdG8gYSBuZXcgam9iKS4gIE15CituZXcgYWRkcmVzcyBpcyA8a2hwQGRvbHBoaW5pY3Mubm8+CisKKy0gVGhlIENMS180OE1IWiBhbmQgRkRDXzgyMDc4U0wgb3B0aW9ucyBoYXMgZ29uZSAoYWxsIDJNYnBzIGNhcmRzIHNlZW0KKyAgdG8gdXNlIGEgNDhNSHogb3NjaWxsYXRvciBhbnl3YXkgYW5kIEkgaGF2ZW4ndCBoZWFyZCBvZiBhbiAnU0wKKyAgY2hpcCBvdXQgdGhlcmUpLgorLSBUaGUgUzgyMDc4QiBoYXMgYmVlbiBgZG93bmdyYWRlZCcgdG8gaTgyMDc3QUEgY29tcGFiaWxpdHkuCistIFRFU1RJTkcgb3B0aW9uIHJldml2ZWQuICBSaWdodCBub3csIGl0J2xsIGVuYWJsZSB0aGUgKHNlcmlvdXNseSBicm9rZW4pCisgIDJNYnBzIGNvZGUuICBJZiB5b3UgZW5hYmxlIGl0LCB5b3UnbGwgZXhwZXJpZW5jZSBhIHRhcGUgZHJpdmUgdGhhdCdzCisgICpyZWFsbHkqIG91dCB0byBsdW5jaCEKKy0gU29tZSAoYm9sZCkgY2hhbmdlcyBpbiB0aGUgaW5pdCBjb2RlLiAgUGxlYXNlIG5vdGlmeSBtZSBpZiB0aGV5CisgIGJyZWFrIHRoaW5ncyBmb3IgeW91LgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA4LCAxNC8wMy85NiA9PT09PQorCitJZiB5b3UgY29ycmVjdCBhIHByb2JsZW0gd2l0aCBmdGFwZSwgcGxlYXNlIHNlbmQgeW91ciBwYXRjaCB0bwora2hwQGRvbHBoaW5pY3Mubm8gdG9vLgorCistIFVwZGF0ZWQgdG8gcmVmbGVjdCB0aGF0IE5SX01FTV9MSVNUUyBpcyBnb25lIGluIDEuMy43NAorLSBUZWFjIDcwMCBhZGRlZCB0byBsaXN0IG9mIGtub3duIGRyaXZlcy4KKy0gVGhlIHJlZ2lzdGVyZWQgZGV2aWNlIG5hbWUgaXMgbm93ICJmdCIgcmF0aGVyIHRoYW4gImZ0YXBlIi4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wN2EsIDE0LzAzLzk2ID09PT09CisKK0J1Z2ZpeGVzIGJ5IE1hcmNpbiBEYWxlY2tpIDxkYWxlY2tpQG5hbXUwMy5nd2RnLmRlPjoKKy0gSW4gdGhlIGxhc3QgcmVsZWFzZSBpdCBqdXN0IGNvbXBpbGVkIGFnYWluc3QgMS4zLjcwOworICBub3cgdGhlIHBhcmFtcyB0byByZXF1ZXN0X2lycSgpIGFuZCBmcmVlX2lycSBhcmUoKSBhcmUgZml4ZWQsIHNvIGl0IGFsc28gCisgIHdvcmtzIGluIDEuMy43MyA6LSkKKy0gU3VwcG9ydCBmb3IgbW9kdWxlcyBpcyBub3cgY29ycmVjdCBmb3IgbmV3ZXIga2VybmVscy4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNywgMDQvMDMvOTYgPT09PT0KKworCistIGZ0YXBlIHVwZGF0ZWQgdG8gY29tcGlsZSBhZ2FpbnN0IDEuMy43MC4KKy0gSW9tZWdhIDcwMCBhbmQgV2FuZ3RlayAzMjAwIHJlY29nbmlzZWQuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNmIsIDEzLzAyLzk2ID09PT09CisKK0Fub3RoZXIgc2ltcGxlIGJ1Z2ZpeCB2ZXJzaW9uLgorCistIEp1bWJvIDcwMCByZWNvZ25pc2VkLgorLSBUeXBvIGluIHZlbmRvcnMuaCBmaXhlZC4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA2YSwgMTAvMDIvOTYgPT09PT0KKworVGhpcyByZWxlYXNlIGlzIGEgc2ltcGxlIGJ1Z2ZpeCB2ZXJzaW9uLgorCistIExpbnV4L1NNUDogZnRhcGUgKnNob3VsZCogd29yay4KKy0gRkMtMTAvMjA6IE9ubHkgYWNjZXB0cyBJUlFzIDMtNywgb3IgOS4gIElmIElSUSA5LCBwcm9wZXJseSB0ZWxsIHRoZSBjYXJkCisgIHRvIHVzZSBJUlEgMi4gIFRoYW5rcyB0byBHcmVnIENyaWRlciAoZ2NyaWRlckBpY2xuZXQub3JnKSBmb3IgZmluZGluZyBhbmQKKyAgbG9jYXRpbmcgdGhpcyBidWcgYW5kIHRlc3RpbmcgdGhlIHBhdGNoLgorLSBJbnNpZ2h0IGRyaXZlIHJlY29nbmlzZWQgY29ycmVjdGx5IGFnYWluLgorLSBNb3Rvci1vbiB3YWtldXAgdmVyc2lvbiBvZiB0aGUgSW9tZWdhIDI1MCBkcml2ZSBhZGRlZAorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDYsIDI4LzAxLzk2ID09PT09CisKK1NwZWNpYWwgdGhhbmtzIGdvIHRvIE5lYWwgRnJpZWRtYW4gYW5kIFN0ZXZlbiBTb3Jib20gZm9yIHRoZWlyCitoZWxwIGluIHByb2R1Y2luZyBhbmQgdGVzdGluZyB0aGlzIHJlbGVhc2UuCisKK0kgaGF2ZSBjb250aW51ZWQgdG8gY2xlYW4gdXAgdGhlIGNvZGUsIHdpdGggYW4gZXllIHRvd2FyZHMgaW5jbHVzaW9uCitvZiBmdGFwZSBpbiBMaW51cycgb2ZmaWNpYWwga2VybmVsIChJbiBmYWN0LCBhcyBJIHR5cGUgdGhpcywgSSBhbQorcnVubmluZyBvbiBhIGtlcm5lbCB3aXRoIGZ0YXBlIHN1cHBvcnQgc3RhdGljYWxseSBsaW5rZWQpLiAgSSBoYXZlCit0ZXN0LWNvbXBpbGVkIGZ0YXBlIGFnYWluc3QgbXkgMS4yLjEzIHRyZWUgd2l0aG91dCBwcm9ibGVtcy4KK0hvcGVmdWxseSwgZXZlcnl0aGluZyBzaG91bGQgYmUgT0sgZm9yIHRoZSB2MS4yLnggcGVvcGxlLgorCitXQVJOSU5HISBBbGFuIENveCBoYXMgbWFpbGVkIG1lIHRoYXQgZnRhcGUgZG9lcyAqTk9UKiB3b3JrIHdpdGgKK0xpbnV4L1NNUC4gIElmIHlvdSB0cnkgdG8gcnVuIGZ0YXBlIHVuZGVyIExpbnV4L1NNUCwgaXQgd2lsbCBjYXVzZSBhCitrZXJuZWwgZGVhZGxvY2sgKHdoaWNoIGlzIHdvcnNlIHRoYW4gYSBwYW5pYykuCisKKy0gUUlDLTMwMjAvVFItMzogMU1icHMgc3VwcG9ydCB3b3Jrcy4gIE5lYWwgaXMgY2FwYWJsZSBvZiByZWFkaW5nIGFuZAorICB3cml0aW5nIGRhdGEgdG8gYSB0YXBlLiAgZnRhcGUgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdHlwZSBvZgorICB0YXBlIChlLmcuIFRSLTMgdnMgUUlDLTgwKSBhbmQgbW92ZSB0aGUgZmRjIGluIGFuZCBvdXQgb2YKKyAgInBlcnBlbmRpY3VsYXIgbW9kZSIgYXMgbmVjZXNzYXJ5LgorLSAyTWJwcyBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNpbmNlIGl0IGlzIG5vdCBmdWxseQorICBkZWJ1Z2dlZC4gIElmIHlvdSBhcmUgYWR2ZW50dXJvdXMsIHJlbW92ZSAtREZEQ184MjA3OFNMIGluIHRoZQorICBNYWtlZmlsZSBhbmQgc2VlIHdoYXQgaGFwcGVucyA6LSkKKy0gZmRjIGRldGVjdGlvbjogc2lsbHkgYnVncyByZW1vdmVkIChPbmx5IDJNYnBzIGZkY3Mgd2VyZSBhZmZlY3RlZCkKKyAgYW5kIGFkZGVkIGRldGVjdGlvbiBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgUEM4NzQ0IGZkYyBjaGlwCisgICh1c2VkIGluIHRoZSBQQzg3M3h4ICJzdXBlci1JTyIgY2hpcHMpLgorLSBSZW1vdmVkIHdhcm5pbmcgYWJvdXQgaW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gY29tcGlsaW5nIHdpdGggTGludXgKKyAgMS4yLnguCistIFJFQURNRS5QQ0kgdXBkYXRlZCB3aXRoIGluZm8gYWJvdXQgdGhlIERFTEwgRGltZW5zaW9uIFhQUyBQOTAuCistIENvbm5vciBUU1QzMjAwUiBhZGRlZCB0byBkZXRlY3RlZCBkcml2ZXMuCistIGBzd2Fwb3V0JyB1dGlsaXR5IGFkZGVkIHRvIGRpc3RyaWJ1dGlvbi4gIEl0IHdpbGwgZGlydHkgNU1lZyBvZgorICBtZW1vcnksIHRyeWluZyB0byBzd2FwIG91dCBvdGhlciBwcm9ncmFtcy4gIEp1c3Qgc2F5IGBtYWtlIHN3YXBvdXQnCisgIHRvIGJ1aWxkIGl0LiAgZnRhcGUgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgUmVhbCBTb29uIE5vdyAoaWU6CisgIHdoZW4gSSBoYXZlIGZvdW5kIG91dCB3aGljaCBrZXJuZWwgbWVtb3J5IGFsbG9jIGZ1bmN0aW9uIHRvIGNhbGwpLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDUsIDA4LzAxLzk2ID09PT09CisKKy0gRm9yIHYxLjIueCBLZXJuZWxzLCB5b3UgbXVzdCBhcHBseSB0aGUgcGF0Y2ggbGludXgtMS4yL2tzeW1zLnBhdGNoIHRvCisgIHRoZSBrZXJuZWwgYW5kIHJlYnVpbGQgaXQgKGl0IGFkZHMgdGhlIF9fZ2V0X2RtYV9wYWdlcyBzeW1ib2wgdG8KKyAga3N5bXMuYykuCistIEluY2x1ZGVkIG5ldyBhc20taTM4Ni9pby5oIGZpbGUgZnJvbSB2MS4zLngga2VybmVsIHNlcmllcywgdG8gZW5hYmxlCisgIGdjYyB2LjIuNy5bMTJdIHRvIGNvbXBpbGUgdjEuMi54IGtlcm5lbHMgKGxpbnV4LTEuMi9pby5oKS4KKy0gTW9kdWxlIHZlcnNpb25zOiBJZiB5b3Ugd2lzaCB0byBjb21waWxlIGZ0YXBlIGFzIGEgdmVyc2lvbmVkIG1vZHVsZSwKKyAgeW91IG11c3QgZmlyc3QgY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIENPTkZJR19NT0RWRVJTSU9OUz15LgorICBPdGhlcndpc2UsIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgPGxpbnV4L21vZHZlcnNpb25zLmg+IGRvZXMgbm90CisgIGV4aXN0IChpZiB0aGF0IGhhcHBlbnMsIGEgYHRvdWNoIG1vZHZlcnNpb25zLmgnIHdpbGwgaGVscCB5b3Ugb3V0KS4KKy0gQ0xLXzQ4TUhaOiBuZXcgZGVmaW5lIGluIHRoZSBNYWtlZmlsZSAoZGVmYXVsdDogbm9uLXplcm8pLiAgSWYgeW91IGhhdmUKKyAgYSB0YXBlIGNvbnRyb2xsZXIgY2FyZCB0aGF0IHVzZXMgdGhlIGk4MjA3OCgtMSkgY2hpcCwgYnV0IGNhbm5vdCBnZXQKKyAgaXQgdG8gd29yayB3aXRoIGZ0YXBlLCB0cnkgc2V0IGl0IHRvIDAgKGFuZCBwbGVhc2UgcmVwb3J0IHRoaXMpLgorLSBRSUMtMzAxMC8zMDIwOiBDb21wbGV0ZSBzdXBwb3J0IGlzIHN0aWxsIG1pc3NpbmcsIGJ1dCB3aWxsIGhvcGVmdWxseQorICBjb21lIHNvb24uICBTdGV2ZW4gU29yYm9tIGhhcyBraW5kbHkgcHJvdmlkZWQgbWUgd2l0aCBoaW50cyBhYm91dAorICB0aGlzLiAgV3JpdGluZyBvZiBRSUMtMzAyMCB0YXBlcyBkZWZpbml0ZWx5IGRvZXMgTk9UIHdvcmsgKGRvIG5vdCB0cnkKKyAgaXQhIC0gdGhlIGRyaXZlIHdpbGwgbm90IGJlIGluICJwZXJwZW5kaWN1bGFyIG1vZGUiIGFuZCB0aGlzIHdpbGwgcnVpbgorICB0aGUgZm9ybWF0dGluZyBpbmZvIG9uIHRoZSB0YXBlKS4KKy0gZnRhcGVfbnVtX2J1ZmZlcnMgaXMgb3V0IG9mIGZhc2hpb246IHVzZSBOUl9CVUZGRVJTIGluc3RlYWQgKGFuZAorICByZWNvbXBpbGUgaWYgeW91IHdhbnQgdG8gY2hhbmdlIGl0IDotKS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA0LCAwMS8wMS85NiA9PT09PQorCitUaGlzIHZlcnNpb24gYnkgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gPGtocEBkb2xwaGluaWNzLm5vPgorCistIEFMRVJUISBTdXBwb3J0IGZvciBLZXJuZWxzIGVhcmxpZXIgdGhlbiB2MS4xLjg1IGlzIGFib3V0IHRvIGdvIGF3YXkuCisgIEkgaW50ZW5kIHRvIGNsZWFuIHVwIHNvbWUgb2YgdGhlIGNvZGUgKGdldHRpbmcgcmlkIG9mIGFuIGFubm95aW5nbHkKKyAgbGFyZ2UgbnVtYmVycyBvZiAjaWZkZWYgbW9zdGx5KSwgd2hpY2ggbWVhbnMgdGhhdCBzdXBwb3J0IGZvcgorICBwcmUtMS4xLjg1IGtlcm5lbHMgbXVzdCBnbyBhcyB3ZWxsLgorLSBOUl9GVEFQRV9CVUZGRVJTIGlzIGdvbmU7IFlvdSBjYW4gaW5zdGVhZCBzZWxlY3QgdGhlIG51bWJlciBvZiBkbWEKKyAgYnVmZmVycyBieSBzYXlpbmcgYGluc21vZCBmdGFwZS5vIGZ0YXBlX251bV9idWZmZXI9PG4+JyBpbnN0ZWFkLgorLSBDb25maWd1cmUgc2NyaXB0IGdvbmUuICBmdGFwZSB3aWxsIG5vdyBhdXRvbWFnaWNhbGx5IGRldGVybWluZSB5b3VyCisgIGtlcm5lbCB2ZXJzaW9uIGJ5IC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmggaW5zdGVhZC4KKy0gQ09ORklHX01PRFZFUlNJT05TIG5vdyB3b3JrLiAgQWxsIGNvbWJpbmF0aW9ucyBvZiB2ZXJzaW9uZWQgLworICB1bnZlcnNpb25lZCBrZXJuZWwgYW5kIGZ0YXBlIG1vZHVsZSB3b3JrcyAoYXQgbGVhc3Qgd2l0aCBteSAxLjMuNTIKKyAga2VybmVsKS4KKy0gSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBpbnNlcnRpbmcgZnRhcGUgaW50byBhbiBvbGQgKDEuMi54KQorICBrZXJuZWwgKGUuZy4gaW5zbW9kIHNheXMgIjEuMi44IGRvZXMgbm90IG1hdGNoIDEuMi44KSwgcmVjb21waWxlCisgIHlvdXIgbW9kdWxlcyB1dGlsaXRpZXMgd2l0aCB5b3VyIG5ldyBjb21waWxlci4KKy0gUmV2ZWFsIFRCMTQwMCBkcml2ZSBhZGRlZCB0byB2ZW5kb3JzLmgKKy0gU3VwcG9ydCBmb3IgdGhlIGk4MjA3OC0xICgyTWJwcykgY2hpcCBpcyBjb21pbmcgYWxvbmcuICBUaGUKKyAgYmlnZ2VzdCBwcm9ibGVtIGlzIHRoYXQgSSBkb24ndCBoYXZlIHN1Y2ggYSBjYXJkLCB3aGljaCBtYWtlcworICB0ZXN0aW5nIC8gZGVidWdnaW5nIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgVGhlIHNlY29uZCBiaWdnZXN0CisgIHByb2JsZW0gaXMgdGhhdCBJIGRvIG5vdCBoYXZlIHRoZSBRSUMtMzAxMC8zMDIwIHN0YW5kYXJkcyBlaXRoZXIuCisgIFN0YXR1cyByaWdodCBub3cgaXMgdGhhdCB0aGUgY2hpcCBpcyBkZXRlY3RlZCwgYW5kIGl0IHNob3VsZCBiZQorICBwb3NzaWJsZSB0byBwdXQgaXQgaW50byAyTWJwcyBtb2RlLiAgSG93ZXZlciwgSSBkbyBub3Qga25vdyB3aGF0CisgICJleHRyYXMiIGFyZSBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN1cHBvcnQuICBBbHRob3VnaCBwdXR0aW5nIHRoZQorICBpODIwNzggaW50byAxTWJwcyBtb2RlIG91Z2h0IHRvIHdvcmsgb3V0IG9mIHRoZSBib3gsIGl0IGRvZXNuJ3QKKyAgKHJpZ2h0IG5vdywgZnRhcGUgY29tcGxhaW5zIGFib3V0IGlkIGFtIGVycm9ycykuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNGJldGE1LCAyOS8xMi85NSA9PT09PQorCitCYXMgb2ZmbGluZSBsaW51eC10YXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgcmVhc29ucyBvbmx5IGtub3duIHRvIHRoZSBtYWpvcmRvbW8gbWFpbCBsaXN0IHByb2Nlc3NvciwgQmFzIHdhcwora2lja2VkIG9mZiB0aGUgbGludXgtdGFwZSBsaXN0IHNvbWV0aW1lIGR1cmluZyB0aGUgc3VtbWVyLiAgQmVpbmcKK292ZXJ3b3JrZWQgYXQgaGlzIGZvci1wYXkgam9iLCBoZSBkaWRuJ3Qgbm90aWNlIGl0IG11Y2guICBJbnN0ZWFkIEkKKyhLYWksIGtocEBkb2xwaGluaWNzLm5vKSBoYXMgd29ya2VkIG9uIGZ0YXBlIHRvIHByb2R1Y2UgdGhlIDIuMDQoYmV0YSkKK3ZlcnNpb24uCisKK3pmdGFwZQorLS0tLS0tCitOb3RlIHRoYXQgdGhlcmUgZXhpc3RzIGEgbXVjaCBpbXByb3ZlZCB2ZXJzaW9uIG9mIGZ0YXBlLCB3cml0dGVuIGJ5CitDbGF1cy1KdXN0dXMgSGVpbmUgPGNsYXVzQHdpbGxpLm1hdGgucnd0aC1hYWNoZW4uZGU+IHdoaWNoIGlzIG5hbWVkCit6ZnRhcGUsIHdoaWNoIGNvbmZvcm1zIHRvIHRoZSBRSUMtODAgc3BlY3Mgb24gaG93IHRvIG1hcmsgYmFja3VwcywgYW5kCitpcyBjYXBhYmxlIG9mIGRvaW5nIGF1dG9tYXRpYyBjb21wcmVzc2lvbi4gIEhvd2V2ZXIsIHpmdGFwZSBtYWtlcworc3Vic3RhbnRpYWwgY2hhbmdlcyB0byBmdGFwZSwgYW5kIEkgKEthaSkgaGF2ZSB0aGVyZWZvcmUgZGVjbGluZWQgdG8KK2ludGVncmF0ZSB6ZnRhcGUgaW50byBmdGFwZS4gIEhvcGVmdWxseSwgdGhpcyB3aWxsIGhhcHBlbiBzb29uLgorCitDT05GSUdfUUlDMTE3IHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgYmlnZ2VzdCBjaGFuZ2Ugb2YgYWxsIGlzIHRoYXQgZnRhcGUgbm93IHdpbGwgYWxsb2NhdGUgaXRzIGRtYQorYnVmZmVycyB3aGVuIGl0IGlzIGluc2VydGVkLiAgVGhlIG1lYW5zIHRoYXQgdGhlIENPTkZJR19RSUMxMTcgb3B0aW9uCitoYXMgZGlzYXBwZWFyZWQgZnJvbSB0aGUgTGludXgga2VybmVsIGFzIG9mIHYxLjMuMzQuICBJZiB5b3UgaGF2ZSBhbgorZWFybGllciBrZXJuZWwsIHNpbXBseSBhbnN3ZXIgJ25vJyB0byB0aGUgcXVlc3Rpb24gd2lsbCBkbyB0aGUgdHJpY2sKKyhpZiB5b3UgZ2V0IGNvbXBsYWlucyBhYm91dCBfX2dldF9mcmVlX3BhZ2VzKCkgbWlzc2luZywgY29udGFjdCB0aGUKK2xpbnV4LXRhcGUgbWFpbGluZyBsaXN0KS4KKworTm90ZSB0aGF0IGZ0YXBlLTIuMDRiZXRhIHdpbGwgd29yayBlcXVhbGx5IHdlbGwgb24ga2VybmVscyB3aXRoIGFuZAord2l0aG91dCBgZnRhcGUgc3VwcG9ydCcuICBUaGUgb25seSBjYXRjaCBpcywgdGhhdCB5b3Ugd2lsbCB3YXN0ZQorYXJvdW5kIDk2LTEyOEtiIG9mIHByZWNpb3VzIERNQSdhYmxlIG1lbW9yeSBvbiBhIGJveCB0aGF0IGhhcyBmdGFwZQorc3VwcG9ydCBjb21waWxlZCBpbi4KKworTm93IGZvciB0aGUgcmVhbCBjaGFuZ2VzOgorCistIEZDLTIwIGNhbiBub3cgdXNlIERNQSBjaGFubmVscyAxLCAyLCBhbmQgMy4gVGhhbmtzIHRvIERhbmllbAorICBDb2hlbiwgY2F0bWFuQHdwaS5lZHUuCistIGZ0YXBlIG5vIGxvbmdlciByZXF1aXJlcyBhIChnaWdhbnRpYykgOTZLYiBidWZmZXIgdG8gYmUgc3RhdGljYWxseQorICBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC4KKy0gQWRkZWQgbmV3IElvbWVnYSBkcml2ZSAoODg4MikgdG8gdmVuZG9ycy5oCistIC1mbm8tc3RyZW5ndGgtcmVkdWNlIGFkZGVkIHRvIE1ha2VmaWxlLCBzaW5jZSBHQ0MgaXMgYnJva2VuLgorLSBpODIwNzgtMSAoMk1icHMpIEZEQyBzdXBwb3J0IHN0YXJ0ZWQuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wM2IsIDI3LzA1Lzk1ID09PT09CisKKy0gUHJldmVudGVkIHZlcmlmeV9hcmVhIHRvIHJldHVybiBlcnJvciBpZiBjYWxsZWQgd2l0aCB6ZXJvIGxlbmd0aC4KKy0gRml4ZWQgYSBidWcgaW4gZmx1c2hfYnVmZmVycyB0aGF0IGNhdXNlZCB0b28gbXVjaCBwYWRkaW5nIHRvIGJlCisgIHdyaXR0ZW4gd2hlbiBhIGZpbmFsIHNlZ21lbnQgaGFkIGJhZCBzZWN0b3JzLgorLSBJbmNyZWFzZWQgbWF4aW11bSBmYXN0LXNlZWsgb3ZlcnNob290IHZhbHVlIGZyb20gNSB0byAxMCBzZWdtZW50cy4KKy0gQnJlYWtpbmcgbG9vcCBhZnRlciA1IHJldHJpZXMgd2hlbiBwb3NpdGlvbmluZyBmYWlscy4KKy0gRml4ZWQgd3JvbmcgY2FsY3VsYXRpb24gb2YgdGFwZSBsZW5ndGggZm9yIFFJQy0zMDEwIGFuZCBRSUMtMzAyMAorICB0YXBlcyAoZGVuc2l0aWVzIHdlcmUgc3dhcHBlZCkuCistIEZpeGVkIHdyb25nIGNhbGN1bGF0aW9uIG9mIG92ZXJzaG9vdCBvbiBzZWVrX2ZvcndhcmQ6IFdyb25nIHNpZ24KKyAgb2YgZXJyb3IuCistIFN1cHByZXNzIChmYWxzZSkgZXJyb3IgbWVzc2FnZSBkdWUgdG8gbmV3IHRhcGUgbG9hZGVkLgorLSBBZGRlZCB0d28gbmV3IENNUyBkcml2ZXMgKDExYzMgYW5kIDExYzUpIHRvIHZlbmRvcnMuaC4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAzYSwgMDkvMDUvOTUgPT09PT0KKworLSBGaXhlZCBkaXNwbGF5IG9mIG9sZCBlcnJvciAoZXZlbiBpZiBhbHJlYWR5IGNsZWFyZWQpIGluIGZ0YXBlX29wZW4uCistIEltcHJvdmVkIHRhcGUgbGVuZ3RoIGRldGVjdGlvbiwgaW9jdGxzIHdvdWxkIGZhaWwgZm9yIDQyNSBmdCB0YXBlcy4KKyAgVW50aWwgdGhlIHRhcGUgbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIGhlYWRlcgorICBzZWdtZW50LCB3ZSdsbCB1c2Ugd29yc3QtY2FzZSB2YWx1ZXMuCistIENsZWFyIGVvZl9tYXJrIGFmdGVyIHJld2luZGluZyBpb2N0bHMuCistIEZpeGVkIHdyb25nIHZlcnNpb24gbWVzc2FnZSAoMi4wMyBoYWQgMi4wMmcgaWQpLgorLSBGaXhlZCBidWcgdGhhdCBjYXVzZWQgdGhlIGZkYyB0byBiZSByZXNldCB2ZXJ5IGZyZXF1ZW50bHkuCisgIFRoaXMgc2hvdWxkbid0IGFmZmVjdCBub3JtYWwgb3BlcmF0aW9uIGJ1dCB0aGUgdGltaW5nIG9mIHRoZQorICByZXBvcnQgcm91dGluZXMgaGFzIGNoYW5nZWQgYWdhaW4gYW5kIHRoYXQgbWF5IGNhdXNlIHByb2JsZW1zLgorICBXZSdsbCBqdXN0IGhhdmUgdG8gZmluZCBvdXQuLi4uCistIEltcGxlbWVudGVkIGNvcnJlY3Qgd3JpdGUgcHJlY29tcGVuc2F0aW9uIHNldHRpbmcgZm9yIFFJQy0zMDEwLzMwMjAuCistIENsZWFuZWQgdXAgZmRjX2ludGVycnVwdF93YWl0IHJvdXRpbmUuIEhvcGUgaXQgc3RpbGwgd29ya3MgOi0pCistIEZpbmFsbHkgcmVtb3ZlZCAoYWxyZWFkeSBkaXNhYmxlZCkgc3BlY2lhbCBlb2YgbWFyayBoYW5kbGluZyBmb3IKKyAgZ251IHRhci4KKy0gQ2hhbmdlZCBvcmRlciBvZiBnZXRfZG1hX3Jlc2lkdWUgYW5kIGRpc2FibGVfZG1hIGluIGZkYy1pc3IuYworICBiZWNhdXNlIHRoZSBjdXJyZW50IG9yZGVyIHdvdWxkIGZhaWwgb24gYXQgbGVhc3Qgb25lIHN5c3RlbS4KKyAgV2UncmUgYmFjayB0byB0aGUgb3JpZ2luYWwgb3JkZXIgYWdhaW4sIGhvcGUgKGFuZCBleHBlY3QpIHRoaXMKKyAgZG9lc24ndCBicmVhayBhbnkgb3RoZXIgc3lzdGVtLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDMsIDA3LzA1Lzk1ID09PT09CisKKyhDaGFuZ2VzIHJlZmVyIHRvIHRoZSBmaXJzdCBmdGFwZS0yLjAyIHJlbGVhc2UpCisKK1N1cHBvcnQgZm9yIHdpZGUgYW5kIGV4dGVuZGVkIGxlbmd0aCB0YXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgQ29ubmVyIFRTTSA0MjAgYW5kIDg1MCBkcml2ZXMgYXJlIHJlcG9ydGVkIHRvIGJlIHdvcmtpbmcuCitJIGhhdmVuJ3QgcmVjZWl2ZWQgYW55IHJlcG9ydHMgYWJvdXQgb3RoZXIgYnJhbmRzOyB0aGUgVFNNIDQyMAorYW5kIDg1MCBzZWVtIHRvIGJlIHRoZSBtb3N0IHdpZGVseSB1c2VkIHdpZGUgZHJpdmVzLgorRXh0ZW5kZWQgbGVuZ3RoIHRhcGVzICg0MjUgZnQpIHdpdGggbm9ybWFsIFFJQy04MCBkcml2ZXMKK2FyZSBvcGVyYXRpbmcgdG9vIChBdCBsZWFzdCBJJ3ZlIGhhZCBubyByZXBvcnRzIHN0YXRpbmcgb3RoZXJ3aXNlKS4KK19Ob3RfIHlldCBjb21wbGV0ZWx5IHN1cHBvcnRlZCAoYWx0aG91Z2ggdGhleSBtYXkgd29yaykgYXJlCitRSUMtMzAyMCBkcml2ZXMgYW5kIDIgTWJwcyBmbG9wcHkgZGlzayBjb250cm9sbGVycyB3b24ndCB3b3JrIGF0Cit0aGUgaGlnaGVzdCBzcGVlZC4KK0lmIHNvbWVvbmUgaXMga2luZCBlbm91Z2ggdG8gc2VuZCBtZSBvbmUgb2YgdGhlc2UsIEknbGwgaW5jbHVkZQorc3VwcG9ydCBmb3IgaXQgdG9vIDstKQorCitFYXNpZXIgY29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Byb2JsZW1zIGR1ZSB0byB3cm9uZyBzZXR0aW5ncyBpbiB0aGUgTWFrZWZpbGUgYXJlIHByZXZlbnRlZAorYnkgdXNpbmcgYSBjb25maWd1cmF0aW9uIHNjcmlwdCB0aGF0IHNldHMgdGhlIG5lY2Vzc2FyeSAoa2VybmVsCit2ZXJzaW9uIGRlcGVuZGVudCkgY29tcGlsZSB0aW1lIG9wdGlvbnMuCitUaGlzIGtlcm5lbCB2ZXJzaW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIHNvdXJjZXMgZm91bmQKK2F0IC91c3Ivc3JjL2xpbnV4LCBvciBpZiBub3QgZm91bmQsIHRoZSBvbGQgd2F5IHVzaW5nCisvcHJvYy92ZXJzaW9uLgorVmVyc2lvbmVkIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkgd2hlbiBzdXBwb3J0ZWQKK2J5LSBhbmQgY29uZmlndXJlZCBpbi0gdGhlIGtlcm5lbC4KK05vdGUgdGhhdCB0aGUgY3VycmVudCBtb2R1bGVzIGNvZGUgKDEuMS44NykgaXMgc3RpbGwgYnJva2VuCithbmQgX25lZWRzXyB0aGUgZml4IGluY2x1ZGVkIGluIHRoZSBpbnNtb2QgZGlyZWN0b3J5LgorUGxlYXNlIGRvbid0IHNlbmQgbWUgYW55IG1vcmUgT29wcyByZXBvcnRzIGNhdXNlZCBieSBpbnNtb2QgOi0oCisKK1JlZHVjZWQgbW9kdWxlIHNpemUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBzdGFuZGFyZCBtb2R1bGUgc2l6ZSBpcyBtdWNoIHJlZHVjZWQgYW5kIHNvbWUgY29tcGlsZSB0aW1lCitvcHRpb25zIGNhbiBldmVuIHJlZHVjZSBpdCBmdXJ0aGVyLiAoSSBkb24ndCByZWNvbW1lbmQgdGhpcworZm9yIG5vcm1hbCB1c2UgYnV0IGl0IGNhbiBiZSBoYW5keSBmb3IgcmVzY3VlIGRpc2tldHRlcykKKworT3B0aW9uOiAgICAgICAgICAgQXBwcm94LiBtb2R1bGUgc2l6ZToKKworPHN0YW5kYXJkPiAgICAgICAgICAgICAxNTAgS2IKK05PX1RSQUNFICAgICAgICAgICAgICAgMTI1IEtiCitOT19UUkFDRV9BVF9BTEwgICAgICAgICA2NyBLYgorCisKK011Y2ggaW1wcm92ZWQgZHJpdmVyIGludGVycnVwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNb3N0IHBvc3NpYmxlIGxvb3BzIGhhdmUgYmVlbiBicm9rZW4gYW5kIHNpZ25hbCBkZXRlY3Rpb24KK2hhcyBiZWVuIGltcHJvdmVkLgorSW4gbW9zdCBjYXNlcyB0aGUgZHJpdmVyIGNhbiBiZSBhYm9ydGVkIGJ5IF5DIChTSUdJTlQpIGFuZAorU0lHS0lMTCAoa2lsbCAtOSkgd2lsbCBnZW5lcmF0ZSBiZSBhIHN1cmUga2lsbC4KKyhOb3RlIHRoYXQgYWJvcnRpbmcgYSB0YXBlIG9wZXJhdGlvbiBtYXkgZGFtYWdlIHRoZSBsYXN0CitkYXRhIHdyaXR0ZW4gdG8gdGFwZSkKKworSW1wcm92ZWQgZXJyb3IgcmVjb3ZlcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdGFwZSBub3cgcmV0dXJucyBhbiBlcnJvciAoRU5PREFUQSkgdG8gdGhlIGFwcGxpY2F0aW9uIGlmCithIHNlZ21lbnQgcHJvdmVzIHRvIGJlIHVucmVjb3ZlcmFibGUgYW5kIHRoZW4gc2tpcHMgdGhlCitiYWQgc2VnbWVudC4KK1RoaXMgY2F1c2VzIG1vc3QgYXBwbGljYXRpb25zIHRvIGNvbnRpbnVlIHRvIHdvcmsgKHRhcgorYW5kIGFmaW8pIGxvb3Npbmcgb25seSBhIHNtYWxsIGFtb3VudCAodXAgdG8gMjkgS2IpIG9mIGRhdGEuCitSZXRyaWVkIHJlYWQgb3BlcmF0aW9ucyB3aWxsIG5vdyBiZSBkb25lIHNsaWdodGx5IG9mZi10cmFjawordG8gaW1wcm92ZSB0aGUgY2hhbmNlIG9mIHN1Y2Nlc3MuIFNlcmlvdXMgaGVhZCBvZmYtdHJhY2sKK2Vycm9ycyB3aWxsIGJlIGRldGVjdGVkLgorCitGQy0xMCBhbmQgRkMtMjAgY29udHJvbGxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnRhcGUgbm93IHN1cHBvcnRzIGJvdGggdGhlIG9sZCBDTVMgRkMtMTAgYW5kIHRoZSBuZXdlciBGQy0yMAorY29udHJvbGxlcnMuCitCZWNhdXNlIHRoZSBvcGVyYXRpb24gb2YgdGhlc2UgY2FyZHMgaXMgc3RpbGwgdW5kb2N1bWVudGVkLAordGh1cyBmYXIgdGhleSB3aWxsIG9ubHkgd29yayB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzIChTZWUKK01ha2VmaWxlKS4gQW55IGZlZWQtYmFjayBvbiBob3cgdG8gdXNlIHRoZW0gd2l0aCBvdGhlciBzZXR0aW5ncword2lsbCBiZSB3ZWxjb21lICEKK0NvbXBpbGF0aW9uIHdpbGwgZmFpbCBpZiBvbmUgY2hhbmdlcyB0aGUgc2V0dGluZ3MgdG8gaWxsZWdhbAordmFsdWVzLgorCitLZXJuZWxzIGFuZCBjb21waWxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnRhcGUgaXMgY3VycmVudGx5IGJlaW5nIGRldmVsb3BlZCB1c2luZyB0aGUgMi41LjggY29tcGlsZXIuCitUaGUgb2xkZXIgMi40LjUgcHJvYmFibHkgd29ya3MgdG9vIChTZXQgb3B0aW9uIGluIE1ha2VmaWxlISkuCitJIGhhdmUgbm8gZXhwZXJpZW5jZSB3aXRoIGFueSBsYXRlciBjb21waWxlcnMgbm9yIEVsZiBzdXBwb3J0LgorQW55IGluZm9ybWF0aW9uIG9uIHRoaXMgaXMgd2VsY29tZS4KK1RoZSBsYXRlc3Qga2VybmVsIEkgaGF2ZSB0ZXN0ZWQgZnRhcGUgd2l0aCBpcyAxLjIuNi4KKworQ29tcHJlc3Npb24KKy0tLS0tLS0tLS0tCitBbiBpbXByZXNzaXZlIGNvbGxlY3Rpb24gb2YgY2hhbmdlcyBmb3IgZnRhcGUgaW5jbHVkaW5nCitvbi10aGUtZmx5IGNvbXByZXNzaW9uIGlzIHN0aWxsIGx5aW5nIG9uIG15IGRlc2suCitJZiAyLjAzIHByb3ZlcyB0byBiZSByZWxpYWJsZSBJIG1pZ2h0IHN0YXJ0IGludGVncmF0aW5nIHRoZXNlCitidXQgYXMgdXN1YWwsIEknbSBzaG9ydCBpbiB0aW1lIDotKAorCitGb3JtYXR0aW5nCistLS0tLS0tLS0tCitUaGVyZSBpcyBzdGlsbCBubyB3YXkgdG8gZm9ybWF0IHRhcGVzIHVuZGVyIExpbnV4LiBBcyBmYXIgYXMKK0kga25vdyBhbGwgYXR0ZW1wdHMgdG8gd3JpdGUgc3VjaCBhIHByb2dyYW0gaGF2ZSBkaWVkIG5vdy4KK1NpbmNlIGZvcm1hdHRlZCB0YXBlcyBhcmUgcmF0aGVyIGNvbW1vbiBub3csIEkgdGhpbmsgYWxsIHdlCituZWVkIGlzIGEgdXRpbGl0eSB0aGF0IHdyaXRlcyBhIHdvcnN0IGNhc2UgcGF0dGVybiBhbmQgdmVyaWZpZXMKK3RoYXQgd2l0aCB0aGUgZHJpdmUgcHV0IGluIHZlcmlmeSBtb2RlLCByZWR1Y2luZyBtYXJnaW5zLgorQW55IHRha2VycyA/CisKK0Z1cnRoZXJtb3JlCistLS0tLS0tLS0tLQorQ2xlYW5lZCB1cCBtZXNzYWdlcy4KK1ByZXBhcmVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGFwZSBkcml2ZXMgb24gb25lIGZkYy4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gc2VudCBidWcgcmVwb3J0cyBhbmQgaGVscGVkIG1lCitpbXByb3ZlIHRoZSBkcml2ZXIuIFdpdGhvdXQgdHJ5aW5nIHRvIGJlIGNvbXBsZXRlIEknbGwgbWVudGlvbgorR2FyeSBBbmRlcnNvbiAod2l0aG91dCBoaXMgYWNjdXJhdGUgcmVwb3J0cyBhbmQgdW5yZWxpYWJsZQoraGFyZHdhcmUgdGhlcmUgd291bGRuJ3QgYmUgYSAyLjAzKSwgU3RlZmFuIEtuZWlmZWwgKEZDLTIwKSwKK1JvYmVydCBCcm91Z2h0b24gKEZDLTIwLCB5b3Ugd2VyZSBhbG1vc3QgdGhlcmUgOy0pLCBCam9ybgorRWt3YWxsIChmb3IgdGhlIHZlcnNpb25lZCBtb2R1bGVzIGFuZCBidWdneSBpbnNtb2QgOy0pLCBQZXRlcgorRm94LCBDaHJpc3RvcGhlciBPbGl2ZXIsIFJhbHBoIFdoaXR0YWtlciBhbmQgbm90IHRoZSBsZWFzdAorTGludXMgVG9ydmFsZHMgKGZvciBMaW51eCBhbmQga2VlcGluZyBtZSBidXN5IGJlY2F1c2Ugb2YKK2NoYW5nZXMgdG8gdGhlIGtlcm5lbCA7LSkKK1RoYW5rcyB0byBhbnlvbmUgSSBmb3Jnb3QsIGZvciB0aGUgYnVnIHJlcG9ydHMsIHRoZSBmdGFwZQorYmFzaGluZyBhbmQgdGhlIG1lbnRhbCBzdXBwb3J0Li4uCisKKworVGhhdCdzIGl0IGZvciBub3cuIEhhdmUgRnVuLAorCitCYXMuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmcsIDA2LzA1Lzk1ID09PT09CisKKy0gQWRkZWQgZXh0cmEgdGVzdCB0byBicmVhayByZWFkLWlkIGxvb3Agd2l0aCBzaWduYWwuCistIENoYW5nZWQgcmV3aW5kIGNvZGUgdG8gaGFuZGxlIG5lZ2F0aXZlIG92ZXJzaG9vdCBmb3IgZHJpdmVzCisgIHRoYXQgdGFrZSB2ZXJ5IGxvbmcgdG8gc3RhcnQgb3Igc3RvcC4KKy0gTGV0IHVzZSBvZiBnZXQvc2V0IGkvby1yZWdpb25zIGRlcGVuZCBvbiBrZXJuZWwgdmVyc2lvbi4KKy0gQ2hhbmdlZCBjb2RlIHRvIHVzZSBhIG1vcmUgZ2VuZXJhbCB0ZXN0IGZvciBjb25kaXRpb25hbAorICBjb21waWxhdGlvbnMgZGVwZW5kaW5nIG9uIGtlcm5lbCB2ZXJzaW9uLgorLSBJbXByb3ZlZCBtaWNyby1zdGVwIGZ1bmN0aW9uYWxpdHkgdG8gZ28gb2ZmLXRyYWNrIG9ubHkKKyAgd2hpbGUgcmVhZGluZyAoaWQgJiBkYXRhKS4KKy0gQWRkZWQgZmFpbHVyZSBvbiB0YXBlLW5vdC1yZWZlcmVuY2VkIGJpdCBpbiBmdGFwZV9jb21tYW5kLgorLSBBZGRlZCBGT1JFVkVSIG9wdGlvbiB0byByZWFkLXdhaXQgcm91dGluZS4KKy0gQ2hhbmdlZCByZWFkLWlkIHRvIHVzZSBzaG9ydGVyIHRpbWVvdXQgY2F1c2luZyBzbWFsbGVyCisgIHJld2luZHMgb24gdGltZW91dC4KKy0gTWFkZSBrZXJuZWwtaW50ZXJmYWNlIGZ1bmN0aW9ucyBzdGF0aWMuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmYsIDAzLzA1Lzk1ID09PT09CisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgZHVhbCB0YXBlIGRyaXZlcyBvbiBteSBzeXN0ZW0sIGV4dGVuZGVkIENvbmZpZ3VyZQorICBzY3JpcHQgdG8gZGV0ZWN0IGhvc3QgJ2RvZG8nLgorLSBMb2cgbWVkaWEgZGVmZWN0IGluIGhpc3RvcnkgaWYgZWNjIGZhaWxlZCBhbmQgbm8gZGF0YSB3YXMgcmV0dXJuZWQuCistIEZpeGVkIENvbmZpZ3VyZSBzY3JpcHQgdGhhdCB3YXMgZmFpbGluZyBmb3Iga2VybmVsIHZlcnNpb25zIHdpdGgKKyAgZG91YmxlIGRpZ2l0IHZlcnNpb24gb3IgcmV2aXNpb24gbnVtYmVycy4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyZSwgMDEvMDUvOTUgPT09PT0KKworLSBGaXhlZCByZXBvc2l0aW9uIGxvb3AgYXQgbG9naWNhbCBlb3QgKGZhaWxpbmcgcmVhZF9pZCkuCistIEZpeGVkIDM0IHNlZ21lbnQgb2Zmc2V0IHdoZW4gcmV3aW5kaW5nLgorLSBBZGRlZCBmYXN0IHNlZWsgY2FwYWJpbGl0eSBmb3IgbW9yZSB0aGFuIDI1NSBzZWdtZW50cy4KKy0gRml4ZWQgd3JvbmcgYnVzeSByZXN1bHQgZnJvbSBmdGFwZV9jb21tYW5kIGNhdXNpbmcgcmV2ZXJzZQorICBzZWVrIHRvIGZhaWwuCistIEFkZGVkIGJyZWFrb3V0IGZyb20gaW5maW5pdGUgcmV3aW5kIGxvb3AgKGlmIHNvbWV0aGluZyBmYWlscykuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmQsIDMwLzA0Lzk1ID09PT09CisKKy0gSW1wcm92ZWQgYWJvcnRpb24gb24gc2lnbmFsczogSW50ZXJydXB0IHdpbGwgbWFrZSBhIGdyYWNlZnVsCisgIGV4aXQsIEtpbGwgd2lsbCBiZSBsZXNzIG5pY2UgYW5kIHNob3VsZCBiZSB1c2VkIGlmIGV2ZXJ5dGhpbmcKKyAgZWxzZSBmYWlscy4KKy0gSW5jbHVkZWQgY2hlY2sgZm9yIHRhcGUtaGVhZCBvZmYgdHJhY2suCistIEltcGxlbWVudGVkIGV4aXQgZnJvbSB0YXBlLXN0YXJ0IGxvb3AuCistIEFkZGVkIGtlcm5lbCBpby1wb3J0IHJlZ2lzdHJhdGlvbi4KKy0gSW1wbGVtZW50ZWQgc2tpcCBvZiBmYWlsaW5nIHNlZ21lbnQgKEVOT0RBVEEpIG9uIGVjYyBmYWlsdXJlLgorICBUaGlzIGFsbG93cyBhZmlvIGFuZCB0YXIgdG8gY29udGludWUgd2hlbiB0aGUgdGFwZSBpcyBkYW1hZ2VkLgorLSBNYWRlIGRpc3RpbmN0aW9uIGJldHdlZW4gZHJpdmUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY29kZXMuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmMsIDIyLzA0Lzk1ID09PT09CisKKy0gRml4ZWQgdG9vIHRpZ2h0IGNvbW1hbmQgcXVldWVpbmcgYWZ0ZXIgdGFwZSBzdG9wL3BhdXNlIGNvbW1hbmQKKyAgaXNzdWVkIGZyb20gd2l0aGluIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKFNob3dlZCBhcyB0aW1lb3V0CisgIG9uIEFja25vd2xlZGdlIGVycm9ycyBkdXJpbmcgcmV0cmllcyBvbiBzb21lIHN5c3RlbXMpCistIFRyaWVkIHRvIGZpeCB0aW1lb3V0cyB3aGVuIHVzaW5nIDQyNSBmdCB0YXBlIGJlY2F1c2UgdGhlIGV4dGVuZGVkCisgIGxlbmd0aCBkb2Vzbid0IHNlZW0gdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGhhcmR3YXJlLgorICBXZSBub3cgdXNlIHRoZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBoZWFkZXIgc2VnbWVudCBzbyBhZGp1c3QgdGhlCisgIHRpbWluZyBhZnRlciByZWFkaW5nIHRoZSBoZWFkZXIgc2VnbWVudC4KKy0gRml4ZWQgc29tZSBtZXNzYWdlcyBzdGF0aW5nICd1bmV4cGVjdGVkIHNvbWV0aGluZy4uLicgYmVpbmcgbm90CisgIHVuZXhwZWN0ZWQgYW55bW9yZS4KKy0gU3RhcnRlZCBwcmVwYXJhdGlvbnMgZm9yIG1lcmdlIG9mIGR5bmFtaWMgYnVmZmVyIGFsbG9jYXRpb24gYW5kCisgIGNvbXByZXNzaW9uIGNvZGUuCistIENoYW5nZWQgc29tZSBkZWJ1ZyBtZXNzYWdlcyB0byBpbmNsdWRlIHJlbGV2YW50IHNlZ21lbnQgaW5mb3JtYXRpb24KKyAgYXQgbGV2ZWwgNC4KKy0gSW5jbHVkZWQgZWFybHkgYmFpbC1vdXQgd2hlbiBkcml2ZSBvZmZsaW5lLCBwcmV2ZW50aW5nIGEgbG90IG9mCisgIGZhbHNlIG1lc3NhZ2VzLgorLSBNb3ZlZCBmdGFwZV9wYXJhbWV0ZXJfeHh4KCkgb2Zmc2V0cyBpbnRvIGZ1bmN0aW9uIGluc3RlYWQgb2YgaW4gY2FsbHMuCistIFJlbW92ZWQgJ3dlaXJkLCBkcml2ZSBidXN5IGJ1dCBubyBkYXRhJyBlcnJvciB3aGVuIGNhdXNlZCBieQorICBhbiBlcnJvciBkdXJpbmcgYSByZWFkLWlkLgorLSBJbXByb3ZlZCAndGltZW91dCBvbiBhY2tub3dsZWRnZScgZGlhZ25vc3RpY3MuCistIE1vdmVkIE1PRFVMRSBvcHRpb24gaW50byBDb25maWd1cmUuCistIFJlZHVjZWQgY29kZSBzaXplIHdoZW4gbm8gdHJhY2luZyBhdCBhbGwgd2FzIHNldCAoQ2xhdXMgSGVpbmUpLgorLSBObyBsb25nZXIgbG9nIGVycm9yIGNvZGUgMCAobm8gZXJyb3IpIGFzIGFuIGVycm9yLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJiLCAwOS8wNC85NSA9PT09PQorCistIFJlbGF4ZWQgdGltaW5nIGZvciBzdGF0dXMgb3BlcmF0aW9uIGFuZCBkaXNwbGF5aW5nCisgIGFibm9ybWFsIHJlc3VsdHMuIEhvcGVmdWxseSB0aGlzIHNob3dzIHdoYXQncyBnb2luZworICB3cm9uZyB3aXRoIHRoZSBDb25uZXIgVFNNODUwUiBkcml2ZXMuCistIENyZWF0ZWQgc2NyaXB0IGZvciBjb25maWd1cmF0aW9uLCB1c2luZyB2ZXJzaW9uIG51bWJlcgorICBvZiBrZXJuZWwgc291cmNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIC9wcm9jL3ZlcnNpb24uCistIEZpeGVkIGNvbmRpdGlvbmFscyBpbiBrZXJuZWwtaW50ZXJmYWNlLmMuCistIFJlbW92ZWQgdW5hdm9pZGFibGUgVFJBQ0Ugb3V0cHV0LgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJhLCAwMS8wNC85NSA9PT09PQorCistIEltcGxlbWVudGVkIGBuZXctc3R5bGUnICh2ZXJzaW9uZWQpIG1vZHVsZXMgc3VwcG9ydCBmb3IgbmV3CisgIGtlcm5lbHMuCistIFJlZHVjZWQgc2l6ZSBvZiBtb2R1bGUgYnkgbW92aW5nIHN0YXRpYyBkYXRhIHRvIGJzcy4KKy0gTm93IHVzaW5nIHZlcnNpb24gbnVtYmVyIG9mIGtlcm5lbCBzb3VyY2UgaW5zdGVhZCBvZiBydW5uaW5nCisgIGtlcm5lbCBmb3Iga2VybmVsIHZlcnNpb25zID49IDEuMS44MgorLSBBZGRlZCBmZWVkYmFjayBvbiBkcml2ZSBzcGVlZHMgdG8gdmVuZG9yIGluZm9ybWF0aW9uLgorLSBJbmNsdWRlZCBmaXhlZCBpbnNtb2Qgc291cmNlcyB0byBkaXN0cmlidXRpb24gKExldCdzIGhvcGUKKyAgdGhlIG1vZHVsZXMgZGlzdHJpYnV0aW9uIGdldCBmaXhlZCBzb29uIDotLykuCisKK05vdGUgdGhhdCBJIGhhdmVuJ3QgeWV0IGltcGxlbWVudGVkIGFueSBvZiB0aGUgY29kZSBleHRlbnNpb24gSQorcmVjZWl2ZWQuIEkgaG9wZSB0byBmaW5kIHNvbWUgdGltZSB0byBkbyB0aGlzIHNvb24uCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMiwgMTUvMDEvOTUgPT09PT0KKworCistIEZpeGVkIGZhaWxpbmcgcmVwb3NpdGlvbmluZyB3aGVuIG92ZXJzaG9vdCB3YXMgaW5jcmVtZW50ZWQuCistIEZpeGVkIHJhdGUgc2VsZWN0aW9uOiBCZWNhdXNlIG9mIGEgZGVmaWNpZW5jeSBpbiB0aGUgUUlDLTExNworICBzcGVjaWZpY2F0aW9uIG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG5vdCBpbXBsZW1lbnRlZAorICBhbmQgYSBmYWlsaW5nIGNvbW1hbmQuIFRoZXJlZm9yIHdlIG5vdyB0cnkgdG8gZmluZCBvdXQgaWYgdGhlCisgIGRyaXZlIGRvZXMgc3VwcG9ydCB0aGlzIGNvbW1hbmQgYmVmb3JlIHVzYWdlLgorLSBGaXhlZCBlcnJvciByZXRyeSB1c2luZyB3cm9uZyBvZmZzZXQgaW4gZmRjLWlzci4KKy0gSW1wcm92ZWQgcmV0cnkgY29kZSB0byByZXRyeSBvbmx5IG9uY2Ugb24gYSBzaW5nbGUgbm8tZGF0YQorICBlcnJvciBpbiBhIHNlZ21lbnQuCistIFZhbGlkYXRlIHNlY3RvciBudW1iZXIgZXh0cmFjdGVkIGZyb20gZW9mIG1hcmsgYmVjYXVzZSBhbgorICBpbnZhbGlkIGZpbGUgbWFyayAoZHVlIHRvID8/PykgY291bGQgY2F1c2Uga2VybmVsIHBhbmljLgorLSBTcGxpdCBmdGFwZS1pby5jIGludG8gZnRhcGUtaW8uYyBhbmQgZnRhcGUtY3RsLmMgZmlsZXMuCistIENvcnJlY3RlZCB0b28gaGlnaCBtZWRpYSBlcnJvciBjb3VudCBhZnRlciB3cml0aW5nIHRvCisgIGEgYmFkIHRhcGUuCistIEFkZGVkICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPiBhZ2FpbiBiZWNhdXNlIG9sZCBrZXJuZWwgdmVyc2lvbnMKKyAgbmVlZCBpdC4KKy0gRml4ZWQgZmRjIG5vdCBiZWluZyBkaXNhYmxlZCB3aGVuIG9wZW4gZmFpbGVkIGJlY2F1c2Ugbm8gdGFwZQorICBkcml2ZSB3YXMgZm91bmQuCistIEZpeGVkIHByb2JsZW0gd2l0aCBzb2Z0IGVycm9yIGluIHNlY3RvciAzMiAoc2hpZnQgb3BlcmF0b3Igd2l0aAorICBzaGlmdGNvdW50IDMyIGlzIG5vdCBkZWZpbmVkKS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAxLCAwOC8wMS85NSA9PT09PQorCisKKy0gUmVtb3ZlZCBURVNUSU5HIHNldHRpbmcgZnJvbSBkaXN0cmlidXRlZCBNYWtlZmlsZS4KKy0gRml4ZWQgYG10IGFzZicgZmFpbHVyZTogUmV3aW5kIHdhcyBkZWZlcnJlZCB0byBjbG9zZSB3aGljaAorICBvdmVycnVsZWQgdGhlIGZzZiBpb2N0bC4KKy0gUHJldmVudGVkIG5vbi1pbnRlcnJ1cHRpYmxlIGNvbW1hbmRzIGJlaW5nIGludGVycnVwdGVkLgorLSBBZGRlZCBtaXNzaW5nIHRpbWVvdXQucGF1c2Ugc2V0dGluZy4KKy0gTWF4aW11bSB0YXBlIHNwZWVkIHJlYWQgZnJvbSBkcml2ZSB0eXBlIGluZm9ybWF0aW9uIHRhYmxlLgorICBJZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSB0YWJsZSAoMCkgdGhlIGRyaXZlIHdpbGwKKyAgZGV0ZXJtaW5lIHRoZSBzcGVlZCBpdHNlbGYgYW5kIHB1dCBhIG1lc3NhZ2UgaW4gdGhlIGxvZ2ZpbGUuCisgIFRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIHRoZW4gYmUgYWRkZWQgdG8gdGhlIHRhYmxlIGluIHRoZQorICB2ZW5kb3JzLmggZmlsZSAoYW5kIHJlcG9ydGVkIHRvIG1lKS4KKy0gQWRkZWQgY2FsbCB0byBmdGFwZV9pbml0X2RyaXZlIGFmdGVyIHNvZnQgcmVzZXQgZm9yIHRob3NlCisgIChhbnRpcXVlKSBkcml2ZXMgdGhhdCBkb24ndCBkbyBhbiBpbXBsaWNpdCBzZWVrX2xvYWRfcG9pbnQKKyAgYWZ0ZXIgYSByZXNldCBvciBwb3dlciB1cC4KKy0gRG9uJ3QgdHJ5IHRvIHNldCBkYXRhIHJhdGUgaWYgcmVzZXQgZmFpbGVkLgorLSBQcmV2ZW50IHVwZGF0ZSBvZiBzZWVrIHZhcmlhYmxlcyB3aGVuIHN0YXJ0aW5nIGZyb20gdGhlCisgIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIHRoZSB0YXBlLgorLSBGaXhlZCB3cm9uZyBhZGp1c3RtZW50IG9mIG92ZXJzaG9vdCBpbiBzZWVrX2ZvcndhcmQoKS4KKy0gQWRkZWQgc3luYyB0byBNYWtlZmlsZSAoYWdhaW4pLgorLSBBZGRlZCBjb2RlIHRvIGRpYWdub3NlIHRpbWVyIHByb2JsZW1zIChjYWxpYnIuYykuCistIFJlcGxhY2VkIHRpbWUgZGlmZmVyZW5jZXMgYnkgdGltZWRpZmYgY2FsbHMuCistIFJlbW92ZWQgcmVmZXJlbmNlIHRvIGRvX2Zsb3BweSBmcm9tIG9iamVjdCBmb3IgcmVjZW50IGtlcm5lbHMuCistIEZpeGVkIHdyb25nIGRpc3BsYXkgb2YgJ2ZhaWxpbmcgZG1hIGNvbnRyb2xsZXInIG1lc3NhZ2UuCistIFJlbW92ZWQgdmFyaW91cyBubyBsb25nZXIgdXNlZCAjaW5jbHVkZSBzdGF0ZW1lbnRzLgorLSBBZGRlZCBtYXguIHRhcGUgc3BlZWQgdmFsdWUgdG8gdmVuZG9yLXN0cnVjdC4KKy0gQ2hhbmdlZCBmdGFwZS1jb21tYW5kIHRvIGNoZWNrIHByZS1jb25kaXRpb25zIGFuZCB3YWl0CisgIGlmIG5lZWRlZC4KKy0gRnVydGhlciB1cGRhdGVkIHFpYzExNy5oIHRvIHJldiBHLgorLSBDb21iaW5lZCBjb21tYW5kIG5hbWUgdGFibGUgYW5kIHJlc3RyaWN0aW9ucyB0YWJsZSB0byBvbmUuCisgIEV4dGVuZGVkIHRoaXMgdGFibGUgd2l0aCBzb21lIG5ldyBmaWVsZHMuCistIEluY3JlYXNlZCB0aW1lb3V0IG9uIEFjayB0aW1lciB2YWx1ZSBhbmQgaW5jbHVkZWQgY29kZSB0bworICByZXBvcnQgb3V0IG9mIHNwZWMgYmVoYXZpb3VyLgorLSBJbmNyZWFzZWQgcmV3aW5kIHRpbWVvdXQgbWFyZ2luIHRvIGNhbGN1bGF0ZWQgKyAyMCUuCistIEltcHJvdmVkIGRhdGEgcmF0ZSBzZWxlY3Rpb24gc28gaXQgd29uJ3QgZmFpbCBvbiBzb21lCisgIG9sZGVyIChwcmUgc3RhbmRhcmQpIGRyaXZlcy4KKy0gQ2hhbmdlZCBpbml0aWFsaXNhdGlvbiBjb2RlIHNvIGRyaXZlIHdpbGwgYmUgcmV3b3VuZCBpZiB0aGUKKyAgZHJpdmVyIGlzIHJlbG9hZGVkIGFuZCB0aGUgdGFwZSBpcyBub3QgYXQgYm90LgorLSBNb3ZlZCBzb21lIG9mIHRoZSBmbHVzaCBvcGVyYXRpb25zIGZyb20gY2xvc2UgdG8gdGhlIGlvY3Rscy4KKy0gQWRkZWQgZXhpdCBjb2RlIHZhbHVlIHRvIGZhaWxpbmcgdmVyaWZ5IGFyZWEgbWVzc2FnZS4KKy0gTG9vcCB1bnRpbCB0YXBlIGhhbHRlZCBpbiBzbWFydC1zdG9wLgorLSBGYXN0IHNlZWsgaGFuZGxlZCBzcGVjaWFsbHkgaWYgbG9jYXRlZCBhdCBib3Qgb3IgZW90LgorLSBCZWluZyBtb3JlIGNvbnNlcnZhdGl2ZSBvbiBvdmVyc2hvb3QgdmFsdWUuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMCwgMzEvMTIvOTQgPT09PT0KKworICBUaGUgSW5zdGFsbC1ndWlkZSBpcyBjb21wbGV0ZWx5IHJld3JpdHRlbiBhbmQgbm93IGFsc28gaW5jbHVkZXMKK3NvbWUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgZHJpdmVyLiBJZiB5b3UncmUgZWl0aGVyIG5ldwordG8gZnRhcGUgb3IgbmV3IHRvIFVuaXggdGFwZSBkZXZpY2VzIG1ha2Ugc3VyZSB0byByZWFkIGl0ICEKKworICBJZiB5b3Ugb3duIGEgcGNpIHN5c3RlbSBhbmQgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoZQorZnRhcGUgZHJpdmVyIG1ha2Ugc3VyZSB0byByZWFkIHRoZSBSRUFETUUuUENJIGZpbGUuIEl0IGNvbnRhaW5zCitzb21lIGhpbnRzIG9uIGhvdyB0byBmaXggeW91ciBoYXJkd2FyZS4KKworICBGb3IgYW55Ym9keSB3aG8gaGFzbid0IG5vdGljZWQ6IFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK2RyaXZlciBoYXMgYmVlbiBpbmNyZW1lbnRlZCAoVGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uIGhhcworYmVlbiB2ZXJzaW9uIDEuMTRkKS4KKyAgVGhpcyBoYXMgYmVlbiBkb25lIGZvciB0d28gbWFqb3IgcmVhc29uczoKKworICBvICBBIG5ldyAoYmV0dGVyKSBlcnJvciByZWNvdmVyeSBzY2hlbWUgaXMgaW1wbGVtZW50ZWQuCisgIG8gIFN1cHBvcnQgZm9yIG5ldyBkcml2ZSB0eXBlcyBoYXMgYmVlbiBhZGRlZC4KKworICBBbGwgdGhlc2UgaW1wcm92ZW1lbnRzL2NoYW5nZXMgd2lsbCBwcm9iYWJseSBpbmNsdWRlIGEgY291cGxlCitvZiBuZXcgKGFuZCBvbGQ/KSBidWdzLiBJZiB5b3UgZW5jb3VudGVyIGFueSBwcm9ibGVtcyB0aGF0IHlvdSB0aGluaworSSdtIG5vdCB5ZXQgYXdhcmUgb2YsIGZlZWwgZnJlZSB0byBzZW5kIGEgcmVwb3J0IHRvIDxiYXNAdmltZWMubmw+LgorICBJIHJlY29tbWVuZCBrZWVwaW5nIGEgdmVyc2lvbiBvZiBmdGFwZS0xLjE0ZCBhdmFpbGFibGUsIGp1c3QKK2luIGNhc2UgOy0pCisKKyAgVGhpcyB2ZXJzaW9uIHNob3VsZCB3b3JrIHdpdGggYWxsIGtlcm5lbCB2ZXJzaW9ucyBmcm9tIDEuMC45IHVwCit0byAxLjEuNzIgKGFuZCBwcm9iYWJseSBlYXJsaWVyIGFuZCBsYXRlciB2ZXJzaW9ucyB0b28pLgorCisKK01ham9yIG5ldyBmZWF0dXJlczoKKworLSBCZXR0ZXIgaGFuZGxpbmcgb2YgdGFwZXMgd2l0aCBkZWZlY3RzOiBXaGVuIGEgc2VjdG9yIHJlcGVhdGVkbHkKKyAgKFNPRlRfUkVUUklFUyBpbiBmdGFwZS5oKSBjYW5ub3QgYmUgd3JpdHRlbiB0byBvciByZWFkIGZyb20gaXQgaXMKKyAgbWFya2VkIGFzIGFuIGhhcmQgZXJyb3IgYW5kIGdldHMgc2tpcHBlZC4KKyAgVGhlIGVycm9yIGNvcnJlY3Rpb24gY29kZSBjYW4gaGFuZGxlIHVwIHRvIHRocmVlIG9mIHRoZXNlIGhhcmQKKyAgZXJyb3JzIHByb3ZpZGVkIHRoZXJlIGFyZSBubyBvdGhlciBlcnJvcnMgaW4gdGhhdCBzZWdtZW50ICgzMiBLYikuCisgIAorLSBBbGxvd3Mgd3JpdGluZyB0byB0YXBlcyB3aXRoIGRlZmVjdHMgKGFsdGhvdWdoIHRoZSByaXNrIG9mIGxvb3NpbmcKKyAgZGF0YSBpbmNyZWFzZXMgISkKKyAgTG9vayBmb3IgdGhlIG1lZGlhLWRlZmVjdHMgZW50cnkgcHJpbnRlZCB3aXRoIHRoZSBzdGF0aXN0aWNzIHdoZW4KKyAgdGhlIHRhcGUgaXMgY2xvc2VkLiBBIG5vbi16ZXJvIHZhbHVlIGhlcmUgc2hvd3MgYSBiYWQgdGFwZS4KKyAgW3RoZSBhY3R1YWwgY291bnQgaXMgd3JvbmcgKHRvbyBoaWdoKSwgdGhpcyBpcyBhIGtub3duIGJ1Z10uCisKKy0gVXNlIG9mIGJhY2t1cCBoZWFkZXIgc2VnbWVudCBpZiBmaXJzdCBvbmUgaXMgZmFpbGluZy4KKworLSBTdXBwb3J0IGZvciBleHRlbmRlZCBsZW5ndGggdGFwZXMgd2l0aCBRSUMtODA6IGJvdGggNDI1IGFuZCAxMTAwIGZ0LgorICAwLjI1IGluY2ggdGFwZXMgYXJlIG5vdyByZWNvZ25pemVkIGFuZCBoYW5kbGVkLgorCistIFN1cHBvcnQgZm9yIG5ldyBRSUMtODAgZHJpdmVzIHdpdGggOCBtbSBgd2lkZScgdGFwZXMgKGUuZy4gQ29ubmVyCisgIFRTTSA0MjApLgorCistIFN1cHBvcnQgZm9yIG5ldyBRSUMtMzAxMCBhbmQgUUlDLTMwMjAgZHJpdmVzIChleHBlcmltZW50YWwpIHdpdGgKKyAgYm90aCAwLjI1IGluY2ggYW5kIDggbW0gdGFwZXMuCisKK1NvbWUgbWlub3IgZmVhdHVyZXMgd2VyZSBhZGRlZCwgYSBjb3VwbGUgb2Ygc21hbGwgYnVncyB3ZXJlIGZpeGVkIGFuZAorcHJvYmFibHkgc29tZSBuZXcgb25lcyBpbnRyb2R1Y2VkIDstKS4KKworW2xzZWVrKCkgZGlkbid0IG1ha2UgaXQgaW50byB0aGlzIHZlcnNpb25dCisKK0hhdmUgZnVuLAorCitCYXMuCistLS0tCisgTG9jYWxXb3JkczogIGZ0YXBlIE1DT05GSUcgbXQgVkZTIHpmdGFwZSByZXNwIHNmdGFwZSBwcm9jIHN1YmRpciBNVElPQ1ZPTElORk8KKyBMb2NhbFdvcmRzOiAgTVRJT0NHRVRTSVpFIEJPVCBFT0QgTVRCU0YgemZ0IGtlcm5lbGQgbW9kcHJvYmUga2R0aW1lIGNvbnRyaWIgVFIKKyBMb2NhbFdvcmRzOiAgTVRTRVRCTEsgYWZpbyB1bmluc3RhbGwgdGV4aSB3d3cgRUlPIFFJQyBpbml0IHNmdCBlb2YgYWthIGRtYSBHQgorIExvY2FsV29yZHM6ICBTSUdLSUxMIE1USU9DRlRDTUQgbW1hcCBJb21lZ2EgRkRDIGZkYyBpbyBnbnVtdCBtdGlvIGZjIGFzbSBpbmIKKyBMb2NhbFdvcmRzOiAgb3V0YiBmdCBxaWMgZnJvbnRlbmQgVGVYaW5mbyBpcnEgbWFjaCBNT0RWRVJTSU9OUyBDT05GSUcgaHRtbCBkdmkKKyBMb2NhbFdvcmRzOiAgdXNyIGRvYyBTTVAgTWIgRHVubm8gRklYTUUgdnRibGMgcGVybCBsaXN0dGFwZSB2b2xpbmZvIGZzZiBNVFdFT0YKKyBMb2NhbFdvcmRzOiAgYW1hbmRhIGRlZ2F1c3NlZCBDb21CeXRlIERvdWJsZVBsYXkgd2hyYXZlbiBuamFja24gY29tIE1USU9DIHZ0YmwKKyBMb2NhbFdvcmRzOiAgR0VUQkxLU1ogTUFLRURFViB6ZnRhcGUncyBsaW51eCBkaWYgQ1ZTIFJldmlzb24gY3AgTVRSRVcgTVRPRkZMCisgTG9jYWxXb3JkczogIE1URlNGIEJTRiBNYXJjaW4gRGFsZWNraSBHQ0MgQ29uZmlnIGNwaW8gc3dhcG91dCBLYWkgSGFycmVraWxkZQorIExvY2FsV29yZHM6ICBQZWRlcnNvbiBraHAgZG9scGhpbmljcyBKdXN0dXMgY2xhdXMgbW9tbyByd3RoIGFhY2hlbiBMYWFyaG92ZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiZDZjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvY29tcHJlc3Nvci9NYWtlZmlsZSx2ICQKKyMgJFJldmlzaW9uOiAxLjEgJAorIyAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxMjoyOCAkCisjCisjICAgICAgTWFrZWZpbGUgZm9yIHRoZSBvcHRpb25hbCBjb21wcmVzc29yIGZvciB0aCB6ZnRhcGUgVkZTCisjICAgICAgaW50ZXJmYWNlIHRvIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IKKyMgICAgICBMaW51eC4KKyMKKworb2JqLSQoQ09ORklHX1pGVF9DT01QUkVTU09SKSArPSB6ZnQtY29tcHJlc3Nvci5vCisKK3pmdC1jb21wcmVzc29yLW9ianMgOj0gemZ0YXBlLWNvbXByZXNzLm8gbHpydzMubworCitDRkxBR1NfbHpydzMubwk6PSAtTzYgLWZ1bnJvbGwtYWxsLWxvb3BzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDMyYTBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYwpAQCAtMCwwICsxLDc0MyBAQAorLyoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9jb21wcmVzc29yL2x6cnczLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxMjoyOSAkCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgUm9zcyBXaWxsaWFtcyBsenJ3MyBhbGdvcml0aG0uIEFkYXB0aW9uIGZvciB6ZnRhcGUuCisgKgorICovCisKKyNpbmNsdWRlICIuLi9jb21wcmVzc29yL2x6cnczLmgiICAgICAgIC8qIERlZmluZXMgc2luZ2xlIGV4cG9ydGVkIGZ1bmN0aW9uICJjb21wcmVzcyIuICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExaUlczLkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXV0aG9yICA6IFJvc3MgV2lsbGlhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGUgICAgOiAzMC1KdW4tMTk5MS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZWxlYXNlIDogMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWlJXMyBkYXRhIGNvbXByZXNzaW9uICAgICAgICAgKi8KKy8qIGFsZ29yaXRobSBpbiBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIGFsZ29yaXRobSBpcyBhIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdGhhdCBydW5zIGZhc3QgICAgKi8KKy8qIGFuZCBnaXZlcyByZWFzb25hYmxlIGNvbXByZXNzaW9uLiBUaGUgYWxnb3JpdGhtIGlzIGEgbWVtYmVyIG9mIHRoZSBMZW1wZWwgICovCisvKiBaaXYgZmFtaWx5IG9mIGFsZ29yaXRobXMgYW5kIGJhc2VzIGl0cyBjb21wcmVzc2lvbiBvbiB0aGUgcHJlc2VuY2UgaW4gdGhlICAqLworLyogZGF0YSBvZiByZXBlYXRlZCBzdWJzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGFsZ29yaXRobSBpcyB1bnBhdGVudGVkIGFuZCB0aGUgY29kZSBpcyBwdWJsaWMgZG9tYWluLiBBcyB0aGUgICAgICAgICAqLworLyogYWxnb3JpdGhtIGlzIGJhc2VkIG9uIHRoZSBMWjc3IGNsYXNzIG9mIGFsZ29yaXRobXMsIGl0IGlzIHVubGlrZWx5IHRvIGJlICAgKi8KKy8qIHRoZSBzdWJqZWN0IG9mIGEgcGF0ZW50IGNoYWxsZW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5saWtlIHRoZSBMWlJXMSBhbmQgTFpSVzEtQSBhbGdvcml0aG1zLCB0aGUgTFpSVzMgYWxnb3JpdGhtIGlzICAgICAgICAgICAgKi8KKy8qIGRldGVybWluaXN0aWMgYW5kIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgdGhlIHNhbWUgY29tcHJlc3NlZCAgICAgICAgICAgICAgICovCisvKiByZXByZXNlbnRhdGlvbiBmb3IgYSBnaXZlbiBmaWxlIGVhY2ggdGltZSBpdCBpcyBydW4uICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBMWlJXMyBhbGdvcml0aG0gd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkICAgICAgICAgICAgICAgICovCisvKiBieSBSb3NzIFdpbGxpYW1zIG9uIDMxLURlYy0xOTkwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhlcmUgYXJlIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoaXMgY29kZSwgY29tcGlsZWQgdW5kZXIgVEhJTksgQyA0LjAgICAgICovCisvKiBhbmQgcnVubmluZyBvbiBhIE1hYy1TRSAoOE1IeiA2ODAwMCksIHRvIHRoZSBzdGFuZGFyZCBjYWxnYXJ5IGNvcnB1cy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICovCisvKiAgICB8IERBVEEgQ09NUFJFU1NJT04gVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCA9PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgVGltZSBvZiBydW4gICAgIDogU3VuIDMwLUp1bi0xOTkxIDA5OjMxUE0gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8IFRpbWluZyBhY2N1cmFjeSA6IE9uZSBwYXJ0IGluIDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBDb250ZXh0IGxlbmd0aCAgOiAyNjIxNDQgYnl0ZXMgKD0gMjU2LjAwMDBLKSAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgVGVzdCBzdWl0ZSAgICAgIDogQ2FsZ2FyeSBDb3JwdXMgU3VpdGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8IEZpbGVzIGluIHN1aXRlICA6IDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBBbGdvcml0aG0gICAgICAgOiBMWlJXMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgTm90ZTogQWxsIGF2ZXJhZ2VzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIHVuLXJvdW5kZWQgdmFsdWVzLiAgfCAgICAgICovCisvKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAqLworLyogICAgfCBGaWxlIE5hbWUgICBMZW5ndGggIEN4QiAgQ29tTGVuICAlUmVtbiAgQml0cyAgQ29tIEsvcyAgRGVjIEsvcyB8ICAgICAgKi8KKy8qICAgIHwgLS0tLS0tLS0tLSAgLS0tLS0tICAtLS0gIC0tLS0tLSAgLS0tLS0gIC0tLS0gIC0tLS0tLS0gIC0tLS0tLS0gfCAgICAgICovCisvKiAgICB8IHJwdXM6QmliLkQgIDExMTI2MSAgICAxICAgNTUwMzMgICA0OS41ICAzLjk2ICAgIDE5LjQ2ICAgIDMyLjI3IHwgICAgICAqLworLyogICAgfCB1czpCb29rMS5EICA3Njg3NzEgICAgMyAgNDY3OTYyICAgNjAuOSAgNC44NyAgICAxNy4wMyAgICAzMS4wNyB8ICAgICAgKi8KKy8qICAgIHwgdXM6Qm9vazIuRCAgNjEwODU2ICAgIDMgIDMxNzEwMiAgIDUxLjkgIDQuMTUgICAgMTkuMzkgICAgMzQuMTUgfCAgICAgICovCisvKiAgICB8IHJwdXM6R2VvLkQgIDEwMjQwMCAgICAxICAgODI0MjQgICA4MC41ICA2LjQ0ICAgIDExLjY1ICAgIDE4LjE4IHwgICAgICAqLworLyogICAgfCBwdXM6TmV3cy5EICAzNzcxMDkgICAgMiAgMjA1NjcwICAgNTQuNSAgNC4zNiAgICAxNy4xNCAgICAyNy40NyB8ICAgICAgKi8KKy8qICAgIHwgcHVzOk9iajEuRCAgIDIxNTA0ICAgIDEgICAxMzAyNyAgIDYwLjYgIDQuODUgICAgMTMuNDAgICAgMTguOTUgfCAgICAgICovCisvKiAgICB8IHB1czpPYmoyLkQgIDI0NjgxNCAgICAxICAxMTYyODYgICA0Ny4xICAzLjc3ICAgIDE5LjMxICAgIDMwLjEwIHwgICAgICAqLworLyogICAgfCBzOlBhcGVyMS5EICAgNTMxNjEgICAgMSAgIDI3NTIyICAgNTEuOCAgNC4xNCAgICAxOC42MCAgICAzMS4xNSB8ICAgICAgKi8KKy8qICAgIHwgczpQYXBlcjIuRCAgIDgyMTk5ICAgIDEgICA0NTE2MCAgIDU0LjkgIDQuNDAgICAgMTguNDUgICAgMzIuODQgfCAgICAgICovCisvKiAgICB8IHJwdXM6UGljLkQgIDUxMzIxNiAgICAyICAxMjIzODggICAyMy44ICAxLjkxICAgIDM1LjI5ICAgIDUxLjA1IHwgICAgICAqLworLyogICAgfCB1czpQcm9nYy5EICAgMzk2MTEgICAgMSAgIDE5NjY5ICAgNDkuNyAgMy45NyAgICAxOC44NyAgICAzMC42NCB8ICAgICAgKi8KKy8qICAgIHwgdXM6UHJvZ2wuRCAgIDcxNjQ2ICAgIDEgICAyODI0NyAgIDM5LjQgIDMuMTUgICAgMjQuMzQgICAgNDAuNjYgfCAgICAgICovCisvKiAgICB8IHVzOlByb2dwLkQgICA0OTM3OSAgICAxICAgMTkzNzcgICAzOS4yICAzLjE0ICAgIDIzLjkxICAgIDM5LjIzIHwgICAgICAqLworLyogICAgfCB1czpUcmFucy5EICAgOTM2OTUgICAgMSAgIDMzNDgxICAgMzUuNyAgMi44NiAgICAyNS40OCAgICA0MC4zNyB8ICAgICAgKi8KKy8qICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICovCisvKiAgICB8IEF2ZXJhZ2UgICAgIDIyNDQwMSAgICAxICAxMTA5NTMgICA1MC4wICA0LjAwICAgIDIwLjE3ICAgIDMyLjcyIHwgICAgICAqLworLyogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSB0aGUgImNvbXByZXNzIiBmdW5jdGlvbiBiZWxvdyB3aGVuICAqLworLyogdGhlIHVzZXIgYXNrcyB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgKi8KKy8qIFRoZSBtb3N0IGltcG9ydGFudCBmaWVsZCBpbiB0aGUgcmVjb3JkIGlzIHRoZSB3b3JraW5nIG1lbW9yeSBmaWVsZCB3aGljaCAgICovCisvKiB0ZWxscyB0aGUgY2FsbGluZyBwcm9ncmFtIGhvdyBtdWNoIHdvcmtpbmcgbWVtb3J5IHNob3VsZCBiZSBwYXNzZWQgdG8gICAgICAqLworLyogImNvbXByZXNzIiB3aGVuIGl0IGlzIGNhbGxlZCB0byBwZXJmb3JtIGEgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbi4gICAgKi8KKy8qIExaUlczIHVzZXMgdGhlIHNhbWUgYW1vdW50IG9mIG1lbW9yeSBkdXJpbmcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICovCisvKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHN0cnVjdHVyZSBzZWUgImNvbXByZXNzLmgiLiAgICAgICAgICAgICAgICAgICAqLworICAKKyNkZWZpbmUgVShYKSAgICAgICAgICAgICgoVUxPTkcpIFgpCisjZGVmaW5lIFNJWkVfUF9CWVRFICAgICAoVShzaXplb2YoVUJZVEUgKikpKQorI2RlZmluZSBTSVpFX1dPUkQgICAgICAgKFUoc2l6ZW9mKFVXT1JEICApKSkKKyNkZWZpbmUgQUxJR05NRU5UX0ZVREdFIChVKDE2KSkKKyNkZWZpbmUgTUVNX1JFUSAoIFUoNDA5NikqKFNJWkVfUF9CWVRFKSArIEFMSUdOTUVOVF9GVURHRSApCisKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NfaWRlbnRpdHkgaWRlbnRpdHkgPQoreworIFUoMHgwMzJEREVBOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIGlkZW50aWZpY2F0aW9uIG51bWJlci4gKi8KKyBNRU1fUkVRLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdvcmtpbmcgbWVtb3J5IChieXRlcykgcmVxdWlyZWQuICovCisgIkxaUlczIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAqLworICIxLjAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiBudW1iZXIgb2YgYWxnb3JpdGhtLiAgICAgKi8KKyAiMzEtRGVjLTE5OTAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGUgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICovCisgIlB1YmxpYyBEb21haW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5cmlnaHQgbm90aWNlLiAgICAgICAgICAgICAgICAqLworICJSb3NzIE4uIFdpbGxpYW1zIiwgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aG9yIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgKi8KKyAiUmVuYWlzc2FuY2UgU29mdHdhcmUiLCAgICAgICAgICAgICAgICAgIC8qIEFmZmlsaWF0aW9uIG9mIGF1dGhvci4gICAgICAgICAgICovCisgIlB1YmxpYyBEb21haW4iICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3Igb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAqLworfTsKKyAKK0xPQ0FMIHZvaWQgY29tcHJlc3NfY29tcHJlc3MgIChVQllURSAqLFVCWVRFICosVUxPTkcsVUJZVEUgKiwgTE9ORyAqKTsKK0xPQ0FMIHZvaWQgY29tcHJlc3NfZGVjb21wcmVzcyhVQllURSAqLFVCWVRFICosTE9ORywgVUJZVEUgKiwgVUxPTkcgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9ubHkgZnVuY3Rpb24gZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICAgICAgICAgICAgICAgICovCisvKiBEZXBlbmRpbmcgb24gaXRzIGZpcnN0IHBhcmFtZXRlciwgdGhlIGZ1bmN0aW9uIGNhbiBiZSByZXF1ZXN0ZWQgdG8gICAgICAgICAqLworLyogY29tcHJlc3MgYSBibG9jayBvZiBtZW1vcnksIGRlY29tcHJlc3MgYSBibG9jayBvZiBtZW1vcnksIG9yIHRvIGlkZW50aWZ5ICAgKi8KKy8qIGl0c2VsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlICJjb21wcmVzcy5oIi4gICAgICovCisKK0VYUE9SVCB2b2lkIGx6cnczX2NvbXByZXNzKAorCVVXT1JEICAgICBhY3Rpb24sICAgICAgLyogQWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4JCSovCisJVUJZVEUgICAqd3JrX21lbSwJLyogQWRkcmVzcyBvZiB3b3JraW5nIG1lbW9yeSB3ZSBjYW4gdXNlLiovCisJVUJZVEUgICAqc3JjX2FkciwJLyogQWRkcmVzcyBvZiBpbnB1dCBkYXRhLgkJKi8KKwlMT05HICAgICBzcmNfbGVuLAkvKiBMZW5ndGggIG9mIGlucHV0IGRhdGEuCQkqLworCVVCWVRFICAgKmRzdF9hZHIsCS8qIEFkZHJlc3MgdG8gcHV0IG91dHB1dCBkYXRhLgkJKi8KKwl2b2lkICAqcF9kc3RfbGVuCS8qIEFkZHJlc3Mgb2YgbG9uZ3dvcmQgZm9yIGxlbmd0aCBvZiBvdXRwdXQgZGF0YS4qLworKQoreworIHN3aXRjaCAoYWN0aW9uKQorICAgeworICAgIGNhc2UgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZOgorICAgICAgICooKHN0cnVjdCBjb21wcmVzc19pZGVudGl0eSAqKilwX2RzdF9sZW4pPSAmaWRlbnRpdHk7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1M6CisgICAgICAgY29tcHJlc3NfY29tcHJlc3Mod3JrX21lbSxzcmNfYWRyLHNyY19sZW4sZHN0X2FkciwoTE9ORyAqKXBfZHN0X2xlbik7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01QUkVTU19BQ1RJT05fREVDT01QUkVTUzoKKyAgICAgICBjb21wcmVzc19kZWNvbXByZXNzKHdya19tZW0sc3JjX2FkcixzcmNfbGVuLGRzdF9hZHIsKExPTkcgKilwX2RzdF9sZW4pOworICAgICAgIGJyZWFrOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJSSUVGIERFU0NSSVBUSU9OIE9GIFRIRSBMWlJXMyBBTEdPUklUSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIExaUlczIGFsZ29yaXRobSBpcyBpZGVudGljYWwgdG8gdGhlIExaUlcxLUEgYWxnb3JpdGhtIGV4Y2VwdCB0aGF0ICAgICAgKi8KKy8qIGluc3RlYWQgb2YgdHJhbnNtaXR0aW5nIGhpc3Rvcnkgb2Zmc2V0cywgaXQgdHJhbnNtaXRzIGhhc2ggdGFibGUgaW5kZXhlcy4gICovCisvKiBJbiBvcmRlciB0byBkZWNvZGUgdGhlIGluZGV4ZXMsIHRoZSBkZWNvbXByZXNzb3IgbXVzdCBtYWludGFpbiBhbiAgICAgICAgICAqLworLyogaWRlbnRpY2FsIGhhc2ggdGFibGUuIENvcHkgaXRlbXMgYXJlIHN0cmFpZ2h0Zm9yd2FyZDp3aGVuIHRoZSBkZWNvbXByZXNzb3IgKi8KKy8qIHJlY2VpdmVzIGEgY29weSBpdGVtLCBpdCBzaW1wbHkgbG9va3MgdXAgdGhlIGhhc2ggdGFibGUgdG8gdHJhbnNsYXRlIHRoZSAgICovCisvKiBpbmRleCBpbnRvIGEgcG9pbnRlciBpbnRvIHRoZSBkYXRhIGFscmVhZHkgZGVjb21wcmVzc2VkLiBUbyB1cGRhdGUgdGhlICAgICAqLworLyogaGFzaCB0YWJsZSwgaXQgcmVwbGFjZXMgdGhlIHNhbWUgdGFibGUgZW50cnkgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0ICAgKi8KKy8qIG9mIHRoZSBuZXdseSBkZWNvZGVkIHBocmFzZS4gVGhlIHRyaWNreSBwYXJ0IGlzIHdpdGggbGl0ZXJhbCBpdGVtcywgZm9yIGF0ICovCisvKiB0aGUgdGltZSB0aGF0IHRoZSBkZWNvbXByZXNzb3IgcmVjZWl2ZXMgYSBsaXRlcmFsIGl0ZW0gdGhlIGRlY29tcHJlc3NvciAgICAqLworLyogZG9lcyBub3QgaGF2ZSB0aGUgdGhyZWUgYnl0ZXMgaW4gdGhlIFppdiAodGhhdCB0aGUgY29tcHJlc3NvciBoYXMpIHRvICAgICAgKi8KKy8qIHBlcmZvcm0gdGhlIHRocmVlLWJ5dGUgaGFzaC4gVG8gc29sdmUgdGhpcyBwcm9ibGVtLCBpbiBMWlJXMywgYm90aCB0aGUgICAgICovCisvKiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYXJlIHdpcmVkIHVwIHNvIHRoYXQgdGhleSAiYnVmZmVyIiB0aGVzZSAgICAgICAqLworLyogbGl0ZXJhbHMgYW5kIHVwZGF0ZSB0aGVpciBoYXNoIHRhYmxlcyBvbmx5IHdoZW4gdGhyZWUgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KKy8qIFRoaXMgbWFrZXMgdGhlIG1heGltdW0gYnVmZmVyaW5nIDIgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVwbGFjZW1lbnQgb2Ygb2Zmc2V0cyBieSBoYXNoIHRhYmxlIGluZGV4ZXMgeWllbGRzIGEgZmV3IHBlcmNlbnQgZXh0cmEgICAgKi8KKy8qIGNvbXByZXNzaW9uIGF0IHRoZSBjb3N0IG9mIHNvbWUgc3BlZWQuIExaUlczIGlzIHNsb3dlciB0aGFuIExaUlcxLCBMWlJXMS1BICovCisvKiBhbmQgTFpSVzIsIGJ1dCB5aWVsZHMgYmV0dGVyIGNvbXByZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEV4dHJhIGNvbXByZXNzaW9uIGNvdWxkIGJlIG9idGFpbmVkIGJ5IHVzaW5nIGEgaGFzaCB0YWJsZSBvZiBkZXB0aCB0d28uICAgICovCisvKiBIb3dldmVyLCBpbmNyZWFzaW5nIHRoZSBkZXB0aCBhYm92ZSBvbmUgaW5jdXJzIGEgc2lnbmlmaWNhbnQgZGVjcmVhc2UgaW4gICAqLworLyogY29tcHJlc3Npb24gc3BlZWQgd2hpY2ggd2FzIG5vdCBjb25zaWRlcmVkIHdvcnRod2hpbGUuIEFub3RoZXIgcmVhc29uIGZvciAgKi8KKy8qIGtlZXBpbmcgdGhlIGRlcHRoIGRvd24gdG8gb25lIHdhcyB0byBhbGxvdyBlYXN5IGNvbXBhcmlzb24gd2l0aCB0aGUgICAgICAgICovCisvKiBMWlJXMS1BIGFuZCBMWlJXMiBhbGdvcml0aG1zIHNvIGFzIHRvIGRlbW9uc3RyYXRlIHRoZSBleGFjdCBlZmZlY3Qgb2YgdGhlICAqLworLyogdXNlIG9mIGRpcmVjdCBoYXNoIGluZGV4ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX3w0MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSpffDwtLS0rICAgLy0tLS0rLS0tXCAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfF9fX3wgICAgKy0tLXxIYXNoICAgIHwgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHxfX198ICAgICAgICB8RnVuY3Rpb258ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8X19ffCAgICAgICAgXC0tLS0tLS0tLyAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfF9fX3wwICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICstLS0rICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBIYXNoICAgICAgICArLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgVGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgKi8KKy8qICAgICAgfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwgICAgICAgICAgICAgICovCisvKiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAqLworLyogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwxLi4uLi4uMTh8ICAgICAgfCAgICAgICAgICAgICAgKi8KKy8qICAgICAgfDwtLS0tLS0tIExlbXBlbD1IaXN0b3J5IC0tLS0tLS0tLS0tLT58PC0tWml2LS0+fCAgICAgIHwgICAgICAgICAgICAgICovCisvKiAgICAgIHwgICAgICg9Ynl0ZXMgYWxyZWFkeSBwcm9jZXNzZWQpICAgICAgfDwtU3RpbGwgdG8gZ28tLT58ICAgICAgICAgICAgICAqLworLyogICAgICB8PC0tLS0tLS0tLS0tLS0tLS0tLS0tIElOUFVUIEJMT0NLIC0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgZGlhZ3JhbSBhYm92ZSBmb3IgTFpSVzMgbG9va3MgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgZGlhZ3JhbSBmb3IgICAgICAqLworLyogTFpSVzEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaW4gTFpSVzMsIHRoZSBjb21wcmVzc29yIHRyYW5zbWl0cyBoYXNoICAgICAgKi8KKy8qIHRhYmxlIGluZGljZXMgaW5zdGVhZCBvZiBMZW1wZWwgb2Zmc2V0cy4gRm9yIHRoaXMgdG8gd29yaywgdGhlICAgICAgICAgICAgICovCisvKiBkZWNvbXByZXNzb3IgbXVzdCBtYWludGFpbiBhIGhhc2ggdGFibGUgYXMgd2VsbCBhcyB0aGUgY29tcHJlc3NvciBhbmQgYm90aCAqLworLyogY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgImJ1ZmZlciIgbGl0ZXJhbHMsIGFzIHRoZSBkZWNvbXByZXNzb3IgICAgKi8KKy8qIGNhbm5vdCBoYXNoIHBocmFzZXMgY29tbWVuY2luZyB3aXRoIGEgbGl0ZXJhbCB1bnRpbCBhbm90aGVyIHR3byBieXRlcyBoYXZlICovCisvKiBhcnJpdmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMWlJXMyBBbGdvcml0aG0gRXhlY3V0aW9uIFN1bW1hcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIEhhc2ggdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZSBaaXYgdG8geWllbGQgYSBoYXNoIHRhYmxlIGluZGV4IGguICAgKi8KKy8qICAyLiBMb29rIHVwIHRoZSBoYXNoIHRhYmxlIHlpZWxkaW5nIGhpc3RvcnkgcG9pbnRlciBwLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gTWF0Y2ggd2hlcmUgcCBwb2ludHMgd2l0aCB0aGUgWml2LiBJZiB0aGVyZSBpcyBhIG1hdGNoIG9mIHRocmVlIG9yICAgICAqLworLyogICAgIG1vcmUgYnl0ZXMsIGNvZGUgdGhvc2UgYnl0ZXMgKGluIHRoZSBaaXYpIGFzIGEgY29weSBpdGVtLCBvdGhlcndpc2UgICAgKi8KKy8qICAgICBjb2RlIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIFppdiBhcyBhIGxpdGVyYWwgaXRlbS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgNC4gVXBkYXRlIHRoZSBoYXNoIHRhYmxlIGFzIHBvc3NpYmxlIHN1YmplY3QgdG8gdGhlIGNvbnN0cmFpbnQgdGhhdCBvbmx5ICAqLworLyogICAgIHBocmFzZXMgY29tbWVuY2luZyB0aHJlZSBieXRlcyBiYWNrIGZyb20gdGhlIFppdiBjYW4gYmUgaGFzaGVkIGFuZCAgICAgKi8KKy8qICAgICBlbnRlcmVkIGludG8gdGhlIGhhc2ggdGFibGUuIChUaGlzIGVuYWJsZXMgdGhlIGRlY29tcHJlc3NvciB0byBrZWVwICAgICovCisvKiAgICAgcGFjZSkuIFNlZSB0aGUgZGVzY3JpcHRpb24gYW5kIGNvZGUgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIENPTVBSRVNTRUQgRklMRSBGT1JNQVQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBIGNvbXByZXNzZWQgZmlsZSBjb25zaXN0cyBvZiBhIENPUFkgRkxBRyBmb2xsb3dlZCBieSBhIFJFTUFJTkRFUi4gICAgICAqLworLyogICogVGhlIGNvcHkgZmxhZyBDRiB1c2VzIHVwIGZvdXIgYnl0ZXMgd2l0aCB0aGUgZmlyc3QgYnl0ZSBiZWluZyB0aGUgICAgICAgKi8KKy8qICAgIGxlYXN0IHNpZ25pZmljYW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBJZiBDRj0xLCB0aGVuIHRoZSBjb21wcmVzc2VkIGZpbGUgcmVwcmVzZW50cyB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlICAqLworLyogICAgZXhhY3RseS4gT3RoZXJ3aXNlIENGPTAgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpbGUgY29uc2lzdHMgb2YgemVybyAgKi8KKy8qICAgIG9yIG1vcmUgR1JPVVBTLCBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgb25lIG9yIG1vcmUgYnl0ZXMuICAgICAgICAgICAgICovCisvKiAgKiBFYWNoIGdyb3VwIGNvbnNpc3RzIG9mIHR3byBieXRlcyBvZiBDT05UUk9MIGluZm9ybWF0aW9uIGZvbGxvd2VkIGJ5ICAgICAqLworLyogICAgc2l4dGVlbiBJVEVNcyBleGNlcHQgZm9yIHRoZSBsYXN0IGdyb3VwIHdoaWNoIGNhbiBjb250YWluIGZyb20gb25lICAgICAgKi8KKy8qICAgIHRvIHNpeHRlZW4gaXRlbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBbiBpdGVtIGNhbiBiZSBlaXRoZXIgYSBMSVRFUkFMIGl0ZW0gb3IgYSBDT1BZIGl0ZW0uICAgICAgICAgICAgICAgICAgICAqLworLyogICogRWFjaCBpdGVtIGNvcnJlc3BvbmRzIHRvIGEgYml0IGluIHRoZSBjb250cm9sIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIFRoZSBmaXJzdCBjb250cm9sIGJ5dGUgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IDggaXRlbXMgaW4gdGhlIGdyb3VwICAgICovCisvKiAgICB3aXRoIGJpdCAwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGdyb3VwIGFuZCBiaXQgNyB0byAgICAqLworLyogICAgdGhlIGVpZ2h0aCBpdGVtIGluIHRoZSBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIFRoZSBzZWNvbmQgY29udHJvbCBieXRlIGNvcnJlc3BvbmRzIHRvIHRoZSBzZWNvbmQgOCBpdGVtcyBpbiB0aGUgZ3JvdXAgICovCisvKiAgICB3aXRoIGJpdCAwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5pbnRoIGl0ZW0gaW4gdGhlIGdyb3VwIGFuZCBiaXQgNyB0byAgICAqLworLyogICAgdGhlIHNpeHRlZW50aCBpdGVtIGluIHRoZSBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEEgemVybyBiaXQgaW4gYSBjb250cm9sIHdvcmQgbWVhbnMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBpdGVtIGlzIGEgICAgICovCisvKiAgICBsaXRlcmFsIGl0ZW0uIEEgb25lIGJpdCBjb3JyZXNwb25kcyB0byBhIGNvcHkgaXRlbS4gICAgICAgICAgICAgICAgICAgICAqLworLyogICogQSBsaXRlcmFsIGl0ZW0gY29uc2lzdHMgb2YgYSBzaW5nbGUgYnl0ZSB3aGljaCByZXByZXNlbnRzIGl0c2VsZi4gICAgICAgKi8KKy8qICAqIEEgY29weSBpdGVtIGNvbnNpc3RzIG9mIHR3byBieXRlcyB0aGF0IHJlcHJlc2VudCBmcm9tIDMgdG8gMTggYnl0ZXMuICAgICovCisvKiAgKiBUaGUgZmlyc3QgIGJ5dGUgaW4gYSBjb3B5IGl0ZW0gd2lsbCBiZSBkZW5vdGVkIEMxLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIHNlY29uZCBieXRlIGluIGEgY29weSBpdGVtIHdpbGwgYmUgZGVub3RlZCBDMi4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEJpdHMgd2lsbCBiZSBzZWxlY3RlZCB1c2luZyBzcXVhcmUgYnJhY2tldHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGb3IgZXhhbXBsZTogQzFbMC4uM10gaXMgdGhlIGxvdyBuaWJibGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgYnl0ZS4gICAgICAqLworLyogICAgb2YgY29weSBpdGVtIEMxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIFRoZSBMRU5HVEggb2YgYSBjb3B5IGl0ZW0gaXMgZGVmaW5lZCB0byBiZSBDMVswLi4zXSszIHdoaWNoIGlzIGEgbnVtYmVyICovCisvKiAgICBpbiB0aGUgcmFuZ2UgWzMsMThdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIElOREVYIG9mIGEgY29weSBpdGVtIGlzIGRlZmluZWQgdG8gYmUgQzFbNC4uN10qMjU2K0MyWzAuLjhdIHdoaWNoICAgKi8KKy8qICAgIGlzIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMCw0MDk1XS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBIGNvcHkgaXRlbSByZXByZXNlbnRzIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgdGV4dFtQT1MtT0ZGU0VULi5QT1MtT0ZGU0VUK0xFTkdUSC0xXSB3aGVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIHRleHQgICBpcyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJpbmcuICAgICAgICAgICAgICovCisvKiAgICAgICAgICBQT1MgICAgaXMgdGhlIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSAgICAqLworLyogICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IGFsbCB0aGUgaXRlbXMgcHJlY2VlZGluZyB0aGUgaXRlbSAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPRkZTRVQgaXMgb2J0YWluZWQgZnJvbSBJTkRFWCBieSBsb29raW5nIHVwIHRoZSBoYXNoIHRhYmxlLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmb2xsb3dpbmcgI2RlZmluZSBkZWZpbmVzIHRoZSBsZW5ndGggb2YgdGhlIGNvcHkgZmxhZyB0aGF0IGFwcGVhcnMgYXQgICovCisvKiB0aGUgc3RhcnQgb2YgdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHZhbHVlIG9mIGZvdXIgYnl0ZXMgd2FzIGNob3NlbiAgICAgICAqLworLyogYmVjYXVzZSB0aGUgZmFzdF9jb3B5IHJvdXRpbmUgb24gbXkgTWFjaW50b3NoIHJ1bnMgZmFzdGVyIGlmIHRoZSBzb3VyY2UgICAgKi8KKy8qIGFuZCBkZXN0aW5hdGlvbiBibG9ja3MgYXJlIHJlbGF0aXZlbHkgbG9uZ3dvcmQgYWxpZ25lZC4gICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgYWN0dWFsIGZsYWcgZGF0YSBhcHBlYXJzIGluIHRoZSBmaXJzdCBieXRlLiBUaGUgcmVzdCBhcmUgemVyb2VkIHNvIGFzICAqLworLyogdG8gbm9ybWFsaXplIHRoZSBjb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIChpLmUuIG5vdCBub24tZGV0ZXJtaW5pc3RpYykuICAgKi8KKyNkZWZpbmUgRkxBR19CWVRFUyA0CisKKy8qIFRoZSBmb2xsb3dpbmcgI2RlZmluZXMgZGVmaW5lIHRoZSBtZWFuaW5nIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGNvcHkgICAgICAgICovCisvKiBmbGFnIGF0IHRoZSBzdGFydCBvZiB0aGUgY29tcHJlc3NlZCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGTEFHX0NPTVBSRVNTIDAgICAgIC8qIFNpZ25hbHMgdGhhdCBvdXRwdXQgd2FzIHJlc3VsdCBvZiBjb21wcmVzc2lvbi4gKi8KKyNkZWZpbmUgRkxBR19DT1BZICAgICAxICAgICAvKiBTaWduYWxzIHRoYXQgb3V0cHV0IHdhcyBzaW1wbHkgY29waWVkIG92ZXIuICAgICovCisKKy8qIFRoZSA2ODAwMCBtaWNyb3Byb2Nlc3NvciAob24gd2hpY2ggdGhpcyBhbGdvcml0aG0gd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkICovCisvKiBpcyBmdXNzeSBhYm91dCBub24tYWxpZ25lZCBhcnJheXMgb2Ygd29yZHMuIFRvIGF2b2lkIHRoZXNlIHByb2JsZW1zIHRoZSAgICAqLworLyogZm9sbG93aW5nIG1hY3JvIGNhbiBiZSB1c2VkIHRvICJ3YXN0ZSIgZnJvbSAwIHRvIDMgYnl0ZXMgc28gYXMgdG8gYWxpZ24gICAgKi8KKy8qIHRoZSBhcmd1bWVudCBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVMT05HX0FMSUdOX1VQKFgpICgoKChVTE9ORylYKStzaXplb2YoVUxPTkcpLTEpJn4oc2l6ZW9mKFVMT05HKS0xKSkKKworCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIHVuY29tcHJlc3NlZCBpdGVtLiAqLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKy8qIFRoZSBsb25nZXN0IG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBzcGFubmVkIGJ5IGEgc2luZ2xlIGl0ZW0gaXMgMTggICAgICovCisvKiBmb3IgdGhlIGxvbmdlc3QgY29weSBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhfUkFXX0lURU0gKDE4KQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIHVuY29tcHJlc3NlZCBncm91cC4qLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKy8qIEEgZ3JvdXAgY29udGFpbnMgYXQgbW9zdCAxNiBpdGVtcyB3aGljaCBleHBsYWlucyB0aGlzIGRlZmluaXRpb24uICAgICAgICAgICovCisjZGVmaW5lIE1BWF9SQVdfR1JPVVAgKDE2Kk1BWF9SQVdfSVRFTSkKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudCBkZWZpbmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbXByZXNzZWQgZ3JvdXAuICAgKi8KKy8qIFRoaXMgZGVmaW5pdGlvbiBtdXN0IG5vdCBiZSBjaGFuZ2VkOyBpdHMgdmFsdWUgaXMgaGFyZHdpcmVkIGludG8gdGhlIGNvZGUuICovCisvKiBBIGNvbXByZXNzZWQgZ3JvdXAgY29uc2lzdHMgb2YgdHdvIGNvbnRyb2wgYnl0ZXMgZm9sbG93ZWQgYnkgdXAgdG8gMTYgICAgICAqLworLyogY29tcHJlc3NlZCBpdGVtcyBlYWNoIG9mIHdoaWNoIGNhbiBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgdHdvIGJ5dGVzLiAgICAgKi8KKyNkZWZpbmUgTUFYX0NNUF9HUk9VUCAoMisxNioyKQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLiAgICAqLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKyNkZWZpbmUgSEFTSF9UQUJMRV9MRU5HVEggKDQwOTYpCisKKy8qIExaUlczLCB1bmxpa2UgTFpSVzEoLUEpLCBtdXN0IGluaXRpYWxpemUgaXRzIGhhc2ggdGFibGUgc28gYXMgdG8gZW5hYmxlICAgICovCisvKiB0aGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIHRvIHN0YXkgaW4gc3RlcCBtYWludGFpbmluZyBpZGVudGljYWwgaGFzaCAqLworLyogdGFibGVzLiBJbiBhbiBlYXJseSB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0sIHRoZSB0YWJsZXMgd2VyZSBzaW1wbHkgICAgICAgKi8KKy8qIGluaXRpYWxpemVkIHRvIHplcm8gYW5kIGEgY2hlY2sgZm9yIHplcm8gd2FzIGluY2x1ZGVkIGp1c3QgYmVmb3JlIHRoZSAgICAgICovCisvKiBtYXRjaGluZyBjb2RlLiBIb3dldmVyLCB0aGlzIHRlc3QgY29zdHMgdGltZS4gQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gICAgICAqLworLyogaW5pdGlhbGl6ZSBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgdG8gcG9pbnQgdG8gYSBjb25zdGFudCAgICAgICAgKi8KKy8qIHN0cmluZy4gVGhlIGRlY29tcHJlc3NvciBkb2VzIHRoZSBzYW1lLiBUaGlzIHNvbHV0aW9uIHJlcXVpcmVzIG5vIGV4dHJhICAgICovCisvKiB0ZXN0LiBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBkbyBub3QgbWF0dGVyIHNvIGxvbmcgYXMgdGhlIHN0cmluZyBpcyAgICAqLworLyogdGhlIHNhbWUgZm9yIHRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYW5kIGNvbnRhaW5zIGF0IGxlYXN0ICAgICAgICAgKi8KKy8qIE1BWF9SQVdfSVRFTSBieXRlcy4gSSBjaG9zZSBjb25zZWN1dGl2ZSBkZWNpbWFsIGRpZ2l0cyBiZWNhdXNlIHRoZXkgZG8gbm90ICovCisvKiBoYXZlIHdoaXRlIHNwYWNlIHByb2JsZW1zIChlLmcuIHRoZXJlIGlzIG5vIGNoYW5jZSB0aGF0IHRoZSBjb21waWxlciB3aWxsICAqLworLyogcmVwbGFjZSBtb3JlIHRoYW4gb25lIHNwYWNlIGJ5IGEgVEFCKSBhbmQgYmVjYXVzZSB0aGV5IG1ha2UgdGhlIGxlbmd0aCBvZiAgKi8KKy8qIHRoZSBzdHJpbmcgb2J2aW91cyBieSBpbnNwZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUQVJUX1NUUklOR18xOCAoKFVCWVRFICopICIxMjM0NTY3ODkwMTIzNDU2NzgiKQorCisvKiBJbiB0aGlzIGFsZ29yaXRobSwgaGFzaCB2YWx1ZXMgaGF2ZSB0byBiZSBjYWxjdWxhdGVkIGF0IG1vcmUgdGhhbiBvbmUgICAgICAqLworLyogcG9pbnQuIFRoZSBmb2xsb3dpbmcgbWFjcm8gbmVhdGVucyB0aGUgY29kZSB1cCBmb3IgdGhpcy4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFTSChQVFIpIFwKKyAgICgoKDQwNTQzKigoKCooUFRSKSk8PDgpXigoKigoUFRSKSsxKSk8PDQpXigqKChQVFIpKzIpKSkpPj40KSAmIDB4RkZGKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnB1dCAgOiBIYW5kIG92ZXIgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiB3b3JraW5nIG1lbW9yeSBpbiBwX3dya19tZW0uICAgICAqLworLyogSW5wdXQgIDogU3BlY2lmeSBpbnB1dCBibG9jayB1c2luZyBwX3NyY19maXJzdCBhbmQgc3JjX2xlbi4gICAgICAgICAgICAgICAgKi8KKy8qIElucHV0ICA6IFBvaW50IHBfZHN0X2ZpcnN0IHRvIHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHpvbmUgKE9aKS4gICAgICAgICAgICovCisvKiBJbnB1dCAgOiBQb2ludCBwX2RzdF9sZW4gdG8gYSBVTE9ORyB0byByZWNlaXZlIHRoZSBvdXRwdXQgbGVuZ3RoLiAgICAgICAgICAqLworLyogSW5wdXQgIDogSW5wdXQgYmxvY2sgYW5kIG91dHB1dCB6b25lIG11c3Qgbm90IG92ZXJsYXAuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE91dHB1dCA6IExlbmd0aCBvZiBvdXRwdXQgYmxvY2sgd3JpdHRlbiB0byAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICovCisvKiBPdXRwdXQgOiBPdXRwdXQgYmxvY2sgaW4gTWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCsqcF9kc3RfbGVuLTFdLiBNYXkgICAqLworLyogT3V0cHV0IDogd3JpdGUgaW4gT1o9TWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCtzcmNfbGVuK01BWF9DTVBfR1JPVVAtMV0uKi8KKy8qIE91dHB1dCA6IFVwb24gY29tcGxldGlvbiBndWFyYW50ZWVkICpwX2RzdF9sZW48PXNyY19sZW4rRkxBR19CWVRFUy4gICAgICAgICovCitMT0NBTCB2b2lkIGNvbXByZXNzX2NvbXByZXNzKFVCWVRFICpwX3dya19tZW0sCisJCQkgICAgIFVCWVRFICpwX3NyY19maXJzdCwgVUxPTkcgIHNyY19sZW4sCisJCQkgICAgIFVCWVRFICpwX2RzdF9maXJzdCwgTE9ORyAgKnBfZHN0X2xlbikKK3sKKyAvKiBwX3NyYyBhbmQgcF9kc3Qgc3RlcCB0aHJvdWdoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJsb2Nrcy4gICAgICAgICAgICovCisgcmVnaXN0ZXIgVUJZVEUgKnBfc3JjID0gcF9zcmNfZmlyc3Q7CisgcmVnaXN0ZXIgVUJZVEUgKnBfZHN0ID0gcF9kc3RfZmlyc3Q7CisgCisgLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG5ldmVyIG1vZGlmaWVkIGFuZCBhcmUgdXNlZCBpbiB0aGUgICAgICAgICAgICAqLworIC8qIGNhbGN1bGF0aW9ucyB0aGF0IGRldGVybWluZSB3aGVuIHRoZSBtYWluIGxvb3AgdGVybWluYXRlcy4gICAgICAgICAgICAgICAgKi8KKyBVQllURSAqcF9zcmNfcG9zdCAgPSBwX3NyY19maXJzdCtzcmNfbGVuOworIFVCWVRFICpwX2RzdF9wb3N0ICA9IHBfZHN0X2ZpcnN0K3NyY19sZW47CisgVUJZVEUgKnBfc3JjX21heDEgID0gcF9zcmNfZmlyc3Qrc3JjX2xlbi1NQVhfUkFXX0lURU07CisgVUJZVEUgKnBfc3JjX21heDE2ID0gcF9zcmNfZmlyc3Qrc3JjX2xlbi1NQVhfUkFXX0lURU0qMTY7CisgCisgLyogVGhlIHZhcmlhYmxlcyAncF9jb250cm9sJyBhbmQgJ2NvbnRyb2wnIGFyZSB1c2VkIHRvIGJ1ZmZlciBjb250cm9sIGJpdHMuICAqLworIC8qIEJlZm9yZSBlYWNoIGdyb3VwIGlzIHByb2Nlc3NlZCwgdGhlIG5leHQgdHdvIGJ5dGVzIG9mIHRoZSBvdXRwdXQgYmxvY2sgICAgKi8KKyAvKiBhcmUgc2V0IGFzaWRlIGZvciB0aGUgY29udHJvbCB3b3JkIGZvciB0aGUgZ3JvdXAgYWJvdXQgdG8gYmUgcHJvY2Vzc2VkLiAgICovCisgLyogJ3BfY29udHJvbCcgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoYXQgd29yZC4gTWVhbndoaWxlLCAgICAqLworIC8qICdjb250cm9sJyBidWZmZXJzIHRoZSBjb250cm9sIGJpdHMgYmVpbmcgZ2VuZXJhdGVkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyAgKi8KKyAvKiBvZiB0aGUgZ3JvdXAuIEluc3RlYWQgb2YgaGF2aW5nIGEgY291bnRlciB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zICovCisgLyogaGF2ZSBiZWVuIHByb2Nlc3NlZCAoPXRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29udHJvbCB3b3JkKSwgYXQgdGhlICAgICAqLworIC8qIHN0YXJ0IG9mIGVhY2ggZ3JvdXAsIHRoZSB0b3Agd29yZCBvZiAnY29udHJvbCcgaXMgZmlsbGVkIHdpdGggMSBiaXRzLiAgICAgKi8KKyAvKiBBcyAnY29udHJvbCcgaXMgc2hpZnRlZCBmb3IgZWFjaCBpdGVtLCB0aGUgMSBiaXRzIGluIHRoZSB0b3Agd29yZCBhcmUgICAgICovCisgLyogYWJzb3JiZWQgb3IgZGVzdHJveWVkLiBXaGVuIHRoZXkgYWxsIHJ1biBvdXQgKGkuZS4gd2hlbiB0aGUgdG9wIHdvcmQgaXMgICAqLworIC8qIGFsbCB6ZXJvIGJpdHMsIHdlIGtub3cgdGhhdCB3ZSBhcmUgYXQgdGhlIGVuZCBvZiBhIGdyb3VwLiAgICAgICAgICAgICAgICAgKi8KKyMgZGVmaW5lIFRPUFdPUkQgMHhGRkZGMDAwMAorIFVCWVRFICpwX2NvbnRyb2w7CisgcmVnaXN0ZXIgVUxPTkcgY29udHJvbD1UT1BXT1JEOworIAorIC8qIFRIZSB2YXJpYWJsZSAnaGFzaCcgYWx3YXlzIHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgaGFzaCB0YWJsZS4gKi8KKyBVQllURSAqKmhhc2g9IChVQllURSAqKikgIFVMT05HX0FMSUdOX1VQKHBfd3JrX21lbSk7CisgCisgLyogVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGVzIHJlcHJlc2VudCB0aGUgbGl0ZXJhbCBidWZmZXIuIHBfaDEgcG9pbnRzIHRvICAqLworIC8qIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHlvdW5nZXN0IGxpdGVyYWwuIHBfaDIgcG9pbnRzICAgKi8KKyAvKiB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWNvbmQgeW91bmdlc3QgbGl0ZXJhbC4gICAgICovCisgLyogTm90ZTogcF9oMT0wPT5wX2gyPTAgYmVjYXVzZSB6ZXJvIHZhbHVlcyBkZW5vdGUgYWJzZW5jZSBvZiBhIHBlbmRpbmcgICAgICAqLworIC8qIGxpdGVyYWwuIFRoZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8gbWVhbmluZyBhbiBlbXB0eSAiYnVmZmVyIi4gKi8KKyBVQllURSAqKnBfaDE9TlVMTDsKKyBVQllURSAqKnBfaDI9TlVMTDsKKyAgCisgLyogVG8gc3RhcnQsIHdlIHdyaXRlIHRoZSBmbGFnIGJ5dGVzLiBCZWluZyBvcHRpbWlzdGljLCB3ZSBzZXQgdGhlIGZsYWcgdG8gICAqLworIC8qIEZMQUdfQ09NUFJFU1MuIFRoZSByZW1haW5pbmcgZmxhZyBieXRlcyBhcmUgemVyb2VkIHNvIGFzIHRvIGtlZXAgdGhlICAgICAgKi8KKyAvKiBhbGdvcml0aG0gZGV0ZXJtaW5pc3RpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgKnBfZHN0Kys9RkxBR19DT01QUkVTUzsKKyB7VVdPUkQgaTsgZm9yIChpPTI7aTw9RkxBR19CWVRFUztpKyspICpwX2RzdCsrPTA7fQorCisgLyogUmVzZXJ2ZSB0aGUgZmlyc3Qgd29yZCBvZiBvdXRwdXQgYXMgdGhlIGNvbnRyb2wgd29yZCBmb3IgdGhlIGZpcnN0IGdyb3VwLiAqLworIC8qIE5vdGU6IFRoaXMgaXMgdW5kb25lIGF0IHRoZSBlbmQgaWYgdGhlIGlucHV0IGJsb2NrIGlzIGVtcHR5LiAgICAgICAgICAgICAgKi8KKyBwX2NvbnRyb2w9cF9kc3Q7IHBfZHN0Kz0yOworIAorIC8qIEluaXRpYWxpemUgYWxsIGVsZW1lbnRzIG9mIHRoZSBoYXNoIHRhYmxlIHRvIHBvaW50IHRvIGEgY29uc3RhbnQgc3RyaW5nLiAgKi8KKyAvKiBVc2Ugb2YgYW4gdW5yb2xsZWQgbG9vcCBzcGVlZHMgdGhpcyB1cCBjb25zaWRlcmFibHkuICAgICAgICAgICAgICAgICAgICAgICovCisge1VXT1JEIGk7IFVCWVRFICoqcF9oPWhhc2g7CisjICBkZWZpbmUgWkggKnBfaCsrPVNUQVJUX1NUUklOR18xOAorICBmb3IgKGk9MDtpPDI1NjtpKyspICAgICAvKiAyNTY9SEFTSF9UQUJMRV9MRU5HVEgvMTYuICovCisgICAge1pIO1pIO1pIO1pIOworICAgICBaSDtaSDtaSDtaSDsKKyAgICAgWkg7Wkg7Wkg7Wkg7CisgICAgIFpIO1pIO1pIO1pIO30KKyB9CisKKyAvKiBUaGUgbWFpbiBsb29wIHByb2Nlc3NlcyBlaXRoZXIgMSBvciAxNiBpdGVtcyBwZXIgaXRlcmF0aW9uLiBBcyBpdHMgICAgICAgICovCisgLyogdGVybWluYXRpb24gbG9naWMgaXMgY29tcGxpY2F0ZWQsIEkgaGF2ZSBvcHRlZCBmb3IgYW4gaW5maW5pdGUgbG9vcCAgICAgICAqLworIC8qIHN0cnVjdHVyZSBjb250YWluaW5nICdicmVhaycgYW5kICdnb3RvJyBzdGF0ZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyB3aGlsZSAoVFJVRSkKKyAgIHsvKiBCZWdpbiBtYWluIHByb2Nlc3NpbmcgbG9vcC4gKi8KKyAgIAorICAgIC8qIE5vdGU6IEFsbCB0aGUgdmFyaWFibGVzIGhlcmUgZXhjZXB0IHVucm9sbCBzaG91bGQgYmUgZGVmaW5lZCB3aXRoaW4gICAgKi8KKyAgICAvKiAgICAgICB0aGUgaW5uZXIgbG9vcC4gVW5mb3J0dW5hdGVseSB0aGUgbG9vcCBoYXNuJ3QgZ290IGEgYmxvY2suICAgICAgICovCisgICAgIHJlZ2lzdGVyIFVCWVRFICpwOyAgICAgICAgIC8qIFNjYW5zIHRocm91Z2ggdGFyZyBwaHJhc2UgZHVyaW5nIG1hdGNoaW5nLiAqLworICAgICByZWdpc3RlciBVQllURSAqcF96aXY9IE5VTEwgOyAgICAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgb2YgY3VycmVudCBaaXYuICAgICAgICovCisgICAgIHJlZ2lzdGVyIFVXT1JEIHVucm9sbDsgICAgIC8qIExvb3AgY291bnRlciBmb3IgdW5yb2xsZWQgaW5uZXIgbG9vcC4gICAgICAqLworICAgICByZWdpc3RlciBVV09SRCBpbmRleDsgICAgICAvKiBJbmRleCBvZiBjdXJyZW50IGhhc2ggdGFibGUgZW50cnkuICAgICAgICAgKi8KKyAgICAgcmVnaXN0ZXIgVUJZVEUgKipwX2gwID0gTlVMTCA7ICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgaGFzaCB0YWJsZSBlbnRyeS4gICAgICAgKi8KKyAgICAgCisgICAgLyogVGVzdCBmb3Igb3ZlcnJ1biBhbmQganVtcCB0byBvdmVycnVuIGNvZGUgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAqLworICAgIGlmIChwX2RzdD5wX2RzdF9wb3N0KQorICAgICAgIGdvdG8gb3ZlcnJ1bjsKKyAgICAgICAKKyAgICAvKiBUaGUgZm9sbG93aW5nIGNhc2NhZGUgb2YgaWYgc3RhdGVtZW50cyBlZmZpY2llbnRseSBjYXRjaGVzIGFuZCBkZWFscyAgICovCisgICAgLyogd2l0aCB2YXJ5aW5nIGRlZ3JlZXMgb2YgY2xvc2VuZXNzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJsb2NrLiAgICAgICAqLworICAgIC8qIFdoZW4gd2UgZ2V0IHZlcnkgY2xvc2UgdG8gdGhlIGVuZCwgd2Ugc3RvcCB1cGRhdGluZyB0aGUgdGFibGUgYW5kICAgICAgKi8KKyAgICAvKiBjb2RlIHRoZSByZW1haW5pbmcgYnl0ZXMgYXMgbGl0ZXJhbHMuIFRoaXMgbWFrZXMgdGhlIGNvZGUgc2ltcGxlci4gICAgICovCisgICAgdW5yb2xsPTE2OworICAgIGlmIChwX3NyYz5wX3NyY19tYXgxNikKKyAgICAgIHsKKyAgICAgICB1bnJvbGw9MTsKKyAgICAgICBpZiAocF9zcmM+cF9zcmNfbWF4MSkKKyAgICAgICAgIHsKKyAgICAgICAgICBpZiAocF9zcmM9PXBfc3JjX3Bvc3QpCisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGdvdG8gbGl0ZXJhbDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgIAorICAgIC8qIFRoaXMgaW5uZXIgdW5yb2xsZWQgbG9vcCBwcm9jZXNzZXMgJ3Vucm9sbCcgKHdob3NlIHZhbHVlIGlzIGVpdGhlciAxICAgKi8KKyAgICAvKiBvciAxNikgaXRlbXMuIEkgaGF2ZSBjaG9zZW4gdG8gaW1wbGVtZW50IHRoaXMgbG9vcCB3aXRoIGxhYmVscyBhbmQgICAgICovCisgICAgLyogZ290b3MgdG8gaGVpZ2h0ZW4gdGhlIGVhc2Ugd2l0aCB3aGljaCB0aGUgbG9vcCBtYXkgYmUgaW1wbGVtZW50ZWQgd2l0aCAqLworICAgIC8qIGEgc2luZ2xlIGRlY3JlbWVudCBhbmQgYnJhbmNoIGluc3RydWN0aW9uIGluIGFzc2VtYmx5IGxhbmd1YWdlIGFuZCAgICAgKi8KKyAgICAvKiBhbHNvIGJlY2F1c2UgdGhlIGxhYmVscyBhY3QgYXMgaGlnaGx5IHJlYWRhYmxlIHBsYWNlIG1hcmtlcnMuICAgICAgICAgICovCisgICAgLyogKEFsc28gYmVjYXVzZSB3ZSBqdW1wIGludG8gdGhlIGxvb3AgZm9yIGVuZGdhbWUgbGl0ZXJhbHMgKHNlZSBhYm92ZSkpLiAqLworICAgIAorICAgIGJlZ2luX3Vucm9sbGVkX2xvb3A6CisgICAgCisgICAgICAgLyogVG8gcHJvY2VzcyB0aGUgbmV4dCBwaHJhc2UsIHdlIGhhc2ggdGhlIG5leHQgdGhyZWUgYnl0ZXMgYW5kIHVzZSAgICAqLworICAgICAgIC8qIHRoZSByZXN1bHRhbnQgaGFzaCB0YWJsZSBpbmRleCB0byBsb29rIHVwIHRoZSBoYXNoIHRhYmxlLiBBIHBvaW50ZXIgKi8KKyAgICAgICAvKiB0byB0aGUgZW50cnkgaXMgc3RvcmVkIGluIHBfaDAgc28gYXMgdG8gYXZvaWQgYW4gYXJyYXkgbG9va3VwLiBUaGUgICovCisgICAgICAgLyogaGFzaCB0YWJsZSBlbnRyeSAqcF9oMCBpcyBsb29rZWQgdXAgeWllbGRpbmcgYSBwb2ludGVyIHAgdG8gYSAgICAgICAqLworICAgICAgIC8qIHBvdGVudGlhbCBtYXRjaCBvZiB0aGUgWml2IGluIHRoZSBoaXN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICBpbmRleD1IQVNIKHBfc3JjKTsKKyAgICAgICBwX2gwPSZoYXNoW2luZGV4XTsKKyAgICAgICBwPSpwX2gwOworICAgICAgIAorICAgICAgIC8qIEhhdmluZyBsb29rZWQgdXAgdGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiwgd2UgYXJlIGluIGEgcG9zaXRpb24gdG8gICAgKi8KKyAgICAgICAvKiBhdHRlbXB0IGEgbWF0Y2guIFRoZSBtYXRjaCBsb29wIGhhcyBiZWVuIHVucm9sbGVkIHVzaW5nIHRoZSBQUyAgICAgICovCisgICAgICAgLyogbWFjcm8gc28gdGhhdCBmYWlsdXJlIHdpdGhpbiB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgYXV0b21hdGljYWxseSAgICAqLworICAgICAgIC8qIHJlc3VsdHMgaW4gdGhlIGxpdGVyYWwgYnJhbmNoIGJlaW5nIHRha2VuLiBUaGUgY29kaW5nIGlzIHNpbXBsZS4gICAgKi8KKyAgICAgICAvKiBwX3ppdiBzYXZlcyBwX3NyYyBzbyB3ZSBjYW4gbGV0IHBfc3JjIHdhbmRlci4gICAgICAgICAgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSBQUyAqcCsrIT0qcF9zcmMrKworICAgICAgIHBfeml2PXBfc3JjOworICAgICAgIGlmIChQUyB8fCBQUyB8fCBQUykKKyAgICAgICAgIHsKKyAgICAgICAgICAvKiBMaXRlcmFsLiAqLworICAgICAgICAgIAorICAgICAgICAgIC8qIENvZGUgdGhlIGxpdGVyYWwgYnl0ZSBhcyBpdHNlbGYgYW5kIGEgemVybyBjb250cm9sIGJpdC4gICAgICAgICAgKi8KKyAgICAgICAgICBwX3NyYz1wX3ppdjsgbGl0ZXJhbDogKnBfZHN0Kys9KnBfc3JjKys7IGNvbnRyb2wmPTB4RkZGRUZGRkY7CisgICAgICAgICAgCisgICAgICAgICAgLyogV2UgaGF2ZSBqdXN0IGNvZGVkIGEgbGl0ZXJhbC4gSWYgd2UgaGFkIHR3byBwZW5kaW5nIG9uZXMsIHRoYXQgICAqLworICAgICAgICAgIC8qIG1ha2VzIHRocmVlIGFuZCB3ZSBjYW4gdXBkYXRlIHRoZSBoYXNoIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocF9oMiE9MCkKKyAgICAgICAgICAgICB7KnBfaDI9cF96aXYtMjt9CisgICAgICAgICAgICAgCisgICAgICAgICAgLyogSW4gYW55IGNhc2UsIHJvdGF0ZSB0aGUgaGFzaCB0YWJsZSBwb2ludGVycyBmb3IgbmV4dCB0aW1lLiAqLworICAgICAgICAgIHBfaDI9cF9oMTsgcF9oMT1wX2gwOworICAgICAgICAgIAorICAgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAvKiBDb3B5ICovCisgICAgICAgICAgCisgICAgICAgICAgLyogTWF0Y2ggdXAgdG8gMTUgcmVtYWluaW5nIGJ5dGVzIHVzaW5nIGFuIHVucm9sbGVkIGxvb3AgYW5kIGNvZGUuICovCisjaWYgMAorICAgICAgICAgIFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8CisgICAgICAgICAgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgcF9zcmMrKzsKKyNlbHNlICAgICAKKyAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAhKCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fAorICAgICAgICAgICAgICAgICAgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgKSAKKyAgICAgICAgICAgICApIHBfc3JjKys7CisjZW5kaWYKKyAgICAgICAgICAqcF9kc3QrKz0oKGluZGV4JjB4RjAwKT4+NCl8KC0tcF9zcmMtcF96aXYtMyk7CisgICAgICAgICAgKnBfZHN0Kys9aW5kZXgmMHhGRjsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBBcyB3ZSBoYXZlIGp1c3QgY29kZWQgdGhyZWUgYnl0ZXMsIHdlIGFyZSBub3cgaW4gYSBwb3NpdGlvbiB0byAgICovCisgICAgICAgICAgLyogdXBkYXRlIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlIGxpdGVyYWwgYnl0ZXMgdGhhdCB3ZXJlIHBlbmRpbmcgICAqLworICAgICAgICAgIC8qIHVwb24gdGhlIGFycml2YWwgb2YgZXh0cmEgY29udGV4dCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocF9oMSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAocF9oMikKKyAgICAgICAgICAgICAgIHsqcF9oMj1wX3ppdi0yOyBwX2gyPU5VTEw7fQorICAgICAgICAgICAgICpwX2gxPXBfeml2LTE7IHBfaDE9TlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIC8qIEluIGFueSBjYXNlLCB3ZSBjYW4gdXBkYXRlIHRoZSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBjdXJyZW50ICAgKi8KKyAgICAgICAgICAvKiBwb3NpdGlvbiBhcyB3ZSBqdXN0IGNvZGVkIGF0IGxlYXN0IHRocmVlIGJ5dGVzIGluIGEgY29weSBpdGVtcy4gICovCisgICAgICAgICAgKnBfaDA9cF96aXY7CisgICAgICAgICAgCisgICAgICAgICB9CisgICAgICAgY29udHJvbD4+PTE7CisgICAgICAgICAgICAgICAgCisgICAgICAgLyogVGhpcyBsb29wIGlzIGFsbCBzZXQgdXAgZm9yIGEgZGVjcmVtZW50IGFuZCBqdW1wIGluc3RydWN0aW9uISAqLworI2lmbmRlZiBsaW51eAorYCAgICBlbmRfdW5yb2xsZWRfbG9vcDogaWYgKC0tdW5yb2xsKSBnb3RvIGJlZ2luX3Vucm9sbGVkX2xvb3A7CisjZWxzZQorICAgIC8qIGVuZF91bnJvbGxlZF9sb29wOiAqLyBpZiAoLS11bnJvbGwpIGdvdG8gYmVnaW5fdW5yb2xsZWRfbG9vcDsKKyNlbmRpZgorCisgICAgLyogQXQgdGhpcyBwb2ludCBpdCB3aWxsIG5lYXJseSBhbHdheXMgYmUgdGhlIGVuZCBvZiBhIGdyb3VwIGluIHdoaWNoICAgICAqLworICAgIC8qIGNhc2UsIHdlIGhhdmUgdG8gZG8gc29tZSBjb250cm9sLXdvcmQgcHJvY2Vzc2luZy4gSG93ZXZlciwgbmVhciB0aGUgICAgKi8KKyAgICAvKiBlbmQgb2YgdGhlIGlucHV0IGJsb2NrLCB0aGUgaW5uZXIgdW5yb2xsZWQgbG9vcCBpcyBvbmx5IGV4ZWN1dGVkIG9uY2UuICovCisgICAgLyogVGhpcyBuZWNlc3NpdGF0ZXMgdGhlICdpZicgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoY29udHJvbCZUT1BXT1JEKT09MCkKKyAgICAgIHsKKyAgICAgICAvKiBXcml0ZSB0aGUgY29udHJvbCB3b3JkIHRvIHRoZSBwbGFjZSB3ZSBzYXZlZCBmb3IgaXQgaW4gdGhlIG91dHB1dC4gKi8KKyAgICAgICAqcF9jb250cm9sKys9ICBjb250cm9sICAgICAmMHhGRjsKKyAgICAgICAqcF9jb250cm9sICA9IChjb250cm9sPj44KSAmMHhGRjsKKworICAgICAgIC8qIFJlc2VydmUgdGhlIG5leHQgd29yZCBpbiB0aGUgb3V0cHV0IGJsb2NrIGZvciB0aGUgY29udHJvbCB3b3JkICovCisgICAgICAgLyogZm9yIHRoZSBncm91cCBhYm91dCB0byBiZSBwcm9jZXNzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICBwX2NvbnRyb2w9cF9kc3Q7IHBfZHN0Kz0yOworICAgICAgIAorICAgICAgIC8qIFJlc2V0IHRoZSBjb250cm9sIGJpdHMgYnVmZmVyLiAqLworICAgICAgIGNvbnRyb2w9VE9QV09SRDsKKyAgICAgIH0KKyAgICAgICAgICAKKyAgIH0gLyogRW5kIG1haW4gcHJvY2Vzc2luZyBsb29wLiAqLworICAgCisgLyogQWZ0ZXIgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wIGhhcyBleGVjdXRlZCwgYWxsIHRoZSBpbnB1dCBieXRlcyBoYXZlICAgICAqLworIC8qIGJlZW4gcHJvY2Vzc2VkLiBIb3dldmVyLCB0aGUgY29udHJvbCB3b3JkIGhhcyBzdGlsbCB0byBiZSB3cml0dGVuIHRvIHRoZSAgKi8KKyAvKiB3b3JkIHJlc2VydmVkIGZvciBpdCBpbiB0aGUgb3V0cHV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbW9zdCByZWNlbnQgZ3JvdXAuICovCisgLyogQmVmb3JlIHdyaXRpbmcsIHRoZSBjb250cm9sIHdvcmQgaGFzIHRvIGJlIHNoaWZ0ZWQgc28gdGhhdCBhbGwgdGhlIGJpdHMgICAqLworIC8qIGFyZSBpbiB0aGUgcmlnaHQgcGxhY2UuIFRoZSAiZW1wdHkiIGJpdCBwb3NpdGlvbnMgYXJlIGZpbGxlZCB3aXRoIDFzICAgICAgKi8KKyAvKiB3aGljaCBwYXJ0aWFsbHkgZmlsbCB0aGUgdG9wIHdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgd2hpbGUoY29udHJvbCZUT1BXT1JEKSBjb250cm9sPj49MTsKKyAqcF9jb250cm9sKys9IGNvbnRyb2wgICAgICYweEZGOworICpwX2NvbnRyb2wrKz0oY29udHJvbD4+OCkgJjB4RkY7CisgCisgLyogSWYgdGhlIGxhc3QgZ3JvdXAgY29udGFpbmVkIG5vIGl0ZW1zLCBkZWxldGUgdGhlIGNvbnRyb2wgd29yZCB0b28uICAgICAgICAqLworIGlmIChwX2NvbnRyb2w9PXBfZHN0KSBwX2RzdC09MjsKKyAKKyAvKiBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYmxvY2sgdG8gdGhlIGRzdF9sZW4gcGFyYW1ldGVyIGFuZCByZXR1cm4uICovCisgKnBfZHN0X2xlbj1wX2RzdC1wX2RzdF9maXJzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyByZXR1cm47CisgCisgLyogSnVtcCBoZXJlIGFzIHNvb24gYXMgYW4gb3ZlcnJ1biBpcyBkZXRlY3RlZC4gQW4gb3ZlcnJ1biBpcyBkZWZpbmVkIHRvICAgICAqLworIC8qIGhhdmUgb2NjdXJyZWQgaWYgcF9kc3Q+cF9kc3RfZmlyc3Qrc3JjX2xlbi4gVGhhdCBpcywgdGhlIG1vbWVudCB0aGUgICAgICAgKi8KKyAvKiBsZW5ndGggb2YgdGhlIG91dHB1dCB3cml0dGVuIHNvIGZhciBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrLiovCisgLyogVGhlIGFsZ29yaXRobSBjaGVja3MgZm9yIG92ZXJydW5zIGF0IGxlYXN0IGF0IHRoZSBlbmQgb2YgZWFjaCBncm91cCAgICAgICAqLworIC8qIHdoaWNoIG1lYW5zIHRoYXQgdGhlIG1heGltdW0gb3ZlcnJ1biBpcyBNQVhfQ01QX0dST1VQIGJ5dGVzLiAgICAgICAgICAgICAgKi8KKyAvKiBPbmNlIGFuIG92ZXJydW4gb2NjdXJzLCB0aGUgb25seSB0aGluZyB0byBkbyBpcyB0byBzZXQgdGhlIGNvcHkgZmxhZyBhbmQgICovCisgLyogY29weSB0aGUgaW5wdXQgb3Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIG92ZXJydW46CisjaWYgMAorICpwX2RzdF9maXJzdD1GTEFHX0NPUFk7CisgZmFzdF9jb3B5KHBfc3JjX2ZpcnN0LHBfZHN0X2ZpcnN0K0ZMQUdfQllURVMsc3JjX2xlbik7CisgKnBfZHN0X2xlbj1zcmNfbGVuK0ZMQUdfQllURVM7CisjZWxzZQorIGZhc3RfY29weShwX3NyY19maXJzdCxwX2RzdF9maXJzdCxzcmNfbGVuKTsKKyAqcF9kc3RfbGVuPSAtc3JjX2xlbjsgLyogcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGluZGljYXRlIHVuY29tcHJlc3NlZCBkYXRhICovCisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5wdXQgIDogSGFuZCBvdmVyIHRoZSByZXF1aXJlZCBhbW91bnQgb2Ygd29ya2luZyBtZW1vcnkgaW4gcF93cmtfbWVtLiAgICAgKi8KKy8qIElucHV0ICA6IFNwZWNpZnkgaW5wdXQgYmxvY2sgdXNpbmcgcF9zcmNfZmlyc3QgYW5kIHNyY19sZW4uICAgICAgICAgICAgICAgICovCisvKiBJbnB1dCAgOiBQb2ludCBwX2RzdF9maXJzdCB0byB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCB6b25lLiAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgIDogUG9pbnQgcF9kc3RfbGVuIHRvIGEgVUxPTkcgdG8gcmVjZWl2ZSB0aGUgb3V0cHV0IGxlbmd0aC4gICAgICAgICAgKi8KKy8qIElucHV0ICA6IElucHV0IGJsb2NrIGFuZCBvdXRwdXQgem9uZSBtdXN0IG5vdCBvdmVybGFwLiBVc2VyIGtub3dzICAgICAgICAgICovCisvKiBJbnB1dCAgOiB1cHBlcmJvdW5kIG9uIG91dHB1dCBibG9jayBsZW5ndGggZnJvbSBlYXJsaWVyIGNvbXByZXNzaW9uLiAgICAgICAqLworLyogSW5wdXQgIDogSW4gYW55IGNhc2UsIG1heGltdW0gZXhwYW5zaW9uIHBvc3NpYmxlIGlzIG5pbmUgdGltZXMuICAgICAgICAgICAgKi8KKy8qIE91dHB1dCA6IExlbmd0aCBvZiBvdXRwdXQgYmxvY2sgd3JpdHRlbiB0byAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICovCisvKiBPdXRwdXQgOiBPdXRwdXQgYmxvY2sgaW4gTWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCsqcF9kc3RfbGVuLTFdLiAgICAgICAqLworLyogT3V0cHV0IDogV3JpdGVzIG9ubHkgIGluIE1lbVtwX2RzdF9maXJzdC4ucF9kc3RfZmlyc3QrKnBfZHN0X2xlbi0xXS4gICAgICAgKi8KK0xPQ0FMIHZvaWQgY29tcHJlc3NfZGVjb21wcmVzcyggVUJZVEUgKnBfd3JrX21lbSwKKwkJCQlVQllURSAqcF9zcmNfZmlyc3QsIExPTkcgICBzcmNfbGVuLAorCQkJCVVCWVRFICpwX2RzdF9maXJzdCwgVUxPTkcgKnBfZHN0X2xlbikKK3sKKyAvKiBCeXRlIHBvaW50ZXJzIHBfc3JjIGFuZCBwX2RzdCBzY2FuIHRocm91Z2ggdGhlIGlucHV0IGFuZCBvdXRwdXQgYmxvY2tzLiAgICovCisgcmVnaXN0ZXIgVUJZVEUgKnBfc3JjID0gcF9zcmNfZmlyc3QrRkxBR19CWVRFUzsKKyByZWdpc3RlciBVQllURSAqcF9kc3QgPSBwX2RzdF9maXJzdDsKKyAvKiB3ZSBuZWVkIHRvIGF2b2lkIGEgU0VHViB3aGVuIHRyeWluZyB0byB1bmNvbXByZXNzIGNvcnJ1cHQgZGF0YSAqLworIHJlZ2lzdGVyIFVCWVRFICpwX2RzdF9wb3N0ID0gcF9kc3RfZmlyc3QgKyAqcF9kc3RfbGVuOworCisgLyogVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGVzIGFyZSBuZXZlciBtb2RpZmllZCBhbmQgYXJlIHVzZWQgdG8gY29udHJvbCAgICAqLworIC8qIHRoZSBtYWluIGxvb3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBVQllURSAqcF9zcmNfcG9zdCAgPSBwX3NyY19maXJzdCtzcmNfbGVuOworIFVCWVRFICpwX3NyY19tYXgxNiA9IHBfc3JjX2ZpcnN0K3NyY19sZW4tKE1BWF9DTVBfR1JPVVAtMik7CisgCisgLyogVGhlIGhhc2ggdGFibGUgaXMgdGhlIG9ubHkgcmVzaWRlbnQgb2YgdGhlIHdvcmtpbmcgbWVtb3J5LiBUaGUgaGFzaCB0YWJsZSAqLworIC8qIGNvbnRhaW5zIEhBU0hfVEFCTEVfTEVOR1RIPTQwOTYgcG9pbnRlcnMgdG8gcG9zaXRpb25zIGluIHRoZSBoaXN0b3J5LiBUbyAgKi8KKyAvKiBrZWVwIE1hY2ludG9zaGVzIGhhcHB5LCBpdCBpcyBsb25nd29yZCBhbGlnbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgVUJZVEUgKipoYXNoID0gKFVCWVRFICoqKSBVTE9OR19BTElHTl9VUChwX3dya19tZW0pOworCisgLyogVGhlIHZhcmlhYmxlICdjb250cm9sJyBpcyB1c2VkIHRvIGJ1ZmZlciB0aGUgY29udHJvbCBiaXRzIHdoaWNoIGFwcGVhciBpbiAqLworIC8qIGdyb3VwcyBvZiAxNiBiaXRzIChjb250cm9sIHdvcmRzKSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBjb21wcmVzc2VkIGdyb3VwLiAgKi8KKyAvKiBXaGVuIGVhY2ggZ3JvdXAgaXMgcmVhZCwgYml0IDE2IG9mIHRoZSByZWdpc3RlciBpcyBzZXQgdG8gb25lLiBXaGVuZXZlciAgICovCisgLyogYSBuZXcgYml0IGlzIG5lZWRlZCwgdGhlIHJlZ2lzdGVyIGlzIHNoaWZ0ZWQgcmlnaHQuIFdoZW4gdGhlIHZhbHVlIG9mIHRoZSAqLworIC8qIHJlZ2lzdGVyIGJlY29tZXMgMSwgd2Uga25vdyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIGEgZ3JvdXAuICAgICAgKi8KKyAvKiBJbml0aWFsaXppbmcgdGhlIHJlZ2lzdGVyIHRvIDEgdGh1cyBpbnN0cnVjdHMgdGhlIGNvZGUgdG8gZm9sbG93IHRoYXQgaXQgICovCisgLyogc2hvdWxkIHJlYWQgYSBuZXcgY29udHJvbCB3b3JkIGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIHJlZ2lzdGVyIFVMT05HIGNvbnRyb2w9MTsKKyAKKyAvKiBUaGUgdmFsdWUgb2YgJ2xpdGVyYWxzJyBpcyBhbHdheXMgaW4gdGhlIHJhbmdlIDAuLjMuIEl0IGlzIHRoZSBudW1iZXIgb2YgICovCisgLyogY29uc2VjdXRpdmUgbGl0ZXJhbCBpdGVtcyBqdXN0IHNlZW4uIFdlIGhhdmUgdG8gcmVjb3JkIHRoaXMgbnVtYmVyIHNvIGFzICAqLworIC8qIHRvIGtub3cgd2hlbiB0byB1cGRhdGUgdGhlIGhhc2ggdGFibGUuIFdoZW4gbGl0ZXJhbHMgZ2V0cyB0byAzLCB0aGVyZSAgICAgKi8KKyAvKiBoYXZlIGJlZW4gdGhyZWUgY29uc2VjdXRpdmUgbGl0ZXJhbHMgYW5kIHdlIGNhbiB1cGRhdGUgYXQgdGhlIHBvc2l0aW9uIG9mICovCisgLyogdGhlIG9sZGVzdCBvZiB0aGUgdGhyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIHJlZ2lzdGVyIFVXT1JEIGxpdGVyYWxzPTA7CisgCisgLyogQ2hlY2sgdGhlIGxlYWRpbmcgY29weSBmbGFnIHRvIHNlZSBpZiB0aGUgY29tcHJlc3NvciBjaG9zZSB0byB1c2UgYSBjb3B5ICAqLworIC8qIG9wZXJhdGlvbiBpbnN0ZWFkIG9mIGEgY29tcHJlc3Npb24gb3BlcmF0aW9uLiBJZiBhIGNvcHkgb3BlcmF0aW9uIHdhcyAgICAgKi8KKyAvKiB1c2VkLCB0aGVuIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvcHkgdGhlIGRhdGEgb3Zlciwgc2V0IHRoZSBvdXRwdXQgbGVuZ3RoICovCisgLyogYW5kIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIDAKKyBpZiAoKnBfc3JjX2ZpcnN0PT1GTEFHX0NPUFkpCisgICB7CisgICAgZmFzdF9jb3B5KHBfc3JjX2ZpcnN0K0ZMQUdfQllURVMscF9kc3RfZmlyc3Qsc3JjX2xlbi1GTEFHX0JZVEVTKTsKKyAgICAqcF9kc3RfbGVuPXNyY19sZW4tRkxBR19CWVRFUzsKKyAgICByZXR1cm47CisgICB9CisjZWxzZQorICBpZiAoIHNyY19sZW4gPCAwICkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmYXN0X2NvcHkocF9zcmNfZmlyc3QscF9kc3RfZmlyc3QsLXNyY19sZW4gKTsKKyAgICpwX2RzdF9sZW4gPSAoVUxPTkcpLXNyY19sZW47CisgICByZXR1cm47CisgIH0KKyNlbmRpZgorICAgCisgLyogSW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgb2YgdGhlIGhhc2ggdGFibGUgdG8gcG9pbnQgdG8gYSBjb25zdGFudCBzdHJpbmcuICAqLworIC8qIFVzZSBvZiBhbiB1bnJvbGxlZCBsb29wIHNwZWVkcyB0aGlzIHVwIGNvbnNpZGVyYWJseS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyB7VVdPUkQgaTsgVUJZVEUgKipwX2g9aGFzaDsKKyMgIGRlZmluZSBaSiAqcF9oKys9U1RBUlRfU1RSSU5HXzE4CisgIGZvciAoaT0wO2k8MjU2O2krKykgICAgIC8qIDI1Nj1IQVNIX1RBQkxFX0xFTkdUSC8xNi4gKi8KKyAgICB7Wko7Wko7Wko7Wko7CisgICAgIFpKO1pKO1pKO1pKOworICAgICBaSjtaSjtaSjtaSjsKKyAgICAgWko7Wko7Wko7Wko7fQorIH0KKworIC8qIFRoZSBvdXRlciBsb29wIHByb2Nlc3NlcyBlaXRoZXIgMSBvciAxNiBpdGVtcyBwZXIgaXRlcmF0aW9uIGRlcGVuZGluZyBvbiAgKi8KKyAvKiBob3cgY2xvc2UgcF9zcmMgaXMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICovCisgd2hpbGUgKHBfc3JjIT1wX3NyY19wb3N0KQorICAgey8qIFN0YXJ0IG9mIG91dGVyIGxvb3AgKi8KKyAgIAorICAgIHJlZ2lzdGVyIFVXT1JEIHVucm9sbDsgICAvKiBDb3VudHMgdW5yb2xsZWQgbG9vcCBleGVjdXRpb25zLiAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICAvKiBXaGVuICdjb250cm9sJyBoYXMgdGhlIHZhbHVlIDEsIGl0IG1lYW5zIHRoYXQgdGhlIDE2IGJ1ZmZlcmVkIGNvbnRyb2wgICovCisgICAgLyogYml0cyB0aGF0IHdlcmUgcmVhZCBpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAgaGF2ZSBhbGwgYmVlbiAqLworICAgIC8qIHNoaWZ0ZWQgb3V0IGFuZCB0aGF0IGFsbCB0aGF0IGlzIGxlZnQgaXMgdGhlIDEgYml0IHRoYXQgd2FzIGluamVjdGVkICAgKi8KKyAgICAvKiBpbnRvIGJpdCAxNiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCAgICovCisgICAgLyogb2YgYSBncm91cCwgd2UgaGF2ZSB0byBsb2FkIGEgbmV3IGNvbnRyb2wgd29yZCBhbmQgaW5qZWN0IGEgbmV3IDEgYml0LiAqLworICAgIGlmIChjb250cm9sPT0xKQorICAgICAgeworICAgICAgIGNvbnRyb2w9MHgxMDAwMHwqcF9zcmMrKzsKKyAgICAgICBjb250cm9sfD0oKnBfc3JjKyspPDw4OworICAgICAgfQorCisgICAgLyogSWYgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgd2l0aGluIDE2IGdyb3VwcyBmcm9tIHRoZSBlbmQgb2YgdGhlICAgICAqLworICAgIC8qIGlucHV0LCBleGVjdXRlIHRoZSB1bnJvbGxlZCBsb29wIG9ubHkgb25jZSwgZWxzZSBwcm9jZXNzIGEgd2hvbGUgZ3JvdXAgKi8KKyAgICAvKiBvZiAxNiBpdGVtcyBieSBsb29waW5nIDE2IHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5yb2xsPSBwX3NyYzw9cF9zcmNfbWF4MTYgPyAxNiA6IDE7CisKKyAgICAvKiBUaGlzIGlubmVyIGxvb3AgcHJvY2Vzc2VzIG9uZSBwaHJhc2UgKGl0ZW0pIHBlciBpdGVyYXRpb24uICovCisgICAgd2hpbGUgKHVucm9sbC0tKQorICAgICAgeyAvKiBCZWdpbiB1bnJvbGxlZCBpbm5lciBsb29wLiAqLworICAgICAgCisgICAgICAgLyogUHJvY2VzcyBhIGxpdGVyYWwgb3IgY29weSBpdGVtIGRlcGVuZGluZyBvbiB0aGUgbmV4dCBjb250cm9sIGJpdC4gKi8KKyAgICAgICBpZiAoY29udHJvbCYxKQorICAgICAgICAgeworICAgICAgICAgIC8qIENvcHkgaXRlbS4gKi8KKyAgICAgICAgICAKKyAgICAgICAgICByZWdpc3RlciBVQllURSAqcDsgICAgICAgICAgIC8qIFBvaW50cyB0byBwbGFjZSBmcm9tIHdoaWNoIHRvIGNvcHkuICovCisgICAgICAgICAgcmVnaXN0ZXIgVVdPUkQgbGVubXQ7ICAgICAgICAvKiBMZW5ndGggb2YgY29weSBpdGVtIG1pbnVzIHRocmVlLiAgICAqLworICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICoqcF9odGU7ICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGhhc2ggdGFibGUgZW50cnkuKi8KKyAgICAgICAgICByZWdpc3RlciBVQllURSAqcF96aXY9cF9kc3Q7IC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgY3VycmVudCBaaXYuICAgICovCisgICAgICAgICAgCisgICAgICAgICAgLyogUmVhZCBhbmQgZGlzbWFudGxlIHRoZSBjb3B5IHdvcmQuIFdvcmsgb3V0IGZyb20gd2hlcmUgdG8gY29weS4gICAqLworICAgICAgICAgIGxlbm10PSpwX3NyYysrOworICAgICAgICAgIHBfaHRlPSZoYXNoWygobGVubXQmMHhGMCk8PDQpfCpwX3NyYysrXTsKKyAgICAgICAgICBwPSpwX2h0ZTsKKyAgICAgICAgICBsZW5tdCY9MHhGOworICAgICAgICAgIAorICAgICAgICAgIC8qIE5vdyBwZXJmb3JtIHRoZSBjb3B5IHVzaW5nIGEgaGFsZiB1bnJvbGxlZCBsb29wLiAqLworICAgICAgICAgICpwX2RzdCsrPSpwKys7CisgICAgICAgICAgKnBfZHN0Kys9KnArKzsKKyAgICAgICAgICAqcF9kc3QrKz0qcCsrOworICAgICAgICAgIHdoaWxlIChsZW5tdC0tKQorICAgICAgICAgICAgICpwX2RzdCsrPSpwKys7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSBqdXN0IHJlY2VpdmVkIDMgb3IgbW9yZSBieXRlcyBpbiBhIGNvcHkgaXRlbSAgICAgKi8KKyAgICAgICAgICAvKiAod2hvc2UgYnl0ZXMgd2UgaGF2ZSBqdXN0IGluc3RhbGxlZCBpbiB0aGUgb3V0cHV0KSwgd2UgYXJlIG5vdyAgICovCisgICAgICAgICAgLyogaW4gYSBwb3NpdGlvbiB0byBmbHVzaCBhbGwgdGhlIHBlbmRpbmcgbGl0ZXJhbCBoYXNoaW5ncyB0aGF0IGhhZCAqLworICAgICAgICAgIC8qIGJlZW4gcG9zdHBvbmVkIGZvciBsYWNrIG9mIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAobGl0ZXJhbHM+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICByZWdpc3RlciBVQllURSAqcj1wX3ppdi1saXRlcmFsczsKKyAgICAgICAgICAgICBoYXNoW0hBU0gocildPXI7CisgICAgICAgICAgICAgaWYgKGxpdGVyYWxzPT0yKQorICAgICAgICAgICAgICAgIHtyKys7IGhhc2hbSEFTSChyKV09cjt9CisgICAgICAgICAgICAgbGl0ZXJhbHM9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIC8qIEluIGFueSBjYXNlLCB3ZSBjYW4gaW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlICAgKi8KKyAgICAgICAgICAvKiBjdXJyZW50IHBvc2l0aW9uLiBXZSBkb24ndCBuZWVkIHRvIGRvIGEgSEFTSCguLi4pIHRvIHdvcmsgb3V0ICAgICovCisgICAgICAgICAgLyogd2hlcmUgdG8gcHV0IHRoZSBwb2ludGVyLCBhcyB0aGUgY29tcHJlc3NvciBqdXN0IHRvbGQgdXMhISEgICAgICAqLworICAgICAgICAgICpwX2h0ZT1wX3ppdjsKKyAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgLyogTGl0ZXJhbCBpdGVtLiAqLworICAgICAgICAgIAorICAgICAgICAgIC8qIENvcHkgb3ZlciB0aGUgbGl0ZXJhbCBieXRlLiAqLworICAgICAgICAgICpwX2RzdCsrPSpwX3NyYysrOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIG5vdyBoYXZlIHRocmVlIGxpdGVyYWxzIHdhaXRpbmcgdG8gYmUgaGFzaGVkIGludG8gdGhlIGhhc2ggKi8KKyAgICAgICAgICAvKiB0YWJsZSwgd2UgY2FuIGRvIG9uZSBvZiB0aGVtIG5vdyAoYmVjYXVzZSB0aGVyZSBhcmUgdGhyZWUpLiAgICAgICovCisgICAgICAgICAgaWYgKCsrbGl0ZXJhbHMgPT0gMykKKyAgICAgICAgICAgICB7cmVnaXN0ZXIgVUJZVEUgKnA9cF9kc3QtMzsgaGFzaFtIQVNIKHApXT1wOyBsaXRlcmFscz0yO30KKyAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAvKiBTaGlmdCB0aGUgY29udHJvbCBidWZmZXIgc28gdGhlIG5leHQgY29udHJvbCBiaXQgaXMgaW4gYml0IDAuICovCisgICAgICAgY29udHJvbD4+PTE7CisjaWYgMQorICAgICAgIGlmIChwX2RzdCA+IHBfZHN0X3Bvc3QpIAorICAgICAgIHsKKwkgICAgICAgLyogU2hpdDogd2UgdHJpZWQgdG8gZGVjb21wcmVzcyBjb3JydXB0IGRhdGEgKi8KKwkgICAgICAgKnBfZHN0X2xlbiA9IDA7CisJICAgICAgIHJldHVybjsKKyAgICAgICB9CisjZW5kaWYKKyAgICAgIH0gLyogRW5kIHVucm9sbGVkIGlubmVyIGxvb3AuICovCisgICAgICAgICAgICAgICAKKyAgIH0gLyogRW5kIG9mIG91dGVyIGxvb3AgKi8KKyAgIAorIC8qIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGJlZm9yZSByZXR1cm5pbmcuICovCisgICpwX2RzdF9sZW49cF9kc3QtcF9kc3RfZmlyc3Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgTFpSVzMuQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2ZlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5oCkBAIC0wLDAgKzEsMjUzIEBACisjaWZuZGVmIF9MWlJXM19ICisjZGVmaW5lIF9MWlJXM19ICisvKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjMwICQKKyAqCisgKiAgaW5jbHVkZSBmaWxlcyBmb3IgbHpydzMuIE9ubHkgc2xpZ2h0eSBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbAorICogIHZlcnNpb24uIEFzc2VtYmxlcyB0aGUgdGhyZWUgaW5jbHVkZSBmaWxlcyBjb21wcmVzcy5oLCBwb3J0LmggYW5kCisgKiAgZmFzdGNvcHkuaCBmcm9tIHRoZSBvcmlnaW5hbCBsenJ3MyBwYWNrYWdlLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXV0aG9yIDogUm9zcyBXaWxsaWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGUgICA6IERlY2VtYmVyIDE5ODkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gYSBzZXQgb2YgZnVuY3Rpb25zIGNhbGxlZCAgICAgICAgKi8KKy8qICdjb21wcmVzcycsIGVhY2ggbWVtYmVyIG9mIHdoaWNoIGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIGRhdGEgY29tcHJlc3Npb24gICovCisvKiBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vcm1hbGx5IGluIEMgcHJvZ3JhbW1pbmcsIGZvciBlYWNoIC5IIGZpbGUsIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyAuQyAgICovCisvKiBmaWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIHByb21pc2VkIGluIHRoZSAuSCBmaWxlLiAgICAgICAgICAgICAgICAqLworLyogSGVyZSwgdGhlcmUgYXJlIG1hbnkgLkMgZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGhlYWRlciBmaWxlLiAgICAgICAgICAgKi8KKy8qIEVhY2ggY29tZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiBjYWxsZWQgJ2NvbXByZXNzJyB0aGF0IGltcGxlbWVudHMgYSBzaW5nbGUgZGF0YSBjb21wcmVzc2lvbiAgICAgICAgICAgICAgICAqLworLyogYWxnb3JpdGhtIHRoYXQgY29uZm9ybXMgd2l0aCB0aGUgaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGlzIGhlYWRlciBmaWxlLiAgKi8KKy8qIE9ubHkgb25lIGFsZ29yaXRobSBjYW4gYmUgbGlua2VkIGluIGF0IGEgdGltZSBpbiB0aGlzIG9yZ2FuaXphdGlvbi4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBGVU5DVElPTiBDT01QUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBTdW1tYXJ5IG9mIEZ1bmN0aW9uIENvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBhY3Rpb24gdGhhdCAnY29tcHJlc3MnIHRha2VzIGRlcGVuZHMgb24gaXRzIGZpcnN0IGFyZ3VtZW50IGNhbGxlZCAgICAgICovCisvKiAnYWN0aW9uJy4gIFRoZSBmdW5jdGlvbiBwcm92aWRlcyB0aHJlZSBhY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIENvbXByZXNzICAgYSBibG9jayBvZiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgLSBEZWNvbXByZXNzIGEgYmxvY2sgb2YgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNlZSB0aGUgZm9ybWFsIEMgZGVmaW5pdGlvbiBsYXRlciBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycy4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDT01QUkVTU19PVkVSUlVOOiBUaGUgY29uc3RhbnQgQ09NUFJFU1NfT1ZFUlJVTiBkZWZpbmVzIGJ5IGhvdyBtYW55IGJ5dGVzICAqLworLyogYW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8gZXhwYW5kIGEgYmxvY2sgZHVyaW5nIGEgY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbHRob3VnaCBjb21wcmVzc2lvbiBhbGdvcml0aG1zIHVzdWFsbHkgY29tcHJlc3MgZGF0YSwgdGhlcmUgd2lsbCBhbHdheXMgICAqLworLyogYmUgZGF0YSB0aGF0IGEgZ2l2ZW4gY29tcHJlc3NvciB3aWxsIGV4cGFuZCAodGhpcyBjYW4gYmUgcHJvdmVuKS4gICAgICAgICAgKi8KKy8qIEZvcnR1bmF0ZWx5LCB0aGUgZGVncmVlIG9mIGV4cGFuc2lvbiBjYW4gYmUgbGltaXRlZCB0byBhIHNpbmdsZSBiaXQsIGJ5ICAgICovCisvKiBjb3B5aW5nIG92ZXIgdGhlIGlucHV0IGRhdGEgaWYgdGhlIGRhdGEgZ2V0cyBiaWdnZXIgZHVyaW5nIGNvbXByZXNzaW9uLiAgICAqLworLyogVG8gYWxsb3cgZm9yIHRoaXMgcG9zc2liaWxpdHksIHRoZSBmaXJzdCBiaXQgb2YgYSBjb21wcmVzc2VkICAgICAgICAgICAgICAgKi8KKy8qIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlICAgICAgICAgICAgICAgICovCisvKiBpbnB1dCBkYXRhIHdhcyBjb3BpZWQgb3Zlciwgb3IgdHJ1bHkgY29tcHJlc3NlZC4gSW4gcHJhY3RpY2UsIHRoZSBmaXJzdCAgICAqLworLyogYnl0ZSB3b3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoaXMgYml0IHNvIGFzIHRvIG1haW50YWluIGJ5dGUgYWxpZ25tZW50LiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbmZvcnR1bmF0ZWx5LCBpbiBnZW5lcmFsLCB0aGUgb25seSB3YXkgdG8gdGVsbCBpZiBhbiBhbGdvcml0aG0gd2lsbCAgICAgICAqLworLyogZXhwYW5kIGEgcGFydGljdWxhciBibG9jayBvZiBkYXRhIGlzIHRvIHJ1biB0aGUgYWxnb3JpdGhtIG9uIHRoZSBkYXRhLiAgICAgKi8KKy8qIElmIHRoZSBhbGdvcml0aG0gZG9lcyBub3QgY29udGludW91c2x5IG1vbml0b3IgaG93IG1hbnkgb3V0cHV0IGJ5dGVzIGl0ICAgICovCisvKiBoYXMgd3JpdHRlbiwgaXQgbWlnaHQgd3JpdGUgYW4gb3V0cHV0IGJsb2NrIGZhciBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgICAgICAqLworLyogYmxvY2sgYmVmb3JlIHJlYWxpemluZyB0aGF0IGl0IGhhcyBkb25lIHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9uIHRoZSBvdGhlciBoYW5kLCBjb250aW51b3VzIGNoZWNrcyBvbiBvdXRwdXQgbGVuZ3RoIGFyZSBpbmVmZmljaWVudC4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gY2F0ZXIgZm9yIGFsbCB0aGVzZSBwcm9ibGVtcywgdGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbjogICAgICAgICAgICAgICAgKi8KKy8qID4gQWxsb3dzIGEgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHJldHVybiBhbiBvdXRwdXQgYmxvY2sgdGhhdCBpcyB1cCB0byAgICovCisvKiAgIENPTVBSRVNTX09WRVJSVU4gYnl0ZXMgbG9uZ2VyIHRoYW4gdGhlIGlucHV0IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBBbGxvd3MgYSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gd3JpdGUgdXAgdG8gQ09NUFJFU1NfT1ZFUlJVTiBieXRlcyAgICAgKi8KKy8qICAgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrIHRvIHRoZSBtZW1vcnkgb2YgdGhlIG91dHB1dCAgICAgICovCisvKiAgIGJsb2NrIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJsb2NrIGV2ZW50dWFsbHkgcmV0dXJuZWQuICAqLworLyogICBUaGlzIGFsbG93cyBhbiBhbGdvcml0aG0gdG8gb3ZlcnJ1biB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgKi8KKy8qICAgb3V0cHV0IGJsb2NrIGJ5IHVwIHRvIENPTVBSRVNTX09WRVJSVU4gYnl0ZXMgYmV0d2VlbiBleHBhbnNpb24gY2hlY2tzLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIHByb2JsZW0gZG9lcyBub3QgYXJpc2UgZm9yIGRlY29tcHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJZGVudGl0eSBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gYWN0aW9uIG11c3QgYmUgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IHBfZHN0X2xlbiBtdXN0IHBvaW50IHRvIGEgbG9uZ3dvcmQgdG8gcmVjZWl2ZSBhIGxvbmd3b3JkIGFkZHJlc3MuICAgICAgICAqLworLyogPiBUaGUgdmFsdWUgb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gQWZ0ZXIgZXhlY3V0aW9uLCB0aGUgbG9uZ3dvcmQgdGhhdCBwX2RzdF9sZW4gcG9pbnRzIHRvIHdpbGwgYmUgYSBwb2ludGVyICovCisvKiAgIHRvIGEgc3RydWN0dXJlIG9mIHR5cGUgY29tcHJlc3NfaWRlbnRpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaHVzLCBmb3IgZXhhbXBsZSwgYWZ0ZXIgdGhlIGNhbGwsICgqcF9kc3RfbGVuKS0+bWVtb3J5IHdpbGwgcmV0dXJuIHRoZSAgKi8KKy8qICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHdvcmtpbmcgbWVtb3J5IHRoYXQgdGhlIGFsZ29yaXRobSByZXF1aXJlcyB0byBydW4uICAgICovCisvKiA+IFRoZSB2YWx1ZXMgb2YgdGhlIGlkZW50aXR5IHN0cnVjdHVyZSByZXR1cm5lZCBhcmUgZml4ZWQgY29uc3RhbnQgICAgICAgICAqLworLyogICBhdHRyaWJ1dGVzIG9mIHRoZSBhbGdvcml0aG0gYW5kIG11c3Qgbm90IHZhcnkgZnJvbSBjYWxsIHRvIGNhbGwuICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb21tb24gUmVxdWlyZW1lbnRzIGZvciBDb21wcmVzc2lvbiBhbmQgRGVjb21wcmVzc2lvbiBBY3Rpb25zICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgKi8KKy8qID4gd3JrX21lbSBtdXN0IHBvaW50IHRvIGFuIHVudXNlZCBibG9jayBvZiBtZW1vcnkgb2YgYSBsZW5ndGggc3BlY2lmaWVkIGluICovCisvKiAgIHRoZSBhbGdvcml0aG0ncyBpZGVudGl0eSBibG9jay4gVGhlIGlkZW50aXR5IGJsb2NrIGNhbiBiZSBvYnRhaW5lZCBieSAgICAqLworLyogICBtYWtpbmcgYSBzZXBhcmF0ZSBjYWxsIHRvIGNvbXByZXNzLCBzcGVjaWZ5aW5nIHRoZSBpZGVudGl0eSBhY3Rpb24uICAgICAgKi8KKy8qID4gVGhlIElOUFVUIEJMT0NLIGlzIGRlZmluZWQgdG8gYmUgTWVtb3J5W3NyY19hZGRyLHNyY19hZGRyK3NyY19sZW4tMV0uICAgICovCisvKiA+IGRzdF9sZW4gd2lsbCBiZSB1c2VkIHRvIGRlbm90ZSAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBkc3RfbGVuIGlzIG5vdCByZWFkIGJ5IGNvbXByZXNzLCBvbmx5IHdyaXR0ZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIHZhbHVlIG9mIGRzdF9sZW4gaXMgZGVmaW5lZCBvbmx5IHVwb24gdGVybWluYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBPVVRQVVQgQkxPQ0sgaXMgZGVmaW5lZCB0byBiZSBNZW1vcnlbZHN0X2FkZHIsZHN0X2FkZHIrZHN0X2xlbi0xXS4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvbXByZXNzaW9uIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBhY3Rpb24gbXVzdCBiZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gc3JjX2xlbiBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfT1JHXS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBPVVRQVVQgWk9ORSBpcyBkZWZpbmVkIHRvIGJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBNZW1vcnlbZHN0X2FkZHIsZHN0X2FkZHIrc3JjX2xlbi0xK0NPTVBSRVNTX09WRVJSVU5dLiAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIGZ1bmN0aW9uIGNhbiBtb2RpZnkgYW55IHBhcnQgb2YgdGhlIG91dHB1dCB6b25lIHJlZ2FyZGxlc3Mgb2YgdGhlICAgICovCisvKiAgIGZpbmFsIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBUaGUgaW5wdXQgYmxvY2sgYW5kIHRoZSBvdXRwdXQgem9uZSBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxzcmNfbGVuK0NPTVBSRVNTX09WRVJSVU5dLiAgICAgICAgICAgICAgICovCisvKiA+IGRzdF9sZW4gd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsQ09NUFJFU1NfTUFYX0NPTV0gKGZyb20gcHJldiBmYWN0KS4gICAgICAqLworLyogPiBUaGUgb3V0cHV0IGJsb2NrIHdpbGwgY29uc2lzdCBvZiBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCBibG9jay4gICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZWNvbXByZXNzaW9uIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gYWN0aW9uIG11c3QgYmUgQ09NUFJFU1NfQUNUSU9OX0RFQ09NUFJFU1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBpbnB1dCBibG9jayBtdXN0IGJlIHRoZSByZXN1bHQgb2YgYW4gZWFybGllciBjb21wcmVzc2lvbiBvcGVyYXRpb24uICAqLworLyogPiBJZiB0aGUgcHJldmlvdXMgZmFjdCBpcyB0cnVlLCB0aGUgZm9sbG93aW5nIGZhY3RzIG11c3QgYWxzbyBiZSB0cnVlOiAgICAgKi8KKy8qICAgPiBzcmNfbGVuIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswLENPTVBSRVNTX01BWF9DT01dLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfT1JHXS4gICAgICAgICAgICAgICAgICAgICAqLworLyogPiBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3MgbXVzdCBub3Qgb3ZlcmxhcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gT25seSB0aGUgb3V0cHV0IGJsb2NrIGlzIG1vZGlmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFVwb24gdGVybWluYXRpb24sIHRoZSBvdXRwdXQgYmxvY2sgd2lsbCBjb25zaXN0IG9mIHRoZSBieXRlcyBjb250YWluZWQgICAqLworLyogICBpbiB0aGUgaW5wdXQgYmxvY2sgcGFzc2VkIHRvIHRoZSBlYXJsaWVyIGNvbXByZXNzaW9uIG9wZXJhdGlvbi4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9SVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIG1vZHVsZSBjb250YWlucyBtYWNybyBkZWZpbml0aW9ucyBhbmQgdHlwZXMgdGhhdCBhcmUgbGlrZWx5IHRvICAgICAgICAqLworLyogY2hhbmdlIGJldHdlZW4gY29tcHV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERPTkVfUE9SVCAgICAgICAvKiBPbmx5IGRvIHRoaXMgaWYgbm90IHByZXZpb3VzbHkgZG9uZS4gICAgICAgICAgICAgICAqLworCisgICAjaWZkZWYgVEhJTktfQworICAgICAgI2RlZmluZSBVQllURSB1bnNpZ25lZCBjaGFyICAgICAgLyogVW5zaWduZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgVVdPUkQgdW5zaWduZWQgaW50ICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDIgYnl0ZXMpICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIFVMT05HIHVuc2lnbmVkIGxvbmcgICAgICAvKiBVbnNpZ25lZCB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBCT09MICB1bnNpZ25lZCBjaGFyICAgICAgLyogQm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgRk9QRU5fQklOQVJZX1JFQUQgICJyYiIgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgcmVhZGluZy4gICAgICovCisgICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9XUklURSAid2IiICAvKiBNb2RlIHN0cmluZyBmb3IgYmluYXJ5IHdyaXRpbmcuICAgICAqLworICAgICAgI2RlZmluZSBGT1BFTl9URVhUX0FQUEVORCAgImEiICAgLyogTW9kZSBzdHJpbmcgZm9yIHRleHQgYXBwZW5kaW5nLiAgICAgKi8KKyAgICAgICNkZWZpbmUgUkVBTCBkb3VibGUgICAgICAgICAgICAgIC8qIFVTZWQgZm9yIGZsb2F0aW5nIHBvaW50IHN0dWZmLiAgICAgICovCisgICAjZW5kaWYKKyAgICNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKGxpbnV4KQorICAgICAgI2RlZmluZSBVQllURSBfX3U4ICAgICAgICAgICAgICAgLyogVW5zaWduZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgVVdPUkQgX191MTYgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDIgYnl0ZXMpICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIFVMT05HIF9fdTMyICAgICAgICAgICAgICAvKiBVbnNpZ25lZCB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBMT05HICBfX3MzMiAgICAgICAgICAgICAgLyogU2lnbmVkICAgd29yZCAoNCBieXRlcykgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgQk9PTCAgaXMgbm90IHVzZWQgaGVyZSAgIC8qIEJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9SRUFEICBub3QgdXNlZCAgLyogTW9kZSBzdHJpbmcgZm9yIGJpbmFyeSByZWFkaW5nLiAqLworICAgICAgI2RlZmluZSBGT1BFTl9CSU5BUllfV1JJVEUgbm90IHVzZWQgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgd3JpdGluZy4gKi8KKyAgICAgICNkZWZpbmUgRk9QRU5fVEVYVF9BUFBFTkQgIG5vdCB1c2VkICAvKiBNb2RlIHN0cmluZyBmb3IgdGV4dCBhcHBlbmRpbmcuICovCisgICAgICAjZGVmaW5lIFJFQUwgbm90IHVzZWQgICAgICAgICAgICAgICAgLyogVVNlZCBmb3IgZmxvYXRpbmcgcG9pbnQgc3R1ZmYuICAqLworICAgICAgI2lmbmRlZiBUUlVFCisgICAgICAjZGVmaW5lIFRSVUUgMQorICAgICAgI2VuZGlmCisgICAjZW5kaWYKKworICAgI2RlZmluZSBET05FX1BPUlQgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgZG8gYWxsIHRoaXMgYWdhaW4uICAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgTUFMTE9DX0ZBSUwgTlVMTCAgICAgICAgICAgIC8qIEZhaWx1cmUgc3RhdHVzIGZyb20gbWFsbG9jKCkgICAgICAgICovCisgICAjZGVmaW5lIExPQ0FMIHN0YXRpYyAgICAgICAgICAgICAgICAvKiBGb3Igbm9uLWV4cG9ydGVkIHJvdXRpbmVzLiAgICAgICAgICAqLworICAgI2RlZmluZSBFWFBPUlQgICAgICAgICAgICAgICAgICAgICAgLyogU2lnbmFscyBleHBvcnRlZCBmdW5jdGlvbi4gICAgICAgICAgKi8KKyAgICNkZWZpbmUgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZWZ1bCBmb3IgYWxpZ25pbmcgaWZzLiAgICAgICAgICAgICovCisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgUE9SVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZICAgMAorI2RlZmluZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MgICAxCisjZGVmaW5lIENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTIDIKKworI2RlZmluZSBDT01QUkVTU19PVkVSUlVOIDEwMjQKKyNkZWZpbmUgQ09NUFJFU1NfTUFYX0NPTSAweDcwMDAwMDAwCisjZGVmaW5lIENPTVBSRVNTX01BWF9PUkcgKENPTVBSRVNTX01BWF9DT00tQ09NUFJFU1NfT1ZFUlJVTikKKworI2RlZmluZSBDT01QUkVTU19NQVhfU1RSTEVOIDI1NQorCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWxnb3JpdGhtLiAgICAgICAgICovCisvKiA+IFRoZSB0b3AgYml0IG9mIGlkIG11c3QgYmUgemVyby4gVGhlIHJlbWFpbmluZyBiaXRzIG11c3QgYmUgY2hvc2VuIGJ5ICAgICovCisvKiAgIHRoZSBhdXRob3Igb2YgdGhlIGFsZ29yaXRobSBieSB0b3NzaW5nIGEgY29pbiAzMSB0aW1lcy4gICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVlc3RlZCBieSB0aGUgYWxnb3JpdGhtIGlzIHNwZWNpZmllZCBpbiBieXRlcyAgICovCisvKiAgIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwweDcwMDAwMDAwXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IEFsbCBzdHJpbmdzIHMgbXVzdCBiZSBzdWNoIHRoYXQgc3RybGVuKHMpPD1DT01QUkVTU19NQVhfU1RSTEVOLiAgICAgICAgICovCitzdHJ1Y3QgY29tcHJlc3NfaWRlbnRpdHkKKyAgeworICAgVUxPTkcgaWQ7ICAgICAgICAgICAvKiBJZGVudGlmeWluZyBudW1iZXIgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICovCisgICBVTE9ORyBtZW1vcnk7ICAgICAgIC8qIE51bWJlciBvZiBieXRlcyBvZiB3b3JraW5nIG1lbW9yeSByZXF1aXJlZC4gKi8KKworICAgY2hhciAgKm5hbWU7ICAgICAgICAvKiBOYW1lIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICBjaGFyICAqdmVyc2lvbjsgICAgIC8qIFZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIGNoYXIgICpkYXRlOyAgICAgICAgLyogRGF0ZSBvZiByZWxlYXNlIG9mIHRoaXMgdmVyc2lvbi4gICAgICAgICAgICAqLworICAgY2hhciAgKmNvcHlyaWdodDsgICAvKiBDb3B5cmlnaHQgbWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgIGNoYXIgICphdXRob3I7ICAgICAgLyogQXV0aG9yIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgY2hhciAgKmFmZmlsaWF0aW9uOyAvKiBBZmZpbGlhdGlvbiBvZiBhdXRob3IuICAgICAgICAgICAgICAgICAgICAgICovCisgICBjaGFyICAqdmVuZG9yOyAgICAgIC8qIFdoZXJlIHRoZSBhbGdvcml0aG0gY2FuIGJlIG9idGFpbmVkLiAgICAgICAgKi8KKyAgfTsKKwordm9pZCAgbHpydzNfY29tcHJlc3MoICAgICAgICAvKiBTaW5nbGUgZnVuY3Rpb24gaW50ZXJmYWNlIHRvIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gKi8KK1VXT1JEICAgICBhY3Rpb24sICAgICAgLyogQWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitVQllURSAgICp3cmtfbWVtLCAgICAgIC8qIFdvcmtpbmcgbWVtb3J5IHRlbXBvcmFyaWx5IGdpdmVuIHRvIHJvdXRpbmUgdG8gdXNlLiAqLworVUJZVEUgICAqc3JjX2FkciwgICAgICAvKiBBZGRyZXNzIG9mIGlucHV0ICBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0xPTkcgICAgIHNyY19sZW4sICAgICAgLyogTGVuZ3RoICBvZiBpbnB1dCAgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitVQllURSAgICpkc3RfYWRyLCAgICAgIC8qIEFkZHJlc3Mgb2Ygb3V0cHV0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordm9pZCAgKnBfZHN0X2xlbiAgICAgICAvKiBQb2ludGVyIHRvIGEgbG9uZ3dvcmQgd2hlcmUgcm91dGluZSB3aWxsIHdyaXRlOiAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogICAgSWYgYWN0aW9uPS4uSURFTlRJVFkgICA9PiBBZHIgb2YgaWQgc3RydWN0dXJlLiAgICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIElmIGFjdGlvbj0uLkNPTVBSRVNTICAgPT4gTGVuZ3RoIG9mIG91dHB1dCBkYXRhLiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBJZiBhY3Rpb249Li5ERUNPTVBSRVNTID0+IExlbmd0aCBvZiBvdXRwdXQgZGF0YS4gKi8KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIENPTVBSRVNTLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdF9jb3B5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZnVuY3Rpb24gY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IHZlcnkgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgZXhhY3Qgc3BlZWQgZGVwZW5kcyBvbiB0aGUgcmVsYXRpdmUgYWxpZ25tZW50IG9mIHRoZSBibG9ja3Mgb2YgbWVtb3J5LiAqLworLyogUFJFICA6IDA8PXNyY19sZW48PSgyXjMyKS0xIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBSRSAgOiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJsb2NrcyBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgICovCisvKiBQT1NUIDogTUVNW2RzdF9hZHIsZHN0X2FkcitzcmNfbGVuLTFdPU1FTVtzcmNfYWRyLHNyY19hZHIrc3JjX2xlbi0xXS4gICAgICAqLworLyogUE9TVCA6IE1FTVtkc3RfYWRyLGRzdF9hZHIrc3JjX2xlbi0xXSBpcyB0aGUgb25seSBtZW1vcnkgY2hhbmdlZC4gICAgICAgICAgKi8KKworI2RlZmluZSBmYXN0X2NvcHkoc3JjLGRzdCxsZW4pIG1lbWNweShkc3Qsc3JjLGxlbikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiBmYXN0X2NvcHkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYTIyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5jCkBAIC0wLDAgKzEsMTIwMyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKyAKKyAqCisgKiAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSAiZ2VuZXJpYyIgaW50ZXJmYWNlIGJldHdlZW4gdGhlICoKKyAqICAgICB6ZnRhcGUtZHJpdmVyIGFuZCBhIGNvbXByZXNzaW9uLWFsZ29yaXRobS4gVGhlICoKKyAqICAgICBjb21wcmVzc2lvbi1hbGdvcml0aG0gY3VycmVudGx5IHVzZWQgaXMgYSBMWjc3LiBJIHVzZSB0aGUgKgorICogICAgIGltcGxlbWVudGF0aW9uIGx6cnczIGJ5IFJvc3MgTi4gV2lsbGlhbXMgKFJlbmFpc3NhbmNlICoKKyAqICAgICBTb2Z0d2FyZSkuIFRoZSBjb21wcmVzc2lvbiBwcm9ncmFtIGl0c2VsZiBpcyBpbiB0aGUgZmlsZQorICogICAgIGx6cnczLmMgKiBhbmQgbHpydzMuaC4gIFRvIGFkb3B0IGFub3RoZXIgY29tcHJlc3Npb24gYWxnb3JpdGhtCisgKiAgICAgdGhlIGZ1bmN0aW9ucyAqIHpmdF9jb21wcmVzcygpIGFuZCB6ZnRfdW5jb21wcmVzcygpIG11c3QgYmUKKyAqICAgICBjaGFuZ2VkICogYXBwcm9wcmlhdGVseS4gU2VlIGJlbG93LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorI2luY2x1ZGUgIi4uL2NvbXByZXNzb3IvbHpydzMuaCIKKworLyoKKyAqICAgZ2xvYmFsIHZhcmlhYmxlcworICovCisKKy8qIEkgaGFuZGxlIHRoZSBhbGxvY2F0aW9uIG9mIHRoaXMgYnVmZmVyIGFzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlCisgKiBpdCdzIHNpemUgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgdGFwZSBsZW5ndGggaW5zZXJ0ZWQuCisgKi8KKworLyogbG9jYWwgdmFyaWFibGVzIAorICovCitzdGF0aWMgdm9pZCAqemZ0Y193cmtfbWVtID0gTlVMTDsKK3N0YXRpYyBfX3U4ICp6ZnRjX2J1ZiAgICAgPSBOVUxMOworc3RhdGljIHZvaWQgKnpmdGNfc2NyYXRjaF9idWYgID0gTlVMTDsKKworLyogY29tcHJlc3Npb24gc3RhdGlzdGljcyAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB6ZnRjX3dyX3VuY29tcHJlc3NlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHpmdGNfd3JfY29tcHJlc3NlZCAgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemZ0Y19yZF91bmNvbXByZXNzZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB6ZnRjX3JkX2NvbXByZXNzZWQgICA9IDA7CisKKy8qIGZvcndhcmQgKi8KK3N0YXRpYyBpbnQgIHpmdGNfd3JpdGUoaW50ICp3cml0ZV9jbnQsCisJCSAgICAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgICAgY29uc3QgX191OCBfX3VzZXIgKnNyY19idWYsIGNvbnN0IGludCByZXFfbGVuLAorCQkgICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworc3RhdGljIGludCAgemZ0Y19yZWFkKGludCAqcmVhZF9jbnQsCisJCSAgICAgIF9fdTggIF9fdXNlciAqZHN0X2J1ZiwgY29uc3QgaW50IHRvX2RvLAorCQkgICAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW50ICB6ZnRjX3NlZWsodW5zaWduZWQgaW50IG5ld19ibG9ja19wb3MsIAorCQkgICAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKKwkJICAgICAgX191OCAqYnVmZmVyKTsKK3N0YXRpYyB2b2lkIHpmdGNfbG9jayAgICh2b2lkKTsKK3N0YXRpYyB2b2lkIHpmdGNfcmVzZXQgICh2b2lkKTsKK3N0YXRpYyB2b2lkIHpmdGNfY2xlYW51cCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpmdGNfc3RhdHMgICAgICAodm9pZCk7CisKKy8qIGNvbXByZXNzZWQgc2VnbWVudC4gVGhpcyBjb25mb3JtcyB0byBRSUMtODAtTUMsIFJldmlzaW9uIEsuCisgKiAKKyAqIFJldi4gSyBhcHBsaWVzIHRvIHRhcGVzIHdpdGggYGZpeGVkIGxlbmd0aCBmb3JtYXQnIHdoaWNoIGlzCisgKiBpbmRpY2F0ZWQgYnkgZm9ybWF0IGNvZGUgMiwzIGFuZCA1LiBTZWUgYmVsb3cgZm9yIGZvcm1hdCBjb2RlIDQgYW5kIDYKKyAqCisgKiAyIGJ5dGVzOiBvZmZzZXQgb2YgY29tcHJlc3Npb24gc2VnbWVudCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDI5ayA+IG9mZnNldCA+PSAyOWstMTg6IGRhdGEgZnJvbSBwcmV2aW91cyBzZWdtZW50IGVucyBpbiB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50IGFuZCBubyBjb21wcmVzc2VkIGJsb2NrIHN0YXJ0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBzZWdtZW50CisgKiAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9PSAwOiBkYXRhIGZyb20gcHJldmlvdXMgc2VnbWVudCBvY2N1cGllcyBlbnRpcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgYW5kIGNvbnRpbnVlcyBpbiBuZXh0IHNlZ21lbnQKKyAqIG4gYnl0ZXM6IHJlbWFpbmRlciBmcm9tIHByZXZpb3VzIHNlZ21lbnQKKyAqIAorICogUmV2LiBLOiAgCisgKiA0IGJ5dGVzOiA0IGJ5dGVzOiBmaWxlcyBzZXQgYnl0ZSBvZmZzZXQKKyAqIFBvc3QgUmV2LiBLIGFuZCBRSUMtMzAyMC8zMDIwOgorICogOCBieXRlczogOCBieXRlczogZmlsZXMgc2V0IGJ5dGUgb2Zmc2V0CisgKiAyIGJ5dGVzOiBieXRlIGNvdW50IE4gKGFtb3VudCBvZiBkYXRhIGZvbGxvd2luZykKKyAqICAgICAgICAgIGJpdCAxNSBpcyBzZXQgaWYgZGF0YSBpcyBjb21wcmVzc2VkLCBiaXQgMTUgaXMgbm90CisgKiAgICAgICAgICBzZXQgaWYgZGF0YSBpcyB1bmNvbXByZXNzZWQKKyAqIE4gYnl0ZXM6IGRhdGEgKGFzIG11Y2ggYXMgc3BlY2lmaWVkIGluIHRoZSBieXRlIGNvdW50KQorICogMiBieXRlczogYnl0ZSBjb3VudCBOXzEgb2YgbmV4dCBjbHVzdGVyCisgKiBOXzEgYnl0ZXM6IGRhdGEgb2YgbmV4dCBjbHVzZXQKKyAqIDIgYnl0ZXM6IGJ5dGUgY291bnQgTl8yIG9mIG5leHQgY2x1c3RlcgorICogTl8yIGJ5dGVzOiAuLi4gIAorICoKKyAqIE5vdGUgdGhhdCB0aGUgYE4nIGJ5dGUgY291bnQgYWNjb3VudHMgb25seSBmb3IgdGhlIGJ5dGVzIHRoYXQgaW4gdGhlCisgKiBjdXJyZW50IHNlZ21lbnQgaWYgdGhlIGNsdXN0ZXIgc3BhbnMgdG8gdGhlIG5leHQgc2VnbWVudC4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworCWludCBjbXByX3BvczsgICAgICAgICAgICAgLyogYWN0dWFsIHBvc2l0aW9uIGluIGNvbXByZXNzaW9uIGJ1ZmZlciAqLworCWludCBjbXByX3N6OyAgICAgICAgICAgICAgLyogd2hhdCBpcyBsZWZ0IGluIHRoZSBjb21wcmVzc2lvbiBidWZmZXIKKwkJCQkgICAqIHdoZW4gY29weWluZyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZQorCQkJCSAgICogZGVibG9jayBidWZmZXIKKwkJCQkgICAqLworCXVuc2lnbmVkIGludCBmaXJzdF9ibG9jazsgLyogbG9jYXRpb24gb2YgaGVhZGVyIGluZm9ybWF0aW9uIGluCisJCQkJICAgKiB0aGlzIHNlZ21lbnQKKwkJCQkgICAqLworCXVuc2lnbmVkIGludCBjb3VudDsgICAgICAgLyogYW1vdW50IG9mIGRhdGEgb2YgY3VycmVudCBibG9jaworCQkJCSAgICogY29udGFpbmVkIGluIGN1cnJlbnQgc2VnbWVudCAKKwkJCQkgICAqLworCXVuc2lnbmVkIGludCBvZmZzZXQ7ICAgICAgLyogb2Zmc2V0IGluIGN1cnJlbnQgc2VnbWVudCAqLworCXVuc2lnbmVkIGludCBzcGFuczoxOyAgICAgLyogbWlnaHQgY29udGludWUgaW4gbmV4dCBzZWdtZW50ICovCisJdW5zaWduZWQgaW50IHVuY21wcjsgICAgICAvKiAweDgwMDAgaWYgdGhpcyBibG9jayBjb250YWlucworCQkJCSAgICogdW5jb21wcmVzc2VkIGRhdGEgCisJCQkJICAgKi8KKwlfX3M2NCBmb2ZmczsgICAgICAgICAgICAgIC8qIGZpbGUgc2V0IGJ5dGUgb2Zmc2V0LCBzYW1lIGFzIGluIAorCQkJCSAgICogY29tcHJlc3Npb24gbWFwIHNlZ21lbnQKKwkJCQkgICAqLworfSBjbXByX2luZm87CisKK3N0YXRpYyBjbXByX2luZm8gY3NlZzsgLyogc3RhdGljIGRhdGEuIE11c3QgYmUga2VwdCB1cHRvZGF0ZSBhbmQgc2hhcmVkIGJ5IAorCQkJKiByZWFkLCB3cml0ZSBhbmQgc2VlayBmdW5jdGlvbnMKKwkJCSovCisKKyNkZWZpbmUgRFVNUF9DTVBSX0lORk8obGV2ZWwsIG1zZywgaW5mbykJCQkJXAorCVRSQUNFKGxldmVsLCBtc2cgIlxuIgkJCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImNtcHJfcG9zICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJjbXByX3N6ICAgIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZmlyc3RfYmxvY2s6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImNvdW50ICAgICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJvZmZzZXQgICAgIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAic3BhbnMgICAgICA6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gInVuY21wciAgICAgOiAweCUwNHhcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZm9mZnMgICAgICA6ICIgTExfWCwJCQkJXAorCSAgICAgIChpbmZvKS0+Y21wcl9wb3MsIChpbmZvKS0+Y21wcl9zeiwgKGluZm8pLT5maXJzdF9ibG9jaywJXAorCSAgICAgIChpbmZvKS0+Y291bnQsIChpbmZvKS0+b2Zmc2V0LCAoaW5mbyktPnNwYW5zID09IDEsCVwKKwkgICAgICAoaW5mbyktPnVuY21wciwgTEwoKGluZm8pLT5mb2ZmcykpCisKKy8qICAgZGlzcGF0Y2ggY29tcHJlc3Npb24gc2VnbWVudCBpbmZvLCByZXR1cm4gZXJyb3IgY29kZQorICogIAorICogICBhZnRlcndhcmRzLCBjc2VnLT5vZmZzZXQgcG9pbnRzIHRvIHN0YXJ0IG9mIGRhdGEgb2YgdGhlIE5FWFQKKyAqICAgY29tcHJlc3NlZCBibG9jaywgYW5kIGNzZWctPmNvdW50IGNvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGF0YQorICogICBsZWZ0IGluIHRoZSBhY3R1YWwgY29tcHJlc3NlZCBibG9jay4gY3NlZy0+c3BhbnMgaXMgc2V0IHRvIDEgaWYKKyAqICAgdGhlIGJsb2NrIGlzIGNvbnRpbnVlZCBpbiB0aGUgZm9sbG93aW5nIHNlZ21lbnQuIE90aGVyd2lzZSBpdCBpcworICogICBzZXQgdG8gMC4gCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NzZWcgKGNtcHJfaW5mbyAqY2luZm8sIGNvbnN0IF9fdTggKmJ1ZmYsIAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzZWdfc3osCisJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworIAljaW5mby0+Zmlyc3RfYmxvY2sgPSBHRVQyKGJ1ZmYsIDApOworCWlmIChjaW5mby0+Zmlyc3RfYmxvY2sgPT0gMCkgeyAvKiBkYXRhIHNwYW5zIHRvIG5leHQgc2VnbWVudCAqLworCQljaW5mby0+Y291bnQgID0gc2VnX3N6IC0gc2l6ZW9mKF9fdTE2KTsKKwkJY2luZm8tPm9mZnNldCA9IHNlZ19zejsKKwkJY2luZm8tPnNwYW5zID0gMTsKKwl9IGVsc2UgeyAvKiBjbHVzdGVyIGRlZmluZXRlbHkgZW5kcyBpbiB0aGlzIHNlZ21lbnQgKi8KKwkJaWYgKGNpbmZvLT5maXJzdF9ibG9jayA+IHNlZ19zeikgeworCQkJLyogZGF0YSBjb3JydXB0ZWQgKi8KKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiY29ycnVwdGVkIGRhdGE6XG4iCisJCQkJICAgIEtFUk5fSU5GTyAic2VnbWVudCBzaXplOiAlZFxuIgorCQkJCSAgICBLRVJOX0lORk8gImZpcnN0IGJsb2NrIDogJWQiLAorCQkJCSAgICBzZWdfc3osIGNpbmZvLT5maXJzdF9ibG9jayk7CisJCX0KKwkgICAgICAgIGNpbmZvLT5jb3VudCAgPSBjaW5mby0+Zmlyc3RfYmxvY2sgLSBzaXplb2YoX191MTYpOworCQljaW5mby0+b2Zmc2V0ID0gY2luZm8tPmZpcnN0X2Jsb2NrOworCQljaW5mby0+c3BhbnMgPSAwOworCX0KKwkvKiBub3cgZ2V0IHRoZSBvZmZzZXQgdGhlIGZpcnN0IGJsb2NrIHNob3VsZCBoYXZlIGluIHRoZQorCSAqIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4KKwkgKgorCSAqIEZvciB0aGlzIG1hZ2ljIGAxOCcgcmVmZXIgdG8gQ1JGLTMgc3RhbmRhcmQgb3IgUUlDLTgwTUMsCisJICogUmV2LiBLLiAgCisJICovCisJaWYgKChzZWdfc3ogLSBjaW5mby0+b2Zmc2V0KSA+IDE4KSB7CisJCWlmICh2b2x1bWUtPnFpYzExMykgeyAvKiA+IHJldmlzaW9uIEsgKi8KKwkJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiTmV3IFFJQy0xMTMgY29tcGxpYW5jZSIpOworCQkJY2luZm8tPmZvZmZzID0gR0VUOChidWZmLCBjaW5mby0+b2Zmc2V0KTsKKwkJCWNpbmZvLT5vZmZzZXQgKz0gc2l6ZW9mKF9fczY0KTsgCisJCX0gZWxzZSB7CisJCQlUUkFDRSgvKiBmdF90X2RhdGFfZmxvdyAqLyBmdF90X25vaXNlLCAicHJlIFFJQy0xMTMgdmVyc2lvbiIpOworCQkJY2luZm8tPmZvZmZzICAgPSAoX19zNjQpR0VUNChidWZmLCBjaW5mby0+b2Zmc2V0KTsKKwkJCWNpbmZvLT5vZmZzZXQgKz0gc2l6ZW9mKF9fdTMyKTsgCisJCX0KKwl9CisJaWYgKGNpbmZvLT5mb2ZmcyA+IHZvbHVtZS0+c2l6ZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgIkluY29uc2lzdGVuY3k6XG4iCisJCQkgICAgS0VSTl9JTkZPICJvZmZzZXQgaW4gY3VycmVudCB2b2x1bWU6ICVkXG4iCisJCQkgICAgS0VSTl9JTkZPICJzaXplIG9mIGN1cnJlbnQgdm9sdW1lICA6ICVkIiwKKwkJCSAgICAoaW50KShjaW5mby0+Zm9mZnM+PjEwKSwgKGludCkodm9sdW1lLT5zaXplPj4xMCkpOworCX0KKwlpZiAoY2luZm8tPmNtcHJfcG9zICsgY2luZm8tPmNvdW50ID4gdm9sdW1lLT5ibGtfc3opIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJJbmNvbnNpc3RlbmN5OlxuIgorCQkJICAgIEtFUk5fSU5GTyAiYmxvY2sgc2l6ZSA6ICVkXG4iCisJCQkgICAgS0VSTl9JTkZPICJkYXRhIHJlY29yZDogJWQiLAorCQkJICAgIHZvbHVtZS0+YmxrX3N6LCBjaW5mby0+Y21wcl9wb3MgKyBjaW5mby0+Y291bnQpOworCX0KKwlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlIC8qIGZ0X3RfYW55ICovLCAiIiwgY2luZm8pOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogIFRoaXMgb25lIGlzIGNhbGxlZCwgd2hlbiBhIG5ldyBjbHVzdGVyIHN0YXJ0cyBpbiBzYW1lIHNlZ21lbnQuCisgKiAgCisgKiAgTm90ZTogaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2x1c3RlciBpbiB0aGUgY3VycmVudCBzZWdtZW50LCB3ZSBtdXN0CisgKiAgbm90IGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgdGhhbiAxOCBieXRlcyBhdmFpbGFibGUgYmVjYXVzZQorICogIHRoaXMgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBpbiBnZXRfY3NlZygpIGFuZCB0aGVyZSBtYXkgYmUgbGVzcworICogIHRoYW4gMTggYnl0ZXMgYXZhaWxhYmxlIGR1ZSB0byBoZWFkZXIgaW5mb3JtYXRpb24uCisgKiAKKyAqLworc3RhdGljIHZvaWQgZ2V0X25leHRfY2x1c3RlcihjbXByX2luZm8gKmNsdXN0ZXIsIGNvbnN0IF9fdTggKmJ1ZmYsIAorCQkJICAgICBjb25zdCBpbnQgc2VnX3N6LCBjb25zdCBpbnQgZmluaXNoKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHNlZ19zeiAtIGNsdXN0ZXItPm9mZnNldCA+IDE4IHx8IGNsdXN0ZXItPmZvZmZzICE9IDApIHsKKwkJY2x1c3Rlci0+Y291bnQgICA9IEdFVDIoYnVmZiwgY2x1c3Rlci0+b2Zmc2V0KTsKKwkJY2x1c3Rlci0+dW5jbXByICA9IGNsdXN0ZXItPmNvdW50ICYgMHg4MDAwOworCQljbHVzdGVyLT5jb3VudCAgLT0gY2x1c3Rlci0+dW5jbXByOworCQljbHVzdGVyLT5vZmZzZXQgKz0gc2l6ZW9mKF9fdTE2KTsKKwkJY2x1c3Rlci0+Zm9mZnMgICA9IDA7CisJCWlmICgoY2x1c3Rlci0+b2Zmc2V0ICsgY2x1c3Rlci0+Y291bnQpIDwgc2VnX3N6KSB7CisJCQljbHVzdGVyLT5zcGFucyA9IDA7CisJCX0gZWxzZSBpZiAoY2x1c3Rlci0+b2Zmc2V0ICsgY2x1c3Rlci0+Y291bnQgPT0gc2VnX3N6KSB7CisJCQljbHVzdGVyLT5zcGFucyA9ICFmaW5pc2g7CisJCX0gZWxzZSB7CisJCQkvKiBlaXRoZXIgYW4gZXJyb3Igb3IgYSB2b2x1bWUgd3JpdHRlbiBieSBhbiAKKwkJCSAqIG9sZCB2ZXJzaW9uLiBJZiB0aGlzIGlzIGEgZGF0YSBlcnJvciwgdGhlbiB3ZSdsbAorCQkJICogY2F0Y2ggaXQgbGF0ZXIuCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiRWl0aGVyIGVycm9yIG9yIG9sZCB2b2x1bWUiKTsKKwkJCWNsdXN0ZXItPnNwYW5zID0gMTsKKwkJCWNsdXN0ZXItPmNvdW50ID0gc2VnX3N6IC0gY2x1c3Rlci0+b2Zmc2V0OworCQl9CisJfSBlbHNlIHsKKwkJY2x1c3Rlci0+Y291bnQgPSAwOworCQljbHVzdGVyLT5zcGFucyA9IDA7CisJCWNsdXN0ZXItPmZvZmZzID0gMDsKKwl9CisJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSAvKiBmdF90X2FueSAqLyAsICIiLCBjbHVzdGVyKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCB6ZnRjX2xvY2sodm9pZCkKK3sKK30KKworLyogIHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIGZvciB6ZnRhcGVfcmVzZXRfcG9zaXRpb24gaW4gemZ0YXBlLWlvLmMgCisgKi8KK3N0YXRpYyB2b2lkIHpmdGNfcmVzZXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCW1lbXNldCgodm9pZCAqKSZjc2VnLCAnXDAnLCBzaXplb2YoY3NlZykpOworCXpmdGNfc3RhdHMoKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgaW50IGNtcHJfbWVtX2luaXRpYWxpemVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWxsb2NfYmxrc3ogPSAwOworCitzdGF0aWMgaW50IHpmdF9hbGxvY2F0ZV9jbXByX21lbSh1bnNpZ25lZCBpbnQgYmxrc3opCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoY21wcl9tZW1faW5pdGlhbGl6ZWQgJiYgYmxrc3ogPT0gYWxsb2NfYmxrc3opIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRjX3dya19tZW0sIENNUFJfV1JLX01FTV9TSVpFKSwKKwkJICAgIHpmdGNfY2xlYW51cCgpKTsKKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19hbHdheXMoJnpmdGNfYnVmLCBibGtzeiArIENNUFJfT1ZFUlJVTiksCisJCSAgICB6ZnRjX2NsZWFudXAoKSk7CisJYWxsb2NfYmxrc3ogPSBibGtzejsKKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19hbHdheXMoJnpmdGNfc2NyYXRjaF9idWYsIGJsa3N6K0NNUFJfT1ZFUlJVTiksCisJCSAgICB6ZnRjX2NsZWFudXAoKSk7CisJY21wcl9tZW1faW5pdGlhbGl6ZWQgPSAxOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIHZvaWQgemZ0Y19jbGVhbnVwKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl6ZnRfdmZyZWUoJnpmdGNfd3JrX21lbSwgQ01QUl9XUktfTUVNX1NJWkUpOworCXpmdF92ZnJlZSgmemZ0Y19idWYsIGFsbG9jX2Jsa3N6ICsgQ01QUl9PVkVSUlVOKTsKKwl6ZnRfdmZyZWUoJnpmdGNfc2NyYXRjaF9idWYsIGFsbG9jX2Jsa3N6ICsgQ01QUl9PVkVSUlVOKTsKKwljbXByX21lbV9pbml0aWFsaXplZCA9IGFsbG9jX2Jsa3N6ID0gMDsKKwlUUkFDRV9FWElUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyAiZnRhcGVfY29tcHJlc3MoKSIgYW5kICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgImZ0YXBlX3VuY29tcHJlc3MoKSIgYXJlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGFjdHVhbCBjb21wcmVzc2lvbiAgICAgICAgICoKKyAqICBhbGdvcml0aG0gKGkuZS4gdGhleSBhcmUgY2FsbGluZyB0aGUgImNvbXByZXNzKCkiIGZ1bmN0aW9uIGZyb20gICAgICAgICAgKgorICogIHRoZSBsenJ3MyBwYWNrYWdlIGZvciBub3cpLiBUaGVzZSByb3V0aW5lcyBjb3VsZCBxdWl0ZSBlYXNpbHkgYmUgICAgICAgICAqCisgKiAgY2hhbmdlZCB0byBhZG9wdCBhbm90aGVyIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbnN0ZWFkIG9mIGx6cnczLCAgICAgICAgICoKKyAqICB3aGljaCBjdXJyZW50bHkgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNhbGxlZCBieSB6ZnRfY29tcHJlc3Nfd3JpdGUoKSB0byBwZXJmb3JtIHRoZSBjb21wcmVzc2lvbi4gTXVzdAorICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgKgorICogTk9URTogVGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBzaG91bGQgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZgorICogICAgICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiBNb3N0IGNvbXByZXNzaW9uIGFsZ29yaXRobXMgaGF2ZSBtZWFucworICogICAgICAgdG8gc3RvcmUgZGF0YSB1bmNoYW5nZWQgaWYgdGhlICJjb21wcmVzc2VkIiBkYXRhIGFtb3VudCB3b3VsZAorICogICAgICAgZXhjZWVkIHRoZSBvcmlnaW5hbCBvbmUuIE1vc3RseSB0aGlzIGlzIGRvbmUgYnkgc3RvcmluZyBzb21lCisgKiAgICAgICBmbGFnLWJ5dGVzIGluIGZyb250IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gaW5kaWNhdGUgaWYgaXQKKyAqICAgICAgIGlzIGNvbXByZXNzZWQgb3Igbm90LiBUaHVzIHRoZSB3b3JzdCBjb21wcmVzc2lvbiByZXN1bHQKKyAqICAgICAgIGxlbmd0aCBpcyB0aGUgb3JpZ2luYWwgbGVuZ3RoIHBsdXMgdGhvc2UgZmxhZy1ieXRlcy4KKyAqCisgKiAgICAgICBXZSBkb24ndCB3YW50IHRoYXQsIGFzIHRoZSBRSUMtODAgc3RhbmRhcmQgcHJvdmlkZXMgYSBtZWFucworICogICAgICAgb2YgbWFya2luZyB1bmNvbXByZXNzZWQgYmxvY2tzIGJ5IHNpbXBseSBzZXR0aW5nIGJpdCAxNSBvZgorICogICAgICAgdGhlIGNvbXByZXNzZWQgYmxvY2sncyBsZW5ndGguIFRodXMgYSBjb21wZXNzZWQgYmxvY2sgY2FuCisgKiAgICAgICBoYXZlIGF0IG1vc3QgYSBsZW5ndGggb2YgMl4xNS0xIGJ5dGVzLiBUaGUgUUlDLTgwIHN0YW5kYXJkCisgKiAgICAgICByZXN0cmljdHMgdGhlIGJsb2NrLWxlbmd0aCBldmVuIGZ1cnRoZXIsIGFsbG93aW5nIG9ubHkgMjlrIC0KKyAqICAgICAgIDYgYnl0ZXMuCisgKgorICogICAgICAgQ3VycmVudGx5LCB0aGUgbWF4aW11bSBibG9ja3NpemUgdXNlZCBieSB6ZnRhcGUgaXMgMjhrLgorICoKKyAqICAgICAgIEluIHNob3J0OiBkb24ndCBleGNlZWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQtcGFja2FnZSwgc2V0CisgKiAgICAgICBiaXQgMTUgb2YgdGhlIGNvbXByZXNzZWQgc2l6ZSB0byAxIGlmIHlvdSBoYXZlIGNvcGllZCBkYXRhCisgKiAgICAgICBpbnN0ZWFkIG9mIGNvbXByZXNzaW5nIGl0LgorICovCitzdGF0aWMgaW50IHpmdF9jb21wcmVzcyhfX3U4ICppbl9idWZmZXIsIHVuc2lnbmVkIGludCBpbl9zeiwgX191OCAqb3V0X2J1ZmZlcikKK3sgCisJX19zMzIgY29tcHJlc3NlZF9zejsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKworCWx6cnczX2NvbXByZXNzKENPTVBSRVNTX0FDVElPTl9DT01QUkVTUywgemZ0Y193cmtfbWVtLAorCQkgICAgICAgaW5fYnVmZmVyLCBpbl9zeiwgb3V0X2J1ZmZlciwgJmNvbXByZXNzZWRfc3opOworCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2luZm8pIHsKKwkJLyogIHRoZSBjb21waWxlciB3aWxsIG9wdGltaXplIHRoaXMgYXdheSB3aGVuCisJCSAqICBjb21waWxlZCB3aXRoIE5PX1RSQUNFX0FUX0FMTCBvcHRpb24KKwkJICovCisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYmVmb3JlIGNvbXByZXNzaW9uOiAlZCBieXRlc1xuIgorCQkgICAgICBLRVJOX0lORk8gImFmdGVyIGNvbXByZXNpc29uIDogJWQgYnl0ZXMiLCAKKwkJICAgICAgaW5fc3osIAorCQkgICAgICAoaW50KShjb21wcmVzc2VkX3N6IDwgMCAKKwkJICAgICAgPyAtY29tcHJlc3NlZF9zeiA6IGNvbXByZXNzZWRfc3opKTsKKwkJLyogIGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlcworCQkgKi8KKwkJemZ0Y193cl9jb21wcmVzc2VkICAgKz0gKGNvbXByZXNzZWRfc3ogPCAwIAorCQkJCQkgICA/IC1jb21wcmVzc2VkX3N6IDogY29tcHJlc3NlZF9zeik7CisJCXpmdGNfd3JfdW5jb21wcmVzc2VkICs9IGluX3N6OworCX0KKwlUUkFDRV9FWElUIChpbnQpY29tcHJlc3NlZF9zejsKK30KKworLyogY2FsbGVkIGJ5IHpmdF9jb21wcmVzc19yZWFkKCkgdG8gZGVjb21wcmVzcyB0aGUgZGF0YS4gTXVzdAorICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBmb3Igc2FuaXR5IGNoZWNrcworICogKGNvbXBhcmVkIHdpdGggemZ0X2Jsa19zeikKKyAqCisgKiBOT1RFOiBSZWFkIHRoZSBub3RlIGZvciB6ZnRfY29tcHJlc3MoKSBhYm92ZSEgIElmIGJpdCAxNSBvZiB0aGUKKyAqICAgICAgIHBhcmFtZXRlciBpbl9zeiBpcyBzZXQsIHRoZW4gdGhlIGRhdGEgaW4gaW5fYnVmZmVyIGlzbid0CisgKiAgICAgICBjb21wcmVzc2VkLCB3aGljaCBtdXN0IGJlIGhhbmRsZWQgYnkgdGhlIHVuLWNvbXByZXNzaW9uCisgKiAgICAgICBhbGdvcml0aG0uIChJIGNoYW5nZWQgbHpydzMgdG8gaGFuZGxlIHRoaXMuKQorICoKKyAqICBUaGUgcGFyYW1ldGVyIG1heF9vdXRfc3ogaXMgbmVlZGVkIHRvIHByZXZlbnQgYnVmZmVyIG92ZXJydW5zIHdoZW4gCisgKiAgdW5jb21wcmVzc2luZyBjb3JydXB0IGRhdGEuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgemZ0X3VuY29tcHJlc3MoX191OCAqaW5fYnVmZmVyLCAKKwkJCQkgICBpbnQgaW5fc3osIAorCQkJCSAgIF9fdTggKm91dF9idWZmZXIsCisJCQkJICAgdW5zaWduZWQgaW50IG1heF9vdXRfc3opCit7IAorCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWx6cnczX2NvbXByZXNzKENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTLCB6ZnRjX3dya19tZW0sCisJCSAgICAgICBpbl9idWZmZXIsIChfX3MzMilpbl9zeiwKKwkJICAgICAgIG91dF9idWZmZXIsIChfX3UzMiAqKSZtYXhfb3V0X3N6KTsKKwkKKwlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYmVmb3JlIGRlY29tcHJlc3Npb246ICVkIGJ5dGVzXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYWZ0ZXIgZGVjb21wcmVzc2lvbiA6ICVkIGJ5dGVzIiwgCisJCSAgICAgIGluX3N6IDwgMCA/IC1pbl9zeiA6IGluX3N6LChpbnQpbWF4X291dF9zeik7CisJCS8qICBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMKKwkJICovCisJCXpmdGNfcmRfY29tcHJlc3NlZCAgICs9IGluX3N6IDwgMCA/IC1pbl9zeiA6IGluX3N6OworCQl6ZnRjX3JkX3VuY29tcHJlc3NlZCArPSBtYXhfb3V0X3N6OworCX0KKwlUUkFDRV9FWElUICh1bnNpZ25lZCBpbnQpbWF4X291dF9zejsKK30KKworLyogcHJpbnQgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBlZmZpY2llbmN5IG9mIHRoZSBjb21wcmVzc2lvbiB0bworICogdGhlIGtlcm5lbCBsb2cgCisgKi8KK3N0YXRpYyB2b2lkIHpmdGNfc3RhdHModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChUUkFDRV9MRVZFTCA8IGZ0X3RfaW5mbykgeworCQlUUkFDRV9FWElUOworCX0KKwlpZiAoemZ0Y193cl91bmNvbXByZXNzZWQgIT0gMCkgeworCQlpZiAoemZ0Y193cl9jb21wcmVzc2VkID4gKDE8PDE0KSkgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiY29tcHJlc3Npb24gc3RhdGlzdGljcyAod3JpdGluZyk6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBjb21wci4vdW5jbXByLiAgIDogJTNkICUlIiwKKwkJCSAgICAgICgoKHpmdGNfd3JfY29tcHJlc3NlZD4+MTApICogMTAwKQorCQkJICAgICAgIC8gKHpmdGNfd3JfdW5jb21wcmVzc2VkPj4xMCkpKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKHdyaXRpbmcpOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY29tcHIuL3VuY21wci4gICA6ICUzZCAlJSIsCisJCQkgICAgICAoKHpmdGNfd3JfY29tcHJlc3NlZCAqIDEwMCkKKwkJCSAgICAgICAvIHpmdGNfd3JfdW5jb21wcmVzc2VkKSk7CisJCX0KKwl9CisJaWYgKHpmdGNfcmRfdW5jb21wcmVzc2VkICE9IDApIHsKKwkJaWYgKHpmdGNfcmRfY29tcHJlc3NlZCA+ICgxPDwxNCkpIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKHJlYWRpbmcpOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY29tcHIuL3VuY21wci4gICA6ICUzZCAlJSIsCisJCQkgICAgICAoKCh6ZnRjX3JkX2NvbXByZXNzZWQ+PjEwKSAqIDEwMCkKKwkJCSAgICAgICAvICh6ZnRjX3JkX3VuY29tcHJlc3NlZD4+MTApKSk7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2luZm8sICJjb21wcmVzc2lvbiBzdGF0aXN0aWNzIChyZWFkaW5nKTpcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAiIGNvbXByLi91bmNtcHIuICAgOiAlM2QgJSUiLAorCQkJICAgICAgKCh6ZnRjX3JkX2NvbXByZXNzZWQgKiAxMDApCisJCQkgICAgICAgLyB6ZnRjX3JkX3VuY29tcHJlc3NlZCkpOworCQl9CisJfQorCS8qIG9ubHkgcHJpbnQgaXQgb25jZTogKi8KKwl6ZnRjX3dyX3VuY29tcHJlc3NlZCA9IAorCQl6ZnRjX3dyX2NvbXByZXNzZWQgID0KKwkJemZ0Y19yZF91bmNvbXByZXNzZWQgPQorCQl6ZnRjX3JkX2NvbXByZXNzZWQgICA9IDA7CisJVFJBQ0VfRVhJVDsKK30KKworLyogc3RhcnQgbmV3IGNvbXByZXNzZWQgYmxvY2sgCisgKi8KK3N0YXRpYyBpbnQgc3RhcnRfbmV3X2NzZWcoY21wcl9pbmZvICpjbHVzdGVyLCAKKwkJCSAgY2hhciAqZHN0X2J1ZiwgCisJCQkgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICBjb25zdCB1bnNpZ25lZCBpbnQgYmxrX3N6LAorCQkJICBjb25zdCBjaGFyICpzcmNfYnVmLAorCQkJICBjb25zdCBpbnQgdGhpc19zZWdzX3N6LAorCQkJICBjb25zdCBpbnQgcWljMTEzKQoreworCWludCBzaXplX2xlZnQ7CisJaW50IGNwX2NudDsKKwlpbnQgYnVmX3BvczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXNpemVfbGVmdCA9IHRoaXNfc2Vnc19zeiAtIHNpemVvZihfX3UxNikgLSBjbHVzdGVyLT5jbXByX3N6OworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCJcbiIgCisJICAgICAgS0VSTl9JTkZPICJzZWdtZW50IHNpemUgICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJjb21wcmVzc2VkX3N6OiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAic2l6ZV9sZWZ0ICAgICAgOiAlZCIsCisJICAgICAgdGhpc19zZWdzX3N6LCBjbHVzdGVyLT5jbXByX3N6LCBzaXplX2xlZnQpOworCWlmIChzaXplX2xlZnQgPiAxOCkgeyAvKiBzdGFydCBhIG5ldyBjbHVzZXRlciAqLworCQljcF9jbnQgPSBjbHVzdGVyLT5jbXByX3N6OworCQljbHVzdGVyLT5jbXByX3N6ID0gMDsKKwkJYnVmX3BvcyA9IGNwX2NudCArIHNpemVvZihfX3UxNik7CisJCVBVVDIoZHN0X2J1ZiwgMCwgYnVmX3Bvcyk7CisKKwkJaWYgKHFpYzExMykgeworCQkJX19zNjQgZm9mZnMgPSBwb3MtPnZvbHVtZV9wb3M7CisJCQlpZiAoY3BfY250KSBmb2ZmcyArPSAoX19zNjQpYmxrX3N6OworCisJCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIm5ldyBzdHlsZSBRSUMtMTEzIGhlYWRlciIpOworCQkJUFVUOChkc3RfYnVmLCBidWZfcG9zLCBmb2Zmcyk7CisJCQlidWZfcG9zICs9IHNpemVvZihfX3M2NCk7CisJCX0gZWxzZSB7CisJCQlfX3UzMiBmb2ZmcyA9IChfX3UzMilwb3MtPnZvbHVtZV9wb3M7CisJCQlpZiAoY3BfY250KSBmb2ZmcyArPSAoX191MzIpYmxrX3N6OworCQkJCisJCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIm9sZCBzdHlsZSBRSUMtODBNQyBoZWFkZXIiKTsKKwkJCVBVVDQoZHN0X2J1ZiwgYnVmX3BvcywgZm9mZnMpOworCQkJYnVmX3BvcyArPSBzaXplb2YoX191MzIpOworCQl9CisJfSBlbHNlIGlmIChzaXplX2xlZnQgPj0gMCkgeworCQljcF9jbnQgPSBjbHVzdGVyLT5jbXByX3N6OworCQljbHVzdGVyLT5jbXByX3N6ID0gMDsKKwkJYnVmX3BvcyA9IGNwX2NudCArIHNpemVvZihfX3UxNik7CisJCVBVVDIoZHN0X2J1ZiwgMCwgYnVmX3Bvcyk7ICAKKwkJLyogemVybyB1bnVzZWQgcGFydCBvZiBzZWdtZW50LiAqLworCQltZW1zZXQoZHN0X2J1ZiArIGJ1Zl9wb3MsICdcMCcsIHNpemVfbGVmdCk7CisJCWJ1Zl9wb3MgPSB0aGlzX3NlZ3Nfc3o7CisJfSBlbHNlIHsgLyogbmVlZCBlbnRpcmUgc2VnbWVudCBhbmQgbW9yZSBzcGFjZSAqLworCQlQVVQyKGRzdF9idWYsIDAsIDApOyAKKwkJY3BfY250ID0gdGhpc19zZWdzX3N6IC0gc2l6ZW9mKF9fdTE2KTsKKwkJY2x1c3Rlci0+Y21wcl9zeiAgLT0gY3BfY250OworCQlidWZfcG9zID0gdGhpc19zZWdzX3N6OworCX0KKwltZW1jcHkoZHN0X2J1ZiArIHNpemVvZihfX3UxNiksIHNyY19idWYgKyBjbHVzdGVyLT5jbXByX3BvcywgY3BfY250KTsKKwljbHVzdGVyLT5jbXByX3BvcyArPSBjcF9jbnQ7CisJVFJBQ0VfRVhJVCBidWZfcG9zOworfQorCisvKiByZXR1cm4tdmFsdWU6IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCBmcm9tIHRoZSB1c2VyLWJ1ZmZlcgorICogICAgICAgICAgICAgICBgc3JjX2J1Zicgb3IgZXJyb3IgY29kZQorICoKKyAqICBpbnQgKndyaXRlX2NudCAgICAgICAgICAgOiBob3cgbXVjaCBhY3R1YWxseSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLiBOZWVkIG5vdCBiZSBpbml0aWFsaXplZCB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmV0dXJucyB3aXRoIGFuIGVycm9yIGNvZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmVnYXRpdiByZXR1cm4gdmFsdWUpIAorICogIF9fdTggKmRzdF9idWYgICAgICAgICAgICA6IGtlcm5lbCBzcGFjZSBidWZmZXIgd2hlcmUgdGhlIGhhcyB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCB0by4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVycworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvZXMgdG8gYSBzcGVjaWZpYyBzZWdtZW50LgorICogIGNvbnN0IGludCBzZWdfc3ogICAgICAgICA6IHRoZSBzaXplIG9mIHRoZSBzZWdtZW50IGRzdF9idWYgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCB0by4KKyAqICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyAgOiBzdHJ1Y3QgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCB2b2x1bWUgKGJ5dGUgcG9zaXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBpZCBvZiBjdXJyZW50IHNlZ21lbnQgZXRjKQorICogIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWU6IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHZvbHVtZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGV0Yy4KKyAqICBjb25zdCBfX3U4ICpzcmNfYnVmICAgICAgOiB1c2VyIHNwYWNlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdGhlIHVzZXIgd2FudHMgdG8gYmUgd3JpdHRlbiB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcGUuCisgKiAgY29uc3QgaW50IHJlcV9sZW4gICAgICAgIDogdGhlIGFtb3VudCBvZiBkYXRhIHRoZSB1c2VyIHdhbnRzIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiB0byB0YXBlLgorICovCitzdGF0aWMgaW50IHpmdGNfd3JpdGUoaW50ICp3cml0ZV9jbnQsCisJCSAgICAgIF9fdTggKmRzdF9idWYsIGNvbnN0IGludCBzZWdfc3osCisJCSAgICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKKwkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJaW50IHJlcV9sZW5fbGVmdCA9IHJlcV9sZW47CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuX2xlZnQ7CisJaW50IGJ1Zl9wb3Nfd3JpdGUgPSBwb3MtPnNlZ19ieXRlX3BvczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwkvKiBOb3RlOiB3ZSBkbyBub3QgdW5sb2NrIHRoZSBtb2R1bGUgYmVjYXVzZQorCSAqIHRoZXJlIGFyZSBzb21lIHZhbHVlcyBjYWNoZWQgaW4gdGhhdCBgY3NlZycgdmFyaWFibGUuICBXZQorCSAqIGRvbid0IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBiZWluZworCSAqIHVubG9hZGVkIGJ5IGtlcm5lbGQgZXZlbiB3aGVuIHRoZSB0YXBlIGlzIGZ1bGwgb3Igd2hlbiB3ZQorCSAqIGNhbm5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LgorCSAqLworCWlmIChwb3MtPnRhcGVfcG9zID4gKHZvbHVtZS0+c2l6ZS12b2x1bWUtPmJsa19zei1aRlRfQ01QUl9PVkVSSEVBRCkpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PU1BDOworCX0gICAgCisJaWYgKHpmdF9hbGxvY2F0ZV9jbXByX21lbSh2b2x1bWUtPmJsa19zeikgPCAwKSB7CisJCS8qIHNob3VsZCB3ZSB1bmxvY2sgdGhlIG1vZHVsZT8gQnV0IGl0IHNob3VsZG4ndCAKKwkJICogYmUgbG9ja2VkIGFueXdheSAuLi4KKwkJICovCisJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwl9CisJaWYgKGJ1Zl9wb3Nfd3JpdGUgPT0gMCkgeyAvKiBmaWxsIGEgbmV3IHNlZ21lbnQgKi8KKwkJKndyaXRlX2NudCA9IGJ1Zl9wb3Nfd3JpdGUgPSBzdGFydF9uZXdfY3NlZygmY3NlZywKKwkJCQkJCQkgICAgZHN0X2J1ZiwKKwkJCQkJCQkgICAgcG9zLAorCQkJCQkJCSAgICB2b2x1bWUtPmJsa19zeiwKKwkJCQkJCQkgICAgemZ0Y19idWYsIAorCQkJCQkJCSAgICBzZWdfc3osCisJCQkJCQkJICAgIHZvbHVtZS0+cWljMTEzKTsKKwkJaWYgKGNzZWcuY21wcl9zeiA9PSAwICYmIGNzZWcuY21wcl9wb3MgIT0gMCkgeworCQkJcmVxX2xlbl9sZWZ0IC09IHJlc3VsdCA9IHZvbHVtZS0+YmxrX3N6OworCQkJY3NlZy5jbXByX3BvcyAgPSAwOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCSp3cml0ZV9jbnQgPSByZXN1bHQgPSAwOworCX0KKwkKKwlsZW5fbGVmdCA9IHNlZ19zeiAtIGJ1Zl9wb3Nfd3JpdGU7CisJd2hpbGUgKChyZXFfbGVuX2xlZnQgPiAwKSAmJiAobGVuX2xlZnQgPiAxOCkpIHsKKwkJLyogbm93IHdlIGhhdmUgc29tZSBzaXplIGxlZnQgZm9yIGEgbmV3IGNvbXByZXNzZWQKKwkJICogYmxvY2suICBXZSBrbm93LCB0aGF0IHRoZSBjb21wcmVzc2lvbiBidWZmZXIgaXMKKwkJICogZW1wdHkgKGVsc2UgdGhlcmUgd291bGRuJ3QgYmUgYW55IHNwYWNlIGxlZnQpLiAgCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoemZ0Y19zY3JhdGNoX2J1Ziwgc3JjX2J1ZiArIHJlc3VsdCwgCisJCQkJICAgdm9sdW1lLT5ibGtfc3opICE9IDApIHsKKwkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJfQorCQlyZXFfbGVuX2xlZnQgLT0gdm9sdW1lLT5ibGtfc3o7CisJCWNzZWcuY21wcl9zeiA9IHpmdF9jb21wcmVzcyh6ZnRjX3NjcmF0Y2hfYnVmLCB2b2x1bWUtPmJsa19zeiwgCisJCQkJCSAgICB6ZnRjX2J1Zik7CisJCWlmIChjc2VnLmNtcHJfc3ogPCAwKSB7CisJCQljc2VnLnVuY21wciA9IDB4ODAwMDsKKwkJCWNzZWcuY21wcl9zeiA9IC1jc2VnLmNtcHJfc3o7CisJCX0gZWxzZSB7CisJCQljc2VnLnVuY21wciA9IDA7CisJCX0KKwkJLyogaW5jcmVtZW50ICJyZXN1bHQiIGlmZiB3ZSBjb3BpZWQgdGhlIGVudGlyZQorCQkgKiBjb21wcmVzc2VkIGJsb2NrIHRvIHRoZSB6ZnRfZGVibG9ja19idWYgCisJCSAqLworCQlsZW5fbGVmdCAtPSBzaXplb2YoX191MTYpOworCQlpZiAobGVuX2xlZnQgPj0gY3NlZy5jbXByX3N6KSB7CisJCQlsZW5fbGVmdCAtPSBjc2VnLmNvdW50ID0gY3NlZy5jbXByX3N6OworCQkJY3NlZy5jbXByX3BvcyA9IGNzZWcuY21wcl9zeiA9IDA7CisJCQlyZXN1bHQgKz0gdm9sdW1lLT5ibGtfc3o7CisJCX0gZWxzZSB7CisJCQljc2VnLmNtcHJfc3ogICAgICAgLT0gCisJCQkJY3NlZy5jbXByX3BvcyA9CisJCQkJY3NlZy5jb3VudCAgICA9IGxlbl9sZWZ0OworCQkJbGVuX2xlZnQgPSAwOworCQl9CisJCVBVVDIoZHN0X2J1ZiwgYnVmX3Bvc193cml0ZSwgY3NlZy51bmNtcHIgfCBjc2VnLmNvdW50KTsKKwkJYnVmX3Bvc193cml0ZSArPSBzaXplb2YoX191MTYpOworCQltZW1jcHkoZHN0X2J1ZiArIGJ1Zl9wb3Nfd3JpdGUsIHpmdGNfYnVmLCBjc2VnLmNvdW50KTsKKwkJYnVmX3Bvc193cml0ZSArPSBjc2VnLmNvdW50OworCQkqd3JpdGVfY250ICAgICs9IGNzZWcuY291bnQgKyBzaXplb2YoX191MTYpOworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJfQorCS8qIGVyYXNlIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQgaWYgbGVzcyB0aGFuIDE4IGJ5dGVzCisJICogbGVmdCAoMTggYnl0ZXMgaXMgZHVlIHRvIHRoZSBRSUMtODAgc3RhbmRhcmQpIAorCSAqLworCWlmIChsZW5fbGVmdCA8PSAxOCkgeworCQltZW1zZXQoZHN0X2J1ZiArIGJ1Zl9wb3Nfd3JpdGUsICdcMCcsIGxlbl9sZWZ0KTsKKwkJKCp3cml0ZV9jbnQpICs9IGxlbl9sZWZ0OworCX0KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybmluZyAlZCIsIHJlc3VsdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9ICAgCisKKy8qIG91dDoKKyAqCisgKiBpbnQgKnJlYWRfY250OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHJlbW92ZWQgZnJvbSB0aGUgemZ0X2RlYmxvY2tfYnVmCisgKiAgICAgICAgICAgICAgICAocmVzdWx0KQorICogaW50ICp0b19kbyAgIDogdGhlIHJlbWFpbmluZyBzaXplIG9mIHRoZSByZWFkLXJlcXVlc3QuCisgKgorICogaW46CisgKgorICogY2hhciAqYnVmZiAgICAgICAgICA6IGJ1ZmYgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHVzZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHRoYXQgaGFzbid0IGJlZW4gZmlsbGVkIHdpdGggZGF0YSB5ZXQuCisKKyAqIGludCBidWZfcG9zX3JlYWQgICAgOiBjb3B5IG9mIGZyb20gX2Z0YXBlX3JlYWQoKQorICogaW50IGJ1Zl9sZW5fcmVhZCAgICA6IGNvcHkgb2YgYnVmX2xlbl9yZCBmcm9tIF9mdGFwZV9yZWFkKCkKKyAqIGNoYXIgKnpmdF9kZWJsb2NrX2J1ZjogemZ0X2RlYmxvY2tfYnVmCisgKiB1bnNpZ25lZCBzaG9ydCBibGtfc3o6IHRoZSBibG9jayBzaXplIHZhbGlkIGZvciB0aGlzIHZvbHVtZSwgbWF5IGRpZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB6ZnRfYmxrX3N6LgorICogaW50IGZpbmlzaDogaWYgIT0gMCBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIGxhc3Qgc2VnbWVudCBiZWxvbmdpbmcKKyAqICB0byB0aGlzIHZvbHVtZQorICogcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgY29waWVkIHRvIHRoZSB1c2VyLWJ1ZmZlcgorICoKKyAqIHRvX2RvIE1VU1QgTk9UIFNIUklOSyBleGNlcHQgdG8gaW5kaWNhdGUgYW4gRU9GLiBJbiB0aGlzIGNhc2UgKnRvX2RvIGhhcyB0bworICogYmUgc2V0IHRvIDAgCisgKi8KK3N0YXRpYyBpbnQgemZ0Y19yZWFkIChpbnQgKnJlYWRfY250LCAKKwkJICAgICAgX191OCAgX191c2VyICpkc3RfYnVmLCBjb25zdCBpbnQgdG9fZG8sIAorCQkgICAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LCAKKwkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7ICAgICAgICAgIAorCWludCB1bmNvbXByZXNzZWRfc3o7ICAgICAgICAgCisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJlbWFpbmluZyA9IHRvX2RvOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0VfQ0FUQ0goemZ0X2FsbG9jYXRlX2NtcHJfbWVtKHZvbHVtZS0+YmxrX3N6KSwpOworCWlmIChwb3MtPnNlZ19ieXRlX3BvcyA9PSAwKSB7CisJCS8qIG5ldyBzZWdtZW50IGp1c3QgcmVhZAorCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goZ2V0X2NzZWcoJmNzZWcsIHNyY19idWYsIHNlZ19zeiwgdm9sdW1lKSwKKwkJCSAgICAqcmVhZF9jbnQgPSAwKTsKKwkJbWVtY3B5KHpmdGNfYnVmICsgY3NlZy5jbXByX3Bvcywgc3JjX2J1ZiArIHNpemVvZihfX3UxNiksIAorCQkgICAgICAgY3NlZy5jb3VudCk7CisJCWNzZWcuY21wcl9wb3MgKz0gY3NlZy5jb3VudDsKKwkJKnJlYWRfY250ICAgICAgPSBjc2VnLm9mZnNldDsKKwkJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSAvKiBmdF90X2FueSAqLywgIiIsICZjc2VnKTsKKwl9IGVsc2UgeworCQkqcmVhZF9jbnQgPSAwOworCX0KKwkvKiBsb29wIGFuZCB1bmNvbXByZXNzIHVudGlsIHVzZXIgYnVmZmVyIGZ1bGwgb3IKKwkgKiBkZWJsb2NrLWJ1ZmZlciBlbXB0eSAKKwkgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgImNvbXByZXNzZWRfc3o6ICVkLCBjb21wb3MgOiAlZCwgKnJlYWRfY250OiAlZCIsCisJICAgICAgY3NlZy5jbXByX3N6LCBjc2VnLmNtcHJfcG9zLCAqcmVhZF9jbnQpOworCXdoaWxlICgoY3NlZy5zcGFucyA9PSAwKSAmJiAocmVtYWluaW5nID4gMCkpIHsKKwkJaWYgKGNzZWcuY21wcl9wb3MgICE9IDApIHsgLyogY21wciBidWYgaXMgbm90IGVtcHR5ICovCisJCQl1bmNvbXByZXNzZWRfc3ogPSAKKwkJCQl6ZnRfdW5jb21wcmVzcyh6ZnRjX2J1ZiwKKwkJCQkJICAgICAgIGNzZWcudW5jbXByID09IDB4ODAwMCA/CisJCQkJCSAgICAgICAtY3NlZy5jbXByX3BvcyA6IGNzZWcuY21wcl9wb3MsCisJCQkJCSAgICAgICB6ZnRjX3NjcmF0Y2hfYnVmLAorCQkJCQkgICAgICAgdm9sdW1lLT5ibGtfc3opOworCQkJaWYgKHVuY29tcHJlc3NlZF9zeiAhPSB2b2x1bWUtPmJsa19zeikgeworCQkJCSpyZWFkX2NudCA9IDA7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF93YXJuLAorCQkJCSAgICAgICJVbmNvbXByZXNzZWQgYmxrICglZCkgIT0gYmxrIHNpemUgKCVkKSIsCisJCQkJICAgICAgdW5jb21wcmVzc2VkX3N6LCB2b2x1bWUtPmJsa19zeik7CisJCQl9ICAgICAgIAorCQkJaWYgKGNvcHlfdG9fdXNlcihkc3RfYnVmICsgcmVzdWx0LCAKKwkJCQkJIHpmdGNfc2NyYXRjaF9idWYsIAorCQkJCQkgdW5jb21wcmVzc2VkX3N6KSAhPSAwICkgeworCQkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJCX0KKwkJCXJlbWFpbmluZyAgICAgIC09IHVuY29tcHJlc3NlZF9zejsKKwkJCXJlc3VsdCAgICAgKz0gdW5jb21wcmVzc2VkX3N6OworCQkJY3NlZy5jbXByX3BvcyAgPSAwOworCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlpZiAocmVtYWluaW5nID4gMCkgeworCQkJZ2V0X25leHRfY2x1c3RlcigmY3NlZywgc3JjX2J1Ziwgc2VnX3N6LCAKKwkJCQkJIHZvbHVtZS0+ZW5kX3NlZyA9PSBwb3MtPnNlZ19wb3MpOworCQkJaWYgKGNzZWcuY291bnQgIT0gMCkgeworCQkJCW1lbWNweSh6ZnRjX2J1Ziwgc3JjX2J1ZiArIGNzZWcub2Zmc2V0LAorCQkJCSAgICAgICBjc2VnLmNvdW50KTsKKwkJCQljc2VnLmNtcHJfcG9zID0gY3NlZy5jb3VudDsKKwkJCQljc2VnLm9mZnNldCAgKz0gY3NlZy5jb3VudDsKKwkJCQkqcmVhZF9jbnQgKz0gY3NlZy5jb3VudCArIHNpemVvZihfX3UxNik7CisJCQl9IGVsc2UgeworCQkJCXJlbWFpbmluZyA9IDA7CisJCQl9CisJCX0KKwkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIgCisJCSAgICAgIEtFUk5fSU5GTyAiY29tcHJlc3NlZF9zejogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJjb21wb3MgICAgICAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gIipyZWFkX2NudCAgICA6ICVkIiwKKwkJICAgICAgY3NlZy5jbXByX3N6LCBjc2VnLmNtcHJfcG9zLCAqcmVhZF9jbnQpOworCX0KKwlpZiAoc2VnX3N6IC0gY3NlZy5vZmZzZXQgPD0gMTgpIHsKKwkJKnJlYWRfY250ICs9IHNlZ19zeiAtIGNzZWcub2Zmc2V0OworCQlUUkFDRShmdF90X2RhdGFfZmxvdywgImV4cGFuZGluZyByZWFkIGNudCB0bzogJWQiLCAqcmVhZF9jbnQpOworCX0KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCBzaXplICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVhZCBjb3VudCAgICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAiYnVmX3Bvc19yZWFkICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nICAgICAgOiAlZCIsCisJCXNlZ19zeiwgKnJlYWRfY250LCBwb3MtPnNlZ19ieXRlX3BvcywgCisJCXNlZ19zeiAtICpyZWFkX2NudCAtIHBvcy0+c2VnX2J5dGVfcG9zKTsKKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybmluZzogJWQiLCByZXN1bHQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfSAgICAgICAgICAgICAgICAKKworLyogc2Vla3MgdG8gdGhlIG5ldyBkYXRhLXBvc2l0aW9uLiBSZWFkcyBzb21ldGltZXMgYSBzZWdtZW50LgorICogIAorICogc3RhcnRfc2VnIGFuZCBlbmRfc2VnIGdpdmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQgdm9sdW1lCisgKiBibGtfc3ogaXMgdGhlIGJsa19zeiBvZiB0aGUgY3VycmVudCB2b2x1bWUgYXMgc3RvcmVkIGluIHRoZQorICogdm9sdW1lIGxhYmVsCisgKgorICogV2UgZG9uJ3QgYWxsb3cgYmxvY2tzaXplcyBsZXNzIHRoYW4gMTAyNCBieXRlcywgdGhlcmVmb3JlIHdlIGRvbid0IG5lZWQKKyAqIGEgNjQgYml0IGFyZ3VtZW50IGZvciBuZXdfYmxvY2tfcG9zLgorICovCisKK3N0YXRpYyBpbnQgc2Vla19pbl9zZWdtZW50KGNvbnN0IHVuc2lnbmVkIGludCB0b19kbywgY21wcl9pbmZvICAqY19pbmZvLAorCQkJICAgY29uc3QgY2hhciAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwgCisJCQkgICBjb25zdCBpbnQgc2VnX3BvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW50IHNsb3dfc2Vla19mb3J3YXJkX3VudGlsX2Vycm9yKGNvbnN0IHVuc2lnbmVkIGludCBkaXN0YW5jZSwKKwkJCQkJIGNtcHJfaW5mbyAqY19pbmZvLCB6ZnRfcG9zaXRpb24gKnBvcywgCisJCQkJCSBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLCBfX3U4ICpidWYpOworc3RhdGljIGludCBzZWFyY2hfdmFsaWRfc2VnbWVudCh1bnNpZ25lZCBpbnQgc2VnbWVudCwKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgZW5kX3NlZywKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X2ZvZmZzLAorCQkJCXpmdF9wb3NpdGlvbiAqcG9zLCBjbXByX2luZm8gKmNfaW5mbywKKwkJCQljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLCBfX3U4ICpidWYpOworc3RhdGljIGludCBzbG93X3NlZWtfZm9yd2FyZCh1bnNpZ25lZCBpbnQgZGVzdCwgY21wcl9pbmZvICpjX2luZm8sCisJCQkgICAgIHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAorCQkJICAgICBfX3U4ICpidWYpOworc3RhdGljIGludCBjb21wdXRlX3NlZ19wb3ModW5zaWduZWQgaW50IGRlc3QsIHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CisKKyNkZWZpbmUgWkZUX1NMT1dfU0VFS19USFJFU0hPTEQgIDEwIC8qIHNlZ21lbnRzICovCisjZGVmaW5lIFpGVF9GQVNUX1NFRUtfTUFYX1RSSUFMUyAxMCAvKiB0aW1lcyAqLworI2RlZmluZSBaRlRfRkFTVF9TRUVLX0JBQ0tVUCAgICAgMTAgLyogc2VnbWVudHMgKi8KKworc3RhdGljIGludCB6ZnRjX3NlZWsodW5zaWduZWQgaW50IG5ld19ibG9ja19wb3MsCisJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsIF9fdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwlpbnQgbGltaXQ7CisJaW50IGRpc3RhbmNlOworCWludCByZXN1bHQgPSAwOworCWludCBzZWdfZGlzdDsKKwlpbnQgbmV3X3NlZzsKKwlpbnQgb2xkX3NlZyA9IDA7CisJaW50IGZhc3Rfc2Vla190cmlhbHMgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKG5ld19ibG9ja19wb3MgPT0gMCkgeworCQlwb3MtPnNlZ19wb3MgICAgICA9IHZvbHVtZS0+c3RhcnRfc2VnOworCQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7CisJCXBvcy0+dm9sdW1lX3BvcyAgID0gMDsKKwkJemZ0Y19yZXNldCgpOworCQlUUkFDRV9FWElUIDA7CisJfQorCWRlc3QgPSBuZXdfYmxvY2tfcG9zICogKHZvbHVtZS0+YmxrX3N6ID4+IDEwKTsKKwlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwl3aGlsZSAoZGlzdGFuY2UgIT0gMCkgeworCQlzZWdfZGlzdCA9IGNvbXB1dGVfc2VnX3BvcyhkZXN0LCBwb3MsIHZvbHVtZSk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfZGlzdDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJkaXN0YW5jZTogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJkZXN0ICAgIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJ2cG9zICAgIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfcG9zIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJ0cmlhbHMgIDogJWQiLAorCQkgICAgICBzZWdfZGlzdCwgZGlzdGFuY2UsIGRlc3QsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpKHBvcy0+dm9sdW1lX3Bvcz4+MTApLCBwb3MtPnNlZ19wb3MsCisJCSAgICAgIGZhc3Rfc2Vla190cmlhbHMpOworCQlpZiAoZGlzdGFuY2UgPiAwKSB7CisJCQlpZiAoc2VnX2Rpc3QgPCAwKSB7CisJCQkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IGRpc3RhbmNlICVkID4gMCwgIgorCQkJCSAgICAgICJzZWdtZW50IGRpZmZlcmVuY2UgJWQgPCAwIiwKKwkJCQkgICAgICBkaXN0YW5jZSwgc2VnX2Rpc3QpOworCQkJCXJlc3VsdCA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJCQluZXdfc2VnID0gcG9zLT5zZWdfcG9zICsgc2VnX2Rpc3Q7CisJCQlpZiAobmV3X3NlZyA+IHZvbHVtZS0+ZW5kX3NlZykgeworCQkJCW5ld19zZWcgPSB2b2x1bWUtPmVuZF9zZWc7CisJCQl9CisJCQlpZiAob2xkX3NlZyA9PSBuZXdfc2VnIHx8IC8qIGxvb3AgKi8KKwkJCSAgICBzZWdfZGlzdCA8PSBaRlRfU0xPV19TRUVLX1RIUkVTSE9MRCB8fAorCQkJICAgIGZhc3Rfc2Vla190cmlhbHMgPj0gWkZUX0ZBU1RfU0VFS19NQVhfVFJJQUxTKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInN0YXJ0aW5nIHNsb3cgc2VlazpcbiIKKwkJCQkgICBLRVJOX0lORk8gImZhc3Qgc2VlayBmYWlsZWQgdG9vIG9mdGVuOiAlc1xuIgorCQkJCSAgIEtFUk5fSU5GTyAibmVhciB0YXJnZXQgcG9zaXRpb24gICAgICA6ICVzXG4iCisJCQkJICAgS0VSTl9JTkZPICJsb29waW5nIGJldHdlZW4gdHdvIHNlZ3MgIDogJXMiLAorCQkJCSAgICAgIChmYXN0X3NlZWtfdHJpYWxzID49IAorCQkJCSAgICAgICBaRlRfRkFTVF9TRUVLX01BWF9UUklBTFMpCisJCQkJICAgICAgPyAieWVzIiA6ICJubyIsCisJCQkJICAgICAgKHNlZ19kaXN0IDw9IFpGVF9TTE9XX1NFRUtfVEhSRVNIT0xEKSAKKwkJCQkgICAgICA/ICJ5ZXMiIDogIm5vIiwKKwkJCQkgICAgICAob2xkX3NlZyA9PSBuZXdfc2VnKQorCQkJCSAgICAgID8gInllcyIgOiAibm8iKTsKKwkJCQlyZXN1bHQgPSBzbG93X3NlZWtfZm9yd2FyZChkZXN0LCAmY3NlZywgCisJCQkJCQkJICAgcG9zLCB2b2x1bWUsIGJ1Zik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvbGRfc2VnID0gbmV3X3NlZzsKKwkJCWxpbWl0ID0gdm9sdW1lLT5lbmRfc2VnOworCQkJZmFzdF9zZWVrX3RyaWFscyArKzsKKwkJCWZvciAoOzspIHsKKwkJCQlyZXN1bHQgPSBzZWFyY2hfdmFsaWRfc2VnbWVudChuZXdfc2VnLCBsaW1pdCwKKwkJCQkJCQkgICAgICB2b2x1bWUtPnNpemUsCisJCQkJCQkJICAgICAgcG9zLCAmY3NlZywKKwkJCQkJCQkgICAgICB2b2x1bWUsIGJ1Zik7CisJCQkJaWYgKHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAtRUlOVFIpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChuZXdfc2VnID09IHZvbHVtZS0+c3RhcnRfc2VnKSB7CisJCQkJCXJlc3VsdCA9IC1FSU87IC8qIHNldCBlcnJyb3IgCisJCQkJCQkJKiBjb25kaXRpb24KKwkJCQkJCQkqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbGltaXQgICAgPSBuZXdfc2VnOworCQkJCW5ld19zZWcgLT0gWkZUX0ZBU1RfU0VFS19CQUNLVVA7CisJCQkJaWYgKG5ld19zZWcgPCB2b2x1bWUtPnN0YXJ0X3NlZykgeworCQkJCQluZXdfc2VnID0gdm9sdW1lLT5zdGFydF9zZWc7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJICAgICAgIkNvdWxkbid0IGZpbmQgYSByZWFkYWJsZSBzZWdtZW50Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSAvKiBpZiAoZGlzdGFuY2UgPCAwKSAqLyB7CisJCQlpZiAoc2VnX2Rpc3QgPiAwKSB7CisJCQkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IGRpc3RhbmNlICVkIDwgMCwgIgorCQkJCSAgICAgICJzZWdtZW50IGRpZmZlcmVuY2UgJWQgPjAiLAorCQkJCSAgICAgIGRpc3RhbmNlLCBzZWdfZGlzdCk7CisJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5ld19zZWcgPSBwb3MtPnNlZ19wb3MgKyBzZWdfZGlzdDsKKwkJCWlmIChmYXN0X3NlZWtfdHJpYWxzID4gMCAmJiBzZWdfZGlzdCA9PSAwKSB7CisJCQkJLyogdGhpcyBhdm9pZHMgc3RpY2tpbmcgdG8gdGhlIHNhbWUKKwkJCQkgKiBzZWdtZW50IGFsbCB0aGUgdGltZS4gT24gdGhlIG90aGVyIGhhbmQ6CisJCQkJICogaWYgd2UgZ290IGhlcmUgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgdGhlCisJCQkJICogZGVibG9ja19idWZmZXIgc3RpbGwgY29udGFpbnMgYSB2YWxpZAorCQkJCSAqIHNlZ21lbnQsIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBza2lwIHRvIAorCQkJCSAqIHRoZSBwcmV2aW91cyBzZWdtZW50IGlmIHRoZSBkZXNpcmVkIHBvc2l0aW9uCisJCQkJICogaXMgaW5zaWRlIHRoaXMgc2VnbWVudC4KKwkJCQkgKi8KKwkJCQluZXdfc2VnIC0tOworCQkJfQorCQkJaWYgKG5ld19zZWcgPCB2b2x1bWUtPnN0YXJ0X3NlZykgeworCQkJCW5ld19zZWcgPSB2b2x1bWUtPnN0YXJ0X3NlZzsKKwkJCX0KKwkJCWxpbWl0ICAgPSBwb3MtPnNlZ19wb3M7CisJCQlmYXN0X3NlZWtfdHJpYWxzICsrOworCQkJZm9yICg7OykgeworCQkJCXJlc3VsdCA9IHNlYXJjaF92YWxpZF9zZWdtZW50KG5ld19zZWcsIGxpbWl0LAorCQkJCQkJCSAgICAgIHBvcy0+dm9sdW1lX3BvcywKKwkJCQkJCQkgICAgICBwb3MsICZjc2VnLAorCQkJCQkJCSAgICAgIHZvbHVtZSwgYnVmKTsKKwkJCQlpZiAocmVzdWx0ID09IDAgfHwgcmVzdWx0ID09IC1FSU5UUikgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG5ld19zZWcgPT0gdm9sdW1lLT5zdGFydF9zZWcpIHsKKwkJCQkJcmVzdWx0ID0gLUVJTzsgLyogc2V0IGVycnJvciAKKwkJCQkJCQkqIGNvbmRpdGlvbgorCQkJCQkJCSovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlsaW1pdCAgICA9IG5ld19zZWc7CisJCQkJbmV3X3NlZyAtPSBaRlRfRkFTVF9TRUVLX0JBQ0tVUDsKKwkJCQlpZiAobmV3X3NlZyA8IHZvbHVtZS0+c3RhcnRfc2VnKSB7CisJCQkJCW5ld19zZWcgPSB2b2x1bWUtPnN0YXJ0X3NlZzsKKwkJCQl9CisJCQl9CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiQ291bGRuJ3QgZmluZCBhIHJlYWRhYmxlIHNlZ21lbnQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworLyogIGFkdmFuY2UgaW5zaWRlIHRoZSBnaXZlbiBzZWdtZW50IGF0IG1vc3QgdG9fZG8gYnl0ZXMuCisgKiAgb2Yga2lsb2J5dGVzIG1vdmVkCisgKi8KKworc3RhdGljIGludCBzZWVrX2luX3NlZ21lbnQoY29uc3QgdW5zaWduZWQgaW50IHRvX2RvLAorCQkJICAgY21wcl9pbmZvICAqY19pbmZvLAorCQkJICAgY29uc3QgY2hhciAqc3JjX2J1ZiwgCisJCQkgICBjb25zdCBpbnQgc2VnX3N6LCAKKwkJCSAgIGNvbnN0IGludCBzZWdfcG9zLAorCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgYmxrX3N6ID0gdm9sdW1lLT5ibGtfc3ogPj4gMTA7CisJaW50IHJlbWFpbmluZyA9IHRvX2RvOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGNfaW5mby0+b2Zmc2V0ID09IDApIHsKKwkJLyogbmV3IHNlZ21lbnQganVzdCByZWFkCisJCSAqLworCQlUUkFDRV9DQVRDSChnZXRfY3NlZyhjX2luZm8sIHNyY19idWYsIHNlZ19zeiwgdm9sdW1lKSwpOworCQljX2luZm8tPmNtcHJfcG9zICs9IGNfaW5mby0+Y291bnQ7CisJCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UsICIiLCBjX2luZm8pOworCX0KKwkvKiBsb29wIGFuZCB1bmNvbXByZXNzIHVudGlsIHVzZXIgYnVmZmVyIGZ1bGwgb3IKKwkgKiBkZWJsb2NrLWJ1ZmZlciBlbXB0eSAKKwkgKi8KKwlUUkFDRShmdF90X25vaXNlLCAiY29tcHJlc3NlZF9zejogJWQsIGNvbXBvcyA6ICVkIiwKKwkgICAgICBjX2luZm8tPmNtcHJfc3osIGNfaW5mby0+Y21wcl9wb3MpOworCXdoaWxlIChjX2luZm8tPnNwYW5zID09IDAgJiYgcmVtYWluaW5nID4gMCkgeworCQlpZiAoY19pbmZvLT5jbXByX3BvcyAgIT0gMCkgeyAvKiBjbXByIGJ1ZiBpcyBub3QgZW1wdHkgKi8KKwkJCXJlc3VsdCAgICAgICArPSBibGtfc3o7CisJCQlyZW1haW5pbmcgICAgLT0gYmxrX3N6OworCQkJY19pbmZvLT5jbXByX3BvcyA9IDA7CisJCX0KKwkJaWYgKHJlbWFpbmluZyA+IDApIHsKKwkJCWdldF9uZXh0X2NsdXN0ZXIoY19pbmZvLCBzcmNfYnVmLCBzZWdfc3osIAorCQkJCQkgdm9sdW1lLT5lbmRfc2VnID09IHNlZ19wb3MpOworCQkJaWYgKGNfaW5mby0+Y291bnQgIT0gMCkgeworCQkJCWNfaW5mby0+Y21wcl9wb3MgPSBjX2luZm8tPmNvdW50OworCQkJCWNfaW5mby0+b2Zmc2V0ICArPSBjX2luZm8tPmNvdW50OworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSwgIiIsIGNfaW5mbyk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0b19kbzogJWQiLCByZW1haW5pbmcpOworCX0KKwlpZiAoc2VnX3N6IC0gY19pbmZvLT5vZmZzZXQgPD0gMTgpIHsKKwkJY19pbmZvLT5vZmZzZXQgPSBzZWdfc3o7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkgICAgICBLRVJOX0lORk8gInNlZ21lbnQgc2l6ZSAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gImJ1Zl9wb3NfcmVhZCAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZyAgICAgIDogJWQiLAorCSAgICAgIHNlZ19zeiwgY19pbmZvLT5vZmZzZXQsCisJICAgICAgc2VnX3N6IC0gY19pbmZvLT5vZmZzZXQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfSAgICAgICAgICAgICAgICAKKworc3RhdGljIGludCBzbG93X3NlZWtfZm9yd2FyZF91bnRpbF9lcnJvcihjb25zdCB1bnNpZ25lZCBpbnQgZGlzdGFuY2UsCisJCQkJCSBjbXByX2luZm8gKmNfaW5mbywKKwkJCQkJIHpmdF9wb3NpdGlvbiAqcG9zLCAKKwkJCQkJIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkJCSBfX3U4ICpidWYpCit7CisJdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGRpc3RhbmNlOworCWludCBzZWdfc3o7CisJaW50IHNlZ19wb3M7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlzZWdfcG9zID0gcG9zLT5zZWdfcG9zOworCWRvIHsKKwkJVFJBQ0VfQ0FUQ0goc2VnX3N6ID0gemZ0X2ZldGNoX3NlZ21lbnQoc2VnX3BvcywgYnVmLCAKKwkJCQkJCSAgICAgICBGVF9SRF9BSEVBRCksKTsKKwkJLyogbm93IHdlIGhhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBhY3R1YWwgc2VnbWVudCBpbgorCQkgKiB0aGUgZGVibG9jayBidWZmZXIKKwkJICovCisJCVRSQUNFX0NBVENIKHJlc3VsdCA9IHNlZWtfaW5fc2VnbWVudChyZW1haW5pbmcsIGNfaW5mbywgYnVmLAorCQkJCQkJICAgICBzZWdfc3osIHNlZ19wb3Msdm9sdW1lKSwpOworCQlyZW1haW5pbmcgICAgICAgIC09IHJlc3VsdDsKKwkJcG9zLT52b2x1bWVfcG9zICArPSByZXN1bHQ8PDEwOworCQlwb3MtPnNlZ19wb3MgICAgICA9IHNlZ19wb3M7CisJCXBvcy0+c2VnX2J5dGVfcG9zID0gY19pbmZvLT5vZmZzZXQ7CisJCXNlZ19wb3MgKys7CisJCWlmIChzZWdfcG9zIDw9IHZvbHVtZS0+ZW5kX3NlZyAmJiBjX2luZm8tPm9mZnNldCA9PSBzZWdfc3opIHsKKwkJCXBvcy0+c2VnX3BvcyArKzsKKwkJCXBvcy0+c2VnX2J5dGVfcG9zID0gMDsKKwkJCWNfaW5mby0+b2Zmc2V0ID0gMDsKKwkJfQorCQkvKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2VnX3BvczogICAgJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJlbmRfc2VnOiAgICAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInJlc3VsdDogICAgICVkIiwKKwkJICAgICAgcmVtYWluaW5nLCBzZWdfcG9zLCB2b2x1bWUtPmVuZF9zZWcsIHJlc3VsdCk7ICAKKwl9IHdoaWxlIChyZW1haW5pbmcgPiAwICYmIHNlZ19wb3MgPD0gdm9sdW1lLT5lbmRfc2VnKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIHJldHVybiBzZWdtZW50IGlkIG9mIG5leHQgc2VnbWVudCBjb250YWluaW5nIHZhbGlkIGRhdGEsIC1FSU8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgc2VhcmNoX3ZhbGlkX3NlZ21lbnQodW5zaWduZWQgaW50IHNlZ21lbnQsCisJCQkJY29uc3QgdW5zaWduZWQgaW50IGVuZF9zZWcsCisJCQkJY29uc3QgdW5zaWduZWQgaW50IG1heF9mb2ZmcywKKwkJCQl6ZnRfcG9zaXRpb24gKnBvcywKKwkJCQljbXByX2luZm8gKmNfaW5mbywKKwkJCQljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAorCQkJCV9fdTggKmJ1ZikKK3sKKwljbXByX2luZm8gdG1wX2luZm87CisJaW50IHNlZ19zejsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwltZW1zZXQoJnRtcF9pbmZvLCAwLCBzaXplb2YoY21wcl9pbmZvKSk7CisJd2hpbGUgKHNlZ21lbnQgPD0gZW5kX3NlZykgeworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCSAgICAgICJTZWFyY2hpbmcgcmVhZGFibGUgc2VnbWVudCBiZXR3ZWVuICVkIGFuZCAlZCIsCisJCSAgICAgIHNlZ21lbnQsIGVuZF9zZWcpOworCQlzZWdfc3ogPSB6ZnRfZmV0Y2hfc2VnbWVudChzZWdtZW50LCBidWYsIEZUX1JEX0FIRUFEKTsKKwkJaWYgKChzZWdfc3ogPiAwKSAmJgorCQkgICAgKGdldF9jc2VnICgmdG1wX2luZm8sIGJ1Ziwgc2VnX3N6LCB2b2x1bWUpID49IDApICYmCisJCSAgICAodG1wX2luZm8uZm9mZnMgIT0gMCB8fCBzZWdtZW50ID09IHZvbHVtZS0+c3RhcnRfc2VnKSkgeworCQkJaWYgKCh0bXBfaW5mby5mb2Zmcz4+MTApID4gbWF4X2ZvZmZzKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9ub2lzZSwgIlxuIgorCQkJCQkgICAgS0VSTl9JTkZPICJjc2VnLmZvZmY6ICVkXG4iCisJCQkJCSAgICBLRVJOX0lORk8gImRlc3QgICAgIDogJWQiLAorCQkJCQkgICAgKGludCkodG1wX2luZm8uZm9mZnMgPj4gMTApLAorCQkJCQkgICAgbWF4X2ZvZmZzKTsKKwkJCX0KKwkJCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UsICIiLCAmdG1wX2luZm8pOworCQkJKmNfaW5mbyAgICAgICAgICAgPSB0bXBfaW5mbzsKKwkJCXBvcy0+c2VnX3BvcyAgICAgID0gc2VnbWVudDsKKwkJCXBvcy0+dm9sdW1lX3BvcyAgID0gY19pbmZvLT5mb2ZmczsKKwkJCXBvcy0+c2VnX2J5dGVfcG9zID0gY19pbmZvLT5vZmZzZXQ7CisJCQlUUkFDRShmdF90X25vaXNlLCAiZm91bmQgc2VnbWVudCBhdCAlZCIsIHNlZ21lbnQpOworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJCXNlZ21lbnQrKzsKKwl9CisJVFJBQ0VfRVhJVCAtRUlPOworfQorCitzdGF0aWMgaW50IHNsb3dfc2Vla19mb3J3YXJkKHVuc2lnbmVkIGludCBkZXN0LAorCQkJICAgICBjbXByX2luZm8gKmNfaW5mbywKKwkJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkgICAgIF9fdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgZGlzdGFuY2U7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCQorCWRpc3RhbmNlID0gZGVzdCAtIChwb3MtPnZvbHVtZV9wb3MgPj4gMTApOworCXdoaWxlICgoZGlzdGFuY2UgPiAwKSAmJgorCSAgICAgICAocmVzdWx0ID0gc2xvd19zZWVrX2ZvcndhcmRfdW50aWxfZXJyb3IoZGlzdGFuY2UsCisJCQkJCQkgICAgICAgY19pbmZvLAorCQkJCQkJICAgICAgIHBvcywKKwkJCQkJCSAgICAgICB2b2x1bWUsCisJCQkJCQkgICAgICAgYnVmKSkgPCAwKSB7CisJCWlmIChyZXN1bHQgPT0gLUVJTlRSKSB7CisJCQlicmVhazsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAic2VnX3BvczogJWQiLCBwb3MtPnNlZ19wb3MpOworCQkvKiB0aGUgZmFpbGluZyBzZWdtZW50IGlzIGVpdGhlciBwb3MtPnNlZ19wb3Mgb3IKKwkJICogcG9zLT5zZWdfcG9zICsgMS4gVGhlcmUgaXMgbm8gbmVlZCB0byBmdXJ0aGVyIHRyeQorCQkgKiB0aGF0IHNlZ21lbnQsIGJlY2F1c2UgZnRhcGVfcmVhZF9zZWdtZW50KCkgYWxyZWFkeQorCQkgKiBoYXMgdHJpZWQgdmVyeSBtdWNoIHRvIHJlYWQgaXQuIFNvIHdlIHN0YXJ0IHdpdGgKKwkJICogZm9sbG93aW5nIHNlZ21lbnQsIHdoaWNoIGlzIHBvcy0+c2VnX3BvcyArIDEKKwkJICovCisJCWlmKHNlYXJjaF92YWxpZF9zZWdtZW50KHBvcy0+c2VnX3BvcysxLCB2b2x1bWUtPmVuZF9zZWcsIGRlc3QsCisJCQkJCXBvcywgY19pbmZvLAorCQkJCQl2b2x1bWUsIGJ1ZikgPCAwKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAic2VhcmNoX3ZhbGlkX3NlZ21lbnQoKSBmYWlsZWQiKTsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwkJcmVzdWx0ID0gMDsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInNlZ21lbnQ6ICVkIiwgcG9zLT5zZWdfcG9zKTsKKwkJLyogZm91bmQgdmFsaWQgc2VnbWVudCwgcmV0cnkgdGhlIHNlZWsgKi8KKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgY29tcHV0ZV9zZWdfcG9zKGNvbnN0IHVuc2lnbmVkIGludCBkZXN0LAorCQkJICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoreworCWludCBzZWdtZW50OworCWludCBkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwl1bnNpZ25lZCBpbnQgcmF3X3NpemU7CisJdW5zaWduZWQgaW50IHZpcnRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZmFjdG9yOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGRpc3RhbmNlID49IDApIHsKKwkJcmF3X3NpemUgID0gdm9sdW1lLT5lbmRfc2VnIC0gcG9zLT5zZWdfcG9zICsgMTsKKwkJdmlydF9zaXplID0gKCh1bnNpZ25lZCBpbnQpKHZvbHVtZS0+c2l6ZT4+MTApIAorCQkJICAgICAtICh1bnNpZ25lZCBpbnQpKHBvcy0+dm9sdW1lX3Bvcz4+MTApCisJCQkgICAgICsgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTIC0gMSk7CisJCXZpcnRfc2l6ZSAvPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gRlRfRUNDX1NFQ1RPUlM7CisJCWlmICh2aXJ0X3NpemUgPT0gMCB8fCByYXdfc2l6ZSA9PSAwKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJaWYgKHJhd19zaXplID49ICgxPDwyNSkpIHsKKwkJCWZhY3RvciA9IHJhd19zaXplLyh2aXJ0X3NpemU+PjcpOworCQl9IGVsc2UgeworCQkJZmFjdG9yID0gKHJhd19zaXplPDw3KS92aXJ0X3NpemU7CisJCX0KKwkJc2VnbWVudCA9IGRpc3RhbmNlLyhGVF9TRUNUT1JTX1BFUl9TRUdNRU5ULUZUX0VDQ19TRUNUT1JTKTsKKwkJc2VnbWVudCA9IChzZWdtZW50ICogZmFjdG9yKT4+NzsKKwl9IGVsc2UgeworCQlyYXdfc2l6ZSAgPSBwb3MtPnNlZ19wb3MgLSB2b2x1bWUtPnN0YXJ0X3NlZyArIDE7CisJCXZpcnRfc2l6ZSA9ICgodW5zaWduZWQgaW50KShwb3MtPnZvbHVtZV9wb3M+PjEwKQorCQkJICAgICArIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBGVF9FQ0NfU0VDVE9SUyAtIDEpOworCQl2aXJ0X3NpemUgLz0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTOworCQlpZiAodmlydF9zaXplID09IDAgfHwgcmF3X3NpemUgPT0gMCkgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJCWlmIChyYXdfc2l6ZSA+PSAoMTw8MjUpKSB7CisJCQlmYWN0b3IgPSByYXdfc2l6ZS8odmlydF9zaXplPj43KTsKKwkJfSBlbHNlIHsKKwkJCWZhY3RvciA9IChyYXdfc2l6ZTw8NykvdmlydF9zaXplOworCQl9CisJCXNlZ21lbnQgPSBkaXN0YW5jZS8oRlRfU0VDVE9SU19QRVJfU0VHTUVOVC1GVF9FQ0NfU0VDVE9SUyk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmYWN0b3I6ICVkLyVkIiwgZmFjdG9yLCAxPDw3KTsKKwlUUkFDRV9FWElUIHNlZ21lbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgemZ0X2NtcHJfb3BzIGNtcHJfb3BzID0geworCXpmdGNfd3JpdGUsCisJemZ0Y19yZWFkLAorCXpmdGNfc2VlaywKKwl6ZnRjX2xvY2ssCisJemZ0Y19yZXNldCwKKwl6ZnRjX2NsZWFudXAKK307CisKK2ludCB6ZnRfY29tcHJlc3Nvcl9pbml0KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKEtFUk5fSU5GTyAiemZ0YXBlIGNvbXByZXNzb3IgdjEuMDBhIDk3MDUxNCBmb3IgIiBGVEFQRV9WRVJTSU9OICJcbiIpOworICAgICAgICBpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCXByaW50aygKK0tFUk5fSU5GTyAiKGMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIChjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUpXG4iCitLRVJOX0lORk8gIkNvbXByZXNzb3IgZm9yIHpmdGFwZSAobHpydzMgYWxnb3JpdGhtKVxuIik7CisgICAgICAgIH0KKyNlbHNlIC8qICFNT0RVTEUgKi8KKwkvKiBwcmludCBhIHNob3J0IG5vLW5vbnNlbnNlIGJvb3QgbWVzc2FnZSAqLworCXByaW50aygiemZ0YXBlIGNvbXByZXNzb3IgdjEuMDBhIDk3MDUxNFxuIik7CisJcHJpbnRrKCJGb3IgdXNlIHdpdGggIiBGVEFQRV9WRVJTSU9OICJcbiIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCVRSQUNFKGZ0X3RfaW5mbywgInpmdF9jb21wcmVzc29yX2luaXQgQCAweCVwIiwgemZ0X2NvbXByZXNzb3JfaW5pdCk7CisJVFJBQ0UoZnRfdF9pbmZvLCAiaW5zdGFsbGluZyBjb21wcmVzc29yIGZvciB6ZnRhcGUgLi4uIik7CisJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfcmVnaXN0ZXIoJmNtcHJfb3BzKSwpOworCVRSQUNFX0VYSVQgMDsKK30KKworI2lmZGVmIE1PRFVMRQorCitNT0RVTEVfQVVUSE9SKAorCSIoYykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorIkNvbXByZXNzaW9uIHJvdXRpbmVzIGZvciB6ZnRhcGUuIFVzZXMgdGhlIGx6cnczIGFsZ29yaXRobSBieSBSb3NzIFdpbGxpYW1zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIKKyAqLworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHpmdF9jb21wcmVzc29yX2luaXQoKTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjAwNzQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfWkZUQVBFX0NPTVBSRVNTX0gKKyNkZWZpbmUgX1pGVEFQRV9DT01QUkVTU19ICisvKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxMjozMiAkCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHpmdGFwZSdzCisgKiBidWlsdGluIGNvbXByZXNzaW9uIGNvZGUuCisgKgorICovCisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKKyNpbmNsdWRlICIuLi9jb21wcmVzc29yL2x6cnczLmgiCisKKy8qIENNUFJfV1JLX01FTV9TSVpFIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiB3cmtfbWVtICovCisvKiBJIGdvdCB0aGVzZSBvdXQgb2YgbHpydzMuYyAqLworI2RlZmluZSBVKFgpICAgICAgICAgICAgKChfX3UzMikgWCkKKyNkZWZpbmUgU0laRV9QX0JZVEUgICAgIChVKHNpemVvZihfX3U4ICopKSkKKyNkZWZpbmUgQUxJR05NRU5UX0ZVREdFIChVKDE2KSkKKworI2RlZmluZSBDTVBSX1dSS19NRU1fU0laRSAoVSg0MDk2KSooU0laRV9QX0JZVEUpICsgQUxJR05NRU5UX0ZVREdFKQorCisvKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhlIHNpemUgb2YgdGhlICJjb21wcmVzc2VkIiBkYXRhIGNhbgorICogZXhjZWVkIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4gQXMgaXQgaXMgcXVpdGUgdXNlbGVzcyB0byBjb21wcmVzcworICogZGF0YSB0d2ljZSBpdCBpcyBzb21ldGltZXMgdGhlIGNhc2UgdGhhdCBpdCBpcyBtb3JlIGVmZmljaWVudCB0bworICogY29weSBhIGJsb2NrIG9mIGRhdGEgYnV0IHRvIGZlZWQgaXQgdG8gdGhlICJjb21wcmVzc2lvbiIKKyAqIGFsZ29yaXRobS4gSW4gdGhpcyBjYXNlIHRoZXJlIGFyZSBzb21lIGZsYWcgYnl0ZXMgb3IgdGhlIGxpa2UKKyAqIHByb2NlZGluZyB0aGUgImNvbXByZXNzZWQiIGRhdGEuICBUSEFUIE1VU1QgTk9UIEJFIFRIRSBDQVNFIGZvciB0aGUKKyAqIGFsZ29yaXRobSB3ZSB1c2UgZm9yIHRoaXMgZHJpdmVyLiBJbnN0ZWFkLCB0aGUgaGlnaCBiaXQgMTUgb2YKKyAqIGNvbXByZXNzZWRfc2l6ZToKKyAqCisgKiBjb21wcmVzc2VkX3NpemUgPSBmdGFwZV9jb21wcmVzcygpCisgKgorICogbXVzdCBiZSBzZXQgaW4gc3VjaCBhIGNhc2UuCisgKgorICogTmV2ZXJ0aGVsZXNzLCBpdCBtaWdodCBhbHNvIGJlIGFzIGZvciBsenJ3MyB0aGF0IHRoZXJlIGlzIGFuCisgKiAiaW50ZXJtZWRpYXRlIiBvdmVycnVuIHRoYXQgZXhjZWVkcyB0aGUgYW1vdW50IG9mIHRoZSBjb21wcmVzc2VkCisgKiBkYXRhIHRoYXQgaXMgYWN0dWFsbHkgcHJvZHVjZWQuIER1cmluZyB0aGUgYWxnb3JpdGhtIHdlIG5lZWQgaW4gdGhlCisgKiB3b3JzdCBjYXNlIE1BWF9DTVBfR1JPVVAgYnl0ZXMgbW9yZSB0aGFuIHRoZSBpbnB1dC1zaXplLgorICovCisjZGVmaW5lIE1BWF9DTVBfR1JPVVAgKDIrMTYqMikgLyogZnJvbSBsenJ3My5jICovCisKKyNkZWZpbmUgQ01QUl9PVkVSUlVOICAgICAgTUFYX0NNUF9HUk9VUCAvKiBkdXJpbmcgY29tcHJlc3Npb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgICAgIENNUFJfQlVGRkVSX1NJWkUgKE1BWF9CTE9DS19TSVpFICsgQ01QUl9PVkVSUlVOKQorCisvKiB0aGUgY29tcHJlc3Npb24gbWFwIHN0b3JlcyB0aGUgYnl0ZSBvZmZzZXQgY29tcHJlc3NlZCBibG9ja3Mgd2l0aGluCisgKiB0aGUgY3VycmVudCB2b2x1bWUgZm9yIGNhdHJpZGdlcyB3aXRoIGZvcm1hdCBjb2RlIDIsMyBhbmQgNQorICogKGFuZCBvbGQgdmVyc2lvbnMgb2YgemZ0YXBlKSBhbmQgdGhlIG9mZnNldCBtZWFzdXJlZCBpbiBraWxvYnl0ZXMgZm9yCisgKiBmb3JtYXQgY29kZSA0IGFuZCA2LiBUaGlzIGdpdmVzIHVzIGEgcG9zc2libGUgbWF4LiBzaXplIG9mIGEgCisgKiBjb21wcmVzc2VkIHZvbHVtZSBvZiAxMDI0KjRHSUcgd2hpY2ggc2hvdWxkIGJlIGVub3VnaC4KKyAqLwordHlwZWRlZiBfX3UzMiBDbXByTWFwOworCisvKiBnbG9iYWxzIAorICovCisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucworICovCisKKyNlbmRpZiAvKiBfWkZUQVBFX0NPTVBSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWJhYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXUtSnVzdHVzIEhlaW5lLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisjCisjICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9NYWtlZmlsZSx2ICQKKyMgJFJldmlzaW9uOiAxLjQgJAorIyAkRGF0ZTogMTk5Ny8xMC8wNyAwOToyNjowMiAkCisjCisjICAgICAgTWFrZWZpbGUgZm9yIHRoZSBsb3dsZXZlbCBwYXJ0IFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUKKyMgICAgICBkcml2ZXIgZm9yIExpbnV4LgorIworCitvYmotJChDT05GSUdfRlRBUEUpICs9IGZ0YXBlLm8KKworZnRhcGUtb2JqcyA6PSBmdGFwZS1pbml0Lm8gZmRjLWlvLm8gZmRjLWlzci5vIFwKKwkgICAgICBmdGFwZS1ic20ubyBmdGFwZS1jdGwubyBmdGFwZS1yZWFkLm8gZnRhcGUtcncubyBcCisJICAgICAgZnRhcGUtd3JpdGUubyBmdGFwZS1pby5vIGZ0YXBlLWNhbGlici5vIGZ0YXBlLWVjYy5vIGZjLTEwLm8gXAorCSAgICAgIGZ0YXBlLWJ1ZmZlci5vIGZ0YXBlLWZvcm1hdC5vIGZ0YXBlX3N5bXMubworCitpZmVxICgkKENPTkZJR19GVEFQRSkseSkKK2Z0YXBlLW9ianMgKz0gZnRhcGUtc2V0dXAubworZW5kaWYKKworaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKK2Z0YXBlLW9ianMgKz0gZnRhcGUtdHJhY2luZy5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19GVF9QUk9DX0ZTKSx5KQorZnRhcGUtb2JqcyArPSBmdGFwZS1wcm9jLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mYy0xMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzFjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqCisKKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk0IEpvbiBUb21icy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVGhlIGVudGlyZSBndXRzIG9mIHRoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiBieSBkb3NlbXUsIG1vZGlmaWVkIHRvCisgICByZWNvcmQgcmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgcG9ydHMgaW4gdGhlIDB4MTgwLTB4MTg4IGFkZHJlc3Mgc3BhY2UsCisgICB3aGlsZSBydW5uaW5nIHRoZSBDTVMgcHJvZ3JhbSBUQVBFLkVYRSBWMi4wLjUgc3VwcGxpZWQgd2l0aCB0aGUgZHJpdmUuCisKKyAgIE1vZGlmaWVkIHRvIHVzZSBhbiBhcnJheSBvZiBhZGRyZXNzZXMgYW5kIGdlbmVyYWxseSBjbGVhbmVkIHVwIChtYWRlCisgICBtdWNoIHNob3J0ZXIpIDQgSnVuZSA5NCwgZG9zZW11IGlzbid0IHRoYXQgZ29vZCBhdCB3cml0aW5nIHNob3J0IGNvZGUgaXQKKyAgIHdvdWxkIHNlZW0gOi0pLiBNYWRlIGluZGVwZW5kZW50IG9mIDB4MTgwLCBidXQgSSBkb3VidCBpdCB3aWxsIHdvcmsKKyAgIGF0IGFueSBvdGhlciBhZGRyZXNzLgorCisgICBNb2RpZmllZCBmb3IgZGlzdHJpYnV0aW9uIHdpdGggZnRhcGUgc291cmNlLiAyMSBKdW5lIDk0LCBTSkwuCisKKyAgIE1vZGlmaWNhdGlvbnMgb24gMjAgT2N0b2JlciA5NSwgYnkgRGFuaWVsIENvaGVuIChjYXRtYW5Ad3BpLmVkdSk6CisgICBNb2RpZmllZCB0byBzdXBwb3J0IGRpZmZlcmVudCBETUEsIElSUSwgYW5kIElPIFBvcnRzLiAgQm9ybGFuZCdzCisgICBUdXJibyBEZWJ1Z2dlciBpbiB2aXJ0dWFsIDgwODYgbW9kZSAoVEQzODYuRVhFIHdpdGggaGFyZHdhcmUgYnJlYWtwb2ludHMKKyAgIHByb3ZpZGVkIGJ5IHRoZSBUREgzODYuU1lTIERldmljZSBEcml2ZXIpIHdhcyB1c2VkIG9uIHRoZSBDTVMgcHJvZ3JhbQorICAgVEFQRSBWNC4wLjUuICBJIHNldCBicmVha3BvaW50cyBvbiBJL08gdG8gcG9ydHMgMHgxODAtMHgxODcuICBOb3RlIHRoYXQKKyAgIENNUydzIHByb2dyYW0gd2lsbCBub3Qgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZSB0aGUgdGFwZSBkcml2ZSBpZiB5b3Ugc2V0CisgICBicmVha3BvaW50cyBvbiBJTyBSZWFkcywgYnV0IHlvdSBjYW4gc2V0IHRoZW0gb24gSU8gV3JpdGVzIHdpdGhvdXQgcHJvYmxlbXMuCisgICBLbm93biBwcm9ibGVtczoKKyAgIC0gWW91IGNhbiBub3QgdXNlIERNQSBDaGFubmVscyA1IG9yIDcuCisKKyAgIE1vZGlmaWNhdGlvbiBvbiAyOSBKYW51YXJ5IDk2LCBieSBEYW5pZWwgQ29oZW4gKGNhdG1hbkB3cGkuZWR1KToKKyAgIE1vZGlmaWVkIHRvIG9ubHkgYWNjZXB0IElSUXMgMyAtIDcsIG9yIDkuICBTaW5jZSB3ZSBjYW4gb25seSBzZW5kIGEgMyBiaXQKKyAgIG51bWJlciByZXByZXNlbnRpbmcgdGhlIElSUSB0byB0aGUgY2FyZCwgc3BlY2lhbCBoYW5kbGluZyBpcyByZXF1aXJlZCB3aGVuCisgICBJUlEgOSBpcyBzZWxlY3RlZC4gIElSUSAyIGFuZCA5IGFyZSB0aGUgc2FtZSwgYW5kIHdlIHNob3VsZCByZXF1ZXN0IElSUSA5CisgICBmcm9tIHRoZSBrZXJuZWwgd2hpbGUgdGVsbGluZyB0aGUgY2FyZCB0byB1c2UgSVJRIDIuICBUaGFua3MgdG8gR3JlZworICAgQ3JpZGVyIChnY3JpZGVyQGljbG5ldC5vcmcpIGZvciBmaW5kaW5nIGFuZCBsb2NhdGluZyB0aGlzIGJ1ZywgYXMgd2VsbCBhcworICAgdGVzdGluZyB0aGUgcGF0Y2guCisKKyAgIE1vZGlmaWNhdGlvbiBvbiAxMSBEZWNlbWJlciA5NiwgYnkgQ2xhdXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSk6CisgICBNb2RpZmllZCBhIGxpdHRsZSB0byB1c2UgdmFyaWFobGUgZnRfZmRjX2Jhc2UsIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEgCisgICBpbnN0ZWFkIG9mIHByZXByb2Nlc3NvciBzeW1ib2xzLiBUaHVzIHdlIGNhbiBjb21waWxlIHRoaXMgaW50byB0aGUgbW9kdWxlCisgICBvciBrZXJuZWwgYW5kIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBvcHRpb25zIGFzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA0ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciB0aGUgQ01TIEZDLTEwL0ZDLTIwIGNhcmQuCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZjLTEwLmgiCisKK3N0YXRpYyBfX3UxNiBpbmJzX21hZ2ljW10gPSB7CisJMHgzLCAweDMsIDB4MCwgMHg0LCAweDcsIDB4MiwgMHg1LCAweDMsIDB4MSwgMHg0LAorCTB4MywgMHg1LCAweDIsIDB4MCwgMHgzLCAweDcsIDB4NCwgMHgyLAorCTB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3Cit9OworCitzdGF0aWMgX191MTYgZmMxMF9wb3J0c1tdID0geworCTB4MTgwLCAweDIxMCwgMHgyQTAsIDB4MzAwLCAweDMzMCwgMHgzNDAsIDB4MzcwCit9OworCitpbnQgZmMxMF9lbmFibGUodm9pZCkKK3sKKwlpbnQgaTsKKwlfX3U4IGNhcmRDb25maWcgPSAweDAwOworCV9fdTggeDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworLyogIFRoaXMgY29kZSB3aWxsIG9ubHkgd29yayBpZiB0aGUgRkMtMTAgKG9yIEZDLTIwKSBpcyBzZXQgdG8KKyAqICB1c2UgRE1BIGNoYW5uZWxzIDEsIDIsIG9yIDMuICBETUEgY2hhbm5lbHMgNSBhbmQgNyBzZWVtIHRvIGJlIAorICogIGluaXRpYWxpemVkIGJ5IHRoZSBzYW1lIGNvbW1hbmQgYXMgY2hhbm5lbHMgMSBhbmQgMywgcmVzcGVjdGl2ZWx5LgorICovCisJaWYgKGZ0X2ZkY19kbWEgPiAzKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAorIkVycm9yOiBUaGUgRkMtMTAvMjAgbXVzdCBiZSBzZXQgdG8gdXNlIERNQSBjaGFubmVscyAxLCAyLCBvciAzISIpOworCX0KKy8qICBPbmx5IGFsbG93IHRoZSBGQy0xMC8yMCB0byB1c2UgSVJRIDMtNywgb3IgOS4gIE5vdGUgdGhhdCBDTVMncyBwcm9ncmFtCisgKiAgb25seSBhY2NlcHRzIElSUSdzIDItNywgYnV0IGluIGxpbnV4LCBJUlEgMiBpcyB0aGUgc2FtZSBhcyBJUlEgOS4KKyAqLworCWlmIChmdF9mZGNfaXJxIDwgMyB8fCBmdF9mZGNfaXJxID09IDggfHwgZnRfZmRjX2lycSA+IDkpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9lcnIsIAorIkVycm9yOiBUaGUgRkMtMTAvMjAgbXVzdCBiZSBzZXQgdG8gdXNlIElSUSBsZXZlbHMgMyAtIDcsIG9yIDkhXG4iCitLRVJOX0lORk8gIk5vdGU6IElSUSA5IGlzIHRoZSBzYW1lIGFzIElSUSAyIik7CisJfQorCS8qICBDbGVhciBzdGF0ZSBtYWNoaW5lID8/PworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhpbmJzX21hZ2ljKTsgaSsrKSB7CisJCWluYihmdF9mZGNfYmFzZSArIGluYnNfbWFnaWNbaV0pOworCX0KKwlvdXRiKDB4MCwgZnRfZmRjX2Jhc2UpOworCisJeCA9IGluYihmdF9mZGNfYmFzZSk7CisJaWYgKHggPT0gMHgxMyB8fCB4ID09IDB4OTMpIHsKKwkJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQkJaWYgKGluYihmdF9mZGNfYmFzZSArIGkpICE9IHgpIHsKKwkJCQlUUkFDRV9FWElUIDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRV9FWElUIDA7CisJfQorCisJb3V0YigweDgsIGZ0X2ZkY19iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKGluYihmdF9mZGNfYmFzZSArIGkpICE9IDB4MCkgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJfQorCW91dGIoMHgxMCwgZnRfZmRjX2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoaW5iKGZ0X2ZkY19iYXNlICsgaSkgIT0gMHhmZikgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJfQorCisJLyogIE9rYXksIHdlIGZvdW5kIGEgRkMtMTAgY2FyZCAhID8/PworCSAqLworCW91dGIoMHgwLCBmZGMuY2NyKTsKKworCS8qICBDbGVhciBzdGF0ZSBtYWNoaW5lIGFnYWluID8/PworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhpbmJzX21hZ2ljKTsgaSsrKSB7CisJCWluYihmdF9mZGNfYmFzZSArIGluYnNfbWFnaWNbaV0pOworCX0KKwkvKiBTZW5kIGlvIHBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVRFTVMoZmMxMF9wb3J0cyk7IGkrKykKKwkJaWYgKGZ0X2ZkY19iYXNlID09IGZjMTBfcG9ydHNbaV0pCisJCQljYXJkQ29uZmlnID0gaSArIDE7CisJaWYgKGNhcmRDb25maWcgPT0gMCkgeworCQlUUkFDRV9FWElUIDA7CS8qIEludmFsaWQgSS9PIFBvcnQgKi8KKwl9CisJLyogYW5kIElSUSAtIElmIHVzaW5nIElSUSA5LCB0ZWxsIHRoZSBGQyBjYXJkIGl0IGlzIGFjdHVhbGx5IElSUSAyICovCisJaWYgKGZ0X2ZkY19pcnEgIT0gOSkKKwkJY2FyZENvbmZpZyB8PSBmdF9mZGNfaXJxIDw8IDM7CisJZWxzZQorCQljYXJkQ29uZmlnIHw9IDIgPDwgMzsKKworCS8qIGFuZCBmaW5hbGx5IERNQSBDaGFubmVsICovCisJY2FyZENvbmZpZyB8PSBmdF9mZGNfZG1hIDw8IDY7CisJb3V0YihjYXJkQ29uZmlnLCBmdF9mZGNfYmFzZSk7CS8qIERNQSBbMiBiaXRzXS9JUlEgWzMgYml0c10vQkFTRSBbMyBiaXRzXSAqLworCisJLyogIEVuYWJsZSBGQy0xMCA/Pz8KKwkgKi8KKwlvdXRiKDAsIGZkYy5jY3IpOworCW91dGIoMCwgZmRjLmRvcjIpOworCW91dGIoRkRDX0RNQV9NT0RFIC8qIDggKi8sIGZkYy5kb3IpOworCW91dGIoRkRDX0RNQV9NT0RFIC8qIDggKi8sIGZkYy5kb3IpOworCW91dGIoMSwgZmRjLmRvcjIpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKgorCSAqIGNIOiB3aHkgdGhlIGhlbGwgc2hvdWxkIHRoaXMgYmUgbmVjZXNzYXJ5PyBUaGlzIGlzIGRvbmUgCisJICogICAgIGJ5IGZkY19yZXNldCgpISEhCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgSW5pdGlhbGl6ZSBmZGMsIHNlbGVjdCBkcml2ZSBCOgorCSAqLworCW91dGIoRkRDX0RNQV9NT0RFLCBmZGMuZG9yKTsJLyogYXNzZXJ0IHJlc2V0LCBkbWEgJiBpcnEgZW5hYmxlZCAqLworCS8qICAgICAgIDB4MDggICAgKi8KKwlvdXRiKEZEQ19ETUFfTU9ERXxGRENfUkVTRVRfTk9ULCBmZGMuZG9yKTsJLyogcmVsZWFzZSByZXNldCAqLworCS8qICAgICAgIDB4MDggICAgfCAgIDB4MDQgICA9IDB4MGMgKi8KKwlvdXRiKEZEQ19ETUFfTU9ERXxGRENfUkVTRVRfTk9UfEZEQ19NT1RPUl8xfEZUQVBFX1NFTF9CLCBmZGMuZG9yKTsKKwkvKiAgICAgICAweDA4ICAgIHwgICAweDA0ICAgICAgfCAgMHgyMCAgICAgfCAgMHgwMSAgPSAweDJkICovICAgIAorCS8qIHNlbGVjdCBkcml2ZSAxICovIC8qIHdoeSBub3QgZHJpdmUgMCA/Pz8/ICovCisJVFJBQ0VfRVhJVCAoeCA9PSAweDkzKSA/IDIgOiAxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTdiODhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfRkNfMTBfSAorI2RlZmluZSBfRkNfMTBfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3Zlbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzA5LzE5IDA5OjA1OjIyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIEZDLTEwIGNvZGUKKyAqICAgICAgb2YgdGhlIFFJQy00MC84MCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKy8qCisgKiAgICAgIGZjLTEwLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworCisvKgorICogICAgICBmYy0xMC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGludCBmYzEwX2VuYWJsZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNGEyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYwpAQCAtMCwwICsxLDEzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYyx2ICQKKyAqICRSZXZpc2lvbjogMS43LjQuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNiAxNDo0ODoxNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxvdy1sZXZlbCBmbG9wcHkgZGlzayBpbnRlcmZhY2UgY29kZQorICogICAgICBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yCisgKiAgICAgIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19GVF8qICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlzci5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mYy0xMC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGZ0YXBlX21vdG9yOwordm9sYXRpbGUgaW50IGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSAtMTsKK3ZvbGF0aWxlIGZkY19tb2RlX2VudW0gZmRjX21vZGUgPSBmZGNfaWRsZTsKK2ZkY19jb25maWdfaW5mbyBmZGM7CitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmdGFwZV93YWl0X2ludHIpOworCit1bnNpZ25lZCBpbnQgZnRfZmRjX2Jhc2UgICAgICAgPSBDT05GSUdfRlRfRkRDX0JBU0U7Cit1bnNpZ25lZCBpbnQgZnRfZmRjX2lycSAgICAgICAgPSBDT05GSUdfRlRfRkRDX0lSUTsKK3Vuc2lnbmVkIGludCBmdF9mZGNfZG1hICAgICAgICA9IENPTkZJR19GVF9GRENfRE1BOwordW5zaWduZWQgaW50IGZ0X2ZkY190aHJlc2hvbGQgID0gQ09ORklHX0ZUX0ZEQ19USFI7ICAvKiBieXRlcyAqLwordW5zaWduZWQgaW50IGZ0X2ZkY19yYXRlX2xpbWl0ID0gQ09ORklHX0ZUX0ZEQ19NQVhfUkFURTsgLyogYml0cy9zZWMgKi8KK2ludCBmdF9wcm9iZV9mYzEwICAgICAgICA9IENPTkZJR19GVF9QUk9CRV9GQzEwOworaW50IGZ0X21hY2gyICAgICAgICAgICAgID0gQ09ORklHX0ZUX01BQ0gyOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBzcGlubG9ja190IGZkY19pb19sb2NrOyAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmRjX2NhbGlicl9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmRjX2NhbGlicl90aW1lOworc3RhdGljIGludCBmZGNfc3RhdHVzOwordm9sYXRpbGUgX191OCBmZGNfaGVhZDsJCS8qIEZEQyBoZWFkIGZyb20gc2VjdG9yIGlkICovCit2b2xhdGlsZSBfX3U4IGZkY19jeWw7CQkvKiBGREMgdHJhY2sgZnJvbSBzZWN0b3IgaWQgKi8KK3ZvbGF0aWxlIF9fdTggZmRjX3NlY3Q7CQkvKiBGREMgc2VjdG9yIGZyb20gc2VjdG9yIGlkICovCitzdGF0aWMgaW50IGZkY19kYXRhX3JhdGUgPSA1MDA7CS8qIGRhdGEgcmF0ZSAoS2JwcykgKi8KK3N0YXRpYyBpbnQgZmRjX3JhdGVfY29kZTsJLyogZGF0YSByYXRlIGNvZGUgKDAgPT0gNTAwIEticHMpICovCitzdGF0aWMgaW50IGZkY19zZWVrX3JhdGUgPSAyOwkvKiBzdGVwIHJhdGUgKG1zZWMpICovCitzdGF0aWMgdm9pZCAoKmRvX2Z0YXBlKSAodm9pZCk7CitzdGF0aWMgaW50IGZkY19maWZvX3N0YXRlOwkvKiBvcmlnaW5hbCBmaWZvIHNldHRpbmcgLSBmaWZvIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgZmRjX2ZpZm9fdGhyOwkvKiBvcmlnaW5hbCBmaWZvIHNldHRpbmcgLSB0aHJlc2hvbGQgKi8KK3N0YXRpYyBpbnQgZmRjX2xvY2tfc3RhdGU7CS8qIG9yaWdpbmFsIGxvY2sgc2V0dGluZyAtIGxvY2tlZCAqLworc3RhdGljIGludCBmZGNfZmlmb19sb2NrZWQ7CS8qIGhhcyBmaWZvICYmIGxvY2sgc2V0ID8gKi8KK3N0YXRpYyBfX3U4IGZkY19wcmVjb21wOwkvKiBkZWZhdWx0IHByZWNvbXAuIHZhbHVlIChuc2VjKSAqLworc3RhdGljIF9fdTggZmRjX3ByZWNfY29kZTsJLyogZmRjIHByZWNvbXAuIHNlbGVjdCBjb2RlICovCisKK3N0YXRpYyBjaGFyIGZ0YXBlX2lkW10gPSAiZnRhcGUiOyAgLyogdXNlZCBieSByZXF1ZXN0IGlycSBhbmQgZnJlZSBpcnEgKi8KKworc3RhdGljIGludCBmZGNfc2V0X3NlZWtfcmF0ZShpbnQgc2Vla19yYXRlKTsKKwordm9pZCBmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cyhpbnQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWlmIChjb3VudCA9PSAwKSB7CisJCWZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHMgPSAwOworCX0gZWxzZSB7CisJCWZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHMgKz0gY291bnQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Cit9CisKKy8qICBXYWl0IGR1cmluZyBhIHRpbWVvdXQgcGVyaW9kIGZvciBhIGdpdmVuIEZEQyBzdGF0dXMuCisgKiAgSWYgdXNlY3MgPT0gMCB0aGVuIGp1c3QgdGVzdCBzdGF0dXMsIGVsc2Ugd2FpdCBhdCBsZWFzdCBmb3IgdXNlY3MuCisgKiAgUmV0dXJucyAtRVRJTUUgb24gdGltZW91dC4gRnVuY3Rpb24gbXVzdCBiZSBjYWxpYnJhdGVkIGZpcnN0ICEKKyAqLworc3RhdGljIGludCBmZGNfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MsIF9fdTggbWFzaywgX191OCBzdGF0ZSkKK3sKKwlpbnQgY291bnRfMSA9IChmZGNfY2FsaWJyX2NvdW50ICogdXNlY3MgKworICAgICAgICAgICAgICAgICAgICAgICBmZGNfY2FsaWJyX2NvdW50IC0gMSkgLyBmZGNfY2FsaWJyX3RpbWU7CisKKwlkbyB7CisJCWZkY19zdGF0dXMgPSBpbmJfcChmZGMubXNyKTsKKwkJaWYgKChmZGNfc3RhdHVzICYgbWFzaykgPT0gc3RhdGUpIHsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAoY291bnRfMS0tID49IDApOworCXJldHVybiAtRVRJTUU7Cit9CisKK2ludCBmZGNfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJcmV0dXJuIGZkY193YWl0KHVzZWNzLCBGRENfREFUQV9SRUFEWSB8IEZEQ19CVVNZLCBGRENfREFUQV9SRUFEWSk7Cit9CisKKy8qIFdoeSBjYW4ndCB3ZSBqdXN0IHVzZSB1ZGVsYXkoKT8KKyAqLworc3RhdGljIHZvaWQgZmRjX3VzZWNfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJZmRjX3dhaXQodXNlY3MsIDAsIDEpOwkvKiB3aWxsIGFsd2F5cyB0aW1lb3V0ICEgKi8KK30KKworc3RhdGljIGludCBmZGNfcmVhZHlfb3V0X3dhaXQodW5zaWduZWQgaW50IHVzZWNzKQoreworCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogd2FpdCBmb3IgdmFsaWQgUlFNIHN0YXR1cyAqLworCXJldHVybiBmZGNfd2FpdCh1c2VjcywgRkRDX0RBVEFfT1VUX1JFQURZLCBGRENfREFUQV9PVVRfUkVBRFkpOworfQorCit2b2lkIGZkY193YWl0X2NhbGlicmF0ZSh2b2lkKQoreworCWZ0YXBlX2NhbGlicmF0ZSgiZmRjX3dhaXQiLAorCQkJZmRjX3VzZWNfd2FpdCwgJmZkY19jYWxpYnJfY291bnQsICZmZGNfY2FsaWJyX3RpbWUpOyAKK30KKworLyogIFdhaXQgZm9yIGEgKHNob3J0KSB3aGlsZSBmb3IgdGhlIEZEQyB0byBiZWNvbWUgcmVhZHkKKyAqICBhbmQgdHJhbnNmZXIgdGhlIG5leHQgY29tbWFuZCBieXRlLgorICogIFJldHVybiAtRVRJTUUgb24gdGltZW91dCBvbiBnZXR0aW5nIHJlYWR5IChkZXBlbmRzIG9uIGhhcmR3YXJlISkuCisgKi8KK3N0YXRpYyBpbnQgZmRjX3dyaXRlKGNvbnN0IF9fdTggZGF0YSkKK3sKKwlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KKwlpZiAoZmRjX3dhaXQoMTUwLCBGRENfREFUQV9SRUFEWV9NQVNLLCBGRENfREFUQV9JTl9SRUFEWSkgPCAwKSB7CisJCXJldHVybiAtRVRJTUU7CisJfSBlbHNlIHsKKwkJb3V0YihkYXRhLCBmZGMuZmlmbyk7CisJCXJldHVybiAwOworCX0KK30KKworLyogIFdhaXQgZm9yIGEgKHNob3J0KSB3aGlsZSBmb3IgdGhlIEZEQyB0byBiZWNvbWUgcmVhZHkKKyAqICBhbmQgdHJhbnNmZXIgdGhlIG5leHQgcmVzdWx0IGJ5dGUuCisgKiAgUmV0dXJuIC1FVElNRSBpZiB0aW1lb3V0IG9uIGdldHRpbmcgcmVhZHkgKGRlcGVuZHMgb24gaGFyZHdhcmUhKS4KKyAqLworc3RhdGljIGludCBmZGNfcmVhZChfX3U4ICogZGF0YSkKK3sKKwlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KKwlpZiAoZmRjX3dhaXQoMTUwLCBGRENfREFUQV9SRUFEWV9NQVNLLCBGRENfREFUQV9PVVRfUkVBRFkpIDwgMCkgeworCQlyZXR1cm4gLUVUSU1FOworCX0gZWxzZSB7CisJCSpkYXRhID0gaW5iKGZkYy5maWZvKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiAgT3V0cHV0IGEgY21kX2xlbiBsb25nIGNvbW1hbmQgc3RyaW5nIHRvIHRoZSBGREMuCisgKiAgVGhlIEZEQyBzaG91bGQgYmUgcmVhZHkgdG8gcmVjZWl2ZSBhIG5ldyBjb21tYW5kIG9yCisgKiAgYW4gZXJyb3IgKEVCVVNZIG9yIEVUSU1FKSB3aWxsIG9jY3VyLgorICovCitpbnQgZmRjX2NvbW1hbmQoY29uc3QgX191OCAqIGNtZF9kYXRhLCBpbnQgY21kX2xlbikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IGNtZF9sZW47CisJaW50IHJldHJ5ID0gMDsKKyNpZmRlZiBURVNUSU5HCisJc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X3RpbWU7CisJdW5zaWduZWQgaW50IHRpbWU7CisjZW5kaWYKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJLyogWWVzLCBJIGtub3csIHRvbyBtdWNoIGNvbW1lbnRzIGluc2lkZSB0aGlzIGZ1bmN0aW9uCisJCSAqIC4uLgorCQkgKiAKKwkJICogWWV0IGFub3RoZXIgYnVnIGluIHRoZSBvcmlnaW5hbCBkcml2ZXIuIEFsbCB0aGF0CisJCSAqIGhhdm9jIGlzIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBpc3IoKSBzZW5kcworCQkgKiBpdHNlbGYgYSBjb21tYW5kIHRvIHRoZSBmbG9wcHkgdGFwZSBkcml2ZXIgKHBhdXNlLAorCQkgKiBtaWNybyBzdGVwIHBhdXNlKS4gIE5vdywgdGhlIHByb2JsZW0gaXMgdGhhdAorCQkgKiBjb21tYW5kcyBhcmUgdHJhbnNtaXR0ZWQgdmlhIHRoZSBmZGNfc2VlaworCQkgKiBjb21tYW5kLiBCdXQ6IHRoZSBmZGMgcGVyZm9ybXMgc2Vla3MgaW4gdGhlCisJCSAqIGJhY2tncm91bmQgaS5lLiBpdCBkb2Vzbid0IHNpZ25hbCBidXN5IHdoaWxlCisJCSAqIHNlbmRpbmcgdGhlIHN0ZXAgcHVsc2VzIHRvIHRoZSBkcml2ZS4gVGhlcmVmb3JlIHRoZQorCQkgKiBub24taW50ZXJydXB0IGxldmVsIGRyaXZlciBoYXMgbm8gY2hhbmNlIHRvIHRlbGwKKwkJICogd2hldGhlciB0aGUgaXNyKCkganVzdCBoYXMgaXNzdWVkIGEgc2Vlay4gVGhlcmVmb3JlCisJCSAqIHdlIEhBVkUgVE8gaGF2ZSBhIGxvb2sgYXQgdGhlIGZ0X2hpZGVfaW50ZXJydXB0CisJCSAqIGZsYWc6IGl0IHNpZ25hbHMgdGhlIG5vbi1pbnRlcnJ1cHQgbGV2ZWwgcGFydCBvZgorCQkgKiB0aGUgZHJpdmVyIHRoYXQgaXQgaGFzIHRvIHdhaXQgZm9yIHRoZSBmZGMgdW50aWwgaXQKKwkJICogaGFzIGNvbXBsZXRldCBzZWVraW5nLgorCQkgKgorCQkgKiBUSElTIFdBUyBQUkVTVU1BQkxZIFRIRSBSRUFTT04gRk9SIEFMTCBUSEFUCisJCSAqICJmZGNfcmVhZCB0aW1lb3V0IiBlcnJvcnMsIEkgSE9QRSA6LSkKKwkJICovCisJCWlmIChmdF9oaWRlX2ludGVycnVwdCkgeworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlUUkFDRShmdF90X2luZm8sCisJCQkgICAgICAiV2FpdGluZyBmb3IgdGhlIGlzcigpIGNvbXBsZXRpbmcgZmRjX3NlZWsoKSIpOworCQkJaWYgKGZkY19pbnRlcnJ1cHRfd2FpdCgyICogRlRfU0VDT05EKSA8IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCSAgICAgICJXYXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGlzcigpIHNlZWsgdG8gY29tcGxldGUiKTsKKwkJCX0KKwkJCWlmIChmdF9oaWRlX2ludGVycnVwdCB8fCAhZnRfc2Vla19jb21wbGV0ZWQpIHsKKwkJCQkvKiBUaGVyZSBjYW5ub3QgYmUgYW5vdGhlcgorCQkJCSAqIGludGVycnVwdC4gVGhlIGlzcigpIG9ubHkgc3RvcHMKKwkJCQkgKiB0aGUgdGFwZSBhbmQgdGhlIG5leHQgaW50ZXJydXB0CisJCQkJICogd29uJ3QgY29tZSB1bnRpbCB3ZSBoYXZlIHNlbmQgb3VyCisJCQkJICogY29tbWFuZCB0byB0aGUgZHJpdmUuCisJCQkJICovCisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsCisJCQkJCSAgICAiQlVHPyBpc3IoKSBpcyBzdGlsbCBzZWVraW5nP1xuIgorCQkJCQkgICAgS0VSTl9JTkZPICJoaWRlOiAlZFxuIgorCQkJCQkgICAgS0VSTl9JTkZPICJzZWVrOiAlZCIsCisJCQkJCSAgICBmdF9oaWRlX2ludGVycnVwdCwKKwkJCQkJICAgIGZ0X3NlZWtfY29tcGxldGVkKTsKKworCQkJfQorCQkJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwkJfQorCWZkY19zdGF0dXMgPSBpbmIoZmRjLm1zcik7CisJaWYgKChmZGNfc3RhdHVzICYgRkRDX0RBVEFfUkVBRFlfTUFTSykgIT0gRkRDX0RBVEFfSU5fUkVBRFkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwkJVFJBQ0VfQUJPUlQoLUVCVVNZLCBmdF90X2VyciwgImZkYyBub3QgcmVhZHkiKTsKKwl9IAorCWZkY19tb2RlID0gKmNtZF9kYXRhOwkvKiB1c2VkIGJ5IGlzciAqLworI2lmZGVmIFRFU1RJTkcKKwlpZiAoZmRjX21vZGUgPT0gRkRDX1NFRUspIHsKKwkJdGltZSA9IGZ0YXBlX3RpbWVkaWZmKGxhc3RfdGltZSwgZnRhcGVfdGltZXN0YW1wKCkpOworCQlpZiAodGltZSA8IDYwMDApIHsKKwlUUkFDRShmdF90X2J1ZywiV2FybmluZzogc2hvcnQgdGltZW91dCBiZXR3ZWVuIHNlZWsgY29tbWFuZHM6ICVkIiwKKwkgICAgICB0aW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJLyogc2hvdWxkbid0IGJlIGNsZWFyZWQgaWYgY2FsbGVkIGZyb20gaXNyCisJCSAqLworCQlmdF9pbnRlcnJ1cHRfc2VlbiA9IDA7CisJfQorCXdoaWxlIChjb3VudCkgeworCQlyZXN1bHQgPSBmZGNfd3JpdGUoKmNtZF9kYXRhKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkJCSAgICAgICJmZGNfbW9kZSA9ICUwMngsIHN0YXR1cyA9ICUwMnggYXQgaW5kZXggJWQiLAorCQkJICAgICAgKGludCkgZmRjX21vZGUsIChpbnQpIGZkY19zdGF0dXMsCisJCQkgICAgICBjbWRfbGVuIC0gY291bnQpOworCQkJaWYgKCsrcmV0cnkgPD0gMykgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwgImZkY193cml0ZSB0aW1lb3V0LCByZXRyeSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwgImZkY193cml0ZSB0aW1lb3V0LCBmYXRhbCIpOworCQkJCS8qIHJlY292ZXIgPz8/ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQktLWNvdW50OworCQkJKytjbWRfZGF0YTsKKwkJfQorICAgICAgICB9CisjaWZkZWYgVEVTVElORworCWlmIChmZGNfbW9kZSA9PSBGRENfU0VFSykgeworCQlsYXN0X3RpbWUgPSBmdGFwZV90aW1lc3RhbXAoKTsKKwl9CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgSW5wdXQgYSByZXNfbGVuIGxvbmcgcmVzdWx0IHN0cmluZyBmcm9tIHRoZSBGREMuCisgKiAgVGhlIEZEQyBzaG91bGQgYmUgcmVhZHkgdG8gc2VuZCB0aGUgcmVzdWx0IG9yIGFuIGVycm9yCisgKiAgKEVCVVNZIG9yIEVUSU1FKSB3aWxsIG9jY3VyLgorICovCitpbnQgZmRjX3Jlc3VsdChfX3U4ICogcmVzX2RhdGEsIGludCByZXNfbGVuKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gcmVzX2xlbjsKKwlpbnQgcmV0cnkgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwlmZGNfc3RhdHVzID0gaW5iKGZkYy5tc3IpOworCWlmICgoZmRjX3N0YXR1cyAmIEZEQ19EQVRBX1JFQURZX01BU0spICE9IEZEQ19EQVRBX09VVF9SRUFEWSkgeworCQlUUkFDRShmdF90X2VyciwgImZkYyBub3QgcmVhZHkiKTsKKwkJcmVzdWx0ID0gLUVCVVNZOworCX0gZWxzZSB3aGlsZSAoY291bnQpIHsKKwkJaWYgKCEoZmRjX3N0YXR1cyAmIEZEQ19CVVNZKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAicHJlbWF0dXJlIGVuZCBvZiByZXN1bHQgcGhhc2UiKTsKKwkJfQorCQlyZXN1bHQgPSBmZGNfcmVhZChyZXNfZGF0YSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlUUkFDRShmdF90X2ZkY19kbWEsCisJCQkgICAgICAiZmRjX21vZGUgPSAlMDJ4LCBzdGF0dXMgPSAlMDJ4IGF0IGluZGV4ICVkIiwKKwkJCSAgICAgIChpbnQpIGZkY19tb2RlLAorCQkJICAgICAgKGludCkgZmRjX3N0YXR1cywKKwkJCSAgICAgIHJlc19sZW4gLSBjb3VudCk7CisJCQlpZiAoKytyZXRyeSA8PSAzKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAiZmRjX3JlYWQgdGltZW91dCwgcmV0cnkiKTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmZGNfcmVhZCB0aW1lb3V0LCBmYXRhbCIpOworCQkJCS8qIHJlY292ZXIgPz8/ICovCisJCQkJYnJlYWs7CisJCQkJKytyZXRyeTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS0tY291bnQ7CisJCQkrK3Jlc19kYXRhOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiBhbGxvdyBGREMgdG8gbmVnYXRlIEJTWSAqLworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIEhhbmRsZSBjb21tYW5kIGFuZCByZXN1bHQgcGhhc2VzIGZvcgorICogICAgICBjb21tYW5kcyB3aXRob3V0IGRhdGEgcGhhc2UuCisgKi8KK3N0YXRpYyBpbnQgZmRjX2lzc3VlX2NvbW1hbmQoY29uc3QgX191OCAqIG91dF9kYXRhLCBpbnQgb3V0X2NvdW50LAorCQkgICAgICBfX3U4ICogaW5fZGF0YSwgaW50IGluX2NvdW50KQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAob3V0X2NvdW50ID4gMCkgeworCQlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChvdXRfZGF0YSwgb3V0X2NvdW50KSwpOworCX0KKwkvKiB3aWxsIHRha2UgMjQgLSAzMCB1c2VjIGZvciBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzIGFuZAorCSAqIGZkY19zZW5zZV9pbnRlcnJ1cHRfc3RhdHVzIGNvbW1hbmRzLgorCSAqICAgIDM1IGZhaWxzIHNvbWV0aW1lcyAoNS85LzkzIFNKTCkKKwkgKiBPbiBhIGxvYWRlZCBzeXN0ZW0gaXQgaW5jaWRlbnRhbGx5IHRha2VzIGxvbmdlciB0aGFuCisJICogdGhpcyBmb3IgdGhlIGZkYyB0byBnZXQgcmVhZHkgISA/Pz8/Pz8gV0hZID8/Pz8/PworCSAqIFNvIHVudGlsIHdlIGtub3cgd2hhdCdzIGdvaW5nIG9uIHVzZSBhIHZlcnkgbG9uZyB0aW1lb3V0LgorCSAqLworCVRSQUNFX0NBVENIKGZkY19yZWFkeV9vdXRfd2FpdCg1MDAgLyogdXNlYyAqLyksKTsKKwlpZiAoaW5fY291bnQgPiAwKSB7CisJCVRSQUNFX0NBVENIKGZkY19yZXN1bHQoaW5fZGF0YSwgaW5fY291bnQpLAorCQkJICAgIFRSQUNFKGZ0X3RfZXJyLCAicmVzdWx0IHBoYXNlIGFib3J0ZWQiKSk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBXYWl0IGZvciBGREMgaW50ZXJydXB0IHdpdGggdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKS4KKyAqICAgICAgU2lnbmFscyBhcmUgYmxvY2tlZCBzbyB0aGUgd2FpdCB3aWxsIG5vdCBiZSBhYm9ydGVkLgorICogICAgICBOb3RlOiBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCAhICgyMy8wNS85MyBTSkwpCisgKi8KK2ludCBmZGNfaW50ZXJydXB0X3dhaXQodW5zaWduZWQgaW50IHRpbWUpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsJCisJc3RhdGljIGludCByZXNldHRpbmc7CisJbG9uZyB0aW1lb3V0OworCisJVFJBQ0VfRlVOKGZ0X3RfZmRjX2RtYSk7CisKKyAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJlcnJvcjogbmVzdGVkIGNhbGwiKTsKKwl9CisJLyogdGltZW91dCB0aW1lIHdpbGwgYmUgdXAgdG8gVVNQVCBtaWNyb3NlY29uZHMgdG9vIGxvbmcgISAqLworCXRpbWVvdXQgPSAoMTAwMCAqIHRpbWUgKyBGVF9VU1BUIC0gMSkgLyBGVF9VU1BUOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJmZ0YXBlX3dhaXRfaW50ciwgJndhaXQpOworCXdoaWxlICghZnRfaW50ZXJydXB0X3NlZW4gJiYgdGltZW91dCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgfQorCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZnRhcGVfd2FpdF9pbnRyLCAmd2FpdCk7CisJLyogIHRoZSBmb2xsb3dpbmcgSVMgbmVjZXNzYXJ5LiBUcnVlOiBhcyB3ZWxsCisJICogIHdha2VfdXBfaW50ZXJydXB0aWJsZSgpIGFzIHRoZSBzY2hlZHVsZSgpIHNldCBUQVNLX1JVTk5JTkcKKwkgKiAgd2hlbiB0aGV5IHdha2V1cCBhIHRhc2ssIEJVVDogaXQgbWF5IHZlcnkgd2VsbCBiZSB0aGF0CisJICogIGZ0X2ludGVycnVwdF9zZWVuIGlzIGFscmVhZHkgc2V0IHRvIDEgd2hlbiB3ZSBlbnRlciBoZXJlCisJICogIGluIHdoaWNoIGNhc2Ugc2NoZWR1bGUoKSBnZXRzIG5ldmVyIGNhbGxlZCwgYW5kCisJICogIFRBU0tfUlVOTklORyBuZXZlciBzZXQuIFRoaXMgaGFzIHRoZSBmdW5ueSBlZmZlY3QgdGhhdCB3ZQorCSAqICBleGVjdXRlIGFsbCB0aGUgY29kZSB1bnRpbCB3ZSBsZWF2ZSBrZXJuZWwgc3BhY2UsIGJ1dCB0aGVuCisJICogIHRoZSB0YXNrIGlzIHN0b3BwZWQgKGEgdGFzayBDQU5OT1QgYmUgcHJlZW1wdGVkIHdoaWxlIGluCisJICogIGtlcm5lbCBtb2RlLiBTZW5kaW5nIGEgcGFpciBvZiBTSUdTVE9QL1NJR0NPTlQgdG8gdGhlCisJICogIHRhc2tzIHdha2VzIGl0IHVwIGFnYWluLiBGdW5ueSEgOi0pCisJICovCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IAorCWlmIChmdF9pbnRlcnJ1cHRfc2VlbikgeyAvKiB3b2tlbiB1cCBieSBpbnRlcnJ1cHQgKi8KKwkJZnRfaW50ZXJydXB0X3NlZW4gPSAwOworCQlUUkFDRV9FWElUIDA7CisJfQorCS8qICBPcmlnaW5hbCBjb21tZW50OgorCSAqICBJbiBmaXJzdCBpbnN0YW5jZSwgbmV4dCBzdGF0ZW1lbnQgc2VlbXMgdW5uZWNlc3Nhcnkgc2luY2UKKwkgKiAgaXQgd2lsbCBiZSBjbGVhcmVkIGluIGZkY19jb21tYW5kLiBIb3dldmVyLCBhIHNtYWxsIHBhcnQgb2YKKwkgKiAgdGhlIHNvZnR3YXJlIHNlZW1zIHRvIHJlbHkgb24gdGhpcyBiZWluZyBjbGVhcmVkIGhlcmUKKwkgKiAgKGZ0YXBlX2Nsb3NlIG1pZ2h0IGZhaWwpIHNvIHN0aWNrIHRvIGl0IHVudGlsIHRoaW5ncyBnZXQgZml4ZWQgIQorCSAqLworCS8qICBNeSBkZWVwbHkgc291Z2h0IG9mIGtub3dsZWRnZToKKwkgKiAgQmVob2xkIE5PISBJdCBpcyBvYnZpb3VzLiBmZGNfcmVzZXQoKSBkb2Vzbid0IGNhbGwgZmRjX2NvbW1hbmQoKQorCSAqICBidXQgbmV2ZXJ0aGVsZXNzIHVzZXMgZmRjX2ludGVycnVwdF93YWl0KCkuIE9GIENPVVJTRSB0aGlzIG5lZWRzIHRvCisJICogIGJlIHJlc2V0IGhlcmUuCisJICovCisJZnRfaW50ZXJydXB0X3NlZW4gPSAwOwkvKiBjbGVhciBmb3IgbmV4dCBjYWxsICovCisJaWYgKCFyZXNldHRpbmcpIHsKKwkJcmVzZXR0aW5nID0gMTsJLyogYnJlYWsgaW5maW5pdGUgcmVjdXJzaW9uIGlmIHJlc2V0IGZhaWxzICovCisJCVRSQUNFKGZ0X3RfYW55LCAiY2xlYW51cCByZXNldCIpOworCQlmZGNfcmVzZXQoKTsKKwkJcmVzZXR0aW5nID0gMDsKKwl9CisJVFJBQ0VfRVhJVCAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpID8gLUVJTlRSIDogLUVUSU1FOworfQorCisvKiAgICAgIFN0YXJ0L3N0b3AgZHJpdmUgbW90b3IuIEVuYWJsZSBETUEgbW9kZS4KKyAqLwordm9pZCBmZGNfbW90b3IoaW50IG1vdG9yKQoreworCWludCB1bml0ID0gZnRfZHJpdmVfc2VsOworCWludCBkYXRhID0gdW5pdCB8IEZEQ19SRVNFVF9OT1QgfCBGRENfRE1BX01PREU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWZ0YXBlX21vdG9yID0gbW90b3I7CisJaWYgKGZ0YXBlX21vdG9yKSB7CisJCWRhdGEgfD0gRkRDX01PVE9SXzAgPDwgdW5pdDsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInR1cm5pbmcgbW90b3IgJWQgb24iLCB1bml0KTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAidHVybmluZyBtb3RvciAlZCBvZmYiLCB1bml0KTsKKwl9CisJaWYgKGZ0X21hY2gyKSB7CisJCW91dGJfcChkYXRhLCBmZGMuZG9yMik7CisJfSBlbHNlIHsKKwkJb3V0Yl9wKGRhdGEsIGZkYy5kb3IpOworCX0KKwlmdGFwZV9zbGVlcCgxMCAqIEZUX01JTExJU0VDT05EKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBmZGNfdXBkYXRlX2Rzcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X2Zsb3csICJyYXRlID0gJWQgS2JwcywgcHJlY29tcCA9ICVkIG5zIiwKKwkgICAgICBmZGNfZGF0YV9yYXRlLCBmZGNfcHJlY29tcCk7CisJaWYgKGZkYy50eXBlID49IGk4MjA3NykgeworCQlvdXRiX3AoKGZkY19yYXRlX2NvZGUgJiAweDAzKSB8IGZkY19wcmVjX2NvZGUsIGZkYy5kc3IpOworCX0gZWxzZSB7CisJCW91dGJfcChmZGNfcmF0ZV9jb2RlICYgMHgwMywgZmRjLmNjcik7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3ZvaWQgZmRjX3NldF93cml0ZV9wcmVjb21wKGludCBwcmVjb21wKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTmV3IHByZWNvbXA6ICVkIG5zZWMiLCBwcmVjb21wKTsKKwlmZGNfcHJlY29tcCA9IHByZWNvbXA7CisJLyogIHdyaXRlIHByZWNvbXBlbnNhdGlvbiBjYW4gYmUgc2V0IGluIG11bHRpcGxlcyBvZiA0MS42NyBuc2VjLgorCSAqICByb3VuZCB0aGUgcGFyYW1ldGVyIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIGFuZCBjb252ZXJ0IGl0CisJICogIGludG8gYSBmZGMgc2V0dGluZy4gTm90ZSB0aGF0IDAgbWVhbnMgZGVmYXVsdCB0byB0aGUgZmRjLAorCSAqICA3IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGF0LgorCSAqLworCWZkY19wcmVjX2NvZGUgPSAoKGZkY19wcmVjb21wICsgMjEpIC8gNDIpIDw8IDI7CisJaWYgKGZkY19wcmVjX2NvZGUgPT0gMCB8fCBmZGNfcHJlY19jb2RlID4gKDYgPDwgMikpIHsKKwkJZmRjX3ByZWNfY29kZSA9IDcgPDwgMjsKKwl9CisJZmRjX3VwZGF0ZV9kc3IoKTsKKwlUUkFDRV9FWElUOworfQorCisvKiAgUmVwcm9ncmFtIHRoZSA4MjA3OCByZWdpc3RlcnMgdG8gdXNlIERhdGEgUmF0ZSBUYWJsZSAxIG9uIGFsbCBkcml2ZXMuCisgKi8KK3N0YXRpYyB2b2lkIGZkY19zZXRfZHJpdmVfc3BlY3Modm9pZCkKK3sKKwlfX3U4IGNtZFtdID0geyBGRENfRFJJVkVfU1BFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMH07CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiU2V0dGluZyBvZiBkcml2ZSBzcGVjcyBjYWxsZWQiKTsKKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc4XzEpIHsKKwkJY21kWzFdID0gKDAgPDwgNSkgfCAoMiA8PCAyKTsKKwkJY21kWzJdID0gKDEgPDwgNSkgfCAoMiA8PCAyKTsKKwkJY21kWzNdID0gKDIgPDwgNSkgfCAoMiA8PCAyKTsKKwkJY21kWzRdID0gKDMgPDwgNSkgfCAoMiA8PCAyKTsKKwkJcmVzdWx0ID0gZmRjX2NvbW1hbmQoY21kLCBOUl9JVEVNUyhjbWQpKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiU2V0dGluZyBvZiBkcml2ZSBzcGVjcyBmYWlsZWQiKTsKKwkJfQorCX0KKwlUUkFDRV9FWElUOworfQorCisvKiBTZWxlY3QgY2xvY2sgZm9yIGZkYywgbXVzdCBjb3JyZXNwb25kIHdpdGggdGFwZSBkcml2ZSBzZXR0aW5nICEKKyAqIFRoaXMgYWxzbyBpbmZsdWVuY2VzIHRoZSBmZGMgdGltaW5nIHNvIHdlIG11c3QgYWRqdXN0IHNvbWUgdmFsdWVzLgorICovCitpbnQgZmRjX3NldF9kYXRhX3JhdGUoaW50IHJhdGUpCit7CisJaW50IGJhZF9yYXRlID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogU2VsZWN0IGNsb2NrIGZvciBmZGMsIG11c3QgY29ycmVzcG9uZCB3aXRoIHRhcGUgZHJpdmUgc2V0dGluZyAhCisJICogVGhpcyBhbHNvIGluZmx1ZW5jZXMgdGhlIGZkYyB0aW1pbmcgc28gd2UgbXVzdCBhZGp1c3Qgc29tZSB2YWx1ZXMuCisJICovCisJVFJBQ0UoZnRfdF9mZGNfZG1hLCAibmV3IHJhdGUgPSAlZCIsIHJhdGUpOworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMjUwOgorCQlmZGNfcmF0ZV9jb2RlID0gZmRjX2RhdGFfcmF0ZV8yNTA7CisJCWJyZWFrOworCWNhc2UgNTAwOgorCQlmZGNfcmF0ZV9jb2RlID0gZmRjX2RhdGFfcmF0ZV81MDA7CisJCWJyZWFrOworCWNhc2UgMTAwMDoKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3KSB7CisJCQliYWRfcmF0ZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzEwMDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyMDAwOgorCQlpZiAoZmRjLnR5cGUgPCBpODIwNzhfMSkgeworCQkJYmFkX3JhdGUgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQlmZGNfcmF0ZV9jb2RlID0gZmRjX2RhdGFfcmF0ZV8yMDAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJhZF9yYXRlID0gMTsKKyAgICAgICAgfQorCWlmIChiYWRfcmF0ZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLAorCQkJICAgIGZ0X3RfZmRjX2RtYSwgIiVkIGlzIG5vdCBhIHZhbGlkIGRhdGEgcmF0ZSIsIHJhdGUpOworCX0KKwlmZGNfZGF0YV9yYXRlID0gcmF0ZTsKKwlmZGNfdXBkYXRlX2RzcigpOworCWZkY19zZXRfc2Vla19yYXRlKGZkY19zZWVrX3JhdGUpOyAgLyogY2xvY2sgY2hhbmdlZCEgKi8KKwlmdGFwZV91ZGVsYXkoMTAwMCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAga2VlcCB0aGUgdW5pdCBzZWxlY3QgaWYga2VlcF9zZWxlY3QgaXMgIT0gMCwKKyAqLworc3RhdGljIHZvaWQgZmRjX2Rvcl9yZXNldChpbnQga2VlcF9zZWxlY3QpCit7CisJX191OCBmZGNfY3RsID0gZnRfZHJpdmVfc2VsOworCisJaWYgKGtlZXBfc2VsZWN0ICE9IDApIHsKKwkJZmRjX2N0bCB8PSBGRENfRE1BX01PREU7CisJCWlmIChmdGFwZV9tb3RvcikgeworCQkJZmRjX2N0bCB8PSBGRENfTU9UT1JfMCA8PCBmdF9kcml2ZV9zZWw7CisJCX0KKwl9CisJZnRhcGVfdWRlbGF5KDEwKTsgLyogPz8/IGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkgKi8KKwlpZiAoZnRfbWFjaDIpIHsKKwkJb3V0Yl9wKGZkY19jdGwgJiAweDBmLCBmZGMuZG9yKTsKKwkJb3V0Yl9wKGZkY19jdGwsIGZkYy5kb3IyKTsKKwl9IGVsc2UgeworCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcik7CisJfQorCWZkY191c2VjX3dhaXQoMTApOyAvKiBkZWxheSA+PSAxNCBmZGMgY2xvY2tzICovCisJaWYgKGtlZXBfc2VsZWN0ID09IDApIHsKKwkJZmRjX2N0bCA9IDA7CisJfQorCWZkY19jdGwgfD0gRkRDX1JFU0VUX05PVDsKKwlpZiAoZnRfbWFjaDIpIHsKKwkJb3V0Yl9wKGZkY19jdGwgJiAweDBmLCBmZGMuZG9yKTsKKwkJb3V0Yl9wKGZkY19jdGwsIGZkYy5kb3IyKTsKKwl9IGVsc2UgeworCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcik7CisJfQorfQorCisvKiAgICAgIFJlc2V0IHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyLiBMZWF2ZSB0aGUgZnRhcGVfdW5pdCBzZWxlY3RlZC4KKyAqLwordm9pZCBmZGNfcmVzZXQodm9pZCkKK3sKKwlpbnQgc3QwOworCWludCBpOworCWludCBkdW1teTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKworCWZkY19kb3JfcmVzZXQoMSk7IC8qIGtlZXAgdW5pdCBzZWxlY3RlZCAqLworCisJZmRjX21vZGUgPSBmZGNfaWRsZTsKKworCS8qICBtYXliZSB0aGUgY2xpKCkvc3RpKCkgcGFpciBpcyBub3QgbmVjZXNzYXJ5LCBCVVQ6CisJICogIHRoZSBmb2xsb3dpbmcgbGluZSBNVVNUIGJlIGhlcmUuIE90aGVyd2lzZSBmZGNfaW50ZXJydXB0X3dhaXQoKQorCSAqICB3b24ndCB3YWl0LiBOb3RlIHRoYXQgZmRjX3Jlc2V0KCkgaXMgY2FsbGVkIGZyb20gCisJICogIGZ0YXBlX2R1bWJfc3RvcCgpIHdoZW4gdGhlIGZkYyBpcyBidXN5IHRyYW5zZmVycmluZyBkYXRhLiBJbiB0aGlzCisJICogIGNhc2UgZmRjX2lzcigpIE1PU1QgUFJPQkFCTFkgc2V0cyBmdF9pbnRlcnJ1cHRfc2VlbiwgYW5kIHRyaWVzCisJICogIHRvIGdldCB0aGUgcmVzdWx0IGJ5dGVzIGZyb20gdGhlIGZkYyBldGMuIENMQVNILgorCSAqLworCWZ0X2ludGVycnVwdF9zZWVuID0gMDsKKwkKKwkvKiAgUHJvZ3JhbSBkYXRhIHJhdGUKKwkgKi8KKwlmZGNfdXBkYXRlX2RzcigpOyAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgZGF0YSByYXRlIGFuZCBwcmVjb21wICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCisgICAgICAgIC8qCisgICAgICAgICAqCVdhaXQgZm9yIGZpcnN0IHBvbGxpbmcgY3ljbGUgdG8gY29tcGxldGUKKwkgKi8KKwlpZiAoZmRjX2ludGVycnVwdF93YWl0KDEgKiBGVF9TRUNPTkQpIDwgMCkgeworCQlUUkFDRShmdF90X2VyciwgIm5vIGRyaXZlIHBvbGxpbmcgaW50ZXJydXB0ISIpOworCX0gZWxzZSB7CS8qIGNsZWFyIGFsbCBkaXNrLWNoYW5nZWQgc3RhdHVzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJaWYoZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoJnN0MCwgJmR1bW15KSAhPSAwKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJzZW5zZSBmYWlsZWQgZm9yICVkIiwgaSk7CisJCQl9CisJCQlpZiAoaSA9PSBmdF9kcml2ZV9zZWwpIHsKKwkJCQlmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gZHVtbXk7CisJCQl9CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRyaXZlIHBvbGxpbmcgY29tcGxldGVkIik7CisJfQorCS8qCisgICAgICAgICAqCVNQRUNJRlkgQ09NTUFORAorCSAqLworCWZkY19zZXRfc2Vla19yYXRlKGZkY19zZWVrX3JhdGUpOworCS8qCisJICoJRFJJVkUgU1BFQ0lGSUNBVElPTiBDT01NQU5EIChpZiBmZGMgdHlwZSBrbm93bikKKwkgKi8KKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc4XzEpIHsKKwkJZmRjX3NldF9kcml2ZV9zcGVjcygpOworCX0KKwlUUkFDRV9FWElUOworfQorCisjaWYgIWRlZmluZWQoQ0xLXzQ4TUhaKQorIyBkZWZpbmUgQ0xLXzQ4TUhaIDEKKyNlbmRpZgorCisvKiAgV2hlbiB3ZSdyZSBkb25lLCBwdXQgdGhlIGZkYyBpbnRvIHJlc2V0IG1vZGUgc28gdGhhdCB0aGUgcmVndWxhcgorICogIGZsb3BweSBkaXNrIGRyaXZlciB3aWxsIGZpZ3VyZSBvdXQgdGhhdCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kCisgKiAgaW5pdGlhbGl6ZSB0aGUgY29udHJvbGxlciB0aGUgd2F5IGl0IHdhbnRzLgorICovCit2b2lkIGZkY19kaXNhYmxlKHZvaWQpCit7CisJX191OCBjbWQxW10gPSB7RkRDX0NPTkZJR1VSRSwgMHgwMCwgMHgwMCwgMHgwMH07CisJX191OCBjbWQyW10gPSB7RkRDX0xPQ0t9OworCV9fdTggY21kM1tdID0ge0ZEQ19VTkxPQ0t9OworCV9fdTggc3RhdFsxXTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghZmRjX2ZpZm9fbG9ja2VkKSB7CisJCWZkY19yZXNldCgpOworCQlUUkFDRV9FWElUOworCX0KKwlpZiAoZmRjX2lzc3VlX2NvbW1hbmQoY21kMywgMSwgc3RhdCwgMSkgPCAwIHx8IHN0YXRbMF0gIT0gMHgwMCkgeworCQlmZGNfZG9yX3Jlc2V0KDApOworCQlUUkFDRV9BQk9SVCgvKiovLCBmdF90X2J1ZywgCisJCSJjb3VsZG4ndCB1bmxvY2sgZmlmbywgY29uZmlndXJhdGlvbiByZW1haW5zIGNoYW5nZWQiKTsKKwl9CisJZmRjX2ZpZm9fbG9ja2VkID0gMDsKKwlpZiAoQ0xLXzQ4TUhaICYmIGZkYy50eXBlID49IGk4MjA3OCkgeworCQljbWQxWzBdIHw9IEZEQ19DTEs0OF9CSVQ7CisJfQorCWNtZDFbMl0gPSAoKGZkY19maWZvX3N0YXRlKSA/IDAgOiAweDIwKSArIChmZGNfZmlmb190aHIgLSAxKTsKKwlpZiAoZmRjX2NvbW1hbmQoY21kMSwgTlJfSVRFTVMoY21kMSkpIDwgMCkgeworCQlmZGNfZG9yX3Jlc2V0KDApOworCQlUUkFDRV9BQk9SVCgvKiovLCBmdF90X2J1ZywKKwkJImNvdWxkbid0IHJlY29uZmlndXJlIGZpZm8gdG8gb2xkIHN0YXRlIik7CisJfQorCWlmIChmZGNfbG9ja19zdGF0ZSAmJgorCSAgICBmZGNfaXNzdWVfY29tbWFuZChjbWQyLCAxLCBzdGF0LCAxKSA8IDApIHsKKwkJZmRjX2Rvcl9yZXNldCgwKTsKKwkJVFJBQ0VfQUJPUlQoLyoqLywgZnRfdF9idWcsICJjb3VsZG4ndCBsb2NrIG9sZCBzdGF0ZSBhZ2FpbiIpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiZmlmbyByZXN0b3JlZDogJXNhYmxlZCwgdGhyLiAlZCwgJXNsb2NrZWQiLAorCSAgICAgIGZkY19maWZvX3N0YXRlID8gImVuIiA6ICJkaXMiLAorCSAgICAgIGZkY19maWZvX3RociwgKGZkY19sb2NrX3N0YXRlKSA/ICIiIDogIm5vdCAiKTsKKwlmZGNfZG9yX3Jlc2V0KDApOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qICAgICAgU3BlY2lmeSBGREMgc2Vlay1yYXRlIChtaWxsaXNlY29uZHMpCisgKi8KK3N0YXRpYyBpbnQgZmRjX3NldF9zZWVrX3JhdGUoaW50IHNlZWtfcmF0ZSkKK3sKKwkvKiBzZXQgc3RlcCByYXRlLCBkbWEgbW9kZSwgYW5kIG1pbmltYWwgaGVhZCBsb2FkIGFuZCB1bmxvYWQgdGltZXMKKwkgKi8KKwlfX3U4IGluWzNdID0geyBGRENfU1BFQ0lGWSwgMSwgKDEgPDwgMSl9OworIAorCWZkY19zZWVrX3JhdGUgPSBzZWVrX3JhdGU7CisJaW5bMV0gfD0gKDE2IC0gKGZkY19kYXRhX3JhdGUgKiBmZGNfc2Vla19yYXRlKSAvIDUwMCkgPDwgNDsKKworCXJldHVybiBmZGNfY29tbWFuZChpbiwgMyk7Cit9CisKKy8qICAgICAgU2Vuc2UgZHJpdmUgc3RhdHVzOiBnZXQgdW5pdCdzIGRyaXZlIHN0YXR1cyAoU1QzKQorICovCitpbnQgZmRjX3NlbnNlX2RyaXZlX3N0YXR1cyhpbnQgKnN0MykKK3sKKwlfX3U4IG91dFsyXTsKKwlfX3U4IGluWzFdOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlvdXRbMF0gPSBGRENfU0VOU0VEOworCW91dFsxXSA9IGZ0X2RyaXZlX3NlbDsKKwlUUkFDRV9DQVRDSChmZGNfaXNzdWVfY29tbWFuZChvdXQsIDIsIGluLCAxKSwpOworCSpzdDMgPSBpblswXTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgU2Vuc2UgSW50ZXJydXB0IFN0YXR1cyBjb21tYW5kOgorICogICAgICBzaG91bGQgYmUgaXNzdWVkIGF0IHRoZSBlbmQgb2YgZWFjaCBzZWVrLgorICogICAgICBnZXQgU1QwIGFuZCBjdXJyZW50IGN5bGluZGVyLgorICovCitpbnQgZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoaW50ICpzdDAsIGludCAqY3VycmVudF9jeWxpbmRlcikKK3sKKwlfX3U4IG91dFsxXTsKKwlfX3U4IGluWzJdOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlvdXRbMF0gPSBGRENfU0VOU0VJOworCVRSQUNFX0NBVENIKGZkY19pc3N1ZV9jb21tYW5kKG91dCwgMSwgaW4sIDIpLCk7CisJKnN0MCA9IGluWzBdOworCSpjdXJyZW50X2N5bGluZGVyID0gaW5bMV07CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIHN0ZXAgdG8gdHJhY2sKKyAqLworaW50IGZkY19zZWVrKGludCB0cmFjaykKK3sKKwlfX3U4IG91dFszXTsKKwlpbnQgc3QwLCBwY247CisjaWZkZWYgVEVTVElORworCXVuc2lnbmVkIGludCB0aW1lOworI2VuZGlmCisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCW91dFswXSA9IEZEQ19TRUVLOworCW91dFsxXSA9IGZ0X2RyaXZlX3NlbDsKKwlvdXRbMl0gPSB0cmFjazsKKyNpZmRlZiBURVNUSU5HCisJdGltZSA9IGZ0YXBlX3RpbWVzdGFtcCgpOworI2VuZGlmCisJLyogIFdlIHJlYWxseSBuZWVkIHRoaXMgY29tbWFuZCB0byB3b3JrICEKKwkgKi8KKwlmdF9zZWVrX2NvbXBsZXRlZCA9IDA7CisJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQob3V0LCAzKSwKKwkJICAgIGZkY19yZXNldCgpOworCQkgICAgVFJBQ0UoZnRfdF9ub2lzZSwgImRlc3RpbmF0aW9uIHdhczogJWQsIHJlc2V0dGluZyBGREMuLi4iLAorCQkJICB0cmFjaykpOworCS8qICAgIEhhbmRsZSBpbnRlcnJ1cHRzIHVudGlsIGZ0X3NlZWtfY29tcGxldGVkIG9yIHRpbWVvdXQuCisJICovCisJZm9yICg7OykgeworCQlUUkFDRV9DQVRDSChmZGNfaW50ZXJydXB0X3dhaXQoMiAqIEZUX1NFQ09ORCksKTsKKwkJaWYgKGZ0X3NlZWtfY29tcGxldGVkKSB7CisJCQlUUkFDRV9DQVRDSChmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cygmc3QwLCAmcGNuKSwpOworCQkJaWYgKChzdDAgJiBTVDBfU0VFS19FTkQpID09IDApIHsKKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCQkgICAgICAibm8gc2Vlay1lbmQgYWZ0ZXIgc2VlayBjb21wbGV0aW9uICE/PyIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisjaWZkZWYgVEVTVElORworCXRpbWUgPSBmdGFwZV90aW1lZGlmZih0aW1lLCBmdGFwZV90aW1lc3RhbXAoKSkgLyBhYnModHJhY2sgLSBmdGFwZV9jdXJyZW50X2N5bGluZGVyKTsKKwlpZiAoKHRpbWUgPCA5MDAgfHwgdGltZSA+IDMxMDApICYmIGFicyh0cmFjayAtIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIpID4gNSkgeworCQlUUkFDRShmdF90X3dhcm4sICJXcm9uZyBGREMgU1RFUCBpbnRlcnZhbDogJWQgdXNlY3MgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwgdHJhY2sgLSBmdGFwZV9jdXJyZW50X2N5bGluZGVyKTsKKwl9CisjZW5kaWYKKwkvKiAgICBWZXJpZnkgd2hldGhlciB3ZSBpc3N1ZWQgdGhlIHJpZ2h0IHRhcGUgY29tbWFuZC4KKwkgKi8KKwkvKiBWZXJpZnkgdGhhdCB3ZSBzZWVrIHRvIHRoZSBwcm9wZXIgdHJhY2suICovCisJaWYgKHBjbiAhPSB0cmFjaykgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImJhZCBzZWVrLi4iKTsKKwl9CisJZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IHRyYWNrOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBwZXJwZW5kX21vZGU7IC8qIHNldCBpZiBmZGMgaXMgaW4gcGVycGVuZGljdWxhciBtb2RlICovCisKK3N0YXRpYyBpbnQgcGVycGVuZF9vZmYodm9pZCkKK3sKKyAJX191OCBwZXJwZW5kW10gPSB7RkRDX1BFUlBFTkQsIDB4MDB9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJaWYgKHBlcnBlbmRfbW9kZSkgeworCQkvKiBUdXJuIG9mZiBwZXJwZW5kaWN1bGFyIG1vZGUgKi8KKwkJcGVycGVuZFsxXSA9IDB4ODA7CisJCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKHBlcnBlbmQsIDIpLAorCQkJICAgIFRSQUNFKGZ0X3RfZXJyLCJQZXJwZW5kaWN1bGFyIG1vZGUgZXhpdCBmYWlsZWQhIikpOworCQlwZXJwZW5kX21vZGUgPSAwOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3BlcnBlbmQoaW50IHNlZ21lbnRfaWQpCit7CisgCV9fdTggcGVycGVuZFtdID0ge0ZEQ19QRVJQRU5ELCAweDAwfTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogV2hlbiB3cml0aW5nIFFJQy0zMDIwIHRhcGVzLCB0dXJuIG9uIHBlcnBlbmRpY3VsYXIgbW9kZQorCSAqIGlmIHRhcGUgaXMgbW92aW5nIGluIGZvcndhcmQgZGlyZWN0aW9uIChldmVuIHRyYWNrcykuCisJICovCisJaWYgKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDMzAyMCAmJgorCSAgICAoKHNlZ21lbnRfaWQgLyBmdF9zZWdtZW50c19wZXJfdHJhY2spICYgMSkgPT0gMCkgeworLyogIEZJWE1FOiBzb21lIGk4MjA3NyBzZWVtIHRvIHN1cHBvcnQgcGVycGVuZGljdWxhciBtb2RlIGFzCisgKiAgd2VsbC4gCisgKi8KKyNpZiAwCisJCWlmIChmZGMudHlwZSA8IGk4MjA3N0FBKSB7fQorI2Vsc2UKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3ICYmIGZ0X2RhdGFfcmF0ZSA8IDEwMDApIHsKKyNlbmRpZgorCQkJLyogIGZkYyBkb2VzIG5vdCBzdXBwb3J0IHBlcnBlbmRpY3VsYXIgbW9kZTogY29tcGxhaW4gCisJCQkgKi8KKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCSAgICAiWW91ciBGREMgZG9lcyBub3Qgc3VwcG9ydCBRSUMtMzAyMC4iKTsKKwkJfQorCQlwZXJwZW5kWzFdID0gMHgwMyAvKiAweDgzICsgKDB4NCA8PCBmdF9kcml2ZV9zZWwpICovIDsKKwkJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQocGVycGVuZCwgMiksCisJCQkgICBUUkFDRShmdF90X2VyciwiUGVycGVuZGljdWxhciBtb2RlIGVudHJ5IGZhaWxlZCEiKSk7CisJCVRSQUNFKGZ0X3RfZmxvdywgIlBlcnBlbmRpY3VsYXIgbW9kZSBzZXQiKTsKKwkJcGVycGVuZF9tb2RlID0gMTsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRV9FWElUIHBlcnBlbmRfb2ZmKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZGNfc2V0dXBfZG1hKGNoYXIgbW9kZSwKKwkJCQkgdm9sYXRpbGUgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCS8qIFByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyLgorCSAqLworCWRpc2FibGVfZG1hKGZkYy5kbWEpOworCWNsZWFyX2RtYV9mZihmZGMuZG1hKTsKKwlzZXRfZG1hX21vZGUoZmRjLmRtYSwgbW9kZSk7CisJc2V0X2RtYV9hZGRyKGZkYy5kbWEsIHZpcnRfdG9fYnVzKCh2b2lkKilhZGRyKSk7CisJc2V0X2RtYV9jb3VudChmZGMuZG1hLCBjb3VudCk7CisJZW5hYmxlX2RtYShmZGMuZG1hKTsKK30KKworLyogIFNldHVwIGZkYyBhbmQgZG1hIGZvciBmb3JtYXR0aW5nIHRoZSBuZXh0IHNlZ21lbnQKKyAqLworaW50IGZkY19zZXR1cF9mb3JtYXR0aW5nKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191OCBvdXRbNl0gPSB7CisJCUZEQ19GT1JNQVQsIDB4MDAsIDMsIDQgKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5ULCAweDAwLCAweDZiCisJfTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQorCVRSQUNFX0NBVENIKGhhbmRsZV9wZXJwZW5kKGJ1ZmYtPnNlZ21lbnRfaWQpLCk7CisJLyogUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICovCisgICAgICAgIFRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkgICAgICAicGh5cy4gYWRkci4gPSAlbHgiLCB2aXJ0X3RvX2J1cygodm9pZCopIGJ1ZmYtPnB0cikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWZkY19zZXR1cF9kbWEoRE1BX01PREVfV1JJVEUsIGJ1ZmYtPnB0ciwgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAqIDQpOworCS8qIElzc3VlIEZEQyBjb21tYW5kIHRvIHN0YXJ0IHJlYWRpbmcvd3JpdGluZy4KKwkgKi8KKwlvdXRbMV0gPSBmdF9kcml2ZV9zZWw7CisJb3V0WzRdID0gYnVmZi0+Z2FwMzsKKwlUUkFDRV9DQVRDSChmZGNfc2V0dXBfZXJyb3IgPSBmZGNfY29tbWFuZChvdXQsIHNpemVvZihvdXQpKSwKKwkJICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOyBmZGNfbW9kZSA9IGZkY19pZGxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworCisvKiAgICAgIFNldHVwIEZsb3BweSBEaXNrIENvbnRyb2xsZXIgYW5kIERNQSB0byByZWFkIG9yIHdyaXRlIHRoZSBuZXh0IGNsdXN0ZXIKKyAqICAgICAgb2YgZ29vZCBzZWN0b3JzIGZyb20gb3IgdG8gdGhlIGN1cnJlbnQgc2VnbWVudC4KKyAqLworaW50IGZkY19zZXR1cF9yZWFkX3dyaXRlKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLCBfX3U4IG9wZXJhdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTggb3V0WzldOworCWludCBkbWFfbW9kZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoKG9wZXJhdGlvbikgeworCWNhc2UgRkRDX1ZFUklGWToKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3KSB7CisJCQlvcGVyYXRpb24gPSBGRENfUkVBRDsKKwkJfQorCWNhc2UgRkRDX1JFQUQ6CisJY2FzZSBGRENfUkVBRF9ERUxFVEVEOgorCQlkbWFfbW9kZSA9IERNQV9NT0RFX1JFQUQ7CisJCVRSQUNFKGZ0X3RfZmRjX2RtYSwgInhmZXIgJWQgc2VjdG9ycyB0byAweCVwIiwKKwkJICAgICAgYnVmZi0+c2VjdG9yX2NvdW50LCBidWZmLT5wdHIpOworCQlUUkFDRV9DQVRDSChwZXJwZW5kX29mZigpLCk7CisJCWJyZWFrOworCWNhc2UgRkRDX1dSSVRFX0RFTEVURUQ6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkZWxldGluZyBzZWdtZW50ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJY2FzZSBGRENfV1JJVEU6CisJCWRtYV9tb2RlID0gRE1BX01PREVfV1JJVEU7CisJCS8qIFdoZW4gd3JpdGluZyBRSUMtMzAyMCB0YXBlcywgdHVybiBvbiBwZXJwZW5kaWN1bGFyIG1vZGUKKwkJICogaWYgdGFwZSBpcyBtb3ZpbmcgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKGV2ZW4gdHJhY2tzKS4KKwkJICovCisJCVRSQUNFX0NBVENIKGhhbmRsZV9wZXJwZW5kKGJ1ZmYtPnNlZ21lbnRfaWQpLCk7CisJCVRSQUNFKGZ0X3RfZmRjX2RtYSwgInhmZXIgJWQgc2VjdG9ycyBmcm9tIDB4JXAiLAorCQkgICAgICBidWZmLT5zZWN0b3JfY291bnQsIGJ1ZmYtPnB0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKC1FSU8sCisJCQkgICAgZnRfdF9idWcsICJidWc6IGludmFsaWQgb3BlcmF0aW9uIHBhcmFtZXRlciIpOworCX0KKwlUUkFDRShmdF90X2ZkY19kbWEsICJwaHlzLiBhZGRyLiA9ICVseCIsdmlydF90b19idXMoKHZvaWQqKWJ1ZmYtPnB0cikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWlmIChvcGVyYXRpb24gIT0gRkRDX1ZFUklGWSkgeworCQlmZGNfc2V0dXBfZG1hKGRtYV9tb2RlLCBidWZmLT5wdHIsCisJCQkgICAgICBGVF9TRUNUT1JfU0laRSAqIGJ1ZmYtPnNlY3Rvcl9jb3VudCk7CisJfQorCS8qIElzc3VlIEZEQyBjb21tYW5kIHRvIHN0YXJ0IHJlYWRpbmcvd3JpdGluZy4KKwkgKi8KKwlvdXRbMF0gPSBvcGVyYXRpb247CisJb3V0WzFdID0gZnRfZHJpdmVfc2VsOworCW91dFsyXSA9IGJ1ZmYtPmN5bDsKKwlvdXRbM10gPSBidWZmLT5oZWFkOworCW91dFs0XSA9IGJ1ZmYtPnNlY3QgKyBidWZmLT5zZWN0b3Jfb2Zmc2V0OworCW91dFs1XSA9IDM7CQkvKiBTZWN0b3Igc2l6ZSBvZiAxSy4gKi8KKwlvdXRbNl0gPSBvdXRbNF0gKyBidWZmLT5zZWN0b3JfY291bnQgLSAxOwkvKiBsYXN0IHNlY3RvciAqLworCW91dFs3XSA9IDEwOTsJCS8qIEdhcCBsZW5ndGguICovCisJb3V0WzhdID0gMHhmZjsJCS8qIE5vIGxpbWl0IHRvIHRyYW5zZmVyIHNpemUuICovCisJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiQzogMHglMDJ4LCBIOiAweCUwMngsIFI6IDB4JTAyeCwgY250OiAweCUwMngiLAorCQlvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNl0gLSBvdXRbNF0gKyAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCVRSQUNFX0NBVENIKGZkY19zZXR1cF9lcnJvciA9IGZkY19jb21tYW5kKG91dCwgOSksZmRjX21vZGUgPSBmZGNfaWRsZSk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZmRjX2ZpZm9fdGhyZXNob2xkKF9fdTggdGhyZXNob2xkLAorCQkgICAgICAgaW50ICpmaWZvX3N0YXRlLCBpbnQgKmxvY2tfc3RhdGUsIGludCAqZmlmb190aHIpCit7CisJY29uc3QgX191OCBjbWQwW10gPSB7RkRDX0RVTVBSRUdTfTsKKwlfX3U4IGNtZDFbXSA9IHtGRENfQ09ORklHVVJFLCAwLCAoMHgwZiAmICh0aHJlc2hvbGQgLSAxKSksIDB9OworCWNvbnN0IF9fdTggY21kMltdID0ge0ZEQ19MT0NLfTsKKwljb25zdCBfX3U4IGNtZDNbXSA9IHtGRENfVU5MT0NLfTsKKwlfX3U4IHJlZ1sxMF07CisJX191OCBzdGF0OworCWludCBpOworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChDTEtfNDhNSFogJiYgZmRjLnR5cGUgPj0gaTgyMDc4KSB7CisJCWNtZDFbMF0gfD0gRkRDX0NMSzQ4X0JJVDsKKwl9CisJLyogIER1bXAgZmRjIGludGVybmFsIHJlZ2lzdGVycyBmb3IgZXhhbWluYXRpb24KKwkgKi8KKwlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChjbWQwLCBOUl9JVEVNUyhjbWQwKSksCisJCSAgICBUUkFDRShmdF90X3dhcm4sICJkdW1wcmVnIGNtZCBmYWlsZWQsIGZpZm8gdW5jaGFuZ2VkIikpOworCS8qICBOb3cgcmVhZCBmZGMgaW50ZXJuYWwgcmVnaXN0ZXJzIGZyb20gZmlmbworCSAqLworCWZvciAoaSA9IDA7IGkgPCAoaW50KU5SX0lURU1TKHJlZyk7ICsraSkgeworCQlmZGNfcmVhZCgmcmVnW2ldKTsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiUmVnaXN0ZXIgJWQgPSAweCUwMngiLCBpLCByZWdbaV0pOworCX0KKwlpZiAoZmlmb19zdGF0ZSAmJiBsb2NrX3N0YXRlICYmIGZpZm9fdGhyKSB7CisJCSpmaWZvX3N0YXRlID0gKHJlZ1s4XSAmIDB4MjApID09IDA7CisJCSpsb2NrX3N0YXRlID0gcmVnWzddICYgMHg4MDsKKwkJKmZpZm9fdGhyID0gMSArIChyZWdbOF0gJiAweDBmKTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwKKwkgICAgICAib3JpZ2luYWwgZmlmbyBzdGF0ZTogJXNhYmxlZCwgdGhyZXNob2xkICVkLCAlc2xvY2tlZCIsCisJICAgICAgKChyZWdbOF0gJiAweDIwKSA9PSAwKSA/ICJlbiIgOiAiZGlzIiwKKwkgICAgICAxICsgKHJlZ1s4XSAmIDB4MGYpLCAocmVnWzddICYgMHg4MCkgPyAiIiA6ICJub3QgIik7CisJLyogIElmIGZkYyBpcyBhbHJlYWR5IGxvY2tlZCwgdW5sb2NrIGl0IGZpcnN0ICEgKi8KKwlpZiAocmVnWzddICYgMHg4MCkgeworCQlmZGNfcmVhZHlfd2FpdCgxMDApOworCQlUUkFDRV9DQVRDSChmZGNfaXNzdWVfY29tbWFuZChjbWQzLCBOUl9JVEVNUyhjbWQzKSwgJnN0YXQsIDEpLAorCQkJICAgIFRSQUNFKGZ0X3RfYnVnLCAiRkRDIHVubG9jayBjb21tYW5kIGZhaWxlZCwgIgorCQkJCSAgImNvbmZpZ3VyYXRpb24gdW5jaGFuZ2VkIikpOworCX0KKwlmZGNfZmlmb19sb2NrZWQgPSAwOworCS8qICBFbmFibGUgZmlmbyBhbmQgc2V0IHRocmVzaG9sZCBhdCB4eCBieXRlcyB0byBhbGxvdyBhCisJICogIHJlYXNvbmFibHkgbGFyZ2UgbGF0ZW5jeSBhbmQgcmVkdWNlIG51bWJlciBvZiBkbWEgYnVyc3RzLgorCSAqLworCWZkY19yZWFkeV93YWl0KDEwMCk7CisJaWYgKChyZXN1bHQgPSBmZGNfY29tbWFuZChjbWQxLCBOUl9JVEVNUyhjbWQxKSkpIDwgMCkgeworCQlUUkFDRShmdF90X2J1ZywgImNvbmZpZ3VyZSBjbWQgZmFpbGVkLCBmaWZvIHVuY2hhbmdlZCIpOworCX0KKwkvKiAgTm93IGxvY2sgY29uZmlndXJhdGlvbiBzbyByZXNldCB3aWxsIG5vdCBjaGFuZ2UgaXQKKwkgKi8KKyAgICAgICAgaWYoZmRjX2lzc3VlX2NvbW1hbmQoY21kMiwgTlJfSVRFTVMoY21kMiksICZzdGF0LCAxKSA8IDAgfHwKKwkgICBzdGF0ICE9IDB4MTApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsCisJCQkgICAgIkZEQyBsb2NrIGNvbW1hbmQgZmFpbGVkLCBzdGF0ID0gMHglMDJ4Iiwgc3RhdCk7CisJfQorCWZkY19maWZvX2xvY2tlZCA9IDE7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2ZpZm9fZW5hYmxlKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChmZGNfZmlmb19sb2NrZWQpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF93YXJuLCAiRmlmbyBub3QgZW5hYmxlZCBiZWNhdXNlIGxvY2tlZCIpOworCX0KKwlUUkFDRV9DQVRDSChmZGNfZmlmb190aHJlc2hvbGQoZnRfZmRjX3RocmVzaG9sZCAvKiBieXRlcyAqLywKKwkJCQkgICAgICAgJmZkY19maWZvX3N0YXRlLAorCQkJCSAgICAgICAmZmRjX2xvY2tfc3RhdGUsCisJCQkJICAgICAgICZmZGNfZmlmb190aHIpLCk7CisJVFJBQ0VfQ0FUQ0goZmRjX2ZpZm9fdGhyZXNob2xkKGZ0X2ZkY190aHJlc2hvbGQgLyogYnl0ZXMgKi8sCisJCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpLCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgIERldGVybWluZSBmZCBjb250cm9sbGVyIHR5cGUgCisgKi8KK3N0YXRpYyBfX3U4IGZkY19zYXZlX3N0YXRlWzJdOworCitzdGF0aWMgaW50IGZkY19wcm9iZSh2b2lkKQoreworCV9fdTggY21kWzFdOworCV9fdTggc3RhdFsxNl07IC8qIG11c3QgYmUgYWJsZSB0byBob2xkIGR1bXByZWdzICYgc2F2ZSByZXN1bHRzICovCisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBUcnkgdG8gZmluZCBvdXQgd2hhdCBraW5kIG9mIGZkIGNvbnRyb2xsZXIgd2UgaGF2ZSB0byBkZWFsIHdpdGgKKwkgKiAgU2NoZW1lIGJvcnJvd2VkIGZyb20gZmxvcHB5IGRyaXZlcjoKKwkgKiAgZmlyc3QgdHJ5IGlmIEZEQ19EVU1QUkVHUyBjb21tYW5kIHdvcmtzCisJICogICh0aGlzIGluZGljYXRlcyB0aGF0IHdlIGhhdmUgYSA4MjA3MiBvciBiZXR0ZXIpCisJICogIHRoZW4gdHJ5IHRoZSBGRENfVkVSU0lPTiBjb21tYW5kICg4MjA3MiBkb2Vzbid0IHN1cHBvcnQgdGhpcykKKwkgKiAgdGhlbiB0cnkgdGhlIEZEQ19VTkxPQ0sgY29tbWFuZCAoc29tZSBvbGRlciA4MjA3NydzIGRvbid0IHN1cHBvcnQgdGhpcykKKwkgKiAgdGhlbiB0cnkgdGhlIEZEQ19QQVJUSUQgY29tbWFuZCAoODIwNzgncyBzdXBwb3J0IHRoaXMpCisJICovCisJY21kWzBdID0gRkRDX0RVTVBSRUdTOworCWlmIChmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQobm9fZmRjLCBmdF90X2J1ZywgIk5vIEZEQyBmb3VuZCIpOworCX0KKwlpZiAoc3RhdFswXSA9PSAweDgwKSB7CisJCS8qIGludmFsaWQgY29tbWFuZDogbXVzdCBiZSBwcmUgODIwNzIgKi8KKwkJVFJBQ0VfQUJPUlQoaTgyNzIsCisJCQkgICAgZnRfdF93YXJuLCAiVHlwZSA4MjcyQS83NjVBIGNvbXBhdGlibGUgRkRDIGZvdW5kIik7CisJfQorCWZkY19yZXN1bHQoJnN0YXRbMV0sIDkpOworCWZkY19zYXZlX3N0YXRlWzBdID0gc3RhdFs3XTsKKwlmZGNfc2F2ZV9zdGF0ZVsxXSA9IHN0YXRbOF07CisJY21kWzBdID0gRkRDX1ZFUlNJT047CisJaWYgKGZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMSkgPCAwIHx8IHN0YXRbMF0gPT0gMHg4MCkgeworCQlUUkFDRV9BQk9SVChpODI3MiwgZnRfdF93YXJuLCAiVHlwZSA4MjA3MiBGREMgZm91bmQiKTsKKwl9CisJaWYgKCpzdGF0ICE9IDB4OTApIHsKKwkJVFJBQ0VfQUJPUlQoaTgyNzIsIGZ0X3Rfd2FybiwgIlVua25vd24gRkRDIGZvdW5kIik7CisJfQorCWNtZFswXSA9IEZEQ19VTkxPQ0s7CisJaWYoZmRjX2lzc3VlX2NvbW1hbmQoY21kLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSAhPSAweDAwKSB7CisJCVRSQUNFX0FCT1JUKGk4MjcyLCBmdF90X3dhcm4sCisJCQkgICAgIlR5cGUgcHJlLTE5OTEgODIwNzcgRkRDIGZvdW5kLCAiCisJCQkgICAgInRyZWF0aW5nIGl0IGxpa2UgYSA4MjA3MiIpOworCX0KKwlpZiAoZmRjX3NhdmVfc3RhdGVbMF0gJiAweDgwKSB7IC8qIHdhcyBsb2NrZWQgKi8KKwkJY21kWzBdID0gRkRDX0xPQ0s7IC8qIHJlc3RvcmUgbG9jayAqLworCQkodm9pZClmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpOworCQlUUkFDRShmdF90X3dhcm4sICJGREMgaXMgYWxyZWFkeSBsb2NrZWQiKTsKKwl9CisJLyogVGVzdCBmb3IgYSBpODIwNzggRkRDICovCisJY21kWzBdID0gRkRDX1BBUlRJRDsKKwlpZiAoZmRjX2lzc3VlX2NvbW1hbmQoY21kLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSA9PSAweDgwKSB7CisJCS8qIGludmFsaWQgY29tbWFuZDogbm90IGEgaTgyMDc4eHggdHlwZSBGREMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJb3V0Yl9wKGksIGZkYy50ZHIpOworCQkJaWYgKChpbmJfcChmZGMudGRyKSAmIDB4MDMpICE9IGkpIHsKKwkJCQlUUkFDRV9BQk9SVChpODIwNzcsCisJCQkJCSAgICBmdF90X3dhcm4sICJUeXBlIDgyMDc3IEZEQyBmb3VuZCIpOworCQkJfQorCQl9CisJCVRSQUNFX0FCT1JUKGk4MjA3N0FBLCBmdF90X3dhcm4sICJUeXBlIDgyMDc3QUEgRkRDIGZvdW5kIik7CisJfQorCS8qIEZEQ19QQVJUSUQgY21kIHN1Y2NlZWRlZCAqLworCXN3aXRjaCAoc3RhdFswXSA+PiA1KSB7CisJY2FzZSAweDA6CisJCS8qIGk4MjA3OFNMIG9yIGk4MjA3OC0xLiAgVGhlIFNMIHBhcnQgY2Fubm90IHJ1biBhdAorCQkgKiAyTWJwcyAodGhlIFNMIGFuZCAtMSBkaWVzIGFyZSBpZGVudGljYWw7IHRoZXkgYXJlCisJCSAqIHNwZWVkIGdyYWRlZCBhZnRlciBwcm9kdWN0aW9uLCBhY2NvcmRpbmcgdG8gSW50ZWwpLgorCQkgKiBTb21lIFNMJ3MgY2FuIGJlIGRldGVjdGVkIGJ5IGRvaW5nIGEgU0FWRSBjbWQgYW5kCisJCSAqIGxvb2sgYXQgYml0IDcgb2YgdGhlIGZpcnN0IGJ5dGUgKHRoZSBTRUwzViMgYml0KS4KKwkJICogSWYgaXQgaXMgMCwgdGhlIHBhcnQgcnVucyBvZmYgM1ZvbHRzLCBhbmQgaGVuY2UgaXQKKwkJICogaXMgYSBTTC4KKwkJICovCisJCWNtZFswXSA9IEZEQ19TQVZFOworCQlpZihmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDE2KSA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiRkRDX1NBVkUgZmFpbGVkLiBEdW5ubyB3aHkiKTsKKwkJCS8qIGd1ZXNzIHdlIGJldHRlciBjbGFpbSB0aGUgZmRjIHRvIGJlIGEgaTgyMDc4ICovCisJCQlUUkFDRV9BQk9SVChpODIwNzgsCisJCQkJICAgIGZ0X3Rfd2FybiwKKwkJCQkgICAgIlR5cGUgaTgyMDc4IEZEQyAoaSBzdXBwb3NlKSBmb3VuZCIpOworCQl9CisJCWlmICgoc3RhdFswXSAmIEZEQ19TRUwzVl9CSVQpKSB7CisJCQkvKiBmZGMgcnVubmluZyBvZmYgNVZvbHRzOyBQcmF5IHRoYXQgaXQncyBhIGk4MjA3OC0xCisJCQkgKi8KKwkJCVRSQUNFX0FCT1JUKGk4MjA3OF8xLCBmdF90X3dhcm4sCisJCQkJICAiVHlwZSBpODIwNzgtMSBvciA1Vm9sdCBpODIwNzhTTCBGREMgZm91bmQiKTsKKwkJfQorCQlUUkFDRV9BQk9SVChpODIwNzgsIGZ0X3Rfd2FybiwKKwkJCSAgICAiVHlwZSAzVm9sdCBpODIwNzhTTCBGREMgKDFNYnBzKSBmb3VuZCIpOworCWNhc2UgMHgxOgorCWNhc2UgMHgyOiAvKiBTODIwNzhCICAqLworCQkvKiBUaGUgJzc4QiAgaXNuJ3QgJzc4IGNvbXBhdGlibGUuICBEZXRlY3QgaXQgYXMgYSAnNzdBQSAqLworCQlUUkFDRV9BQk9SVChpODIwNzdBQSwgZnRfdF93YXJuLCAiVHlwZSBpODIwNzdBQSBGREMgZm91bmQiKTsKKwljYXNlIDB4MzogLyogTlNDIFBDODc0NCBjb3JlOyB1c2VkIGluIHNldmVyYWwgc3VwZXItSU8gY2hpcHMgKi8KKwkJVFJBQ0VfQUJPUlQoaTgyMDc3QUEsCisJCQkgICAgZnRfdF93YXJuLCAiVHlwZSA4MjA3N0FBIGNvbXBhdGlibGUgRkRDIGZvdW5kIik7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF93YXJuLCAiQSBwcmV2aW91c2x5IHVuZGV0ZWN0ZWQgRkRDIGZvdW5kIik7CisJCVRSQUNFX0FCT1JUKGk4MjA3N0FBLCBmdF90X3dhcm4sCisJCQkgICJUcmVhdGluZyBpdCBhcyBhIDgyMDc3QUEuIFBsZWFzZSByZXBvcnQgcGFydGlkPSAlZCIsCisJCQkgICAgc3RhdFswXSk7CisJfSAvKiBzd2l0Y2goc3RhdFsgMF0gPj4gNSkgKi8KKwlUUkFDRV9FWElUIG5vX2ZkYzsKK30KKworc3RhdGljIGludCBmZGNfcmVxdWVzdF9yZWdpb25zKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZnRfbWFjaDIgfHwgZnRfcHJvYmVfZmMxMCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGZkYy5zcmEsIDgsICJmZGMgKGZ0KSIpKSB7CisjaWZuZGVmIEJST0tFTl9GTE9QUFlfRFJJVkVSCisJCQlUUkFDRV9FWElUIC1FQlVTWTsKKyNlbHNlCisJCQlUUkFDRShmdF90X3dhcm4sCisiYWRkcmVzcyAweCUwM3ggb2NjdXBpZWQgKGJ5IGZsb3BweSBkcml2ZXI/KSwgdXNpbmcgaXQgYW55d2F5IiwgZmRjLnNyYSk7CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oZmRjLnNyYSwgNiwgImZkYyAoZnQpIikpIHsKKyNpZm5kZWYgQlJPS0VOX0ZMT1BQWV9EUklWRVIKKwkJCVRSQUNFX0VYSVQgLUVCVVNZOworI2Vsc2UKKwkJCVRSQUNFKGZ0X3Rfd2FybiwKKyJhZGRyZXNzIDB4JTAzeCBvY2N1cGllZCAoYnkgZmxvcHB5IGRyaXZlcj8pLCB1c2luZyBpdCBhbnl3YXkiLCBmZGMuc3JhKTsKKyNlbmRpZgorCQl9CisJCWlmICghcmVxdWVzdF9yZWdpb24oZmRjLnNyYSArIDcsIDEsICJmZGMgKGZ0KSIpKSB7CisjaWZuZGVmIEJST0tFTl9GTE9QUFlfRFJJVkVSCisJCQlyZWxlYXNlX3JlZ2lvbihmZGMuc3JhLCA2KTsKKwkJCVRSQUNFX0VYSVQgLUVCVVNZOworI2Vsc2UKKwkJCVRSQUNFKGZ0X3Rfd2FybiwKKyJhZGRyZXNzIDB4JTAzeCBvY2N1cGllZCAoYnkgZmxvcHB5IGRyaXZlcj8pLCB1c2luZyBpdCBhbnl3YXkiLCBmZGMuc3JhICsgNyk7CisjZW5kaWYKKwkJfQorCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3ZvaWQgZmRjX3JlbGVhc2VfcmVnaW9ucyh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGZkYy5zcmEgIT0gMCkgeworCQlpZiAoZmRjLmRvcjIgIT0gMCkgeworCQkJcmVsZWFzZV9yZWdpb24oZmRjLnNyYSwgOCk7CisJCX0gZWxzZSB7CisJCQlyZWxlYXNlX3JlZ2lvbihmZGMuc3JhLCA2KTsKKwkJCXJlbGVhc2VfcmVnaW9uKGZkYy5kaXIsIDEpOworCQl9CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2NvbmZpZ19yZWdzKHVuc2lnbmVkIGludCBmZGNfYmFzZSwgCisJCQkgICB1bnNpZ25lZCBpbnQgZmRjX2lycSwgCisJCQkgICB1bnNpZ25lZCBpbnQgZmRjX2RtYSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZkYy5pcnEgPSBmZGNfaXJxOworCWZkYy5kbWEgPSBmZGNfZG1hOworCWZkYy5zcmEgPSBmZGNfYmFzZTsKKwlmZGMuc3JiID0gZmRjX2Jhc2UgKyAxOworCWZkYy5kb3IgPSBmZGNfYmFzZSArIDI7CisJZmRjLnRkciA9IGZkY19iYXNlICsgMzsKKwlmZGMubXNyID0gZmRjLmRzciA9IGZkY19iYXNlICsgNDsKKwlmZGMuZmlmbyA9IGZkY19iYXNlICsgNTsKKwlmZGMuZGlyID0gZmRjLmNjciA9IGZkY19iYXNlICsgNzsKKwlmZGMuZG9yMiA9IChmdF9tYWNoMiB8fCBmdF9wcm9iZV9mYzEwKSA/IGZkY19iYXNlICsgNiA6IDA7CisJVFJBQ0VfQ0FUQ0goZmRjX3JlcXVlc3RfcmVnaW9ucygpLCBmZGMuc3JhID0gMCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGZkY19jb25maWcodm9pZCkKK3sKKwlzdGF0aWMgaW50IGFscmVhZHlfZG9uZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGFscmVhZHlfZG9uZSkgeworCQlUUkFDRV9DQVRDSChmZGNfcmVxdWVzdF9yZWdpb25zKCksKTsKKwkJKihmZGMuaG9vaykgPSBmZGNfaXNyOwkvKiBob29rIG91ciBoYW5kbGVyIGluICovCisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKGZ0X3Byb2JlX2ZjMTApIHsKKwkJaW50IGZjX3R5cGU7CisJCQorCQlUUkFDRV9DQVRDSChmZGNfY29uZmlnX3JlZ3MoZnRfZmRjX2Jhc2UsCisJCQkJCSAgICBmdF9mZGNfaXJxLCBmdF9mZGNfZG1hKSwpOworCQlmY190eXBlID0gZmMxMF9lbmFibGUoKTsKKwkJaWYgKGZjX3R5cGUgIT0gMCkgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiRkMtJWMwIGNvbnRyb2xsZXIgZm91bmQiLCAnMCcgKyBmY190eXBlKTsKKwkJCWZkYy50eXBlID0gZmMxMDsKKwkJCWZkYy5ob29rID0gJmRvX2Z0YXBlOworCQkJKihmZGMuaG9vaykgPSBmZGNfaXNyOwkvKiBob29rIG91ciBoYW5kbGVyIGluICovCisJCQlhbHJlYWR5X2RvbmUgPSAxOworCQkJVFJBQ0VfRVhJVCAwOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiRkMtMTAvMjAgY29udHJvbGxlciBub3QgZm91bmQiKTsKKwkJCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKKwkJCWZkYy50eXBlID0gbm9fZmRjOworCQkJZnRfcHJvYmVfZmMxMCA9IDA7CisJCQlmdF9mZGNfYmFzZSAgID0gMHgzZjA7CisJCQlmdF9mZGNfaXJxICAgID0gNjsKKwkJCWZ0X2ZkY19kbWEgICAgPSAyOworCQl9CisJfQorCVRSQUNFKGZ0X3Rfd2FybiwgImZkYyBiYXNlOiAweCV4LCBpcnE6ICVkLCBkbWE6ICVkIiwgCisJICAgICAgZnRfZmRjX2Jhc2UsIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEpOworCVRSQUNFX0NBVENIKGZkY19jb25maWdfcmVncyhmdF9mZGNfYmFzZSwgZnRfZmRjX2lycSwgZnRfZmRjX2RtYSksKTsKKwlmZGMuaG9vayA9ICZkb19mdGFwZTsKKwkqKGZkYy5ob29rKSA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW4gKi8KKwlhbHJlYWR5X2RvbmUgPSAxOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZ0YXBlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZvaWQgKCpoYW5kbGVyKSAodm9pZCkgPSAqZmRjLmhvb2s7CisJaW50IGhhbmRsZWQgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkqZmRjLmhvb2sgPSBOVUxMOworCWlmIChoYW5kbGVyKSB7CisJCWhhbmRsZWQgPSAxOworCQloYW5kbGVyKCk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9idWcsICJVbmV4cGVjdGVkIGZ0YXBlIGludGVycnVwdCIpOworCX0KKwlUUkFDRV9FWElUIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2dyYWJfaXJxX2FuZF9kbWEodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZkYy5ob29rID09ICZkb19mdGFwZSkgeworCQkvKiAgR2V0IGZhc3QgaW50ZXJydXB0IGhhbmRsZXIuCisJCSAqLworCQlpZiAocmVxdWVzdF9pcnEoZmRjLmlycSwgZnRhcGVfaW50ZXJydXB0LAorCQkJCVNBX0lOVEVSUlVQVCwgImZ0IiwgZnRhcGVfaWQpKSB7CisJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCQkgICAgIlVuYWJsZSB0byBncmFiIElSUSVkIGZvciBmdGFwZSBkcml2ZXIiLAorCQkJCSAgICBmZGMuaXJxKTsKKwkJfQorCQlpZiAocmVxdWVzdF9kbWEoZmRjLmRtYSwgZnRhcGVfaWQpKSB7CisJCQlmcmVlX2lycShmZGMuaXJxLCBmdGFwZV9pZCk7CisJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCSAgICAgICJVbmFibGUgdG8gZ3JhYiBETUElZCBmb3IgZnRhcGUgZHJpdmVyIiwKKwkJCSAgICAgIGZkYy5kbWEpOworCQl9CisJfQorCWlmIChmdF9mZGNfYmFzZSAhPSAweDNmMCAmJiAoZnRfZmRjX2RtYSA9PSAyIHx8IGZ0X2ZkY19pcnEgPT0gNikpIHsKKwkJLyogVXNpbmcgc2FtZSBkbWEgY2hhbm5lbCBvciBpcnEgYXMgc3RhbmRhcmQgZmRjLCBuZWVkCisJCSAqIHRvIGRpc2FibGUgdGhlIGRtYS1nYXRlIG9uIHRoZSBzdGQgZmRjLiBUaGlzCisJCSAqIGNvdWxkbid0IGJlIGRvbmUgaW4gdGhlIGZsb3BweSBkcml2ZXIgYXMgc29tZQorCQkgKiBsYXB0b3BzIGFyZSB1c2luZyB0aGUgZG1hLWdhdGUgdG8gZW50ZXIgYSBsb3cgcG93ZXIKKwkJICogb3IgZXZlbiBzdXNwZW5kZWQgc3RhdGUgOi0oCisJCSAqLworCQlvdXRiX3AoRkRDX1JFU0VUX05PVCwgMHgzZjIpOworCQlUUkFDRShmdF90X25vaXNlLCAiRE1BLWdhdGUgb24gc3RhbmRhcmQgZmRjIGRpc2FibGVkIik7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZkY19yZWxlYXNlX2lycV9hbmRfZG1hKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChmZGMuaG9vayA9PSAmZG9fZnRhcGUpIHsKKwkJZGlzYWJsZV9kbWEoZmRjLmRtYSk7CS8qIGp1c3QgaW4gY2FzZS4uLiAqLworCQlmcmVlX2RtYShmZGMuZG1hKTsKKwkJZnJlZV9pcnEoZmRjLmlycSwgZnRhcGVfaWQpOworCX0KKwlpZiAoZnRfZmRjX2Jhc2UgIT0gMHgzZjAgJiYgKGZ0X2ZkY19kbWEgPT0gMiB8fCBmdF9mZGNfaXJxID09IDYpKSB7CisJCS8qIFVzaW5nIHNhbWUgZG1hIGNoYW5uZWwgYXMgc3RhbmRhcmQgZmRjLCBuZWVkIHRvCisJCSAqIGRpc2FibGUgdGhlIGRtYS1nYXRlIG9uIHRoZSBzdGQgZmRjLiBUaGlzIGNvdWxkbid0CisJCSAqIGJlIGRvbmUgaW4gdGhlIGZsb3BweSBkcml2ZXIgYXMgc29tZSBsYXB0b3BzIGFyZQorCQkgKiB1c2luZyB0aGUgZG1hLWdhdGUgdG8gZW50ZXIgYSBsb3cgcG93ZXIgb3IgZXZlbgorCQkgKiBzdXNwZW5kZWQgc3RhdGUgOi0oCisJCSAqLworCQlvdXRiX3AoRkRDX1JFU0VUX05PVCB8IEZEQ19ETUFfTU9ERSwgMHgzZjIpOworCQlUUkFDRShmdF90X25vaXNlLCAiRE1BLWdhdGUgb24gc3RhbmRhcmQgZmRjIGVuYWJsZWQgYWdhaW4iKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZmRjX2luaXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogZmluZCBhIEZEQyB0byB1c2UgKi8KKwlUUkFDRV9DQVRDSChmZGNfY29uZmlnKCksKTsKKwlUUkFDRV9DQVRDSChmZGNfZ3JhYl9pcnFfYW5kX2RtYSgpLCBmZGNfcmVsZWFzZV9yZWdpb25zKCkpOworCWZ0YXBlX21vdG9yID0gMDsKKwlmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cygwKTsJLyogY2xlYXIgbnVtYmVyIG9mIGF3YWludGVkCisJCQkJCSAqIHN0cmF5IGludGVycnVwdGUgCisJCQkJCSAqLworCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDEpOwkvKiBvbmUgYWx3YXlzIGNvbWVzICg/KSAqLworCVRSQUNFKGZ0X3RfZmxvdywgInJlc2V0dGluZyBmZGMiKTsKKwlmZGNfc2V0X3NlZWtfcmF0ZSgyKTsJCS8qIHVzZSBub21pbmFsIFFJQyBzdGVwIHJhdGUgKi8KKwlmZGNfcmVzZXQoKTsJCQkvKiBpbml0IGZkYyAmIGNsZWFyIHRyYWNrIGNvdW50ZXJzICovCisJaWYgKGZkYy50eXBlID09IG5vX2ZkYykgewkvKiBubyBGQy0xMCBvciBGQy0yMCBmb3VuZCAqLworCQlmZGMudHlwZSA9IGZkY19wcm9iZSgpOworCQlmZGNfcmVzZXQoKTsJCS8qIHVwZGF0ZSB3aXRoIG5ldyBrbm93bGVkZ2UgKi8KKwl9CisJaWYgKGZkYy50eXBlID09IG5vX2ZkYykgeworCQlmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOworCQlmZGNfcmVsZWFzZV9yZWdpb25zKCk7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc3KSB7CisJCWlmIChmZGNfZmlmb19lbmFibGUoKSA8IDApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgImNvdWxkbid0IGVuYWJsZSBmZGMgZmlmbyAhIik7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJmZGMgZmlmbyBlbmFibGVkIGFuZCBsb2NrZWQiKTsKKwkJfQorCX0KKwlUUkFDRV9FWElUIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjM2M3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaApAQCAtMCwwICsxLDI1MiBAQAorI2lmbmRlZiBfRkRDX0lPX0gKKyNkZWZpbmUgX0ZEQ19JT19ICisKKy8qCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaCx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbG93IGxldmVsCisgKiAgICAgIGZ1bmN0aW9ucyB0aGF0IGNvbW11bmljYXRlIHdpdGggdGhlIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIsCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKKyAqICAgICAgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZkcmVnLmg+CisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKworI2RlZmluZSBGRENfU0tfQklUICAgICAgKDB4MjApCisjZGVmaW5lIEZEQ19NVF9CSVQgICAgICAoMHg4MCkKKworI2RlZmluZSBGRENfUkVBRCAgICAgICAgKEZEX1JFQUQgJiB+KEZEQ19TS19CSVQgfCBGRENfTVRfQklUKSkKKyNkZWZpbmUgRkRDX1dSSVRFICAgICAgIChGRF9XUklURSAmIH5GRENfTVRfQklUKQorI2RlZmluZSBGRENfUkVBRF9ERUxFVEVEICAoMHg0YykKKyNkZWZpbmUgRkRDX1dSSVRFX0RFTEVURUQgKDB4NDkpCisjZGVmaW5lIEZEQ19WRVJJRlkgICAgICAgICgweDU2KQorI2RlZmluZSBGRENfUkVBRElEICAgICAgKDB4NGEpCisjZGVmaW5lIEZEQ19TRU5TRUQgICAgICAoMHgwNCkKKyNkZWZpbmUgRkRDX1NFTlNFSSAgICAgIChGRF9TRU5TRUkpCisjZGVmaW5lIEZEQ19GT1JNQVQgICAgICAoRkRfRk9STUFUKQorI2RlZmluZSBGRENfUkVDQUwgICAgICAgKEZEX1JFQ0FMSUJSQVRFKQorI2RlZmluZSBGRENfU0VFSyAgICAgICAgKEZEX1NFRUspCisjZGVmaW5lIEZEQ19TUEVDSUZZICAgICAoRkRfU1BFQ0lGWSkKKyNkZWZpbmUgRkRDX1JFQ0FMSUJSICAgIChGRF9SRUNBTElCUkFURSkKKyNkZWZpbmUgRkRDX1ZFUlNJT04gICAgIChGRF9WRVJTSU9OKQorI2RlZmluZSBGRENfUEVSUEVORCAgICAgKEZEX1BFUlBFTkRJQ1VMQVIpCisjZGVmaW5lIEZEQ19EVU1QUkVHUyAgICAoRkRfRFVNUFJFR1MpCisjZGVmaW5lIEZEQ19MT0NLICAgICAgICAoRkRfTE9DSykKKyNkZWZpbmUgRkRDX1VOTE9DSyAgICAgIChGRF9VTkxPQ0spCisjZGVmaW5lIEZEQ19DT05GSUdVUkUgICAoRkRfQ09ORklHVVJFKQorI2RlZmluZSBGRENfRFJJVkVfU1BFQyAgKDB4OGUpCS8qIGk4MjA3OCBoYXMgdGhpcyAoYW55IG90aGVycz8pICovCisjZGVmaW5lIEZEQ19QQVJUSUQgICAgICAoMHgxOCkJLyogaTgyMDc4IGhhcyB0aGlzICovCisjZGVmaW5lIEZEQ19TQVZFICAgICAgICAoMHgyZSkJLyogaTgyMDc4IGhhcyB0aGlzIChhbnkgb3RoZXJzPykgKi8KKyNkZWZpbmUgRkRDX1JFU1RPUkUgICAgICgweDRlKQkvKiBpODIwNzggaGFzIHRoaXMgKGFueSBvdGhlcnM/KSAqLworCisjZGVmaW5lIEZEQ19TVEFUVVNfTUFTSyAoU1RBVFVTX0JVU1kgfCBTVEFUVVNfRE1BIHwgU1RBVFVTX0RJUiB8IFNUQVRVU19SRUFEWSkKKyNkZWZpbmUgRkRDX0RBVEFfUkVBRFkgIChTVEFUVVNfUkVBRFkpCisjZGVmaW5lIEZEQ19EQVRBX09VVFBVVCAoU1RBVFVTX0RJUikKKyNkZWZpbmUgRkRDX0RBVEFfUkVBRFlfTUFTSyAoU1RBVFVTX1JFQURZIHwgU1RBVFVTX0RJUikKKyNkZWZpbmUgRkRDX0RBVEFfT1VUX1JFQURZICAoU1RBVFVTX1JFQURZIHwgU1RBVFVTX0RJUikKKyNkZWZpbmUgRkRDX0RBVEFfSU5fUkVBRFkgICAoU1RBVFVTX1JFQURZKQorI2RlZmluZSBGRENfQlVTWSAgICAgICAgKFNUQVRVU19CVVNZKQorI2RlZmluZSBGRENfQ0xLNDhfQklUICAgKDB4ODApCisjZGVmaW5lIEZEQ19TRUwzVl9CSVQgICAoMHg0MCkKKworI2RlZmluZSBTVDBfSU5UX01BU0sgICAgKFNUMF9JTlRSKQorI2RlZmluZSBGRENfSU5UX05PUk1BTCAgKFNUMF9JTlRSICYgMHgwMCkKKyNkZWZpbmUgRkRDX0lOVF9BQk5PUk1BTCAoU1QwX0lOVFIgJiAweDQwKQorI2RlZmluZSBGRENfSU5UX0lOVkFMSUQgKFNUMF9JTlRSICYgMHg4MCkKKyNkZWZpbmUgRkRDX0lOVF9SRUFEWUNIIChTVDBfSU5UUiAmIDB4QzApCisjZGVmaW5lIFNUMF9TRUVLX0VORCAgICAoU1QwX1NFKQorI2RlZmluZSBTVDNfVFJBQ0tfMCAgICAgKFNUM19UWikKKworI2RlZmluZSBGRENfUkVTRVRfTk9UICAgKDB4MDQpCisjZGVmaW5lIEZEQ19ETUFfTU9ERSAgICAoMHgwOCkKKyNkZWZpbmUgRkRDX01PVE9SXzAgICAgICgweDEwKQorI2RlZmluZSBGRENfTU9UT1JfMSAgICAgKDB4MjApCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICgqKmhvb2spICh2b2lkKTsJLyogb3VyIHdlZGdlIGludG8gdGhlIGlzciAqLworCWVudW0geworCQlub19mZGMsIGk4MjcyLCBpODIwNzcsIGk4MjA3N0FBLCBmYzEwLAorCQlpODIwNzgsIGk4MjA3OF8xCisJfSB0eXBlOwkJCS8qIEZEQyB0eXBlICovCisJdW5zaWduZWQgaW50IGlycTsgLyogRkRDIGlycSBuciAqLworCXVuc2lnbmVkIGludCBkbWE7IC8qIEZEQyBkbWEgY2hhbm5lbCBuciAqLworCV9fdTE2IHNyYTsJICAvKiBTdGF0dXMgcmVnaXN0ZXIgQSAoUFMvMiBvbmx5KSAqLworCV9fdTE2IHNyYjsJICAvKiBTdGF0dXMgcmVnaXN0ZXIgQiAoUFMvMiBvbmx5KSAqLworCV9fdTE2IGRvcjsJICAvKiBEaWdpdGFsIG91dHB1dCByZWdpc3RlciAqLworCV9fdTE2IHRkcjsJICAvKiBUYXBlIERyaXZlIFJlZ2lzdGVyICg4MjA3N1NMLTEgJgorCQkJICAgICA4MjA3OCBvbmx5KSAqLworCV9fdTE2IG1zcjsJICAvKiBNYWluIFN0YXR1cyBSZWdpc3RlciAqLworCV9fdTE2IGRzcjsJICAvKiBEYXRhcmF0ZSBTZWxlY3QgUmVnaXN0ZXIgKDgyMDd4IG9ubHkpICovCisJX191MTYgZmlmbzsJICAvKiBEYXRhIHJlZ2lzdGVyIC8gRmlmbyBvbiA4MjA3eCAqLworCV9fdTE2IGRpcjsJICAvKiBEaWdpdGFsIElucHV0IFJlZ2lzdGVyICovCisJX191MTYgY2NyOwkgIC8qIENvbmZpZ3VyYXRpb24gQ29udHJvbCBSZWdpc3RlciAqLworCV9fdTE2IGRvcjI7CSAgLyogQWx0ZXJuYXRlIGRvciBvbiBNQUNILTIgY29udHJvbGxlciwKKwkJCSAgICAgYWxzbyB1c2VkIHdpdGggRkMtMTAsIG1lYW5pbmcgdW5rbm93biAqLworfSBmZGNfY29uZmlnX2luZm87CisKK3R5cGVkZWYgZW51bSB7CisJZmRjX2RhdGFfcmF0ZV8yNTAgID0gMiwKKwlmZGNfZGF0YV9yYXRlXzMwMCAgPSAxLAkvKiBhbnkgZmRjIGluIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworCWZkY19kYXRhX3JhdGVfNTAwICA9IDAsCisJZmRjX2RhdGFfcmF0ZV8xMDAwID0gMywKKwlmZGNfZGF0YV9yYXRlXzIwMDAgPSAxLAkvKiBpODIwNzgtMTogd2hlbiB1c2luZyBEYXRhIFJhdGUgVGFibGUgIzIgKi8KK30gZmRjX2RhdGFfcmF0ZV90eXBlOworCit0eXBlZGVmIGVudW0geworCWZkY19pZGxlICAgICAgICAgID0gMCwKKwlmZGNfcmVhZGluZ19kYXRhICA9IEZEQ19SRUFELAorCWZkY19zZWVraW5nICAgICAgID0gRkRDX1NFRUssCisJZmRjX3dyaXRpbmdfZGF0YSAgPSBGRENfV1JJVEUsCisJZmRjX2RlbGV0aW5nICAgICAgPSBGRENfV1JJVEVfREVMRVRFRCwKKwlmZGNfcmVhZGluZ19pZCAgICA9IEZEQ19SRUFESUQsCisJZmRjX3JlY2FsaWJyYXRpbmcgPSBGRENfUkVDQUwsCisJZmRjX2Zvcm1hdHRpbmcgICAgPSBGRENfRk9STUFULAorCWZkY192ZXJpZnlpbmcgICAgID0gRkRDX1ZFUklGWQorfSBmZGNfbW9kZV9lbnVtOworCit0eXBlZGVmIGVudW0geworCXdhaXRpbmcgPSAwLAorCXJlYWRpbmcsCisJd3JpdGluZywKKwlmb3JtYXR0aW5nLAorCXZlcmlmeWluZywKKwlkZWxldGluZywKKwlkb25lLAorCWVycm9yLAorCW1tYXBwZWQsCit9IGJ1ZmZlcl9zdGF0ZV9lbnVtOworCit0eXBlZGVmIHN0cnVjdCB7CisJX191OCAqYWRkcmVzczsKKwl2b2xhdGlsZSBidWZmZXJfc3RhdGVfZW51bSBzdGF0dXM7CisJdm9sYXRpbGUgX191OCAqcHRyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBieXRlczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2VnbWVudF9pZDsKKworCS8qIGJpdG1hcCBmb3IgcmVtYWluZGVyIG9mIHNlZ21lbnQgbm90IHlldCBoYW5kbGVkLgorCSAqIG9uZSBiaXQgc2V0IGZvciBlYWNoIGJhZCBzZWN0b3IgdGhhdCBtdXN0IGJlIHNraXBwZWQuCisJICovCisJdm9sYXRpbGUgU2VjdG9yTWFwIGJhZF9zZWN0b3JfbWFwOworCisJLyogYml0bWFwIHdpdGggYmFkIGRhdGEgYmxvY2tzIGluIGRhdGEgYnVmZmVyLgorCSAqIHRoZSBlcnJvcnMgaW4gdGhpcyBtYXAgbWF5IGJlIHJldHJpZWQuCisJICovCisJdm9sYXRpbGUgU2VjdG9yTWFwIHNvZnRfZXJyb3JfbWFwOworCisJLyogYml0bWFwIHdpdGggYmFkIGRhdGEgYmxvY2tzIGluIGRhdGEgYnVmZmVyCisJICogdGhlIGVycm9ycyBpbiB0aGlzIG1hcCBtYXkgbm90IGJlIHJldHJpZWQuCisJICovCisJdm9sYXRpbGUgU2VjdG9yTWFwIGhhcmRfZXJyb3JfbWFwOworCisJLyogcmV0cnkgY291bnRlciBmb3Igc29mdCBlcnJvcnMuCisJICovCisJdm9sYXRpbGUgaW50IHJldHJ5OworCisJLyogc2VjdG9ycyB0byBza2lwIG9uIHJldHJ5ID8/PworCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBza2lwOworCisJLyogbnIgb2YgZGF0YSBibG9ja3MgaW4gZGF0YSBidWZmZXIKKwkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQ7CisKKwkvKiBvZmZzZXQgaW4gc2VnbWVudCBmb3IgZmlyc3Qgc2VjdG9yIHRvIGJlIGhhbmRsZWQuCisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNlY3Rvcl9vZmZzZXQ7CisKKwkvKiBzaXplIG9mIGNsdXN0ZXIgb2YgZ29vZCBzZWN0b3JzIHRvIGJlIGhhbmRsZWQuCisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNlY3Rvcl9jb3VudDsKKworCS8qIHNpemUgb2YgcmVtYWluaW5nIHBhcnQgb2Ygc2VnbWVudCB0byBiZSBoYW5kbGVkLgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByZW1haW5pbmc7CisKKwkvKiBwb2ludHMgdG8gbmV4dCBzZWdtZW50IChjb250aWd1b3VzKSB0byBiZSBoYW5kbGVkLAorCSAqIG9yIGlzIHplcm8gaWYgbm8gcmVhZC1haGVhZCBpcyBhbGxvd2VkLgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBuZXh0X3NlZ21lbnQ7CisKKwkvKiBmbGFnIGJlaW5nIHNldCBpZiBkZWxldGVkIGRhdGEgd2FzIHJlYWQuCisJICovCisJdm9sYXRpbGUgaW50IGRlbGV0ZWQ7CisKKwkvKiBmbG9wcHkgY29vcmRpbmF0ZXMgb2YgZmlyc3Qgc2VjdG9yIGluIHNlZ21lbnQgKi8KKwl2b2xhdGlsZSBfX3U4IGhlYWQ7CisJdm9sYXRpbGUgX191OCBjeWw7CisJdm9sYXRpbGUgX191OCBzZWN0OworCisJLyogZ2FwIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgKi8KKwlfX3U4IGdhcDM7CisJLyogZmxhZyBzZXQgd2hlbiBidWZmZXIgaXMgbW1hcGVkICovCisJaW50IG1tYXBwZWQ7Cit9IGJ1ZmZlcl9zdHJ1Y3Q7CisKKy8qCisgKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIHZhcmlhYmxlcworICovCitleHRlcm4gdm9sYXRpbGUgZmRjX21vZGVfZW51bSBmZGNfbW9kZTsKK2V4dGVybiBpbnQgZmRjX3NldHVwX2Vycm9yOwkvKiBvdXRkYXRlZCA/Pz8gKi8KK2V4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBmdGFwZV93YWl0X2ludHI7CitleHRlcm4gdm9sYXRpbGUgaW50IGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXI7IC8qIHRyYWNrIG5yIEZEQyB0aGlua3Mgd2UncmUgb24gKi8KK2V4dGVybiB2b2xhdGlsZSBfX3U4IGZkY19oZWFkOwkvKiBGREMgaGVhZCAqLworZXh0ZXJuIHZvbGF0aWxlIF9fdTggZmRjX2N5bDsJLyogRkRDIHRyYWNrICovCitleHRlcm4gdm9sYXRpbGUgX191OCBmZGNfc2VjdDsJLyogRkRDIHNlY3RvciAqLworZXh0ZXJuIGZkY19jb25maWdfaW5mbyBmZGM7CS8qIEZEQyBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX2Jhc2U7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19pcnE7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19kbWE7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY190aHJlc2hvbGQ7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19yYXRlX2xpbWl0OworZXh0ZXJuIGludCBmdF9wcm9iZV9mYzEwOworZXh0ZXJuIGludCBmdF9tYWNoMjsKKy8qCisgKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIGZ1bmN0aW9ucworICovCitleHRlcm4gdm9pZCBmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cyhpbnQgY291bnQpOworZXh0ZXJuIGludCBmZGNfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCk7CitleHRlcm4gaW50IGZkY19jb21tYW5kKGNvbnN0IF9fdTggKiBjbWRfZGF0YSwgaW50IGNtZF9sZW4pOworZXh0ZXJuIGludCBmZGNfcmVzdWx0KF9fdTggKiByZXNfZGF0YSwgaW50IHJlc19sZW4pOworZXh0ZXJuIGludCBmZGNfaW50ZXJydXB0X3dhaXQodW5zaWduZWQgaW50IHRpbWUpOworZXh0ZXJuIGludCBmZGNfc2VlayhpbnQgdHJhY2spOworZXh0ZXJuIGludCBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKGludCAqc3QzKTsKK2V4dGVybiB2b2lkIGZkY19tb3RvcihpbnQgbW90b3IpOworZXh0ZXJuIHZvaWQgZmRjX3Jlc2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmRjX2Rpc2FibGUodm9pZCk7CitleHRlcm4gaW50IGZkY19maWZvX3RocmVzaG9sZChfX3U4IHRocmVzaG9sZCwKKwkJCSAgICAgIGludCAqZmlmb19zdGF0ZSwgaW50ICpsb2NrX3N0YXRlLCBpbnQgKmZpZm9fdGhyKTsKK2V4dGVybiB2b2lkIGZkY193YWl0X2NhbGlicmF0ZSh2b2lkKTsKK2V4dGVybiBpbnQgZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoaW50ICpzdDAsIGludCAqY3VycmVudF9jeWxpbmRlcik7CitleHRlcm4gdm9pZCBmZGNfc2F2ZV9kcml2ZV9zcGVjcyh2b2lkKTsKK2V4dGVybiB2b2lkIGZkY19yZXN0b3JlX2RyaXZlX3NwZWNzKHZvaWQpOworZXh0ZXJuIGludCBmZGNfc2V0X2RhdGFfcmF0ZShpbnQgcmF0ZSk7CitleHRlcm4gdm9pZCBmZGNfc2V0X3dyaXRlX3ByZWNvbXAoaW50IHByZWNvbXApOworZXh0ZXJuIGludCBmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSh2b2lkKTsKK2V4dGVybiB2b2lkIGZkY19yZWxlYXNlX3JlZ2lvbnModm9pZCk7CitleHRlcm4gaW50IGZkY19pbml0KHZvaWQpOworZXh0ZXJuIGludCBmZGNfc2V0dXBfcmVhZF93cml0ZShidWZmZXJfc3RydWN0ICogYnVmZiwgX191OCBvcGVyYXRpb24pOworZXh0ZXJuIGludCBmZGNfc2V0dXBfZm9ybWF0dGluZyhidWZmZXJfc3RydWN0ICogYnVmZik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmJjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5jCkBAIC0wLDAgKzEsMTE3MCBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMsdiAkCisgKiAkUmV2aXNpb246IDEuOSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8xNyAyMzowMTo1MyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgYW5kCisgKiAgICAgIGFzc29jaWF0ZWQgY29kZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyCisgKiAgICAgICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgdm9sYXRpbGUJCS8qICovCisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaXNyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCit2b2xhdGlsZSBpbnQgZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0czsKK3ZvbGF0aWxlIGludCBmdF9pbnRlcnJ1cHRfc2VlbjsKK3ZvbGF0aWxlIGludCBmdF9zZWVrX2NvbXBsZXRlZDsKK3ZvbGF0aWxlIGludCBmdF9oaWRlX2ludGVycnVwdDsKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlub19lcnJvciA9IDAsIGlkX2FtX2Vycm9yID0gMHgwMSwgaWRfY3JjX2Vycm9yID0gMHgwMiwKKwlkYXRhX2FtX2Vycm9yID0gMHgwNCwgZGF0YV9jcmNfZXJyb3IgPSAweDA4LAorCW5vX2RhdGFfZXJyb3IgPSAweDEwLCBvdmVycnVuX2Vycm9yID0gMHgyMCwKK30gZXJyb3JfY2F1c2U7CitzdGF0aWMgaW50IHN0b3BfcmVhZF9haGVhZDsKKworCitzdGF0aWMgdm9pZCBwcmludF9lcnJvcl9jYXVzZShpbnQgY2F1c2UpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXN3aXRjaCAoY2F1c2UpIHsKKwljYXNlIG5vX2RhdGFfZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJubyBkYXRhIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgaWRfYW1fZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJpZCBhbSBlcnJvciIpOworCQlicmVhazsKKwljYXNlIGlkX2NyY19lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlkIGNyYyBlcnJvciIpOworCQlicmVhazsKKwljYXNlIGRhdGFfYW1fZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkYXRhIGFtIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkYXRhIGNyYyBlcnJvciIpOworCQlicmVhazsKKwljYXNlIG92ZXJydW5fZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJvdmVycnVuIGVycm9yIik7CisJCWJyZWFrOworCWRlZmF1bHQ6OworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgY2hhciAqZmRjX21vZGVfdHh0KGZkY19tb2RlX2VudW0gbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIGZkY19pZGxlOgorCQlyZXR1cm4gImZkY19pZGxlIjsKKwljYXNlIGZkY19yZWFkaW5nX2RhdGE6CisJCXJldHVybiAiZmRjX3JlYWRpbmdfZGF0YSI7CisJY2FzZSBmZGNfc2Vla2luZzoKKwkJcmV0dXJuICJmZGNfc2Vla2luZyI7CisJY2FzZSBmZGNfd3JpdGluZ19kYXRhOgorCQlyZXR1cm4gImZkY193cml0aW5nX2RhdGEiOworCWNhc2UgZmRjX3JlYWRpbmdfaWQ6CisJCXJldHVybiAiZmRjX3JlYWRpbmdfaWQiOworCWNhc2UgZmRjX3JlY2FsaWJyYXRpbmc6CisJCXJldHVybiAiZmRjX3JlY2FsaWJyYXRpbmciOworCWNhc2UgZmRjX2Zvcm1hdHRpbmc6CisJCXJldHVybiAiZmRjX2Zvcm1hdHRpbmciOworCWNhc2UgZmRjX3ZlcmlmeWluZzoKKwkJcmV0dXJuICJmZGNfdmVyaWZ5aW5nIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGlubGluZSBlcnJvcl9jYXVzZSBkZWNvZGVfaXJxX2NhdXNlKGZkY19tb2RlX2VudW0gbW9kZSwgX191OCBzdFtdKQoreworCWVycm9yX2NhdXNlIGNhdXNlID0gbm9fZXJyb3I7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBWYWxpZCBzdFtdLCBkZWNvZGUgY2F1c2Ugb2YgaW50ZXJydXB0LgorCSAqLworCXN3aXRjaCAoc3RbMF0gJiBTVDBfSU5UX01BU0spIHsKKwljYXNlIEZEQ19JTlRfTk9STUFMOgorCQlUUkFDRShmdF90X2ZkY19kbWEsIm5vcm1hbCBjb21wbGV0aW9uOiAlcyIsZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJYnJlYWs7CisJY2FzZSBGRENfSU5UX0FCTk9STUFMOgorCQlUUkFDRShmdF90X2Zsb3csICJhYm5vcm1hbCBjb21wbGV0aW9uICVzIiwgZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiU1QwOiAweCUwMngsIFNUMTogMHglMDJ4LCBTVDI6IDB4JTAyeCIsCisJCSAgICAgIHN0WzBdLCBzdFsxXSwgc3RbMl0pOworCQlUUkFDRShmdF90X2ZkY19kbWEsCisJCSAgICAgICJDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4LCBOOiAweCUwMngiLAorCQkgICAgICBzdFszXSwgc3RbNF0sIHN0WzVdLCBzdFs2XSk7CisJCWlmIChzdFsxXSAmIDB4MDEpIHsKKwkJCWlmIChzdFsyXSAmIDB4MDEpIHsKKwkJCQljYXVzZSA9IGRhdGFfYW1fZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCWNhdXNlID0gaWRfYW1fZXJyb3I7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RbMV0gJiAweDIwKSB7CisJCQlpZiAoc3RbMl0gJiAweDIwKSB7CisJCQkJY2F1c2UgPSBkYXRhX2NyY19lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJY2F1c2UgPSBpZF9jcmNfZXJyb3I7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RbMV0gJiAweDA0KSB7CisJCQljYXVzZSA9IG5vX2RhdGFfZXJyb3I7CisJCX0gZWxzZSBpZiAoc3RbMV0gJiAweDEwKSB7CisJCQljYXVzZSA9IG92ZXJydW5fZXJyb3I7CisJCX0KKwkJcHJpbnRfZXJyb3JfY2F1c2UoY2F1c2UpOworCQlicmVhazsKKwljYXNlIEZEQ19JTlRfSU5WQUxJRDoKKwkJVFJBQ0UoZnRfdF9mbG93LCAiaW52YWxpZCBjb21wbGV0aW9uICVzIiwgZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJYnJlYWs7CisJY2FzZSBGRENfSU5UX1JFQURZQ0g6CisJCWlmIChzdFswXSAmIFNUMF9TRUVLX0VORCkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAiZHJpdmUgcG9sbCBjb21wbGV0ZWQiKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInJlYWR5IGNoYW5nZSAlcyIsZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJVFJBQ0VfRVhJVCBjYXVzZTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2hpc3RvcnkoZXJyb3JfY2F1c2UgY2F1c2UpCit7CisJc3dpdGNoIChjYXVzZSkgeworCWNhc2UgaWRfYW1fZXJyb3I6CisJCWZ0X2hpc3RvcnkuaWRfYW1fZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2UgaWRfY3JjX2Vycm9yOgorCQlmdF9oaXN0b3J5LmlkX2NyY19lcnJvcnMrKzsKKwkJYnJlYWs7CisJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQlmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCWZ0X2hpc3RvcnkuZGF0YV9jcmNfZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycysrOworCQlicmVhazsKKwljYXNlIG5vX2RhdGFfZXJyb3I6CisJCWZ0X2hpc3Rvcnkubm9fZGF0YV9lcnJvcnMrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDo7CisJfQorfQorCitzdGF0aWMgdm9pZCBza2lwX2JhZF9zZWN0b3IoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBNYXJrIHNlY3RvciBhcyBzb2Z0IGVycm9yIGFuZCBza2lwIGl0CisJICovCisJaWYgKGJ1ZmYtPnJlbWFpbmluZyA+IDApIHsKKwkJKytidWZmLT5zZWN0b3Jfb2Zmc2V0OworCQkrK2J1ZmYtPmRhdGFfb2Zmc2V0OworCQktLWJ1ZmYtPnJlbWFpbmluZzsKKwkJYnVmZi0+cHRyICs9IEZUX1NFQ1RPUl9TSVpFOworCQlidWZmLT5iYWRfc2VjdG9yX21hcCA+Pj0gMTsKKwl9IGVsc2UgeworCQkvKiAgSGV5LCB3aGF0IGlzIHRoaXM/Pz8/Pz8/Pz8/Pz8/IEMgY29kZTogaWYgd2Ugc2hpZnQgCisJCSAqICBtb3JlIHRoYW4gMzEgYml0cywgd2UgZ2V0IG5vIHNoaWZ0LiBUaGF0J3MgYmFkISEhISEhCisJCSAqLworCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7CS8qIGhhY2sgZm9yIGVycm9yIG1hcHMgKi8KKwkJVFJBQ0UoZnRfdF93YXJuLCAic2tpcHBpbmcgbGFzdCBzZWN0b3IgaW4gc2VnbWVudCIpOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZXJyb3JfbWFwcyhidWZmZXJfc3RydWN0ICogYnVmZiwgdW5zaWduZWQgaW50IGVycm9yX29mZnNldCkKK3sKKwlpbnQgaGFyZCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChidWZmLT5yZXRyeSA8IEZUX1NPRlRfUkVUUklFUykgeworCQlidWZmLT5zb2Z0X2Vycm9yX21hcCB8PSAoMSA8PCBlcnJvcl9vZmZzZXQpOworCX0gZWxzZSB7CisJCWJ1ZmYtPmhhcmRfZXJyb3JfbWFwIHw9ICgxIDw8IGVycm9yX29mZnNldCk7CisJCWJ1ZmYtPnNvZnRfZXJyb3JfbWFwICY9IH5idWZmLT5oYXJkX2Vycm9yX21hcDsKKwkJYnVmZi0+cmV0cnkgPSAtMTsgIC8qIHdpbGwgYmUgc2V0IHRvIDAgaW4gc2V0dXBfc2VnbWVudCAqLworCQloYXJkID0gMTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgInNlY3RvciAlZCA6ICVzIGVycm9yXG4iCisJICAgICAgS0VSTl9JTkZPICJoYXJkIG1hcDogMHglMDhseFxuIgorCSAgICAgIEtFUk5fSU5GTyAic29mdCBtYXA6IDB4JTA4bHgiLAorCSAgICAgIEZUX1NFQ1RPUihlcnJvcl9vZmZzZXQpLCBoYXJkID8gImhhcmQiIDogInNvZnQiLAorCSAgICAgIChsb25nKSBidWZmLT5oYXJkX2Vycm9yX21hcCwgKGxvbmcpIGJ1ZmYtPnNvZnRfZXJyb3JfbWFwKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLCBlcnJvcl9jYXVzZSBjYXVzZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoIChjYXVzZSkgeworCWNhc2Ugbm9fZXJyb3I6IAorCQlUUkFDRShmdF90X2Zsb3csIiVkIFNlY3RvcihzKSB0cmFuc2ZlcnJlZCIsIGJ1ZmYtPnNlY3Rvcl9jb3VudCk7CisJCWJyZWFrOworCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9mbG93LCAiU2VjdG9yICVkIG5vdCBmb3VuZCIsCisJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0KSk7CisJCWJyZWFrOworCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJLyogIGdvdCBhbiBvdmVycnVuIGVycm9yIG9uIHRoZSBmaXJzdCBieXRlLCBtdXN0IGJlIGEKKwkJICogIGhhcmR3YXJlIHByb2JsZW0KKwkJICovCisJCVRSQUNFKGZ0X3RfYnVnLAorCQkgICAgICAiVW5leHBlY3RlZCBlcnJvcjogZmFpbGluZyBETUEgb3IgRkRDIGNvbnRyb2xsZXIgPyIpOworCQlicmVhazsKKwljYXNlIGRhdGFfY3JjX2Vycm9yOgorCQlUUkFDRShmdF90X2Zsb3csICJFcnJvciBpbiBzZWN0b3IgJWQiLAorCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCAtIDEpKTsKKwkJYnJlYWs7CisJY2FzZSBpZF9jcmNfZXJyb3I6CisJY2FzZSBpZF9hbV9lcnJvcjoKKwljYXNlIGRhdGFfYW1fZXJyb3I6CisJCVRSQUNFKGZ0X3RfZmxvdywgIkVycm9yIGluIHNlY3RvciAlZCIsCisJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3RfZmxvdywgIlVuZXhwZWN0ZWQgZXJyb3IgYXQgc2VjdG9yICVkIiwKKwkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpKTsKKwkJYnJlYWs7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qCisgKiAgRXJyb3IgY2F1c2U6ICAgQW1vdW50IHhmZXJyZWQ6ICBBY3Rpb246CisgKgorICogIGlkX2FtX2Vycm9yICAgICAgICAgMCAgICAgICAgICAgbWFyayBiYWQgYW5kIHNraXAKKyAqICBpZF9jcmNfZXJyb3IgICAgICAgIDAgICAgICAgICAgIG1hcmsgYmFkIGFuZCBza2lwCisgKiAgZGF0YV9hbV9lcnJvciAgICAgICAwICAgICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcAorICogIGRhdGFfY3JjX2Vycm9yICAgICUgMTAyNCAgICAgICAgbWFyayBiYWQgYW5kIHNraXAKKyAqICBub19kYXRhX2Vycm9yICAgICAgIDAgICAgICAgICAgIHJldHJ5IG9uIHdyaXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcCBvbiByZWFkCisgKiAgb3ZlcnJ1bl9lcnJvciAgWyAwLi5hbGwtMSBdICAgICBtYXJrIGJhZCBhbmQgc2tpcAorICogIG5vX2Vycm9yICAgICAgICAgICBhbGwgICAgICAgICAgY29udGludWUKKyAqLworCisvKiAgdGhlIGFyZyBgc2VjdG9yJyBpcyByZXR1cm5lZCBieSB0aGUgZmRjIGFuZCB0ZWxscyB1cyBhdCB3aGljaCBzZWN0b3Igd2UKKyAqICBhcmUgcG9zaXRpb25lZCBhdCAocmVsYXRpdmUgdG8gc3RhcnRpbmcgc2VjdG9yIG9mIHNlZ21lbnQpCisgKi8KK3N0YXRpYyB2b2lkIGRldGVybWluZV92ZXJpZnlfcHJvZ3Jlc3MoYnVmZmVyX3N0cnVjdCAqYnVmZiwKKwkJCQkgICAgICBlcnJvcl9jYXVzZSBjYXVzZSwKKwkJCQkgICAgICBfX3U4IHNlY3RvcikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGNhdXNlID09IG5vX2Vycm9yICYmIHNlY3RvciA9PSAxKSB7CisJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOworCQlidWZmLT5yZW1haW5pbmcgICAgID0gMDsKKwkJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfZmxvdykgeworCQkJcHJpbnRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpOworCQl9CisJfSBlbHNlIHsKKwkJYnVmZi0+c2VjdG9yX29mZnNldCA9IHNlY3RvciAtIGJ1ZmYtPnNlY3Q7CisJCWJ1ZmYtPnJlbWFpbmluZyA9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBidWZmLT5zZWN0b3Jfb2Zmc2V0OworCQlUUkFDRShmdF90X25vaXNlLCAiJXNzZWN0b3Igb2Zmc2V0OiAweCUwNHgiLCAKKwkJICAgICAgKGNhdXNlID09IG5vX2Vycm9yKSA/ICJ1bmV4cGVjdGVkICIgOiAiIiwKKwkJICAgICAgYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBvdmVycnVuX2Vycm9yOgorCQkJYnJlYWs7CisjaWYgMAorCQljYXNlIG5vX2RhdGFfZXJyb3I6CisJCQlidWZmLT5yZXRyeSA9IEZUX1NPRlRfUkVUUklFUzsKKwkJCWlmIChidWZmLT5oYXJkX2Vycm9yX21hcCAgICAmJgorCQkJICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPiAxICYmCisJCQkgICAgKGJ1ZmYtPmhhcmRfZXJyb3JfbWFwICYgCisJCQkgICAgICgxIDw8IChidWZmLT5zZWN0b3Jfb2Zmc2V0LTIpKSkpIHsKKwkJCQlidWZmLT5yZXRyeSAtLTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlidWZmLT5yZXRyeSA9IEZUX1NPRlRfUkVUUklFUzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2Zsb3cpIHsKKwkJCXByaW50X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKTsKKwkJfQorCQkvKiAgU2VjdG9yX29mZnNldCBwb2ludHMgdG8gdGhlIHByb2JsZW0gYXJlYSBOb3cgYWRqdXN0CisJCSAqICBzZWN0b3Jfb2Zmc2V0IHNvIGl0IGFsd2F5cyBwb2ludHMgb25lIHBhc3QgaGUgZmFpbGluZworCQkgKiAgc2VjdG9yLiBJLmUuIHNraXAgdGhlIGJhZCBzZWN0b3IuCisJCSAqLworCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCS0tYnVmZi0+cmVtYWluaW5nOworCQl1cGRhdGVfZXJyb3JfbWFwcyhidWZmLCBidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGRldGVybWluZV9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLAorCQkJICAgICAgIGVycm9yX2NhdXNlIGNhdXNlLAorCQkJICAgICAgIF9fdTggc2VjdG9yKQoreworCXVuc2lnbmVkIGludCBkbWFfcmVzaWR1ZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFVzaW5nIGxlc3MgcHJlZmVycmVkIG9yZGVyIG9mIGRpc2FibGVfZG1hIGFuZAorCSAqICBnZXRfZG1hX3Jlc2lkdWUgYmVjYXVzZSB0aGlzIHNlZW1zIHRvIGZhaWwgb24gYXQgbGVhc3Qgb25lCisJICogIHN5c3RlbSBpZiByZXZlcnNlZCEKKwkgKi8KKwlkbWFfcmVzaWR1ZSA9IGdldF9kbWFfcmVzaWR1ZShmZGMuZG1hKTsKKwlkaXNhYmxlX2RtYShmZGMuZG1hKTsKKwlpZiAoY2F1c2UgIT0gbm9fZXJyb3IgfHwgZG1hX3Jlc2lkdWUgIT0gMCkgeworCQlUUkFDRShmdF90X25vaXNlLCAiJXNETUEgcmVzaWR1ZTogMHglMDR4IiwgCisJCSAgICAgIChjYXVzZSA9PSBub19lcnJvcikgPyAidW5leHBlY3RlZCAiIDogIiIsCisJCSAgICAgIGRtYV9yZXNpZHVlKTsKKwkJLyogYWRqdXN0IHRvIGFjdHVhbCB2YWx1ZTogKi8KKwkJaWYgKGRtYV9yZXNpZHVlID09IDApIHsKKwkJCS8qIHRoaXMgaGFwcGVucyBzb21ldGltZXMgd2l0aCBvdmVycnVuIGVycm9ycy4KKwkJCSAqIEkgZG9uJ3Qga25vdyB3aGV0aGVyIHdlIGNvdWxkIGlnbm9yZSB0aGUKKwkJCSAqIG92ZXJydW4gZXJyb3IuIFBsYXkgc2F2ZS4KKwkJCSAqLworCQkJYnVmZi0+c2VjdG9yX2NvdW50IC0tOworCQl9IGVsc2UgeworCQkJYnVmZi0+c2VjdG9yX2NvdW50IC09ICgoZG1hX3Jlc2lkdWUgKyAKKwkJCQkJCShGVF9TRUNUT1JfU0laRSAtIDEpKSAvCisJCQkJCSAgICAgICBGVF9TRUNUT1JfU0laRSk7CisJCX0KKwl9CisJLyogIFVwZGF0ZSB2YXIncyBpbmZsdWVuY2VkIGJ5IHRoZSBETUEgb3BlcmF0aW9uLgorCSAqLworCWlmIChidWZmLT5zZWN0b3JfY291bnQgPiAwKSB7CisJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgICArPSBidWZmLT5zZWN0b3JfY291bnQ7CisJCWJ1ZmYtPmRhdGFfb2Zmc2V0ICAgICArPSBidWZmLT5zZWN0b3JfY291bnQ7CisJCWJ1ZmYtPnB0ciAgICAgICAgICAgICArPSAoYnVmZi0+c2VjdG9yX2NvdW50ICoKKwkJCQkJICBGVF9TRUNUT1JfU0laRSk7CisJCWJ1ZmYtPnJlbWFpbmluZyAgICAgICAtPSBidWZmLT5zZWN0b3JfY291bnQ7CisJCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID4+PSBidWZmLT5zZWN0b3JfY291bnQ7CisJfQorCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2Zsb3cpIHsKKwkJcHJpbnRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpOworCX0KKwlpZiAoY2F1c2UgIT0gbm9fZXJyb3IpIHsKKwkJaWYgKGJ1ZmYtPnJlbWFpbmluZyA9PSAwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJmb28/XG4iCisJCQkgICAgICBLRVJOX0lORk8gImNvdW50IDogJWRcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAib2Zmc2V0OiAlZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICJzb2Z0ICA6ICUwOHhcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAiaGFyZCAgOiAlMDh4IiwKKwkJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9jb3VudCwKKwkJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQsCisJCQkgICAgICBidWZmLT5zb2Z0X2Vycm9yX21hcCwKKwkJCSAgICAgIGJ1ZmYtPmhhcmRfZXJyb3JfbWFwKTsKKwkJfQorCQkvKiAgU2VjdG9yX29mZnNldCBwb2ludHMgdG8gdGhlIHByb2JsZW0gYXJlYSwgZXhjZXB0IGlmIHdlIGdvdAorCQkgKiAgYSBkYXRhX2NyY19lcnJvci4gSW4gdGhhdCBjYXNlIGl0IHBvaW50cyBvbmUgcGFzdCB0aGUKKwkJICogIGZhaWxpbmcgc2VjdG9yLgorCQkgKgorCQkgKiAgTm93IGFkanVzdCBzZWN0b3Jfb2Zmc2V0IHNvIGl0IGFsd2F5cyBwb2ludHMgb25lIHBhc3QgaGUKKwkJICogIGZhaWxpbmcgc2VjdG9yLiBJLmUuIHNraXAgdGhlIGJhZCBzZWN0b3IuICAKKwkJICovCisJCWlmIChjYXVzZSAhPSBkYXRhX2NyY19lcnJvcikgeworCQkJc2tpcF9iYWRfc2VjdG9yKGJ1ZmYpOworCQl9CisJCXVwZGF0ZV9lcnJvcl9tYXBzKGJ1ZmYsIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIGludCBjYWxjX3N0ZXBzKGludCBjbWQpCit7CisJaWYgKGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPiBjbWQpIHsKKwkJcmV0dXJuIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgLSBjbWQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgKyBjbWQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBwYXVzZV90YXBlKGludCByZXRyeSwgaW50IG1vZGUpCit7CisJaW50IHJlc3VsdDsKKwlfX3U4IG91dFszXSA9IHtGRENfU0VFSywgZnRfZHJpdmVfc2VsLCAwfTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFdlJ2xsIHVzZSBhIHJhdyBzZWVrIGNvbW1hbmQgdG8gZ2V0IHRoZSB0YXBlIHRvIHJld2luZCBhbmQKKwkgKiAgc3RvcCBmb3IgYSByZXRyeS4KKwkgKi8KKwkrK2Z0X2hpc3RvcnkucmV3aW5kczsKKwlpZiAocWljMTE3X2NtZHNbZnRhcGVfY3VycmVudF9jb21tYW5kXS5ub25faW50cikgeworCQlUUkFDRShmdF90X3dhcm4sICJtb3Rpb24gY29tbWFuZCBtYXkgYmUgaXNzdWVkIHRvbyBzb29uIik7CisJfQorCWlmIChyZXRyeSAmJiAobW9kZSA9PSBmZGNfcmVhZGluZ19kYXRhIHx8CisJCSAgICAgIG1vZGUgPT0gZmRjX3JlYWRpbmdfaWQgICB8fAorCQkgICAgICBtb2RlID09IGZkY192ZXJpZnlpbmcpKSB7CisJCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IFFJQ19NSUNST19TVEVQX1BBVVNFOworCQlmdGFwZV9taWdodF9iZV9vZmZfdHJhY2sgPSAxOworCX0gZWxzZSB7CisJCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IFFJQ19QQVVTRTsKKwl9CisJb3V0WzJdID0gY2FsY19zdGVwcyhmdGFwZV9jdXJyZW50X2NvbW1hbmQpOworCXJlc3VsdCA9IGZkY19jb21tYW5kKG91dCwgMyk7IC8qIGlzc3VlIFFJQ18xMTcgY29tbWFuZCAqLworCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSBvdXRbIDJdOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJxaWMtcGF1c2UgZmFpbGVkLCBzdGF0dXMgPSAlZCIsIHJlc3VsdCk7CisJfSBlbHNlIHsKKwkJZnRfbG9jYXRpb24ua25vd24gID0gMDsKKwkJZnRfcnVubmVyX3N0YXR1cyAgID0gaWRsZTsKKwkJZnRfaGlkZV9pbnRlcnJ1cHQgICAgID0gMTsKKwkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgY29udGludWVfeGZlcihidWZmZXJfc3RydWN0ICpidWZmLAorCQkJICBmZGNfbW9kZV9lbnVtIG1vZGUsIAorCQkJICB1bnNpZ25lZCBpbnQgc2tpcCkKK3sKKwlpbnQgd3JpdGUgPSAwOworIAlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKG1vZGUgPT0gZmRjX3dyaXRpbmdfZGF0YSB8fCBtb2RlID09IGZkY19kZWxldGluZykgeworCQl3cml0ZSA9IDE7CisJfQorCS8qICBUaGlzIHBhcnQgY2FuIGJlIHJlbW92ZWQgaWYgaXQgbmV2ZXIgaGFwcGVucworCSAqLworCWlmIChza2lwID4gMCAmJgorCSAgICAoZnRfcnVubmVyX3N0YXR1cyAhPSBydW5uaW5nIHx8CisJICAgICAod3JpdGUgJiYgKGJ1ZmYtPnN0YXR1cyAhPSB3cml0aW5nKSkgfHwKKwkgICAgICghd3JpdGUgJiYgKGJ1ZmYtPnN0YXR1cyAhPSByZWFkaW5nICYmIAorCQkJIGJ1ZmYtPnN0YXR1cyAhPSB2ZXJpZnlpbmcpKSkpIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJ1bmV4cGVjdGVkIHJ1bm5lci9idWZmZXIgc3RhdGUgJWQvJWQiLAorCQkgICAgICBmdF9ydW5uZXJfc3RhdHVzLCBidWZmLT5zdGF0dXMpOworCQlidWZmLT5zdGF0dXMgPSBlcnJvcjsKKwkJLyogZmluaXNoIHRoaXMgYnVmZmVyOiAqLworCQkodm9pZClmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7CisJfSBlbHNlIGlmIChidWZmLT5yZW1haW5pbmcgPiAwICYmIGZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGJ1ZmYpID4gMCkgeworCQkvKiAgc3RpbGwgc2VjdG9ycyBsZWZ0IGluIGN1cnJlbnQgc2VnbWVudCwgY29udGludWUKKwkJICogIHdpdGggdGhpcyBzZWdtZW50CisJCSAqLworCQlpZiAoZmRjX3NldHVwX3JlYWRfd3JpdGUoYnVmZiwgbW9kZSkgPCAwKSB7CisJCQkvKiBmYWlsZWQsIGFib3J0IG9wZXJhdGlvbgorCQkJICovCisJCQlidWZmLT5ieXRlcyA9IGJ1ZmYtPnB0ciAtIGJ1ZmYtPmFkZHJlc3M7CisJCQlidWZmLT5zdGF0dXMgPSBlcnJvcjsKKwkJCS8qIGZpbmlzaCB0aGlzIGJ1ZmZlcjogKi8KKwkJCSh2b2lkKWZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQl9CisJfSBlbHNlIHsKKwkJLyogY3VycmVudCBzZWdtZW50IGNvbXBsZXRlZAorCQkgKi8KKwkJdW5zaWduZWQgaW50IGxhc3Rfc2VnbWVudCA9IGJ1ZmYtPnNlZ21lbnRfaWQ7CisJCWludCBlb3QgPSAoKGxhc3Rfc2VnbWVudCArIDEpICUgZnRfc2VnbWVudHNfcGVyX3RyYWNrKSA9PSAwOworCQl1bnNpZ25lZCBpbnQgbmV4dCA9IGJ1ZmYtPm5leHRfc2VnbWVudDsJLyogMCBtZWFucyBzdG9wICEgKi8KKworCQlidWZmLT5ieXRlcyA9IGJ1ZmYtPnB0ciAtIGJ1ZmYtPmFkZHJlc3M7CisJCWJ1ZmYtPnN0YXR1cyA9IGRvbmU7CisJCWJ1ZmYgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJaWYgKGVvdCkgeworCQkJLyogIGZpbmlzaGVkIGxhc3Qgc2VnbWVudCBvbiBjdXJyZW50IHRyYWNrLAorCQkJICogIGNhbid0IGNvbnRpbnVlCisJCQkgKi8KKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBsb2dpY2FsX2VvdDsKKwkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJaWYgKG5leHQgPD0gMCkgeworCQkJLyogIGRvbid0IGNvbnRpbnVlIHdpdGggbmV4dCBzZWdtZW50CisJCQkgKi8KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJubyAlcyBhbGxvd2VkLCBzdG9wcGluZyB0YXBlIiwKKwkJCSAgICAgICh3cml0ZSkgPyAid3JpdGUgbmV4dCIgOiAicmVhZCBhaGVhZCIpOworCQkJcGF1c2VfdGFwZSgwLCBtb2RlKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOyAgLyogIG5vdCBxdWl0ZSB0cnVlIHVudGlsCisJCQkJCQkgICAqICBuZXh0IGlycSAKKwkJCQkJCSAgICovCisJCQlUUkFDRV9FWElUOworCQl9CisJCS8qICBjb250aW51ZSB3aXRoIG5leHQgc2VnbWVudAorCQkgKi8KKwkJaWYgKGJ1ZmYtPnN0YXR1cyAhPSB3YWl0aW5nKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiYWxsIGlucHV0IGJ1ZmZlcnMgJXMsIHBhdXNpbmcgdGFwZSIsCisJCQkgICAgICAod3JpdGUpID8gImVtcHR5IiA6ICJmdWxsIik7CisJCQlwYXVzZV90YXBlKDAsIG1vZGUpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGlkbGU7ICAvKiAgbm90IHF1aXRlIHRydWUgdW50aWwKKwkJCQkJCSAgICogIG5leHQgaXJxIAorCQkJCQkJICAgKi8KKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJaWYgKHdyaXRlICYmIG5leHQgIT0gYnVmZi0+c2VnbWVudF9pZCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgCisJCQkgICAgICAic2VnbWVudHMgb3V0IG9mIG9yZGVyLCBhYm9ydGluZyB3cml0ZSIpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChidWZmLCBuZXh0LCAwKTsKKwkJaWYgKHN0b3BfcmVhZF9haGVhZCkgeworCQkJYnVmZi0+bmV4dF9zZWdtZW50ID0gMDsKKwkJCXN0b3BfcmVhZF9haGVhZCA9IDA7CisJCX0KKwkJaWYgKGZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGJ1ZmYpID09IDAgfHwKKwkJICAgIGZkY19zZXR1cF9yZWFkX3dyaXRlKGJ1ZmYsIG1vZGUpICE9IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiY291bGRuJ3Qgc3RhcnQgJXMtYWhlYWQiLAorCQkJICAgICAgd3JpdGUgPyAid3JpdGUiIDogInJlYWQiKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKKwkJfSBlbHNlIHsKKwkJCS8qIGtlZXAgb24gZ29pbmcgKi8KKwkJCXN3aXRjaCAoZnRfZHJpdmVyX3N0YXRlKSB7CisJCQljYXNlICAgcmVhZGluZzogYnVmZi0+c3RhdHVzID0gcmVhZGluZzsgICBicmVhazsKKwkJCWNhc2UgdmVyaWZ5aW5nOiBidWZmLT5zdGF0dXMgPSB2ZXJpZnlpbmc7IGJyZWFrOworCQkJY2FzZSAgIHdyaXRpbmc6IGJ1ZmYtPnN0YXR1cyA9IHdyaXRpbmc7ICAgYnJlYWs7CisJCQljYXNlICBkZWxldGluZzogYnVmZi0+c3RhdHVzID0gZGVsZXRpbmc7ICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJVFJBQ0UoZnRfdF9lcnIsIAorCQkgICAgICAiQlVHOiBmdF9kcml2ZXJfc3RhdGUgJWQgc2hvdWxkIGJlIG9uZSBvdXQgb2YgIgorCQkgICAgICAie3JlYWRpbmcsIHdyaXRpbmcsIHZlcmlmeWluZywgZGVsZXRpbmd9IiwKKwkJCQkgICAgICBmdF9kcml2ZXJfc3RhdGUpOworCQkJCWJ1ZmYtPnN0YXR1cyA9IHdyaXRlID8gd3JpdGluZyA6IHJlYWRpbmc7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgcmV0cnlfc2VjdG9yKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIAorCQkJIGludCBtb2RlLAorCQkJIHVuc2lnbmVkIGludCBza2lwKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiJXMgZXJyb3IsIHdpbGwgcmV0cnkiLAorCSAgICAgIChtb2RlID09IGZkY193cml0aW5nX2RhdGEgfHwgbW9kZSA9PSBmZGNfZGVsZXRpbmcpID8gIndyaXRlIiA6ICJyZWFkIik7CisJcGF1c2VfdGFwZSgxLCBtb2RlKTsKKwlmdF9ydW5uZXJfc3RhdHVzID0gYWJvcnRpbmc7CisJYnVmZi0+c3RhdHVzICAgICA9IGVycm9yOworCWJ1ZmYtPnNraXAgICAgICAgPSBza2lwOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9yZXN1bWVfcG9pbnQoYnVmZmVyX3N0cnVjdCAqYnVmZikKK3sKKwlpbnQgaSA9IDA7CisJU2VjdG9yTWFwIG1hc2s7CisJU2VjdG9yTWFwIG1hcDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCB2YXJpYWJsZXMgaGF2ZSBiZWVuCisJICogIHVwZGF0ZWQgdG8gcG9pbnQgcGFzdCB0aGUgZmFpbGluZyBzZWN0b3IuCisJICogIElmIHRoZXJlIGFyZSBhbnkgc29mdCBlcnJvcnMgYmVmb3JlIHRoZSBmYWlsaW5nIHNlY3RvciwKKwkgKiAgZmluZCB0aGUgZmlyc3Qgc29mdCBlcnJvciBhbmQgcmV0dXJuIHRoZSBzZWN0b3Igb2Zmc2V0LgorCSAqICBPdGhlcndpc2UgZmluZCB0aGUgbGFzdCBoYXJkIGVycm9yLgorCSAqICBOb3RlOiB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBoYXJkIG9yIHNvZnQgZXJyb3IgIQorCSAqLworCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0IDwgMSB8fCBidWZmLT5zZWN0b3Jfb2Zmc2V0ID4gMzIpIHsKKwkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IHNlY3Rvcl9vZmZzZXQgPSAlZCIsCisJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpOworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0ID49IDMyKSB7IC8qIEMtbGltaXRhdGlvbiBvbiBzaGlmdCAhICovCisJCW1hc2sgPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCW1hc2sgPSAoMSA8PCBidWZmLT5zZWN0b3Jfb2Zmc2V0KSAtIDE7CisJfQorCW1hcCA9IGJ1ZmYtPnNvZnRfZXJyb3JfbWFwICYgbWFzazsKKwlpZiAobWFwKSB7CisJCXdoaWxlICgobWFwICYgKDEgPDwgaSkpID09IDApIHsKKwkJCSsraTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiYXQgc2VjdG9yICVkIiwgRlRfU0VDVE9SKGkpKTsKKwl9IGVsc2UgeworCQltYXAgPSBidWZmLT5oYXJkX2Vycm9yX21hcCAmIG1hc2s7CisJCWkgPSBidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMTsKKwkJaWYgKG1hcCkgeworCQkJd2hpbGUgKChtYXAgJiAoMSA8PCBpKSkgPT0gMCkgeworCQkJCS0taTsKKwkJCX0KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhZnRlciBzZWN0b3IgJWQiLCBGVF9TRUNUT1IoaSkpOworCQkJKytpOyAvKiBmaXJzdCBzZWN0b3IgYWZ0ZXIgbGFzdCBoYXJkIGVycm9yICovCisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2J1ZywgIkJVRzogbm8gc29mdCBvciBoYXJkIGVycm9ycyIpOworCQl9CisJfQorCVRSQUNFX0VYSVQgaTsKK30KKworLyogIGNoZWNrIHBvc3NpYmxlIGRtYSByZXNpZHVlIHdoZW4gZm9ybWF0dGluZywgdXBkYXRlIHBvc2l0aW9uIHJlY29yZCBpbgorICogIGJ1ZmZlciBzdHJ1Y3QuIFRoaXMgaXMsIG9mIGNvdXJzZSwgbW9kZWxsZWQgYWZ0ZXIgZGV0ZXJtaW5lX3Byb2dyZXNzKCksIGJ1dAorICogIHdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIGZvciByZXRyaWVzIGJlY2F1c2UgdGhlIGZvcm1hdCBwcm9jZXNzIGNhbm5vdCBiZQorICogIGludGVycnVwdGVkIChleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgdGFwZSB0cmFjaykuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX2ZtdF9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLCBlcnJvcl9jYXVzZSBjYXVzZSkKK3sKKwl1bnNpZ25lZCBpbnQgZG1hX3Jlc2lkdWU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBVc2luZyBsZXNzIHByZWZlcnJlZCBvcmRlciBvZiBkaXNhYmxlX2RtYSBhbmQKKwkgKiAgZ2V0X2RtYV9yZXNpZHVlIGJlY2F1c2UgdGhpcyBzZWVtcyB0byBmYWlsIG9uIGF0IGxlYXN0IG9uZQorCSAqICBzeXN0ZW0gaWYgcmV2ZXJzZWQhCisJICovCisJZG1hX3Jlc2lkdWUgPSBnZXRfZG1hX3Jlc2lkdWUoZmRjLmRtYSk7CisJZGlzYWJsZV9kbWEoZmRjLmRtYSk7CisJaWYgKGNhdXNlICE9IG5vX2Vycm9yIHx8IGRtYV9yZXNpZHVlICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiRE1BIHJlc2lkdWUgPSAweCUwNHgiLCBkbWFfcmVzaWR1ZSk7CisJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCXN3aXRjaChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQkJYnVmZi0+c3RhdHVzID0gaWRsZTsKKwkJCWJyZWFrOworCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQkvKiAgZ290IGFuIG92ZXJydW4gZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIG11c3QgYmUgYQorCQkJICogIGhhcmR3YXJlIHByb2JsZW0gCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3RfYnVnLCAKKwkJCSAgICAgICJVbmV4cGVjdGVkIGVycm9yOiBmYWlsaW5nIERNQSBjb250cm9sbGVyID8iKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwkJCWJ1ZmYtPnN0YXR1cyA9IGVycm9yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUUkFDRShmdF90X25vaXNlLCAiVW5leHBlY3RlZCBlcnJvciBhdCBzZWdtZW50ICVkIiwKKwkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkJYnVmZi0+c3RhdHVzID0gZXJyb3I7CisJCQlicmVhazsKKwkJfQorCQlUUkFDRV9FWElUIC1FSU87IC8qIGNhbiBvbmx5IHJldHJ5IGVudGlyZSB0cmFjayBpbiBmb3JtYXQgbW9kZQorCQkJCSAgKi8KKwl9CisJLyogIFVwZGF0ZSB2YXIncyBpbmZsdWVuY2VkIGJ5IHRoZSBETUEgb3BlcmF0aW9uLgorCSAqLworCWJ1ZmYtPnB0ciAgICAgICAgICAgICArPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICogNDsKKwlidWZmLT5ieXRlcyAgICAgICAgICAgLT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAqIDQ7CisJYnVmZi0+cmVtYWluaW5nICAgICAgIC09IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJYnVmZi0+c2VnbWVudF9pZCArKzsgLyogZG9uZSB3aXRoIHNlZ21lbnQgKi8KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qCisgKiAgQ29udGludWUgZm9ybWF0dGluZywgc3dpdGNoIGJ1ZmZlcnMgaWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluCisgKiAgY3VycmVudCBidWZmZXIuIFRoaXMgaXMsIG9mIGNvdXJzZSwgbW9kZWxsZWQgYWZ0ZXIKKyAqICBjb250aW51ZV94ZmVyKCksIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHNldCB1cCBmb3IgcmV0cmllcyBiZWNhdXNlCisgKiAgdGhlIGZvcm1hdCBwcm9jZXNzIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCAoZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlCisgKiAgdGFwZSB0cmFjaykuCisgKi8KK3N0YXRpYyB2b2lkIGNvbnRpbnVlX2Zvcm1hdHRpbmcoYnVmZmVyX3N0cnVjdCAqYnVmZikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJ1ZmYtPnJlbWFpbmluZyA8PSAwKSB7IC8qICBubyBzcGFjZSBsZWZ0IGluIGRtYSBidWZmZXIgKi8KKwkJdW5zaWduZWQgaW50IG5leHQgPSBidWZmLT5uZXh0X3NlZ21lbnQ7IAorCisJCWlmIChuZXh0ID09IDApIHsgLyogZW5kIG9mIHRhcGUgdHJhY2sgKi8KKwkJCWJ1ZmYtPnN0YXR1cyAgICAgPSBkb25lOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGxvZ2ljYWxfZW90OworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkRvbmUgZm9ybWF0dGluZyB0cmFjayAlZCIsCisJCQkgICAgICBmdF9sb2NhdGlvbi50cmFjayk7CisJCQlUUkFDRV9FWElUOworCQl9CisJCS8qCisJCSAqICBzd2l0Y2ggdG8gbmV4dCBidWZmZXIhCisJCSAqLworCQlidWZmLT5zdGF0dXMgICA9IGRvbmU7CisJCWJ1ZmYgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKworCQlpZiAoYnVmZi0+c3RhdHVzICE9IHdhaXRpbmcgIHx8IG5leHQgIT0gYnVmZi0+c2VnbWVudF9pZCkgeworCQkJZ290byBmb3JtYXRfc2V0dXBfZXJyb3I7CisJCX0KKwl9CisJaWYgKGZkY19zZXR1cF9mb3JtYXR0aW5nKGJ1ZmYpIDwgMCkgeworCQlnb3RvIGZvcm1hdF9zZXR1cF9lcnJvcjsKKwl9CisJYnVmZi0+c3RhdHVzID0gZm9ybWF0dGluZzsKKwlUUkFDRShmdF90X2ZkY19kbWEsICJGb3JtYXR0aW5nIHNlZ21lbnQgJWQgb24gdHJhY2sgJWQiLAorCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsIGZ0X2xvY2F0aW9uLnRyYWNrKTsKKwlUUkFDRV9FWElUOworIGZvcm1hdF9zZXR1cF9lcnJvcjoKKwlmdF9ydW5uZXJfc3RhdHVzID0gZG9fYWJvcnQ7CisJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCWJ1ZmYtPnN0YXR1cyAgICAgPSBlcnJvcjsKKwlUUkFDRShmdF90X2VyciwgIkVycm9yIHNldHRpbmcgdXAgZm9yIHNlZ21lbnQgJWQgb24gdHJhY2sgJWQiLAorCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsIGZ0X2xvY2F0aW9uLnRyYWNrKTsKKwlUUkFDRV9FWElUOworCit9CisKKy8qICB0aGlzIGhhbmRsZXMgd3JpdGluZywgcmVhZCBpZCwgcmVhZGluZyBhbmQgZm9ybWF0dGluZworICovCitzdGF0aWMgdm9pZCBoYW5kbGVfZmRjX2J1c3koYnVmZmVyX3N0cnVjdCAqYnVmZikKK3sKKwlzdGF0aWMgaW50IG5vX2RhdGFfZXJyb3JfY291bnQ7CisJaW50IHJldHJ5ID0gMDsKKwllcnJvcl9jYXVzZSBjYXVzZTsKKwlfX3U4IGluWzddOworCWludCBza2lwOworCWZkY19tb2RlX2VudW0gZm1vZGUgPSBmZGNfbW9kZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZkY19yZXN1bHQoaW4sIDcpIDwgMCkgeyAvKiBiZXR0ZXIgZ2V0IGl0IGZhc3QgISAqLworCQlUUkFDRShmdF90X2VyciwgCisJCSAgICAgICJQcm9iYWJseSBmYXRhbCBlcnJvciBkdXJpbmcgRkRDIFJlc3VsdCBQaGFzZVxuIgorCQkgICAgICBLRVJOX0lORk8KKwkJICAgICAgImRyaXZlIG1heSBoYW5nIHVudGlsIChwb3dlciBvbikgcmVzZXQgOi0oIik7CisJCS8qICB3aGF0IHRvIGRvIG5leHQgPz8/PworCQkgKi8KKwkJVFJBQ0VfRVhJVDsKKwl9CisJY2F1c2UgPSBkZWNvZGVfaXJxX2NhdXNlKGZkY19tb2RlLCBpbik7CisjaWZkZWYgVEVTVElORworCXsgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IChpbnQpZnRfbnJfYnVmZmVyczsgKytpKQorCQlUUkFDRShmdF90X2FueSwgImJ1ZmZlclslZF0gc3RhdHVzOiAlZCwgc2VnbWVudF9pZDogJWQiLAorCQkgICAgICBpLCBmdF9idWZmZXJbaV0tPnN0YXR1cywgZnRfYnVmZmVyW2ldLT5zZWdtZW50X2lkKTsKKwl9CisjZW5kaWYKKwlpZiAoZm1vZGUgPT0gZmRjX3JlYWRpbmdfZGF0YSAmJiBmdF9kcml2ZXJfc3RhdGUgPT0gdmVyaWZ5aW5nKSB7CisJCWZtb2RlID0gZmRjX3ZlcmlmeWluZzsKKwl9CisJc3dpdGNoIChmbW9kZSkgeworCWNhc2UgZmRjX3ZlcmlmeWluZzoKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwKKwkJICAgIGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsImFib3J0aW5nICVzIixmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChidWZmLT5yZXRyeSA+IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInRoaXMgaXMgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7CisJCX0KKwkJc3dpdGNoIChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJbm9fZGF0YV9lcnJvcl9jb3VudCA9IDA7CisJCQlkZXRlcm1pbmVfdmVyaWZ5X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7CisJCQlpZiAoaW5bMl0gJiAweDQwKSB7CisJCQkJLyogIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiB2ZXJpZnlpbmcKKwkJCQkgKi8KKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJICAgICAgImRlbGV0ZWQgZGF0YSBpbiBzZWdtZW50ICVkLyVkIiwKKwkJCQkgICAgICBidWZmLT5zZWdtZW50X2lkLAorCQkJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSkpOworCQkJCWJ1ZmYtPnJlbWFpbmluZyA9IDA7IC8qIGFib3J0IHRyYW5zZmVyICovCisJCQkJYnVmZi0+aGFyZF9lcnJvcl9tYXAgPSBFTVBUWV9TRUdNRU5UOworCQkJCXNraXAgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlza2lwID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIHNraXApOworCQkJYnJlYWs7CisJCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJCW5vX2RhdGFfZXJyb3JfY291bnQgKys7CisJCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJCXJldHJ5ICsrOworCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIGRhdGFfY3JjX2Vycm9yOgorCQkJZGV0ZXJtaW5lX3ZlcmlmeV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOyAKKwkJCWlmIChjYXVzZSA9PSBub19kYXRhX2Vycm9yKSB7CisJCQkJaWYgKG5vX2RhdGFfZXJyb3JfY291bnQgPj0gMikgeworCQkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJCSAgICAgICJyZXRyeWluZyBiZWNhdXNlIG9mIHN1Y2Nlc3NpdmUgIgorCQkJCQkgICAgICAibm8gZGF0YSBlcnJvcnMiKTsKKwkJCQkJbm9fZGF0YV9lcnJvcl9jb3VudCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0cnkgLS07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlub19kYXRhX2Vycm9yX2NvdW50ID0gMDsKKwkJCX0KKwkJCWlmIChyZXRyeSkgeworCQkJCXNraXAgPSBmaW5kX3Jlc3VtZV9wb2ludChidWZmKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcCA9IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCQl9CisJCQlpZiAocmV0cnkgJiYgc2tpcCA8IDMyKSB7CisJCQkJcmV0cnlfc2VjdG9yKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCX0gZWxzZSB7CisJCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQl9CisJCQl1cGRhdGVfaGlzdG9yeShjYXVzZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qICBEb24ndCBrbm93IHdoeSB0aGlzIGNvdWxkIGhhcHBlbiAKKwkJCSAqICBidXQgZmluZCBvdXQuCisJCQkgKi8KKwkJCWRldGVybWluZV92ZXJpZnlfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKKwkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgMCk7CisJCQlUUkFDRShmdF90X2VyciwgIkVycm9yOiB1bmV4cGVjdGVkIGVycm9yIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIGZkY19yZWFkaW5nX2RhdGE6CisjaWZkZWYgVEVTVElORworCQkvKiBJJ20gc29ycnksIGJ1dDogTk9CT0RZIGV2ZXIgdXNlZCB0aGlzIHRyYWNlCisJCSAqIG1lc3NhZ2VzIGZvciBhZ2VzLiBJIGd1ZXNzIHRoYXQgQmFzIHdhcyB0aGUgbGFzdCBwZXJzb24KKwkJICogdGhhdCBldmVyIHJlYWxseSB1c2VkIHRoaXMgKHRoYW5rIHlvdSwgYmV0d2VlbiB0aGUgbGluZXMpCisJCSAqLworCQlpZiAoY2F1c2UgPT0gbm9fZXJyb3IpIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywicmVhZGluZyBzZWdtZW50ICVkIixidWZmLT5zZWdtZW50X2lkKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciByZWFkaW5nIHNlZ21lbnQgJWQiLAorCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAiXG4iCisJCQkgICAgICBLRVJOX0lORk8KKwkJCSAgICAgIklSUTpDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4LCBOOiAweCUwMnhcbiIKKwkJCSAgICAgIEtFUk5fSU5GTworCQkJICAgICAgIkJVRjpDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4IiwKKwkJCSAgICAgIGluWzNdLCBpbls0XSwgaW5bNV0sIGluWzZdLAorCQkJICAgICAgYnVmZi0+Y3lsLCBidWZmLT5oZWFkLCBidWZmLT5zZWN0KTsKKwkJfQorI2VuZGlmCisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nIHx8CisJCSAgICBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCQlUUkFDRShmdF90X25vaXNlLCJhYm9ydGluZyAlcyIsZmRjX21vZGVfdHh0KGZkY19tb2RlKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gRkFLRV9TRUdNRU5UKSB7CisJCQkvKiBUaGlzIGNvbmRpdGlvbiBvY2N1cnMgd2hlbiByZWFkaW5nIGEgYGZha2UnCisJCQkgKiBzZWN0b3IgdGhhdCdzIG5vdCBhY2Nlc3NpYmxlLiBEb2Vzbid0CisJCQkgKiByZWFsbHkgbWF0dGVyIGFzIHdlIHdvdWxkIGhhdmUgaWdub3JlZCBpdAorCQkJICogYW55d2F5ICEKKwkJCSAqCisJCQkgKiBDaGFuY2UgaXMgdGhhdCB3ZSdyZSBwYXN0IHRoZSBuZXh0IHNlZ21lbnQKKwkJCSAqIG5vdywgc28gdGhlIG5leHQgb3BlcmF0aW9uIG1heSBmYWlsIGFuZAorCQkJICogcmVzdWx0IGluIGEgcmV0cnkuICAKKwkJCSAqLworCQkJYnVmZi0+cmVtYWluaW5nID0gMDsJLyogc2tpcCBmYWlsaW5nIHNlY3RvciAqLworCQkJLyogYnVmZi0+cHRyICAgICAgID0gYnVmZi0+YWRkcmVzczsgKi8KKwkJCS8qIGZha2Ugc3VjY2VzczogKi8KKwkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIDEpOworCQkJLyogIHRyYWNlIGNhbGxzIGFyZSBleHBlbnNpdmU6IHBsYWNlIHRoZW0gQUZURVIKKwkJCSAqICB0aGUgcmVhbCBzdHVmZiBoYXMgYmVlbiBkb25lLgorCQkJICogIAorCQkJICovCisJCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgZW1wdHkgc2VnbWVudCAlZCAocmVhZCksIHNpemU/ICVkIiwKKwkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsIGJ1ZmYtPnB0ciAtIGJ1ZmYtPmFkZHJlc3MpOworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlpZiAoYnVmZi0+cmV0cnkgPiAwKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJ0aGlzIGlzIHJldHJ5IG5yICVkIiwgYnVmZi0+cmV0cnkpOworCQl9CisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBub19lcnJvcjoKKwkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOworCQkJaWYgKGluWzJdICYgMHg0MCkgeworCQkJCS8qICBIYW5kbGUgZGVsZXRlZCBkYXRhIGluIGhlYWRlciBzZWdtZW50cy4KKwkJCQkgKiAgU2tpcCBzZWdtZW50IGFuZCBmb3JjZSByZWFkLWFoZWFkLgorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiZGVsZXRlZCBkYXRhIGluIHNlZ21lbnQgJWQvJWQiLAorCQkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsCisJCQkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKSk7CisJCQkJYnVmZi0+ZGVsZXRlZCA9IDE7CisJCQkJYnVmZi0+cmVtYWluaW5nID0gMDsvKmFib3J0IHRyYW5zZmVyICovCisJCQkJYnVmZi0+c29mdF9lcnJvcl9tYXAgfD0KKwkJCQkJCSgtMUwgPDwgYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCQkJaWYgKGJ1ZmYtPnNlZ21lbnRfaWQgPT0gMCkgeworCQkJCQkvKiBzdG9wIG9uIG5leHQgc2VnbWVudCAqLworCQkJCQlzdG9wX3JlYWRfYWhlYWQgPSAxOworCQkJCX0KKwkJCQkvKiBmb3JjZSByZWFkLWFoZWFkOiAqLworCQkJCWJ1ZmYtPm5leHRfc2VnbWVudCA9IAorCQkJCQlidWZmLT5zZWdtZW50X2lkICsgMTsKKwkJCQlza2lwID0gKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAKKwkJCQkJYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCQl9IGVsc2UgeworCQkJCXNraXAgPSAwOworCQkJfQorCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQkJLyogVGFwZSBzdGFydGVkIHRvbyBmYXIgYWhlYWQgb2Ygb3IgYmVoaW5kIHRoZQorCQkJICogcmlnaHQgc2VjdG9yLiAgVGhpcyBtYXkgYWxzbyBoYXBwZW4gaW4gdGhlCisJCQkgKiBtaWRkbGUgb2YgYSBzZWdtZW50ICEKKwkJCSAqCisJCQkgKiBIYW5kbGUgbm8tZGF0YSBhcyBzb2Z0IGVycm9yLiBJZiBuZXh0CisJCQkgKiBzZWN0b3IgZmFpbHMgdG9vLCBhIHJldHJ5ICh3aXRoIG5lZWRlZAorCQkJICogcmVwb3NpdGlvbikgd2lsbCBmb2xsb3cuCisJCQkgKi8KKwkJCXJldHJ5ICsrOworCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIGRhdGFfY3JjX2Vycm9yOgorCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQlyZXRyeSArPSAoYnVmZi0+c29mdF9lcnJvcl9tYXAgIT0gMCB8fAorCQkJCSAgYnVmZi0+aGFyZF9lcnJvcl9tYXAgIT0gMCk7CisJCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsgCisjaWYgMSB8fCBkZWZpbmVkKFRFU1RJTkcpCisJCQlpZiAoY2F1c2UgPT0gb3ZlcnJ1bl9lcnJvcikgcmV0cnkgKys7CisjZW5kaWYKKwkJCWlmIChyZXRyeSkgeworCQkJCXNraXAgPSBmaW5kX3Jlc3VtZV9wb2ludChidWZmKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcCA9IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCQl9CisJCQkvKiAgVHJ5IHRvIHJlc3VtZSB3aXRoIG5leHQgc2VjdG9yIG9uIHNpbmdsZQorCQkJICogIGVycm9ycyAobGV0IGVjYyBjb3JyZWN0IGl0KSwgYnV0IHJldHJ5IG9uCisJCQkgKiAgbm9fZGF0YSAod2UnbGwgYmUgcGFzdCB0aGUgdGFyZ2V0IHdoZW4gd2UKKwkJCSAqICBnZXQgaGVyZSBzbyB3ZSBjYW5ub3QgcmV0cnkpIG9yIG9uCisJCQkgKiAgbXVsdGlwbGUgZXJyb3JzIChyZWR1Y2UgY2hhbmNlIG9uIGVjYworCQkJICogIGZhaWx1cmUpLgorCQkJICovCisJCQkvKiAgY0g6IDIzLzAyLzk3OiBpZiB0aGUgbGFzdCBzZWN0b3IgaW4gdGhlIAorCQkJICogIHNlZ21lbnQgd2FzIGEgaGFyZCBlcnJvciwgdGhlbiB0aGVyZSBpcyAKKwkJCSAqICBubyBzZW5zZSBpbiBhIHJldHJ5LiBUaGlzIG9jY2FzaW9uIHNlbGRvbQorCQkJICogIG9jY3VycyBidXQgLi4uIEA6s7K4YEAlJqckCisJCQkgKi8KKwkJCWlmIChyZXRyeSAmJiBza2lwIDwgMzIpIHsKKwkJCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIHNraXApOworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCX0KKwkJCXVwZGF0ZV9oaXN0b3J5KGNhdXNlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogIERvbid0IGtub3cgd2h5IHRoaXMgY291bGQgaGFwcGVuIAorCQkJICogIGJ1dCBmaW5kIG91dC4KKwkJCSAqLworCQkJZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7CisJCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIDApOworCQkJVFJBQ0UoZnRfdF9lcnIsICJFcnJvcjogdW5leHBlY3RlZCBlcnJvciIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBmZGNfcmVhZGluZ19pZDoKKwkJaWYgKGNhdXNlID09IG5vX2Vycm9yKSB7CisJCQlmZGNfY3lsID0gaW5bM107CisJCQlmZGNfaGVhZCA9IGluWzRdOworCQkJZmRjX3NlY3QgPSBpbls1XTsKKwkJCVRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkJCSAgICAgICJpZCByZWFkOiBDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4IiwKKwkJCSAgICAgIGZkY19jeWwsIGZkY19oZWFkLCBmZGNfc2VjdCk7CisJCX0gZWxzZSB7CS8qIG5vIHZhbGlkIGluZm9ybWF0aW9uLCB1c2UgaW52YWxpZCBzZWN0b3IgKi8KKwkJCWZkY19jeWwgPSBmZGNfaGVhZCA9IGZkY19zZWN0ID0gMDsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgIkRpZG4ndCBmaW5kIHZhbGlkIHNlY3RvciBJZCIpOworCQl9CisJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCWJyZWFrOworCWNhc2UgZmRjX2RlbGV0aW5nOgorCWNhc2UgZmRjX3dyaXRpbmdfZGF0YToKKyNpZmRlZiBURVNUSU5HCisJCWlmIChjYXVzZSA9PSBub19lcnJvcikgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAid3JpdGluZyBzZWdtZW50ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiZXJyb3Igd3JpdGluZyBzZWdtZW50ICVkIiwKKwkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOworCQl9CisjZW5kaWYKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwKKwkJICAgIGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgImFib3J0aW5nICVzIixmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChidWZmLT5yZXRyeSA+IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInRoaXMgaXMgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7CisJCX0KKwkJaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwID09IEZBS0VfU0VHTUVOVCkgeworCQkJLyogVGhpcyBjb25kaXRpb24gb2NjdXJzIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIHRvIGEKKwkJCSAqIGBmYWtlJyBzZWN0b3IgdGhhdCdzIG5vdCBhY2Nlc3NpYmxlLiBEb2Vzbid0IHJlYWxseQorCQkJICogbWF0dGVyIGFzIGl0IGlzbid0IHVzZWQgYW55d2F5ICEgTWlnaHQgYmUgbG9jYXRlZAorCQkJICogYXQgd3Jvbmcgc2VnbWVudCwgdGhlbiB3ZSdsbCBmYWlsIG9uIHRoZSBuZXh0CisJCQkgKiBzZWdtZW50LgorCQkJICovCisJCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgZW1wdHkgc2VnbWVudCAod3JpdGUpIik7CisJCQlidWZmLT5yZW1haW5pbmcgPSAwOwkvKiBza2lwIGZhaWxpbmcgc2VjdG9yICovCisJCQkvKiBmYWtlIHN1Y2Nlc3M6ICovCisJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCAxKTsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBub19lcnJvcjoKKwkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOworCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQl1cGRhdGVfaGlzdG9yeShjYXVzZSk7CisJCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKKwkJCXNraXAgPSBmaW5kX3Jlc3VtZV9wb2ludChidWZmKTsKKwkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChpblsxXSAmIDB4MDIpIHsKKwkJCQlUUkFDRShmdF90X2VyciwgIm1lZGlhIG5vdCB3cml0YWJsZSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2J1ZywgInVuZm9yZXNlZW4gd3JpdGUgZXJyb3IiKTsKKwkJCX0KKwkJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsgLyogZmRjX2RlbGV0aW5nIHx8IGZkY193cml0aW5nX2RhdGEgKi8KKwljYXNlIGZkY19mb3JtYXR0aW5nOgorCQkvKiAgVGhlIGludGVycnVwdCBjb21lcyBhZnRlciBmb3JtYXR0aW5nIGEgc2VnbWVudC4gV2UgdGhlbgorCQkgKiAgaGF2ZSB0byBzZXQgdXAgUVVJQ0tMWSBmb3IgdGhlIG5leHQgc2VnbWVudC4gQnV0CisJCSAqICBhZnRlcndhcmRzLCB0aGVyZSBpcyBwbGVudHkgb2YgdGltZS4KKwkJICovCisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBub19lcnJvcjoKKwkJCS8qICB3b3VsZCBsaWtlIHRvIGtlZXAgbW9zdCBvZiB0aGUgZm9ybWF0dGluZyBzdHVmZgorCQkJICogIG91dHNpZGUgdGhlIGlzciBjb2RlLCBidXQgdGltaW5nIGlzIHRvbyBjcml0aWNhbAorCQkJICovCisJCQlpZiAoZGV0ZXJtaW5lX2ZtdF9wcm9ncmVzcyhidWZmLCBjYXVzZSkgPj0gMCkgeworCQkJCWNvbnRpbnVlX2Zvcm1hdHRpbmcoYnVmZik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCWRlZmF1bHQ6CisJCQlkZXRlcm1pbmVfZm10X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKTsKKwkJCXVwZGF0ZV9oaXN0b3J5KGNhdXNlKTsKKwkJCWlmIChpblsxXSAmIDB4MDIpIHsKKwkJCQlUUkFDRShmdF90X2VyciwgIm1lZGlhIG5vdCB3cml0YWJsZSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2J1ZywgInVuZm9yZXNlZW4gd3JpdGUgZXJyb3IiKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IC8qIGNhdXNlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6IHVuZXhwZWN0ZWQgaXJxIGR1cmluZzogJXMiLAorCQkgICAgICBmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJZmRjX21vZGUgPSBmZGNfaWRsZTsKKwkJYnJlYWs7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICAgICAgRkRDIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK3ZvaWQgZmRjX2lzcih2b2lkKQoreworCXN0YXRpYyBpbnQgaXNyX2FjdGl2ZTsKKyNpZmRlZiBURVNUSU5HCisJdW5zaWduZWQgaW50IHQwID0gZnRhcGVfdGltZXN0YW1wKCk7CisjZW5kaWYKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisgCWlmIChpc3JfYWN0aXZlKyspIHsKKwkJLS1pc3JfYWN0aXZlOworCQlUUkFDRShmdF90X2J1ZywgIkJVRzogbmVzdGVkIGludGVycnVwdCwgbm90IGdvb2QgISIpOworCQkqZmRjLmhvb2sgPSBmZGNfaXNyOyAvKiAgaG9vayBvdXIgaGFuZGxlciBpbnRvIHRoZSBmZGMKKwkJCQkgICAgICAqICBjb2RlIGFnYWluIAorCQkJCSAgICAgICovCisJCVRSQUNFX0VYSVQ7CisJfQorCXN0aSgpOworCWlmIChpbmJfcChmZGMubXNyKSAmIEZEQ19CVVNZKSB7CS8qICBFbnRlcmluZyBSZXN1bHQgUGhhc2UgKi8KKwkJZnRfaGlkZV9pbnRlcnJ1cHQgPSAwOworCQloYW5kbGVfZmRjX2J1c3koZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKSk7CisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCQkvKiAgICAgIGNlYXNlIG9wZXJhdGlvbiwgcmVtZW1iZXIgdGFwZSBwb3NpdGlvbgorCQkJICovCisJCQlUUkFDRShmdF90X2Zsb3csICJydW5uZXIgYWJvcnRpbmciKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBhYm9ydGluZzsKKwkJCSsrZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0czsKKwkJfQorCX0gZWxzZSB7IC8qICFGRENfQlVTWSAqLworCQkvKiAgY2xlYXIgaW50ZXJydXB0LCBjYXVzZSBzaG91bGQgYmUgZ290dGVuIGJ5IGlzc3VpbmcKKwkJICogIGEgU2Vuc2UgSW50ZXJydXB0IFN0YXR1cyBjb21tYW5kLgorCQkgKi8KKwkJaWYgKGZkY19tb2RlID09IGZkY19yZWNhbGlicmF0aW5nIHx8IGZkY19tb2RlID09IGZkY19zZWVraW5nKSB7CisJCQlpZiAoZnRfaGlkZV9pbnRlcnJ1cHQpIHsKKwkJCQlpbnQgc3QwOworCQkJCWludCBwY247CisKKwkJCQlpZiAoZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoJnN0MCwgJnBjbikgPCAwKQorCQkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkJICAgICAgInNlbnNlIGludGVycnVwdCBzdGF0dXMgZmFpbGVkIik7CisJCQkJZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IHBjbjsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJoYW5kbGVkIGhpZGRlbiBpbnRlcnJ1cHQiKTsKKwkJCX0KKwkJCWZ0X3NlZWtfY29tcGxldGVkID0gMTsKKwkJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCX0gZWxzZSBpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikpIHsKKwkJCWlmIChmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzID09IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJ1bmV4cGVjdGVkIHN0cmF5IGludGVycnVwdCIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJleHBlY3RlZCBzdHJheSBpbnRlcnJ1cHQiKTsKKwkJCQktLWZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmRjX21vZGUgPT0gZmRjX3JlYWRpbmdfZGF0YSB8fAorCQkJICAgIGZkY19tb2RlID09IGZkY192ZXJpZnlpbmcgICAgfHwKKwkJCSAgICBmZGNfbW9kZSA9PSBmZGNfd3JpdGluZ19kYXRhIHx8CisJCQkgICAgZmRjX21vZGUgPT0gZmRjX2RlbGV0aW5nICAgICB8fAorCQkJICAgIGZkY19tb2RlID09IGZkY19mb3JtYXR0aW5nICAgfHwKKwkJCSAgICBmZGNfbW9kZSA9PSBmZGNfcmVhZGluZ19pZCkgeworCQkJCWlmIChpbmJfcChmZGMubXNyKSAmIEZEQ19CVVNZKSB7CisJCQkJCVRSQUNFKGZ0X3RfYnVnLAorCQkJCQkiKioqKiogRkRDIGZhaWx1cmUsIGJ1c3kgdG9vIGxhdGUiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRShmdF90X2J1ZywKKwkJCQkJICAgICAgIioqKioqIEZEQyBmYWlsdXJlLCBubyBidXN5Iik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2ZkY19kbWEsICJhd2FpdGVkIHN0cmF5IGludGVycnVwdCIpOworCQkJfQorCQl9CisJCWZ0X2hpZGVfaW50ZXJydXB0ID0gMDsKKwl9CisJLyogICAgSGFuZGxlIHNsZWVwIGNvZGUuCisJICovCisJaWYgKCFmdF9oaWRlX2ludGVycnVwdCkgeworCQlmdF9pbnRlcnJ1cHRfc2VlbiArKzsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikpIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZnRhcGVfd2FpdF9pbnRyKTsKKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImhpZGluZyBpbnRlcnJ1cHQgd2hpbGUgJXMiLCAKKwkJICAgICAgd2FpdHF1ZXVlX2FjdGl2ZSgmZnRhcGVfd2FpdF9pbnRyKSA/ICJ3YWl0aW5nIjoiYWN0aXZlIik7CisJfQorI2lmZGVmIFRFU1RJTkcKKwl0MCA9IGZ0YXBlX3RpbWVkaWZmKHQwLCBmdGFwZV90aW1lc3RhbXAoKSk7CisJaWYgKHQwID49IDEwMDApIHsKKwkJLyogb25seSB0ZWxsIHVzIGFib3V0IGxvbmcgY2FsbHMgKi8KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlzcigpIGR1cmF0aW9uOiAlNWQgdXNlYyIsIHQwKTsKKwl9CisjZW5kaWYKKwkqZmRjLmhvb2sgPSBmZGNfaXNyOwkvKiBob29rIG91ciBoYW5kbGVyIGludG8gdGhlIGZkYyBjb2RlIGFnYWluICovCisJLS1pc3JfYWN0aXZlOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVhYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIF9GRENfSVNSX0gKKyNkZWZpbmUgX0ZEQ19JU1JfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDcgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnbG9iYWwgdmFyaWFibGVzIG5lY2Vzc2FyeSB0bworICogICAgICBzeW5jaHJvbml6ZSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoaXNyKSB3aXRoIHRoZQorICogICAgICByZW1haW5kZXIgb2YgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyCisgKiAgICAgICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKy8qCisgKiAgICAgIGZkYy1pc3IuYyBkZWZpbmVkIHB1YmxpYyB2YXJpYWJsZXMKKyAqLworZXh0ZXJuIHZvbGF0aWxlIGludCBmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzOyAvKiBtYXNrcyBzdHJheSBpbnRlcnJ1cHRzICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X3NlZWtfY29tcGxldGVkOwkgICAgICAgICAgLyogZmxhZyBzZXQgYnkgaXNyICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X2ludGVycnVwdF9zZWVuOwkgICAgICAgICAgLyogZmxhZyBzZXQgYnkgaXNyICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X2hpZGVfaW50ZXJydXB0OyAgICAgICAgICAgIC8qIGZsYWcgc2V0IGJ5IGlzciAqLworCisvKgorICogICAgICBmZGMtaW8uYyBkZWZpbmVkIHB1YmxpYyBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHZvaWQgZmRjX2lzcih2b2lkKTsKKworLyoKKyAqICAgICAgQSBrZXJuZWwgaG9vayB0aGF0IHN0ZWFscyBvbmUgaW50ZXJydXB0IGZyb20gdGhlIGZsb3BweQorICogICAgICBkcml2ZXIgKFNob3VsZCBiZSBmaXhlZCB3aGVuIHRoZSBuZXcgZmRjIGRyaXZlciBnZXRzIHJlYWR5KQorICogICAgICBTZWUgdGhlIGxpbnV4IGtlcm5lbCBzb3VyY2UgZmlsZXM6CisgKiAgICAgICAgICBkcml2ZXJzL2Jsb2NrL2Zsb3BweS5jICYgZHJpdmVycy9ibG9jay9ibGsuaAorICogICAgICBmb3IgdGhlIGRldGFpbHMuCisgKi8KK2V4dGVybiB2b2lkICgqZG9fZmxvcHB5KSAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTMwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE1OjE1ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmFkLXNlY3RvciBtYXAgaGFuZGxpbmcgY29kZSBmb3IKKyAqICAgICAgdGhlIFFJQy0xMTcgZmxvcHB5IHRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqICAgICAgUUlDLTQwLCBRSUMtODAsIFFJQy0zMDEwIGFuZCBRSUMtMzAyMCBtYXBzIGFyZSBpbXBsZW1lbnRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIF9fdTggKmJhZF9zZWN0b3JfbWFwOworc3RhdGljIFNlY3RvckNvdW50ICpic21faGFzaF9wdHI7IAorCit0eXBlZGVmIGVudW0geworCWZvcndhcmQsIGJhY2t3YXJkCit9IG1vZGVfdHlwZTsKKworI2lmIDAKK3N0YXRpYyB2b2lkIGZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgbmV3X21hcCk7CisjZW5kaWYKKworI2lmIDAKKy8qICBmaXhfdGFwZSBjb252ZXJ0cyBhIG5vcm1hbCBRSUMtODAgdGFwZSBpbnRvIGEgJ3dpZGUnIHRhcGUuCisgKiAgRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSAhCisgKi8KK3ZvaWQgZml4X3RhcGUoX191OCAqIGJ1ZmZlciwgZnRfZm9ybWF0X3R5cGUgbmV3X2NvZGUpCit7CisJc3RhdGljIF9fdTggbGlzdFtCQURfU0VDVE9SX01BUF9TSVpFXTsKKwlTZWN0b3JNYXAgKnNyY19wdHIgPSAoU2VjdG9yTWFwICopIGxpc3Q7CisJX191OCAqZHN0X3B0ciA9IGJhZF9zZWN0b3JfbWFwOworCVNlY3Rvck1hcCBtYXA7CisJdW5zaWduZWQgaW50IHNlY3RvciA9IDE7CisJaW50IGk7CisKKwlpZiAoZm9ybWF0X2NvZGUgIT0gZm10X3ZhciAmJiBmb3JtYXRfY29kZSAhPSBmbXRfYmlnKSB7CisJCW1lbWNweShsaXN0LCBiYWRfc2VjdG9yX21hcCwgc2l6ZW9mKGxpc3QpKTsKKwkJbWVtc2V0KGJhZF9zZWN0b3JfbWFwLCAwLCBzaXplb2YoYmFkX3NlY3Rvcl9tYXApKTsKKwkJd2hpbGUgKChfX3U4ICopIHNyY19wdHIgLSBsaXN0IDwgc2l6ZW9mKGxpc3QpKSB7CisJCQltYXAgPSAqc3JjX3B0cisrOworCQkJaWYgKG1hcCA9PSBFTVBUWV9TRUdNRU5UKSB7CisJCQkJKihTZWN0b3JNYXAgKikgZHN0X3B0ciA9IDB4ODAwMDAwICsgc2VjdG9yOworCQkJCWRzdF9wdHIgKz0gMzsKKwkJCQlzZWN0b3IgKz0gU0VDVE9SU19QRVJfU0VHTUVOVDsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IFNFQ1RPUlNfUEVSX1NFR01FTlQ7ICsraSkgeworCQkJCQlpZiAobWFwICYgMSkgeworCQkJCQkJKihTZXdjdG9yTWFwICopIGRzdF9wdHIgPSBzZWN0b3I7CisJCQkJCQlkc3RfcHRyICs9IDM7CisJCQkJCX0KKwkJCQkJbWFwID4+PSAxOworCQkJCQkrK3NlY3RvcjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJYmFkX3NlY3Rvcl9tYXBfY2hhbmdlZCA9IDE7CisJKihidWZmZXIgKyA0KSA9IG5ld19jb2RlOwkvKiBwdXQgbmV3IGZvcm1hdCBjb2RlICovCisJaWYgKGZvcm1hdF9jb2RlICE9IGZtdF92YXIgJiYgbmV3X2NvZGUgPT0gZm10X2JpZykgeworCQlQVVQ0KGJ1ZmZlciwgRlRfNl9IU0VHXzEsICAgKF9fdTMyKUdFVDIoYnVmZmVyLCA2KSk7CisJCVBVVDQoYnVmZmVyLCBGVF82X0hTRUdfMiwgICAoX191MzIpR0VUMihidWZmZXIsIDgpKTsKKwkJUFVUNChidWZmZXIsIEZUXzZfRlJTVF9TRUcsIChfX3UzMilHRVQyKGJ1ZmZlciwgMTApKTsKKwkJUFVUNChidWZmZXIsIEZUXzZfTEFTVF9TRUcsIChfX3UzMilHRVQyKGJ1ZmZlciwgMTIpKTsKKwkJbWVtc2V0KGJ1ZmZlcis2LCAnXDAnLCA4KTsKKwl9CisJZm9ybWF0X2NvZGUgPSBuZXdfY29kZTsKK30KKworI2VuZGlmCisKKy8qICAgZ2l2ZW4gYnVmZmVyIHRoYXQgY29udGFpbnMgYSBoZWFkZXIgc2VnbWVudCwgZmluZCB0aGUgZW5kIG9mCisgKiAgIG9mIHRoZSBic20gbGlzdAorICovCitfX3U4ICogZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoX191OCAqIGFkZHJlc3MpCit7CisJX191OCAqcHRyICAgPSBhZGRyZXNzICsgRlRfSEVBREVSX0VORDsgLyogc3RhcnQgb2YgYnNtIGxpc3QgKi8KKwlfX3U4ICpsaW1pdCA9IGFkZHJlc3MgKyBGVF9TRUdNRU5UX1NJWkU7CisJd2hpbGUgKHB0ciArIDIgPCBsaW1pdCkgeworCQlpZiAocHRyWzBdIHx8IHB0clsxXSB8fCBwdHJbMl0pIHsKKwkJCXB0ciArPSAzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHB0cjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9zZWN0b3IoU2VjdG9yQ291bnQgKnB0ciwgdW5zaWduZWQgaW50IHNlY3RvcikKK3sKKwlwdHItPmJ5dGVzWzBdID0gc2VjdG9yICYgMHhmZjsKKwlzZWN0b3IgPj49IDg7CisJcHRyLT5ieXRlc1sxXSA9IHNlY3RvciAmIDB4ZmY7CisJc2VjdG9yID4+PSA4OworCXB0ci0+Ynl0ZXNbMl0gPSBzZWN0b3IgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfc2VjdG9yKFNlY3RvckNvdW50ICpwdHIpCit7CisjaWYgMQorCXVuc2lnbmVkIGludCBzZWN0b3I7CisKKwlzZWN0b3IgID0gcHRyLT5ieXRlc1swXTsKKwlzZWN0b3IgKz0gcHRyLT5ieXRlc1sxXSA8PCAgODsKKwlzZWN0b3IgKz0gcHRyLT5ieXRlc1syXSA8PCAxNjsKKworCXJldHVybiBzZWN0b3I7CisjZWxzZQorCS8qICBHRVQ0IGdldHMgdGhlIG5leHQgZm91ciBieXRlcyBpbiBJbnRlbCBsaXR0bGUgZW5kaWFuIG9yZGVyCisJICogIGFuZCBjb252ZXJ0cyB0aGVtIHRvIGhvc3QgYnl0ZSBvcmRlciBhbmQgaGFuZGxlcyB1bmFsaWduZWQKKwkgKiAgYWNjZXNzLgorCSAqLworCXJldHVybiAoR0VUNChwdHIsIDApICYgMHgwMGZmZmZmZik7IC8qIGJhY2sgdG8gaG9zdCBieXRlIG9yZGVyICovCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgYnNtX2RlYnVnX2Zha2Uodm9pZCkKK3sKKwkvKiBmb3IgdGVzdGluZyBvZiBiYWQgc2VjdG9yIGhhbmRsaW5nIGF0IGVuZCBvZiB0YXBlCisJICovCisjaWYgMAorCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KHNlZ21lbnRzX3Blcl90cmFjayAqIHRyYWNrc19wZXJfdGFwZSAtIDMsCisJCQkJICAgMHgwMDAwMDNlMDsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50c19wZXJfdHJhY2sgKiB0cmFja3NfcGVyX3RhcGUgLSAyLAorCQkJCSAgIDB4ZmYzZmZmZmY7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudHNfcGVyX3RyYWNrICogdHJhY2tzX3Blcl90YXBlIC0gMSwKKwkJCQkgICAweGZmZmZlMDAwOworI2VuZGlmCisJLyogIEVuYWJsZSB0byB0ZXN0IGJhZCBzZWN0b3IgaGFuZGxpbmcKKwkgKi8KKyNpZiAwCisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzAsIDB4ZmZmZmZmZmUpCisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzIsIDB4N2ZmZmZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDM0LCAweGZmZmVmZmZmKTsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSgzNiwgMHg1NTU1NTU1NSk7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzgsIDB4ZmZmZmZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUwLCAweGZmZmYwMDAwKTsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSg1MSwgMHhmZmZmZmZmZik7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoNTIsIDB4ZmZmZmZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUzLCAweDAwMDBmZmZmKTsKKyNlbmRpZgorCS8qICBFbmFibGUgd2hlbiB0ZXN0aW5nIG11bHRpcGxlIHZvbHVtZSB0YXIgZHVtcHMuCisJICovCisjaWYgMAorCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCQkgICAgIGkgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSA3OyArK2kpIHsKKwkJCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGksIEVNUFRZX1NFR01FTlQpOworCQl9CisJfQorI2VuZGlmCisJLyogIEVuYWJsZSB3aGVuIHRlc3RpbmcgYml0IHBvc2l0aW9ucyBpbiAqX2Vycm9yX21hcAorCSAqLworI2lmIDAKKwl7CisJCWludCBpOworCQkKKwkJZm9yIChpID0gZmlyc3RfZGF0YV9zZWdtZW50OyBpIDw9IGxhc3RfZGF0YV9zZWdtZW50OyArK2kpIHsKKwkJCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGksCisJCQkJCSAgIGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGkpIAorCQkJCQkgICB8IDB4MDBmZjAwZmYpOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHByaW50X2JhZF9zZWN0b3JfbWFwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGdvb2Rfc2VjdG9yczsKKwl1bnNpZ25lZCBpbnQgdG90YWxfYmFkID0gMDsKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfMTEwMGZ0KSB7CisJCVNlY3RvckNvdW50ICpwdHIgPSAoU2VjdG9yQ291bnQgKiliYWRfc2VjdG9yX21hcDsKKwkJdW5zaWduZWQgaW50IHNlY3RvcjsKKwkJX191MTYgKnB0cjE2OworCisJCXdoaWxlKChzZWN0b3IgPSBnZXRfc2VjdG9yKHB0cisrKSkgIT0gMCkgeworCQkJaWYgKChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IAorCQkJICAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyKSAmJgorCQkJICAgIHNlY3RvciAmIDB4ODAwMDAwKSB7CisJCQkJdG90YWxfYmFkICs9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzOworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VnbWVudCBhdCBzZWN0b3I6ICU2ZCIsCisJCQkJICAgICAgc2VjdG9yICYgMHg3ZmZmZmYpOworCQkJfSBlbHNlIHsKKwkJCQkrK3RvdGFsX2JhZDsKKwkJCQlUUkFDRShmdF90X25vaXNlLCAiYmFkIHNlY3RvcjogJTZkIiwgc2VjdG9yKTsKKwkJCX0KKwkJfQorCQkvKiAgRGlzcGxheSBvbGQgZnRhcGUncyBlbmQtb2YtZmlsZSBtYXJrcworCQkgKi8KKwkJcHRyMTYgPSAoX191MTYqKXB0cjsKKwkJd2hpbGUgKChzZWN0b3IgPSBnZXRfdW5hbGlnbmVkKHB0cjE2KyspKSAhPSAwKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiT2xkIGZ0YXBlIGVvZiBtYXJrOiAlNGQvJTJkIiwKKwkJCSAgICAgIHNlY3RvciwgZ2V0X3VuYWxpZ25lZChwdHIxNisrKSk7CisJCX0KKwl9IGVsc2UgeyAvKiBmaXhlZCBzaXplIGZvcm1hdCAqLworCQlmb3IgKGkgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJCSAgICAgaSA8IChpbnQpKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSk7ICsraSkgeworCQkJU2VjdG9yTWFwIG1hcCA9ICgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtpXTsKKworCQkJaWYgKG1hcCkgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImJzbSBmb3Igc2VnbWVudCAlNGQ6IDB4JTA4eCIsIGksICh1bnNpZ25lZCBpbnQpbWFwKTsKKwkJCQl0b3RhbF9iYWQgKz0gKChtYXAgPT0gRU1QVFlfU0VHTUVOVCkKKwkJCQkJICAgICAgID8gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIDMKKwkJCQkJICAgICAgIDogY291bnRfb25lcyhtYXApKTsKKwkJCX0KKwkJfQorCX0KKwlnb29kX3NlY3RvcnMgPQorCQkoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCkKKwkJICogKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzKSkgLSB0b3RhbF9iYWQ7CisJVFJBQ0UoZnRfdF9pbmZvLCAiJWQgS2IgdXNhYmxlIG9uIHRoaXMgdGFwZSIsIGdvb2Rfc2VjdG9ycyk7CisJaWYgKHRvdGFsX2JhZCA9PSAwKSB7CisJCVRSQUNFKGZ0X3RfaW5mbywKKwkJICAgICAgIldBUk5JTkc6IHRoaXMgdGFwZSBoYXMgbm8gYmFkIGJsb2NrcyByZWdpc3RlcmVkICEiKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2luZm8sICIlZCBiYWQgc2VjdG9ycyIsIHRvdGFsX2JhZCk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKwordm9pZCBmdGFwZV9leHRyYWN0X2JhZF9zZWN0b3JfbWFwKF9fdTggKiBidWZmZXIpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBGaWxsIHRoZSBiYWQgc2VjdG9yIG1hcCB3aXRoIHRoZSBjb250ZW50cyBvZiBidWZmZXIuCisJICovCisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQkvKiBRSUMtMzAxMC8zMDIwIGFuZCB3aWRlIFFJQy04MCB0YXBlcyBubyBsb25nZXIgaGF2ZSBhIGZhaWxlZAorCQkgKiBzZWN0b3IgbG9nIGJ1dCB1c2UgdGhpcyBhcmVhIHRvIGV4dGVuZCB0aGUgYmFkIHNlY3RvciBtYXAuCisJCSAqLworCQliYWRfc2VjdG9yX21hcCA9ICZidWZmZXJbRlRfSEVBREVSX0VORF07CisJfSBlbHNlIHsKKwkJLyogbm9uLXdpZGUgUUlDLTgwIHRhcGVzIGhhdmUgYSBmYWlsZWQgc2VjdG9yIGxvZyBhcmVhIHRoYXQKKwkJICogbXVzdG4ndCBiZSBpbmNsdWRlZCBpbiB0aGUgYmFkIHNlY3RvciBtYXAuCisJCSAqLworCQliYWRfc2VjdG9yX21hcCA9ICZidWZmZXJbRlRfRlNMICsgRlRfRlNMX1NJWkVdOworCX0KKwlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10XzExMDBmdCB8fCAKKwkgICAgZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciAgICB8fAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7CisJCWJzbV9oYXNoX3B0ciA9IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwOworCX0gZWxzZSB7CisJCWJzbV9oYXNoX3B0ciA9IE5VTEw7CisJfQorCWJzbV9kZWJ1Z19mYWtlKCk7CisJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgeworCQlwcmludF9iYWRfc2VjdG9yX21hcCgpOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgaW5saW5lIFNlY3Rvck1hcCBjdnQybWFwKHVuc2lnbmVkIGludCBzZWN0b3IpCit7CisJcmV0dXJuIDEgPDwgKCgoc2VjdG9yICYgMHg3ZmZmZmYpIC0gMSkgJSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3Z0MnNlZ21lbnQodW5zaWduZWQgaW50IHNlY3RvcikKK3sKKwlyZXR1cm4gKChzZWN0b3IgJiAweDdmZmZmZikgLSAxKSAvIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7Cit9CisKK3N0YXRpYyBpbnQgZm9yd2FyZF9zZWVrX2VudHJ5KGludCBzZWdtZW50X2lkLCAKKwkJCSAgICAgIFNlY3RvckNvdW50ICoqcHRyLCAKKwkJCSAgICAgIFNlY3Rvck1hcCAqbWFwKQoreworCXVuc2lnbmVkIGludCBzZWN0b3I7CisJaW50IHNlZ21lbnQ7CisKKwlkbyB7CisJCXNlY3RvciA9IGdldF9zZWN0b3IoKCpwdHIpKyspOworCQlzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKTsKKwl9IHdoaWxlIChzZWN0b3IgIT0gMCAmJiBzZWdtZW50IDwgc2VnbWVudF9pZCk7CisJKCpwdHIpIC0tOyAvKiBwb2ludCB0byBmaXJzdCBzZWN0b3IgPj0gc2VnbWVudF9pZCAqLworCS8qICBHZXQgYWxsIHNlY3RvcnMgaW4gc2VnbWVudF9pZAorCSAqLworCWlmIChzZWN0b3IgPT0gMCB8fCBzZWdtZW50ICE9IHNlZ21lbnRfaWQpIHsKKwkJKm1hcCA9IDA7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoKHNlY3RvciAmIDB4ODAwMDAwKSAmJgorCQkgICAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSkgeworCQkqbWFwID0gRU1QVFlfU0VHTUVOVDsKKwkJcmV0dXJuIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJfSBlbHNlIHsKKwkJaW50IGNvdW50ID0gMTsKKwkJU2VjdG9yQ291bnQgKnRtcF9wdHIgPSAoKnB0cikgKyAxOworCQkKKwkJKm1hcCA9IGN2dDJtYXAoc2VjdG9yKTsKKwkJd2hpbGUgKChzZWN0b3IgPSBnZXRfc2VjdG9yKHRtcF9wdHIrKykpICE9IDAgJiYKKwkJICAgICAgIChzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKSkgPT0gc2VnbWVudF9pZCkgeworCQkJKm1hcCB8PSBjdnQybWFwKHNlY3Rvcik7CisJCQkrK2NvdW50OworCQl9CisJCXJldHVybiBjb3VudDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmFja3dhcmRzX3NlZWtfZW50cnkoaW50IHNlZ21lbnRfaWQsCisJCQkJU2VjdG9yQ291bnQgKipwdHIsCisJCQkJU2VjdG9yTWFwICptYXApCit7CisJdW5zaWduZWQgaW50IHNlY3RvcjsKKwlpbnQgc2VnbWVudDsgLyogbWF4IHVuc2lnbmVkIGludCAqLworCisJaWYgKCpwdHIgPD0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXApIHsKKwkJKm1hcCA9IDA7CisJCXJldHVybiAwOworCX0KKwlkbyB7CisJCXNlY3RvciAgPSBnZXRfc2VjdG9yKC0tKCpwdHIpKTsKKwkJc2VnbWVudCA9IGN2dDJzZWdtZW50KHNlY3Rvcik7CisJfSB3aGlsZSAoKnB0ciA+IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwICYmIHNlZ21lbnQgPiBzZWdtZW50X2lkKTsKKwlpZiAoc2VnbWVudCA+IHNlZ21lbnRfaWQpIHsgLyogIGF0IHN0YXJ0IG9mIGxpc3QsIG5vIGVudHJ5IGZvdW5kICovCisJCSptYXAgPSAwOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHNlZ21lbnQgPCBzZWdtZW50X2lkKSB7CisJCS8qICBiZWZvcmUgc21hbGxlciBlbnRyeSwgYWRqdXN0IGZvciBvdmVyc2hvb3QgKi8KKwkJKCpwdHIpICsrOworCQkqbWFwID0gMDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgoc2VjdG9yICYgMHg4MDAwMDApICYmCisJCSAgIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIpKSB7CisJCSptYXAgPSBFTVBUWV9TRUdNRU5UOworCQlyZXR1cm4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKKwl9IGVsc2UgeyAvKiAgZ2V0IGFsbCBzZWN0b3JzIGluIHNlZ21lbnRfaWQgKi8KKwkJaW50IGNvdW50ID0gMTsKKworCQkqbWFwID0gY3Z0Mm1hcChzZWN0b3IpOworCQl3aGlsZSgqcHRyID4gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXApIHsKKwkJCXNlY3RvciA9IGdldF9zZWN0b3IoLS0oKnB0cikpOworCQkJc2VnbWVudCA9IGN2dDJzZWdtZW50KHNlY3Rvcik7CisJCQlpZiAoc2VnbWVudCAhPSBzZWdtZW50X2lkKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqbWFwIHw9IGN2dDJtYXAoc2VjdG9yKTsKKwkJCSsrY291bnQ7CisJCX0KKwkJaWYgKHNlZ21lbnQgPCBzZWdtZW50X2lkKSB7CisJCQkoKnB0cikgKys7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgbmV3X21hcCkKK3sKKwlTZWN0b3JDb3VudCAqcHRyID0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXA7CisJaW50IGNvdW50OworCWludCBuZXdfY291bnQ7CisJU2VjdG9yTWFwIG1hcDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF8xMTAwZnQgfHwgCisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgCisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJY291bnQgPSBmb3J3YXJkX3NlZWtfZW50cnkoc2VnbWVudF9pZCwgJnB0ciwgJm1hcCk7CisJCW5ld19jb3VudCA9IGNvdW50X29uZXMobmV3X21hcCk7CisJCS8qIElmIGZvcm1hdCBjb2RlID09IDQgcHV0IGVtcHR5IHNlZ21lbnQgaW5zdGVhZCBvZiAzMgorCQkgKiBiYWQgc2VjdG9ycy4KKwkJICovCisJCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJCWlmIChuZXdfY291bnQgPT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQkJCW5ld19jb3VudCA9IDE7CisJCQl9CisJCQlpZiAoY291bnQgPT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQkJCWNvdW50ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoY291bnQgIT0gbmV3X2NvdW50KSB7CisJCQkvKiBpbnNlcnQgKG9yIGRlbGV0ZSBpZiA8IDApIG5ld19jb3VudCAtIGNvdW50CisJCQkgKiBlbnRyaWVzLiAgTW92ZSB0cmFpbGluZyBwYXJ0IG9mIGxpc3QKKwkJCSAqIGluY2x1ZGluZyB0ZXJtaW5hdGluZyAwLgorCQkJICovCisJCQlTZWN0b3JDb3VudCAqaGlfcHRyID0gcHRyOworCisJCQlkbyB7CisJCQl9IHdoaWxlIChnZXRfc2VjdG9yKGhpX3B0cisrKSAhPSAwKTsKKwkJCS8qICBOb3RlOiBwdHIgaXMgb2YgdHlwZSBieXRlICosIGFuZCBlYWNoIGJhZCBzZWN0b3IKKwkJCSAqICBjb25zdW1lcyAzIGJ5dGVzLgorCQkJICovCisJCQltZW1tb3ZlKHB0ciArIG5ld19jb3VudCwgcHRyICsgY291bnQsCisJCQkJKHNpemVfdCkoaGlfcHRyIC0gKHB0ciArIGNvdW50KSkqc2l6ZW9mKFNlY3RvckNvdW50KSk7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInB1dHRpbmcgbWFwIDB4JTA4eCBhdCAlcCwgc2VnbWVudCAlZCIsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpbmV3X21hcCwgcHRyLCBzZWdtZW50X2lkKTsKKwkJaWYgKG5ld19jb3VudCA9PSAxICYmIG5ld19tYXAgPT0gRU1QVFlfU0VHTUVOVCkgeworCQkJcHV0X3NlY3RvcihwdHIrKywgKDB4ODAwMDAxICsgCisJCQkJCSAgc2VnbWVudF9pZCAqIAorCQkJCQkgIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpKTsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gMDsKKworCQkJd2hpbGUgKG5ld19tYXApIHsKKwkJCQlpZiAobmV3X21hcCAmIDEpIHsKKwkJCQkJcHV0X3NlY3RvcihwdHIrKywgCisJCQkJCQkgICAxICsgc2VnbWVudF9pZCAqIAorCQkJCQkJICAgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCArIGkpOworCQkJCX0KKwkJCQkrK2k7CisJCQkJbmV3X21hcCA+Pj0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCSgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtzZWdtZW50X2lkXSA9IG5ld19tYXA7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisjZW5kaWYgIC8qICAwICAqLworCitTZWN0b3JNYXAgZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoaW50IHNlZ21lbnRfaWQpCit7CisJaWYgKGZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPT0gLTEpIHsKKwkJLyogIFdoZW4gcmVhZGluZyBoZWFkZXIgc2VnbWVudCB3ZSdsbCBuZWVkIGEgYmxhbmsgbWFwLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChic21faGFzaF9wdHIgIT0gTlVMTCkgeworCQkvKiAgSW52YXJpYW50czoKKwkJICogICAgbWFwIC0gbWFzayB2YWx1ZSByZXR1cm5lZCBvbiBsYXN0IGNhbGwuCisJCSAqICAgIGJzbV9oYXNoX3B0ciAtIHBvaW50cyB0byBmaXJzdCBzZWN0b3IgZ3JlYXRlciBvciBlcXVhbCB0bworCQkgKiAgICAgICAgICBmaXJzdCBzZWN0b3IgaW4gbGFzdF9yZWZlcmVuY2VkIHNlZ21lbnQuCisJCSAqICAgIGxhc3RfcmVmZXJlbmNlZCAtIHNlZ21lbnQgaWQgdXNlZCBpbiB0aGUgbGFzdCBjYWxsLAorCQkgKiAgICAgICAgICAgICAgICAgICAgICBzZWN0b3IgYW5kIG1hcCBiZWxvbmcgdG8gdGhpcyBpZC4KKwkJICogIFRoaXMgY29kZSBpcyBkZXNpZ25lZCBmb3Igc2VxdWVudGlhbCBhY2Nlc3MgYW5kIHJldHJpZXMuCisJCSAqICBGb3IgdHJ1ZSByYW5kb20gYWNjZXNzIGl0IG1heSBoYXZlIHRvIGJlIHJlZGVzaWduZWQuCisJCSAqLworCQlzdGF0aWMgaW50IGxhc3RfcmVmZXJlbmNlID0gLTE7CisJCXN0YXRpYyBTZWN0b3JNYXAgbWFwOworCisJCWlmIChzZWdtZW50X2lkID4gbGFzdF9yZWZlcmVuY2UpIHsKKwkJCS8qICBTa2lwIGFsbCBzZWN0b3JzIGJlZm9yZSBzZWdtZW50X2lkCisJCQkgKi8KKwkJCWZvcndhcmRfc2Vla19lbnRyeShzZWdtZW50X2lkLCAmYnNtX2hhc2hfcHRyLCAmbWFwKTsKKwkJfSBlbHNlIGlmIChzZWdtZW50X2lkIDwgbGFzdF9yZWZlcmVuY2UpIHsKKwkJCS8qIFNraXAgYmFja3dhcmRzIHVudGlsIGJlZ2luIG9mIGJ1ZmZlciBvcgorCQkJICogZmlyc3Qgc2VjdG9yIGluIHNlZ21lbnRfaWQgCisJCQkgKi8KKwkJCWJhY2t3YXJkc19zZWVrX2VudHJ5KHNlZ21lbnRfaWQsICZic21faGFzaF9wdHIsICZtYXApOworCQl9CQkvKiBzZWdtZW50X2lkID09IGxhc3RfcmVmZXJlbmNlIDoga2VlcCBtYXAgKi8KKwkJbGFzdF9yZWZlcmVuY2UgPSBzZWdtZW50X2lkOworCQlyZXR1cm4gbWFwOworCX0gZWxzZSB7CisJCXJldHVybiAoKFNlY3Rvck1hcCAqKSBiYWRfc2VjdG9yX21hcClbc2VnbWVudF9pZF07CisJfQorfQorCisvKiAgVGhpcyBpcyBzaW1wbHkgaGVyZSB0byBwcmV2ZW50IHVzIGZyb20gb3ZlcndyaXRpbmcgb3RoZXIga2VybmVsCisgKiAgZGF0YS4gV3JpdGVzIHdpbGwgcmVzdWx0IGluIE5VTEwgUG9pbnRlciBkZXJlZmVyZW5jZS4KKyAqLwordm9pZCBmdGFwZV9pbml0X2JzbSh2b2lkKQoreworCWJhZF9zZWN0b3JfbWFwID0gTlVMTDsKKwlic21faGFzaF9wdHIgICA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0NTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9GVEFQRV9CU01fSAorI2RlZmluZSBfRlRBUEVfQlNNX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDcgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgYmFkIHNlY3RvciBtYXAgaGFuZGxpbmcKKyAqICAgICAgcm91dGluZXMgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKworI2RlZmluZSBFTVBUWV9TRUdNRU5UICAgICAgICAgICAoMHhmZmZmZmZmZikKKyNkZWZpbmUgRkFLRV9TRUdNRU5UICAgICAgICAgICAgKDB4ZmZmZmZmZmUpCisKKy8qICBtYXhpbXVtIChmb3JtYXQgY29kZSA0KSBiYWQgc2VjdG9yIG1hcCBzaXplIChieXRlcykuCisgKi8KKyNkZWZpbmUgQkFEX1NFQ1RPUl9NQVBfU0laRSAgICAgKDI5ICogU0VDVE9SX1NJWkUgLSAyNTYpCisKKy8qICBmb3JtYXQgY29kZSA0IGJhZCBzZWN0b3IgZW50cnksIGZ0YXBlIHVzZXMgdGhpcworICogIGludGVybmFsbHkgZm9yIGFsbCBmb3JtYXQgY29kZXMKKyAqLwordHlwZWRlZiBfX3UzMiBTZWN0b3JNYXA7CisvKiAgdmFyaWFibGUgYW5kIDExMDAgZnQgYmFkIHNlY3RvciBtYXAgZW50cnkuIFRoZXNlIHRocmVlIGJ5dGVzIHJlcHJlc2VudAorICogIGEgc2luZ2xlIHNlY3RvciBhZGRyZXNzIG1lYXN1cmVkIGZyb20gQk9ULiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTmV3U2VjdG9yTWFwIHsgICAgICAgICAgCisJX191OCBieXRlc1szXTsKK30gU2VjdG9yQ291bnQ7CisKKworLyoKKyAqICAgICAgZnRhcGUtYnNtLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworCisvKgorICogICAgICBmdGFwZS1ic20uYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHVwZGF0ZV9iYWRfc2VjdG9yX21hcChfX3U4ICogYnVmZmVyKTsKK2V4dGVybiB2b2lkIGZ0YXBlX2V4dHJhY3RfYmFkX3NlY3Rvcl9tYXAoX191OCAqIGJ1ZmZlcik7CitleHRlcm4gU2VjdG9yTWFwIGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkKTsKK2V4dGVybiBfX3U4ICpmdGFwZV9maW5kX2VuZF9vZl9ic21fbGlzdChfX3U4ICogYWRkcmVzcyk7CitleHRlcm4gdm9pZCBmdGFwZV9pbml0X2JzbSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZjIwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzE2IDIzOjMzOjExICQKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhbGxvY2F0b3IvZGVhbGxvY3RvciBmb3IgZnRhcGUncyBkeW5hbWljIGRtYQorICogIGJ1ZmZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorCisvKiAgRE1BJ2FibGUgbWVtb3J5IGFsbG9jYXRpb24gc3R1ZmYuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkICpkbWFhbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlhZGRyID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIGdldF9vcmRlcihzaXplKSk7CisJaWYgKGFkZHIpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGFkZHIpOyBwYWdlIDwgdmlydF90b19wYWdlKGFkZHIrc2l6ZSk7IHBhZ2UrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKwl9CisJcmV0dXJuICh2b2lkICopYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYWZyZWUodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHNpemUgPiAwKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZSgodW5zaWduZWQgbG9uZylhZGRyKTsKKwkJICAgICBwYWdlIDwgdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIrc2l6ZSk7IHBhZ2UrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworCX0KK30KKworc3RhdGljIGludCBhZGRfb25lX2J1ZmZlcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChmdF9ucl9idWZmZXJzID49IEZUX01BWF9OUl9CVUZGRVJTKSB7CisJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwl9CisJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdID0ga21hbGxvYyhzaXplb2YoYnVmZmVyX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmIChmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10gPT0gTlVMTCkgeworCQlUUkFDRV9FWElUIC1FTk9NRU07CisJfQorCW1lbXNldChmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10sIDAsIHNpemVvZihidWZmZXJfc3RydWN0KSk7CisJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdLT5hZGRyZXNzID0gZG1hYWxsb2MoRlRfQlVGRl9TSVpFKTsKKwlpZiAoZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdLT5hZGRyZXNzID09IE5VTEwpIHsKKwkJa2ZyZWUoZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdKTsKKwkJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdID0gTlVMTDsKKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwlmdF9ucl9idWZmZXJzICsrOworCVRSQUNFKGZ0X3RfaW5mbywgImJ1ZmZlciBuciAjJWQgQCAlcCwgZG1hIGFyZWEgQCAlcCIsCisJICAgICAgZnRfbnJfYnVmZmVycywKKwkgICAgICBmdF9idWZmZXJbZnRfbnJfYnVmZmVycy0xXSwKKwkgICAgICBmdF9idWZmZXJbZnRfbnJfYnVmZmVycy0xXS0+YWRkcmVzcyk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBkZWxfb25lX2J1ZmZlcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCWlmIChmdF9ucl9idWZmZXJzID4gMCkgeworCQlUUkFDRShmdF90X2luZm8sICJyZWxlYXNpbmcgYnVmZmVyIG5yICMlZCBAICVwLCBkbWEgYXJlYSBAICVwIiwKKwkJICAgICAgZnRfbnJfYnVmZmVycywKKwkJICAgICAgZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnMtMV0sCisJCSAgICAgIGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzLTFdLT5hZGRyZXNzKTsKKwkJZnRfbnJfYnVmZmVycyAtLTsKKwkJZG1hZnJlZShmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10tPmFkZHJlc3MsIEZUX0JVRkZfU0laRSk7CisJCWtmcmVlKGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSk7CisJCWZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSA9IE5VTEw7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK2ludCBmdGFwZV9zZXRfbnJfYnVmZmVycyhpbnQgY250KQoreworCWludCBkZWx0YSA9IGNudCAtIGZ0X25yX2J1ZmZlcnM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZGVsdGEgPiAwKSB7CisJCXdoaWxlIChkZWx0YS0tKSB7CisJCQlpZiAoYWRkX29uZV9idWZmZXIoKSA8IDApIHsKKwkJCQlUUkFDRV9FWElUIC1FTk9NRU07CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRlbHRhIDwgMCkgeworCQl3aGlsZSAoZGVsdGErKykgeworCQkJZGVsX29uZV9idWZmZXIoKTsKKwkJfQorCX0KKwlmdGFwZV96YXBfcmVhZF9idWZmZXJzKCk7CisJVFJBQ0VfRVhJVCAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzk5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfRlRBUEVfQlVGRkVSX0gKKyNkZWZpbmUgX0ZUQVBFX0JVRkZFUl9ICisKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDggJAorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFsbG9jYXRvci9kZWFsbG9jdG9yIGZvciBmdGFwZSdzIGR5bmFtaWMgZG1hCisgKiAgYnVmZmVyLgorICovCisKK2V4dGVybiBpbnQgIGZ0YXBlX3NldF9ucl9idWZmZXJzKGludCBjbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZiMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA4ICQKKyAqCisgKiAgICAgIEdQIGNhbGlicmF0aW9uIHJvdXRpbmUgZm9yIHByb2Nlc3NvciBzcGVlZCBkZXBlbmRlbnQKKyAqICAgICAgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaWYgZGVmaW5lZChfX2FscGhhX18pCisjIGluY2x1ZGUgPGFzbS9od3JwYi5oPgorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorIyBpbmNsdWRlIDxhc20vbXNyLmg+CisjIGluY2x1ZGUgPGFzbS90aW1leC5oPgorI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyMgaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorCisjdW5kZWYgREVCVUcKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCisjIGVycm9yIEZ0YXBlIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUhCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwc19wZXJfY3ljbGUgPSAwOworI2VuZGlmCisKK3N0YXRpYyBzcGlubG9ja190IGNhbGlicl9sb2NrOworCisvKgorICogTm90ZTogT24gSW50ZWwgUENzLCB0aGUgY2xvY2sgdGlja3MgYXQgMTAwIEh6IChIWj09MTAwKSB3aGljaCBpcworICogdG9vIHNsb3cgZm9yIGNlcnRhaW4gdGltZW91dHMgKGFuZCB0aGF0IGNsb2NrIGRvZXNuJ3QgZXZlbiB0aWNrCisgKiB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkKS4gIEZvciB0aGF0IHJlYXNvbiwgdGhlIDgyNTQgdGltZXIgaXMKKyAqIHVzZWQgZGlyZWN0bHkgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCB0aW1lb3V0cy4gIEhvd2V2ZXIsIG9uCisgKiBBbHBoYSBQQ3MsIHRoZSA4MjU0IGlzICpub3QqIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjbG9jayB0aWNrCisgKiAod2hpY2ggaXMgMTAyNCBIeiwgbm9ybWFsbHkpIGFuZCB0aGUgODI1NCB0aW1lciBydW5zIGF0IHNvbWUKKyAqICJyYW5kb20iIGZyZXF1ZW5jeSAoaXQgc2VlbXMgdG8gcnVuIGF0IDE4SHosIGJ1dCBpdCdzIG5vdCBzYWZlIHRvCisgKiByZWx5IG9uIHRoaXMgdmFsdWUpLiAgSW5zdGVhZCwgd2UgdXNlIHRoZSBBbHBoYSdzICJycGNjIgorICogaW5zdHJ1Y3Rpb24gdG8gcmVhZCBjeWNsZSBjb3VudHMuICBBcyB0aGlzIGlzIGEgMzIgYml0IGNvdW50ZXIsCisgKiBpdCB3aWxsIG92ZXJmbG93IG9ubHkgb25jZSBwZXIgMzAgc2Vjb25kcyAob24gYSAyMDBNSHogbWFjaGluZSksCisgKiB3aGljaCBpcyBwbGVudHkuCisgKi8KKwordW5zaWduZWQgaW50IGZ0YXBlX3RpbWVzdGFtcCh2b2lkKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorCXVuc2lnbmVkIGxvbmcgcjsKKworCWFzbSB2b2xhdGlsZSAoInJwY2MgJTAiIDogIj1yIiAocikpOworCXJldHVybiByOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCXVuc2lnbmVkIGxvbmcgcjsKKwlyZHRzY2wocik7CisJcmV0dXJuIHI7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCisvKgorICogTm90ZSB0aGF0IHRoZXJlIGlzIHNvbWUgdGltZSBiZXR3ZWVuIGNvdW50ZXIgdW5kZXJmbG93aW5nIGFuZCBqaWZmaWVzCisgKiBpbmNyZWFzaW5nLCBzbyB0aGUgY29kZSBiZWxvdyB3b24ndCBhbHdheXMgZ2l2ZSBjb3JyZWN0IG91dHB1dC4KKyAqIC1Wb2p0ZWNoCisgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191MTYgbG87CisJX191MTYgaGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoMHgwMCwgMHg0Myk7CS8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisJbG8gPSBpbmJfcCgweDQwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLworCWxvIHw9IGluYigweDQwKSA8PCA4OworCWhpID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCXJldHVybiAoKGhpICsgMSkgKiAodW5zaWduZWQgaW50KSBMQVRDSCkgLSBsbzsgIC8qIGRvd25jb3VudGVyICEgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCh2b2lkKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJcmV0dXJuIGZ0YXBlX3RpbWVzdGFtcCgpOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbGlicl9sb2NrLCBmbGFncyk7CisgCW91dGJfcCgweDAwLCAweDQzKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKwljb3VudCA9IGluYl9wKDB4NDApOwkvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKDB4NDApIDw8IDg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKExBVENIIC0gY291bnQpOwkvKiBub3JtYWw6IGRvd25jb3VudGVyICovCisjZW5kaWYKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkaWZmKHVuc2lnbmVkIGludCB0MCwgdW5zaWduZWQgaW50IHQxKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJcmV0dXJuICh0MSAtIHQwKTsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisJLyoKKwkgKiBUaGlzIGlzIHRyaWNreTogdG8gd29yayBmb3IgYm90aCBzaG9ydCBhbmQgZnVsbCBmdGFwZV90aW1lc3RhbXBzCisJICogd2UnbGwgaGF2ZSB0byBkaXNjcmltaW5hdGUgYmV0d2VlbiB0aGVzZS4KKwkgKiBJZiBpdCBfbG9va3NfIGxpa2Ugc2hvcnQgc3RhbXBzIHdpdGggd3JhcHBpbmcgYXJvdW5kIHdlJ2xsCisJICogYXN1bWUgaXQgYXJlLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBzbWFsbCBlcnJvciBpZiBpdCByZWFsbHkKKwkgKiB3YXMgYSAodmVyeSBsYXJnZSkgZGVsdGEgZnJvbSBmdWxsIGZ0YXBlX3RpbWVzdGFtcHMuCisJICovCisJcmV0dXJuICh0MSA8PSB0MCAmJiB0MCA8PSBMQVRDSCkgPyB0MSArIExBVENIIC0gdDAgOiB0MSAtIHQwOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlY3ModW5zaWduZWQgaW50IGNvdW50KQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJcmV0dXJuIChwc19wZXJfY3ljbGUgKiBjb3VudCkgLyAxMDAwMDAwVUw7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXJldHVybiAoMTAwMDAgKiBjb3VudCkgLyAoKENMT0NLX1RJQ0tfUkFURSArIDUwKSAvIDEwMCk7CisjZW5kaWYKK30KKwordW5zaWduZWQgaW50IGZ0YXBlX3RpbWVkaWZmKHVuc2lnbmVkIGludCB0MCwgdW5zaWduZWQgaW50IHQxKQoreworCS8qCisJICogIENhbGN1bGF0ZSBkaWZmZXJlbmNlIGluIHVzZWMgZm9yIGZ0YXBlX3RpbWVzdGFtcCByZXN1bHRzIHQwICYgdDEuCisJICogIE5vdGUgdGhhdCBvbiB0aGUgaTM4NiBwbGF0Zm9ybSB3aXRoIHNob3J0IHRpbWUtc3RhbXBzLCB0aGUKKwkgKiAgbWF4aW11bSBhbGxvd2VkIHRpbWVzcGFuIGlzIDEvSFogb3Igd2UnbGwgbG9zZSB0aWNrcyEKKwkgKi8KKwlyZXR1cm4gdXNlY3MoZGlmZih0MCwgdDEpKTsKK30KKworLyogICAgICBUbyBnZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgSS9PIHBlcmZvcm1hbmNlLAorICogICAgICBtZWFzdXJlIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW5iKCkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHRpbWVfaW5iKHZvaWQpCit7CisJaW50IGk7CisJaW50IHQwLCB0MTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCXQwID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJZm9yIChpID0gMDsgaSA8IDEwMDA7ICsraSkgeworCQlzdGF0dXMgPSBpbmIoZmRjLm1zcik7CisJfQorCXQxID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKwlUUkFDRShmdF90X2luZm8sICJpbmIoKSBkdXJhdGlvbjogJWQgbnNlYyIsIGZ0YXBlX3RpbWVkaWZmKHQwLCB0MSkpOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY2xvY2sodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCXBzX3Blcl9jeWNsZSA9IDEwMDAwMDAwMDBVTCAvIGNwdV9raHo7CisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlleHRlcm4gc3RydWN0IGh3cnBiX3N0cnVjdCAqaHdycGI7CisJcHNfcGVyX2N5Y2xlID0gKDEwMDAqMTAwMCoxMDAwKjEwMDBVTCkgLyBod3JwYi0+Y3ljbGVfZnJlcTsKKyNlbmRpZgorCVRSQUNFX0VYSVQ7Cit9CisKKy8qCisgKiAgICAgIElucHV0OiAgZnVuY3Rpb24gdGFraW5nIGludCBjb3VudCBhcyBwYXJhbWV0ZXIuCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgdG8gY2FsY3VsYXRlZCBjYWxpYnJhdGlvbiB2YXJpYWJsZXMuCisgKi8KK3ZvaWQgZnRhcGVfY2FsaWJyYXRlKGNoYXIgKm5hbWUsCisJCSAgICB2b2lkICgqZnVuKSAodW5zaWduZWQgaW50KSwgCisJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl9jb3VudCwgCisJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl90aW1lKQoreworCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRjID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHRpbWU7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwl1bnNpZ25lZCBpbnQgb2xkX3RjID0gMDsKKwl1bnNpZ25lZCBpbnQgb2xkX2NvdW50ID0gMTsKKwl1bnNpZ25lZCBpbnQgb2xkX3RpbWUgPSAxOworI2VuZGlmCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZmlyc3RfdGltZSkgeyAgICAgICAgICAgICAvKiBnZXQgaWRlYSBvZiBJL08gcGVyZm9ybWFuY2UgKi8KKwkJaW5pdF9jbG9jaygpOworCQl0aW1lX2luYigpOworCQlmaXJzdF90aW1lID0gMDsKKwl9CisJLyogICAgdmFsdWUgb2YgdGltZW91dCBtdXN0IGJlIHNldCBzbyB0aGF0IG9uIHZlcnkgc2xvdyBzeXN0ZW1zCisJICogICAgaXQgd2lsbCBnaXZlIGEgdGltZSBsZXNzIHRoYW4gb25lIGppZmZ5LCBhbmQgb24KKwkgKiAgICB2ZXJ5IGZhc3Qgc3lzdGVtcyBpdCdsbCBnaXZlIHJlYXNvbmFibGUgcHJlY2lzaW9uLgorCSAqLworCisJY291bnQgPSA0MDsKKwlmb3IgKGkgPSAwOyBpIDwgMTU7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgdDA7CisJCXVuc2lnbmVkIGludCB0MTsKKwkJdW5zaWduZWQgaW50IG9uY2U7CisJCXVuc2lnbmVkIGludCBtdWx0aXBsZTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkqY2FsaWJyX2NvdW50ID0KKwkJKmNhbGlicl90aW1lID0gY291bnQ7CS8qIHNldCBUQyB0byAxICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCQlmdW4oMCk7CQkvKiBkdW1teSwgZ2V0IGNvZGUgaW50byBjYWNoZSAqLworCQl0MCA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOworCQlmdW4oMCk7CQkvKiBvdmVyaGVhZCArIG9uZSB0ZXN0ICovCisJCXQxID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCW9uY2UgPSBkaWZmKHQwLCB0MSk7CisJCXQwID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCWZ1bihjb3VudCk7CQkvKiBvdmVyaGVhZCArIGNvdW50IHRlc3RzICovCisJCXQxID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCW11bHRpcGxlID0gZGlmZih0MCwgdDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCQl0aW1lID0gZnRhcGVfdGltZWRpZmYoMCwgbXVsdGlwbGUgLSBvbmNlKTsKKwkJdGMgPSAoMTAwMCAqIHRpbWUpIC8gKGNvdW50IC0gMSk7CisJCVRSQUNFKGZ0X3RfYW55LCAib25jZTolM2QgdXMsJTZkIHRpbWVzOiU2ZCB1cywgVEM6JTVkIG5zIiwKKwkJCXVzZWNzKG9uY2UpLCBjb3VudCAtIDEsIHVzZWNzKG11bHRpcGxlKSwgdGMpOworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJCS8qCisJCSAqIEluY3JlYXNlIHRoZSBjYWxpYnJhdGlvbiBjb3VudCBleHBvbmVudGlhbGx5IHVudGlsIHRoZQorCQkgKiBjYWxpYnJhdGlvbiB0aW1lIGV4Y2VlZHMgMTAwIG1zLgorCQkgKi8KKwkJaWYgKHRpbWUgPj0gMTAwKjEwMDApIHsKKwkJCWJyZWFrOworCQl9CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCQkvKgorCQkgKiBpbmNyZWFzZSB0aGUgY291bnQgdW50aWwgdGhlIHJlc3VsdGluZyB0aW1lIG5lYXJzIDIvSFosCisJCSAqIHRoZW4gdGhlIHRjIHdpbGwgZHJvcCBzaGFycGx5IGJlY2F1c2Ugd2UgbG9zZSBMQVRDSCBjb3VudHMuCisJCSAqLworCQlpZiAodGMgPD0gb2xkX3RjIC8gMikgeworCQkJdGltZSA9IG9sZF90aW1lOworCQkJY291bnQgPSBvbGRfY291bnQ7CisJCQlicmVhazsKKwkJfQorCQlvbGRfdGMgPSB0YzsKKwkJb2xkX2NvdW50ID0gY291bnQ7CisJCW9sZF90aW1lID0gdGltZTsKKyNlbmRpZgorCQljb3VudCAqPSAyOworCX0KKwkqY2FsaWJyX2NvdW50ID0gY291bnQgLSAxOworCSpjYWxpYnJfdGltZSAgPSB0aW1lOworCVRSQUNFKGZ0X3RfaW5mbywgIlRDIGZvciBgJXMoKScgPSAlZCBuc2VjIChhdCAlZCBjb3VudHMpIiwKKwkgICAgIG5hbWUsICgxMDAwICogKmNhbGlicl90aW1lKSAvICpjYWxpYnJfY291bnQsICpjYWxpYnJfY291bnQpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZTc1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9GVEFQRV9DQUxJQlJfSAorI2RlZmluZSBfRlRBUEVfQ0FMSUJSX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3Zlbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMSAkCisgKiAkRGF0ZTogMTk5Ny8wOS8xOSAwOTowNToyNiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgYSBncCBjYWxpYnJhdGlvbiByb3V0aW5lIGZvcgorICogICAgICBoYXJkd2FyZSBkZXBlbmRlbnQgdGltZW91dCBmdW5jdGlvbnMuCisgKi8KKworZXh0ZXJuIHZvaWQgZnRhcGVfY2FsaWJyYXRlKGNoYXIgKm5hbWUsCisJCQkgICAgdm9pZCAoKmZ1bikgKHVuc2lnbmVkIGludCksCisJCQkgICAgdW5zaWduZWQgaW50ICpjYWxpYnJfY291bnQsCisJCQkgICAgdW5zaWduZWQgaW50ICpjYWxpYnJfdGltZSk7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0YXBlX3RpbWVzdGFtcCh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRhcGVfdGltZWRpZmYodW5zaWduZWQgaW50IHQwLCB1bnNpZ25lZCBpbnQgdDEpOworCisjZW5kaWYgLyogX0ZUQVBFX0NBTElCUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlMDQzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYwpAQCAtMCwwICsxLDg5NyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgICAgICAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYyx2ICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqICREYXRlOiAxOTk3LzExLzExIDE0OjM3OjQ0ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXJlYWQvd3JpdGUgZnRhcGUgZnVuY3Rpb25zIGZvciB0aGUKKyAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIGVhc2UgcG9ydGluZyBiZXR3ZWVuIHByZS0yLjQueCBhbmQgbGF0ZXIga2VybmVscyAqLworI2RlZmluZSB2bWFfZ2V0X3Bnb2ZmKHYpICAgICAgKCh2KS0+dm1fcGdvZmYpCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitmdGFwZV9pbmZvIGZ0YXBlX3N0YXR1cyA9IHsKKy8qICB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KKwl7IDAsIH0sICAgICAvKiBkcml2ZSB0eXBlICovCisvKiAgZGF0YSByYXRlcyAqLworCTUwMCwgICAgICAgIC8qIHVzZWQgZGF0YSByYXRlICovCisJNTAwLCAgICAgICAgLyogZHJpdmUgbWF4IHJhdGUgKi8KKwk1MDAsICAgICAgICAvKiBmZGMgbWF4IHJhdGUgICAqLworLyogIGRyaXZlIHNlbGVjdGlvbiwgZWl0aGVyIEZUQVBFX1NFTF9BL0IvQy9EICovCisJLTEsICAgICAvKiBkcml2ZSBzZWxlY3Rpb24gKi8KKy8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLworCTAsICAgICAgICAgIC8qIGZvcm1hdHRlZCAqLworCTEsICAgICAgICAgIC8qIG5vIHRhcGUgKi8KKwkxLCAgICAgICAgICAvKiB3cml0ZSBwcm90ZWN0ZWQgKi8KKwkxLCAgICAgICAgICAvKiBuZXcgdGFwZSAqLworLyogIHZhbHVlcyBvZiBsYXN0IHF1ZXJpZWQgZHJpdmUvdGFwZSBzdGF0dXMgYW5kIGVycm9yICovCisJe3swLH19LCAgICAgLyogbGFzdCBlcnJvciBjb2RlICovCisJe3swLH19LCAgICAgLyogZHJpdmUgc3RhdHVzLCBjb25maWd1cmF0aW9uLCB0YXBlIHN0YXR1cyAqLworLyogIGNhcnRyaWRnZSBnZW9tZXRyeSAqLworICAgICAgICAyMCwgICAgICAgICAvKiB0cmFja3NfcGVyX3RhcGUgKi8KKyAgICAgICAgMTAyLCAgICAgICAgLyogc2VnbWVudHNfcGVyX3RyYWNrICovCisvKiAgbG9jYXRpb24gb2YgaGVhZGVyIHNlZ21lbnRzLCBldGMuICovCisJLTEsICAgICAvKiB1c2VkX2hlYWRlcl9zZWdtZW50ICovCisJLTEsICAgICAvKiBoZWFkZXJfc2VnbWVudF8xICovCisJLTEsICAgICAvKiBoZWFkZXJfc2VnbWVudF8yICovCisJLTEsICAgICAvKiBmaXJzdF9kYXRhX3NlZ21lbnQgKi8KKyAgICAgICAgLTEsICAgICAvKiBsYXN0X2RhdGFfc2VnbWVudCAqLworLyogIHRoZSBmb3JtYXQgY29kZSBhcyBzdG9yZWQgaW4gdGhlIGhlYWRlciBzZWdtZW50ICAqLworCWZtdF9ub3JtYWwsIC8qIGZvcm1hdCBjb2RlICovCisvKiAgdGhlIGRlZmF1bHQgZm9yIHRoZSBxaWMgc3RkOiB1bmtub3duICovCisJLTEsCisvKiAgaXMgdGFwZSBydW5uaW5nPyAqLworCWlkbGUsICAgICAgIC8qIHJ1bm5lcl9zdGF0ZSAqLworLyogIGlzIHRhcGUgcmVhZGluZy93cml0aW5nL3ZlcmlmeWluZy9mb3JtYXR0aW5nL2RlbGV0aW5nICovCisJaWRsZSwgICAgICAgLyogZHJpdmVyIHN0YXRlICovCisvKiAgZmxhZ3MgZmF0YWwgaGFyZHdhcmUgZXJyb3IgKi8KKwkxLCAgICAgICAgICAvKiBmYWlsdXJlICovCisvKiAgaGlzdG9yeSByZWNvcmQgKi8KKwl7IDAsIH0gICAgICAvKiBoaXN0b3J5IHJlY29yZCAqLworfTsKKwkKK2ludCBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAgICAgPSAxMDIwOworaW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9IDQ7CitpbnQgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOyAvKiBuZWVkIHRvIGJlIGdsb2JhbCBmb3IgZnRhcGVfcmVzZXRfZHJpdmUoKQorCQkJCSAgKiBpbiBmdGFwZS1pby5jCisJCQkJICAqLworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBjb25zdCB2ZW5kb3Jfc3RydWN0IHZlbmRvcnNbXSA9IFFJQzExN19WRU5ET1JTOworc3RhdGljIGNvbnN0IHdha2V1cF9tZXRob2QgbWV0aG9kc1tdID0gV0FLRVVQX01FVEhPRFM7CisKK2NvbnN0IGZ0YXBlX2luZm8gKmZ0YXBlX2dldF9zdGF0dXModm9pZCkKK3sKKyNpZiBkZWZpbmVkKFNUQVRVU19QQVJBTk9ZQSkKKwlzdGF0aWMgZnRhcGVfaW5mbyBnZXRfc3RhdHVzOworCisJZ2V0X3N0YXR1cyA9IGZ0YXBlX3N0YXR1czsKKwlyZXR1cm4gJmdldF9zdGF0dXM7CisjZWxzZQorCXJldHVybiAmZnRhcGVfc3RhdHVzOyAvKiAgbWF5YmUgcmV0dXJuIG9ubHkgYSBjb3B5IG9mIGl0IHRvIGFzc3VyZSAKKwkJCSAgICAgICAqICByZWFkIG9ubHkgYWNjZXNzCisJCQkgICAgICAgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGZ0YXBlX25vdF9vcGVyYXRpb25hbChpbnQgc3RhdHVzKQoreworCS8qIHJldHVybiB0cnVlIGlmIHN0YXR1cyBpbmRpY2F0ZXMgdGFwZSBjYW4gbm90IGJlIHVzZWQuCisJICovCisJcmV0dXJuICgoc3RhdHVzIF4gUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCkgJgorCQkoUUlDX1NUQVRVU19FUlJPUiB8CisJCSBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UIHwKKwkJIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSkpOworfQorCitpbnQgZnRhcGVfc2Vla190b19lb3Qodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsICZzdGF0dXMpLCk7CisJd2hpbGUgKChzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0VPVCkgPT0gMCkgeworCQlpZiAoZnRhcGVfbm90X29wZXJhdGlvbmFsKHN0YXR1cykpIHsKKwkJCVRSQUNFX0VYSVQgLUVJTzsKKwkJfQorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1BIWVNJQ0FMX0ZPUldBUkQsCisJCQkJCSAgICAgICBmdGFwZV90aW1lb3V0LnJld2luZCwmc3RhdHVzKSwpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9zZWVrX3RvX2JvdCh2b2lkKQoreworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cyksKTsKKwl3aGlsZSAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfQk9UKSA9PSAwKSB7CisJCWlmIChmdGFwZV9ub3Rfb3BlcmF0aW9uYWwoc3RhdHVzKSkgeworCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmRfd2FpdChRSUNfUEhZU0lDQUxfUkVWRVJTRSwKKwkJCQkJICAgICAgIGZ0YXBlX3RpbWVvdXQucmV3aW5kLCZzdGF0dXMpLCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBmdGFwZV9uZXdfY2FydHJpZGdlKHZvaWQpCit7CisJZnRfbG9jYXRpb24udHJhY2sgPSAtMTsgLyogZm9yY2Ugc2VlayBvbiBmaXJzdCBhY2Nlc3MgKi8KKwlmdGFwZV96YXBfcmVhZF9idWZmZXJzKCk7CisJZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnMoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZ0YXBlX2Fib3J0X29wZXJhdGlvbih2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBydW5uaW5nKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhYm9ydGluZyBydW5uZXIsIHdhaXRpbmciKTsKKwkJCisJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwkJLyogc2V0IHRpbWVvdXQgc28gdGhhdCB0aGUgdGFwZSB3aWxsIHJ1biB0byBsb2dpY2FsIEVPVAorCQkgKiBpZiB3ZSBtaXNzZWQgdGhlIGxhc3Qgc2VjdG9yIGFuZCB0aGVyZSBhcmUgbm8gcXVldWUgcHVsc2VzLgorCQkgKi8KKwkJcmVzdWx0ID0gZnRhcGVfZHVtYl9zdG9wKCk7CisJfQorCWlmIChmdF9ydW5uZXJfc3RhdHVzICE9IGlkbGUpIHsKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmb3JjaW5nIHJ1bm5lciBhYm9ydCIpOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzdG9wcGluZyB0YXBlIik7CisJCXJlc3VsdCA9IGZ0YXBlX3N0b3BfdGFwZSgmc3RhdHVzKTsKKwkJZnRfbG9jYXRpb24ua25vd24gPSAwOworCQlmdF9ydW5uZXJfc3RhdHVzICA9IGlkbGU7CisJfQorCWZ0YXBlX3Jlc2V0X2J1ZmZlcigpOworCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKKwlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbG9va3VwX3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgdmVuZG9yX2lkKQoreworCWludCBpID0gMDsKKworCXdoaWxlICh2ZW5kb3JzW2ldLnZlbmRvcl9pZCAhPSB2ZW5kb3JfaWQpIHsKKwkJaWYgKCsraSA+PSBOUl9JVEVNUyh2ZW5kb3JzKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9kZXRhY2hfZHJpdmUodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiZGlzYWJsaW5nIHRhcGUgZHJpdmUgYW5kIGZkYyIpOworCWZ0YXBlX3B1dF9kcml2ZV90b19zbGVlcChmdF9kcml2ZV90eXBlLndha2VfdXApOworCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDEpOwkvKiBvbmUgYWx3YXlzIGNvbWVzICovCisJZmRjX2Rpc2FibGUoKTsKKwlmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOworCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9oaXN0b3J5KHZvaWQpCit7CisJZnRfaGlzdG9yeS51c2VkID0gMDsKKwlmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycyA9CisJCWZ0X2hpc3RvcnkuaWRfY3JjX2Vycm9ycyA9CisJCWZ0X2hpc3RvcnkuZGF0YV9hbV9lcnJvcnMgPQorCQlmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycyA9CisJCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMgPQorCQlmdF9oaXN0b3J5Lm5vX2RhdGFfZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5yZXRyaWVzID0KKwkJZnRfaGlzdG9yeS5jcmNfZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMgPQorCQlmdF9oaXN0b3J5LmVjY19mYWlsdXJlcyA9CisJCWZ0X2hpc3RvcnkuY29ycmVjdGVkID0KKwkJZnRfaGlzdG9yeS5kZWZlY3RzID0KKwkJZnRfaGlzdG9yeS5yZXdpbmRzID0gMDsKK30KKworc3RhdGljIGludCBmdGFwZV9hY3RpdmF0ZV9kcml2ZSh2ZW5kb3Jfc3RydWN0ICogZHJpdmVfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qIElmIHdlIGFscmVhZHkga25vdyB0aGUgZHJpdmUgdHlwZSwgd2FrZSBpdCB1cC4KKwkgKiBFbHNlIHRyeSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZHJpdmUgaXMgYXR0YWNoZWQuCisJICovCisJaWYgKGRyaXZlX3R5cGUtPndha2VfdXAgIT0gdW5rbm93bl93YWtlX3VwKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImVuYWJsaW5nIHRhcGUgZHJpdmUgYW5kIGZkYyIpOworCQlyZXN1bHQgPSBmdGFwZV93YWtldXBfZHJpdmUoZHJpdmVfdHlwZS0+d2FrZV91cCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlUUkFDRShmdF90X2VyciwgImtub3duIHdha2V1cCBtZXRob2QgZmFpbGVkIik7CisJCX0KKwl9IGVsc2UgeworCQl3YWtlX3VwX3R5cGVzIG1ldGhvZDsKKwkJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOworCQlpZiAoVFJBQ0VfTEVWRUwgPCBmdF90X2Zsb3cpIHsKKwkJCVNFVF9UUkFDRV9MRVZFTChmdF90X2J1Zyk7CisJCX0KKworCQkvKiAgVHJ5IHRvIGF3YWtlbiB0aGUgZHJpdmUgdXNpbmcgYWxsIGtub3duIG1ldGhvZHMuCisJCSAqICBMb3dlciB0cmFjaW5nIGZvciBhIHdoaWxlLgorCQkgKi8KKwkJZm9yIChtZXRob2Q9bm9fd2FrZV91cDsgbWV0aG9kIDwgTlJfSVRFTVMobWV0aG9kcyk7ICsrbWV0aG9kKSB7CisJCQlkcml2ZV90eXBlLT53YWtlX3VwID0gbWV0aG9kOworI2lmZGVmIENPTkZJR19GVF9UV09fRFJJVkVTCisJCQkvKiAgVGVzdCBzZXR1cCBmb3IgZHVhbCBkcml2ZSBjb25maWd1cmF0aW9uLgorCQkJICogIC9kZXYvcmZ0MiB1c2VzIG1vdW50YWluIHdha2V1cAorCQkJICogIC9kZXYvcmZ0MyB1c2VzIGNvbG9yYWRvIHdha2V1cAorCQkJICogIE90aGVyIHN5c3RlbXMgd2lsbCB1c2UgdGhlIG5vcm1hbCBzY2hlbWUuCisJCQkgKi8KKwkJCWlmICgoZnRfZHJpdmVfc2VsIDwgMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKwkJCSAgICAoZnRfZHJpdmVfc2VsID09IDIgJiYgbWV0aG9kID09IEZUX1dBS0VfVVBfMSkgfHwKKwkJCSAgICAoZnRfZHJpdmVfc2VsID09IDMgJiYgbWV0aG9kID09IEZUX1dBS0VfVVBfMikpIHsKKwkJCQlyZXN1bHQ9ZnRhcGVfd2FrZXVwX2RyaXZlKGRyaXZlX3R5cGUtPndha2VfdXApOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSAtRUlPOworCQkJfQorI2Vsc2UKKwkJCXJlc3VsdCA9IGZ0YXBlX3dha2V1cF9kcml2ZShkcml2ZV90eXBlLT53YWtlX3VwKTsKKyNlbmRpZgorCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAiZHJpdmUgd2FrZXVwIG1ldGhvZDogJXMiLAorCQkJCSAgICAgIG1ldGhvZHNbZHJpdmVfdHlwZS0+d2FrZV91cF0ubmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKKworCQlpZiAobWV0aG9kID49IE5SX0lURU1TKG1ldGhvZHMpKSB7CisJCQkvKiBubyByZXNwb25zZSBhdCBhbGwsIGNhbm5vdCBvcGVuIHRoaXMgZHJpdmUgKi8KKwkJCWRyaXZlX3R5cGUtPndha2VfdXAgPSB1bmtub3duX3dha2VfdXA7CisJCQlUUkFDRShmdF90X2VyciwgIm5vIHRhcGUgZHJpdmUgZm91bmQgISIpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJfQorCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfbm9fdGFwZSA9IGZ0X3dyaXRlX3Byb3RlY3RlZCA9IDA7CisJLyogICAgVGFwZSBkcml2ZSBpcyBhY3RpdmF0ZWQgbm93LgorCSAqICAgIEZpcnN0IGNsZWFyIGVycm9yIHN0YXR1cyBpZiBwcmVzZW50LgorCSAqLworCWRvIHsKKwkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVUSU1FKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZWFkeV93YWl0IHRpbWVvdXQiKTsKKwkJCX0gZWxzZSBpZiAocmVzdWx0ID09IC1FSU5UUikgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVhZHlfd2FpdCBhYm9ydGVkIik7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVhZHlfd2FpdCBmYWlsZWQiKTsKKwkJCX0KKwkJCVRSQUNFX0VYSVQgLUVJTzsKKwkJfQorCQkvKiAgQ2xlYXIgZXJyb3IgY29uZGl0aW9uIChkcml2ZSBpcyByZWFkeSAhKQorCQkgKi8KKwkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKKwkJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJCXFpYzExN19jbWRfdCBjb21tYW5kOworCisJCQlUUkFDRShmdF90X2VyciwgImVycm9yIHN0YXR1cyBzZXQiKTsKKwkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsCisJCQkJICAgICAgInJlcG9ydF9lcnJvcl9jb2RlIGZhaWxlZDogJWQiLCByZXN1bHQpOworCQkJCS8qIGhvcGUgaXQncyB3b3JraW5nIG5leHQgdGltZSAqLworCQkJCWZ0YXBlX3Jlc2V0X2RyaXZlKCk7CisJCQkJVFJBQ0VfRVhJVCAtRUlPOworCQkJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIGNvZGUgICA6ICVkIiwgZXJyb3IpOworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciBjb21tYW5kOiAlZCIsIGNvbW1hbmQpOworCQkJfQorCQl9CisJCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX05FV19DQVJUUklER0UpIHsKKwkJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJCXFpYzExN19jbWRfdCBjb21tYW5kOworCQkJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOworCQkJU0VUX1RSQUNFX0xFVkVMKGZ0X3RfYnVnKTsKKworCQkJLyogIFVuZG9jdW1lbnRlZCBmZWF0dXJlOiBNdXN0IGNsZWFyIChub3QgcHJlc2VudCEpCisJCQkgKiAgZXJyb3IgaGVyZSBvciB3ZSdsbCBmYWlsIGxhdGVyLgorCQkJICovCisJCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7CisKKwkJCVNFVF9UUkFDRV9MRVZFTChvbGRfdHJhY2luZyk7CisJCQlUUkFDRShmdF90X2luZm8sICJzdGF0dXM6IG5ldyBjYXJ0cmlkZ2UiKTsKKwkJCWZ0X25ld190YXBlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWZ0X25ld190YXBlID0gMDsKKwkJfQorCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJfSB3aGlsZSAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUik7CisJCisJZnRfbm9fdGFwZSA9ICEoc3RhdHVzICYgUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCk7CisJZnRfd3JpdGVfcHJvdGVjdGVkID0gKHN0YXR1cyAmIFFJQ19TVEFUVVNfV1JJVEVfUFJPVEVDVCkgIT0gMDsKKwlpZiAoZnRfbm9fdGFwZSkgeworCQlUUkFDRShmdF90X3dhcm4sICJubyBjYXJ0cmlkZ2UgcHJlc2VudCIpOworCX0gZWxzZSB7CisJCWlmIChmdF93cml0ZV9wcm90ZWN0ZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJXcml0ZSBwcm90ZWN0ZWQgY2FydHJpZGdlIik7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9sb2dfdmVuZG9yX2lkKHZvaWQpCit7CisJaW50IHZlbmRvcl9pbmRleDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0YXBlX3JlcG9ydF92ZW5kb3JfaWQoJmZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKTsKKwl2ZW5kb3JfaW5kZXggPSBsb29rdXBfdmVuZG9yX2lkKGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKTsKKwlpZiAoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gVU5LTk9XTl9WRU5ET1IgJiYKKwkgICAgZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfY29sb3JhZG8pIHsKKwkJdmVuZG9yX2luZGV4ID0gMDsKKwkJLyogaGFjayB0byBnZXQgcmlkIG9mIGFsbCB0aGlzIG1haWwgKi8KKwkJZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPSAwOworCX0KKwlpZiAodmVuZG9yX2luZGV4IDwgMCkgeworCQkvKiBVbmtub3duIHZlbmRvciBpZCwgZmlyc3QgdGltZSBvcGVuaW5nIGRldmljZS4gIFRoZQorCQkgKiBkcml2ZV90eXBlIHJlbWFpbnMgc2V0IHRvIHR5cGUgZm91bmQgYXQgd2FrZXVwCisJCSAqIHRpbWUsIHRoaXMgd2lsbCBwcm9iYWJseSBrZWVwIHRoZSBkcml2ZXIgb3BlcmF0aW5nCisJCSAqIGZvciB0aGlzIG5ldyB2ZW5kb3IuICAKKwkJICovCisJCVRSQUNFKGZ0X3Rfd2FybiwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PSB1bmtub3duIHZlbmRvciBpZCA9PT09PT09PT09PVxuIgorCQkgICAgICBLRVJOX0lORk8gIkEgbmV3LCB5ZXQgdW5zdXBwb3J0ZWQgdGFwZSBkcml2ZSBpcyBmb3VuZFxuIgorCQkgICAgICBLRVJOX0lORk8gIlBsZWFzZSByZXBvcnQgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4iCisJCSAgICAgIEtFUk5fSU5GTyAiICAgVmVuZG9yIGlkICAgICA6IDB4JTA0eFxuIgorCQkgICAgICBLRVJOX0lORk8gIiAgIFdha2V1cCBtZXRob2QgOiAlc1xuIgorCQkgICAgICBLRVJOX0lORk8gIkFuZCBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgdGFwZSBkcml2ZVxuIgorCQkgICAgICBLRVJOX0lORk8gInRvICJUSEVfRlRBUEVfTUFJTlRBSU5FUiJcbiIKKwkJICAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLAorCQkgICAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCwKKwkJICAgICAgbWV0aG9kc1tmdF9kcml2ZV90eXBlLndha2VfdXBdLm5hbWUpOworCQlmdF9kcml2ZV90eXBlLnNwZWVkID0gMDsJCS8qIHVua25vd24gKi8KKwl9IGVsc2UgeworCQlmdF9kcml2ZV90eXBlLm5hbWUgID0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLm5hbWU7CisJCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSB2ZW5kb3JzW3ZlbmRvcl9pbmRleF0uc3BlZWQ7CisJCVRSQUNFKGZ0X3RfaW5mbywgInRhcGUgZHJpdmUgdHlwZTogJXMiLCBmdF9kcml2ZV90eXBlLm5hbWUpOworCQkvKiBzY2FuIGFsbCBtZXRob2RzIGZvciB0aGlzIHZlbmRvcl9pZCBpbiB0YWJsZSAqLworCQl3aGlsZShmdF9kcml2ZV90eXBlLndha2VfdXAgIT0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXApIHsKKwkJCWlmICh2ZW5kb3JfaW5kZXggPCBOUl9JVEVNUyh2ZW5kb3JzKSAtIDEgJiYKKwkJCSAgICB2ZW5kb3JzW3ZlbmRvcl9pbmRleCArIDFdLnZlbmRvcl9pZCAKKwkJCSAgICA9PSAKKwkJCSAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCkgeworCQkJCSsrdmVuZG9yX2luZGV4OworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZnRfZHJpdmVfdHlwZS53YWtlX3VwICE9IHZlbmRvcnNbdmVuZG9yX2luZGV4XS53YWtlX3VwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJcbiIKKwkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkgICAgIEtFUk5fSU5GTyAid2FrZXVwIHR5cGUgbWlzbWF0Y2g6XG4iCisJCSAgICAgS0VSTl9JTkZPICJmb3VuZDogJXMsIGV4cGVjdGVkOiAlc1xuIgorCQkgICAgIEtFUk5fSU5GTyAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICJUSEVfRlRBUEVfTUFJTlRBSU5FUiJcbiIKKwkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIsCisJCQkgICAgICBtZXRob2RzW2Z0X2RyaXZlX3R5cGUud2FrZV91cF0ubmFtZSwKKwkJCSAgICAgIG1ldGhvZHNbdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXBdLm5hbWUpOworCQl9CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3ZvaWQgZnRhcGVfY2FsY190aW1lb3V0cyh1bnNpZ25lZCBpbnQgcWljX3N0ZCwKKwkJCSB1bnNpZ25lZCBpbnQgZGF0YV9yYXRlLAorCQkJIHVuc2lnbmVkIGludCB0YXBlX2xlbikKK3sKKwlpbnQgc3BlZWQ7CQkvKiBkZWNpLWlwcyAhICovCisJaW50IGZmX3NwZWVkOworCWludCBsZW5ndGg7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwZSB0cmFuc3BvcnQgc3BlZWQKKwkgKiAgZGF0YSByYXRlOiAgICAgICAgUUlDLTQwICAgUUlDLTgwICAgUUlDLTMwMTAgUUlDLTMwMjAKKwkgKgorCSAqICAgIDI1MCBLYnBzICAgICAgICAyNSBpcHMgICAgIG4vYSAgICAgIG4vYSAgICAgIG4vYQorCSAqICAgIDUwMCBLYnBzICAgICAgICA1MCBpcHMgICAzNCBpcHMgICAyMi42IGlwcyAgIG4vYQorCSAqICAgICAgMSBNYnBzICAgICAgICAgIG4vYSAgICA2OCBpcHMgICA0NS4yIGlwcyAyMi42IGlwcworCSAqICAgICAgMiBNYnBzICAgICAgICAgIG4vYSAgICAgIG4vYSAgICAgIG4vYSAgICA0NS4yIGlwcworCSAqCisJICogIGZhc3QgdGFwZSB0cmFuc3BvcnQgc3BlZWQgaXMgYXQgbGVhc3QgNjggaXBzLgorCSAqLworCXN3aXRjaCAocWljX3N0ZCkgeworCWNhc2UgUUlDX1RBUEVfUUlDNDA6CisJCXNwZWVkID0gKGRhdGFfcmF0ZSA9PSAyNTApID8gMjUwIDogNTAwOworCQlicmVhazsKKwljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gNTAwKSA/IDM0MCA6IDY4MDsKKwkJYnJlYWs7CisJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gNTAwKSA/IDIyNiA6IDQ1MjsKKwkJYnJlYWs7CisJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gMTAwMCkgPyAyMjYgOiA0NTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3RfYnVnLCAiVW5rbm93biBxaWNfc3RkIChidWcpID8iKTsKKwkJc3BlZWQgPSA1MDA7CisJCWJyZWFrOworCX0KKwlpZiAoZnRfZHJpdmVfdHlwZS5zcGVlZCA9PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgdDA7CisJCXN0YXRpYyBpbnQgZHQgPSAwOyAgICAgLyoga2VlcCBnY2MgZnJvbSBjb21wbGFpbmluZyAqLworCQlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOworCisJCS8qICBNZWFzdXJlIHRoZSB0aW1lIGl0IHRha2VzIHRvIHdpbmQgdG8gRU9UIGFuZCBiYWNrIHRvIEJPVC4KKwkJICogIElmIHRoZSB0YXBlIGxlbmd0aCBpcyBrbm93biwgY2FsY3VsYXRlIHRoZSByZXdpbmQgc3BlZWQuCisJCSAqICBFbHNlIGtlZXAgdGhlIHRpbWUgdmFsdWUgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSByZXdpbmQKKwkJICogIHNwZWVkIGxhdGVyIG9uLCB3aGVuIHRoZSBsZW5ndGggX2lzXyBrbm93bi4KKwkJICogIEFzayBmb3IgYSByZXBvcnQgb25seSB3aGVuIGxlbmd0aCBhbmQgc3BlZWQgYXJlIGJvdGgga25vd24uCisJCSAqLworCQlpZiAoZmlyc3RfdGltZSkgeworCQkJZnRhcGVfc2Vla190b19ib3QoKTsKKwkJCXQwID0gamlmZmllczsKKwkJCWZ0YXBlX3NlZWtfdG9fZW90KCk7CisJCQlmdGFwZV9zZWVrX3RvX2JvdCgpOworCQkJZHQgPSAoaW50KSAoKChqaWZmaWVzIC0gdDApICogRlRfVVNQVCkgLyAxMDAwKTsKKwkJCWlmIChkdCA8IDEpIHsKKwkJCQlkdCA9IDE7CS8qIHByZXZlbnQgZGl2IGJ5IHplcm8gb24gZmFpbHVyZXMgKi8KKwkJCX0KKwkJCWZpcnN0X3RpbWUgPSAwOworCQkJVFJBQ0UoZnRfdF9pbmZvLAorCQkJICAgICAgInRyeWluZyB0byBkZXRlcm1pbmUgc2VlayB0aW1lb3V0LCBnb3QgJWQgbXNlYyIsCisJCQkgICAgICBkdCk7CisJCX0KKwkJaWYgKHRhcGVfbGVuICE9IDApIHsKKwkJCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSAKKwkJCQkoMiAqIDEyICogdGFwZV9sZW4gKiAxMDAwKSAvIGR0OworCQkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCisJCSAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJICAgICBLRVJOX0lORk8gImRyaXZlIHR5cGU6ICVzXG4iCisJCSAgICAgS0VSTl9JTkZPICJkZWx0YSB0aW1lID0gJWQgbXMsIGxlbmd0aCA9ICVkIGZ0XG4iCisJCSAgICAgS0VSTl9JTkZPICJoYXMgYSBtYXhpbXVtIHRhcGUgc3BlZWQgb2YgJWQgaXBzXG4iCisJCSAgICAgS0VSTl9JTkZPICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gIlRIRV9GVEFQRV9NQUlOVEFJTkVSIlxuIgorCQkgICAgIEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKwkJCSAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSwgZHQsIHRhcGVfbGVuLCAKKwkJCSAgICAgIGZ0X2RyaXZlX3R5cGUuc3BlZWQpOworCQl9CisJfQorCS8qICBIYW5kbGUgdW5rbm93biBsZW5ndGggdGFwZXMgYXMgdmVyeSBsb25nIG9uZXMuIFdlJ2xsCisJICogIGRldGVybWluZSB0aGUgYWN0dWFsIGxlbmd0aCBmcm9tIGEgaGVhZGVyIHNlZ21lbnQgbGF0ZXIuCisJICogIFRoaXMgaXMgbm9ybWFsIGZvciBhbGwgbW9kZXJuIChXaWRlLFRSMS8yLzMpIGZvcm1hdHMuCisJICovCisJaWYgKHRhcGVfbGVuIDw9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIlVua25vd24gdGFwZSBsZW5ndGgsIHVzaW5nIG1heGltYWwgdGltZW91dHMiKTsKKwkJbGVuZ3RoID0gUUlDX1RPUF9UQVBFX0xFTjsJLyogdXNlIHdvcnN0IGNhc2UgdmFsdWVzICovCisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gdGFwZV9sZW47CQkvKiB1c2UgYWN0dWFsIHZhbHVlcyAqLworCX0KKwlpZiAoZnRfZHJpdmVfdHlwZS5zcGVlZCA9PSAwKSB7CisJCWZmX3NwZWVkID0gc3BlZWQ7IAorCX0gZWxzZSB7CisJCWZmX3NwZWVkID0gZnRfZHJpdmVfdHlwZS5zcGVlZDsKKwl9CisJLyogIHRpbWUgdG8gZ28gZnJvbSBib3QgdG8gZW90IGF0IG5vcm1hbCBzcGVlZCAoZGF0YSByYXRlKToKKwkgKiAgdGltZSA9ICgxK2RlbHRhKSAqIGxlbmd0aCAoZnQpICogMTIgKGluY2gvZnQpIC8gc3BlZWQgKGlwcykKKwkgKiAgZGVsdGEgPSAxMCAlIGZvciBzZWVrIHNwZWVkLCAyMCAlIGZvciByZXdpbmQgc3BlZWQuCisJICovCisJZnRhcGVfdGltZW91dC5zZWVrID0gKGxlbmd0aCAqIDEzMiAqIEZUX1NFQ09ORCkgLyBzcGVlZDsKKwlmdGFwZV90aW1lb3V0LnJld2luZCA9IChsZW5ndGggKiAxNDQgKiBGVF9TRUNPTkQpIC8gKDEwICogZmZfc3BlZWQpOworCWZ0YXBlX3RpbWVvdXQucmVzZXQgPSAyMCAqIEZUX1NFQ09ORCArIGZ0YXBlX3RpbWVvdXQucmV3aW5kOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0aW1lb3V0cyBmb3Igc3BlZWQgPSAlZCwgbGVuZ3RoID0gJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInNlZWsgdGltZW91dCAgOiAlZCBzZWNcbiIKKwkgICAgICBLRVJOX0lORk8gInJld2luZCB0aW1lb3V0OiAlZCBzZWNcbiIKKwkgICAgICBLRVJOX0lORk8gInJlc2V0IHRpbWVvdXQgOiAlZCBzZWMiLAorCSAgICAgIHNwZWVkLCBsZW5ndGgsCisJICAgICAgKGZ0YXBlX3RpbWVvdXQuc2VlayArIDUwMCkgLyAxMDAwLAorCSAgICAgIChmdGFwZV90aW1lb3V0LnJld2luZCArIDUwMCkgLyAxMDAwLAorCSAgICAgIChmdGFwZV90aW1lb3V0LnJlc2V0ICsgNTAwKSAvIDEwMDApOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2FsaWJyYXRlcyB0aGUgZGF0YXJhdGUgKGkuZS4gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbAorICogdXNhYmxlIGRhdGEgcmF0ZSkgYW5kIHNldHMgdGhlIGdsb2JhbCB2YXJpYWJsZSBmdF9xaWNfc3RkIHRvIHFpY19zdGQKKyAqCisgKi8KK2ludCBmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHVuc2lnbmVkIGludCBxaWNfc3RkKQoreworCWludCByYXRlID0gZnRfZmRjX3JhdGVfbGltaXQ7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X3FpY19zdGQgPSBxaWNfc3RkOworCisJaWYgKGZ0X3FpY19zdGQgPT0gLTEpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCSJVbmFibGUgdG8gZGV0ZXJtaW5lIGRhdGEgcmF0ZSBpZiBRSUMgc3RhbmRhcmQgaXMgdW5rbm93biIpOworCX0KKworCS8qICBTZWxlY3QgaGlnaGVzdCByYXRlIHN1cHBvcnRlZCBieSBib3RoIGZkYyBhbmQgZHJpdmUuCisJICogIFN0YXJ0IHdpdGggaGlnaGVzdCByYXRlIHN1cHBvcnRlZCBieSB0aGUgZmRjLgorCSAqLworCXdoaWxlIChmZGNfc2V0X2RhdGFfcmF0ZShyYXRlKSA8IDAgJiYgcmF0ZSA+IDI1MCkgeworCQlyYXRlIC89IDI7CisJfQorCVRSQUNFKGZ0X3RfaW5mbywKKwkgICAgICAiSGlnaGVzdCBGREMgc3VwcG9ydGVkIGRhdGEgcmF0ZTogJWQgS2JwcyIsIHJhdGUpOworCWZ0X2ZkY19tYXhfcmF0ZSA9IHJhdGU7CisJZG8geworCQlyZXN1bHQgPSBmdGFwZV9zZXRfZGF0YV9yYXRlKHJhdGUsIGZ0X3FpY19zdGQpOworCX0gd2hpbGUgKHJlc3VsdCA9PSAtRUlOVkFMICYmIChyYXRlIC89IDIpID4gMjUwKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgInNldCBkYXRhcmF0ZSBmYWlsZWQiKTsKKwl9CisJZnRfZGF0YV9yYXRlID0gcmF0ZTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfaW5pdF9kcml2ZSh2b2lkKQoreworCWludCBzdGF0dXM7CisJcWljX21vZGVsIG1vZGVsOworCXVuc2lnbmVkIGludCBxaWNfc3RkOworCXVuc2lnbmVkIGludCBkYXRhX3JhdGU7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDA7IC8qIGRvbid0IHJldHJ5IGlmIHRoaXMgZmFpbHMgPyAqLworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7CisJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQpIHsKKwkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9CT1QpKSB7CisJCQkvKiAgQW50aXF1ZSBkcml2ZXMgd2lsbCBnZXQgaGVyZSBhZnRlciBhIHNvZnQgcmVzZXQsCisJCQkgKiAgbW9kZXJuIG9uZXMgb25seSBpZiB0aGUgZHJpdmVyIGlzIGxvYWRlZCB3aGVuIHRoZQorCQkJICogIHRhcGUgd2Fzbid0IHJld291bmQgcHJvcGVybHkuCisJCQkgKi8KKwkJCS8qIFRhcGUgc2hvdWxkIGJlIGF0IGJvdCBpZiBuZXcgY2FydHJpZGdlICEgKi8KKwkJCWZ0YXBlX3NlZWtfdG9fYm90KCk7CisJCX0KKwkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19SRUZFUkVOQ0VEKSkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAic3RhcnRpbmcgc2Vla19sb2FkX3BvaW50Iik7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1NFRUtfTE9BRF9QT0lOVCwKKwkJCQkJCSAgICAgICBmdGFwZV90aW1lb3V0LnJlc2V0LAorCQkJCQkJICAgICAgICZzdGF0dXMpLCk7CisJCX0KKwl9CisJZnRfZm9ybWF0dGVkID0gKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVGRVJFTkNFRCkgIT0gMDsKKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiB0YXBlIGlzIG5vdCBmb3JtYXR0ZWQgISIpOworCX0KKworCS8qICByZXBvcnQgY29uZmlndXJhdGlvbiBhYm9ydHMgd2hlbiBmdGFwZV90YXBlX2xlbiA9PSAtMQorCSAqICB1bmtub3duIHFpY19zdGQgaXMgb2theSBpZiBub3QgZm9ybWF0dGVkLgorCSAqLworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9jb25maWd1cmF0aW9uKCZtb2RlbCwKKwkJCQkJICAgICAgICZkYXRhX3JhdGUsCisJCQkJCSAgICAgICAmcWljX3N0ZCwKKwkJCQkJICAgICAgICZmdGFwZV90YXBlX2xlbiksKTsKKworCS8qICBNYXliZSBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgL3Byb2MgZW50cnkKKwkgKi8KKwlUUkFDRShmdF90X2luZm8sICIlcyBkcml2ZSBAICVkIEticHMiLAorCSAgICAgIChtb2RlbCA9PSBwcmVoaXN0b3JpYykgPyAicHJlaGlzdG9yaWMiIDoKKwkgICAgICAoKG1vZGVsID09IHByZV9xaWMxMTdjKSA/ICJwcmUgUUlDLTExN0MiIDoKKwkgICAgICAgKChtb2RlbCA9PSBwb3N0X3FpYzExN2IpID8gInBvc3QgUUlDLTExN0IiIDoKKwkJInBvc3QgUUlDLTExN0QiKSksIGRhdGFfcmF0ZSk7CisKKwlpZiAoZnRfZm9ybWF0dGVkKSB7CisJCS8qICBpbml0aWFsaXplIGZ0X3VzZWRfZGF0YV9yYXRlIHRvIG1heGltdW0gdmFsdWUgCisJCSAqICBhbmQgc2V0IGZ0X3FpY19zdGQKKwkJICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUocWljX3N0ZCksKTsKKwkJaWYgKGZ0YXBlX3RhcGVfbGVuID09IDApIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgInVua25vd24gbGVuZ3RoIFFJQy0lcyB0YXBlIiwKKwkJCSAgICAgIChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwKSA/ICI0MCIgOgorCQkJICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSA/ICI4MCIgOgorCQkJICAgICAgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDEwKSAKKwkJCQk/ICIzMDEwIiA6ICIzMDIwIikpKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgIiVkIGZ0LiBRSUMtJXMgdGFwZSIsIGZ0YXBlX3RhcGVfbGVuLAorCQkJICAgICAgKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDApID8gIjQwIiA6CisJCQkgICAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDODApID8gIjgwIiA6CisJCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzMwMTApCisJCQkJPyAiMzAxMCIgOiAiMzAyMCIpKSk7CisJCX0KKwkJZnRhcGVfY2FsY190aW1lb3V0cyhmdF9xaWNfc3RkLCBmdF9kYXRhX3JhdGUsIGZ0YXBlX3RhcGVfbGVuKTsKKwkJLyogc29mdCB3cml0ZS1wcm90ZWN0IFFJQy00MC9RSUMtODAgY2FydHJpZGdlcyB1c2VkIHdpdGggYQorCQkgKiBDb2xvcmFkbyBUMzAwMCBkcml2ZS4gQnVnZ3kgaGFyZHdhcmUhCisJCSAqLworCQlpZiAoKGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkID09IDB4MDExYzYpICYmCisJCSAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDAgfHwKKwkJICAgICAgZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgJiYKKwkJICAgICAhZnRfd3JpdGVfcHJvdGVjdGVkKSkgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCisJS0VSTl9JTkZPICJUaGUgZmFtb3VzIENvbG9yYWRvIFQzMDAwIGJ1ZzpcbiIKKwlLRVJOX0lORk8gIiVzIGRyaXZlcyBjYW4ndCB3cml0ZSBRSUM0MCBhbmQgUUlDODBcbiIKKwlLRVJOX0lORk8gImNhcnRyaWRnZXMgYnV0IGRvbid0IHNldCB0aGUgd3JpdGUtcHJvdGVjdCBmbGFnISIsCisJCQkgICAgICBmdF9kcml2ZV90eXBlLm5hbWUpOworCQkJZnRfd3JpdGVfcHJvdGVjdGVkID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qICBEb2Vzbid0IG1ha2UgdG9vIG11Y2ggc2Vuc2UgdG8gc2V0IHRoZSBkYXRhIHJhdGUKKwkJICogIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHdyaXRlCisJCSAqICBwcmVjb21wZW5zYXRpb24uCisJCSAqICBOZWVkIHRvIGRvIHRoaXMgYWdhaW4gd2hlbiBmb3JtYXR0aW5nIHRoZSBjYXJ0cmlkZ2UuCisJCSAqLworCQlmdF9kYXRhX3JhdGUgPSBkYXRhX3JhdGU7CisJCWZ0YXBlX2NhbGNfdGltZW91dHMoUUlDX1RBUEVfUUlDNDAsCisJCQkJICAgIGRhdGFfcmF0ZSwKKwkJCQkgICAgZnRhcGVfdGFwZV9sZW4pOworCX0KKwlmdGFwZV9uZXdfY2FydHJpZGdlKCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9tdW5tYXAodm9pZCkKK3sKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgaSsrKSB7CisJCWZ0X2J1ZmZlcltpXS0+bW1hcHBlZCA9IDA7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICAgTWFwIHRoZSBkbWEgYnVmZmVycyBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgZ2l2ZW4gYnkgdm1hLgorICogICBXZSBvbmx5IGNoZWNrIHRoZSBjYWxsZXIgZG9lc24ndCBtYXAgbm9uLWV4aXN0ZW50IGJ1ZmZlcnMuIFdlCisgKiAgIGRvbid0IGNoZWNrIGZvciBtdWx0aXBsZSBtYXBwaW5ncy4KKyAqLworaW50IGZ0YXBlX21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IG51bV9idWZmZXJzOworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChmdF9mYWlsdXJlKSB7CisJCVRSQUNFX0VYSVQgLUVOT0RFVjsKKwl9CisJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEfFZNX1dSSVRFKSkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJVbmRlZmluZWQgbW1hcCgpIGFjY2VzcyIpOworCX0KKwlpZiAodm1hX2dldF9wZ29mZih2bWEpICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJwYWdlIG9mZnNldCBtdXN0IGJlIDAiKTsKKwl9CisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpICUgRlRfQlVGRl9TSVpFICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsCisJCQkgICAgInNpemUgPSAlbGQsIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mICVkIiwKKwkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgRlRfQlVGRl9TSVpFKTsKKwl9CisJbnVtX2J1ZmZlcnMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIEZUX0JVRkZfU0laRTsKKwlpZiAobnVtX2J1ZmZlcnMgPiBmdF9ucl9idWZmZXJzKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9lcnIsICJzaXplID0gJWxkLCBzaG91bGQgYmUgbGVzcyB0aGFuICVkIiwKKwkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgZnRfbnJfYnVmZmVycyAqIEZUX0JVRkZfU0laRSk7CisJfQorCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gaWRsZSkgeworCQkvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBidWZmZXIgc3RhdGVzIAorCQkgKi8KKwkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJfSBlbHNlIHsKKwkJZnRhcGVfcmVzZXRfYnVmZmVyKCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuOworCisJCXBmbiA9IHZpcnRfdG9fcGh5cyhmdF9idWZmZXJbaV0tPmFkZHJlc3MpID4+IFBBR0VfU0hJRlQ7CisJCVRSQUNFX0NBVENIKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQgKworCQkJCQkgICAgIGkgKiBGVF9CVUZGX1NJWkUsCisJCQkJCSAgICAgcGZuLAorCQkJCQkgICAgIEZUX0JVRkZfU0laRSwKKwkJCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCksCisJCQkgICAgX3JlcyA9IC1FQUdBSU4pOworCQlUUkFDRShmdF90X25vaXNlLCAicmVtYXBwZWQgZG1hIGJ1ZmZlciBAICVwIHRvIGxvY2F0aW9uIEAgJXAiLAorCQkgICAgICBmdF9idWZmZXJbaV0tPmFkZHJlc3MsCisJCSAgICAgICh2b2lkICopKHZtYS0+dm1fc3RhcnQgKyBpICogRlRfQlVGRl9TSVpFKSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7CisJCW1lbXNldChmdF9idWZmZXJbaV0tPmFkZHJlc3MsIDB4QUEsIEZUX0JVRkZfU0laRSk7CisJCWZ0X2J1ZmZlcltpXS0+bW1hcHBlZCsrOworCX0JCisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9pbml0X2RyaXZlcih2b2lkKTsgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCisvKiAgICAgIE9QRU4gcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCisgKi8KK2ludCBmdGFwZV9lbmFibGUoaW50IGRyaXZlX3NlbGVjdGlvbikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZ0X2RyaXZlX3NlbCA9PSAtMSB8fCBmdF9kcml2ZV9zZWwgIT0gZHJpdmVfc2VsZWN0aW9uKSB7CisJCS8qIE90aGVyIHNlbGVjdGlvbiB0aGFuIGxhc3QgdGltZQorCQkgKi8KKwkJZnRhcGVfaW5pdF9kcml2ZXIoKTsKKwl9CisJZnRfZHJpdmVfc2VsID0gRlRBUEVfU0VMKGRyaXZlX3NlbGVjdGlvbik7CisJZnRfZmFpbHVyZSA9IDA7CisJVFJBQ0VfQ0FUQ0goZmRjX2luaXQoKSwpOyAvKiBpbml0ICYgZGV0ZWN0IGZkYyAqLworCVRSQUNFX0NBVENIKGZ0YXBlX2FjdGl2YXRlX2RyaXZlKCZmdF9kcml2ZV90eXBlKSwKKwkJICAgIGZkY19kaXNhYmxlKCk7CisJCSAgICBmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOworCQkgICAgZmRjX3JlbGVhc2VfcmVnaW9ucygpKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKCksIGZ0YXBlX2RldGFjaF9kcml2ZSgpKTsKKwlpZiAoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gVU5LTk9XTl9WRU5ET1IpIHsKKwkJZnRhcGVfbG9nX3ZlbmRvcl9pZCgpOworCX0KKwlpZiAoZnRfbmV3X3RhcGUpIHsKKwkJZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOworCX0KKwlpZiAoIWZ0X25vX3RhcGUgJiYgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfaW5pdF9kcml2ZSgpLCBmdGFwZV9kZXRhY2hfZHJpdmUoKSk7CisJfQorCWZ0YXBlX211bm1hcCgpOyAvKiBjbGVhciB0aGUgbW1hcCBmbGFnICovCisJY2xlYXJfaGlzdG9yeSgpOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICByZWxlYXNlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSBtb2R1bGVzCisgKiAgIHpmdGFwZSBvciBzZnRhcGUuCisgKi8KK3ZvaWQgZnRhcGVfZGlzYWJsZSh2b2lkKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgaSsrKSB7CisJCWlmIChmdF9idWZmZXJbaV0tPm1tYXBwZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaXJzdCBieXRlIG9mIGJ1ZmZlciAlZDogMHglMDJ4IiwKKwkJCSAgICAgIGksICpmdF9idWZmZXJbaV0tPmFkZHJlc3MpOworCQl9CisJfQorCWlmIChzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ET05UX0JMT0NLKSAmJiAKKwkgICAgIShzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ORVZFUl9CTE9DSykpICYmCisJICAgIGZ0YXBlX3RhcGVfcnVubmluZykgeworCQlUUkFDRShmdF90X3dhcm4sCisJCSAgICAgICJJbnRlcnJ1cHRlZCBieSBmYXRhbCBzaWduYWwgYW5kIHRhcGUgc3RpbGwgcnVubmluZyIpOworCQlmdGFwZV9kdW1iX3N0b3AoKTsKKwkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7IC8qIGl0J3MgYW5ub3lpbmcgKi8KKwl9IGVsc2UgeworCQlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7CisJfQorCWZ0YXBlX2RldGFjaF9kcml2ZSgpOworCWlmIChmdF9oaXN0b3J5LnVzZWQpIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiPT0gTm9uLWZhdGFsIGVycm9ycyB0aGlzIHJ1bjogPT0iKTsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiZmRjIGlzciBzdGF0aXN0aWNzOlxuIgorCQkgICAgICBLRVJOX0lORk8gIiBpZF9hbV9lcnJvcnMgICAgIDogJTNkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIGlkX2NyY19lcnJvcnMgICAgOiAlM2RcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgZGF0YV9hbV9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICBLRVJOX0lORk8gIiBkYXRhX2NyY19lcnJvcnMgIDogJTNkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIG92ZXJydW5fZXJyb3JzICAgOiAlM2RcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgbm9fZGF0YV9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICBLRVJOX0lORk8gIiByZXRyaWVzICAgICAgICAgIDogJTNkIiwKKwkJICAgICAgZnRfaGlzdG9yeS5pZF9hbV9lcnJvcnMsICAgZnRfaGlzdG9yeS5pZF9jcmNfZXJyb3JzLAorCQkgICAgICBmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzLCBmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycywKKwkJICAgICAgZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycywgZnRfaGlzdG9yeS5ub19kYXRhX2Vycm9ycywKKwkJICAgICAgZnRfaGlzdG9yeS5yZXRyaWVzKTsKKwkJaWYgKGZ0X2hpc3RvcnkudXNlZCAmIDEpIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImVjYyBzdGF0aXN0aWNzOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY3JjX2Vycm9ycyAgICAgICA6ICUzZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY3JjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgZWNjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgc2VjdG9ycyBjb3JyZWN0ZWQ6ICUzZCIsCisJCQkgICAgICBmdF9oaXN0b3J5LmNyY19lcnJvcnMsICAgZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMsCisJCQkgICAgICBmdF9oaXN0b3J5LmVjY19mYWlsdXJlcywgZnRfaGlzdG9yeS5jb3JyZWN0ZWQpOworCQl9CisJCWlmIChmdF9oaXN0b3J5LmRlZmVjdHMgPiAwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiAlZCBtZWRpYSBkZWZlY3RzISIsCisJCQkgICAgICBmdF9oaXN0b3J5LmRlZmVjdHMpOworCQl9CisJCWlmIChmdF9oaXN0b3J5LnJld2luZHMgPiAwKSB7CisJCQlUUkFDRShmdF90X2luZm8sICJ0YXBlIG1vdGlvbiBzdGF0aXN0aWNzOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICJyZXBvc2l0aW9ucyAgICAgICA6ICUzZCIsCisJCQkgICAgICBmdF9oaXN0b3J5LnJld2luZHMpOworCQl9CisJfQorCWZ0X2ZhaWx1cmUgPSAxOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGZ0YXBlX2luaXRfZHJpdmVyKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCA9IFVOS05PV05fVkVORE9SOworCWZ0X2RyaXZlX3R5cGUuc3BlZWQgICAgID0gMDsKKwlmdF9kcml2ZV90eXBlLndha2VfdXAgICA9IHVua25vd25fd2FrZV91cDsKKwlmdF9kcml2ZV90eXBlLm5hbWUgICAgICA9ICJVbmtub3duIjsKKworCWZ0YXBlX3RpbWVvdXQuc2VlayAgICAgID0gNjUwICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQucmVzZXQgICAgID0gNjcwICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQucmV3aW5kICAgID0gNjUwICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQuaGVhZF9zZWVrID0gIDE1ICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQuc3RvcCAgICAgID0gICA1ICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQucGF1c2UgICAgID0gIDE2ICogRlRfU0VDT05EOworCisJZnRfcWljX3N0ZCAgICAgICAgICAgICA9IC0xOworCWZ0YXBlX3RhcGVfbGVuICAgICAgICAgPSAwOyAgLyogdW5rbm93biAqLworCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCAgPSAwOworCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSAtMTsKKworCWZ0X3NlZ21lbnRzX3Blcl90cmFjayAgICAgICA9IDEwMjsKKwlmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAgICAgPSAxMDIwOworCWZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9IDQ7CisJZnRfdHJhY2tzX3Blcl90YXBlICAgICAgICAgID0gMjA7CisKKwlmdF9mYWlsdXJlID0gMTsKKworCWZ0X2Zvcm1hdHRlZCAgICAgICA9IDA7CisJZnRfbm9fdGFwZSAgICAgICAgID0gMTsKKwlmdF93cml0ZV9wcm90ZWN0ZWQgPSAxOworCWZ0X25ld190YXBlICAgICAgICA9IDE7CisKKwlmdF9kcml2ZXJfc3RhdGUgPSBpZGxlOworCisJZnRfZGF0YV9yYXRlID0gCisJCWZ0X2ZkY19tYXhfcmF0ZSAgID0gNTAwOworCWZ0X2RyaXZlX21heF9yYXRlID0gMDsgLyogdHJpZ2dlcnMgc2V0X3JhdGVfdGVzdCgpICovCisKKwlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7CisKKwlmdF9oZWFkZXJfc2VnbWVudF8xICAgID0gLTE7CisJZnRfaGVhZGVyX3NlZ21lbnRfMiAgICA9IC0xOworCWZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPSAtMTsKKwlmdF9maXJzdF9kYXRhX3NlZ21lbnQgID0gLTE7CisJZnRfbGFzdF9kYXRhX3NlZ21lbnQgICA9IC0xOworCisJZnRfbG9jYXRpb24udHJhY2sgPSAtMTsKKwlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisKKwlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCWZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayA9IDE7CisKKwlmdGFwZV9uZXdfY2FydHJpZGdlKCk7CS8qIGluaXQgc29tZSB0YXBlIHJlbGF0ZWQgdmFyaWFibGVzICovCisJZnRhcGVfaW5pdF9ic20oKTsKKwlUUkFDRV9FWElUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWUzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmgKQEAgLTAsMCArMSwxNjIgQEAKKyNpZm5kZWYgX0ZUQVBFX0NUTF9ICisjZGVmaW5lIF9GVEFQRV9DVExfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowOSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5vbi1zdGFuZGFyZCBJT0NUTCByZWxhdGVkIGRlZmluaXRpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKKyAqICAgICAgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLXZlbmRvcnMuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB1c2VkOwkJLyogYW55IHJlYWRpbmcgb3Igd3JpdGluZyBkb25lICovCisJLyogaXNyIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCBpbnQgaWRfYW1fZXJyb3JzOwkvKiBpZCBhZGRyZXNzIG1hcmsgbm90IGZvdW5kICovCisJdW5zaWduZWQgaW50IGlkX2NyY19lcnJvcnM7CS8qIGNyYyBlcnJvciBpbiBpZCBhZGRyZXNzIG1hcmsgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9hbV9lcnJvcnM7CS8qIGRhdGEgYWRkcmVzcyBtYXJrIG5vdCBmb3VuZCAqLworCXVuc2lnbmVkIGludCBkYXRhX2NyY19lcnJvcnM7CS8qIGNyYyBlcnJvciBpbiBkYXRhIGZpZWxkICovCisJdW5zaWduZWQgaW50IG92ZXJydW5fZXJyb3JzOwkvKiBmZGMgYWNjZXNzIHRpbWluZyBwcm9ibGVtICovCisJdW5zaWduZWQgaW50IG5vX2RhdGFfZXJyb3JzOwkvKiBzZWN0b3Igbm90IGZvdW5kICovCisJdW5zaWduZWQgaW50IHJldHJpZXM7CS8qIG51bWJlciBvZiB0YXBlIHJldHJpZXMgKi8KKwkvKiBlY2Mgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCBjcmNfZXJyb3JzOwkvKiBjcmMgZXJyb3IgaW4gZGF0YSAqLworCXVuc2lnbmVkIGludCBjcmNfZmFpbHVyZXM7CS8qIGJhZCBkYXRhIHdpdGhvdXQgY3JjIGVycm9yICovCisJdW5zaWduZWQgaW50IGVjY19mYWlsdXJlczsJLyogZmFpbGVkIHRvIGNvcnJlY3QgKi8KKwl1bnNpZ25lZCBpbnQgY29ycmVjdGVkOwkvKiB0b3RhbCBzZWN0b3JzIGNvcnJlY3RlZCAqLworCS8qIGdlbmVyYWwgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCByZXdpbmRzOwkvKiBudW1iZXIgb2YgdGFwZSByZXdpbmRzICovCisJdW5zaWduZWQgaW50IGRlZmVjdHM7CS8qIGJhZCBzZWN0b3JzIGR1ZSB0byBtZWRpYSBkZWZlY3RzICovCit9IGhpc3RvcnlfcmVjb3JkOworCisvKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyAqIEFMTCAqIGluZm9ybWF0aW9uIHRoYXQgd2Ugd2FudAorICogb3VyIGNoaWxkIG1vZHVsZXMgdG8ga25vdyBhYm91dCwgYnV0IGRvbid0IHdhbnQgdGhlbSB0bworICogbW9kaWZ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qICB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KKwl2ZW5kb3Jfc3RydWN0IGZ0aV9kcml2ZV90eXBlOworCS8qICBkYXRhIHJhdGVzICovCisJdW5zaWduZWQgaW50IGZ0aV91c2VkX2RhdGFfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgZnRpX2RyaXZlX21heF9yYXRlOworCXVuc2lnbmVkIGludCBmdGlfZmRjX21heF9yYXRlOworCS8qICBkcml2ZSBzZWxlY3Rpb24sIGVpdGhlciBGVEFQRV9TRUxfQS9CL0MvRCAqLworCWludCBmdGlfZHJpdmVfc2VsOyAgICAgIAorCS8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLworCXVuc2lnbmVkIGludCBmdGlfZm9ybWF0dGVkICAgICAgOjE7CisJdW5zaWduZWQgaW50IGZ0aV9ub190YXBlICAgICAgICA6MTsKKwl1bnNpZ25lZCBpbnQgZnRpX3dyaXRlX3Byb3RlY3RlZDoxOworCXVuc2lnbmVkIGludCBmdGlfbmV3X3RhcGUgICAgICAgOjE7CisJLyogIHZhbHVlcyBvZiBsYXN0IHF1ZXJpZWQgZHJpdmUvdGFwZSBzdGF0dXMgYW5kIGVycm9yICovCisJZnRfZHJpdmVfZXJyb3IgIGZ0aV9sYXN0X2Vycm9yOworCWZ0X2RyaXZlX3N0YXR1cyBmdGlfbGFzdF9zdGF0dXM7CisJLyogIGNhcnRyaWRnZSBnZW9tZXRyeSAqLworCXVuc2lnbmVkIGludCBmdGlfdHJhY2tzX3Blcl90YXBlOworCXVuc2lnbmVkIGludCBmdGlfc2VnbWVudHNfcGVyX3RyYWNrOworCS8qICBsb2NhdGlvbiBvZiBoZWFkZXIgc2VnbWVudHMsIGV0Yy4gKi8KKwlpbnQgZnRpX3VzZWRfaGVhZGVyX3NlZ21lbnQ7CisJaW50IGZ0aV9oZWFkZXJfc2VnbWVudF8xOworCWludCBmdGlfaGVhZGVyX3NlZ21lbnRfMjsKKwlpbnQgZnRpX2ZpcnN0X2RhdGFfc2VnbWVudDsKKwlpbnQgZnRpX2xhc3RfZGF0YV9zZWdtZW50OworCS8qICB0aGUgZm9ybWF0IGNvZGUgYXMgc3RvcmVkIGluIHRoZSBoZWFkZXIgc2VnbWVudCAgKi8KKwlmdF9mb3JtYXRfdHlwZSAgZnRpX2Zvcm1hdF9jb2RlOworCS8qICB0aGUgZm9sbG93aW5nIGlzIHRoZSBzb2xlIHJlYXNvbiBmb3IgdGhlIGZ0YXBlX3NldF9zdGF0dXMoKSBjYWxsICovCisJdW5zaWduZWQgaW50IGZ0aV9xaWNfc3RkOworCS8qICBpcyB0YXBlIHJ1bm5pbmc/ICovCisJdm9sYXRpbGUgZW51bSBydW5uZXJfc3RhdHVzX2VudW0gZnRpX3J1bm5lcl9zdGF0dXM7CisJLyogIGlzIHRhcGUgcmVhZGluZy93cml0aW5nL3ZlcmlmeWluZy9mb3JtYXR0aW5nL2RlbGV0aW5nICovCisJYnVmZmVyX3N0YXRlX2VudW0gZnRpX3N0YXRlOworCS8qICBmbGFncyBmYXRhbCBoYXJkd2FyZSBlcnJvciAqLworCXVuc2lnbmVkIGludCBmdGlfZmFpbHVyZToxOworCS8qICBoaXN0b3J5IHJlY29yZCAqLworCWhpc3RvcnlfcmVjb3JkIGZ0aV9oaXN0b3J5OworfSBmdGFwZV9pbmZvOworCisvKiB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgZnRfZHJpdmVfdHlwZSAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2RyaXZlX3R5cGUKKy8qICBkYXRhIHJhdGVzICovCisjZGVmaW5lIGZ0X2RhdGFfcmF0ZSAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV91c2VkX2RhdGFfcmF0ZQorI2RlZmluZSBmdF9kcml2ZV9tYXhfcmF0ZSAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZHJpdmVfbWF4X3JhdGUKKyNkZWZpbmUgZnRfZmRjX21heF9yYXRlICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2ZkY19tYXhfcmF0ZQorLyogIGRyaXZlIHNlbGVjdGlvbiwgZWl0aGVyIEZUQVBFX1NFTF9BL0IvQy9EICovCisjZGVmaW5lIGZ0X2RyaXZlX3NlbCAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9kcml2ZV9zZWwKKy8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLworI2RlZmluZSBmdF9mb3JtYXR0ZWQgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZm9ybWF0dGVkCisjZGVmaW5lIGZ0X25vX3RhcGUgICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9ub190YXBlCisjZGVmaW5lIGZ0X3dyaXRlX3Byb3RlY3RlZCAgICAgZnRhcGVfc3RhdHVzLmZ0aV93cml0ZV9wcm90ZWN0ZWQKKyNkZWZpbmUgZnRfbmV3X3RhcGUgICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX25ld190YXBlCisvKiAgdmFsdWVzIG9mIGxhc3QgcXVlcmllZCBkcml2ZS90YXBlIHN0YXR1cyBhbmQgZXJyb3IgKi8KKyNkZWZpbmUgZnRfbGFzdF9lcnJvciAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2xhc3RfZXJyb3IKKyNkZWZpbmUgZnRfbGFzdF9zdGF0dXMgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2xhc3Rfc3RhdHVzCisvKiAgY2FydHJpZGdlIGdlb21ldHJ5ICovCisjZGVmaW5lIGZ0X3RyYWNrc19wZXJfdGFwZSAgICAgZnRhcGVfc3RhdHVzLmZ0aV90cmFja3NfcGVyX3RhcGUKKyNkZWZpbmUgZnRfc2VnbWVudHNfcGVyX3RyYWNrICBmdGFwZV9zdGF0dXMuZnRpX3NlZ21lbnRzX3Blcl90cmFjaworLyogIHRoZSBmb3JtYXQgY29kZSBhcyBzdG9yZWQgaW4gdGhlIGhlYWRlciBzZWdtZW50ICAqLworI2RlZmluZSBmdF9mb3JtYXRfY29kZSAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZm9ybWF0X2NvZGUKKy8qICB0aGUgcWljIHN0YXR1cyBhcyByZXR1cm5lZCBieSByZXBvcnQgZHJpdmUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBmdF9xaWNfc3RkICAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfcWljX3N0ZAorI2RlZmluZSBmdF91c2VkX2hlYWRlcl9zZWdtZW50IGZ0YXBlX3N0YXR1cy5mdGlfdXNlZF9oZWFkZXJfc2VnbWVudAorI2RlZmluZSBmdF9oZWFkZXJfc2VnbWVudF8xICAgIGZ0YXBlX3N0YXR1cy5mdGlfaGVhZGVyX3NlZ21lbnRfMQorI2RlZmluZSBmdF9oZWFkZXJfc2VnbWVudF8yICAgIGZ0YXBlX3N0YXR1cy5mdGlfaGVhZGVyX3NlZ21lbnRfMgorI2RlZmluZSBmdF9maXJzdF9kYXRhX3NlZ21lbnQgIGZ0YXBlX3N0YXR1cy5mdGlfZmlyc3RfZGF0YV9zZWdtZW50CisjZGVmaW5lIGZ0X2xhc3RfZGF0YV9zZWdtZW50ICAgZnRhcGVfc3RhdHVzLmZ0aV9sYXN0X2RhdGFfc2VnbWVudAorLyogIGlzIHRhcGUgcnVubmluZz8gKi8KKyNkZWZpbmUgZnRfcnVubmVyX3N0YXR1cyAgICAgICBmdGFwZV9zdGF0dXMuZnRpX3J1bm5lcl9zdGF0dXMKKy8qICBpcyB0YXBlIHJlYWRpbmcvd3JpdGluZy92ZXJpZnlpbmcvZm9ybWF0dGluZy9kZWxldGluZyAqLworI2RlZmluZSBmdF9kcml2ZXJfc3RhdGUgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfc3RhdGUKKy8qICBmbGFncyBmYXRhbCBoYXJkd2FyZSBlcnJvciAqLworI2RlZmluZSBmdF9mYWlsdXJlICAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZmFpbHVyZQorLyogIGhpc3RvcnkgcmVjb3JkICovCisjZGVmaW5lIGZ0X2hpc3RvcnkgICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9oaXN0b3J5CisKKy8qCisgKiAgICAgIGZ0YXBlLWN0bC5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCisgKi8KK2V4dGVybiBmdGFwZV9pbmZvIGZ0YXBlX3N0YXR1czsKK2V4dGVybiBpbnQgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQ7CitleHRlcm4gaW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlcjsKK2V4dGVybiBpbnQgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQ7CisKKy8qCisgKiAgICAgIGZ0YXBlLWN0bC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGludCAgZnRhcGVfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitleHRlcm4gaW50ICBmdGFwZV9lbmFibGUoaW50IGRyaXZlX3NlbGVjdGlvbik7CitleHRlcm4gdm9pZCBmdGFwZV9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIGludCAgZnRhcGVfc2Vla190b19ib3Qodm9pZCk7CitleHRlcm4gaW50ICBmdGFwZV9zZWVrX3RvX2VvdCh2b2lkKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2Fib3J0X29wZXJhdGlvbih2b2lkKTsKK2V4dGVybiB2b2lkIGZ0YXBlX2NhbGNfdGltZW91dHModW5zaWduZWQgaW50IHFpY19zdGQsCisJCQkJIHVuc2lnbmVkIGludCBkYXRhX3JhdGUsCisJCQkJIHVuc2lnbmVkIGludCB0YXBlX2xlbik7CitleHRlcm4gaW50ICBmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHVuc2lnbmVkIGludCBxaWNfc3RkKTsKK2V4dGVybiBjb25zdCBmdGFwZV9pbmZvICpmdGFwZV9nZXRfc3RhdHVzKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2MzJmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5MyBOaW5nIGFuZCBEYXZpZCBNb3NiZXJnZXIuCisgCisgVGhpcyBpcyBiYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXMgTGFhcmhvdmVuIChiYXNAdmltZWMubmwpCisgYW5kIERhdmlkIEwuIEJyb3duLCBKci4sIGFuZCBpbmNvcnBvcmF0ZXMgaW1wcm92ZW1lbnRzIHN1Z2dlc3RlZCBieQorIEthaSBIYXJyZWtpbGRlLVBldGVyc2VuLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMyAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoxMCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFJlZWQtU29sb21vbiBlcnJvciBjb3JyZWN0aW9uIGNvZGUgCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisKKy8qIE1hY2hpbmVzIHRoYXQgYXJlIGJpZy1lbmRpYW4gc2hvdWxkIGRlZmluZSBtYWNybyBCSUdfRU5ESUFOLgorICogVW5mb3J0dW5hdGVseSwgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCBpbmNsdWRlIGZpbGUKKyAqIHRoYXQgd29ya3MgZm9yIGFsbCBPU3MuCisgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faHBwYSkKKyNkZWZpbmUgQklHX0VORElBTgorI2VuZGlmCQkJCS8qIF9fc3BhcmNfXyB8fCBfX2hwcGEgKi8KKworI2lmIGRlZmluZWQoX19taXBzX18pCisjZXJyb3IgRmluZCBhIHNtYXJ0IHdheSB0byBkZXRlcm1pbmUgdGhlIEVuZGlhbm5lc3Mgb2YgdGhlIE1JUFMgQ1BVCisjZW5kaWYKKworLyogTm90aWNlOiB0byBtaW5pbWl6ZSB0aGUgcG90ZW50aWFsIGZvciBjb25mdXNpb24sIHdlIHVzZSByIHRvCisgKiAgICAgICAgIGRlbm90ZSB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgb2YgdGhlIHBvbHlub21pYWxzIGluIHRoZQorICogICAgICAgICBHYWxvaXMgRmllbGQgR0YoMl44KS4gIFdlIHJlc2VydmUgeCBmb3IgcG9seW5vbWlhbHMgdGhhdAorICogICAgICAgICB0aGF0IGhhdmUgY29lZmZpY2llbnRzIGluIEdGKDJeOCkuCisgKiAgICAgICAgIAorICogVGhlIEdhbG9pcyBGaWVsZCBpbiB3aGljaCBjb2VmZmljaWVudCBhcml0aG1ldGljIGlzIHBlcmZvcm1lZCBhcmUKKyAqIHRoZSBwb2x5bm9taWFscyBvdmVyIFpfMiAoaS5lLiwgMCBhbmQgMSkgbW9kdWxvIHRoZSBpcnJlZHVjaWJsZQorICogcG9seW5vbWlhbCBmKHIpLCB3aGVyZSBmKHIpPXJeOCArIHJeNyArIHJeMiArIHIgKyAxLiAgQSBwb2x5bm9taWFsCisgKiBpcyByZXByZXNlbnRlZCBhcyBhIGJ5dGUgd2l0aCB0aGUgTVNCIGFzIHRoZSBjb2VmZmljaWVudCBvZiByXjcgYW5kCisgKiB0aGUgTFNCIGFzIHRoZSBjb2VmZmljaWVudCBvZiByXjAuICBGb3IgZXhhbXBsZSwgdGhlIGJpbmFyeQorICogcmVwcmVzZW50YXRpb24gb2YgZih4KSBpcyAweDE4NyAob2YgY291cnNlLCB0aGlzIGRvZXNuJ3QgZml0IGludG8gOAorICogYml0cykuICBJbiB0aGlzIGZpZWxkLCB0aGUgcG9seW5vbWlhbCByIGlzIGEgcHJpbWl0aXZlIGVsZW1lbnQuCisgKiBUaGF0IGlzLCByXmkgd2l0aCBpIGluIDAsLi4uLDI1NSBlbnVtZXJhdGVzIGFsbCBlbGVtZW50cyBpbiB0aGUKKyAqIGZpZWxkLgorICoKKyAqIFRoZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBmb3IgdGhlIFFJQy04MCBFQ0MgaXMKKyAqCisgKiAgICAgIGcoeCkgPSB4XjMgKyByXjEwNSp4XjIgKyByXjEwNSp4ICsgMQorICoKKyAqIHdoaWNoIGNhbiBiZSBmYWN0b3JlZCBpbnRvOgorICoKKyAqICAgICAgZyh4KSA9ICh4LXJeLTEpKHgtcl4wKSh4LXJeMSkKKyAqCisgKiB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzIGFyZToKKyAqCisgKiAgICAgIHJeMTA1ID0gMHhjMAorICogICAgICByXi0xICA9IDB4YzMKKyAqICAgICAgcl4wICAgPSAweDAxCisgKiAgICAgIHJeMSAgID0gMHgwMgorICoKKyAqIE5vdGljZSB0aGF0IHJeLTEgPSByXjI1NCBhcyBleHBvbmVudCBhcml0aG1ldGljIGlzIHBlcmZvcm1lZAorICogbW9kdWxvIDJeOC0xID0gMjU1LgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEdhbG9pcyBGaWVsZHMgYW5kIFJlZWQtU29sb21vbiBjb2RlcywgcmVmZXIKKyAqIHRvIGFueSBnb29kIGJvb2suICBJIGZvdW5kIF9BbiBJbnRyb2R1Y3Rpb24gdG8gRXJyb3IgQ29ycmVjdGluZworICogQ29kZXMgd2l0aCBBcHBsaWNhdGlvbnNfIGJ5IFMuIEEuIFZhbnN0b25lIGFuZCBQLiBDLiB2YW4gT29yc2Nob3QKKyAqIHRvIGJlIGEgZ29vZCBpbnRyb2R1Y3Rpb24gaW50byB0aGUgZm9ybWVyLiAgX0NPRElORyBUSEVPUlk6IFRoZQorICogRXNzZW50aWFsc18gSSBmb3VuZCB2ZXJ5IHVzZWZ1bCBmb3IgaXRzIGNvbmNpc2UgZGVzY3JpcHRpb24gb2YKKyAqIFJlZWQtU29sb21vbiBlbmNvZGluZy9kZWNvZGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBfX3U4IE1hdHJpeFszXVszXTsKKworLyoKKyAqIGdmcG93W10gaXMgZGVmaW5lZCBzdWNoIHRoYXQgZ2Zwb3dbaV0gcmV0dXJucyByXmkgaWYKKyAqIGkgaXMgaW4gdGhlIHJhbmdlIFswLi4yNTVdLgorICovCitzdGF0aWMgY29uc3QgX191OCBnZnBvd1tdID0KK3sKKwkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCTB4ODcsIDB4ODksIDB4OTUsIDB4YWQsIDB4ZGQsIDB4M2QsIDB4N2EsIDB4ZjQsCisJMHg2ZiwgMHhkZSwgMHgzYiwgMHg3NiwgMHhlYywgMHg1ZiwgMHhiZSwgMHhmYiwKKwkweDcxLCAweGUyLCAweDQzLCAweDg2LCAweDhiLCAweDkxLCAweGE1LCAweGNkLAorCTB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4NTcsIDB4YWUsIDB4ZGIsIDB4MzEsCisJMHg2MiwgMHhjNCwgMHgwZiwgMHgxZSwgMHgzYywgMHg3OCwgMHhmMCwgMHg2NywKKwkweGNlLCAweDFiLCAweDM2LCAweDZjLCAweGQ4LCAweDM3LCAweDZlLCAweGRjLAorCTB4M2YsIDB4N2UsIDB4ZmMsIDB4N2YsIDB4ZmUsIDB4N2IsIDB4ZjYsIDB4NmIsCisJMHhkNiwgMHgyYiwgMHg1NiwgMHhhYywgMHhkZiwgMHgzOSwgMHg3MiwgMHhlNCwKKwkweDRmLCAweDllLCAweGJiLCAweGYxLCAweDY1LCAweGNhLCAweDEzLCAweDI2LAorCTB4NGMsIDB4OTgsIDB4YjcsIDB4ZTksIDB4NTUsIDB4YWEsIDB4ZDMsIDB4MjEsCisJMHg0MiwgMHg4NCwgMHg4ZiwgMHg5OSwgMHhiNSwgMHhlZCwgMHg1ZCwgMHhiYSwKKwkweGYzLCAweDYxLCAweGMyLCAweDAzLCAweDA2LCAweDBjLCAweDE4LCAweDMwLAorCTB4NjAsIDB4YzAsIDB4MDcsIDB4MGUsIDB4MWMsIDB4MzgsIDB4NzAsIDB4ZTAsCisJMHg0NywgMHg4ZSwgMHg5YiwgMHhiMSwgMHhlNSwgMHg0ZCwgMHg5YSwgMHhiMywKKwkweGUxLCAweDQ1LCAweDhhLCAweDkzLCAweGExLCAweGM1LCAweDBkLCAweDFhLAorCTB4MzQsIDB4NjgsIDB4ZDAsIDB4MjcsIDB4NGUsIDB4OWMsIDB4YmYsIDB4ZjksCisJMHg3NSwgMHhlYSwgMHg1MywgMHhhNiwgMHhjYiwgMHgxMSwgMHgyMiwgMHg0NCwKKwkweDg4LCAweDk3LCAweGE5LCAweGQ1LCAweDJkLCAweDVhLCAweGI0LCAweGVmLAorCTB4NTksIDB4YjIsIDB4ZTMsIDB4NDEsIDB4ODIsIDB4ODMsIDB4ODEsIDB4ODUsCisJMHg4ZCwgMHg5ZCwgMHhiZCwgMHhmZCwgMHg3ZCwgMHhmYSwgMHg3MywgMHhlNiwKKwkweDRiLCAweDk2LCAweGFiLCAweGQxLCAweDI1LCAweDRhLCAweDk0LCAweGFmLAorCTB4ZDksIDB4MzUsIDB4NmEsIDB4ZDQsIDB4MmYsIDB4NWUsIDB4YmMsIDB4ZmYsCisJMHg3OSwgMHhmMiwgMHg2MywgMHhjNiwgMHgwYiwgMHgxNiwgMHgyYywgMHg1OCwKKwkweGIwLCAweGU3LCAweDQ5LCAweDkyLCAweGEzLCAweGMxLCAweDA1LCAweDBhLAorCTB4MTQsIDB4MjgsIDB4NTAsIDB4YTAsIDB4YzcsIDB4MDksIDB4MTIsIDB4MjQsCisJMHg0OCwgMHg5MCwgMHhhNywgMHhjOSwgMHgxNSwgMHgyYSwgMHg1NCwgMHhhOCwKKwkweGQ3LCAweDI5LCAweDUyLCAweGE0LCAweGNmLCAweDE5LCAweDMyLCAweDY0LAorCTB4YzgsIDB4MTcsIDB4MmUsIDB4NWMsIDB4YjgsIDB4ZjcsIDB4NjksIDB4ZDIsCisJMHgyMywgMHg0NiwgMHg4YywgMHg5ZiwgMHhiOSwgMHhmNSwgMHg2ZCwgMHhkYSwKKwkweDMzLCAweDY2LCAweGNjLCAweDFmLCAweDNlLCAweDdjLCAweGY4LCAweDc3LAorCTB4ZWUsIDB4NWIsIDB4YjYsIDB4ZWIsIDB4NTEsIDB4YTIsIDB4YzMsIDB4MDEKK307CisKKy8qCisgKiBUaGlzIGlzIGEgbG9nIHRhYmxlLiAgVGhhdCBpcywgZ2Zsb2dbcl5pXSByZXR1cm5zIGkgKG1vZHVsbyBmKHIpKS4KKyAqIGdmbG9nWzBdIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlcmVmb3JlIG5vdCB2YWxpZC4KKyAqLworc3RhdGljIGNvbnN0IF9fdTggZ2Zsb2dbMjU2XSA9Cit7CisJMHhmZiwgMHgwMCwgMHgwMSwgMHg2MywgMHgwMiwgMHhjNiwgMHg2NCwgMHg2YSwKKwkweDAzLCAweGNkLCAweGM3LCAweGJjLCAweDY1LCAweDdlLCAweDZiLCAweDJhLAorCTB4MDQsIDB4OGQsIDB4Y2UsIDB4NGUsIDB4YzgsIDB4ZDQsIDB4YmQsIDB4ZTEsCisJMHg2NiwgMHhkZCwgMHg3ZiwgMHgzMSwgMHg2YywgMHgyMCwgMHgyYiwgMHhmMywKKwkweDA1LCAweDU3LCAweDhlLCAweGU4LCAweGNmLCAweGFjLCAweDRmLCAweDgzLAorCTB4YzksIDB4ZDksIDB4ZDUsIDB4NDEsIDB4YmUsIDB4OTQsIDB4ZTIsIDB4YjQsCisJMHg2NywgMHgyNywgMHhkZSwgMHhmMCwgMHg4MCwgMHhiMSwgMHgzMiwgMHgzNSwKKwkweDZkLCAweDQ1LCAweDIxLCAweDEyLCAweDJjLCAweDBkLCAweGY0LCAweDM4LAorCTB4MDYsIDB4OWIsIDB4NTgsIDB4MWEsIDB4OGYsIDB4NzksIDB4ZTksIDB4NzAsCisJMHhkMCwgMHhjMiwgMHhhZCwgMHhhOCwgMHg1MCwgMHg3NSwgMHg4NCwgMHg0OCwKKwkweGNhLCAweGZjLCAweGRhLCAweDhhLCAweGQ2LCAweDU0LCAweDQyLCAweDI0LAorCTB4YmYsIDB4OTgsIDB4OTUsIDB4ZjksIDB4ZTMsIDB4NWUsIDB4YjUsIDB4MTUsCisJMHg2OCwgMHg2MSwgMHgyOCwgMHhiYSwgMHhkZiwgMHg0YywgMHhmMSwgMHgyZiwKKwkweDgxLCAweGU2LCAweGIyLCAweDNmLCAweDMzLCAweGVlLCAweDM2LCAweDEwLAorCTB4NmUsIDB4MTgsIDB4NDYsIDB4YTYsIDB4MjIsIDB4ODgsIDB4MTMsIDB4ZjcsCisJMHgyZCwgMHhiOCwgMHgwZSwgMHgzZCwgMHhmNSwgMHhhNCwgMHgzOSwgMHgzYiwKKwkweDA3LCAweDllLCAweDljLCAweDlkLCAweDU5LCAweDlmLCAweDFiLCAweDA4LAorCTB4OTAsIDB4MDksIDB4N2EsIDB4MWMsIDB4ZWEsIDB4YTAsIDB4NzEsIDB4NWEsCisJMHhkMSwgMHgxZCwgMHhjMywgMHg3YiwgMHhhZSwgMHgwYSwgMHhhOSwgMHg5MSwKKwkweDUxLCAweDViLCAweDc2LCAweDcyLCAweDg1LCAweGExLCAweDQ5LCAweGViLAorCTB4Y2IsIDB4N2MsIDB4ZmQsIDB4YzQsIDB4ZGIsIDB4MWUsIDB4OGIsIDB4ZDIsCisJMHhkNywgMHg5MiwgMHg1NSwgMHhhYSwgMHg0MywgMHgwYiwgMHgyNSwgMHhhZiwKKwkweGMwLCAweDczLCAweDk5LCAweDc3LCAweDk2LCAweDVjLCAweGZhLCAweDUyLAorCTB4ZTQsIDB4ZWMsIDB4NWYsIDB4NGEsIDB4YjYsIDB4YTIsIDB4MTYsIDB4ODYsCisJMHg2OSwgMHhjNSwgMHg2MiwgMHhmZSwgMHgyOSwgMHg3ZCwgMHhiYiwgMHhjYywKKwkweGUwLCAweGQzLCAweDRkLCAweDhjLCAweGYyLCAweDFmLCAweDMwLCAweGRjLAorCTB4ODIsIDB4YWIsIDB4ZTcsIDB4NTYsIDB4YjMsIDB4OTMsIDB4NDAsIDB4ZDgsCisJMHgzNCwgMHhiMCwgMHhlZiwgMHgyNiwgMHgzNywgMHgwYywgMHgxMSwgMHg0NCwKKwkweDZmLCAweDc4LCAweDE5LCAweDlhLCAweDQ3LCAweDc0LCAweGE3LCAweGMxLAorCTB4MjMsIDB4NTMsIDB4ODksIDB4ZmIsIDB4MTQsIDB4NWQsIDB4ZjgsIDB4OTcsCisJMHgyZSwgMHg0YiwgMHhiOSwgMHg2MCwgMHgwZiwgMHhlZCwgMHgzZSwgMHhlNSwKKwkweGY2LCAweDg3LCAweGE1LCAweDE3LCAweDNhLCAweGEzLCAweDNjLCAweGI3Cit9OworCisvKiBUaGlzIGlzIGEgbXVsdGlwbGljYXRpb24gdGFibGUgZm9yIHRoZSBmYWN0b3IgMHhjMCAoaS5lLiwgcl4xMDUgKG1vZCBmKHIpKS4KKyAqIGdmbXVsX2MwW2ZdIHJldHVybnMgcl4xMDUgKiBmKHIpIChtb2R1bG8gZihyKSkuCisgKi8KK3N0YXRpYyBjb25zdCBfX3U4IGdmbXVsX2MwWzI1Nl0gPQoreworCTB4MDAsIDB4YzAsIDB4MDcsIDB4YzcsIDB4MGUsIDB4Y2UsIDB4MDksIDB4YzksCisJMHgxYywgMHhkYywgMHgxYiwgMHhkYiwgMHgxMiwgMHhkMiwgMHgxNSwgMHhkNSwKKwkweDM4LCAweGY4LCAweDNmLCAweGZmLCAweDM2LCAweGY2LCAweDMxLCAweGYxLAorCTB4MjQsIDB4ZTQsIDB4MjMsIDB4ZTMsIDB4MmEsIDB4ZWEsIDB4MmQsIDB4ZWQsCisJMHg3MCwgMHhiMCwgMHg3NywgMHhiNywgMHg3ZSwgMHhiZSwgMHg3OSwgMHhiOSwKKwkweDZjLCAweGFjLCAweDZiLCAweGFiLCAweDYyLCAweGEyLCAweDY1LCAweGE1LAorCTB4NDgsIDB4ODgsIDB4NGYsIDB4OGYsIDB4NDYsIDB4ODYsIDB4NDEsIDB4ODEsCisJMHg1NCwgMHg5NCwgMHg1MywgMHg5MywgMHg1YSwgMHg5YSwgMHg1ZCwgMHg5ZCwKKwkweGUwLCAweDIwLCAweGU3LCAweDI3LCAweGVlLCAweDJlLCAweGU5LCAweDI5LAorCTB4ZmMsIDB4M2MsIDB4ZmIsIDB4M2IsIDB4ZjIsIDB4MzIsIDB4ZjUsIDB4MzUsCisJMHhkOCwgMHgxOCwgMHhkZiwgMHgxZiwgMHhkNiwgMHgxNiwgMHhkMSwgMHgxMSwKKwkweGM0LCAweDA0LCAweGMzLCAweDAzLCAweGNhLCAweDBhLCAweGNkLCAweDBkLAorCTB4OTAsIDB4NTAsIDB4OTcsIDB4NTcsIDB4OWUsIDB4NWUsIDB4OTksIDB4NTksCisJMHg4YywgMHg0YywgMHg4YiwgMHg0YiwgMHg4MiwgMHg0MiwgMHg4NSwgMHg0NSwKKwkweGE4LCAweDY4LCAweGFmLCAweDZmLCAweGE2LCAweDY2LCAweGExLCAweDYxLAorCTB4YjQsIDB4NzQsIDB4YjMsIDB4NzMsIDB4YmEsIDB4N2EsIDB4YmQsIDB4N2QsCisJMHg0NywgMHg4NywgMHg0MCwgMHg4MCwgMHg0OSwgMHg4OSwgMHg0ZSwgMHg4ZSwKKwkweDViLCAweDliLCAweDVjLCAweDljLCAweDU1LCAweDk1LCAweDUyLCAweDkyLAorCTB4N2YsIDB4YmYsIDB4NzgsIDB4YjgsIDB4NzEsIDB4YjEsIDB4NzYsIDB4YjYsCisJMHg2MywgMHhhMywgMHg2NCwgMHhhNCwgMHg2ZCwgMHhhZCwgMHg2YSwgMHhhYSwKKwkweDM3LCAweGY3LCAweDMwLCAweGYwLCAweDM5LCAweGY5LCAweDNlLCAweGZlLAorCTB4MmIsIDB4ZWIsIDB4MmMsIDB4ZWMsIDB4MjUsIDB4ZTUsIDB4MjIsIDB4ZTIsCisJMHgwZiwgMHhjZiwgMHgwOCwgMHhjOCwgMHgwMSwgMHhjMSwgMHgwNiwgMHhjNiwKKwkweDEzLCAweGQzLCAweDE0LCAweGQ0LCAweDFkLCAweGRkLCAweDFhLCAweGRhLAorCTB4YTcsIDB4NjcsIDB4YTAsIDB4NjAsIDB4YTksIDB4NjksIDB4YWUsIDB4NmUsCisJMHhiYiwgMHg3YiwgMHhiYywgMHg3YywgMHhiNSwgMHg3NSwgMHhiMiwgMHg3MiwKKwkweDlmLCAweDVmLCAweDk4LCAweDU4LCAweDkxLCAweDUxLCAweDk2LCAweDU2LAorCTB4ODMsIDB4NDMsIDB4ODQsIDB4NDQsIDB4OGQsIDB4NGQsIDB4OGEsIDB4NGEsCisJMHhkNywgMHgxNywgMHhkMCwgMHgxMCwgMHhkOSwgMHgxOSwgMHhkZSwgMHgxZSwKKwkweGNiLCAweDBiLCAweGNjLCAweDBjLCAweGM1LCAweDA1LCAweGMyLCAweDAyLAorCTB4ZWYsIDB4MmYsIDB4ZTgsIDB4MjgsIDB4ZTEsIDB4MjEsIDB4ZTYsIDB4MjYsCisJMHhmMywgMHgzMywgMHhmNCwgMHgzNCwgMHhmZCwgMHgzZCwgMHhmYSwgMHgzYQorfTsKKworCisvKiBSZXR1cm5zIFYgbW9kdWxvIDI1NSBwcm92aWRlZCBWIGlzIGluIHRoZSByYW5nZSAtMjU1LC0yNTQsLi4uLDUwOS4KKyAqLworc3RhdGljIGlubGluZSBfX3U4IG1vZDI1NShpbnQgdikKK3sKKwlpZiAodiA+IDApIHsKKwkJaWYgKHYgPCAyNTUpIHsKKwkJCXJldHVybiB2OworCQl9IGVsc2UgeworCQkJcmV0dXJuIHYgLSAyNTU7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gdiArIDI1NTsKKwl9Cit9CisKKworLyogQWRkIHR3byBudW1iZXJzIGluIHRoZSBmaWVsZC4gIEFkZGl0aW9uIGluIHRoaXMgZmllbGQgaXMgZXF1aXZhbGVudAorICogdG8gYSBiaXQtd2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uLS0tc3VidHJhY3Rpb24gaXMgdGhlcmVmb3JlCisgKiBpZGVudGljYWwgdG8gYWRkaXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCBnZmFkZChfX3U4IGEsIF9fdTggYikKK3sKKwlyZXR1cm4gYSBeIGI7Cit9CisKKworLyogQWRkIHR3byB2ZWN0b3JzIG9mIG51bWJlcnMgaW4gdGhlIGZpZWxkLiAgRWFjaCBieXRlIGluIEEgYW5kIEIgZ2V0cworICogYWRkZWQgaW5kaXZpZHVhbGx5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2ZhZGRfbG9uZyh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwlyZXR1cm4gYSBeIGI7Cit9CisKKworLyogTXVsdGlwbHkgdHdvIG51bWJlcnMgaW4gdGhlIGZpZWxkOgorICovCitzdGF0aWMgaW5saW5lIF9fdTggZ2ZtdWwoX191OCBhLCBfX3U4IGIpCit7CisJaWYgKGEgJiYgYikgeworCQlyZXR1cm4gZ2Zwb3dbbW9kMjU1KGdmbG9nW2FdICsgZ2Zsb2dbYl0pXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworLyogSnVzdCBsaWtlIGdmbXVsLCBleGNlcHQgd2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCB1cCB0aGUgbG9nIG9mIHRoZQorICogc2Vjb25kIG51bWJlci4KKyAqLworc3RhdGljIGlubGluZSBfX3U4IGdmbXVsX2V4cChfX3U4IGEsIGludCBiKQoreworCWlmIChhKSB7CisJCXJldHVybiBnZnBvd1ttb2QyNTUoZ2Zsb2dbYV0gKyBiKV07CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCisKKy8qIEp1c3QgbGlrZSBnZm11bF9leHAsIGV4Y2VwdCB0aGF0IEEgaXMgYSB2ZWN0b3Igb2YgbnVtYmVycy4gIFRoYXQKKyAqIGlzLCBlYWNoIGJ5dGUgaW4gQSBnZXRzIG11bHRpcGxpZWQgYnkgZ2Zwb3dbbW9kMjU1KEIpXS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdmbXVsX2V4cF9sb25nKHVuc2lnbmVkIGxvbmcgYSwgaW50IGIpCit7CisJX191OCB0OworCisJaWYgKHNpemVvZihsb25nKSA9PSA0KSB7CisJCXJldHVybiAoCisJCSgodCA9IChfX3UzMilhID4+IDI0ICYgMHhmZikgPworCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMjQpIDogMCkgfAorCQkoKHQgPSAoX191MzIpYSA+PiAxNiAmIDB4ZmYpID8KKwkJICgoKF9fdTMyKSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDE2KSA6IDApIHwKKwkJKCh0ID0gKF9fdTMyKWEgPj4gOCAmIDB4ZmYpID8KKwkJICgoKF9fdTMyKSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDgpIDogMCkgfAorCQkoKHQgPSAoX191MzIpYSA+PiAwICYgMHhmZikgPworCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMCkgOiAwKSk7CisJfSBlbHNlIGlmIChzaXplb2YobG9uZykgPT0gOCkgeworCQlyZXR1cm4gKAorCQkoKHQgPSAoX191NjQpYSA+PiA1NiAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDU2KSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gNDggJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCA0OCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDQwICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgNDApIDogMCkgfAorCQkoKHQgPSAoX191NjQpYSA+PiAzMiAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDMyKSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gMjQgJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAyNCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDE2ICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMTYpIDogMCkgfAorCQkoKHQgPSAoX191NjQpYSA+PiA4ICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgOCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDAgJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAwKSA6IDApKTsKKwl9IGVsc2UgeworCQlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsICJFcnJvcjogc2l6ZSBvZiBsb25nIGlzICVkIGJ5dGVzIiwKKwkJCSAgICAoaW50KXNpemVvZihsb25nKSk7CisJfQorfQorCisKKy8qIERpdmlkZSB0d28gbnVtYmVycyBpbiB0aGUgZmllbGQuICBSZXR1cm5zIGEvYiAobW9kdWxvIGYoeCkpLgorICovCitzdGF0aWMgaW5saW5lIF9fdTggZ2ZkaXYoX191OCBhLCBfX3U4IGIpCit7CisJaWYgKCFiKSB7CisJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCVRSQUNFX0FCT1JUKDB4ZmYsIGZ0X3RfYnVnLCAiRXJyb3I6IGRpdmlzaW9uIGJ5IHplcm8iKTsKKwl9IGVsc2UgaWYgKGEgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gZ2Zwb3dbbW9kMjU1KGdmbG9nW2FdIC0gZ2Zsb2dbYl0pXTsKKwl9Cit9CisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBtYXRyaXggb2YgdGhlCisgKiBsaW5lYXIgc3lzdGVtIHRoYXQgbmVlZHMgdG8gYmUgc29sdmVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKKyAqIG1hZ25pdHVkZXMuICBUaGUgZmlyc3QgZGVhbHMgd2l0aCBtYXRyaWNlcyBvZiByYW5rIDMsIHdoaWxlIHRoZQorICogc2Vjb25kIGRlYWxzIHdpdGggbWF0cmljZXMgb2YgcmFuayAyLiAgVGhlIGVycm9yIGluZGljZXMgYXJlIHBhc3NlZAorICogaW4gYXJndW1lbnRzIEwwLC4uLEwyICgwPWZpcnN0IHNlY3RvciwgMzE9bGFzdCBzZWN0b3IpLiAgVGhlIGVycm9yCisgKiBpbmRpY2VzIG11c3QgYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgaS5lLiwgTDA8TDE8TDIuCisgKgorICogVGhlIGxpbmVhciBzeXN0ZW0gdGhhdCBuZWVkcyB0byBiZSBzb2x2ZWQgZm9yIHRoZSBlcnJvciBtYWduaXR1ZGVzCisgKiBpcyBBICogYiA9IHMsIHdoZXJlIHMgaXMgdGhlIGtub3duIHZlY3RvciBvZiBzeW5kcm9tZXMsIGIgaXMgdGhlCisgKiB2ZWN0b3Igb2YgZXJyb3IgbWFnbml0dWRlcyBhbmQgQSBpbiB0aGUgT1JERVI9MyBjYXNlOgorICoKKyAqICAgIEFfMyA9IHt7MS9yXkxbMF0sIDEvcl5MWzFdLCAxL3JeTFsyXX0sCisgKiAgICAgICAgICB7ICAgICAgICAxLCAgICAgICAgMSwgICAgICAgIDF9LAorICogICAgICAgICAgeyByXkxbMF0sIHJeTFsxXSwgcl5MWzJdfX0gCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdmaW52MyhfX3U4IGwwLAorCQkJIF9fdTggbDEsIAorCQkJIF9fdTggbDIsIAorCQkJIE1hdHJpeCBBaW52KQoreworCV9fdTggZGV0OworCV9fdTggdDIwLCB0MTAsIHQyMSwgdDEyLCB0MDEsIHQwMjsKKwlpbnQgbG9nX2RldDsKKworCS8qIGNvbXB1dGUgc29tZSBpbnRlcm1lZGlhdGUgcmVzdWx0czogKi8KKwl0MjAgPSBnZnBvd1tsMiAtIGwwXTsJICAgICAgICAvKiB0MjAgPSByXmwyL3JebDAgKi8KKwl0MTAgPSBnZnBvd1tsMSAtIGwwXTsJICAgICAgICAvKiB0MTAgPSByXmwxL3JebDAgKi8KKwl0MjEgPSBnZnBvd1tsMiAtIGwxXTsJICAgICAgICAvKiB0MjEgPSByXmwyL3JebDEgKi8KKwl0MTIgPSBnZnBvd1tsMSAtIGwyICsgMjU1XTsJLyogdDEyID0gcl5sMS9yXmwyICovCisJdDAxID0gZ2Zwb3dbbDAgLSBsMSArIDI1NV07CS8qIHQwMSA9IHJebDAvcl5sMSAqLworCXQwMiA9IGdmcG93W2wwIC0gbDIgKyAyNTVdOwkvKiB0MDIgPSByXmwwL3JebDIgKi8KKwkvKiBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50IG9mIG1hdHJpeCBBXzNeLTEgKHNvbWV0aW1lcworCSAqIGNhbGxlZCB0aGUgVmFuZGVybW9uZGUgZGV0ZXJtaW5hbnQpOgorCSAqLworCWRldCA9IGdmYWRkKHQyMCwgZ2ZhZGQodDEwLCBnZmFkZCh0MjEsIGdmYWRkKHQxMiwgZ2ZhZGQodDAxLCB0MDIpKSkpKTsKKwlpZiAoIWRldCkgeworCQlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQlUUkFDRV9BQk9SVCgwLCBmdF90X2VyciwKKwkJCSAgICJJbnZlcnNpb24gZmFpbGVkICgzIENSQyBlcnJvcnMsID4wIENSQyBmYWlsdXJlcykiKTsKKwl9CisJbG9nX2RldCA9IDI1NSAtIGdmbG9nW2RldF07CisKKwkvKiBOb3csIGNhbGN1bGF0ZSBhbGwgb2YgdGhlIGNvZWZmaWNpZW50czoKKwkgKi8KKwlBaW52WzBdWzBdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbbDFdLCBnZnBvd1tsMl0pLCBsb2dfZGV0KTsKKwlBaW52WzBdWzFdPSBnZm11bF9leHAoZ2ZhZGQodDIxLCB0MTIpLCBsb2dfZGV0KTsKKwlBaW52WzBdWzJdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbMjU1IC0gbDFdLCBnZnBvd1syNTUgLSBsMl0pLGxvZ19kZXQpOworCisJQWludlsxXVswXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93W2wwXSwgZ2Zwb3dbbDJdKSwgbG9nX2RldCk7CisJQWludlsxXVsxXT0gZ2ZtdWxfZXhwKGdmYWRkKHQyMCwgdDAyKSwgbG9nX2RldCk7CisJQWludlsxXVsyXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93WzI1NSAtIGwwXSwgZ2Zwb3dbMjU1IC0gbDJdKSxsb2dfZGV0KTsKKworCUFpbnZbMl1bMF09IGdmbXVsX2V4cChnZmFkZChnZnBvd1tsMF0sIGdmcG93W2wxXSksIGxvZ19kZXQpOworCUFpbnZbMl1bMV09IGdmbXVsX2V4cChnZmFkZCh0MTAsIHQwMSksIGxvZ19kZXQpOworCUFpbnZbMl1bMl09IGdmbXVsX2V4cChnZmFkZChnZnBvd1syNTUgLSBsMF0sIGdmcG93WzI1NSAtIGwxXSksbG9nX2RldCk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBnZmludjIoX191OCBsMCwgX191OCBsMSwgTWF0cml4IEFpbnYpCit7CisJX191OCBkZXQ7CisJX191OCB0MSwgdDI7CisJaW50IGxvZ19kZXQ7CisKKwl0MSA9IGdmcG93WzI1NSAtIGwwXTsKKwl0MiA9IGdmcG93WzI1NSAtIGwxXTsKKwlkZXQgPSBnZmFkZCh0MSwgdDIpOworCWlmICghZGV0KSB7CisJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAorCQkJICAgIkludmVyc2lvbiBmYWlsZWQgKDIgQ1JDIGVycm9ycywgPjAgQ1JDIGZhaWx1cmVzKSIpOworCX0KKwlsb2dfZGV0ID0gMjU1IC0gZ2Zsb2dbZGV0XTsKKworCS8qIE5vdywgY2FsY3VsYXRlIGFsbCBvZiB0aGUgY29lZmZpY2llbnRzOgorCSAqLworCUFpbnZbMF1bMF0gPSBBaW52WzFdWzBdID0gZ2Zwb3dbbG9nX2RldF07CisKKwlBaW52WzBdWzFdID0gZ2ZtdWxfZXhwKHQyLCBsb2dfZGV0KTsKKwlBaW52WzFdWzFdID0gZ2ZtdWxfZXhwKHQxLCBsb2dfZGV0KTsKKworCXJldHVybiAxOworfQorCisKKy8qIE11bHRpcGx5IG1hdHJpeCBBIGJ5IHZlY3RvciBTIGFuZCByZXR1cm4gcmVzdWx0IGluIHZlY3RvciBCLiAgTSBpcworICogYXNzdW1lZCB0byBiZSBvZiBvcmRlciBOeE4sIFMgYW5kIEIgb2Ygb3JkZXIgTngxLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2ZtYXRfbXVsKGludCBuLCBNYXRyaXggQSwgCisJCQkgICAgIF9fdTggKnMsIF9fdTggKmIpCit7CisJaW50IGksIGo7CisJX191OCBkb3RfcHJvZDsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJZG90X3Byb2QgPSAwOworCQlmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisJCQlkb3RfcHJvZCA9IGdmYWRkKGRvdF9wcm9kLCBnZm11bChBW2ldW2pdLCBzW2pdKSk7CisJCX0KKwkJYltpXSA9IGRvdF9wcm9kOworCX0KK30KKwwKKworCisvKiBUaGUgUmVlZCBTb2xvbW9uIEVDQyBjb2RlcyBhcmUgY29tcHV0ZWQgb3ZlciB0aGUgTi10aCBieXRlIG9mIGVhY2gKKyAqIGJsb2NrLCB3aGVyZSBOPVNFQ1RPUl9TSVpFLiAgVGhlcmUgYXJlIHVwIHRvIDI5IGJsb2NrcyBvZiBkYXRhLCBhbmQKKyAqIDMgYmxvY2tzIG9mIEVDQy4gIFRoZSBibG9ja3MgYXJlIHN0b3JlZCBjb250aWd1b3VzbHkgaW4gbWVtb3J5LiAgQQorICogc2VnbWVudCwgY29uc2VxdWVudGx5LCBpcyBhc3N1bWVkIHRvIGhhdmUgYXQgbGVhc3QgNCBibG9ja3M6IG9uZSBvcgorICogbW9yZSBkYXRhIGJsb2NrcyBwbHVzIHRocmVlIEVDQyBibG9ja3MuCisgKgorICogTm90aWNlOiBJbiBRSUMtODAgc3BlYWssIGEgQ1JDIGVycm9yIGlzIGEgc2VjdG9yIHdpdGggYW4gaW5jb3JyZWN0CisgKiAgICAgICAgIENSQy4gIEEgQ1JDIGZhaWx1cmUgaXMgYSBzZWN0b3Igd2l0aCBpbmNvcnJlY3QgZGF0YSwgYnV0CisgKiAgICAgICAgIGEgdmFsaWQgQ1JDLiAgSW4gdGhlIGVycm9yIGNvbnRyb2wgbGl0ZXJhdHVyZSwgdGhlIGZvcm1lcgorICogICAgICAgICBpcyB1c3VhbGx5IGNhbGxlZCAiZXJhc3VyZSIsIHRoZSBsYXR0ZXIgImVycm9yLiIKKyAqLworLyogQ29tcHV0ZSB0aGUgcGFyaXR5IGJ5dGVzIGZvciBDIGNvbHVtbnMgb2YgZGF0YSwgd2hlcmUgQyBpcyB0aGUKKyAqIG51bWJlciBvZiBieXRlcyB0aGF0IGZpdCBpbnRvIGEgbG9uZyBpbnRlZ2VyLiAgV2UgdXNlIGEgbGluZWFyCisgKiBmZWVkLWJhY2sgcmVnaXN0ZXIgdG8gZG8gdGhpcy4gIFRoZSBwYXJpdHkgYnl0ZXMgUFswXSwgUFtTVFJJREVdLAorICogUFsyKlNUUklERV0gYXJlIGNvbXB1dGVkIHN1Y2ggdGhhdDoKKyAqCisgKiAgICAgICAgICAgICAgeF5rICogcCh4KSArIG0oeCkgPSAwIChtb2R1bG8gZyh4KSkKKyAqCisgKiB3aGVyZSBrID0gTkJMT0NLUywKKyAqICAgICAgIHAoeCkgPSBQWzBdICsgUFtTVFJJREVdKnggKyBQWzIqU1RSSURFXSp4XjIsIGFuZAorICogICAgICAgbSh4KSA9IHN1bV97aT0wfV5rIG1faSp4XmkuCisgKiAgICAgICBtX2kgPSBEQVRBW2kqU0VDVE9SX1NJWkVdCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGFyaXR5KHVuc2lnbmVkIGxvbmcgKmRhdGEsCisJCQkgICAgICBpbnQgbmJsb2NrcywgCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpwLCAKKwkJCSAgICAgIGludCBzdHJpZGUpCit7CisJdW5zaWduZWQgbG9uZyBwMCwgcDEsIHAyLCB0MSwgdDIsICplbmQ7CisKKwllbmQgPSBkYXRhICsgbmJsb2NrcyAqIChGVF9TRUNUT1JfU0laRSAvIHNpemVvZihsb25nKSk7CisJcDAgPSBwMSA9IHAyID0gMDsKKwl3aGlsZSAoZGF0YSA8IGVuZCkgeworCQkvKiBUaGUgbmV3IHBhcml0eSBieXRlcyBwMF9pLCBwMV9pLCBwMl9pIGFyZSBjb21wdXRlZAorCQkgKiBmcm9tIHRoZSBvbGQgdmFsdWVzIHAwX3tpLTF9LCBwMV97aS0xfSwgcDJfe2ktMX0KKwkJICogcmVjdXJzaXZlbHkgYXM6CisJCSAqCisJCSAqICAgICAgICBwMF9pID0gcDFfe2ktMX0gKyByXjEwNSAqIChtX3tpLTF9IC0gcDBfe2ktMX0pCisJCSAqICAgICAgICBwMV9pID0gcDJfe2ktMX0gKyByXjEwNSAqIChtX3tpLTF9IC0gcDBfe2ktMX0pCisJCSAqICAgICAgICBwMl9pID0gICAgICAgICAgICAgICAgICAgIChtX3tpLTF9IC0gcDBfe2ktMX0pCisJCSAqCisJCSAqIFdpdGggdGhlIGluaXRpYWwgY29uZGl0aW9uOiBwMF8wID0gcDFfMCA9IHAyXzAgPSAwLgorCQkgKi8KKwkJdDEgPSBnZmFkZF9sb25nKCpkYXRhLCBwMCk7CisJCS8qCisJCSAqIE11bHRpcGx5IGVhY2ggYnl0ZSBpbiB0MSBieSAweGMwOgorCQkgKi8KKwkJaWYgKHNpemVvZihsb25nKSA9PSA0KSB7CisJCQl0Mj0gKCgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAyNCAmIDB4ZmZdKSA8PCAyNCB8CisJCQkgICAgICgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAxNiAmIDB4ZmZdKSA8PCAxNiB8CisJCQkgICAgICgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAgOCAmIDB4ZmZdKSA8PCAgOCB8CisJCQkgICAgICgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAgMCAmIDB4ZmZdKSA8PCAgMCk7CisJCX0gZWxzZSBpZiAoc2l6ZW9mKGxvbmcpID09IDgpIHsKKwkJCXQyPSAoKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDU2ICYgMHhmZl0pIDw8IDU2IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDQ4ICYgMHhmZl0pIDw8IDQ4IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDQwICYgMHhmZl0pIDw8IDQwIHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDMyICYgMHhmZl0pIDw8IDMyIHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDI0ICYgMHhmZl0pIDw8IDI0IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDE2ICYgMHhmZl0pIDw8IDE2IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+ICA4ICYgMHhmZl0pIDw8ICA4IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+ICAwICYgMHhmZl0pIDw8ICAwKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCQlUUkFDRShmdF90X2VyciwgIkVycm9yOiBsb25nIGlzIG9mIHNpemUgJWQiLAorCQkJICAgICAgKGludCkgc2l6ZW9mKGxvbmcpKTsKKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJcDAgPSBnZmFkZF9sb25nKHQyLCBwMSk7CisJCXAxID0gZ2ZhZGRfbG9uZyh0MiwgcDIpOworCQlwMiA9IHQxOworCQlkYXRhICs9IEZUX1NFQ1RPUl9TSVpFIC8gc2l6ZW9mKGxvbmcpOworCX0KKwkqcCA9IHAwOworCXAgKz0gc3RyaWRlOworCSpwID0gcDE7CisJcCArPSBzdHJpZGU7CisJKnAgPSBwMjsKKwlyZXR1cm47Cit9CisKKworLyogQ29tcHV0ZSB0aGUgMyBzeW5kcm9tZSB2YWx1ZXMuICBEQVRBIHNob3VsZCBwb2ludCB0byB0aGUgZmlyc3QgYnl0ZQorICogb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggdGhlIHN5bmRyb21lcyBhcmUgZGVzaXJlZC4gIFRoZSBzeW5kcm9tZXMKKyAqIGFyZSBjb21wdXRlZCBvdmVyIHRoZSBmaXJzdCBOQkxPQ0tTIG9mIHJvd3MuICBUaGUgdGhyZWUgYnl0ZXMgd2lsbAorICogYmUgcGxhY2VkIGluIFNbMF0sIFNbMV0sIGFuZCBTWzJdLgorICoKKyAqIFNbaV0gaXMgdGhlIHZhbHVlIG9mIHRoZSAibWVzc2FnZSIgcG9seW5vbWlhbCBtKHgpIGV2YWx1YXRlZCBhdCB0aGUKKyAqIGktdGggcm9vdCBvZiB0aGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZyh4KS4KKyAqCisgKiBBcyBnKHgpPSh4LXJeLTEpKHgtMSkoeC1yXjEpIHdlIGV2YWx1YXRlIHRoZSBtZXNzYWdlIHBvbHlub21pYWwgYXQKKyAqIHg9cl4tMSB0byBnZXQgU1swXSwgYXQgeD1yXjA9MSB0byBnZXQgU1sxXSwgYW5kIGF0IHg9ciB0byBnZXQgU1syXS4KKyAqIFRoaXMgY291bGQgYmUgZG9uZSBkaXJlY3RseSBhbmQgZWZmaWNpZW50bHkgdmlhIHRoZSBIb3JuZXIgc2NoZW1lLgorICogSG93ZXZlciwgaXQgd291bGQgcmVxdWlyZSBtdWx0aXBsaWNhdGlvbiB0YWJsZXMgZm9yIHRoZSBmYWN0b3JzCisgKiByXi0xICgweGMzKSBhbmQgciAoMHgwMikuICBUaGUgZm9sbG93aW5nIHNjaGVtZSBkb2VzIG5vdCByZXF1aXJlCisgKiBhbnkgbXVsdGlwbGljYXRpb24gdGFibGVzIGJleW9uZCB3aGF0J3MgbmVlZGVkIGZvciBzZXRfcGFyaXR5KCkKKyAqIGFueXdheSBhbmQgaXMgc2xpZ2h0bHkgZmFzdGVyIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMgYW5kIHNsaWdodGx5CisgKiBzbG93ZXIgaWYgdGhlcmUgYXJlIGVycm9ycy4gIFRoZSBsYXR0ZXIgaXMgaG9wZWZ1bGx5IHRoZSBpbmZyZXF1ZW50CisgKiBjYXNlLgorICoKKyAqIFRvIHVuZGVyc3RhbmQgdGhlIGFsdGVybmF0aXZlIGFsZ29yaXRobSwgbm90aWNlIHRoYXQgc2V0X3Bhcml0eShtLAorICogaywgcCkgY29tcHV0ZXMgcGFyaXR5IGJ5dGVzIHN1Y2ggdGhhdDoKKyAqCisgKiAgICAgIHheayAqIHAoeCkgPSBtKHgpIChtb2R1bG8gZyh4KSkuCisgKgorICogVGhhdCBpcywgdG8gZXZhbHVhdGUgbShyXm0pLCB3aGVyZSByXm0gaXMgYSByb290IG9mIGcoeCksIHdlIGNhbgorICogc2ltcGx5IGV2YWx1YXRlIChyXm0pXmsqcChyXm0pLiAgQWxzbywgbm90aWNlIHRoYXQgcCBpcyAwIGlmIGFuZAorICogb25seSBpZiBzIGlzIHplcm8uICBUaGF0IGlzLCBpZiBhbGwgcGFyaXR5IGJ5dGVzIGFyZSAwLCB3ZSBrbm93CisgKiB0aGVyZSBpcyBubyBlcnJvciBpbiB0aGUgZGF0YSBhbmQgY29uc2VxdWVudGx5IHRoZXJlIGlzIG5vIG5lZWQgdG8KKyAqIGNvbXB1dGUgcyh4KSBhdCBhbGwhICBJbiBhbGwgb3RoZXIgY2FzZXMsIHdlIGNvbXB1dGUgcyh4KSBmcm9tIHAoeCkKKyAqIGJ5IGV2YWx1YXRpbmcgKHJebSleaypwKHJebSkgZm9yIG09LTEsIG09MCwgYW5kIG09MS4gIFRoZSBwKHgpCisgKiBwb2x5bm9taWFsIGlzIGV2YWx1YXRlZCB2aWEgdGhlIEhvcm5lciBzY2hlbWUuCisgKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9zeW5kcm9tZXModW5zaWduZWQgbG9uZyAqZGF0YSwgaW50IG5ibG9ja3MsIHVuc2lnbmVkIGxvbmcgKnMpCit7CisJdW5zaWduZWQgbG9uZyBwWzNdOworCisJc2V0X3Bhcml0eShkYXRhLCBuYmxvY2tzLCBwLCAxKTsKKwlpZiAocFswXSB8IHBbMV0gfCBwWzJdKSB7CisJCS8qIFNvbWUgb2YgdGhlIGNoZWNrZWQgY29sdW1ucyBkbyBub3QgaGF2ZSBhIHplcm8KKwkJICogc3luZHJvbWUuICBGb3Igc2ltcGxpY2l0eSwgd2UgY29tcHV0ZSB0aGUgc3luZHJvbWVzCisJCSAqIGZvciBhbGwgY29sdW1ucyB0aGF0IHdlIGhhdmUgY29tcHV0ZWQgdGhlCisJCSAqIHJlbWFpbmRlcnMgZm9yLgorCQkgKi8KKwkJc1swXSA9IGdmbXVsX2V4cF9sb25nKAorCQkJZ2ZhZGRfbG9uZyhwWzBdLCAKKwkJCQkgICBnZm11bF9leHBfbG9uZygKKwkJCQkJICAgZ2ZhZGRfbG9uZyhwWzFdLCAKKwkJCQkJCSAgICAgIGdmbXVsX2V4cF9sb25nKHBbMl0sIC0xKSksCisJCQkJCSAgIC0xKSksIAorCQkJLW5ibG9ja3MpOworCQlzWzFdID0gZ2ZhZGRfbG9uZyhnZmFkZF9sb25nKHBbMl0sIHBbMV0pLCBwWzBdKTsKKwkJc1syXSA9IGdmbXVsX2V4cF9sb25nKAorCQkJZ2ZhZGRfbG9uZyhwWzBdLCAKKwkJCQkgICBnZm11bF9leHBfbG9uZygKKwkJCQkJICAgZ2ZhZGRfbG9uZyhwWzFdLAorCQkJCQkJICAgICAgZ2ZtdWxfZXhwX2xvbmcocFsyXSwgMSkpLAorCQkJCQkgICAxKSksCisJCQluYmxvY2tzKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDE7CisJfQorfQorCisKKy8qIENvcnJlY3QgdGhlIGJsb2NrIGluIHRoZSBjb2x1bW4gcG9pbnRlZCB0byBieSBEQVRBLiAgVGhlcmUgYXJlIE5CQUQKKyAqIENSQyBlcnJvcnMgYW5kIHRoZWlyIGluZGljZXMgYXJlIGluIEJBRF9MT0NbMF0sIHVwIHRvCisgKiBCQURfTE9DW05CQUQtMV0uICBJZiBOQkFEPjEsIEFpbnYgaG9sZHMgdGhlIGludmVyc2Ugb2YgdGhlIG1hdHJpeAorICogb2YgdGhlIGxpbmVhciBzeXN0ZW0gdGhhdCBuZWVkcyB0byBiZSBzb2x2ZWQgdG8gZGV0ZXJtaW5lIHRoZSBlcnJvcgorICogbWFnbml0dWRlcy4gIFNbMF0sIFNbMV0sIGFuZCBTWzJdIGFyZSB0aGUgc3luZHJvbWUgdmFsdWVzLiAgSWYgcm93CisgKiBqIGdldHMgY29ycmVjdGVkLCB0aGVuIGJpdCBqIHdpbGwgYmUgc2V0IGluIENPUlJFQ1RJT05fTUFQLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb3JyZWN0X2Jsb2NrKF9fdTggKmRhdGEsIGludCBuYmxvY2tzLAorCQkJCWludCBuYmFkLCBpbnQgKmJhZF9sb2MsIE1hdHJpeCBBaW52LAorCQkJCV9fdTggKnMsCisJCQkJU2VjdG9yTWFwICogY29ycmVjdGlvbl9tYXApCit7CisJaW50IG5jb3JyZWN0ZWQgPSAwOworCWludCBpOworCV9fdTggdDEsIHQyOworCV9fdTggYzAsIGMxLCBjMjsJLyogY2hlY2sgYnl0ZXMgKi8KKwlfX3U4IGVycm9yX21hZ1szXSwgbG9nX2Vycm9yX21hZzsKKwlfX3U4ICpkcCwgbCwgZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoIChuYmFkKSB7CisJY2FzZSAwOgorCQkvKiBtaWdodCBoYXZlIGEgQ1JDIGZhaWx1cmU6ICovCisJCWlmIChzWzBdID09IDApIHsKKwkJCS8qIG1vcmUgdGhhbiBvbmUgZXJyb3IgKi8KKwkJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCQkgIkVDQyBmYWlsZWQgKDAgQ1JDIGVycm9ycywgPjEgQ1JDIGZhaWx1cmVzKSIpOworCQl9CisJCXQxID0gZ2ZkaXYoc1sxXSwgc1swXSk7CisJCWlmICgoYmFkX2xvY1tuYmFkKytdID0gZ2Zsb2dbdDFdKSA+PSBuYmxvY2tzKSB7CisJCQlUUkFDRShmdF90X2VyciwKKwkJCSAgICAgICJFQ0MgZmFpbGVkICgwIENSQyBlcnJvcnMsID4xIENSQyBmYWlsdXJlcykiKTsKKwkJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCQkgICJhdHRlbXB0IHRvIGNvcnJlY3QgZGF0YSBhdCAlZCIsIGJhZF9sb2NbMF0pOworCQl9CisJCWVycm9yX21hZ1swXSA9IHNbMV07CisJCWJyZWFrOworCWNhc2UgMToKKwkJdDEgPSBnZmFkZChnZm11bF9leHAoc1sxXSwgYmFkX2xvY1swXSksIHNbMl0pOworCQl0MiA9IGdmYWRkKGdmbXVsX2V4cChzWzBdLCBiYWRfbG9jWzBdKSwgc1sxXSk7CisJCWlmICh0MSA9PSAwICYmIHQyID09IDApIHsKKwkJCS8qIG9uZSBlcmFzdXJlLCBubyBlcnJvcjogKi8KKwkJCUFpbnZbMF1bMF0gPSBnZnBvd1tiYWRfbG9jWzBdXTsKKwkJfSBlbHNlIGlmICh0MSA9PSAwIHx8IHQyID09IDApIHsKKwkJCS8qIG9uZSBlcmFzdXJlIGFuZCBtb3JlIHRoYW4gb25lIGVycm9yOiAqLworCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJCSAgICAiRUNDIGZhaWxlZCAoMSBlcmFzdXJlLCA+MSBlcnJvcikiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uZSBlcmFzdXJlLCBvbmUgZXJyb3I6ICovCisJCQlpZiAoKGJhZF9sb2NbbmJhZCsrXSA9IGdmbG9nW2dmZGl2KHQxLCB0MildKSAKKwkJCSAgICA+PSBuYmxvY2tzKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJFQ0MgZmFpbGVkICIKKwkJCQkgICAgICAiKDEgQ1JDIGVycm9ycywgPjEgQ1JDIGZhaWx1cmVzKSIpOworCQkJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCQkJICAgICJhdHRlbXB0IHRvIGNvcnJlY3QgZGF0YSBhdCAlZCIsCisJCQkJCSAgICBiYWRfbG9jWzFdKTsKKwkJCX0KKwkJCWlmICghZ2ZpbnYyKGJhZF9sb2NbMF0sIGJhZF9sb2NbMV0sIEFpbnYpKSB7CisJCQkJLyogaW52ZXJzaW9uIGZhaWxlZC0tLW11c3QgaGF2ZSBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICB0aGFuIG9uZSBlcnJvciAKKwkJCQkgKi8KKwkJCQlUUkFDRV9FWElUIC0xOworCQkJfQorCQl9CisJCS8qIEZBTEwgVEhST1VHSCBUTyBFUlJPUiBNQUdOSVRVREUgQ09NUFVUQVRJT046CisJCSAqLworCWNhc2UgMjoKKwljYXNlIDM6CisJCS8qIGNvbXB1dGUgZXJyb3IgbWFnbml0dWRlczogKi8KKwkJZ2ZtYXRfbXVsKG5iYWQsIEFpbnYsIHMsIGVycm9yX21hZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJICAgICJJbnRlcm5hbCBFcnJvcjogbnVtYmVyIG9mIENSQyBlcnJvcnMgPiAzIik7CisJfQorCisJLyogUGVyZm9ybSBjb3JyZWN0aW9uIGJ5IGFkZGluZyBFUlJPUl9NQUdbaV0gdG8gdGhlIGJ5dGUgYXQKKwkgKiBvZmZzZXQgQkFEX0xPQ1tpXS4gIEFsc28gYWRkIHRoZSB2YWx1ZSBvZiB0aGUgY29tcHV0ZWQKKwkgKiBlcnJvciBwb2x5bm9taWFsIHRvIHRoZSBzeW5kcm9tZSB2YWx1ZXMuICBJZiB0aGUgY29ycmVjdGlvbgorCSAqIHdhcyBzdWNjZXNzZnVsLCB0aGUgcmVzdWx0aW5nIGNoZWNrIGJ5dGVzIHNob3VsZCBiZSB6ZXJvCisJICogKGkuZS4sIHRoZSBjb3JyZWN0ZWQgZGF0YSBpcyBhIHZhbGlkIGNvZGUgd29yZCkuCisJICovCisJYzAgPSBzWzBdOworCWMxID0gc1sxXTsKKwljMiA9IHNbMl07CisJZm9yIChpID0gMDsgaSA8IG5iYWQ7ICsraSkgeworCQllID0gZXJyb3JfbWFnW2ldOworCQlpZiAoZSkgeworCQkJLyogY29ycmVjdCB0aGUgYnl0ZSBhdCBvZmZzZXQgTCBieSBtYWduaXR1ZGUgRTogKi8KKwkJCWwgPSBiYWRfbG9jW2ldOworCQkJZHAgPSAmZGF0YVtsICogRlRfU0VDVE9SX1NJWkVdOworCQkJKmRwID0gZ2ZhZGQoKmRwLCBlKTsKKwkJCSpjb3JyZWN0aW9uX21hcCB8PSAxIDw8IGw7CisJCQkrK25jb3JyZWN0ZWQ7CisKKwkJCWxvZ19lcnJvcl9tYWcgPSBnZmxvZ1tlXTsKKwkJCWMwID0gZ2ZhZGQoYzAsIGdmcG93W21vZDI1NShsb2dfZXJyb3JfbWFnIC0gbCldKTsKKwkJCWMxID0gZ2ZhZGQoYzEsIGUpOworCQkJYzIgPSBnZmFkZChjMiwgZ2Zwb3dbbW9kMjU1KGxvZ19lcnJvcl9tYWcgKyBsKV0pOworCQl9CisJfQorCWlmIChjMCB8fCBjMSB8fCBjMikgeworCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsCisJCQkgICAgIkVDQyBzZWxmLWNoZWNrIGZhaWxlZCwgdG9vIG1hbnkgZXJyb3JzIik7CisJfQorCVRSQUNFX0VYSVQgbmNvcnJlY3RlZDsKK30KKworCisjaWYgZGVmaW5lZChFQ0NfU0FOSVRZX0NIRUNLKSB8fCBkZWZpbmVkKEVDQ19QQVJBTk9JRCkKKworLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiB0aGUgY29tcHV0ZWQgcGFyaXR5IGJ5dGVzOgorICovCitzdGF0aWMgaW50IHNhbml0eV9jaGVjayh1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgbmJsb2NrcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCXVuc2lnbmVkIGxvbmcgc1szXTsKKworCWlmICghY29tcHV0ZV9zeW5kcm9tZXMoZGF0YSwgbmJsb2NrcywgcykpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfYnVnLAorCQkJICAgICJJbnRlcm5hbCBFcnJvcjogc3luZHJvbWUgc2VsZi1jaGVjayBmYWlsZWQiKTsKKwl9CisJVFJBQ0VfRVhJVCAxOworfQorCisjZW5kaWYgLyogZGVmaW5lZChFQ0NfU0FOSVRZX0NIRUNLKSB8fCBkZWZpbmVkKEVDQ19QQVJBTk9JRCkgKi8KKworLyogQ29tcHV0ZSB0aGUgcGFyaXR5IGZvciBhbiBlbnRpcmUgc2VnbWVudCBvZiBkYXRhLgorICovCitpbnQgZnRhcGVfZWNjX3NldF9zZWdtZW50X3Bhcml0eShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKm1zZWcpCit7CisJaW50IGk7CisJX191OCAqcGFyaXR5X2J5dGVzOworCisJcGFyaXR5X2J5dGVzID0gJm1zZWctPmRhdGFbKG1zZWctPmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkVdOworCWZvciAoaSA9IDA7IGkgPCBGVF9TRUNUT1JfU0laRTsgaSArPSBzaXplb2YobG9uZykpIHsKKwkJc2V0X3Bhcml0eSgodW5zaWduZWQgbG9uZyAqKSAmbXNlZy0+ZGF0YVtpXSwgbXNlZy0+YmxvY2tzIC0gMywKKwkJCSAgICh1bnNpZ25lZCBsb25nICopICZwYXJpdHlfYnl0ZXNbaV0sCisJCQkgICBGVF9TRUNUT1JfU0laRSAvIHNpemVvZihsb25nKSk7CisjaWZkZWYgRUNDX1BBUkFOT0lECisJCWlmICghc2FuaXR5X2NoZWNrKCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2ldLAorCQkJCSAgIG1zZWctPmJsb2NrcykpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCQkJCS8qIEVDQ19QQVJBTk9JRCAqLworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBDaGVja3MgYW5kIGNvcnJlY3RzIChpZiBwb3NzaWJsZSkgdGhlIHNlZ21lbnQgTVNFRy4gIFJldHVybnMgb25lIG9mCisgKiBFQ0NfT0ssIEVDQ19DT1JSRUNURUQsIGFuZCBFQ0NfRkFJTEVELgorICovCitpbnQgZnRhcGVfZWNjX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKm1zZWcpCit7CisJaW50IGNvbCwgaSwgcmVzdWx0OworCWludCBuY29ycmVjdGVkID0gMDsKKwlpbnQgbmVyYXN1cmVzID0gMDsJLyogIyBvZiBlcmFzdXJlcyAoQ1JDIGVycm9ycykgKi8KKwlpbnQgZXJhc3VyZV9sb2NbM107CS8qIGVyYXN1cmUgbG9jYXRpb25zICovCisJdW5zaWduZWQgbG9uZyBzc1szXTsKKwlfX3U4IHNbM107CisJTWF0cml4IEFpbnY7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwltc2VnLT5jb3JyZWN0ZWQgPSAwOworCisJLyogZmluZCBmaXJzdCBjb2x1bW4gdGhhdCBoYXMgbm9uLXplcm8gc3luZHJvbWVzOiAqLworCWZvciAoY29sID0gMDsgY29sIDwgRlRfU0VDVE9SX1NJWkU7IGNvbCArPSBzaXplb2YobG9uZykpIHsKKwkJaWYgKCFjb21wdXRlX3N5bmRyb21lcygodW5zaWduZWQgbG9uZyAqKSAmbXNlZy0+ZGF0YVtjb2xdLAorCQkJCSAgICAgICBtc2VnLT5ibG9ja3MsIHNzKSkgeworCQkJLyogc29tZXRoaW5nIGlzIHdyb25nLS0taGF2ZSB0byBmaXggdGhpbmdzICovCisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoY29sID49IEZUX1NFQ1RPUl9TSVpFKSB7CisJCS8qIGFsbCBzeW5kcm9tZXMgYXJlIG9rLCB0aGVyZWZvcmUgbm90aGluZyB0byBjb3JyZWN0ICovCisJCVRSQUNFX0VYSVQgRUNDX09LOworCX0KKwkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIENSQyBlcnJvcnMgaWYgdGhlcmUgd2VyZSBhbnk6ICovCisJaWYgKG1zZWctPnJlYWRfYmFkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtc2VnLT5ibG9ja3M7IGkrKykgeworCQkJaWYgKEJBRF9DSEVDSyhtc2VnLT5yZWFkX2JhZCwgaSkpIHsKKwkJCQlpZiAobmVyYXN1cmVzID49IDMpIHsKKwkJCQkJLyogdGhpcyBpcyB0b28gbXVjaCBmb3IgRUNDICovCisJCQkJCVRSQUNFX0FCT1JUKEVDQ19GQUlMRUQsIGZ0X3RfZXJyLAorCQkJCQkJIkVDQyBmYWlsZWQgKD4zIENSQyBlcnJvcnMpIik7CisJCQkJfQkvKiBpZiAqLworCQkJCWVyYXN1cmVfbG9jW25lcmFzdXJlcysrXSA9IGk7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgMiBDUkMgZXJyb3JzLCBkZXRlcm1pbmUgaW52ZXJzZSBvZiBtYXRyaXgKKwkgKiBvZiBsaW5lYXIgc3lzdGVtIHRvIGJlIHNvbHZlZDoKKwkgKi8KKwlzd2l0Y2ggKG5lcmFzdXJlcykgeworCWNhc2UgMjoKKwkJaWYgKCFnZmludjIoZXJhc3VyZV9sb2NbMF0sIGVyYXN1cmVfbG9jWzFdLCBBaW52KSkgeworCQkJVFJBQ0VfRVhJVCBFQ0NfRkFJTEVEOworCQl9CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKCFnZmludjMoZXJhc3VyZV9sb2NbMF0sIGVyYXN1cmVfbG9jWzFdLAorCQkJICAgIGVyYXN1cmVfbG9jWzJdLCBBaW52KSkgeworCQkJVFJBQ0VfRVhJVCBFQ0NfRkFJTEVEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHRoaXMgaXMgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4uLiAqLworCQlicmVhazsKKwl9CisKKwlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobG9uZyk7ICsraSkgeworCQkJc1swXSA9IHNzWzBdOworCQkJc1sxXSA9IHNzWzFdOworCQkJc1syXSA9IHNzWzJdOworCQkJaWYgKHNbMF0gfCBzWzFdIHwgc1syXSkgeworI2lmZGVmIEJJR19FTkRJQU4KKwkJCQlyZXN1bHQgPSBjb3JyZWN0X2Jsb2NrKAorCQkJCQkmbXNlZy0+ZGF0YVtjb2wgKyBzaXplb2YobG9uZykgLSAxIC0gaV0sCisJCQkJCW1zZWctPmJsb2NrcywKKwkJCQkJbmVyYXN1cmVzLAorCQkJCQllcmFzdXJlX2xvYywKKwkJCQkJQWludiwKKwkJCQkJcywKKwkJCQkJJm1zZWctPmNvcnJlY3RlZCk7CisjZWxzZQorCQkJCXJlc3VsdCA9IGNvcnJlY3RfYmxvY2soJm1zZWctPmRhdGFbY29sICsgaV0sCisJCQkJCQkgICAgICAgbXNlZy0+YmxvY2tzLAorCQkJCQkJICAgICAgIG5lcmFzdXJlcywKKwkJCQkJCSAgICAgICBlcmFzdXJlX2xvYywKKwkJCQkJCSAgICAgICBBaW52LAorCQkJCQkJICAgICAgIHMsCisJCQkJCQkgICAgICAgJm1zZWctPmNvcnJlY3RlZCk7CisjZW5kaWYKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7CisJCQkJfQorCQkJCW5jb3JyZWN0ZWQgKz0gcmVzdWx0OworCQkJfQorCQkJc3NbMF0gPj49IDg7CisJCQlzc1sxXSA+Pj0gODsKKwkJCXNzWzJdID4+PSA4OworCQl9CisKKyNpZmRlZiBFQ0NfU0FOSVRZX0NIRUNLCisJCWlmICghc2FuaXR5X2NoZWNrKCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2NvbF0sCisJCQkJICBtc2VnLT5ibG9ja3MpKSB7CisJCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7CisJCX0KKyNlbmRpZgkJCQkvKiBFQ0NfU0FOSVRZX0NIRUNLICovCisKKwkJLyogZmluZCBuZXh0IGNvbHVtbiB3aXRoIG5vbi16ZXJvIHN5bmRyb21lczogKi8KKwkJd2hpbGUgKChjb2wgKz0gc2l6ZW9mKGxvbmcpKSA8IEZUX1NFQ1RPUl9TSVpFKSB7CisJCQlpZiAoIWNvbXB1dGVfc3luZHJvbWVzKCh1bnNpZ25lZCBsb25nICopCisJCQkJICAgICZtc2VnLT5kYXRhW2NvbF0sIG1zZWctPmJsb2Nrcywgc3MpKSB7CisJCQkJLyogc29tZXRoaW5nIGlzIHdyb25nLS0taGF2ZSB0byBmaXggdGhpbmdzICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlIChjb2wgPCBGVF9TRUNUT1JfU0laRSk7CisJaWYgKG5jb3JyZWN0ZWQgJiYgbmVyYXN1cmVzID09IDApIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiYmxvY2sgY29udGFpbmVkIGVycm9yIG5vdCBjYXVnaHQgYnkgQ1JDIik7CisJfQorCVRSQUNFKChuY29ycmVjdGVkID4gMCkgPyBmdF90X25vaXNlIDogZnRfdF9hbnksICJudW1iZXIgb2YgY29ycmVjdGlvbnM6ICVkIiwgbmNvcnJlY3RlZCk7CisJVFJBQ0VfRVhJVCBuY29ycmVjdGVkID8gRUNDX0NPUlJFQ1RFRCA6IEVDQ19PSzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI5MTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5oCkBAIC0wLDAgKzEsODQgQEAKKyNpZm5kZWYgX0ZUQVBFX0VDQ19IXworI2RlZmluZSBfRlRBUEVfRUNDX0hfCisKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MyBOaW5nIGFuZCBEYXZpZCBNb3NiZXJnZXIuCisgKiAgICAgIE9yaWdpbmFsOgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMgQmFzIExhYXJob3Zlbi4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyIERhdmlkIEwuIEJyb3duLCBKci4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKyAKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoxMSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUKKyAqICAgICAgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24gY29kZSAKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgdGFwZSBzdHJlYW1lciBkZXZpY2UgZHJpdmVyLgorICovCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKworI2RlZmluZSBCQURfQ0xFQVIoZW50cnkpICgoZW50cnkpPTApCisjZGVmaW5lIEJBRF9TRVQoZW50cnksc2VjdG9yKSAoKGVudHJ5KXw9KDE8PChzZWN0b3IpKSkKKyNkZWZpbmUgQkFEX0NIRUNLKGVudHJ5LHNlY3RvcikgKChlbnRyeSkmKDE8PChzZWN0b3IpKSkKKworLyoKKyAqIFJldHVybiB2YWx1ZXMgZm9yIGVjY19jb3JyZWN0X2RhdGE6CisgKi8KK2VudW0geworCUVDQ19PSywJCQkvKiBEYXRhIHdhcyBjb3JyZWN0LiAqLworCUVDQ19DT1JSRUNURUQsCQkvKiBDb3JyZWN0YWJsZSBlcnJvciBpbiBkYXRhLiAqLworCUVDQ19GQUlMRUQsCQkvKiBDb3VsZCBub3QgY29ycmVjdCBkYXRhLiAqLworfTsKKworLyoKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGluIG1lbW9yeSBzZWdtZW50LiAgTUFSS0VEX0JBRCBsaXN0cyB0aGUKKyAqIHNlY3RvcnMgdGhhdCB3ZXJlIG1hcmtlZCBiYWQgZHVyaW5nIGZvcm1hdHRpbmcuICBJZiB0aGUgTi10aCBzZWN0b3IKKyAqIGluIGEgc2VnbWVudCBpcyBtYXJrZWQgYmFkLCBiaXQgMTw8TiB3aWxsIGJlIHNldCBpbiBNQVJLRURfQkFELgorICogVGhlIHNlY3RvcnMgc2hvdWxkIGJlIHJlYWQgaW4gZnJvbSB0aGUgZGlzayBhbmQgcGFja2VkLCBhcyBpZiB0aGUKKyAqIGJhZCBzZWN0b3JzIHdlcmUgbm90IHRoZXJlLCBhbmQgdGhlIHNlZ21lbnQganVzdCBjb250YWluZWQgZmV3ZXIKKyAqIHNlY3RvcnMuICBSRUFEX1NFQ1RPUlMgaXMgYSBiaXRtYXAgb2YgZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlCisgKiByZWFkaW5nIHRoZSBkYXRhLiAgVGhlc2Ugb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHBhY2tlZCBkYXRhLgorICogQkxPQ0tTIGlzIGEgY291bnQgb2YgdGhlIHNlY3RvcnMgbm90IG1hcmtlZCBiYWQuICBUaGlzIGlzIGp1c3QgdG8KKyAqIHByZXZlbnQgaGF2aW5nIHRvIGNvdW50IHRoZSB6ZXJvIGJpdHMgaW4gTUFSS0VEX0JBRCBlYWNoIHRpbWUgdGhpcworICogaXMgbmVlZGVkLiAgREFUQSBpcyB0aGUgYWN0dWFsIHNlY3RvciBwYWNrZWQgZGF0YSBmcm9tIChvciB0bykgdGhlCisgKiB0YXBlLgorICovCisgc3RydWN0IG1lbW9yeV9zZWdtZW50IHsKKwlTZWN0b3JNYXAgbWFya2VkX2JhZDsKKwlTZWN0b3JNYXAgcmVhZF9iYWQ7CisgCWludCBibG9ja3M7CisgCV9fdTggKmRhdGE7CisJU2VjdG9yTWFwIGNvcnJlY3RlZDsKKyB9OworCisvKgorICogZWNjLmMgZGVmaW5lZCBnbG9iYWwgdmFyaWFibGVzOgorICovCisjaWZkZWYgVEVTVAorZXh0ZXJuIGludCBmdGFwZV9lY2NfdHJhY2luZzsKKyNlbmRpZgorCisvKgorICogZWNjLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zOgorICovCitleHRlcm4gaW50IGZ0YXBlX2VjY19jb3JyZWN0X2RhdGEoc3RydWN0IG1lbW9yeV9zZWdtZW50ICpkYXRhKTsKK2V4dGVybiBpbnQgZnRhcGVfZWNjX3NldF9zZWdtZW50X3Bhcml0eShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKmRhdGEpOworCisjZW5kaWYJLyogX0ZUQVBFX0VDQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDRjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yLjQuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNCAxNjowNTozOSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gc3VwcG9ydCBmb3JtYXR0aW5nIG9mIGZsb3BweQorICogICAgICB0YXBlIGNhcnRyaWRnZXMgd2l0aCB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZQorICogICAgICBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oIgorCisjaWYgZGVmaW5lZChURVNUSU5HKQorI2RlZmluZSBGVF9GTVRfU0VHU19QRVJfQlVGIDUwCisjZWxzZQorI2RlZmluZSBGVF9GTVRfU0VHU19QRVJfQlVGIChGVF9CVUZGX1NJWkUvKDQqRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkpCisjZW5kaWYKKworc3RhdGljIHNwaW5sb2NrX3QgZnRhcGVfZm9ybWF0X2xvY2s7CisKKy8qCisgKiAgZmlyc3Qgc2VnbWVudCBvZiB0aGUgbmV3IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHN3aXRjaF9zZWdtZW50OworCisvKgorICogIGF0IG1vc3QgMjU2IHNlZ21lbnRzIGZpdCBpbnRvIG9uZSAzMiBrYiBidWZmZXIuICBFdmVuIFRSLTEgY2FydHJpZGdlcyBoYXZlCisgKiAgbW9yZSB0aGFuIHRoaXMgbWFueSBzZWdtZW50cyBwZXIgdHJhY2ssIHNvIGJldHRlciBiZSBjYXJlZnVsLgorICoKKyAqICBidWZmZXJfc3RydWN0ICpidWZmOiBidWZmZXIgdG8gc3RvcmUgdGhlIGZvcm1hdHRpbmcgY29vcmRpbmF0ZXMgaW4KKyAqICBpbnQgIHN0YXJ0OiBzdGFydGluZyBzZWdtZW50IGZvciB0aGlzIGJ1ZmZlci4KKyAqICBpbnQgICAgc3B0OiBzZWdtZW50cyBwZXIgdHJhY2sKKyAqCisgKiAgTm90ZTogc2VnbWVudCBpZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgaGVyZS4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfZm9ybWF0X2J1ZmZlcihidWZmZXJfc3RydWN0ICpidWZmLCBpbnQgc3RhcnQsIGludCBzcHQsCisJCQkJX191OCBnYXAzKQoreworCWludCB0b19kbyA9IHNwdCAtIHN0YXJ0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHRvX2RvID4gRlRfRk1UX1NFR1NfUEVSX0JVRikgeworCQl0b19kbyA9IEZUX0ZNVF9TRUdTX1BFUl9CVUY7CisJfQorCWJ1ZmYtPnB0ciAgICAgICAgICA9IGJ1ZmYtPmFkZHJlc3M7CisJYnVmZi0+cmVtYWluaW5nICAgID0gdG9fZG8gKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOyAvKiAjIHNlY3RvcnMgKi8KKwlidWZmLT5ieXRlcyAgICAgICAgPSBidWZmLT5yZW1haW5pbmcgKiA0OyAvKiBuZWVkIDQgYnl0ZXMgcGVyIHNlY3RvciAqLworCWJ1ZmYtPmdhcDMgICAgICAgICA9IGdhcDM7CisJYnVmZi0+c2VnbWVudF9pZCAgID0gc3RhcnQ7CisJYnVmZi0+bmV4dF9zZWdtZW50ID0gc3RhcnQgKyB0b19kbzsKKwlpZiAoYnVmZi0+bmV4dF9zZWdtZW50ID49IHNwdCkgeworCQlidWZmLT5uZXh0X3NlZ21lbnQgPSAwOyAvKiAwIG1lYW5zOiBzdG9wIHJ1bm5lciAqLworCX0KKwlidWZmLT5zdGF0dXMgICAgICAgPSB3YWl0aW5nOyAvKiB0ZWxscyB0aGUgaXNyIHRoYXQgaXQgY2FuIHVzZQorCQkJCSAgICAgICAqIHRoaXMgYnVmZmVyCisJCQkJICAgICAgICovCisJVFJBQ0VfRVhJVDsKK30KKworCisvKgorICogIHN0YXJ0IGZvcm1hdHRpbmcgYSBuZXcgdHJhY2suCisgKi8KK2ludCBmdGFwZV9mb3JtYXRfdHJhY2soY29uc3QgdW5zaWduZWQgaW50IHRyYWNrLCBjb25zdCBfX3U4IGdhcDMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlidWZmZXJfc3RydWN0ICp0YWlsLCAqaGVhZDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnBhdXNlLCAmc3RhdHVzKSwpOworCWlmICh0cmFjayAmIDEpIHsKKwkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9FT1QpKSB7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9zZWVrX3RvX2VvdCgpLCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0JPVCkpIHsKKwkJCVRSQUNFX0NBVENIKGZ0YXBlX3NlZWtfdG9fYm90KCksKTsKKwkJfQorCX0KKwlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsgLyogdGhpcyBzZXRzIGZ0X2hlYWQgPSBmdF90YWlsID0gMCAqLworCWZ0YXBlX3NldF9zdGF0ZShmb3JtYXR0aW5nKTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsCisJICAgICAgIkZvcm1hdHRpbmcgdHJhY2sgJWQsIGxvZ2ljYWw6IGZyb20gc2VnbWVudCAlZCB0byAlZCIsCisJICAgICAgdHJhY2ssIHRyYWNrICogZnRfc2VnbWVudHNfcGVyX3RyYWNrLCAKKwkgICAgICAodHJhY2sgKyAxKSAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjayAtIDEpOworCQorCS8qCisJICogIGluaXRpYWxpemUgdGhlIGJ1ZmZlciBzd2l0Y2hpbmcgcHJvdG9jb2wgZm9yIHRoaXMgdHJhY2sKKwkgKi8KKwloZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsgLyogdGFwZSBpc24ndCBydW5uaW5nIHlldCAqLworCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOyAvKiB0YXBlIGlzbid0IHJ1bm5pbmcgeWV0ICovCisJc3dpdGNoX3NlZ21lbnQgPSAwOworCWRvIHsKKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQlzZXR1cF9mb3JtYXRfYnVmZmVyKHRhaWwsIHN3aXRjaF9zZWdtZW50LAorCQkJCSAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssIGdhcDMpOworCQlzd2l0Y2hfc2VnbWVudCA9IHRhaWwtPm5leHRfc2VnbWVudDsKKwl9IHdoaWxlICgoc3dpdGNoX3NlZ21lbnQgIT0gMCkgJiYKKwkJICgodGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpKSAhPSBoZWFkKSk7CisJLyogZ28gKi8KKwloZWFkLT5zdGF0dXMgPSBmb3JtYXR0aW5nOworCVRSQUNFX0NBVENIKGZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh0cmFjayksKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19MT0dJQ0FMX0ZPUldBUkQpLCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZ0YXBlX2Zvcm1hdF9sb2NrLCBmbGFncyk7CisJVFJBQ0VfQ0FUQ0goZmRjX3NldHVwX2Zvcm1hdHRpbmcoaGVhZCksIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmdGFwZV9mb3JtYXRfbG9jaywgZmxhZ3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICByZXR1cm4gc2VnbWVudCBpZCBvZiBzZWdtZW50IGN1cnJlbnRseSBiZWluZyBmb3JtYXR0ZWQgYW5kIGRvIHRoZQorICogICBidWZmZXIgc3dpdGNoaW5nIHN0dWZmLgorICovCitpbnQgZnRhcGVfZm9ybWF0X3N0YXR1cyh1bnNpZ25lZCBpbnQgKnNlZ21lbnRfaWQpCit7CisJYnVmZmVyX3N0cnVjdCAqdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXdoaWxlIChzd2l0Y2hfc2VnbWVudCAhPSAwICYmCisJICAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCkgIT0gdGFpbCkgeworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCS8qICBuZWVkIG1vcmUgYnVmZmVycywgZmlyc3Qgd2FpdCBmb3IgZW1wdHkgYnVmZmVyCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV93YWl0X3NlZ21lbnQoZm9ybWF0dGluZyksKTsKKwkJLyogIGRvbid0IHdvcnJ5IGZvciBnYXAzLiBJZiB3ZSBldmVyIGhpdCB0aGlzIHBpZWNlIG9mIGNvZGUsCisJCSAqICB0aGVuIGFsbCBidWZmZXIgYWxyZWFkeSBoYXZlIHRoZSBjb3JyZWN0IGdhcDMgc2V0IQorCQkgKi8KKwkJc2V0dXBfZm9ybWF0X2J1ZmZlcih0YWlsLCBzd2l0Y2hfc2VnbWVudCwKKwkJCQkgICAgZnRfc2VnbWVudHNfcGVyX3RyYWNrLCB0YWlsLT5nYXAzKTsKKwkJc3dpdGNoX3NlZ21lbnQgPSB0YWlsLT5uZXh0X3NlZ21lbnQ7CisJCWlmIChzd2l0Y2hfc2VnbWVudCAhPSAwKSB7CisJCQl0YWlsID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJCX0KKwl9CisJLyogICAgc2hvdWxkIHJ1bm5lciBzdG9wID8KKwkgKi8KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fCBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlUUkFDRShmdF90X3dhcm4sICJFcnJvciBmb3JtYXR0aW5nIHNlZ21lbnQgJWQiLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zZWdtZW50X2lkKTsKKwkJKHZvaWQpZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJCVRSQUNFX0VYSVQgKGhlYWQtPnN0YXR1cyAhPSBlcnJvcikgPyAtRUFHQUlOIDogLUVJTzsKKwl9CisJLyoKKwkgKiAgZG9uJ3QgY2FyZSBpZiB0aGUgdGltZXIgZXhwaXJlcywgdGhpcyBpcyBqdXN0IGtpbmQgb2YgYQorCSAqICAic2VsZWN0IiBvcGVyYXRpb24gdGhhdCBsZXRzIHRoZSBjYWxsaW5nIHByb2Nlc3Mgc2xlZXAKKwkgKiAgdW50aWwgc29tZXRoaW5nIGhhcyBoYXBwZW5lZAorCSAqLworCWlmIChmZGNfaW50ZXJydXB0X3dhaXQoNSAqIEZUX1NFQ09ORCkgPCAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJFbmQgb2YgdHJhY2sgJWQgYXQgc2VnbWVudCAlZCIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLnRyYWNrLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zZWdtZW50X2lkKTsKKwkJcmVzdWx0ID0gMTsgIC8qIGVuZCBvZiB0cmFjaywgdW5sb2NrIG1vZHVsZSAqLworCX0gZWxzZSB7CisJCXJlc3VsdCA9IDA7CisJfQorCS8qCisJICogIHRoZSBjYWxsaW5nIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgc2VnIGlkIHRvIGRldGVybWluZQorCSAqICB3aGljaCBwYXJ0cyBvZiB0aGUgZG1hIGJ1ZmZlcnMgY2FuIGJlIHNhZmVseSBvdmVyd3JpdHRlbgorCSAqICB3aXRoIG5ldyBkYXRhLgorCSAqLworCSpzZWdtZW50X2lkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKS0+c2VnbWVudF9pZDsKKwkvKgorCSAqICBJbnRlcm5hbGx5IHdlIHN0YXJ0IGNvdW50aW5nIHNlZ21lbnQgaWRzIGZyb20gdGhlIHN0YXJ0IG9mCisJICogIGVhY2ggdHJhY2sgd2hlbiBmb3JtYXR0aW5nLCBidXQgZXh0ZXJuYWxseSB3ZSBrZWVwIHRoZW0KKwkgKiAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0YXBlOgorCSAqLworCSpzZWdtZW50X2lkICs9IGZ0X2xvY2F0aW9uLnRyYWNrICogZnRfc2VnbWVudHNfcGVyX3RyYWNrOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKgorICogIFRoZSBzZWdtZW50IGlkIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdGFwZQorICovCitpbnQgZnRhcGVfdmVyaWZ5X3NlZ21lbnQoY29uc3QgdW5zaWduZWQgaW50IHNlZ21lbnRfaWQsIFNlY3Rvck1hcCAqYnNtKQoreworCWludCByZXN1bHQ7CisJaW50IHZlcmlmeV9kb25lID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJWZXJpZnlpbmcgc2VnbWVudCAlZCIsIHNlZ21lbnRfaWQpOworCisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSB2ZXJpZnlpbmcpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgZnRhcGVfYWJvcnRfb3BlcmF0aW9uIik7CisJCWlmIChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfYWJvcnRfb3BlcmF0aW9uIGZhaWxlZCIpOworCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJfQorCSpic20gPSAweDAwMDAwMDAwOworCWZ0YXBlX3NldF9zdGF0ZSh2ZXJpZnlpbmcpOworCWZvciAoOzspIHsKKwkJYnVmZmVyX3N0cnVjdCAqdGFpbDsKKwkJLyoKKwkJICogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJLyoKKwkJICogIFNlYXJjaCBhbGwgZnVsbCBidWZmZXJzIGZvciB0aGUgZmlyc3QgbWF0Y2hpbmcgdGhlCisJCSAqICB3YW50ZWQgc2VnbWVudC4gIENsZWFyIG90aGVyIGJ1ZmZlcnMgb24gdGhlIGZseS4KKwkJICovCisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQl3aGlsZSAoIXZlcmlmeV9kb25lICYmIHRhaWwtPnN0YXR1cyA9PSBkb25lKSB7CisJCQkvKgorCQkJICogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQorCQkJICovCisJCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCQlpZiAodGFpbC0+c2VnbWVudF9pZCA9PSBzZWdtZW50X2lkKSB7CisJCQkJLyogIElmIG91dCBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLAorCQkJCSAqICByZXR1cm4gaXRzIGNvbnRlbnRzLiAgCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9mbG93LCAiZm91bmQgc2VnbWVudCBpbiBjYWNoZTogJWQiLAorCQkJCSAgICAgIHNlZ21lbnRfaWQpOworCQkJCWlmICgodGFpbC0+c29mdF9lcnJvcl9tYXAgfAorCQkJCSAgICAgdGFpbC0+aGFyZF9lcnJvcl9tYXApICE9IDApIHsKKwkJCQkJVFJBQ0UoZnRfdF9pbmZvLCJic21bJWRdID0gMHglMDhseCIsCisJCQkJCSAgICAgIHNlZ21lbnRfaWQsCisJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkgICAgICAodGFpbC0+c29mdF9lcnJvcl9tYXAgfAorCQkJCQkgICAgICB0YWlsLT5oYXJkX2Vycm9yX21hcCkpOworCQkJCQkqYnNtID0gKHRhaWwtPnNvZnRfZXJyb3JfbWFwIHwKKwkJCQkJCXRhaWwtPmhhcmRfZXJyb3JfbWFwKTsKKwkJCQl9CisJCQkJdmVyaWZ5X2RvbmUgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2Zsb3csInphcHBpbmcgc2VnbWVudCBpbiBjYWNoZTogJWQiLAorCQkJCSAgICAgIHRhaWwtPnNlZ21lbnRfaWQpOworCQkJfQorCQkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKKwkJCXRhaWwgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwkJfQorCQlpZiAoIXZlcmlmeV9kb25lICYmIHRhaWwtPnN0YXR1cyA9PSB2ZXJpZnlpbmcpIHsKKwkJCWlmICh0YWlsLT5zZWdtZW50X2lkID09IHNlZ21lbnRfaWQpIHsKKwkJCQlzd2l0Y2goZnRhcGVfd2FpdF9zZWdtZW50KHZlcmlmeWluZykpIHsKKwkJCQljYXNlIDA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgLUVJTlRSOgorCQkJCQlUUkFDRV9BQk9SVCgtRUlOVFIsIGZ0X3Rfd2FybiwKKwkJCQkJCSAgICAiaW50ZXJydXB0ZWQgYnkgIgorCQkJCQkJICAgICJub24tYmxvY2thYmxlIHNpZ25hbCIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJCQkJZnRhcGVfc2V0X3N0YXRlKHZlcmlmeWluZyk7CisJCQkJCS8qIGJlIHBpY2t5ICovCisJCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3Rfd2FybiwKKwkJCQkJCSAgICAid2FpdF9zZWdtZW50IGZhaWxlZCIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogIFdlJ3JlIHJlYWRpbmcgdGhlIHdyb25nIHNlZ21lbnQsCisJCQkJICogIHN0b3AgcnVubmVyLgorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ2ZXJpZnlpbmcgd3Jvbmcgc2VnbWVudCIpOworCQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQkJCWZ0YXBlX3NldF9zdGF0ZSh2ZXJpZnlpbmcpOworCQkJfQorCQl9CisJCS8qICAgIHNob3VsZCBydW5uZXIgc3RvcCA/CisJCSAqLworCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZykgeworCQkJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisJCQlpZiAoaGVhZC0+c3RhdHVzID09IGVycm9yIHx8CisJCQkgICAgaGVhZC0+c3RhdHVzID09IHZlcmlmeWluZykgeworCQkJCS8qIG5vIGRhdGEgb3Igb3ZlcnJ1biBlcnJvciAqLworCQkJCWhlYWQtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQl9CisJCQlUUkFDRV9DQVRDSChmdGFwZV9kdW1iX3N0b3AoKSwpOworCQl9IGVsc2UgeworCQkJLyogIElmIGp1c3QgcGFzc2VkIGxhc3Qgc2VnbWVudCBvbiB0YXBlOiB3YWl0CisJCQkgKiAgZm9yIEJPVCBvciBFT1QgbWFyay4gU2V0cyBmdF9ydW5uZXJfc3RhdHVzIHRvCisJCQkgKiAgaWRsZSBpZiBhdCBsRU9UIGFuZCBzdWNjZXNzZnVsIAorCQkJICovCisJCQlUUkFDRV9DQVRDSChmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3QoKSwpOworCQl9CisJCWlmICh2ZXJpZnlfZG9uZSkgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJCS8qICAgIE5vdyBhdCBsZWFzdCBvbmUgYnVmZmVyIGlzIGlkbGUhCisJCSAqICAgIFJlc3RhcnQgcnVubmVyICYgdGFwZSBpZiBuZWVkZWQuCisJCSAqLworCQkvKiAgV2UgY291bGQgb3B0aW1pemUgdGhlIGZvbGxvd2luZyBhIGxpdHRsZSBiaXQuIFdlIGtub3cgdGhhdCAKKwkJICogIHRoZSBiYWQgc2VjdG9yIG1hcCBpcyBlbXB0eS4KKwkJICovCisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQlpZiAodGFpbC0+c3RhdHVzID09IHdhaXRpbmcpIHsKKwkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCisJCQlmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChoZWFkLCBzZWdtZW50X2lkLCAtMSk7CisJCQlmdGFwZV9jYWxjX25leHRfY2x1c3RlcihoZWFkKTsKKwkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJCQlyZXN1bHQgPSBmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsCisJCQkJCQkJICBoZWFkLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJCQlzd2l0Y2gocmVzdWx0KSB7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQljYXNlIC1FVElNRToKKwkJCQljYXNlIC1FSU5UUjoKKwkJCQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X2VyciwgIkVycm9yOiAiCisJCQkJCQkgICAgInNlZ21lbnQgJWQgdW5yZWFjaGFibGUiLAorCQkJCQkJICAgIHNlZ21lbnRfaWQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkqYnNtID0gRU1QVFlfU0VHTUVOVDsKKwkJCQkJVFJBQ0VfRVhJVCAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQloZWFkLT5zdGF0dXMgPSB2ZXJpZnlpbmc7CisJCQlmZGNfc2V0dXBfcmVhZF93cml0ZShoZWFkLCBGRENfVkVSSUZZKTsKKwkJfQorCX0KKwkvKiBub3QgcmVhY2hlZCAqLworCVRSQUNFX0VYSVQgLUVJTzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTUxNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX0ZUQVBFX0ZPUk1BVF9ICisjZGVmaW5lIF9GVEFQRV9GT1JNQVRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjEzICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93IGxldmVsIGRlZmluaXRpb25zIGZvciB0aGUKKyAqICAgICAgZm9ybWF0dGluZyBzdXBwb3J0IGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZQorICogICAgICBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KK2V4dGVybiBpbnQgZnRhcGVfZm9ybWF0X3RyYWNrKGNvbnN0IHVuc2lnbmVkIGludCB0cmFjaywgY29uc3QgX191OCBnYXAzKTsKK2V4dGVybiBpbnQgZnRhcGVfZm9ybWF0X3N0YXR1cyh1bnNpZ25lZCBpbnQgKnNlZ21lbnRfaWQpOworZXh0ZXJuIGludCBmdGFwZV92ZXJpZnlfc2VnbWVudChjb25zdCB1bnNpZ25lZCBpbnQgc2VnbWVudF9pZCwgU2VjdG9yTWFwICpic20pOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQyNjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaW50ZXJmYWNlcyB0aGUga2VybmVsCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2lmZGVmIENPTkZJR19aRlRBUEUKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1idWZmZXIuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1wcm9jLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorCisKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgIWRlZmluZWQoQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTCkKK3N0YXRpYyBpbnQgZnRfdHJhY2luZyA9IC0xOworI2VuZGlmCisKKworLyogIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIKKyAqICBvciBieSBrZXJuZWwgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZQorICovCitzdGF0aWMgaW50IF9faW5pdCBmdGFwZV9pbml0KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKyNpZmRlZiBNT0RVTEUKKyNpZm5kZWYgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAorCWlmIChmdF90cmFjaW5nICE9IC0xKSB7CisJCWZ0YXBlX3RyYWNpbmcgPSBmdF90cmFjaW5nOworCX0KKyNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gRlRBUEVfVkVSU0lPTiAiXG4iKTsKKyAgICAgICAgaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgeworCQlwcmludGsoCitLRVJOX0lORk8gIihjKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiAoYmFzQHZpbWVjLm5sKVxuIgorS0VSTl9JTkZPICIoYykgMTk5NS0xOTk2IEthaSBIYXJyZWtpbGRlLVBldGVyc2VuIChraHBAZG9scGhpbmljcy5ubylcbiIKK0tFUk5fSU5GTyAiKGMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSlcbiIKK0tFUk5fSU5GTyAiUUlDLTExNyBkcml2ZXIgZm9yIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5IHRhcGUgZHJpdmVzXG4iKTsKKyAgICAgICAgfQorI2Vsc2UgLyogIU1PRFVMRSAqLworCS8qIHByaW50IGEgc2hvcnQgbm8tbm9uc2Vuc2UgYm9vdCBtZXNzYWdlICovCisJcHJpbnRrKEtFUk5fSU5GTyBGVEFQRV9WRVJTSU9OICJcbiIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCVRSQUNFKGZ0X3RfaW5mbywgImluc3RhbGxpbmcgUUlDLTExNyBmbG9wcHkgdGFwZSBoYXJkd2FyZSBkcml2ZSAuLi4gIik7CisJVFJBQ0UoZnRfdF9pbmZvLCAiZnRhcGVfaW5pdCBAIDB4JXAiLCBmdGFwZV9pbml0KTsKKwkvKiAgQWxsb2NhdGUgdGhlIERNQSBidWZmZXJzLiBUaGV5IGFyZSBkZWFsbG9jYXRlZCBhdCBjbGVhbnVwKCkgdGltZS4KKwkgKi8KKyNpZmRlZiBURVNUSU5HCisjaWZkZWYgTU9EVUxFCisJd2hpbGUgKGZ0YXBlX3NldF9ucl9idWZmZXJzKENPTkZJR19GVF9OUl9CVUZGRVJTKSA8IDApIHsKKwkJZnRhcGVfc2xlZXAoRlRfU0VDT05ELzIwKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkodm9pZClmdGFwZV9zZXRfbnJfYnVmZmVycygwKTsKKwkJCVRSQUNFKGZ0X3RfYnVnLAorCQkJICAgICAgIktpbGxlZCBieSBzaWduYWwgd2hpbGUgYWxsb2NhdGluZyBidWZmZXJzLiIpOworCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCAKKwkJCQkgICAgZnRfdF9idWcsICJGcmVlIHVwIG1lbW9yeSBhbmQgcmV0cnkiKTsKKwkJfQorCX0KKyNlbHNlCisJVFJBQ0VfQ0FUQ0goZnRhcGVfc2V0X25yX2J1ZmZlcnMoQ09ORklHX0ZUX05SX0JVRkZFUlMpLAorCQkgICAgKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCkpOworI2VuZGlmCisjZWxzZQorCVRSQUNFX0NBVENIKGZ0YXBlX3NldF9ucl9idWZmZXJzKENPTkZJR19GVF9OUl9CVUZGRVJTKSwKKwkJICAgICh2b2lkKWZ0YXBlX3NldF9ucl9idWZmZXJzKDApKTsKKyNlbmRpZgorCWZ0X2RyaXZlX3NlbCA9IC0xOworCWZ0X2ZhaWx1cmUgICA9IDE7ICAgICAgICAgLyogaW5oaWJpdCBhbnkgb3BlcmF0aW9uIGJ1dCBvcGVuICovCisJZnRhcGVfdWRlbGF5X2NhbGlicmF0ZSgpOyAvKiBtdXN0IGJlIGJlZm9yZSBmZGNfd2FpdF9jYWxpYnJhdGUgISAqLworCWZkY193YWl0X2NhbGlicmF0ZSgpOworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCisJKHZvaWQpZnRhcGVfcHJvY19pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWkZUQVBFCisJKHZvaWQpemZ0X2luaXQoKTsKKyNlbmRpZgorCVRSQUNFX0VYSVQgMDsKK30KKworbW9kdWxlX3BhcmFtKGZ0X2ZkY19iYXNlLCAgICAgICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2Jhc2UsICAiQmFzZSBhZGRyZXNzIG9mIEZEQyBjb250cm9sbGVyLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY19pcnEsICAgICAgICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2lycSwgICAiSVJRIChpbnRlcnJ1cHQgY2hhbm5lbCkgdG8gdXNlLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY19kbWEsICAgICAgICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2RtYSwgICAiRE1BIGNoYW5uZWwgdG8gdXNlLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY190aHJlc2hvbGQsICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX3RocmVzaG9sZCwgICJUaHJlc2hvbGQgb2YgdGhlIEZEQyBGaWZvLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY19yYXRlX2xpbWl0LCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX3JhdGVfbGltaXQsICJNYXhpbWFsIGRhdGEgcmF0ZSBmb3IgRkRDLiIpOworbW9kdWxlX3BhcmFtKGZ0X3Byb2JlX2ZjMTAsICAgICBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfcHJvYmVfZmMxMCwKKwkgICAgIklmIG5vbi16ZXJvLCBwcm9iZSBmb3IgYSBDb2xvcmFkbyBGQy0xMC9GQy0yMCBjb250cm9sbGVyLiIpOworbW9kdWxlX3BhcmFtKGZ0X21hY2gyLCAgICAgICAgICBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfbWFjaDIsCisJICAgICJJZiBub24temVybywgcHJvYmUgZm9yIGEgTW91bnRhaW4gTUFDSC0yIGNvbnRyb2xsZXIuIik7CisjaWYgZGVmaW5lZChNT0RVTEUpICYmICFkZWZpbmVkKENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwpCittb2R1bGVfcGFyYW0oZnRfdHJhY2luZywgICAgICAgIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZ0X3RyYWNpbmcsCisJICAgICJBbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCwgMCA8PSB0cmFjaW5nIDw9IDgsIGRlZmF1bHQgMy4iKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKAorCSIoYykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4gKGJhc0B2aW1lYy5ubCksICIKKwkiKGMpIDE5OTUtMTk5NiBLYWkgSGFycmVraWxkZS1QZXRlcnNlbiAoa2hwQGRvbHBoaW5pY3Mubm8pLCAiCisJIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorCSJRSUMtMTE3IGRyaXZlciBmb3IgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHkgdGFwZSBkcml2ZXMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmdGFwZV9leGl0KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKQorCWZ0YXBlX3Byb2NfZGVzdHJveSgpOworI2VuZGlmCisJKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImZ0YXBlOiB1bmxvYWRlZC5cbiIpOworCVRSQUNFX0VYSVQ7Cit9CisKK21vZHVsZV9pbml0KGZ0YXBlX2luaXQpOworbW9kdWxlX2V4aXQoZnRhcGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWE3YjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIF9GVEFQRV9JTklUX0gKKyNkZWZpbmUgX0ZUQVBFX0lOSVRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MTYgJAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlcmZhY2UgdG8gCisgKiB0aGUgTGludXgga2VybmVsIGZvciBmbG9wcHkgdGFwZSBkcml2ZXIgZnRhcGUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisKKyNkZWZpbmUgX05FVkVSX0JMT0NLICAgIChzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkKKyNkZWZpbmUgX0RPTlRfQkxPQ0sgICAgIChfTkVWRVJfQkxPQ0sgfCBzaWdtYXNrKFNJR0lOVCkpCisjZGVmaW5lIF9ET19CTE9DSyAgICAgICAoc2lnbWFzayhTSUdQSVBFKSkKKworI2lmbmRlZiBRSUMxMTdfVEFQRV9NQUpPUgorI2RlZmluZSBRSUMxMTdfVEFQRV9NQUpPUiAyNworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTkwMTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMKQEAgLTAsMCArMSw5OTIgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5NiAgICAgIEthaSBIYXJyZWtpbGRlLVBldGVyc2VuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTcgICAgICBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMsdiAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xMSAxNDowMjozNiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGdlbmVyYWwgY29udHJvbCBmdW5jdGlvbnMgZm9yIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisvKiBOT1RFOiBzZWN0b3JzIHN0YXJ0IG51bWJlcmluZyBhdCAxLCBhbGwgb3RoZXJzIGF0IDAgISAqLworZnRfdGltZW91dF90YWJsZSBmdGFwZV90aW1lb3V0OwordW5zaWduZWQgaW50IGZ0YXBlX3RhcGVfbGVuOwordm9sYXRpbGUgcWljMTE3X2NtZF90IGZ0YXBlX2N1cnJlbnRfY29tbWFuZDsKK2NvbnN0IHN0cnVjdCBxaWMxMTdfY29tbWFuZF90YWJsZSBxaWMxMTdfY21kc1tdID0gUUlDMTE3X0NPTU1BTkRTOworaW50IGZ0YXBlX21pZ2h0X2JlX29mZl90cmFjazsKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGRpYWdub3N0aWNfbW9kZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnRhcGVfdWRlbGF5X2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGludCBmdGFwZV91ZGVsYXlfdGltZTsKKwordm9pZCBmdGFwZV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKQoreworCXZvbGF0aWxlIGludCBjb3VudCA9IChmdGFwZV91ZGVsYXlfY291bnQgKiB1c2VjcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFwZV91ZGVsYXlfY291bnQgLSAxKSAvIGZ0YXBlX3VkZWxheV90aW1lOworCXZvbGF0aWxlIGludCBpOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyMDsgKytpKTsKKwl9Cit9CisKK3ZvaWQgZnRhcGVfdWRlbGF5X2NhbGlicmF0ZSh2b2lkKQoreworCWZ0YXBlX2NhbGlicmF0ZSgiZnRhcGVfdWRlbGF5IiwKKwkJCWZ0YXBlX3VkZWxheSwgJmZ0YXBlX3VkZWxheV9jb3VudCwgJmZ0YXBlX3VkZWxheV90aW1lKTsKK30KKworLyogICAgICBEZWxheSAobXNlYykgcm91dGluZS4KKyAqLwordm9pZCBmdGFwZV9zbGVlcCh1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJdGltZSAqPSAxMDAwOyAgIC8qIG1zZWNzIC0+IHVzZWNzICovCisJaWYgKHRpbWUgPCBGVF9VU1BUKSB7CisJCS8qICBUaW1lIHRvbyBzbWFsbCBmb3Igc2NoZWR1bGVyLCBkbyBhIGJ1c3kgd2FpdCAhICovCisJCWZ0YXBlX3VkZWxheSh0aW1lKTsKKwl9IGVsc2UgeworCQlsb25nIHRpbWVvdXQ7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXVuc2lnbmVkIGludCB0aWNrcyA9ICh0aW1lICsgRlRfVVNQVCAtIDEpIC8gRlRfVVNQVDsKKworCQlUUkFDRShmdF90X2FueSwgIiVkIG1zZWMsICVkIHRpY2tzIiwgdGltZS8xMDAwLCB0aWNrcyk7CisJCXRpbWVvdXQgPSB0aWNrczsKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCXN0aSgpOworCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQpKTsKKwkJLyogIE1tbS4gSXNuJ3QgY3VycmVudC0+YmxvY2tlZCA9PSAweGZmZmZmZmZmID8KKwkJICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJhd29rZW4gYnkgbm9uLWJsb2NrZWQgc2lnbmFsIDotKCIpOworCQl9CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKwlUUkFDRV9FWElUOworfQorCisvKiAgc2VuZCBhIGNvbW1hbmQgb3IgcGFyYW1ldGVyIHRvIHRoZSBkcml2ZQorICogIEdlbmVyYXRlcyAjIG9mIHN0ZXAgcHVsc2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBmdF9zZW5kX3RvX2RyaXZlKGludCBhcmcpCit7CisJLyogIEFsd2F5cyB3YWl0IGZvciBhIGNvbW1hbmRfdGltZW91dCBwZXJpb2QgdG8gc2VwYXJhdGUKKwkgKiAgaW5kaXZpZHVhbHMgY29tbWFuZHMgYW5kL29yIHBhcmFtZXRlcnMuCisJICovCisJZnRhcGVfc2xlZXAoMyAqIEZUX01JTExJU0VDT05EKTsKKwkvKiAgS2VlcCBjeWxpbmRlciBuciB3aXRoaW4gcmFuZ2UsIHN0ZXAgdG93YXJkcyBob21lIGlmIHBvc3NpYmxlLgorCSAqLworCWlmIChmdGFwZV9jdXJyZW50X2N5bGluZGVyID49IGFyZykgeworCQlyZXR1cm4gZmRjX3NlZWsoZnRhcGVfY3VycmVudF9jeWxpbmRlciAtIGFyZyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZkY19zZWVrKGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgKyBhcmcpOworCX0KK30KKworLyogZm9yd2FyZCAqLyBpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpOworCitzdGF0aWMgaW50IGZ0X2NoZWNrX2NtZF9yZXN0cmljdGlvbnMocWljMTE3X2NtZF90IGNvbW1hbmQpCit7CisJaW50IHN0YXR1cyA9IC0xOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJVFJBQ0UoZnRfdF9mbG93LCAiJXMiLCBxaWMxMTdfY21kc1tjb21tYW5kXS5uYW1lKTsKKwkvKiBBIG5ldyBtb3Rpb24gY29tbWFuZCBkdXJpbmcgYW4gdW5pbnRlcnJ1cHRpYmxlIChtb3Rpb24pCisJICogIGNvbW1hbmQgcmVxdWlyZXMgYSByZWFkeSBzdGF0dXMgYmVmb3JlIHRoZSBuZXcgY29tbWFuZCBjYW4KKwkgKiAgYmUgaXNzdWVkLiBPdGhlcndpc2UgYSBuZXcgbW90aW9uIGNvbW1hbmQgbmVlZHMgdG8gYmUKKwkgKiAgY2hlY2tlZCBhZ2FpbnN0IHJlcXVpcmVkIHN0YXR1cy4KKwkgKi8KKwlpZiAocWljMTE3X2NtZHNbY29tbWFuZF0uY21kX3R5cGUgPT0gbW90aW9uICYmCisJICAgIHFpYzExN19jbWRzW2Z0YXBlX2N1cnJlbnRfY29tbWFuZF0ubm9uX2ludHIpIHsKKwkJZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoJnN0YXR1cyk7CisJCWlmICgoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgPT0gMCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCSAgICAgICJtb3Rpb24gY21kICglZCkgZHVyaW5nIG5vbi1pbnRyIGNtZCAoJWQpIiwKKwkJCSAgICAgIGNvbW1hbmQsIGZ0YXBlX2N1cnJlbnRfY29tbWFuZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAid2FpdGluZyB1bnRpbCBkcml2ZSBnZXRzIHJlYWR5Iik7CisJCQlmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQuc2VlaywKKwkJCQkJICZzdGF0dXMpOworCQl9CisJfQorCWlmIChxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrICE9IDApIHsKKwkJX191OCBkaWZmZXJlbmNlOworCQkvKiAgU29tZSBjb21tYW5kcyBkbyByZXF1aXJlIGEgY2VydGFpbiBzdGF0dXM6CisJCSAqLworCQlpZiAoc3RhdHVzID09IC0xKSB7CS8qIG5vdCB5ZXQgc2V0ICovCisJCQlmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cygmc3RhdHVzKTsKKwkJfQorCQlkaWZmZXJlbmNlID0gKChzdGF0dXMgXiBxaWMxMTdfY21kc1tjb21tYW5kXS5zdGF0ZSkgJgorCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0ubWFzayk7CisJCS8qICBXYWl0IHVudGlsIHRoZSBkcml2ZSBnZXRzCisJCSAqICByZWFkeS4gVGhpcyBtYXkgbGFzdCBmb3JldmVyIGlmCisJCSAqICB0aGUgZHJpdmUgbmV2ZXIgZ2V0cyByZWFkeS4uLiAKKwkJICovCisJCXdoaWxlICgoZGlmZmVyZW5jZSAmIFFJQ19TVEFUVVNfUkVBRFkpICE9IDApIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjb21tYW5kICVkIGlzc3VlZCB3aGlsZSBub3QgcmVhZHkiLAorCQkJICAgICAgY29tbWFuZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAid2FpdGluZyB1bnRpbCBkcml2ZSBnZXRzIHJlYWR5Iik7CisJCQlpZiAoZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnNlZWssCisJCQkJCSAgICAgJnN0YXR1cykgPT0gLUVJTlRSKSB7CisJCQkJLyogIEJhaWwgb3V0IG9uIHNpZ25hbCAhCisJCQkJICovCisJCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCBmdF90X3dhcm4sCisJCQkJICAgICAgImludGVycnVwdGVkIGJ5IG5vbi1ibG9ja2FibGUgc2lnbmFsIik7CisJCQl9CisJCQlkaWZmZXJlbmNlID0gKChzdGF0dXMgXiBxaWMxMTdfY21kc1tjb21tYW5kXS5zdGF0ZSkgJgorCQkJCSAgICAgIHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2spOworCQl9CisJCXdoaWxlICgoZGlmZmVyZW5jZSAmIFFJQ19TVEFUVVNfRVJST1IpICE9IDApIHsKKwkJCWludCBlcnI7CisJCQlxaWMxMTdfY21kX3QgY21kOworCisJCQlUUkFDRShmdF90X25vaXNlLAorCQkJICAgICAgImNvbW1hbmQgJWQgaXNzdWVkIHdoaWxlIGVycm9yIHBlbmRpbmciLAorCQkJICAgICAgY29tbWFuZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAiY2xlYXJpbmcgZXJyb3Igc3RhdHVzIik7CisJCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVyciwgJmNtZCwgMSk7CisJCQlmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cygmc3RhdHVzKTsKKwkJCWRpZmZlcmVuY2UgPSAoKHN0YXR1cyBeIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKSAmCisJCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0ubWFzayk7CisJCQlpZiAoKGRpZmZlcmVuY2UgJiBRSUNfU1RBVFVTX0VSUk9SKSAhPSAwKSB7CisJCQkJLyogIEJhaWwgb3V0IG9uIGZhdGFsIHNpZ25hbCAhCisJCQkJICovCisJCQkJRlRfU0lHTkFMX0VYSVQoX05FVkVSX0JMT0NLKTsKKwkJCX0KKwkJfQorCQlpZiAoZGlmZmVyZW5jZSkgeworCQkJLyogIEFueSByZW1haW5pbmcgZGlmZmVyZW5jZSBjYW4ndCBiZSBzb2x2ZWQKKwkJCSAqICBoZXJlLiAgCisJCQkgKi8KKwkJCWlmIChkaWZmZXJlbmNlICYgKFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQgfAorCQkJCQkgIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSB8CisJCQkJCSAgUUlDX1NUQVRVU19SRUZFUkVOQ0VEKSkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiRmF0YWw6IHRhcGUgcmVtb3ZlZCBvciByZWluc2VydGVkICEiKTsKKwkJCQlmdF9mYWlsdXJlID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJ3cm9uZyBzdGF0ZTogMHglMDJ4IHNob3VsZCBiZTogMHglMDJ4IiwKKwkJCQkgICAgICBzdGF0dXMgJiBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrLAorCQkJCSAgICAgIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKTsKKwkJCX0KKwkJCVRSQUNFX0VYSVQgLUVJTzsKKwkJfQorCQlpZiAofnN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkgJiBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrKSB7CisJCQlUUkFDRV9BQk9SVCgtRUJVU1ksIGZ0X3RfZXJyLCAiQmFkOiBzdGlsbCBidXN5ISIpOworCQl9CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBJc3N1ZSBhIHRhcGUgY29tbWFuZDoKKyAqLworaW50IGZ0YXBlX2NvbW1hbmQocWljMTE3X2NtZF90IGNvbW1hbmQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RhdGljIGludCBsZXZlbDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKCh1bnNpZ25lZCBpbnQpY29tbWFuZCA+IE5SX0lURU1TKHFpYzExN19jbWRzKSkgeworCQkvKiAgVGhpcyBpcyBhIGJ1ZyB3ZSdsbCB3YW50IHRvIGtub3cgYWJvdXQgdG9vLgorCQkgKi8KKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsICJidWcgLSBiYWQgY29tbWFuZDogJWQiLCBjb21tYW5kKTsKKwl9CisJaWYgKCsrbGV2ZWwgPiA1KSB7IC8qICBUaGlzIGlzIGEgYnVnIHdlJ2xsIHdhbnQgdG8ga25vdyBhYm91dC4gKi8KKwkJLS1sZXZlbDsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsICJidWcgLSByZWN1cnNpb24gZm9yIGNvbW1hbmQ6ICVkIiwKKwkJCSAgICBjb21tYW5kKTsKKwl9CisJLyogIGRpc2FibGUgbG9nZ2luZyBhbmQgcmVzdHJpY3Rpb24gY2hlY2sgZm9yIHNvbWUgY29tbWFuZHMsCisJICogIGNoZWNrIGFsbCBvdGhlciBjb21tYW5kcyB0aGF0IGhhdmUgYSBwcmVzY3JpYmVkIHN0YXJ0aW5nCisJICogIHN0YXR1cy4KKwkgKi8KKwlpZiAoZGlhZ25vc3RpY19tb2RlKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImRpYWdub3N0aWMgY29tbWFuZCAlZCIsIGNvbW1hbmQpOworCX0gZWxzZSBpZiAoY29tbWFuZCA9PSBRSUNfUkVQT1JUX0RSSVZFX1NUQVRVUyB8fAorCQkgICBjb21tYW5kID09IFFJQ19SRVBPUlRfTkVYVF9CSVQpIHsKKwkJVFJBQ0UoZnRfdF9hbnksICIlcyIsIHFpYzExN19jbWRzW2NvbW1hbmRdLm5hbWUpOworCX0gZWxzZSB7CisJCVRSQUNFX0NBVENIKGZ0X2NoZWNrX2NtZF9yZXN0cmljdGlvbnMoY29tbWFuZCksIC0tbGV2ZWwpOworCX0KKwkvKiAgTm93IGFsbCBjb25kaXRpb25zIGFyZSBtZXQgb3IgcmVzdWx0IHdhcyA8IDAuCisJICovCisJcmVzdWx0ID0gZnRfc2VuZF90b19kcml2ZSgodW5zaWduZWQgaW50KWNvbW1hbmQpOworCWlmIChxaWMxMTdfY21kc1tjb21tYW5kXS5jbWRfdHlwZSA9PSBtb3Rpb24gJiYKKwkgICAgY29tbWFuZCAhPSBRSUNfTE9HSUNBTF9GT1JXQVJEICYmIGNvbW1hbmQgIT0gUUlDX1NUT1BfVEFQRSkgeworCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisJfQorCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IGNvbW1hbmQ7CisJLS1sZXZlbDsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBTZW5kIGEgdGFwZSBjb21tYW5kIHBhcmFtZXRlcjoKKyAqICAgICAgR2VuZXJhdGVzIGNvbW1hbmQgIyBvZiBzdGVwIHB1bHNlcy4KKyAqICAgICAgU2tpcHMgdGFwZS1zdGF0dXMgY2FsbCAhCisgKi8KK2ludCBmdGFwZV9wYXJhbWV0ZXIodW5zaWduZWQgaW50IHBhcmFtZXRlcikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIHdpdGggcGFyYW1ldGVyID0gJWQiLCBwYXJhbWV0ZXIpOworCVRSQUNFX0VYSVQgZnRfc2VuZF90b19kcml2ZShwYXJhbWV0ZXIgKyAyKTsKK30KKworLyogICAgICBXYWl0IGZvciB0aGUgZHJpdmUgdG8gZ2V0IHJlYWR5LgorICogICAgICB0aW1lb3V0IHRpbWUgaW4gbWlsbGktc2Vjb25kcworICogICAgICBSZXR1cm5lZCBzdGF0dXMgaXMgdmFsaWQgaWYgcmVzdWx0ICE9IC1FSU8KKyAqCisgKiAgICAgIFNob3VsZCB3ZSBhbGxvdyB0byBiZSBraWxsZWQgYnkgU0lHSU5UPyAgKF5DKQorICogICAgICBXb3VsZCBiZSBuaWNlIGF0IGxlYXN0IGZvciBsYXJnZSB0aW1lb3V0cy4KKyAqLworaW50IGZ0YXBlX3JlYWR5X3dhaXQodW5zaWduZWQgaW50IHRpbWVvdXQsIGludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgdDA7CisJdW5zaWduZWQgaW50IHBvbGxfZGVsYXk7CisJaW50IHNpZ25hbF9yZXRyaWVzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgdGhlIGZvbGxvd2luZyAqKiBSRUFMTFkgKiogcmVkdWNlcyB0aGUgc3lzdGVtIGxvYWQgd2hlbgorCSAqICBlLmcuIG9uZSBzaW1wbHkgcmV3aW5kcyBvciByZXRlbnNpb25zLiBUaGUgdGFwZSBpcyBzbG93IAorCSAqICBhbnl3YXkuIEl0IGlzIHJlYWxseSBub3QgbmVjZXNzYXJ5IHRvIGRldGVjdCBlcnJvciAKKwkgKiAgY29uZGl0aW9ucyB3aXRoIDEvMTAgc2Vjb25kcyBncmFudWxhcml0eQorCSAqCisJICogIE9uIG15IEFNRCAxMzNNSFogNDg2OiAxMDAgbXM6IDIzJSBzeXN0ZW0gbG9hZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgMSAgc2VjOiAgNSUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIDUgIHNlYzogIDAuNiUsIHllYWgKKwkgKi8KKwlpZiAodGltZW91dCA8PSBGVF9TRUNPTkQpIHsKKwkJcG9sbF9kZWxheSA9IDEwMCAqIEZUX01JTExJU0VDT05EOworCQlzaWduYWxfcmV0cmllcyA9IDIwOyAvKiB0d28gc2Vjb25kcyAqLworCX0gZWxzZSBpZiAodGltZW91dCA8IDIwICogRlRfU0VDT05EKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNldHRpbmcgcG9sbCBkZWxheSB0byAxIHNlY29uZCIpOworCQlwb2xsX2RlbGF5ID0gRlRfU0VDT05EOworCQlzaWduYWxfcmV0cmllcyA9IDI7IC8qIHR3byBzZWNvbmRzICovCisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic2V0dGluZyBwb2xsIGRlbGF5IHRvIDUgc2Vjb25kcyIpOworCQlwb2xsX2RlbGF5ID0gNSAqIEZUX1NFQ09ORDsKKwkJc2lnbmFsX3JldHJpZXMgPSAxOyAvKiBmaXZlIHNlY29uZHMgKi8KKwl9CisJZm9yICg7OykgeworCQl0MCA9IGppZmZpZXM7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKHN0YXR1cyksKTsKKwkJaWYgKCpzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJaWYgKCFzaWduYWxfcmV0cmllcy0tKSB7CisJCQlGVF9TSUdOQUxfRVhJVChfTkVWRVJfQkxPQ0spOworCQl9CisJCWlmICgoaW50KXRpbWVvdXQgPj0gMCkgeworCQkJLyogdGhpcyB3aWxsIGZhaWwgd2hlbiBqaWZmaWVzIHdyYXBzIGFyb3VuZCBhYm91dAorCQkJICogb25jZSBldmVyeSB5ZWFyIDotKQorCQkJICovCisJCQl0aW1lb3V0IC09ICgoamlmZmllcyAtIHQwKSAqIEZUX1NFQ09ORCkgLyBIWjsKKwkJCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJCQlUUkFDRV9BQk9SVCgtRVRJTUUsIGZ0X3RfZXJyLCAidGltZW91dCIpOworCQkJfQorCQkJZnRhcGVfc2xlZXAocG9sbF9kZWxheSk7CisJCQl0aW1lb3V0IC09IHBvbGxfZGVsYXk7CisJCX0gZWxzZSB7CisJCQlmdGFwZV9zbGVlcChwb2xsX2RlbGF5KTsKKwkJfQorCX0KKwlUUkFDRV9FWElUIC1FVElNRTsKK30KKworLyogICAgICBJc3N1ZSBjb21tYW5kIGFuZCB3YWl0IHVwIHRvIHRpbWVvdXQgbWlsbGkgc2Vjb25kcyBmb3IgZHJpdmUgcmVhZHkKKyAqLworaW50IGZ0YXBlX2NvbW1hbmRfd2FpdChxaWMxMTdfY21kX3QgY29tbWFuZCwgdW5zaWduZWQgaW50IHRpbWVvdXQsIGludCAqc3RhdHVzKQoreworCWludCByZXN1bHQ7CisKKwkvKiBEcml2ZSBzaG91bGQgYmUgcmVhZHksIGlzc3VlIGNvbW1hbmQKKwkgKi8KKwlyZXN1bHQgPSBmdGFwZV9jb21tYW5kKGNvbW1hbmQpOworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KHRpbWVvdXQsIHN0YXR1cyk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfcGFyYW1ldGVyX3dhaXQodW5zaWduZWQgaW50IHBhcm0sIHVuc2lnbmVkIGludCB0aW1lb3V0LCBpbnQgKnN0YXR1cykKK3sKKwlpbnQgcmVzdWx0OworCisJLyogRHJpdmUgc2hvdWxkIGJlIHJlYWR5LCBpc3N1ZSBjb21tYW5kCisJICovCisJcmVzdWx0ID0gZnRhcGVfcGFyYW1ldGVyKHBhcm0pOworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KHRpbWVvdXQsIHN0YXR1cyk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgUmVwb3J0IG9wZXJhdGlvbnMKKyAqLworCisvKiBRdWVyeSB0aGUgZHJpdmUgYWJvdXQgaXRzIHN0YXR1cy4gIFRoZSBjb21tYW5kIGlzIHNlbnQgYW5kCisgICByZXN1bHRfbGVuZ3RoIGJpdHMgb2Ygc3RhdHVzIGFyZSByZXR1cm5lZCAoMiBleHRyYSBiaXRzIGFyZSByZWFkCisgICBmb3Igc3RhcnQgYW5kIHN0b3ApLiAqLworCitpbnQgZnRhcGVfcmVwb3J0X29wZXJhdGlvbihpbnQgKnN0YXR1cywKKwkJCSAgIHFpYzExN19jbWRfdCBjb21tYW5kLAorCQkJICAgaW50IHJlc3VsdF9sZW5ndGgpCit7CisJaW50IGksIHN0MzsKKwl1bnNpZ25lZCBpbnQgdDA7CisJdW5zaWduZWQgaW50IGR0OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKGNvbW1hbmQpLCk7CisJdDAgPSBmdGFwZV90aW1lc3RhbXAoKTsKKwlpID0gMDsKKwlkbyB7CisJCSsraTsKKwkJZnRhcGVfc2xlZXAoMyAqIEZUX01JTExJU0VDT05EKTsJLyogc2VlIHJlbWFyayBiZWxvdyAqLworCQlUUkFDRV9DQVRDSChmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKCZzdDMpLCk7CisJCWR0ID0gZnRhcGVfdGltZWRpZmYodDAsIGZ0YXBlX3RpbWVzdGFtcCgpKTsKKwkJLyogIEFjayBzaG91bGQgYmUgYXNzZXJ0ZWQgd2l0aGluIFR0aW1vdXQgKyBUYWNrID0gNiBtc2VjLgorCQkgKiAgTG9va3MgbGlrZSBzb21lIGRyaXZlcyBmYWlsIHRvIGRvIHRoaXMgc28gZXh0ZW5kIHRoaXMKKwkJICogIHBlcmlvZCB0byAzMDAgbXNlYy4KKwkJICovCisJfSB3aGlsZSAoIShzdDMgJiBTVDNfVFJBQ0tfMCkgJiYgZHQgPCAzMDAwMDApOworCWlmICghKHN0MyAmIFNUM19UUkFDS18wKSkgeworCQlUUkFDRShmdF90X2VyciwKKwkJICAgICAgIk5vIGFja25vd2xlZGdlIGFmdGVyICV1IG1zZWMuICglaSBpdGVyKSIsIGR0IC8gMTAwMCwgaSk7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAidGltZW91dCBvbiBBY2tub3dsZWRnZSIpOworCX0KKwkvKiAgZHQgbWF5IGJlIGxhcmdlciB0aGFuIGV4cGVjdGVkIGJlY2F1c2Ugb2Ygb3RoZXIgdGFza3MKKwkgKiAgc2NoZWR1bGVkIHdoaWxlIHdlIHdlcmUgc2xlZXBpbmcuCisJICovCisJaWYgKGkgPiAxICYmIGR0ID4gNjAwMCkgeworCQlUUkFDRShmdF90X2VyciwgIkFja25vd2xlZGdlIGFmdGVyICV1IG1zZWMuICglaSBpdGVyKSIsCisJCSAgICAgIGR0IC8gMTAwMCwgaSk7CisJfQorCSpzdGF0dXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCByZXN1bHRfbGVuZ3RoICsgMTsgaSsrKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1JFUE9SVF9ORVhUX0JJVCksKTsKKwkJVFJBQ0VfQ0FUQ0goZmRjX3NlbnNlX2RyaXZlX3N0YXR1cygmc3QzKSwpOworCQlpZiAoaSA8IHJlc3VsdF9sZW5ndGgpIHsKKwkJCSpzdGF0dXMgfD0gKChzdDMgJiBTVDNfVFJBQ0tfMCkgPyAxIDogMCkgPDwgaTsKKwkJfSBlbHNlIGlmICgoc3QzICYgU1QzX1RSQUNLXzApID09IDApIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAibWlzc2luZyBzdGF0dXMgc3RvcCBiaXQiKTsKKwkJfQorCX0KKwkvKiB0aGlzIGNvbW1hbmQgd2lsbCBwdXQgdHJhY2sgemVybyBhbmQgaW5kZXggYmFjayBpbnRvIG5vcm1hbCBzdGF0ZSAqLworCSh2b2lkKWZ0YXBlX2NvbW1hbmQoUUlDX1JFUE9SVF9ORVhUX0JJVCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiBSZXBvcnQgdGhlIGN1cnJlbnQgZHJpdmUgc3RhdHVzLiAqLworCitpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgY291bnQgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlkbyB7CisJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oc3RhdHVzLAorCQkJCQkJUUlDX1JFUE9SVF9EUklWRV9TVEFUVVMsIDgpOworCX0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgKytjb3VudCA8PSAzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAicmVwb3J0X29wZXJhdGlvbiBmYWlsZWQgYWZ0ZXIgJWQgdHJpYWxzIiwgY291bnQpOworCX0KKwlpZiAoKCpzdGF0dXMgJiAweGZmKSA9PSAweGZmKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJpbXBvc3NpYmxlIGRyaXZlIHN0YXR1cyAweGZmIik7CisJfQorCWlmICgqc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgeworCQlmdGFwZV9jdXJyZW50X2NvbW1hbmQgPSBRSUNfTk9fQ09NTUFORDsgLyogY29tcGxldGVkICovCisJfQorCWZ0X2xhc3Rfc3RhdHVzLnN0YXR1cy5kcml2ZV9zdGF0dXMgPSAoX191OCkoKnN0YXR1cyAmIDB4ZmYpOworCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKHN0YXR1cyksKTsKKwlpZiAoKnN0YXR1cyAmIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSB8fAorCSAgICAhKCpzdGF0dXMgJiBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UKSkgeworCQlmdF9mYWlsdXJlID0gMTsJLyogd2lsbCBpbmhpYml0IGZ1cnRoZXIgb3BlcmF0aW9ucyAqLworCQlUUkFDRV9FWElUIC1FSU87CisJfQorCWlmICgqc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSAmJiAqc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQkvKiAgTGV0IGNhbGxlciBoYW5kbGUgYWxsIGVycm9ycyAqLworCQlUUkFDRV9BQk9SVCgxLCBmdF90X3dhcm4sICJ3YXJuaW5nOiBlcnJvciBzdGF0dXMgc2V0ISIpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9yZXBvcnRfZXJyb3IodW5zaWduZWQgaW50ICplcnJvciwKKwkJICAgICAgIHFpYzExN19jbWRfdCAqY29tbWFuZCwgaW50IHJlcG9ydCkKK3sKKwlzdGF0aWMgY29uc3QgZnRhcGVfZXJyb3IgZnRhcGVfZXJyb3JzW10gPSBRSUMxMTdfRVJST1JTOworCWludCBjb2RlOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZjb2RlLCBRSUNfUkVQT1JUX0VSUk9SX0NPREUsIDE2KSwpOworCSplcnJvciAgID0gKHVuc2lnbmVkIGludCkoY29kZSAmIDB4ZmYpOworCSpjb21tYW5kID0gKHFpYzExN19jbWRfdCkoKGNvZGU+PjgpJjB4ZmYpOworCS8qICByZW1lbWJlciBoYXJkd2FyZSBzdGF0dXMsIG1heWJlIHVzZWZ1bCBmb3Igc3RhdHVzIGlvY3RscworCSAqLworCWZ0X2xhc3RfZXJyb3IuZXJyb3IuY29tbWFuZCA9IChfX3U4KSpjb21tYW5kOworCWZ0X2xhc3RfZXJyb3IuZXJyb3IuZXJyb3IgICA9IChfX3U4KSplcnJvcjsKKwlpZiAoIXJlcG9ydCkgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmICgqZXJyb3IgPT0gMCkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X2luZm8sICJObyBlcnJvciIpOworCX0KKwlUUkFDRShmdF90X2luZm8sICJlcnJvcmNvZGU6ICVkIiwgKmVycm9yKTsKKwlpZiAoKmVycm9yIDwgTlJfSVRFTVMoZnRhcGVfZXJyb3JzKSkgeworCQlUUkFDRShmdF90X25vaXNlLCAiJXNGYXRhbCBFUlJPUjoiLAorCQkgICAgICAoZnRhcGVfZXJyb3JzWyplcnJvcl0uZmF0YWwgPyAiIiA6ICJOb24tIikpOworCQlUUkFDRShmdF90X25vaXNlLCAiJXMgLi4uIiwgZnRhcGVfZXJyb3JzWyplcnJvcl0ubWVzc2FnZSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlVua25vd24gRVJST1IgISIpOworCX0KKwlpZiAoKHVuc2lnbmVkIGludCkqY29tbWFuZCA8IE5SX0lURU1TKHFpYzExN19jbWRzKSAmJgorCSAgICBxaWMxMTdfY21kc1sqY29tbWFuZF0ubmFtZSAhPSBOVUxMKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIuLi4gY2F1c2VkIGJ5IGNvbW1hbmQgXCclc1wnIiwKKwkJICAgICAgcWljMTE3X2NtZHNbKmNvbW1hbmRdLm5hbWUpOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIuLi4gY2F1c2VkIGJ5IHVua25vd24gY29tbWFuZCAlZCIsCisJCSAgICAgICpjb21tYW5kKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfcmVwb3J0X2NvbmZpZ3VyYXRpb24ocWljX21vZGVsICptb2RlbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCisJCQkgICAgICAgaW50ICpxaWNfc3RkLAorCQkJICAgICAgIGludCAqdGFwZV9sZW4pCit7CisJaW50IHJlc3VsdDsKKwlpbnQgY29uZmlnOworCWludCBzdGF0dXM7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxaWNfcmF0ZXNbIDRdID0geyAyNTAsIDIwMDAsIDUwMCwgMTAwMCB9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZjb25maWcsCisJCQkJCVFJQ19SRVBPUlRfRFJJVkVfQ09ORklHVVJBVElPTiwgOCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLmRyaXZlX2NvbmZpZyA9IChfX3U4KTB4MDA7CisJCSptb2RlbCA9IHByZWhpc3RvcmljOworCQkqcmF0ZSA9IDUwMDsKKwkJKnFpY19zdGQgPSBRSUNfVEFQRV9RSUM0MDsKKwkJKnRhcGVfbGVuID0gMjA1OworCQlUUkFDRV9FWElUIDA7CisJfSBlbHNlIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLmRyaXZlX2NvbmZpZyA9IChfX3U4KShjb25maWcgJiAweGZmKTsKKwl9CisJKnJhdGUgPSBxaWNfcmF0ZXNbKGNvbmZpZyAmIFFJQ19DT05GSUdfUkFURV9NQVNLKSA+PiBRSUNfQ09ORklHX1JBVEVfU0hJRlRdOworCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJnN0YXR1cywgUUlDX1JFUE9SVF9UQVBFX1NUQVRVUywgOCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLnRhcGVfc3RhdHVzID0gKF9fdTgpMHgwMDsKKwkJLyogcHJlLSBRSUMxMTcgcmV2IEMgc3BlYy4gZHJpdmUsIFFJQ19DT05GSUdfODAgYml0IGlzIHZhbGlkLgorCQkgKi8KKwkJKnFpY19zdGQgPSAoY29uZmlnICYgUUlDX0NPTkZJR184MCkgPworCQkJUUlDX1RBUEVfUUlDODAgOiBRSUNfVEFQRV9RSUM0MDsKKwkJLyogPz8gaG93J3MgYWJvdXQgNDI1ZnQgdGFwZXM/ICovCisJCSp0YXBlX2xlbiA9IChjb25maWcgJiBRSUNfQ09ORklHX0xPTkcpID8gMzA3IDogMDsKKwkJKm1vZGVsID0gcHJlX3FpYzExN2M7CisJCXJlc3VsdCA9IDA7CisJfSBlbHNlIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLnRhcGVfc3RhdHVzID0gKF9fdTgpKHN0YXR1cyAmIDB4ZmYpOworCQkqbW9kZWwgPSBwb3N0X3FpYzExN2I7CisJCVRSQUNFKGZ0X3RfYW55LCAicmVwb3J0IHRhcGUgc3RhdHVzIHJlc3VsdCA9ICUwMngiLCBzdGF0dXMpOworCQkvKiBwb3N0LSBRSUMxMTcgcmV2IEMgc3BlYy4gZHJpdmUsIFFJQ19DT05GSUdfODAgYml0IGlzCisJCSAqIGludmFsaWQuIAorCQkgKi8KKwkJc3dpdGNoIChzdGF0dXMgJiBRSUNfVEFQRV9TVERfTUFTSykgeworCQljYXNlIFFJQ19UQVBFX1FJQzQwOgorCQljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6CisJCWNhc2UgUUlDX1RBUEVfUUlDMzAxMDoKKwkJCSpxaWNfc3RkID0gc3RhdHVzICYgUUlDX1RBUEVfU1REX01BU0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpxaWNfc3RkID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKHN0YXR1cyAmIFFJQ19UQVBFX0xFTl9NQVNLKSB7CisJCWNhc2UgUUlDX1RBUEVfMjA1RlQ6CisJCQkvKiAyMDUgb3IgNDI1KyBmdCA1NTAgT2UgdGFwZSAqLworCQkJKnRhcGVfbGVuID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFFJQ19UQVBFXzMwN0ZUOgorCQkJLyogMzA3LjUgZnQgNTUwIE9lIEV4dGVuZGVkIExlbmd0aCAoWEwpIHRhcGUgKi8KKwkJCSp0YXBlX2xlbiA9IDMwNzsKKwkJCWJyZWFrOworCQljYXNlIFFJQ19UQVBFX1ZBUklBQkxFOgorCQkJLyogVmFyaWFibGUgbGVuZ3RoIDU1MCBPZSB0YXBlICovCisJCQkqdGFwZV9sZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUUlDX1RBUEVfMTEwMEZUOgorCQkJLyogMTEwMCBmdCA1NTAgT2UgdGFwZSAqLworCQkJKnRhcGVfbGVuID0gMTEwMDsKKwkJCWJyZWFrOworCQljYXNlIFFJQ19UQVBFX0ZMRVg6CisJCQkvKiBWYXJpYWJsZSBsZW5ndGggOTAwIE9lIHRhcGUgKi8KKwkJCSp0YXBlX2xlbiA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSp0YXBlX2xlbiA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCpxaWNfc3RkID09IC0xIHx8ICp0YXBlX2xlbiA9PSAtMSkgeworCQkJVFJBQ0UoZnRfdF9hbnksCisJCQkgICAgICAicG9zdCBxaWMtMTE3YiBzcGVjIGRyaXZlIHdpdGggdW5rbm93biB0YXBlIik7CisJCX0KKwkJcmVzdWx0ID0gKnRhcGVfbGVuID09IC0xID8gLUVJTyA6IDA7CisJCWlmIChzdGF0dXMgJiBRSUNfVEFQRV9XSURFKSB7CisJCQlzd2l0Y2ggKCpxaWNfc3RkKSB7CisJCQljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQkJCVRSQUNFKGZ0X3RfaW5mbywgIlRSLTEgdGFwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQkJCVRSQUNFKGZ0X3RfaW5mbywgIlRSLTIgdGFwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQkJCVRSQUNFKGZ0X3RfaW5mbywgIlRSLTMgdGFwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJICAgICAgIlVua25vd24gVHJhdmFuIHRhcGUgdHlwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCVRSQUNFX0VYSVQgKHJlc3VsdCA8IDApID8gLUVJTyA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfcmVwb3J0X3JvbV92ZXJzaW9uKGludCAqdmVyc2lvbikKK3sKKworCWlmIChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKHZlcnNpb24sIFFJQ19SRVBPUlRfUk9NX1ZFUlNJT04sIDgpIDwgMCkgeworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3ZvaWQgZnRhcGVfcmVwb3J0X3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgKmlkKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qIFdlJ2xsIHRyeSB0byBnZXQgYSB2ZW5kb3IgaWQgZnJvbSB0aGUgZHJpdmUuICBGaXJzdAorCSAqIGFjY29yZGluZyB0byB0aGUgUUlDLTExNyBzcGVjLCBhIDE2LWJpdCBpZCBpcyByZXF1ZXN0ZWQuCisJICogSWYgdGhhdCBmYWlscyB3ZSdsbCB0cnkgYW4gOC1iaXQgdmVyc2lvbiwgb3RoZXJ3aXNlIHdlJ2xsCisJICogdHJ5IGFuIHVuZG9jdW1lbnRlZCBxdWVyeS4KKwkgKi8KKwlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKChpbnQgKikgaWQsIFFJQ19SRVBPUlRfVkVORE9SX0lELCAxNik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcmVzdWx0ID0gZnRhcGVfcmVwb3J0X29wZXJhdGlvbigoaW50ICopIGlkLAorCQkJCQkJUUlDX1JFUE9SVF9WRU5ET1JfSUQsIDgpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLyogVGhlIGZvbGxvd2luZyBpcyBhbiB1bmRvY3VtZW50ZWQgY2FsbCBmb3VuZAorCQkJICogaW4gdGhlIENNUyBjb2RlLgorCQkJICovCisJCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKChpbnQgKikgaWQsIDI0LCA4KTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJKmlkID0gVU5LTk9XTl9WRU5ET1I7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3Qgb2xkIDggYml0IGlkOiAlMDR4IiwKKwkJCQkgICAgICAqaWQpOworCQkJCSppZCB8PSAweDIwMDAwOworCQkJfQorCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCA4IGJpdCBpZDogJTA0eCIsICppZCk7CisJCQkqaWQgfD0gMHgxMDAwMDsKKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3QgMTYgYml0IGlkOiAlMDR4IiwgKmlkKTsKKwl9CisJaWYgKCppZCA9PSAweDAwNDcpIHsKKwkJaW50IHZlcnNpb247CisJCWludCBzaWduOworCisJCWlmIChmdGFwZV9yZXBvcnRfcm9tX3ZlcnNpb24oJnZlcnNpb24pIDwgMCkgeworCQkJVFJBQ0UoZnRfdF9idWcsICJyZXBvcnQgcm9tIHZlcnNpb24gZmFpbGVkIik7CisJCQlUUkFDRV9FWElUOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJDTVMgcm9tIHZlcnNpb246ICVkIiwgdmVyc2lvbik7CisJCWZ0YXBlX2NvbW1hbmQoUUlDX0VOVEVSX0RJQUdOT1NUSUNfMSk7CisJCWZ0YXBlX2NvbW1hbmQoUUlDX0VOVEVSX0RJQUdOT1NUSUNfMSk7CisJCWRpYWdub3N0aWNfbW9kZSA9IDE7CisJCWlmIChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZzaWduLCA5LCA4KSA8IDApIHsKKwkJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJCXFpYzExN19jbWRfdCBjb21tYW5kOworCisJCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7CisJCQlmdGFwZV9jb21tYW5kKFFJQ19FTlRFUl9QUklNQVJZX01PREUpOworCQkJZGlhZ25vc3RpY19tb2RlID0gMDsKKwkJCVRSQUNFX0VYSVQ7CS8qIGZhaWx1cmUgISAqLworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkNNUyBzaWduYXR1cmU6ICUwMngiLCBzaWduKTsKKwkJfQorCQlpZiAoc2lnbiA9PSAweGE1KSB7CisJCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZzaWduLCAzNywgOCk7CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCWlmICh2ZXJzaW9uID49IDYzKSB7CisJCQkJCSppZCA9IDB4ODg4MDsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgIlRoaXMgaXMgYW4gSW9tZWdhIGRyaXZlICEiKTsKKwkJCQl9IGVsc2UgeworCQkJCQkqaWQgPSAweDAwNDc7CisJCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJCSAgICAgICJUaGlzIGlzIGEgcmVhbCBDTVMgZHJpdmUgISIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJKmlkID0gMHgwMDQ3OworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJDTVMgc3RhdHVzOiAlZCIsIHNpZ24pOworCQkJfQorCQl9IGVsc2UgeworCQkJKmlkID0gVU5LTk9XTl9WRU5ET1I7CisJCX0KKwkJZnRhcGVfY29tbWFuZChRSUNfRU5URVJfUFJJTUFSWV9NT0RFKTsKKwkJZGlhZ25vc3RpY19tb2RlID0gMDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIGludCBxaWNfcmF0ZV9jb2RlKHVuc2lnbmVkIGludCByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMjUwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzI1MDsKKwljYXNlIDUwMDoKKwkJcmV0dXJuIFFJQ19DT05GSUdfUkFURV81MDA7CisJY2FzZSAxMDAwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzEwMDA7CisJY2FzZSAyMDAwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzIwMDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFFJQ19DT05GSUdfUkFURV81MDA7CisJfQorfQorCitzdGF0aWMgaW50IGZ0YXBlX3NldF9yYXRlX3Rlc3QodW5zaWduZWQgaW50ICptYXhfcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZXJyb3I7CisJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisJaW50IHN0YXR1czsKKwlpbnQgc3VwcG9ydGVkID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIENoZWNrIGlmIHRoZSBkcml2ZSBkb2VzIHN1cHBvcnQgdGhlIHNlbGVjdCByYXRlIGNvbW1hbmQKKwkgKiAgYnkgdGVzdGluZyBhbGwgZGlmZmVyZW50IHNldHRpbmdzLiBJZiBhbnkgb25lIGlzIGFjY2VwdGVkCisJICogIHdlIGFzc3VtZSB0aGUgY29tbWFuZCBpcyBzdXBwb3J0ZWQsIGVsc2Ugbm90LgorCSAqLworCWZvciAoKm1heF9yYXRlID0gMjAwMDsgKm1heF9yYXRlID49IDI1MDsgKm1heF9yYXRlIC89IDIpIHsKKwkJaWYgKGZ0YXBlX2NvbW1hbmQoUUlDX1NFTEVDVF9SQVRFKSA8IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CQkKKwkJaWYgKGZ0YXBlX3BhcmFtZXRlcl93YWl0KHFpY19yYXRlX2NvZGUoKm1heF9yYXRlKSwKKwkJCQkJIDEgKiBGVF9TRUNPTkQsICZzdGF0dXMpIDwgMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKKwkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN1cHBvcnRlZCA9IDE7IC8qIGRpZCBhY2NlcHQgYSByZXF1ZXN0ICovCisJCWJyZWFrOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiU2VsZWN0IFJhdGUgY29tbWFuZCBpcyVzIHN1cHBvcnRlZCIsIAorCSAgICAgIHN1cHBvcnRlZCA/ICIiIDogIiBub3QiKTsKKwlUUkFDRV9FWElUIHN1cHBvcnRlZDsKK30KKworaW50IGZ0YXBlX3NldF9kYXRhX3JhdGUodW5zaWduZWQgaW50IG5ld19yYXRlIC8qIEticHMgKi8sIHVuc2lnbmVkIGludCBxaWNfc3RkKQoreworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGRhdGFfcmF0ZSA9IG5ld19yYXRlOworCXN0YXRpYyBpbnQgc3VwcG9ydGVkOworCWludCByYXRlX2NoYW5nZWQgPSAwOworCXFpY19tb2RlbCBkdW1teV9tb2RlbDsKKwl1bnNpZ25lZCBpbnQgZHVtbXlfcWljX3N0ZCwgZHVtbXlfdGFwZV9sZW47CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChmdF9kcml2ZV9tYXhfcmF0ZSA9PSAwKSB7IC8qIGZpcnN0IHRpbWUgKi8KKwkJc3VwcG9ydGVkID0gZnRhcGVfc2V0X3JhdGVfdGVzdCgmZnRfZHJpdmVfbWF4X3JhdGUpOworCX0KKwlpZiAoc3VwcG9ydGVkKSB7CisJCWZ0YXBlX2NvbW1hbmQoUUlDX1NFTEVDVF9SQVRFKTsKKwkJcmVzdWx0ID0gZnRhcGVfcGFyYW1ldGVyX3dhaXQocWljX3JhdGVfY29kZShuZXdfcmF0ZSksCisJCQkJCSAgICAgIDEgKiBGVF9TRUNPTkQsICZzdGF0dXMpOworCQlpZiAocmVzdWx0ID49IDAgJiYgIShzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSkgeworCQkJcmF0ZV9jaGFuZ2VkID0gMTsKKwkJfQorCX0KKwlUUkFDRV9DQVRDSChyZXN1bHQgPSBmdGFwZV9yZXBvcnRfY29uZmlndXJhdGlvbigmZHVtbXlfbW9kZWwsCisJCQkJCQkJJmRhdGFfcmF0ZSwgCisJCQkJCQkJJmR1bW15X3FpY19zdGQsCisJCQkJCQkJJmR1bW15X3RhcGVfbGVuKSwpOworCWlmIChkYXRhX3JhdGUgIT0gbmV3X3JhdGUpIHsKKwkJaWYgKCFzdXBwb3J0ZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIlJhdGUgY2hhbmdlIG5vdCBzdXBwb3J0ZWQhIik7CisJCX0gZWxzZSBpZiAocmF0ZV9jaGFuZ2VkKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJSZXF1ZXN0ZWQ6ICVkLCBnb3QgJWQiLAorCQkJICAgICAgbmV3X3JhdGUsIGRhdGFfcmF0ZSk7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJSYXRlIGNoYW5nZSBmYWlsZWQhIik7CisJCX0KKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiAgU2V0IGRhdGEgcmF0ZSBhbmQgd3JpdGUgcHJlY29tcGVuc2F0aW9uIGFzIHNwZWNpZmllZDoKKwkgKgorCSAqICAgICAgICAgICAgfCAgUUlDLTQwLzgwICB8IFFJQy0zMDEwLzMwMjAKKwkgKiAgIHJhdGUgICAgIHwgICBwcmVjb21wICAgfCAgICBwcmVjb21wCisJICogIC0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLQorCSAqICAyNTAgS2Jwcy4gfCAgIDI1MCBucy4gICB8ICAgICAwIG5zLgorCSAqICA1MDAgS2Jwcy4gfCAgIDEyNSBucy4gICB8ICAgICAwIG5zLgorCSAqICAgIDEgTWJwcy4gfCAgICA0MiBucy4gICB8ICAgICAwIG5zLgorCSAqICAgIDIgTWJwcyAgfCAgICAgIE4vQSAgICB8ICAgICAwIG5zLgorCSAqLworCWlmICgocWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCAmJiBkYXRhX3JhdGUgPiA1MDApIHx8IAorCSAgICAocWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCAmJiBkYXRhX3JhdGUgPiAxMDAwKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3Rfd2FybiwgIkRhdGFyYXRlIHRvbyBoaWdoIGZvciBRSUMtbW9kZSIpOworCX0KKwlUUkFDRV9DQVRDSChmZGNfc2V0X2RhdGFfcmF0ZShkYXRhX3JhdGUpLF9yZXMgPSAtRUlOVkFMKTsKKwlmdF9kYXRhX3JhdGUgPSBkYXRhX3JhdGU7CisJaWYgKHFpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDAgfHwgcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgeworCQlzd2l0Y2ggKGRhdGFfcmF0ZSkgeworCQljYXNlIDI1MDoKKwkJCWZkY19zZXRfd3JpdGVfcHJlY29tcCgyNTApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgNTAwOgorCQkJZmRjX3NldF93cml0ZV9wcmVjb21wKDEyNSk7CisJCQlicmVhazsKKwkJY2FzZSAxMDAwOgorCQkJZmRjX3NldF93cml0ZV9wcmVjb21wKDQyKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZmRjX3NldF93cml0ZV9wcmVjb21wKDApOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29wZSB3aXRoIGV4Y2Vzc2l2ZSBvdmVycnVuIGVycm9ycworICovCitpbnQgZnRhcGVfaW5jcmVhc2VfdGhyZXNob2xkKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZmRjLnR5cGUgPCBpODIwNzcgfHwgZnRfZmRjX3RocmVzaG9sZCA+PSAxMikgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImNhbm5vdCBpbmNyZWFzZSBmaWZvIHRocmVzaG9sZCIpOworCX0KKwlpZiAoZmRjX2ZpZm9fdGhyZXNob2xkKCsrZnRfZmRjX3RocmVzaG9sZCwgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiY2Fubm90IGluY3JlYXNlIGZpZm8gdGhyZXNob2xkIik7CisJCWZ0X2ZkY190aHJlc2hvbGQgLS07CisJCWZkY19yZXNldCgpOworCX0KKwlUUkFDRShmdF90X2luZm8sICJOZXcgRklGTyB0aHJlc2hvbGQ6ICVkIiwgZnRfZmRjX3RocmVzaG9sZCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfaGFsZl9kYXRhX3JhdGUodm9pZCkKK3sKKwlpZiAoZnRfZGF0YV9yYXRlIDwgNTAwKSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGZ0YXBlX3NldF9kYXRhX3JhdGUoZnRfZGF0YV9yYXRlIC8gMiwgZnRfcWljX3N0ZCkgPCAwKSB7CisJCXJldHVybiAtRUlPOworCX0KKwlmdGFwZV9jYWxjX3RpbWVvdXRzKGZ0X3FpY19zdGQsIGZ0X2RhdGFfcmF0ZSwgZnRhcGVfdGFwZV9sZW4pOworCXJldHVybiAwOworfQorCisvKiAgICAgIFNlZWsgdGhlIGhlYWQgdG8gdGhlIHNwZWNpZmllZCB0cmFjay4KKyAqLworaW50IGZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh1bnNpZ25lZCBpbnQgdHJhY2spCit7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJZnRfbG9jYXRpb24udHJhY2sgPSAtMTsgLyogcmVtYWlucyBzZXQgaW4gY2FzZSBvZiBlcnJvciAqLworCWlmICh0cmFjayA+PSBmdF90cmFja3NfcGVyX3RhcGUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9idWcsICJ0cmFjayBvdXQgb2YgYm91bmRzIik7CisJfQorCVRSQUNFKGZ0X3RfZmxvdywgInNlZWtpbmcgdHJhY2sgJWQiLCB0cmFjayk7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfU0VFS19IRUFEX1RPX1RSQUNLKSwpOworCVRSQUNFX0NBVENIKGZ0YXBlX3BhcmFtZXRlcl93YWl0KHRyYWNrLCBmdGFwZV90aW1lb3V0LmhlYWRfc2VlaywKKwkJCQkJICZzdGF0dXMpLCk7CisJZnRfbG9jYXRpb24udHJhY2sgPSB0cmFjazsKKwlmdGFwZV9taWdodF9iZV9vZmZfdHJhY2sgPSAwOworCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3dha2V1cF9kcml2ZSh3YWtlX3VwX3R5cGVzIG1ldGhvZCkKK3sKKwlpbnQgc3RhdHVzOworCWludCBtb3Rvcl9vbiA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXN3aXRjaCAobWV0aG9kKSB7CisJY2FzZSB3YWtlX3VwX2NvbG9yYWRvOgorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19QSEFOVE9NX1NFTEVDVCksKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcGFyYW1ldGVyKDAgLyogZnRfZHJpdmVfc2VsID8/ICovKSwpOworCQlicmVhazsKKwljYXNlIHdha2VfdXBfbW91bnRhaW46CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1NPRlRfU0VMRUNUKSwpOworCQlmdGFwZV9zbGVlcChGVF9NSUxMSVNFQ09ORCk7CS8qIE5FRURFRCAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9wYXJhbWV0ZXIoMTgpLCk7CisJCWJyZWFrOworCWNhc2Ugd2FrZV91cF9pbnNpZ2h0OgorCQlmdGFwZV9zbGVlcCgxMDAgKiBGVF9NSUxMSVNFQ09ORCk7CisJCW1vdG9yX29uID0gMTsKKwkJZmRjX21vdG9yKG1vdG9yX29uKTsJLyogZW5hYmxlIGlzIGRvbmUgYnkgbW90b3Itb24gKi8KKwljYXNlIG5vX3dha2VfdXA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0VYSVQgLUVOT0RFVjsJLyogdW5rbm93biB3YWtldXAgbWV0aG9kICovCisJCWJyZWFrOworCX0KKwkvKiAgSWYgd2FrZXVwIHN1Y2NlZWRlZCB3ZSBzaG91bGRuJ3QgZ2V0IGFuIGVycm9yIGhlcmUuLgorCSAqLworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLAorCQkgICAgaWYgKG1vdG9yX29uKSB7CisJCQkgICAgZmRjX21vdG9yKDApOworCQkgICAgfSk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfcHV0X2RyaXZlX3RvX3NsZWVwKHdha2VfdXBfdHlwZXMgbWV0aG9kKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzd2l0Y2ggKG1ldGhvZCkgeworCWNhc2Ugd2FrZV91cF9jb2xvcmFkbzoKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfUEhBTlRPTV9ERVNFTEVDVCksKTsKKwkJYnJlYWs7CisJY2FzZSB3YWtlX3VwX21vdW50YWluOgorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19TT0ZUX0RFU0VMRUNUKSwpOworCQlicmVhazsKKwljYXNlIHdha2VfdXBfaW5zaWdodDoKKwkJZmRjX21vdG9yKDApOwkvKiBlbmFibGUgaXMgZG9uZSBieSBtb3Rvci1vbiAqLworCWNhc2Ugbm9fd2FrZV91cDoJLyogbm8gd2FrZXVwIC8gbm8gc2xlZXAgISAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUUkFDRV9FWElUIC1FTk9ERVY7CS8qIHVua25vd24gd2FrZXVwIG1ldGhvZCAqLworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9yZXNldF9kcml2ZSh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGVycl9jb2RlOworCXFpYzExN19jbWRfdCBlcnJfY29tbWFuZDsKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFdlIHdhbnQgdG8gcmUtZXN0YWJsaXNoIGNvbnRhY3Qgd2l0aCBvdXIgZHJpdmUuICBGaXJlIGEKKwkgKiAgbnVtYmVyIG9mIHJlc2V0IGNvbW1hbmRzIChzaW5nbGUgc3RlcCBwdWxzZXMpIGFuZCBwcmF5IGZvcgorCSAqICBzdWNjZXNzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiUmVzZXR0aW5nIGZkYyIpOworCQlmZGNfcmVzZXQoKTsKKwkJZnRhcGVfc2xlZXAoMTAgKiBGVF9NSUxMSVNFQ09ORCk7CisJCVRSQUNFKGZ0X3RfZmxvdywgIlJlc2V0IGNvbW1hbmQgdG8gZHJpdmUiKTsKKwkJcmVzdWx0ID0gZnRhcGVfY29tbWFuZChRSUNfUkVTRVQpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWZ0YXBlX3NsZWVwKDEgKiBGVF9TRUNPTkQpOyAvKiAgZHJpdmUgbm90CisJCQkJCQkgICAgICogIGFjY2Vzc2libGUKKwkJCQkJCSAgICAgKiAgZHVyaW5nIDEgc2Vjb25kCisJCQkJCQkgICAgICovCisJCQlUUkFDRShmdF90X2Zsb3csICJSZS1zZWxlY3RpbmcgZHJpdmUiKTsKKworCQkJLyogU3RyYW5nZSwgdGhlIFFJQy0xMTcgc3BlY3MgZG9uJ3QgbWVudGlvbgorCQkJICogdGhpcyBidXQgdGhlIGRyaXZlIGdldHMgZGVzZWxlY3RlZCBhZnRlciBhCisJCQkgKiBzb2Z0IHJlc2V0ICEgIFNvIHdlIG5lZWQgdG8gZW5hYmxlIGl0CisJCQkgKiBhZ2Fpbi4KKwkJCSAqLworCQkJaWYgKGZ0YXBlX3dha2V1cF9kcml2ZShmdF9kcml2ZV90eXBlLndha2VfdXApIDwgMCkgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiV2FrZXVwIGZhaWxlZCAhIik7CisJCQl9CisJCQlUUkFDRShmdF90X2Zsb3csICJXYWl0aW5nIHVudGlsIGRyaXZlIGdldHMgcmVhZHkiKTsKKwkJCXJlc3VsdD0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJCWlmIChyZXN1bHQgPT0gMCAmJiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikpIHsKKwkJCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfZXJyb3IoJmVycl9jb2RlLAorCQkJCQkJCSAgICAmZXJyX2NvbW1hbmQsIDEpOworCQkJCWlmIChyZXN1bHQgPT0gMCAmJiBlcnJfY29kZSA9PSAyNykgeworCQkJCQkvKiAgT2theSwgZHJpdmUgc2F3IHJlc2V0CisJCQkJCSAqICBjb21tYW5kIGFuZCByZXNwb25kZWQgYXMgaXQKKwkJCQkJICogIHNob3VsZAorCQkJCQkgKi8KKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IC1FSU87CisJCQl9CisJCX0KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCX0KKwlpZiAocmVzdWx0ICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJHZW5lcmFsIGZhaWx1cmUgdG8gcmVzZXQgdGFwZSBkcml2ZSIpOworCX0gZWxzZSB7CisJCS8qICBSZXN0b3JlIGNvcnJlY3Qgc2V0dGluZ3M6IGtlZXAgb3JpZ2luYWwgcmF0ZSAKKwkJICovCisJCWZ0YXBlX3NldF9kYXRhX3JhdGUoZnRfZGF0YV9yYXRlLCBmdF9xaWNfc3RkKTsKKwl9CisJZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE3YmFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmgKQEAgLTAsMCArMSw5MCBAQAorI2lmbmRlZiBfRlRBUEVfSU9fSAorI2RlZmluZSBfRlRBUEVfSU9fSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5NyAgICAgIENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjE4ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIGdsdWUgcGFydCBvZiB0aGUKKyAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLXZlbmRvcnMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzZWVrOworCXVuc2lnbmVkIGludCByZXNldDsKKwl1bnNpZ25lZCBpbnQgcmV3aW5kOworCXVuc2lnbmVkIGludCBoZWFkX3NlZWs7CisJdW5zaWduZWQgaW50IHN0b3A7CisJdW5zaWduZWQgaW50IHBhdXNlOworfSBmdF90aW1lb3V0X3RhYmxlOworCit0eXBlZGVmIGVudW0geworCXByZWhpc3RvcmljLCBwcmVfcWljMTE3YywgcG9zdF9xaWMxMTdiLCBwb3N0X3FpYzExN2QgCit9IHFpY19tb2RlbDsKKworLyoKKyAqICAgICAgZnRhcGUtaW8uYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgorICovCitleHRlcm4gZnRfdGltZW91dF90YWJsZSBmdGFwZV90aW1lb3V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBmdGFwZV90YXBlX2xlbjsKK2V4dGVybiB2b2xhdGlsZSBxaWMxMTdfY21kX3QgZnRhcGVfY3VycmVudF9jb21tYW5kOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBxaWMxMTdfY29tbWFuZF90YWJsZSBxaWMxMTdfY21kc1tdOworZXh0ZXJuIGludCBmdGFwZV9taWdodF9iZV9vZmZfdHJhY2s7CisKKy8qCisgKiAgICAgIGZ0YXBlLWlvLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gdm9pZCBmdGFwZV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKTsKK2V4dGVybiB2b2lkICBmdGFwZV91ZGVsYXlfY2FsaWJyYXRlKHZvaWQpOworZXh0ZXJuIHZvaWQgZnRhcGVfc2xlZXAodW5zaWduZWQgaW50IHRpbWUpOworZXh0ZXJuIHZvaWQgZnRhcGVfcmVwb3J0X3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgKmlkKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2NvbW1hbmQocWljMTE3X2NtZF90IGNvbW1hbmQpOworZXh0ZXJuIGludCAgZnRhcGVfY29tbWFuZF93YWl0KHFpYzExN19jbWRfdCBjb21tYW5kLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0LAorCQkJICAgICAgIGludCAqc3RhdHVzKTsKK2V4dGVybiBpbnQgIGZ0YXBlX3BhcmFtZXRlcih1bnNpZ25lZCBpbnQgcGFyYW1ldGVyKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X29wZXJhdGlvbihpbnQgKnN0YXR1cywKKwkJCQkgIHFpYzExN19jbWRfdCAgY29tbWFuZCwKKwkJCQkgIGludCByZXN1bHRfbGVuZ3RoKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X2NvbmZpZ3VyYXRpb24ocWljX21vZGVsICptb2RlbCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCisJCQkJICAgICAgaW50ICpxaWNfc3RkLAorCQkJCSAgICAgIGludCAqdGFwZV9sZW4pOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKGludCAqc3RhdHVzKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfc3RhdHVzKGludCAqc3RhdHVzKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCBmdGFwZV9zZWVrX2hlYWRfdG9fdHJhY2sodW5zaWduZWQgaW50IHRyYWNrKTsKK2V4dGVybiBpbnQgZnRhcGVfc2V0X2RhdGFfcmF0ZSh1bnNpZ25lZCBpbnQgbmV3X3JhdGUsIHVuc2lnbmVkIGludCBxaWNfc3RkKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X2Vycm9yKHVuc2lnbmVkIGludCAqZXJyb3IsCisJCQkgICAgICBxaWMxMTdfY21kX3QgKmNvbW1hbmQsCisJCQkgICAgICBpbnQgcmVwb3J0KTsKK2V4dGVybiBpbnQgZnRhcGVfcmVzZXRfZHJpdmUodm9pZCk7CitleHRlcm4gaW50IGZ0YXBlX3B1dF9kcml2ZV90b19zbGVlcCh3YWtlX3VwX3R5cGVzIG1ldGhvZCk7CitleHRlcm4gaW50IGZ0YXBlX3dha2V1cF9kcml2ZSh3YWtlX3VwX3R5cGVzIG1ldGhvZCk7CitleHRlcm4gaW50IGZ0YXBlX2luY3JlYXNlX3RocmVzaG9sZCh2b2lkKTsKK2V4dGVybiBpbnQgZnRhcGVfaGFsZl9kYXRhX3JhdGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2MjUxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4xMSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8yNCAxNDo0NzozNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHByb2NmcyBpbnRlcmZhY2UgZm9yIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKworICoJT2xkIGNvZGUgcmVtb3ZlZCwgc3dpdGNoZWQgdG8gZHluYW1pYyBwcm9jIGVudHJ5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcHJvYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKworc3RhdGljIHNpemVfdCBnZXRfZHJpdmVyX2luZm8oY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmRlYnVnX2xldmVsW10gPSB7ICJidWdzIiAgLAorCQkJCSAgICAgICJlcnJvcnMiLAorCQkJCSAgICAgICJ3YXJuaW5ncyIsCisJCQkJICAgICAgImluZm9ybWF0aW9uYWwiLAorCQkJCSAgICAgICJub2lzeSIsCisJCQkJICAgICAgInByb2dyYW0gZmxvdyIsCisJCQkJICAgICAgImZkYyBhbmQgZG1hIiwKKwkJCQkgICAgICAiZGF0YSBmbG93IiwKKwkJCQkgICAgICAiYW55dGhpbmciIH07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsCisJCSAgICAgICAidmVyc2lvbiAgICAgICA6ICVzXG4iCisJCSAgICAgICAidXNlZCBkYXRhIHJhdGU6ICVkIGtiaXQvc2VjXG4iCisJCSAgICAgICAiZG1hIG1lbW9yeSAgICA6ICVkIGtiXG4iCisJCSAgICAgICAiZGVidWcgbWVzc2FnZXM6ICVzXG4iLAorCQkgICAgICAgRlRBUEVfVkVSU0lPTiwKKwkJICAgICAgIGZ0X2RhdGFfcmF0ZSwKKwkJICAgICAgIEZUX0JVRkZfU0laRSAqIGZ0X25yX2J1ZmZlcnMgPj4gMTAsCisJCSAgICAgICBkZWJ1Z19sZXZlbFtUUkFDRV9MRVZFTF0pOworfQorCitzdGF0aWMgc2l6ZV90IGdldF90YXBlZHJpdmVfaW5mbyhjaGFyICpidWYpCit7IAorCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJ2ZW5kb3IgaWQgOiAweCUwNHhcbiIKKwkJICAgICAgICJkcml2ZSBuYW1lOiAlc1xuIgorCQkgICAgICAgIndpbmQgc3BlZWQ6ICVkIGlwc1xuIgorCQkgICAgICAgIndha2V1cCAgICA6ICVzXG4iCisJCSAgICAgICAibWF4LiByYXRlIDogJWQga2JpdC9zZWNcbiIsCisJCSAgICAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCwKKwkJICAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSwKKwkJICAgICAgIGZ0X2RyaXZlX3R5cGUuc3BlZWQsCisJCSAgICAgICAoKGZ0X2RyaXZlX3R5cGUud2FrZV91cCA9PSBub193YWtlX3VwKQorCQkJPyAiTm8gd2FrZXVwIG5lZWRlZCIgOgorCQkJKChmdF9kcml2ZV90eXBlLndha2VfdXAgPT0gd2FrZV91cF9jb2xvcmFkbykKKwkJCSA/ICJDb2xvcmFkbyIgOgorCQkJICgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfbW91bnRhaW4pCisJCQkgID8gIk1vdW50YWluIiA6CisJCQkgICgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfaW5zaWdodCkKKwkJCSAgID8gIk1vdG9yIG9uIiA6CisJCQkgICAiVW5rbm93biIpKSkpLAorCQkgICAgICAgZnRfZHJpdmVfbWF4X3JhdGUpOworfQorCitzdGF0aWMgc2l6ZV90IGdldF9jYXJ0cmlkZ2VfaW5mbyhjaGFyICpidWYpCit7CisJaWYgKGZ0YXBlX2luaXRfZHJpdmVfbmVlZGVkKSB7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuaW5pdGlhbGl6ZWRcbiIpOworCX0KKwlpZiAoZnRfbm9fdGFwZSkgeworCQlyZXR1cm4gc3ByaW50ZihidWYsICJubyBjYXJ0cmlkZ2UgaW5zZXJ0ZWRcbiIpOworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsCisJCSAgICAgICAic2VnbWVudHMgIDogJTVkXG4iCisJCSAgICAgICAidHJhY2tzICAgIDogJTVkXG4iCisJCSAgICAgICAibGVuZ3RoICAgIDogJTVkZnRcbiIKKwkJICAgICAgICJmb3JtYXR0ZWQgOiAlM3NcbiIKKwkJICAgICAgICJ3cml0YWJsZSAgOiAlM3NcbiIKKwkJICAgICAgICJRSUMgc3BlYy4gOiBRSUMtJXNcbiIKKwkJICAgICAgICJmbXQtY29kZSAgOiAlMWRcbiIsCisJCSAgICAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssCisJCSAgICAgICBmdF90cmFja3NfcGVyX3RhcGUsCisJCSAgICAgICBmdGFwZV90YXBlX2xlbiwKKwkJICAgICAgIChmdF9mb3JtYXR0ZWQgPT0gMSkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgICAoZnRfd3JpdGVfcHJvdGVjdGVkID09IDEpID8gIm5vIiA6ICJ5ZXMiLAorCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwKSA/ICI0MCIgOgorCQkJKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSA/ICI4MCIgOgorCQkJICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDEwKSA/ICIzMDEwIiA6CisJCQkgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDIwKSA/ICIzMDIwIiA6CisJCQkgICAiPz8/IikpKSksCisJCSAgICAgICBmdF9mb3JtYXRfY29kZSk7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0X2NvbnRyb2xsZXJfaW5mbyhjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAgKmZkY19uYW1lW10gPSB7ICJubyBmZGMiLAorCQkJCSAgICAiaTgyNzIiLAorCQkJCSAgICAiaTgyMDc3IiwKKwkJCQkgICAgImk4MjA3N0FBIiwKKwkJCQkgICAgIkNvbG9yYWRvIEZDLTEwIG9yIEZDLTIwIiwKKwkJCQkgICAgImk4MjA3OCIsCisJCQkJICAgICJpODIwNzhfMSIgfTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJGREMgdHlwZSAgOiAlc1xuIgorCQkgICAgICAgIkZEQyBiYXNlICA6IDB4JTAzeFxuIgorCQkgICAgICAgIkZEQyBpcnEgICA6ICVkXG4iCisJCSAgICAgICAiRkRDIGRtYSAgIDogJWRcbiIKKwkJICAgICAgICJGREMgdGhyLiAgOiAlZFxuIgorCQkgICAgICAgIm1heC4gcmF0ZSA6ICVkIGtiaXQvc2VjXG4iLAorCQkgICAgICAgZnRfbWFjaDIgPyAiTW91bnRhaW4gTUFDSC0yIiA6IGZkY19uYW1lW2ZkYy50eXBlXSwKKwkJICAgICAgIGZkYy5zcmEsIGZkYy5pcnEsIGZkYy5kbWEsCisJCSAgICAgICBmdF9mZGNfdGhyZXNob2xkLCBmdF9mZGNfbWF4X3JhdGUpOworfQorCitzdGF0aWMgc2l6ZV90IGdldF9oaXN0b3J5X2luZm8oY2hhciAqYnVmKQoreworICAgICAgICBzaXplX3QgbGVuOworCisJbGVuICA9IHNwcmludGYoYnVmLAorCQkgICAgICAgIlxuRkRDIGlzciBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIGlkX2FtX2Vycm9ycyAgICAgOiAlM2RcbiIKKwkJICAgICAgICIgaWRfY3JjX2Vycm9ycyAgICA6ICUzZFxuIgorCQkgICAgICAgIiBkYXRhX2FtX2Vycm9ycyAgIDogJTNkXG4iCisJCSAgICAgICAiIGRhdGFfY3JjX2Vycm9ycyAgOiAlM2RcbiIKKwkJICAgICAgICIgb3ZlcnJ1bl9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICAgIiBub19kYXRhX2Vycm9ycyAgIDogJTNkXG4iCisJCSAgICAgICAiIHJldHJpZXMgICAgICAgICAgOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycywgICBmdF9oaXN0b3J5LmlkX2NyY19lcnJvcnMsCisJCSAgICAgICBmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzLCBmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycywKKwkJICAgICAgIGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMsIGZ0X2hpc3Rvcnkubm9fZGF0YV9lcnJvcnMsCisJCSAgICAgICBmdF9oaXN0b3J5LnJldHJpZXMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJICAgICAgICJcbkVDQyBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIGNyY19lcnJvcnMgICAgICAgOiAlM2RcbiIKKwkJICAgICAgICIgY3JjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkgICAgICAgIiBlY2NfZmFpbHVyZXMgICAgIDogJTNkXG4iCisJCSAgICAgICAiIHNlY3RvcnMgY29ycmVjdGVkOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LmNyY19lcnJvcnMsICAgZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMsCisJCSAgICAgICBmdF9oaXN0b3J5LmVjY19mYWlsdXJlcywgZnRfaGlzdG9yeS5jb3JyZWN0ZWQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJICAgICAgICJcbnRhcGUgcXVhbGl0eSBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIG1lZGlhIGRlZmVjdHMgICAgOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LmRlZmVjdHMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJICAgICAgICJcbnRhcGUgbW90aW9uIHN0YXRpc3RpY3NcbiIKKwkJICAgICAgICIgcmVwb3NpdGlvbnMgICAgICA6ICUzZFxuIiwKKwkJICAgICAgIGZ0X2hpc3RvcnkucmV3aW5kcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmdGFwZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKnB0ciA9IHBhZ2U7CisJc2l6ZV90IGxlbjsKKwkKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJLZXJuZWwgRHJpdmVyXG5cbiIpOworCXB0ciArPSBnZXRfZHJpdmVyX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcblRhcGUgRHJpdmVcblxuIik7CisJcHRyICs9IGdldF90YXBlZHJpdmVfaW5mbyhwdHIpOworCXB0ciArPSBzcHJpbnRmKHB0ciwgIlxuRkRDIENvbnRyb2xsZXJcblxuIik7CisJcHRyICs9IGdldF9jb250cm9sbGVyX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcblRhcGUgQ2FydHJpZGdlXG5cbiIpOworCXB0ciArPSBnZXRfY2FydHJpZGdlX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcbkhpc3RvcnkgUmVjb3JkXG5cbiIpOworCXB0ciArPSBnZXRfaGlzdG9yeV9pbmZvKHB0cik7CisKKwlsZW4gPSBzdHJsZW4ocGFnZSk7CisJKnN0YXJ0ID0gTlVMTDsKKwlpZiAob2ZmK2NvdW50ID49IGxlbikgeworCQkqZW9mID0gMTsKKwl9IGVsc2UgeworCQkqZW9mID0gMDsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworaW50IF9faW5pdCBmdGFwZV9wcm9jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZnRhcGUiLCAwLCAmcHJvY19yb290LAorCQlmdGFwZV9yZWFkX3Byb2MsIE5VTEwpICE9IE5VTEw7Cit9CisKK3ZvaWQgZnRhcGVfcHJvY19kZXN0cm95KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImZ0YXBlIiwgJnByb2Nfcm9vdCk7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0ZGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfRlRBUEVfUFJPQ19ICisjZGVmaW5lIF9GVEFQRV9QUk9DX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoyMCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBwcm9jZnMgaW50ZXJmYWNlIG9mIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCitleHRlcm4gaW50ICBmdGFwZV9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBmdGFwZV9wcm9jX2Rlc3Ryb3kodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2N2Q4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5jLHYgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDE5OTcvMTAvMjEgMTQ6Mzk6MjIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByZWFkaW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKworLyogICAgICBMb2NhbCB2YXJzLgorICovCisKK3ZvaWQgZnRhcGVfemFwX3JlYWRfYnVmZmVycyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZ0X25yX2J1ZmZlcnM7ICsraSkgeworLyogIGNoYW5nZWQgdG8gImZpdCIgd2l0aCBkeW5hbWljIGFsbG9jYXRpb24gb2YgdGFwZV9idWZmZXIuIC0ta2hwICAqLworCQlmdF9idWZmZXJbaV0tPnN0YXR1cyA9IHdhaXRpbmc7CisJCWZ0X2J1ZmZlcltpXS0+Ynl0ZXMgPSAwOworCQlmdF9idWZmZXJbaV0tPnNraXAgPSAwOworCQlmdF9idWZmZXJbaV0tPnJldHJ5ID0gMDsKKwl9CisvKglmdGFwZV9yZXNldF9idWZmZXIoKTsgKi8KK30KKworc3RhdGljIFNlY3Rvck1hcCBjb252ZXJ0X3NlY3Rvcl9tYXAoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCit7CisJaW50IGkgPSAwOworCVNlY3Rvck1hcCBiYWRfbWFwID0gZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoYnVmZi0+c2VnbWVudF9pZCk7CisJU2VjdG9yTWFwIHNyY19tYXAgPSBidWZmLT5zb2Z0X2Vycm9yX21hcCB8IGJ1ZmYtPmhhcmRfZXJyb3JfbWFwOworCVNlY3Rvck1hcCBkc3RfbWFwID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJhZF9tYXAgfHwgc3JjX21hcCkgeworCQlUUkFDRShmdF90X2Zsb3csICJiYWRfbWFwID0gMHglMDhseCIsIChsb25nKSBiYWRfbWFwKTsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic3JjX21hcCA9IDB4JTA4bHgiLCAobG9uZykgc3JjX21hcCk7CisJfQorCXdoaWxlIChiYWRfbWFwKSB7CisJCXdoaWxlICgoYmFkX21hcCAmIDEpID09IDApIHsKKwkJCWlmIChzcmNfbWFwICYgMSkgeworCQkJCWRzdF9tYXAgfD0gKDEgPDwgaSk7CisJCQl9CisJCQlzcmNfbWFwID4+PSAxOworCQkJYmFkX21hcCA+Pj0gMTsKKwkJCSsraTsKKwkJfQorCQkvKiAoYmFkX21hcCAmIDEpID09IDEgKi8KKwkJc3JjX21hcCA+Pj0gMTsKKwkJYmFkX21hcCA+Pj0gMTsKKwl9CisJaWYgKHNyY19tYXApIHsKKwkJZHN0X21hcCB8PSAoc3JjX21hcCA8PCBpKTsKKwl9CisJaWYgKGRzdF9tYXApIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiZHN0X21hcCA9IDB4JTA4bHgiLCAobG9uZykgZHN0X21hcCk7CisJfQorCVRSQUNFX0VYSVQgZHN0X21hcDsKK30KKworc3RhdGljIGludCBjb3JyZWN0X2FuZF9jb3B5X2ZyYWN0aW9uKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIF9fdTggKiBkZXN0aW5hdGlvbiwKKwkJCQkgICAgIGludCBzdGFydCwgaW50IHNpemUpCit7CisJc3RydWN0IG1lbW9yeV9zZWdtZW50IG1zZWc7CisJaW50IHJlc3VsdDsKKwlTZWN0b3JNYXAgcmVhZF9iYWQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCW1zZWcucmVhZF9iYWQgPSBjb252ZXJ0X3NlY3Rvcl9tYXAoYnVmZik7CisJbXNlZy5tYXJrZWRfYmFkID0gMDsJLyogbm90IHVzZWQuLi4gKi8KKwltc2VnLmJsb2NrcyA9IGJ1ZmYtPmJ5dGVzIC8gRlRfU0VDVE9SX1NJWkU7CisJbXNlZy5kYXRhID0gYnVmZi0+YWRkcmVzczsKKwkvKiAgICBJZiB0aGVyZSBhcmUgbm8gZGF0YSBzZWN0b3JzIHdlIGNhbiBza2lwIHRoaXMgc2VnbWVudC4KKwkgKi8KKwlpZiAobXNlZy5ibG9ja3MgPD0gMykgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiZW1wdHkgc2VnbWVudCIpOworCX0KKwlyZWFkX2JhZCA9IG1zZWcucmVhZF9iYWQ7CisJZnRfaGlzdG9yeS5jcmNfZXJyb3JzICs9IGNvdW50X29uZXMocmVhZF9iYWQpOworCXJlc3VsdCA9IGZ0YXBlX2VjY19jb3JyZWN0X2RhdGEoJm1zZWcpOworCWlmIChyZWFkX2JhZCAhPSAwIHx8IG1zZWcuY29ycmVjdGVkICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNyYyBlcnJvciBtYXA6IDB4JTA4bHgiLCAodW5zaWduZWQgbG9uZylyZWFkX2JhZCk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjb3JyZWN0ZWQgbWFwOiAweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpbXNlZy5jb3JyZWN0ZWQpOworCQlmdF9oaXN0b3J5LmNvcnJlY3RlZCArPSBjb3VudF9vbmVzKG1zZWcuY29ycmVjdGVkKTsKKwl9CisJaWYgKHJlc3VsdCA9PSBFQ0NfQ09SUkVDVEVEIHx8IHJlc3VsdCA9PSBFQ0NfT0spIHsKKwkJaWYgKHJlc3VsdCA9PSBFQ0NfQ09SUkVDVEVEKSB7CisJCQlUUkFDRShmdF90X2luZm8sICJlY2MgY29ycmVjdGVkIHNlZ21lbnQ6ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJCX0KKwkJaWYoc3RhcnQgPCAwKSB7CisJCQlzdGFydD0gMDsKKwkJfQorCQlpZigoc3RhcnQrc2l6ZSkgPiAoKG1zZWcuYmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRSkpIHsKKwkJCXNpemUgPSAobXNlZy5ibG9ja3MgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFICAtIHN0YXJ0OworCQl9IAorCQlpZiAoc2l6ZSA8IDApIHsKKwkJCXNpemU9IDA7CisJCX0KKwkJaWYoc2l6ZSA+IDApIHsKKwkJCW1lbWNweShkZXN0aW5hdGlvbiArIHN0YXJ0LCBtc2VnLmRhdGEgKyBzdGFydCwgc2l6ZSk7CisJCX0KKwkJaWYgKChyZWFkX2JhZCBeIG1zZWcuY29ycmVjdGVkKSAmIG1zZWcuY29ycmVjdGVkKSB7CisJCQkvKiBzZWN0b3JzIGNvcnJlY3RlZCB3aXRob3V0IGNyYyBlcnJvcnMgc2V0ICovCisJCQlmdF9oaXN0b3J5LmNyY19mYWlsdXJlcysrOworCQl9CisJCVRSQUNFX0VYSVQgc2l6ZTsgLyogKG1zZWcuYmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRTsgKi8KKwl9IGVsc2UgeworCQlmdF9oaXN0b3J5LmVjY19mYWlsdXJlcysrOworCQlUUkFDRV9BQk9SVCgtRUFHQUlOLAorCQkJICAgIGZ0X3RfZXJyLCAiZWNjIGZhaWx1cmUgb24gc2VnbWVudCAlZCIsCisJCQkgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBSZWFkIGdpdmVuIHNlZ21lbnQgaW50byBidWZmZXIgYXQgYWRkcmVzcy4KKyAqLworaW50IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihjb25zdCBpbnQgc2VnbWVudF9pZCwKKwkJCQl2b2lkICAqYWRkcmVzcywgCisJCQkJY29uc3QgZnRfcmVhZF9tb2RlX3QgcmVhZF9tb2RlLAorCQkJCWNvbnN0IGludCBzdGFydCwKKwkJCQljb25zdCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmV0cnkgID0gMDsKKwlpbnQgYnl0ZXNfcmVhZCA9IDA7CisJaW50IHJlYWRfZG9uZSAgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfaGlzdG9yeS51c2VkIHw9IDE7CisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJzZWdtZW50X2lkID0gJWQiLCBzZWdtZW50X2lkKTsKKwlpZiAoZnRfZHJpdmVyX3N0YXRlICE9IHJlYWRpbmcpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgZnRhcGVfYWJvcnRfb3BlcmF0aW9uIik7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJCWZ0YXBlX3NldF9zdGF0ZShyZWFkaW5nKTsKKwl9CisJZm9yKDs7KSB7CisJCWJ1ZmZlcl9zdHJ1Y3QgKnRhaWw7CisJCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsICEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJLyogIFNlYXJjaCBhbGwgZnVsbCBidWZmZXJzIGZvciB0aGUgZmlyc3QgbWF0Y2hpbmcgdGhlCisJCSAqICB3YW50ZWQgc2VnbWVudC4gIENsZWFyIG90aGVyIGJ1ZmZlcnMgb24gdGhlIGZseS4KKwkJICovCisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQl3aGlsZSAoIXJlYWRfZG9uZSAmJiB0YWlsLT5zdGF0dXMgPT0gZG9uZSkgeworCQkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQorCQkJICovCisJCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCQlpZiAodGFpbC0+c2VnbWVudF9pZCA9PSBzZWdtZW50X2lkKSB7CisJCQkJLyogIElmIG91dCBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLAorCQkJCSAqICByZXR1cm4gaXRzIGNvbnRlbnRzLiAgCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9mbG93LCAiZm91bmQgc2VnbWVudCBpbiBjYWNoZTogJWQiLAorCQkJCSAgICAgIHNlZ21lbnRfaWQpOworCQkJCWlmICh0YWlsLT5kZWxldGVkKSB7CisJCQkJCS8qICBSZXR1cm4gYSB2YWx1ZSB0aGF0CisJCQkJCSAqICByZWFkX2hlYWRlcl9zZWdtZW50CisJCQkJCSAqICB1bmRlcnN0YW5kcy4gIEFzIHRoaXMKKwkJCQkJICogIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4KKwkJCQkJICogIHNlYXJjaGluZyBmb3IgdGhlIGhlYWRlcgorCQkJCQkgKiAgc2VnbWVudHMgaXQgc2hvdWxkbid0IGJlCisJCQkJCSAqICBtaXNpbnRlcnByZXRlZCBlbHNld2hlcmUuCisJCQkJCSAqLworCQkJCQlUUkFDRV9FWElUIDA7CisJCQkJfQorCQkJCXJlc3VsdCA9IGNvcnJlY3RfYW5kX2NvcHlfZnJhY3Rpb24oCisJCQkJCXRhaWwsCisJCQkJCWFkZHJlc3MsCisJCQkJCXN0YXJ0LAorCQkJCQlzaXplKTsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJzZWdtZW50IGNvbnRhaW5zIChieXRlcyk6ICVkIiwKKwkJCQkgICAgICByZXN1bHQpOworCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCWlmIChyZXN1bHQgIT0gLUVBR0FJTikgeworCQkJCQkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJCQkJCX0KKwkJCQkJLyoga2VlcCByZWFkX2RvbmUgPT0gMCwgd2lsbAorCQkJCQkgKiB0cmlnZ2VyCisJCQkJCSAqIGZ0YXBlX2Fib3J0X29wZXJhdGlvbgorCQkJCQkgKiBiZWNhdXNlIHJlYWRpbmcgd3JvbmcKKwkJCQkJICogc2VnbWVudC4KKwkJCQkJICovCisJCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZWNjIGZhaWxlZCwgcmV0cnkiKTsKKwkJCQkJKytyZXRyeTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWFkX2RvbmUgPSAxOworCQkJCQlieXRlc19yZWFkID0gcmVzdWx0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9mbG93LCJ6YXBwaW5nIHNlZ21lbnQgaW4gY2FjaGU6ICVkIiwKKwkJCQkgICAgICB0YWlsLT5zZWdtZW50X2lkKTsKKwkJCX0KKwkJCXRhaWwtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQl0YWlsID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJCX0KKwkJaWYgKCFyZWFkX2RvbmUgJiYgdGFpbC0+c3RhdHVzID09IHJlYWRpbmcpIHsKKwkJCWlmICh0YWlsLT5zZWdtZW50X2lkID09IHNlZ21lbnRfaWQpIHsKKwkJCQlzd2l0Y2goZnRhcGVfd2FpdF9zZWdtZW50KHJlYWRpbmcpKSB7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQljYXNlIC1FSU5UUjoKKwkJCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCBmdF90X3dhcm4sCisJCQkJCQkgICAgImludGVycnVwdGVkIGJ5ICIKKwkJCQkJCSAgICAibm9uLWJsb2NrYWJsZSBzaWduYWwiKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgIndhaXRfc2VnbWVudCBmYWlsZWQiKTsKKwkJCQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJCQkJCWZ0YXBlX3NldF9zdGF0ZShyZWFkaW5nKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiAgV2UncmUgcmVhZGluZyB0aGUgd3Jvbmcgc2VnbWVudCwKKwkJCQkgKiAgc3RvcCBydW5uZXIuCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInJlYWRpbmcgd3Jvbmcgc2VnbWVudCIpOworCQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQkJCWZ0YXBlX3NldF9zdGF0ZShyZWFkaW5nKTsKKwkJCX0KKwkJfQorCQkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPworCQkgKi8KKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcpIHsKKwkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQkJc3dpdGNoKGhlYWQtPnN0YXR1cykgeworCQkJY2FzZSBlcnJvcjoKKwkJCQlmdF9oaXN0b3J5LmRlZmVjdHMgKz0gCisJCQkJCWNvdW50X29uZXMoaGVhZC0+aGFyZF9lcnJvcl9tYXApOworCQkJY2FzZSByZWFkaW5nOgorCQkJCWhlYWQtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfZHVtYl9zdG9wKCksKTsKKwkJfSBlbHNlIHsKKwkJCS8qICBJZiBqdXN0IHBhc3NlZCBsYXN0IHNlZ21lbnQgb24gdGFwZTogd2FpdAorCQkJICogIGZvciBCT1Qgb3IgRU9UIG1hcmsuIFNldHMgZnRfcnVubmVyX3N0YXR1cyB0bworCQkJICogIGlkbGUgaWYgYXQgbEVPVCBhbmQgc3VjY2Vzc2Z1bCAKKwkJCSAqLworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksKTsKKwkJfQorCQkvKiAgICBJZiB3ZSBnb3QgYSBzZWdtZW50OiBxdWl0LCBvciBlbHNlIHJldHJ5IHVwIHRvIGxpbWl0LgorCQkgKgorCQkgKiAgICBJZiBzZWdtZW50IHRvIHJlYWQgaXMgZW1wdHksIGRvIG5vdCBzdGFydCBydW5uZXIgZm9yIGl0LAorCQkgKiAgICBidXQgd2FpdCBmb3IgbmV4dCByZWFkIGNhbGwuCisJCSAqLworCQlpZiAocmVhZF9kb25lIHx8CisJCSAgICBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSA9PSBFTVBUWV9TRUdNRU5UICkgeworCQkJLyogYnl0ZXNfcmVhZCA9IDA7ICBzaG91bGQgc3RpbGwgYmUgemVybyAqLworCQkJVFJBQ0VfRVhJVCBieXRlc19yZWFkOworCisJCX0KKwkJaWYgKHJldHJ5ID4gRlRfUkVUUklFU19PTl9FQ0NfRVJST1IpIHsKKwkJCWZ0X2hpc3RvcnkuZGVmZWN0cysrOworCQkJVFJBQ0VfQUJPUlQoLUVOT0RBVEEsIGZ0X3RfZXJyLAorCQkJCSAgICAidG9vIG1hbnkgcmV0cmllcyBvbiBlY2MgZmFpbHVyZSIpOworCQl9CisJCS8qICAgIE5vdyBhdCBsZWFzdCBvbmUgYnVmZmVyIGlzIGVtcHR5ICEKKwkJICogICAgUmVzdGFydCBydW5uZXIgJiB0YXBlIGlmIG5lZWRlZC4KKwkJICovCisJCVRSQUNFKGZ0X3RfYW55LCAiaGVhZDogJWQsIHRhaWw6ICVkLCBmdF9ydW5uZXJfc3RhdHVzOiAlZCIsCisJCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV9oZWFkKSwKKwkJICAgICAgZnRhcGVfYnVmZmVyX2lkKGZ0X3F1ZXVlX3RhaWwpLAorCQkgICAgICBmdF9ydW5uZXJfc3RhdHVzKTsKKwkJVFJBQ0UoZnRfdF9hbnksICJidWZmZXJbXS5zdGF0dXMsIFtoZWFkXTogJWQsIFt0YWlsXTogJWQiLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zdGF0dXMsCisJCSAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCktPnN0YXR1cyk7CisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQlpZiAodGFpbC0+c3RhdHVzID09IHdhaXRpbmcpIHsKKwkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCisJCQlmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChoZWFkLCBzZWdtZW50X2lkLCAtMSk7CisJCQlpZiAocmVhZF9tb2RlID09IEZUX1JEX1NJTkdMRSkgeworCQkJCS8qIGRpc2FibGUgcmVhZC1haGVhZCAqLworCQkJCWhlYWQtPm5leHRfc2VnbWVudCA9IDA7CisJCQl9CisJCQlmdGFwZV9jYWxjX25leHRfY2x1c3RlcihoZWFkKTsKKwkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJCQlyZXN1bHQgPSBmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsCisJCQkJCQkJICBoZWFkLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3RfZXJyLCAiRXJyb3I6ICIKKwkJCQkJCSAgICAic2VnbWVudCAlZCB1bnJlYWNoYWJsZSIsCisJCQkJCQkgICAgc2VnbWVudF9pZCk7CisJCQkJfQorCQkJfQorCQkJaGVhZC0+c3RhdHVzID0gcmVhZGluZzsKKwkJCWZkY19zZXR1cF9yZWFkX3dyaXRlKGhlYWQsIEZEQ19SRUFEKTsKKwkJfQorCX0KKwkvKiBub3QgcmVhY2hlZCAqLworCVRSQUNFX0VYSVQgLUVJTzsKK30KKworaW50IGZ0YXBlX3JlYWRfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcykKK3sKKwlpbnQgcmVzdWx0OworCWludCBoZWFkZXJfc2VnbWVudDsKKwlpbnQgZmlyc3RfZmFpbGVkID0gMDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfdXNlZF9oZWFkZXJfc2VnbWVudCA9IC0xOworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwlUUkFDRShmdF90X2Zsb3csICJyZWFkaW5nLi4uIik7CisJLyogIFdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBoZWFkZXIgc2VnbWVudC4KKwkgKiAgQSBoZWFkZXIgc2VnbWVudCBjYW5ub3QgY29udGFpbiBiYWQgc2VjdG9ycywgdGhlcmVmb3IgYXQgdGhlCisJICogIHRhcGUgc3RhcnQsIHNlZ21lbnRzIHdpdGggYmFkIHNlY3RvcnMgYXJlIChhY2NvcmRpbmcgdG8gUUlDLTQwLzgwKQorCSAqICB3cml0dGVuIHdpdGggZGVsZXRlZCBkYXRhIG1hcmtzIGFuZCBtdXN0IGJlIHNraXBwZWQuCisJICovCisJbWVtc2V0KGFkZHJlc3MsICdcMCcsIChGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gMykgKiBGVF9TRUNUT1JfU0laRSk7IAorCXJlc3VsdCA9IDA7CisjZGVmaW5lIEhFQURFUl9TRUdNRU5UX0JPVU5EQVJZIDY4ICAvKiB3aHkgbm90IDQyPyAqLworCWZvciAoaGVhZGVyX3NlZ21lbnQgPSAwOworCSAgICAgaGVhZGVyX3NlZ21lbnQgPCBIRUFERVJfU0VHTUVOVF9CT1VOREFSWSAmJiByZXN1bHQgPT0gMDsKKwkgICAgICsraGVhZGVyX3NlZ21lbnQpIHsKKwkJLyogIFNldCBubyByZWFkLWFoZWFkLCB0aGUgaXNyIHdpbGwgZm9yY2UgcmVhZC1haGVhZCB3aGVuZXZlcgorCQkgKiAgaXQgZW5jb3VudGVycyBkZWxldGVkIGRhdGEgIQorCQkgKi8KKwkJcmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KGhlYWRlcl9zZWdtZW50LAorCQkJCQkgICAgYWRkcmVzcywKKwkJCQkJICAgIEZUX1JEX1NJTkdMRSk7CisJCWlmIChyZXN1bHQgPCAwICYmICFmaXJzdF9mYWlsZWQpIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiaGVhZGVyIHNlZ21lbnQgZGFtYWdlZCwgdHJ5aW5nIGJhY2t1cCIpOworCQkJZmlyc3RfZmFpbGVkID0gMTsKKwkJCXJlc3VsdCA9IDA7CS8qIGZvcmNlIHJlYWQgb2YgbmV4dCAoYmFja3VwKSBzZWdtZW50ICovCisJCX0KKwl9CisJaWYgKHJlc3VsdCA8IDAgfHwgaGVhZGVyX3NlZ21lbnQgPj0gSEVBREVSX1NFR01FTlRfQk9VTkRBUlkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgIm5vIHJlYWRhYmxlIGhlYWRlciBzZWdtZW50IGZvdW5kIik7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJZnRfdXNlZF9oZWFkZXJfc2VnbWVudCA9IGhlYWRlcl9zZWdtZW50OworCXJlc3VsdCA9IGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudChhZGRyZXNzKTsKKyAJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK2ludCBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X2Zsb3BweV9zaWRlOworCXVuc2lnbmVkIGludCBtYXhfZmxvcHB5X3RyYWNrOworCXVuc2lnbmVkIGludCBtYXhfZmxvcHB5X3NlY3RvcjsKKwl1bnNpZ25lZCBpbnQgbmV3X3RhcGVfbGVuOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKEdFVDQoYWRkcmVzcywgRlRfU0lHTkFUVVJFKSA9PSBGVF9EMkdfTUFHSUMpIHsKKwkJLyogRGl0dG8gMkdCIGhlYWRlciBzZWdtZW50LiBUaGV5IGVuY3J5cHQgdGhlIGJhZCBzZWN0b3IgbWFwLgorCQkgKiBXZSBkZWNyeXB0IGl0IGFuZCBzdG9yZSB0aGVtIGluIG5vcm1hbCBmb3JtYXQuCisJCSAqIEkgaG9wZSB0aGlzIGlzIGNvcnJlY3QuCisJCSAqLworCQlpbnQgaTsKKwkJVFJBQ0UoZnRfdF93YXJuLAorCQkgICAgICAiRm91bmQgRGl0dG8gMkdCIHRhcGUsICIKKwkJICAgICAgInRyeWluZyB0byBkZWNyeXB0IGJhZCBzZWN0b3IgbWFwIik7CisJCWZvciAoaT0yNTY7IGkgPCAyOSAqIEZUX1NFQ1RPUl9TSVpFOyBpKyspIHsKKwkJCWFkZHJlc3NbaV0gPSB+KGFkZHJlc3NbaV0gLSAoaSYweGZmKSk7CisJCX0KKwkJUFVUNChhZGRyZXNzLCAwLEZUX0hTRUdfTUFHSUMpOworCX0gZWxzZSBpZiAoR0VUNChhZGRyZXNzLCBGVF9TSUdOQVRVUkUpICE9IEZUX0hTRUdfTUFHSUMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgIndyb25nIHNpZ25hdHVyZSBpbiBoZWFkZXIgc2VnbWVudCIpOworCX0KKwlmdF9mb3JtYXRfY29kZSA9IChmdF9mb3JtYXRfdHlwZSkgYWRkcmVzc1tGVF9GTVRfQ09ERV07CisJaWYgKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9iaWcpIHsKKwkJZnRfaGVhZGVyX3NlZ21lbnRfMSAgID0gR0VUMihhZGRyZXNzLCBGVF9IU0VHXzEpOworCQlmdF9oZWFkZXJfc2VnbWVudF8yICAgPSBHRVQyKGFkZHJlc3MsIEZUX0hTRUdfMik7CisJCWZ0X2ZpcnN0X2RhdGFfc2VnbWVudCA9IEdFVDIoYWRkcmVzcywgRlRfRlJTVF9TRUcpOworCQlmdF9sYXN0X2RhdGFfc2VnbWVudCAgPSBHRVQyKGFkZHJlc3MsIEZUX0xBU1RfU0VHKTsKKwl9IGVsc2UgeworCQlmdF9oZWFkZXJfc2VnbWVudF8xICAgPSBHRVQ0KGFkZHJlc3MsIEZUXzZfSFNFR18xKTsKKwkJZnRfaGVhZGVyX3NlZ21lbnRfMiAgID0gR0VUNChhZGRyZXNzLCBGVF82X0hTRUdfMik7CisJCWZ0X2ZpcnN0X2RhdGFfc2VnbWVudCA9IEdFVDQoYWRkcmVzcywgRlRfNl9GUlNUX1NFRyk7CisJCWZ0X2xhc3RfZGF0YV9zZWdtZW50ICA9IEdFVDQoYWRkcmVzcywgRlRfNl9MQVNUX1NFRyk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaXJzdCBkYXRhIHNlZ21lbnQ6ICVkIiwgZnRfZmlyc3RfZGF0YV9zZWdtZW50KTsKKwlUUkFDRShmdF90X25vaXNlLCAibGFzdCAgZGF0YSBzZWdtZW50OiAlZCIsIGZ0X2xhc3RfZGF0YV9zZWdtZW50KTsKKwlUUkFDRShmdF90X25vaXNlLCAiaGVhZGVyIHNlZ21lbnRzIGFyZSAlZCBhbmQgJWQiLAorCSAgICAgIGZ0X2hlYWRlcl9zZWdtZW50XzEsIGZ0X2hlYWRlcl9zZWdtZW50XzIpOworCisJLyogICAgVmVyaWZ5IHRhcGUgcGFyYW1ldGVycy4uLgorCSAqICAgIFFJQy00MC84MCBzcGVjOiAgICAgICAgICAgICAgICAgdGFwZV9wYXJhbWV0ZXJzOgorCSAqCisJICogICAgc2VnbWVudHMtcGVyLXRyYWNrICAgICAgICAgICAgICBzZWdtZW50c19wZXJfdHJhY2sKKwkgKiAgICB0cmFja3MtcGVyLWNhcnRyaWRnZSAgICAgICAgICAgIHRyYWNrc19wZXJfdGFwZQorCSAqICAgIG1heC1mbG9wcHktc2lkZSAgICAgICAgICAgICAgICAgKHNlZ21lbnRzX3Blcl90cmFjayAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3NfcGVyX3RhcGUgLSAxKSAvCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfaGVhZAorCSAqICAgIG1heC1mbG9wcHktdHJhY2sgICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgLworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyIC0gMQorCSAqICAgIG1heC1mbG9wcHktc2VjdG9yICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQKKwkgKi8KKwlmdF9zZWdtZW50c19wZXJfdHJhY2sgPSBHRVQyKGFkZHJlc3MsIEZUX1NQVCk7CisJZnRfdHJhY2tzX3Blcl90YXBlICAgID0gYWRkcmVzc1tGVF9UUENdOworCW1heF9mbG9wcHlfc2lkZSAgICAgICA9IGFkZHJlc3NbRlRfRkhNXTsKKwltYXhfZmxvcHB5X3RyYWNrICAgICAgPSBhZGRyZXNzW0ZUX0ZUTV07CisJbWF4X2Zsb3BweV9zZWN0b3IgICAgID0gYWRkcmVzc1tGVF9GU01dOworCVRSQUNFKGZ0X3Rfbm9pc2UsICIoZm10L3NwdC90cGMvZmhtL2Z0bS9mc20pID0gJWQvJWQvJWQvJWQvJWQvJWQiLAorCSAgICAgIGZ0X2Zvcm1hdF9jb2RlLCBmdF9zZWdtZW50c19wZXJfdHJhY2ssIGZ0X3RyYWNrc19wZXJfdGFwZSwKKwkgICAgICBtYXhfZmxvcHB5X3NpZGUsIG1heF9mbG9wcHlfdHJhY2ssIG1heF9mbG9wcHlfc2VjdG9yKTsKKwluZXdfdGFwZV9sZW4gPSBmdGFwZV90YXBlX2xlbjsKKwlzd2l0Y2ggKGZ0X2Zvcm1hdF9jb2RlKSB7CisJY2FzZSBmbXRfNDI1ZnQ6CisJCW5ld190YXBlX2xlbiA9IDQyNTsKKwkJYnJlYWs7CisJY2FzZSBmbXRfbm9ybWFsOgorCQlpZiAoZnRhcGVfdGFwZV9sZW4gPT0gMCkgewkvKiBvdGhlcndpc2UgMzA3IGZ0ICovCisJCQluZXdfdGFwZV9sZW4gPSAyMDU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBmbXRfMTEwMGZ0OgorCQluZXdfdGFwZV9sZW4gPSAxMTAwOworCQlicmVhazsKKwljYXNlIGZtdF92YXI6eworCQkJaW50IHNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAxOwkJLyogbm9uLXplcm8gZGVmYXVsdCBmb3Igc3dpdGNoICovCisJCQlzd2l0Y2ggKGZ0X3FpY19zdGQpIHsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDNDA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDMzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDODA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDQ4ODsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDMzAxMDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gNzMwOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAxNDMwOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV3X3RhcGVfbGVuID0gKDEwMDAgKiBmdF9zZWdtZW50c19wZXJfdHJhY2sgKworCQkJCQkoc2VnbWVudHNfcGVyXzEwMDBfaW5jaCAtIDEpKSAvIHNlZ21lbnRzX3Blcl8xMDAwX2luY2g7CisJCQlicmVhazsKKwkJfQorCWNhc2UgZm10X2JpZzp7CisJCQlpbnQgc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDE7CQkvKiBub24temVybyBkZWZhdWx0IGZvciBzd2l0Y2ggKi8KKwkJCXN3aXRjaCAoZnRfcWljX3N0ZCkgeworCQkJY2FzZSBRSUNfVEFQRV9RSUM0MDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMzMyOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUM4MDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gNDg4OworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSA3MzA7CisJCQkJYnJlYWs7CisJCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDE0MzA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAorCQkJIiV4IFFJQy1zdGFuZGFyZCB3aXRoIGZtdC1jb2RlICVkLCBwbGVhc2UgcmVwb3J0IiwKKwkJCQkJICAgIGZ0X3FpY19zdGQsIGZ0X2Zvcm1hdF9jb2RlKTsKKwkJCX0KKwkJCW5ld190YXBlX2xlbiA9ICgoMTAwMCAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjayArCisJCQkJCSAoc2VnbWVudHNfcGVyXzEwMDBfaW5jaCAtIDEpKSAvIAorCQkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoKTsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgInVua25vd24gdGFwZSBmb3JtYXQsIHBsZWFzZSByZXBvcnQgISIpOworCX0KKwlpZiAobmV3X3RhcGVfbGVuICE9IGZ0YXBlX3RhcGVfbGVuKSB7CisJCWZ0YXBlX3RhcGVfbGVuID0gbmV3X3RhcGVfbGVuOworCQlUUkFDRShmdF90X2luZm8sICJjYWxjdWxhdGVkIHRhcGUgbGVuZ3RoIGlzICVkIGZ0IiwKKwkJICAgICAgZnRhcGVfdGFwZV9sZW4pOworCQlmdGFwZV9jYWxjX3RpbWVvdXRzKGZ0X3FpY19zdGQsIGZ0X2RhdGFfcmF0ZSwgZnRhcGVfdGFwZV9sZW4pOworCX0KKwlpZiAoZnRfc2VnbWVudHNfcGVyX3RyYWNrID09IDAgJiYgZnRfdHJhY2tzX3Blcl90YXBlID09IDAgJiYKKwkgICAgbWF4X2Zsb3BweV9zaWRlID09IDAgJiYgbWF4X2Zsb3BweV90cmFjayA9PSAwICYmCisJICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDApIHsKKwkJLyogIFFJQy00MCBSZXYgRSBhbmQgZWFybGllciBoYXMgbm8gdmFsdWVzIGluIHRoZSBoZWFkZXIuCisJCSAqLworCQlmdF9zZWdtZW50c19wZXJfdHJhY2sgPSA2ODsKKwkJZnRfdHJhY2tzX3Blcl90YXBlID0gMjA7CisJCW1heF9mbG9wcHlfc2lkZSA9IDE7CisJCW1heF9mbG9wcHlfdHJhY2sgPSAxNjk7CisJCW1heF9mbG9wcHlfc2VjdG9yID0gMTI4OworCX0KKwkvKiAgVGhpcyB0ZXN0IHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHdyb25nIHBhcmFtZXRlciBvbiB0YXBlcworCSAqICBmb3JtYXR0ZWQgYnkgQ29ubmVyIHNvZnR3YXJlLgorCSAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTUwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gNyAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE0OSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBmYW1vdXMgQ09OTkVSIGJ1ZzogbWF4X2Zsb3BweV9zaWRlIG9mZiBieSBvbmUgISIpOworCQltYXhfZmxvcHB5X3NpZGUgPSA2OworCX0KKwkvKiAgVGhlc2UgdGVzdHMgd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgd3JvbmcgcGFyYW1ldGVyIG9uIHRhcGVzCisJICogIGZvcm1hdHRlZCBieSBDb21CeXRlIFdpbmRvd3Mgc29mdHdhcmUuCisJICoKKwkgKiAgRmlyc3QsIGZvciAyMDUgZm9vdCB0YXBlcworCSAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTAwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gOSAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE0OSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBDb21CeXRlIGJ1ZzogbWF4X2Zsb3BweV9zaWRlIGluY29ycmVjdCEiKTsKKwkJbWF4X2Zsb3BweV9zaWRlID0gNDsKKwl9CisJLyogTmV4dCwgZm9yIDMwNyBmb290IHRhcGVzLiAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTUwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gOSAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE0OSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBDb21CeXRlIGJ1ZzogbWF4X2Zsb3BweV9zaWRlIGluY29ycmVjdCEiKTsKKwkJbWF4X2Zsb3BweV9zaWRlID0gNjsKKwl9CisJLyogIFRoaXMgdGVzdCB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSB3cm9uZyBwYXJhbWV0ZXIgb24gdGFwZXMKKwkgKiAgZm9ybWF0dGVkIGJ5IENvbG9yYWRvIFdpbmRvd3Mgc29mdHdhcmUuCisJICovCisJaWYgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayA9PSAxNTAgJiYKKwkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDI4ICYmCisJICAgIG1heF9mbG9wcHlfc2lkZSA9PSA2ICYmCisJICAgIG1heF9mbG9wcHlfdHJhY2sgPT0gMTUwICYmCisJICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDEyOCkgeworVFJBQ0UoZnRfdF9pbmZvLCAidGhlIGZhbW91cyBDb2xvcmFkbyBidWc6IG1heF9mbG9wcHlfdHJhY2sgb2ZmIGJ5IG9uZSAhIik7CisJCW1heF9mbG9wcHlfdHJhY2sgPSAxNDk7CisJfQorCWZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkID0gKChtYXhfZmxvcHB5X3NlY3Rvci9GVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSAqCisJCQkJICAgKG1heF9mbG9wcHlfdHJhY2sgKyAxKSk7CisJLyogIFRoaXMgdGVzdCB3aWxsIGNvbXBlbnNhdGUgZm9yIHNvbWUgYnVnIHJlcG9ydGVkIGJ5IERpbWEKKwkgKiAgQnJvZHNreS4gIFNlZW1zIHRvIGJlIGEgQ29sb3JhZG8gYnVnLCBlaXRoZXIuIChmcmVlYmVlCisJICogIEltYXRpb24gdGFwZSBzaGlwcGVkIHRvZ2V0aGVyIHdpdGggQ29sb3JhZG8gVDMwMDAKKwkgKi8KKwlpZiAoKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgJiYKKwkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDUwICYmCisJICAgIG1heF9mbG9wcHlfc2lkZSA9PSA1NCAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDI1NSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBmYW1vdXMgPz8/IGJ1ZzogbWF4X2Zsb3BweV90cmFjayBvZmYgYnkgb25lICEiKTsKKwkJbWF4X2Zsb3BweV90cmFjayA9IDI1NDsKKwl9CisJLyoKKwkgKiAgICBWZXJpZnkgZHJpdmVfY29uZmlndXJhdGlvbiB3aXRoIHRhcGUgcGFyYW1ldGVycworCSAqLworCWlmIChmdGFwZV9zZWdtZW50c19wZXJfaGVhZCA9PSAwIHx8IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9PSAwIHx8CisJICAoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtIDEpIC8gZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQKKwkgICAhPSBtYXhfZmxvcHB5X3NpZGUpIHx8CisJICAgIChmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAvIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAtIDEgIT0gbWF4X2Zsb3BweV90cmFjaykgfHwKKwkoZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyICogRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAhPSBtYXhfZmxvcHB5X3NlY3RvcikKKyNpZmRlZiBURVNUSU5HCisJICAgIHx8ICgoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSAmJiAKKwkJKG1heF9mbG9wcHlfdHJhY2sgIT0gMjU0IHx8IG1heF9mbG9wcHlfc2VjdG9yICE9IDEyOCkpCisjZW5kaWYKKwkgICApIHsKKwkJY2hhciBzZWdwZXJoZWFkeiA9IGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkID8gJyAnIDogJz8nOworCQljaGFyIHNlZ3BlcmN5bHogID0gZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID8gJyAnIDogJz8nOworCQlUUkFDRShmdF90X2VyciwiVGFwZSBwYXJhbWV0ZXJzIGluY29uc2lzdGVuY3ksIHBsZWFzZSByZXBvcnQiKTsKKwkJVFJBQ0UoZnRfdF9lcnIsICJyZXBvcnRlZCA9ICVkLyVkLyVkLyVkLyVkLyVkIiwKKwkJICAgICAgZnRfZm9ybWF0X2NvZGUsCisJCSAgICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywKKwkJICAgICAgZnRfdHJhY2tzX3Blcl90YXBlLAorCQkgICAgICBtYXhfZmxvcHB5X3NpZGUsCisJCSAgICAgIG1heF9mbG9wcHlfdHJhY2ssCisJCSAgICAgIG1heF9mbG9wcHlfc2VjdG9yKTsKKwkJVFJBQ0UoZnRfdF9lcnIsICJyZXF1aXJlZCA9ICVkLyVkLyVkLyVkJWMvJWQlYy8lZCIsCisJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlLAorCQkgICAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssCisJCSAgICAgIGZ0X3RyYWNrc19wZXJfdGFwZSwKKwkJICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgPworCQkgICAgICAoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtMSkgLyAKKwkJICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkICkgOgorCQkJKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtMSksCisJCQlzZWdwZXJoZWFkeiwKKwkJICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID8KKwkJICAgICAgKGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkIC8gCisJCSAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgLSAxICkgOgorCQkJZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgLSAxLAorCQkJc2VncGVyY3lseiwKKwkJICAgICAgKGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpKTsKKwkJVFJBQ0VfRVhJVCAtRUlPOworCX0KKwlmdGFwZV9leHRyYWN0X2JhZF9zZWN0b3JfbWFwKGFkZHJlc3MpOworIAlUUkFDRV9FWElUIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlmOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9GVEFQRV9SRUFEX0gKKyNkZWZpbmUgX0ZUQVBFX1JFQURfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqLworCisvKiAgICAgIGZ0YXBlLXJlYWQuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRlRfUkRfU0lOR0xFID0gMCwKKwlGVF9SRF9BSEVBRCAgPSAxLAorfSBmdF9yZWFkX21vZGVfdDsKKworZXh0ZXJuIGludCBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KF9fdTggKmFkZHJlc3MpOworZXh0ZXJuIGludCBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcyk7CitleHRlcm4gaW50IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihjb25zdCBpbnQgc2VnbWVudCwKKwkJCQkgICAgICAgdm9pZCAgKmFkZHJlc3MsIAorCQkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCisJCQkJICAgICAgIGNvbnN0IGludCBzdGFydCwKKwkJCQkgICAgICAgY29uc3QgaW50IHNpemUpOworI2RlZmluZSBmdGFwZV9yZWFkX3NlZ21lbnQoc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlKQkJCVwKKwlmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlLAlcCisJCQkJICAgIDAsIEZUX1NFR01FTlRfU0laRSkKK2V4dGVybiB2b2lkIGZ0YXBlX3phcF9yZWFkX2J1ZmZlcnModm9pZCk7CisKKyNlbmRpZgkJCQkvKiBfRlRBUEVfUkVBRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDZkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYyx2ICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqICREYXRlOiAxOTk3LzEwLzI4IDE0OjI2OjQ5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIGZvciB0aGUgc2VnbWVudCByZWFkIGFuZAorICogICAgICBzZWdtZW50IHdyaXRlIHJvdXRpbmVzIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yCisgKiAgICAgIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK2ludCBmdF9ucl9idWZmZXJzOworYnVmZmVyX3N0cnVjdCAqZnRfYnVmZmVyW0ZUX01BWF9OUl9CVUZGRVJTXTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZnRfaGVhZDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZnRfdGFpbDsJLyogbm90IHZvbGF0aWxlIGJ1dCBuZWVkIHNhbWUgdHlwZSBhcyBoZWFkICovCitpbnQgZmRjX3NldHVwX2Vycm9yOworbG9jYXRpb25fcmVjb3JkIGZ0X2xvY2F0aW9uID0gey0xLCAwfTsKK3ZvbGF0aWxlIGludCBmdGFwZV90YXBlX3J1bm5pbmc7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIGludCBvdmVycnVuX2NvdW50X29mZnNldDsKK3N0YXRpYyBpbnQgaW5oaWJpdF9jb3JyZWN0aW9uOworCisvKiAgbWF4bWltYWwgYWxsb3dlZCBvdmVyc2hvb3Qgd2hlbiBmYXN0IHNlZWtpbmcKKyAqLworI2RlZmluZSBPVkVSU0hPT1RfTElNSVQgMTAKKworLyogICAgICBJbmNyZW1lbnQgY3ljbGljIGJ1ZmZlciBuci4KKyAqLworYnVmZmVyX3N0cnVjdCAqZnRhcGVfbmV4dF9idWZmZXIoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKQoreworCXN3aXRjaCAocG9zKSB7CisJY2FzZSBmdF9xdWV1ZV9oZWFkOgorCQlpZiAoKytmdF9oZWFkID49IGZ0X25yX2J1ZmZlcnMpIHsKKwkJCWZ0X2hlYWQgPSAwOworCQl9CisJCXJldHVybiBmdF9idWZmZXJbZnRfaGVhZF07CisJY2FzZSBmdF9xdWV1ZV90YWlsOgorCQlpZiAoKytmdF90YWlsID49IGZ0X25yX2J1ZmZlcnMpIHsKKwkJCWZ0X3RhaWwgPSAwOworCQl9CisJCXJldHVybiBmdF9idWZmZXJbZnRfdGFpbF07CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQoraW50IGZ0YXBlX2J1ZmZlcl9pZChmdF9idWZmZXJfcXVldWVfdCBwb3MpCit7CisJc3dpdGNoKHBvcykgeworCWNhc2UgZnRfcXVldWVfaGVhZDogcmV0dXJuIGZ0X2hlYWQ7CisJY2FzZSBmdF9xdWV1ZV90YWlsOiByZXR1cm4gZnRfdGFpbDsKKwlkZWZhdWx0OiByZXR1cm4gLTE7CisJfQorfQorYnVmZmVyX3N0cnVjdCAqZnRhcGVfZ2V0X2J1ZmZlcihmdF9idWZmZXJfcXVldWVfdCBwb3MpCit7CisJc3dpdGNoKHBvcykgeworCWNhc2UgZnRfcXVldWVfaGVhZDogcmV0dXJuIGZ0X2J1ZmZlcltmdF9oZWFkXTsKKwljYXNlIGZ0X3F1ZXVlX3RhaWw6IHJldHVybiBmdF9idWZmZXJbZnRfdGFpbF07CisJZGVmYXVsdDogcmV0dXJuIE5VTEw7CisJfQorfQordm9pZCBmdGFwZV9yZXNldF9idWZmZXIodm9pZCkKK3sKKwlmdF9oZWFkID0gZnRfdGFpbCA9IDA7Cit9CisKK2J1ZmZlcl9zdGF0ZV9lbnVtIGZ0YXBlX3NldF9zdGF0ZShidWZmZXJfc3RhdGVfZW51bSBuZXdfc3RhdGUpCit7CisJYnVmZmVyX3N0YXRlX2VudW0gb2xkX3N0YXRlID0gZnRfZHJpdmVyX3N0YXRlOworCisJZnRfZHJpdmVyX3N0YXRlID0gbmV3X3N0YXRlOworCXJldHVybiBvbGRfc3RhdGU7Cit9CisvKiAgICAgIENhbGN1bGF0ZSBGbG9wcHkgRGlzayBDb250cm9sbGVyIGFuZCBETUEgcGFyYW1ldGVycyBmb3IgYSBzZWdtZW50LgorICogICAgICBoZWFkOiAgIHNlbGVjdHMgYnVmZmVyIHN0cnVjdCBpbiBhcnJheS4KKyAqICAgICAgb2Zmc2V0OiBudW1iZXIgb2YgcGh5c2ljYWwgc2VjdG9ycyB0byBza2lwIChpbmNsdWRpbmcgYmFkIG9uZXMpLgorICogICAgICBjb3VudDogIG51bWJlciBvZiBwaHlzaWNhbCBzZWN0b3JzIHRvIGhhbmRsZSAoaW5jbHVkaW5nIGJhZCBvbmVzKS4KKyAqLworc3RhdGljIGludCBzZXR1cF9zZWdtZW50KGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLCAKKwkJCSBpbnQgc2VnbWVudF9pZCwKKwkJCSB1bnNpZ25lZCBpbnQgc2VjdG9yX29mZnNldCwgCisJCQkgdW5zaWduZWQgaW50IHNlY3Rvcl9jb3VudCwgCisJCQkgaW50IHJldHJ5KQoreworCVNlY3Rvck1hcCBvZmZzZXRfbWFzazsKKwlTZWN0b3JNYXAgbWFzazsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJYnVmZi0+c2VnbWVudF9pZCA9IHNlZ21lbnRfaWQ7CisJYnVmZi0+c2VjdG9yX29mZnNldCA9IHNlY3Rvcl9vZmZzZXQ7CisJYnVmZi0+cmVtYWluaW5nID0gc2VjdG9yX2NvdW50OworCWJ1ZmYtPmhlYWQgPSBzZWdtZW50X2lkIC8gZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQ7CisJYnVmZi0+Y3lsID0gKHNlZ21lbnRfaWQgJSBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCkgLyBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXI7CisJYnVmZi0+c2VjdCA9IChzZWdtZW50X2lkICUgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyKSAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgKyAxOworCWJ1ZmYtPmRlbGV0ZWQgPSAwOworCW9mZnNldF9tYXNrID0gKDEgPDwgYnVmZi0+c2VjdG9yX29mZnNldCkgLSAxOworCW1hc2sgPSBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSAmIG9mZnNldF9tYXNrOworCXdoaWxlIChtYXNrKSB7CisJCWlmIChtYXNrICYgMSkgeworCQkJb2Zmc2V0X21hc2sgPj49IDE7CS8qIGRvbid0IGNvdW50IGJhZCBzZWN0b3IgKi8KKwkJfQorCQltYXNrID4+PSAxOworCX0KKwlidWZmLT5kYXRhX29mZnNldCA9IGNvdW50X29uZXMob2Zmc2V0X21hc2spOwkvKiBnb29kIHNlY3RvcnMgdG8gc2tpcCAqLworCWJ1ZmYtPnB0ciA9IGJ1ZmYtPmFkZHJlc3MgKyBidWZmLT5kYXRhX29mZnNldCAqIEZUX1NFQ1RPUl9TSVpFOworCVRSQUNFKGZ0X3RfZmxvdywgImRhdGEgb2Zmc2V0ID0gJWQgc2VjdG9ycyIsIGJ1ZmYtPmRhdGFfb2Zmc2V0KTsKKwlpZiAocmV0cnkpIHsKKwkJYnVmZi0+c29mdF9lcnJvcl9tYXAgJj0gb2Zmc2V0X21hc2s7CS8qIGtlZXAgc2tpcHBlZCBwYXJ0ICovCisJfSBlbHNlIHsKKwkJYnVmZi0+aGFyZF9lcnJvcl9tYXAgPSBidWZmLT5zb2Z0X2Vycm9yX21hcCA9IDA7CisJfQorCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID0gZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoYnVmZi0+c2VnbWVudF9pZCk7CisJaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInNlZ21lbnQ6ICVkLCBiYWQgc2VjdG9yIG1hcDogJTA4bHgiLAorCQkJYnVmZi0+c2VnbWVudF9pZCwgKGxvbmcpYnVmZi0+YmFkX3NlY3Rvcl9tYXApOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNlZ21lbnQ6ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJfQorCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0ID4gMCkgeworCQlidWZmLT5iYWRfc2VjdG9yX21hcCA+Pj0gYnVmZi0+c2VjdG9yX29mZnNldDsKKwl9CisJaWYgKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgIT0gMCB8fCBidWZmLT5yZW1haW5pbmcgIT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQlUUkFDRShmdF90X2Zsb3csICJzZWN0b3Igb2Zmc2V0ID0gJWQsIGNvdW50ID0gJWQiLAorCQkJYnVmZi0+c2VjdG9yX29mZnNldCwgYnVmZi0+cmVtYWluaW5nKTsKKwl9CisJLyogICAgU2VnbWVudHMgd2l0aCAzIG9yIGxlc3Mgc2VjdG9ycyBhcmUgbm90IHdyaXR0ZW4gd2l0aCB2YWxpZAorCSAqICAgIGRhdGEgYmVjYXVzZSB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IGZvciB0aGUgZWNjLiAgVGhlCisJICogICAgZGF0YSB3cml0dGVuIGlzIHdoYXRldmVyIGhhcHBlbnMgdG8gYmUgaW4gdGhlIGJ1ZmZlci4KKwkgKiAgICBSZWFkaW5nIHN1Y2ggYSBzZWdtZW50IHdpbGwgcmV0dXJuIGEgemVybyBieXRlLWNvdW50LgorCSAqICAgIFRvIGFsbG93IHVzIHRvIHJlYWQvd3JpdGUgc2VnbWVudHMgd2l0aCBhbGwgYmFkIHNlY3RvcnMKKwkgKiAgICB3ZSBmYWtlIG9uZSByZWFkYWJsZSBzZWN0b3IgaW4gdGhlIHNlZ21lbnQuIFRoaXMKKwkgKiAgICBwcmV2ZW50cyBoYXZpbmcgdG8gaGFuZGxlIHRoZXNlIHNlZ21lbnRzIGluIGEgdmVyeQorCSAqICAgIHNwZWNpYWwgd2F5LiAgSXQgaXMgbm90IGltcG9ydGFudCBpZiB0aGUgcmVhZGluZyBvZiB0aGlzCisJICogICAgYmFkIHNlY3RvciBmYWlscyBvciBub3QgKHRoZSBkYXRhIGlzIGlnbm9yZWQpLiBJdCBpcworCSAqICAgIG9ubHkgcmVhZCB0byBrZWVwIHRoZSBkcml2ZXIgcnVubmluZy4KKwkgKgorCSAqICAgIFRoZSBRSUMtNDAvODAgc3BlYy4gaGFzIG5vIGluZm9ybWF0aW9uIG9uIGhvdyB0byBoYW5kbGUKKwkgKiAgICB0aGlzIGNhc2UsIHNvIHRoaXMgaXMgbXkgaW50ZXJwcmV0YXRpb24uICAKKwkgKi8KKwlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gRU1QVFlfU0VHTUVOVCkgeworCQlUUkFDRShmdF90X2Zsb3csICJlbXB0eSBzZWdtZW50ICVkLCBmYWtlIGZpcnN0IHNlY3RvciBnb29kIiwKKwkJICAgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJCWlmIChidWZmLT5wdHIgIT0gYnVmZi0+YWRkcmVzcykgeworCQkJVFJBQ0UoZnRfdF9idWcsICJUaGlzIGlzIGEgYnVnOiAlcC8lcCIsCisJCQkgICAgICBidWZmLT5wdHIsIGJ1ZmYtPmFkZHJlc3MpOworCQl9CisJCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID0gRkFLRV9TRUdNRU5UOworCX0KKwlmZGNfc2V0dXBfZXJyb3IgPSAwOworCWJ1ZmYtPm5leHRfc2VnbWVudCA9IHNlZ21lbnRfaWQgKyAxOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBDYWxjdWxhdGUgRmxvcHB5IERpc2sgQ29udHJvbGxlciBhbmQgRE1BIHBhcmFtZXRlcnMgZm9yIGEgbmV3IHNlZ21lbnQuCisgKi8KK2ludCBmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChidWZmZXJfc3RydWN0ICogYnVmZiwgaW50IHNlZ21lbnRfaWQsIGludCBza2lwKQoreworCWludCByZXN1bHQgPSAwOworCXN0YXRpYyBpbnQgb2xkX3NlZ21lbnRfaWQgPSAtMTsKKwlzdGF0aWMgYnVmZmVyX3N0YXRlX2VudW0gb2xkX2Z0X2RyaXZlcl9zdGF0ZSA9IGlkbGU7CisJaW50IHJldHJ5ID0gMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCWludCBjb3VudCA9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X2Zsb3csICIlcyBzZWdtZW50ICVkIChvbGQgPSAlZCkiLAorCSAgICAgIChmdF9kcml2ZXJfc3RhdGUgPT0gcmVhZGluZyB8fCBmdF9kcml2ZXJfc3RhdGUgPT0gdmVyaWZ5aW5nKSAKKwkgICAgICA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIiwKKwkgICAgICBzZWdtZW50X2lkLCBvbGRfc2VnbWVudF9pZCk7CisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSBvbGRfZnRfZHJpdmVyX3N0YXRlKSB7CS8qIHdoZW4gdmVyaWZ5aW5nICovCisJCW9sZF9zZWdtZW50X2lkID0gLTE7CisJCW9sZF9mdF9kcml2ZXJfc3RhdGUgPSBmdF9kcml2ZXJfc3RhdGU7CisJfQorCWlmIChzZWdtZW50X2lkID09IG9sZF9zZWdtZW50X2lkKSB7CisJCSsrYnVmZi0+cmV0cnk7CisJCSsrZnRfaGlzdG9yeS5yZXRyaWVzOworCQlUUkFDRShmdF90X2Zsb3csICJzZXR0aW5nIHVwIGZvciByZXRyeSBuciAlZCIsIGJ1ZmYtPnJldHJ5KTsKKwkJcmV0cnkgPSAxOworCQlpZiAoc2tpcCAmJiBidWZmLT5za2lwID4gMCkgewkvKiBhbGxvdyBza2lwIG9uIHJldHJ5ICovCisJCQlvZmZzZXQgPSBidWZmLT5za2lwOworCQkJY291bnQgLT0gb2Zmc2V0OworCQkJVFJBQ0UoZnRfdF9mbG93LCAic2tpcHBpbmcgJWQgc2VjdG9ycyIsIG9mZnNldCk7CisJCX0KKwl9IGVsc2UgeworCQlidWZmLT5yZXRyeSA9IDA7CisJCWJ1ZmYtPnNraXAgPSAwOworCQlvbGRfc2VnbWVudF9pZCA9IHNlZ21lbnRfaWQ7CisJfQorCXJlc3VsdCA9IHNldHVwX3NlZ21lbnQoYnVmZiwgc2VnbWVudF9pZCwgb2Zmc2V0LCBjb3VudCwgcmV0cnkpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIERldGVybWluZSBzaXplIG9mIG5leHQgY2x1c3RlciBvZiBnb29kIHNlY3RvcnMuCisgKi8KK2ludCBmdGFwZV9jYWxjX25leHRfY2x1c3RlcihidWZmZXJfc3RydWN0ICogYnVmZikKK3sKKwkvKiBTa2lwIGJhZCBzZWN0b3JzLgorCSAqLworCXdoaWxlIChidWZmLT5yZW1haW5pbmcgPiAwICYmIChidWZmLT5iYWRfc2VjdG9yX21hcCAmIDEpICE9IDApIHsKKwkJYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPj49IDE7CisJCSsrYnVmZi0+c2VjdG9yX29mZnNldDsKKwkJLS1idWZmLT5yZW1haW5pbmc7CisJfQorCS8qIEZpbmQgbmV4dCBjbHVzdGVyIG9mIGdvb2Qgc2VjdG9ycworCSAqLworCWlmIChidWZmLT5iYWRfc2VjdG9yX21hcCA9PSAwKSB7CS8qIHNwZWVkIHVwICovCisJCWJ1ZmYtPnNlY3Rvcl9jb3VudCA9IGJ1ZmYtPnJlbWFpbmluZzsKKwl9IGVsc2UgeworCQlTZWN0b3JNYXAgbWFwID0gYnVmZi0+YmFkX3NlY3Rvcl9tYXA7CisKKwkJYnVmZi0+c2VjdG9yX2NvdW50ID0gMDsKKwkJd2hpbGUgKGJ1ZmYtPnNlY3Rvcl9jb3VudCA8IGJ1ZmYtPnJlbWFpbmluZyAmJiAobWFwICYgMSkgPT0gMCkgeworCQkJKytidWZmLT5zZWN0b3JfY291bnQ7CisJCQltYXAgPj49IDE7CisJCX0KKwl9CisJcmV0dXJuIGJ1ZmYtPnNlY3Rvcl9jb3VudDsKK30KKworLyogIGlmIGp1c3QgcGFzc2VkIHRoZSBsYXN0IHNlZ21lbnQgb24gYSB0cmFjaywgd2FpdCBmb3IgQk9UCisgKiAgb3IgRU9UIG1hcmsuCisgKi8KK2ludCBmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3Qodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGxvZ2ljYWxfZW90KSB7CisJCWludCBzdGF0dXM7CisKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgYXQgbG9naWNhbCBFT1QiKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnNlZWssICZzdGF0dXMpLCk7CisJCWlmICgoc3RhdHVzICYgKFFJQ19TVEFUVVNfQVRfQk9UIHwgUUlDX1NUQVRVU19BVF9FT1QpKSA9PSAwKSB7CisJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImVvdC9ib3Qgbm90IHJlYWNoZWQiKTsKKwkJfQorCQlmdF9ydW5uZXJfc3RhdHVzID0gZW5kX29mX3RhcGU7CisJfQorCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGVuZF9vZl90YXBlKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJydW5uZXIgc3RvcHBlZCBiZWNhdXNlIG9mIGxvZ2ljYWwgRU9UIik7CisJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYm90X2VvdChpbnQgc3RhdHVzKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHN0YXR1cyAmIChRSUNfU1RBVFVTX0FUX0JPVCB8IFFJQ19TVEFUVVNfQVRfRU9UKSkgeworCQlmdF9sb2NhdGlvbi5ib3QgPSAoKGZ0X2xvY2F0aW9uLnRyYWNrICYgMSkgPT0gMCA/CisJCQkJKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfQk9UKSAhPSAwOgorCQkJCShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0VPVCkgIT0gMCk7CisJCWZ0X2xvY2F0aW9uLmVvdCA9ICFmdF9sb2NhdGlvbi5ib3Q7CisJCWZ0X2xvY2F0aW9uLnNlZ21lbnQgPSAoZnRfbG9jYXRpb24udHJhY2sgKworCQkJKGZ0X2xvY2F0aW9uLmJvdCA/IDAgOiAxKSkgKiBmdF9zZWdtZW50c19wZXJfdHJhY2sgLSAxOworCQlmdF9sb2NhdGlvbi5zZWN0b3IgPSAtMTsKKwkJZnRfbG9jYXRpb24ua25vd24gID0gMTsKKwkJVFJBQ0UoZnRfdF9mbG93LCAidGFwZSBhdCBsb2dpY2FsICVzIiwKKwkJICAgICAgZnRfbG9jYXRpb24uYm90ID8gImJvdCIgOiAiZW90Iik7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNlZ21lbnQgPSAlZCIsIGZ0X2xvY2F0aW9uLnNlZ21lbnQpOworCX0gZWxzZSB7CisJCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKKwl9CisJVFJBQ0VfRVhJVCBmdF9sb2NhdGlvbi5rbm93bjsKK30KKworLyogICAgICBSZWFkIElkIG9mIGZpcnN0IHNlY3RvciBwYXNzaW5nIHRhcGUgaGVhZC4KKyAqLworc3RhdGljIGludCBmdGFwZV9yZWFkX2lkKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlfX3U4IG91dFsyXTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogQXNzdW1lIHRhcGUgaXMgcnVubmluZyBvbiBlbnRyeSwgYmUgYWJsZSB0byBoYW5kbGUKKwkgKiBzaXR1YXRpb24gd2hlcmUgaXQgc3RvcHBlZCBvciBpcyBzdG9wcGluZy4KKwkgKi8KKwlmdF9sb2NhdGlvbi5rbm93biA9IDA7CS8qIGRlZmF1bHQgaXMgbG9jYXRpb24gbm90IGtub3duICovCisJb3V0WzBdID0gRkRDX1JFQURJRDsKKwlvdXRbMV0gPSBmdF9kcml2ZV9zZWw7CisJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQob3V0LCAyKSwpOworCXN3aXRjaCAoZmRjX2ludGVycnVwdF93YWl0KDIwICogRlRfU0VDT05EKSkgeworCWNhc2UgMDoKKwkJaWYgKGZkY19zZWN0ID09IDApIHsKKwkJCWlmIChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpID49IDAgJiYKKwkJCSAgICAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkpIHsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJCVRSQUNFKGZ0X3RfZmxvdywgInRhcGUgaGFzIHN0b3BwZWQiKTsKKwkJCQljaGVja19ib3RfZW90KHN0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmdF9sb2NhdGlvbi5rbm93biA9IDE7CisJCQlmdF9sb2NhdGlvbi5zZWdtZW50ID0gKGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkCisJCQkJCSAgICAgICAqIGZkY19oZWFkCisJCQkJCSAgICAgICArIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlcgorCQkJCQkgICAgICAgKiBmZGNfY3lsCisJCQkJCSAgICAgICArIChmZGNfc2VjdCAtIDEpCisJCQkJCSAgICAgICAvIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpOworCQkJZnRfbG9jYXRpb24uc2VjdG9yID0gKChmZGNfc2VjdCAtIDEpCisJCQkJCSAgICAgICUgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCk7CisJCQlmdF9sb2NhdGlvbi5lb3QgPSBmdF9sb2NhdGlvbi5ib3QgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgLUVUSU1FOgorCQkvKiAgRGlkbid0IGZpbmQgaWQgb24gdGFwZSwgbXVzdCBiZSBuZWFyIGVuZDogV2FpdAorCQkgKiAgdW50aWwgc3RvcHBlZC4KKwkJICovCisJCWlmIChmdGFwZV9yZWFkeV93YWl0KEZUX0ZPUkVWRVIsICZzdGF0dXMpID49IDApIHsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJCQlUUkFDRShmdF90X2Zsb3csICJ0YXBlIGhhcyBzdG9wcGVkIik7CisJCQljaGVja19ib3RfZW90KHN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogIEludGVycnVwdGVkIG9yIG90aGVyd2lzZSBmYWlsaW5nCisJCSAqICBmZGNfaW50ZXJydXB0X3dhaXQoKSAKKwkJICovCisJCVRSQUNFKGZ0X3RfZXJyLCAiZmRjX2ludGVycnVwdF93YWl0IGZhaWxlZCIpOworCQlicmVhazsKKwl9CisJaWYgKCFmdF9sb2NhdGlvbi5rbm93bikgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2Zsb3csICJubyBpZCBmb3VuZCIpOworCX0KKwlpZiAoZnRfbG9jYXRpb24uc2VjdG9yID09IDApIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAicGFzc2luZyBzZWdtZW50ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2ZkY19kbWEsICJwYXNzaW5nIHNlZ21lbnQgJWQvJWQiLAorCQkgICAgICBmdF9sb2NhdGlvbi5zZWdtZW50LCBmdF9sb2NhdGlvbi5zZWN0b3IpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9naWNhbF9mb3J3YXJkKHZvaWQpCit7CisJZnRhcGVfdGFwZV9ydW5uaW5nID0gMTsKKwlyZXR1cm4gZnRhcGVfY29tbWFuZChRSUNfTE9HSUNBTF9GT1JXQVJEKTsKK30KKworaW50IGZ0YXBlX3N0b3BfdGFwZShpbnQgKnBzdGF0dXMpCit7CisJaW50IHJldHJ5ID0gMDsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZG8geworCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1NUT1BfVEFQRSwKKwkJCQkJICAgIGZ0YXBlX3RpbWVvdXQuc3RvcCwgcHN0YXR1cyk7CisJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJaWYgKCgqcHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpID09IDApIHsKKwkJCQlyZXN1bHQgPSAtRUlPOworCQkJfSBlbHNlIHsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJfQorCQl9CisJfSB3aGlsZSAocmVzdWx0IDwgMCAmJiArK3JldHJ5IDw9IDMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZmFpbGVkICEgKGZhdGFsKSIpOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworaW50IGZ0YXBlX2R1bWJfc3RvcCh2b2lkKQoreworCWludCByZXN1bHQ7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qICBBYm9ydCBjdXJyZW50IGZkYyBvcGVyYXRpb24gaWYgaXQncyBidXN5IChwcm9iYWJseSByZWFkCisJICogIG9yIHdyaXRlIG9wZXJhdGlvbiBwZW5kaW5nKSB3aXRoIGEgcmVzZXQuCisJICovCisJaWYgKGZkY19yZWFkeV93YWl0KDEwMCAvKiB1c2VjICovKSA8IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImFib3J0aW5nIGZkYyBvcGVyYXRpb24iKTsKKwkJZmRjX3Jlc2V0KCk7CisJfQorCS8qICBSZWFkaW5nIGlkJ3MgYWZ0ZXIgdGhlIGxhc3Qgc2VnbWVudCBvbiBhIHRyYWNrIG1heSBmYWlsCisJICogIGJ1dCBldmVudHVhbGx5IHRoZSBkcml2ZSB3aWxsIGJlY29tZSByZWFkeSAobG9naWNhbCBlb3QpLgorCSAqLworCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyk7CisJZnRfbG9jYXRpb24ua25vd24gPSAwOworCWRvIHsKKwkJaWYgKHJlc3VsdCA9PSAwICYmIHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpIHsKKwkJCS8qIFRhcGUgaXMgbm90IHJ1bm5pbmcgYW55IG1vcmUuCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIGFscmVhZHkgaGFsdGVkIik7CisJCQljaGVja19ib3RfZW90KHN0YXR1cyk7CisJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQl9IGVsc2UgaWYgKGZ0YXBlX3RhcGVfcnVubmluZykgeworCQkJLyogIFRhcGUgaXMgKHdhcykgc3RpbGwgbW92aW5nLgorCQkJICovCisjaWZkZWYgVEVTVElORworCQkJZnRhcGVfcmVhZF9pZCgpOworI2VuZGlmCisJCQlyZXN1bHQgPSBmdGFwZV9zdG9wX3RhcGUoJnN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQkvKiAgVGFwZSBub3QgeWV0IHJlYWR5IGJ1dCBzdG9wcGVkLgorCQkJICovCisJCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsJnN0YXR1cyk7CisJCX0KKwl9IHdoaWxlIChmdGFwZV90YXBlX3J1bm5pbmcKKwkJICYmICEoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBfTkVWRVJfQkxPQ0spKSk7CisjaWZuZGVmIFRFU1RJTkcKKwlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisjZW5kaWYKKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fCBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBXYWl0IHVudGlsIHJ1bm5lciBoYXMgZmluaXNoZWQgdGFpbCBidWZmZXIuCisgKgorICovCitpbnQgZnRhcGVfd2FpdF9zZWdtZW50KGJ1ZmZlcl9zdGF0ZV9lbnVtIHN0YXRlKQoreworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl3aGlsZSAoZnRfYnVmZmVyW2Z0X3RhaWxdLT5zdGF0dXMgPT0gc3RhdGUpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic3RhdGU6ICVkIiwgZnRfYnVmZmVyW2Z0X3RhaWxdLT5zdGF0dXMpOworCQkvKiAgRmlyc3QgYnVmZmVyIHN0aWxsIGJlaW5nIHdvcmtlZCBvbiwgd2FpdCB1cCB0byB0aW1lb3V0LgorCQkgKgorCQkgKiAgTm90ZTogd2UgY2hlY2sgdHdvIHRpbWVzIGZvciBiZWluZyBraWxsZWQuIDUwCisJCSAqICBzZWNvbmRzIGFyZSBxdWl0ZSBsb25nLiBOb3RlIHRoYXQKKwkJICogIGZkY19pbnRlcnJ1cHRfd2FpdCgpIGlzIG5vdCBraWxsYWJsZSBieSBhbnkKKwkJICogIG1lYW5zLiBmdGFwZV9yZWFkX3NlZ21lbnQoKSB3YW50cyB1cyB0byByZXR1cm4KKwkJICogIC1FSU5UUiBpbiBjYXNlIG9mIGEgc2lnbmFsLiAgCisJCSAqLworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCXJlc3VsdCA9IGZkY19pbnRlcnJ1cHRfd2FpdCg1MCAqIEZUX1NFQ09ORCk7CisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFX0FCT1JUKHJlc3VsdCwKKwkJCQkgICAgZnRfdF9lcnIsICJmZGNfaW50ZXJydXB0X3dhaXQgZmFpbGVkIik7CisJCX0KKwkJaWYgKGZkY19zZXR1cF9lcnJvcikgeworCQkJLyogcmVjb3Zlci4uLiBGSVhNRSAqLworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJzZXR1cCBlcnJvciIpOworCQl9CisJfQorCWlmIChmdF9idWZmZXJbZnRfdGFpbF0tPnN0YXR1cyAhPSBlcnJvcikgeworCQlUUkFDRV9FWElUIDA7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwlUUkFDRShmdF90X25vaXNlLCAiZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1czogMHglMDJ4Iiwgc3RhdHVzKTsKKwlpZiAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpICYmIAorCSAgICAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikpIHsKKwkJdW5zaWduZWQgaW50IGVycm9yOworCQlxaWMxMTdfY21kX3QgY29tbWFuZDsKKwkJCisJCS8qICBSZXBvcnQgYW5kIGNsZWFyIGVycm9yIHN0YXRlLgorCQkgKiAgSW4gY2FzZSB0aGUgZHJpdmUgY2FuJ3Qgb3BlcmF0ZSBhdCB0aGUgc2VsZWN0ZWQKKwkJICogIHJhdGUsIHNlbGVjdCB0aGUgbmV4dCBsb3dlciBkYXRhIHJhdGUuCisJCSAqLworCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7CisJCWlmIChlcnJvciA9PSAzMSAmJiBjb21tYW5kID09IFFJQ19MT0dJQ0FMX0ZPUldBUkQpIHsKKwkJCS8qIGRyaXZlIGRvZXMgbm90IGFjY2VwdCB0aGlzIGRhdGEgcmF0ZSAqLworCQkJaWYgKGZ0X2RhdGFfcmF0ZSA+IDI1MCkgeworCQkJCVRSQUNFKGZ0X3RfaW5mbywKKwkJCQkgICAgICAiUHJvYmFibGUgZGF0YSByYXRlIGNvbmZsaWN0Iik7CisJCQkJVFJBQ0UoZnRfdF9pbmZvLAorCQkJCSAgICAgICJMb3dlcmluZyBkYXRhIHJhdGUgdG8gJWQgS2JwcyIsCisJCQkJICAgICAgZnRfZGF0YV9yYXRlIC8gMik7CisJCQkJZnRhcGVfaGFsZl9kYXRhX3JhdGUoKTsKKwkJCQlpZiAoZnRfYnVmZmVyW2Z0X3RhaWxdLT5yZXRyeSA+IDApIHsKKwkJCQkJLyogZ2l2ZSBpdCBhIGNoYW5jZSAqLworCQkJCQktLWZ0X2J1ZmZlcltmdF90YWlsXS0+cmV0cnk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBubyByYXRlIGlzIGFjY2VwdGVkLi4uICovCisJCQkJVFJBQ0UoZnRfdF9lcnIsICJXZSdyZSBkZWFkIDooIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2VyciwgIlVua25vd24gZXJyb3IiKTsKKwkJfQorCQlUUkFDRV9FWElUIC1FSU87ICAgLyogZy5wLiBlcnJvciAqLworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIGZvcndhcmQgKi8gc3RhdGljIGludCBzZWVrX2ZvcndhcmQoaW50IHNlZ21lbnRfaWQsIGludCBmYXN0KTsKKworc3RhdGljIGludCBmYXN0X3NlZWsoaW50IGNvdW50LCBpbnQgcmV2ZXJzZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGNvdW50ID4gMCkgeworCQkvKiAgSWYgcG9zaXRpb25lZCBhdCBiZWdpbiBvciBlbmQgb2YgdGFwZSwgZmFzdCBzZWVraW5nIG5lZWRzCisJCSAqICBzcGVjaWFsIHRyZWF0bWVudC4KKwkJICogIFN0YXJ0aW5nIGZyb20gbG9naWNhbCBib3QgbmVlZHMgYSAoc2xvdykgc2VlayB0byB0aGUgZmlyc3QKKwkJICogIHNlZ21lbnQgYmVmb3JlIHRoZSBoaWdoIHNwZWVkIHNlZWsuIE1vc3QgZHJpdmVzIGRvIHRoaXMKKwkJICogIGF1dG9tYXRpY2FsbHkgYnV0IHNvbWUgb2xkZXIgZG9uJ3QsIHNvIHdlIHRyZWF0IHRoZW0KKwkJICogIGFsbCB0aGUgc2FtZS4KKwkJICogIFN0YXJ0aW5nIGZyb20gbG9naWNhbCBlb3QgaXMgZXZlbiBtb3JlIGRpZmZpY3VsdCBiZWNhdXNlCisJCSAqICB3ZSBjYW5ub3QgKHNsb3cpIHJldmVyc2Ugc2VlayB0byB0aGUgbGFzdCBzZWdtZW50LgorCQkgKiAgVE8gQkUgSU1QTEVNRU5URUQuCisJCSAqLworCQlpbmhpYml0X2NvcnJlY3Rpb24gPSAwOworCQlpZiAoZnRfbG9jYXRpb24ua25vd24gJiYKKwkJICAgICgoZnRfbG9jYXRpb24uYm90ICYmICFyZXZlcnNlKSB8fAorCQkgICAgIChmdF9sb2NhdGlvbi5lb3QgJiYgcmV2ZXJzZSkpKSB7CisJCQlpZiAoIXJldmVyc2UpIHsKKwkJCQkvKiAgKHNsb3cpIHNraXAgdG8gZmlyc3Qgc2VnbWVudCBvbiBhIHRyYWNrCisJCQkJICovCisJCQkJc2Vla19mb3J3YXJkKGZ0X2xvY2F0aW9uLnRyYWNrICogZnRfc2VnbWVudHNfcGVyX3RyYWNrLCAwKTsKKwkJCQktLWNvdW50OworCQkJfSBlbHNlIHsKKwkJCQkvKiAgV2hlbiBzZWVraW5nIGJhY2t3YXJkcyBmcm9tCisJCQkJICogIGVuZC1vZi10YXBlIHRoZSBudW1iZXIgb2YgZXJhc2VkCisJCQkJICogIGdhcHMgZm91bmQgc2VlbXMgdG8gYmUgaGlnaGVyIHRoYW4KKwkJCQkgKiAgZXhwZWN0ZWQuICBUaGVyZWZvciB0aGUgZHJpdmUgbXVzdAorCQkJCSAqICBza2lwIHNvbWUgbW9yZSBzZWdtZW50cyB0aGFuCisJCQkJICogIGNhbGN1bGF0ZWQsIGJ1dCB3ZSBkb24ndCBrbm93IGhvdworCQkJCSAqICBtYW55LiAgVGh1cyB3ZSB3aWxsIHByZXZlbnQgdGhlCisJCQkJICogIHJlLWNhbGN1bGF0aW9uIG9mIG9mZnNldCBhbmQKKwkJCQkgKiAgb3ZlcnNob290IHdoZW4gc2Vla2luZyBiYWNrd2FyZHMuCisJCQkJICovCisJCQkJaW5oaWJpdF9jb3JyZWN0aW9uID0gMTsKKwkJCQljb3VudCArPSAzOwkvKiBiZXN0IGd1ZXNzICovCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2Zsb3csICJ3YXJuaW5nOiB6ZXJvIG9yIG5lZ2F0aXZlIGNvdW50OiAlZCIsIGNvdW50KTsKKwl9CisJaWYgKGNvdW50ID4gMCkgeworCQlpbnQgaTsKKwkJaW50IG5pYmJsZXMgPSBjb3VudCA+IDI1NSA/IDMgOiAyOworCisJCWlmIChjb3VudCA+IDQwOTUpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJza2lwcGluZyBjbGlwcGVkIGF0IDQwOTUgc2VnbWVudCIpOworCQkJY291bnQgPSA0MDk1OworCQl9CisJCS8qIElzc3VlIHRoaXMgdGFwZSBjb21tYW5kIGZpcnN0LiAqLworCQlpZiAoIXJldmVyc2UpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJza2lwcGluZyAlZCBzZWdtZW50KHMpIiwgY291bnQpOworCQkJcmVzdWx0ID0gZnRhcGVfY29tbWFuZChuaWJibGVzID09IDMgPworCQkJICAgUUlDX1NLSVBfRVhURU5ERURfRk9SV0FSRCA6IFFJQ19TS0lQX0ZPUldBUkQpOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImJhY2tpbmcgdXAgJWQgc2VnbWVudChzKSIsIGNvdW50KTsKKwkJCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmQobmliYmxlcyA9PSAzID8KKwkJCSAgIFFJQ19TS0lQX0VYVEVOREVEX1JFVkVSU0UgOiBRSUNfU0tJUF9SRVZFUlNFKTsKKwkJfQorCQlpZiAocmVzdWx0IDwgMCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIlNraXAgY29tbWFuZCBmYWlsZWQiKTsKKwkJfSBlbHNlIHsKKwkJCS0tY291bnQ7CS8qIDAgbWVhbnMgb25lIGdhcCBldGMuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbmliYmxlczsgKytpKSB7CisJCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJCXJlc3VsdCA9IGZ0YXBlX3BhcmFtZXRlcihjb3VudCAmIDE1KTsKKwkJCQkJY291bnQgLz0gMTY7CisJCQkJfQorCQkJfQorCQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJld2luZCwgJnN0YXR1cyk7CisJCQlpZiAocmVzdWx0ID49IDApIHsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJfQorCQl9CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlKGludCBpZCkKK3sKKwkvKiBDaGVjayB0byBzZWUgaWYgcG9zaXRpb24gZm91bmQgaXMgb2ZmLXRyYWNrIGFzIHJlcG9ydGVkCisJICogIG9uY2UuICBCZWNhdXNlIGFsbCB0cmFja3MgaW4gb25lIGRpcmVjdGlvbiBsaWUgbmV4dCB0bworCSAqICBlYWNoIG90aGVyLCBpZiBvZmYtdHJhY2sgdGhlIGVycm9yIHdpbGwgYmUgYXBwcm94aW1hdGVseQorCSAqICAyICogZnRfc2VnbWVudHNfcGVyX3RyYWNrLgorCSAqLworCWlmIChmdF9sb2NhdGlvbi50cmFjayA9PSAtMSkgeworCQlyZXR1cm4gMTsgLyogdW5mb3JzZWVuIHNpdHVhdGlvbiwgZG9uJ3QgZ2VuZXJhdGUgZXJyb3IgKi8KKwl9IGVsc2UgeworCQkvKiBVc2UgbWFyZ2luIG9mIGZ0X3NlZ21lbnRzX3Blcl90cmFjayBvbiBib3RoIHNpZGVzCisJCSAqIGJlY2F1c2UgZnRhcGUgbmVlZHMgc29tZSBtYXJnaW4gYW5kIHRoZSBlcnJvciB3ZSdyZQorCQkgKiBsb29raW5nIGZvciBpcyBtdWNoIGxhcmdlciAhCisJCSAqLworCQlpbnQgbG8gPSAoZnRfbG9jYXRpb24udHJhY2sgLSAxKSAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjazsKKwkJaW50IGhpID0gKGZ0X2xvY2F0aW9uLnRyYWNrICsgMikgKiBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisKKwkJcmV0dXJuIChpZCA+PSBsbyAmJiBpZCA8IGhpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2Vla19mb3J3YXJkKGludCBzZWdtZW50X2lkLCBpbnQgZmFzdCkKK3sKKwlpbnQgZmFpbHVyZXMgPSAwOworCWludCBjb3VudDsKKwlzdGF0aWMgaW50IG1hcmdpbiA9IDE7CS8qIGZpeGVkOiBzdG9wIHRoaXMgYmVmb3JlIHRhcmdldCAqLworCXN0YXRpYyBpbnQgb3ZlcnNob290ID0gMTsKKwlzdGF0aWMgaW50IG1pbl9jb3VudCA9IDg7CisJaW50IGV4cGVjdGVkID0gLTE7CisJaW50IHRhcmdldCA9IHNlZ21lbnRfaWQgLSBtYXJnaW47CisJaW50IGZhc3Rfc2Vla2luZzsKKwlpbnQgcHJldl9zZWdtZW50ID0gZnRfbG9jYXRpb24uc2VnbWVudDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhdGFsOiBjYW5ub3Qgc2VlayBmcm9tIHVua25vd24gbG9jYXRpb24iKTsKKwl9CisJaWYgKCF2YWxpZGF0ZShzZWdtZW50X2lkKSkgeworCQlmdGFwZV9zbGVlcCgxICogRlRfU0VDT05EKTsKKwkJZnRfZmFpbHVyZSA9IDE7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYXRhbDogaGVhZCBvZmYgdHJhY2sgKGJhZCBoYXJkd2FyZT8pIik7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmcm9tICVkLyVkIHRvICVkLzAgLSAlZCIsCisJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yLHNlZ21lbnRfaWQsbWFyZ2luKTsKKwljb3VudCA9IHRhcmdldCAtIGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSBvdmVyc2hvb3Q7CisJZmFzdF9zZWVraW5nID0gKGZhc3QgJiYKKwkJCWNvdW50ID4gKG1pbl9jb3VudCArIChmdF9sb2NhdGlvbi5ib3QgPyAxIDogMCkpKTsKKwlpZiAoZmFzdF9zZWVraW5nKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmYXN0IHNraXBwaW5nICVkIHNlZ21lbnRzIiwgY291bnQpOworCQlleHBlY3RlZCA9IHNlZ21lbnRfaWQgLSBtYXJnaW47CisJCWZhc3Rfc2Vlayhjb3VudCwgMCk7CisJfQorCWlmICghZnRhcGVfdGFwZV9ydW5uaW5nKSB7CisJCWxvZ2ljYWxfZm9yd2FyZCgpOworCX0KKwl3aGlsZSAoZnRfbG9jYXRpb24uc2VnbWVudCA8IHNlZ21lbnRfaWQpIHsKKwkJLyogIFRoaXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlY3RvciBpbiBhIChiYWQpIHNlZ21lbnQgdG8KKwkJICogIGhhdmUgYSB2YWxpZCBhbmQgcmVhZGFibGUgc2VjdG9yIGlkICEKKwkJICogIEl0IGxvb2tzIGxpa2UgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCwgc28gd2UgbXVzdCB0cnkKKwkJICogIHRvIGZpbmQgYSB3YXkgdG8gc2tpcCBhbiBFTVBUWV9TRUdNRU5ULiAhISEgRklYTUUgISEhCisJCSAqLworCQlpZiAoZnRhcGVfcmVhZF9pZCgpIDwgMCB8fCAhZnRfbG9jYXRpb24ua25vd24gfHwKKwkJICAgIHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spKSB7CisJCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisJCQlpZiAoIWZ0YXBlX3RhcGVfcnVubmluZyB8fAorCQkJICAgICsrZmFpbHVyZXMgPiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJCSAgICAicmVhZF9pZCBmYWlsZWQgY29tcGxldGVseSIpOworCQkJfQorCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkJVFJBQ0UoZnRfdF9mbG93LCAicmVhZF9pZCBmYWlsZWQsIHJldHJ5ICglZCkiLAorCQkJICAgICAgZmFpbHVyZXMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZhc3Rfc2Vla2luZykgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVuZGVkIGF0ICVkLyVkICglZCwlZCkiLAorCQkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yLAorCQkJICAgICAgb3ZlcnNob290LCBpbmhpYml0X2NvcnJlY3Rpb24pOworCQkJaWYgKCFpbmhpYml0X2NvcnJlY3Rpb24gJiYKKwkJCSAgICAoZnRfbG9jYXRpb24uc2VnbWVudCA8IGV4cGVjdGVkIHx8CisJCQkgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBleHBlY3RlZCArIG1hcmdpbikpIHsKKwkJCQlpbnQgZXJyb3IgPSBmdF9sb2NhdGlvbi5zZWdtZW50IC0gZXhwZWN0ZWQ7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiYWRqdXN0aW5nIG92ZXJzaG9vdCBmcm9tICVkIHRvICVkIiwKKwkJCQkgICAgICBvdmVyc2hvb3QsIG92ZXJzaG9vdCArIGVycm9yKTsKKwkJCQlvdmVyc2hvb3QgKz0gZXJyb3I7CisJCQkJLyogIEFsbCBvdmVyc2hvb3RzIGhhdmUgdGhlIHNhbWUKKwkJCQkgKiAgZGlyZWN0aW9uLCBzbyBpdCBzaG91bGQgbmV2ZXIKKwkJCQkgKiAgYmVjb21lIG5lZ2F0aXZlLCBidXQgd2hvIGtub3dzLgorCQkJCSAqLworCQkJCWlmIChvdmVyc2hvb3QgPCAtNSB8fAorCQkJCSAgICBvdmVyc2hvb3QgPiBPVkVSU0hPT1RfTElNSVQpIHsKKwkJCQkJaWYgKG92ZXJzaG9vdCA8IDApIHsKKwkJCQkJCS8qIGtlZXAgc2FuZSB2YWx1ZSAqLworCQkJCQkJb3ZlcnNob290ID0gLTU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KKwkJCQkJCW92ZXJzaG9vdCA9IE9WRVJTSE9PVF9MSU1JVDsKKwkJCQkJfQorCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAiY2xpcHBlZCBvdmVyc2hvb3QgdG8gJWQiLAorCQkJCQkgICAgICBvdmVyc2hvb3QpOworCQkJCX0KKwkJCX0KKwkJCWZhc3Rfc2Vla2luZyA9IDA7CisJCX0KKwkJaWYgKGZ0X2xvY2F0aW9uLmtub3duKSB7CisJCQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCA+IHByZXZfc2VnbWVudCArIDEpIHsKKwkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCSAgICAgICJtaXNzZWQgc2VnbWVudCAlZCB3aGlsZSBza2lwcGluZyIsCisJCQkJICAgICAgcHJldl9zZWdtZW50ICsgMSk7CisJCQl9CisJCQlwcmV2X3NlZ21lbnQgPSBmdF9sb2NhdGlvbi5zZWdtZW50OworCQl9CisJfQorCWlmIChmdF9sb2NhdGlvbi5zZWdtZW50ID4gc2VnbWVudF9pZCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLAorCQkJICAgIGZ0X3Rfbm9pc2UsICJmYWlsZWQ6IHNraXAgZW5kZWQgYXQgc2VnbWVudCAlZC8lZCIsCisJCQkgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IHNraXBfcmV2ZXJzZShpbnQgc2VnbWVudF9pZCwgaW50ICpwc3RhdHVzKQoreworCWludCBmYWlsdXJlcyA9IDA7CisJc3RhdGljIGludCBvdmVyc2hvb3QgPSAxOworCXN0YXRpYyBpbnQgbWluX3Jld2luZCA9IDI7CS8qIDEgKyBvdmVyc2hvb3QgKi8KKwlzdGF0aWMgY29uc3QgaW50IG1hcmdpbiA9IDE7CS8qIHN0b3AgdGhpcyBiZWZvcmUgdGFyZ2V0ICovCisJaW50IGV4cGVjdGVkID0gMDsKKwlpbnQgY291bnQgPSAxOworCWludCBzaG9ydF9zZWVrOworCWludCB0YXJnZXQgPSBzZWdtZW50X2lkIC0gbWFyZ2luOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGZ0X2xvY2F0aW9uLmtub3duICYmICF2YWxpZGF0ZShzZWdtZW50X2lkKSkgeworCQlmdGFwZV9zbGVlcCgxICogRlRfU0VDT05EKTsKKwkJZnRfZmFpbHVyZSA9IDE7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYXRhbDogaGVhZCBvZmYgdHJhY2sgKGJhZCBoYXJkd2FyZT8pIik7CisJfQorCWRvIHsKKwkJaWYgKCFmdF9sb2NhdGlvbi5rbm93bikgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAid2FybmluZzogbG9jYXRpb24gbm90IGtub3duIik7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImZyb20gJWQvJWQgdG8gJWQvMCAtICVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yLAorCQkgICAgICBzZWdtZW50X2lkLCBtYXJnaW4pOworCQkvKiAgbWluX3Jld2luZCA9PSAxICsgb3ZlcnNob290X3doZW5fZG9pbmdfbWluaW11bV9yZXdpbmQKKwkJICogIG92ZXJzaG9vdCAgPT0gb3ZlcnNob290X3doZW5fZG9pbmdfbGFyZ2VyX3Jld2luZAorCQkgKiAgSW5pdGlhbGx5IG1pbl9yZXdpbmQgPT0gMSArIG92ZXJzaG9vdCwgb3B0aW1pemF0aW9uCisJCSAqICBvZiBib3RoIHZhbHVlcyB3aWxsIGJlIGRvbmUgc2VwYXJhdGVseS4KKwkJICogIG92ZXJzaG9vdCBhbmQgbWluX3Jld2luZCBjYW4gYmUgbmVnYXRpdmUgYXMgYm90aCBhcmUKKwkJICogIHN1bXMgb2YgdGhyZWUgY29tcG9uZW50czoKKwkJICogIGFueV9vdmVyc2hvb3QgPT0gcmV3aW5kX292ZXJzaG9vdCAtIAorCQkgKiAgICAgICAgICAgICAgICAgICBzdG9wX292ZXJzaG9vdCAgIC0KKwkJICogICAgICAgICAgICAgICAgICAgc3RhcnRfb3ZlcnNob290CisJCSAqLworCQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCAtIHRhcmdldCAtIChtaW5fcmV3aW5kIC0gMSkgPCAxKSB7CisJCQlzaG9ydF9zZWVrID0gMTsKKwkJfSBlbHNlIHsKKwkJCWNvdW50ID0gZnRfbG9jYXRpb24uc2VnbWVudCAtIHRhcmdldCAtIG92ZXJzaG9vdDsKKwkJCXNob3J0X3NlZWsgPSAoY291bnQgPCAxKTsKKwkJfQorCQlpZiAoc2hvcnRfc2VlaykgeworCQkJY291bnQgPSAxOwkvKiBkbyBzaG9ydGVzdCByZXdpbmQgKi8KKwkJCWV4cGVjdGVkID0gZnRfbG9jYXRpb24uc2VnbWVudCAtIG1pbl9yZXdpbmQ7CisJCQlpZiAoZXhwZWN0ZWQvZnRfc2VnbWVudHNfcGVyX3RyYWNrICE9IGZ0X2xvY2F0aW9uLnRyYWNrKSB7CisJCQkJZXhwZWN0ZWQgPSAoZnRfbG9jYXRpb24udHJhY2sgKiAKKwkJCQkJICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjayk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9IHRhcmdldDsKKwkJfQorCQlmYXN0X3NlZWsoY291bnQsIDEpOworCQlsb2dpY2FsX2ZvcndhcmQoKTsKKwkJaWYgKGZ0YXBlX3JlYWRfaWQoKSA8IDAgfHwgIWZ0X2xvY2F0aW9uLmtub3duIHx8CisJCSAgICAoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBfRE9OVF9CTE9DSykpKSB7CisJCQlpZiAoKCFmdGFwZV90YXBlX3J1bm5pbmcgJiYgIWZ0X2xvY2F0aW9uLmtub3duKSB8fAorCQkJICAgICsrZmFpbHVyZXMgPiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJCSAgICAicmVhZF9pZCBmYWlsZWQgY29tcGxldGVseSIpOworCQkJfQorCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cyhwc3RhdHVzKSwpOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImZ0YXBlX3JlYWRfaWQgZmFpbGVkLCByZXRyeSAoJWQpIiwKKwkJCSAgICAgIGZhaWx1cmVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbmRlZCBhdCAlZC8lZCAoJWQsJWQsJWQpIiwgCisJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvciwKKwkJICAgICAgbWluX3Jld2luZCwgb3ZlcnNob290LCBpbmhpYml0X2NvcnJlY3Rpb24pOworCQlpZiAoIWluaGliaXRfY29ycmVjdGlvbiAmJgorCQkgICAgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCBleHBlY3RlZCB8fAorCQkgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBleHBlY3RlZCArIG1hcmdpbikpIHsKKwkJCWludCBlcnJvciA9IGV4cGVjdGVkIC0gZnRfbG9jYXRpb24uc2VnbWVudDsKKwkJCWlmIChzaG9ydF9zZWVrKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiYWRqdXN0aW5nIG1pbl9yZXdpbmQgZnJvbSAlZCB0byAlZCIsCisJCQkJICAgICAgbWluX3Jld2luZCwgbWluX3Jld2luZCArIGVycm9yKTsKKwkJCQltaW5fcmV3aW5kICs9IGVycm9yOworCQkJCWlmIChtaW5fcmV3aW5kIDwgLTUpIHsKKwkJCQkJLyogaXMgdGhpcyByaWdodCA/IEZJWE1FICEgKi8KKwkJCQkJLyoga2VlcCBzYW5lIHZhbHVlICovCisJCQkJCW1pbl9yZXdpbmQgPSAtNTsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgCisJCQkJCSAgICAgICJjbGlwcGVkIG1pbl9yZXdpbmQgdG8gJWQiLAorCQkJCQkgICAgICBtaW5fcmV3aW5kKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImFkanVzdGluZyBvdmVyc2hvb3QgZnJvbSAlZCB0byAlZCIsCisJCQkJICAgICAgb3ZlcnNob290LCBvdmVyc2hvb3QgKyBlcnJvcik7CisJCQkJb3ZlcnNob290ICs9IGVycm9yOworCQkJCWlmIChvdmVyc2hvb3QgPCAtNSB8fAorCQkJCSAgICBvdmVyc2hvb3QgPiBPVkVSU0hPT1RfTElNSVQpIHsKKwkJCQkJaWYgKG92ZXJzaG9vdCA8IDApIHsKKwkJCQkJCS8qIGtlZXAgc2FuZSB2YWx1ZSAqLworCQkJCQkJb3ZlcnNob290ID0gLTU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KKwkJCQkJCW92ZXJzaG9vdCA9IE9WRVJTSE9PVF9MSU1JVDsKKwkJCQkJfQorCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAiY2xpcHBlZCBvdmVyc2hvb3QgdG8gJWQiLAorCQkJCQkgICAgICBvdmVyc2hvb3QpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBzZWdtZW50X2lkKTsKKwlpZiAoZnRfbG9jYXRpb24ua25vd24pIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImN1cnJlbnQgbG9jYXRpb246ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGRldGVybWluZV9wb3NpdGlvbih2b2lkKQoreworCWludCByZXRyeSA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCFmdGFwZV90YXBlX3J1bm5pbmcpIHsKKwkJLyogIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRhcGUgaXMgc3RvcHBlZCBieSBpc3IuCisJCSAqLworCQlUUkFDRShmdF90X2Zsb3csICJ3YWl0aW5nIGZvciB0YXBlIHN0b3AiKTsKKwkJaWYgKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cykgPCAwKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJkcml2ZSBzdGlsbCBydW5uaW5nIChmYXRhbCkiKTsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDE7CS8qID8gKi8KKwkJfQorCX0gZWxzZSB7CisJCWZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyk7CisJfQorCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7CisJCS8qICBEcml2ZSBtdXN0IGJlIHJlYWR5IHRvIGNoZWNrIGVycm9yIHN0YXRlICEKKwkJICovCisJCVRSQUNFKGZ0X3RfZmxvdywgImRyaXZlIGlzIHJlYWR5Iik7CisJCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSB7CisJCQl1bnNpZ25lZCBpbnQgZXJyb3I7CisJCQlxaWMxMTdfY21kX3QgY29tbWFuZDsKKworCQkJLyogIFJlcG9ydCBhbmQgY2xlYXIgZXJyb3Igc3RhdGUsIHRyeSB0byBjb250aW51ZS4KKwkJCSAqLworCQkJVFJBQ0UoZnRfdF9mbG93LCAiZXJyb3Igc3RhdHVzIHNldCIpOworCQkJZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDEpOworCQkJZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CS8qID8gKi8KKwkJfQorCQlpZiAoY2hlY2tfYm90X2VvdChzdGF0dXMpKSB7CisJCQlpZiAoZnRfbG9jYXRpb24uYm90KSB7CisJCQkJaWYgKChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSA9PSAwKSB7CisJCQkJCS8qIHRhcGUgbW92aW5nIGF3YXkgZnJvbQorCQkJCQkgKiBib3QvZW90LCBsZXQncyBzZWUgaWYgd2UKKwkJCQkJICogY2FuIGNhdGNoIHVwIHdpdGggdGhlIGZpcnN0CisJCQkJCSAqIHNlZ21lbnQgb24gdGhpcyB0cmFjay4KKwkJCQkJICovCisJCQkJfSBlbHNlIHsKKwkJCQkJVFJBQ0UoZnRfdF9mbG93LAorCQkJCQkgICAgICAic3RhcnQgdGFwZSBmcm9tIGxvZ2ljYWwgYm90Iik7CisJCQkJCWxvZ2ljYWxfZm9yd2FyZCgpOwkvKiBzdGFydCBtb3ZpbmcgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgPT0gMCkgeworCQkJCQlUUkFDRShmdF90X25vaXNlLCAid2FpdGluZyBmb3IgbG9naWNhbCBlbmQgb2YgdHJhY2siKTsKKwkJCQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJCQkJLyogZXJyb3IgaGFuZGxpbmcgbmVlZGVkID8gKi8KKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAidGFwZSBhdCBsb2dpY2FsIGVuZCBvZiB0cmFjayIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInN0YXJ0IHRhcGUiKTsKKwkJCWxvZ2ljYWxfZm9yd2FyZCgpOwkvKiBzdGFydCBtb3ZpbmcgKi8KKwkJCWZ0X2xvY2F0aW9uLmtub3duID0gMDsJLyogbm90IGNsZWFyZWQgYnkgbG9naWNhbCBmb3J3YXJkICEgKi8KKwkJfQorCX0KKwkvKiB0YXBlIHNob3VsZCBiZSBtb3Zpbmcgbm93LCBzdGFydCByZWFkaW5nIGlkJ3MKKwkgKi8KKwl3aGlsZSAoIWZ0X2xvY2F0aW9uLmtub3duICYmCisJICAgICAgIHJldHJ5KysgPCBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICYmCisJICAgICAgIChyZXN1bHQgPSBmdGFwZV9yZWFkX2lkKCkpIDwgMCkgeworCisJCVRSQUNFKGZ0X3RfZmxvdywgImxvY2F0aW9uIHVua25vd24iKTsKKworCQkvKiBleGl0IG9uIHNpZ25hbAorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCisJCS8qICByZWFkLWlkIHNvbWVob3cgZmFpbGVkLCB0YXBlIG1heQorCQkgKiAgaGF2ZSByZWFjaGVkIGVuZCBvciBzb21lIG90aGVyCisJCSAqICBlcnJvciBoYXBwZW5lZC4KKwkJICovCisJCVRSQUNFKGZ0X3RfZmxvdywgInJlYWQtaWQgZmFpbGVkIik7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzOiAweCUwMngiLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgeworCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIHN0b3BwZWQgZm9yIHVua25vd24gcmVhc29uISAiCisJCQkgICAgICAic3RhdHVzID0gMHglMDJ4Iiwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SIHx8CisJCQkgICAgIWNoZWNrX2JvdF9lb3Qoc3RhdHVzKSkgeworCQkJCS8qIG9vcHMsIHRhcGUgc3RvcHBlZCBidXQgbm90IGF0IGVuZCEKKwkJCQkgKi8KKwkJCQlUUkFDRV9FWElUIC1FSU87CisJCQl9CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9mbG93LAorCSAgICAgICJ0YXBlIGlzIHBvc2l0aW9uZWQgYXQgc2VnbWVudCAlZCIsIGZ0X2xvY2F0aW9uLnNlZ21lbnQpOworCVRSQUNFX0VYSVQgZnRfbG9jYXRpb24ua25vd24gPyAwIDogLUVJTzsKK30KKworLyogICAgICBHZXQgdGhlIHRhcGUgcnVubmluZyBhbmQgcG9zaXRpb24gaXQganVzdCBiZWZvcmUgdGhlCisgKiAgICAgIHJlcXVlc3RlZCBzZWdtZW50LgorICogICAgICBTZWVrIHRhcGUtdHJhY2sgYW5kIHJlcG9zaXRpb24gYXMgbmVlZGVkLgorICovCitpbnQgZnRhcGVfc3RhcnRfdGFwZShpbnQgc2VnbWVudF9pZCwgaW50IHNlY3Rvcl9vZmZzZXQpCit7CisJaW50IHRyYWNrID0gc2VnbWVudF9pZCAvIGZ0X3NlZ21lbnRzX3Blcl90cmFjazsKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlpbnQgc3RhdHVzOworCXN0YXRpYyBpbnQgbGFzdF9zZWdtZW50ID0gLTE7CisJc3RhdGljIGludCBiYWRfYnVzX3RpbWluZyA9IDA7CisJLyogbnVtYmVyIG9mIHNlZ21lbnRzIHBhc3NpbmcgdGhlIGhlYWQgYmV0d2VlbiBzdGFydGluZyB0aGUgdGFwZQorCSAqIGFuZCBiZWluZyBhYmxlIHRvIGFjY2VzcyB0aGUgZmlyc3Qgc2VjdG9yLgorCSAqLworCXN0YXRpYyBpbnQgc3RhcnRfb2Zmc2V0ID0gMTsKKwlpbnQgcmV0cnk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwkvKiBJZiBzZWN0b3Jfb2Zmc2V0ID4gMCwgc2VlayBpbnRvIHdhbnRlZCBzZWdtZW50IGluc3RlYWQgb2YKKwkgKiBpbnRvIHByZXZpb3VzLgorCSAqIFRoaXMgYWxsb3dzIGVycm9yIHJlY292ZXJ5IGlmIGEgcGFydCBvZiB0aGUgc2VnbWVudCBpcyBiYWQKKwkgKiAoZXJhc2VkKSBjYXVzaW5nIHRoZSB0YXBlIGRyaXZlIHRvIGdlbmVyYXRlIGFuIGluZGV4IHB1bHNlCisJICogdGh1cyBjYXVzaW5nIGEgbm8tZGF0YSBlcnJvciBiZWZvcmUgdGhlIHJlcXVlc3RlZCBzZWN0b3IKKwkgKiBpcyByZWFjaGVkLgorCSAqLworCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcmdldCBzZWdtZW50OiAlZC8lZCVzIiwgc2VnbWVudF9pZCwgc2VjdG9yX29mZnNldCwKKwkJZnRfYnVmZmVyW2Z0X2hlYWRdLT5yZXRyeSA+IDAgPyAiIHJldHJ5IiA6ICIiKTsKKwlpZiAoZnRfYnVmZmVyW2Z0X2hlYWRdLT5yZXRyeSA+IDApIHsJLyogdGhpcyBpcyBhIHJldHJ5ICovCisJCWludCBkaXN0ID0gc2VnbWVudF9pZCAtIGxhc3Rfc2VnbWVudDsKKworCQlpZiAoKGludClmdF9oaXN0b3J5Lm92ZXJydW5fZXJyb3JzIDwgb3ZlcnJ1bl9jb3VudF9vZmZzZXQpIHsKKwkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0gZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJfSBlbHNlIGlmIChkaXN0IDwgMCB8fCBkaXN0ID4gNTApIHsKKwkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0gZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJfSBlbHNlIGlmICgoZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycyAtCisJCQkgICAgb3ZlcnJ1bl9jb3VudF9vZmZzZXQpID49IDgpIHsKKwkJCWlmIChmdGFwZV9pbmNyZWFzZV90aHJlc2hvbGQoKSA+PSAwKSB7CisJCQkJLS1mdF9idWZmZXJbZnRfaGVhZF0tPnJldHJ5OworCQkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0KKwkJCQkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJpbmNyZWFzZWQgdGhyZXNob2xkIGJlY2F1c2UgIgorCQkJCSAgICAgICJvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiKTsKKwkJCX0gZWxzZSBpZiAoIWJhZF9idXNfdGltaW5nICYmIGZ0X2RhdGFfcmF0ZSA+PSAxMDAwKSB7CisJCQkJZnRhcGVfaGFsZl9kYXRhX3JhdGUoKTsKKwkJCQktLWZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnk7CisJCQkJYmFkX2J1c190aW1pbmcgPSAxOworCQkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0KKwkJCQkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJyZWR1Y2VkIGRhdGFyYXRlIGJlY2F1c2UgIgorCQkJCSAgICAgICJvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiKTsKKwkJCX0KKwkJfQorCX0KKwlsYXN0X3NlZ21lbnQgPSBzZWdtZW50X2lkOworCWlmIChmdF9sb2NhdGlvbi50cmFjayAhPSB0cmFjayB8fAorCSAgICAoZnRhcGVfbWlnaHRfYmVfb2ZmX3RyYWNrICYmIGZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnk9PSAwKSkgeworCQkvKiBjdXJyZW50IHRyYWNrIHVua25vd24gb3Igbm90IGVxdWFsIHRvIGRlc3RpbmF0aW9uCisJCSAqLworCQlmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQuc2VlaywgJnN0YXR1cyk7CisJCWZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh0cmFjayk7CisJCS8qIG92ZXJydW5fY291bnRfb2Zmc2V0ID0gZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsgKi8KKwl9CisJcmVzdWx0ID0gLUVJTzsKKwlyZXRyeSA9IDA7CisJd2hpbGUgKHJlc3VsdCA8IDAgICAgICYmCisJICAgICAgIHJldHJ5KysgPD0gNSAgICYmCisJICAgICAgICFmdF9mYWlsdXJlICYmCisJICAgICAgICEoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBfRE9OVF9CTE9DSykpKSB7CisJCQorCQlpZiAocmV0cnkgJiYgc3RhcnRfb2Zmc2V0IDwgNSkgeworCQkJc3RhcnRfb2Zmc2V0ICsrOworCQl9CisJCS8qICBDaGVjayBpZiB3ZSBhcmUgYWJsZSB0byBjYXRjaCB0aGUgcmVxdWVzdGVkCisJCSAqICBzZWdtZW50IGluIHRpbWUuCisJCSAqLworCQlpZiAoKGZ0X2xvY2F0aW9uLmtub3duIHx8IChkZXRlcm1pbmVfcG9zaXRpb24oKSA9PSAwKSkgJiYKKwkJICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgPj0KKwkJICAgIChzZWdtZW50X2lkIC0KKwkJICAgICAoKGZ0YXBlX3RhcGVfcnVubmluZyB8fCBmdF9sb2NhdGlvbi5ib3QpCisJCSAgICAgID8gMCA6IHN0YXJ0X29mZnNldCkpKSB7CisJCQkvKiAgVG9vIGZhciBhaGVhZCAoaW4gb3IgcGFzdCB0YXJnZXQgc2VnbWVudCkuCisJCQkgKi8KKwkJCWlmIChmdGFwZV90YXBlX3J1bm5pbmcpIHsKKwkJCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX3N0b3BfdGFwZSgmc3RhdHVzKSkgPCAwKSB7CisJCQkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJCQkgICAgICAic3RvcCB0YXBlIGZhaWxlZCB3aXRoIGNvZGUgJWQiLAorCQkJCQkgICAgICByZXN1bHQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgc3RvcHBlZCIpOworCQkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJCQl9CisJCQlUUkFDRShmdF90X25vaXNlLCAicmVwb3NpdGlvbmluZyIpOworCQkJKytmdF9oaXN0b3J5LnJld2luZHM7CisJCQlpZiAoc2VnbWVudF9pZCAlIGZ0X3NlZ21lbnRzX3Blcl90cmFjayA8IHN0YXJ0X29mZnNldCl7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVuZCBvZiB0cmFjayBjb25kaXRpb25cbiIKKwkJCQkgICAgICBLRVJOX0lORk8gInNlZ21lbnRfaWQgICAgICAgIDogJWRcbiIKKwkJCQkgICAgICBLRVJOX0lORk8gImZ0X3NlZ21lbnRzX3Blcl90cmFjazogJWRcbiIKKwkJCQkgICAgICBLRVJOX0lORk8gInN0YXJ0X29mZnNldCAgICAgIDogJWQiLAorCQkJCSAgICAgIHNlZ21lbnRfaWQsIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgCisJCQkJICAgICAgc3RhcnRfb2Zmc2V0KTsKKwkJCQkgICAgICAKKwkJCQkvKiAgSWYgc2Vla2luZyB0byBmaXJzdCBzZWdtZW50cyBvbgorCQkJCSAqICB0cmFjayBiZXR0ZXIgZG8gYSBjb21wbGV0ZSByZXdpbmQKKwkJCQkgKiAgdG8gbG9naWNhbCBiZWdpbiBvZiB0cmFjayB0byBnZXQgYQorCQkJCSAqICBtb3JlIHN0ZWFkeSB0YXBlIG1vdGlvbi4gIAorCQkJCSAqLworCQkJCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmRfd2FpdCgKKwkJCQkJKGZ0X2xvY2F0aW9uLnRyYWNrICYgMSkKKwkJCQkJPyBRSUNfUEhZU0lDQUxfRk9SV0FSRAorCQkJCQk6IFFJQ19QSFlTSUNBTF9SRVZFUlNFLAorCQkJCQlmdGFwZV90aW1lb3V0LnJld2luZCwgJnN0YXR1cyk7CisJCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOwkvKiB1cGRhdGUgbG9jYXRpb24gKi8KKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0PSBza2lwX3JldmVyc2Uoc2VnbWVudF9pZCAtIHN0YXJ0X29mZnNldCwKKwkJCQkJCSAgICAgJnN0YXR1cyk7CisJCQl9CisJCX0KKwkJaWYgKCFmdF9sb2NhdGlvbi5rbm93bikgeworCQkJVFJBQ0UoZnRfdF9idWcsICJwYW5pYzogbG9jYXRpb24gbm90IGtub3duIik7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJY29udGludWU7IC8qIHdoaWxlKCkgd2lsbCBjaGVjayBmb3IgZmFpbHVyZSAqLworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjdXJyZW50IHNlZ21lbnQ6ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwkJLyogIFdlJ3JlIG9uIHRoZSByaWdodCB0cmFjayBzb21ld2hlcmUgYmVmb3JlIHRoZQorCQkgKiAgd2FudGVkIHNlZ21lbnQuICBTdGFydCB0YXBlIG1vdmVtZW50IGlmIG5lZWRlZCBhbmQKKwkJICogIHNraXAgdG8ganVzdCBiZWZvcmUgb3IgaW5zaWRlIHRoZSByZXF1ZXN0ZWQKKwkJICogIHNlZ21lbnQuIEtlZXAgdGFwZSBydW5uaW5nLiAgCisJCSAqLworCQlyZXN1bHQgPSAwOworCQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCA8IAorCQkgICAgKHNlZ21lbnRfaWQgLSAoKGZ0YXBlX3RhcGVfcnVubmluZyB8fCBmdF9sb2NhdGlvbi5ib3QpCisJCQkJICAgPyAwIDogc3RhcnRfb2Zmc2V0KSkpIHsKKwkJCWlmIChzZWN0b3Jfb2Zmc2V0ID4gMCkgeworCQkJCXJlc3VsdCA9IHNlZWtfZm9yd2FyZChzZWdtZW50X2lkLAorCQkJCQkJICAgICAgcmV0cnkgPD0gMyk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IHNlZWtfZm9yd2FyZChzZWdtZW50X2lkIC0gMSwKKwkJCQkJCSAgICAgIHJldHJ5IDw9IDMpOworCQkJfQorCQl9CisJCWlmIChyZXN1bHQgPT0gMCAmJgorCQkgICAgZnRfbG9jYXRpb24uc2VnbWVudCAhPQorCQkgICAgKHNlZ21lbnRfaWQgLSAoc2VjdG9yX29mZnNldCA+IDAgPyAwIDogMSkpKSB7CisJCQlyZXN1bHQgPSAtRUlPOworCQl9CisJfQorCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZmFpbGVkIHRvIHJlcG9zaXRpb24iKTsKKwl9IGVsc2UgeworCQlmdF9ydW5uZXJfc3RhdHVzID0gcnVubmluZzsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjRmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBfRlRBUEVfUldfSAorI2RlZmluZSBfRlRBUEVfUldfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjI1ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFkIGFuZCB3cml0ZQorICogICAgICBmdW5jdGlvbnMgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ2xhdXMtSnVzdHVzIEhlaW5lICgxOTk2LzA5LzIwKTogQWRkIGRlZmluaXRpb24gb2YgZm9ybWF0IGNvZGUgNgorICogQ2xhdXMtSnVzdHVzIEhlaW5lICgxOTk2LzEwLzA0KTogQ2hhbmdlZCBHRVQvUFVUIG1hY3JvcyB0byBjYXN0IHRvIChfX3U4ICopCisgKgorICovCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNkZWZpbmUgR0VUMihhZGRyZXNzLCBvZmZzZXQpIGdldF91bmFsaWduZWQoKF9fdTE2KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgR0VUNChhZGRyZXNzLCBvZmZzZXQpIGdldF91bmFsaWduZWQoKF9fdTMyKikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgR0VUOChhZGRyZXNzLCBvZmZzZXQpIGdldF91bmFsaWduZWQoKF9fdTY0KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgUFVUMihhZGRyZXNzLCBvZmZzZXQgLCB2YWx1ZSkgcHV0X3VuYWxpZ25lZCgodmFsdWUpLCAoX191MTYqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQorI2RlZmluZSBQVVQ0KGFkZHJlc3MsIG9mZnNldCAsIHZhbHVlKSBwdXRfdW5hbGlnbmVkKCh2YWx1ZSksIChfX3UzMiopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCisjZGVmaW5lIFBVVDgoYWRkcmVzcywgb2Zmc2V0ICwgdmFsdWUpIHB1dF91bmFsaWduZWQoKHZhbHVlKSwgKF9fdTY0KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKworZW51bSBydW5uZXJfc3RhdHVzX2VudW0geworCWlkbGUgPSAwLAorCXJ1bm5pbmcsCisJZG9fYWJvcnQsCisJYWJvcnRpbmcsCisJbG9naWNhbF9lb3QsCisJZW5kX29mX3RhcGUsCit9OworCit0eXBlZGVmIGVudW0gZnRfYnVmZmVyX3F1ZXVlIHsKKwlmdF9xdWV1ZV9oZWFkID0gMCwKKwlmdF9xdWV1ZV90YWlsID0gMQorfSBmdF9idWZmZXJfcXVldWVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHRyYWNrOwkJLyogdGFwZSBoZWFkIHBvc2l0aW9uICovCisJdm9sYXRpbGUgaW50IHNlZ21lbnQ7CS8qIGN1cnJlbnQgc2VnbWVudCAqLworCXZvbGF0aWxlIGludCBzZWN0b3I7CS8qIHNlY3RvciBvZmZzZXQgd2l0aGluIGN1cnJlbnQgc2VnbWVudCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBib3Q7CS8qIGxvZ2ljYWwgYmVnaW4gb2YgdHJhY2sgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZW90OwkvKiBsb2dpY2FsIGVuZCBvZiB0cmFjayAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBrbm93bjsJLyogdmFsaWRhdGVzIGJvdCwgc2VnbWVudCwgc2VjdG9yICovCit9IGxvY2F0aW9uX3JlY29yZDsKKworLyogICAgICBDb3VudCBuciBvZiAxJ3MgaW4gcGF0dGVybi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY291bnRfb25lcyh1bnNpZ25lZCBsb25nIG1hc2spCit7CisJaW50IGJpdHM7CisKKwlmb3IgKGJpdHMgPSAwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEpIHsKKwkJaWYgKG1hc2sgJiAxKSB7CisJCQkrK2JpdHM7CisJCX0KKwl9CisJcmV0dXJuIGJpdHM7Cit9CisKKyNkZWZpbmUgRlRfTUFYX05SX0JVRkZFUlMgMTYgLyogYXJiaXRyYXJ5IHZhbHVlICovCisvKiAgICAgIGZ0YXBlLXJ3LmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworZXh0ZXJuIGJ1ZmZlcl9zdHJ1Y3QgKmZ0X2J1ZmZlcltGVF9NQVhfTlJfQlVGRkVSU107CitleHRlcm4gaW50IGZ0X25yX2J1ZmZlcnM7CitleHRlcm4gbG9jYXRpb25fcmVjb3JkIGZ0X2xvY2F0aW9uOworZXh0ZXJuIHZvbGF0aWxlIGludCBmdGFwZV90YXBlX3J1bm5pbmc7CisKKy8qICAgICAgZnRhcGUtcncuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiBpbnQgIGZ0YXBlX3NldHVwX25ld19zZWdtZW50KGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLAorCQkJCSAgICBpbnQgc2VnbWVudF9pZCwKKwkJCQkgICAgaW50IG9mZnNldCk7CitleHRlcm4gaW50ICBmdGFwZV9jYWxjX25leHRfY2x1c3RlcihidWZmZXJfc3RydWN0ICogYnVmZik7CitleHRlcm4gYnVmZmVyX3N0cnVjdCAqZnRhcGVfbmV4dF9idWZmZXIgKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcyk7CitleHRlcm4gYnVmZmVyX3N0cnVjdCAqZnRhcGVfZ2V0X2J1ZmZlciAgKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZnRhcGVfYnVmZmVyX2lkICAgKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcyk7CitleHRlcm4gdm9pZCAgICAgICAgICAgZnRhcGVfcmVzZXRfYnVmZmVyKHZvaWQpOworZXh0ZXJuIHZvaWQgZnRhcGVfdGFwZV9wYXJhbWV0ZXJzKF9fdTggZHJpdmVfY29uZmlndXJhdGlvbik7CitleHRlcm4gaW50ICBmdGFwZV93YWl0X3NlZ21lbnQoYnVmZmVyX3N0YXRlX2VudW0gc3RhdGUpOworZXh0ZXJuIGludCAgZnRhcGVfZHVtYl9zdG9wKHZvaWQpOworZXh0ZXJuIGludCAgZnRhcGVfc3RhcnRfdGFwZShpbnQgc2VnbWVudF9pZCwgaW50IG9mZnNldCk7CitleHRlcm4gaW50ICBmdGFwZV9zdG9wX3RhcGUoaW50ICpwc3RhdHVzKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2hhbmRsZV9sb2dpY2FsX2VvdCh2b2lkKTsKK2V4dGVybiBidWZmZXJfc3RhdGVfZW51bSBmdGFwZV9zZXRfc3RhdGUoYnVmZmVyX3N0YXRlX2VudW0gbmV3X3N0YXRlKTsKKyNlbmRpZgkJCQkvKiBfRlRBUEVfUldfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXNldHVwLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODBhMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXNldHVwLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtc2V0dXAuYyx2ICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqICREYXRlOiAxOTk3LzEwLzEwIDA5OjU3OjA2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSBmb3IgcHJvY2Vzc2luZyB0aGUga2VybmVsIGNvbW1hbmQKKyAqICAgICAgbGluZSBvcHRpb25zIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIKKyAqICAgICAgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKworc3RhdGljIHN0cnVjdCBwYXJhbV90YWJsZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKnZhcjsKKwlpbnQgZGVmX3BhcmFtOworCWludCBtaW47CisJaW50IG1heDsKK30gY29uZmlnX3BhcmFtc1tdIF9faW5pdGRhdGEgPSB7CisjaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKKwl7ICJ0cmFjaW5nIiwgICAmZnRhcGVfdHJhY2luZywgICAgIDMsICAgICAgICAgICAgICBmdF90X2J1ZywgZnRfdF9hbnl9LAorI2VuZGlmCisJeyAiaW9wb3J0IiwgICAgJmZ0X2ZkY19iYXNlLCAgICAgICBDT05GSUdfRlRfRkRDX0JBU0UsICAgICAweDAsIDB4ZmZmfSwKKwl7ICJpcnEiLCAgICAgICAmZnRfZmRjX2lycSwgICAgICAgIENPTkZJR19GVF9GRENfSVJRLCAgICAgICAgMiwgICAgMTV9LAorCXsgImRtYSIsICAgICAgICZmdF9mZGNfZG1hLCAgICAgICAgQ09ORklHX0ZUX0ZEQ19ETUEsICAgICAgICAwLCAgICAgM30sCisJeyAidGhyZXNob2xkIiwgJmZ0X2ZkY190aHJlc2hvbGQsICBDT05GSUdfRlRfRkRDX1RIUiwgICAgICAgICAxLCAgICAxNn0sCisJeyAiZGF0YXJhdGUiLCAgJmZ0X2ZkY19yYXRlX2xpbWl0LCBDT05GSUdfRlRfRkRDX01BWF9SQVRFLCA1MDAsICAyMDAwfSwKKwl7ICJmYzEwIiwgICAgICAmZnRfcHJvYmVfZmMxMCwgICAgIENPTkZJR19GVF9QUk9CRV9GQzEwLCAgICAgMCwgICAgIDF9LAorCXsgIm1hY2gyIiwgICAgICZmdF9tYWNoMiwgICAgICAgICAgQ09ORklHX0ZUX01BQ0gyLCAgICAgICAgICAwLCAgICAgMX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZ0YXBlX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKwlpbnQgcGFyYW07CisJaW50IGludHNbMl07CisKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJaWYgKHN0cikgeworCQlmb3IgKGk9MDsgaSA8IE5SX0lURU1TKGNvbmZpZ19wYXJhbXMpOyBpKyspIHsKKwkJCWlmIChzdHJjbXAoc3RyLGNvbmZpZ19wYXJhbXNbaV0ubmFtZSkgPT0gMCl7CisJCQkJaWYgKGludHNbMF0pIHsKKwkJCQkJcGFyYW0gPSBpbnRzWzFdOworCQkJCX0gZWxzZSB7CisJCQkJCXBhcmFtID0gY29uZmlnX3BhcmFtc1tpXS5kZWZfcGFyYW07CisJCQkJfQorCQkJCWlmIChwYXJhbSA8IGNvbmZpZ19wYXJhbXNbaV0ubWluIHx8CisJCQkJICAgIHBhcmFtID4gY29uZmlnX3BhcmFtc1tpXS5tYXgpIHsKKwkJCQkJVFJBQ0UoZnRfdF9lcnIsCisJCQkJCSJwYXJhbWV0ZXIgJXMgb3V0IG9mIHJhbmdlICVkIC4uLiAlZCIsCisJCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubmFtZSwKKwkJCQkJICAgICAgY29uZmlnX3BhcmFtc1tpXS5taW4sCisJCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubWF4KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmKGNvbmZpZ19wYXJhbXNbaV0udmFyKSB7CisJCQkJCVRSQUNFKGZ0X3RfaW5mbywgIiVzPSVkIiwgc3RyLCBwYXJhbSk7CisJCQkJCSpjb25maWdfcGFyYW1zW2ldLnZhciA9IHBhcmFtOworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc3RyKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAidW5rbm93biBmdGFwZSBvcHRpb24gWyVzXSIsIHN0cik7CisJCQorCQlUUkFDRShmdF90X2VyciwgImFsbG93ZWQgb3B0aW9ucyBhcmU6Iik7CisJCWZvciAoaT0wOyBpIDwgTlJfSVRFTVMoY29uZmlnX3BhcmFtcyk7IGkrKykgeworCQkJVFJBQ0UoZnRfdF9lcnIsICIgJXMiLGNvbmZpZ19wYXJhbXNbaV0ubmFtZSk7CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2VyciwgImJvdGNoZWQgZnRhcGUgb3B0aW9uIik7CisJfQorIG91dDoKKwlUUkFDRV9FWElUIDE7Cit9CisKK19fc2V0dXAoImZ0YXBlPSIsIGZ0YXBlX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjI3ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcmVhZGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworLyogICAgICB0cmFjaW5nCisgKiAgICAgIHNldCBpdCB0bzogICAgIHRvIGxvZyA6CisgKiAgICAgICAwICAgICAgICAgICAgICBidWdzCisgKiAgICAgICAxICAgICAgICAgICAgICArIGVycm9ycworICogICAgICAgMiAgICAgICAgICAgICAgKyB3YXJuaW5ncworICogICAgICAgMyAgICAgICAgICAgICAgKyBpbmZvcm1hdGlvbgorICogICAgICAgNCAgICAgICAgICAgICAgKyBtb3JlIGluZm9ybWF0aW9uCisgKiAgICAgICA1ICAgICAgICAgICAgICArIHByb2dyYW0gZmxvdworICogICAgICAgNiAgICAgICAgICAgICAgKyBmZGMvZG1hIGluZm8KKyAqICAgICAgIDcgICAgICAgICAgICAgICsgZGF0YSBmbG93CisgKiAgICAgICA4ICAgICAgICAgICAgICArIGV2ZXJ5dGhpbmcgZWxzZQorICovCitmdF90cmFjZV90IGZ0YXBlX3RyYWNpbmcgPSBmdF90X2luZm87IC8qIERlZmF1bHQgbGV2ZWw6IGluZm9ybWF0aW9uIGFuZCB1cCAqLworaW50ICBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBfX3U4IHRyYWNlX2lkOworc3RhdGljIGNoYXIgc3BhY2luZ1tdID0gIiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworCit2b2lkIGZ0YXBlX3RyYWNlX2NhbGwoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICppbmRlbnQ7CisKKwkvKiAgICBTaW5jZSBwcmludGsgc2VlbXMgbm90IHRvIHdvcmsgd2l0aCAiJSpzIiBmb3JtYXQKKwkgKiAgICB3ZSdsbCB1c2UgdGhpcyB3b3JrLWFyb3VuZC4KKwkgKi8KKwlpZiAoZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZnVuY3Rpb24gbmVzdCBsZXZlbCAoJWQpIDwgMFxuIiwKKwkJICAgICAgIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsID0gMDsKKwl9CisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCBzaXplb2Yoc3BhY2luZykpIHsKKwkJaW5kZW50ID0gKHNwYWNpbmcgKworCQkJICBzaXplb2Yoc3BhY2luZykgLSAxIC0KKwkJCSAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7CisJfSBlbHNlIHsKKwkJaW5kZW50ID0gc3BhY2luZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiWyUwM2RdJXMrJXMgKCVzKVxuIiwKKwkgICAgICAgKGludCkgdHJhY2VfaWQrKywgaW5kZW50LCBmaWxlLCBuYW1lKTsKK30KKwordm9pZCBmdGFwZV90cmFjZV9leGl0KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqaW5kZW50OworCisJLyogICAgU2luY2UgcHJpbnRrIHNlZW1zIG5vdCB0byB3b3JrIHdpdGggIiUqcyIgZm9ybWF0CisJICogICAgd2UnbGwgdXNlIHRoaXMgd29yay1hcm91bmQuCisJICovCisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZ1bmN0aW9uIG5lc3QgbGV2ZWwgKCVkKSA8IDBcbiIsIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsID0gMDsKKwl9CisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCBzaXplb2Yoc3BhY2luZykpIHsKKwkJaW5kZW50ID0gKHNwYWNpbmcgKworCQkJICBzaXplb2Yoc3BhY2luZykgLSAxIC0KKwkJCSAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7CisJfSBlbHNlIHsKKwkJaW5kZW50ID0gc3BhY2luZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiWyUwM2RdJXMtJXMgKCVzKVxuIiwKKwkgICAgICAgKGludCkgdHJhY2VfaWQrKywgaW5kZW50LCBmaWxlLCBuYW1lKTsKK30KKwordm9pZCBmdGFwZV90cmFjZV9sb2coY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZnVuY3Rpb24pCit7CisJY2hhciAqaW5kZW50OworCisJLyogICAgU2luY2UgcHJpbnRrIHNlZW1zIG5vdCB0byB3b3JrIHdpdGggIiUqcyIgZm9ybWF0CisJICogICAgd2UnbGwgdXNlIHRoaXMgd29yay1hcm91bmQuCisJICovCisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZ1bmN0aW9uIG5lc3QgbGV2ZWwgKCVkKSA8IDBcbiIsIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsID0gMDsKKwl9CisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCBzaXplb2Yoc3BhY2luZykpIHsKKwkJaW5kZW50ID0gKHNwYWNpbmcgKyAKKwkJCSAgc2l6ZW9mKHNwYWNpbmcpIC0gMSAtIAorCQkJICBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKKwl9IGVsc2UgeworCQlpbmRlbnQgPSBzcGFjaW5nOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJbJTAzZF0lcyVzICglcykgLSAiLCAKKwkgICAgICAgKGludCkgdHJhY2VfaWQrKywgaW5kZW50LCBmaWxlLCBmdW5jdGlvbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdjZDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfRlRBUEVfVFJBQ0lOR19ICisjZGVmaW5lIF9GVEFQRV9UUkFDSU5HX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjI4ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyB0aGF0IGVhc2VzIHRoZSBkZWJ1Z2dpbmcgb2YgdGhlCisgKiAgICAgIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworLyoKKyAqICBCZSB2ZXJ5IGNhcmVmdWwgd2l0aCBUUkFDRV9FWElUIGFuZCBUUkFDRV9BQk9SVC4KKyAqCisgKiAgaWYgKHNvbWV0aGluZykgVFJBQ0VfRVhJVCBlcnJvcjsKKyAqCisgKiAgd2lsbCBOT1Qgd29yay4gVXNlCisgKgorICogIGlmIChzb21ldGhpbmcpIHsKKyAqICAgIFRSQUNFX0VYSVQgZXJyb3I7CisgKiAgfQorICoKKyAqICBpbnN0ZWFkLiBNYXliZSBhIGJpdCBkYW5nZXJvdXMsIGJ1dCBzYXZlIGxvdHMgb2YgbGluZXMgb2YgY29kZS4KKyAqLworCisjZGVmaW5lIExMX1ggIiVkLyVkIEtCIgorI2RlZmluZSBMTCh4KSAodW5zaWduZWQgaW50KSgoX191NjQpKHgpPj4xMCksICh1bnNpZ25lZCBpbnQpKCh4KSYxMDIzKQorCit0eXBlZGVmIGVudW0geworCWZ0X3RfbmlsID0gLTEsCisJZnRfdF9idWcsCisJZnRfdF9lcnIsCisJZnRfdF93YXJuLAorCWZ0X3RfaW5mbywKKwlmdF90X25vaXNlLAorCWZ0X3RfZmxvdywKKwlmdF90X2ZkY19kbWEsCisJZnRfdF9kYXRhX2Zsb3csCisJZnRfdF9hbnkKK30gZnRfdHJhY2VfdDsKKworI2lmZGVmICBDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMCisvKiAgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgYXdheSBtb3N0IFRSQUNFKCkgbWFjcm9zCisgKi8KKyNkZWZpbmUgRlRfVFJBQ0VfVE9QX0xFVkVMCWZ0X3RfYnVnCisjZGVmaW5lIFRSQUNFX0ZVTihsZXZlbCkJZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgVFJBQ0VfRVhJVAkJcmV0dXJuCisjZGVmaW5lIFRSQUNFKGwsIG0sIGkuLi4pCQkJCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoKGZ0X3RyYWNlX3QpKGwpID09IEZUX1RSQUNFX1RPUF9MRVZFTCkgewkJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyJmdGFwZSVzKCVzKTpcbiIJICAgICAgICAgICAgICAgIFwKKwkJICAgICAgIEtFUk5fSU5GTyBtIi5cbiIgLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18gLCAjI2kpOwlcCisJfQkJCQkJCQkJXAorfQorI2RlZmluZSBTRVRfVFJBQ0VfTEVWRUwobCkgICAgICBpZiAoKGwpID09IChsKSkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgVFJBQ0VfTEVWRUwJCUZUX1RSQUNFX1RPUF9MRVZFTAorCisjZWxzZQorCisjaWZkZWYgQ09ORklHX0ZUX05PX1RSQUNFCisvKiAgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgYXdheSBtYW55IFRSQUNFKCkgbWFjcm9zCisgKiAgdGhlIGZ0YXBlX3NpbXBsZV90cmFjZV9jYWxsKCkgZnVuY3Rpb24gc2ltcGx5IGluY3JlbWVudHMgCisgKiAgdGhlIGZ1bmN0aW9uIG5lc3QgbGV2ZWwuCisgKi8gCisjZGVmaW5lIEZUX1RSQUNFX1RPUF9MRVZFTAlmdF90X3dhcm4KKyNkZWZpbmUgVFJBQ0VfRlVOKGxldmVsKQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKysKKyNkZWZpbmUgVFJBQ0VfRVhJVAkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbC0tOyByZXR1cm4KKworI2Vsc2UKKyNpZmRlZiBDT05GSUdfRlRfRlVMTF9ERUJVRworI2RlZmluZSBGVF9UUkFDRV9UT1BfTEVWRUwgZnRfdF9hbnkKKyNlbHNlCisjZGVmaW5lIEZUX1RSQUNFX1RPUF9MRVZFTCBmdF90X2Zsb3cKKyNlbmRpZgorI2RlZmluZSBUUkFDRV9GVU4obGV2ZWwpCQkJCQlcCisJY29uc3QgZnRfdHJhY2VfdCBfdHJhY2luZyA9IGxldmVsOwkJCVwKKwlpZiAoZnRhcGVfdHJhY2luZyA+PSAoZnRfdHJhY2VfdCkobGV2ZWwpICYmCQlcCisJICAgIChmdF90cmFjZV90KShsZXZlbCkgPD0gRlRfVFJBQ0VfVE9QX0xFVkVMKQkJXAorCQlmdGFwZV90cmFjZV9jYWxsKF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOwlcCisJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCArKzsKKworI2RlZmluZSBUUkFDRV9FWElUCQkJCQkJXAorCS0tZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbDsJCQkJXAorCWlmIChmdGFwZV90cmFjaW5nID49IChmdF90cmFjZV90KShfdHJhY2luZykgJiYJCVwKKwkgICAgKGZ0X3RyYWNlX3QpKF90cmFjaW5nKSA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpCVwKKwkJZnRhcGVfdHJhY2VfZXhpdChfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsJXAorCXJldHVybgorCisjZW5kaWYKKworI2RlZmluZSBUUkFDRShsLCBtLCBpLi4uKQkJCQkJXAorewkJCQkJCQkJXAorCWlmIChmdGFwZV90cmFjaW5nID49IChmdF90cmFjZV90KShsKSAmJgkJCVwKKwkgICAgKGZ0X3RyYWNlX3QpKGwpIDw9IEZUX1RSQUNFX1RPUF9MRVZFTCkgewkJXAorCQlmdGFwZV90cmFjZV9sb2coX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CVwKKwkJcHJpbnRrKG0iLlxuIiAsIyNpKTsJCQkJXAorCX0JCQkJCQkJXAorfQorCisjZGVmaW5lIFNFVF9UUkFDRV9MRVZFTChsKSAJCQkJXAorewkJCQkJCQlcCisJaWYgKChmdF90cmFjZV90KShsKSA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpIHsJXAorCQlmdGFwZV90cmFjaW5nID0gKGZ0X3RyYWNlX3QpKGwpOwlcCisJfSBlbHNlIHsJCQkJCVwKKwkJZnRhcGVfdHJhY2luZyA9IEZUX1RSQUNFX1RPUF9MRVZFTDsJXAorCX0JCQkJCQlcCit9CisjZGVmaW5lIFRSQUNFX0xFVkVMICAgIAkJCQkJCQkgICAgIFwKKygoZnRhcGVfdHJhY2luZyA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpID8gZnRhcGVfdHJhY2luZyA6IEZUX1RSQUNFX1RPUF9MRVZFTCkKKworCisvKiAgICAgIEdsb2JhbCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdHJhY2luZy5jCisgKi8KK2V4dGVybiBmdF90cmFjZV90IGZ0YXBlX3RyYWNpbmc7ICAvKiBzZXRzIGRlZmF1bHQgbGV2ZWwgKi8KK2V4dGVybiBpbnQgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbDsKKworLyogICAgICBHbG9iYWwgZnVuY3Rpb25zIGRlY2xhcmVkIGluIHRyYWNpbmcuYworICovCitleHRlcm4gdm9pZCBmdGFwZV90cmFjZV9jYWxsKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgZnRhcGVfdHJhY2VfZXhpdChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGZ0YXBlX3RyYWNlX2xvZyAoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMKSAqLworCisvKgorICogICBBYm9ydCB3aXRoIGEgbWVzc2FnZS4KKyAqLworI2RlZmluZSBUUkFDRV9BQk9SVChyZXMsIGkuLi4pCQkJXAorewkJCQkJCVwKKyAJVFJBQ0UoaSk7CQkJCVwKKwlUUkFDRV9FWElUIHJlczsJCQkJXAorfQorCisvKiAgIFRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtcyB0aGUgY29tbW9uICJpZihyZXN1bHQgPCAwKSAuLi4gIiBpbnRvIGEKKyAqICAgb25lLWxpbmVyLgorICovCisjZGVmaW5lIF9UUkFDRV9DQVRDSChsZXZlbCwgZnVuLCBhY3Rpb24pCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IF9yZXMgPSAoZnVuKTsJCQkJCQlcCisJaWYgKF9yZXMgPCAwKSB7CQkJCQkJCVwKKwkJZG8geyBhY3Rpb24gLyogKi8gOyB9IHdoaWxlKDApOwkJCQlcCisJCVRSQUNFX0FCT1JUKF9yZXMsIGxldmVsLCAiJXMgZmFpbGVkOiAlZCIsICNmdW4sCV9yZXMpOwlcCisJfQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFRSQUNFX0NBVENIKGZ1biwgZmFpbCkgX1RSQUNFX0NBVENIKGZ0X3RfZXJyLCBmdW4sIGZhaWwpCisKKy8qICBBYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbiB3aGVuIHNpZ25hbGxlZC4gVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLAorICogIGJ1dCByYXRoZXIgaW50byBmdGFwZS1ydy5oIChtYXliZSkKKyAqLworI2RlZmluZSBGVF9TSUdOQUxfRVhJVChzaWdfbWFzaykJCQkJCVwKKwlpZiAoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBzaWdfbWFzaykpIHsJXAorCQlUUkFDRV9BQk9SVCgtRUlOVFIsCQkJCQlcCisJCQkgICAgZnRfdF93YXJuLAkJCQkJXAorCQkJICAgICJpbnRlcnJ1cHRlZCBieSBub24tYmxvY2thYmxlIHNpZ25hbCIpOwlcCisJfQorCisjZW5kaWYgLyogX0ZUQVBFX1RSQUNJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYwMWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk1IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zLjQuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNCAxODowNzowNCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHdyaXRpbmcgY29kZQorICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pc3IuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgbGFzdF93cml0ZV9mYWlsZWQ7CisKK3ZvaWQgZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmdF9ucl9idWZmZXJzOyArK2kpIHsKKwkJZnRfYnVmZmVyW2ldLT5zdGF0dXMgPSBkb25lOworCX0KKwlmdGFwZV9yZXNldF9idWZmZXIoKTsKK30KKworc3RhdGljIGludCBjb3B5X2FuZF9nZW5fZWNjKHZvaWQgKmRlc3RpbmF0aW9uLCAKKwkJCSAgICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgICAgY29uc3QgU2VjdG9yTWFwIGJhZF9zZWN0b3JfbWFwKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG1lbW9yeV9zZWdtZW50IG1zZWc7CisJaW50IGJhZHMgPSBjb3VudF9vbmVzKGJhZF9zZWN0b3JfbWFwKTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJhZHMgPiAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VjdG9ycyBpbiBtYXA6ICVkIiwgYmFkcyk7CisJfQorCWlmIChiYWRzICsgMyA+PSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbXB0eSBzZWdtZW50Iik7CisJCW1zZWcuYmxvY2tzID0gMDsgLyogc2tpcCBlbnRpcmUgc2VnbWVudCAqLworCQlyZXN1bHQgPSAwOyAgICAgIC8qIG5vdGhpbmcgd3JpdHRlbiAqLworCX0gZWxzZSB7CisJCW1zZWcuYmxvY2tzID0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIGJhZHM7CisJCW1zZWcuZGF0YSA9IGRlc3RpbmF0aW9uOworCQltZW1jcHkobXNlZy5kYXRhLCBzb3VyY2UsIChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkUpOworCQlyZXN1bHQgPSBmdGFwZV9lY2Nfc2V0X3NlZ21lbnRfcGFyaXR5KCZtc2VnKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiZWNjX3NldF9zZWdtZW50X3Bhcml0eSBmYWlsZWQiKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkU7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworaW50IGZ0YXBlX3N0YXJ0X3dyaXRpbmcoY29uc3QgZnRfd3JpdGVfbW9kZV90IG1vZGUpCit7CisJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisJaW50IHNlZ21lbnRfaWQgPSBoZWFkLT5zZWdtZW50X2lkOworCWludCByZXN1bHQ7CisJYnVmZmVyX3N0YXRlX2VudW0gd2FudGVkX3N0YXRlID0gKG1vZGUgPT0gRlRfV1JfREVMRVRFCisJCQkJCSAgPyBkZWxldGluZworCQkJCQkgIDogd3JpdGluZyk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKGZ0X2RyaXZlcl9zdGF0ZSAhPSB3YW50ZWRfc3RhdGUpIHx8IGhlYWQtPnN0YXR1cyAhPSB3YWl0aW5nKSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoaGVhZCwgc2VnbWVudF9pZCwgMSk7CisJaWYgKG1vZGUgPT0gRlRfV1JfU0lOR0xFKSB7CisJCS8qIHN0b3AgdGFwZSBpbnN0ZWFkIG9mIHBhdXNlICovCisJCWhlYWQtPm5leHRfc2VnbWVudCA9IDA7CisJfQorCWZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGhlYWQpOyAvKiBwcmVwYXJlICovCisJaGVhZC0+c3RhdHVzID0gZnRfZHJpdmVyX3N0YXRlOyAvKiBlaXRoZXIgd3JpdGluZyBvciBkZWxldGluZyAqLworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgInN0YXJ0aW5nIHJ1bm5lciBmb3Igc2VnbWVudCAlZCIsIHNlZ21lbnRfaWQpOworCQlUUkFDRV9DQVRDSChmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsaGVhZC0+c2VjdG9yX29mZnNldCksKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAicnVubmVyIG5vdCBpZGxlLCBub3Qgc3RhcnRpbmcgdGFwZSIpOworCX0KKwkvKiBnbyAqLworCXJlc3VsdCA9IGZkY19zZXR1cF9yZWFkX3dyaXRlKGhlYWQsIChtb2RlID09IEZUX1dSX0RFTEVURQorCQkJCQkgICAgID8gRkRDX1dSSVRFX0RFTEVURUQgOiBGRENfV1JJVEUpKTsKKwlmdGFwZV9zZXRfc3RhdGUod2FudGVkX3N0YXRlKTsgLyogc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgKi8KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogIFdhaXQgdW50aWwgYWxsIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiB0byB0YXBlLgorICogIAorICogIFRoZXJlIGlzIGEgcHJvYmxlbTogd2hlbiB0aGUgdGFwZSBydW5zIGludG8gbG9naWNhbCBFT1QsIHRoZW4gdGhpcworICogIGZhaWxlcy4gV2UgbmVlZCB0byByZXN0YXJ0IHRoZSBydW5uZXIgaW4gdGhpcyBjYXNlLgorICovCitpbnQgZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSh2b2lkKQoreworCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl3aGlsZSAoKGZ0X2RyaXZlcl9zdGF0ZSA9PSB3cml0aW5nIHx8IGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZykgJiYgCisJICAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnN0YXR1cyAhPSBkb25lKSB7CisJCS8qIHNldCB0aGUgcnVubmVyIHN0YXR1cyB0byBpZGxlIGlmIGF0IGxFT1QgKi8KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksCWxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCS8qIHJlc3RhcnQgdGhlIHRhcGUgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJydW5uZXIgaXMgaWRsZSwgcmVzdGFydGluZyIpOworCQkJaWYgKGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZykgeworCQkJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcoRlRfV1JfREVMRVRFKSwKKwkJCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcoRlRfV1JfTVVMVEkpLAorCQkJCQkgICAgbGFzdF93cml0ZV9mYWlsZWQgPSAxKTsKKwkJCX0KKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAidGFpbDogJWQsIGhlYWQ6ICVkIiwgCisJCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV90YWlsKSwKKwkJICAgICAgZnRhcGVfYnVmZmVyX2lkKGZ0X3F1ZXVlX2hlYWQpKTsKKwkJVFJBQ0VfQ0FUQ0goZmRjX2ludGVycnVwdF93YWl0KDUgKiBGVF9TRUNPTkQpLAorCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCWhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlpZiAoaGVhZC0+c3RhdHVzID09IGVycm9yKSB7CisJCQkvKiBBbGxvdyBlc2NhcGUgZnJvbSBsb29wIHdoZW4gc2lnbmFsZWQgIQorCQkJICovCisJCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCQlpZiAoaGVhZC0+aGFyZF9lcnJvcl9tYXAgIT0gMCkgeworCQkJCS8qICBJbXBsZW1lbnQgaGFyZCB3cml0ZSBlcnJvciByZWNvdmVyeSBoZXJlCisJCQkJICovCisJCQl9CisJCQkvKiByZXRyeSB0aGlzIG9uZSAqLworCQkJaGVhZC0+c3RhdHVzID0gd2FpdGluZzsKKwkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7CisJCQkJZnRhcGVfZHVtYl9zdG9wKCk7CisJCQl9CisJCQlpZiAoZnRfcnVubmVyX3N0YXR1cyAhPSBpZGxlKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJCSAgICAidW5leHBlY3RlZCBzdGF0ZTogIgorCQkJCQkgICAgImZ0X3J1bm5lcl9zdGF0dXMgIT0gaWRsZSIpOworCQkJfQorCQkJZnRhcGVfc3RhcnRfd3JpdGluZyhmdF9kcml2ZXJfc3RhdGUgPT0gZGVsZXRpbmcKKwkJCQkJICAgID8gRlRfV1JfTVVMVEkgOiBGVF9XUl9ERUxFVEUpOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJsb29waW5nIHVudGlsIHdyaXRlcyBkb25lIik7CisJfQorCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgV3JpdGUgZ2l2ZW4gc2VnbWVudCBmcm9tIGJ1ZmZlciBhdCBhZGRyZXNzIHRvIHRhcGUuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfc2VnbWVudChjb25zdCBpbnQgc2VnbWVudF9pZCwKKwkJCSBjb25zdCB2b2lkICphZGRyZXNzLCAKKwkJCSBjb25zdCBmdF93cml0ZV9tb2RlX3Qgd3JpdGVfbW9kZSkKK3sKKwlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJYnVmZmVyX3N0cnVjdCAqdGFpbDsKKwlidWZmZXJfc3RhdGVfZW51bSB3YW50ZWRfc3RhdGUgPSAod3JpdGVfbW9kZSA9PSBGVF9XUl9ERUxFVEUKKwkJCQkJICA/IGRlbGV0aW5nIDogd3JpdGluZyk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAic2VnbWVudF9pZCA9ICVkIiwgc2VnbWVudF9pZCk7CisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSB3YW50ZWRfc3RhdGUpIHsKKwkJaWYgKGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZyB8fAorCQkgICAgd2FudGVkX3N0YXRlID09IGRlbGV0aW5nKSB7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBmdGFwZV9hYm9ydF9vcGVyYXRpb24iKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwkJZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnMoKTsKKwkJZnRhcGVfc2V0X3N0YXRlKHdhbnRlZF9zdGF0ZSk7CisJfQorCS8qICAgIGlmIGFsbCBidWZmZXJzIGZ1bGwgd2UnbGwgaGF2ZSB0byB3YWl0Li4uCisJICovCisJZnRhcGVfd2FpdF9zZWdtZW50KHdhbnRlZF9zdGF0ZSk7CisJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJc3dpdGNoKHRhaWwtPnN0YXR1cykgeworCWNhc2UgZG9uZToKKwkJZnRfaGlzdG9yeS5kZWZlY3RzICs9IGNvdW50X29uZXModGFpbC0+aGFyZF9lcnJvcl9tYXApOworCQlicmVhazsKKwljYXNlIHdhaXRpbmc6CisJCS8qIHRoaXMgY291bGQgaGFwcGVuIHdpdGggbXVsdGlwbGUgRU1QVFlfU0VHTUVOVHMsIGJ1dAorCQkgKiBzaG91bGRuJ3QgaGFwcGVuIGFueSBtb3JlIGFzIHdlIHJlLXN0YXJ0IHRoZSBydW5uZXIgZXZlbgorCQkgKiB3aXRoIGFuIGVtcHR5IHNlZ21lbnQuCisJCSAqLworCQlieXRlc193cml0dGVuID0gLUVBR0FJTjsKKwkJYnJlYWs7CisJY2FzZSBlcnJvcjoKKwkJLyogIHNldHVwIGZvciBhIHJldHJ5CisJCSAqLworCQl0YWlsLT5zdGF0dXMgPSB3YWl0aW5nOworCQlieXRlc193cml0dGVuID0gLUVBR0FJTjsgLyogZm9yY2UgcmV0cnkgKi8KKwkJaWYgKHRhaWwtPmhhcmRfZXJyb3JfbWFwICE9IDApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgCisJCQkgICAgICAid2FybmluZzogJWQgaGFyZCBlcnJvcihzKSBpbiB3cml0dGVuIHNlZ21lbnQiLAorCQkJICAgICAgY291bnRfb25lcyh0YWlsLT5oYXJkX2Vycm9yX21hcCkpOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImhhcmRfZXJyb3JfbWFwID0gMHglMDhseCIsIAorCQkJICAgICAgKGxvbmcpdGFpbC0+aGFyZF9lcnJvcl9tYXApOworCQkJLyogIEltcGxlbWVudCBoYXJkIHdyaXRlIGVycm9yIHJlY292ZXJ5IGhlcmUKKwkJCSAqLworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJ3YWl0IGZvciBlbXB0eSBzZWdtZW50IGZhaWxlZCwgdGFpbCBzdGF0dXM6ICVkIiwKKwkJCSAgICB0YWlsLT5zdGF0dXMpOworCX0KKwkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPworCSAqLworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7CisJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlpZiAoaGVhZC0+c3RhdHVzID09IHdhbnRlZF9zdGF0ZSkgeworCQkJaGVhZC0+c3RhdHVzID0gZG9uZTsgLyogPz8/PyAqLworCQl9CisJCS8qICBkb24ndCBjYWxsIGFib3J0X29wZXJhdGlvbigpLCB3ZSBkb24ndCB3YW50IHRvIHphcAorCQkgKiAgdGhlIGRtYSBidWZmZXJzCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9kdW1iX3N0b3AoKSwpOworCX0gZWxzZSB7CisJCS8qICBJZiBqdXN0IHBhc3NlZCBsYXN0IHNlZ21lbnQgb24gdGFwZTogd2FpdCBmb3IgQk9UCisJCSAqICBvciBFT1QgbWFyay4gU2V0cyBmdF9ydW5uZXJfc3RhdHVzIHRvIGlkbGUgaWYgYXQgbEVPVAorCQkgKiAgYW5kIHN1Y2Nlc3NmdWwgCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3QoKSwpOworCX0KKwlpZiAodGFpbC0+c3RhdHVzID09IGRvbmUpIHsKKwkJLyogbm93IGF0IGxlYXN0IG9uZSBidWZmZXIgaXMgZW1wdHksIGZpbGwgaXQgd2l0aCBvdXIKKwkJICogZGF0YS4gIHNraXAgYmFkIHNlY3RvcnMgYW5kIGdlbmVyYXRlIGVjYy4KKwkJICogY29weV9hbmRfZ2VuX2VjYyByZXR1cm4gbnIgb2YgYnl0ZXMgd3JpdHRlbiwgcmFuZ2UKKwkJICogMC4uMjkgS2IgaW5jbHVzaXZlISAgCisJCSAqCisJCSAqIEVtcHR5IHNlZ21lbnRzIGFyZSBoYW5kbGVkIGluc2lkZSBjb3lwX2FuZF9nZW5fZWNjKCkKKwkJICovCisJCWlmICh3cml0ZV9tb2RlICE9IEZUX1dSX0RFTEVURSkgeworCQkJVFJBQ0VfQ0FUQ0goYnl0ZXNfd3JpdHRlbiA9IGNvcHlfYW5kX2dlbl9lY2MoCisJCQkJdGFpbC0+YWRkcmVzcywgYWRkcmVzcywKKwkJCQlmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSksKTsKKwkJfQorCQl0YWlsLT5zZWdtZW50X2lkID0gc2VnbWVudF9pZDsKKwkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKKwkJdGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCX0KKwkvKiAgU3RhcnQgdGFwZSBvbmx5IGlmIGFsbCBidWZmZXJzIGZ1bGwgb3IgZmx1c2ggbW9kZS4KKwkgKiAgVGhpcyB3aWxsIGdpdmUgaGlnaGVyIHByb2JhYmlsaXR5IG9mIHN0cmVhbWluZy4KKwkgKi8KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyAhPSBydW5uaW5nICYmIAorCSAgICAoKHRhaWwtPnN0YXR1cyA9PSB3YWl0aW5nICYmCisJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKSA9PSB0YWlsKSB8fAorCSAgICAgd3JpdGVfbW9kZSAhPSBGVF9XUl9BU1lOQykpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfc3RhcnRfd3JpdGluZyh3cml0ZV9tb2RlKSwpOworCX0KKwlUUkFDRV9FWElUIGJ5dGVzX3dyaXR0ZW47Cit9CisKKy8qICBXcml0ZSBhcyBtdWNoIGFzIGZpdHMgZnJvbSBidWZmZXIgdG8gdGhlIGdpdmVuIHNlZ21lbnQgb24gdGFwZQorICogIGFuZCBoYW5kbGUgcmV0cmllcy4KKyAqICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKSwgb3I6CisgKiAgICAgIC1FSU8gICAgICAgICAgd3JpdGUgZmFpbGVkCisgKiAgICAgIC1FSU5UUiAgICAgICAgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCisgKiAgICAgIC1FTk9TUEMgICAgICAgZGV2aWNlIGZ1bGwKKyAqLworaW50IGZ0YXBlX3dyaXRlX3NlZ21lbnQoY29uc3QgaW50IHNlZ21lbnRfaWQsCisJCQljb25zdCB2b2lkICpidWZmZXIsIAorCQkJY29uc3QgZnRfd3JpdGVfbW9kZV90IGZsdXNoKQoreworCWludCByZXRyeSA9IDA7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X2hpc3RvcnkudXNlZCB8PSAyOworCWlmIChzZWdtZW50X2lkID49IGZ0X3RyYWNrc19wZXJfdGFwZSpmdF9zZWdtZW50c19wZXJfdHJhY2spIHsKKwkJLyogdGFwZSBmdWxsICovCisJCVRSQUNFX0FCT1JUKC1FTk9TUEMsIGZ0X3RfZXJyLAorCQkJICAgICJpbnZhbGlkIHNlZ21lbnQgaWQ6ICVkIChtYXggJWQpIiwgCisJCQkgICAgc2VnbWVudF9pZCwgCisJCQkgICAgZnRfdHJhY2tzX3Blcl90YXBlICogZnRfc2VnbWVudHNfcGVyX3RyYWNrIC0xKTsKKwl9CisJZm9yICg7OykgeworCQlpZiAoKHJlc3VsdCA9IHdyaXRlX3NlZ21lbnQoc2VnbWVudF9pZCwgYnVmZmVyLCBmbHVzaCkpID49IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gMCkgeyAvKiBlbXB0eSBzZWdtZW50ICovCisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiZW1wdHkgc2VnbWVudCwgbm90aGluZyB3cml0dGVuIik7CisJCQl9CisJCQlUUkFDRV9FWElUIHJlc3VsdDsKKwkJfQorCQlpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKKwkJCWlmICgrK3JldHJ5ID4gMTAwKSB7IC8qIGdpdmUgdXAgKi8KKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCQkgICAgICAid3JpdGUgZmFpbGVkLCA+MTAwIHJldHJpZXMgaW4gc2VnbWVudCIpOworCQkJfQorCQkJVFJBQ0UoZnRfdF93YXJuLCAid3JpdGUgZXJyb3IsIHJldHJ5ICVkICglZCkiLAorCQkJICAgICAgcmV0cnksCisJCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpLT5zZWdtZW50X2lkKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9lcnIsCisJCQkJICAgICJ3cml0ZV9zZWdtZW50IGZhaWxlZCwgZXJyb3I6ICVkIiwgcmVzdWx0KTsKKwkJfQorCQkvKiBBbGxvdyBlc2NhcGUgZnJvbSBsb29wIHdoZW4gc2lnbmFsZWQgIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3Zjg5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0ZUQVBFX1dSSVRFX0gKKyNkZWZpbmUgX0ZUQVBFX1dSSVRFX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk1IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oLHYgJAorICRBdXRob3I6IGNsYXVzICQKKyAqCisgJFJldmlzaW9uOiAxLjIgJAorICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjMwICQKKyAkU3RhdGU6IEV4cCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgd3JpdGUgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqLworCisKKy8qICAgICAgZnRhcGUtd3JpdGUuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRlRfV1JfQVNZTkMgID0gMCwgLyogc3RhcnQgdGFwZSBvbmx5IHdoZW4gYWxsIGJ1ZmZlcnMgYXJlIGZ1bGwgKi8KKwlGVF9XUl9NVUxUSSAgPSAxLCAvKiBzdGFydCB0YXBlLCBidXQgZG9uJ3QgbmVjZXNzYXJpbHkgc3RvcCAqLworCUZUX1dSX1NJTkdMRSA9IDIsIC8qIHdyaXRlIGEgc2luZ2xlIHNlZ21lbnQgYW5kIHN0b3AgYWZ0ZXJ3YXJkcyAqLworCUZUX1dSX0RFTEVURSA9IDMgIC8qIHdyaXRlIGRlbGV0ZWQgZGF0YSBtYXJrcyAqLworfSBmdF93cml0ZV9tb2RlX3Q7CisKK2V4dGVybiBpbnQgIGZ0YXBlX3N0YXJ0X3dyaXRpbmcoY29uc3QgZnRfd3JpdGVfbW9kZV90IG1vZGUpOworZXh0ZXJuIGludCAgZnRhcGVfd3JpdGVfc2VnbWVudChjb25zdCBpbnQgc2VnbWVudCwKKwkJCQljb25zdCB2b2lkICphZGRyZXNzLCAKKwkJCQljb25zdCBmdF93cml0ZV9tb2RlX3QgZmx1c2hpbmcpOworZXh0ZXJuIHZvaWQgZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnModm9pZCk7CitleHRlcm4gaW50ICBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKHZvaWQpOworCisjZW5kaWYJCQkJLyogX0ZUQVBFX1dSSVRFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlX3N5bXMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjM2EzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlX3N5bXMuYyx2ICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqICREYXRlOiAxOTk3LzEwLzE3IDAwOjAzOjUxICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3ltYm9scyB0aGF0IHRoZSBmdGFwZSBsb3cgbGV2ZWwKKyAqICAgICAgcGFydCBvZiB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIgorICogICAgICBleHBvcnRzIHRvIGl0cyBoaWdoIGxldmVsIGNsaWVudHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oIgorCisvKiBiYWQgc2VjdG9yIGhhbmRsaW5nIGZyb20gZnRhcGUtYnNtLmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkpOworRVhQT1JUX1NZTUJPTChmdGFwZV9maW5kX2VuZF9vZl9ic21fbGlzdCk7CisvKiBmcm9tIGZ0YXBlLXJ3LmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfc2V0X3N0YXRlKTsKKy8qIGZyb20gZnRhcGUtY3RsLmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfc2Vla190b19ib3QpOworRVhQT1JUX1NZTUJPTChmdGFwZV9zZWVrX3RvX2VvdCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2Fib3J0X29wZXJhdGlvbik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2dldF9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChmdGFwZV9lbmFibGUpOworRVhQT1JUX1NZTUJPTChmdGFwZV9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfbW1hcCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUpOworLyogZnJvbSBmdGFwZS1pby5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3Jlc2V0X2RyaXZlKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfY29tbWFuZCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3BhcmFtZXRlcik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3JlYWR5X3dhaXQpOworRVhQT1JUX1NZTUJPTChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfcmVwb3J0X2Vycm9yKTsKKy8qIGZyb20gZnRhcGUtcmVhZC5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMpOworRVhQT1JUX1NZTUJPTChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KTsKKy8qIGZyb20gZnRhcGUtd3JpdGUuYyAqLworRVhQT1JUX1NZTUJPTChmdGFwZV93cml0ZV9zZWdtZW50KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfc3RhcnRfd3JpdGluZyk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUpOworLyogZnJvbSBmdGFwZS1idWZmZXIuaCAqLworRVhQT1JUX1NZTUJPTChmdGFwZV9zZXRfbnJfYnVmZmVycyk7CisvKiBmcm9tIGZ0YXBlLWZvcm1hdC5oICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX2Zvcm1hdF90cmFjayk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2Zvcm1hdF9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChmdGFwZV92ZXJpZnlfc2VnbWVudCk7CisvKiBmcm9tIHRyYWNpbmcuYyAqLworI2lmbmRlZiBDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNpbmcpOworRVhQT1JUX1NZTUJPTChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2VfY2FsbCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNlX2V4aXQpOworRVhQT1JUX1NZTUJPTChmdGFwZV90cmFjZV9sb2cpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTFjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL01ha2VmaWxlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL01ha2VmaWxlLHYgJAorIyAkUmV2aXNpb246IDEuNCAkCisjICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU4ICQKKyMKKyMgICAgICBNYWtlZmlsZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgemZ0YXBlIGludGVyZmFjZSBWRlMgdG8KKyMgICAgICBmdGFwZQorIworCisKKyMgWkZUX09CU09MRVRFIC0gZW5hYmxlIHRoZSBNVElPQ19aRlRBUEVfR0VUQkxLU1ogaW9jdGwuIFlvdSBzaG91bGQKKyMgICAgICAgICAgICAgICAgbGVhdmUgdGhpcyBlbmFibGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFwZXIuCisKK29iai0kKENPTkZJR19aRlRBUEUpICs9IHpmdGFwZS5vCisKK3pmdGFwZS1vYmpzIDo9IHpmdGFwZS1ydy5vIHpmdGFwZS1jdGwubyB6ZnRhcGUtcmVhZC5vIFwKKwkgICAgICAgemZ0YXBlLXdyaXRlLm8gemZ0YXBlLXZ0YmwubyB6ZnRhcGUtZW9mLm8gXAorCSAgICAgICB6ZnRhcGUtaW5pdC5vIHpmdGFwZS1idWZmZXJzLm8gemZ0YXBlX3N5bXMubworCitFWFRSQV9DRkxBR1MgOj0gLURaRlRfT0JTT0xFVEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA2ZjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5jLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6NTkgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkeW5hbWljIGJ1ZmZlciBhbGxvY2F0aW9uIHJvdXRpbmVzIAorICogICAgICBvZiB6ZnRhcGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKKworLyogIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisvKiAgbG9jYWwgdmFyaWJhbGVzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlZF9tZW1vcnk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBlYWtfbWVtb3J5OworCit2b2lkIHpmdF9tZW1vcnlfc3RhdHModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJNZW1vcnkgdXNhZ2UgKHZtYWxsb2MgYWxsb2NhdGlvbnMpOlxuIgorCSAgICAgIEtFUk5fSU5GTyAidG90YWwgYWxsb2NhdGVkOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicGVhayBhbGxvY2F0aW9uOiAlZCIsCisJICAgICAgdXNlZF9tZW1vcnksIHBlYWtfbWVtb3J5KTsKKwlwZWFrX21lbW9yeSA9IHVzZWRfbWVtb3J5OworCVRSQUNFX0VYSVQ7Cit9CisKK2ludCB6ZnRfdmNhbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJaWYgKHpmdF92bWFsbG9jX29uY2UobmV3LCBzaXplKSA8IDApIHsKKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwltZW1zZXQoKih2b2lkICoqKW5ldywgJ1wwJywgc2l6ZSk7CisJVFJBQ0VfRVhJVCAwOworfQoraW50IHpmdF92bWFsbG9jX29uY2Uodm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICgqKHZvaWQgKiopbmV3ICE9IE5VTEwgfHwgc2l6ZSA9PSAwKSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKCgqKHZvaWQgKiopbmV3ID0gdm1hbGxvYyhzaXplKSkgPT0gTlVMTCkgeworCQlUUkFDRV9FWElUIC1FTk9NRU07CisJfQorCXVzZWRfbWVtb3J5ICs9IHNpemU7CisJaWYgKHBlYWtfbWVtb3J5IDwgdXNlZF9tZW1vcnkpIHsKKwkJcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKKwl9CisJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwKKwkJICAgICJhbGxvY2F0ZWQgYnVmZmVyIEAgJXAsICVkIGJ5dGVzIiwgKih2b2lkICoqKW5ldywgc2l6ZSk7Cit9CitpbnQgemZ0X3ZtYWxsb2NfYWx3YXlzKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl6ZnRfdmZyZWUobmV3LCBzaXplKTsKKwlUUkFDRV9FWElUIHpmdF92bWFsbG9jX29uY2UobmV3LCBzaXplKTsKK30KK3ZvaWQgemZ0X3ZmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKih2b2lkICoqKW9sZCkgeworCQl2ZnJlZSgqKHZvaWQgKiopb2xkKTsKKwkJdXNlZF9tZW1vcnkgLT0gc2l6ZTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInJlbGVhc2VkIGJ1ZmZlciBAICVwLCAlZCBieXRlcyIsCisJCSAgICAgICoodm9pZCAqKilvbGQsIHNpemUpOworCQkqKHZvaWQgKiopb2xkID0gTlVMTDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKwordm9pZCAqemZ0X2ttYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqbmV3OworCisJd2hpbGUgKChuZXcgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJfQorCW1lbXNldChuZXcsIDAsIHNpemUpOworCXVzZWRfbWVtb3J5ICs9IHNpemU7CisJaWYgKHBlYWtfbWVtb3J5IDwgdXNlZF9tZW1vcnkpIHsKKwkJcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKKwl9CisJcmV0dXJuIG5ldzsKK30KKwordm9pZCB6ZnRfa2ZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSkKK3sKKwlrZnJlZShvbGQpOworCXVzZWRfbWVtb3J5IC09IHNpemU7Cit9CisKKy8qIHRoZXJlIGFyZSBzb21lIG1vcmUgYnVmZmVycyB0aGF0IGFyZSBhbGxvY2F0ZWQgb24gZGVtYW5kLgorICogY2xlYW51cF9tb2R1bGUoKSBjYWxsZXMgdGhpcyBmdW5jdGlvbiB0byBiZSBzdXJlIHRvIGhhdmUgcmVsZWFzZWQKKyAqIHRoZW0gCisgKi8KK3ZvaWQgemZ0X3VuaW5pdF9tZW0odm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXpmdF92ZnJlZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOworCXpmdF92ZnJlZSgmemZ0X2RlYmxvY2tfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOyB6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7CisJemZ0X2ZyZWVfdnRibCgpOworCWlmICh6ZnRfY21wcl9sb2NrKDAgLyogZG9uJ3QgbG9hZCAqLykgPT0gMCkgeworCQkoKnpmdF9jbXByX29wcy0+Y2xlYW51cCkoKTsKKwkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOyAvKiB1bmxvY2sgaXQgYWdhaW4gKi8KKwl9CisJemZ0X21lbW9yeV9zdGF0cygpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZTMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIF9GVEFQRV9EWU5NRU1fSAorI2RlZmluZSBfRlRBUEVfRFlOTUVNX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU5ICQKKyAqCisgKiAgIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorICoKKyAqLworCisvKiB3ZSBkbyBub3QgYWxsb2NhdGUgYWxsIG9mIHRoZSByZWFsbHkgbGFyZ2UgYnVmZmVyIG1lbW9yeSBiZWZvcmUKKyAqIHNvbWVvbmUgdHJpZXMgdG8gb3BlbiB0aGUgZHJpdmUuIGZ0YXBlX29wZW4oKSBtYXkgZmFpbCB3aXRoCisgKiAtRU5PTUVNLCBidXQgdGhhdCdzIGJldHRlciBoYXZpbmcgMjAwayBvZiB2bWFsbG9jZWQgbWVtb3J5IHdoaWNoCisgKiBjYW5ub3QgYmUgc3dhcHBlZCBvdXQuCisgKi8KKworZXh0ZXJuIHZvaWQgIHpmdF9tZW1vcnlfc3RhdHModm9pZCk7CitleHRlcm4gaW50ICAgemZ0X3ZtYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgICB6ZnRfdmNhbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpOworZXh0ZXJuIGludCAgIHpmdF92bWFsbG9jX2Fsd2F5cyh2b2lkICpuZXcsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICB6ZnRfdmZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqemZ0X2ttYWxsb2Moc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgIHpmdF9rZnJlZSh2b2lkICpvbGQsIHNpemVfdCBzaXplKTsKKworLyogY2FsbGVkIGJ5IGNsZWFudXBfbW9kdWxlKCkgCisgKi8KK2V4dGVybiB2b2lkIHpmdF91bmluaXRfbWVtKHZvaWQpOworCisjZW5kaWYKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc4NzRlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jCkBAIC0wLDAgKzEsMTQxOCBAQAorLyogCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yLjYuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNCAxODowNzozMyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5vbi1yZWFkL3dyaXRlIHpmdGFwZSBmdW5jdGlvbnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK2ludCB6ZnRfd3JpdGVfcHJvdGVjdGVkOyAvKiB0aGlzIGlzIHdoZW4gY2FydHJpZGdlIHJkb25seSBvciBPX1JET05MWSAqLworaW50IHpmdF9oZWFkZXJfcmVhZDsKK2ludCB6ZnRfb2ZmbGluZTsKK3Vuc2lnbmVkIGludCB6ZnRfdW5pdDsKK2ludCB6ZnRfcmVzaWQ7CitpbnQgemZ0X210X2NvbXByZXNzaW9uOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgZ29pbmdfb2ZmbGluZTsKKwordHlwZWRlZiBpbnQgKG10X2Z1bikoaW50ICphcmdwdHIpOwordHlwZWRlZiBpbnQgKCptdF9mdW5wKShpbnQgKmFyZ3B0cik7Cit0eXBlZGVmIHN0cnVjdAoreworCW10X2Z1bnAgZnVuY3Rpb247CisJdW5zaWduZWQgb2ZmbGluZSAgICAgICAgIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIG9mZmxpbmUgb3Igbm9fdGFwZSAqLworCXVuc2lnbmVkIHdyaXRlX3Byb3RlY3RlZCA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiB3cml0ZS1wcm90ZWN0ZWQgICAgKi8KKwl1bnNpZ25lZCBub3RfZm9ybWF0dGVkICAgOiAxOyAvKiBvcCBwZXJtaXR0ZWQgaWYgdGFwZSBub3QgZm9ybWF0dGVkICovCisJdW5zaWduZWQgcmF3X21vZGUgICAgICAgIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIHpmdF9tb2RlID09IDAgICAgKi8KKwl1bnNpZ25lZCBuZWVkX2lkbGVfc3RhdGUgOiAxOyAvKiBuZWVkIHRvIGNhbGwgZGVmX2lkbGVfc3RhdGUgICAgICAgICovCisJY2hhciAgICAgKm5hbWU7Cit9IGZ1bl9lbnRyeTsKKworc3RhdGljIG10X2Z1biBtdF9kdW1teSwgbXRfcmVzZXQsIG10X2ZzciwgbXRfYnNyLCBtdF9yZXcsIG10X29mZmwsIG10X25vcCwKKwltdF93ZW9mLCBtdF9lcmFzZSwgbXRfcmFzMiwgbXRfc2V0YmxrLCBtdF9zZXRkZW5zaXR5LAorCW10X3NlZWssIG10X3RlbGwsIG10X3JldGVuLCBtdF9lb20sIG10X2ZzZiwgbXRfYnNmLAorCW10X2ZzZm0sIG10X2JzZm0sIG10X3NldGRydmJ1ZmZlciwgbXRfY29tcHJlc3Npb247CisKK3N0YXRpYyBmdW5fZW50cnkgbXRfZnVuc1tdPQoreyAKKwl7bXRfcmVzZXQgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfUkVTRVQiIH0sIC8qICAwICovCisJe210X2ZzZiAgICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0ZTRiIgICB9LAorCXttdF9ic2YgICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9CU0YiICAgfSwKKwl7bXRfZnNyICAgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfRlNSIiAgIH0sCisJe210X2JzciAgICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX0JTUiIgICB9LAorCXttdF93ZW9mICAgICAgICAsIDAsIDAsIDAsIDAsIDAsICJNVF9XRU9GIiAgfSwgLyogIDUgKi8KKwl7bXRfcmV3ICAgICAgICAgLCAwLCAxLCAxLCAxLCAwLCAiTVRfUkVXIiAgIH0sCisJe210X29mZmwgICAgICAgICwgMCwgMSwgMSwgMSwgMCwgIk1UX09GRkwiICB9LAorCXttdF9ub3AgICAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9OT1AiICAgfSwKKwl7bXRfcmV0ZW4gICAgICAgLCAwLCAxLCAxLCAxLCAwLCAiTVRfUkVURU4iIH0sCisJe210X2JzZm0gICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0JTRk0iICB9LCAvKiAxMCAqLworCXttdF9mc2ZtICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9GU0ZNIiAgfSwKKwl7bXRfZW9tICAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfRU9NIiAgIH0sCisJe210X2VyYXNlICAgICAgICwgMCwgMCwgMCwgMSwgMCwgIk1UX0VSQVNFIiB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9SQVMxIiAgfSwKKwl7bXRfcmFzMiAgICAgICAgLCAwLCAwLCAwLCAxLCAwLCAiTVRfUkFTMiIgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1JBUzMiICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJVTktOT1dOIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiVU5LTk9XTiIgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIlVOS05PV04iICB9LAorCXttdF9zZXRibGsgICAgICAsIDEsIDEsIDEsIDEsIDEsICJNVF9TRVRCTEsifSwgLyogMjAgKi8KKwl7bXRfc2V0ZGVuc2l0eSAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfU0VUREVOU0lUWSJ9LAorCXttdF9zZWVrICAgICAgICAsIDAsIDEsIDAsIDEsIDEsICJNVF9TRUVLIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfVEVMTCIgIH0sIC8qIHdyLW9ubHkgPyEgKi8KKwl7bXRfc2V0ZHJ2YnVmZmVyLCAxLCAxLCAxLCAxLCAwLCAiTVRfU0VURFJWQlVGRkVSIiB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9GU1MiICAgfSwgLyogMjUgKi8KKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfQlNTIiAgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1dTTSIgICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9MT0NLIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfVU5MT0NLIn0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX0xPQUQiICB9LCAvKiAzMCAqLworCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9VTkxPQUQifSwKKwl7bXRfY29tcHJlc3Npb24gLCAxLCAxLCAxLCAwLCAxLCAiTVRfQ09NUFJFU1NJT04ifSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfU0VUUEFSVCJ9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9NS1BBUlQifQorfTsgIAorCisjZGVmaW5lIE5SX01UX0NNRFMgTlJfSVRFTVMobXRfZnVucykKKwordm9pZCB6ZnRfcmVzZXRfcG9zaXRpb24oemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlwb3MtPnNlZ19ieXRlX3BvcyA9CisJCXBvcy0+dm9sdW1lX3BvcyA9IDA7CisJaWYgKHpmdF9oZWFkZXJfcmVhZCkgeworCQkvKiBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZvbHVtZSB0YWJsZSBhbmQKKwkJICogY29tcHJlc3Npb24gbWFwLiBXZSB0aGVyZWZvciBzaW1wbHkKKwkJICogcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QKKwkJICogdm9sdW1lLiBUaGlzIGNvdmVycyBvbGQgZnRhcGUgYXJjaGl2ZXMgYXMKKwkJICogd2VsbCBoYXMgdmFyaW91cyBmbGF2b3VycyBvZiB0aGUKKwkJICogY29tcHJlc3Npb24gbWFwIHNlZ21lbnRzLiBUaGUgd29yc3QgY2FzZSBpcworCQkgKiB0aGF0IHRoZSBjb21wcmVzc2lvbiBtYXAgc2hvd3MgdXAgYXMgYQorCQkgKiBhZGRpdGlvbmFsIHZvbHVtZSBpbiBmcm9udCBvZiBhbGwgb3RoZXJzLgorCQkgKi8KKwkJcG9zLT5zZWdfcG9zICA9IHpmdF9maW5kX3ZvbHVtZSgwKS0+c3RhcnRfc2VnOworCQlwb3MtPnRhcGVfcG9zID0gemZ0X2NhbGNfdGFwZV9wb3MocG9zLT5zZWdfcG9zKTsKKwl9IGVsc2UgeworCQlwb3MtPnRhcGVfcG9zID0gIDA7CisJCXBvcy0+c2VnX3BvcyAgPSAtMTsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9ICAwOworCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKKwl6ZnRfaW9fc3RhdGUgICAgICAgID0gemZ0X2lkbGU7CisJemZ0X3phcF9yZWFkX2J1ZmZlcnMoKTsKKwl6ZnRfcHJldmVudF9mbHVzaCgpOworCS8qICB1bmxvY2sgdGhlIGNvbXByZXNpc29uIG1vZHVsZSBpZiBpdCBpcyBsb2FkZWQuCisJICogIFRoZSB6ZXJvIGFyZyBtZWFucyBub3QgdG8gdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZS4KKwkgKi8KKwlpZiAoemZ0X2NtcHJfbG9jaygwKSA9PSAwKSB7CisJCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsgLyogdW5sb2NrICovCisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIHpmdF9pbml0X2RyaXZlcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJemZ0X3Jlc2lkID0KKwkJemZ0X2hlYWRlcl9yZWFkICAgICAgICAgID0KKwkJemZ0X29sZF9mdGFwZSAgICAgICAgICAgID0KKwkJemZ0X29mZmxpbmUgICAgICAgICAgICAgID0KKwkJemZ0X3dyaXRlX3Byb3RlY3RlZCAgICAgID0KKwkJZ29pbmdfb2ZmbGluZSAgICAgICAgICAgID0KKwkJemZ0X210X2NvbXByZXNzaW9uICAgICAgID0KKwkJemZ0X2hlYWRlcl9jaGFuZ2VkICAgICAgID0KKwkJemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0KKwkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgICAgID0gMDsKKwl6ZnRfYmxrX3N6ID0gQ09ORklHX1pGVF9ERkxUX0JMS19TWjsKKwl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOyAvKiBkb2VzIG1vc3Qgb2YgdGhlIHN0dWZmICovCisJZnRhcGVfemFwX3JlYWRfYnVmZmVycygpOworCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKKwlUUkFDRV9FWElUOworfQorCitpbnQgemZ0X2RlZl9pZGxlX3N0YXRlKHZvaWQpCit7IAorCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7CisJCXJlc3VsdCA9IHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cygpOworCX0gZWxzZSBpZiAoKHJlc3VsdCA9IHpmdF9mbHVzaF9idWZmZXJzKCkpID49IDAgJiYgemZ0X3FpY19tb2RlKSB7CisJCS8qICBkb24ndCBtb3ZlIHBhc3QgZW9mCisJCSAqLworCQkodm9pZCl6ZnRfY2xvc2Vfdm9sdW1lKCZ6ZnRfcG9zKTsKKwl9CisJaWYgKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpIDwgMCkgeworCQlUUkFDRShmdF90X3dhcm4sICJmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSBmYWlsZWQiKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwl9CisJLyogY2xlYXIgcmVtYWluaW5nIHJlYWQgYnVmZmVycyAqLworCXpmdF96YXBfcmVhZF9idWZmZXJzKCk7CisJemZ0X2lvX3N0YXRlID0gemZ0X2lkbGU7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgZnVuY3Rpb25zIGZvciB0aGUgTVRJT0NUT1AgY29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG10X2R1bW15KGludCAqZHVtbXkpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0VfRVhJVCAtRU5PU1lTOworfQorCitzdGF0aWMgaW50IG10X3Jlc2V0KGludCAqZHVtbXkpCit7ICAgICAgICAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwkodm9pZClmdGFwZV9zZWVrX3RvX2JvdCgpOworCVRSQUNFX0NBVENIKGZ0YXBlX3Jlc2V0X2RyaXZlKCksCisJCSAgICB6ZnRfaW5pdF9kcml2ZXIoKTsgemZ0X3VuaW5pdF9tZW0oKTsgemZ0X29mZmxpbmUgPSAxKTsKKwkvKiAgZmFrZSBhIHJlLW9wZW4gb2YgdGhlIGRldmljZS4gVGhpcyB3aWxsIHNldCBhbGwgZmxhZ2UgYW5kIAorCSAqICBhbGxvY2F0ZSBidWZmZXJzIGFzIGFwcHJvcHJpYXRlLiBUaGUgbmV3IHRhcGUgY29uZGl0aW9uIHdpbGwKKwkgKiAgZm9yY2UgdGhlIG9wZW4gcm91dGluZSB0byBkbyBhbnl0aGluZyB3ZSBuZWVkLgorCSAqLworCVRSQUNFX0NBVENIKF96ZnRfb3BlbigtMSAvKiBmYWtlIHJlb3BlbiAqLywgMCAvKiBkdW1teSAqLyksKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRfZnNmKGludCAqYXJnKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlyZXN1bHQgPSB6ZnRfc2tpcF92b2x1bWVzKCphcmcsICZ6ZnRfcG9zKTsKKwl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMDsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9ic2YoaW50ICphcmcpCit7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKCphcmcgIT0gMCkgeworCQlyZXN1bHQgPSB6ZnRfc2tpcF92b2x1bWVzKC0qYXJnICsgMSwgJnpmdF9wb3MpOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzZWVrX2Jsb2NrKF9fczY0IGRhdGFfb2Zmc2V0LAorCQkgICAgICBfX3M2NCBibG9ja19pbmNyZW1lbnQsCisJCSAgICAgIHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwlpbnQgcmVzdWx0ICAgICAgPSAwOworCV9fczY0IG5ld19ibG9ja19wb3M7CisJX19zNjQgdm9sX2Jsb2NrX2NvdW50OworCWNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWU7CisJaW50IGV4Y2VlZDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKKwlpZiAodm9sdW1lLT5zdGFydF9zZWcgPT0gMCB8fCB2b2x1bWUtPmVuZF9zZWcgPT0gMCkgeworCQlUUkFDRV9FWElUIC1FSU87CisJfQorCW5ld19ibG9ja19wb3MgICA9ICh6ZnRfZGl2X2Jsa3N6KGRhdGFfb2Zmc2V0LCB2b2x1bWUtPmJsa19zeikKKwkJCSAgICsgYmxvY2tfaW5jcmVtZW50KTsKKwl2b2xfYmxvY2tfY291bnQgPSB6ZnRfZGl2X2Jsa3N6KHZvbHVtZS0+c2l6ZSwgdm9sdW1lLT5ibGtfc3opOworCWlmIChuZXdfYmxvY2tfcG9zIDwgMCkgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAibmV3X2Jsb2NrX3BvcyAiIExMX1ggIiA8IDAiLCBMTChuZXdfYmxvY2tfcG9zKSk7CisJCXpmdF9yZXNpZCAgICAgPSAoaW50KW5ld19ibG9ja19wb3M7CisJCW5ld19ibG9ja19wb3MgPSAwOworCQlleGNlZWQgPSAxOworCX0gZWxzZSBpZiAobmV3X2Jsb2NrX3BvcyA+IHZvbF9ibG9ja19jb3VudCkgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAibmV3X2Jsb2NrX3BvcyAiIExMX1ggIiBleGNlZWRzIHNpemUgb2Ygdm9sdW1lICIgTExfWCwKKwkJICAgICAgTEwobmV3X2Jsb2NrX3BvcyksIExMKHZvbF9ibG9ja19jb3VudCkpOworCQl6ZnRfcmVzaWQgICAgID0gKGludCkodm9sX2Jsb2NrX2NvdW50IC0gbmV3X2Jsb2NrX3Bvcyk7CisJCW5ld19ibG9ja19wb3MgPSB2b2xfYmxvY2tfY291bnQ7CisJCWV4Y2VlZCA9IDE7CisJfSBlbHNlIHsKKwkJZXhjZWVkID0gMDsKKwl9CisJaWYgKHpmdF91c2VfY29tcHJlc3Npb24gJiYgdm9sdW1lLT51c2VfY29tcHJlc3Npb24pIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfbG9jaygxIC8qIHRyeSB0byBsb2FkICovKSwpOworCQlyZXN1bHQgPSAoKnpmdF9jbXByX29wcy0+c2VlaykobmV3X2Jsb2NrX3BvcywgcG9zLCB2b2x1bWUsCisJCQkJCSAgICAgICB6ZnRfZGVibG9ja19idWYpOworCQlwb3MtPnRhcGVfcG9zICA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7CisJCXBvcy0+dGFwZV9wb3MgKz0gcG9zLT5zZWdfYnl0ZV9wb3M7CisJfSBlbHNlIHsKKwkJcG9zLT52b2x1bWVfcG9zID0gemZ0X211bF9ibGtzeihuZXdfYmxvY2tfcG9zLCB2b2x1bWUtPmJsa19zeik7CisJCXBvcy0+dGFwZV9wb3MgICA9IHpmdF9jYWxjX3RhcGVfcG9zKHZvbHVtZS0+c3RhcnRfc2VnKTsKKwkJcG9zLT50YXBlX3BvcyAgKz0gcG9zLT52b2x1bWVfcG9zOworCQlwb3MtPnNlZ19wb3MgICAgPSB6ZnRfY2FsY19zZWdfYnl0ZV9jb29yZCgmcG9zLT5zZWdfYnl0ZV9wb3MsCisJCQkJCQkJICBwb3MtPnRhcGVfcG9zKTsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IHZvbHVtZS0+c2l6ZSA9PSBwb3MtPnZvbHVtZV9wb3M7CisJaWYgKHpmdF9qdXN0X2JlZm9yZV9lb2YpIHsKKwkJLyogd2h5IHRoaXM/IGJlY2F1c2UgemZ0X2ZpbGVfbm8gY2hlY2tzIGFnYWlucyBzdGFydAorCQkgKiBhbmQgZW5kIHNlZ21lbnQgb2YgYSB2b2x1bWUuIFdlIGRvIG5vdCB3YW50IHRvCisJCSAqIGFkdmFuY2UgdG8gdGhlIG5leHQgdm9sdW1lIHdpdGggdGhpcyBmdW5jdGlvbi4KKwkJICovCisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZXQgemZ0X2p1c3RfYmVmb3JlX2VvZiIpOworCQl6ZnRfcG9zaXRpb25fYmVmb3JlX2VvZihwb3MsIHZvbHVtZSk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkgICAgICBLRVJOX0lORk8gIm5ld19zZWdfcG9zIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gIm5ld190YXBlX3BvczogIiBMTF9YICJcbiIKKwkgICAgICBLRVJOX0lORk8gInZvbF9zaXplICAgIDogIiBMTF9YICJcbiIKKwkgICAgICBLRVJOX0lORk8gInNlZ19ieXRlX3BvczogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gImJsa19zeiAgOiAlZCIsIAorCSAgICAgIHBvcy0+c2VnX3BvcywgTEwocG9zLT50YXBlX3BvcyksCisJICAgICAgTEwodm9sdW1lLT5zaXplKSwgcG9zLT5zZWdfYnl0ZV9wb3MsCisJICAgICAgdm9sdW1lLT5ibGtfc3opOworCWlmICghZXhjZWVkKSB7CisJCXpmdF9yZXNpZCA9IG5ld19ibG9ja19wb3MgLSB6ZnRfZGl2X2Jsa3N6KHBvcy0+dm9sdW1lX3BvcywKKwkJCQkJCQkgIHZvbHVtZS0+YmxrX3N6KTsKKwl9CisJaWYgKHpmdF9yZXNpZCA8IDApIHsKKwkJemZ0X3Jlc2lkID0gLXpmdF9yZXNpZDsKKwl9CisJVFJBQ0VfRVhJVCAoKGV4Y2VlZCB8fCB6ZnRfcmVzaWQgIT0gMCkgJiYgcmVzdWx0ID49IDApID8gLUVJTlZBTCA6IHJlc3VsdDsKK30gICAgIAorCitzdGF0aWMgaW50IG10X2ZzcihpbnQgKmFyZykKK3sgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlyZXN1bHQgPSBzZWVrX2Jsb2NrKHpmdF9wb3Mudm9sdW1lX3BvcywgICphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9ic3IoaW50ICphcmcpCit7ICAgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlyZXN1bHQgPSBzZWVrX2Jsb2NrKHpmdF9wb3Mudm9sdW1lX3BvcywgLSphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF93ZW9mKGludCAqYXJnKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0VfQ0FUQ0goemZ0X2ZsdXNoX2J1ZmZlcnMoKSwpOworCXJlc3VsdCA9IHpmdF93ZW9mKCphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9yZXcoaW50ICpkdW1teSkKK3sgICAgICAgICAgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZih6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJKHZvaWQpemZ0X2RlZl9pZGxlX3N0YXRlKCk7CisJfQorCXJlc3VsdCA9IGZ0YXBlX3NlZWtfdG9fYm90KCk7CisJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9vZmZsKGludCAqZHVtbXkpCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlnb2luZ19vZmZsaW5lPSAxOworCXJlc3VsdCA9IG10X3JldyhOVUxMKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9ub3AoaW50ICpkdW1teSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkvKiAgc2hvdWxkIHdlIHNldCB0YXBlIHN0YXR1cz8KKwkgKi8KKwlpZiAoIXpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLworCQkodm9pZCl6ZnRfZGVmX2lkbGVfc3RhdGUoKTsKKwl9CisJVFJBQ0VfRVhJVCAwOyAKK30KKworc3RhdGljIGludCBtdF9yZXRlbihpbnQgKmR1bW15KQoreyAgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZih6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJKHZvaWQpemZ0X2RlZl9pZGxlX3N0YXRlKCk7CisJfQorCXJlc3VsdCA9IGZ0YXBlX3NlZWtfdG9fZW90KCk7CisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCXJlc3VsdCA9IGZ0YXBlX3NlZWtfdG9fYm90KCk7CisJfQorCVRSQUNFX0VYSVQocmVzdWx0KTsKK30KKworc3RhdGljIGludCBmc2Zic2ZtKGludCBhcmcsIHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwljb25zdCB6ZnRfdm9saW5mbyAqdnRibDsKKwlfX3M2NCBibG9ja19wb3M7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJLyogV2hhdCB0byBkbz8gVGhpcyBzaG91bGQgc2VlayB0byB0aGUgbmV4dCBmaWxlLW1hcmsgYW5kCisJICogcG9zaXRpb24gQkVGT1JFLiBUaGF0IGlzLCBhIG5leHQgd3JpdGUgd291bGQganVzdCBleHRlbmQKKwkgKiB0aGUgY3VycmVudCBmaWxlLiAgV2VsbC4gTGV0J3MganVzdCBzZWVrIHRvIHRoZSBlbmQgb2YgdGhlCisJICogY3VycmVudCBmaWxlLCBpZiBjb3VudCA9PSAxLiAgSWYgY291bnQgPiAxLCB0aGVuIGRvIGEKKwkgKiAibXRfZnNmKGNvdW50IC0gMSkiLCBhbmQgdGhlbiBzZWVrIHRvIHRoZSBlbmQgb2YgdGhhdCBmaWxlLgorCSAqIElmIGNvdW50ID09IDAsIGRvIG5vdGhpbmcKKwkgKi8KKwlpZiAoYXJnID09IDApIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMDsKKwlUUkFDRV9DQVRDSCh6ZnRfc2tpcF92b2x1bWVzKGFyZyA8IDAgPyBhcmcgOiBhcmctMSwgcG9zKSwKKwkJICAgIGlmIChhcmcgPiAwKSB7CisJCQkgICAgemZ0X3Jlc2lkICsrOyAKKwkJICAgIH0pOworCXZ0YmwgICAgICA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCWJsb2NrX3BvcyA9IHpmdF9kaXZfYmxrc3oodnRibC0+c2l6ZSwgdnRibC0+YmxrX3N6KTsKKwkodm9pZClzZWVrX2Jsb2NrKDAsIGJsb2NrX3BvcywgcG9zKTsKKwlpZiAocG9zLT52b2x1bWVfcG9zICE9IHZ0YmwtPnNpemUpIHsKKwkJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJCXpmdF9yZXNpZCA9IDE7CisJCS8qIHdlIGRpZG4ndCBtYW5hZ2VkIHRvIGdvIHRoZXJlICovCisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAKKwkJCSAgICAid2FudGVkIGZpbGUgcG9zaXRpb24gIiBMTF9YICIsIGFycml2ZWQgYXQgIiBMTF9YLCAKKwkJCSAgICBMTCh2dGJsLT5zaXplKSwgTEwocG9zLT52b2x1bWVfcG9zKSk7CisJfQorCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAxOworCVRSQUNFX0VYSVQgMDsgCit9CisKK3N0YXRpYyBpbnQgbXRfYnNmbShpbnQgKmFyZykKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXJlc3VsdCA9IGZzZmJzZm0oLSphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9mc2ZtKGludCAqYXJnKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gZnNmYnNmbSgqYXJnLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfZW9tKGludCAqZHVtbXkpCit7ICAgICAgICAgICAgICAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl6ZnRfc2tpcF90b19lb20oJnpmdF9wb3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBtdF9lcmFzZShpbnQgKmR1bW15KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gemZ0X2VyYXNlKCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfcmFzMihpbnQgKmR1bW15KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gLUVOT1NZUzsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30gCisKKy8qICBTZXRzIHRoZSBuZXcgYmxvY2tzaXplIGluIEJZVEVTCisgKgorICovCitzdGF0aWMgaW50IG10X3NldGJsayhpbnQgKm5ld19zaXplKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmKCh1bnNpZ25lZCBpbnQpKCpuZXdfc2l6ZSkgPiBaRlRfTUFYX0JMS19TWikgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkgICAgImRlc2lyZWQgYmxrX3N6ICglZCkgc2hvdWxkIGJlIDw9ICVkIGJ5dGVzIiwKKwkJCSAgICAqbmV3X3NpemUsIFpGVF9NQVhfQkxLX1NaKTsKKwl9CisJaWYgKCgqbmV3X3NpemUgJiAoRlRfU0VDVE9SX1NJWkUtMSkpICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAorCQkJImRlc2lyZWQgYmxrX3N6ICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mICVkIGJ5dGVzIiwKKwkJCSAgICAqbmV3X3NpemUsIEZUX1NFQ1RPUl9TSVpFKTsKKwl9CisJaWYgKCpuZXdfc2l6ZSA9PSAwKSB7CisJCWlmICh6ZnRfdXNlX2NvbXByZXNzaW9uKSB7CisJCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkJICAgICJWYXJpYWJsZSBibG9jayBzaXplIG5vdCB5ZXQgIgorCQkJCSAgICAic3VwcG9ydGVkIHdpdGggY29tcHJlc3Npb24iKTsKKwkJfQorCQkqbmV3X3NpemUgPSAxOworCX0KKwl6ZnRfYmxrX3N6ID0gKm5ld19zaXplOworCVRSQUNFX0VYSVQgMDsKK30gCisKK3N0YXRpYyBpbnQgbXRfc2V0ZGVuc2l0eShpbnQgKmFyZykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlTRVRfVFJBQ0VfTEVWRUwoKmFyZyk7CisJVFJBQ0UoVFJBQ0VfTEVWRUwsICJ0cmFjaW5nIHNldCB0byAlZCIsIFRSQUNFX0xFVkVMKTsKKwlpZiAoKGludClUUkFDRV9MRVZFTCAhPSAqYXJnKSB7CisJCVRSQUNFX0VYSVQgLUVJTlZBTDsKKwl9CisJVFJBQ0VfRVhJVCAwOworfSAgICAgICAgICAKKworc3RhdGljIGludCBtdF9zZWVrKGludCAqbmV3X2Jsb2NrX3BvcykKK3sgCisJaW50IHJlc3VsdD0gMDsgICAgICAgIAorCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJcmVzdWx0ID0gc2Vla19ibG9jaygwLCAoX19zNjQpKm5ld19ibG9ja19wb3MsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogIE9LLCB0aGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gU0NTSSwgYnV0IHRoZSB3b3JzdCB0aGluZyB0aGF0IGNhbiAKKyAqICBoYXBwZW4gaXMgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoIGRlZnJhZ21lbnRhdGVkIG1lbW9yeSB0aGF0IGNhbiBiZSAKKyAqICBhbGxvY2F0ZWQuIEFsc28sIHRoZXJlIGlzIGEgaGFyZHdpcmVkIGxpbWl0IG9mIDE2IGRtYSBidWZmZXJzIGluIHRoZSAKKyAqICBzdG9jayBmdGFwZSBtb2R1bGUuIFRoaXMgc2hvdWxkbid0IGJyaW5nIHRoZSBzeXN0ZW0gZG93bi4KKyAqCisgKiBOT1RFOiB0aGUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSB0b3RhbCBudW1iZXIgb2YgZG1hIGJ1ZmZlcnMgdG8gdXNlLgorICogICAgICAgVGhlIGRyaXZlciBuZWVkcyBhdCBsZWFzdCAzIGJ1ZmZlcnMgdG8gZnVuY3Rpb24gYXQgYWxsLgorICogCisgKi8KK3N0YXRpYyBpbnQgbXRfc2V0ZHJ2YnVmZmVyKGludCAqY250KQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCpjbnQgPCAzKSB7CisJCVRSQUNFX0VYSVQgLUVJTlZBTDsKKwl9CisJVFJBQ0VfQ0FUQ0goZnRhcGVfc2V0X25yX2J1ZmZlcnMoKmNudCksKTsKKwlUUkFDRV9FWElUIDA7Cit9CisvKiByZXR1cm4gdGhlIGJsb2NrIHBvc2l0aW9uIGZyb20gc3RhcnQgb2Ygdm9sdW1lIAorICovCitzdGF0aWMgaW50IG10X3RlbGwoaW50ICphcmcpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJKmFyZyAgID0gemZ0X2Rpdl9ibGtzeih6ZnRfcG9zLnZvbHVtZV9wb3MsCisJCQkgICAgICAgemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3BvcyktPmJsa19zeik7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IG10X2NvbXByZXNzaW9uKGludCAqYXJnKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCS8qICBPay4gV2UgY291bGQgYWxzbyBjaGVjayB3aGV0aGVyIGNvbXByZXNzaW9uIGlzIGF2YWlsYWJsZSBhdAorCSAqICBhbGwgYnkgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvbXByZXNzaW9uIG1vZHVsZS4gIFdlIGNvdWxkCisJICogIGFsc28gY2hlY2sgZm9yIGEgYmxvY2sgc2l6ZSBvZiAxIGJ5dGUgd2hpY2ggaXMgaWxsZWdhbAorCSAqICB3aXRoIGNvbXByZXNzaW9uLiAgSW5zdGVhZCBvZiBkb2luZyBpdCBoZXJlIHdlIHJlbHkgb24KKwkgKiAgemZ0YXBlX3dyaXRlKCkgdG8gZG8gdGhlIHByb3BlciBjaGVja3MuCisJICovCisJaWYgKCh1bnNpZ25lZCBpbnQpKmFyZyA+IDEpIHsKKwkJVFJBQ0VfRVhJVCAtRUlOVkFMOworCX0KKwlpZiAoKmFyZyAhPSAwICYmIHpmdF9ibGtfc3ogPT0gMSkgeyAvKiB2YXJpYWJsZSBibG9jayBzaXplICovCisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKKwkJCSAgICAiQ29tcHJlc3Npb24gbm90IHlldCBzdXBwb3J0ZWQgIgorCQkJICAgICJ3aXRoIHZhcmlhYmxlIGJsb2NrIHNpemUiKTsKKwl9CisJemZ0X210X2NvbXByZXNzaW9uICA9ICphcmc7CisJaWYgKCh6ZnRfdW5pdCAmIFpGVF9aSVBfTU9ERSkgPT0gMCkgeworCQl6ZnRfdXNlX2NvbXByZXNzaW9uID0gemZ0X210X2NvbXByZXNzaW9uOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICBjaGVjayB3aGV0aGVyIHdyaXRlIGFjY2VzcyBpcyBhbGxvd2VkLiBXcml0ZSBhY2Nlc3MgaXMgZGVuaWVkIHdoZW4KKyAqICArIHpmdF93cml0ZV9wcm90ZWN0ZWQgPT0gMSAtLSB0aGlzIGFjY291bnRzIGZvciBlaXRoZXIgaGFyZCB3cml0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0aW9uIG9mIHRoZSBjYXJ0cmlkZ2Ugb3IgZm9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZIGFjY2VzcyBtb2RlIG9mIHRoZSB0YXBlIGRldmljZQorICogICsgemZ0X29mZmxpbmUgPT0gMSAgICAgICAgIC0tIHRoaXMgbWVhbnkgdGhhdCB0aGVyZSBpcyBlaXRoZXIgbm8gdGFwZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGF0IHRoZSBNVE9GRkxJTkUgaW9jdGwgaGFzIGJlZW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBpc3N1ZWQgKGBzb2Z0IGVqZWN0JykKKyAqICArIGZ0X2Zvcm1hdHRlZCA9PSAwICAgICAgICAtLSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNhcnRyaWRnZSBpcyBub3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQKKyAqICBUaGVuIHdlIGRpc3RpbnVndWlzaCB0d28gY2FzZXMuIFdoZW4gemZ0X3FpY19tb2RlIGlzIFRSVUUsIHRoZW4gd2UgdHJ5CisgKiAgdG8gZW11bGF0ZSBhIGB0cmFkaXRpb25hbCcgKGFrYSBTQ1NJIGxpa2UpIFVOKlggdGFwZSBkZXZpY2UuIFRoZXJlZm9yZSB3ZQorICogIGRlbnkgd3JpdGVzIHdoZW4KKyAqICArIHpmdF9xaWNfbW9kZSA9PTEgJiYgCisgKiAgICAgICAoIXpmdF90YXBlX2F0X2xib3QoKSAmJiAgIC0tIHRhcGUgbm8gYXQgbG9naWNhbCBCT1QKKyAqICAgICAgICAhKHpmdF90YXBlX2F0X2VvbSgpIHx8ICAgLS0gdGFwZSBub3QgYXQgbG9naWNhbCBFT00gKG9yIEVPRCkKKyAqICAgICAgICAgICh6ZnRfdGFwZV9hdF9lb20oKSAmJgorICogICAgICAgICAgIHpmdF9vbGRfZnRhcGUoKSkpKSAgICAtLSB3ZSBjYW4ndCBhZGQgbmV3IHZvbHVtZSB0byB0YXBlcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBieSBvbGQgZnRhcGUgYmVjYXVzZSBmdGFwZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCB1c2UgdGhlIHZvbHVtZSB0YWJsZQorICoKKyAqICB3aGVuIHRoZSBkcml2ZSBpcyBpbiB0cnVlIHJhdyBtb2RlIChha2EgL2Rldi9yYXdmdDApIHRoZW4gd2UgZG9uJ3QgCisgKiAgY2FyZSBhYm91dCBMQk9UIGFuZCBFT00gY29uZGl0aW9ucy4gVGhpcyBkZXZpY2UgaXMgaW50ZW5kZWQgZm9yIGEgCisgKiAgdXNlciBsZXZlbCBwcm9ncmFtIHRoYXQgd2FudHMgdG8gdHJ1bHkgaW1wbGVtZW50IHRoZSBRSUMtODAgY29tcGxpYW5jZQorICogIGF0IHRoZSBsb2dpY2FsIGRhdGEgbGF5b3V0IGxldmVsIG9mIHRoZSBjYXJ0cmlkZ2UsIGkuZS4gaW1wbGVtZW50IGFsbAorICogIHRoYXQgdm9sdW1lIHRhYmxlIGFuZCB2b2x1bWUgZGlyZWN0b3J5IHN0dWZmIGV0Yy48CisgKi8KK2ludCB6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKHpmdF9wb3NpdGlvbiAqcG9zKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLworCQlUUkFDRV9BQk9SVCgtRU5YSU8sCisJCQkgICAgZnRfdF9pbmZvLCAidGFwZSBpcyBvZmZsaW5lIG9yIG5vIGNhcnRyaWRnZSIpOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJ0YXBlIGlzIG5vdCBmb3JtYXR0ZWQiKTsKKwl9IAorCWlmICh6ZnRfd3JpdGVfcHJvdGVjdGVkKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgImNhcnRyaWRnZSB3cml0ZSBwcm90ZWN0ZWQiKTsKKwl9IAorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJLyogIGNoZWNrIEJPVCBjb25kaXRpb24gKi8KKwkJaWYgKCF6ZnRfdGFwZV9hdF9sYm90KHBvcykpIHsKKwkJCS8qICBwcm90ZWN0IGNhcnRyaWRnZXMgd3JpdHRlbiBieSBvbGQgZnRhcGUgaWYKKwkJCSAqICBub3QgYXQgQk9UIGJlY2F1c2UgdGhleSB1c2UgdGhlIHZ0YmwKKwkJCSAqICBzZWdtZW50IGZvciBzdG9yaW5nIGRhdGEKKwkJCSAqLworCQkJaWYgKHpmdF9vbGRfZnRhcGUpIHsKKwkJCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X3dhcm4sIAorICAgICAgIkNhbm5vdCB3cml0ZSB0byBjYXJ0cmlkZ2VzIHdyaXR0ZW4gYnkgb2xkIGZ0YXBlIHdoZW4gbm90IGF0IEJPVCIpOworCQkJfQorCQkJLyogIG5vdCBhdCBCT1QsIGJ1dCBhbGxvdyB3cml0ZXMgYXQgRU9ELCBvZiBjb3Vyc2UKKwkJCSAqLworCQkJaWYgKCF6ZnRfdGFwZV9hdF9lb2QocG9zKSkgeworCQkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywKKwkJCQkJICAgICJ0YXBlIG5vdCBhdCBCT1QgYW5kIG5vdCBhdCBFT0QiKTsKKwkJCX0KKwkJfQorCQkvKiAgZmluZS4gTm93IHRoZSB0YXBlIGlzIGVpdGhlciBhdCBCT1Qgb3IgYXQgRU9ELiAqLworCX0KKwkvKiBvciBpbiByYXcgbW9kZSBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgQk9UIGFuZCBFT0QgKi8KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgT1BFTiByb3V0aW5lIGNhbGxlZCBieSBrZXJuZWwtaW50ZXJmYWNlIGNvZGUKKyAqCisgKiAgICAgIE5PVEU6IHRoaXMgaXMgYWxzbyBjYWxsZWQgYnkgbXRfcmVzZXQoKSB3aXRoIGRldl9taW5vciA9PSAtMQorICogICAgICAgICAgICB0byBmYWtlIGEgcmVvcGVuIGFmdGVyIGEgcmVzZXQuCisgKi8KK2ludCBfemZ0X29wZW4odW5zaWduZWQgaW50IGRldl9taW5vciwgdW5zaWduZWQgaW50IGFjY2Vzc19tb2RlKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdGFwZV91bml0OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlsZV9hY2Nlc3NfbW9kZTsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKChpbnQpZGV2X21pbm9yID09IC0xKSB7CisJCS8qIGZha2UgcmVvcGVuICovCisJCXpmdF91bml0ICAgID0gdGFwZV91bml0OworCQlhY2Nlc3NfbW9kZSA9IGZpbGVfYWNjZXNzX21vZGU7CisJCXpmdF9pbml0X2RyaXZlcigpOyAvKiByZXNldCBhbGwgc3RhdGljIGRhdGEgdG8gZGVmYXVsdHMgKi8KKwl9IGVsc2UgeworCQl0YXBlX3VuaXQgICAgICAgID0gZGV2X21pbm9yOworCQlmaWxlX2FjY2Vzc19tb2RlID0gYWNjZXNzX21vZGU7CisJCWlmICgocmVzdWx0ID0gZnRhcGVfZW5hYmxlKEZUQVBFX1NFTChkZXZfbWlub3IpKSkgPCAwKSB7CisJCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfZXJyLAorCQkJCSAgICAiZnRhcGVfZW5hYmxlIGZhaWxlZDogJWQiLCByZXN1bHQpOworCQl9CisJCWlmIChmdF9uZXdfdGFwZSB8fCBmdF9ub190YXBlIHx8ICFmdF9mb3JtYXR0ZWQgfHwKKwkJICAgIChGVEFQRV9TRUwoemZ0X3VuaXQpICE9IEZUQVBFX1NFTChkZXZfbWlub3IpKSB8fAorCQkgICAgKHpmdF91bml0ICYgWkZUX1JBV19NT0RFKSAhPSAoZGV2X21pbm9yICYgWkZUX1JBV19NT0RFKSkgeworCQkJLyogcmVzZXQgYWxsIHN0YXRpYyBkYXRhIHRvIGRlZmF1bHRzLAorCQkJICovCisJCQl6ZnRfaW5pdF9kcml2ZXIoKTsgCisJCX0KKwkJemZ0X3VuaXQgPSBkZXZfbWlub3I7CisJfQorCXpmdF9zZXRfZmxhZ3MoemZ0X3VuaXQpOyAvKiBkZWNvZGUgdGhlIG1pbm9yIGJpdHMgKi8KKwlpZiAoemZ0X2Jsa19zeiA9PSAxICYmIHpmdF91c2VfY29tcHJlc3Npb24pIHsKKwkJZnRhcGVfZGlzYWJsZSgpOyAvKiByZXNldHMgZnRfbm9fdGFwZSAqLworCQlUUkFDRV9BQk9SVCgtRU5PREVWLCBmdF90X3dhcm4sICJWYXJpYWJsZSBibG9jayBzaXplIG5vdCB5ZXQgIgorCQkJICAgICJzdXBwb3J0ZWQgd2l0aCBjb21wcmVzc2lvbiIpOworCX0KKwkvKiAgbm8gbmVlZCBmb3IgbW9zdCBvZiB0aGUgYnVmZmVycyB3aGVuIG5vIHRhcGUgb3Igbm90CisJICogIGZvcm1hdHRlZC4gIGZvciB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb25zLCBpdCBpcyB0aGUKKwkgKiAgcmVnYXJkbGVzcyB3aGV0aGVyIHRoZXJlIGlzIG5vIHRhcGUsIGEgbm90LWZvcm1hdHRlZCB0YXBlCisJICogIG9yIHRoZSB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgc29mdCBvZmZsaW5lLiAgCisJICogIE5ldmVydGhlbGVzcyB3ZSBhbGxvdyBzb21lIGlvY3RscyB3aXRoIG5vbi1mb3JtYXR0ZWQgdGFwZXMsIAorCSAqICBsaWtlIHJld2luZCBhbmQgcmVzZXQuCisJICovCisJaWYgKGZ0X25vX3RhcGUgfHwgIWZ0X2Zvcm1hdHRlZCkgeworCQl6ZnRfdW5pbml0X21lbSgpOworCX0KKwlpZiAoZnRfbm9fdGFwZSkgeworCQl6ZnRfb2ZmbGluZSA9IDE7IC8qIHNvIHdlIG5lZWQgbm90IHRlc3QgdHdvIHZhcmlhYmxlcyAqLworCX0KKwlpZiAoKGFjY2Vzc19tb2RlID09IE9fV1JPTkxZIHx8IGFjY2Vzc19tb2RlID09IE9fUkRXUikgJiYKKwkgICAgKGZ0X3dyaXRlX3Byb3RlY3RlZCB8fCBmdF9ub190YXBlKSkgeworCQlmdGFwZV9kaXNhYmxlKCk7IC8qIHJlc2V0cyBmdF9ub190YXBlICovCisJCVRSQUNFX0FCT1JUKGZ0X25vX3RhcGUgPyAtRU5YSU8gOiAtRVJPRlMsCisJCQkgICAgZnRfdF93YXJuLCAid3JvbmcgYWNjZXNzIG1vZGUgJXMgY2FydHJpZGdlIiwKKwkJCSAgICBmdF9ub190YXBlID8gIndpdGhvdXQgYSIgOiAid2l0aCB3cml0ZSBwcm90ZWN0ZWQiKTsKKwl9CisJemZ0X3dyaXRlX3Byb3RlY3RlZCA9IChhY2Nlc3NfbW9kZSA9PSBPX1JET05MWSB8fCAKKwkJCSAgICAgICBmdF93cml0ZV9wcm90ZWN0ZWQgIT0gMCk7CisJaWYgKHpmdF93cml0ZV9wcm90ZWN0ZWQpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgInJlYWQgb25seSBhY2Nlc3MgbW9kZTogJWQsICIKKwkJICAgICAgImRyaXZlIHdyaXRlIHByb3RlY3RlZDogJWQiLCAKKwkJICAgICAgYWNjZXNzX21vZGUgPT0gT19SRE9OTFksCisJCSAgICAgIGZ0X3dyaXRlX3Byb3RlY3RlZCAhPSAwKTsKKwl9CisJaWYgKCF6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRfZGVibG9ja19idWYsRlRfU0VHTUVOVF9TSVpFKSwKKwkJCSAgICBmdGFwZV9kaXNhYmxlKCkpOworCX0KKwkvKiB6ZnRfc2VnX3BvcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSB2dGJsIHNlZ3BvcyBidXQgbm90CisJICogaWYgaW4gY29tcGF0aWJpbGl0eSBtb2RlIGFuZCBvbmx5IGFmdGVyIHdlIHJlYWQgaW4gdGhlCisJICogaGVhZGVyIHNlZ21lbnRzCisJICoKKwkgKiBtaWdodCBhbHNvIGJlIGEgcHJvYmxlbSBpZiB0aGUgdXNlciBtYWtlcyBhIGJhY2t1cCB3aXRoIGEKKwkgKiAqcWZ0KiBkZXZpY2UgYW5kIHJld2luZHMgaXQgd2l0aCBhIHJhdyBkZXZpY2UuCisJICovCisJaWYgKHpmdF9xaWNfbW9kZSAgICAgICAgICYmCisJICAgICF6ZnRfb2xkX2Z0YXBlICAgICAgICYmCisJICAgIHpmdF9wb3Muc2VnX3BvcyA+PSAwICYmCisJICAgIHpmdF9oZWFkZXJfcmVhZCAgICAgICYmIAorCSAgICB6ZnRfcG9zLnNlZ19wb3MgPD0gZnRfZmlyc3RfZGF0YV9zZWdtZW50KSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ5b3UgcHJvYmFibHkgbWl4ZWQgdXAgdGhlIHpmdGFwZSBkZXZpY2VzISIpOworCQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOyAKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIFJFTEVBU0Ugcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCisgKi8KK2ludCBfemZ0X2Nsb3NlKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCS8qIGNhbGwgdGhlIGhhcmR3YXJlIHJlbGVhc2Ugcm91dGluZS4gUHV0cyB0aGUgZHJpdmUgb2ZmbGluZSAqLworCQlmdGFwZV9kaXNhYmxlKCk7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKCEoZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9vbGRfZnRhcGUpKSB7CisJCXJlc3VsdCA9IHpmdF9mbHVzaF9idWZmZXJzKCk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3cml0aW5nIGZpbGUgbWFyayBhdCBjdXJyZW50IHBvc2l0aW9uIik7CisJCWlmICh6ZnRfcWljX21vZGUgJiYgemZ0X2Nsb3NlX3ZvbHVtZSgmemZ0X3BvcykgPT0gMCkgeworCQkJemZ0X21vdmVfcGFzdF9lb2YoJnpmdF9wb3MpOworCQl9CisJCWlmICgoemZ0X3RhcGVfYXRfbGJvdCgmemZ0X3BvcykgfHwKKwkJICAgICAhKHpmdF91bml0ICYgRlRBUEVfTk9fUkVXSU5EKSkpIHsKKwkJCWlmIChyZXN1bHQgPj0gMCkgeworCQkJCXJlc3VsdCA9IHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKCk7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJCSJFcnJvcjogdW5hYmxlIHRvIHVwZGF0ZSBoZWFkZXIgc2VnbWVudHMiKTsKKwkJCX0KKwkJfQorCX0KKwlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwlpZiAoISh6ZnRfdW5pdCAmIEZUQVBFX05PX1JFV0lORCkpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInJld2luZGluZyB0YXBlIik7CisJCWlmIChmdGFwZV9zZWVrX3RvX2JvdCgpIDwgMCAmJiByZXN1bHQgPj0gMCkgeworCQkJcmVzdWx0ID0gLUVJTzsgLyoga2VlcCBvbGQgdmFsdWUgKi8KKwkJfQorCQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOworCX0gCisJemZ0X3phcF9yZWFkX2J1ZmZlcnMoKTsKKwkvKiAgbm93IGZyZWUgdXAgbWVtb3J5IGFzIG11Y2ggYXMgcG9zc2libGUuIFdlIGRvbid0IGRlc3Ryb3kKKwkgKiAgdGhlIGRlYmxvY2sgYnVmZmVyIGlmIGl0IGNvbnRhaW5lcyBhIHZhbGlkIHNlZ21lbnQuCisJICovCisJaWYgKHpmdF9kZWJsb2NrX3NlZ21lbnQgPT0gLTEpIHsKKwkJemZ0X3ZmcmVlKCZ6ZnRfZGVibG9ja19idWYsIEZUX1NFR01FTlRfU0laRSk7IAorCX0KKwkvKiBoaWdoIGxldmVsIGRyaXZlciBzdGF0dXMsIGZvcmNlcyBjcmVhdGlvbiBvZiBhIG5ldyB2b2x1bWUKKwkgKiB3aGVuIGNhbGxpbmcgZnRhcGVfd3JpdGUgYWdhaW4gYW5kIG5vdCB6ZnRfanVzdF9iZWZvcmVfZW9mCisJICovCisJemZ0X2lvX3N0YXRlID0gemZ0X2lkbGU7ICAKKwlpZiAoZ29pbmdfb2ZmbGluZSkgeworCQl6ZnRfaW5pdF9kcml2ZXIoKTsKKwkJemZ0X3VuaW5pdF9tZW0oKTsKKwkJZ29pbmdfb2ZmbGluZSA9IDA7CisJCXpmdF9vZmZsaW5lICAgPSAxOworCX0gZWxzZSBpZiAoemZ0X2NtcHJfbG9jaygwIC8qIGRvbid0IGxvYWQgKi8pID09IDApIHsKKwkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOyAvKiB1bmxvY2sgaXQgYWdhaW4gKi8KKwl9CisJemZ0X21lbW9yeV9zdGF0cygpOworCS8qIGNhbGwgdGhlIGhhcmR3YXJlIHJlbGVhc2Ugcm91dGluZS4gUHV0cyB0aGUgZHJpdmUgb2ZmbGluZSAqLworCWZ0YXBlX2Rpc2FibGUoKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyoKKyAqICB0aGUgd3JhcHBlciBmdW5jdGlvbiBhcm91bmQgdGhlIHdyYXBwZXIgTVRJT0NUT1AgaW9jdGwKKyAqLworc3RhdGljIGludCBtdGlvY3RvcChzdHJ1Y3QgbXRvcCAqbXRvcCwgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQgPSAwOworCWZ1bl9lbnRyeSAqbXRfZnVuX2VudHJ5OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10b3ApIHx8IG10b3AtPm10X29wID49IE5SX01UX0NNRFMpIHsKKwkJVFJBQ0VfRVhJVCAtRUlOVkFMOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBNVElPQ1RPUCBjb21tYW5kOiAlcyIsCisJICAgICAgbXRfZnVuc1ttdG9wLT5tdF9vcF0ubmFtZSk7CisJbXRfZnVuX2VudHJ5PSAmbXRfZnVuc1ttdG9wLT5tdF9vcF07CisJemZ0X3Jlc2lkID0gbXRvcC0+bXRfY291bnQ7CisJaWYgKCFtdF9mdW5fZW50cnktPm9mZmxpbmUgJiYgemZ0X29mZmxpbmUpIHsKKwkJaWYgKGZ0X25vX3RhcGUpIHsKKwkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAibm8gdGFwZSBwcmVzZW50Iik7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgImRyaXZlIGlzIG9mZmxpbmUiKTsKKwkJfQorCX0KKwlpZiAoIW10X2Z1bl9lbnRyeS0+bm90X2Zvcm1hdHRlZCAmJiAhZnRfZm9ybWF0dGVkKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgInRhcGUgaXMgbm90IGZvcm1hdHRlZCIpOworCX0KKwlpZiAoIW10X2Z1bl9lbnRyeS0+d3JpdGVfcHJvdGVjdGVkKSB7CisJCVRSQUNFX0NBVENIKHpmdF9jaGVja193cml0ZV9hY2Nlc3MoJnpmdF9wb3MpLCk7CisJfQorCWlmIChtdF9mdW5fZW50cnktPm5lZWRfaWRsZV9zdGF0ZSAmJiAhKHpmdF9vZmZsaW5lIHx8ICFmdF9mb3JtYXR0ZWQpKSB7CisJCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJfQorCWlmICghemZ0X3FpY19tb2RlICYmICFtdF9mdW5fZW50cnktPnJhd19tb2RlKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgCisiRHJpdmUgbmVlZHMgdG8gYmUgaW4gUUlDLTgwIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgdGhpcyBjb21tYW5kIik7CisJfQorCXJlc3VsdCA9IChtdF9mdW5fZW50cnktPmZ1bmN0aW9uKSgmbXRvcC0+bXRfY291bnQpOworCWlmICh6ZnRfdGFwZV9hdF9sYm90KCZ6ZnRfcG9zKSkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cygpLCk7CisJfQorCWlmIChyZXN1bHQgPj0gMCkgeworCQl6ZnRfcmVzaWQgPSAwOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyoKKyAqICBzdGFuZGFyZCBNVElPQ0dFVCBpb2N0bAorICovCitzdGF0aWMgaW50IG10aW9jZ2V0KHN0cnVjdCBtdGdldCAqbXRnZXQsIGludCBhcmdfc2l6ZSkKK3sKKwljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOworCV9fczY0IG1heF90YXBlX3BvczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGdldCkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwKKwkJCSAgICBhcmdfc2l6ZSk7CisJfQorCW10Z2V0LT5tdF90eXBlICA9IGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkICsgMHg4MDAwMDA7CisJbXRnZXQtPm10X2RzcmVnID0gZnRfbGFzdF9zdGF0dXMuc3BhY2U7CisJbXRnZXQtPm10X2VycmVnID0gZnRfbGFzdF9lcnJvci5zcGFjZTsgLyogZXJyb3IgcmVnaXN0ZXIgKi8KKwltdGdldC0+bXRfcmVzaWQgPSB6ZnRfcmVzaWQ7IC8qIHJlc2lkdXVtIG9mIHdyaXRlcywgcmVhZHMgYW5kCisJCQkJICAgICAgKiBNVElPQ1RPUCBjb21tYW5kcyAKKwkJCQkgICAgICAqLworCWlmICghemZ0X29mZmxpbmUpIHsgLyogbmVpdGhlciBub190YXBlIG5vciBzb2Z0IG9mZmxpbmUgKi8KKwkJbXRnZXQtPm10X2dzdGF0ID0gR01UX09OTElORSh+MFVMKTsKKwkJLyogc2hvdWxkIHJhdGhlciByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgY2FydHJpZGdlCisJCSAqIHRoYW4gdGhlIGFjY2VzcyBtb2RlIG9mIHRoZSBmaWxlLCB0aGVyZWZvciB1c2UKKwkJICogZnRfd3JpdGVfcHJvdGVjdGVkLCBub3QgemZ0X3dyaXRlX3Byb3RlY3RlZCAKKwkJICovCisJCWlmIChmdF93cml0ZV9wcm90ZWN0ZWQpIHsKKwkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfV1JfUFJPVCh+MFVMKTsKKwkJfQorCQlpZih6ZnRfaGVhZGVyX3JlYWQpIHsgLyogdGhpcyBjYXRjaGVzIG5vbi1mb3JtYXR0ZWQgKi8KKwkJCXZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpOworCQkJbXRnZXQtPm10X2ZpbGVubyA9IHZvbHVtZS0+Y291bnQ7CisJCQltYXhfdGFwZV9wb3MgPSB6ZnRfY2FwYWNpdHkgLSB6ZnRfYmxrX3N6OworCQkJaWYgKHpmdF91c2VfY29tcHJlc3Npb24pIHsKKwkJCQltYXhfdGFwZV9wb3MgLT0gWkZUX0NNUFJfT1ZFUkhFQUQ7CisJCQl9CisJCQlpZiAoemZ0X3RhcGVfYXRfZW9kKCZ6ZnRfcG9zKSkgeworCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfRU9EKH4wVUwpOworCQkJfQorCQkJaWYgKHpmdF9wb3MudGFwZV9wb3MgPiBtYXhfdGFwZV9wb3MpIHsKKwkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0VPVCh+MFVMKTsKKwkJCX0KKwkJCW10Z2V0LT5tdF9ibGtubyA9IHpmdF9kaXZfYmxrc3ooemZ0X3Bvcy52b2x1bWVfcG9zLAorCQkJCQkJCXZvbHVtZS0+YmxrX3N6KTsKKwkJCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mKSB7CisJCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9FT0YofjBVTCk7CisJCQl9CisJCQlpZiAoemZ0X3RhcGVfYXRfbGJvdCgmemZ0X3BvcykpIHsKKwkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0JPVCh+MFVMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW10Z2V0LT5tdF9maWxlbm8gPSBtdGdldC0+bXRfYmxrbm8gPSAtMTsKKwkJCWlmIChtdGdldC0+bXRfZHNyZWcgJiBRSUNfU1RBVFVTX0FUX0JPVCkgeworCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfQk9UKH4wVUwpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGZ0X25vX3RhcGUpIHsKKwkJCW10Z2V0LT5tdF9nc3RhdCA9IEdNVF9EUl9PUEVOKH4wVUwpOworCQl9IGVsc2UgeworCQkJbXRnZXQtPm10X2dzdGF0ID0gMFVMOworCQl9CisgCQltdGdldC0+bXRfZmlsZW5vID0gbXRnZXQtPm10X2Jsa25vID0gLTE7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworI2lmZGVmIE1USU9DUkRGVFNFRworLyoKKyAqICBSZWFkIGEgZmxvcHB5IHRhcGUgc2VnbWVudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1hbmlwdWxhdGluZyB0aGUKKyAqICB2b2x1bWUgdGFibGUsIGFuZCByZWFkIHRoZSBvbGQgaGVhZGVyIHNlZ21lbnQgYmVmb3JlIHJlLWZvcm1hdHRpbmcKKyAqICB0aGUgY2FydHJpZGdlLgorICovCitzdGF0aWMgaW50IG10aW9jcmRmdHNlZyhzdHJ1Y3QgbXRmdHNlZyAqIG10ZnRzZWcsIGludCBhcmdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NSREZUU0VHIik7CisJaWYgKHpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCisJCQkgICAgImRyaXZlciBuZWVkcyB0byBiZSBpbiByYXcgbW9kZSBmb3IgdGhpcyBpb2N0bCIpOworCX0gCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRmdHNlZykpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwKKwkJCSAgICBhcmdfc2l6ZSk7CisJfQorCWlmICh6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9FWElUIC1FTlhJTzsKKwl9CisJaWYgKG10ZnRzZWctPm10X21vZGUgIT0gRlRfUkRfU0lOR0xFICYmCisJICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfUkRfQUhFQUQpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiaW52YWxpZCByZWFkIG1vZGUiKTsKKwl9CisJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJVFJBQ0VfRVhJVCAtRUFDQ0VTOyAvKiAtRU5YSU8gPyAqLworCisJfQorCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7CisJCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJfQorCWlmIChtdGZ0c2VnLT5tdF9zZWdubyA+IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgInNlZ21lbnQgbnVtYmVyIGlzIHRvbyBsYXJnZSIpOworCX0KKwltdGZ0c2VnLT5tdF9yZXN1bHQgPSBmdGFwZV9yZWFkX3NlZ21lbnQobXRmdHNlZy0+bXRfc2Vnbm8sCisJCQkJCQl6ZnRfZGVibG9ja19idWYsCisJCQkJCQltdGZ0c2VnLT5tdF9tb2RlKTsKKwlpZiAobXRmdHNlZy0+bXRfcmVzdWx0IDwgMCkgeworCQkvKiAgYSBuZWdhdGl2IHJlc3VsdCBpcyBub3QgYW4gaW9jdGwgZXJyb3IuIGlmCisJCSAqICB0aGUgdXNlciB3YW50cyB0byByZWFkIGRhbWFnZWQgdGFwZXMsCisJCSAqICBpdCdzIHVwIHRvIGhlci9oaW0KKwkJICovCisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihtdGZ0c2VnLT5tdF9kYXRhLAorCQkJIHpmdF9kZWJsb2NrX2J1ZiwKKwkJCSBtdGZ0c2VnLT5tdF9yZXN1bHQpICE9IDApIHsKKwkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1USU9DV1JGVFNFRworLyoKKyAqICB3cml0ZSBhIGZsb3BweSB0YXBlIHNlZ21lbnQuIFRoaXMgdmVyc2lvbiBmZWF0dXJlcyB3cml0aW5nIG9mCisgKiAgZGVsZXRlZCBhZGRyZXNzIG1hcmtzLCBhbmQgZ3JhY2VmdWxseSBpZ25vcmVzIHRoZSAoc29mdHdhcmUpCisgKiAgZnRfZm9ybWF0dGVkIGZsYWcgdG8gc3VwcG9ydCB3cml0aW5nIG9mIGhlYWRlciBzZWdtZW50cyBhZnRlcgorICogIGZvcm1hdHRpbmcuCisgKi8KK3N0YXRpYyBpbnQgbXRpb2N3cmZ0c2VnKHN0cnVjdCBtdGZ0c2VnICogbXRmdHNlZywgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DV1JGVFNFRyIpOworCWlmICh6ZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfSAKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGZ0c2VnKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLAorCQkJICAgIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAobXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9BU1lOQyAgICYmIAorCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX01VTFRJICAgJiYKKwkgICAgbXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9TSU5HTEUgICYmCisJICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfREVMRVRFKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImludmFsaWQgd3JpdGUgbW9kZSIpOworCX0KKwkvKgorCSAqICBXZSBkb24ndCBjaGVjayBmb3IgZnRfZm9ybWF0dGVkLCBiZWNhdXNlIHRoaXMgZ2l2ZXMKKwkgKiAgb25seSB0aGUgc29mdHdhcmUgc3RhdHVzIG9mIHRoZSBkcml2ZXIuCisJICoKKwkgKiAgV2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIga25vd3Mgd2hhdCBpdCBpcworCSAqICBkb2luZy4gQW5kIHJlbHkgb24gdGhlIGxvdyBsZXZlbCBzdHVmZiB0byBmYWlsCisJICogIHdoZW4gdGhlIHRhcGUgaXNuJ3QgZm9ybWF0dGVkLiBXZSBvbmx5IG1ha2Ugc3VyZQorCSAqICB0aGF0IFRoZSBoZWFkZXIgc2VnbWVudCBidWZmZXIgaXMgYWxsb2NhdGVkLAorCSAqICBiZWNhdXNlIGl0IGhvbGRzIHRoZSBiYWQgc2VjdG9yIG1hcC4KKwkgKi8KKwlpZiAoemZ0X2hzZWdfYnVmID09IE5VTEwpIHsKKwkJVFJBQ0VfRVhJVCAtRU5YSU87CisJfQorCWlmIChtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX0RFTEVURSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoemZ0X2RlYmxvY2tfYnVmLCAKKwkJCQkgICBtdGZ0c2VnLT5tdF9kYXRhLAorCQkJCSAgIEZUX1NFR01FTlRfU0laRSkgIT0gMCkgeworCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCQl9CisJfQorCW10ZnRzZWctPm10X3Jlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQobXRmdHNlZy0+bXRfc2Vnbm8sIAorCQkJCQkJIHpmdF9kZWJsb2NrX2J1ZiwKKwkJCQkJCSBtdGZ0c2VnLT5tdF9tb2RlKTsKKwlpZiAobXRmdHNlZy0+bXRfcmVzdWx0ID49IDAgJiYgbXRmdHNlZy0+bXRfbW9kZSA9PSBGVF9XUl9TSU5HTEUpIHsKKwkJLyogIAorCQkgKiAgYSBuZWdhdGl2IHJlc3VsdCBpcyBub3QgYW4gaW9jdGwgZXJyb3IuIGlmCisJCSAqICB0aGUgdXNlciB3YW50cyB0byB3cml0ZSBkYW1hZ2VkIHRhcGVzLAorCQkgKiAgaXQncyB1cCB0byBoZXIvaGltCisJCSAqLworCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUoKSkgPCAwKSB7CisJCQltdGZ0c2VnLT5tdF9yZXN1bHQgPSByZXN1bHQ7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisgIAorI2lmZGVmIE1USU9DVk9MSU5GTworLyoKKyAqICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdm9sdW1lIHBvc2l0aW9uZWQgYXQuCisgKi8KK3N0YXRpYyBpbnQgbXRpb2N2b2xpbmZvKHN0cnVjdCBtdHZvbGluZm8gKnZvbGluZm8sIGludCBhcmdfc2l6ZSkKK3sKKwljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1ZPTElORk8iKTsKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdHZvbGluZm8pKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlpZiAoemZ0X29mZmxpbmUpIHsKKwkJVFJBQ0VfRVhJVCAtRU5YSU87CisJfQorCWlmICghZnRfZm9ybWF0dGVkKSB7CisJCVRSQUNFX0VYSVQgLUVBQ0NFUzsKKwl9CisJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKKwl2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUoemZ0X3Bvcy5zZWdfcG9zKTsKKwl2b2xpbmZvLT5tdF92b2xubyAgID0gdm9sdW1lLT5jb3VudDsKKwl2b2xpbmZvLT5tdF9ibGtzeiAgID0gdm9sdW1lLT5ibGtfc3ogPT0gMSA/IDAgOiB2b2x1bWUtPmJsa19zejsKKwl2b2xpbmZvLT5tdF9zaXplICAgID0gdm9sdW1lLT5zaXplID4+IDEwOworCXZvbGluZm8tPm10X3Jhd3NpemUgPSAoKHpmdF9jYWxjX3RhcGVfcG9zKHZvbHVtZS0+ZW5kX3NlZyArIDEpID4+IDEwKSAtCisJCQkgICAgICAgKHpmdF9jYWxjX3RhcGVfcG9zKHZvbHVtZS0+c3RhcnRfc2VnKSA+PiAxMCkpOworCXZvbGluZm8tPm10X2NtcHIgICAgPSB2b2x1bWUtPnVzZV9jb21wcmVzc2lvbjsKKwlUUkFDRV9FWElUIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIFpGVF9PQlNPTEVURSAgCitzdGF0aWMgaW50IG10aW9jX3pmdGFwZV9nZXRibGtzeihzdHJ1Y3QgbXRibGtzeiAqYmxrc3osIGludCBhcmdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ19aVEFQRV9HRVRCTEtTWlxuIgorCSAgICAgIEtFUk5fSU5GTyAiVGhpcyBpb2N0bCBpcyBoZXJlIG1lcmVseSBmb3IgY29tcGF0aWJpbGl0eS5cbiIKKwkgICAgICBLRVJOX0lORk8gIlBsZWFzZSB1c2UgTVRJT0NWT0xJTkZPIGluc3RlYWQiKTsKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGJsa3N6KSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfQorCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJYmxrc3otPm10X2Jsa3N6ID0gemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3BvcyktPmJsa19zejsKKwlUUkFDRV9FWElUIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1USU9DR0VUU0laRQorLyoKKyAqICBnZXQgdGhlIGNhcGFjaXR5IG9mIHRoZSB0YXBlIGNhcnRyaWRnZS4KKyAqLworc3RhdGljIGludCBtdGlvY2dldHNpemUoc3RydWN0IG10dGFwZXNpemUgKnNpemUsIGludCBhcmdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NfWkZUQVBFX0dFVFNJWkUiKTsKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdHRhcGVzaXplKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfQorCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJc2l6ZS0+bXRfY2FwYWNpdHkgPSAodW5zaWduZWQgaW50KSh6ZnRfY2FwYWNpdHk+PjEwKTsKKwlzaXplLT5tdF91c2VkICAgICA9ICh1bnNpZ25lZCBpbnQpKHpmdF9nZXRfZW9tX3BvcygpPj4xMCk7CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbXRpb2Nwb3Moc3RydWN0IG10cG9zICptdHBvcywgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DUE9TIik7CisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRwb3MpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlyZXN1bHQgPSBtdF90ZWxsKChpbnQgKikmbXRwb3MtPm10X2Jsa25vKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworI2lmZGVmIE1USU9DRlRGT1JNQVQKKy8qCisgKiBmb3JtYXR0aW5nIG9mIGZsb3BweSB0YXBlIGNhcnRyaWRnZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZAorICogdG9nZXRoZXIgd2l0aCB0aGUgTVRJT0NGVENNRCBpb2N0bCBhbmQgdGhlIG5ldyBtbWFwIGZlYXR1cmUgCisgKi8KKworLyogCisgKiAgVGhpcyBmdW5jdGlvbiB1c2VzIGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudCgpIHRvIGluZm9ybSB0aGUgbG93CisgKiAgbGV2ZWwgZnRhcGUgbW9kdWxlIGFib3V0IHRoZSBuZXcgcGFyYW1ldGVycy4KKyAqCisgKiAgSXQgZXJhc2VzIHRoZSBoc2VnX2J1Zi4gVGhlIGNhbGxpbmcgcHJvY2VzcyBtdXN0IHNwZWNpZnkgYWxsCisgKiAgcGFyYW1ldGVycyB0byBhc3N1cmUgcHJvcGVyIG9wZXJhdGlvbi4KKyAqCisgKiAgcmV0dXJuIHZhbHVlczogLUVJTlZBTCAtIHdyb25nIGFyZ3VtZW50IHNpemUKKyAqICAgICAgICAgICAgICAgICAtRUlOVkFMIC0gaWYgZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KCkgZmFpbGVkLgorICovCitzdGF0aWMgaW50IHNldF9mb3JtYXRfcGFybXMoc3RydWN0IGZ0Zm10cGFybXMgKnAsIF9fdTggKmhzZWdfYnVmKQoreworCWZ0X3RyYWNlX3Qgb2xkX2xldmVsID0gVFJBQ0VfTEVWRUw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTVRJT0NGVEZPUk1BVCBvcGVyYXRpb24gRlRGTVRfU0VUUEFSTVMiKTsKKwltZW1zZXQoaHNlZ19idWYsIDAsIEZUX1NFR01FTlRfU0laRSk7CisJUFVUNChoc2VnX2J1ZiwgRlRfU0lHTkFUVVJFLCBGVF9IU0VHX01BR0lDKTsKKworCS8qICBmaWxsIGluIHVzZXIgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKwkgKi8KKwloc2VnX2J1ZltGVF9GTVRfQ09ERV0gPSAoX191OClwLT5mdF9mbXRjb2RlOworCVBVVDIoaHNlZ19idWYsIEZUX1NQVCwgcC0+ZnRfc3B0KTsKKwloc2VnX2J1ZltGVF9UUENdICAgICAgPSAoX191OClwLT5mdF90cGM7CisJaHNlZ19idWZbRlRfRkhNXSAgICAgID0gKF9fdTgpcC0+ZnRfZmhtOworCWhzZWdfYnVmW0ZUX0ZUTV0gICAgICA9IChfX3U4KXAtPmZ0X2Z0bTsKKworCS8qICBmaWxsIGluIHNhbmUgZGVmYXVsdHMgdG8gbWFrZSBmdGFwZSBoYXBweS4KKwkgKi8gCisJaHNlZ19idWZbRlRfRlNNXSA9IChfX3U4KTEyODsgLyogMTI4IGlzIGhhcmQgd2lyZWQgYWxsIG92ZXIgZnRhcGUgKi8KKwlpZiAocC0+ZnRfZm10Y29kZSA9PSBmbXRfYmlnKSB7CisJCVBVVDQoaHNlZ19idWYsIEZUXzZfSFNFR18xLCAgIDApOworCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0hTRUdfMiwgICAxKTsKKwkJUFVUNChoc2VnX2J1ZiwgRlRfNl9GUlNUX1NFRywgMik7CisJCVBVVDQoaHNlZ19idWYsIEZUXzZfTEFTVF9TRUcsIHAtPmZ0X3NwdCAqIHAtPmZ0X3RwYyAtIDEpOworCX0gZWxzZSB7CisJCVBVVDIoaHNlZ19idWYsIEZUX0hTRUdfMSwgICAgMCk7CisJCVBVVDIoaHNlZ19idWYsIEZUX0hTRUdfMiwgICAgMSk7CisJCVBVVDIoaHNlZ19idWYsIEZUX0ZSU1RfU0VHLCAgMik7CisJCVBVVDIoaHNlZ19idWYsIEZUX0xBU1RfU0VHLCBwLT5mdF9zcHQgKiBwLT5mdF90cGMgLSAxKTsKKwl9CisKKwkvKiAgU3luY2hyb25pemUgd2l0aCB0aGUgbG93IGxldmVsIG1vZHVsZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkKKwkgKiAgbmVlZGVkIGZvciB1bmZvcm1hdHRlZCBjYXJ0cmlkZ2VzIGFzIHRoZSBRSUMgc3RkIHdhcyBwcmV2aW91c2x5IAorCSAqICB1bmtub3duIEJVVCBpcyBuZWVkZWQgdG8gc2V0IGRhdGEgcmF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRpbWVvdXRzLgorCSAqLworCVRSQUNFX0NBVENIKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUocC0+ZnRfcWljc3RkJlFJQ19UQVBFX1NURF9NQVNLKSwKKwkJICAgIF9yZXMgPSAtRUlOVkFMKTsKKworCS8qICBUaGUgZm9sbG93aW5nIHdpbGwgYWxzbyByZWNhbGN1YWx0ZSB0aGUgdGltZW91dHMgZm9yIHRoZSB0YXBlCisJICogIGxlbmd0aCBhbmQgUUlDIHN0ZCB3ZSB3YW50IHRvIGZvcm1hdCB0by4KKwkgKiAgYWJvcnQgd2l0aCAtRUlOVkFMIHJhdGhlciB0aGFuIC1FSU8KKwkgKi8KKwlTRVRfVFJBQ0VfTEVWRUwoZnRfdF93YXJuKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoaHNlZ19idWYpLAorCQkgICAgU0VUX1RSQUNFX0xFVkVMKG9sZF9sZXZlbCk7IF9yZXMgPSAtRUlOVkFMKTsKKwlTRVRfVFJBQ0VfTEVWRUwob2xkX2xldmVsKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qCisgKiAgUmV0dXJuIHRoZSBpbnRlcm5hbCBTT0ZUV0FSRSBzdGF0dXMgb2YgdGhlIGtlcm5lbCBkcml2ZXIuIFRoaXMgZG9lcworICogIE5PVCBxdWVyeSB0aGUgdGFwZSBkcml2ZSBhYm91dCBpdHMgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGdldF9mb3JtYXRfcGFybXMoc3RydWN0IGZ0Zm10cGFybXMgKnAsIF9fdTggKmhzZWdfYnVmZmVyKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1USU9DRlRGT1JNQVQgb3BlcmF0aW9uIEZURk1UX0dFVFBBUk1TIik7CisJcC0+ZnRfcWljc3RkICA9IGZ0X3FpY19zdGQ7CisJcC0+ZnRfZm10Y29kZSA9IGZ0X2Zvcm1hdF9jb2RlOworCXAtPmZ0X2ZobSAgICAgPSBoc2VnX2J1ZmZlcltGVF9GSE1dOworCXAtPmZ0X2Z0bSAgICAgPSBoc2VnX2J1ZmZlcltGVF9GVE1dOworCXAtPmZ0X3NwdCAgICAgPSBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisJcC0+ZnRfdHBjICAgICA9IGZ0X3RyYWNrc19wZXJfdGFwZTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRpb2NmdGZvcm1hdChzdHJ1Y3QgbXRmdGZvcm1hdCAqbXRmdGZvcm1hdCwgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQ7CisJdW5pb24gZm10X2FyZyAqYXJnID0gJm10ZnRmb3JtYXQtPmZtdF9hcmc7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NGVEZPUk1BVCIpOworCWlmICh6ZnRfb2ZmbGluZSkgeworCQlpZiAoZnRfbm9fdGFwZSkgeworCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2luZm8sICJubyB0YXBlIHByZXNlbnQiKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAiZHJpdmUgaXMgb2ZmbGluZSIpOworCQl9CisJfQorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAorCQkJICAgICJkcml2ZXIgbmVlZHMgdG8gYmUgaW4gcmF3IG1vZGUgZm9yIHRoaXMgaW9jdGwiKTsKKwl9IAorCWlmICh6ZnRfaHNlZ19idWYgPT0gTlVMTCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdmNhbGxvY19vbmNlKCZ6ZnRfaHNlZ19idWYsIEZUX1NFR01FTlRfU0laRSksKTsKKwl9CisJemZ0X2hlYWRlcl9yZWFkID0gMDsKKwlzd2l0Y2gobXRmdGZvcm1hdC0+Zm10X29wKSB7CisJY2FzZSBGVEZNVF9TRVRfUEFSTVM6CisJCVRSQUNFX0NBVENIKHNldF9mb3JtYXRfcGFybXMoJmFyZy0+Zm10X3Bhcm1zLCB6ZnRfaHNlZ19idWYpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX0dFVF9QQVJNUzoKKwkJVFJBQ0VfQ0FUQ0goZ2V0X2Zvcm1hdF9wYXJtcygmYXJnLT5mbXRfcGFybXMsIHpmdF9oc2VnX2J1ZiksKTsKKwkJVFJBQ0VfRVhJVCAwOworCWNhc2UgRlRGTVRfRk9STUFUX1RSQUNLOgorCQlpZiAoKGZ0X2Zvcm1hdHRlZCAmJiB6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKCZ6ZnRfcG9zKSA8IDApIHx8CisJCSAgICAoIWZ0X2Zvcm1hdHRlZCAmJiB6ZnRfd3JpdGVfcHJvdGVjdGVkKSkgeworCQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAiV3JpdGUgYWNjZXNzIGRlbmllZCIpOworCQl9CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Zvcm1hdF90cmFjayhhcmctPmZtdF90cmFjay5mdF90cmFjaywKKwkJCQkJICAgICAgIGFyZy0+Zm10X3RyYWNrLmZ0X2dhcDMpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX1NUQVRVUzoKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfZm9ybWF0X3N0YXR1cygmYXJnLT5mbXRfc3RhdHVzLmZ0X3NlZ21lbnQpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX1ZFUklGWToKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfdmVyaWZ5X3NlZ21lbnQoYXJnLT5mbXRfdmVyaWZ5LmZ0X3NlZ21lbnQsCisJCQkJKFNlY3Rvck1hcCAqKSZhcmctPmZtdF92ZXJpZnkuZnRfYnNtKSwpOworCQlUUkFDRV9FWElUIDA7CisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJJbnZhbGlkIGZvcm1hdCBvcGVyYXRpb24iKTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE1USU9DRlRDTUQKKy8qCisgKiAgc2VuZCBhIFFJQy0xMTcgY29tbWFuZCB0byB0aGUgZHJpdmUsIHdpdGggb3B0aW9uYWwgdGltZW91dHMsCisgKiAgcGFyYW1ldGVyIGFuZCByZXN1bHQgYml0cy4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvZ2V0aGVyCisgKiAgd2l0aCB0aGUgZm9ybWF0dGluZyBpb2N0bC4KKyAqLworc3RhdGljIGludCBtdGlvY2Z0Y21kKHN0cnVjdCBtdGZ0Y21kICpmdGNtZCwgaW50IGFyZ19zaXplKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DRlRDTUQiKTsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJVFJBQ0VfQUJPUlQoLUVQRVJNLCBmdF90X2luZm8sCisJCQkgICAgIm5lZWQgQ0FQX1NZU19BRE1JTiBjYXBhYmlsaXR5IHRvIHNlbmQgcmF3IHFpYy0xMTcgY29tbWFuZHMiKTsKKwl9CisJaWYgKHpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCisJCQkgICAgImRyaXZlciBuZWVkcyB0byBiZSBpbiByYXcgbW9kZSBmb3IgdGhpcyBpb2N0bCIpOworCX0gCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRmdGNtZCkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKKwkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7CisJfQorCWlmIChmdGNtZC0+ZnRfd2FpdF9iZWZvcmUpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGNtZC0+ZnRfd2FpdF9iZWZvcmUsCisJCQkJCSAgICAgJmZ0Y21kLT5mdF9zdGF0dXMpLCk7CisJfQorCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikKKwkJZ290byBmdG10Y21kX2Vycm9yOworCWlmIChmdGNtZC0+ZnRfcmVzdWx0X2JpdHMgIT0gMCkgeworCQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZmdGNtZC0+ZnRfcmVzdWx0LAorCQkJCQkJICAgZnRjbWQtPmZ0X2NtZCwKKwkJCQkJCSAgIGZ0Y21kLT5mdF9yZXN1bHRfYml0cyksKTsKKwl9IGVsc2UgeworCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKGZ0Y21kLT5mdF9jbWQpLCk7CisJCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikKKwkJCWdvdG8gZnRtdGNtZF9lcnJvcjsKKwkJZm9yIChpID0gMDsgaSA8IGZ0Y21kLT5mdF9wYXJtX2NudDsgaSsrKSB7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9wYXJhbWV0ZXIoZnRjbWQtPmZ0X3Bhcm1zW2ldJjB4MGYpLCk7CisJCQlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpCisJCQkJZ290byBmdG10Y21kX2Vycm9yOworCQl9CisJfQorCWlmIChmdGNtZC0+ZnRfd2FpdF9hZnRlciAhPSAwKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRjbWQtPmZ0X3dhaXRfYWZ0ZXIsCisJCQkJCSAgICAgJmZ0Y21kLT5mdF9zdGF0dXMpLCk7CisJfQorZnRtdGNtZF9lcnJvcjoJICAgICAgIAorCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQlUUkFDRShmdF90X25vaXNlLCAiZXJyb3Igc3RhdHVzIHNldCIpOworCQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZXJyb3IoJmZ0Y21kLT5mdF9lcnJvciwKKwkJCQkJICAgICAgICZmdGNtZC0+ZnRfY21kLCAxKSwpOworCX0KKwlUUkFDRV9FWElUIDA7IC8qIHRoaXMgaXMgbm90IGFuIGkvbyBlcnJvciAqLworfQorI2VuZGlmCisKKy8qICBJT0NUTCByb3V0aW5lIGNhbGxlZCBieSBrZXJuZWwtaW50ZXJmYWNlIGNvZGUKKyAqLworaW50IF96ZnRfaW9jdGwodW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgX191c2VyICogYXJnKQoreworCWludCByZXN1bHQ7CisJdW5pb24geyBzdHJ1Y3QgbXRvcCAgICAgICBtdG9wOworCQlzdHJ1Y3QgbXRnZXQgICAgICBtdGdldDsKKwkJc3RydWN0IG10cG9zICAgICAgbXRwb3M7CisjaWZkZWYgTVRJT0NSREZUU0VHCisJCXN0cnVjdCBtdGZ0c2VnICAgIG10ZnRzZWc7CisjZW5kaWYKKyNpZmRlZiBNVElPQ1ZPTElORk8KKwkJc3RydWN0IG10dm9saW5mbyAgbXR2b2xpbmZvOworI2VuZGlmCisjaWZkZWYgTVRJT0NHRVRTSVpFCisJCXN0cnVjdCBtdHRhcGVzaXplIG10dGFwZXNpemU7CisjZW5kaWYKKyNpZmRlZiBNVElPQ0ZURk9STUFUCisJCXN0cnVjdCBtdGZ0Zm9ybWF0IG10ZnRmb3JtYXQ7CisjZW5kaWYKKyNpZmRlZiBaRlRfT0JTT0xFVEUKKwkJc3RydWN0IG10Ymxrc3ogbXRibGtzejsKKyNlbmRpZgorI2lmZGVmIE1USU9DRlRDTUQKKwkJc3RydWN0IG10ZnRjbWQgbXRmdGNtZDsKKyNlbmRpZgorCX0ga3JubF9hcmc7CisJaW50IGFyZ19zaXplID0gX0lPQ19TSVpFKGNvbW1hbmQpOworCWludCBkaXIgPSBfSU9DX0RJUihjb21tYW5kKTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qIFRoaXMgY2hlY2sgd2lsbCBvbmx5IGNhdGNoIGFyZ3VtZW50cyB0aGF0IGFyZSB0b28gbGFyZ2UgIQorCSAqLworCWlmIChkaXIgJiAoX0lPQ19SRUFEIHwgX0lPQ19XUklURSkgJiYgYXJnX3NpemUgPiBzaXplb2Yoa3JubF9hcmcpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlpZiAoZGlyICYgX0lPQ19XUklURSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmtybmxfYXJnLCBhcmcsIGFyZ19zaXplKSAhPSAwKSB7CisJCQlUUkFDRV9FWElUIC1FRkFVTFQ7CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIHdpdGggaW9jdGwgY29tbWFuZDogMHglMDh4IiwgY29tbWFuZCk7CisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBNVElPQ1RPUDoKKwkJcmVzdWx0ID0gbXRpb2N0b3AoJmtybmxfYXJnLm10b3AsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBNVElPQ0dFVDoKKwkJcmVzdWx0ID0gbXRpb2NnZXQoJmtybmxfYXJnLm10Z2V0LCBhcmdfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgTVRJT0NQT1M6CisJCXJlc3VsdCA9IG10aW9jcG9zKCZrcm5sX2FyZy5tdHBvcywgYXJnX3NpemUpOworCQlicmVhazsKKyNpZmRlZiBNVElPQ1ZPTElORk8KKwljYXNlIE1USU9DVk9MSU5GTzoKKwkJcmVzdWx0ID0gbXRpb2N2b2xpbmZvKCZrcm5sX2FyZy5tdHZvbGluZm8sIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBaRlRfT0JTT0xFVEUKKwljYXNlIE1USU9DX1pGVEFQRV9HRVRCTEtTWjoKKwkJcmVzdWx0ID0gbXRpb2NfemZ0YXBlX2dldGJsa3N6KCZrcm5sX2FyZy5tdGJsa3N6LCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgTVRJT0NSREZUU0VHCisJY2FzZSBNVElPQ1JERlRTRUc6IC8qIHJlYWQgYSBzZWdtZW50IHZpYSBpb2N0bCAqLworCQlyZXN1bHQgPSBtdGlvY3JkZnRzZWcoJmtybmxfYXJnLm10ZnRzZWcsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNVElPQ1dSRlRTRUcKKwljYXNlIE1USU9DV1JGVFNFRzogLyogd3JpdGUgYSBzZWdtZW50IHZpYSBpb2N0bCAqLworCQlyZXN1bHQgPSBtdGlvY3dyZnRzZWcoJmtybmxfYXJnLm10ZnRzZWcsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNVElPQ0dFVFNJWkUKKwljYXNlIE1USU9DR0VUU0laRToKKwkJcmVzdWx0ID0gbXRpb2NnZXRzaXplKCZrcm5sX2FyZy5tdHRhcGVzaXplLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgTVRJT0NGVEZPUk1BVAorCWNhc2UgTVRJT0NGVEZPUk1BVDoKKwkJcmVzdWx0ID0gbXRpb2NmdGZvcm1hdCgma3JubF9hcmcubXRmdGZvcm1hdCwgYXJnX3NpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIE1USU9DRlRDTUQKKwljYXNlIE1USU9DRlRDTUQ6CisJCXJlc3VsdCA9IG10aW9jZnRjbWQoJmtybmxfYXJnLm10ZnRjbWQsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaWYgKChyZXN1bHQgPj0gMCkgJiYgKGRpciAmIF9JT0NfUkVBRCkpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZrcm5sX2FyZywgYXJnX3NpemUpICE9IDApIHsKKwkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJfQorCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MTU5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX1pGVEFQRV9DVExfSAorI2RlZmluZSBfWkZUQVBFX0NUTF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4gCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXN0YW5kYXJkIElPQ1RMIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisKKyNpZmRlZiBDT05GSUdfWkZUQVBFX01PRFVMRQorI2RlZmluZSBmdGFwZV9zdGF0dXMgKCp6ZnRfc3RhdHVzKQorI2VuZGlmCisKK2V4dGVybiBpbnQgemZ0X29mZmxpbmU7CitleHRlcm4gaW50IHpmdF9tdF9jb21wcmVzc2lvbjsKK2V4dGVybiBpbnQgemZ0X3dyaXRlX3Byb3RlY3RlZDsKK2V4dGVybiBpbnQgemZ0X2hlYWRlcl9yZWFkOworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfdW5pdDsKK2V4dGVybiBpbnQgemZ0X3Jlc2lkOworCitleHRlcm4gdm9pZCB6ZnRfcmVzZXRfcG9zaXRpb24oemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIGludCAgemZ0X2NoZWNrX3dyaXRlX2FjY2Vzcyh6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gaW50ICB6ZnRfZGVmX2lkbGVfc3RhdGUodm9pZCk7CisKKy8qICBob29rcyBmb3IgdGhlIFZGUyBpbnRlcmZhY2UgCisgKi8KK2V4dGVybiBpbnQgIF96ZnRfb3Blbih1bnNpZ25lZCBpbnQgZGV2X21pbm9yLCB1bnNpZ25lZCBpbnQgYWNjZXNzX21vZGUpOworZXh0ZXJuIGludCAgX3pmdF9jbG9zZSh2b2lkKTsKK2V4dGVybiBpbnQgIF96ZnRfaW9jdGwodW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgX191c2VyICphcmcpOworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYWRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqICAgSSB1c2UgdGhlc2Ugcm91dGluZXMganVzdCB0byBkZWNpZGUgd2hlbiBJIGhhdmUgdG8gZmFrZSBhIAorICogICB2b2x1bWUtdGFibGUgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSB0byBvcmlnaW5hbCBmdGFwZS4KKyAqLworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUgQmFzIExhYXJob3Zlbi4KKyAqICAgICAgCisgKiAgICAgIE1vZGlmaWVkIGZvciB6ZnRhcGUgMTk5NiwgMTk5NyBDbGF1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlb2YgbWFyayBoYW5kbGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qIGEgY29weSBvZiB0aGUgZmFpbGVkIHNlY3RvciBsb2cgZnJvbSB0aGUgaGVhZGVyIHNlZ21lbnQuCisgKi8KK2VvZl9tYXJrX3VuaW9uICp6ZnRfZW9mX21hcDsKKworLyogbnVtYmVyIG9mIGVvZiBtYXJrcyAoZW50cmllcyBpbiBiYWQgc2VjdG9yIGxvZykgb24gdGFwZS4KKyAqLworaW50IHpmdF9ucl9lb2ZfbWFya3MgPSAtMTsKKworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KKworc3RhdGljIGNoYXIgbGludXhfdGFwZV9sYWJlbFtdID0gIkxpbnV4IHJhdyBmb3JtYXQgViI7CitlbnVtIHsgCisJbWluX2ZtdF92ZXJzaW9uID0gMSwgbWF4X2ZtdF92ZXJzaW9uID0gMiAKK307CitzdGF0aWMgdW5zaWduZWQgZnRhcGVfZm10X3ZlcnNpb24gPSAwOworCisKKy8qIEZ0YXBlIChtaXMpdXNlcyB0aGUgYmFkIHNlY3RvciBsb2cgdG8gcmVjb3JkIGVuZC1vZi1maWxlIG1hcmtzLgorICogSW5pdGlhbGx5ICh3aGVuIHRoZSB0YXBlIGlzIGVyYXNlZCkgYWxsIGVudHJpZXMgaW4gdGhlIGJhZCBzZWN0b3IKKyAqIGxvZyBhcmUgYWRkZWQgdG8gdGhlIHRhcGUncyBiYWQgc2VjdG9yIG1hcC4gVGhlIGJhZCBzZWN0b3IgbG9nIHRoZW4KKyAqIGlzIGNsZWFyZWQuCisgKgorICogVGhlIGJhZCBzZWN0b3IgbG9nIG5vcm1hbGx5IGNvbnRhaW5zIGVudHJpZXMgb2YgdGhlIGZvcm06IAorICogZXZlbiAxNi1iaXQgd29yZDogc2VnbWVudCBudW1iZXIgb2YgYmFkIHNlY3RvciAKKyAqIG9kZCAxNi1iaXQgd29yZDogZW5jb2RlZCBkYXRlCisgKiBUaGVyZSBjYW4gYmUgYSB0b3RhbCBvZiA0NDggZW50cmllcyAoMTc5MiBieXRlcykuCisgKgorICogTXkgZ3Vlc3MgaXMgdGhhdCBubyBwcm9ncmFtIGlzIHVzaW5nIHRoaXMgYmFkIHNlY3RvciBsb2cgKHRoZSAqCisgKiBmb3JtYXQgc2VlbXMgdXNlbGVzcyBhcyB0aGVyZSBpcyBubyBpbmRpY2F0aW9uIG9mIHRoZSBiYWQgc2VjdG9yCisgKiBpdHNlbGYsIG9ubHkgdGhlIHNlZ21lbnQpIEhvd2V2ZXIsIGlmIGFueSBwcm9ncmFtIGRvZXMgdXNlIHRoZSBiYWQKKyAqIHNlY3RvciBsb2csIHRoZSBmb3JtYXQgdXNlZCBieSBmdGFwZSB3aWxsIGxldCB0aGUgcHJvZ3JhbSB0aGluaworICogdGhlcmUgYXJlIHNvbWUgYmFkIHNlY3RvcnMgYW5kIG5vIGhhcm0gaXMgZG9uZS4KKyAqICAKKyAqIFRoZSBlb2YgbWFyayBlbnRyaWVzIHRoYXQgZnRhcGUgc3RvcmVzIGluIHRoZSBiYWQgc2VjdG9yIGxvZzogZXZlbgorICogMTYtYml0IHdvcmQ6IHNlZ21lbnQgbnVtYmVyIG9mIGVvZiBtYXJrIG9kZCAxNi1iaXQgd29yZDogc2VjdG9yCisgKiBudW1iZXIgb2YgZW9mIG1hcmsgWzEuLjMyXQorICogIAorICogVGhlIHpmdF9lb2ZfbWFwIGFzIG1haW50YWluZWQgaXMgYSBzb3J0ZWQgbGlzdCBvZiBlb2YgbWFyayBlbnRyaWVzLgorICoKKyAqCisgKiBUaGUgdGFwZSBuYW1lIGZpZWxkIGluIHRoZSBoZWFkZXIgc2VnbWVudHMgaXMgdXNlZCB0byBzdG9yZSBhIGxpbnV4CisgKiB0YXBlIGlkZW50aWZpY2F0aW9uIHN0cmluZyBhbmQgYSB2ZXJzaW9uIG51bWJlci4gIFRoaXMgd2F5IHRoZSB0YXBlCisgKiBjYW4gYmUgcmVjb2duaXplZCBhcyBhIExpbnV4IHJhdyBmb3JtYXQgdGFwZSB3aGVuIHVzaW5nIHRvb2xzIHVuZGVyCisgKiBvdGhlciBPUydzLgorICoKKyAqICdXaWRlJyBRSUMgdGFwZXMgKGZvcm1hdCBjb2RlIDQpIGRvbid0IGhhdmUgYSBmYWlsZWQgc2VjdG9yIGxpc3QKKyAqIGFueW1vcmUuIFRoYXQgc3BhY2UgaXMgdXNlZCBmb3IgdGhlIChsb25nZXIpIGJhZCBzZWN0b3IgbWFwIHRoYXQKKyAqIG5vdyBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IHRvby4gIFdlIG5vdyBzdG9yZSBvdXIgZW5kLW9mLWZpbGUKKyAqIG1hcmtlciBsaXN0IGFmdGVyIHRoZSBiYWQtc2VjdG9yLW1hcCBvbiB0YXBlLiBUaGUgbGlzdCBpcyBkZWxpbWl0ZWQKKyAqIGJ5IGEgKF9fdTMyKSAwIGVudHJ5LgorICovCisKK2ludCB6ZnRfZnRhcGVfdmFsaWRhdGVfbGFiZWwoY2hhciAqbGFiZWwpCit7CisJc3RhdGljIGNoYXIgdG1wX2xhYmVsWzQ1XTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQorCW1lbWNweSh0bXBfbGFiZWwsIGxhYmVsLCBGVF9MQUJFTF9TWik7CisJdG1wX2xhYmVsW0ZUX0xBQkVMX1NaXSA9ICdcMCc7CisJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgIGxhYmVsID0gYCVzJyIsIHRtcF9sYWJlbCk7CisJZnRhcGVfZm10X3ZlcnNpb24gPSAwOworCWlmIChtZW1jbXAobGFiZWwsIGxpbnV4X3RhcGVfbGFiZWwsIHN0cmxlbihsaW51eF90YXBlX2xhYmVsKSkgPT0gMCkgeworCQlpbnQgcG9zID0gc3RybGVuKGxpbnV4X3RhcGVfbGFiZWwpOworCQl3aGlsZSAobGFiZWxbcG9zXSA+PSAnMCcgJiYgbGFiZWxbcG9zXSA8PSAnOScpIHsKKwkJCWZ0YXBlX2ZtdF92ZXJzaW9uICo9IDEwOworCQkJZnRhcGVfZm10X3ZlcnNpb24gPSBsYWJlbFsgcG9zKytdIC0gJzAnOworCQl9CisJCXJlc3VsdCA9IChmdGFwZV9mbXRfdmVyc2lvbiA+PSBtaW5fZm10X3ZlcnNpb24gJiYKKwkJCSAgZnRhcGVfZm10X3ZlcnNpb24gPD0gbWF4X2ZtdF92ZXJzaW9uKTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZvcm1hdCB2ZXJzaW9uID0gJWQiLCBmdGFwZV9mbXRfdmVyc2lvbik7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX3U4ICogZmluZF9lbmRfb2ZfZW9mX2xpc3QoX191OCAqIHB0ciwgX191OCAqIGxpbWl0KQoreworCXdoaWxlIChwdHIgKyAzIDwgbGltaXQpIHsKKworCQlpZiAoZ2V0X3VuYWxpZ25lZCgoX191MzIqKXB0cikpIHsKKwkJCXB0ciArPSBzaXplb2YoX191MzIpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHB0cjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB6ZnRfZnRhcGVfZXh0cmFjdF9maWxlX21hcmtzKF9fdTgqIGFkZHJlc3MpCit7CisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwl6ZnRfZW9mX21hcCA9IE5VTEw7CisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQlfX3U4KiBlbmQ7CisJCV9fdTgqIHN0YXJ0ID0gZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoYWRkcmVzcyk7CisKKwkJemZ0X25yX2VvZl9tYXJrcyA9IDA7CisJCWlmIChzdGFydCkgeworCQkJc3RhcnQgKz0gMzsgLyogc2tpcCBlbmQgb2YgbGlzdCBtYXJrICovCisJCQllbmQgPSBmaW5kX2VuZF9vZl9lb2ZfbGlzdChzdGFydCwgCisJCQkJCQkgICBhZGRyZXNzICsgRlRfU0VHTUVOVF9TSVpFKTsKKwkJCWlmIChlbmQgJiYgZW5kIC0gc3RhcnQgPD0gRlRfRlNMX1NJWkUpIHsKKwkJCQl6ZnRfbnJfZW9mX21hcmtzID0gKChlbmQgLSBzdGFydCkgLyAKKwkJCQkJCSAgICBzaXplb2YoZW9mX21hcmtfdW5pb24pKTsKKwkJCQl6ZnRfZW9mX21hcCA9IChlb2ZfbWFya191bmlvbiAqKXN0YXJ0OworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkgICAgICAiRU9GIE1hcmsgTGlzdCBpcyB0b28gbG9uZyBvciBkYW1hZ2VkISIpOworCQkJfQorCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9lcnIsIAorCQkJICAgICAgIkJhZCBTZWN0b3IgTGlzdCBpcyB0b28gbG9uZyBvciBkYW1hZ2VkICEiKTsKKwkJfQorCX0gZWxzZSB7CisJCXpmdF9lb2ZfbWFwID0gKGVvZl9tYXJrX3VuaW9uICopJmFkZHJlc3NbRlRfRlNMXTsKKwkJemZ0X25yX2VvZl9tYXJrcyA9IEdFVDIoYWRkcmVzcywgRlRfRlNMX0NOVCk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJudW1iZXIgb2YgZmlsZSBtYXJrczogJWQiLCB6ZnRfbnJfZW9mX21hcmtzKTsKKwlpZiAoZnRhcGVfZm10X3ZlcnNpb24gPT0gMSkgeworCQlUUkFDRShmdF90X2luZm8sICJzd2FwcGluZyB2ZXJzaW9uIDEgZmllbGRzIik7CisJCS8qIHZlcnNpb24gMSBmb3JtYXQgdXNlcyBzd2FwcGVkIHNlY3RvciBhbmQgc2VnbWVudAorCQkgKiBmaWVsZHMsIGNvcnJlY3QgdGhhdCAhICAKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCB6ZnRfbnJfZW9mX21hcmtzOyArK2kpIHsKKwkJCV9fdTE2IHRtcCA9IEdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwwKTsKKwkJCVBVVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwgMCwgCisJCQkgICAgIEdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuZGF0ZSwwKSk7CisJCQlQVVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsIDAsIHRtcCk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IHpmdF9ucl9lb2ZfbWFya3M7ICsraSkgeworCQlUUkFDRShmdF90X25vaXNlLCAiZW9mIG1hcms6ICU1ZC8lMmQiLAorCQkJR0VUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5zZWdtZW50LCAwKSwgCisJCQlHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsMCkpOworCX0KKwlUUkFDRV9FWElUOworfQorCit2b2lkIHpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJLyogIENsZWFyIGZhaWxlZCBzZWN0b3IgbG9nOiByZW1vdmUgYWxsIHRhcGUgbWFya3MuIFdlCisJICogIGRvbid0IHVzZSBvbGQgZnRhcGUtc3R5bGUgRU9GLW1hcmtzLgorCSAqLworCVRSQUNFKGZ0X3RfaW5mbywgIkNsZWFyaW5nIG9sZCBmdGFwZSdzIGVvZiBtYXAiKTsKKwltZW1zZXQoemZ0X2VvZl9tYXAsIDAsIHpmdF9ucl9lb2ZfbWFya3MgKiBzaXplb2YoX191MzIpKTsKKwl6ZnRfbnJfZW9mX21hcmtzID0gMDsKKwlQVVQyKHpmdF9oc2VnX2J1ZiwgRlRfRlNMX0NOVCwgMCk7IC8qIG5yIG9mIGVvZi1tYXJrcyAqLworCXpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7CisJemZ0X3VwZGF0ZV9sYWJlbCh6ZnRfaHNlZ19idWYpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTY4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9aRlRBUEVfRU9GX0gKKyNkZWZpbmUgX1pGVEFQRV9FT0ZfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUgQmFzIExhYXJob3Zlbi4KKyAqIGFkYXB0YWVkIGZvciB6ZnRhcGUgMTk5NiwgMTk5NyBieSBDbGF1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDMgJAorICoKKyAqICAgICAgRGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGVuZCBvZiBmaWxlIG1hcmtlcnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKy8qICBmYWlsZWQgc2VjdG9yIGxvZyBzaXplIChvbmx5IHVzZWQgaWYgZm9ybWF0IGNvZGUgIT0gNCkuCisgKi8KKwordHlwZWRlZiB1bmlvbiB7CisJZnRfZnNsX2VudHJ5IG1hcms7CisJX191MzIgZW50cnk7Cit9IGVvZl9tYXJrX3VuaW9uOworIAorLyogICAgICBmdGFwZS1lb2YuYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgorICovCitleHRlcm4gaW50IHpmdF9ucl9lb2ZfbWFya3M7CitleHRlcm4gZW9mX21hcmtfdW5pb24gKnpmdF9lb2ZfbWFwOworCisvKiAgICAgIGZ0YXBlLWVvZi5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIHZvaWQgemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyhfX3U4KiBhZGRyZXNzKTsKK2V4dGVybiBpbnQgIHpmdF9mdGFwZV92YWxpZGF0ZV9sYWJlbChjaGFyKiBsYWJlbCk7CitleHRlcm4gdm9pZCB6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYzdlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0aGF0IHJlZ2lzdGVycyB0aGUgemZ0YXBlIGZyb250ZW5kIAorICogICAgICB0byB0aGUgZnRhcGUgZmxvcHB5IHRhcGUgZHJpdmVyIGZvciBMaW51eAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKworTU9EVUxFX0FVVEhPUigiKGMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lICIKKwkgICAgICAiKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSkiKTsKK01PRFVMRV9ERVNDUklQVElPTihaRlRBUEVfVkVSU0lPTiAiIC0gIgorCQkgICAiVkZTIGludGVyZmFjZSBmb3IgdGhlIExpbnV4IGZsb3BweSB0YXBlIGRyaXZlci4gIgorCQkgICAiU3VwcG9ydCBmb3IgUUlDLTExMyBjb21wYXRpYmxlIHZvbHVtZSB0YWJsZSAiCisJCSAgICJhbmQgYnVpbHRpbiBjb21wcmVzc2lvbiAobHpydzMgYWxnb3JpdGhtKSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoImNoYXItbWFqb3ItMjciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworc3RydWN0IHpmdF9jbXByX29wcyAqemZ0X2NtcHJfb3BzID0gTlVMTDsKK2NvbnN0IGZ0YXBlX2luZm8gKnpmdF9zdGF0dXM7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzeV9mbGFnOworCitzdGF0aWMgc2lnc2V0X3Qgb3JpZ19zaWdtYXNrOworCisvKiAgdGhlIGludGVyZmFjZSB0byB0aGUga2VybmVsIHZmcyBsYXllcgorICovCisKKy8qIE5vdGUgYWJvdXQgbGxzZWVrKCk6CisgKgorICogc3QuYyBhbmQgdHBxaWMuYyB1cGRhdGUgZnAtPmZfcG9zIGJ1dCBkb24ndCBpbXBsbWVudCBsbHNlZWsoKSBhbmQKKyAqIGluaXRpYWxpemUgdGhlIGxsc2VlayBjb21wb25lbnQgb2YgdGhlIGZpbGVfb3BzIHN0cnVjdCB3aXRoIE5VTEwuCisgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgd2lsbCBnZXQgdGhlIGRlZmF1bHQgc2VlaywgYnV0IHRoZSB0YXBlCisgKiBkZXZpY2Ugd2lsbCBub3QgcmVzcGVjdCB0aGUgbmV3IHBvc2l0aW9uLCBidXQgaGFwcGlseSByZWFkIGZyb20gdGhlCisgKiBvbGQgcG9zaXRpb24uIFRoaW5rIGEgemZ0YXBlIHNwZWNpZmljIGxsc2VlaygpIGZ1bmN0aW9uIHdvdWxkIGJlCisgKiBiZXR0ZXIsIHJldHVybmluZyAtRVNQSVBFLiBUT0RPLgorICovCisKK3N0YXRpYyBpbnQgIHpmdF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgemZ0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworc3RhdGljIGludCAgemZ0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50ICB6ZnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyBzc2l6ZV90IHpmdF9yZWFkIChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWZmLAorCQkJIHNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgemZ0X3dyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQkgc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpmdF9jZGV2ID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gemZ0X3JlYWQsCisJLndyaXRlCQk9IHpmdF93cml0ZSwKKwkuaW9jdGwJCT0gemZ0X2lvY3RsLAorCS5tbWFwCQk9IHpmdF9tbWFwLAorCS5vcGVuCQk9IHpmdF9vcGVuLAorCS5yZWxlYXNlCT0gemZ0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnpmdF9jbGFzczsKKworLyogICAgICBPcGVuIGZsb3BweSB0YXBlIGRldmljZQorICovCitzdGF0aWMgaW50IHpmdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7CisJVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIGZvciBtaW5vciAlZCIsIGltaW5vcihpbm8pKTsKKwlpZiAoIHRlc3RfYW5kX3NldF9iaXQoMCwmYnVzeV9mbGFnKSApIHsKKwkJVFJBQ0VfQUJPUlQoLUVCVVNZLCBmdF90X3dhcm4sICJmYWlsZWQ6IGFscmVhZHkgYnVzeSIpOworCX0KKwlpZiAoKGltaW5vcihpbm8pICYgfihaRlRfTUlOT1JfT1BfTUFTSyB8IEZUQVBFX05PX1JFV0lORCkpCisJICAgICA+IAorCSAgICBGVEFQRV9TRUxfRCkgeworCQljbGVhcl9iaXQoMCwmYnVzeV9mbGFnKTsKKwkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2VyciwgImZhaWxlZDogaW52YWxpZCB1bml0IG5yIik7CisJfQorCW9yaWdfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVzdWx0ID0gX3pmdF9vcGVuKGltaW5vcihpbm8pLCBmaWxlcC0+Zl9mbGFncyAmIE9fQUNDTU9ERSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJY3VycmVudC0+YmxvY2tlZCA9IG9yaWdfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCisJCWNsZWFyX2JpdCgwLCZidXN5X2ZsYWcpOworCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3RfZXJyLCAiX2Z0YXBlX29wZW4gZmFpbGVkIik7CisJfSBlbHNlIHsKKwkJLyogTWFzayBzaWduYWxzIHRoYXQgd2lsbCBkaXN0dXJiIHByb3BlciBvcGVyYXRpb24gb2YgdGhlCisJCSAqIHByb2dyYW0gdGhhdCBpcyBjYWxsaW5nLgorCQkgKi8KKwkJY3VycmVudC0+YmxvY2tlZCA9IG9yaWdfc2lnbWFzazsKKwkJc2lnYWRkc2V0bWFzayAoJmN1cnJlbnQtPmJsb2NrZWQsIF9ET19CTE9DSyk7CisJCVRSQUNFX0VYSVQgMDsKKwl9Cit9CisKKy8qICAgICAgQ2xvc2UgZmxvcHB5IHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgemZ0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICggIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQpIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJmYWlsZWQ6IG5vdCBidXN5IG9yIHdyb25nIHVuaXQiKTsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwlyZXN1bHQgPSBfemZ0X2Nsb3NlKCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJfemZ0X2Nsb3NlIGZhaWxlZCIpOworCX0KKwljdXJyZW50LT5ibG9ja2VkID0gb3JpZ19zaWdtYXNrOyAvKiByZXN0b3JlIGJlZm9yZSBvcGVuIHN0YXRlICovCisJY2xlYXJfYml0KDAsJmJ1c3lfZmxhZyk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIElvY3RsIGZvciBmbG9wcHkgdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIGludCB6ZnRfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc2lnc2V0X3Qgb2xkX3NpZ21hc2s7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoICF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0IHx8IGZ0X2ZhaWx1cmUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOworCX0KKwlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCS8qIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKGxvbmcpICovCisJcmVzdWx0ID0gX3pmdF9pb2N0bChjb21tYW5kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIElvY3RsIGZvciBmbG9wcHkgdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIGludCAgemZ0X21tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICggIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgCisJICAgIGltaW5vcihmaWxlcC0+Zl9kZW50cnktPmRfaW5vZGUpICE9IHpmdF91bml0IHx8IAorCSAgICBmdF9mYWlsdXJlKQorCXsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOworCX0KKwlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCWlmICgocmVzdWx0ID0gZnRhcGVfbW1hcCh2bWEpKSA+PSAwKSB7CisjaWZuZGVmIE1TWU5DX0JVR19XQVNfRklYRUQKKwkJc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBkdW1teSA9IHsgTlVMTCwgfTsKKwkJdm1hLT52bV9vcHMgPSAmZHVtbXk7CisjZW5kaWYKKwl9CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBSZWFkIGZyb20gZmxvcHB5IHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHpmdF9yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQlzaXplX3QgcmVxX2xlbiwgbG9mZl90ICpwcG9zKQoreworCWludCByZXN1bHQgPSAtRUlPOworCXNpZ3NldF90IG9sZF9zaWdtYXNrOworCXN0cnVjdCBpbm9kZSAqaW5vID0gZnAtPmZfZGVudHJ5LT5kX2lub2RlOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJjYWxsZWQgd2l0aCBjb3VudDogJWxkIiwgKHVuc2lnbmVkIGxvbmcpcmVxX2xlbik7CisJaWYgKCF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpICB8fCBpbWlub3IoaW5vKSAhPSB6ZnRfdW5pdCB8fCBmdF9mYWlsdXJlKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKKwl9CisJb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwlyZXN1bHQgPSBfemZ0X3JlYWQoYnVmZiwgcmVxX2xlbik7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybiB3aXRoIGNvdW50OiAlZCIsIHJlc3VsdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICAgICAgV3JpdGUgdG8gdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIHNzaXplX3QgemZ0X3dyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQkgc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3RfZmxvdywgImNhbGxlZCB3aXRoIGNvdW50OiAlbGQiLCAodW5zaWduZWQgbG9uZylyZXFfbGVuKTsKKwlpZiAoIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQgfHwgZnRfZmFpbHVyZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAiZmFpbGVkOiBub3QgYnVzeSwgZmFpbHVyZSBvciB3cm9uZyB1bml0Iik7CisJfQorCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsgLyogc2F2ZSBtYXNrICovCisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVzdWx0ID0gX3pmdF93cml0ZShidWZmLCByZXFfbGVuKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAicmV0dXJuIHdpdGggY291bnQ6ICVkIiwgcmVzdWx0KTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICAgICAgICAgICAgICAgIEVORCBPRiBWRlMgSU5URVJGQUNFIAorICogICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBkcml2ZXIvbW9kdWxlIGluaXRpYWxpemF0aW9uCisgKi8KKworLyogIHRoZSBjb21wcmVzc2lvbiBtb2R1bGUgaGFzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBob29rIGludG8gdGhlIHpmdGFwZSAKKyAqICBjb2RlCisgKi8KK2ludCB6ZnRfY21wcl9yZWdpc3RlcihzdHJ1Y3QgemZ0X2NtcHJfb3BzICpuZXdfb3BzKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfY21wcl9vcHMgIT0gTlVMTCkgeworCQlUUkFDRV9FWElUIC1FQlVTWTsKKwl9IGVsc2UgeworCQl6ZnRfY21wcl9vcHMgPSBuZXdfb3BzOworCQlUUkFDRV9FWElUIDA7CisJfQorfQorCisvKiAgbG9jayB0aGUgemZ0LWNvbXByZXNzb3IoKSBtb2R1bGUuCisgKi8KK2ludCB6ZnRfY21wcl9sb2NrKGludCB0cnlfdG9fbG9hZCkKK3sKKwlpZiAoemZ0X2NtcHJfb3BzID09IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfS01PRAorCQlpZiAodHJ5X3RvX2xvYWQpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJ6ZnQtY29tcHJlc3NvciIpOworCQkJaWYgKHpmdF9jbXByX29wcyA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVOT1NZUzsKKwkJfQorI2Vsc2UKKwkJcmV0dXJuIC1FTk9TWVM7CisjZW5kaWYKKwl9CisJKCp6ZnRfY21wcl9vcHMtPmxvY2spKCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfWkZUX0NPTVBSRVNTT1IKK2V4dGVybiBpbnQgemZ0X2NvbXByZXNzb3JfaW5pdCh2b2lkKTsKKyNlbmRpZgorCisvKiAgQ2FsbGVkIGJ5IG1vZHVsZXMgcGFja2FnZSB3aGVuIGluc3RhbGxpbmcgdGhlIGRyaXZlciBvciBieSBrZXJuZWwKKyAqICBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlCisgKi8KK2ludCBfX2luaXQgemZ0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworI2lmZGVmIE1PRFVMRQorCXByaW50ayhLRVJOX0lORk8gWkZUQVBFX1ZFUlNJT04gIlxuIik7CisgICAgICAgIGlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2luZm8pIHsKKwkJcHJpbnRrKAorS0VSTl9JTkZPCisiKGMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIChjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUpXG4iCitLRVJOX0lORk8KKyJ2ZnMgaW50ZXJmYWNlIGZvciBmdGFwZSBmbG9wcHkgdGFwZSBkcml2ZXIuXG4iCitLRVJOX0lORk8KKyJTdXBwb3J0IGZvciBRSUMtMTEzIGNvbXBhdGlibGUgdm9sdW1lIHRhYmxlLCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uXG4iCitLRVJOX0lORk8KKyJhbmQgYnVpbHRpbiBjb21wcmVzc2lvbiAobHpydzMgYWxnb3JpdGhtKS5cbiIpOworICAgICAgICB9CisjZWxzZSAvKiAhTU9EVUxFICovCisJLyogcHJpbnQgYSBzaG9ydCBuby1ub25zZW5zZSBib290IG1lc3NhZ2UgKi8KKwlwcmludGsoS0VSTl9JTkZPIFpGVEFQRV9WRVJTSU9OICJcbiIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCVRSQUNFKGZ0X3RfaW5mbywgInpmdF9pbml0IEAgMHglcCIsIHpmdF9pbml0KTsKKwlUUkFDRShmdF90X2luZm8sCisJICAgICAgImluc3RhbGxpbmcgemZ0YXBlIFZGUyBpbnRlcmZhY2UgZm9yIGZ0YXBlIGRyaXZlciAuLi4iKTsKKwlUUkFDRV9DQVRDSChyZWdpc3Rlcl9jaHJkZXYoUUlDMTE3X1RBUEVfTUFKT1IsICJ6ZnQiLCAmemZ0X2NkZXYpLCk7CisKKwl6ZnRfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiemZ0Iik7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpKSwgTlVMTCwgInFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkpLAorCQkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkicWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDQpLCBOVUxMLCAibnFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyA0KSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJIm5xZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpLCBOVUxMLCAienFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAxNiksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJ6cWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSwgTlVMTCwgIm56cWZ0JWkiLCBpKTsKKwkJZGV2ZnNfbWtfY2RldihNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJIm56cWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDMyKSwgTlVMTCwgInJhd3FmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzMiksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJyYXdxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpLCBOVUxMLCAibnJhd3Jhd3FmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzNiksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJucmF3cWZ0JWkiLCBpKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWkZUX0NPTVBSRVNTT1IKKwkodm9pZCl6ZnRfY29tcHJlc3Nvcl9pbml0KCk7CisjZW5kaWYKKwl6ZnRfc3RhdHVzID0gZnRhcGVfZ2V0X3N0YXR1cygpOyAvKiAgZmV0Y2ggZ2xvYmFsIGRhdGEgb2YgZnRhcGUgCisJCQkJCSAgKiAgaGFyZHdhcmUgZHJpdmVyIAorCQkJCQkgICovCisJVFJBQ0VfRVhJVCAwOworfQorCisKKy8qIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiByZW1vdmluZyB0aGUgZHJpdmVyIAorICovCitzdGF0aWMgdm9pZCB6ZnRfZXhpdCh2b2lkKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHVucmVnaXN0ZXJfY2hyZGV2KFFJQzExN19UQVBFX01BSk9SLCAiemZ0IikgIT0gMCkgeworCQlUUkFDRShmdF90X3dhcm4sICJmYWlsZWQiKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2luZm8sICJzdWNjZXNzZnVsIik7CisJfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWRldmZzX3JlbW92ZSgicWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkpKTsKKwkJZGV2ZnNfcmVtb3ZlKCJucWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyA0KSk7CisJCWRldmZzX3JlbW92ZSgienFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpKTsKKwkJZGV2ZnNfcmVtb3ZlKCJuenFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMjApKTsKKwkJZGV2ZnNfcmVtb3ZlKCJyYXdxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDMyKSk7CisJCWRldmZzX3JlbW92ZSgibnJhd3FmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpKTsKKwl9CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koemZ0X2NsYXNzKTsKKwl6ZnRfdW5pbml0X21lbSgpOyAvKiByZWxlYXNlIHJlbWFpbmluZyBtZW1vcnksIGlmIGFueSAqLworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ6ZnRhcGUgc3VjY2Vzc2Z1bGx5IHVubG9hZGVkLlxuIik7CisJVFJBQ0VfRVhJVDsKK30KKworbW9kdWxlX2luaXQoemZ0X2luaXQpOworbW9kdWxlX2V4aXQoemZ0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzN2U1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfWkZUQVBFX0lOSVRfSAorI2RlZmluZSBfWkZUQVBFX0lOSVRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA1ICQKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgYW5kIG1hY3JvIGZvciB0aGUgdmZzIAorICogaW50ZXJmYWNlIGRlZmluZWQgYnkgemZ0YXBlCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oPgorCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgiCisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgZnRhcGVfc3RhdHVzICgqemZ0X3N0YXR1cykKKyNlbmRpZgorCitleHRlcm4gY29uc3QgIGZ0YXBlX2luZm8gKnpmdF9zdGF0dXM7IC8qIG5lZWRlZCBmb3IgemZ0YXBlLXZ0YmwuaCAqLworCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKK3N0cnVjdCB6ZnRfY21wcl9vcHMgeworCWludCAoKndyaXRlKShpbnQgKndyaXRlX2NudCwKKwkJICAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwgCisJCSAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworCWludCAoKnJlYWQpKGludCAqcmVhZF9jbnQsCisJCSAgICBfX3U4IF9fdXNlciAqZHN0X2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCisJCSAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworCWludCAoKnNlZWspKHVuc2lnbmVkIGludCBuZXdfYmxvY2tfcG9zLAorCQkgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCSAgICBfX3U4ICpidWZmZXIpOworCXZvaWQgKCpsb2NrKSAgICh2b2lkKTsKKwl2b2lkICgqcmVzZXQpICAodm9pZCk7CisJdm9pZCAoKmNsZWFudXApKHZvaWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCB6ZnRfY21wcl9vcHMgKnpmdF9jbXByX29wczsKKy8qIHpmdGFwZS1pbml0LmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgemZ0X2NtcHJfcmVnaXN0ZXIoc3RydWN0IHpmdF9jbXByX29wcyAqbmV3X29wcyk7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgemZ0X2NtcHJfbG9jayhpbnQgdHJ5X3RvX2xvYWQpOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0YmYwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGlnaCBsZXZlbCByZWFkaW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitpbnQgemZ0X2p1c3RfYmVmb3JlX2VvZjsKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGJ1Zl9sZW5fcmQ7CisKK3ZvaWQgemZ0X3phcF9yZWFkX2J1ZmZlcnModm9pZCkKK3sKKwlidWZfbGVuX3JkID0gMDsKK30KKworaW50IHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cyh2b2lkKSAgICAgIAoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJemZ0X2hlYWRlcl9yZWFkID0gMDsKKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRfaHNlZ19idWYsIEZUX1NFR01FTlRfU0laRSksKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KHpmdF9oc2VnX2J1ZiksKTsKKwlUUkFDRShmdF90X2luZm8sICJTZWdtZW50cyB3cml0dGVuIHNpbmNlIGZpcnN0IGZvcm1hdDogJWQiLAorCSAgICAgIChpbnQpR0VUNCh6ZnRfaHNlZ19idWYsIEZUX1NFR19DTlQpKTsKKwl6ZnRfcWljMTEzID0gKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9ub3JtYWwgJiYKKwkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzExMDBmdCAmJgorCQkgICAgICBmdF9mb3JtYXRfY29kZSAhPSBmbXRfNDI1ZnQpOworCVRSQUNFKGZ0X3RfaW5mbywgImZ0X2ZpcnN0X2RhdGFfc2VnbWVudDogJWQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50OiAlZCIsIAorCSAgICAgIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOworCXpmdF9jYXBhY2l0eSA9IHpmdF9nZXRfY2FwYWNpdHkoKTsKKwl6ZnRfb2xkX2Z0YXBlID0gemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKCZ6ZnRfaHNlZ19idWZbRlRfTEFCRUxdKTsKKwlpZiAoemZ0X29sZF9mdGFwZSkgeworCQlUUkFDRShmdF90X2luZm8sIAorIkZvdW5kIG9sZCBmdGFwZWQgdGFwZSwgZW11bGF0aW5nIGVvZiBtYXJrcywgZW50ZXJpbmcgcmVhZC1vbmx5IG1vZGUiKTsKKwkJemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyh6ZnRfaHNlZ19idWYpOworCQlUUkFDRV9DQVRDSCh6ZnRfZmFrZV92b2x1bWVfaGVhZGVycyh6ZnRfZW9mX21hcCwgCisJCQkJCQkgICAgemZ0X25yX2VvZl9tYXJrcyksKTsKKwl9IGVsc2UgeworCQkvKiB0aGUgc3BlY3Mgc2F5IHRoYXQgdGhlIHZvbHVtZSB0YWJsZSBtdXN0IGJlCisJCSAqIGluaXRpYWxpemVkIHdpdGggemVyb2VzIGR1cmluZyBmb3JtYXR0aW5nLCBzbyBpdAorCQkgKiBNVVNUIGJlIHJlYWRhYmxlLCBpLmUuIGNvbnRhaW4gdmFpZCBFQ0MKKwkJICogaW5mb3JtYXRpb24uICAKKwkJICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWRfc2VnbWVudChmdF9maXJzdF9kYXRhX3NlZ21lbnQsIAorCQkJCQkgICAgICAgemZ0X2RlYmxvY2tfYnVmLCAKKwkJCQkJICAgICAgIEZUX1JEX1NJTkdMRSksKTsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2V4dHJhY3Rfdm9sdW1lX2hlYWRlcnMoemZ0X2RlYmxvY2tfYnVmKSwpOworCX0KKwl6ZnRfaGVhZGVyX3JlYWQgPSAxOworCXpmdF9zZXRfZmxhZ3MoemZ0X3VuaXQpOworCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24oY29uc3QgdW5zaWduZWQgaW50IHNlZ21lbnQsIHZvaWQgKmJ1ZmZlciwKKwkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaXplKQoreworCWludCBzZWdfc3o7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoc2VnbWVudCA9PSB6ZnRfZGVibG9ja19zZWdtZW50KSB7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAorCQkgICAgICAicmUtdXNpbmcgc2VnbWVudCAlZCBhbHJlYWR5IGluIGRlYmxvY2sgYnVmZmVyIiwKKwkJICAgICAgc2VnbWVudCk7CisJCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHNlZ21lbnQpOworCQlpZiAoc3RhcnQgPiBzZWdfc3opIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfYnVnLAorCQkJCSAgICAidHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBzZWdtZW50OlxuIgorCQkJCSAgICBLRVJOX0lORk8gInNlZ19zeiA6ICVkXG4iCisJCQkJICAgIEtFUk5fSU5GTyAic3RhcnQgIDogJWRcbiIKKwkJCQkgICAgS0VSTl9JTkZPICJzZWdtZW50OiAlZCIsCisJCQkJICAgIHNlZ19zeiwgc3RhcnQsIHNlZ21lbnQpOworCQl9CisJCWlmICgoc3RhcnQgKyBzaXplKSA+IHNlZ19zeikgeworCQkJVFJBQ0VfRVhJVCBzZWdfc3ogLSBzdGFydDsKKwkJfQorCQlUUkFDRV9FWElUIHNpemU7CisJfQorCXNlZ19zeiA9IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihzZWdtZW50LCBidWZmZXIsIHJlYWRfbW9kZSwKKwkJCQkJICAgICBzdGFydCwgc2l6ZSk7CisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJzZWdtZW50ICVkLCByZXN1bHQgJWQiLCBzZWdtZW50LCBzZWdfc3opOworCWlmICgoaW50KXNlZ19zeiA+PSAwICYmIHN0YXJ0ID09IDAgJiYgc2l6ZSA9PSBGVF9TRUdNRU5UX1NJWkUpIHsKKwkJLyogIHRoaXMgaW1wbGljaXRseSBhc3N1bWVzIHRoYXQgd2UgYXJlIGFsd2F5cyBjYWxsZWQgd2l0aAorCQkgKiAgYnVmZmVyID09IHpmdF9kZWJsb2NrX2J1ZiAKKwkJICovCisJCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSBzZWdtZW50OworCX0gZWxzZSB7CisJCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKKwl9CisJVFJBQ0VfRVhJVCBzZWdfc3o7Cit9CisKKy8qCisgKiBvdXQ6CisgKgorICogaW50ICpyZWFkX2NudDogdGhlIG51bWJlciBvZiBieXRlcyB3ZSByZW1vdmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICB6ZnRfZGVibG9ja19idWYgKHJlc3VsdCkKKyAqCisgKiBpbnQgKnRvX2RvICAgOiB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHJlYWQtcmVxdWVzdC4gSXMgY2hhbmdlZC4KKyAqCisgKiBpbjoKKyAqCisgKiBjaGFyICpidWZmICAgICAgOiBidWZmIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSB1c2VyCisgKiAgICAgICAgICAgICAgICAgICBidWZmZXIsIHRoYXQgaGFzbid0IGJlZW4gZmlsbGVkIHdpdGggZGF0YSB5ZXQuCisgKiBpbnQgYnVmX3Bvc19yZWFkOiBjb3B5IG9mIGJ1Zl9wb3NfcmQKKyAqIGludCBidWZfbGVuX3JlYWQ6IGNvcHkgb2YgYnVmX2xlbl9yZAorICogY2hhciAqemZ0X2RlYmxvY2tfYnVmOiBmdGFwZV96ZnRfZGVibG9ja19idWYKKyAqCisgKiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCisgKgorICogdG9fZG8gTVVTVCBOT1QgU0hSSU5LIGV4Y2VwdCB0byBpbmRpY2F0ZSBhbiBFT1QuIEluIHRoaXMgY2FzZSB0b19kbworICogaGFzIHRvIGJlIHNldCB0byAwLiBXZSBjYW5ub3QgcmV0dXJuIC1FTk9TUEMsIGJlY2F1c2Ugd2UgcmV0dXJuIHRoZQorICogYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgKiBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgemZ0X3NpbXBsZV9yZWFkIChpbnQgKnJlYWRfY250LCAKKwkJCSAgICBfX3U4ICBfX3VzZXIgKmRzdF9idWYsIAorCQkJICAgIGNvbnN0IGludCB0b19kbywgCisJCQkgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgCisJCQkgICAgY29uc3QgaW50IHNlZ19zeiwgCisJCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvcyA8IHRvX2RvKSB7CisJCSpyZWFkX2NudCA9IHNlZ19zeiAtIHBvcy0+c2VnX2J5dGVfcG9zOworCX0gZWxzZSB7CisJCSpyZWFkX2NudCA9IHRvX2RvOworCX0KKwlpZiAoY29weV90b191c2VyKGRzdF9idWYsIAorCQkJIHNyY19idWYgKyBwb3MtPnNlZ19ieXRlX3BvcywgKnJlYWRfY250KSAhPSAwKSB7CisJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgIm5yIGJ5dGVzIGp1c3QgcmVhZDogJWQiLCAqcmVhZF9jbnQpOworCVRSQUNFX0VYSVQgKnJlYWRfY250OworfQorCisvKiByZXFfbGVuOiBnZXRzIGNsaXBwZWQgZHVlIHRvIEVPVCBvZiBFT0YuCisgKiByZXFfY2xpcHBlZDogaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciByZXFfbGVuIHdhcyBjbGlwcGVkIG9yIG5vdAorICogdm9sdW1lOiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IHZvbHVtZSAoYmxrX3N6IGV0Yy4pCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfcmVhZF9hY2Nlc3MoaW50ICpyZXFfbGVuLCAKKwkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKip2b2x1bWUsCisJCQkgICAgIGludCAqcmVxX2NsaXBwZWQsIAorCQkJICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwlzdGF0aWMgX19zNjQgcmVtYWluaW5nOworCXN0YXRpYyBpbnQgZW9kOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfaW9fc3RhdGUgIT0gemZ0X3JlYWRpbmcpIHsKKwkJaWYgKHpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLworCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X3dhcm4sCisJCQkJICAgICJ0YXBlIGlzIG9mZmxpbmUgb3Igbm8gY2FydHJpZGdlIik7CisJCX0KKwkJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsCisJCQkJICAgIGZ0X3Rfd2FybiwgInRhcGUgaXMgbm90IGZvcm1hdHRlZCIpOworCQl9CisJCS8qICBub3cgZW50ZXIgZGVmaW5lZCBzdGF0ZSwgcmVhZCBoZWFkZXIgc2VnbWVudCBpZiBub3QKKwkJICogIGFscmVhZHkgZG9uZSBhbmQgZmx1c2ggd3JpdGUgYnVmZmVycworCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKKwkJemZ0X2lvX3N0YXRlID0gemZ0X3JlYWRpbmc7CisJCWlmICh6ZnRfdGFwZV9hdF9lb2QocG9zKSkgeworCQkJZW9kID0gMTsKKwkJCVRSQUNFX0VYSVQgMTsKKwkJfQorCQllb2QgPSAwOworCQkqdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7CisJCS8qIGdldCB0aGUgc3BhY2UgbGVmdCB1bnRpbCBFT0YgKi8KKwkJcmVtYWluaW5nID0gemZ0X2NoZWNrX2Zvcl9lb2YoKnZvbHVtZSwgcG9zKTsKKwkJYnVmX2xlbl9yZCA9IDA7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZW1haW5pbmc6ICIgTExfWCAiLCB2b2xfbm86ICVkIiwKKwkJICAgICAgTEwocmVtYWluaW5nKSwgKCp2b2x1bWUpLT5jb3VudCk7CisJfSBlbHNlIGlmICh6ZnRfdGFwZV9hdF9lb2QocG9zKSkgeworCQlpZiAoKytlb2QgPiAyKSB7CisJCQlUUkFDRV9FWElUIC1FSU87IC8qIHN0LmMgYWxzbyByZXR1cm5zIC1FSU8gKi8KKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0VYSVQgMTsKKwkJfQorCX0KKwlpZiAoKCpyZXFfbGVuICUgKCp2b2x1bWUpLT5ibGtfc3opICE9IDApIHsKKwkJLyogIHRoaXMgbWVzc2FnZSBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuIFRoZSB1c2VyIGdldHMgdGhlCisJCSAqICBwcm9wZXIgcmV0dXJuIHZhbHVlCisJCSAqLworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkgICAgInJlcV9sZW4gJWQgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSAlZCIsCisJCQkgICAgKnJlcV9sZW4sICgqdm9sdW1lKS0+YmxrX3N6KTsKKwl9CisJLyogQXMgR05VIHRhciBkb2Vzbid0IGFjY2VwdCBwYXJ0aWFsIHJlYWQgY291bnRzIHdoZW4gdGhlCisJICogbXVsdGlwbGUgdm9sdW1lIGZsYWcgaXMgc2V0LCB3ZSBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZQorCSAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YS4gRXhjZXB0LCBvZiBjb3Vyc2UsIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGUgdGFwZSBvciBmaWxlIG1hcmsuICAKKwkgKi8KKwlyZW1haW5pbmcgLT0gKnJlcV9sZW47CisJaWYgKHJlbWFpbmluZyA8PSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsIAorCQkgICAgICAiY2xpcHBlZCByZXF1ZXN0IGZyb20gJWQgdG8gJWQuIiwgCisJCSAgICAgICpyZXFfbGVuLCAoaW50KSgqcmVxX2xlbiArIHJlbWFpbmluZykpOworCQkqcmVxX2xlbiArPSByZW1haW5pbmc7CisJCSpyZXFfY2xpcHBlZCA9IDE7CisJfSBlbHNlIHsKKwkJKnJlcV9jbGlwcGVkID0gMDsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiB0aGlzX3NlZ3Nfc2l6ZTogdGhlIGN1cnJlbnQgc2VnbWVudCdzIHNpemUuCisgKiBidWZmOiB0aGUgVVNFUi1TUEFDRSBidWZmZXIgcHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCisgKiByZXFfbGVuOiBob3cgbXVjaCBkYXRhIHNob3VsZCBiZSByZWFkIGF0IG1vc3QuCisgKiB2b2x1bWU6IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGN1cnJlbnQgdm9sdW1lIChibGtfc3ogZXRjLikKKyAqLyAgCitzdGF0aWMgaW50IGVtcHR5X2RlYmxvY2tfYnVmKF9fdTggX191c2VyICp1c3JfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKKwkJCSAgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJaW50IGNudDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAidGhpc19zZWdzX3NpemU6ICVkIiwgc2VnX3N6KTsKKwlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbiAmJiB2b2x1bWUtPnVzZV9jb21wcmVzc2lvbikgeworCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7CisJCVRSQUNFX0NBVENIKHJlc3VsdD0gKCp6ZnRfY21wcl9vcHMtPnJlYWQpKCZjbnQsCisJCQkJCQkJICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJCSAgc3JjX2J1Ziwgc2VnX3N6LAorCQkJCQkJCSAgcG9zLCB2b2x1bWUpLCk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCVRSQUNFX0NBVENIKHJlc3VsdD0gemZ0X3NpbXBsZV9yZWFkICgmY250LAorCQkJCQkJICAgICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJICAgICBzcmNfYnVmLCBzZWdfc3osCisJCQkJCQkgICAgIHBvcywgdm9sdW1lKSwpOworCX0KKwlwb3MtPnZvbHVtZV9wb3MgICArPSByZXN1bHQ7CisgICAgICAgIHBvcy0+dGFwZV9wb3MgICAgICs9IGNudDsKKwlwb3MtPnNlZ19ieXRlX3BvcyArPSBjbnQ7CisJYnVmX2xlbl9yZCAgICAgICAgLT0gY250OyAvKiByZW1haW5pbmcgYnl0ZXMgaW4gYnVmZmVyICovCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJidWZfbGVuX3JkOiAlZCwgY250OiAlZCIsIGJ1Zl9sZW5fcmQsIGNudCk7CisJaWYocG9zLT5zZWdfYnl0ZV9wb3MgPj0gc2VnX3N6KSB7CisJCXBvcy0+c2VnX3BvcysrOworCQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7CisJfQorCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnl0ZXMgbW92ZWQgb3V0IG9mIGRlYmxvY2stYnVmZmVyOiAlZCIsIGNudCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworLyogbm90ZTogd2Ugc3RvcmUgdGhlIHNlZ21lbnQgaWQgb2YgdGhlIHNlZ21lbnQgdGhhdCBpcyBpbnNpZGUgdGhlCisgKiBkZWJsb2NrIGJ1ZmZlci4gVGhpcyBzcGFyZXMgYSBsb3Qgb2YgZnRhcGVfcmVhZF9zZWdtZW50KClzIHdoZW4gd2UKKyAqIHVzZSBzbWFsbCBibG9jay1zaXplcy4gVGhlIGJsb2NrLXNpemUgbWF5IGJlIDFrYiAoU0VDVE9SX1NJWkUpLiBJbgorICogdGhpcyBjYXNlIGEgTVRGU1IgMjggbWF5YmUgc3RpbGwgaW5zaWRlIHRoZSBzYW1lIHNlZ21lbnQuCisgKi8KK2ludCBfemZ0X3JlYWQoY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKQoreworCWludCByZXFfY2xpcHBlZDsKKwlpbnQgcmVzdWx0ICAgICA9IDA7CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VnX3N6ID0gMDsKKwlzdGF0aWMgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSA9IE5VTEw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJemZ0X3Jlc2lkID0gcmVxX2xlbjsKKwlyZXN1bHQgPSBjaGVja19yZWFkX2FjY2VzcygmcmVxX2xlbiwgJnZvbHVtZSwKKwkJCQkgICAmcmVxX2NsaXBwZWQsICZ6ZnRfcG9zKTsKKwlzd2l0Y2gocmVzdWx0KSB7CisJY2FzZSAwOiAKKwkJYnJlYWs7IC8qIG5vdGhpbmcgc3BlY2lhbCAqLworCWNhc2UgMTogCisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJFT0QgcmVhY2hlZCIpOworCQlUUkFDRV9FWElUIDA7ICAgLyogRU9EICovCisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X25vaXNlLAorCQkJICAgICJjaGVja19yZWFkX2FjY2VzcygpIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCisJCQkgICAgcmVzdWx0KTsKKwkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJfQorCXdoaWxlIChyZXFfbGVuID4gMCkgeyAKKwkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkvKiBidWZfbGVuX3JkID09IDAgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHJlYWQgYSBuZXcKKwkJICogc2VnbWVudC4KKwkJICovCisJCWlmIChidWZfbGVuX3JkID09IDApIHsKKwkJCXdoaWxlKChyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudCh6ZnRfcG9zLnNlZ19wb3MsCisJCQkJCQkJICB6ZnRfZGVibG9ja19idWYsCisJCQkJCQkJICBGVF9SRF9BSEVBRCkpID09IDApIHsKKwkJCQl6ZnRfcG9zLnNlZ19wb3MgKys7CisJCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAwOworCQkJfQorCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQl6ZnRfcmVzaWQgLT0gYnl0ZXNfcmVhZDsKKwkJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3Rfbm9pc2UsCisJCQkJCSAgICAiemZ0X2ZldGNoX3NlZ21lbnQoKTogJWQiLAorCQkJCQkgICAgcmVzdWx0KTsKKwkJCX0KKwkJCXNlZ19zeiA9IHJlc3VsdDsKKwkJCWJ1Zl9sZW5fcmQgPSBzZWdfc3ogLSB6ZnRfcG9zLnNlZ19ieXRlX3BvczsKKwkJfQorCQlUUkFDRV9DQVRDSChyZXN1bHQgPSBlbXB0eV9kZWJsb2NrX2J1ZihidWZmLCAKKwkJCQkJCSAgICAgICByZXFfbGVuLAorCQkJCQkJICAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgCisJCQkJCQkgICAgICAgc2VnX3N6LCAKKwkJCQkJCSAgICAgICAmemZ0X3BvcywKKwkJCQkJCSAgICAgICB2b2x1bWUpLAorCQkJICAgIHpmdF9yZXNpZCAtPSBieXRlc19yZWFkKTsKKwkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJieXRlcyBqdXN0IHJlYWQ6ICVkIiwgcmVzdWx0KTsKKwkJYnl0ZXNfcmVhZCArPSByZXN1bHQ7IC8qIHdoYXQgd2UgZ290IHNvIGZhciAgICAgICAqLworCQlidWZmICAgICAgICs9IHJlc3VsdDsgLyogaW5kZXggaW4gdXNlci1idWZmZXIgICAgICovCisJCXJlcV9sZW4gICAgLT0gcmVzdWx0OyAvKiB3aGF0J3MgbGVmdCBmcm9tIHJlcV9sZW4gKi8KKwl9IC8qIHdoaWxlIChyZXFfbGVuICA+IDApICovCisJaWYgKHJlcV9jbGlwcGVkKSB7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAorCQkgICAgICAibWF5YmUgcGFydGlhbCBjb3VudCBiZWNhdXNlIG9mIGVvZiBtYXJrIik7CisJCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mICYmIGJ5dGVzX3JlYWQgPT0gMCkgeworCQkJLyogcmVxX2xlbiB3YXMgPiAwLCBidXQgdXNlciBkaWRuJ3QgZ2V0CisJCQkgKiBhbnl0aGluZyB0aGUgdXNlciBoYXMgcmVhZCBpbiB0aGUgZW9mLW1hcmsgCisJCQkgKi8KKwkJCXpmdF9tb3ZlX3Bhc3RfZW9mKCZ6ZnRfcG9zKTsKKwkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQl9IGVsc2UgeworCQkJLyogZG9uJ3Qgc2tpcCB0byB0aGUgbmV4dCBmaWxlIGJlZm9yZSB0aGUgdXNlcgorCQkJICogdHJpZWQgdG8gcmVhZCBhIHNlY29uZCB0aW1lIHBhc3QgRU9GIEp1c3QKKwkJCSAqIG1hcmsgdGhhdCB3ZSBhcmUgYXQgRU9GIGFuZCBtYXliZSBkZWNyZW1lbnQKKwkJCSAqIHpmdF9zZWdfcG9zIHRvIHN0YXkgaW4gdGhlIHNhbWUgdm9sdW1lOworCQkJICovCisJCQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMTsKKwkJCXpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKCZ6ZnRfcG9zLCB2b2x1bWUpOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImp1c3QgYmVmb3JlIGVvZiIpOworCQl9CisJfQorCXpmdF9yZXNpZCAtPSByZXN1bHQ7IC8qIGZvciBNVFNUQVRVUyAgICAgICAqLworCVRSQUNFX0VYSVQgYnl0ZXNfcmVhZDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk0MWRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX1pGVEFQRV9SRUFEX0gKKyNkZWZpbmUgX1pGVEFQRV9SRUFEX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgcmVhZCBmdW5jdGlvbnMKKyAqICAgICAgZm9yIHRoZSB6ZnRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKworLyogICAgICBmdGFwZS1yZWFkLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworZXh0ZXJuIGludCB6ZnRfanVzdF9iZWZvcmVfZW9mOworCQorLyogICAgICBmdGFwZS1yZWFkLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gdm9pZCB6ZnRfemFwX3JlYWRfYnVmZmVycyh2b2lkKTsKK2V4dGVybiBpbnQgIHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cyh2b2lkKTsKK2V4dGVybiBpbnQgIHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50LAorCQkJCSAgICAgICB2b2lkICpidWZmZXIsCisJCQkJICAgICAgIGNvbnN0IGZ0X3JlYWRfbW9kZV90IHJlYWRfbW9kZSwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisjZGVmaW5lIHpmdF9mZXRjaF9zZWdtZW50KHNlZ21lbnQsIGFkZHJlc3MsIHJlYWRfbW9kZSkJCVwKKwl6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbihzZWdtZW50LCBhZGRyZXNzLCByZWFkX21vZGUsCVwKKwkJCQkgICAwLCBGVF9TRUdNRU5UX1NJWkUpCisvKiAgIGhvb2sgZm9yIHRoZSBWRlMgaW50ZXJmYWNlCisgKi8KK2V4dGVybiBpbnQgIF96ZnRfcmVhZChjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pOworCisjZW5kaWYgLyogX1pGVEFQRV9SRUFEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWVmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA4ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIGZvciB0aGUgci93IGNvZGUgZm9yCisgKiAgICAgIHpmdGFwZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfWkZUX0RGTFRfQkxLX1NaICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKworX191OCAqemZ0X2RlYmxvY2tfYnVmOworX191OCAqemZ0X2hzZWdfYnVmOworaW50IHpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKK3pmdF9zdGF0dXNfZW51bSB6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsKK2ludCB6ZnRfaGVhZGVyX2NoYW5nZWQ7CitpbnQgemZ0X3FpYzExMzsgLyogY29uZm9ybSB0byBvbGQgc3BlY3MuIGFuZCBvbGQgemZ0YXBlICovCitpbnQgemZ0X3VzZV9jb21wcmVzc2lvbjsKK3pmdF9wb3NpdGlvbiB6ZnRfcG9zID0geworCS0xLCAvKiBzZWdfcG9zICovCisJMCwgIC8qIHNlZ19ieXRlX3BvcyAqLworCTAsICAvKiB0YXBlX3BvcyAqLworCTAgICAvKiB2b2x1bWVfcG9zICovCit9OwordW5zaWduZWQgaW50IHpmdF9ibGtfc3ogPSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaOworX19zNjQgemZ0X2NhcGFjaXR5OworCit1bnNpZ25lZCBpbnQgemZ0X3dyaXR0ZW5fc2VnbWVudHM7CitpbnQgemZ0X2xhYmVsX2NoYW5nZWQ7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworCit1bnNpZ25lZCBpbnQgemZ0X2dldF9zZWdfc3oodW5zaWduZWQgaW50IHNlZ21lbnQpCit7CisJaW50IHNpemU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwlzaXplID0gRlRfU0VHTUVOVF9TSVpFIC0gCisJCWNvdW50X29uZXMoZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudCkpKkZUX1NFQ1RPUl9TSVpFOworCWlmIChzaXplID4gMCkgeworCQlUUkFDRV9FWElUICh1bnNpZ25lZClzaXplOyAKKwl9IGVsc2UgeworCQlUUkFDRV9FWElUIDA7CisJfQorfQorCisvKiBmdGFwZV9zZXRfZmxhZ3MoKS4gQ2xhdXMtSnVzdHVzIEhlaW5lLCAxOTk0LzE5OTUKKyAqLwordm9pZCB6ZnRfc2V0X2ZsYWdzKHVuc2lnbmVkIG1pbm9yX3VuaXQpCit7ICAgICAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl6ZnRfdXNlX2NvbXByZXNzaW9uID0gemZ0X3FpY19tb2RlID0gMDsKKwlzd2l0Y2ggKG1pbm9yX3VuaXQgJiBaRlRfTUlOT1JfT1BfTUFTSykgeworCWNhc2UgKFpGVF9RODBfTU9ERSB8IFpGVF9aSVBfTU9ERSk6CisJY2FzZSBaRlRfWklQX01PREU6CisJCXpmdF91c2VfY29tcHJlc3Npb24gPSAxOworCWNhc2UgMDoKKwljYXNlIFpGVF9RODBfTU9ERToKKwkJemZ0X3FpY19tb2RlID0gMTsKKwkJaWYgKHpmdF9tdF9jb21wcmVzc2lvbikgeyAvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCAqLworCQkJemZ0X3VzZV9jb21wcmVzc2lvbiA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBaRlRfUkFXX01PREU6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzd2l0Y2hpbmcgdG8gcmF3IG1vZGUiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzpcbiIKKwkJICAgICAgS0VSTl9JTkZPICJXcm9uZyBjb21iaW5hdGlvbiBvZiBtaW5vciBkZXZpY2UgYml0cy5cbiIKKwkJICAgICAgS0VSTl9JTkZPICJTd2l0Y2hpbmcgdG8gcmF3IHJlYWQtb25seSBtb2RlLiIpOworCQl6ZnRfd3JpdGVfcHJvdGVjdGVkID0gMTsKKwkJYnJlYWs7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qIGNvbXB1dGVzIHRoZSBzZWdtZW50IGFuZCBieXRlIG9mZnNldCBpbnNpZGUgdGhlIHNlZ21lbnQKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGFwZV9wb3MuCisgKgorICogdGFwZV9wb3MgZ2l2ZXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBmdF9maXJzdF9kYXRhX3NlZ21lbnQgKnNlZ19ieXRlX3BvcyBpcyB0aGUgb2Zmc2V0IGluIHRoZSBjdXJyZW50CisgKiBzZWdtZW50IGluIGJ5dGVzCisgKgorICogT2YsIGlmIHRoaXMgcm91dGluZSB3YXMgY2FsbGVkIG9mdGVuIG9uZSBzaG91bGQgY2FjaGUgdGhlIGxhc3QgZGF0YQorICogcG9zIGl0IHdhcyBjYWxsZWQgd2l0aCwgYnV0IGFjdHVhbGx5IHRoaXMgaXMgb25seSBuZWVkZWQgaW4KKyAqIGZ0YXBlX3NlZWtfYmxvY2soKSwgdGhhdCBpcywgYWxtb3N0IG5ldmVyLgorICovCitpbnQgemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoaW50ICpzZWdfYnl0ZV9wb3MsIF9fczY0IHRhcGVfcG9zKQoreworCWludCBzZWdtZW50OworCWludCBzZWdfc3o7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKHRhcGVfcG9zID09IDApIHsKKwkJKnNlZ19ieXRlX3BvcyA9IDA7CisJCXNlZ21lbnQgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJfSBlbHNlIHsKKwkJc2VnX3N6ID0gMDsKKwkJCisJCWZvciAoc2VnbWVudCA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsgCisJCSAgICAgKCh0YXBlX3BvcyA+IDApICYmIChzZWdtZW50IDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSk7CisJCSAgICAgc2VnbWVudCsrKSB7CisJCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeihzZWdtZW50KTsgCisJCQl0YXBlX3BvcyAtPSBzZWdfc3o7CisJCX0KKwkJaWYodGFwZV9wb3MgPj0gMCkgeworCQkJLyogdGhlIGNhc2UgdGFwZV9wb3MgPiAhPSAwIG1lYW5zIHRoYXQgdGhlCisJCQkgKiBhcmd1bWVudCB0YXBlX3BvcyBsaWVzIGJleW9uZCB0aGUgRU9ULgorCQkJICovCisJCQkqc2VnX2J5dGVfcG9zPSAwOworCQl9IGVsc2UgeyAvKiB0YXBlX3BvcyA8IDAgKi8KKwkJCXNlZ21lbnQtLTsKKwkJCSpzZWdfYnl0ZV9wb3M9IHRhcGVfcG9zICsgc2VnX3N6OworCQl9CisJfQorCVRSQUNFX0VYSVQoc2VnbWVudCk7Cit9CisKKy8qIGZ0YXBlX2NhbGNfdGFwZV9wb3MoKS4KKyAqCisgKiBjb21wdXRlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCBpbnZlcnNlIHRvIGZ0YXBlX2NhbGNfc2VnX2J5dGVfY29vcmQKKyAqCisgKiBXZSBzaG91bGQgZG8gc29tZSBjYWNoaW5nLiBCdXQgaG93OgorICoKKyAqIEVhY2ggdGltZSB0aGUgaGVhZGVyIHNlZ21lbnRzIGFyZSByZWFkIGluLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkCisgKiB3aXRoIGZ0X3RyYWNrc19wZXJfdGFwZSpzZWdtZW50c19wZXJfdHJhY2sgYXJndW1uZXQuIFNvIHRoaXMgc2hvdWxkIGJlCisgKiB0aGUgdGltZSB0byByZXNldCB0aGUgY2FjaGUuCisgKgorICogQWxzbywgaXQgbWlnaHQgYmUgaW4gdGhlIGZ1dHVyZSB0aGF0IHRoZSBiYWQgc2VjdG9yIG1hcCBnZXRzCisgKiBjaGFuZ2VkLiAgLT4gcmVzZXQgdGhlIGNhY2hlCisgKi8KK3N0YXRpYyBpbnQgc2VnX3BvczsKK3N0YXRpYyBfX3M2NCB0YXBlX3BvczsKKworX19zNjQgemZ0X2dldF9jYXBhY2l0eSh2b2lkKQoreworCXNlZ19wb3MgID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCXRhcGVfcG9zID0gMDsKKworCXdoaWxlIChzZWdfcG9zIDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7CisJCXRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHNlZ19wb3MgKyspOworCX0KKwlyZXR1cm4gdGFwZV9wb3M7Cit9CisKK19fczY0IHpmdF9jYWxjX3RhcGVfcG9zKGludCBzZWdtZW50KQoreworCWludCBkMSwgZDIsIGQzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJaWYgKHNlZ21lbnQgPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgeworCSAgICAgICAgVFJBQ0VfRVhJVCB6ZnRfY2FwYWNpdHk7CisJfQorCWlmIChzZWdtZW50IDwgZnRfZmlyc3RfZGF0YV9zZWdtZW50KSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJZDIgPSBzZWdtZW50IC0gc2VnX3BvczsKKwlpZiAoLWQyID4gMTApIHsKKwkJZDEgPSBzZWdtZW50IC0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCQlpZiAoLWQyID4gZDEpIHsKKwkJCXRhcGVfcG9zID0gMDsKKwkJCXNlZ19wb3MgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJCQlkMiA9IGQxOworCQl9CisJfQorCWlmIChkMiA+IDEwKSB7CisJCWQzID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSBzZWdtZW50OworCQlpZiAoZDIgPiBkMykgeworCQkJdGFwZV9wb3MgPSB6ZnRfY2FwYWNpdHk7CisJCQlzZWdfcG9zICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwkJCWQyID0gLWQzOworCQl9CisJfQkJCisJaWYgKGQyID4gMCkgeworCQl3aGlsZSAoc2VnX3BvcyA8IHNlZ21lbnQpIHsKKwkJCXRhcGVfcG9zICs9ICB6ZnRfZ2V0X3NlZ19zeihzZWdfcG9zKyspOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNlZ19wb3MgPiBzZWdtZW50KSB7CisJCQl0YXBlX3BvcyAtPSAgemZ0X2dldF9zZWdfc3ooLS1zZWdfcG9zKTsKKwkJfQorCX0KKwlUUkFDRShmdF90X25vaXNlLCAibmV3IGNhY2hlZCBwb3M6ICVkIiwgc2VnX3Bvcyk7CisKKwlUUkFDRV9FWElUIHRhcGVfcG9zOworfQorCisvKiBjb3B5IFotbGFiZWwgc3RyaW5nIHRvIGJ1ZmZlciwga2VlcHMgdHJhY2sgb2YgdGhlIGNvcnJlY3Qgb2Zmc2V0IGluCisgKiBgYnVmZmVyJyAKKyAqLwordm9pZCB6ZnRfdXBkYXRlX2xhYmVsKF9fdTggKmJ1ZmZlcikKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKHN0cm5jbXAoJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCwgCisJCSAgICBzaXplb2YoWkZUQVBFX0xBQkVMKS0xKSAhPSAwKSB7CisJCVRSQUNFKGZ0X3RfaW5mbywgInVwZGF0aW5nIGxhYmVsIGZyb20gXCIlc1wiIHRvIFwiJXNcIiIsCisJCSAgICAgICZidWZmZXJbRlRfTEFCRUxdLCBaRlRBUEVfTEFCRUwpOworCQlzdHJjcHkoJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCk7CisJCW1lbXNldCgmYnVmZmVyW0ZUX0xBQkVMXSArIHNpemVvZihaRlRBUEVfTEFCRUwpIC0gMSwgJyAnLCAKKwkJICAgICAgIEZUX0xBQkVMX1NaIC0gc2l6ZW9mKFpGVEFQRV9MQUJFTCArIDEpKTsKKwkJUFVUNChidWZmZXIsIEZUX0xBQkVMX0RBVEUsIDApOworCQl6ZnRfbGFiZWxfY2hhbmdlZCA9IHpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7IC8qIGNoYW5nZWQgKi8KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworaW50IHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHModW5zaWduZWQgaW50IHNlZ21lbnQsIAorCQkJICAgICAgX191OCAqZGF0YSwgc2l6ZV90IHNpemUsCisJCQkgICAgICBfX3U4ICpidWZmZXIpCit7CisJaW50IHJlc3VsdDsKKwlfX3U4ICp3cml0ZV9idWY7CisJX191OCAqc3JjX2J1ZjsKKwlpbnQgc2luZ2xlOworCWludCBzZWdfcG9zOworCWludCBzZWdfc3o7CisJaW50IHJlbWFpbmluZzsKKwlmdF93cml0ZV9tb2RlX3Qgd3JpdGVfbW9kZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXNlZ19wb3MgICA9IHNlZ21lbnQ7CisJc2VnX3N6ICAgID0gemZ0X2dldF9zZWdfc3ooc2VnX3Bvcyk7CisJc3JjX2J1ZiAgID0gZGF0YTsKKwlzaW5nbGUgICAgPSBzaXplIDw9IHNlZ19zejsKKwlyZW1haW5pbmcgPSBzaXplOworCWRvIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfc3ogICA6ICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCAgOiAlZCIsCisJCSAgICAgIHJlbWFpbmluZywgc2VnX3N6LCBzZWdfcG9zKTsKKwkJaWYgKHJlbWFpbmluZyA9PSBzZWdfc3opIHsKKwkJCXdyaXRlX2J1ZiA9IHNyY19idWY7CisJCQl3cml0ZV9tb2RlID0gc2luZ2xlID8gRlRfV1JfU0lOR0xFIDogRlRfV1JfTVVMVEk7CisJCQlyZW1haW5pbmcgPSAwOworCQl9IGVsc2UgaWYgKHJlbWFpbmluZyA+IHNlZ19zeikgeworCQkJd3JpdGVfYnVmID0gc3JjX2J1ZjsKKwkJCXdyaXRlX21vZGUgPSBGVF9XUl9BU1lOQzsgLyogZG9uJ3Qgc3RhcnQgdGFwZSAqLworCQkJcmVtYWluaW5nIC09IHNlZ19zejsKKwkJfSBlbHNlIHsgLyogcmVtYWluaW5nIDwgc2VnX3N6ICovCisJCQl3cml0ZV9idWYgPSBidWZmZXI7CisJCQltZW1jcHkod3JpdGVfYnVmLCBzcmNfYnVmLCByZW1haW5pbmcpOworCQkJbWVtc2V0KCZ3cml0ZV9idWZbcmVtYWluaW5nXSwnXDAnLHNlZ19zei1yZW1haW5pbmcpOworCQkJd3JpdGVfbW9kZSA9IHNpbmdsZSA/IEZUX1dSX1NJTkdMRSA6IEZUX1dSX01VTFRJOworCQkJcmVtYWluaW5nID0gMDsKKwkJfQorCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQoc2VnX3BvcywgCisJCQkJCQkgIHdyaXRlX2J1ZiwgCisJCQkJCQkgIHdyaXRlX21vZGUpKSAhPSBzZWdfc3opIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6ICIKKwkJCSAgICAgICJDb3VsZG4ndCB3cml0ZSBzZWdtZW50ICVkIiwgc2VnX3Bvcyk7CisJCQlUUkFDRV9FWElUIHJlc3VsdCA8IDAgPyByZXN1bHQgOiAtRUlPOyAvKiBiYWlsIG91dCAqLworCQl9CisJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOworCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeigrK3NlZ19wb3MpOworCQlzcmNfYnVmICs9IHJlc3VsdDsKKwl9IHdoaWxlIChyZW1haW5pbmcgPiAwKTsKKwlpZiAoZnRhcGVfZ2V0X3N0YXR1cygpLT5mdGlfc3RhdGUgPT0gd3JpdGluZykgeworCQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwkJemZ0X3ByZXZlbnRfZmx1c2goKTsKKwl9CisJc2VnX3BvcyA9IHNlZ21lbnQ7CisJc3JjX2J1ZiA9IGRhdGE7CisJcmVtYWluaW5nID0gc2l6ZTsKKwlkbyB7CisJCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChzZWdfcG9zLCBidWZmZXIsIAorCQkJCQkJCXNpbmdsZSA/IEZUX1JEX1NJTkdMRQorCQkJCQkJCTogRlRfUkRfQUhFQUQpLCk7CisJCWlmIChtZW1jbXAoc3JjX2J1ZiwgYnVmZmVyLCAKKwkJCSAgIHJlbWFpbmluZyA+IHJlc3VsdCA/IHJlc3VsdCA6IHJlbWFpbmluZykgIT0gMCkgeworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJICAgICJGYWlsZWQgdG8gdmVyaWZ5IHdyaXR0ZW4gc2VnbWVudCAlZCIsCisJCQkJICAgIHNlZ19wb3MpOworCQl9CisJCXJlbWFpbmluZyAtPSByZXN1bHQ7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ2ZXJpZnkgc3VjY2Vzc2Z1bDpcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdtZW50ICA6ICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2Vnc2l6ZSAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogJWQiLAorCQkgICAgICBzZWdfcG9zLCByZXN1bHQsIHJlbWFpbmluZyk7CisJCXNyY19idWYgICArPSBzZWdfc3o7CisJCXNlZ19wb3MrKzsKKwl9IHdoaWxlIChyZW1haW5pbmcgPiAwKTsKKwlUUkFDRV9FWElUIHNpemU7Cit9CisKKworLyogemZ0X2VyYXNlKCkuICBpbXBsZW1lbnRlZCBjb21wcmVzc2lvbi1oYW5kbGluZworICoKKyAqIGNhbGN1bGF0ZSB0aGUgZmlyc3QgZGF0YS1zZWdtZW50IHdoZW4gdXNpbmcvbm90IHVzaW5nIGNvbXByZXNzaW9uLgorICoKKyAqIHVwZGF0ZSBoZWFkZXItc2VnbWVudCBhbmQgY29tcHJlc3Npb24tbWFwLXNlZ21lbnQuCisgKi8KK2ludCB6ZnRfZXJhc2Uodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCh2b2lkICoqKSZ6ZnRfaHNlZ19idWYsCisJCQkJCSAgICAgRlRfU0VHTUVOVF9TSVpFKSwpOworCQkvKiBubyBuZWVkIHRvIHJlYWQgdGhlIHZ0YmwgYW5kIGNvbXByZXNzaW9uIG1hcCAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KHpmdF9oc2VnX2J1ZiksKTsKKwkJaWYgKCh6ZnRfb2xkX2Z0YXBlID0gCisJCSAgICAgemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKCZ6ZnRfaHNlZ19idWZbRlRfTEFCRUxdKSkpIHsKKwkJCXpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoemZ0X2hzZWdfYnVmKTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAiZnRfZmlyc3RfZGF0YV9zZWdtZW50OiAlZCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQ6ICVkIiwgCisJCSAgICAgIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOworCQl6ZnRfcWljMTEzID0gKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9ub3JtYWwgJiYKKwkJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF8xMTAwZnQgJiYKKwkJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF80MjVmdCk7CisJfQorCWlmICh6ZnRfb2xkX2Z0YXBlKSB7CisJCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7CisJCXpmdF9vbGRfZnRhcGUgPSAwOyAvKiBubyBsb25nZXIgb2xkIGZ0YXBlICovCisJfQorCVBVVDIoemZ0X2hzZWdfYnVmLCBGVF9DTUFQX1NUQVJULCAwKTsKKwl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOworCXpmdF9jYXBhY2l0eSA9IHpmdF9nZXRfY2FwYWNpdHkoKTsKKwl6ZnRfaW5pdF92dGJsKCk7CisJLyogdGhlIHJlc3QgbXVzdCBiZSBkb25lIGluIGZ0YXBlX3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMgCisJICovCisJemZ0X2hlYWRlcl9yZWFkID0gMTsKKwl6ZnRfaGVhZGVyX2NoYW5nZWQgPSAxOyAvKiBmb3JjZSB1cGRhdGUgb2YgdGltZXN0YW1wICovCisJcmVzdWx0ID0gemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMoKTsKKworCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCisJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKKwl6ZnRfc2V0X2ZsYWdzICh6ZnRfdW5pdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIGludCB6ZnRfZ2V0X3RpbWUodm9pZCkgCit7CisJdW5zaWduZWQgaW50IGRhdGUgPSBGVF9USU1FX1NUQU1QKDIwOTcsIDExLCAzMCwgMjMsIDU5LCA1OSk7IC8qIGZ1biAqLworCXJldHVybiBkYXRlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjMDdmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX1pGVEFQRV9SV19ICisjZGVmaW5lIF9aRlRBUEVfUldfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDkgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgYW5kIHdyaXRlCisgKiAgICAgIGZ1bmN0aW9ucyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAqLworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgorCisjZGVmaW5lIFNFR01FTlRTX1BFUl9UQVBFICAoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlKQorCisvKiAgUUlDLTExMyBSZXYuIEcgc2F5cyB0aGF0IGBhIG1heGltdW0gb2YgNjM0ODggcmF3IGJ5dGVzIG1heSBiZQorICogIGNvbXByZXNzZWQgaW50byBhIHNpbmdsZSBmcmFtZScuCisgKiAgTWF5YmUgd2Ugc2hvdWxkIHN0aWNrIHRvIDMya2IgdG8gbWFrZSBpdCBtb3JlIGBiZWF1dGlmdWwnCisgKi8KKyNkZWZpbmUgWkZUX01BWF9CTEtfU1ogICAgICAgICAgICg2MioxMDI0KSAvKiBieXRlcyAqLworI2lmICFkZWZpbmVkKENPTkZJR19aRlRfREZMVF9CTEtfU1opCisjIGRlZmluZSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaICAgKDEwKjEwMjQpIC8qIGJ5dGVzLCBkZWZhdWx0IG9mIGdudSB0YXIgKi8KKyNlbGlmIENPTkZJR19aRlRfREZMVF9CTEtfU1ogPT0gMAorIyB1bmRlZiAgQ09ORklHX1pGVF9ERkxUX0JMS19TWgorIyBkZWZpbmUgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAxCisjZWxpZiAoQ09ORklHX1pGVF9ERkxUX0JMS19TWiAlIDEwMjQpICE9IDAKKyMgZXJyb3IgQ09ORklHX1pGVF9ERkxUX0JMS19TWiBtdXN0IGJlIDEgb3IgYSBtdWx0aXBsZSBvZiAxMDI0CisjZW5kaWYKKy8qIFRoZSAqb3B0aW9uYWwqIGNvbXByZXNzaW9uIHJvdXRpbmVzIG5lZWQgc29tZSBvdmVyaGVhZCBwZXIgdGFwZQorICogIGJsb2NrIGZvciB0aGVpciBwdXJwb3Nlcy4gSW5zdGVhZCBvZiBhc2tpbmcgdGhlIGFjdHVhbCBjb21wcmVzc2lvbgorICogIGltcGxlbWVudGF0aW9uIGhvdyBtdWNoIGl0IG5lZWRzLCB3ZSByZXN0cmljdCB0aGlzIG92ZXJoZWFkIHRvIGJlCisgKiAgbWF4aW1hbCBvZiBaRlRfQ01QVF9PVkVSSEVBRCBzaXplLiBXZSBuZWVkIHRoaXMgZm9yIEVPVAorICogIGNvbmRpdGlvbnMuIFRoZSB0YXBlIGlzIGFzc3VtZWQgdG8gYmUgbG9naWNhbCBhdCBFT1Qgd2hlbiB0aGUKKyAqICBkaXN0YW5jZSBmcm9tIHRoZSBwaHlzaWNhbCBFT1QgaXMgbGVzcyB0aGFuIAorICogIG9uZSB0YXBlIGJsb2NrICsgWkZUX0NNUFJfT1ZFUkhFQUQgCisgKi8KKyNkZWZpbmUgWkZUX0NNUFJfT1ZFUkhFQUQgMTYgICAgICAgIC8qIGJ5dGVzICovCisKK3R5cGVkZWYgZW51bQoreyAKKwl6ZnRfaWRsZSA9IDAsCisJemZ0X3JlYWRpbmcsCisJemZ0X3dyaXRpbmcsCit9IHpmdF9zdGF0dXNfZW51bTsKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAvKiAgYWxsIHZhbHVlcyBtZWFzdXJlZCBpbiBieXRlcyAqLworeworCWludCAgIHNlZ19wb3M7ICAgICAgIC8qICBzZWdtZW50IGN1cnJlbnRseSBwb3NpdGlvbmVkIGF0ICovCisJaW50ICAgc2VnX2J5dGVfcG9zOyAgLyogIG9mZnNldCBpbiBjdXJyZW50IHNlZ21lbnQgKi8gCisJX19zNjQgdGFwZV9wb3M7ICAgICAgLyogIHJlYWwgb2Zmc2V0IGZyb20gQk9UICovCisJX19zNjQgdm9sdW1lX3BvczsgICAgLyogIHBvcy4gaW4gdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtIGluCisJCQkgICAgICAqICBjdXJyZW50IHZvbHVtZSAKKwkJCSAgICAgICovCit9IHpmdF9wb3NpdGlvbjsgCisKK2V4dGVybiB6ZnRfcG9zaXRpb24gemZ0X3BvczsKK2V4dGVybiBfX3U4ICp6ZnRfZGVibG9ja19idWY7CitleHRlcm4gX191OCAqemZ0X2hzZWdfYnVmOworZXh0ZXJuIGludCB6ZnRfZGVibG9ja19zZWdtZW50OworZXh0ZXJuIHpmdF9zdGF0dXNfZW51bSB6ZnRfaW9fc3RhdGU7CitleHRlcm4gaW50IHpmdF9oZWFkZXJfY2hhbmdlZDsKK2V4dGVybiBpbnQgemZ0X3FpYzExMzsgLyogY29uZm9ybSB0byBvbGQgc3BlY3MuIGFuZCBvbGQgemZ0YXBlICovCitleHRlcm4gaW50IHpmdF91c2VfY29tcHJlc3Npb247CitleHRlcm4gdW5zaWduZWQgaW50IHpmdF9ibGtfc3o7CitleHRlcm4gX19zNjQgemZ0X2NhcGFjaXR5OworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfd3JpdHRlbl9zZWdtZW50czsKK2V4dGVybiBpbnQgemZ0X2xhYmVsX2NoYW5nZWQ7CisKKy8qICB6ZnRhcGUtcncuYyBleHBvcnRlZCBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfZ2V0X3NlZ19zeih1bnNpZ25lZCBpbnQgc2VnbWVudCk7CitleHRlcm4gdm9pZCAgemZ0X3NldF9mbGFncyh1bnNpZ25lZCBpbnQgbWlub3JfdW5pdCk7CitleHRlcm4gaW50ICAgemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoaW50ICpzZWdfYnl0ZV9wb3MsIF9fczY0IHRhcGVfcG9zKTsKK2V4dGVybiBfX3M2NCB6ZnRfY2FsY190YXBlX3BvcyhpbnQgc2VnbWVudCk7CitleHRlcm4gX19zNjQgemZ0X2dldF9jYXBhY2l0eSh2b2lkKTsKK2V4dGVybiB2b2lkICB6ZnRfdXBkYXRlX2xhYmVsKF9fdTggKmJ1ZmZlcik7CitleHRlcm4gaW50ICAgemZ0X2VyYXNlKHZvaWQpOworZXh0ZXJuIGludCAgIHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHModW5zaWduZWQgaW50IHNlZ21lbnQsIAorCQkJCSAgICAgICBfX3U4ICpkYXRhLCBzaXplX3Qgc2l6ZSwgX191OCAqYnVmZmVyKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgemZ0X2dldF90aW1lKHZvaWQpOworI2VuZGlmIC8qIF9aRlRBUEVfUldfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3ZjhiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuYwpAQCAtMCwwICsxLDc1NyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIAorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMsdiAkCisgKiAkUmV2aXNpb246IDEuNy42LjEgJAorICogJERhdGU6IDE5OTcvMTEvMjQgMTM6NDg6MzEgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSB2b2x1bWUgdGFibGUgYXMgZGVmaW5lZCBpbiB2YXJpb3VzIFFJQworICogICAgICBzdGFuZGFyZHMuCisgKiAKKyAqICAgICAgVGhpcyBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24sIGp1c3QgYWxsb3dpbmcgb3JkaW5hcnkgRE9TCisgKiAgICAgIDooIHByZ3JhbXMgdG8gaWRlbnRpZnkgdGhlIGNhcnRyaWRnZSBhcyB1c2VkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKyNkZWZpbmUgWkZUX0NNQVBfSEFDSyAvKiBsZWF2ZSB0aGlzIGRlZmluZWQgdG8gaGlkZSB0aGUgY29tcHJlc3Npb24gbWFwICovCisKKy8qCisgKiAgZ2xvYmFsIHZhcmlhYmxlcyAKKyAqLworaW50IHpmdF9xaWNfbW9kZSAgID0gMTsgLyogdXNlIHRoZSB2dGJsICovCitpbnQgemZ0X29sZF9mdGFwZTsgLyogcHJldmVudHMgb2xkIGZ0YXBlZCB0YXBlcyB0byBiZSBvdmVyd3JpdHRlbiAqLworaW50IHpmdF92b2x1bWVfdGFibGVfY2hhbmdlZDsgLyogZm9yIHdyaXRlX2hlYWRlcl9zZWdtZW50cygpICovCisKKy8qCisgKiAgcHJpdmF0ZSB2YXJpYWJsZXMgKG9ubHkgZXhwb3J0ZWQgZm9yIGlubGluZSBmdW5jdGlvbnMpCisgKi8KK0xJU1RfSEVBRCh6ZnRfdnRibCk7CisKKy8qICBXZSBjb3VsZCBhbHNvIGFsbG9jYXRlIHRoZXNlIGR5bmFtaWNhbGx5IHdoZW4gZXh0cmFjdGluZyB0aGUgdm9sdW1lIHRhYmxlCisgKiAgc2l6ZW9mKHpmdF92b2xpbmZvKSBpcyBhYm91dCAzMiBvciBzb21ldGhpbmcgY2xvc2UgdG8gdGhhdAorICovCitzdGF0aWMgemZ0X3ZvbGluZm8gIHRhcGVfdnRibDsKK3N0YXRpYyB6ZnRfdm9saW5mbyAgZW90X3Z0Ymw7CitzdGF0aWMgemZ0X3ZvbGluZm8gKmN1cl92dGJsOworCitzdGF0aWMgaW5saW5lIHZvaWQgemZ0X25ld192dGJsX2VudHJ5KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gJnpmdF9sYXN0X3Z0YmwtPm5vZGU7CisJemZ0X3ZvbGluZm8gKm5ldyA9IHpmdF9rbWFsbG9jKHNpemVvZih6ZnRfdm9saW5mbykpOworCisJbGlzdF9hZGQoJm5ldy0+bm9kZSwgdG1wKTsKKwluZXctPmNvdW50ID0gemZ0X2VvbV92dGJsLT5jb3VudCArKzsKK30KKwordm9pZCB6ZnRfZnJlZV92dGJsKHZvaWQpCit7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSB6ZnRfdnRibC5wcmV2OworCQl6ZnRfdm9saW5mbyAqdnRibDsKKworCQlpZiAodG1wID09ICZ6ZnRfdnRibCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbCh0bXApOworCQl2dGJsID0gbGlzdF9lbnRyeSh0bXAsIHpmdF92b2xpbmZvLCBub2RlKTsKKwkJemZ0X2tmcmVlKHZ0YmwsIHNpemVvZih6ZnRfdm9saW5mbykpOworCX0KKwlJTklUX0xJU1RfSEVBRCgmemZ0X3Z0YmwpOworCWN1cl92dGJsID0gTlVMTDsKK30KKworLyogIGluaXRpYWxpemUgdnRibCwgY2FsbGVkIGJ5IGZ0YXBlX25ld19jYXJ0cmlkZ2UoKQorICovCit2b2lkIHpmdF9pbml0X3Z0Ymwodm9pZCkKK3sgCisJemZ0X3ZvbGluZm8gKm5ldzsKKworCXpmdF9mcmVlX3Z0YmwoKTsKKwkKKwkvKiAgQ3JlYXRlIHRoZSB0d28gZHVtbXkgdnRibCBlbnRyaWVzCisJICovCisJbmV3ID0gemZ0X2ttYWxsb2Moc2l6ZW9mKHpmdF92b2xpbmZvKSk7CisJbGlzdF9hZGQoJm5ldy0+bm9kZSwgJnpmdF92dGJsKTsKKwluZXcgPSB6ZnRfa21hbGxvYyhzaXplb2YoemZ0X3ZvbGluZm8pKTsKKwlsaXN0X2FkZCgmbmV3LT5ub2RlLCAmemZ0X3Z0YmwpOworCXpmdF9oZWFkX3Z0YmwtPmVuZF9zZWcgICA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwl6ZnRfaGVhZF92dGJsLT5ibGtfc3ogICAgPSB6ZnRfYmxrX3N6OworCXpmdF9oZWFkX3Z0YmwtPmNvdW50ICAgICA9IC0xOworCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCArIDE7CisJemZ0X2VvbV92dGJsLT5lbmRfc2VnICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCXpmdF9lb21fdnRibC0+YmxrX3N6ICAgICA9IHpmdF9ibGtfc3o7CisJemZ0X2VvbV92dGJsLT5jb3VudCAgICAgID0gMDsKKworCS8qICBSZXNldCB0aGUgcG9pbnRlciBmb3IgemZ0X2ZpbmRfdm9sdW1lKCkKKwkgKi8KKwljdXJfdnRibCA9IHpmdF9lb21fdnRibDsKKworCS8qIGluaXRpYWxpemUgdGhlIGR1bW15IHZ0YmwgZW50cmllcyBmb3IgemZ0X3FpY19tb2RlID09IDAKKwkgKi8KKwllb3RfdnRibC5zdGFydF9zZWcgICAgICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7CisJZW90X3Z0YmwuZW5kX3NlZyAgICAgICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCWVvdF92dGJsLmJsa19zeiAgICAgICAgICA9IHpmdF9ibGtfc3o7CisJZW90X3Z0YmwuY291bnQgICAgICAgICAgID0gLTE7CisJdGFwZV92dGJsLnN0YXJ0X3NlZyA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwl0YXBlX3Z0YmwuZW5kX3NlZyAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7CisJdGFwZV92dGJsLmJsa19zeiAgICA9IHpmdF9ibGtfc3o7CisJdGFwZV92dGJsLnNpemUgICAgICA9IHpmdF9jYXBhY2l0eTsKKwl0YXBlX3Z0YmwuY291bnQgICAgID0gMDsKK30KKworLyogY2hlY2sgZm9yIGEgdmFsaWQgVlRCTCBzaWduYXR1cmUuIAorICovCitzdGF0aWMgaW50IHZ0Ymxfc2lnbmF0dXJlX3ZhbGlkKF9fdTggc2lnbmF0dXJlWzRdKQoreworCWNvbnN0IGNoYXIgKnZ0YmxfaWRzW10gPSBWVEJMX0lEUzsgLyogdmFsaWQgc2lnbmF0dXJlcyAqLworCWludCBqOworCQorCWZvciAoaiA9IDA7IAorCSAgICAgKGogPCBOUl9JVEVNUyh2dGJsX2lkcykpICYmIChtZW1jbXAoc2lnbmF0dXJlLCB2dGJsX2lkc1tqXSwgNCkgIT0gMCk7CisJICAgICBqKyspOworCXJldHVybiBqIDwgTlJfSVRFTVModnRibF9pZHMpOworfQorCisvKiBXZSB1c2VkIHRvIHN0b3JlIHRoZSBibG9jay1zaXplIG9mIHRoZSB2b2x1bWUgaW4gdGhlIHZvbHVtZS1sYWJlbCwKKyAqIHVzaW5nIHRoZSBrZXl3b3JkICJibG9ja3NpemUiLiBUaGUgYmxvY2tzaXplIHdyaXR0ZW4gdG8gdGhlCisgKiB2b2x1bWUtbGFiZWwgaXMgaW4gYnl0ZXMuCisgKgorICogV2UgdXNlIHRoaXMgbm93IG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgemZ0YXBlIHZlcnNpb24uIFdlCisgKiBzdG9yZSB0aGUgYmxvY2tzaXplIGRpcmVjdGx5IGFzIGJpbmFyeSBudW1iZXIgaW4gdGhlIHZlbmRvcgorICogZXh0ZW5zaW9uIHBhcnQgb2YgdGhlIHZvbHVtZSBlbnRyeS4KKyAqLworc3RhdGljIGludCBjaGVja192b2x1bWVfbGFiZWwoY29uc3QgY2hhciAqbGFiZWwsIGludCAqYmxrX3N6KQoreyAKKwlpbnQgdmFsaWRfZm9ybWF0OworCWNoYXIgKmJsb2Nrc2l6ZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiY2FsbGVkIHdpdGggXCIlc1wiIC8gXCIlc1wiIiwgbGFiZWwsIFpGVF9WT0xfTkFNRSk7CisJaWYgKHN0cm5jbXAobGFiZWwsIFpGVF9WT0xfTkFNRSwgc3RybGVuKFpGVF9WT0xfTkFNRSkpICE9IDApIHsKKwkJKmJsa19zeiA9IDE7IC8qIHNtYWxsZXN0IGJsb2NrIHNpemUgdGhhdCB3ZSBhbGxvdyAqLworCQl2YWxpZF9mb3JtYXQgPSAwOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3Qgb2xkIHN0eWxlIHpmdGFwZSB2dGJsIGVudHJ5Iik7CisJCS8qIGdldCB0aGUgZGVmYXVsdCBibG9ja3NpemUgKi8KKwkJLyogdXNlIHRoZSBrZXJuZWwgc3Ryc3RyKCkgICAqLworCQlibG9ja3NpemU9IHN0cnN0cihsYWJlbCwgIiBibG9ja3NpemUgIik7CisJCWlmIChibG9ja3NpemUpIHsKKwkJCWJsb2Nrc2l6ZSArPSBzdHJsZW4oIiBibG9ja3NpemUgIik7CisJCQlmb3IoKmJsa19zej0gMDsgCisJCQkgICAgKmJsb2Nrc2l6ZSA+PSAnMCcgJiYgKmJsb2Nrc2l6ZSA8PSAnOSc7IAorCQkJICAgIGJsb2Nrc2l6ZSsrKSB7CisJCQkJKmJsa19zeiAqPSAxMDsKKwkJCQkqYmxrX3N6ICs9ICpibG9ja3NpemUgLSAnMCc7CisJCQl9CisJCQlpZiAoKmJsa19zeiA+IFpGVF9NQVhfQkxLX1NaKSB7CisJCQkJKmJsa19zej0gMTsKKwkJCQl2YWxpZF9mb3JtYXQ9IDA7CisJCQl9IGVsc2UgeworCQkJCXZhbGlkX2Zvcm1hdCA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkqYmxrX3N6PSAxOworCQkJdmFsaWRfZm9ybWF0PSAwOworCQl9CisJfQorCVRSQUNFX0VYSVQgdmFsaWRfZm9ybWF0OworfQorCisvKiAgIGNoZWNrIGZvciBhIHpmdGFwZSB2b2x1bWUKKyAqLworc3RhdGljIGludCBjaGVja192b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYoc3RybmNtcCgmZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHLAorCQkgICBzdHJsZW4oWkZUQVBFX1NJRykpID09IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCBuZXcgc3R5bGUgemZ0YXBlIHZ0YmwgZW50cnkiKTsKKwkJdm9sdW1lLT5ibGtfc3ogPSBHRVQyKGVudHJ5LCBWVEJMX0VYVCtFWFRfWkZUQVBFX0JMS1NaKTsKKwkJdm9sdW1lLT5xaWMxMTMgPSBlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1FJQzExM107CisJCVRSQUNFX0VYSVQgMTsKKwl9IGVsc2UgeworCQlUUkFDRV9FWElUIGNoZWNrX3ZvbHVtZV9sYWJlbCgmZW50cnlbVlRCTF9ERVNDXSwgJnZvbHVtZS0+YmxrX3N6KTsKKwl9Cit9CisKKworLyogY3JlYXRlIHpmdGFwZSBzcGVjaWZpYyB2dGJsIGVudHJ5LCB0aGUgdm9sdW1lIGJvdW5kcyBhcmUgaW5zZXJ0ZWQKKyAqIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCB6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKCkKKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX3pmdF92b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2dGJsKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJbWVtc2V0KGVudHJ5LCAwLCBWVEJMX1NJWkUpOworCW1lbWNweSgmZW50cnlbVlRCTF9TSUddLCBWVEJMX0lELCA0KTsKKwlzcHJpbnRmKCZlbnRyeVtWVEJMX0RFU0NdLCBaRlRfVk9MX05BTUUiICUwM2QiLCB2dGJsLT5jb3VudCk7CisJZW50cnlbVlRCTF9GTEFHU10gPSAoVlRCTF9GTF9OT1RfVkVSSUZJRUQgfCBWVEJMX0ZMX1NFR19TUEFOTklORyk7CisJZW50cnlbVlRCTF9NX05PXSA9IDE7IC8qIG11bHRpX2NhcnRyaWRnZV9jb3VudCAqLworCXN0cmNweSgmZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHKTsKKwlQVVQyKGVudHJ5LCBWVEJMX0VYVCtFWFRfWkZUQVBFX0JMS1NaLCB2dGJsLT5ibGtfc3opOworCWlmICh6ZnRfcWljMTEzKSB7CisJCVBVVDgoZW50cnksIFZUQkxfREFUQV9TSVpFLCB2dGJsLT5zaXplKTsKKwkJZW50cnlbVlRCTF9DTVBSXSA9IFZUQkxfQ01QUl9VTlJFRzsgCisJCWlmICh2dGJsLT51c2VfY29tcHJlc3Npb24pIHsgLyogdXNlIGNvbXByZXNzaW9uOiAqLworCQkJZW50cnlbVlRCTF9DTVBSXSB8PSBWVEJMX0NNUFJfVVNFRDsKKwkJfQorCQllbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1FJQzExM10gPSAxOworCX0gZWxzZSB7CisJCVBVVDQoZW50cnksIFZUQkxfREFUQV9TSVpFLCB2dGJsLT5zaXplKTsKKwkJZW50cnlbVlRCTF9LX0NNUFJdID0gVlRCTF9DTVBSX1VOUkVHOyAKKwkJaWYgKHZ0YmwtPnVzZV9jb21wcmVzc2lvbikgeyAvKiB1c2UgY29tcHJlc3Npb246ICovCisJCQllbnRyeVtWVEJMX0tfQ01QUl0gfD0gVlRCTF9DTVBSX1VTRUQ7CisJCX0KKwl9CisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJLyogU0NTSSBsaWtlIHZ0YmwsIHN0b3JlIHRoZSBudW1iZXIgb2YgdXNlZAorCQkgKiBzZWdtZW50cyBhcyA0IGJ5dGUgdmFsdWUgCisJCSAqLworCQlQVVQ0KGVudHJ5LCBWVEJMX1NDU0lfU0VHUywgdnRibC0+ZW5kX3NlZy12dGJsLT5zdGFydF9zZWcgKyAxKTsKKwl9IGVsc2UgeworCQkvKiBub3JtYWwsIFFJQy04ME1DIGxpa2UgdnRibCAKKwkJICovCisJCVBVVDIoZW50cnksIFZUQkxfU1RBUlQsIHZ0YmwtPnN0YXJ0X3NlZyk7CisJCVBVVDIoZW50cnksIFZUQkxfRU5ELCB2dGJsLT5lbmRfc2VnKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyogdGhpcyBvbmUgY3JlYXRlcyB0aGUgdm9sdW1lIGhlYWRlcnMgZm9yIGVhY2ggdm9sdW1lLiBJdCBpcyBhc3N1bWVkCisgKiB0aGF0IGJ1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIHRoZSBvbGQgdm9sdW1lLXRhYmxlLCBzbyB0aGF0IHZ0YmwKKyAqIGVudHJpZXMgd2l0aG91dCB0aGUgemZ0X3ZvbHVtZSBmbGFnIHNldCBjYW4gc2F2ZWx5IGJlIGlnbm9yZWQuCisgKi8KK3N0YXRpYyB2b2lkIHpmdF9jcmVhdGVfdm9sdW1lX2hlYWRlcnMoX191OCAqYnVmZmVyKQoreyAgIAorCV9fdTggKmVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwl6ZnRfdm9saW5mbyAqdnRibDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKyNpZmRlZiBaRlRfQ01BUF9IQUNLCisJaWYoKHN0cm5jbXAoJmJ1ZmZlcltWVEJMX0VYVCtFWFRfWkZUQVBFX1NJR10sIFpGVEFQRV9TSUcsCisJCSAgICBzdHJsZW4oWkZUQVBFX1NJRykpID09IDApICYmIAorCSAgIGJ1ZmZlcltWVEJMX0VYVCtFWFRfWkZUQVBFX0NNQVBdICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRlbGV0aW5nIGNtYXAgdm9sdW1lIik7CisJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyBWVEJMX1NJWkUsCisJCQlGVF9TRUdNRU5UX1NJWkUgLSBWVEJMX1NJWkUpOworCX0KKyNlbmRpZgorCWVudHJ5ID0gYnVmZmVyOworCWZvciAodG1wID0gemZ0X2hlYWRfdnRibC0+bm9kZS5uZXh0OworCSAgICAgdG1wICE9ICZ6ZnRfZW9tX3Z0YmwtPm5vZGU7CisJICAgICB0bXAgPSB0bXAtPm5leHQpIHsKKwkJdnRibCA9IGxpc3RfZW50cnkodG1wLCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCS8qIHdlIG5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgb25seSBmb3IgbmV3bHkgY3JlYXRlZCB2b2x1bWVzLgorCQkgKi8KKwkJaWYgKHZ0YmwtPm5ld192b2x1bWUpIHsKKwkJCWNyZWF0ZV96ZnRfdm9sdW1lKGVudHJ5LCB2dGJsKTsKKwkJCXZ0YmwtPm5ld192b2x1bWUgPSAwOyAvKiBjbGVhciB0aGUgZmxhZyAqLworCQl9CisJCQorCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgJmVudHJ5W1ZUQkxfREVTQ10sIHZ0YmwpOworCQllbnRyeSArPSBWVEJMX1NJWkU7CisJfQorCW1lbXNldChlbnRyeSwgMCwgRlRfU0VHTUVOVF9TSVpFIC0gemZ0X2VvbV92dGJsLT5jb3VudCAqIFZUQkxfU0laRSk7CisJVFJBQ0VfRVhJVDsKK30KKworLyogIHdyaXRlIHZvbHVtZSB0YWJsZSB0byB0YXBlLiBDYWxscyB6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKCkKKyAqLworaW50IHpmdF91cGRhdGVfdm9sdW1lX3RhYmxlKHVuc2lnbmVkIGludCBzZWdtZW50KQoreworCWludCByZXN1bHQgPSAwOworCV9fdTggKnZlcmlmeV9idWYgPSBOVUxMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0VfQ0FUQ0gocmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgCisJCQkJCQl6ZnRfZGVibG9ja19idWYsCisJCQkJCQlGVF9SRF9TSU5HTEUpLCk7CisJemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycyh6ZnRfZGVibG9ja19idWYpOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3cml0aW5nIHZvbHVtZSB0YWJsZSBzZWdtZW50ICVkIiwgc2VnbWVudCk7CisJaWYgKHpmdF92bWFsbG9jX29uY2UoJnZlcmlmeV9idWYsIEZUX1NFR01FTlRfU0laRSkgPT0gMCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKHNlZ21lbnQsIAorCQkJCQkJICAgICAgemZ0X2RlYmxvY2tfYnVmLCByZXN1bHQsCisJCQkJCQkgICAgICB2ZXJpZnlfYnVmKSwKKwkJCSAgICB6ZnRfdmZyZWUoJnZlcmlmeV9idWYsIEZUX1NFR01FTlRfU0laRSkpOworCQl6ZnRfdmZyZWUoJnZlcmlmeV9idWYsIEZUX1NFR01FTlRfU0laRSk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfd3JpdGVfc2VnbWVudChzZWdtZW50LCB6ZnRfZGVibG9ja19idWYsIAorCQkJCQkJRlRfV1JfU0lOR0xFKSwpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIG5vbiB6ZnRhcGUgdm9sdW1lcyBhcmUgaGFuZGxlZCBpbiByYXcgbW9kZS4gVGh1cyB3ZSBuZWVkIHRvCisgKiBjYWxjdWxhdGUgdGhlIHJhdyBhbW91bnQgb2YgZGF0YSBjb250YWluZWQgaW4gdGhvc2Ugc2VnbWVudHMuICAKKyAqLworc3RhdGljIHZvaWQgZXh0cmFjdF9hbGllbl92b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2dGJsKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJdnRibC0+c2l6ZSAgPSAoemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+ZW5kX3NlZysxKSAtCisJCSAgICAgICB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpKTsKKwl2dGJsLT51c2VfY29tcHJlc3Npb24gPSAwOworCXZ0YmwtPnFpYzExMyA9IHpmdF9xaWMxMTM7CisJaWYgKHZ0YmwtPnFpYzExMykgeworCQlUUkFDRShmdF90X25vaXNlLCAKKwkJICAgICAgIkZha2UgYWxpZW4gdm9sdW1lJ3Mgc2l6ZSBmcm9tICIgTExfWCAiIHRvICIgTExfWCwgCisJCSAgICAgIExMKEdFVDgoZW50cnksIFZUQkxfREFUQV9TSVpFKSksIExMKHZ0YmwtPnNpemUpKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAiRmFrZSBhbGllbiB2b2x1bWUncyBzaXplIGZyb20gJWQgdG8gIiBMTF9YLCAKKwkJICAgICAgKGludClHRVQ0KGVudHJ5LCBWVEJMX0RBVEFfU0laRSksIExMKHZ0YmwtPnNpemUpKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworCisvKiBleHRyYWN0IGFuIHpmdGFwZSBzcGVjaWZpYyB2b2x1bWUKKyAqLworc3RhdGljIHZvaWQgZXh0cmFjdF96ZnRfdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdnRibCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICh2dGJsLT5xaWMxMTMpIHsKKwkJdnRibC0+c2l6ZSA9IEdFVDgoZW50cnksIFZUQkxfREFUQV9TSVpFKTsKKwkJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gCisJCQkoZW50cnlbVlRCTF9DTVBSXSAmIFZUQkxfQ01QUl9VU0VEKSAhPSAwOyAKKwl9IGVsc2UgeworCQl2dGJsLT5zaXplID0gR0VUNChlbnRyeSwgVlRCTF9EQVRBX1NJWkUpOworCQlpZiAoZW50cnlbVlRCTF9LX0NNUFJdICYgVlRCTF9DTVBSX1VOUkVHKSB7CisJCQl2dGJsLT51c2VfY29tcHJlc3Npb24gPSAKKwkJCQkoZW50cnlbVlRCTF9LX0NNUFJdICYgVlRCTF9DTVBSX1VTRUQpICE9IDA7CisJCX0gZWxzZSBpZiAoZW50cnlbVlRCTF9DTVBSXSAmIFZUQkxfQ01QUl9VTlJFRykgeworCQkJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gCisJCQkJKGVudHJ5W1ZUQkxfQ01QUl0gJiBWVEJMX0NNUFJfVVNFRCkgIT0gMDsgCisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJHZWVoISBUaGVyZSBpcyBzb21ldGhpbmcgd3Jvbmc6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIlFJQyBjb21wcmVzc2lvbiAoUmV2ID0gSyk6ICV4XG4iCisJCQkgICAgICBLRVJOX0lORk8gIlFJQyBjb21wcmVzc2lvbiAoUmV2ID4gSyk6ICV4IiwKKwkJCSAgICAgIGVudHJ5W1ZUQkxfS19DTVBSXSwgZW50cnlbVlRCTF9DTVBSXSk7CisJCX0KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyogZXh0cmFjdCB0aGUgdm9sdW1lIHRhYmxlIGZyb20gYnVmZmVyLiAiYnVmZmVyIiBtdXN0IGFscmVhZHkgY29udGFpbgorICogdGhlIHZ0Ymwtc2VnbWVudCAKKyAqLworaW50IHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcikKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIF9fdTggKmVudHJ5OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXpmdF9pbml0X3Z0YmwoKTsKKwllbnRyeSA9IGJ1ZmZlcjsKKyNpZmRlZiBaRlRfQ01BUF9IQUNLCisJaWYgKChzdHJuY21wKCZlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1NJR10sIFpGVEFQRV9TSUcsCisJCSAgICAgc3RybGVuKFpGVEFQRV9TSUcpKSA9PSAwKSAmJgorCSAgICBlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX0NNQVBdICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlnbm9yaW5nIGNtYXAgdm9sdW1lIik7CisJCWVudHJ5ICs9IFZUQkxfU0laRTsKKwl9IAorI2VuZGlmCisJLyogdGhlIGVuZCBvZiB0aGUgdnRibCBpcyBpbmRpY2F0ZWQgYnkgYW4gaW52YWxpZCBzaWduYXR1cmUgCisJICovCisJd2hpbGUgKHZ0Ymxfc2lnbmF0dXJlX3ZhbGlkKCZlbnRyeVtWVEJMX1NJR10pICYmCisJICAgICAgIChlbnRyeSAtIGJ1ZmZlcikgPCBGVF9TRUdNRU5UX1NJWkUpIHsKKwkJemZ0X25ld192dGJsX2VudHJ5KCk7CisJCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7CisJCQkvKiBTQ1NJIGxpa2UgdnRibCwgc3RvcmVzIG9ubHkgdGhlIG51bWJlciBvZgorCQkJICogc2VnbWVudHMgdXNlZCAKKwkJCSAqLworCQkJdW5zaWduZWQgaW50IG51bV9zZWdtZW50cz0gR0VUNChlbnRyeSwgVlRCTF9TQ1NJX1NFR1MpOworCQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7CisJCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnID0gCisJCQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnICsgbnVtX3NlZ21lbnRzIC0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIGBub3JtYWwnLCBRSUMtODAgbGlrZSB2dGJsIAorCQkJICovCisJCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSBHRVQyKGVudHJ5LCBWVEJMX1NUQVJUKTsKKwkJCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IEdFVDIoZW50cnksIFZUQkxfRU5EKTsKKwkJfQorCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICsgMTsKKwkJLyogY2hlY2sgaWYgd2UgY3JlYXRlZCB0aGlzIHZvbHVtZSBhbmQgZ2V0IHRoZQorCQkgKiBibGtfc3ogCisJCSAqLworCQl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lID0gY2hlY2tfdm9sdW1lKGVudHJ5LCB6ZnRfbGFzdF92dGJsKTsKKwkJaWYgKHpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgPT0gMCkgeworCQkJZXh0cmFjdF9hbGllbl92b2x1bWUoZW50cnksIHpmdF9sYXN0X3Z0YmwpOworCQl9IGVsc2UgeworCQkJZXh0cmFjdF96ZnRfdm9sdW1lKGVudHJ5LCB6ZnRfbGFzdF92dGJsKTsKKwkJfQorCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgJmVudHJ5W1ZUQkxfREVTQ10sIHpmdF9sYXN0X3Z0YmwpOworCQllbnRyeSArPVZUQkxfU0laRTsKKwl9CisjaWYgMAorLyoKKyAqICB1bmRlZmluZSB0byB0ZXN0IGVuZCBvZiB0YXBlIGhhbmRsaW5nCisgKi8KKwl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKKwl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCAtIDEwOworCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICAgICAgICA9IHpmdF9ibGtfc3o7CisJemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSAgICAgID0gMTsKKwl6ZnRfbGFzdF92dGJsLT5xaWMxMTMgICAgICAgICAgPSB6ZnRfcWljMTEzOworCXpmdF9sYXN0X3Z0YmwtPnNpemUgPSAoemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+ZW5kX3NlZysxKQorCQkJICAgICAgIC0gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKSk7CisjZW5kaWYKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb25zIHRyYW5zbGF0ZXMgdGhlIGZhaWxlZF9zZWN0b3JfbG9nLCBtaXN1c2VkIGFzCisgKiBFT0YtbWFya2VyIGxpc3QsIGludG8gYSB2aXJ0dWFsIHZvbHVtZSB0YWJsZS4gVGhlIHRhYmxlIG11c3RuJ3QgYmUKKyAqIHdyaXR0ZW4gdG8gdGFwZSwgYmVjYXVzZSB0aGlzIHdvdWxkIG9jY3VweSB0aGUgZmlyc3QgZGF0YSBzZWdtZW50LAorICogd2hpY2ggc2hvdWxkIGJlIHRoZSB2b2x1bWUgdGFibGUsIGJ1dCBpcyBhY3R1YWxseSB0aGUgZmlyc3Qgc2VnbWVudAorICogdGhhdCBpcyBmaWxsZWQgd2l0aCBkYXRhICh3aGVuIHVzaW5nIHN0YW5kYXJkIGZ0YXBlKS4gIFdlIGFzc3VtZSwKKyAqIHRoYXQgd2UgZ2V0IGEgbm9uLWVtcHR5IGZhaWxlZF9zZWN0b3JfbG9nLgorICovCitpbnQgemZ0X2Zha2Vfdm9sdW1lX2hlYWRlcnMgKGVvZl9tYXJrX3VuaW9uICplb2ZfbWFwLCBpbnQgbnVtX2ZhaWxlZF9zZWN0b3JzKQoreworCXVuc2lnbmVkIGludCBzZWdtZW50LCBzZWN0b3I7CisJaW50IGhhdmVfZW9tID0gMDsKKwlpbnQgdm9sX25vOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKChudW1fZmFpbGVkX3NlY3RvcnMgPj0gMikgJiYKKwkgICAgKEdFVDIoJmVvZl9tYXBbbnVtX2ZhaWxlZF9zZWN0b3JzIC0gMV0ubWFyay5zZWdtZW50LCAwKSAKKwkgICAgID09IAorCSAgICAgR0VUMigmZW9mX21hcFtudW1fZmFpbGVkX3NlY3RvcnMgLSAyXS5tYXJrLnNlZ21lbnQsIDApICsgMSkgJiYKKwkgICAgKEdFVDIoJmVvZl9tYXBbbnVtX2ZhaWxlZF9zZWN0b3JzIC0gMV0ubWFyay5kYXRlLCAwKSA9PSAxKSkgeworCQkvKiB0aGlzIHNob3VsZCBiZSBlb20uIFdlIGtlZXAgdGhlIHJlbWFpbmRlciBvZiB0aGUKKwkJICogdGFwZSBhcyBhbm90aGVyIHZvbHVtZS4KKwkJICovCisJCWhhdmVfZW9tID0gMTsKKwl9CisJemZ0X2luaXRfdnRibCgpOworCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCWZvcih2b2xfbm8gPSAwOyB2b2xfbm8gPCBudW1fZmFpbGVkX3NlY3RvcnMgLSBoYXZlX2VvbTsgdm9sX25vICsrKSB7CisJCXpmdF9uZXdfdnRibF9lbnRyeSgpOworCisJCXNlZ21lbnQgPSBHRVQyKCZlb2ZfbWFwW3ZvbF9ub10ubWFyay5zZWdtZW50LCAwKTsKKwkJc2VjdG9yICA9IEdFVDIoJmVvZl9tYXBbdm9sX25vXS5tYXJrLmRhdGUsIDApOworCisJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyAgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgICA9IHNlZ21lbnQ7CisJCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IHNlZ21lbnQgKyAxOworCQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgID0gMTsKKwkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgICA9IAorCQkJKHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcpCisJCQkgLSB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpCisJCQkgKyAoc2VjdG9yLTEpICogRlRfU0VDVE9SX1NJWkUpOworCQlUUkFDRShmdF90X25vaXNlLCAKKwkJICAgICAgImZhaWxlZCBzZWN0b3IgbG9nOiBzZWdtZW50OiAlZCwgc2VjdG9yOiAlZCIsIAorCQkgICAgICBzZWdtZW50LCBzZWN0b3IpOworCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIkZha2VkIHZvbHVtZSIsIHpmdF9sYXN0X3Z0YmwpOworCX0KKwlpZiAoIWhhdmVfZW9tKSB7CisJCXpmdF9uZXdfdnRibF9lbnRyeSgpOworCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7CisJCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgID0gemZ0X2NhcGFjaXR5OworCQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAtPSB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpOworCQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgPSAxOworCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIkZha2VkIHZvbHVtZSIsemZ0X2xhc3RfdnRibCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogdXBkYXRlIHRoZSBpbnRlcm5hbCB2b2x1bWUgdGFibGUKKyAqCisgKiBpZiBiZWZvcmUgc3RhcnQgb2YgbGFzdCB2b2x1bWU6IGVyYXNlIGFsbCBmb2xsb3dpbmcgdm9sdW1lcyBpZgorICogaW5zaWRlIGEgdm9sdW1lOiBzZXQgZW5kIG9mIHZvbHVtZSB0byBpbmZpbml0eQorICoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgX2Z0YXBlX3dyaXRlKCkgaXMKKyAqIGNhbGxlZAorICoKKyAqIHJldHVybjogMCBpZiBubyBuZXcgdm9sdW1lIHdhcyBjcmVhdGVkLCAxIGlmIGEgbmV3IHZvbHVtZSB3YXMKKyAqIGNyZWF0ZWQKKyAqCisgKiBOT1RFOiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB6ZnRfbW9kZSBhcyBmdGFwZV93cml0ZSgpIGRvZXMKKyAqIHRoYXQgYWxyZWFkeS4gVGhpcyBmdW5jdGlvbiBnZXRzIG5ldmVyIGNhbGxlZCB3aXRob3V0IGFjY2Vzc2luZworICogemZ0YXBlIHZpYSB0aGUgKnFmdCogZGV2aWNlcyAKKyAqLworCitpbnQgemZ0X29wZW5fdm9sdW1lKHpmdF9wb3NpdGlvbiAqcG9zLCBpbnQgYmxrX3N6LCBpbnQgdXNlX2NvbXByZXNzaW9uKQoreyAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoIXpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmICh6ZnRfdGFwZV9hdF9sYm90KHBvcykpIHsKKwkJemZ0X2luaXRfdnRibCgpOworCQlpZih6ZnRfb2xkX2Z0YXBlKSB7CisJCQkvKiBjbGVhciBvbGQgZnRhcGUncyBlb2YgbWFya3MgKi8KKwkJCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7CisJCQl6ZnRfb2xkX2Z0YXBlID0gMDsgLyogbm8gbG9uZ2VyIG9sZCBmdGFwZSAqLworCQl9CisJCXpmdF9yZXNldF9wb3NpdGlvbihwb3MpOworCX0KKwlpZiAocG9zLT5zZWdfcG9zICE9IHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgKyAxKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLCAKKwkJICAgICAgIkJVRzogc2VnX3BvczogJWQsIHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWc6ICVkIiwgCisJCSAgICAgIHBvcy0+c2VnX3BvcywgemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyk7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlUUkFDRShmdF90X25vaXNlLCAiY3JlYXRlIG5ldyB2b2x1bWUiKTsKKwlpZiAoemZ0X2VvbV92dGJsLT5jb3VudCA+PSBaRlRfTUFYX1ZPTFVNRVMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVOT1NQQywgZnRfdF9lcnIsCisJCQkgICAgIkVycm9yOiBtYXhtaW1hbCBudW1iZXIgb2Ygdm9sdW1lcyBleGhhdXN0ZWQgIgorCQkJICAgICIobWF4bWltdW0gaXMgJWQpIiwgWkZUX01BWF9WT0xVTUVTKTsKKwl9CisJemZ0X25ld192dGJsX2VudHJ5KCk7CisJcG9zLT52b2x1bWVfcG9zID0gcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOworCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyAgICAgICA9IHBvcy0+c2VnX3BvczsKKwl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgICAgICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudDsgLyogaW5maW5pdHkgKi8KKwl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgICAgICAgPSBibGtfc3o7CisJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgICAgICAgID0gemZ0X2NhcGFjaXR5OworCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgICAgICA9IDE7CisJemZ0X2xhc3RfdnRibC0+dXNlX2NvbXByZXNzaW9uID0gdXNlX2NvbXByZXNzaW9uOworCXpmdF9sYXN0X3Z0YmwtPnFpYzExMyAgICAgICAgICA9IHpmdF9xaWMxMTM7CisJemZ0X2xhc3RfdnRibC0+bmV3X3ZvbHVtZSAgICAgID0gMTsKKwl6ZnRfbGFzdF92dGJsLT5vcGVuICAgICAgICAgICAgPSAxOworCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9IDE7CisJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogIHBlcmZvcm0gbXRmc2YsIG10YnNmLCBub3QgYWxsb3dlZCB3aXRob3V0IHpmdF9xaWNfbW9kZQorICovCitpbnQgemZ0X3NraXBfdm9sdW1lcyhpbnQgY291bnQsIHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwljb25zdCB6ZnRfdm9saW5mbyAqdnRibDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiY291bnQ6ICVkIiwgY291bnQpOworCQorCXZ0Ymw9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCXdoaWxlIChjb3VudCA+IDAgJiYgdnRibCAhPSB6ZnRfZW9tX3Z0YmwpIHsKKwkJdnRibCA9IGxpc3RfZW50cnkodnRibC0+bm9kZS5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCWNvdW50IC0tOworCX0KKwl3aGlsZSAoY291bnQgPCAwICYmIHZ0YmwgIT0gemZ0X2ZpcnN0X3Z0YmwpIHsKKwkJdnRibCA9IGxpc3RfZW50cnkodnRibC0+bm9kZS5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCWNvdW50ICsrOworCX0KKwlwb3MtPnNlZ19wb3MgICAgICAgID0gdnRibC0+c3RhcnRfc2VnOworCXBvcy0+c2VnX2J5dGVfcG9zICAgPSAwOworCXBvcy0+dm9sdW1lX3BvcyAgICAgPSAwOworCXBvcy0+dGFwZV9wb3MgICAgICAgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOworCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSB2dGJsLT5zaXplID09IDA7CisJaWYgKHpmdF9jbXByX29wcykgeworCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7CisJfQorCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsgLyogbm8gbmVlZCB0byBrZWVwIGNhY2hlICovCisJVFJBQ0UoZnRfdF9ub2lzZSwgInJlcG9zaXRpb25pbmcgdG86XG4iCisJICAgICAgS0VSTl9JTkZPICJ6ZnRfc2VnX3BvcyAgICAgICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAiemZ0X3NlZ19ieXRlX3BvcyAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInpmdF90YXBlX3BvcyAgICAgICA6ICIgTExfWCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJ6ZnRfdm9sdW1lX3BvcyAgICAgOiAiIExMX1ggIlxuIgorCSAgICAgIEtFUk5fSU5GTyAiZmlsZSBudW1iZXIgICAgICAgIDogJWQiLAorCSAgICAgIHBvcy0+c2VnX3BvcywgcG9zLT5zZWdfYnl0ZV9wb3MsIAorCSAgICAgIExMKHBvcy0+dGFwZV9wb3MpLCBMTChwb3MtPnZvbHVtZV9wb3MpLCB2dGJsLT5jb3VudCk7CisJemZ0X3Jlc2lkID0gY291bnQgPCAwID8gLWNvdW50IDogY291bnQ7CisJVFJBQ0VfRVhJVCB6ZnRfcmVzaWQgPyAtRUlOVkFMIDogMDsKK30KKworLyogdGhlIGZvbGxvd2luZyBzaW1wbHkgcmV0dXJucyB0aGUgcmF3IGRhdGEgcG9zaXRpb24gb2YgdGhlIEVPTQorICogbWFya2VyLCBNVElPQ1NJWkUgaW9jdGwgCisgKi8KK19fczY0IHpmdF9nZXRfZW9tX3Bvcyh2b2lkKQoreworCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJcmV0dXJuIHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9lb21fdnRibC0+c3RhcnRfc2VnKTsKKwl9IGVsc2UgeworCQkvKiB0aGVyZSBpcyBvbmx5IG9uZSB2b2x1bWUgaW4gcmF3IG1vZGUgKi8KKwkJcmV0dXJuIHpmdF9jYXBhY2l0eTsKKwl9Cit9CisKKy8qIHNraXAgdG8gZW9tLCB1c2VkIGZvciBNVEVPTQorICovCit2b2lkIHpmdF9za2lwX3RvX2VvbSh6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwlwb3MtPnNlZ19wb3MgICAgICA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOworCXBvcy0+c2VnX2J5dGVfcG9zID0gCisJCXBvcy0+dm9sdW1lX3BvcyAgICAgPSAKKwkJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJcG9zLT50YXBlX3BvcyA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZ0YXBlIHBvc2l0aW9uZWQgdG8gc2VnbWVudCAlZCwgZGF0YSBwb3MgIiBMTF9YLCAKKwkgICAgICBwb3MtPnNlZ19wb3MsIExMKHBvcy0+dGFwZV9wb3MpKTsKKwlUUkFDRV9FWElUOworfQorCisvKiAgd3JpdGUgYW4gRU9GLW1hcmtlciBieSBzZXR0aW5nIHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgdG8gc2VnX3Bvcy4KKyAqICBOT1RFOiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB6ZnRfbGFzdF92dGJsIHBvaW50cyB0byBhIHZhbGlkCisgKiAgdnRibCBlbnRyeQorICoKKyAqICBOT1RFOiB0aGlzIHJvdXRpbmUgYWx3YXlzIHBvc2l0aW9ucyBiZWZvcmUgdGhlIEVPRiBtYXJrZXIKKyAqLworaW50IHpmdF9jbG9zZV92b2x1bWUoemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmICh6ZnRfdnRibF9lbXB0eSB8fCAhemZ0X2xhc3RfdnRibC0+b3BlbikgeyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQlUUkFDRShmdF90X25vaXNlLCAiVGhlcmUgYXJlIG5vIHZvbHVtZXMgdG8gZmluaXNoIik7CisJCVRSQUNFX0VYSVQgLUVJTzsKKwl9CisJaWYgKHBvcy0+c2VnX2J5dGVfcG9zID09IDAgJiYgCisJICAgIHBvcy0+c2VnX3BvcyAhPSB6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpIHsKKwkJcG9zLT5zZWdfcG9zIC0tOworCQlwb3MtPnNlZ19ieXRlX3BvcyAgICAgID0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKTsKKwl9CisJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gcG9zLT5zZWdfcG9zOworCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICA9IHBvcy0+dm9sdW1lX3BvczsKKwl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOworCXpmdF9qdXN0X2JlZm9yZV9lb2YgICAgICA9IDE7CisJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyArIDE7CisJemZ0X2xhc3RfdnRibC0+b3BlbiAgICAgID0gMDsgLyogY2xvc2VkICovCisJVFJBQ0VfRVhJVCAwOworfQorCisvKiB3cml0ZSBjb3VudCBmaWxlLW1hcmtzIGF0IGN1cnJlbnQgcG9zaXRpb24uIAorICoKKyAqICBUaGUgdGFwZSBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBlb2YtbWFya2VyLCB0aGF0IGlzIGF0IGJ5dGUgMCBvZgorICogIHRoZSBzZWdtZW50IGZvbGxvd2luZyB0aGUgZW9mLW1hcmtlcgorICoKKyAqICB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgYWxsb3dlZCBpbiB6ZnRfcWljX21vZGUKKyAqCisgKiAgT25seSBhbGxvd2VkIHdoZW4gdGFwZSBpcyBhdCBCT1Qgb3IgRU9ELgorICovCitpbnQgemZ0X3dlb2YodW5zaWduZWQgaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwkKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghY291bnQpIHsgLyogd3JpdGUgemVybyBFT0YgbWFya3Mgc2hvdWxkIGJlIGEgcmVhbCBuby1vcCAqLworCQlUUkFDRV9FWElUIDA7CisJfQorCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9IDE7CisJaWYgKHpmdF90YXBlX2F0X2xib3QocG9zKSkgeworCQl6ZnRfaW5pdF92dGJsKCk7CisJCWlmKHpmdF9vbGRfZnRhcGUpIHsKKwkJCS8qIGNsZWFyIG9sZCBmdGFwZSdzIGVvZiBtYXJrcyAqLworCQkJemZ0X2NsZWFyX2Z0YXBlX2ZpbGVfbWFya3MoKTsKKwkJCXpmdF9vbGRfZnRhcGUgPSAwOyAgICAvKiBubyBsb25nZXIgb2xkIGZ0YXBlICovCisJCX0KKwl9CisJaWYgKHpmdF9sYXN0X3Z0YmwtPm9wZW4pIHsKKwkJemZ0X2Nsb3NlX3ZvbHVtZShwb3MpOworCQl6ZnRfbW92ZV9wYXN0X2VvZihwb3MpOworCQljb3VudCAtLTsKKwl9CisJLyogbm93IGl0J3MgZWFzeSwganVzdCBhcHBlbmQgZW9mLW1hcmtzLCB0aGF0IGlzIGVtcHR5CisJICogdm9sdW1lcywgdG8gdGhlIGVuZCBvZiB0aGUgYWxyZWFkeSByZWNvcmRlZCBtZWRpYS4KKwkgKi8KKwl3aGlsZSAoY291bnQgPiAwICYmIAorCSAgICAgICBwb3MtPnNlZ19wb3MgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgJiYgCisJICAgICAgIHpmdF9lb21fdnRibC0+Y291bnQgPCBaRlRfTUFYX1ZPTFVNRVMpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIldyaXRpbmcgemVybyBzaXplZCBmaWxlIGF0IHNlZ21lbnQgJWQiLCBwb3MtPnNlZ19wb3MpOworCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKKwkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnICAgICAgID0gcG9zLT5zZWdfcG9zOworCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgICAgICAgPSBwb3MtPnNlZ19wb3M7CisJCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICAgICAgICA9IDA7CisJCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICAgICAgICA9IHpmdF9ibGtfc3o7CisJCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgICAgICA9IDE7CisJCXpmdF9sYXN0X3Z0YmwtPnVzZV9jb21wcmVzc2lvbiA9IDA7CisJCXBvcy0+dGFwZV9wb3MgKz0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKTsKKwkJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgPSArKyBwb3MtPnNlZ19wb3M7CisJCWNvdW50IC0tOworCX0gCisJaWYgKGNvdW50ID4gMCkgeworCQkvKiAgdGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzOiBlbmQgb2YgdGFwZSwgb3IgdGhlCisJCSAqICBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyBpcyBleGhhdXN0ZWQuCisJCSAqLworCQl6ZnRfcmVzaWQgPSBjb3VudDsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwiTnVtYmVyIG9mIG1hcmtzIE5PVCB3cml0dGVuOiAlZCIsIHpmdF9yZXNpZCk7CisJCWlmICh6ZnRfZW9tX3Z0YmwtPmNvdW50ID09IFpGVF9NQVhfVk9MVU1FUykgeworCQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF93YXJuLAorCQkJCSAgICAibWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBmaWxlcyAiCisJCQkJICAgICJleGhhdXN0ZWQ6ICVkIiwgWkZUX01BWF9WT0xVTUVTKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0FCT1JUKC1FTk9TUEMsCisJCQkJICAgIGZ0X3Rfbm9pc2UsICJyZWFjaGVkIGVuZCBvZiB0YXBlIik7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitjb25zdCB6ZnRfdm9saW5mbyAqemZ0X2ZpbmRfdm9sdW1lKHVuc2lnbmVkIGludCBzZWdfcG9zKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFKGZ0X3RfYW55LCAiY2FsbGVkIHdpdGggc2VnX3BvcyAlZCIsc2VnX3Bvcyk7CisJaWYgKCF6ZnRfcWljX21vZGUpIHsKKwkJaWYgKHNlZ19wb3MgPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgeworCQkJVFJBQ0VfRVhJVCAmZW90X3Z0Ymw7CisJCX0KKwkJdGFwZV92dGJsLmJsa19zeiA9ICB6ZnRfYmxrX3N6OworCQlUUkFDRV9FWElUICZ0YXBlX3Z0Ymw7CisJfQorCWlmIChzZWdfcG9zIDwgemZ0X2ZpcnN0X3Z0YmwtPnN0YXJ0X3NlZykgeworCQlUUkFDRV9FWElUIChjdXJfdnRibCA9IHpmdF9maXJzdF92dGJsKTsKKwl9CisJd2hpbGUgKHNlZ19wb3MgPiBjdXJfdnRibC0+ZW5kX3NlZykgeworCQljdXJfdnRibCA9IGxpc3RfZW50cnkoY3VyX3Z0YmwtPm5vZGUubmV4dCwgemZ0X3ZvbGluZm8sIG5vZGUpOworCQlUUkFDRShmdF90X25vaXNlLCAiJWQgLSAlZCIsIGN1cl92dGJsLT5zdGFydF9zZWcsIGN1cl92dGJsLT5lbmRfc2VnKTsKKwl9CisJd2hpbGUgKHNlZ19wb3MgPCBjdXJfdnRibC0+c3RhcnRfc2VnKSB7CisJCWN1cl92dGJsID0gbGlzdF9lbnRyeShjdXJfdnRibC0+bm9kZS5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIlZCAtICVkIiwgY3VyX3Z0YmwtPnN0YXJ0X3NlZywgY3VyX3Z0YmwtPmVuZF9zZWcpOworCX0KKwlpZiAoc2VnX3BvcyA+IGN1cl92dGJsLT5lbmRfc2VnIHx8IHNlZ19wb3MgPCBjdXJfdnRibC0+c3RhcnRfc2VnKSB7CisJCVRSQUNFKGZ0X3RfYnVnLCAiVGhpcyBjYW5ub3QgaGFwcGVuIik7CisJfQorCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiIiwgY3VyX3Z0YmwpOworCVRSQUNFX0VYSVQgY3VyX3Z0Ymw7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gcmVhbGx5IGFzc3VtZXMgdGhhdCB3ZSBhcmUganVzdCBiZWZvcmUgZW9mCisgKi8KK3ZvaWQgemZ0X21vdmVfcGFzdF9lb2YoemZ0X3Bvc2l0aW9uICpwb3MpCit7IAorCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIm9sZCBzZWcuIHBvczogJWQiLCBwb3MtPnNlZ19wb3MpOworCXBvcy0+dGFwZV9wb3MgKz0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKyspIC0gcG9zLT5zZWdfYnl0ZV9wb3M7CisJcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOworCXBvcy0+dm9sdW1lX3BvcyAgID0gMDsKKwlpZiAoemZ0X2NtcHJfb3BzKSB7CisJCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9ICAwOworCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsgLyogbm8gbmVlZCB0byBjYWNoZSBpdCBhbnltb3JlICovCisJVFJBQ0UoZnRfdF9ub2lzZSwgIm5ldyBzZWcuIHBvczogJWQiLCBwb3MtPnNlZ19wb3MpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxZDE5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaApAQCAtMCwwICsxLDIyNyBAQAorI2lmbmRlZiBfWkZUQVBFX1ZUQkxfSAorI2RlZmluZSBfWkZUQVBFX1ZUQkxfSAorCisvKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyAgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzI4IDE0OjMwOjA5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgdm9sdW1lIHRhYmxlIGFzIGRlZmluZWQgaW4gdGhlIFFJQy04MAorICogICAgICBkZXZlbG9wbWVudCBzdGFuZGFyZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisKKyNkZWZpbmUgVlRCTF9TSVpFIDEyOCAvKiBieXRlcyAqLworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBvZmZzZXRzIGluIHRoZSB2dGJsLiAgKi8KKyNkZWZpbmUgVlRCTF9TSUcgICAwCisjZGVmaW5lIFZUQkxfU1RBUlQgNAorI2RlZmluZSBWVEJMX0VORCAgIDYKKyNkZWZpbmUgVlRCTF9ERVNDICA4CisjZGVmaW5lIFZUQkxfREFURSAgNTIKKyNkZWZpbmUgVlRCTF9GTEFHUyA1NgorI2RlZmluZSBWVEJMX0ZMX1ZFTkRPUl9TUEVDSUZJQyAoMTw8MCkKKyNkZWZpbmUgVlRCTF9GTF9NVVRMSV9DQVJUUklER0UgKDE8PDEpCisjZGVmaW5lIFZUQkxfRkxfTk9UX1ZFUklGSUVEICAgICgxPDwyKQorI2RlZmluZSBWVEJMX0ZMX1JFRElSX0lOSElCSVQgICAoMTw8MykKKyNkZWZpbmUgVlRCTF9GTF9TRUdfU1BBTk5JTkcgICAgKDE8PDQpCisjZGVmaW5lIFZUQkxfRkxfRElSRUNUT1JZX0xBU1QgICgxPDw1KQorI2RlZmluZSBWVEJMX0ZMX1JFU0VSVkVEXzYgICAgICAoMTw8NikKKyNkZWZpbmUgVlRCTF9GTF9SRVNFUlZFRF83ICAgICAgKDE8PDcpCisjZGVmaW5lIFZUQkxfTV9OTyAgNTcKKyNkZWZpbmUgVlRCTF9FWFQgICA1OAorI2RlZmluZSBFWFRfWkZUQVBFX1NJRyAgICAgMAorI2RlZmluZSBFWFRfWkZUQVBFX0JMS1NaICAxMAorI2RlZmluZSBFWFRfWkZUQVBFX0NNQVAgICAxMgorI2RlZmluZSBFWFRfWkZUQVBFX1FJQzExMyAxMworI2RlZmluZSBWVEJMX1BXRCAgIDg0CisjZGVmaW5lIFZUQkxfRElSX1NJWkUgOTIKKyNkZWZpbmUgVlRCTF9EQVRBX1NJWkUgOTYKKyNkZWZpbmUgVlRCTF9PU19WRVJTSU9OIDEwNAorI2RlZmluZSBWVEJMX1NSQ19EUklWRSAgMTA2CisjZGVmaW5lIFZUQkxfREVWICAgICAgICAxMjIKKyNkZWZpbmUgVlRCTF9SRVNFUlZFRF8xIDEyMworI2RlZmluZSBWVEJMX0NNUFIgICAgICAgMTI0CisjZGVmaW5lIFZUQkxfQ01QUl9VTlJFRyAweDNmCisjZGVmaW5lIFZUQkxfQ01QUl9VU0VEICAweDgwCisjZGVmaW5lIFZUQkxfRk1UICAgICAgICAxMjUKKyNkZWZpbmUgVlRCTF9SRVNFUlZFRF8yIDEyNgorI2RlZmluZSBWVEJMX1JFU0VSVkVEXzMgMTI3CisvKiBjb21wYXRpYmlsaXR5IHdpdGggcHJlIHJldmlzaW9uIEsgKi8KKyNkZWZpbmUgVlRCTF9LX0NNUFIgICAgIDEyMCAKKworLyogIHRoZSBuZXh0IGlzIHVzZWQgYnkgUUlDLTMwMjAgdGFwZXMgd2l0aCBmb3JtYXQgY29kZSA2ICg+Ml4xNgorICogIHNlZ21lbnRzKSBJdCBpcyBzcGVjaWZpZWQgaW4gUUlDLTExMywgUmV2LiBHLCBTZWN0aW9uIDUgKFNDU0kKKyAqICB2b2x1bWUgdGFibGUpLiBUaGUgZGlmZmVyZW5jZSBpcyBzaW1wbHksIHRoYXQgd2Ugb25seSBzdG9yZSB0aGUKKyAqICBudW1iZXIgb2Ygc2VnbWVudHMgdXNlZCwgbm90IHRoZSBzdGFydGluZyBzZWdtZW50LgorICovCisjZGVmaW5lIFZUQkxfU0NTSV9TRUdTICA0IC8qIGlzIGEgNCBieXRlIHZhbHVlICovCisKKy8qICBvbmUgdnRibCBpcyAxMjggYnl0ZXMsIHRoYXQgcmVzdWx0cyBpbiBhIG1heGltdW0gbnVtYmVyIG9mCisgKiAgMjkqMTAyNC8xMjggPSAyMzIgdm9sdW1lcy4KKyAqLworI2RlZmluZSBaRlRfTUFYX1ZPTFVNRVMgKEZUX1NFR01FTlRfU0laRS9WVEJMX1NJWkUpCisjZGVmaW5lIFZUQkxfSUQgICJWVEJMIgorI2RlZmluZSBWVEJMX0lEUyB7IFZUQkxfSUQsICJYVEJMIiwgIlVUSUQiLCAiRVhWVCIgfSAvKiBvdGhlciB2YWxpZCBpZHMgKi8KKyNkZWZpbmUgWkZUX1ZPTF9OQU1FICJ6ZnRhcGUgdm9sdW1lIiAvKiB2b2x1bWUgbGFiZWwgdXNlZCBieSBtZSAqLworI2RlZmluZSBaRlRBUEVfU0lHICJMSU5VWCBaRlQiCisKKy8qICBnbG9iYWwgdmFyaWFibGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHpmdF9pbnRlcm5hbF92dGJsCit7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWludCAgICAgICAgICBjb3VudDsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfc2VnOyAgICAgICAgIC8qIDMyIGJpdHMgYXJlIGVub3VnaCBmb3Igbm93ICovCisJdW5zaWduZWQgaW50IGVuZF9zZWc7ICAgICAgICAgICAvKiAzMiBiaXRzIGFyZSBlbm91Z2ggZm9yIG5vdyAqLworCV9fczY0ICAgICAgICBzaXplOyAgICAgICAgICAgICAgLyogdW5jb21wcmVzc2VkIHNpemUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGJsa19zejsgICAgICAgICAgICAvKiBibG9jayBzaXplIGZvciB0aGlzIHZvbHVtZSAqLworCXVuc2lnbmVkIGludCB6ZnRfdm9sdW1lICAgICA6MTsgLyogemZ0YXBlIGNyZWF0ZWQgdGhpcyB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX2NvbXByZXNzaW9uOjE7IC8qIGNvbXByZXNzZWQgdm9sdW1lICAqLworCXVuc2lnbmVkIGludCBxaWMxMTMgICAgICAgICA6MTsgLyogbGF5b3V0IG9mIGNvbXByZXNzZWQgYmxvY2sKKwkJCQkJICogaW5mbyBhbmQgdnRibCBjb25mb3JtcyB0bworCQkJCQkgKiBRSUMtMTEzLCBSZXYuIEcgCisJCQkJCSAqLworCXVuc2lnbmVkIGludCBuZXdfdm9sdW1lICAgICA6MTsgLyogaXQgd2FzIGNyZWF0ZWQgYnkgdXMsIHRoaXMKKwkJCQkJICogcnVuLiAgdGhpcyBhbGxvd3MgdGhlCisJCQkJCSAqIGZpZWxkcyB0aGF0IGFyZW4ndCByZWFsbHkKKwkJCQkJICogdXNlZCBieSB6ZnRhcGUgdG8gYmUgZmlsbGVkCisJCQkJCSAqIGluIGJ5IHNvbWUgdXNlciBsZXZlbAorCQkJCQkgKiBwcm9ncmFtLgorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgb3BlbiAgICAgICAgICAgOjE7IC8qIGp1c3QgaW4gcHJvZ3Jlc3Mgb2YgYmVpbmcgCisJCQkJCSAqIHdyaXR0ZW4KKwkJCQkJICovCit9IHpmdF92b2xpbmZvOworCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB6ZnRfdnRibDsKKyNkZWZpbmUgemZ0X2hlYWRfdnRibCAgbGlzdF9lbnRyeSh6ZnRfdnRibC5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSkKKyNkZWZpbmUgemZ0X2VvbV92dGJsICAgbGlzdF9lbnRyeSh6ZnRfdnRibC5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSkKKyNkZWZpbmUgemZ0X2xhc3RfdnRibCAgbGlzdF9lbnRyeSh6ZnRfZW9tX3Z0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpCisjZGVmaW5lIHpmdF9maXJzdF92dGJsIGxpc3RfZW50cnkoemZ0X2hlYWRfdnRibC0+bm9kZS5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSkKKyNkZWZpbmUgemZ0X3Z0YmxfZW1wdHkgKHpmdF9lb21fdnRibC0+bm9kZS5wcmV2ID09ICZ6ZnRfaGVhZF92dGJsLT5ub2RlKQorCisjZGVmaW5lIERVTVBfVk9MSU5GTyhsZXZlbCwgZGVzYywgaW5mbykJCQkJCVwKK3sJCQkJCQkJCQlcCisJY2hhciB0bXBbMjFdOwkJCQkJCQlcCisJc3RybGNweSh0bXAsIGRlc2MsIHNpemVvZih0bXApKTsJCQkJXAorCVRSQUNFKGxldmVsLCAiVm9sdW1lICVkOlxuIgkJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZGVzY3JpcHRpb24gIDogJXNcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZmlyc3Qgc2VnbWVudDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAibGFzdCAgc2VnbWVudDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAic2l6ZSAgICAgICAgIDogIiBMTF9YICJcbiIJCQlcCisJICAgICAgS0VSTl9JTkZPICJibG9jayBzaXplICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJjb21wcmVzc2lvbiAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJ6ZnRhcGUgdm9sdW1lOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJRSUMtMTEzIGNvbmYuOiAlZCIsCQkJCVwKKwkgICAgICAoaW5mbyktPmNvdW50LCB0bXAsIChpbmZvKS0+c3RhcnRfc2VnLCAoaW5mbyktPmVuZF9zZWcsCVwKKwkgICAgICBMTCgoaW5mbyktPnNpemUpLCAoaW5mbyktPmJsa19zeiwJCQkJXAorCSAgICAgIChpbmZvKS0+dXNlX2NvbXByZXNzaW9uICE9IDAsIChpbmZvKS0+emZ0X3ZvbHVtZSAhPSAwLAlcCisJICAgICAgKGluZm8pLT5xaWMxMTMgIT0gMCk7CQkJCQlcCit9CisKK2V4dGVybiBpbnQgemZ0X3FpY19tb2RlOworZXh0ZXJuIGludCB6ZnRfb2xkX2Z0YXBlOworZXh0ZXJuIGludCB6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQ7CisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgIHpmdF9pbml0X3Z0YmwgICAgICAgICAgICAgKHZvaWQpOworZXh0ZXJuIHZvaWQgIHpmdF9mcmVlX3Z0YmwgICAgICAgICAgICAgKHZvaWQpOworZXh0ZXJuIGludCAgIHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcik7CitleHRlcm4gaW50ICAgemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUgICAodW5zaWduZWQgaW50IHNlZ21lbnQpOworZXh0ZXJuIGludCAgIHpmdF9vcGVuX3ZvbHVtZSAgICAgICAgICAgKHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJCQlpbnQgYmxrX3N6LCBpbnQgdXNlX2NvbXByZXNzaW9uKTsKK2V4dGVybiBpbnQgICB6ZnRfY2xvc2Vfdm9sdW1lICAgICAgICAgICh6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gY29uc3QgemZ0X3ZvbGluZm8gKnpmdF9maW5kX3ZvbHVtZSh1bnNpZ25lZCBpbnQgc2VnX3Bvcyk7CitleHRlcm4gaW50ICAgemZ0X3NraXBfdm9sdW1lcyAgICAgICAgICAoaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gX19zNjQgemZ0X2dldF9lb21fcG9zICAgICAgICAgICAodm9pZCk7CitleHRlcm4gdm9pZCAgemZ0X3NraXBfdG9fZW9tICAgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIGludCAgIHpmdF9mYWtlX3ZvbHVtZV9oZWFkZXJzICAgKGVvZl9tYXJrX3VuaW9uICplb2ZfbWFwLCAKKwkJCQkJaW50IG51bV9mYWlsZWRfc2VjdG9ycyk7CitleHRlcm4gaW50ICAgemZ0X3dlb2YgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gdm9pZCAgemZ0X21vdmVfcGFzdF9lb2YgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOworCitzdGF0aWMgaW5saW5lIGludCAgIHpmdF90YXBlX2F0X2VvZCAgICAgICAgIChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7CitzdGF0aWMgaW5saW5lIGludCAgIHpmdF90YXBlX2F0X2xib3QgICAgICAgIChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7CitzdGF0aWMgaW5saW5lIHZvaWQgIHpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mICh6ZnRfcG9zaXRpb24gKnBvcywgCisJCQkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW5saW5lIF9fczY0IHpmdF9jaGVja19mb3JfZW9mKGNvbnN0IHpmdF92b2xpbmZvICp2dGJsLAorCQkJCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKTsKKworLyogdGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSB6ZnRfc2VnX3BvcyBjb3VudGVyIGlmIHdlIGFyZSByaWdodAorICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlZ21lbnQuIFRoaXMgaXMgdG8gaGFuZGxlIGZzZm0vYnNmbSAtLSB3ZQorICogbmVlZCB0byBwb3NpdGlvbiBiZWZvcmUgdGhlIGVvZiBtYXJrLiAgTk9URTogemZ0X3RhcGVfcG9zIGlzIG5vdAorICogY2hhbmdlZCAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKHpmdF9wb3NpdGlvbiAqcG9zLCAKKwkJCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAocG9zLT5zZWdfcG9zID09IHZvbHVtZS0+ZW5kX3NlZyArIDEgJiYgIHBvcy0+c2VnX2J5dGVfcG9zID09IDApIHsKKwkJcG9zLT5zZWdfcG9zIC0tOworCQlwb3MtPnNlZ19ieXRlX3BvcyA9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICBNbW1oLiBJcyB0aGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCB2b2x1bWUsIHRoYXQgaXMgcmlnaHQKKyAqICBiZWZvcmUgdGhlIGxhc3QgRU9GIG1hcmsgYWxzbyBsb2dpY2FsIGFuIEVPRCBjb25kaXRpb24/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHpmdF90YXBlX2F0X2VvZChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfRVhJVCAocG9zLT5zZWdfcG9zID49IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnIHx8CisJCQkgICAgemZ0X2xhc3RfdnRibC0+b3Blbik7CisJfSBlbHNlIHsKKwkJVFJBQ0VfRVhJVCBwb3MtPnNlZ19wb3MgPiBmdF9sYXN0X2RhdGFfc2VnbWVudDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHpmdF90YXBlX2F0X2xib3QoY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJaWYgKHpmdF9xaWNfbW9kZSkgeworCQlyZXR1cm4gKHBvcy0+c2VnX3BvcyA8PSB6ZnRfZmlyc3RfdnRibC0+c3RhcnRfc2VnICYmCisJCQlwb3MtPnZvbHVtZV9wb3MgPT0gMCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChwb3MtPnNlZ19wb3MgPD0gZnRfZmlyc3RfZGF0YV9zZWdtZW50ICYmIAorCQkJcG9zLT52b2x1bWVfcG9zID09IDApOworCX0KK30KKworLyogVGhpcyBvbmUgY2hlY2tzIGZvciBFT0YuICByZXR1cm4gcmVtYWluZyBzcGFjZSAobWF5IGJlIG5lZ2F0aXZlKSAKKyAqLworc3RhdGljIGlubGluZSBfX3M2NCB6ZnRfY2hlY2tfZm9yX2VvZihjb25zdCB6ZnRfdm9saW5mbyAqdnRibCwKKwkJCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKK3sgICAgIAorCXJldHVybiAoX19zNjQpKHZ0YmwtPnNpemUgLSBwb3MtPnZvbHVtZV9wb3MpOworfQorCisjZW5kaWYgLyogX1pGVEFQRV9WVEJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzI3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jLHYgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDE5OTcvMTEvMDYgMDA6NTA6MjkgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB3cml0aW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIGludCBsYXN0X3dyaXRlX2ZhaWxlZDsKK3N0YXRpYyBpbnQgbmVlZF9mbHVzaDsKKwordm9pZCB6ZnRfcHJldmVudF9mbHVzaCh2b2lkKQoreworCW5lZWRfZmx1c2ggPSAwOworfQorCitzdGF0aWMgaW50IHpmdF93cml0ZV9oZWFkZXJfc2VnbWVudHMoX191OCogYnVmZmVyKQoreworCWludCBoZWFkZXJfMV9vayA9IDA7CisJaW50IGhlYWRlcl8yX29rID0gMDsKKwl1bnNpZ25lZCBpbnQgdGltZV9zdGFtcDsKKwlUUkFDRV9GVU4oZnRfdF9ub2lzZSk7CisJCisJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwlmdGFwZV9zZWVrX3RvX2JvdCgpOyAgICAvKiBwcmV2ZW50cyBleHRyYSByZXdpbmQgKi8KKwlpZiAoR0VUNChidWZmZXIsIDApICE9IEZUX0hTRUdfTUFHSUMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgIndyb25nIGhlYWRlciBzaWduYXR1cmUgZm91bmQsIGFib3J0aW5nIik7CisJfSAKKwkvKiAgIEJlIG9wdGltaXN0aWM6ICovCisJUFVUNChidWZmZXIsIEZUX1NFR19DTlQsCisJICAgICB6ZnRfd3JpdHRlbl9zZWdtZW50cyArIEdFVDQoYnVmZmVyLCBGVF9TRUdfQ05UKSArIDIpOworCWlmICgodGltZV9zdGFtcCA9IHpmdF9nZXRfdGltZSgpKSAhPSAwKSB7CisJCVBVVDQoYnVmZmVyLCBGVF9XUl9EQVRFLCB0aW1lX3N0YW1wKTsKKwkJaWYgKHpmdF9sYWJlbF9jaGFuZ2VkKSB7CisJCQlQVVQ0KGJ1ZmZlciwgRlRfTEFCRUxfREFURSwgdGltZV9zdGFtcCk7CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwKKwkgICAgICAid3JpdGluZyBmaXJzdCBoZWFkZXIgc2VnbWVudCAlZCIsIGZ0X2hlYWRlcl9zZWdtZW50XzEpOworCWhlYWRlcl8xX29rID0gemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhmdF9oZWFkZXJfc2VnbWVudF8xLCAKKwkJCQkJCWJ1ZmZlciwgRlRfU0VHTUVOVF9TSVpFLAorCQkJCQkJemZ0X2RlYmxvY2tfYnVmKSA+PSAwOworCVRSQUNFKGZ0X3Rfbm9pc2UsCisJICAgICAgIndyaXRpbmcgc2Vjb25kIGhlYWRlciBzZWdtZW50ICVkIiwgZnRfaGVhZGVyX3NlZ21lbnRfMik7CisJaGVhZGVyXzJfb2sgPSB6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKGZ0X2hlYWRlcl9zZWdtZW50XzIsIAorCQkJCQkJYnVmZmVyLCBGVF9TRUdNRU5UX1NJWkUsCisJCQkJCQl6ZnRfZGVibG9ja19idWYpID49IDA7CisJaWYgKCFoZWFkZXJfMV9vaykgeworCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiAiCisJCSAgICAgICJ1cGRhdGUgb2YgZmlyc3QgaGVhZGVyIHNlZ21lbnQgZmFpbGVkIik7CisJfQorCWlmICghaGVhZGVyXzJfb2spIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzogIgorCQkgICAgICAidXBkYXRlIG9mIHNlY29uZCBoZWFkZXIgc2VnbWVudCBmYWlsZWQiKTsKKwl9CisJaWYgKCFoZWFkZXJfMV9vayAmJiAhaGVhZGVyXzJfb2spIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJFcnJvcjogIgorCQkgICAgICAidXBkYXRlIG9mIGJvdGggaGVhZGVyIHNlZ21lbnRzIGZhaWxlZC4iKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9ub2lzZSk7CisJCisJLyogIG11c3QgTk9UIHVzZSB6ZnRfd3JpdGVfcHJvdGVjdGVkLCBhcyBpdCBhbHNvIGluY2x1ZGVzIHRoZQorCSAqICBmaWxlIGFjY2VzcyBtb2RlLiBCdXQgd2UgYWxzbyB3YW50IHRvIHVwZGF0ZSB3aGVuIHNvZnQKKwkgKiAgd3JpdGUgcHJvdGVjdGlvbiBpcyBlbmFibGVkIChPX1JET05MWSkKKwkgKi8KKwlpZiAoZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9vbGRfZnRhcGUpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIlRhcGUgc2V0IHJlYWQtb25seTogbm8gdXBkYXRlIik7CisJfSAKKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiTm90aGluZyB0byB1cGRhdGUiKTsKKwl9CisJaWYgKCF6ZnRfaGVhZGVyX2NoYW5nZWQpIHsKKwkJemZ0X2hlYWRlcl9jaGFuZ2VkID0gemZ0X3dyaXR0ZW5fc2VnbWVudHMgPiAwOworCX0KKwlpZiAoIXpmdF9oZWFkZXJfY2hhbmdlZCAmJiAhemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJOb3RoaW5nIHRvIHVwZGF0ZSIpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiVXBkYXRpbmcgaGVhZGVyIHNlZ21lbnRzIik7CisJaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlID09IHdyaXRpbmcpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJCisJemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOyAvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZSAqLworCWlmICh6ZnRfaGVhZGVyX2NoYW5nZWQpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3dyaXRlX2hlYWRlcl9zZWdtZW50cyh6ZnRfaHNlZ19idWYpLCk7CisJfQorCWlmICh6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUoZnRfZmlyc3RfZGF0YV9zZWdtZW50KSwpOworCX0KKwl6ZnRfaGVhZGVyX2NoYW5nZWQgPQorCQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAKKwkJemZ0X2xhYmVsX2NoYW5nZWQgICAgICAgID0KKwkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgICAgID0gMDsKKwlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOworCWZ0YXBlX3NlZWtfdG9fYm90KCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IHJlYWRfbWVyZ2VfYnVmZmVyKGludCBzZWdfcG9zLCBfX3U4ICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzZWdfc3opCit7CisJaW50IHJlc3VsdCA9IDA7CisJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJLyogIHdyaXRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIHZvbHVtZSBpcyBOT1QgYWxsb3dlZAorCQkgKgorCQkgKi8KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIk5vIG5lZWQgdG8gcmVhZCBhIHNlZ21lbnQiKTsKKwkJbWVtc2V0KGJ1ZmZlciArIG9mZnNldCwgMCwgc2VnX3N6IC0gb2Zmc2V0KTsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRShmdF90X2FueSwgIndhaXRpbmciKTsKKwlmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAidHJ5aW5nIHRvIHJlYWQgc2VnbWVudCAlZCBmcm9tIG9mZnNldCAlZCIsCisJICAgICAgc2VnX3Bvcywgb2Zmc2V0KTsKKwlTRVRfVFJBQ0VfTEVWRUwoZnRfdF9idWcpOworCXJlc3VsdCA9IHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKHNlZ19wb3MsIGJ1ZmZlciwgCisJCQkJCSAgICBGVF9SRF9TSU5HTEUsCisJCQkJCSAgICBvZmZzZXQsIHNlZ19zeiAtIG9mZnNldCk7CisJU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKKwlpZiAocmVzdWx0ICE9IChzZWdfc3ogLSBvZmZzZXQpKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJJZ25vcmUgZXJyb3I6IHJlYWRfc2VnbWVudCgpIHJlc3VsdDogJWQiLAorCQkgICAgICByZXN1bHQpOworCQltZW1zZXQoYnVmZmVyICsgb2Zmc2V0LCAwLCBzZWdfc3ogLSBvZmZzZXQpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIGZsdXNoIHRoZSB3cml0ZSBidWZmZXIgdG8gdGFwZSBhbmQgd3JpdGUgYW4gZW9mLW1hcmtlciBhdCB0aGUKKyAqIGN1cnJlbnQgcG9zaXRpb24gaWYgbm90IGluIHJhdyBtb2RlLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMKKyAqIHBvc2l0aW9ucyB0aGUgdGFwZSBiZWZvcmUgdGhlIGVvZi1tYXJrZXIuICBfZnRhcGVfY2xvc2UoKSBzaG91bGQKKyAqIHRoZW4gYWR2YW5jZSB0byB0aGUgbmV4dCBzZWdtZW50LgorICoKKyAqIHRoZSBwYXJhbWV0ZXIgImZpbmlzaF92b2x1bWUiIGRlc2NyaWJlcyB3aGV0aGVyIHRvIHBvc2l0aW9uIGJlZm9yZQorICogb3IgYWZ0ZXIgdGhlIHBvc3NpYmx5IGNyZWF0ZWQgZmlsZS1tYXJrLiBXZSBhbHdheXMgcG9zaXRpb24gYWZ0ZXIKKyAqIHRoZSBmaWxlLW1hcmsgd2hlbiBjYWxsZWQgZnJvbSBmdGFwZV9jbG9zZSgpIGFuZCBhIGZsdXNoIHdhcyBuZWVkZWQKKyAqICh0aGF0IGlzIGZ0YXBlX3dyaXRlKCkgd2FzIHRoZSBsYXN0IHRhcGUgb3BlcmF0aW9uIGJlZm9yZSBjYWxsaW5nCisgKiBmdGFwZV9mbHVzaCkgQnV0IHdlIGFsd2F5cyBwb3NpdGlvbiBiZWZvcmUgdGhlIGZpbGUtbWFyayB3aGVuIHRoaXMKKyAqIGZ1bmN0aW9uIGdldCdzIGNhbGxlZCBmcm9tIG91dHNpZGUgZnRhcGVfY2xvc2UoKSAKKyAqLworaW50IHpmdF9mbHVzaF9idWZmZXJzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgZGF0YV9yZW1haW5pbmc7CisJaW50IHRoaXNfc2Vnc19zaXplOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csCisJICAgICAgImVudGVyZWQsIGZ0YXBlX3N0YXRlID0gJWQiLCBmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSk7CisJaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlICE9IHdyaXRpbmcgJiYgIW5lZWRfZmx1c2gpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIm5vIG5lZWQgZm9yIGZsdXNoIik7CisJfQorCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOyAvKiAgdHJpZ2dlcnMgc29tZSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZQorCQkJCSAgKiAgcmVhZCBhbmQgd3JpdGUgcm91dGluZXMgCisJCQkJICAqLworCWlmIChsYXN0X3dyaXRlX2ZhaWxlZCkgeworCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJVFJBQ0VfRVhJVCAtRUlPOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiZmx1c2hpbmcgd3JpdGUgYnVmZmVycyIpOworCXRoaXNfc2Vnc19zaXplID0gemZ0X2dldF9zZWdfc3ooemZ0X3Bvcy5zZWdfcG9zKTsKKwlpZiAodGhpc19zZWdzX3NpemUgPT0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpIHsKKwkJemZ0X3Bvcy5zZWdfcG9zICsrOworCQlkYXRhX3JlbWFpbmluZyA9IHpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKKwl9IGVsc2UgeworCQlkYXRhX3JlbWFpbmluZyA9IHpmdF9wb3Muc2VnX2J5dGVfcG9zOworCX0KKwkvKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSBub3Qgd3JpdHRlbiB0byB0YXBlIHlldCwgYXBwZW5kIHplcm8ncworCSAqIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHNlY3RvciAoaWYgdXNpbmcgY29tcHJlc3Npb24pIG9yIG1lcmdlCisJICogaXQgd2l0aCB0aGUgZGF0YSBleGlzdGluZyBvbiB0aGUgdGFwZSBUaGVuIHdyaXRlIHRoZQorCSAqIHNlZ21lbnQocykgdG8gdGFwZS4KKwkgKi8KKwlUUkFDRShmdF90X25vaXNlLCAiUG9zaXRpb246XG4iCisJICAgICAgS0VSTl9JTkZPICJzZWdfcG9zICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJieXRlIHBvcyA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmc6ICVkIiwKKwkgICAgICB6ZnRfcG9zLnNlZ19wb3MsIHpmdF9wb3Muc2VnX2J5dGVfcG9zLCBkYXRhX3JlbWFpbmluZyk7CisJaWYgKGRhdGFfcmVtYWluaW5nID4gMCkgeworCQlkbyB7CisJCQl0aGlzX3NlZ3Nfc2l6ZSA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7CisJCQlpZiAodGhpc19zZWdzX3NpemUgPiBkYXRhX3JlbWFpbmluZykgeworCQkJCVRSQUNFX0NBVENIKHJlYWRfbWVyZ2VfYnVmZmVyKHpmdF9wb3Muc2VnX3BvcywKKwkJCQkJCQkgICAgICB6ZnRfZGVibG9ja19idWYsCisJCQkJCQkJICAgICAgZGF0YV9yZW1haW5pbmcsCisJCQkJCQkJICAgICAgdGhpc19zZWdzX3NpemUpLAorCQkJCQkgICAgbGFzdF93cml0ZV9mYWlsZWQgPSAxKTsKKwkJCX0KKwkJCXJlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLCAKKwkJCQkJCSAgICAgemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJICAgICBGVF9XUl9NVUxUSSk7CisJCQlpZiAocmVzdWx0ICE9IHRoaXNfc2Vnc19zaXplKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmbHVzaCBidWZmZXJzIGZhaWxlZCIpOworCQkJCXpmdF9wb3MudGFwZV9wb3MgICAgLT0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3M7CisJCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAwOworCisJCQkJbGFzdF93cml0ZV9mYWlsZWQgPSAxOworCQkJCVRSQUNFX0VYSVQgcmVzdWx0OworCQkJfQorCQkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgKys7CisJCQlUUkFDRShmdF90X2RhdGFfZmxvdywKKwkJCSAgICAgICJmbHVzaCwgbW92ZWQgb3V0IGJ1ZmZlcjogJWQiLCByZXN1bHQpOworCQkJLyogbmVlZCBuZXh0IHNlZ21lbnQgZm9yIG1vcmUgZGF0YSAoZW1wdHkgc2VnbWVudHM/KQorCQkJICovCisJCQlpZiAocmVzdWx0IDwgZGF0YV9yZW1haW5pbmcpIHsgCisJCQkJaWYgKHJlc3VsdCA+IDApIHsgICAgICAgCisJCQkJCS8qIG1vdmUgcmVtYWluZGVyIHRvIGJ1ZmZlciBiZWdpbm5pbmcgCisJCQkJCSAqLworCQkJCQltZW1tb3ZlKHpmdF9kZWJsb2NrX2J1ZiwgCisJCQkJCQl6ZnRfZGVibG9ja19idWYgKyByZXN1bHQsCisJCQkJCQlGVF9TRUdNRU5UX1NJWkUgLSByZXN1bHQpOworCQkJCX0KKwkJCX0gCisJCQlkYXRhX3JlbWFpbmluZyAtPSByZXN1bHQ7CisJCQl6ZnRfcG9zLnNlZ19wb3MgKys7CisJCX0gd2hpbGUgKGRhdGFfcmVtYWluaW5nID4gMCk7CisJCVRSQUNFKGZ0X3RfYW55LCAicmVzdWx0OiAlZCIsIHJlc3VsdCk7CisJCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtLXpmdF9wb3Muc2VnX3BvczsKKwkJaWYgKGRhdGFfcmVtYWluaW5nID09IDApIHsgIC8qIGZpcnN0IGJ5dGUgbmV4dCBzZWdtZW50ICovCisJCQl6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IHRoaXNfc2Vnc19zaXplOworCQl9IGVsc2UgeyAvKiBhZnRlciBkYXRhIHByZXZpb3VzIHNlZ21lbnQsIGRhdGFfcmVtYWluaW5nIDwgMCAqLworCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSBkYXRhX3JlbWFpbmluZyArIHJlc3VsdDsKKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ6ZnRfZGVibG9ja19idWYgZW1wdHkiKTsKKwkJemZ0X3Bvcy5zZWdfcG9zIC0tOworCQl6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IHpmdF9nZXRfc2VnX3N6ICh6ZnRfcG9zLnNlZ19wb3MpOworCQlmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKTsKKwl9CisJVFJBQ0UoZnRfdF9hbnksICJ3YWl0aW5nIik7CisJaWYgKChyZXN1bHQgPSBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCkpIDwgMCkgeworCQkvKiB0aGF0J3MgcmVhbGx5IGJhZC4gV2hhdCB0byB0byB3aXRoIHpmdF90YXBlX3Bvcz8gCisJCSAqLworCQlUUkFDRShmdF90X2VyciwgImZsdXNoIGJ1ZmZlcnMgZmFpbGVkIik7CisJfQorCVRSQUNFKGZ0X3RfYW55LCAiemZ0X3NlZ19wb3M6ICVkLCB6ZnRfc2VnX2J5dGVfcG9zOiAlZCIsCisJICAgICAgemZ0X3Bvcy5zZWdfcG9zLCB6ZnRfcG9zLnNlZ19ieXRlX3Bvcyk7CisJbGFzdF93cml0ZV9mYWlsZWQgID0KKwkJbmVlZF9mbHVzaCA9IDA7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qIHJldHVybi12YWx1ZTogdGhlIG51bWJlciBvZiBieXRlcyByZW1vdmVkIGZyb20gdGhlIHVzZXItYnVmZmVyCisgKgorICogb3V0OiAKKyAqICAgICAgaW50ICp3cml0ZV9jbnQ6IGhvdyBtdWNoIGFjdHVhbGx5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgemZ0X2RlYmxvY2tfYnVmCisgKiAgICAgIGludCByZXFfbGVuICA6IE1VU1QgTk9UIEJFIENIQU5HRUQsIGV4Y2VwdCBhdCBFT1QsIGluIAorICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FzZSBpdCBtYXkgYmUgYWRqdXN0ZWQKKyAqIGluIDogCisgKiAgICAgIGNoYXIgKmJ1ZmYgICAgICAgIDogdGhlIHVzZXIgYnVmZmVyCisgKiAgICAgIGludCBidWZfcG9zX3dyaXRlIDogY29weSBvZiBidWZfbGVuX3dyIGludAorICogICAgICB0aGlzX3NlZ3Nfc2l6ZSAgICA6IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBhY3R1YWwgc2VnbWVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIKKyAqICAgICAgKnpmdF9kZWJsb2NrX2J1ZiAgIDogemZ0X2RlYmxvY2tfYnVmCisgKi8KK3N0YXRpYyBpbnQgemZ0X3NpbXBsZV93cml0ZShpbnQgKmNudCwKKwkJCSAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkJICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwgCisJCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlpbnQgc3BhY2VfbGVmdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qIHZvbHVtZS0+c2l6ZSBob2xkcyB0aGUgdGFwZSBjYXBhY2l0eSB3aGlsZSB2b2x1bWUgaXMgb3BlbiAqLworCWlmIChwb3MtPnRhcGVfcG9zICsgdm9sdW1lLT5ibGtfc3ogPiB2b2x1bWUtPnNpemUpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PU1BDOworCX0KKwkvKiAgcmVtYWluaW5nIHNwYWNlIGluIHRoaXMgc2VnbWVudCwgTk9UIHpmdF9kZWJsb2NrX2J1ZgorCSAqLworCXNwYWNlX2xlZnQgPSBzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvczsKKwkqY250ID0gcmVxX2xlbiA8IHNwYWNlX2xlZnQgPyByZXFfbGVuIDogc3BhY2VfbGVmdDsKKwlpZiAoY29weV9mcm9tX3VzZXIoZHN0X2J1ZiArIHBvcy0+c2VnX2J5dGVfcG9zLCBzcmNfYnVmLCAqY250KSAhPSAwKSB7CisJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwl9CisJVFJBQ0VfRVhJVCAqY250OworfQorCitzdGF0aWMgaW50IGNoZWNrX3dyaXRlX2FjY2VzcyhpbnQgcmVxX2xlbiwKKwkJCSAgICAgIGNvbnN0IHpmdF92b2xpbmZvICoqdm9sdW1lLAorCQkJICAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYmxrX3N6KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKHJlcV9sZW4gJSB6ZnRfYmxrX3N6KSAhPSAwKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKKwkJCSAgICAid3JpdGUtY291bnQgJWQgbXVzdCBiZSBtdWx0aXBsZSBvZiBibG9jay1zaXplICVkIiwKKwkJCSAgICByZXFfbGVuLCBibGtfc3opOworCX0KKwlpZiAoemZ0X2lvX3N0YXRlID09IHpmdF93cml0aW5nKSB7CisJCS8qICBhbGwgb3RoZXIgZXJyb3IgY29uZGl0aW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBlYXJsaWVyCisJCSAqLworCQlUUkFDRV9FWElUIDA7CisJfQorCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOworCVRSQUNFX0NBVENIKHpmdF9jaGVja193cml0ZV9hY2Nlc3MocG9zKSwpOworCS8qICBJZiB3ZSBoYXZlbid0IHJlYWQgdGhlIGhlYWRlciBzZWdtZW50IHlldCwgZG8gaXQgbm93LgorCSAqICBUaGlzIHdpbGwgdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlIGJhZCBzZWN0b3IKKwkgKiAgdGFibGUgYW5kIHJlYWQgdGhlIHZvbHVtZSB0YWJsZSBzZWdtZW50IAorCSAqLworCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7CisJCVRSQUNFX0NBVENIKHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cygpLCk7CisJfQorCS8qICBmaW5lLiBOb3cgdGhlIHRhcGUgaXMgZWl0aGVyIGF0IEJPVCBvciBhdCBFT0QsCisJICogIFdyaXRlIHN0YXJ0IG9mIHZvbHVtZSBub3cKKwkgKi8KKwlUUkFDRV9DQVRDSCh6ZnRfb3Blbl92b2x1bWUocG9zLCBibGtfc3osIHpmdF91c2VfY29tcHJlc3Npb24pLCk7CisJKnZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiIiwgKnZvbHVtZSk7CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJLyogbm93IG1lcmdlIHdpdGggb2xkIGRhdGEgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCF6ZnRfcWljX21vZGUgJiYgcG9zLT5zZWdfYnl0ZV9wb3MgIT0gMCl7CisJCXJlc3VsdCA9IHpmdF9mZXRjaF9zZWdtZW50KHBvcy0+c2VnX3BvcywKKwkJCQkJICAgemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkgICBGVF9SRF9TSU5HTEUpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJaWYgKHJlc3VsdCA9PSAtRUlOVFIgfHwgcmVzdWx0ID09IC1FTk9TUEMpIHsKKwkJCQlUUkFDRV9FWElUIHJlc3VsdDsKKwkJCX0KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsIAorCQkJICAgICAgImZ0YXBlX3JlYWRfc2VnbWVudCgpIHJlc3VsdDogJWQuICIKKwkJCSAgICAgICJUaGlzIG1pZ2h0IGJlIG5vcm1hbCB3aGVuIHVzaW5nICIKKwkJCSAgICAgICJhIG5ld2x5XG5mb3JtYXR0ZWQgdGFwZSIsIHJlc3VsdCk7CisJCQltZW1zZXQoemZ0X2RlYmxvY2tfYnVmLCAnXDAnLCBwb3MtPnNlZ19ieXRlX3Bvcyk7CisJCX0KKwl9CisJemZ0X2lvX3N0YXRlID0gemZ0X3dyaXRpbmc7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGZpbGxfZGVibG9ja19idWYoX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJCSAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNyX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4pCit7CisJaW50IGNudCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoc2VnX3N6ID09IDApIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9kYXRhX2Zsb3csICJlbXB0eSBzZWdtZW50Iik7CisJfQorCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmcgcmVxX2xlbjogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gIiAgICAgICAgICBidWZfcG9zOiAlZCIsIAorCSAgICAgIHJlcV9sZW4sIHBvcy0+c2VnX2J5dGVfcG9zKTsKKwkvKiB6ZnRfZGVibG9ja19idWYgd2lsbCBub3QgY29udGFpbiBhIHZhbGlkIHNlZ21lbnQgYW55IGxvbmdlciAqLworCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKKwlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbikgeworCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7CisJCVRSQUNFX0NBVENIKHJlc3VsdD0gKCp6ZnRfY21wcl9vcHMtPndyaXRlKSgmY250LAorCQkJCQkJCSAgIGRzdF9idWYsIHNlZ19zeiwKKwkJCQkJCQkgICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJCSAgIHBvcywgdm9sdW1lKSwpOworCX0gZWxzZSB7CisJCVRSQUNFX0NBVENIKHJlc3VsdD0gemZ0X3NpbXBsZV93cml0ZSgmY250LAorCQkJCQkJICAgICBkc3RfYnVmLCBzZWdfc3osCisJCQkJCQkgICAgIHVzcl9idWYsIHJlcV9sZW4sCisJCQkJCQkgICAgIHBvcywgdm9sdW1lKSwpOworCX0KKwlwb3MtPnZvbHVtZV9wb3MgICArPSByZXN1bHQ7CisJcG9zLT5zZWdfYnl0ZV9wb3MgKz0gY250OworCXBvcy0+dGFwZV9wb3MgICAgICs9IGNudDsKKwlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtb3ZlZCBmcm9tIHVzZXItYnVmZmVyIDogJWQgYnl0ZXMuXG4iCisJICAgICAgS0VSTl9JTkZPICJjb3BpZWQgdG8gemZ0X2RlYmxvY2tfYnVmOiAlZCBieXRlcy5cbiIKKwkgICAgICBLRVJOX0lORk8gInpmdF90YXBlX3BvcyAgICAgICAgICAgICA6ICIgTExfWCAiIGJ5dGVzLiIsCisJICAgICAgcmVzdWx0LCBjbnQsIExMKHBvcy0+dGFwZV9wb3MpKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworCisvKiAgY2FsbGVkIGJ5IHRoZSBrZXJuZWwtaW50ZXJmYWNlIHJvdXRpbmUgInpmdF93cml0ZSgpIgorICovCitpbnQgX3pmdF93cml0ZShjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHdyaXR0ZW4gPSAwOworCWludCB3cml0ZV9jbnQ7CisJaW50IHNlZ19zejsKKwlzdGF0aWMgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSA9IE5VTEw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJemZ0X3Jlc2lkICAgICAgICAgPSByZXFfbGVuOwkKKwlsYXN0X3dyaXRlX2ZhaWxlZCA9IDE7IC8qIHJlc2V0IHRvIDAgd2hlbiBzdWNjZXNzZnVsICovCisJLyogY2hlY2sgaWYgd3JpdGUgaXMgYWxsb3dlZCAKKwkgKi8KKwlUUkFDRV9DQVRDSChjaGVja193cml0ZV9hY2Nlc3MocmVxX2xlbiwgJnZvbHVtZSwmemZ0X3Bvcyx6ZnRfYmxrX3N6KSwpOworCXdoaWxlIChyZXFfbGVuID4gMCkgeworCQkvKiBBbGxvdyB1cyB0byBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agd2l0aCBhIHNpZ25hbCAhCisJCSAqLworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7CisJCWlmICgod3JpdGVfY250ID0gZmlsbF9kZWJsb2NrX2J1Zih6ZnRfZGVibG9ja19idWYsCisJCQkJCQkgIHNlZ19zeiwKKwkJCQkJCSAgJnpmdF9wb3MsCisJCQkJCQkgIHZvbHVtZSwKKwkJCQkJCSAgYnVmZiwKKwkJCQkJCSAgcmVxX2xlbikpIDwgMCkgeworCQkJemZ0X3Jlc2lkIC09IHdyaXR0ZW47CisJCQlpZiAod3JpdGVfY250ID09IC1FTk9TUEMpIHsKKwkJCQkvKiBsZWF2ZSB0aGUgcmVtYWluZGVyIHRvIGZsdXNoX2J1ZmZlcnMoKQorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3RfaW5mbywgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIik7CisJCQkJbGFzdF93cml0ZV9mYWlsZWQgPSAwOworCQkJCWlmICghbmVlZF9mbHVzaCkgeworCQkJCQluZWVkX2ZsdXNoID0gd3JpdHRlbiA+IDA7CisJCQkJfQorCQkJCVRSQUNFX0VYSVQgd3JpdHRlbiA+IDAgPyB3cml0dGVuIDogLUVOT1NQQzsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKHpmdF9wb3Muc2VnX2J5dGVfcG9zID09IHNlZ19zeikgeworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfd3JpdGVfc2VnbWVudCh6ZnRfcG9zLnNlZ19wb3MsIAorCQkJCQkJCXpmdF9kZWJsb2NrX2J1ZiwKKwkJCQkJCQlGVF9XUl9BU1lOQyksCisJCQkJICAgIHpmdF9yZXNpZCAtPSB3cml0dGVuKTsKKwkJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOworCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAgMDsKKwkJCXpmdF9kZWJsb2NrX3NlZ21lbnQgID0gemZ0X3Bvcy5zZWdfcG9zOworCQkJKyt6ZnRfcG9zLnNlZ19wb3M7CisJCX0KKwkJd3JpdHRlbiArPSB3cml0ZV9jbnQ7CisJCWJ1ZmYgICAgKz0gd3JpdGVfY250OworCQlyZXFfbGVuIC09IHdyaXRlX2NudDsKKwl9IC8qIHdoaWxlIChyZXFfbGVuID4gMCkgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJlbWFpbmluZyBpbiBibG9ja2luZyBidWZmZXI6ICVkIiwKKwkgICAgICAgemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpOworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAianVzdCB3cml0dGVuIGJ5dGVzOiAlZCIsIHdyaXR0ZW4pOworCWxhc3Rfd3JpdGVfZmFpbGVkID0gMDsKKwl6ZnRfcmVzaWQgLT0gd3JpdHRlbjsKKwluZWVkX2ZsdXNoID0gbmVlZF9mbHVzaCB8fCB3cml0dGVuID4gMDsKKwlUUkFDRV9FWElUIHdyaXR0ZW47ICAgICAgICAgICAgICAgLyogYnl0ZXMgd3JpdHRlbiAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ODcwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfWkZUQVBFX1dSSVRFX0gKKyNkZWZpbmUgX1pGVEFQRV9XUklURV9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjEzICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB3cml0ZSBmdW5jdGlvbnMKKyAqICAgICAgZm9yIHRoZSB6ZnRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworZXh0ZXJuIGludCAgemZ0X2ZsdXNoX2J1ZmZlcnModm9pZCk7CitleHRlcm4gaW50ICB6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cyh2b2lkKTsKK2V4dGVybiB2b2lkIHpmdF9wcmV2ZW50X2ZsdXNoKHZvaWQpOworCisvKiAgaG9vayBmb3IgdGhlIFZGUyBpbnRlcmZhY2UgCisgKi8KK2V4dGVybiBpbnQgX3pmdF93cml0ZShjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pOworI2VuZGlmIC8qIF9aRlRBUEVfV1JJVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjE0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZV9zeW1zLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjE0ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3ltYm9scyB0aGF0IHRoZSB6ZnRhcGUgZnJvbnRlbmQgdG8gCisgKiAgICAgIHRoZSBmdGFwZSBmbG9wcHkgdGFwZSBkcml2ZXIgZXhwb3J0cyAKKyAqLwkJIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisKKy8qIHpmdGFwZS1pbml0LmMgKi8KK0VYUE9SVF9TWU1CT0woemZ0X2NtcHJfcmVnaXN0ZXIpOworLyogemZ0YXBlLXJlYWQuYyAqLworRVhQT1JUX1NZTUJPTCh6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbik7CisvKiB6ZnRhcGUtYnVmZmVycy5jICovCitFWFBPUlRfU1lNQk9MKHpmdF92bWFsbG9jX29uY2UpOworRVhQT1JUX1NZTUJPTCh6ZnRfdm1hbGxvY19hbHdheXMpOworRVhQT1JUX1NZTUJPTCh6ZnRfdmZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZTAxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBHZW5lcmljIC9kZXYvbnZyYW0gZHJpdmVyIGZvciBhcmNoaXRlY3R1cmVzIHByb3ZpZGluZyBzb21lCisgKiAiZ2VuZXJpYyIgaG9va3MsIHRoYXQgaXMgOgorICoKKyAqIG52cmFtX3JlYWRfYnl0ZSwgbnZyYW1fd3JpdGVfYnl0ZSwgbnZyYW1fc3luYworICoKKyAqIE5vdGUgdGhhdCBhbiBhZGRpdGlvbmFsIGhvb2sgaXMgc3VwcG9ydGVkIGZvciBQb3dlck1hYyBvbmx5CisgKiBmb3IgZ2V0dGluZyB0aGUgbnZyYW0gInBhcnRpdGlvbiIgaW5mb3JtYXRpb25zCisgKgorICovCisKKyNkZWZpbmUgTlZSQU1fVkVSU0lPTiAiMS4xIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9udnJhbS5oPgorCisjZGVmaW5lIE5WUkFNX1NJWkUJODE5MgorCitzdGF0aWMgbG9mZl90IG52cmFtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSAxOgorCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb2Zmc2V0ICs9IE5WUkFNX1NJWkU7CisJCWJyZWFrOworCX0KKwlpZiAob2Zmc2V0IDwgMCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGZpbGUtPmZfcG9zOworfQorCitzdGF0aWMgc3NpemVfdCByZWFkX252cmFtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyIF9fdXNlciAqcCA9IGJ1ZjsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgqcHBvcyA+PSBOVlJBTV9TSVpFKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAqcHBvczsgY291bnQgPiAwICYmIGkgPCBOVlJBTV9TSVpFOyArK2ksICsrcCwgLS1jb3VudCkKKwkJaWYgKF9fcHV0X3VzZXIobnZyYW1fcmVhZF9ieXRlKGkpLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCSpwcG9zID0gaTsKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbnZyYW0oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyIF9fdXNlciAqcCA9IGJ1ZjsKKwljaGFyIGM7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgqcHBvcyA+PSBOVlJBTV9TSVpFKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAqcHBvczsgY291bnQgPiAwICYmIGkgPCBOVlJBTV9TSVpFOyArK2ksICsrcCwgLS1jb3VudCkgeworCQlpZiAoX19nZXRfdXNlcihjLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQludnJhbV93cml0ZV9ieXRlKGMsIGkpOworCX0KKwkqcHBvcyA9IGk7CisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgbnZyYW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoKGNtZCkgeworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWNhc2UgT0JTT0xFVEVfUE1BQ19OVlJBTV9HRVRfT0ZGU0VUOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJudnJhbTogVXNpbmcgb2Jzb2xldGUgUE1BQ19OVlJBTV9HRVRfT0ZGU0VUIGlvY3RsXG4iKTsKKwljYXNlIElPQ19OVlJBTV9HRVRfT0ZGU0VUOiB7CisJCWludCBwYXJ0LCBvZmZzZXQ7CisKKwkJaWYgKF9tYWNoaW5lICE9IF9NQUNIX1BtYWMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJ0LCAodm9pZCBfX3VzZXIqKWFyZywgc2l6ZW9mKHBhcnQpKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwYXJ0IDwgcG1hY19udnJhbV9PRiB8fCBwYXJ0ID4gcG1hY19udnJhbV9OUikKKwkJCXJldHVybiAtRUlOVkFMOworCQlvZmZzZXQgPSBwbWFjX2dldF9wYXJ0aXRpb24ocGFydCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyKilhcmcsICZvZmZzZXQsIHNpemVvZihvZmZzZXQpKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KKwljYXNlIElPQ19OVlJBTV9TWU5DOgorCQludnJhbV9zeW5jKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG52cmFtX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbnZyYW1fbGxzZWVrLAorCS5yZWFkCQk9IHJlYWRfbnZyYW0sCisJLndyaXRlCQk9IHdyaXRlX252cmFtLAorCS5pb2N0bAkJPSBudnJhbV9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBudnJhbV9kZXYgPSB7CisJTlZSQU1fTUlOT1IsCisJIm52cmFtIiwKKwkmbnZyYW1fZm9wcworfTsKKworaW50IF9faW5pdCBudnJhbV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWFjaW50b3NoIG5vbi12b2xhdGlsZSBtZW1vcnkgZHJpdmVyIHYlc1xuIiwKKwkJTlZSQU1fVkVSU0lPTik7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJm52cmFtX2Rldik7Cit9CisKK3ZvaWQgX19leGl0IG52cmFtX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgbWlzY19kZXJlZ2lzdGVyKCAmbnZyYW1fZGV2ICk7Cit9CisKK21vZHVsZV9pbml0KG52cmFtX2luaXQpOworbW9kdWxlX2V4aXQobnZyYW1fY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNGE3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpAQCAtMCwwICsxLDEwMDEgQEAKKy8qCisgKiAgZ2VuZXJpY19zZXJpYWwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgvMTk5OSBSLkUuV29sZmZAQml0V2l6YXJkLm5sCisgKgorICogIHdyaXR0ZW4gZm9yIHRoZSBTWCBzZXJpYWwgZHJpdmVyLgorICogICAgIENvbnRhaW5zIHRoZSBjb2RlIHRoYXQgc2hvdWxkIGJlIHNoYXJlZCBvdmVyIGFsbCB0aGUgc2VyaWFsIGRyaXZlcnMuCisgKgorICogIENyZWRpdCBmb3IgdGhlIGlkZWEgdG8gZG8gaXQgdGhpcyB3YXkgbWlnaHQgZ28gdG8gQWxhbiBDb3guIAorICoKKyAqCisgKiAgVmVyc2lvbiAwLjEgLS0gRGVjZW1iZXIsIDE5OTguIEluaXRpYWwgdmVyc2lvbi4KKyAqICBWZXJzaW9uIDAuMiAtLSBNYXJjaCwgMTk5OS4gICAgU29tZSBtb3JlIHJvdXRpbmVzLiBCdWdmaXhlcy4gRXRjLgorICogIFZlcnNpb24gMC41IC0tIEF1Z3VzdCwgMTk5OS4gICBTb21lIG1vcmUgZml4ZXMuIFJlZm9ybWF0IGZvciBMaW51cy4KKyAqCisgKiAgQml0V2l6YXJkIGlzIGFjdGl2ZWx5IG1haW50YWluaW5nIHRoaXMgZmlsZS4gV2Ugc29tZXRpbWVzIGZpbmQKKyAqICB0aGF0IHNvbWVvbmUgc3VibWl0dGVkIGNoYW5nZXMgdG8gdGhpcyBmaWxlLiBXZSByZWFsbHkgYXBwcmVjaWF0ZQorICogIHlvdXIgaGVscCwgYnV0IHBsZWFzZSBzdWJtaXQgY2hhbmdlcyB0aHJvdWdoIHVzLiBXZSdyZSBkb2luZyBvdXIKKyAqICBiZXN0IHRvIGJlIHJlc3BvbnNpdmUuICAtLSBSRVcKKyAqICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIERFQlVHIAorCitzdGF0aWMgY2hhciAqICAgICAgICAgICAgICAgICAgdG1wX2J1ZjsgCitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKK3N0YXRpYyBpbnQgZ3NfZGVidWc7CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBnc19kcHJpbnRrKGYsIHN0ci4uLikgaWYgKGdzX2RlYnVnICYgZikgcHJpbnRrIChzdHIpCisjZWxzZQorI2RlZmluZSBnc19kcHJpbnRrKGYsIHN0ci4uLikgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNkZWZpbmUgZnVuY19lbnRlcigpIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZW50ZXIgJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgZnVuY19leGl0KCkgIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgTkVXX1dSSVRFX0xPQ0tJTkcgMQorI2lmIE5FV19XUklURV9MT0NLSU5HCisjZGVmaW5lIERFQ0wgICAgICAvKiBOb3RoaW5nICovCisjZGVmaW5lIExPQ0tJVCAgICBkb3duICgmIHBvcnQtPnBvcnRfd3JpdGVfc2VtKTsKKyNkZWZpbmUgUkVMRUFTRUlUIHVwICgmcG9ydC0+cG9ydF93cml0ZV9zZW0pOworI2Vsc2UKKyNkZWZpbmUgREVDTCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIExPQ0tJVCAgICBzYXZlX2ZsYWdzIChmbGFncyk7Y2xpICgpCisjZGVmaW5lIFJFTEVBU0VJVCByZXN0b3JlX2ZsYWdzIChmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkxCisKK21vZHVsZV9wYXJhbShnc19kZWJ1ZywgaW50LCAwNjQ0KTsKKworCit2b2lkIGdzX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCURFQ0wKKworCWZ1bmNfZW50ZXIgKCk7IAorCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFwb3J0KSByZXR1cm47CisKKwlpZiAoISAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHJldHVybjsKKworCS8qIFRha2UgYSBsb2NrIG9uIHRoZSBzZXJpYWwgdHJhbm1pdCBidWZmZXIhICovCisJTE9DS0lUOworCisJaWYgKHBvcnQtPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKSB7CisJCS8qIFNvcnJ5LCBidWZmZXIgaXMgZnVsbCwgZHJvcCBjaGFyYWN0ZXIuIFVwZGF0ZSBzdGF0aXN0aWNzPz8/PyAtLSBSRVcgKi8KKwkJUkVMRUFTRUlUOworCQlyZXR1cm47CisJfQorCisJcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF9oZWFkKytdID0gY2g7CisJcG9ydC0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOworCXBvcnQtPnhtaXRfY250Kys7ICAvKiBDaGFyYWN0ZXJzIGluIGJ1ZmZlciAqLworCisJUkVMRUFTRUlUOworCWZ1bmNfZXhpdCAoKTsKK30KKworCisjaWZkZWYgTkVXX1dSSVRFX0xPQ0tJTkcKKworLyoKKz4gUHJvYmxlbXMgdG8gdGFrZSBpbnRvIGFjY291bnQgYXJlOgorPiAgICAgICAtMS0gSW50ZXJydXB0cyB0aGF0IGVtcHR5IHBhcnQgb2YgdGhlIGJ1ZmZlci4KKz4gICAgICAgLTItIHBhZ2UgZmF1bHRzIG9uIHRoZSBhY2Nlc3MgdG8gdXNlcnNwYWNlLiAKKz4gICAgICAgLTMtIE90aGVyIHByb2Nlc3NlcyB0aGF0IGFyZSBhbHNvIHRyeWluZyB0byBkbyBhICJ3cml0ZSIuIAorKi8KKworaW50IGdzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisJaW50IGMsIHRvdGFsID0gMDsKKwlpbnQgdDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuIDA7CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuIDA7CisKKwlpZiAoISAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybiAwOworCisJLyogZ2V0IGV4Y2x1c2l2ZSAid3JpdGUiIGFjY2VzcyB0byB0aGlzIHBvcnQgKHByb2JsZW0gMykgKi8KKwkvKiBUaGlzIGlzIG5vdCBhIHNwaW5sb2NrIGJlY2F1c2Ugd2UgY2FuIGhhdmUgYSBkaXNrIGFjY2VzcyAocGFnZSAKKwkJIGZhdWx0KSBpbiBjb3B5X2Zyb21fdXNlciAqLworCWRvd24gKCYgcG9ydC0+cG9ydF93cml0ZV9zZW0pOworCisJd2hpbGUgKDEpIHsKKworCQljID0gY291bnQ7CisgCisJCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlICJPV04iIHRoZSAiaGVhZCIuIE5vb25lIGVsc2UgY2FuIAorCQkgICBjaGFuZ2UgdGhlICJoZWFkIjogd2Ugb3duIHRoZSBwb3J0X3dyaXRlX3NlbS4gKi8KKwkJLyogRG9uJ3Qgb3ZlcnJ1biB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQ7CisJCWlmICh0IDwgYykgYyA9IHQ7CisgCisJCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRoZSB4bWl0X2NudCBjYW4gb25seSBkZWNyZWFzZS4gVGhpcyAKKwkJICAgd291bGQgaW5jcmVhc2UgInQiLCBzbyB3ZSBtaWdodCBjb3B5IHRvbyBsaXR0bGUgY2hhcnMuICovCisJCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgImhlYWQiIG9mIHRoZSBidWZmZXIgKi8KKwkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSAxIC0gcG9ydC0+eG1pdF9jbnQ7CisJCWlmICh0IDwgYykgYyA9IHQ7CisgCisJCS8qIENhbid0IGNvcHkgbW9yZT8gYnJlYWsgb3V0ISAqLworCQlpZiAoYyA8PSAwKSBicmVhazsKKworCQltZW1jcHkgKHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGMpOworCisJCXBvcnQgLT4geG1pdF9jbnQgKz0gYzsKKwkJcG9ydCAtPiB4bWl0X2hlYWQgPSAocG9ydC0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRSAtMSk7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQl0b3RhbCArPSBjOworCX0KKwl1cCAoJiBwb3J0LT5wb3J0X3dyaXRlX3NlbSk7CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19XUklURSwgIndyaXRlOiBpbnRlcnJ1cHRzIGFyZSAlc1xuIiwgCisJICAgICAgICAgICAgKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pPyJlbmFibGVkIjogImRpc2FibGVkIik7IAorCisJaWYgKHBvcnQtPnhtaXRfY250ICYmIAorCSAgICAhdHR5LT5zdG9wcGVkICYmIAorCSAgICAhdHR5LT5od19zdG9wcGVkICYmCisJICAgICEocG9ydC0+ZmxhZ3MgJiBHU19UWF9JTlRFTikpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47CisJCXBvcnQtPnJkLT5lbmFibGVfdHhfaW50ZXJydXB0cyAocG9ydCk7CisJfQorCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gdG90YWw7Cit9CisjZWxzZQorLyoKKz4gUHJvYmxlbXMgdG8gdGFrZSBpbnRvIGFjY291bnQgYXJlOgorPiAgICAgICAtMS0gSW50ZXJydXB0cyB0aGF0IGVtcHR5IHBhcnQgb2YgdGhlIGJ1ZmZlci4KKz4gICAgICAgLTItIHBhZ2UgZmF1bHRzIG9uIHRoZSBhY2Nlc3MgdG8gdXNlcnNwYWNlLiAKKz4gICAgICAgLTMtIE90aGVyIHByb2Nlc3NlcyB0aGF0IGFyZSBhbHNvIHRyeWluZyB0byBkbyBhICJ3cml0ZSIuIAorKi8KKworaW50IGdzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwlpbnQgYywgdG90YWwgPSAwOworCWludCB0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyICgpOworCisJLyogVGhlIHN0YW5kYXJkIHNlcmlhbCBkcml2ZXIgcmV0dXJucyAwIGluIHRoaXMgY2FzZS4gCisJICAgVGhhdCBzb3VuZHMgdG8gbWUgYXMgIk5vIGVycm9yLCBJIGp1c3QgZGlkbid0IGdldCB0byB3cml0aW5nIGFueQorCSAgIGJ5dGVzLiBGZWVsIGZyZWUgdG8gdHJ5IGFnYWluLiIgCisJICAgVGhlICJvZmZpY2lhbCIgd2F5IHRvIHdyaXRlIG4gYnl0ZXMgZnJvbSBidWYgaXM6CisKKwkJIGZvciAobndyaXR0ZW4gPSAwO253cml0dGVuIDwgbjtud3JpdHRlbiArPSBydikgeworCQkJIHJ2ID0gd3JpdGUgKGZkLCBidWYrbndyaXR0ZW4sIG4tbndyaXR0ZW4pOworCQkJIGlmIChydiA8IDApIGJyZWFrOyAvLyBFcnJvcjogYmFpbCBvdXQuIC8vCisJCSB9IAorCisJICAgd2hpY2ggd2lsbCBsb29wIGVuZGxlc3NseSBpbiB0aGlzIGNhc2UuIFRoZSBtYW51YWwgcGFnZSBmb3Igd3JpdGUKKwkgICBhZ3JlZXMgd2l0aCBtZS4gSW4gcHJhY3Rpc2UgYWxtb3N0IGV2ZXJ5Ym9keSB3cml0ZXMgCisJICAgIndyaXRlIChmZCwgYnVmLG4pOyIgYnV0IHNvbWUgcGVvcGxlIG1pZ2h0IGhhdmUgaGFkIHRvIGRlYWwgd2l0aCAKKwkgICBpbmNvbXBsZXRlIHdyaXRlcyBpbiB0aGUgcGFzdCBhbmQgY29ycmVjdGx5IGltcGxlbWVudGVkIGl0IGJ5IG5vdy4uLiAKKwkgKi8KKworCWlmICghdHR5KSByZXR1cm4gLUVJTzsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghcG9ydCB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAtRUlPOworCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJY2xpKCk7CisJCWMgPSBjb3VudDsKKworCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSAiT1dOIiB0aGUgImhlYWQiLiBOb29uZSBlbHNlIGNhbiAKKwkJICAgY2hhbmdlIHRoZSAiaGVhZCI6IHdlIG93biB0aGUgcG9ydF93cml0ZV9zZW0uICovCisJCS8qIERvbid0IG92ZXJydW4gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkOworCQlpZiAodCA8IGMpIGMgPSB0OworCisJCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRoZSB4bWl0X2NudCBjYW4gb25seSBkZWNyZWFzZS4gVGhpcyAKKwkJICAgd291bGQgaW5jcmVhc2UgInQiLCBzbyB3ZSBtaWdodCBjb3B5IHRvbyBsaXR0bGUgY2hhcnMuICovCisJCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgImhlYWQiIG9mIHRoZSBidWZmZXIgKi8KKwkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSAxIC0gcG9ydC0+eG1pdF9jbnQ7CisJCWlmICh0IDwgYykgYyA9IHQ7CisKKwkJLyogQ2FuJ3QgY29weSBtb3JlPyBicmVhayBvdXQhICovCisJCWlmIChjIDw9IDApIHsKKwkJCWxvY2FsX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGMpOworCQlwb3J0LT54bWl0X2hlYWQgPSAoKHBvcnQtPnhtaXRfaGVhZCArIGMpICYKKwkJICAgICAgICAgICAgICAgICAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKKwkJcG9ydC0+eG1pdF9jbnQgKz0gYzsKKwkJbG9jYWxfcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQl0b3RhbCArPSBjOworCX0KKworCWlmIChwb3J0LT54bWl0X2NudCAmJiAKKwkgICAgIXR0eS0+c3RvcHBlZCAmJiAKKwkgICAgIXR0eS0+aHdfc3RvcHBlZCAmJgorCSAgICAhKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pKSB7CisJCXBvcnQtPmZsYWdzIHw9IEdTX1RYX0lOVEVOOworCQlwb3J0LT5yZC0+ZW5hYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIHRvdGFsOworfQorCisjZW5kaWYKKworCisKK2ludCBnc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJZnVuY19lbnRlciAoKTsKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBnc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJZnVuY19lbnRlciAoKTsKKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gcG9ydC0+eG1pdF9jbnQ7Cit9CisKKworc3RhdGljIGludCBnc19yZWFsX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuIDA7CisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQtPnJkKSByZXR1cm4gMDsKKwlpZiAoIXBvcnQtPnJkLT5jaGFyc19pbl9idWZmZXIpIHJldHVybiAwOworCisJZnVuY19leGl0ICgpOworCXJldHVybiBwb3J0LT54bWl0X2NudCArIHBvcnQtPnJkLT5jaGFyc19pbl9idWZmZXIgKHBvcnQpOworfQorCisKK3N0YXRpYyBpbnQgZ3Nfd2FpdF90eF9mbHVzaGVkICh2b2lkICogcHRyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpIAoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0ID0gcHRyOworCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXM7CisJaW50IGppZmZpZXNfdG9fdHJhbnNtaXQsIGNoYXJzbGVmdCA9IDAsIHJ2ID0gMDsKKwlpbnQgcmNpYjsKKworCWZ1bmNfZW50ZXIoKTsKKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAicG9ydD0lcC5cbiIsIHBvcnQpOworCWlmIChwb3J0KSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAieG1pdF9jbnQ9JXgsIHhtaXRfYnVmPSVwLCB0dHk9JXAuXG4iLCAKKwkJcG9ydC0+eG1pdF9jbnQsIHBvcnQtPnhtaXRfYnVmLCBwb3J0LT50dHkpOworCX0KKworCWlmICghcG9ydCB8fCBwb3J0LT54bWl0X2NudCA8IDAgfHwgIXBvcnQtPnhtaXRfYnVmKSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAiRVJST1I6ICFwb3J0LCAhcG9ydC0+eG1pdF9idWYgb3IgcHJvdC0+eG1pdF9jbnQgPCAwLlxuIik7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVJTlZBTDsgIC8qIFRoaXMgaXMgYW4gZXJyb3Igd2hpY2ggd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAqLworCX0KKworCXJjaWIgPSBnc19yZWFsX2NoYXJzX2luX2J1ZmZlcihwb3J0LT50dHkpOworCisJaWYocmNpYiA8PSAwKSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAibm90aGluZyB0byB3YWl0IGZvci5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIHJ2OworCX0KKwkvKiBzdG9wIHRyeWluZzogbm93ICsgdHdpY2UgdGhlIHRpbWUgaXQgd291bGQgbm9ybWFsbHkgdGFrZSArICBzZWNvbmRzICovCisJaWYgKHRpbWVvdXQgPT0gMCkgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWVuZF9qaWZmaWVzICA9IGppZmZpZXM7IAorCWlmICh0aW1lb3V0ICE9ICBNQVhfU0NIRURVTEVfVElNRU9VVCkKKwkJZW5kX2ppZmZpZXMgKz0gcG9ydC0+YmF1ZD8oMiAqIHJjaWIgKiAxMCAqIEhaIC8gcG9ydC0+YmF1ZCk6MDsKKwllbmRfamlmZmllcyArPSB0aW1lb3V0OworCisJZ3NfZHByaW50ayAoR1NfREVCVUdfRkxVU0gsICJub3c9JWx4LCBlbmQ9JWx4ICglbGQpLlxuIiwgCisJCSAgICBqaWZmaWVzLCBlbmRfamlmZmllcywgZW5kX2ppZmZpZXMtamlmZmllcyk7IAorCisJLyogdGhlIGV4cHJlc3Npb24gaXMgYWN0dWFsbHkgamlmZmllcyA8IGVuZF9qaWZmaWVzLCBidXQgdGhhdCB3b24ndAorCSAgIHdvcmsgYXJvdW5kIHRoZSB3cmFwYXJvdW5kLiBUcmlja3kgZWg/ICovCisJd2hpbGUgKChjaGFyc2xlZnQgPSBnc19yZWFsX2NoYXJzX2luX2J1ZmZlciAocG9ydC0+dHR5KSkgJiYKKwkgICAgICAgIHRpbWVfYWZ0ZXIgKGVuZF9qaWZmaWVzLCBqaWZmaWVzKSkgeworCQkvKiBVbml0cyBjaGVjazogCisJCSAgIGNoYXJzICogKGJpdHMvY2hhcikgKiAoamlmZmllcyAvc2VjKSAvIChiaXRzL3NlYykgPSBqaWZmaWVzIQorCQkgICBjaGVjayEgKi8KKworCQljaGFyc2xlZnQgKz0gMTY7IC8qIEFsbG93IDE2IGNoYXJzIG1vcmUgdG8gYmUgdHJhbnNtaXR0ZWQgLi4uICovCisJCWppZmZpZXNfdG9fdHJhbnNtaXQgPSBwb3J0LT5iYXVkPygxICsgY2hhcnNsZWZ0ICogMTAgKiBIWiAvIHBvcnQtPmJhdWQpOjA7CisJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl4gUm91bmQgdXAuLi4uICovCisJCWlmIChqaWZmaWVzX3RvX3RyYW5zbWl0IDw9IDApIGppZmZpZXNfdG9fdHJhbnNtaXQgPSAxOworCisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAiRXhwZWN0IHRvIGZpbmlzaCBpbiAlZCBqaWZmaWVzICIKKwkJCSAgICAiKCVkIGNoYXJzKS5cbiIsIGppZmZpZXNfdG9fdHJhbnNtaXQsIGNoYXJzbGVmdCk7IAorCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoamlmZmllc190b190cmFuc21pdCkpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgIlNpZ25hbCBwZW5kaW5nLiBCb21iaW5nIG91dDogIik7IAorCQkJcnYgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAiY2hhcnNsZWZ0ID0gJWQuXG4iLCBjaGFyc2xlZnQpOyAKKwlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiBydjsKK30KKworCisKK3ZvaWQgZ3NfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKworCS8qIFhYWCBXb3VsZCB0aGUgd3JpdGUgc2VtYXBob3JlIGRvPyAqLworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworCWZ1bmNfZXhpdCAoKTsKK30KKworCit2b2lkIGdzX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCisJZnVuY19lbnRlciAoKTsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKHBvcnQtPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCSAgICAhcG9ydC0+eG1pdF9idWYpIHsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm47CisJfQorCisJLyogQmVhdHMgbWUgLS0gUkVXICovCisJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47CisJcG9ydC0+cmQtPmVuYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKKwlmdW5jX2V4aXQgKCk7Cit9CisKKwordm9pZCBnc19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCisJZnVuY19lbnRlciAoKTsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKHBvcnQtPnhtaXRfY250ICYmIAorCSAgICBwb3J0LT54bWl0X2J1ZiAmJiAKKwkgICAgKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pICkgeworCQlwb3J0LT5mbGFncyAmPSB+R1NfVFhfSU5URU47CisJCXBvcnQtPnJkLT5kaXNhYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKwlmdW5jX2V4aXQgKCk7Cit9CisKKwordm9pZCBnc19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKHBvcnQtPnhtaXRfY250ICYmIAorCSAgICBwb3J0LT54bWl0X2J1ZiAmJiAKKwkgICAgIShwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKSApIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47CisJCXBvcnQtPnJkLT5lbmFibGVfdHhfaW50ZXJydXB0cyAocG9ydCk7CisJfQorCWZ1bmNfZXhpdCAoKTsKK30KKworCitzdGF0aWMgdm9pZCBnc19zaHV0ZG93bl9wb3J0IChzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCQorCWlmICghcG9ydCkgcmV0dXJuOworCQorCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCWlmIChwb3J0LT50dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CisKKwlwb3J0LT5yZC0+c2h1dGRvd25fcG9ydCAocG9ydCk7CisKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3ZvaWQgZ3NfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdzX3BvcnQgICAqcG9ydDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdHR5ID0gcG9ydC0+dHR5OworCWlmICghdHR5KSAKKwkJcmV0dXJuOworCisJZ3Nfc2h1dGRvd25fcG9ydCAocG9ydCk7CisJcG9ydC0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEdTX0FDVElWRSk7CisJcG9ydC0+dHR5ID0gTlVMTDsKKwlwb3J0LT5jb3VudCA9IDA7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJZnVuY19leGl0ICgpOworfQorCisKK2ludCBnc19ibG9ja190aWxfcmVhZHkodm9pZCAqcG9ydF8sIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IHBvcnRfOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCAgICByZXR2YWw7CisJaW50ICAgIGRvX2Nsb2NhbCA9IDA7CisJaW50ICAgIENEOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXBvcnQpIHJldHVybiAwOworCisJdHR5ID0gcG9ydC0+dHR5OworCisJaWYgKCF0dHkpIHJldHVybiAwOworCisJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiRW50ZXJpbmcgZ3NfYmxvY2tfdGlsbF9yZWFkeS5cbiIpOyAKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJhZnRlciBodW5nIHVwXG4iKTsgCisKKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCisJICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgorCSAqLworCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJICAgICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiYWZ0ZXIgbm9uYmxvY2tcbiIpOyAKKyAKKwlpZiAoQ19DTE9DQUwodHR5KSkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgcG9ydC0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJhZnRlciBhZGQgd2FpdHEuXG4iKTsgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXBvcnQtPmNvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJcG9ydC0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJQ0QgPSBwb3J0LT5yZC0+Z2V0X0NEIChwb3J0KTsKKwkJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiQ0QgaXMgbm93ICVkLlxuIiwgQ0QpOworCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCSAgICAoZG9fY2xvY2FsIHx8IENEKSkKKwkJCWJyZWFrOworCQlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJzaWduYWxfcGVuZGluZyBpcyBub3c6ICVkICglbHgpXG4iLCAKKwkJKGludClzaWduYWxfcGVuZGluZyAoY3VycmVudCksICoobG9uZyopKCZjdXJyZW50LT5ibG9ja2VkKSk7IAorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCWdzX2RwcmludGsgKEdTX0RFQlVHX0JUUiwgIkdvdCBvdXQgb2YgdGhlIGxvb3AuICglZClcbiIsCisJCSAgICBwb3J0LT5ibG9ja2VkX29wZW4pOworCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJcG9ydC0+Y291bnQrKzsKKwl9CisJcG9ydC0+YmxvY2tlZF9vcGVuLS07CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJZnVuY19leGl0ICgpOworCXJldHVybiAwOworfQkJCSAKKworCit2b2lkIGdzX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwkKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSAoc3RydWN0IGdzX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKCFwb3J0LT50dHkpIHsKKwkJLyogVGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB0aGlzIGlzIGNhbGxlZCBmcm9tIHZoYW5ndXAuICovCisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0NMT1NFLCAiZ3M6IE9kZDogcG9ydC0+dHR5IGlzIE5VTExcbiIpOworCQlwb3J0LT50dHkgPSB0dHk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAocG9ydC0+cmQtPmh1bmd1cCkKKwkJCXBvcnQtPnJkLT5odW5ndXAgKHBvcnQpOworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHBvcnQtPmNvdW50ICE9IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3M6IGdzX2Nsb3NlIHBvcnQgJXA6IGJhZCBwb3J0IGNvdW50OyIKKwkJICAgICAgICIgdHR5LT5jb3VudCBpcyAxLCBwb3J0IGNvdW50IGlzICVkXG4iLCBwb3J0LCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMTsKKwl9CisJaWYgKC0tcG9ydC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3M6IGdzX2Nsb3NlIHBvcnQgJXA6IGJhZCBwb3J0IGNvdW50OiAlZFxuIiwgcG9ydCwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDA7CisJfQorCisJaWYgKHBvcnQtPmNvdW50KSB7CisJCWdzX2RwcmludGsoR1NfREVCVUdfQ0xPU0UsICJnc19jbG9zZSBwb3J0ICVwOiBjb3VudDogJWRcbiIsIHBvcnQsIHBvcnQtPmNvdW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm47CisJfQorCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5IAorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwkvKiBpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCSAgIHR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0LT5jbG9zaW5nX3dhaXQpOyAqLworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisKKwlwb3J0LT5yZC0+ZGlzYWJsZV9yeF9pbnRlcnJ1cHRzIChwb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJLyogY2xvc2UgaGFzIG5vIHdheSBvZiByZXR1cm5pbmcgIkVJTlRSIiwgc28gZGlzY2FyZCByZXR1cm4gdmFsdWUgKi8KKwlpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQlnc193YWl0X3R4X2ZsdXNoZWQgKHBvcnQsIHBvcnQtPmNsb3Npbmdfd2FpdCk7CisKKwlwb3J0LT5mbGFncyAmPSB+R1NfQUNUSVZFOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCXR0eS0+Y2xvc2luZyA9IDA7CisKKwlwb3J0LT5ldmVudCA9IDA7CisJcG9ydC0+cmQtPmNsb3NlIChwb3J0KTsKKwlwb3J0LT5yZC0+c2h1dGRvd25fcG9ydCAocG9ydCk7CisJcG9ydC0+dHR5ID0gTlVMTDsKKworCWlmIChwb3J0LT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2Vjcyhwb3J0LT5jbG9zZV9kZWxheSkpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCX0KKwlwb3J0LT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyB8IEFTWU5DX0lOSVRJQUxJWkVEKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmNsb3NlX3dhaXQpOworCisJZnVuY19leGl0ICgpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgICAgIGdzX2JhdWRyYXRlc1tdID0geworICAwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisgIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMAorfTsKKworCit2b2lkIGdzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCWludCBiYXVkcmF0ZSwgdG1wLCBydjsKKwlzdHJ1Y3QgdGVybWlvcyAqdGlvc3A7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKwlpZiAoIXBvcnQtPnR0eSkgeworCQkvKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiB3aGVuIHRoaXMgaXMgY2FsbGVkIGFmdGVyIGdzX2Nsb3NlLiAqLworCQlnc19kcHJpbnRrIChHU19ERUJVR19URVJNSU9TLCAiZ3M6IE9kZDogcG9ydC0+dHR5IGlzIE5VTExcbiIpOworCQlwb3J0LT50dHkgPSB0dHk7CisJfQorCisKKwl0aW9zcCA9IHR0eS0+dGVybWlvczsKKworCWlmIChnc19kZWJ1ZyAmIEdTX0RFQlVHX1RFUk1JT1MpIHsKKwkJZ3NfZHByaW50ayAoR1NfREVCVUdfVEVSTUlPUywgInRlcm1pb3Mgc3RydWN0dXJlICglcCk6XG4iLCB0aW9zcCk7CisJfQorCisjaWYgMAorCS8qIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaXMgb25seSBhbGxvd2VkIGZvciBkdW1iIGNhcmRzICovCisJLyogU21hcnQgY2FyZHMgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgaWZsYWdzIGFuZCBvZmxhZ3MgdG9vOiB0aGF0IAorCSAgIG1pZ2h0IGNoYW5nZSBoYXJkd2FyZSBjb29raW5nIG1vZGUuLi4uICovCisjZW5kaWYKKwlpZiAob2xkX3Rlcm1pb3MpIHsKKwkJaWYoICAgKHRpb3NwLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQorCQkgICAmJiAodGlvc3AtPmNfb2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfb2ZsYWcpCisJCSAgICYmICh0aW9zcC0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkJICAgJiYgKHRpb3NwLT5jX2xmbGFnID09IG9sZF90ZXJtaW9zLT5jX2xmbGFnKQorCQkgICAmJiAodGlvc3AtPmNfbGluZSAgPT0gb2xkX3Rlcm1pb3MtPmNfbGluZSkKKwkJICAgJiYgKG1lbWNtcCh0aW9zcC0+Y19jYywgb2xkX3Rlcm1pb3MtPmNfY2MsIE5DQykgPT0gMCkpIHsKKwkJCWdzX2RwcmludGsoR1NfREVCVUdfVEVSTUlPUywgImdzX3NldF90ZXJtaW9zOiBvcHRpbWl6ZWQgYXdheVxuIik7CisJCQlyZXR1cm4gLyogMCAqLzsKKwkJfQorCX0gZWxzZSAKKwkJZ3NfZHByaW50ayhHU19ERUJVR19URVJNSU9TLCAiZ3Nfc2V0X3Rlcm1pb3M6IG5vIG9sZF90ZXJtaW9zOiAiCisJCSAgICAgICAgICAgIm5vIG9wdGltaXphdGlvblxuIik7CisKKwlpZihvbGRfdGVybWlvcyAmJiAoZ3NfZGVidWcgJiBHU19ERUJVR19URVJNSU9TKSkgeworCQlpZih0aW9zcC0+Y19pZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19pZmxhZykgIHByaW50aygiY19pZmxhZyBjaGFuZ2VkXG4iKTsKKwkJaWYodGlvc3AtPmNfb2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfb2ZsYWcpICBwcmludGsoImNfb2ZsYWcgY2hhbmdlZFxuIik7CisJCWlmKHRpb3NwLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSAgcHJpbnRrKCJjX2NmbGFnIGNoYW5nZWRcbiIpOworCQlpZih0aW9zcC0+Y19sZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19sZmxhZykgIHByaW50aygiY19sZmxhZyBjaGFuZ2VkXG4iKTsKKwkJaWYodGlvc3AtPmNfbGluZSAgIT0gb2xkX3Rlcm1pb3MtPmNfbGluZSkgICBwcmludGsoImNfbGluZSBjaGFuZ2VkXG4iKTsKKwkJaWYoIW1lbWNtcCh0aW9zcC0+Y19jYywgb2xkX3Rlcm1pb3MtPmNfY2MsIE5DQykpIHByaW50aygiY19jYyBjaGFuZ2VkXG4iKTsKKwl9CisKKwliYXVkcmF0ZSA9IHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQ7CisJaWYgKGJhdWRyYXRlICYgQ0JBVURFWCkgeworCQliYXVkcmF0ZSAmPSB+Q0JBVURFWDsKKwkJaWYgKChiYXVkcmF0ZSA8IDEpIHx8IChiYXVkcmF0ZSA+IDQpKQorCQkJdGlvc3AtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWRyYXRlICs9IDE1OworCX0KKworCWJhdWRyYXRlID0gZ3NfYmF1ZHJhdGVzW2JhdWRyYXRlXTsKKwlpZiAoKHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCkgeworCQlpZiAoICAgICAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJYmF1ZHJhdGUgPSA1NzYwMDsKKwkJZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkcmF0ZSA9IDExNTIwMDsKKwkJZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQliYXVkcmF0ZSA9IDIzMDQwMDsKKwkJZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJYmF1ZHJhdGUgPSA0NjA4MDA7CisJCWVsc2UgaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkKKwkJCWJhdWRyYXRlID0gKHBvcnQtPmJhdWRfYmFzZSAvIHBvcnQtPmN1c3RvbV9kaXZpc29yKTsKKwl9CisKKwkvKiBJIHJlY29tbWVuZCB1c2luZyBUSElTIGluc3RlYWQgb2YgdGhlIG1lc3MgaW4gdGVybWlvcyAoYW5kCisJICAgZHVwbGljYXRpbmcgdGhlIGFib3ZlIGNvZGUpLiBOZXh0IHdlIHNob3VsZCBjcmVhdGUgYSBjbGVhbgorCSAgIGludGVyZmFjZSB0b3dhcmRzIHRoaXMgdmFyaWFibGUuIElmIHlvdXIgY2FyZCBzdXBwb3J0cyBhcmJpdHJhcnkKKwkgICBiYXVkIHJhdGVzLCAoZS5nLiBDRDE0MDAgb3IgMTY1NTAgYmFzZWQgY2FyZHMpIHRoZW4gZXZlcnl0aGluZworCSAgIHdpbGwgYmUgdmVyeSBlYXN5Li4uLi4gKi8KKwlwb3J0LT5iYXVkID0gYmF1ZHJhdGU7CisKKwkvKiBUd28gdGltZXIgdGlja3Mgc2VlbXMgZW5vdWdoIHRvIHdha2V1cCBzb21ldGhpbmcgbGlrZSBTTElQIGRyaXZlciAqLworCS8qIEJhdWRyYXRlLzEwIGlzIGNwcy4gRGl2aWRlIGJ5IEhaIHRvIGdldCBjaGFycyBwZXIgdGljay4gKi8KKwl0bXAgPSAoYmF1ZHJhdGUgLyAxMCAvIEhaKSAqIDI7CQkJIAorCisJaWYgKHRtcCA8ICAgICAgICAgICAgICAgICAwKSB0bXAgPSAwOworCWlmICh0bXAgPj0gU0VSSUFMX1hNSVRfU0laRSkgdG1wID0gU0VSSUFMX1hNSVRfU0laRS0xOworCisJcG9ydC0+d2FrZXVwX2NoYXJzID0gdG1wOworCisJLyogV2Ugc2hvdWxkIHJlYWxseSB3YWl0IGZvciB0aGUgY2hhcmFjdGVycyB0byBiZSBhbGwgc2VudCBiZWZvcmUKKwkgICBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuIC0tIENBTCAqLworCXJ2ID0gZ3Nfd2FpdF90eF9mbHVzaGVkIChwb3J0LCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJaWYgKHJ2IDwgMCkgcmV0dXJuIC8qIHJ2ICovOworCisJcnYgPSBwb3J0LT5yZC0+c2V0X3JlYWxfdGVybWlvcyhwb3J0KTsKKwlpZiAocnYgPCAwKSByZXR1cm4gLyogcnYgKi87CisKKwlpZiAoKCFvbGRfdGVybWlvcyB8fCAKKwkgICAgIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSAmJgorCSAgICAhKCAgICAgIHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5zdG9wcGVkID0gMDsKKwkJZ3Nfc3RhcnQodHR5KTsKKwl9CisKKyNpZmRlZiB0eXRzb19wYXRjaF85NE5vdjI1XzE3MjYKKwkvKiBUaGlzICJtYWtlcyBzZW5zZSIsIFdoeSBpcyBpdCBjb21tZW50ZWQgb3V0PyAqLworCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisJICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmdzLm9wZW5fd2FpdCk7CisjZW5kaWYKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAvKiAwICovOworfQorCisKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KK2ludCBnc19pbml0X3BvcnQoc3RydWN0IGdzX3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlmdW5jX2VudGVyICgpOworCisgICAgICAgIGlmICghdG1wX2J1ZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7IC8qIERvbid0IGV4cGVjdCB0aGlzIHRvIG1ha2UgYSBkaWZmZXJlbmNlLiAqLworCQlpZiAodG1wX2J1ZikKKwkJCWZyZWVfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoIXRtcF9idWYpIHsKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwb3J0LT54bWl0X2J1ZikgeworCQkvKiBXZSBtYXkgc2xlZXAgaW4gZ2V0X3plcm9lZF9wYWdlKCkgKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJdG1wID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWlmIChwb3J0LT54bWl0X2J1ZikgCisJCQlmcmVlX3BhZ2UgKHRtcCk7CisJCWVsc2UKKwkJCXBvcnQtPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgdG1wOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoIXBvcnQtPnhtaXRfYnVmKSB7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+dHR5KSAKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCWluaXRfTVVURVgoJnBvcnQtPnBvcnRfd3JpdGVfc2VtKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlnc19zZXRfdGVybWlvcyhwb3J0LT50dHksIE5VTEwpOworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlwb3J0LT5mbGFncyAmPSB+R1NfVFhfSU5URU47CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZ3Nfc2V0c2VyaWFsKHN0cnVjdCBnc19wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNpbzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2lvLCBzcCwgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisJCXJldHVybigtRUZBVUxUKTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHNpby5iYXVkX2Jhc2UgIT0gcG9ydC0+YmF1ZF9iYXNlKSB8fAorCQkgICAgKHNpby5jbG9zZV9kZWxheSAhPSBwb3J0LT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICgoc2lvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuKC1FUEVSTSk7CisJfSAKKworCXBvcnQtPmZsYWdzID0gKHBvcnQtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCShzaW8uZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSyk7CisgIAorCXBvcnQtPmJhdWRfYmFzZSA9IHNpby5iYXVkX2Jhc2U7CisJcG9ydC0+Y2xvc2VfZGVsYXkgPSBzaW8uY2xvc2VfZGVsYXk7CisJcG9ydC0+Y2xvc2luZ193YWl0ID0gc2lvLmNsb3Npbmdfd2FpdDsKKwlwb3J0LT5jdXN0b21fZGl2aXNvciA9IHNpby5jdXN0b21fZGl2aXNvcjsKKworCWdzX3NldF90ZXJtaW9zIChwb3J0LT50dHksIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBHZW5lcmF0ZSB0aGUgc2VyaWFsIHN0cnVjdCBpbmZvLgorICovCisKK2ludCBnc19nZXRzZXJpYWwoc3RydWN0IGdzX3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgICAgc2lvOworCisJbWVtc2V0KCZzaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpOworCXNpby5mbGFncyA9IHBvcnQtPmZsYWdzOworCXNpby5iYXVkX2Jhc2UgPSBwb3J0LT5iYXVkX2Jhc2U7CisJc2lvLmNsb3NlX2RlbGF5ID0gcG9ydC0+Y2xvc2VfZGVsYXk7CisJc2lvLmNsb3Npbmdfd2FpdCA9IHBvcnQtPmNsb3Npbmdfd2FpdDsKKwlzaW8uY3VzdG9tX2Rpdmlzb3IgPSBwb3J0LT5jdXN0b21fZGl2aXNvcjsKKwlzaW8uaHViNiA9IDA7CisKKwkvKiBJZiB5b3Ugd2FudCB5b3UgY2FuIG92ZXJyaWRlIHRoZXNlLiAqLworCXNpby50eXBlID0gUE9SVF9VTktOT1dOOworCXNpby54bWl0X2ZpZm9fc2l6ZSA9IC0xOworCXNpby5saW5lID0gLTE7CisJc2lvLnBvcnQgPSAtMTsKKwlzaW8uaXJxID0gLTE7CisKKwlpZiAocG9ydC0+cmQtPmdldHNlcmlhbCkKKwkJcG9ydC0+cmQtPmdldHNlcmlhbCAocG9ydCwgJnNpbyk7CisKKwlpZiAoY29weV90b191c2VyKHNwLCAmc2lvLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworCit2b2lkIGdzX2dvdF9icmVhayhzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCkKK3sKKwlmdW5jX2VudGVyICgpOworCisJdHR5X2luc2VydF9mbGlwX2NoYXIocG9ydC0+dHR5LCAwLCBUVFlfQlJFQUspOworCXR0eV9zY2hlZHVsZV9mbGlwKHBvcnQtPnR0eSk7CisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKSB7CisJCWRvX1NBSyAocG9ydC0+dHR5KTsKKwl9CisKKwlmdW5jX2V4aXQgKCk7Cit9CisKKworRVhQT1JUX1NZTUJPTChnc19wdXRfY2hhcik7CitFWFBPUlRfU1lNQk9MKGdzX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woZ3Nfd3JpdGVfcm9vbSk7CitFWFBPUlRfU1lNQk9MKGdzX2NoYXJzX2luX2J1ZmZlcik7CitFWFBPUlRfU1lNQk9MKGdzX2ZsdXNoX2J1ZmZlcik7CitFWFBPUlRfU1lNQk9MKGdzX2ZsdXNoX2NoYXJzKTsKK0VYUE9SVF9TWU1CT0woZ3Nfc3RvcCk7CitFWFBPUlRfU1lNQk9MKGdzX3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0woZ3NfaGFuZ3VwKTsKK0VYUE9SVF9TWU1CT0woZ3NfYmxvY2tfdGlsX3JlYWR5KTsKK0VYUE9SVF9TWU1CT0woZ3NfY2xvc2UpOworRVhQT1JUX1NZTUJPTChnc19zZXRfdGVybWlvcyk7CitFWFBPUlRfU1lNQk9MKGdzX2luaXRfcG9ydCk7CitFWFBPUlRfU1lNQk9MKGdzX3NldHNlcmlhbCk7CitFWFBPUlRfU1lNQk9MKGdzX2dldHNlcmlhbCk7CitFWFBPUlRfU1lNQk9MKGdzX2dvdF9icmVhayk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5ydGMuYyBiL2RyaXZlcnMvY2hhci9nZW5ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EyYmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IKKyAqCQktIHE0MCBhbmQgb3RoZXIgbTY4ayBtYWNoaW5lcywKKyAqCQktIEhQIFBBUklTQyBtYWNoaW5lcworICoJCS0gUG93ZXJQQyBtYWNoaW5lcworICogICAgICBlbXVsYXRlIHNvbWUgUlRDIGlycSBjYXBhYmlsaXRpZXMgaW4gc29mdHdhcmUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIFppZGxpY2t5CisgKgorICoJYmFzZWQgb24gUGF1bCBHb3J0bWFrZXIncyBydGMuYyBkZXZpY2UgYW5kCisgKiAgICAgICAgICAgU2FtIENyZWFzZXkgR2VuZXJpYyBydGMgZHJpdmVyCisgKgorICoJVGhpcyBkcml2ZXIgYWxsb3dzIHVzZSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIChidWlsdCBpbnRvCisgKgluZWFybHkgYWxsIGNvbXB1dGVycykgZnJvbSB1c2VyIHNwYWNlLiBJdCBleHBvcnRzIHRoZSAvZGV2L3J0YworICoJaW50ZXJmYWNlIHN1cHBvcnRpbmcgdmFyaW91cyBpb2N0bCgpIGFuZCBhbHNvIHRoZSAvcHJvYy9kZXYvcnRjCisgKglwc2V1ZG8tZmlsZSBmb3Igc3RhdHVzIGluZm9ybWF0aW9uLgorICoKKyAqCVRoZSBpb2N0bHMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbnRlcnJ1cHQgYmVoYXZpb3VyIHdoZXJlCisgKglzdXBwb3J0ZWQuCisgKgorICoJVGhlIC9kZXYvcnRjIGludGVyZmFjZSB3aWxsIGJsb2NrIG9uIHJlYWRzIHVudGlsIGFuIGludGVycnVwdAorICoJaGFzIGJlZW4gcmVjZWl2ZWQuIElmIGEgUlRDIGludGVycnVwdCBoYXMgYWxyZWFkeSBoYXBwZW5lZCwKKyAqCWl0IHdpbGwgb3V0cHV0IGFuIHVuc2lnbmVkIGxvbmcgYW5kIHRoZW4gYmxvY2suIFRoZSBvdXRwdXQgdmFsdWUKKyAqCWNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZgorICoJaW50ZXJydXB0cyBzaW5jZSB0aGUgbGFzdCByZWFkIGluIHRoZSByZW1haW5pbmcgaGlnaCBieXRlcy4gVGhlCisgKgkvZGV2L3J0YyBpbnRlcmZhY2UgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBzZWxlY3QoMikgY2FsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKworICogICAgICAxLjAxIGZpeCBmb3IgMi4zLlggICAgICAgICAgICAgICAgICAgIHJ6QGxpbnV4LW02OGsub3JnCisgKiAgICAgIDEuMDIgbWVyZ2VkIHdpdGggY29kZSBmcm9tIGdlbnJ0Yy5jICAgcnpAbGludXgtbTY4ay5vcmcKKyAqICAgICAgMS4wMyBtYWtlIGl0IG1vcmUgcG9ydGFibGUgICAgICAgICAgICB6aXBwZWxAbGludXgtbTY4ay5vcmcKKyAqICAgICAgMS4wNCByZW1vdmVkIHVzZWxlc3MgdGltZXIgY29kZSAgICAgICByekBsaW51eC1tNjhrLm9yZworICogICAgICAxLjA1IHBvcnRhYmxlIFJUQ19VSUUgZW11bGF0aW9uICAgICAgIHJ6QGxpbnV4LW02OGsub3JnCisgKiAgICAgIDEuMDYgc2V0X3J0Y190aW1lIGNhbiByZXR1cm4gYW4gZXJyb3IgdHJpbmlAa2VybmVsLmNyYXNoaW5nLm9yZworICogICAgICAxLjA3IHBvcnRlZCB0byBIUCBQQVJJU0MgKGhwcGEpCSAgICAgIEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KKyAqLworCisjZGVmaW5lIFJUQ19WRVJTSU9OCSIxLjA3IgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisvKgorICoJV2Ugc3BvbmdlIGEgbWlub3Igb2ZmIG9mIHRoZSBtaXNjIG1ham9yLiBObyBuZWVkIHNsdXJwaW5nCisgKgl1cCBhbm90aGVyIHZhbHVhYmxlIG1ham9yIGRldiBudW1iZXIgZm9yIHRoaXMuIElmIHlvdSBhZGQKKyAqCWFuIGlvY3RsLCBtYWtlIHN1cmUgeW91IGRvbid0IGNvbmZsaWN0IHdpdGggU1BBUkMncyBSVEMKKyAqCWlvY3Rscy4KKyAqLworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ2VuX3J0Y193YWl0KTsKKworLyoKKyAqCUJpdHMgaW4gZ2VuX3J0Y19zdGF0dXMuCisgKi8KKworI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2VuX3J0Y19zdGF0dXM7CS8qIGJpdG1hcHBlZCBzdGF0dXMgYnl0ZS4JKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdlbl9ydGNfaXJxX2RhdGE7CS8qIG91ciBvdXRwdXQgdG8gdGhlIHdvcmxkCSovCisKKy8qIG1vbnRocyBzdGFydCBhdCAwIG5vdyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGF5c19pbl9tb1tdID0KK3szMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworc3RhdGljIGludCBpcnFfYWN0aXZlOworCisjaWZkZWYgQ09ORklHX0dFTl9SVENfWAorc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBnZW5ydGNfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl90YXNrOworCitzdGF0aWMgdW5zaWduZWQgaW50IG9sZHNlY3M7CitzdGF0aWMgaW50IGxvc3RpbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0dF9leHA7CisKK3N0YXRpYyB2b2lkIGdlbl9ydGNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHZvbGF0aWxlIGludCBzdGFza19hY3RpdmU7ICAgICAgICAgICAgICAvKiBzY2hlZHVsZV93b3JrICovCitzdGF0aWMgdm9sYXRpbGUgaW50IHR0YXNrX2FjdGl2ZTsgICAgICAgICAgICAgIC8qIHRpbWVyX3Rhc2sgKi8KK3N0YXRpYyBpbnQgc3RvcF9ydGNfdGltZXJzOyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcmVxdWV1ZSB0YXNrcyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhnZW5fcnRjX2xvY2spOworCitzdGF0aWMgdm9pZCBnZW5fcnRjX2ludGVycnVwdCh1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qCisgKiBSb3V0aW5lIHRvIHBvbGwgUlRDIHNlY29uZHMgZmllbGQgZm9yIGNoYW5nZSBhcyBvZnRlbiBhcyBwb3NzaWJsZSwKKyAqIGFmdGVyIGZpcnN0IFJUQ19VSUUgdXNlIHRpbWVyIHRvIHJlZHVjZSBwb2xsaW5nCisgKi8KK3N0YXRpYyB2b2lkIGdlbnJ0Y190cm91dGluZSh2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGludCB0bXAgPSBnZXRfcnRjX3NzKCk7CisJCisJaWYgKHN0b3BfcnRjX3RpbWVycykgeworCQlzdGFza19hY3RpdmUgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKG9sZHNlY3MgIT0gdG1wKXsKKwkJb2xkc2VjcyA9IHRtcDsKKworCQl0aW1lcl90YXNrLmZ1bmN0aW9uID0gZ2VuX3J0Y190aW1lcjsKKwkJdGltZXJfdGFzay5leHBpcmVzID0gamlmZmllcyArIEhaIC0gKEhaLzEwKTsKKwkJdHRfZXhwPXRpbWVyX3Rhc2suZXhwaXJlczsKKwkJdHRhc2tfYWN0aXZlPTE7CisJCXN0YXNrX2FjdGl2ZT0wOworCQlhZGRfdGltZXIoJnRpbWVyX3Rhc2spOworCisJCWdlbl9ydGNfaW50ZXJydXB0KDApOworCX0gZWxzZSBpZiAoc2NoZWR1bGVfd29yaygmZ2VucnRjX3Rhc2spID09IDApCisJCXN0YXNrX2FjdGl2ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9ydGNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWxvc3RpbnQgPSBnZXRfcnRjX3NzKCkgLSBvbGRzZWNzIDsKKwlpZiAobG9zdGludDwwKSAKKwkJbG9zdGludCA9IDYwIC0gbG9zdGludDsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0dF9leHApKQorCQlwcmludGsoS0VSTl9JTkZPICJnZW5ydGM6IHRpbWVyIHRhc2sgZGVsYXllZCBieSAlbGQgamlmZmllc1xuIiwKKwkJICAgICAgIGppZmZpZXMtdHRfZXhwKTsKKwl0dGFza19hY3RpdmU9MDsKKwlzdGFza19hY3RpdmU9MTsKKwlpZiAoKHNjaGVkdWxlX3dvcmsoJmdlbnJ0Y190YXNrKSA9PSAwKSkKKwkJc3Rhc2tfYWN0aXZlID0gMDsKK30KKworLyogCisgKiBjYWxsIGdlbl9ydGNfaW50ZXJydXB0IGZ1bmN0aW9uIHRvIHNpZ25hbCBhbiBSVENfVUlFLAorICogYXJnIGlzIHVudXNlZC4KKyAqIENvdWxkIGJlIGludm9rZWQgZWl0aGVyIGZyb20gYSByZWFsIGludGVycnVwdCBoYW5kbGVyIG9yCisgKiBmcm9tIHNvbWUgcm91dGluZSB0aGF0IHBlcmlvZGljYWxseSAoZWcgMTAwSFopIG1vbml0b3JzCisgKiB3aGV0aGVyIFJUQ19TRUNTIGNoYW5nZWQKKyAqLworc3RhdGljIHZvaWQgZ2VuX3J0Y19pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogIFdlIHN0b3JlIHRoZSBzdGF0dXMgaW4gdGhlIGxvdyBieXRlIGFuZCB0aGUgbnVtYmVyIG9mCisJICoJaW50ZXJydXB0cyByZWNlaXZlZCBzaW5jZSB0aGUgbGFzdCByZWFkIGluIHRoZSByZW1haW5kZXIKKwkgKglvZiBydGNfaXJxX2RhdGEuICAqLworCisJZ2VuX3J0Y19pcnFfZGF0YSArPSAweDEwMDsKKwlnZW5fcnRjX2lycV9kYXRhICY9IH4weGZmOworCWdlbl9ydGNfaXJxX2RhdGEgfD0gUlRDX1VJRTsKKworCWlmIChsb3N0aW50KXsKKwkJcHJpbnRrKCJnZW5ydGM6IHN5c3RlbSBkZWxheWluZyBjbG9jayB0aWNrcz9cbiIpOworCQkvKiBpbmNyZW1lbnQgY291bnQgc28gdGhhdCB1c2Vyc3BhY2Uga25vd3Mgc29tZXRoaW5nIGlzIHdyb25nICovCisJCWdlbl9ydGNfaXJxX2RhdGEgKz0gKChsb3N0aW50LTEpPDw4KTsKKwkJbG9zdGludCA9IDA7CisJfQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnZW5fcnRjX3dhaXQpOworfQorCisvKgorICoJTm93IGFsbCB0aGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgdGhhdCB3ZSBleHBvcnQuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGdlbl9ydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlzc2l6ZV90IHJldHZhbDsKKworCWlmIChjb3VudCAhPSBzaXplb2YgKHVuc2lnbmVkIGludCkgJiYgY291bnQgIT0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYgIWdlbl9ydGNfaXJxX2RhdGEpCisJCXJldHVybiAtRUFHQUlOOworCisJYWRkX3dhaXRfcXVldWUoJmdlbl9ydGNfd2FpdCwgJndhaXQpOworCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWRhdGEgPSB4Y2hnKCZnZW5fcnRjX2lycV9kYXRhLCAwKTsKKwkJaWYgKGRhdGEpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZ290byBvdXQ7CisJCXNjaGVkdWxlKCk7CisJfQorCisJLyogZmlyc3QgdGVzdCBhbGxvd3Mgb3B0aW1pemVyIHRvIG51a2UgdGhpcyBjYXNlIGZvciAzMi1iaXQgbWFjaGluZXMgKi8KKwlpZiAoc2l6ZW9mIChpbnQpICE9IHNpemVvZiAobG9uZykgJiYgY291bnQgPT0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSB7CisJCXVuc2lnbmVkIGludCB1aWRhdGEgPSBkYXRhOworCQlyZXR2YWwgPSBwdXRfdXNlcih1aWRhdGEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWJ1Zik7CisJfQorCWVsc2UgeworCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpOworCX0KKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworIG91dDoKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZ2VuX3J0Y193YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdlbl9ydGNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmZ2VuX3J0Y193YWl0LCB3YWl0KTsKKwlpZiAoZ2VuX3J0Y19pcnFfZGF0YSAhPSAwKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qCisgKiBVc2VkIHRvIGRpc2FibGUvZW5hYmxlIGludGVycnVwdHMsIG9ubHkgUlRDX1VJRSBzdXBwb3J0ZWQKKyAqIFdlIGFsc28gY2xlYXIgb3V0IGFueSBvbGQgaXJxIGRhdGEgYWZ0ZXIgYW4gaW9jdGwoKSB0aGF0CisgKiBtZWRkbGVzIHdpdGggdGhlIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBiaXRzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fY2xlYXJfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisjaWZkZWYgQ09ORklHX0dFTl9SVENfWAorCXN0b3BfcnRjX3RpbWVycyA9IDE7CisJaWYgKHR0YXNrX2FjdGl2ZSl7CisJCWRlbF90aW1lcl9zeW5jKCZ0aW1lcl90YXNrKTsKKwkJdHRhc2tfYWN0aXZlID0gMDsKKwl9CisJd2hpbGUgKHN0YXNrX2FjdGl2ZSkKKwkJc2NoZWR1bGUoKTsKKworCXNwaW5fbG9jaygmZ2VuX3J0Y19sb2NrKTsKKwlpcnFfYWN0aXZlID0gMDsKKwlzcGluX3VubG9jaygmZ2VuX3J0Y19sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBnZW5fc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGNoYXIgYml0KQoreworI2lmZGVmIENPTkZJR19HRU5fUlRDX1gKKwlzcGluX2xvY2soJmdlbl9ydGNfbG9jayk7CisJaWYgKCAhaXJxX2FjdGl2ZSApIHsKKwkJaXJxX2FjdGl2ZSA9IDE7CisJCXN0b3BfcnRjX3RpbWVycyA9IDA7CisJCWxvc3RpbnQgPSAwOworCQlJTklUX1dPUksoJmdlbnJ0Y190YXNrLCBnZW5ydGNfdHJvdXRpbmUsIE5VTEwpOworCQlvbGRzZWNzID0gZ2V0X3J0Y19zcygpOworCQlpbml0X3RpbWVyKCZ0aW1lcl90YXNrKTsKKworCQlzdGFza19hY3RpdmUgPSAxOworCQlpZiAoc2NoZWR1bGVfd29yaygmZ2VucnRjX3Rhc2spID09IDApeworCQkJc3Rhc2tfYWN0aXZlID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZ2VuX3J0Y19sb2NrKTsKKwlnZW5fcnRjX2lycV9kYXRhID0gMDsKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworc3RhdGljIGludCBnZW5fcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBydGNfdGltZSB3dGltZTsKKwlzdHJ1Y3QgcnRjX3BsbF9pbmZvIHBsbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFJUQ19QTExfR0VUOgorCSAgICBpZiAoZ2V0X3J0Y19wbGwoJnBsbCkpCisJIAkgICAgcmV0dXJuIC1FSU5WQUw7CisJICAgIGVsc2UKKwkJICAgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJnBsbCwgc2l6ZW9mIHBsbCkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgUlRDX1BMTF9TRVQ6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcGxsLCBhcmdwLCBzaXplb2YocGxsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkgICAgcmV0dXJuIHNldF9ydGNfcGxsKCZwbGwpOworCisJY2FzZSBSVENfVUlFX09GRjoJLyogZGlzYWJsZSBpbnRzIGZyb20gUlRDIHVwZGF0ZXMuCSovCisJCWdlbl9jbGVhcl9ydGNfaXJxX2JpdChSVENfVUlFKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJUQ19VSUVfT046CS8qIGVuYWJsZSBpbnRzIGZvciBSVEMgdXBkYXRlcy4JKi8KKwkgICAgICAgIHJldHVybiBnZW5fc2V0X3J0Y19pcnFfYml0KFJUQ19VSUUpOworCisJY2FzZSBSVENfUkRfVElNRToJLyogUmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCisJCS8qIHRoaXMgZG9lc24ndCBnZXQgd2Vlay1kYXksIHdobyBjYXJlcyAqLworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yod3RpbWUpKTsKKwkJZ2V0X3J0Y190aW1lKCZ3dGltZSk7CisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmd3RpbWUsIHNpemVvZih3dGltZSkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KKwkgICAgeworCQlpbnQgeWVhcjsKKwkJdW5zaWduZWQgY2hhciBsZWFwX3lyOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3dGltZSwgYXJncCwgc2l6ZW9mKHd0aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl5ZWFyID0gd3RpbWUudG1feWVhciArIDE5MDA7CisJCWxlYXBfeXIgPSAoKCEoeWVhciAlIDQpICYmICh5ZWFyICUgMTAwKSkgfHwKKwkJCSAgICEoeWVhciAlIDQwMCkpOworCisJCWlmICgod3RpbWUudG1fbW9uIDwgMCB8fCB3dGltZS50bV9tb24gPiAxMSkgfHwgKHd0aW1lLnRtX21kYXkgPCAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh3dGltZS50bV9tZGF5IDwgMCB8fCB3dGltZS50bV9tZGF5ID4KKwkJICAgIChkYXlzX2luX21vW3d0aW1lLnRtX21vbl0gKyAoKHd0aW1lLnRtX21vbiA9PSAxKSAmJiBsZWFwX3lyKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAod3RpbWUudG1faG91ciA8IDAgfHwgd3RpbWUudG1faG91ciA+PSAyNCB8fAorCQkgICAgd3RpbWUudG1fbWluIDwgMCB8fCB3dGltZS50bV9taW4gPj0gNjAgfHwKKwkJICAgIHd0aW1lLnRtX3NlYyA8IDAgfHwgd3RpbWUudG1fc2VjID49IDYwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIHNldF9ydGNfdGltZSgmd3RpbWUpOworCSAgICB9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBnZW5fcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGdlbl9ydGNfc3RhdHVzICYgUlRDX0lTX09QRU4pCisJCXJldHVybiAtRUJVU1k7CisKKwlnZW5fcnRjX3N0YXR1cyB8PSBSVENfSVNfT1BFTjsKKwlnZW5fcnRjX2lycV9kYXRhID0gMDsKKwlpcnFfYWN0aXZlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbl9ydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIG9uY2UgdGhlIGRldmljZSBpcyBubyBsb25nZXIKKwkgKiBpbiB1c2UgYW5kIGNsZWFyIHRoZSBkYXRhLgorCSAqLworCisJZ2VuX2NsZWFyX3J0Y19pcnFfYml0KFJUQ19QSUV8UlRDX0FJRXxSVENfVUlFKTsKKworCWdlbl9ydGNfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworLyoKKyAqCUluZm8gZXhwb3J0ZWQgdmlhICIvcHJvYy9ydGMiLgorICovCisKK3N0YXRpYyBpbnQgZ2VuX3J0Y19wcm9jX291dHB1dChjaGFyICpidWYpCit7CisJY2hhciAqcDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBydGNfcGxsX2luZm8gcGxsOworCisJcCA9IGJ1ZjsKKworCWZsYWdzID0gZ2V0X3J0Y190aW1lKCZ0bSk7CisKKwlwICs9IHNwcmludGYocCwKKwkJICAgICAicnRjX3RpbWVcdDogJTAyZDolMDJkOiUwMmRcbiIKKwkJICAgICAicnRjX2RhdGVcdDogJTA0ZC0lMDJkLSUwMmRcbiIKKwkJICAgICAicnRjX2Vwb2NoXHQ6ICUwNHVcbiIsCisJCSAgICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCSAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksIDE5MDApOworCisJdG0udG1faG91ciA9IHRtLnRtX21pbiA9IHRtLnRtX3NlYyA9IDA7CisKKwlwICs9IHNwcmludGYocCwgImFsYXJtXHRcdDogIik7CisJaWYgKHRtLnRtX2hvdXIgPD0gMjQpCisJCXAgKz0gc3ByaW50ZihwLCAiJTAyZDoiLCB0bS50bV9ob3VyKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiKio6Iik7CisKKwlpZiAodG0udG1fbWluIDw9IDU5KQorCQlwICs9IHNwcmludGYocCwgIiUwMmQ6IiwgdG0udG1fbWluKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiKio6Iik7CisKKwlpZiAodG0udG1fc2VjIDw9IDU5KQorCQlwICs9IHNwcmludGYocCwgIiUwMmRcbiIsIHRtLnRtX3NlYyk7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqXG4iKTsKKworCXAgKz0gc3ByaW50ZihwLAorCQkgICAgICJEU1RfZW5hYmxlXHQ6ICVzXG4iCisJCSAgICAgIkJDRFx0XHQ6ICVzXG4iCisJCSAgICAgIjI0aHJcdFx0OiAlc1xuIgorCQkgICAgICJzcXVhcmVfd2F2ZVx0OiAlc1xuIgorCQkgICAgICJhbGFybV9JUlFcdDogJXNcbiIKKwkJICAgICAidXBkYXRlX0lSUVx0OiAlc1xuIgorCQkgICAgICJwZXJpb2RpY19JUlFcdDogJXNcbiIKKwkJICAgICAicGVyaW9kaWNfZnJlcVx0OiAlbGRcbiIKKwkJICAgICAiYmF0dF9zdGF0dXNcdDogJXNcbiIsCisJCSAgICAgKGZsYWdzICYgUlRDX0RTVF9FTikgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGZsYWdzICYgUlRDX0RNX0JJTkFSWSkgPyAibm8iIDogInllcyIsCisJCSAgICAgKGZsYWdzICYgUlRDXzI0SCkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGZsYWdzICYgUlRDX1NRV0UpID8gInllcyIgOiAibm8iLAorCQkgICAgIChmbGFncyAmIFJUQ19BSUUpID8gInllcyIgOiAibm8iLAorCQkgICAgIGlycV9hY3RpdmUgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGZsYWdzICYgUlRDX1BJRSkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgMEwgLyogZnJlcSAqLywKKwkJICAgICAoZmxhZ3MgJiBSVENfQkFUVF9CQUQpID8gImJhZCIgOiAib2theSIpOworCWlmICghZ2V0X3J0Y19wbGwoJnBsbCkpCisJICAgIHAgKz0gc3ByaW50ZihwLAorCQkJICJQTEwgYWRqdXN0bWVudFx0OiAlZFxuIgorCQkJICJQTEwgbWF4ICt2ZSBhZGp1c3RtZW50XHQ6ICVkXG4iCisJCQkgIlBMTCBtYXggLXZlIGFkanVzdG1lbnRcdDogJWRcbiIKKwkJCSAiUExMICt2ZSBhZGp1c3RtZW50IGZhY3Rvclx0OiAlZFxuIgorCQkJICJQTEwgLXZlIGFkanVzdG1lbnQgZmFjdG9yXHQ6ICVkXG4iCisJCQkgIlBMTCBmcmVxdWVuY3lcdDogJWxkXG4iLAorCQkJIHBsbC5wbGxfdmFsdWUsCisJCQkgcGxsLnBsbF9tYXgsCisJCQkgcGxsLnBsbF9taW4sCisJCQkgcGxsLnBsbF9wb3NtdWx0LAorCQkJIHBsbC5wbGxfbmVnbXVsdCwKKwkJCSBwbGwucGxsX2Nsb2NrKTsKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBnZW5fcnRjX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gZ2VuX3J0Y19wcm9jX291dHB1dCAocGFnZSk7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCWxlbiAtPSBvZmY7CisgICAgICAgIGlmIChsZW4+Y291bnQpIGxlbiA9IGNvdW50OworICAgICAgICBpZiAobGVuPDApIGxlbiA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBfX2luaXQgZ2VuX3J0Y19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnI7CisKKwlyID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL3J0YyIsIDAsIE5VTEwsIGdlbl9ydGNfcmVhZF9wcm9jLCBOVUxMKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGdlbl9ydGNfcHJvY19pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZW5fcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19HRU5fUlRDX1gKKwkucmVhZAkJPSBnZW5fcnRjX3JlYWQsCisJLnBvbGwJCT0gZ2VuX3J0Y19wb2xsLAorI2VuZGlmCisJLmlvY3RsCQk9IGdlbl9ydGNfaW9jdGwsCisJLm9wZW4JCT0gZ2VuX3J0Y19vcGVuLAorCS5yZWxlYXNlCT0gZ2VuX3J0Y19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJ0Y19nZW5fZGV2ID0KK3sKKwkubWlub3IJCT0gUlRDX01JTk9SLAorCS5uYW1lCQk9ICJydGMiLAorCS5mb3BzCQk9ICZnZW5fcnRjX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydGNfZ2VuZXJpY19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXByaW50ayhLRVJOX0lORk8gIkdlbmVyaWMgUlRDIERyaXZlciB2JXNcbiIsIFJUQ19WRVJTSU9OKTsKKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnJ0Y19nZW5fZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGdlbl9ydGNfcHJvY19pbml0KCk7CisJaWYgKHJldHZhbCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19nZW5fZGV2KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJ0Y19nZW5lcmljX2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9ydGMiLCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19nZW5fZGV2KTsKK30KKworCittb2R1bGVfaW5pdChydGNfZ2VuZXJpY19pbml0KTsKK21vZHVsZV9leGl0KHJ0Y19nZW5lcmljX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFppZGxpY2t5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihSVENfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDZiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBoYW5nY2hlY2stdGltZXIuYworICoKKyAqIERyaXZlciBmb3IgYSBsaXR0bGUgaW8gZmVuY2luZyB0aW1lci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgT3JhY2xlIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IEpvZWwgQmVja2VyIDxqb2VsLmJlY2tlckBvcmFjbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKy8qCisgKiBUaGUgaGFuZ2NoZWNrLXRpbWVyIGRyaXZlciB1c2VzIHRoZSBUU0MgdG8gY2F0Y2ggZGVsYXlzIHRoYXQKKyAqIGppZmZpZXMgZG9lcyBub3Qgbm90aWNlLiAgQSB0aW1lciBpcyBzZXQuICBXaGVuIHRoZSB0aW1lciBmaXJlcywgaXQKKyAqIGNoZWNrcyB3aGV0aGVyIGl0IHdhcyBkZWxheWVkIGFuZCBpZiB0aGF0IGRlbGF5IGV4Y2VlZHMgYSBnaXZlbgorICogbWFyZ2luIG9mIGVycm9yLiAgVGhlIGhhbmdjaGVja190aWNrIG1vZHVsZSBwYXJhbXRlciB0YWtlcyB0aGUgdGltZXIKKyAqIGR1cmF0aW9uIGluIHNlY29uZHMuICBUaGUgaGFuZ2NoZWNrX21hcmdpbiBwYXJhbWV0ZXIgZGVmaW5lcyB0aGUKKyAqIG1hcmdpbiBvZiBlcnJvciwgaW4gc2Vjb25kcy4gIFRoZSBkZWZhdWx0cyBhcmUgNjAgc2Vjb25kcyBmb3IgdGhlCisgKiB0aW1lciBhbmQgMTgwIHNlY29uZHMgZm9yIHRoZSBtYXJnaW4gb2YgZXJyb3IuICBJT1csIGEgdGltZXIgaXMgc2V0CisgKiBmb3IgNjAgc2Vjb25kcy4gIFdoZW4gdGhlIHRpbWVyIGZpcmVzLCB0aGUgY2FsbGJhY2sgY2hlY2tzIHRoZQorICogYWN0dWFsIGR1cmF0aW9uIHRoYXQgdGhlIHRpbWVyIHdhaXRlZC4gIElmIHRoZSBkdXJhdGlvbiBleGNlZWRzIHRoZQorICogYWxsb3RlZCB0aW1lIGFuZCBtYXJnaW4gKGhlcmUgNjAgKyAxODAsIG9yIDI0MCBzZWNvbmRzKSwgdGhlIG1hY2hpbmUKKyAqIGlzIHJlc3RhcnRlZC4gIEEgaGVhbHRoeSBtYWNoaW5lIHdpbGwgaGF2ZSB0aGUgZHVyYXRpb24gbWF0Y2ggdGhlCisgKiBleHBlY3RlZCB0aW1lb3V0IHZlcnkgY2xvc2VseS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisjZGVmaW5lIFZFUlNJT05fU1RSICIwLjUuMCIKKworI2RlZmluZSBERUZBVUxUX0lPRkVOQ0VfTUFSR0lOIDYwCS8qIERlZmF1bHQgZnVkZ2UgZmFjdG9yLCBpbiBzZWNvbmRzICovCisjZGVmaW5lIERFRkFVTFRfSU9GRU5DRV9USUNLIDE4MAkvKiBEZWZhdWx0IHRpbWVyIHRpbWVvdXQsIGluIHNlY29uZHMgKi8KKworc3RhdGljIGludCBoYW5nY2hlY2tfdGljayA9IERFRkFVTFRfSU9GRU5DRV9USUNLOworc3RhdGljIGludCBoYW5nY2hlY2tfbWFyZ2luID0gREVGQVVMVF9JT0ZFTkNFX01BUkdJTjsKK3N0YXRpYyBpbnQgaGFuZ2NoZWNrX3JlYm9vdDsgIC8qIERlZmF1bHRzIHRvIG5vdCByZWJvb3QgKi8KKworLyogRHJpdmVyIG9wdGlvbnMgKi8KK21vZHVsZV9wYXJhbShoYW5nY2hlY2tfdGljaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGFuZ2NoZWNrX3RpY2ssICJUaW1lciBkZWxheS4iKTsKK21vZHVsZV9wYXJhbShoYW5nY2hlY2tfbWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoYW5nY2hlY2tfbWFyZ2luLCAiSWYgdGhlIGhhbmdjaGVjayB0aW1lciBoYXMgYmVlbiBkZWxheWVkIG1vcmUgdGhhbiBoYW5nY2hlY2tfbWFyZ2luIHNlY29uZHMsIHRoZSBkcml2ZXIgd2lsbCBmaXJlLiIpOworbW9kdWxlX3BhcmFtKGhhbmdjaGVja19yZWJvb3QsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhhbmdjaGVja19yZWJvb3QsICJJZiBub256ZXJvLCB0aGUgbWFjaGluZSB3aWxsIHJlYm9vdCB3aGVuIHRoZSB0aW1lciBtYXJnaW4gaXMgZXhjZWVkZWQuIik7CisKK01PRFVMRV9BVVRIT1IoIkpvZWwgQmVja2VyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhbmdjaGVjay10aW1lciBkZXRlY3RzIHdoZW4gdGhlIHN5c3RlbSBoYXMgZ29uZSBvdXQgdG8gbHVuY2ggcGFzdCBhIGNlcnRhaW4gbWFyZ2luLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIExhc3QgdGltZSBzY2hlZHVsZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaGFuZ2NoZWNrX3RzYywgaGFuZ2NoZWNrX3RzY19tYXJnaW47CisKK3N0YXRpYyB2b2lkIGhhbmdjaGVja19maXJlKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgaGFuZ2NoZWNrX3RpY2t0b2NrID0KKwkJVElNRVJfSU5JVElBTElaRVIoaGFuZ2NoZWNrX2ZpcmUsIDAsIDApOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9jayh2b2lkKTsKKworc3RhdGljIHZvaWQgaGFuZ2NoZWNrX2ZpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJfdHNjLCB0c2NfZGlmZjsKKworCWN1cl90c2MgPSBtb25vdG9uaWNfY2xvY2soKTsKKworCWlmIChjdXJfdHNjID4gaGFuZ2NoZWNrX3RzYykKKwkJdHNjX2RpZmYgPSBjdXJfdHNjIC0gaGFuZ2NoZWNrX3RzYzsKKwllbHNlCisJCXRzY19kaWZmID0gKGN1cl90c2MgKyAofjBVTEwgLSBoYW5nY2hlY2tfdHNjKSk7IC8qIG9yIHNvbWV0aGluZyAqLworCisJaWYgKHRzY19kaWZmID4gaGFuZ2NoZWNrX3RzY19tYXJnaW4pIHsKKwkJaWYgKGhhbmdjaGVja19yZWJvb3QpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkhhbmdjaGVjazogaGFuZ2NoZWNrIGlzIHJlc3RhcnRpbmcgdGhlIG1hY2hpbmUuXG4iKTsKKwkJCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkhhbmdjaGVjazogaGFuZ2NoZWNrIHZhbHVlIHBhc3QgbWFyZ2luIVxuIik7CisJCX0KKwl9CisJbW9kX3RpbWVyKCZoYW5nY2hlY2tfdGlja3RvY2ssIGppZmZpZXMgKyAoaGFuZ2NoZWNrX3RpY2sqSFopKTsKKwloYW5nY2hlY2tfdHNjID0gbW9ub3RvbmljX2Nsb2NrKCk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgaGFuZ2NoZWNrX2luaXQodm9pZCkKK3sKKwlwcmludGsoIkhhbmdjaGVjazogc3RhcnRpbmcgaGFuZ2NoZWNrIHRpbWVyICVzICh0aWNrIGlzICVkIHNlY29uZHMsIG1hcmdpbiBpcyAlZCBzZWNvbmRzKS5cbiIsCisJICAgICAgIFZFUlNJT05fU1RSLCBoYW5nY2hlY2tfdGljaywgaGFuZ2NoZWNrX21hcmdpbik7CisKKwloYW5nY2hlY2tfdHNjX21hcmdpbiA9IGhhbmdjaGVja19tYXJnaW4gKyBoYW5nY2hlY2tfdGljazsKKwloYW5nY2hlY2tfdHNjX21hcmdpbiAqPSAxMDAwMDAwMDAwOworCisKKwloYW5nY2hlY2tfdHNjID0gbW9ub3RvbmljX2Nsb2NrKCk7CisJbW9kX3RpbWVyKCZoYW5nY2hlY2tfdGlja3RvY2ssIGppZmZpZXMgKyAoaGFuZ2NoZWNrX3RpY2sqSFopKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoYW5nY2hlY2tfZXhpdCh2b2lkKQoreworCWRlbF90aW1lcl9zeW5jKCZoYW5nY2hlY2tfdGlja3RvY2spOworfQorCittb2R1bGVfaW5pdChoYW5nY2hlY2tfaW5pdCk7Cittb2R1bGVfZXhpdChoYW5nY2hlY2tfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWM3MzJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtMCwwICsxLDk5NCBAQAorLyoKKyAqIEludGVsICYgTVMgSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgSW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEludGVsIENvcnBvcmF0aW9uCisgKglWZW5raSBQYWxsaXBhZGkKKyAqIChjKSBDb3B5cmlnaHQgMjAwNCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICoJQm9iIFBpY2NvIDxyb2JlcnQucGljY29AaHAuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKworLyoKKyAqIFRoZSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciBkcml2ZXIuCisgKiBUaGlzIGRyaXZlciBpcyBjbG9zZWx5IG1vZGVsbGVkIGFmdGVyIHRoZSBydGMuYyBkcml2ZXIuCisgKiBodHRwOi8vd3d3LmludGVsLmNvbS9sYWJzL3BsYXRjb21wL2hwZXQvaHBldHNwZWMuaHRtCisgKi8KKyNkZWZpbmUJSFBFVF9VU0VSX0ZSRVEJKDY0KQorI2RlZmluZQlIUEVUX0RSSUZUCSg1MDApCisKK3N0YXRpYyB1MzIgaHBldF9udGltZXIsIGhwZXRfbmhwZXQsIGhwZXRfbWF4X2ZyZXEgPSBIUEVUX1VTRVJfRlJFUTsKKworLyogQSBsb2NrIGZvciBjb25jdXJyZW50IGFjY2VzcyBieSBhcHAgYW5kIGlzciBocGV0IGFjdGl2aXR5LiAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhocGV0X2xvY2spOworLyogQSBsb2NrIGZvciBjb25jdXJyZW50IGludGVybW9kdWxlIGFjY2VzcyB0byBocGV0IGFuZCBpc3IgaHBldCBhY3Rpdml0eS4gKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHBldF90YXNrX2xvY2spOworCisjZGVmaW5lCUhQRVRfREVWX05BTUUJKDcpCisKK3N0cnVjdCBocGV0X2RldiB7CisJc3RydWN0IGhwZXRzICpoZF9ocGV0czsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpoZF9ocGV0OworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKmhkX3RpbWVyOworCXVuc2lnbmVkIGxvbmcgaGRfaXJlcWZyZXE7CisJdW5zaWduZWQgbG9uZyBoZF9pcnFkYXRhOworCXdhaXRfcXVldWVfaGVhZF90IGhkX3dhaXRxdWV1ZTsKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqaGRfYXN5bmNfcXVldWU7CisJc3RydWN0IGhwZXRfdGFzayAqaGRfdGFzazsKKwl1bnNpZ25lZCBpbnQgaGRfZmxhZ3M7CisJdW5zaWduZWQgaW50IGhkX2lycTsKKwl1bnNpZ25lZCBpbnQgaGRfaGR3aXJxOworCWNoYXIgaGRfbmFtZVtIUEVUX0RFVl9OQU1FXTsKK307CisKK3N0cnVjdCBocGV0cyB7CisJc3RydWN0IGhwZXRzICpocF9uZXh0OworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwX2hwZXQ7CisJdW5zaWduZWQgbG9uZyBocF9ocGV0X3BoeXM7CisJc3RydWN0IHRpbWVfaW50ZXJwb2xhdG9yICpocF9pbnRlcnBvbGF0b3I7CisJdW5zaWduZWQgbG9uZyBocF9wZXJpb2Q7CisJdW5zaWduZWQgbG9uZyBocF9kZWx0YTsKKwl1bnNpZ25lZCBpbnQgaHBfbnRpbWVyOworCXVuc2lnbmVkIGludCBocF93aGljaDsKKwlzdHJ1Y3QgaHBldF9kZXYgaHBfZGV2WzFdOworfTsKKworc3RhdGljIHN0cnVjdCBocGV0cyAqaHBldHM7CisKKyNkZWZpbmUJSFBFVF9PUEVOCQkweDAwMDEKKyNkZWZpbmUJSFBFVF9JRQkJCTB4MDAwMgkvKiBpbnRlcnJ1cHQgZW5hYmxlZCAqLworI2RlZmluZQlIUEVUX1BFUklPRElDCQkweDAwMDQKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyNkZWZpbmUJd3JpdGVfY291bnRlcihWLCBNQykJd3JpdGVxKFYsIE1DKQorI2RlZmluZQlyZWFkX2NvdW50ZXIoTUMpCXJlYWRxKE1DKQorI2Vsc2UKKyNkZWZpbmUJd3JpdGVfY291bnRlcihWLCBNQykgCXdyaXRlbChWLCBNQykKKyNkZWZpbmUJcmVhZF9jb3VudGVyKE1DKQlyZWFkbChNQykKKyNlbmRpZgorCisjaWZuZGVmIHJlYWRxCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIF9faW5saW5lIHJlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwoYWRkcikgfCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpcmVhZGwoYWRkciArIDQpKSA8PCAzMkxMKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIHdyaXRlcQorc3RhdGljIHZvaWQgX19pbmxpbmUgd3JpdGVxKHVuc2lnbmVkIGxvbmcgbG9uZyB2LCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKHYgJiAweGZmZmZmZmZmLCBhZGRyKTsKKwl3cml0ZWwodiA+PiAzMiwgYWRkciArIDQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBocGV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJdW5zaWduZWQgbG9uZyBpc3I7CisKKwlkZXZwID0gZGF0YTsKKworCXNwaW5fbG9jaygmaHBldF9sb2NrKTsKKwlkZXZwLT5oZF9pcnFkYXRhKys7CisKKwkvKgorCSAqIEZvciBub24tcGVyaW9kaWMgdGltZXJzLCBpbmNyZW1lbnQgdGhlIGFjY3VtdWxhdG9yLgorCSAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdHJlYXRpbmcgbm9uLXBlcmlvZGljIGxpa2UgcGVyaW9kaWMuCisJICovCisJaWYgKChkZXZwLT5oZF9mbGFncyAmIChIUEVUX0lFIHwgSFBFVF9QRVJJT0RJQykpID09IEhQRVRfSUUpIHsKKwkJdW5zaWduZWQgbG9uZyBtLCB0OworCisJCXQgPSBkZXZwLT5oZF9pcmVxZnJlcTsKKwkJbSA9IHJlYWRfY291bnRlcigmZGV2cC0+aGRfaHBldC0+aHBldF9tYyk7CisJCXdyaXRlX2NvdW50ZXIodCArIG0gKyBkZXZwLT5oZF9ocGV0cy0+aHBfZGVsdGEsCisJCQkgICAgICAmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7CisJfQorCisJaXNyID0gKDEgPDwgKGRldnAgLSBkZXZwLT5oZF9ocGV0cy0+aHBfZGV2KSk7CisJd3JpdGVxKGlzciwgJmRldnAtPmhkX2hwZXQtPmhwZXRfaXNyKTsKKwlzcGluX3VubG9jaygmaHBldF9sb2NrKTsKKworCXNwaW5fbG9jaygmaHBldF90YXNrX2xvY2spOworCWlmIChkZXZwLT5oZF90YXNrKQorCQlkZXZwLT5oZF90YXNrLT5odF9mdW5jKGRldnAtPmhkX3Rhc2stPmh0X2RhdGEpOworCXNwaW5fdW5sb2NrKCZocGV0X3Rhc2tfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldnAtPmhkX3dhaXRxdWV1ZSk7CisKKwlraWxsX2Zhc3luYygmZGV2cC0+aGRfYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBocGV0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXN0cnVjdCBocGV0cyAqaHBldHA7CisJaW50IGk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWZvciAoZGV2cCA9IE5VTEwsIGhwZXRwID0gaHBldHM7IGhwZXRwICYmICFkZXZwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlmb3IgKGkgPSAwOyBpIDwgaHBldHAtPmhwX250aW1lcjsgaSsrKQorCQkJaWYgKGhwZXRwLT5ocF9kZXZbaV0uaGRfZmxhZ3MgJiBIUEVUX09QRU4KKwkJCSAgICB8fCBocGV0cC0+aHBfZGV2W2ldLmhkX3Rhc2spCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlkZXZwID0gJmhwZXRwLT5ocF9kZXZbaV07CisJCQkJYnJlYWs7CisJCQl9CisKKwlpZiAoIWRldnApIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldnA7CisJZGV2cC0+aGRfaXJxZGF0YSA9IDA7CisJZGV2cC0+aGRfZmxhZ3MgfD0gSFBFVF9PUEVOOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAoraHBldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXNzaXplX3QgcmV0dmFsOworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCFkZXZwLT5oZF9pcmVxZnJlcSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY291bnQgPCBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkX3dhaXRfcXVldWUoJmRldnAtPmhkX3dhaXRxdWV1ZSwgJndhaXQpOworCisJZm9yICggOyA7ICkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisJCWRhdGEgPSBkZXZwLT5oZF9pcnFkYXRhOworCQlkZXZwLT5oZF9pcnFkYXRhID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCisJCWlmIChkYXRhKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCisJcmV0dmFsID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworb3V0OgorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2cC0+aGRfd2FpdHF1ZXVlLCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhwZXRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJdW5zaWduZWQgbG9uZyB2OworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWRldnAtPmhkX2lyZXFmcmVxKQorCQlyZXR1cm4gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2cC0+aGRfd2FpdHF1ZXVlLCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisJdiA9IGRldnAtPmhkX2lycWRhdGE7CisJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCisJaWYgKHYgIT0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGV0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworI2lmZGVmCUNPTkZJR19IUEVUX01NQVAKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKCgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAhPSBQQUdFX1NJWkUpIHx8IHZtYS0+dm1fcGdvZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhZGRyID0gZGV2cC0+aGRfaHBldHMtPmhwX2hwZXRfcGh5czsKKworCWlmIChhZGRyICYgKFBBR0VfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlhZGRyID0gX19wYShhZGRyKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBhZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJCVBBR0VfU0laRSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVtYXBfcGZuX3JhbmdlIGZhaWxlZCBpbiBocGV0LmNcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC1FTk9TWVM7CisjZW5kaWYKK30KKworc3RhdGljIGludCBocGV0X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCisJZGV2cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmRldnAtPmhkX2FzeW5jX3F1ZXVlKSA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGhwZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJc3RydWN0IGhwZXRfdGltZXIgX19pb21lbSAqdGltZXI7CisJaW50IGlycSA9IDA7CisKKwlkZXZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXRpbWVyID0gZGV2cC0+aGRfdGltZXI7CisKKwlzcGluX2xvY2tfaXJxKCZocGV0X2xvY2spOworCisJd3JpdGVxKChyZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIH5Ubl9JTlRfRU5CX0NORl9NQVNLKSwKKwkgICAgICAgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisKKwlpcnEgPSBkZXZwLT5oZF9pcnE7CisJZGV2cC0+aGRfaXJxID0gMDsKKworCWRldnAtPmhkX2lyZXFmcmVxID0gMDsKKworCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMKKwkgICAgJiYgcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZykgJiBUbl9UWVBFX0NORl9NQVNLKSB7CisJCXVuc2lnbmVkIGxvbmcgdjsKKworCQl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCXYgXj0gVG5fVFlQRV9DTkZfTUFTSzsKKwkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCX0KKworCWRldnAtPmhkX2ZsYWdzICY9IH4oSFBFVF9PUEVOIHwgSFBFVF9JRSB8IEhQRVRfUEVSSU9ESUMpOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWlmIChpcnEpCisJCWZyZWVfaXJxKGlycSwgZGV2cCk7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykKKwkJaHBldF9mYXN5bmMoLTEsIGZpbGUsIDApOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGV0X2lvY3RsX2NvbW1vbihzdHJ1Y3QgaHBldF9kZXYgKiwgaW50LCB1bnNpZ25lZCBsb25nLCBpbnQpOworCitzdGF0aWMgaW50CitocGV0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGhwZXRfaW9jdGxfY29tbW9uKGRldnAsIGNtZCwgYXJnLCAwKTsKK30KKworc3RhdGljIGludCBocGV0X2lvY3RsX2llb24oc3RydWN0IGhwZXRfZGV2ICpkZXZwKQoreworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQ7CisJc3RydWN0IGhwZXRzICpocGV0cDsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgZywgdiwgdCwgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpc3I7CisKKwl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCWhwZXQgPSBkZXZwLT5oZF9ocGV0OworCWhwZXRwID0gZGV2cC0+aGRfaHBldHM7CisKKwl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfSUUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldnAtPmhkX2ZsYWdzIHw9IEhQRVRfSUU7CisJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCisJdCA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCWlycSA9IGRldnAtPmhkX2hkd2lycTsKKworCWlmIChpcnEpIHsKKwkJc3ByaW50ZihkZXZwLT5oZF9uYW1lLCAiaHBldCVkIiwgKGludCkoZGV2cCAtIGhwZXRwLT5ocF9kZXYpKTsKKworCQlpZiAocmVxdWVzdF9pcnEKKwkJICAgIChpcnEsIGhwZXRfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsIGRldnAtPmhkX25hbWUsICh2b2lkICopZGV2cCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaHBldDogSVJRICVkIGlzIG5vdCBmcmVlXG4iLCBpcnEpOworCQkJaXJxID0gMDsKKwkJfQorCX0KKworCWlmIChpcnEgPT0gMCkgeworCQlzcGluX2xvY2tfaXJxKCZocGV0X2xvY2spOworCQlkZXZwLT5oZF9mbGFncyBePSBIUEVUX0lFOworCQlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldnAtPmhkX2lycSA9IGlycTsKKwl0ID0gZGV2cC0+aGRfaXJlcWZyZXE7CisJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCWcgPSB2IHwgVG5fSU5UX0VOQl9DTkZfTUFTSzsKKworCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMpIHsKKwkJd3JpdGVfY291bnRlcih0LCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJCWcgfD0gVG5fVFlQRV9DTkZfTUFTSzsKKwkJdiB8PSBUbl9UWVBFX0NORl9NQVNLOworCQl3cml0ZXEodiwgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCXYgfD0gVG5fVkFMX1NFVF9DTkZfTUFTSzsKKwkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCW0gPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgaHBldHAtPmhwX2RlbHRhLCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJfSBlbHNlIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQltID0gcmVhZF9jb3VudGVyKCZocGV0LT5ocGV0X21jKTsKKwkJd3JpdGVfY291bnRlcih0ICsgbSArIGhwZXRwLT5ocF9kZWx0YSwgJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCX0KKworCWlzciA9ICgxIDw8IChkZXZwIC0gaHBldHMtPmhwX2RldikpOworCXdyaXRlcShpc3IsICZocGV0LT5ocGV0X2lzcik7CisJd3JpdGVxKGcsICZ0aW1lci0+aHBldF9jb25maWcpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHBldF90aW1lX2Rpdih1bnNpZ25lZCBsb25nIGRpcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbSA9IDEwMDAwMDAwMDAwMDAwMDBVTEw7CisKKwlkb19kaXYobSwgZGlzKTsKKworCXJldHVybiAodW5zaWduZWQgbG9uZyltOworfQorCitzdGF0aWMgaW50CitocGV0X2lvY3RsX2NvbW1vbihzdHJ1Y3QgaHBldF9kZXYgKmRldnAsIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQga2VybmVsKQoreworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQ7CisJc3RydWN0IGhwZXRzICpocGV0cDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIUEVUX0lFX09GRjoKKwljYXNlIEhQRVRfSU5GTzoKKwljYXNlIEhQRVRfRVBJOgorCWNhc2UgSFBFVF9EUEk6CisJY2FzZSBIUEVUX0lSUUZSRVE6CisJCXRpbWVyID0gZGV2cC0+aGRfdGltZXI7CisJCWhwZXQgPSBkZXZwLT5oZF9ocGV0OworCQlocGV0cCA9IGRldnAtPmhkX2hwZXRzOworCQlicmVhazsKKwljYXNlIEhQRVRfSUVfT046CisJCXJldHVybiBocGV0X2lvY3RsX2llb24oZGV2cCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIUEVUX0lFX09GRjoKKwkJaWYgKChkZXZwLT5oZF9mbGFncyAmIEhQRVRfSUUpID09IDApCisJCQlicmVhazsKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQl2ICY9IH5Ubl9JTlRfRU5CX0NORl9NQVNLOworCQl3cml0ZXEodiwgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCWlmIChkZXZwLT5oZF9pcnEpIHsKKwkJCWZyZWVfaXJxKGRldnAtPmhkX2lycSwgZGV2cCk7CisJCQlkZXZwLT5oZF9pcnEgPSAwOworCQl9CisJCWRldnAtPmhkX2ZsYWdzIF49IEhQRVRfSUU7CisJCWJyZWFrOworCWNhc2UgSFBFVF9JTkZPOgorCQl7CisJCQlzdHJ1Y3QgaHBldF9pbmZvIGluZm87CisKKwkJCWluZm8uaGlfaXJlcWZyZXEgPSBocGV0X3RpbWVfZGl2KGhwZXRwLT5ocF9wZXJpb2QgKgorCQkJCQkJCSBkZXZwLT5oZF9pcmVxZnJlcSk7CisJCQlpbmZvLmhpX2ZsYWdzID0KKwkJCSAgICByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIFRuX1BFUl9JTlRfQ0FQX01BU0s7CisJCQlpbmZvLmhpX2hwZXQgPSBkZXZwLT5oZF9ocGV0cy0+aHBfd2hpY2g7CisJCQlpbmZvLmhpX3RpbWVyID0gZGV2cCAtIGRldnAtPmhkX2hwZXRzLT5ocF9kZXY7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIUEVUX0VQSToKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQlpZiAoKHYgJiBUbl9QRVJfSU5UX0NBUF9NQVNLKSA9PSAwKSB7CisJCQllcnIgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCQlkZXZwLT5oZF9mbGFncyB8PSBIUEVUX1BFUklPRElDOworCQlicmVhazsKKwljYXNlIEhQRVRfRFBJOgorCQl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCWlmICgodiAmIFRuX1BFUl9JTlRfQ0FQX01BU0spID09IDApIHsKKwkJCWVyciA9IC1FTlhJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMgJiYKKwkJICAgIHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpICYgVG5fVFlQRV9DTkZfTUFTSykgeworCQkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQkJdiBePSBUbl9UWVBFX0NORl9NQVNLOworCQkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCQl9CisJCWRldnAtPmhkX2ZsYWdzICY9IH5IUEVUX1BFUklPRElDOworCQlicmVhazsKKwljYXNlIEhQRVRfSVJRRlJFUToKKwkJaWYgKCFrZXJuZWwgJiYgKGFyZyA+IGhwZXRfbWF4X2ZyZXEpICYmCisJCSAgICAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkgeworCQkJZXJyID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFyZyAmIChhcmcgLSAxKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2cC0+aGRfaXJlcWZyZXEgPSBocGV0X3RpbWVfZGl2KGhwZXRwLT5ocF9wZXJpb2QgKiBhcmcpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwZXRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5yZWFkID0gaHBldF9yZWFkLAorCS5wb2xsID0gaHBldF9wb2xsLAorCS5pb2N0bCA9IGhwZXRfaW9jdGwsCisJLm9wZW4gPSBocGV0X29wZW4sCisJLnJlbGVhc2UgPSBocGV0X3JlbGVhc2UsCisJLmZhc3luYyA9IGhwZXRfZmFzeW5jLAorCS5tbWFwID0gaHBldF9tbWFwLAorfTsKKworRVhQT1JUX1NZTUJPTChocGV0X2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woaHBldF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGhwZXRfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGhwZXRfY29udHJvbCk7CisKK2ludCBocGV0X3JlZ2lzdGVyKHN0cnVjdCBocGV0X3Rhc2sgKnRwLCBpbnQgcGVyaW9kaWMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTY0IG1hc2s7CisJc3RydWN0IGhwZXRfdGltZXIgX19pb21lbSAqdGltZXI7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXN0cnVjdCBocGV0cyAqaHBldHA7CisKKwlzd2l0Y2ggKHBlcmlvZGljKSB7CisJY2FzZSAxOgorCQltYXNrID0gVG5fUEVSX0lOVF9DQVBfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltYXNrID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCXNwaW5fbG9jaygmaHBldF9sb2NrKTsKKworCWZvciAoZGV2cCA9IE5VTEwsIGhwZXRwID0gaHBldHM7IGhwZXRwICYmICFkZXZwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlmb3IgKHRpbWVyID0gaHBldHAtPmhwX2hwZXQtPmhwZXRfdGltZXJzLCBpID0gMDsKKwkJICAgICBpIDwgaHBldHAtPmhwX250aW1lcjsgaSsrLCB0aW1lcisrKSB7CisJCQlpZiAoKHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpICYgVG5fUEVSX0lOVF9DQVBfTUFTSykKKwkJCSAgICAhPSBtYXNrKQorCQkJCWNvbnRpbnVlOworCisJCQlkZXZwID0gJmhwZXRwLT5ocF9kZXZbaV07CisKKwkJCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfT1BFTiB8fCBkZXZwLT5oZF90YXNrKSB7CisJCQkJZGV2cCA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXRwLT5odF9vcGFxdWUgPSBkZXZwOworCQkJZGV2cC0+aGRfdGFzayA9IHRwOworCQkJYnJlYWs7CisJCX0KKworCXNwaW5fdW5sb2NrKCZocGV0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCisJaWYgKHRwLT5odF9vcGFxdWUpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaHBldF90cGNoZWNrKHN0cnVjdCBocGV0X3Rhc2sgKnRwKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCisJZGV2cCA9IHRwLT5odF9vcGFxdWU7CisKKwlpZiAoIWRldnApCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGhwZXRwID0gaHBldHM7IGhwZXRwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlpZiAoZGV2cCA+PSBocGV0cC0+aHBfZGV2CisJCSAgICAmJiBkZXZwIDwgKGhwZXRwLT5ocF9kZXYgKyBocGV0cC0+aHBfbnRpbWVyKQorCQkgICAgJiYgZGV2cC0+aGRfaHBldCA9PSBocGV0cC0+aHBfaHBldCkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIC1FTlhJTzsKK30KKworaW50IGhwZXRfdW5yZWdpc3RlcihzdHJ1Y3QgaHBldF90YXNrICp0cCkKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJc3RydWN0IGhwZXRfdGltZXIgX19pb21lbSAqdGltZXI7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaHBldF90cGNoZWNrKHRwKSkpCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxKCZocGV0X3Rhc2tfbG9jayk7CisJc3Bpbl9sb2NrKCZocGV0X2xvY2spOworCisJZGV2cCA9IHRwLT5odF9vcGFxdWU7CisJaWYgKGRldnAtPmhkX3Rhc2sgIT0gdHApIHsKKwkJc3Bpbl91bmxvY2soJmhwZXRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXRpbWVyID0gZGV2cC0+aGRfdGltZXI7CisJd3JpdGVxKChyZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIH5Ubl9JTlRfRU5CX0NORl9NQVNLKSwKKwkgICAgICAgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJZGV2cC0+aGRfZmxhZ3MgJj0gfihIUEVUX0lFIHwgSFBFVF9QRVJJT0RJQyk7CisJZGV2cC0+aGRfdGFzayA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmhwZXRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZocGV0X3Rhc2tfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZXRfY29udHJvbChzdHJ1Y3QgaHBldF90YXNrICp0cCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGhwZXRfdHBjaGVjayh0cCkpKQorCQlyZXR1cm4gZXJyOworCisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKwlkZXZwID0gdHAtPmh0X29wYXF1ZTsKKwlpZiAoZGV2cC0+aGRfdGFzayAhPSB0cCkgeworCQlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKwlyZXR1cm4gaHBldF9pb2N0bF9jb21tb24oZGV2cCwgY21kLCBhcmcsIDEpOworfQorCitzdGF0aWMgY3RsX3RhYmxlIGhwZXRfdGFibGVbXSA9IHsKKwl7CisJIC5jdGxfbmFtZSA9IDEsCisJIC5wcm9jbmFtZSA9ICJtYXgtdXNlci1mcmVxIiwKKwkgLmRhdGEgPSAmaHBldF9tYXhfZnJlcSwKKwkgLm1heGxlbiA9IHNpemVvZihpbnQpLAorCSAubW9kZSA9IDA2NDQsCisJIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKKwkgfSwKKwl7LmN0bF9uYW1lID0gMH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaHBldF9yb290W10gPSB7CisJeworCSAuY3RsX25hbWUgPSAxLAorCSAucHJvY25hbWUgPSAiaHBldCIsCisJIC5tYXhsZW4gPSAwLAorCSAubW9kZSA9IDA1NTUsCisJIC5jaGlsZCA9IGhwZXRfdGFibGUsCisJIH0sCisJey5jdGxfbmFtZSA9IDB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGRldl9yb290W10gPSB7CisJeworCSAuY3RsX25hbWUgPSBDVExfREVWLAorCSAucHJvY25hbWUgPSAiZGV2IiwKKwkgLm1heGxlbiA9IDAsCisJIC5tb2RlID0gMDU1NSwKKwkgLmNoaWxkID0gaHBldF9yb290LAorCSB9LAorCXsuY3RsX25hbWUgPSAwfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxfaGVhZGVyOworCitzdGF0aWMgdm9pZCBocGV0X3JlZ2lzdGVyX2ludGVycG9sYXRvcihzdHJ1Y3QgaHBldHMgKmhwZXRwKQoreworI2lmZGVmCUNPTkZJR19USU1FX0lOVEVSUE9MQVRJT04KKwlzdHJ1Y3QgdGltZV9pbnRlcnBvbGF0b3IgKnRpOworCisJdGkgPSBrbWFsbG9jKHNpemVvZigqdGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpKQorCQlyZXR1cm47CisKKwltZW1zZXQodGksIDAsIHNpemVvZigqdGkpKTsKKwl0aS0+c291cmNlID0gVElNRV9TT1VSQ0VfTU1JTzY0OworCXRpLT5zaGlmdCA9IDEwOworCXRpLT5hZGRyID0gJmhwZXRwLT5ocF9ocGV0LT5ocGV0X21jOworCXRpLT5mcmVxdWVuY3kgPSBocGV0X3RpbWVfZGl2KGhwZXRzLT5ocF9wZXJpb2QpOworCXRpLT5kcmlmdCA9IHRpLT5mcmVxdWVuY3kgKiBIUEVUX0RSSUZUIC8gMTAwMDAwMDsKKwl0aS0+bWFzayA9IC0xOworCisJaHBldHAtPmhwX2ludGVycG9sYXRvciA9IHRpOworCXJlZ2lzdGVyX3RpbWVfaW50ZXJwb2xhdG9yKHRpKTsKKyNlbmRpZgorfQorCisvKgorICogQWRqdXN0bWVudCBmb3Igd2hlbiBhcm1pbmcgdGhlIHRpbWVyIHdpdGgKKyAqIGluaXRpYWwgY29uZGl0aW9ucy4gIFRoYXQgaXMsIG1haW4gY291bnRlcgorICogdGlja3MgZXhwaXJlZCBiZWZvcmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKyAqLworI2RlZmluZQlUSUNLX0NBTElCUkFURQkoMTAwMFVMKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X2NhbGlicmF0ZShzdHJ1Y3QgaHBldHMgKmhwZXRwKQoreworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHQsIG0sIGNvdW50LCBpLCBmbGFncywgc3RhcnQ7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCWludCBqOworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQ7CisKKwlmb3IgKGogPSAwLCBkZXZwID0gaHBldHAtPmhwX2RldjsgaiA8IGhwZXRwLT5ocF9udGltZXI7IGorKywgZGV2cCsrKQorCQlpZiAoKGRldnAtPmhkX2ZsYWdzICYgSFBFVF9PUEVOKSA9PSAwKSB7CisJCQl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCQkJYnJlYWs7CisJCX0KKworCWlmICghdGltZXIpCisJCXJldHVybiAwOworCisJaHBldCA9IGhwZXRzLT5ocF9ocGV0OworCXQgPSByZWFkX2NvdW50ZXIoJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCisJaSA9IDA7CisJY291bnQgPSBocGV0X3RpbWVfZGl2KGhwZXRwLT5ocF9wZXJpb2QgKiBUSUNLX0NBTElCUkFURSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdGFydCA9IHJlYWRfY291bnRlcigmaHBldC0+aHBldF9tYyk7CisKKwlkbyB7CisJCW0gPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgaHBldHAtPmhwX2RlbHRhLCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJfSB3aGlsZSAoaSsrLCAobSAtIHN0YXJ0KSA8IGNvdW50KTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAobSAtIHN0YXJ0KSAvIGk7Cit9CisKK2ludCBocGV0X2FsbG9jKHN0cnVjdCBocGV0X2RhdGEgKmhkcCkKK3sKKwl1NjQgY2FwLCBtY2ZnOworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwl1MzIgaSwgbnRpbWVyOworCXN0cnVjdCBocGV0cyAqaHBldHA7CisJc2l6ZV90IHNpejsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0OworCXN0YXRpYyBzdHJ1Y3QgaHBldHMgKmxhc3QgPSAoc3RydWN0IGhwZXRzICopMDsKKwl1bnNpZ25lZCBsb25nIG5zOworCisJLyoKKwkgKiBocGV0X2FsbG9jIGNhbiBiZSBjYWxsZWQgYnkgcGxhdGZvcm0gZGVwZW5kZW50IGNvZGUuCisJICogaWYgcGxhdGZvcm0gZGVwZW5kZW50IGNvZGUgaGFzIGFsbG9jYXRlZCB0aGUgaHBldAorCSAqIEFDUEkgYWxzbyByZXBvcnRzIGhwZXQsIHRoZW4gd2UgY2F0Y2ggaXQgaGVyZS4KKwkgKi8KKwlmb3IgKGhwZXRwID0gaHBldHM7IGhwZXRwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlpZiAoaHBldHAtPmhwX2hwZXQgPT0gaGRwLT5oZF9hZGRyZXNzKQorCQkJcmV0dXJuIDA7CisKKwlzaXogPSBzaXplb2Yoc3RydWN0IGhwZXRzKSArICgoaGRwLT5oZF9uaXJxcyAtIDEpICoKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGhwZXRfZGV2KSk7CisKKwlocGV0cCA9IGttYWxsb2Moc2l6LCBHRlBfS0VSTkVMKTsKKworCWlmICghaHBldHApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGhwZXRwLCAwLCBzaXopOworCisJaHBldHAtPmhwX3doaWNoID0gaHBldF9uaHBldCsrOworCWhwZXRwLT5ocF9ocGV0ID0gaGRwLT5oZF9hZGRyZXNzOworCWhwZXRwLT5ocF9ocGV0X3BoeXMgPSBoZHAtPmhkX3BoeXNfYWRkcmVzczsKKworCWhwZXRwLT5ocF9udGltZXIgPSBoZHAtPmhkX25pcnFzOworCisJZm9yIChpID0gMDsgaSA8IGhkcC0+aGRfbmlycXM7IGkrKykKKwkJaHBldHAtPmhwX2RldltpXS5oZF9oZHdpcnEgPSBoZHAtPmhkX2lycVtpXTsKKworCWhwZXQgPSBocGV0cC0+aHBfaHBldDsKKworCWNhcCA9IHJlYWRxKCZocGV0LT5ocGV0X2NhcCk7CisKKwludGltZXIgPSAoKGNhcCAmIEhQRVRfTlVNX1RJTV9DQVBfTUFTSykgPj4gSFBFVF9OVU1fVElNX0NBUF9TSElGVCkgKyAxOworCisJaWYgKGhwZXRwLT5ocF9udGltZXIgIT0gbnRpbWVyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwZXQ6IG51bWJlciBpcnFzIGRvZXNuJ3QgYWdyZWUiCisJCSAgICAgICAiIHdpdGggbnVtYmVyIG9mIHRpbWVyc1xuIik7CisJCWtmcmVlKGhwZXRwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGxhc3QpCisJCWxhc3QtPmhwX25leHQgPSBocGV0cDsKKwllbHNlCisJCWhwZXRzID0gaHBldHA7CisKKwlsYXN0ID0gaHBldHA7CisKKwlocGV0cC0+aHBfcGVyaW9kID0gKGNhcCAmIEhQRVRfQ09VTlRFUl9DTEtfUEVSSU9EX01BU0spID4+CisJICAgIEhQRVRfQ09VTlRFUl9DTEtfUEVSSU9EX1NISUZUOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaHBldCVkOiBhdCBNTUlPIDB4JWx4LCBJUlElcyIsCisJCWhwZXRwLT5ocF93aGljaCwgaGRwLT5oZF9waHlzX2FkZHJlc3MsCisJCWhwZXRwLT5ocF9udGltZXIgPiAxID8gInMiIDogIiIpOworCWZvciAoaSA9IDA7IGkgPCBocGV0cC0+aHBfbnRpbWVyOyBpKyspCisJCXByaW50aygiJXMgJWQiLCBpID4gMCA/ICIsIiA6ICIiLCBoZHAtPmhkX2lycVtpXSk7CisJcHJpbnRrKCJcbiIpOworCisJbnMgPSBocGV0cC0+aHBfcGVyaW9kOwkvKiBmZW1wdG9zZWNvbmRzLCAxMF4tMTUgKi8KKwlkb19kaXYobnMsIDEwMDAwMDApOwkvKiBjb252ZXJ0IHRvIG5hbm9zZWNvbmRzLCAxMF4tOSAqLworCXByaW50ayhLRVJOX0lORk8gImhwZXQlZDogJWxkbnMgdGljaywgJWQgJWQtYml0IHRpbWVyc1xuIiwKKwkJaHBldHAtPmhwX3doaWNoLCBucywgaHBldHAtPmhwX250aW1lciwKKwkJY2FwICYgSFBFVF9DT1VOVEVSX1NJWkVfTUFTSyA/IDY0IDogMzIpOworCisJbWNmZyA9IHJlYWRxKCZocGV0LT5ocGV0X2NvbmZpZyk7CisJaWYgKChtY2ZnICYgSFBFVF9FTkFCTEVfQ05GX01BU0spID09IDApIHsKKwkJd3JpdGVfY291bnRlcigwTCwgJmhwZXQtPmhwZXRfbWMpOworCQltY2ZnIHw9IEhQRVRfRU5BQkxFX0NORl9NQVNLOworCQl3cml0ZXEobWNmZywgJmhwZXQtPmhwZXRfY29uZmlnKTsKKwl9CisKKwlmb3IgKGkgPSAwLCBkZXZwID0gaHBldHAtPmhwX2RldjsgaSA8IGhwZXRwLT5ocF9udGltZXI7CisJICAgICBpKyssIGhwZXRfbnRpbWVyKyssIGRldnArKykgeworCQl1bnNpZ25lZCBsb25nIHY7CisJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCisJCXRpbWVyID0gJmhwZXQtPmhwZXRfdGltZXJzW2RldnAgLSBocGV0cC0+aHBfZGV2XTsKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCisJCWRldnAtPmhkX2hwZXRzID0gaHBldHA7CisJCWRldnAtPmhkX2hwZXQgPSBocGV0OworCQlkZXZwLT5oZF90aW1lciA9IHRpbWVyOworCisJCS8qCisJCSAqIElmIHRoZSB0aW1lciB3YXMgcmVzZXJ2ZWQgYnkgcGxhdGZvcm0gY29kZSwKKwkJICogdGhlbiBtYWtlIHRpbWVyIHVuYXZhaWxhYmxlIGZvciBvcGVucy4KKwkJICovCisJCWlmIChoZHAtPmhkX3N0YXRlICYgKDEgPDwgaSkpIHsKKwkJCWRldnAtPmhkX2ZsYWdzID0gSFBFVF9PUEVOOworCQkJY29udGludWU7CisJCX0KKworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZwLT5oZF93YWl0cXVldWUpOworCX0KKworCWhwZXRwLT5ocF9kZWx0YSA9IGhwZXRfY2FsaWJyYXRlKGhwZXRwKTsKKwlocGV0X3JlZ2lzdGVyX2ludGVycG9sYXRvcihocGV0cCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIGhwZXRfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhwZXRfZGF0YSAqaGRwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcjsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCisJaGRwID0gZGF0YTsKKworCXN0YXR1cyA9IGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlcywgJmFkZHIpOworCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQlzaXplID0gYWRkci5tYXhfYWRkcmVzc19yYW5nZSAtIGFkZHIubWluX2FkZHJlc3NfcmFuZ2UgKyAxOworCQloZHAtPmhkX3BoeXNfYWRkcmVzcyA9IGFkZHIubWluX2FkZHJlc3NfcmFuZ2U7CisJCWhkcC0+aGRfYWRkcmVzcyA9IGlvcmVtYXAoYWRkci5taW5fYWRkcmVzc19yYW5nZSwgc2l6ZSk7CisKKwkJZm9yIChocGV0cCA9IGhwZXRzOyBocGV0cDsgaHBldHAgPSBocGV0cC0+aHBfbmV4dCkKKwkJCWlmIChocGV0cC0+aHBfaHBldCA9PSBoZHAtPmhkX2FkZHJlc3MpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwl9IGVsc2UgaWYgKHJlcy0+aWQgPT0gQUNQSV9SU1RZUEVfRVhUX0lSUSkgeworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICppcnFwOworCQlpbnQgaTsKKworCQlpcnFwID0gJnJlcy0+ZGF0YS5leHRlbmRlZF9pcnE7CisKKwkJaWYgKGlycXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgeworCQkJaGRwLT5oZF9uaXJxcyA9IGlycXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOworCisJCQlmb3IgKGkgPSAwOyBpIDwgaGRwLT5oZF9uaXJxczsgaSsrKQorCQkJCWhkcC0+aGRfaXJxW2ldID0KKwkJCQkgICAgYWNwaV9yZWdpc3Rlcl9nc2koaXJxcC0+aW50ZXJydXB0c1tpXSwKKwkJCQkJCSAgICAgIGlycXAtPmVkZ2VfbGV2ZWwsCisJCQkJCQkgICAgICBpcnFwLT5hY3RpdmVfaGlnaF9sb3cpOworCQl9CisJfQorCisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgaW50IGhwZXRfYWNwaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJYWNwaV9zdGF0dXMgcmVzdWx0OworCXN0cnVjdCBocGV0X2RhdGEgZGF0YTsKKworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworCXJlc3VsdCA9CisJICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkJaHBldF9yZXNvdXJjZXMsICZkYXRhKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRhdGEuaGRfYWRkcmVzcyB8fCAhZGF0YS5oZF9uaXJxcykgeworCQlwcmludGsoIiVzOiBubyBhZGRyZXNzIG9yIGlycXMgaW4gX0NSU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGhwZXRfYWxsb2MoJmRhdGEpOworfQorCitzdGF0aWMgaW50IGhwZXRfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCS8qIFhYWCBuZWVkIHRvIHVucmVnaXN0ZXIgaW50ZXJwb2xhdG9yLCBkZWFsbG9jIG1lbSwgZXRjICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgaHBldF9hY3BpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJocGV0IiwKKwkuaWRzID0gIlBOUDAxMDMiLAorCS5vcHMgPSB7CisJCS5hZGQgPSBocGV0X2FjcGlfYWRkLAorCQkucmVtb3ZlID0gaHBldF9hY3BpX3JlbW92ZSwKKwkJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBocGV0X21pc2MgPSB7IEhQRVRfTUlOT1IsICJocGV0IiwgJmhwZXRfZm9wcyB9OworCitzdGF0aWMgaW50IF9faW5pdCBocGV0X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gbWlzY19yZWdpc3RlcigmaHBldF9taXNjKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGRldl9yb290LCAwKTsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaHBldF9hY3BpX2RyaXZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJaWYgKHN5c2N0bF9oZWFkZXIpCisJCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZocGV0X21pc2MpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaHBldF9leGl0KHZvaWQpCit7CisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmhwZXRfYWNwaV9kcml2ZXIpOworCisJaWYgKHN5c2N0bF9oZWFkZXIpCisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bF9oZWFkZXIpOworCW1pc2NfZGVyZWdpc3RlcigmaHBldF9taXNjKTsKKworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQoaHBldF9pbml0KTsKK21vZHVsZV9leGl0KGhwZXRfZXhpdCk7CitNT0RVTEVfQVVUSE9SKCJCb2IgUGljY28gPFJvYmVydC5QaWNjb0BocC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Y2Q4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtMCwwICsxLDgzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwMSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBZGRpdGlvbmFsIEF1dGhvcihzKToKKyAqICBSeWFuIFMuIEFybm9sZCA8cnNhQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKKyNkZWZpbmUgSFZDX01BSk9SCTIyOQorI2RlZmluZSBIVkNfTUlOT1IJMAorCisjZGVmaW5lIFRJTUVPVVQJCSgxMCkKKworLyoKKyAqIFdhaXQgdGhpcyBsb25nIHBlciBpdGVyYXRpb24gd2hpbGUgdHJ5aW5nIHRvIHB1c2ggYnVmZmVyZWQgZGF0YSB0byB0aGUKKyAqIGh5cGVydmlzb3IgYmVmb3JlIGFsbG93aW5nIHRoZSB0dHkgdG8gY29tcGxldGUgYSBjbG9zZSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgSFZDX0NMT1NFX1dBSVQgKEhaLzEwMCkgLyogMS8xMCBvZiBhIHNlY29uZCAqLworCisvKgorICogVGhlIExpbnV4IFRUWSBjb2RlIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBhZGRpdGlvbiBvZiB0dHkgZGVyaXZlZCBkZXZpY2VzCisgKiBzbyB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgdHR5IGRldmljZXMgd2UgbWlnaHQgbmVlZCB3aGVuIHNwYWNlIGlzIGFsbG9jYXRlZAorICogZm9yIHRoZSB0dHkgZGV2aWNlLiAgU2luY2UgdGhpcyBkcml2ZXIgc3VwcG9ydHMgaG90cGx1ZyBvZiB2dHkgYWRhcHRlcnMgd2UKKyAqIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGFsbG9jYXRlZC4KKyAqLworI2RlZmluZSBIVkNfQUxMT0NfVFRZX0FEQVBURVJTCTgKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodmNfZHJpdmVyOworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorc3RhdGljIGludCBzeXNycV9wcmVzc2VkOworI2VuZGlmCisKKyNkZWZpbmUgTl9PVVRCVUYJMTYKKyNkZWZpbmUgTl9JTkJVRgkJMTYKKworI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpCisKK3N0cnVjdCBodmNfc3RydWN0IHsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IGluZGV4OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IGNvdW50OworCWludCBkb193YWtldXA7CisJY2hhciBvdXRidWZbTl9PVVRCVUZdIF9fQUxJR05FRF9fOworCWludCBuX291dGJ1ZjsKKwl1aW50MzJfdCB2dGVybW5vOworCWludCBpcnFfcmVxdWVzdGVkOworCWludCBpcnE7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OworCXN0cnVjdCBrb2JqZWN0IGtvYmo7IC8qIHJlZiBjb3VudCAmIGh2Y19zdHJ1Y3QgbGlmZXRpbWUgKi8KKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKK307CisKKy8qIGR5bmFtaWMgbGlzdCBvZiBodmNfc3RydWN0IGluc3RhbmNlcyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaHZjX3N0cnVjdHMgPSBMSVNUX0hFQURfSU5JVChodmNfc3RydWN0cyk7CisKKy8qCisgKiBQcm90ZWN0IHRoZSBsaXN0IG9mIGh2Y19zdHJ1Y3QgaW5zdGFuY2VzIGZyb20gaW5zZXJ0cyBhbmQgcmVtb3ZhbHMgZHVyaW5nCisgKiBsaXN0IHRyYXZlcnNhbC4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhodmNfc3RydWN0c19sb2NrKTsKKworLyoKKyAqIEluaXRpYWwgY29uc29sZSB2dGVybW5vcyBmb3IgY29uc29sZSBBUEkgdXNhZ2UgcHJpb3IgdG8gZnVsbCBjb25zb2xlCisgKiBpbml0aWFsaXphdGlvbi4gIEFueSB2dHkgYWRhcHRlciBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBub3QgaGF2ZSB1c2FibGUKKyAqIGNvbnNvbGUgaW50ZXJmYWNlcyBidXQgY2FuIHN0aWxsIGJlIHVzZWQgYXMgYSB0dHkgZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUKKyAqIHN0YXRpYyBiZWNhdXNlIGttYWxsb2Mgd2lsbCBub3Qgd29yayBkdXJpbmcgZWFybHkgY29uc29sZSBpbml0LgorICovCitzdGF0aWMgdWludDMyX3QgdnRlcm1ub3NbTUFYX05SX0hWQ19DT05TT0xFU107CisKKy8qIFVzZWQgZm9yIGFjY291bnRpbmcgcHVycG9zZXMgKi8KK3N0YXRpYyBpbnQgbnVtX3Z0ZXJtcyA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh2Y190YXNrOworCisvKgorICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIHR0eS0+aW5kZXggdmFsdWUgdG8gYSBodmNfc3RydWN0IGJhc2VkCisgKiB1cG9uIG9yZGVyIG9mIGV4cG9zdXJlIHZpYSBodmNfcHJvYmUoKS4KKyAqLworc3RhdGljIGludCBodmNfY291bnQgPSAtMTsKKworLyogUGlja3MgdXAgbGF0ZSBraWNrcyBhZnRlciBsaXN0IHdhbGsgYnV0IGJlZm9yZSBzY2hlZHVsZSgpICovCitzdGF0aWMgaW50IGh2Y19raWNrZWQ7CisKKy8qIFdha2UgdGhlIHNsZWVwaW5nIGtodmNkICovCitzdGF0aWMgdm9pZCBodmNfa2ljayh2b2lkKQoreworCWh2Y19raWNrZWQgPSAxOworCXdha2VfdXBfcHJvY2VzcyhodmNfdGFzayk7Cit9CisKKy8qCisgKiBOT1RFOiBUaGlzIEFQSSBpc24ndCB1c2VkIGlmIHRoZSBjb25zb2xlIGFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdHMuCisgKiBJbiB0aGlzIGNhc2UgdGhlIGNvbnNvbGUgaXMgcG9sbCBkcml2ZW4uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodmNfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWh2Y19raWNrKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBodmNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWh2Y19raWNrKCk7Cit9CisKKy8qCisgKiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZWl0aGVyIHRoZSBodmNfc3RydWNzdF9sb2NrIG9yIHRoZSBodmNfc3RydWN0CisgKiBsb2NrIGhlbGQuICBJZiBzdWNjZXNzZnVsLCB0aGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGtvYmplY3QgcmVmZXJlbmNlCisgKiBjb3VudCBhZ2FpbnN0IHRoZSB0YXJnZXQgaHZjX3N0cnVjdCBzbyBpdCBzaG91bGQgYmUgcmVsZWFzZWQgd2hlbiBmaW5pc2hlZC4KKyAqLworc3RydWN0IGh2Y19zdHJ1Y3QgKmh2Y19nZXRfYnlfaW5kZXgoaW50IGluZGV4KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZodmNfc3RydWN0cywgbmV4dCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGhwLT5pbmRleCA9PSBpbmRleCkgeworCQkJa29iamVjdF9nZXQoJmhwLT5rb2JqKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJCQlyZXR1cm4gaHA7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwl9CisJaHAgPSBOVUxMOworCisJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCXJldHVybiBocDsKK30KKworLyoKKyAqIFRoZSBUVFkgaW50ZXJmYWNlIHdvbid0IGJlIHVzZWQgdW50aWwgYWZ0ZXIgdGhlIHZpbyBsYXllciBoYXMgZXhwb3NlZCB0aGUgdnR5CisgKiBhZGFwdGVyIHRvIHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbnQgaHZjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpcnEgPSBOT19JUlE7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qga29iamVjdCAqa29ianA7CisKKwkvKiBBdXRvIGluY3JlbWVudHMga29iamVjdCByZWZlcmVuY2UgaWYgZm91bmQuICovCisJaWYgKCEoaHAgPSBodmNfZ2V0X2J5X2luZGV4KHR0eS0+aW5kZXgpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJodmNfY29uc29sZTogdHR5IG9wZW4gZmFpbGVkLCBubyB2dHkgYXNzb2NpYXRlZCB3aXRoIHR0eS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkvKiBDaGVjayBhbmQgdGhlbiBpbmNyZW1lbnQgZm9yIGZhc3QgcGF0aCBvcGVuLiAqLworCWlmIChocC0+Y291bnQrKyA+IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJaHZjX2tpY2soKTsKKwkJcmV0dXJuIDA7CisJfSAvKiBlbHNlIGNvdW50ID09IDAgKi8KKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBocDsKKwlocC0+dHR5ID0gdHR5OworCS8qIFNhdmUgZm9yIHJlcXVlc3RfaXJxIG91dHNpZGUgb2Ygc3Bpbl9sb2NrLiAqLworCWlycSA9IGhwLT5pcnE7CisJaWYgKGlycSAhPSBOT19JUlEpCisJCWhwLT5pcnFfcmVxdWVzdGVkID0gMTsKKworCWtvYmpwID0gJmhwLT5rb2JqOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkvKiBjaGVjayBlcnJvciwgZmFsbGJhY2sgdG8gbm9uLWlycSAqLworCWlmIChpcnEgIT0gTk9fSVJRKQorCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgaHZjX2hhbmRsZV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgImh2Y19jb25zb2xlIiwgaHApOworCisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdF9pcnEoKSBmYWlscyBhbmQgd2UgcmV0dXJuIGFuIGVycm9yLiAgVGhlIHR0eSBsYXllcgorCSAqIHdpbGwgY2FsbCBodmNfY2xvc2UoKSBhZnRlciBhIGZhaWxlZCBvcGVuIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNsZWFuCisJICogdXAgdGhlcmUgc28gd2UnbGwgY2xlYW4gdXAgaGVyZSBhbmQgY2xlYXIgb3V0IHRoZSBwcmV2aW91c2x5IHNldAorCSAqIHR0eSBmaWVsZHMgYW5kIHJldHVybiB0aGUga29iamVjdCByZWZlcmVuY2UuCisJICovCisJaWYgKHJjKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCQlocC0+dHR5ID0gTlVMTDsKKwkJaHAtPmlycV9yZXF1ZXN0ZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJa29iamVjdF9wdXQoa29ianApOworCQlwcmludGsoS0VSTl9FUlIgImh2Y19vcGVuOiByZXF1ZXN0X2lycSBmYWlsZWQgd2l0aCByYyAlZC5cbiIsIHJjKTsKKwl9CisJLyogRm9yY2Ugd2FrZXVwIG9mIHRoZSBwb2xsaW5nIHRocmVhZCAqLworCWh2Y19raWNrKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKwlpbnQgaXJxID0gTk9fSVJROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBObyBkcml2ZXJfZGF0YSBtZWFucyB0aGF0IHRoaXMgY2xvc2Ugd2FzIGlzc3VlZCBhZnRlciBhIGZhaWxlZAorCSAqIGh2Y19vcGVuIGJ5IHRoZSB0dHkgbGF5ZXIncyByZWxlYXNlX2RldigpIGZ1bmN0aW9uIGFuZCB3ZSBjYW4ganVzdAorCSAqIGV4aXQgY2xlYW5seSBiZWNhdXNlIHRoZSBrb2JqZWN0IHJlZmVyZW5jZSB3YXNuJ3QgbWFkZS4KKwkgKi8KKwlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpCisJCXJldHVybjsKKworCWhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWtvYmpwID0gJmhwLT5rb2JqOworCWlmICgtLWhwLT5jb3VudCA9PSAwKSB7CisJCWlmIChocC0+aXJxX3JlcXVlc3RlZCkKKwkJCWlycSA9IGhwLT5pcnE7CisJCWhwLT5pcnFfcmVxdWVzdGVkID0gMDsKKworCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSB0dHkgcG9pbnRlciBub3cuICovCisJCWhwLT50dHkgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIENoYWluIGNhbGxzIGNoYXJzX2luX2J1ZmZlcigpIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5IGlmCisJCSAqIHRoZXJlIGlzIG5vIGJ1ZmZlcmVkIGRhdGEgb3RoZXJ3aXNlIHNsZWVwcyBvbiBhIHdhaXQgcXVldWUKKwkJICogd2FraW5nIHBlcmlvZGljYWxseSB0byBjaGVjayBjaGFyc19pbl9idWZmZXIoKS4KKwkJICovCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBIVkNfQ0xPU0VfV0FJVCk7CisKKwkJaWYgKGlycSAhPSBOT19JUlEpCisJCQlmcmVlX2lycShpcnEsIGhwKTsKKworCX0gZWxzZSB7CisJCWlmIChocC0+Y291bnQgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJodmNfY2xvc2UgJVg6IG9vcHMsIGNvdW50IGlzICVkXG4iLAorCQkJCWhwLT52dGVybW5vLCBocC0+Y291bnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCX0KKworCWtvYmplY3RfcHV0KGtvYmpwKTsKK30KKworc3RhdGljIHZvaWQgaHZjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXJxID0gTk9fSVJROworCWludCB0ZW1wX29wZW5fY291bnQ7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCisJaWYgKCFocCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFRoZSBOX1RUWSBsaW5lIGRpc2NpcGxpbmUgaGFzIHByb2JsZW1zIHN1Y2ggdGhhdCBpbiBhIGNsb3NlIHZzCisJICogb3Blbi0+aGFuZ3VwIGNhc2UgdGhpcyBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoZSBmaW5hbCBjbG9zZSBzbyBwcmV2ZW50CisJICogdGhhdCBmcm9tIGhhcHBlbmluZyBmb3Igbm93LgorCSAqLworCWlmIChocC0+Y291bnQgPD0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJa29ianAgPSAmaHAtPmtvYmo7CisJdGVtcF9vcGVuX2NvdW50ID0gaHAtPmNvdW50OworCWhwLT5jb3VudCA9IDA7CisJaHAtPm5fb3V0YnVmID0gMDsKKwlocC0+dHR5ID0gTlVMTDsKKwlpZiAoaHAtPmlycV9yZXF1ZXN0ZWQpCisJCS8qIFNhdmVkIGZvciB1c2Ugb3V0c2lkZSBvZiBzcGluX2xvY2suICovCisJCWlycSA9IGhwLT5pcnE7CisJaHAtPmlycV9yZXF1ZXN0ZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJaWYgKGlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKGlycSwgaHApOworCXdoaWxlKHRlbXBfb3Blbl9jb3VudCkgeworCQktLXRlbXBfb3Blbl9jb3VudDsKKwkJa29iamVjdF9wdXQoa29ianApOworCX0KK30KKworLyoKKyAqIFB1c2ggYnVmZmVyZWQgY2hhcmFjdGVycyB3aGV0aGVyIHRoZXkgd2VyZSBqdXN0IHJlY2VudGx5IGJ1ZmZlcmVkIG9yIHdhaXRpbmcKKyAqIG9uIGEgYmxvY2tlZCBoeXBlcnZpc29yLiAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggaHAtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgaHZjX3B1c2goc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKQoreworCWludCBuOworCisJbiA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CisJaWYgKG4gPD0gMCkgeworCQlpZiAobiA9PSAwKQorCQkJcmV0dXJuOworCQkvKiB0aHJvdyBhd2F5IG91dHB1dCBvbiBlcnJvcjsgdGhpcyBoYXBwZW5zIHdoZW4KKwkJICAgdGhlcmUgaXMgbm8gc2Vzc2lvbiBjb25uZWN0ZWQgdG8gdGhlIHZ0ZXJtLiAqLworCQlocC0+bl9vdXRidWYgPSAwOworCX0gZWxzZQorCQlocC0+bl9vdXRidWYgLT0gbjsKKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJbWVtbW92ZShocC0+b3V0YnVmLCBocC0+b3V0YnVmICsgbiwgaHAtPm5fb3V0YnVmKTsKKwllbHNlCisJCWhwLT5kb193YWtldXAgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2h2Y193cml0ZV9rZXJuZWwoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLAorCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJzaXplLCB3cml0dGVuID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJLyogUHVzaCBwZW5kaW5nIHdyaXRlcyAqLworCWlmIChocC0+bl9vdXRidWYgPiAwKQorCQlodmNfcHVzaChocCk7CisKKwl3aGlsZSAoY291bnQgPiAwICYmIChyc2l6ZSA9IE5fT1VUQlVGIC0gaHAtPm5fb3V0YnVmKSA+IDApIHsKKwkJaWYgKHJzaXplID4gY291bnQpCisJCQlyc2l6ZSA9IGNvdW50OworCQltZW1jcHkoaHAtPm91dGJ1ZiArIGhwLT5uX291dGJ1ZiwgYnVmLCByc2l6ZSk7CisJCWNvdW50IC09IHJzaXplOworCQlidWYgKz0gcnNpemU7CisJCWhwLT5uX291dGJ1ZiArPSByc2l6ZTsKKwkJd3JpdHRlbiArPSByc2l6ZTsKKwkJaHZjX3B1c2goaHApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CitzdGF0aWMgaW50IGh2Y193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWludCB3cml0dGVuOworCisJLyogVGhpcyB3cml0ZSB3YXMgcHJvYmFibHkgZXhlY3V0ZWQgZHVyaW5nIGEgdHR5IGNsb3NlLiAqLworCWlmICghaHApCisJCXJldHVybiAtRVBJUEU7CisKKwlpZiAoaHAtPmNvdW50IDw9IDApCisJCXJldHVybiAtRUlPOworCisJd3JpdHRlbiA9IF9faHZjX3dyaXRlX2tlcm5lbChocCwgYnVmLCBjb3VudCk7CisKKwkvKgorCSAqIFJhY3ksIGJ1dCBoYXJtbGVzcywga2ljayB0aHJlYWQgaWYgdGhlcmUgaXMgc3RpbGwgcGVuZGluZyBkYXRhLgorCSAqIFRoZXJlIHJlYWxseSBpcyBub3RoaW5nIHdyb25nIHdpdGgga2lja2luZyB0aGUgdGhyZWFkLCBldmVuIGlmIHRoZXJlCisJICogaXMgbm8gYnVmZmVyZWQgZGF0YS4KKwkgKi8KKwlpZiAoaHAtPm5fb3V0YnVmKQorCQlodmNfa2ljaygpOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8qCisgKiBUaGlzIGlzIGFjdHVhbGx5IGEgY29udHJhY3QgYmV0d2VlbiB0aGUgZHJpdmVyIGFuZCB0aGUgdHR5IGxheWVyIG91dGxpbmluZworICogaG93IG11Y2ggd3JpdGUgcm9vbSB0aGUgZHJpdmVyIGNhbiBndWFyZW50ZWUgd2lsbCBiZSBzZW50IE9SIEJVRkZFUkVELiAgVGhpcworICogZHJpdmVyIE1VU1QgaG9ub3IgdGhlIHJldHVybiB2YWx1ZS4KKyAqLworc3RhdGljIGludCBodmNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWhwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gTl9PVVRCVUYgLSBocC0+bl9vdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgaHZjX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWhwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGhwLT5uX291dGJ1ZjsKK30KKworI2RlZmluZSBIVkNfUE9MTF9SRUFECTB4MDAwMDAwMDEKKyNkZWZpbmUgSFZDX1BPTExfV1JJVEUJMHgwMDAwMDAwMgorI2RlZmluZSBIVkNfUE9MTF9RVUlDSwkweDAwMDAwMDA0CisKK3N0YXRpYyBpbnQgaHZjX3BvbGwoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGksIG4sIHBvbGxfbWFzayA9IDA7CisJY2hhciBidWZbTl9JTkJVRl0gX19BTElHTkVEX187CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVhZF90b3RhbCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFB1c2ggcGVuZGluZyB3cml0ZXMgKi8KKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJaHZjX3B1c2goaHApOworCS8qIFJlc2NoZWR1bGUgdXMgaWYgc3RpbGwgc29tZSB3cml0ZSBwZW5kaW5nICovCisJaWYgKGhwLT5uX291dGJ1ZiA+IDApCisJCXBvbGxfbWFzayB8PSBIVkNfUE9MTF9XUklURTsKKworCS8qIE5vIHR0eSBhdHRhY2hlZCwganVzdCBza2lwICovCisJdHR5ID0gaHAtPnR0eTsKKwlpZiAodHR5ID09IE5VTEwpCisJCWdvdG8gYmFpbDsKKworCS8qIE5vdyBjaGVjayBpZiB3ZSBjYW4gZ2V0IGRhdGEgKGFyZSB3ZSB0aHJvdHRsZWQgPykgKi8KKwlpZiAodGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKQorCQlnb3RvIHRocm90dGxlZDsKKworCS8qIElmIHdlIGFyZW4ndCBpbnRlcnJ1cHQgZHJpdmVuIGFuZCBhcmVuJ3QgdGhyb3R0bGVkLCB3ZSBhbHdheXMKKwkgKiByZXF1ZXN0IGEgcmVzY2hlZHVsZQorCSAqLworCWlmIChocC0+aXJxID09IE5PX0lSUSkKKwkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1JFQUQ7CisKKwkvKiBSZWFkIGRhdGEgaWYgYW55ICovCisJZm9yICg7OykgeworCQlpbnQgY291bnQgPSBOX0lOQlVGOworCQlpZiAoY291bnQgPiAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkpCisJCQljb3VudCA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQ7CisKKwkJLyogSWYgZmxpcCBpcyBmdWxsLCBqdXN0IHJlc2NoZWR1bGUgYSBsYXRlciByZWFkICovCisJCWlmIChjb3VudCA9PSAwKSB7CisJCQlwb2xsX21hc2sgfD0gSFZDX1BPTExfUkVBRDsKKwkJCWJyZWFrOworCQl9CisKKwkJbiA9IGh2Y19nZXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGJ1ZiwgY291bnQpOworCQlpZiAobiA8PSAwKSB7CisJCQkvKiBIYW5ndXAgdGhlIHR0eSB3aGVuIGRpc2Nvbm5lY3RlZCBmcm9tIGhvc3QgKi8KKwkJCWlmIChuID09IC1FUElQRSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCQkJdHR5X2hhbmd1cCh0dHkpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorCQkJLyogSGFuZGxlIHRoZSBTeXNScSBIYWNrICovCisJCQlpZiAoYnVmW2ldID09ICdceDBmJykgewkvKiBeTyAtLSBzaG91bGQgc3VwcG9ydCBhIHNlcXVlbmNlICovCisJCQkJc3lzcnFfcHJlc3NlZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHN5c3JxX3ByZXNzZWQpIHsKKwkJCQloYW5kbGVfc3lzcnEoYnVmW2ldLCBOVUxMLCB0dHkpOworCQkJCXN5c3JxX3ByZXNzZWQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8qIENPTkZJR19NQUdJQ19TWVNSUSAqLworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBidWZbaV0sIDApOworCQl9CisKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCkKKwkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisKKwkJLyoKKwkJICogQWNjb3VudCBmb3IgdGhlIHRvdGFsIGFtb3VudCByZWFkIGluIG9uZSBsb29wLCBhbmQgaWYgYWJvdmUKKwkJICogNjQgYnl0ZXMsIHdlIGRvIGEgcXVpY2sgc2NoZWR1bGUgbG9vcCB0byBsZXQgdGhlIHR0eSBncm9rIHRoZQorCQkgKiBkYXRhIGFuZCBldmVudHVhbGx5IHRocm90dGxlIHVzLgorCQkgKi8KKwkJcmVhZF90b3RhbCArPSBuOworCQlpZiAocmVhZF90b3RhbCA+PSA2NCkgeworCQkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1FVSUNLOworCQkJYnJlYWs7CisJCX0KKwl9CisgdGhyb3R0bGVkOgorCS8qIFdha2V1cCB3cml0ZSBxdWV1ZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoaHAtPmRvX3dha2V1cCkgeworCQlocC0+ZG9fd2FrZXVwID0gMDsKKwkJdHR5X3dha2V1cCh0dHkpOworCX0KKyBiYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcG9sbF9tYXNrOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfWE1PTikgJiYgZGVmaW5lZChDT05GSUdfU01QKQorZXh0ZXJuIGNwdW1hc2tfdCBjcHVzX2luX3htb247CisjZWxzZQorc3RhdGljIGNvbnN0IGNwdW1hc2tfdCBjcHVzX2luX3htb24gPSBDUFVfTUFTS19OT05FOworI2VuZGlmCisKKy8qCisgKiBUaGlzIGt0aHJlYWQgaXMgZWl0aGVyIHBvbGxpbmcgb3IgaW50ZXJydXB0IGRyaXZlbi4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieQorICogY2FsbGluZyBodmNfcG9sbCgpIHdobyBkZXRlcm1pbmVzIHdoZXRoZXIgYSBjb25zb2xlIGFkYXB0ZXIgc3VwcG9ydAorICogaW50ZXJydXB0cy4KKyAqLworaW50IGtodmNkKHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgcG9sbF9tYXNrOworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlkbyB7CisJCXBvbGxfbWFzayA9IDA7CisJCWh2Y19raWNrZWQgPSAwOworCQl3bWIoKTsKKwkJaWYgKGNwdXNfZW1wdHkoY3B1c19pbl94bW9uKSkgeworCQkJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZodmNfc3RydWN0cywgbmV4dCkgeworCQkJCS8qaHAgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBodmNfc3RydWN0LCAqIG5leHQpOyAqLworCQkJCXBvbGxfbWFzayB8PSBodmNfcG9sbChocCk7CisJCQl9CisJCQlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJCX0gZWxzZQorCQkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1JFQUQ7CisJCWlmIChodmNfa2lja2VkKQorCQkJY29udGludWU7CisJCWlmIChwb2xsX21hc2sgJiBIVkNfUE9MTF9RVUlDSykgeworCQkJeWllbGQoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghaHZjX2tpY2tlZCkgeworCQkJaWYgKHBvbGxfbWFzayA9PSAwKQorCQkJCXNjaGVkdWxlKCk7CisJCQllbHNlCisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoVElNRU9VVCk7CisJCX0KKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaHZjX29wcyA9IHsKKwkub3BlbiA9IGh2Y19vcGVuLAorCS5jbG9zZSA9IGh2Y19jbG9zZSwKKwkud3JpdGUgPSBodmNfd3JpdGUsCisJLmhhbmd1cCA9IGh2Y19oYW5ndXAsCisJLnVudGhyb3R0bGUgPSBodmNfdW50aHJvdHRsZSwKKwkud3JpdGVfcm9vbSA9IGh2Y193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBodmNfY2hhcnNfaW5fYnVmZmVyLAorfTsKKworY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YT0geworCXsic2VyaWFsIiwgImh2dGVybTEifSwKKwl7IE5VTEwsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjX2RyaXZlcl90YWJsZSk7CisKKy8qIGNhbGxiYWNrIHdoZW4gdGhlIGtib2plY3QgcmVmIGNvdW50IHJlYWNoZXMgemVyby4gKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjX3N0cnVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGh2Y19zdHJ1Y3QsIGtvYmopOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJihocC0+bmV4dCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisKKwlrZnJlZShocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGh2Y19rb2JqX3R5cGUgPSB7CisJLnJlbGVhc2UgPSBkZXN0cm95X2h2Y19zdHJ1Y3QsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBodmNfcHJvYmUoCisJCXN0cnVjdCB2aW9fZGV2ICpkZXYsCisJCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisKKwkvKiBwcm9iZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMuICovCisJaWYgKCFkZXYgfHwgIWlkKQorCQlyZXR1cm4gLUVQRVJNOworCisJaHAgPSBrbWFsbG9jKHNpemVvZigqaHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChocCwgMHgwMCwgc2l6ZW9mKCpocCkpOworCWhwLT52dGVybW5vID0gZGV2LT51bml0X2FkZHJlc3M7CisJaHAtPnZkZXYgPSBkZXY7CisJaHAtPnZkZXYtPmRldi5kcml2ZXJfZGF0YSA9IGhwOworCWhwLT5pcnEgPSBkZXYtPmlycTsKKworCWtvYmplY3RfaW5pdCgmaHAtPmtvYmopOworCWhwLT5rb2JqLmt0eXBlID0gJmh2Y19rb2JqX3R5cGU7CisKKwlzcGluX2xvY2tfaW5pdCgmaHAtPmxvY2spOworCXNwaW5fbG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJaHAtPmluZGV4ID0gKytodmNfY291bnQ7CisJbGlzdF9hZGRfdGFpbCgmKGhwLT5uZXh0KSwgJmh2Y19zdHJ1Y3RzKTsKKwlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaHZjX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IGRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwl0dHkgPSBocC0+dHR5OworCWtvYmpwID0gJmhwLT5rb2JqOworCisJaWYgKGhwLT5pbmRleCA8IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXZ0ZXJtbm9zW2hwLT5pbmRleF0gPSAtMTsKKworCS8qIERvbid0IHdoYWNrIGhwLT5pcnEgYmVjYXVzZSB0dHlfaGFuZ3VwKCkgd2lsbCBuZWVkIHRvIGZyZWUgdGhlIGlycS4gKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFdlICdwdXQnIHRoZSBpbnN0YW5jZSB0aGF0IHdhcyBncmFiYmVkIHdoZW4gdGhlIGtvYmplY3QgaW5zdGFuY2UKKwkgKiB3YXMgaW50aWFsaXplZCB1c2luZyBrb2JqZWN0X2luaXQoKS4gIExldCB0aGUgbGFzdCBob2xkZXIgb2YgdGhpcworCSAqIGtvYmplY3QgY2F1c2UgaXQgdG8gYmUgcmVtb3ZlZCwgd2hpY2ggd2lsbCBwcm9iYWJseSBiZSB0aGUgdHR5X2hhbmd1cAorCSAqIGJlbG93LgorCSAqLworCWtvYmplY3RfcHV0KGtvYmpwKTsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBjYWxsIHdpbGwgYXV0byBjaGFpbiBjYWxsIGh2Y19oYW5ndXAuICBUaGUgdHR5IHNob3VsZAorCSAqIGFsd2F5cyBiZSB2YWxpZCBhdCB0aGlzIHRpbWUgdW5sZXNzIGEgc2ltdWx0YW5lb3VzIHR0eSBjbG9zZSBhbHJlYWR5CisJICogY2xlYW5lZCB1cCB0aGUgaHZjX3N0cnVjdC4KKwkgKi8KKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBodmNfdmlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSBodmNfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaHZjX2RyaXZlcl90YWJsZSwKKwkucHJvYmUJCT0gaHZjX3Byb2JlLAorCS5yZW1vdmUJCT0gaHZjX3JlbW92ZSwKK307CisKKy8qIERyaXZlciBpbml0aWFsaXphdGlvbi4gIEZvbGxvdyBjb25zb2xlIGluaXRpYWxpemF0aW9uLiAgVGhpcyBpcyB3aGVyZSB0aGUgVFRZCisgKiBpbnRlcmZhY2VzIHN0YXJ0IHRvIGJlY29tZSBhdmFpbGFibGUuICovCitpbnQgX19pbml0IGh2Y19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJLyogV2UgbmVlZCBtb3JlIHRoYW4gbnVtX3Z0ZXJtcyBhZGFwdGVycyBkdWUgdG8gaG90cGx1ZyBhZGRpdGlvbnMuICovCisJaHZjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoSFZDX0FMTE9DX1RUWV9BREFQVEVSUyk7CisJLyogaHZjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIobnVtX3Z0ZXJtcyk7ICovCisJaWYgKCFodmNfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWh2Y19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJaHZjX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJodmMvIjsKKwlodmNfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJodmMiOworCWh2Y19kcml2ZXItPm5hbWUgPSAiaHZjIjsKKwlodmNfZHJpdmVyLT5tYWpvciA9IEhWQ19NQUpPUjsKKwlodmNfZHJpdmVyLT5taW5vcl9zdGFydCA9IEhWQ19NSU5PUjsKKwlodmNfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NZU1RFTTsKKwlodmNfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaHZjX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhodmNfZHJpdmVyLCAmaHZjX29wcyk7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihodmNfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIGh2YyBjb25zb2xlIGRyaXZlclxuIik7CisKKwkvKiBBbHdheXMgc3RhcnQgdGhlIGt0aHJlYWQgYmVjYXVzZSB0aGVyZSBjYW4gYmUgaG90cGx1ZyB2dHkgYWRhcHRlcnMKKwkgKiBhZGRlZCBsYXRlci4gKi8KKwlodmNfdGFzayA9IGt0aHJlYWRfcnVuKGtodmNkLCBOVUxMLCAia2h2Y2QiKTsKKwlpZiAoSVNfRVJSKGh2Y190YXNrKSkgeworCQlwYW5pYygiQ291bGRuJ3QgY3JlYXRlIGt0aHJlYWQgZm9yIGNvbnNvbGUuXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIoaHZjX2RyaXZlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLworCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOworCisJcmV0dXJuIHJjOworfQorCisvKiBUaGlzIGlzbid0IHBhcnRpY3VsYXJpbHkgbmVjZXNzYXJ5IGR1ZSB0byB0aGlzIGJlaW5nIGEgY29uc29sZSBkcml2ZXIgYnV0IGl0CisgKiBpcyBuaWNlIHRvIGJlIHRob3JvdWdoICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaHZjX2V4aXQodm9pZCkKK3sKKwlrdGhyZWFkX3N0b3AoaHZjX3Rhc2spOworCisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZodmNfdmlvX2RyaXZlcik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y19kcml2ZXIpOworCS8qIHJldHVybiB0dHlfc3RydWN0IGluc3RhbmNlcyBhbGxvY2F0ZWQgaW4gaHZjX2luaXQoKS4gKi8KKwlwdXRfdHR5X2RyaXZlcihodmNfZHJpdmVyKTsKK30KKworLyoKKyAqIENvbnNvbGUgQVBJcywgTk9UIFRUWS4gIFRoZXNlIEFQSXMgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSB3aGVuCisgKiBodmNfY29uc29sZV9zZXR1cCgpIGZpbmRzIGFkYXB0ZXJzLgorICovCisKKy8qCisgKiBodmNfaW5zdGFudGlhdGUoKSBpcyBhbiBlYXJseSBjb25zb2xlIGRpc2NvdmVyeSBtZXRob2Qgd2hpY2ggbG9jYXRlcyBjb25zb2xlcworICogcHJpb3IgdG8gdGhlIHZpbyBzdWJzeXN0ZW0gZGlzY292ZXJpbmcgdGhlbS4gIEhvdHBsdWdnZWQgdnR5IGFkYXB0ZXJzIGRvIE5PVAorICogZ2V0IGFuIGh2Y19pbnN0YW50aWF0ZSgpIGNhbGxiYWNrIHNpbmNlIHRoZSBhcHBlYXIgYWZ0ZXIgZWFybHkgY29uc29sZSBpbml0LgorICovCitpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCkKK3sKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXJldHVybiAtMTsKKworCWlmICh2dGVybW5vc1tpbmRleF0gIT0gLTEpCisJCXJldHVybiAtMTsKKworCXZ0ZXJtbm9zW2luZGV4XSA9IHZ0ZXJtbm87CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHZjX2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpiLCB1bnNpZ25lZCBjb3VudCkKK3sKKwljaGFyIGNbMTZdIF9fQUxJR05FRF9fOworCXVuc2lnbmVkIGkgPSAwLCBuID0gMDsKKwlpbnQgciwgZG9uZWNyID0gMDsKKworCS8qIENvbnNvbGUgYWNjZXNzIGF0dGVtcHQgb3V0c2lkZSBvZiBhY2NlcHRhYmxlIGNvbnNvbGUgcmFuZ2UuICovCisJaWYgKGNvLT5pbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGNvbnNvbGUgYWRhcHRlciB3YXMgcmVtb3ZlZCBzbyBpdCBpcyBub3QgdXNlYWJsZS4gKi8KKwlpZiAodnRlcm1ub3NbY28tPmluZGV4XSA8IDApCisJCXJldHVybjsKKworCXdoaWxlIChjb3VudCA+IDAgfHwgaSA+IDApIHsKKwkJaWYgKGNvdW50ID4gMCAmJiBpIDwgc2l6ZW9mKGMpKSB7CisJCQlpZiAoYltuXSA9PSAnXG4nICYmICFkb25lY3IpIHsKKwkJCQljW2krK10gPSAnXHInOworCQkJCWRvbmVjciA9IDE7CisJCQl9IGVsc2UgeworCQkJCWNbaSsrXSA9IGJbbisrXTsKKwkJCQlkb25lY3IgPSAwOworCQkJCS0tY291bnQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyID0gaHZjX3B1dF9jaGFycyh2dGVybW5vc1tjby0+aW5kZXhdLCBjLCBpKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCS8qIHRocm93IGF3YXkgY2hhcnMgb24gZXJyb3IgKi8KKwkJCQlpID0gMDsKKwkJCX0gZWxzZSBpZiAociA+IDApIHsKKwkJCQlpIC09IHI7CisJCQkJaWYgKGkgPiAwKQorCQkJCQltZW1tb3ZlKGMsIGMrciwgaSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiBodmNfZHJpdmVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb25zb2xlIGh2Y19jb25fZHJpdmVyID0geworCS5uYW1lCQk9ICJodmMiLAorCS53cml0ZQkJPSBodmNfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IGh2Y19jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gaHZjX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCisvKiBFYXJseSBjb25zb2xlIGluaXRpYWxpemF0aW9uLiAgUHJlY2VlZHMgZHJpdmVyIGluaXRpYWxpemF0aW9uLiAqLworc3RhdGljIGludCBfX2luaXQgaHZjX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8TUFYX05SX0hWQ19DT05TT0xFUzsgaSsrKQorCQl2dGVybW5vc1tpXSA9IC0xOworCW51bV92dGVybXMgPSBodmNfZmluZF92dHlzKCk7CisJcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChodmNfY29uc29sZV9pbml0KTsKKworbW9kdWxlX2luaXQoaHZjX2luaXQpOworbW9kdWxlX2V4aXQoaHZjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y3MuYyBiL2RyaXZlcnMvY2hhci9odmNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmYmRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9odmNzLmMKQEAgLTAsMCArMSwxNjQ5IEBACisvKgorICogSUJNIGVTZXJ2ZXIgSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgU2VydmVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBJQk0gQ29ycC4KKyAqICBSeWFuIFMuIEFybm9sZCAocnNhQHVzLmlibS5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3IocykgOiAgUnlhbiBTLiBBcm5vbGQgPHJzYUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgaXMgdGhlIGRldmljZSBkcml2ZXIgZm9yIHRoZSBJQk0gSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgU2VydmVyLAorICogImh2Y3MiLiAgVGhlIElCTSBodmNzIHByb3ZpZGVzIGEgdHR5IGRyaXZlciBpbnRlcmZhY2UgdG8gYWxsb3cgTGludXgKKyAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGFjY2VzcyB0byB0aGUgc3lzdGVtIGNvbnNvbGVzIG9mIGxvZ2ljYWxseQorICogcGFydGl0aW9uZWQgb3BlcmF0aW5nIHN5c3RlbXMsIGUuZy4gTGludXgsIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFydGl0aW9uZWQKKyAqIFBvd2VyNSBwcGM2NCBzeXN0ZW0uICBQaHlzaWNhbCBoYXJkd2FyZSBjb25zb2xlcyBwZXIgcGFydGl0aW9uIGFyZSBub3QKKyAqIHByYWN0aWNhbCBvbiB0aGlzIGhhcmR3YXJlIHNvIHN5c3RlbSBjb25zb2xlcyBhcmUgYWNjZXNzZWQgYnkgdGhpcyBkcml2ZXIKKyAqIHVzaW5nIGludGVyLXBhcnRpdGlvbiBmaXJtd2FyZSBpbnRlcmZhY2VzIHRvIHZpcnR1YWwgdGVybWluYWwgZGV2aWNlcy4KKyAqCisgKiBBIHZ0eSBpcyBrbm93biB0byB0aGUgSE1DIGFzIGEgInZpcnR1YWwgc2VyaWFsIHNlcnZlciBhZGFwdGVyIi4gIEl0IGlzIGEKKyAqIHZpcnR1YWwgdGVybWluYWwgZGV2aWNlIHRoYXQgaXMgY3JlYXRlZCBieSBmaXJtd2FyZSB1cG9uIHBhcnRpdGlvbiBjcmVhdGlvbgorICogdG8gYWN0IGFzIGEgcGFydGl0aW9uZWQgT1MncyBjb25zb2xlIGRldmljZS4KKyAqCisgKiBGaXJtd2FyZSBkeW5hbWljYWxseSAodmlhIGhvdHBsdWcpIGV4cG9zZXMgdnR5LXNlcnZlcnMgdG8gYSBydW5uaW5nIHBwYzY0CisgKiBMaW51eCBzeXN0ZW0gdXBvbiB0aGVpciBjcmVhdGlvbiBieSB0aGUgSE1DIG9yIHRoZWlyIGV4cG9zdXJlIGR1cmluZyBib290LgorICogVGhlIG5vbi11c2VyIGludGVyYWN0aXZlIGJhY2tlbmQgb2YgdGhpcyBkcml2ZXIgaXMgaW1wbGVtZW50ZWQgYXMgYSB2aW8KKyAqIGRldmljZSBkcml2ZXIgc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdnR5LXNlcnZlciBsaWZldGltZXMKKyAqIGFmdGVyIGl0IHJlZ2lzdGVycyB3aXRoIHRoZSB2aW8gYnVzIHRvIGhhbmRsZSB2dHktc2VydmVyIHByb2JlIGFuZCByZW1vdmUKKyAqIGNhbGxiYWNrcy4KKyAqCisgKiBNYW55IHZ0eS1zZXJ2ZXJzIGNhbiBiZSBjb25maWd1cmVkIHRvIGNvbm5lY3QgdG8gb25lIHZ0eSwgYnV0IGEgdnR5IGNhbgorICogb25seSBiZSBhY3RpdmVseSBjb25uZWN0ZWQgdG8gYnkgYSBzaW5nbGUgdnR5LXNlcnZlciwgaW4gYW55IG1hbm5lciwgYXQgb25lCisgKiB0aW1lLiAgSWYgdGhlIEhNQyBpcyBjdXJyZW50bHkgaG9zdGluZyB0aGUgY29uc29sZSBmb3IgYSB0YXJnZXQgTGludXgKKyAqIHBhcnRpdGlvbjsgYXR0ZW1wdHMgdG8gb3BlbiB0aGUgdHR5IGRldmljZSB0byB0aGUgcGFydGl0aW9uJ3MgY29uc29sZSB1c2luZworICogdGhlIGh2Y3Mgb24gYW55IHBhcnRpdGlvbiB3aWxsIHJldHVybiAtRUJVU1kgd2l0aCBldmVyeSBvcGVuIGF0dGVtcHQgdW50aWwKKyAqIHRoZSBITUMgZnJlZXMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBpdHMgdnR5LXNlcnZlciBhbmQgdGhlIGRlc2lyZWQKKyAqIHBhcnRpdGlvbidzIHZ0eSBkZXZpY2UuICBDb252ZXJzZWx5LCBhIHZ0eS1zZXJ2ZXIgbWF5IG9ubHkgYmUgY29ubmVjdGVkIHRvCisgKiBhIHNpbmdsZSB2dHkgYXQgb25lIHRpbWUgZXZlbiB0aG91Z2ggaXQgbWF5IGhhdmUgc2V2ZXJhbCBjb25maWd1cmVkIHZ0eQorICogcGFydG5lciBwb3NzaWJpbGl0aWVzLgorICoKKyAqIEZpcm13YXJlIGRvZXMgbm90IHByb3ZpZGUgbm90aWZpY2F0aW9uIG9mIHZ0eSBwYXJ0bmVyIGNoYW5nZXMgdG8gdGhpcworICogZHJpdmVyLiAgVGhpcyBtZWFucyB0aGF0IGFuIEhNQyBTdXBlciBBZG1pbiBtYXkgYWRkIG9yIHJlbW92ZSBwYXJ0bmVyIHZ0eXMKKyAqIGZyb20gYSB2dHktc2VydmVyJ3MgcGFydG5lciBsaXN0IGJ1dCB0aGUgY2hhbmdlcyB3aWxsIG5vdCBiZSBzaWduYWxlZCB0bworICogdGhlIHZ0eS1zZXJ2ZXIuICBGaXJtd2FyZSBvbmx5IG5vdGlmaWVzIHRoZSBkcml2ZXIgd2hlbiBhIHZ0eS1zZXJ2ZXIgaXMKKyAqIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiAgVG8gY29tcGVuc2F0ZSBmb3IgdGhpcyBkZWZpY2llbmN5LCB0aGlzCisgKiBkcml2ZXIgaW1wbGVtZW50cyBhIHN5c2ZzIHVwZGF0ZSBhdHRyaWJ1dGUgd2hpY2ggcHJvdmlkZXMgYSBtZXRob2QgZm9yCisgKiByZXNjYW5uaW5nIHBhcnRuZXIgaW5mb3JtYXRpb24gdXBvbiBhIHVzZXIncyByZXF1ZXN0LgorICoKKyAqIEVhY2ggdnR5LXNlcnZlciwgcHJpb3IgdG8gYmVpbmcgZXhwb3NlZCB0byB0aGlzIGRyaXZlciBpcyByZWZlcmVuY2UgY291bnRlZAorICogdXNpbmcgdGhlIDIuNiBMaW51eCBrZXJuZWwga29iamVjdCBjb25zdHJ1Y3QuICBUaGlzIGtvYmplY3QgaXMgYWxzbyB1c2VkIGJ5CisgKiB0aGUgdmlvIGJ1cyB0byBwcm92aWRlIGEgdmlvIGRldmljZSBzeXNmcyBlbnRyeSB0aGF0IHRoaXMgZHJpdmVyIGF0dGFjaGVzCisgKiBkZXZpY2Ugc3BlY2lmaWMgYXR0cmlidXRlcyB0bywgaW5jbHVkaW5nIHBhcnRuZXIgaW5mb3JtYXRpb24uICBUaGUgdmlvIGJ1cworICogZnJhbWV3b3JrIGFsc28gcHJvdmlkZXMgYSBzeXNmcyBlbnRyeSBmb3IgZWFjaCB2aW8gZHJpdmVyLiAgVGhlIGh2Y3MgZHJpdmVyCisgKiBwcm92aWRlcyBkcml2ZXIgYXR0cmlidXRlcyBpbiB0aGlzIGVudHJ5LgorICoKKyAqIEZvciBkaXJlY3Rpb24gb24gaW5zdGFsbGF0aW9uIGFuZCB1c2FnZSBvZiB0aGlzIGRyaXZlciBwbGVhc2UgcmVmZXJlbmNlCisgKiBEb2N1bWVudGF0aW9uL3Bvd2VycGMvaHZjcy50eHQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vaHZjc2VydmVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKKy8qCisgKiAxLjMuMCAtPiAxLjMuMSBJbiBodmNzX29wZW4gbWVtc2V0KC4uLDB4MDAsLi4pIGluc3RlYWQgb2YgbWVtc2V0KC4uLDB4M0YsMDApLgorICogUmVtb3ZlZCBicmFjZXMgYXJvdW5kIHNpbmdsZSBzdGF0ZW1lbnRzIGZvbGxvd2luZyBjb25kaXRpb25hbHMuICBSZW1vdmVkICc9CisgKiAwJyBhZnRlciBzdGF0aWMgaW50IGRlY2xhcmF0aW9ucyBzaW5jZSB0aGVzZSBkZWZhdWx0IHRvIHplcm8uICBSZW1vdmVkCisgKiBsaXN0X2Zvcl9lYWNoX3NhZmUoKSBhbmQgcmVwbGFjZWQgd2l0aCBsaXN0X2Zvcl9lYWNoX2VudHJ5KCkgaW4KKyAqIGh2Y3NfZ2V0X2J5X2luZGV4KCkuICBUaGUgJ3NhZmUnIHZlcnNpb24gaXMgdW4tbmVlZGVkIG5vdyB0aGF0IHRoZSBkcml2ZXIgaXMKKyAqIHVzaW5nIHNwaW5sb2Nrcy4gIENoYW5nZWQgc3Bpbl9sb2NrX2lycXNhdmUoKSB0byBzcGluX2xvY2soKSB3aGVuIGxvY2tpbmcKKyAqIGh2Y3Nfc3RydWN0c19sb2NrIGFuZCBodmNzX3BpX2xvY2sgc2luY2UgdGhlc2UgYXJlIG5vdCB0b3VjaGVkIGluIGFuIGludAorICogaGFuZGxlci4gIEluaXRpYWxpemVkIGh2Y3Nfc3RydWN0c19sb2NrIGFuZCBodmNzX3BpX2xvY2sgdG8KKyAqIFNQSU5fTE9DS19VTkxPQ0tFRCBhdCBkZWNsYXJhdGlvbiB0aW1lIHJhdGhlciB0aGFuIGluIGh2Y3NfbW9kdWxlX2luaXQoKS4KKyAqIEFkZGVkIHNwaW5fbG9jayBhcm91bmQgbGlzdF9kZWwoKSBpbiBkZXN0cm95X2h2Y3Nfc3RydWN0KCkgdG8gcHJvdGVjdCB0aGUKKyAqIGxpc3QgdHJhdmVyc2FscyBmcm9tIGEgZGVsZXRpb24uICBSZW1vdmVkICc9IE5VTEwnIGZyb20gcG9pbnRlciBkZWNsYXJhdGlvbgorICogc3RhdGVtZW50cyBzaW5jZSB0aGV5IGFyZSBpbml0aWFsaXplZCBOVUxMIGJ5IGRlZmF1bHQuICBSZW1vdmVkIHdtYigpCisgKiBpbnN0YW5jZXMgZnJvbSBodmNzX3RyeV93cml0ZSgpLiAgVGhleSBwcm9iYWJseSBhcmVuJ3QgbmVlZGVkIHdpdGggbG9ja2luZyBpbgorICogcGxhY2UuICBBZGRlZCBjaGVjayBhbmQgY2xlYW51cCBmb3IgaHZjc19waV9idWZmID0ga21hbGxvYygpIGluCisgKiBodmNzX21vZHVsZV9pbml0KCkuICBFeHBvc2VkIGh2Y3Nfc3RydWN0LmluZGV4IHZpYSBhIHN5c2ZzIGF0dHJpYnV0ZSBzbyB0aGF0CisgKiB0aGUgY291cGxpbmcgYmV0d2VlbiAvZGV2L2h2Y3MqIGFuZCBhIHZ0eS1zZXJ2ZXIgY2FuIGJlIGF1dG9tYXRpY2FsbHkKKyAqIGRldGVybWluZWQuICBNb3ZlZCBrb2JqZWN0X3B1dCgpIGluIGh2Y3Nfb3BlbiBvdXRzaWRlIG9mIHRoZQorICogc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgpLgorICoKKyAqIDEuMy4xIC0+IDEuMy4yIENoYW5nZWQgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBodmNzX3N0cnVjdC0+aW5kZXggYW5kIGhhZCBpdAorICogYWxpZ24gd2l0aCBob3cgdGhlIHR0eSBsYXllciBhbHdheXMgYXNzaWducyB0aGUgbG93ZXN0IGluZGV4IGF2YWlsYWJsZS4gIFRoaXMKKyAqIGNoYW5nZSByZXN1bHRlZCBpbiBhIGxpc3Qgb2YgaW50cyB0aGF0IGRlbm90ZXMgd2hpY2ggaW5kZXhlcyBhcmUgYXZhaWxhYmxlLgorICogRGV2aWNlIGFkZGl0aW9ucyBhbmQgcmVtb3ZhbHMgdXNlIHRoZSBuZXcgaHZjc19nZXRfaW5kZXgoKSBhbmQKKyAqIGh2Y3NfcmV0dXJuX2luZGV4KCkgaGVscGVyIGZ1bmN0aW9ucy4gIFRoZSBsaXN0IGlzIGNyZWF0ZWQgd2l0aAorICogaHZzY19hbGxvY19pbmRleF9saXN0KCkgYW5kIGl0IGlzIGRlc3Ryb3llZCB3aXRoIGh2Y3NfZnJlZV9pbmRleF9saXN0KCkuCisgKiBXaXRob3V0IHRoZXNlIGZpeGVzIGhvdHBsdWcgdnR5LXNlcnZlciBhZGFwdGVyIHN1cHBvcnQgZ29lcyBjcmF6eSB3aXRoIHRoaXMKKyAqIGRyaXZlciBpZiB0aGUgdXNlciByZW1vdmVzIGEgdnR5LXNlcnZlciBhZGFwdGVyLiAgTW92ZWQgZnJlZV9pcnEoKSBvdXRzaWRlIG9mCisgKiB0aGUgaHZjc19maW5hbF9jbG9zZSgpIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGdldCBpdCBvdXQgb2YgdGhlIHNwaW5sb2NrLgorICogUmVhcnJhbmdlZCBodmNzX2Nsb3NlKCkuICBDbGVhbmVkIHVwIHNvbWUgcHJpbnRrcyBhbmQgZGlkIHNvbWUgaG91c2VrZWVwaW5nCisgKiBvbiB0aGUgY2hhbmdlbG9nLiAgUmVtb3ZlZCBsb2NhbCBDTENfTEVOR1RIIGFuZCB1c2VkIEhWQ1NfQ0xDX0xFTkdUSCBmcm9tCisgKiBhcmNoL3BwYzY0L2h2Y3NlcnZlci5oLgorICoKKyAqIDEuMy4yIC0+IDEuMy4zIFJlcGxhY2VkIHlpZWxkKCkgaW4gaHZjc19jbG9zZSgpIHdpdGggdHR5X3dhaXRfdW50aWxfc2VudCgpIHRvCisgKiBwcmV2ZW50IHBvc3NpYmxlIGxvY2t1cCB3aXRoIHJlYWx0aW1lIHNjaGVkdWxpbmcgYXMgc2ltaWxhcmlseSBwb2ludGVkIG91dCBieQorICogYWtwbSBpbiBodmNfY29uc29sZS4gIENoYW5nZWQgcmVzdWx0ZWQgaW4gdGhlIHJlbW92YWwgb2YgaHZjc19maW5hbF9jbG9zZSgpCisgKiB0byByZW9yZGVyIGNsZWFudXAgb3BlcmF0aW9ucyBhbmQgcHJldmVudCBkaXNjYXJkaW5nIG9mIHBlbmRpbmcgZGF0YSBkdXJpbmcKKyAqIGFuIGh2Y3NfY2xvc2UoKS4gIFJlbW92ZWQgc3BpbmxvY2sgcHJvdGVjdGlvbiBvZiBodmNzX3N0cnVjdCBkYXRhIG1lbWJlcnMgaW4KKyAqIGh2Y3Nfd3JpdGVfcm9vbSgpIGFuZCBodmNzX2NoYXJzX2luX2J1ZmZlcigpIGJlY2F1c2UgdGhleSBhcmVuJ3QgbmVlZGVkLgorICovCisKKyNkZWZpbmUgSFZDU19EUklWRVJfVkVSU0lPTiAiMS4zLjMiCisKK01PRFVMRV9BVVRIT1IoIlJ5YW4gUy4gQXJub2xkIDxyc2FAdXMuaWJtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUJNIGh2Y3MgKEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlcikgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihIVkNTX0RSSVZFUl9WRVJTSU9OKTsKKworLyoKKyAqIFdhaXQgdGhpcyBsb25nIHBlciBpdGVyYXRpb24gd2hpbGUgdHJ5aW5nIHRvIHB1c2ggYnVmZmVyZWQgZGF0YSB0byB0aGUKKyAqIGh5cGVydmlzb3IgYmVmb3JlIGFsbG93aW5nIHRoZSB0dHkgdG8gY29tcGxldGUgYSBjbG9zZSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgSFZDU19DTE9TRV9XQUlUIChIWi8xMDApIC8qIDEvMTAgb2YgYSBzZWNvbmQgKi8KKworLyoKKyAqIFNpbmNlIHRoZSBMaW51eCBUVFkgY29kZSBkb2VzIG5vdCBjdXJyZW50bHkgKDItMDQtMjAwNCkgc3VwcG9ydCBkeW5hbWljCisgKiBhZGRpdGlvbiBvZiB0dHkgZGVyaXZlZCBkZXZpY2VzIGFuZCB3ZSBzaG91bGRuJ3QgYWxsb2NhdGUgdGhvdXNhbmRzIG9mCisgKiB0dHlfZGV2aWNlIHBvaW50ZXJzIHdoZW4gdGhlIG51bWJlciBvZiB2dHktc2VydmVyICYgdnR5IHBhcnRuZXIgY29ubmVjdGlvbnMKKyAqIHdpbGwgbW9zdCBvZnRlbiBiZSBtdWNoIGxvd2VyIHRoYW4gdGhpcywgd2UnbGwgYXJiaXRyYXJpbHkgYWxsb2NhdGUKKyAqIEhWQ1NfREVGQVVMVF9TRVJWRVJfQURBUFRFUlMgdHR5X3N0cnVjdHMgYW5kIGNkZXYncyBieSBkZWZhdWx0IHdoZW4gd2UKKyAqIHJlZ2lzdGVyIHRoZSB0dHlfZHJpdmVyLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIGFuIGluc21vZCBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgSFZDU19ERUZBVUxUX1NFUlZFUl9BREFQVEVSUwk2NAorCisvKgorICogVGhlIHVzZXIgY2FuJ3QgaW5zbW9kIHdpdGggbW9yZSB0aGFuIEhWQ1NfTUFYX1NFUlZFUl9BREFQVEVSUyBodmNzIGRldmljZQorICogbm9kZXMgYXMgYSBzYW5pdHkgY2hlY2suICBUaGVvcmV0aWNhbGx5IHRoZXJlIGNhbiBiZSBvdmVyIDEgQmlsbGlvbgorICogdnR5LXNlcnZlciAmIHZ0eSBwYXJ0bmVyIGNvbm5lY3Rpb25zLgorICovCisjZGVmaW5lIEhWQ1NfTUFYX1NFUlZFUl9BREFQVEVSUwkxMDI0CisKKy8qCisgKiBXZSBsZXQgTGludXggYXNzaWduIHVzIGEgbWFqb3IgbnVtYmVyIGFuZCB3ZSBzdGFydCB0aGUgbWlub3JzIGF0IHplcm8uICBUaGVyZQorICogaXMgbm8gaW50dWl0aXZlIG1hcHBpbmcgYmV0d2VlbiBtaW5vciBudW1iZXIgYW5kIHRoZSB0YXJnZXQgdnR5LXNlcnZlcgorICogYWRhcHRlciBleGNlcHQgdGhhdCBlYWNoIG5ldyB2dHktc2VydmVyIGFkYXB0ZXIgaXMgYWx3YXlzIGFzc2lnbmVkIHRvIHRoZQorICogc21hbGxlc3QgbWlub3IgbnVtYmVyIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBIVkNTX01JTk9SX1NUQVJUCTAKKworLyoKKyAqIFRoZSBoY2FsbCBpbnRlcmZhY2UgaW52b2x2ZXMgcHV0dGluZyA4IGNoYXJzIGludG8gZWFjaCBvZiB0d28gcmVnaXN0ZXJzLgorICogV2UgbG9hZCB1cCB0aG9zZSAyIHJlZ2lzdGVycyAoaW4gYXJjaC9wcGM2NC9odmNvbnNvbGUuYykgYnkgY2FzdGluZyBjaGFyWzE2XQorICogdG8gbG9uZ1syXS4gIEl0IHdvdWxkIHdvcmsgd2l0aG91dCBfX0FMSUdORURfXywgYnV0IGEgbGl0dGxlICh0aW55KSBiaXQKKyAqIHNsb3dlciBiZWNhdXNlIGFuIHVuYWxpZ25lZCBsb2FkIGlzIHNsb3dlciB0aGFuIGFsaWduZWQgbG9hZC4KKyAqLworI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpCisKKy8qCisgKiBIb3cgbXVjaCBkYXRhIGNhbiBmaXJtd2FyZSBzZW5kIHdpdGggZWFjaCBodmNfcHV0X2NoYXJzKCk/ICBNYXliZSB0aGlzCisgKiBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgYXJlYS4KKyAqLworI2RlZmluZSBIVkNTX0JVRkZfTEVOCTE2CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHdlJ2xsIGxldCB0aGUgdXNlciBzZW5kIHVzIChodmNzX3dyaXRlKSBhdAorICogb25jZSBpbiBhIGNodW5rIGFzIGEgc2FuaXR5IGNoZWNrLgorICovCisjZGVmaW5lIEhWQ1NfTUFYX0ZST01fVVNFUgk0MDk2CisKKy8qCisgKiBCZSBjYXJlZnVsIHdoZW4gYWRkaW5nIGZsYWdzIHRvIHRoaXMgbGluZSBkaXNjaXBsaW5lLiAgRG9uJ3QgYWRkIGFueXRoaW5nCisgKiB0aGF0IHdpbGwgY2F1c2UgZWNob2luZyBvciB3ZSdsbCBnbyBpbnRvIHJlY3Vyc2l2ZSBsb29wIGVjaG9pbmcgY2hhcnMgYmFjaworICogYW5kIGZvcnRoIHdpdGggdGhlIGNvbnNvbGUgZHJpdmVycy4KKyAqLworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIGh2Y3NfdHR5X3Rlcm1pb3MgPSB7CisJLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVIsCisJLmNfb2ZsYWcgPSBPUE9TVCwKKwkuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wsCisJLmNfY2MgPSBJTklUX0NfQ0MKK307CisKKy8qCisgKiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gdGFrZSB0aGUgcGxhY2Ugb2YgYSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIHdoZW4gdGhlCisgKiBtb2R1bGUgaXMgaW5zZXJ0ZWQuICBJdCBzdGFydHMgYXMgLTEgYW5kIHN0YXlzIGFzIHN1Y2ggaWYgdGhlIHVzZXIgZG9lc24ndAorICogc3BlY2lmeSBhIG1vZHVsZSBpbnNtb2QgcGFyYW1ldGVyLiAgSWYgdGhleSBETyBzcGVjaWZ5IG9uZSB0aGVuIGl0IGlzIHNldCB0bworICogdGhlIHZhbHVlIG9mIHRoZSBpbnRlZ2VyIHBhc3NlZCBpbi4KKyAqLworc3RhdGljIGludCBodmNzX3Bhcm1fbnVtX2RldnMgPSAtMTsKK21vZHVsZV9wYXJhbShodmNzX3Bhcm1fbnVtX2RldnMsIGludCwgMCk7CisKK2NoYXIgaHZjc19kcml2ZXJfbmFtZVtdID0gImh2Y3MiOworY2hhciBodmNzX2RldmljZV9ub2RlW10gPSAiaHZjcyI7CitjaGFyIGh2Y3NfZHJpdmVyX3N0cmluZ1tdCisJPSAiSUJNIGh2Y3MgKEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlcikgRHJpdmVyIjsKKworLyogU3RhdHVzIG9mIHBhcnRuZXIgaW5mbyByZXNjYW4gdHJpZ2dlcmVkIHZpYSBzeXNmcy4gKi8KK3N0YXRpYyBpbnQgaHZjc19yZXNjYW5fc3RhdHVzOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y3NfdHR5X2RyaXZlcjsKKworLyoKKyAqIEluIG9yZGVyIHRvIGJlIHNvbWV3aGF0IHNhbmUgdGhpcyBkcml2ZXIgYWx3YXlzIGFzc29jaWF0ZXMgdGhlIGh2Y3Nfc3RydWN0CisgKiBpbmRleCBlbGVtZW50IHdpdGggdGhlIG51bWVyaWNhbGx5IGVxdWFsIHR0eS0+aW5kZXguICBUaGlzIG1lYW5zIHRoYXQgYQorICogaG90cGx1Z2dlZCB2dHktc2VydmVyIGFkYXB0ZXIgd2lsbCBhbHdheXMgbWFwIHRvIHRoZSBsb3dlc3QgaW5kZXggdmFsdWVkCisgKiBkZXZpY2Ugbm9kZS4gIElmIHZ0eS1zZXJ2ZXJzIHdlcmUgaG90cGx1ZyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbSBhbmQgdGhlbgorICogbmV3IG9uZXMgYWRkZWQgdGhlIG5ldyB2dHktc2VydmVyIG1heSBoYXZlIHRoZSBsYXJnZXN0IHNsb3QgbnVtYmVyIG9mIGFsbAorICogdGhlIHZ0eS1zZXJ2ZXIgYWRhcHRlcnMgaW4gdGhlIHBhcnRpdGlvbiBidXQgaXQgbWF5IGhhdmUgdGhlIGxvd2VzdCBkZXYgbm9kZQorICogaW5kZXggb2YgYWxsIHRoZSBhZGFwdGVycyBkdWUgdG8gdGhlIGhvbGUgbGVmdCBieSB0aGUgaG90cGx1ZyByZW1vdmVkCisgKiBhZGFwdGVyLiAgVGhlcmUgYXJlIGEgc2V0IG9mIGZ1bmN0aW9ucyBwcm92aWRlZCB0byBnZXQgdGhlIGxvd2VzdCBpbmRleCBmb3IKKyAqIGEgbmV3IGRldmljZSBhcyB3ZWxsIGFzIHJldHVybiB0aGUgaW5kZXggdG8gdGhlIGxpc3QuICBUaGlzIGxpc3QgaXMgYWxsb2NhdGVkCisgKiB3aXRoIGEgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZGV2aWNlIG5vZGVzIHJlcXVlc3RlZCB3aGVuCisgKiB0aGUgbW9kdWxlIHdhcyBpbnNlcnRlZC4KKyAqLworc3RhdGljIGludCAqaHZjc19pbmRleF9saXN0OworCisvKgorICogSG93IGxhcmdlIGlzIHRoZSBsaXN0PyAgVGhpcyBpcyBrZXB0IGZvciB0cmF2ZXJzYWwgc2luY2UgdGhlIGxpc3QgaXMKKyAqIGR5bmFtaWNhbGx5IGNyZWF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19pbmRleF9jb3VudDsKKworLyoKKyAqIFVzZWQgYnkgdGhlIGtodmNzZCB0byBwaWNrIHVwIEkvTyBvcGVyYXRpb25zIHdoZW4gdGhlIGtlcm5lbF90aHJlYWQgaXMKKyAqIGFscmVhZHkgYXdha2UgYnV0IHBvdGVudGlhbGx5IHNoaWZ0ZWQgdG8gVEFTS19JTlRFUlJVUFRJQkxFIHN0YXRlLgorICovCitzdGF0aWMgaW50IGh2Y3Nfa2lja2VkOworCisvKgorICogVXNlIGJ5IHRoZSBrdGhyZWFkIGNvbnN0cnVjdCBmb3IgdGFzayBvcGVyYXRpb25zIGxpa2Ugd2FraW5nIHRoZSBzbGVlcGluZworICogdGhyZWFkIGFuZCBzdG9wcGluZyB0aGUga3RocmVhZC4KKyAqLworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqaHZjc190YXNrOworCisvKgorICogV2UgYWxsb2NhdGUgdGhpcyBmb3IgdGhlIHVzZSBvZiBhbGwgb2YgdGhlIGh2Y3Nfc3RydWN0cyB3aGVuIHRoZXkgZmV0Y2gKKyAqIHBhcnRuZXIgaW5mby4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgKmh2Y3NfcGlfYnVmZjsKKworLyogT25seSBhbGxvdyBvbmUgaHZjc19zdHJ1Y3QgdG8gdXNlIHRoZSBodmNzX3BpX2J1ZmYgYXQgYSB0aW1lLiAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhodmNzX3BpX2xvY2spOworCisvKiBPbmUgdnR5LXNlcnZlciBwZXIgaHZjc19zdHJ1Y3QgKi8KK3N0cnVjdCBodmNzX3N0cnVjdCB7CisJc3BpbmxvY2tfdCBsb2NrOworCisJLyoKKwkgKiBUaGlzIGluZGV4IGlkZW50aWZpZXMgdGhpcyBodmNzIGRldmljZSBhcyB0aGUgY29tcGxlbWVudCB0byBhCisJICogc3BlY2lmaWMgdHR5IGluZGV4LgorCSAqLworCXVuc2lnbmVkIGludCBpbmRleDsKKworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IG9wZW5fY291bnQ7CisKKwkvKgorCSAqIFVzZWQgdG8gdGVsbCB0aGUgZHJpdmVyIGtlcm5lbF90aHJlYWQgd2hhdCBvcGVyYXRpb25zIG5lZWQgdG8gdGFrZQorCSAqIHBsYWNlIHVwb24gdGhpcyBodmNzX3N0cnVjdCBpbnN0YW5jZS4KKwkgKi8KKwlpbnQgdG9kb19tYXNrOworCisJLyoKKwkgKiBUaGlzIGJ1ZmZlciBpcyByZXF1aXJlZCBzbyB0aGF0IHdoZW4gaHZjc193cml0ZV9yb29tKCkgcmVwb3J0cyB0aGF0CisJICogaXQgY2FuIHNlbmQgSFZDU19CVUZGX0xFTiBjaGFyYWN0ZXJzIHRoYXQgaXQgd2lsbCBidWZmZXIgdGhlIGZ1bGwKKwkgKiBIVkNTX0JVRkZfTEVOIGNoYXJhY3RlcnMgaWYgbmVlZCBiZS4gIFRoaXMgaXMgZXNzZW50aWFsIGZvciBvcG9zdAorCSAqIHdyaXRlcyBzaW5jZSB0aGV5IGRvIG5vdCBkbyBoaWdoIGxldmVsIGJ1ZmZlcmluZyBhbmQgZXhwZWN0IHRvIGJlCisJICogYWJsZSB0byBzZW5kIHdoYXQgdGhlIGRyaXZlciBjb21taXRzIHRvIHNlbmRpbmcgYnVmZmVyaW5nCisJICogW2UuZy4gdGFiIHRvIHNwYWNlIGNvbnZlcnNpb25zIGluIG5fdHR5LmMgb3Bvc3QoKV0uCisJICovCisJY2hhciBidWZmZXJbSFZDU19CVUZGX0xFTl07CisJaW50IGNoYXJzX2luX2J1ZmZlcjsKKworCS8qCisJICogQW55IHZhcmlhYmxlIGJlbG93IHRoZSBrb2JqZWN0IGlzIHZhbGlkIGJlZm9yZSBhIHR0eSBpcyBjb25uZWN0ZWQgYW5kCisJICogc3RheXMgdmFsaWQgYWZ0ZXIgdGhlIHR0eSBpcyBkaXNjb25uZWN0ZWQuICBUaGVzZSBzaG91bGRuJ3QgYmUKKwkgKiB3aGFja2VkIHVudGlsIHRoZSBrb2plY3QgcmVmY291bnQgcmVhY2hlcyB6ZXJvIHRob3VnaCBzb21lIGVudHJpZXMKKwkgKiBtYXkgYmUgY2hhbmdlZCB2aWEgc3lzZnMgaW5pdGlhdGl2ZXMuCisJICovCisJc3RydWN0IGtvYmplY3Qga29iajsgLyogcmVmIGNvdW50ICYgaHZjc19zdHJ1Y3QgbGlmZXRpbWUgKi8KKwlpbnQgY29ubmVjdGVkOyAvKiBpcyB0aGUgdnR5LXNlcnZlciBjdXJyZW50bHkgY29ubmVjdGVkIHRvIGEgdnR5PyAqLworCXVpbnQzMl90IHBfdW5pdF9hZGRyZXNzOyAvKiBwYXJ0bmVyIHVuaXQgYWRkcmVzcyAqLworCXVpbnQzMl90IHBfcGFydGl0aW9uX0lEOyAvKiBwYXJ0bmVyIHBhcnRpdGlvbiBJRCAqLworCWNoYXIgcF9sb2NhdGlvbl9jb2RlW0hWQ1NfQ0xDX0xFTkdUSCArIDFdOyAvKiBDTEMgKyBOdWxsIFRlcm0gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7IC8qIGxpc3QgbWFuYWdlbWVudCAqLworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworfTsKKworLyogUmVxdWlyZWQgdG8gYmFjayBtYXAgYSBrb2JqZWN0IHRvIGl0cyBjb250YWluaW5nIG9iamVjdCAqLworI2RlZmluZSBmcm9tX2tvYmooa29iaikgY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBodmNzX3N0cnVjdCwga29iaikKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaHZjc19zdHJ1Y3RzID0gTElTVF9IRUFEX0lOSVQoaHZjc19zdHJ1Y3RzKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHZjc19zdHJ1Y3RzX2xvY2spOworCitzdGF0aWMgdm9pZCBodmNzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBodmNzX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGlycXJldHVybl90IGh2Y3NfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIGludCBodmNzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgaHZjc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBodmNzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworc3RhdGljIGludCBodmNzX2hhc19waShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyB2b2lkIGh2Y3Nfc2V0X3BpKHN0cnVjdCBodmNzX3BhcnRuZXJfaW5mbyAqcGksCisJCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpOworc3RhdGljIGludCBodmNzX2dldF9waShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyBpbnQgaHZjc19yZXNjYW5fZGV2aWNlc19saXN0KHZvaWQpOworCitzdGF0aWMgaW50IGh2Y3NfcGFydG5lcl9jb25uZWN0KHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpOworc3RhdGljIHZvaWQgaHZjc19wYXJ0bmVyX2ZyZWUoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCk7CisKK3N0YXRpYyBpbnQgaHZjc19lbmFibGVfZGV2aWNlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QsCisJCXVpbnQzMl90IHVuaXRfYWRkcmVzcywgdW5zaWduZWQgaW50IGlycSwgc3RydWN0IHZpb19kZXYgKmRldik7CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjc19zdHJ1Y3Qoc3RydWN0IGtvYmplY3QgKmtvYmopOworc3RhdGljIGludCBodmNzX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgaHZjc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBodmNzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CisKK3N0YXRpYyB2b2lkIGh2Y3NfY3JlYXRlX2RldmljZV9hdHRycyhzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyB2b2lkIGh2Y3NfcmVtb3ZlX2RldmljZV9hdHRycyhzdHJ1Y3QgdmlvX2RldiAqdmRldik7CitzdGF0aWMgdm9pZCBodmNzX2NyZWF0ZV9kcml2ZXJfYXR0cnModm9pZCk7CitzdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnModm9pZCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh2Y3NfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwKKwkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyBpbnQgX19kZXZleGl0IGh2Y3NfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpOworc3RhdGljIGludCBfX2luaXQgaHZjc19tb2R1bGVfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBodmNzX21vZHVsZV9leGl0KHZvaWQpOworCisjZGVmaW5lIEhWQ1NfU0NIRURfUkVBRAkweDAwMDAwMDAxCisjZGVmaW5lIEhWQ1NfUVVJQ0tfUkVBRAkweDAwMDAwMDAyCisjZGVmaW5lIEhWQ1NfVFJZX1dSSVRFCTB4MDAwMDAwMDQKKyNkZWZpbmUgSFZDU19SRUFEX01BU0sJKEhWQ1NfU0NIRURfUkVBRCB8IEhWQ1NfUVVJQ0tfUkVBRCkKKworc3RhdGljIHZvaWQgaHZjc19raWNrKHZvaWQpCit7CisJaHZjc19raWNrZWQgPSAxOworCXdtYigpOworCXdha2VfdXBfcHJvY2VzcyhodmNzX3Rhc2spOworfQorCitzdGF0aWMgdm9pZCBodmNzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJaHZjc2QtPnRvZG9fbWFzayB8PSBIVkNTX1NDSEVEX1JFQUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlodmNzX2tpY2soKTsKK30KKworc3RhdGljIHZvaWQgaHZjc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogSWYgdGhlIGRldmljZSBpcyBiZWluZyByZW1vdmVkIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhpcyBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgdGFraW5nIGFueSBmdXJ0aGVyIGludGVycnVwdHMgYmVjYXVzZSB0aGV5IGFyZSBkaXNhYmxlZCB3aGljaCBtZWFucworICogdGhlIGh2Y3Nfc3RydWN0IHdpbGwgYWx3YXlzIGJlIHZhbGlkIGluIHRoaXMgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IGh2Y3NfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBkZXZfaW5zdGFuY2U7CisKKwlzcGluX2xvY2soJmh2Y3NkLT5sb2NrKTsKKwl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKwlodmNzZC0+dG9kb19tYXNrIHw9IEhWQ1NfU0NIRURfUkVBRDsKKwlzcGluX3VubG9jaygmaHZjc2QtPmxvY2spOworCWh2Y3Nfa2ljaygpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGh2Y3NkLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGh2Y3NfdHJ5X3dyaXRlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJdWludDMyX3QgdW5pdF9hZGRyZXNzID0gaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaHZjc2QtPnR0eTsKKwlpbnQgc2VudDsKKworCWlmIChodmNzZC0+dG9kb19tYXNrICYgSFZDU19UUllfV1JJVEUpIHsKKwkJLyogd29uJ3Qgc2VuZCBwYXJ0aWFsIHdyaXRlcyAqLworCQlzZW50ID0gaHZjX3B1dF9jaGFycyh1bml0X2FkZHJlc3MsCisJCQkJJmh2Y3NkLT5idWZmZXJbMF0sCisJCQkJaHZjc2QtPmNoYXJzX2luX2J1ZmZlciApOworCQlpZiAoc2VudCA+IDApIHsKKwkJCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIgPSAwOworCQkJLyogd21iKCk7ICovCisJCQlodmNzZC0+dG9kb19tYXNrICY9IH4oSFZDU19UUllfV1JJVEUpOworCQkJLyogd21iKCk7ICovCisKKwkJCS8qCisJCQkgKiBXZSBhcmUgc3RpbGwgb2JsaWdhdGVkIHRvIGRlbGl2ZXIgdGhlIGRhdGEgdG8gdGhlCisJCQkgKiBoeXBlcnZpc29yIGV2ZW4gaWYgdGhlIHR0eSBoYXMgYmVlbiBjbG9zZWQgYmVjYXVzZQorCQkJICogd2UgY29tbWl0ZWQgdG8gZGVsaXZlcmluZyBpdC4gIEJ1dCBkb24ndCB0cnkgdG8gd2FrZQorCQkJICogYSBub24tZXhpc3RlbnQgdHR5LgorCQkJICovCisJCQlpZiAodHR5KSB7CisJCQkJdHR5X3dha2V1cCh0dHkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IGh2Y3NfaW8oc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwl1aW50MzJfdCB1bml0X2FkZHJlc3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwljaGFyIGJ1ZltIVkNTX0JVRkZfTEVOXSBfX0FMSUdORURfXzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBnb3QgPSAwOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwl1bml0X2FkZHJlc3MgPSBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzOworCXR0eSA9IGh2Y3NkLT50dHk7CisKKwlodmNzX3RyeV93cml0ZShodmNzZCk7CisKKwlpZiAoIXR0eSB8fCB0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJaHZjc2QtPnRvZG9fbWFzayAmPSB+KEhWQ1NfUkVBRF9NQVNLKTsKKwkJZ290byBiYWlsOworCX0gZWxzZSBpZiAoIShodmNzZC0+dG9kb19tYXNrICYgKEhWQ1NfUkVBRF9NQVNLKSkpCisJCWdvdG8gYmFpbDsKKworCS8qIHJlbW92ZSB0aGUgcmVhZCBtYXNrcyAqLworCWh2Y3NkLT50b2RvX21hc2sgJj0gfihIVkNTX1JFQURfTUFTSyk7CisKKwlpZiAoKHR0eS0+ZmxpcC5jb3VudCArIEhWQ1NfQlVGRl9MRU4pIDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQlnb3QgPSBodmNfZ2V0X2NoYXJzKHVuaXRfYWRkcmVzcywKKwkJCQkmYnVmWzBdLAorCQkJCUhWQ1NfQlVGRl9MRU4pOworCQlmb3IgKGk9MDtnb3QgJiYgaTxnb3Q7aSsrKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBidWZbaV0sIFRUWV9OT1JNQUwpOworCX0KKworCS8qIEdpdmUgdGhlIFRUWSB0aW1lIHRvIHByb2Nlc3MgdGhlIGRhdGEgd2UganVzdCBzZW50LiAqLworCWlmIChnb3QpCisJCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19RVUlDS19SRUFEOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlpZiAodHR5LT5mbGlwLmNvdW50KSB7CisJCS8qIFRoaXMgaXMgc3luY2ggYmVjYXVzZSB0dHktPmxvd19sYXRlbmN5ID09IDEgKi8KKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwl9CisKKwlpZiAoIWdvdCkgeworCQkvKiBEbyB0aGlzIF9hZnRlcl8gdGhlIGZsaXBfYnVmZmVyX3B1c2ggKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXZpb19lbmFibGVfaW50ZXJydXB0cyhodmNzZC0+dmRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGh2Y3NkLT50b2RvX21hc2s7CisKKyBiYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGh2Y3NkLT50b2RvX21hc2s7Cit9CisKK3N0YXRpYyBpbnQga2h2Y3NkKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCWludCBodmNzX3RvZG9fbWFzazsKKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCWRvIHsKKwkJaHZjc190b2RvX21hc2sgPSAwOworCQlodmNzX2tpY2tlZCA9IDA7CisJCXdtYigpOworCisJCXNwaW5fbG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh2Y3NkLCAmaHZjc19zdHJ1Y3RzLCBuZXh0KSB7CisJCQlodmNzX3RvZG9fbWFzayB8PSBodmNzX2lvKGh2Y3NkKTsKKwkJfQorCQlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCisJCS8qCisJCSAqIElmIGFueSBvZiB0aGUgaHZjcyBhZGFwdGVycyB3YW50IHRvIHRyeSBhIHdyaXRlIG9yIHF1aWNrIHJlYWQKKwkJICogZG9uJ3Qgc2NoZWR1bGUoKSwgeWllbGQgYSBzbWlkZ2VuIHRoZW4gZXhlY3V0ZSB0aGUgaHZjc19pbworCQkgKiB0aHJlYWQgYWdhaW4gZm9yIHRob3NlIHRoYXQgd2FudCB0aGUgd3JpdGUuCisJCSAqLworCQkgaWYgKGh2Y3NfdG9kb19tYXNrICYgKEhWQ1NfVFJZX1dSSVRFIHwgSFZDU19RVUlDS19SRUFEKSkgeworCQkJeWllbGQoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKCFodmNzX2tpY2tlZCkKKwkJCXNjaGVkdWxlKCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgaHZjc19kcml2ZXJfdGFibGVbXSBfX2RldmluaXRkYXRhPSB7CisJeyJzZXJpYWwtc2VydmVyIiwgImh2dGVybTIifSwKKwl7IE5VTEwsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjc19kcml2ZXJfdGFibGUpOworCitzdGF0aWMgdm9pZCBodmNzX3JldHVybl9pbmRleChpbnQgaW5kZXgpCit7CisJLyogUGFyYW5vaWEgY2hlY2sgKi8KKwlpZiAoIWh2Y3NfaW5kZXhfbGlzdCkKKwkJcmV0dXJuOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaHZjc19pbmRleF9jb3VudCkKKwkJcmV0dXJuOworCWlmIChodmNzX2luZGV4X2xpc3RbaW5kZXhdID09IC0xKQorCQlyZXR1cm47CisJZWxzZQorCQlodmNzX2luZGV4X2xpc3RbaW5kZXhdID0gLTE7Cit9CisKKy8qIGNhbGxiYWNrIHdoZW4gdGhlIGtib2plY3QgcmVmIGNvdW50IHJlYWNoZXMgemVybyAqLworc3RhdGljIHZvaWQgZGVzdHJveV9odmNzX3N0cnVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV9rb2JqKGtvYmopOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qIHRoZSBsaXN0X2RlbCBwb2lzb25zIHRoZSBwb2ludGVycyAqLworCWxpc3RfZGVsKCYoaHZjc2QtPm5leHQpKTsKKworCWlmIChodmNzZC0+Y29ubmVjdGVkID09IDEpIHsKKwkJaHZjc19wYXJ0bmVyX2ZyZWUoaHZjc2QpOworCQlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBDbG9zZWQgdnR5LXNlcnZlckAlWCBhbmQiCisJCQkJIiBwYXJ0bmVyIHZ0eUAlWDolZCBjb25uZWN0aW9uLlxuIiwKKwkJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLAorCQkJCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcywKKwkJCQkodWludDMyX3QpaHZjc2QtPnBfcGFydGl0aW9uX0lEKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogRGVzdHJveWVkIGh2Y3Nfc3RydWN0IGZvciB2dHktc2VydmVyQCVYLlxuIiwKKwkJCWh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3MpOworCisJdmRldiA9IGh2Y3NkLT52ZGV2OworCWh2Y3NkLT52ZGV2ID0gTlVMTDsKKworCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcyA9IDA7CisJaHZjc2QtPnBfcGFydGl0aW9uX0lEID0gMDsKKwlodmNzX3JldHVybl9pbmRleChodmNzZC0+aW5kZXgpOworCW1lbXNldCgmaHZjc2QtPnBfbG9jYXRpb25fY29kZVswXSwgMHgwMCwgSFZDU19DTENfTEVOR1RIICsgMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlodmNzX3JlbW92ZV9kZXZpY2VfYXR0cnModmRldik7CisKKwlrZnJlZShodmNzZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGh2Y3Nfa29ial90eXBlID0geworCS5yZWxlYXNlID0gZGVzdHJveV9odmNzX3N0cnVjdCwKK307CisKK3N0YXRpYyBpbnQgaHZjc19nZXRfaW5kZXgodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBQYXJhbm9pYSBjaGVjayAqLworCWlmICghaHZjc19pbmRleF9saXN0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogaHZjc19pbmRleF9saXN0IE5PVCB2YWxpZCEuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qIEZpbmQgdGhlIG51bWVyaWNhbGx5IGxvd2VzdCBmaXJzdCBmcmVlIGluZGV4LiAqLworCWZvcihpID0gMDsgaSA8IGh2Y3NfaW5kZXhfY291bnQ7IGkrKykgeworCQlpZiAoaHZjc19pbmRleF9saXN0W2ldID09IC0xKSB7CisJCQlodmNzX2luZGV4X2xpc3RbaV0gPSAwOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBodmNzX3Byb2JlKAorCXN0cnVjdCB2aW9fZGV2ICpkZXYsCisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2Q7CisJaW50IGluZGV4OworCisJaWYgKCFkZXYgfHwgIWlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogcHJvYmVkIHdpdGggaW52YWxpZCBwYXJhbWV0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBlYXJseSB0byBhdm9pZCBjbGVhbnVwIG9uIGZhaWx1cmUgKi8KKwlpbmRleCA9IGh2Y3NfZ2V0X2luZGV4KCk7CisJaWYgKGluZGV4IDwgMCkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodmNzZCA9IGttYWxsb2Moc2l6ZW9mKCpodmNzZCksIEdGUF9LRVJORUwpOworCWlmICghaHZjc2QpCisJCXJldHVybiAtRU5PREVWOworCisJLyogaHZjc2QtPnR0eSBpcyB6ZXJvZWQgb3V0IHdpdGggdGhlIG1lbXNldCAqLworCW1lbXNldChodmNzZCwgMHgwMCwgc2l6ZW9mKCpodmNzZCkpOworCisJc3Bpbl9sb2NrX2luaXQoJmh2Y3NkLT5sb2NrKTsKKwkvKiBBdXRvbWF0aWNhbGx5IGluY3MgdGhlIHJlZmNvdW50IHRoZSBmaXJzdCB0aW1lICovCisJa29iamVjdF9pbml0KCZodmNzZC0+a29iaik7CisJLyogU2V0IHVwIHRoZSBjYWxsYmFjayBmb3IgdGVybWluYXRpbmcgdGhlIGh2Y3Nfc3RydWN0J3MgbGlmZSAqLworCWh2Y3NkLT5rb2JqLmt0eXBlID0gJmh2Y3Nfa29ial90eXBlOworCisJaHZjc2QtPnZkZXYgPSBkZXY7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBodmNzZDsKKworCWh2Y3NkLT5pbmRleCA9IGluZGV4OworCisJLyogaHZjc2QtPmluZGV4ID0gKytodmNzX3N0cnVjdF9jb3VudDsgKi8KKwlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyID0gMDsKKwlodmNzZC0+dG9kb19tYXNrID0gMDsKKwlodmNzZC0+Y29ubmVjdGVkID0gMDsKKworCS8qCisJICogVGhpcyB3aWxsIHBvcHVsYXRlIHRoZSBodmNzX3N0cnVjdCdzIHBhcnRuZXIgaW5mbyBmaWVsZHMgZm9yIHRoZQorCSAqIGZpcnN0IHRpbWUuCisJICovCisJaWYgKGh2Y3NfZ2V0X3BpKGh2Y3NkKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IEZhaWxlZCB0byBmZXRjaCBwYXJ0bmVyIgorCQkJIiBpbmZvIGZvciB2dHktc2VydmVyQCVYIG9uIGRldmljZSBwcm9iZS5cbiIsCisJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzKTsKKwl9CisKKwkvKgorCSAqIElmIGEgdXNlciBhcHAgb3BlbnMgYSB0dHkgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHZ0eS1zZXJ2ZXIgYmVmb3JlCisJICogdGhlIGh2Y3Nfc3RydWN0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBkZXZpY2VzIGxpc3QgdGhlbiB0aGUgdXNlciBhcHAKKwkgKiB3aWxsIGdldCAtRU5PREVWLgorCSAqLworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlsaXN0X2FkZF90YWlsKCYoaHZjc2QtPm5leHQpLCAmaHZjc19zdHJ1Y3RzKTsKKworCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlodmNzX2NyZWF0ZV9kZXZpY2VfYXR0cnMoaHZjc2QpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnR5LXNlcnZlckAlWCBhZGRlZCB0byB0aGUgdmlvIGJ1cy5cbiIsIGRldi0+dW5pdF9hZGRyZXNzKTsKKworCS8qCisJICogRE9OJ1QgZW5hYmxlIGludGVycnVwdHMgaGVyZSBiZWNhdXNlIHRoZXJlIGlzIG5vIHVzZXIgdG8gcmVjZWl2ZSB0aGUKKwkgKiBkYXRhLgorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNzX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJaWYgKCFodmNzZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBCeSB0aGlzIHRpbWUgdGhlIHZ0eS1zZXJ2ZXIgd29uJ3QgYmUgZ2V0dGluZyBhbnkgbW9yZSBpbnRlcnJ1cHMgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJdHR5ID0gaHZjc2QtPnR0eTsKKworCWtvYmpwID0gJmh2Y3NkLT5rb2JqOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogTGV0IHRoZSBsYXN0IGhvbGRlciBvZiB0aGlzIG9iamVjdCBjYXVzZSBpdCB0byBiZSByZW1vdmVkLCB3aGljaAorCSAqIHdvdWxkIHByb2JhYmx5IGJlIHR0eV9oYW5ndXAgYmVsb3cuCisJICovCisJa29iamVjdF9wdXQgKGtvYmpwKTsKKworCS8qCisJICogVGhlIGhhbmd1cCBpcyBhIHNjaGVkdWxlZCBmdW5jdGlvbiB3aGljaCB3aWxsIGF1dG8gY2hhaW4gY2FsbAorCSAqIGh2Y3NfaGFuZ3VwLiAgVGhlIHR0eSBzaG91bGQgYWx3YXlzIGJlIHZhbGlkIGF0IHRoaXMgdGltZSB1bmxlc3MgYQorCSAqIHNpbXVsdGFuZW91cyB0dHkgY2xvc2UgYWxyZWFkeSBjbGVhbmVkIHVwIHRoZSBodmNzX3N0cnVjdC4KKwkgKi8KKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiB2dHktc2VydmVyQCVYIHJlbW92ZWQgZnJvbSB0aGUiCisJCQkiIHZpbyBidXMuXG4iLCBkZXYtPnVuaXRfYWRkcmVzcyk7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaHZjc192aW9fZHJpdmVyID0geworCS5uYW1lCQk9IGh2Y3NfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaHZjc19kcml2ZXJfdGFibGUsCisJLnByb2JlCQk9IGh2Y3NfcHJvYmUsCisJLnJlbW92ZQkJPSBodmNzX3JlbW92ZSwKK307CisKKy8qIE9ubHkgY2FsbGVkIGZyb20gaHZjc19nZXRfcGkgcGxlYXNlICovCitzdGF0aWMgdm9pZCBodmNzX3NldF9waShzdHJ1Y3QgaHZjc19wYXJ0bmVyX2luZm8gKnBpLCBzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCWludCBjbGNsZW5ndGg7CisKKwlodmNzZC0+cF91bml0X2FkZHJlc3MgPSBwaS0+dW5pdF9hZGRyZXNzOworCWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCAgPSBwaS0+cGFydGl0aW9uX0lEOworCWNsY2xlbmd0aCA9IHN0cmxlbigmcGktPmxvY2F0aW9uX2NvZGVbMF0pOworCWlmIChjbGNsZW5ndGggPiBIVkNTX0NMQ19MRU5HVEgpCisJCWNsY2xlbmd0aCA9IEhWQ1NfQ0xDX0xFTkdUSDsKKworCS8qIGNvcHkgdGhlIG51bGwtdGVybSBjaGFyIHRvbyAqLworCXN0cm5jcHkoJmh2Y3NkLT5wX2xvY2F0aW9uX2NvZGVbMF0sCisJCQkmcGktPmxvY2F0aW9uX2NvZGVbMF0sIGNsY2xlbmd0aCArIDEpOworfQorCisvKgorICogVHJhdmVyc2UgdGhlIGxpc3QgYW5kIGFkZCB0aGUgcGFydG5lciBpbmZvIHRoYXQgaXMgZm91bmQgdG8gdGhlIGh2Y3Nfc3RydWN0CisgKiBzdHJ1Y3QgZW50cnkuIE5PVEU6IEF0IHRoaXMgdGltZSBJIGtub3cgdGhhdCBwYXJ0bmVyIGluZm8gd2lsbCByZXR1cm4gYQorICogc2luZ2xlIGVudHJ5IGJ1dCBpbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBwYXJ0bmVyIGluZm8gZW50cmllcyBwZXIKKyAqIHZ0eS1zZXJ2ZXIgYW5kIHlvdSdsbCB3YW50IHRvIHplcm8gb3V0IHRoYXQgbGlzdCBhbmQgcmVzZXQgaXQuICBJZiBmb3Igc29tZQorICogcmVhc29uIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyIGJ1dCB0aGVyZSBJUyBtb3JlIHRoYW4gb25lCisgKiBwYXJ0bmVyIGluZm8gdGhlbiBodmNzZC0+cF8qIHdpbGwgaG9sZCB0aGUgbGFzdCBwYXJ0bmVyIGluZm8gZGF0YSBmcm9tIHRoZQorICogZmlybXdhcmUgcXVlcnkuICBBIGdvb2Qgd2F5IHRvIHVwZGF0ZSB0aGlzIGNvZGUgd291bGQgYmUgdG8gcmVwbGFjZSB0aGUgdGhyZWUKKyAqIHBhcnRuZXIgaW5mbyBmaWVsZHMgaW4gaHZjc19zdHJ1Y3Qgd2l0aCBhIGxpc3Qgb2YgaHZjc19wYXJ0bmVyX2luZm8KKyAqIGluc3RhbmNlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGh2Y3NkLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19nZXRfcGkoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlzdHJ1Y3QgaHZjc19wYXJ0bmVyX2luZm8gKnBpOworCXVpbnQzMl90IHVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWludCByZXR2YWw7CisKKwlzcGluX2xvY2soJmh2Y3NfcGlfbG9jayk7CisJaWYgKCFodmNzX3BpX2J1ZmYpIHsKKwkJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR2YWwgPSBodmNzX2dldF9wYXJ0bmVyX2luZm8odW5pdF9hZGRyZXNzLCAmaGVhZCwgaHZjc19waV9idWZmKTsKKwlzcGluX3VubG9jaygmaHZjc19waV9sb2NrKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogRmFpbGVkIHRvIGZldGNoIHBhcnRuZXIiCisJCQkiIGluZm8gZm9yIHZ0eS1zZXJ2ZXJAJXguXG4iLCB1bml0X2FkZHJlc3MpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIG5peGVzIHRoZSB2YWx1ZXMgaWYgdGhlIHBhcnRuZXIgdnR5IHdlbnQgYXdheSAqLworCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcyA9IDA7CisJaHZjc2QtPnBfcGFydGl0aW9uX0lEID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGksICZoZWFkLCBub2RlKQorCQlodmNzX3NldF9waShwaSwgaHZjc2QpOworCisJaHZjc19mcmVlX3BhcnRuZXJfaW5mbygmaGVhZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBkcml2ZXIgInJlc2NhbiIgc3lzZnMgZW50cnkuICBJdCBzaG91bGRuJ3QKKyAqIGJlIGV4ZWN1dGVkIGVsc2V3aGVyZSwgaW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBpc3N1ZXMuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19yZXNjYW5fZGV2aWNlc19saXN0KHZvaWQpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh2Y3NkLCAmaHZjc19zdHJ1Y3RzLCBuZXh0KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQlodmNzX2dldF9waShodmNzZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl91bmxvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRmFybSB0aGlzIG9mZiBpbnRvIGl0cyBvd24gZnVuY3Rpb24gYmVjYXVzZSBpdCBjb3VsZCBiZSBtb3JlIGNvbXBsZXggb25jZQorICogbXVsdGlwbGUgcGFydG5lcnMgc3VwcG9ydCBpcyBhZGRlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBodmNzZC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgaW50IGh2Y3NfaGFzX3BpKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJaWYgKCghaHZjc2QtPnBfdW5pdF9hZGRyZXNzKSB8fCAoIWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogTk9URTogSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc3VwZXIgYWRtaW4gcmVtb3ZlZCBhIHBhcnRuZXIgdnR5IGFuZCB0aGVuCisgKiBhZGRlZCBhIGRpZmZlcmVudCB2dHkgYXMgdGhlIG5ldyBwYXJ0bmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaHZjc2QtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBodmNzX3BhcnRuZXJfY29ubmVjdChzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgaW50IHVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhc24ndCBhbnkgcGkgd2hlbiB0aGUgZGV2aWNlIHdhcyBhZGRlZCBpdCBkb2Vzbid0IG1lYW50CisJICogdGhlcmUgaXNuJ3QgYW55IG5vdy4gIFRoaXMgZHJpdmVyIGlzbid0IG5vdGlmaWVkIHdoZW4gYSBuZXcgcGFydG5lcgorCSAqIHZ0eSBpcyBhZGRlZCB0byBhIHZ0eS1zZXJ2ZXIgc28gd2UgZGlzY292ZXIgY2hhbmdlcyBvbiBvdXIgb3duLgorCSAqIFBsZWFzZSBzZWUgY29tbWVudHMgaW4gaHZjc19yZWdpc3Rlcl9jb25uZWN0aW9uKCkgZm9yIGp1c3RpZmljYXRpb24KKwkgKiBvZiB0aGlzIGJpemFycmUgY29kZS4KKwkgKi8KKwlyZXR2YWwgPSBodmNzX3JlZ2lzdGVyX2Nvbm5lY3Rpb24odW5pdF9hZGRyZXNzLAorCQkJaHZjc2QtPnBfcGFydGl0aW9uX0lELAorCQkJaHZjc2QtPnBfdW5pdF9hZGRyZXNzKTsKKwlpZiAoIXJldHZhbCkgeworCQlodmNzZC0+Y29ubmVjdGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZXR2YWwgIT0gLUVJTlZBTCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qCisJICogQXMgcGVyIHRoZSBzcGVjIHJlLWdldCB0aGUgcGkgYW5kIHRyeSBhZ2FpbiBpZiAtRUlOVkFMIGFmdGVyIHRoZQorCSAqIGZpcnN0IGNvbm5lY3Rpb24gYXR0ZW1wdC4KKwkgKi8KKwlpZiAoaHZjc19nZXRfcGkoaHZjc2QpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghaHZjc19oYXNfcGkoaHZjc2QpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHZhbCA9IGh2Y3NfcmVnaXN0ZXJfY29ubmVjdGlvbih1bml0X2FkZHJlc3MsCisJCQlodmNzZC0+cF9wYXJ0aXRpb25fSUQsCisJCQlodmNzZC0+cF91bml0X2FkZHJlc3MpOworCWlmIChyZXR2YWwgIT0gLUVJTlZBTCkgeworCQlodmNzZC0+Y29ubmVjdGVkID0gMTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKgorCSAqIEVCVVNZIGlzIHRoZSBtb3N0IGxpa2VseSBzY2VuYXJpbyB0aG91Z2ggdGhlIHZ0eSBjb3VsZCBoYXZlIGJlZW4KKwkgKiByZW1vdmVkIG9yIHRoZXJlIHJlYWxseSBjb3VsZCBiZSBhbiBoY2FsbCBlcnJvciBkdWUgdG8gdGhlIHBhcmFtZXRlcgorCSAqIGRhdGEgYnV0IHRoYW5rcyB0byBhbWJpZ3VvdXMgZmlybXdhcmUgcmV0dXJuIGNvZGVzIHdlIGNhbid0IHJlYWxseQorCSAqIHRlbGwuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnR5LXNlcnZlciBvciBwYXJ0bmVyIgorCQkJIiB2dHkgaXMgYnVzeS4gIFRyeSBhZ2FpbiBsYXRlci5cbiIpOworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaHZjc2QtPmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgaHZjc19wYXJ0bmVyX2ZyZWUoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlpbnQgcmV0dmFsOworCWRvIHsKKwkJcmV0dmFsID0gaHZjc19mcmVlX2Nvbm5lY3Rpb24oaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAocmV0dmFsID09IC1FQlVTWSk7CisJaHZjc2QtPmNvbm5lY3RlZCA9IDA7Cit9CisKKy8qIFRoaXMgaGVscGVyIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIFdJVEhPVVQgdGhlIGh2Y3NkLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgaHZjc19lbmFibGVfZGV2aWNlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QsIHVpbnQzMl90IHVuaXRfYWRkcmVzcywKKwkJdW5zaWduZWQgaW50IGlycSwgc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHZ0eS1zZXJ2ZXIgd2FzIHJlbW92ZWQgYmV0d2VlbiB0aGUgdGltZSB0aGF0CisJICogdGhlIGNvbm4gd2FzIHJlZ2lzdGVyZWQgYW5kIG5vdy4KKwkgKi8KKwlpZiAoIShyYyA9IHJlcXVlc3RfaXJxKGlycSwgJmh2Y3NfaGFuZGxlX2ludGVycnVwdCwKKwkJCQlTQV9JTlRFUlJVUFQsICJpYm1odmNzIiwgaHZjc2QpKSkgeworCQkvKgorCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGUgdnR5LXNlcnZlciB3YXMgcmVtb3ZlZCBhZnRlciB0aGUgaXJxIHdhcworCQkgKiByZXF1ZXN0ZWQgYnV0IGJlZm9yZSB3ZSBoYXZlIHRpbWUgdG8gZW5hYmxlIGludGVycnVwdHMuCisJCSAqLworCQlpZiAodmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHZkZXYpID09IEhfU3VjY2VzcykKKwkJCXJldHVybiAwOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogaW50IGVuYWJsZSBmYWlsZWQgZm9yIgorCQkJCQkiIHZ0eS1zZXJ2ZXJAJVguXG4iLCB1bml0X2FkZHJlc3MpOworCQkJZnJlZV9pcnEoaXJxLCBodmNzZCk7CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiBpcnEgcmVxIGZhaWxlZCBmb3IiCisJCQkJIiB2dHktc2VydmVyQCVYLlxuIiwgdW5pdF9hZGRyZXNzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWh2Y3NfcGFydG5lcl9mcmVlKGh2Y3NkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworCit9CisKKy8qCisgKiBUaGlzIGFsd2F5cyBpbmNyZW1lbnRzIHRoZSBrb2JqZWN0IHJlZiBjb3VudCBpZiB0aGUgY2FsbCBpcyBzdWNjZXNzZnVsLgorICogUGxlYXNlIHJlbWVtYmVyIHRvIGRlYyB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZSBpbnN0YW5jZS4KKyAqCisgKiBOT1RJQ0U6IERvIE5PVCBob2xkIGVpdGhlciB0aGUgaHZjc19zdHJ1Y3QubG9jayBvciBodmNzX3N0cnVjdHNfbG9jayB3aGVuCisgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3IgeW91IHdpbGwgZ2V0IGRlYWRsb2NrLgorICovCitzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NfZ2V0X2J5X2luZGV4KGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisJLyogV2UgY2FuIGltbWVkaWF0ZWx5IGRpc2NhcmQgT09CIHJlcXVlc3RzICovCisJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBIVkNTX01BWF9TRVJWRVJfQURBUFRFUlMpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShodmNzZCwgJmh2Y3Nfc3RydWN0cywgbmV4dCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoaHZjc2QtPmluZGV4ID09IGluZGV4KSB7CisJCQkJa29iamVjdF9nZXQoJmh2Y3NkLT5rb2JqKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisJCQkJcmV0dXJuIGh2Y3NkOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlodmNzZCA9IE5VTEw7CisJfQorCisJc3Bpbl91bmxvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKwlyZXR1cm4gaHZjc2Q7Cit9CisKKy8qCisgKiBUaGlzIGlzIGludm9rZWQgdmlhIHRoZSB0dHlfb3BlbiBpbnRlcmZhY2Ugd2hlbiBhIHVzZXIgYXBwIGNvbm5lY3RzIHRvIHRoZQorICogL2RldiBub2RlLgorICovCitzdGF0aWMgaW50IGh2Y3Nfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCWludCByYywgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IHZpb19kZXYgKnZkZXY7CisJdW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3M7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCisJaWYgKHR0eS0+ZHJpdmVyX2RhdGEpCisJCWdvdG8gZmFzdF9vcGVuOworCisJLyoKKwkgKiBJcyB0aGVyZSBhIHZ0eS1zZXJ2ZXIgdGhhdCBzaGFyZXMgdGhlIHNhbWUgaW5kZXg/CisJICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBrb2JqZWN0IGluZGV4LgorCSAqLworCWlmICghKGh2Y3NkID0gaHZjc19nZXRfYnlfaW5kZXgodHR5LT5pbmRleCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhWQ1M6IG9wZW4gZmFpbGVkLCBubyBkZXZpY2UgYXNzb2NpYXRlZCIKKwkJCQkiIHdpdGggdHR5LT5pbmRleCAlZC5cbiIsIHR0eS0+aW5kZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChodmNzZC0+Y29ubmVjdGVkID09IDApCisJCWlmICgocmV0dmFsID0gaHZjc19wYXJ0bmVyX2Nvbm5lY3QoaHZjc2QpKSkKKwkJCWdvdG8gZXJyb3JfcmVsZWFzZTsKKworCWh2Y3NkLT5vcGVuX2NvdW50ID0gMTsKKwlodmNzZC0+dHR5ID0gdHR5OworCXR0eS0+ZHJpdmVyX2RhdGEgPSBodmNzZDsKKworCS8qCisJICogU2V0IHRoaXMgZHJpdmVyIHRvIGxvdyBsYXRlbmN5IHNvIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIGNoYW5jZSBhdAorCSAqIGNhdGNoaW5nIGEgdGhyb3R0bGVkIFRUWSBhZnRlciB3ZSBmbGlwX2J1ZmZlcl9wdXNoLiAgT3RoZXJ3aXNlIHRoZQorCSAqIGZsdXNoX3RvX2FzeW5jIG1heSBub3QgZXhlY3V0ZSB1bnRpbCBhZnRlciB0aGUga2VybmVsX3RocmVhZCBoYXMKKwkgKiB5aWVsZGVkIGFuZCByZXN1bWVkIHRoZSBuZXh0IGZsaXBfYnVmZmVyX3B1c2ggcmVzdWx0aW5nIGluIGRhdGEKKwkgKiBsb3NzLgorCSAqLworCXR0eS0+bG93X2xhdGVuY3kgPSAxOworCisJbWVtc2V0KCZodmNzZC0+YnVmZmVyWzBdLCAweDAwLCBIVkNTX0JVRkZfTEVOKTsKKworCS8qCisJICogU2F2ZSB0aGVzZSBpbiB0aGUgc3BpbmxvY2sgZm9yIHRoZSBlbmFibGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdGhlbQorCSAqIG91dHNpZGUgb2YgdGhlIHNwaW5sb2NrLgorCSAqLworCWlycSA9IGh2Y3NkLT52ZGV2LT5pcnE7CisJdmRldiA9IGh2Y3NkLT52ZGV2OworCXVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisKKwlodmNzZC0+dG9kb19tYXNrIHw9IEhWQ1NfU0NIRURfUkVBRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGlzIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIHRoZSBzcGlubG9jayBiZWNhdXNlIGl0IHJlcXVlc3RzIGlycXMKKwkgKiBhbmQgd2lsbCBncmFiIHRoZSBzcGlubG9jayBhbmQgZnJlZSB0aGUgY29ubmVjdGlvbiBpZiBpdCBmYWlscy4KKwkgKi8KKwlpZiAoKChyYyA9IGh2Y3NfZW5hYmxlX2RldmljZShodmNzZCwgdW5pdF9hZGRyZXNzLCBpcnEsIHZkZXYpKSkpIHsKKwkJa29iamVjdF9wdXQoJmh2Y3NkLT5rb2JqKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFZDUzogZW5hYmxlIGRldmljZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWdvdG8gb3Blbl9zdWNjZXNzOworCitmYXN0X29wZW46CisJaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJaWYgKCFrb2JqZWN0X2dldCgmaHZjc2QtPmtvYmopKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogS29iamVjdCBvZiBvcGVuIgorCQkJIiBodmNzIGRvZXNuJ3QgZXhpc3QuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7IC8qIElzIHRoaXMgdGhlIHJpZ2h0IHJldHVybiB2YWx1ZT8gKi8KKwl9CisKKwlodmNzZC0+b3Blbl9jb3VudCsrOworCisJaHZjc2QtPnRvZG9fbWFzayB8PSBIVkNTX1NDSEVEX1JFQUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKK29wZW5fc3VjY2VzczoKKwlodmNzX2tpY2soKTsKKworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0eS1zZXJ2ZXJAJVggY29ubmVjdGlvbiBvcGVuZWQuXG4iLAorCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzICk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVsZWFzZToKKwlrb2JqcCA9ICZodmNzZC0+a29iajsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWtvYmplY3RfcHV0KCZodmNzZC0+a29iaik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJIVkNTOiBwYXJ0bmVyIGNvbm5lY3QgZmFpbGVkLlxuIik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgaHZjc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCWludCBpcnEgPSBOT19JUlE7CisKKwkvKgorCSAqIElzIHNvbWVvbmUgdHJ5aW5nIHRvIGNsb3NlIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldmljZSBhZnRlcgorCSAqIHdlIGhhdmUgaHVuZyB1cD8gIElmIHNvIHR0eS0+ZHJpdmVyX2RhdGEgd291bGRuJ3QgYmUgdmFsaWQuCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXJldHVybjsKKworCS8qCisJICogTm8gZHJpdmVyX2RhdGEgbWVhbnMgdGhhdCB0aGlzIGNsb3NlIHdhcyBwcm9iYWJseSBpc3N1ZWQgYWZ0ZXIgYQorCSAqIGZhaWxlZCBodmNzX29wZW4gYnkgdGhlIHR0eSBsYXllcidzIHJlbGVhc2VfZGV2KCkgYXBpIGFuZCB3ZSBjYW4ganVzdAorCSAqIGV4aXQgY2xlYW5seS4KKwkgKi8KKwlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpCisJCXJldHVybjsKKworCWh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWtvYmpwID0gJmh2Y3NkLT5rb2JqOworCWlmICgtLWh2Y3NkLT5vcGVuX2NvdW50ID09IDApIHsKKworCQl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKworCQkvKgorCQkgKiBOVUxMIHRoaXMgZWFybHkgc28gdGhhdCB0aGUga2VybmVsX3RocmVhZCBkb2Vzbid0IHRyeSB0bworCQkgKiBleGVjdXRlIGFueSBvcGVyYXRpb25zIG9uIHRoZSBUVFkgZXZlbiB0aG91Z2ggaXQgaXMgb2JsaWdhdGVkCisJCSAqIHRvIGRlbGl2ZXIgYW55IHBlbmRpbmcgSS9PIHRvIHRoZSBoeXBlcnZpc29yLgorCQkgKi8KKwkJaHZjc2QtPnR0eSA9IE5VTEw7CisKKwkJaXJxID0gaHZjc2QtPnZkZXYtPmlycTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgSFZDU19DTE9TRV9XQUlUKTsKKworCQkvKgorCQkgKiBUaGlzIGxpbmUgaXMgaW1wb3J0YW50IGJlY2F1c2UgaXQgdGVsbHMgaHZjc19vcGVuIHRoYXQgdGhpcworCQkgKiBkZXZpY2UgbmVlZHMgdG8gYmUgcmUtY29uZmlndXJlZCB0aGUgbmV4dCB0aW1lIGh2Y3Nfb3BlbiBpcworCQkgKiBjYWxsZWQuCisJCSAqLworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKworCQlmcmVlX2lycShpcnEsIGh2Y3NkKTsKKwkJa29iamVjdF9wdXQoa29ianApOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChodmNzZC0+b3Blbl9jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiB2dHktc2VydmVyQCVYIG9wZW5fY291bnQ6ICVkIgorCQkJCSIgaXMgbWlzc21hbmFnZWQuXG4iLAorCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLCBodmNzZC0+b3Blbl9jb3VudCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlrb2JqZWN0X3B1dChrb2JqcCk7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y3NfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRlbXBfb3Blbl9jb3VudDsKKwlzdHJ1Y3Qga29iamVjdCAqa29ianA7CisJaW50IGlycSA9IE5PX0lSUTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCS8qIFByZXNlcnZlIHRoaXMgc28gdGhhdCB3ZSBrbm93IGhvdyBtYW55IGtvYmplY3QgcmVmcyB0byBwdXQgKi8KKwl0ZW1wX29wZW5fY291bnQgPSBodmNzZC0+b3Blbl9jb3VudDsKKworCS8qCisJICogRG9uJ3Qga29iamVjdCBwdXQgaW5zaWRlIHRoZSBzcGlubG9jayBiZWNhdXNlIHRoZSBkZXN0cnVjdGlvbgorCSAqIGNhbGxiYWNrIG1heSB1c2UgdGhlIHNwaW5sb2NrIGFuZCBpdCBtYXkgZ2V0IGNhbGxlZCBiZWZvcmUgdGhlCisJICogc3BpbmxvY2sgaGFzIGJlZW4gcmVsZWFzZWQuICBHZXQgYSBwb2ludGVyIHRvIHRoZSBrb2JqZWN0IGFuZAorCSAqIGtvYmplY3RfcHV0IG9uIHRoYXQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBzcGlubG9jay4KKwkgKi8KKwlrb2JqcCA9ICZodmNzZC0+a29iajsKKworCXZpb19kaXNhYmxlX2ludGVycnVwdHMoaHZjc2QtPnZkZXYpOworCisJaHZjc2QtPnRvZG9fbWFzayA9IDA7CisKKwkvKiBJIGRvbid0IHRoaW5rIHRoZSB0dHkgbmVlZHMgdGhlIGh2Y3Nfc3RydWN0IHBvaW50ZXIgYWZ0ZXIgYSBoYW5ndXAgKi8KKwlodmNzZC0+dHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJaHZjc2QtPnR0eSA9IE5VTEw7CisKKwlodmNzZC0+b3Blbl9jb3VudCA9IDA7CisKKwkvKiBUaGlzIHdpbGwgZHJvcCBhbnkgYnVmZmVyZWQgZGF0YSBvbiB0aGUgZmxvb3Igd2hpY2ggaXMgT0sgaW4gYSBoYW5ndXAKKwkgKiBzY2VuYXJpby4gKi8KKwltZW1zZXQoJmh2Y3NkLT5idWZmZXJbMF0sIDB4MDAsIEhWQ1NfQlVGRl9MRU4pOworCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIgPSAwOworCisJaXJxID0gaHZjc2QtPnZkZXYtPmlycTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShpcnEsIGh2Y3NkKTsKKworCS8qCisJICogV2UgbmVlZCB0byBrb2JqZWN0X3B1dCgpIGZvciBldmVyeSBvcGVuX2NvdW50IHdlIGhhdmUgc2luY2UgdGhlCisJICogdHR5X2hhbmd1cCgpIGZ1bmN0aW9uIGRvZXNuJ3QgaW52b2tlIGEgY2xvc2UgcGVyIG9wZW4gY29ubmVjdGlvbiBvbiBhCisJICogbm9uLWNvbnNvbGUgZGV2aWNlLgorCSAqLworCXdoaWxlKHRlbXBfb3Blbl9jb3VudCkgeworCQktLXRlbXBfb3Blbl9jb3VudDsKKwkJLyoKKwkJICogVGhlIGZpbmFsIHB1dCB3aWxsIHRyaWdnZXIgZGVzdHJ1Y3Rpb24gb2YgdGhlIGh2Y3Nfc3RydWN0LgorCQkgKiBOT1RFOiAgSWYgdGhpcyBoYW5ndXAgd2FzIHNpZ25hbGVkIGZyb20gdXNlciBzcGFjZSB0aGVuIHRoZQorCQkgKiBmaW5hbCBwdXQgd2lsbCBuZXZlciBoYXBwZW4uCisJCSAqLworCQlrb2JqZWN0X3B1dChrb2JqcCk7CisJfQorfQorCisvKgorICogTk9URTogVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGZyb21fdXNlciBzaW5jZSB1c2VyIGxldmVsIGFwcHMgaW50ZXJhY3Qgd2l0aCB0aGUKKyAqIC9kZXYgbm9kZXMuIEknbSB0cnVzdGluZyB0aGF0IGlmIGh2Y3Nfd3JpdGUgZ2V0cyBjYWxsZWQgYW5kIGludGVycnVwdGVkIGJ5CisgKiBodmNzX3JlbW92ZSAod2hpY2ggcmVtb3ZlcyB0aGUgdGFyZ2V0IGRldmljZSBhbmQgZXhlY3V0ZXMgdHR5X2hhbmd1cCgpKSB0aGF0CisgKiB0dHlfaGFuZ3VwIHdpbGwgYWxsb3cgaHZjc193cml0ZSB0aW1lIHRvIGNvbXBsZXRlIGV4ZWN1dGlvbiBiZWZvcmUgaXQKKyAqIHRlcm1pbmF0ZXMgb3VyIGRldmljZS4KKyAqLworc3RhdGljIGludCBodmNzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCB1bml0X2FkZHJlc3M7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY2hhcmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0b3RhbF9zZW50ID0gMDsKKwlpbnQgdG9zZW5kID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qCisJICogSWYgdGhleSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIGNvZGUgb2ZmIG9mIHRoZWlyIG9wZW4gdGhleSBtYXkKKwkgKiBhdHRlbXB0IHRoaXMgZXZlbiBpZiB0aGVyZSBpcyBubyBjb25uZWN0ZWQgZGV2aWNlLgorCSAqLworCWlmICghaHZjc2QpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVhc29uYWJsZSBzaXplIHRvIHByZXZlbnQgdXNlciBsZXZlbCBmbG9vZGluZyAqLworCWlmIChjb3VudCA+IEhWQ1NfTUFYX0ZST01fVVNFUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJIVkNTIHdyaXRlOiBjb3VudCBiZWluZyB0cnVuY2F0ZWQgdG8iCisJCQkJIiBIVkNTX01BWF9GUk9NX1VTRVIuXG4iKTsKKwkJY291bnQgPSBIVkNTX01BWF9GUk9NX1VTRVI7CisJfQorCisJY2hhcmJ1ZiA9IGJ1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTb21laG93IGFuIG9wZW4gc3VjY2VkZGVkIGJ1dCB0aGUgZGV2aWNlIHdhcyByZW1vdmVkIG9yIHRoZQorCSAqIGNvbm5lY3Rpb24gdGVybWluYXRlZCBiZXR3ZWVuIHRoZSB2dHktc2VydmVyIGFuZCBwYXJ0bmVyIHZ0eSBkdXJpbmcKKwkgKiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUgb3BlcmF0aW9uPyAgVGhpcyBpcyBhIGNydW1teSBwbGFjZSB0byBkbyB0aGlzCisJICogYnV0IHdlIHdhbnQgdG8ga2VlcCBpdCBhbGwgaW4gdGhlIHNwaW5sb2NrLgorCSAqLworCWlmIChodmNzZC0+b3Blbl9jb3VudCA8PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXRvc2VuZCA9IG1pbihjb3VudCwgKEhWQ1NfQlVGRl9MRU4gLSBodmNzZC0+Y2hhcnNfaW5fYnVmZmVyKSk7CisJCS8qCisJCSAqIE5vIG1vcmUgc3BhY2UsIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgbGFzdCBjYWxsIHRvCisJCSAqIGh2Y3Nfd3JpdGUoKSBkaWRuJ3Qgc3VjY2VlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgZmlsbGVkIHVwLgorCQkgKi8KKwkJaWYgKCF0b3NlbmQpCisJCQlicmVhazsKKworCQltZW1jcHkoJmh2Y3NkLT5idWZmZXJbaHZjc2QtPmNoYXJzX2luX2J1ZmZlcl0sCisJCQkJJmNoYXJidWZbdG90YWxfc2VudF0sCisJCQkJdG9zZW5kKTsKKworCQlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyICs9IHRvc2VuZDsKKworCQlyZXN1bHQgPSAwOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdHJ1ZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHdyaXRpbmcgdG8gdGhlCisJCSAqIGh5cGVydmlzb3IgYmVjYXVzZSB0aGF0IGlzIHRoZSBrZXJuZWxfdGhyZWFkcyBqb2Igbm93LiAgV2UnbGwKKwkJICoganVzdCBhZGQgdG8gdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICghKGh2Y3NkLT50b2RvX21hc2sgJiBIVkNTX1RSWV9XUklURSkpCisJCQkvKiB3b24ndCBzZW5kIHBhcnRpYWwgd3JpdGVzICovCisJCQlyZXN1bHQgPSBodmNfcHV0X2NoYXJzKHVuaXRfYWRkcmVzcywKKwkJCQkJJmh2Y3NkLT5idWZmZXJbMF0sCisJCQkJCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIpOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGtub3cgd2UgaGF2ZSBlbm91Z2ggcm9vbSBpbiBodmNzZC0+YnVmZmVyIGZvcgorCQkgKiB0b3NlbmQgd2UgcmVjb3JkIHRoYXQgaXQgd2FzIHNlbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQorCQkgKiBoeXBlcnZpc29yIGFjdHVhbGx5IHRvb2sgaXQgYmVjYXVzZSB3ZSBoYXZlIGl0IGJ1ZmZlcmVkLgorCQkgKi8KKwkJdG90YWxfc2VudCs9dG9zZW5kOworCQljb3VudC09dG9zZW5kOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19UUllfV1JJVEU7CisJCQlodmNzX2tpY2soKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaHZjc2QtPmNoYXJzX2luX2J1ZmZlciA9IDA7CisJCS8qCisJCSAqIFRlc3QgYWZ0ZXIgdGhlIGNoYXJzX2luX2J1ZmZlciByZXNldCBvdGhlcndpc2UgdGhpcyBjb3VsZAorCQkgKiBkZWFkbG9jayBvdXIgd3JpdGVzIGlmIGh2Y19wdXRfY2hhcnMgZmFpbHMuCisJCSAqLworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmVzdWx0ID09IC0xKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlCisJCXJldHVybiB0b3RhbF9zZW50OworfQorCisvKgorICogVGhpcyBpcyByZWFsbHkgYXNraW5nIGhvdyBtdWNoIGNhbiB3ZSBndWFyZW50ZWUgdGhhdCB3ZSBjYW4gc2VuZCBvciB0aGF0IHdlCisgKiBhYnNvbHV0ZWx5IFdJTEwgQlVGRkVSIGlmIHdlIGNhbid0IHNlbmQgaXQuICBUaGlzIGRyaXZlciBNVVNUIGhvbm9yIHRoZQorICogcmV0dXJuIHZhbHVlLCBoZW5jZSB0aGUgcmVhc29uIGZvciBodmNzX3N0cnVjdCBidWZmZXJpbmcuCisgKi8KK3N0YXRpYyBpbnQgaHZjc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWh2Y3NkIHx8IGh2Y3NkLT5vcGVuX2NvdW50IDw9IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIEhWQ1NfQlVGRl9MRU4gLSBodmNzZC0+Y2hhcnNfaW5fYnVmZmVyOworfQorCitzdGF0aWMgaW50IGh2Y3NfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gaHZjc2QtPmNoYXJzX2luX2J1ZmZlcjsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBodmNzX29wcyA9IHsKKwkub3BlbiA9IGh2Y3Nfb3BlbiwKKwkuY2xvc2UgPSBodmNzX2Nsb3NlLAorCS5oYW5ndXAgPSBodmNzX2hhbmd1cCwKKwkud3JpdGUgPSBodmNzX3dyaXRlLAorCS53cml0ZV9yb29tID0gaHZjc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBodmNzX2NoYXJzX2luX2J1ZmZlciwKKwkudW50aHJvdHRsZSA9IGh2Y3NfdW50aHJvdHRsZSwKKwkudGhyb3R0bGUgPSBodmNzX3Rocm90dGxlLAorfTsKKworc3RhdGljIGludCBodmNzX2FsbG9jX2luZGV4X2xpc3QoaW50IG4pCit7CisJaW50IGk7CisJaHZjc19pbmRleF9saXN0ID0ga21hbGxvYyhuICogc2l6ZW9mKGh2Y3NfaW5kZXhfY291bnQpLEdGUF9LRVJORUwpOworCWlmICghaHZjc19pbmRleF9saXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlodmNzX2luZGV4X2NvdW50ID0gbjsKKwlmb3IoaSA9IDA7IGkgPCBodmNzX2luZGV4X2NvdW50OyBpKyspCisJCWh2Y3NfaW5kZXhfbGlzdFtpXSA9IC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodmNzX2ZyZWVfaW5kZXhfbGlzdCh2b2lkKQoreworCS8qIFBhcmFub2lhIGNoZWNrIHRvIGJlIHRob3JvdWdoLiAqLworCWlmIChodmNzX2luZGV4X2xpc3QpIHsKKwkJa2ZyZWUoaHZjc19pbmRleF9saXN0KTsKKwkJaHZjc19pbmRleF9saXN0ID0gTlVMTDsKKwkJaHZjc19pbmRleF9jb3VudCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBodmNzX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJjOworCWludCBudW1fdHR5c190b19hbGxvYzsKKworCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyAlc1xuIiwgaHZjc19kcml2ZXJfc3RyaW5nKTsKKworCS8qIEhhcyB0aGUgdXNlciBzcGVjaWZpZWQgYW4gb3ZlcmxvYWQgd2l0aCBhbiBpbnNtb2QgcGFyYW0/ICovCisJaWYgKGh2Y3NfcGFybV9udW1fZGV2cyA8PSAwIHx8CisJCShodmNzX3Bhcm1fbnVtX2RldnMgPiBIVkNTX01BWF9TRVJWRVJfQURBUFRFUlMpKSB7CisJCW51bV90dHlzX3RvX2FsbG9jID0gSFZDU19ERUZBVUxUX1NFUlZFUl9BREFQVEVSUzsKKwl9IGVsc2UKKwkJbnVtX3R0eXNfdG9fYWxsb2MgPSBodmNzX3Bhcm1fbnVtX2RldnM7CisKKwlodmNzX3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKG51bV90dHlzX3RvX2FsbG9jKTsKKwlpZiAoIWh2Y3NfdHR5X2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaHZjc19hbGxvY19pbmRleF9saXN0KG51bV90dHlzX3RvX2FsbG9jKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlodmNzX3R0eV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlodmNzX3R0eV9kcml2ZXItPmRyaXZlcl9uYW1lID0gaHZjc19kcml2ZXJfbmFtZTsKKwlodmNzX3R0eV9kcml2ZXItPm5hbWUgPSBodmNzX2RldmljZV9ub2RlOworCWh2Y3NfdHR5X2RyaXZlci0+ZGV2ZnNfbmFtZSA9IGh2Y3NfZGV2aWNlX25vZGU7CisKKwkvKgorCSAqIFdlJ2xsIGxldCB0aGUgc3lzdGVtIGFzc2lnbiB1cyBhIG1ham9yIG51bWJlciwgaW5kaWNhdGVkIGJ5IGxlYXZpbmcKKwkgKiBpdCBibGFuay4KKwkgKi8KKworCWh2Y3NfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgPSBIVkNTX01JTk9SX1NUQVJUOworCWh2Y3NfdHR5X2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TWVNURU07CisKKwkvKgorCSAqIFdlIHJvbGUgb3VyIG93biBzbyB0aGF0IHdlIERPTlQgRUNITy4gIFdlIGNhbid0IGVjaG8gYmVjYXVzZSB0aGUKKwkgKiBkZXZpY2Ugd2UgYXJlIGNvbm5lY3RpbmcgdG8gYWxyZWFkeSBlY2hvZXMgYnkgZGVmYXVsdCBhbmQgdGhpcyB3b3VsZAorCSAqIHRocm93IHVzIGludG8gYSBob3JyaWJsZSByZWN1cnNpdmUgZWNoby1lY2hvLWVjaG8gbG9vcC4KKwkgKi8KKwlodmNzX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IGh2Y3NfdHR5X3Rlcm1pb3M7CisJaHZjc190dHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisKKwl0dHlfc2V0X29wZXJhdGlvbnMoaHZjc190dHlfZHJpdmVyLCAmaHZjc19vcHMpOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGwgd2lsbCByZXN1bHQgaW4gc3lzZnMgZW50cmllcyB0aGF0IGRlbm90ZSB0aGUKKwkgKiBkeW5hbWljYWxseSBhc3NpZ25lZCBtYWpvciBhbmQgbWlub3IgbnVtYmVycyBmb3Igb3VyIGRldmljZXMuCisJICovCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoaHZjc190dHlfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IHJlZ2lzdHJhdGlvbiAiCisJCQkiIGFzIGEgdHR5IGRyaXZlciBmYWlsZWQuXG4iKTsKKwkJaHZjc19mcmVlX2luZGV4X2xpc3QoKTsKKwkJcHV0X3R0eV9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaHZjc19waV9idWZmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghaHZjc19waV9idWZmKSB7CisJCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCQlodmNzX2ZyZWVfaW5kZXhfbGlzdCgpOworCQlwdXRfdHR5X2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlodmNzX3Rhc2sgPSBrdGhyZWFkX3J1bihraHZjc2QsIE5VTEwsICJraHZjc2QiKTsKKwlpZiAoSVNfRVJSKGh2Y3NfdGFzaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiBraHZjc2QgY3JlYXRpb24gZmFpbGVkLiAgRHJpdmVyIG5vdCBsb2FkZWQuXG4iKTsKKwkJa2ZyZWUoaHZjc19waV9idWZmKTsKKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisJCWh2Y3NfZnJlZV9pbmRleF9saXN0KCk7CisJCXB1dF90dHlfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjc192aW9fZHJpdmVyKTsKKworCS8qCisJICogVGhpcyBuZWVkcyB0byBiZSBkb25lIEFGVEVSIHRoZSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCkgY2FsbCBvciBlbHNlCisJICogdGhlIGtvYmplY3RzIHdvbid0IGJlIGluaXRpYWxpemVkIHByb3Blcmx5LgorCSAqLworCWh2Y3NfY3JlYXRlX2RyaXZlcl9hdHRycygpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogZHJpdmVyIG1vZHVsZSBpbnNlcnRlZC5cbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaHZjc19tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qCisJICogVGhpcyBkcml2ZXIgcmVjZWl2ZXMgaHZjc19yZW1vdmUgY2FsbGJhY2tzIGZvciBlYWNoIGRldmljZSB1cG9uCisJICogbW9kdWxlIHJlbW92YWwuCisJICovCisKKwkvKgorCSAqIFRoaXMgc3luY2hyb25vdXMgb3BlcmF0aW9uICB3aWxsIHdha2UgdGhlIGtodmNzZCBrdGhyZWFkIGlmIGl0IGlzCisJICogYXNsZWVwIGFuZCB3aWxsIHJldHVybiB3aGVuIGtodmNzZCBoYXMgdGVybWluYXRlZC4KKwkgKi8KKwlrdGhyZWFkX3N0b3AoaHZjc190YXNrKTsKKworCXNwaW5fbG9jaygmaHZjc19waV9sb2NrKTsKKwlrZnJlZShodmNzX3BpX2J1ZmYpOworCWh2Y3NfcGlfYnVmZiA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CisKKwlodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnMoKTsKKworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaHZjc192aW9fZHJpdmVyKTsKKworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCisJaHZjc19mcmVlX2luZGV4X2xpc3QoKTsKKworCXB1dF90dHlfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBkcml2ZXIgbW9kdWxlIHJlbW92ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoaHZjc19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChodmNzX21vZHVsZV9leGl0KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmZyb21fdmlvX2RldihzdHJ1Y3QgdmlvX2RldiAqdmlvZCkKK3sKKwlyZXR1cm4gdmlvZC0+ZGV2LmRyaXZlcl9kYXRhOworfQorLyogVGhlIHN5c2ZzIGludGVyZmFjZSBmb3IgdGhlIGRyaXZlciBhbmQgZGV2aWNlcyAqLworCitzdGF0aWMgc3NpemVfdCBodmNzX3BhcnRuZXJfdnR5c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlWFxuIiwgaHZjc2QtPnBfdW5pdF9hZGRyZXNzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocGFydG5lcl92dHlzLCBTX0lSVUdPLCBodmNzX3BhcnRuZXJfdnR5c19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19wYXJ0bmVyX2NsY3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJXNcbiIsICZodmNzZC0+cF9sb2NhdGlvbl9jb2RlWzBdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocGFydG5lcl9jbGNzLCBTX0lSVUdPLCBodmNzX3BhcnRuZXJfY2xjc19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19jdXJyZW50X3Z0eV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKiBidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwkvKgorCSAqIERvbid0IG5lZWQgdGhpcyBmZWF0dXJlIGF0IHRoZSBwcmVzZW50IHRpbWUgYmVjYXVzZSBmaXJtd2FyZSBkb2Vzbid0CisJICogeWV0IHN1cHBvcnQgbXVsdGlwbGUgcGFydG5lcnMuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogRGVuaWVkIGN1cnJlbnRfdnR5IGNoYW5nZTogLUVQRVJNLlxuIik7CisJcmV0dXJuIC1FUEVSTTsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc19jdXJyZW50X3Z0eV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlc1xuIiwgJmh2Y3NkLT5wX2xvY2F0aW9uX2NvZGVbMF0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGN1cnJlbnRfdnR5LAorCVNfSVJVR08gfCBTX0lXVVNSLCBodmNzX2N1cnJlbnRfdnR5X3Nob3csIGh2Y3NfY3VycmVudF92dHlfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBodmNzX3Z0ZXJtX3N0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogd3JpdGluZyBhICcwJyB0byB0aGlzIHN5c2ZzIGVudHJ5IHdpbGwgcmVzdWx0IGluIHRoZSBkaXNjb25uZWN0LiAqLworCWlmIChzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChodmNzZC0+b3Blbl9jb3VudCA+IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnRlcm0gc3RhdGUgdW5jaGFuZ2VkLiAgIgorCQkJCSJUaGUgaHZjcyBkZXZpY2Ugbm9kZSBpcyBzdGlsbCBpbiB1c2UuXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoaHZjc2QtPmNvbm5lY3RlZCA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0ZXJtIHN0YXRlIHVuY2hhbmdlZC4gVGhlIgorCQkJCSIgdnR5LXNlcnZlciBpcyBub3QgY29ubmVjdGVkIHRvIGEgdnR5LlxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaHZjc19wYXJ0bmVyX2ZyZWUoaHZjc2QpOworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IENsb3NlZCB2dHktc2VydmVyQCVYIGFuZCIKKwkJCSIgcGFydG5lciB2dHlAJVg6JWQgY29ubmVjdGlvbi5cbiIsCisJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLAorCQkJaHZjc2QtPnBfdW5pdF9hZGRyZXNzLAorCQkJKHVpbnQzMl90KWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc192dGVybV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlZFxuIiwgaHZjc2QtPmNvbm5lY3RlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorc3RhdGljIERFVklDRV9BVFRSKHZ0ZXJtX3N0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJaHZjc192dGVybV9zdGF0ZV9zaG93LCBodmNzX3Z0ZXJtX3N0YXRlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19pbmRleF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlZFxuIiwgaHZjc2QtPmluZGV4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbmRleCwgU19JUlVHTywgaHZjc19pbmRleF9zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmh2Y3NfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGFydG5lcl92dHlzLmF0dHIsCisJJmRldl9hdHRyX3BhcnRuZXJfY2xjcy5hdHRyLAorCSZkZXZfYXR0cl9jdXJyZW50X3Z0eS5hdHRyLAorCSZkZXZfYXR0cl92dGVybV9zdGF0ZS5hdHRyLAorCSZkZXZfYXR0cl9pbmRleC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBodmNzX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gaHZjc19hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGh2Y3NfY3JlYXRlX2RldmljZV9hdHRycyhzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gaHZjc2QtPnZkZXY7CisJc3lzZnNfY3JlYXRlX2dyb3VwKCZ2ZGV2LT5kZXYua29iaiwgJmh2Y3NfYXR0cl9ncm91cCk7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y3NfcmVtb3ZlX2RldmljZV9hdHRycyhzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnZkZXYtPmRldi5rb2JqLCAmaHZjc19hdHRyX2dyb3VwKTsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc19yZXNjYW5fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJLyogQSAxIG1lYW5zIGl0IGlzIHVwZGF0aW5nLCBhIDAgbWVhbnMgaXQgaXMgZG9uZSB1cGRhdGluZyAqLworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBodmNzX3Jlc2Nhbl9zdGF0dXMpOworfQorCitzdGF0aWMgc3NpemVfdCBodmNzX3Jlc2Nhbl9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjb25zdCBjaGFyICogYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJaWYgKChzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCkgIT0gMSkKKwkJJiYgKGh2Y3NfcmVzY2FuX3N0YXR1cyAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlodmNzX3Jlc2Nhbl9zdGF0dXMgPSAxOworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHJlc2Nhbm5pbmcgcGFydG5lciBpbmZvIGZvciBhbGwiCisJCSIgdnR5LXNlcnZlcnMuXG4iKTsKKwlodmNzX3Jlc2Nhbl9kZXZpY2VzX2xpc3QoKTsKKwlodmNzX3Jlc2Nhbl9zdGF0dXMgPSAwOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihyZXNjYW4sCisJU19JUlVHTyB8IFNfSVdVU1IsIGh2Y3NfcmVzY2FuX3Nob3csIGh2Y3NfcmVzY2FuX3N0b3JlKTsKKworc3RhdGljIHZvaWQgaHZjc19jcmVhdGVfZHJpdmVyX2F0dHJzKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzID0gJihodmNzX3Zpb19kcml2ZXIuZHJpdmVyKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9yZXNjYW4pOworfQorCitzdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmKGh2Y3NfdmlvX2RyaXZlci5kcml2ZXIpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3Jlc2Nhbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZzaS5jIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWYxMTkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpAQCAtMCwwICsxLDEzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPiwgSUJNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogSG9zdCBWaXJ0dWFsIFNlcmlhbCBJbnRlcmZhY2UgKEhWU0kpIGlzIGEgcHJvdG9jb2wgYmV0d2VlbiB0aGUgaG9zdGVkIE9TCisgKiBhbmQgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIG9uIElCTSBwU2VyaWVzIHNlcnZlcnMuIE9uIHRoZXNlIHNlcnZlcnMsIHRoZXJlCisgKiBhcmUgbm8gc2VyaWFsIHBvcnRzIHVuZGVyIHRoZSBPUydzIGNvbnRyb2wsIGFuZCBzb21ldGltZXMgdGhlcmUgaXMgbm8gb3RoZXIKKyAqIGNvbnNvbGUgYXZhaWxhYmxlIGVpdGhlci4gSG93ZXZlciwgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGhhcyB0d28gc3RhbmRhcmQKKyAqIHNlcmlhbCBwb3J0cywgc28gdGhpcyBvdmVyLWNvbXBsaWNhdGVkIHByb3RvY29sIGFsbG93cyB0aGUgT1MgdG8gY29udHJvbAorICogdGhvc2UgcG9ydHMgYnkgcHJveHkuCisgKgorICogQmVzaWRlcyBkYXRhLCB0aGUgcHJvY290b2wgc3VwcG9ydHMgdGhlIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgc2VyaWFsCisgKiBwb3J0J3MgRFRSIGxpbmUsIGFuZCB0aGUgcmVhZGluZyBvZiB0aGUgQ0QgbGluZS4gVGhpcyBpcyB0byBhbGxvdyB0aGUgT1MgdG8KKyAqIGNvbnRyb2wgYSBtb2RlbSBhdHRhY2hlZCB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IncyBzZXJpYWwgcG9ydC4gTm90ZSB0aGF0CisgKiB0aGUgT1MgY2Fubm90IGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIHBvcnQgdGhyb3VnaCB0aGlzIHByb3RvY29sLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworI2RlZmluZSBIVlNJX01BSk9SCTIyOQorI2RlZmluZSBIVlNJX01JTk9SCTEyOAorI2RlZmluZSBNQVhfTlJfSFZTSV9DT05TT0xFUyA0CisKKyNkZWZpbmUgSFZTSV9USU1FT1VUICg1KkhaKQorI2RlZmluZSBIVlNJX1ZFUlNJT04gMQorI2RlZmluZSBIVlNJX01BWF9QQUNLRVQgMjU2CisjZGVmaW5lIEhWU0lfTUFYX1JFQUQgMTYKKyNkZWZpbmUgSFZTSV9NQVhfT1VUR09JTkdfREFUQSAxMgorI2RlZmluZSBOX09VVEJVRiAxMgorCisvKgorICogd2UgcGFzcyBkYXRhIHZpYSB0d28gOC1ieXRlIHJlZ2lzdGVycywgc28gd2Ugd291bGQgbGlrZSBvdXIgY2hhciBhcnJheXMKKyAqIHByb3Blcmx5IGFsaWduZWQgZm9yIHRob3NlIGxvYWRzLgorICovCisjZGVmaW5lIF9fQUxJR05FRF9fCV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKHNpemVvZihsb25nKSkpKQorCitzdHJ1Y3QgaHZzaV9zdHJ1Y3QgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3cml0ZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IGhhbmRzaGFrZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZW1wdHlxOyAvKiB3b2tlbiB3aGVuIG91dGJ1ZiBpcyBlbXB0aWVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3RhdGVxOyAvKiB3b2tlbiB3aGVuIEhWU0kgc3RhdGUgY2hhbmdlcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgaW5kZXg7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdWludDhfdCB0aHJvdHRsZV9idWZbMTI4XTsKKwl1aW50OF90IG91dGJ1ZltOX09VVEJVRl07IC8qIHRvIGltcGxlbWVudCB3cml0ZV9yb29tIGFuZCBjaGFyc19pbl9idWZmZXIgKi8KKwkvKiBpbmJ1ZiBpcyBmb3IgcGFja2V0IHJlYXNzZW1ibHkuIGxlYXZlIGEgbGl0dGxlIHJvb20gZm9yIGxlZnRvdmVycy4gKi8KKwl1aW50OF90IGluYnVmW0hWU0lfTUFYX1BBQ0tFVCArIEhWU0lfTUFYX1JFQURdOworCXVpbnQ4X3QgKmluYnVmX2VuZDsKKwlpbnQgbl90aHJvdHRsZTsKKwlpbnQgbl9vdXRidWY7CisJdWludDMyX3QgdnRlcm1ubzsKKwl1aW50MzJfdCB2aXJxOworCWF0b21pY190IHNlcW5vOyAvKiBIVlNJIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MTZfdCBtY3RybDsKKwl1aW50OF90IHN0YXRlOyAgLyogSFZTSSBwcm90b2NvbCBzdGF0ZSAqLworCXVpbnQ4X3QgZmxhZ3M7CisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCisJdWludDhfdCBzeXNycTsKKyNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KK307CitzdGF0aWMgc3RydWN0IGh2c2lfc3RydWN0IGh2c2lfcG9ydHNbTUFYX05SX0hWU0lfQ09OU09MRVNdOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2c2lfZHJpdmVyOworc3RhdGljIGludCBodnNpX2NvdW50Oworc3RhdGljIGludCAoKmh2c2lfd2FpdCkoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgaW50IHN0YXRlKTsKKworZW51bSBIVlNJX1BST1RPQ09MX1NUQVRFIHsKKwlIVlNJX0NMT1NFRCwKKwlIVlNJX1dBSVRfRk9SX1ZFUl9SRVNQT05TRSwKKwlIVlNJX1dBSVRfRk9SX1ZFUl9RVUVSWSwKKwlIVlNJX09QRU4sCisJSFZTSV9XQUlUX0ZPUl9NQ1RSTF9SRVNQT05TRSwKKwlIVlNJX0ZTUF9ESUVELAorfTsKKyNkZWZpbmUgSFZTSV9DT05TT0xFIDB4MQorCisjZGVmaW5lIFZTX0RBVEFfUEFDS0VUX0hFQURFUiAgICAgICAgICAgMHhmZgorI2RlZmluZSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVIgICAgICAgIDB4ZmUKKyNkZWZpbmUgVlNfUVVFUllfUEFDS0VUX0hFQURFUiAgICAgICAgICAweGZkCisjZGVmaW5lIFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVIgMHhmYworCisvKiBjb250cm9sIHZlcmJzICovCisjZGVmaW5lIFZTVl9TRVRfTU9ERU1fQ1RMICAgIDEgLyogdG8gc2VydmljZSBwcm9jZXNzb3Igb25seSAqLworI2RlZmluZSBWU1ZfTU9ERU1fQ1RMX1VQREFURSAyIC8qIGZyb20gc2VydmljZSBwcm9jZXNzb3Igb25seSAqLworI2RlZmluZSBWU1ZfQ0xPU0VfUFJPVE9DT0wgICAzCisKKy8qIHF1ZXJ5IHZlcmJzICovCisjZGVmaW5lIFZTVl9TRU5EX1ZFUlNJT05fTlVNQkVSIDEKKyNkZWZpbmUgVlNWX1NFTkRfTU9ERU1fQ1RMX1NUQVRVUyAyCisKKy8qIHllcywgdGhlc2UgbWFza3MgYXJlIG5vdCBjb25zZWN1dGl2ZS4gKi8KKyNkZWZpbmUgSFZTSV9UU0RUUiAweDAxCisjZGVmaW5lIEhWU0lfVFNDRCAgMHgyMAorCitzdHJ1Y3QgaHZzaV9oZWFkZXIgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2c2lfZGF0YSB7CisJdWludDhfdCAgdHlwZTsKKwl1aW50OF90ICBsZW47CisJdWludDE2X3Qgc2Vxbm87CisJdWludDhfdCAgZGF0YVtIVlNJX01BWF9PVVRHT0lOR19EQVRBXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodnNpX2NvbnRyb2wgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQxNl90IHZlcmI7CisJLyogb3B0aW9uYWwgZGVwZW5kaW5nIG9uIHZlcmI6ICovCisJdWludDMyX3Qgd29yZDsKKwl1aW50MzJfdCBtYXNrOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2c2lfcXVlcnkgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQxNl90IHZlcmI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSB7CisJdWludDhfdCAgdHlwZTsKKwl1aW50OF90ICBsZW47CisJdWludDE2X3Qgc2Vxbm87CisJdWludDE2X3QgdmVyYjsKKwl1aW50MTZfdCBxdWVyeV9zZXFubzsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgIHZlcnNpb247CisJCXVpbnQzMl90IG1jdHJsX3dvcmQ7CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2NvbnNvbGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlyZXR1cm4gaHAtPmZsYWdzICYgSFZTSV9DT05TT0xFOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19vcGVuKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJLyogaWYgd2UncmUgd2FpdGluZyBmb3IgYW4gbWN0cmwgdGhlbiB3ZSdyZSBhbHJlYWR5IG9wZW4gKi8KKwlyZXR1cm4gKGhwLT5zdGF0ZSA9PSBIVlNJX09QRU4pCisJCQl8fCAoaHAtPnN0YXRlID09IEhWU0lfV0FJVF9GT1JfTUNUUkxfUkVTUE9OU0UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc3RhdGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKyNpZmRlZiBERUJVRworCXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZV9uYW1lc1tdID0geworCQkiSFZTSV9DTE9TRUQiLAorCQkiSFZTSV9XQUlUX0ZPUl9WRVJfUkVTUE9OU0UiLAorCQkiSFZTSV9XQUlUX0ZPUl9WRVJfUVVFUlkiLAorCQkiSFZTSV9PUEVOIiwKKwkJIkhWU0lfV0FJVF9GT1JfTUNUUkxfUkVTUE9OU0UiLAorCQkiSFZTSV9GU1BfRElFRCIsCisJfTsKKwljb25zdCBjaGFyICpuYW1lID0gc3RhdGVfbmFtZXNbaHAtPnN0YXRlXTsKKworCWlmIChocC0+c3RhdGUgPiAoc2l6ZW9mKHN0YXRlX25hbWVzKS9zaXplb2YoY2hhciopKSkKKwkJbmFtZSA9ICJVTktOT1dOIjsKKworCXByX2RlYnVnKCJodnNpJWk6IHN0YXRlID0gJXNcbiIsIGhwLT5pbmRleCwgbmFtZSk7CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSkKK3sKKwlocC0+c3RhdGUgPSBzdGF0ZTsKKwlwcmludF9zdGF0ZShocCk7CisJd2FrZV91cF9hbGwoJmhwLT5zdGF0ZXEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJX19zZXRfc3RhdGUoaHAsIHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZW5fcGFja2V0KGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlyZXR1cm4gKGludCkoKHN0cnVjdCBodnNpX2hlYWRlciAqKXBhY2tldCktPmxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgaHZzaV9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgaHZzaV9oZWFkZXIgKilwYWNrZXQ7CisJcmV0dXJuIGhlYWRlci0+dHlwZSA+PSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSOworfQorCitzdGF0aWMgaW5saW5lIGludCBnb3RfcGFja2V0KGNvbnN0IHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlpZiAoaHAtPmluYnVmX2VuZCA8IHBhY2tldCArIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpKQorCQlyZXR1cm4gMDsgLyogZG9uJ3QgZXZlbiBoYXZlIHRoZSBwYWNrZXQgaGVhZGVyICovCisKKwlpZiAoaHAtPmluYnVmX2VuZCA8IChwYWNrZXQgKyBsZW5fcGFja2V0KHBhY2tldCkpKQorCQlyZXR1cm4gMDsgLyogZG9uJ3QgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgcGFja2V0ICovCisKKwlyZXR1cm4gMTsKK30KKworLyogc2hpZnQgcmVtYWluaW5nIGJ5dGVzIGluIHBhY2tldGJ1ZiBkb3duICovCitzdGF0aWMgdm9pZCBjb21wYWN0X2luYnVmKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnJlYWRfdG8pCit7CisJaW50IHJlbWFpbmluZyA9IChpbnQpKGhwLT5pbmJ1Zl9lbmQgLSByZWFkX3RvKTsKKworCXByX2RlYnVnKCIlczogJWkgY2hhcnMgcmVtYWluXG4iLCBfX0ZVTkNUSU9OX18sIHJlbWFpbmluZyk7CisKKwlpZiAocmVhZF90byAhPSBocC0+aW5idWYpCisJCW1lbW1vdmUoaHAtPmluYnVmLCByZWFkX3RvLCByZW1haW5pbmcpOworCisJaHAtPmluYnVmX2VuZCA9IGhwLT5pbmJ1ZiArIHJlbWFpbmluZzsKK30KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRiZ19kdW1wX3BhY2tldChwYWNrZXQpIGR1bXBfcGFja2V0KHBhY2tldCkKKyNkZWZpbmUgZGJnX2R1bXBfaGV4KGRhdGEsIGxlbikgZHVtcF9oZXgoZGF0YSwgbGVuKQorI2Vsc2UKKyNkZWZpbmUgZGJnX2R1bXBfcGFja2V0KHBhY2tldCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkYmdfZHVtcF9oZXgoZGF0YSwgbGVuKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgZHVtcF9oZXgoY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXByaW50aygiICAgICIpOworCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspCisJCXByaW50aygiJS4yeCIsIGRhdGFbaV0pOworCisJcHJpbnRrKCJcbiAgICAiKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpc3ByaW50KGRhdGFbaV0pKQorCQkJcHJpbnRrKCIlYyIsIGRhdGFbaV0pOworCQllbHNlCisJCQlwcmludGsoIi4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BhY2tldCh1aW50OF90ICpwYWNrZXQpCit7CisJc3RydWN0IGh2c2lfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IGh2c2lfaGVhZGVyICopcGFja2V0OworCisJcHJpbnRrKCJ0eXBlIDB4JXgsIGxlbiAlaSwgc2Vxbm8gJWk6XG4iLCBoZWFkZXItPnR5cGUsIGhlYWRlci0+bGVuLAorCQkJaGVhZGVyLT5zZXFubyk7CisKKwlkdW1wX2hleChwYWNrZXQsIGhlYWRlci0+bGVuKTsKK30KKworLyogY2FuJ3QgdXNlIGh2Y19nZXRfY2hhcnMgYmVjYXVzZSB0aGF0IHN0cmlwcyBDUnMgKi8KK3N0YXRpYyBpbnQgaHZzaV9yZWFkKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZ290OworCisJaWYgKHBscGFyX2hjYWxsKEhfR0VUX1RFUk1fQ0hBUiwgaHAtPnZ0ZXJtbm8sIDAsIDAsIDAsICZnb3QsCisJCQkodW5zaWduZWQgbG9uZyAqKWJ1ZiwgKHVuc2lnbmVkIGxvbmcgKilidWYrMSkgPT0gSF9TdWNjZXNzKQorCQlyZXR1cm4gZ290OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodnNpX3JlY3ZfY29udHJvbChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50OF90ICpwYWNrZXQsCisJc3RydWN0IHR0eV9zdHJ1Y3QgKip0b19oYW5ndXAsIHN0cnVjdCBodnNpX3N0cnVjdCAqKnRvX2hhbmRzaGFrZSkKK3sKKwlzdHJ1Y3QgaHZzaV9jb250cm9sICpoZWFkZXIgPSAoc3RydWN0IGh2c2lfY29udHJvbCAqKXBhY2tldDsKKworCXN3aXRjaCAoaGVhZGVyLT52ZXJiKSB7CisJCWNhc2UgVlNWX01PREVNX0NUTF9VUERBVEU6CisJCQlpZiAoKGhlYWRlci0+d29yZCAmIEhWU0lfVFNDRCkgPT0gMCkgeworCQkJCS8qIENEIHdlbnQgYXdheTsgbm8gbW9yZSBjb25uZWN0aW9uICovCisJCQkJcHJfZGVidWcoImh2c2klaTogQ0QgZHJvcHBlZFxuIiwgaHAtPmluZGV4KTsKKwkJCQlocC0+bWN0cmwgJj0gVElPQ01fQ0Q7CisJCQkJaWYgKCEoaHAtPnR0eS0+ZmxhZ3MgJiBDTE9DQUwpKQorCQkJCQkqdG9faGFuZ3VwID0gaHAtPnR0eTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZTVl9DTE9TRV9QUk9UT0NPTDoKKwkJCXByX2RlYnVnKCJodnNpJWk6IHNlcnZpY2UgcHJvY2Vzc29yIGNhbWUgYmFja1xuIiwgaHAtPmluZGV4KTsKKwkJCWlmIChocC0+c3RhdGUgIT0gSFZTSV9DTE9TRUQpIHsKKwkJCQkqdG9faGFuZHNoYWtlID0gaHA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImh2c2klaTogdW5rbm93biBIVlNJIGNvbnRyb2wgcGFja2V0OiAiLAorCQkJCWhwLT5pbmRleCk7CisJCQlkdW1wX3BhY2tldChwYWNrZXQpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBodnNpX3JlY3ZfcmVzcG9uc2Uoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlICpyZXNwID0gKHN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlICopcGFja2V0OworCisJc3dpdGNoIChocC0+c3RhdGUpIHsKKwkJY2FzZSBIVlNJX1dBSVRfRk9SX1ZFUl9SRVNQT05TRToKKwkJCV9fc2V0X3N0YXRlKGhwLCBIVlNJX1dBSVRfRk9SX1ZFUl9RVUVSWSk7CisJCQlicmVhazsKKwkJY2FzZSBIVlNJX1dBSVRfRk9SX01DVFJMX1JFU1BPTlNFOgorCQkJaHAtPm1jdHJsID0gMDsKKwkJCWlmIChyZXNwLT51Lm1jdHJsX3dvcmQgJiBIVlNJX1RTRFRSKQorCQkJCWhwLT5tY3RybCB8PSBUSU9DTV9EVFI7CisJCQlpZiAocmVzcC0+dS5tY3RybF93b3JkICYgSFZTSV9UU0NEKQorCQkJCWhwLT5tY3RybCB8PSBUSU9DTV9DRDsKKwkJCV9fc2V0X3N0YXRlKGhwLCBIVlNJX09QRU4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogdW5leHBlY3RlZCBxdWVyeSByZXNwb25zZTogIiwgaHAtPmluZGV4KTsKKwkJCWR1bXBfcGFja2V0KHBhY2tldCk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qIHJlc3BvbmQgdG8gc2VydmljZSBwcm9jZXNzb3IncyB2ZXJzaW9uIHF1ZXJ5ICovCitzdGF0aWMgaW50IGh2c2lfdmVyc2lvbl9yZXNwb25kKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQxNl90IHF1ZXJ5X3NlcW5vKQoreworCXN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlIHBhY2tldCBfX0FMSUdORURfXzsKKwlpbnQgd3JvdGU7CisKKwlwYWNrZXQudHlwZSA9IFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0LmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSk7CisJcGFja2V0LnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CisJcGFja2V0LnZlcmIgPSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUjsKKwlwYWNrZXQudS52ZXJzaW9uID0gSFZTSV9WRVJTSU9OOworCXBhY2tldC5xdWVyeV9zZXFubyA9IHF1ZXJ5X3NlcW5vKzE7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogY291bGRuJ3Qgc2VuZCBxdWVyeSByZXNwb25zZSFcbiIsCisJCQlocC0+aW5kZXgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHZzaV9yZWN2X3F1ZXJ5KHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgaHZzaV9xdWVyeSAqcXVlcnkgPSAoc3RydWN0IGh2c2lfcXVlcnkgKilwYWNrZXQ7CisKKwlzd2l0Y2ggKGhwLT5zdGF0ZSkgeworCQljYXNlIEhWU0lfV0FJVF9GT1JfVkVSX1FVRVJZOgorCQkJaHZzaV92ZXJzaW9uX3Jlc3BvbmQoaHAsIHF1ZXJ5LT5zZXFubyk7CisJCQlfX3NldF9zdGF0ZShocCwgSFZTSV9PUEVOKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IHVuZXhwZWN0ZWQgcXVlcnk6ICIsIGhwLT5pbmRleCk7CisJCQlkdW1wX3BhY2tldChwYWNrZXQpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBodnNpX2luc2VydF9jaGFycyhzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWNoYXIgYyA9IGJ1ZltpXTsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkJaWYgKGMgPT0gJ1wwJykgeworCQkJaHAtPnN5c3JxID0gMTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGhwLT5zeXNycSkgeworCQkJaGFuZGxlX3N5c3JxKGMsIE5VTEwsIGhwLT50dHkpOworCQkJaHAtPnN5c3JxID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYgLyogQ09ORklHX01BR0lDX1NZU1JRICovCisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKGhwLT50dHksIGMsIDApOworCX0KK30KKworLyoKKyAqIFdlIGNvdWxkIGdldCAyNTIgYnl0ZXMgb2YgZGF0YSBhdCBvbmNlIGhlcmUuIEJ1dCB0aGUgdHR5IGxheWVyIG9ubHkKKyAqIHRocm90dGxlcyB1cyBhdCBUVFlfVEhSRVNIT0xEX1RIUk9UVExFICgxMjgpIGJ5dGVzLCBzbyB3ZSBjb3VsZCBvdmVyZmxvdworICogaXQuIEFjY29yZGluZ2x5IHdlIHdvbid0IHNlbmQgbW9yZSB0aGFuIDEyOCBieXRlcyBhdCBhIHRpbWUgdG8gdGhlIGZsaXAKKyAqIGJ1ZmZlciwgd2hpY2ggd2lsbCBnaXZlIHRoZSB0dHkgYnVmZmVyIGEgY2hhbmNlIHRvIHRocm90dGxlIHVzLiBTaG91bGQgdGhlCisgKiB2YWx1ZSBvZiBUVFlfVEhSRVNIT0xEX1RIUk9UVExFIGNoYW5nZSBpbiBuX3R0eS5jLCB0aGlzIGNvZGUgc2hvdWxkIGJlCisgKiByZXZpc2l0ZWQuCisgKi8KKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSAxMjgKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqaHZzaV9yZWN2X2RhdGEoc3RydWN0IGh2c2lfc3RydWN0ICpocCwKKwkJY29uc3QgdWludDhfdCAqcGFja2V0KQoreworCWNvbnN0IHN0cnVjdCBodnNpX2hlYWRlciAqaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBodnNpX2hlYWRlciAqKXBhY2tldDsKKwljb25zdCB1aW50OF90ICpkYXRhID0gcGFja2V0ICsgc2l6ZW9mKHN0cnVjdCBodnNpX2hlYWRlcik7CisJaW50IGRhdGFsZW4gPSBoZWFkZXItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpOworCWludCBvdmVyZmxvdyA9IGRhdGFsZW4gLSBUVFlfVEhSRVNIT0xEX1RIUk9UVExFOworCisJcHJfZGVidWcoInF1ZXVlaW5nICVpIGNoYXJzICclLipzJ1xuIiwgZGF0YWxlbiwgZGF0YWxlbiwgZGF0YSk7CisKKwlpZiAoZGF0YWxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChvdmVyZmxvdyA+IDApIHsKKwkJcHJfZGVidWcoIiVzOiBnb3QgPlRUWV9USFJFU0hPTERfVEhST1RUTEUgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRhdGFsZW4gPSBUVFlfVEhSRVNIT0xEX1RIUk9UVExFOworCX0KKworCWh2c2lfaW5zZXJ0X2NoYXJzKGhwLCBkYXRhLCBkYXRhbGVuKTsKKworCWlmIChvdmVyZmxvdyA+IDApIHsKKwkJLyoKKwkJICogd2Ugc3RpbGwgaGF2ZSBtb3JlIGRhdGEgdG8gZGVsaXZlciwgc28gd2UgbmVlZCB0byBzYXZlIG9mZiB0aGUKKwkJICogb3ZlcmZsb3cgYW5kIHNlbmQgaXQgbGF0ZXIKKwkJICovCisJCXByX2RlYnVnKCIlczogZGVmZXJyaW5nIG92ZXJmbG93XG4iLCBfX0ZVTkNUSU9OX18pOworCQltZW1jcHkoaHAtPnRocm90dGxlX2J1ZiwgZGF0YSArIFRUWV9USFJFU0hPTERfVEhST1RUTEUsIG92ZXJmbG93KTsKKwkJaHAtPm5fdGhyb3R0bGUgPSBvdmVyZmxvdzsKKwl9CisKKwlyZXR1cm4gaHAtPnR0eTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGRhdGEgc3VjY2Vzc2Z1bGx5IHJlYWQgZnJvbSBoeXBlcnZpc29yLgorICogVXNlZCBib3RoIHRvIGdldCBwYWNrZXRzIGZvciB0dHkgY29ubmVjdGlvbnMgYW5kIHRvIGFkdmFuY2UgdGhlIHN0YXRlCisgKiBtYWNoaW5lIGR1cmluZyBjb25zb2xlIGhhbmRzaGFraW5nIChpbiB3aGljaCBjYXNlIHR0eSA9IE5VTEwgYW5kIHdlIGlnbm9yZQorICogaW5jb21pbmcgZGF0YSkuCisgKi8KK3N0YXRpYyBpbnQgaHZzaV9sb2FkX2NodW5rKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHN0cnVjdCB0dHlfc3RydWN0ICoqZmxpcCwKKwkJc3RydWN0IHR0eV9zdHJ1Y3QgKipoYW5ndXAsIHN0cnVjdCBodnNpX3N0cnVjdCAqKmhhbmRzaGFrZSkKK3sKKwl1aW50OF90ICpwYWNrZXQgPSBocC0+aW5idWY7CisJaW50IGNodW5rbGVuOworCisJKmZsaXAgPSBOVUxMOworCSpoYW5ndXAgPSBOVUxMOworCSpoYW5kc2hha2UgPSBOVUxMOworCisJY2h1bmtsZW4gPSBodnNpX3JlYWQoaHAsIGhwLT5pbmJ1Zl9lbmQsIEhWU0lfTUFYX1JFQUQpOworCWlmIChjaHVua2xlbiA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogMC1sZW5ndGggcmVhZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJfZGVidWcoIiVzOiBnb3QgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgY2h1bmtsZW4pOworCWRiZ19kdW1wX2hleChocC0+aW5idWZfZW5kLCBjaHVua2xlbik7CisKKwlocC0+aW5idWZfZW5kICs9IGNodW5rbGVuOworCisJLyogaGFuZGxlIGFsbCBjb21wbGV0ZWQgcGFja2V0cyAqLworCXdoaWxlICgocGFja2V0IDwgaHAtPmluYnVmX2VuZCkgJiYgZ290X3BhY2tldChocCwgcGFja2V0KSkgeworCQlzdHJ1Y3QgaHZzaV9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgaHZzaV9oZWFkZXIgKilwYWNrZXQ7CisKKwkJaWYgKCFpc19oZWFkZXIocGFja2V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGdvdCBtYWxmb3JtZWQgcGFja2V0XG4iLCBocC0+aW5kZXgpOworCQkJLyogc2tpcCBieXRlcyB1bnRpbCB3ZSBmaW5kIGEgaGVhZGVyIG9yIHJ1biBvdXQgb2YgZGF0YSAqLworCQkJd2hpbGUgKChwYWNrZXQgPCBocC0+aW5idWZfZW5kKSAmJiAoIWlzX2hlYWRlcihwYWNrZXQpKSkKKwkJCQlwYWNrZXQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiBoYW5kbGluZyAlaS1ieXRlIHBhY2tldFxuIiwgX19GVU5DVElPTl9fLAorCQkJCWxlbl9wYWNrZXQocGFja2V0KSk7CisJCWRiZ19kdW1wX3BhY2tldChwYWNrZXQpOworCisJCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7CisJCQljYXNlIFZTX0RBVEFfUEFDS0VUX0hFQURFUjoKKwkJCQlpZiAoIWlzX29wZW4oaHApKQorCQkJCQlicmVhazsKKwkJCQlpZiAoaHAtPnR0eSA9PSBOVUxMKQorCQkJCQlicmVhazsgLyogbm8gdHR5IGJ1ZmZlciB0byBwdXQgZGF0YSBpbiAqLworCQkJCSpmbGlwID0gaHZzaV9yZWN2X2RhdGEoaHAsIHBhY2tldCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUjoKKwkJCQlodnNpX3JlY3ZfY29udHJvbChocCwgcGFja2V0LCBoYW5ndXAsIGhhbmRzaGFrZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVI6CisJCQkJaHZzaV9yZWN2X3Jlc3BvbnNlKGhwLCBwYWNrZXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOgorCQkJCWh2c2lfcmVjdl9xdWVyeShocCwgcGFja2V0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IHVua25vd24gSFZTSSBwYWNrZXQgdHlwZSAweCV4XG4iLAorCQkJCQkJaHAtPmluZGV4LCBoZWFkZXItPnR5cGUpOworCQkJCWR1bXBfcGFja2V0KHBhY2tldCk7CisJCQkJYnJlYWs7CisJCX0KKworCQlwYWNrZXQgKz0gbGVuX3BhY2tldChwYWNrZXQpOworCisJCWlmICgqaGFuZ3VwIHx8ICpoYW5kc2hha2UpIHsKKwkJCXByX2RlYnVnKCIlczogaGFuZ3VwIG9yIGhhbmRzaGFrZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qCisJCQkgKiB3ZSBuZWVkIHRvIHNlbmQgdGhlIGhhbmd1cCBub3cgYmVmb3JlIHJlY2VpdmluZyBhbnkgbW9yZSBkYXRhLgorCQkJICogSWYgd2UgZ2V0ICJkYXRhLCBoYW5ndXAsIGRhdGEiLCB3ZSBjYW4ndCBkZWxpdmVyIHRoZSBzZWNvbmQKKwkJCSAqIGRhdGEgYmVmb3JlIHRoZSBoYW5ndXAuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJY29tcGFjdF9pbmJ1ZihocCwgcGFja2V0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBodnNpX3NlbmRfb3ZlcmZsb3coc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlwcl9kZWJ1ZygiJXM6IGRlbGl2ZXJpbmcgJWkgYnl0ZXMgb3ZlcmZsb3dcbiIsIF9fRlVOQ1RJT05fXywKKwkJCWhwLT5uX3Rocm90dGxlKTsKKworCWh2c2lfaW5zZXJ0X2NoYXJzKGhwLCBocC0+dGhyb3R0bGVfYnVmLCBocC0+bl90aHJvdHRsZSk7CisJaHAtPm5fdGhyb3R0bGUgPSAwOworfQorCisvKgorICogbXVzdCBnZXQgYWxsIHBlbmRpbmcgZGF0YSBiZWNhdXNlIHdlIG9ubHkgZ2V0IGFuIGlycSBvbiBlbXB0eS0+bm9uLWVtcHR5CisgKiB0cmFuc2l0aW9uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodnNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopYXJnOworCXN0cnVjdCB0dHlfc3RydWN0ICpmbGlwOworCXN0cnVjdCB0dHlfc3RydWN0ICpoYW5ndXA7CisJc3RydWN0IGh2c2lfc3RydWN0ICpoYW5kc2hha2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYWdhaW4gPSAxOworCisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJd2hpbGUgKGFnYWluKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCQlhZ2FpbiA9IGh2c2lfbG9hZF9jaHVuayhocCwgJmZsaXAsICZoYW5ndXAsICZoYW5kc2hha2UpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIHdlIGhhdmUgdG8gY2FsbCB0dHlfZmxpcF9idWZmZXJfcHVzaCgpIGFuZCB0dHlfaGFuZ3VwKCkgb3V0c2lkZSBvdXIKKwkJICogc3BpbmxvY2suIEJ1dCB3ZSBhbHNvIGhhdmUgdG8ga2VlcCBnb2luZyB1bnRpbCB3ZSd2ZSByZWFkIGFsbCB0aGUKKwkJICogYXZhaWxhYmxlIGRhdGEuCisJCSAqLworCisJCWlmIChmbGlwKSB7CisJCQkvKiB0aGVyZSB3YXMgZGF0YSBwdXQgaW4gdGhlIHR0eSBmbGlwIGJ1ZmZlciAqLworCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goZmxpcCk7CisJCQlmbGlwID0gTlVMTDsKKwkJfQorCisJCWlmIChoYW5ndXApIHsKKwkJCXR0eV9oYW5ndXAoaGFuZ3VwKTsKKwkJfQorCisJCWlmIChoYW5kc2hha2UpIHsKKwkJCXByX2RlYnVnKCJodnNpJWk6IGF0dGVtcHRpbmcgcmUtaGFuZHNoYWtlXG4iLCBoYW5kc2hha2UtPmluZGV4KTsKKwkJCXNjaGVkdWxlX3dvcmsoJmhhbmRzaGFrZS0+aGFuZHNoYWtlcik7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHAtPnR0eSAmJiBocC0+bl90aHJvdHRsZQorCQkJJiYgKCF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmaHAtPnR0eS0+ZmxhZ3MpKSkgeworCQkvKiB3ZSB3ZXJlbid0IGh1bmcgdXAgYW5kIHdlIHdlcmVuJ3QgdGhyb3R0bGVkLCBzbyB3ZSBjYW4gZGVsaXZlciB0aGUKKwkJICogcmVzdCBub3cgKi8KKwkJZmxpcCA9IGhwLT50dHk7CisJCWh2c2lfc2VuZF9vdmVyZmxvdyhocCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZmxpcCkgeworCQl0dHlfZmxpcF9idWZmZXJfcHVzaChmbGlwKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGZvciBib290IGNvbnNvbGUsIGJlZm9yZSB0aGUgaXJxIGhhbmRsZXIgaXMgcnVubmluZyAqLworc3RhdGljIGludCBfX2luaXQgcG9sbF9mb3Jfc3RhdGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXMgPSBqaWZmaWVzICsgSFZTSV9USU1FT1VUOworCisJZm9yICg7OykgeworCQlodnNpX2ludGVycnVwdChocC0+dmlycSwgKHZvaWQgKilocCwgTlVMTCk7IC8qIGdldCBwZW5kaW5nIGRhdGEgKi8KKworCQlpZiAoaHAtPnN0YXRlID09IHN0YXRlKQorCQkJcmV0dXJuIDA7CisKKwkJbWRlbGF5KDUpOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbmRfamlmZmllcykpCisJCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKKy8qIHdhaXQgZm9yIGlycSBoYW5kbGVyIHRvIGNoYW5nZSBvdXIgc3RhdGUgKi8KK3N0YXRpYyBpbnQgd2FpdF9mb3Jfc3RhdGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgaW50IHN0YXRlKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQoaHAtPnN0YXRlcSwgKGhwLT5zdGF0ZSA9PSBzdGF0ZSksIEhWU0lfVElNRU9VVCkpCisJCXJldCA9IC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGh2c2lfcXVlcnkoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDE2X3QgdmVyYikKK3sKKwlzdHJ1Y3QgaHZzaV9xdWVyeSBwYWNrZXQgX19BTElHTkVEX187CisJaW50IHdyb3RlOworCisJcGFja2V0LnR5cGUgPSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOworCXBhY2tldC5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfcXVlcnkpOworCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC52ZXJiID0gdmVyYjsKKworCXByX2RlYnVnKCIlczogc2VuZGluZyAlaSBieXRlc1xuIiwgX19GVU5DVElPTl9fLCBwYWNrZXQubGVuKTsKKwlkYmdfZHVtcF9oZXgoKHVpbnQ4X3QqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworCisJd3JvdGUgPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCAoY2hhciAqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworCWlmICh3cm90ZSAhPSBwYWNrZXQubGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBjb3VsZG4ndCBzZW5kIHF1ZXJ5ICglaSkhXG4iLCBocC0+aW5kZXgsCisJCQl3cm90ZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh2c2lfZ2V0X21jdHJsKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJaW50IHJldDsKKworCXNldF9zdGF0ZShocCwgSFZTSV9XQUlUX0ZPUl9NQ1RSTF9SRVNQT05TRSk7CisJaHZzaV9xdWVyeShocCwgVlNWX1NFTkRfTU9ERU1fQ1RMX1NUQVRVUyk7CisKKwlyZXQgPSBodnNpX3dhaXQoaHAsIEhWU0lfT1BFTik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGRpZG4ndCBnZXQgbW9kZW0gZmxhZ3NcbiIsIGhwLT5pbmRleCk7CisJCXNldF9zdGF0ZShocCwgSFZTSV9PUEVOKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG1jdHJsIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgaHAtPm1jdHJsKTsKKworCXJldHVybiAwOworfQorCisvKiBub3RlIHRoYXQgd2UgY2FuIG9ubHkgc2V0IERUUiAqLworc3RhdGljIGludCBodnNpX3NldF9tY3RybChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50MTZfdCBtY3RybCkKK3sKKwlzdHJ1Y3QgaHZzaV9jb250cm9sIHBhY2tldCBfX0FMSUdORURfXzsKKwlpbnQgd3JvdGU7CisKKwlwYWNrZXQudHlwZSA9IFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUiwKKwlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKKwlwYWNrZXQubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX2NvbnRyb2wpOworCXBhY2tldC52ZXJiID0gVlNWX1NFVF9NT0RFTV9DVEw7CisJcGFja2V0Lm1hc2sgPSBIVlNJX1RTRFRSOworCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQorCQlwYWNrZXQud29yZCA9IEhWU0lfVFNEVFI7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogY291bGRuJ3Qgc2V0IERUUiFcbiIsIGhwLT5pbmRleCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodnNpX2RyYWluX2lucHV0KHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJdWludDhfdCBidWZbSFZTSV9NQVhfUkVBRF0gX19BTElHTkVEX187CisJdW5zaWduZWQgbG9uZyBlbmRfamlmZmllcyA9IGppZmZpZXMgKyBIVlNJX1RJTUVPVVQ7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoZW5kX2ppZmZpZXMsIGppZmZpZXMpKQorCQlpZiAoMCA9PSBodnNpX3JlYWQoaHAsIGJ1ZiwgSFZTSV9NQVhfUkVBRCkpCisJCQlicmVhazsKK30KKworc3RhdGljIGludCBodnNpX2hhbmRzaGFrZShzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFdlIGNvdWxkIGhhdmUgYSBDTE9TRSBvciBvdGhlciBkYXRhIHdhaXRpbmcgZm9yIHVzIGJlZm9yZSB3ZSBldmVuIHRyeQorCSAqIHRvIG9wZW47IHRyeSB0byB0aHJvdyBpdCBhbGwgYXdheSBzbyB3ZSBkb24ndCBnZXQgY29uZnVzZWQuIChDTE9TRQorCSAqIGlzIHRoZSBmaXJzdCBtZXNzYWdlIHNlbnQgdXAgdGhlIHBpcGUgd2hlbiB0aGUgRlNQIGNvbWVzIG9ubGluZS4gV2UKKwkgKiBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gIml0IGNhbWUgdXAgYSB3aGlsZSBhZ28gYW5kIHdlJ3JlIHRoZSBmaXJzdAorCSAqIHVzZXIiIGFuZCAiaXQgd2FzIGp1c3QgcmVzZXQgYmVmb3JlIGl0IHNhdyBvdXIgaGFuZHNoYWtlIHBhY2tldCIuKQorCSAqLworCWh2c2lfZHJhaW5faW5wdXQoaHApOworCisJc2V0X3N0YXRlKGhwLCBIVlNJX1dBSVRfRk9SX1ZFUl9SRVNQT05TRSk7CisJcmV0ID0gaHZzaV9xdWVyeShocCwgVlNWX1NFTkRfVkVSU0lPTl9OVU1CRVIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBjb3VsZG4ndCBzZW5kIHZlcnNpb24gcXVlcnlcbiIsIGhwLT5pbmRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaHZzaV93YWl0KGhwLCBIVlNJX09QRU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfaGFuZHNoYWtlcih2b2lkICphcmcpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKilhcmc7CisKKwlpZiAoaHZzaV9oYW5kc2hha2UoaHApID49IDApCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiByZS1oYW5kc2hha2luZyBmYWlsZWRcbiIsIGhwLT5pbmRleCk7CisJaWYgKGlzX2NvbnNvbGUoaHApKSB7CisJCS8qCisJCSAqIHR0eXMgd2lsbCByZS1hdHRlbXB0IHRoZSBoYW5kc2hha2UgdmlhIGh2c2lfb3BlbiwgYnV0CisJCSAqIHRoZSBjb25zb2xlIHdpbGwgbm90LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGxvc3QgY29uc29sZSFcbiIsIGhwLT5pbmRleCk7CisJfQorfQorCitzdGF0aWMgaW50IGh2c2lfcHV0X2NoYXJzKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodnNpX2RhdGEgcGFja2V0IF9fQUxJR05FRF9fOworCWludCByZXQ7CisKKwlCVUdfT04oY291bnQgPiBIVlNJX01BWF9PVVRHT0lOR19EQVRBKTsKKworCXBhY2tldC50eXBlID0gVlNfREFUQV9QQUNLRVRfSEVBREVSOworCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC5sZW4gPSBjb3VudCArIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpOworCW1lbWNweSgmcGFja2V0LmRhdGEsIGJ1ZiwgY291bnQpOworCisJcmV0ID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAocmV0ID09IHBhY2tldC5sZW4pIHsKKwkJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgd3JpdHRlbiwgbm90IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIHJldDsgLyogcmV0dXJuIGFueSBlcnJvcnMgKi8KK30KKworc3RhdGljIHZvaWQgaHZzaV9jbG9zZV9wcm90b2NvbChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCXN0cnVjdCBodnNpX2NvbnRyb2wgcGFja2V0IF9fQUxJR05FRF9fOworCisJcGFja2V0LnR5cGUgPSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0LnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CisJcGFja2V0LmxlbiA9IDY7CisJcGFja2V0LnZlcmIgPSBWU1ZfQ0xPU0VfUFJPVE9DT0w7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCWh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIChjaGFyICopJnBhY2tldCwgcGFja2V0Lmxlbik7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGluZSA9IHR0eS0+aW5kZXg7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChsaW5lIDwgMCB8fCBsaW5lID49IGh2c2lfY291bnQpCisJCXJldHVybiAtRU5PREVWOworCWhwID0gJmh2c2lfcG9ydHNbbGluZV07CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaHA7CisJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7IC8qIGF2b2lkIHRocm90dGxlL3R0eV9mbGlwX2J1ZmZlcl9wdXNoIHJhY2UgKi8KKworCW1iKCk7CisJaWYgKGhwLT5zdGF0ZSA9PSBIVlNJX0ZTUF9ESUVEKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCWhwLT50dHkgPSB0dHk7CisJaHAtPmNvdW50Kys7CisJYXRvbWljX3NldCgmaHAtPnNlcW5vLCAwKTsKKwloX3Zpb19zaWduYWwoaHAtPnZ0ZXJtbm8sIFZJT19JUlFfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlzX2NvbnNvbGUoaHApKQorCQlyZXR1cm4gMDsgLyogdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGhhbmRzaGFrZWQgYXMgdGhlIGNvbnNvbGUgKi8KKworCXJldCA9IGh2c2lfaGFuZHNoYWtlKGhwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIVlNJIGhhbmRzaGFraW5nIGZhaWxlZFxuIiwgdHR5LT5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBodnNpX2dldF9tY3RybChocCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgZ2V0IGluaXRpYWwgbW9kZW0gZmxhZ3NcbiIsIHR0eS0+bmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaHZzaV9zZXRfbWN0cmwoaHAsIGhwLT5tY3RybCB8IFRJT0NNX0RUUik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3Qgc2V0IERUUlxuIiwgdHR5LT5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3IgaHZzaV93cml0ZV93b3JrZXIgdG8gZW1wdHkgaHAtPm91dGJ1ZiAqLworc3RhdGljIHZvaWQgaHZzaV9mbHVzaF9vdXRwdXQoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwl3YWl0X2V2ZW50X3RpbWVvdXQoaHAtPmVtcHR5cSwgKGhwLT5uX291dGJ1ZiA8PSAwKSwgSFZTSV9USU1FT1VUKTsKKworCS8qICd3cml0ZXInIGNvdWxkIHN0aWxsIGJlIHBlbmRpbmcgaWYgaXQgZGlkbid0IHNlZSBuX291dGJ1ZiA9IDAgeWV0ICovCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaHAtPndyaXRlcik7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCS8qCisJICogaXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgb3VyIHRpbWVvdXQgZXhwaXJlZCBhbmQgaHZzaV93cml0ZV93b3JrZXIKKwkgKiBkaWRuJ3QgbWFuYWdlIHRvIHB1c2ggb3V0YnVmLiBwb29mLgorCSAqLworCWhwLT5uX291dGJ1ZiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICgtLWhwLT5jb3VudCA9PSAwKSB7CisJCWhwLT50dHkgPSBOVUxMOworCQlocC0+aW5idWZfZW5kID0gaHAtPmluYnVmOyAvKiBkaXNjYXJkIHJlbWFpbmluZyBwYXJ0aWFsIHBhY2tldHMgKi8KKworCQkvKiBvbmx5IGNsb3NlIGRvd24gY29ubmVjdGlvbiBpZiBpdCBpcyBub3QgdGhlIGNvbnNvbGUgKi8KKwkJaWYgKCFpc19jb25zb2xlKGhwKSkgeworCQkJaF92aW9fc2lnbmFsKGhwLT52dGVybW5vLCBWSU9fSVJRX0RJU0FCTEUpOyAvKiBubyBtb3JlIGlycXMgKi8KKwkJCV9fc2V0X3N0YXRlKGhwLCBIVlNJX0NMT1NFRCk7CisJCQkvKgorCQkJICogYW55IGRhdGEgZGVsaXZlcmVkIHRvIHRoZSB0dHkgbGF5ZXIgYWZ0ZXIgdGhpcyB3aWxsIGJlCisJCQkgKiBkaXNjYXJkZWQgKGV4Y2VwdCBmb3IgWE9OL1hPRkYpCisJCQkgKi8KKwkJCXR0eS0+Y2xvc2luZyA9IDE7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkJCS8qIGxldCBhbnkgZXhpc3RpbmcgaXJxIGhhbmRsZXJzIGZpbmlzaC4gbm8gbW9yZSB3aWxsIHN0YXJ0LiAqLworCQkJc3luY2hyb25pemVfaXJxKGhwLT52aXJxKTsKKworCQkJLyogaHZzaV93cml0ZV93b3JrZXIgd2lsbCByZS1zY2hlZHVsZSB1bnRpbCBvdXRidWYgaXMgZW1wdHkuICovCisJCQlodnNpX2ZsdXNoX291dHB1dChocCk7CisKKwkJCS8qIHRlbGwgRlNQIHRvIHN0b3Agc2VuZGluZyBkYXRhICovCisJCQlodnNpX2Nsb3NlX3Byb3RvY29sKGhwKTsKKworCQkJLyoKKwkJCSAqIGRyYWluIGFueXRoaW5nIEZTUCBpcyBzdGlsbCBpbiB0aGUgbWlkZGxlIG9mIHNlbmRpbmcsIGFuZCBsZXQKKwkJCSAqIGh2c2lfaGFuZHNoYWtlIGRyYWluIHRoZSByZXN0IG9uIHRoZSBuZXh0IG9wZW4uCisJCQkgKi8KKwkJCWh2c2lfZHJhaW5faW5wdXQoaHApOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0gZWxzZSBpZiAoaHAtPmNvdW50IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpX2Nsb3NlICVsdTogb29wcywgY291bnQgaXMgJWRcbiIsCisJCSAgICAgICBocCAtIGh2c2lfcG9ydHMsIGhwLT5jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBodnNpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWhwLT5jb3VudCA9IDA7CisJaHAtPm5fb3V0YnVmID0gMDsKKwlocC0+dHR5ID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGNhbGxlZCB3aXRoIGhwLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGh2c2lfcHVzaChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCWludCBuOworCisJaWYgKGhwLT5uX291dGJ1ZiA8PSAwKQorCQlyZXR1cm47CisKKwluID0gaHZzaV9wdXRfY2hhcnMoaHAsIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CisJaWYgKG4gPiAwKSB7CisJCS8qIHN1Y2Nlc3MgKi8KKwkJcHJfZGVidWcoIiVzOiB3cm90ZSAlaSBjaGFyc1xuIiwgX19GVU5DVElPTl9fLCBuKTsKKwkJaHAtPm5fb3V0YnVmID0gMDsKKwl9IGVsc2UgaWYgKG4gPT0gLUVJTykgeworCQlfX3NldF9zdGF0ZShocCwgSFZTSV9GU1BfRElFRCk7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBzZXJ2aWNlIHByb2Nlc3NvciBkaWVkXG4iLCBocC0+aW5kZXgpOworCX0KK30KKworLyogaHZzaV93cml0ZV93b3JrZXIgd2lsbCBrZWVwIHJlc2NoZWR1bGluZyBpdHNlbGYgdW50aWwgb3V0YnVmIGlzIGVtcHR5ICovCitzdGF0aWMgdm9pZCBodnNpX3dyaXRlX3dvcmtlcih2b2lkICphcmcpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKilhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBERUJVRworCXN0YXRpYyBsb25nIHN0YXJ0X2ogPSAwOworCisJaWYgKHN0YXJ0X2ogPT0gMCkKKwkJc3RhcnRfaiA9IGppZmZpZXM7CisjZW5kaWYgLyogREVCVUcgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiAlaSBjaGFycyBpbiBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXywgaHAtPm5fb3V0YnVmKTsKKworCWlmICghaXNfb3BlbihocCkpIHsKKwkJLyoKKwkJICogV2UgY291bGQgaGF2ZSBhIG5vbi1vcGVuIGNvbm5lY3Rpb24gaWYgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGRpZWQKKwkJICogd2hpbGUgd2Ugd2VyZSBidXNpbHkgc2NoZWR1bGluZyBvdXJzZWx2ZXMuIEluIHRoYXQgY2FzZSwgaXQgY291bGQKKwkJICogYmUgbWludXRlcyBiZWZvcmUgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGNvbWVzIGJhY2ssIHNvIG9ubHkgdHJ5CisJCSAqIGFnYWluIG9uY2UgYSBzZWNvbmQuCisJCSAqLworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhwLT53cml0ZXIsIEhaKTsKKwkJZ290byBvdXQ7CisJfQorCisJaHZzaV9wdXNoKGhwKTsKKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZocC0+d3JpdGVyLCAxMCk7CisJZWxzZSB7CisjaWZkZWYgREVCVUcKKwkJcHJfZGVidWcoIiVzOiBvdXRidWYgZW1wdGllZCBhZnRlciAlbGkgamlmZmllc1xuIiwgX19GVU5DVElPTl9fLAorCQkJCWppZmZpZXMgLSBzdGFydF9qKTsKKwkJc3RhcnRfaiA9IDA7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJd2FrZV91cF9hbGwoJmhwLT5lbXB0eXEpOworCQlpZiAodGVzdF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJmhwLT50dHktPmZsYWdzKQorCQkJCSYmIGhwLT50dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwkJCWhwLT50dHktPmxkaXNjLndyaXRlX3dha2V1cChocC0+dHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZocC0+dHR5LT53cml0ZV93YWl0KTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGh2c2lfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBOX09VVEJVRiAtIGhwLT5uX291dGJ1ZjsKK30KKworc3RhdGljIGludCBodnNpX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBocC0+bl9vdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWNvbnN0IGNoYXIgKnNvdXJjZSA9IGJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0b3RhbCA9IDA7CisJaW50IG9yaWdjb3VudCA9IGNvdW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlwcl9kZWJ1ZygiJXM6ICVpIGNoYXJzIGluIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fLCBocC0+bl9vdXRidWYpOworCisJaWYgKCFpc19vcGVuKGhwKSkgeworCQkvKiB3ZSdyZSBlaXRoZXIgY2xvc2luZyBvciBub3QgeWV0IG9wZW47IGRvbid0IGFjY2VwdCBkYXRhICovCisJCXByX2RlYnVnKCIlczogbm90IG9wZW5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogd2hlbiB0aGUgaHlwZXJ2aXNvciBidWZmZXIgKDE2SykgZmlsbHMsIGRhdGEgd2lsbCBzdGF5IGluIGhwLT5vdXRidWYKKwkgKiBhbmQgaHZzaV93cml0ZV93b3JrZXIgd2lsbCBiZSBzY2hlZHVsZWQuIHN1YnNlcXVlbnQgaHZzaV93cml0ZSgpIGNhbGxzCisJICogd2lsbCBzZWUgdGhlcmUgaXMgbm8gcm9vbSBpbiBvdXRidWYgYW5kIHJldHVybi4KKwkgKi8KKwl3aGlsZSAoKGNvdW50ID4gMCkgJiYgKGh2c2lfd3JpdGVfcm9vbShocC0+dHR5KSA+IDApKSB7CisJCWludCBjaHVua3NpemUgPSBtaW4oY291bnQsIGh2c2lfd3JpdGVfcm9vbShocC0+dHR5KSk7CisKKwkJQlVHX09OKGhwLT5uX291dGJ1ZiA8IDApOworCQltZW1jcHkoaHAtPm91dGJ1ZiArIGhwLT5uX291dGJ1Ziwgc291cmNlLCBjaHVua3NpemUpOworCQlocC0+bl9vdXRidWYgKz0gY2h1bmtzaXplOworCisJCXRvdGFsICs9IGNodW5rc2l6ZTsKKwkJc291cmNlICs9IGNodW5rc2l6ZTsKKwkJY291bnQgLT0gY2h1bmtzaXplOworCQlodnNpX3B1c2goaHApOworCX0KKworCWlmIChocC0+bl9vdXRidWYgPiAwKSB7CisJCS8qCisJCSAqIHdlIHdlcmVuJ3QgYWJsZSB0byB3cml0ZSBpdCBhbGwgdG8gdGhlIGh5cGVydmlzb3IuCisJCSAqIHNjaGVkdWxlIGFub3RoZXIgcHVzaCBhdHRlbXB0LgorCQkgKi8KKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZocC0+d3JpdGVyLCAxMCk7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh0b3RhbCAhPSBvcmlnY291bnQpCisJCXByX2RlYnVnKCIlczogd2FudGVkICVpLCBvbmx5IHdyb3RlICVpXG4iLCBfX0ZVTkNUSU9OX18sIG9yaWdjb3VudCwKKwkJCXRvdGFsKTsKKworCXJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIEkgaGF2ZSBuZXZlciBzZWVuIHRocm90dGxlIG9yIHVudGhyb3R0bGUgY2FsbGVkLCBzbyB0aGlzIGxpdHRsZSB0aHJvdHRsZQorICogYnVmZmVyaW5nIHNjaGVtZSBtYXkgb3IgbWF5IG5vdCB3b3JrLgorICovCitzdGF0aWMgdm9pZCBodnNpX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaF92aW9fc2lnbmFsKGhwLT52dGVybW5vLCBWSU9fSVJRX0RJU0FCTEUpOworfQorCitzdGF0aWMgdm9pZCBodnNpX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc2hvdWxkZmxpcCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHAtPm5fdGhyb3R0bGUpIHsKKwkJaHZzaV9zZW5kX292ZXJmbG93KGhwKTsKKwkJc2hvdWxkZmxpcCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2hvdWxkZmxpcCkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goaHAtPnR0eSk7CisKKwloX3Zpb19zaWduYWwoaHAtPnZ0ZXJtbm8sIFZJT19JUlFfRU5BQkxFKTsKK30KKworc3RhdGljIGludCBodnNpX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCWh2c2lfZ2V0X21jdHJsKGhwKTsKKwlyZXR1cm4gaHAtPm1jdHJsOworfQorCitzdGF0aWMgaW50IGh2c2lfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50MTZfdCBuZXdfbWN0cmw7CisKKwkvKiB3ZSBjYW4gb25seSBhbHRlciBEVFIgKi8KKwljbGVhciAmPSBUSU9DTV9EVFI7CisJc2V0ICY9IFRJT0NNX0RUUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJbmV3X21jdHJsID0gKGhwLT5tY3RybCAmIH5jbGVhcikgfCBzZXQ7CisKKwlpZiAoaHAtPm1jdHJsICE9IG5ld19tY3RybCkgeworCQlodnNpX3NldF9tY3RybChocCwgbmV3X21jdHJsKTsKKwkJaHAtPm1jdHJsID0gbmV3X21jdHJsOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBodnNpX29wcyA9IHsKKwkub3BlbiA9IGh2c2lfb3BlbiwKKwkuY2xvc2UgPSBodnNpX2Nsb3NlLAorCS53cml0ZSA9IGh2c2lfd3JpdGUsCisJLmhhbmd1cCA9IGh2c2lfaGFuZ3VwLAorCS53cml0ZV9yb29tID0gaHZzaV93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBodnNpX2NoYXJzX2luX2J1ZmZlciwKKwkudGhyb3R0bGUgPSBodnNpX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gaHZzaV91bnRocm90dGxlLAorCS50aW9jbWdldCA9IGh2c2lfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gaHZzaV90aW9jbXNldCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh2c2lfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaHZzaV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKGh2c2lfY291bnQpOworCWlmICghaHZzaV9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaHZzaV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJaHZzaV9kcml2ZXItPmRldmZzX25hbWUgPSAiaHZzaS8iOworCWh2c2lfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJodnNpIjsKKwlodnNpX2RyaXZlci0+bmFtZSA9ICJodnNpIjsKKwlodnNpX2RyaXZlci0+bWFqb3IgPSBIVlNJX01BSk9SOworCWh2c2lfZHJpdmVyLT5taW5vcl9zdGFydCA9IEhWU0lfTUlOT1I7CisJaHZzaV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU1lTVEVNOworCWh2c2lfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaHZzaV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMOworCWh2c2lfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGh2c2lfZHJpdmVyLCAmaHZzaV9vcHMpOworCisJZm9yIChpPTA7IGkgPCBodnNpX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9ICZodnNpX3BvcnRzW2ldOworCQlpbnQgcmV0ID0gMTsKKworCQlyZXQgPSByZXF1ZXN0X2lycShocC0+dmlycSwgaHZzaV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgImh2c2kiLCBocCk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9FUlIgIkhWU0k6IGNvdWxkbid0IHJlc2VydmUgaXJxIDB4JXggKGVycm9yICVpKVxuIiwKKwkJCQlocC0+dmlycSwgcmV0KTsKKwl9CisJaHZzaV93YWl0ID0gd2FpdF9mb3Jfc3RhdGU7IC8qIGlycXMgYWN0aXZlIG5vdyAqLworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoaHZzaV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgaHZzaSBjb25zb2xlIGRyaXZlclxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVlNJOiByZWdpc3RlcmVkICVpIGRldmljZXNcbiIsIGh2c2lfY291bnQpOworCisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoaHZzaV9pbml0KTsKKworLyoqKioqIGNvbnNvbGUgKG5vdCB0dHkpIGNvZGU6ICoqKioqLworCitzdGF0aWMgdm9pZCBodnNpX2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAmaHZzaV9wb3J0c1tjb25zb2xlLT5pbmRleF07CisJY2hhciBjW0hWU0lfTUFYX09VVEdPSU5HX0RBVEFdIF9fQUxJR05FRF9fOworCXVuc2lnbmVkIGludCBpID0gMCwgbiA9IDA7CisJaW50IHJldCwgZG9uZWNyID0gMDsKKworCW1iKCk7CisJaWYgKCFpc19vcGVuKGhwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiB1Z2gsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIExGIC0+IENSTEYgb3Vyc2VsdmVzLCBpbiBwbGFjZS4KKwkgKiBjb3BpZWQgZnJvbSBodmNfY29uc29sZS5jOgorCSAqLworCXdoaWxlIChjb3VudCA+IDAgfHwgaSA+IDApIHsKKwkJaWYgKGNvdW50ID4gMCAmJiBpIDwgc2l6ZW9mKGMpKSB7CisJCQlpZiAoYnVmW25dID09ICdcbicgJiYgIWRvbmVjcikgeworCQkJCWNbaSsrXSA9ICdccic7CisJCQkJZG9uZWNyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJY1tpKytdID0gYnVmW24rK107CisJCQkJZG9uZWNyID0gMDsKKwkJCQktLWNvdW50OworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0ID0gaHZzaV9wdXRfY2hhcnMoaHAsIGMsIGkpOworCQkJaWYgKHJldCA8IDApCisJCQkJaSA9IDA7CisJCQlpIC09IHJldDsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodnNpX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLAorCWludCAqaW5kZXgpCit7CisJKmluZGV4ID0gY29uc29sZS0+aW5kZXg7CisJcmV0dXJuIGh2c2lfZHJpdmVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBodnNpX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNoYXIgKm9wdGlvbnMpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9ICZodnNpX3BvcnRzW2NvbnNvbGUtPmluZGV4XTsKKwlpbnQgcmV0OworCisJaWYgKGNvbnNvbGUtPmluZGV4IDwgMCB8fCBjb25zb2xlLT5pbmRleCA+PSBodnNpX2NvdW50KQorCQlyZXR1cm4gLTE7CisKKwkvKiBnaXZlIHRoZSBGU1AgYSBjaGFuY2UgdG8gY2hhbmdlIHRoZSBiYXVkIHJhdGUgd2hlbiB3ZSByZS1vcGVuICovCisJaHZzaV9jbG9zZV9wcm90b2NvbChocCk7CisKKwlyZXQgPSBodnNpX2hhbmRzaGFrZShocCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBodnNpX2dldF9tY3RybChocCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBodnNpX3NldF9tY3RybChocCwgaHAtPm1jdHJsIHwgVElPQ01fRFRSKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWhwLT5mbGFncyB8PSBIVlNJX0NPTlNPTEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGh2c2lfY29uX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaHZzaSIsCisJLndyaXRlCQk9IGh2c2lfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IGh2c2lfY29uc29sZV9kZXZpY2UsCisJLnNldHVwCQk9IGh2c2lfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh2c2lfY29uc29sZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICp2dHk7CisKKwlodnNpX3dhaXQgPSBwb2xsX2Zvcl9zdGF0ZTsgLyogbm8gaXJxcyB5ZXQ7IG11c3QgcG9sbCAqLworCisJLyogc2VhcmNoIGRldmljZSB0cmVlIGZvciB2dHkgbm9kZXMgKi8KKwlmb3IgKHZ0eSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJzZXJpYWwiLCAiaHZ0ZXJtLXByb3RvY29sIik7CisJCQl2dHkgIT0gTlVMTDsKKwkJCXZ0eSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKHZ0eSwgInNlcmlhbCIsICJodnRlcm0tcHJvdG9jb2wiKSkgeworCQlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwOworCQl1aW50MzJfdCAqdnRlcm1ubzsKKwkJdWludDMyX3QgKmlycTsKKworCQl2dGVybW5vID0gKHVpbnQzMl90ICopZ2V0X3Byb3BlcnR5KHZ0eSwgInJlZyIsIE5VTEwpOworCQlpcnEgPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodnR5LCAiaW50ZXJydXB0cyIsIE5VTEwpOworCQlpZiAoIXZ0ZXJtbm8gfHwgIWlycSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChodnNpX2NvdW50ID49IE1BWF9OUl9IVlNJX0NPTlNPTEVTKSB7CisJCQlvZl9ub2RlX3B1dCh2dHkpOworCQkJYnJlYWs7CisJCX0KKworCQlocCA9ICZodnNpX3BvcnRzW2h2c2lfY291bnRdOworCQlJTklUX1dPUksoJmhwLT53cml0ZXIsIGh2c2lfd3JpdGVfd29ya2VyLCBocCk7CisJCUlOSVRfV09SSygmaHAtPmhhbmRzaGFrZXIsIGh2c2lfaGFuZHNoYWtlciwgaHApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZocC0+ZW1wdHlxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHAtPnN0YXRlcSk7CisJCXNwaW5fbG9ja19pbml0KCZocC0+bG9jayk7CisJCWhwLT5pbmRleCA9IGh2c2lfY291bnQ7CisJCWhwLT5pbmJ1Zl9lbmQgPSBocC0+aW5idWY7CisJCWhwLT5zdGF0ZSA9IEhWU0lfQ0xPU0VEOworCQlocC0+dnRlcm1ubyA9ICp2dGVybW5vOworCQlocC0+dmlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKGlycVswXSk7CisJCWlmIChocC0+dmlycSA9PSBOT19JUlEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IGNyZWF0ZSBpcnEgbWFwcGluZyBmb3IgMHgleFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGhwLT52aXJxKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWhwLT52aXJxID0gaXJxX29mZnNldF91cChocC0+dmlycSk7CisKKwkJaHZzaV9jb3VudCsrOworCX0KKworCWlmIChodnNpX2NvdW50KQorCQlyZWdpc3Rlcl9jb25zb2xlKCZodnNpX2Nvbl9kcml2ZXIpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChodnNpX2NvbnNvbGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2YWMxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwpAQCAtMCwwICsxLDYzMCBAQAorLyoKKyAJSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgSW50ZWwvQU1EL1ZJQSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMgKFJORykKKwkoYykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmMgPGpnYXJ6aWtAcmVkaGF0LmNvbT4KKyAKKyAJZGVyaXZlZCBmcm9tCisgCisgICAgICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEFNRCA3NjggUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKKyAgICAgICAgKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jIDxhbGFuQHJlZGhhdC5jb20+CisKKyAJZGVyaXZlZCBmcm9tCisgCisJSGFyZHdhcmUgZHJpdmVyIGZvciBJbnRlbCBpODEwIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpCisJQ29weXJpZ2h0IDIwMDAsMjAwMSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAbWFuZHJha2Vzb2Z0LmNvbT4KKworCVBsZWFzZSByZWFkIERvY3VtZW50YXRpb24vaHdfcmFuZG9tLnR4dCBmb3IgZGV0YWlscyBvbiB1c2UuCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgICAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgKiBjb3JlIG1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbgorICovCisjZGVmaW5lIFJOR19WRVJTSU9OICIxLjAuMCIKKyNkZWZpbmUgUk5HX01PRFVMRV9OQU1FICJod19yYW5kb20iCisjZGVmaW5lIFJOR19EUklWRVJfTkFNRSAgIFJOR19NT0RVTEVfTkFNRSAiIGhhcmR3YXJlIGRyaXZlciAiIFJOR19WRVJTSU9OCisjZGVmaW5lIFBGWCBSTkdfTU9EVUxFX05BTUUgIjogIgorCisKKy8qCisgKiBkZWJ1Z2dpbmcgbWFjcm9zCisgKi8KKworLyogcHJfZGVidWcoKSBjb2xsYXBzZXMgdG8gYSBuby1vcCBpZiBERUJVRyBpcyBub3QgZGVmaW5lZCAqLworI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJfZGVidWcoUEZYICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisKKworI3VuZGVmIFJOR19OREVCVUcgICAgICAgIC8qIGRlZmluZSB0byBlbmFibGUgbGlnaHR3ZWlnaHQgcnVudGltZSBjaGVja3MgKi8KKyNpZmRlZiBSTkdfTkRFQlVHCisjZGVmaW5lIGFzc2VydChleHByKQkJCQkJCQlcCisJCWlmKCEoZXhwcikpIHsJCQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsIglcCisJCSJsaW5lPSVkXG4iLCAjZXhwciwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwlcCisJCX0KKyNlbHNlCisjZGVmaW5lIGFzc2VydChleHByKQorI2VuZGlmCisKKyNkZWZpbmUgUk5HX01JU0NERVZfTUlOT1IJCTE4MyAvKiBvZmZpY2lhbCAqLworCitzdGF0aWMgaW50IHJuZ19kZXZfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHNzaXplX3Qgcm5nX2Rldl9yZWFkIChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUsCisJCQkJbG9mZl90ICogb2ZmcCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVsX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIHZvaWQgaW50ZWxfY2xlYW51cCh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfZGF0YV9wcmVzZW50ICh2b2lkKTsKK3N0YXRpYyB1MzIgaW50ZWxfZGF0YV9yZWFkICh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgYW1kX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIHZvaWQgYW1kX2NsZWFudXAodm9pZCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9kYXRhX3ByZXNlbnQgKHZvaWQpOworc3RhdGljIHUzMiBhbWRfZGF0YV9yZWFkICh2b2lkKTsKKworI2lmZGVmIF9faTM4Nl9fCitzdGF0aWMgaW50IF9faW5pdCB2aWFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGludCB2aWFfZGF0YV9wcmVzZW50ICh2b2lkKTsKK3N0YXRpYyB1MzIgdmlhX2RhdGFfcmVhZCAodm9pZCk7CisjZW5kaWYKKworc3RydWN0IHJuZ19vcGVyYXRpb25zIHsKKwlpbnQgKCppbml0KSAoc3RydWN0IHBjaV9kZXYgKmRldik7CisJdm9pZCAoKmNsZWFudXApICh2b2lkKTsKKwl1bnNpZ25lZCBpbnQgKCpkYXRhX3ByZXNlbnQpICh2b2lkKTsKKwl1MzIgKCpkYXRhX3JlYWQpICh2b2lkKTsKKwl1bnNpZ25lZCBpbnQgbl9ieXRlczsgLyogbnVtYmVyIG9mIGJ5dGVzIHBlciAtPmRhdGFfcmVhZCAqLworfTsKK3N0YXRpYyBzdHJ1Y3Qgcm5nX29wZXJhdGlvbnMgKnJuZ19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJuZ19jaHJkZXZfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBybmdfZGV2X29wZW4sCisJLnJlYWQJCT0gcm5nX2Rldl9yZWFkLAorfTsKKworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugcm5nX21pc2NkZXYgPSB7CisJUk5HX01JU0NERVZfTUlOT1IsCisJUk5HX01PRFVMRV9OQU1FLAorCSZybmdfY2hyZGV2X29wcywKK307CisKK2VudW0geworCXJuZ19od19ub25lLAorCXJuZ19od19pbnRlbCwKKwlybmdfaHdfYW1kLAorCXJuZ19od192aWEsCit9OworCitzdGF0aWMgc3RydWN0IHJuZ19vcGVyYXRpb25zIHJuZ192ZW5kb3Jfb3BzW10gPSB7CisJLyogcm5nX2h3X25vbmUgKi8KKwl7IH0sCisKKwkvKiBybmdfaHdfaW50ZWwgKi8KKwl7IGludGVsX2luaXQsIGludGVsX2NsZWFudXAsIGludGVsX2RhdGFfcHJlc2VudCwKKwkgIGludGVsX2RhdGFfcmVhZCwgMSB9LAorCisJLyogcm5nX2h3X2FtZCAqLworCXsgYW1kX2luaXQsIGFtZF9jbGVhbnVwLCBhbWRfZGF0YV9wcmVzZW50LCBhbWRfZGF0YV9yZWFkLCA0IH0sCisKKyNpZmRlZiBfX2kzODZfXworCS8qIHJuZ19od192aWEgKi8KKwl7IHZpYV9pbml0LCB2aWFfY2xlYW51cCwgdmlhX2RhdGFfcHJlc2VudCwgdmlhX2RhdGFfcmVhZCwgMSB9LAorI2VuZGlmCit9OworCisvKgorICogRGF0YSBmb3IgUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGRhdGEgb25seSBleGlzdHMgZm9yIGV4cG9ydGluZyB0aGUgc3VwcG9ydGVkCisgKiBQQ0kgaWRzIHZpYSBNT0RVTEVfREVWSUNFX1RBQkxFLiAgV2UgZG8gbm90IGFjdHVhbGx5CisgKiByZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0IG9uZSBkYXkKKyAqIHdhbnQgdG8gcmVnaXN0ZXIgYW5vdGhlciBkcml2ZXIgb24gdGhlIHNhbWUgUENJIGlkLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcm5nX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAyMiwgMHg3NDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfYW1kIH0sCisJeyAweDEwMjIsIDB4NzQ2YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2FtZCB9LAorCisJeyAweDgwODYsIDB4MjQxOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQyOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQ0OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQ0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQ1ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisKKwl7IDAsIH0sCS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBybmdfcGNpX3RibCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZWwgUk5HIG9wZXJhdGlvbnMKKyAqCisgKi8KKworLyoKKyAqIFJORyByZWdpc3RlcnMgKG9mZnNldHMgZnJvbSBybmdfbWVtKQorICovCisjZGVmaW5lIElOVEVMX1JOR19IV19TVEFUVVMJCQkwCisjZGVmaW5lICAgICAgICAgSU5URUxfUk5HX1BSRVNFTlQJCTB4NDAKKyNkZWZpbmUgICAgICAgICBJTlRFTF9STkdfRU5BQkxFRAkJMHgwMQorI2RlZmluZSBJTlRFTF9STkdfU1RBVFVTCQkJMQorI2RlZmluZSAgICAgICAgIElOVEVMX1JOR19EQVRBX1BSRVNFTlQJCTB4MDEKKyNkZWZpbmUgSU5URUxfUk5HX0RBVEEJCQkJMgorCisvKgorICogTWFnaWMgYWRkcmVzcyBhdCB3aGljaCBJbnRlbCBQQ0kgYnJpZGdlcyBsb2NhdGUgdGhlIFJORworICovCisjZGVmaW5lIElOVEVMX1JOR19BRERSCQkJCTB4RkZCQzAxNUYKKyNkZWZpbmUgSU5URUxfUk5HX0FERFJfTEVOCQkJMworCisvKiB0b2tlbiB0byBvdXIgaW9yZW1hcCdkIFJORyByZWdpc3RlciBhcmVhICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICpybmdfbWVtOworCitzdGF0aWMgaW5saW5lIHU4IGludGVsX2h3c3RhdHVzICh2b2lkKQoreworCWFzc2VydCAocm5nX21lbSAhPSBOVUxMKTsKKwlyZXR1cm4gcmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKK30KKworc3RhdGljIGlubGluZSB1OCBpbnRlbF9od3N0YXR1c19zZXQgKHU4IGh3X3N0YXR1cykKK3sKKwlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7CisJd3JpdGViIChod19zdGF0dXMsIHJuZ19tZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKKwlyZXR1cm4gaW50ZWxfaHdzdGF0dXMgKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfZGF0YV9wcmVzZW50KHZvaWQpCit7CisJYXNzZXJ0IChybmdfbWVtICE9IE5VTEwpOworCisJcmV0dXJuIChyZWFkYiAocm5nX21lbSArIElOVEVMX1JOR19TVEFUVVMpICYgSU5URUxfUk5HX0RBVEFfUFJFU0VOVCkgPworCQkxIDogMDsKK30KKworc3RhdGljIHUzMiBpbnRlbF9kYXRhX3JlYWQodm9pZCkKK3sKKwlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7CisKKwlyZXR1cm4gcmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfREFUQSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVsX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJjOworCXU4IGh3X3N0YXR1czsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlybmdfbWVtID0gaW9yZW1hcCAoSU5URUxfUk5HX0FERFIsIElOVEVMX1JOR19BRERSX0xFTik7CisJaWYgKHJuZ19tZW0gPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGlvcmVtYXAgUk5HIE1lbW9yeVxuIik7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogQ2hlY2sgZm9yIEludGVsIDgyODAyICovCisJaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXMgKCk7CisJaWYgKChod19zdGF0dXMgJiBJTlRFTF9STkdfUFJFU0VOVCkgPT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiUk5HIG5vdCBkZXRlY3RlZFxuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWFwOworCX0KKworCS8qIHR1cm4gUk5HIGgvdyBvbiwgaWYgaXQncyBvZmYgKi8KKwlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKQorCQlod19zdGF0dXMgPSBpbnRlbF9od3N0YXR1c19zZXQgKGh3X3N0YXR1cyB8IElOVEVMX1JOR19FTkFCTEVEKTsKKwlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgZW5hYmxlIFJORywgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dF9mcmVlX21hcDsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfbWFwOgorCWlvdW5tYXAgKHJuZ19tZW0pOworCXJuZ19tZW0gPSBOVUxMOworZXJyX291dDoKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jbGVhbnVwKHZvaWQpCit7CisJdTggaHdfc3RhdHVzOworCisJaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXMgKCk7CisJaWYgKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKQorCQlpbnRlbF9od3N0YXR1c19zZXQgKGh3X3N0YXR1cyAmIH5JTlRFTF9STkdfRU5BQkxFRCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAidW51c3VhbDogUk5HIGFscmVhZHkgZGlzYWJsZWRcbiIpOworCWlvdW5tYXAocm5nX21lbSk7CisJcm5nX21lbSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFNRCBSTkcgb3BlcmF0aW9ucworICoKKyAqLworCitzdGF0aWMgdTMyIHBtYmFzZTsJCQkvKiBQTXh4IEkvTyBiYXNlICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFtZF9kZXY7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1kX2RhdGFfcHJlc2VudCAodm9pZCkKK3sKKyAgICAgIAlyZXR1cm4gaW5sKHBtYmFzZSArIDB4RjQpICYgMTsKK30KKworCitzdGF0aWMgdTMyIGFtZF9kYXRhX3JlYWQgKHZvaWQpCit7CisJcmV0dXJuIGlubChwbWJhc2UgKyAweEYwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYW1kX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJjOworCXU4IHJuZW47CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1OCwgJnBtYmFzZSk7CisKKwlwbWJhc2UgJj0gMHgwMDAwRkYwMDsKKworCWlmIChwbWJhc2UgPT0gMCkKKwl7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJwb3dlciBtYW5hZ2VtZW50IGJhc2Ugbm90IHNldFxuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJnJuZW4pOworCXJuZW4gfD0gKDEgPDwgNyk7CS8qIFJORyBvbiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDAsIHJuZW4pOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQxLCAmcm5lbik7CisJcm5lbiB8PSAoMSA8PCA3KTsJLyogUE1JTyBlbmFibGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQxLCBybmVuKTsKKworCXByX2luZm8oIFBGWCAiQU1ENzY4IHN5c3RlbSBtYW5hZ2VtZW50IEkvTyByZWdpc3RlcnMgYXQgMHglWC5cbiIsCisJCQlwbWJhc2UpOworCisJYW1kX2RldiA9IGRldjsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYW1kX2NsZWFudXAodm9pZCkKK3sKKwl1OCBybmVuOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYW1kX2RldiwgMHg0MCwgJnJuZW4pOworCXJuZW4gJj0gfigxIDw8IDcpOwkvKiBSTkcgb2ZmICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFtZF9kZXYsIDB4NDAsIHJuZW4pOworCisJLyogRklYTUU6IHR3aWRkbGUgcG1pbywgYWxzbz8gKi8KK30KKworI2lmZGVmIF9faTM4Nl9fCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWSUEgUk5HIG9wZXJhdGlvbnMKKyAqCisgKi8KKworZW51bSB7CisJVklBX1NUUkZJTFRfQ05UX1NISUZUCT0gMTYsCisJVklBX1NUUkZJTFRfRkFJTAk9ICgxIDw8IDE1KSwKKwlWSUFfU1RSRklMVF9FTkFCTEUJPSAoMSA8PCAxNCksCisJVklBX1JBV0JJVFNfRU5BQkxFCT0gKDEgPDwgMTMpLAorCVZJQV9STkdfRU5BQkxFCQk9ICgxIDw8IDYpLAorCVZJQV9YU1RPUkVfQ05UX01BU0sJPSAweDBGLAorCisJVklBX1JOR19DSFVOS184CQk9IDB4MDAsCS8qIDY0IHJhbmQgYml0cywgNjQgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzQJCT0gMHgwMSwJLyogMzIgcmFuZCBiaXRzLCAzMiBzdG9yZWQgYml0cyAqLworCVZJQV9STkdfQ0hVTktfNF9NQVNLCT0gMHhGRkZGRkZGRiwKKwlWSUFfUk5HX0NIVU5LXzIJCT0gMHgwMiwJLyogMTYgcmFuZCBiaXRzLCAzMiBzdG9yZWQgYml0cyAqLworCVZJQV9STkdfQ0hVTktfMl9NQVNLCT0gMHhGRkZGLAorCVZJQV9STkdfQ0hVTktfMQkJPSAweDAzLAkvKiA4IHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzFfTUFTSwk9IDB4RkYsCit9OworCitzdGF0aWMgdTMyIHZpYV9ybmdfZGF0dW07CisKKy8qCisgKiBJbnZlc3RpZ2F0ZSB1c2luZyB0aGUgJ3JlcCcgcHJlZml4IHRvIG9idGFpbiAzMiBiaXRzIG9mIHJhbmRvbSBkYXRhCisgKiBpbiBvbmUgaW5zbi4gIFRoZSB1cHNpZGUgaXMgcG90ZW50aWFsbHkgYmV0dGVyIHBlcmZvcm1hbmNlLiAgVGhlCisgKiBkb3duc2lkZSBpcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBiZWNvbWVzIG5vIGxvbmdlciBhdG9taWMuICBEdWUgdG8KKyAqIHRoaXMsIGp1c3QgbGlrZSBmYW1pbGlhciBpc3N1ZXMgd2l0aCAvZGV2L3JhbmRvbSBpdHNlbGYsIHRoZSB3b3JzdAorICogY2FzZSBvZiBhICdyZXAgeHN0b3JlJyBjb3VsZCBwb3RlbnRpYWxseSBwYXVzZSBhIGNwdSBmb3IgYW4KKyAqIHVucmVhc29uYWJseSBsb25nIHRpbWUuICBJbiBwcmFjdGljZSwgdGhpcyBjb25kaXRpb24gd291bGQgbGlrZWx5CisgKiBvbmx5IG9jY3VyIHdoZW4gdGhlIGhhcmR3YXJlIGlzIGZhaWxpbmcuICAob3Igc28gd2UgaG9wZSA6KSkKKyAqCisgKiBBbm90aGVyIHBvc3NpYmxlIHBlcmZvcm1hbmNlIGJvb3N0IG1heSBjb21lIGZyb20gc2ltcGx5IGJ1ZmZlcmluZworICogdW50aWwgd2UgaGF2ZSA0IGJ5dGVzLCB0aHVzIHJldHVybmluZyBhIHUzMiBhdCBhIHRpbWUsCisgKiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHU4LWF0LWEtdGltZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiB4c3RvcmUodTMyICphZGRyLCB1MzIgZWR4X2luKQoreworCXUzMiBlYXhfb3V0OworCisJYXNtKCIuYnl0ZSAweDBGLDB4QTcsMHhDMCAvKiB4c3RvcmUgJSVlZGkgKGFkZHI9JTApICovIgorCQk6Ij1tIigqYWRkciksICI9YSIoZWF4X291dCkKKwkJOiJEIihhZGRyKSwgImQiKGVkeF9pbikpOworCisJcmV0dXJuIGVheF9vdXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlhX2RhdGFfcHJlc2VudCh2b2lkKQoreworCXUzMiBieXRlc19vdXQ7CisKKwkvKiBXZSBjaG9vc2UgdGhlIHJlY29tbWVuZGVkIDEtYnl0ZS1wZXItaW5zdHJ1Y3Rpb24gUk5HIHJhdGUsCisJICogZm9yIGdyZWF0ZXIgcmFuZG9tbmVzcyBhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZC4gIExhcmdlcgorCSAqIHZhbHVlcyAyLCA0LCBvciA4IGJ5dGVzLXBlci1pbnN0cnVjdGlvbiB5aWVsZCBncmVhdGVyCisJICogc3BlZWQgYXQgbGVzc2VyIHJhbmRvbW5lc3MuCisJICoKKwkgKiBJZiB5b3UgY2hhbmdlIHRoaXMgdG8gYW5vdGhlciBWSUFfQ0hVTktfbiwgeW91IG11c3QgYWxzbworCSAqIGNoYW5nZSB0aGUgLT5uX2J5dGVzIHZhbHVlcyBpbiBybmdfdmVuZG9yX29wc1tdIHRhYmxlcy4KKwkgKiBWSUFfQ0hVTktfOCByZXF1aXJlcyBmdXJ0aGVyIGNvZGUgY2hhbmdlcy4KKwkgKgorCSAqIEEgY29weSBvZiBNU1JfVklBX1JORyBpcyBwbGFjZWQgaW4gZWF4X291dCB3aGVuIHhzdG9yZQorCSAqIGNvbXBsZXRlcy4KKwkgKi8KKwl2aWFfcm5nX2RhdHVtID0gMDsgLyogcGFyYW5vaWEsIG5vdCByZWFsbHkgbmVjZXNzYXJ5ICovCisJYnl0ZXNfb3V0ID0geHN0b3JlKCZ2aWFfcm5nX2RhdHVtLCBWSUFfUk5HX0NIVU5LXzEpICYgVklBX1hTVE9SRV9DTlRfTUFTSzsKKwlpZiAoYnl0ZXNfb3V0ID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1MzIgdmlhX2RhdGFfcmVhZCh2b2lkKQoreworCXJldHVybiB2aWFfcm5nX2RhdHVtOworfQorCitzdGF0aWMgaW50IF9faW5pdCB2aWFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiBsbywgaGksIG9sZF9sbzsKKworCS8qIENvbnRyb2wgdGhlIFJORyB2aWEgTVNSLiAgVHJlYWQgbGlnaHRseSBhbmQgcGF5IHZlcnkgY2xvc2UKKwkgKiBjbG9zZSBhdHRlbnRpb24gdG8gdmFsdWVzIHdyaXR0ZW4sIGFzIHRoZSByZXNlcnZlZCBmaWVsZHMKKwkgKiBhcmUgZG9jdW1lbnRlZCB0byBiZSAidW5kZWZpbmVkIGFuZCB1bnByZWRpY3RhYmxlIjsgYnV0IGl0CisJICogZG9lcyBub3Qgc2F5IHRvIHdyaXRlIHRoZW0gYXMgemVybywgc28gSSBtYWtlIGEgZ3Vlc3MgdGhhdAorCSAqIHdlIHJlc3RvcmUgdGhlIHZhbHVlcyB3ZSBmaW5kIGluIHRoZSByZWdpc3Rlci4KKwkgKi8KKwlyZG1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKKworCW9sZF9sbyA9IGxvOworCWxvICY9IH4oMHg3ZiA8PCBWSUFfU1RSRklMVF9DTlRfU0hJRlQpOworCWxvICY9IH5WSUFfWFNUT1JFX0NOVF9NQVNLOworCWxvICY9IH4oVklBX1NUUkZJTFRfRU5BQkxFIHwgVklBX1NUUkZJTFRfRkFJTCB8IFZJQV9SQVdCSVRTX0VOQUJMRSk7CisJbG8gfD0gVklBX1JOR19FTkFCTEU7CisKKwlpZiAobG8gIT0gb2xkX2xvKQorCQl3cm1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKKworCS8qIHBlcmhhcHMtdW5uZWNlc3Nhcnkgc2FuaXR5IGNoZWNrOyByZW1vdmUgYWZ0ZXIgdGVzdGluZyBpZgorCSAgIHVubmVlZGVkICovCisJcmRtc3IoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisJaWYgKChsbyAmIFZJQV9STkdfRU5BQkxFKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCBlbmFibGUgVklBIEMzIFJORywgYWJvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlhX2NsZWFudXAodm9pZCkKK3sKKwkvKiBkbyBub3RoaW5nICovCit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAvZGV2L2h3cmFuZG9tIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxpbmcgKG1ham9yIDEwLCBtaW5vciAxODMpCisgKgorICovCisKK3N0YXRpYyBpbnQgcm5nX2Rldl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwkvKiBlbmZvcmNlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhpcyBjaHJkZXYgKi8KKwlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdCBybmdfZGV2X3JlYWQgKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwKKwkJCQlsb2ZmX3QgKiBvZmZwKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socm5nX2xvY2spOworCXVuc2lnbmVkIGludCBoYXZlX2RhdGE7CisJdTMyIGRhdGEgPSAwOworCXNzaXplX3QgcmV0ID0gMDsKKworCXdoaWxlIChzaXplKSB7CisJCXNwaW5fbG9jaygmcm5nX2xvY2spOworCisJCWhhdmVfZGF0YSA9IDA7CisJCWlmIChybmdfb3BzLT5kYXRhX3ByZXNlbnQoKSkgeworCQkJZGF0YSA9IHJuZ19vcHMtPmRhdGFfcmVhZCgpOworCQkJaGF2ZV9kYXRhID0gcm5nX29wcy0+bl9ieXRlczsKKwkJfQorCisJCXNwaW5fdW5sb2NrICgmcm5nX2xvY2spOworCisJCXdoaWxlIChoYXZlX2RhdGEgJiYgc2l6ZSkgeworCQkJaWYgKHB1dF91c2VyKCh1OClkYXRhLCBidWYrKykpIHsKKwkJCQlyZXQgPSByZXQgPyA6IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzaXplLS07CisJCQlyZXQrKzsKKwkJCWhhdmVfZGF0YS0tOworCQkJZGF0YT4+PTg7CisJCX0KKworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gcmV0ID8gOiAtRUFHQUlOOworCisJCWlmKG5lZWRfcmVzY2hlZCgpKQorCQl7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwkJZWxzZQorCQkJdWRlbGF5KDIwMCk7CS8qIEZJWE1FOiBXZSBjb3VsZCBwb2xsIGZvciAyNTB1UyA/PyAqLworCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpCisJCQlyZXR1cm4gcmV0ID8gOiAtRVJFU1RBUlRTWVM7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworCisvKgorICogcm5nX2luaXRfb25lIC0gbG9vayBmb3IgYW5kIGF0dGVtcHQgdG8gaW5pdCBhIHNpbmdsZSBSTkcKKyAqLworc3RhdGljIGludCBfX2luaXQgcm5nX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCByYzsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQocm5nX29wcyAhPSBOVUxMKTsKKworCXJjID0gcm5nX29wcy0+aW5pdChkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcmMgPSBtaXNjX3JlZ2lzdGVyICgmcm5nX21pc2NkZXYpOworCWlmIChyYykgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAibWlzYyBkZXZpY2UgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfb3V0X2NsZWFudXBfaHc7CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9jbGVhbnVwX2h3OgorCXJuZ19vcHMtPmNsZWFudXAoKTsKK2Vycl9vdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworCisKK01PRFVMRV9BVVRIT1IoIlRoZSBMaW51eCBLZXJuZWwgdGVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIL1cgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyoKKyAqIHJuZ19pbml0IC0gaW5pdGlhbGl6ZSBSTkcgbW9kdWxlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJuZ19pbml0ICh2b2lkKQoreworCWludCByYzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBQcm9iZSBmb3IgSW50ZWwsIEFNRCBSTkdzICovCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWVudCA9IHBjaV9tYXRjaF9kZXZpY2UgKHJuZ19wY2lfdGJsLCBwZGV2KTsKKwkJaWYgKGVudCkgeworCQkJcm5nX29wcyA9ICZybmdfdmVuZG9yX29wc1tlbnQtPmRyaXZlcl9kYXRhXTsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKwl9CisKKyNpZmRlZiBfX2kzODZfXworCS8qIFByb2JlIGZvciBWSUEgUk5HICovCisJaWYgKGNwdV9oYXNfeHN0b3JlKSB7CisJCXJuZ19vcHMgPSAmcm5nX3ZlbmRvcl9vcHNbcm5nX2h3X3ZpYV07CisJCXBkZXYgPSBOVUxMOworCQlnb3RvIG1hdGNoOworCX0KKyNlbmRpZgorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRU5PREVWXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworbWF0Y2g6CisJcmMgPSBybmdfaW5pdF9vbmUgKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcHJfaW5mbyggUk5HX0RSSVZFUl9OQU1FICIgbG9hZGVkXG4iKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHJuZ19pbml0IC0gc2h1dGRvd24gUk5HIG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgcm5nX2NsZWFudXAgKHZvaWQpCit7CisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCW1pc2NfZGVyZWdpc3RlciAoJnJuZ19taXNjZGV2KTsKKworCWlmIChybmdfb3BzLT5jbGVhbnVwKQorCQlybmdfb3BzLT5jbGVhbnVwKCk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworbW9kdWxlX2luaXQgKHJuZ19pbml0KTsKK21vZHVsZV9leGl0IChybmdfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaThrLmMgYi9kcml2ZXJzL2NoYXIvaThrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxMTk3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pOGsuYwpAQCAtMCwwICsxLDc4OCBAQAorLyoKKyAqIGk4ay5jIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMuCisgKgkgICAgU2VlIGh0dHA6Ly93d3cuZGViaWFuLm9yZy9+ZHovaThrLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoJICAgIGFuZCBmb3IgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYXNzaW1vIERhbCBab3R0byA8ZHpAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pOGsuaD4KKworI2RlZmluZSBJOEtfVkVSU0lPTgkJIjEuMTMgMTQvMDUvMjAwMiIKKworI2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKKyNkZWZpbmUgSThLX1NNTV9QT1dFUl9TVEFUVVMJMHgwMDY5CisjZGVmaW5lIEk4S19TTU1fU0VUX0ZBTgkJMHgwMWEzCisjZGVmaW5lIEk4S19TTU1fR0VUX0ZBTgkJMHgwMGEzCisjZGVmaW5lIEk4S19TTU1fR0VUX1NQRUVECTB4MDJhMworI2RlZmluZSBJOEtfU01NX0dFVF9URU1QCTB4MTBhMworI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRwkweGZmYTMKKyNkZWZpbmUgSThLX1NNTV9CSU9TX1ZFUlNJT04JMHgwMGE2CisKKyNkZWZpbmUgSThLX0ZBTl9NVUxUCQkzMAorI2RlZmluZSBJOEtfTUFYX1RFTVAJCTEyNworCisjZGVmaW5lIEk4S19GTl9OT05FCQkweDAwCisjZGVmaW5lIEk4S19GTl9VUAkJMHgwMQorI2RlZmluZSBJOEtfRk5fRE9XTgkJMHgwMgorI2RlZmluZSBJOEtfRk5fTVVURQkJMHgwNAorI2RlZmluZSBJOEtfRk5fTUFTSwkJMHgwNworI2RlZmluZSBJOEtfRk5fU0hJRlQJCTgKKworI2RlZmluZSBJOEtfUE9XRVJfQUMJCTB4MDUKKyNkZWZpbmUgSThLX1BPV0VSX0JBVFRFUlkJMHgwMQorCisjZGVmaW5lIEk4S19URU1QRVJBVFVSRV9CVUcJMQorCisjZGVmaW5lIERFTExfU0lHTkFUVVJFCQkiRGVsbCBDb21wdXRlciIKKworc3RhdGljIGNoYXIgKnN1cHBvcnRlZF9tb2RlbHNbXSA9IHsKKyAgICAiSW5zcGlyb24iLAorICAgICJMYXRpdHVkZSIsCisgICAgTlVMTAorfTsKKworc3RhdGljIGNoYXIgc3lzdGVtX3ZlbmRvcls0OF0gPSAiPyI7CitzdGF0aWMgY2hhciBwcm9kdWN0X25hbWUgWzQ4XSA9ICI/IjsKK3N0YXRpYyBjaGFyIGJpb3NfdmVyc2lvbiBbNF0gID0gIj8iOworc3RhdGljIGNoYXIgc2VyaWFsX251bWJlclsxNl0gPSAiPyI7CisKK01PRFVMRV9BVVRIT1IoIk1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgbG9hZGluZyB3aXRob3V0IGNoZWNraW5nIGZvciBzdXBwb3J0ZWQgbW9kZWxzIik7CisKK3N0YXRpYyBpbnQgcmVzdHJpY3RlZDsKK21vZHVsZV9wYXJhbShyZXN0cmljdGVkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzdHJpY3RlZCwgIkFsbG93IGZhbiBjb250cm9sIGlmIFNZU19BRE1JTiBjYXBhYmlsaXR5IHNldCIpOworCitzdGF0aWMgaW50IHBvd2VyX3N0YXR1czsKK21vZHVsZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3RhdHVzIGluIC9wcm9jL2k4ayIpOworCitzdGF0aWMgc3NpemVfdCBpOGtfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBpbnQgaThrX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCisJCSAgICAgdW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4a19mb3BzID0geworICAgIC5yZWFkCT0gaThrX3JlYWQsCisgICAgLmlvY3RsCT0gaThrX2lvY3RsLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBlYXg7CisgICAgdW5zaWduZWQgaW50IGVieCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVjeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVkeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVzaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVkaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IFNNTVJlZ2lzdGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4CXR5cGU7CisgICAgdTgJbGVuZ3RoOworICAgIHUxNgloYW5kbGU7Cit9IERNSUhlYWRlcjsKKworLyoKKyAqIENhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBKb25hdGhhbiBCdXp6YXJkLgorICovCitzdGF0aWMgaW50IGk4a19zbW0oU01NUmVnaXN0ZXJzICpyZWdzKQoreworICAgIGludCByYzsKKyAgICBpbnQgZWF4ID0gcmVncy0+ZWF4OworCisgICAgYXNtKCJwdXNobCAlJWVheFxuXHQiIFwKKwkibW92bCAwKCUlZWF4KSwlJWVkeFxuXHQiIFwKKwkicHVzaCAlJWVkeFxuXHQiIFwKKwkibW92bCA0KCUlZWF4KSwlJWVieFxuXHQiIFwKKwkibW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiIFwKKwkibW92bCAxMiglJWVheCksJSVlZHhcblx0IiBcCisJIm1vdmwgMTYoJSVlYXgpLCUlZXNpXG5cdCIgXAorCSJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiIFwKKwkicG9wbCAlJWVheFxuXHQiIFwKKwkib3V0ICUlYWwsJDB4YjJcblx0IiBcCisJIm91dCAlJWFsLCQweDg0XG5cdCIgXAorCSJ4Y2hnbCAlJWVheCwoJSVlc3ApXG5cdCIKKwkibW92bCAlJWVieCw0KCUlZWF4KVxuXHQiIFwKKwkibW92bCAlJWVjeCw4KCUlZWF4KVxuXHQiIFwKKwkibW92bCAlJWVkeCwxMiglJWVheClcblx0IiBcCisJIm1vdmwgJSVlc2ksMTYoJSVlYXgpXG5cdCIgXAorCSJtb3ZsICUlZWRpLDIwKCUlZWF4KVxuXHQiIFwKKwkicG9wbCAlJWVkeFxuXHQiIFwKKwkibW92bCAlJWVkeCwwKCUlZWF4KVxuXHQiIFwKKwkibGFoZlxuXHQiIFwKKwkic2hybCAkOCwlJWVheFxuXHQiIFwKKwkiYW5kbCAkMSwlJWVheFxuIiBcCisJOiAiPWEiIChyYykKKwk6ICJhIiAocmVncykKKwk6ICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7CisKKyAgICBpZiAoKHJjICE9IDApIHx8ICgocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYpIHx8IChyZWdzLT5lYXggPT0gZWF4KSkgeworCXJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgYmlvcyB2ZXJzaW9uLiBSZXR1cm4gdGhlIHZlcnNpb24gYXMgYW4gaW50ZWdlciBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgYXNjaWkgdmFsdWUsIGZvciBleGFtcGxlICJBMTciIGlzIHJldHVybmVkIGFzIDB4MDA0MTMxMzcuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9iaW9zX3ZlcnNpb24odm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9CSU9TX1ZFUlNJT047CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByZWdzLmVheDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG1hY2hpbmUgaWQuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9zZXJpYWxfbnVtYmVyKHVuc2lnbmVkIGNoYXIgKmJ1ZmYpCit7CisgICAgc3RybGNweShidWZmLCBzZXJpYWxfbnVtYmVyLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOworICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgRm4ga2V5IHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2ZuX3N0YXR1cyh2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX0ZOX1NUQVRVUzsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgc3dpdGNoICgocmVncy5lYXggPj4gSThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7CisgICAgY2FzZSBJOEtfRk5fVVA6CisJcmV0dXJuIEk4S19WT0xfVVA7CisgICAgY2FzZSBJOEtfRk5fRE9XTjoKKwlyZXR1cm4gSThLX1ZPTF9ET1dOOworICAgIGNhc2UgSThLX0ZOX01VVEU6CisJcmV0dXJuIEk4S19WT0xfTVVURTsKKyAgICBkZWZhdWx0OgorCXJldHVybiAwOworICAgIH0KK30KKworLyoKKyAqIFJlYWQgdGhlIHBvd2VyIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X3Bvd2VyX3N0YXR1cyh2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX1BPV0VSX1NUQVRVUzsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgc3dpdGNoIChyZWdzLmVheCAmIDB4ZmYpIHsKKyAgICBjYXNlIEk4S19QT1dFUl9BQzoKKwlyZXR1cm4gSThLX0FDOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIEk4S19CQVRURVJZOworICAgIH0KK30KKworLyoKKyAqIFJlYWQgdGhlIGZhbiBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX0ZBTjsKKyAgICByZWdzLmVieCA9IGZhbiAmIDB4ZmY7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAocmVncy5lYXggJiAweGZmKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZhbiBzcGVlZCBpbiBSUE0uCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mYW5fc3BlZWQoaW50IGZhbikKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfU1BFRUQ7CisgICAgcmVncy5lYnggPSBmYW4gJiAweGZmOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIEk4S19GQU5fTVVMVDsKK30KKworLyoKKyAqIFNldCB0aGUgZmFuIHNwZWVkIChvZmYsIGxvdywgaGlnaCkuIFJldHVybnMgdGhlIG5ldyBmYW4gc3RhdHVzLgorICovCitzdGF0aWMgaW50IGk4a19zZXRfZmFuKGludCBmYW4sIGludCBzcGVlZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHNwZWVkID0gKHNwZWVkIDwgMCkgPyAwIDogKChzcGVlZCA+IEk4S19GQU5fTUFYKSA/IEk4S19GQU5fTUFYIDogc3BlZWQpOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX1NFVF9GQU47CisgICAgcmVncy5lYnggPSAoZmFuICYgMHhmZikgfCAoc3BlZWQgPDwgOCk7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAoaThrX2dldF9mYW5fc3RhdHVzKGZhbikpOworfQorCisvKgorICogUmVhZCB0aGUgY3B1IHRlbXBlcmF0dXJlLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfY3B1X3RlbXAodm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKyAgICBpbnQgdGVtcDsKKworI2lmZGVmIEk4S19URU1QRVJBVFVSRV9CVUcKKyAgICBzdGF0aWMgaW50IHByZXYgPSAwOworI2VuZGlmCisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX1RFTVA7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKyAgICB0ZW1wID0gcmVncy5lYXggJiAweGZmOworCisjaWZkZWYgSThLX1RFTVBFUkFUVVJFX0JVRworICAgIC8qCisgICAgICogU29tZXRpbWVzIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmV0dXJucyAweDk5LCB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICogSW4gdGhpcyBjYXNlIHdlIHJldHVybiAob25jZSkgdGhlIHByZXZpb3VzIGNhY2hlZCB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgICAgICMgMTAwMzY1NTEzNyAwMDAwMDA1OCAwMDAwNWE0YgorICAgICAjIDEwMDM2NTUxMzggMDAwMDAwOTkgMDAwMDNhODAgPC0tLSAweDk5ID0gMTUzIGRlZ3JlZXMKKyAgICAgIyAxMDAzNjU1MTM5IDAwMDAwMDU0IDAwMDA1YzUyCisgICAgICovCisgICAgaWYgKHRlbXAgPiBJOEtfTUFYX1RFTVApIHsKKwl0ZW1wID0gcHJldjsKKwlwcmV2ID0gSThLX01BWF9URU1QOworICAgIH0gZWxzZSB7CisJcHJldiA9IHRlbXA7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGludCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKHZvaWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX0RFTExfU0lHOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoKHJlZ3MuZWF4ID09IDExNDU2NTE1MjcpICYmIChyZWdzLmVkeCA9PSAxMTQ1MzkyMjA0KSkgeworCXJldHVybiAwOworICAgIH0gZWxzZSB7CisJcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGludCBpOGtfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIGludCB2YWw7CisgICAgaW50IHNwZWVkOworICAgIHVuc2lnbmVkIGNoYXIgYnVmZlsxNl07CisgICAgaW50IF9fdXNlciAqYXJncCA9IChpbnQgX191c2VyICopYXJnOworCisgICAgaWYgKCFhcmdwKQorCXJldHVybiAtRUlOVkFMOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEk4S19CSU9TX1ZFUlNJT046CisJdmFsID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX01BQ0hJTkVfSUQ6CisJbWVtc2V0KGJ1ZmYsIDAsIDE2KTsKKwl2YWwgPSBpOGtfZ2V0X3NlcmlhbF9udW1iZXIoYnVmZik7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19GTl9TVEFUVVM6CisJdmFsID0gaThrX2dldF9mbl9zdGF0dXMoKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX1BPV0VSX1NUQVRVUzoKKwl2YWwgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfR0VUX1RFTVA6CisJdmFsID0gaThrX2dldF9jcHVfdGVtcCgpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfR0VUX1NQRUVEOgorCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCXZhbCA9IGk4a19nZXRfZmFuX3NwZWVkKHZhbCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19HRVRfRkFOOgorCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCXZhbCA9IGk4a19nZXRfZmFuX3N0YXR1cyh2YWwpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfU0VUX0ZBTjoKKwlpZiAocmVzdHJpY3RlZCAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCSAgICByZXR1cm4gLUVQRVJNOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdwKzEsIHNpemVvZihpbnQpKSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJdmFsID0gaThrX3NldF9mYW4odmFsLCBzcGVlZCk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICh2YWwgPCAwKSB7CisJcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgSThLX0JJT1NfVkVSU0lPTjoKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwsIDQpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKyAgICBjYXNlIEk4S19NQUNISU5FX0lEOgorCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYnVmZiwgMTYpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmb3IgL3Byb2MvaThrLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgbiwgZm5fa2V5LCBjcHVfdGVtcCwgYWNfcG93ZXI7CisgICAgaW50IGxlZnRfZmFuLCByaWdodF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkOworCisgICAgY3B1X3RlbXAgICAgID0gaThrX2dldF9jcHVfdGVtcCgpOwkJCS8qIDExMTAwILVzICovCisgICAgbGVmdF9mYW4gICAgID0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwILVzICovCisgICAgcmlnaHRfZmFuICAgID0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCC1cyAqLworICAgIGxlZnRfc3BlZWQgICA9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwILVzICovCisgICAgcmlnaHRfc3BlZWQgID0gaThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwILVzICovCisgICAgZm5fa2V5ICAgICAgID0gaThrX2dldF9mbl9zdGF0dXMoKTsJCQkvKiAgIDc1MCC1cyAqLworICAgIGlmIChwb3dlcl9zdGF0dXMpIHsKKwlhY19wb3dlciA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CQkvKiAxNDcwMCC1cyAqLworICAgIH0gZWxzZSB7CisJYWNfcG93ZXIgPSAtMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluZm86CisgICAgICoKKyAgICAgKiAxKSAgRm9ybWF0IHZlcnNpb24gKHRoaXMgd2lsbCBjaGFuZ2UgaWYgZm9ybWF0IGNoYW5nZXMpCisgICAgICogMikgIEJJT1MgdmVyc2lvbgorICAgICAqIDMpICBCSU9TIG1hY2hpbmUgSUQKKyAgICAgKiA0KSAgQ3B1IHRlbXBlcmF0dXJlCisgICAgICogNSkgIExlZnQgZmFuIHN0YXR1cworICAgICAqIDYpICBSaWdodCBmYW4gc3RhdHVzCisgICAgICogNykgIExlZnQgZmFuIHNwZWVkCisgICAgICogOCkgIFJpZ2h0IGZhbiBzcGVlZAorICAgICAqIDkpICBBQyBwb3dlcgorICAgICAqIDEwKSBGbiBLZXkgc3RhdHVzCisgICAgICovCisgICAgbiA9IHNwcmludGYoYnVmZmVyLCAiJXMgJXMgJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCUk4S19QUk9DX0ZNVCwKKwkJYmlvc192ZXJzaW9uLAorCQlzZXJpYWxfbnVtYmVyLAorCQljcHVfdGVtcCwKKwkJbGVmdF9mYW4sCisJCXJpZ2h0X2ZhbiwKKwkJbGVmdF9zcGVlZCwKKwkJcmlnaHRfc3BlZWQsCisJCWFjX3Bvd2VyLAorCQlmbl9rZXkpOworCisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGk4a19yZWFkKHN0cnVjdCBmaWxlICpmLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuLCBsb2ZmX3QgKmZwb3MpCit7CisgICAgaW50IG47CisgICAgY2hhciBpbmZvWzEyOF07CisKKyAgICBuID0gaThrX2dldF9pbmZvKGluZm8sIE5VTEwsIDAsIDEyOCk7CisgICAgaWYgKG4gPD0gMCkgeworCXJldHVybiBuOworICAgIH0KKworICAgIGlmICgqZnBvcyA+PSBuKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCgqZnBvcyArIGxlbikgPj0gbikgeworCWxlbiA9IG4gLSAqZnBvczsKKyAgICB9CisKKyAgICBpZiAoY29weV90b191c2VyKGJ1ZmZlciwgaW5mbywgbGVuKSAhPSAwKSB7CisJcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgKmZwb3MgKz0gbGVuOworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjaGFyKiBfX2luaXQgc3RyaW5nX3RyaW0oY2hhciAqcywgaW50IHNpemUpCit7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpwOworCisgICAgaWYgKChsZW4gPSBzdHJsZW4ocykpID4gc2l6ZSkgeworCWxlbiA9IHNpemU7CisgICAgfQorCisgICAgZm9yIChwPXMrbGVuLTE7IGxlbiAmJiAoKnA9PScgJyk7IGxlbi0tLHAtLSkgeworCSpwID0gJ1wwJzsKKyAgICB9CisKKyAgICByZXR1cm4gczsKK30KKworLyogRE1JIGNvZGUsIHN0b2xlbiBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYyAqLworCisvKgorICogfDwtLSBkbWktPmxlbmd0aCAtLT58CisgKiB8ICAgICAgICAgICAgICAgICAgIHwKKyAqIHxkbWkgaGVhZGVyICAgIHM9TiAgfCBzdHJpbmcxLFwwLCAuLi4sIHN0cmluZ04sXDAsIC4uLiwgXDAKKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqLworc3RhdGljIGNoYXIqIF9faW5pdCBkbWlfc3RyaW5nKERNSUhlYWRlciAqZG1pLCB1OCBzKQoreworICAgIHU4ICpwOworCisgICAgaWYgKCFzKSB7CisJcmV0dXJuICIiOworICAgIH0KKyAgICBzLS07CisKKyAgICBwID0gKHU4ICopZG1pICsgZG1pLT5sZW5ndGg7CisgICAgd2hpbGUgKHMgPiAwKSB7CisJcCArPSBzdHJsZW4ocCk7CisJcCsrOworCXMtLTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRtaV9kZWNvZGUoRE1JSGVhZGVyICpkbWkpCit7CisgICAgdTggKmRhdGEgPSAodTggKikgZG1pOworICAgIGNoYXIgKnA7CisKKyNpZmRlZiBJOEtfREVCVUcKKyAgICBpbnQgaTsKKyAgICBwcmludGsoIiUwOHggIiwgKGludClkYXRhKTsKKyAgICBmb3IgKGk9MDsgaTxkYXRhWzFdICYmIGk8NjQ7IGkrKykgeworCXByaW50aygiJTAyeCAiLCBkYXRhW2ldKTsKKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGRtaS0+dHlwZSkgeworICAgIGNhc2UgIDA6CS8qIEJJT1MgSW5mb3JtYXRpb24gKi8KKwlwID0gZG1pX3N0cmluZyhkbWksZGF0YVs1XSk7CisJaWYgKCpwKSB7CisJICAgIHN0cmxjcHkoYmlvc192ZXJzaW9uLCBwLCBzaXplb2YoYmlvc192ZXJzaW9uKSk7CisJICAgIHN0cmluZ190cmltKGJpb3NfdmVyc2lvbiwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOworCX0KKwlicmVhazsJCisgICAgY2FzZSAxOgkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gKi8KKwlwID0gZG1pX3N0cmluZyhkbWksZGF0YVs0XSk7CisJaWYgKCpwKSB7CisJICAgIHN0cmxjcHkoc3lzdGVtX3ZlbmRvciwgcCwgc2l6ZW9mKHN5c3RlbV92ZW5kb3IpKTsKKwkgICAgc3RyaW5nX3RyaW0oc3lzdGVtX3ZlbmRvciwgc2l6ZW9mKHN5c3RlbV92ZW5kb3IpKTsKKwl9CisJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNV0pOworCWlmICgqcCkgeworCSAgICBzdHJsY3B5KHByb2R1Y3RfbmFtZSwgcCwgc2l6ZW9mKHByb2R1Y3RfbmFtZSkpOworCSAgICBzdHJpbmdfdHJpbShwcm9kdWN0X25hbWUsIHNpemVvZihwcm9kdWN0X25hbWUpKTsKKwl9CisJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbN10pOworCWlmICgqcCkgeworCSAgICBzdHJsY3B5KHNlcmlhbF9udW1iZXIsIHAsIHNpemVvZihzZXJpYWxfbnVtYmVyKSk7CisJICAgIHN0cmluZ190cmltKHNlcmlhbF9udW1iZXIsIHNpemVvZihzZXJpYWxfbnVtYmVyKSk7CisJfQorCWJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCBfX2luaXQgZG1pX3RhYmxlKHUzMiBiYXNlLCBpbnQgbGVuLCBpbnQgbnVtLCB2b2lkICgqZm4pKERNSUhlYWRlciopKQoreworICAgIHU4ICpidWY7CisgICAgdTggKmRhdGE7CisgICAgRE1JSGVhZGVyICpkbWk7CisgICAgaW50IGkgPSAxOworCisgICAgYnVmID0gaW9yZW1hcChiYXNlLCBsZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkgeworCXJldHVybiAtMTsKKyAgICB9CisgICAgZGF0YSA9IGJ1ZjsKKworICAgIC8qCisgICAgICogU3RvcCB3aGVuIHdlIHNlZSBhbCB0aGUgaXRlbXMgdGhlIHRhYmxlIGNsYWltZWQgdG8gaGF2ZQorICAgICAqIG9yIHdlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUgKGFsc28gaGFwcGVucykKKyAgICAgKi8KKyAgICB3aGlsZSAoKGk8bnVtKSAmJiAoKGRhdGEtYnVmKSA8IGxlbikpIHsKKwlkbWkgPSAoRE1JSGVhZGVyICopZGF0YTsKKwkvKgorCSAqIEF2b2lkIG1pc3BhcnNpbmcgY3J1ZCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0CisJICogcmVjb3JkIGlzIGNyYXAKKwkgKi8KKwlpZiAoKGRhdGEtYnVmK2RtaS0+bGVuZ3RoKSA+PSBsZW4pIHsKKwkgICAgYnJlYWs7CisJfQorCWZuKGRtaSk7CisJZGF0YSArPSBkbWktPmxlbmd0aDsKKwkvKgorCSAqIERvbid0IGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBkYXRhIGlmIHRoZXJlIGlzCisJICogc3R1ZmYgbG9va2luZyBsaWtlIHN0cmluZyBmaWxsIHBhc3QgdGhlIGVuZAorCSAqLworCXdoaWxlICgoKGRhdGEtYnVmKSA8IGxlbikgJiYgKCpkYXRhIHx8IGRhdGFbMV0pKSB7CisJICAgIGRhdGErKzsKKwl9CisJZGF0YSArPSAyOworCWkrKzsKKyAgICB9CisgICAgaW91bm1hcChidWYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV9pdGVyYXRlKHZvaWQgKCpkZWNvZGUpKERNSUhlYWRlciAqKSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyMF07CisJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcCgweGUwMDAwLCAweDIwMDAwKSwgKnE7CisKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCWZvciAocSA9IHA7IHEgPCBwICsgMHgyMDAwMDsgcSArPSAxNikgeworCQltZW1jcHlfZnJvbWlvKGJ1ZiwgcSwgMjApOworCQlpZiAobWVtY21wKGJ1ZiwgIl9ETUlfIiwgNSk9PTApIHsKKwkJCXUxNiBudW0gID0gYnVmWzEzXTw8OCAgfCBidWZbMTJdOworCQkJdTE2IGxlbiAgPSBidWYgWzddPDw4ICB8IGJ1ZiBbNl07CisJCQl1MzIgYmFzZSA9IGJ1ZlsxMV08PDI0IHwgYnVmWzEwXTw8MTYgfCBidWZbOV08PDggfCBidWZbOF07CisjaWZkZWYgSThLX0RFQlVHCisJCQlwcmludGsoS0VSTl9JTkZPICJETUkgJWQuJWQgcHJlc2VudC5cbiIsCisJCQkgICBidWZbMTRdPj40LCBidWZbMTRdJjB4MEYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJWQgc3RydWN0dXJlcyBvY2N1cHlpbmcgJWQgYnl0ZXMuXG4iLAorCQkJICAgYnVmWzEzXTw8OCB8IGJ1ZlsxMl0sCisJCQkgICBidWYgWzddPDw4IHwgYnVmWzZdKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRNSSB0YWJsZSBhdCAweCUwOFguXG4iLAorCQkJICAgYnVmWzExXTw8MjQgfCBidWZbMTBdPDwxNiB8IGJ1Zls5XTw8OCB8IGJ1Zls4XSk7CisjZW5kaWYKKwkJCWlmIChkbWlfdGFibGUoYmFzZSwgbGVuLCBudW0sIGRlY29kZSk9PTApIHsKKwkJCQlpb3VubWFwKHApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWlvdW5tYXAocCk7CisJcmV0dXJuIC0xOworfQorLyogZW5kIG9mIERNSSBjb2RlICovCisKKy8qCisgKiBHZXQgRE1JIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpOGtfZG1pX3Byb2JlKHZvaWQpCit7CisgICAgY2hhciAqKnA7CisKKyAgICBpZiAoZG1pX2l0ZXJhdGUoZG1pX2RlY29kZSkgIT0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBETUkgaW5mb3JtYXRpb25cbiIpOworCXJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGlmIChzdHJuY21wKHN5c3RlbV92ZW5kb3IsREVMTF9TSUdOQVRVUkUsc3RybGVuKERFTExfU0lHTkFUVVJFKSkgIT0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogbm90IHJ1bm5pbmcgb24gYSBEZWxsIHN5c3RlbVxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgZm9yIChwPXN1cHBvcnRlZF9tb2RlbHM7IDsgcCsrKSB7CisJaWYgKCEqcCkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuc3VwcG9ydGVkIG1vZGVsOiAlc1xuIiwgcHJvZHVjdF9uYW1lKTsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChzdHJuY21wKHByb2R1Y3RfbmFtZSwqcCxzdHJsZW4oKnApKSA9PSAwKSB7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2JlIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBzdXBwb3J0ZWQgbGFwdG9wLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpOGtfcHJvYmUodm9pZCkKK3sKKyAgICBjaGFyIGJ1ZmZbNF07CisgICAgaW50IHZlcnNpb247CisgICAgaW50IHNtbV9mb3VuZCA9IDA7CisKKyAgICAvKgorICAgICAqIEdldCBETUkgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBpZiAoaThrX2RtaV9wcm9iZSgpICE9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IHZlbmRvcj0lcywgbW9kZWw9JXMsIHZlcnNpb249JXNcbiIsCisJICAgICAgIHN5c3RlbV92ZW5kb3IsIHByb2R1Y3RfbmFtZSwgYmlvc192ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCBTTU0gRGVsbCBzaWduYXR1cmUKKyAgICAgKi8KKyAgICBpZiAoaThrX2dldF9kZWxsX3NpZ25hdHVyZSgpICE9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuYWJsZSB0byBnZXQgU01NIERlbGwgc2lnbmF0dXJlXG4iKTsKKyAgICB9IGVsc2UgeworCXNtbV9mb3VuZCA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgU01NIEJJT1MgdmVyc2lvbi4KKyAgICAgKi8KKyAgICB2ZXJzaW9uID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKKyAgICBpZiAodmVyc2lvbiA8PSAwKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bmFibGUgdG8gZ2V0IFNNTSBCSU9TIHZlcnNpb25cbiIpOworICAgIH0gZWxzZSB7CisJc21tX2ZvdW5kID0gMTsKKwlidWZmWzBdID0gKHZlcnNpb24gPj4gMTYpICYgMHhmZjsKKwlidWZmWzFdID0gKHZlcnNpb24gPj4gIDgpICYgMHhmZjsKKwlidWZmWzJdID0gKHZlcnNpb24pICAgICAgICYgMHhmZjsKKwlidWZmWzNdID0gJ1wwJzsKKwkvKgorCSAqIElmIERNSSBCSU9TIHZlcnNpb24gaXMgdW5rbm93biB1c2UgU01NIEJJT1MgdmVyc2lvbi4KKwkgKi8KKwlpZiAoYmlvc192ZXJzaW9uWzBdID09ICc/JykgeworCSAgICBzdHJjcHkoYmlvc192ZXJzaW9uLCBidWZmKTsKKwl9CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgdHdvIHZlcnNpb25zIG1hdGNoLgorCSAqLworCWlmIChzdHJuY21wKGJ1ZmYsYmlvc192ZXJzaW9uLHNpemVvZihiaW9zX3ZlcnNpb24pKSAhPSAwKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gImk4azogQklPUyB2ZXJzaW9uIG1pc21hdGNoOiAlcyAhPSAlc1xuIiwKKwkJICAgYnVmZiwgYmlvc192ZXJzaW9uKTsKKwl9CisgICAgfQorCisgICAgaWYgKCFzbW1fZm91bmQgJiYgIWZvcmNlKSB7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYworI2VuZGlmCitpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCit7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKKworICAgIC8qIEFyZSB3ZSBydW5uaW5nIG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCisgICAgaWYgKGk4a19wcm9iZSgpICE9IDApIHsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciB0aGUgcHJvYyBlbnRyeSAqLworICAgIHByb2NfaThrID0gY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiaThrIiwgMCwgTlVMTCwgaThrX2dldF9pbmZvKTsKKyAgICBpZiAoIXByb2NfaThrKSB7CisJcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIHByb2NfaThrLT5wcm9jX2ZvcHMgPSAmaThrX2ZvcHM7CisgICAgcHJvY19pOGstPm93bmVyID0gVEhJU19NT0RVTEU7CisKKyAgICBwcmludGsoS0VSTl9JTkZPCisJICAgIkRlbGwgbGFwdG9wIFNNTSBkcml2ZXIgdiVzIE1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKVxuIiwKKwkgICBJOEtfVkVSU0lPTik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisgICAgcmV0dXJuIGk4a19pbml0KCk7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICAvKiBSZW1vdmUgdGhlIHByb2MgZW50cnkgKi8KKyAgICByZW1vdmVfcHJvY19lbnRyeSgiaThrIiwgTlVMTCk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IG1vZHVsZSB1bmxvYWRlZFxuIik7Cit9CisjZW5kaWYKKworLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIuYyBiL2RyaXZlcnMvY2hhci9pcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QxMmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi5jCkBAIC0wLDAgKzEsMTEwIEBACisvLyBpcDIuYworLy8gVGhpcyBpcyBhIGR1bW15IG1vZHVsZSB0byBtYWtlIHRoZSBmaXJtd2FyZSBhdmFpbGFibGUgd2hlbiBuZWVkZWQKKy8vIGFuZCBhbGxvd3MgaXQgdG8gYmUgdW5sb2FkZWQgd2hlbiBub3QuIFJ1bW9yIGlzIHRoZSBfX2luaXRkYXRhIAorLy8gbWFjcm8gZG9lc24ndCBhbHdheXMgd29ya3Mgb24gYWxsIHBsYXRmb3JtcyBzbyB3ZSB1c2UgdGhpcyBrbHVkZ2UuCisvLyBJZiBub3QgY29tcGlsZWQgYXMgYSBtb2R1bGUgaXQganVzdCBtYWtlcyBmaXBfZmlybSBhdmFsaWFibGUgdGhlbgorLy8gIF9faW5pdGRhdGEgc2hvdWxkIHdvcmsgYXMgYWR2ZXJ0aXplZAorLy8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaWZuZGVmIF9faW5pdAorI2RlZmluZSBfX2luaXQKKyNlbmRpZgorI2lmbmRlZiBfX2luaXRmdW5jCisjZGVmaW5lIF9faW5pdGZ1bmMoYSkgYQorI2VuZGlmCisjaWZuZGVmIF9faW5pdGRhdGEKKyNkZWZpbmUgX19pbml0ZGF0YQorI2VuZGlmCisKKyNpbmNsdWRlICIuL2lwMi9pcDJ0eXBlcy5oIgkJCisjaW5jbHVkZSAiLi9pcDIvZmlwX2Zpcm0uaCIJCS8vIHRoZSBtZWF0CisKK2ludAoraXAyX2xvYWRtYWluKGludCAqLCBpbnQgICosIHVuc2lnbmVkIGNoYXIgKiwgaW50ICk7IC8vIHJlZiBpbnRvIGlwMm1haW4uYworCisvKiBOb3RlOiBBZGQgY29tcGlsZWQgaW4gZGVmYXVsdHMgdG8gdGhlc2UgYXJyYXlzLCBub3QgdG8gdGhlIHN0cnVjdHVyZQorCWluIGlwMi9pcDIuaCBhbnkgbG9uZ2VyLiAgVGhhdCBzdHJ1Y3R1cmUgV0lMTCBnZXQgb3ZlcnJpZGRlbgorCWJ5IHRoZXNlIHZhbHVlcywgb3IgY29tbWFuZCBsaW5lIHZhbHVlcywgb3IgaW5zbW9kIHZhbHVlcyEhISAgPW1odz0KKyovCitzdGF0aWMgaW50IGlvW0lQMl9NQVhfQk9BUkRTXT0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IGlycVtJUDJfTUFYX0JPQVJEU10gPSB7IC0xLCAtMSwgLTEsIC0xIH07IAorCitzdGF0aWMgaW50IHBvbGxfb25seSA9IDA7CisKK01PRFVMRV9BVVRIT1IoIkRvdWcgTWNOYXNoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbXB1dG9uZSBJbnRlbGxpUG9ydCBQbHVzIERyaXZlciIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCJJbnRlcnJ1cHRzIGZvciBJbnRlbGxpUG9ydCBDYXJkcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywiSS9PIHBvcnRzIGZvciBJbnRlbGxpUG9ydCBDYXJkcyIpOworbW9kdWxlX3BhcmFtKHBvbGxfb25seSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvbGxfb25seSwiRG8gbm90IHVzZSBjYXJkIGludGVycnVwdHMiKTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcDJfaW5pdCh2b2lkKQoreworCWlmKCBwb2xsX29ubHkgKSB7CisJCS8qIEhhcmQgbG9jayB0aGUgaW50ZXJydXB0cyB0byB6ZXJvICovCisJCWlycVswXSA9IGlycVsxXSA9IGlycVsyXSA9IGlycVszXSA9IDA7CisJfQorCisJcmV0dXJuIGlwMl9sb2FkbWFpbihpbyxpcnEsKHVuc2lnbmVkIGNoYXIgKilmaXBfZmlybSxzaXplb2YoZmlwX2Zpcm0pKTsKK30KK21vZHVsZV9pbml0KGlwMl9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZuZGVmIE1PRFVMRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJaXAyX3NldHVwOgorICoJCXN0cjoga2VybmVsIGNvbW1hbmQgbGluZSBzdHJpbmcKKyAqCisgKglDYW4ndCBhdXRvcHJvYmUgdGhlIGJvYXJkcyBzbyB1c2VyIG11c3Qgc3BlY2lmeSBjb25maWd1cmF0aW9uIG9uCisgKglrZXJuZWwgY29tbWFuZCBsaW5lLiAgU2FuZSBwZW9wbGUgYnVpbGQgaXQgbW9kdWxhciBidXQgdGhlIG90aGVycworICoJY29tZSBoZXJlLgorICoKKyAqCUFsdGVybmF0aW5nIHBhaXJzIG9mIGlvLGlycSBmb3IgdXAgdG8gNCBib2FyZHMuCisgKgkJaXAyPWlvMCxpcnEwLGlvMSxpcnExLGlvMixpcnEyLGlvMyxpcnEzCisgKgorICoJCWlvPTAgPT4gTm8gYm9hcmQKKyAqCQlpbz0xID0+IFBDSQorICoJCWlvPTIgPT4gRUlTQQorICoJCWVsc2UgPT4gSVNBIEkvTyBhZGRyZXNzCisgKgorICoJCWlycT0wIG9yIGludmFsaWQgZm9yIElTQSB3aWxsIHJldmVydCB0byBwb2xsaW5nIG1vZGUKKyAqCisgKgkJQW55IHZhbHVlID0gLTEsIGRvIG5vdCBvdmVyd3JpdGUgY29tcGlsZWQgaW4gdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19pbml0IGlwMl9zZXR1cChjaGFyICpzdHIpCit7CisJaW50CWludHNbMTBdOwkvKiA0IGJvYXJkcywgMiBwYXJhbWV0ZXJzICsgMiAqLworCWludAlpLCBqOworCisJc3RyID0gZ2V0X29wdGlvbnMgKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlmb3IoIGkgPSAwLCBqID0gMTsgaSA8IDQ7IGkrKyApIHsKKwkJaWYoIGogPiBpbnRzWzBdICkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYoIGludHNbal0gPj0gMCApIHsKKwkJCWlvW2ldID0gaW50c1tqXTsKKwkJfQorCQlqKys7CisJCWlmKCBqID4gaW50c1swXSApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmKCBpbnRzW2pdID49IDAgKSB7CisJCQlpcnFbaV0gPSBpbnRzW2pdOworCQl9CisJCWorKzsKKwl9CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJpcDI9IiwgaXAyX3NldHVwKTsKKyNlbmRpZiAvKiAhTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2ZpcF9maXJtLmggYi9kcml2ZXJzL2NoYXIvaXAyL2ZpcF9maXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1MjVmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvZmlwX2Zpcm0uaApAQCAtMCwwICsxLDIxNDkgQEAKKy8qIGZpcF9maXJtLmggLSBJbnRlbGxpcG9ydCBJSSBsb2Fkd2FyZSAqLworLyogLTMxMjMyIGJ5dGVzIHJlYWQgZnJvbSBmZi5sb2QgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlwX2Zpcm1bXSBfX2luaXRkYXRhID0geworMHgzQywweDQyLDB4MzcsMHgxOCwweDAyLDB4MDEsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4NTcsMHg2NSwweDY0LDB4MjAsMHg0NCwweDY1LDB4NjMsMHgyMCwweDMwLDB4MzEsMHgyMCwweDMxLDB4MzIsMHgzQSwweDMyLDB4MzQsCisweDNBLDB4MzMsMHgzMCwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhFOSwweDZDLDB4MEYsMHg0MiwweDY1LDB4NDcsMHg2OSwweDRFLDB4NkUsMHg0OSwweDZFLDB4NDcsMHgyMCwweDZGLDB4NDYsMHgyMCwKKzB4NjMsMHg0RiwweDY0LDB4NDUsMHhDQywweDEzLDB4NUEsMHgxNSwweEU4LDB4MTYsMHg3NiwweDE4LDB4MDQsMHgxQSwweDkyLDB4MUIsCisweDIwLDB4MUQsMHhBRSwweDFFLDB4M0MsMHgyMCwweENBLDB4MjEsMHg1OCwweDIzLDB4RTYsMHgyNCwweDc0LDB4MjYsMHgwMiwweDI4LAorMHg5MCwweDI5LDB4MUUsMHgyQiwweEFDLDB4MkMsMHgzQSwweDJFLDB4QzgsMHgyRiwweDU2LDB4MzEsMHhFNCwweDMyLDB4NzIsMHgzNCwKKzB4MDAsMHgzNiwweDhFLDB4MzcsMHgxQywweDM5LDB4QUEsMHgzQSwweDM4LDB4M0MsMHhDNiwweDNELDB4NTQsMHgzRiwweEUyLDB4NDAsCisweDcwLDB4NDIsMHhGRSwweDQzLDB4OEMsMHg0NSwweDFBLDB4NDcsMHhBOCwweDQ4LDB4MzYsMHg0QSwweEM0LDB4NEIsMHg1MiwweDRELAorMHhFMCwweDRFLDB4NkUsMHg1MCwweEZDLDB4NTEsMHg4QSwweDUzLDB4MTgsMHg1NSwweEE2LDB4NTYsMHgzNCwweDU4LDB4QzIsMHg1OSwKKzB4NTAsMHg1QiwweERFLDB4NUMsMHg2QywweDVFLDB4RkEsMHg1RiwweDg4LDB4NjEsMHgxNiwweDYzLDB4QTQsMHg2NCwweDMyLDB4NjYsCisweEMwLDB4NjcsMHg0RSwweDY5LDB4REMsMHg2QSwweDZBLDB4NkMsMHhGOCwweDZELDB4ODYsMHg2RiwweDE0LDB4NzEsMHhBMiwweDcyLAorMHgzMCwweDc0LDB4QkUsMHg3NSwweDRDLDB4NzcsMHg2QywweDc3LDB4OEMsMHg3NywweEFDLDB4NzcsMHgzMywweERCLDB4OEEsMHhEQywKKzB4NTMsMHgzMywweERCLDB4MjUsMHgwNywweDAwLDB4NzUsMHgwQSwweDhBLDB4MUUsMHgwOCwweDAxLDB4ODMsMHhFMywweDBDLDB4RUIsCisweDIwLDB4OTAsMHgzQywweDAxLDB4NzUsMHgwQSwweDhBLDB4MUUsMHgwOCwweDAxLDB4ODAsMHhFMywweEMwLDB4RUIsMHgxMiwweDkwLAorMHg4QSwweDFFLDB4MEQsMHgwMSwweDNDLDB4MDIsMHg3NSwweDA2LDB4ODAsMHhFMywweDBDLDB4RUIsMHgwNCwweDkwLDB4ODAsMHhFMywKKzB4QzAsMHg1MywweDUwLDB4OEIsMHgxRSwweEJBLDB4MTMsMHg4RSwweERCLDB4RTgsMHg2QSwweDY1LDB4NTUsMHg4QiwweEVDLDB4NTMsCisweDFFLDB4MkIsMHhDMCwweDhFLDB4RDgsMHg4QiwweDVFLDB4MDQsMHhDMSwweEUzLDB4MDQsMHgwMywweDVFLDB4MDYsMHhEMSwweEUzLAorMHgyRSwweDhCLDB4OUYsMHg0NCwweDAwLDB4OEQsMHg0NywweDJBLDB4MUUsMHg1QSwweDFGLDB4NUIsMHg1RCwweEMzLDB4NTUsMHg4QiwKKzB4RUMsMHg1MywweDFFLDB4MkIsMHhDMCwweDhFLDB4RDgsMHg4QiwweDVFLDB4MDQsMHhDMSwweEUzLDB4MDQsMHgwMywweDVFLDB4MDYsCisweEQxLDB4RTMsMHgyRSwweDhCLDB4OUYsMHg0NCwweDAwLDB4OEQsMHg0NywweDM0LDB4MUUsMHg1QSwweDFGLDB4NUIsMHg1RCwweEMzLAorMHhGQiwweDU1LDB4OEIsMHhFQywweDUzLDB4NTEsMHg1MiwweDU2LDB4NTcsMHgxRSwweDA2LDB4MUUsMHgwNywweDMzLDB4QzAsMHg4RSwKKzB4RDgsMHg4QiwweDVFLDB4MDQsMHgyNiwweDhBLDB4NDcsMHg1OSwweDI1LDB4MDMsMHgwMCwweDhCLDB4RjAsMHhEMSwweEU2LDB4MkUsCisweDhCLDB4QjQsMHhDNCwweDAwLDB4QzEsMHhFMCwweDA0LDB4MjYsMHgwMiwweDQ3LDB4MUEsMHhEMSwweEUwLDB4OEIsMHhFOCwweDJFLAorMHg4QiwweEFFLDB4NDQsMHgwMCwweDg5LDB4MkMsMHgyNiwweDhBLDB4NDcsMHgxQywweDg4LDB4NDQsMHgwRiwweDI2LDB4OEEsMHg0NywKKzB4MUQsMHg4OCwweDQ0LDB4MTAsMHgyNiwweDhBLDB4NDcsMHgxRSwweDg4LDB4NDQsMHgxMSwweDI2LDB4OEEsMHg0NywweDFGLDB4ODgsCisweDQ0LDB4MTIsMHgyNiwweDhBLDB4NDcsMHgyMCwweDg4LDB4NDQsMHgxMywweDI2LDB4OEEsMHg0NywweDIzLDB4ODgsMHg0NCwweDE0LAorMHgyNiwweDhBLDB4NDcsMHgyNCwweDg4LDB4NDQsMHgxNSwweDI2LDB4OEEsMHg0NywweDVBLDB4ODgsMHg0NCwweDBFLDB4MzMsMHhDMCwKKzB4ODksMHg0NCwweDA2LDB4ODksMHg0NCwweDA4LDB4ODgsMHg0NCwweDBCLDB4ODgsMHg0NCwweDBBLDB4QjAsMHgyMSwweEI0LDB4NjQsCisweDg5LDB4NDQsMHgwNCwweDg5LDB4NDQsMHgwMiwweEIwLDB4NTUsMHg4OCwweDQ0LDB4MEQsMHg4OCwweDQ0LDB4MEMsMHhFOCwweDZBLAorMHgwMCwweDcyLDB4NUIsMHhFOCwweEM5LDB4MDAsMHhFOCwweEMxLDB4MTAsMHg4OSwweDQ0LDB4MDgsMHg4MCwweDdDLDB4MEYsMHgwMSwKKzB4NzQsMHgyOSwweEU4LDB4MkIsMHgwMiwweEU4LDB4N0YsMHgwMiwweDgwLDB4N0MsMHgwRiwweDAzLDB4NzQsMHgxRCwweEU4LDB4QTksCisweDEwLDB4OEIsMHhGOCwweDJCLDB4NDQsMHgwOCwweDNELDB4QTAsMHgwRiwweDcyLDB4MTAsMHg4OSwweDdDLDB4MDgsMHgzMywweEMwLAorMHg4NywweDQ0LDB4MDYsMHg4NSwweEMwLDB4NzUsMHgwNCwweEM2LDB4NDQsMHgwQSwweEZGLDB4OEEsMHg0NCwweDBBLDB4ODQsMHhDMCwKKzB4NzUsMHgwQiwweEI4LDB4MDgsMHgwMCwweEU4LDB4NkEsMHg0QSwweEU4LDB4QTksMHgwMSwweDczLDB4QkYsMHhFOCwweDRGLDB4MDEsCisweDgxLDB4NjYsMHg0OCwweDdGLDB4RkYsMHg4MywweDY2LDB4N0EsMHhCRiwweEIwLDB4MDIsMHhFOCwweDA0LDB4MEUsMHg4QSwweDQ0LAorMHgwQSwweDk4LDB4MDcsMHgxRiwweDVGLDB4NUUsMHg1QSwweDU5LDB4NUIsMHg1RCwweEMzLDB4ODEsMHg0RSwweDQ4LDB4ODAsMHgwMCwKKzB4QjAsMHg0MCwweEU4LDB4M0QsMHg0QSwweEU4LDB4ODksMHg0MCwweDczLDB4MkEsMHhFOCwweDRELDB4MTAsMHg4QiwweEQ4LDB4QjAsCisweDA1LDB4RTgsMHgyRSwweDRBLDB4RjYsMHg0NiwweDI3LDB4MDIsMHg3NSwweDFBLDB4RTgsMHgzRCwweDEwLDB4MkIsMHhDMywweDNELAorMHg1OCwweDFCLDB4NzIsMHhFQiwweDgxLDB4NjYsMHg0OCwweDdGLDB4RkYsMHhCMCwweDAyLDB4RTgsMHhDNCwweDBELDB4QzYsMHg0NCwKKzB4MEEsMHgwMSwweEY5LDB4QzMsMHg4MywweDRFLDB4N0EsMHg0MCwweEY4LDB4QzMsMHhGQiwweEIwLDB4MDEsMHhFOCwweDAyLDB4NEEsCisweEZBLDB4RTgsMHg5OSwweDFFLDB4RTQsMHgwQSwweDg0LDB4QzAsMHg3NSwweEYwLDB4QjAsMHg0RSwweEU2LDB4MEEsMHhGQiwweEIwLAorMHgwMSwweEU4LDB4RUUsMHg0OSwweEZBLDB4RTgsMHg4NSwweDFFLDB4RTQsMHgwQSwweDg0LDB4QzAsMHg3NSwweEYwLDB4QzMsMHhGQSwKKzB4RTgsMHg3QSwweDFFLDB4RTQsMHhFQywweDg4LDB4NDQsMHgxNiwweEU0LDB4RTQsMHg4OCwweDQ0LDB4MTcsMHhFNCwweEY4LDB4ODgsCisweDQ0LDB4MTgsMHhFNCwweEYwLDB4ODgsMHg0NCwweDE5LDB4RTQsMHgxMCwweDg4LDB4NDQsMHgxQSwweEU0LDB4MTIsMHg4OCwweDQ0LAorMHgxQiwweEU0LDB4MTQsMHg4OCwweDQ0LDB4MUMsMHhFNCwweDM0LDB4ODgsMHg0NCwweDFELDB4RTQsMHgzNiwweDg4LDB4NDQsMHgxRSwKKzB4RTQsMHhEOCwweDI0LDB4MDEsMHg4QSwweEUwLDB4RTQsMHhEQSwweDI0LDB4MDIsMHgwQSwweEM0LDB4ODgsMHg0NCwweDFGLDB4OEEsCisweDQ0LDB4MTAsMHhFOCwweENELDB4MUYsMHg4QSwweDQ0LDB4MTEsMHhFOCwweDM1LDB4MjEsMHg4QSwweDQ0LDB4MTIsMHhFOCwweDg5LAorMHgyMSwweDhBLDB4NDQsMHgxMywweEU4LDB4NDMsMHgyMSwweEM2LDB4ODYsMHhBMSwweDAwLDB4MDAsMHhFNCwweDE0LDB4MjQsMHgxMCwKKzB4RTYsMHgxNCwweEU0LDB4MTIsMHgyNCwweDNELDB4RTYsMHgxMiwweDhBLDB4NDQsMHgxNSwweDNDLDB4MDEsMHg3MiwweDFFLDB4NzcsCisweDE2LDB4QjAsMHgxMSwweEU2LDB4MzQsMHhCMCwweDEzLDB4RTYsMHgzNiwweEU0LDB4MTQsMHgwQywweDEwLDB4RTYsMHgxNCwweEU0LAorMHgxMiwweDBDLDB4NDAsMHhFNiwweDEyLDB4RUIsMHgwNiwweEU0LDB4MTIsMHgwQywweDAyLDB4RTYsMHgxMiwweDhBLDB4NDQsMHgwRiwKKzB4M0MsMHgwMSwweDc0LDB4MDYsMHgzQywweDAyLDB4NzQsMHgwQSwweEVCLDB4MEUsMHhFNCwweDEyLDB4MEMsMHgwOCwweEU2LDB4MTIsCisweEVCLDB4MDYsMHhFNCwweDEyLDB4MEMsMHgxMCwweEU2LDB4MTIsMHhFOCwweDJGLDB4RkYsMHg4QSwweDQ0LDB4MTQsMHgzQywweDAyLAorMHg3NSwweDA4LDB4QjAsMHg1NSwweDg4LDB4NDQsMHgwQywweDg4LDB4NDQsMHgwRCwweEIwLDB4MjEsMHhCNCwweDY0LDB4ODksMHg0NCwKKzB4MDQsMHg4OSwweDQ0LDB4MDIsMHhFNCwweDBDLDB4MEMsMHgxMCwweEU2LDB4MEMsMHhFOCwweEVELDB4MzksMHhGQiwweEMzLDB4RTgsCisweDVGLDB4M0YsMHg3MywweDA4LDB4RkIsMHhCMCwweDBBLDB4RTgsMHgwOCwweDQ5LDB4RUIsMHhGMywweEZBLDB4RTgsMHg5RCwweDFELAorMHg4QSwweDY0LDB4MTYsMHg4QSwweDQ0LDB4MTcsMHg4OSwweDg2LDB4OTQsMHgwMCwweEU2LDB4RTQsMHg4QSwweEM0LDB4RTYsMHhFQywKKzB4OEEsMHg2NCwweDE4LDB4OEEsMHg0NCwweDE5LDB4ODksMHg4NiwweDk2LDB4MDAsMHhFNiwweEYwLDB4OEEsMHhDNCwweEU2LDB4RjgsCisweDhBLDB4NDQsMHgxQSwweEU2LDB4MTAsMHg4QSwweDQ0LDB4MUIsMHhFNiwweDEyLDB4OEEsMHg0NCwweDFDLDB4RTYsMHgxNCwweDhBLAorMHg0NCwweDFELDB4RTYsMHgzNCwweDhBLDB4NDQsMHgxRSwweEU2LDB4MzYsMHg4QSwweDQ0LDB4MUYsMHhFNiwweEQ4LDB4RTYsMHhEQSwKKzB4RTksMHhCNywweEZFLDB4OTAsMHhGQSwweDhBLDB4NDQsMHgwRSwweEU2LDB4RkUsMHhFNCwweDAyLDB4QTgsMHgwMSwweDc1LDB4MDUsCisweDMzLDB4QzAsMHhGQiwweEY4LDB4QzMsMHgzMywweEMwLDB4RTQsMHgwMCwweEZCLDB4RjksMHhDMywweDhBLDB4NjQsMHgxNCwweDgwLAorMHhGQywweDAyLDB4NzQsMHgyQiwweEZFLDB4QzAsMHhGRSwweEM3LDB4ODAsMHhGRiwweDRFLDB4NzIsMHgxQywweDc0LDB4MDksMHg4MCwKKzB4RkYsMHg1MCwweDczLDB4MDgsMHhCMCwweDBBLDB4RUIsMHgxNywweEIwLDB4MEQsMHhFQiwweDEzLDB4MDIsMHhEQywweDMyLDB4RkYsCisweDgwLDB4RkIsMHg3RiwweDdDLDB4MDIsMHhCMywweDIxLDB4OEEsMHhDMywweDNDLDB4N0YsMHg3QywweDAyLDB4QjAsMHgyMSwweEMzLAorMHhGQSwweDgwLDB4N0MsMHgwQiwweDA0LDB4NzYsMHgwMiwweEZCLDB4QzMsMHg4QiwweDQ2LDB4MjQsMHgzRCwweDA4LDB4MDAsMHg3MiwKKzB4RjYsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4QSwweDQ0LDB4MEMsMHg4QiwweDVDLDB4MDIsMHhBQSwweEU4LDB4QUIsCisweEZGLDB4QUEsMHhFOCwweEE3LDB4RkYsMHhBQSwweEU4LDB4QTMsMHhGRiwweEFBLDB4RTgsMHg5RiwweEZGLDB4ODgsMHg0NCwweDBDLAorMHg4OSwweDVDLDB4MDIsMHg4MCwweDQ0LDB4MEIsMHgwNCwweDg5LDB4N0UsMHgyMiwweDgzLDB4NkUsMHgyNCwweDA0LDB4ODMsMHg0NiwKKzB4MUEsMHgwNCwweDgwLDB4N0UsMHgyNiwweDAyLDB4NzQsMHgwNiwweDgwLDB4NjYsMHgyNiwweEZELDB4RkIsMHhDMywweDYwLDB4QjAsCisweEZELDB4RTgsMHgwMiwweDNGLDB4NjEsMHhGQiwweEMzLDB4RkEsMHg4MCwweDdDLDB4MEYsMHgwMywweDc1LDB4MDksMHhDNiwweDQ0LAorMHgwQiwweDAwLDB4RTgsMHhFNSwweDM4LDB4RkIsMHhDMywweEM0LDB4N0UsMHgxNCwweDhCLDB4NEUsMHgzQSwweDg1LDB4QzksMHg3NSwKKzB4MzUsMHgyNiwweDhCLDB4MEQsMHg0NywweDQ3LDB4RTMsMHhFQSwweDNCLDB4N0UsMHgwNCwweDc2LDB4MjIsMHhCOCwweDAyLDB4MDAsCisweDM5LDB4NDYsMHgyRSwweDc3LDB4MDcsMHhDNywweDQ2LDB4MkUsMHgwMCwweDAwLDB4RUIsMHgxMywweDhCLDB4NUUsMHgyQywweDg5LAorMHg1RSwweDA0LDB4MjYsMHhDNywweDA3LDB4MDAsMHgwMCwweDQzLDB4NDMsMHg4OSwweDVFLDB4MkMsMHgyOSwweDQ2LDB4MkUsMHg4NSwKKzB4QzksMHg3OCwweENFLDB4ODksMHg0RSwweDNBLDB4OEEsMHg0NCwweDBELDB4OEIsMHg1QywweDA0LDB4MjYsMHg4QSwweDI1LDB4NDcsCisweDNBLDB4QzQsMHg3NSwweDE2LDB4RkUsMHg0QywweDBCLDB4RkYsMHg0NCwweDA2LDB4RTgsMHgwRiwweEZGLDB4RTIsMHhFRCwweDg4LAorMHg0NCwweDBELDB4ODksMHg1QywweDA0LDB4ODksMHg0RSwweDNBLDB4RUIsMHhBNywweEM2LDB4NDQsMHgwQSwweEZFLDB4RTgsMHg3OSwKKzB4MzgsMHhGQiwweEMzLDB4OTAsMHhFOCwweEIzLDB4MEQsMHg4QSwweEU4LDB4OEEsMHgwRSwweENCLDB4MTMsMHhCMywweDA3LDB4OEEsCisweEMxLDB4RUUsMHhFQiwweDAwLDB4RUMsMHgzQSwweEMxLDB4NzUsMHgwOSwweDAyLDB4Q0QsMHhGRSwweENCLDB4NzUsMHhGMCwweEVCLAorMHgwQywweDkwLDB4ODgsMHgwRSwweENCLDB4MTMsMHg4QSwweEU4LDB4QkIsMHhGRiwweEZGLDB4RjksMHhDMywweDg4LDB4MEUsMHhDQiwKKzB4MTMsMHhGOCwweEMzLDB4OTAsMHhCQiwweDNGLDB4M0YsMHg4QSwweDhFLDB4OUUsMHgwMCwweEJBLDB4RkUsMHgwMCwweEVDLDB4OEEsCisweEU4LDB4MzIsMHhDMSwweDIyLDB4QzMsMHg3NSwweDAyLDB4RjgsMHhDMywweEY5LDB4QzMsMHg5MCwweEU4LDB4RTUsMHhGRiwweDczLAorMHgwMSwweEMzLDB4QkEsMHhEMCwweDAwLDB4QkIsMHgwMywweDAzLDB4OEEsMHg4RSwweDlGLDB4MDAsMHhFQywweDhBLDB4RTgsMHgzMiwKKzB4QzEsMHgyMiwweEMzLDB4NzUsMHgwMiwweEY4LDB4QzMsMHhGOSwweEMzLDB4OTAsMHgzMywweEMwLDB4OEUsMHhEOCwweDhFLDB4QzAsCisweDgwLDB4M0UsMHhDOCwweDEzLDB4MDAsMHg3NSwweDA3LDB4QjAsMHgwQSwweEU4LDB4MjYsMHg0NywweEVCLDB4RjIsMHhGQiwweDMzLAorMHhEQiwweDhBLDB4MUUsMHhDOSwweDEzLDB4NDMsMHg0MywweDgzLDB4RkIsMHg3RSwweDc2LDB4MDcsMHgzMywweERCLDB4QjAsMHgwMiwKKzB4RTgsMHgwRiwweDQ3LDB4MkUsMHg4QiwweEFGLDB4NDQsMHgwMCwweDgzLDB4N0UsMHgwOCwweDAwLDB4NzQsMHhFNywweDg4LDB4MUUsCisweEM5LDB4MTMsMHhCMCwweDAyLDB4RTgsMHhGQiwweDQ2LDB4RkEsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsMHgxNCwweEU4LAorMHg5NiwweDFCLDB4RTgsMHg3RiwweEZGLDB4NzIsMHgxQywweDMzLDB4RDIsMHg4QSwweDk2LDB4OUYsMHgwMCwweDgzLDB4QzIsMHgwRSwKKzB4RUIsMHgwQywweDkwLDB4RTgsMHg3NywweDFCLDB4RTgsMHg4MywweEZGLDB4NzIsMHgwOCwweEJBLDB4NDgsMHgwMCwweEU4LDB4MzMsCisweEZGLDB4NzMsMHhBQiwweDIzLDB4Q0IsMHg4OSwweDhFLDB4OUEsMHgwMCwweDg5LDB4OTYsMHg5QywweDAwLDB4RkUsMHg4NiwweEI1LAorMHgwMCwweEM2LDB4MDYsMHhDOCwweDEzLDB4MDAsMHhCMCwweDBBLDB4RTgsMHg2NywweDBBLDB4RkIsMHhFQiwweDg5LDB4MTAsMHgxOCwKKzB4MDgsMHgyOCwweDMzLDB4QzAsMHhBMCwweDA1LDB4MDEsMHg4QSwweEM4LDB4MjQsMHg0MCwweDc1LDB4MjQsMHhDNywweDA2LDB4N0MsCisweDEyLDB4OEUsMHg0NSwweEM3LDB4MDYsMHg0MiwweDEyLDB4MDEsMHgwMCwweEM2LDB4MDYsMHg1NCwweDEyLDB4MDIsMHhCMCwweDA4LAorMHhGNiwweEMxLDB4MDEsMHg3NCwweDAyLDB4QjAsMHgwNCwweEEzLDB4NDYsMHgxMiwweEEyLDB4NEMsMHgxMiwweEEyLDB4OTQsMHgxMiwKKzB4QzMsMHhDNywweDA2LDB4N0MsMHgxMiwweEI2LDB4NDUsMHhBMCwweDBGLDB4MDEsMHg4NCwweEMwLDB4NzUsMHgwRSwweDZBLDB4MDAsCisweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxRSwweDlDLDB4MEUsMHhFOCwweEIxLDB4MEMsMHg5MCwweEM3LDB4MDYsMHg0NCwweDEyLAorMHgwMSwweDAwLDB4QTMsMHg0MiwweDEyLDB4OEIsMHhEOCwweEMxLDB4RTMsMHgwNCwweDg4LDB4MUUsMHg5NCwweDEyLDB4QkUsMHhFMiwKKzB4MDUsMHgyQiwweEYwLDB4OEIsMHhDOCwweDMzLDB4REIsMHg4QiwweEZCLDB4MkUsMHhBQywweDg4LDB4ODUsMHg0OCwweDEyLDB4OEEsCisweEQ4LDB4MEMsMHgwNSwweEU2LDB4RkUsMHg4QSwweEUwLDB4RUIsMHgwMCwweEU0LDB4RkUsMHgzMiwweEM0LDB4QTgsMHgzRiwweDc0LAorMHgwMywweEU5LDB4OUUsMHgwMCwweEU0LDB4MDAsMHg4OCwweDg1LDB4NTAsMHgxMiwweDhBLDB4RTAsMHgyNCwweDMwLDB4QkEsMHgxMCwKKzB4RkYsMHgzQywweDMwLDB4NzQsMHgxMiwweDgwLDB4RkMsMHgwNCwweDc0LDB4MEEsMHhCQSwweDA0LDB4MDMsMHhGNiwweDA2LDB4MDgsCisweDAxLDB4RkUsMHg3NCwweDAzLDB4QkEsMHgwOCwweDBGLDB4ODgsMHg5NSwweDRDLDB4MTIsMHgwMiwweEZBLDB4MzIsMHhDMCwweEY2LAorMHhDNCwweDA4LDB4NzQsMHgwMiwweEIwLDB4MDEsMHg4OCwweDg1LDB4NTgsMHgxMiwweDhBLDB4QzQsMHgzQywweDM1LDB4NzQsMHg1QiwKKzB4M0MsMHgzNiwweDc0LDB4NTcsMHgzQywweDM0LDB4NzQsMHg1MywweDNDLDB4MDQsMHg3NCwweDRGLDB4M0MsMHgxNCwweDc0LDB4NEIsCisweDNDLDB4MTUsMHg3NCwweDQ3LDB4QTgsMHg0MCwweDc0LDB4MjUsMHhDNiwweDg1LDB4NTQsMHgxMiwweDA0LDB4RDEsMHhFNywweEI0LAorMHgwMywweDhBLDB4QzMsMHg4OSwweDg1LDB4NUMsMHgxMiwweDhBLDB4QzMsMHg4QSwweEUzLDB4ODAsMHhDQywweDAxLDB4ODksMHg4NSwKKzB4NjQsMHgxMiwweEQxLDB4RUYsMHg0NywweEUyLDB4MDMsMHhFQiwweDFBLDB4OTAsMHhFOSwweDZDLDB4RkYsMHhDNiwweDg1LDB4NTQsCisweDEyLDB4MDIsMHhEMSwweEU3LDB4OEEsMHhFNiwweDhBLDB4QzMsMHgwQywweDA0LDB4ODksMHg4NSwweDVDLDB4MTIsMHhEMSwweEVGLAorMHg0NywweEUyLDB4RTcsMHgzMywweEMwLDB4OEEsMHhDNywweEEzLDB4NDYsMHgxMiwweEMzLDB4QzYsMHg4NSwweDU0LDB4MTIsMHgwNiwKKzB4RUIsMHhCQiwweEM2LDB4ODUsMHg1NCwweDEyLDB4MDAsMHgzMywweEMwLDB4ODgsMHg4NSwweDUwLDB4MTIsMHg4OCwweDg1LDB4NEMsCisweDEyLDB4ODgsMHg4NSwweDU4LDB4MTIsMHhFQiwweEE2LDB4QzcsMHg0NiwweDI2LDB4MDIsMHgxMiwweDhCLDB4NDYsMHgxRSwweDg5LAorMHg0NiwweDAwLDB4ODksMHg0NiwweDIyLDB4OEIsMHg0NiwweDIwLDB4ODksMHg0NiwweDI0LDB4QzcsMHg0NiwweDFBLDB4MDAsMHgwMCwKKzB4QzMsMHhDNywweDQ2LDB4M0MsMHg4MCwweDAwLDB4QzcsMHg0NiwweDM4LDB4MDEsMHgwMCwweDFFLDB4NTYsMHg4QiwweDc2LDB4MzAsCisweDg5LDB4NzYsMHgwNCwweDg5LDB4NzYsMHgxNCwweDhFLDB4NUUsMHgwNiwweDMzLDB4QzAsMHg4OSwweDA0LDB4NDYsMHg0NiwweDg5LAorMHg3NiwweDJDLDB4ODksMHg0NiwweDNBLDB4OEIsMHg0NiwweDMyLDB4NDgsMHg0OCwweDg5LDB4NDYsMHgyRSwweDVFLDB4MUYsMHhDMywKKzB4MzMsMHhDMCwweDg5LDB4NDYsMHg0OCwweDg5LDB4NDYsMHg0QSwweEM3LDB4NDYsMHg0NiwweEFFLDB4MDEsMHg4OSwweDQ2LDB4NEUsCisweDhCLDB4NDYsMHg0NCwweDg5LDB4NDYsMHg1MCwweDhCLDB4NDYsMHg0MiwweDg5LDB4NDYsMHg0MCwweDg5LDB4NDYsMHgwOCwweEMzLAorMHgzMywweEMwLDB4ODksMHg0NiwweDc2LDB4ODksMHg0NiwweDc4LDB4QzcsMHg0NiwweDdBLDB4MTAsMHgwMCwweDU2LDB4MUUsMHg4QiwKKzB4NzYsMHg3MCwweDg5LDB4NzYsMHgxMCwweDg5LDB4NzYsMHgwQywweDhFLDB4NUUsMHgxMiwweEM3LDB4MDQsMHgwMCwweDAwLDB4OEIsCisweDQ2LDB4NzIsMHg4OSwweDQ2LDB4NzQsMHgxRiwweDVFLDB4QzMsMHg4OSwweDU2LDB4MTgsMHg4OSwweDU2LDB4MDIsMHg4OSwweDU2LAorMHgwNiwweDg5LDB4NTYsMHgwQSwweDg5LDB4NTYsMHgwRSwweDg5LDB4NTYsMHgxMiwweDg5LDB4NTYsMHgxNiwweDhCLDB4RDgsMHg0QiwKKzB4NEIsMHhDMSwweEUzLDB4MDIsMHhCRiwweDAyLDB4MDAsMHg4OSwweDdFLDB4MUUsMHgwMywweEZCLDB4ODksMHg3RSwweDMwLDB4MDMsCisweEZCLDB4ODksMHg3RSwweDQyLDB4MDMsMHhGQiwweDg5LDB4N0UsMHg3MCwweDgzLDB4RUIsMHgwOCwweDg5LDB4NUUsMHgyMCwweDg5LAorMHg1RSwweDMyLDB4ODksMHg1RSwweDQ0LDB4ODksMHg1RSwweDcyLDB4NTAsMHhFOCwweDJCLDB4RkYsMHhFOCwweDcxLDB4RkYsMHhFOCwKKzB4M0YsMHhGRiwweEU4LDB4OEIsMHhGRiwweDU4LDB4QzMsMHhCOCwweDMwLDB4NzUsMHhDMSwweEU4LDB4MDQsMHgwRSwweDVCLDB4MDMsCisweEMzLDB4QTMsMHhCQSwweDEzLDB4ODMsMHgzRSwweDQyLDB4MTIsMHgwMCwweDc0LDB4MDcsMHg4MCwweDNFLDB4OTQsMHgxMiwweDAwLAorMHg3NSwweDBFLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxRSwweDlDLDB4MEUsMHhFOCwweEJELDB4MEEsMHg5MCwKKzB4QjgsMHgzMCwweDdBLDB4QzEsMHhFOCwweDA0LDB4NDAsMHhBMywweEMwLDB4MTMsMHgyQiwweDA2LDB4MTIsMHgwMSwweEY3LDB4RDgsCisweDMzLDB4RDIsMHg4QiwweENBLDB4OEEsMHgwRSwweDk0LDB4MTIsMHhGNywweEYxLDB4M0QsMHg4MCwweDAwLDB4NzcsMHgwRSwweDZBLAorMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgyNSwweDlDLDB4MEUsMHhFOCwweDkwLDB4MEEsMHg5MCwweDQ4LDB4M0QsMHhGRiwKKzB4MDcsMHg3MiwweDAzLDB4QjgsMHhGRiwweDA3LDB4QTMsMHhDMiwweDEzLDB4MzMsMHhDOSwweDhBLDB4MEUsMHg5NCwweDEyLDB4MzMsCisweEY2LDB4QjgsMHgwMCwweDA5LDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwweDg5LDB4NDYsMHg0QywweDQwLDB4NDYsMHg0NiwweEUyLAorMHhGMywweDhBLDB4MEUsMHg5NCwweDEyLDB4MzMsMHhGNiwweDhCLDB4MTYsMHhDMCwweDEzLDB4QTEsMHhDMiwweDEzLDB4MkUsMHg4QiwKKzB4QUMsMHg0NCwweDAwLDB4RTgsMHgyMiwweEZGLDB4MDMsMHhEMCwweDQ2LDB4NDYsMHhFMiwweEYyLDB4QzMsMHgzMywweEMwLDB4MkUsCisweDhCLDB4QUQsMHg0NCwweDAwLDB4ODksMHg0NiwweDA4LDB4NDcsMHg0NywweEUyLDB4RjQsMHhDMywweDUxLDB4MzMsMHhDMCwweDBBLAorMHhDMiwweDJFLDB4OEIsMHhBRCwweDQ0LDB4MDAsMHg4OSwweDg2LDB4OUUsMHgwMCwweDgxLDB4NEUsMHgzOCwweDAwLDB4MjAsMHg0NywKKzB4NDcsMHhGRSwweEM0LDB4ODAsMHhGQywweDA0LDB4NzIsMHgwNCwweDMyLDB4RTQsMHhGRSwweEMwLDB4RTIsMHhFMywweDU5LDB4ODMsCisweEU5LDB4MTAsMHg3NCwweDA1LDB4RjcsMHhEOSwweEU4LDB4QzQsMHhGRiwweEMzLDB4NTEsMHgzMywweEMwLDB4MEEsMHhDMiwweDJFLAorMHg4QiwweEFELDB4NDQsMHgwMCwweDg5LDB4ODYsMHg5RSwweDAwLDB4ODMsMHg0RSwweDM4LDB4NDAsMHg0NywweDQ3LDB4ODAsMHhDNCwKKzB4MTAsMHg3OSwweDA0LDB4MzIsMHhFNCwweEZFLDB4QzAsMHhFMiwweEU2LDB4NTksMHg4MywweEU5LDB4MTAsMHg3NCwweDA1LDB4RjcsCisweEQ5LDB4RTgsMHg5OSwweEZGLDB4QzMsMHhFOCwweEQyLDB4RkYsMHhDMywweDhELDB4MDgsMHg5QywweDA4LDB4Q0EsMHgwOCwweEY1LAorMHgwOCwweDhCLDB4MEUsMHg0MiwweDEyLDB4MzMsMHhGNiwweDUxLDB4NTYsMHgzMywweERCLDB4OEIsMHhDQiwweDhBLDB4OTQsMHg0OCwKKzB4MTIsMHg4QSwweDhDLDB4NEMsMHgxMiwweDhBLDB4OUMsMHg1NCwweDEyLDB4OEIsMHhGRSwweEMxLDB4RTcsMHgwNSwweDg1LDB4REIsCisweDc1LDB4MDIsMHhCMSwweDEwLDB4MkUsMHhGRiwweDk3LDB4RjksMHgwOCwweDVFLDB4NTksMHg0NiwweEUyLDB4RDksMHhDMywweDAxLAorMHhDQywweDAzLDB4RDAsMHgwMCwweEU4LDB4MDIsMHhEMCwweDAwLDB4RTgsMHgwMSwweEQwLDB4MDAsMHhFOCwweDAwLDB4RDAsMHgwMCwKKzB4RTgsMHgwNCwweEQwLDB4QTgsMHhEQSwweDAwLDB4REMsMHgwMCwweERFLDB4MDEsMHhEOCwweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsCisweENDLDB4MDQsMHhEMCwweEE4LDB4REEsMHgyMCwweERDLDB4MDAsMHhERSwweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAwLAorMHhEOCwweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywKKzB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsCisweENDLDB4MDQsMHhEMCwweDAwLDB4REEsMHgyMCwweERDLDB4MDMsMHhERSwweDAxLDB4RDgsMHgwMywweENDLDB4MDMsMHhDQywweDAzLAorMHhDQywweDAzLDB4Q0MsMHgwMCwweEQ4LDB4MDAsMHhDQywweDAwLDB4RDAsMHgwMCwweDAwLDB4NTYsMHg1MiwweDFFLDB4MEUsMHgxRiwKKzB4QkUsMHgyRiwweDA5LDB4MzMsMHhEMiwweEZDLDB4QUQsMHg4NSwweEMwLDB4NzQsMHgwRCwweDhBLDB4RDQsMHhFRSwweEFELDB4ODUsCisweEMwLDB4NzQsMHgwNSwweDhBLDB4RDQsMHhFRSwweEVCLDB4RUUsMHgxRiwweDVBLDB4NUUsMHhDMywweEU0LDB4ODAsMHg4NCwweEMwLAorMHg3NCwweDE2LDB4NzgsMHgxNCwweEIwLDB4MjcsMHhFNiwweEZDLDB4QjAsMHgxMSwweEU2LDB4MzQsMHhFNCwweEZDLDB4M0MsMHgyNywKKzB4NzUsMHgwNiwweEU0LDB4MTEsMHg3NSwweDAyLDB4RjgsMHhDMywweEY5LDB4QzMsMHg4MywweEMyLDB4MDYsMHhCMCwweEJGLDB4RUUsCisweDgzLDB4RUEsMHgwMiwweEIwLDB4MTAsMHhFRSwweDg4LDB4ODYsMHhBRiwweDAwLDB4QjAsMHgxMSwweDgzLDB4QzIsMHgwNCwweEVFLAorMHg4MywweEMyLDB4MDIsMHhFRSwweEIwLDB4MTMsMHg4MywweEMyLDB4MDIsMHhFRSwweDgzLDB4QzIsMHgwMiwweEVFLDB4MkUsMHhBMSwKKzB4NEMsMHgyRCwweDg5LDB4ODYsMHg5NCwweDAwLDB4ODMsMHhFQSwweDBFLDB4RUUsMHg4MywweEMyLDB4MDIsMHg4QSwweEM0LDB4RUUsCisweDgzLDB4QzIsMHgwNCwweEIwLDB4MDMsMHhFRSwweDg4LDB4ODYsMHhBOCwweDAwLDB4ODMsMHhFQSwweDA0LDB4MzIsMHhDMCwweEVFLAorMHg4MywweEMyLDB4MDIsMHhCMCwweDg5LDB4RUUsMHg4OCwweDg2LDB4QTYsMHgwMCwweDBDLDB4MDYsMHhFRSwweEIwLDB4NDAsMHhCNCwKKzB4MzgsMHg4OSwweDQ2LDB4MUMsMHhDNywweDQ2LDB4MzYsMHgzOCwweDAwLDB4ODMsMHhDMiwweDA0LDB4MzIsMHhDMCwweEVFLDB4ODgsCisweDg2LDB4QTcsMHgwMCwweEMzLDB4ODMsMHhDMiwweDA2LDB4QjAsMHhCRiwweEVFLDB4ODMsMHhFQSwweDAyLDB4RUMsMHgzQSwweDg2LAorMHhBRiwweDAwLDB4NzUsMHgyNCwweDgzLDB4QzIsMHgwNCwweEVDLDB4M0MsMHgxMSwweDc1LDB4MUMsMHg4MywweEMyLDB4MDYsMHhFQywKKzB4M0MsMHgxMywweDc1LDB4MTQsMHg4MywweEVBLDB4MDgsMHg4QSwweDg2LDB4QTgsMHgwMCwweEVFLDB4ODMsMHhFQSwweDAyLDB4RUMsCisweDI0LDB4QzAsMHgzQywweEMwLDB4NzUsMHgwMiwweEY4LDB4QzMsMHhGOSwweEMzLDB4MzMsMHhDOSwweDhCLDB4RDEsMHg4QiwweEYxLAorMHg4QSwweDBFLDB4OTQsMHgxMiwweEMxLDB4RTksMHgwMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHgwMCwKKzB4MjAsMHg3NCwweDBFLDB4OEEsMHg4NiwweDlFLDB4MDAsMHhFNiwweEZFLDB4MzIsMHhDMCwweEU2LDB4ODAsMHg0MiwweEU4LDB4RkEsCisweEZFLDB4ODMsMHhDNiwweDA4LDB4RTIsMHhFMSwweDg1LDB4RDIsMHg3NCwweDAzLDB4RTgsMHgwNSwweDA4LDB4QzMsMHgzMywweEM5LAorMHg4QiwweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwKKzB4NzQsMHgwNiwweEU4LDB4NzMsMHgxNiwweEU4LDB4MTIsMHhGRiwweDQ2LDB4NDYsMHhFMiwweEVBLDB4QzMsMHgzMywweEM5LDB4OEIsCisweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHhDMSwweEU5LDB4MDIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LAorMHgwMCwweDIwLDB4NzQsMHgxNiwweEU4LDB4NDYsMHgxNiwweEU4LDB4RDIsMHhGRSwweDczLDB4MEUsMHg2QSwweDAwLDB4MUYsMHhDNiwKKzB4MDYsMHg5MywweDEyLDB4MUMsMHg5QywweDBFLDB4RTgsMHhFMywweDA3LDB4OTAsMHg4MywweEM2LDB4MDgsMHhFMiwweEQ5LDB4QzMsCisweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LAorMHg0MCwweDAwLDB4NzQsMHgxNiwweEU4LDB4MjEsMHgxNiwweEU4LDB4MkEsMHhGRiwweDczLDB4MEUsMHg2QSwweDAwLDB4MUYsMHhDNiwKKzB4MDYsMHg5MywweDEyLDB4MUMsMHg5QywweDBFLDB4RTgsMHhCMywweDA3LDB4OTAsMHg0NiwweDQ2LDB4RTIsMHhEQSwweEMzLDB4MEMsCisweDAwLDB4MDAsMHgxMCwweDAwLDB4MTMsMHgxMiwweDAwLDB4MDAsMHgxNCwweDAwLDB4MjgsMHgzQywweDAwLDB4MUIsMHgzRSwweDAwLAorMHgwMCwweDJBLDB4MDAsMHgwMCwweDJDLDB4MDAsMHgwMCwweDQyLDB4MDAsMHgxNCwweEQ4LDB4MDAsMHgwMCwweERBLDB4MDAsMHgwMCwKKzB4MzQsMHgwMCwweDExLDB4MzYsMHgwMCwweDEzLDB4MzgsMHgwMCwweDExLDB4M0EsMHgwMCwweDEzLDB4MDAsMHgwMCwweDU2LDB4NTAsCisweDUyLDB4QkUsMHgyRiwweDBCLDB4MkUsMHhBRCwweDg1LDB4QzAsMHg3NCwweDA2LDB4OTIsMHgyRSwweEFDLDB4RUUsMHhFQiwweEY0LAorMHg1QSwweDU4LDB4NUUsMHhDMywweDUzLDB4MkUsMHhBMSwweDYwLDB4MjIsMHhFNiwweEU0LDB4RTYsMHhGMCwweDhBLDB4QzQsMHhFNiwKKzB4RUMsMHhFNiwweEY4LDB4RTgsMHhEOCwweEZGLDB4QjAsMHg0QiwweEU2LDB4MTAsMHhCMCwweDUwLDB4RTYsMHgxMiwweEIwLDB4MzgsCisweEU2LDB4MTQsMHhFOCwweEFFLDB4MTUsMHhCMCwweDQ2LDB4RTYsMHgwQSwweEU4LDB4QTcsMHgxNSwweEIwLDB4MUEsMHhFNiwweDBBLAorMHhFOCwweEEwLDB4MTUsMHhCMCwweDIyLDB4RTYsMHgwQSwweEU4LDB4OTksMHgxNSwweEU4LDB4RkQsMHgwNiwweDhCLDB4RDgsMHhFNCwKKzB4MTYsMHhBOCwweDA0LDB4NzUsMHgxOCwweEU4LDB4RjIsMHgwNiwweDJCLDB4QzMsMHgzRCwweDMyLDB4MDAsMHg3MiwweEYwLDB4NkEsCisweDAwLDB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDIzLDB4OUMsMHgwRSwweEU4LDB4MTAsMHgwNywweDkwLDB4RTgsMHhEQSwweDA2LAorMHgyQiwweEMzLDB4M0QsMHgyNCwweDAwLDB4NzcsMHgxQiwweEIwLDB4MzEsMHhFNiwweEZDLDB4NTYsMHg1MSwweDU1LDB4QjksMHgxMCwKKzB4MDAsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4ODEsMHg0RSwweDM4LDB4ODAsMHgwMCwweDQ2LDB4NDYsMHhFMiwweEYyLDB4NUQsCisweDU5LDB4NUUsMHhFOCwweDY5LDB4RkYsMHhFOCwweDRCLDB4MTUsMHhCMCwweDQ2LDB4RTYsMHgwQSwweEU4LDB4NDQsMHgxNSwweDVCLAorMHhDMywweDMzLDB4RjYsMHg4QiwweDBFLDB4NDIsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHgwMCwKKzB4MjAsMHg3NCwweDA2LDB4RTgsMHgxNywweDE1LDB4RTgsMHg1QiwweEZGLDB4ODMsMHhDNiwweDIwLDB4RTIsMHhFOSwweEMzLDB4OEIsCisweEMyLDB4MDUsMHgwNCwweDAwLDB4ODksMHg0NiwweDI4LDB4MkUsMHhBMSwweDRDLDB4MkQsMHg4OSwweDg2LDB4OEUsMHgwMCwweDg5LAorMHg4NiwweDkwLDB4MDAsMHg4OSwweDg2LDB4OTIsMHgwMCwweEM2LDB4ODYsMHhBMywweDAwLDB4MEEsMHhDNiwweDg2LDB4QzMsMHgwMCwKKzB4MDMsMHg1MiwweDgzLDB4QzIsMHgwNCwweDhBLDB4ODYsMHhBNiwweDAwLDB4MEMsMHgwNiwweEVFLDB4NUEsMHg4MywweEMyLDB4MDIsCisweEIwLDB4MDUsMHhFRSwweDg4LDB4ODYsMHhBNSwweDAwLDB4QzMsMHhFOCwweDAzLDB4RkYsMHhFOCwweEU1LDB4MTQsMHhCMCwweDQyLAorMHhFNiwweDBBLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwweDc0LDB4MDYsMHgyRSwweEExLDB4OUMsMHgyMiwweEVCLDB4MDQsMHgyRSwKKzB4QTEsMHg2QywweDIyLDB4QzcsMHg0NiwweDFDLDB4MEMsMHgwMCwweDg5LDB4ODYsMHg5NCwweDAwLDB4ODksMHg4NiwweDk2LDB4MDAsCisweDg5LDB4ODYsMHg4RSwweDAwLDB4ODksMHg4NiwweDkwLDB4MDAsMHg4OSwweDg2LDB4OTIsMHgwMCwweEU2LDB4RjAsMHhFNiwweEU0LAorMHg4QSwweEM0LDB4RTYsMHhGOCwweEU2LDB4RUMsMHhDNiwweDg2LDB4QzMsMHgwMCwweDAzLDB4RTgsMHhBNSwweDE0LDB4QjAsMHgxQSwKKzB4RTYsMHgwQSwweEIwLDB4MTAsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhDMywweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsCisweDBFLDB4OTQsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsMHgwNiwweEU4LAorMHg3NiwweDE0LDB4RTgsMHg1QSwweEZGLDB4NDYsMHg0NiwweEUyLDB4RUEsMHhDMywweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsMHgwRSwKKzB4OTQsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHgwMCwweDIwLDB4NzQsMHgwNiwweEU4LDB4NEMsCisweDE0LDB4RTgsMHg3NCwweEZGLDB4NDYsMHg0NiwweEUyLDB4RUEsMHhDMywweDkwLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc1LAorMHgxNCwweEIwLDB4MDEsMHhCQSwweDA2LDB4MDEsMHhFRSwweDJBLDB4QzAsMHhFRSwweEIwLDB4MDIsMHhFRSwweEIwLDB4MDQsMHhFRSwKKzB4QjgsMHgwMCwweDAyLDB4RUIsMHgwRiwweEJBLDB4MDYsMHgwMSwweEIwLDB4NDAsMHhFRSwweEI4LDB4MDEsMHgwMCwweDhBLDB4MEUsCisweDBFLDB4MDEsMHhEMywweEUwLDB4QTMsMHg4OCwweDEyLDB4QzMsMHhBMSwweDg4LDB4MTIsMHhBMywweDg0LDB4MTIsMHgyRCwweDIwLAorMHgwMCwweEEzLDB4OEEsMHgxMiwweDJELDB4MjAsMHgwMCwweEEzLDB4ODIsMHgxMiwweEM3LDB4MDYsMHg4NiwweDEyLDB4MjAsMHgwMCwKKzB4QzcsMHgwNiwweDgwLDB4MTIsMHgzMiwweDAwLDB4QzMsMHg4MywweDNFLDB4NDQsMHgxMiwweDAwLDB4NzQsMHg3NiwweDhCLDB4MEUsCisweDQyLDB4MTIsMHgzMywweEY2LDB4OEEsMHhBNCwweDU0LDB4MTIsMHg4NCwweEU0LDB4NzQsMHg1RiwweDhBLDB4ODQsMHg0OCwweDEyLAorMHgwQywweDA0LDB4RTYsMHhGRSwweEY2LDB4QzQsMHgwNCwweDc0LDB4MjUsMHhCMCwweDFCLDB4QkEsMHgwMCwweDAwLDB4RUUsMHhFQiwKKzB4MDAsMHgyQSwweEMwLDB4QkEsMHgwMiwweDAwLDB4RUUsMHhFQiwweDAwLDB4QjAsMHgwMywweEVFLDB4RUIsMHgwMCwweDMyLDB4QzAsCisweEJBLDB4MDIsMHgwMCwweEVFLDB4RUIsMHgwMCwweEJBLDB4MDAsMHgwMCwweEIwLDB4MDAsMHhFRSwweEVCLDB4MkQsMHhCMCwweDFGLAorMHhCQSwweDAwLDB4MDAsMHhFRSwweEVCLDB4MDAsMHgyQSwweEMwLDB4QkEsMHgwMiwweDAwLDB4RUUsMHhFQiwweDAwLDB4QjAsMHgwMywKKzB4RUUsMHhFQiwweDAwLDB4RDEsMHhFNiwweDhBLDB4ODQsMHg1RCwweDEyLDB4RDEsMHhFRSwweEY2LDB4RDAsMHhCQSwweDAyLDB4MDAsCisweEVFLDB4RUIsMHgwMCwweEJBLDB4MDAsMHgwMCwweEIwLDB4MEEsMHhFRSwweEVCLDB4MDAsMHhFNCwweDA0LDB4RUIsMHgwMCwweEU0LAorMHgwNCwweDQ2LDB4RTIsMHg5MCwweEMzLDB4OTAsMHhCOCwweDE0LDB4MDAsMHhCQSwweDNFLDB4RkYsMHhFRiwweEI4LDB4MDYsMHgwMCwKKzB4QkEsMHgzMiwweEZGLDB4RUYsMHhCOCwweDBGLDB4MDAsMHhCQSwweDM0LDB4RkYsMHhFRiwweEJBLDB4MzYsMHhGRiwweEVGLDB4ODMsCisweDNFLDB4NDQsMHgxMiwweDAwLDB4NzUsMHgxNiwweEI4LDB4MTEsMHgwMCwweEJBLDB4MzgsMHhGRiwweEVGLDB4QjgsMHgxMiwweDAwLAorMHhCQSwweDNBLDB4RkYsMHhFRiwweEI4LDB4MUIsMHgwMCwweEJBLDB4M0MsMHhGRiwweEVGLDB4QzMsMHhCOCwweDExLDB4MDAsMHhCQSwKKzB4MzgsMHhGRiwweEVGLDB4QjgsMHgxMiwweDAwLDB4QkEsMHgzQSwweEZGLDB4RUYsMHhCOCwweDFCLDB4MDAsMHhCQSwweDNDLDB4RkYsCisweEVGLDB4QzMsMHhCOCwweEZDLDB4MDAsMHhCQSwweDI4LDB4RkYsMHhFRiwweEZCLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc0LAorMHgwNywweEI4LDB4Q0MsMHgwMCwweEJBLDB4MjgsMHhGRiwweEVGLDB4QzMsMHgwMCwweEZGLDB4RkYsMHgyMCwweDI0LDB4MjgsMHhGRiwKKzB4MkMsMHhGRiwweEZGLDB4MzAsMHgzNCwweDM4LDB4RkYsMHhGRiwweDNDLDB4OTAsMHgzQywweDBGLDB4NzcsMHgwRSwweEJCLDB4MTksCisweDBFLDB4MkUsMHhENywweDNDLDB4RkYsMHg3NCwweDA1LDB4OEEsMHhEOCwweEY4LDB4QzMsMHg5MCwweDJBLDB4REIsMHhGOSwweEMzLAorMHg4MywweDNFLDB4NDQsMHgxMiwweDAwLDB4NzQsMHgyNywweEEwLDB4MDYsMHgwMSwweDgwLDB4MjYsMHgwNiwweDAxLDB4MzAsMHg4MCwKKzB4M0UsMHgwNiwweDAxLDB4MzAsMHg3NSwweDE4LDB4QjksMHgwMiwweDAwLDB4QkYsMHhDNCwweDEzLDB4QkEsMHgwNiwweDAxLDB4RUMsCisweEE4LDB4MjAsMHg3NSwweEY4LDB4QkEsMHgwNCwweDAxLDB4RUQsMHhBQiwweEUyLDB4RjEsMHhFQiwweDE2LDB4OTAsMHhCOSwweDA0LAorMHgwMCwweEJGLDB4QzQsMHgxMywweEJBLDB4MDYsMHgwMSwweEVDLDB4QTgsMHgyMCwweDc1LDB4RjgsMHhCQSwweDA0LDB4MDEsMHhFQywKKzB4QUEsMHhFMiwweEYxLDB4RkEsMHg5MCwweEJFLDB4QzQsMHgxMywweEFELDB4ODAsMHhFNCwweDNGLDB4ODAsMHhGQywweDAyLDB4NzQsCisweDBFLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgwQSwweDlDLDB4MEUsMHhFOCwweDNFLDB4MDQsMHg5MCwweEFELAorMHgzQywweDBGLDB4NzUsMHhFRCwweDhBLDB4QzQsMHhFOCwweDgxLDB4RkYsMHg3MiwweEU2LDB4ODgsMHgxRSwweDFBLDB4MDEsMHhDNiwKKzB4MDYsMHg4RSwweDEyLDB4MDAsMHhCMCwweDAwLDB4MEEsMHgwNiwweDFBLDB4MDEsMHhCQSwweDAwLDB4MDEsMHhFRSwweEM2LDB4MDYsCisweDhGLDB4MTIsMHg0MCwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NSwweDA2LDB4QjgsMHgwQywweDAwLDB4RUIsMHgwNCwweDkwLAorMHhCOCwweDRDLDB4MDAsMHhCQSwweDI4LDB4RkYsMHhFRiwweEMzLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc1LDB4MDEsMHhDMywKKzB4QTEsMHg1MCwweDEyLDB4MEIsMHgwNiwweDUyLDB4MTIsMHgwQSwweEM0LDB4QTgsMHgwOCwweDc0LDB4RjIsMHhBMCwweDBGLDB4MDEsCisweDJBLDB4RTQsMHg1MCwweEZGLDB4MzYsMHhCQSwweDEzLDB4MUYsMHhFOCwweDUwLDB4NTYsMHg4MywweEM0LDB4MDIsMHg2QSwweDAwLAorMHgxRiwweDMzLDB4QzAsMHhBMywweEJDLDB4MTMsMHhBMCwweDBGLDB4MDEsMHhBMywweEJFLDB4MTMsMHg4QiwweDFFLDB4QkMsMHgxMywKKzB4OEEsMHg4NywweDUwLDB4MTIsMHhGNiwweDg3LDB4NTAsMHgxMiwweDA4LDB4NzQsMHgwRCwweDI0LDB4MDcsMHg4QSwweEUwLDB4QkUsCisweENDLDB4MDAsMHhBMCwweEJDLDB4MTMsMHhFOCwweDk0LDB4M0QsMHhGRiwweDA2LDB4QkMsMHgxMywweEZGLDB4MEUsMHhCRSwweDEzLAorMHg3NSwweERBLDB4QzMsMHg5MCwweDFFLDB4MzMsMHhDMCwweDhFLDB4RDgsMHhCMCwweDAxLDB4RTgsMHg1NCwweDNELDB4MUYsMHhDMywKKzB4MzMsMHhDOSwweDhCLDB4RjEsMHg4QSwweDBFLDB4OTQsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhDNywweDQ2LDB4NjIsCisweDM4LDB4NDQsMHhDNywweDQ2LDB4N0MsMHhGQywweDNCLDB4QzcsMHg0NiwweDdFLDB4RTIsMHgzQiwweEM3LDB4ODYsMHg4MCwweDAwLAorMHhFQywweDNDLDB4RTgsMHhBQiwweDE2LDB4QzYsMHg4NiwweEMwLDB4MDAsMHgxMSwweDgzLDB4N0UsMHgwOCwweDAwLDB4NzQsMHgwNywKKzB4NTEsMHg1NiwweEU4LDB4MzMsMHgzMywweDVFLDB4NTksMHg0NiwweDQ2LDB4RTIsMHhDRCwweEMzLDB4MzMsMHhDOSwweDhCLDB4RjEsCisweDhCLDB4RjksMHg4QSwweDBFLDB4OTQsMHgxMiwweEMxLDB4RTksMHgwMiwweEUzLDB4MTMsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLAorMHg4QSwweDg2LDB4OUUsMHgwMCwweDg4LDB4ODUsMHg2QywweDEyLDB4ODMsMHhDNiwweDA4LDB4NDcsMHhFMiwweEVELDB4QzMsMHhGQSwKKzB4RkMsMHhCMCwweEMwLDB4QkEsMHgwMCwweDAxLDB4RUUsMHgzMywweEMwLDB4OEUsMHhEOCwweDhFLDB4QzAsMHg4RSwweEQwLDB4QkYsCisweDE2LDB4MDEsMHhCOSwweENDLDB4NzcsMHgyQiwweENGLDB4RDEsMHhFOSwweEYzLDB4QUIsMHhCQywweDQwLDB4MTIsMHhFOCwweEQ5LAorMHgwMiwweEU4LDB4NzAsMHgzQywweEJFLDB4Q0MsMHgwRiwweEU4LDB4RjIsMHgzQywweEY0LDB4OTAsMHgzMywweEMwLDB4OEUsMHhEOCwKKzB4OEUsMHhDMCwweDhFLDB4RDAsMHhGNiwweDA2LDB4MEEsMHgwMSwweDgwLDB4NzQsMHgwQiwweEJFLDB4MzUsMHg1NSwweEU4LDB4REIsCisweDNDLDB4QjAsMHgwMSwweEU4LDB4QUMsMHgzQywweEU4LDB4QjMsMHgwMCwweEU4LDB4RjYsMHhGNSwweEU4LDB4MDgsMHhGOCwweEU4LAorMHgwRiwweEY5LDB4RTgsMHg4NSwweEZBLDB4RTgsMHhCNiwweEZBLDB4RTgsMHhFRiwweEZDLDB4RTgsMHhDMiwweDEwLDB4RTgsMHgwMywKKzB4M0MsMHhFOCwweEIyLDB4RkQsMHhFOCwweDMwLDB4RkQsMHhFOCwweDU0LDB4MDIsMHhDNiwweDA2LDB4OEYsMHgxMiwweEMwLDB4RTgsCisweEJCLDB4RkEsMHhFOCwweEVCLDB4RkEsMHhFOCwweEU5LDB4RkIsMHhFOCwweEFGLDB4RkMsMHhFOCwweDhELDB4RkMsMHhFOCwweDFGLAorMHhGRiwweEU4LDB4NTgsMHhGRiwweEU4LDB4REIsMHhGRCwweEU4LDB4MTYsMHhGRSwweDMzLDB4QzAsMHhCRSwweDVBLDB4MDUsMHhFOCwKKzB4OEEsMHgzQywweEU4LDB4QTMsMHhGRSwweEU4LDB4RTAsMHhGQywweEZCLDB4QkUsMHhBNCwweDQ0LDB4RTgsMHg3RCwweDNDLDB4RTksCisweENBLDB4MkQsMHg1NiwweDk4LDB4OEIsMHhGMCwweDhCLDB4NDIsMHg1MiwweDg1LDB4QzAsMHg3NSwweDI3LDB4QzcsMHg0MiwweDUyLAorMHgwMSwweDAwLDB4NTMsMHgzNiwweDhCLDB4OUMsMHgyQywweDAxLDB4RjYsMHhDMywweDAxLDB4NzUsMHgwQywweDM2LDB4ODksMHg2OCwKKzB4NTIsMHgzNiwweDg5LDB4QUMsMHgyQywweDAxLDB4NUIsMHg1RSwweEMzLDB4MzYsMHg4OSwweEFDLDB4MkMsMHgwMSwweDM2LDB4ODksCisweEFDLDB4MUMsMHgwMSwweDVCLDB4NUUsMHhDMywweDU2LDB4OTgsMHg4QiwweEYwLDB4MzMsMHhFRCwweDM2LDB4OEIsMHg4NCwweDFDLAorMHgwMSwweEE4LDB4MDEsMHg3NSwweDE1LDB4OEIsMHhFOCwweDMzLDB4QzAsMHg4NywweDQyLDB4NTIsMHgzNiwweDg5LDB4ODQsMHgxQywKKzB4MDEsMHhBOCwweDAxLDB4NzQsMHgwNSwweDM2LDB4ODksMHg4NCwweDJDLDB4MDEsMHg1RSwweEMzLDB4NTYsMHg1MSwweDMzLDB4RjYsCisweEI4LDB4MDEsMHgwMCwweEI5LDB4MDgsMHgwMCwweDg5LDB4ODQsMHgxQywweDAxLDB4ODksMHg4NCwweDJDLDB4MDEsMHg0NiwweDQ2LAorMHhFMiwweEY0LDB4NTksMHg1RSwweEMzLDB4OTAsMHhCQiwweDAxLDB4MDAsMHg4QiwweEU4LDB4RkYsMHg0RSwweDZFLDB4NzQsMHgwQSwKKzB4OEIsMHhERCwweDhCLDB4NDYsMHg1OCwweEE4LDB4MDEsMHg3NCwweEYwLDB4QzMsMHg4QiwweDQ2LDB4NDgsMHhBOSwweDA4LDB4MDAsCisweDc0LDB4NDUsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsMHgyNywweEU4LDB4NUMsMHgxMCwweDgwLDB4QzIsMHgwNiwweDhBLAorMHg4NiwweEE4LDB4MDAsMHgyNCwweEJGLDB4ODgsMHg4NiwweEE4LDB4MDAsMHhFRSwweDYwLDB4QjAsMHhGRSwweEU4LDB4ODYsMHgzMiwKKzB4NjEsMHhCMCwweDAyLDB4RTgsMHg0QywweEZGLDB4OEIsMHg0NiwweDQ4LDB4MjQsMHhGNywweDg5LDB4NDYsMHg0OCwweEVCLDB4MTcsCisweEU4LDB4MkEsMHgxMCwweDgxLDB4NEUsMHgyNiwweDAwLDB4NDAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwweDg2LAorMHhBNSwweDAwLDB4RTYsMHgwQywweDhCLDB4NDYsMHg0OCwweEE5LDB4MDQsMHgwMCwweDc0LDB4MTQsMHhCMCwweDAyLDB4RTgsMHgyMSwKKzB4RkYsMHg4QiwweDQ2LDB4NDgsMHgyNCwweEZCLDB4ODksMHg0NiwweDQ4LDB4NjAsMHhCMCwweERGLDB4RTgsMHg0NywweDMyLDB4NjEsCisweDMzLDB4QzAsMHg4NywweDQ2LDB4NTgsMHhGNiwweEMzLDB4MDEsMHg3NSwweDBCLDB4MzYsMHg4OSwweDQ3LDB4NTgsMHhBOCwweDAxLAorMHg3NSwweDBELDB4RTksMHg3NCwweEZGLDB4QTMsMHgyMiwweDAxLDB4QTgsMHgwMSwweDc1LDB4MDMsMHhFOSwweDZBLDB4RkYsMHg4OSwKKzB4MUUsMHgzMiwweDAxLDB4QzMsMHhCQiwweDAxLDB4MDAsMHg4QiwweEU4LDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc0LDB4MTUsCisweEU4LDB4RDUsMHgwRiwweDgwLDB4QzIsMHgwQSwweEVDLDB4QTgsMHg0MCwweDc1LDB4MEEsMHg4QiwweERELDB4OEIsMHg0NiwweDU2LAorMHhBOCwweDAxLDB4NzQsMHhFMywweEMzLDB4OEIsMHg0NiwweDI2LDB4ODAsMHhFNCwweEZFLDB4ODAsMHhDQywweDAyLDB4ODksMHg0NiwKKzB4MjYsMHhCMCwweDAyLDB4RTgsMHhCQywweEZFLDB4MzMsMHhDMCwweDg3LDB4NDYsMHg1NiwweEY2LDB4QzMsMHgwMSwweDc1LDB4MEEsCisweDM2LDB4ODksMHg0NywweDU2LDB4QTgsMHgwMSwweDc1LDB4MEIsMHhFQiwweEJELDB4QTMsMHgyMCwweDAxLDB4QTgsMHgwMSwweDc1LAorMHgwMiwweEVCLDB4QjQsMHg4OSwweDFFLDB4MzAsMHgwMSwweEMzLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMCwKKzB4OTAsMHgxMiwweDg0LDB4QzAsMHg3NSwweDQ5LDB4QTEsMHgyMiwweDAxLDB4QTgsMHgwMSwweDc1LDB4MDMsMHhFOCwweEY2LDB4RkUsCisweEExLDB4MjAsMHgwMSwweEE4LDB4MDEsMHg3NSwweDAzLDB4RTgsMHg4QSwweEZGLDB4QTEsMHhBQywweDEzLDB4NDgsMHg3OCwweDA1LAorMHg3NCwweDQ1LDB4QTMsMHhBQywweDEzLDB4QTEsMHhBRSwweDEzLDB4NDgsMHg3OCwweDA1LDB4NzQsMHg1MSwweEEzLDB4QUUsMHgxMywKKzB4QTEsMHhCMCwweDEzLDB4NDgsMHg3OCwweDA1LDB4NzQsMHg2MywweEEzLDB4QjAsMHgxMywweEExLDB4N0UsMHgxMiwweDQwLDB4NzgsCisweDAzLDB4QTMsMHg3RSwweDEyLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweEEwLAorMHg5MSwweDEyLDB4NDAsMHgzQywweDAyLDB4NzIsMHgwQiwweDMzLDB4QzAsMHhBMiwweDkxLDB4MTIsMHhGRiwweDE2LDB4N0MsMHgxMiwKKzB4RUIsMHhBNCwweEEyLDB4OTEsMHgxMiwweEVCLDB4OUYsMHhBMCwweDhFLDB4MTIsMHgzMiwweDA2LDB4OEYsMHgxMiwweEEyLDB4OEUsCisweDEyLDB4MEEsMHgwNiwweDFBLDB4MDEsMHhCQSwweDAwLDB4MDEsMHhFRSwweEI4LDB4MkMsMHgwMSwweEVCLDB4QTQsMHg4MywweDNFLAorMHg4NCwweDEyLDB4MTAsMHg3MiwweDExLDB4QkEsMHgyOCwweEZGLDB4RUQsMHgwQywweDgxLDB4RUYsMHhFOCwweDUzLDB4MzcsMHhCQSwKKzB4MjgsMHhGRiwweEVELDB4MjQsMHg3RSwweEVGLDB4QjgsMHgwNCwweDAwLDB4RUIsMHg5MiwweEM2LDB4MDYsMHg4RCwweDEyLDB4MDEsCisweEU4LDB4M0YsMHgzNywweEM2LDB4MDYsMHg4RCwweDEyLDB4MDAsMHhBMSwweEIyLDB4MTMsMHhFQiwweDhCLDB4OTAsMHg4QSwweDFFLAorMHgwQiwweDAxLDB4MkEsMHhGRiwweDZCLDB4QzMsMHgxOSwweEJBLDB4NjIsMHhGRiwweEVGLDB4QjgsMHgwQSwweDAwLDB4QkEsMHg2MCwKKzB4RkYsMHhFRiwweEI4LDB4MDEsMHhFMCwweEJBLDB4NjYsMHhGRiwweEVGLDB4QjgsMHhGRiwweEZGLDB4QkEsMHg1MiwweEZGLDB4RUYsCisweEI4LDB4MDksMHhDMCwweEJBLDB4NTYsMHhGRiwweEVGLDB4QzcsMHgwNiwweEFDLDB4MTMsMHgyQywweDAxLDB4QzcsMHgwNiwweEFFLAorMHgxMywweDA0LDB4MDAsMHhDNiwweDA2LDB4OTEsMHgxMiwweDAwLDB4QzMsMHg5MCwweDhBLDB4MUUsMHgwQiwweDAxLDB4MkEsMHhGRiwKKzB4NkIsMHhDMywweDA1LDB4RDEsMHhFOCwweEEzLDB4MTgsMHgwMSwweEMzLDB4OTAsMHg1MiwweEJBLDB4NTAsMHhGRiwweEVELDB4NUEsCisweEMzLDB4OTAsMHg1MywweDUxLDB4OEIsMHgxRSwweDE4LDB4MDEsMHhCOSwweDMyLDB4MDUsMHg5MCwweEUyLDB4RkUsMHg0QiwweDc1LAorMHhGNywweDU5LDB4NUIsMHhDMywweEIwLDB4ODAsMHhCQSwweDAwLDB4MDEsMHgwQSwweDA2LDB4MUEsMHgwMSwweEVFLDB4QzMsMHg5MCwKKzB4QjAsMHg0MCwweEVCLDB4RjIsMHhCMCwweEMwLDB4RUIsMHhFRSwweEIwLDB4MDAsMHhFQiwweEVBLDB4RkEsMHg2MCwweDA2LDB4MUUsCisweDE2LDB4MkIsMHhEQiwweDhFLDB4REIsMHgyRSwweEExLDB4QkEsMHg0QywweDJFLDB4QTMsMHg5MiwweDRDLDB4QTAsMHg5MywweDEyLAorMHg5OCwweDhCLDB4RTgsMHg4OSwweDI2LDB4MkQsMHg3QSwweDgwLDB4M0UsMHhDQSwweDEzLDB4MDAsMHg3NCwweDAzLDB4RTksMHg2QiwKKzB4NDIsMHhFOCwweEMwLDB4RkYsMHhFOCwweEFCLDB4RkYsMHhFOCwweEE4LDB4RkYsMHhCMCwweDIwLDB4QzYsMHgwNiwweDkwLDB4MTIsCisweDAwLDB4RkYsMHgxNiwweDdDLDB4MTIsMHg4QiwweEZELDB4ODMsMHhGRiwweDBBLDB4NzIsMHgxMSwweEU4LDB4QjksMHhGRiwweEU4LAorMHg5MCwweEZGLDB4RTgsMHhBQiwweEZGLDB4RTgsMHg4QSwweEZGLDB4ODMsMHhFRiwweDBBLDB4RUIsMHhFQSwweDBCLDB4RkYsMHg3NCwKKzB4MEYsMHhFOCwweEE0LDB4RkYsMHhFOCwweDdCLDB4RkYsMHhFOCwweDlBLDB4RkYsMHhFOCwweDc1LDB4RkYsMHg0RiwweDc1LDB4RjEsCisweEU4LDB4OTUsMHhGRiwweEU4LDB4NkMsMHhGRiwweEVCLDB4QjksMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkQsMHhFRSwweDg4LAorMHg4NiwweEE1LDB4MDAsMHhDMywweDhBLDB4ODYsMHhBNiwweDAwLDB4MEMsMHgwMiwweEVFLDB4QzMsMHg4QiwweDc2LDB4MzgsMHhGNywKKzB4QzYsMHgwMSwweDAwLDB4NzQsMHhFRiwweDhCLDB4NEUsMHgzNiwweDhCLDB4NDYsMHgyRSwweDNCLDB4QzEsMHg3MywweDAyLDB4OEIsCisweEM4LDB4MkIsMHhDMSwweDg5LDB4NDYsMHgyRSwweDAxLDB4NEUsMHgzNCwweEM0LDB4N0UsMHgwNCwweDI2LDB4MDEsMHgwRCwweDhCLAorMHg3RSwweDJDLDB4ODMsMHhFQSwweDA0LDB4RjMsMHg2QywweDhFLDB4QzEsMHg4OSwweDdFLDB4MkMsMHgzQiwweDQ2LDB4M0MsMHg3MiwKKzB4MTIsMHhGNywweEM2LDB4MjAsMHgwMCwweDc1LDB4MEIsMHg4MywweENFLDB4MjAsMHg4OSwweDc2LDB4MzgsMHhCMCwweDAwLDB4RTgsCisweEEwLDB4RkMsMHhDMywweEY3LDB4QzYsMHgwNCwweDAwLDB4NzQsMHgxQiwweDhCLDB4RDgsMHg4MywweENFLDB4MTAsMHg4OSwweDc2LAorMHgzOCwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRSwweDg4LDB4ODYsMHhBNywweDAwLDB4ODMsMHhDMiwweDA4LDB4RUUsMHg4MywKKzB4RUEsMHgwOCwweDhCLDB4QzMsMHgzRCwweDQwLDB4MDAsMHg3MiwweDAxLDB4QzMsMHg4MSwweDRFLDB4MzgsMHgwMCwweDA0LDB4ODMsCisweEMyLDB4MDIsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkEsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4QzMsMHg4QSwweDg2LAorMHhBNiwweDAwLDB4MEMsMHgwMiwweEVFLDB4QzMsMHhGNywweDQ2LDB4MzgsMHgwMSwweDAwLDB4NzQsMHhGMSwweDhCLDB4NEUsMHgyRSwKKzB4MzIsMHhEQiwweDhBLDB4QkUsMHhBMywweDAwLDB4ODMsMHhDMiwweDA2LDB4QzQsMHg3NiwweDA0LDB4OEIsMHg3RSwweDJDLDB4ODMsCisweEY5LDB4MDgsMHg3MiwweDJDLDB4RUMsMHhBOCwweDAxLDB4NzQsMHgxNiwweDhBLDB4RTAsMHg4MywweEVBLDB4MEEsMHhFQywweDgzLAorMHhDMiwweDBBLDB4ODQsMHhFNywweDc1LDB4NTEsMHhBQSwweEZFLDB4QzMsMHg0OSwweDgzLDB4RjksMHgwOCwweDczLDB4RTUsMHgzMiwKKzB4RkYsMHgyNiwweDAxLDB4MUMsMHgwMSwweDVFLDB4MzQsMHg4OSwweDc2LDB4MDQsMHg4OSwweDRFLDB4MkUsMHg4OSwweDdFLDB4MkMsCisweDNCLDB4NEUsMHgzQywweDcyLDB4MTEsMHhGNiwweDQ2LDB4MzgsMHgyMCwweDc0LDB4MDEsMHhDMywweDgzLDB4NEUsMHgzOCwweDIwLAorMHhCMCwweDAwLDB4RTgsMHhGRCwweEZCLDB4QzMsMHhGNiwweDQ2LDB4MzgsMHgwNCwweDc0LDB4MTUsMHg4MywweDRFLDB4MzgsMHgxMCwKKzB4OEEsMHg4NiwweEE3LDB4MDAsMHgyNCwweEZFLDB4ODgsMHg4NiwweEE3LDB4MDAsMHg4MywweEVBLDB4MDIsMHhFRSwweDgzLDB4QzIsCisweDAyLDB4M0QsMHg0MCwweDAwLDB4NzIsMHg1RCwweEMzLDB4MzIsMHhGRiwweDI2LDB4MDMsMHgxQywweDg1LDB4REIsMHg3NCwweDA5LAorMHgyNiwweDg5LDB4MUMsMHg4QiwweEY3LDB4NDcsMHg0NywweDQ5LDB4NDksMHg4MCwweEU0LDB4MUUsMHg4MCwweENDLDB4QzAsMHgyNiwKKzB4ODksMHgwNCwweEY2LDB4QzQsMHgxMCwweDc0LDB4MjcsMHg4QiwweDc2LDB4MzgsMHhGNywweEM2LDB4MDAsMHgxMCwweDc0LDB4MEIsCisweDUwLDB4RkUsMHg4NiwweEIyLDB4MDAsMHhCMCwweDBBLDB4RTgsMHhBOCwweEZCLDB4NTgsMHhGNywweEM2LDB4MDAsMHgwMSwweDc0LAorMHgwRCwweEU4LDB4ODIsMHgyNiwweDhCLDB4NzYsMHgzOCwweDhCLDB4NEUsMHgyRSwweDhCLDB4N0UsMHgwNCwweEFCLDB4OEIsMHhGNywKKzB4MzMsMHhDMCwweEFCLDB4MzIsMHhEQiwweDhBLDB4QkUsMHhBMywweDAwLDB4NDksMHg0OSwweDgzLDB4RjksMHgwOCwweDcyLDB4MTcsCisweEU5LDB4NDEsMHhGRiwweDgxLDB4NEUsMHgzOCwweDAwLDB4MDQsMHg4MywweEMyLDB4RjgsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LAorMHhGQSwweDg4LDB4ODYsMHhBNSwweDAwLDB4RUUsMHhDMywweEU5LDB4NDUsMHhGRiwweDgzLDB4QzIsMHgwOCwweEVDLDB4ODgsMHg4NiwKKzB4QUEsMHgwMCwweEMwLDB4RTgsMHgwNCwweDhBLDB4RTAsMHg4QSwweEM4LDB4ODYsMHg4NiwweEE5LDB4MDAsMHgzMiwweEUwLDB4OEIsCisweDVFLDB4M0UsMHg4NCwweEUzLDB4NzQsMHg0RiwweDhBLDB4QzEsMHg4QiwweDRFLDB4MjYsMHhGNiwweEM1LDB4MDQsMHg3NCwweDBDLAorMHhBOCwweDA4LDB4NzQsMHgwNSwweDgwLDB4RTEsMHhCRiwweEVCLDB4MDMsMHg4MCwweEM5LDB4NDAsMHhGNiwweEM1LDB4MDgsMHg3NCwKKzB4MEMsMHhBOCwweDAyLDB4NzQsMHgwNSwweDgwLDB4RTEsMHg3RiwweEVCLDB4MDMsMHg4MCwweEM5LDB4ODAsMHg4OCwweDRFLDB4MjYsCisweDhCLDB4RjAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDg0LDB4QzksMHg3NCwweDA4LDB4QTgsMHgwMiwweDc0LDB4MTUsMHgyNCwweEZELAorMHhFQiwweDA2LDB4QTgsMHgwMiwweDc1LDB4MEQsMHgwQywweDAyLDB4ODgsMHg4NiwweEE1LDB4MDAsMHg4MywweEVBLDB4MEEsMHhFRSwKKzB4ODMsMHhDMiwweDBBLDB4OEIsMHhDNiwweDg0LDB4RTcsMHg3NSwweDAxLDB4QzMsMHhDNiwweDg2LDB4QkEsMHgwMCwweDAxLDB4QjAsCisweDBFLDB4RTgsMHhFRSwweEZBLDB4RjcsMHg0NiwweDM4LDB4MDAsMHgwMiwweDc0LDB4RUUsMHg4MywweDdFLDB4MkUsMHgwNiwweDcyLAorMHhFOCwweDhBLDB4QTYsMHhBQSwweDAwLDB4QzQsMHg1RSwweDA0LDB4OEIsMHg3RSwweDJDLDB4QjAsMHhGRiwweEFBLDB4QjAsMHgwMiwKKzB4QUIsMHgyNiwweDgzLDB4MDcsMHgwMywweDgzLDB4NkUsMHgyRSwweDAzLDB4ODksMHg3RSwweDJDLDB4RjYsMHg0NiwweDM4LDB4MjAsCisweDc0LDB4MDEsMHhDMywweDgzLDB4NEUsMHgzOCwweDIwLDB4QjAsMHgwMCwweEU4LDB4QjYsMHhGQSwweEMzLDB4OTAsMHg4MywweEVBLAorMHgwOCwweEU5LDB4QjQsMHhGRCwweDgzLDB4QzIsMHgwNiwweDhCLDB4NUUsMHgyNiwweEY2LDB4QzMsMHhDMCwweDc1LDB4RUYsMHg4QiwKKzB4NEUsMHgxQywweEVDLDB4ODgsMHg4NiwweEE0LDB4MDAsMHg4MywweEVBLDB4MEEsMHhBOCwweDIwLDB4NzUsMHgwMiwweDhBLDB4Q0QsCisweDMyLDB4RUQsMHg4QiwweDQ2LDB4MUEsMHgzQiwweEM4LDB4NzMsMHgxOCwweDAxLDB4NEUsMHgyQSwweDJCLDB4QzEsMHg4OSwweDQ2LAorMHgxQSwweEM1LDB4NzYsMHgwMCwweEYzLDB4NkUsMHg4RSwweEQ5LDB4ODksMHg3NiwweDAwLDB4M0QsMHgyMCwweDAwLDB4NzIsMHgzMCwKKzB4QzMsMHg4NSwweEMwLDB4NzQsMHgzMSwweDhCLDB4QzgsMHgwMSwweDQ2LDB4MkEsMHhDNSwweDc2LDB4MDAsMHhGMywweDZFLDB4OEUsCisweEQ5LDB4ODAsMHhDQiwweDAyLDB4ODksMHg1RSwweDI2LDB4RTgsMHgzMiwweEYxLDB4RjYsMHhDNywweDAxLDB4NzUsMHgxNiwweDgzLAorMHhDMiwweDAyLDB4RTgsMHg1MywweEZELDB4RjYsMHhDNywweDEwLDB4NzUsMHgwQiwweEIwLDB4MDIsMHhFOCwweDQzLDB4RkEsMHhDMywKKzB4RjYsMHhDNywweDAxLDB4NzQsMHhGMCwweEMzLDB4ODAsMHhDQiwweDAyLDB4ODksMHg1RSwweDI2LDB4RjYsMHhDNywweDAxLDB4NzQsCisweERFLDB4ODMsMHhDMiwweDAyLDB4RTgsMHgzMSwweEZELDB4RjYsMHg4NiwweEE0LDB4MDAsMHg0MCwweDc0LDB4MEIsMHg4MCwweEU3LAorMHhGRSwweDgwLDB4Q0YsMHgwMiwweDg5LDB4NUUsMHgyNiwweEVCLDB4Q0MsMHhCMCwweDA0LDB4RTgsMHgxNCwweEZBLDB4QzMsMHhDMCwKKzB4QzIsMHhDOCwweENBLDB4QzQsMHhDNiwweENDLDB4Q0UsMHhEMCwweEQyLDB4RDgsMHhEQSwweEQ0LDB4RDYsMHhEQywweERFLDB4OTAsCisweEU5LDB4MEUsMHgwMSwweEU0LDB4QzQsMHg4QSwweEUwLDB4RTQsMHhDNCwweDhCLDB4RDAsMHg4MywweEY5LDB4MDgsMHg3MiwweEYwLAorMHgyNiwweDgzLDB4M0YsMHgwMCwweDc0LDB4MDQsMHg4QiwweERGLDB4NDksMHg0OSwweDhCLDB4RkIsMHg4QSwweERFLDB4ODMsMHhFMywKKzB4MEYsMHgyRSwweDhBLDB4QTcsMHgyRiwweDE2LDB4QUIsMHhGNiwweEM0LDB4MTAsMHg3NCwweDI0LDB4RjcsMHhDNiwweDAwLDB4MTAsCisweDc0LDB4MEIsMHg1MCwweEZFLDB4ODYsMHhCMiwweDAwLDB4QjAsMHgwQSwweEU4LDB4QzYsMHhGOSwweDU4LDB4RjcsMHhDNiwweDAwLAorMHgwMSwweDc0LDB4MEQsMHhFOCwweEEwLDB4MjQsMHg4QiwweDc2LDB4MzgsMHg4QiwweDRFLDB4MkUsMHg4QiwweDdFLDB4MDQsMHhBQiwKKzB4ODksMHg3RSwweDA0LDB4MzMsMHhDMCwweEFCLDB4NDksMHg0OSwweDg5LDB4NEUsMHgyRSwweDg5LDB4N0UsMHgyQywweDhCLDB4QzEsCisweEVCLDB4NEUsMHg5MCwweEVCLDB4OUUsMHg5MCwweEU0LDB4RDYsMHg4NCwweEMwLDB4NzksMHg2MywweEU2LDB4RDAsMHg4QSwweEM4LAorMHgyNSwweDAzLDB4MDAsMHgwMywweEQ4LDB4RDEsMHhFMywweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHg4OCwweDhFLDB4QUUsMHgwMCwKKzB4OEIsMHg0RSwweDJFLDB4QzQsMHg1RSwweDA0LDB4OEIsMHg3RSwweDJDLDB4OEIsMHg3NiwweDM4LDB4RTQsMHg4NiwweDI0LDB4MDcsCisweDNDLDB4MDMsMHg3NSwweENGLDB4RTQsMHgxQywweDkxLDB4M0IsMHhDMSwweDczLDB4MDIsMHg4QiwweEM4LDB4MkIsMHhDMSwweDg5LAorMHg0NiwweDJFLDB4MDEsMHg0RSwweDM0LDB4MjYsMHgwMSwweDBGLDB4QkEsMHhDNCwweDAwLDB4RjMsMHg2QywweDg5LDB4N0UsMHgyQywKKzB4M0IsMHg0NiwweDNDLDB4NzIsMHgxQywweEY3LDB4QzYsMHgyMCwweDAwLDB4NzUsMHgwQiwweDgzLDB4Q0UsMHgyMCwweDg5LDB4NzYsCisweDM4LDB4QjAsMHgwMCwweEU4LDB4M0MsMHhGOSwweDhBLDB4ODYsMHhBRSwweDAwLDB4MjQsMHgzRiwweEU2LDB4RDYsMHhDMywweEY5LAorMHhDMywweEY3LDB4QzYsMHgwQSwweDAwLDB4NzQsMHgzNSwweEY3LDB4QzYsMHgxMCwweDAwLDB4NzUsMHgyRiwweDgzLDB4Q0UsMHgxMCwKKzB4ODksMHg3NiwweDM4LDB4RjcsMHhDNiwweDAyLDB4MDAsMHg3NCwweDBFLDB4NTAsMHhFNCwweEQ4LDB4MjQsMHhGRSwweEU2LDB4RDgsCisweDU4LDB4RjcsMHhDNiwweDA4LDB4MDAsMHg3NCwweDE1LDB4NTAsMHg1MSwweEI5LDB4RTgsMHgwMywweEU0LDB4MEEsMHg4NCwweEMwLAorMHhFMCwweEZBLDB4ODQsMHhDMCwweDc1LDB4MDQsMHhCMCwweDI0LDB4RTYsMHgwQSwweDU5LDB4NTgsMHgzRCwweDQwLDB4MDAsMHg3MywKKzB4QjUsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RUYsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4MSwweENFLDB4MTAsCisweDA0LDB4ODksMHg3NiwweDM4LDB4RUIsMHhBMCwweDAwLDB4MDgsMHgwNCwweDBDLDB4MDEsMHgwOSwweDA1LDB4MEQsMHgwMiwweDBBLAorMHgwNiwweDBFLDB4MDMsMHgwQiwweDA3LDB4MEYsMHgwMCwweDQwLDB4ODAsMHhDMCwweDIwLDB4NjAsMHhBMCwweEUwLDB4MTAsMHg1MCwKKzB4OTAsMHhEMCwweDMwLDB4NzAsMHhCMCwweEYwLDB4RTQsMHhEMiwweEU2LDB4RDAsMHg4QSwweEM4LDB4MjUsMHgwMywweDAwLDB4MDMsCisweEQ4LDB4RDEsMHhFMywweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHg4OCwweDhFLDB4QUUsMHgwMCwweEU0LDB4RDgsMHhDMCwweEU4LAorMHgwNCwweDhCLDB4RDgsMHgyRSwweDhBLDB4ODcsMHg2NiwweDE3LDB4OEEsMHhFMCwweDhBLDB4QzgsMHg4NiwweDg2LDB4QTksMHgwMCwKKzB4MzIsMHhFMCwweEU0LDB4OTgsMHg4QiwweDVFLDB4M0UsMHg4NCwweEUzLDB4NzQsMHg1NCwweDhBLDB4QzEsMHg4QiwweDRFLDB4MjYsCisweEY2LDB4QzUsMHgwNCwweDc0LDB4MEMsMHhBOCwweDA4LDB4NzQsMHgwNSwweDgwLDB4RTEsMHhCRiwweEVCLDB4MDMsMHg4MCwweEM5LAorMHg0MCwweEY2LDB4QzUsMHgwOCwweDc0LDB4MEMsMHhBOCwweDAyLDB4NzQsMHgwNSwweDgwLDB4RTEsMHg3RiwweEVCLDB4MDMsMHg4MCwKKzB4QzksMHg4MCwweDg4LDB4NEUsMHgyNiwweDhCLDB4RjAsMHg4QSwweDg2LDB4QTUsMHgwMCwweEY2LDB4QzEsMHhGRCwweDc0LDB4MDgsCisweEE4LDB4MDYsMHg3NCwweDE5LDB4MjQsMHhGOSwweEVCLDB4MEYsMHhBOCwweDA2LDB4NzUsMHgxMSwweEY2LDB4QzUsMHgwMSwweDc1LAorMHgwNCwweDBDLDB4MDQsMHhFQiwweDAyLDB4MEMsMHgwMiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweDhCLDB4QzYsMHg4NCwKKzB4RTcsMHg3NSwweDA5LDB4OEEsMHg4NiwweEFFLDB4MDAsMHgyNCwweDNGLDB4RTYsMHhEMiwweEMzLDB4QzYsMHg4NiwweEJBLDB4MDAsCisweDAxLDB4QjAsMHgwRSwweEU4LDB4MUMsMHhGOCwweEY3LDB4NDYsMHgzOCwweDAwLDB4MDIsMHg3NCwweEU2LDB4ODMsMHg3RSwweDJFLAorMHgwNiwweDcyLDB4RTAsMHg4QSwweDg2LDB4QTksMHgwMCwweDhBLDB4RTAsMHg4NiwweDg2LDB4QUEsMHgwMCwweDhBLDB4QzgsMHgzMiwKKzB4QzQsMHg4MCwweEM5LDB4MEIsMHgyMiwweEMxLDB4QzAsMHhFNCwweDA0LDB4MEEsMHhFMCwweEM0LDB4NUUsMHgwNCwweDhCLDB4N0UsCisweDJDLDB4QjAsMHhGRiwweEFBLDB4QjAsMHgwMiwweEFCLDB4MjYsMHg4MywweDA3LDB4MDMsMHg4MywweDZFLDB4MkUsMHgwMywweDg5LAorMHg3RSwweDJDLDB4RjYsMHg0NiwweDM4LDB4MjAsMHg3NSwweEFCLDB4ODMsMHg0RSwweDM4LDB4MjAsMHhCMCwweDAwLDB4RTgsMHhEMSwKKzB4RjcsMHhFQiwweEEwLDB4OTAsMHhFNCwweDEyLDB4MjQsMHhERiwweEU2LDB4MTIsMHg4MSwweEUzLDB4RkUsMHg5RiwweDg5LDB4NUUsCisweDI2LDB4ODMsMHg2NiwweDQ4LDB4RjcsMHhFQiwweDczLDB4OTAsMHhGNiwweEM3LDB4MjAsMHg3NSwweEU3LDB4RTQsMHgxMiwweDBDLAorMHgyMCwweEU2LDB4MTIsMHgzMiwweEMwLDB4RTYsMHhDNiwweEIwLDB4ODMsMHhFNiwweEM2LDB4ODAsMHhDRiwweDIwLDB4ODksMHg1RSwKKzB4MjYsMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhFQiwweDc0LDB4OTAsCisweEY2LDB4QzcsMHg0MCwweDc1LDB4RDMsMHhFNCwweDEyLDB4MEMsMHgyMCwweEU2LDB4MTIsMHgzMiwweEMwLDB4RTYsMHhDNiwweEIwLAorMHg4MSwweEU2LDB4QzYsMHg4MCwweEU3LDB4REYsMHg4MCwweENCLDB4MDEsMHg4OSwweDVFLDB4MjYsMHhCMCwweDA2LDB4RTgsMHg3MSwKKzB4RjcsMHg5MCwweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGOSwweEU2LDB4MEMsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVCLDB4NDMsCisweEU0LDB4RDQsMHhFNiwweEQwLDB4OEIsMHhGOCwweDI1LDB4MDMsMHgwMCwweDAzLDB4RDgsMHhEMSwweEUzLDB4MkUsMHg4QiwweEFGLAorMHg0NCwweDAwLDB4OEIsMHg1RSwweDI2LDB4RjYsMHhDNywweDYwLDB4NzUsMHhCNiwweEY2LDB4QzMsMHhDMCwweDc1LDB4RDMsMHhCQSwKKzB4QzYsMHgwMCwweDhCLDB4NEUsMHgxQywweDhCLDB4NDYsMHgxQSwweDNCLDB4QzgsMHg3MywweDFFLDB4MDEsMHg0RSwweDJBLDB4MkIsCisweEMxLDB4ODksMHg0NiwweDFBLDB4QzUsMHg3NiwweDAwLDB4RjMsMHg2RSwweDhFLDB4RDksMHg4OSwweDc2LDB4MDAsMHgzRCwweDIwLAorMHgwMCwweDcyLDB4M0QsMHg4QiwweEM3LDB4MjQsMHgzRiwweEU2LDB4RDQsMHhDMywweDg1LDB4QzAsMHg3NCwweDM5LDB4OEIsMHhDOCwKKzB4MDEsMHg0NiwweDJBLDB4QzUsMHg3NiwweDAwLDB4RjMsMHg2RSwweDhFLDB4RDksMHg4MywweENCLDB4MDIsMHg4OSwweDVFLDB4MjYsCisweEU4LDB4RDksMHhFRCwweEY2LDB4QzcsMHgwMSwweDc1LDB4MzksMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RjksMHhFNiwweDBDLAorMHg4OCwweDg2LDB4QTUsMHgwMCwweEY2LDB4QzcsMHgxMCwweDc1LDB4Q0EsMHhCMCwweDAyLDB4RTgsMHhFNCwweEY2LDB4RUIsMHhDMywKKzB4RjYsMHhDNywweDAxLDB4NzQsMHhFRiwweEVCLDB4QkMsMHhGNiwweEM3LDB4MDEsMHg3NCwweERDLDB4OEEsMHg4NiwweEE1LDB4MDAsCisweEE4LDB4MDIsMHg3NCwweDExLDB4ODEsMHhFMywweEZGLDB4RkUsMHg4MSwweENCLDB4MDAsMHgwMiwweDg5LDB4NUUsMHgyNiwweEVCLAorMHhDNywweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGQiwweDBDLDB4MDIsMHhFNiwweDBDLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFQiwKKzB4OTIsMHg5MCwweEZELDB4RjcsMHhERiwweDdGLDB4RkUsMHhGQiwweEVGLDB4QkYsMHgwMCwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwMSwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDAyLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDAxLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDAzLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDAxLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDIsMHgwNCwweDAwLDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDEsMHgwNCwweDAwLDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA3LDB4MDQsMHgwNywweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA3LDB4MDQsMHgwNywweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MzMsMHhEQiwweDhBLDB4RDgsMHg4QSwweDg3LAorMHg2QywweDEyLDB4RTYsMHhGRSwweEMxLDB4RTMsMHgwMiwweEU0LDB4Q0UsMHhBOCwweDA0LDB4NzUsMHgwOSwweEE4LDB4MDIsMHg3NCwKKzB4MDMsMHhFOSwweDJDLDB4RkUsMHhGOSwweEMzLDB4NTAsMHg1MywweEU4LDB4Q0IsMHhGQywweDVCLDB4NTgsMHhBOCwweDAyLDB4NzQsCisweDAzLDB4RTksMHgxQywweEZFLDB4RjgsMHhDMywweDMzLDB4REIsMHg4QSwweEQ4LDB4OEEsMHg4NywweDZDLDB4MTIsMHhFNiwweEZFLAorMHhDMSwweEUzLDB4MDIsMHhFOSwweEQwLDB4RkIsMHg5QSwweDFBLDB4QzYsMHgxQSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEEsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwQywweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBBLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEUsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwQSwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBDLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEEsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHhDMywweDkwLDB4REEsMHgxNCwweDk0LDB4MTUsCisweDVDLDB4MTMsMHhFNiwweDEzLDB4REEsMHgxQiwweERBLDB4MUIsMHhFNiwweDEzLDB4REEsMHgxQiwweDhCLDB4OTQsMHg2NCwweDEyLAorMHhDMSwweEU2LDB4MDQsMHhBOCwweDAxLDB4NzQsMHgzNSwweDUwLDB4MzMsMHhDMCwweDhBLDB4QzIsMHhFNiwweEZFLDB4RTQsMHhBMCwKKzB4ODUsMHhDMCwweDc0LDB4MjcsMHg4QiwweEQ4LDB4MkUsMHg4QSwweDlGLDB4REEsMHgxQSwweDUyLDB4NTYsMHgyRSwweDhCLDB4QTgsCisweDQ0LDB4MDAsMHg4QiwweDU2LDB4MjgsMHhFQywweEE4LDB4MDEsMHg3NSwweDBELDB4ODgsMHg4NiwweEFELDB4MDAsMHgyNCwweDBFLAorMHg4QSwweEQ4LDB4MkUsMHhGRiwweDk3LDB4REMsMHgxQiwweDVFLDB4NUEsMHhFQiwweENELDB4NTgsMHhBOCwweDAyLDB4NzQsMHgzNiwKKzB4ODMsMHhDNiwweDEwLDB4MzMsMHhDMCwweDhBLDB4QzYsMHhFNiwweEZFLDB4RTQsMHhBMCwweDg1LDB4QzAsMHg3NCwweDI3LDB4OEIsCisweEQ4LDB4MkUsMHg4QSwweDlGLDB4REEsMHgxQSwweDUyLDB4NTYsMHgyRSwweDhCLDB4QTgsMHg0NCwweDAwLDB4OEIsMHg1NiwweDI4LAorMHhFQywweEE4LDB4MDEsMHg3NSwweDBELDB4ODgsMHg4NiwweEFELDB4MDAsMHgyNCwweDBFLDB4OEEsMHhEOCwweDJFLDB4RkYsMHg5NywKKzB4REMsMHgxQiwweDVFLDB4NUEsMHhFQiwweENELDB4QzMsMHg5MCwweDMyLDB4RTQsMHg4QiwweEQ4LDB4OEIsMHhEMCwweDJFLDB4OEEsCisweDlGLDB4OUEsMHgxOSwweDJFLDB4MjIsMHg5NywweDkyLDB4MTksMHg1NiwweDUyLDB4OEEsMHhDMywweDI0LDB4MDMsMHgwMywweEM2LAorMHg4MCwweEUzLDB4MDQsMHhEMCwweEVCLDB4MkUsMHhGRiwweDk3LDB4RDYsMHgxQSwweDU4LDB4NUUsMHhBOSwweDU1LDB4MDAsMHg3NSwKKzB4RDksMHhDMywweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsCisweDIyLDB4QzQsMHg3NCwweDA4LDB4MzMsMHhGNiwweEU4LDB4QkYsMHhGRiwweEVCLDB4RUUsMHg5MCwweEU0LDB4MDQsMHgwNywweEU0LAorMHgwNCwweDFGLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwKKzB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgwOCwweEJFLDB4MDQsCisweDAwLDB4RTgsMHg5NCwweEZGLDB4RUIsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLAorMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLDB4NUMsMHgxMiwKKzB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgxOCwweDMzLDB4RjYsMHhFOCwweDZCLDB4RkYsMHhBMSwweDYwLDB4MTIsCisweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4RTUsMHhCRSwweDA4LDB4MDAsMHhFOCwweDVBLDB4RkYsMHhFQiwweERELAorMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NSwweEVELDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwKKzB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDQsMHgxRiwweEU0LDB4MDQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsCisweEVGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVFLDB4MTIsMHhFNiwweEZFLAorMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4MTksMHhCRSwweDA0LDB4MDAsMHhFOCwweDFDLDB4RkYsMHhBMSwweDYyLDB4MTIsMHhFNiwKKzB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4RTQsMHhCRSwweDBDLDB4MDAsMHhFOCwweDBCLDB4RkYsMHhFQiwweERDLDB4QTEsCisweDYyLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NSwweEVELDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwweEExLAorMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDQsMHgxRiwweEU0LDB4MDQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwKKzB4NjEsMHhDRiwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsCisweDg0LDB4QzQsMHg3NCwweDA4LDB4MzMsMHhGNiwweEU4LDB4NTMsMHhGRSwweEVCLDB4RUUsMHg5MCwweEI4LDB4MDAsMHg4MCwweEJBLAorMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwKKzB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4MDgsMHhCRSwweDAyLDB4MDAsMHhFOCwweDJDLDB4RkUsCisweEVCLDB4RUQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLAorMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHgwOCwKKzB4QkUsMHgwNCwweDAwLDB4RTgsMHgwNiwweEZFLDB4RUIsMHhFRCwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4MDcsCisweDFGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDYyLDB4MTIsMHhFNiwweEZFLAorMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4MDgsMHhCRSwweDA2LDB4MDAsMHhFOCwweEUwLDB4RkQsMHhFQiwweEVELDB4QjgsMHgwMCwKKzB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsCisweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgxOCwweDMzLDB4RjYsMHhFOCwweDM3LAorMHhGRSwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4RTUsMHhCRSwweDA0LDB4MDAsMHhFOCwKKzB4QUEsMHhGRCwweEVCLDB4REQsMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NSwweEVELDB4QTEsCisweDVDLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwweDFGLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLAorMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1RSwweDEyLDB4RTYsMHhGRSwKKzB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NCwweDE5LDB4QkUsMHgwNCwweDAwLDB4RTgsMHhFQywweEZELDB4QTEsMHg2MiwweDEyLDB4RTYsCisweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweEU0LDB4QkUsMHgwNiwweDAwLDB4RTgsMHg1RiwweEZELDB4RUIsMHhEQywweEExLAorMHg2MiwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzUsMHhFRCwweEExLDB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwKKzB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4NjEsMHhDRiwweDYwLDB4MUUsCisweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVDLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweDE4LAorMHgzMywweEY2LDB4RTgsMHgyNywweEZELDB4QTEsMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHhFNSwKKzB4QkUsMHgwOCwweDAwLDB4RTgsMHg5MiwweEZELDB4RUIsMHhERCwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsCisweEM0LDB4NzUsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLAorMHg2MSwweENGLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVFLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwKKzB4ODQsMHhDNCwweDc0LDB4MTksMHhCRSwweDAyLDB4MDAsMHhFOCwweEUyLDB4RkMsMHhBMSwweDYyLDB4MTIsMHhFNiwweEZFLDB4RTQsCisweDAwLDB4MjIsMHhDNCwweDc0LDB4RTQsMHhCRSwweDBDLDB4MDAsMHhFOCwweDRELDB4RkQsMHhFQiwweERDLDB4QTEsMHg2MiwweDEyLAorMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NSwweEVELDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwweDFGLDB4QjgsMHgwMCwKKzB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsCisweDVDLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweDE4LDB4MzMsMHhGNiwweEU4LDB4OUQsMHhGQywweEExLAorMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHhFNSwweEJFLDB4MDQsMHgwMCwweEU4LDB4OEMsMHhGQywKKzB4RUIsMHhERCwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc1LDB4RUQsMHgwNywweDFGLDB4QjgsCisweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLAorMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHgxOSwweEJFLDB4MDIsMHgwMCwweEU4LDB4NUMsMHhGQywKKzB4QTEsMHg2MiwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHhFNCwweEJFLDB4MDYsMHgwMCwweEU4LDB4NEIsCisweEZDLDB4RUIsMHhEQywweEExLDB4NjIsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc1LDB4RUQsMHgwNywweDFGLAorMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwKKzB4RDgsMHg5MCwweDJBLDB4QzAsMHhFNiwweEZFLDB4RTQsMHhDRSwweEE4LDB4MDEsMHg3NCwweDE0LDB4MzMsMHhEQiwweEU4LDB4RDUsCisweEY2LDB4RUIsMHhFRiwweDkwLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLAorMHhGNiwweDA2LDB4MDUsMHgwMSwweDAxLDB4NzUsMHhFRCwweEIwLDB4MDEsMHhFNiwweEZFLDB4RTQsMHhDRSwweEE4LDB4MDEsMHg3NCwKKzB4RTMsMHhCQiwweDA0LDB4MDAsMHhFOCwweEFGLDB4RjYsMHhFQiwweEM5LDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsCisweEQ4LDB4OTAsMHhGQiwweDkwLDB4RkEsMHgyQSwweEMwLDB4RTYsMHhGRSwweEU0LDB4Q0UsMHhBOCwweDAyLDB4NzQsMHgxMywweDMzLAorMHhEQiwweEU4LDB4Q0MsMHhGOCwweEVCLDB4RUMsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwKKzB4Q0YsMHg5MCwweEE4LDB4MDQsMHg3NCwweEYwLDB4MzMsMHhEQiwweEU4LDB4NUIsMHhGNywweEVCLDB4RDUsMHg5MCwweDYwLDB4MUUsCisweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHg5MCwweEZCLDB4OTAsMHhGQSwweEIwLDB4MDEsMHhFNiwweEZFLDB4RTQsMHhDRSwweEE4LAorMHgwMiwweDc0LDB4MTUsMHhCQiwweDA0LDB4MDAsMHhFOCwweDk3LDB4RjgsMHhFQiwweEVCLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhCQSwKKzB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHg5MCwweEE4LDB4MDQsMHg3NCwweEYwLDB4QkIsMHgwNCwweDAwLDB4RTgsCisweDI0LDB4RjcsMHhFQiwweEQyLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgwOSwweDlDLDB4MEUsMHhFOCwweDZCLAorMHhGMiwweDkwLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgyOSwweDlDLDB4MEUsMHhFOCwweDVELDB4RjIsMHg5MCwKKzB4NzIsMHgyMCwweDcyLDB4MjAsMHg3MiwweDIwLDB4Q0UsMHgxRCwweDkyLDB4MUMsMHhFNiwweDFDLDB4MUEsMHgxRSwweDcyLDB4MjAsCisweDgyLDB4MUQsMHhBRSwweDFFLDB4MzgsMHgxRiwweDcyLDB4MjAsMHg4MiwweDFELDB4NzIsMHgyMCwweDcyLDB4MjAsMHgzOCwweDFGLAorMHg3MiwweDIwLDB4NzIsMHgyMCwweDcyLDB4MjAsMHhGNCwweDFELDB4QkMsMHgxQywweDM0LDB4MUQsMHg2NCwweDFFLDB4NzIsMHgyMCwKKzB4QTgsMHgxRCwweEYyLDB4MUUsMHg3OCwweDFGLDB4NzIsMHgyMCwweEE4LDB4MUQsMHg3MiwweDIwLDB4NzIsMHgyMCwweDc4LDB4MUYsCisweEZDLDB4QjksMHg0MCwweDAwLDB4OEMsMHhDQiwweEI4LDB4NjQsMHgyMCwweDJCLDB4RkYsMHhBQiwweDkzLDB4QUIsMHg5MywweEUyLAorMHhGQSwweEM3LDB4MDYsMHg0QywweDAwLDB4QTgsMHgxMSwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NSwweDIwLDB4QzcsMHgwNiwKKzB4M0MsMHgwMCwweDA4LDB4NEIsMHhDNywweDA2LDB4MzAsMHgwMCwweEJBLDB4MUYsMHhDNywweDA2LDB4MzQsMHgwMCwweEZBLDB4MUYsCisweEY2LDB4MDYsMHgwNSwweDAxLDB4MDEsMHg3NSwweDA2LDB4QzcsMHgwNiwweDM4LDB4MDAsMHgyRSwweDIwLDB4QzMsMHhDNywweDA2LAorMHgzQywweDAwLDB4NTYsMHg0QiwweDMzLDB4REIsMHg4QSwweDFFLDB4NTQsMHgxMiwweEMxLDB4RTMsMHgwMiwweDAyLDB4MUUsMHg1NiwKKzB4MTIsMHgyRSwweDhCLDB4ODcsMHg4MCwweDIwLDB4QTMsMHgzMCwweDAwLDB4OEEsMHgxRSwweDU1LDB4MTIsMHhDMSwweEUzLDB4MDIsCisweDAyLDB4MUUsMHg1NywweDEyLDB4MkUsMHg4QiwweDg3LDB4QTAsMHgyMCwweEEzLDB4MzQsMHgwMCwweEMzLDB4OEIsMHg4NiwweDlFLAorMHgwMCwweEU2LDB4RkUsMHg4NiwweEM0LDB4RTYsMHhEMCwweEMzLDB4OEIsMHg4NiwweDlFLDB4MDAsMHhFNiwweEZFLDB4MzMsMHhEMiwKKzB4OEEsMHhENCwweEMzLDB4NTEsMHhCOSwweDEwLDB4MjcsMHhFNCwweDBBLDB4OTAsMHg5MCwweDg0LDB4QzAsMHg3NCwweDA1LDB4RTIsCisweEY2LDB4NTksMHhGOSwweEMzLDB4NTksMHhGOCwweEMzLDB4ODQsMHhDMCwweDc4LDB4MUUsMHg1MSwweDhBLDB4RTgsMHg4QSwweEM4LAorMHhCOCwweDAxLDB4MDAsMHhEMywweEUwLDB4MDksMHg4NiwweDk4LDB4MDAsMHgzQSwweEFFLDB4QTAsMHgwMCwweDU5LDB4NzUsMHgxMCwKKzB4RTgsMHhBOSwweEU1LDB4ODMsMHg0RSwweDI2LDB4MDIsMHhGOSwweEMzLDB4OTgsMHg4OSwweDg2LDB4OTgsMHgwMCwweEVCLDB4RjAsCisweEY4LDB4QzMsMHg4NCwweEMwLDB4NzgsMHgxMiwweDUxLDB4OEEsMHhFMCwweDhBLDB4QzgsMHhCOCwweDAxLDB4MDAsMHhEMywweEUwLAorMHg1OSwweEY3LDB4RDAsMHgyMSwweDg2LDB4OTgsMHgwMCwweEMzLDB4QzcsMHg4NiwweDk4LDB4MDAsMHgwMCwweDAwLDB4QzMsMHg4MywKKzB4QzIsMHgwNCwweDhBLDB4ODYsMHhBNiwweDAwLDB4MEMsMHgwNCwweEVFLDB4ODMsMHhFQSwweDA0LDB4QzMsMHhFOCwweDkzLDB4RkYsCisweDcyLDB4MDQsMHhCMCwweDgyLDB4RTYsMHgwQSwweEMzLDB4OEIsMHg0NiwweDI2LDB4QTgsMHhGRCwweDc0LDB4MTEsMHg4QSwweDg2LAorMHhBNSwweDAwLDB4QTgsMHgwNiwweDc0LDB4MDgsMHgyNCwweEY5LDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4QzMsMHhGNiwKKzB4QzQsMHgwMSwweDc0LDB4MEEsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkIsMHgwQywweDAyLDB4RUIsMHgwQywweEE4LDB4MDIsCisweDc1LDB4MEYsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkQsMHgwQywweDA0LDB4M0EsMHg4NiwweEE1LDB4MDAsMHg3NSwweEQ4LAorMHhDMywweDhBLDB4ODYsMHhBNSwweDAwLDB4RUIsMHhDRiwweEU0LDB4RDgsMHgzMywweERCLDB4OEEsMHhEOCwweEMwLDB4RUIsMHgwNCwKKzB4MkUsMHg4QSwweDlGLDB4NjYsMHgxNywweDg4LDB4OUUsMHhBOSwweDAwLDB4OEIsMHg1RSwweDI2LDB4ODAsMHhFMywweDNGLDB4RjYsCisweEM3LDB4MDQsMHg3NCwweDA3LDB4QTgsMHgxMCwweDc1LDB4MDMsMHg4MCwweENCLDB4NDAsMHhGNiwweEM3LDB4MDgsMHg3NCwweDA3LAorMHhBOCwweDgwLDB4NzUsMHgwMywweDgwLDB4Q0IsMHg0MCwweDg4LDB4NUUsMHgyNiwweDhBLDB4ODYsMHhBNSwweDAwLDB4RjYsMHhDMywKKzB4RkQsMHg3NCwweDBELDB4QTgsMHgwNiwweDc0LDB4MDgsMHgyNCwweEY5LDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4QzMsCisweEY2LDB4QzcsMHgwMSwweDc0LDB4MDQsMHgwQywweDAyLDB4RUIsMHhGMCwweEY2LDB4QzMsMHgwMiwweDc1LDB4RTksMHgwQywweDA0LAorMHhFQiwweEU3LDB4QzQsMHgwNCwweEM0LDB4MDQsMHg4NSwweDA0LDB4NTksMHgwNCwweDQ4LDB4MDQsMHg0MSwweDA0LDB4QzMsMHgwMywKKzB4ODIsMHgwMywweDQxLDB4MDMsMHg4MiwweDAyLDB4NTcsMHgwMiwweDQxLDB4MDIsMHg4MiwweDAxLDB4NDEsMHgwMSwweDgyLDB4MDAsCisweDQxLDB4MDAsMHg0RSwweDAyLDB4QUQsMHgwMSwweDU3LDB4MDEsMHgyRCwweDAwLDB4MkIsMHgwMCwweDI3LDB4MDAsMHgyMSwweDAwLAorMHgxNiwweDAwLDB4RjQsMHgwNCwweEY0LDB4MDQsMHhBMywweDA0LDB4NkYsMHgwNCwweDVCLDB4MDQsMHg1MSwweDA0LDB4RjQsMHgwMywKKzB4QTMsMHgwMywweDUxLDB4MDMsMHhBMywweDAyLDB4NkQsMHgwMiwweDUxLDB4MDIsMHhBMywweDAxLDB4NTEsMHgwMSwweEEzLDB4MDAsCisweDUxLDB4MDAsMHg2MiwweDAyLDB4RDksMHgwMSwweDZELDB4MDEsMHgzOCwweDAwLDB4MzYsMHgwMCwweDMxLDB4MDAsMHgyOSwweDAwLAorMHgxQiwweDAwLDB4NTEsMHg1NywweEJGLDB4MDIsMHgwMCwweEVCLDB4MEYsMHg5MCwweDUxLDB4NTYsMHhCRiwweDAxLDB4MDAsMHhFQiwKKzB4MDcsMHg5MCwweDUxLDB4NTYsMHhCRiwweDAzLDB4MDAsMHg5MCwweDNDLDB4MTksMHg3NiwweDAyLDB4QjAsMHgxNywweDk4LDB4OEIsCisweEYwLDB4OEEsMHg4MiwweEM0LDB4MDAsMHgyQSwweEU0LDB4OEIsMHhGMCwweDgzLDB4RkUsMHgxOCwweDczLDB4NDYsMHhEMSwweEU2LAorMHgyRSwweDhCLDB4OEMsMHg1MiwweDIyLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwweDc0LDB4MDUsMHgyRSwweDhCLDB4OEMsMHg4MiwKKzB4MjIsMHhGNywweEM3LDB4MDIsMHgwMCwweDc0LDB4MTIsMHgzQiwweDhFLDB4OTQsMHgwMCwweDc0LDB4MEMsMHg4OSwweDhFLDB4OTQsCisweDAwLDB4OEEsMHhDNSwweEU2LDB4RUMsMHg4QSwweEMxLDB4RTYsMHhFNCwweEY3LDB4QzcsMHgwMSwweDAwLDB4NzQsMHgxMiwweDNCLAorMHg4RSwweDk2LDB4MDAsMHg3NCwweDBDLDB4ODksMHg4RSwweDk2LDB4MDAsMHg4QSwweEM1LDB4RTYsMHhGOCwweDhBLDB4QzEsMHhFNiwKKzB4RjAsMHg1RSwweDU5LDB4QzMsMHg3NywweDA2LDB4OEIsMHg4RSwweDhFLDB4MDAsMHhFQiwweEM1LDB4OEIsMHg4RSwweDkwLDB4MDAsCisweEVCLDB4QkYsMHhENSwweDAzLDB4RjYsMHgwMCwweDNFLDB4MDAsMHgxMCwweDAwLDB4MDQsMHgwMCwweENBLDB4MDQsMHgzMywweDAxLAorMHg0RCwweDAwLDB4MTQsMHgwMCwweDA1LDB4MDAsMHgwMSwweDAzLDB4MDUsMHgwNywweDA5LDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwKKzB4ODAsMHg4NCwweDFFLDB4MDAsMHhBMCwweDI1LDB4MjYsMHgwMCwweDAwLDB4MDAsMHg2MCwweDhCLDB4RjAsMHgzMywweEZGLDB4MkUsCisweEExLDB4NTAsMHgyMywweDJFLDB4OEIsMHgxNiwweDUyLDB4MjMsMHhCQiwweDMyLDB4MjMsMHhGNywweDQ2LDB4MzgsMHg4MCwweDAwLAorMHg3NCwweDBDLDB4MkUsMHhBMSwweDU0LDB4MjMsMHgyRSwweDhCLDB4MTYsMHg1NiwweDIzLDB4QkIsMHgzQywweDIzLDB4QjksMHgwNSwKKzB4MDAsMHgyRSwweDNCLDB4MzEsMHg3MywweDBBLDB4NDcsMHg0NywweEUyLDB4RjcsMHhCOCwweEZGLDB4RkYsMHhFQiwweDFELDB4OTAsCisweEQxLDB4RUYsMHgyRSwweDhBLDB4OEQsMHg0NiwweDIzLDB4MkEsMHhFRCwweEQxLDB4RUEsMHhEMSwweEQ4LDB4RTIsMHhGQSwweEY3LAorMHhGNiwweDA1LDB4MDIsMHgwMCwweEMxLDB4RTgsMHgwMiwweDJFLDB4OEEsMHhBNSwweDRCLDB4MjMsMHgyRSwweEEzLDB4NTgsMHgyMywKKzB4NjEsMHgyRSwweEExLDB4NTgsMHgyMywweEMzLDB4MDgsMHgwMCwweDIwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMiwweDYwLDB4MDksCisweDA4LDB4MDAsMHgyMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMiwweDAwLAorMHgwMywweDAwLDB4MDQsMHgwMCwweDUyLDB4NTYsMHg1NywweDg1LDB4QzAsMHg3NCwweDA1LDB4M0QsMHgwMSwweDA5LDB4NzYsMHgwMywKKzB4QjgsMHgwMSwweDA5LDB4QkYsMHg1QiwweDAxLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwweDc0LDB4MDMsMHhCRiwweEIyLDB4MDEsCisweDMzLDB4RjYsMHgyRSwweDNCLDB4ODQsMHhCNiwweDIzLDB4NzYsMHgwNCwweDQ2LDB4NDYsMHhFQiwweEY1LDB4RjcsMHhFNywweDJFLAorMHg4QiwweEJDLDB4QzAsMHgyMywweDAzLDB4QzcsMHg4MywweEQyLDB4MDAsMHhEMSwweEU3LDB4RjcsMHhGNywweDJFLDB4OEEsMHhBNCwKKzB4Q0EsMHgyMywweDVGLDB4NUUsMHg1QSwweEMzLDB4RTQsMHgzRSwweDgwLDB4QkUsMHhDMywweDAwLDB4MDMsMHg3NSwweDBDLDB4RjcsCisweDQ2LDB4N0EsMHgyMCwweDAwLDB4NzQsMHgwNSwweDBDLDB4ODAsMHhFNiwweDNFLDB4QzMsMHgyNCwweDdGLDB4RTYsMHgzRSwweEMzLAorMHgyNCwweDAzLDB4ODgsMHg4NiwweEMzLDB4MDAsMHg4QSwweEUwLDB4RTQsMHgxMCwweDI0LDB4RkMsMHgwQSwweEM0LDB4RTYsMHgxMCwKKzB4ODAsMHg4RSwweEExLDB4MDAsMHg0MiwweEU4LDB4Q0UsMHhGRiwweEMzLDB4OTAsMHg1NiwweDhCLDB4RjAsMHg4MywweEU2LDB4MDcsCisweEQxLDB4RTYsMHgyRSwweEZGLDB4QTQsMHg1OCwweDI0LDB4OTAsMHg2OCwweDI0LDB4NkMsMHgyNCwweDcwLDB4MjQsMHg3NCwweDI0LAorMHg3OCwweDI0LDB4ODcsMHgyNCwweDg3LDB4MjQsMHg4NywweDI0LDB4QjQsMHgwMCwweEVCLDB4MEUsMHhCNCwweEMwLDB4RUIsMHgwQSwKKzB4QjQsMHg0MCwweEVCLDB4MDYsMHhCNCwweDIwLDB4RUIsMHgwMiwweEI0LDB4QTAsMHhFNCwweDEwLDB4MjQsMHgxRiwweDBBLDB4QzQsCisweEU2LDB4MTAsMHg4MCwweDhFLDB4QTEsMHgwMCwweDQyLDB4NUUsMHhDMywweDkwLDB4M0MsMHgwMiwweDc3LDB4MTIsMHg4QSwweEUwLAorMHhFNCwweDEwLDB4MjQsMHhGMywweEMwLDB4RTQsMHgwMiwweDBBLDB4QzQsMHhFNiwweDEwLDB4ODAsMHg4RSwweEExLDB4MDAsMHg0MiwKKzB4QzMsMHg5MCwweDhCLDB4NUUsMHgzOCwweDg0LDB4QzAsMHg3NCwweDFGLDB4M0MsMHgwMiwweDc0LDB4MjAsMHg4MywweENCLDB4MDgsCisweDhCLDB4NDYsMHgyRSwweDNCLDB4NDYsMHgzQywweDc3LDB4MEMsMHhFOCwweDg4LDB4RkMsMHg3MiwweDA3LDB4QjAsMHgyNCwweEU2LAorMHgwQSwweDgzLDB4Q0IsMHgxMCwweDg5LDB4NUUsMHgzOCwweEMzLDB4ODMsMHhFMywweEY3LDB4RUIsMHhGNywweEY3LDB4QzMsMHgxMCwKKzB4MDAsMHg3NCwweEY1LDB4RTgsMHg2RCwweEZDLDB4NzIsMHhFQywweDhBLDB4ODYsMHhDMCwweDAwLDB4RTYsMHgzOCwweEIwLDB4MjMsCisweEU2LDB4MEEsMHhFQiwweEUwLDB4OEIsMHg1RSwweDM4LDB4OEIsMHg0NiwweDJFLDB4M0IsMHg0NiwweDNDLDB4RTQsMHhEOCwweDc3LAorMHgwQiwweDI0LDB4RkUsMHg4MCwweENCLDB4MTIsMHhFNiwweEQ4LDB4ODksMHg1RSwweDM4LDB4QzMsMHgwQywweDAxLDB4ODAsMHhDQiwKKzB4MDIsMHhFQiwweEYzLDB4NTAsMHgzMywweERCLDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwRiwweDBGLDB4OEEsMHhEOCwweDJFLDB4OEEsCisweDg3LDB4NjYsMHgxNywweDhBLDB4REMsMHgyRSwweDhBLDB4QTcsMHg2NiwweDE3LDB4MDksMHg0NiwweDNFLDB4NTgsMHhDMywweDUwLAorMHgzMywweERCLDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwRiwweDBGLDB4OEEsMHhEOCwweDJFLDB4OEEsMHg4NywweDY2LDB4MTcsMHg4QSwKKzB4REMsMHgyRSwweDhBLDB4QTcsMHg2NiwweDE3LDB4RjcsMHhEMCwweDIxLDB4NDYsMHgzRSwweDU4LDB4QzMsMHg4QiwweDQ2LDB4M0UsCisweDMzLDB4REIsMHg4QSwweEQ4LDB4MEEsMHhEQywweDJFLDB4OEEsMHg4NywweDc2LDB4MTcsMHhFNiwweDJDLDB4OEEsMHhFMCwweEU0LAorMHgyQSwweDI0LDB4MEYsMHgwQSwweEM0LDB4RTYsMHgyQSwweDhBLDB4ODYsMHhBNSwweDAwLDB4ODQsMHhFNCwweDc1LDB4MEQsMHhBOCwKKzB4ODAsMHg3NCwweDExLDB4MjQsMHg3RiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweEMzLDB4QTgsMHg4MCwweDc1LDB4MDQsCisweDBDLDB4ODAsMHhFQiwweEYxLDB4QzMsMHgxRSwweDYwLDB4MzMsMHhDOSwweDMzLDB4RDIsMHgzMywweEY2LDB4OEUsMHhEOSwweDhELAorMHhCRSwweEZELDB4MDAsMHg1NywweDhCLDB4MDUsMHg4NCwweEMwLDB4NzQsMHgxNiwweDhCLDB4RDEsMHg0MiwweDhCLDB4RkUsMHg0RiwKKzB4NzgsMHgwOSwweDM4LDB4QTMsMHhFNCwweDAwLDB4NzQsMHgwOCwweDRGLDB4NzksMHhGNywweDg4LDB4QTIsMHhFNCwweDAwLDB4NDYsCisweDVGLDB4ODMsMHhDNywweDA5LDB4NDEsMHg4MywweEY5LDB4MTAsMHg3MiwweEQ5LDB4ODksMHhCNiwweDg2LDB4MDAsMHg4OSwweDk2LAorMHg4NCwweDAwLDB4NjEsMHgxRiwweEMzLDB4NTMsMHhDNywweDQ2LDB4NjYsMHgwMCwweDAwLDB4OEIsMHg0NiwweDY0LDB4QTksMHg0MCwKKzB4MDAsMHg3NCwweDBELDB4QjMsMHgwMCwweEE5LDB4ODAsMHgwMCwweDc0LDB4MDIsMHhCMywweDdGLDB4ODgsMHg5RSwweEMxLDB4MDAsCisweDMyLDB4REIsMHhBOSwweDAyLDB4MDAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDQwLDB4QTksMHgwMCwweDQwLDB4NzQsMHgwMywweDgwLAorMHhDQiwweDAyLDB4QTksMHgwMCwweDgwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwMSwweEE5LDB4MzAsMHgxRSwweDc0LDB4MDMsMHg4MCwKKzB4Q0IsMHhCQywweEE5LDB4MDAsMHgyMCwweDc0LDB4MDMsMHg4MCwweENCLDB4MDgsMHhBOSwweDA0LDB4MDEsMHg3NCwweDAzLDB4ODAsCisweENCLDB4MTAsMHhBOSwweDA4LDB4MDAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDIwLDB4ODgsMHg5RSwweEMyLDB4MDAsMHg1QiwweEMzLAorMHgwNiwweDUxLDB4NTcsMHg1MCwweDE2LDB4MDcsMHg4RCwweEJFLDB4QzQsMHgwMCwweEI5LDB4MUYsMHgwMCwweDMzLDB4QzAsMHhBQSwKKzB4NDAsMHhFMiwweEZDLDB4OEIsMHg4NiwweDkyLDB4MDAsMHg4OSwweDg2LDB4OEUsMHgwMCwweDg5LDB4ODYsMHg5MCwweDAwLDB4NTgsCisweDVGLDB4NTksMHgwNywweEMzLDB4RTQsMHhEOCwweEMwLDB4RTgsMHgwNCwweDUzLDB4MjUsMHgwRiwweDAwLDB4OEIsMHhEOCwweDJFLAorMHg4QSwweDg3LDB4NjYsMHgxNywweDg4LDB4ODYsMHhBOSwweDAwLDB4NUEsMHhDMywweDA4LDB4ODYsMHhBQywweDAwLDB4QzYsMHg4NiwKKzB4QkEsMHgwMCwweDAxLDB4QjAsMHgwRSwweEU4LDB4RUEsMHhFOSwweEMzLDB4QUQsMHgzNiwweEEzLDB4QjQsMHgxMywweEFELDB4MzYsCisweEEzLDB4QjYsMHgxMywweEFELDB4MzYsMHhBMywweEI4LDB4MTMsMHg4MywweEU5LDB4MDYsMHgzNiwweEY3LDB4MDYsMHhCNiwweDEzLAorMHgwRiwweDAwLDB4QzMsMHg4QSwweDQ2LDB4MjYsMHhGNywweDQ2LDB4NDgsMHg4MCwweDAwLDB4NzQsMHgwMiwweDBDLDB4MTAsMHg4OCwKKzB4ODYsMHhCRCwweDAwLDB4MzIsMHhDMCwweDgzLDB4N0UsMHgxQSwweDAwLDB4NzUsMHgwRSwweDhCLDB4NUUsMHg0MCwweDQzLDB4ODAsCisweEUzLDB4RkUsMHgzQiwweDVFLDB4MDgsMHg3NSwweDAyLDB4MEMsMHgwMSwweDgzLDB4N0UsMHgzQSwweDAwLDB4NzUsMHgwRCwweDFFLAorMHhDNSwweDVFLDB4MTQsMHg4QiwweDFGLDB4MUYsMHg4NSwweERCLDB4NzUsMHgwMiwweDBDLDB4MDIsMHhGNywweDQ2LDB4MzgsMHgxMCwKKzB4MDAsMHg3NCwweDAyLDB4MEMsMHgwNCwweDhCLDB4NUUsMHg3QSwweEY3LDB4QzMsMHgwMiwweDAwLDB4NzQsMHgwMiwweDBDLDB4MDgsCisweEY3LDB4QzMsMHgwNCwweDAwLDB4NzQsMHgwMiwweDBDLDB4MTAsMHhGNywweEMzLDB4MDgsMHgwMCwweDc0LDB4MDIsMHgwQywweDIwLAorMHhGNywweEMzLDB4NDAsMHgwMCwweDc0LDB4MDIsMHgwQywweDQwLDB4ODgsMHg4NiwweEJGLDB4MDAsMHhDMywweDkwLDB4NkEsMHgwMCwKKzB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDBELDB4OUMsMHgwRSwweEU4LDB4RjEsMHhFQiwweDkwLDB4QjAsMHgwMiwweEU2LDB4REEsCisweEY4LDB4QzMsMHgzMywweEMwLDB4RTYsMHhEQSwweEY4LDB4QzMsMHhCMCwweDAxLDB4RTYsMHhEOCwweEY4LDB4QzMsMHgzMywweEMwLAorMHhFNiwweEQ4LDB4RjgsMHhDMywweEIwLDB4RkYsMHhFOCwweDRFLDB4RkEsMHhFOCwweEExLDB4RkEsMHhGOCwweEMzLDB4QUMsMHg0OSwKKzB4RTgsMHhBRiwweEZCLDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4MTUsMHhGRCwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksCisweEU4LDB4NjcsMHhGRCwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDFGLDB4RkQsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LAorMHhFNiwweDM0LDB4RjgsMHhDMywweEFDLDB4NDksMHhFNiwweDM2LDB4RjgsMHhDMywweEFDLDB4NDksMHgzQywweDAyLDB4NzcsMHgxRiwKKzB4ODQsMHhDMCwweDc1LDB4MUQsMHhFNCwweDE0LDB4MjQsMHhFRiwweEU2LDB4MTQsMHhFNCwweDEyLDB4MjQsMHgzRiwweEU2LDB4MTIsCisweEU0LDB4MTYsMHhBOCwweDA0LDB4NzQsMHgwOSwweEU4LDB4RUEsMHhGOSwweDcyLDB4MDQsMHhCMCwweDE4LDB4RTYsMHgwQSwweEY4LAorMHhDMywweDhBLDB4RTAsMHhFNCwweDE0LDB4MEMsMHgxMCwweEU2LDB4MTQsMHhFNCwweDEyLDB4MEMsMHhDMCwweEY2LDB4QzQsMHgwMSwKKzB4NzQsMHgwMiwweDI0LDB4N0YsMHhFNiwweDEyLDB4RjgsMHhDMywweEFDLDB4NDksMHhFOCwweDI1LDB4RkQsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4MDAsMHg0MCwweEU4LDB4N0QsMHhGRCwweEU4LDB4QjQsMHhGRCwweEU4LDB4QTgsMHhGRSwweEIwLDB4MDEsMHhFOCwweEI5LAorMHhGRSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg0MCwweEU4LDB4ODUsMHhGRCwweEU4LDB4QTAsMHhGRCwweEY4LDB4QzMsMHg5MCwKKzB4QjgsMHgwMCwweDEwLDB4RTgsMHg1RCwweEZELDB4RTgsMHg5NCwweEZELDB4RTgsMHg4OCwweEZFLDB4QjAsMHgwOCwweEU4LDB4OTksCisweEZFLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDEwLDB4RTgsMHg2NSwweEZELDB4RTgsMHg4MCwweEZELDB4RjgsMHhDMywweDkwLAorMHhCOCwweDAwLDB4ODAsMHhFOCwweDNELDB4RkQsMHhFOCwweDc0LDB4RkQsMHhFOCwweDY4LDB4RkUsMHhCMCwweDAyLDB4RTgsMHg3OSwKKzB4RkUsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhFOCwweDQ1LDB4RkQsMHhFOCwweDYwLDB4RkQsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4MDAsMHgyMCwweEU4LDB4MUQsMHhGRCwweEU4LDB4NTQsMHhGRCwweEU4LDB4NDgsMHhGRSwweEIwLDB4MDQsMHhFOCwweDU5LAorMHhGRSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHgyMCwweEU4LDB4MjUsMHhGRCwweEU4LDB4NDAsMHhGRCwweEY4LDB4QzMsMHg5MCwKKzB4QUMsMHg0OSwweEU4LDB4NDgsMHgxNCwweEU0LDB4M0MsMHgyNCwweEU3LDB4MEEsMHhDNCwweEU2LDB4M0MsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4RkMsMHgzQiwweDg5LDB4NDYsMHg3QywweEU0LDB4M0MsMHgwQywweDE4LDB4RTYsMHgzQywweEY4LDB4QzMsMHhFNCwweDEyLAorMHgwQywweDAyLDB4RTYsMHgxMiwweEY4LDB4QzMsMHhFNCwweDEyLDB4MjQsMHhGRCwweEVCLDB4RjYsMHhFOCwweEI1LDB4RkMsMHhGOCwKKzB4QzMsMHg5MCwweDgzLDB4NjYsMHgzOCwweEZELDB4RjgsMHhDMywweEFDLDB4NDksMHhBOCwweDAxLDB4NzQsMHgwNiwweDgzLDB4NEUsCisweDdBLDB4MjAsMHhFQiwweDA0LDB4ODMsMHg2NiwweDdBLDB4REYsMHhFOCwweENCLDB4RkIsMHhGOCwweEMzLDB4OTAsMHg4QSwweDg2LAorMHhBNSwweDAwLDB4MEMsMHgwMiwweDI0LDB4RkIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4MSwweDRFLDB4MjYsMHgwMSwKKzB4MjAsMHhBQywweDQ5LDB4MzIsMHhFNCwweDg5LDB4NDYsMHg2RSwweDgzLDB4NEUsMHg0OCwweDA4LDB4NDksMHg0NiwweEY5LDB4QzMsCisweDhBLDB4ODYsMHhBNSwweDAwLDB4MEMsMHgwMiwweDI0LDB4RkIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4MSwweDRFLAorMHgyNiwweDAxLDB4MjAsMHhBQywweEI0LDB4MEEsMHhGNiwweEU0LDB4RUIsMHhEOCwweEU4LDB4RkEsMHgxMywweEU0LDB4M0MsMHgyNCwKKzB4RjgsMHgwQSwweEM0LDB4RTYsMHgzQywweEY4LDB4QzMsMHg5MCwweEFELDB4NDksMHg0OSwweDg5LDB4NDYsMHg2NCwweEE5LDB4MDEsCisweDAwLDB4NzQsMHgxQiwweDhCLDB4RDgsMHg4MywweEUzLDB4RkEsMHg3NSwweDFBLDB4QTksMHgwNCwweDAwLDB4NzQsMHgwRiwweEU0LAorMHgzRSwweDBDLDB4MDIsMHhFNiwweDNFLDB4QjgsMHgzOCwweDQ0LDB4ODksMHg0NiwweDYyLDB4RjgsMHhDMywweDkwLDB4RTQsMHgzRSwKKzB4MjQsMHhGQywweEVCLDB4RUYsMHhFNCwweDNFLDB4MjQsMHhGQywweEU2LDB4M0UsMHhFOCwweEU4LDB4RkMsMHhCOCwweEFBLDB4NDAsCisweEVCLDB4RTYsMHhFOCwweDZFLDB4RjgsMHg3MiwweDA1LDB4QjAsMHgxOCwweEU2LDB4MEEsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LAorMHhFOCwweENGLDB4RjksMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHhDRiwweEY5LDB4RjgsMHhDMywweDkwLDB4RTgsMHg2OCwKKzB4RkQsMHg3NSwweDA2LDB4MzIsMHhDMCwweEU2LDB4REEsMHhGOCwweEMzLDB4QjAsMHgwMiwweEU2LDB4REEsMHgzNiwweEEwLDB4QjQsCisweDEzLDB4MjQsMHgxMCwweDM0LDB4MTAsMHhFOCwweDE2LDB4MDEsMHgzNiwweEExLDB4QjQsMHgxMywweEE5LDB4MDEsMHgwMCwweDc0LAorMHgwNSwweEU4LDB4RkMsMHhGRSwweEVCLDB4MEUsMHhBOSwweDAyLDB4MDAsMHg3NCwweDA0LDB4MzIsMHhDMCwweEVCLDB4MDIsMHhCMCwKKzB4MDEsMHhFOCwweERFLDB4RkUsMHgzNiwweEExLDB4QjQsMHgxMywweEU4LDB4QjUsMHgxMywweEU0LDB4M0MsMHgyNCwweEY4LDB4MEEsCisweEM0LDB4RTYsMHgzQywweDM2LDB4QTEsMHhCNCwweDEzLDB4QzEsMHhFOCwweDA1LDB4MjUsMHgwMSwweDAwLDB4RTgsMHhGQSwweEZFLAorMHgzNiwweEEwLDB4QjUsMHgxMywweDI0LDB4MTAsMHhFOCwweDU5LDB4RkIsMHgzMiwweEMwLDB4MzYsMHg4QSwweDI2LDB4QjUsMHgxMywKKzB4RjYsMHhDNCwweDA0LDB4NzQsMHgwOSwweEZFLDB4QzAsMHhGNiwweEM0LDB4MDgsMHg3NCwweDAyLDB4RkUsMHhDMCwweEU4LDB4REIsCisweEZELDB4MzYsMHhBMSwweEI2LDB4MTMsMHgyNSwweDBGLDB4MDAsMHhFOCwweDU3LDB4RjksMHgzNiwweEExLDB4QjYsMHgxMywweEMxLAorMHhFOCwweDA0LDB4MjUsMHgwMywweDAwLDB4RTgsMHhCOCwweEZBLDB4MzYsMHhBMSwweEI2LDB4MTMsMHhDMSwweEU4LDB4MDUsMHgyNSwKKzB4MDIsMHgwMCwweEU4LDB4MDUsMHhGQiwweDM2LDB4QTEsMHhCNiwweDEzLDB4RjYsMHhDNCwweDAxLDB4NzUsMHgwNCwweDMyLDB4QzAsCisweEVCLDB4MDksMHg4MCwweEU0LDB4MDIsMHhEMCwweEVDLDB4QjAsMHgwMiwweDJBLDB4QzQsMHhFOCwweEFDLDB4RkEsMHgzNiwweEY2LAorMHgwNiwweEI3LDB4MTMsMHg0MCwweDc0LDB4MDUsMHhFOCwweDgzLDB4RkUsMHhFQiwweDAzLDB4RTgsMHg4NCwweEZFLDB4MzYsMHhGNiwKKzB4MDYsMHhCNywweDEzLDB4MjAsMHg3NCwweDA1LDB4RTgsMHg2NSwweEZFLDB4RUIsMHgwMywweEU4LDB4NjgsMHhGRSwweEY4LDB4QzMsCisweEU0LDB4MTIsMHgwQywweDAxLDB4RTYsMHgxMiwweEY4LDB4QzMsMHhFNCwweDEyLDB4MjQsMHhGRSwweEVCLDB4RjYsMHhFNCwweDE0LAorMHgyNCwweEYwLDB4MEMsMHgwNSwweEU2LDB4MTQsMHhFNCwweDJBLDB4MjQsMHhGMCwweDBDLDB4MDYsMHhFNiwweDJBLDB4RjgsMHhDMywKKzB4RTQsMHgyQSwweDI0LDB4RjAsMHhFNiwweDJBLDB4RTQsMHgxNCwweDI0LDB4RjAsMHgwQywweDA3LDB4RTYsMHgxNCwweEY4LDB4QzMsCisweEFELDB4NDksMHg0OSwweEU4LDB4NjQsMHhGOSwweDg5LDB4ODYsMHg4RSwweDAwLDB4RjgsMHhDMywweEFELDB4NDksMHg0OSwweEU4LAorMHg1OCwweEY5LDB4ODksMHg4NiwweDkwLDB4MDAsMHhGOCwweEMzLDB4ODMsMHg0RSwweDI2LDB4MDQsMHhFOCwweEE4LDB4RjcsMHhGOCwKKzB4QzMsMHg5MCwweDgzLDB4NjYsMHgyNiwweEZCLDB4RTgsMHg5RSwweEY3LDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweDg0LDB4QzAsCisweDc1LDB4MEQsMHhFNCwweDEwLDB4MjQsMHhFRiwweEU2LDB4MTAsMHg4MCwweDhFLDB4QTEsMHgwMCwweDQyLDB4RjgsMHhDMywweEU0LAorMHgxMCwweDBDLDB4MTAsMHhFQiwweEYxLDB4OTAsMHhBQywweDQ5LDB4M0MsMHgwMiwweDc2LDB4MDIsMHgzMiwweEMwLDB4QzAsMHhFMCwKKzB4MDQsMHhBOCwweDIwLDB4NzQsMHgwMiwweDBDLDB4MDgsMHgyNCwweDE4LDB4OEEsMHhFMCwweEU0LDB4MTIsMHgyNCwweEU3LDB4MEEsCisweEM0LDB4RTYsMHgxMiwweDgwLDB4OEUsMHhBMSwweDAwLDB4NDQsMHhGOCwweEMzLDB4QUMsMHg0OSwweDg4LDB4ODYsMHhDMCwweDAwLAorMHhGOCwweEMzLDB4QUMsMHg0OSwweEU2LDB4M0EsMHhGOCwweEMzLDB4QUMsMHg0OSwweDg0LDB4QzAsMHg3NCwweDA4LDB4RTQsMHgxMiwKKzB4MEMsMHgwNCwweEU2LDB4MTIsMHhGOCwweEMzLDB4RTQsMHgxMiwweDI0LDB4RkIsMHhFQiwweEY2LDB4QUMsMHg0OSwweEU4LDB4RDYsCisweEY2LDB4NzMsMHgwMywweEU4LDB4MjcsMHhGNywweEY4LDB4QzMsMHhFNCwweDEyLDB4QTgsMHgwMiwweDc0LDB4MDQsMHgyNCwweEZELAorMHhFNiwweDEyLDB4QjgsMHhGMCwweDAwLDB4RTgsMHg4NywweEZBLDB4ODEsMHg2NiwweDI2LDB4RkYsMHhGMywweEU4LDB4NTcsMHhGNywKKzB4RTgsMHg5QSwweEZBLDB4RjgsMHhDMywweDkwLDB4QjgsMHg4MCwweDAwLDB4RTgsMHg1NywweEZBLDB4ODAsMHg0RSwweDI3LDB4MDgsCisweEU4LDB4NDQsMHhGNywweEU4LDB4ODcsMHhGQSwweEY4LDB4QzMsMHhCOCwweDgwLDB4MDAsMHhFOCwweDYxLDB4RkEsMHg4MSwweDY2LAorMHgyNiwweEZGLDB4RjcsMHhFOCwweDMxLDB4RjcsMHhFOCwweDc0LDB4RkEsMHhGOCwweEMzLDB4OTAsMHhCOCwweDEwLDB4MDAsMHhFOCwKKzB4MzEsMHhGQSwweDgwLDB4NEUsMHgyNywweDA0LDB4RTgsMHgxRSwweEY3LDB4RTgsMHg2MSwweEZBLDB4RjgsMHhDMywweEI4LDB4MTAsCisweDAwLDB4RTgsMHgzQiwweEZBLDB4ODEsMHg2NiwweDI2LDB4RkYsMHhGQiwweEU4LDB4MEIsMHhGNywweEU4LDB4NEUsMHhGQSwweEY4LAorMHhDMywweDkwLDB4MzMsMHhDMCwweEFDLDB4NDksMHgzQywweDAxLDB4NzMsMHgwNCwweEIwLDB4MDEsMHhFQiwweDA2LDB4M0MsMHgwQywKKzB4NzYsMHgwMiwweEIwLDB4MEMsMHg4OSwweDQ2LDB4MUMsMHhGOCwweEMzLDB4OTAsMHg4MSwweDRFLDB4MjYsMHgwMCwweDIwLDB4OEEsCisweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHgyNCwweEZCLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4ODMsMHg0RSwweDI2LAorMHgwMSwweEY4LDB4QzMsMHg5MCwweDgxLDB4NEUsMHgyNiwweDAwLDB4NDAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHg1MCwweEU4LDB4MDUsMHhGNiwweDU4LDB4NzIsCisweDA4LDB4RTYsMHgzOCwweEIwLDB4MjMsMHhFNiwweDBBLDB4RjgsMHhDMywweEY5LDB4QzMsMHg5MCwweEFDLDB4NTAsMHhBRCwweEU4LAorMHg4MiwweEY4LDB4NUEsMHhGNiwweEMyLDB4MDEsMHg3NCwweDEyLDB4MzksMHg4NiwweDk2LDB4MDAsMHg3NCwweDBDLDB4ODksMHg4NiwKKzB4OTYsMHgwMCwweEU2LDB4RjAsMHg4NiwweEUwLDB4RTYsMHhGOCwweDg2LDB4RTAsMHhGNiwweEMyLDB4MDIsMHg3NCwweDEwLDB4MzksCisweDg2LDB4OTQsMHgwMCwweDc0LDB4MEEsMHg4OSwweDg2LDB4OTQsMHgwMCwweEU2LDB4RTQsMHg4NiwweEUwLDB4RTYsMHhFQywweDgzLAorMHhFOSwweDAzLDB4QzMsMHg5MCwweEU0LDB4MTYsMHg4OCwweDg2LDB4QkMsMHgwMCwweEU4LDB4RTYsMHhGQSwweDMzLDB4REIsMHhFNCwKKzB4MEMsMHhBOCwweDA2LDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwMSwweEE4LDB4MTAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDAyLDB4QTgsCisweDgwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwNCwweEU0LDB4MTIsMHg4QSwweEUwLDB4MjQsMHgxOCwweDBBLDB4RDgsMHhFNCwweERBLAorMHhGNiwweEM0LDB4MDIsMHg3NCwweDA3LDB4QTgsMHg0MCwweDc1LDB4MDMsMHg4MCwweENCLDB4MjAsMHhBOCwweDAyLDB4NzUsMHgwOSwKKzB4RTQsMHgyQSwweEE4LDB4MEYsMHg3NCwweDAzLDB4ODAsMHhDQiwweDQwLDB4RjcsMHg0NiwweDM4LDB4MDIsMHgwMCwweDc0LDB4MDksCisweEU0LDB4RDgsMHhBOCwweDAxLDB4NzUsMHgwMywweDgwLDB4Q0IsMHg4MCwweDg4LDB4OUUsMHhCRSwweDAwLDB4RkUsMHg4NiwweEI0LAorMHgwMCwweEIwLDB4MEEsMHhFOCwweDVDLDB4RTQsMHhGOCwweEMzLDB4QUMsMHg0OSwweDNDLDB4MDIsMHg3NCwweDQxLDB4NzcsMHgxRiwKKzB4NTAsMHhFOCwweDRGLDB4RjUsMHg1OCwweDcyLDB4MEMsMHg4NCwweEMwLDB4NzQsMHgwQSwweEIwLDB4MTIsMHhFNiwweDBBLDB4ODAsCisweDRFLDB4MzgsMHgwMSwweEY4LDB4QzMsMHhCMCwweDExLDB4RTYsMHgwQSwweDgwLDB4NjYsMHgzOCwweEZFLDB4RjgsMHhDMywweDhCLAorMHg0NiwweDM4LDB4MjUsMHhGRiwweEY3LDB4ODksMHg0NiwweDM4LDB4QTksMHgwMCwweDA0LDB4NzUsMHhFNiwweDhBLDB4ODYsMHhBNSwKKzB4MDAsMHhBOCwweDEwLDB4NzUsMHhERSwweDBDLDB4MTAsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhGOCwweEMzLDB4ODEsCisweDRFLDB4MzgsMHgwMCwweDA4LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDEwLDB4NzQsMHhDNywweDI0LDB4RUYsMHhFQiwweEU3LAorMHhBRCwweDQ5LDB4NDksMHgzQywweDAxLDB4NzIsMHgxMSwweDNDLDB4MEMsMHg3NywweDBELDB4NTAsMHg4QSwweEUwLDB4RTQsMHgxNCwKKzB4MjUsMHhGMCwweDBGLDB4MEEsMHhDNCwweEU2LDB4MTQsMHg1OCwweDhBLDB4QzQsMHg4NCwweEMwLDB4NzQsMHgwMiwweEU2LDB4NDIsCisweEY4LDB4QzMsMHhFOCwweENGLDB4RjksMHhGRSwweDg2LDB4QjksMHgwMCwweEIwLDB4MEUsMHhFOCwweEQ0LDB4RTMsMHhGOCwweEMzLAorMHgzQSwweDg2LDB4QUYsMHgwMCwweDc0LDB4MUYsMHg4OCwweDg2LDB4QUYsMHgwMCwweDhBLDB4RTAsMHg4MCwweEMyLDB4MDYsMHhCMCwKKzB4QkYsMHhFRSwweDgwLDB4RUEsMHgwMiwweDhBLDB4QzQsMHhFRSwweDhBLDB4ODYsMHhBOCwweDAwLDB4ODAsMHhDMiwweDAyLDB4RUUsCisweDgwLDB4RUEsMHgwNiwweDhBLDB4QzQsMHhDMywweDhCLDB4NDYsMHgzRSwweDg1LDB4QzAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDc0LAorMHgxMiwweEE4LDB4MDgsMHg3NSwweDBELDB4MEMsMHgwOCwweDg4LDB4ODYsMHhBNSwweDAwLDB4ODAsMHhDMiwweDAyLDB4RUUsMHg4MCwKKzB4RUEsMHgwMiwweEMzLDB4QTgsMHgwOCwweDc0LDB4RkIsMHgyNCwweEY3LDB4RUIsMHhFQywweDhCLDB4NDYsMHgyNiwweDg0LDB4QzAsCisweDc0LDB4MTYsMHg4QSwweDg2LDB4QTUsMHgwMCwweEE4LDB4MDIsMHg3NCwweDBELDB4MjQsMHhGRCwweDg4LDB4ODYsMHhBNSwweDAwLAorMHg4MywweEMyLDB4MDIsMHhFRSwweDgzLDB4RUEsMHgwMiwweEMzLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDAyLDB4NzUsMHhGNywKKzB4MEMsMHgwMiwweEVCLDB4RTgsMHg1MiwweDgzLDB4QzIsMHgwQywweEVDLDB4QzAsMHhFOCwweDA0LDB4ODgsMHg4NiwweEE5LDB4MDAsCisweDhCLDB4NUUsMHgyNiwweDgwLDB4RTMsMHgzRiwweEY2LDB4QzcsMHgwNCwweDc0LDB4MDcsMHhBOCwweDA4LDB4NzUsMHgwMywweDgwLAorMHhDQiwweDQwLDB4RjYsMHhDNywweDA4LDB4NzQsMHgwNywweEE4LDB4MDIsMHg3NSwweDAzLDB4ODAsMHhDQiwweDgwLDB4ODgsMHg1RSwKKzB4MjYsMHg4QSwweDg2LDB4QTUsMHgwMCwweDg0LDB4REIsMHg3NCwweDEwLDB4QTgsMHgwMiwweDc0LDB4MEEsMHgyNCwweEZELDB4ODgsCisweDg2LDB4QTUsMHgwMCwweDgzLDB4RUEsMHgwQSwweEVFLDB4NUEsMHhDMywweEE4LDB4MDIsMHg3NSwweEZBLDB4MEMsMHgwMiwweEVCLAorMHhFRSwweDkwLDB4RkYsMHhGRiwweDAwLDB4NDgsMHgwMCwweDMwLDB4QkEsMHgyMCwweEM0LDB4MUEsMHgwMCwweDE4LDB4MDAsMHgxMiwKKzB4MDAsMHgwQywweDAwLDB4MDYsMHgwMCwweDAzLDB4MDAsMHgwMiwweDgwLDB4MDEsMHhDMCwweDAwLDB4NjAsMHgwMCwweDMwLDB4MDAsCisweDE4LDB4MDAsMHhDRCwweDAxLDB4MDAsMHgwMSwweDgwLDB4MDAsMHgxMCwweDAwLDB4MTAsMHgwMCwweDBFLDB4MDAsMHgwQywweDAwLAorMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDQsMHgwMCwweDAzLDB4MDAsMHgwMiwweDAwLDB4MDEsMHgwMCwKKzB4NTIsMHg1MSwweDU2LDB4M0MsMHgxRSwweDc3LDB4NDcsMHg5OCwweDhCLDB4RjAsMHg4QSwweDgyLDB4QzQsMHgwMCwweDMyLDB4RTQsCisweDgzLDB4RkUsMHgxOCwweDc0LDB4M0QsMHg4MywweEZFLDB4MTksMHg3NCwweDNFLDB4ODMsMHhGRSwweDFFLDB4NzcsMHgyRiwweEQxLAorMHhFNiwweDJFLDB4OEIsMHg4QywweDMyLDB4MkQsMHgzQiwweDhFLDB4OTQsMHgwMCwweDc0LDB4MjIsMHg4OSwweDhFLDB4OTQsMHgwMCwKKzB4ODMsMHhDMiwweDA2LDB4OEEsMHg4NiwweEE4LDB4MDAsMHg4QSwweEUwLDB4MEMsMHg4MCwweEVFLDB4ODMsMHhFQSwweDA2LDB4OEEsCisweEMxLDB4RUUsMHg4MywweEMyLDB4MDIsMHg4QSwweEM1LDB4RUUsMHg4MywweEMyLDB4MDQsMHg4QSwweEM0LDB4RUUsMHg1RSwweDU5LAorMHg1QSwweEMzLDB4OEIsMHg4RSwweDhFLDB4MDAsMHhFQiwweENFLDB4OEIsMHg4RSwweDkwLDB4MDAsMHhFQiwweEM4LDB4NTIsMHg1MSwKKzB4M0QsMHgwNSwweDAwLDB4NzcsMHgwMywweEI4LDB4MDUsMHgwMCwweDhCLDB4QzgsMHhCQSwweDAyLDB4MDAsMHhCOCwweDAwLDB4RDAsCisweEY3LDB4RjEsMHgwNSwweDAxLDB4MDAsMHhEMSwweEU4LDB4NTksMHg1QSwweEMzLDB4OEIsMHg0NiwweDdBLDB4QTgsMHgyMCwweDc0LAorMHgwQiwweDgwLDB4QkUsMHhDMywweDAwLDB4MDMsMHg3NSwweDA0LDB4MEMsMHgwMSwweEVCLDB4MDIsMHgyNCwweEZFLDB4ODksMHg0NiwKKzB4N0EsMHhDMywweDI0LDB4MDMsMHg4OCwweDg2LDB4QzMsMHgwMCwweDhBLDB4QTYsMHhBOCwweDAwLDB4OEEsMHhEQywweDgwLDB4RTQsCisweEZDLDB4MEEsMHhDNCwweDNBLDB4QzMsMHg3NCwweDBCLDB4ODgsMHg4NiwweEE4LDB4MDAsMHg4MywweEMyLDB4MDYsMHhFRSwweDgzLAorMHhFQSwweDA2LDB4RTgsMHhDNSwweEZGLDB4QzMsMHgwMCwweDA4LDB4MTgsMHgzOCwweDI4LDB4OTAsMHgzQywweDA0LDB4NzcsMHgyMywKKzB4MzIsMHhFNCwweDhCLDB4RDgsMHgyRSwweDhBLDB4ODcsMHgyNiwweDJFLDB4OEEsMHhBNiwweEE4LDB4MDAsMHg4QSwweERDLDB4ODAsCisweEU0LDB4QzcsMHgwQSwweEM0LDB4M0EsMHhDMywweDc0LDB4MEIsMHg4OCwweDg2LDB4QTgsMHgwMCwweDgzLDB4QzIsMHgwNiwweEVFLAorMHg4MywweEVBLDB4MDYsMHhDMywweDg0LDB4QzAsMHg3NCwweDAyLDB4QjAsMHgwNCwweDhBLDB4QTYsMHhBOCwweDAwLDB4OEEsMHhEQywKKzB4ODAsMHhFNCwweEZCLDB4MEEsMHhDNCwweDNBLDB4QzMsMHg3NCwweDBCLDB4ODgsMHg4NiwweEE4LDB4MDAsMHg4MywweEMyLDB4MDYsCisweEVFLDB4ODMsMHhFQSwweDA2LDB4QzMsMHg5MCwweDhCLDB4NUUsMHgzOCwweDg0LDB4QzAsMHg3NCwweDM0LDB4M0MsMHgwMiwweDc0LAorMHgzQiwweDhBLDB4ODYsMHhBRiwweDAwLDB4MEMsMHgwNCwweEU4LDB4RTYsMHhGRCwweDhCLDB4NDYsMHgyRSwweDNCLDB4NDYsMHgzQywKKzB4NzcsMHgxQiwweEY3LDB4QzMsMHgwMCwweDA0LDB4NzUsMHgxNSwweDgxLDB4Q0IsMHgwMCwweDA0LDB4ODMsMHhDMiwweDAyLDB4OEEsCisweDg2LDB4QTUsMHgwMCwweDI0LDB4RkEsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4ODMsMHhFQSwweDAyLDB4ODksMHg1RSwweDM4LAorMHhDMywweDhBLDB4ODYsMHhBRiwweDAwLDB4MjQsMHhGQiwweEU4LDB4QjYsMHhGRCwweEVCLDB4RjEsMHhGNywweEMzLDB4MTAsMHgwMCwKKzB4NzQsMHhFRiwweEVCLDB4RUQsMHg4MywweEMyLDB4MEMsMHhFQywweDgzLDB4RUEsMHgwQywweEMwLDB4RTgsMHgwNCwweDg4LDB4ODYsCisweEE5LDB4MDAsMHhDMywweDkwLDB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywweDAxLDB4ODgsMHg4NiwweEE3LDB4MDAsMHg4QiwweERBLAorMHg4MCwweEMyLDB4MDgsMHhFRSwweDhCLDB4RDMsMHhGOCwweEMzLDB4OEEsMHg4NiwweEE3LDB4MDAsMHgyNCwweEZFLDB4RUIsMHhFQSwKKzB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywweDAyLDB4RUIsMHhFMiwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRCwweEVCLDB4REEsCisweEIwLDB4RkYsMHhFOCwweDUyLDB4RjIsMHhFOCwweDk3LDB4RjIsMHhGOCwweEMzLDB4QUMsMHg0OSwweEU4LDB4NjEsMHhGRSwweEY4LAorMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4RUIsMHhGRSwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDM1LDB4RkYsMHhGOCwKKzB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDA1LDB4RkYsMHhGOCwweEMzLDB4OTAsMHg1MiwweDgzLDB4QzIsMHgwNiwweEIwLDB4QkYsCisweEVFLDB4NTIsMHg4MywweEMyLDB4MDIsMHhBQywweDQ5LDB4RUUsMHg1QSwweDhBLDB4ODYsMHhBOCwweDAwLDB4RUUsMHg1QSwweEY4LAorMHhDMywweDkwLDB4NTIsMHg4MywweEMyLDB4MDYsMHhCMCwweEJGLDB4RUUsMHg1MiwweDgzLDB4QzIsMHgwNiwweEVCLDB4RTYsMHg5MCwKKzB4QUMsMHg0OSwweDNDLDB4MDIsMHg3NywweDBELDB4ODQsMHhDMCwweDc1LDB4MEIsMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4RkQsCisweEU4LDB4MEQsMHhGRCwweEY4LDB4QzMsMHg1MCwweDhBLDB4ODYsMHhBRiwweDAwLDB4MEMsMHgwMiwweEU4LDB4MDEsMHhGRCwweDVCLAorMHg4MywweEMyLDB4MDgsMHg4QSwweDg2LDB4QTcsMHgwMCwweEY2LDB4QzMsMHgwMSwweDc0LDB4MEMsMHgyNCwweERGLDB4ODgsMHg4NiwKKzB4QTcsMHgwMCwweEVFLDB4ODMsMHhFQSwweDA4LDB4RjgsMHhDMywweDBDLDB4MjAsMHhFQiwweEYyLDB4QUMsMHg0OSwweEU4LDB4RTUsCisweEZFLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDQwLDB4RTgsMHg2OSwweEY1LDB4RTgsMHhGOSwweEZDLDB4RTgsMHgyNCwweEZGLAorMHhCMCwweDAxLDB4RTgsMHhBNSwweEY2LDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDQwLDB4RTgsMHg3MSwweEY1LDB4RTgsMHhFNSwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4MTAsMHhFOCwweDQ5LDB4RjUsMHhFOCwweEQ5LDB4RkMsMHhFOCwweDA0LDB4RkYsCisweEIwLDB4MDgsMHhFOCwweDg1LDB4RjYsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4MTAsMHhFOCwweDUxLDB4RjUsMHhFOCwweEM1LAorMHhGQywweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg4MCwweEU4LDB4MjksMHhGNSwweEU4LDB4QjksMHhGQywweEU4LDB4RTQsMHhGRSwKKzB4QjAsMHgwMiwweEU4LDB4NjUsMHhGNiwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg4MCwweEU4LDB4MzEsMHhGNSwweEU4LDB4QTUsCisweEZDLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDIwLDB4RTgsMHgwOSwweEY1LDB4RTgsMHg5OSwweEZDLDB4RTgsMHhDNCwweEZFLAorMHhCMCwweDA0LDB4RTgsMHg0NSwweEY2LDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDIwLDB4RTgsMHgxMSwweEY1LDB4RTgsMHg4NSwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHgzNCwweDBDLDB4RjgsMHhDMywweDkwLDB4QjgsMHhGQywweDNCLDB4ODksCisweDQ2LDB4N0MsMHhGOCwweEMzLDB4OEEsMHg4NiwweEFGLDB4MDAsMHgwQywweDgwLDB4RTgsMHg0MywweEZDLDB4RjgsMHhDMywweDkwLAorMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4N0YsMHhFQiwweEYyLDB4OEEsMHg4NiwweEFGLDB4MDAsMHgwQywweDQwLDB4RTgsMHgyRiwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4QkYsMHhFQiwweEYyLDB4QUMsMHg0OSwweEE4LDB4MDEsCisweDc0LDB4MDcsMHg4MywweDRFLDB4N0EsMHgyMCwweEVCLDB4MDUsMHg5MCwweDgzLDB4NjYsMHg3QSwweERGLDB4RTgsMHg4QSwweEZELAorMHhGOCwweEMzLDB4ODMsMHhDMiwweDA2LDB4OEEsMHg4NiwweEE4LDB4MDAsMHgwQywweDQwLDB4ODgsMHg4NiwweEE4LDB4MDAsMHhFRSwKKzB4ODMsMHhFQSwweDA2LDB4QUMsMHg0OSwweDMyLDB4RTQsMHg4OSwweDQ2LDB4NkUsMHg4MywweDRFLDB4MjYsMHgwMSwweDgzLDB4NEUsCisweDQ4LDB4MDgsMHhCMCwweDA2LDB4RTgsMHhCQiwweERGLDB4NDksMHg0NiwweEY5LDB4QzMsMHg5MCwweDgzLDB4QzIsMHgwNiwweDhBLAorMHg4NiwweEE4LDB4MDAsMHgwQywweDQwLDB4ODgsMHg4NiwweEE4LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwNiwweEFDLDB4QjQsMHgwQSwKKzB4RjYsMHhFNCwweEVCLDB4RDAsMHhFOCwweEUwLDB4MEIsMHhGOCwweEMzLDB4OTAsMHhBRCwweDQ5LDB4NDksMHg4OSwweDQ2LDB4NjQsCisweEE5LDB4MDEsMHgwMCwweDc0LDB4MTksMHg4QiwweEQ4LDB4ODMsMHhFMywweEZBLDB4NzUsMHgwQSwweEE5LDB4MDQsMHgwMCwweDc0LAorMHgwRCwweEI4LDB4RTIsMHgzRiwweEVCLDB4MEIsMHhFOCwweEVDLDB4RjQsMHhCOCwweEFBLDB4NDAsMHhFQiwweDAzLDB4QjgsMHgzOCwKKzB4NDQsMHg4OSwweDQ2LDB4NjIsMHhGOCwweEMzLDB4OEEsMHg4NiwweEFGLDB4MDAsMHhBOCwweDAyLDB4NzQsMHgwQSwweDI0LDB4RkQsCisweEU4LDB4OEQsMHhGQiwweDBDLDB4MDIsMHhFOCwweDg4LDB4RkIsMHhGOCwweEMzLDB4QUMsMHg0OSwweEU4LDB4ODEsMHhGQywweEY4LAorMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4NzksMHhGQywweEY4LDB4QzMsMHg5MCwweEU4LDB4NUMsMHhGNSwweDc1LDB4MDUsMHhFOCwKKzB4RTYsMHhGRCwweEY4LDB4QzMsMHhFOCwweENELDB4RkQsMHgzNiwweEEwLDB4QjQsMHgxMywweDI0LDB4MTAsMHgzNCwweDEwLDB4RTgsCisweDI2LDB4MDEsMHgzNiwweEExLDB4QjQsMHgxMywweEE5LDB4MDEsMHgwMCwweDc0LDB4MDUsMHhFOCwweEZFLDB4RkUsMHhFQiwweDBFLAorMHhBOSwweDAyLDB4MDAsMHg3NCwweDA0LDB4MzIsMHhDMCwweEVCLDB4MDIsMHhCMCwweDAxLDB4RTgsMHhFOCwweEZFLDB4MzYsMHhBMSwKKzB4QjQsMHgxMywweEU4LDB4QUIsMHgwQiwweDM2LDB4QTEsMHhCNCwweDEzLDB4QzEsMHhFOCwweDA1LDB4MjUsMHgwMSwweDAwLDB4RTgsCisweDBDLDB4RkYsMHgzNiwweEEwLDB4QjUsMHgxMywweDI0LDB4MTAsMHhFOCwweDJCLDB4RkQsMHgzMiwweEMwLDB4MzYsMHg4QSwweDI2LAorMHhCNSwweDEzLDB4RjYsMHhDNCwweDA0LDB4NzQsMHgwOSwweEZFLDB4QzAsMHhGNiwweEM0LDB4MDgsMHg3NCwweDAyLDB4RkUsMHhDMCwKKzB4RTgsMHhFRiwweEZELDB4MzYsMHhBMSwweEI2LDB4MTMsMHgyNSwweDBGLDB4MDAsMHhFOCwweDAzLDB4RkMsMHgzNiwweEExLDB4QjYsCisweDEzLDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwMywweDAwLDB4RTgsMHg4OCwweEZDLDB4MzYsMHhBMSwweEI2LDB4MTMsMHhDMSwweEU4LAorMHgwNSwweDI1LDB4MDIsMHgwMCwweEU4LDB4Q0QsMHhGQywweDM2LDB4QTEsMHhCNiwweDEzLDB4RjYsMHhDNCwweDAxLDB4NzUsMHgwNCwKKzB4MzIsMHhDMCwweEVCLDB4MDksMHg4MCwweEU0LDB4MDIsMHhEMCwweEVDLDB4QjAsMHgwMiwweDJBLDB4QzQsMHhFOCwweDhDLDB4RkMsCisweDM2LDB4RjYsMHgwNiwweEI3LDB4MTMsMHg0MCwweDc0LDB4MDUsMHhFOCwweDhELDB4RkUsMHhFQiwweDAzLDB4RTgsMHg5NCwweEZFLAorMHgzNiwweEY2LDB4MDYsMHhCNywweDEzLDB4MjAsMHg3NCwweDA1LDB4RTgsMHg2OSwweEZFLDB4RUIsMHgwMywweEU4LDB4NzAsMHhGRSwKKzB4RjgsMHhDMywweEY4LDB4QzMsMHg4QiwweDQ2LDB4MzgsMHhBOSwweDA0LDB4MDAsMHg3NSwweDIzLDB4MEQsMHgwNCwweDAwLDB4ODksCisweDQ2LDB4MzgsMHg4MywweEMyLDB4MDgsMHg4QiwweDQ2LDB4MkUsMHgzQiwweDQ2LDB4M0MsMHg3MywweDE0LDB4ODMsMHg0RSwweDM4LAorMHgxMCwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRSwweDg4LDB4ODYsMHhBNywweDAwLDB4RUUsMHg4MywweEVBLDB4MDgsMHhGOCwKKzB4QzMsMHg4QSwweDg2LDB4QTcsMHgwMCwweDBDLDB4MDEsMHhFQiwweEVFLDB4OTAsMHg4QiwweDQ2LDB4MzgsMHhBOSwweDA0LDB4MDAsCisweDc0LDB4MDYsMHgyNSwweEZCLDB4RkYsMHg4OSwweDQ2LDB4MzgsMHhGOCwweEMzLDB4QUQsMHg0OSwweDQ5LDB4RTgsMHhCRSwweEZCLAorMHg4OSwweDg2LDB4OEUsMHgwMCwweEY4LDB4QzMsMHhBRCwweDQ5LDB4NDksMHhFOCwweEIyLDB4RkIsMHg4OSwweDg2LDB4OTAsMHgwMCwKKzB4RjgsMHhDMywweDgzLDB4NEUsMHgyNiwweDA0LDB4RTgsMHg5MiwweEZBLDB4RjgsMHhDMywweDkwLDB4ODMsMHg2NiwweDI2LDB4RkIsCisweEU4LDB4ODgsMHhGQSwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHg4NCwweEMwLDB4NzUsMHgwNywweDgwLDB4OEUsMHhBMywweDAwLAorMHgwNCwweEY4LDB4QzMsMHg4MCwweEE2LDB4QTMsMHgwMCwweEZCLDB4RjgsMHhDMywweEFDLDB4NDksMHg4MywweEMyLDB4MDgsMHgzQywKKzB4MDIsMHg3NiwweDAyLDB4MzIsMHhDMCwweDNDLDB4MDEsMHg3NCwweDEyLDB4NzcsMHgwQiwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsCisweEVGLDB4ODgsMHg4NiwweEE3LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwOCwweEY4LDB4QzMsMHg4QSwweDg2LDB4QTcsMHgwMCwweDBDLAorMHgxMCwweEVCLDB4RUUsMHg5MCwweDUyLDB4ODMsMHhDMiwweDA2LDB4QjAsMHhCRiwweEVFLDB4NTIsMHg4MywweEMyLDB4MDQsMHhBQywKKzB4NDksMHhFRSwweDVBLDB4OEEsMHg4NiwweEE4LDB4MDAsMHhFRSwweDVBLDB4RjgsMHhDMywweDkwLDB4NTIsMHg4MywweEMyLDB4MDYsCisweEIwLDB4QkYsMHhFRSwweDUyLDB4ODMsMHhDMiwweDA4LDB4RUIsMHhFNiwweDkwLDB4QUMsMHg0OSwweEY4LDB4QzMsMHhBQywweDQ5LAorMHhFOCwweEI0LDB4RUUsMHg3MywweDAzLDB4RTgsMHhGNywweEVFLDB4RjgsMHhDMywweDhBLDB4ODYsMHhBRiwweDAwLDB4MjQsMHg3RiwKKzB4RTgsMHhCRCwweEY5LDB4QjgsMHhGMCwweDAwLDB4RTgsMHg2NiwweEYyLDB4ODEsMHg2NiwweDI2LDB4RkYsMHhGMywweEU4LDB4MjMsCisweEZBLDB4RTgsMHhEMiwweEY5LDB4RjgsMHhDMywweEI4LDB4ODAsMHgwMCwweEU4LDB4MzcsMHhGMiwweDgwLDB4NEUsMHgyNywweDA4LAorMHhFOCwweDExLDB4RkEsMHhFOCwweEMwLDB4RjksMHhGOCwweEMzLDB4QjgsMHg4MCwweDAwLDB4RTgsMHg0MSwweEYyLDB4ODEsMHg2NiwKKzB4MjYsMHhGRiwweEY3LDB4RTgsMHhGRSwweEY5LDB4RTgsMHhBRCwweEY5LDB4RjgsMHhDMywweDkwLDB4QjgsMHgxMCwweDAwLDB4RTgsCisweDExLDB4RjIsMHg4MCwweDRFLDB4MjcsMHgwNCwweEU4LDB4RUIsMHhGOSwweEU4LDB4OUEsMHhGOSwweEY4LDB4QzMsMHhCOCwweDEwLAorMHgwMCwweEU4LDB4RkYsMHhGMSwweDgxLDB4NjYsMHgyNiwweEZGLDB4RkIsMHhFOCwweEQ4LDB4RjksMHhGOCwweEMzLDB4QUMsMHg0OSwKKzB4RjgsMHhDMywweDgzLDB4QzIsMHgwNiwweDhBLDB4ODYsMHhBOCwweDAwLDB4MEMsMHg0MCwweDg4LDB4ODYsMHhBOCwweDAwLDB4RUUsCisweDgzLDB4RUEsMHgwNiwweEY4LDB4QzMsMHg5MCwweDgzLDB4QzIsMHgwNiwweDhBLDB4ODYsMHhBOCwweDAwLDB4MjQsMHhCRiwweEVCLAorMHhFQSwweDkwLDB4QUMsMHg0OSwweDhBLDB4RTAsMHg4MCwweEMyLDB4MEEsMHhFQywweDgwLDB4RUEsMHgwQSwweEE4LDB4MjAsMHg3NCwKKzB4MDUsMHg4QSwweEM0LDB4RUUsMHhGOCwweEMzLDB4MDYsMHg1MSwweDU3LDB4OEIsMHg0RSwweDI0LDB4RTMsMHgzNCwweDQ5LDB4ODksCisweDRFLDB4MjQsMHhGRiwweDQ2LDB4MUEsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4QSwweEM0LDB4QUEsMHg4OSwweDdFLAorMHgyMiwweDhCLDB4NDYsMHgyNiwweDI0LDB4RkQsMHg4OSwweDQ2LDB4MjYsMHg3NSwweDI5LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwKKzB4MDIsMHg3NSwweDIxLDB4ODAsMHhDMiwweDAyLDB4MEMsMHgwMiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RUUsMHg4MCwweEVBLDB4MDIsCisweEVCLDB4MTIsMHhDNCwweDdFLDB4MDAsMHgzQiwweDdFLDB4MUUsMHg3NiwweDBBLDB4NEYsMHgyNiwweDg4LDB4MjUsMHg4OSwweDdFLAorMHgwMCwweEZGLDB4NDYsMHgxQSwweDVGLDB4NTksMHgwNywweEY4LDB4QzMsMHg5MCwweEFDLDB4QUQsMHg4MywweEU5LDB4MDMsMHg4NSwKKzB4QzAsMHg3NCwweDA1LDB4M0QsMHgwMCwweDIwLDB4NzIsMHgwNSwweEI4LDB4RkYsMHhGRiwweEVCLDB4MDMsMHhDMSwweEUwLDB4MDMsCisweDNCLDB4ODYsMHg5NCwweDAwLDB4NzQsMHgyNiwweDg5LDB4ODYsMHg5NCwweDAwLDB4OEIsMHhEOCwweDUyLDB4ODMsMHhDMiwweDA2LAorMHg4QSwweDg2LDB4QTgsMHgwMCwweDhBLDB4RTAsMHgwQywweDgwLDB4RUUsMHg4MywweEVBLDB4MDYsMHg4QSwweEMzLDB4RUUsMHg4MywKKzB4QzIsMHgwMiwweDhBLDB4QzcsMHhFRSwweDgzLDB4QzIsMHgwNCwweDhBLDB4QzQsMHhFRSwweDVBLDB4RjgsMHhDMywweEIwLDB4ODgsCisweDg4LDB4ODYsMHhCQywweDAwLDB4RTgsMHg4QywweEYyLDB4MzMsMHhEQiwweDhBLDB4ODYsMHhBNSwweDAwLDB4QTgsMHgwMiwweDc0LAorMHgwMywweDgwLDB4Q0IsMHgwMSwweEE4LDB4MDUsMHg3NCwweDAzLDB4ODAsMHhDQiwweDAyLDB4QTgsMHgwOCwweDc0LDB4MDMsMHg4MCwKKzB4Q0IsMHgwNCwweEY2LDB4ODYsMHhBNywweDAwLDB4MTAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDEwLDB4OEEsMHg4NiwweEE5LDB4MDAsCisweEY2LDB4QzMsMHgwNCwweDc1LDB4MEEsMHg4MywweEMyLDB4MEMsMHhFQywweDgzLDB4RUEsMHgwQywweEMwLDB4RTgsMHgwNCwweDhBLAorMHhFMCwweDhBLDB4ODYsMHhBRiwweDAwLDB4QTgsMHg4MCwweDc0LDB4MDgsMHhGNiwweEM0LDB4MDEsMHg3NSwweDAzLDB4ODAsMHhDQiwKKzB4MjAsMHhGNiwweDg2LDB4QTcsMHgwMCwweDAyLDB4NzUsMHgwQSwweEY3LDB4NDYsMHgzOCwweDA0LDB4MDAsMHg3NCwweDAzLDB4ODAsCisweENCLDB4NDAsMHg4OCwweDlFLDB4QkUsMHgwMCwweEZFLDB4ODYsMHhCNCwweDAwLDB4QjAsMHgwQSwweEU4LDB4RjMsMHhEQiwweEY4LAorMHhDMywweEZFLDB4ODYsMHhCNCwweDAwLDB4QjAsMHgwQSwweEU4LDB4RTgsMHhEQiwweEY4LDB4QzMsMHhBQywweDQ5LDB4M0MsMHgwMiwKKzB4NzQsMHgzNywweDc3LDB4MTAsMHg4NCwweEMwLDB4NzQsMHgwNiwweDgwLDB4NEUsMHgzOCwweDAxLDB4RjgsMHhDMywweDgwLDB4NjYsCisweDM4LDB4RkUsMHhGOCwweEMzLDB4OEIsMHg0NiwweDM4LDB4MjUsMHhGRiwweEY3LDB4ODksMHg0NiwweDM4LDB4QTksMHgwMCwweDA0LAorMHg3NSwweEVBLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDAxLDB4NzUsMHhFMiwweDBDLDB4MDUsMHg4MywweEMyLDB4MDIsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4RUUsMHg4MywweEVBLDB4MDIsMHhGOCwweEMzLDB4ODEsMHg0RSwweDM4LDB4MDAsMHgwOCwweDhBLDB4ODYsCisweEE1LDB4MDAsMHhBOCwweDAxLDB4NzQsMHhDNiwweDI0LDB4RkEsMHhFQiwweEUyLDB4QUQsMHg0OSwweDQ5LDB4RjgsMHhDMywweDkwLAorMHhFOCwweDExLDB4RkEsMHhGRSwweDg2LDB4QjksMHgwMCwweEIwLDB4MEUsMHhFOCwweDg2LDB4REIsMHhGOCwweEMzLDB4QjAsMHhGRiwKKzB4RTgsMHhCRiwweEVDLDB4RjgsMHhDMywweDkwLDB4ODMsMHg2NiwweDdBLDB4RkIsMHhCMCwweDAwLDB4RTgsMHg3MywweERCLDB4RjgsCisweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHg1MywweEQ5LDB4NzIsMHgxMSwweDM2LDB4ODgsMHgxRSwweDFBLDB4MDEsMHgzNiwweEEwLAorMHg4RSwweDEyLDB4MEEsMHhDMywweDUyLDB4QkEsMHgwMCwweDAxLDB4RUUsMHg1QSwweEY4LDB4QzMsMHhBQywweDQ5LDB4MzIsMHhFNCwKKzB4MzYsMHhBMywweDg2LDB4MTIsMHgwNSwweDA2LDB4MDAsMHgzNiwweDhCLDB4MUUsMHg4OCwweDEyLDB4MkIsMHhEOCwweDM2LDB4ODksCisweDFFLDB4OEEsMHgxMiwweEY4LDB4QzMsMHg5MCwweEFELDB4OEIsMHhEOCwweEFELDB4ODMsMHhFOSwweDA0LDB4MDMsMHhDMywweDJCLAorMHg0NiwweDc2LDB4ODksMHg0NiwweDc4LDB4RjcsMHg0NiwweDdBLDB4MDIsMHgwMCwweDc0LDB4MEEsMHg4MywweDY2LDB4N0EsMHhGRCwKKzB4QjgsMHgwMCwweDAwLDB4RTgsMHgxQywweERCLDB4RjgsMHhDMywweDA2LDB4MTYsMHgwNywweEFDLDB4NDksMHgyNSwweDBGLDB4MDAsCisweDZCLDB4QzAsMHgwOSwweDhELDB4QkUsMHhGRCwweDAwLDB4MDMsMHhGOCwweEFDLDB4NDksMHgyNSwweDBGLDB4MDAsMHhBQSwweDg1LAorMHhDMCwweDc0LDB4MDgsMHgyQiwweEM4LDB4NTEsMHg4QiwweEM4LDB4RjMsMHhBNCwweDU5LDB4RTgsMHgyNywweEYwLDB4RTgsMHg0NCwKKzB4MDMsMHgwNywweEY4LDB4QzMsMHgzMywweEMwLDB4QUMsMHg0OSwweDM2LDB4QTMsMHhCMiwweDEzLDB4MzYsMHhBMywweEIwLDB4MTMsCisweEY4LDB4QzMsMHg4MywweDY2LDB4N0EsMHhFRiwweEU4LDB4MkMsMHgwMywweEY4LDB4QzMsMHg5MCwweDgzLDB4NEUsMHg3QSwweDEwLAorMHhFQiwweEY0LDB4RTgsMHg5QiwweEYwLDB4RjgsMHhDMywweDkwLDB4QUQsMHgzQywweDE5LDB4NzcsMHgwRSwweDNDLDB4MTksMHg3NywKKzB4MEEsMHg4QiwweEY4LDB4ODEsMHhFNywweEZGLDB4MDAsMHg4OCwweEE2LDB4QzQsMHgwMCwweEY4LDB4QzMsMHg5MCwweDgzLDB4NEUsCisweDI2LDB4MjAsMHhBQywweDQ5LDB4MzIsMHhFNCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4QzEsMHhFMywweDAyLDB4MDMsMHhDMywweDg5LAorMHg0NiwweDZFLDB4ODMsMHg0RSwweDQ4LDB4MDQsMHhCMCwweDA2LDB4RTgsMHg5NywweERBLDB4NDksMHg0NiwweEY5LDB4QzMsMHg5MCwKKzB4RkUsMHg4NiwweEIzLDB4MDAsMHhCMCwweDBBLDB4RTgsMHg4OSwweERBLDB4RjgsMHhDMywweDkwLDB4MzMsMHhDMCwweEFDLDB4NDksCisweDZCLDB4QzAsMHgwQSwweDg5LDB4ODYsMHg4QSwweDAwLDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweDMyLDB4RTQsMHgzRCwweDBBLAorMHgwMCwweDc3LDB4MDUsMHhCOCwweDBBLDB4MDAsMHhFQiwweDA4LDB4M0QsMHg1QSwweDAwLDB4NzIsMHgwMywweEI4LDB4NUEsMHgwMCwKKzB4NTEsMHhGNywweEQ4LDB4MDUsMHg2NCwweDAwLDB4OEIsMHhDOCwweDhCLDB4NDYsMHg0NCwweEY3LDB4RTEsMHhCOSwweDY0LDB4MDAsCisweEY3LDB4RjEsMHg4OSwweDQ2LDB4NDYsMHg1OSwweEY4LDB4QzMsMHhBQywweDQ5LDB4RTgsMHg4NSwweEVCLDB4RjgsMHhDMywweDkwLAorMHhBQywweDQ5LDB4ODQsMHhDMCwweDc1LDB4MDcsMHg4MSwweDY2LDB4MzgsMHhGRiwweEZELDB4RjgsMHhDMywweDgxLDB4NEUsMHgzOCwKKzB4MDAsMHgwMiwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsMHg3NSwweDA4LDB4OEEsMHg4NiwweEE5LDB4MDAsMHg4OCwweDg2LDB4QUEsCisweDAwLDB4RjgsMHhDMywweDkwLDB4NTEsMHg1NiwweEU4LDB4N0YsMHgwQywweDVFLDB4NTksMHhGOCwweEMzLDB4OTAsMHhGRSwweDg2LAorMHhCNiwweDAwLDB4QjAsMHgwQSwweEU4LDB4MEIsMHhEQSwweEY4LDB4QzMsMHg5MCwweEZFLDB4ODYsMHhCNywweDAwLDB4QjAsMHgwQSwKKzB4RTgsMHhGRiwweEQ5LDB4RjgsMHhDMywweDkwLDB4RkUsMHg4NiwweEI4LDB4MDAsMHhCMCwweDBBLDB4RTgsMHhGMywweEQ5LDB4RjgsCisweEMzLDB4OTAsMHgwMCwweDkwLDB4NTEsMHg1NSwweEFDLDB4MkUsMHhBMiwweDUyLDB4MzYsMHgzMywweEM5LDB4QUQsMHg4QiwweEY5LAorMHhDMSwweEU3LDB4MDUsMHhBOSwweDAxLDB4MDAsMHg3NCwweDIzLDB4MkUsMHg4QiwweEFELDB4NDQsMHgwMCwweDgzLDB4N0UsMHgwOCwKKzB4MDAsMHg3NCwweDE4LDB4MkUsMHg4MCwweDNFLDB4NTIsMHgzNiwweDAxLDB4NzQsMHgwOSwweDYwLDB4QjAsMHgwNCwweEU4LDB4QkIsCisweDBDLDB4NjEsMHhFQiwweDA3LDB4NjAsMHhCMCwweEZCLDB4RTgsMHhFQywweDBDLDB4NjEsMHg0NywweDQ3LDB4RDEsMHhFOCwweDc1LAorMHhEMiwweDQxLDB4ODMsMHhGOSwweDA0LDB4NzIsMHhDNiwweDVELDB4NTksMHg4MywweEU5LDB4MDUsMHhGNywweDQ2LDB4MzgsMHg0MCwKKzB4MDAsMHg3NCwweDA1LDB4RTgsMHg4NywweEVBLDB4RjgsMHhDMywweEU4LDB4OEQsMHhFQSwweEY4LDB4QzMsMHg5MCwweDM2LDB4QzYsCisweDA2LDB4QzgsMHgxMywweDAxLDB4RjgsMHhDMywweDMzLDB4QzAsMHhBQywweDQ5LDB4MzYsMHhBMywweDgwLDB4MTIsMHhBQywweDQ5LAorMHgzNiwweDJCLDB4MDYsMHg4OCwweDEyLDB4RjcsMHhEOCwweDM2LDB4QTMsMHg4MiwweDEyLDB4RjgsMHhDMywweDkwLDB4REUsMHgyNiwKKzB4REUsMHgyNiwweEVDLDB4MjYsMHhGMiwweDI2LDB4RjgsMHgyNiwweEZFLDB4MjYsMHgwNCwweDI3LDB4MEUsMHgyNywweDE2LDB4MjcsCisweDFFLDB4MjcsMHgyNiwweDI3LDB4MkUsMHgyNywweDM0LDB4MjcsMHhCRSwweDM0LDB4QzYsMHgzNCwweEQyLDB4MzQsMHgzQSwweDI3LAorMHg3OCwweDI3LDB4ODAsMHgyNywweDk0LDB4MjcsMHhBMCwweDI3LDB4QjQsMHgyNywweEMwLDB4MjcsMHhENCwweDI3LDB4RTAsMHgyNywKKzB4RjQsMHgyNywweDAwLDB4MjgsMHgxMCwweDI4LDB4RUMsMHgzNCwweERFLDB4MjYsMHgxRSwweDI4LDB4MjYsMHgyOCwweDJDLDB4MjgsCisweDMyLDB4MjgsMHgzOCwweDI4LDB4NEUsMHgyOCwweDhBLDB4MjgsMHgwNiwweDM1LDB4MjgsMHgzNSwweDk4LDB4MjgsMHhCRSwweDI4LAorMHhEMiwweDI4LDB4REUsMHgyOCwweEU2LDB4MjgsMHg1NCwweDM1LDB4NjIsMHgzNSwweDZDLDB4MzUsMHhFRSwweDI4LDB4QzAsMHgyOSwKKzB4QzgsMHgyOSwweENFLDB4MjksMHhFMCwweDI5LDB4NzIsMHgzNSwweDc4LDB4MzUsMHhGMCwweDI5LDB4RkMsMHgyOSwweDhFLDB4MzUsCisweDA4LDB4MkEsMHgxMiwweDJBLDB4MUMsMHgyQSwweEIwLDB4MzUsMHgzNiwweDJBLDB4QkMsMHgzNSwweDVBLDB4MkEsMHg2MiwweDJBLAorMHg2OCwweDJBLDB4Q0EsMHgzNSwweDdDLDB4MkEsMHhGOCwweDM1LDB4ODgsMHgyQSwweEE2LDB4MkEsMHhCOCwweDJBLDB4Q0MsMHgyQSwKKzB4REUsMHgyQSwweEYyLDB4MkEsMHgwMCwweDM2LDB4MEEsMHgyQiwweDI0LDB4MkIsMHgyNCwweDM2LDB4MzgsMHgyQiwweDRDLDB4MkIsCisweDg0LDB4MkIsMHgyRSwweDM2LDB4M0EsMHgzNiwweDQ2LDB4MzYsMHg1NCwweDM2LDB4RTgsMHgyQiwweEFFLDB4MzYsMHg0MCwweDJDLAorMHg2MiwweDJDLDB4QjYsMHgzNiwweDcwLDB4MjgsMHhERSwweDI2LDB4REUsMHgyNiwweEQ0LDB4MkUsMHhFOCwweDJFLDB4RjAsMHgyRSwKKzB4RjgsMHgyRSwweDAwLDB4MkYsMHgwQSwweDJGLDB4MTIsMHgyRiwweDFBLDB4MkYsMHgyMiwweDJGLDB4MkEsMHgyRiwweDQyLDB4MkYsCisweEJFLDB4MzQsMHhDNiwweDM0LDB4RDIsMHgzNCwweDUwLDB4MkYsMHg4QywweDJGLDB4OTQsMHgyRiwweEE4LDB4MkYsMHhCNCwweDJGLAorMHhDOCwweDJGLDB4RDQsMHgyRiwweEU4LDB4MkYsMHhGNCwweDJGLDB4MDgsMHgzMCwweDE0LDB4MzAsMHgxQywweDMwLDB4RUMsMHgzNCwKKzB4REUsMHgyNiwweDI0LDB4MzAsMHgzMCwweDMwLDB4MzgsMHgzMCwweDQ0LDB4MzAsMHg0QywweDMwLDB4NjIsMHgzMCwweEE0LDB4MzAsCisweDA2LDB4MzUsMHgyOCwweDM1LDB4QUEsMHgzMCwweENFLDB4MzAsMHhENiwweDMwLDB4RUEsMHgzMCwweEYyLDB4MzAsMHg1NCwweDM1LAorMHg2MiwweDM1LDB4NkMsMHgzNSwweEZBLDB4MzAsMHhDMiwweDMxLDB4QzIsMHgzMSwweEM0LDB4MzEsMHhGQSwweDMxLDB4NzIsMHgzNSwKKzB4NzgsMHgzNSwweDBBLDB4MzIsMHgxNiwweDMyLDB4OEUsMHgzNSwweDIyLDB4MzIsMHgyQywweDMyLDB4MzYsMHgzMiwweEIwLDB4MzUsCisweDRBLDB4MzIsMHhCQywweDM1LDB4NzQsMHgzMiwweDhDLDB4MzIsMHg5QSwweDMyLDB4Q0EsMHgzNSwweDlFLDB4MzIsMHhGOCwweDM1LAorMHhBQSwweDMyLDB4QzYsMHgzMiwweEQ4LDB4MzIsMHhFQywweDMyLDB4RkUsMHgzMiwweDBFLDB4MzMsMHgwMCwweDM2LDB4MTIsMHgzMywKKzB4MjYsMHgzMywweDI0LDB4MzYsMHgzMiwweDMzLDB4OUEsMHgzMywweERFLDB4MzMsMHgyRSwweDM2LDB4M0EsMHgzNiwweDQ2LDB4MzYsCisweDU0LDB4MzYsMHg1QywweDM0LDB4QUUsMHgzNiwweEFBLDB4MzQsMHhCMCwweDM0LDB4QjYsMHgzNiwweDhDLDB4MzAsMHhFMywweDI4LAorMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzUsMHgzMiwweEU4LDB4RTMsMHhFOCwweDMzLDB4QzAsMHhBQywweDQ5LDB4M0QsMHg1QiwKKzB4MDAsMHg3NywweDE5LDB4OEIsMHhEOCwweEQxLDB4RTMsMHgyRSwweEZGLDB4OTcsMHhDRSwweDM2LDB4NzIsMHgwQiwweDg1LDB4QzksCisweDc1LDB4RTgsMHg4QiwweDQ2LDB4NDgsMHhFOCwweDFBLDB4MEMsMHhDMywweDRFLDB4NDEsMHhDMywweDZBLDB4MDAsMHgxRiwweEM2LAorMHgwNiwweDkzLDB4MTIsMHgwQywweDlDLDB4MEUsMHhFOCwweDYzLDB4REEsMHhFOCwweEJDLDB4RTgsMHgzMywweEMwLDB4QUMsMHg0OSwKKzB4M0QsMHg1QiwweDAwLDB4NzcsMHhFNywweDhCLDB4RDgsMHhEMSwweEUzLDB4MkUsMHhGRiwweDk3LDB4ODYsMHgzNywweDcyLDB4RDksCisweDg1LDB4QzksMHg3NSwweEU4LDB4QzMsMHhGNywweDQ2LDB4N0EsMHgxMCwweDAwLDB4NzUsMHgwRiwweDgzLDB4QkUsMHg4NCwweDAwLAorMHgwMCwweDc0LDB4MDgsMHhCOCwweDQ4LDB4M0EsMHg4OSwweDg2LDB4ODAsMHgwMCwweEMzLDB4ODEsMHhCRSwweDgwLDB4MDAsMHhFQywKKzB4M0MsMHg3NCwweEY3LDB4ODMsMHhCRSwweDg4LDB4MDAsMHgwMCwweDc1LDB4MDUsMHhCOCwweEVDLDB4M0MsMHhFQiwweEU3LDB4RjcsCisweDQ2LDB4N0EsMHgwOCwweDAwLDB4NzUsMHg0MCwweDFFLDB4NjAsMHg4QiwweDhFLDB4ODgsMHgwMCwweDNCLDB4NEUsMHg3NCwweDc3LAorMHgzMywweDNCLDB4NEUsMHg3OCwweDc3LDB4MkUsMHhDNCwweDdFLDB4MTAsMHg4QiwweERGLDB4MjYsMHgwMywweDNELDB4NDcsMHg0NywKKzB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RCwweEI2LDB4RjQsMHgwMCwweDhCLDB4QzEsMHhGNywweDQ2LDB4N0EsMHgwMSwweDAwLDB4NzUsCisweDFELDB4RjMsMHhBNCwweDI2LDB4MDEsMHgwNywweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweEIwLAorMHgwQywweEU4LDB4M0UsMHhENywweDYxLDB4MUYsMHhDNywweDg2LDB4ODgsMHgwMCwweDAwLDB4MDAsMHhFQiwweEFDLDB4RTMsMHhFMywKKzB4NTAsMHg5MCwweEFDLDB4MjQsMHg3RiwweEFBLDB4RTIsMHhGQSwweDU4LDB4RUIsMHhEOCwweDkwLDB4OEIsMHg4RSwweDg4LDB4MDAsCisweEUzLDB4NDYsMHg4QiwweDlFLDB4OEEsMHgwMCwweDg1LDB4REIsMHg3NCwweDNFLDB4QkEsMHg1MCwweEZGLDB4RUQsMHgyQiwweDg2LAorMHg4MiwweDAwLDB4M0IsMHhDMywweDcyLDB4MzcsMHg4RCwweEI2LDB4RjQsMHgwMCwweEM0LDB4N0UsMHgxMCwweDhCLDB4REYsMHgyNiwKKzB4MDMsMHgzRCwweDQ3LDB4NDcsMHg4QiwweEMxLDB4MTYsMHgxRiwweEY3LDB4NDYsMHg3QSwweDAxLDB4MDAsMHg3NSwweDI0LDB4RjMsCisweEE0LDB4MjYsMHgwMSwweDA3LDB4MjksMHg0NiwweDc4LDB4MDEsMHg0NiwweDc2LDB4MjksMHg0NiwweDc0LDB4QzcsMHg4NiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHhCMCwweDBDLDB4RTgsMHhEQSwweEQ2LDB4ODMsMHg2NiwweDdBLDB4RjcsMHhDMywweEIwLDB4MDAsMHhFOCwKKzB4RDAsMHhENiwweEMzLDB4RTMsMHhEQywweDUwLDB4QUMsMHgyNCwweDdGLDB4QUEsMHhFMiwweEZBLDB4NTgsMHhFQiwweEQyLDB4OTAsCisweDFFLDB4NjAsMHgzMywweEMwLDB4OEUsMHhEOCwweDhELDB4QjYsMHhGRCwweDAwLDB4OEIsMHg4NiwweDg4LDB4MDAsMHg4QiwweDk2LAorMHg4NCwweDAwLDB4M0EsMHgwNCwweDc1LDB4MTAsMHg4QiwweERFLDB4NDYsMHg4QiwweEM4LDB4OEQsMHhCRSwweEY0LDB4MDAsMHhGMywKKzB4QTYsMHg3NCwweDY2LDB4OEIsMHhGMywweDkwLDB4ODMsMHhDNiwweDA5LDB4NEEsMHg3NSwweEU2LDB4OEQsMHhCNiwweEZELDB4MDAsCisweDhCLDB4OTYsMHg4NCwweDAwLDB4M0EsMHgwNCwweDczLDB4MTAsMHg4QiwweERFLDB4NDYsMHg4QiwweEM4LDB4OEQsMHhCRSwweEY0LAorMHgwMCwweEYzLDB4QTYsMHg3NCwweDc2LDB4OEIsMHhGMywweDkwLDB4ODMsMHhDNiwweDA5LDB4NEEsMHg3NSwweEU2LDB4OEQsMHhCNiwKKzB4RjQsMHgwMCwweEFDLDB4RjcsMHg0NiwweDdBLDB4MDEsMHgwMCwweDc0LDB4MDIsMHgyNCwweDdGLDB4MUUsMHhDNSwweDVFLDB4MTAsCisweDhCLDB4MzcsMHg4OCwweDQwLDB4MDIsMHg0NiwweDg5LDB4MzcsMHhGRiwweDRFLDB4NzgsMHhGRiwweDQ2LDB4NzYsMHhGRiwweDRFLAorMHg3NCwweDFGLDB4OEIsMHg4RSwweDg4LDB4MDAsMHg0OSwweDg5LDB4OEUsMHg4OCwweDAwLDB4RTMsMHg0MywweDhELDB4QjYsMHhGNCwKKzB4MDAsMHg4QiwweEZFLDB4NDYsMHhGMywweEE0LDB4RTksMHg3RCwweEZGLDB4QzUsMHg3NiwweDEwLDB4OEIsMHgxQywweDg1LDB4REIsCisweDc0LDB4MDgsMHgwMywweEYzLDB4ODMsMHhDNiwweDAzLDB4ODMsMHhFNiwweEZFLDB4OEIsMHg4NiwweDg0LDB4MDAsMHgyQiwweEMyLAorMHhCNCwweDgwLDB4ODksMHgwNCwweDQ2LDB4NDYsMHhDNywweDA0LDB4MDAsMHgwMCwweDg5LDB4NzYsMHgxMCwweDgzLDB4NEUsMHg3QSwKKzB4MDQsMHhDNywweDg2LDB4ODgsMHgwMCwweDAwLDB4MDAsMHg2MSwweDFGLDB4RjksMHhDMywweDMzLDB4QzAsMHg2MSwweDFGLDB4QzMsCisweEIwLDB4ODAsMHg4NCwweEMwLDB4NjEsMHgxRiwweEMzLDB4OTAsMHg4QiwweDRFLDB4NzgsMHgyQiwweDhFLDB4ODgsMHgwMCwweDc2LAorMHgyNywweDg5LDB4QjYsMHg4QywweDAwLDB4OEIsMHg1RSwweDc0LDB4M0IsMHhDQiwweDcyLDB4MDIsMHg4QiwweENCLDB4M0IsMHhDOCwKKzB4NzIsMHgwMiwweDhCLDB4QzgsMHg4QiwweEMxLDB4RTMsMHg0NCwweDMzLDB4RDIsMHg4RSwweEMyLDB4OEIsMHhEMSwweDgzLDB4QkUsCisweDg4LDB4MDAsMHgwMCwweDc0LDB4MDYsMHhFOSwweDhFLDB4MDAsMHgzMywweEMwLDB4QzMsMHg4QiwweDVFLDB4MTAsMHgwMywweDFGLAorMHg0MywweDQzLDB4NTIsMHhGNywweDQ2LDB4N0EsMHgwMSwweDAwLDB4NzUsMHgyQSwweEFDLDB4OEQsMHhCRSwweEU0LDB4MDAsMHg4QiwKKzB4OEUsMHg4NiwweDAwLDB4RjIsMHhBRSwweDc0LDB4MzQsMHg4OCwweDA3LDB4NDMsMHg0QSwweDc1LDB4RUQsMHg1OCwweDhCLDB4NUUsCisweDEwLDB4MDEsMHgwNywweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweDhCLDB4QzYsMHgyQiwweDg2LAorMHg4QywweDAwLDB4QzMsMHg5MCwweEFDLDB4OEQsMHhCRSwweEU0LDB4MDAsMHg4QiwweDhFLDB4ODYsMHgwMCwweEYyLDB4QUUsMHg3NCwKKzB4MEEsMHgyNCwweDdGLDB4ODgsMHgwNywweDQzLDB4NEEsMHg3NSwweEVCLDB4RUIsMHhEMiwweDg4LDB4ODYsMHhGNCwweDAwLDB4QzcsCisweDg2LDB4ODgsMHgwMCwweDAxLDB4MDAsMHg1OCwweDJCLDB4QzIsMHg3NCwweDBFLDB4OEIsMHg1RSwweDEwLDB4MDEsMHgwNywweDI5LAorMHg0NiwweDc4LDB4MDEsMHg0NiwweDc2LDB4MjksMHg0NiwweDc0LDB4NDAsMHhFOCwweDk0LDB4RkUsMHg3MiwweEJFLDB4NEEsMHg3NSwKKzB4MTUsMHg4MywweEJFLDB4OEEsMHgwMCwweDAwLDB4NzQsMHhCNCwweEJBLDB4NTAsMHhGRiwweEVELDB4ODksMHg4NiwweDgyLDB4MDAsCisweDgzLDB4NEUsMHg3QSwweDA4LDB4RUIsMHhBNiwweDhELDB4QkUsMHhGNCwweDAwLDB4MDMsMHhCRSwweDg4LDB4MDAsMHhBNCwweEZGLAorMHg4NiwweDg4LDB4MDAsMHhFOCwweDZBLDB4RkUsMHg3MiwweDk0LDB4NzksMHgwNiwweDRBLDB4NzQsMHg4RiwweEU5LDB4NUIsMHhGRiwKKzB4NEEsMHg3NCwweENFLDB4RUIsMHhFMSwweDkwLDB4NTAsMHhFOCwweDExLDB4Q0MsMHg4QiwweDQ2LDB4NzQsMHgzOSwweDQ2LDB4NzIsCisweDc0LDB4MjcsMHgxRSwweDU2LDB4NTEsMHgzMywweEM5LDB4QzUsMHg3NiwweDBDLDB4QUQsMHg3NCwweDEwLDB4NzgsMHgwOSwweDAzLAorMHhDOCwweDA1LDB4MDEsMHgwMCwweDI0LDB4RkUsMHgwMywweEYwLDB4M0IsMHg3NiwweDEwLDB4NzYsMHhFRCwweDI5LDB4NEUsMHg3NiwKKzB4MDEsMHg0RSwweDc4LDB4RTgsMHgzNywweENDLDB4NTksMHg1RSwweDFGLDB4NTgsMHhDMywweDkwLDB4QzQsMHg3RSwweDEwLDB4MjYsCisweDhCLDB4MUQsMHg4MywweEMzLDB4MDMsMHgyNiwweDg5LDB4MUQsMHg0QiwweDAzLDB4RkIsMHhBQiwweDkxLDB4QUEsMHhCOCwweDAzLAorMHgwMCwweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweEMzLDB4OTAsMHhDNCwweDdFLDB4MTAsMHgyNiwKKzB4OEIsMHgxRCwweDQzLDB4MjYsMHg4OSwweDFELDB4NDMsMHgwMywweEZCLDB4QUEsMHhGRiwweDRFLDB4NzgsMHhGRiwweDQ2LDB4NzYsCisweEZGLDB4NEUsMHg3NCwweEMzLDB4RTgsMHhFNSwweEZGLDB4QzMsMHg4MCwweDgxLDB4ODQsMHg4NSwweDgyLDB4ODMsMHg4NiwweDg3LAorMHg1MCwweDUzLDB4OEEsMHhEQywweDgzLDB4RTMsMHgwRSwweEQxLDB4RUIsMHgyRSwweDhBLDB4ODcsMHg5OCwweDNCLDB4MDgsMHg4NiwKKzB4QjAsMHgwMCwweEZFLDB4ODYsMHhCMSwweDAwLDB4QjAsMHgwQSwweEU4LDB4ODcsMHhENCwweDVCLDB4NTgsMHhDMywweDUwLDB4OEEsCisweEM4LDB4QjgsMHhGRiwweDAwLDB4RTgsMHg5NSwweEZGLDB4NTgsMHhDMywweDkwLDB4OEEsMHg4NiwweEJCLDB4MDAsMHhFOCwweEFCLAorMHhGRiwweEMzLDB4RTgsMHhDQiwweEZGLDB4RTgsMHhGMiwweEZGLDB4QzMsMHg5MCwweEU4LDB4QzMsMHhGRiwweEU4LDB4QjQsMHhGRiwKKzB4QzMsMHg5MCwweDMzLDB4QzAsMHhFOCwweDk1LDB4RkYsMHhDMywweEI4LDB4RkYsMHgwMCwweDMzLDB4QzksMHhFOCwweDZDLDB4RkYsCisweEMzLDB4OTAsMHhCOCwweEZGLDB4MDEsMHhCMSwweDEwLDB4RTgsMHg2MiwweEZGLDB4QzMsMHg5MCwweEMzLDB4RkMsMHgzQiwweEUyLAorMHgzQiwweEYyLDB4M0IsMHhGMiwweDNCLDB4RkMsMHgzQiwweEUyLDB4M0IsMHhFOCwweDNCLDB4RTgsMHgzQiwweEZDLDB4M0IsMHhFMiwKKzB4M0IsMHhFOCwweDNCLDB4RTgsMHgzQiwweEZDLDB4M0IsMHhFMiwweDNCLDB4RTIsMHgzQiwweEUyLDB4M0IsMHgwMCwweDEwLDB4MDAsCisweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwKKzB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHg1MSwweDUzLDB4OEIsCisweDRFLDB4MzgsMHg4MSwweEUxLDB4RkYsMHhFRSwweEE4LDB4MDQsMHg3NCwweDA0LDB4ODEsMHhDOSwweDAwLDB4MDEsMHg4QSwweEUwLAorMHg4MCwweEU0LDB4MDMsMHgyNCwweDE4LDB4RDAsMHhFNCwweDBBLDB4QzQsMHgzMywweERCLDB4OEEsMHhEOCwweDJFLDB4OEIsMHg4NywKKzB4RkQsMHgzQiwweDg5LDB4NDYsMHg3QywweDJFLDB4MEIsMHg4RiwweDFELDB4M0MsMHg4OSwweDRFLDB4MzgsMHhEMSwweEVCLDB4MkUsCisweDhBLDB4QTcsMHgzRCwweDNDLDB4NUIsMHg1OSwweEMzLDB4QUMsMHg0OSwweDNDLDB4MDEsMHg3MiwweDFELDB4NzQsMHgyMCwweDNDLAorMHgwMywweDcyLDB4MjMsMHg3NCwweDI4LDB4M0MsMHgwOCwweDcyLDB4MkIsMHg3NCwweDMwLDB4M0MsMHgyMCwweDcyLDB4MzcsMHg3NCwKKzB4M0EsMHhCQiwweERBLDB4M0IsMHgzMiwweEU0LDB4ODksMHg1RSwweDdFLDB4QzMsMHhCQiwweEEwLDB4M0IsMHhFQiwweEY1LDB4QkIsCisweDk0LDB4M0IsMHhCNCwweDAxLDB4RUIsMHhGMCwweEJCLDB4RkMsMHgzQiwweEI0LDB4MDIsMHhFQiwweEU5LDB4QkIsMHhFMiwweDNCLAorMHhCNCwweDAzLDB4RUIsMHhFMiwweEJCLDB4QkUsMHgzQiwweEI0LDB4MDQsMHhFQiwweERCLDB4QkIsMHhDQSwweDNCLDB4QUMsMHg0OSwKKzB4ODgsMHg4NiwweEJCLDB4MDAsMHhFQiwweENFLDB4QkIsMHhEMiwweDNCLDB4RUIsMHhGMywweEJCLDB4RkMsMHgzQiwweEVCLDB4QzQsCisweEE5LDB4MDQsMHgwMCwweDc1LDB4RDEsMHhBOSwweDA4LDB4MDAsMHg3NSwweERBLDB4RUIsMHhEMSwweDhCLDB4NUUsMHg3NCwweDhCLAorMHg0RSwweDc4LDB4M0IsMHhDQiwweDcyLDB4MDIsMHg4QiwweENCLDB4M0IsMHhDOCwweDcyLDB4MDIsMHg4QiwweEM4LDB4OEIsMHhDMSwKKzB4RTMsMHgyQywweEM0LDB4N0UsMHgxMCwweDhCLDB4REYsMHgyNiwweDAzLDB4M0QsMHg0NywweDQ3LDB4RjcsMHg0NiwweDdBLDB4MDEsCisweDAwLDB4NzUsMHgxQywweEY3LDB4QzcsMHgwMSwweDAwLDB4NzQsMHgwMiwweDQ5LDB4QTQsMHhEMSwweEU5LDB4RjMsMHhBNSwweDczLAorMHgwMSwweEE0LDB4MjYsMHgwMSwweDA3LDB4MjksMHg0NiwweDc4LDB4MDEsMHg0NiwweDc2LDB4MjksMHg0NiwweDc0LDB4QzMsMHg1MCwKKzB4NTMsMHhCQiwweDdGLDB4N0YsMHhGNywweEM3LDB4MDEsMHgwMCwweDc0LDB4MDUsMHg0OSwweEFDLDB4MjIsMHhDMywweEFBLDB4RDEsCisweEU5LDB4RTMsMHgxRCwweDlDLDB4QUQsMHgyMywweEMzLDB4QUIsMHg0OSwweDc0LDB4MTQsMHhBRCwweDIzLDB4QzMsMHhBQiwweDQ5LAorMHg3NCwweDBELDB4QUQsMHgyMywweEMzLDB4QUIsMHg0OSwweDc0LDB4MDYsMHhBRCwweDIzLDB4QzMsMHhBQiwweEUyLDB4RTUsMHg5RCwKKzB4NzMsMHgwNCwweEFDLDB4MjIsMHhDMywweEFCLDB4NUIsMHg1OCwweEVCLDB4QjgsMHhFOCwweENFLDB4QzksMHg4QiwweDVFLDB4MzgsCisweEY3LDB4QzMsMHgxMCwweDA0LDB4NzUsMHgwMSwweEMzLDB4RjcsMHhDMywweDQwLDB4MDAsMHg3NCwweDA1LDB4RTgsMHhCOCwweEUzLAorMHhFQiwweDAzLDB4RTgsMHhBOCwweEUzLDB4ODEsMHg2NiwweDM4LDB4RUYsMHhGQiwweEY2LDB4QzMsMHgxMCwweDc0LDB4M0MsMHhGNiwKKzB4QzMsMHgwMiwweDc0LDB4MDYsMHhFNCwweEQ4LDB4MEMsMHgwMSwweEU2LDB4RDgsMHhGNiwweEMzLDB4MDQsMHg3NCwweDExLDB4ODMsCisweEMyLDB4MDgsMHg4QSwweDg2LDB4QTcsMHgwMCwweDBDLDB4MDEsMHhFRSwweDg4LDB4ODYsMHhBNywweDAwLDB4ODMsMHhFQSwweDA4LAorMHhGNiwweEMzLDB4MDgsMHg3NCwweDBGLDB4RTgsMHg4QiwweEUzLDB4NzIsMHgwQSwweDhBLDB4ODYsMHhDMCwweDAwLDB4RTYsMHgzOCwKKzB4QjAsMHgyMywweEU2LDB4MEEsMHhGNywweEMzLDB4MDAsMHgwNCwweDc1LDB4MDEsMHhDMywweEY3LDB4QzMsMHgwMCwweDA4LDB4NzUsCisweEY5LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhGNiwweEMzLDB4NDAsMHg3NSwweDBELDB4QTgsMHgxMCwweDc1LDB4RUMsMHgwQywweDEwLAorMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhDMywweEE4LDB4MDEsMHg3NSwweERGLDB4ODMsMHhDMiwweDAyLDB4MEMsMHgwNSwKKzB4RUUsMHg4OCwweDg2LDB4QTUsMHgwMCwweEMzLDB4QjAsMHgwMCwweEU4LDB4NDcsMHhEMiwweEVCLDB4MEYsMHhCMCwweDAyLDB4RTgsCisweDkwLDB4MEUsMHhFQiwweDA4LDB4ODMsMHg2NiwweDM4LDB4REYsMHg4MywweDRFLDB4N0EsMHgwMiwweDMzLDB4QzAsMHg4RSwweEQ4LAorMHhGQSwweEEwLDB4OTIsMHgxMiwweDQwLDB4QTIsMHg5MiwweDEyLDB4M0MsMHgwNSwweDcyLDB4MUUsMHhDNiwweDA2LDB4OTIsMHgxMiwKKzB4MDAsMHhGQiwweEIwLDB4MDEsMHhFOCwweDZCLDB4MEUsMHhGQSwweEExLDB4MjYsMHgwMSwweDIzLDB4MDYsMHgyQSwweDAxLDB4QTgsCisweDAxLDB4NzUsMHgwNywweEU4LDB4RTIsMHgwNywweEU4LDB4NjEsMHgwOSwweDkwLDB4QjAsMHgwMCwweEU4LDB4MzcsMHhEMiwweEZCLAorMHg4NSwweEVELDB4NzQsMHhCOSwweEZBLDB4RjcsMHg0NiwweDdBLDB4NDYsMHgwMCwweDc1LDB4QzAsMHg4QiwweDQ2LDB4NzgsMHgzRCwKKzB4MEEsMHgwMCwweDcyLDB4QjAsMHg4QiwweDRFLDB4NzQsMHg4MywweEY5LDB4NTAsMHg3MiwweDlBLDB4ODMsMHg2NiwweDM4LDB4REYsCisweEM1LDB4NzYsMHgxNCwweDhCLDB4NDYsMHgzQSwweDg1LDB4QzAsMHg3NSwweDU4LDB4QUQsMHg4NSwweEMwLDB4NzUsMHgwRiwweEU4LAorMHhGOCwweEZFLDB4RjcsMHg0NiwweDdBLDB4MDgsMHgwMCwweDc0LDB4OTMsMHhFOCwweEEwLDB4RkEsMHhFQiwweDhFLDB4M0IsMHg3NiwKKzB4MDQsMHg3NiwweDIxLDB4QjksMHgwMiwweDAwLDB4MzksMHg0RSwweDJFLDB4NzcsMHgwNSwweEM3LDB4NDYsMHgyRSwweDAwLDB4MDAsCisweDU2LDB4OEIsMHg3NiwweDJDLDB4ODksMHg3NiwweDA0LDB4QzcsMHgwNCwweDAwLDB4MDAsMHg0NiwweDQ2LDB4ODksMHg3NiwweDJDLAorMHgyOSwweDRFLDB4MkUsMHg1RSwweDg1LDB4QzAsMHg3OSwweDE3LDB4RjYsMHhDNCwweDEwLDB4NzQsMHgwNSwweEZGLDB4NTYsMHg3QywKKzB4RUIsMHgwMywweEZGLDB4NTYsMHg3RSwweDg5LDB4NzYsMHgxNCwweEIwLDB4MEMsMHhFOCwweDg1LDB4RDEsMHhFQiwweDg2LDB4ODksCisweDQ2LDB4M0EsMHhGRiwweDk2LDB4ODAsMHgwMCwweDI5LDB4NDYsMHgzQSwweDg5LDB4NzYsMHgxNCwweEIwLDB4MEMsMHhFOCwweDcxLAorMHhEMSwweEU5LDB4NzEsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDA0LDB4MTAsMHgwMiwKKzB4MDEsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwKKzB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDAwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg0RSwweDQxLDB4NzgsMHg0MSwweEQwLDB4NDEsMHhGNCwweDQxLDB4MDYsMHg0MiwweDE4LDB4NDIsCisweEMzLDB4OTAsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4OSwweDdFLDB4NkMsMHg4MCwweDY2LDB4MjcsMHhGRCwweDhCLAorMHg1NiwweDI0LDB4ODMsMHhGQSwweDA0LDB4NzIsMHhFOSwweDgzLDB4RUEsMHgwMiwweDhCLDB4RDksMHgzQiwweENBLDB4NzYsMHgwMiwKKzB4OEIsMHhDQSwweEIwLDB4MEEsMHg1NywweDUxLDB4OEIsMHhGRSwweEYyLDB4QUUsMHg4QiwweEMxLDB4NTksMHg1RiwweDc1LDB4MUUsCisweDUwLDB4NDAsMHgyQiwweEM4LDB4NzQsMHgwNiwweDJCLDB4RDEsMHgyQiwweEQ5LDB4RjMsMHhBNCwweDU5LDB4NEIsMHg0QSwweDRBLAorMHhCMCwweDBELDB4QUEsMHhBNCwweDNCLDB4Q0EsMHg3NiwweDAyLDB4OEIsMHhDQSwweEUzLDB4MTMsMHhFQiwweEQ0LDB4MkIsMHhEOSwKKzB4RjcsMHhDNiwweDAxLDB4MDAsMHg3NCwweDAyLDB4QTQsMHg0OSwweEQxLDB4RTksMHhGMywweEE1LDB4NzMsMHgwMSwweEE0LDB4ODksCisweDdFLDB4MjIsMHgyQiwweDdFLDB4NkMsMHgyOSwweDdFLDB4MjQsMHgwMSwweDdFLDB4MUEsMHg4QiwweENCLDB4ODAsMHg3RSwweDI2LAorMHgwMiwweDc0LDB4MDUsMHg4MCwweDY2LDB4MjYsMHhGRCwweEMzLDB4NjAsMHhCMCwweEZELDB4RTgsMHgxOCwweDAzLDB4NjEsMHhDMywKKzB4QzMsMHg5MCwweEU4LDB4N0MsMHgwMiwweDcyLDB4RjksMHg5MCwweDgzLDB4NEUsMHgyNiwweDIwLDB4OEIsMHg0NiwweDZBLDB4ODksCisweDQ2LDB4NkUsMHg4QiwweDQ2LDB4NDgsMHgwRCwweDA0LDB4MDAsMHgyNSwweEJGLDB4RkYsMHg4OSwweDQ2LDB4NDgsMHhCMCwweDA2LAorMHhFOCwweEJGLDB4Q0YsMHhDMywweDg5LDB4N0UsMHgyMiwweDJCLDB4N0UsMHg2QywweDAxLDB4N0UsMHgxQSwweDI5LDB4N0UsMHgyNCwKKzB4ODAsMHg3RSwweDI2LDB4MDIsMHg3NCwweDA1LDB4ODMsMHg2NiwweDI2LDB4RkQsMHhDMywweDYwLDB4QjAsMHhGRCwweEU4LDB4RDUsCisweDAyLDB4NjEsMHhDMywweDkwLDB4OEEsMHhCRSwweEMyLDB4MDAsMHhFQiwweDI0LDB4RjcsMHg0NiwweDQ4LDB4NDAsMHgwMCwweDc1LAorMHhCMSwweDhFLDB4NDYsMHgwMiwweDhCLDB4N0UsMHgyMiwweDg5LDB4N0UsMHg2QywweDhCLDB4NTYsMHgyNCwweDgzLDB4RUEsMHgwQSwKKzB4NzgsMHg5RSwweDAzLDB4RDcsMHg4MCwweDY2LDB4MjcsMHhGRCwweDMzLDB4QzAsMHg4QSwweEJFLDB4QzIsMHgwMCwweEUzLDB4QjQsCisweDNCLDB4RkEsMHg3NywweEIwLDB4QUMsMHg0OSwweDkzLDB4MkUsMHg4QSwweDg3LDB4RDQsMHgzRSwweDkzLDB4MjIsMHhERiwweDc1LAorMHgxNywweEFBLDB4RTMsMHhBMCwweDNCLDB4RkEsMHg3NywweDlDLDB4QUMsMHg0OSwweDkzLDB4MkUsMHg4QSwweDg3LDB4RDQsMHgzRSwKKzB4OTMsMHgyMiwweERGLDB4NzUsMHgwMywweEFBLDB4RUIsMHhENiwweEY2LDB4QzMsMHg3RiwweDc1LDB4MDUsMHhGRiwweDQ2LDB4NjYsCisweEVCLDB4REYsMHhGNiwweEMzLDB4NDAsMHg3NSwweDBDLDB4OEIsMHhEOCwweDgzLDB4RUIsMHgwOCwweEQxLDB4RTMsMHgyRSwweEZGLAorMHhBNywweEQ0LDB4M0YsMHhGRiwweDQ2LDB4NjYsMHgyQywweDIwLDB4RUIsMHhDNywweDg1LDB4QzAsMHg3NCwweDJDLDB4ODksMHg0NiwKKzB4NkEsMHg4MywweDRFLDB4NDgsMHg0MCwweDg5LDB4N0UsMHgyMiwweDJCLDB4N0UsMHg2QywweDAxLDB4N0UsMHgxQSwweDI5LDB4N0UsCisweDI0LDB4ODAsMHg3RSwweDI2LDB4MDIsMHg3NCwweDA4LDB4ODMsMHg2NiwweDI2LDB4RkQsMHhFOCwweEEzLDB4MDEsMHhDMywweDYwLAorMHhCMCwweEZELDB4RTgsMHgzMSwweDAyLDB4NjEsMHhFOCwweDk4LDB4MDEsMHhDMywweEU5LDB4NTcsMHhGRiwweDkwLDB4OEIsMHg1RSwKKzB4NjYsMHg0QiwweDc4LDB4MDMsMHg4OSwweDVFLDB4NjYsMHhBQSwweDhCLDB4NUUsMHg2NCwweEY3LDB4QzMsMHgwMCwweDIwLDB4NzUsCisweDAzLDB4RTksMHg0MCwweEZGLDB4RjcsMHhDMywweDQwLDB4MDAsMHg3NCwweDA4LDB4OEEsMHg4NiwweEMxLDB4MDAsMHhBQSwweEU5LAorMHgzMiwweEZGLDB4QjgsMHgzMiwweDAwLDB4RUIsMHhBMywweDkwLDB4OEIsMHg1RSwweDY2LDB4ODksMHg1RSwweDY4LDB4ODMsMHhDMywKKzB4MDgsMHg4MCwweEUzLDB4RjgsMHg4OSwweDVFLDB4NjYsMHg4QiwweDVFLDB4NjQsMHg4MSwweEUzLDB4MDAsMHgxOCwweDgxLDB4RkIsCisweDAwLDB4MTgsMHg3NCwweDJELDB4QUEsMHg4NSwweERCLDB4NzQsMHgyNSwweEY3LDB4NDYsMHg2NCwweDQwLDB4MDAsMHg3NSwweDE4LAorMHg4MSwweEZCLDB4MDAsMHgxMCwweDc0LDB4MEMsMHg4QiwweDQ2LDB4NjYsMHgyQiwweDQ2LDB4NjgsMHhDMSwweEUwLDB4MDQsMHhFOSwKKzB4NjgsMHhGRiwweEI4LDB4NjQsMHgwMCwweEU5LDB4NjIsMHhGRiwweDhBLDB4ODYsMHhDMSwweDAwLDB4QUEsMHhBQSwweEU5LDB4RTMsCisweEZFLDB4NTEsMHg4QiwweDRFLDB4NjYsMHgyQiwweDRFLDB4NjgsMHhCMCwweDIwLDB4RjMsMHhBQSwweDU5LDB4RTksMHhENCwweEZFLAorMHg4QiwweDVFLDB4NjYsMHg4OSwweDVFLDB4NjgsMHg4QiwweDVFLDB4NjQsMHhGNywweEMzLDB4MjQsMHgwMCwweDc0LDB4MTAsMHhDNywKKzB4NDYsMHg2NiwweDAwLDB4MDAsMHhGNywweEMzLDB4MDQsMHgwMCwweDc0LDB4MDUsMHhCMCwweDBELDB4QUEsMHhCMCwweDBBLDB4QUEsCisweEVCLDB4NDgsMHg5MCwweDkwLDB4QUEsMHhGNywweDQ2LDB4NjQsMHgwMCwweDQwLDB4NzQsMHgwNiwweEI4LDB4RDAsMHgwNywweEU5LAorMHgxOCwweEZGLDB4RTksMHg5RiwweEZFLDB4OTAsMHhBQSwweEY3LDB4NDYsMHg2NCwweDAwLDB4ODAsMHg3NCwweDA2LDB4QjgsMHhEMCwKKzB4MDcsMHhFOSwweDA2LDB4RkYsMHhFOSwweDhELDB4RkUsMHg5MCwweDhCLDB4NUUsMHg2NiwweDg5LDB4NUUsMHg2OCwweDg1LDB4REIsCisweDc1LDB4MEMsMHg4QiwweDVFLDB4NjQsMHhGNywweEMzLDB4MTAsMHgwMCwweDc0LDB4MDYsMHhFOSwweDc2LDB4RkUsMHg4QiwweDVFLAorMHg2NCwweEY3LDB4QzMsMHgwOCwweDAwLDB4NzQsMHgyNywweEIwLDB4MEEsMHhBQSwweEY3LDB4QzMsMHgyMCwweDAwLDB4NzUsMHgxRiwKKzB4RjcsMHhDMywweDAwLDB4MDEsMHg3NSwweDAzLDB4RTksMHg1QiwweEZFLDB4RjcsMHhDMywweDQwLDB4MDAsMHg3NSwweDA2LDB4QjgsCisweDY0LDB4MDAsMHhFOSwweEM1LDB4RkUsMHg4QSwweDg2LDB4QzEsMHgwMCwweEFBLDB4QUEsMHhFOSwweDQ2LDB4RkUsMHhBQSwweEM3LAorMHg0NiwweDY2LDB4MDAsMHgwMCwweEY3LDB4QzMsMHgwMCwweDA2LDB4NzQsMHhGMSwweEY3LDB4QzMsMHg0MCwweDAwLDB4NzQsMHgxOSwKKzB4OEEsMHg4NiwweEMxLDB4MDAsMHg4MSwweEUzLDB4MDAsMHgwNiwweDgxLDB4RkIsMHgwMCwweDA0LDB4NzIsMHgwNiwweDc2LDB4MDIsCisweEFBLDB4QUEsMHhBQSwweEFBLDB4QUEsMHhBQSwweEU5LDB4MUIsMHhGRSwweDgxLDB4RTMsMHgwMCwweDA2LDB4ODEsMHhGQiwweDAwLAorMHgwNCwweDcyLDB4MEUsMHg3NiwweDA2LDB4QjgsMHg5NiwweDAwLDB4RTksMHg3RiwweEZFLDB4QjgsMHg2NCwweDAwLDB4RTksMHg3OSwKKzB4RkUsMHg4QiwweDQ2LDB4NjgsMHhFOSwweDczLDB4RkUsMHg5MCwweDM2LDB4OEIsMHgwRSwweERBLDB4MTIsMHg4MywweEY5LDB4MzIsCisweDczLDB4MUQsMHgxRSwweDA2LDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RSwweEMwLDB4OEQsMHg3NiwweDRDLDB4QkYsMHhEQywweDEyLAorMHgwMywweEY5LDB4QTUsMHhBNSwweEE1LDB4ODMsMHhDMSwweDA2LDB4ODksMHgwRSwweERBLDB4MTIsMHgwNywweDFGLDB4QzMsMHhCMCwKKzB4MDgsMHhFOCwweDZFLDB4Q0QsMHhDMywweDkwLDB4ODMsMHg2NiwweDQ4LDB4RkUsMHhFOCwweDkzLDB4QzQsMHhFOCwweEM4LDB4RkYsCisweEMzLDB4RjYsMHg0NiwweDI3LDB4MDIsMHg3NSwweDBGLDB4OUMsMHhGQSwweDgzLDB4N0UsMHgxQSwweDAwLDB4NzQsMHgwOSwweDgwLAorMHg0RSwweDI3LDB4MDEsMHg5RCwweEY5LDB4QzMsMHhGOCwweEMzLDB4NTAsMHg1MiwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsMHg3NCwKKzB4MUQsMHhFOCwweDM0LDB4REUsMHg4MywweEMyLDB4MEEsMHhFQywweEE4LDB4NDAsMHg3NSwweDI3LDB4ODMsMHhFQSwweDA4LDB4OEEsCisweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4NUEsMHg1OCwweEVCLDB4RDEsMHhFOCwweDBDLAorMHhERSwweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGQiwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg1QSwKKzB4NTgsMHhFQiwweEJDLDB4ODAsMHg0RSwweDI3LDB4MDIsMHg1QSwweDU4LDB4OUQsMHhGOCwweEMzLDB4MDgsMHg0NiwweDI2LDB4OUMsCisweEZBLDB4OEEsMHg4RSwweEE1LDB4MDAsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzUsMHgxNCwweEY2LDB4QzEsMHgwNiwweDc0LAorMHgyMywweEU4LDB4RDksMHhERCwweDhBLDB4QzEsMHgyNCwweEY5LDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4OUQsMHhDMywKKzB4RjYsMHhDMSwweDAyLDB4NzQsMHgwRiwweEU4LDB4RDAsMHhERCwweDgzLDB4QzIsMHgwMiwweDhBLDB4QzEsMHgyNCwweEZELDB4ODgsCisweDg2LDB4QTUsMHgwMCwweEVFLDB4OUQsMHhDMywweDhCLDB4NUUsMHgyNiwweDIyLDB4QzMsMHg4OCwweDQ2LDB4MjYsMHg3NCwweDAxLAorMHhDMywweDgwLDB4NjYsMHgyNywweEZELDB4OUMsMHhGQSwweDhBLDB4OEUsMHhBNSwweDAwLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwKKzB4NzUsMHgxNiwweEY2LDB4QzEsMHgwNCwweDc1LDB4MEYsMHhFOCwweDkzLDB4REQsMHg4QSwweEMxLDB4MjQsMHhGRCwweDBDLDB4MDQsCisweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweDlELDB4QzMsMHhGNiwweEMxLDB4MDIsMHg3NSwweEY5LDB4RTgsMHg4OCwweERELAorMHg4MywweEMyLDB4MEEsMHhFQywweEE4LDB4MjAsMHg3NSwweDBFLDB4ODMsMHhFQSwweDA4LDB4OEEsMHhDMSwweDBDLDB4MDIsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4RUUsMHg5RCwweEMzLDB4ODMsMHhFQSwweDBBLDB4MzMsMHhDOSwweDhBLDB4NEUsMHgxQywweDhCLDB4NDYsCisweDFBLDB4M0IsMHhDOCwweDczLDB4MUIsMHgwMSwweDRFLDB4MkEsMHgyQiwweEMxLDB4ODksMHg0NiwweDFBLDB4MUUsMHhDNSwweDc2LAorMHgwMCwweEYzLDB4NkUsMHgxRiwweDg5LDB4NzYsMHgwMCwweDgzLDB4QzIsMHgwMiwweDhBLDB4ODYsMHhBNSwweDAwLDB4RUIsMHhDRCwKKzB4ODUsMHhDMCwweDc0LDB4MTIsMHgwMSwweDQ2LDB4MkEsMHg4QiwweEM4LDB4MUUsMHhDNSwweDc2LDB4MDAsMHhGMywweDZFLDB4MUYsCisweDg5LDB4NzYsMHgwMCwweDg5LDB4NEUsMHgxQSwweEY2LDB4QzcsMHgwMSwweDc1LDB4MjMsMHg4MCwweENCLDB4MDIsMHg4OSwweDVFLAorMHgyNiwweEU4LDB4MDgsMHhDMywweDgzLDB4QzIsMHgwMiwweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGRCwweEVFLDB4ODgsMHg4NiwKKzB4QTUsMHgwMCwweEY2LDB4QzcsMHgxMCwweDc1LDB4MDUsMHhCMCwweDAyLDB4RTgsMHgxNiwweENDLDB4OUQsMHhDMywweDgzLDB4QzIsCisweDAyLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhFQiwweDg2LDB4OTAsMHg4QiwweEQxLDB4OEIsMHg0NiwweDI0LDB4M0IsMHhDOCwweDc2LAorMHgwMiwweDhCLDB4QzgsMHgyQiwweEQxLDB4MkIsMHhDMSwweDhCLDB4RDksMHhFMywweDIyLDB4ODAsMHg2NiwweDI3LDB4RkQsMHg4RSwKKzB4NDYsMHgwMiwweDhCLDB4N0UsMHgyMiwweEY3LDB4QzYsMHgwMSwweDAwLDB4NzQsMHgwMiwweEE0LDB4NDksMHhEMSwweEU5LDB4RjMsCisweEE1LDB4NzMsMHgwMSwweEE0LDB4ODksMHg3RSwweDIyLDB4ODksMHg0NiwweDI0LDB4MDEsMHg1RSwweDFBLDB4OEIsMHhDQSwweDgwLAorMHg3RSwweDI2LDB4MDIsMHg3NCwweDA1LDB4ODAsMHg2NiwweDI2LDB4RkQsMHhDMywweDYwLDB4QjAsMHhGRCwweEU4LDB4RjYsMHhGRSwKKzB4NjEsMHhDMywweDUwLDB4RTQsMHgwQSwweDg0LDB4QzAsMHg3NSwweDBBLDB4ODYsMHg4NiwweEExLDB4MDAsMHg4NCwweEMwLDB4NzQsCisweDBBLDB4RTYsMHgwQSwweDU4LDB4MEMsMHgyMCwweDg5LDB4NDYsMHg0OCwweEY5LDB4QzMsMHg1OCwweDI0LDB4REYsMHg4OSwweDQ2LAorMHg0OCwweEY4LDB4QzMsMHg5MCwweEZCLDB4QjAsMHgwMiwweEU4LDB4RTgsMHgwNywweEZBLDB4RTgsMHgyRSwweDAxLDB4RkIsMHhCMCwKKzB4MDEsMHhFOCwweERFLDB4MDcsMHhGQSwweEIwLDB4MDIsMHhFOCwweEJDLDB4Q0IsMHhGQiwweDg1LDB4RUQsMHg3NCwweEU1LDB4RkEsCisweDhFLDB4NUUsMHgwQSwweEZCLDB4OTAsMHhGQSwweDhCLDB4NDYsMHg0OCwweDhCLDB4NzYsMHg0MCwweEE4LDB4OEMsMHg3NSwweERFLAorMHhBOCwweDIwLDB4NzQsMHgxQSwweDUwLDB4RTgsMHg1NSwweERDLDB4NTgsMHhFOCwweEE2LDB4RkYsMHg3MywweDEwLDB4QjAsMHgwMiwKKzB4RTgsMHg1RiwweENCLDB4RUIsMHhDOSwweDkwLDB4MjUsMHhGRiwweDAwLDB4OEIsMHhDOCwweEVCLDB4MzYsMHg5MCwweEE4LDB4MDEsCisweDc1LDB4MjIsMHg0NiwweDgzLDB4RTYsMHhGRSwweDNCLDB4NzYsMHgwOCwweDc0LDB4NzksMHhBRCwweDhBLDB4RkMsMHhCMywweEYwLAorMHgyMiwweEZCLDB4M0EsMHhGQiwweDc0LDB4RTAsMHgzQSwweEJFLDB4QTAsMHgwMCwweDc0LDB4MkUsMHhFOCwweEQyLDB4RkQsMHg3MywKKzB4NzcsMHhFQiwweDlCLDB4OTAsMHg4QSwweEUwLDB4MjQsMHhGQywweDg4LDB4NDYsMHg0OCwweDhCLDB4NEUsMHg0QSwweEY2LDB4QzQsCisweDAyLDB4NzQsMHgxRCwweEU4LDB4QkIsMHhGRCwweDcyLDB4ODYsMHhFOCwweDEzLDB4RjMsMHg4OSwweDc2LDB4NDAsMHhFMywweDkzLAorMHg4MywweDRFLDB4NDgsMHgwMywweDg5LDB4NEUsMHg0QSwweEU5LDB4NzQsMHhGRiwweDI1LDB4RkYsMHgwRiwweDhCLDB4QzgsMHg5MCwKKzB4OEIsMHg4NiwweDk4LDB4MDAsMHg4NSwweEMwLDB4NzQsMHgxQSwweDUxLDB4OEEsMHg4RSwweEEwLDB4MDAsMHhDMCwweEU5LDB4MDQsCisweEJBLDB4MDEsMHgwMCwweEQzLDB4RTIsMHg1OSwweDIzLDB4QzIsMHg3NCwweDA4LDB4MDMsMHhGMSwweDg5LDB4NzYsMHg0MCwweEU5LAorMHg2MSwweEZGLDB4RkYsMHg1NiwweDYyLDB4RTMsMHhGNSwweDgzLDB4NEUsMHg0OCwweDAxLDB4ODksMHg0RSwweDRBLDB4ODksMHg3NiwKKzB4NDAsMHhFOSwweDNBLDB4RkYsMHg4MSwweDRFLDB4MjYsMHgwMCwweDEwLDB4OEIsMHg0NiwweDUwLDB4M0IsMHg0NiwweDQ2LDB4NzcsCisweDAzLDB4RTgsMHg1MiwweEZELDB4RTksMHgyNywweEZGLDB4OTAsMHg4OCwweEJFLDB4QTAsMHgwMCwweEVCLDB4QUMsMHgwQSwweDA2LAorMHg5MCwweDEyLDB4OEEsMHhFMCwweEJBLDB4MDYsMHgwMSwweEIwLDB4MDQsMHhFRSwweEVDLDB4ODQsMHhDMCwweDc1LDB4MTIsMHhCMCwKKzB4MDQsMHhFRSwweDhBLDB4QzQsMHhFRSwweDMyLDB4RTQsMHhBOCwweDgwLDB4NzQsMHgwNiwweEM3LDB4MDYsMHg4NCwweDEyLDB4MDAsCisweDAwLDB4ODgsMHgyNiwweDkwLDB4MTIsMHhDMywweDBBLDB4MDYsMHg5MCwweDEyLDB4OEEsMHhFMCwweEJBLDB4MDYsMHgwMSwweEVDLAorMHhBOCwweDAxLDB4NzUsMHhFRCwweEJBLDB4MDgsMHgwMSwweDhBLDB4QzQsMHhFRSwweDMyLDB4RTQsMHhBOCwweDgwLDB4NzQsMHhFMSwKKzB4QzcsMHgwNiwweDg0LDB4MTIsMHgwMCwweDAwLDB4ODgsMHgyNiwweDkwLDB4MTIsMHhDMywweDkwLDB4MzYsMHhGNywweDA2LDB4MjQsCisweDAxLDB4MDEsMHgwMCwweDc1LDB4MzAsMHgzNiwweDhCLDB4MEUsMHhEQSwweDEyLDB4ODAsMHhGOSwweDM2LDB4NzMsMHgyNiwweDMzLAorMHhDMCwweDhFLDB4QzAsMHg4RSwweEQ4LDB4QkYsMHhEQywweDEyLDB4MDMsMHhGOSwweEIwLDB4MDgsMHhFOCwweDc3LDB4Q0EsMHg4NSwKKzB4RUQsMHg3NCwweDBFLDB4OEQsMHg3NiwweDRDLDB4QTUsMHhBNSwweEE1LDB4ODAsMHhDMSwweDA2LDB4ODAsMHhGOSwweDM2LDB4NzIsCisweEU5LDB4ODksMHgwRSwweERBLDB4MTIsMHhDMywweEMzLDB4OTAsMHhGNywweDA2LDB4MjYsMHgwMSwweDAxLDB4MDAsMHg3NSwweEY2LAorMHg4QiwweDBFLDB4MjAsMHgxMywweDg1LDB4QzksMHg3NSwweEVFLDB4MzMsMHhDMCwweDhFLDB4QzAsMHg4RSwweEQ4LDB4QkYsMHgyNCwKKzB4MTMsMHhCOSwweDM2LDB4MDAsMHhCMCwweDBBLDB4RTgsMHgzRCwweENBLDB4ODUsMHhFRCwweDc1LDB4MDYsMHhFOSwweDEyLDB4MDEsCisweEU5LDB4MEEsMHgwMSwweDMzLDB4REIsMHg4QSwweDQ2LDB4NEMsMHg4QSwweEE2LDB4QjMsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDBFLAorMHg4OCwweEE2LDB4QjMsMHgwMCwweDBBLDB4REMsMHhCNCwweDBBLDB4QUIsMHg4MywweEU5LDB4MDIsMHg3NiwweEUyLDB4OEEsMHhBNiwKKzB4QjIsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDBFLDB4ODgsMHhBNiwweEIyLDB4MDAsMHgwQSwweERDLDB4QjQsMHgwOCwweEFCLDB4ODMsCisweEU5LDB4MDIsMHg3NiwweENDLDB4OEEsMHhBNiwweEIxLDB4MDAsMHhGRSwweENDLDB4NzgsMHgxOCwweDhBLDB4QkUsMHhCMCwweDAwLAorMHg3NSwweDA0LDB4ODgsMHhBNiwweEIwLDB4MDAsMHg4OCwweEE2LDB4QjEsMHgwMCwweDBBLDB4REMsMHg4QSwweEU3LDB4QUIsMHg4MywKKzB4RTksMHgwMiwweDc2LDB4QUMsMHg4QSwweEE2LDB4QjQsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDFGLDB4ODgsMHhBNiwweEI0LDB4MDAsCisweDBBLDB4REMsMHhCNCwweDBCLDB4QUIsMHg4QSwweDg2LDB4QkMsMHgwMCwweDhBLDB4QTYsMHhCRCwweDAwLDB4QUIsMHg4QiwweDg2LAorMHhCRSwweDAwLDB4QUIsMHg4MywweEU5LDB4MDYsMHg3NiwweDg4LDB4OEEsMHg0NiwweDRDLDB4OEEsMHhBNiwweEI2LDB4MDAsMHhGRSwKKzB4Q0MsMHg3OCwweDE5LDB4ODgsMHhBNiwweEI2LDB4MDAsMHgwQSwweERDLDB4QjQsMHgwQywweEFCLDB4RTgsMHhEQiwweENCLDB4QUIsCisweDhCLDB4NDYsMHgyQSwweEFCLDB4ODMsMHhFOSwweDA2LDB4NzYsMHg3NCwweDhBLDB4NDYsMHg0QywweDhBLDB4QTYsMHhCNywweDAwLAorMHhGRSwweENDLDB4NzgsMHgxOSwweDg4LDB4QTYsMHhCNywweDAwLDB4MEEsMHhEQywweEI0LDB4MEQsMHhBQiwweEU4LDB4QkEsMHhDQiwKKzB4QUIsMHg4QiwweDQ2LDB4MzQsMHhBQiwweDgzLDB4RTksMHgwNiwweDc2LDB4NTMsMHg4QSwweDQ2LDB4NEMsMHg4QSwweEE2LDB4QjgsCisweDAwLDB4RkUsMHhDQywweDc4LDB4MTksMHg4OCwweEE2LDB4QjgsMHgwMCwweDBBLDB4REMsMHhCNCwweDBFLDB4QUIsMHhBMSwweDUwLAorMHgxMiwweEFCLDB4QTEsMHg1MiwweDEyLDB4QUIsMHg4MywweEU5LDB4MDYsMHg3NiwweDMyLDB4OEEsMHg0NiwweDRDLDB4OEEsMHhBNiwKKzB4QjUsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDE4LDB4ODgsMHhBNiwweEI1LDB4MDAsMHgwQSwweERDLDB4QjQsMHgwRiwweEFCLDB4OEIsCisweDg2LDB4OUEsMHgwMCwweEFCLDB4OEIsMHg4NiwweDlDLDB4MDAsMHhBQiwweDgzLDB4RTksMHgwNiwweDc2LDB4MEYsMHg4NCwweERCLAorMHg3NSwweDAzLDB4RTksMHhFRiwweEZFLDB4QjAsMHgwQSwweEU4LDB4RjgsMHhDOCwweEU5LDB4RTcsMHhGRSwweEIwLDB4MEEsMHhFOCwKKzB4RjAsMHhDOCwweEY3LDB4RDksMHg4MywweEMxLDB4MzYsMHg4QiwweEMxLDB4MEQsMHg4MCwweDAwLDB4ODYsMHhDNCwweEEzLDB4MjIsCisweDEzLDB4NDEsMHg0MSwweDg5LDB4MEUsMHgyMCwweDEzLDB4QzMsMHhBMSwweDg0LDB4MTIsMHgyQiwweEMxLDB4NzIsMHgxMSwweEEzLAorMHg4NCwweDEyLDB4QkUsMHgyMiwweDEzLDB4RDEsMHhFOSwweEYzLDB4NkYsMHg5MCwweDg5LDB4MEUsMHgyMCwweDEzLDB4RjgsMHhDMywKKzB4RjksMHhDMywweEMzLDB4ODEsMHhFRiwweDZBLDB4MTMsMHg3NCwweEY5LDB4OEIsMHhDNywweDBELDB4ODAsMHgwMCwweDg2LDB4QzQsCisweEEzLDB4NjgsMHgxMywweDQ3LDB4NDcsMHg4OSwweDNFLDB4NjYsMHgxMywweEMzLDB4RjcsMHgwNiwweDJBLDB4MDEsMHgwMSwweDAwLAorMHg3NSwweEUwLDB4OEIsMHgwRSwweDY2LDB4MTMsMHhFMywweDA3LDB4ODAsMHhGOSwweDIwLDB4NzcsMHhENSwweDQ5LDB4NDksMHgzMywKKzB4QzAsMHg4RSwweEMwLDB4OEUsMHhEOCwweEJGLDB4NkEsMHgxMywweDhCLDB4RjcsMHgwMywweEY5LDB4ODMsMHhDNiwweDM0LDB4M0IsCisweEZFLDB4NzcsMHhDMCwweEIwLDB4MEUsMHhFOCwweEFFLDB4QzgsMHg4NSwweEVELDB4NzQsMHhCNywweDhBLDB4NDYsMHg0QywweDhBLAorMHhCNiwweEI5LDB4MDAsMHhGRSwweENFLDB4NzgsMHgxNSwweDg4LDB4QjYsMHhCOSwweDAwLDB4OEEsMHhBNiwweEE5LDB4MDAsMHg4MCwKKzB4Q0MsMHhDMCwweEFCLDB4ODQsMHhGNiwweDc0LDB4MDUsMHhCMCwweDBFLDB4RTgsMHg1NiwweEM4LDB4OEEsMHhCNiwweEJBLDB4MDAsCisweEZFLDB4Q0UsMHg3OCwweENCLDB4OEEsMHg5RSwweEE5LDB4MDAsMHg4QSwweEJFLDB4QUIsMHgwMCwweDhBLDB4NTYsMHgzRiwweDhBLAorMHhGMywweDMyLDB4RjcsMHgwQSwweEI2LDB4QUMsMHgwMCwweEM2LDB4ODYsMHhBQywweDAwLDB4MDAsMHgyMiwweEYyLDB4NzQsMHg0QiwKKzB4RjYsMHhDNiwweDA4LDB4NzQsMHgwRiwweEI0LDB4MDIsMHhGNiwweEMzLDB4MDgsMHg3NSwweDAyLDB4QjQsMHgwMywweEFCLDB4ODAsCisweEU2LDB4RjcsMHg3NCwweDM3LDB4RjYsMHhDNiwweDAxLDB4NzQsMHgwRiwweEI0LDB4MDAsMHhGNiwweEMzLDB4MDEsMHg3NSwweDAyLAorMHhCNCwweDAxLDB4QUIsMHg4MCwweEU2LDB4RkUsMHg3NCwweDIzLDB4RjYsMHhDNiwweDAyLDB4NzQsMHgwRiwweEI0LDB4MDQsMHhGNiwKKzB4QzMsMHgwMiwweDc1LDB4MDIsMHhCNCwweDA1LDB4QUIsMHg4MCwweEU2LDB4RkQsMHg3NCwweDBGLDB4RjYsMHhDNiwweDA0LDB4NzQsCisweDBBLDB4QjQsMHgwNiwweEY2LDB4QzMsMHgwNCwweDc1LDB4MDIsMHhCNCwweDA3LDB4QUIsMHhDNiwweDg2LDB4QkEsMHgwMCwweDAwLAorMHg4OCwweDlFLDB4QUIsMHgwMCwweEU5LDB4NTgsMHhGRiwweDkwLDB4QTEsMHg4NCwweDEyLDB4MkIsMHhDMSwweDcyLDB4MTEsMHhBMywKKzB4ODQsMHgxMiwweEJFLDB4NjgsMHgxMywweEQxLDB4RTksMHhGMywweDZGLDB4OTAsMHg4OSwweDBFLDB4NjYsMHgxMywweEY4LDB4QzMsCisweEY5LDB4QzMsMHhBMSwweDg0LDB4MTIsMHg0MSwweDQxLDB4MkIsMHhDMSwweDcyLDB4MjMsMHhBMywweDg0LDB4MTIsMHg4QiwweEMxLAorMHg0OCwweDQ4LDB4MzIsMHhFNCwweDBDLDB4ODAsMHg4NiwweEM0LDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4QkUsMHhEQywKKzB4MTIsMHg0OSwweDQ5LDB4RDEsMHhFOSwweEYzLDB4NkYsMHg5MCwweDg5LDB4MEUsMHhEQSwweDEyLDB4RjgsMHhDMywweEY5LDB4QzMsCisweDhBLDB4QzgsMHg4QSwweDQ2LDB4NEMsMHhCNCwweDAxLDB4ODMsMHhFQiwweDA2LDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAorMHhCOCwweDAxLDB4MDAsMHhFRiwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg4QSwweEMxLDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwKKzB4OTAsMHhFOSwweDk3LDB4MDAsMHhFOSwweEFDLDB4MDAsMHgzMywweEMwLDB4OEUsMHhEOCwweDg5LDB4MUUsMHg4NCwweDEyLDB4QzMsCisweDM2LDB4OEIsMHgxRSwweDg0LDB4MTIsMHhGQiwweDkwLDB4RkEsMHhCMCwweDBDLDB4RTgsMHg4OSwweEM3LDB4ODUsMHhFRCwweDc0LAorMHhFNiwweEM1LDB4NzYsMHgwQywweDgzLDB4RkIsMHgxNCwweDcyLDB4REIsMHhGQiwweDkwLDB4RkEsMHhBRCwweDg1LDB4QzAsMHg3OCwKKzB4QUYsMHg3NCwweEUyLDB4OEIsMHhGRSwweDAzLDB4RjgsMHgzNiwweDhCLDB4MEUsMHg4NiwweDEyLDB4M0IsMHhDMSwweDc3LDB4MDIsCisweDhCLDB4QzgsMHg4MywweEVCLDB4MDQsMHgzQiwweEQ5LDB4NzcsMHgwMiwweDhCLDB4Q0IsMHgzMywweEMwLDB4OEEsMHg0NiwweDRDLAorMHhFRiwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg4QiwweEMxLDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4NDEsMHg4MCwKKzB4RTEsMHhGRSwweDJCLDB4RDksMHg1MSwweEQxLDB4RTksMHhGMywweDZGLDB4OTAsMHg1OSwweDhCLDB4QzcsMHg0MCwweDI0LDB4RkUsCisweDNCLDB4QzYsMHg3NCwweDI3LDB4MkIsMHhGRSwweDRFLDB4NEUsMHg1MywweDhCLDB4NUUsMHgxMCwweDNCLDB4RjMsMHg3MiwweDEzLAorMHgwMywweDFGLDB4ODMsMHhDMywweDAzLDB4ODAsMHhFMywweEZFLDB4QzcsMHgwNywweDAwLDB4MDAsMHg4MywweDZFLDB4NzQsMHgwMiwKKzB4ODksMHg1RSwweDEwLDB4NUIsMHg4OSwweDNDLDB4ODksMHg3NiwweDBDLDB4RUIsMHg4OSwweDg5LDB4NzYsMHgwQywweDM5LDB4NzYsCisweDEwLDB4NzcsMHg4MSwweDcyLDB4MDgsMHg4MywweDNDLDB4MDAsMHg3NCwweDAzLDB4RTksMHg3NywweEZGLDB4RTgsMHgwRCwweEJFLAorMHhFOSwweDYyLDB4RkYsMHgzNiwweDg5LDB4MUUsMHg4NCwweDEyLDB4QjAsMHgwQywweEU4LDB4QjUsMHhDNiwweDMzLDB4QzAsMHg4RSwKKzB4RDgsMHhDMywweEExLDB4ODQsMHgxMiwweDNELDB4MTAsMHgwMCwweDcyLDB4NzcsMHhCQSwweDA0LDB4MDEsMHgzQiwweDA2LDB4ODgsCisweDEyLDB4NzUsMHgwNiwweEM3LDB4MDYsMHg3RSwweDEyLDB4MDAsMHgwMCwweDhCLDB4MEUsMHhEQSwweDEyLDB4RTMsMHgwQiwweEU4LAorMHhEMCwweEZFLDB4NzIsMHg1NywweEM3LDB4MDYsMHg3RSwweDEyLDB4RkYsMHg3RiwweDhCLDB4MEUsMHgyMCwweDEzLDB4RTMsMHgwQiwKKzB4RTgsMHhBNSwweEZELDB4NzIsMHg0NiwweEM3LDB4MDYsMHg3RSwweDEyLDB4RkYsMHg3RiwweDhCLDB4MEUsMHg2NiwweDEzLDB4RTMsCisweDBCLDB4RTgsMHg5NCwweEZFLDB4NzIsMHgzNSwweEM3LDB4MDYsMHg3RSwweDEyLDB4RkYsMHg3RiwweEExLDB4MjgsMHgwMSwweEE5LAorMHgwMSwweDAwLDB4NzUsMHgwMywweEU4LDB4RjksMHhGRSwweDgwLDB4M0UsMHg4RCwweDEyLDB4MDAsMHg3NSwweDFELDB4QTEsMHg4NCwKKzB4MTIsMHgzRCwweDIwLDB4MDAsMHg3NiwweDE1LDB4M0IsMHgwNiwweDgyLDB4MTIsMHg3NiwweDA5LDB4QTEsMHg3RSwweDEyLDB4M0IsCisweDA2LDB4ODAsMHgxMiwweDcyLDB4MEMsMHg4MCwweDBFLDB4OTAsMHgxMiwweDgwLDB4QzMsMHhCMCwweDgwLDB4RkYsMHgxNiwweDdDLAorMHgxMiwweEMzLDB4ODAsMHgwRSwweDkwLDB4MTIsMHg0MCwweEMzLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxNywKKzB4OUMsMHgwRSwweEU4LDB4QjcsMHhDOCwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MjAsMHg5QywweDBFLDB4RTgsCisweEFBLDB4QzgsMHg2QSwweDAwLDB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDE2LDB4OUMsMHgwRSwweEU4LDB4OUQsMHhDOCwweDkwLAorMHhCQSwweDA2LDB4MDEsMHhFQywweEE4LDB4MjAsMHg3NSwweENBLDB4RkIsMHg5MCwweEZBLDB4QkEsMHgwNCwweDAxLDB4RUQsMHg5MCwKKzB4OTAsMHg5MCwweDkwLDB4OTAsMHgzQSwweDA2LDB4OTQsMHgxMiwweDc3LDB4QkUsMHgzMywweERCLDB4OEEsMHhEOCwweEQxLDB4RTMsCisweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHhDNCwweDdFLDB4MDgsMHg4NSwweEZGLDB4NzQsMHhCOSwweEY2LDB4QzQsMHhDMCwweDc1LAorMHg1NSwweDMyLDB4QzAsMHhDMSwweEUwLDB4MDIsMHg4MCwweEU0LDB4RjAsMHg4QiwweEYwLDB4RUQsMHg5MCwweDkwLDB4OTAsMHg5MCwKKzB4OTAsMHg4NSwweEMwLDB4NzQsMHhCQiwweDhCLDB4QzgsMHg0MSwweDgwLDB4RTEsMHhGRSwweDBCLDB4QzYsMHg4QiwweDVFLDB4NTAsCisweDRCLDB4NEIsMHgyQiwweEQ5LDB4NzgsMHg5QywweEFCLDB4OEIsMHhDMSwweDQwLDB4NDAsMHgwMSwweDQ2LDB4NEUsMHhEMSwweEU5LAorMHhGMywweDZELDB4OTAsMHg4OSwweDVFLDB4NTAsMHg4OSwweDdFLDB4MDgsMHg4QiwweDQ2LDB4MjYsMHg4MCwweEU0LDB4RUYsMHg4OSwKKzB4NDYsMHgyNiwweEY2LDB4QzQsMHgwMSwweDc1LDB4MEMsMHhGNywweDQ2LDB4NDgsMHgwQywweDAwLDB4NzUsMHgwNSwweEIwLDB4MDIsCisweEU4LDB4N0YsMHhDNSwweEU5LDB4N0EsMHhGRiwweDg2LDB4QzQsMHg4QiwweEM4LDB4ODMsMHhFMSwweDNGLDB4NDEsMHg4MCwweEUxLAorMHhGRSwweEUzLDB4MEEsMHgzQywweDgwLDB4NzIsMHgwOSwweDI0LDB4M0YsMHhCNCwweEYwLDB4RUIsMHhCMCwweEU5LDB4NjAsMHhGRiwKKzB4MjUsMHgzRiwweDAwLDB4MzMsMHhGRiwweDhFLDB4QzcsMHhCRiwweDk2LDB4MTIsMHg4QiwweEY3LDB4RDEsMHhFOSwweEYzLDB4NkQsCisweDkwLDB4OEIsMHhDOCwweEU4LDB4NDgsMHhFRCwweEU5LDB4NDcsMHhGRiwweDkwLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLAorMHgxMiwweDFCLDB4OUMsMHgwRSwweEU4LDB4RDUsMHhDNywweDkwLDB4NjAsMHgxRSwweDA2LDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RSwKKzB4QzAsMHhCQSwweDA2LDB4MDEsMHhFQywweEE4LDB4MDQsMHg3NCwweEUxLDB4QjAsMHgwNiwweEVFLDB4RUMsMHhBMiwweDhDLDB4MTIsCisweEE4LDB4NDAsMHg3NCwweDExLDB4QTEsMHg4OCwweDEyLDB4QTMsMHg4NCwweDEyLDB4QzYsMHgwNiwweDhELDB4MTIsMHgwMCwweEU4LAorMHg2MCwweEZFLDB4QTAsMHg4QywweDEyLDB4QTgsMHg4MCwweDc0LDB4MDMsMHhFOCwweDA0LDB4RkYsMHhCOCwweDAwLDB4ODAsMHhCQSwKKzB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHg5MCwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MUIsCisweDlDLDB4MEUsMHhFOCwweDg3LDB4QzcsMHg5MCwweDYwLDB4MUUsMHgwNiwweDMzLDB4QzAsMHg4RSwweEQ4LDB4OEUsMHhDMCwweEJBLAorMHgwNiwweDAxLDB4RUMsMHhBOCwweDA0LDB4NzQsMHhFMSwweEJBLDB4MDgsMHgwMSwweEVDLDB4QTIsMHg4QywweDEyLDB4QTgsMHg0MCwKKzB4NzQsMHgxMSwweEExLDB4ODgsMHgxMiwweEEzLDB4ODQsMHgxMiwweEM2LDB4MDYsMHg4RCwweDEyLDB4MDAsMHhFOCwweDEyLDB4RkUsCisweEEwLDB4OEMsMHgxMiwweEE4LDB4ODAsMHg3NCwweDAzLDB4RTgsMHhCNiwweEZFLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLAorMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHhFRSwweDg2LDB4RTAsMHhFRSwweDg2LDB4RTAsMHhFQywweDg2LDB4RTAsMHhFQywKKzB4ODYsMHhFMCwweDgwLDB4RTEsMHhGRSwweEYzLDB4NkMsMHg5MCwweDgwLDB4RTEsMHhGRSwweEYzLDB4NkUsMHg5MCwweDA1LDB4MDAsCisweDc1LDB4NDcsMHhBOCwweDRCLDB4MDUsMHgwMCwweDc1LDB4NDgsMHhBOCwweDRCLDB4MDUsMHgwMCwweEEzLDB4NDgsMHhBOCwweDRCLAorMHgwNSwweDAwLDB4MzUsMHg0OSwweEE4LDB4NEIsMHgwNiwweDAwLDB4OTgsMHg0OCwweDk2LDB4NEIsMHgwNiwweDAwLDB4QkEsMHg0OCwKKzB4OTYsMHg0QiwweDA2LDB4MDAsMHhDMywweDQ4LDB4OTYsMHg0QiwweDA2LDB4MDAsMHhDQiwweDQ4LDB4OTYsMHg0QiwweDA2LDB4MDAsCisweDIwLDB4NDksMHg5NiwweDRCLDB4MDYsMHgwMCwweDI4LDB4NDksMHg5NiwweDRCLDB4MDYsMHgwMCwweDRFLDB4NEEsMHg5QywweDRCLAorMHgwNiwweDAwLDB4N0IsMHg0QSwweDlDLDB4NEIsMHgwNSwweDAwLDB4OUUsMHg0QSwweEEyLDB4NEIsMHgwNSwweDAwLDB4RUMsMHg0QSwKKzB4QTIsMHg0QiwweDAwLDB4MDAsMHgxRSwweDA2LDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc0LDB4MDksMHhBMCwweDA2LDB4MDEsCisweDI0LDB4MzAsMHgzQywweDMwLDB4NzQsMHgxQSwweDhDLDB4QzgsMHg4RSwweEQ4LDB4OEUsMHhDMCwweEJCLDB4QUUsMHg0QiwweDhCLAorMHgwRiwweEUzLDB4MEQsMHg4QiwweDdGLDB4MDIsMHg4QiwweDc3LDB4MDQsMHhGMywweEE0LDB4ODMsMHhDMywweDA2LDB4RUIsMHhFRiwKKzB4MDcsMHgxRiwweEMzLDB4OTAsMHgzMywweEMwLDB4QTMsMHgzRSwweDAxLDB4QjksMHgwQywweDAxLDB4QkUsMHg0MCwweDAxLDB4OEIsCisweEZFLDB4ODEsMHhDNiwweEI0LDB4MEYsMHg4OSwweDA0LDB4OEIsMHhDNiwweDJCLDB4RjEsMHgzQiwweEM3LDB4NzcsMHhGNiwweEEzLAorMHgzQywweDAxLDB4QzMsMHg5MCwweDFFLDB4MDYsMHg2MCwweDM2LDB4OEIsMHgyRSwweDNFLDB4MDEsMHg4QiwweDVFLDB4MDAsMHgzQiwKKzB4RUIsMHg3NCwweDJCLDB4OEIsMHg3NiwweDAyLDB4ODksMHgxQywweDg5LDB4NzcsMHgwMiwweDM2LDB4QTEsMHgzQywweDAxLDB4ODksCisweDQ2LDB4MDAsMHgzNiwweDg5LDB4MkUsMHgzQywweDAxLDB4OEIsMHhFQiwweEZGLDB4NEUsMHgwNiwweDc0LDB4MDgsMHg4QiwweDZFLAorMHgwMCwweEZGLDB4NEUsMHgwNiwweDc1LDB4RjgsMHgzNiwweDg5LDB4MkUsMHgzRSwweDAxLDB4OEIsMHg2NiwweDA0LDB4NjEsMHgwNywKKzB4MUYsMHhDMywweDFFLDB4MDYsMHg2MCwweDM2LDB4OEIsMHgyRSwweDNFLDB4MDEsMHg5OCwweDg5LDB4NDYsMHgwNiwweDg5LDB4NjYsCisweDA0LDB4M0IsMHg2RSwweDAwLDB4NzQsMHgxMCwweDhCLDB4NkUsMHgwMCwweEZGLDB4NEUsMHgwNiwweDc1LDB4RjgsMHgzNiwweDg5LAorMHgyRSwweDNFLDB4MDEsMHg4QiwweDY2LDB4MDQsMHg2MSwweDA3LDB4MUYsMHhDMywweEMzLDB4OTAsMHgxRSwweDA2LDB4NjAsMHg5QywKKzB4RkEsMHgzMywweEVELDB4OEUsMHhERCwweDhCLDB4MkUsMHgzQywweDAxLDB4ODUsMHhFRCwweDc0LDB4M0QsMHg4QiwweDRFLDB4MDAsCisweDg5LDB4MEUsMHgzQywweDAxLDB4OEIsMHhDQywweDhELDB4QTYsMHgwQSwweDAxLDB4NTYsMHgxRSwweDA2LDB4NjAsMHg4OSwweDY2LAorMHgwNCwweEM3LDB4NDYsMHgwOCwweDBGLDB4MUEsMHhDNywweDQ2LDB4MDYsMHgwMSwweDAwLDB4OEIsMHgxRSwweDNFLDB4MDEsMHg4NSwKKzB4REIsMHg3NCwweDFELDB4OEIsMHhDNSwweDg3LDB4MDcsMHg4OSwweDQ2LDB4MDAsMHg4OSwweDVFLDB4MDIsMHg4QiwweEQ4LDB4ODksCisweDZGLDB4MDIsMHg4QiwweEUxLDB4OUQsMHg2MSwweDA3LDB4MUYsMHhGOCwweEMzLDB4OUQsMHg2MSwweDA3LDB4MUYsMHhGOSwweEMzLAorMHg4OSwweDJFLDB4M0UsMHgwMSwweDg5LDB4NkUsMHgwMCwweDg5LDB4NkUsMHgwMiwweDg3LDB4RTEsMHg5RCwweDhCLDB4RTEsMHhFQiwKKzB4RTQsMHgwMCwweDBELDB4MEEsMHg1NCwweDY1LDB4NzIsMHg2RCwweDY5LDB4NkUsMHg2MSwweDZDLDB4NzMsMHgyMCwweDczLDB4NzUsCisweDcwLDB4NzAsMHg2RiwweDcyLDB4NzQsMHg2NSwweDY0LDB4M0EsMHgwRCwweDBBLDB4MzEsMHgyOSwweDIwLDB4NDEsMHg0RSwweDUzLAorMHg0OSwweDIwLDB4NjMsMHg2RiwweDZELDB4NzAsMHg2MSwweDc0LDB4NjksMHg2MiwweDZDLDB4NjUsMHgwRCwweDBBLDB4MzIsMHgyOSwKKzB4MjAsMHg1NywweDc5LDB4NzMsMHg2NSwweDIwLDB4MzMsMHgzMCwweDBELDB4MEEsMHg1MCwweDZDLDB4NjUsMHg2MSwweDczLDB4NjUsCisweDIwLDB4NzMsMHg2NSwweDZDLDB4NjUsMHg2MywweDc0LDB4M0EsMHgyMCwweDAwLDB4MEQsMHgwQSwweDYzLDB4NkYsMHg2NCwweDY1LAorMHgyMCwweDczLDB4NjUsMHg2NywweDZELDB4NjUsMHg2RSwweDc0LDB4M0QsMHgwMCwweDBELDB4MEEsMHg0RCwweDZGLDB4NkUsMHg2OSwKKzB4NzQsMHg2RiwweDcyLDB4MjAsMHg3NiwweDMyLDB4MkUsMHgzNSwweDBBLDB4MEQsMHgwQSwweDNFLDB4MDAsMHgwRCwweDBBLDB4NTAsCisweDYxLDB4NzIsMHg2NCwweDZGLDB4NkUsMHgzRiwweDAwLDB4MEQsMHgwQSwweDRFLDB4NkYsMHgyMCwweDYxLDB4NjQsMHg2NCwweDcyLAorMHg2NSwweDczLDB4NzMsMHgyMCwweDczLDB4NzAsMHg2NSwweDYzLDB4NjksMHg2NiwweDY5LDB4NjUsMHg2NCwweDAwLDB4MEQsMHgwQSwKKzB4M0EsMHgwMCwweDBELDB4MEEsMHgwMCwweDRDLDB4NkYsMHg2MywweDNELDB4MDAsMHgwRCwweDBBLDB4NDYsMHg0MSwweDU0LDB4NDEsCisweDRDLDB4MjAsMHg0NSwweDUyLDB4NTIsMHg0RiwweDUyLDB4M0QsMHgwMCwweDBELDB4MEEsMHg0RCwweDZGLDB4NkUsMHg2OSwweDc0LAorMHg2RiwweDcyLDB4MjAsMHg2MywweDZGLDB4NkQsMHg2RCwweDYxLDB4NkUsMHg2NCwweDczLDB4M0EsMHgyRCwweDBELDB4MEEsMHgyMCwKKzB4MjAsMHgyMCwweDQ0LDB4MkMsMHg2NCwweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDNBLDB4NUQsMHg3OCwweDc4LDB4NzgsCisweDc4LDB4NUQsMHgyMCwweDJELDB4MjAsMHg2NCwweDc1LDB4NkQsMHg3MCwweDIwLDB4NkQsMHg2NSwweDZELDB4NkYsMHg3MiwweDc5LAorMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NEMsMHgyQywweDZDLDB4NUIsMHg1QiwweDc4LDB4NzgsMHg3OCwweDc4LDB4M0EsMHg1RCwKKzB4NzgsMHg3OCwweDc4LDB4NzgsMHg1RCwweDIwLDB4MkQsMHgyMCwweDY0LDB4NzUsMHg2RCwweDcwLDB4MjAsMHg3MywweDY5LDB4NkUsCisweDY3LDB4NkMsMHg2NSwweDIwLDB4NkMsMHg2OSwweDZFLDB4NjUsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NDUsMHgyQywweDY1LAorMHg1QiwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgzQSwweDVELDB4NzgsMHg3OCwweDc4LDB4NzgsMHg1RCwweDIwLDB4MkQsMHgyMCwKKzB4NjUsMHg2NCwweDY5LDB4NzQsMHgyMCwweDZELDB4NjUsMHg2RCwweDZGLDB4NzIsMHg3OSwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsCisweDQ2LDB4MkMsMHg2NiwweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4NUQsMHg3OCwweDc4LDB4NzgsMHg3OCwweDVELAorMHgyMCwweDJELDB4MjAsMHg2NiwweDY5LDB4NkMsMHg2QywweDIwLDB4NkQsMHg2NSwweDZELDB4NkYsMHg3MiwweDc5LDB4MjAsMHg3MCwKKzB4NjEsMHg3MiwweDYxLDB4NjcsMHg3MiwweDYxLDB4NzAsMHg2OCwweDczLDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDQ5LDB4NUIsCisweDc4LDB4NzgsMHg3OCwweDc4LDB4NUQsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDJELAorMHgyMCwweDc3LDB4NkYsMHg3MiwweDY0LDB4MjAsMHg2OSwweDZFLDB4NzAsMHg3NSwweDc0LDB4MjAsMHg2NiwweDcyLDB4NkYsMHg2RCwKKzB4MjAsMHg3MCwweDZGLDB4NzIsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg2OSwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsCisweDVELDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjIsMHg3OSwweDc0LAorMHg2NSwweDIwLDB4NjksMHg2RSwweDcwLDB4NzUsMHg3NCwweDIwLDB4NjYsMHg3MiwweDZGLDB4NkQsMHgyMCwweDcwLDB4NkYsMHg3MiwKKzB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NEYsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4NzgsMHg3OCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDZGLDB4NzUsMHg3NCwweDcwLDB4NzUsMHg3NCwweDIwLAorMHg3NywweDZGLDB4NzIsMHg2NCwweDIwLDB4NzQsMHg2RiwweDIwLDB4NzAsMHg2RiwweDcyLDB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwKKzB4MjAsMHg2RiwweDc4LDB4NzgsMHg3OCwweDc4LDB4MjAsMHg3OCwweDc4LDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyRCwweDIwLDB4NkYsMHg3NSwweDc0LDB4NzAsMHg3NSwweDc0LDB4MjAsMHg2MiwweDc5LDB4NzQsMHg2NSwweDIwLAorMHg3NCwweDZGLDB4MjAsMHg3MCwweDZGLDB4NzIsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg0NywweDVCLDB4NUIsMHg3OCwKKzB4NzgsMHg3OCwweDc4LDB4M0EsMHg1RCwweDc4LDB4NzgsMHg3OCwweDc4LDB4NUQsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjcsCisweDZGLDB4NzQsMHg2RiwweDIwLDB4NjEsMHg2NCwweDY0LDB4NzIsMHg2NSwweDczLDB4NzMsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLAorMHg1NywweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDNBLDB4NUQsMHg3OCwweDc4LDB4NzgsMHg3OCwweDVELDB4MjAsMHgyMCwKKzB4MjAsMHgyRCwweDIwLDB4NzcsMHg2MSwweDc0LDB4NjMsMHg2OCwweDIwLDB4NjEsMHgyMCwweDc3LDB4NkYsMHg3MiwweDY0LDB4MEQsCisweDBBLDB4MjAsMHgyMCwweDIwLDB4NDMsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDY5LDB4NkUsMHg3NCwweDY1LDB4NzIsMHg3MiwweDc1LDB4NzAsMHg3NCwKKzB4NzMsMHgyMCwweDZGLDB4NjYsMHg2NiwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg1MywweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjksMHg2RSwweDc0LAorMHg2NSwweDcyLDB4NzIsMHg3NSwweDcwLDB4NzQsMHg3MywweDIwLDB4NkYsMHg2RSwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg3MywKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDJELDB4MjAsMHg3MywweDY5LDB4NkUsMHg2NywweDZDLDB4NjUsMHgyMCwweDczLDB4NzQsMHg2NSwweDcwLDB4MEQsMHgwQSwweDIwLAorMHgyMCwweDIwLDB4NDIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwKKzB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDYyLDB4NzIsMHg2NSwweDYxLDB4NkIsMHg3MCwweDZGLDB4NjksMHg2RSwweDc0LDB4MjAsCisweDczLDB4NjUsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg2MiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjIsMHg3MiwweDY1LDB4NjEsMHg2QiwKKzB4NzAsMHg2RiwweDY5LDB4NkUsMHg3NCwweDIwLDB4NjMsMHg2QywweDY1LDB4NjEsMHg3MiwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsCisweDUyLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDJELDB4MjAsMHg3MiwweDY1LDB4NzMsMHg3NCwweDYxLDB4NzIsMHg3NCwweDIwLDB4NjIsMHg3MiwweDY1LDB4NjEsMHg2QiwKKzB4NzAsMHg2RiwweDY5LDB4NkUsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg3MiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NzIsMHg2NSwweDY3LAorMHg2OSwweDczLDB4NzQsMHg2NSwweDcyLDB4NzMsMHgyMCwweDYxLDB4NzQsMHgyMCwweDYyLDB4NzIsMHg2QiwweDcwLDB4NzQsMHgwRCwKKzB4MEEsMHgyMCwweDIwLDB4MjAsMHg1OCwweDJDLDB4NzgsMHgyMCwweDZFLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjUsMHg3OCwweDYxLDB4NkQsMHg2OSwweDZFLDB4NjUsMHgyMCwweDYzLAorMHg2OCwweDYxLDB4NkUsMHg2RSwweDY1LDB4NkMsMHgyMCwweDZFLDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDQ4LDB4MkMsMHgzRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDJELDB4MjAsCisweDc0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2RCwweDY1LDB4NzMsMHg3MywweDYxLDB4NjcsMHg2NSwweDAwLDB4MUIsMHg1QiwweDMyLAorMHg0QSwweDFCLDB4NUIsMHgzMSwweDNCLDB4MzEsMHg0OCwweDQxLDB4NEUsMHg1MywweDQ5LDB4MjAsMHg1NCwweDY1LDB4NzIsMHg2RCwKKzB4NjksMHg2RSwweDYxLDB4NkMsMHgwRCwweDBBLDB4MEEsMHgwMCwweDFCLDB4NUIsMHg0QiwweDAwLDB4MUIsMHg1QiwweDRBLDB4MDAsCisweDFCLDB4NUIsMHgzMiwweDRBLDB4MUIsMHg1QiwweDMxLDB4M0IsMHgzMSwweDQ4LDB4MDAsMHgxQiwweDVCLDB4NDQsMHgyMCwweDFCLAorMHg1QiwweDQ0LDB4MDAsMHgxQiwweDVCLDB4MzEsMHgzQiwweDM3LDB4MzIsMHg0OCwweDAwLDB4MUIsMHg1QiwweDAwLDB4M0IsMHgwMCwKKzB4NDgsMHgwMCwweDFCLDB4NUIsMHg3MywweDAwLDB4MUIsMHg1QiwweDc1LDB4MDAsMHgxQiwweDdBLDB4MkIsMHgwQiwweDdGLDB4MUIsCisweDdBLDB4MkUsMHgwQywweDdGLDB4MUIsMHg3QSwweDJELDB4MDgsMHg3RiwweDFCLDB4N0EsMHgyQywweDBBLDB4N0YsMHgxQiwweDdBLAorMHgyMiwweDA4LDB4N0YsMHgxQSwweDU3LDB4NzksMHg3MywweDY1LDB4MjAsMHgzMywweDMwLDB4MjAsMHg1NCwweDY1LDB4NzIsMHg2RCwKKzB4NjksMHg2RSwweDYxLDB4NkMsMHgwRCwweDBBLDB4MDAsMHgxQiwweDU0LDB4MDAsMHgxQiwweDU5LDB4MDAsMHgxQSwweDAwLDB4MUUsCisweDAwLDB4MDgsMHgyMCwweDA4LDB4MDAsMHgwMCwweDFCLDB4M0QsMHgwMCwweDAwLDB4MDAsMHgxQiwweDQ2LDB4MDAsMHgwRCwweDAwLAorMHgzRiwweDQ0LDB4NjQsMHg0NSwweDY1LDB4NDYsMHg2NiwweDQ3LDB4NjcsMHg0OCwweDY4LDB4NDksMHg2OSwweDRGLDB4NkYsMHg0MywKKzB4NjMsMHg1MywweDczLDB4NDIsMHg2MiwweDUyLDB4NzIsMHg1NywweDc3LDB4NTgsMHg3OCwweDRDLDB4NkMsMHgzQywweDYwLDB4RDQsCisweDU3LDB4RDQsMHg1NywweDUwLDB4NTgsMHg1MCwweDU4LDB4RDYsMHg1OSwweEQ2LDB4NTksMHhCNCwweDU5LDB4QjQsMHg1OSwweDNDLAorMHg2MCwweDNDLDB4NjAsMHg2QywweDU3LDB4NDgsMHg1NywweDI2LDB4NTcsMHgwNiwweDU3LDB4OTAsMHg1NywweDkwLDB4NTcsMHg5OCwKKzB4NTcsMHg0OCwweDVGLDB4MEMsMHg1RiwweDU4LDB4NUYsMHgzMywweDVGLDB4NDAsMHg1RiwweEEwLDB4NTcsMHhBMCwweDU3LDB4RkUsCisweDU5LDB4RkUsMHg1OSwweERDLDB4NTcsMHhEQywweDU3LDB4ODgsMHg2MSwweDk4LDB4NjEsMHhDMCwweDYxLDB4Q0MsMHg2MSwweEQ4LAorMHg2MSwweEY2LDB4NjEsMHgwMiwweDYyLDB4MjIsMHg2MiwweEY4LDB4NTYsMHg0QSwweDYyLDB4NTgsMHg2MiwweDYwLDB4NTksMHgyMCwKKzB4MjAsMHg2NiwweDZDLDB4NjEsMHg2NywweDczLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MSwweDc4LDB4M0QsMHgwMCwweDIwLDB4MjAsCisweDYyLDB4NzgsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NzgsMHgzRCwweDAwLDB4MjAsMHgyMCwweDY0LDB4NzgsMHgzRCwweDAwLAorMHgyMCwweDIwLDB4NjMsMHg3MywweDNELDB4MDAsMHgyMCwweDIwLDB4NjQsMHg3MywweDNELDB4MDAsMHgyMCwweDIwLDB4NjUsMHg3MywKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg3MywweDczLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2NCwweDY5LDB4M0QsMHgwMCwweDIwLDB4MjAsCisweDczLDB4NjksMHgzRCwweDAwLDB4MjAsMHgyMCwweDYyLDB4NzAsMHgzRCwweDAwLDB4MjAsMHgyMCwweDczLDB4NzAsMHgzRCwweDAwLAorMHgyMCwweDIwLDB4NjksMHg3MCwweDNELDB4MDAsMHgyMCwweDYzLDB4NjgsMHg2MSwweDZFLDB4NjUsMHg2QywweDNELDB4MDAsMHgyMCwKKzB4MjAsMHgyMCwweDIwLDB4NzMsMHg2NSwweDY3LDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NzMsMHg3NCwweDcyLDB4M0QsCisweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg3NCwweDZGLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg2RCwweDYxLAorMHg3OCwweDNELDB4MDAsMHgyMCwweDc0LDB4NjksMHg1RiwweDYyLDB4NjEsMHg3MywweDNELDB4MDAsMHgyMCwweDc0LDB4NjksMHg1RiwKKzB4NzMsMHg2OSwweDdBLDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NzMsMHg3NCwweDY2LDB4M0QsMHgwMCwweDIwLDB4NzQsCisweDY5LDB4NUYsMHg3MiwweDZGLDB4NkYsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg2NiwweDZDLDB4NjcsMHgzRCwweDAwLAorMHgyMCwweDc0LDB4NjksMHg1RiwweDc0LDB4NkYsMHg3NCwweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDcwLDB4NjMsMHg2RSwKKzB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NzMsMHg3NCwweDcyLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NzMsCisweDc0LDB4NjYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3MiwweDZGLDB4NkYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LAorMHg1RiwweDYyLDB4NjEsMHg3MywweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDczLDB4NjksMHg3QSwweDNELDB4MDAsMHgyMCwKKzB4NzIsMHg2OSwweDVGLDB4NzQsMHg2RiwweDc0LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NkQsMHg2OSwweDZFLDB4M0QsCisweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg2NiwweDZDLDB4NjcsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3NCwweDZGLAorMHg3MywweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDc0LDB4NjgsMHg3MiwweDNELDB4MDAsMHgyMCwweDc0LDB4NjgsMHg1RiwKKzB4NzMsMHg3NCwweDY2LDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OCwweDVGLDB4NzMsMHg3NCwweDcyLDB4M0QsMHgwMCwweDIwLDB4NzQsCisweDY4LDB4NUYsMHg2MiwweDYxLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY4LDB4NUYsMHg3MywweDY5LDB4N0EsMHgzRCwweDAwLAorMHgyMCwweDc0LDB4NjgsMHg1RiwweDc0LDB4NzIsMHg2NywweDNELDB4MDAsMHgyMCwweDc0LDB4NjgsMHg1RiwweDY2LDB4NkMsMHg2NywKKzB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OCwweDVGLDB4NjMsMHg2RSwweDc0LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NzMsCisweDc0LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg3MywweDc0LDB4NjYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LAorMHg1RiwweDYyLDB4NjEsMHg3MywweDNELDB4MDAsMHgyMCwweDcyLDB4NjgsMHg1RiwweDczLDB4NjksMHg3QSwweDNELDB4MDAsMHgyMCwKKzB4NzIsMHg2OCwweDVGLDB4NzMsMHg3MCwweDYxLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NjEsMHg3MywweDZGLDB4M0QsCisweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg3MiwweDZGLDB4NkYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg2NiwweDZDLAorMHg2NywweDNELDB4MDAsMHgyMCwweDZELDB4NUYsMHg2MywweDYxLDB4NzIsMHg2NSwweDNELDB4MDAsMHgyMCwweDcwLDB4NzQsMHg1RiwKKzB4NjYsMHg2QywweDZGLDB4M0QsMHgwMCwweDIwLDB4NjEsMHg3MywweDVGLDB4NjYsMHg2QywweDZGLDB4M0QsMHgwMCwweDIwLDB4NzIsCisweDZELDB4NUYsMHg2NiwweDZDLDB4NkYsMHgzRCwweDAwLDB4MjAsMHgyMCwweDIwLDB4NzEsMHg1RiwweDY5LDB4NkUsMHgzRCwweDAwLAorMHgyMCwweDIwLDB4NzEsMHg1RiwweDZGLDB4NzUsMHg3NCwweDNELDB4MDAsMHgyMCwweDcxLDB4NUYsMHg2NCwweDcyLDB4NjEsMHg2RSwKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg3MSwweDVGLDB4NzQsMHg2OSwweDZELDB4M0QsMHgwMCwweDIwLDB4MjAsMHgyMCwweDcxLDB4NUYsCisweDY2LDB4NjMsMHgzRCwweDAwLDB4MjAsMHg3MSwweDVGLDB4NzMsMHg3NCwweDYxLDB4NzQsMHgzRCwweDAwLDB4MjAsMHg3MSwweDVGLAorMHg2NCwweDYxLDB4NzQsMHg2MSwweDNELDB4MDAsMHgyMCwweDcxLDB4NUYsMHg2RCwweDZGLDB4NjQsMHg2RCwweDNELDB4MDAsMHgyMCwKKzB4NjgsMHg2MSwweDZFLDB4NjQsMHg1RiwweDZGLDB4M0QsMHgwMCwweDIwLDB4NjgsMHg2MSwweDZFLDB4NjQsMHg1RiwweDYyLDB4M0QsCisweDAwLDB4MjAsMHg2OCwweDYxLDB4NkUsMHg2NCwweDVGLDB4NjUsMHgzRCwweDAwLDB4MjAsMHg2OCwweDYxLDB4NkUsMHg2NCwweDVGLAorMHg2OSwweDNELDB4MDAsMHgyMCwweDIwLDB4NkYsMHg3MCwweDZGLDB4NzMsMHg3NCwweDNELDB4MDAsMHgyMCwweDIwLDB4NzQsMHg2OSwKKzB4NkQsMHg2NSwweDZGLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg3NSwweDczLDB4NzQsMHg2RCwweDMxLDB4M0QsMHgwMCwweDIwLDB4NjMsCisweDc1LDB4NzMsMHg3NCwweDZELDB4MzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDc1LDB4NzMsMHg3NCwweDZELDB4NjQsMHgzRCwweDAwLAorMHgyMCwweDc0LDB4NzgsMHg3MiwweDYxLDB4NzQsMHg2NSwweDNELDB4MDAsMHgyMCwweDcyLDB4NzgsMHg3MiwweDYxLDB4NzQsMHg2NSwKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NkQsMHg2MSwweDcwLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwweDYxLDB4NjQsCisweDY0LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjEsMHg2OSwweDczLDB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLAorMHg3OCwweDc0LDB4NjEsMHg2NywweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2NCwweDY1LDB4NjYsMHg3MiwweDNELDB4MDAsMHgyMCwKKzB4NjMsMHg1RiwweDY2LDB4NkMsMHg3MywweDY4LDB4M0QsMHgwMCwweDIwLDB4NzQsMHg3OCwweDZELDB4NjEsMHg3OCwweDczLDB4M0QsCisweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg2NSwweDZELDB4NzMsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2QywweDczLAorMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwweDY5LDB4NjUsMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwKKzB4NjYsMHg2MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NkQsMHg2MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsCisweDYzLDB4NUYsMHg2QywweDYzLDB4NzIsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2NCwweDczLDB4NzMsMHgzRCwweDAwLAorMHgyMCwweDYzLDB4NUYsMHg2NCwweDczLDB4NzMsMHg2OSwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2NCwweDczLDB4NzMsMHg3MiwKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NjksMHg3MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NjMsCisweDYxLDB4NzIsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2NSwweDY2LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLAorMHg2NSwweDcyLDB4NzMsMHg3NCwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2NSwweDYzLDB4NkUsMHg3NCwweDNELDB4MDAsMHgyMCwKKzB4NjMsMHg1RiwweDYyLDB4NzIsMHg2QiwweDYzLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwweDYyLDB4NkYsMHg2QiwweDYzLDB4M0QsCisweDAwLDB4MjAsMHg2MywweDVGLDB4NzIsMHg2NSwweDcwLDB4NkMsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjMsMHg2MywweDczLAorMHg3MiwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg3MywweDc0LDB4NzQsMHgzMSwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg3MywKKzB4NzQsMHg3NCwweDMyLDB4M0QsMHgwMCwweDJCLDB4QzAsMHg4RSwweEQ4LDB4OEUsMHhDMCwweEU4LDB4QzIsMHgwMCwweEU4LDB4RTUsCisweDAwLDB4RkEsMHhCRiwweDg0LDB4MDAsMHhDNywweDA1LDB4REMsMHg1NiwweDhDLDB4NEQsMHgwMiwweEJGLDB4MEMsMHgwMCwweEM3LAorMHgwNSwweDZFLDB4NUUsMHg4QywweDRELDB4MDIsMHhCRiwweDA0LDB4MDAsMHhDNywweDA1LDB4QkEsMHg1RSwweDhDLDB4NEQsMHgwMiwKKzB4RTgsMHhGMSwweDAwLDB4OTAsMHhFOCwweDQ5LDB4MDEsMHhFOCwweDE2LDB4MDAsMHhGNCwweDkwLDB4RTgsMHhFNSwweDAwLDB4QkUsCisweEJBLDB4NEQsMHhFOCwweDA5LDB4MEMsMHhBMCwweDkzLDB4MTIsMHhFOCwweDVELDB4MEMsMHhFOCwweEMyLDB4MDksMHhFQiwweEU0LAorMHhFOCwweEQ1LDB4MEMsMHhFOCwweEM0LDB4MEMsMHgwQSwweEMwLDB4NzQsMHhGNiwweDhCLDB4MUUsMHhGOCwweDc5LDB4M0MsMHgwRCwKKzB4NzQsMHgyRSwweDNDLDB4MDgsMHg3NCwweDE3LDB4M0MsMHg3RiwweDc0LDB4MTMsMHg4MywweEZCLDB4MjAsMHg3RiwweEUxLDB4ODgsCisweDg3LDB4RDYsMHg3OSwweDQzLDB4ODksMHgxRSwweEY4LDB4NzksMHhFOCwweDc3LDB4MEMsMHhFQiwweEQzLDB4MEIsMHhEQiwweDc0LAorMHhDRiwweDRCLDB4ODksMHgxRSwweEY4LDB4NzksMHg4QiwweDM2LDB4MTYsMHg3QSwweEU4LDB4QzEsMHgwQiwweEVCLDB4QzEsMHg5MCwKKzB4RTgsMHgwMiwweDAwLDB4RUIsMHhCQiwweEM2LDB4ODcsMHhENiwweDc5LDB4MDAsMHgwQiwweERCLDB4NzQsMHgxRSwweEEwLDB4RDYsCisweDc5LDB4QkYsMHg2MCwweDUxLDB4QjksMHgxRCwweDAwLDB4OEIsMHhEOSwweDA2LDB4MEUsMHgwNywweEYyLDB4QUUsMHgwNywweDc1LAorMHgxNywweDQxLDB4MkIsMHhEOSwweEQxLDB4RTMsMHgyRSwweEZGLDB4OTcsMHg3RCwweDUxLDB4OTAsMHgzMywweEMwLDB4QTMsMHhGOCwKKzB4NzksMHhCRSwweDg5LDB4NEQsMHhFOCwweDg3LDB4MEIsMHhDMywweEJFLDB4OEQsMHg0RCwweEU4LDB4ODAsMHgwQiwweEVCLDB4RUMsCisweEJBLDB4MDAsMHgwMiwweEIwLDB4OTMsMHhFRSwweEIwLDB4NTUsMHhFRSwweEJBLDB4MTAsMHgwMiwweEIwLDB4OTMsMHhFRSwweEIwLAorMHhBQSwweEVFLDB4QkEsMHgwMCwweDAyLDB4RUMsMHgzQywweDU1LDB4NzUsMHgwOCwweEJBLDB4MTAsMHgwMiwweEVDLDB4M0MsMHhBQSwKKzB4NzQsMHgwMywweEU4LDB4MkYsMHhGNiwweEMzLDB4QkEsMHgwNCwweDAyLDB4QjAsMHgxQSwweEVFLDB4QjAsMHgyMCwweEVFLDB4QjAsCisweDMwLDB4RUUsMHhCMCwweDQwLDB4RUUsMHhCMCwweDgwLDB4RUUsMHhCQSwweDAwLDB4MDIsMHhCMCwweDEzLDB4RUUsMHhCMCwweDA3LAorMHhFRSwweEJBLDB4MDgsMHgwMiwweEIwLDB4ODAsMHhFRSwweEJBLDB4MDIsMHgwMiwweEIwLDB4QkIsMHhFRSwweEJBLDB4MDQsMHgwMiwKKzB4QjAsMHgwNSwweEVFLDB4QzMsMHhDNiwweDA2LDB4Q0EsMHgxMywweDAxLDB4QzcsMHgwNiwweEY4LDB4NzksMHgwMCwweDAwLDB4QzYsCisweDA2LDB4RjYsMHg3OSwweDAxLDB4QzcsMHgwNiwweEQwLDB4NzksMHgwMCwweDAwLDB4QzcsMHgwNiwweEQyLDB4NzksMHgwMCwweDAwLAorMHhDNywweDA2LDB4RDQsMHg3OSwweDAwLDB4MDAsMHhDNywweDA2LDB4RkEsMHg3OSwweDAwLDB4MDAsMHhDNywweDA2LDB4RkMsMHg3OSwKKzB4MDAsMHgwMCwweEM3LDB4MDYsMHhGRSwweDc5LDB4MDAsMHgwMCwweEM3LDB4MDYsMHgwMCwweDdBLDB4MDAsMHgwMCwweEM3LDB4MDYsCisweDAyLDB4N0EsMHhDRSwweDU5LDB4OEMsMHgwRSwweDA0LDB4N0EsMHhDNywweDA2LDB4MDYsMHg3QSwweDAwLDB4MDAsMHhDNywweDA2LAorMHgyNywweDdBLDB4MDAsMHgwMCwweEM2LDB4MDYsMHgyOSwweDdBLDB4MDAsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4QzMsMHg5MCwKKzB4QkUsMHgyMiwweDRELDB4RTgsMHhDOCwweDBBLDB4RTgsMHgzRiwweDAwLDB4MkMsMHgzMSwweDNDLDB4MDEsMHg3NywweEY3LDB4RTgsCisweDgxLDB4MDksMHg4QiwweDM2LDB4MEMsMHg3QSwweEU4LDB4QjUsMHgwQSwweEJFLDB4NkEsMHg0RCwweEU4LDB4QUYsMHgwQSwweDBFLAorMHg1OCwweEU4LDB4RjgsMHgwQSwweEJFLDB4N0EsMHg0RCwweEU4LDB4QTQsMHgwQSwweEMzLDB4OTAsMHg2MCwweEQxLDB4RTMsMHg4MywKKzB4RkIsMHgxOCwweDczLDB4MTEsMHgxRSwweEJBLDB4MDAsMHgwMCwweDhFLDB4REEsMHgyRSwweEZGLDB4OTcsMHhCNywweDUxLDB4OEIsCisweEVDLDB4ODksMHg0NiwweDEwLDB4MUYsMHg2MSwweENGLDB4OTAsMHhFOCwweDRGLDB4MEIsMHgwQSwweEMwLDB4NzUsMHgwNSwweEU4LAorMHg1NiwweDBCLDB4RUIsMHhGNCwweEMzLDB4OTAsMHg4MywweDNFLDB4RjgsMHg3OSwweDAxLDB4NzQsMHgxNiwweEJFLDB4RDcsMHg3OSwKKzB4RTgsMHgzMSwweDBBLDB4OEIsMHhEMCwweEFDLDB4M0MsMHgyQywweDc0LDB4MDQsMHgzQywweDIwLDB4NzUsMHgwNSwweEU4LDB4MjMsCisweDBBLDB4RUUsMHhDMywweEU5LDB4RDIsMHhGRSwweDgzLDB4M0UsMHhGOCwweDc5LDB4MDEsMHg3NCwweEY2LDB4QkUsMHhENywweDc5LAorMHhFOCwweDExLDB4MEEsMHg4QiwweEQwLDB4QUMsMHgzQywweDJDLDB4NzQsMHgwOCwweDNDLDB4MjAsMHg3NCwweDA0LDB4RTksMHhCNywKKzB4RkUsMHg5MCwweEU4LDB4RkYsMHgwOSwweEVGLDB4QzMsMHg5MCwweDhCLDB4MTYsMHgwNiwweDdBLDB4ODMsMHgzRSwweEY4LDB4NzksCisweDAxLDB4NzQsMHgwQiwweEJFLDB4RDcsMHg3OSwweEU4LDB4RUIsMHgwOSwweDhCLDB4RDAsMHhBMywweDA2LDB4N0EsMHhCMCwweDIwLAorMHhFOCwweDU3LDB4MEIsMHg4QiwweDE2LDB4MDYsMHg3QSwweEVDLDB4RTgsMHg2RiwweDBCLDB4QzMsMHg4QiwweDE2LDB4MDYsMHg3QSwKKzB4ODMsMHgzRSwweEY4LDB4NzksMHgwMSwweDc0LDB4MEIsMHhCRSwweEQ3LDB4NzksMHhFOCwweEM3LDB4MDksMHg4QiwweEQwLDB4QTMsCisweDA2LDB4N0EsMHhCMCwweDIwLDB4RTgsMHgzMywweDBCLDB4OEIsMHgxNiwweDA2LDB4N0EsMHhFRCwweEU4LDB4NjcsMHgwQiwweEMzLAorMHhGQSwweEM2LDB4MDYsMHhGNiwweDc5LDB4MDAsMHhDMywweDkwLDB4QzYsMHgwNiwweEY2LDB4NzksMHgwMSwweEZCLDB4QzMsMHg5MCwKKzB4MDYsMHhFOCwweDU4LDB4MDksMHhCMCwweDIwLDB4RTgsMHgxMSwweDBCLDB4MjYsMHg4QiwweDA1LDB4RTgsMHg0NywweDBCLDB4QjAsCisweDA4LDB4RTgsMHgwNiwweDBCLDB4RTgsMHgwMywweDBCLDB4RTgsMHgwMCwweDBCLDB4RTgsMHhGRCwweDBBLDB4QjgsMHgwMSwweDAwLAorMHhFOCwweENGLDB4RjQsMHhCQSwweDAyLDB4MDIsMHhFQywweDI0LDB4MDEsMHg3NSwweDAyLDB4RUIsMHhEQywweEJBLDB4MDYsMHgwMiwKKzB4RUMsMHgwNywweEMzLDB4OTAsMHhDNywweDA2LDB4MDgsMHg3QSwweDEwLDB4MDAsMHhFQiwweDA2LDB4QzcsMHgwNiwweDA4LDB4N0EsCisweDAxLDB4MDAsMHgwNiwweDhFLDB4MDYsMHhGQywweDc5LDB4OEIsMHgzRSwweEZBLDB4NzksMHhFOCwweDBFLDB4MDksMHhFOCwweDBCLAorMHgwMCwweDg5LDB4M0UsMHhGQSwweDc5LDB4OEMsMHgwNiwweEZDLDB4NzksMHgwNywweEMzLDB4OTAsMHhCRSwweEIyLDB4NEQsMHhFOCwKKzB4N0MsMHgwOSwweDhCLDB4MTYsMHgwOCwweDdBLDB4NTIsMHhFOCwweDJBLDB4MDksMHhFOCwweDBGLDB4MEEsMHhFOCwweDBDLDB4MEEsCisweDMzLDB4REIsMHhCOSwweDEwLDB4MDAsMHg5MCwweDI2LDB4OEEsMHgwMSwweEU4LDB4QkMsMHgwOSwweEU4LDB4RkQsMHgwOSwweDQzLAorMHhFMiwweEY0LDB4RTgsMHhGNywweDA5LDB4RTgsMHhGNCwweDA5LDB4MzMsMHhEQiwweEI5LDB4MTAsMHgwMCwweDkwLDB4MjYsMHg4QSwKKzB4MDEsMHgzQywweDIwLDB4NzIsMHgwNSwweDNDLDB4N0UsMHg3NiwweDAzLDB4OTAsMHhCMCwweDJFLDB4RTgsMHhFMywweDA5LDB4NDMsCisweEUyLDB4RUMsMHhCRSwweEIyLDB4NEQsMHhFOCwweDM2LDB4MDksMHg4MywweEM3LDB4MTAsMHg1QSwweDRBLDB4NzUsMHhCNywweEMzLAorMHgwNiwweDhFLDB4MDYsMHgwMCwweDdBLDB4OEIsMHgzRSwweEZFLDB4NzksMHhFOCwweEEwLDB4MDgsMHg4OSwweDNFLDB4RkUsMHg3OSwKKzB4OEMsMHgwNiwweDAwLDB4N0EsMHg1NywweDhCLDB4MzYsMHgwRSwweDdBLDB4RTgsMHgxMiwweDA5LDB4QzcsMHgwNiwweDA4LDB4N0EsCisweDEwLDB4MDAsMHhCQSwweDAwLDB4MDIsMHhFOCwweEU4LDB4MDAsMHhFOCwweDgxLDB4RkYsMHg1RiwweEJBLDB4MDAsMHgwMCwweEU4LAorMHhERSwweDAwLDB4QkUsMHhCNSwweDRELDB4RTgsMHhGNiwweDA4LDB4OEMsMHhDMCwweEU4LDB4M0YsMHgwOSwweEIwLDB4M0EsMHhFOCwKKzB4OTAsMHgwOSwweDhCLDB4QzcsMHhFOCwweDM1LDB4MDksMHhFOCwweDdFLDB4MDgsMHhFOCwweEMzLDB4MDAsMHg5MCwweEU4LDB4QjcsCisweDA5LDB4RTgsMHhBNiwweDA5LDB4MEEsMHhDMCwweDc0LDB4RjYsMHgzQywweDBCLDB4NzUsMHgwNiwweDgzLDB4RUYsMHgxMCwweEVCLAorMHgxOSwweDkwLDB4M0MsMHgwQSwweDc1LDB4MDYsMHg4MywweEM3LDB4MTAsMHhFQiwweDBGLDB4OTAsMHgzQywweDBDLDB4NzUsMHgwNCwKKzB4NDcsMHhFQiwweDA3LDB4OTAsMHgzQywweDA4LDB4NzUsMHgyNCwweDRGLDB4OTAsMHg4QiwweDM2LDB4RkUsMHg3OSwweDhCLDB4QzcsCisweDJCLDB4QzYsMHgzRCwweDAwLDB4MDEsMHg3MiwweEE1LDB4M0QsMHgxMCwweDAxLDB4NzIsMHgwNCwweDgzLDB4RUUsMHgyMCwweDkwLAorMHg4MywweEM2LDB4MTAsMHg4OSwweDM2LDB4RkUsMHg3OSwweDU3LDB4OEIsMHhGRSwweEVCLDB4ODAsMHgzQywweDJFLDB4NzUsMHgwOCwKKzB4QkEsMHgwMSwweDEzLDB4RTgsMHg2QSwweDAwLDB4MDcsMHhDMywweEM2LDB4MDYsMHgwQSwweDdBLDB4MDIsMHgzMiwweEM5LDB4OTAsCisweDNDLDB4MzAsMHg3MiwweDRDLDB4M0MsMHgzOSwweDc2LDB4MEMsMHgyNCwweDVGLDB4M0MsMHg0MSwweDcyLDB4NDIsMHgzQywweDQ2LAorMHg3NywweDNFLDB4MkMsMHgwNywweDJDLDB4MzAsMHg1MCwweEU4LDB4Q0MsMHgwOCwweDU4LDB4MDIsMHhDOCwweEZFLDB4MEUsMHgwQSwKKzB4N0EsMHg3NCwweDBGLDB4QzAsMHhFMSwweDA0LDB4RTgsMHgyRiwweDA5LDB4RTgsMHgxRSwweDA5LDB4MEEsMHhDMCwweDc0LDB4RjYsCisweEVCLDB4Q0UsMHgyNiwweDg4LDB4MEQsMHhFOCwweEUwLDB4MDcsMHg4QSwweEQwLDB4RTgsMHgyMywweDAwLDB4OEEsMHhDMSwweDNDLAorMHgyMCwweDcyLDB4MDUsMHgzQywweDdFLDB4NzYsMHgwMywweDkwLDB4QjAsMHgyRSwweEU4LDB4RDUsMHgwOCwweEU5LDB4NzAsMHhGRiwKKzB4RTgsMHhDNSwweDA3LDB4RTgsMHgwQSwweDAwLDB4MjYsMHg4QSwweDA1LDB4RTgsMHg3QywweDA4LDB4RTksMHgxRCwweEZGLDB4OTAsCisweEY2LDB4MDYsMHgyNiwweDdBLDB4MDIsMHg3NSwweDAyLDB4ODYsMHhGMiwweDUyLDB4OEIsMHgzNiwweDFBLDB4N0EsMHhFOCwweDBELAorMHgwOCwweDVBLDB4NTIsMHg4QSwweEM2LDB4MDIsMHgwNiwweDI0LDB4N0EsMHhGNiwweDA2LDB4MjYsMHg3QSwweDAxLDB4NzUsMHgwNiwKKzB4RTgsMHg5RiwweDA4LDB4RUIsMHgwRCwweDkwLDB4MzIsMHhFNCwweEU4LDB4MEQsMHgwOCwweDhCLDB4MzYsMHgxQywweDdBLDB4RTgsCisweEVDLDB4MDcsMHg1QSwweDhBLDB4QzIsMHgwMiwweDA2LDB4MjUsMHg3QSwweEY2LDB4MDYsMHgyNiwweDdBLDB4MDEsMHg3NSwweDA2LAorMHhFOCwweDdGLDB4MDgsMHhFQiwweDA2LDB4OTAsMHgzMiwweEU0LDB4RTgsMHhFRCwweDA3LDB4OEIsMHgzNiwweDFFLDB4N0EsMHhFOCwKKzB4Q0MsMHgwNywweEMzLDB4OTAsMHgwNiwweDhFLDB4MDYsMHgwNCwweDdBLDB4OEIsMHgzRSwweDAyLDB4N0EsMHhFOCwweDNDLDB4MDcsCisweDg5LDB4M0UsMHgwMiwweDdBLDB4OEMsMHgwNiwweDA0LDB4N0EsMHgwNywweEZGLDB4MUUsMHgwMiwweDdBLDB4QzMsMHhCRSwweDk3LAorMHg0RCwweEU4LDB4QUEsMHgwNywweENCLDB4OTAsMHgwNiwweDU3LDB4QkUsMHhENywweDc5LDB4RTgsMHg2NiwweDA3LDB4OEIsMHhEOCwKKzB4RTgsMHg2MSwweDA3LDB4OEIsMHhDOCwweDJCLDB4Q0IsMHg3OCwweDExLDB4OEUsMHhDMywweEJGLDB4MDAsMHgwMCwweEI4LDB4RkYsCisweEZGLDB4NTEsMHhCOSwweDA4LDB4MDAsMHhGMywweEFCLDB4NTksMHhFMiwweEY3LDB4NUYsMHgwNywweEMzLDB4OTAsMHgwNiwweEJFLAorMHhENywweDc5LDB4RTgsMHgzRiwweDA3LDB4OEIsMHhEOCwweEQxLDB4RTMsMHgyRSwweDhCLDB4OUYsMHg0NCwweDAwLDB4QkUsMHgyNiwKKzB4NTIsMHhFOCwweEYxLDB4MDgsMHg4QiwweEMzLDB4RTgsMHhERCwweDA4LDB4QjgsMHgwMSwweDAwLDB4RTgsMHg3MywweEYyLDB4RTgsCisweEUwLDB4MDgsMHhCRSwweDJGLDB4NTIsMHhFOCwweERELDB4MDgsMHg4QiwweDQ3LDB4MTgsMHhFOCwweEM4LDB4MDgsMHhCRSwweDc3LAorMHg1MiwweEU4LDB4RDEsMHgwOCwweDhCLDB4NDcsMHgyNiwweEU4LDB4QkMsMHgwOCwweEJFLDB4NTMsMHg1MiwweEU4LDB4QzUsMHgwOCwKKzB4OEIsMHg0NywweDFFLDB4RTgsMHhCMCwweDA4LDB4QkUsMHg1QywweDUyLDB4RTgsMHhCOSwweDA4LDB4OEIsMHg0NywweDIwLDB4RTgsCisweEE0LDB4MDgsMHhCRSwweDZFLDB4NTIsMHhFOCwweEFELDB4MDgsMHg4QiwweDQ3LDB4MjQsMHhFOCwweDk4LDB4MDgsMHhCRSwweDgwLAorMHg1MiwweEU4LDB4QTEsMHgwOCwweDhCLDB4NDcsMHgyQSwweEU4LDB4OEMsMHgwOCwweEU4LDB4OTUsMHgwOCwweEJFLDB4MzgsMHg1MiwKKzB4RTgsMHg5MiwweDA4LDB4OEIsMHgwNywweEU4LDB4N0UsMHgwOCwweEJFLDB4NDEsMHg1MiwweEU4LDB4ODcsMHgwOCwweDhCLDB4NDcsCisweDFBLDB4RTgsMHg3MiwweDA4LDB4QkUsMHg0QSwweDUyLDB4RTgsMHg3QiwweDA4LDB4OEIsMHg0NywweDFDLDB4RTgsMHg2NiwweDA4LAorMHhCRSwweDY1LDB4NTIsMHhFOCwweDZGLDB4MDgsMHg4QiwweDQ3LDB4MjIsMHhFOCwweDVBLDB4MDgsMHhFOCwweDYzLDB4MDgsMHhCRSwKKzB4RDEsMHg1MiwweEU4LDB4NjAsMHgwOCwweDhCLDB4NDcsMHgzOCwweEU4LDB4NEIsMHgwOCwweEJFLDB4QUQsMHg1MiwweEU4LDB4NTQsCisweDA4LDB4OEIsMHg0NywweDMwLDB4RTgsMHgzRiwweDA4LDB4QkUsMHhCNiwweDUyLDB4RTgsMHg0OCwweDA4LDB4OEIsMHg0NywweDMyLAorMHhFOCwweDMzLDB4MDgsMHhCRSwweEE0LDB4NTIsMHhFOCwweDNDLDB4MDgsMHg4QiwweDQ3LDB4MkUsMHhFOCwweDI3LDB4MDgsMHhCRSwKKzB4QkYsMHg1MiwweEU4LDB4MzAsMHgwOCwweDhCLDB4NDcsMHgzNCwweEU4LDB4MUIsMHgwOCwweEU4LDB4MjQsMHgwOCwweEJFLDB4ODksCisweDUyLDB4RTgsMHgyMSwweDA4LDB4OEIsMHg0NywweDA0LDB4RTgsMHgwQywweDA4LDB4QkUsMHg5MiwweDUyLDB4RTgsMHgxNSwweDA4LAorMHg4QiwweDQ3LDB4MTQsMHhFOCwweDAwLDB4MDgsMHhCRSwweDlCLDB4NTIsMHhFOCwweDA5LDB4MDgsMHg4QiwweDQ3LDB4MkMsMHhFOCwKKzB4RjQsMHgwNywweEJFLDB4QzgsMHg1MiwweEU4LDB4RkQsMHgwNywweDhCLDB4NDcsMHgzNiwweEU4LDB4RTgsMHgwNywweEJFLDB4REEsCisweDUyLDB4RTgsMHhGMSwweDA3LDB4OEIsMHg0NywweDNBLDB4RTgsMHhEQywweDA3LDB4QkUsMHhFMywweDUyLDB4RTgsMHhFNSwweDA3LAorMHg4QiwweDQ3LDB4M0MsMHhFOCwweEQwLDB4MDcsMHhFOCwweEQ5LDB4MDcsMHhCRSwweDE5LDB4NTMsMHhFOCwweEQ2LDB4MDcsMHg4QiwKKzB4NDcsMHg0OCwweEU4LDB4QzEsMHgwNywweEJFLDB4RkUsMHg1MiwweEU4LDB4Q0EsMHgwNywweDhCLDB4NDcsMHg0MiwweEU4LDB4QjUsCisweDA3LDB4QkUsMHgwNywweDUzLDB4RTgsMHhCRSwweDA3LDB4OEIsMHg0NywweDQ0LDB4RTgsMHhBOSwweDA3LDB4QkUsMHg3QywweDUzLAorMHhFOCwweEIyLDB4MDcsMHg4QiwweDQ3LDB4NEMsMHhFOCwweDlELDB4MDcsMHhCRSwweDg1LDB4NTMsMHhFOCwweEE2LDB4MDcsMHg4QiwKKzB4NDcsMHg0RSwweEU4LDB4OTEsMHgwNywweEJFLDB4OEUsMHg1MywweEU4LDB4OUEsMHgwNywweDhCLDB4NDcsMHg1MCwweEU4LDB4ODUsCisweDA3LDB4RTgsMHg4RSwweDA3LDB4QkUsMHgyMiwweDUzLDB4RTgsMHg4QiwweDA3LDB4OEIsMHg0NywweDRBLDB4RTgsMHg3NiwweDA3LAorMHhCRSwweEVDLDB4NTIsMHhFOCwweDdGLDB4MDcsMHg4QiwweDQ3LDB4MDgsMHhFOCwweDZBLDB4MDcsMHhCRSwweEY1LDB4NTIsMHhFOCwKKzB4NzMsMHgwNywweDhCLDB4NDcsMHg0MCwweEU4LDB4NUUsMHgwNywweEJFLDB4MTAsMHg1MywweEU4LDB4NjcsMHgwNywweDhCLDB4NDcsCisweDQ2LDB4RTgsMHg1MiwweDA3LDB4RTgsMHg1QiwweDA3LDB4QkUsMHg2QSwweDUzLDB4RTgsMHg1OCwweDA3LDB4OEIsMHg0NywweDdBLAorMHhFOCwweDQzLDB4MDcsMHhCRSwweDNELDB4NTMsMHhFOCwweDRDLDB4MDcsMHg4QiwweDQ3LDB4NzAsMHhFOCwweDM3LDB4MDcsMHhCRSwKKzB4NDYsMHg1MywweEU4LDB4NDAsMHgwNywweDhCLDB4NDcsMHg3MiwweEU4LDB4MkIsMHgwNywweEJFLDB4NEYsMHg1MywweEU4LDB4MzQsCisweDA3LDB4OEIsMHg0NywweDc0LDB4RTgsMHgxRiwweDA3LDB4RTgsMHgyOCwweDA3LDB4QkUsMHgyQiwweDUzLDB4RTgsMHgyNSwweDA3LAorMHg4QiwweDQ3LDB4MEMsMHhFOCwweDEwLDB4MDcsMHhCRSwweDM0LDB4NTMsMHhFOCwweDE5LDB4MDcsMHg4QiwweDQ3LDB4MTAsMHhFOCwKKzB4MDQsMHgwNywweEJFLDB4NTgsMHg1MywweEU4LDB4MEQsMHgwNywweDhCLDB4NDcsMHg3NiwweEU4LDB4RjgsMHgwNiwweEJFLDB4NjEsCisweDUzLDB4RTgsMHgwMSwweDA3LDB4OEIsMHg0NywweDc4LDB4RTgsMHhFQywweDA2LDB4QkUsMHg3MywweDUzLDB4RTgsMHhGNSwweDA2LAorMHg4QiwweDQ3LDB4M0UsMHhFOCwweEUwLDB4MDYsMHhFOCwweEU5LDB4MDYsMHhCRSwweDk3LDB4NTMsMHhFOCwweEU2LDB4MDYsMHg4QiwKKzB4NDcsMHg1MiwweEU4LDB4RDEsMHgwNiwweEJFLDB4QTAsMHg1MywweEU4LDB4REEsMHgwNiwweDhCLDB4NDcsMHg1NCwweEU4LDB4QzUsCisweDA2LDB4QkUsMHhBOSwweDUzLDB4RTgsMHhDRSwweDA2LDB4OEIsMHg0NywweDU2LDB4RTgsMHhCOSwweDA2LDB4QkUsMHhCMiwweDUzLAorMHhFOCwweEMyLDB4MDYsMHg4QiwweDQ3LDB4NTgsMHhFOCwweEFELDB4MDYsMHhCRSwweEJCLDB4NTMsMHhFOCwweEI2LDB4MDYsMHg4QiwKKzB4NDcsMHg1QSwweEU4LDB4QTEsMHgwNiwweEJFLDB4QzQsMHg1MywweEU4LDB4QUEsMHgwNiwweDhCLDB4NDcsMHg1QywweEU4LDB4OTUsCisweDA2LDB4RTgsMHg5RSwweDA2LDB4QkUsMHhDRCwweDUzLDB4RTgsMHg5QiwweDA2LDB4OEIsMHg0NywweDVFLDB4RTgsMHg4NiwweDA2LAorMHhCRSwweEQ2LDB4NTMsMHhFOCwweDhGLDB4MDYsMHg4QiwweDQ3LDB4NjAsMHhFOCwweDdBLDB4MDYsMHhCRSwweERGLDB4NTMsMHhFOCwKKzB4ODMsMHgwNiwweDhCLDB4NDcsMHg2MiwweEU4LDB4NkUsMHgwNiwweEJFLDB4RTgsMHg1MywweEU4LDB4NzcsMHgwNiwweDhCLDB4NDcsCisweDdDLDB4RTgsMHg2MiwweDA2LDB4QkUsMHhGMSwweDUzLDB4RTgsMHg2QiwweDA2LDB4OEIsMHg0NywweDdFLDB4RTgsMHg1NiwweDA2LAorMHhCRSwweEZBLDB4NTMsMHhFOCwweDVGLDB4MDYsMHg4QiwweDg3LDB4ODAsMHgwMCwweEU4LDB4NDksMHgwNiwweEU4LDB4NTIsMHgwNiwKKzB4QkUsMHg0MiwweDU0LDB4RTgsMHg0RiwweDA2LDB4OEIsMHg4NywweDlFLDB4MDAsMHhFOCwweDM5LDB4MDYsMHhCRSwweDAzLDB4NTQsCisweEU4LDB4NDIsMHgwNiwweDhCLDB4NDcsMHg2NCwweEU4LDB4MkQsMHgwNiwweEJFLDB4MEMsMHg1NCwweEU4LDB4MzYsMHgwNiwweDhCLAorMHg0NywweDZFLDB4RTgsMHgyMSwweDA2LDB4QkUsMHgxNSwweDU0LDB4RTgsMHgyQSwweDA2LDB4OEIsMHg4NywweDhFLDB4MDAsMHhFOCwKKzB4MTQsMHgwNiwweEJFLDB4MUUsMHg1NCwweEU4LDB4MUQsMHgwNiwweDhCLDB4ODcsMHg5MCwweDAwLDB4RTgsMHgwNywweDA2LDB4QkUsCisweDI3LDB4NTQsMHhFOCwweDEwLDB4MDYsMHg4QiwweDg3LDB4OTIsMHgwMCwweEU4LDB4RkEsMHgwNSwweEU4LDB4MDMsMHgwNiwweEJFLAorMHgzMCwweDU0LDB4RTgsMHgwMCwweDA2LDB4OEIsMHg4NywweDk0LDB4MDAsMHhFOCwweEVBLDB4MDUsMHhCRSwweDM5LDB4NTQsMHhFOCwKKzB4RjMsMHgwNSwweDhCLDB4ODcsMHg5NiwweDAwLDB4RTgsMHhERCwweDA1LDB4QkUsMHg2RiwweDU0LDB4RTgsMHhFNiwweDA1LDB4OEIsCisweDg3LDB4OTgsMHgwMCwweEU4LDB4RDAsMHgwNSwweEJFLDB4NUQsMHg1NCwweEU4LDB4RDksMHgwNSwweDhBLDB4ODcsMHhBMCwweDAwLAorMHhFOCwweEE3LDB4MDUsMHhCRSwweDU0LDB4NTQsMHhFOCwweENDLDB4MDUsMHg4QSwweDQ3LDB4MjgsMHhFOCwweDlCLDB4MDUsMHhCRSwKKzB4NjYsMHg1NCwweEU4LDB4QzAsMHgwNSwweDhBLDB4ODcsMHhBMSwweDAwLDB4RTgsMHg4RSwweDA1LDB4RTgsMHhCMywweDA1LDB4QkUsCisweDc4LDB4NTQsMHhFOCwweEIwLDB4MDUsMHg4QSwweDg3LDB4QTIsMHgwMCwweEU4LDB4N0UsMHgwNSwweEJFLDB4ODEsMHg1NCwweEU4LAorMHhBMywweDA1LDB4OEEsMHg4NywweEEzLDB4MDAsMHhFOCwweDcxLDB4MDUsMHhCRSwweDhBLDB4NTQsMHhFOCwweDk2LDB4MDUsMHg4QSwKKzB4ODcsMHhBNCwweDAwLDB4RTgsMHg2NCwweDA1LDB4QkUsMHg5MywweDU0LDB4RTgsMHg4OSwweDA1LDB4OEEsMHg4NywweEE1LDB4MDAsCisweEU4LDB4NTcsMHgwNSwweEJFLDB4OUMsMHg1NCwweEU4LDB4N0MsMHgwNSwweDhBLDB4ODcsMHhBNiwweDAwLDB4RTgsMHg0QSwweDA1LAorMHhCRSwweEE1LDB4NTQsMHhFOCwweDZGLDB4MDUsMHg4QSwweDg3LDB4QTcsMHgwMCwweEU4LDB4M0QsMHgwNSwweEJFLDB4QUUsMHg1NCwKKzB4RTgsMHg2MiwweDA1LDB4OEEsMHg4NywweEE4LDB4MDAsMHhFOCwweDMwLDB4MDUsMHhFOCwweDU1LDB4MDUsMHhCRSwweEI3LDB4NTQsCisweEU4LDB4NTIsMHgwNSwweDhBLDB4ODcsMHhBOSwweDAwLDB4RTgsMHgyMCwweDA1LDB4QkUsMHhDMCwweDU0LDB4RTgsMHg0NSwweDA1LAorMHg4QSwweDg3LDB4QUEsMHgwMCwweEU4LDB4MTMsMHgwNSwweEJFLDB4QzksMHg1NCwweEU4LDB4MzgsMHgwNSwweDhBLDB4ODcsMHhBQiwKKzB4MDAsMHhFOCwweDA2LDB4MDUsMHhCRSwweEQyLDB4NTQsMHhFOCwweDJCLDB4MDUsMHg4QSwweDg3LDB4QUQsMHgwMCwweEU4LDB4RjksCisweDA0LDB4QkUsMHhEQiwweDU0LDB4RTgsMHgxRSwweDA1LDB4OEEsMHg4NywweEFFLDB4MDAsMHhFOCwweEVDLDB4MDQsMHhCRSwweEU0LAorMHg1NCwweEU4LDB4MTEsMHgwNSwweDhBLDB4ODcsMHhBRiwweDAwLDB4RTgsMHhERiwweDA0LDB4QkUsMHhFRCwweDU0LDB4RTgsMHgwNCwKKzB4MDUsMHg4QSwweDg3LDB4QjAsMHgwMCwweEU4LDB4RDIsMHgwNCwweEU4LDB4RjcsMHgwNCwweEJFLDB4RjYsMHg1NCwweEU4LDB4RjQsCisweDA0LDB4OEEsMHg4NywweEIxLDB4MDAsMHhFOCwweEMyLDB4MDQsMHhCRSwweEZGLDB4NTQsMHhFOCwweEU3LDB4MDQsMHg4QSwweDg3LAorMHhCMiwweDAwLDB4RTgsMHhCNSwweDA0LDB4QkUsMHgwOCwweDU1LDB4RTgsMHhEQSwweDA0LDB4OEEsMHg4NywweEIzLDB4MDAsMHhFOCwKKzB4QTgsMHgwNCwweEJFLDB4MTEsMHg1NSwweEU4LDB4Q0QsMHgwNCwweDhBLDB4ODcsMHhCQiwweDAwLDB4RTgsMHg5QiwweDA0LDB4RTgsCisweEMwLDB4MDQsMHhCRSwweDFBLDB4NTUsMHhFOCwweEJELDB4MDQsMHg4QSwweDg3LDB4QkMsMHgwMCwweEU4LDB4OEIsMHgwNCwweEJFLAorMHgyMywweDU1LDB4RTgsMHhCMCwweDA0LDB4OEEsMHg4NywweEJFLDB4MDAsMHhFOCwweDdFLDB4MDQsMHhCRSwweDJDLDB4NTUsMHhFOCwKKzB4QTMsMHgwNCwweDhBLDB4ODcsMHhCRiwweDAwLDB4RTgsMHg3MSwweDA0LDB4RTgsMHg5NiwweDA0LDB4MDcsMHhDMywweDYwLDB4MDYsCisweDFFLDB4MTYsMHg4QiwweEVDLDB4RkYsMHg0RSwweDE2LDB4RjcsMHg0NiwweDFBLDB4MDAsMHgwMiwweDc0LDB4MDEsMHhGQiwweEI4LAorMHgwMCwweDAwLDB4OEUsMHhEOCwweDhFLDB4QzAsMHg4OSwweDJFLDB4MkQsMHg3QSwweEU4LDB4Q0IsMHgwMCwweDgxLDB4NjYsMHgxQSwKKzB4RkYsMHhGRSwweEM2LDB4MDYsMHgyQSwweDdBLDB4MDAsMHhFOCwweEQ4LDB4MDAsMHhCOCwweDAwLDB4NUYsMHhBMywweDJCLDB4N0EsCisweEU4LDB4NUQsMHgwMCwweDgwLDB4M0UsMHgyQSwweDdBLDB4MDAsMHg3NCwweDBBLDB4ODEsMHg0RSwweDFBLDB4MDAsMHgwMSwweEM2LAorMHgwNiwweDJBLDB4N0EsMHgwMCwweDE3LDB4MUYsMHgwNywweDYxLDB4Q0YsMHg5MCwweDYwLDB4MDYsMHgxRSwweDE2LDB4OEIsMHhFQywKKzB4RjcsMHg0NiwweDFBLDB4MDAsMHgwMiwweDc0LDB4MDEsMHhGQiwweEI4LDB4MDAsMHgwMCwweDhFLDB4RDgsMHg4RSwweEMwLDB4ODksCisweDJFLDB4MkQsMHg3QSwweDgxLDB4NjYsMHgxQSwweEZGLDB4RkUsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4RTgsMHg5MiwweDAwLAorMHhCOCwweDAwLDB4NUYsMHhBMywweDJCLDB4N0EsMHhFOCwweDE3LDB4MDAsMHg4MCwweDNFLDB4MkEsMHg3QSwweDAwLDB4NzQsMHgwQSwKKzB4ODEsMHg0RSwweDFBLDB4MDAsMHgwMSwweEM2LDB4MDYsMHgyQSwweDdBLDB4MDAsMHgxNywweDFGLDB4MDcsMHg2MSwweENGLDB4OTAsCisweEI4LDB4RjAsMHgwMCwweEU4LDB4OEMsMHhFRCwweEZGLDB4MjYsMHgyQiwweDdBLDB4QzMsMHg5MCwweDA2LDB4NTMsMHg1NiwweDgwLAorMHgzRSwweDI5LDB4N0EsMHgwMCwweDc0LDB4MDMsMHhFOCwweDNGLDB4MDAsMHhCRSwweEQ3LDB4NzksMHhFOCwweDI1LDB4MDIsMHg4QiwKKzB4RDgsMHhBMywweDI3LDB4N0EsMHgyRSwweDhBLDB4MDcsMHhBMiwweDI5LDB4N0EsMHhCMCwweENDLDB4MkUsMHg4OCwweDA3LDB4NUUsCisweDVCLDB4MDcsMHhDMywweEM2LDB4MDYsMHgyQSwweDdBLDB4MDAsMHhCOCwweDBBLDB4NUYsMHhBMywweDJCLDB4N0EsMHhDMywweDkwLAorMHg4QiwweDJFLDB4MkQsMHg3QSwweEU4LDB4MkIsMHgwMCwweEMzLDB4QzYsMHgwNiwweDJBLDB4N0EsMHgwMSwweEU4LDB4MDgsMHgwMCwKKzB4QjgsMHgwQSwweDVGLDB4QTMsMHgyQiwweDdBLDB4QzMsMHg5MCwweDU3LDB4ODAsMHgzRSwweDI5LDB4N0EsMHgwMCwweDc0LDB4MEYsCisweDhCLDB4M0UsMHgyNywweDdBLDB4QTAsMHgyOSwweDdBLDB4MkUsMHg4OCwweDA1LDB4QzYsMHgwNiwweDI5LDB4N0EsMHgwMCwweDVGLAorMHhDMywweDkwLDB4QkUsMHhCMiwweDRELDB4RTgsMHgwNiwweDAyLDB4QkUsMHhEOCwweDUxLDB4RTgsMHgwMCwweDAyLDB4RkYsMHg3NiwKKzB4MTQsMHg1OCwweEU4LDB4NDcsMHgwMiwweEJFLDB4REUsMHg1MSwweEU4LDB4RjMsMHgwMSwweEZGLDB4NzYsMHgwRSwweDU4LDB4RTgsCisweDNBLDB4MDIsMHhCRSwweEU0LDB4NTEsMHhFOCwweEU2LDB4MDEsMHhGRiwweDc2LDB4MTIsMHg1OCwweEU4LDB4MkQsMHgwMiwweEJFLAorMHhFQSwweDUxLDB4RTgsMHhEOSwweDAxLDB4RkYsMHg3NiwweDEwLDB4NTgsMHhFOCwweDIwLDB4MDIsMHhCRSwweDE0LDB4NTIsMHhFOCwKKzB4Q0MsMHgwMSwweEZGLDB4NzYsMHgwQSwweDU4LDB4RTgsMHgxMywweDAyLDB4QkUsMHgxQSwweDUyLDB4RTgsMHhCRiwweDAxLDB4RkYsCisweDc2LDB4MEMsMHg1OCwweEU4LDB4MDYsMHgwMiwweEJFLDB4Q0YsMHg1MSwweEU4LDB4QjIsMHgwMSwweEZGLDB4NzYsMHgxQSwweDU4LAorMHhFOCwweEY5LDB4MDEsMHhCRSwweEIyLDB4NEQsMHhFOCwweEE1LDB4MDEsMHhCRSwweEYwLDB4NTEsMHhFOCwweDlGLDB4MDEsMHhGRiwKKzB4NzYsMHgxOCwweDU4LDB4RTgsMHhFNiwweDAxLDB4QkUsMHhGNiwweDUxLDB4RTgsMHg5MiwweDAxLDB4RkYsMHg3NiwweDAyLDB4NTgsCisweEU4LDB4RDksMHgwMSwweEJFLDB4RkMsMHg1MSwweEU4LDB4ODUsMHgwMSwweEZGLDB4NzYsMHgwNCwweDU4LDB4RTgsMHhDQywweDAxLAorMHhCRSwweDAyLDB4NTIsMHhFOCwweDc4LDB4MDEsMHhGRiwweDc2LDB4MDAsMHg1OCwweEU4LDB4QkYsMHgwMSwweEJFLDB4MDgsMHg1MiwKKzB4RTgsMHg2QiwweDAxLDB4RkYsMHg3NiwweDA2LDB4NTgsMHhFOCwweEIyLDB4MDEsMHhCRSwweDBFLDB4NTIsMHhFOCwweDVFLDB4MDEsCisweEZGLDB4NzYsMHgwOCwweDU4LDB4RTgsMHhBNSwweDAxLDB4QkUsMHgyMCwweDUyLDB4RTgsMHg1MSwweDAxLDB4RkYsMHg3NiwweDE2LAorMHg1OCwweEU4LDB4OTgsMHgwMSwweEJFLDB4ODksMHg0RCwweEU4LDB4NDQsMHgwMSwweEMzLDB4OTAsMHhCRSwweEM5LDB4NEQsMHhFOCwKKzB4M0MsMHgwMSwweEMzLDB4M0MsMHgwMCwweDc0LDB4MDUsMHgzQywweDAxLDB4NzQsMHg1OSwweEMzLDB4QzcsMHgwNiwweDBDLDB4N0EsCisweENELDB4NTAsMHhDNywweDA2LDB4MEUsMHg3QSwweEYwLDB4NTAsMHhDNywweDA2LDB4MTAsMHg3QSwweEU4LDB4NTAsMHhDNywweDA2LAorMHgxMiwweDdBLDB4RUMsMHg1MCwweEM3LDB4MDYsMHgxNCwweDdBLDB4RjQsMHg1MCwweEM3LDB4MDYsMHgxNiwweDdBLDB4RkIsMHg1MCwKKzB4QzcsMHgwNiwweDE4LDB4N0EsMHgwMywweDUxLDB4QzcsMHgwNiwweDFBLDB4N0EsMHgwQiwweDUxLDB4QzcsMHgwNiwweDFDLDB4N0EsCisweDBFLDB4NTEsMHhDNywweDA2LDB4MUUsMHg3QSwweDEwLDB4NTEsMHhDNywweDA2LDB4MjAsMHg3QSwweDEyLDB4NTEsMHhDNywweDA2LAorMHgyMiwweDdBLDB4MTYsMHg1MSwweEM2LDB4MDYsMHgyNCwweDdBLDB4MDEsMHhDNiwweDA2LDB4MjUsMHg3QSwweDAxLDB4QzYsMHgwNiwKKzB4MjYsMHg3QSwweDAzLDB4QzMsMHhDNywweDA2LDB4MEMsMHg3QSwweDFBLDB4NTEsMHhDNywweDA2LDB4MEUsMHg3QSwweDRELDB4NTEsCisweEM3LDB4MDYsMHgxMCwweDdBLDB4NDcsMHg1MSwweEM3LDB4MDYsMHgxMiwweDdBLDB4NEEsMHg1MSwweEM3LDB4MDYsMHgxNCwweDdBLAorMHg0RiwweDUxLDB4QzcsMHgwNiwweDE2LDB4N0EsMHg1MSwweDUxLDB4QzcsMHgwNiwweDE4LDB4N0EsMHg1NSwweDUxLDB4QzcsMHgwNiwKKzB4MUEsMHg3QSwweDU2LDB4NTEsMHhDNywweDA2LDB4MUMsMHg3QSwweDU5LDB4NTEsMHhDNywweDA2LDB4MUUsMHg3QSwweDVBLDB4NTEsCisweEM3LDB4MDYsMHgyMCwweDdBLDB4NUIsMHg1MSwweEM3LDB4MDYsMHgyMiwweDdBLDB4NUUsMHg1MSwweEM2LDB4MDYsMHgyNCwweDdBLAorMHgyMCwweEM2LDB4MDYsMHgyNSwweDdBLDB4MjAsMHhDNiwweDA2LDB4MjYsMHg3QSwweDAyLDB4QzMsMHhBMSwweEY4LDB4NzksMHg0OCwKKzB4NzQsMHgxNCwweEJFLDB4RDcsMHg3OSwweEU4LDB4M0MsMHgwMCwweDhCLDB4RjgsMHhBQywweDNDLDB4M0EsMHg3NSwweDA3LDB4OEUsCisweEM3LDB4RTgsMHgzMCwweDAwLDB4OEIsMHhGOCwweEMzLDB4OTAsMHg4QiwweEM3LDB4MkIsMHgwNiwweEZFLDB4NzksMHg4QSwweEYwLAorMHgyNCwweDBGLDB4OEEsMHhEMCwweDAyLDB4RDAsMHgwMiwweEQwLDB4ODAsMHhDMiwweDBCLDB4QzAsMHhFRSwweDA0LDB4ODAsMHhDNiwKKzB4MDMsMHgwNCwweDNELDB4QzMsMHg4QywweEMwLDB4RTgsMHg5MywweDAwLDB4QjAsMHgzQSwweEU4LDB4RTQsMHgwMCwweDhCLDB4QzcsCisweEU4LDB4ODksMHgwMCwweEMzLDB4NTEsMHgzMywweEM5LDB4OTAsMHhBQywweDNDLDB4MjAsMHg3NCwweEZCLDB4OTAsMHgwQSwweEMwLAorMHg3NCwweDI2LDB4MkMsMHgzMCwweDcyLDB4MjIsMHgzQywweDA5LDB4NzYsMHgxNCwweDNDLDB4MTEsMHg3MiwweDFBLDB4MkMsMHgwNywKKzB4M0MsMHgwRiwweDc2LDB4MEEsMHgzQywweDJBLDB4NzIsMHgxMCwweDJDLDB4MjAsMHgzQywweDBGLDB4NzcsMHgwQSwweDk4LDB4QzEsCisweEUxLDB4MDQsMHgwMywweEM4LDB4QUMsMHhFQiwweEQ3LDB4OTAsMHg0RSwweDhCLDB4QzEsMHg1OSwweEMzLDB4OTAsMHgwNiwweDhDLAorMHhDOCwweDhFLDB4QzAsMHhFOCwweDAyLDB4MDAsMHgwNywweEMzLDB4MjYsMHg4QSwweDA0LDB4NDYsMHgwQSwweEMwLDB4NzQsMHgwNiwKKzB4RTgsMHg4RiwweDAwLDB4RUIsMHhGMywweDkwLDB4QzMsMHg5MCwweDBCLDB4QzAsMHg3NCwweDdBLDB4NTEsMHgzMywweEQyLDB4QjksCisweEU4LDB4MDMsMHhGNywweEYxLDB4OEIsMHhDQSwweEU4LDB4MDMsMHgwMCwweDhCLDB4QzEsMHg1OSwweEJBLDB4NjQsMHgwMCwweEY2LAorMHhGMiwweEU4LDB4MEMsMHgwMCwweDhBLDB4QzQsMHg5OCwweEIyLDB4MEEsMHhGNiwweEYyLDB4RTgsMHgwMiwweDAwLDB4OEEsMHhDNCwKKzB4NTAsMHgwQSwweEYwLDB4NzQsMHgwNSwweDA0LDB4MzAsMHhFOCwweDU4LDB4MDAsMHg1OCwweEMzLDB4ODYsMHhDNCwweEU4LDB4MDcsCisweDAwLDB4ODYsMHhDNCwweEU4LDB4MDIsMHgwMCwweEMzLDB4OTAsMHhDMSwweEM4LDB4MDQsMHhFOCwweDA4LDB4MDAsMHhDMSwweEMwLAorMHgwNCwweEU4LDB4MDIsMHgwMCwweEMzLDB4OTAsMHg1MywweDUwLDB4MjQsMHgwRiwweEJCLDB4Q0EsMHg2MiwweDJFLDB4RDcsMHhFOCwKKzB4MzAsMHgwMCwweDU4LDB4NUIsMHhDMywweDkwLDB4ODYsMHhDNCwweEU4LDB4MDcsMHgwMCwweDg2LDB4QzQsMHhFOCwweDAyLDB4MDAsCisweEMzLDB4OTAsMHg1MCwweEI5LDB4MDgsMHgwMCwweDhBLDB4RTAsMHgzMiwweEMwLDB4RDEsMHhDMCwweDA0LDB4MzAsMHhFOCwweDExLAorMHgwMCwweEUyLDB4RjUsMHg1OCwweEMzLDB4OTAsMHhCMCwweDMwLDB4RTgsMHgwNywweDAwLDB4QzMsMHhCMCwweDIwLDB4RTgsMHgwMSwKKzB4MDAsMHhDMywweDU2LDB4OEIsMHgzNiwweEQwLDB4NzksMHg4OCwweDg0LDB4RDAsMHg3NywweDQ2LDB4ODEsMHhFNiwweEZGLDB4MDEsCisweEZGLDB4MDYsMHhENCwweDc5LDB4ODksMHgzNiwweEQwLDB4NzksMHg4MSwweDNFLDB4RDQsMHg3OSwweEZFLDB4MDEsMHg3NSwweDA4LAorMHg1NiwweEU4LDB4MTQsMHgwMCwweDVFLDB4RUIsMHhGMSwweDkwLDB4NUUsMHhDMywweEJBLDB4MDIsMHgwMiwweEVDLDB4MjQsMHgwMSwKKzB4NzQsMHgwNCwweEJBLDB4MDYsMHgwMiwweEVDLDB4QzMsMHg5MCwweDgwLDB4M0UsMHhGNiwweDc5LDB4MDAsMHg3NCwweDA5LDB4NjAsCisweEI4LDB4MDEsMHgwMCwweEU4LDB4MkMsMHhFQSwweDYxLDB4OTAsMHhCQSwweDAyLDB4MDIsMHhFQywweEE4LDB4MDQsMHg3NCwweDI4LAorMHg4QiwweDM2LDB4RDIsMHg3OSwweDgzLDB4M0UsMHhENCwweDc5LDB4MDAsMHg3NCwweDFELDB4OEEsMHg4NCwweEQwLDB4NzcsMHg0NiwKKzB4ODEsMHhFNiwweEZGLDB4MDEsMHg4OSwweDM2LDB4RDIsMHg3OSwweEZGLDB4MEUsMHhENCwweDc5LDB4QkEsMHgwNiwweDAyLDB4RUUsCisweEJBLDB4MDIsMHgwMiwweEVDLDB4QTgsMHgwNCwweDc1LDB4REMsMHhBMSwweEQ0LDB4NzksMHhDMywweDUyLDB4QkEsMHgwNiwweDAyLAorMHhFRSwweDVBLDB4QzMsMHg5MCwweDUyLDB4NTAsMHhCQSwweDAyLDB4MDIsMHhFQywweEE4LDB4MDQsMHg3NCwweDA4LDB4NTgsMHg1QSwKKzB4RTgsMHhFOSwweEZGLDB4RjksMHhDMywweDkwLDB4NTgsMHg1QSwweEY4LDB4QzMsMHg1MiwweDUwLDB4QkEsMHgwMiwweDAyLDB4RUMsCisweEE4LDB4MDQsMHg3NCwweEZCLDB4NTgsMHg1QSwweEU4LDB4RDMsMHhGRiwweEMzLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAorMHgzNiwweDM3LDB4MzgsMHgzOSwweDQxLDB4NDIsMHg0MywweDQ0LDB4NDUsMHg0NiwweDUzLDB4NTAsMHg4QSwweEUwLDB4ODAsMHhFNCwKKzB4MEYsMHhCQiwweENBLDB4NjIsMHhDMCwweEU4LDB4MDQsMHgyRSwweEQ3LDB4RTgsMHhDRSwweEZGLDB4OEEsMHhDNCwweDJFLDB4RDcsCisweEU4LDB4QzcsMHhGRiwweDU4LDB4NUIsMHhDMywweDg2LDB4RTAsMHhFOCwweERGLDB4RkYsMHg4NiwweEUwLDB4RTgsMHhEQSwweEZGLAorMHhDMywweDkwLDB4QkUsMHhCMiwweDRELDB4NTAsMHgyRSwweEFDLDB4M0MsMHgwMCwweDc0LDB4MDUsMHhFOCwweEFCLDB4RkYsMHhFQiwKKzB4RjUsMHg1OCwweEMzLDB4OTAsMHhDOCwweDA4LDB4MDAsMHgwMCwweDU2LDB4NTcsMHg4QiwweDc2LDB4MDQsMHhCRiwweDA0LDB4MDAsCisweEM3LDB4NDYsMHhGQywweDAwLDB4MDAsMHhDNywweDQ2LDB4RkEsMHgwMCwweDAwLDB4QzcsMHg0NiwweEY4LDB4MDAsMHgwMCwweDgzLAorMHg3RSwweDA2LDB4MDAsMHg3NSwweDBFLDB4NTYsMHhFOCwweEI2LDB4MEUsMHg1OSwweDBCLDB4QzAsMHg3NSwweDA1LDB4OEIsMHhDNywKKzB4RTksMHg1QiwweDAxLDB4OEIsMHg0NiwweEZDLDB4ODksMHg0NiwweEZFLDB4MEIsMHhGRiwweDc1LDB4MDUsMHhCOCwweDAxLDB4MDAsCisweEVCLDB4MDIsMHgzMywweEMwLDB4NTAsMHg1NiwweEU4LDB4QTQsMHgwRCwweDU5LDB4NTksMHhCNCwweDAwLDB4ODksMHg0NiwweEZDLAorMHg4QiwweDVFLDB4RkMsMHg4MywweEZCLDB4MDgsMHg3NiwweDAzLDB4RTksMHgyQiwweDAxLDB4RDEsMHhFMywweDJFLDB4RkYsMHhBNywKKzB4QjIsMHg2NCwweEI4LDB4MDMsMHgwMCwweEU5LDB4MjYsMHgwMSwweDgzLDB4N0UsMHhGQSwweDAwLDB4NzQsMHgxNCwweEM3LDB4NDYsCisweEZBLDB4MDAsMHgwMCwweDhBLDB4NDQsMHg1OCwweDk4LDB4NTAsMHg4QSwweDQ0LDB4NTksMHg5OCwweDUwLDB4RTgsMHhDMiwweDBGLAorMHg1OSwweDU5LDB4ODMsMHg3RSwweEY4LDB4MDAsMHg3NCwweDBBLDB4QzcsMHg0NiwweEY4LDB4MDAsMHgwMCwweDU2LDB4RTgsMHg5QiwKKzB4MDgsMHg1OSwweDgzLDB4N0UsMHgwNiwweDAwLDB4NzUsMHgwNSwweDhCLDB4QzcsMHhFOSwweEYxLDB4MDAsMHg4MywweEZGLDB4MDQsCisweDc1LDB4MDMsMHhFOSwweEU2LDB4MDAsMHg4QiwweEM3LDB4RTksMHhFNCwweDAwLDB4ODMsMHg3RSwweEZFLDB4MDAsMHg3NSwweDAzLAorMHhCRiwweDAyLDB4MDAsMHhFOSwweEQ1LDB4MDAsMHg4MywweDdFLDB4RkUsMHgwMCwweDc1LDB4MDMsMHhCRiwweDAxLDB4MDAsMHhFOSwKKzB4QzksMHgwMCwweDhCLDB4NUUsMHhGRSwweDgzLDB4RkIsMHgwNywweDc2LDB4MDMsMHhFOSwweDg2LDB4MDAsMHhEMSwweEUzLDB4MkUsCisweEZGLDB4QTcsMHhBMiwweDY0LDB4MzMsMHhGRiwweEU5LDB4N0YsMHgwMCwweEJGLDB4MDQsMHgwMCwweDgwLDB4N0MsMHg1OCwweDBGLAorMHg3NCwweDIyLDB4ODMsMHg3RSwweEY4LDB4MDAsMHg3NSwweDFDLDB4RkUsMHg0NCwweDU4LDB4NkEsMHgwOCwweDU2LDB4RTgsMHg3RSwKKzB4MEMsMHg1OSwweDU5LDB4OEEsMHg0NCwweDU4LDB4MDQsMHg4MCwweDUwLDB4NTYsMHhFOCwweDcyLDB4MEMsMHg1OSwweDU5LDB4QzcsCisweDQ2LDB4RkEsMHgwMSwweDAwLDB4ODMsMHg3RSwweEY4LDB4MDAsMHg3NCwweDBBLDB4QzcsMHg0NiwweEY4LDB4MDAsMHgwMCwweDU2LAorMHhFOCwweDE5LDB4MDgsMHg1OSwweEVCLDB4NDIsMHhCRiwweDA0LDB4MDAsMHg4MCwweDdDLDB4NTgsMHgwMCwweDc0LDB4MjIsMHg4MywKKzB4N0UsMHhGOCwweDAwLDB4NzUsMHgxQywweEZFLDB4NEMsMHg1OCwweDZBLDB4MDgsMHg1NiwweEU4LDB4NDEsMHgwQywweDU5LDB4NTksCisweDhBLDB4NDQsMHg1OCwweDA0LDB4ODAsMHg1MCwweDU2LDB4RTgsMHgzNSwweDBDLDB4NTksMHg1OSwweEM3LDB4NDYsMHhGQSwweDAxLAorMHgwMCwweDgzLDB4N0UsMHhGOCwweDAwLDB4NzQsMHgwQSwweEM3LDB4NDYsMHhGOCwweDAwLDB4MDAsMHg1NiwweEU4LDB4REMsMHgwNywKKzB4NTksMHhFQiwweDA1LDB4QkYsMHgwNCwweDAwLDB4RUIsMHgwMCwweEVCLDB4MzEsMHhCRiwweDA0LDB4MDAsMHhFQiwweDJDLDB4QzcsCisweDQ2LDB4RjgsMHgwMSwweDAwLDB4NkEsMHgwOCwweDU2LDB4RTgsMHgwNSwweDBDLDB4NTksMHg1OSwweDgwLDB4N0MsMHg1OCwweDA5LAorMHg3RCwweDA0LDB4QjAsMHgwRiwweEVCLDB4MDIsMHhCMCwweDAwLDB4MDQsMHg4MCwweDUwLDB4NTYsMHhFOCwweEYwLDB4MEIsMHg1OSwKKzB4NTksMHhCRiwweDA0LDB4MDAsMHhFQiwweDA1LDB4QkYsMHgwNCwweDAwLDB4RUIsMHgwMCwweEU5LDB4QTUsMHhGRSwweDVGLDB4NUUsCisweEM5LDB4QzMsMHhFNCwweDYzLDB4NjMsMHg2NCwweDYzLDB4NjQsMHg2MywweDY0LDB4NjMsMHg2NCwweEU5LDB4NjMsMHgyNiwweDY0LAorMHg1MSwweDY0LDB4NzgsMHg2MywweEJBLDB4NjMsMHhDNiwweDYzLDB4OTYsMHg2NCwweEQyLDB4NjMsMHg2QSwweDY0LDB4NkEsMHg2NCwKKzB4NkYsMHg2NCwweDcyLDB4NjMsMHhDOCwweDA4LDB4MDAsMHgwMCwweDU2LDB4NTcsMHg4QiwweDc2LDB4MDQsMHg4QiwweDdFLDB4MDgsCisweDZBLDB4MDEsMHg1NiwweEU4LDB4QTksMHgwQiwweDU5LDB4NTksMHg4QSwweDQ2LDB4MDYsMHhDMCwweEUwLDB4MDYsMHgwNCwweDgwLAorMHg1MCwweDU2LDB4RTgsMHg5QSwweDBCLDB4NTksMHg1OSwweEM3LDB4NDYsMHhGRSwweDAwLDB4MDAsMHg4OSwweDdFLDB4RjgsMHhFQiwKKzB4MDMsMHhGRiwweDQ2LDB4RkUsMHg4QiwweDVFLDB4RjgsMHhGRiwweDQ2LDB4RjgsMHg4MCwweDNGLDB4MDAsMHg3NSwweEYyLDB4ODMsCisweDdFLDB4RkUsMHgxMCwweDdELDB4MjUsMHhCOCwweDEwLDB4MDAsMHgyQiwweDQ2LDB4RkUsMHhEMSwweEY4LDB4ODksMHg0NiwweEZDLAorMHhDNywweDQ2LDB4RkEsMHgwMCwweDAwLDB4RUIsMHgwQiwweDZBLDB4MjAsMHg1NiwweEU4LDB4NjIsMHgwQiwweDU5LDB4NTksMHhGRiwKKzB4NDYsMHhGQSwweDhCLDB4NDYsMHhGQSwweDNCLDB4NDYsMHhGQywweDdDLDB4RUQsMHhFQiwweDBDLDB4OEIsMHhERiwweDQ3LDB4OEEsCisweDA3LDB4NTAsMHg1NiwweEU4LDB4NDksMHgwQiwweDU5LDB4NTksMHg4MCwweDNELDB4MDAsMHg3NSwweEVGLDB4NkEsMHgwMiwweDU2LAorMHhFOCwweDNDLDB4MEIsMHg1OSwweDU5LDB4RUIsMHgwMCwweDVGLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwNCwweDAwLDB4MDAsMHg1NiwKKzB4NTcsMHg4QiwweDdFLDB4MDQsMHhDNywweDQ2LDB4RkUsMHgwMCwweDAwLDB4QkUsMHgxNCwweDAwLDB4RTksMHgwOSwweDAxLDB4OEIsCisweDVFLDB4RkUsMHg4MywweEMzLDB4MDQsMHgyQiwweERGLDB4OEEsMHg4NywweEFDLDB4MEIsMHg4OCwweDQ0LDB4NUEsMHhDNiwweDQ0LAorMHg1OCwweDA4LDB4OEEsMHg0NiwweEZFLDB4ODgsMHg0NCwweDU5LDB4QzcsMHg0NCwweDA2LDB4MDAsMHgwMCwweEM2LDB4NDQsMHgxOSwKKzB4MDAsMHhDNiwweDQ0LDB4MUEsMHgwMCwweEM2LDB4NDQsMHgxQiwweDAwLDB4QzYsMHg0NCwweDFELDB4MEQsMHhDNiwweDQ0LDB4MUUsCisweDAzLDB4QzYsMHg0NCwweDFGLDB4MDAsMHhDNiwweDQ0LDB4MjAsMHgwMCwweEM2LDB4NDQsMHgyMSwweDAwLDB4QzYsMHg0NCwweDVCLAorMHgwMCwweEM2LDB4NDQsMHg1RCwweDAwLDB4QzYsMHg0NCwweDVFLDB4MDAsMHhDNiwweDQ0LDB4NUYsMHgwMCwweEM2LDB4NDQsMHg2MCwKKzB4MDAsMHhDNywweDQ2LDB4RkMsMHgwMCwweDAwLDB4RUIsMHgwRCwweDhCLDB4NUUsMHhGQywweEQxLDB4RTMsMHhDNywweDQwLDB4MzAsCisweDAwLDB4MDAsMHhGRiwweDQ2LDB4RkMsMHg4MywweDdFLDB4RkMsMHgxMCwweDdDLDB4RUQsMHhDNywweDQ2LDB4RkMsMHgwMCwweDAwLAorMHhFQiwweDBBLDB4OEIsMHg1RSwweEZDLDB4QzYsMHg0MCwweDUwLDB4MDAsMHhGRiwweDQ2LDB4RkMsMHg4MywweDdFLDB4RkMsMHgwNCwKKzB4N0MsMHhGMCwweEM3LDB4NDQsMHg1NCwweDAwLDB4MDAsMHhDNywweDQ0LDB4NTYsMHgwMCwweDAwLDB4OEEsMHg0NCwweDVBLDB4OTgsCisweEJBLDB4RjgsMHgwMCwweDIzLDB4RDAsMHhCOCwweDA1LDB4MDAsMHgwQiwweEMyLDB4ODksMHg0NiwweEZDLDB4OUMsMHhGQSwweDhBLAorMHg0NiwweEZDLDB4QkEsMHhGRSwweDAwLDB4RUUsMHhCQSwweDAwLDB4MDAsMHhFQywweDlELDB4MjQsMHgwOCwweDg4LDB4NDYsMHhGQywKKzB4ODMsMHg3RSwweEZDLDB4MDAsMHg3NSwweDAyLDB4RUIsMHg0QSwweEZGLDB4NzYsMHhGRSwweEU4LDB4N0EsMHgwQywweDU5LDB4NjgsCisweDM1LDB4MDIsMHg1NiwweEU4LDB4MzIsMHgwQSwweDU5LDB4NTksMHgwQiwweEMwLDB4NzUsMHgzNCwweDY4LDB4MzgsMHgwMiwweDU2LAorMHhFOCwweDI1LDB4MEEsMHg1OSwweDU5LDB4MEIsMHhDMCwweDc1LDB4MjcsMHg2OCwweDQyLDB4MDIsMHg1NiwweEU4LDB4MTgsMHgwQSwKKzB4NTksMHg1OSwweDBCLDB4QzAsMHg3NSwweDFBLDB4NjgsMHg0QywweDAyLDB4NTYsMHhFOCwweDBCLDB4MEEsMHg1OSwweDU5LDB4MEIsCisweEMwLDB4NzUsMHgwRCwweDY4LDB4NTYsMHgwMiwweDU2LDB4RTgsMHhGRSwweDA5LDB4NTksMHg1OSwweDBCLDB4QzAsMHg3NCwweDAyLAorMHhFQiwweDAwLDB4RkYsMHg0NiwweEZFLDB4ODMsMHhDNiwweDYyLDB4MzksMHg3RSwweEZFLDB4N0QsMHgwMywweEU5LDB4RUYsMHhGRSwKKzB4RUIsMHgwMCwweDVGLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwOCwweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg0NiwweDA0LDB4QkEsCisweDYyLDB4MDAsMHhGNywweEVBLDB4MDUsMHgxNCwweDAwLDB4OEIsMHhGMCwweDgzLDB4N0UsMHgwNiwweDAwLDB4NzQsMHgwNSwweEI4LAorMHgxMCwweDAwLDB4RUIsMHgwMywweEI4LDB4MDgsMHgwMCwweDg5LDB4NDQsMHgwNCwweDhBLDB4NDYsMHgwOCwweDg4LDB4NDQsMHg1QywKKzB4NTYsMHhFOCwweDU5LDB4MDQsMHg1OSwweDhCLDB4RjgsMHg4QiwweEM3LDB4ODksMHg0NCwweDU2LDB4ODksMHg0NCwweDU0LDB4OEEsCisweDQ0LDB4NUQsMHg4OCwweDQ0LDB4MkYsMHgwQiwweEZGLDB4NzUsMHgxRCwweDY4LDB4QzIsMHgwRiwweDZBLDB4MDEsMHg1NiwweEU4LAorMHgwMiwweEZFLDB4ODMsMHhDNCwweDA2LDB4RUIsMHgwMCwweDZBLDB4MDEsMHg1NiwweEU4LDB4NDcsMHhGQywweDU5LDB4NTksMHgwQiwKKzB4QzAsMHg3NSwweEY0LDB4QkYsMHgwMSwweDAwLDB4ODksMHg3RSwweEZBLDB4QjksMHgwNSwweDAwLDB4QkIsMHhFOSwweDZBLDB4MkUsCisweDhCLDB4MDcsMHgzQiwweDQ2LDB4RkEsMHg3NCwweDA3LDB4NDMsMHg0MywweEUyLDB4RjQsMHhFOSwweEE0LDB4MDMsMHgyRSwweEZGLAorMHg2NywweDBBLDB4QzcsMHg0NCwweDA2LDB4MDIsMHgwMCwweEM3LDB4NDQsMHgwOCwweEY0LDB4MDgsMHg4QiwweDVFLDB4MDQsMHhEMSwKKzB4RTMsMHg4QiwweDg3LDB4RkMsMHgwOCwweDg5LDB4NDQsMHgwQSwweDMzLDB4QzAsMHg4QiwweEY4LDB4ODksMHg0NCwweDU0LDB4RTksCisweDgwLDB4MDMsMHg1NiwweEU4LDB4QkIsMHgwNSwweDU5LDB4QkYsMHgwMSwweDAwLDB4OEEsMHg0NCwweDVELDB4ODgsMHg0NCwweDYwLAorMHhFOSwweDZGLDB4MDMsMHg4MywweDdDLDB4MDQsMHgwOCwweDc1LDB4MzAsMHg4MCwweDdDLDB4NUMsMHgwMSwweDc1LDB4MTUsMHg4QSwKKzB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhFNCwweDA4LDB4NTYsMHhFOCwweEY3LDB4MDgsCisweDU5LDB4NTksMHhFQiwweDEzLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweEM0LAorMHgwOCwweDU2LDB4RTgsMHhFMiwweDA4LDB4NTksMHg1OSwweEVCLDB4MkUsMHg4MCwweDdDLDB4NUMsMHgwMSwweDc1LDB4MTUsMHg4QSwKKzB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhENCwweDA4LDB4NTYsMHhFOCwweEM3LDB4MDgsCisweDU5LDB4NTksMHhFQiwweDEzLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweEI0LAorMHgwOCwweDU2LDB4RTgsMHhCMiwweDA4LDB4NTksMHg1OSwweDZBLDB4MDEsMHg1NiwweEU4LDB4ODcsMHhGQiwweDU5LDB4NTksMHg4QiwKKzB4RDgsMHg4MywweEZCLDB4MDMsMHg3NywweDJBLDB4RDEsMHhFMywweDJFLDB4RkYsMHhBNywweEUxLDB4NkEsMHhCRiwweDAxLDB4MDAsCisweDhBLDB4NDQsMHg1RCwweDg4LDB4NDQsMHg1RSwweEVCLDB4MTgsMHg4QSwweDQ0LDB4NUQsMHgwNCwweEZGLDB4MjQsMHgwNywweDg4LAorMHg0NCwweDVELDB4RUIsMHgwQywweDhBLDB4NDQsMHg1RCwweEZFLDB4QzAsMHgyNCwweDA3LDB4ODgsMHg0NCwweDVELDB4RUIsMHgwMCwKKzB4RTksMHhDRiwweDAyLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweEZELDB4MDIsCisweDU2LDB4RTgsMHg2MywweDA4LDB4NTksMHg1OSwweDY4LDB4MUQsMHgwMywweDU2LDB4RTgsMHg1QSwweDA4LDB4NTksMHg1OSwweDZBLAorMHgwMSwweDU2LDB4RTgsMHgyRiwweEZCLDB4NTksMHg1OSwweDhCLDB4RDgsMHg4MywweEZCLDB4MDMsMHg3NywweDM2LDB4RDEsMHhFMywKKzB4MkUsMHhGRiwweEE3LDB4RDksMHg2QSwweEJGLDB4MDEsMHgwMCwweDhBLDB4NDQsMHg1RCwweDg4LDB4NDQsMHg1RiwweEVCLDB4MjQsCisweDhBLDB4NDQsMHg1RCwweDA0LDB4RkYsMHg4QSwweDU0LDB4MDQsMHg4MCwweEMyLDB4RkYsMHgyMiwweEMyLDB4ODgsMHg0NCwweDVELAorMHhFQiwweDEyLDB4OEEsMHg0NCwweDVELDB4RkUsMHhDMCwweDhBLDB4NTQsMHgwNCwweDgwLDB4QzIsMHhGRiwweDIyLDB4QzIsMHg4OCwKKzB4NDQsMHg1RCwweEVCLDB4MDAsMHhFOSwweDZCLDB4MDIsMHg4QiwweDVDLDB4MDYsMHg4MywweEMzLDB4RkUsMHhEMSwweEUzLDB4OEIsCisweDQwLDB4MDgsMHg4OSwweDA0LDB4OEIsMHgxQywweEZGLDB4NzcsMHgwNiwweDZBLDB4MDAsMHg1NiwweEU4LDB4ODUsMHhGQywweDgzLAorMHhDNCwweDA2LDB4OEIsMHg1QywweDA2LDB4NEIsMHhEMSwweEUzLDB4OEIsMHg0MCwweDA4LDB4ODksMHg0NCwweDAyLDB4OEIsMHg1QywKKzB4MDIsMHhGRiwweDc3LDB4MDYsMHg2QSwweDAxLDB4NTYsMHhFOCwweDZBLDB4RkMsMHg4MywweEM0LDB4MDYsMHg2QSwweDAxLDB4NTYsCisweEU4LDB4QjEsMHhGQSwweDU5LDB4NTksMHg4QiwweEQ4LDB4ODMsMHhGQiwweDAzLDB4NzYsMHgwMywweEU5LDB4MUYsMHgwMiwweEQxLAorMHhFMywweDJFLDB4RkYsMHhBNywweEQxLDB4NkEsMHg4QiwweDVDLDB4MDIsMHg4QiwweDQ3LDB4MDQsMHg4OSwweDQ0LDB4MDIsMHg4QiwKKzB4NUMsMHgwMiwweDgwLDB4M0YsMHg0NCwweDc1LDB4MEQsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHhCNCwweDAwLDB4M0IsCisweDQ0LDB4MDQsMHg3RCwweEUyLDB4OEIsMHg0NiwweDA0LDB4RDEsMHhFMCwweDhCLDB4MUMsMHgwMywweEQ4LDB4OEIsMHg0NCwweDAyLAorMHg4OSwweDQ3LDB4MDgsMHg4QiwweDVDLDB4MDYsMHg0QiwweEQxLDB4RTMsMHg4QiwweDQ0LDB4MDIsMHg4OSwweDQwLDB4MDgsMHhFOSwKKzB4REUsMHgwMSwweDhCLDB4NUMsMHgwMiwweDhCLDB4NDcsMHgwMiwweDg5LDB4NDQsMHgwMiwweDhCLDB4NUMsMHgwMiwweDgwLDB4M0YsCisweDQ0LDB4NzUsMHgwRCwweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweEI0LDB4MDAsMHgzQiwweDQ0LDB4MDQsMHg3RCwweEUyLAorMHg4QiwweDQ2LDB4MDQsMHhEMSwweEUwLDB4OEIsMHgxQywweDAzLDB4RDgsMHg4QiwweDQ0LDB4MDIsMHg4OSwweDQ3LDB4MDgsMHg4QiwKKzB4NUMsMHgwNiwweDRCLDB4RDEsMHhFMywweDhCLDB4NDQsMHgwMiwweDg5LDB4NDAsMHgwOCwweEU5LDB4QTIsMHgwMSwweEJGLDB4MDEsCisweDAwLDB4RTksMHg5QywweDAxLDB4OEIsMHg1QywweDAyLDB4OEEsMHgwNywweEI0LDB4MDAsMHg4OSwweDQ2LDB4RjgsMHhCOSwweDBDLAorMHgwMCwweEJCLDB4QTEsMHg2QSwweDJFLDB4OEIsMHgwNywweDNCLDB4NDYsMHhGOCwweDc0LDB4MDcsMHg0MywweDQzLDB4RTIsMHhGNCwKKzB4RTksMHg3NywweDAxLDB4MkUsMHhGRiwweDY3LDB4MTgsMHg4QiwweDQ2LDB4MDQsMHhEMSwweEUwLDB4OEIsMHg1QywweDAyLDB4MDMsCisweEQ4LDB4OEIsMHg0NywweDA4LDB4OEIsMHg1QywweDA2LDB4RkYsMHg0NCwweDA2LDB4RDEsMHhFMywweDg5LDB4NDAsMHgwOCwweDhCLAorMHgxQywweDgwLDB4N0YsMHgwMSwweDAwLDB4NzQsMHgxMiwweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweDhCLDB4MUMsMHg4QSwKKzB4NTcsMHgwMSwweEI2LDB4MDAsMHg4QiwweERBLDB4ODgsMHg0MCwweDE4LDB4RTksMHg0MCwweDAxLDB4RkYsMHg0QywweDA2LDB4RTksCisweDNBLDB4MDEsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHg4QiwweDFDLDB4OEEsMHg1NywweDAxLDB4QjYsMHgwMCwweDhCLAorMHhEQSwweDg4LDB4NDAsMHgxOCwweEU5LDB4MjUsMHgwMSwweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweDhCLDB4MUMsMHg4QSwKKzB4NTcsMHgwMSwweEI2LDB4MDAsMHg4QiwweERBLDB4ODgsMHg0MCwweDE4LDB4RkYsMHg0QywweDA2LDB4RTksMHgwRCwweDAxLDB4OEIsCisweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHg4QiwweDFDLDB4OEEsMHg1NywweDAxLDB4QjYsMHgwMCwweDhCLDB4REEsMHgzMCwweDQwLAorMHgxOCwweEU5LDB4RjgsMHgwMCwweEI4LDB4RjAsMHgxMCwweDhCLDB4RjgsMHg4OSwweDQ0LDB4NTQsMHg4QSwweDQ0LDB4NUYsMHg4OCwKKzB4NDQsMHg1RCwweEU5LDB4RTcsMHgwMCwweDhBLDB4NDQsMHgxQywweDk4LDB4M0QsMHgwMiwweDAwLDB4NzQsMHgwNywweDNELDB4MDMsCisweDAwLDB4NzQsMHgwMiwweEVCLDB4MDcsMHhDNywweDQ2LDB4RkUsMHgwMCwweDAwLDB4RUIsMHgyQiwweDhBLDB4NDQsMHgxQywweDk4LAorMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHg2OSwweDAyLDB4NTYsMHhFOCwweDZCLDB4MDYsMHg1OSwweDU5LDB4NkEsMHgwMSwKKzB4NTYsMHhFOCwweDQwLDB4RjksMHg1OSwweDU5LDB4ODksMHg0NiwweEZFLDB4ODMsMHg3RSwweEZFLDB4MDAsMHg3NCwweDA2LDB4ODMsCisweDdFLDB4RkUsMHgwMywweDc1LDB4RTksMHhFQiwweDAwLDB4ODMsMHg3RSwweEZFLDB4MDMsMHg3NCwweDYyLDB4OEEsMHg0NCwweDFDLAorMHg5OCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweDZELDB4MDIsMHg1NiwweEU4LDB4M0EsMHgwNiwweDU5LDB4NTksMHg1NiwKKzB4RTgsMHg0RCwweDk3LDB4NTksMHg4OSwweDQ2LDB4RkMsMHg4QiwweDVFLDB4RkMsMHg4MywweEVCLDB4RkUsMHg4MywweEZCLDB4MDMsCisweDc3LDB4MzMsMHhEMSwweEUzLDB4MkUsMHhGRiwweEE3LDB4OTksMHg2QSwweDY4LDB4QUMsMHgwMiwweDU2LDB4RTgsMHgxNywweDA2LAorMHg1OSwweDU5LDB4RUIsMHgyMywweDY4LDB4OEYsMHgwMiwweDU2LDB4RTgsMHgwQywweDA2LDB4NTksMHg1OSwweEVCLDB4MTgsMHg2OCwKKzB4NzUsMHgwMiwweDU2LDB4RTgsMHgwMSwweDA2LDB4NTksMHg1OSwweEVCLDB4MEQsMHg2OCwweEM2LDB4MDIsMHg1NiwweEU4LDB4RjYsCisweDA1LDB4NTksMHg1OSwweEVCLDB4MDIsMHhFQiwweDAwLDB4NkEsMHgwMSwweDU2LDB4RTgsMHhDNywweEY4LDB4NTksMHg1OSwweEJGLAorMHgwMSwweDAwLDB4RUIsMHgzOCwweDY4LDB4REQsMHgwMiwweDU2LDB4RTgsMHhEQywweDA1LDB4NTksMHg1OSwweDZBLDB4MDEsMHg1NiwKKzB4RTgsMHhCMSwweEY4LDB4NTksMHg1OSwweEJGLDB4MDEsMHgwMCwweEVCLDB4MjIsMHhCOCwweEQwLDB4MzAsMHg4QiwweEY4LDB4ODksCisweDQ0LDB4NTQsMHg4QSwweDQ0LDB4NjAsMHg4OCwweDQ0LDB4NUQsMHhFQiwweDEyLDB4QjgsMHhFMCwweDIwLDB4OEIsMHhGOCwweDg5LAorMHg0NCwweDU0LDB4OEEsMHg0NCwweDVFLDB4ODgsMHg0NCwweDVELDB4RUIsMHgwMiwweEVCLDB4MDAsMHhFQiwweDAyLDB4RUIsMHgwMCwKKzB4RUIsMHgwMCwweEU5LDB4NDEsMHhGQywweDVGLDB4NUUsMHhDOSwweEMzLDB4MTksMHg2QSwweDI0LDB4NkEsMHgyRiwweDZBLDB4M0EsCisweDZBLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDQxLDB4MDAsMHg0MiwweDAwLDB4NDMsMHgwMCwweDQ0LAorMHgwMCwweDgwLDB4MDAsMHg4MSwweDAwLDB4ODIsMHgwMCwweEZGLDB4MDAsMHgxNywweDY5LDB4NTQsMHg2QSwweDdBLDB4NkEsMHhBNSwKKzB4NjksMHg1MiwweDY5LDB4OTQsMHg2OSwweDZBLDB4NkEsMHg2NywweDY5LDB4NTIsMHg2OSwweDdGLDB4NjksMHg2NywweDY5LDB4NEMsCisweDY5LDB4RjQsMHg2OCwweDc2LDB4NjgsMHhCMiwweDY4LDB4RUUsMHg2OCwweEY1LDB4NjcsMHgwMCwweDY4LDB4MTIsMHg2OCwweEY1LAorMHg2NywweDlELDB4NjcsMHhBOCwweDY3LDB4QjQsMHg2NywweDlELDB4NjcsMHgwMCwweDAwLDB4MDEsMHgwMCwweEYwLDB4MTAsMHhFMCwKKzB4MjAsMHhEMCwweDMwLDB4MjcsMHg2OCwweEYyLDB4NjYsMHhDMywweDY3LDB4MjMsMHg2NywweDEyLDB4NjcsMHhDOCwweDA0LDB4MDAsCisweDAwLDB4NTYsMHg1NywweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1OSwweDk4LDB4ODksMHg0NiwweEZDLDB4NkEsMHgwOSwweDhCLAorMHg0NiwweEZDLDB4MDUsMHg4NCwweDAxLDB4NTAsMHhFOCwweDkzLDB4MDgsMHg1OSwweDU5LDB4OEIsMHhGOCwweDhCLDB4QzcsMHgyNSwKKzB4MDAsMHhGMCwweDNELDB4MDAsMHgxMCwweDc1LDB4NTUsMHg4QiwweEM3LDB4MjUsMHhGMCwweDAwLDB4M0QsMHhGMCwweDAwLDB4NzUsCisweDRCLDB4OEIsMHhDNywweDI1LDB4MDAsMHgwRiwweEMxLDB4RjgsMHgwOCwweDg5LDB4NDYsMHhGRSwweDhCLDB4NDQsMHgwNCwweDNCLAorMHg0NiwweEZFLDB4N0QsMHgwNSwweDMzLDB4QzAsMHhFOSwweEVGLDB4MDAsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4QkEsMHgwRiwKKzB4MDAsMHgyQiwweEQwLDB4M0IsMHg1NiwweEZFLDB4NzQsMHgwNSwweDMzLDB4QzAsMHhFOSwweERCLDB4MDAsMHhDNywweDQ0LDB4MDIsCisweDA0LDB4MDksMHg4QSwweDQ2LDB4RkUsMHg4OCwweDQ0LDB4NUYsMHg4OCwweDQ0LDB4NUQsMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLAorMHhDNywweDg3LDB4RkMsMHgwOCwweDA0LDB4MDksMHhCOCwweEYwLDB4MTAsMHhFOSwweEJDLDB4MDAsMHg4QiwweEM3LDB4MjUsMHgwMCwKKzB4RjAsMHgzRCwweDAwLDB4MjAsMHg3NSwweDUyLDB4OEIsMHhDNywweDI1LDB4RjAsMHgwMCwweDNELDB4RTAsMHgwMCwweDc1LDB4NDgsCisweDhCLDB4QzcsMHgyNSwweDAwLDB4MEYsMHhDMSwweEY4LDB4MDgsMHg4OSwweDQ2LDB4RkUsMHg4MywweDdFLDB4RkUsMHgwOCwweDdFLAorMHgwNSwweDMzLDB4QzAsMHhFOSwweDkyLDB4MDAsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4QkEsMHgwRiwweDAwLDB4MkIsMHhEMCwKKzB4M0IsMHg1NiwweEZFLDB4NzQsMHgwNSwweDMzLDB4QzAsMHhFQiwweDdGLDB4OTAsMHhDNywweDQ0LDB4MDIsMHgwQywweDA5LDB4OEEsCisweDQ2LDB4RkUsMHg4OCwweDQ0LDB4NUUsMHg4OCwweDQ0LDB4NUQsMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLDB4QzcsMHg4NywweEZDLAorMHgwOCwweDBDLDB4MDksMHhCOCwweEUwLDB4MjAsMHhFQiwweDYwLDB4OEIsMHhDNywweDI1LDB4MDAsMHhGMCwweDNELDB4MDAsMHgzMCwKKzB4NzUsMHg1MiwweDhCLDB4QzcsMHgyNSwweEYwLDB4MDAsMHgzRCwweEQwLDB4MDAsMHg3NSwweDQ4LDB4OEIsMHhDNywweDI1LDB4MDAsCisweDBGLDB4QzEsMHhGOCwweDA4LDB4ODksMHg0NiwweEZFLDB4OEIsMHg0NCwweDA0LDB4M0IsMHg0NiwweEZFLDB4N0QsMHgwNCwweDMzLAorMHhDMCwweEVCLDB4MzUsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4QkEsMHgwRiwweDAwLDB4MkIsMHhEMCwweDNCLDB4NTYsMHhGRSwKKzB4NzQsMHgwNCwweDMzLDB4QzAsMHhFQiwweDIyLDB4QzcsMHg0NCwweDAyLDB4MTQsMHgwOSwweDhBLDB4NDYsMHhGRSwweDg4LDB4NDQsCisweDYwLDB4ODgsMHg0NCwweDVELDB4OEIsMHg1RSwweEZDLDB4RDEsMHhFMywweEM3LDB4ODcsMHhGQywweDA4LDB4MTQsMHgwOSwweEI4LAorMHhEMCwweDMwLDB4RUIsMHgwNCwweDMzLDB4QzAsMHhFQiwweDAwLDB4NUYsMHg1RSwweEM5LDB4QzMsMHhDOCwweDA2LDB4MDAsMHgwMCwKKzB4NTYsMHg4QiwweDc2LDB4MDQsMHg2QSwweDA4LDB4NTYsMHhFOCwweDM1LDB4MDQsMHg1OSwweDU5LDB4OEEsMHg0NCwweDU4LDB4MDQsCisweDgwLDB4NTAsMHg1NiwweEU4LDB4MjksMHgwNCwweDU5LDB4NTksMHg4QiwweDQ0LDB4NTQsMHgzQiwweDQ0LDB4NTYsMHg3NSwweDBBLAorMHg4QSwweDQ0LDB4NUQsMHgzQSwweDQ0LDB4MkYsMHg3NSwweDAyLDB4RUIsMHg2NCwweDhCLDB4NDQsMHg1NCwweDg5LDB4NDQsMHg1NiwKKzB4OEIsMHg1QywweDAyLDB4OEEsMHg0NywweDAxLDB4ODgsMHg0NCwweDJGLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEMxLDB4RTAsCisweDA4LDB4OEIsMHg1NCwweDU0LDB4MEIsMHhEMCwweDhBLDB4NDQsMHg1RCwweEI0LDB4MDAsMHhCQiwweDBGLDB4MDAsMHgyQiwweEQ4LAorMHgwQiwweEQzLDB4ODksMHg1NiwweEZFLDB4NkEsMHgxMCwweDhBLDB4NDQsMHg1OSwweDk4LDB4MDUsMHgwNCwweDAwLDB4OTksMHgwNSwKKzB4NDAsMHgwMSwweDgzLDB4RDIsMHgwMCwweDUyLDB4NTAsMHhFOCwweDU0LDB4MDgsMHg4MywweEM0LDB4MDYsMHg4OSwweDU2LDB4RkMsCisweDg5LDB4NDYsMHhGQSwweDhCLDB4NDYsMHhGRSwweDA5LDB4NDYsMHhGQSwweDgzLDB4NEUsMHhGQywweDAwLDB4NkEsMHgxOSwweEZGLAorMHg3NiwweEZDLDB4RkYsMHg3NiwweEZBLDB4RTgsMHg3MywweDA3LDB4ODMsMHhDNCwweDA2LDB4RTgsMHhGRSwweDA3LDB4NUUsMHhDOSwKKzB4QzMsMHhDOCwweDFDLDB4MDAsMHgwMCwweDU2LDB4NTcsMHg4QiwweDVFLDB4MDQsMHg4QSwweDQ3LDB4NTksMHg5OCwweDhCLDB4RjAsCisweDhCLDB4NUUsMHgwNCwweDhBLDB4NDcsMHg1RCwweEI0LDB4MDAsMHg4OSwweDQ2LDB4RTYsMHg4MywweDdFLDB4RTYsMHgwMCwweDdELAorMHgwQSwweDhCLDB4NUUsMHgwNCwweDhCLDB4NDcsMHgwNCwweDQ4LDB4ODksMHg0NiwweEU2LDB4OEIsMHg1RSwweDA0LDB4OEIsMHg0NywKKzB4MDQsMHgzQiwweDQ2LDB4RTYsMHg3RiwweDA1LDB4QzcsMHg0NiwweEU2LDB4MDAsMHgwMCwweDhCLDB4NUUsMHgwNCwweDhBLDB4NDYsCisweEU2LDB4ODgsMHg0NywweDVELDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LDB4NDcsMHgwMiwweDIwLAorMHg4QiwweERFLDB4RDEsMHhFMywweDhCLDB4OUYsMHg1OSwweDAyLDB4QzYsMHg0NywweDAzLDB4MzAsMHg4QiwweERFLDB4RDEsMHhFMywKKzB4OEIsMHg5RiwweDYxLDB4MDIsMHhDNiwweDQ3LDB4MDIsMHgyMCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDYxLDB4MDIsCisweEM2LDB4NDcsMHgwMywweDMwLDB4OEIsMHg0NiwweEU2LDB4ODksMHg0NiwweEZBLDB4ODMsMHg3RSwweEZBLDB4MDAsMHg3NCwweDE4LAorMHg4QiwweDQ2LDB4RkEsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwKKzB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweDg4LDB4NTcsMHgwMywweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGQSwweDMzLDB4RDIsCisweEY3LDB4RjMsMHg4OSwweDQ2LDB4RkEsMHg4MywweDdFLDB4RkEsMHgwMCwweDc0LDB4MTgsMHg4QiwweDQ2LDB4RkEsMHhCQiwweDBBLAorMHgwMCwweDMzLDB4RDIsMHhGNywweEYzLDB4ODAsMHhDMiwweDMwLDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwKKzB4ODgsMHg1NywweDAyLDB4OEIsMHg0NiwweEU2LDB4ODksMHg0NiwweEZBLDB4ODMsMHg3RSwweEZBLDB4MDAsMHg3NCwweDE4LDB4OEIsCisweDQ2LDB4RkEsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwweEUzLAorMHg4QiwweDlGLDB4NjEsMHgwMiwweDg4LDB4NTcsMHgwMywweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGQSwweDMzLDB4RDIsMHhGNywKKzB4RjMsMHg4OSwweDQ2LDB4RkEsMHg4MywweDdFLDB4RkEsMHgwMCwweDc0LDB4MTgsMHg4QiwweDQ2LDB4RkEsMHhCQiwweDBBLDB4MDAsCisweDMzLDB4RDIsMHhGNywweEYzLDB4ODAsMHhDMiwweDMwLDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweDg4LAorMHg1NywweDAyLDB4OEIsMHg1RSwweEU2LDB4RDEsMHhFMywweEZGLDB4QjcsMHgxMiwweDAyLDB4NkEsMHgwMCwweEZGLDB4NzYsMHgwNCwKKzB4RTgsMHhEMSwweEY2LDB4ODMsMHhDNCwweDA2LDB4NjgsMHhEMywweDBGLDB4NkEsMHgwMSwweEZGLDB4NzYsMHgwNCwweEU4LDB4QzMsCisweEY2LDB4ODMsMHhDNCwweDA2LDB4RkYsMHg3NiwweEU2LDB4NTYsMHhFOCwweDAxLDB4OTMsMHg1OSwweDU5LDB4ODksMHg1NiwweEYyLAorMHg4OSwweDQ2LDB4RjAsMHhGRiwweDc2LDB4RTYsMHg1NiwweEU4LDB4MTQsMHg5MywweDU5LDB4NTksMHg4OSwweDU2LDB4RUUsMHg4OSwKKzB4NDYsMHhFQywweDlDLDB4RkEsMHhDNCwweDVFLDB4RjAsMHgyNiwweDhCLDB4MDcsMHg4OSwweDQ2LDB4RUEsMHhDNCwweDVFLDB4RUMsCisweDI2LDB4OEIsMHgwNywweDg5LDB4NDYsMHhFOCwweEJBLDB4NTAsMHhGRiwweEVELDB4ODksMHg0NiwweEZFLDB4OUQsMHhDNywweDQ2LAorMHhFNCwweDAxLDB4MDAsMHhFOCwweEVFLDB4QTAsMHhCQSwweDUwLDB4RkYsMHhFRCwweDg5LDB4NDYsMHhGQywweDhCLDB4NDYsMHhGQywKKzB4MkIsMHg0NiwweEZFLDB4M0QsMHhFOCwweDAzLDB4NzMsMHgwMywweEU5LDB4ODAsMHgwMSwweDlDLDB4RkEsMHhCQSwweDUwLDB4RkYsCisweEVELDB4ODksMHg0NiwweEZDLDB4OEIsMHg0NiwweEZDLDB4MkIsMHg0NiwweEZFLDB4ODksMHg0NiwweEY4LDB4QzQsMHg1RSwweEYwLAorMHgyNiwweDhCLDB4MDcsMHgyQiwweDQ2LDB4RUEsMHg4OSwweDQ2LDB4RjYsMHhDNCwweDVFLDB4RjAsMHgyNiwweDhCLDB4MDcsMHg4OSwKKzB4NDYsMHhFQSwweEM0LDB4NUUsMHhFQywweDI2LDB4OEIsMHgwNywweDJCLDB4NDYsMHhFOCwweDg5LDB4NDYsMHhGNCwweEM0LDB4NUUsCisweEVDLDB4MjYsMHg4QiwweDA3LDB4ODksMHg0NiwweEU4LDB4QkEsMHg1MCwweEZGLDB4RUQsMHg4OSwweDQ2LDB4RkUsMHg5RCwweDgxLAorMHg3RSwweEY4LDB4RTgsMHgwMywweDc2LDB4MUMsMHhGRiwweDc2LDB4RjgsMHhGRiwweDc2LDB4RjYsMHhFOCwweDc2LDB4MDEsMHg1OSwKKzB4NTksMHg4OSwweDQ2LDB4RjYsMHhGRiwweDc2LDB4RjgsMHhGRiwweDc2LDB4RjQsMHhFOCwweDY4LDB4MDEsMHg1OSwweDU5LDB4ODksCisweDQ2LDB4RjQsMHhCRiwweDBFLDB4MDAsMHhFQiwweDE3LDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LAorMHgwMSwweDIwLDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweEM2LDB4MDEsMHgyMCwweDQ3LDB4ODMsMHhGRiwKKzB4MTEsMHg3NiwweEU0LDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LDB4NDcsMHgwRCwweDMwLDB4OEIsCisweERFLDB4RDEsMHhFMywweDhCLDB4OUYsMHg2MSwweDAyLDB4QzYsMHg0NywweDBELDB4MzAsMHg4MywweDdFLDB4RjYsMHgwOSwweDc3LAorMHgwNSwweEI4LDB4MEQsMHgwMCwweEVCLDB4MjYsMHg4MywweDdFLDB4RjYsMHg2MywweDc3LDB4MDUsMHhCOCwweDBFLDB4MDAsMHhFQiwKKzB4MUIsMHg4MSwweDdFLDB4RjYsMHhFNywweDAzLDB4NzcsMHgwNSwweEI4LDB4MEYsMHgwMCwweEVCLDB4MEYsMHg4MSwweDdFLDB4RjYsCisweDBGLDB4MjcsMHg3NywweDA1LDB4QjgsMHgxMCwweDAwLDB4RUIsMHgwMywweEI4LDB4MTEsMHgwMCwweDhCLDB4RjgsMHhFQiwweDI1LAorMHg4QiwweDQ2LDB4RjYsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwKKzB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweDg4LDB4MTEsMHg0RiwweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGNiwweDMzLDB4RDIsCisweEY3LDB4RjMsMHg4OSwweDQ2LDB4RjYsMHg4MywweDdFLDB4RjYsMHgwMCwweDc1LDB4RDUsMHg4MywweDdFLDB4RjQsMHgwOSwweDc3LAorMHgwNSwweEI4LDB4MEQsMHgwMCwweEVCLDB4MjYsMHg4MywweDdFLDB4RjQsMHg2MywweDc3LDB4MDUsMHhCOCwweDBFLDB4MDAsMHhFQiwKKzB4MUIsMHg4MSwweDdFLDB4RjQsMHhFNywweDAzLDB4NzcsMHgwNSwweEI4LDB4MEYsMHgwMCwweEVCLDB4MEYsMHg4MSwweDdFLDB4RjQsCisweDBGLDB4MjcsMHg3NywweDA1LDB4QjgsMHgxMCwweDAwLDB4RUIsMHgwMywweEI4LDB4MTEsMHgwMCwweDhCLDB4RjgsMHhFQiwweDI1LAorMHg4QiwweDQ2LDB4RjQsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwKKzB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweDg4LDB4MTEsMHg0RiwweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGNCwweDMzLDB4RDIsCisweEY3LDB4RjMsMHg4OSwweDQ2LDB4RjQsMHg4MywweDdFLDB4RjQsMHgwMCwweDc1LDB4RDUsMHg4QiwweERFLDB4RDEsMHhFMywweEZGLAorMHhCNywweDU5LDB4MDIsMHhGRiwweDc2LDB4MDQsMHhFOCwweDZFLDB4MDAsMHg1OSwweDU5LDB4OEIsMHhERSwweEQxLDB4RTMsMHhGRiwKKzB4QjcsMHg2MSwweDAyLDB4RkYsMHg3NiwweDA0LDB4RTgsMHg1RSwweDAwLDB4NTksMHg1OSwweDZBLDB4MDAsMHhGRiwweDc2LDB4MDQsCisweEU4LDB4MzEsMHhGMywweDU5LDB4NTksMHg4QiwweEQ4LDB4ODMsMHhGQiwweDA0LDB4NzcsMHgxRiwweEQxLDB4RTMsMHgyRSwweEZGLAorMHhBNywweDFCLDB4NzAsMHhFQiwweDIyLDB4QzcsMHg0NiwweEU0LDB4MDAsMHgwMCwweEZGLDB4NEUsMHhFNiwweEVCLDB4MEMsMHhDNywKKzB4NDYsMHhFNCwweDAwLDB4MDAsMHhGRiwweDQ2LDB4RTYsMHhFQiwweDAyLDB4RUIsMHgwMCwweDgzLDB4N0UsMHhFNCwweDAwLDB4NzQsCisweDAzLDB4RTksMHgyQSwweEZFLDB4RTksMHhENCwweEZDLDB4NUYsMHg1RSwweEM5LDB4QzMsMHhGMywweDZGLDB4RjUsMHg2RiwweEZGLAorMHg2RiwweEYzLDB4NkYsMHgwOSwweDcwLDB4NTUsMHg4QiwweEVDLDB4OEIsMHg0NiwweDA0LDB4QjksMHhFOCwweDAzLDB4RjcsMHhFMSwKKzB4OEIsMHg0RSwweDA2LDB4RjcsMHhGMSwweDVELDB4QzMsMHg1NSwweDhCLDB4RUMsMHg1NiwweDhCLDB4NzYsMHgwNiwweEVCLDB4MEUsCisweDhCLDB4REUsMHg0NiwweDhBLDB4MDcsMHg1MCwweEZGLDB4NzYsMHgwNCwweEU4LDB4MzMsMHgwMCwweDU5LDB4NTksMHg4MCwweDNDLAorMHgwMCwweDc1LDB4RUQsMHhFQiwweDAwLDB4NUUsMHg1RCwweEMzLDB4NTUsMHg4QiwweEVDLDB4NTYsMHg4QiwweDc2LDB4MDYsMHhFQiwKKzB4MTQsMHg4QiwweERFLDB4NDYsMHg4QSwweDA3LDB4NTAsMHhGRiwweDc2LDB4MDQsMHhFOCwweDQ1LDB4MDAsMHg1OSwweDU5LDB4MEIsCisweEMwLDB4NzQsMHgwMiwweEVCLDB4MDcsMHg4MCwweDNDLDB4MDAsMHg3NSwweEU3LDB4RUIsMHgwMCwweDVFLDB4NUQsMHhDMywweEM4LAorMHgwMiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksMHg0NiwweEZFLDB4OUMsMHhGQSwKKzB4OEEsMHg0NiwweEZFLDB4QkEsMHhGRSwweDAwLDB4RUUsMHhCQSwweDAyLDB4MDAsMHhFQywweEE4LDB4MDIsMHg3NCwweDA2LDB4OUQsCisweEU4LDB4OTEsMHg5RSwweEVCLDB4RTksMHhCQSwweDAwLDB4MDAsMHg4QSwweDQ2LDB4MDYsMHhFRSwweDlELDB4RUIsMHgwMCwweDVFLAorMHhDOSwweEMzLDB4QzgsMHgwNCwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksMHg0NiwKKzB4RkUsMHhFOCwweEU2LDB4QTEsMHg4OSwweDQ2LDB4RkMsMHhFOCwweEUwLDB4QTEsMHgyQiwweDQ2LDB4RkMsMHgzRCwweEI4LDB4MEIsCisweDc2LDB4MDUsMHhCOCwweDAxLDB4MDAsMHhFQiwweDIzLDB4OUMsMHhGQSwweDhBLDB4NDYsMHhGRSwweEJBLDB4RkUsMHgwMCwweEVFLAorMHhCQSwweDAyLDB4MDAsMHhFQywweEE4LDB4MDIsMHg3NCwweDA2LDB4OUQsMHhFOCwweDQ4LDB4OUUsMHhFQiwweEQ5LDB4QkEsMHgwMCwKKzB4MDAsMHg4QSwweDQ2LDB4MDYsMHhFRSwweDlELDB4MzMsMHhDMCwweEVCLDB4MDAsMHg1RSwweEM5LDB4QzMsMHhDOCwweDA0LDB4MDAsCisweDAwLDB4NTYsMHg1NywweDhCLDB4NzYsMHgwNCwweDgzLDB4N0UsMHgwNiwweDAwLDB4NzQsMHgwNywweDU2LDB4RTgsMHgwMywweDAxLAorMHg1OSwweEVCLDB4MDUsMHg1NiwweEU4LDB4QTIsMHgwMCwweDU5LDB4ODgsMHg0NiwweEZGLDB4ODAsMHg3RSwweEZGLDB4MDgsMHg3NywKKzB4MDYsMHg4QSwweDQ2LDB4RkYsMHhFOSwweDg0LDB4MDAsMHg4MCwweDdFLDB4RkYsMHgwRiwweDc2LDB4MDMsMHhFQiwweDc5LDB4OTAsCisweDhBLDB4NDYsMHhGRiwweEI0LDB4MDAsMHgyRCwweDBBLDB4MDAsMHg4QiwweEQ4LDB4ODMsMHhGQiwweDA0LDB4NzcsMHg2NywweEQxLAorMHhFMywweDJFLDB4RkYsMHhBNywweEFGLDB4NzEsMHhCMCwweDAwLDB4RUIsMHg2MSwweDU2LDB4RTgsMHg2QiwweDAwLDB4NTksMHhCNCwKKzB4MDAsMHgyNSwweDBGLDB4MDAsMHg4OSwweDQ2LDB4RkMsMHg1NiwweEU4LDB4NUUsMHgwMCwweDU5LDB4QjQsMHgwMCwweDhCLDB4RjgsCisweDU2LDB4RTgsMHg1NSwweDAwLDB4NTksMHhCNCwweDAwLDB4QzEsMHhFMCwweDA4LDB4OEIsMHhENywweDAzLDB4RDAsMHg4QiwweEZBLAorMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLDB4ODksMHg3OCwweDMwLDB4RUIsMHgyRSwweDU2LDB4RTgsMHgzQiwweDAwLDB4NTksMHg4OCwKKzB4NDQsMHg1QiwweEVCLDB4MjQsMHg1NiwweEU4LDB4MzEsMHgwMCwweDU5LDB4ODgsMHg0NCwweDUwLDB4NTYsMHhFOCwweDI5LDB4MDAsCisweDU5LDB4ODgsMHg0NCwweDUxLDB4NTYsMHhFOCwweDIxLDB4MDAsMHg1OSwweDg4LDB4NDQsMHg1MiwweDU2LDB4RTgsMHgxOSwweDAwLAorMHg1OSwweDg4LDB4NDQsMHg1MywweEVCLDB4MDIsMHhFQiwweDAwLDB4RTksMHg1QiwweEZGLDB4NUYsMHg1RSwweEM5LDB4QzMsMHg0NiwKKzB4NzEsMHhBNiwweDcxLDB4NEEsMHg3MSwweDdBLDB4NzEsMHg4NCwweDcxLDB4QzgsMHgwNCwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsCisweDA0LDB4OEEsMHg0NCwweDVBLDB4OTgsMHg4OSwweDQ2LDB4RkUsMHg5QywweEZBLDB4OEEsMHg0NiwweEZFLDB4QkEsMHhGRSwweDAwLAorMHhFRSwweEJBLDB4MDIsMHgwMCwweEVDLDB4QTgsMHgwMSwweDc1LDB4MDYsMHg5RCwweEU4LDB4NTcsMHg5RCwweEVCLDB4RTksMHhCQSwKKzB4MDAsMHgwMCwweEVDLDB4ODgsMHg0NiwweEZELDB4OUQsMHg4QSwweDQ2LDB4RkQsMHhFQiwweDAwLDB4NUUsMHhDOSwweEMzLDB4QzgsCisweDAyLDB4MDAsMHgwMCwweDU2LDB4OEIsMHg3NiwweDA0LDB4OEEsMHg0NCwweDVBLDB4OTgsMHg4OSwweDQ2LDB4RkUsMHg5QywweEZBLAorMHg4QSwweDQ2LDB4RkUsMHhCQSwweEZFLDB4MDAsMHhFRSwweEJBLDB4MDIsMHgwMCwweEVDLDB4MzIsMHhFNCwweDI0LDB4MDEsMHg5RCwKKzB4NUUsMHhDOSwweEMzLDB4QzgsMHgwNiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksCisweDQ2LDB4RkUsMHhFOCwweDg1LDB4QTAsMHg4OSwweDQ2LDB4RkEsMHhFOCwweDdGLDB4QTAsMHgyQiwweDQ2LDB4RkEsMHgzRCwweEI4LAorMHgwQiwweDc2LDB4MDQsMHhCMCwweDA4LDB4RUIsMHgyNCwweDlDLDB4RkEsMHg4QSwweDQ2LDB4RkUsMHhCQSwweEZFLDB4MDAsMHhFRSwKKzB4QkEsMHgwMiwweDAwLDB4RUMsMHhBOCwweDAxLDB4NzUsMHgwNiwweDlELDB4RTgsMHhFOCwweDlDLDB4RUIsMHhEQSwweEJBLDB4MDAsCisweDAwLDB4RUMsMHg4OCwweDQ2LDB4RkQsMHg5RCwweDhBLDB4NDYsMHhGRCwweEVCLDB4MDAsMHg1RSwweEM5LDB4QzMsMHg1NSwweDhCLAorMHhFQywweDU2LDB4OEIsMHg1NiwweDA0LDB4OEEsMHg0NiwweDA2LDB4RUUsMHgzMywweEY2LDB4RUIsMHgwMywweDUwLDB4NTgsMHg0NiwKKzB4ODMsMHhGRSwweDE0LDB4N0MsMHhGOCwweDVFLDB4NUQsMHhDMywweEM4LDB4MDIsMHgwMCwweDAwLDB4NTYsMHg4QiwweDU2LDB4MDQsCisweEVDLDB4ODgsMHg0NiwweEZGLDB4MzMsMHhGNiwweEVCLDB4MDMsMHg1MCwweDU4LDB4NDYsMHg4MywweEZFLDB4MTQsMHg3QywweEY4LAorMHg4QSwweDQ2LDB4RkYsMHhFQiwweDAwLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwMiwweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg3NiwKKzB4MDQsMHg4MywweDNFLDB4QjAsMHgwQiwweDAwLDB4NzUsMHgxRiwweEJBLDB4ODgsMHgwMSwweEIwLDB4MDAsMHhFRSwweEJBLDB4ODYsCisweDAxLDB4QjAsMHgwMCwweEVFLDB4NkEsMHgwOSwweDZBLDB4MDAsMHg2OCwweDMwLDB4MDEsMHhFOCwweDdELDB4MDEsMHg4MywweEM0LAorMHgwNiwweEM3LDB4MDYsMHhCMCwweDBCLDB4MDEsMHgwMCwweDZBLDB4MDksMHg4QiwweEM2LDB4MDUsMHg4MCwweDAxLDB4NTAsMHhFOCwKKzB4REEsMHgwMCwweDU5LDB4NTksMHg4QiwweEY4LDB4OEIsMHhDNywweEMxLDB4RTgsMHgwQywweDI1LDB4MEYsMHgwMCwweDg5LDB4NDYsCisweEZFLDB4OEIsMHhDNywweEMxLDB4RTgsMHgwOCwweDI1LDB4MEYsMHgwMCwweDhCLDB4NTYsMHhGRSwweDgzLDB4RjIsMHgwQywweDNCLAorMHhDMiwweDc1LDB4MjEsMHg4QiwweEM3LDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwRiwweDAwLDB4OEIsMHg1NiwweEZFLDB4ODMsMHhGMiwKKzB4MDYsMHgzQiwweEMyLDB4NzUsMHgwRiwweDhCLDB4QzcsMHgyNSwweDBGLDB4MDAsMHg4QiwweDU2LDB4RkUsMHg4MywweEYyLDB4MDksCisweDNCLDB4QzIsMHg3NCwweDBELDB4NkEsMHgwNywweDU2LDB4RTgsMHgzOCwweDAwLDB4NTksMHg1OSwweEM3LDB4NDYsMHhGRSwweDA3LAorMHgwMCwweDhBLDB4NDYsMHhGRSwweDA0LDB4ODAsMHhBMiwweDMzLDB4MDIsMHg4QiwweEM2LDB4QkEsMHg2MiwweDAwLDB4RjcsMHhFQSwKKzB4OEEsMHg1NiwweEZFLDB4OEIsMHhEOCwweDg4LDB4OTcsMHg2QywweDAwLDB4NjgsMHgzMiwweDAyLDB4OEIsMHhDNiwweEJBLDB4NjIsCisweDAwLDB4RjcsMHhFQSwweDA1LDB4MTQsMHgwMCwweDUwLDB4RTgsMHgwRSwweEZELDB4NTksMHg1OSwweEVCLDB4MDAsMHg1RiwweDVFLAorMHhDOSwweEMzLDB4QzgsMHgwMiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNiwweDgzLDB4RTYsMHgwRiwweDhCLDB4QzYsMHhDMSwKKzB4RTAsMHgwQywweDhCLDB4RDYsMHg4MywweEYyLDB4MEMsMHhDMSwweEUyLDB4MDgsMHgwQiwweEMyLDB4OEIsMHhENiwweDgzLDB4RjIsCisweDA2LDB4QzEsMHhFMiwweDA0LDB4MEIsMHhDMiwweDhCLDB4RDYsMHg4MywweEYyLDB4MDksMHgwQiwweEMyLDB4ODksMHg0NiwweEZFLAorMHg2QSwweDE5LDB4NkEsMHgxMCwweDhCLDB4NDYsMHgwNCwweDk5LDB4MDUsMHg0MCwweDAxLDB4ODMsMHhEMiwweDAwLDB4NTIsMHg1MCwKKzB4RTgsMHg2QiwweDAxLDB4ODMsMHhDNCwweDA2LDB4MEIsMHg0NiwweEZFLDB4ODMsMHhDQSwweDAwLDB4NTIsMHg1MCwweEU4LDB4OUEsCisweDAwLDB4ODMsMHhDNCwweDA2LDB4RTgsMHgyNSwweDAxLDB4RUIsMHgwMCwweDVFLDB4QzksMHhDMywweDU1LDB4OEIsMHhFQywweDU2LAorMHg1NywweDMzLDB4RkYsMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHhBMywweEZFLDB4NTksMHg1OSwweEIxLDB4MTAsMHgyQSwKKzB4NEUsMHgwNiwweEQzLDB4NjYsMHgwNCwweDMzLDB4RjYsMHhFQiwweDJFLDB4ODEsMHg3RSwweDA0LDB4MDAsMHg4MCwweDcyLDB4MDQsCisweEIwLDB4MDEsMHhFQiwweDAyLDB4QjAsMHgwMCwweDUwLDB4NjgsMHg4OCwweDAxLDB4RTgsMHg4MSwweEZFLDB4NTksMHg1OSwweDZBLAorMHgwMywweDY4LDB4ODYsMHgwMSwweEU4LDB4NzcsMHhGRSwweDU5LDB4NTksMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHg2RCwKKzB4RkUsMHg1OSwweDU5LDB4RDEsMHg2NiwweDA0LDB4NDYsMHgzQiwweDc2LDB4MDYsMHg3QywweENELDB4MzMsMHhGNiwweEVCLDB4MjQsCisweEQxLDB4RTcsMHg2QSwweDAzLDB4NjgsMHg4NiwweDAxLDB4RTgsMHg1NCwweEZFLDB4NTksMHg1OSwweDZBLDB4MDEsMHg2OCwweDg2LAorMHgwMSwweEU4LDB4NEEsMHhGRSwweDU5LDB4NTksMHg2OCwweDg4LDB4MDEsMHhFOCwweDVDLDB4RkUsMHg1OSwweDk4LDB4MjUsMHgwMSwKKzB4MDAsMHgwQiwweEY4LDB4NDYsMHg4MywweEZFLDB4MTAsMHg3QywweEQ3LDB4NkEsMHgwMCwweDY4LDB4ODYsMHgwMSwweEU4LDB4MkQsCisweEZFLDB4NTksMHg1OSwweDhCLDB4QzcsMHhFQiwweDAwLDB4NUYsMHg1RSwweDVELDB4QzMsMHg1NSwweDhCLDB4RUMsMHg1NiwweDU3LAorMHg4QiwweDdFLDB4MDgsMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHgxMywweEZFLDB4NTksMHg1OSwweEI4LDB4MjAsMHgwMCwKKzB4MkIsMHhDNywweDUwLDB4RkYsMHg3NiwweDA2LDB4RkYsMHg3NiwweDA0LDB4RTgsMHhBMiwweDAwLDB4ODMsMHhDNCwweDA2LDB4ODksCisweDU2LDB4MDYsMHg4OSwweDQ2LDB4MDQsMHgzMywweEY2LDB4RUIsMHg0NywweDgxLDB4N0UsMHgwNiwweDAwLDB4ODAsMHg3MiwweDBDLAorMHg3NSwweDA2LDB4ODMsMHg3RSwweDA0LDB4MDAsMHg3MiwweDA0LDB4QjAsMHgwMSwweEVCLDB4MDIsMHhCMCwweDAwLDB4NTAsMHg2OCwKKzB4ODgsMHgwMSwweEU4LDB4RDksMHhGRCwweDU5LDB4NTksMHg2QSwweDAzLDB4NjgsMHg4NiwweDAxLDB4RTgsMHhDRiwweEZELDB4NTksCisweDU5LDB4NkEsMHgwMSwweDY4LDB4ODYsMHgwMSwweEU4LDB4QzUsMHhGRCwweDU5LDB4NTksMHg2QSwweDAxLDB4RkYsMHg3NiwweDA2LAorMHhGRiwweDc2LDB4MDQsMHhFOCwweDU4LDB4MDAsMHg4MywweEM0LDB4MDYsMHg4OSwweDU2LDB4MDYsMHg4OSwweDQ2LDB4MDQsMHg0NiwKKzB4M0IsMHhGNywweDdDLDB4QjUsMHg2QSwweDAwLDB4NjgsMHg4NiwweDAxLDB4RTgsMHhBMiwweEZELDB4NTksMHg1OSwweDZBLDB4MDAsCisweDY4LDB4ODYsMHgwMSwweEU4LDB4OTgsMHhGRCwweDU5LDB4NTksMHg1RiwweDVFLDB4NUQsMHhDMywweDU1LDB4OEIsMHhFQywweDU2LAorMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHg4NiwweEZELDB4NTksMHg1OSwweDMzLDB4RjYsMHhFQiwweDAwLDB4NjgsMHg4OCwKKzB4MDEsMHhFOCwweDk0LDB4RkQsMHg1OSwweEE4LDB4MDEsMHg3NSwweDA4LDB4OEIsMHhDNiwweDQ2LDB4M0QsMHg2NCwweDAwLDB4N0MsCisweEVELDB4NkEsMHgwMCwweDY4LDB4ODYsMHgwMSwweEU4LDB4NjUsMHhGRCwweDU5LDB4NTksMHg1RSwweDVELDB4QzMsMHhDOCwweDA0LAorMHgwMCwweDAwLDB4OEIsMHg0NiwweDA0LDB4OEIsMHg1NiwweDA2LDB4OEIsMHg0RSwweDA4LDB4RTMsMHgwNiwweEQxLDB4RTAsMHhEMSwKKzB4RDIsMHhFMiwweEZBLDB4ODksMHg0NiwweEZDLDB4ODksMHg1NiwweEZFLDB4OEIsMHg1NiwweEZFLDB4OEIsMHg0NiwweEZDLDB4RUIsCisweDAwLDB4QzksMHhDMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg1MCwweDcyLDB4NjUsMHg3NiwweDY5LDB4NkYsMHg3NSwweDczLDB4MjAsMHg0RCwweDY1LDB4NkUsMHg3NSwweDAwLDB4NDIsMHg2NSwKKzB4NjcsMHg2OSwweDZFLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsCisweDIwLDB4MzAsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMyLAorMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMywweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDM0LDB4MDAsMHg1MCwKKzB4NkYsMHg3MiwweDc0LDB4MjAsMHgzNSwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDM2LDB4MDAsMHg1MCwweDZGLDB4NzIsCisweDc0LDB4MjAsMHgzNywweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDM4LDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLAorMHgzOSwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMxLDB4MzAsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwKKzB4MzEsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwweDMyLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsCisweDMzLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsMHgzNCwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMxLAorMHgzNSwweDAwLDB4OUMsMHgwMSwweEEzLDB4MDEsMHhBQSwweDAxLDB4QjEsMHgwMSwweEI4LDB4MDEsMHhCRiwweDAxLDB4QzYsMHgwMSwKKzB4Q0QsMHgwMSwweEQ0LDB4MDEsMHhEQiwweDAxLDB4RTIsMHgwMSwweEVBLDB4MDEsMHhGMiwweDAxLDB4RkEsMHgwMSwweDAyLDB4MDIsCisweDBBLDB4MDIsMHgwOCwweDAwLDB4MDAsMHgwNywweDgxLDB4MDAsMHgwMywweDgwLDB4ODAsMHg4MCwweDlGLDB4OTEsMHg5NSwweDkxLAorMHg5RiwweDAwLDB4MDMsMHg4MSwweDg0LDB4OEUsMHg5NSwweDg0LDB4ODQsMHg4NCwweDg0LDB4MDAsMHgwMywweDgyLDB4ODQsMHg4NCwKKzB4ODQsMHg4NCwweDk1LDB4OEUsMHg4NCwweDAwLDB4MDQsMHg4OCwweDAwLDB4QjIsMHgwQiwweEM2LDB4MEIsMHhEQSwweDBCLDB4RUUsCisweDBCLDB4MDIsMHgwQywweDE2LDB4MEMsMHgyQSwweDBDLDB4M0UsMHgwQywweDUyLDB4MEMsMHg3NywweDBDLDB4OUMsMHgwQywweEJFLAorMHgwQywweEUwLDB4MEMsMHgwMiwweDBELDB4MDEsMHg4MCwweDIwLDB4NTQsMHg2NSwweDczLDB4NzQsMHgyMCwweDUwLDB4NjEsMHg3MywKKzB4NzMsMHg2NSwweDY0LDB4MjAsMHgxRiwweDIwLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgwMiwweDAwLDB4MDEsCisweDgwLDB4MjAsMHg0RCwweDY5LDB4NzMsMHg3MywweDY5LDB4NkUsMHg2NywweDIwLDB4NTIsMHg3OCwweDIwLDB4NDQsMHg2MSwweDc0LAorMHg2MSwweDFGLDB4MjAsMHg1MCwweDcyLDB4NjUsMHg3MywweDczLDB4MjAsMHg4MCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg0MiwKKzB4NjEsMHg2NCwweDIwLDB4NTIsMHg3OCwweDIwLDB4NDQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDFGLDB4MjAsMHg1MCwweDcyLDB4NjUsCisweDczLDB4NzMsMHgyMCwweDgwLDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDU4LDB4NkQsMHg3NCwweDcyLDB4MjAsMHg0MiwweDc1LAorMHg3MywweDc5LDB4MUYsMHgyMCwweDUwLDB4NzIsMHg2NSwweDczLDB4NzMsMHgyMCwweDgwLDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwKKzB4NkUsMHg2RiwweDc0LDB4MjAsMHg2MywweDc1LDB4NzIsMHg3MiwweDY1LDB4NkUsMHg3NCwweDZDLDB4NzksMHgxRiwweDIwLDB4MjAsCisweDY5LDB4NkQsMHg3MCwweDZDLDB4NjUsMHg2RCwweDY1LDB4NkUsMHg3NCwweDY1LDB4NjQsMHgwMiwweDAwLDB4MjQsMHgwRCwweDJGLAorMHgwRCwweDNBLDB4MEQsMHg0NSwweDBELDB4NTAsMHgwRCwweDVCLDB4MEQsMHg2NiwweDBELDB4NzEsMHgwRCwweDdDLDB4MEQsMHg4NywKKzB4MEQsMHg5MiwweDBELDB4OUQsMHgwRCwweEE4LDB4MEQsMHhCMywweDBELDB4QkUsMHgwRCwweEM5LDB4MEQsMHg1MywweDgwLDB4MkMsCisweDMyLDB4NTQsMHg0NCwweDIwLDB4NTMsMHg4NiwweDJDLDB4MzMsMHg0NCwweDU0LDB4NTIsMHgyMCwweDUzLDB4ODIsMHgyQywweDMzLAorMHg1MiwweDU0LDB4NTMsMHgyMCwweDFGLDB4NTMsMHg4MSwweDJDLDB4MzIsMHg1MiwweDQ0LDB4MjAsMHg1MywweDg1LDB4MkMsMHgzMiwKKzB4NDMsMHg0NCwweDIwLDB4NTMsMHg4MywweDJDLDB4MzMsMHg0MywweDU0LDB4NTMsMHgyMCwweDUzLDB4ODQsMHgyQywweDMzLDB4NDQsCisweDUzLDB4NTIsMHgyMCwweDUzLDB4ODcsMHgyQywweDMyLDB4NTIsMHg0OSwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHg0NCwweDQzLDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLDB4MzAsMHgxRiwweDI3LDB4NTMsMHg4NSwKKzB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksCisweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLAorMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMxLDB4MzEsMHgxRiwweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwKKzB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsCisweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDMsMHg1NCwweDUzLDB4MjAsMHgyRCwweDIwLAorMHg3MCwweDY5LDB4NkUsMHgyMCwweDM0LDB4MUYsMHgyNywweDUzLDB4ODMsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwKKzB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NDksMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLAorMHgzMiwweDFGLDB4MjcsMHg1MywweDg3LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwKKzB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsCisweDIwLDB4MjAsMHg0NCwweDU0LDB4NTIsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM2LDB4MkYsMHgzOCwweDFGLAorMHgyNywweDUzLDB4ODYsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwKKzB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsCisweDUyLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzUsMHgxRiwweDI3LDB4NTMsMHg4MiwweDJFLAorMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwKKzB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NTIsMHg3OCwweDQ0LDB4MjAsCisweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLDB4MUYsMHgyNywweDUzLDB4ODEsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLAorMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywKKzB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1NCwweDc4LDB4NDQsMHgyMCwweDJELDB4MjAsCisweDcwLDB4NjksMHg2RSwweDIwLDB4MzMsMHgxRiwweDI3LDB4NTMsMHg4MCwweDJFLDB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLAorMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwKKzB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NDMsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksCisweDZFLDB4MjAsMHgzNSwweDFGLDB4MjcsMHg1MywweDg1LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHg0NCwweDUzLDB4NTIsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM1LDB4MUYsCisweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LAorMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwKKzB4NDMsMHg1NCwweDUzLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMSwweDFGLDB4MjcsMHg1MywweDgzLDB4MkUsCisweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLAorMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDQ5LDB4MjAsMHgyRCwKKzB4MjAsMHgyOCwweDZFLDB4MkUsMHg2MywweDJFLDB4MjksMHgxRiwweDI3LDB4NTMsMHg4NywweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsCisweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLAorMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1NCwweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwKKzB4NkUsMHgyMCwweDMyLDB4MUYsMHgyNywweDUzLDB4ODYsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzcsMHgxRiwKKzB4MjcsMHg1MywweDgyLDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsCisweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHg1MiwweDc4LDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM2LDB4MUYsMHgyNywweDUzLDB4ODEsMHgyRSwKKzB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsCisweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1NCwweDc4LAorMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzMsMHgxRiwweDI3LDB4NTMsMHg4MCwweDJFLDB4MzAsMHg1MywKKzB4NEQsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsCisweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NDMsMHg0NCwweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODUsMHgyRSwKKzB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwKKzB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDMsMHg1NCwweDUzLDB4MjAsCisweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMxLDB4MUYsMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4MywweDJFLAorMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDQ5LDB4MjAsMHgyRCwweDIwLDB4MjgsMHg2RSwweDJFLDB4NjMsMHgyRSwweDI5LDB4MUYsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg3LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg0NCwweDU0LDB4NTIsMHgyMCwKKzB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzIsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg2LDB4MkUsCisweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzcsMHgxRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODIsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NzgsMHg0NCwweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNiwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODEsMHgyRSwKKzB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDU0LDB4NzgsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLAorMHgzMywweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODAsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywKKzB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsCisweDQ0LDB4NDMsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzIsMHgzMCwweDFGLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDI3LDB4NTMsMHg4NSwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwKKzB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsCisweDY5LDB4NkUsMHgyMCwweDMxLDB4MzEsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg0LDB4MkUsMHgzMSwweDgxLAorMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwKKzB4MjAsMHgyMCwweDQzLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzQsMHgxRiwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyNywweDUzLDB4ODMsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LAorMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NDksMHgyMCwweDJELDB4MjAsMHg3MCwKKzB4NjksMHg2RSwweDIwLDB4MzIsMHgzMiwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODcsMHgyRSwweDMxLDB4ODEsCisweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLAorMHgyMCwweDIwLDB4NDQsMHg1NCwweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNiwweDJGLDB4MzgsMHgxRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODYsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NTQsMHg1MywweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODIsMHgyRSwKKzB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDIwLDB4NTIsMHg3OCwweDQ0LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMiwweDFGLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4MSwweDJFLDB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwKKzB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDU0LDB4NzgsCisweDQ0LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMywweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLAorMHg4MCwweDJFLDB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwKKzB4ODcsMHgyNywweDAyLDB4MDAsMHg2OCwweDA0LDB4OTYsMHgwNCwweEI2LDB4MDMsMHgzQywweDA0LDB4MEUsMHgwNCwweDg5LDB4MDMsCisweDVDLDB4MDMsMHhFMiwweDAzLDB4NjAsMHgwOCwweDhBLDB4MDgsMHhCRSwweDA3LDB4MzgsMHgwOCwweDBFLDB4MDgsMHg5NSwweDA3LAorMHg2QywweDA3LDB4RTYsMHgwNywweDFDLDB4MDUsMHg3NCwweDA1LDB4RkEsMHgwNSwweEM0LDB4MDQsMHhGMCwweDA0LDB4Q0MsMHgwNSwKKzB4QTAsMHgwNSwweDQ4LDB4MDUsMHg3OCwweDA2LDB4QzgsMHgwNiwweDQyLDB4MDcsMHgyOCwweDA2LDB4NTAsMHgwNiwweDE4LDB4MDcsCisweEYwLDB4MDYsMHhBMCwweDA2LDB4MDAsMHgwMCwweEY0LDB4MDgsMHhGNCwweDA4LDB4RDQsMHgwRCwweDA0LDB4MDksMHgwNCwweDA5LAorMHgwNCwweDA5LDB4MDQsMHgwOSwweDQyLDB4MDAsMHgwQywweDA5LDB4MUMsMHgwOSwweEU1LDB4MEQsMHgwMiwweDAwLDB4MTQsMHgwOSwKKzB4MDQsMHgwOSwweEY0LDB4MEQsMHg0MywweDAwLDB4MUMsMHgwOSwweDBDLDB4MDksMHgwNSwweDBFLDB4MDAsMHgwNCwweDA0LDB4MDksCisweDE0LDB4MDksMHgxMiwweDBFLDB4MkMsMHgwOSwweDJDLDB4MDksMHgyQywweDA5LDB4MkMsMHgwOSwweDAwLDB4MDAsMHgzQywweDA5LAorMHg2QywweDA5LDB4MUUsMHgwRSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHgwMCwweDAxLDB4NEMsMHgwOSwKKzB4MkMsMHgwOSwweDJELDB4MEUsMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4MDAsMHgwMiwweDVDLDB4MDksCisweDNDLDB4MDksMHgzRCwweDBFLDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDAwLDB4MDMsMHg2QywweDA5LAorMHg0QywweDA5LDB4NEQsMHgwRSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHhGRiwweDAwLDB4MkMsMHgwOSwKKzB4NUMsMHgwOSwweDAwLDB4MDAsMHgwMCwweDA1LDB4ODQsMHgwOSwweEVDLDB4MDksMHg1RSwweDBFLDB4RjQsMHgwOSwweEY0LDB4MDksCisweEY0LDB4MDksMHhGNCwweDA5LDB4MDAsMHgwNiwweDk0LDB4MDksMHg3NCwweDA5LDB4NjgsMHgwRSwweEFDLDB4MEEsMHhBQywweDBBLAorMHhBQywweDBBLDB4QUMsMHgwQSwweDAwLDB4MDcsMHhBNCwweDA5LDB4ODQsMHgwOSwweDcyLDB4MEUsMHhCQywweDBBLDB4QkMsMHgwQSwKKzB4QkMsMHgwQSwweEJDLDB4MEEsMHgwMCwweDA4LDB4QjQsMHgwOSwweDk0LDB4MDksMHg3QywweDBFLDB4RDQsMHgwQSwweEQ0LDB4MEEsCisweEQ0LDB4MEEsMHhENCwweDBBLDB4MDAsMHgwQiwweEM0LDB4MDksMHhBNCwweDA5LDB4ODMsMHgwRSwweEZDLDB4MEEsMHhGQywweDBBLAorMHhGQywweDBBLDB4RkMsMHgwQSwweDAwLDB4MEMsMHhENCwweDA5LDB4QjQsMHgwOSwweDkwLDB4MEUsMHgxNCwweDBCLDB4MTQsMHgwQiwKKzB4MTQsMHgwQiwweDE0LDB4MEIsMHgwMCwweDAyLDB4RTQsMHgwOSwweEM0LDB4MDksMHhBMCwweDBFLDB4MkMsMHgwQiwweDJDLDB4MEIsCisweDJDLDB4MEIsMHgyQywweDBCLDB4MDQsMHgwMCwweEVDLDB4MDksMHhENCwweDA5LDB4MEUsMHgwMCwweEZGLDB4MDAsMHg3NCwweDA5LAorMHhFNCwweDA5LDB4MDAsMHgwMCwweDgyLDB4MDEsMHhGQywweDA5LDB4QTQsMHgwQSwweEFDLDB4MEUsMHg4MiwweDAyLDB4MDQsMHgwQSwKKzB4RjQsMHgwOSwweEFGLDB4MEUsMHg4MiwweDAzLDB4MEMsMHgwQSwweEZDLDB4MDksMHhCMiwweDBFLDB4ODIsMHgwNCwweDE0LDB4MEEsCisweDA0LDB4MEEsMHhCNiwweDBFLDB4ODIsMHgwNSwweDFDLDB4MEEsMHgwQywweDBBLDB4QkMsMHgwRSwweDgyLDB4MDYsMHgyNCwweDBBLAorMHgxNCwweDBBLDB4QzAsMHgwRSwweDgyLDB4MDcsMHgyQywweDBBLDB4MUMsMHgwQSwweEM0LDB4MEUsMHg4MiwweDA4LDB4MzQsMHgwQSwKKzB4MjQsMHgwQSwweEM4LDB4MEUsMHg4MiwweDA5LDB4M0MsMHgwQSwweDJDLDB4MEEsMHhDQywweDBFLDB4ODIsMHgwQSwweDQ0LDB4MEEsCisweDM0LDB4MEEsMHhEMSwweDBFLDB4ODIsMHgxMCwweDRDLDB4MEEsMHgzQywweDBBLDB4RDYsMHgwRSwweDgyLDB4MEIsMHg1NCwweDBBLAorMHg0NCwweDBBLDB4REIsMHgwRSwweDgyLDB4MTEsMHg1QywweDBBLDB4NEMsMHgwQSwweEUwLDB4MEUsMHg4MiwweDBDLDB4NjQsMHgwQSwKKzB4NTQsMHgwQSwweEU1LDB4MEUsMHg4MiwweDEyLDB4NkMsMHgwQSwweDVDLDB4MEEsMHhFQSwweDBFLDB4ODIsMHgwRCwweDc0LDB4MEEsCisweDY0LDB4MEEsMHhFRiwweDBFLDB4ODIsMHgwRSwweDdDLDB4MEEsMHg2QywweDBBLDB4RjQsMHgwRSwweDgyLDB4MEYsMHg4NCwweDBBLAorMHg3NCwweDBBLDB4RkIsMHgwRSwweDgyLDB4MTMsMHg4QywweDBBLDB4N0MsMHgwQSwweDAyLDB4MEYsMHg4MiwweDE0LDB4OTQsMHgwQSwKKzB4ODQsMHgwQSwweDA5LDB4MEYsMHg4MiwweDE1LDB4OUMsMHgwQSwweDhDLDB4MEEsMHgxMCwweDBGLDB4ODIsMHgxNiwweEE0LDB4MEEsCisweDk0LDB4MEEsMHgxNywweDBGLDB4ODIsMHgxNywweEY0LDB4MDksMHg5QywweDBBLDB4MUUsMHgwRiwweDgyLDB4MDIsMHhCNCwweDBBLAorMHhCNCwweDBBLDB4MjYsMHgwRiwweDgyLDB4MDMsMHhBQywweDBBLDB4QUMsMHgwQSwweDJELDB4MEYsMHg4MiwweDAwLDB4QzQsMHgwQSwKKzB4Q0MsMHgwQSwweDM0LDB4MEYsMHg4MiwweDAxLDB4Q0MsMHgwQSwweEJDLDB4MEEsMHgzRiwweDBGLDB4ODIsMHgwMiwweEJDLDB4MEEsCisweEM0LDB4MEEsMHg0RCwweDBGLDB4ODIsMHgwMCwweERDLDB4MEEsMHhGNCwweDBBLDB4NTksMHgwRiwweDgyLDB4MDEsMHhFNCwweDBBLAorMHhENCwweDBBLDB4NjMsMHgwRiwweDgyLDB4MDIsMHhFQywweDBBLDB4REMsMHgwQSwweDZFLDB4MEYsMHg4MiwweDAzLDB4RjQsMHgwQSwKKzB4RTQsMHgwQSwweDdBLDB4MEYsMHg4MiwweDA0LDB4RDQsMHgwQSwweEVDLDB4MEEsMHg4NywweDBGLDB4ODIsMHgwMCwweDA0LDB4MEIsCisweDBDLDB4MEIsMHg5MywweDBGLDB4ODIsMHgwMSwweDBDLDB4MEIsMHhGQywweDBBLDB4OUIsMHgwRiwweDgyLDB4MDIsMHhGQywweDBBLAorMHgwNCwweDBCLDB4QTcsMHgwRiwweDgyLDB4MDAsMHgxQywweDBCLDB4MjQsMHgwQiwweEIwLDB4MEYsMHg4MiwweDAxLDB4MjQsMHgwQiwKKzB4MTQsMHgwQiwweEI1LDB4MEYsMHg4MiwweDAyLDB4MTQsMHgwQiwweDFDLDB4MEIsMHhCRSwweDBGLDB4NDQsMHgwMCwweDM0LDB4MEIsCisweEE0LDB4MEIsMHg5QywweDAxLDB4NDQsMHgwMSwweDNDLDB4MEIsMHgyQywweDBCLDB4QTMsMHgwMSwweDQ0LDB4MDIsMHg0NCwweDBCLAorMHgzNCwweDBCLDB4QUEsMHgwMSwweDQ0LDB4MDMsMHg0QywweDBCLDB4M0MsMHgwQiwweEIxLDB4MDEsMHg0NCwweDA0LDB4NTQsMHgwQiwKKzB4NDQsMHgwQiwweEI4LDB4MDEsMHg0NCwweDA1LDB4NUMsMHgwQiwweDRDLDB4MEIsMHhCRiwweDAxLDB4NDQsMHgwNiwweDY0LDB4MEIsCisweDU0LDB4MEIsMHhDNiwweDAxLDB4NDQsMHgwNywweDZDLDB4MEIsMHg1QywweDBCLDB4Q0QsMHgwMSwweDQ0LDB4MDgsMHg3NCwweDBCLAorMHg2NCwweDBCLDB4RDQsMHgwMSwweDQ0LDB4MDksMHg3QywweDBCLDB4NkMsMHgwQiwweERCLDB4MDEsMHg0NCwweDBBLDB4ODQsMHgwQiwKKzB4NzQsMHgwQiwweEUyLDB4MDEsMHg0NCwweDBCLDB4OEMsMHgwQiwweDdDLDB4MEIsMHhFQSwweDAxLDB4NDQsMHgwQywweDk0LDB4MEIsCisweDg0LDB4MEIsMHhGMiwweDAxLDB4NDQsMHgwRCwweDlDLDB4MEIsMHg4QywweDBCLDB4RkEsMHgwMSwweDQ0LDB4MEUsMHhBNCwweDBCLAorMHg5NCwweDBCLDB4MDIsMHgwMiwweDQ0LDB4MEYsMHgyQywweDBCLDB4OUMsMHgwQiwweDBBLDB4MDIsMHgxNywweDFGLDB4MEYsMHgyRiwKKzB4MDAsMHgwMCwweDAxLDB4ODAsMHg3OCwweDc4LDB4M0EsMHgyMCwweDc0LDB4NzgsMHgyMCwweDYzLDB4NzAsMHg3MywweDIwLDB4MkEsCisweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4ODAsMHg3OCwweDc4LDB4M0EsMHgyMCwweDc0LDB4NzgsMHgyMCwweDYzLAorMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4ODAsMHg3OCwweDc4LDB4M0EsMHgyMCwKKzB4NzQsMHg3OCwweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4ODAsCisweDc4LDB4NzgsMHgzQSwweDIwLDB4NzQsMHg3OCwweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLAorMHgwMiwweDAwLDB4MDEsMHhDMCwweDc4LDB4NzgsMHgzQSwweDIwLDB4NzIsMHg2MywweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwKKzB4MkEsMHgyQSwweDJBLDB4MkEsMHgwMiwweDAwLDB4MDEsMHhDMCwweDc4LDB4NzgsMHgzQSwweDIwLDB4NzIsMHg2MywweDIwLDB4NjMsCisweDcwLDB4NzMsMHgyMCwweDJBLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgwMiwweDAwLDB4MDEsMHhDMCwweDc4LDB4NzgsMHgzQSwweDIwLAorMHg3MiwweDYzLDB4MjAsMHg2MywweDcwLDB4NzMsMHgyMCwweDJBLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgwMiwweDAwLDB4MDEsMHhDMCwKKzB4NzgsMHg3OCwweDNBLDB4MjAsMHg3MiwweDYzLDB4MjAsMHg2MywweDcwLDB4NzMsMHgyMCwweDJBLDB4MkEsMHgyQSwweDJBLDB4MkEsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4NDksMHg2RSwweDczLDB4NzQsMHg2MSwweDZDLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLAorMHg2MiwweDYxLDB4NjMsMHg2QiwweDFGLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgyMCwweDc0LDB4NkYsMHgyMCwKKzB4NzMsMHg3NCwweDYxLDB4NzIsMHg3NCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg0MywweDYxLDB4NjIsMHg2QywweDY1LDB4MjAsCisweDc0LDB4NkYsMHgyMCwweDUyLDB4NjUsMHg2RCwweDZGLDB4NzQsMHg2NSwweDFGLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLAorMHg4MCwweDIwLDB4NzQsMHg2RiwweDIwLDB4NzMsMHg3NCwweDYxLDB4NzIsMHg3NCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg0QywKKzB4NkYsMHg2MywweDYxLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgyMCwweDFGLDB4MjAsCisweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLDB4MkUsMHgyRSwweDAyLDB4MDAsMHgwMSwweDgwLAorMHg1MiwweDY1LDB4NkQsMHg2RiwweDc0LDB4NjUsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgyMCwKKzB4MUYsMHgyMCwweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLDB4MkUsMHgyRSwweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDQ5LDB4NkUsMHg3NCwweDcyLDB4NkUsMHg2QywweDIwLDB4NEMsMHg2RiwweDZGLDB4NzAsMHg2MiwweDYxLAorMHg2MywweDZCLDB4MUYsMHgyMCwweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLDB4MkUsMHgyRSwKKzB4MDIsMHgwMCwweDAxLDB4ODAsMHg1NCwweDcyLDB4NjEsMHg2RSwweDczLDB4NkQsMHg2OSwweDc0LDB4MjAsMHg1MCwweDYxLDB4NzQsCisweDc0LDB4NjUsMHg3MiwweDZFLDB4MUYsMHgyMCwweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLAorMHgyRSwweDJFLDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzAsMHgzQSwweDIwLDB4MjcsMHg0MywweDgwLDB4MDAsMHgwMSwKKzB4ODAsMHgyMCwweDIwLDB4MzEsMHgzQSwweDIwLDB4MjcsMHg0MywweDgxLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDMyLDB4M0EsCisweDIwLDB4MjcsMHg0MywweDgyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDMzLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4MywweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDM0LDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4NCwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNSwKKzB4M0EsMHgyMCwweDI3LDB4NDMsMHg4NSwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNiwweDNBLDB4MjAsMHgyNywweDQzLDB4ODYsCisweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNywweDNBLDB4MjAsMHgyNywweDQzLDB4ODcsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHgzOCwweDNBLDB4MjAsMHgyNywweDQzLDB4ODgsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzksMHgzQSwweDIwLDB4MjcsMHg0MywKKzB4ODksMHgwMCwweDAxLDB4ODAsMHgyMCwweDMxLDB4MzAsMHgzQSwweDIwLDB4MjcsMHg0MywweDhBLDB4MDAsMHgwMSwweDgwLDB4MjAsCisweDMxLDB4MzEsMHgzQSwweDIwLDB4MjcsMHg0MywweDhCLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgzMSwweDMyLDB4M0EsMHgyMCwweDI3LAorMHg0MywweDhDLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgzMSwweDMzLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4RCwweDAwLDB4MDEsMHg4MCwKKzB4MjAsMHgzMSwweDM0LDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4RSwweDAwLDB4MDEsMHg4MCwweDIwLDB4MzEsMHgzNSwweDNBLDB4MjAsCisweDI3LDB4NDMsMHg4RiwweDAwLDB4MkEsMHgyQSwweDIwLDB4NEQsMHg2MSwweDY5LDB4NkUsMHgyMCwweDIwLDB4NEQsMHg2NSwweDZFLAorMHg3NSwweDIwLDB4MkEsMHgyQSwweDAwLDB4NEQsMHg2RiwweDZFLDB4NjksMHg3NCwweDZGLDB4NzIsMHgyMCwweDYxLDB4MjAsMHg1MCwKKzB4NkYsMHg3MiwweDc0LDB4MDAsMHg0RCwweDZGLDB4NkUsMHg2OSwweDc0LDB4NkYsMHg3MiwweDIwLDB4NjEsMHgyMCwweDUzLDB4NjksCisweDY3LDB4NkUsMHg2MSwweDZDLDB4MDAsMHg0NSwweDczLDB4NzQsMHg2OSwweDZELDB4NjEsMHg3NCwweDY1LDB4MjAsMHg0MywweDUwLAorMHg1MywweDAwLDB4NDQsMHg2OSwweDYxLDB4NjcsMHg2RSwweDZGLDB4NzMsMHg3NCwweDY5LDB4NjMsMHg3MywweDAwLDB4NEMsMHg2RiwKKzB4NjMsMHg2MSwweDZDLDB4MjAsMHg0QywweDZGLDB4NkYsMHg3MCwweDYyLDB4NjEsMHg2MywweDZCLDB4MDAsMHg1MiwweDY1LDB4NkQsCisweDZGLDB4NzQsMHg2NSwweDIwLDB4NEMsMHg2RiwweDZGLDB4NzAsMHg2MiwweDYxLDB4NjMsMHg2QiwweDAwLDB4NDksMHg2RSwweDc0LAorMHg3MiwweDZFLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgwMCwweDU0LDB4NzIsMHg2MSwKKzB4NkUsMHg3MywweDZELDB4NjksMHg3NCwweDIwLDB4NTAsMHg2MSwweDc0LDB4NzQsMHg2NSwweDcyLDB4NkUsMHgwMCwweDQyLDB4NjEsCisweDc1LDB4NjQsMHgyMCwweDUyLDB4NjEsMHg3NCwweDY1LDB4MDAsMHg0NCwweDYxLDB4NzQsMHg2MSwweDIwLDB4NDIsMHg2OSwweDc0LAorMHg3MywweDAwLDB4NTMsMHg3NCwweDZGLDB4NzAsMHgyMCwweDQyLDB4NjksMHg3NCwweDczLDB4MDAsMHg1MCwweDYxLDB4NzIsMHg2OSwKKzB4NzQsMHg3OSwweDAwLDB4NDQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDUwLDB4NjEsMHg3NCwweDc0LDB4NjUsMHg3MiwweDZFLDB4MDAsCisweDU0LDB4NzgsMHgyMCwweDQ2LDB4NkMsMHg2RiwweDc3LDB4MjAsMHg0MywweDZGLDB4NkUsMHg3NCwweDcyLDB4NkYsMHg2QywweDAwLAorMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4NEUsMHg3NSwweDZELDB4NjIsMHg2NSwweDcyLDB4MDAsMHgzNSwweDMwLDB4MDAsMHgzNywKKzB4MzUsMHgwMCwweDMxLDB4MzEsMHgzMCwweDAwLDB4MzEsMHgzMywweDM0LDB4MkUsMHgzNSwweDAwLDB4MzEsMHgzNSwweDMwLDB4MDAsCisweDMyLDB4MzAsMHgzMCwweDAwLDB4MzMsMHgzMCwweDMwLDB4MDAsMHgzNiwweDMwLDB4MzAsMHgwMCwweDMxLDB4MzIsMHgzMCwweDMwLAorMHgwMCwweDMxLDB4MzgsMHgzMCwweDMwLDB4MDAsMHgzMiwweDMwLDB4MzAsMHgzMCwweDAwLDB4MzIsMHgzNCwweDMwLDB4MzAsMHgwMCwKKzB4MzMsMHgzNiwweDMwLDB4MzAsMHgwMCwweDM0LDB4MzgsMHgzMCwweDMwLDB4MDAsMHgzNywweDMyLDB4MzAsMHgzMCwweDAwLDB4MzksCisweDM2LDB4MzAsMHgzMCwweDAwLDB4MzEsMHgzOSwweDJDLDB4MzIsMHgzMCwweDMwLDB4MDAsMHgzMywweDM4LDB4MkMsMHgzNCwweDMwLAorMHgzMCwweDAwLDB4MzUsMHgzNiwweDJDLDB4MzAsMHgzMCwweDMwLDB4MDAsMHgzNSwweDM3LDB4MkMsMHgzNiwweDMwLDB4MzAsMHgwMCwKKzB4MzYsMHgzNCwweDJDLDB4MzAsMHgzMCwweDMwLDB4MDAsMHgzNywweDM2LDB4MkMsMHgzOCwweDMwLDB4MzAsMHgwMCwweDMxLDB4MzEsCisweDM1LDB4MkMsMHgzMiwweDMwLDB4MzAsMHgwMCwweDM3LDB4MjAsMHg2MiwweDY5LDB4NzQsMHg3MywweDAwLDB4MzgsMHgyMCwweDYyLAorMHg2OSwweDc0LDB4NzMsMHgwMCwweDMxLDB4MjAsMHg3MywweDc0LDB4NkYsMHg3MCwweDIwLDB4NjIsMHg2OSwweDc0LDB4MDAsMHgzMSwKKzB4MkUsMHgzNSwweDIwLDB4NzMsMHg3NCwweDZGLDB4NzAsMHgyMCwweDYyLDB4NjksMHg3NCwweDczLDB4MDAsMHgzMiwweDIwLDB4NzMsCisweDc0LDB4NkYsMHg3MCwweDIwLDB4NjIsMHg2OSwweDc0LDB4NzMsMHgwMCwweDZFLDB4NkYsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LAorMHg3NCwweDc5LDB4MDAsMHg2RiwweDY0LDB4NjQsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LDB4NzQsMHg3OSwweDAwLDB4NjUsMHg3NiwKKzB4NjUsMHg2RSwweDIwLDB4NzAsMHg2MSwweDcyLDB4NjksMHg3NCwweDc5LDB4MDAsMHg3MywweDcwLDB4NjEsMHg2MywweDY1LDB4MjAsCisweDcwLDB4NjEsMHg3MiwweDY5LDB4NzQsMHg3OSwweDAwLDB4NkQsMHg2MSwweDcyLDB4NkIsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LAorMHg3NCwweDc5LDB4MDAsMHg0MywweDZGLDB4NkMsMHg3NSwweDZELDB4NkUsMHg3MywweDAwLDB4NDIsMHg2MSwweDcyLDB4NjIsMHg2NSwKKzB4NzIsMHgyMCwweDUwLDB4NkYsMHg2QywweDY1LDB4MDAsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4MkUsMHgyRSwweDJFLDB4MDAsCisweDRFLDB4NkYsMHg2RSwweDY1LDB4MDAsMHg1OCwweDZGLDB4NkUsMHgyRiwweDU4LDB4NkYsMHg2NiwweDY2LDB4MDAsMHg0MywweDU0LAorMHg1MywweDAwLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgyMCwweDY2LDB4NkYsMHg3MiwweDIwLDB4NkQsMHg2NSwKKzB4NkUsMHg3NSwweDAwLDB4MjgsMHg2MywweDZGLDB4NzUsMHg2RSwweDc0LDB4NjksMHg2RSwweDY3LDB4MkUsMHgyRSwweDJFLDB4MjksCisweDAwLDB4MDAsMHg2NSwweDRFLDB4NjQsMHgyMCwweDRGLDB4NjYsMHgyMCwweDQzLDB4NkYsMHg0NCwweDY1LDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjk5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTggYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEZWZpbml0aW9uIHRhYmxlIGZvciBJbi1saW5lIGFuZCBCeXBhc3MgY29tbWFuZHMuIEFwcGxpY2FibGUKKyogICAgICAgICAgICAgICAgb25seSB3aGVuIHRoZSBzdGFuZGFyZCBsb2Fkd2FyZSBpcyBhY3RpdmUuIChUaGlzIGlzIGluY2x1ZGVkCisqICAgICAgICAgICAgICAgIHNvdXJjZSBjb2RlLCBub3QgYSBzZXBhcmF0ZSBjb21waWxhdGlvbiBtb2R1bGUuKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZXZpc2lvbiBIaXN0b3J5OgorLy8KKy8vIDEwIE9jdG9iZXIgMTk5MSAgIE1BRyBGaXJzdCBEcmFmdAorLy8gIDcgTm92ZW1iZXIgMTk5MSAgTUFHIFJlZmxlY3RzIGFkZGl0aW9uYWwgY29tbWFuZHMuCisvLyAyNCBGZWJydWFyeSAxOTkyICBNQUcgQWRkaXRpb25hbCBjb21tYW5kcyBmb3IgMS40LnggbG9hZHdhcmUKKy8vIDExIE1hcmNoIDE5OTIgICAgIE1BRyBBZGRpdGlvbmFsIGNvbW1hbmRzCisvLyAzMCBNYXJjaCAxOTkyICAgICBNQUcgQWRkaXRpb25hbCBjb21tYW5kOiBDTURfRFNTX05PVworLy8gMTggTWF5IDE5OTIgICAgICAgTUFHIERpc2NvdmVyZWQgY29tbWFuZHMgMzkgJiA0MCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgYQorLy8gICAgICAgICAgICAgICAgICAgICAgIHBhY2tldDogYWZmZWN0cyBpbXBsZW1lbnRhdGlvbi4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vKioqKioqKioqKioqCisvLyogSW5jbHVkZXMgKgorLy8qKioqKioqKioqKioKKworI2luY2x1ZGUgImkyY21kLmgiICAgLyogVG8gZ2V0IHNvbWUgYml0LWRlZmluZXMgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlcmUgaXMgdGhlIHRhYmxlIG9mIGdsb2JhbCBhcnJheXMgd2hpY2ggcmVwcmVzZW50IGVhY2ggdHlwZSBvZiBjb21tYW5kCisvLyBzdXBwb3J0ZWQgaW4gdGhlIEludGVsbGlQb3J0IHN0YW5kYXJkIGxvYWR3YXJlLiBTZWUgYWxzbyBpMmNtZC5oCisvLyBmb3IgYSBtb3JlIGNvbXBsZXRlIGV4cGxhbmF0aW9uIG9mIHdoYXQgaXMgZ29pbmcgb24uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBIZXJlIGFyZSB0aGUgdmFyaW91cyBnbG9iYWxzOiBub3RlIHRoYXQgdGhlIG5hbWVzIGFyZSBub3QgdXNlZCBleGNlcHQgdGhyb3VnaAorLy8gdGhlIG1hY3JvcyBkZWZpbmVkIGluIGkyY21kLmguIEFsc28gbm90ZSB0aGF0IGFsdGhvdWdoIHRoZXkgYXJlIGNoYXJhY3RlcgorLy8gYXJyYXlzIGhlcmUgKGZvciBleHRlbmRhYmlsaXR5KSB0aGV5IGFyZSBjYXN0IHRvIHN0cnVjdHVyZSBwb2ludGVycyBpbiB0aGUKKy8vIGkyY21kLmggbWFjcm9zLiBTZWUgaTJjbWQuaCBmb3IgZmxhZ3MgZGVmaW5pdGlvbnMuCisKKy8vICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoIEZsYWdzIENvbW1hbmQKK3N0YXRpYyBVQ0hBUiBjdDAyW10gPSB7IDEsIEJUSCwgICAgIDB4MDIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFIgVVAKK3N0YXRpYyBVQ0hBUiBjdDAzW10gPSB7IDEsIEJUSCwgICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFIgRE4KK3N0YXRpYyBVQ0hBUiBjdDA0W10gPSB7IDEsIEJUSCwgICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFMgVVAKK3N0YXRpYyBVQ0hBUiBjdDA1W10gPSB7IDEsIEJUSCwgICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFMgRE4KK3N0YXRpYyBVQ0hBUiBjdDA2W10gPSB7IDEsIEJZUCwgICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICB9OyAvLyBTVEFSVCBGTAorc3RhdGljIFVDSEFSIGN0MDdbXSA9IHsgMiwgQlRILCAgICAgMHgwNywwICAgICAgICAgICAgICAgICAgIH07IC8vIEJBVUQKK3N0YXRpYyBVQ0hBUiBjdDA4W10gPSB7IDIsIEJUSCwgICAgIDB4MDgsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBCSVRTCitzdGF0aWMgVUNIQVIgY3QwOVtdID0geyAyLCBCVEgsICAgICAweDA5LDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RPUAorc3RhdGljIFVDSEFSIGN0MTBbXSA9IHsgMiwgQlRILCAgICAgMHgwQSwwICAgICAgICAgICAgICAgICAgIH07IC8vIFBBUklUWQorc3RhdGljIFVDSEFSIGN0MTFbXSA9IHsgMiwgQlRILCAgICAgMHgwQiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFhPTgorc3RhdGljIFVDSEFSIGN0MTJbXSA9IHsgMiwgQlRILCAgICAgMHgwQywwICAgICAgICAgICAgICAgICAgIH07IC8vIFhPRkYKK3N0YXRpYyBVQ0hBUiBjdDEzW10gPSB7IDEsIEJUSCwgICAgIDB4MEQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBTVE9QIEZMCitzdGF0aWMgVUNIQVIgY3QxNFtdID0geyAxLCBCWVB8VklQLCAweDBFICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQUNLIEhPVEsKKy8vc3RhdGljIFVDSEFSIGN0MTVbXT17IDIsIEJUSHxWSVAsIDB4MEYsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBJUlEgU0VUCitzdGF0aWMgVUNIQVIgY3QxNltdID0geyAyLCBJTkwsICAgICAweDEwLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSVhPTk9QVFMKK3N0YXRpYyBVQ0hBUiBjdDE3W10gPSB7IDIsIElOTCwgICAgIDB4MTEsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBPWE9OT1BUUworc3RhdGljIFVDSEFSIGN0MThbXSA9IHsgMSwgSU5MLCAgICAgMHgxMiAgICAgICAgICAgICAgICAgICAgIH07IC8vIENUU0VOQUIKK3N0YXRpYyBVQ0hBUiBjdDE5W10gPSB7IDEsIEJUSCwgICAgIDB4MTMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBDVFNEU0FCCitzdGF0aWMgVUNIQVIgY3QyMFtdID0geyAxLCBJTkwsICAgICAweDE0ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRENERU5BQgorc3RhdGljIFVDSEFSIGN0MjFbXSA9IHsgMSwgQlRILCAgICAgMHgxNSAgICAgICAgICAgICAgICAgICAgIH07IC8vIERDRERTQUIKK3N0YXRpYyBVQ0hBUiBjdDIyW10gPSB7IDEsIEJUSCwgICAgIDB4MTYgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEU1JFTkFCCitzdGF0aWMgVUNIQVIgY3QyM1tdID0geyAxLCBCVEgsICAgICAweDE3ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNSRFNBQgorc3RhdGljIFVDSEFSIGN0MjRbXSA9IHsgMSwgQlRILCAgICAgMHgxOCAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJJRU5BQgorc3RhdGljIFVDSEFSIGN0MjVbXSA9IHsgMSwgQlRILCAgICAgMHgxOSAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJJRFNBQgorc3RhdGljIFVDSEFSIGN0MjZbXSA9IHsgMiwgQlRILCAgICAgMHgxQSwwICAgICAgICAgICAgICAgICAgIH07IC8vIEJSS0VOQUIKK3N0YXRpYyBVQ0hBUiBjdDI3W10gPSB7IDEsIEJUSCwgICAgIDB4MUIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBCUktEU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDI4W109eyAyLCBCVEgsICAgICAweDFDLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gTUFYQkxPS1NJWkUKKy8vc3RhdGljIFVDSEFSIGN0MjlbXT17IDIsIDAsICAgICAgIDB4MUQsMCAgICAgICAgICAgICAgICAgICB9OyAvLyByZXNlcnZlZAorc3RhdGljIFVDSEFSIGN0MzBbXSA9IHsgMSwgSU5MLCAgICAgMHgxRSAgICAgICAgICAgICAgICAgICAgIH07IC8vIENUU0ZMT1dFTkFCCitzdGF0aWMgVUNIQVIgY3QzMVtdID0geyAxLCBJTkwsICAgICAweDFGICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQ1RTRkxPV0RTQUIKK3N0YXRpYyBVQ0hBUiBjdDMyW10gPSB7IDEsIElOTCwgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFNGTE9XRU5BQgorc3RhdGljIFVDSEFSIGN0MzNbXSA9IHsgMSwgSU5MLCAgICAgMHgyMSAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJUU0ZMT1dEU0FCCitzdGF0aWMgVUNIQVIgY3QzNFtdID0geyAyLCBCVEgsICAgICAweDIyLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSVNUUklQTU9ERQorc3RhdGljIFVDSEFSIGN0MzVbXSA9IHsgMiwgQlRIfEVORCwgMHgyMywwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFTkRCUkVBSworc3RhdGljIFVDSEFSIGN0MzZbXSA9IHsgMiwgQlRILCAgICAgMHgyNCwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFVEVSUk1PREUKKy8vc3RhdGljIFVDSEFSIGN0MzZhW109eyAzLCBJTkwsICAgIDB4MjQsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBTRVRfUkVQTEFDRQorCisvLyBUaGUgZm9sbG93aW5nIGlzIGxpc3RlZCBmb3IgY29tcGxldGVuZXNzLCBidXQgc2hvdWxkIG5ldmVyIGJlIHNlbnQgZGlyZWN0bHkKKy8vIGJ5IHVzZXItbGV2ZWwgY29kZS4gSXQgaXMgc2VudCBvbmx5IGJ5IGxpYnJhcnkgcm91dGluZXMgaW4gcmVzcG9uc2UgdG8gZGF0YQorLy8gbW92ZW1lbnQuCisvL3N0YXRpYyBVQ0hBUiBjdDM3W109eyA1LCBCWVB8VklQLCAweDI1LDAsMCwwLDAgICAgICAgICAgICAgfTsgLy8gRkxPVyBQQUNLRVQKKworLy8gQmFjayB0byBub3JtYWwKKy8vc3RhdGljIFVDSEFSIGN0MzhbXSA9IHsxMSwgQlRIfFZBUiwgMHgyNiwwLDAsMCwwLDAsMCwwLDAsMCwwIH07IC8vIERFRiBLRVkgU0VRCisvL3N0YXRpYyBVQ0hBUiBjdDM5W109eyAzLCBCVEh8RU5ELCAweDI3LDAsMCAgICAgICAgICAgICAgICAgfTsgLy8gT1BPU1RPTgorLy9zdGF0aWMgVUNIQVIgY3Q0MFtdPXsgMSwgQlRIfEVORCwgMHgyOCAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9QT1NUT0ZGCitzdGF0aWMgVUNIQVIgY3Q0MVtdID0geyAxLCBCWVAsICAgICAweDI5ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gUkVTVU1FCisvL3N0YXRpYyBVQ0hBUiBjdDQyW109eyAyLCBCVEgsICAgICAweDJBLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gVFhCQVVECisvL3N0YXRpYyBVQ0hBUiBjdDQzW109eyAyLCBCVEgsICAgICAweDJCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUlhCQVVECisvL3N0YXRpYyBVQ0hBUiBjdDQ0W109eyAyLCBCVEgsICAgICAweDJDLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gTVMgUElORworLy9zdGF0aWMgVUNIQVIgY3Q0NVtdPXsgMSwgQlRILCAgICAgMHgyRCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEhPVEVOQUIKKy8vc3RhdGljIFVDSEFSIGN0NDZbXT17IDEsIEJUSCwgICAgIDB4MkUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBIT1REU0FCCitzdGF0aWMgVUNIQVIgY3Q0N1tdID0geyA3LCBCVEgsICAgICAweDJGLDAsMCwwLDAsMCwwICAgICAgICAgfTsgLy8gVU5JWCBGTEFHUworLy9zdGF0aWMgVUNIQVIgY3Q0OFtdPXsgMSwgQlRILCAgICAgMHgzMCAgICAgICAgICAgICAgICAgICAgIH07IC8vIERTUkZMT1dFTkFCCisvL3N0YXRpYyBVQ0hBUiBjdDQ5W109eyAxLCBCVEgsICAgICAweDMxICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNSRkxPV0RTQUIKKy8vc3RhdGljIFVDSEFSIGN0NTBbXT17IDEsIEJUSCwgICAgIDB4MzIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFJGTE9XRU5BQgorLy9zdGF0aWMgVUNIQVIgY3Q1MVtdPXsgMSwgQlRILCAgICAgMHgzMyAgICAgICAgICAgICAgICAgICAgIH07IC8vIERUUkZMT1dEU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDUyW109eyAxLCBCVEgsICAgICAweDM0ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQkFVRFRBQlJFU0VUCisvL3N0YXRpYyBVQ0hBUiBjdDUzW10gPSB7IDMsIEJUSCwgICAgIDB4MzUsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBCQVVEUkVNQVAKK3N0YXRpYyBVQ0hBUiBjdDU0W10gPSB7IDMsIEJUSCwgICAgIDB4MzYsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBDVVNUT01CQVVEMQorc3RhdGljIFVDSEFSIGN0NTVbXSA9IHsgMywgQlRILCAgICAgMHgzNywwLDAgICAgICAgICAgICAgICAgIH07IC8vIENVU1RPTUJBVUQyCitzdGF0aWMgVUNIQVIgY3Q1NltdID0geyAyLCBCVEh8RU5ELCAweDM4LDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUEFVU0UKK3N0YXRpYyBVQ0hBUiBjdDU3W10gPSB7IDEsIEJZUCwgICAgIDB4MzkgICAgICAgICAgICAgICAgICAgICB9OyAvLyBTVVNQRU5ECitzdGF0aWMgVUNIQVIgY3Q1OFtdID0geyAxLCBCWVAsICAgICAweDNBICAgICAgICAgICAgICAgICAgICAgfTsgLy8gVU5TVVNQRU5ECitzdGF0aWMgVUNIQVIgY3Q1OVtdID0geyAyLCBCVEgsICAgICAweDNCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUEFSSVRZQ0hLCitzdGF0aWMgVUNIQVIgY3Q2MFtdID0geyAxLCBJTkx8VklQLCAweDNDICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQk9PS01BUktSRVEKKy8vc3RhdGljIFVDSEFSIGN0NjFbXT17IDIsIEJUSCwgICAgIDB4M0QsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBJTlRFUk5BTExPT1AKKy8vc3RhdGljIFVDSEFSIGN0NjJbXT17IDIsIEJUSCwgICAgIDB4M0UsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBIT1RLVElNRU9VVAorc3RhdGljIFVDSEFSIGN0NjNbXSA9IHsgMiwgSU5MLCAgICAgMHgzRiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFVFRYT04KK3N0YXRpYyBVQ0hBUiBjdDY0W10gPSB7IDIsIElOTCwgICAgIDB4NDAsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRUWE9GRgorLy9zdGF0aWMgVUNIQVIgY3Q2NVtdPXsgMiwgQlRILCAgICAgMHg0MSwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFVEFVVE9SVFMKKy8vc3RhdGljIFVDSEFSIGN0NjZbXT17IDIsIEJUSCwgICAgIDB4NDIsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRISUdIV0FUCisvL3N0YXRpYyBVQ0hBUiBjdDY3W109eyAyLCBCWVAsICAgICAweDQzLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RBUlRTRUxGTAorLy9zdGF0aWMgVUNIQVIgY3Q2OFtdPXsgMiwgSU5MLCAgICAgMHg0NCwwICAgICAgICAgICAgICAgICAgIH07IC8vIEVORFNFTEZMCisvL3N0YXRpYyBVQ0hBUiBjdDY5W109eyAxLCBCWVAsICAgICAweDQ1ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gSFdGTE9XX09GRgorLy9zdGF0aWMgVUNIQVIgY3Q3MFtdPXsgMSwgQlRILCAgICAgMHg0NiAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9EU1JGTF9FTkFCCisvL3N0YXRpYyBVQ0hBUiBjdDcxW109eyAxLCBCVEgsICAgICAweDQ3ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gT0RTUkZMX0RTQUIKKy8vc3RhdGljIFVDSEFSIGN0NzJbXT17IDEsIEJUSCwgICAgIDB4NDggICAgICAgICAgICAgICAgICAgICB9OyAvLyBPRENERkxfRU5BQgorLy9zdGF0aWMgVUNIQVIgY3Q3M1tdPXsgMSwgQlRILCAgICAgMHg0OSAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9EQ0RGTF9EU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDc0W109eyAyLCBCVEgsICAgICAweDRBLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gTE9BRExFVkVMCisvL3N0YXRpYyBVQ0hBUiBjdDc1W109eyAyLCBCVEgsICAgICAweDRCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RBVERBVEEKKy8vc3RhdGljIFVDSEFSIGN0NzZbXT17IDEsIEJZUCwgICAgIDB4NEMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBCUkVBS19PTgorLy9zdGF0aWMgVUNIQVIgY3Q3N1tdPXsgMSwgQllQLCAgICAgMHg0RCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEJSRUFLX09GRgorLy9zdGF0aWMgVUNIQVIgY3Q3OFtdPXsgMSwgQllQLCAgICAgMHg0RSAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVEZDCitzdGF0aWMgVUNIQVIgY3Q3OVtdID0geyAyLCBCWVAsICAgICAweDRGLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gWE1JVF9OT1cKKy8vc3RhdGljIFVDSEFSIGN0ODBbXT17IDQsIEJUSCwgICAgIDB4NTAsMCwwLDAgICAgICAgICAgICAgICB9OyAvLyBESVZJU09SX0xBVENICisvL3N0YXRpYyBVQ0hBUiBjdDgxW109eyAxLCBCWVAsICAgICAweDUxICAgICAgICAgICAgICAgICAgICAgfTsgLy8gR0VUX1NUQVRVUworLy9zdGF0aWMgVUNIQVIgY3Q4MltdPXsgMSwgQllQLCAgICAgMHg1MiAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9UWENOVAorLy9zdGF0aWMgVUNIQVIgY3Q4M1tdPXsgMSwgQllQLCAgICAgMHg1MyAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9SWENOVAorLy9zdGF0aWMgVUNIQVIgY3Q4NFtdPXsgMSwgQllQLCAgICAgMHg1NCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9CT1hJRFMKKy8vc3RhdGljIFVDSEFSIGN0ODVbXT17MTAsIEJZUCwgICAgIDB4NTUsMCwwLDAsMCwwLDAsMCwwLDAgICB9OyAvLyBFTkFCX01VTFQKKy8vc3RhdGljIFVDSEFSIGN0ODZbXT17IDIsIEJUSCwgICAgIDB4NTYsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBSQ1ZfRU5BQkxFCitzdGF0aWMgVUNIQVIgY3Q4N1tdID0geyAxLCBCWVAsICAgICAweDU3ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gSFdfVEVTVAorLy9zdGF0aWMgVUNIQVIgY3Q4OFtdPXsgMywgQlRILCAgICAgMHg1OCwwLDAgICAgICAgICAgICAgICAgIH07IC8vIFJDVl9USFJFU0hPTEQKK3N0YXRpYyBVQ0hBUiBjdDg5W109eyAxLCBCWVAsICAgICAweDU5ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNTX05PVworLy9zdGF0aWMgVUNIQVIgY3Q5MFtdPXsgMywgQllQLCAgICAgMHg1QSwwLDAgICAgICAgICAgICAgICAgIH07IC8vIFNldCBTSUxPCisvL3N0YXRpYyBVQ0hBUiBjdDkxW109eyAyLCBCWVAsICAgICAweDVCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gdGltZWQgYnJlYWsKKworLy8gU29tZSBjb21wb3NpdGUgY29tbWFuZHMgYXMgd2VsbAorLy9zdGF0aWMgVUNIQVIgY2MwMVtdPXsgMiwgQlRILCAgICAgMHgwMiwweDA0ICAgICAgICAgICAgICAgIH07IC8vIERUUiAmIFJUUyBVUAorLy9zdGF0aWMgVUNIQVIgY2MwMltdPXsgMiwgQlRILCAgICAgMHgwMywweDA1ICAgICAgICAgICAgICAgIH07IC8vIERUUiAmIFJUUyBETgorCisvLyoqKioqKioqCisvLyogQ29kZSAqCisvLyoqKioqKioqCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMmNtZFVuaXhGbGFncyhpZmxhZywgY2ZsYWcsIGxmbGFnKQorLy8gUGFyYW1ldGVyczogVW5peCB0dHkgZmxhZ3MKKy8vCisvLyBSZXR1cm5zOiAgICBQb2ludGVyIHRvIGNvbW1hbmQgc3RydWN0dXJlCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIHNldHMgdGhlIHBhcmFtZXRlcnMgb2YgY29tbWFuZCA0NyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisvLyBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmUuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorY21kU3ludGF4UHRyCitpMmNtZFVuaXhGbGFncyh1bnNpZ25lZCBzaG9ydCBpZmxhZyx1bnNpZ25lZCBzaG9ydCBjZmxhZyx1bnNpZ25lZCBzaG9ydCBsZmxhZykKK3sKKwljbWRTeW50YXhQdHIgcENNID0gKGNtZFN5bnRheFB0cikgY3Q0NzsKKworCXBDTS0+Y21kWzFdID0gKHVuc2lnbmVkIGNoYXIpICBpZmxhZzsKKwlwQ00tPmNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAoaWZsYWcgPj4gOCk7CisJcENNLT5jbWRbM10gPSAodW5zaWduZWQgY2hhcikgIGNmbGFnOworCXBDTS0+Y21kWzRdID0gKHVuc2lnbmVkIGNoYXIpIChjZmxhZyA+PiA4KTsKKwlwQ00tPmNtZFs1XSA9ICh1bnNpZ25lZCBjaGFyKSAgbGZsYWc7CisJcENNLT5jbWRbNl0gPSAodW5zaWduZWQgY2hhcikgKGxmbGFnID4+IDgpOworCXJldHVybiBwQ007Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMmNtZEJhdWREZWYod2hpY2gsIHJhdGUpCisvLyBQYXJhbWV0ZXJzOiA/CisvLworLy8gUmV0dXJuczogICAgUG9pbnRlciB0byBjb21tYW5kIHN0cnVjdHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgcm91dGluZSBzZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIGNvbW1hbmRzIDU0IG9yIDU1IChhY2NvcmRpbmcgdG8gdGhlCisvLyBhcmd1bWVudCB3aGljaCksIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2NtZFN5bnRheFB0cgoraTJjbWRCYXVkRGVmKGludCB3aGljaCwgdW5zaWduZWQgc2hvcnQgcmF0ZSkKK3sKKwljbWRTeW50YXhQdHIgcENNOworCisJc3dpdGNoKHdoaWNoKQorCXsKKwljYXNlIDE6CisJCXBDTSA9IChjbWRTeW50YXhQdHIpIGN0NTQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSAyOgorCQlwQ00gPSAoY21kU3ludGF4UHRyKSBjdDU1OworCQlicmVhazsKKwl9CisJcENNLT5jbWRbMV0gPSAodW5zaWduZWQgY2hhcikgcmF0ZTsKKwlwQ00tPmNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAocmF0ZSA+PiA4KTsKKwlyZXR1cm4gcENNOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxNzI4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuaApAQCAtMCwwICsxLDY0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IERlZmluaXRpb25zIGFuZCBzdXBwb3J0IGZvciBJbi1saW5lIGFuZCBCeXBhc3MgY29tbWFuZHMuCisqICAgICAgICAgICAgICAgIEFwcGxpY2FibGUgb25seSB3aGVuIHRoZSBzdGFuZGFyZCBsb2Fkd2FyZSBpcyBhY3RpdmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMTAgT2N0b2JlciAxOTkxICAgTUFHIEZpcnN0IERyYWZ0CisvLyAgNyBOb3ZlbWJlciAxOTkxICBNQUcgUmVmbGVjdHMgc29tZSBuZXcgY29tbWFuZHMKKy8vIDIwIEZlYnJ1YXJ5IDE5OTIgIE1BRyBDTURfSE9UQUNLIGNvcnJlY3RlZDogbm8gYXJndW1lbnQuCisvLyAyNCBGZWJydWFyeSAxOTkyICBNQUcgU3VwcG9ydCBhZGRlZCBmb3IgbmV3IGNvbW1hbmRzIGZvciAxLjQueCBsb2Fkd2FyZS4KKy8vIDExIE1hcmNoIDE5OTIgICAgIE1BRyBBZGRpdGlvbmFsIGNvbW1hbmRzLgorLy8gMTYgTWFyY2ggMTk5MiAgICAgTUFHIEFkZGl0aW9uYWwgY29tbWFuZHMuCisvLyAzMCBNYXJjaCAxOTkyICAgICBNQUcgQWRkaXRpb25hbCBjb21tYW5kOiBDTURfRFNTX05PVworLy8gMTggTWF5ICAgMTk5MiAgICAgTUFHIENoYW5nZWQgQ01EX09QT1NUCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZm5kZWYgSTJDTURfSCAgICAgIC8vIFRvIHByZXZlbnQgbXVsdGlwbGUgaW5jbHVkZXMKKyNkZWZpbmUgSTJDTURfSCAgIDEKKworI2luY2x1ZGUgImlwMnR5cGVzLmgiCisKKy8vIFRoaXMgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgYSB1bmlmb3JtIG1ldGhvZCBvZiBzZW5kaW5nIGNvbW1hbmRzIHRvCisvLyB0aGUgYm9hcmQgdGhyb3VnaCBjb21tYW5kIHBhY2tldHMuIFRoZSBkaWZmaWN1bHR5IGlzLCBzb21lIGNvbW1hbmRzIHRha2UKKy8vIHBhcmFtZXRlcnMsIG90aGVycyBkbyBub3QuIEZ1cnRoZXJtb3JlLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8gc2VuZCBzZXZlcmFsCisvLyBjb21tYW5kcyB0byB0aGUgc2FtZSBjaGFubmVsIGFzIHBhcnQgb2YgdGhlIHNhbWUgcGFja2V0LiAoU2VlIGFsc28gaTJwYWNrLmguKQorLy8KKy8vIFRoaXMgbW9kdWxlIGlzIGRlc2lnbmVkIHNvIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorLy8gcmVtZW1iZXJpbmcgdGhlIGV4YWN0IHN5bnRheCBvZiBlYWNoIGNvbW1hbmQsIG9yIGF0IGxlYXN0IHNvIHRoYXQgdGhlCisvLyBjb21waWxlciBjb3VsZCBjaGVjayB0aGluZ3Mgc29tZXdoYXQuIEknbGwgZXhwbGFpbiBhcyB3ZSBnby4uLgorLy8KKy8vIEZpcnN0LCBhIHN0cnVjdHVyZSB3aGljaCBjYW4gZW1ib2R5IHRoZSBzeW50YXggb2YgZWFjaCB0eXBlIG9mIGNvbW1hbmQuCisvLwordHlwZWRlZiBzdHJ1Y3QgX2NtZFN5bnRheAoreworCVVDSEFSIGxlbmd0aDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNvbW1hbmQKKwlVQ0hBUiBmbGFnczsgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW1hbmQgKHNlZSBiZWxvdykKKworCS8vIFRoZSBjb21tYW5kIGFuZCBpdHMgcGFyYW1ldGVycywgd2hpY2ggbWF5IGJlIG9mIGFyYml0cmFyeSBsZW5ndGguIERvbid0CisJLy8gd29ycnkgeWV0IGhvdyB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIGluaXRpYWxpemVkOyBtYWNyb3MgbGF0ZXIgdGFrZSBjYXJlCisJLy8gb2YgaXQuIEFsc28sIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBhcmJpdHJhcnkgbGVuZ3RoIGlzc3VlOyB0aGlzIHN0cnVjdHVyZQorCS8vIGlzIG5ldmVyIHVzZWQgdG8gYWxsb2NhdGUgc3BhY2UgKHNlZSBpMmNtZC5jKS4KKwlVQ0hBUiBjbWRbMl07Cit9IGNtZFN5bnRheCwgKmNtZFN5bnRheFB0cjsKKworLy8gQml0IGFzc2lnbm1lbnRzIGZvciBmbGFncworCisjZGVmaW5lIElOTCAxICAgICAgICAgICAvLyBTZXQgaWYgc3VpdGFibGUgZm9yIGlubGluZSBjb21tYW5kcworI2RlZmluZSBCWVAgMiAgICAgICAgICAgLy8gU2V0IGlmIHN1aXRhYmxlIGZvciBieXBhc3MgY29tbWFuZHMKKyNkZWZpbmUgQlRIIChJTkx8QllQKSAgIC8vIHN1aXRhYmxlIGZvciBlaXRoZXIhCisjZGVmaW5lIEVORCA0ICAgICAgICAgICAvLyBTZXQgaWYgdGhpcyBtdXN0IGJlIHRoZSBsYXN0IGNvbW1hbmQgaW4gYSBibG9jaworI2RlZmluZSBWSVAgOCAgICAgICAgICAgLy8gU2V0IGlmIHRoaXMgY29tbWFuZCBpcyBzcGVjaWFsIGluIHNvbWUgd2F5IGFuZCByZWFsbHkKKwkJCQkJCS8vIHNob3VsZCBvbmx5IGJlIHNlbnQgZnJvbSB0aGUgbGlicmFyeS1sZXZlbCBhbmQgbm90CisJCQkJCQkvLyBkaXJlY3RseSBmcm9tIHVzZXItbGV2ZWwKKyNkZWZpbmUgVkFSIDB4MTAgICAgICAgIC8vIFRoaXMgY29tbWFuZCBpcyBvZiB2YXJpYWJsZSBsZW5ndGghCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgaTJjbWQuYworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZSB0byBzZXQgdXAgcGFyYW1ldGVycyBmb3IgdGhlICJkZWZpbmUgaG90LWtleSBzZXF1ZW5jZSIgY29tbWFuZC4gU2luY2UKKy8vIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIHRvIGFzc2lnbiwgd2UgbXVzdCB1c2UgYSBmdW5jdGlvbiByYXRoZXIKKy8vIHRoYW4gYSBtYWNybyAodXNlZCB1c3VhbGx5KS4KKy8vCitleHRlcm4gY21kU3ludGF4UHRyIGkyY21kVW5peEZsYWdzKFVTSE9SVCBpZmxhZyxVU0hPUlQgY2ZsYWcsVVNIT1JUIGxmbGFnKTsKK2V4dGVybiBjbWRTeW50YXhQdHIgaTJjbWRCYXVkRGVmKGludCB3aGljaCwgVVNIT1JUIHJhdGUpOworCisvLyBEZWNsYXJhdGlvbnMgZm9yIHRoZSBnbG9iYWwgYXJyYXlzIHVzZWQgdG8gYmVhciB0aGUgY29tbWFuZHMgYW5kIHRoZWlyCisvLyBhcmd1bWVudHMuCisvLworLy8gTm90ZTogU2luY2UgdGhlc2UgYXJlIGdsb2JhbHMgYW5kIHRoZSBhcmd1bWVudHMgbWlnaHQgY2hhbmdlLCBpdCBpcyBpbXBvcnRhbnQKKy8vIHRoYXQgdGhlIGxpYnJhcnkgcm91dGluZSBDT1BZIHRoZXNlIGludG8gYnVmZmVycyBmcm9tIHdoZW5jZSB0aGV5IHdvdWxkIGJlCisvLyBzZW50LCByYXRoZXIgdGhhbiBtZXJlbHkgc3RvcmluZyB0aGUgcG9pbnRlcnMuIEluIG11bHRpLXRocmVhZGVkCisvLyBlbnZpcm9ubWVudHMsIGltcG9ydGFudCB0aGF0IHRoZSBjb3B5IHNob3VsZCBvYnRhaW4gYmVmb3JlIGFueSBjb250ZXh0IHN3aXRjaAorLy8gaXMgYWxsb3dlZC4gQWxzbywgZm9yIHBhcmFtZXRlcml6ZWQgY29tbWFuZHMsIERPIE5PVCBJU1NVRSBUSEUgU0FNRSBDT01NQU5ECisvLyBNT1JFIFRIQU4gT05DRSBXSVRIIFRIRSBTQU1FIFBBUkFNRVRFUlMgaW4gdGhlIHNhbWUgY2FsbC4KKy8vCitzdGF0aWMgVUNIQVIgY3QwMltdOworc3RhdGljIFVDSEFSIGN0MDNbXTsKK3N0YXRpYyBVQ0hBUiBjdDA0W107CitzdGF0aWMgVUNIQVIgY3QwNVtdOworc3RhdGljIFVDSEFSIGN0MDZbXTsKK3N0YXRpYyBVQ0hBUiBjdDA3W107CitzdGF0aWMgVUNIQVIgY3QwOFtdOworc3RhdGljIFVDSEFSIGN0MDlbXTsKK3N0YXRpYyBVQ0hBUiBjdDEwW107CitzdGF0aWMgVUNIQVIgY3QxMVtdOworc3RhdGljIFVDSEFSIGN0MTJbXTsKK3N0YXRpYyBVQ0hBUiBjdDEzW107CitzdGF0aWMgVUNIQVIgY3QxNFtdOworc3RhdGljIFVDSEFSIGN0MTVbXTsKK3N0YXRpYyBVQ0hBUiBjdDE2W107CitzdGF0aWMgVUNIQVIgY3QxN1tdOworc3RhdGljIFVDSEFSIGN0MThbXTsKK3N0YXRpYyBVQ0hBUiBjdDE5W107CitzdGF0aWMgVUNIQVIgY3QyMFtdOworc3RhdGljIFVDSEFSIGN0MjFbXTsKK3N0YXRpYyBVQ0hBUiBjdDIyW107CitzdGF0aWMgVUNIQVIgY3QyM1tdOworc3RhdGljIFVDSEFSIGN0MjRbXTsKK3N0YXRpYyBVQ0hBUiBjdDI1W107CitzdGF0aWMgVUNIQVIgY3QyNltdOworc3RhdGljIFVDSEFSIGN0MjdbXTsKK3N0YXRpYyBVQ0hBUiBjdDI4W107CitzdGF0aWMgVUNIQVIgY3QyOVtdOworc3RhdGljIFVDSEFSIGN0MzBbXTsKK3N0YXRpYyBVQ0hBUiBjdDMxW107CitzdGF0aWMgVUNIQVIgY3QzMltdOworc3RhdGljIFVDSEFSIGN0MzNbXTsKK3N0YXRpYyBVQ0hBUiBjdDM0W107CitzdGF0aWMgVUNIQVIgY3QzNVtdOworc3RhdGljIFVDSEFSIGN0MzZbXTsKK3N0YXRpYyBVQ0hBUiBjdDM2YVtdOworc3RhdGljIFVDSEFSIGN0NDFbXTsKK3N0YXRpYyBVQ0hBUiBjdDQyW107CitzdGF0aWMgVUNIQVIgY3Q0M1tdOworc3RhdGljIFVDSEFSIGN0NDRbXTsKK3N0YXRpYyBVQ0hBUiBjdDQ1W107CitzdGF0aWMgVUNIQVIgY3Q0NltdOworc3RhdGljIFVDSEFSIGN0NDhbXTsKK3N0YXRpYyBVQ0hBUiBjdDQ5W107CitzdGF0aWMgVUNIQVIgY3Q1MFtdOworc3RhdGljIFVDSEFSIGN0NTFbXTsKK3N0YXRpYyBVQ0hBUiBjdDUyW107CitzdGF0aWMgVUNIQVIgY3Q1NltdOworc3RhdGljIFVDSEFSIGN0NTdbXTsKK3N0YXRpYyBVQ0hBUiBjdDU4W107CitzdGF0aWMgVUNIQVIgY3Q1OVtdOworc3RhdGljIFVDSEFSIGN0NjBbXTsKK3N0YXRpYyBVQ0hBUiBjdDYxW107CitzdGF0aWMgVUNIQVIgY3Q2MltdOworc3RhdGljIFVDSEFSIGN0NjNbXTsKK3N0YXRpYyBVQ0hBUiBjdDY0W107CitzdGF0aWMgVUNIQVIgY3Q2NVtdOworc3RhdGljIFVDSEFSIGN0NjZbXTsKK3N0YXRpYyBVQ0hBUiBjdDY3W107CitzdGF0aWMgVUNIQVIgY3Q2OFtdOworc3RhdGljIFVDSEFSIGN0NjlbXTsKK3N0YXRpYyBVQ0hBUiBjdDcwW107CitzdGF0aWMgVUNIQVIgY3Q3MVtdOworc3RhdGljIFVDSEFSIGN0NzJbXTsKK3N0YXRpYyBVQ0hBUiBjdDczW107CitzdGF0aWMgVUNIQVIgY3Q3NFtdOworc3RhdGljIFVDSEFSIGN0NzVbXTsKK3N0YXRpYyBVQ0hBUiBjdDc2W107CitzdGF0aWMgVUNIQVIgY3Q3N1tdOworc3RhdGljIFVDSEFSIGN0NzhbXTsKK3N0YXRpYyBVQ0hBUiBjdDc5W107CitzdGF0aWMgVUNIQVIgY3Q4MFtdOworc3RhdGljIFVDSEFSIGN0ODFbXTsKK3N0YXRpYyBVQ0hBUiBjdDgyW107CitzdGF0aWMgVUNIQVIgY3Q4M1tdOworc3RhdGljIFVDSEFSIGN0ODRbXTsKK3N0YXRpYyBVQ0hBUiBjdDg1W107CitzdGF0aWMgVUNIQVIgY3Q4NltdOworc3RhdGljIFVDSEFSIGN0ODdbXTsKK3N0YXRpYyBVQ0hBUiBjdDg4W107CitzdGF0aWMgVUNIQVIgY3Q4OVtdOworc3RhdGljIFVDSEFSIGN0OTBbXTsKK3N0YXRpYyBVQ0hBUiBjdDkxW107CitzdGF0aWMgVUNIQVIgY2MwMVtdOworc3RhdGljIFVDSEFSIGNjMDJbXTsKKworLy8gTm93LCByZWZlciB0byBpMmNtZC5jLCBhbmQgc2VlIHRoZSBjaGFyYWN0ZXIgYXJyYXlzIGRlZmluZWQgdGhlcmUuIFRoZXkgYXJlCisvLyBjYXN0IGhlcmUgdG8gY21kU3ludGF4UHRyLgorLy8KKy8vIFRoZXJlIGFyZSBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgaXNzdWluZyBieXBhc3Mgb3IgaW5saW5lIGNvbW1hbmRzLiBUaGVzZQorLy8gZnVuY3Rpb25zIHRha2Ugb25lIG9yIG1vcmUgYXJndW1lbnRzIG9mIHRoZSB0eXBlIGNtZFN5bnRheFB0ci4gVGhlIHJvdXRpbmUKKy8vIHRoZW4gY2FuIGZpZ3VyZSBvdXQgaG93IGxvbmcgZWFjaCBjb21tYW5kIGlzIHN1cHBvc2VkIHRvIGJlIGFuZCBlYXNpbHkgYWRkIGl0CisvLyB0byB0aGUgbGlzdC4KKy8vCisvLyBGb3IgZWFzZSBvZiB1c2UsIHdlIGRlZmluZSBtYW5pZmVzdHMgd2hpY2ggcmV0dXJuIHBvaW50ZXJzIHRvIGFwcHJvcHJpYXRlCisvLyBjbWRTeW50YXhQdHIgdGhpbmdzLiBCdXQgc29tZSBjb21tYW5kcyBhbHNvIHRha2UgYXJndW1lbnRzLiBJZiBhIHNpbmdsZQorLy8gYXJndW1lbnQgaXMgdXNlZCwgd2UgZGVmaW5lIGEgbWFjcm8gd2hpY2ggcGVyZm9ybXMgdGhlIHNpbmdsZSBhc3NpZ25tZW50IGFuZAorLy8gKHRocm91Z2ggdGhlIGV4cGVkaWVudCBvZiBhIGNvbW1hIGV4cHJlc3Npb24pIHJlZmVyZW5jZXMgdGhlIGFwcHJvcHJpYXRlCisvLyBwb2ludGVyLiBGb3IgY29tbWFuZHMgcmVxdWlyaW5nIHNldmVyYWwgYXJndW1lbnRzLCB3ZSBhY3R1YWxseSBkZWZpbmUgYQorLy8gZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYXNzaWdubWVudHMuCisKKyNkZWZpbmUgQ01EX0RUUlVQCShjbWRTeW50YXhQdHIpKGN0MDIpCS8vIFJhaXNlIERUUgorI2RlZmluZSBDTURfRFRSRE4JKGNtZFN5bnRheFB0cikoY3QwMykJLy8gTG93ZXIgRFRSCisjZGVmaW5lIENNRF9SVFNVUAkoY21kU3ludGF4UHRyKShjdDA0KQkvLyBSYWlzZSBSVFMKKyNkZWZpbmUgQ01EX1JUU0ROCShjbWRTeW50YXhQdHIpKGN0MDUpCS8vIExvd2VyIFJUUworI2RlZmluZSBDTURfU1RBUlRGTAkoY21kU3ludGF4UHRyKShjdDA2KQkvLyBTdGFydCBGbHVzaGluZyBEYXRhCisKKyNkZWZpbmUgQ01EX0RUUlJUU19VUCAoY21kU3ludGF4UHRyKShjYzAxKQkvLyBSYWlzZSBEVFIgYW5kIFJUUworI2RlZmluZSBDTURfRFRSUlRTX0ROIChjbWRTeW50YXhQdHIpKGNjMDIpCS8vIExvd2VyIERUUiBhbmQgUlRTCisKKy8vIFNldCBCYXVkIFJhdGUgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlCisjZGVmaW5lIENNRF9TRVRCQVVEKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QwNykpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDA3KSkKKworI2RlZmluZSBDQlJfNTAgICAgICAgMQorI2RlZmluZSBDQlJfNzUgICAgICAgMgorI2RlZmluZSBDQlJfMTEwICAgICAgMworI2RlZmluZSBDQlJfMTM0ICAgICAgNAorI2RlZmluZSBDQlJfMTUwICAgICAgNQorI2RlZmluZSBDQlJfMjAwICAgICAgNgorI2RlZmluZSBDQlJfMzAwICAgICAgNworI2RlZmluZSBDQlJfNjAwICAgICAgOAorI2RlZmluZSBDQlJfMTIwMCAgICAgOQorI2RlZmluZSBDQlJfMTgwMCAgICAgMTAKKyNkZWZpbmUgQ0JSXzI0MDAgICAgIDExCisjZGVmaW5lIENCUl80ODAwICAgICAxMgorI2RlZmluZSBDQlJfOTYwMCAgICAgMTMKKyNkZWZpbmUgQ0JSXzE5MjAwICAgIDE0CisjZGVmaW5lIENCUl8zODQwMCAgICAxNQorI2RlZmluZSBDQlJfMjAwMCAgICAgMTYKKyNkZWZpbmUgQ0JSXzM2MDAgICAgIDE3CisjZGVmaW5lIENCUl83MjAwICAgICAxOAorI2RlZmluZSBDQlJfNTYwMDAgICAgMTkKKyNkZWZpbmUgQ0JSXzU3NjAwICAgIDIwCisjZGVmaW5lIENCUl82NDAwMCAgICAyMQorI2RlZmluZSBDQlJfNzY4MDAgICAgMjIKKyNkZWZpbmUgQ0JSXzExNTIwMCAgIDIzCisjZGVmaW5lIENCUl9DMSAgICAgICAyNCAgICAvLyBDdXN0b20gYmF1ZCByYXRlIDEKKyNkZWZpbmUgQ0JSX0MyICAgICAgIDI1ICAgIC8vIEN1c3RvbSBiYXVkIHJhdGUgMgorI2RlZmluZSBDQlJfMTUzNjAwICAgMjYKKyNkZWZpbmUgQ0JSXzIzMDQwMCAgIDI3CisjZGVmaW5lIENCUl8zMDcyMDAgICAyOAorI2RlZmluZSBDQlJfNDYwODAwICAgMjkKKyNkZWZpbmUgQ0JSXzkyMTYwMCAgIDMwCisKKy8vIFNldCBDaGFyYWN0ZXIgc2l6ZQorLy8KKyNkZWZpbmUgQ01EX1NFVEJJVFMoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDA4KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MDgpKQorCisjZGVmaW5lIENTWl81ICAwCisjZGVmaW5lIENTWl82ICAxCisjZGVmaW5lIENTWl83ICAyCisjZGVmaW5lIENTWl84ICAzCisKKy8vIFNldCBudW1iZXIgb2Ygc3RvcCBiaXRzCisvLworI2RlZmluZSBDTURfU0VUU1RPUChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MDkpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QwOSkpCisKKyNkZWZpbmUgQ1NUXzEgIDAKKyNkZWZpbmUgQ1NUXzE1IDEgIC8vIDEuNSBzdG9wIGJpdHMKKyNkZWZpbmUgQ1NUXzIgIDIKKworLy8gU2V0IHBhcml0eSBvcHRpb24KKy8vCisjZGVmaW5lIENNRF9TRVRQQVIoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDEwKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTApKQorCisjZGVmaW5lIENTUF9OUCAwICAvLyBubyBwYXJpdHkKKyNkZWZpbmUgQ1NQX09EIDEgIC8vIG9kZCBwYXJpdHkKKyNkZWZpbmUgQ1NQX0VWIDIgIC8vIEV2ZW4gcGFyaXR5CisjZGVmaW5lIENTUF9TUCAzICAvLyBTcGFjZSBwYXJpdHkKKyNkZWZpbmUgQ1NQX01LIDQgIC8vIE1hcmsgcGFyaXR5CisKKy8vIERlZmluZSB4b24gY2hhciBmb3IgdHJhbnNtaXR0ZXIgZmxvdyBjb250cm9sCisvLworI2RlZmluZSBDTURfREVGX0lYT04oYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDExKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTEpKQorCisvLyBEZWZpbmUgeG9mZiBjaGFyIGZvciB0cmFuc21pdHRlciBmbG93IGNvbnRyb2wKKy8vCisjZGVmaW5lIENNRF9ERUZfSVhPRkYoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDEyKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTIpKQorCisjZGVmaW5lIENNRF9TVE9QRkwgICAoY21kU3ludGF4UHRyKShjdDEzKSAvLyBTdG9wIEZsdXNoaW5nIGRhdGEKKworLy8gQWNrbm93bGVkZ2UgcmVjZWlwdCBvZiBob3RrZXkgc2lnbmFsCisvLworI2RlZmluZSBDTURfSE9UQUNLICAgKGNtZFN5bnRheFB0cikoY3QxNCkKKworLy8gRGVmaW5lIGlycSBsZXZlbCB0byB1c2UuIFNob3VsZCBhY3R1YWxseSBiZSBzZW50IGJ5IGxpYnJhcnktbGV2ZWwgY29kZSwgbm90CisvLyBkaXJlY3RseSBmcm9tIHVzZXIuLi4KKy8vCisjZGVmaW5lIENNRFZBTFVFX0lSUSAxNSAvLyBGb3IgbGlicmFyeSB1c2UgYXQgaW5pdGlhbGl6YXRpb24uIFVudGlsIHRoaXMgY29tbWFuZAorCQkJCQkJLy8gaXMgc2VudCwgYm9hcmQgcHJvY2Vzc2luZyBkb2Vzbid0IHJlYWxseSBzdGFydC4KKyNkZWZpbmUgQ01EX1NFVF9JUlEoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDE1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTUpKQorCisjZGVmaW5lIENJUl9QT0xMICAwICAvLyBObyBJUlEgLSBQb2xsCisjZGVmaW5lIENJUl8zICAgICAzICAvLyBJUlEgMworI2RlZmluZSBDSVJfNCAgICAgNCAgLy8gSVJRIDQKKyNkZWZpbmUgQ0lSXzUgICAgIDUgIC8vIElSUSA1CisjZGVmaW5lIENJUl83ICAgICA3ICAvLyBJUlEgNworI2RlZmluZSBDSVJfMTAgICAgMTAgLy8gSVJRIDEwCisjZGVmaW5lIENJUl8xMSAgICAxMSAvLyBJUlEgMTEKKyNkZWZpbmUgQ0lSXzEyICAgIDEyIC8vIElSUSAxMgorI2RlZmluZSBDSVJfMTUgICAgMTUgLy8gSVJRIDE1CisKKy8vIFNlbGVjdCB0cmFuc21pdCBmbG93IHhvbi94b2ZmIG9wdGlvbnMKKy8vCisjZGVmaW5lIENNRF9JWE9OX09QVChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MTYpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QxNikpCisKKyNkZWZpbmUgQ0lYX05PTkUgIDAgIC8vIEluY29taW5nIFhvbi9Yb2ZmIGNoYXJhY3RlcnMgbm90IHNwZWNpYWwKKyNkZWZpbmUgQ0lYX1hPTiAgIDEgIC8vIFhvZmYgZGlzYWJsZSwgWG9uIGVuYWJsZQorI2RlZmluZSBDSVhfWEFOWSAgMiAgLy8gWG9mZiBkaXNhYmxlLCBhbnkga2V5IGVuYWJsZQorCisvLyBTZWxlY3QgcmVjZWl2ZSBmbG93IHhvbi94b2ZmIG9wdGlvbnMKKy8vCisjZGVmaW5lIENNRF9PWE9OX09QVChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MTcpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QxNykpCisKKyNkZWZpbmUgQ09YX05PTkUgIDAgIC8vIERvbid0IHNlbmQgWG9uL1hvZmYKKyNkZWZpbmUgQ09YX1hPTiAgIDEgIC8vIFNlbmQgeG9uL3hvZmYgdG8gc3RhcnQvc3RvcCBpbmNvbWluZyBkYXRhCisKKworI2RlZmluZSBDTURfQ1RTX1JFUCAgKGNtZFN5bnRheFB0cikoY3QxOCkgLy8gRW5hYmxlICBDVFMgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9DVFNfTlJFUCAoY21kU3ludGF4UHRyKShjdDE5KSAvLyBEaXNhYmxlIENUUyByZXBvcnRpbmcKKworI2RlZmluZSBDTURfRENEX1JFUCAgKGNtZFN5bnRheFB0cikoY3QyMCkgLy8gRW5hYmxlICBEQ0QgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9EQ0RfTlJFUCAoY21kU3ludGF4UHRyKShjdDIxKSAvLyBEaXNhYmxlIERDRCByZXBvcnRpbmcKKworI2RlZmluZSBDTURfRFNSX1JFUCAgKGNtZFN5bnRheFB0cikoY3QyMikgLy8gRW5hYmxlICBEU1IgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9EU1JfTlJFUCAoY21kU3ludGF4UHRyKShjdDIzKSAvLyBEaXNhYmxlIERTUiByZXBvcnRpbmcKKworI2RlZmluZSBDTURfUklfUkVQICAgKGNtZFN5bnRheFB0cikoY3QyNCkgLy8gRW5hYmxlICBSSSAgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9SSV9OUkVQICAoY21kU3ludGF4UHRyKShjdDI1KSAvLyBEaXNhYmxlIFJJICByZXBvcnRpbmcKKworLy8gRW5hYmxlIGJyZWFrIHJlcG9ydGluZyBhbmQgc2VsZWN0IHN0eWxlCisvLworI2RlZmluZSBDTURfQlJLX1JFUChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MjYpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QyNikpCisKKyNkZWZpbmUgQ0JLX1NUQVQgICAgIDB4MDAgIC8vIFJlcG9ydCBicmVha3MgYXMgYSBzdGF0dXMgKGV4Y2VwdGlvbixpcnEpCisjZGVmaW5lIENCS19OVUxMICAgICAweDAxICAvLyBSZXBvcnQgYnJlYWtzIGFzIGEgZ29vZCBudWxsCisjZGVmaW5lIENCS19TVEFUX1NFUSAweDAyICAvLyBSZXBvcnQgYnJlYWtzIGFzIGEgc3RhdHVzIEFORCBhcyBpbi1iYW5kIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHNlcXVlbmNlIEZGaCwgMDFoLCAxMGgKKyNkZWZpbmUgQ0JLX1NFUSAgICAgIDB4MDMgIC8vIFJlcG9ydCBicmVha3MgYXMgdGhlIGluLWJhbmQgCisJCQkJCQkgICAvL3NlcXVlbmNlIEZGaCwgMDFoLCAxMGggT05MWS4KKyNkZWZpbmUgQ0JLX0ZMU0ggICAgIDB4MDQgIC8vIGlmIHRoaXMgYml0IHNldCBhbHNvIGZsdXNoIGlucHV0IGRhdGEKKyNkZWZpbmUgQ0JLX1BPU0lYICAgIDB4MDggIC8vIGlmIHRoaXMgYml0IHNldCByZXBvcnQgYXMgRkYsMCwwIHNlcXVlbmNlCisjZGVmaW5lIENCS19TSU5HTEUgICAweDEwICAvLyBpZiB0aGlzIGJpdCBzZXQgd2l0aCBDQktfU0VRIG9yIENCS19TVEFUX1NFUQorCQkJCQkJICAgLy90aGVuIHJlcG9ydHMgc2luZ2xlIG51bGwgaW5zdGVhZCBvZiB0cmlwbGUKKworI2RlZmluZSBDTURfQlJLX05SRVAgKGNtZFN5bnRheFB0cikoY3QyNykgLy8gRGlzYWJsZSBicmVhayByZXBvcnRpbmcKKworLy8gU3BlY2lmeSBtYXhpbXVtIGJsb2NrIHNpemUgZm9yIHJlY2VpdmVkIGRhdGEKKy8vCisjZGVmaW5lIENNRF9NQVhfQkxPQ0soYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDI4KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MjgpKQorCisvLyAtLSBDT01NQU5EIDI5IGlzIHJlc2VydmVkIC0tCisKKyNkZWZpbmUgQ01EX0NUU0ZMX0VOQUIgIChjbWRTeW50YXhQdHIpKGN0MzApIC8vIEVuYWJsZSAgQ1RTIGZsb3cgY29udHJvbAorI2RlZmluZSBDTURfQ1RTRkxfRFNBQiAgKGNtZFN5bnRheFB0cikoY3QzMSkgLy8gRGlzYWJsZSBDVFMgZmxvdyBjb250cm9sCisjZGVmaW5lIENNRF9SVFNGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDMyKSAvLyBFbmFibGUgIFJUUyBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX1JUU0ZMX0RTQUIgIChjbWRTeW50YXhQdHIpKGN0MzMpIC8vIERpc2FibGUgUlRTIGZsb3cgY29udHJvbAorCisvLyBTcGVjaWZ5IGlzdHJpcCBvcHRpb24KKy8vCisjZGVmaW5lIENNRF9JU1RSSVBfT1BUKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QzNCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDM0KSkKKworI2RlZmluZSBDSVNfTk9TVFJJUCAgMCAgLy8gU3RyaXAgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgc2l6ZQorI2RlZmluZSBDSVNfU1RSSVAgICAgMSAgLy8gU3RyaXAgYW55IDgtYml0IGNoYXJhY3RlcnMgdG8gNyBiaXRzCisKKy8vIFNlbmQgYSBicmVhayBvZiBhcmcgbWlsbGlzZWNvbmRzCisvLworI2RlZmluZSBDTURfU0VORF9CUksoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDM1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MzUpKQorCisvLyBTZXQgZXJyb3IgcmVwb3J0aW5nIG1vZGUKKy8vCisjZGVmaW5lIENNRF9TRVRfRVJST1IoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDM2KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MzYpKQorCisjZGVmaW5lIENTRV9FU1RBVCAwICAvLyBSZXBvcnQgZXJyb3IgaW4gYSBzdGF0dXMgcGFja2V0CisjZGVmaW5lIENTRV9OT1JFUCAxICAvLyBUcmVhdCBjaGFyYWN0ZXIgYXMgdGhvdWdoIGl0IHdlcmUgZ29vZAorI2RlZmluZSBDU0VfRFJPUCAgMiAgLy8gRGlzY2FyZCB0aGUgY2hhcmFjdGVyCisjZGVmaW5lIENTRV9OVUxMICAzICAvLyBSZXBsYWNlIHdpdGggYSBudWxsCisjZGVmaW5lIENTRV9NQVJLICA0ICAvLyBSZXBsYWNlIHdpdGggYSAzLWNoYXJhY3RlciBzZXF1ZW5jZSAoYXMgVW5peCkKKworI2RlZmluZSAgQ01EX1NFVF9SRVBMQUNFTUVOVChhcmcsY2gpICAgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDM2YSkpLT5jbWRbMV0gPSAoYXJnKSwgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDM2YSkpLT5jbWRbMl0gPSAoY2gpLCAgXAorCQkJKGNtZFN5bnRheFB0cikoY3QzNmEpKQorCisjZGVmaW5lIENTRV9SRVBMQUNFICAweDgJLy8gUmVwbGFjZSB0aGUgZXJyb3JlZCBjaGFyYWN0ZXIgd2l0aCB0aGUKKwkJCQkJCQkvLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIgZGVmaW5lZCBoZXJlCisKKyNkZWZpbmUgQ1NFX1NUQVRfUkVQTEFDRSAgIDB4MTgJLy8gUmVwbGFjZSB0aGUgZXJyb3JlZCBjaGFyYWN0ZXIgd2l0aCB0aGUKKwkJCQkJCQkJLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGRlZmluZWQgaGVyZSBBTkQKKwkJCQkJCQkJLy8gcmVwb3J0IHRoZSBlcnJvciBhcyBhIHN0YXR1cyBwYWNrZXQgKGFzIGluCisJCQkJCQkJCS8vIENTRV9FU1RBVCkuCisKKworLy8gQ09NTUFORCAzNywgdG8gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0cywgaXMgaGFuZGxlZCBvbmx5IGJ5IGxvdy1sZXZlbAorLy8gbGlicmFyeSBjb2RlIGluIHJlc3BvbnNlIHRvIGRhdGEgbW92ZW1lbnQgYW5kIHNob3VsZG4ndCBldmVyIGJlIHNlbnQgYnkgdGhlCisvLyB1c2VyIGNvZGUuIFNlZSBpMnBhY2suaCBhbmQgdGhlIGJvZHkgb2YgaTJsaWIuYyBmb3IgZGV0YWlscy4KKworLy8gRW5hYmxlIG9uLWJvYXJkIHBvc3QtcHJvY2Vzc2luZywgdXNpbmcgb3B0aW9ucyBnaXZlbiBpbiBvZmxhZyBhcmd1bWVudC4KKy8vIEZvcm1lcmx5LCB0aGlzIGNvbW1hbmQgd2FzIGF1dG9tYXRpY2FsbHkgcHJlY2VkZWQgYnkgYSBDTURfT1BPU1RfT0ZGIGNvbW1hbmQKKy8vIGJlY2F1c2UgdGhlIGxvYWR3YXJlIGRvZXMgbm90IHBlcm1pdCBzZW5kaW5nIGJhY2stdG8tYmFjayBDTURfT1BPU1RfT04KKy8vIGNvbW1hbmRzIHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgQ01EX09QT1NUX09GRi4gQlVULCBXRSBMRUFSTiAxOCBNQVkgOTIsIHRoYXQKKy8vIENNRF9PUE9TVF9PTiBhbmQgQ01EX09QT1NUX09GRiBtdXN0IGVhY2ggYmUgYXQgdGhlIGVuZCBvZiBhIHBhY2tldCAob3IgaW4gYQorLy8gc29sbyBwYWNrZXQpLiBUaGlzIG1lYW5zIHRoZSBjYWxsZXIgbXVzdCBzcGVjaWZ5IHNlcGFyYXRlbHkgQ01EX09QT1NUX09GRiwKKy8vIENNRF9PUE9TVF9PTihwYXJtKSB3aGVuIGhlIGNhbGxzIGkyUXVldWVDb21tYW5kcygpLiBUaGF0IGZ1bmN0aW9uIHdpbGwgZW5zdXJlCisvLyBlYWNoIGdldHMgYSBzZXBhcmF0ZSBwYWNrZXQuIEV4dHJhIENNRF9PUE9TVF9PRkYncyBhcmUgYWx3YXlzIG9rLgorLy8KKyNkZWZpbmUgQ01EX09QT1NUX09OKG9mbGFnKSAgIFwKKwkoKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0MzkpKS0+Y21kWzFdKSA9IChvZmxhZyksIFwKKwkJKGNtZFN5bnRheFB0cikoY3QzOSkpCisKKyNkZWZpbmUgQ01EX09QT1NUX09GRiAgIChjbWRTeW50YXhQdHIpKGN0NDApIC8vIERpc2FibGUgb24tYm9hcmQgcG9zdC1wcm9jCisKKyNkZWZpbmUgQ01EX1JFU1VNRSAgIChjbWRTeW50YXhQdHIpKGN0NDEpCS8vIFJlc3VtZTogYmVoYXZlIGFzIHRob3VnaCBhbiBYT04KKwkJCQkJCQkJCQkJLy8gd2VyZSByZWNlaXZlZDsKKworLy8gU2V0IFRyYW5zbWl0IGJhdWQgcmF0ZSAoc2VlIGNvbW1hbmQgNyBmb3IgYXJndW1lbnRzKQorLy8KKyNkZWZpbmUgQ01EX1NFVEJBVURfVFgoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDQyKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NDIpKQorCisvLyBTZXQgUmVjZWl2ZSBiYXVkIHJhdGUgKHNlZSBjb21tYW5kIDcgZm9yIGFyZ3VtZW50cykKKy8vCisjZGVmaW5lIENNRF9TRVRCQVVEX1JYKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q0MykpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDQzKSkKKworLy8gUmVxdWVzdCBpbnRlcnJ1cHQgZnJvbSBib2FyZCBlYWNoIGFyZyBtaWxsaXNlY29uZHMuIEludGVycnVwdCB3aWxsIHNwZWNpZnkKKy8vICJyZWNlaXZlZCBkYXRhIiwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIG5vIGRhdGEgcHJlc2VudC4gSWYgYXJnID09IDAsCisvLyBkaXNhYmxlcyBhbnkgc3VjaCBpbnRlcnJ1cHRzLgorLy8KKyNkZWZpbmUgQ01EX1BJTkdfUkVRKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q0NCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDQ0KSkKKworI2RlZmluZSBDTURfSE9UX0VOQUIgKGNtZFN5bnRheFB0cikoY3Q0NSkgLy8gRW5hYmxlIEhvdC1rZXkgY2hlY2tpbmcKKyNkZWZpbmUgQ01EX0hPVF9EU0FCIChjbWRTeW50YXhQdHIpKGN0NDYpIC8vIERpc2FibGUgSG90LWtleSBjaGVja2luZworCisvLyBDT01NQU5EIDQ3OiBTZW5kIFByb3RvY29sIGluZm8gdmlhIFVuaXggZmxhZ3M6CisvLyBpZmxhZyA9IFVuaXggdHR5IHRfaWZsYWcKKy8vIGNmbGFnID0gVW5peCB0dHkgdF9jZmxhZworLy8gbGZsYWcgPSBVbml4IHR0eSB0X2xmbGFnCisvLyBTZWUgU3lzdGVtIFYgVW5peC9YZW5peCBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWVhbmluZ3Mgb2YgdGhlIGJpdCBmaWVsZHMKKy8vIHdpdGhpbiB0aGVzZSBmbGFncworLy8KKyNkZWZpbmUgQ01EX1VOSVhfRkxBR1MoaWZsYWcsY2ZsYWcsbGZsYWcpIGkyY21kVW5peEZsYWdzKGlmbGFnLGNmbGFnLGxmbGFnKQorCisjZGVmaW5lIENNRF9EU1JGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDQ4KSAvLyBFbmFibGUgIERTUiByZWNlaXZlciBjdHJsCisjZGVmaW5lIENNRF9EU1JGTF9EU0FCICAoY21kU3ludGF4UHRyKShjdDQ5KSAvLyBEaXNhYmxlIERTUiByZWNlaXZlciBjdHJsCisjZGVmaW5lIENNRF9EVFJGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDUwKSAvLyBFbmFibGUgIERUUiBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX0RUUkZMX0RTQUIgIChjbWRTeW50YXhQdHIpKGN0NTEpIC8vIERpc2FibGUgRFRSIGZsb3cgY29udHJvbAorI2RlZmluZSBDTURfQkFVRF9SRVNFVCAgKGNtZFN5bnRheFB0cikoY3Q1MikgLy8gUmVzZXQgYmF1ZHJhdGUgdGFibGUKKworLy8gQ09NTUFORCA1NDogRGVmaW5lIGN1c3RvbSByYXRlICMxCisvLyByYXRlID0gKHNob3J0KSAxLzEwIG9mIHRoZSBkZXNpcmVkIGJhdWQgcmF0ZQorLy8KKyNkZWZpbmUgQ01EX0JBVURfREVGMShyYXRlKSBpMmNtZEJhdWREZWYoMSxyYXRlKQorCisvLyBDT01NQU5EIDU1OiBEZWZpbmUgY3VzdG9tIHJhdGUgIzIKKy8vIHJhdGUgPSAoc2hvcnQpIDEvMTAgb2YgdGhlIGRlc2lyZWQgYmF1ZCByYXRlCisvLworI2RlZmluZSBDTURfQkFVRF9ERUYyKHJhdGUpIGkyY21kQmF1ZERlZigyLHJhdGUpCisKKy8vIFBhdXNlIGFyZyBodW5kcmVkdGhzIG9mIHNlY29uZHMuIChOb3RlLCB0aGlzIGlzIE5PVCBtaWxsaXNlY29uZHMuKQorLy8KKyNkZWZpbmUgQ01EX1BBVVNFKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q1NikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDU2KSkKKworI2RlZmluZSBDTURfU1VTUEVORCAgICAgKGNtZFN5bnRheFB0cikoY3Q1NykgLy8gU3VzcGVuZCBvdXRwdXQKKyNkZWZpbmUgQ01EX1VOU1VTUEVORCAgIChjbWRTeW50YXhQdHIpKGN0NTgpIC8vIFVuLVN1c3BlbmQgb3V0cHV0CisKKy8vIFNldCBwYXJpdHktY2hlY2tpbmcgb3B0aW9ucworLy8KKyNkZWZpbmUgQ01EX1BBUkNISyhhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NTkpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q1OSkpCisKKyNkZWZpbmUgQ1BLX0VOQUIgIDAgICAgIC8vIEVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgb24gaW5wdXQKKyNkZWZpbmUgQ1BLX0RTQUIgIDEgICAgIC8vIERpc2FibGUgcGFyaXR5IGNoZWNraW5nIG9uIGlucHV0CisKKyNkZWZpbmUgQ01EX0JNQVJLX1JFUSAgIChjbWRTeW50YXhQdHIpKGN0NjApIC8vIEJvb2ttYXJrIHJlcXVlc3QKKworCisvLyBFbmFibGUvRGlzYWJsZSBpbnRlcm5hbCBsb29wYmFjayBtb2RlCisvLworI2RlZmluZSBDTURfSU5MT09QKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2MSkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDYxKSkKKworI2RlZmluZSBDSU5fRElTQUJMRSAgMCAgLy8gTm9ybWFsIG9wZXJhdGlvbiAoZGVmYXVsdCkKKyNkZWZpbmUgQ0lOX0VOQUJMRSAgIDEgIC8vIEludGVybmFsIChsb2NhbCkgbG9vcGJhY2sKKyNkZWZpbmUgQ0lOX1JFTU9URSAgIDIgIC8vIFJlbW90ZSBsb29wYmFjaworCisvLyBTcGVjaWZ5IHRpbWVvdXQgZm9yIGhvdGtleXM6IERlbGF5IHdpbGwgYmUgKGFyZyB4IDEwKSBtaWxsaXNlY29uZHMsIGFyZyA9PSAwCisvLyAtLT4gbm8gdGltZW91dDogd2FpdCBmb3JldmVyLgorLy8KKyNkZWZpbmUgQ01EX0hPVF9USU1FKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2MikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDYyKSkKKworCisvLyBEZWZpbmUgKG91dGdvaW5nKSB4b24gZm9yIHJlY2VpdmUgZmxvdyBjb250cm9sCisvLworI2RlZmluZSBDTURfREVGX09YT04oYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDYzKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NjMpKQorCisvLyBEZWZpbmUgKG91dGdvaW5nKSB4b2ZmIGZvciByZWNlaXZlciBmbG93IGNvbnRyb2wKKy8vCisjZGVmaW5lIENNRF9ERUZfT1hPRkYoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDY0KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NjQpKQorCisvLyBFbmFibGUvRGlzYWJsZSBSVFMgb24gdHJhbnNtaXQgKDEvMiBkdXBsZXgtc3R5bGUpCisvLworI2RlZmluZSBDTURfUlRTX1hNSVQoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDY1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NjUpKQorCisjZGVmaW5lIENIRF9ESVNBQkxFICAwCisjZGVmaW5lIENIRF9FTkFCTEUgICAxCisKKy8vIFNldCBoaWdoLXdhdGVyLW1hcmsgbGV2ZWwgKGRlYnVnZ2luZyB1c2Ugb25seSkKKy8vCisjZGVmaW5lIENNRF9TRVRISUdIV0FUKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2NikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDY2KSkKKworLy8gU3RhcnQgZmx1c2hpbmcgdGFnZ2VkIGRhdGEgKHRhZyA9IDAtMTQpCisvLworI2RlZmluZSBDTURfU1RBUlRfU0VMRkwodGFnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDY3KSktPmNtZFsxXSA9ICh0YWcpLChjbWRTeW50YXhQdHIpKGN0NjcpKQorCisvLyBFbmQgZmx1c2hpbmcgdGFnZ2VkIGRhdGEgKHRhZyA9IDAtMTQpCisvLworI2RlZmluZSBDTURfRU5EX1NFTEZMKHRhZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2OCkpLT5jbWRbMV0gPSAodGFnKSwoY21kU3ludGF4UHRyKShjdDY4KSkKKworI2RlZmluZSBDTURfSFdGTE9XX09GRiAgKGNtZFN5bnRheFB0cikoY3Q2OSkgLy8gRGlzYWJsZSBIVyBUWCBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX09EU1JGTF9FTkFCIChjbWRTeW50YXhQdHIpKGN0NzApIC8vIEVuYWJsZSBEU1Igb3V0cHV0IGYvYworI2RlZmluZSBDTURfT0RTUkZMX0RTQUIgKGNtZFN5bnRheFB0cikoY3Q3MSkgLy8gRGlzYWJsZSBEU1Igb3V0cHV0IGYvYworI2RlZmluZSBDTURfT0RDREZMX0VOQUIgKGNtZFN5bnRheFB0cikoY3Q3MikgLy8gRW5hYmxlIERDRCBvdXRwdXQgZi9jCisjZGVmaW5lIENNRF9PRENERkxfRFNBQiAoY21kU3ludGF4UHRyKShjdDczKSAvLyBEaXNhYmxlIERDRCBvdXRwdXQgZi9jCisKKy8vIFNldCB0cmFuc21pdCBpbnRlcnJ1cHQgbG9hZCBsZXZlbC4gQ291bnQgc2hvdWxkIGJlIGFuIGV2ZW4gdmFsdWUgMi0xMgorLy8KKyNkZWZpbmUgQ01EX0xPQURMRVZFTChjb3VudCkgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q3NCkpLT5jbWRbMV0gPSAoY291bnQpLChjbWRTeW50YXhQdHIpKGN0NzQpKQorCisvLyBJZiByZXBvcnRpbmcgRFNTIGNoYW5nZXMsIG1hcCB0byBjaGFyYWN0ZXIgc2VxdWVuY2UgRkZoLCAyLCBNU1IKKy8vCisjZGVmaW5lIENNRF9TVEFUREFUQShhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NzUpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q3NSkpCisKKyNkZWZpbmUgQ1NURF9ESVNBQkxFLy8gUmVwb3J0IERTUyBjaGFuZ2VzIGFzIHN0YXR1cyBwYWNrZXRzIG9ubHkgKGRlZmF1bHQpCisjZGVmaW5lIENTVERfRU5BQkxFCS8vIFJlcG9ydCBEU1MgY2hhbmdlcyBhcyBpbi1iYW5kIGRhdGEgc2VxdWVuY2UgYXMgd2VsbCBhcworCQkJCQkvLyBieSBzdGF0dXMgcGFja2V0LgorCisjZGVmaW5lIENNRF9CUkVBS19PTiAgICAoY21kU3ludGF4UHRyKShjdDc2KS8vIFNldCBicmVhayBhbmQgc3RvcCB4bWl0CisjZGVmaW5lIENNRF9CUkVBS19PRkYgICAoY21kU3ludGF4UHRyKShjdDc3KS8vIEVuZCBicmVhayBhbmQgcmVzdGFydCB4bWl0CisjZGVmaW5lIENNRF9HRVRGQyAgICAgICAoY21kU3ludGF4UHRyKShjdDc4KS8vIFJlcXVlc3QgZm9yIGZsb3cgY29udHJvbCBwYWNrZXQKKwkJCQkJCQkJCQkJLy8gZnJvbSBib2FyZC4KKworLy8gVHJhbnNtaXQgdGhpcyBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkKKy8vCisjZGVmaW5lIENNRF9YTUlUX05PVyhjaCkgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q3OSkpLT5jbWRbMV0gPSAoY2gpLChjbWRTeW50YXhQdHIpKGN0NzkpKQorCisvLyBTZXQgYmF1ZCByYXRlIHZpYSAiZGl2aXNvciBsYXRjaCIKKy8vCisjZGVmaW5lIENNRF9ESVZJU09SX0xBVENIKHdoaWNoLHZhbHVlKSBcCisJCQkoKChjbWRTeW50YXhQdHIpKGN0ODApKS0+Y21kWzFdID0gKHdoaWNoKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODApKS0+Y21kWzJdKSA9ICh2YWx1ZSksIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0ODApKQorCisjZGVmaW5lIENETF9SWCAxCS8vIFNldCByZWNlaXZlciByYXRlCisjZGVmaW5lIENETF9UWCAyCS8vIFNldCB0cmFuc21pdCByYXRlCisJCQkJCS8vIChDRExfVFggfCBDRExfUlgpIFNldCBib3RoIHJhdGVzCisKKy8vIFJlcXVlc3QgZm9yIHNwZWNpYWwgZGlhZ25vc3RpYyBzdGF0dXMgcGt0IGZyb20gdGhlIGJvYXJkLgorLy8KKyNkZWZpbmUgQ01EX0dFVF9TVEFUVVMgKGNtZFN5bnRheFB0cikoY3Q4MSkKKworLy8gUmVxdWVzdCB0aW1lLXN0YW1wZWQgdHJhbnNtaXQgY2hhcmFjdGVyIGNvdW50IHBhY2tldC4KKy8vCisjZGVmaW5lIENNRF9HRVRfVFhDTlQgIChjbWRTeW50YXhQdHIpKGN0ODIpCisKKy8vIFJlcXVlc3QgdGltZS1zdGFtcGVkIHJlY2VpdmUgY2hhcmFjdGVyIGNvdW50IHBhY2tldC4KKy8vCisjZGVmaW5lIENNRF9HRVRfUlhDTlQgIChjbWRTeW50YXhQdHIpKGN0ODMpCisKKy8vIFJlcXVlc3QgZm9yIGJveC9ib2FyZCBJLkQuIHBhY2tldC4KKyNkZWZpbmUgQ01EX0dFVF9CT1hJRFMgKGNtZFN5bnRheFB0cikoY3Q4NCkKKworLy8gRW5hYmxlIG9yIGRpc2FibGUgbXVsdGlwbGUgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIGJpdC1tYXBwZWQgdXNob3J0cyBib3ggMS00CisvLworI2RlZmluZSBDTURfRU5BQl9NVUxUKGVuYWJsZSwgYm94MSwgYm94MiwgYm94MywgYm94NCkgICAgXAorCQkJKCgoY21kU3l0YXhQdHIpKGN0ODUpKS0+Y21kWzFdID0gKGVuYWJsZSksICAgICAgICAgICAgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzJdKSA9IChib3gxKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzRdKSA9IChib3gyKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzZdKSA9IChib3gzKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzhdKSA9IChib3g0KSwgXAorCQkJKGNtZFN5bnRheFB0cikoY3Q4NSkpCisKKyNkZWZpbmUgQ0VNX0RJU0FCTEUgIDAKKyNkZWZpbmUgQ0VNX0VOQUJMRSAgIDEKKworLy8gRW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZXIgb3IgcmVjZWl2ZXIgaW50ZXJydXB0cyAoZGVmYXVsdCBib3RoIGVuYWJsZWQpCisvLworI2RlZmluZSBDTURfUkNWX0VOQUJMRShjaCkgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q4NikpLT5jbWRbMV0gPSAoY2gpLChjbWRTeW50YXhQdHIpKGN0ODYpKQorCisjZGVmaW5lIENSRV9PRkYgICAgICAwICAvLyBEaXNhYmxlIHRoZSByZWNlaXZlcgorI2RlZmluZSBDUkVfT04gICAgICAgMSAgLy8gRW5hYmxlIHRoZSByZWNlaXZlcgorI2RlZmluZSBDUkVfSU5UT0ZGICAgMiAgLy8gRGlzYWJsZSByZWNlaXZlciBpbnRlcnJ1cHRzICh0byBsb2Fkd2FyZSkKKyNkZWZpbmUgQ1JFX0lOVE9OICAgIDMgIC8vIEVuYWJsZSByZWNlaXZlciBpbnRlcnJ1cHRzICh0byBsb2Fkd2FyZSkKKworLy8gU3RhcnRzIHVwIGEgaGFyZHdhcmUgdGVzdCBwcm9jZXNzLCB3aGljaCBydW5zIHRyYW5zcGFyZW50bHksIGFuZCBzZW5kcyBhCisvLyBTVEFUX0hXRkFJTCBwYWNrZXQgaW4gY2FzZSBhIGhhcmR3YXJlIGZhaWx1cmUgaXMgZGV0ZWN0ZWQuCisvLworI2RlZmluZSBDTURfSFdfVEVTVCAgKGNtZFN5bnRheFB0cikoY3Q4NykKKworLy8gQ2hhbmdlIHJlY2VpdmVyIHRocmVzaG9sZCBhbmQgdGltZW91dCB2YWx1ZToKKy8vIERlZmF1bHRzOiB0aW1lb3V0ID0gMjBtUworLy8gdGhyZXNob2xkIGNvdW50ID0gOCB3aGVuIERUUmZsb3cgbm90IGluIHVzZSwKKy8vIHRocmVzaG9sZCBjb3VudCA9IDUgd2hlbiBEVFJmbG93IGluIHVzZS4KKy8vCisjZGVmaW5lIENNRF9SQ1ZfVEhSRVNIT0xEKGNvdW50LG1zKSBcCisJCQkoKChjbWRTeW50YXhQdHIpKGN0ODgpKS0+Y21kWzFdID0gKGNvdW50KSwgXAorCQkJKChjbWRTeW50YXhQdHIpKGN0ODgpKS0+Y21kWzJdID0gKG1zKSwgXAorCQkJKGNtZFN5bnRheFB0cikoY3Q4OCkpCisKKy8vIE1ha2VzIHRoZSBsb2Fkd2FyZSByZXBvcnQgRFNTIHNpZ25hbHMgZm9yIHRoaXMgY2hhbm5lbCBpbW1lZGlhdGVseS4KKy8vCisjZGVmaW5lIENNRF9EU1NfTk9XIChjbWRTeW50YXhQdHIpKGN0ODkpCisJCisvLyBTZXQgdGhlIHJlY2VpdmUgc2lsbyBwYXJhbWV0ZXJzIAorLy8gCXRpbWVvdXQgaXMgbXMgaWRsZSB3YWl0IHVudGlsIGRlbGl2ZXJ5ICAgICAgICh+VlRJTUUpCisvLyAJdGhyZXNob2xkIGlzIG1heCBjaGFyYWN0ZXJzIGNhdXNlIGludGVycnVwdCAgKH5WTUlOKQorLy8KKyNkZWZpbmUgQ01EX1NFVF9TSUxPKHRpbWVvdXQsdGhyZXNob2xkKSBcCisJCQkoKChjbWRTeW50YXhQdHIpKGN0OTApKS0+Y21kWzFdID0gKHRpbWVvdXQpLCBcCisJCQkoKGNtZFN5bnRheFB0cikoY3Q5MCkpLT5jbWRbMl0gID0gKHRocmVzaG9sZCksIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0OTApKQorCisvLyBTZXQgdGltZWQgYnJlYWsgaW4gZGVjaXNlY29uZCAoMS8xMHMpCisvLworI2RlZmluZSBDTURfTEJSRUFLKGRzKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDkxKSktPmNtZFsxXSA9IChkcyksKGNtZFN5bnRheFB0cikoY3Q2NikpCisKKworCisjZW5kaWYgLy8gSTJDTURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM0ZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKQEAgLTAsMCArMSwxNDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogTG93LWxldmVsIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGV2aWNlIGRyaXZlcgorKiAgICAgICAgICAgICAgICAoVGhpcyBpcyBpbmNsdWRlZCBzb3VyY2UgY29kZSwgbm90IGEgc2VwYXJhdGUgY29tcGlsYXRpb24KKyogICAgICAgICAgICAgICAgbW9kdWxlLikKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbnMgY2FsbGVkIG9ubHkgaW5kaXJlY3RseSB0aHJvdWdoIGkyZUJvcmRTdHIgZW50cmllcy4KKworc3RhdGljIGludCBpaVdyaXRlQnVmMTYoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBpaVdyaXRlQnVmOChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGlpUmVhZEJ1ZjE2KGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgaWlSZWFkQnVmOChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpaVJlYWRXb3JkMTYoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWlSZWFkV29yZDgoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBpaVdyaXRlV29yZDE2KGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyB2b2lkIGlpV3JpdGVXb3JkOChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBzaG9ydCk7CisKK3N0YXRpYyBpbnQgaWlXYWl0Rm9yVHhFbXB0eUlJKGkyZUJvcmRTdHJQdHIsIGludCk7CitzdGF0aWMgaW50IGlpV2FpdEZvclR4RW1wdHlJSUVYKGkyZUJvcmRTdHJQdHIsIGludCk7CitzdGF0aWMgaW50IGlpVHhNYWlsRW1wdHlJSShpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyBpbnQgaWlUeE1haWxFbXB0eUlJRVgoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGlpVHJ5U2VuZE1haWxJSShpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgaWlUcnlTZW5kTWFpbElJRVgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpaUdldE1haWxJSShpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpaUdldE1haWxJSUVYKGkyZUJvcmRTdHJQdHIpOworCitzdGF0aWMgdm9pZCBpaUVuYWJsZU1haWxJcnFJSShpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGlpRW5hYmxlTWFpbElycUlJRVgoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBpaVdyaXRlTWFza0lJKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIHZvaWQgaWlXcml0ZU1hc2tJSUVYKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOworCitzdGF0aWMgdm9pZCBpaTJEZWxheVRpbWVyKHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBpaTJEZWxheVdha2V1cCh1bnNpZ25lZCBsb25nIGlkKTsKK3N0YXRpYyB2b2lkIGlpMk5vcCh2b2lkKTsKKworLy8qKioqKioqKioqKioqKioKKy8vKiBTdGF0aWMgRGF0YSAqCisvLyoqKioqKioqKioqKioqKgorCitzdGF0aWMgaW50IGlpMlNhZmU7ICAgICAgICAgLy8gU2FmZSBJL08gYWRkcmVzcyBmb3IgZGVsYXkgcm91dGluZQorCitzdGF0aWMgaW50IGlpRGVsYXllZDsJLy8gU2V0IHdoZW4gdGhlIGlpUmVzZXREZWxheSBmdW5jdGlvbiBpcworCQkJCQkJCS8vIGNhbGxlZC4gQ2xlYXJlZCB3aGVuIEFOWSBib2FyZCBpcyByZXNldC4KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCAqIHBEZWxheVRpbWVyOyAgIC8vIFVzZWQgYnkgaWlEZWxheVRpbWVyCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcERlbGF5V2FpdDsgICAgLy8gVXNlZCBieSBpaURlbGF5VGltZXIKK3N0YXRpYyByd2xvY2tfdCBEbF9zcGlubG9jazsKKworLy8qKioqKioqKgorLy8qIENvZGUgKgorLy8qKioqKioqKgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEluaXRpYWxpemF0aW9uIFJvdXRpbmVzCisvLworLy8gaWlTZXRBZGRyZXNzCisvLyBpaVJlc2V0CisvLyBpaVJlc2V0RGVsYXkKKy8vIGlpSW5pdGlhbGl6ZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUVsbGlzSW5pdCgpCisvLyBQYXJhbWV0ZXJzOiBOb25lCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlFbGxpc0luaXQodm9pZCkKK3sKKwlwRGVsYXlUaW1lciA9IGttYWxsb2MgKCBzaXplb2YgKHN0cnVjdCB0aW1lcl9saXN0KSwgR0ZQX0tFUk5FTCApOworCWluaXRfdGltZXIocERlbGF5VGltZXIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBEZWxheVdhaXQpOworCUxPQ0tfSU5JVCgmRGxfc3BpbmxvY2spOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlFbGxpc0NsZWFudXAoKQorLy8gUGFyYW1ldGVyczogTm9uZQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IHJlcXVpcmVkIGNsZWFudXAgb2YgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlFbGxpc0NsZWFudXAodm9pZCkKK3sKKwlpZiAoIHBEZWxheVRpbWVyICE9IE5VTEwgKSB7CisJCWtmcmVlICggcERlbGF5VGltZXIgKTsKKwl9Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVNldEFkZHJlc3MocEIsIGFkZHJlc3MsIGRlbGF5KQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIHRoZSBwdXJwb3J0ZWQgSS9PIGFkZHJlc3Mgb2YgdGhlIGJvYXJkCisvLyAgICAgICAgICAgICBkZWxheSAgIC0gcG9pbnRlciB0byB0aGUgMS1tcyBkZWxheSBmdW5jdGlvbiB0byB1c2UKKy8vICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGFuZCBhbnkgZnV0dXJlIG9wZXJhdGlvbnMgdG8gdGhpcyBib2FyZAorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIChyb3VnaGx5KSBjaGVja3MgZm9yIGFkZHJlc3MgdmFsaWRpdHksIHNldHMgdGhlIGkyZVZhbGlkIE9LIGFuZAorLy8gc2V0cyB0aGUgc3RhdGUgdG8gSUlfU1RBVEVfQ09MRCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmVuJ3QgZXZlbiBzZW50IGEgcmVzZXQKKy8vIHlldC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlTZXRBZGRyZXNzKCBpMmVCb3JkU3RyUHRyIHBCLCBpbnQgYWRkcmVzcywgZGVsYXlGdW5jX3QgZGVsYXkgKQoreworCS8vIFNob3VsZCBhbnkgZmFpbHVyZSBvY2N1ciBiZWZvcmUgaW5pdCBpcyBmaW5pc2hlZC4uLgorCXBCLT5pMmVWYWxpZCA9IEkyRV9JTkNPTVBMRVRFOworCisJLy8gQ2Fubm90IGNoZWNrIHVwcGVyIGxpbWl0IGV4Y2VwdCBleHRyZW1lbHk6IE1pZ2h0IGJlIG1pY3JvY2hhbm5lbAorCS8vIEFkZHJlc3MgbXVzdCBiZSBvbiBhbiA4LWJ5dGUgYm91bmRhcnkKKworCWlmICgodW5zaWduZWQgaW50KWFkZHJlc3MgPD0gMHgxMDAKKwkJfHwgKHVuc2lnbmVkIGludClhZGRyZXNzID49IDB4ZmZmOAorCQl8fCAoYWRkcmVzcyAmIDB4NykKKwkJKQorCXsKKwkJQ09NUExFVEUocEIsSTJFRV9CQURBRERSKTsKKwl9CisKKwkvLyBJbml0aWFsaXplIGFjY2VsZXJhdG9ycworCXBCLT5pMmVCYXNlICAgID0gYWRkcmVzczsKKwlwQi0+aTJlRGF0YSAgICA9IGFkZHJlc3MgKyBGSUZPX0RBVEE7CisJcEItPmkyZVN0YXR1cyAgPSBhZGRyZXNzICsgRklGT19TVEFUVVM7CisJcEItPmkyZVBvaW50ZXIgPSBhZGRyZXNzICsgRklGT19QVFI7CisJcEItPmkyZVhNYWlsICAgPSBhZGRyZXNzICsgRklGT19NQUlMOworCXBCLT5pMmVYTWFzayAgID0gYWRkcmVzcyArIEZJRk9fTUFTSzsKKworCS8vIEluaXRpYWxpemUgaS9vIGFkZHJlc3MgZm9yIGlpMkRlbGF5SU8KKwlpaTJTYWZlID0gYWRkcmVzcyArIEZJRk9fTk9QOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgZGVsYXkgcm91dGluZQorCXBCLT5pMmVEZWxheSA9ICgoZGVsYXkgIT0gKGRlbGF5RnVuY190KU5VTEwpID8gZGVsYXkgOiAoZGVsYXlGdW5jX3QpaWkyTm9wKTsKKworCXBCLT5pMmVWYWxpZCA9IEkyRV9NQUdJQzsKKwlwQi0+aTJlU3RhdGUgPSBJSV9TVEFURV9DT0xEOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlc2V0KHBCKQorLy8gUGFyYW1ldGVyczogcEIgLSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEF0dGVtcHRzIHRvIHJlc2V0IHRoZSBib2FyZCAoc2VlIGFsc28gaTJody5oKS4gTm9ybWFsbHksIHdlIHdvdWxkIHVzZSB0aGlzIHRvCisvLyByZXNldCBhIGJvYXJkIGltbWVkaWF0ZWx5IGFmdGVyIGlpU2V0QWRkcmVzcygpLCBidXQgaXQgaXMgdmFsaWQgdG8gcmVzZXQgYQorLy8gYm9hcmQgZnJvbSBhbnkgc3RhdGUsIHNheSwgaW4gb3JkZXIgdG8gY2hhbmdlIG9yIHJlLWxvYWQgbG9hZHdhcmUuIChVbmRlcgorLy8gc3VjaCBjaXJjdW1zdGFuY2VzLCBubyByZWFzb24gdG8gcmUtcnVuIGlpU2V0QWRkcmVzcygpLCB3aGljaCBpcyB3aHkgaXQgaXMgYQorLy8gc2VwYXJhdGUgcm91dGluZSBhbmQgbm90IGluY2x1ZGVkIGluIHRoaXMgcm91dGluZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlSZXNldChpMmVCb3JkU3RyUHRyIHBCKQoreworCS8vIE1hZ2ljIG51bWJlciBzaG91bGQgYmUgc2V0LCBlbHNlIGV2ZW4gdGhlIGFkZHJlc3MgaXMgc3VzcGVjdAorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCXsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFETUFHSUMpOworCX0KKworCU9VVEIocEItPmkyZUJhc2UgKyBGSUZPX1JFU0VULCAwKTsgIC8vIEFueSBkYXRhIHdpbGwgZG8KKwlpaURlbGF5KHBCLCA1MCk7ICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBiZXR3ZWVuIHJlc2V0cworCU9VVEIocEItPmkyZUJhc2UgKyBGSUZPX1JFU0VULCAwKTsgIC8vIFNlY29uZCByZXNldAorCisJLy8gV2UgbXVzdCB3YWl0IGJlZm9yZSBldmVuIGF0dGVtcHRpbmcgdG8gcmVhZCBhbnl0aGluZyBmcm9tIHRoZSBGSUZPOiB0aGUKKwkvLyBib2FyZCdzIFAuTy5TLlQgbWF5IGFjdHVhbGx5IGF0dGVtcHQgdG8gcmVhZCBhbmQgd3JpdGUgaXRzIGVuZCBvZiB0aGUKKwkvLyBGSUZPIGluIG9yZGVyIHRvIGNoZWNrIGZsYWdzLCBsb29wIGJhY2sgKHdoZXJlIHN1cHBvcnRlZCksIGV0Yy4gT24KKwkvLyBjb21wbGV0aW9uIG9mIHRoaXMgdGVzdGluZyBpdCB3b3VsZCByZXNldCB0aGUgRklGTywgYW5kIG9uIGNvbXBsZXRpb24KKwkvLyBvZiBhbGwgLy8gUC5PLlMuVC4sIHdyaXRlIHRoZSBtZXNzYWdlLiBXZSBtdXN0IG5vdCBtaXN0YWtlIGRhdGEgd2hpY2gKKwkvLyBtaWdodCBoYXZlIGJlZW4gc2VudCBmb3IgdGVzdGluZyBhcyBwYXJ0IG9mIHRoZSByZXNldCBtZXNzYWdlLiBUbworCS8vIGJldHRlciB1dGlsaXplIHRpbWUsIHNheSwgd2hlbiByZXNldHRpbmcgc2V2ZXJhbCBib2FyZHMsIHdlIGFsbG93IHRoZQorCS8vIGRlbGF5IHRvIGJlIHBlcmZvcm1lZCBleHRlcm5hbGx5OyBpbiB0aGlzIHdheSB0aGUgY2FsbGVyIGNhbiByZXNldCAKKwkvLyBzZXZlcmFsIGJvYXJkcywgZGVsYXkgYSBzaW5nbGUgdGltZSwgdGhlbiBjYWxsIHRoZSBpbml0aWFsaXphdGlvbgorCS8vIHJvdXRpbmUgZm9yIGFsbC4KKworCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX1JFU0VUOworCisJaWlEZWxheWVkID0gMDsJLy8gaS5lLiwgdGhlIGRlbGF5IHJvdXRpbmUgaGFzbid0IGJlZW4gY2FsbGVkIHNpbmNlIHRoZSBtb3N0CisJCQkJCS8vIHJlY2VudCByZXNldC4KKworCS8vIEVuc3VyZSBhbnl0aGluZyB3aGljaCB3b3VsZCBoYXZlIGJlZW4gb2YgdXNlIHRvIHN0YW5kYXJkIGxvYWR3YXJlIGlzCisJLy8gYmxhbmtlZCBvdXQsIHNpbmNlIGJvYXJkIGhhcyBub3cgZm9yZ290dGVuIGV2ZXJ5dGhpbmchLgorCisJcEItPmkyZVVzaW5nSXJxID0gSVJRX1VOREVGSU5FRDsgLy8gTm90IHNldCB1cCB0byB1c2UgYW4gaW50ZXJydXB0IHlldAorCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvID0gMDsKKwlwQi0+aTJlT3V0TWFpbFdhaXRpbmcgPSAwOworCXBCLT5pMmVDaGFubmVsUHRyID0gTlVMTDsKKwlwQi0+aTJlQ2hhbm5lbENudCA9IDA7CisKKwlwQi0+aTJlTGVhZG9mZldvcmRbMF0gPSAwOworCXBCLT5pMmVGaWZvSW5JbnRzID0gMDsKKwlwQi0+aTJlRmlmb091dEludHMgPSAwOworCXBCLT5pMmVGYXRhbFRyYXAgPSBOVUxMOworCXBCLT5pMmVGYXRhbCA9IDA7CisKKwlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpUmVzZXREZWxheShwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBVc2luZyB0aGUgZGVsYXkgZGVmaW5lZCBpbiBib2FyZCBzdHJ1Y3R1cmUsIHdhaXRzIHR3byBzZWNvbmRzIChmb3IgYm9hcmQgdG8KKy8vIHJlc2V0KS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlSZXNldERlbGF5KGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaWYgKHBCLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMpIHsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFETUFHSUMpOworCX0KKwlpZiAocEItPmkyZVN0YXRlICE9IElJX1NUQVRFX1JFU0VUKSB7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRFNUQVRFKTsKKwl9CisJaWlEZWxheShwQiwyMDAwKTsgICAgICAgLyogTm93IHdlIHdhaXQgZm9yIHR3byBzZWNvbmRzLiAqLworCWlpRGVsYXllZCA9IDE7ICAgICAgICAgIC8qIERlbGF5IGhhcyBiZWVuIGNhbGxlZDogb2sgdG8gaW5pdGlhbGl6ZSAqLworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlJbml0aWFsaXplKHBCKQorLy8gUGFyYW1ldGVyczogcEIgLSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEF0dGVtcHRzIHRvIHJlYWQgdGhlIFBvd2VyLW9uIHJlc2V0IG1lc3NhZ2UuIEluaXRpYWxpemVzIGFueSByZW1haW5pbmcgZmllbGRzCisvLyBpbiB0aGUgcEIgc3RydWN0dXJlLgorLy8KKy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyB0aGUgdGhpcmQgc3RlcCBvZiBhIHByb2Nlc3MgYmVnaW5uaW5nIHdpdGgKKy8vIGlpUmVzZXQoKSwgdGhlbiBpaVJlc2V0RGVsYXkoKS4gVGhpcyByb3V0aW5lIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgc3RydWN0dXJlCisvLyBpcyAidmFsaWQiIGFuZCBpbiB0aGUgcmVzZXQgc3RhdGUsIGFsc28gY29uZmlybXMgdGhhdCB0aGUgZGVsYXkgcm91dGluZSBoYXMKKy8vIGJlZW4gY2FsbGVkIHNpbmNlIHRoZSBsYXRlc3QgcmVzZXQgKHRvIGFueSBib2FyZCEgb3Zlcmx5IHN0cm9uZyEpLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaUluaXRpYWxpemUoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpbnQgaXRlbXA7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIHNob3J0IHV0ZW1wOworCXVuc2lnbmVkIGludCBpbGltaXQ7CisKKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwl7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRE1BR0lDKTsKKwl9CisKKwlpZiAocEItPmkyZVN0YXRlICE9IElJX1NUQVRFX1JFU0VUIHx8ICFpaURlbGF5ZWQpCisJeworCQlDT01QTEVURShwQiwgSTJFRV9CQURTVEFURSk7CisJfQorCisJLy8gSW4gY2FzZSB0aGVyZSBpcyBhIGZhaWx1cmUgc2hvcnQgb2Ygb3VyIGNvbXBsZXRlbHkgcmVhZGluZyB0aGUgcG93ZXItdXAKKwkvLyBtZXNzYWdlLgorCXBCLT5pMmVWYWxpZCA9IEkyRV9JTkNPTVBMRVRFOworCisKKwkvLyBOb3cgYXR0ZW1wdCB0byByZWFkIHRoZSBtZXNzYWdlLgorCisJZm9yIChpdGVtcCA9IDA7IGl0ZW1wIDwgc2l6ZW9mKHBvclN0cik7IGl0ZW1wKyspCisJeworCQkvLyBXZSBleHBlY3QgdGhlIGVudGlyZSBtZXNzYWdlIGlzIHJlYWR5LgorCQlpZiAoSEFTX05PX0lOUFVUKHBCKSkKKwkJeworCQkJcEItPmkyZVBvbVNpemUgPSBpdGVtcDsKKwkJCUNPTVBMRVRFKHBCLCBJMkVFX1BPUk1fU0hPUlQpOworCQl9CisKKwkJcEItPmkyZVBvbS5jW2l0ZW1wXSA9IGMgPSBCWVRFX0ZST00ocEIpOworCisJCS8vIFdlIGNoZWNrIHRoZSBtYWdpYyBudW1iZXJzIGFzIHNvb24gYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgcmVhZAorCQkvLyAocmF0aGVyIHRoYW4gYWZ0ZXIpIHRvIG1pbmltaXplIGVmZmVjdCBvZiByZWFkaW5nIHNvbWV0aGluZyB3ZQorCQkvLyBhbHJlYWR5IHN1c3BlY3QgY2FuJ3QgYmUgInVzIi4KKwkJaWYgKCAgKGl0ZW1wID09IFBPUl8xX0lOREVYICYmIGMgIT0gUE9SX01BR0lDXzEpIHx8CisJCQkJKGl0ZW1wID09IFBPUl8yX0lOREVYICYmIGMgIT0gUE9SX01BR0lDXzIpKQorCQl7CisJCQlwQi0+aTJlUG9tU2l6ZSA9IGl0ZW1wKzE7CisJCQlDT01QTEVURShwQiwgSTJFRV9CQURNQUdJQyk7CisJCX0KKwl9CisKKwlwQi0+aTJlUG9tU2l6ZSA9IGl0ZW1wOworCisJLy8gRW5zdXJlIHRoYXQgdGhpcyB3YXMgYWxsIHRoZSBkYXRhLi4uCisJaWYgKEhBU19JTlBVVChwQikpCisJCUNPTVBMRVRFKHBCLCBJMkVFX1BPUk1fTE9ORyk7CisKKwkvLyBGb3Igbm93LCB3ZSdsbCBmYWlsIHRvIGluaXRpYWxpemUgaWYgUC5PLlMuVCByZXBvcnRzIGJhZCBjaGlwIG1hcHBlcjoKKwkvLyBJbXBseWluZyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRvd25sb2FkIGFueSBjb2RlIGVpdGhlcjogIFRoYXQncyBvazogdGhlCisJLy8gY29uZGl0aW9uIGlzIHByZXR0eSBleHBsaWNpdC4KKwlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcxICYgUE9SX0JBRF9NQVBQRVIpCisJeworCQlDT01QTEVURShwQiwgSTJFRV9QT1NURVJSKTsKKwl9CisKKwkvLyBEZXRlcm1pbmUgYW55dGhpbmcgd2hpY2ggbXVzdCBiZSBkb25lIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgZmFtaWx5CisJLy8gb2YgYm9hcmRzIQorCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvcklEICYgUE9SX0lEX0ZBTUlMWSkKKwl7CisJY2FzZSBQT1JfSURfRklJOiAgLy8gSW50ZWxsaVBvcnQtSUkKKworCQlwQi0+aTJlRmlmb1N0eWxlICAgPSBGSUZPX0lJOworCQlwQi0+aTJlRmlmb1NpemUgICAgPSA1MTI7ICAgICAvLyA1MTIgYnl0ZXMsIGFsd2F5cworCQlwQi0+aTJlRGF0YVdpZHRoMTYgPSBOTzsKKworCQlwQi0+aTJlTWF4SXJxID0gMTU7CS8vIEJlY2F1c2UgYm9hcmQgY2Fubm90IHRlbGwgdXMgaXQgaXMgaW4gYW4gOC1iaXQKKwkJCQkJCQkvLyBzbG90LCB3ZSBkbyBhbGxvdyBpdCB0byBiZSBkb25lIChkb2N1bWVudGF0aW9uISkKKworCQlwQi0+aTJlR29vZE1hcFsxXSA9CisJCXBCLT5pMmVHb29kTWFwWzJdID0KKwkJcEItPmkyZUdvb2RNYXBbM10gPQorCQlwQi0+aTJlQ2hhbm5lbE1hcFsxXSA9CisJCXBCLT5pMmVDaGFubmVsTWFwWzJdID0KKwkJcEItPmkyZUNoYW5uZWxNYXBbM10gPSAwOworCisJCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvcklEICYgUE9SX0lEX1NJWkUpCisJCXsKKwkJY2FzZSBQT1JfSURfSUlfNDoKKwkJCXBCLT5pMmVHb29kTWFwWzBdID0KKwkJCXBCLT5pMmVDaGFubmVsTWFwWzBdID0gMHgwZjsgIC8vIGZvdXItcG9ydAorCisJCQkvLyBTaW5jZSBwb3JQb3J0czEgaXMgYmFzZWQgb24gdGhlIEhhcmR3YXJlIElEIHJlZ2lzdGVyLCB0aGUgbnVtYmVycworCQkJLy8gc2hvdWxkIGFsd2F5cyBiZSBjb25zaXN0ZW50IGZvciBJbnRlbGxpUG9ydC1JSS4gIERpdHRvIGJlbG93Li4uCisJCQlpZiAocEItPmkyZVBvbS5lLnBvclBvcnRzMSAhPSA0KQorCQkJeworCQkJCUNPTVBMRVRFKHBCLCBJMkVFX0lOQ09OU0lTVCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBPUl9JRF9JSV84OgorCQljYXNlIFBPUl9JRF9JSV84UjoKKwkJCXBCLT5pMmVHb29kTWFwWzBdID0KKwkJCXBCLT5pMmVDaGFubmVsTWFwWzBdID0gMHhmZjsgIC8vIEVpZ2h0IHBvcnQKKwkJCWlmIChwQi0+aTJlUG9tLmUucG9yUG9ydHMxICE9IDgpCisJCQl7CisJCQkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUE9SX0lEX0lJXzY6CisJCQlwQi0+aTJlR29vZE1hcFswXSA9CisJCQlwQi0+aTJlQ2hhbm5lbE1hcFswXSA9IDB4M2Y7ICAvLyBTaXggUG9ydAorCQkJaWYgKHBCLT5pMmVQb20uZS5wb3JQb3J0czEgIT0gNikKKwkJCXsKKwkJCQlDT01QTEVURShwQiwgSTJFRV9JTkNPTlNJU1QpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBGaXggdXAgdGhlICJnb29kIGNoYW5uZWwgbGlzdCBiYXNlZCBvbiBhbnkgZXJyb3JzIHJlcG9ydGVkLgorCQlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcxICYgUE9SX0JBRF9VQVJUMSkKKwkJeworCQkJcEItPmkyZUdvb2RNYXBbMF0gJj0gfjB4MGY7CisJCX0KKworCQlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcxICYgUE9SX0JBRF9VQVJUMikKKwkJeworCQkJcEItPmkyZUdvb2RNYXBbMF0gJj0gfjB4ZjA7CisJCX0KKworCQlicmVhazsgICAvLyBQT1JfSURfRklJIGNhc2UKKworCWNhc2UgUE9SX0lEX0ZJSUVYOiAgIC8vIEludGVsbGlQb3J0LUlJRVgKKworCQlwQi0+aTJlRmlmb1N0eWxlID0gRklGT19JSUVYOworCisJCWl0ZW1wID0gcEItPmkyZVBvbS5lLnBvckZpZm9TaXplOworCisJCS8vIEltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCBmaWZvIHdvdWxkIG5vdCBncm93IGJleW9uZCAzMmssIAorCQkvLyBub3Igd291bGQgZXZlciBiZSBsZXNzIHRoYW4gMjU2LgorCisJCWlmIChpdGVtcCA8IDggfHwgaXRlbXAgPiAxNSkKKwkJeworCQkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwkJfQorCQlwQi0+aTJlRmlmb1NpemUgPSAoMSA8PCBpdGVtcCk7CisKKwkJLy8gVGhlc2UgYXJlIGJhc2VkIG9uIHdoYXQgUC5PLlMuVCB0aGlua3Mgc2hvdWxkIGJlIHRoZXJlLCBiYXNlZCBvbgorCQkvLyBib3ggSUQgcmVnaXN0ZXJzCisJCWlsaW1pdCA9IHBCLT5pMmVQb20uZS5wb3JOdW1Cb3hlczsKKwkJaWYgKGlsaW1pdCA+IEFCU19NQVhfQk9YRVMpCisJCXsKKwkJCWlsaW1pdCA9IEFCU19NQVhfQk9YRVM7CisJCX0KKworCQkvLyBGb3IgYXMgbWFueSBib3hlcyBhcyBFWElTVCwgZ2l2ZXMgdGhlIHR5cGUgb2YgYm94LgorCQkvLyBBZGRlZCA4LzYvOTM6IGNoZWNrIGZvciB0aGUgSVNBLTQgKGFzaWMpIHdoaWNoIGxvb2tzIGxpa2UgYW4KKwkJLy8gZXhwYW5kYWJsZSBidXQgZm9yIHdob20gIjggb3IgMTY/IiBpcyBub3QgdGhlIHJpZ2h0IHF1ZXN0aW9uLgorCisJCXV0ZW1wID0gcEItPmkyZVBvbS5lLnBvckZsYWdzOworCQlpZiAodXRlbXAgJiBQT1JfQ0VYNCkKKwkJeworCQkJcEItPmkyZUNoYW5uZWxNYXBbMF0gPSAweDAwMGY7CisJCX0gZWxzZSB7CisJCQl1dGVtcCAmPSBQT1JfQk9YRVM7CisJCQlmb3IgKGl0ZW1wID0gMDsgaXRlbXAgPCBpbGltaXQ7IGl0ZW1wKyspCisJCQl7CisJCQkJcEItPmkyZUNoYW5uZWxNYXBbaXRlbXBdID0gCisJCQkJCSgodXRlbXAgJiBQT1JfQk9YXzE2KSA/IDB4ZmZmZiA6IDB4MDBmZik7CisJCQkJdXRlbXAgPj49IDE7CisJCQl9CisJCX0KKworCQkvLyBUaGVzZSBhcmUgYmFzZWQgb24gd2hhdCBQLk8uUy5UIGFjdHVhbGx5IGZvdW5kLgorCisJCXV0ZW1wID0gKHBCLT5pMmVQb20uZS5wb3JQb3J0czIgPDwgOCkgKyBwQi0+aTJlUG9tLmUucG9yUG9ydHMxOworCisJCWZvciAoaXRlbXAgPSAwOyBpdGVtcCA8IGlsaW1pdDsgaXRlbXArKykKKwkJeworCQkJcEItPmkyZUdvb2RNYXBbaXRlbXBdID0gMDsKKwkJCWlmICh1dGVtcCAmIDEpIHBCLT5pMmVHb29kTWFwW2l0ZW1wXSB8PSAweDAwMGY7CisJCQlpZiAodXRlbXAgJiAyKSBwQi0+aTJlR29vZE1hcFtpdGVtcF0gfD0gMHgwMGYwOworCQkJaWYgKHV0ZW1wICYgNCkgcEItPmkyZUdvb2RNYXBbaXRlbXBdIHw9IDB4MGYwMDsKKwkJCWlmICh1dGVtcCAmIDgpIHBCLT5pMmVHb29kTWFwW2l0ZW1wXSB8PSAweGYwMDA7CisJCQl1dGVtcCA+Pj0gNDsKKwkJfQorCisJCS8vIE5vdyBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdHJhbnNmZXIgaW4gOCBvciAxNi1iaXQgbW9kZS4KKwkJc3dpdGNoIChwQi0+aTJlUG9tLmUucG9yQnVzICYgKFBPUl9CVVNfU0xPVDE2IHwgUE9SX0JVU19ESVAxNikgKQorCQl7CisJCWNhc2UgUE9SX0JVU19TTE9UMTYgfCBQT1JfQlVTX0RJUDE2OgorCQkJcEItPmkyZURhdGFXaWR0aDE2ID0gWUVTOworCQkJcEItPmkyZU1heElycSA9IDE1OworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JfQlVTX1NMT1QxNjoKKwkJCXBCLT5pMmVEYXRhV2lkdGgxNiA9IE5POworCQkJcEItPmkyZU1heElycSA9IDE1OworCQkJYnJlYWs7CisKKwkJY2FzZSAwOgorCQljYXNlIFBPUl9CVVNfRElQMTY6ICAgICAvLyBJbiBhbiA4LWJpdCBzbG90LCBESVAgc3dpdGNoIGRvbid0IGNhcmUuCisJCWRlZmF1bHQ6CisJCQlwQi0+aTJlRGF0YVdpZHRoMTYgPSBOTzsKKwkJCXBCLT5pMmVNYXhJcnEgPSA3OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7ICAgLy8gUE9SX0lEX0ZJSUVYIGNhc2UKKworCWRlZmF1bHQ6ICAgIC8vIFVua25vd24gdHlwZSBvZiBib2FyZAorCQlDT01QTEVURShwQiwgSTJFRV9CQURfRkFNSUxZKTsKKwkJYnJlYWs7CisJfSAgLy8gRW5kIHRoZSBzd2l0Y2ggYmFzZWQgb24gZmFtaWx5CisKKwkvLyBUZW1wb3JhcmlseSwgY2xhaW0gdGhlcmUgaXMgbm8gcm9vbSBpbiB0aGUgb3V0Ym91bmQgZmlmby4gCisJLy8gV2Ugd2lsbCBtYWludGFpbiB0aGlzIHdoZW5ldmVyIHdlIGNoZWNrIGZvciBhbiBlbXB0eSBvdXRib3VuZCBGSUZPLgorCXBCLT5pMmVGaWZvUmVtYWlucyA9IDA7CisKKwkvLyBOb3csIGJhc2VkIG9uIHRoZSBidXMgdHlwZSwgc2hvdWxkIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIHJlLWNvbmZpZ3VyZQorCS8vIGludGVycnVwdHMgKHNheSwgZm9yIHRlc3RpbmcgcHVycG9zZXMpLgorCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvckJ1cyAmIFBPUl9CVVNfVFlQRSkKKwl7CisJY2FzZSBQT1JfQlVTX1RfSVNBOgorCWNhc2UgUE9SX0JVU19UX1VOSzogIC8vIElmIHRoZSB0eXBlIG9mIGJ1cyBpcyB1bmRlY2xhcmVkLCBhc3N1bWUgb2suCisJCXBCLT5pMmVDaGFuZ2VJcnEgPSBZRVM7CisJCWJyZWFrOworCWNhc2UgUE9SX0JVU19UX01DQToKKwljYXNlIFBPUl9CVVNfVF9FSVNBOgorCQlwQi0+aTJlQ2hhbmdlSXJxID0gTk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBREJVUyk7CisJfQorCisJaWYgKHBCLT5pMmVEYXRhV2lkdGgxNiA9PSBZRVMpCisJeworCQlwQi0+aTJlV3JpdGVCdWYgID0gaWlXcml0ZUJ1ZjE2OworCQlwQi0+aTJlUmVhZEJ1ZiAgID0gaWlSZWFkQnVmMTY7CisJCXBCLT5pMmVXcml0ZVdvcmQgPSBpaVdyaXRlV29yZDE2OworCQlwQi0+aTJlUmVhZFdvcmQgID0gaWlSZWFkV29yZDE2OworCX0gZWxzZSB7CisJCXBCLT5pMmVXcml0ZUJ1ZiAgPSBpaVdyaXRlQnVmODsKKwkJcEItPmkyZVJlYWRCdWYgICA9IGlpUmVhZEJ1Zjg7CisJCXBCLT5pMmVXcml0ZVdvcmQgPSBpaVdyaXRlV29yZDg7CisJCXBCLT5pMmVSZWFkV29yZCAgPSBpaVJlYWRXb3JkODsKKwl9CisKKwlzd2l0Y2gocEItPmkyZUZpZm9TdHlsZSkKKwl7CisJY2FzZSBGSUZPX0lJOgorCQlwQi0+aTJlV2FpdEZvclR4RW1wdHkgPSBpaVdhaXRGb3JUeEVtcHR5SUk7CisJCXBCLT5pMmVUeE1haWxFbXB0eSAgICA9IGlpVHhNYWlsRW1wdHlJSTsKKwkJcEItPmkyZVRyeVNlbmRNYWlsICAgID0gaWlUcnlTZW5kTWFpbElJOworCQlwQi0+aTJlR2V0TWFpbCAgICAgICAgPSBpaUdldE1haWxJSTsKKwkJcEItPmkyZUVuYWJsZU1haWxJcnEgID0gaWlFbmFibGVNYWlsSXJxSUk7CisJCXBCLT5pMmVXcml0ZU1hc2sgICAgICA9IGlpV3JpdGVNYXNrSUk7CisKKwkJYnJlYWs7CisKKwljYXNlIEZJRk9fSUlFWDoKKwkJcEItPmkyZVdhaXRGb3JUeEVtcHR5ID0gaWlXYWl0Rm9yVHhFbXB0eUlJRVg7CisJCXBCLT5pMmVUeE1haWxFbXB0eSAgICA9IGlpVHhNYWlsRW1wdHlJSUVYOworCQlwQi0+aTJlVHJ5U2VuZE1haWwgICAgPSBpaVRyeVNlbmRNYWlsSUlFWDsKKwkJcEItPmkyZUdldE1haWwgICAgICAgID0gaWlHZXRNYWlsSUlFWDsKKwkJcEItPmkyZUVuYWJsZU1haWxJcnEgID0gaWlFbmFibGVNYWlsSXJxSUlFWDsKKwkJcEItPmkyZVdyaXRlTWFzayAgICAgID0gaWlXcml0ZU1hc2tJSUVYOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwl9CisKKwkvLyBJbml0aWFsaXplIHN0YXRlIGluZm9ybWF0aW9uLgorCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX1JFQURZOyAgIC8vIFJlYWR5IHRvIGxvYWQgbG9hZHdhcmUuCisKKwkvLyBTb21lIEZpbmFsIGNsZWFudXA6CisJLy8gRm9yIHNvbWUgYm9hcmRzLCB0aGUgYm9vdHN0cmFwIGZpcm13YXJlIG1heSBwZXJmb3JtIHNvbWUgc29ydCBvZiB0ZXN0CisJLy8gcmVzdWx0aW5nIGluIGEgc3RyYXkgY2hhcmFjdGVyIHBlbmRpbmcgaW4gdGhlIGluY29taW5nIG1haWxib3guIElmIG9uZSBpcworCS8vIHRoZXJlLCBpdCBzaG91bGQgYmUgcmVhZCBhbmQgZGlzY2FyZGVkLCBlc3BlY2lhbGx5IHNpbmNlIGZvciB0aGUgc3RhbmRhcmQKKwkvLyBmaXJtd2FyZSwgaXQncyB0aGUgbWFpbGJveCB0aGF0IGludGVycnVwdHMgdGhlIGhvc3QuCisKKwlwQi0+aTJlU3RhcnRNYWlsID0gaWlHZXRNYWlsKHBCKTsKKworCS8vIFRocm93IGl0IGF3YXkgYW5kIGNsZWFyIHRoZSBtYWlsYm94IHN0cnVjdHVyZSBlbGVtZW50CisJcEItPmkyZVN0YXJ0TWFpbCA9IE5PX01BSUxfSEVSRTsKKworCS8vIEV2ZXJ5dGhpbmcgaXMgb2sgbm93LCByZXR1cm4gd2l0aCBnb29kIHN0YXR1cy8KKworCXBCLT5pMmVWYWxpZCA9IEkyRV9NQUdJQzsKKwlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZWxheSBSb3V0aW5lcworLy8KKy8vIGlpRGVsYXlJTworLy8gaWlOb3AKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZAoraWkyRGVsYXlXYWtldXAodW5zaWduZWQgbG9uZyBpZCkKK3sKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCAmcERlbGF5V2FpdCApOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWkyRGVsYXlUaW1lcihtc2Vjb25kcykKKy8vIFBhcmFtZXRlcnM6IG1zZWNvbmRzIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgZGVsYXlzIGZvciBhcHByb3hpbWF0ZWx5IG1zZWNvbmRzIG1pbGxpc2Vjb25kcyBhbmQgaXMgaW50ZW5kZWQKKy8vIHRvIGJlIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggaTJEZWxheSBmaWVsZCBpbiBpMmVCb3JkU3RyLiBJdCB1c2VzIHRoZQorLy8gTGludXggdGltZXJfbGlzdCBtZWNoYW5pc20uCisvLworLy8gVGhlIExpbnV4IHRpbWVycyB1c2UgYSB1bml0IGNhbGxlZCAiamlmZmllcyIgd2hpY2ggYXJlIDEwbVMgaW4gdGhlIEludGVsCisvLyBhcmNoaXRlY3R1cmUuIFRoaXMgZnVuY3Rpb24gcm91bmRzIHRoZSBkZWxheSBwZXJpb2QgdXAgdG8gdGhlIG5leHQgImppZmZ5Ii4KKy8vIEluIHRoZSBBbHBoYSBhcmNoaXRlY3R1cmUgdGhlICJqaWZmeSIgaXMgMW1TLCBidXQgdGhpcyBkcml2ZXIgaXMgbm90IGludGVuZGVkCisvLyBmb3IgQWxwaGEgcGxhdGZvcm1zIGF0IHRoaXMgdGltZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpMkRlbGF5VGltZXIodW5zaWduZWQgaW50IG1zZWNvbmRzKQoreworCXdhaXRfcXVldWVfdCB3YWl0OworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCisJaW5pdF90aW1lciAoIHBEZWxheVRpbWVyICk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcERlbGF5V2FpdCwgJndhaXQpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoIFRBU0tfSU5URVJSVVBUSUJMRSApOworCisJcERlbGF5VGltZXItPmV4cGlyZXMgID0gamlmZmllcyArICggbXNlY29uZHMgKyA5ICkgLyAxMDsKKwlwRGVsYXlUaW1lci0+ZnVuY3Rpb24gPSBpaTJEZWxheVdha2V1cDsKKwlwRGVsYXlUaW1lci0+ZGF0YSAgICAgPSAwOworCisJYWRkX3RpbWVyICggcERlbGF5VGltZXIgKTsKKworCXNjaGVkdWxlKCk7CisKKwlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBEZWxheVdhaXQsICZ3YWl0KTsKKworCWRlbF90aW1lciAoIHBEZWxheVRpbWVyICk7Cit9CisKKyNpZiAwCisvL3N0YXRpYyB2b2lkIGlpMkRlbGF5SU8odW5zaWduZWQgaW50KTsKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAhISEgTm90IFVzZWQsIHRoaXMgaXMgRE9TIGNyYXAsIHNvbWUgb2YgeW91IHlvdW5nIGZvbGtzIG1heSBiZSBpbnRlcmVzdGVkIGluCisvLyAgICAgaW4gaG93IHRoaW5ncyB3ZXJlIGRvbmUgaW4gdGhlIHN0b25lIGFnZSBvZiBjYWN1bGF0aW5nIG1hY2hpbmVzICAgICAgICEhIQorLy8gRnVuY3Rpb246ICAgaWkyRGVsYXlJTyhtc2Vjb25kcykKKy8vIFBhcmFtZXRlcnM6IG1zZWNvbmRzIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgZGVsYXlzIGZvciBhcHByb3hpbWF0ZWx5IG1zZWNvbmRzIG1pbGxpc2Vjb25kcyBhbmQgaXMgaW50ZW5kZWQKKy8vIHRvIGJlIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggaTJEZWxheSBmaWVsZCBpbiBpMmVCb3JkU3RyLiBJdCBpcyBpbnRlbmRlZAorLy8gZm9yIHVzZSB3aGVyZSBhIGNsb2NrLWJhc2VkIGZ1bmN0aW9uIGlzIGltcG9zc2libGU6IGZvciBleGFtcGxlLCBET1MgZHJpdmVycy4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIElOIGluc3RydWN0aW9uIHRvIHBsYWNlIGJvdW5kcyBvbiB0aGUgdGltaW5nIGFuZAorLy8gYXNzdW1lcyB0aGF0IGlpMlNhZmUgaGFzIGJlZW4gc2V0LiBUaGlzIGlzIGJlY2F1c2UgSS9PIGluc3RydWN0aW9ucyBhcmUgbm90CisvLyBzdWJqZWN0IHRvIGNhY2hpbmcgYW5kIHdpbGwgdGhlcmVmb3JlIHRha2UgYSBjZXJ0YWluIG1pbmltdW0gdGltZS4gVG8gZW5zdXJlCisvLyB0aGUgZGVsYXkgaXMgYXQgbGVhc3QgbG9uZyBlbm91Z2ggb24gZmFzdCBtYWNoaW5lcywgaXQgaXMgYmFzZWQgb24gc29tZQorLy8gZmFzdGVzdC1jYXNlIGNhbGN1bGF0aW9ucy4gIE9uIHNsb3dlciBtYWNoaW5lcyB0aGlzIG1heSBjYXVzZSBWRVJZIGxvbmcKKy8vIGRlbGF5cy4gKDMgeCBmYXN0ZXN0IGNhc2UpLiBJbiB0aGUgZmFzdGVzdCBjYXNlLCBldmVyeXRoaW5nIGlzIGNhY2hlZCBleGNlcHQKKy8vIHRoZSBJL08gaW5zdHJ1Y3Rpb24gaXRzZWxmLgorLy8KKy8vIFRpbWluZyBjYWxjdWxhdGlvbnM6CisvLyBUaGUgZmFzdGVzdCBidXMgc3BlZWQgZm9yIEkvTyBvcGVyYXRpb25zIGlzIGxpa2VseSB0byBiZSAxMCBNSHouIFRoZSBJL08KKy8vIG9wZXJhdGlvbiBpbiBxdWVzdGlvbiBpcyBhIGJ5dGUgb3BlcmF0aW9uIHRvIGFuIG9kZCBhZGRyZXNzLiBGb3IgOC1iaXQKKy8vIG9wZXJhdGlvbnMsIHRoZSBhcmNoaXRlY3R1cmUgZ2VuZXJhbGx5IGVuZm9yY2VzIHR3byB3YWl0IHN0YXRlcy4gQXQgMTAgTUh6LCBhCisvLyBzaW5nbGUgY3ljbGUgdGltZSBpcyAxMDBuUy4gQSByZWFkIG9wZXJhdGlvbiBhdCB0d28gd2FpdCBzdGF0ZXMgdGFrZXMgNgorLy8gY3ljbGVzIGZvciBhIHRvdGFsIHRpbWUgb2YgNjAwblMuIFRoZXJlZm9yZSBhcHByb3hpbWF0ZWx5IDE2NjYgaXRlcmF0aW9ucworLy8gd291bGQgYmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgbWlsbGlzZWNvbmQgZGVsYXkuIFRoZSB3b3JzdAorLy8gKHJlYXNvbmFibGUpIGNhc2Ugd291bGQgYmUgYW4gOE1IeiBzeXN0ZW0gd2l0aCBubyBjYWNoZWluZy4gSW4gdGhpcyBjYXNlLCB0aGUKKy8vIEkvTyBpbnN0cnVjdGlvbiB3b3VsZCB0YWtlIDEyNW5TIHggNiBjeWxlcyA9IDc1MCBuUy4gTW9yZSBpbXBvcnRhbnRseSwgY29kZQorLy8gZmV0Y2ggb2Ygb3RoZXIgaW5zdHJ1Y3Rpb25zIGluIHRoZSBsb29wIHdvdWxkIHRha2UgdGltZSAoemVybyB3YWl0IHN0YXRlcywKKy8vIGhvd2V2ZXIpIGFuZCB3b3VsZCBiZSBoYXJkIHRvIGVzdGltYXRlLiBUaGlzIGlzIG1pbmltaXplZCBieSB1c2luZyBpbi1saW5lCisvLyBhc3NlbWJsZXIgZm9yIHRoZSBpbiBpbm5lciBsb29wIG9mIElOIGluc3RydWN0aW9ucy4gVGhpcyBjb25zaXN0cyBvZiBqdXN0IGEKKy8vIGZldyBieXRlcy4gU28gd2UnbGwgZ3Vlc3MgYWJvdXQgZm91ciBjb2RlIGZldGNoZXMgcGVyIGxvb3AuIEVhY2ggY29kZSBmZXRjaAorLy8gc2hvdWxkIHRha2UgZm91ciBjeWNsZXMsIHNvIHdlIGhhdmUgMTI1blMgKiA4ID0gMTAwMG5TLiBXb3JzdCBjYXNlIHRoZW4gaXMKKy8vIHRoYXQgd2hhdCBzaG91bGQgaGF2ZSB0YWtlbiAxIG1TIHRha2VzIGluc3RlYWQgMTY2NiAqICgxNzUwKSA9IDIuOSBtUy4KKy8vCisvLyBTbyBtdWNoIGZvciB0aGVvcmV0aWNhbCB0aW1pbmdzOiByZXN1bHRzIHVzaW5nIDE2NjYgdmFsdWUgb24gc29tZSBhY3R1YWwKKy8vIG1hY2hpbmVzOgorLy8gSUJNICAgICAgMjg2ICAgICAgNk1IeiAgICAgMy4xNSBtUworLy8gWmVuaXRoICAgMzg2ICAgICAgMzNNSHogICAgMi40NSBtUworLy8gKGJyYW5kWCkgMzg2ICAgICAgMzNNSHogICAgMS45MCBtUyAgKGhhcyBjYWNoZSkKKy8vIChicmFuZFkpIDQ4NiAgICAgIDMzTUh6ICAgIDIuMzUgbVMKKy8vIE5DUiAgICAgIDQ4NiAgICAgID8/ICAgICAgIDEuNjUgbVMgKG1pY3JvY2hhbm5lbCkKKy8vCisvLyBGb3IgbW9zdCBtYWNoaW5lcywgaXQgaXMgcHJvYmFibHkgc2FmZSB0byBzY2FsZSB0aGlzIG51bWJlciBiYWNrIChyZW1lbWJlciwKKy8vIGZvciByb2J1c3Qgb3BlcmF0aW9uIHVzZSBhbiBhY3R1YWwgdGltZWQgZGVsYXkgaWYgcG9zc2libGUpLCBzbyB3ZSBhcmUgdXNpbmcKKy8vIGEgdmFsdWUgb2YgMTE5MC4gVGhpcyB5aWVsZHMgMS4xNyBtUyBmb3IgdGhlIGZhc3Rlc3QgbWFjaGluZSBpbiBvdXIgc2FtcGxlLAorLy8gMS43NSBtUyBmb3IgdHlwaWNhbCAzODYgbWFjaGluZXMsIGFuZCAyLjI1IG1TIHRoZSBhYnNvbHV0ZSBzbG93ZXN0IG1hY2hpbmUuCisvLworLy8gMS8yOS85MzoKKy8vIFRoZSBhYm92ZSB0aW1pbmdzIGFyZSB0b28gc2xvdy4gQWN0dWFsIGN5Y2xlIHRpbWVzIG1pZ2h0IGJlIGZhc3Rlci4gSVNBIGN5Y2xlCisvLyB0aW1lcyBjb3VsZCBhcHByb2FjaCA1MDAgblMsIGFuZCAuLi4KKy8vIFRoZSBJQk0gbW9kZWwgNzcgYmVpbmcgbWljcm9jaGFubmVsIGhhcyBubyB3YWl0IHN0YXRlcyBmb3IgOC1iaXQgcmVhZHMgYW5kCisvLyBzZWVtcyB0byBiZSBhY2Nlc3NpbmcgdGhlIEkvTyBhdCA0NDAgblMgcGVyIGFjY2VzcyAoZnJvbSBzdGFydCBvZiBvbmUgdG8KKy8vIHN0YXJ0IG9mIG5leHQpLiBUaGlzIHdvdWxkIGltcGx5IHdlIG5lZWQgMTAwMC8uNDQwID0gMjI3MiBpdGVyYXRpb25zIHRvCisvLyBndWFyYW50ZWUgd2UgYXJlIGZhc3QgZW5vdWdoLiBJbiBhY3R1YWwgdGVzdGluZywgd2Ugc2VlIHRoYXQgMiAqIDExOTAgYXJlIGluCisvLyBmYWN0IGVub3VnaC4gRm9yIGRpYWdub3N0aWNzLCB3ZSBrZWVwIHRoZSBsZXZlbCBhdCAxMTkwLCBidXQgZGV2ZWxvcGVycyBub3RlCisvLyB0aGlzIG5lZWRzIHR1bmluZy4KKy8vCisvLyBTYWZlIGFzc3VtcHRpb246ICAyMjcwIGkvbyByZWFkcyA9IDEgbWlsbGlzZWNvbmQKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKK3N0YXRpYyBpbnQgaWkyRGVsVmFsdWUgPSAxMTkwOyAgLy8gU2VlIHRpbWluZyBjYWxjdWxhdGlvbnMgYmVsb3cKKwkJCQkJCS8vIDE2NjYgZm9yIGZhc3Rlc3QgdGhlb3JldGljYWwgbWFjaGluZQorCQkJCQkJLy8gMTE5MCBzYWZlIGZvciBtb3N0IGZhc3QgMzg2IG1hY2hpbmVzCisJCQkJCQkvLyAxMDAwIGZvciBmYXN0ZXN0IG1hY2hpbmUgdGVzdGVkIGhlcmUKKwkJCQkJCS8vICA1NDAgKHNpYykgZm9yIEFUMjg2LzZNaHoKK3N0YXRpYyB2b2lkCitpaTJEZWxheUlPKHVuc2lnbmVkIGludCBtc2Vjb25kcykKK3sKKwlpZiAoIWlpMlNhZmUpIAorCQlyZXR1cm47ICAgLyogRG8gbm90aGluZyBpZiB0aGlzIHZhcmlhYmxlIHVuaW5pdGlhbGl6ZWQgKi8KKworCXdoaWxlKG1zZWNvbmRzLS0pIHsKKwkJaW50IGkgPSBpaTJEZWxWYWx1ZTsKKwkJd2hpbGUgKCBpLS0gKSB7CisJCQlJTkIgKCBpaTJTYWZlICk7CisJCX0KKwl9Cit9CisjZW5kaWYgCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaTJOb3AoKQorLy8gUGFyYW1ldGVyczogTm9uZQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBpaUluaXRpYWxpemUgd2lsbCBzZXQgaTJlRGVsYXkgdG8gdGhpcyBpZiB0aGUgZGVsYXkgcGFyYW1ldGVyIGlzIE5VTEwuIFRoaXMKKy8vIHNhdmVzIGNoZWNraW5nIGZvciBhIE5VTEwgcG9pbnRlciBhdCBldmVyeSBjYWxsLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpaTJOb3Aodm9pZCkKK3sKKwlyZXR1cm47CS8vIG5vIG15c3RlcnkgaGVyZQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJvdXRpbmVzIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gOC8xNi1iaXQgdmVyc2lvbnMsIG9yCisvLyBpbiBkaWZmZXJlbnQgZmlmbyBzdHlsZXMuIFRoZXNlIGFyZSBBTEwgY2FsbGVkCisvLyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGJvYXJkIHN0cnVjdHVyZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlXcml0ZUJ1ZjE2KHBCLCBhZGRyZXNzLCBjb3VudCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIGFkZHJlc3Mgb2YgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgY291bnQgICAtIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHdyaXRlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXcml0ZXMgJ2NvdW50JyBieXRlcyBmcm9tICdhZGRyZXNzJyB0byB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQKKy8vIHN0cnVjdHVyZSBwb2ludGVyIHBCLiBTaG91bGQgY291bnQgaGFwcGVuIHRvIGJlIG9kZCwgYW4gZXh0cmEgcGFkIGJ5dGUgaXMKKy8vIHNlbnQgKGlkZW50aXR5IHVua25vd24uLi4pLiBVc2VzIDE2LWJpdCAod29yZCkgb3BlcmF0aW9ucy4gSXMgY2FsbGVkCisvLyBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVdyaXRlQnVmLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdyaXRlQnVmMTYoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8vIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlLgorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCQlDT01QTEVURShwQiwgSTJFRV9JTlZBTElEKTsKKworCU9VVFNXICggcEItPmkyZURhdGEsIGFkZHJlc3MsIGNvdW50KTsKKworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlXcml0ZUJ1ZjgocEIsIGFkZHJlc3MsIGNvdW50KQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBhZGRyZXNzIC0gYWRkcmVzcyBvZiBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICBjb3VudCAgIC0gbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gd3JpdGUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyAnY291bnQnIGJ5dGVzIGZyb20gJ2FkZHJlc3MnIHRvIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZAorLy8gc3RydWN0dXJlIHBvaW50ZXIgcEIuIFNob3VsZCBjb3VudCBoYXBwZW4gdG8gYmUgb2RkLCBhbiBleHRyYSBwYWQgYnl0ZSBpcworLy8gc2VudCAoaWRlbnRpdHkgdW5rbm93bi4uLikuIFRoaXMgaXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSAxNi1iaXQgdmVyc2lvbi4KKy8vIFVzZXMgOC1iaXQgKGJ5dGUpIG9wZXJhdGlvbnMuIElzIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVdyaXRlQnVmLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdyaXRlQnVmOChpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyICphZGRyZXNzLCBpbnQgY291bnQpCit7CisJLyogUnVkaW1lbnRhcnkgc2FuaXR5IGNoZWNraW5nIGhlcmUgKi8KKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5WQUxJRCk7CisKKwlPVVRTQiAoIHBCLT5pMmVEYXRhLCBhZGRyZXNzLCBjb3VudCApOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRCdWYxNihwQiwgYWRkcmVzcywgY291bnQpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIGFkZHJlc3MgLSBhZGRyZXNzIHRvIHB1dCBkYXRhIHJlYWQKKy8vICAgICAgICAgICAgIGNvdW50ICAgLSBudW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZWFkcyAnY291bnQnIGJ5dGVzIGludG8gJ2FkZHJlc3MnIGZyb20gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkCisvLyBzdHJ1Y3R1cmUgcG9pbnRlciBwQi4gU2hvdWxkIGNvdW50IGhhcHBlbiB0byBiZSBvZGQsIGFuIGV4dHJhIHBhZCBieXRlIGlzCisvLyByZWNlaXZlZCAoaWRlbnRpdHkgdW5rbm93bi4uLikuIFVzZXMgMTYtYml0ICh3b3JkKSBvcGVyYXRpb25zLiBJcyBjYWxsZWQKKy8vIGluZGlyZWN0bHkgdGhyb3VnaCBwQi0+aTJlUmVhZEJ1Zi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlSZWFkQnVmMTYoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8vIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlLgorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCQlDT01QTEVURShwQiwgSTJFRV9JTlZBTElEKTsKKworCUlOU1cgKCBwQi0+aTJlRGF0YSwgYWRkcmVzcywgY291bnQpOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRCdWY4KHBCLCBhZGRyZXNzLCBjb3VudCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIGFkZHJlc3MgdG8gcHV0IGRhdGEgcmVhZAorLy8gICAgICAgICAgICAgY291bnQgICAtIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHJlYWQKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFJlYWRzICdjb3VudCcgYnl0ZXMgaW50byAnYWRkcmVzcycgZnJvbSB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQKKy8vIHN0cnVjdHVyZSBwb2ludGVyIHBCLiBTaG91bGQgY291bnQgaGFwcGVuIHRvIGJlIG9kZCwgYW4gZXh0cmEgcGFkIGJ5dGUgaXMKKy8vIHJlY2VpdmVkIChpZGVudGl0eSB1bmtub3duLi4uKS4gVGhpcyB0byBtYXRjaCB0aGUgMTYtYml0IGJlaGF2aW91ci4gVXNlcworLy8gOC1iaXQgKGJ5dGUpIG9wZXJhdGlvbnMuIElzIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVJlYWRCdWYuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpUmVhZEJ1ZjgoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8vIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlLgorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCQlDT01QTEVURShwQiwgSTJFRV9JTlZBTElEKTsKKworCUlOU0IgKCBwQi0+aTJlRGF0YSwgYWRkcmVzcywgY291bnQpOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRXb3JkMTYocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFJldHVybnMgdGhlIHdvcmQgcmVhZCBmcm9tIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZC1zdHJ1Y3R1cmUKKy8vIHBvaW50ZXIgcEIuIFVzZXMgYSAxNi1iaXQgb3BlcmF0aW9uLiBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoCisvLyBwQi0+aTJlUmVhZFdvcmQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAoraWlSZWFkV29yZDE2KGkyZUJvcmRTdHJQdHIgcEIpCit7CisJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkoIElOVyhwQi0+aTJlRGF0YSkgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpUmVhZFdvcmQ4KHBCKQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZXR1cm5zIHRoZSB3b3JkIHJlYWQgZnJvbSB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQtc3RydWN0dXJlCisvLyBwb2ludGVyIHBCLiBVc2VzIHR3byA4LWJpdCBvcGVyYXRpb25zLiBCeXRlcyBhcmUgYXNzdW1lZCB0byBiZSBMU0IgZmlyc3QuIElzCisvLyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoIHBCLT5pMmVSZWFkV29yZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHVuc2lnbmVkIHNob3J0CitpaVJlYWRXb3JkOChpMmVCb3JkU3RyUHRyIHBCKQoreworCXVuc2lnbmVkIHNob3J0IHVyczsKKworCXVycyA9IElOQiAoIHBCLT5pMmVEYXRhICk7CisKKwlyZXR1cm4gKCAoIElOQiAoIHBCLT5pMmVEYXRhICkgPDwgOCApIHwgdXJzICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdyaXRlV29yZDE2KHBCLCB2YWx1ZSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIHZhbHVlIC0gZGF0YSB0byB3cml0ZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gV3JpdGVzIHRoZSB3b3JkICd2YWx1ZScgdG8gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkLXN0cnVjdHVyZQorLy8gcG9pbnRlciBwQi4gVXNlcyAxNi1iaXQgb3BlcmF0aW9uLiBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoCisvLyBwQi0+aTJlV3JpdGVXb3JkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZVdvcmQxNihpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlXT1JEX1RPKHBCLCAoaW50KXZhbHVlKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVXb3JkOChwQiwgdmFsdWUpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICB2YWx1ZSAtIGRhdGEgdG8gd3JpdGUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyB0aGUgd29yZCAndmFsdWUnIHRvIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZC1zdHJ1Y3R1cmUKKy8vIHBvaW50ZXIgcEIuIFVzZXMgdHdvIDgtYml0IG9wZXJhdGlvbnMgKHdyaXRlcyBMU0IgZmlyc3QpLiBJcyBjYWxsZWQKKy8vIGluZGlyZWN0bHkgdGhyb3VnaCBwQi0+aTJlV3JpdGVXb3JkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZVdvcmQ4KGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCUJZVEVfVE8ocEIsIChjaGFyKXZhbHVlKTsKKwlCWVRFX1RPKHBCLCAoY2hhcikodmFsdWUgPj4gOCkgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV2FpdEZvclR4RW1wdHlJSShwQiwgbVNkZWxheSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbVNkZWxheSAtIHBlcmlvZCB0byB3YWl0IGJlZm9yZSByZXR1cm5pbmcKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSBGSUZPIGlzIGVtcHR5LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5IGluIHRoZSByZXF1aXJlZCB0aW1lOiB0aGUgcEItPmkyZUVycm9yCisvLyAgICAgICAgICAgICBmaWVsZCBoYXMgdGhlIGVycm9yLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdhaXRzIHVwIHRvICJtU2RlbGF5IiBtaWxsaXNlY29uZHMgZm9yIHRoZSBvdXRnb2luZyBGSUZPIHRvIGJlY29tZSBlbXB0eTsgaWYKKy8vIG5vdCBlbXB0eSBieSB0aGUgcmVxdWlyZWQgdGltZSwgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gcEItPmkyZUVycm9yLAorLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBtU2RlbGF5ID09IDAgaXMgdGFrZW4gdG8gbWVhbiBtdXN0IGJlIGVtcHR5IG9uIHRoZSBmaXJzdCB0ZXN0LgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vIE5vdGUgdGhpcyByb3V0aW5lIGlzIG9yZ2FuaXplZCBzbyB0aGF0IGlmIHN0YXR1cyBpcyBvayB0aGVyZSBpcyBubyBkZWxheSBhdAorLy8gYWxsIGNhbGxlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSB0ZXN0LiAgSXMgY2FsbGVkIGluZGlyZWN0bHkgdGhyb3VnaAorLy8gcEItPmkyZVdhaXRGb3JUeEVtcHR5LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdhaXRGb3JUeEVtcHR5SUkoaTJlQm9yZFN0clB0ciBwQiwgaW50IG1TZGVsYXkpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQgaXRlbXA7CisKKwlmb3IgKDs7KQorCXsKKwkJLy8gVGhpcyByb3V0aW5lIGhpbmdlcyBvbiBiZWluZyBhYmxlIHRvIHNlZSB0aGUgIm90aGVyIiBzdGF0dXMgcmVnaXN0ZXIKKwkJLy8gKGFzIHNlZW4gYnkgdGhlIGxvY2FsIHByb2Nlc3NvcikuICBIaXMgaW5jb21pbmcgZmlmbyBpcyBvdXIgb3V0Z29pbmcKKwkJLy8gRklGTy4KKwkJLy8KKwkJLy8gQnkgdGhlIG5hdHVyZSBvZiB0aGlzIHJvdXRpbmUsIHlvdSB3b3VsZCBiZSB1c2luZyB0aGlzIGFzIHBhcnQgb2YgYQorCQkvLyBsYXJnZXIgYXRvbWljIGNvbnRleHQ6IGkuZS4sIHlvdSB3b3VsZCB1c2UgdGhpcyByb3V0aW5lIHRvIGVuc3VyZSB0aGUKKwkJLy8gZmlmbyBlbXB0eSwgdGhlbiBhY3Qgb24gdGhpcyBpbmZvcm1hdGlvbi4gQmV0d2VlbiB0aGVzZSB0d28gaGFsdmVzLCAKKwkJLy8geW91IHdpbGwgZ2VuZXJhbGx5IG5vdCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0cyBvciBpbiBhbnkgd2F5IAorCQkvLyBkaXNydXB0IHRoZSBhc3N1bXB0aW9ucyBpbXBsaWNpdCBpbiB0aGUgbGFyZ2VyIGNvbnRleHQuCisJCS8vCisJCS8vIEV2ZW4gd29yc2UsIGhvd2V2ZXIsIHRoaXMgcm91dGluZSAic2hpZnRzIiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvIAorCQkvLyBwb2ludCB0byB0aGUgbG9jYWwgc3RhdHVzIHJlZ2lzdGVyIHdoaWNoIGlzIG5vdCB0aGUgdXN1YWwgc2l0dWF0aW9uLgorCQkvLyBUaGVyZWZvcmUgZm9yIGV4dHJhIHNhZmV0eSwgd2UgZm9yY2UgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdG8gYmUKKwkJLy8gY29tcGxldGVseSBhdG9taWMsIGFuZCBwaWNrIHVwIGFmdGVyIG91cnNlbHZlcyBiZWZvcmUgYWxsb3dpbmcgYW55CisJCS8vIGludGVycnVwdHMgb2YgYW55IGtpbmQuCisKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCQlPVVRCKHBCLT5pMmVQb2ludGVyLCBTRUxfQ09NTUFORCk7CisJCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9DTURfU0gpOworCisJCWl0ZW1wID0gSU5CKHBCLT5pMmVTdGF0dXMpOworCisJCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9DT01NQU5EKTsKKwkJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX0NNRF9VTlNIKTsKKworCQlpZiAoaXRlbXAgJiBTVF9JTl9FTVBUWSkKKwkJeworCQkJVVBEQVRFX0ZJRk9fUk9PTShwQik7CisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmRGxfc3BpbmxvY2ssZmxhZ3MpCisJCQlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKKwkJfQorCisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZEbF9zcGlubG9jayxmbGFncykKKworCQlpZiAobVNkZWxheS0tID09IDApCisJCQlicmVhazsKKworCQlpaURlbGF5KHBCLCAxKTsgICAgICAvKiAxIG1TIGdyYW51bGFyaXR5IG9uIGNoZWNraW5nIGNvbmRpdGlvbiAqLworCX0KKwlDT01QTEVURShwQiwgSTJFRV9UWEVfVElNRSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdhaXRGb3JUeEVtcHR5SUlFWChwQiwgbVNkZWxheSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbVNkZWxheSAtIHBlcmlvZCB0byB3YWl0IGJlZm9yZSByZXR1cm5pbmcKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSBGSUZPIGlzIGVtcHR5LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5IGluIHRoZSByZXF1aXJlZCB0aW1lOiB0aGUgcEItPmkyZUVycm9yCisvLyAgICAgICAgICAgICBmaWVsZCBoYXMgdGhlIGVycm9yLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdhaXRzIHVwIHRvICJtU2RlbGF5IiBtaWxsaXNlY29uZHMgZm9yIHRoZSBvdXRnb2luZyBGSUZPIHRvIGJlY29tZSBlbXB0eTsgaWYKKy8vIG5vdCBlbXB0eSBieSB0aGUgcmVxdWlyZWQgdGltZSwgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gcEItPmkyZUVycm9yLAorLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBtU2RlbGF5ID09IDAgaXMgdGFrZW4gdG8gbWVhbiBtdXN0IGJlIGVtcHR5IG9uIHRoZSBmaXJzdCB0ZXN0LgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSUVYIC0gc3R5bGUgRklGTydzCisvLworLy8gTm90ZSB0aGlzIHJvdXRpbmUgaXMgb3JnYW5pemVkIHNvIHRoYXQgaWYgc3RhdHVzIGlzIG9rIHRoZXJlIGlzIG5vIGRlbGF5IGF0CisvLyBhbGwgY2FsbGVkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHRlc3QuICBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoCisvLyBwQi0+aTJlV2FpdEZvclR4RW1wdHkuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpV2FpdEZvclR4RW1wdHlJSUVYKGkyZUJvcmRTdHJQdHIgcEIsIGludCBtU2RlbGF5KQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlmb3IgKDs7KQorCXsKKwkJLy8gQnkgdGhlIG5hdHVyZSBvZiB0aGlzIHJvdXRpbmUsIHlvdSB3b3VsZCBiZSB1c2luZyB0aGlzIGFzIHBhcnQgb2YgYQorCQkvLyBsYXJnZXIgYXRvbWljIGNvbnRleHQ6IGkuZS4sIHlvdSB3b3VsZCB1c2UgdGhpcyByb3V0aW5lIHRvIGVuc3VyZSB0aGUKKwkJLy8gZmlmbyBlbXB0eSwgdGhlbiBhY3Qgb24gdGhpcyBpbmZvcm1hdGlvbi4gQmV0d2VlbiB0aGVzZSB0d28gaGFsdmVzLAorCQkvLyB5b3Ugd2lsbCBnZW5lcmFsbHkgbm90IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHRzIG9yIGluIGFueSB3YXkKKwkJLy8gZGlzcnVwdCB0aGUgYXNzdW1wdGlvbnMgaW1wbGljaXQgaW4gdGhlIGxhcmdlciBjb250ZXh0LgorCisJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmRGxfc3BpbmxvY2ssZmxhZ3MpCisKKwkJaWYgKElOQihwQi0+aTJlU3RhdHVzKSAmIFNURV9PVVRfTVQpIHsKKwkJCVVQREFURV9GSUZPX1JPT00ocEIpOworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCQkJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7CisJCX0KKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCisJCWlmIChtU2RlbGF5LS0gPT0gMCkKKwkJCWJyZWFrOworCisJCWlpRGVsYXkocEIsIDEpOyAgICAgIC8vIDEgbVMgZ3JhbnVsYXJpdHkgb24gY2hlY2tpbmcgY29uZGl0aW9uCisJfQorCUNPTVBMRVRFKHBCLCBJMkVFX1RYRV9USU1FKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpVHhNYWlsRW1wdHlJSShwQikKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgdGhlIHRyYW5zbWl0IG1haWxib3ggaXMgZW1wdHkuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiBpdCBub3QgZW1wdHkuCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gUmV0dXJucyB0cnVlIG9yIGZhbHNlIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSB0cmFuc21pdCBtYWlsYm94IGlzIGVtcHR5IChhbmQKKy8vIHRoZXJlZm9yZSBhYmxlIHRvIGFjY2VwdCBtb3JlIG1haWwpCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJIC0gc3R5bGUgRklGTydzCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpVHhNYWlsRW1wdHlJSShpMmVCb3JkU3RyUHRyIHBCKQoreworCWludCBwb3J0ID0gcEItPmkyZVBvaW50ZXI7CisJT1VUQiAoIHBvcnQsIFNFTF9PVVRNQUlMICk7CisJcmV0dXJuICggSU5CKHBvcnQpID09IDAgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpVHhNYWlsRW1wdHlJSUVYKHBCKQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgdHJhbnNtaXQgbWFpbGJveCBpcyBlbXB0eS4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZXR1cm5zIHRydWUgb3IgZmFsc2UgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIHRyYW5zbWl0IG1haWxib3ggaXMgZW1wdHkgKGFuZAorLy8gdGhlcmVmb3JlIGFibGUgdG8gYWNjZXB0IG1vcmUgbWFpbCkKKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVR4TWFpbEVtcHR5SUlFWChpMmVCb3JkU3RyUHRyIHBCKQoreworCXJldHVybiAhKElOQihwQi0+aTJlU3RhdHVzKSAmIFNURV9PVVRfTUFJTCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVRyeVNlbmRNYWlsSUkocEIsbWFpbCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbWFpbCAtIHZhbHVlIHRvIHdyaXRlIHRvIG1haWxib3gKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSB0cmFuc21pdCBtYWlsYm94IGlzIGVtcHR5LCBhbmQgbWFpbCBpcyBzZW50LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5LgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIElmIG91dGdvaW5nIG1haWxib3ggaXMgZW1wdHksIHNlbmRzIG1haWwgYW5kIHJldHVybnMgdHJ1ZS4gSWYgb3V0Z29pbmcKKy8vIG1haWxib3ggaXMgbm90IGVtcHR5LCByZXR1cm5zIGZhbHNlLgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVRyeVNlbmRNYWlsSUkoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciBtYWlsKQoreworCWludCBwb3J0ID0gcEItPmkyZVBvaW50ZXI7CisKKwlPVVRCKHBvcnQsIFNFTF9PVVRNQUlMKTsKKwlpZiAoSU5CKHBvcnQpID09IDApIHsKKwkJT1VUQihwb3J0LCBTRUxfT1VUTUFJTCk7CisJCU9VVEIocG9ydCwgbWFpbCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpVHJ5U2VuZE1haWxJSUVYKHBCLG1haWwpCisvLyBQYXJhbWV0ZXJzOiBwQiAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIG1haWwgLSB2YWx1ZSB0byB3cml0ZSB0byBtYWlsYm94CisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgdHJhbnNtaXQgbWFpbGJveCBpcyBlbXB0eSwgYW5kIG1haWwgaXMgc2VudC4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBJZiBvdXRnb2luZyBtYWlsYm94IGlzIGVtcHR5LCBzZW5kcyBtYWlsIGFuZCByZXR1cm5zIHRydWUuIElmIG91dGdvaW5nCisvLyBtYWlsYm94IGlzIG5vdCBlbXB0eSwgcmV0dXJucyBmYWxzZS4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVRyeVNlbmRNYWlsSUlFWChpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyIG1haWwpCit7CisJaWYoSU5CKHBCLT5pMmVTdGF0dXMpICYgU1RFX09VVF9NQUlMKSB7CisJCXJldHVybiAwOworCX0KKwlPVVRCKHBCLT5pMmVYTWFpbCwgbWFpbCk7CisJcmV0dXJuIDE7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUdldE1haWxJSShwQixtYWlsKQorLy8gUGFyYW1ldGVyczogcEIgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTWFpbGJveCBkYXRhIG9yIE5PX01BSUxfSEVSRS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBJZiBubyBtYWlsIGF2YWlsYWJsZSwgcmV0dXJucyBOT19NQUlMX0hFUkUgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGRhdGEgZnJvbQorLy8gdGhlIG1haWxib3gsIHdoaWNoIGlzIGd1YXJhbnRlZWQgIT0gTk9fTUFJTF9IRVJFLgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK2lpR2V0TWFpbElJKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaWYgKEhBU19NQUlMKHBCKSkgeworCQlPVVRCKHBCLT5pMmVQb2ludGVyLCBTRUxfSU5NQUlMKTsKKwkJcmV0dXJuIElOQihwQi0+aTJlUG9pbnRlcik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5PX01BSUxfSEVSRTsKKwl9Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUdldE1haWxJSUVYKHBCLG1haWwpCisvLyBQYXJhbWV0ZXJzOiBwQiAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBNYWlsYm94IGRhdGEgb3IgTk9fTUFJTF9IRVJFLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIElmIG5vIG1haWwgYXZhaWxhYmxlLCByZXR1cm5zIE5PX01BSUxfSEVSRSBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGF0YSBmcm9tCisvLyB0aGUgbWFpbGJveCwgd2hpY2ggaXMgZ3VhcmFudGVlZCAhPSBOT19NQUlMX0hFUkUuCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJRVggLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHVuc2lnbmVkIHNob3J0CitpaUdldE1haWxJSUVYKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaWYgKEhBU19NQUlMKHBCKSkgeworCQlyZXR1cm4gSU5CKHBCLT5pMmVYTWFpbCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5PX01BSUxfSEVSRTsKKwl9Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUVuYWJsZU1haWxJcnFJSShwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gRW5hYmxlcyBib2FyZCB0byBpbnRlcnJ1cHQgaG9zdCAob25seSkgYnkgd3JpdGluZyB0byBob3N0J3MgaW4tYm91bmQgbWFpbGJveC4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUkgLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpRW5hYmxlTWFpbElycUlJKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX01BU0spOworCU9VVEIocEItPmkyZVBvaW50ZXIsIFNUX0lOX01BSUwpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlFbmFibGVNYWlsSXJxSUlFWChwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gRW5hYmxlcyBib2FyZCB0byBpbnRlcnJ1cHQgaG9zdCAob25seSkgYnkgd3JpdGluZyB0byBob3N0J3MgaW4tYm91bmQgbWFpbGJveC4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlFbmFibGVNYWlsSXJxSUlFWChpMmVCb3JkU3RyUHRyIHBCKQoreworCU9VVEIocEItPmkyZVhNYXNrLCBNWF9JTl9NQUlMKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVNYXNrSUkocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyBhcmJpdHJhcnkgdmFsdWUgdG8gdGhlIG1hc2sgcmVnaXN0ZXIuCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJIC0gc3R5bGUgRklGTydzCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpaVdyaXRlTWFza0lJKGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX01BU0spOworCU9VVEIocEItPmkyZVBvaW50ZXIsIHZhbHVlKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVNYXNrSUlFWChwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gV3JpdGVzIGFyYml0cmFyeSB2YWx1ZSB0byB0aGUgbWFzayByZWdpc3Rlci4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZU1hc2tJSUVYKGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJT1VUQihwQi0+aTJlWE1hc2ssIHZhbHVlKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpRG93bmxvYWRCbG9jayhwQiwgcFNvdXJjZSwgaXNTdGFuZGFyZCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgcFNvdXJjZSAgICAtIGxvYWR3YXJlIGJsb2NrIHRvIGRvd25sb2FkCisvLyAgICAgICAgICAgICBpc1N0YW5kYXJkIC0gVHJ1ZSBpZiAic3RhbmRhcmQiIGxvYWR3YXJlLCBlbHNlIGZhbHNlLgorLy8KKy8vIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgRmFpbHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIERvd25sb2FkcyBhIHNpbmdsZSBibG9jayAoYXQgcFNvdXJjZSl0byB0aGUgYm9hcmQgcmVmZXJlbmNlZCBieSBwQi4gQ2FsbGVyCisvLyBzZXRzIGlzU3RhbmRhcmQgdG8gdHJ1ZS9mYWxzZSBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgInN0YW5kYXJkIiBsb2Fkd2FyZSBpcworLy8gd2hhdCdzIGJlaW5nIGxvYWRlZC4gVGhlIG5vcm1hbCBwcm9jZXNzLCB0aGVuLCBpcyB0byBwZXJmb3JtIGFuIGlpSW5pdGlhbGl6ZQorLy8gdG8gdGhlIGJvYXJkLCB0aGVuIHBlcmZvcm0gc29tZSBudW1iZXIgb2YgaWlEb3dubG9hZEJsb2NrcyB1c2luZyB0aGUgcmV0dXJuZWQKKy8vIHN0YXRlIHRvIGRldGVybWluZSB3aGVuIGRvd25sb2FkIGlzIGNvbXBsZXRlLgorLy8KKy8vIFBvc3NpYmxlIHJldHVybiB2YWx1ZXM6IChzZWUgSTJFTExJUy5IKQorLy8gSUlfRE9XTl9CQURWQUxJRAorLy8gSUlfRE9XTl9CQURGSUxFCisvLyBJSV9ET1dOX0NPTlRJTlVJTkcKKy8vIElJX0RPV05fR09PRAorLy8gSUlfRE9XTl9CQUQKKy8vIElJX0RPV05fQkFEU1RBVEUKKy8vIElJX0RPV05fVElNRU9VVAorLy8KKy8vIFVzZXMgdGhlIGkyZVN0YXRlIGFuZCBpMmVUb0xvYWQgZmllbGRzIChpbml0aWFsaXplZCBhdCBpaUluaXRpYWxpemUpIHRvCisvLyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaywgd2hldGhlciB0byBjaGVjayBmb3IgbWFnaWMKKy8vIG51bWJlcnMsIGhvdyBtYW55IGJsb2NrcyB0aGVyZSBhcmUgdG8gZ28uLi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlEb3dubG9hZEJsb2NrICggaTJlQm9yZFN0clB0ciBwQiwgbG9hZEhkclN0clB0ciBwU291cmNlLCBpbnQgaXNTdGFuZGFyZCkKK3sKKwlpbnQgaXRlbXA7CisJaW50IGxvYWRlZEZpcnN0OworCisJaWYgKHBCLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMpIHJldHVybiBJSV9ET1dOX0JBRFZBTElEOworCisJc3dpdGNoKHBCLT5pMmVTdGF0ZSkKKwl7CisJY2FzZSBJSV9TVEFURV9SRUFEWToKKworCQkvLyBMb2FkaW5nIHRoZSBmaXJzdCBibG9jayBhZnRlciByZXNldC4gTXVzdCBjaGVjayB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZQorCQkvLyBsb2FkZmlsZSwgc3RvcmUgdGhlIG51bWJlciBvZiBibG9ja3Mgd2UgZXhwZWN0IHRvIGxvYWQuCisJCWlmIChwU291cmNlLT5lLmxvYWRNYWdpYyAhPSBNQUdJQ19MT0FERklMRSkKKwkJeworCQkJcmV0dXJuIElJX0RPV05fQkFERklMRTsKKwkJfQorCisJCS8vIE5leHQgd2Ugc3RvcmUgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdG8gbG9hZCwgaW5jbHVkaW5nIHRoaXMgb25lLgorCQlwQi0+aTJlVG9Mb2FkID0gMSArIHBTb3VyY2UtPmUubG9hZEJsb2Nrc01vcmU7CisKKwkJLy8gU2V0IHRoZSBzdGF0ZSwgc3RvcmUgdGhlIHZlcnNpb24gbnVtYmVycy4gKCdDYXVzZSB0aGlzIG1heSBoYXZlIGNvbWUKKwkJLy8gZnJvbSBhIGZpbGUgLSB3ZSBtaWdodCB3YW50IHRvIHJlcG9ydCB0aGVzZSB2ZXJzaW9ucyBhbmQgcmV2aXNpb25zIGluCisJCS8vIGNhc2Ugb2YgYW4gZXJyb3IhCisJCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX0xPQURJTkc7CisJCXBCLT5pMmVMVmVyc2lvbiA9IHBTb3VyY2UtPmUubG9hZFZlcnNpb247CisJCXBCLT5pMmVMUmV2aXNpb24gPSBwU291cmNlLT5lLmxvYWRSZXZpc2lvbjsKKwkJcEItPmkyZUxTdWIgPSBwU291cmNlLT5lLmxvYWRTdWJSZXZpc2lvbjsKKworCQkvLyBUaGUgdGltZSBhbmQgZGF0ZSBvZiBjb21waWxhdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBidXQgZG9uJ3QgYm90aGVyCisJCS8vIHN0b3JpbmcgaXQgZm9yIG5vcm1hbCBwdXJwb3Nlcy4KKwkJbG9hZGVkRmlyc3QgPSAxOworCQlicmVhazsKKworCWNhc2UgSUlfU1RBVEVfTE9BRElORzoKKwkJbG9hZGVkRmlyc3QgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBJSV9ET1dOX0JBRFNUQVRFOworCX0KKworCS8vIE5vdyB3ZSBtdXN0IGJlIGluIHRoZSBJSV9TVEFURV9MT0FESU5HIHN0YXRlLCBhbmQgd2UgYXNzdW1lIGkyZVRvTG9hZAorCS8vIG11c3QgYmUgcG9zaXRpdmUgc3RpbGwsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgY2xlYW5lZCB1cCBsYXN0CisJLy8gdGltZSBhbmQgc2V0IHRoZSBzdGF0ZSB0byBJSV9TVEFURV9MT0FERUQuCisJaWYgKCFpaVdhaXRGb3JUeEVtcHR5KHBCLCBNQVhfRExPQURfUkVBRF9USU1FKSkgeworCQlyZXR1cm4gSUlfRE9XTl9USU1FT1VUOworCX0KKworCWlmICghaWlXcml0ZUJ1ZihwQiwgcFNvdXJjZS0+YywgTE9BRFdBUkVfQkxPQ0tfU0laRSkpIHsKKwkJcmV0dXJuIElJX0RPV05fQkFEVkFMSUQ7CisJfQorCisJLy8gSWYgd2UganVzdCBsb2FkZWQgdGhlIGZpcnN0IGJsb2NrLCB3YWl0IGZvciB0aGUgZmlmbyB0byBlbXB0eSBhbiBleHRyYQorCS8vIGxvbmcgdGltZSB0byBhbGxvdyBmb3IgYW55IHNwZWNpYWwgc3RhcnR1cCBjb2RlIGluIHRoZSBmaXJtd2FyZSwgbGlrZQorCS8vIHNlbmRpbmcgc3RhdHVzIG1lc3NhZ2VzIHRvIHRoZSBMQ0Qncy4KKworCWlmIChsb2FkZWRGaXJzdCkgeworCQlpZiAoIWlpV2FpdEZvclR4RW1wdHkocEIsIE1BWF9ETE9BRF9TVEFSVF9USU1FKSkgeworCQkJcmV0dXJuIElJX0RPV05fVElNRU9VVDsKKwkJfQorCX0KKworCS8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgd2FzIG91ciBsYXN0IGJsb2NrIQorCWlmICgtLShwQi0+aTJlVG9Mb2FkKSkgeworCQlyZXR1cm4gSUlfRE9XTl9DT05USU5VSU5HOyAgICAvLyBtb3JlIHRvIGNvbWUuLi4KKwl9CisKKwkvLyBJdCBXQVMgb3VyIGxhc3QgYmxvY2s6IENsZWFuIHVwIG9wZXJhdGlvbnMuLi4KKwkvLyAuLi5XYWl0IGZvciBsYXN0IGJ1ZmZlciB0byBkcmFpbiBmcm9tIHRoZSBib2FyZC4uLgorCWlmICghaWlXYWl0Rm9yVHhFbXB0eShwQiwgTUFYX0RMT0FEX1JFQURfVElNRSkpIHsKKwkJcmV0dXJuIElJX0RPV05fVElNRU9VVDsKKwl9CisJLy8gSWYgdGhlcmUgd2VyZSBvbmx5IGEgc2luZ2xlIGJsb2NrIHdyaXR0ZW4sIHRoaXMgd291bGQgY29tZSBiYWNrCisJLy8gaW1tZWRpYXRlbHkgYW5kIGJlIGhhcm1sZXNzLCB0aG91Z2ggbm90IHN0cmljdGx5IG5lY2Vzc2FyeS4KKwlpdGVtcCA9IE1BWF9ETE9BRF9BQ0tfVElNRS8xMDsKKwl3aGlsZSAoLS1pdGVtcCkgeworCQlpZiAoSEFTX0lOUFVUKHBCKSkgeworCQkJc3dpdGNoKEJZVEVfRlJPTShwQikpCisJCQl7CisJCQljYXNlIExPQURXQVJFX09LOgorCQkJCXBCLT5pMmVTdGF0ZSA9CisJCQkJCWlzU3RhbmRhcmQgPyBJSV9TVEFURV9TVERMT0FERUQgOklJX1NUQVRFX0xPQURFRDsKKworCQkJCS8vIFNvbWUgcmV2aXNpb25zIG9mIHRoZSBib290c3RyYXAgZmlybXdhcmUgKGUuZy4gSVNBLTggMS4wLjIpCisJCQkJLy8gd2lsbCwgLy8gaWYgdGhlcmUgaXMgYSBkZWJ1ZyBwb3J0IGF0dGFjaGVkLCByZXF1aXJlIHNvbWUKKwkJCQkvLyB0aW1lIHRvIHNlbmQgaW5mb3JtYXRpb24gdG8gdGhlIGRlYnVnIHBvcnQgbm93LiBJdCB3aWxsIGRvCisJCQkJLy8gdGhpcyBiZWZvcmUgLy8gZXhlY3V0aW5nIGFueSBvZiB0aGUgY29kZSB3ZSBqdXN0IGRvd25sb2FkZWQuCisJCQkJLy8gSXQgbWF5IHRha2UgdXAgdG8gNzAwIG1pbGxpc2Vjb25kcy4KKwkJCQlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcyICYgUE9SX0RFQlVHX1BPUlQpIHsKKwkJCQkJaWlEZWxheShwQiwgNzAwKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gSUlfRE9XTl9HT09EOworCisJCQljYXNlIExPQURXQVJFX0JBRDoKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIElJX0RPV05fQkFEOworCQkJfQorCQl9CisKKwkJaWlEZWxheShwQiwgMTApOyAgICAgIC8vIDEwIG1TIGdyYW51bGFyaXR5IG9uIGNoZWNraW5nIGNvbmRpdGlvbgorCX0KKworCS8vIERyb3AtdGhyb3VnaCAtLT4gdGltZWQgb3V0IHdhaXRpbmcgZm9yIGZpcm13YXJlIGNvbmZpcm1hdGlvbgorCisJcEItPmkyZVN0YXRlID0gSUlfU1RBVEVfQkFETE9BRDsKKwlyZXR1cm4gSUlfRE9XTl9USU1FT1VUOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlEb3dubG9hZEFsbChwQiwgcFNvdXJjZSwgaXNTdGFuZGFyZCwgc2l6ZSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgcFNvdXJjZSAgICAtIGxvYWR3YXJlIGJsb2NrIHRvIGRvd25sb2FkCisvLyAgICAgICAgICAgICBpc1N0YW5kYXJkIC0gVHJ1ZSBpZiAic3RhbmRhcmQiIGxvYWR3YXJlLCBlbHNlIGZhbHNlLgorLy8gICAgICAgICAgICAgc2l6ZSAgICAgICAtIHNpemUgb2YgZGF0YSB0byBkb3dubG9hZCAoaW4gYnl0ZXMpCisvLworLy8gUmV0dXJuczogICAgU3VjY2VzcyBvciBGYWlsdXJlCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGEgYm9hcmQgc3RydWN0dXJlLCBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBzb21lCisvLyBsb2Fkd2FyZSwgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkIHRoZSAic3RhbmRhcmQgbG9hZHdhcmUiLCBhbmQgdGhlIHNpemUgb2YKKy8vIHRoZSBhcnJheSBpbiBieXRlcyBsb2FkcyB0aGUgZW50aXJlIGFycmF5IHRvIHRoZSBib2FyZCBhcyBsb2Fkd2FyZS4KKy8vCisvLyBBc3N1bWVzIHRoZSBib2FyZCBoYXMgYmVlbiBmcmVzaGx5IHJlc2V0IGFuZCB0aGUgcG93ZXItdXAgcmVzZXQgbWVzc2FnZSByZWFkLgorLy8gKGkuZS4sIGluIElJX1NUQVRFX1JFQURZKS4gQ29tcGxhaW5zIGlmIHN0YXRlIGlzIGJhZCwgb3IgaWYgdGhlcmUgc2VlbXMgdG8gYmUKKy8vIHRvbyBtdWNoIG9yIHRvbyBsaXR0bGUgZGF0YSB0byBsb2FkLCBvciBpZiBpaURvd25sb2FkQmxvY2sgY29tcGxhaW5zLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpRG93bmxvYWRBbGwoaTJlQm9yZFN0clB0ciBwQiwgbG9hZEhkclN0clB0ciBwU291cmNlLCBpbnQgaXNTdGFuZGFyZCwgaW50IHNpemUpCit7CisJaW50IHN0YXR1czsKKworCS8vIFdlIGtub3cgKGZyb20gY29udGV4dCkgYm9hcmQgc2hvdWxkIGJlIHJlYWR5IGZvciB0aGUgZmlyc3QgYmxvY2sgb2YKKwkvLyBkb3dubG9hZC4gIENvbXBsYWluIGlmIG5vdC4KKwlpZiAocEItPmkyZVN0YXRlICE9IElJX1NUQVRFX1JFQURZKSByZXR1cm4gSUlfRE9XTl9CQURTVEFURTsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlzaXplIC09IExPQURXQVJFX0JMT0NLX1NJWkU7CS8vIEhvdyBtdWNoIGRhdGEgc2hvdWxkIHRoZXJlIGJlIGxlZnQgdG8KKwkJCQkJCQkJCQkvLyBsb2FkIGFmdGVyIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uID8KKworCQkvLyBOb3RlIHdlIGp1c3QgYnVtcCBwU291cmNlIGJ5ICJvbmUiLCBiZWNhdXNlIGl0cyBzaXplIGlzIGFjdHVhbGx5IHRoYXQKKwkJLy8gb2YgYW4gZW50aXJlIGJsb2NrLCBzYW1lIGFzIExPQURXQVJFX0JMT0NLX1NJWkUuCisJCXN0YXR1cyA9IGlpRG93bmxvYWRCbG9jayhwQiwgcFNvdXJjZSsrLCBpc1N0YW5kYXJkKTsKKworCQlzd2l0Y2goc3RhdHVzKQorCQl7CisJCWNhc2UgSUlfRE9XTl9HT09EOgorCQkJcmV0dXJuICggKHNpemUgPiAwKSA/IElJX0RPV05fT1ZFUiA6IElJX0RPV05fR09PRCk7CisKKwkJY2FzZSBJSV9ET1dOX0NPTlRJTlVJTkc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCS8vIFdlIHNob3VsZG4ndCBkcm9wIG91dDogaXQgbWVhbnMgIndoaWxlIiBjYXVnaHQgdXMgd2l0aCBub3RoaW5nIGxlZnQgdG8KKwkvLyBkb3dubG9hZCwgeWV0IHRoZSBwcmV2aW91cyBEb3dubG9hZEJsb2NrIGRpZCBub3QgcmV0dXJuIGNvbXBsZXRlLiBFcmdvLAorCS8vIG5vdCBlbm91Z2ggZGF0YSB0byBtYXRjaCB0aGUgc2l6ZSBieXRlIGluIHRoZSBoZWFkZXIuCisJcmV0dXJuIElJX0RPV05fVU5ERVI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGIwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuaApAQCAtMCwwICsxLDYxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IE1haW5saW5lIGNvZGUgZm9yIHRoZSBkZXZpY2UgZHJpdmVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGkyZWxsaXMuaAorLy8KKy8vIEludGVsbGlQb3J0LUlJIGFuZCBJbnRlbGxpUG9ydC1JSUVYCisvLworLy8gRXh0cmVtZWx5CisvLyBMb3cKKy8vIExldmVsCisvLyBJbnRlcmZhY2UKKy8vIFNlcnZpY2VzCisvLworLy8gU3RydWN0dXJlIERlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZm9yICJFTExJUyIgc2VydmljZSByb3V0aW5lcyBmb3VuZCBpbgorLy8gaTJlbGxpcy5jCisvLworLy8gVGhlc2Ugcm91dGluZXMgYXJlIGJhc2VkIG9uIHByb3BlcnRpZXMgb2YgdGhlIEludGVsbGlQb3J0LUlJIGFuZCAtSUlFWAorLy8gaGFyZHdhcmUgYW5kIGJvb3RzdHJhcCBmaXJtd2FyZSwgYW5kIGFyZSBub3Qgc2Vuc2l0aXZlIHRvIHBhcnRpY3VsYXIKKy8vIGNvbnZlbnRpb25zIG9mIGFueSBwYXJ0aWN1bGFyIGxvYWR3YXJlLgorLy8KKy8vIFVubGlrZSBpMmh3LmgsIHdoaWNoIHByb3ZpZGVzIElST05DTEFEIGhhcmR3YXJlIGRlZmluaXRpb25zLCB0aGUgbWF0ZXJpYWwKKy8vIGhlcmUgYW5kIGluIGkyZWxsaXMuYyBpcyBpbnRlbmRlZCB0byBwcm92aWNlIGEgdXNlZnVsLCBidXQgbm90IHJlcXVpcmVkLAorLy8gbGF5ZXIgb2YgaW5zdWxhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZSBzcGVjaWZpY3MuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmbmRlZiAgSTJFTExJU19IICAgLyogVG8gcHJldmVudCBtdWx0aXBsZSBpbmNsdWRlcyAqLworI2RlZmluZSAgSTJFTExJU19IICAgMQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMzAgU2VwdGVtYmVyIDE5OTEgTUFHIEZpcnN0IERyYWZ0IFN0YXJ0ZWQKKy8vIDEyIE9jdG9iZXIgICAxOTkxIC4uLmNvbnRpbnVlZC4uLgorLy8KKy8vIDIwIERlY2VtYmVyICAxOTk2IEFLTSBMaW51eCB2ZXJzaW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5kYXRvcnkgSW5jbHVkZXM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJpcDJ0eXBlcy5oIgorI2luY2x1ZGUgImkyaHcuaCIgICAgICAgLy8gVGhlIGhhcmR3YXJlIGRlZmluaXRpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTVEFUX0JPWElEUyBwYWNrZXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNQVhfQk9YCQk0CisKK3R5cGVkZWYgc3RydWN0IF9iaWRTdGF0Cit7CisJdW5zaWduZWQgY2hhciBiaWRfdmFsdWVbTUFYX0JPWF07Cit9IGJpZFN0YXQsICpiaWRTdGF0UHRyOworCisvLyBUaGlzIHBhY2tldCBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ01EX0dFVF9CT1hJRFMgYnlwYXNzIGNvbW1hbmQuIEZvciAtSUlFWAorLy8gYm9hcmRzLCByZXBvcnRzIHRoZSBoYXJkd2FyZS1zcGVjaWZpYyAiYXN5bmNocm9ub3VzIHJlc291cmNlIHJlZ2lzdGVyIiBvbgorLy8gZWFjaCBleHBhbnNpb24gYm94LiBCb3hlcyBub3QgcHJlc2VudCByZXBvcnQgMHhmZi4gRm9yIC1JSSBib2FyZHMsIHRoZSBmaXJzdAorLy8gZWxlbWVudCBjb250YWlucyAweDgwIGZvciA4LXBvcnQsIDB4NDAgZm9yIDQtcG9ydCBib2FyZHMuCisKKy8vIEJveCBJRHMgYWthIEFSUiBvciBBc3luYyBSZXNvdXJjZSBSZWdpc3RlciAobW9yZSB0aGFuIHlvdSB3YW50IHRvIGtub3cpCisvLyAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisvLyAgIEYgICBGICAgTiAgIE4gICBMICAgUyAgIFMgICBTCisvLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEYgICBGICAgLSAgUHJvZHVjdCBGYW1pbHkgRGVzaWduYXRvcgorLy8gICA9PT09PSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKy8vICAgMCAgIDAgICAtICBJbnRlbGxpcG9ydCBJSSBFWCAvIElTQS04CisvLyAgIDEgICAwICAgLSAgSW50ZWxsaVNlcnZlcgorLy8gICAwICAgMSAgIC0gIFNBQyAtIFBvcnQgRGV2aWNlIChJbnRlbGxpcG9ydCBJSUkgPz8/ICkKKy8vICAgICAgICAgICA9PT09PSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworLy8gICAgICAgICAgIE4gICBOICAgLSAgTnVtYmVyIG9mIFBvcnRzCisvLyAgICAgICAgICAgMCAgIDAgICAtICA4ICAoZWlnaHQpCisvLyAgICAgICAgICAgMCAgIDEgICAtICA0ICAoZm91cikKKy8vICAgICAgICAgICAxICAgMCAgIC0gIDEyICh0d2VsdmUpCisvLyAgICAgICAgICAgMSAgIDEgICAtICAxNiAoc2l4dGVlbikKKy8vICAgICAgICAgICAgICAgICAgID0rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisvLyAgICAgICAgICAgICAgICAgICBMICAtICAgTENEIERpc3BsYXkgTW9kdWxlIFByZXNlbnQKKy8vICAgICAgICAgICAgICAgICAgIDAgIC0gICBObworLy8gICAgICAgICAgICAgICAgICAgMSAgLSAgIExDRCBtb2R1bGUgcHJlc2VudAorLy8gICAgICAgICAgICAgICAgICAgPT09PT09PT09KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworLy8gICAgICAgICAgICAgICAgICAgICAgUyAgIFMgICBTIC0gQXN5bmMgU2lnbmFscyBTdXBwb3J0ZWQgRGVzaWduYXRvcgorLy8gICAgICAgICAgICAgICAgICAgICAgMCAgIDAgICAwIC0gOGRzcywgTW9kIERDRSBEQjI1IEZlbWFsZQorLy8gICAgICAgICAgICAgICAgICAgICAgMCAgIDAgICAxIC0gNmRzcywgUkotNDUKKy8vICAgICAgICAgICAgICAgICAgICAgIDAgICAxICAgMCAtIFJTLTIzMi80MjIgZHNzLCBEQjI1IEZlbWFsZQorLy8gICAgICAgICAgICAgICAgICAgICAgMCAgIDEgICAxIC0gUlMtMjMyLzQyMiBkc3MsIHNlcGFyYXRlIDIzMi80MjIgREIyNSBGZW1hbGUKKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAwICAgMCAtIDZkc3MsIDkyMS42IEkvRiB3aXRoIFNUNjU0J3MKKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAwICAgMSAtIFJTLTQyMy8yMzIgOGRzcywgUkotNDUgMTBQaW4KKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAxICAgMCAtIDZkc3MsIE1vZCBEQ0UgREIyNSBGZW1hbGUKKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAxICAgMSAtIE5PIEJPWCBQUkVTRU5UCisKKyNkZWZpbmUgRkYoYykJKChjICYgMHhDMCkgPj4gNikKKyNkZWZpbmUgTk4oYykJKChjICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUgTChjKQkoKGMgJiAweDA4KSA+PiAzKQorI2RlZmluZSBTU1MoYykJIChjICYgMHgwNykKKworI2RlZmluZSBCSURfSEFTXzY1NCh4KQkoU1NTKHgpID09IDB4MDQpCisjZGVmaW5lIEJJRF9OT19CT1gJMHhmZiAvKiBubyBib3ggKi8KKyNkZWZpbmUgQklEXzhQT1JUICAJMHg4MCAvKiBJUDItOCBwb3J0ICovCisjZGVmaW5lIEJJRF80UE9SVCAgIAkweDgxIC8qIElQMi00IHBvcnQgKi8KKyNkZWZpbmUgQklEX0VYUF9NQVNLICAgCTB4MzAgLyogSVAyLUVYICAqLworI2RlZmluZSBCSURfRVhQXzhQT1JUCTB4MDAgLyogICAgIDgsICovCisjZGVmaW5lIEJJRF9FWFBfNFBPUlQJMHgxMCAvKiAgICAgNCwgKi8KKyNkZWZpbmUgQklEX0VYUF9VTkRFRgkweDIwIC8qICAgICBVTkRFRiwgKi8KKyNkZWZpbmUgQklEX0VYUF8xNlBPUlQJMHgzMCAvKiAgICAxNiwgKi8KKyNkZWZpbmUgQklEX0xDRF9DVFJMICAgCTB4MDggLyogTENEIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQklEX0xDRF9OT05FCTB4MDAgLyogLSBubyBjb250cm9sbGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgQklEX0xDRF9QUkVTICAgCTB4MDggLyogLSBjb250cm9sbGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgQklEX0NPTl9NQVNLCTB4MDcgLyogLSBjb25uZWN0b3IgcGlub3V0cyAqLworI2RlZmluZSBCSURfQ09OX0RCMjUJMHgwMCAvKiAtIERCLTI1IEYgKi8KKyNkZWZpbmUgQklEX0NPTl9SSjQ1CTB4MDEgLyogLSByajQ1ICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpMmVCb3JkU3RyCisvLworLy8gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGUgRUxMSVMgcm91dGluZXMgcmVxdWlyZSBpbgorLy8gZGVhbGluZyB3aXRoIGEgcGFydGljdWxhciBib2FyZC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGVyZSBhcmUgc29tZSBxdWV1ZXMgaGVyZSB3aGljaCBhcmUgZ3VhcmFudGVlZCB0byBuZXZlciBjb250YWluIHRoZSBlbnRyeQorLy8gZm9yIGEgc2luZ2xlIGNoYW5uZWwgdHdpY2UuIFNvIHRoZXkgbXVzdCBiZSBzbGlnaHRseSBsYXJnZXIgdG8gYWxsb3cKKy8vIHVuYW1iaWd1b3VzIGZ1bGwvZW1wdHkgbWFuYWdlbWVudAorLy8KKyNkZWZpbmUgQ0hfUVVFVUVfU0laRSBBQlNfTU9TVF9QT1JUUysyCisKK3R5cGVkZWYgc3RydWN0IF9pMmVCb3JkU3RyCit7CisJcG9yU3RyICAgICAgICAgaTJlUG9tOwkvLyBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcG93ZXItb24gbWVzc2FnZS4KKworCXVuc2lnbmVkIHNob3J0IGkyZVBvbVNpemU7CisJCQkJCQkvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgaWYKKwkJCQkJCS8vIGRpZmZlcmVudCBmcm9tIHNpemVvZiBpMmVQb20sIGluZGljYXRlcworCQkJCQkJLy8gdGhlcmUgaXMgYW4gZXJyb3IhCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVTdGFydE1haWw7CisJCQkJCQkvLyBDb250YWlucyB3aGF0ZXZlciBpbmJvdW5kIG1haWxib3ggZGF0YQorCQkJCQkJLy8gcHJlc2VudCBhdCBzdGFydHVwLiBOT19NQUlMX0hFUkUgaW5kaWNhdGVzCisJCQkJCQkvLyBub3RoaW5nIHdhcyBwcmVzZW50LiBObyBzcGVjaWFsCisJCQkJCQkvLyBzaWduaWZpY2FuY2UgYXMgb2YgdGhpcyB3cml0aW5nLCBidXQgbWF5IGJlCisJCQkJCQkvLyB1c2VmdWwgZm9yIGRpYWdub3N0aWMgcmVhc29ucy4KKworCXVuc2lnbmVkIHNob3J0IGkyZVZhbGlkOworCQkJCQkJLy8gSW5kaWNhdGVzIHZhbGlkaXR5IG9mIHRoZSBzdHJ1Y3R1cmU7IGlmCisJCQkJCQkvLyBpMmVWYWxpZCA9PSBJMkVfTUFHSUMsIHRoZW4gd2UgY2FuIHRydXN0CisJCQkJCQkvLyB0aGUgb3RoZXIgZmllbGRzLiBTb21lIChlc3BlY2lhbGx5CisJCQkJCQkvLyBpbml0aWFsaXphdGlvbikgZnVuY3Rpb25zIGFyZSBnb29kIGFib3V0CisJCQkJCQkvLyBjaGVja2luZyBmb3IgdmFsaWRpdHkuICBNYW55IGZ1bmN0aW9ucyBkbworCQkJCQkJLy8gbm90LCBpdCBiZWluZyBhc3N1bWVkIHRoYXQgdGhlIGxhcmdlcgorCQkJCQkJLy8gY29udGV4dCBhc3N1cmVzIHdlIGFyZSB1c2luZyBhIHZhbGlkCisJCQkJCQkvLyBpMmVCb3JkU3RyUHRyLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRXJyb3I7CisJCQkJCQkvLyBVc2VkIGZvciByZXR1cm5pbmcgYW4gZXJyb3IgY29uZGl0aW9uIGZyb20KKwkJCQkJCS8vIHNldmVyYWwgZnVuY3Rpb25zIHdoaWNoIHVzZSBpMmVCb3JkU3RyUHRyCisJCQkJCQkvLyBhcyBhbiBhcmd1bWVudC4KKworCS8vIEFjY2VsZXJhdG9ycyB0byBjaGFyYWN0ZXJpemUgc2VwYXJhdGUgZmVhdHVyZXMgb2YgYSBib2FyZCwgZGVyaXZlZCBmcm9tIGEKKwkvLyBudW1iZXIgb2Ygc291cmNlcy4KKworCXVuc2lnbmVkIHNob3J0IGkyZUZpZm9TaXplOworCQkJCQkJLy8gQWx3YXlzLCB0aGUgc2l6ZSBvZiB0aGUgRklGTy4gRm9yCisJCQkJCQkvLyBJbnRlbGxpUG9ydC1JSSwgYWx3YXlzIHRoZSBzYW1lLCBmb3IgLUlJRVgKKwkJCQkJCS8vIHRha2VuIGZyb20gdGhlIFBvd2VyLU9uIHJlc2V0IG1lc3NhZ2UuCisKKwl2b2xhdGlsZSAKKwl1bnNpZ25lZCBzaG9ydCBpMmVGaWZvUmVtYWluczsKKwkJCQkJCS8vIFVzZWQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gaW5kaWNhdGUgYQorCQkJCQkJLy8gbG93ZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoCisJCQkJCQkvLyBtaWdodCBiZSBpbiB0aGUgb3V0Ym91bmQgZmlmby4KKworCXVuc2lnbmVkIGNoYXIgIGkyZUZpZm9TdHlsZTsKKwkJCQkJCS8vIEFjY2VsZXJhdG9yIHdoaWNoIHRlbGxzIHdoaWNoIHN0eWxlICgtSUkgb3IKKwkJCQkJCS8vIC1JSUVYKSBGSUZPIHdlIGFyZSB1c2luZy4KKworCXVuc2lnbmVkIGNoYXIgIGkyZURhdGFXaWR0aDE2OworCQkJCQkJLy8gQWNjZWxlcmF0b3Igd2hpY2ggdGVsbHMgd2hldGhlciB3ZSBzaG91bGQKKwkJCQkJCS8vIGRvIDggb3IgMTYtYml0IGRhdGEgdHJhbnNmZXJzLgorCisJdW5zaWduZWQgY2hhciAgaTJlTWF4SXJxOworCQkJCQkJLy8gVGhlIGhpZ2hlc3QgYWxsb3dhYmxlIElSUSwgYmFzZWQgb24gdGhlCisJCQkJCQkvLyBzbG90IHNpemUuCisKKwl1bnNpZ25lZCBjaGFyICBpMmVDaGFuZ2VJcnE7CisJCQkJCQkvLyBXaGV0aGVyIHRpcyB2YWxpZCB0byBjaGFuZ2UgSVJRJ3MKKwkJCQkJCS8vIElTQSA9IG9rLCBFSVNBLCBNaWNyb0NoYW5uZWwsIG5vCisKKwkvLyBBY2NlbGVyYXRvcnMgZm9yIHZhcmlvdXMgYWRkcmVzc2VzIG9uIHRoZSBib2FyZAorCWludCAgICAgICAgICAgIGkyZUJhc2U7ICAgICAgICAvLyBJL08gQWRkcmVzcyBvZiB0aGUgQm9hcmQKKwlpbnQgICAgICAgICAgICBpMmVEYXRhOyAgICAgICAgLy8gRnJvbSBoZXJlIGRhdGEgdHJhbnNmZXJzIGhhcHBlbgorCWludCAgICAgICAgICAgIGkyZVN0YXR1czsgICAgICAvLyBGcm9tIGhlcmUgc3RhdHVzIHJlYWRzIGhhcHBlbgorCWludCAgICAgICAgICAgIGkyZVBvaW50ZXI7ICAgICAvLyAoSW50ZWxsaVBvcnQtSUk6IHBvaW50ZXIvY29tbWFuZHMpCisJaW50ICAgICAgICAgICAgaTJlWE1haWw7ICAgICAgIC8vIChJbnRlbGxpUE9ydC1JSUVYOiBtYWlsYm94ZXMKKwlpbnQgICAgICAgICAgICBpMmVYTWFzazsgICAgICAgLy8gKEludGVsbGlQb3J0LUlJRVg6IG1hc2sgd3JpdGUKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEluZm9ybWF0aW9uIHByZXNlbnRlZCBpbiBhIGNvbW1vbiBmb3JtYXQgYWNyb3NzIGJvYXJkcworCS8vIEZvciBlYWNoIGJveCwgYml0IG1hcCBvZiB0aGUgY2hhbm5lbHMgcHJlc2VudC4gIEJveCBjbG9zZXN0IHRvIAorCS8vIHRoZSBob3N0IGlzIGJveCAwLiBMU0IgaXMgY2hhbm5lbCAwLiBJbnRlbGxpUG9ydC1JSSAobm9uLWV4cGFuZGFibGUpCisJLy8gaXMgdGFrZW4gdG8gYmUgYm94IDAuIFRoZXNlIGFyZSBkZXJpdmVkIGZyb20gcHJvZHVjdCBpLmQuIHJlZ2lzdGVycy4KKworCXVuc2lnbmVkIHNob3J0IGkyZUNoYW5uZWxNYXBbQUJTX01BWF9CT1hFU107CisKKwkvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgZWFjaCBpcyBkZXJpdmVkIGZyb20gZmlybXdhcmUgYXR0ZW1wdGluZyB0byBkZXRlY3QKKwkvLyB0aGUgdWFydCBwcmVzZW5jZSAoYnkgcmVhZGluZyBhIHZhbGlkIEdGUkNSIHJlZ2lzdGVyKS4gSWYgYml0cyBhcmUgc2V0IGluCisJLy8gaTJlQ2hhbm5lbE1hcCBhbmQgbm90IGluIGkyZUdvb2RNYXAsIHRoZXJlIGlzIGEgcG90ZW50aWFsIHByb2JsZW0uCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVHb29kTWFwW0FCU19NQVhfQk9YRVNdOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRm9yIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGxzCisKKwkvLyBSb3V0aW5lIHRvIGNhdXNlIGFuIE4tbWlsbGlzZWNvbmQgZGVsYXk6IFBhdGNoZWQgYnkgdGhlIGlpMkluaXRpYWxpemUKKwkvLyBmdW5jdGlvbi4KKworCXZvaWQgICgqaTJlRGVsYXkpKHVuc2lnbmVkIGludCk7CisKKwkvLyBSb3V0aW5lIHRvIHdyaXRlIE4gYnl0ZXMgdG8gdGhlIGJvYXJkIHRocm91Z2ggdGhlIEZJRk8uIFJldHVybnMgdHJ1ZSBpZgorCS8vIGFsbCBjb3BhY2V0aWMsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBlcnJvciBpcyBpbiBpMmVFcnJvciBmaWVsZC4KKwkvLyBJRiBDT1VOVCBJUyBPREQsIFJPVU5EUyBVUCBUTyBUSEUgTkVYVCBFVkVOIE5VTUJFUi4KKworCWludCAgICgqaTJlV3JpdGVCdWYpKHN0cnVjdCBfaTJlQm9yZFN0ciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKKwkvLyBSb3V0aW5lIHRvIHJlYWQgTiBieXRlcyBmcm9tIHRoZSBib2FyZCB0aHJvdWdoIHRoZSBGSUZPLiBSZXR1cm5zIHRydWUgaWYKKwkvLyBjb3BhY2V0aWMsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBlcnJvciBpbiBpMmVFcnJvci4KKwkvLyBJRiBDT1VOVCBJUyBPREQsIFJPVU5EUyBVUCBUTyBUSEUgTkVYVCBFVkVOIE5VTUJFUi4KKworCWludCAgICgqaTJlUmVhZEJ1Zikoc3RydWN0IF9pMmVCb3JkU3RyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworCS8vIFJldHVybnMgYSB3b3JkIGZyb20gRklGTy4gV2lsbCB1c2UgMiBieXRlIG9wZXJhdGlvbnMgaWYgbmVlZGVkLgorCisJdW5zaWduZWQgc2hvcnQgKCppMmVSZWFkV29yZCkoc3RydWN0IF9pMmVCb3JkU3RyICopOworCisJLy8gV3JpdGVzIGEgd29yZCB0byBGSUZPLiBXaWxsIHVzZSAyIGJ5dGUgb3BlcmF0aW9ucyBpZiBuZWVkZWQuCisKKwl2b2lkICAoKmkyZVdyaXRlV29yZCkoc3RydWN0IF9pMmVCb3JkU3RyICosIHVuc2lnbmVkIHNob3J0KTsKKworCS8vIFdhaXRzIHNwZWNpZmllZCB0aW1lIGZvciB0aGUgVHJhbnNtaXQgRklGTyB0byBnbyBlbXB0eS4gUmV0dXJucyB0cnVlIGlmCisJLy8gIG9rLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gaTJlRXJyb3IuCisKKwlpbnQgICAoKmkyZVdhaXRGb3JUeEVtcHR5KShzdHJ1Y3QgX2kyZUJvcmRTdHIgKiwgaW50KTsKKworCS8vIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgb3V0Z29pbmcgbWFpbGJveCBpcyBlbXB0eS4KKworCWludCAgICgqaTJlVHhNYWlsRW1wdHkpKHN0cnVjdCBfaTJlQm9yZFN0ciAqKTsKKworCS8vIENoZWNrcyB3aGV0aGVyIG91dGdvaW5nIG1haWxib3ggaXMgZW1wdHkuICBJZiBzbywgc2VuZHMgbWFpbCBhbmQgcmV0dXJucworCS8vIHRydWUuICBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKworCWludCAgICgqaTJlVHJ5U2VuZE1haWwpKHN0cnVjdCBfaTJlQm9yZFN0ciAqLCB1bnNpZ25lZCBjaGFyKTsKKworCS8vIElmIG5vIG1haWwgYXZhaWxhYmxlLCByZXR1cm5zIE5PX01BSUxfSEVSRSwgZWxzZSByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUKKwkvLyBtYWlsYm94IChndWFyYW50ZWVkIGNhbid0IGJlIE5PX01BSUxfSEVSRSkuCisKKwl1bnNpZ25lZCBzaG9ydCAoKmkyZUdldE1haWwpKHN0cnVjdCBfaTJlQm9yZFN0ciAqKTsKKworCS8vIEVuYWJsZXMgdGhlIGJvYXJkIHRvIGludGVycnVwdCB0aGUgaG9zdCB3aGVuIGl0IHdyaXRlcyB0byB0aGUgbWFpbGJveC4KKwkvLyBJcnFzIHdpbGwgbm90IG9jY3VyLCBob3dldmVyLCB1bnRpbCB0aGUgbG9hZHdhcmUgc2VwYXJhdGVseSBlbmFibGVzCisJLy8gaW50ZXJydXB0IGdlbmVyYXRpb24gdG8gdGhlIGhvc3QuICBUaGUgc3RhbmRhcmQgbG9hZHdhcmUgZG9lcyB0aGlzIGluCisJLy8gcmVzcG9uc2UgdG8gYSBjb21tYW5kIHBhY2tldCBzZW50IGJ5IHRoZSBob3N0LiAoQWxzbywgZGlzYWJsZXMKKwkvLyBhbnkgb3RoZXIgcG90ZW50aWFsIGludGVycnVwdCBzb3VyY2VzIGZyb20gdGhlIGJvYXJkIC0tIG90aGVyIHRoYW4gdGhlCisJLy8gaW5ib3VuZCBtYWlsYm94KS4KKworCXZvaWQgICgqaTJlRW5hYmxlTWFpbElycSkoc3RydWN0IF9pMmVCb3JkU3RyICopOworCisJLy8gV3JpdGVzIGFuIGFyYml0cmFyeSB2YWx1ZSB0byB0aGUgbWFzayByZWdpc3Rlci4KKworCXZvaWQgICgqaTJlV3JpdGVNYXNrKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKiwgdW5zaWduZWQgY2hhcik7CisKKworCS8vIFN0YXRlIGluZm9ybWF0aW9uCisKKwkvLyBEdXJpbmcgZG93bmxvYWRpbmcsIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZW1haW5pbmcgdG8gZG93bmxvYWQKKwkvLyB0byB0aGUgYm9hcmQuCisKKwlzaG9ydCBpMmVUb0xvYWQ7CisKKwkvLyBTdGF0ZSBvZiBib2FyZCAoc2VlIG1hbmlmZXN0cyBiZWxvdykgKGUuZy4sIHdoZXRoZXIgaW4gcmVzZXQgY29uZGl0aW9uLAorCS8vIHdoZXRoZXIgc3RhbmRhcmQgbG9hZHdhcmUgaXMgaW5zdGFsbGVkLCBldGMuCisKKwl1bnNpZ25lZCBjaGFyICBpMmVTdGF0ZTsKKworCS8vIFRoZXNlIHRocmVlIGZpZWxkcyBhcmUgb25seSB2YWxpZCB3aGVuIHRoZXJlIGlzIGxvYWR3YXJlIHJ1bm5pbmcgb24gdGhlCisJLy8gYm9hcmQuIChpMmVTdGF0ZSA9PSBJSV9TVEFURV9MT0FERUQgb3IgaTJlU3RhdGUgPT0gSUlfU1RBVEVfU1RETE9BREVEICkKKworCXVuc2lnbmVkIGNoYXIgIGkyZUxWZXJzaW9uOyAgLy8gTG9hZHdhcmUgdmVyc2lvbgorCXVuc2lnbmVkIGNoYXIgIGkyZUxSZXZpc2lvbjsgLy8gTG9hZHdhcmUgcmV2aXNpb24KKwl1bnNpZ25lZCBjaGFyICBpMmVMU3ViOyAgICAgIC8vIExvYWR3YXJlIHN1YnJldmlzaW9uCisKKwkvLyBGbGFncyB3aGljaCBvbmx5IGhhdmUgbWVhbmluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgc3RhbmRhcmQgbG9hZHdhcmUuCisJLy8gU29tZXdoYXQgdmlvbGF0ZXMgdGhlIGxheWVyaW5nIGNvbmNlcHQsIGJ1dCB0aGVyZSBpcyBzbyBsaXR0bGUgYWRkaXRpb25hbAorCS8vIG5lZWRlZCBhdCB0aGUgYm9hcmQgbGV2ZWwgKHdoaWxlIG11Y2ggYWRkaXRpb25hbCBhdCB0aGUgY2hhbm5lbCBsZXZlbCksCisJLy8gdGhhdCB0aGlzIGJlYXRzIG1haW50YWluaW5nIHR3byBkaWZmZXJlbnQgcGVyLWJvYXJkIHN0cnVjdHVyZXMuCisKKwkvLyBJbmRpY2F0ZXMgd2hpY2ggSVJRIHRoZSBib2FyZCBoYXMgYmVlbiBpbml0aWFsaXplZCAoZnJvbSBzb2Z0d2FyZSkgdG8gdXNlCisJLy8gRm9yIE1pY3JvQ2hhbm5lbCBib2FyZHMsIGFueSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSBJUlFfVU5ERUZJTkVEIG1lYW5zCisJLy8gdGhhdCB0aGUgc29mdHdhcmUgY29tbWFuZCBoYXMgYmVlbiBzZW50IHRvIGVuYWJsZSBpbnRlcnJ1cHRzIChvciBzcGVjaWZ5CisJLy8gdGhleSBhcmUgZGlzYWJsZWQpLiBTcGVjaWFsIHZhbHVlOiBJUlFfVU5ERUZJTkVEIGluZGljYXRlcyB0aGF0IHRoZQorCS8vIHNvZnR3YXJlIGNvbW1hbmQgdG8gc2VsZWN0IHRoZSBpbnRlcnJ1cHQgaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCB0aGVyZWZvcmUKKwkvLyAoc2luY2UgdGhlIHN0YW5kYXJkIGxvYWR3YXJlIGluc2lzdHMgdGhhdCBpdCBiZSBzZW50IGJlZm9yZSBhbnkgb3RoZXIKKwkvLyBwYWNrZXRzIGFyZSBzZW50KSBubyBvdGhlciBwYWNrZXRzIHNob3VsZCBiZSBzZW50IHlldC4KKworCXVuc2lnbmVkIHNob3J0IGkyZVVzaW5nSXJxOworCisJLy8gVGhpcyBpcyBzZXQgd2hlbiB3ZSBoaXQgdGhlIE1CX09VVF9TVFVGRkVEIG1haWxib3gsIHdoaWNoIHByZXZlbnRzIHVzCisJLy8gcHV0dGluZyBtb3JlIGluIHRoZSBtYWlsYm94IHVudGlsIGFuIGFwcHJvcHJpYXRlIG1haWxib3ggbWVzc2FnZSBpcworCS8vIHJlY2VpdmVkLgorCisJdW5zaWduZWQgY2hhciAgaTJlV2FpdGluZ0ZvckVtcHR5RmlmbzsKKworCS8vIEFueSBtYWlsYm94IGJpdHMgd2FpdGluZyB0byBiZSBzZW50IHRvIHRoZSBib2FyZCBhcmUgT1InZWQgaW4gaGVyZS4KKworCXVuc2lnbmVkIGNoYXIgIGkyZU91dE1haWxXYWl0aW5nOworCisJLy8gVGhlIGhlYWQgb2YgYW55IGluY29taW5nIHBhY2tldCBpcyByZWFkIGludG8gaGVyZSwgaXMgdGhlbiBleGFtaW5lZCBhbmQgCisJLy8gd2UgZGlzcGF0Y2ggYWNjb3JkaW5nbHkuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVMZWFkb2ZmV29yZFsxXTsKKworCS8vIFJ1bm5pbmcgY291bnRlciBvZiBpbnRlcnJ1cHRzIHdoZXJlIHRoZSBtYWlsYm94IGluZGljYXRlZCBpbmNvbWluZyBkYXRhLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRmlmb0luSW50czsKKworCS8vIFJ1bm5pbmcgY291bnRlciBvZiBpbnRlcnJ1cHRzIHdoZXJlIHRoZSBtYWlsYm94IGluZGljYXRlZCBvdXRnb2luZyBkYXRhCisJLy8gaGFkIGJlZW4gc3RyaXBwZWQuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVGaWZvT3V0SW50czsKKworCS8vIElmIG5vdCB2b2lkLCBnaXZlcyB0aGUgYWRkcmVzcyBvZiBhIHJvdXRpbmUgdG8gY2FsbCBpZiBmYXRhbCBib2FyZCBlcnJvcgorCS8vIGlzIGZvdW5kIChvbmx5IGFwcGxpZXMgdG8gc3RhbmRhcmQgbC93KS4KKworCXZvaWQgICgqaTJlRmF0YWxUcmFwKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKik7CisKKwkvLyBXaWxsIHBvaW50IHRvIGFuIGFycmF5IG9mIHNvbWUgc29ydCBvZiBjaGFubmVsIHN0cnVjdHVyZXMgKHdob3NlIGZvcm1hdAorCS8vIGlzIHVua25vd24gYXQgdGhpcyBsZXZlbCwgYmVpbmcgYSBmdW5jdGlvbiBvZiB3aGF0IGxvYWR3YXJlIGlzCisJLy8gaW5zdGFsbGVkIGFuZCB0aGUgY29kZSBjb25maWd1cmF0aW9uIChtYXggc2l6ZXMgb2YgYnVmZmVycywgZXRjLikpLgorCisJdm9pZCAgKmkyZUNoYW5uZWxQdHI7CisKKwkvLyBTZXQgaW5kaWNhdGVzIHRoYXQgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRmF0YWw7CisKKwkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHBvaW50ZWQgdG8gYnkgaTJlQ2hhbm5lbFB0ci4KKworCXVuc2lnbmVkIHNob3J0IGkyZUNoYW5uZWxDbnQ7CisKKwkvLyBSaW5nLWJ1ZmZlcnMgb2YgY2hhbm5lbCBzdHJ1Y3R1cmVzIHdob3NlIGNoYW5uZWxzIGhhdmUgcGFydGljdWxhciBuZWVkcy4KKworCXJ3bG9ja190CUZidWZfc3BpbmxvY2s7CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBzaG9ydCBpMkZidWZfc3RyaXA7CS8vIFN0cmlwIGluZGV4CisJdm9sYXRpbGUgCisJdW5zaWduZWQgc2hvcnQgaTJGYnVmX3N0dWZmOwkvLyBTdHVmZiBpbmRleAorCXZvaWQgICppMkZidWZbQ0hfUVVFVUVfU0laRV07CS8vIEFuIGFycmF5IG9mIGNoYW5uZWwgcG9pbnRlcnMKKwkJCQkJCQkJCS8vIG9mIGNoYW5uZWxzIHdobyBuZWVkIHRvIHNlbmQKKwkJCQkJCQkJCS8vIGZsb3cgY29udHJvbCBwYWNrZXRzLgorCXJ3bG9ja190CURidWZfc3BpbmxvY2s7CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBzaG9ydCBpMkRidWZfc3RyaXA7CS8vIFN0cmlwIGluZGV4CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBzaG9ydCBpMkRidWZfc3R1ZmY7CS8vIFN0dWZmIGluZGV4CisJdm9pZCAgKmkyRGJ1ZltDSF9RVUVVRV9TSVpFXTsJLy8gQW4gYXJyYXkgb2YgY2hhbm5lbCBwb2ludGVycworCQkJCQkJCQkJLy8gb2YgY2hhbm5lbHMgd2hvIG5lZWQgdG8gc2VuZAorCQkJCQkJCQkJLy8gZGF0YSBvciBpbi1saW5lIGNvbW1hbmQgcGFja2V0cy4KKwlyd2xvY2tfdAlCYnVmX3NwaW5sb2NrOworCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJCYnVmX3N0cmlwOwkvLyBTdHJpcCBpbmRleAorCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJCYnVmX3N0dWZmOwkvLyBTdHVmZiBpbmRleAorCXZvaWQgICppMkJidWZbQ0hfUVVFVUVfU0laRV07CS8vIEFuIGFycmF5IG9mIGNoYW5uZWwgcG9pbnRlcnMKKwkJCQkJCQkJCS8vIG9mIGNoYW5uZWxzIHdobyBuZWVkIHRvIHNlbmQKKwkJCQkJCQkJCS8vIGJ5cGFzcyBjb21tYW5kIHBhY2tldHMuCisKKwkvKgorCSAqIEEgc2V0IG9mIGZsYWdzIHRvIGluZGljYXRlIHRoYXQgY2VydGFpbiBldmVudHMgaGF2ZSBvY2N1cnJlZCBvbiBhdCBsZWFzdAorCSAqIG9uZSBvZiB0aGUgcG9ydHMgb24gdGhpcyBib2FyZC4gV2UgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc3BpbgorCSAqIHRocm91Z2ggdGhlIGNoYW5uZWxzIGxvb2tpbmcgZm9yIGJyZWFrcywgZXRjLgorCSAqLworCWludAkJZ290X2lucHV0OworCWludAkJc3RhdHVzX2NoYW5nZTsKKwliaWRTdGF0CWNoYW5uZWxCdHlwZXM7CisKKwkvKgorCSAqIERlYnVnZ2luZyBjb3VudGVycywgZXRjLgorCSAqLworCXVuc2lnbmVkIGxvbmcgZGVidWdGbG93UXVldWVkOworCXVuc2lnbmVkIGxvbmcgZGVidWdJbmxpbmVRdWV1ZWQ7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z0RhdGFRdWV1ZWQ7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z0J5cGFzc1F1ZXVlZDsKKwl1bnNpZ25lZCBsb25nIGRlYnVnRmxvd0NvdW50OworCXVuc2lnbmVkIGxvbmcgZGVidWdJbmxpbmVDb3VudDsKKwl1bnNpZ25lZCBsb25nIGRlYnVnQnlwYXNzQ291bnQ7CisJCisJcndsb2NrX3QJcmVhZF9maWZvX3NwaW5sb2NrOworCXJ3bG9ja190CXdyaXRlX2ZpZm9fc3BpbmxvY2s7CisKKy8vCUZvciBxdWV1aW5nIGludGVycnVwdCBib3R0b20gaGFsZiBoYW5kbGVycy4JL1wvXHw9bWh3PXxcL1wvCisJc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZV9pbnRlcnJ1cHQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgU2VuZFBlbmRpbmdUaW1lcjsgICAvLyBVc2VkIGJ5IGlpU2VuZFBlbmRpbmcKKwl1bnNpZ25lZCBpbnQJU2VuZFBlbmRpbmdSZXRyeTsKK30gaTJlQm9yZFN0ciwgKmkyZUJvcmRTdHJQdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm8gRGVmaW5pdGlvbnMgZm9yIHRoZSBpbmRpcmVjdCBjYWxscyBkZWZpbmVkIGluIHRoZSBpMmVCb3JkU3RyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisjZGVmaW5lIGlpRGVsYXkoYSxiKSAgICAgICAgICAoKihhKS0+aTJlRGVsYXkpKGIpCisjZGVmaW5lIGlpV3JpdGVCdWYoYSxiLGMpICAgICAoKihhKS0+aTJlV3JpdGVCdWYpKGEsYixjKQorI2RlZmluZSBpaVJlYWRCdWYoYSxiLGMpICAgICAgKCooYSktPmkyZVJlYWRCdWYpKGEsYixjKQorCisjZGVmaW5lIGlpV3JpdGVXb3JkKGEsYikgICAgICAoKihhKS0+aTJlV3JpdGVXb3JkKShhLGIpCisjZGVmaW5lIGlpUmVhZFdvcmQoYSkgICAgICAgICAoKihhKS0+aTJlUmVhZFdvcmQpKGEpCisKKyNkZWZpbmUgaWlXYWl0Rm9yVHhFbXB0eShhLGIpICgqKGEpLT5pMmVXYWl0Rm9yVHhFbXB0eSkoYSxiKQorCisjZGVmaW5lIGlpVHhNYWlsRW1wdHkoYSkgICAgICAoKihhKS0+aTJlVHhNYWlsRW1wdHkpKGEpCisjZGVmaW5lIGlpVHJ5U2VuZE1haWwoYSxiKSAgICAoKihhKS0+aTJlVHJ5U2VuZE1haWwpKGEsYikKKworI2RlZmluZSBpaUdldE1haWwoYSkgICAgICAgICAgKCooYSktPmkyZUdldE1haWwpKGEpCisjZGVmaW5lIGlpRW5hYmxlTWFpbElycShhKSAgICAoKihhKS0+aTJlRW5hYmxlTWFpbElycSkoYSkKKyNkZWZpbmUgaWlEaXNhYmxlTWFpbElycShhKSAgICgqKGEpLT5pMmVXcml0ZU1hc2spKGEsMCkKKyNkZWZpbmUgaWlXcml0ZU1hc2soYSxiKSAgICAgICgqKGEpLT5pMmVXcml0ZU1hc2spKGEsYikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5pZmVzdHMgZm9yIGkyZUJvcmRTdHI6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBZRVMgMQorI2RlZmluZSBOTyAgMAorCisjZGVmaW5lIE5VTExGVU5DICh2b2lkICgqKSh2b2lkKSkwCisjZGVmaW5lIE5VTExQVFIgKHZvaWQgKikwCisKK3R5cGVkZWYgdm9pZCAoKmRlbGF5RnVuY190KSh1bnNpZ25lZCBpbnQpOworCisvLyBpMmVWYWxpZAorLy8KKyNkZWZpbmUgSTJFX01BR0lDICAgICAgIDB4NDI1MSAgIC8vIFN0cnVjdHVyZSBpcyB2YWxpZC4KKyNkZWZpbmUgSTJFX0lOQ09NUExFVEUgIDB4MTEyMiAgIC8vIFN0cnVjdHVyZSBmYWlsZWQgZHVyaW5nIGluaXQuCisKKworLy8gaTJlRXJyb3IKKy8vCisjZGVmaW5lIEkyRUVfR09PRCAgICAgICAwCS8vIE9wZXJhdGlvbiBzdWNjZXNzZnVsCisjZGVmaW5lIEkyRUVfQkFEQUREUiAgICAxCS8vIEFkZHJlc3Mgb3V0IG9mIHJhbmdlCisjZGVmaW5lIEkyRUVfQkFEU1RBVEUgICAyCS8vIEF0dGVtcHQgdG8gcGVyZm9ybSBhIGZ1bmN0aW9uIHdoZW4gdGhlIGJvYXJkCisJCQkJCQkJLy8gc3RydWN0dXJlIHdhcyBpbiB0aGUgaW5jb3JyZWN0IHN0YXRlCisjZGVmaW5lIEkyRUVfQkFETUFHSUMgICAzCS8vIEJhZCBtYWdpYyBudW1iZXIgZnJvbSBQb3dlciBPbiB0ZXN0IChpMmVQb21TaXplCisJCQkJCQkJLy8gcmVmbGVjdHMgd2hhdCB3YXMgcmVhZAorI2RlZmluZSBJMkVFX1BPUk1fU0hPUlQgNAkvLyBQb3dlciBPbiBtZXNzYWdlIHRvbyBzaG9ydAorI2RlZmluZSBJMkVFX1BPUk1fTE9ORyAgNQkvLyBQb3dlciBPbiBtZXNzYWdlIHRvbyBsb25nCisjZGVmaW5lIEkyRUVfQkFEX0ZBTUlMWSA2CS8vIFVuLXN1cHBvcnRlZCBib2FyZCBmYW1pbHkgdHlwZQorI2RlZmluZSBJMkVFX0lOQ09OU0lTVCAgNwkvLyBGaXJtd2FyZSByZXBvcnRzIHNvbWV0aGluZyBpbXBvc3NpYmxlLAorCQkJCQkJCS8vIGUuZy4gdW5leHBlY3RlZCBudW1iZXIgb2YgcG9ydHMuLi4gQWxtb3N0IG5vCisJCQkJCQkJLy8gZXhjdXNlIG90aGVyIHRoYW4gYmFkIEZJRk8uLi4KKyNkZWZpbmUgSTJFRV9QT1NURVJSICAgIDgJLy8gUG93ZXItT24gc2VsZiB0ZXN0IHJlcG9ydGVkIGEgYmFkIGVycm9yCisjZGVmaW5lIEkyRUVfQkFEQlVTICAgICA5CS8vIFVua25vd24gQnVzIHR5cGUgZGVjbGFyZWQgaW4gbWVzc2FnZQorI2RlZmluZSBJMkVFX1RYRV9USU1FICAgMTAJLy8gVGltZWQgb3V0IHdhaXRpbmcgZm9yIFRYIEZpZm8gdG8gZW1wdHkKKyNkZWZpbmUgSTJFRV9JTlZBTElEICAgIDExCS8vIGkyZVZhbGlkIGZpZWxkIGRvZXMgbm90IGluZGljYXRlIGEgdmFsaWQgYW5kCisJCQkJCQkJLy8gY29tcGxldGUgYm9hcmQgc3RydWN0dXJlIChmb3IgZnVuY3Rpb25zIHdoaWNoCisJCQkJCQkJLy8gcmVxdWlyZSB0aGlzIGJlIHNvLikKKyNkZWZpbmUgSTJFRV9CQURfUE9SVCAgIDEyCS8vIERpc2NyZXBhbmN5IGJldHdlZW4gY2hhbm5lbHMgYWN0dWFsbHkgZm91bmQgYW5kCisJCQkJCQkJLy8gd2hhdCB0aGUgcHJvZHVjdCBpcyBzdXBwb3NlZCB0byBoYXZlLiBDaGVjaworCQkJCQkJCS8vIGkyZUdvb2RNYXAgdnMgaTJlQ2hhbm5lbE1hcCBmb3IgZGV0YWlscy4KKyNkZWZpbmUgSTJFRV9CQURfSVJRICAgIDEzCS8vIFNvbWVvbmUgc3BlY2lmaWVkIGFuIHVuc3VwcG9ydGVkIElSUQorI2RlZmluZSBJMkVFX05PQ0hBTk5FTFMgMTQJLy8gTm8gY2hhbm5lbCBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBkZWZpbmVkIChmb3IKKwkJCQkJCQkvLyBmdW5jdGlvbnMgcmVxdWlyaW5nIHRoaXMpLgorCisvLyBpMmVGaWZvU3R5bGUKKy8vCisjZGVmaW5lIEZJRk9fSUkgICAwICAvKiBJbnRlbGxpUG9ydC1JSSBzdHlsZTogc2VlIGFsc28gaTJody5oICovCisjZGVmaW5lIEZJRk9fSUlFWCAxICAvKiBJbnRlbGxpUG9ydC1JSUVYIHN0eWxlICovCisKKy8vIGkyZUdldE1haWwKKy8vCisjZGVmaW5lIE5PX01BSUxfSEVSRSAgICAweDExMTEJLy8gU2luY2UgbWFpbCBpcyB1bnNpZ25lZCBjaGFyLCBjYW5ub3QgcG9zc2libHkKKwkJCQkJCQkJLy8gcHJvbW90ZSB0byAweDExMTEuCisvLyBpMmVTdGF0ZQorLy8KKyNkZWZpbmUgSUlfU1RBVEVfQ09MRCAgICAgIDAgIC8vIEFkZHJlc3NlcyBoYXZlIGJlZW4gZGVmaW5lZCwgYnV0IGJvYXJkIG5vdCBldmVuCisJCQkJCQkJICAvLyByZXNldCB5ZXQuCisjZGVmaW5lIElJX1NUQVRFX1JFU0VUICAgICAxICAvLyBCb2FyZCxpZiBpdCBleGlzdHMsIGhhcyBqdXN0IGJlZW4gcmVzZXQKKyNkZWZpbmUgSUlfU1RBVEVfUkVBRFkgICAgIDIgIC8vIEJvYXJkIHJlYWR5IGZvciBpdHMgZmlyc3QgYmxvY2sKKyNkZWZpbmUgSUlfU1RBVEVfTE9BRElORyAgIDMgIC8vIEJvYXJkIGNvbnRpbnVpbmcgbG9hZAorI2RlZmluZSBJSV9TVEFURV9MT0FERUQgICAgNCAgLy8gQm9hcmQgaGFzIGZpbmlzaGVkIGxvYWQ6IHN0YXR1cyBvaworI2RlZmluZSBJSV9TVEFURV9CQURMT0FEICAgNSAgLy8gQm9hcmQgaGFzIGZpbmlzaGVkIGxvYWQ6IGZhaWxlZCEKKyNkZWZpbmUgSUlfU1RBVEVfU1RETE9BREVEIDYgIC8vIEJvYXJkIGhhcyBmaW5pc2hlZCBsb2FkOiBzdGFuZGFyZCBmaXJtd2FyZQorCisvLyBpMmVVc2luZ0lycQorLy8KKyNkZWZpbmUgSVJRX1VOREVGSU5FRCAgIDB4MTM1MiAgLy8gTm8gdmFsaWQgaXJxIChvciBwb2xsaW5nID0gMCkgY2FuIGV2ZXIKKwkJCQkJCQkJLy8gcHJvbW90ZSB0byB0aGlzIQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhbmR5IE1hY3JvcyBmb3IgaTJlbGxpcy5jIGFuZCBvdGhlcnMKKy8vIE5vdGUgdGhlc2UgYXJlIGNvbW1vbiB0byAtSUkgYW5kIC1JSUVYCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZSwgZG9lcyB0aGUgaW5wdXQgRklGTyBoYXZlIGFueSBkYXRhIG9yCisvLyBub3Q/CisvLworI2RlZmluZSBIQVNfSU5QVVQocEIpICAgICAgIShJTkIocEItPmkyZVN0YXR1cykgJiBTVF9JTl9FTVBUWSkKKyNkZWZpbmUgSEFTX05PX0lOUFVUKHBCKSAgIChJTkIocEItPmkyZVN0YXR1cykgJiBTVF9JTl9FTVBUWSkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZSwgcmVhZCBhIGJ5dGUgb3Igd29yZCBmcm9tIHRoZSBmaWZvCisvLworI2RlZmluZSBCWVRFX0ZST00ocEIpICAgICAgKHVuc2lnbmVkIGNoYXIpSU5CKHBCLT5pMmVEYXRhKQorI2RlZmluZSBXT1JEX0ZST00ocEIpICAgICAgKHVuc2lnbmVkIHNob3J0KUlOVyhwQi0+aTJlRGF0YSkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZSwgaXMgdGhlcmUgcm9vbSBmb3IgYW55IGRhdGEgdG8gYmUgd3JpdHRlbgorLy8gdG8gdGhlIGRhdGEgZmlmbz8KKy8vCisjZGVmaW5lIEhBU19PVVRST09NKHBCKSAgICAhKElOQihwQi0+aTJlU3RhdHVzKSAmIFNUX09VVF9GVUxMKQorI2RlZmluZSBIQVNfTk9fT1VUUk9PTShwQikgKElOQihwQi0+aTJlU3RhdHVzKSAmIFNUX09VVF9GVUxMKQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlLCB3cml0ZSBhIHNpbmdsZSBieXRlIHRvIHRoZSBmaWZvCisvLyBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCBmb3IgMTYtYml0IGludGVyZmFjZXMsIHRoZSBoaWdoIG9yZGVyIGJ5dGUgaXMgdW5kZWZpbmVkCisvLyBhbmQgdW5rbm93bi4KKy8vCisjZGVmaW5lIEJZVEVfVE8ocEIsIGMpICAgICBPVVRCKHBCLT5pMmVEYXRhLChjKSkKKworLy8gV3JpdGUgYSB3b3JkIHRvIHRoZSBmaWZvIHN0cnVjdHVyZS4gRm9yIDgtYml0IGludGVyZmFjZXMsIHRoaXMgbWF5IGhhdmUKKy8vIHVua25vd24gcmVzdWx0cy4KKy8vCisjZGVmaW5lIFdPUkRfVE8ocEIsIGMpICAgICBPVVRXKHBCLT5pMmVEYXRhLChjKSkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUsIGlzIHRoZXJlIGFueXRoaW5nIGluIHRoZSBpbmNvbWluZworLy8gbWFpbGJveD8KKy8vCisjZGVmaW5lIEhBU19NQUlMKHBCKSAgICAgICAoSU5CKHBCLT5pMmVTdGF0dXMpICYgU1RfSU5fTUFJTCkKKworI2RlZmluZSBVUERBVEVfRklGT19ST09NKHBCKSAgKHBCKS0+aTJlRmlmb1JlbWFpbnM9KHBCKS0+aTJlRmlmb1NpemUKKworLy8gSGFuZHkgbWFjcm8gdG8gcm91bmQgdXAgYSBudW1iZXIgKGxpa2UgdGhlIGJ1ZmZlciB3cml0ZSBhbmQgcmVhZCByb3V0aW5lcyBkbykKKy8vIAorI2RlZmluZSBST1VORFVQKG51bWJlcikgICAgKCgobnVtYmVyKSsxKSAmICh+MSkpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgZm9yIGkyZWxsaXMuYworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbnMgY2FsbGVkIGRpcmVjdGx5CisvLworLy8gSW5pdGlhbGl6YXRpb24gb2YgYSBib2FyZCAmIHN0cnVjdHVyZSBpcyBpbiBmb3VyIChmaXZlISkgcGFydHM6CisvLworLy8gMCkgaWlFbGxpc0luaXQoKSAgLSBJbml0aWFsaXplIGlpRWxsaXMgc3Vic3lzdGVtLgorLy8gMSkgaWlTZXRBZGRyZXNzKCkgLSBEZWZpbmUgdGhlIGJvYXJkIGFkZHJlc3MgJiBkZWxheSBmdW5jdGlvbiBmb3IgYSBib2FyZC4KKy8vIDIpIGlpUmVzZXQoKSAgICAgIC0gUmVzZXQgdGhlIGJvYXJkICAgKHByb3ZpZGVkIGl0IGV4aXN0cykKKy8vICAgICAgIC0tIE5vdGUgeW91IG1heSBkbyB0aGlzIHRvIHNldmVyYWwgYm9hcmRzIC0tCisvLyAzKSBpaVJlc2V0RGVsYXkoKSAtIERlbGF5IGZvciAyIHNlY29uZHMgKG9uY2UgZm9yIGFsbCBib2FyZHMpCisvLyA0KSBpaUluaXRpYWxpemUoKSAtIEF0dGVtcHQgdG8gcmVhZCBQb3dlci11cCBtZXNzYWdlOyBmdXJ0aGVyIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0b3JzCisvLworLy8gVGhlbiB5b3UgbWF5IHVzZSBpaURvd25sb2FkQWxsKCkgb3IgaWlEb3dubG9hZEZpbGUoKSAoaW4gaTJmaWxlLmMpIHRvIHdyaXRlCisvLyBsb2Fkd2FyZS4gIFRvIGNoYW5nZSBsb2Fkd2FyZSwgeW91IG11c3QgYmVnaW4gYWdhaW4gd2l0aCBzdGVwIDIsIHJlc2V0dGluZworLy8gdGhlIGJvYXJkIGFnYWluIChzdGVwIDEgbm90IG5lZWRlZCkuCisKK3N0YXRpYyB2b2lkIGlpRWxsaXNJbml0KHZvaWQpOworc3RhdGljIGludCBpaVNldEFkZHJlc3MoaTJlQm9yZFN0clB0ciwgaW50LCBkZWxheUZ1bmNfdCApOworc3RhdGljIGludCBpaVJlc2V0KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIGludCBpaVJlc2V0RGVsYXkoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGlpSW5pdGlhbGl6ZShpMmVCb3JkU3RyUHRyKTsKKworLy8gUm91dGluZSB0byB2YWxpZGF0ZSB0aGF0IGFsbCBjaGFubmVscyBleHBlY3RlZCBhcmUgdGhlcmUuCisvLworZXh0ZXJuIGludCBpaVZhbGlkYXRlQ2hhbm5lbHMoaTJlQm9yZFN0clB0cik7CisKKy8vIFJvdXRpbmUgdXNlZCB0byBkb3dubG9hZCBhIGJsb2NrIG9mIGxvYWR3YXJlLgorLy8KK3N0YXRpYyBpbnQgaWlEb3dubG9hZEJsb2NrKGkyZUJvcmRTdHJQdHIsIGxvYWRIZHJTdHJQdHIsIGludCk7CisKKy8vIFJldHVybiB2YWx1ZXMgZ2l2ZW4gYnkgaWlEb3dubG9hZEJsb2NrLCBpaURvd25sb2FkQWxsLCBpaURvd25sb2FkRmlsZToKKy8vCisjZGVmaW5lIElJX0RPV05fQkFEVkFMSUQgICAwCS8vIGJvYXJkIHN0cnVjdHVyZSBpcyBpbnZhbGlkCisjZGVmaW5lIElJX0RPV05fQ09OVElOVUlORyAxCS8vIFNvIGZhciwgc28gZ29vZCwgZmlybXdhcmUgZXhwZWN0cyBtb3JlCisjZGVmaW5lIElJX0RPV05fR09PRCAgICAgICAyCS8vIERvd25sb2FkIGNvbXBsZXRlLCBDUkMgZ29vZAorI2RlZmluZSBJSV9ET1dOX0JBRCAgICAgICAgMwkvLyBEb3dubG9hZCBjb21wbGV0ZSwgYnV0IENSQyBiYWQKKyNkZWZpbmUgSUlfRE9XTl9CQURGSUxFICAgIDQJLy8gQmFkIG1hZ2ljIG51bWJlciBpbiBsb2Fkd2FyZSBmaWxlCisjZGVmaW5lIElJX0RPV05fQkFEU1RBVEUgICA1CS8vIEJvYXJkIGlzIGluIGFuIGluYXBwcm9wcmlhdGUgc3RhdGUgZm9yCisJCQkJCQkJCS8vIGRvd25sb2FkaW5nIGxvYWR3YXJlLiAoc2VlIGkyZVN0YXRlKQorI2RlZmluZSBJSV9ET1dOX1RJTUVPVVQgICAgNgkvLyBUaW1lb3V0IHdhaXRpbmcgZm9yIGZpcm13YXJlCisjZGVmaW5lIElJX0RPV05fT1ZFUiAgICAgICA3CS8vIFRvbyBtdWNoIGRhdGEKKyNkZWZpbmUgSUlfRE9XTl9VTkRFUiAgICAgIDgJLy8gTm90IGVub3VnaCBkYXRhCisjZGVmaW5lIElJX0RPV05fTk9GSUxFICAgICA5CS8vIExvYWR3YXJlIGZpbGUgbm90IGZvdW5kCisKKy8vIFJvdXRpbmUgdG8gZG93bmxvYWQgYW4gZW50aXJlIGxvYWR3YXJlIG1vZHVsZTogUmV0dXJuIHZhbHVlcyBhcmUgYSBzdWJzZXQgb2YKKy8vIGlpRG93bmxvYWRCbG9jaydzLCBleGNsdWRpbmcsIG9mIGNvdXJzZSwgSUlfRE9XTl9DT05USU5VSU5HCisvLworc3RhdGljIGludCBpaURvd25sb2FkQWxsKGkyZUJvcmRTdHJQdHIsIGxvYWRIZHJTdHJQdHIsIGludCwgaW50KTsKKworLy8gQ2FsbGVkIGluZGlyZWN0bHkgYWx3YXlzLiAgTmVlZGVkIGV4dGVybmFsbHkgc28gdGhlIHJvdXRpbmUgbWlnaHQgYmUKKy8vIFNQRUNJRklFRCBhcyBhbiBhcmd1bWVudCB0byBpaVJlc2V0KCkKKy8vCisvL3N0YXRpYyB2b2lkIGlpMkRlbGF5SU8odW5zaWduZWQgaW50KTsJCS8vIE4tbWlsbGlzZWNvbmQgZGVsYXkgdXNpbmcKKwkJCQkJCQkJCQkJLy9oYXJkd2FyZSBzcGluCisvL3N0YXRpYyB2b2lkIGlpMkRlbGF5VGltZXIodW5zaWduZWQgaW50KTsJLy8gTi1taWxsaXNlY29uZCBkZWxheSB1c2luZyBMaW51eAorCQkJCQkJCQkJCQkvL3RpbWVyCisKKy8vIE1hbnkgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSByZXR1cm4gVHJ1ZSBpZiBnb29kLCBGYWxzZSBvdGhlcndpc2UsIHdpdGggYW4KKy8vIGVycm9yIGNvZGUgaW4gaTJlRXJyb3IgZmllbGQuIEhlcmUgaXMgYSBoYW5keSBtYWNybyBmb3Igc2V0dGluZyB0aGUgZXJyb3IKKy8vIGNvZGUgYW5kIHJldHVybmluZy4KKy8vCisjZGVmaW5lIENPTVBMRVRFKHBCLGNvZGUpIFwKKwlpZigxKXsgXAorCQkgcEItPmkyZUVycm9yID0gY29kZTsgXAorCQkgcmV0dXJuIChjb2RlID09IEkyRUVfR09PRCk7XAorCX0KKworI2VuZGlmICAgLy8gSTJFTExJU19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyaHcuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZmUwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyaHcuaApAQCAtMCwwICsxLDY0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IERlZmluaXRpb25zIGxpbWl0ZWQgdG8gcHJvcGVydGllcyBvZiB0aGUgaGFyZHdhcmUgb3IgdGhlCisqICAgICAgICAgICAgICAgIGJvb3RzdHJhcCBmaXJtd2FyZS4gQXMgc3VjaCwgdGhleSBhcmUgYXBwbGljYWJsZSByZWdhcmRsZXNzIG9mCisqICAgICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0gb3IgbG9hZHdhcmUgKHN0YW5kYXJkIG9yIGRpYWdub3N0aWMpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSTJIV19ICisjZGVmaW5lIEkySFdfSCAxCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2aXNpb24gSGlzdG9yeToKKy8vCisvLyAyMyBTZXB0ZW1iZXIgMTk5MSBNQUcgICBGaXJzdCBEcmFmdCBTdGFydGVkLi4udGhyb3VnaC4uLgorLy8gMTEgT2N0b2JlciAxOTkxICAgLi4uICAgQ29udGludWluZyBkZXZlbG9wbWVudC4uLgorLy8gIDYgQXVndXN0IDE5OTMgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSVNBLTQgKGFzaWMpIHdoaWNoIGlzIGFyY2hpdGVjdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhbiBJU0EtQ0VYIHdpdGggYSBzaW5nbGUgNC1wb3J0IGJveC4KKy8vCisvLyAyMCBEZWNlbWJlciAxOTk2ICBBS00gICBWZXJzaW9uIGZvciBMaW51eAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIQVJEV0FSRSBERVNDUklQVElPTjoKKworSW50cm9kdWN0aW9uOgorCitUaGUgSW50ZWxsaVBvcnQtSUkgYW5kIEludGVsbGlQb3J0LUlJRVggcHJvZHVjdHMgb2NjdXB5IGEgYmxvY2sgb2YgZWlnaHQgKDgpCithZGRyZXNzZXMgaW4gdGhlIGhvc3QncyBJL08gc3BhY2UuCisKK1NvbWUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIHRyYW5zZmVyIGRhdGEgdG8vZnJvbSB0aGUgYm9hcmQsIHNvbWUgdG8gdHJhbnNmZXIKK3NvLWNhbGxlZCAibWFpbGJveCIgbWVzc2FnZXMsIGFuZCBzb21lIHRvIHJlYWQgYml0LW1hcHBlZCBzdGF0dXMgaW5mb3JtYXRpb24uCitXaGlsZSBhbGwgdGhlIHByb2R1Y3RzIGluIHRoZSBsaW5lIGFyZSBmdW5jdGlvbmFsbHkgc2ltaWxhciwgc29tZSB1c2UgYSAxNi1iaXQKK2RhdGEgcGF0aCB0byB0cmFuc2ZlciBkYXRhIHdoaWxlIG90aGVycyB1c2UgYW4gOC1iaXQgcGF0aC4gQWxzbywgdGhlIHVzZSBvZgorY29tbWFuZCAvc3RhdHVzL21haWxib3ggcmVnaXN0ZXJzIGRpZmZlcnMgc2xpZ2h0bHkgYmV0d2VlbiB0aGUgSUkgYW5kIElJRVgKK2JyYW5jaGVzIG9mIHRoZSBmYW1pbHkuCisKK1RoZSBob3N0IGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGJvYXJkIGl0IGlzIGRlYWxpbmcgd2l0aCBieSByZWFkaW5nIGEgc3RyaW5nIG9mCitzaXh0ZWVuIGNoYXJhY3RlcnMgZnJvbSB0aGUgYm9hcmQuIFRoZXNlIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gdGhlCitmaWZvIGJ5IHRoZSBib2FyZCdzIGxvY2FsIHByb2Nlc3NvciB3aGVuZXZlciB0aGUgYm9hcmQgaXMgcmVzZXQgKGVpdGhlciBmcm9tCitwb3dlci1vbiBvciB1bmRlciBzb2Z0d2FyZSBjb250cm9sKSBhbmQgYXJlIGtub3duIGFzIHRoZSAiUG93ZXItb24gUmVzZXQKK01lc3NhZ2UuIiBJbiBvcmRlciB0aGF0IHRoaXMgbWVzc2FnZSBjYW4gYmUgcmVhZCBmcm9tIGVpdGhlciB0eXBlIG9mIGJvYXJkLCB0aGUKK2hhcmR3YXJlIHJlZ2lzdGVycyB1c2VkIGluIHJlYWRpbmcgdGhpcyBtZXNzYWdlIGFyZSB0aGUgc2FtZS4gT25jZSB0aGlzIG1lc3NhZ2UKK2hhcyBiZWVuIHJlYWQgYnkgdGhlIGhvc3QsIHRoZW4gaXQgaGFzIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBvcGVyYXRlLgorCitHZW5lcmFsIERpZmZlcmVuY2VzIGJldHdlZW4gYm9hcmRzOgorCitUaGUgZ3JlYXRlc3Qgc3RydWN0dXJhbCBkaWZmZXJlbmNlIGlzIGJldHdlZW4gdGhlIC1JSSBhbmQgLUlJRVggZmFtaWxpZXMgb2YKK3Byb2R1Y3QuIFRoZSAtSUkgYm9hcmRzIHVzZSB0aGUgQW00NzAxIGR1YWwgNTEyeDggYmlkaXJlY3Rpb25hbCBmaWZvIHRvIHN1cHBvcnQKK3RoZSBkYXRhIHBhdGgsIG1haWxib3ggcmVnaXN0ZXJzLCBhbmQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyBjaGlwIGNvbnRhaW5zIHNvbWUKK2ZlYXR1cmVzIHdoaWNoIGFyZSBub3QgdXNlZCBpbiB0aGUgSW50ZWxsaVBvcnQtSUkgcHJvZHVjdHM7IGEgZGVzY3JpcHRpb24gb2YKK3RoZXNlIGlzIG9taXR0ZWQgaGVyZS4gQmVjYXVzZSBvZiB0aGVzZSBtYW55IGZlYXR1cmVzLCBpdCBjb250YWlucyBtYW55CityZWdpc3RlcnMsIHRvbyBtYW55IHRvIGFjY2VzcyBkaXJlY3RseSB3aXRoaW4gYSBzbWFsbCBhZGRyZXNzIHNwYWNlLiBUaGV5IGFyZQorYWNjZXNzZWQgYnkgZmlyc3Qgd3JpdGluZyBhIHZhbHVlIHRvIGEgInBvaW50ZXIiIHJlZ2lzdGVyLiBUaGlzIHZhbHVlIHNlbGVjdHMKK3RoZSByZWdpc3RlciB0byBiZSBhY2Nlc3NlZC4gIFRoZSBuZXh0IHJlYWQgb3Igd3JpdGUgdG8gdGhhdCBhZGRyZXNzIGFjY2Vzc2VzCit0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgcmF0aGVyIHRoYW4gdGhlIHBvaW50ZXIgcmVnaXN0ZXIuCisKK1RoZSAtSUlFWCBib2FyZHMgdXNlIGEgcHJvcHJpZXRhcnkgZGVzaWduIHNpbWlsYXIgdG8gdGhlIEFtNDcwMSBpbiBmdW5jdGlvbi4gQnV0CitiZWNhdXNlIG9mIGEgc2ltcGxlciwgbW9yZSBzdHJlYW1saW5lZCBkZXNpZ24gaXQgZG9lc24ndCByZXF1aXJlIHNvIG1hbnkKK3JlZ2lzdGVycy4gVGhpcyBtZWFucyB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBpbiBzaW5nbGUgb3BlcmF0aW9ucyByYXRoZXIKK3RoYW4gdGhyb3VnaCBhIHBvaW50ZXIgcmVnaXN0ZXIuCisKK0Jlc2lkZXMgdGhlc2UgZGlmZmVyZW5jZXMsIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBpbiB3aGV0aGVyIDgtYml0IG9yIDE2LWJpdAordHJhbnNmZXJzIGFyZSB1c2VkIHRvIG1vdmUgZGF0YSB0byB0aGUgYm9hcmQuCisKK1RoZSAtSUkgYm9hcmRzIGFyZSBjYXBhYmxlIG9ubHkgb2YgOC1iaXQgZGF0YSB0cmFuc2ZlcnMsIHdoaWxlIHRoZSAtSUlFWCBib2FyZHMKK21heSBiZSBjb25maWd1cmVkIGZvciBlaXRoZXIgOC1iaXQgb3IgMTYtYml0IGRhdGEgdHJhbnNmZXJzLiBJZiB0aGUgb24tYm9hcmQgRElQCitzd2l0Y2ggIzggaXMgT04sIGFuZCB0aGUgY2FyZCBoYXMgYmVlbiBpbnN0YWxsZWQgaW4gYSAxNi1iaXQgc2xvdCwgMTYtYml0Cit0cmFuc2ZlcnMgYXJlIHN1cHBvcnRlZCAoYW5kIHdpbGwgYmUgZXhwZWN0ZWQgYnkgdGhlIHN0YW5kYXJkIGxvYWR3YXJlKS4gVGhlCitvbi1ib2FyZCBmaXJtd2FyZSBjYW4gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3dpdGNoLCBhbmQgd2hldGhlciB0aGUKK2JvYXJkIGlzIGluc3RhbGxlZCBpbiBhIDE2LWJpdCBzbG90OyBpdCBzdXBwbGllcyB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBob3N0IGFzCitwYXJ0IG9mIHRoZSBwb3dlci11cCByZXNldCBtZXNzYWdlLgorCitUaGUgY29uZmlndXJhdGlvbiBzd2l0Y2ggKCM4KSBhbmQgc2xvdCBzZWxlY3Rpb24gZG8gbm90IGRpcmVjdGx5IGNvbmZpZ3VyZSB0aGUKK2hhcmR3YXJlLiBJdCBpcyB1cCB0byB0aGUgb24tYm9hcmQgbG9hZHdhcmUgYW5kIGhvc3QtYmFzZWQgZHJpdmVycyB0byBhY3QKK2FjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgb3B0aW9ucy4gVGhhdCBpcywgbG9hZHdhcmUgYW5kIGRyaXZlcnMgY291bGQgYmUKK3dyaXR0ZW4gdG8gcGVyZm9ybSA4LWJpdCB0cmFuc2ZlcnMgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgdGhlIERJUCBzd2l0Y2ggb3IKK3Nsb3QgKGFuZCBpbiBhIGRpYWdub3N0aWMgZW52aXJvbm1lbnQgbWlnaHQgd2VsbCBkbyBzbykuIExpa2V3aXNlLCAxNi1iaXQKK3RyYW5zZmVycyBjb3VsZCBiZSBwZXJmb3JtZWQgYXMgbG9uZyBhcyB0aGUgY2FyZCBpcyBpbiBhIDE2LWJpdCBzbG90LgorCitOb3RlIHRoZSBzbG90IHNlbGVjdGlvbiBhbmQgRElQIHN3aXRjaCBzZWxlY3Rpb24gYXJlIHByb3ZpZGVkIHNlcGFyYXRlbHk6IGEKK2JvYXJkIHJ1bm5pbmcgaW4gOC1iaXQgbW9kZSBpbiBhIDE2LWJpdCBzbG90IGhhcyBhIGdyZWF0ZXIgcmFuZ2Ugb2YgcG9zc2libGUKK2ludGVycnVwdHMgdG8gY2hvb3NlIGZyb207IGluZm9ybWF0aW9uIG9mIHBvdGVudGlhbCB1c2UgdG8gdGhlIGhvc3QuCisKK0FsbCA4LWJpdCBkYXRhIHRyYW5zZmVycyBhcmUgZG9uZSBpbiB0aGUgc2FtZSB3YXksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvbiBhCistSUkgYm9hcmQgb3IgYSAtSUlFWCBib2FyZC4KKworVGhlIGhvc3QgbXVzdCBjb25zaWRlciB0d28gdGhpbmdzIHRoZW46IDEpIHdoZXRoZXIgYSAtSUkgb3IgLUlJRVggcHJvZHVjdCBpcworYmVpbmcgdXNlZCwgYW5kIDIpIHdoZXRoZXIgYW4gOC1iaXQgb3IgMTYtYml0IGRhdGEgcGF0aCBpcyB1c2VkLgorCitBIGZ1cnRoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IC1JSSBib2FyZHMgYWx3YXlzIGhhdmUgYSA1MTItYnl0ZSBmaWZvIG9wZXJhdGluZyBpbgorZWFjaCBkaXJlY3Rpb24uIC1JSUVYIGJvYXJkcyBtYXkgdXNlIGZpZm9zIG9mIHZhcnlpbmcgc2l6ZTsgdGhpcyBzaXplIGlzCityZXBvcnRlZCBhcyBwYXJ0IG9mIHRoZSBwb3dlci11cCBtZXNzYWdlLgorCitJL08gTWFwIE9mIEludGVsbGlQb3J0LUlJIGFuZCBJbnRlbGxpUG9ydC1JSUVYIGJvYXJkczoKKyhSZWxhdGl2ZSB0byB0aGUgY2hvc2VuIGJhc2UgYWRkcmVzcykKKworQWRkciAgUi9XICAgICAgSW50ZWxsaVBvcnQtSUkgICAgSW50ZWxsaVBvcnQtSUlFWAorLS0tLSAgLS0tICAgICAgLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLQorMCAgICAgUi9XICAgICAgRGF0YSBQb3J0IChieXRlKSAgRGF0YSBQb3J0IChieXRlIG9yIHdvcmQpCisxICAgICBSL1cgICAgICAoTm90IHVzZWQpICAgICAgICAoTVNCIG9mIHdvcmQtd2lkZSBkYXRhIHdyaXR0ZW4gdG8gRGF0YSBQb3J0KQorMiAgICAgUiAgICAgICAgU3RhdHVzIFJlZ2lzdGVyICAgU3RhdHVzIFJlZ2lzdGVyCisyICAgICBXICAgICAgICBQb2ludGVyIFJlZ2lzdGVyICBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorMyAgICAgUi9XICAgICAgKE5vdCB1c2VkKSAgICAgICAgTWFpbGJveCBSZWdpc3RlcnMgKDYgYml0czogMTExMTExMDApCis0LDUgICAtLSAgICAgICBSZXNlcnZlZCBmb3IgZnV0dXJlIHByb2R1Y3RzCis2ICAgICAtLSAgICAgICBSZXNlcnZlZCBmb3IgZnV0dXJlIHByb2R1Y3RzCis3ICAgICBSICAgICAgICBHdWFyYW50ZWVkIHRvIGhhdmUgbm8gZWZmZWN0Cis3ICAgICBXICAgICAgICBIYXJkd2FyZSByZXNldCBvZiBib2FyZC4KKworCitSdWxlczoKK0FsbCBkYXRhIHRyYW5zZmVycyBhcmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBldmVuIGkvbyBhZGRyZXNzLiBJZiBieXRlLXdpZGUgZGF0YQordHJhbnNmZXJzIGFyZSBiZWluZyB1c2VkLCBkbyBJTkIvT1VUQiBvcGVyYXRpb25zIG9uIHRoZSBkYXRhIHBvcnQuIElmIHdvcmQtd2lkZQordHJhbnNmZXJzIGFyZSB1c2VkLCBkbyBJTlcvT1VUVyBvcGVyYXRpb25zLiBJbiBzb21lIGNpcmN1bXN0YW5jZXMgKHN1Y2ggYXMKK3JlYWRpbmcgdGhlIHBvd2VyLXVwIG1lc3NhZ2UpIHlvdSB3aWxsIGRvIElOQiBmcm9tIHRoZSBkYXRhIHBvcnQsIGJ1dCBpbiB0aGlzCitjYXNlIHRoZSBNU0Igb2YgZWFjaCB3b3JkIHJlYWQgaXMgbG9zdC4gV2hlbiBhY2Nlc3NpbmcgYWxsIG90aGVyIHVucmVzZXJ2ZWQKK3JlZ2lzdGVycywgdXNlIGJ5dGUgb3BlcmF0aW9ucyBvbmx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hbmRhdG9yeSBJbmNsdWRlczoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2luY2x1ZGUgImlwMnR5cGVzLmgiCisjaW5jbHVkZSAiaTJvcy5oIiAgICAvKiBGb3IgYW55IG8ucy4sIGNvbXBpbGVyLCBvciBob3N0LXJlbGF0ZWQgaXNzdWVzICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFuaWZlc3RzIGZvciB0aGUgSS9PIG1hcDoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUi9XOiBEYXRhIHBvcnQgKGJ5dGUpIGZvciBJbnRlbGxpUG9ydC1JSSwKKy8vIFIvVzogRGF0YSBwb3J0IChieXRlIG9yIHdvcmQpIGZvciBJbnRlbGxpUG9ydC1JSUVYCisvLyBJbmNvbWluZyBvciBvdXRnb2luZyBkYXRhIHBhc3NlcyB0aHJvdWdoIGEgRklGTywgdGhlIHN0YXR1cyBvZiB3aGljaCBpcworLy8gYXZhaWxhYmxlIGluIHNvbWUgb2YgdGhlIGJpdHMgaW4gRklGT19TVEFUVVMuIFRoaXMgKGJpZGlyZWN0aW9uYWwpIEZJRk8gaXMKKy8vIHRoZSBwcmltYXJ5IG1lYW5zIG9mIHRyYW5zZmVycmluZyBkYXRhLCBjb21tYW5kcywgZmxvdy1jb250cm9sLCBhbmQgc3RhdHVzCisvLyBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFuZCBib2FyZC4KKy8vCisjZGVmaW5lIEZJRk9fREFUQSAwCisKKy8vIEFub3RoZXIgd2F5IG9mIHBhc3NpbmcgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgYm9hcmQgYW5kIHRoZSBob3N0IGlzCisvLyB0aHJvdWdoICJtYWlsYm94ZXMiLiBVbmxpa2UgYSBGSUZPLCBhIG1haWxib3ggaG9sZHMgb25seSBhIHNpbmdsZSBieXRlIG9mCisvLyBkYXRhLiAgV3JpdGluZyBkYXRhIHRvIHRoZSBtYWlsYm94IGNhdXNlcyBhIHN0YXR1cyBiaXQgdG8gYmUgc2V0LCBhbmQKKy8vIHBvdGVudGlhbGx5IGludGVycnVwdGluZyB0aGUgaW50ZW5kZWQgcmVjZWl2ZXIuIFRoZSBzZW5kZXIgaGFzIHNvbWUgd2F5IHRvCisvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YSBoYXMgYmVlbiByZWFkIHlldDsgYXMgc29vbiBhcyBpdCBoYXMsIGl0IG1heSBzZW5kCisvLyBtb3JlLiBUaGUgbWFpbGJveGVzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IG9uIC1JSSBhbmQgLUlJRVggcHJvZHVjdHMsIGFzCisvLyBzdWdnZXN0ZWQgYmVsb3cuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVhZDogU3RhdHVzIFJlZ2lzdGVyIGZvciBJbnRlbGxpUG9ydC1JSSBvciAtSUlFWAorLy8gVGhlIHByZXNlbmNlIG9mIGFueSBiaXQgc2V0IGhlcmUgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgdG8gdGhlIGhvc3QsCisvLyBwcm92aWRlZCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaGFzIGJlZW4gdW5tYXNrZWQgaW4gdGhlIGludGVycnVwdCBtYXNrCisvLyByZWdpc3Rlci4gRnVydGhlcm1vcmUsIGludGVycnVwdHMgdG8gdGhlIGhvc3QgYXJlIGRpc2FibGVkIGdsb2JhbGx5IHVudGlsIHRoZQorLy8gbG9hZHdhcmUgc2VsZWN0cyB0aGUgaXJxIGxpbmUgdG8gdXNlLiBXaXRoIHRoZSBleGNlcHRpb24gb2YgU1ROX01SLCB0aGUgYml0cworLy8gcmVtYWluIHNldCBzbyBsb25nIGFzIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBpcyB0cnVlLgorLy8KKyNkZWZpbmUgRklGT19TVEFUVVMgMgorCisvLyBCaXQgbWFwIG9mIHN0YXR1cyBiaXRzIHdoaWNoIGFyZSBpZGVudGljYWwgZm9yIC1JSSBhbmQgLUlJRVgKKy8vCisjZGVmaW5lIFNUX09VVF9GVUxMICAweDQwICAvLyBPdXRib3VuZCBGSUZPIGZ1bGwKKyNkZWZpbmUgU1RfSU5fRU1QVFkgIDB4MjAgIC8vIEluYm91bmQgRklGTyBlbXB0eQorI2RlZmluZSBTVF9JTl9NQUlMICAgMHgwNCAgLy8gSW5ib3VuZCBNYWlsYm94IGZ1bGwKKworLy8gVGhlIGZvbGxvd2luZyBleGlzdHMgb25seSBvbiB0aGUgSW50ZWxsaXBvcnQtSUlFWCwgYW5kIGluZGljYXRlcyB0aGF0IHRoZQorLy8gYm9hcmQgaGFzIG5vdCByZWFkIHRoZSBsYXN0IG91dGdvaW5nIG1haWxib3ggZGF0YSB5ZXQuIEluIHRoZSBJbnRlbGxpUG9ydC1JSSwKKy8vIHRoZSBvdXRnb2luZyBtYWlsYm94IG1heSBiZSByZWFkIGJhY2s6IGEgemVybyBpbmRpY2F0ZXMgdGhlIGJvYXJkIGhhcyByZWFkCisvLyB0aGUgZGF0YS4KKy8vCisjZGVmaW5lIFNURV9PVVRfTUFJTCAweDgwICAvLyBPdXRib3VuZCBtYWlsYm94IGZ1bGwgKCEpCisKKy8vIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgZGVmaW5lZCBkaWZmZXJlbnRseSBmb3IgLUlJIGFuZCAtSUlFWCBib2FyZHMuIENvZGUKKy8vIHdoaWNoIHJlbGllcyBvbiB0aGVzZSBiaXRzIHdpbGwgbmVlZCB0byBiZSBmdW5jdGlvbmFsbHkgZGlmZmVyZW50IGZvciB0aGUgdHdvCisvLyB0eXBlcyBvZiBib2FyZHMgYW5kIHNob3VsZCBiZSBnZW5lcmFsbHkgYXZvaWRlZCBiZWNhdXNlIG9mIHRoZSBhZGRpdGlvbmFsCisvLyBjb21wbGV4aXR5IHRoaXMgY3JlYXRlczoKKworLy8gQml0IG1hcCBvZiBzdGF0dXMgYml0cyBvbmx5IG9uIC1JSQorCisvLyBGaWZvIGhhcyBiZWVuIFJFU0VUIChjbGVhcmVkIHdoZW4gdGhlIHN0YXR1cyByZWdpc3RlciBpcyByZWFkKS4gTm90ZSB0aGF0CisvLyB0aGlzIGNvbmRpdGlvbiBjYW5ub3QgYmUgbWFza2VkIGFuZCB3b3VsZCBhbHdheXMgaW50ZXJydXB0IHRoZSBob3N0LCBleGNlcHQKKy8vIHRoYXQgdGhlIGhhcmR3YXJlIHJlc2V0IGFsc28gZGlzYWJsZXMgaW50ZXJydXB0cyBnbG9iYWxseSBmcm9tIHRoZSBib2FyZAorLy8gdW50aWwgcmUtZW5hYmxlZCBieSBsb2Fkd2FyZS4gVGhpcyBjb3VsZCBhbHNvIGFyaXNlIGZyb20gdGhlCisvLyBBbTQ3MDEtc3VwcG9ydGVkIGNvbW1hbmQgdG8gcmVzZXQgdGhlIGNoaXAsIGJ1dCB0aGlzIGNvbW1hbmQgaXMgZ2VuZXJhbGx5IG5vdAorLy8gdXNlZCBoZXJlLgorLy8KKyNkZWZpbmUgU1ROX01SICAgICAgIDB4ODAKKworLy8gU2VlIHRoZSBBTUQgQW00NzAxIGRhdGEgc2hlZXQgZm9yIGRldGFpbHMgb24gdGhlIGZvbGxvd2luZyBmb3VyIGJpdHMuIFRoZXkKKy8vIGFyZSBub3QgcHJlc2VudGx5IHVzZWQgYnkgQ29tcHV0b25lIGRyaXZlcnMuCisvLworI2RlZmluZSBTVE5fT1VUX0FGICAweDEwICAvLyBPdXRib3VuZCBGSUZPIGFsbW9zdCBmdWxsIChwcm9ncmFtbWFibGUpCisjZGVmaW5lIFNUTl9JTl9BRSAgIDB4MDggIC8vIEluYm91bmQgRklGTyBhbG1vc3QgZW1wdHkgKHByb2dyYW1tYWJsZSkKKyNkZWZpbmUgU1ROX0JEICAgICAgMHgwMiAgLy8gSW5ib3VuZCBieXRlIGRldGVjdGVkCisjZGVmaW5lIFNUTl9QRSAgICAgIDB4MDEgIC8vIFBhcml0eS9GcmFtaW5nIGNvbmRpdGlvbiBkZXRlY3RlZAorCisvLyBCaXQtbWFwIG9mIHN0YXR1cyBiaXRzIG9ubHkgb24gLUlJRVgKKy8vCisjZGVmaW5lIFNURV9PVVRfSEYgIDB4MTAgIC8vIE91dGJvdW5kIEZJRk8gaGFsZiBmdWxsCisjZGVmaW5lIFNURV9JTl9IRiAgIDB4MDggIC8vIEluYm91bmQgRklGTyBoYWxmIGZ1bGwKKyNkZWZpbmUgU1RFX0lOX0ZVTEwgMHgwMiAgLy8gSW5ib3VuZCBGSUZPIGZ1bGwKKyNkZWZpbmUgU1RFX09VVF9NVCAgMHgwMSAgLy8gT3V0Ym91bmQgRklGTyBlbXB0eQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbnRlbGxpcG9ydC1JSSAtLSBXcml0ZSBPbmx5OiB0aGUgcG9pbnRlciByZWdpc3Rlci4KKy8vIFZhbHVlcyBhcmUgd3JpdHRlbiB0byB0aGlzIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgQW00NzAxIGludGVybmFsIHJlZ2lzdGVyIHRvCisvLyBiZSBhY2Nlc3NlZCBvbiB0aGUgbmV4dCBvcGVyYXRpb24uCisvLworI2RlZmluZSBGSUZPX1BUUiAgICAweDAyCisKKy8vIFZhbHVlcyBmb3IgdGhlIHBvaW50ZXIgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFNFTF9DT01NQU5EIDB4MSAgICAvLyBTZWxlY3RzIHRoZSBBbTQ3MDEgY29tbWFuZCByZWdpc3RlcgorCisvLyBTb21lIHBvc3NpYmxlIGNvbW1hbmRzOgorLy8KKyNkZWZpbmUgU0VMX0NNRF9NUiAgMHg4MAkvLyBBbTQ3MDEgY29tbWFuZCB0byByZXNldCB0aGUgY2hpcAorI2RlZmluZSBTRUxfQ01EX1NIICAweDQwCS8vIEFtNDcwMSBjb21tYW5kIHRvIG1hcCB0aGUgIm90aGVyIiBwb3J0IGludG8gdGhlCisJCQkJCQkJLy8gc3RhdHVzIHJlZ2lzdGVyLgorI2RlZmluZSBTRUxfQ01EX1VOU0ggICAwCS8vIEFtNDcwMSBjb21tYW5kIHRvICJ1bnNoaWZ0IjogcG9ydCBtYXBzIGludG8gaXRzCisJCQkJCQkJLy8gb3duIHN0YXR1cyByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX01BU0sgICAgIDB4MgkvLyBTZWxlY3RzIHRoZSBBbTQ3MDEgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIuIFRoZQorCQkJCQkJCS8vIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGlzIGJpdC1tYXBwZWQgdG8gbWF0Y2ggCisJCQkJCQkJLy8gdGhlIHN0YXR1cyByZWdpc3RlciAoRklGT19TVEFUVVMpIGV4Y2VwdCBmb3IKKwkJCQkJCQkvLyBTVE5fTVIuIChTZWUgYWJvdmUuKQorI2RlZmluZSBTRUxfQllURV9ERVQgMHgzCS8vIFNlbGVjdHMgdGhlIEFtNDcwMSBieXRlLWRldGVjdCByZWdpc3Rlci4gKE5vdAorCQkJCQkJCS8vIG5vcm1hbGx5IHVzZWQgZXhjZXB0IGluIGRpYWdub3N0aWNzLikKKyNkZWZpbmUgU0VMX09VVE1BSUwgIDB4NAkvLyBTZWxlY3RzIHRoZSBvdXRib3VuZCBtYWlsYm94IChSL1cpLiBSZWFkaW5nIGJhY2sKKwkJCQkJCQkvLyBhIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIG1haWxib3ggaGFzCisJCQkJCQkJLy8gYmVlbiByZWFkIGJ5IHRoZSBib2FyZCBhbmQgaXMgYXZhaWxhYmxlIGZvciBtb3JlCisJCQkJCQkJLy8gZGF0YS4vIFdyaXRpbmcgdG8gdGhlIG1haWxib3ggb3B0aW9uYWxseQorCQkJCQkJCS8vIGludGVycnVwdHMgdGhlIGJvYXJkLCBkZXBlbmRpbmcgb24gdGhlIGxvYWR3YXJlJ3MKKwkJCQkJCQkvLyBzZXR0aW5nIG9mIGl0cyBpbnRlcnJ1cHQgbWFzayByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX0FFQUYgICAgIDB4NQkvLyBTZWxlY3RzIEFFL0FGIHRocmVzaG9sZCByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX0lOTUFJTCAgIDB4NgkvLyBTZWxlY3RzIHRoZSBpbmJvdW5kIG1haWxib3ggKFJlYWQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlbGxpUG9ydC1JSUVYIC0tICBXcml0ZSBPbmx5OiBpbnRlcnJ1cHQgbWFzayAoYW5kIG1pc2MgZmxhZ3MpIHJlZ2lzdGVyOgorLy8gVW5saWtlIEludGVsbGlQb3J0LUlJLCBiaXQgYXNzaWdubWVudHMgZG8gTk9UIG1hdGNoIHRob3NlIG9mIHRoZSBzdGF0dXMKKy8vIHJlZ2lzdGVyLgorLy8KKyNkZWZpbmUgRklGT19NQVNLICAgIDB4MgorCisvLyBNYWlsYm94IHJlYWRiYWNrIHNlbGVjdDoKKy8vIElmIHNldCwgcmVhZHMgdG8gRklGT19NQUlMIHdpbGwgcmVhZCB0aGUgT1VUQk9VTkQgbWFpbGJveCAoaG9zdCB0byBib2FyZCkuIElmCisvLyBjbGVhciAoZGVmYXVsdCBvbiByZXNldCkgcmVhZHMgdG8gRklGT19NQUlMIHdpbGwgcmVhZCB0aGUgSU5CT1VORCBtYWlsYm94LgorLy8gVGhpcyBpcyB0aGUgbm9ybWFsIHNpdHVhdGlvbi4gVGhlIGNsZWFyaW5nIG9mIGEgbWFpbGJveCBpcyBkZXRlcm1pbmVkIG9uCisvLyAtSUlFWCBib2FyZHMgYnkgd2FpdGluZyBmb3IgdGhlIFNURV9PVVRfTUFJTCBiaXQgdG8gY2xlYXIuIFJlYWRiYWNrCisvLyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkuCisvLworI2RlZmluZSAgTVhfT1VUTUFJTF9SU0VMICAgMHg4MAorCisjZGVmaW5lICBNWF9JTl9NQUlMICAweDQwCS8vIEVuYWJsZXMgaW50ZXJydXB0cyB3aGVuIGluY29taW5nIG1haWxib3ggZ29lcworCQkJCQkJCS8vIGZ1bGwgKFNUX0lOX01BSUwgc2V0KS4KKyNkZWZpbmUgIE1YX0lOX0ZVTEwgIDB4MjAJLy8gRW5hYmxlcyBpbnRlcnJ1cHRzIHdoZW4gaW5jb21pbmcgRklGTyBnb2VzIGZ1bGwKKwkJCQkJCQkvLyAoU1RFX0lOX0ZVTEwpLgorI2RlZmluZSAgTVhfSU5fTVQgICAgMHgwOAkvLyBFbmFibGVzIGludGVycnVwdHMgd2hlbiBpbmNvbWluZyBGSUZPIGdvZXMgZW1wdHkKKwkJCQkJCQkvLyAoU1RfSU5fTVQpLgorI2RlZmluZSAgTVhfT1VUX0ZVTEwgMHgwNAkvLyBFbmFibGVzIGludGVycnVwdHMgd2hlbiBvdXRnb2luZyBGSUZPIGdvZXMgZnVsbAorCQkJCQkJCS8vIChTVF9PVVRfRlVMTCkuCisjZGVmaW5lICBNWF9PVVRfTVQgICAweDAxCS8vIEVuYWJsZXMgaW50ZXJydXB0cyB3aGVuIG91dGdvaW5nIEZJRk8gZ29lcyBlbXB0eQorCQkJCQkJCS8vIChTVEVfT1VUX01UKS4KKworLy8gQW55IHJlbWFpbmluZyBiaXRzIGFyZSByZXNlcnZlZCwgYW5kIHNob3VsZCBiZSB3cml0dGVuIHRvIFpFUk8gZm9yCisvLyBjb21wYXRpYmlsaXR5IHdpdGggZnV0dXJlIENvbXB1dG9uZSBwcm9kdWN0cy4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVsbGlQb3J0LUlJRVg6IC0tIFRoZXNlIGFyZSBvbmx5IDYtYml0IG1haWxib3hlcyAhISEgLS0gMTExMTExMDAgKGxvdyB0d28KKy8vIGJpdHMgYWx3YXlzIHJlYWQgYmFjayAwKS4KKy8vIFJlYWQ6ICBPbmUgb2YgdGhlIG1haWxib3hlcywgdXN1YWxseSBJbmJvdW5kLgorLy8gICAgICAgIEluYm91bmQgTWFpbGJveCAoTVhfT1VUTUFJTF9SU0VMID0gMCkKKy8vICAgICAgICBPdXRib3VuZCBNYWlsYm94IChNWF9PVVRNQUlMX1JTRUwgPSAxKQorLy8gV3JpdGU6IE91dGJvdW5kIE1haWxib3gKKy8vIEZvciB0aGUgSW50ZWxsaVBvcnQtSUkgYm9hcmRzLCB0aGUgb3V0Ym91bmQgbWFpbGJveCBpcyByZWFkIGJhY2sgdG8gZGV0ZXJtaW5lCisvLyB3aGV0aGVyIHRoZSBib2FyZCBoYXMgcmVhZCB0aGUgZGF0YSAoMCAtLT4gZGF0YSBoYXMgYmVlbiByZWFkKS4gRm9yIHRoZQorLy8gSW50ZWxsaVBvcnQtSUlFWCwgdGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBzdGF0dXMgcmVnaXN0ZXIuIFRvIGRldGVybWluZQorLy8gd2hldGhlciBtYWlsYm94IGlzIGF2YWlsYWJsZSBmb3IgbW9yZSBvdXRib3VuZCBkYXRhLCB1c2UgdGhlIFNURV9PVVRfTUFJTCBiaXQKKy8vIGluIEZJRk9fU1RBVFVTLiBNb3Jlb3ZlciwgYWx0aG91Z2ggdGhlIE91dGJvdW5kIE1haWxib3ggY2FuIGJlIHJlYWQgYmFjayBieQorLy8gc2V0dGluZyBNWF9PVVRNQUlMX1JTRUwsIGl0IGlzIE5PVCBjbGVhcmVkIHdoZW4gdGhlIGJvYXJkIHJlYWRzIGl0LCBhcyBpcyB0aGUKKy8vIGNhc2Ugd2l0aCB0aGUgLUlJIGJvYXJkcy4gRm9yIHRoaXMgcmVhc29uLCBGSUZPX01BSUwgaXMgbm9ybWFsbHkgdXNlZCB0byByZWFkCisvLyB0aGUgaW5ib3VuZCBGSUZPLCBhbmQgTVhfT1VUTUFJTF9SU0VMIGtlcHQgY2xlYXIuIChTZWUgYWJvdmUgZm9yCisvLyBNWF9PVVRNQUlMX1JTRUwgZGVzY3JpcHRpb24uKQorLy8KKyNkZWZpbmUgIEZJRk9fTUFJTCAgIDB4MworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV1JJVEUgT05MWTogIFJlc2V0cyB0aGUgYm9hcmQuIChEYXRhIGRvZXNuJ3QgbWF0dGVyKS4KKy8vCisjZGVmaW5lICBGSUZPX1JFU0VUICAweDcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJFQUQgT05MWTogIFdpbGwgaGF2ZSBubyBlZmZlY3QuIChEYXRhIGlzIHVuZGVmaW5lZC4pCisvLyBBY3R1YWxseSwgdGhlcmUgd2lsbCBiZSBhbiBlZmZlY3QsIGluIHRoYXQgdGhlIG9wZXJhdGlvbiBpcyBzdXJlIHRvIGdlbmVyYXRlCisvLyBhIGJ1cyBjeWNsZTogdml6LiwgYW4gSS9PIGJ5dGUgUmVhZC4gVGhpcyBmYWN0IGNhbiBiZSB1c2VkIHRvIGVuZm9yY2Ugc2hvcnQKKy8vIGRlbGF5cyB3aGVuIG5vIGNvbXBhcmFibGUgdGltZSBjb25zdGFudCBpcyBhdmFpbGFibGUuCisvLworI2RlZmluZSAgRklGT19OT1AgICAgMHg3CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSRVNFVCAmIFBPV0VSLU9OIFJFU0VUIE1FU1NBR0UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRVNFVDoKKworVGhlIEludGVsbGlQb3J0LUlJIGFuZCAtSUlFWCBib2FyZHMgYXJlIHJlc2V0IGluIHRocmVlIHdheXM6IFBvd2VyLXVwLCBjaGFubmVsCityZXNldCwgYW5kIHZpYSBhIHdyaXRlIHRvIHRoZSByZXNldCByZWdpc3RlciBkZXNjcmliZWQgYWJvdmUuIEZvciBwcm9kdWN0cyB1c2luZwordGhlIElTQSBidXMsIHRoZXNlIHRocmVlIHNvdXJjZXMgb2YgcmVzZXQgYXJlIGVxdXZhbGVudC4gRm9yIE1DQSBhbmQgRUlTQSBidXNlcywKK3RoZSBQb3dlci11cCBhbmQgY2hhbm5lbCByZXNldCBzb3VyY2VzIGNhdXNlIGFkZGl0aW9uYWwgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb24KK3doaWNoIHNob3VsZCBvbmx5IG9jY3VyIGF0IHN5c3RlbSBzdGFydHVwIHRpbWUuCisKK1RoZSB0aGlyZCB0eXBlIG9mIHJlc2V0LCBjYWxsZWQgYSAiY29tbWFuZCByZXNldCIsIGlzIGRvbmUgYnkgd3JpdGluZyBhbnkgZGF0YQordG8gdGhlIEZJRk9fUkVTRVQgYWRkcmVzcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgcmVzZXRzIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsCitGSUZPLCBVQVJUUywgYW5kIGFzc29jaWF0ZWQgaGFyZHdhcmUuCisKK1RoaXMgcGFzc2VzIGNvbnRyb2wgb2YgdGhlIGJvYXJkIHRvIHRoZSBib290c3RyYXAgZmlybXdhcmUsIHdoaWNoIHBlcmZvcm1zIGEKK1Bvd2VyLU9uIFNlbGYgVGVzdCBhbmQgd2hpY2ggZGV0ZWN0cyBpdHMgY3VycmVudCBjb25maWd1cmF0aW9uLiBGb3IgZXhhbXBsZSwKKy1JSUVYIHByb2R1Y3RzIGRldGVybWluZSB0aGUgc2l6ZSBvZiBGSUZPIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHRoZQorbnVtYmVyIGFuZCB0eXBlIG9mIGV4cGFuc2lvbiBib3hlcyBhdHRhY2hlZC4KKworVGhpcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gaXMgdGhlbiB3cml0dGVuIHRvIHRoZSBGSUZPIGluIGEgMTYtYnl0ZSBkYXRhIGJsb2NrCit0byBiZSByZWFkIGJ5IHRoZSBob3N0LiBUaGlzIGJsb2NrIGlzIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudCB3aXRoaW4gdHdvICgyKQorc2Vjb25kcyBvZiBoYXZpbmcgcmVjZWl2ZWQgdGhlIGNvbW1hbmQgcmVzZXQuIFRoZSBmaXJtd2FyZSBpcyBub3cgcmVhZHkgdG8KK3JlY2VpdmUgbG9hZHdhcmUgZnJvbSB0aGUgaG9zdC4KKworSXQgaXMgZ29vZCBwcmFjdGljZSB0byBwZXJmb3JtIGEgY29tbWFuZCByZXNldCB0byB0aGUgYm9hcmQgZXhwbGljaXRseSBhcyBwYXJ0CitvZiB5b3VyIHNvZnR3YXJlIGluaXRpYWxpemF0aW9uLiAgVGhpcyBhbGxvd3MgeW91ciBjb2RlIHRvIHByb3Blcmx5IHJlc3RhcnQgZnJvbQorYSBzb2Z0IGJvb3QuIChNYW55IHN5c3RlbXMgZG8gbm90IGlzc3VlIGNoYW5uZWwgcmVzZXQgb24gc29mdCBib290KS4KKworQmVjYXVzZSBvZiBhIGhhcmR3YXJlIHJlc2V0IHByb2JsZW0gb24gc29tZSBvZiB0aGUgQ2lycnVzIExvZ2ljIDE0MDAncyB3aGljaCBhcmUKK3VzZWQgb24gdGhlIHByb2R1Y3QsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJlc2V0IHRoZSBib2FyZCB0d2ljZSwgc2VwYXJhdGVkCitieSBhbiBhcHByb3hpbWF0ZWx5IDUwIG1pbGxpc2Vjb25kcyBkZWxheS4gKFZFUlkgYXBwcm94aW1hdGVseTogcHJvYmFibHkgb2sgdG8KK2JlIG9mZiBieSBhIGZhY3RvciBvZiBmaXZlLiBUaGUgaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgcmVzZXQKK2luIGZhY3QgZ2VuZXJhdGVzIGEgcmVzZXQgcHVsc2Ugb24gdGhlIGJvYXJkLiBUaGlzIHB1bHNlIGlzIGd1YXJhbnRlZWQgdG8gbGFzdAorbGVzcyB0aGFuIDEwIG1pbGxpc2Vjb25kcy4gVGhlIGFkZGl0aW9uYWwgZGVsYXkgZW5zdXJlcyB0aGUgMTQwMCBoYXMgaGFkIHRoZQorY2hhbmNlIHRvIHJlc3BvbmQgc3VmZmljaWVudGx5IHRvIHRoZSBmaXJzdCByZXNldC4gV2h5IG5vdCBhIGxvbmdlciBkZWxheT8gTXVjaAorbW9yZSB0aGFuIDUwIG1pbGxpc2Vjb25kcyBnZXRzIHRvIGJlIG5vdGljYWJsZSwgYnV0IHRoZSBib2FyZCB3b3VsZCBzdGlsbCB3b3JrLgorCitPbmNlIGFsbCAxNiBieXRlcyBvZiB0aGUgUG93ZXItb24gUmVzZXQgTWVzc2FnZSBoYXZlIGJlZW4gcmVhZCwgdGhlIGJvb3RzdHJhcAorZmlybXdhcmUgaXMgcmVhZHkgdG8gcmVjZWl2ZSBsb2Fkd2FyZS4KKworTm90ZSBvbiBQb3dlci1vbiBSZXNldCBNZXNzYWdlIGZvcm1hdDoKK1RoZSB2YXJpb3VzIGZpZWxkcyBoYXZlIGJlZW4gZGVzaWduZWQgd2l0aCBmdXR1cmUgZXhwYW5zaW9uIGluIHZpZXcuCitDb21iaW5hdGlvbnMgb2YgYml0ZmllbGRzIGFuZCB2YWx1ZXMgaGF2ZSBiZWVuIGRlZmluZWQgd2hpY2ggZGVmaW5lIHByb2R1Y3RzCit3aGljaCBtYXkgbm90IGN1cnJlbnRseSBleGlzdC4gVGhpcyBoYXMgYmVlbiBkb25lIHRvIGFsbG93IGRyaXZlcnMgdG8gYW50aWNpcGF0ZQordGhlIHBvc3NpYmxlIGludHJvZHVjdGlvbiBvZiBwcm9kdWN0cyBpbiBhIHN5c3RlbWF0aWMgZmFzaGlvbi4gVGhpcyBpcyBub3QKK2ludGVuZGVkIHRvIHN1Z2dlc3QgdGhhdCBlYWNoIHBvdGVudGlhbCBwcm9kdWN0IGlzIGFjdHVhbGx5IHVuZGVyIGNvbnNpZGVyYXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvcm1hdCBvZiBQb3dlci1vbiBSZXNldCBNZXNzYWdlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB1bmlvbiBfcG9yU3RyCQkvLyAicG9yIiBzdGFuZHMgZm9yIFBvd2VyIE9uIFJlc2V0Cit7CisJdW5zaWduZWQgY2hhciAgY1sxNl07CS8vIGFycmF5IHVzZWQgd2hlbiBjb25zaWRlcmluZyB0aGUgbWVzc2FnZSBhcyBhCisJCQkJCQkJLy8gc3RyaW5nIG9mIHVuZGlmZmVyZW50aWF0ZWQgY2hhcmFjdGVycworCisJc3RydWN0CQkJCQkvLyBFbGVtZW50cyB1c2VkIHdoZW4gY29uc2lkZXJpbmcgdmFsdWVzCisJeworCQkvLyBUaGUgZmlyc3QgdHdvIGJ5dGVzIG91dCBvZiB0aGUgRklGTyBhcmUgdHdvIG1hZ2ljIG51bWJlcnMuIFRoZXNlIGFyZQorCQkvLyBpbnRlbmRlZCB0byBlc3RhYmxpc2ggdGhhdCB0aGVyZSBpcyBpbmRlZWQgYSBtZW1iZXIgb2YgdGhlCisJCS8vIEludGVsbGlQb3J0LUlJKEVYKSBmYW1pbHkgcHJlc2VudC4gVGhlIHJlbWFpbmluZyBieXRlcyBtYXkgYmUgCisJCS8vIGV4cGVjdGVkIC8vIHRvIGJlIHZhbGlkLiBXaGVuIHJlYWRpbmcgdGhlIFBvd2VyLW9uIFJlc2V0IG1lc3NhZ2UsIAorCQkvLyBpZiB0aGUgbWFnaWMgbnVtYmVycyBkbyBub3QgbWF0Y2ggaXQgaXMgcHJvYmFibHkgYmVzdCB0byBzdG9wCisJCS8vIHJlYWRpbmcgaW1tZWRpYXRlbHkuIFlvdSBhcmUgY2VydGFpbmx5IG5vdCByZWFkaW5nIG91ciBib2FyZCAodW5sZXNzCisJCS8vIGhhcmR3YXJlIGlzIGZhdWx0eSksIGFuZCBtYXkgaW4gZmFjdCBiZSByZWFkaW5nIHNvbWUgb3RoZXIgcGllY2Ugb2YKKwkJLy8gaGFyZHdhcmUuCisKKwkJdW5zaWduZWQgY2hhciBwb3JNYWdpYzE7ICAgLy8gbWFnaWMgbnVtYmVyOiBmaXJzdCBieXRlID09IFBPUl9NQUdJQ18xIAorCQl1bnNpZ25lZCBjaGFyIHBvck1hZ2ljMjsgICAvLyBtYWdpYyBudW1iZXI6IHNlY29uZCBieXRlID09IFBPUl9NQUdJQ18yIAorCisJCS8vIFRoZSBWZXJzaW9uLCBSZXZpc2lvbiwgYW5kIFN1YnJldmlzaW9uIGFyZSBzdG9yZWQgYXMgYWJzb2x1dGUgbnVtYmVycworCQkvLyBhbmQgd291bGQgbm9ybWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBmb3JtYXQgVi5SLlMgKGUuZy4gMS4wLjIpCisKKwkJdW5zaWduZWQgY2hhciBwb3JWZXJzaW9uOyAgLy8gQm9vdHN0cmFwIGZpcm13YXJlIHZlcnNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgcG9yUmV2aXNpb247IC8vIEJvb3RzdHJhcCBmaXJtd2FyZSByZXZpc2lvbiBudW1iZXIKKwkJdW5zaWduZWQgY2hhciBwb3JTdWJSZXY7ICAgLy8gQm9vdHN0cmFwIGZpcm13YXJlIHN1Yi1yZXZpc2lvbiBudW1iZXIKKworCQl1bnNpZ25lZCBjaGFyIHBvcklEOwkvLyBQcm9kdWN0IElEOiAgQml0LW1hcHBlZCBhY2NvcmRpbmcgdG8KKwkJCQkJCQkJLy8gY29udmVudGlvbnMgZGVzY3JpYmVkIGJlbG93LiBBbW9uZyBvdGhlcgorCQkJCQkJCQkvLyB0aGluZ3MsIHRoaXMgYWxsb3dzIHVzIHRvIGRpc3Rpbmd1aXNoCisJCQkJCQkJCS8vIEludGVsbGlQb3J0LUlJIGJvYXJkcyBmcm9tIEludGVsbGlQb3J0LUlJRVgKKwkJCQkJCQkJLy8gYm9hcmRzLgorCisJCXVuc2lnbmVkIGNoYXIgcG9yQnVzOwkvLyBJbnRlbGxpUG9ydC1JSTogVW51c2VkCisJCQkJCQkJCS8vIEludGVsbGlQb3J0LUlJRVg6IEJ1cyBJbmZvcm1hdGlvbjoKKwkJCQkJCQkJLy8gQml0LW1hcHBlZCBiZWxvdworCisJCXVuc2lnbmVkIGNoYXIgcG9yTWVtb3J5OwkvLyBPbi1ib2FyZCBEUkFNIHNpemU6IGluIDMyayBibG9ja3MKKworCQkvLyBwb3JQb3J0czEgKGFuZCBwb3JQb3J0czIpIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9ydHMgd2hpY2ggYXJlCisJCS8vIGF2YWlsYWJsZSB0byB0aGUgYm9hcmQuIEZvciBub24tZXhwYW5kYWJsZSBwcm9kdWN0LCBhIHNpbmdsZSBudW1iZXIgCisJCS8vIGlzIHN1ZmZpY2llbnQuIEZvciBleHBhbmRhYmxlIHByb2R1Y3QsIHRoZSBib2FyZCBtYXkgYmUgY29ubmVjdGVkCisJCS8vIHRvIGFzIG1hbnkgYXMgZm91ciBib3hlcy4gRWFjaCBib3ggbWF5IGJlIChzbyBmYXIpIGVpdGhlciBhIDE2LXBvcnQKKwkJLy8gb3IgYW4gOC1wb3J0IHNpemUuIFdoZW5ldmVyIGFuIDgtcG9ydCBib3ggaXMgdXNlZCwgdGhlIHJlbWFpbmluZyA4CisJCS8vIHBvcnRzIGxlYXZlIGdhcHMgYmV0d2VlbiBleGlzdGluZyBjaGFubmVscy4gRm9yIHRoYXQgcmVhc29uLAorCQkvLyBleHBhbmRhYmxlIHByb2R1Y3RzIG11c3QgcmVwb3J0IGEgTUFQIG9mIGF2YWlsYWJsZSBjaGFubmVscy4gU2luY2UgCisJCS8vIGVhY2ggVUFSVCBzdXBwb3J0cyBmb3VyIHBvcnRzLCB3ZSByZXByZXNlbnQgZWFjaCBVQVJUIGZvdW5kIGJ5IGEKKwkJLy8gc2luZ2xlIGJpdC4gVXNpbmcgdHdvIGJ5dGVzIHRvIHN1cHBseSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiB3ZQorCQkvLyByZXBvcnQgdGhlIHByZXNlbnNlIG9yIGFic2Vuc2Ugb2YgdXAgdG8gMTYgVUFSVFMsIG9yIDY0IHBvcnRzIGluCisJCS8vIHN0ZXBzIG9mIDQgcG9ydHMuIEZvciAtSUlFWCBwcm9kdWN0cywgdGhlIHBvcnRzIGFyZSBudW1iZXJlZAorCQkvLyBzdGFydGluZyBhdCB0aGUgYm94IGNsb3Nlc3QgdG8gdGhlIGNvbnRyb2xsZXIgaW4gdGhlICJjaGFpbiIuCisKKwkJLy8gSW50ZXJwcmV0ZWQgRGlmZmVyZW50bHkgZm9yIEludGVsbGlQb3J0LUlJIGFuZCAtSUlFWC4KKwkJLy8gLUlJOiAgIE51bWJlciBvZiBwb3J0cyAoRGVyaXZlZCBhY3R1YWxseSBmcm9tIHByb2R1Y3QgSUQpLiBTZWUKKwkJLy8gRGlhZzEmMiB0byBpbmRpY2F0ZSBpZiB1YXJ0IHdhcyBhY3R1YWxseSBkZXRlY3RlZC4KKwkJLy8gLUlJRVg6IEJpdC1tYXAgb2YgVUFSVFMgZm91bmQsIExTQiAoc2VlIGJlbG93IGZvciBNU0Igb2YgdGhpcykuIFRoaXMKKwkJLy8gICAgICAgIGJpdG1hcCBpcyBiYXNlZCBvbiBkZXRlY3RpbmcgdGhlIHVhcnRzIHRoZW1zZWx2ZXM7IAorCQkvLyAgICAgICAgc2VlIHBvckZsYWdzIGZvciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBib3ggaS5kJ3MuCisJCXVuc2lnbmVkIGNoYXIgIHBvclBvcnRzMTsKKworCQl1bnNpZ25lZCBjaGFyICBwb3JEaWFnMTsJLy8gUmVzdWx0cyBvZiBvbi1ib2FyZCBQLk8uUy5ULCAxc3QgYnl0ZQorCQl1bnNpZ25lZCBjaGFyICBwb3JEaWFnMjsJLy8gUmVzdWx0cyBvZiBvbi1ib2FyZCBQLk8uUy5ULCAybmQgYnl0ZQorCQl1bnNpZ25lZCBjaGFyICBwb3JTcGVlZDsJLy8gU3BlZWQgb2YgbG9jYWwgQ1BVOiBnaXZlbiBhcyBNSHogeDEwCisJCQkJCQkJCQkvLyBlLmcuLCAxNi4wIE1IeiBDUFUgaXMgcmVwb3J0ZWQgYXMgMTYwCisJCXVuc2lnbmVkIGNoYXIgIHBvckZsYWdzOwkvLyBNaXNjIGluZm9ybWF0aW9uIChzZWUgbWFuaWZlc3RzIGJlbG93KQorCQkJCQkJCQkJLy8gQml0LW1hcHBlZDogQ1BVIHR5cGUsIFVBUlQncyBwcmVzZW50CisKKwkJdW5zaWduZWQgY2hhciAgcG9yUG9ydHMyOwkvLyAtSUk6ICBVbmRlZmluZWQKKwkJCQkJCQkJCS8vIC1JSUVYOiBCaXQtbWFwIG9mIFVBUlRTIGZvdW5kLCBNU0IgKHNlZQorCQkJCQkJCQkJLy8gICAgICAgIGFib3ZlIGZvciBMU0IpCisKKwkJLy8gSW50ZWxsaVBvcnQtSUk6IHVuZGVmaW5lZAorCQkvLyBJbnRlbGxpUG9ydC1JSUVYOiAxIDw8IHBvckZpZm9TaXplIGdpdmVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlCisJCS8vIGhvc3QgaW50ZXJmYWNlIEZJRk8sIGluIGVhY2ggZGlyZWN0aW9uLiBXaGVuIHJ1bm5pbmcgdGhlIC1JSUVYIGluCisJCS8vIDgtYml0IG1vZGUsIGZpZm8gY2FwYWNpdHkgaXMgaGFsdmVkLiBUaGUgYm9vdHN0cmFwIGZpcm13YXJlIHdpbGwKKwkJLy8gaGF2ZSBhbHJlYWR5IGFjY291bnRlZCBmb3IgdGhpcyBmYWN0IGluIGdlbmVyYXRpbmcgdGhpcyBudW1iZXIuCisJCXVuc2lnbmVkIGNoYXIgIHBvckZpZm9TaXplOworCisJCS8vIEludGVsbGlQb3J0LUlJOiB1bmRlZmluZWQKKwkJLy8gSW50ZWxsaVBvcnQtSUlFWDogVGhlIG51bWJlciBvZiBib3hlcyBjb25uZWN0ZWQuIChQcmVzZW50bHkgMS00KQorCQl1bnNpZ25lZCBjaGFyICBwb3JOdW1Cb3hlczsKKwl9IGU7Cit9IHBvclN0ciwgKnBvclN0clB0cjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFsdWVzIGZvciBwb3JTdHIgZmllbGRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwb3JNYWdpYzEsIHBvck1hZ2ljMgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSAgUE9SX01BR0lDXzEgICAgMHg5NiAgLy8gVGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHBvck1hZ2ljMQorI2RlZmluZSAgUE9SX01BR0lDXzIgICAgMHgzNSAgLy8gVGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHBvck1hZ2ljMgorI2RlZmluZSAgUE9SXzFfSU5ERVggICAgMCAgICAgLy8gQnl0ZSBwb3NpdGlvbiBvZiBQT1JfTUFHSUNfMQorI2RlZmluZSAgUE9SXzJfSU5ERVggICAgMSAgICAgLy8gRGl0dG8gZm9yIFBPUl9NQUdJQ18yCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9ySUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgIFBPUl9JRF9GQU1JTFkgIDB4YzAJLy8gVGhlc2UgYml0cyBpbmRpY2F0ZSB0aGUgZ2VuZXJhbCBmYW1pbHkgb2YKKwkJCQkJCQkJLy8gcHJvZHVjdC4KKyNkZWZpbmUgIFBPUl9JRF9GSUkgICAgIDB4MDAJLy8gRmFtaWx5IGlzICJJbnRlbGxpUG9ydC1JSSIKKyNkZWZpbmUgIFBPUl9JRF9GSUlFWCAgIDB4NDAJLy8gRmFtaWx5IGlzICJJbnRlbGxpUG9ydC1JSUVYIgorCisvLyBUaGVzZSBiaXRzIGFyZSByZXNlcnZlZCwgcHJlc2VudGx5IHplcm8uIE1heSBiZSB1c2VkIGF0IGEgbGF0ZXIgZGF0ZSB0bworLy8gY29udmV5IG90aGVyIHByb2R1Y3QgaW5mb3JtYXRpb24uCisvLworI2RlZmluZSBQT1JfSURfUkVTRVJWRUQgMHgzYworCisjZGVmaW5lIFBPUl9JRF9TSVpFICAgICAweDAzCS8vIFJlbWFpbmluZyBiaXRzIGluZGljYXRlIG51bWJlciBvZiBwb3J0cyAmCisJCQkJCQkJCS8vIENvbm5lY3RvciBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgUE9SX0lEX0lJXzggICAgIDB4MDAJLy8gRm9yIEludGVsbGlQb3J0LUlJLCBpbmRpY2F0ZXMgOC1wb3J0IHVzaW5nCisJCQkJCQkJCS8vIHN0YW5kYXJkIGJyaWNrLgorI2RlZmluZSBQT1JfSURfSUlfOFIgICAgMHgwMQkvLyBGb3IgSW50ZWxsaVBvcnQtSUksIGluZGljYXRlcyA4LXBvcnQgdXNpbmcKKwkJCQkJCQkJLy8gUkoxMSdzIChubyBDVFMpCisjZGVmaW5lIFBPUl9JRF9JSV82ICAgICAweDAyCS8vIEZvciBJbnRlbGxpUG9ydC1JSSwgaW5kaWNhdGVzIDYtcG9ydCB1c2luZworCQkJCQkJCQkvLyBSSjQ1J3MKKyNkZWZpbmUgUE9SX0lEX0lJXzQgICAgIDB4MDMJLy8gRm9yIEludGVsbGlQb3J0LUlJLCBpbmRpY2F0ZXMgNC1wb3J0IHVzaW5nCisJCQkJCQkJCS8vIDR4Uko0NSBjb25uZWN0b3JzCisjZGVmaW5lIFBPUl9JRF9FWCAgICAgICAweDAwCS8vIEZvciBJbnRlbGxpUG9ydC1JSUVYLCBpbmRpY2F0ZXMgc3RhbmRhcmQKKwkJCQkJCQkJLy8gZXhwYW5kYWJsZSBjb250cm9sbGVyIChvdGhlciB2YWx1ZXMgcmVzZXJ2ZWQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yQnVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW50ZWxsaVBvcnQtSUlFWCBvbmx5OiBCb2FyZCBpcyBpbnN0YWxsZWQgaW4gYSAxNi1iaXQgc2xvdAorLy8KKyNkZWZpbmUgUE9SX0JVU19TTE9UMTYgIDB4MjAKKworLy8gSW50ZWxsaVBvcnQtSUlFWCBvbmx5OiBESVAgc3dpdGNoICM4IGlzIG9uLCBzZWxlY3RpbmcgMTYtYml0IGhvc3QgaW50ZXJmYWNlCisvLyBvcGVyYXRpb24uCisvLyAKKyNkZWZpbmUgUE9SX0JVU19ESVAxNiAgIDB4MTAKKworLy8gQml0cyAwLTIgaW5kaWNhdGUgdHlwZSBvZiBidXM6IFRoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBib290c3RyYXAKKy8vIGxvYWR3YXJlLCBkaWZmZXJlbnQgbG9hZHdhcmUgYmVpbmcgdXNlZCBvbiBkaWZmZXJlbnQgcHJvZHVjdHMgZm9yIGRpZmZlcmVudAorLy8gYnVzZXMuIEZvciBtb3N0IHNpdHVhdGlvbnMsIHRoZSBkcml2ZXJzIGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb247IGJ1dCBpdAorLy8gaXMgaGFuZHkgaW4gYSBkaWFnbm9zdGljIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgb24gbWljcm9jaGFubmVsIGJvYXJkcywKKy8vIHlvdSB3b3VsZCBub3Qgd2FudCB0byB0cnkgdG8gdGVzdCBzZXZlcmFsIGludGVycnVwdHMsIG9ubHkgdGhlIG9uZSBmb3Igd2hpY2gKKy8vIHlvdSB3ZXJlIGNvbmZpZ3VyZWQuCisvLworI2RlZmluZSAgUE9SX0JVU19UWVBFICAgMHgwNworCisvLyBVbmtub3duOiAgdGhpcyBwcm9kdWN0IGRvZXNuJ3Qga25vdyB3aGF0IGJ1cyBpdCBpcyBydW5uaW5nIGluLiAoZS5nLiBpZiBzYW1lCisvLyBib290c3RyYXAgZmlybXdhcmUgd2VyZSB3YW50ZWQgZm9yIHR3byBkaWZmZXJlbnQgYnVzZXMuKQorLy8KKyNkZWZpbmUgIFBPUl9CVVNfVF9VTksgIDAKKworLy8gTm90ZTogZXhpc3RpbmcgZmlybXdhcmUgZm9yIElTQS04IGFuZCBNQy04IGN1cnJlbnRseSByZXBvcnQgdGhlIFBPUl9CVVNfVF9VTksKKy8vIHN0YXRlLCBzaW5jZSB0aGUgc2FtZSBib290c3RyYXAgZmlybXdhcmUgaXMgdXNlZCBmb3IgZWFjaC4KKworI2RlZmluZSAgUE9SX0JVU19UX01DQSAgMSAgLy8gTUNBIEJVUyAqLworI2RlZmluZSAgUE9SX0JVU19UX0VJU0EgMiAgLy8gRUlTQSBCVVMgKi8KKyNkZWZpbmUgIFBPUl9CVVNfVF9JU0EgIDMgIC8vIElTQSBCVVMgKi8KKworLy8gVmFsdWVzIDQtNyBSZXNlcnZlZAorCisvLyBSZW1haW5pbmcgYml0cyBhcmUgcmVzZXJ2ZWQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwb3JEaWFnMQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgIFBPUl9CQURfTUFQUEVSIDB4ODAJLy8gSFcgZmFpbHVyZSBvbiBQLk8uUy5UOiBDaGlwIG1hcHBlciBmYWlsZWQKKworLy8gVGhlc2UgdHdvIGJpdHMgdmFsaWQgb25seSBmb3IgdGhlIEludGVsbGlQb3J0LUlJCisvLworI2RlZmluZSAgUE9SX0JBRF9VQVJUMSAgMHgwMQkvLyBGaXJzdCAgMTQwMCBiYWQKKyNkZWZpbmUgIFBPUl9CQURfVUFSVDIgIDB4MDIJLy8gU2Vjb25kIDE0MDAgYmFkCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yRGlhZzIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lICBQT1JfREVCVUdfUE9SVCAweDgwCS8vIGRlYnVnIHBvcnQgd2FzIGRldGVjdGVkIGJ5IHRoZSBQLk8uUy5UCisjZGVmaW5lICBQT1JfRElBR19PSyAgICAweDAwCS8vIEluZGljYXRlcyBwYXNzYWdlOiBGYWlsdXJlIGNvZGVzIG5vdCB5ZXQKKwkJCQkJCQkJLy8gYXZhaWxhYmxlLgorCQkJCQkJCQkvLyBPdGhlciBiaXRzIHVuZGVmaW5lZC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yRmxhZ3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lICBQT1JfQ1BVICAgICAweDAzCS8vIFRoZXNlIGJpdHMgaW5kaWNhdGUgc3VwcG9zZWQgQ1BVIHR5cGUKKyNkZWZpbmUgIFBPUl9DUFVfOCAgIDB4MDEJLy8gQm9hcmQgdXNlcyBhbiA4MDE4OCAobm8gc3VjaCB0aGluZyB5ZXQpCisjZGVmaW5lICBQT1JfQ1BVXzYgICAweDAyCS8vIEJvYXJkIHVzZXMgYW4gODAxODYgKGFsbCBleGlzdGluZyBwcm9kdWN0cykKKyNkZWZpbmUgIFBPUl9DRVg0ICAgIDB4MDQJLy8gSWYgc2V0LCB0aGlzIGlzIGFuIElTQS1DRVgvNDogQW4gSVNBLTQgKGFzaWMpCisJCQkJCQkJLy8gd2hpY2ggaXMgYXJjaGl0ZWN0ZWQgbGlrZSBhbiBJU0EtQ0VYIGNvbm5lY3RlZAorCQkJCQkJCS8vIHRvIGEgKGhpdGhlcnRvIGltcG9zc2libGUpIDQtcG9ydCBib3guCisjZGVmaW5lIFBPUl9CT1hFUyAgICAweGYwCS8vIFZhbGlkIGZvciBJbnRlbGxpUG9ydC1JSUVYIG9ubHk6IE1hcCBvZiBCb3gKKwkJCQkJCQkvLyBzaXplcyBiYXNlZCBvbiBib3ggSS5ELgorI2RlZmluZSBQT1JfQk9YXzE2ICAgMHgxMAkvLyBTZXQgaW5kaWNhdGVzIDE2LXBvcnQsIGNsZWFyIDgtcG9ydAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExPQURXQVJFIGFuZCBET1dOTE9BRElORyBDT0RFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKK0xvYWR3YXJlIG1heSBiZSBzZW50IHRvIHRoZSBib2FyZCBpbiB0d28gd2F5czoKKzEpIEl0IG1heSBiZSByZWFkIGZyb20gYSAoYmluYXJ5IGltYWdlKSBkYXRhIGZpbGUgYmxvY2sgYnkgYmxvY2sgYXMgZWFjaCBibG9jaworCWlzIHNlbnQgdG8gdGhlIGJvYXJkLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgd2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gaXMKKwlwZXJmb3JtZWQgYnkgY29kZSB3aGljaCBjYW4gYWNjZXNzIHlvdXIgZmlsZSBzeXN0ZW0uIFRoaXMgaXMgbW9zdCBzdWl0YWJsZQorCWZvciBkaWFnbm9zdGljcyBhbmQgYXBwaWNhdGlvbnMgd2hpY2ggdXNlIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBkaXJlY3RseS4KKworMikgSXQgbWF5IGJlIGhhcmQtY29kZWQgaW50byB5b3VyIHNvdXJjZSBieSBpbmNsdWRpbmcgYSAuaCBmaWxlICh0eXBpY2FsbHkKKwlzdXBwbGllZCBieSBDb21wdXRvbmUpLCB3aGljaCBkZWNsYXJlcyBhIGRhdGEgYXJyYXkgYW5kIGluaXRpYWxpemVzIGV2ZXJ5CisJZWxlbWVudC4gVGhpcyBhY2hlaXZlcyB0aGUgc2FtZSByZXN1bHQgYXMgaWYgYW4gZW50aXJlIGxvYWR3YXJlIGZpbGUgaGFkIAorCWJlZW4gcmVhZCBpbnRvIHRoZSBhcnJheS4KKworCVRoaXMgcmVxdWlyZXMgbW9yZSBkYXRhIHNwYWNlIGluIHlvdXIgcHJvZ3JhbSwgYnV0IGFjY2VzcyB0byB0aGUgZmlsZSBzeXN0ZW0KKwlpcyBub3QgcmVxdWlyZWQuIFRoaXMgbWV0aG9kIGlzIG1vcmUgc3VpdGVkIHRvIGRyaXZlciBjb2RlLCB3aGljaCB0eXBpY2FsbHkKKwlpcyBydW5uaW5nIGF0IGEgbGV2ZWwgdG9vIGxvdyB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtIGRpcmVjdGx5LgorCitBdCBwcmVzZW50LCBsb2Fkd2FyZSBjYW4gb25seSBiZSBnZW5lcmF0ZWQgYXQgQ29tcHV0b25lLgorCitBbGwgTG9hZHdhcmUgYmVnaW5zIHdpdGggYSBoZWFkZXIgYXJlYSB3aGljaCBoYXMgYSBwYXJ0aWN1bGFyIGZvcm1hdC4gVGhpcworaW5jbHVkZXMgYSBtYWdpYyBudW1iZXIgd2hpY2ggaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBiZWluZyAocHVycG9ydGVkbHkpCitsb2Fkd2FyZSwgQ1JDIChmb3IgdGhlIGxvYWRlciksIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uLgorKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JtYXQgb2YgbG9hZHdhcmUgYmxvY2sKKy8vCisvLyBUaGlzIGlzIGRlZmluZWQgYXMgYSB1bmlvbiBzbyB3ZSBjYW4gcGFzcyBhIHBvaW50ZXIgdG8gb25lIG9mIHRoZXNlIGl0ZW1zCisvLyBhbmQgKGlmIGl0IGlzIHRoZSBmaXJzdCBibG9jaykgcGljayBvdXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24sIGV0Yy4KKy8vCisvLyBPdGhlcndpc2UsIHRvIGRlYWwgd2l0aCB0aGlzIGFzIGEgc2ltcGxlIGNoYXJhY3RlciBhcnJheQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBMT0FEV0FSRV9CTE9DS19TSVpFICAgNTEyICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggYmxvY2sgb2YgbG9hZHdhcmUKKwordHlwZWRlZiB1bmlvbiBfbG9hZEhkclN0cgoreworCXVuc2lnbmVkIGNoYXIgY1tMT0FEV0FSRV9CTE9DS19TSVpFXTsgIC8vIFZhbGlkIGZvciBldmVyeSBibG9jaworCisJc3RydWN0CS8vIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZm9yIG9ubHkgdGhlIGZpcnN0IGJsb2NrIG9mIGxvYWR3YXJlLgorCXsKKwkJdW5zaWduZWQgY2hhciBsb2FkTWFnaWM7CQkvLyBNYWdpYyBudW1iZXI6IHNlZSBiZWxvdworCQl1bnNpZ25lZCBjaGFyIGxvYWRCbG9ja3NNb3JlOwkvLyBIb3cgbWFueSBtb3JlIGJsb2Nrcz8KKwkJdW5zaWduZWQgY2hhciBsb2FkQ1JDWzJdOwkJLy8gVHdvIENSQyBieXRlczogdXNlZCBieSBsb2FkZXIKKwkJdW5zaWduZWQgY2hhciBsb2FkVmVyc2lvbjsJCS8vIFZlcnNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFJldmlzaW9uOwkJLy8gUmV2aXNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFN1YlJldmlzaW9uOwkvLyBTdWItcmV2aXNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFNwYXJlc1s5XTsJLy8gUHJlc2VudGx5IHVudXNlZAorCQl1bnNpZ25lZCBjaGFyIGxvYWREYXRlc1szMl07CS8vIE51bGwtdGVybWluYXRlZCBzdHJpbmcgd2hpY2ggY2FuIGdpdmUKKwkJCQkJCQkJCQkvLyBkYXRlIGFuZCB0aW1lIG9mIGNvbXBpbGF0aW9uCisJfSBlOworfSBsb2FkSGRyU3RyLCAqbG9hZEhkclN0clB0cjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluZXMgZm9yIGRvd25sb2FkaW5nIGNvZGU6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgbG9hZE1hZ2ljIGZpZWxkIGluIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgbG9hZGZpbGUgbXVzdCBiZSB0aGlzLCBlbHNlIHRoZQorLy8gZmlsZSBpcyBub3QgdmFsaWQuCisvLworI2RlZmluZSAgTUFHSUNfTE9BREZJTEUgMHgzYworCisvLyBIb3cgZG8gd2Uga25vdyB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1bD8gT24gY29tcGxldGlvbiBvZiB0aGUgbG9hZCwgdGhlCisvLyBib290c3RyYXAgZmlybXdhcmUgcmV0dXJucyBhIGNvZGUgdG8gaW5kaWNhdGUgd2hldGhlciBpdCB0aG91Z2h0IHRoZSBkb3dubG9hZAorLy8gd2FzIHZhbGlkIGFuZCBpbnRlbmRzIHRvIGV4ZWN1dGUgaXQuIFRoZXNlIGFyZSB0aGUgb25seSBwb3NzaWJsZSB2YWxpZCBjb2RlczoKKy8vCisjZGVmaW5lICBMT0FEV0FSRV9PSyAgICAweGMzICAgICAgICAvLyBEb3dubG9hZCB3YXMgb2sKKyNkZWZpbmUgIExPQURXQVJFX0JBRCAgIDB4NWEgICAgICAgIC8vIERvd25sb2FkIHdhcyBiYWQgKENSQyBlcnJvcikKKworLy8gQ29uc3RhbnRzIGFwcGxpY2FibGUgdG8gd3JpdGluZyBibG9ja3Mgb2YgbG9hZHdhcmU6CisvLyBUaGUgZmlyc3QgYmxvY2sgb2YgbG9hZHdhcmUgbWlnaHQgdGFrZSA2MDAgbVMgdG8gbG9hZCwgaW4gZXh0cmVtZSBjYXNlcy4KKy8vIChFeHBhbmRhYmxlIGJvYXJkOiB3b3JzdCBjYXNlIGZvciBzZW5kaW5nIHN0YXJ0dXAgbWVzc2FnZXMgdG8gdGhlIExDRCdzKS4KKy8vIFRoZSA2MDBtUyBmaWd1cmUgaXMgbm90IHJlYWxseSBhIGNhbGN1bGF0aW9uLCBidXQgYSBjb25zZXJ2YXRpdmUKKy8vIGd1ZXNzL2d1YXJhbnRlZS4gVXN1YWxseSB0aGlzIHdpbGwgYmUgd2l0aGluIDEwMCBtUywgbGlrZSBzdWJzZXF1ZW50IGJsb2Nrcy4KKy8vCisjZGVmaW5lICBNQVhfRExPQURfU1RBUlRfVElNRSAxMDAwICAvLyAxMDAwIG1TCisjZGVmaW5lICBNQVhfRExPQURfUkVBRF9USU1FICAxMDAgICAvLyAxMDAgbVMKKworLy8gRmlybXdhcmUgc2hvdWxkIHJlc3BvbmQgd2l0aCBzdGF0dXMgKHNlZSBhYm92ZSkgd2l0aGluIHRoaXMgbG9uZyBvZiBob3N0CisvLyBoYXZpbmcgc2VudCB0aGUgZmluYWwgYmxvY2suCisvLworI2RlZmluZSAgTUFYX0RMT0FEX0FDS19USU1FICAgMTAwICAgLy8gMTAwIG1TLCBhZ2FpbiEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1BWElNVU0gTlVNQkVSIE9GIFBPUlRTIFBFUiBCT0FSRDoKKy8vIFRoaXMgaXMgZml4ZWQgZm9yIG5vdyAod2l0aCB0aGUgZXhwYW5kYWJsZSksIGJ1dCBtYXkKKy8vIGJlIGV4cGFuZGluZyBhY2NvcmRpbmcgdG8gZXZlbiBuZXdlciBwcm9kdWN0cy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSBBQlNfTUFYX0JPWEVTICAgNCAgICAgLy8gQWJzb2x1dGUgbW9zdCBib3hlcyBwZXIgYm9hcmQKKyNkZWZpbmUgQUJTX0JJR0dFU1RfQk9YIDE2ICAgIC8vIEFic29sdXRlIHRoZSBtb3N0IHBvcnRzIHBlciBib3gKKyNkZWZpbmUgQUJTX01PU1RfUE9SVFMgIChBQlNfTUFYX0JPWEVTICogQUJTX0JJR0dFU1RfQk9YKQorCisjZW5kaWYgICAvLyBJMkhXX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzVmMzAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCkBAIC0wLDAgKzEsMjIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IEhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBkZXZpY2UgZHJpdmVyLiBVc2VzIHRoZQorKiAgICAgICAgICAgICAgICBFeHRyZW1lbHkgTG93IExldmVsIEludGVyZmFjZSBTdXBwb3J0IChpMmVsbGlzLmMpLiBQcm92aWRlcyBhbgorKiAgICAgICAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIGxvYWR3YXJlLCB0byBzdXBwb3J0IGRyaXZlcnMgb3IKKyogICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29kZS4gKFRoaXMgaXMgaW5jbHVkZWQgc291cmNlIGNvZGUsIG5vdCBhIHNlcGFyYXRlCisqICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uIG1vZHVsZS4pCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vdGUgb24gU3RyYXRlZ3k6CisvLyBPbmNlIHRoZSBib2FyZCBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgd2lsbCBpbnRlcnJ1cHQgdXMgd2hlbjoKKy8vIDEpIEl0IGhhcyBzb21ldGhpbmcgaW4gdGhlIGZpZm8gZm9yIHVzIHRvIHJlYWQgKGluY29taW5nIGRhdGEsIGZsb3cgY29udHJvbAorLy8gcGFja2V0cywgb3Igd2hhdGV2ZXIpLgorLy8gMikgSXQgaGFzIHN0cmlwcGVkIHdoYXRldmVyIHdlIGhhdmUgc2VudCBsYXN0IHRpbWUgaW4gdGhlIEZJRk8gKGFuZAorLy8gY29uc2VxdWVudGx5IGlzIHJlYWR5IGZvciBtb3JlKS4KKy8vCisvLyBOb3RlIGFsc28gdGhhdCB0aGUgYnVmZmVyIHNpemVzIGRlY2xhcmVkIGluIGkybGliLmggYXJlIFZFUlkgU01BTEwuIFRoaXMKKy8vIHdvcnNlbnMgcGVyZm9ybWFuY2UgY29uc2lkZXJhYmx5LCBidXQgaXMgZG9uZSBzbyB0aGF0IGEgZ3JlYXQgbWFueSBjaGFubmVscworLy8gbWlnaHQgdXNlIG9ubHkgYSBsaXR0bGUgbWVtb3J5LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMC4wMCAtICA0LzE2LzkxIC0tLSBGaXJzdCBEcmFmdAorLy8gMC4wMSAtICA0LzI5LzkxIC0tLSAxc3QgYmV0YSByZWxlYXNlCisvLyAwLjAyIC0gIDYvMTQvOTEgLS0tIENoYW5nZXMgdG8gYWxsb3cgc21hbGwgbW9kZWwgY29tcGlsYXRpb24KKy8vIDAuMDMgLSAgNi8xNy85MSBNQUcgQnJlYWsgcmVwb3J0aW5nIHByb3RlY3RlZCBmcm9tIGludGVycnVwdHMgcm91dGluZXMgd2l0aAorLy8gICAgICAgICAgICAgICAgICAgICBpbi1saW5lIGFzbSBhZGRlZCBmb3IgbW92aW5nIGRhdGEgdG8vZnJvbSByaW5nIGJ1ZmZlcnMsCisvLyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2luZyBhIHZhcmlldHkgb2YgbWV0aG9kcyB1c2VkIHByZXZpb3VzbHkuCisvLyAwLjA0IC0gIDYvMjEvOTEgTUFHIEluaXRpYWwgZmxvdy1jb250cm9sIHBhY2tldHMgbm90IHF1ZXVlZCB1bnRpbAorLy8gICAgICAgICAgICAgICAgICAgICBpMl9lbmFibGVfaW50ZXJydXB0cyB0aW1lLiBGb3JtZXIgdmVyc2lvbnMgd291bGQgZW5xdWV1ZQorLy8gICAgICAgICAgICAgICAgICAgICB0aGVtIGF0IGkyX2luaXRfY2hhbm5lbCB0aW1lLCBiZWZvcmUgd2Uga25ldyBob3cgbWFueQorLy8gICAgICAgICAgICAgICAgICAgICBjaGFubmVscyB3ZXJlIHN1cHBvc2VkIHRvIGV4aXN0IQorLy8gMC4wNSAtIDEwLzEyLzkxIE1BRyBNYWpvciBjaGFuZ2VzOiB3b3JrcyB0aHJvdWdoIHRoZSBlbGxpcy5jIHJvdXRpbmVzIG5vdzsKKy8vICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgbmV3IDE2LWJpdCBwcm90b2NvbCBhbmQgZXhwYW5kYWJsZSBib2FyZHMuCisvLyAgICAgIC0gMTAvMjQvOTEgTUFHIE1vc3QgY2hhbmdlcyBpbiBwbGFjZSBhbmQgc3RhYmxlLgorLy8gMC4wNiAtICAyLzIwLzkyIE1BRyBGb3JtYXQgb2YgQ01EX0hPVEFDSyBjb3JyZWN0ZWQ6IHRoZSBjb21tYW5kIHRha2VzIG5vCisvLyAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LgorLy8gMC4wNyAtLSAzLzExLzkyIE1BRyBTdXBwb3J0IGFkZGVkIHRvIHN0b3JlIHNwZWNpYWwgcGFja2V0IHR5cGVzIGF0IGludGVycnVwdAorLy8gICAgICAgICAgICAgICAgICAgICBsZXZlbCAobW9zdGx5IHJlc3BvbnNlcyB0byBzcGVjaWZpYyBjb21tYW5kcy4pCisvLyAwLjA4IC0tIDMvMzAvOTIgTUFHIFN1cHBvcnQgYWRkZWQgZm9yIFNUQVRfTU9ERU0gcGFja2V0CisvLyAwLjA5IC0tIDYvMjQvOTMgTUFHIGkyTGluay4uLiBuZWVkZWQgdG8gdXBkYXRlIG51bWJlciBvZiBib2FyZHMgQkVGT1JFCisvLyAgICAgICAgICAgICAgICAgICAgIHR1cm5pbmcgb24gdGhlIGludGVycnVwdC4KKy8vIDAuMTAgLS0gNi8yNS85MyBNQUcgVG8gYXZvaWQgZ3J1ZXNvbWUgZGVhdGggZnJvbSBhIGJhZCBib2FyZCwgd2Ugc2FuaXR5IGNoZWNrCisvLyAgICAgICAgICAgICAgICAgICAgIHNvbWUgaW5jb21pbmcuCisvLworLy8gMS4xICAtIDEyLzI1Lzk2IEFLTSBMaW51eCB2ZXJzaW9uLgorLy8gICAgICAtIDEwLzA5Lzk4IERNQyBSZXZpc2VkIExpbnV4IHZlcnNpb24uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyoqKioqKioqKioqKgorLy8qIEluY2x1ZGVzICoKKy8vKioqKioqKioqKioqCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgImkybGliLmgiCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKgorLy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKgorLy8qKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQgaTJRdWV1ZU5lZWRzKGkyZUJvcmRTdHJQdHIsIGkyQ2hhblN0clB0ciwgaW50KTsKK3N0YXRpYyBpMkNoYW5TdHJQdHIgaTJEZVF1ZXVlTmVlZHMoaTJlQm9yZFN0clB0ciwgaW50ICk7CitzdGF0aWMgdm9pZCBpMlN0cmlwRmlmbyhpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGkyU3R1ZmZGaWZvQnlwYXNzKGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaTJTdHVmZkZpZm9GbG93KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaTJTdHVmZkZpZm9JbmxpbmUoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGkyUmV0cnlGbHVzaE91dHB1dChpMkNoYW5TdHJQdHIpOworCisvLyBOb3QgYSBkb2N1bWVudGVkIHBhcnQgb2YgdGhlIGxpYnJhcnkgcm91dGluZXMgKGNhcmVmdWwuLi4pIGJ1dCB0aGUgRGlhZ25vc3RpYworLy8gaTJkaWFnLmMgZmluZHMgdGhlbSB1c2VmdWwgdG8gaGVscCB0aGUgdGhyb3VnaHB1dCBpbiBjZXJ0YWluIGxpbWl0ZWQKKy8vIHNpbmdsZS10aHJlYWRlZCBvcGVyYXRpb25zLgorc3RhdGljIHZvaWQgaWlTZW5kUGVuZGluZ01haWwoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBzZXJ2aWNlT3V0Z29pbmdGaWZvKGkyZUJvcmRTdHJQdHIpOworCisvLyBGdW5jdGlvbnMgZGVmaW5lZCBpbiBpcDIuYyBhcyBwYXJ0IG9mIGludGVycnVwdCBoYW5kbGluZworc3RhdGljIHZvaWQgZG9faW5wdXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIGRvX3N0YXR1cyh2b2lkICopOworCisvLyoqKioqKioqKioqKioqKgorLy8qIERlYnVnICBEYXRhICoKKy8vKioqKioqKioqKioqKioqCisjaWZkZWYgREVCVUdfRklGTworCit1bnNpZ25lZCBjaGFyIERCR0J1ZlsweDQwMDBdOwordW5zaWduZWQgc2hvcnQgSSA9IDA7CisKK3N0YXRpYyB2b2lkCitXcml0ZURCR0J1ZihjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIHNob3J0IG4gKSAKK3sKKwljaGFyICpwID0gc3JjOworCisJLy8gWFhYOiBXZSBuZWVkIGEgc3BpbiBsb2NrIGhlcmUgaWYgd2UgZXZlciB1c2UgdGhpcyBhZ2FpbgorCisJd2hpbGUgKCpzKSB7CS8vIGNvcHkgbGFiZWwKKwkJREJHQnVmW0ldID0gKnMrKzsKKwkJSSA9IEkrKyAmIDB4M2ZmZjsKKwl9CisJd2hpbGUgKG4tLSkgewkvLyBjb3B5IGRhdGEKKwkJREJHQnVmW0ldID0gKnArKzsKKwkJSSA9IEkrKyAmIDB4M2ZmZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmYXRhbGl0eShpMmVCb3JkU3RyUHRyIHBCICkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wO2k8c2l6ZW9mKERCR0J1Zik7aSsrKSB7CisJCWlmICgoaSUxNikgPT0gMCkKKwkJCXByaW50aygiXG4lNHg6IixpKTsKKwkJcHJpbnRrKCIlMDJ4ICIsREJHQnVmW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCWZvciAoaT0wO2k8c2l6ZW9mKERCR0J1Zik7aSsrKSB7CisJCWlmICgoaSUxNikgPT0gMCkKKwkJCXByaW50aygiXG4lNHg6IixpKTsKKwkJaWYgKERCR0J1ZltpXSA+PSAnICcgJiYgREJHQnVmW2ldIDw9ICd+JykgeworCQkJcHJpbnRrKCIgJWMgIixEQkdCdWZbaV0pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIgLiAiKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJMYXN0IGluZGV4ICV4XG4iLEkpOworfQorI2VuZGlmIC8qIERFQlVHX0ZJRk8gKi8KKworLy8qKioqKioqKgorLy8qIENvZGUgKgorLy8qKioqKioqKgorCitzdGF0aWMgaW5saW5lIGludAoraTJWYWxpZGF0ZSAoIGkyQ2hhblN0clB0ciBwQ2ggKQoreworCS8vaXAydHJhY2UocENoLT5wb3J0X2luZGV4LCBJVFJDX1ZFUklGWSxJVFJDX0VOVEVSLDIscENoLT52YWxpZGl0eSwKKwkvLwkoQ0hBTk5FTF9NQUdJQyB8IENIQU5ORUxfU1VQUE9SVCkpOworCXJldHVybiAoKHBDaC0+dmFsaWRpdHkgJiAoQ0hBTk5FTF9NQUdJQ19CSVRTIHwgQ0hBTk5FTF9TVVBQT1JUKSkgCisJCQkgID09IChDSEFOTkVMX01BR0lDIHwgQ0hBTk5FTF9TVVBQT1JUKSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVNlbmRQZW5kaW5nTWFpbChwQikKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUKKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIElmIGFueSBvdXRnb2luZyBtYWlsIGJpdHMgYXJlIHNldCBhbmQgdGhlcmUgaXMgb3V0Z29pbmcgbWFpbGJveCBpcyBlbXB0eSwKKy8vIHNlbmQgdGhlIG1haWwgYW5kIGNsZWFyIHRoZSBiaXRzLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWlTZW5kUGVuZGluZ01haWwoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpZiAocEItPmkyZU91dE1haWxXYWl0aW5nICYmICghcEItPmkyZVdhaXRpbmdGb3JFbXB0eUZpZm8pICkKKwl7CisJCWlmIChpaVRyeVNlbmRNYWlsKHBCLCBwQi0+aTJlT3V0TWFpbFdhaXRpbmcpKQorCQl7CisJCQkvKiBJZiB3ZSB3ZXJlIGFscmVhZHkgd2FpdGluZyBmb3IgZmlmbyB0byBlbXB0eSwKKwkJCSAqIG9yIGp1c3Qgc2VudCBNQl9PVVRfU1RVRkZFRCwgdGhlbiB3ZSBhcmUKKwkJCSAqIHN0aWxsIHdhaXRpbmcgZm9yIGl0IHRvIGVtcHR5LCB1bnRpbCB3ZSBzaG91bGQKKwkJCSAqIHJlY2VpdmUgYW4gTUJfSU5fU1RSSVBQRUQgZnJvbSB0aGUgYm9hcmQuCisJCQkgKi8KKwkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvIHw9CisJCQkJKHBCLT5pMmVPdXRNYWlsV2FpdGluZyAmIE1CX09VVF9TVFVGRkVEKTsKKwkJCXBCLT5pMmVPdXRNYWlsV2FpdGluZyA9IDA7CisJCQlwQi0+U2VuZFBlbmRpbmdSZXRyeSA9IDA7CisJCX0gZWxzZSB7CisvKgkJVGhlIG9ubHkgdGltZSB3ZSBoaXQgdGhpcyBhcmVhIGlzIHdoZW4gImlpVHJ5U2VuZE1haWwiIGhhcworCQlmYWlsZWQuICBUaGF0IG9ubHkgb2NjdXJzIHdoZW4gdGhlIG91dGJvdW5kIG1haWxib3ggaXMKKwkJc3RpbGwgYnVzeSB3aXRoIHRoZSBsYXN0IG1lc3NhZ2UuICBXZSB0YWtlIGEgc2hvcnQgYnJlYXRoZXIKKwkJdG8gbGV0IHRoZSBib2FyZCBjYXRjaCB1cCB3aXRoIGl0c2VsZiBhbmQgdGhlbiB0cnkgYWdhaW4uCisJCTE2IFJldHJpZXMgaXMgdGhlIGxpbWl0IC0gdGhlbiB3ZSBnb3QgYSBib3JrZWQgYm9hcmQuCisJCQkvXC9cfD1taHc9fFwvXC8JCQkJKi8KKworCQkJaWYoICsrcEItPlNlbmRQZW5kaW5nUmV0cnkgPCAxNiApIHsKKworCQkJCWluaXRfdGltZXIoICYocEItPlNlbmRQZW5kaW5nVGltZXIpICk7CisJCQkJcEItPlNlbmRQZW5kaW5nVGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMTsKKwkJCQlwQi0+U2VuZFBlbmRpbmdUaW1lci5mdW5jdGlvbiA9ICh2b2lkKikodW5zaWduZWQgbG9uZylpaVNlbmRQZW5kaW5nTWFpbDsKKwkJCQlwQi0+U2VuZFBlbmRpbmdUaW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXBCOworCQkJCWFkZF90aW1lciggJihwQi0+U2VuZFBlbmRpbmdUaW1lcikgKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBpaVNlbmRQZW5kaW5nTWFpbCB1bmFibGUgdG8gcXVldWUgb3V0Ym91bmQgbWFpbFxuIiApOworCQkJfQorCQl9CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJJbml0Q2hhbm5lbHMocEIsIG5DaGFubmVscywgcENoKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBFbGxpcyBCb2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICBQb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gYW4gYXJyYXkgb2YgY2hhbm5lbCBzdHJ1Y3R1cmVzCisvLyBSZXR1cm5zOiAgICBTdWNjZXNzIG9yIGZhaWx1cmUKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHBhdGNoZXMgcG9pbnRlcnMsIGJhY2stcG9pbnRlcnMsIGFuZCBpbml0aWFsaXplcyBhbGwgdGhlCisvLyBlbGVtZW50cyBpbiB0aGUgY2hhbm5lbCBzdHJ1Y3R1cmUgYXJyYXkuCisvLworLy8gVGhpcyBzaG91bGQgYmUgcnVuIGFmdGVyIHRoZSBib2FyZCBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIHRocm91Z2ggaGF2aW5nCisvLyBsb2FkZWQgdGhlIHN0YW5kYXJkIGxvYWR3YXJlIChvdGhlcndpc2UgaXQgY29tcGxhaW5zKS4KKy8vCisvLyBJbiBhbnkgY2FzZSwgaXQgbXVzdCBiZSBkb25lIGJlZm9yZSBhbnkgc2VyaW91cyB3b3JrIGJlZ2lucyBpbml0aWFsaXppbmcgdGhlCisvLyBpcnEncyBvciBzZW5kaW5nIGNvbW1hbmRzLi4uCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kySW5pdENoYW5uZWxzICggaTJlQm9yZFN0clB0ciBwQiwgaW50IG5DaGFubmVscywgaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgaW5kZXgsIHN0dWZmSW5kZXg7CisJaTJDaGFuU3RyUHRyICpwcENoOworCQorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKSB7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRE1BR0lDKTsKKwl9CisJaWYgKHBCLT5pMmVTdGF0ZSAhPSBJSV9TVEFURV9TVERMT0FERUQpIHsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFEU1RBVEUpOworCX0KKworCUxPQ0tfSU5JVCgmcEItPnJlYWRfZmlmb19zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+RGJ1Zl9zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+QmJ1Zl9zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+RmJ1Zl9zcGlubG9jayk7CisJCisJLy8gTk8gTE9DSyBuZWVkZWQgeWV0IC0gdGhpcyBpcyBpbml0CisKKwlwQi0+aTJlQ2hhbm5lbFB0ciA9IHBDaDsKKwlwQi0+aTJlQ2hhbm5lbENudCA9IG5DaGFubmVsczsKKworCXBCLT5pMkZidWZfc3RyaXAgPSBwQi0+aTJGYnVmX3N0dWZmID0gMDsKKwlwQi0+aTJEYnVmX3N0cmlwID0gcEItPmkyRGJ1Zl9zdHVmZiA9IDA7CisJcEItPmkyQmJ1Zl9zdHJpcCA9IHBCLT5pMkJidWZfc3R1ZmYgPSAwOworCisJcEItPlNlbmRQZW5kaW5nUmV0cnkgPSAwOworCisJbWVtc2V0ICggcENoLCAwLCBzaXplb2YgKGkyQ2hhblN0cikgKiBuQ2hhbm5lbHMgKTsKKworCWZvciAoaW5kZXggPSBzdHVmZkluZGV4ID0gMCwgcHBDaCA9IChpMkNoYW5TdHJQdHIgKikocEItPmkyRmJ1Zik7CisJCSAgbkNoYW5uZWxzICYmIGluZGV4IDwgQUJTX01PU1RfUE9SVFM7CisJCSAgaW5kZXgrKykKKwl7CisJCWlmICggIShwQi0+aTJlQ2hhbm5lbE1hcFtpbmRleCA+PiA0XSAmICgxIDw8IChpbmRleCAmIDB4ZikpICkgKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlMT0NLX0lOSVQoJnBDaC0+SWJ1Zl9zcGlubG9jayk7CisJCUxPQ0tfSU5JVCgmcENoLT5PYnVmX3NwaW5sb2NrKTsKKwkJTE9DS19JTklUKCZwQ2gtPkNidWZfc3BpbmxvY2spOworCQlMT0NLX0lOSVQoJnBDaC0+UGJ1Zl9zcGlubG9jayk7CisJCS8vIE5PIExPQ0sgbmVlZGVkIHlldCAtIHRoaXMgaXMgaW5pdAorCQkvLyBTZXQgdXAgdmFsaWRpdHkgZmxhZyBhY2NvcmRpbmcgdG8gc3VwcG9ydCBsZXZlbAorCQlpZiAocEItPmkyZUdvb2RNYXBbaW5kZXggPj4gNF0gJiAoMSA8PCAoaW5kZXggJiAweGYpKSApIHsKKwkJCXBDaC0+dmFsaWRpdHkgPSBDSEFOTkVMX01BR0lDIHwgQ0hBTk5FTF9TVVBQT1JUOworCQl9IGVsc2UgeworCQkJcENoLT52YWxpZGl0eSA9IENIQU5ORUxfTUFHSUM7CisJCX0KKwkJcENoLT5wTXlCb3JkID0gcEI7ICAgICAgLyogQmFjay1wb2ludGVyICovCisKKwkJLy8gUHJlcGFyZSBhbiBvdXRnb2luZyBmbG93LWNvbnRyb2wgcGFja2V0IHRvIHNlbmQgYXMgc29vbiBhcyB0aGUgY2hhbmNlCisJCS8vIG9jY3Vycy4KKwkJaWYgKCBwQ2gtPnZhbGlkaXR5ICYgQ0hBTk5FTF9TVVBQT1JUICkgeworCQkJcENoLT5pbmZsLmhkLmkyc0NoYW5uZWwgPSBpbmRleDsKKwkJCXBDaC0+aW5mbC5oZC5pMnNDb3VudCA9IDU7CisJCQlwQ2gtPmluZmwuaGQuaTJzVHlwZSA9IFBUWVBFX0JZUEFTUzsKKwkJCXBDaC0+aW5mbC5mY21kID0gMzc7CisJCQlwQ2gtPmluZmwuYXNvZiA9IDA7CisJCQlwQ2gtPmluZmwucm9vbSA9IElCVUZfU0laRSAtIDE7CisKKwkJCXBDaC0+d2hlblNlbmRGbG93ID0gKElCVUZfU0laRS81KSo0OyAvLyB3aGVuIDgwJSBmdWxsCisKKwkJLy8gVGhlIGZvbGxvd2luZyBpcyBzaW1pbGFyIHRvIGNhbGxpbmcgaTJRdWV1ZU5lZWRzLCBleGNlcHQgdGhhdCB0aGlzCisJCS8vIGlzIGRvbmUgaW4gbG9uZ2hhbmQsIHNpbmNlIHdlIGFyZSBzZXR0aW5nIHVwIGluaXRpYWwgY29uZGl0aW9ucyBvbgorCQkvLyBtYW55IGNoYW5uZWxzIGF0IG9uY2UuCisJCQlwQ2gtPmNoYW5uZWxOZWVkcyA9IE5FRURfRkxPVzsgIC8vIFNpbmNlIHN0YXJ0aW5nIGZyb20gc2NyYXRjaAorCQkJcENoLT5zaW5jZUxhc3RGbG93ID0gMDsgICAgICAgICAvLyBObyBieXRlcyByZWNlaXZlZCBzaW5jZSBsYXN0IGZsb3cKKwkJCQkJCQkJCQkJLy8gY29udHJvbCBwYWNrZXQgd2FzIHF1ZXVlZAorCQkJc3R1ZmZJbmRleCsrOworCQkJKnBwQ2grKyA9IHBDaDsgICAgICAvLyBMaXN0IHRoaXMgY2hhbm5lbCBhcyBuZWVkaW5nCisJCQkJCQkJCS8vIGluaXRpYWwgZmxvdyBjb250cm9sIHBhY2tldCBzZW50CisJCX0KKworCQkvLyBEb24ndCBhbGxvdyBhbnl0aGluZyB0byBiZSBzZW50IHVudGlsIHRoZSBzdGF0dXMgcGFja2V0cyBjb21lIGluIGZyb20KKwkJLy8gdGhlIGJvYXJkLgorCisJCXBDaC0+b3V0ZmwuYXNvZiA9IDA7CisJCXBDaC0+b3V0Zmwucm9vbSA9IDA7CisKKwkJLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIHJpbmcgYnVmZmVycworCisJCXBDaC0+SWJ1Zl9zdHVmZiA9IHBDaC0+SWJ1Zl9zdHJpcCA9IDA7CisJCXBDaC0+T2J1Zl9zdHVmZiA9IHBDaC0+T2J1Zl9zdHJpcCA9IDA7CisJCXBDaC0+Q2J1Zl9zdHVmZiA9IHBDaC0+Q2J1Zl9zdHJpcCA9IDA7CisKKwkJbWVtc2V0KCAmcENoLT5pY291bnQsIDAsIHNpemVvZiAoc3RydWN0IGFzeW5jX2ljb3VudCkgKTsKKwkJcENoLT5ob3RLZXlJbiAgICAgICA9IEhPVF9DTEVBUjsKKwkJcENoLT5jaGFubmVsT3B0aW9ucyA9IDA7CisJCXBDaC0+Ym9va01hcmtzICAgICAgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwQ2gtPnBCb29rbWFya1dhaXQpOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBDaC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcENoLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcENoLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJLy8gU2V0IGJhc2UgYW5kIGRpdmlzb3Igc28gZGVmYXVsdCBjdXN0b20gcmF0ZSBpcyA5NjAwCisJCXBDaC0+QmF1ZEJhc2UgICAgPSA5MjE2MDA7CS8vIE1BWCBmb3IgU1Q2NTQsIGNoYW5nZWQgYWZ0ZXIgd2UgZ2V0CisJCXBDaC0+QmF1ZERpdmlzb3IgPSA5NjsJCS8vIHRoZSBib3hpZHMgKFVBUlQgdHlwZXMpIGxhdGVyCisKKwkJcENoLT5kYXRhU2V0SW4gICA9IDA7CisJCXBDaC0+ZGF0YVNldE91dCAgPSAwOworCisJCXBDaC0+d29wZW4gICAgICAgPSAwOworCQlwQ2gtPnRocm90dGxlZCAgID0gMDsKKworCQlwQ2gtPnNwZWVkICAgICAgID0gQ0JSXzk2MDA7CisKKwkJcENoLT5mbGFncyAgICA9IDA7CisKKwkJcENoLT5DbG9zaW5nRGVsYXkgICAgID0gNSpIWi8xMDsKKwkJcENoLT5DbG9zaW5nV2FpdFRpbWUgID0gMzAqSFo7CisKKwkJLy8gSW5pdGlhbGl6ZSB0YXNrIHF1ZXVlIG9iamVjdHMKKwkJSU5JVF9XT1JLKCZwQ2gtPnRxdWV1ZV9pbnB1dCwgZG9faW5wdXQsIHBDaCk7CisJCUlOSVRfV09SSygmcENoLT50cXVldWVfc3RhdHVzLCBkb19zdGF0dXMsIHBDaCk7CisKKyNpZmRlZiBJUDJERUJVR19UUkFDRQorCQlwQ2gtPnRyYWNlID0gaXAydHJhY2U7CisjZW5kaWYKKworCQkrK3BDaDsKKyAgICAgCS0tbkNoYW5uZWxzOworCX0KKwkvLyBObyBuZWVkIHRvIGNoZWNrIGZvciB3cmFwIGhlcmU7IHRoaXMgaXMgaW5pdGlhbGl6YXRpb24uCisJcEItPmkyRmJ1Zl9zdHVmZiA9IHN0dWZmSW5kZXg7CisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7CisKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyRGVRdWV1ZU5lZWRzKHBCLCB0eXBlKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgdHlwZSBiaXQgbWFwOiBtYXkgaW5jbHVkZSBORUVEX0lOTElORSwgTkVFRF9CWVBBU1MsIG9yIE5FRURfRkxPVworLy8gUmV0dXJuczogICAKKy8vICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOiBSZXR1cm5zIHBvaW50ZXIgc3RydWN0IG9mIG5leHQgY2hhbm5lbCB0aGF0IG5lZWRzIHNlcnZpY2Ugb2YKKy8vICB0aGUgdHlwZSBzcGVjaWZpZWQuIE90aGVyd2lzZSByZXR1cm5zIGEgTlVMTCByZWZlcmVuY2UuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpMkNoYW5TdHJQdHIgCitpMkRlUXVldWVOZWVkcyhpMmVCb3JkU3RyUHRyIHBCLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBxdWV1ZUluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpMkNoYW5TdHJQdHIgcENoID0gTlVMTDsKKworCXN3aXRjaCh0eXBlKSB7CisKKwljYXNlICBORUVEX0lOTElORToKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT5EYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCBwQi0+aTJEYnVmX3N0dWZmICE9IHBCLT5pMkRidWZfc3RyaXApCisJCXsKKwkJCXF1ZXVlSW5kZXggPSBwQi0+aTJEYnVmX3N0cmlwOworCQkJcENoID0gcEItPmkyRGJ1ZltxdWV1ZUluZGV4XTsKKwkJCXF1ZXVlSW5kZXgrKzsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpIHsKKwkJCQlxdWV1ZUluZGV4ID0gMDsKKwkJCX0KKwkJCXBCLT5pMkRidWZfc3RyaXAgPSBxdWV1ZUluZGV4OworCQkJcENoLT5jaGFubmVsTmVlZHMgJj0gfk5FRURfSU5MSU5FOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+RGJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKworCWNhc2UgTkVFRF9CWVBBU1M6CisKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+QmJ1Zl9zcGlubG9jayxmbGFncyk7CisJCWlmIChwQi0+aTJCYnVmX3N0dWZmICE9IHBCLT5pMkJidWZfc3RyaXApCisJCXsKKwkJCXF1ZXVlSW5kZXggPSBwQi0+aTJCYnVmX3N0cmlwOworCQkJcENoID0gcEItPmkyQmJ1ZltxdWV1ZUluZGV4XTsKKwkJCXF1ZXVlSW5kZXgrKzsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpIHsKKwkJCQlxdWV1ZUluZGV4ID0gMDsKKwkJCX0KKwkJCXBCLT5pMkJidWZfc3RyaXAgPSBxdWV1ZUluZGV4OworCQkJcENoLT5jaGFubmVsTmVlZHMgJj0gfk5FRURfQllQQVNTOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+QmJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKwkKKwljYXNlIE5FRURfRkxPVzoKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT5GYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKHBCLT5pMkZidWZfc3R1ZmYgIT0gcEItPmkyRmJ1Zl9zdHJpcCkKKwkJeworCQkJcXVldWVJbmRleCA9IHBCLT5pMkZidWZfc3RyaXA7CisJCQlwQ2ggPSBwQi0+aTJGYnVmW3F1ZXVlSW5kZXhdOworCQkJcXVldWVJbmRleCsrOworCQkJaWYgKHF1ZXVlSW5kZXggPj0gQ0hfUVVFVUVfU0laRSkgeworCQkJCXF1ZXVlSW5kZXggPSAwOworCQkJfQorCQkJcEItPmkyRmJ1Zl9zdHJpcCA9IHF1ZXVlSW5kZXg7CisJCQlwQ2gtPmNoYW5uZWxOZWVkcyAmPSB+TkVFRF9GTE9XOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+RmJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImkyRGVRdWV1ZU5lZWRzIGNhbGxlZCB3aXRoIGJhZCB0eXBlOiV4XG4iLHR5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHBDaDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyUXVldWVOZWVkcyhwQiwgcENoLCB0eXBlKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICB0eXBlIGJpdCBtYXA6IG1heSBpbmNsdWRlIE5FRURfSU5MSU5FLCBORUVEX0JZUEFTUywgb3IgTkVFRF9GTE9XCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBGb3IgZWFjaCB0eXBlIG9mIG5lZWQgc2VsZWN0ZWQsIGlmIHRoZSBnaXZlbiBjaGFubmVsIGlzIG5vdCBhbHJlYWR5IGluIHRoZQorLy8gcXVldWUsIGFkZHMgaXQsIGFuZCBzZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgaXQgaXMgaW4gdGhlIHF1ZXVlLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpMlF1ZXVlTmVlZHMoaTJlQm9yZFN0clB0ciBwQiwgaTJDaGFuU3RyUHRyIHBDaCwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgc2hvcnQgcXVldWVJbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy8gV2UgdHVybiBvZmYgYWxsIHRoZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGlzIGJyaWVmIHByb2Nlc3MsIHNpbmNlIHRoZQorCS8vIGludGVycnVwdC1sZXZlbCBjb2RlIG1pZ2h0IHdhbnQgdG8gcHV0IHRoaW5ncyBvbiB0aGUgcXVldWUgYXMgd2VsbC4KKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBORUVEX0lOTElORToKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT5EYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCAhKHBDaC0+Y2hhbm5lbE5lZWRzICYgTkVFRF9JTkxJTkUpICkKKwkJeworCQkJcENoLT5jaGFubmVsTmVlZHMgfD0gTkVFRF9JTkxJTkU7CisJCQlxdWV1ZUluZGV4ID0gcEItPmkyRGJ1Zl9zdHVmZjsKKwkJCXBCLT5pMkRidWZbcXVldWVJbmRleCsrXSA9IHBDaDsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpCisJCQkJcXVldWVJbmRleCA9IDA7CisJCQlwQi0+aTJEYnVmX3N0dWZmID0gcXVldWVJbmRleDsKKwkJfQorCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPkRidWZfc3BpbmxvY2ssZmxhZ3MpOyAKKwkJYnJlYWs7CisKKwljYXNlIE5FRURfQllQQVNTOgorCisJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcEItPkJidWZfc3BpbmxvY2ssZmxhZ3MpOworCQlpZiAoKHR5cGUgJiBORUVEX0JZUEFTUykgJiYgIShwQ2gtPmNoYW5uZWxOZWVkcyAmIE5FRURfQllQQVNTKSkKKwkJeworCQkJcENoLT5jaGFubmVsTmVlZHMgfD0gTkVFRF9CWVBBU1M7CisJCQlxdWV1ZUluZGV4ID0gcEItPmkyQmJ1Zl9zdHVmZjsKKwkJCXBCLT5pMkJidWZbcXVldWVJbmRleCsrXSA9IHBDaDsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpCisJCQkJcXVldWVJbmRleCA9IDA7CisJCQlwQi0+aTJCYnVmX3N0dWZmID0gcXVldWVJbmRleDsKKwkJfSAKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT5CYnVmX3NwaW5sb2NrLGZsYWdzKTsgCisJCWJyZWFrOworCisJY2FzZSBORUVEX0ZMT1c6CisKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+RmJ1Zl9zcGlubG9jayxmbGFncyk7CisJCWlmICgodHlwZSAmIE5FRURfRkxPVykgJiYgIShwQ2gtPmNoYW5uZWxOZWVkcyAmIE5FRURfRkxPVykpCisJCXsKKwkJCXBDaC0+Y2hhbm5lbE5lZWRzIHw9IE5FRURfRkxPVzsKKwkJCXF1ZXVlSW5kZXggPSBwQi0+aTJGYnVmX3N0dWZmOworCQkJcEItPmkyRmJ1ZltxdWV1ZUluZGV4KytdID0gcENoOworCQkJaWYgKHF1ZXVlSW5kZXggPj0gQ0hfUVVFVUVfU0laRSkKKwkJCQlxdWV1ZUluZGV4ID0gMDsKKwkJCXBCLT5pMkZidWZfc3R1ZmYgPSBxdWV1ZUluZGV4OworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+RmJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKworCWNhc2UgTkVFRF9DUkVESVQ6CisJCXBDaC0+Y2hhbm5lbE5lZWRzIHw9IE5FRURfQ1JFRElUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImkyUXVldWVOZWVkcyBjYWxsZWQgd2l0aCBiYWQgdHlwZToleFxuIix0eXBlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyUXVldWVDb21tYW5kcyh0eXBlLCBwQ2gsIHRpbWVvdXQsIG5Db21tYW5kcywgcENzLC4uLikKKy8vIFBhcmFtZXRlcnM6IHR5cGUgLSBQVFlQRV9CWVBBU1Mgb3IgUFRZUEVfSU5MSU5FCisvLyAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjaGFubmVsIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbWF4aW11bSBwZXJpb2QgdG8gd2FpdAorLy8gICAgICAgICAgICAgbnVtYmVyIG9mIGNvbW1hbmRzIChuKQorLy8gICAgICAgICAgICAgbiBjb21tYW5kcworLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGNvbW1hbmRzIHNlbnQsIG9yIC0xIGZvciBlcnJvcgorLy8KKy8vIGdldCBib2FyZCBsb2NrIGJlZm9yZSBjYWxsaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBRdWV1ZXMgdXAgc29tZSBjb21tYW5kcyB0byBiZSBzZW50IHRvIGEgY2hhbm5lbC4gVG8gc2VuZCBwb3NzaWJseSBzZXZlcmFsCisvLyBieXBhc3Mgb3IgaW5saW5lIGNvbW1hbmRzIHRvIHRoZSBnaXZlbiBjaGFubmVsLiBUaGUgdGltZW91dCBwYXJhbWV0ZXIKKy8vIGluZGljYXRlcyBob3cgbWFueSBIVU5EUkVEVEhTIE9GIFNFQ09ORFMgdG8gd2FpdCB1bnRpbCB0aGVyZSBpcyByb29tOgorLy8gMCA9IHJldHVybiBpbW1lZGlhdGVseSBpZiBubyByb29tLCAtaXZlICA9IHdhaXQgZm9yZXZlciwgK2l2ZSA9IG51bWJlciBvZgorLy8gMS8xMDAgc2Vjb25kcyB0byB3YWl0LiBSZXR1cm4gdmFsdWVzOgorLy8gLTEgU29tZSBraW5kIG9mIG5hc3R5IGVycm9yOiBiYWQgY2hhbm5lbCBzdHJ1Y3R1cmUgb3IgaW52YWxpZCBhcmd1bWVudHMuCisvLyAgMCBObyByb29tIHRvIHNlbmQgYWxsIHRoZSBjb21tYW5kcworLy8gKCspICAgTnVtYmVyIG9mIGNvbW1hbmRzIHNlbnQKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpMlF1ZXVlQ29tbWFuZHMoaW50IHR5cGUsIGkyQ2hhblN0clB0ciBwQ2gsIGludCB0aW1lb3V0LCBpbnQgbkNvbW1hbmRzLAorCQkJCQkgY21kU3ludGF4UHRyIHBDczAsLi4uKQoreworCWludCB0b3RhbHNpemUgPSAwOworCWludCBibG9ja3NpemU7CisJaW50IGxhc3RlbmRlZDsKKwljbWRTeW50YXhQdHIgKnBwQ3M7CisJY21kU3ludGF4UHRyIHBDczsKKwlpbnQgY291bnQ7CisJaW50IGZsYWc7CisJaTJlQm9yZFN0clB0ciBwQjsKKworCXVuc2lnbmVkIHNob3J0IG1heEJsb2NrOworCXVuc2lnbmVkIHNob3J0IG1heEJ1ZmY7CisJc2hvcnQgYnVmcm9vbTsKKwl1bnNpZ25lZCBzaG9ydCBzdHVmZkluZGV4OworCXVuc2lnbmVkIGNoYXIgKnBCdWY7CisJdW5zaWduZWQgY2hhciAqcEluc2VydDsKKwl1bnNpZ25lZCBjaGFyICpwRGVzdCwgKnBTb3VyY2U7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwlpbnQgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXJ3bG9ja190ICpsb2NrX3Zhcl9wID0gTlVMTDsKKworCS8vIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBleGlzdHMsIG90aGVyd2lzZSBkbyBub3RoaW5nCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCBJVFJDX0VOVEVSLCAwICk7CisKKwlwQiA9IHBDaC0+cE15Qm9yZDsKKworCS8vIEJvYXJkIG11c3QgYWxzbyBleGlzdCwgYW5kIFRIRSBJTlRFUlJVUFQgQ09NTUFORCBBTFJFQURZIFNFTlQKKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQyB8fCBwQi0+aTJlVXNpbmdJcnEgPT0gSVJRX1VOREVGSU5FRCkgeworCQlyZXR1cm4gLTI7CisJfQorCS8vIElmIHRoZSBib2FyZCBoYXMgZ29uZSBmYXRhbCwgcmV0dXJuIGJhZCwgYW5kIGFsc28gaGl0IHRoZSB0cmFwIHJvdXRpbmUgaWYKKwkvLyBpdCBleGlzdHMuCisJaWYgKHBCLT5pMmVGYXRhbCkgeworCQlpZiAoIHBCLT5pMmVGYXRhbFRyYXAgKSB7CisJCQkoKihwQiktPmkyZUZhdGFsVHJhcCkocEIpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisJLy8gU2V0IHVwIHNvbWUgdmFyaWFibGVzLCBXaGljaCBidWZmZXJzIGFyZSB3ZSB1c2luZz8gIEhvdyBiaWcgYXJlIHRoZXk/CisJc3dpdGNoKHR5cGUpCisJeworCWNhc2UgUFRZUEVfSU5MSU5FOgorCQlmbGFnID0gSU5MOworCQltYXhCbG9jayA9IE1BWF9PQlVGX0JMT0NLOworCQltYXhCdWZmID0gT0JVRl9TSVpFOworCQlwQnVmID0gcENoLT5PYnVmOworCQlicmVhazsKKwljYXNlIFBUWVBFX0JZUEFTUzoKKwkJZmxhZyA9IEJZUDsKKwkJbWF4QmxvY2sgPSBNQVhfQ0JVRl9CTE9DSzsKKwkJbWF4QnVmZiA9IENCVUZfU0laRTsKKwkJcEJ1ZiA9IHBDaC0+Q2J1ZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC00OworCX0KKwkvLyBEZXRlcm1pbmUgdGhlIHRvdGFsIHNpemUgcmVxdWlyZWQgZm9yIGFsbCB0aGUgY29tbWFuZHMKKwl0b3RhbHNpemUgPSBibG9ja3NpemUgPSBzaXplb2YoaTJDbWRIZWFkZXIpOworCWxhc3RlbmRlZCA9IDA7CisJcHBDcyA9ICZwQ3MwOworCWZvciAoIGNvdW50ID0gbkNvbW1hbmRzOyBjb3VudDsgY291bnQtLSwgcHBDcysrKQorCXsKKwkJcENzID0gKnBwQ3M7CisJCWNudCA9IHBDcy0+bGVuZ3RoOworCQkvLyBXaWxsIGEgbmV3IGJsb2NrIGJlIG5lZWRlZCBmb3IgdGhpcyBvbmU/IAorCQkvLyBUd28gcG9zc2libGUgcmVhc29uczogdG9vCisJCS8vIGJpZyBvciBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LgorCQlpZiAoKGJsb2Nrc2l6ZSArIGNudCA+IG1heEJsb2NrKSB8fCBsYXN0ZW5kZWQpIHsKKwkJCWJsb2Nrc2l6ZSA9IHNpemVvZihpMkNtZEhlYWRlcik7CisJCQl0b3RhbHNpemUgKz0gc2l6ZW9mKGkyQ21kSGVhZGVyKTsKKwkJfQorCQl0b3RhbHNpemUgKz0gY250OworCQlibG9ja3NpemUgKz0gY250OworCisJCS8vIElmIHRoaXMgY29tbWFuZCBoYWQgdG8gZW5kIGEgYmxvY2ssIHRoZW4gd2Ugd2lsbCBtYWtlIHN1cmUgdG8KKwkJLy8gYWNjb3VudCBmb3IgaXQgc2hvdWxkIHRoZXJlIGJlIGFueSBtb3JlIGJsb2Nrcy4KKwkJbGFzdGVuZGVkID0gcENzLT5mbGFncyAmIEVORDsKKwl9CisJZm9yICg7OykgeworCQkvLyBNYWtlIHN1cmUgYW55IHBlbmRpbmcgZmx1c2ggY29tbWFuZHMgZ28gb3V0IGJlZm9yZSB3ZSBhZGQgbW9yZSBkYXRhLgorCQlpZiAoICEoIHBDaC0+Zmx1c2hfZmxhZ3MgJiYgaTJSZXRyeUZsdXNoT3V0cHV0KCBwQ2ggKSApICkgeworCQkJLy8gSG93IG11Y2ggcm9vbSAodGhpcyB0aW1lIHRocm91Z2gpID8KKwkJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIFBUWVBFX0lOTElORToKKwkJCQlsb2NrX3Zhcl9wID0gJnBDaC0+T2J1Zl9zcGlubG9jazsKKwkJCQlXUklURV9MT0NLX0lSUVNBVkUobG9ja192YXJfcCxmbGFncyk7CisJCQkJc3R1ZmZJbmRleCA9IHBDaC0+T2J1Zl9zdHVmZjsKKwkJCQlidWZyb29tID0gcENoLT5PYnVmX3N0cmlwIC0gc3R1ZmZJbmRleDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFRZUEVfQllQQVNTOgorCQkJCWxvY2tfdmFyX3AgPSAmcENoLT5DYnVmX3NwaW5sb2NrOworCQkJCVdSSVRFX0xPQ0tfSVJRU0FWRShsb2NrX3Zhcl9wLGZsYWdzKTsKKwkJCQlzdHVmZkluZGV4ID0gcENoLT5DYnVmX3N0dWZmOworCQkJCWJ1ZnJvb20gPSBwQ2gtPkNidWZfc3RyaXAgLSBzdHVmZkluZGV4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLTU7CisJCQl9CisJCQlpZiAoLS1idWZyb29tIDwgMCkgeworCQkJCWJ1ZnJvb20gKz0gbWF4QnVmZjsKKwkJCX0KKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCAyLCAxLCBidWZyb29tICk7CisKKwkJCS8vIENoZWNrIGZvciBvdmVyZmxvdworCQkJaWYgKHRvdGFsc2l6ZSA8PSBidWZyb29tKSB7CisJCQkJLy8gTm9ybWFsIEV4cGVjdGVkIHBhdGggLSBXZSBzdGlsbCBob2xkIExPQ0sKKwkJCQlicmVhazsgLyogZnJvbSBmb3IoKS0gRW5vdWdoIHJvb206IGdvdG8gcHJvY2VlZCAqLworCQkJfQorCQl9CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCAzLCAxLCB0b3RhbHNpemUgKTsKKworCQkvLyBQcmVwYXJlIHRvIHdhaXQgZm9yIGJ1ZmZlcnMgdG8gZW1wdHkKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUobG9ja192YXJfcCxmbGFncyk7IAorCQlzZXJ2aWNlT3V0Z29pbmdGaWZvKHBCKTsJLy8gRHVtcCB3aGF0IHdlIGdvdAorCisJCWlmICh0aW1lb3V0ID09IDApIHsKKwkJCXJldHVybiAwOyAgIC8vIFRpcmVkIG9mIHdhaXRpbmcKKwkJfQorCQlpZiAodGltZW91dCA+IDApCisJCQl0aW1lb3V0LS07ICAgLy8gU28gbmVnYXRpdmUgdmFsdWVzID09IGZvcmV2ZXIKKwkJCisJCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsJLy8gc2hvcnQgbmFwIAorCQl9IGVsc2UgeworCQkJLy8gd2UgY2Fubm90IHNjaGVkL3NsZWVwIGluIGludGVycnJ1cHQgc2lsbHkKKwkJCXJldHVybiAwOyAgIAorCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dXJuIDA7ICAgLy8gV2FrZSB1cCEgVGltZSB0byBkaWUhISEKKwkJfQorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19RVUVVRSwgNCwgMCApOworCisJfQkvLyBlbmQgb2YgZm9yKDs7KQorCisJLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHJvb20gYW5kIHRoZSBsb2NrIC0gc3RpY2sgdGhlbSBpbi4KKwljaGFubmVsID0gcENoLT5pbmZsLmhkLmkyc0NoYW5uZWw7CisJcEluc2VydCA9ICZwQnVmW3N0dWZmSW5kZXhdOyAgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiBwYWNrZXQKKwlwRGVzdCA9IENNRF9PRihwSW5zZXJ0KTsgICAgICAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIGNvbW1hbmQKKworCS8vIFdoZW4gd2Ugc3RhcnQgY291bnRpbmcsIHRoZSBibG9jayBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisJZm9yIChibG9ja3NpemUgPSBzaXplb2YoaTJDbWRIZWFkZXIpLCBjb3VudCA9IG5Db21tYW5kcywKKwkJCWxhc3RlbmRlZCA9IDAsIHBwQ3MgPSAmcENzMDsKKwkJY291bnQ7CisJCWNvdW50LS0sIHBwQ3MrKykKKwl7CisJCXBDcyA9ICpwcENzOyAgICAgICAgIC8vIFBvaW50cyB0byBjb21tYW5kIHByb3RvY29sIHN0cnVjdHVyZQorCisJCS8vIElmIHRoaXMgaXMgYSBib29rbWFyayByZXF1ZXN0IGNvbW1hbmQsIHBvc3QgdGhlIGZhY3QgdGhhdCBhIGJvb2ttYXJrCisJCS8vIHJlcXVlc3QgaXMgcGVuZGluZy4gTk9URSBUSElTIFRSSUNLIE9OTFkgV09SS1MgQkVDQVVTRSBDTURfQk1BUktfUkVRCisJCS8vIGhhcyBubyBwYXJhbWV0ZXJzISAgVGhlIG1vcmUgZ2VuZXJhbCBzb2x1dGlvbiB3b3VsZCBiZSB0byByZWZlcmVuY2UKKwkJLy8gcENzLT5jbWRbMF0uCisJCWlmIChwQ3MgPT0gQ01EX0JNQVJLX1JFUSkgeworCQkJcENoLT5ib29rTWFya3MrKzsKKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0RSQUlOLCAzMCwgMSwgcENoLT5ib29rTWFya3MgKTsKKworCQl9CisJCWNudCA9IHBDcy0+bGVuZ3RoOworCisJCS8vIElmIHRoaXMgY29tbWFuZCB3b3VsZCBwdXQgdXMgb3ZlciB0aGUgbWF4aW11bSBibG9jayBzaXplIG9yIAorCQkvLyBpZiB0aGUgbGFzdCBjb21tYW5kIGhhZCB0byBiZSBhdCB0aGUgZW5kIG9mIGEgYmxvY2ssIHdlIGVuZAorCQkvLyB0aGUgZXhpc3RpbmcgYmxvY2sgaGVyZSBhbmQgc3RhcnQgYSBuZXcgb25lLgorCQlpZiAoKGJsb2Nrc2l6ZSArIGNudCA+IG1heEJsb2NrKSB8fCBsYXN0ZW5kZWQpIHsKKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCA1LCAwICk7CisKKwkJCVBUWVBFX09GKHBJbnNlcnQpID0gdHlwZTsKKwkJCUNIQU5ORUxfT0YocEluc2VydCkgPSBjaGFubmVsOworCQkJLy8gY291bnQgaGVyZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBoZWFkZXIKKwkJCUNNRF9DT1VOVF9PRihwSW5zZXJ0KSA9IGJsb2Nrc2l6ZSAtIHNpemVvZihpMkNtZEhlYWRlcik7CisJCQlzdHVmZkluZGV4ICs9IGJsb2Nrc2l6ZTsKKwkJCWlmKHN0dWZmSW5kZXggPj0gbWF4QnVmZikgeworCQkJCXN0dWZmSW5kZXggPSAwOworCQkJCXBJbnNlcnQgPSBwQnVmOworCQkJfQorCQkJcEluc2VydCA9ICZwQnVmW3N0dWZmSW5kZXhdOyAgLy8gUG9pbnRlciB0byBzdGFydCBvZiBuZXh0IHBrdAorCQkJcERlc3QgPSBDTURfT0YocEluc2VydCk7CisJCQlibG9ja3NpemUgPSBzaXplb2YoaTJDbWRIZWFkZXIpOworCQl9CisJCS8vIE5vdyB3ZSBrbm93IHRoZXJlIGlzIHJvb20gZm9yIHRoaXMgb25lIGluIHRoZSBjdXJyZW50IGJsb2NrCisKKwkJYmxvY2tzaXplICs9IGNudDsgICAgICAgLy8gVG90YWwgYnl0ZXMgaW4gdGhpcyBjb21tYW5kCisJCXBTb3VyY2UgPSBwQ3MtPmNtZDsgICAgIC8vIENvcHkgdGhlIGNvbW1hbmQgaW50byB0aGUgYnVmZmVyCisJCXdoaWxlIChjbnQtLSkgeworCQkJKnBEZXN0KysgPSAqcFNvdXJjZSsrOworCQl9CisJCS8vIElmIHRoaXMgY29tbWFuZCBoYWQgdG8gZW5kIGEgYmxvY2ssIHRoZW4gd2Ugd2lsbCBtYWtlIHN1cmUgdG8gYWNjb3VudAorCQkvLyBmb3IgaXQgc2hvdWxkIHRoZXJlIGJlIGFueSBtb3JlIGJsb2Nrcy4KKwkJbGFzdGVuZGVkID0gcENzLT5mbGFncyAmIEVORDsKKwl9CS8vIGVuZCBmb3IKKwkvLyBDbGVhbiB1cCB0aGUgZmluYWwgYmxvY2sgYnkgd3JpdGluZyBoZWFkZXIsIGV0YworCisJUFRZUEVfT0YocEluc2VydCkgPSB0eXBlOworCUNIQU5ORUxfT0YocEluc2VydCkgPSBjaGFubmVsOworCS8vIGNvdW50IGhlcmUgZG9lcyBub3QgaW5jbHVkZSB0aGUgaGVhZGVyCisJQ01EX0NPVU5UX09GKHBJbnNlcnQpID0gYmxvY2tzaXplIC0gc2l6ZW9mKGkyQ21kSGVhZGVyKTsKKwlzdHVmZkluZGV4ICs9IGJsb2Nrc2l6ZTsKKwlpZihzdHVmZkluZGV4ID49IG1heEJ1ZmYpIHsKKwkJc3R1ZmZJbmRleCA9IDA7CisJCXBJbnNlcnQgPSBwQnVmOworCX0KKwkvLyBVcGRhdGVzIHRoZSBpbmRleCwgYW5kIHBvc3QgdGhlIG5lZWQgZm9yIHNlcnZpY2UuIFdoZW4gYWRkaW5nIHRoZXNlIHRvCisJLy8gdGhlIHF1ZXVlIG9mIGNoYW5uZWxzLCB3ZSB0dXJuIG9mZiB0aGUgaW50ZXJydXB0IHdoaWxlIGRvaW5nIHNvLAorCS8vIGJlY2F1c2UgYXQgaW50ZXJydXB0IGxldmVsIHdlIG1pZ2h0IHdhbnQgdG8gcHVzaCBhIGNoYW5uZWwgYmFjayB0byB0aGUKKwkvLyBlbmQgb2YgdGhlIHF1ZXVlLgorCXN3aXRjaCh0eXBlKQorCXsKKwljYXNlIFBUWVBFX0lOTElORToKKwkJcENoLT5PYnVmX3N0dWZmID0gc3R1ZmZJbmRleDsgIC8vIFN0b3JlIGJ1ZmZlciBwb2ludGVyCisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPk9idWZfc3BpbmxvY2ssZmxhZ3MpOyAKKworCQlwQi0+ZGVidWdJbmxpbmVRdWV1ZWQrKzsKKwkJLy8gQWRkIHRoZSBjaGFubmVsIHBvaW50ZXIgdG8gbGlzdCBvZiBjaGFubmVscyBuZWVkaW5nIHNlcnZpY2UgKGZpcnN0CisJCS8vIGNvbWUuLi4pLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgorCQlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9JTkxJTkUpOworCQlicmVhazsKKworCWNhc2UgUFRZUEVfQllQQVNTOgorCQlwQ2gtPkNidWZfc3R1ZmYgPSBzdHVmZkluZGV4OyAgLy8gU3RvcmUgYnVmZmVyIHBvaW50ZXIKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+Q2J1Zl9zcGlubG9jayxmbGFncyk7IAorCisJCXBCLT5kZWJ1Z0J5cGFzc1F1ZXVlZCsrOworCQkvLyBBZGQgdGhlIGNoYW5uZWwgcG9pbnRlciB0byBsaXN0IG9mIGNoYW5uZWxzIG5lZWRpbmcgc2VydmljZSAoZmlyc3QKKwkJLy8gY29tZS4uLiksIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuCisJCWkyUXVldWVOZWVkcyhwQiwgcENoLCBORUVEX0JZUEFTUyk7CisJCWJyZWFrOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19RVUVVRSwgSVRSQ19SRVRVUk4sIDEsIG5Db21tYW5kcyApOworCisJcmV0dXJuIG5Db21tYW5kczsgLy8gR29vZCBzdGF0dXM6IG51bWJlciBvZiBjb21tYW5kcyBzZW50Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMkdldFN0YXR1cyhwQ2gscmVzZXRCaXRzKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBCaXQgbWFwIG9mIHN0YXR1cyBiaXRzIHRvIGNsZWFyCisvLyBSZXR1cm5zOiAgICBCaXQgbWFwIG9mIGN1cnJlbnQgc3RhdHVzIGJpdHMKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFJldHVybnMgdGhlIHN0YXRlIG9mIGRhdGEgc2V0IHNpZ25hbHMsIGFuZCB3aGV0aGVyIGEgYnJlYWsgaGFzIGJlZW4gcmVjZWl2ZWQsCisvLyAoc2VlIGkybGliLmggZm9yIGJpdC1tYXBwZWQgcmVzdWx0KS4gcmVzZXRCaXRzIGlzIGEgYml0LW1hcCBvZiBhbnkgc3RhdHVzCisvLyBiaXRzIHRvIGJlIGNsZWFyZWQ6IEkyX0JSSywgSTJfUEFSLCBJMl9GUkEsIEkyX09WUiwuLi4gVGhlc2UgYXJlIGNsZWFyZWQKKy8vIEFGVEVSIHRoZSBjb25kaXRpb24gaXMgcGFzc2VkLiBJZiBwQ2ggZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCBjaGFubmVsLAorLy8gcmV0dXJucyAtMSAod2hpY2ggd291bGQgYmUgaW1wb3NzaWJsZSBvdGhlcndpc2UuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraTJHZXRTdGF0dXMoaTJDaGFuU3RyUHRyIHBDaCwgaW50IHJlc2V0Qml0cykKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJaTJlQm9yZFN0clB0ciBwQjsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19TVEFUVVMsIElUUkNfRU5URVIsIDIsIHBDaC0+ZGF0YVNldEluLCByZXNldEJpdHMgKTsKKworCS8vIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBleGlzdHMsIG90aGVyd2lzZSBkbyBub3RoaW5nICovCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkKKwkJcmV0dXJuIC0xOworCisJcEIgPSBwQ2gtPnBNeUJvcmQ7CisKKwlzdGF0dXMgPSBwQ2gtPmRhdGFTZXRJbjsKKworCS8vIENsZWFyIGFueSBzcGVjaWZpZWQgZXJyb3IgYml0czogYnV0IG5vdGUgdGhhdCBvbmx5IGFjdHVhbCBlcnJvciBiaXRzIGNhbgorCS8vIGJlIGNsZWFyZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIHBhc3NlZC4KKwlpZiAocmVzZXRCaXRzKQorCXsKKwkJcENoLT5kYXRhU2V0SW4gJj0gfihyZXNldEJpdHMgJiAoSTJfQlJLIHwgSTJfUEFSIHwgSTJfRlJBIHwgSTJfT1ZSKSk7CisJCXBDaC0+ZGF0YVNldEluICY9IH4oSTJfRERDRCB8IEkyX0RDVFMgfCBJMl9ERFNSIHwgSTJfRFJJKTsKKwl9CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU1RBVFVTLCBJVFJDX1JFVFVSTiwgMSwgcENoLT5kYXRhU2V0SW4gKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMklucHV0KHBDaHBEZXN0LGNvdW50KQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisvLyAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIGZvciBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gU3RyaXBzIGRhdGEgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgaXQgdG8gcERlc3QuIElmIHRoZXJlIGlzIGEKKy8vIGNvbGxvc2FsIGJsdW5kZXIsIChpbnZhbGlkIHN0cnVjdHVyZSBwb2ludGVycyBvciB0aGUgbGlrZSksIHJldHVybnMgLTEuCisvLyBPdGhlcndpc2UsIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kySW5wdXQoaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgYW1vdW50VG9Nb3ZlOworCXVuc2lnbmVkIHNob3J0IHN0cmlwSW5kZXg7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lOUFVULCBJVFJDX0VOVEVSLCAwKTsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSggcENoICkgKSB7CisJCWNvdW50ID0gLTE7CisJCWdvdG8gaTJJbnB1dF9leGl0OworCX0KKwlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisKKwkvLyBpbml0aWFsaXplIHNvbWUgYWNjZWxlcmF0b3JzIGFuZCBwcml2YXRlIGNvcGllcworCXN0cmlwSW5kZXggPSBwQ2gtPklidWZfc3RyaXA7CisKKwljb3VudCA9IHBDaC0+SWJ1Zl9zdHVmZiAtIHN0cmlwSW5kZXg7CisKKwkvLyBJZiBidWZmZXIgaXMgZW1wdHkgb3IgcmVxdWVzdGVkIGRhdGEgY291bnQgd2FzIDAsICh0cml2aWFsIGNhc2UpIHJldHVybgorCS8vIHdpdGhvdXQgYW55IGZ1cnRoZXIgdGhvdWdodC4KKwlpZiAoIGNvdW50ID09IDAgKSB7CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpOworCQlnb3RvIGkySW5wdXRfZXhpdDsKKwl9CisJLy8gQWRqdXN0IGZvciBidWZmZXIgd3JhcAorCWlmICggY291bnQgPCAwICkgeworCQljb3VudCArPSBJQlVGX1NJWkU7CisJfQorCS8vIERvbid0IGdpdmUgbW9yZSB0aGFuIGNhbiBiZSB0YWtlbiBieSB0aGUgbGluZSBkaXNjaXBsaW5lCisJYW1vdW50VG9Nb3ZlID0gcENoLT5wVFRZLT5sZGlzYy5yZWNlaXZlX3Jvb20oIHBDaC0+cFRUWSApOworCWlmIChjb3VudCA+IGFtb3VudFRvTW92ZSkgeworCQljb3VudCA9IGFtb3VudFRvTW92ZTsKKwl9CisJLy8gSG93IG11Y2ggY291bGQgd2UgY29weSB3aXRob3V0IGEgd3JhcD8KKwlhbW91bnRUb01vdmUgPSBJQlVGX1NJWkUgLSBzdHJpcEluZGV4OworCisJaWYgKGFtb3VudFRvTW92ZSA+IGNvdW50KSB7CisJCWFtb3VudFRvTW92ZSA9IGNvdW50OworCX0KKwkvLyBNb3ZlIHRoZSBmaXJzdCBibG9jaworCXBDaC0+cFRUWS0+bGRpc2MucmVjZWl2ZV9idWYoIHBDaC0+cFRUWSwgCisJCSAmKHBDaC0+SWJ1ZltzdHJpcEluZGV4XSksIE5VTEwsIGFtb3VudFRvTW92ZSApOworCS8vIElmIHdlIG5lZWRlZCB0byB3cmFwLCBkbyB0aGUgc2Vjb25kIGRhdGEgbW92ZQorCWlmIChjb3VudCA+IGFtb3VudFRvTW92ZSkgeworCQlwQ2gtPnBUVFktPmxkaXNjLnJlY2VpdmVfYnVmKCBwQ2gtPnBUVFksIAorCQkgcENoLT5JYnVmLCBOVUxMLCBjb3VudCAtIGFtb3VudFRvTW92ZSApOworCX0KKwkvLyBCdW1wIGFuZCB3cmFwIHRoZSBzdHJpcEluZGV4IGFsbCBhdCBvbmNlIGJ5IHRoZSBhbW91bnQgb2YgZGF0YSByZWFkLiBUaGlzCisJLy8gbWV0aG9kIGlzIGdvb2QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkYXRhIHdhcyBpbiBvbmUgb3IgdHdvIHBpZWNlcy4KKwlzdHJpcEluZGV4ICs9IGNvdW50OworCWlmIChzdHJpcEluZGV4ID49IElCVUZfU0laRSkgeworCQlzdHJpcEluZGV4IC09IElCVUZfU0laRTsKKwl9CisJcENoLT5JYnVmX3N0cmlwID0gc3RyaXBJbmRleDsKKworCS8vIFVwZGF0ZSBvdXIgZmxvdyBjb250cm9sIGluZm9ybWF0aW9uIGFuZCBwb3NzaWJseSBxdWV1ZSBvdXJzZWx2ZXMgdG8gc2VuZAorCS8vIGl0LCBkZXBlbmRpbmcgb24gaG93IG11Y2ggZGF0YSBoYXMgYmVlbiBzdHJpcHBlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGEKKwkvLyBwYWNrZXQgd2FzIHNlbnQuCisJcENoLT5pbmZsLmFzb2YgKz0gY291bnQ7CisKKwlpZiAoKHBDaC0+c2luY2VMYXN0RmxvdyArPSBjb3VudCkgPj0gcENoLT53aGVuU2VuZEZsb3cpIHsKKwkJcENoLT5zaW5jZUxhc3RGbG93IC09IHBDaC0+d2hlblNlbmRGbG93OworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaTJRdWV1ZU5lZWRzKHBDaC0+cE15Qm9yZCwgcENoLCBORUVEX0ZMT1cpOworCX0gZWxzZSB7CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpOworCX0KKworaTJJbnB1dF9leGl0OgorCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lOUFVULCBJVFJDX1JFVFVSTiwgMSwgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJJbnB1dEZsdXNoKHBDaCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHN0cmlwcGVkLCBvciAtMSBmb3IgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFN0cmlwcyBhbnkgZGF0YSBmcm9tIHRoZSBpbnB1dCBidWZmZXIuIElmIHRoZXJlIGlzIGEgY29sbG9zYWwgYmx1bmRlciwKKy8vIChpbnZhbGlkIHN0cnVjdHVyZSBwb2ludGVycyBvciB0aGUgbGlrZSksIHJldHVybnMgLTEuIE90aGVyd2lzZSwgcmV0dXJucyB0aGUKKy8vIG51bWJlciBvZiBieXRlcyBzdHJpcHBlZC4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpMklucHV0Rmx1c2goaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkKKwkJcmV0dXJuIC0xOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lOUFVULCAxMCwgMCk7CisKKwlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisJY291bnQgPSBwQ2gtPklidWZfc3R1ZmYgLSBwQ2gtPklidWZfc3RyaXA7CisKKwkvLyBBZGp1c3QgZm9yIGJ1ZmZlciB3cmFwCisJaWYgKGNvdW50IDwgMCkgeworCQljb3VudCArPSBJQlVGX1NJWkU7CisJfQorCisJLy8gRXhwZWRpZW50IHdheSB0byB6ZXJvIG91dCB0aGUgYnVmZmVyCisJcENoLT5JYnVmX3N0cmlwID0gcENoLT5JYnVmX3N0dWZmOworCisKKwkvLyBVcGRhdGUgb3VyIGZsb3cgY29udHJvbCBpbmZvcm1hdGlvbiBhbmQgcG9zc2libHkgcXVldWUgb3Vyc2VsdmVzIHRvIHNlbmQKKwkvLyBpdCwgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIGRhdGEgaGFzIGJlZW4gc3RyaXBwZWQgc2luY2UgdGhlIGxhc3QgdGltZSBhCisJLy8gcGFja2V0IHdhcyBzZW50LgorCisJcENoLT5pbmZsLmFzb2YgKz0gY291bnQ7CisKKwlpZiAoIChwQ2gtPnNpbmNlTGFzdEZsb3cgKz0gY291bnQpID49IHBDaC0+d2hlblNlbmRGbG93ICkKKwl7CisJCXBDaC0+c2luY2VMYXN0RmxvdyAtPSBwQ2gtPndoZW5TZW5kRmxvdzsKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisJCWkyUXVldWVOZWVkcyhwQ2gtPnBNeUJvcmQsIHBDaCwgTkVFRF9GTE9XKTsKKwl9IGVsc2UgeworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwl9CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU5QVVQsIDE5LCAxLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMklucHV0QXZhaWxhYmxlKHBDaCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgb3IgLTEgZm9yIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLyBJZiB0aGVyZSBpcyBhIGNvbGxvc2FsIGJsdW5kZXIsIChpbnZhbGlkIHN0cnVjdHVyZSBwb2ludGVycyBvciB0aGUgbGlrZSksCisvLyByZXR1cm5zIC0xLiBPdGhlcndpc2UsIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzdHJpcHBlZC4gT3RoZXJ3aXNlLAorLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZiAwCitzdGF0aWMgaW50CitpMklucHV0QXZhaWxhYmxlKGkyQ2hhblN0clB0ciBwQ2gpCit7CisJaW50IGNvdW50OworCisJLy8gRW5zdXJlIGNoYW5uZWwgc3RydWN0dXJlIHNlZW1zIHJlYWwKKwlpZiAoICFpMlZhbGlkYXRlICggcENoICkgKSByZXR1cm4gLTE7CisKKworCS8vIGluaXRpYWxpemUgc29tZSBhY2NlbGVyYXRvcnMgYW5kIHByaXZhdGUgY29waWVzCisJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisJY291bnQgPSBwQ2gtPklidWZfc3R1ZmYgLSBwQ2gtPklidWZfc3RyaXA7CisJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCS8vIEFkanVzdCBmb3IgYnVmZmVyIHdyYXAKKwlpZiAoY291bnQgPCAwKQorCXsKKwkJY291bnQgKz0gSUJVRl9TSVpFOworCX0KKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZiAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyT3V0cHV0KHBDaCwgcFNvdXJjZSwgY291bnQpCisvLyBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBQb2ludGVyIHRvIHNvdXJjZSBkYXRhCisvLyAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZAorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHNlbnQsIG9yIC0xIGZvciBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gUXVldWVzIHRoZSBkYXRhIGF0IHBTb3VyY2UgdG8gYmUgc2VudCBhcyBkYXRhIHBhY2tldHMgdG8gdGhlIGJvYXJkLiBJZiB0aGVyZQorLy8gaXMgYSBjb2xsb3NhbCBibHVuZGVyLCAoaW52YWxpZCBzdHJ1Y3R1cmUgcG9pbnRlcnMgb3IgdGhlIGxpa2UpLCByZXR1cm5zIC0xLgorLy8gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gV2hhdCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoCisvLyByb29tIGZvciBhbGwgdGhlIGRhdGE/IElmIHBDaC0+Y2hhbm5lbE9wdGlvbnMgJiBDT19OQkxPQ0tfV1JJVEUgaXMgc2V0LCB0aGVuCisvLyB3ZSB0cmFuc2ZlciBhcyBtYW55IGNoYXJhY3RlcnMgYXMgd2UgY2FuIG5vdywgdGhlbiByZXR1cm4uIElmIHRoaXMgYml0IGlzCisvLyBjbGVhciAoZGVmYXVsdCksIHJvdXRpbmUgd2lsbCBzcGluIGFsb25nIHVudGlsIGFsbCB0aGUgZGF0YSBpcyBidWZmZXJlZC4KKy8vIFNob3VsZCB0aGlzIG9jY3VyLCB0aGUgMS1tcyBkZWxheSByb3V0aW5lIGlzIGNhbGxlZCB3aGlsZSB3YWl0aW5nIHRvIGF2b2lkCisvLyBhcHBsaWNhdGlvbnMgdGhhdCBvbmUgY2Fubm90IGJyZWFrIG91dCBvZi4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpMk91dHB1dChpMkNoYW5TdHJQdHIgcENoLCBjb25zdCBjaGFyICpwU291cmNlLCBpbnQgY291bnQsIGludCB1c2VyICkKK3sKKwlpMmVCb3JkU3RyUHRyIHBCOworCXVuc2lnbmVkIGNoYXIgKnBJbnNlcnQ7CisJaW50IGFtb3VudFRvTW92ZTsKKwlpbnQgY291bnRPcmlnaW5hbCA9IGNvdW50OworCXVuc2lnbmVkIHNob3J0IGNoYW5uZWw7CisJdW5zaWduZWQgc2hvcnQgc3R1ZmZJbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlpbnQgYmFpbG91dCA9IDEwOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgSVRSQ19FTlRFUiwgMiwgY291bnQsIHVzZXIgKTsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkgCisJCXJldHVybiAtMTsKKworCS8vIGluaXRpYWxpemUgc29tZSBhY2NlbGVyYXRvcnMgYW5kIHByaXZhdGUgY29waWVzCisJcEIgPSBwQ2gtPnBNeUJvcmQ7CisJY2hhbm5lbCA9IHBDaC0+aW5mbC5oZC5pMnNDaGFubmVsOworCisJLy8gSWYgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLCByZXR1cm4gYmFkLCBhbmQgYWxzbyBoaXQgdGhlIHRyYXAgcm91dGluZSBpZgorCS8vIGl0IGV4aXN0cy4KKwlpZiAocEItPmkyZUZhdGFsKSB7CisJCWlmIChwQi0+aTJlRmF0YWxUcmFwKSB7CisJCQkoKihwQiktPmkyZUZhdGFsVHJhcCkocEIpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJLy8gUHJvY2VlZCBhcyB0aG91Z2ggd2Ugd291bGQgZG8gZXZlcnl0aGluZworCXdoaWxlICggY291bnQgPiAwICkgeworCisJCS8vIEhvdyBtdWNoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZT8KKwkJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCWFtb3VudFRvTW92ZSA9IHBDaC0+T2J1Zl9zdHJpcCAtIHBDaC0+T2J1Zl9zdHVmZiAtIDE7CisJCVJFQURfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCWlmIChhbW91bnRUb01vdmUgPCAwKSB7CisJCQlhbW91bnRUb01vdmUgKz0gT0JVRl9TSVpFOworCQl9CisJCS8vIFN1YnRyYWN0IG9mZiB0aGUgaGVhZGVycyBzaXplIGFuZCBzZWUgaG93IG11Y2ggcm9vbSB0aGVyZSBpcyBmb3IgcmVhbAorCQkvLyBkYXRhLiBJZiB0aGlzIGlzIG5lZ2F0aXZlLCB3ZSB3aWxsIGRpc2NvdmVyIGxhdGVyLgorCQlhbW91bnRUb01vdmUgLT0gc2l6ZW9mIChpMkRhdGFIZWFkZXIpOworCisJCS8vIERvbid0IG1vdmUgbW9yZSAobm93KSB0aGFuIGNhbiBnbyBpbiBhIHNpbmdsZSBwYWNrZXQKKwkJaWYgKCBhbW91bnRUb01vdmUgPiAoaW50KShNQVhfT0JVRl9CTE9DSyAtIHNpemVvZihpMkRhdGFIZWFkZXIpKSApIHsKKwkJCWFtb3VudFRvTW92ZSA9IE1BWF9PQlVGX0JMT0NLIC0gc2l6ZW9mKGkyRGF0YUhlYWRlcik7CisJCX0KKwkJLy8gRG9uJ3QgbW92ZSBtb3JlIHRoYW4gdGhlIGNvdW50IHdlIHdlcmUgZ2l2ZW4KKwkJaWYgKGFtb3VudFRvTW92ZSA+IGNvdW50KSB7CisJCQlhbW91bnRUb01vdmUgPSBjb3VudDsKKwkJfQorCQkvLyBOb3cgd2Uga25vdyBob3cgbXVjaCB3ZSBtdXN0IG1vdmU6IE5CIGJlY2F1c2UgdGhlIHJpbmcgYnVmZmVycyBoYXZlCisJCS8vIGFuIG92ZXJmbG93IGFyZWEgYXQgdGhlIGVuZCwgd2UgbmVlZG4ndCB3b3JyeSBhYm91dCB3cmFwcGluZyBpbiB0aGUKKwkJLy8gbWlkZGxlIG9mIGEgcGFja2V0LgorCisvLyBTbWFsbCBXSU5ET1cgaGVyZSB3aXRoIG5vIExPQ0sgYnV0IEkgY2FuJ3QgY2FsbCBGbHVzaCB3aXRoIExPQ0sKKy8vIFdlIHdvdWxkIGJlIGZsdXNoaW5nIChvciBlbmRpbmcgZmx1c2gpIGFueXdheQorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDEwLCAxLCBhbW91bnRUb01vdmUgKTsKKworCQlpZiAoICEocENoLT5mbHVzaF9mbGFncyAmJiBpMlJldHJ5Rmx1c2hPdXRwdXQocENoKSApIAorCQkJCSYmIGFtb3VudFRvTW92ZSA+IDAgKQorCQl7CisJCQlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCQlzdHVmZkluZGV4ID0gcENoLT5PYnVmX3N0dWZmOworICAgICAgCisJCQkvLyBIYWQgcm9vbSB0byBtb3ZlIHNvbWUgZGF0YTogZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBibG9jayBzaXplLAorCQkJLy8gYnVmZmVyIHNwYWNlLCBvciB3aGF0IHdhcyB0aGUgbGltaXRpbmcgZmFjdG9yLi4uCisJCQlwSW5zZXJ0ID0gJihwQ2gtPk9idWZbc3R1ZmZJbmRleF0pOworCisJCQkvLyBTZXQgdXAgdGhlIGhlYWRlcgorCQkJQ0hBTk5FTF9PRihwSW5zZXJ0KSAgICAgPSBjaGFubmVsOworCQkJUFRZUEVfT0YocEluc2VydCkgICAgICAgPSBQVFlQRV9EQVRBOworCQkJVEFHX09GKHBJbnNlcnQpICAgICAgICAgPSAwOworCQkJSURfT0YocEluc2VydCkgICAgICAgICAgPSBJRF9PUkRJTkFSWV9EQVRBOworCQkJREFUQV9DT1VOVF9PRihwSW5zZXJ0KSAgPSBhbW91bnRUb01vdmU7CisKKwkJCS8vIE1vdmUgdGhlIGRhdGEKKwkJCWlmICggdXNlciApIHsKKwkJCQlyYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyKikoREFUQV9PRihwSW5zZXJ0KSksIHBTb3VyY2UsCisJCQkJCQlhbW91bnRUb01vdmUgKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KCAoY2hhciopKERBVEFfT0YocEluc2VydCkpLCBwU291cmNlLCBhbW91bnRUb01vdmUgKTsKKwkJCX0KKwkJCS8vIEFkanVzdCBwb2ludGVycyBhbmQgaW5kaWNlcworCQkJcFNvdXJjZQkJCQkJKz0gYW1vdW50VG9Nb3ZlOworCQkJcENoLT5PYnVmX2NoYXJfY291bnQJKz0gYW1vdW50VG9Nb3ZlOworCQkJc3R1ZmZJbmRleCAJCQkJKz0gYW1vdW50VG9Nb3ZlICsgc2l6ZW9mKGkyRGF0YUhlYWRlcik7CisJCQljb3VudCAJCQkJCS09IGFtb3VudFRvTW92ZTsKKworCQkJaWYgKHN0dWZmSW5kZXggPj0gT0JVRl9TSVpFKSB7CisJCQkJc3R1ZmZJbmRleCA9IDA7CisJCQl9CisJCQlwQ2gtPk9idWZfc3R1ZmYgPSBzdHVmZkluZGV4OworCisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgMTMsIDEsIHN0dWZmSW5kZXggKTsKKworCQl9IGVsc2UgeworCisJCQkvLyBDYW5ub3QgbW92ZSBkYXRhCisJCQkvLyBiZWN1eiB3ZSBuZWVkIHRvIHN0dWZmIGEgZmx1c2ggCisJCQkvLyBvciBhbW91bnQgdG8gbW92ZSBpcyA8PSAwCisKKwkJCWlwMnRyYWNlKENIQU5OLCBJVFJDX09VVFBVVCwgMTQsIDMsCisJCQkJYW1vdW50VG9Nb3ZlLCAgcEItPmkyZUZpZm9SZW1haW5zLAorCQkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvICk7CisKKwkJCS8vIFB1dCB0aGlzIGNoYW5uZWwgYmFjayBvbiBxdWV1ZQorCQkJLy8gdGhpcyB1bHRpbWF0bHkgZ2V0cyBtb3JlIGRhdGEgb3Igd2FrZXMgd3JpdGUgb3V0cHV0CisJCQlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9JTkxJTkUpOworCisJCQlpZiAoIHBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvICkgeworCisJCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgMTYsIDAgKTsKKworCQkJCS8vIG9yIHNjaGVkdWxlCisJCQkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCisJCQkJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDYxLCAwICk7CisKKwkJCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQkJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKworCQkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCA2MiwgMCApOworCisJCQkJCS8vIGxldCBpbnRlcnJ1cHQgaW4gPSBXQVMgcmVzdG9yZV9mbGFncygpCisJCQkJCS8vIFdlIGhvbGQgbm8gbG9jayBub3IgaXMgaXJxIG9mZiBhbnltb3JlPz8/CisJCQkJCQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7ICAgLy8gZnJvbSB3aGlsZShjb3VudCkKKwkJCX0KKwkJCWVsc2UgaWYgKCBwQi0+aTJlRmlmb1JlbWFpbnMgPCAzMiAmJiAhcEItPmkyZVR4TWFpbEVtcHR5ICggcEIgKSApCisJCQl7CisJCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgMTksIDIsCisJCQkJCXBCLT5pMmVGaWZvUmVtYWlucywKKwkJCQkJcEItPmkyZVR4TWFpbEVtcHR5ICk7CisKKwkJCQlicmVhazsgICAvLyBmcm9tIHdoaWxlKGNvdW50KQorCQkJfSBlbHNlIGlmICggcENoLT5jaGFubmVsTmVlZHMgJiBORUVEX0NSRURJVCApIHsKKworCQkJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDIyLCAwICk7CisKKwkJCQlicmVhazsgICAvLyBmcm9tIHdoaWxlKGNvdW50KQorCQkJfSBlbHNlIGlmICggLS1iYWlsb3V0KSB7CisKKwkJCQkvLyBUcnkgdG8gdGhyb3cgbW9yZSB0aGluZ3MgKG1heWJlIG5vdCB1cykgaW4gdGhlIGZpZm8gaWYgd2UncmUKKwkJCQkvLyBub3QgYWxyZWFkeSB3YWl0aW5nIGZvciBpdC4KKwkKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCAyMCwgMCApOworCisJCQkJc2VydmljZU91dGdvaW5nRmlmbyhwQik7CisJCQkJLy9icmVhazsgIENPTlRJTlVFOworCQkJfSBlbHNlIHsKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCAyMSwgMywKKwkJCQkJcEItPmkyZUZpZm9SZW1haW5zLAorCQkJCQlwQi0+aTJlT3V0TWFpbFdhaXRpbmcsCisJCQkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvICk7CisKKwkJCQlicmVhazsgICAvLyBmcm9tIHdoaWxlKGNvdW50KQorCQkJfQorCQl9CisJfSAvLyBFbmQgb2Ygd2hpbGUoY291bnQpCisKKwlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9JTkxJTkUpOworCisJLy8gV2UgZHJvcCB0aHJvdWdoIGVpdGhlciB3aGVuIHRoZSBjb3VudCBleHBpcmVzLCBvciB3aGVuIHRoZXJlIGlzIHNvbWUKKwkvLyBjb3VudCBsZWZ0LCBidXQgdGhlcmUgd2FzIGEgbm9uLWJsb2NraW5nIHdyaXRlLgorCWlmIChjb3VudE9yaWdpbmFsID4gY291bnQpIHsKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCAxNywgMiwgY291bnRPcmlnaW5hbCwgY291bnQgKTsKKworCQlzZXJ2aWNlT3V0Z29pbmdGaWZvKCBwQiApOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIElUUkNfUkVUVVJOLCAyLCBjb3VudE9yaWdpbmFsLCBjb3VudCApOworCisJcmV0dXJuIGNvdW50T3JpZ2luYWwgLSBjb3VudDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyRmx1c2hPdXRwdXQocENoKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBTZW5kcyBieXBhc3MgY29tbWFuZCB0byBzdGFydCBmbHVzaGluZyAod2FpdGluZyBwb3NzaWJseSBmb3JldmVyIHVudGlsIHRoZXJlCisvLyBpcyByb29tKSwgdGhlbiBzZW5kcyBpbmxpbmUgY29tbWFuZCB0byBzdG9wIGZsdXNoaW5nIG91dHB1dCwgKGFnYWluIHdhaXRpbmcKKy8vIHBvc3NpYmx5IGZvcmV2ZXIpLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbmxpbmUgdm9pZAoraTJGbHVzaE91dHB1dChpMkNoYW5TdHJQdHIgcENoKQoreworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCAxLCAxLCBwQ2gtPmZsdXNoX2ZsYWdzICk7CisKKwlpZiAocENoLT5mbHVzaF9mbGFncykKKwkJcmV0dXJuOworCisJaWYgKCAxICE9IGkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMSwgQ01EX1NUQVJURkwpICkgeworCQlwQ2gtPmZsdXNoX2ZsYWdzID0gU1RBUlRGTF9GTEFHOwkJLy8gRmFpbGVkIC0gZmxhZyBmb3IgbGF0ZXIKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfRkxVU0gsIDIsIDAgKTsKKworCX0gZWxzZSBpZiAoIDEgIT0gaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAwLCAxLCBDTURfU1RPUEZMKSApIHsKKwkJcENoLT5mbHVzaF9mbGFncyA9IFNUT1BGTF9GTEFHOwkJLy8gRmFpbGVkIC0gZmxhZyBmb3IgbGF0ZXIKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfRkxVU0gsIDMsIDAgKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgCitpMlJldHJ5Rmx1c2hPdXRwdXQoaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgb2xkX2ZsYWdzID0gcENoLT5mbHVzaF9mbGFnczsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19GTFVTSCwgMTQsIDEsIG9sZF9mbGFncyApOworCisJcENoLT5mbHVzaF9mbGFncyA9IDA7CS8vIENsZWFyIGZsYWcgc28gd2UgY2FuIGF2b2lkIHJlY3Vyc2lvbgorCQkJCQkJCQkJLy8gYW5kIHF1ZXVlIHRoZSBjb21tYW5kcworCisJaWYgKCBvbGRfZmxhZ3MgJiBTVEFSVEZMX0ZMQUcgKSB7CisJCWlmICggMSA9PSBpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDAsIDEsIENNRF9TVEFSVEZMKSApIHsKKwkJCW9sZF9mbGFncyA9IFNUT1BGTF9GTEFHOwkvL1N1Y2Nlc3MgLSBzZW5kIHN0b3AgZmx1c2gKKwkJfSBlbHNlIHsKKwkJCW9sZF9mbGFncyA9IFNUQVJURkxfRkxBRzsJLy9GYWlsdXJlIC0gRmxhZyBmb3IgcmV0cnkgbGF0ZXIKKwkJfQorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19GTFVTSCwgMTUsIDEsIG9sZF9mbGFncyApOworCisJfQorCWlmICggb2xkX2ZsYWdzICYgU1RPUEZMX0ZMQUcgKSB7CisJCWlmICgxID09IGkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMCwgMSwgQ01EX1NUT1BGTCkpIHsKKwkJCW9sZF9mbGFncyA9IDA7CS8vIFN1Y2Nlc3MgLSBjbGVhciBmbGFncworCQl9CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCAxNiwgMSwgb2xkX2ZsYWdzICk7CisJfQorCXBDaC0+Zmx1c2hfZmxhZ3MgPSBvbGRfZmxhZ3M7CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfRkxVU0gsIDE3LCAxLCBvbGRfZmxhZ3MgKTsKKworCXJldHVybiBvbGRfZmxhZ3M7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMkRyYWluT3V0cHV0KHBDaCx0aW1lb3V0KQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBNYXhpbXVtIHBlcmlvZCB0byB3YWl0CisvLyBSZXR1cm5zOiAgICA/CisvLworLy8gRGVzY3JpcHRpb246CisvLyBVc2VzIHRoZSBib29rbWFyayByZXF1ZXN0IGNvbW1hbmQgdG8gYXNrIHRoZSBib2FyZCB0byBzZW5kIGEgYm9va21hcmsgYmFjayBhcworLy8gc29vbiBhcyBhbGwgdGhlIGRhdGEgaXMgY29tcGxldGVseSBzZW50LgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpMkRyYWluV2FrZXVwKGkyQ2hhblN0clB0ciBwQ2gpCit7CisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0RSQUlOLCAxMCwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMgKTsKKworCXBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzID0gMDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoICZwQ2gtPnBCb29rbWFya1dhaXQgKTsKK30KKworc3RhdGljIHZvaWQKK2kyRHJhaW5PdXRwdXQoaTJDaGFuU3RyUHRyIHBDaCwgaW50IHRpbWVvdXQpCit7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaTJlQm9yZFN0clB0ciBwQjsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19EUkFJTiwgSVRSQ19FTlRFUiwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMpOworCisJcEIgPSBwQ2gtPnBNeUJvcmQ7CisJLy8gSWYgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLCByZXR1cm4gYmFkLCAKKwkvLyBhbmQgYWxzbyBoaXQgdGhlIHRyYXAgcm91dGluZSBpZiBpdCBleGlzdHMuCisJaWYgKHBCLT5pMmVGYXRhbCkgeworCQlpZiAocEItPmkyZUZhdGFsVHJhcCkgeworCQkJKCoocEIpLT5pMmVGYXRhbFRyYXApKHBCKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICgodGltZW91dCA+IDApICYmIChwQ2gtPkJvb2ttYXJrVGltZXIuZXhwaXJlcyA9PSAwICkpIHsKKwkJLy8gT25lIHBlciBjdXN0b21lciAoY2hhbm5lbCkKKwkJaW5pdF90aW1lciggJihwQ2gtPkJvb2ttYXJrVGltZXIpICk7CisJCXBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzICA9IGppZmZpZXMgKyB0aW1lb3V0OworCQlwQ2gtPkJvb2ttYXJrVGltZXIuZnVuY3Rpb24gPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaTJEcmFpbldha2V1cDsKKwkJcENoLT5Cb29rbWFya1RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpcENoOworCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19EUkFJTiwgMSwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMgKTsKKworCQlhZGRfdGltZXIoICYocENoLT5Cb29rbWFya1RpbWVyKSApOworCX0KKwkKKwlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0lOTElORSwgcENoLCAtMSwgMSwgQ01EX0JNQVJLX1JFUSApOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKCYocENoLT5wQm9va21hcmtXYWl0KSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBCICk7CisJCisJc2NoZWR1bGUoKTsJLy8gTm93IHdlIHRha2Ugb3VyIGludGVycnVwdGlibGUgc2xlZXAgb24KKworCS8vIENsZWFuIHVwIHRoZSBxdWV1ZQorCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmKHBDaC0+cEJvb2ttYXJrV2FpdCksICZ3YWl0KTsKKworCS8vIGlmIGV4cGlyZXMgPT0gMCB0aGVuIHRpbWVyIHBvcGVkLCB0aGVuIGRvIG5vdCBuZWVkIHRvIGRlbF90aW1lcgorCWlmICgodGltZW91dCA+IDApICYmIHBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzICYmIAorCSAgICAgICAgICAgICAgICAgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzKSkgeworCQlkZWxfdGltZXIoICYocENoLT5Cb29rbWFya1RpbWVyKSApOworCQlwQ2gtPkJvb2ttYXJrVGltZXIuZXhwaXJlcyA9IDA7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0RSQUlOLCAzLCAxLCBwQ2gtPkJvb2ttYXJrVGltZXIuZXhwaXJlcyApOworCisJfQorCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19EUkFJTiwgSVRSQ19SRVRVUk4sIDEsIHBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzICk7CisJcmV0dXJuOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJPdXRwdXRGcmVlKHBDaCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgU3BhY2UgaW4gb3V0cHV0IGJ1ZmZlcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gUmV0dXJucyAtMSBpZiB2ZXJ5IGdyb3NzIGVycm9yLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgYW1vdW50IG9mIGJ5dGVzIHN0aWxsCisvLyBmcmVlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kyT3V0cHV0RnJlZShpMkNoYW5TdHJQdHIgcENoKQoreworCWludCBhbW91bnRUb01vdmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkgeworCQlyZXR1cm4gLTE7CisJfQorCVJFQURfTE9DS19JUlFTQVZFKCZwQ2gtPk9idWZfc3BpbmxvY2ssZmxhZ3MpOworCWFtb3VudFRvTW92ZSA9IHBDaC0+T2J1Zl9zdHJpcCAtIHBDaC0+T2J1Zl9zdHVmZiAtIDE7CisJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCWlmIChhbW91bnRUb01vdmUgPCAwKSB7CisJCWFtb3VudFRvTW92ZSArPSBPQlVGX1NJWkU7CisJfQorCS8vIElmIHRoaXMgaXMgbmVnYXRpdmUsIHdlIHdpbGwgZGlzY292ZXIgbGF0ZXIKKwlhbW91bnRUb01vdmUgLT0gc2l6ZW9mKGkyRGF0YUhlYWRlcik7CisKKwlyZXR1cm4gKGFtb3VudFRvTW92ZSA8IDApID8gMCA6IGFtb3VudFRvTW92ZTsKK30KK3N0YXRpYyB2b2lkCisKK2lwMl9vd2FrZSggUFRUWSB0cCkKK3sKKwlpMkNoYW5TdHJQdHIgIHBDaDsKKworCWlmICh0cCA9PSBOVUxMKSByZXR1cm47CisKKwlwQ2ggPSB0cC0+ZHJpdmVyX2RhdGE7CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDEwLCAyLCB0cC0+ZmxhZ3MsCisJCQkoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSApOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnRwLT53cml0ZV93YWl0ICk7CisJaWYgKCAoIHRwLT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApICkgCisJICAmJiB0cC0+bGRpc2Mud3JpdGVfd2FrZXVwICkKKwl7CisJCSh0cC0+bGRpc2Mud3JpdGVfd2FrZXVwKSAoIHRwICk7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1NJQ01ELCAxMSwgMCApOworCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9iYXVkX3BhcmFtcyhpMmVCb3JkU3RyUHRyIHBCKSAKK3sKKwlpbnQgaSxqOworCWkyQ2hhblN0clB0ciAgKnBDaDsKKworCXBDaCA9IChpMkNoYW5TdHJQdHIgKikgcEItPmkyZUNoYW5uZWxQdHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUJTX01BWF9CT1hFUzsgaSsrKSB7CisJCWlmIChwQi0+Y2hhbm5lbEJ0eXBlcy5iaWRfdmFsdWVbaV0pIHsKKwkJCWlmIChCSURfSEFTXzY1NChwQi0+Y2hhbm5lbEJ0eXBlcy5iaWRfdmFsdWVbaV0pKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IEFCU19CSUdHRVNUX0JPWDsgaisrKSB7CisJCQkJCWlmIChwQ2hbaSoxNitqXSA9PSBOVUxMKQorCQkJCQkJYnJlYWs7CisJCQkJCShwQ2hbaSoxNitqXSktPkJhdWRCYXNlICAgID0gOTIxNjAwOwkvLyBNQVggZm9yIFNUNjU0CisJCQkJCShwQ2hbaSoxNitqXSktPkJhdWREaXZpc29yID0gOTY7CisJCQkJfQorCQkJfSBlbHNlIHsJLy8gaGFzIGNpcnJ1cyBjZDE0MDAKKwkJCQlmb3IgKGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyBqKyspIHsKKwkJCQkJaWYgKHBDaFtpKjE2K2pdID09IE5VTEwpCisJCQkJCQlicmVhazsKKwkJCQkJKHBDaFtpKjE2K2pdKS0+QmF1ZEJhc2UgICAgPSAxMTUyMDA7CS8vIE1BWCBmb3IgQ0QxNDAwCisJCQkJCShwQ2hbaSoxNitqXSktPkJhdWREaXZpc29yID0gMTI7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJTdHJpcEZpZm8ocEIpCisvLyBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGEgYm9hcmQgc3RydWN0dXJlCisvLyBSZXR1cm5zOiAgICA/CisvLworLy8gRGVzY3JpcHRpb246CisvLyBTdHJpcHMgYWxsIHRoZSBhdmFpbGFibGUgZGF0YSBmcm9tIHRoZSBpbmNvbWluZyBGSUZPLCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mCisvLyBwYWNrZXQsIGFuZCBlaXRoZXIgYnVmZmVycyB0aGUgZGF0YSBvciBkb2VzIHdoYXQgbmVlZHMgdG8gYmUgZG9uZS4KKy8vCisvLyBOb3RlIHRoZXJlIGlzIG5vIG92ZXJmbG93IGNoZWNraW5nIGhlcmU6IGlmIHRoZSBib2FyZCBzZW5kcyBtb3JlIGRhdGEgdGhhbiBpdAorLy8gb3VnaHQgdG8sIHdlIHdpbGwgbm90IGRldGVjdCBpdCBoZXJlLCBidXQgYmxpbmRseSBvdmVyZmxvdy4uLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gQSBidWZmZXIgZm9yIHJlYWRpbmcgaW4gYmxvY2tzIGZvciB1bmtub3duIGNoYW5uZWxzCitzdGF0aWMgdW5zaWduZWQgY2hhciBqdW5rQnVmZmVyW0lCVUZfU0laRV07CisKKy8vIEEgYnVmZmVyIHRvIHJlYWQgaW4gYSBzdGF0dXMgcGFja2V0LiBCZWNhdXNlIG9mIHRoZSBzaXplIG9mIHRoZSBjb3VudCBmaWVsZAorLy8gZm9yIHRoZXNlIHRoaW5ncywgdGhlIG1heGltdW0gcGFja2V0IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gTUFYX0NNRF9QQUNLX1NJWkUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNtZEJ1ZmZlcltNQVhfQ01EX1BBQ0tfU0laRSArIDRdOworCisvLyBUaGlzIHRhYmxlIGNoYW5nZXMgdGhlIGJpdCBvcmRlciBmcm9tIE1TUiBvcmRlciBnaXZlbiBieSBTVEFUX01PREVNIHBhY2tldCB0bworLy8gc3RhdHVzIGJpdHMgdXNlZCBpbiBvdXIgbGlicmFyeS4KK3N0YXRpYyBjaGFyIHhsYXREc3NbMTZdID0geworMCAgICAgIHwgMCAgICAgfCAwICAgICAgfCAwICAgICAgLAorMCAgICAgIHwgMCAgICAgfCAwICAgICAgfCBJMl9DVFMgLAorMCAgICAgIHwgMCAgICAgfCBJMl9EU1IgfCAwICAgICAgLAorMCAgICAgIHwgMCAgICAgfCBJMl9EU1IgfCBJMl9DVFMgLAorMCAgICAgIHwgSTJfUkkgfCAwICAgICAgfCAwICAgICAgLAorMCAgICAgIHwgSTJfUkkgfCAwICAgICAgfCBJMl9DVFMgLAorMCAgICAgIHwgSTJfUkkgfCBJMl9EU1IgfCAwICAgICAgLAorMCAgICAgIHwgSTJfUkkgfCBJMl9EU1IgfCBJMl9DVFMgLAorSTJfRENEIHwgMCAgICAgfCAwICAgICAgfCAwICAgICAgLAorSTJfRENEIHwgMCAgICAgfCAwICAgICAgfCBJMl9DVFMgLAorSTJfRENEIHwgMCAgICAgfCBJMl9EU1IgfCAwICAgICAgLAorSTJfRENEIHwgMCAgICAgfCBJMl9EU1IgfCBJMl9DVFMgLAorSTJfRENEIHwgSTJfUkkgfCAwICAgICAgfCAwICAgICAgLAorSTJfRENEIHwgSTJfUkkgfCAwICAgICAgfCBJMl9DVFMgLAorSTJfRENEIHwgSTJfUkkgfCBJMl9EU1IgfCAwICAgICAgLAorSTJfRENEIHwgSTJfUkkgfCBJMl9EU1IgfCBJMl9DVFMgfTsKKworc3RhdGljIGlubGluZSB2b2lkCitpMlN0cmlwRmlmbyhpMmVCb3JkU3RyUHRyIHBCKQoreworCWkyQ2hhblN0clB0ciBwQ2g7CisJaW50IGNoYW5uZWw7CisJaW50IGNvdW50OworCXVuc2lnbmVkIHNob3J0IHN0dWZmSW5kZXg7CisJaW50IGFtb3VudFRvUmVhZDsKKwl1bnNpZ25lZCBjaGFyICpwYywgKnBjTGltaXQ7CisJdW5zaWduZWQgY2hhciB1YzsKKwl1bnNpZ25lZCBjaGFyIGRzc19jaGFuZ2U7CisJdW5zaWduZWQgbG9uZyBiZmxhZ3MsY2ZsYWdzOworCisvLwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NGSUZPLCBJVFJDX0VOVEVSLCAwICk7CisKKwl3aGlsZSAoSEFTX0lOUFVUKHBCKSkgeworLy8JCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfU0ZJRk8sIDIsIDAgKTsKKworCQkvLyBQcm9jZXNzIHBhY2tldCBmcm9tIGZpZm8gYSBvbmUgYXRvbWljIHVuaXQKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+cmVhZF9maWZvX3NwaW5sb2NrLGJmbGFncyk7CisgICAKKwkJLy8gVGhlIGZpcnN0IHdvcmQgKG9yIHR3byBieXRlcykgd2lsbCBoYXZlIGNoYW5uZWwgbnVtYmVyIGFuZCB0eXBlIG9mCisJCS8vIHBhY2tldCwgcG9zc2libHkgb3RoZXIgaW5mb3JtYXRpb24KKwkJcEItPmkyZUxlYWRvZmZXb3JkWzBdID0gaWlSZWFkV29yZChwQik7CisKKwkJc3dpdGNoKFBUWVBFX09GKHBCLT5pMmVMZWFkb2ZmV29yZCkpCisJCXsKKwkJY2FzZSBQVFlQRV9EQVRBOgorCQkJcEItPmdvdF9pbnB1dCA9IDE7CisKKy8vCQkJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19TRklGTywgMywgMCApOworCisJCQljaGFubmVsID0gQ0hBTk5FTF9PRihwQi0+aTJlTGVhZG9mZldvcmQpOyAvKiBTdG9yZSBjaGFubmVsICovCisJCQljb3VudCA9IGlpUmVhZFdvcmQocEIpOyAgICAgICAgICAvKiBDb3VudCBpcyBpbiB0aGUgbmV4dCB3b3JkICovCisKKy8vIE5FVzogQ2hlY2sgdGhlIGNvdW50IGZvciBzYW5pdHkhIFNob3VsZCB0aGUgaGFyZHdhcmUgZmFpbCwgb3VyIGRlYXRoCisvLyBpcyBtb3JlIHBsZWFzYW50LiBXaGlsZSBhbiBvdmVyc2l6ZSBjaGFubmVsIGlzIGFjY2VwdGFibGUgKGp1c3QgbW9yZQorLy8gdGhhbiB0aGUgZHJpdmVyIHN1cHBvcnRzKSwgYW4gb3Zlci1sZW5ndGggY291bnQgY2xlYXJseSBtZWFucyB3ZSBhcmUKKy8vIHNpY2shCisJCQlpZiAoICgodW5zaWduZWQgaW50KWNvdW50KSA+IElCVUZfU0laRSApIHsKKwkJCQlwQi0+aTJlRmF0YWwgPSAyOworCQkJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+cmVhZF9maWZvX3NwaW5sb2NrLGJmbGFncyk7CisJCQkJcmV0dXJuOyAgICAgLyogQmFpbCBvdXQgQVNBUCAqLworCQkJfQorCQkJLy8gQ2hhbm5lbCBpcyBpbGxlZ2FsbHkgYmlnID8KKwkJCWlmICgoY2hhbm5lbCA+PSBwQi0+aTJlQ2hhbm5lbENudCkgfHwKKwkJCQkoTlVMTD09KHBDaCA9ICgoaTJDaGFuU3RyUHRyKilwQi0+aTJlQ2hhbm5lbFB0cilbY2hhbm5lbF0pKSkKKwkJCXsKKwkJCQlpaVJlYWRCdWYocEIsIGp1bmtCdWZmZXIsIGNvdW50KTsKKwkJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jayxiZmxhZ3MpOworCQkJCWJyZWFrOyAgICAgICAgIC8qIEZyb20gc3dpdGNoOiByZWFkeSBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCX0KKworCQkJLy8gQ2hhbm5lbCBzaG91bGQgYmUgdmFsaWQsIHRoZW4KKworCQkJLy8gSWYgdGhpcyBpcyBhIGhvdC1rZXksIG1lcmVseSBwb3N0IGl0cyByZWNlaXB0IGZvciBub3cuIFRoZXNlIGFyZQorCQkJLy8gYWx3YXlzIHN1cHBvc2VkIHRvIGJlIDEtYnl0ZSBwYWNrZXRzLCBzbyB3ZSB3b24ndCBldmVuIGNoZWNrIHRoZQorCQkJLy8gY291bnQuIEFsc28gd2Ugd2lsbCBwb3N0IGFuIGFja25vd2xlZGdlbWVudCB0byB0aGUgYm9hcmQgc28gdGhhdAorCQkJLy8gbW9yZSBkYXRhIGNhbiBiZSBmb3J0aGNvbWluZy4gTm90ZSB0aGF0IHdlIGFyZSBub3QgdHJ5aW5nIHRvIHVzZQorCQkJLy8gdGhlc2Ugc2VxdWVuY2VzIGluIHRoaXMgZHJpdmVyLCBtZXJlbHkgdG8gcm9idXN0bHkgaWdub3JlIHRoZW0uCisJCQlpZihJRF9PRihwQi0+aTJlTGVhZG9mZldvcmQpID09IElEX0hPVF9LRVkpCisJCQl7CisJCQkJcENoLT5ob3RLZXlJbiA9IGlpUmVhZFdvcmQocEIpICYgMHhmZjsKKwkJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jayxiZmxhZ3MpOworCQkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMSwgQ01EX0hPVEFDSyk7CisJCQkJYnJlYWs7ICAgLyogRnJvbSB0aGUgc3dpdGNoOiByZWFkeSBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCX0KKworCQkJLy8gTm9ybWFsIGRhdGEhIFdlIGNydWRlbHkgYXNzdW1lIHRoZXJlIGlzIHJvb20gZm9yIHRoZSBkYXRhIGluIG91cgorCQkJLy8gYnVmZmVyIGJlY2F1c2UgdGhlIGJvYXJkIHdvdWxkbid0IGhhdmUgZXhjZWVkZWQgaGlzIGNyZWRpdCBsaW1pdC4KKwkJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcENoLT5JYnVmX3NwaW5sb2NrLGNmbGFncyk7CisJCQkJCQkJCQkJCQkJLy8gV2UgaGF2ZSAyIGxvY2tzIG5vdworCQkJc3R1ZmZJbmRleCA9IHBDaC0+SWJ1Zl9zdHVmZjsKKwkJCWFtb3VudFRvUmVhZCA9IElCVUZfU0laRSAtIHN0dWZmSW5kZXg7CisJCQlpZiAoYW1vdW50VG9SZWFkID4gY291bnQpCisJCQkJYW1vdW50VG9SZWFkID0gY291bnQ7CisKKwkJCS8vIHN0dWZmSW5kZXggd291bGQgaGF2ZSBiZWVuIGFscmVhZHkgYWRqdXN0ZWQgc28gdGhlcmUgd291bGQgCisJCQkvLyBhbHdheXMgYmUgcm9vbSBmb3IgYXQgbGVhc3Qgb25lLCBhbmQgY291bnQgaXMgYWx3YXlzIGF0IGxlYXN0CisJCQkvLyBvbmUuCisKKwkJCWlpUmVhZEJ1ZihwQiwgJihwQ2gtPklidWZbc3R1ZmZJbmRleF0pLCBhbW91bnRUb1JlYWQpOworCQkJcENoLT5pY291bnQucnggKz0gYW1vdW50VG9SZWFkOworCisJCQkvLyBVcGRhdGUgdGhlIHN0dWZmSW5kZXggYnkgdGhlIGFtb3VudCBvZiBkYXRhIG1vdmVkLiBOb3RlIHdlIGNvdWxkCisJCQkvLyBuZXZlciBhc2sgZm9yIG1vcmUgZGF0YSB0aGFuIHdvdWxkIGp1c3QgZml0LiBIb3dldmVyLCB3ZSBtaWdodAorCQkJLy8gaGF2ZSByZWFkIGluIG9uZSBtb3JlIGJ5dGUgdGhhbiB3ZSB3YW50ZWQgYmVjYXVzZSB0aGUgcmVhZAorCQkJLy8gcm91bmRzIHVwIHRvIGV2ZW4gYnl0ZXMuIElmIHRoaXMgYnl0ZSBpcyBvbiB0aGUgZW5kIG9mIHRoZQorCQkJLy8gcGFja2V0LCBhbmQgaXMgcGFkZGluZywgd2UgaWdub3JlIGl0LiBJZiB0aGUgYnl0ZSBpcyBwYXJ0IG9mCisJCQkvLyB0aGUgYWN0dWFsIGRhdGEsIHdlIG5lZWQgdG8gbW92ZSBpdC4KKworCQkJc3R1ZmZJbmRleCArPSBhbW91bnRUb1JlYWQ7CisKKwkJCWlmIChzdHVmZkluZGV4ID49IElCVUZfU0laRSkgeworCQkJCWlmICgoYW1vdW50VG9SZWFkICYgMSkgJiYgKGNvdW50ID4gYW1vdW50VG9SZWFkKSkgeworCQkJCQlwQ2gtPklidWZbMF0gPSBwQ2gtPklidWZbSUJVRl9TSVpFXTsKKwkJCQkJYW1vdW50VG9SZWFkKys7CisJCQkJCXN0dWZmSW5kZXggPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXN0dWZmSW5kZXggPSAwOworCQkJCX0KKwkJCX0KKworCQkJLy8gSWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCBvdmVyLCByZWFkIGl0IGFzIHdlbGwKKwkJCWlmIChjb3VudCA+IGFtb3VudFRvUmVhZCkgeworCQkJCWFtb3VudFRvUmVhZCA9IGNvdW50IC0gYW1vdW50VG9SZWFkOworCQkJCWlpUmVhZEJ1ZihwQiwgJihwQ2gtPklidWZbc3R1ZmZJbmRleF0pLCBhbW91bnRUb1JlYWQpOworCQkJCXBDaC0+aWNvdW50LnJ4ICs9IGFtb3VudFRvUmVhZDsKKwkJCQlzdHVmZkluZGV4ICs9IGFtb3VudFRvUmVhZDsKKwkJCX0KKworCQkJLy8gVXBkYXRlIHN0dWZmIGluZGV4CisJCQlwQ2gtPklidWZfc3R1ZmYgPSBzdHVmZkluZGV4OworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxjZmxhZ3MpOworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT5yZWFkX2ZpZm9fc3BpbmxvY2ssYmZsYWdzKTsKKworI2lmZGVmIFVTRV9JUQorCQkJc2NoZWR1bGVfd29yaygmcENoLT50cXVldWVfaW5wdXQpOworI2Vsc2UKKwkJCWRvX2lucHV0KHBDaCk7CisjZW5kaWYKKworCQkJLy8gTm90ZSB3ZSBkbyBub3QgbmVlZCB0byBtYWludGFpbiBhbnkgZmxvdy1jb250cm9sIGNyZWRpdHMgYXQgdGhpcworCQkJLy8gdGltZTogIGlmIHdlIHdlcmUgdG8gaW5jcmVtZW50IC5hc29mIGFuZCBkZWNyZW1lbnQgLnJvb20sIHRoZXJlCisJCQkvLyB3b3VsZCBiZSBubyBuZXQgZWZmZWN0LiBJbnN0ZWFkLCB3aGVuIHdlIHN0cmlwIGRhdGEsIHdlIHdpbGwKKwkJCS8vIGluY3JlbWVudCAuYXNvZiBhbmQgbGVhdmUgLnJvb20gdW5jaGFuZ2VkLgorCisJCQlicmVhazsgICAvLyBGcm9tIHN3aXRjaDogcmVhZHkgZm9yIG5leHQgcGFja2V0CisKKwkJY2FzZSBQVFlQRV9TVEFUVVM6CisJCQlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NGSUZPLCA0LCAwICk7CisgICAgICAKKwkJCWNvdW50ID0gQ01EX0NPVU5UX09GKHBCLT5pMmVMZWFkb2ZmV29yZCk7CisKKwkJCWlpUmVhZEJ1ZihwQiwgY21kQnVmZmVyLCBjb3VudCk7CisJCQkvLyBXZSBjYW4gcmVsZWFzZSBlYXJseSB3aXRoIGJ1ZmZlciBncmFiCisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jayxiZmxhZ3MpOworCisJCQlwYyA9IGNtZEJ1ZmZlcjsKKwkJCXBjTGltaXQgPSAmKGNtZEJ1ZmZlcltjb3VudF0pOworCisJCQl3aGlsZSAocGMgPCBwY0xpbWl0KSB7CisJCQkJY2hhbm5lbCA9ICpwYysrOworCisJCQkJaXAydHJhY2UgKGNoYW5uZWwsIElUUkNfU0ZJRk8sIDcsIDIsIGNoYW5uZWwsICpwYyApOworCisJCQkJLyogY2hlY2sgZm9yIHZhbGlkIGNoYW5uZWwgKi8KKwkJCQlpZiAoY2hhbm5lbCA8IHBCLT5pMmVDaGFubmVsQ250CisJCQkJCSAmJiAKKwkJCQkJIChwQ2ggPSAoKChpMkNoYW5TdHJQdHIqKXBCLT5pMmVDaGFubmVsUHRyKVtjaGFubmVsXSkpICE9IE5VTEwKKwkJCQkJKQorCQkJCXsKKwkJCQkJZHNzX2NoYW5nZSA9IDA7CisKKwkJCQkJc3dpdGNoICh1YyA9ICpwYysrKQorCQkJCQl7CisJCQkJCS8qIEJyZWFrcyBhbmQgbW9kZW0gc2lnbmFscyBhcmUgZWFzeToganVzdCB1cGRhdGUgc3RhdHVzICovCisJCQkJCWNhc2UgU1RBVF9DVFNfVVA6CisJCQkJCQlpZiAoICEocENoLT5kYXRhU2V0SW4gJiBJMl9DVFMpICkKKwkJCQkJCXsKKwkJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9EQ1RTOworCQkJCQkJCXBDaC0+aWNvdW50LmN0cysrOworCQkJCQkJCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJfQorCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfQ1RTOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0NUU19ETjoKKwkJCQkJCWlmICggcENoLT5kYXRhU2V0SW4gJiBJMl9DVFMgKQorCQkJCQkJeworCQkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX0RDVFM7CisJCQkJCQkJcENoLT5pY291bnQuY3RzKys7CisJCQkJCQkJZHNzX2NoYW5nZSA9IDE7CisJCQkJCQl9CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiAmPSB+STJfQ1RTOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0RDRF9VUDoKKwkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX01PREVNLCAxLCAxLCBwQ2gtPmRhdGFTZXRJbiApOworCisJCQkJCQlpZiAoICEocENoLT5kYXRhU2V0SW4gJiBJMl9EQ0QpICkKKwkJCQkJCXsKKwkJCQkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfTU9ERU0sIDIsIDAgKTsKKwkJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9ERENEOworCQkJCQkJCXBDaC0+aWNvdW50LmRjZCsrOworCQkJCQkJCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJfQorCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfRENEOworCisJCQkJCQlpcDJ0cmFjZSAoY2hhbm5lbCwgSVRSQ19NT0RFTSwgMywgMSwgcENoLT5kYXRhU2V0SW4gKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU1RBVF9EQ0RfRE46CisJCQkJCQlpcDJ0cmFjZSAoY2hhbm5lbCwgSVRSQ19NT0RFTSwgNCwgMSwgcENoLT5kYXRhU2V0SW4gKTsKKwkJCQkJCWlmICggcENoLT5kYXRhU2V0SW4gJiBJMl9EQ0QgKQorCQkJCQkJeworCQkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX01PREVNLCA1LCAwICk7CisJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfRERDRDsKKwkJCQkJCQlwQ2gtPmljb3VudC5kY2QrKzsKKwkJCQkJCQlkc3NfY2hhbmdlID0gMTsKKwkJCQkJCX0KKwkJCQkJCXBDaC0+ZGF0YVNldEluICY9IH5JMl9EQ0Q7CisKKwkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX01PREVNLCA2LCAxLCBwQ2gtPmRhdGFTZXRJbiApOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0RTUl9VUDoKKwkJCQkJCWlmICggIShwQ2gtPmRhdGFTZXRJbiAmIEkyX0RTUikgKQorCQkJCQkJeworCQkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX0REU1I7CisJCQkJCQkJcENoLT5pY291bnQuZHNyKys7CisJCQkJCQkJZHNzX2NoYW5nZSA9IDE7CisJCQkJCQl9CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9EU1I7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUQVRfRFNSX0ROOgorCQkJCQkJaWYgKCBwQ2gtPmRhdGFTZXRJbiAmIEkyX0RTUiApCisJCQkJCQl7CisJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfRERTUjsKKwkJCQkJCQlwQ2gtPmljb3VudC5kc3IrKzsKKwkJCQkJCQlkc3NfY2hhbmdlID0gMTsKKwkJCQkJCX0KKwkJCQkJCXBDaC0+ZGF0YVNldEluICY9IH5JMl9EU1I7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUQVRfUklfVVA6CisJCQkJCQlpZiAoICEocENoLT5kYXRhU2V0SW4gJiBJMl9SSSkgKQorCQkJCQkJeworCQkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX0RSSTsKKwkJCQkJCQlwQ2gtPmljb3VudC5ybmcrKzsKKwkJCQkJCQlkc3NfY2hhbmdlID0gMTsKKwkJCQkJCX0KKwkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX1JJIDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU1RBVF9SSV9ETjoKKwkJCQkJCS8vIHRvIGJlIGNvbXBhdCB3aXRoIHNlcmlhbC5jCisJCQkJCQkvL2lmICggcENoLT5kYXRhU2V0SW4gJiBJMl9SSSApCisJCQkJCQkvL3sKKwkJCQkJCS8vCXBDaC0+ZGF0YVNldEluIHw9IEkyX0RSSTsKKwkJCQkJCS8vCXBDaC0+aWNvdW50LnJuZysrOyAKKwkJCQkJCS8vCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJLy99CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiAmPSB+STJfUkkgOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0JSS19ERVQ6CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9CUks7CisJCQkJCQlwQ2gtPmljb3VudC5icmsrKzsKKwkJCQkJCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJYnJlYWs7CisKKwkJCQkJLy8gQm9va21hcmtzPyBvbmUgbGVzcyByZXF1ZXN0IHdlJ3JlIHdhaXRpbmcgZm9yCisJCQkJCWNhc2UgU1RBVF9CTUFSSzoKKwkJCQkJCXBDaC0+Ym9va01hcmtzLS07CisJCQkJCQlpZiAocENoLT5ib29rTWFya3MgPD0gMCApIHsKKwkJCQkJCQlwQ2gtPmJvb2tNYXJrcyA9IDA7CisJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmcENoLT5wQm9va21hcmtXYWl0ICk7CisKKwkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX0RSQUlOLCAyMCwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMgKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZsb3cgY29udHJvbCBwYWNrZXRzPyBVcGRhdGUgdGhlIG5ldyBjcmVkaXRzLCBhbmQgaWYKKwkJCQkJLy8gc29tZW9uZSB3YXMgd2FpdGluZyBmb3Igb3V0cHV0LCBxdWV1ZSBoaW0gdXAgYWdhaW4uCisJCQkJCWNhc2UgU1RBVF9GTE9XOgorCQkJCQkJcENoLT5vdXRmbC5yb29tID0KKwkJCQkJCQkoKGZsb3dTdGF0UHRyKXBjKS0+cm9vbSAtCisJCQkJCQkJKHBDaC0+b3V0ZmwuYXNvZiAtICgoZmxvd1N0YXRQdHIpcGMpLT5hc29mKTsKKworCQkJCQkJaXAydHJhY2UgKGNoYW5uZWwsIElUUkNfU1RGTFcsIDEsIDEsIHBDaC0+b3V0Zmwucm9vbSApOworCisJCQkJCQlpZiAocENoLT5jaGFubmVsTmVlZHMgJiBORUVEX0NSRURJVCkKKwkJCQkJCXsKKwkJCQkJCQlpcDJ0cmFjZSAoY2hhbm5lbCwgSVRSQ19TVEZMVywgMiwgMSwgcENoLT5jaGFubmVsTmVlZHMpOworCisJCQkJCQkJcENoLT5jaGFubmVsTmVlZHMgJj0gfk5FRURfQ1JFRElUOworCQkJCQkJCWkyUXVldWVOZWVkcyhwQiwgcENoLCBORUVEX0lOTElORSk7CisJCQkJCQkJaWYgKCBwQ2gtPnBUVFkgKQorCQkJCQkJCQlpcDJfb3dha2UocENoLT5wVFRZKTsKKwkJCQkJCX0KKworCQkJCQkJaXAydHJhY2UgKGNoYW5uZWwsIElUUkNfU1RGTFcsIDMsIDEsIHBDaC0+Y2hhbm5lbE5lZWRzKTsKKworCQkJCQkJcGMgKz0gc2l6ZW9mKGZsb3dTdGF0KTsKKwkJCQkJCWJyZWFrOworCisJCQkJCS8qIFNwZWNpYWwgcGFja2V0czogKi8KKwkJCQkJLyogSnVzdCBjb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjaGFubmVsIHN0cnVjdHVyZSAqLworCisJCQkJCWNhc2UgU1RBVF9TVEFUVVM6CisKKwkJCQkJCXBDaC0+Y2hhbm5lbFN0YXR1cyA9ICooKGRlYnVnU3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoZGVidWdTdGF0KTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU1RBVF9UWENOVDoKKworCQkJCQkJcENoLT5jaGFubmVsVGNvdW50ID0gKigoY250U3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoY250U3RhdCk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUQVRfUlhDTlQ6CisKKwkJCQkJCXBDaC0+Y2hhbm5lbFJjb3VudCA9ICooKGNudFN0YXRQdHIpcGMpOworCQkJCQkJcGMgKz0gc2l6ZW9mKGNudFN0YXQpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0JPWElEUzoKKwkJCQkJCXBCLT5jaGFubmVsQnR5cGVzID0gKigoYmlkU3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoYmlkU3RhdCk7CisJCQkJCQlzZXRfYmF1ZF9wYXJhbXMocEIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0hXRkFJTDoKKwkJCQkJCWkyUXVldWVDb21tYW5kcyAoUFRZUEVfSU5MSU5FLCBwQ2gsIDAsIDEsIENNRF9IV19URVNUKTsKKwkJCQkJCXBDaC0+Y2hhbm5lbEZhaWwgPSAqKChmYWlsU3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoZmFpbFN0YXQpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJLyogTm8gZXhwbGljaXQgbWF0Y2g/IHRoZW4KKwkJCQkJICogTWlnaHQgYmUgYW4gZXJyb3IgcGFja2V0Li4uCisJCQkJCSAqLworCQkJCQlkZWZhdWx0OgorCQkJCQkJc3dpdGNoICh1YyAmIFNUQVRfTU9EX0VSUk9SKQorCQkJCQkJeworCQkJCQkJY2FzZSBTVEFUX0VSUk9SOgorCQkJCQkJCWlmICh1YyAmIFNUQVRfRV9QQVJJVFkpIHsKKwkJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfUEFSOworCQkJCQkJCQlwQ2gtPmljb3VudC5wYXJpdHkrKzsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHVjICYgU1RBVF9FX0ZSQU1JTkcpeworCQkJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9GUkE7CisJCQkJCQkJCXBDaC0+aWNvdW50LmZyYW1lKys7CisJCQkJCQkJfQorCQkJCQkJCWlmICh1YyAmIFNUQVRfRV9PVkVSUlVOKXsKKwkJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfT1ZSOworCQkJCQkJCQlwQ2gtPmljb3VudC5vdmVycnVuKys7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIFNUQVRfTU9ERU06CisJCQkJCQkJLy8gdGhlIGFuc3dlciB0byBEU1NfTk9XIHJlcXVlc3QgKG5vdCBjaGFuZ2UpCisJCQkJCQkJcENoLT5kYXRhU2V0SW4gPSAocENoLT5kYXRhU2V0SW4KKwkJCQkJCQkJJiB+KEkyX1JJIHwgSTJfQ1RTIHwgSTJfRENEIHwgSTJfRFNSKSApCisJCQkJCQkJCXwgeGxhdERzc1t1YyAmIDB4Zl07CisJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnBDaC0+ZHNzX25vd193YWl0ICk7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9ICAvKiBFbmQgb2Ygc3dpdGNoIG9uIHN0YXR1cyB0eXBlICovCisJCQkJCWlmIChkc3NfY2hhbmdlKSB7CisjaWZkZWYgVVNFX0lRCisJCQkJCQlzY2hlZHVsZV93b3JrKCZwQ2gtPnRxdWV1ZV9zdGF0dXMpOworI2Vsc2UKKwkJCQkJCWRvX3N0YXR1cyhwQ2gpOworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSAgLyogT3IgZWxzZSwgY2hhbm5lbCBpcyBpbnZhbGlkICovCisJCQkJeworCQkJCQkvLyBFdmVuIHRob3VnaCB0aGUgY2hhbm5lbCBpcyBpbnZhbGlkLCB3ZSBtdXN0IHRlc3QgdGhlCisJCQkJCS8vIHN0YXR1cyB0byBzZWUgaG93IG11Y2ggYWRkaXRpb25hbCBkYXRhIGl0IGhhcyAodG8gYmUKKwkJCQkJLy8gc2tpcHBlZCkKKwkJCQkJc3dpdGNoICgqcGMrKykKKwkJCQkJeworCQkJCQljYXNlIFNUQVRfRkxPVzoKKwkJCQkJCXBjICs9IDQ7ICAgIC8qIFNraXAgdGhlIGRhdGEgKi8KKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gIC8vIEVuZCBvZiB3aGlsZSAodGhlcmUgaXMgc3RpbGwgc29tZSBzdGF0dXMgcGFja2V0IGxlZnQpCisJCQlicmVhazsKKworCQlkZWZhdWx0OiAvLyBOZWl0aGVyIHBhY2tldD8gc2hvdWxkIGJlIGltcG9zc2libGUKKwkJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfU0ZJRk8sIDUsIDEsCisJCQkJUFRZUEVfT0YocEItPmkyZUxlYWRvZmZXb3JkKSApOworCisJCQlicmVhazsKKwkJfSAgLy8gRW5kIG9mIHN3aXRjaCBvbiB0eXBlIG9mIHBhY2tldHMKKwl9CS8vd2hpbGUoYm9hcmQgSEFTX0lOUFVUKQorCisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19TRklGTywgSVRSQ19SRVRVUk4sIDAgKTsKKworCS8vIFNlbmQgYWNrbm93bGVkZ2VtZW50IHRvIHRoZSBib2FyZCBldmVuIGlmIHRoZXJlIHdhcyBubyBkYXRhIQorCXBCLT5pMmVPdXRNYWlsV2FpdGluZyB8PSBNQl9JTl9TVFJJUFBFRDsKKwlyZXR1cm47Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMldyaXRlMkZpZm8ocEIsYWRkcmVzcyxjb3VudCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUsIHNvdXJjZSBhZGRyZXNzLCBieXRlIGNvdW50CisvLyBSZXR1cm5zOiAgICBieXRlcyB3cml0dGVuCisvLworLy8gRGVzY3JpcHRpb246CisvLyAgV3JpdGVzIGNvdW50IGJ5dGVzIHRvIGJvYXJkIGlvIGFkZHJlc3MoaW1wbGllZCkgZnJvbSBzb3VyY2UKKy8vICBBZGp1c3RzIGNvdW50LCBsZWF2ZXMgcmVzZXJ2ZSBmb3IgbmV4dCB0aW1lIGFyb3VuZCBieXBhc3MgY21kcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kyV3JpdGUyRmlmbyhpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIGludCBjb3VudCxpbnQgcmVzZXJ2ZSkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayxmbGFncyk7CisJaWYgKCFwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbykgeworCQlpZiAocEItPmkyZUZpZm9SZW1haW5zID4gKGNvdW50K3Jlc2VydmUpKSB7CisJCQlwQi0+aTJlRmlmb1JlbWFpbnMgLT0gY291bnQ7CisJCQlpaVdyaXRlQnVmKHBCLCBzb3VyY2UsIGNvdW50KTsKKwkJCXBCLT5pMmVPdXRNYWlsV2FpdGluZyB8PSBNQl9PVVRfU1RVRkZFRDsKKwkJCXJjID0gIGNvdW50OworCQl9CisJfQorCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIHJjOworfQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyU3R1ZmZGaWZvQnlwYXNzKHBCKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gU3R1ZmZzIGFzIG1hbnkgYnlwYXNzIGNvbW1hbmRzIGludG8gdGhlIGZpZm8gYXMgcG9zc2libGUuIFRoaXMgaXMgc2ltcGxlcgorLy8gdGhhbiBzdHVmZmluZyBkYXRhIG9yIGlubGluZSBjb21tYW5kcyB0byBmaWZvLCBzaW5jZSB3ZSBkbyBub3QgaGF2ZQorLy8gZmxvdy1jb250cm9sIHRvIGRlYWwgd2l0aC4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW5saW5lIHZvaWQKK2kyU3R1ZmZGaWZvQnlwYXNzKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaTJDaGFuU3RyUHRyIHBDaDsKKwl1bnNpZ25lZCBjaGFyICpwUmVtb3ZlOworCXVuc2lnbmVkIHNob3J0IHN0cmlwSW5kZXg7CisJdW5zaWduZWQgc2hvcnQgcGFja2V0U2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkZWRTaXplOworCXVuc2lnbmVkIHNob3J0IG5vdENsb2dnZWQgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbnQgYmFpbG91dCA9IDEwMDA7CisKKwkvLyBDb250aW51ZSBwcm9jZXNzaW5nIHNvIGxvbmcgYXMgdGhlcmUgYXJlIGVudHJpZXMsIG9yIHRoZXJlIGlzIHJvb20gaW4gdGhlCisJLy8gZmlmby4gRWFjaCBlbnRyeSByZXByZXNlbnRzIGEgY2hhbm5lbCB3aXRoIHNvbWV0aGluZyB0byBkby4KKwl3aGlsZSAoIC0tYmFpbG91dCAmJiBub3RDbG9nZ2VkICYmIAorCQkJKE5VTEwgIT0gKHBDaCA9IGkyRGVRdWV1ZU5lZWRzKHBCLE5FRURfQllQQVNTKSkpKQorCXsKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQ2gtPkNidWZfc3BpbmxvY2ssZmxhZ3MpOworCQlzdHJpcEluZGV4ID0gcENoLT5DYnVmX3N0cmlwOworCisJCS8vIGFzIGxvbmcgYXMgdGhlcmUgYXJlIHBhY2tldHMgZm9yIHRoaXMgY2hhbm5lbC4uLgorCisJCXdoaWxlIChzdHJpcEluZGV4ICE9IHBDaC0+Q2J1Zl9zdHVmZikgeworCQkJcFJlbW92ZSA9ICYocENoLT5DYnVmW3N0cmlwSW5kZXhdKTsKKwkJCXBhY2tldFNpemUgPSBDTURfQ09VTlRfT0YocFJlbW92ZSkgKyBzaXplb2YoaTJDbWRIZWFkZXIpOworCQkJcGFkZGVkU2l6ZSA9IFJPVU5EVVAocGFja2V0U2l6ZSk7CisKKwkJCWlmIChwYWRkZWRTaXplID4gMCkgeworCQkJCWlmICggMCA9PSBpMldyaXRlMkZpZm8ocEIsIHBSZW1vdmUsIHBhZGRlZFNpemUsMCkpIHsKKwkJCQkJbm90Q2xvZ2dlZCA9IDA7CS8qIGZpZm8gZnVsbCAqLworCQkJCQlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9CWVBBU1MpOwkvLyBQdXQgYmFjayBvbiBxdWV1ZQorCQkJCQlicmVhazsgICAvLyBCcmVhayBmcm9tIHRoZSBjaGFubmVsCisJCQkJfSAKKwkJCX0KKyNpZmRlZiBERUJVR19GSUZPCitXcml0ZURCR0J1ZigiQllQUyIsIHBSZW1vdmUsIHBhZGRlZFNpemUpOworI2VuZGlmCS8qIERFQlVHX0ZJRk8gKi8KKwkJCXBCLT5kZWJ1Z0J5cGFzc0NvdW50Kys7CisKKwkJCXBSZW1vdmUgKz0gcGFja2V0U2l6ZTsKKwkJCXN0cmlwSW5kZXggKz0gcGFja2V0U2l6ZTsKKwkJCWlmIChzdHJpcEluZGV4ID49IENCVUZfU0laRSkgeworCQkJCXN0cmlwSW5kZXggPSAwOworCQkJCXBSZW1vdmUgPSBwQ2gtPkNidWY7CisJCQl9CisJCX0KKwkJLy8gRG9uZSB3aXRoIHRoaXMgY2hhbm5lbC4gTW92ZSB0byBuZXh0LCByZW1vdmluZyB0aGlzIG9uZSBmcm9tIAorCQkvLyB0aGUgcXVldWUgb2YgY2hhbm5lbHMgaWYgd2UgY2xlYW5lZCBpdCBvdXQgKGkuZS4sIGRpZG4ndCBnZXQgY2xvZ2dlZC4KKwkJcENoLT5DYnVmX3N0cmlwID0gc3RyaXBJbmRleDsKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+Q2J1Zl9zcGlubG9jayxmbGFncyk7CisJfSAgLy8gRWl0aGVyIGNsb2dnZWQgb3IgZmluaXNoZWQgYWxsIHRoZSB3b3JrCisKKyNpZmRlZiBJUDJERUJVR19UUkFDRQorCWlmICggIWJhaWxvdXQgKSB7CisJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfRVJST1IsIDEsIDAgKTsKKwl9CisjZW5kaWYKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyU3R1ZmZGaWZvRmxvdyhwQikKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUKKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFN0dWZmcyBhcyBtYW55IGZsb3cgY29udHJvbCBwYWNrZXRzIGludG8gdGhlIGZpZm8gYXMgcG9zc2libGUuIFRoaXMgaXMgZWFzaWVyCisvLyBldmVuIHRoYW4gZG9pbmcgbm9ybWFsIGJ5cGFzcyBjb21tYW5kcywgYmVjYXVzZSB0aGVyZSBpcyBhbHdheXMgYXQgbW9zdCBvbmUKKy8vIHBhY2tldCwgYWxyZWFkeSBhc3NlbWJsZWQsIGZvciBlYWNoIGNoYW5uZWwuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGlubGluZSB2b2lkCitpMlN0dWZmRmlmb0Zsb3coaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpMkNoYW5TdHJQdHIgcENoOworCXVuc2lnbmVkIHNob3J0IHBhZGRlZFNpemUJCT0gUk9VTkRVUChzaXplb2YoZmxvd0luKSk7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NGTE9XLCBJVFJDX0VOVEVSLCAyLAorCQlwQi0+aTJlRmlmb1JlbWFpbnMsIHBhZGRlZFNpemUgKTsKKworCS8vIENvbnRpbnVlIHByb2Nlc3Npbmcgc28gbG9uZyBhcyB0aGVyZSBhcmUgZW50cmllcywgb3IgdGhlcmUgaXMgcm9vbSBpbiB0aGUKKwkvLyBmaWZvLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgYSBjaGFubmVsIHdpdGggc29tZXRoaW5nIHRvIGRvLgorCXdoaWxlICggKE5VTEwgIT0gKHBDaCA9IGkyRGVRdWV1ZU5lZWRzKHBCLE5FRURfRkxPVykpKSkgeworCQlwQi0+ZGVidWdGbG93Q291bnQrKzsKKworCQkvLyBOTyBDaGFuIExPQ0sgbmVlZGVkID8/PworCQlpZiAoIDAgPT0gaTJXcml0ZTJGaWZvKHBCLCh1bnNpZ25lZCBjaGFyICopJihwQ2gtPmluZmwpLHBhZGRlZFNpemUsMCkpIHsKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgREVCVUdfRklGTworCQlXcml0ZURCR0J1ZigiRkxPVyIsKHVuc2lnbmVkIGNoYXIgKikgJihwQ2gtPmluZmwpLCBwYWRkZWRTaXplKTsKKyNlbmRpZiAvKiBERUJVR19GSUZPICovCisKKwl9ICAvLyBFaXRoZXIgY2xvZ2dlZCBvciBmaW5pc2hlZCBhbGwgdGhlIHdvcmsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfU0ZMT1csIElUUkNfUkVUVVJOLCAwICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMlN0dWZmRmlmb0lubGluZShwQikKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUKKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFN0dWZmcyBhcyBtdWNoIGRhdGEgYW5kIGlubGluZSBjb21tYW5kcyBpbnRvIHRoZSBmaWZvIGFzIHBvc3NpYmxlLiBUaGlzIGlzCisvLyB0aGUgbW9zdCBjb21wbGV4IGZpZm8tc3R1ZmZpbmcgb3BlcmF0aW9uLCBzaW5jZSB0aGVyZSBpZiBub3cgdGhlIGNoYW5uZWwKKy8vIGZsb3ctY29udHJvbCBpc3N1ZSB0byBkZWFsIHdpdGguCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGlubGluZSB2b2lkCitpMlN0dWZmRmlmb0lubGluZShpMmVCb3JkU3RyUHRyIHBCKQoreworCWkyQ2hhblN0clB0ciBwQ2g7CisJdW5zaWduZWQgY2hhciAqcFJlbW92ZTsKKwl1bnNpZ25lZCBzaG9ydCBzdHJpcEluZGV4OworCXVuc2lnbmVkIHNob3J0IHBhY2tldFNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkZGVkU2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBub3RDbG9nZ2VkID0gMTsKKwl1bnNpZ25lZCBzaG9ydCBmbG93c2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW50IGJhaWxvdXQgID0gMTAwMDsKKwlpbnQgYmFpbG91dDI7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NJQ01ELCBJVFJDX0VOVEVSLCAzLCBwQi0+aTJlRmlmb1JlbWFpbnMsIAorCQkJcEItPmkyRGJ1Zl9zdHJpcCwgcEItPmkyRGJ1Zl9zdHVmZiApOworCisJLy8gQ29udGludWUgcHJvY2Vzc2luZyBzbyBsb25nIGFzIHRoZXJlIGFyZSBlbnRyaWVzLCBvciB0aGVyZSBpcyByb29tIGluIHRoZQorCS8vIGZpZm8uIEVhY2ggZW50cnkgcmVwcmVzZW50cyBhIGNoYW5uZWwgd2l0aCBzb21ldGhpbmcgdG8gZG8uCisJd2hpbGUgKCAtLWJhaWxvdXQgJiYgbm90Q2xvZ2dlZCAmJiAKKwkJCShOVUxMICE9IChwQ2ggPSBpMkRlUXVldWVOZWVkcyhwQixORUVEX0lOTElORSkpKSApCisJeworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCXN0cmlwSW5kZXggPSBwQ2gtPk9idWZfc3RyaXA7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1NJQ01ELCAzLCAyLCBzdHJpcEluZGV4LCBwQ2gtPk9idWZfc3R1ZmYgKTsKKworCQkvLyBhcyBsb25nIGFzIHRoZXJlIGFyZSBwYWNrZXRzIGZvciB0aGlzIGNoYW5uZWwuLi4KKwkJYmFpbG91dDIgPSAxMDAwOworCQl3aGlsZSAoIC0tYmFpbG91dDIgJiYgc3RyaXBJbmRleCAhPSBwQ2gtPk9idWZfc3R1ZmYpIHsKKwkJCXBSZW1vdmUgPSAmKHBDaC0+T2J1ZltzdHJpcEluZGV4XSk7CisKKwkJCS8vIE11c3QgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBiZSBhIGRhdGEgb3IgY29tbWFuZCBwYWNrZXQgdG8KKwkJCS8vIGNhbGN1bGF0ZSBjb3JyZWN0bHkgdGhlIGhlYWRlciBzaXplIGFuZCB0aGUgYW1vdW50IG9mCisJCQkvLyBmbG93LWNvbnRyb2wgY3JlZGl0IHRoaXMgdHlwZSBvZiBwYWNrZXQgd2lsbCB1c2UuCisJCQlpZiAoUFRZUEVfT0YocFJlbW92ZSkgPT0gUFRZUEVfREFUQSkgeworCQkJCWZsb3dzaXplID0gREFUQV9DT1VOVF9PRihwUmVtb3ZlKTsKKwkJCQlwYWNrZXRTaXplID0gZmxvd3NpemUgKyBzaXplb2YoaTJEYXRhSGVhZGVyKTsKKwkJCX0gZWxzZSB7CisJCQkJZmxvd3NpemUgPSBDTURfQ09VTlRfT0YocFJlbW92ZSk7CisJCQkJcGFja2V0U2l6ZSA9IGZsb3dzaXplICsgc2l6ZW9mKGkyQ21kSGVhZGVyKTsKKwkJCX0KKwkJCWZsb3dzaXplID0gQ1JFRElUX1VTQUdFKGZsb3dzaXplKTsKKwkJCXBhZGRlZFNpemUgPSBST1VORFVQKHBhY2tldFNpemUpOworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDQsIDIsIHBCLT5pMmVGaWZvUmVtYWlucywgcGFkZGVkU2l6ZSApOworCisJCQkvLyBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBjcmVkaXRzIGZyb20gdGhlIGJvYXJkIHRvIHNlbmQgdGhlIGRhdGEsCisJCQkvLyBmbGFnIHRoZSBjaGFubmVsIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIGZsb3cgY29udHJvbCBjcmVkaXQsIGFuZAorCQkJLy8gYnJlYWsgb3V0LiBUaGlzIHdpbGwgY2xlYW4gdXAgdGhpcyBjaGFubmVsIGFuZCByZW1vdmUgdXMgZnJvbSB0aGUKKwkJCS8vIHF1ZXVlIG9mIGhvdCB0aGluZ3MgdG8gZG8uCisKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDUsIDIsIHBDaC0+b3V0Zmwucm9vbSwgZmxvd3NpemUgKTsKKworCQkJaWYgKHBDaC0+b3V0Zmwucm9vbSA8PSBmbG93c2l6ZSkJeworCQkJCS8vIERvIE5vdCBoYXZlIHRoZSBjcmVkaXRzIHRvIHNlbmQgdGhpcyBwYWNrZXQuCisJCQkJaTJRdWV1ZU5lZWRzKHBCLCBwQ2gsIE5FRURfQ1JFRElUKTsKKwkJCQlub3RDbG9nZ2VkID0gMDsKKwkJCQlicmVhazsgICAvLyBTbyB0byBkbyBuZXh0IGNoYW5uZWwKKwkJCX0KKwkJCWlmICggKHBhZGRlZFNpemUgPiAwKSAKKwkJCQkmJiAoIDAgPT0gaTJXcml0ZTJGaWZvKHBCLCBwUmVtb3ZlLCBwYWRkZWRTaXplLCAxMjgpKSkgeworCQkJCS8vIERvIE5vdCBoYXZlIHJvb20gaW4gZmlmbyB0byBzZW5kIHRoaXMgcGFja2V0LgorCQkJCW5vdENsb2dnZWQgPSAwOworCQkJCWkyUXVldWVOZWVkcyhwQiwgcENoLCBORUVEX0lOTElORSk7CQorCQkJCWJyZWFrOyAgIC8vIEJyZWFrIGZyb20gdGhlIGNoYW5uZWwKKwkJCX0KKyNpZmRlZiBERUJVR19GSUZPCitXcml0ZURCR0J1ZigiREFUQSIsIHBSZW1vdmUsIHBhZGRlZFNpemUpOworI2VuZGlmIC8qIERFQlVHX0ZJRk8gKi8KKwkJCXBCLT5kZWJ1Z0lubGluZUNvdW50Kys7CisKKwkJCXBDaC0+aWNvdW50LnR4ICs9IGZsb3dzaXplOworCQkJLy8gVXBkYXRlIGN1cnJlbnQgY3JlZGl0cworCQkJcENoLT5vdXRmbC5yb29tIC09IGZsb3dzaXplOworCQkJcENoLT5vdXRmbC5hc29mICs9IGZsb3dzaXplOworCQkJaWYgKFBUWVBFX09GKHBSZW1vdmUpID09IFBUWVBFX0RBVEEpIHsKKwkJCQlwQ2gtPk9idWZfY2hhcl9jb3VudCAtPSBEQVRBX0NPVU5UX09GKHBSZW1vdmUpOworCQkJfQorCQkJcFJlbW92ZSArPSBwYWNrZXRTaXplOworCQkJc3RyaXBJbmRleCArPSBwYWNrZXRTaXplOworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDYsIDIsIHN0cmlwSW5kZXgsIHBDaC0+T2J1Zl9zdHJpcCk7CisKKwkJCWlmIChzdHJpcEluZGV4ID49IE9CVUZfU0laRSkgeworCQkJCXN0cmlwSW5kZXggPSAwOworCQkJCXBSZW1vdmUgPSBwQ2gtPk9idWY7CisKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDcsIDEsIHN0cmlwSW5kZXggKTsKKworCQkJfQorCQl9CS8qIHdoaWxlICovCisJCWlmICggIWJhaWxvdXQyICkgeworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0VSUk9SLCAzLCAwICk7CisJCX0KKwkJLy8gRG9uZSB3aXRoIHRoaXMgY2hhbm5lbC4gTW92ZSB0byBuZXh0LCByZW1vdmluZyB0aGlzIG9uZSBmcm9tIHRoZQorCQkvLyBxdWV1ZSBvZiBjaGFubmVscyBpZiB3ZSBjbGVhbmVkIGl0IG91dCAoaS5lLiwgZGlkbid0IGdldCBjbG9nZ2VkLgorCQlwQ2gtPk9idWZfc3RyaXAgPSBzdHJpcEluZGV4OworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCBub3RDbG9nZ2VkICkKKwkJeworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDgsIDAgKTsKKworCQkJaWYgKCBwQ2gtPnBUVFkgKSB7CisJCQkJaXAyX293YWtlKHBDaC0+cFRUWSk7CisJCQl9CisJCX0KKwl9ICAvLyBFaXRoZXIgY2xvZ2dlZCBvciBmaW5pc2hlZCBhbGwgdGhlIHdvcmsKKworCWlmICggIWJhaWxvdXQgKSB7CisJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfRVJST1IsIDQsIDAgKTsKKwl9CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NJQ01ELCBJVFJDX1JFVFVSTiwgMSxwQi0+aTJEYnVmX3N0cmlwKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIHNlcnZpY2VPdXRnb2luZ0ZpZm8ocEIpCisvLyBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGEgYm9hcmQgc3RydWN0dXJlCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBIZWxwZXIgcm91dGluZSB0byBwdXQgZGF0YSBpbiB0aGUgb3V0Z29pbmcgZmlmbywgaWYgd2UgYXJlbid0IGFscmVhZHkgd2FpdGluZworLy8gZm9yIHNvbWV0aGluZyB0byBiZSB0aGVyZS4gSWYgdGhlIGZpZm8gaGFzIG9ubHkgcm9vbSBmb3IgYSB2ZXJ5IGxpdHRsZSBkYXRhLAorLy8gZ28gaGVhZCBhbmQgaGl0IHRoZSBib2FyZCB3aXRoIGEgbWFpbGJveCBoaXQgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwgaXQgd2lsbAorLy8gaGF2ZSB0byBoYXBwZW4gbGF0ZXIgaW4gdGhlIGludGVycnVwdCBwcm9jZXNzaW5nLiBTaW5jZSB0aGlzIHJvdXRpbmUgbWF5IGJlCisvLyBjYWxsZWQgYm90aCBhdCBpbnRlcnJ1cHQgYW5kIGZvcmVncm91bmQgdGltZSwgd2UgbXVzdCB0dXJuIG9mZiBpbnRlcnJ1cHRzCisvLyBkdXJpbmcgdGhlIGVudGlyZSBwcm9jZXNzLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitzZXJ2aWNlT3V0Z29pbmdGaWZvKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJLy8gSWYgd2UgYXJlbid0IGN1cnJlbnRseSB3YWl0aW5nIGZvciB0aGUgYm9hcmQgdG8gZW1wdHkgb3VyIGZpZm8sIHNlcnZpY2UKKwkvLyBldmVyeXRoaW5nIHRoYXQgaXMgcGVuZGluZywgaW4gcHJpb3JpdHkgb3JkZXIgKGVzcGVjaWFsbHksIEJ5cGFzcyBiZWZvcmUKKwkvLyBJbmxpbmUpLgorCWlmICggISBwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbyApCisJeworCQlpMlN0dWZmRmlmb0Zsb3cocEIpOworCQlpMlN0dWZmRmlmb0J5cGFzcyhwQik7CisJCWkyU3R1ZmZGaWZvSW5saW5lKHBCKTsKKworCQlpaVNlbmRQZW5kaW5nTWFpbChwQik7CisJfSAKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyU2VydmljZUJvYXJkKHBCKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gTm9ybWFsbHkgdGhpcyBpcyBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwsIGJ1dCB0aGVyZSBpcyBkZWxpYmVyYXRlbHkKKy8vIG5vdGhpbmcgaW4gaGVyZSBzcGVjaWZpYyB0byBiZWluZyBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwuIEFsbCB0aGUKKy8vIGhhcmR3YXJlLXNwZWNpZmljLCBpbnRlcnJ1cHQtc3BlY2lmaWMgdGhpbmdzIGhhcHBlbiBhdCB0aGUgb3V0ZXIgbGV2ZWxzLgorLy8KKy8vIEZvciBleGFtcGxlLCBhIHRpbWVyIGludGVycnVwdCBjb3VsZCBkcml2ZSB0aGlzIHJvdXRpbmUgZm9yIHNvbWUgc29ydCBvZgorLy8gcG9sbGVkIG9wZXJhdGlvbi4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgcHJvZ3JhbW1lciBkZWFsIHdpdGggYW55CisvLyBhdG9taXRpY2l0eS9jb25jdXJyZW5jeSBpc3N1ZXMgdGhhdCByZXN1bHQuCisvLworLy8gVGhpcyByb3V0aW5lIHJlc3BvbmRzIHRvIHRoZSBib2FyZCdzIGhhdmluZyBzZW50IG1haWxib3ggaW5mb3JtYXRpb24gdG8gdGhlCisvLyBob3N0ICh3aGljaCB3b3VsZCBub3JtYWxseSBjYXVzZSBhbiBpbnRlcnJ1cHQpLiBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlCisvLyBpbmNvbWluZyBtYWlsYm94LiBJZiB0aGVyZSBpcyBubyBkYXRhIGluIGl0LCB0aGlzIGJvYXJkIGRpZCBub3QgY3JlYXRlIHRoZQorLy8gaW50ZXJydXB0IGFuZC9vciBoYXMgbm90aGluZyB0byBiZSBkb25lIHRvIGl0LiAoRXhjZXB0LCBpZiB3ZSBoYXZlIGJlZW4KKy8vIHdhaXRpbmcgdG8gd3JpdGUgbWFpbGJveCBkYXRhIHRvIGl0LCB3ZSBtYXkgZG8gc28uCisvLworLy8gQmFzZWQgb24gdGhlIHZhbHVlIGluIHRoZSBtYWlsYm94LCB3ZSBtYXkgdGFrZSB2YXJpb3VzIGFjdGlvbnMuCisvLworLy8gTm8gY2hlY2tpbmcgaGVyZSBvZiBwQiB2YWxpZGl0eTogYWZ0ZXIgYWxsLCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZCBieQorLy8gdGhlIGhhbmRsZXIgdW5sZXNzIHBCIHdlcmUgb24gdGhlIGxpc3QuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGlubGluZSBpbnQKK2kyU2VydmljZUJvYXJkICggaTJlQm9yZFN0clB0ciBwQiApCit7CisJdW5zaWduZWQgaW5tYWlsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCS8qIFRoaXMgc2hvdWxkIGJlIGF0b21pYyBiZWNhdXNlIG9mIHRoZSB3YXkgd2UgYXJlIGNhbGxlZC4uLiAqLworCWlmIChOT19NQUlMX0hFUkUgPT0gKCBpbm1haWwgPSBwQi0+aTJlU3RhcnRNYWlsICkgKSB7CisJCWlubWFpbCA9IGlpR2V0TWFpbChwQik7CisJfQorCXBCLT5pMmVTdGFydE1haWwgPSBOT19NQUlMX0hFUkU7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIDIsIDEsIGlubWFpbCApOworCisJaWYgKGlubWFpbCAhPSBOT19NQUlMX0hFUkUpIHsKKwkJLy8gSWYgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLCBub3RoaW5nIHRvIGRvIGJ1dCBoaXQgYSBiaXQgdGhhdCB3aWxsCisJCS8vIGFsZXJ0IGZvcmVncm91bmQgdGFza3MgdG8gcHJvdGVzdCEKKwkJaWYgKCBpbm1haWwgJiBNQl9GQVRBTF9FUlJPUiApIHsKKwkJCXBCLT5pMmVGYXRhbCA9IDE7CisJCQlnb3RvIGV4aXRfaTJTZXJ2aWNlQm9hcmQ7CisJCX0KKworCQkvKiBBc3N1bWluZyBubyBmYXRhbCBjb25kaXRpb24sIHdlIHByb2NlZWQgdG8gZG8gd29yayAqLworCQlpZiAoIGlubWFpbCAmIE1CX0lOX1NUVUZGRUQgKSB7CisJCQlwQi0+aTJlRmlmb0luSW50cysrOworCQkJaTJTdHJpcEZpZm8ocEIpOyAgICAgLyogVGhlcmUgbWlnaHQgYmUgaW5jb21pbmcgcGFja2V0cyAqLworCQl9CisKKwkJaWYgKGlubWFpbCAmIE1CX09VVF9TVFJJUFBFRCkgeworCQkJcEItPmkyZUZpZm9PdXRJbnRzKys7CisJCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXBCLT5pMmVGaWZvUmVtYWlucyA9IHBCLT5pMmVGaWZvU2l6ZTsKKwkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvID0gMDsKKwkJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayxmbGFncyk7CisKKwkJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5UUiwgMzAsIDEsIHBCLT5pMmVGaWZvUmVtYWlucyApOworCisJCX0KKwkJc2VydmljZU91dGdvaW5nRmlmbyhwQik7CisJfQorCisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTlRSLCA4LCAwICk7CisKK2V4aXRfaTJTZXJ2aWNlQm9hcmQ6CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJlMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5oCkBAIC0wLDAgKzEsMzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IElJIGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogSGVhZGVyIGZpbGUgZm9yIGhpZ2ggbGV2ZWwgbGlicmFyeSBmdW5jdGlvbnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEkyTElCX0gKKyNkZWZpbmUgSTJMSUJfSCAgIDEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJMkxJQi5ICisvLworLy8gSW50ZWxsaVBvcnQtSUkgYW5kIEludGVsbGlQb3J0LUlJRVgKKy8vCisvLyBEZWZpbmVzLCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMsIGFuZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGkybGliLmMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5kYXRvcnkgSW5jbHVkZXM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAiaXAydHlwZXMuaCIKKyNpbmNsdWRlICJpMmVsbGlzLmgiCisjaW5jbHVkZSAiaTJwYWNrLmgiCisjaW5jbHVkZSAiaTJjbWQuaCIKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGkyQ2hhblN0ciAtLSBDaGFubmVsIFN0cnVjdHVyZToKKy8vIFVzZWQgdG8gdHJhY2sgcGVyLWNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBsaWJyYXJ5IHJvdXRpbmVzIHVzaW5nIHN0YW5kYXJkCisvLyBsb2Fkd2FyZS4gTm90ZSBhbHNvLCBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBwYXRjaGVkCisvLyBpbnRvIHRoZSBpMmVCb3JkU3RyIChzZWUgaTJlbGxpcy5oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJZiB3ZSBtYWtlIHNvbWUgbGltaXRzIG9uIHRoZSBtYXhpbXVtIGJsb2NrIHNpemVzLCB3ZSBjYW4gYXZvaWQgZGVhbGluZyB3aXRoCisvLyBidWZmZXIgd3JhcC4gVGhlIHdyYXBwaW5nIG9mIHRoZSBidWZmZXIgaXMgYmFzZWQgb24gd2hlcmUgdGhlIHN0YXJ0IG9mIHRoZQorLy8gcGFja2V0IGlzLiBUaGVuIHRoZXJlIGlzIGFsd2F5cyByb29tIGZvciB0aGUgcGFja2V0IGNvbnRpZ3VvdXNseS4KKy8vCisvLyBNYXhpbXVtIHRvdGFsIGxlbmd0aCBvZiBhbiBvdXRnb2luZyBkYXRhIG9yIGluLWxpbmUgY29tbWFuZCBibG9jay4gVGhlIGxpbWl0CisvLyBvZiAzNiBvbiBkYXRhIGlzIHF1aXRlIGFyYml0cmFyeSBhbmQgYmFzZWQgbW9yZSBvbiBET1MgbWVtb3J5IGxpbWl0YXRpb25zCisvLyB0aGFuIHRoZSBib2FyZCBpbnRlcmZhY2UuIEhvd2V2ZXIsIGZvciBjb21tYW5kcywgdGhlIG1heGltdW0gcGFja2V0IGxlbmd0aCBpcworLy8gTUFYX0NNRF9QQUNLX1NJWkUsIGJlY2F1c2UgdGhlIGZpZWxkIHNpemUgZm9yIHRoZSBjb3VudCBpcyBvbmx5IGEgZmV3IGJpdHMKKy8vIChzZWUgSTJQQUNLLkgpIGluIHN1Y2ggcGFja2V0cy4gRm9yIGRhdGEgcGFja2V0cywgdGhlIGNvdW50IGZpZWxkIHNpemUgaXMgbm90CisvLyB0aGUgbGltaXRpbmcgZmFjdG9yLiBBcyBvZiB0aGlzIHdyaXRpbmcsIE1BWF9PQlVGX0JMT0NLIDwgTUFYX0NNRF9QQUNLX1NJWkUsCisvLyBidXQgYmUgY2FyZWZ1bCBpZiB3YW50aW5nIHRvIG1vZGlmeSBlaXRoZXIuCisvLworI2RlZmluZSBNQVhfT0JVRl9CTE9DSyAgMzYKKworLy8gQW5vdGhlciBub3RlIG9uIG1heGltdW0gYmxvY2sgc2l6ZXM6IHdlIGFyZSBidWZmZXJpbmcgcGFja2V0cyBoZXJlLiBEYXRhIGlzCisvLyBwdXQgaW50byB0aGUgYnVmZmVyIChpZiB0aGVyZSBpcyByb29tKSByZWdhcmRsZXNzIG9mIHRoZSBjcmVkaXRzIGZyb20gdGhlCisvLyBib2FyZC4gVGhlIGJvYXJkIHNlbmRzIG5ldyBjcmVkaXRzIHdoZW5ldmVyIGl0IGhhcyByZW1vdmVkIGZyb20gaGlzIGJ1ZmZlcnMgYQorLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXF1YWwgdG8gODAlIG9mIHRvdGFsIGJ1ZmZlciBzaXplLiAoT2YgY291cnNlLCB0aGUgdG90YWwKKy8vIGJ1ZmZlciBzaXplIGlzIHdoYXQgaXMgcmVwb3J0ZWQgd2hlbiB0aGUgdmVyeSBmaXJzdCBzZXQgb2YgZmxvdyBjb250cm9sCisvLyBzdGF0dXMgcGFja2V0cyBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgYm9hcmQuIFRoZXJlZm9yZSwgdG8gYmUgcm9idXN0LCB5b3UgbXVzdAorLy8gYWx3YXlzIGZpbGwgdGhlIGJvYXJkIHRvIGF0IGxlYXN0IDgwJSBvZiB0aGUgY3VycmVudCBjcmVkaXQgbGltaXQsIGVsc2UgeW91CisvLyBtaWdodCBub3QgZ2l2ZSBpdCBlbm91Z2ggdG8gdHJpZ2dlciBhIG5ldyByZXBvcnQuIFRoZXNlIGNvbmRpdGlvbnMgYXJlCisvLyBvYnRhaW5lZCBoZXJlIHNvIGxvbmcgYXMgdGhlIG1heGltdW0gb3V0cHV0IGJsb2NrIHNpemUgaXMgbGVzcyB0aGFuIDIwJSB0aGUKKy8vIHNpemUgb2YgdGhlIGJvYXJkJ3Mgb3V0cHV0IGJ1ZmZlcnMuIFRoaXMgaXMgdHJ1ZSBhdCBwcmVzZW50IGJ5ICJjb2luY2lkZW5jZSIKKy8vIG9yICJpbmZlcm5hbCBrbm93bGVkZ2UiOiB0aGUgYm9hcmQncyBvdXRwdXQgYnVmZmVycyBhcmUgYXQgbGVhc3QgNzAwIGJ5dGVzCisvLyBsb25nICgyMCUgPSAxNDAgYnl0ZXMsIGF0IGxlYXN0KS4gVGhlIDgwJSBmaWd1cmUgaXMgIm9mZmljaWFsIiwgc28gdGhlIHNhZmVzdAorLy8gc3RyYXRlZ3kgbWlnaHQgYmUgdG8gdHJhcCB0aGUgZmlyc3QgZmxvdyBjb250cm9sIHJlcG9ydCBhbmQgZ3VhcmFudGVlIHRoYXQKKy8vIHRoZSBlZmZlY3RpdmUgbWF4T2J1ZkJsb2NrIGlzIHRoZSBtaW5pbXVtIG9mIE1BWF9PQlVGX0JMT0NLIGFuZCAyMCUgb2YgZmlyc3QKKy8vIHJlcG9ydGVkIGJ1ZmZlciBjcmVkaXQuCisvLworI2RlZmluZSBNQVhfQ0JVRl9CTE9DSyAgNgkvLyBNYXhpbXVtIHRvdGFsIGxlbmd0aCBvZiBhIGJ5cGFzcyBjb21tYW5kIGJsb2NrCisKKyNkZWZpbmUgSUJVRl9TSVpFICAgICAgIDUxMgkvLyBjaGFyYWN0ZXIgY2FwYWNpdHkgb2YgaW5wdXQgYnVmZmVyIHBlciBjaGFubmVsCisjZGVmaW5lIE9CVUZfU0laRSAgICAgICAxMDI0Ly8gY2hhcmFjdGVyIGNhcGFjaXR5IG9mIG91dHB1dCBidWZmZXIgcGVyIGNoYW5uZWwKKyNkZWZpbmUgQ0JVRl9TSVpFICAgICAgIDEwCS8vIGNoYXJhY3RlciBjYXBhY2l0eSBvZiBvdXRwdXQgYnlwYXNzIGJ1ZmZlcgorCit0eXBlZGVmIHN0cnVjdCBfaTJDaGFuU3RyCit7CisJLy8gRmlyc3QsIGJhY2stcG9pbnRlcnMgc28gdGhhdCBnaXZlbiBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIHlvdSBjYW4KKwkvLyBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgYm9hcmQgYW5kIGNoYW5uZWwgbnVtYmVyIHRvIHJlZmVyZW5jZSwgKHNheSwgd2hlbgorCS8vIGlzc3VpbmcgY29tbWFuZHMsIGV0Yy4gKE5vdGUsIGNoYW5uZWwgbnVtYmVyIGlzIGluIGluZmwuaGQuaTJzQ2hhbm5lbC4pCisKKwlpbnQgICAgICBwb3J0X2luZGV4OyAgICAvLyBJbmRleCBvZiBwb3J0IGluIGNoYW5uZWwgc3RydWN0dXJlIGFycmF5IGF0dGFjaGVkCisJCQkJCQkJLy8gdG8gYm9hcmQgc3RydWN0dXJlLgorCVBUVFkgICAgIHBUVFk7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSBmb3IgcG9ydCAoT1Mgc3BlY2lmaWMpCisJVVNIT1JUICAgdmFsaWRpdHk7ICAgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIGNoYW5uZWwgaGFzIGJlZW4KKwkJCQkJCQkvLyBpbml0aWFsaXplZCwgcmVhbGx5IGV4aXN0cyAob3IgaXMgYSBtaXNzaW5nCisJCQkJCQkJLy8gY2hhbm5lbCwgZS5nLiBjaGFubmVsIDkgb24gYW4gOC1wb3J0IGJveC4pCisKKwlpMmVCb3JkU3RyUHRyICBwTXlCb3JkOyAvLyBCYWNrLXBvaW50ZXIgdG8gdGhpcyBjaGFubmVsJ3MgYm9hcmQgc3RydWN0dXJlIAorCisJaW50ICAgICAgd29wZW47CQkJLy8gd2FpdGluZyBmZXIgY2FycmllcgorCisJaW50ICAgICAgdGhyb3R0bGVkOwkJLy8gU2V0IGlmIHVwcGVyIGxheWVyIGNhbiB0YWtlIG5vIGRhdGEKKworCWludCAgICAgIGZsYWdzOyAgICAgICAgIC8vIERlZmluZWQgaW4gdHR5LmgKKworCVBXQUlUUSAgIG9wZW5fd2FpdDsgICAgIC8vIFBvaW50ZXIgZm9yIE9TIHNsZWVwIGZ1bmN0aW9uLgorCVBXQUlUUSAgIGNsb3NlX3dhaXQ7ICAgIC8vIFBvaW50ZXIgZm9yIE9TIHNsZWVwIGZ1bmN0aW9uLgorCVBXQUlUUSAgIGRlbHRhX21zcl93YWl0Oy8vIFBvaW50ZXIgZm9yIE9TIHNsZWVwIGZ1bmN0aW9uLgorCVBXQUlUUSAgIGRzc19ub3dfd2FpdDsJLy8gUG9pbnRlciBmb3IgT1Mgc2xlZXAgZnVuY3Rpb24uCisKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgQm9va21hcmtUaW1lcjsgICAvLyBVc2VkIGJ5IGkyRHJhaW5PdXRwdXQKKwl3YWl0X3F1ZXVlX2hlYWRfdCBwQm9va21hcmtXYWl0OyAgIC8vIFVzZWQgYnkgaTJEcmFpbk91dHB1dAorCisJaW50ICAgICAgQmF1ZEJhc2U7CisJaW50ICAgICAgQmF1ZERpdmlzb3I7CisKKwlVU0hPUlQgICBDbG9zaW5nRGVsYXk7CisJVVNIT1JUICAgQ2xvc2luZ1dhaXRUaW1lOworCisJdm9sYXRpbGUKKwlmbG93SW4gICBpbmZsOwkvLyBUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBhcyBhIGNvbXBsZXRlbHkKKwkJCQkJLy8gZm9ybWVkIGZsb3ctY29udHJvbCBjb21tYW5kIHBhY2tldCwgYW5kIGFzIHN1Y2gKKwkJCQkJLy8gaGFzIHRoZSBjaGFubmVsIG51bWJlciwgYWxzbyB0aGUgY2FwYWNpdHkgYW5kCisJCQkJCS8vICJhcy1vZiIgZGF0YSBuZWVkZWQgY29udGludW91c2x5LgorCisJVVNIT1JUICAgc2luY2VMYXN0RmxvdzsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGZyb20gaW5wdXQKKwkJCQkJCQkvLyBidWZmZXJzLCBzaW5jZSB0aGUgbGFzdCB0aW1lIGZsb3cgY29udHJvbCBpbmZvCisJCQkJCQkJLy8gd2FzIHNlbnQuCisKKwlVU0hPUlQgICB3aGVuU2VuZEZsb3c7ICAvLyBEZXRlcm1pbmVzIHdoZW4gbmV3IGZsb3cgY29udHJvbCBpcyB0byBiZSBzZW50IHRvCisJCQkJCQkJLy8gdGhlIGJvYXJkLiBOb3RlIHVubGlrZSBlYXJsaWVyIG1hbmlmZXN0YXRpb25zIG9mCisJCQkJCQkJLy8gdGhlIGRyaXZlciwgdGhlc2UgcGFja2V0cyBjYW4gYmUgc2VudCBmcm9tCisJCQkJCQkJLy8gaW4tcGxhY2UuCisKKwlVU0hPUlQgICBjaGFubmVsTmVlZHM7ICAvLyBCaXQgbWFwIG9mIGltcG9ydGFudCB0aGluZ3Mgd2hpY2ggbXVzdCBiZSBkb25lCisJCQkJCQkJLy8gZm9yIHRoaXMgY2hhbm5lbC4gKFNlZSBiaXRzIGJlbG93ICkKKworCXZvbGF0aWxlCisJZmxvd1N0YXQgb3V0Zmw7ICAgICAgICAgLy8gU2FtZSB0eXBlIG9mIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgY3VycmVudAorCQkJCQkJCS8vIGZsb3cgY29udHJvbCBpbmZvcm1hdGlvbiB1c2VkIHRvIGNvbnRyb2wgb3VyCisJCQkJCQkJLy8gb3V0cHV0LiAiYXNvZiIgaXMga2VwdCB1cGRhdGVkIGFzIGRhdGEgaXMgc2VudCwKKwkJCQkJCQkvLyBhbmQgInJvb20iIG5ldmVyIGdvZXMgdG8gemVyby4KKworCS8vIFRoZSBpbmNvbWluZyByaW5nIGJ1ZmZlcgorCS8vIFVubGlrZSB0aGUgb3V0Z29pbmcgYnVmZmVycywgdGhpcyBob2xkcyByYXcgZGF0YSwgbm90IHBhY2tldHMuIFRoZSB0d28KKwkvLyBleHRyYSBieXRlcyBhcmUgdXNlZCB0byBob2xkIHRoZSBieXRlLXBhZGRpbmcgd2hlbiB0aGVyZSBpcyByb29tIGZvciBhbgorCS8vIG9kZCBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHdlIG11c3Qgd3JhcC4KKwkvLworCVVDSEFSICAgIElidWZbSUJVRl9TSVpFICsgMl07CisJdm9sYXRpbGUKKwlVU0hPUlQgICBJYnVmX3N0dWZmOyAgICAgLy8gU3R1ZmZpbmcgaW5kZXgKKwl2b2xhdGlsZQorCVVTSE9SVCAgIElidWZfc3RyaXA7ICAgICAvLyBTdHJpcHBpbmcgaW5kZXgKKworCS8vIFRoZSBvdXRnb2luZyByaW5nLWJ1ZmZlcjogSG9sZHMgRGF0YSBhbmQgY29tbWFuZCBwYWNrZXRzLiBOLkIuLCBldmVuCisJLy8gdGhvdWdoIHRoZXNlIGFyZSBpbiB0aGUgY2hhbm5lbCBzdHJ1Y3R1cmUsIHRoZSBjaGFubmVsIGlzIGFsc28gd3JpdHRlbgorCS8vIGhlcmUsIHRoZSBlYXNpZXIgdG8gc2VuZCBpdCB0byB0aGUgZmlmbyB3aGVuIHJlYWR5LiBIT1dFVkVSLCBpbmRpdmlkdWFsCisJLy8gcGFja2V0cyBoZXJlIGFyZSBOT1QgcGFkZGVkIHRvIGV2ZW4gbGVuZ3RoOiB0aGUgcm91dGluZXMgZm9yIHdyaXRpbmcKKwkvLyBibG9ja3MgdG8gdGhlIGZpZm8gd2lsbCBwYWQgdG8gZXZlbiBieXRlIGNvdW50cy4KKwkvLworCVVDSEFSCU9idWZbT0JVRl9TSVpFK01BWF9PQlVGX0JMT0NLKzRdOworCXZvbGF0aWxlCisJVVNIT1JUCU9idWZfc3R1ZmY7ICAgICAvLyBTdHVmZmluZyBpbmRleAorCXZvbGF0aWxlCisJVVNIT1JUCU9idWZfc3RyaXA7ICAgICAvLyBTdHJpcHBpbmcgaW5kZXgKKwlpbnQJT2J1Zl9jaGFyX2NvdW50OworCisJLy8gVGhlIG91dGdvaW5nIGJ5cGFzcy1jb21tYW5kIGJ1ZmZlci4gVW5saWtlIGVhcmxpZXIgbWFuaWZlc3RhdGlvbnMsIHRoZQorCS8vIGZsb3cgY29udHJvbCBwYWNrZXRzIGFyZSBzZW50IGRpcmVjdGx5IGZyb20gdGhlIHN0cnVjdHVyZXMuIEFzIGFib3ZlLCB0aGUKKwkvLyBjaGFubmVsIG51bWJlciBpcyBpbmNsdWRlZCBpbiB0aGUgcGFja2V0LCBidXQgdGhleSBhcmUgTk9UIHBhZGRlZCB0byBldmVuCisJLy8gc2l6ZS4KKwkvLworCVVDSEFSICAgIENidWZbQ0JVRl9TSVpFK01BWF9DQlVGX0JMT0NLKzJdOworCXZvbGF0aWxlCisJVVNIT1JUICAgQ2J1Zl9zdHVmZjsgICAgIC8vIFN0dWZmaW5nIGluZGV4CisJdm9sYXRpbGUKKwlVU0hPUlQgICBDYnVmX3N0cmlwOyAgICAgLy8gU3RyaXBwaW5nIGluZGV4CisKKwkvLyBUaGUgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgdGhlIExpbnV4IHR0eSBkcml2ZXIgUHV0Q2hhciBlbnRyeS4KKwkvLworCVVDSEFSICAgIFBidWZbTUFYX09CVUZfQkxPQ0sgLSBzaXplb2YgKGkyRGF0YUhlYWRlcildOworCXZvbGF0aWxlCisJVVNIT1JUICAgUGJ1Zl9zdHVmZjsgICAgIC8vIFN0dWZmaW5nIGluZGV4CisKKwkvLyBUaGUgc3RhdGUgb2YgaW5jb21pbmcgZGF0YS1zZXQgc2lnbmFscworCS8vCisJVVNIT1JUICAgZGF0YVNldEluOyAgICAgLy8gQml0LW1hcHBlZCBhY2NvcmRpbmcgdG8gYmVsb3cuIEFsc28gaW5kaWNhdGVzCisJCQkJCQkJLy8gd2hldGhlciBhIGJyZWFrIGhhcyBiZWVuIGRldGVjdGVkIHNpbmNlIGxhc3QKKwkJCQkJCQkvLyBpbnF1aXJ5LgorCisJLy8gVGhlIHN0YXRlIG9mIG91dGNvbWluZyBkYXRhLXNldCBzaWduYWxzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwhKQorCS8vCisJVVNIT1JUICAgZGF0YVNldE91dDsgICAgIC8vIEJpdC1tYXBwZWQgYWNjb3JkaW5nIHRvIGJlbG93LiAKKworCS8vIE1vc3QgcmVjZW50IGhvdC1rZXkgaWRlbnRpZmllciBkZXRlY3RlZAorCS8vCisJVVNIT1JUICAgaG90S2V5SW47ICAgICAgLy8gSG90IGtleSBhcyBzZW50IGJ5IHRoZSBib2FyZCwgSE9UX0NMRUFSIGluZGljYXRlcworCQkJCS8vIG5vIGhvdCBrZXkgZGV0ZWN0ZWQgc2luY2UgbGFzdCBleGFtaW5lZC4KKworCS8vIENvdW50ZXIgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGJvb2ttYXJrcworCS8vCisJc2hvcnQgICBib29rTWFya3M7CS8vIE51bWJlciBvZiBvdXRzdGFuZGluZyBib29rbWFyayByZXF1ZXN0cywgKCtpdmUKKwkJCQkJCS8vIHdoZW5ldmVyIGEgYm9va21hcmsgcmVxdWVzdCBpZiBxdWV1ZWQgdXAsIC1pdmUKKwkJCQkJCS8vIHdoZW5ldmVyIGEgYm9va21hcmsgaXMgcmVjZWl2ZWQpLgorCisJLy8gTWlzYyBvcHRpb25zCisJLy8KKwlVU0hPUlQgICBjaGFubmVsT3B0aW9uczsgICAvLyBTZWUgYmVsb3cKKworCS8vIFRvIHN0b3JlIHZhcmlvdXMgaW5jb21pbmcgc3BlY2lhbCBwYWNrZXRzCisJLy8KKwlkZWJ1Z1N0YXQgICBjaGFubmVsU3RhdHVzOworCWNudFN0YXQgICAgIGNoYW5uZWxSY291bnQ7CisJY250U3RhdCAgICAgY2hhbm5lbFRjb3VudDsKKwlmYWlsU3RhdCAgICBjaGFubmVsRmFpbDsKKworCS8vIFRvIHN0b3JlIHRoZSBsYXN0IHZhbHVlcyBmb3IgbGluZSBjaGFyYWN0ZXJpc3RpY3Mgd2Ugc2VudCB0byB0aGUgYm9hcmQuCisJLy8KKwlpbnQJc3BlZWQ7CisKKwlpbnQgZmx1c2hfZmxhZ3M7CisKKwl2b2lkICgqdHJhY2UpKHVuc2lnbmVkIHNob3J0LHVuc2lnbmVkIGNoYXIsdW5zaWduZWQgY2hhcix1bnNpZ25lZCBsb25nLC4uLik7CisKKwkvKgorCSAqIEtlcm5lbCBjb3VudGVycyBmb3IgdGhlIDQgaW5wdXQgaW50ZXJydXB0cyAKKwkgKi8KKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGljb3VudDsKKworCS8qCisJICoJVGFzayBxdWV1ZXMgZm9yIHByb2Nlc3NpbmcgaW5wdXQgcGFja2V0cyBmcm9tIHRoZSBib2FyZC4KKwkgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlX2lucHV0OworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfc3RhdHVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaGFuZ3VwOworCisJcndsb2NrX3QgSWJ1Zl9zcGlubG9jazsKKwlyd2xvY2tfdCBPYnVmX3NwaW5sb2NrOworCXJ3bG9ja190IENidWZfc3BpbmxvY2s7CisJcndsb2NrX3QgUGJ1Zl9zcGlubG9jazsKKworfSBpMkNoYW5TdHIsICppMkNoYW5TdHJQdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5pZmVzdHMgYW5kIGJpdC1tYXBzIGZvciBlbGVtZW50cyBpbiBpMkNoYW5TdHIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gZmx1c2ggZmxhZ3MKKy8vCisjZGVmaW5lIFNUQVJURkxfRkxBRyAxCisjZGVmaW5lIFNUT1BGTF9GTEFHICAyCisKKy8vIHZhbGlkaXR5CisvLworI2RlZmluZSBDSEFOTkVMX01BR0lDX0JJVFMgMHhmZjAwCisjZGVmaW5lIENIQU5ORUxfTUFHSUMgICAgICAweDUzMDAgICAvLyAodmFsaWRpdHkgJiBDSEFOTkVMX01BR0lDX0JJVFMpID09CisJCQkJCQkJCQkvLyBDSEFOTkVMX01BR0lDIC0tPiBzdHJ1Y3R1cmUgZ29vZAorCisjZGVmaW5lIENIQU5ORUxfU1VQUE9SVCAgICAweDAwMDEgICAvLyBJbmRpY2F0ZXMgY2hhbm5lbCBpcyBzdXBwb3J0ZWQsIGV4aXN0cywKKwkJCQkJCQkJCS8vIGFuZCBwYXNzZWQgUC5PLlMuVC4KKworLy8gY2hhbm5lbE5lZWRzCisvLworI2RlZmluZSBORUVEX0ZMT1cgICAgMSAgLy8gSW5kaWNhdGVzIGZsb3cgY29udHJvbCBoYXMgYmVlbiBxdWV1ZWQKKyNkZWZpbmUgTkVFRF9JTkxJTkUgIDIgIC8vIEluZGljYXRlcyBpbmxpbmUgY29tbWFuZHMgb3IgZGF0YSBxdWV1ZWQKKyNkZWZpbmUgTkVFRF9CWVBBU1MgIDQgIC8vIEluZGljYXRlcyBieXBhc3MgY29tbWFuZHMgcXVldWVkCisjZGVmaW5lIE5FRURfQ1JFRElUICA4ICAvLyBJbmRpY2F0ZXMgd291bGQgYmUgc2VuZGluZyBleGNlcHQgaGFzIG5vdCBzdWZmaWNpZW50CisJCQkJCQkvLyBjcmVkaXQuIFRoZSBkYXRhIGlzIHN0aWxsIGluIHRoZSBjaGFubmVsIHN0cnVjdHVyZSwKKwkJCQkJCS8vIGJ1dCB0aGUgY2hhbm5lbCBpcyBub3QgZW5xdWV1ZWQgaW4gdGhlIGJvYXJkCisJCQkJCQkvLyBzdHJ1Y3R1cmUgYWdhaW4gdW50aWwgdGhlcmUgaXMgYSBjcmVkaXQgcmVjZWl2ZWQgZnJvbQorCQkJCQkJLy8gdGhlIGJvYXJkLgorCisvLyBkYXRhU2V0SW4gKEFsc28gdGhlIGJpdHMgZm9yIGkyR2V0U3RhdHVzIHJldHVybiB2YWx1ZSkKKy8vCisjZGVmaW5lIEkyX0RDRCAxCisjZGVmaW5lIEkyX0NUUyAyCisjZGVmaW5lIEkyX0RTUiA0CisjZGVmaW5lIEkyX1JJICA4CisKKy8vIGRhdGFTZXRPdXQgKEFsc28gdGhlIGJpdHMgZm9yIGkyR2V0U3RhdHVzIHJldHVybiB2YWx1ZSkKKy8vCisjZGVmaW5lIEkyX0RUUiAxCisjZGVmaW5lIEkyX1JUUyAyCisKKy8vIGkyR2V0U3RhdHVzKCkgY2FuIG9wdGlvbmFsbHkgY2xlYXIgdGhlc2UgYml0cworLy8KKyNkZWZpbmUgSTJfQlJLICAgIDB4MTAgIC8vIEEgYnJlYWsgd2FzIGRldGVjdGVkCisjZGVmaW5lIEkyX1BBUiAgICAweDIwICAvLyBBIHBhcml0eSBlcnJvciB3YXMgcmVjZWl2ZWQgCisjZGVmaW5lIEkyX0ZSQSAgICAweDQwICAvLyBBIGZyYW1pbmcgZXJyb3Igd2FzIHJlY2VpdmVkCisjZGVmaW5lIEkyX09WUiAgICAweDgwICAvLyBBbiBvdmVycnVuIGVycm9yIHdhcyByZWNlaXZlZCAKKworLy8gaTJHZXRTdGF0dXMoKSBhdXRvbWF0aWNhbGx5IGNsZWFycyB0aGVzZSBiaXRzICovCisvLworI2RlZmluZSBJMl9ERENEICAgMHgxMDAgLy8gRENEIGNoYW5nZWQgZnJvbSBpdHMgIGZvcm1lciB2YWx1ZQorI2RlZmluZSBJMl9EQ1RTICAgMHgyMDAgLy8gQ1RTIGNoYW5nZWQgZnJvbSBpdHMgZm9ybWVyIHZhbHVlIAorI2RlZmluZSBJMl9ERFNSICAgMHg0MDAgLy8gRFNSIGNoYW5nZWQgZnJvbSBpdHMgZm9ybWVyIHZhbHVlIAorI2RlZmluZSBJMl9EUkkgICAgMHg4MDAgLy8gUkkgY2hhbmdlZCBmcm9tIGl0cyBmb3JtZXIgdmFsdWUgCisKKy8vIGhvdEtleUluCisvLworI2RlZmluZSBIT1RfQ0xFQVIgMHgxMzIyICAgLy8gSW5kaWNhdGVzIHRoYXQgbm8gaG90LWtleSBoYXMgYmVlbiBkZXRlY3RlZAorCisvLyBjaGFubmVsT3B0aW9ucworLy8KKyNkZWZpbmUgQ09fTkJMT0NLX1dSSVRFIDEgIAkvLyBXcml0ZXMgZG9uJ3QgYmxvY2sgd2FpdGluZyBmb3IgYnVmZmVyLiAoRGVmYXVsdAorCQkJCQkJCS8vIGlzLCB0aGV5IGRvIHdhaXQuKQorCisvLyBmY21vZGVzCisvLworI2RlZmluZSBJMl9PVVRGTE9XX0NUUyAgMHgwMDAxCisjZGVmaW5lIEkyX0lORkxPV19SVFMgICAweDAwMDIKKyNkZWZpbmUgSTJfSU5GTE9XX0RTUiAgIDB4MDAwNAorI2RlZmluZSBJMl9JTkZMT1dfRFRSICAgMHgwMDA4CisjZGVmaW5lIEkyX09VVEZMT1dfRFNSICAweDAwMTAKKyNkZWZpbmUgSTJfT1VURkxPV19EVFIgIDB4MDAyMAorI2RlZmluZSBJMl9PVVRGTE9XX1hPTiAgMHgwMDQwCisjZGVmaW5lIEkyX09VVEZMT1dfWEFOWSAweDAwODAKKyNkZWZpbmUgSTJfSU5GTE9XX1hPTiAgIDB4MDEwMAorCisjZGVmaW5lIEkyX0NSVFNDVFMgICAgICAoSTJfT1VURkxPV19DVFN8STJfSU5GTE9XX1JUUykKKyNkZWZpbmUgSTJfSVhBTllfTU9ERSAgIChJMl9PVVRGTE9XX1hPTnxJMl9PVVRGTE9XX1hBTlkpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm9zIHVzZWQgZnJvbSB1c2VyIGxldmVsIGxpa2UgZnVuY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTWFjcm9zIHRvIHNldCBhbmQgY2xlYXIgY2hhbm5lbCBvcHRpb25zCisvLworI2RlZmluZSBpMlNldE9wdGlvbihwQ2gsIG9wdGlvbikgcENoLT5jaGFubmVsT3B0aW9ucyB8PSBvcHRpb24KKyNkZWZpbmUgaTJDbHJPcHRpb24ocENoLCBvcHRpb24pIHBDaC0+Y2hhbm5lbE9wdGlvbnMgJj0gfm9wdGlvbgorCisvLyBNYWNybyB0byBzZXQgZmF0YWwtZXJyb3IgdHJhcAorLy8KKyNkZWZpbmUgaTJTZXRGYXRhbFRyYXAocEIsIHJvdXRpbmUpIHBCLT5pMmVGYXRhbFRyYXAgPSByb3V0aW5lCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY2xhcmF0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3IgaTJsaWIuYworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3N0YXRpYyBpbnQgIGkySW5pdENoYW5uZWxzKGkyZUJvcmRTdHJQdHIsIGludCwgaTJDaGFuU3RyUHRyKTsKK3N0YXRpYyBpbnQgIGkyUXVldWVDb21tYW5kcyhpbnQsIGkyQ2hhblN0clB0ciwgaW50LCBpbnQsIGNtZFN5bnRheFB0ciwuLi4pOworc3RhdGljIGludCAgaTJHZXRTdGF0dXMoaTJDaGFuU3RyUHRyLCBpbnQpOworc3RhdGljIGludCAgaTJJbnB1dChpMkNoYW5TdHJQdHIpOworc3RhdGljIGludCAgaTJJbnB1dEZsdXNoKGkyQ2hhblN0clB0cik7CitzdGF0aWMgaW50ICBpMk91dHB1dChpMkNoYW5TdHJQdHIsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworc3RhdGljIGludCAgaTJPdXRwdXRGcmVlKGkyQ2hhblN0clB0cik7CitzdGF0aWMgaW50ICBpMlNlcnZpY2VCb2FyZChpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGkyRHJhaW5PdXRwdXQoaTJDaGFuU3RyUHRyLCBpbnQpOworCisjaWZkZWYgSVAyREVCVUdfVFJBQ0UKK3ZvaWQgaXAydHJhY2UodW5zaWduZWQgc2hvcnQsdW5zaWduZWQgY2hhcix1bnNpZ25lZCBjaGFyLHVuc2lnbmVkIGxvbmcsLi4uKTsKKyNlbHNlCisjZGVmaW5lIGlwMnRyYWNlKGEsYixjLGQuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKy8vIEFyZ3VtZW50IHRvIGkyUXVldWVDb21tYW5kcworLy8KKyNkZWZpbmUgQ19JTl9MSU5FIDEKKyNkZWZpbmUgQ19CWVBBU1MgIDAKKworI2VuZGlmICAgLy8gSTJMSUJfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMm9zLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY5YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMm9zLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEZWZpbmVzLCBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZXMgd2hpY2ggYXJlIGhlYXZpbHkgZGVwZW5kZW50CisqICAgICAgICAgICAgICAgIG9uIE8vUywgaG9zdCwgY29tcGlsZXIsIGV0Yy4gVGhpcyBmaWxlIGlzIHRhaWxvcmVkIGZvcjoKKyogICAgICAgICAgICAgICAgIExpbnV4IHYyLjAuMCBhbmQgbGF0ZXIKKyogICAgICAgICAgICAgICAgIEdudSBnY2MgYzIuNy4yCisqICAgICAgICAgICAgICAgICA4MHg4NiBhcmNoaXRlY3R1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSTJPU19IICAgIC8qIFRvIHByZXZlbnQgbXVsdGlwbGUgaW5jbHVkZXMgKi8KKyNkZWZpbmUgSTJPU19IIDEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXF1aXJlZCBJbmNsdWRlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJpcDJ0eXBlcy5oIgorI2luY2x1ZGUgPGFzbS9pby5oPiAgLyogRm9yIGluYiwgZXRjICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbmVzIGZvciBJL08gaW5zdHJ1Y3Rpb25zOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTkIocG9ydCkgICAgICAgICAgICAgICAgaW5iKHBvcnQpCisjZGVmaW5lIE9VVEIocG9ydCx2YWx1ZSkgICAgICAgICBvdXRiKCh2YWx1ZSksKHBvcnQpKQorI2RlZmluZSBJTlcocG9ydCkgICAgICAgICAgICAgICAgaW53KHBvcnQpCisjZGVmaW5lIE9VVFcocG9ydCx2YWx1ZSkgICAgICAgICBvdXR3KCh2YWx1ZSksKHBvcnQpKQorI2RlZmluZSBPVVRTVyhwb3J0LGFkZHIsY291bnQpICAgb3V0c3coKHBvcnQpLChhZGRyKSwoKChjb3VudCkrMSkvMikpCisjZGVmaW5lIE9VVFNCKHBvcnQsYWRkcixjb3VudCkgICBvdXRzYigocG9ydCksKGFkZHIpLCgoKGNvdW50KSsxKSkmLTIpCisjZGVmaW5lIElOU1cocG9ydCxhZGRyLGNvdW50KSAgICBpbnN3KChwb3J0KSwoYWRkciksKCgoY291bnQpKzEpLzIpKQorI2RlZmluZSBJTlNCKHBvcnQsYWRkcixjb3VudCkgICAgaW5zYigocG9ydCksKGFkZHIpLCgoKGNvdW50KSsxKSkmLTIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVycnVwdCBjb250cm9sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTE9DS19JTklUKGEpCXJ3bG9ja19pbml0KGEpCisKKyNkZWZpbmUgU0FWRV9BTkRfRElTQUJMRV9JTlRTKGEsYikgeyBcCisJLyogcHJpbnRrKCJnZXRfbG9jazogMHgleCwlNGQsJXNcbiIsKGludClhLF9fTElORV9fLF9fRklMRV9fKTsqLyBcCisJc3Bpbl9sb2NrX2lycXNhdmUoYSxiKTsgXAorfQorCisjZGVmaW5lIFJFU1RPUkVfSU5UUyhhLGIpIHsgXAorCS8qIHByaW50aygicmVsX2xvY2s6IDB4JXgsJTRkLCVzXG4iLChpbnQpYSxfX0xJTkVfXyxfX0ZJTEVfXyk7Ki8gXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYSxiKTsgXAorfQorCisjZGVmaW5lIFJFQURfTE9DS19JUlFTQVZFKGEsYikgeyBcCisJLyogcHJpbnRrKCJnZXRfcmVhZF9sb2NrOiAweCV4LCU0ZCwlc1xuIiwoaW50KWEsX19MSU5FX18sX19GSUxFX18pOyovIFwKKwlyZWFkX2xvY2tfaXJxc2F2ZShhLGIpOyBcCit9CisKKyNkZWZpbmUgUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRShhLGIpIHsgXAorCS8qIHByaW50aygicmVsX3JlYWRfbG9jazogMHgleCwlNGQsJXNcbiIsKGludClhLF9fTElORV9fLF9fRklMRV9fKTsqLyBcCisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZShhLGIpOyBcCit9CisKKyNkZWZpbmUgV1JJVEVfTE9DS19JUlFTQVZFKGEsYikgeyBcCisJLyogcHJpbnRrKCJnZXRfd3JpdGVfbG9jazogMHgleCwlNGQsJXNcbiIsKGludClhLF9fTElORV9fLF9fRklMRV9fKTsqLyBcCisJd3JpdGVfbG9ja19pcnFzYXZlKGEsYik7IFwKK30KKworI2RlZmluZSBXUklURV9VTkxPQ0tfSVJRUkVTVE9SRShhLGIpIHsgXAorCS8qIHByaW50aygicmVsX3dyaXRlX2xvY2s6IDB4JXgsJTRkLCVzXG4iLChpbnQpYSxfX0xJTkVfXyxfX0ZJTEVfXyk7Ki8gXAorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKGEsYik7IFwKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGFyZHdhcmUtZGVsYXkgbG9vcAorLy8KKy8vIFByb2JhYmx5IHVzZWQgaW4gb25seSBvbmUgcGxhY2UgKHNlZSBpMmVsbGlzLmMpIGJ1dCB0aGlzIGhlbHBzIGtlZXAgdGhpbmdzCisvLyB0b2dldGhlci4gTm90ZSB3ZSBoYXZlIHVud291bmQgdGhlIElOIGluc3RydWN0aW9ucy4gT24gbWFjaGluZXMgd2l0aCBhCisvLyByZWFzb25hYmxlIGNhY2hlLCB0aGUgZWlnaHQgaW5zdHJ1Y3Rpb25zICgxIGJ5dGUgZWFjaCkgc2hvdWxkIGZpdCBpbiBjYWNoZQorLy8gbmljZWx5LCBhbmQgb24gdW4tY2FjaGVkIG1hY2hpbmVzLCB0aGUgY29kZS1mZXRjaCB3b3VsZCB0ZW5kIG5vdCB0byBkb21pbmF0ZS4KKy8vIE5vdGUgdGhhdCBjeCBpcyBzaGlmdGVkIHNvIHRoYXQgImNvdW50IiBzdGlsbCByZWZsZWN0cyB0aGUgdG90YWwgbnVtYmVyIG9mCisvLyBpdGVyYXRpb25zIGFzc3VtaW5nIG5vIHVud2luZGluZy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2RlZmluZSAgREVMQVkxTVMocG9ydCxjb3VudCxsYWJlbCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvcyB0byBzd2l0Y2ggdG8gYSBuZXcgc3RhY2ssIHNhdmluZyBzdGFjayBwb2ludGVycywgYW5kIHRvIHJlc3RvcmUgdGhlCisvLyBvbGQgc3RhY2sgKFVzZWQsIGZvciBleGFtcGxlLCBpbiBpMmxpYi5jKSAiaGVhcCIgaXMgdGhlIGFkZHJlc3Mgb2Ygc29tZQorLy8gYnVmZmVyIHdoaWNoIHdpbGwgYmVjb21lIHRoZSBuZXcgc3RhY2sgKHdvcmtpbmcgZG93biBmcm9tIGhpZ2hlc3QgYWRkcmVzcykuCisvLyBUaGUgdHdvIHdvcmRzIGF0IHRoZSB0d28gbG93ZXN0IGFkZHJlc3NlcyBpbiB0aGlzIHN0YWNrIGFyZSBmb3Igc3RvcmluZyB0aGUKKy8vIFNTIGFuZCBTUC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2RlZmluZSAgVE9fTkVXX1NUQUNLKGhlYXAsc2l6ZSkKKy8vI2RlZmluZSAgVE9fT0xEX1NUQUNLKGhlYXApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNyb3MgdG8gc2F2ZSB0aGUgb3JpZ2luYWwgSVJRIHZlY3RvcnMgYW5kIG1hc2tzLCBhbmQgdG8gcGF0Y2ggaW4gbmV3IG9uZXMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyNkZWZpbmUgIFNBVkVfSVJRX01BU0tTKGRlc3QpCisvLyNkZWZpbmUgIFdSSVRFX0lSUV9NQVNLUyhzcmMpCisvLyNkZWZpbmUgIFNBVkVfSVJRX1ZFQ1RPUih2YWx1ZSxkZXN0KQorLy8jZGVmaW5lICBXUklURV9JUlFfVkVDVE9SKHZhbHVlLHNyYykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvIHRvIGNvcHkgZGF0YSBmcm9tIG9uZSBmYXIgcG9pbnRlciB0byBhbm90aGVyLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSAgSTJfTU9WRV9EQVRBKGZwU291cmNlLGZwRGVzdCxjb3VudCkgbWVtbW92ZShmcERlc3QsZnBTb3VyY2UsY291bnQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm9zIHRvIGlzc3VlIGVvaSdzIHRvIGhvc3QgaW50ZXJydXB0IGNvbnRyb2wgKElCTSBBVCA4MjU5LXN0eWxlKS4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2RlZmluZSBNQVNURVJfRU9JCisvLyNkZWZpbmUgU0xBVkVfRU9JCisKKyNlbmRpZiAgIC8qIEkyT1NfSCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJwYWNrLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kycGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Yjg3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kycGFjay5oCkBAIC0wLDAgKzEsMzY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IElJIGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogRGVmaW5pdGlvbnMgb2YgdGhlIHBhY2tldHMgdXNlZCB0byB0cmFuc2ZlciBkYXRhIGFuZCBjb21tYW5kcworKiAgICAgICAgICAgICAgICBIb3N0IDwtLT4gQm9hcmQuIEluZm9ybWF0aW9uIHByb3ZpZGVkIGhlcmUgaXMgb25seSBhcHBsaWNhYmxlCisqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YW5kYXJkIGxvYWR3YXJlIGlzIGFjdGl2ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEkyUEFDS19ICisjZGVmaW5lIEkyUEFDS19IICAxCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMTAgT2N0b2JlciAxOTkxICAgTUFHIEZpcnN0IGRyYWZ0CisvLyAyNCBGZWJydWFyeSAxOTkyICBNQUcgQWRkaXRpb25zIGZvciAxLjQueCBsb2Fkd2FyZQorLy8gMTEgTWFyY2ggMTk5MiAgICAgTUFHIE5ldyBzdGF0dXMgcGFja2V0cworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhY2tldCBGb3JtYXRzOgorLy8KKy8vIEluZm9ybWF0aW9uIHBhc3NlcyBiZXR3ZWVuIHRoZSBob3N0IGFuZCBib2FyZCB0aHJvdWdoIHRoZSBGSUZPIGluIHBhY2tldHMuCisvLyBUaGVzZSBoYXZlIGhlYWRlcnMgd2hpY2ggaW5kaWNhdGUgdGhlIHR5cGUgb2YgcGFja2V0LiBCZWNhdXNlIHRoZSBmaWZvIGRhdGEKKy8vIHBhdGggbWF5IGJlIDE2LWJpdHMgd2lkZSwgdGhlIHByb3RvY29sIGlzIGNvbnN0cmFpbmVkIHN1Y2ggdGhhdCBlYWNoIHBhY2tldAorLy8gaXMgYWx3YXlzIHBhZGRlZCB0byBhbiBldmVuIGJ5dGUgY291bnQuIChUaGUgbG93ZXItbGV2ZWwgaW50ZXJmYWNlIHJvdXRpbmVzCisvLyAtLSBpMmVsbGlzLmMgLS0gYXJlIGRlc2lnbmVkIHRvIGRvIHRoaXMpLgorLy8KKy8vIFRoZSBzZW5kZXIgKGJlIGl0IGhvc3Qgb3IgYm9hcmQpIG11c3QgcGxhY2Ugc29tZSBudW1iZXIgb2YgY29tcGxldGUgcGFja2V0cworLy8gaW4gdGhlIGZpZm8sIHRoZW4gcGxhY2UgYSBtZXNzYWdlIGluIHRoZSBtYWlsYm94IHRoYXQgcGFja2V0cyBhcmUgYXZhaWxhYmxlLgorLy8gUGxhY2luZyBzdWNoIGEgbWVzc2FnZSBpbnRlcnJ1cHRzIHRoZSAicmVjZWl2ZXIiIChiZSBpdCBib2FyZCBvciBob3N0KSwgd2hvCisvLyByZWFkcyB0aGUgbWFpbGJveCBtZXNzYWdlIGFuZCBkZXRlcm1pbmVzIHRoYXQgdGhlcmUgYXJlIGluY29taW5nIHBhY2tldHMKKy8vIHJlYWR5LiBTaW5jZSB0aGVyZSBhcmUgbm8gcGFydGlhbCBwYWNrZXRzLCBhbmQgdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBpcworLy8gZ2l2ZW4gaW4gdGhlIGhlYWRlciwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcGFja2V0IGNhbiBiZSByZWFkIHdpdGhvdXQgY2hlY2tpbmcKKy8vIGZvciBGSUZPIGVtcHR5IGNvbmRpdGlvbi4gVGhlIHByb2Nlc3MgaXMgcmVwZWF0ZWQsIHBhY2tldCBieSBwYWNrZXQsIHVudGlsCisvLyB0aGUgaW5jb21pbmcgRklGTyBpcyBlbXB0eS4gVGhlbiB0aGUgcmVjZWl2ZXIgdXNlcyB0aGUgb3V0Ym91bmQgbWFpbGJveCB0bworLy8gc2lnbmFsIHRoZSBib2FyZCB0aGF0IGl0IGhhcyByZWFkIHRoZSBkYXRhLiBPbmx5IHRoZW4gY2FuIHRoZSBzZW5kZXIgcGxhY2UKKy8vIGFkZGl0aW9uYWwgZGF0YSBpbiB0aGUgZmlmby4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb24gb2YgUGFja2V0IEhlYWRlciBBcmVhCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENhdXRpb246IHRoZXNlIG9ubHkgZGVmaW5lIGhlYWRlciBhcmVhcy4gSW4gYWN0dWFsIHVzZSB0aGUgZGF0YSBydW5zIG9mZgorLy8gYmV5b25kIHRoZSBlbmQgb2YgdGhlc2Ugc3RydWN0dXJlcy4KKy8vCisvLyBTaW5jZSB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBiYXNlZCBvbiBzZXF1ZW5jZXMgb2YgYnl0ZXMgd2hpY2ggZ28gdG8gdGhlIGJvYXJkLAorLy8gdGhlcmUgY2Fubm90IGJlIEFOWSBwYWRkaW5nIGJldHdlZW4gdGhlIGVsZW1lbnRzLgorI3ByYWdtYSBwYWNrKDEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gREFUQSBQQUNLRVRTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX2kyRGF0YUhlYWRlcgoreworCXVuc2lnbmVkIGNoYXIgaTJzQ2hhbm5lbDsgIC8qIFRoZSBjaGFubmVsIG51bWJlcjogMC0yNTUgKi8KKworCS8vIC0tIEJpdGZpZWxkcyBhcmUgYWxsb2NhdGVkIExTQiBmaXJzdCAtLQorCisJLy8gRm9yIGluY29taW5nIGRhdGEsIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gb3JkaW5hcnkgcGFja2V0IG9yIGEKKwkvLyBzcGVjaWFsIG9uZSAoZS5nLiwgaG90IGtleSBoaXQpLgorCXVuc2lnbmVkIGkyc0lkIDogMiBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisJLy8gRm9yIHRhZ2dpbmcgZGF0YSBwYWNrZXRzLiBUaGVyZSBhcmUgZmx1c2ggY29tbWFuZHMgd2hpY2ggZmx1c2ggb25seSBkYXRhCisJLy8gcGFja2V0cyBiZWFyaW5nIGEgcGFydGljdWxhciB0YWcuICh1c2VkIGluIGltcGxlbWVudGluZyBJbnRlbGxpVmlldyBhbmQKKwkvLyBJbnRlbGxpUHJpbnQpLiBUSEUgVEFHIFZBTFVFIDB4ZiBpcyBSRVNFUlZFRCBhbmQgbXVzdCBub3QgYmUgdXNlZCAoaXQgaGFzCisJLy8gbWVhbmluZyBpbnRlcm5hbGx5IHRvIHRoZSBsb2Fkd2FyZSkuCisJdW5zaWduZWQgaTJzVGFnIDogNDsKKworCS8vIFRoZXNlIHR3byBiaXRzIGRldGVybWluZSB0aGUgdHlwZSBvZiBwYWNrZXQgc2VudC9yZWNlaXZlZC4KKwl1bnNpZ25lZCBpMnNUeXBlIDogMjsKKworCS8vIFRoZSBjb3VudCBvZiBkYXRhIHRvIGZvbGxvdzogZG9lcyBub3QgaW5jbHVkZSB0aGUgcG9zc2libGUgYWRkaXRpb25hbAorCS8vIHBhZGRpbmcgYnl0ZS4gTUFYSU1VTSBDT1VOVDogNDA5NC4gVGhlIHRvcCBmb3VyIGJpdHMgbXVzdCBiZSAwLgorCXVuc2lnbmVkIHNob3J0IGkyc0NvdW50OworCit9IGkyRGF0YUhlYWRlciwgKmkyRGF0YUhlYWRlclB0cjsKKworLy8gU3RydWN0dXJlIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBkYXRhLCBwcm9wZXIuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTk9OLURBVEEgUEFDS0VUUworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9pMkNtZEhlYWRlcgoreworCXVuc2lnbmVkIGNoYXIgaTJzQ2hhbm5lbDsJLy8gVGhlIGNoYW5uZWwgbnVtYmVyOiAwLTI1NSAoRXhjZXB0IHdoZXJlIG5vdGVkCisJCQkJCQkJCS8vIC0gc2VlIGJlbG93CisKKwkvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgY29tbWFuZHMsIHN0YXR1cyBvciB3aGF0ZXZlciB0byBmb2xsb3cKKwl1bnNpZ25lZCBpMnNDb3VudCA6IDY7CisKKwkvLyBUaGVzZSB0d28gYml0cyBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcGFja2V0IHNlbnQvcmVjZWl2ZWQuCisJdW5zaWduZWQgaTJzVHlwZSA6IDI7CisKK30gaTJDbWRIZWFkZXIsICppMkNtZEhlYWRlclB0cjsKKworLy8gU3RydWN0dXJlIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBhcHBsaWNhYmxlIGRhdGEuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGbG93IENvbnRyb2wgUGFja2V0cyAoT3V0Ym91bmQpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBPbmUgdHlwZSBvZiBvdXRib3VuZCBjb21tYW5kIHBhY2tldCBpcyBzbyBpbXBvcnRhbnQgdGhhdCB0aGUgZW50aXJlIHN0cnVjdHVyZQorLy8gaXMgZXhwbGljaXRseSBkZWZpbmVkIGhlcmUuIFRoYXQgaXMgdGhlIGZsb3ctY29udHJvbCBwYWNrZXQuIFRoaXMgaXMgbmV2ZXIKKy8vIHNlbnQgYnkgdXNlci1sZXZlbCBjb2RlIChhcyB3b3VsZCBiZSB0aGUgY29tbWFuZHMgdG8gcmFpc2UvbG93ZXIgRFRSLCBmb3IKKy8vIGV4YW1wbGUpLiBUaGVzZSBhcmUgb25seSBzZW50IGJ5IHRoZSBsaWJyYXJ5IHJvdXRpbmVzIGluIHJlc3BvbnNlIHRvIHJlYWRpbmcKKy8vIGluY29taW5nIGRhdGEgaW50byB0aGUgYnVmZmVycy4KKy8vCisvLyBUaGUgcGFyYW1ldGVycyBpbnNpZGUgdGhlIGNvbW1hbmQgYmxvY2sgYXJlIG1haW50YWluZWQgaW4gcGxhY2UsIHRoZW4gdGhlCisvLyBibG9jayBpcyBzZW50IGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLgorCit0eXBlZGVmIHN0cnVjdCBfZmxvd0luCit7CisJaTJDbWRIZWFkZXIgICAgaGQ7ICAgICAgLy8gQ2hhbm5lbCAjLCBjb3VudCwgdHlwZSAoc2VlIGFib3ZlKQorCXVuc2lnbmVkIGNoYXIgIGZjbWQ7ICAgIC8vIFRoZSBmbG93IGNvbnRyb2wgY29tbWFuZCAoMzcpCisJdW5zaWduZWQgc2hvcnQgYXNvZjsgICAgLy8gQXMgb2YgYnl0ZSBudW1iZXIgImFzb2YiIChMU0IgZmlyc3QhKSBJIGhhdmUgcm9vbQorCQkJCQkJCS8vIGZvciAicm9vbSIgYnl0ZXMKKwl1bnNpZ25lZCBzaG9ydCByb29tOworfSBmbG93SW4sICpmbG93SW5QdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gKEluY29taW5nKSBTdGF0dXMgUGFja2V0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEluY29taW5nIHBhY2tldHMgd2hpY2ggYXJlIG5vbi1kYXRhIHBhY2tldHMgYXJlIHN0YXR1cyBwYWNrZXRzLiBJbiB0aGlzIGNhc2UsCisvLyB0aGUgY2hhbm5lbCBudW1iZXIgaW4gdGhlIGhlYWRlciBpcyB1bmltcG9ydGFudC4gV2hhdCBmb2xsb3dzIGFyZSBvbmUgb3IgbW9yZQorLy8gc3ViLXBhY2tldHMsIHRoZSBmaXJzdCB3b3JkIG9mIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBjaGFubmVsIChmaXJzdCBvciBsb3cKKy8vIGJ5dGUpIGFuZCB0aGUgc3RhdHVzIGluZGljYXRvciAoc2Vjb25kIG9yIGhpZ2ggYnl0ZSksIGZvbGxvd2VkIGJ5IHBvc3NpYmx5CisvLyBtb3JlIGRhdGEuCisKKyNkZWZpbmUgU1RBVF9DVFNfVVAgICAgIDAgIC8qIENUUyByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9DVFNfRE4gICAgIDEgIC8qIENUUyBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EQ0RfVVAgICAgIDIgIC8qIERDRCByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EQ0RfRE4gICAgIDMgIC8qIERDRCBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EU1JfVVAgICAgIDQgIC8qIERTUiByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EU1JfRE4gICAgIDUgIC8qIERTUiBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9SSV9VUCAgICAgIDYgIC8qIFJJICByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9SSV9ETiAgICAgIDcgIC8qIFJJICBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9CUktfREVUICAgIDggIC8qIEJSSyBkZXRlY3QgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9GTE9XICAgICAgIDkgIC8qIEZsb3cgY29udHJvbCgtLSBtb3JlOiBzZWUgYmVsb3cgKi8KKyNkZWZpbmUgU1RBVF9CTUFSSyAgICAgIDEwIC8qIEJvb2ttYXJrICAgIChubyBvdGhlciBieXRlcykKKwkJCQkJCQkqIEJvb2ttYXJrIGlzIHNlbnQgYXMgYSByZXNwb25zZSB0bworCQkJCQkJCSogYSBjb21tYW5kIDYwOiByZXF1ZXN0IGZvciBib29rbWFyaworCQkJCQkJCSovCisjZGVmaW5lIFNUQVRfU1RBVFVTICAgICAxMSAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfVFhDTlQgICAgICAxMiAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfUlhDTlQgICAgICAxMyAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfQk9YSURTICAgICAxNCAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfSFdGQUlMICAgICAxNSAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisKKyNkZWZpbmUgU1RBVF9NT0RfRVJST1IgIDB4YzAKKyNkZWZpbmUgU1RBVF9NT0RFTSAgICAgIDB4YzAvKiBJZiBzdGF0dXMgJiBTVEFUX01PRF9FUlJPUjoKKwkJCQkJCQkgKiA9PSBTVEFUX01PREVNLCB0aGVuIHRoaXMgaXMgYSBtb2RlbQorCQkJCQkJCSAqIHN0YXR1cyBwYWNrZXQsIGdpdmVuIGluIHJlc3BvbnNlIHRvIGEKKwkJCQkJCQkgKiBDTURfRFNTX05PVyBjb21tYW5kLgorCQkJCQkJCSAqIFRoZSBsb3cgbmliYmxlIGhhcyBlYWNoIGRhdGEgc2lnbmFsOgorCQkJCQkJCSAqLworI2RlZmluZSBTVEFUX01PRF9EQ0QgICAgMHg4CisjZGVmaW5lIFNUQVRfTU9EX1JJICAgICAweDQKKyNkZWZpbmUgU1RBVF9NT0RfRFNSICAgIDB4MgorI2RlZmluZSBTVEFUX01PRF9DVFMgICAgMHgxCisKKyNkZWZpbmUgU1RBVF9FUlJPUiAgICAgIDB4ODAvKiBJZiBzdGF0dXMgJiBTVEFUX01PRF9FUlJPUgorCQkJCQkJCSAqID09IFNUQVRfRVJST1IsIHRoZW4KKwkJCQkJCQkgKiBzb3J0IG9mIGVycm9yIG9uIHRoZSBjaGFubmVsLgorCQkJCQkJCSAqIFRoZSByZW1haW5pbmcgc2V2ZW4gYml0cyBpbmRpY2F0ZQorCQkJCQkJCSAqIHdoYXQgc29ydCBvZiBlcnJvciBpdCBpcy4KKwkJCQkJCQkgKi8KKy8qIFRoZSBsb3cgdGhyZWUgYml0cyBpbmRpY2F0ZSBwYXJpdHksIGZyYW1pbmcsIG9yIG92ZXJydW4gZXJyb3JzICovCisKKyNkZWZpbmUgU1RBVF9FX1BBUklUWSAgIDQgICAgIC8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBTVEFUX0VfRlJBTUlORyAgMiAgICAgLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTVEFUX0VfT1ZFUlJVTiAgMSAgICAgLyogKHV4YXJ0KSBvdmVycnVuIGVycm9yICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTVEFUX0ZMT1cgcGFja2V0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX2Zsb3dTdGF0Cit7CisJdW5zaWduZWQgc2hvcnQgYXNvZjsKKwl1bnNpZ25lZCBzaG9ydCByb29tOworfWZsb3dTdGF0LCAqZmxvd1N0YXRQdHI7CisKKy8vIGZsb3dTdGF0IHBhY2tldHMgYXJlIHJlY2VpdmVkIGZyb20gdGhlIGJvYXJkIHRvIHJlZ3VsYXRlIHRoZSBmbG93IG9mIG91dGdvaW5nCisvLyBkYXRhLiBBIGxvY2FsIGNvcHkgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgYWxzbyBrZXB0IHRvIHRyYWNrIHRoZSBhbW91bnQgb2YKKy8vIGNyZWRpdHMgdXNlZCBhbmQgY3JlZGl0cyByZW1haW5pbmcuICJyb29tIiBpcyB0aGUgYW1vdW50IG9mIHNwYWNlIGluIHRoZQorLy8gYm9hcmQncyBidWZmZXJzLCAiYXMgb2YiIGhhdmluZyByZWNlaXZlZCBhIGNlcnRhaW4gYnl0ZSBudW1iZXIuIFdoZW4gc2VuZGluZworLy8gZGF0YSB0byB0aGUgZmlmbywgeW91IG11c3QgY2FsY3VsYXRlIGhvdyBtdWNoIGJ1ZmZlciBzcGFjZSB5b3VyIHBhY2tldCB3aWxsCisvLyB1c2UuICBBZGQgdGhpcyB0byB0aGUgY3VycmVudCAiYXNvZiIgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIGN1cnJlbnQgInJvb20iLgorLy8KKy8vIFRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIGJvYXJkJ3MgYnVmZmVyIGlzIGdpdmVuIGJ5IENSRURJVF9VU0FHRSwgd2hlcmUgc2l6ZQorLy8gaXMgdGhlIHVuLXJvdW5kZWQgY291bnQgb2YgZWl0aGVyIGRhdGEgY2hhcmFjdGVycyBvciBjb21tYW5kIGNoYXJhY3RlcnMuCisvLyAoV2hpY2ggaXMgdG8gc2F5LCB0aGUgY291bnQgcm91bmRlZCB1cCwgcGx1cyB0d28pLgorCisjZGVmaW5lIENSRURJVF9VU0FHRShzaXplKSAoKChzaXplKSArIDMpICYgfjEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTVEFUX1NUQVRVUyBwYWNrZXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmICBzdHJ1Y3QgICBfZGVidWdTdGF0Cit7CisJdW5zaWduZWQgY2hhciBkX2Njc3I7CisJdW5zaWduZWQgY2hhciBkX3R4aW5oOworCXVuc2lnbmVkIGNoYXIgZF9zdGF0MTsKKwl1bnNpZ25lZCBjaGFyIGRfc3RhdDI7Cit9IGRlYnVnU3RhdCwgKmRlYnVnU3RhdFB0cjsKKworLy8gZGVidWdTdGF0IHBhY2tldHMgYXJlIHNlbnQgdG8gdGhlIGhvc3QgaW4gcmVzcG9uc2UgdG8gYSBDTURfR0VUX1NUQVRVUworLy8gY29tbWFuZC4gIEVhY2ggYnl0ZSBpcyBiaXQtbWFwcGVkIGFzIGRlc2NyaWJlZCBiZWxvdzoKKworI2RlZmluZSBEX0NDU1JfWE9OICAgICAgMiAgICAgLyogSGFzIHJlY2VpdmVkIFhPTiwgcmVhZHkgdG8gdHJhbnNtaXQgKi8KKyNkZWZpbmUgRF9DQ1NSX1hPRkYgICAgIDQgICAgIC8qIEhhcyByZWNlaXZlZCBYT0ZGLCBub3QgdHJhbnNtaXR0aW5nICovCisjZGVmaW5lIERfQ0NTUl9UWEVOQUIgICA4ICAgICAvKiBUcmFuc21pdHRlciBpcyBlbmFibGVkICovCisjZGVmaW5lIERfQ0NTUl9SWEVOQUIgICAweDgwICAvKiBSZWNlaXZlciBpcyBlbmFibGVkICovCisKKyNkZWZpbmUgRF9UWElOSF9CUkVBSyAgIDEgICAgIC8qIFdlIGFyZSBzZW5kaW5nIGEgYnJlYWsgKi8KKyNkZWZpbmUgRF9UWElOSF9FTVBUWSAgIDIgICAgIC8qIE5vIGRhdGEgdG8gc2VuZCAqLworI2RlZmluZSBEX1RYSU5IX1NVU1AgICAgNCAgICAgLyogT3V0cHV0IHN1c3BlbmRlZCB2aWEgY29tbWFuZCA1NyAqLworI2RlZmluZSBEX1RYSU5IX0NNRCAgICAgOCAgICAgLyogV2UgYXJlIHByb2Nlc3NpbmcgYW4gaW4tbGluZSBjb21tYW5kICovCisjZGVmaW5lIERfVFhJTkhfTENEICAgICAweDEwICAvKiBMQ0QgZGlhZ25vc3RpY3MgYXJlIHJ1bm5pbmcgKi8KKyNkZWZpbmUgRF9UWElOSF9QQVVTRSAgIDB4MjAgIC8qIFdlIGFyZSBwcm9jZXNzaW5nIGEgUEFVU0UgY29tbWFuZCAqLworI2RlZmluZSBEX1RYSU5IX0RDRCAgICAgMHg0MCAgLyogRENEIGlzIGxvdywgcHJldmVudGluZyB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRF9UWElOSF9EU1IgICAgIDB4ODAgIC8qIERTUiBpcyBsb3csIHByZXZlbnRpbmcgdHJhbnNtaXNzaW9uICovCisKKyNkZWZpbmUgRF9TVEFUMV9UWEVOICAgIDEgICAgIC8qIFRyYW5zbWl0IElOVEVSUlVQVFMgZW5hYmxlZCAqLworI2RlZmluZSBEX1NUQVQxX1JYRU4gICAgMiAgICAgLyogUmVjZWl2ZXIgSU5URVJSVVBUUyBlbmFibGVkICovCisjZGVmaW5lIERfU1RBVDFfTURFTiAgICA0ICAgICAvKiBNb2RlbSAoZGF0YSBzZXQgc2lncykgaW50ZXJydXB0cyBlbmFibGVkICovCisjZGVmaW5lIERfU1RBVDFfUkxNICAgICA4ICAgICAvKiBSZW1vdGUgbG9vcGJhY2sgbW9kZSBzZWxlY3RlZCAqLworI2RlZmluZSBEX1NUQVQxX0xMTSAgICAgMHgxMCAgLyogTG9jYWwgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZSBzZWxlY3RlZCAqLworI2RlZmluZSBEX1NUQVQxX0NUUyAgICAgMHgyMCAgLyogQ1RTIGlzIGxvdywgcHJldmVudGluZyB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRF9TVEFUMV9EVFIgICAgIDB4NDAgIC8qIERUUiBpcyBsb3csIHRvIHN0b3AgcmVtb3RlIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBEX1NUQVQxX1JUUyAgICAgMHg4MCAgLyogUlRTIGlzIGxvdywgdG8gc3RvcCByZW1vdGUgdHJhbnNtaXNzaW9uICovCisKKyNkZWZpbmUgRF9TVEFUMl9UWE1UICAgIDEgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlcnMgYXJlIGFsbCBlbXB0eSAqLworI2RlZmluZSBEX1NUQVQyX1JYTVQgICAgMiAgICAgLyogUmVjZWl2ZSBidWZmZXJzIGFyZSBhbGwgZW1wdHkgKi8KKyNkZWZpbmUgRF9TVEFUMl9SWElOSCAgIDQgICAgIC8qIExvYWR3YXJlIGhhcyB0cmllZCB0byBpbmhpYml0IHJlbW90ZQorCQkJCQkJCSAgICogdHJhbnNtaXNzaW9uOiAgZHJvcHBlZCBEVFIsIHNlbnQgWE9GRiwKKwkJCQkJCQkgICAqIHdoYXRldmVyLi4uCisJCQkJCQkJICAgKi8KKyNkZWZpbmUgRF9TVEFUMl9SWEZMTyAgIDggICAgIC8qIExvYWR3YXJlIGNhbiBzZW5kIG5vIG1vcmUgZGF0YSB0byBob3N0CisJCQkJCQkJICAgKiB1bnRpbCBpdCByZWNlaXZlcyBhIGZsb3ctY29udHJvbCBwYWNrZXQKKwkJCQkJCQkgICAqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1RBVF9UWENOVCBhbmQgU1RBVF9SWENOVCBwYWNrZXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiAgc3RydWN0ICAgX2NudFN0YXQKK3sKKwl1bnNpZ25lZCBzaG9ydCBjc190aW1lOyAgICAvLyAoQXNzdW1lcyBob3N0IGlzIGxpdHRsZS1lbmRpYW4hKQorCXVuc2lnbmVkIHNob3J0IGNzX2NvdW50OworfSBjbnRTdGF0LCAqY250U3RhdFB0cjsKKworLy8gVGhlc2UgcGFja2V0cyBhcmUgc2VudCBpbiByZXNwb25zZSB0byBhIENNRF9HRVRfUlhDTlQgb3IgYSBDTURfR0VUX1RYQ05UCisvLyBieXBhc3MgY29tbWFuZC4gY3NfdGltZSBpcyBhIHJ1bm5pbmcgMSBNaWxsaXNlY29uZCBjb3VudGVyIHdoaWNoIGFjdHMgYXMgYQorLy8gdGltZSBzdGFtcC4gY3NfY291bnQgaXMgYSBydW5uaW5nIGNvdW50ZXIgb2YgZGF0YSBzZW50IG9yIHJlY2VpdmVkIGZyb20gdGhlCisvLyB1eGFydHMuIChOb3QgaW5jbHVkaW5nIGRhdGEgYWRkZWQgYnkgdGhlIGNoaXAgaXRzZWxmLCBhcyB3aXRoIENSTEYKKy8vIHByb2Nlc3NpbmcpLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNUQVRfSFdGQUlMIHBhY2tldHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9mYWlsU3RhdAoreworCXVuc2lnbmVkIGNoYXIgZnNfd3JpdHRlbjsKKwl1bnNpZ25lZCBjaGFyIGZzX3JlYWQ7CisJdW5zaWduZWQgc2hvcnQgZnNfYWRkcmVzczsKK30gZmFpbFN0YXQsICpmYWlsU3RhdFB0cjsKKworLy8gVGhpcyBwYWNrZXQgaXMgc2VudCB3aGVuZXZlciB0aGUgb24tYm9hcmQgZGlhZ25vc3RpYyBwcm9jZXNzIGRldGVjdHMgYW4KKy8vIGVycm9yLiBBdCBzdGFydHVwLCB0aGlzIHByb2Nlc3MgaXMgZG9ybWFudC4gVGhlIGhvc3QgY2FuIHdha2UgaXQgdXAgYnkKKy8vIGlzc3VpbmcgdGhlIGJ5cGFzcyBjb21tYW5kIENNRF9IV19URVNULiBUaGUgcHJvY2VzcyBydW5zIGF0IGxvdyBwcmlvcml0eSBhbmQKKy8vIHBlcmZvcm1zIGNvbnRpbnVvdXMgaGFyZHdhcmUgdmVyaWZpY2F0aW9uOyB3cml0aW5nIGRhdGEgdG8gY2VydGFpbiBvbi1ib2FyZAorLy8gcmVnaXN0ZXJzLCByZWFkaW5nIGl0IGJhY2ssIGFuZCBjb21wYXJpbmcuIElmIGl0IGRldGVjdHMgYW4gZXJyb3IsIHRoaXMKKy8vIHBhY2tldCBpcyBzZW50IHRvIHRoZSBob3N0LCBhbmQgdGhlIHByb2Nlc3MgZ29lcyBkb3JtYW50IGFnYWluIHVudGlsIHRoZSBob3N0CisvLyBzZW5kcyBhbm90aGVyIENNRF9IV19URVNULiBJdCB0aGVuIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IHJlZ2lzdGVyIHRvIGJlCisvLyB0ZXN0ZWQuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNyb3MgdG8gZGVhbCB3aXRoIHRoZSBoZWFkZXJzIG1vcmUgZWFzaWx5ISBOb3RlIHRoYXQgdGhlc2UgYXJlIGRlZmluZWQgc28KKy8vIHRoZXkgbWF5IGJlIHVzZWQgYXMgImxlZnQiIGFzIHdlbGwgYXMgInJpZ2h0IiBleHByZXNzaW9ucy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byB0aGUgcGFja2V0LCByZWZlcmVuY2UgdGhlIGNoYW5uZWwgbnVtYmVyCisvLworI2RlZmluZSBDSEFOTkVMX09GKHBQKSAgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc0NoYW5uZWwKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQsIHJlZmVyZW5jZSB0aGUgUGFja2V0IHR5cGUKKy8vCisjZGVmaW5lIFBUWVBFX09GKHBQKSAoKGkyRGF0YUhlYWRlclB0cikocFApKS0+aTJzVHlwZQorCisvLyBUaGUgcG9zc2libGUgdHlwZXMgb2YgcGFja2V0cworLy8KKyNkZWZpbmUgUFRZUEVfREFUQSAgIDAgIC8qIEhvc3QgPC0tPiBCb2FyZCAqLworI2RlZmluZSBQVFlQRV9CWVBBU1MgMSAgLyogSG9zdCAtLS0+IEJvYXJkICovCisjZGVmaW5lIFBUWVBFX0lOTElORSAyICAvKiBIb3N0IC0tLT4gQm9hcmQgKi8KKyNkZWZpbmUgUFRZUEVfU1RBVFVTIDIgIC8qIEhvc3QgPC0tLSBCb2FyZCAqLworCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBUYWcKKy8vCisjZGVmaW5lIFRBR19PRihwUCkgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc1RhZworCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBkYXRhIGkuZC4KKy8vCisjZGVmaW5lIElEX09GKHBQKSAgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc0lkCisKKy8vIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBJRCdzCisvLworI2RlZmluZSBJRF9PUkRJTkFSWV9EQVRBICAgMAorI2RlZmluZSBJRF9IT1RfS0VZICAgICAgICAgMQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBjb3VudAorLy8KKyNkZWZpbmUgREFUQV9DT1VOVF9PRihwUCkgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc0NvdW50CisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIERhdGEgcGFja2V0LCByZWZlcmVuY2UgdGhlIGJlZ2lubmluZyBvZiBkYXRhCisvLworI2RlZmluZSBEQVRBX09GKHBQKSAmKCh1bnNpZ25lZCBjaGFyICopKHBQKSlbNF0gLy8gNCA9IHNpemUgb2YgaGVhZGVyCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIE5vbi1EYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBjb3VudAorLy8KKyNkZWZpbmUgQ01EX0NPVU5UX09GKHBQKSAoKGkyQ21kSGVhZGVyUHRyKShwUCkpLT5pMnNDb3VudAorCisjZGVmaW5lIE1BWF9DTURfUEFDS19TSVpFICA2MiAvLyBNYXhpbXVtIHNpemUgb2Ygc3VjaCBhIGNvdW50CisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIE5vbi1EYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBiZWdpbm5pbmcgb2YgZGF0YQorLy8KKyNkZWZpbmUgQ01EX09GKHBQKSAmKCh1bnNpZ25lZCBjaGFyICopKHBQKSlbMl0gIC8vIDIgPSBzaXplIG9mIGhlYWRlcgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWlsQm94IEJpdHM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE91dGdvaW5nIChob3N0IHRvIGJvYXJkKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgTUJfT1VUX1NUVUZGRUQgICAgIDB4ODAgIC8vIEhvc3QgaGFzIHBsYWNlZCBvdXRwdXQgaW4gZmlmbyAKKyNkZWZpbmUgTUJfSU5fU1RSSVBQRUQgICAgIDB4NDAgIC8vIEhvc3QgaGFzIHJlYWQgaW4gYWxsIGlucHV0IGZyb20gZmlmbyAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5jb21pbmcgKGJvYXJkIHRvIGhvc3QpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSBNQl9JTl9TVFVGRkVEICAgICAgMHg4MCAgLy8gQm9hcmQgaGFzIHBsYWNlZCBpbnB1dCBpbiBmaWZvIAorI2RlZmluZSBNQl9PVVRfU1RSSVBQRUQgICAgMHg0MCAgLy8gQm9hcmQgaGFzIHJlYWQgYWxsIG91dHB1dCBmcm9tIGZpZm8gCisjZGVmaW5lIE1CX0ZBVEFMX0VSUk9SICAgICAweDIwICAvLyBCb2FyZCBoYXMgZW5jb3VudGVyZWQgYSBmYXRhbCBlcnJvcgorCisjcHJhZ21hIHBhY2soNCkgICAgICAgICAgICAgICAgICAvLyBSZXNldCBwYWRkaW5nIHRvIGNvbW1hbmQtbGluZSBkZWZhdWx0CisKKyNlbmRpZiAgICAgIC8vIEkyUEFDS19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaXAyLmggYi9kcml2ZXJzL2NoYXIvaXAyL2lwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMi5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IElJIGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogRHJpdmVyIGNvbnN0YW50cyBmb3IgY29uZmlndXJhdGlvbiBhbmQgdHVuaW5nCisqCisqICAgTk9URVM6CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBJUDJfSAorI2RlZmluZSBJUDJfSAorCisjaW5jbHVkZSAiaXAydHlwZXMuaCIKKyNpbmNsdWRlICJpMmNtZC5oIgorCisvKioqKioqKioqKioqKi8KKy8qIENvbnN0YW50cyAqLworLyoqKioqKioqKioqKiovCisKKy8qIERldmljZSBtYWpvciBudW1iZXJzIC0gc2luY2UgdmVyc2lvbiAyLjAuMjYuICovCisjZGVmaW5lIElQMl9UVFlfTUFKT1IgICAgICA3MQorI2RlZmluZSBJUDJfQ0FMTE9VVF9NQUpPUiAgNzIKKyNkZWZpbmUgSVAyX0lQTF9NQUpPUiAgICAgIDczCisKKy8qIEJvYXJkIGNvbmZpZ3VyYXRpb24gYXJyYXkuCisgKiBUaGlzIGFycmF5IGRlZmluZXMgdGhlIGhhcmR3YXJlIGlycSBhbmQgYWRkcmVzcyBmb3IgdXAgdG8gSVAyX01BWF9CT0FSRFMKKyAqICg0IHN1cHBvcnRlZCBwZXIgaXAyX3R5cGVzLmgpIElTQSBib2FyZCBhZGRyZXNzZXMgYW5kIGlycXMgTVVTVCBiZSBzcGVjaWZpZWQsCisgKiBQQ0kgYW5kIEVJU0EgYm9hcmRzIGFyZSBwcm9iZWQgZm9yIGFuZCBhdXRvbWFnaWNseSBjb25maWdlZAorICogaWZmIHRoZSBhZGRyZXNzZXMgYXJlIHNldCB0byAxIGFuZCAyIHJlc3BlY3RpdmlseS4KKyAqICAgIDB4MDEwMCAtIDB4MDNmMCA9PSBJU0EKKyAqCSAgICAgICAgIDEgICAgICAgID09IFBDSQorICoJICAgICAgICAgMiAgICAgICAgPT0gRUlTQQorICoJICAgICAgICAgMCAgICAgICAgPT0gKHNraXAgdGhpcyBib2FyZCkKKyAqIFRoaXMgYXJyYXkgZGVmaW5lcyB0aGUgaGFyZHdhcmUgYWRkcmVzc2VzIGZvciB0aGVtLiBTcGVjaWFsIAorICogYWRkcmVzc2VzIGFyZSBFSVNBIGFuZCBQQ0kgd2hpY2ggZ28gc25pZmZpbmcgZm9yIGJvYXJkcy4gCisKKyAqIEluIGEgbXVsdGlib2FyZCBzeXN0ZW0gdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHdoaWNoIHBvcnQKKyAqIGRldmljZXMgYXJlIGFzc2lnbmVkIHRvIGVhY2ggYm9hcmQ6IAorICoJCWJvYXJkIDAgaXMgYXNzaWduZWQgdHR5RjAuLiB0byB0dHlGNjMsIAorICoJCWJvYXJkIDEgaXMgYXNzaWduZWQgdHR5RjY0ICB0byB0dHlGMTI3LAorICoJCWJvYXJkIDIgaXMgYXNzaWduZWQgdHR5RjEyOCB0byB0dHlGMTkxLAorICoJCWJvYXJkIDMgaXMgYXNzaWduZWQgdHR5RjE5MiB0byB0dHlGMjU1LiAKKyAqCisgKiBJbiBQQ0kgYW5kIEVJU0EgYnVzIHN5c3RlbXMgZWFjaCByYW5nZSBpcyBtYXBwZWQgdG8gY2FyZCBpbiAKKyAqIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBzbG90IG51bWJlciBvcmRlciwgSVNBIHBvc2l0aW9uIGlzIGFzIHNwZWNpZmllZAorICogaGVyZS4KKworICogSWYgdGhlIGlycXMgYXJlIEFMTCBzZXQgdG8gMCwwLDAsMCBhbGwgYm9hcmRzIG9wZXJhdGUgaW4gCisgKiBwb2xsZWQgbW9kZS4gRm9yIGludGVycnVwdCBvcGVyYXRpb24gSVNBIGJvYXJkcyByZXF1aXJlIHRoYXQgdGhlIElSUSBiZSAKKyAqIHNwZWNpZmllZCwgd2hpbGUgUENJIGFuZCBFSVNBIGJvYXJkcyBhbnkgbm9uemVybyBlbnRyeSAKKyAqIHdpbGwgZW5hYmxlIGludGVycnVwdHMgdXNpbmcgdGhlIEJJT1MgY29uZmlndXJlZCBpcnEgZm9yIHRoZSBib2FyZC4gCisgKiBBbiBpbnZhbGlkIGlycSBlbnRyeSB3aWxsIGRlZmF1bHQgdG8gcG9sbGVkIG1vZGUgZm9yIHRoYXQgY2FyZCBhbmQgcHJpbnQKKyAqIGNvbnNvbGUgd2FybmluZy4KKyAKKyAqIFdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQgYXMgYSBtb2R1bGUgdGhlc2Ugc2V0dGluZyBjYW4gYmUgb3ZlcnJpZGRlbiBvbiB0aGUgCisgKiBtb2Rwcm9iZSBjb21tYW5kIGxpbmUgb3Igb24gYW4gb3B0aW9uIGxpbmUgaW4gL2V0Yy9tb2Rwcm9iZS5jb25mLgorICogSWYgdGhlIGRyaXZlciBpcyBidWlsdC1pbiB0aGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIAorICogc2V0IGhlcmUgZm9yIElTQSBjYXJkcyBhbmQgYWRkcmVzcyBzZXQgdG8gMSBhbmQgMiBmb3IgUENJIGFuZCBFSVNBLgorICoKKyAqIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIG1vc3QgaWYgbm90IGFsbCBwb3NzaWJlIGNvbWJpbmF0aW9uczoKKworICpzdGF0aWMgaXAyY29uZmlnX3QgaXAyY29uZmlnID0KKyAqeworICoJezExLDEsMCwwfSwJCS8vIGlycXMKKyAqCXsJCQkJLy8gQWRkcmVzc2VzCisgKgkJMHgwMzA4LAkJLy8gQm9hcmQgMCwgdHR5RjAgICAtIHR0eUY2My8vIElTQSBjYXJkIGF0IGlvPTB4MzA4LCBpcnE9MTEKKyAqCQkweDAwMDEsCQkvLyBCb2FyZCAxLCB0dHlGNjQgIC0gdHR5RjEyNy8vUENJIGNhcmQgY29uZmlndXJlZCBieSBCSU9TCisgKgkJMHgwMDAwLAkJLy8gQm9hcmQgMiwgdHR5RjEyOCAtIHR0eUYxOTEvLyBTbG90IHNraXBwZWQKKyAqCQkweDAwMDIJCS8vIEJvYXJkIDMsIHR0eUYxOTIgLSB0dHlGMjU1Ly9FSVNBIGNhcmQgY29uZmlndXJlZCBieSBCSU9TCisgKgkJCQkJCQkJCQkJCSAvLyBidXQgcG9sbGVkIG5vdCBpcnEgZHJpdmVuCisgKgl9CisgKn07CisgKi8KKworIC8qIHRoaXMgc3RydWN0dXJlIGlzIHplcm9lZCBvdXQgYmVjYXVzZSB0aGUgc3VnZ2VzdGVkIG1ldGhvZCBpcyB0byBjb25maWd1cmUKKyAgKiB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCBzZXQgdXAgdGhlIHBhcmFtZXRlcnMgd2l0aCBhbiBvcHRpb25zIGxpbmUgaW4KKyAgKiAvZXRjL21vZHByb2JlLmNvbmYgYW5kIGxvYWQgd2l0aCBtb2Rwcm9iZSBvciBrbW9kLCB0aGUga2VybmVsCisgICogbW9kdWxlIGxvYWRlcgorICAqLworCisgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgTk9XIGFsd2F5cyBpbml0aWFsaXplZCB3aGVuIHRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQuCisgICogQ29tcGlsZWQgaW4gZGVmYXVsdHMgTVVTVCBiZSBhZGRlZCB0byB0aGUgaW8gYW5kIGlycSBhcnJheXMgaW4KKyAgKiBpcDIuYy4gIFRob3NlIHZhbHVlcyBhcmUgY29uZmlndXJhYmxlIGZyb20gaW5zbW9kIHBhcmFtZXRlcnMgaW4gdGhlCisgICogY2FzZSBvZiBtb2R1bGVzIG9yIGZyb20gY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKGlwMj1pbyxpcnEpIHdoZW4KKyAgKiBjb21waWxlZCBpbi4KKyAgKi8KKworc3RhdGljIGlwMmNvbmZpZ190IGlwMmNvbmZpZyA9Cit7CisJezAsMCwwLDB9LAkJLy8gaXJxcworCXsJCQkJLy8gQWRkcmVzc2VzCisJLyogRG8gTk9UIHNldCBjb21waWxlIHRpbWUgZGVmYXVsdHMgSEVSRSEgIFVzZSB0aGUgYXJyYXlzIGluCisJCWlwMi5jISAgVGhlc2UgV0lMTCBiZSBvdmVyd3JpdHRlbiEgID1taHc9ICovCisJCTB4MDAwMCwJCS8vIEJvYXJkIDAsIHR0eUYwICAgLSB0dHlGNjMKKwkJMHgwMDAwLAkJLy8gQm9hcmQgMSwgdHR5RjY0ICAtIHR0eUYxMjcKKwkJMHgwMDAwLAkJLy8gQm9hcmQgMiwgdHR5RjEyOCAtIHR0eUYxOTEKKwkJMHgwMDAwCQkvLyBCb2FyZCAzLCB0dHlGMTkyIC0gdHR5RjI1NQorCX0KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJpb2N0bC5oIGIvZHJpdmVycy9jaGFyL2lwMi9pcDJpb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGE5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMmlvY3RsLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OCBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IERyaXZlciBjb25zdGFudHMgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIHR1bmluZworKgorKiAgIE5PVEVTOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUDJJT0NUTF9ICisjZGVmaW5lIElQMklPQ1RMX0gKKworLy8qKioqKioqKioqKioqCisvLyogQ29uc3RhbnRzICoKKy8vKioqKioqKioqKioqKgorCisvLyBIaWdoIGJhdWQgcmF0ZXMgKGlmIG5vdCBkZWZpbmVkIGVsc2V3aGVyZS4KKyNpZm5kZWYgQjE1MzYwMCAgIAorIwlkZWZpbmUgQjE1MzYwMCAgIDAwMTAwMDUKKyNlbmRpZgorI2lmbmRlZiBCMzA3MjAwICAgCisjCWRlZmluZSBCMzA3MjAwICAgMDAxMDAwNgorI2VuZGlmCisjaWZuZGVmIEI5MjE2MDAgICAKKyMJZGVmaW5lIEI5MjE2MDAgICAwMDEwMDA3CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2lwMnRyYWNlLmggYi9kcml2ZXJzL2NoYXIvaXAyL2lwMnRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyMDQzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaXAydHJhY2UuaApAQCAtMCwwICsxLDQyIEBACisKKy8vCit1bmlvbiBpcDJicmVhZGNydW1iIAoreworCXN0cnVjdCB7IAorCQl1bnNpZ25lZCBjaGFyIHBvcnQsIGNhdCwgY29kZXMsIGxhYmVsOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGhkcjsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworfTsKKworI2RlZmluZSBJVFJDX05PX1BPUlQgCTB4RkYKKyNkZWZpbmUgQ0hBTk4JKHBDaC0+cG9ydF9pbmRleCkKKworI2RlZmluZQlJVFJDX0VSUk9SCSchJworI2RlZmluZQlJVFJDX0lOSVQgCSdBJworI2RlZmluZQlJVFJDX09QRU4JJ0InCisjZGVmaW5lCUlUUkNfQ0xPU0UJJ0MnCisjZGVmaW5lCUlUUkNfRFJBSU4JJ0QnCisjZGVmaW5lCUlUUkNfSU9DVEwJJ0UnCisjZGVmaW5lCUlUUkNfRkxVU0gJJ0YnCisjZGVmaW5lCUlUUkNfU1RBVFVTCSdHJworI2RlZmluZQlJVFJDX0hBTkdVUAknSCcKKyNkZWZpbmUJSVRSQ19JTlRSIAknSScKKyNkZWZpbmUJSVRSQ19TRkxPVwknSicKKyNkZWZpbmUJSVRSQ19TQkNNRAknSycKKyNkZWZpbmUJSVRSQ19TSUNNRAknTCcKKyNkZWZpbmUJSVRSQ19NT0RFTQknTScKKyNkZWZpbmUJSVRSQ19JTlBVVAknTicKKyNkZWZpbmUJSVRSQ19PVVRQVVQJJ08nCisjZGVmaW5lCUlUUkNfUFVUQwknUCcKKyNkZWZpbmUJSVRSQ19RVUVVRQknUScKKyNkZWZpbmUJSVRSQ19TVEZMVwknUicKKyNkZWZpbmUJSVRSQ19TRklGTwknUycKKyNkZWZpbmUJSVRSQ19WRVJJRlkJJ1YnCisjZGVmaW5lCUlUUkNfV1JJVEUJJ1cnCisKKyNkZWZpbmUJSVRSQ19FTlRFUgkweDAwCisjZGVmaW5lCUlUUkNfUkVUVVJOCTB4RkYKKworI2RlZmluZQlJVFJDX1FVRVVFX1JPT00JMgorI2RlZmluZQlJVFJDX1FVRVVFX0NNRAk2CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaXAydHlwZXMuaCBiL2RyaXZlcnMvY2hhci9pcDIvaXAydHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY3YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pcDJ0eXBlcy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTggYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEcml2ZXIgY29uc3RhbnRzIGFuZCB0eXBlIGRlZmluaXRpb25zLgorKgorKiAgIE5PVEVTOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSVAyVFlQRVNfSAorI2RlZmluZSBJUDJUWVBFU19ICisKKy8vKioqKioqKioqKioqKgorLy8qIENvbnN0YW50cyAqCisvLyoqKioqKioqKioqKioKKworLy8gRGVmaW5lIHNvbWUgbGltaXRzIGZvciB0aGlzIGRyaXZlci4gUG9ydHMgcGVyIGJvYXJkIGlzIGEgaGFyZHdhcmUgbGltaXRhdGlvbgorLy8gdGhhdCB3aWxsIG5vdCBjaGFuZ2UuIEN1cnJlbnQgaGFyZHdhcmUgbGltaXRzIHRoaXMgdG8gNjQgcG9ydHMgcGVyIGJvYXJkLgorLy8gQm9hcmRzIHBlciBkcml2ZXIgaXMgYSBzZWxmLWltcG9zZWQgbGltaXQuCisvLworI2RlZmluZSBJUDJfTUFYX0JPQVJEUyAgICAgICAgNAorI2RlZmluZSBJUDJfUE9SVFNfUEVSX0JPQVJEICAgQUJTX01PU1RfUE9SVFMKKyNkZWZpbmUgSVAyX01BWF9QT1JUUyAgICAgICAgIChJUDJfTUFYX0JPQVJEUypJUDJfUE9SVFNfUEVSX0JPQVJEKQorCisjZGVmaW5lIElTQSAgICAwCisjZGVmaW5lIFBDSSAgICAxCisjZGVmaW5lIEVJU0EgICAyCisKKy8vKioqKioqKioqKioqKioqKioqKioKKy8vKiBUeXBlIERlZmluaXRpb25zICoKKy8vKioqKioqKioqKioqKioqKioqKioKKwordHlwZWRlZiBzdHJ1Y3QgdHR5X3N0cnVjdCAqICAgUFRUWTsKK3R5cGVkZWYgd2FpdF9xdWV1ZV9oZWFkX3QgICBQV0FJVFE7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgIFVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgIFVTSE9SVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgIFVMT05HOworCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlzaG9ydCBpcnFbSVAyX01BWF9CT0FSRFNdOyAKKwl1bnNpZ25lZCBzaG9ydCBhZGRyW0lQMl9NQVhfQk9BUkRTXTsKKwlpbnQgdHlwZVtJUDJfTUFYX0JPQVJEU107CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2W0lQMl9NQVhfQk9BUkRTXTsKKyNlbmRpZgorfSBpcDJjb25maWdfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyNy1ydGMuYyBiL2RyaXZlcnMvY2hhci9pcDI3LXJ0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2RhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyNy1ydGMuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqCURyaXZlciBmb3IgdGhlIFNHUy1UaG9tc29uIE00OFQzNSBUaW1la2VlcGVyIFJBTSBjaGlwCisgKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXgKKyAqCisgKglUT0RPOiBJbXBsZW1lbnQgcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoJV3JpdHRlbiBieSBVbGYgQ2FybHNzb24gKHVsZmNAZW5nci5zZ2kuY29tKQorICoKKyAqCUJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBQYXVsIEdvcnRtYWtlci4KKyAqCisgKglUaGlzIGRyaXZlciBhbGxvd3MgdXNlIG9mIHRoZSByZWFsIHRpbWUgY2xvY2sgKGJ1aWx0IGludG8KKyAqCW5lYXJseSBhbGwgY29tcHV0ZXJzKSBmcm9tIHVzZXIgc3BhY2UuIEl0IGV4cG9ydHMgdGhlIC9kZXYvcnRjCisgKglpbnRlcmZhY2Ugc3VwcG9ydGluZyB2YXJpb3VzIGlvY3RsKCkgYW5kIGFsc28gdGhlIC9wcm9jL3J0YworICoJcHNldWRvLWZpbGUgZm9yIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4wOWIiCisKKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vbTQ4dDM1Lmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvYzMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc24va2xjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2lwMjcuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2h1Yi5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9wcml2YXRlLmg+CisKK3N0YXRpYyBpbnQgcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGludCBydGNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgdm9pZCBnZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pOworCisvKgorICoJQml0cyBpbiBydGNfc3RhdHVzLiAoNiBiaXRzIG9mIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24pCisgKi8KKworI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KKyNkZWZpbmUgUlRDX1RJTUVSX09OCQkweDAyCS8qIG1pc3NlZCBpcnEgdGltZXIgYWN0aXZlCSovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ0Y19zdGF0dXM7CS8qIGJpdG1hcHBlZCBzdGF0dXMgYnl0ZS4JKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19mcmVxOwkvKiBDdXJyZW50IHBlcmlvZGljIElSUSByYXRlCSovCitzdGF0aWMgc3RydWN0IG00OHQzNV9ydGMgKnJ0YzsKKworLyoKKyAqCUlmIHRoaXMgZHJpdmVyIGV2ZXIgYmVjb21lcyBtb2R1bGFyaXNlZCwgaXQgd2lsbCBiZSByZWFsbHkgbmljZQorICoJdG8gbWFrZSB0aGUgZXBvY2ggcmV0YWluIGl0cyB2YWx1ZSBhY3Jvc3MgbW9kdWxlIHJlbG9hZC4uLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVwb2NoID0gMTk3MDsJLyogeWVhciBjb3JyZXNwb25kaW5nIHRvIDB4MDAJKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF5c19pbl9tb1tdID0KK3swLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworc3RhdGljIGludCBydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLworCXsKKwkJZ2V0X3J0Y190aW1lKCZ3dGltZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KKwl7CisJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisJCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIGxlYXBfeXI7CisJCXVuc2lnbmVkIGludCB5cnM7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgKHN0cnVjdCBydGNfdGltZSopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXlycyA9IHJ0Y190bS50bV95ZWFyICsgMTkwMDsKKwkJbW9uID0gcnRjX3RtLnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJCWRheSA9IHJ0Y190bS50bV9tZGF5OworCQlocnMgPSBydGNfdG0udG1faG91cjsKKwkJbWluID0gcnRjX3RtLnRtX21pbjsKKwkJc2VjID0gcnRjX3RtLnRtX3NlYzsKKworCQlpZiAoeXJzIDwgMTk3MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxlYXBfeXIgPSAoKCEoeXJzICUgNCkgJiYgKHlycyAlIDEwMCkpIHx8ICEoeXJzICUgNDAwKSk7CisKKwkJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChkYXkgPiAoZGF5c19pbl9tb1ttb25dICsgKChtb24gPT0gMikgJiYgbGVhcF95cikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKChocnMgPj0gMjQpIHx8IChtaW4gPj0gNjApIHx8IChzZWMgPj0gNjApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCh5cnMgLT0gZXBvY2gpID4gMjU1KSAgICAvKiBUaGV5IGFyZSB1bnNpZ25lZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHlycyA+IDE2OSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh5cnMgPj0gMTAwKQorCQkJeXJzIC09IDEwMDsKKworCQlzZWMgPSBCSU4yQkNEKHNlYyk7CisJCW1pbiA9IEJJTjJCQ0QobWluKTsKKwkJaHJzID0gQklOMkJDRChocnMpOworCQlkYXkgPSBCSU4yQkNEKGRheSk7CisJCW1vbiA9IEJJTjJCQ0QobW9uKTsKKwkJeXJzID0gQklOMkJDRCh5cnMpOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcnRjLT5jb250cm9sIHw9IE00OFQzNV9SVENfU0VUOworCQlydGMtPnllYXIgPSB5cnM7CisJCXJ0Yy0+bW9udGggPSBtb247CisJCXJ0Yy0+ZGF0ZSA9IGRheTsKKwkJcnRjLT5ob3VyID0gaHJzOworCQlydGMtPm1pbiA9IG1pbjsKKwkJcnRjLT5zZWMgPSBzZWM7CisJCXJ0Yy0+Y29udHJvbCAmPSB+TTQ4VDM1X1JUQ19TRVQ7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBydGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19JU19PUEVOKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJ0Y19zdGF0dXMgfD0gUlRDX0lTX09QRU47CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIG9uY2UgdGhlIGRldmljZSBpcyBubyBsb25nZXIKKwkgKiBpbiB1c2UsIGFuZCBjbGVhciB0aGUgZGF0YS4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlydGNfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJVGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBydGNfaW9jdGwsCisJLm9wZW4JCT0gcnRjX29wZW4sCisJLnJlbGVhc2UJPSBydGNfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBydGNfZGV2PQoreworCVJUQ19NSU5PUiwKKwkicnRjIiwKKwkmcnRjX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0Y19pbml0KHZvaWQpCit7CisJcnRjID0gKHN0cnVjdCBtNDh0MzVfcnRjICopCisJKEtMX0NPTkZJR19DSF9DT05TX0lORk8obWFzdGVyX25hc2lkKS0+bWVtb3J5X2Jhc2UgKyBJT0MzX0JZVEVCVVNfREVWMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIHYlc1xuIiwgUlRDX1ZFUlNJT04pOworCWlmIChtaXNjX3JlZ2lzdGVyKCZydGNfZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YzogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9ydGMiLCAwLCBOVUxMLCBydGNfcmVhZF9wcm9jLCBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YzogY2Fubm90IGNyZWF0ZSAvcHJvYy9ydGMuXG4iKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZydGNfZGV2KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcnRjX2ZyZXEgPSAxMDI0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGNfZXhpdCAodm9pZCkKK3sKKwkvKiBpbnRlcnJ1cHRzIGFuZCB0aW1lciBkaXNhYmxlZCBhdCB0aGlzIHBvaW50IGJ5IHJ0Y19yZWxlYXNlICovCisKKwlyZW1vdmVfcHJvY19lbnRyeSAoInJ0YyIsIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlcigmcnRjX2Rldik7Cit9CisKK21vZHVsZV9pbml0KHJ0Y19pbml0KTsKK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworLyoKKyAqCUluZm8gZXhwb3J0ZWQgdmlhICIvcHJvYy9ydGMiLgorICovCisKK3N0YXRpYyBpbnQgcnRjX2dldF9zdGF0dXMoY2hhciAqYnVmKQoreworCWNoYXIgKnA7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJLyoKKwkgKiBKdXN0IGVtdWxhdGUgdGhlIHN0YW5kYXJkIC9wcm9jL3J0YworCSAqLworCisJcCA9IGJ1ZjsKKworCWdldF9ydGNfdGltZSgmdG0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgbHVzZXIgaGFzIHRoZSBSVEMgc2V0IGZvciBsb2NhbAorCSAqIHRpbWUgb3IgZm9yIFVuaXZlcnNhbCBTdGFuZGFyZCBUaW1lIChHTVQpLiBQcm9iYWJseSBsb2NhbCB0aG91Z2guCisJICovCisJcCArPSBzcHJpbnRmKHAsCisJCSAgICAgInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSAgICAgInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iCisJIAkgICAgICJydGNfZXBvY2hcdDogJTA0bHVcbiIKKwkJICAgICAiMjRoclx0XHQ6IHllc1xuIiwKKwkJICAgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywKKwkJICAgICB0bS50bV95ZWFyICsgMTkwMCwgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSwgZXBvY2gpOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IHJ0Y19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgICAgICBpbnQgbGVuID0gcnRjX2dldF9zdGF0dXMocGFnZSk7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7CisgICAgICAgIGlmIChsZW48MCkgbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCS8qCisJICogRG8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbGFzdCB1cGRhdGUgdG8gZmluaXNoPworCSAqLworCisJLyoKKwkgKiBPbmx5IHRoZSB2YWx1ZXMgdGhhdCB3ZSByZWFkIGZyb20gdGhlIFJUQyBhcmUgc2V0LiBXZSBsZWF2ZQorCSAqIHRtX3dkYXksIHRtX3lkYXkgYW5kIHRtX2lzZHN0IHVudG91Y2hlZC4gRXZlbiB0aG91Z2ggdGhlCisJICogUlRDIGhhcyBSVENfREFZX09GX1dFRUssIHdlIGlnbm9yZSBpdCwgYXMgaXQgaXMgb25seSB1cGRhdGVkCisJICogYnkgdGhlIFJUQyB3aGVuIGluaXRpYWxseSBzZXQgdG8gYSBub24temVybyB2YWx1ZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJcnRjLT5jb250cm9sIHw9IE00OFQzNV9SVENfUkVBRDsKKwlydGNfdG0tPnRtX3NlYyA9IHJ0Yy0+c2VjOworCXJ0Y190bS0+dG1fbWluID0gcnRjLT5taW47CisJcnRjX3RtLT50bV9ob3VyID0gcnRjLT5ob3VyOworCXJ0Y190bS0+dG1fbWRheSA9IHJ0Yy0+ZGF0ZTsKKwlydGNfdG0tPnRtX21vbiA9IHJ0Yy0+bW9udGg7CisJcnRjX3RtLT50bV95ZWFyID0gcnRjLT55ZWFyOworCXJ0Yy0+Y29udHJvbCAmPSB+TTQ4VDM1X1JUQ19SRUFEOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJcnRjX3RtLT50bV9zZWMgPSBCQ0QyQklOKHJ0Y190bS0+dG1fc2VjKTsKKwlydGNfdG0tPnRtX21pbiA9IEJDRDJCSU4ocnRjX3RtLT50bV9taW4pOworCXJ0Y190bS0+dG1faG91ciA9IEJDRDJCSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlydGNfdG0tPnRtX21kYXkgPSBCQ0QyQklOKHJ0Y190bS0+dG1fbWRheSk7CisJcnRjX3RtLT50bV9tb24gPSBCQ0QyQklOKHJ0Y190bS0+dG1fbW9uKTsKKwlydGNfdG0tPnRtX3llYXIgPSBCQ0QyQklOKHJ0Y190bS0+dG1feWVhcik7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gaG93IHRoZSBSVEMgdXNlcyB0aGUgdmFsdWVzCisJICogYW5kIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc3RydWN0IHJ0Y190aW1lOworCSAqLworCWlmICgocnRjX3RtLT50bV95ZWFyICs9IChlcG9jaCAtIDE5MDApKSA8PSA2OSkKKwkJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKKworCXJ0Y190bS0+dG1fbW9uLS07Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAybWFpbi5jIGIvZHJpdmVycy9jaGFyL2lwMm1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2E5YTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMm1haW4uYwpAQCAtMCwwICsxLDMyNjUgQEAKKy8qCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBNYWlubGluZSBjb2RlIGZvciB0aGUgZGV2aWNlIGRyaXZlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvRG86CisvLworLy8gRml4IHRoZSBpbW1lZGlhdGUgRFNTX05PVyBwcm9ibGVtLgorLy8gV29yayBvdmVyIHRoZSBjaGFubmVsIHN0YXRzIHJldHVybiBsb2dpYyBpbiBpcDJfaXBsX2lvY3RsIHNvIHRoZXkKKy8vCW1ha2Ugc2Vuc2UgZm9yIGFsbCAyNTYgcG9zc2libGUgY2hhbm5lbHMgYW5kIHNvIHRoZSB1c2VyIHNwYWNlCisvLwl1dGlsaXRpZXMgd2lsbCBjb21waWxlIGFuZCB3b3JrIHByb3Blcmx5LgorLy8KKy8vIERvbmU6CisvLworLy8gMS4yLjE0CS9cL1x8PW1odz18XC9cLworLy8gQWRkZWQgYm91bmRzIGNoZWNraW5nIHRvIGlwMl9pcGxfaW9jdGwgdG8gYXZvaWQgcG90ZW50aWFsIHRlcnJvcmlzdGljIGFjdHMuCisvLyBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIGlwMnRyYWNlIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGtlcm5lbCBzdHlsZQorLy8JVGhhbmtzIHRvIEFuZHJlYXMgRGlsZ2VyIDxhZGlsZ2VyQHR1cmJvbGFicy5jb20+IGZvciB0aGVzZSB1cGRhdGVzCisvLworLy8gMS4yLjEzCS9cL1x8PW1odz18XC9cLworLy8gREVWRlM6IFJlbmFtZWQgdHRmL3tufSB0byB0dHMvRntufSBhbmQgY3VmL3tufSB0byBjdWEvRntufSB0byBjb25mb3JtCisvLwl0byBhZ3JlZWQgZGV2ZnMgc2VyaWFsIGRldmljZSBuYW1pbmcgY29udmVudGlvbi4KKy8vCisvLyAxLjIuMTIJL1wvXHw9bWh3PXxcL1wvCisvLyBDbGVhbmVkIHVwIHNvbWUgcmVtb3ZlIHF1ZXVlIGN1dCBhbmQgcGFzdGUgZXJyb3JzCisvLworLy8gMS4yLjExCS9cL1x8PW1odz18XC9cLworLy8gQ2xlYW4gdXAgcG90ZW50aWFsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMKKy8vIENsZWFuIHVwIGRldmZzIHJlZ2lzdHJhdGlvbgorLy8gQWRkIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyc2luZyBmb3IgaW8gYW5kIGlycQorLy8JQ29tcGlsZSBkZWZhdWx0cyBmb3IgaW8gYW5kIGlycSBhcmUgbm93IHNldCBpbiBpcDIuYyBub3QgaXAyL2lwMi5oIQorLy8gUmV3b3JrZWQgcG9sbF9vbmx5IGhhY2sgZm9yIGV4cGxpY2l0IHBhcmFtZXRlciBzZXR0aW5nCisvLwlZb3UgbXVzdCBub3cgRVhQTElDSVRMWSBzZXQgcG9sbF9vbmx5ID0gMSBvciBzZXQgYWxsIGlycXMgdG8gMAorLy8gTWVyZ2VkIGlwMl9sb2FkbWFpbiBhbmQgb2xkX2lwMl9pbml0CisvLyBDb252ZXJ0ZWQgYWxsIGluc3RhbmNlcyBvZiBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uIGludG8gcXVldWUgY2FsbHMKKy8vCU1vc3Qgb2YgdGhlc2UgaGFkIG5vIHJhY2UgY29uZGl0aW9ucyBidXQgYmV0dGVyIHRvIGNsZWFuIHVwIG5vdworLy8KKy8vIDEuMi4xMAkvXC9cfD1taHc9fFwvXC8KKy8vIEZpeGVkIHRoZSBib3R0b20gaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZW5hYmxlZCBVU0VfSVFJCisvLwl0byBzcGxpdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaW50byBhIGZvcm1hbCB0b3AtaGFsZiAvIGJvdHRvbS1oYWxmCisvLyBGaXhlZCB0aW1pbmcgd2luZG93IG9uIGhpZ2ggc3BlZWQgcHJvY2Vzc29ycyB0aGF0IHF1ZXVlZCBtZXNzYWdlcyB0bworLy8gCXRoZSBvdXRib3VuZCBtYWlsIGZpZm8gZmFzdGVyIHRoYW4gdGhlIGJvYXJkIGNvdWxkIGhhbmRsZS4KKy8vCisvLyAxLjIuOQorLy8gRm91ciBib3ggRVggd2FzIGJhcmZpbmcgb24gPjEyOGsga21hbGxvYywgbWFkZSBzdHJ1Y3R1cmUgc21hbGxlciBieQorLy8gcmVkdWNpbmcgb3V0cHV0IGJ1ZmZlciBzaXplCisvLworLy8gMS4yLjgKKy8vIERldmljZSBmaWxlIHN5c3RlbSBzdXBwb3J0IChNSFcpCisvLworLy8gMS4yLjcgCisvLyBGaXhlZAorLy8gUmVsb2FkIG9mIGlwMiB3aXRob3V0IHVubG9hZGluZyBpcDJtYWluIGhhbmdzIHN5c3RlbSBvbiBjYXQgb2YgL3Byb2MvbW9kdWxlcworLy8KKy8vIDEuMi42CisvL0ZpeGVzIERDRCBwcm9ibGVtcworLy8JRENEIHdhcyBub3QgcmVwb3J0ZWQgd2hlbiBDTE9DQUwgd2FzIHNldCBvbiBjYWxsIHRvIFRJT0NNR0VUCisvLworLy9FbmhhbmNlbWVudHM6CisvLwlUSU9DTUdFVCByZXF1ZXN0cyBhbmQgd2FpdHMgZm9yIHN0YXR1cyByZXR1cm4KKy8vCU5vIERTUyBpbnRlcnJ1cHRzIGVuYWJsZWQgZXhjZXB0IGZvciBEQ0Qgd2hlbiBuZWVkZWQKKy8vCisvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkKKy8vCisvLyNkZWZpbmUgSVAyREVCVUdfSU5JVAorLy8jZGVmaW5lIElQMkRFQlVHX09QRU4KKy8vI2RlZmluZSBJUDJERUJVR19XUklURQorLy8jZGVmaW5lIElQMkRFQlVHX1JFQUQKKy8vI2RlZmluZSBJUDJERUJVR19JT0NUTAorLy8jZGVmaW5lIElQMkRFQlVHX0lQTAorCisvLyNkZWZpbmUgSVAyREVCVUdfVFJBQ0UKKy8vI2RlZmluZSBERUJVR19GSUZPCisKKy8qKioqKioqKioqKiovCisvKiBJbmNsdWRlcyAqLworLyoqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nkay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXN0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICIuL2lwMi9pcDJ0eXBlcy5oIgorI2luY2x1ZGUgIi4vaXAyL2lwMnRyYWNlLmgiCisjaW5jbHVkZSAiLi9pcDIvaXAyaW9jdGwuaCIKKyNpbmNsdWRlICIuL2lwMi9pcDIuaCIKKyNpbmNsdWRlICIuL2lwMi9pMmVsbGlzLmgiCisjaW5jbHVkZSAiLi9pcDIvaTJsaWIuaCIKKworLyoqKioqKioqKioqKioqKioqCisgKiAvcHJvYy9pcDJtZW0gICoKKyAqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworc3RhdGljIGludCBpcDJfcmVhZF9wcm9jbWVtKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCk7CitzdGF0aWMgaW50IGlwMl9yZWFkX3Byb2MoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqICk7CisKKy8qKioqKioqKioqKioqKioqKioqKi8KKy8qIFR5cGUgRGVmaW5pdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKiovCisvKiBDb25zdGFudHMgKi8KKy8qKioqKioqKioqKioqLworCisvKiBTdHJpbmcgY29uc3RhbnRzIHRvIGlkZW50aWZ5IG91cnNlbHZlcyAqLworc3RhdGljIGNoYXIgKnBjTmFtZSAgICA9ICJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBtdWx0aXBvcnQgZHJpdmVyIjsKK3N0YXRpYyBjaGFyICpwY1ZlcnNpb24gPSAiMS4yLjE0IjsKKworLyogU3RyaW5nIGNvbnN0YW50cyBmb3IgcG9ydCBuYW1lcyAqLworc3RhdGljIGNoYXIgKnBjRHJpdmVyX25hbWUgICA9ICJpcDIiOworc3RhdGljIGNoYXIgKnBjSXBsICAgIAkJID0gImlwMmlwbCI7CisKKy8qIFNlcmlhbCBzdWJ0eXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTCAgICAxCisKKy8vIGNoZWV6eSBrbHVkZ2Ugb3IgZ2VuaXVzIC0geW91IGRlY2lkZT8KK2ludCBpcDJfbG9hZG1haW4oaW50ICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqRmlwX2Zpcm13YXJlOworc3RhdGljIGludCBGaXBfZmlybXdhcmVfc2l6ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHbG9iYWwgbW9kdWxlIGVudHJ5IGZ1bmN0aW9ucyAqLworCisvKiBQcml2YXRlIChzdGF0aWMpIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCAgaXAyX29wZW4oUFRUWSwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBpcDJfY2xvc2UoUFRUWSwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50ICBpcDJfd3JpdGUoUFRUWSwgaW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBpcDJfcHV0Y2hhcihQVFRZLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyB2b2lkIGlwMl9mbHVzaF9jaGFycyhQVFRZKTsKK3N0YXRpYyBpbnQgIGlwMl93cml0ZV9yb29tKFBUVFkpOworc3RhdGljIGludCAgaXAyX2NoYXJzX2luX2J1ZihQVFRZKTsKK3N0YXRpYyB2b2lkIGlwMl9mbHVzaF9idWZmZXIoUFRUWSk7CitzdGF0aWMgaW50ICBpcDJfaW9jdGwoUFRUWSwgc3RydWN0IGZpbGUgKiwgVUlOVCwgVUxPTkcpOworc3RhdGljIHZvaWQgaXAyX3NldF90ZXJtaW9zKFBUVFksIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUoUFRUWSk7CitzdGF0aWMgdm9pZCBpcDJfdGhyb3R0bGUoUFRUWSk7CitzdGF0aWMgdm9pZCBpcDJfdW50aHJvdHRsZShQVFRZKTsKK3N0YXRpYyB2b2lkIGlwMl9zdG9wKFBUVFkpOworc3RhdGljIHZvaWQgaXAyX3N0YXJ0KFBUVFkpOworc3RhdGljIHZvaWQgaXAyX2hhbmd1cChQVFRZKTsKK3N0YXRpYyBpbnQgIGlwMl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50ICBpcDJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKKworc3RhdGljIHZvaWQgc2V0X2lycShpbnQsIGludCk7CitzdGF0aWMgdm9pZCBpcDJfaW50ZXJydXB0X2JoKGkyZUJvcmRTdHJQdHIgcEIpOworc3RhdGljIGlycXJldHVybl90IGlwMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworc3RhdGljIHZvaWQgaXAyX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGlubGluZSB2b2lkIHNlcnZpY2VfYWxsX2JvYXJkcyh2b2lkKTsKK3N0YXRpYyB2b2lkIGRvX2lucHV0KHZvaWQgKnApOworc3RhdGljIHZvaWQgZG9fc3RhdHVzKHZvaWQgKnApOworCitzdGF0aWMgdm9pZCBpcDJfd2FpdF91bnRpbF9zZW50KFBUVFksaW50KTsKKworc3RhdGljIHZvaWQgc2V0X3BhcmFtcyAoaTJDaGFuU3RyUHRyLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKGkyQ2hhblN0clB0ciwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOworc3RhdGljIGludCBzZXRfc2VyaWFsX2luZm8oaTJDaGFuU3RyUHRyLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CisKK3N0YXRpYyBzc2l6ZV90IGlwMl9pcGxfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IGlwMl9pcGxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgaW50IGlwMl9pcGxfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIFVJTlQsIFVMT05HKTsKK3N0YXRpYyBpbnQgaXAyX2lwbF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworc3RhdGljIGludCBEdW1wVHJhY2VCdWZmZXIoY2hhciBfX3VzZXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgRHVtcEZpZm9CdWZmZXIoIGNoYXIgX191c2VyICosIGludCk7CisKK3N0YXRpYyB2b2lkIGlwMl9pbml0X2JvYXJkKGludCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZmluZF9laXNhX2JvYXJkKGludCk7CisKKy8qKioqKioqKioqKioqKiovCisvKiBTdGF0aWMgRGF0YSAqLworLyoqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICppcDJfdHR5X2RyaXZlcjsKKworLyogSGVyZSwgdGhlbiBpcyBhIHRhYmxlIG9mIGJvYXJkIHBvaW50ZXJzIHdoaWNoIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBzaG91bGQKKyAqIHNjYW4gdGhyb3VnaCB0byBkZXRlcm1pbmUgd2hvIGl0IG11c3Qgc2VydmljZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGkybkJvYXJkczsgLy8gTnVtYmVyIG9mIGJvYXJkcyBoZXJlCisKK3N0YXRpYyBpMmVCb3JkU3RyUHRyIGkyQm9hcmRQdHJUYWJsZVtJUDJfTUFYX0JPQVJEU107CisKK3N0YXRpYyBpMkNoYW5TdHJQdHIgIERldlRhYmxlW0lQMl9NQVhfUE9SVFNdOworLy9EZXZUYWJsZU1lbSBqdXN0IHVzZWQgdG8gc2F2ZSBhZGRyZXNzZXMgZm9yIGtmcmVlCitzdGF0aWMgdm9pZCAgKkRldlRhYmxlTWVtW0lQMl9NQVhfQk9BUkRTXTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIGRlc2NyaXB0b3IgZm9yIHRoZSBpcDJpcGwgZGV2aWNlLCB3aGljaCBpcyB1c2VkIHRvCisgKiBkb3dubG9hZCB0aGUgbG9hZHdhcmUgdG8gdGhlIGJvYXJkcy4KKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXAyX2lwbCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gaXAyX2lwbF9yZWFkLAorCS53cml0ZQkJPSBpcDJfaXBsX3dyaXRlLAorCS5pb2N0bAkJPSBpcDJfaXBsX2lvY3RsLAorCS5vcGVuCQk9IGlwMl9pcGxfb3BlbiwKK307IAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfY291bnRlciA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBiaF9jb3VudGVyID0gMDsKKworLy8gVXNlIGltbWVkaWF0ZSBxdWV1ZSB0byBzZXJ2aWNlIGludGVycnVwdHMKKyNkZWZpbmUgVVNFX0lRSQorLy8jZGVmaW5lIFVTRV9JUQkvLyBQQ0kmMi4yIG5lZWRzIHdvcmsKKworLyogVGhlIHRpbWVyX2xpc3QgZW50cnkgZm9yIG91ciBwb2xsIHJvdXRpbmUuIElmIGludGVycnVwdCBvcGVyYXRpb24gaXMgbm90CisgKiBzZWxlY3RlZCwgdGhlIGJvYXJkIGlzIHNlcnZpY2VkIHBlcmlvZGljYWxseSB0byBzZWUgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcuCisgKi8KKyNkZWZpbmUgIFBPTExfVElNRU9VVCAgIChqaWZmaWVzICsgMSkKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBQb2xsVGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihpcDJfcG9sbCwgMCwgMCk7CitzdGF0aWMgY2hhciAgVGltZXJPbjsKKworI2lmZGVmIElQMkRFQlVHX1RSQUNFCisvKiBUcmFjZSAoZGVidWcpIGJ1ZmZlciBkYXRhICovCisjZGVmaW5lIFRSQUNFTUFYICAxMDAwCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cmFjZWJ1ZltUUkFDRU1BWF07CitzdGF0aWMgaW50IHRyYWNlc3R1ZmY7CitzdGF0aWMgaW50IHRyYWNlc3RyaXA7CitzdGF0aWMgaW50IHRyYWNld3JhcDsKKyNlbmRpZgorCisvKioqKioqKioqKi8KKy8qIE1hY3JvcyAqLworLyoqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChJUDJERUJVR19PUEVOKQorI2RlZmluZSBEQkdfQ05UKHMpIHByaW50ayhLRVJOX0RFQlVHICIoJXMpOiBbJXhdIHJlZmM9JWQsIHR0eWM9JWQsIG1vZGM9JXggLT4gJXNcbiIsIFwKKwkJICAgIHR0eS0+bmFtZSwocENoLT5mbGFncyksaXAyX3R0eV9kcml2ZXItPnJlZmNvdW50LCBcCisJCSAgICB0dHktPmNvdW50LC8qR0VUX1VTRV9DT1VOVChtb2R1bGUpKi8wLHMpCisjZWxzZQorI2RlZmluZSBEQkdfQ05UKHMpCisjZW5kaWYKKworLyoqKioqKioqLworLyogQ29kZSAqLworLyoqKioqKioqLworCisjaW5jbHVkZSAiLi9pcDIvaTJlbGxpcy5jIiAgICAvKiBFeHRyZW1lbHkgbG93LWxldmVsIGludGVyZmFjZSBzZXJ2aWNlcyAqLworI2luY2x1ZGUgIi4vaXAyL2kyY21kLmMiICAgICAgLyogU3RhbmRhcmQgbG9hZHdhcmUgY29tbWFuZCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIi4vaXAyL2kybGliLmMiICAgICAgLyogSGlnaCBsZXZlbCBpbnRlcmZhY2Ugc2VydmljZXMgKi8KKworLyogQ29uZmlndXJhdGlvbiBhcmVhIGZvciBtb2Rwcm9iZSAqLworCitNT0RVTEVfQVVUSE9SKCJEb3VnIE1jTmFzaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBEcml2ZXIiKTsKKworc3RhdGljIGludCBwb2xsX29ubHkgPSAwOworCitzdGF0aWMgaW50IEVpc2FfaXJxOworc3RhdGljIGludCBFaXNhX3Nsb3Q7CisKK3N0YXRpYyBpbnQgaWluZHg7CitzdGF0aWMgY2hhciByaXJxc1tJUDJfTUFYX0JPQVJEU107CitzdGF0aWMgaW50IFZhbGlkX0lycXNbXSA9IHsgMywgNCwgNSwgNywgMTAsIDExLCAxMiwgMTUsIDB9OworCisvKiBmb3Igc3lzZnMgY2xhc3Mgc3VwcG9ydCAqLworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmlwMl9jbGFzczsKKworLy8gU29tZSBmdW5jdGlvbnMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGlycSdzIHdlIGhhdmUKKworc3RhdGljIGludCBfX2luaXQKK2lzX3ZhbGlkX2lycShpbnQgaXJxKQoreworCWludCAqaSA9IFZhbGlkX0lycXM7CisJCisJd2hpbGUgKCgqaSAhPSAwKSAmJiAoKmkgIT0gaXJxKSkgeworCQlpKys7CisJfQorCXJldHVybiAoKmkpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK21hcmtfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQoreworCXJpcnFzW2lpbmR4KytdID0gaXJxOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdAorY2xlYXJfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQoreworCWludCBpOworCWZvciAoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJaWYgKHJpcnFzW2ldID09IGlycSkgeworCQkJcmlycXNbaV0gPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQKK2hhdmVfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQoreworCS8vIGFycmF5IGluaXQgdG8gemVyb3Mgc28gMCBpcnEgd2lsbCBub3QgYmUgcmVxdWVzdGVkIGFzIGEgc2lkZSBlZmZlY3QKKwlpbnQgaTsKKwlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCWlmIChyaXJxc1tpXSA9PSBpcnEpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpbml0X21vZHVsZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3MgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgaXMgYSByZXF1aXJlZCBlbnRyeSBwb2ludCBmb3IgYW4gaW5zdGFsbGFibGUgbW9kdWxlLiBJdCBzaW1wbHkgY2FsbHMgICovCisvKiB0aGUgZHJpdmVyIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHdoYXQgaXQgcmV0dXJucy4gICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBNT0RVTEUKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBJUDJERUJVR19JTklUCisJcHJpbnRrIChLRVJOX0RFQlVHICJMb2FkaW5nIG1vZHVsZSAuLi5cbiIgKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgY2xlYW51cF9tb2R1bGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGlzIGEgcmVxdWlyZWQgZW50cnkgcG9pbnQgZm9yIGFuIGluc3RhbGxhYmxlIG1vZHVsZS4gSXQgaGFzIHRvIHJldHVybiAqLworLyogdGhlIGRldmljZSBhbmQgdGhlIGRyaXZlciB0byBhIHBhc3NpdmUgc3RhdGUuIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ICAgKi8KKy8qIHRvIHJlc2V0IHRoZSBib2FyZCBmdWxseSwgZXNwZWNpYWxseSBhcyB0aGUgbG9hZHdhcmUgaXMgZG93bmxvYWRlZCAgICAgICAgICovCisvKiBleHRlcm5hbGx5IHJhdGhlciB0aGFuIGluIHRoZSBkcml2ZXIuIFdlIGp1c3Qgd2FudCB0byBkaXNhYmxlIHRoZSBib2FyZCAgICAqLworLyogYW5kIGNsZWFyIHRoZSBsb2Fkd2FyZSB0byBhIHJlc2V0IHN0YXRlLiBUbyBhbGxvdyB0aGlzIHRoZXJlIGhhcyB0byBiZSBhICAgKi8KKy8qIHdheSB0byBkZXRlY3Qgd2hldGhlciB0aGUgYm9hcmQgaGFzIHRoZSBsb2Fkd2FyZSBydW5uaW5nIGF0IGluaXQgdGltZSB0byAgICovCisvKiBoYW5kbGUgc3Vic2VxdWVudCBpbnN0YWxsYXRpb25zIG9mIHRoZSBkcml2ZXIuIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSAqLworLyogZHJpdmVyIHNob3VsZCBiZSByZXR1cm5lZCBzaW5jZSBpdCBtYXkgYmUgdW5sb2FkZWQgZnJvbSBtZW1vcnkuICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgTU9EVUxFCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBlcnI7CisJaW50IGk7CisKKyNpZmRlZiBJUDJERUJVR19JTklUCisJcHJpbnRrIChLRVJOX0RFQlVHICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHBjTmFtZSwgcGNWZXJzaW9uICk7CisjZW5kaWYKKwkvKiBTdG9wIHBvbGwgdGltZXIgaWYgd2UgaGFkIG9uZS4gKi8KKwlpZiAoIFRpbWVyT24gKSB7CisJCWRlbF90aW1lciAoICZQb2xsVGltZXIgKTsKKwkJVGltZXJPbiA9IDA7CisJfQorCisJLyogUmVzZXQgdGhlIGJvYXJkcyB3ZSBoYXZlLiAqLworCWZvciggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoIGkyQm9hcmRQdHJUYWJsZVtpXSApIHsKKwkJCWlpUmVzZXQoIGkyQm9hcmRQdHJUYWJsZVtpXSApOworCQl9CisJfQorCisJLyogVGhlIGZvbGxvd2luZyBpcyBkb25lIGF0IG1vc3Qgb25jZSwgaWYgYW55IGJvYXJkcyB3ZXJlIGluc3RhbGxlZC4gKi8KKwlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICkgeworCQkJaWlSZXNldERlbGF5KCBpMkJvYXJkUHRyVGFibGVbaV0gKTsKKwkJCS8qIGZyZWUgaW8gYWRkcmVzc2VzIGFuZCBUaWJldCAqLworCQkJcmVsZWFzZV9yZWdpb24oIGlwMmNvbmZpZy5hZGRyW2ldLCA4ICk7CisJCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihJUDJfSVBMX01BSk9SLCA0ICogaSkpOyAKKwkJCWRldmZzX3JlbW92ZSgiaXAyL2lwbCVkIiwgaSk7CisJCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihJUDJfSVBMX01BSk9SLCA0ICogaSArIDEpKTsKKwkJCWRldmZzX3JlbW92ZSgiaXAyL3N0YXQlZCIsIGkpOworCQl9CisJCS8qIERpc2FibGUgYW5kIHJlbW92ZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KKwkJaWYgKCAoaXAyY29uZmlnLmlycVtpXSA+IDApICYmIGhhdmVfcmVxdWVzdGVkX2lycShpcDJjb25maWcuaXJxW2ldKSApIHsJCisJCQlmcmVlX2lycSAoIGlwMmNvbmZpZy5pcnFbaV0sICh2b2lkICopJnBjTmFtZSk7CisJCQljbGVhcl9yZXF1ZXN0ZWRfaXJxKCBpcDJjb25maWcuaXJxW2ldKTsKKwkJfQorCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShpcDJfY2xhc3MpOworCWRldmZzX3JlbW92ZSgiaXAyIik7CisJaWYgKCAoIGVyciA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlciAoIGlwMl90dHlfZHJpdmVyICkgKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwl9CisJcHV0X3R0eV9kcml2ZXIoaXAyX3R0eV9kcml2ZXIpOworCWlmICggKCBlcnIgPSB1bnJlZ2lzdGVyX2NocmRldiAoIElQMl9JUExfTUFKT1IsIHBjSXBsICkgKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIElQTCBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwl9CisJcmVtb3ZlX3Byb2NfZW50cnkoImlwMm1lbSIsICZwcm9jX3Jvb3QpOworCisJLy8gZnJlZSBtZW1vcnkKKwlmb3IgKGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7IGkrKykgeworCQl2b2lkICpwQjsKKyNpZmRlZiBDT05GSUdfUENJCisJCWlmIChpcDJjb25maWcudHlwZVtpXSA9PSBQQ0kgJiYgaXAyY29uZmlnLnBjaV9kZXZbaV0pIHsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShpcDJjb25maWcucGNpX2RldltpXSk7CisJCQlpcDJjb25maWcucGNpX2RldltpXSA9IE5VTEw7CisJCX0KKyNlbmRpZgorCQlpZiAoKHBCID0gaTJCb2FyZFB0clRhYmxlW2ldKSAhPSAwICkgeworCQkJa2ZyZWUgKCBwQiApOworCQkJaTJCb2FyZFB0clRhYmxlW2ldID0gTlVMTDsKKwkJfQorCQlpZiAoKERldlRhYmxlTWVtW2ldKSAhPSBOVUxMICkgeworCQkJa2ZyZWUgKCBEZXZUYWJsZU1lbVtpXSAgKTsKKwkJCURldlRhYmxlTWVtW2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIENsZWFudXAgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLiAqLworCWlpRWxsaXNDbGVhbnVwKCk7CisjaWZkZWYgSVAyREVCVUdfSU5JVAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyIFVubG9hZGVkXG4iICk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBpcDJfb3BzID0geworCS5vcGVuICAgICAgICAgICAgPSBpcDJfb3BlbiwKKwkuY2xvc2UgICAgICAgICAgID0gaXAyX2Nsb3NlLAorCS53cml0ZSAgICAgICAgICAgPSBpcDJfd3JpdGUsCisJLnB1dF9jaGFyICAgICAgICA9IGlwMl9wdXRjaGFyLAorCS5mbHVzaF9jaGFycyAgICAgPSBpcDJfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gICAgICA9IGlwMl93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBpcDJfY2hhcnNfaW5fYnVmLAorCS5mbHVzaF9idWZmZXIgICAgPSBpcDJfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCAgICAgICAgICAgPSBpcDJfaW9jdGwsCisJLnRocm90dGxlICAgICAgICA9IGlwMl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSAgICAgID0gaXAyX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zICAgICA9IGlwMl9zZXRfdGVybWlvcywKKwkuc2V0X2xkaXNjICAgICAgID0gaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUsCisJLnN0b3AgICAgICAgICAgICA9IGlwMl9zdG9wLAorCS5zdGFydCAgICAgICAgICAgPSBpcDJfc3RhcnQsCisJLmhhbmd1cCAgICAgICAgICA9IGlwMl9oYW5ndXAsCisJLnJlYWRfcHJvYyAgICAgICA9IGlwMl9yZWFkX3Byb2MsCisJLnRpb2NtZ2V0CSA9IGlwMl90aW9jbWdldCwKKwkudGlvY21zZXQJID0gaXAyX3Rpb2Ntc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9sb2FkbWFpbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBpcnEsIGlvIGZyb20gY29tbWFuZCBsaW5lIG9mIGluc21vZCBldC4gYWwuICAgICAgICAgICAgICAgICAgICAqLworLyoJCXBvaW50ZXIgdG8gZmlwIGZpcm13YXJlIGFuZCBmaXJtd2FyZSBzaXplIGZvciBib2FyZHMJICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3MgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgd2FzIHRoZSByZXF1aXJlZCBlbnRyeSBwb2ludCBmb3IgYWxsIGRyaXZlcnMgKG5vdyBpbiBpcDIuYykgICAgICAgICAgICovCisvKiBJdCBwZXJmb3JtcyBhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaW5pdGlhbGlzYXRpb24gb2YgdGhlIGRldmljZXMgYW5kIGRyaXZlciBzdHJ1Y3R1cmVzLCBhbmQgcmVnaXN0ZXJzIGl0c2VsZiAgKi8KKy8qIHdpdGggdGhlIHJlbGV2YW50IGtlcm5lbCBtb2R1bGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0FfSU5URVJSVVBULSBpZiBzZXQgYmxvY2tzIGFsbCBpbnRlcnJ1cHRzIGVsc2Ugb25seSB0aGlzIGxpbmUgKi8KKy8qIFNBX1NISVJRICAgIC0gZm9yIHNoYXJlZCBpcnEgUENJIG9yIG1heWJlIEVJU0Egb25seSAqLworLyogU0FfUkFORE9NICAgLSBjYW4gYmUgc291cmNlIGZvciBjZXJ0LiByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgKi8KKyNkZWZpbmUgSVAyX1NBX0ZMQUdTCTAKKworaW50CitpcDJfbG9hZG1haW4oaW50ICppb3AsIGludCAqaXJxcCwgdW5zaWduZWQgY2hhciAqZmlybXdhcmUsIGludCBmaXJtc2l6ZSkgCit7CisJaW50IGksIGosIGJveDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdGF0aWMgaW50IGxvYWRlZDsKKwlpMmVCb3JkU3RyUHRyIHBCID0gTlVMTDsKKwlpbnQgcmMgPSAtMTsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgSVRSQ19FTlRFUiwgMCApOworCisJLyogcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIG1vZHByb2JlIG9yCisJCWluc21vZCBpLmUuIGlvcCAmIGlycXAgKi8KKwkvKiBpcnFwIGFuZCBpb3Agc2hvdWxkIEFMV0FZUyBiZSBzcGVjaWZpZWQgbm93Li4uICBCdXQgd2UgY2hlY2sKKwkJdGhlbSBpbmRpdmlkdWFsbHkganVzdCB0byBiZSBzdXJlLCBhbnl3YXlzLi4uICovCisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoaW9wKSB7CisJCQlpcDJjb25maWcuYWRkcltpXSA9IGlvcFtpXTsKKwkJCWlmIChpcnFwKSB7CisJCQkJaWYoIGlycXBbaV0gPj0gMCApIHsKKwkJCQkJaXAyY29uZmlnLmlycVtpXSA9IGlycXBbaV07CisJCQkJfSBlbHNlIHsKKwkJCQkJaXAyY29uZmlnLmlycVtpXSA9IDA7CisJCQkJfQorCS8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9mIGEgaGFjay4gIElmIHBvbGxfb25seT0xIG9uIGNvbW1hbmQKKwkvLyBsaW5lIGJhY2sgaW4gaXAyLmMgT1IgYWxsIElSUXMgb24gYWxsIHNwZWNpZmllZCBib2FyZHMgYXJlCisJLy8gZXhwbGljaXRseSBzZXQgdG8gMCwgdGhlbiBkcm9wIHRvIHBvbGwgb25seSBtb2RlIGFuZCBvdmVycmlkZQorCS8vIFBDSSBvciBFSVNBIGludGVycnVwdHMuICBUaGlzIHN1cGVyY2VlZHMgdGhlIG9sZCBoYWNrIG9mCisJLy8gdHJpZ2dlcmluZyBpZiBhbGwgaW50ZXJydXB0cyB3ZXJlIHplcm8gKGxpa2UgZGEgZGVmYXVsdCkuCisJLy8gU3RpbGwgYSBoYWNrIGJ1dCBsZXNzIHByb25lIHRvIHJhbmRvbSBhY3RzIG9mIHRlcnJvcmlzbS4KKwkvLworCS8vIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbywgbm93IHRoYXQgdGhlIElSUSBkZWZhdWx0IGlzIHNldAorCS8vIHRvIC0xLCBpcyB0byB1c2UgMCBhcyBhIGhhcmQgY29kZWQsIGRvIG5vdCBwcm9iZS4KKwkvLworCS8vCS9cL1x8PW1odz18XC9cLworCQkJCXBvbGxfb25seSB8PSBpcnFwW2ldOworCQkJfQorCQl9CisJfQorCXBvbGxfb25seSA9ICFwb2xsX29ubHk7CisKKwlGaXBfZmlybXdhcmUgPSBmaXJtd2FyZTsKKwlGaXBfZmlybXdhcmVfc2l6ZSA9IGZpcm1zaXplOworCisJLyogQW5ub3VuY2Ugb3VyIHByZXNlbmNlICovCisJcHJpbnRrKCBLRVJOX0lORk8gIiVzIHZlcnNpb24gJXNcbiIsIHBjTmFtZSwgcGNWZXJzaW9uICk7CisKKwkvLyBpcDIgY2FuIGJlIHVubG9hZGVkIGFuZCByZWxvYWRlZCBmb3Igbm8gZ29vZCByZWFzb24KKwkvLyB3ZSBjYW4ndCBsZXQgdGhhdCBoYXBwZW4gaGVyZSBvciBiYWQgdGhpbmdzIGhhcHBlbgorCS8vIHNlY29uZCBsb2FkIGhvc2VzIGJvYXJkIGJ1dCBub3Qgc3lzdGVtIC0gZml4bWUgbGF0ZXIKKwlpZiAobG9hZGVkKSB7CisJCXByaW50ayggS0VSTl9JTkZPICJTdGlsbCBsb2FkZWRcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCWxvYWRlZCsrOworCisJaXAyX3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKElQMl9NQVhfUE9SVFMpOworCWlmICghaXAyX3R0eV9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGlzZSB0aGUgaWlFbGxpcyBzdWJzeXN0ZW0uICovCisJaWlFbGxpc0luaXQoKTsKKworCS8qIEluaXRpYWxpemUgYXJyYXlzLiAqLworCW1lbXNldCggaTJCb2FyZFB0clRhYmxlLCAwLCBzaXplb2YgaTJCb2FyZFB0clRhYmxlICk7CisJbWVtc2V0KCBEZXZUYWJsZSwgMCwgc2l6ZW9mIERldlRhYmxlICk7CisKKwkvKiBJbml0aWFsaXNlIGFsbCB0aGUgYm9hcmRzIHdlIGNhbiBmaW5kICh1cCB0byB0aGUgbWF4aW11bSkuICovCisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlzd2l0Y2ggKCBpcDJjb25maWcuYWRkcltpXSApIHsgCisJCWNhc2UgMDoJLyogc2tpcCB0aGlzIHNsb3QgZXZlbiBpZiBjYXJkIGlzIHByZXNlbnQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBJU0EgKi8KKwkJICAgLyogSVNBIGFkZHJlc3MgbXVzdCBiZSBzcGVjaWZpZWQgKi8KKwkJCWlmICggKGlwMmNvbmZpZy5hZGRyW2ldIDwgMHgxMDApIHx8IChpcDJjb25maWcuYWRkcltpXSA+IDB4M2Y4KSApIHsKKwkJCQlwcmludGsgKCBLRVJOX0VSUiAiSVAyOiBCYWQgSVNBIGJvYXJkICVkIGFkZHJlc3MgJXhcbiIsCisJCQkJCQkJIGksIGlwMmNvbmZpZy5hZGRyW2ldICk7CisJCQkJaXAyY29uZmlnLmFkZHJbaV0gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpcDJjb25maWcudHlwZVtpXSA9IElTQTsKKworCQkJCS8qIENoZWNrIGZvciB2YWxpZCBpcnEgYXJndW1lbnQsIHNldCBmb3IgcG9sbGluZyBpZiBpbnZhbGlkICovCisJCQkJaWYgKGlwMmNvbmZpZy5pcnFbaV0gJiYgIWlzX3ZhbGlkX2lycShpcDJjb25maWcuaXJxW2ldKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIklQMjogQmFkIElSUSglZCkgc3BlY2lmaWVkXG4iLGlwMmNvbmZpZy5pcnFbaV0pOworCQkJCQlpcDJjb25maWcuaXJxW2ldID0gMDsvLyAwIGlzIHBvbGxpbmcgYW5kIGlzIHZhbGlkIGluIHRoYXQgc2Vuc2UKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQQ0k6CisjaWZkZWYgQ09ORklHX1BDSQorCQkJeworCQkJCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X2kgPSBOVUxMOworCQkJCXBjaV9kZXZfaSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0NPTVBVVE9ORSwKKwkJCQkJCQkgIFBDSV9ERVZJQ0VfSURfQ09NUFVUT05FX0lQMkVYLCBwY2lfZGV2X2kpOworCQkJCWlmIChwY2lfZGV2X2kgIT0gTlVMTCkgeworCQkJCQl1bnNpZ25lZCBpbnQgYWRkcjsKKworCQkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldl9pKSkgeworCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBjYW4ndCBlbmFibGUgUENJIGRldmljZSBhdCAlc1xuIiwKKwkJCQkJCQlwY2lfbmFtZShwY2lfZGV2X2kpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlwMmNvbmZpZy50eXBlW2ldID0gUENJOworCQkJCQlpcDJjb25maWcucGNpX2RldltpXSA9IHBjaV9kZXZfaTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZfaSwgUENJX0JBU0VfQUREUkVTU18xLCAmYWRkcik7CisJCQkJCWlmICggYWRkciAmIDEgKSB7CisJCQkJCQlpcDJjb25maWcuYWRkcltpXT0oVVNIT1JUKShhZGRyJjB4ZmZmZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IFBDSSBJL08gYWRkcmVzcyBlcnJvclxuIik7CisJCQkJCX0KKworLy8JCUlmIHRoZSBQQ0kgQklPUyBhc3NpZ25lZCBpdCwgbGV0cyB0cnkgYW5kIHVzZSBpdC4gIElmIHdlCisvLwkJY2FuJ3QgYWNxdWlyZSBpdCBvciBpdCBzY3Jld3MgdXAsIGRlYWwgd2l0aCBpdCB0aGVuLgorCisvLwkJCQkJaWYgKCFpc192YWxpZF9pcnEocGNpX2lycSkpIHsKKy8vCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBCYWQgUENJIEJJT1MgSVJRKCVkKVxuIixwY2lfaXJxKTsKKy8vCQkJCQkJcGNpX2lycSA9IDA7CisvLwkJCQkJfQorCQkJCQlpcDJjb25maWcuaXJxW2ldID0gcGNpX2Rldl9pLT5pcnE7CisJCQkJfSBlbHNlIHsJLy8gYW5uIGVycm9yCisJCQkJCWlwMmNvbmZpZy5hZGRyW2ldID0gMDsKKwkJCQkJaWYgKHN0YXR1cyA9PSBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQpIHsKKwkJCQkJCXByaW50ayggS0VSTl9FUlIgIklQMjogUENJIGJvYXJkICVkIG5vdCBmb3VuZFxuIiwgaSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBQQ0kgZXJyb3IgMHgleCBcbiIsIHN0YXR1cyApOworCQkJCQl9CisJCQkJfSAKKwkJCX0KKyNlbHNlCisJCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IFBDSSBjYXJkIHNwZWNpZmllZCBidXQgUENJIHN1cHBvcnQgbm90XG4iKTsKKwkJCXByaW50ayggS0VSTl9FUlIgIklQMjogY29uZmlndXJlZCBpbiB0aGlzIGtlcm5lbC5cbiIpOworCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBSZWNvbXBpbGUga2VybmVsIHdpdGggQ09ORklHX1BDSSBkZWZpbmVkIVxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCQkJYnJlYWs7CisJCWNhc2UgRUlTQToKKwkJCWlmICggKGlwMmNvbmZpZy5hZGRyW2ldID0gZmluZF9laXNhX2JvYXJkKCBFaXNhX3Nsb3QgKyAxICkpICE9IDApIHsKKwkJCQkvKiBFaXNhX2lycSBzZXQgYXMgc2lkZSBlZmZlY3QsIGJvbyAqLworCQkJCWlwMmNvbmZpZy50eXBlW2ldID0gRUlTQTsKKwkJCX0gCisJCQlpcDJjb25maWcuaXJxW2ldID0gRWlzYV9pcnE7CisJCQlicmVhazsKKwkJfQkvKiBzd2l0Y2ggKi8KKwl9CS8qIGZvciAqLworCWZvciAoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJaWYgKCBpcDJjb25maWcuYWRkcltpXSApIHsKKwkJCXBCID0ga21hbGxvYyggc2l6ZW9mKGkyZUJvcmRTdHIpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICggcEIgIT0gTlVMTCApIHsKKwkJCQlpMkJvYXJkUHRyVGFibGVbaV0gPSBwQjsKKwkJCQltZW1zZXQoIHBCLCAwLCBzaXplb2YoaTJlQm9yZFN0cikgKTsKKwkJCQlpaVNldEFkZHJlc3MoIHBCLCBpcDJjb25maWcuYWRkcltpXSwgaWkyRGVsYXlUaW1lciApOworCQkJCWlpUmVzZXQoIHBCICk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBib2FyZCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCQl9CisJCX0KKwl9CisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoICggcEIgPSBpMkJvYXJkUHRyVGFibGVbaV0gKSAhPSBOVUxMICkgeworCQkJaWlSZXNldERlbGF5KCBwQiApOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoIGkyQm9hcmRQdHJUYWJsZVtpXSAhPSBOVUxMICkgeworCQkJaXAyX2luaXRfYm9hcmQoIGkgKTsKKwkJfQorCX0KKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgMiwgMCApOworCisJaXAyX3R0eV9kcml2ZXItPm93bmVyCQkgICAgPSBUSElTX01PRFVMRTsKKwlpcDJfdHR5X2RyaXZlci0+bmFtZSAgICAgICAgICAgICAgICAgPSAidHR5RiI7CisJaXAyX3R0eV9kcml2ZXItPmRldmZzX25hbWUJICAgID0gInR0cy9GIjsKKwlpcDJfdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUgICAgICAgICAgPSBwY0RyaXZlcl9uYW1lOworCWlwMl90dHlfZHJpdmVyLT5tYWpvciAgICAgICAgICAgICAgICA9IElQMl9UVFlfTUFKT1I7CisJaXAyX3R0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ICAgICAgICAgID0gMDsKKwlpcDJfdHR5X2RyaXZlci0+dHlwZSAgICAgICAgICAgICAgICAgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWlwMl90dHlfZHJpdmVyLT5zdWJ0eXBlICAgICAgICAgICAgICA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlpcDJfdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zICAgICAgICAgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaXAyX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKKwlpcDJfdHR5X2RyaXZlci0+ZmxhZ3MgICAgICAgICAgICAgICAgPSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9OT19ERVZGUzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoaXAyX3R0eV9kcml2ZXIsICZpcDJfb3BzKTsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgMywgMCApOworCisJLyogUmVnaXN0ZXIgdGhlIHR0eSBkZXZpY2VzLiAqLworCWlmICggKCBlcnIgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyICggaXAyX3R0eV9kcml2ZXIgKSApICkgeworCQlwcmludGsoS0VSTl9FUlIgIklQMjogZmFpbGVkIHRvIHJlZ2lzdGVyIHR0eSBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwkJcHV0X3R0eV9kcml2ZXIoaXAyX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UKKwkvKiBSZWdpc3RlciB0aGUgSVBMIGRyaXZlci4gKi8KKwlpZiAoICggZXJyID0gcmVnaXN0ZXJfY2hyZGV2ICggSVAyX0lQTF9NQUpPUiwgcGNJcGwsICZpcDJfaXBsICkgKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciBJUEwgZGV2aWNlICglZClcbiIsIGVyciApOworCX0gZWxzZSB7CisJCS8qIGNyZWF0ZSB0aGUgc3lzZnMgY2xhc3MgKi8KKwkJaXAyX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgImlwMiIpOworCQlpZiAoSVNfRVJSKGlwMl9jbGFzcykpIHsKKwkJCWVyciA9IFBUUl9FUlIoaXAyX2NsYXNzKTsKKwkJCWdvdG8gb3V0X2NocmRldjsJCisJCX0KKwl9CisJLyogUmVnaXN0ZXIgdGhlIHJlYWRfcHJvY21lbSB0aGluZyAqLworCWlmICghY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiaXAybWVtIiwwLCZwcm9jX3Jvb3QsaXAyX3JlYWRfcHJvY21lbSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciByZWFkX3Byb2NtZW1cbiIpOworCX0gZWxzZSB7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIDQsIDAgKTsKKwkJLyogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyIG9yIHBvbGwgaGFuZGxlciwgZGVwZW5kaW5nIHVwb24gdGhlCisJCSAqIHNwZWNpZmllZCBpbnRlcnJ1cHQuCisJCSAqLworCisJCWZvciggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQkJaWYgKCAwID09IGlwMmNvbmZpZy5hZGRyW2ldICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIE5VTEwgIT0gKCBwQiA9IGkyQm9hcmRQdHJUYWJsZVtpXSApICkgeworCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGlwMl9jbGFzcywgTUtERVYoSVAyX0lQTF9NQUpPUiwgCisJCQkJCQk0ICogaSksIE5VTEwsICJpcGwlZCIsIGkpOworCQkJCWVyciA9IGRldmZzX21rX2NkZXYoTUtERVYoSVAyX0lQTF9NQUpPUiwgNCAqIGkpLAorCQkJCQkJU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JRkNIUiwKKwkJCQkJCSJpcDIvaXBsJWQiLCBpKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKElQMl9JUExfTUFKT1IsIAorCQkJCQkJNCAqIGkpKTsKKwkJCQkJZ290byBvdXRfY2xhc3M7CisJCQkJfQorCisJCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaXAyX2NsYXNzLCBNS0RFVihJUDJfSVBMX01BSk9SLCAKKwkJCQkJCTQgKiBpICsgMSksIE5VTEwsICJzdGF0JWQiLCBpKTsKKwkJCQllcnIgPSBkZXZmc19ta19jZGV2KE1LREVWKElQMl9JUExfTUFKT1IsIDQgKiBpICsgMSksCisJCQkJCQlTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lGQ0hSLAorCQkJCQkJImlwMi9zdGF0JWQiLCBpKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKElQMl9JUExfTUFKT1IsIAorCQkJCQkJNCAqIGkgKyAxKSk7CisJCQkJCWdvdG8gb3V0X2NsYXNzOworCQkJCX0KKworCQkJICAgIGZvciAoIGJveCA9IDA7IGJveCA8IEFCU19NQVhfQk9YRVM7ICsrYm94ICkKKwkJCSAgICB7CisJCQkgICAgICAgIGZvciAoIGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyArK2ogKQorCQkJICAgICAgICB7CisJCQkJICAgIGlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmICgxIDw8IGopICkKKwkJCQkgICAgeworCQkJCSAgICAgICAgdHR5X3JlZ2lzdGVyX2RldmljZShpcDJfdHR5X2RyaXZlciwKKwkJCQkJICAgIGogKyBBQlNfQklHR0VTVF9CT1ggKgorCQkJCQkJICAgIChib3graSpBQlNfTUFYX0JPWEVTKSwgTlVMTCk7CisJCQkgICAgCSAgICB9CisJCQkgICAgICAgIH0KKwkJCSAgICB9CisJCQl9CisKKwkJCWlmIChwb2xsX29ubHkpIHsKKy8vCQlQb2xsIG9ubHkgZm9yY2VzIGRyaXZlciB0byBvbmx5IHVzZSBwb2xsaW5nIGFuZAorLy8JCXRvIGlnbm9yZSB0aGUgcHJvYmVkIFBDSSBvciBFSVNBIGludGVycnVwdHMuCisJCQkJaXAyY29uZmlnLmlycVtpXSA9IENJUl9QT0xMOworCQkJfQorCQkJaWYgKCBpcDJjb25maWcuaXJxW2ldID09IENJUl9QT0xMICkgeworcmV0cnk6CisJCQkJaWYgKCFUaW1lck9uKSB7CisJCQkJCVBvbGxUaW1lci5leHBpcmVzID0gUE9MTF9USU1FT1VUOworCQkJCQlhZGRfdGltZXIgKCAmUG9sbFRpbWVyICk7CisJCQkJCVRpbWVyT24gPSAxOworCQkJCQlwcmludGsoIEtFUk5fSU5GTyAiSVAyOiBwb2xsaW5nXG4iKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChoYXZlX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXJjID0gcmVxdWVzdF9pcnEoIGlwMmNvbmZpZy5pcnFbaV0sIGlwMl9pbnRlcnJ1cHQsCisJCQkJCUlQMl9TQV9GTEFHUyB8IChpcDJjb25maWcudHlwZVtpXSA9PSBQQ0kgPyBTQV9TSElSUSA6IDApLAorCQkJCQlwY05hbWUsICh2b2lkICopJnBjTmFtZSk7CisJCQkJaWYgKHJjKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBhbiByZXF1ZXN0X2lycSBmYWlsZWQ6IGVycm9yICVkXG4iLHJjKTsKKwkJCQkJaXAyY29uZmlnLmlycVtpXSA9IENJUl9QT0xMOworCQkJCQlwcmludGsoIEtFUk5fSU5GTyAiSVAyOiBQb2xsaW5nICVsZC9zZWMuXG4iLAorCQkJCQkJCShQT0xMX1RJTUVPVVQgLSBqaWZmaWVzKSk7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfSAKKwkJCQltYXJrX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSk7CisJCQkJLyogSW5pdGlhbGlzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYm90dG9tIGhhbGYgKGFrYSBzbGloKS4gKi8KKwkJCX0KKwkJfQorCQlmb3IoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICkgeworCQkJCXNldF9pcnEoIGksIGlwMmNvbmZpZy5pcnFbaV0gKTsgLyogc2V0IGFuZCBlbmFibGUgYm9hcmQgaW50ZXJydXB0ICovCisJCQl9CisJCX0KKwl9CisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTklULCBJVFJDX1JFVFVSTiwgMCApOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koaXAyX2NsYXNzKTsKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoSVAyX0lQTF9NQUpPUiwgImlwMiIpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woaXAyX2xvYWRtYWluKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9pbml0X2JvYXJkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBJbmRleCBvZiBib2FyZCBpbiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGJvYXJkLiBUaGUgbG9hZHdhcmUgaXMgY29waWVkIHRvICAgKi8KKy8qIHRoZSBib2FyZCwgdGhlIGNoYW5uZWwgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGUgYm9hcmQgZGV0YWlscyAgICovCisvKiBhcmUgcmVwb3J0ZWQgb24gdGhlIGNvbnNvbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9faW5pdAoraXAyX2luaXRfYm9hcmQoIGludCBib2FyZG51bSApCit7CisJaW50IGk7CisJaW50IG5wb3J0cyA9IDAsIG5ib3hlcyA9IDA7CisJaTJDaGFuU3RyUHRyIHBDaDsKKwlpMmVCb3JkU3RyUHRyIHBCID0gaTJCb2FyZFB0clRhYmxlW2JvYXJkbnVtXTsKKworCWlmICggIWlpSW5pdGlhbGl6ZSAoIHBCICkgKSB7CisJCXByaW50ayAoIEtFUk5fRVJSICJJUDI6IEZhaWxlZCB0byBpbml0aWFsaXplIGJvYXJkIGF0IDB4JXgsIGVycm9yICVkXG4iLAorCQkJIHBCLT5pMmVCYXNlLCBwQi0+aTJlRXJyb3IgKTsKKwkJZ290byBlcnJfaW5pdGlhbGl6ZTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiSVAyOiBCb2FyZCAlZDogYWRkcj0weCV4IGlycT0lZFxuIiwgYm9hcmRudW0gKyAxLAorCSAgICAgICBpcDJjb25maWcuYWRkcltib2FyZG51bV0sIGlwMmNvbmZpZy5pcnFbYm9hcmRudW1dICk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKCBpcDJjb25maWcuYWRkcltib2FyZG51bV0sIDgsIHBjTmFtZSApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBiYWQgYWRkcj0weCV4XG4iLCBpcDJjb25maWcuYWRkcltib2FyZG51bV0pOworCQlnb3RvIGVycl9pbml0aWFsaXplOworCX0KKworCWlmICggaWlEb3dubG9hZEFsbCAoIHBCLCAobG9hZEhkclN0clB0cilGaXBfZmlybXdhcmUsIDEsIEZpcF9maXJtd2FyZV9zaXplICkKKwkgICAgIT0gSUlfRE9XTl9HT09EICkgeworCQlwcmludGsgKCBLRVJOX0VSUiAiSVAyOiBmYWlsZWQgdG8gZG93bmxvYWQgbG9hZHdhcmVcbiIgKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfSBlbHNlIHsKKwkJcHJpbnRrICggS0VSTl9JTkZPICJJUDI6IGZ2PSVkLiVkLiVkIGx2PSVkLiVkLiVkXG4iLAorCQkJIHBCLT5pMmVQb20uZS5wb3JWZXJzaW9uLAorCQkJIHBCLT5pMmVQb20uZS5wb3JSZXZpc2lvbiwKKwkJCSBwQi0+aTJlUG9tLmUucG9yU3ViUmV2LCBwQi0+aTJlTFZlcnNpb24sCisJCQkgcEItPmkyZUxSZXZpc2lvbiwgcEItPmkyZUxTdWIgKTsKKwl9CisKKwlzd2l0Y2ggKCBwQi0+aTJlUG9tLmUucG9ySUQgJiB+UE9SX0lEX1JFU0VSVkVEICkgeworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBVbmtub3duIGJvYXJkIHR5cGUsIElEID0gJXhcbiIsCisJCQkJcEItPmkyZVBvbS5lLnBvcklEICk7CisJCW5wb3J0cyA9IDA7CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCQlicmVhazsKKworCWNhc2UgUE9SX0lEX0lJXzQ6IC8qIEludGVsbGlQb3J0LUlJLCBJU0EtNCAoNHhSSjQ1KSAqLworCQlwcmludGsgKCBLRVJOX0lORk8gIklQMjogSVNBLTRcbiIgKTsKKwkJbnBvcnRzID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFBPUl9JRF9JSV84OiAvKiBJbnRlbGxpUG9ydC1JSSwgOC1wb3J0IHVzaW5nIHN0YW5kYXJkIGJyaWNrLiAqLworCQlwcmludGsgKCBLRVJOX0lORk8gIklQMjogSVNBLTggc3RkXG4iICk7CisJCW5wb3J0cyA9IDg7CisJCWJyZWFrOworCisJY2FzZSBQT1JfSURfSUlfOFI6IC8qIEludGVsbGlQb3J0LUlJLCA4LXBvcnQgdXNpbmcgUkoxMSdzIChubyBDVFMpICovCisJCXByaW50ayAoIEtFUk5fSU5GTyAiSVAyOiBJU0EtOCBSSjExXG4iICk7CisJCW5wb3J0cyA9IDg7CisJCWJyZWFrOworCisJY2FzZSBQT1JfSURfRklJRVg6IC8qIEludGVsbGlQb3J0IElJRVggKi8KKwl7CisJCWludCBwb3J0bnVtID0gSVAyX1BPUlRTX1BFUl9CT0FSRCAqIGJvYXJkbnVtOworCQlpbnQgICAgICAgICAgICBib3g7CisKKwkJZm9yKCBib3ggPSAwOyBib3ggPCBBQlNfTUFYX0JPWEVTOyArK2JveCApIHsKKwkJCWlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAhPSAwICkgeworCQkJCSsrbmJveGVzOworCQkJfQorCQkJZm9yKCBpID0gMDsgaSA8IEFCU19CSUdHRVNUX0JPWDsgKytpICkgeworCQkJCWlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmIDE8PCBpICkgeworCQkJCQkrK25wb3J0czsKKwkJCQl9CisJCQl9CisJCX0KKwkJRGV2VGFibGVNZW1bYm9hcmRudW1dID0gcENoID0KKwkJCWttYWxsb2MoIHNpemVvZihpMkNoYW5TdHIpICogbnBvcnRzLCBHRlBfS0VSTkVMICk7CisJCWlmICggIXBDaCApIHsKKwkJCXByaW50ayAoIEtFUk5fRVJSICJJUDI6IChpMl9pbml0X2NoYW5uZWw6KSBPdXQgb2YgbWVtb3J5LlxuIik7CisJCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKwkJfQorCQlpZiAoICFpMkluaXRDaGFubmVscyggcEIsIG5wb3J0cywgcENoICkgKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIklQMjogaTJJbml0Q2hhbm5lbHMgZmFpbGVkOiAlZFxuIixwQi0+aTJlRXJyb3IpOworCQkJa2ZyZWUgKCBwQ2ggKTsKKwkJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCQl9CisJCXBCLT5pMmVDaGFubmVsUHRyID0gJkRldlRhYmxlW3BvcnRudW1dOworCQlwQi0+aTJlQ2hhbm5lbENudCA9IEFCU19NT1NUX1BPUlRTOworCisJCWZvciggYm94ID0gMDsgYm94IDwgQUJTX01BWF9CT1hFUzsgKytib3gsIHBvcnRudW0gKz0gQUJTX0JJR0dFU1RfQk9YICkgeworCQkJZm9yKCBpID0gMDsgaSA8IEFCU19CSUdHRVNUX0JPWDsgKytpICkgeworCQkJCWlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmICgxIDw8IGkpICkgeworCQkJCQlEZXZUYWJsZVtwb3J0bnVtICsgaV0gPSBwQ2g7CisJCQkJCXBDaC0+cG9ydF9pbmRleCA9IHBvcnRudW0gKyBpOworCQkJCQlwQ2grKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiSVAyOiBFWCBib3g9JWQgcG9ydHM9JWQgJWQgYml0XG4iLAorCQkJbmJveGVzLCBucG9ydHMsIHBCLT5pMmVEYXRhV2lkdGgxNiA/IDE2IDogOCApOworCQl9CisJCWdvdG8gZXhfZXhpdDsKKwl9CisJRGV2VGFibGVNZW1bYm9hcmRudW1dID0gcENoID0KKwkJa21hbGxvYyAoIHNpemVvZiAoaTJDaGFuU3RyKSAqIG5wb3J0cywgR0ZQX0tFUk5FTCApOworCWlmICggIXBDaCApIHsKKwkJcHJpbnRrICggS0VSTl9FUlIgIklQMjogKGkyX2luaXRfY2hhbm5lbDopIE91dCBvZiBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCXBCLT5pMmVDaGFubmVsUHRyID0gcENoOworCXBCLT5pMmVDaGFubmVsQ250ID0gbnBvcnRzOworCWlmICggIWkySW5pdENoYW5uZWxzKCBwQiwgbnBvcnRzLCBwQ2ggKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGkySW5pdENoYW5uZWxzIGZhaWxlZDogJWRcbiIscEItPmkyZUVycm9yKTsKKwkJa2ZyZWUgKCBwQ2ggKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCXBCLT5pMmVDaGFubmVsUHRyID0gJkRldlRhYmxlW0lQMl9QT1JUU19QRVJfQk9BUkQgKiBib2FyZG51bV07CisKKwlmb3IoIGkgPSAwOyBpIDwgcEItPmkyZUNoYW5uZWxDbnQ7ICsraSApIHsKKwkJRGV2VGFibGVbSVAyX1BPUlRTX1BFUl9CT0FSRCAqIGJvYXJkbnVtICsgaV0gPSBwQ2g7CisJCXBDaC0+cG9ydF9pbmRleCA9IChJUDJfUE9SVFNfUEVSX0JPQVJEICogYm9hcmRudW0pICsgaTsKKwkJcENoKys7CisJfQorZXhfZXhpdDoKKwlJTklUX1dPUksoJnBCLT50cXVldWVfaW50ZXJydXB0LCAodm9pZCgqKSh2b2lkKikpIGlwMl9pbnRlcnJ1cHRfYmgsIHBCKTsKKwlyZXR1cm47CisKK2Vycl9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpcDJjb25maWcuYWRkcltib2FyZG51bV0sIDgpOworZXJyX2luaXRpYWxpemU6CisJa2ZyZWUgKCBwQiApOworCWkyQm9hcmRQdHJUYWJsZVtib2FyZG51bV0gPSBOVUxMOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGZpbmRfZWlzYV9ib2FyZCAoIGludCBzdGFydF9zbG90ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBGaXJzdCBzbG90IHRvIGNoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgQWRkcmVzcyBvZiBFSVNBIEludGVsbGlQb3J0IElJIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW4gRUlTQSBJbnRlbGxpUG9ydCBjb250cm9sbGVyLCBzdGFydGluZyAgICAgICAgKi8KKy8qIGZyb20gdGhlIHNwZWNpZmllZCBzbG90IG51bWJlci4gSWYgdGhlIG1vdGhlcmJvYXJkIGlzIG5vdCBpZGVudGlmaWVkIGFzIGFuICovCisvKiBFSVNBIG1vdGhlcmJvYXJkLCBvciBubyB2YWxpZCBib2FyZCBJRCBpcyBzZWxlY3RlZCBpdCByZXR1cm5zIDAuIE90aGVyd2lzZSAqLworLyogaXQgcmV0dXJucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0CitmaW5kX2Vpc2FfYm9hcmQoIGludCBzdGFydF9zbG90ICkKK3sKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgaWRtID0gMDsKKwl1bnNpZ25lZCBpbnQgaWRwID0gMDsKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IDA7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWludCBzZXR1cF9hZGRyZXNzOworCWludCBzZXR1cF9pcnE7CisJaW50IGlzbWluZSA9IDA7CisKKwkvKgorCSAqIEZpcnN0IGEgY2hlY2sgZm9yIGFuIEVJU0EgbW90aGVyYm9hcmQsIHdoaWNoIHdlIGRvIGJ5IGNvbXBhcmluZyB0aGUKKwkgKiBFSVNBIElEIHJlZ2lzdGVycyBmb3IgdGhlIHN5c3RlbSBib2FyZCBhbmQgdGhlIGZpcnN0IGNvdXBsZSBvZiBzbG90cy4KKwkgKiBObyBzbG90IElEIHNob3VsZCBtYXRjaCB0aGUgc3lzdGVtIGJvYXJkIElELCBidXQgb24gYW4gSVNBIG9yIFBDSQorCSAqIG1hY2hpbmUgdGhlIG9kZHMgYXJlIHRoYXQgYW4gZW1wdHkgYnVzIHdpbGwgcmV0dXJuIHNpbWlsYXIgdmFsdWVzIGZvcgorCSAqIGVhY2ggc2xvdC4KKwkgKi8KKwlpID0gMHgwYzgwOworCXZhbHVlID0gKGluYihpKSA8PCAyNCkgKyAoaW5iKGkrMSkgPDwgMTYpICsgKGluYihpKzIpIDw8IDgpICsgaW5iKGkrMyk7CisJZm9yKCBpID0gMHgxYzgwOyBpIDw9IDB4NGM4MDsgaSArPSAweDEwMDAgKSB7CisJCWogPSAoaW5iKGkpPDwyNCkrKGluYihpKzEpPDwxNikrKGluYihpKzIpPDw4KStpbmIoaSszKTsKKwkJaWYgKCB2YWx1ZSA9PSBqICkKKwkJCXJldHVybiAwOworCX0KKworCS8qCisJICogT0ssIHNvIHdlIGFyZSBpbmNsaW5lZCB0byBiZWxpZXZlIHRoYXQgdGhpcyBpcyBhbiBFSVNBIG1hY2hpbmUuIEZpbmQKKwkgKiBhbiBJbnRlbGxpUG9ydCBjb250cm9sbGVyLgorCSAqLworCWZvciggaSA9IHN0YXJ0X3Nsb3Q7IGkgPCAxNjsgaSsrICkgeworCQliYXNlID0gaSA8PCAxMjsKKwkJaWRtID0gKGluYihiYXNlICsgMHhjODApIDw8IDgpIHwgKGluYihiYXNlICsgMHhjODEpICYgMHhmZik7CisJCWlkcCA9IChpbmIoYmFzZSArIDB4YzgyKSA8PCA4KSB8IChpbmIoYmFzZSArIDB4YzgzKSAmIDB4ZmYpOworCQlpc21pbmUgPSAwOworCQlpZiAoIGlkbSA9PSAweDBlOGUgKSB7CisJCQlpZiAoIGlkcCA9PSAweDAyODEgfHwgaWRwID09IDB4MDIxOCApIHsKKwkJCQlpc21pbmUgPSAxOworCQkJfSBlbHNlIGlmICggaWRwID09IDB4MDI4MiB8fCBpZHAgPT0gMHgwMjgzICkgeworCQkJCWlzbWluZSA9IDM7CS8qIENhbiBkbyBlZGdlLXRyaWdnZXIgKi8KKwkJCX0KKwkJCWlmICggaXNtaW5lICkgeworCQkJCUVpc2Ffc2xvdCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCAhaXNtaW5lICkKKwkJcmV0dXJuIDA7CisKKwkvKiBJdCdzIHNvbWUgc29ydCBvZiBFSVNBIGNhcmQsIGJ1dCBhdCB3aGF0IGFkZHJlc3MgaXMgaXQgY29uZmlndXJlZD8gKi8KKworCXNldHVwX2FkZHJlc3MgPSBiYXNlICsgMHhjODg7CisJdmFsdWUgPSBpbmIoYmFzZSArIDB4Yzg2KTsKKwlzZXR1cF9pcnEgPSAodmFsdWUgJiA4KSA/IFZhbGlkX0lycXNbdmFsdWUgJiA3XSA6IDA7CisKKwlpZiAoIChpc21pbmUgJiAyKSAmJiAhKHZhbHVlICYgMHgxMCkgKSB7CisJCWlzbWluZSA9IDE7CS8qIENvdWxkIGJlIGVkZ2luZywgYnV0IG5vdCAqLworCX0KKworCWlmICggRWlzYV9pcnEgPT0gMCApIHsKKwkJRWlzYV9pcnEgPSBzZXR1cF9pcnE7CisJfSBlbHNlIGlmICggRWlzYV9pcnEgIT0gc2V0dXBfaXJxICkgeworCQlwcmludGsgKCBLRVJOX0VSUiAiSVAyOiBFSVNBIGlycSBtaXNtYXRjaCBiZXR3ZWVuIEVJU0EgY29udHJvbGxlcnNcbiIgKTsKKwl9CisKKyNpZmRlZiBJUDJERUJVR19JTklUCitwcmludGsoS0VSTl9ERUJVRyAiQ29tcHV0b25lIEVJU0EgYm9hcmQgaW4gc2xvdCAlZCwgSS5ELiAweCV4JXgsIEFkZHJlc3MgMHgleCIsCisJICAgICAgIGJhc2UgPj4gMTIsIGlkbSwgaWRwLCBzZXR1cF9hZGRyZXNzKTsKKwlpZiAoIEVpc2FfaXJxICkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLCBJbnRlcnJ1cHQgJWQgJXNcbiIsCisJCSAgICAgICBzZXR1cF9pcnEsIChpc21pbmUgJiAyKSA/ICIoZWRnZSkiIDogIihsZXZlbCkiKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLCAocG9sbGVkKVxuIik7CisJfQorI2VuZGlmCisJcmV0dXJuIHNldHVwX2FkZHJlc3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBzZXRfaXJxKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogaW5kZXggdG8gYm9hcmQgaW4gYm9hcmQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIElSUSB0byB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBTdWNjZXNzICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NldF9pcnEoIGludCBib2FyZG51bSwgaW50IGJvYXJkSXJxICkKK3sKKwl1bnNpZ25lZCBjaGFyIHRlbXBDb21tYW5kWzE2XTsKKwlpMmVCb3JkU3RyUHRyIHBCID0gaTJCb2FyZFB0clRhYmxlW2JvYXJkbnVtXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBOb3RpZnkgdGhlIGJvYXJkcyB0aGV5IG1heSBnZW5lcmF0ZSBpbnRlcnJ1cHRzLiBUaGlzIGlzIGRvbmUgYnkKKwkgKiBzZW5kaW5nIGFuIGluLWxpbmUgY29tbWFuZCB0byBjaGFubmVsIDAgb24gZWFjaCBib2FyZC4gVGhpcyBpcyB3aHkKKwkgKiB0aGUgY2hhbm5lbHMgaGF2ZSB0byBiZSBkZWZpbmVkIGFscmVhZHkuIEZvciBlYWNoIGJvYXJkLCBpZiB0aGUKKwkgKiBpbnRlcnJ1cHQgaGFzIG5ldmVyIGJlZW4gZGVmaW5lZCwgd2UgbXVzdCBkbyBzbyBOT1csIGRpcmVjdGx5LCBzaW5jZQorCSAqIGJvYXJkIHdpbGwgbm90IHNlbmQgZmxvdyBjb250cm9sIG9yIGV2ZW4gZ2l2ZSBhbiBpbnRlcnJ1cHQgdW50aWwgdGhpcworCSAqIGlzIGRvbmUuICBJZiBwb2xsaW5nIHdlIG11c3Qgc2VuZCAwIGFzIHRoZSBpbnRlcnJ1cHQgcGFyYW1ldGVyLgorCSAqLworCisJLy8gV2Ugd2lsbCBnZXQgYW4gaW50ZXJydXB0IGhlcmUgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uCisKKwlpaURpc2FibGVNYWlsSXJxKHBCKTsKKworCS8qIFdlIGJ1aWxkIHVwIHRoZSBlbnRpcmUgcGFja2V0IGhlYWRlci4gKi8KKwlDSEFOTkVMX09GKHRlbXBDb21tYW5kKSA9IDA7CisJUFRZUEVfT0YodGVtcENvbW1hbmQpID0gUFRZUEVfSU5MSU5FOworCUNNRF9DT1VOVF9PRih0ZW1wQ29tbWFuZCkgPSAyOworCShDTURfT0YodGVtcENvbW1hbmQpKVswXSA9IENNRFZBTFVFX0lSUTsKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbMV0gPSBib2FyZElycTsKKwkvKgorCSAqIFdyaXRlIHRvIEZJRk87IGRvbid0IGJvdGhlciB0byBhZGp1c3QgZmlmbyBjYXBhY2l0eSBmb3IgdGhpcywgc2luY2UKKwkgKiBib2FyZCB3aWxsIHJlc3BvbmQgYWxtb3N0IGltbWVkaWF0ZWx5IGFmdGVyIFNlbmRNYWlsIGhpdC4KKwkgKi8KKwlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwlpaVdyaXRlQnVmKHBCLCB0ZW1wQ29tbWFuZCwgNCk7CisJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwlwQi0+aTJlVXNpbmdJcnEgPSBib2FyZElycTsKKwlwQi0+aTJlT3V0TWFpbFdhaXRpbmcgfD0gTUJfT1VUX1NUVUZGRUQ7CisKKwkvKiBOZWVkIHRvIHVwZGF0ZSBudW1iZXIgb2YgYm9hcmRzIGJlZm9yZSB5b3UgZW5hYmxlIG1haWxib3ggaW50ICovCisJKytpMm5Cb2FyZHM7CisKKwlDSEFOTkVMX09GKHRlbXBDb21tYW5kKSA9IDA7CisJUFRZUEVfT0YodGVtcENvbW1hbmQpID0gUFRZUEVfQllQQVNTOworCUNNRF9DT1VOVF9PRih0ZW1wQ29tbWFuZCkgPSA2OworCShDTURfT0YodGVtcENvbW1hbmQpKVswXSA9IDg4OwkvLyBTSUxPCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzFdID0gNjQ7CS8vIGNoYXJzCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzJdID0gMzI7CS8vIG1zCisKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbM10gPSAyODsJLy8gTUFYX0JMT0NLCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzRdID0gNjQ7CS8vIGNoYXJzCisKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbNV0gPSA4NzsJLy8gSFdfVEVTVAorCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcEItPndyaXRlX2ZpZm9fc3BpbmxvY2ssZmxhZ3MpOworCWlpV3JpdGVCdWYocEIsIHRlbXBDb21tYW5kLCA4KTsKKwlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPndyaXRlX2ZpZm9fc3BpbmxvY2ssZmxhZ3MpOworCisJQ0hBTk5FTF9PRih0ZW1wQ29tbWFuZCkgPSAwOworCVBUWVBFX09GKHRlbXBDb21tYW5kKSA9IFBUWVBFX0JZUEFTUzsKKwlDTURfQ09VTlRfT0YodGVtcENvbW1hbmQpID0gMTsKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbMF0gPSA4NDsJLyogZ2V0IEJPWF9JRFMgKi8KKwlpaVdyaXRlQnVmKHBCLCB0ZW1wQ29tbWFuZCwgMyk7CisKKyNpZmRlZiBYWFgKKwkvLyBlbmFibGUgaGVhcnRiZWF0IGZvciB0ZXN0IHBvcnBvaXNlcworCUNIQU5ORUxfT0YodGVtcENvbW1hbmQpID0gMDsKKwlQVFlQRV9PRih0ZW1wQ29tbWFuZCkgPSBQVFlQRV9CWVBBU1M7CisJQ01EX0NPVU5UX09GKHRlbXBDb21tYW5kKSA9IDI7CisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzBdID0gNDQ7CS8qIGdldCBwaW5nICovCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzFdID0gMjAwOwkvKiAyMDAgbXMgKi8KKwlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwlpaVdyaXRlQnVmKHBCLCB0ZW1wQ29tbWFuZCwgNCk7CisJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKyNlbmRpZgorCisJaWlFbmFibGVNYWlsSXJxKHBCKTsKKwlpaVNlbmRQZW5kaW5nTWFpbChwQik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgSGFuZGxlciBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXJ2aWNlX2FsbF9ib2FyZHModm9pZCkKK3sKKwlpbnQgaTsKKwlpMmVCb3JkU3RyUHRyICBwQjsKKworCS8qIFNlcnZpY2UgZXZlcnkgYm9hcmQgb24gdGhlIGxpc3QgKi8KKwlmb3IoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJcEIgPSBpMkJvYXJkUHRyVGFibGVbaV07CisJCWlmICggcEIgKSB7CisJCQlpMlNlcnZpY2VCb2FyZCggcEIgKTsKKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2ludGVycnVwdF9iaChwQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKglTZXJ2aWNlIHRoZSBib2FyZCBpbiBhIGJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGVuICAgICAgICAgKi8KKy8qCXJlZW5hYmxlIHRoZSBib2FyZCdzIGludGVycnVwdHMgaWYgaXQgaGFzIGFuIElSUSBudW1iZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2ludGVycnVwdF9iaChpMmVCb3JkU3RyUHRyIHBCKQoreworLy8JcEIgYmV0dGVyIHdlbGwgYmUgc2V0IG9yIHdlIGhhdmUgYSBwcm9ibGVtISAgV2UgY2FuIG9ubHkgZ2V0CisvLwloZXJlIGZyb20gdGhlIElNTUVESUFURSBxdWV1ZS4gIEhlcmUsIHdlIHByb2Nlc3MgdGhlIGJvYXJkcy4KKy8vCUNoZWNraW5nIHBCIGRvZXNuJ3QgY29zdCBtdWNoIGFuZCBpdCBzYXZlcyB1cyBmcm9tIHRoZSBzYW5pdHkgY2hlY2tlcnMuCisKKwliaF9jb3VudGVyKys7IAorCisJaWYgKCBwQiApIHsKKwkJaTJTZXJ2aWNlQm9hcmQoIHBCICk7CisJCWlmKCBwQi0+aTJlVXNpbmdJcnEgKSB7CisvLwkJCVJlLWVuYWJsZSBoaXMgaW50ZXJydXB0cworCQkJaWlFbmFibGVNYWlsSXJxKHBCKTsKKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykgICAgKi8KKy8qIFBhcmFtZXRlcnM6IGlycSAtIGludGVycnVwdCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBwb2ludGVyIHRvIG9wdGlvbmFsIGRldmljZSBJRCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgcG9pbnRlciB0byByZWdpc3RlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKglPdXIgdGFzayBoZXJlIGlzIHNpbXBseSB0byBpZGVudGlmeSBlYWNoIGJvYXJkIHdoaWNoIG5lZWRzIHNlcnZpY2luZy4gKi8KKy8qCUlmIHdlIGFyZSBxdWV1aW5nIHRoZW4sIHF1ZXVlIGl0IHRvIGJlIHNlcnZpY2VkLCBhbmQgZGlzYWJsZSBpdHMgaXJxICAqLworLyoJbWFzayBvdGhlcndpc2UgcHJvY2VzcyB0aGUgYm9hcmQgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoJV2UgY291bGQgcXVldWUgYnkgSVJRIGJ1dCB0aGF0IGp1c3QgY29tcGxpY2F0ZXMgdGhpbmdzIG9uIGJvdGggZW5kcyAgICovCisvKgl3aXRoIHZlcnkgbGl0dGxlIGdhaW4gaW4gcGVyZm9ybWFuY2UgKGhvdyBtYW55IGluc3RydWN0aW9ucyBkb2VzICAgICAgKi8KKy8qCWl0IHRha2UgdG8gaXRlcmF0ZSBvbiB0aGUgaW1tZWRpYXRlIHF1ZXVlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90CitpcDJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCWkyZUJvcmRTdHJQdHIgIHBCOworCWludCBoYW5kbGVkID0gMDsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5UUiwgOTksIDEsIGlycSApOworCisJLyogU2VydmljZSBqdXN0IHRoZSBib2FyZHMgb24gdGhlIGxpc3QgdXNpbmcgdGhpcyBpcnEgKi8KKwlmb3IoIGkgPSAwOyBpIDwgaTJuQm9hcmRzOyArK2kgKSB7CisJCXBCID0gaTJCb2FyZFB0clRhYmxlW2ldOworCisvLwkJT25seSBwcm9jZXNzIHRob3NlIGJvYXJkcyB3aGljaCBtYXRjaCBvdXIgSVJRLgorLy8JCQlJUlEgPSAwIGZvciBwb2xsZWQgYm9hcmRzLCB3ZSB3b24ndCBwb2xsICJJUlEiIGJvYXJkcworCisJCWlmICggcEIgJiYgKHBCLT5pMmVVc2luZ0lycSA9PSBpcnEpICkgeworCQkJaGFuZGxlZCA9IDE7CisjaWZkZWYgVVNFX0lRSQorCisJCSAgICBpZiAoTk9fTUFJTF9IRVJFICE9ICggcEItPmkyZVN0YXJ0TWFpbCA9IGlpR2V0TWFpbChwQikpKSB7CisvLwkJCURpc2FibGUgaGlzIGludGVycnVwdCAod2lsbCBiZSBlbmFibGVkIHdoZW4gc2VydmljZWQpCisvLwkJCVRoaXMgaXMgbW9zdGx5IHRvIHByb3RlY3QgZnJvbSByZWVudHJhbmN5LgorCQkJaWlEaXNhYmxlTWFpbElycShwQik7CisKKy8vCQkJUGFyayB0aGUgYm9hcmQgb24gdGhlIGltbWVkaWF0ZSBxdWV1ZSBmb3IgcHJvY2Vzc2luZy4KKwkJCXNjaGVkdWxlX3dvcmsoJnBCLT50cXVldWVfaW50ZXJydXB0KTsKKworLy8JCQlNYWtlIHN1cmUgdGhlIGltbWVkaWF0ZSBxdWV1ZSBpcyBmbGFnZ2VkIHRvIGZpcmUuCisJCSAgICB9CisjZWxzZQorLy8JCVdlIGFyZSB1c2luZyBpbW1lZGlhdGUgc2VydmljaW5nIGhlcmUuICBUaGlzIHN1Y2tzIGFuZCBjYW4KKy8vCQljYXVzZSBhbGwgc29ydHMgb2YgaGF2b2Mgd2l0aCBwcHAgYW5kIG90aGVycy4gIFRoZSBmYWlsc2FmZQorLy8JCWNoZWNrIG9uIGlpU2VuZFBlbmRpbmdNYWlsIGNvdWxkIGFsc28gdGhyb3cgYSBoYWlyYmFsbC4KKwkJCWkyU2VydmljZUJvYXJkKCBwQiApOworI2VuZGlmIC8qIFVTRV9JUUkgKi8KKwkJfQorCX0KKworCSsraXJxX2NvdW50ZXI7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIElUUkNfUkVUVVJOLCAwICk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfcG9sbCh1bnNpZ25lZCBsb25nIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGxpYnJhcnkgcm91dGluZSBpMlNlcnZpY2VCb2FyZCBmb3IgZWFjaCBib2FyZCBpbiAgICovCisvKiB0aGUgYm9hcmQgdGFibGUuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aGVuIHBvbGxlZCAqLworLyogbW9kZSBpcyBzcGVjaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTlRSLCAxMDAsIDAgKTsKKworCVRpbWVyT24gPSAwOyAvLyBpdCdzIHRoZSB0cnV0aCBidXQgbm90IGNoZWNrZWQgaW4gc2VydmljZQorCisJLy8gSnVzdCBwb2xsZWQgYm9hcmRzLCBJUlEgPSAwIHdpbGwgaGl0IGFsbCBub24taW50ZXJydXB0IGJvYXJkcy4KKwkvLyBJdCB3aWxsIE5PVCBwb2xsIGJvYXJkcyBoYW5kbGVkIGJ5IGhhcmQgaW50ZXJydXB0cy4KKwkvLyBUaGUgaXNzdWUgb2YgcXVldWVkIEJIIGludGVycnVwcyBpcyBoYW5kbGVkIGluIGlwMl9pbnRlcnJ1cHQoKS4KKwlpcDJfaW50ZXJydXB0KDAsIE5VTEwsIE5VTEwpOworCisJUG9sbFRpbWVyLmV4cGlyZXMgPSBQT0xMX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCAmUG9sbFRpbWVyICk7CisJVGltZXJPbiA9IDE7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIElUUkNfUkVUVVJOLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2lucHV0KHZvaWQgKnApCit7CisJaTJDaGFuU3RyUHRyIHBDaCA9IHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlwMnRyYWNlKENIQU5OLCBJVFJDX0lOUFVULCAyMSwgMCApOworCisJLy8gRGF0YSBpbnB1dAorCWlmICggcENoLT5wVFRZICE9IE5VTEwgKSB7CisJCVJFQURfTE9DS19JUlFTQVZFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpCisJCWlmICghcENoLT50aHJvdHRsZWQgJiYgKHBDaC0+SWJ1Zl9zdHVmZiAhPSBwQ2gtPklidWZfc3RyaXApKSB7CisJCQlSRUFEX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpCisJCQlpMklucHV0KCBwQ2ggKTsKKwkJfSBlbHNlCisJCQlSRUFEX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpCisJfSBlbHNlIHsKKwkJaXAydHJhY2UoQ0hBTk4sIElUUkNfSU5QVVQsIDIyLCAwICk7CisKKwkJaTJJbnB1dEZsdXNoKCBwQ2ggKTsKKwl9Cit9CisKKy8vIGNvZGUgZHVwbGljYXRlZCBmcm9tIG5fdHR5IChsZGlzYykKK3N0YXRpYyBpbmxpbmUgdm9pZCAgaXNpZyhpbnQgc2lnLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgZmx1c2gpCit7CisJaWYgKHR0eS0+cGdycCA+IDApCisJCWtpbGxfcGcodHR5LT5wZ3JwLCBzaWcsIDEpOworCWlmIChmbHVzaCB8fCAhTF9OT0ZMU0godHR5KSkgeworCQlpZiAoIHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyICkgIAorCQkJdHR5LT5sZGlzYy5mbHVzaF9idWZmZXIodHR5KTsKKwkJaTJJbnB1dEZsdXNoKCB0dHktPmRyaXZlcl9kYXRhICk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19zdGF0dXModm9pZCAqcCkKK3sKKwlpMkNoYW5TdHJQdHIgcENoID0gcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gIGkyR2V0U3RhdHVzKCBwQ2gsIChJMl9CUkt8STJfUEFSfEkyX0ZSQXxJMl9PVlIpICk7CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU1RBVFVTLCAyMSwgMSwgc3RhdHVzICk7CisKKwlpZiAocENoLT5wVFRZICYmIChzdGF0dXMgJiAoSTJfQlJLfEkyX1BBUnxJMl9GUkF8STJfT1ZSKSkgKSB7CisJCWlmICggKHN0YXR1cyAmIEkyX0JSSykgKSB7CisJCQkvLyBjb2RlIGR1cGxpY2F0ZWQgZnJvbSBuX3R0eSAobGRpc2MpCisJCQlpZiAoSV9JR05CUksocENoLT5wVFRZKSkKKwkJCQlnb3RvIHNraXBfdGhpczsKKwkJCWlmIChJX0JSS0lOVChwQ2gtPnBUVFkpKSB7CisJCQkJaXNpZyhTSUdJTlQsIHBDaC0+cFRUWSwgMSk7CisJCQkJZ290byBza2lwX3RoaXM7CisJCQl9CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBDaC0+cFRUWS0+cmVhZF93YWl0KTsKKwkJfQorI2lmZGVmIE5FVkVSX0hBUFBFTlNfQVNfU0VUVVBfWFhYCisJLy8gYW5kIGNhbid0IHdvcmsgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZV9jaGFyCisJLy8gYXMgdGhlX2NoYXIgaXMgcmVwb3J0ZWQgb24gYSBzZXBhcmF0ZSBwYXRoCisJLy8gVGhlIGludGVsbGlnZW50IGJvYXJkIGRvZXMgdGhpcyBzdHVmZiBhcyBzZXR1cAorCXsKKwljaGFyIGJya2YgPSBUVFlfTk9STUFMOworCXVuc2lnbmVkIGNoYXIgYnJrYyA9ICdcMCc7CisJdW5zaWduZWQgY2hhciB0bXA7CisJCWlmICggKHN0YXR1cyAmIEkyX0JSSykgKSB7CisJCQlicmtmID0gVFRZX0JSRUFLOworCQkJYnJrYyA9ICdcMCc7CisJCX0gCisJCWVsc2UgaWYgKHN0YXR1cyAmIEkyX1BBUikgeworCQkJYnJrZiA9IFRUWV9QQVJJVFk7CisJCQlicmtjID0gdGhlX2NoYXI7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSTJfRlJBKSB7CisJCQlicmtmID0gVFRZX0ZSQU1FOworCQkJYnJrYyA9IHRoZV9jaGFyOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEkyX09WUikgeworCQkJYnJrZiA9IFRUWV9PVkVSUlVOOworCQkJYnJrYyA9IHRoZV9jaGFyOworCQl9CisJCXRtcCA9IHBDaC0+cFRUWS0+cmVhbF9yYXc7CisJCXBDaC0+cFRUWS0+cmVhbF9yYXcgPSAwOworCQlwQ2gtPnBUVFktPmxkaXNjLnJlY2VpdmVfYnVmKCBwQ2gtPnBUVFksICZicmtjLCAmYnJrZiwgMSApOworCQlwQ2gtPnBUVFktPnJlYWxfcmF3ID0gdG1wOworCX0KKyNlbmRpZiAvKiBORVZFUl9IQVBQRU5TX0FTX1NFVFVQX1hYWCAqLworCX0KK3NraXBfdGhpczoKKworCWlmICggc3RhdHVzICYgKEkyX0REQ0QgfCBJMl9ERFNSIHwgSTJfRENUUyB8IEkyX0RSSSkgKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcENoLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJaWYgKCAocENoLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgSTJfRERDRCkgKSB7CisJCQlpZiAoIHN0YXR1cyAmIEkyX0RDRCApIHsKKwkJCQlpZiAoIHBDaC0+d29wZW4gKSB7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoICZwQ2gtPm9wZW5fd2FpdCApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBDaC0+cFRUWSAmJiAgKCEocENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkgKSB7CisJCQkJCXR0eV9oYW5ndXAoIHBDaC0+cFRUWSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19TVEFUVVMsIDI2LCAwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgT3Blbi9DbG9zZS9Jb2N0bCBFbnRyeSBQb2ludCBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIG9wZW5fc2FuaXR5X2NoZWNrKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFZlcmlmaWVzIHRoZSBzdHJ1Y3R1cmUgbWFnaWMgbnVtYmVycyBhbmQgY3Jvc3MgbGlua3MuICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIElQMkRFQlVHX09QRU4KK3N0YXRpYyB2b2lkIAorb3Blbl9zYW5pdHlfY2hlY2soIGkyQ2hhblN0clB0ciBwQ2gsIGkyZUJvcmRTdHJQdHIgcEJyZCApCit7CisJaWYgKCBwQnJkLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMgKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBpbnZhbGlkIGJvYXJkIHN0cnVjdHVyZVxuIiApOworCX0gZWxzZSBpZiAoIHBCcmQgIT0gcENoLT5wTXlCb3JkICkgeworCQlwcmludGsoS0VSTl9FUlIgIklQMjogYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgbWlzbWF0Y2ggKCVwKVxuIiwKKwkJCSBwQ2gtPnBNeUJvcmQgKTsKKwl9IGVsc2UgaWYgKCBwQnJkLT5pMmVDaGFubmVsQ250IDwgcENoLT5wb3J0X2luZGV4ICkgeworCQlwcmludGsoS0VSTl9FUlIgIklQMjogYmFkIGRldmljZSBpbmRleCAoJWQpXG4iLCBwQ2gtPnBvcnRfaW5kZXggKTsKKwl9IGVsc2UgaWYgKCYoKGkyQ2hhblN0clB0cilwQnJkLT5pMmVDaGFubmVsUHRyKVtwQ2gtPnBvcnRfaW5kZXhdICE9IHBDaCkgeworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIklQMjogYWxsIHBvaW50ZXJzIGNoZWNrIG91dCFcbiIgKTsKKwl9Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX29wZW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBQb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyBvciBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogKE1BTkRBVE9SWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQSBzdWNjZXNzZnVsIGRldmljZSBvcGVuIGhhcyB0byBydW4gYSBnYXVudGxldCBvZiBjaGVja3MgYmVmb3JlIGl0ICAgICAgICAgKi8KKy8qIGNvbXBsZXRlcy4gQWZ0ZXIgc29tZSBzYW5pdHkgY2hlY2tpbmcgYW5kIHBvaW50ZXIgc2V0dXAsIHRoZSBmdW5jdGlvbiAgICAgICovCisvKiBibG9ja3MgdW50aWwgYWxsIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZC4gSXQgdGhlbiBpbml0aWFsaXNlcyB0aGUgcG9ydCB0byAqLworLyogdGhlIGRlZmF1bHQgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXR1cm5zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfb3BlbiggUFRUWSB0dHksIHN0cnVjdCBmaWxlICpwRmlsZSApCit7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaW50IHJjID0gMDsKKwlpbnQgZG9fY2xvY2FsID0gMDsKKwlpMkNoYW5TdHJQdHIgIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisJaXAydHJhY2UgKHR0eS0+aW5kZXgsIElUUkNfT1BFTiwgSVRSQ19FTlRFUiwgMCApOworCisJaWYgKCBwQ2ggPT0gTlVMTCApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIFNldHVwIHBvaW50ZXIgbGlua3MgaW4gZGV2aWNlIGFuZCB0dHkgc3RydWN0dXJlcyAqLworCXBDaC0+cFRUWSA9IHR0eTsKKwl0dHktPmRyaXZlcl9kYXRhID0gcENoOworCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0RFQlVHIFwKKwkJCSJJUDI6b3Blbih0dHk9JXAscEZpbGU9JXApOmRldj0lcyxjaD0lZCxpZHg9JWRcbiIsCisJICAgICAgIHR0eSwgcEZpbGUsIHR0eS0+bmFtZSwgcENoLT5pbmZsLmhkLmkyc0NoYW5uZWwsIHBDaC0+cG9ydF9pbmRleCk7CisJb3Blbl9zYW5pdHlfY2hlY2sgKCBwQ2gsIHBDaC0+cE15Qm9yZCApOworI2VuZGlmCisKKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMywgQ01EX0RUUlVQLENNRF9SVFNVUCxDTURfRENEX1JFUCk7CisJcENoLT5kYXRhU2V0T3V0IHw9IChJMl9EVFIgfCBJMl9SVFMpOworCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBDaC0+cE15Qm9yZCApOworCisJLyogQmxvY2sgaGVyZSB1bnRpbCB0aGUgcG9ydCBpcyByZWFkeSAocGVyIHNlcmlhbCBhbmQgaXN0YWxsaW9uKSAqLworCS8qCisJICogMS4gSWYgdGhlIHBvcnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjbG9zaW5nIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uCisJICogICAgYW5kIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBlcnJvci4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJnBDaC0+Y2xvc2Vfd2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCWlmICggdHR5X2h1bmdfdXBfcChwRmlsZSkgfHwgKCBwQ2gtPmZsYWdzICYgQVNZTkNfQ0xPU0lORyApKSB7CisJCWlmICggcENoLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcgKSB7CisJCQlzY2hlZHVsZSgpOworCQl9CisJCWlmICggdHR5X2h1bmdfdXBfcChwRmlsZSkgKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5jbG9zZV93YWl0LCAmd2FpdCk7CisJCQlyZXR1cm4oIHBDaC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZICkgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5jbG9zZV93YWl0LCAmd2FpdCk7CisKKwkvKgorCSAqIDMuIEhhbmRsZSBhIG5vbi1ibG9ja2luZyBvcGVuIG9mIGEgbm9ybWFsIHBvcnQuCisJICovCisJaWYgKCAocEZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxPDxUVFlfSU9fRVJST1IpICkpIHsKKwkJcENoLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlnb3RvIG5vYmxvY2s7CisJfQorCS8qCisJICogNC4gTm93IGxvb3Agd2FpdGluZyBmb3IgdGhlIHBvcnQgdG8gYmUgZnJlZSBhbmQgY2FycmllciBwcmVzZW50CisJICogICAgKGlmIHJlcXVpcmVkKS4KKwkgKi8KKwlpZiAoIHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCApCisJCWRvX2Nsb2NhbCA9IDE7CisKKyNpZmRlZiBJUDJERUJVR19PUEVOCisJcHJpbnRrKEtFUk5fREVCVUcgIk9wZW5CbG9jazogZG9fY2xvY2FsID0gJWRcbiIsIGRvX2Nsb2NhbCk7CisjZW5kaWYKKworCSsrcENoLT53b3BlbjsKKworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmcENoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCWZvcig7OykgeworCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMiwgQ01EX0RUUlVQLCBDTURfUlRTVVApOworCQlwQ2gtPmRhdGFTZXRPdXQgfD0gKEkyX0RUUiB8IEkyX1JUUyk7CisJCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKwkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCWlmICggdHR5X2h1bmdfdXBfcChwRmlsZSkgKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJCXJldHVybiAoIHBDaC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZICkgPyAtRUJVU1kgOiAtRVJFU1RBUlRTWVM7CisJCX0KKwkJaWYgKCEocENoLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIAorCQkJCShkb19jbG9jYWwgfHwgKHBDaC0+ZGF0YVNldEluICYgSTJfRENEKSApKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCQlwcmludGsoS0VSTl9ERUJVRyAiQVNZTkNfQ0xPU0lORyA9ICVzXG4iLAorCQkJKHBDaC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKT8iVHJ1ZSI6IkZhbHNlIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJPcGVuQmxvY2s6IHdhaXRpbmcgZm9yIENEIG9yIHNpZ25hbFxuIik7CisjZW5kaWYKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09QRU4sIDMsIDIsIDAsCisJCQkJKHBDaC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSApOworCQkvKiBjaGVjayBmb3Igc2lnbmFsICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAoKCBwQ2gtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSApID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBDaC0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwktLXBDaC0+d29wZW47IC8vd2h5IGNvdW50PworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX09QRU4sIDQsIDAgKTsKKworCWlmIChyYyAhPSAwICkgeworCQlyZXR1cm4gcmM7CisJfQorCXBDaC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworbm9ibG9jazoKKworCS8qIGZpcnN0IG9wZW4gLSBBc3NpZ24gdGVybWlvcyBzdHJ1Y3R1cmUgdG8gcG9ydCAqLworCWlmICggdHR5LT5jb3VudCA9PSAxICkgeworCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDAsIDIsIENNRF9DVFNGTF9EU0FCLCBDTURfUlRTRkxfRFNBQik7CisJCS8qIE5vdyB3ZSBtdXN0IHNlbmQgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgdG8gdGhlIGxvYWR3YXJlICovCisJCXNldF9wYXJhbXMoIHBDaCwgTlVMTCApOworCX0KKworCS8qCisJICogTm93IHNldCBhbnkgaTJsaWIgb3B0aW9ucy4gVGhlc2UgbWF5IGdvIGF3YXkgaWYgdGhlIGkybGliIGNvZGUgZW5kcworCSAqIHVwIHJvbGxlZCBpbnRvIHRoZSBtYWlubGluZS4KKwkgKi8KKwlwQ2gtPmNoYW5uZWxPcHRpb25zIHw9IENPX05CTE9DS19XUklURTsKKworI2lmZGVmIElQMkRFQlVHX09QRU4KKwlwcmludGsgKEtFUk5fREVCVUcgIklQMjogb3BlbiBjb21wbGV0ZWRcbiIgKTsKKyNlbmRpZgorCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBDaC0+cE15Qm9yZCApOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX09QRU4sIElUUkNfUkVUVVJOLCAwICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9jbG9zZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcDJfY2xvc2UoIFBUVFkgdHR5LCBzdHJ1Y3QgZmlsZSAqcEZpbGUgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICggIXBDaCApIHsKKwkJcmV0dXJuOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19DTE9TRSwgSVRSQ19FTlRFUiwgMCApOworCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0RFQlVHICJJUDI6Y2xvc2UgJXM6XG4iLHR0eS0+bmFtZSk7CisjZW5kaWYKKworCWlmICggdHR5X2h1bmdfdXBfcCAoIHBGaWxlICkgKSB7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0NMT1NFLCAyLCAxLCAyICk7CisKKwkJcmV0dXJuOworCX0KKwlpZiAoIHR0eS0+Y291bnQgPiAxICkgeyAvKiBub3QgdGhlIGxhc3QgY2xvc2UgKi8KKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfQ0xPU0UsIDIsIDEsIDMgKTsKKworCQlyZXR1cm47CisJfQorCXBDaC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsJLy8gbGFzdCBjbG9zZSBhY3R1YWxseQorCisJdHR5LT5jbG9zaW5nID0gMTsKKworCWlmIChwQ2gtPkNsb3NpbmdXYWl0VGltZSAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgdHJhbnNtaXR0ZXIgaGFzIGNvbXBsZXRlbHkgZHJhaW5lZC4KKwkJICogVGhpcyB1c2VzIGFuIHRpbWVvdXQsIGFmdGVyIHdoaWNoIHRoZSBjbG9zZQorCQkgKiBjb21wbGV0ZXMuCisJCSAqLworCQlpcDJfd2FpdF91bnRpbF9zZW50KHR0eSwgcENoLT5DbG9zaW5nV2FpdFRpbWUgKTsKKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiBIZXJlIHdlIGZsdXNoIHRoZSBjaGFubmVsCisJICogaW5wdXQgYnVmZmVyIHdoaWNoIHdpbGwgYWxsb3cgdGhlIGJvYXJkIHRvIHNlbmQgdXAgbW9yZSBkYXRhLiBBbnkKKwkgKiBhZGRpdGlvbmFsIGlucHV0IGlzIHRvc3NlZCBhdCBpbnRlcnJ1cHQvcG9sbCB0aW1lLgorCSAqLworCWkySW5wdXRGbHVzaCggcENoICk7CisKKwkvKiBkaXNhYmxlIERTUyByZXBvcnRpbmcgKi8KKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgNCwKKwkJCQlDTURfRENEX05SRVAsIENNRF9DVFNfTlJFUCwgQ01EX0RTUl9OUkVQLCBDTURfUklfTlJFUCk7CisJaWYgKCAhdHR5IHx8ICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAyLCBDTURfUlRTRE4sIENNRF9EVFJETik7CisJCXBDaC0+ZGF0YVNldE91dCAmPSB+KEkyX0RUUiB8IEkyX1JUUyk7CisJCWkyUXVldWVDb21tYW5kcyggUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX1BBVVNFKDI1KSk7CisJfQorCisJc2VydmljZU91dGdvaW5nRmlmbyAoIHBDaC0+cE15Qm9yZCApOworCisJaWYgKCB0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyICkgCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwlpZiAoIHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyICkgIAorCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eS0+Y2xvc2luZyA9IDA7CisJCisJcENoLT5wVFRZID0gTlVMTDsKKworCWlmIChwQ2gtPndvcGVuKSB7CisJCWlmIChwQ2gtPkNsb3NpbmdEZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhwQ2gtPkNsb3NpbmdEZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcENoLT5vcGVuX3dhaXQpOworCX0KKworCXBDaC0+ZmxhZ3MgJj1+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwQ2gtPmNsb3NlX3dhaXQpOworCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCURCR19DTlQoImlwMl9jbG9zZTogYWZ0ZXIgd2FrZXVwcy0tIik7CisjZW5kaWYKKworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0NMT1NFLCBJVFJDX1JFVFVSTiwgMSwgMSApOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2hhbmd1cCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2hhbmd1cCAoIFBUVFkgdHR5ICkKK3sKKwlpMkNoYW5TdHJQdHIgIHBDaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiggIXBDaCApIHsKKwkJcmV0dXJuOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19IQU5HVVAsIElUUkNfRU5URVIsIDAgKTsKKworCWlwMl9mbHVzaF9idWZmZXIodHR5KTsKKworCS8qIGRpc2FibGUgRFNTIHJlcG9ydGluZyAqLworCisJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAwLCAxLCBDTURfRENEX05SRVApOworCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMCwgMiwgQ01EX0NUU0ZMX0RTQUIsIENNRF9SVFNGTF9EU0FCKTsKKwlpZiAoICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMiwgQ01EX1JUU0ROLCBDTURfRFRSRE4pOworCQlwQ2gtPmRhdGFTZXRPdXQgJj0gfihJMl9EVFIgfCBJMl9SVFMpOworCQlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9QQVVTRSgyNSkpOworCX0KKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEsIDMsIAorCQkJCUNNRF9DVFNfTlJFUCwgQ01EX0RTUl9OUkVQLCBDTURfUklfTlJFUCk7CisJc2VydmljZU91dGdvaW5nRmlmbyAoIHBDaC0+cE15Qm9yZCApOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnBDaC0+ZGVsdGFfbXNyX3dhaXQgKTsKKworCXBDaC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcENoLT5wVFRZID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCAmcENoLT5vcGVuX3dhaXQgKTsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19IQU5HVVAsIElUUkNfUkVUVVJOLCAwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIE91dHB1dCBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX3dyaXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBGbGFnIGRlbm90aW5nIGRhdGEgaXMgaW4gdXNlciAoMSkgb3Iga2VybmVsICgwKSBzcGFjZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAoTUFOREFUT1JZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfd3JpdGUoIFBUVFkgdHR5LCBpbnQgdXNlciwgY29uc3QgdW5zaWduZWQgY2hhciAqcERhdGEsIGludCBjb3VudCkKK3sKKwlpMkNoYW5TdHJQdHIgIHBDaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGJ5dGVzU2VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgSVRSQ19FTlRFUiwgMiwgY291bnQsIC0xICk7CisKKwkvKiBGbHVzaCBvdXQgYW55IGJ1ZmZlcmVkIGRhdGEgbGVmdCBvdmVyIGZyb20gaXAyX3B1dGNoYXIoKSBjYWxscy4gKi8KKwlpcDJfZmx1c2hfY2hhcnMoIHR0eSApOworCisJLyogVGhpcyBpcyB0aGUgYWN0dWFsIG1vdmUgYml0LiBNYWtlIHN1cmUgaXQgZG9lcyB3aGF0IHdlIG5lZWQhISEhISAqLworCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlieXRlc1NlbnQgPSBpMk91dHB1dCggcENoLCBwRGF0YSwgY291bnQsIHVzZXIgKTsKKwlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgSVRSQ19SRVRVUk4sIDEsIGJ5dGVzU2VudCApOworCisJcmV0dXJuIGJ5dGVzU2VudCA+IDAgPyBieXRlc1NlbnQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX3B1dGNoYXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBDaGFyYWN0ZXIgdG8gd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwMl9wdXRjaGFyKCBQVFRZIHR0eSwgdW5zaWduZWQgY2hhciBjaCApCit7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKy8vCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19QVVRDLCBJVFJDX0VOVEVSLCAxLCBjaCApOworCisJV1JJVEVfTE9DS19JUlFTQVZFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOworCXBDaC0+UGJ1ZltwQ2gtPlBidWZfc3R1ZmYrK10gPSBjaDsKKwlpZiAoIHBDaC0+UGJ1Zl9zdHVmZiA9PSBzaXplb2YgcENoLT5QYnVmICkgeworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaXAyX2ZsdXNoX2NoYXJzKCB0dHkgKTsKKwl9IGVsc2UKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisKKy8vCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19QVVRDLCBJVFJDX1JFVFVSTiwgMSwgY2ggKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9mbHVzaF9jaGFycygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2ZsdXNoX2NoYXJzKCBQVFRZIHR0eSApCit7CisJaW50ICAgc3RyaXA7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisJaWYgKCBwQ2gtPlBidWZfc3R1ZmYgKSB7CisKKy8vCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfUFVUQywgMTAsIDEsIHN0cmlwICk7CisKKwkJLy8KKwkJLy8gV2UgbWF5IG5lZWQgdG8gcmVzdGFydCBpMk91dHB1dCBpZiBpdCBkb2VzIG5vdCBmdWxsZmlsbCB0aGlzIHJlcXVlc3QKKwkJLy8KKwkJc3RyaXAgPSBpMk91dHB1dCggcENoLCBwQ2gtPlBidWYsIHBDaC0+UGJ1Zl9zdHVmZiwgMCApOworCQlpZiAoIHN0cmlwICE9IHBDaC0+UGJ1Zl9zdHVmZiApIHsKKwkJCW1lbW1vdmUoIHBDaC0+UGJ1ZiwgJnBDaC0+UGJ1ZltzdHJpcF0sIHBDaC0+UGJ1Zl9zdHVmZiAtIHN0cmlwICk7CisJCX0KKwkJcENoLT5QYnVmX3N0dWZmIC09IHN0cmlwOworCX0KKwlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl93cml0ZV9yb29tKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIGRyaXZlciBjYW4gYWNjZXB0ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfd3JpdGVfcm9vbSAoIFBUVFkgdHR5ICkKK3sKKwlpbnQgYnl0ZXNGcmVlOworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisJYnl0ZXNGcmVlID0gaTJPdXRwdXRGcmVlKCBwQ2ggKSAtIHBDaC0+UGJ1Zl9zdHVmZjsKKwlSRUFEX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX1dSSVRFLCAxMSwgMSwgYnl0ZXNGcmVlICk7CisKKwlyZXR1cm4gKChieXRlc0ZyZWUgPiAwKSA/IGJ5dGVzRnJlZSA6IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2NoYXJzX2luX2J1ZigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOdW1iZXIgb2YgYnl0ZXMgcXVldWVkIGZvciB0cmFuc21pc3Npb24gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfY2hhcnNfaW5fYnVmICggUFRUWSB0dHkgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgMTIsIDEsIHBDaC0+T2J1Zl9jaGFyX2NvdW50ICsgcENoLT5QYnVmX3N0dWZmICk7CisKKyNpZmRlZiBJUDJERUJVR19XUklURQorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiBjaGFycyBpbiBidWZmZXIgPSAlZCAoJWQsJWQpXG4iLAorCQkJCSBwQ2gtPk9idWZfY2hhcl9jb3VudCArIHBDaC0+UGJ1Zl9zdHVmZiwKKwkJCQkgcENoLT5PYnVmX2NoYXJfY291bnQsIHBDaC0+UGJ1Zl9zdHVmZiApOworI2VuZGlmCisJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJcmMgPSAgcENoLT5PYnVmX2NoYXJfY291bnQ7CisJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlSRUFEX0xPQ0tfSVJRU0FWRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlyYyArPSAgcENoLT5QYnVmX3N0dWZmOworCVJFQURfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2ZsdXNoX2J1ZmZlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2ZsdXNoX2J1ZmZlciggUFRUWSB0dHkgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCBJVFJDX0VOVEVSLCAwICk7CisKKyNpZmRlZiBJUDJERUJVR19XUklURQorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiBmbHVzaCBidWZmZXJcbiIgKTsKKyNlbmRpZgorCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlwQ2gtPlBidWZfc3R1ZmYgPSAwOworCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOworCWkyRmx1c2hPdXRwdXQoIHBDaCApOworCWlwMl9vd2FrZSh0dHkpOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCBJVFJDX1JFVFVSTiwgMCApOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfd2FpdF91bnRpbF9zZW50KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFRpbWVvdXQgZm9yIHdhaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIG5vcm1hbCB0dHlfd2FpdF91bnRpbF9zZW50LCB3aGljaCAgICAqLworLyogb25seSB3YWl0cyBmb3IgdGhlIGRyaXZlciBidWZmZXJzIHRvIGJlIGVtcHR5IChvciByYXRoZXIsIHRob3NlIGJ1ZmZlcnMgICAgKi8KKy8qIHJlcG9ydGVkIGJ5IGNoYXJzX2luX2J1ZmZlcikgd2hpY2ggZG9lc24ndCB3b3JrIGZvciBJUDIgZHVlIHRvIHRoZSAgICAgICAgICovCisvKiBpbmRldGVybWluYXRlIG51bWJlciBvZiBieXRlcyBidWZmZXJlZCBvbiB0aGUgYm9hcmQuICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcDJfd2FpdF91bnRpbF9zZW50ICggUFRUWSB0dHksIGludCB0aW1lb3V0ICkKK3sKKwlpbnQgaSA9IGppZmZpZXM7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCisJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHRpbWVvdXQgKTsKKwlpZiAoIChpID0gdGltZW91dCAtIChqaWZmaWVzIC1pKSkgPiAwKQorCQlpMkRyYWluT3V0cHV0KCBwQ2gsIGkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgSW5wdXQgU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfdGhyb3R0bGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcDJfdGhyb3R0bGUgKCBQVFRZIHR0eSApCit7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgSVAyREVCVUdfUkVBRAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiB0aHJvdHRsZVxuIiApOworI2VuZGlmCisJLyoKKwkgKiBTaWduYWwgdGhlIHBvbGwvaW50ZXJydXB0IGhhbmRsZXJzIG5vdCB0byBmb3J3YXJkIGluY29taW5nIGRhdGEgdG8KKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGJ1ZmZlcnMgdG8gZmlsbCB1cCBpbiB0aGUKKwkgKiBsaWJyYXJ5IGFuZCB0aHVzIGNhdXNlIHRoZSBsaWJyYXJ5IHJvdXRpbmVzIHRvIHNlbmQgdGhlIGZsb3cgY29udHJvbAorCSAqIHN0dWZmLgorCSAqLworCXBDaC0+dGhyb3R0bGVkID0gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl91bnRocm90dGxlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwMl91bnRocm90dGxlICggUFRUWSB0dHkgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgSVAyREVCVUdfUkVBRAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiB1bnRocm90dGxlXG4iICk7CisjZW5kaWYKKworCS8qIFBhc3MgaW5jb21pbmcgZGF0YSB1cCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIGFnYWluLiAqLworCXBDaC0+dGhyb3R0bGVkID0gMDsKKyAJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAwLCAxLCBDTURfUkVTVU1FKTsKKwlzZXJ2aWNlT3V0Z29pbmdGaWZvKCBwQ2gtPnBNeUJvcmQgKTsKKwlSRUFEX0xPQ0tfSVJRU0FWRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKQorCWlmICggcENoLT5JYnVmX3N0dWZmICE9IHBDaC0+SWJ1Zl9zdHJpcCApIHsKKwkJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKQorI2lmZGVmIElQMkRFQlVHX1JFQUQKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJpMklucHV0IGNhbGxlZCBmcm9tIHVudGhyb3R0bGVcbiIgKTsKKyNlbmRpZgorCQlpMklucHV0KCBwQ2ggKTsKKwl9IGVsc2UKKwkJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKQorfQorCitzdGF0aWMgdm9pZAoraXAyX3N0YXJ0ICggUFRUWSB0dHkgKQoreworIAlpMkNoYW5TdHJQdHIgIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisgCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMSwgQ01EX1JFU1VNRSk7CisgCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLCBDTURfVU5TVVNQRU5EKTsKKyAJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9SRVNVTUUpOworI2lmZGVmIElQMkRFQlVHX1dSSVRFCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDI6IHN0YXJ0IHR4XG4iICk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2lwMl9zdG9wICggUFRUWSB0dHkgKQoreworIAlpMkNoYW5TdHJQdHIgIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisgCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLCBDTURfU1VTUEVORCk7CisjaWZkZWYgSVAyREVCVUdfV1JJVEUKKwlwcmludGsgKEtFUk5fREVCVUcgIklQMjogc3RvcCB0eFxuIiApOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgSW9jdGwgU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpcDJfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaTJDaGFuU3RyUHRyIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCXdhaXRfcXVldWVfdCB3YWl0OworCisJaWYgKHBDaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworLyoKKwlGSVhNRSAtIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBjYXVzaW5nIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGluCisJMi4zLjUxIGluIGFuIGludGVycnVwdCBoYW5kbGVyLiAgSXQncyBzdXBwb3NlIHRvIHByb21wdCB0aGUgYm9hcmQKKwl0byByZXR1cm4gdGhlIERTUyBzaWduYWwgc3RhdHVzIGltbWVkaWF0ZWx5LiAgV2h5IGRvZXNuJ3QgaXQgZG8KKwl0aGUgc2FtZSB0aGluZyBpbiAyLjIuMTQ/CisqLworCisvKglUaGlzIHRoaW5nIGlzIHN0aWxsIGJ1c3RlZCBpbiB0aGUgMS4yLjEyIGRyaXZlciBvbiAyLjQueAorCWFuZCBldmVuIGhvc2VzIHRoZSBzZXJpYWwgY29uc29sZSBzbyB0aGUgb29wcyBjYW4gYmUgdHJhcHBlZC4KKwkJL1wvXHw9bWh3PXxcL1wvCQkJKi8KKworI2lmZGVmCUVOQUJMRV9EU1NOT1cKKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDEwMCwgMSwgQ01EX0RTU19OT1cpOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKCZwQ2gtPmRzc19ub3dfd2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBDaC0+cE15Qm9yZCApOworCisJc2NoZWR1bGUoKTsKKworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5kc3Nfbm93X3dhaXQsICZ3YWl0KTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlyZXR1cm4gLUVJTlRSOworCX0KKyNlbmRpZgorCXJldHVybiAgKChwQ2gtPmRhdGFTZXRPdXQgJiBJMl9SVFMpID8gVElPQ01fUlRTIDogMCkKKwkgICAgICB8ICgocENoLT5kYXRhU2V0T3V0ICYgSTJfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJICAgICAgfCAoKHBDaC0+ZGF0YVNldEluICAmIEkyX0RDRCkgPyBUSU9DTV9DQVIgOiAwKQorCSAgICAgIHwgKChwQ2gtPmRhdGFTZXRJbiAgJiBJMl9SSSkgID8gVElPQ01fUk5HIDogMCkKKwkgICAgICB8ICgocENoLT5kYXRhU2V0SW4gICYgSTJfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJICAgICAgfCAoKHBDaC0+ZGF0YVNldEluICAmIEkyX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKK30KKworc3RhdGljIGludCBpcDJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJaTJDaGFuU3RyUHRyIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisJaWYgKHBDaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9SVFNVUCk7CisJCXBDaC0+ZGF0YVNldE91dCB8PSBJMl9SVFM7CisJfQorCWlmIChzZXQgJiBUSU9DTV9EVFIpIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9EVFJVUCk7CisJCXBDaC0+ZGF0YVNldE91dCB8PSBJMl9EVFI7CisJfQorCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfUlRTRE4pOworCQlwQ2gtPmRhdGFTZXRPdXQgJj0gfkkyX1JUUzsKKwl9CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfRFRSRE4pOworCQlwQ2gtPmRhdGFTZXRPdXQgJj0gfkkyX0RUUjsKKwl9CisJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfaW9jdGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgQXJndW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwMl9pb2N0bCAoIFBUVFkgdHR5LCBzdHJ1Y3QgZmlsZSAqcEZpbGUsIFVJTlQgY21kLCBVTE9ORyBhcmcgKQoreworCXdhaXRfcXVldWVfdCB3YWl0OworCWkyQ2hhblN0clB0ciBwQ2ggPSBEZXZUYWJsZVt0dHktPmluZGV4XTsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIHBDaCA9PSBOVUxMICkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIElUUkNfRU5URVIsIDIsIGNtZCwgYXJnICk7CisKKyNpZmRlZiBJUDJERUJVR19JT0NUTAorCXByaW50ayhLRVJOX0RFQlVHICJJUDI6IGlvY3RsIGNtZCAoJXgpLCBhcmcgKCVseClcbiIsIGNtZCwgYXJnICk7CisjZW5kaWYKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFRJT0NHU0VSSUFMOgorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMiwgMSwgcmMgKTsKKworCQlyYyA9IGdldF9zZXJpYWxfaW5mbyhwQ2gsIGFyZ3ApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCWJyZWFrOworCisJY2FzZSBUSU9DU1NFUklBTDoKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDMsIDEsIHJjICk7CisKKwkJcmMgPSBzZXRfc2VyaWFsX2luZm8ocENoLCBhcmdwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlicmVhazsKKworCWNhc2UgVENYT05DOgorCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlzd2l0Y2ggKGFyZykgeworCQljYXNlIFRDT09GRjoKKwkJCS8vcmV0dXJuICAtRU5PSU9DVExDTUQ7CisJCQlicmVhazsKKwkJY2FzZSBUQ09PTjoKKwkJCS8vcmV0dXJuICAtRU5PSU9DVExDTUQ7CisJCQlicmVhazsKKwkJY2FzZSBUQ0lPRkY6CisJCQlpZiAoU1RPUF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKSB7CisJCQkJaTJRdWV1ZUNvbW1hbmRzKCBQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLAorCQkJCQkJQ01EX1hNSVRfTk9XKFNUT1BfQ0hBUih0dHkpKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUQ0lPTjoKKwkJCWlmIChTVEFSVF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKSB7CisJCQkJaTJRdWV1ZUNvbW1hbmRzKCBQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLAorCQkJCQkJQ01EX1hNSVRfTk9XKFNUQVJUX0NIQVIodHR5KSkpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgVENTQlJLOiAgIC8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDQsIDEsIHJjICk7CisKKwkJaWYgKCFyYykgeworCQkJaXAyX3dhaXRfdW50aWxfc2VudCh0dHksMCk7CisJCQlpZiAoIWFyZykgeworCQkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfU0VORF9CUksoMjUwKSk7CisJCQkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRDU0JSS1A6ICAvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisJCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgNSwgMSwgcmMgKTsKKworCQlpZiAoIXJjKSB7CisJCQlpcDJfd2FpdF91bnRpbF9zZW50KHR0eSwwKTsKKwkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLAorCQkJCUNNRF9TRU5EX0JSSyhhcmcgPyBhcmcqMTAwIDogMjUwKSk7CisJCQlzZXJ2aWNlT3V0Z29pbmdGaWZvICggcENoLT5wTXlCb3JkICk7CQorCQl9CisJCWJyZWFrOworCisJY2FzZSBUSU9DR1NPRlRDQVI6CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lPQ1RMLCA2LCAxLCByYyApOworCisJCQlyYyA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CisJCWlmIChyYykJCisJCQlyZXR1cm4gcmM7CisJYnJlYWs7CisKKwljYXNlIFRJT0NTU09GVENBUjoKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDcsIDEsIHJjICk7CisKKwkJcmMgPSBnZXRfdXNlcihhcmcsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCQlpZiAocmMpIAorCQkJcmV0dXJuIHJjOworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpCisJCQkJCSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7CisJCQorCQlicmVhazsKKworCS8qCisJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZSAtIG1hc2sKKwkgKiBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdCAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMKKwkgKiBmb3IgbWFza2luZykuIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCisJICovCisJY2FzZSBUSU9DTUlXQUlUOgorCQlzYXZlX2ZsYWdzKGZsYWdzKTtjbGkoKTsKKwkJY3ByZXYgPSBwQ2gtPmljb3VudDsJIC8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDEwMCwgNCwgCisJCQkJCQlDTURfRENEX1JFUCwgQ01EX0NUU19SRVAsIENNRF9EU1JfUkVQLCBDTURfUklfUkVQKTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCQlhZGRfd2FpdF9xdWV1ZSgmcENoLT5kZWx0YV9tc3Jfd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19JTlRFUlJVUFRJQkxFICk7CisKKwkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCWZvcig7OykgeworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lPQ1RMLCAxMCwgMCApOworCisJCQlzY2hlZHVsZSgpOworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDExLCAwICk7CisKKwkJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2F2ZV9mbGFncyhmbGFncyk7Y2xpKCk7CisJCQljbm93ID0gcENoLT5pY291bnQ7IC8qIGF0b21pYyBjb3B5ICovCisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCQkJY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykgeworCQkJCXJjID0gIC1FSU87IC8qIG5vIGNoYW5nZSA9PiByYyAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CisJCQkgICAgKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fAorCQkJICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgKSB7CisJCQkJcmMgPSAgMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwcmV2ID0gY25vdzsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZwQ2gtPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7CisKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDMsIAorCQkJCQkJIENNRF9DVFNfTlJFUCwgQ01EX0RTUl9OUkVQLCBDTURfUklfTlJFUCk7CisJCWlmICggISAocENoLT5mbGFncwkmIEFTWU5DX0NIRUNLX0NEKSkgeworCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9EQ0RfTlJFUCk7CisJCX0KKwkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCXJldHVybiByYzsKKwkJYnJlYWs7CisKKwkvKgorCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yIFJJIHdoZXJlCisJICogb25seSAwLT4xIGlzIGNvdW50ZWQuIFRoZSBjb250cm9sbGVyIGlzIHF1aXRlIGNhcGFibGUgb2YgY291bnRpbmcKKwkgKiBib3RoLCBidXQgdGhpcyBkb25lIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBzZXJpYWwgZHJpdmVyLgorCSAqLworCWNhc2UgVElPQ0dJQ09VTlQ6CisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMTEsIDEsIHJjICk7CisKKwkJc2F2ZV9mbGFncyhmbGFncyk7Y2xpKCk7CisJCWNub3cgPSBwQ2gtPmljb3VudDsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXBfY3VzZXIgPSBhcmdwOworCQlyYyA9IHB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcik7CisJCXJjID0gcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlyYyA9IHB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpOworCQlyYyA9IHB1dF91c2VyKGNub3cudHgsICZwX2N1c2VyLT50eCk7CisJCXJjID0gcHV0X3VzZXIoY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7CisJCXJjID0gcHV0X3VzZXIoY25vdy5icmssICZwX2N1c2VyLT5icmspOworCQlyYyA9IHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bik7CisJCWJyZWFrOworCisJLyoKKwkgKiBUaGUgcmVzdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4gQnkgcmV0dXJuaW5nIC1FTk9JT0NUTENNRCB0aGV5CisJICogd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgaXQgdG8gaGFuZGxlLgorCSAqLworCWNhc2UgVElPQ1NFUkNPTkZJRzoKKwljYXNlIFRJT0NTRVJHV0lMRDoKKwljYXNlIFRJT0NTRVJHRVRMU1I6CisJY2FzZSBUSU9DU0VSU1dJTEQ6CisJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwljYXNlIFRJT0NTRVJHRVRNVUxUSToKKwljYXNlIFRJT0NTRVJTRVRNVUxUSToKKworCWRlZmF1bHQ6CisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMTIsIDAgKTsKKworCQlyYyA9ICAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgSVRSQ19SRVRVUk4sIDAgKTsKKworCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIEdldFNlcmlhbEluZm8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBvbGQgdGVybWlvcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgc2V0c2VyaWFsIGNvbW1hbmQsIGFuZCByZXF1aXJlcyBwcm9jZXNzaW5nIG9mIHRoZSAgICovCisvKiBzdGFuZGFyZCBMaW51eCBzZXJpYWwgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2dldF9zZXJpYWxfaW5mbyAoIGkyQ2hhblN0clB0ciBwQ2gsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbyApCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCisJbWVtc2V0ICggJnRtcCwgMCwgc2l6ZW9mKHRtcCkgKTsKKwl0bXAudHlwZSA9IHBDaC0+cE15Qm9yZC0+Y2hhbm5lbEJ0eXBlcy5iaWRfdmFsdWVbKHBDaC0+cG9ydF9pbmRleCAmIChJUDJfUE9SVFNfUEVSX0JPQVJELTEpKS8xNl07CisJaWYgKEJJRF9IQVNfNjU0KHRtcC50eXBlKSkgeworCQl0bXAudHlwZSA9IFBPUlRfMTY2NTA7CisJfSBlbHNlIHsKKwkJdG1wLnR5cGUgPSBQT1JUX0NJUlJVUzsKKwl9CisJdG1wLmxpbmUgPSBwQ2gtPnBvcnRfaW5kZXg7CisJdG1wLnBvcnQgPSBwQ2gtPnBNeUJvcmQtPmkyZUJhc2U7CisJdG1wLmlycSAgPSBpcDJjb25maWcuaXJxW3BDaC0+cG9ydF9pbmRleC82NF07CisJdG1wLmZsYWdzID0gcENoLT5mbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gcENoLT5CYXVkQmFzZTsKKwl0bXAuY2xvc2VfZGVsYXkgPSBwQ2gtPkNsb3NpbmdEZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gcENoLT5DbG9zaW5nV2FpdFRpbWU7CisJdG1wLmN1c3RvbV9kaXZpc29yID0gcENoLT5CYXVkRGl2aXNvcjsKKyAgIAlyZXR1cm4gY29weV90b191c2VyKHJldGluZm8sJnRtcCxzaXplb2YoKnJldGluZm8pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIFNldFNlcmlhbEluZm8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBvbGQgdGVybWlvcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3Igc2V0c2VyaWFsLCB3aGljaCB1c2VzIHRoZSBUSU9DU1NFUklBTCAgICovCisvKiBpb2N0bC4gTm90IGFsbCBzZXRzZXJpYWwgcGFyYW1ldGVycyBhcmUgcmVsZXZhbnQuIElmIHRoZSB1c2VyIGF0dGVtcHRzIHRvICAqLworLyogY2hhbmdlIHRoZSBJUlEsIGFkZHJlc3Mgb3IgdHlwZSBvZiB0aGUgcG9ydCB0aGUgaW9jdGwgZmFpbHMuICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitzZXRfc2VyaWFsX2luZm8oIGkyQ2hhblN0clB0ciBwQ2gsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8gKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5zOworCWludCAgIG9sZF9mbGFncywgb2xkX2JhdWRfZGl2aXNvcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbnMsIG5ld19pbmZvLCBzaXplb2YgKG5zKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBXZSBkb24ndCBhbGxvdyBzZXRzZXJpYWwgdG8gY2hhbmdlIElSUSwgYm9hcmQgYWRkcmVzcywgdHlwZSBvciBiYXVkCisJICogYmFzZS4gQWxzbyBsaW5lIG51bmJlciBhcyBzdWNoIGlzIG1lYW5pbmdsZXNzIGJ1dCB3ZSB1c2UgaXQgZm9yIG91cgorCSAqIGFycmF5IGluZGV4IHNvIGl0IGlzIGZpeGVkIGFsc28uCisJICovCisJaWYgKCAobnMuaXJxICAJICAgICE9IGlwMmNvbmZpZy5pcnFbcENoLT5wb3J0X2luZGV4XSkKKwkgICAgfHwgKChpbnQpIG5zLnBvcnQgICAgICAhPSAoKGludCkgKHBDaC0+cE15Qm9yZC0+aTJlQmFzZSkpKQorCSAgICB8fCAobnMuYmF1ZF9iYXNlICE9IHBDaC0+QmF1ZEJhc2UpCisJICAgIHx8IChucy5saW5lICAgICAgIT0gcENoLT5wb3J0X2luZGV4KSApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2xkX2ZsYWdzID0gcENoLT5mbGFnczsKKwlvbGRfYmF1ZF9kaXZpc29yID0gcENoLT5CYXVkRGl2aXNvcjsKKworCWlmICggIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgKSB7CisJCWlmICggKCBucy5jbG9zZV9kZWxheSAhPSBwQ2gtPkNsb3NpbmdEZWxheSApIHx8CisJCSAgICAoIChucy5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAgKHBDaC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICkgKSB7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJcENoLT5mbGFncyA9IChwQ2gtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkgICAgICAgKG5zLmZsYWdzICYgQVNZTkNfVVNSX01BU0spOworCQlwQ2gtPkJhdWREaXZpc29yID0gbnMuY3VzdG9tX2Rpdmlzb3I7CisJfSBlbHNlIHsKKwkJcENoLT5mbGFncyA9IChwQ2gtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkgICAgICAgKG5zLmZsYWdzICYgQVNZTkNfRkxBR1MpOworCQlwQ2gtPkJhdWREaXZpc29yID0gbnMuY3VzdG9tX2Rpdmlzb3I7CisJCXBDaC0+Q2xvc2luZ0RlbGF5ID0gbnMuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJCXBDaC0+Q2xvc2luZ1dhaXRUaW1lID0gbnMuY2xvc2luZ193YWl0ICogSFovMTAwOworCX0KKworCWlmICggKCAob2xkX2ZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9IChwQ2gtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spICkKKwkgICAgfHwgKG9sZF9iYXVkX2Rpdmlzb3IgIT0gcENoLT5CYXVkRGl2aXNvcikgKSB7CisJCS8vIEludmFsaWRhdGUgc3BlZWQgYW5kIHJlc2V0IHBhcmFtZXRlcnMKKwkJc2V0X3BhcmFtcyggcENoLCBOVUxMICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfc2V0X3Rlcm1pb3MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFBvaW50ZXIgdG8gb2xkIHRlcm1pb3Mgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX3NldF90ZXJtaW9zKCBQVFRZIHR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zICkKK3sKKwlpMkNoYW5TdHJQdHIgcENoID0gKGkyQ2hhblN0clB0cil0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgSVAyREVCVUdfSU9DVEwKKwlwcmludGsgKEtFUk5fREVCVUcgIklQMjogc2V0IHRlcm1pb3MgJXBcbiIsIG9sZF90ZXJtaW9zICk7CisjZW5kaWYKKworCXNldF9wYXJhbXMoIHBDaCwgb2xkX3Rlcm1pb3MgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9zZXRfbGluZV9kaXNjaXBsaW5lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogIERvZXMgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwMl9zZXRfbGluZV9kaXNjaXBsaW5lICggUFRUWSB0dHkgKQoreworI2lmZGVmIElQMkRFQlVHX0lPQ1RMCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDI6IHNldCBsaW5lIGRpc2NpcGxpbmVcbiIgKTsKKyNlbmRpZgorCisJaXAydHJhY2UgKCgoaTJDaGFuU3RyUHRyKXR0eS0+ZHJpdmVyX2RhdGEpLT5wb3J0X2luZGV4LCBJVFJDX0lPQ1RMLCAxNiwgMCApOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBTZXRMaW5lIENoYXJhY3RlcmlzdGljcygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSBjaGFubmVsIHN0cnVjdHVyZSB3aXRoIHRoZSBuZXcgbGluZSAgICovCisvKiBjaGFyYWN0ZXJpc3RpY3MsIGFuZCBzZW5kIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcyB0byB0aGUgYm9hcmQgd2hlbiB0aGV5ICAqLworLyogY2hhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2V0X3BhcmFtcyggaTJDaGFuU3RyUHRyIHBDaCwgc3RydWN0IHRlcm1pb3MgKm9fdGlvcyApCit7CisJdGNmbGFnX3QgY2ZsYWcsIGlmbGFnLCBsZmxhZzsKKwljaGFyIHN0b3BfY2hhciwgc3RhcnRfY2hhcjsKKwlzdHJ1Y3QgdGVybWlvcyBkdW1teTsKKworCWxmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2xmbGFnOworCWNmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnOworCWlmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2lmbGFnOworCisJaWYgKG9fdGlvcyA9PSBOVUxMKSB7CisJCWR1bW15LmNfbGZsYWcgPSB+bGZsYWc7CisJCWR1bW15LmNfY2ZsYWcgPSB+Y2ZsYWc7CisJCWR1bW15LmNfaWZsYWcgPSB+aWZsYWc7CisJCW9fdGlvcyA9ICZkdW1teTsKKwl9CisKKwl7CisJCXN3aXRjaCAoIGNmbGFnICYgQ0JBVUQgKSB7CisJCWNhc2UgQjA6CisJCQlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDIsIENNRF9SVFNETiwgQ01EX0RUUkROKTsKKwkJCXBDaC0+ZGF0YVNldE91dCAmPSB+KEkyX0RUUiB8IEkyX1JUUyk7CisJCQlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9QQVVTRSgyNSkpOworCQkJcENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnIHw9IChDQkFVRCAmIG9fdGlvcy0+Y19jZmxhZyk7CisJCQlnb3RvIHNlcnZpY2VfaXQ7CisJCQlicmVhazsKKwkJY2FzZSBCMzg0MDA6CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgc3BlZWQgdGhhdCBpcyBvdmVybG9hZGVkIHdpdGggYWxsIHRoZSBvdGhlciBoaWdoCisJCQkgKiBzcGVlZHMsIGRlcGVuZGluZyB1cG9uIHRoZSBmbGFnIHNldHRpbmdzLgorCQkJICovCisJCQlpZiAoICggcENoLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLICkgPT0gQVNZTkNfU1BEX0hJICkgeworCQkJCXBDaC0+c3BlZWQgPSBDQlJfNTc2MDA7CisJCQl9IGVsc2UgaWYgKCAocENoLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJICkgeworCQkJCXBDaC0+c3BlZWQgPSBDQlJfMTE1MjAwOworCQkJfSBlbHNlIGlmICggKHBDaC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QgKSB7CisJCQkJcENoLT5zcGVlZCA9IENCUl9DMTsKKwkJCX0gZWxzZSB7CisJCQkJcENoLT5zcGVlZCA9IENCUl8zODQwMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEI1MDogICAgICBwQ2gtPnNwZWVkID0gQ0JSXzUwOyAgICAgIGJyZWFrOworCQljYXNlIEI3NTogICAgICBwQ2gtPnNwZWVkID0gQ0JSXzc1OyAgICAgIGJyZWFrOworCQljYXNlIEIxMTA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzExMDsgICAgIGJyZWFrOworCQljYXNlIEIxMzQ6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzEzNDsgICAgIGJyZWFrOworCQljYXNlIEIxNTA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzE1MDsgICAgIGJyZWFrOworCQljYXNlIEIyMDA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzIwMDsgICAgIGJyZWFrOworCQljYXNlIEIzMDA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzMwMDsgICAgIGJyZWFrOworCQljYXNlIEI2MDA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzYwMDsgICAgIGJyZWFrOworCQljYXNlIEIxMjAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzEyMDA7ICAgIGJyZWFrOworCQljYXNlIEIxODAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzE4MDA7ICAgIGJyZWFrOworCQljYXNlIEIyNDAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzI0MDA7ICAgIGJyZWFrOworCQljYXNlIEI0ODAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzQ4MDA7ICAgIGJyZWFrOworCQljYXNlIEI5NjAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzk2MDA7ICAgIGJyZWFrOworCQljYXNlIEIxOTIwMDogICBwQ2gtPnNwZWVkID0gQ0JSXzE5MjAwOyAgIGJyZWFrOworCQljYXNlIEI1NzYwMDogICBwQ2gtPnNwZWVkID0gQ0JSXzU3NjAwOyAgIGJyZWFrOworCQljYXNlIEIxMTUyMDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzExNTIwMDsgIGJyZWFrOworCQljYXNlIEIxNTM2MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzE1MzYwMDsgIGJyZWFrOworCQljYXNlIEIyMzA0MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzIzMDQwMDsgIGJyZWFrOworCQljYXNlIEIzMDcyMDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzMwNzIwMDsgIGJyZWFrOworCQljYXNlIEI0NjA4MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzQ2MDgwMDsgIGJyZWFrOworCQljYXNlIEI5MjE2MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzkyMTYwMDsgIGJyZWFrOworCQlkZWZhdWx0OiAgICAgICBwQ2gtPnNwZWVkID0gQ0JSXzk2MDA7ICAgIGJyZWFrOworCQl9CisJCWlmICggcENoLT5zcGVlZCA9PSBDQlJfQzEgKSB7CisJCQkvLyBQcm9jZXNzIHRoZSBjdXN0b20gc3BlZWQgcGFyYW1ldGVycy4KKwkJCWludCBicHMgPSBwQ2gtPkJhdWRCYXNlIC8gcENoLT5CYXVkRGl2aXNvcjsKKwkJCWlmICggYnBzID09IDkyMTYwMCApIHsKKwkJCQlwQ2gtPnNwZWVkID0gQ0JSXzkyMTYwMDsKKwkJCX0gZWxzZSB7CisJCQkJYnBzID0gYnBzLzEwOworCQkJCWkyUXVldWVDb21tYW5kcyggUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0JBVURfREVGMShicHMpICk7CisJCQl9CisJCX0KKwkJaTJRdWV1ZUNvbW1hbmRzKCBQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfU0VUQkFVRChwQ2gtPnNwZWVkKSk7CisJCQorCQlpMlF1ZXVlQ29tbWFuZHMgKCBQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAyLCBDTURfRFRSVVAsIENNRF9SVFNVUCk7CisJCXBDaC0+ZGF0YVNldE91dCB8PSAoSTJfRFRSIHwgSTJfUlRTKTsKKwl9CisJaWYgKCAoQ1NUT1BCICYgY2ZsYWcpIF4gKENTVE9QQiAmIG9fdGlvcy0+Y19jZmxhZykpIAorCXsKKwkJaTJRdWV1ZUNvbW1hbmRzICggUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgCisJCQlDTURfU0VUU1RPUCggKCBjZmxhZyAmIENTVE9QQiApID8gQ1NUXzIgOiBDU1RfMSkpOworCX0KKwlpZiAoKChQQVJFTkJ8UEFST0REKSAmIGNmbGFnKSBeICgoUEFSRU5CfFBBUk9ERCkgJiBvX3Rpb3MtPmNfY2ZsYWcpKSAKKwl7CisJCWkyUXVldWVDb21tYW5kcyAoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsCisJCQlDTURfU0VUUEFSKCAKKwkJCQkoY2ZsYWcgJiBQQVJFTkIgPyAgKGNmbGFnICYgUEFST0REID8gQ1NQX09EIDogQ1NQX0VWKSA6IENTUF9OUCkKKwkJCSkKKwkJKTsKKwl9CisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlpZiAoIChDU0laRSAmIGNmbGFnKV4oQ1NJWkUgJiBvX3Rpb3MtPmNfY2ZsYWcpKSAKKwl7CisJCWludCBkYXRhc2l6ZTsKKwkJc3dpdGNoICggY2ZsYWcgJiBDU0laRSApIHsKKwkJY2FzZSBDUzU6IGRhdGFzaXplID0gQ1NaXzU7IGJyZWFrOworCQljYXNlIENTNjogZGF0YXNpemUgPSBDU1pfNjsgYnJlYWs7CisJCWNhc2UgQ1M3OiBkYXRhc2l6ZSA9IENTWl83OyBicmVhazsKKwkJY2FzZSBDUzg6IGRhdGFzaXplID0gQ1NaXzg7IGJyZWFrOworCQlkZWZhdWx0OiAgZGF0YXNpemUgPSBDU1pfNTsgYnJlYWs7CS8qIGFzIHBlciBzZXJpYWwuYyAqLworCQl9CisJCWkyUXVldWVDb21tYW5kcyAoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9TRVRCSVRTKGRhdGFzaXplKSApOworCX0KKwkvKiBQcm9jZXNzIENUUyBmbG93IGNvbnRyb2wgZmxhZyBzZXR0aW5nICovCisJaWYgKCAoY2ZsYWcgJiBDUlRTQ1RTKSApIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsCisJCQkJCQkyLCBDTURfQ1RTRkxfRU5BQiwgQ01EX1JUU0ZMX0VOQUIpOworCX0gZWxzZSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLAorCQkJCQkJMiwgQ01EX0NUU0ZMX0RTQUIsIENNRF9SVFNGTF9EU0FCKTsKKwl9CisJLy8KKwkvLyBQcm9jZXNzIFhPTi9YT0ZGIGZsb3cgY29udHJvbCBmbGFncyBzZXR0aW5ncworCS8vCisJc3RvcF9jaGFyID0gU1RPUF9DSEFSKHBDaC0+cFRUWSk7CisJc3RhcnRfY2hhciA9IFNUQVJUX0NIQVIocENoLT5wVFRZKTsKKworCS8vLy8vLy8vLy8vLyBjYW4ndCBiZSBcMDAwCisJaWYgKHN0b3BfY2hhciA9PSBfX0RJU0FCTEVEX0NIQVIgKSAKKwl7CisJCXN0b3BfY2hhciA9IH5fX0RJU0FCTEVEX0NIQVI7IAorCX0KKwlpZiAoc3RhcnRfY2hhciA9PSBfX0RJU0FCTEVEX0NIQVIgKSAKKwl7CisJCXN0YXJ0X2NoYXIgPSB+X19ESVNBQkxFRF9DSEFSOworCX0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlmICggb190aW9zLT5jX2NjW1ZTVEFSVF0gIT0gc3RhcnRfY2hhciApIAorCXsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9ERUZfSVhPTihzdGFydF9jaGFyKSk7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfREVGX09YT04oc3RhcnRfY2hhcikpOworCX0KKwlpZiAoIG9fdGlvcy0+Y19jY1tWU1RPUF0gIT0gc3RvcF9jaGFyICkgCisJeworCQkgaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9ERUZfSVhPRkYoc3RvcF9jaGFyKSk7CisJCSBpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0RFRl9PWE9GRihzdG9wX2NoYXIpKTsKKwl9CisJaWYgKHN0b3BfY2hhciA9PSBfX0RJU0FCTEVEX0NIQVIgKSAKKwl7CisJCXN0b3BfY2hhciA9IH5fX0RJU0FCTEVEX0NIQVI7ICAvL1RFU1QxMjMKKwkJZ290byBub194b2ZmOworCX0KKwlpZiAoKGlmbGFnICYgKElYT0ZGKSleKG9fdGlvcy0+Y19pZmxhZyAmIChJWE9GRikpKSAKKwl7CisJCWlmICggaWZsYWcgJiBJWE9GRiApIHsJLy8gRW5hYmxlIFhPRkYgb3V0cHV0IGZsb3cgY29udHJvbAorCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9PWE9OX09QVChDT1hfWE9OKSk7CisJCX0gZWxzZSB7CS8vIERpc2FibGUgWE9GRiBvdXRwdXQgZmxvdyBjb250cm9sCitub194b2ZmOgorCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9PWE9OX09QVChDT1hfTk9ORSkpOworCQl9CisJfQorCWlmIChzdGFydF9jaGFyID09IF9fRElTQUJMRURfQ0hBUiApIAorCXsKKwkJZ290byBub194b247CisJfQorCWlmICgoaWZsYWcgJiAoSVhPTnxJWEFOWSkpIF4gKG9fdGlvcy0+Y19pZmxhZyAmIChJWE9OfElYQU5ZKSkpIAorCXsKKwkJaWYgKCBpZmxhZyAmIElYT04gKSB7CisJCQlpZiAoIGlmbGFnICYgSVhBTlkgKSB7IC8vIEVuYWJsZSBYT04vWEFOWSBvdXRwdXQgZmxvdyBjb250cm9sCisJCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9JWE9OX09QVChDSVhfWEFOWSkpOworCQkJfSBlbHNlIHsgLy8gRW5hYmxlIFhPTiBvdXRwdXQgZmxvdyBjb250cm9sCisJCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9JWE9OX09QVChDSVhfWE9OKSk7CisJCQl9CisJCX0gZWxzZSB7IC8vIERpc2FibGUgWE9OIG91dHB1dCBmbG93IGNvbnRyb2wKK25vX3hvbjoKKwkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfSVhPTl9PUFQoQ0lYX05PTkUpKTsKKwkJfQorCX0KKwlpZiAoIChpZmxhZyAmIElTVFJJUCkgXiAoIG9fdGlvcy0+Y19pZmxhZyAmIChJU1RSSVApKSApIAorCXsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIAorCQkJCUNNRF9JU1RSSVBfT1BUKChpZmxhZyAmIElTVFJJUCA/IDEgOiAwKSkpOworCX0KKwlpZiAoIChpZmxhZyAmIElOUENLKSBeICggb190aW9zLT5jX2lmbGFnICYgKElOUENLKSkgKSAKKwl7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCAKKwkJCQlDTURfUEFSQ0hLKChpZmxhZyAmIElOUENLKSA/IENQS19FTkFCIDogQ1BLX0RTQUIpKTsKKwl9CisKKwlpZiAoIChpZmxhZyAmIChJR05CUkt8UEFSTVJLfEJSS0lOVHxJR05QQVIpKSAKKwkJCV4JKCBvX3Rpb3MtPmNfaWZsYWcgJiAoSUdOQlJLfFBBUk1SS3xCUktJTlR8SUdOUEFSKSkgKSAKKwl7CisJCWNoYXIgYnJrcnB0ID0gMDsKKwkJY2hhciBwYXJycHQgPSAwOworCisJCWlmICggaWZsYWcgJiBJR05CUksgKSB7IC8qIElnbm9yZSBicmVha3MgYWx0b2dldGhlciAqLworCQkJLyogSWdub3JlIGJyZWFrcyBhbHRvZ2V0aGVyICovCisJCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0JSS19OUkVQKTsKKwkJfSBlbHNlIHsKKwkJCWlmICggaWZsYWcgJiBCUktJTlQgKSB7CisJCQkJaWYgKCBpZmxhZyAmIFBBUk1SSyApIHsKKwkJCQkJYnJrcnB0ID0gMHgwYTsJLy8gZXhjZXB0aW9uIGFuIGlubGluZSB0cmlwbGUKKwkJCQl9IGVsc2UgeworCQkJCQlicmtycHQgPSAweDFhOwkvLyBleGNlcHRpb24gYW5kIE5VTEwKKwkJCQl9CisJCQkJYnJrcnB0IHw9IDB4MDQ7CS8vIGZsdXNoIGlucHV0CisJCQl9IGVsc2UgeworCQkJCWlmICggaWZsYWcgJiBQQVJNUksgKSB7CisJCQkJCWJya3JwdCA9IDB4MGI7CS8vUE9TSVggdHJpcGxlIFwwMzc3IFwwIFwwCisJCQkJfSBlbHNlIHsKKwkJCQkJYnJrcnB0ID0gMHgwMTsJLy8gTnVsbCBvbmx5CisJCQkJfQorCQkJfQorCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9CUktfUkVQKGJya3JwdCkpOworCQl9IAorCisJCWlmIChpZmxhZyAmIElHTlBBUikgeworCQkJcGFycnB0ID0gMHgyMDsKKwkJCQkJCQkJCQkJCQkvKiB3b3VsZCBiZSAyIGZvciBub3QgY2lycnVzIGJ1ZyAqLworCQkJCQkJCQkJCQkJCS8qIHdvdWxkIGJlIDB4MjAgY2VwdCBmb3IgY2lycnVzIGJ1ZyAqLworCQl9IGVsc2UgeworCQkJaWYgKCBpZmxhZyAmIFBBUk1SSyApIHsKKwkJCQkvKgorCQkJCSAqIFJlcGxhY2UgZXJyb3IgY2hhcmFjdGVycyB3aXRoIDMtYnl0ZSBzZXF1ZW5jZSAoXDAzNzcsXDAsY2hhcikKKwkJCQkgKi8KKwkJCQlwYXJycHQgPSAweDA0IDsKKwkJCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0lTVFJJUF9PUFQoKGNoYXIpMCkpOworCQkJfSBlbHNlIHsKKwkJCQlwYXJycHQgPSAweDAzOworCQkJfSAKKwkJfQorCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX1NFVF9FUlJPUihwYXJycHQpKTsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKSB7CisJCS8vIFN0YXR1cyByZXBvcnRpbmcgZmFpbHMgZm9yIERDRCBpZiB0aGlzIGlzIG9mZgorCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0RDRF9OUkVQKTsKKwkJcENoLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJfSBlbHNlIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9EQ0RfUkVQKTsKKwkJcENoLT5mbGFncwl8PSBBU1lOQ19DSEVDS19DRDsKKwl9CisKKyNpZmRlZiBYWFgKK2RvX2ZsYWdzX3RoaW5nOgkvLyBUaGlzIGlzIGEgdGVzdCwgd2UgZG9uJ3QgZG8gdGhlIGZsYWdzIHRoaW5nCisJCisJaWYgKCAoY2ZsYWcgJiBDUlRTQ1RTKSApIHsKKwkJY2ZsYWcgfD0gMDE0MDAwMDAwMDAwOworCX0KKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDEwMCwgMSwgCisJCQkJQ01EX1VOSVhfRkxBR1MoaWZsYWcsY2ZsYWcsbGZsYWcpKTsKKyNlbmRpZgorCQkKK3NlcnZpY2VfaXQ6CisJaTJEcmFpbk91dHB1dCggcENoLCAxMDAgKTsJCQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSVBMIERldmljZSBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfaXBsX3JlYWQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gZGV2aWNlIGlub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBQb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0byByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBTdWNjZXNzIG9yIGZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgIFVnbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyAKK3NzaXplX3QKK2lwMl9pcGxfcmVhZChzdHJ1Y3QgZmlsZSAqcEZpbGUsIGNoYXIgX191c2VyICpwRGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZiApCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKHBGaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJjID0gMDsKKworI2lmZGVmIElQMkRFQlVHX0lQTAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAySVBMOiByZWFkICVwLCAlZCBieXRlc1xuIiwgcERhdGEsIGNvdW50ICk7CisjZW5kaWYKKworCXN3aXRjaCggbWlub3IgKSB7CisJY2FzZSAwOgkgICAgLy8gSVBMIGRldmljZQorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgMToJICAgIC8vIFN0YXR1cyBkdW1wCisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSAyOgkgICAgLy8gUGluZyBkZXZpY2UKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIDM6CSAgICAvLyBUcmFjZSBkZXZpY2UKKwkJcmMgPSBEdW1wVHJhY2VCdWZmZXIgKCBwRGF0YSwgY291bnQgKTsKKwkJYnJlYWs7CisJY2FzZSA0OgkgICAgLy8gVHJhY2UgZGV2aWNlCisJCXJjID0gRHVtcEZpZm9CdWZmZXIgKCBwRGF0YSwgY291bnQgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PREVWOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitEdW1wRmlmb0J1ZmZlciAoIGNoYXIgX191c2VyICpwRGF0YSwgaW50IGNvdW50ICkKK3sKKyNpZmRlZiBERUJVR19GSUZPCisJaW50IHJjOworCXJjID0gY29weV90b191c2VyKHBEYXRhLCBEQkdCdWYsIGNvdW50KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJMYXN0IGluZGV4ICVkXG4iLCBJICk7CisKKwlyZXR1cm4gY291bnQ7CisjZW5kaWYJLyogREVCVUdfRklGTyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitEdW1wVHJhY2VCdWZmZXIgKCBjaGFyIF9fdXNlciAqcERhdGEsIGludCBjb3VudCApCit7CisjaWZkZWYgSVAyREVCVUdfVFJBQ0UKKwlpbnQgcmM7CisJaW50IGR1bXBjb3VudDsKKwlpbnQgY2h1bms7CisJaW50ICpwSW5kZXggPSAoaW50IF9fdXNlciAqKXBEYXRhOworCisJaWYgKCBjb3VudCA8IChzaXplb2YoaW50KSAqIDYpICkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmMgPSBwdXRfdXNlcih0cmFjZXdyYXAsIHBJbmRleCApOworCXJjID0gcHV0X3VzZXIoVFJBQ0VNQVgsICsrcEluZGV4ICk7CisJcmMgPSBwdXRfdXNlcih0cmFjZXN0cmlwLCArK3BJbmRleCApOworCXJjID0gcHV0X3VzZXIodHJhY2VzdHVmZiwgKytwSW5kZXggKTsKKwlwRGF0YSArPSBzaXplb2YoaW50KSAqIDY7CisJY291bnQgLT0gc2l6ZW9mKGludCkgKiA2OworCisJZHVtcGNvdW50ID0gdHJhY2VzdHVmZiAtIHRyYWNlc3RyaXA7CisJaWYgKCBkdW1wY291bnQgPCAwICkgeworCQlkdW1wY291bnQgKz0gVFJBQ0VNQVg7CisJfQorCWlmICggZHVtcGNvdW50ID4gY291bnQgKSB7CisJCWR1bXBjb3VudCA9IGNvdW50OworCX0KKwljaHVuayA9IFRSQUNFTUFYIC0gdHJhY2VzdHJpcDsKKwlpZiAoIGR1bXBjb3VudCA+IGNodW5rICkgeworCQlyYyA9IGNvcHlfdG9fdXNlcihwRGF0YSwgJnRyYWNlYnVmW3RyYWNlc3RyaXBdLAorCQkJICAgICAgY2h1bmsgKiBzaXplb2YodHJhY2VidWZbMF0pICk7CisJCXBEYXRhICs9IGNodW5rICogc2l6ZW9mKHRyYWNlYnVmWzBdKTsKKwkJdHJhY2VzdHJpcCA9IDA7CisJCWNodW5rID0gZHVtcGNvdW50IC0gY2h1bms7CisJfSBlbHNlIHsKKwkJY2h1bmsgPSBkdW1wY291bnQ7CisJfQorCXJjID0gY29weV90b191c2VyKHBEYXRhLCAmdHJhY2VidWZbdHJhY2VzdHJpcF0sCisJCSAgICAgIGNodW5rICogc2l6ZW9mKHRyYWNlYnVmWzBdKSApOworCXRyYWNlc3RyaXAgKz0gY2h1bms7CisJdHJhY2V3cmFwID0gMDsKKworCXJjID0gcHV0X3VzZXIodHJhY2VzdHJpcCwgKytwSW5kZXggKTsKKwlyYyA9IHB1dF91c2VyKHRyYWNlc3R1ZmYsICsrcEluZGV4ICk7CisKKwlyZXR1cm4gZHVtcGNvdW50OworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2lwbF93cml0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyBvciBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHNzaXplX3QKK2lwMl9pcGxfd3JpdGUoc3RydWN0IGZpbGUgKnBGaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqcERhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisjaWZkZWYgSVAyREVCVUdfSVBMCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDJJUEw6IHdyaXRlICVwLCAlZCBieXRlc1xuIiwgcERhdGEsIGNvdW50ICk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9pcGxfaW9jdGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGRldmljZSBpbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIENvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBBcmd1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyBvciBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXAyX2lwbF9pb2N0bCAoIHN0cnVjdCBpbm9kZSAqcElub2RlLCBzdHJ1Y3QgZmlsZSAqcEZpbGUsIFVJTlQgY21kLCBVTE9ORyBhcmcgKQoreworCXVuc2lnbmVkIGludCBpcGxtaW5vciA9IGltaW5vcihwSW5vZGUpOworCWludCByYyA9IDA7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJVUxPTkcgX191c2VyICpwSW5kZXggPSBhcmdwOworCWkyZUJvcmRTdHJQdHIgcEIgPSBpMkJvYXJkUHRyVGFibGVbaXBsbWlub3IgLyA0XTsKKwlpMkNoYW5TdHJQdHIgcENoOworCisjaWZkZWYgSVAyREVCVUdfSVBMCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDJJUEw6IGlvY3RsIGNtZCAlZCwgYXJnICVsZFxuIiwgY21kLCBhcmcgKTsKKyNlbmRpZgorCisJc3dpdGNoICggaXBsbWlub3IgKSB7CisJY2FzZSAwOgkgICAgLy8gSVBMIGRldmljZQorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgMToJICAgIC8vIFN0YXR1cyBkdW1wCisJY2FzZSA1OgorCWNhc2UgOToKKwljYXNlIDEzOgorCQlzd2l0Y2ggKCBjbWQgKSB7CisJCWNhc2UgNjQ6CS8qIERyaXZlciAtIGlwMnN0YXQgKi8KKwkJCXJjID0gcHV0X3VzZXIoaXAyX3R0eV9kcml2ZXItPnJlZmNvdW50LCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpcnFfY291bnRlciwgcEluZGV4KysgICk7CisJCQlyYyA9IHB1dF91c2VyKGJoX2NvdW50ZXIsIHBJbmRleCsrICApOworCQkJYnJlYWs7CisKKwkJY2FzZSA2NToJLyogQm9hcmQgIC0gaXAyc3RhdCAqLworCQkJaWYgKCBwQiApIHsKKwkJCQlyYyA9IGNvcHlfdG9fdXNlcihhcmdwLCBwQiwgc2l6ZW9mKGkyZUJvcmRTdHIpKTsKKwkJCQlyYyA9IHB1dF91c2VyKElOQihwQi0+aTJlU3RhdHVzKSwKKwkJCQkJKFVMT05HIF9fdXNlciAqKShhcmcgKyAoVUxPTkcpKCZwQi0+aTJlU3RhdHVzKSAtIChVTE9ORylwQiApICk7CisJCQl9IGVsc2UgeworCQkJCXJjID0gLUVOT0RFVjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoY21kIDwgSVAyX01BWF9QT1JUUykgeworCQkJCXBDaCA9IERldlRhYmxlW2NtZF07CisJCQkJaWYgKCBwQ2ggKQorCQkJCXsKKwkJCQkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgcENoLCBzaXplb2YoaTJDaGFuU3RyKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmMgPSAtRU5PREVWOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSAyOgkgICAgLy8gUGluZyBkZXZpY2UKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIDM6CSAgICAvLyBUcmFjZSBkZXZpY2UKKwkJaWYgKCBjbWQgPT0gMSApIHsKKwkJCXJjID0gcHV0X3VzZXIoaWlTZW5kUGVuZGluZ01haWwsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkySW5pdENoYW5uZWxzLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpMlF1ZXVlTmVlZHMsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyUXVldWVDb21tYW5kcywgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaTJHZXRTdGF0dXMsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkySW5wdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkySW5wdXRGbHVzaCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaTJPdXRwdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyRmx1c2hPdXRwdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyRHJhaW5XYWtldXAsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyRHJhaW5PdXRwdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyT3V0cHV0RnJlZSwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaTJTdHJpcEZpZm8sIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyU3R1ZmZGaWZvQnlwYXNzLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpMlN0dWZmRmlmb0Zsb3csIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyU3R1ZmZGaWZvSW5saW5lLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpMlNlcnZpY2VCb2FyZCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoc2VydmljZU91dGdvaW5nRmlmbywgcEluZGV4KysgKTsKKwkJCS8vIHJjID0gcHV0X3VzZXIoaXAyX2luaXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9pbml0X2JvYXJkLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihmaW5kX2Vpc2FfYm9hcmQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKHNldF9pcnEsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9pbnRlcnJ1cHQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9wb2xsLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihzZXJ2aWNlX2FsbF9ib2FyZHMsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGRvX2lucHV0LCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihkb19zdGF0dXMsIHBJbmRleCsrICk7CisjaWZuZGVmIElQMkRFQlVHX09QRU4KKwkJCXJjID0gcHV0X3VzZXIoMCwgcEluZGV4KysgKTsKKyNlbHNlCisJCQlyYyA9IHB1dF91c2VyKG9wZW5fc2FuaXR5X2NoZWNrLCBwSW5kZXgrKyApOworI2VuZGlmCisJCQlyYyA9IHB1dF91c2VyKGlwMl9vcGVuLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpcDJfY2xvc2UsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9oYW5ndXAsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl93cml0ZSwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3B1dGNoYXIsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9mbHVzaF9jaGFycywgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3dyaXRlX3Jvb20sIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9jaGFyc19pbl9idWYsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9mbHVzaF9idWZmZXIsIHBJbmRleCsrICk7CisKKwkJCS8vcmMgPSBwdXRfdXNlcihpcDJfd2FpdF91bnRpbF9zZW50LCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcigwLCBwSW5kZXgrKyApOworCisJCQlyYyA9IHB1dF91c2VyKGlwMl90aHJvdHRsZSwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3VudGhyb3R0bGUsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9pb2N0bCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoMCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoZ2V0X3NlcmlhbF9pbmZvLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihzZXRfc2VyaWFsX2luZm8sIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9zZXRfdGVybWlvcywgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKHNldF9wYXJhbXMsIHBJbmRleCsrICk7CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9pcGxfb3BlbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGRldmljZSBpbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwMl9pcGxfb3Blbiggc3RydWN0IGlub2RlICpwSW5vZGUsIHN0cnVjdCBmaWxlICpwRmlsZSApCit7CisJdW5zaWduZWQgaW50IGlwbG1pbm9yID0gaW1pbm9yKHBJbm9kZSk7CisJaTJlQm9yZFN0clB0ciBwQjsKKwlpMkNoYW5TdHJQdHIgIHBDaDsKKworI2lmZGVmIElQMkRFQlVHX0lQTAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAySVBMOiBvcGVuXG4iICk7CisjZW5kaWYKKworCXN3aXRjaChpcGxtaW5vcikgeworCS8vIFRoZXNlIGFyZSB0aGUgSVBMIGRldmljZXMKKwljYXNlIDA6CisJY2FzZSA0OgorCWNhc2UgODoKKwljYXNlIDEyOgorCQlicmVhazsKKworCS8vIFRoZXNlIGFyZSB0aGUgc3RhdHVzIGRldmljZXMKKwljYXNlIDE6CisJY2FzZSA1OgorCWNhc2UgOToKKwljYXNlIDEzOgorCQlicmVhazsKKworCS8vIFRoZXNlIGFyZSB0aGUgZGVidWcgZGV2aWNlcworCWNhc2UgMjoKKwljYXNlIDY6CisJY2FzZSAxMDoKKwljYXNlIDE0OgorCQlwQiA9IGkyQm9hcmRQdHJUYWJsZVtpcGxtaW5vciAvIDRdOworCQlwQ2ggPSAoaTJDaGFuU3RyUHRyKSBwQi0+aTJlQ2hhbm5lbFB0cjsKKwkJYnJlYWs7CisKKwkvLyBUaGlzIGlzIHRoZSB0cmFjZSBkZXZpY2UKKwljYXNlIDM6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfcmVhZF9wcm9jbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiBMZW5ndGggb2Ygb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFN1cHBsaWVzIHNvbWUgZHJpdmVyIG9wZXJhdGluZyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoJTm90IHJlYWwgdXNlZnVsIHVubGVzcyB5b3VyIGRlYnVnZ2luZyB0aGUgZmlmbwkJCQkJCQkgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMSU1JVCAgKFBBR0VfU0laRSAtIDEyMCkKKworc3RhdGljIGludAoraXAyX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuKQoreworCWkyZUJvcmRTdHJQdHIgIHBCOworCWkyQ2hhblN0clB0ciAgcENoOworCVBUVFkgdHR5OworCWludCBpOworCisJbGVuID0gMDsKKworI2RlZmluZSBGTVRMSU5FCSIlM2Q6IDB4JTA4eCAweCUwOHggMCUwMTFvIDAlMDExb1xuIgorI2RlZmluZSBGTVRMSU4yCSIgICAgIDB4JTA0eCAweCUwNHggdHggZmxvdyAweCV4XG4iCisjZGVmaW5lIEZNVExJTjMJIiAgICAgMHglMDR4IDB4JTA0eCByYyBmbG93XG4iCisKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIpOworCisJZm9yKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCXBCID0gaTJCb2FyZFB0clRhYmxlW2ldOworCQlpZiAoIHBCICkgeworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiYm9hcmQgJWQ6XG4iLGkpOworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXHRGaWZvIHJlbTogJWQgbXR5OiAleCBvdXRNICV4XG4iLAorCQkJCXBCLT5pMmVGaWZvUmVtYWlucyxwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbyxwQi0+aTJlT3V0TWFpbFdhaXRpbmcpOworCQl9CisJfQorCisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiIzogdHR5IGZsYWdzLCBwb3J0IGZsYWdzLCAgICAgY2ZsYWdzLCAgICAgaWZsYWdzXG4iKTsKKwlmb3IgKGk9MDsgaSA8IElQMl9NQVhfUE9SVFM7IGkrKykgeworCQlpZiAobGVuID4gTElNSVQpCisJCQlicmVhazsKKwkJcENoID0gRGV2VGFibGVbaV07CisJCWlmIChwQ2gpIHsKKwkJCXR0eSA9IHBDaC0+cFRUWTsKKwkJCWlmICh0dHkgJiYgdHR5LT5jb3VudCkgeworCQkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sRk1UTElORSxpLChpbnQpdHR5LT5mbGFncyxwQ2gtPmZsYWdzLAorCQkJCQkJCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnLHR0eS0+dGVybWlvcy0+Y19pZmxhZyk7CisKKwkJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLEZNVExJTjIsCisJCQkJCQlwQ2gtPm91dGZsLmFzb2YscENoLT5vdXRmbC5yb29tLHBDaC0+Y2hhbm5lbE5lZWRzKTsKKwkJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLEZNVExJTjMscENoLT5pbmZsLmFzb2YscENoLT5pbmZsLnJvb20pOworCQkJfQorCQl9CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBoYW5kbGVyIGZvciAvcHJvYy90dHkvZHJpdmVyL2lwMgorICoKKyAqIFRoaXMgc3RyZXRjaCBvZiBjb2RlIGhhcyBiZWVuIGxhcmdlbHkgcGxhZ2VyaXplZCBmcm9tIGF0IGxlYXN0IHRocmVlCisgKiBkaWZmZXJlbnQgc291cmNlcyBpbmNsdWRpbmcgaXAybWtkZXYuYyBhbmQgYSBjb3VwbGUgb2Ygb3RoZXIgZHJpdmVycy4KKyAqIFRoZSBidWdzIGFyZSBhbGwgbWluZS4gIDotKQk9bWh3PQorICovCitzdGF0aWMgaW50IGlwMl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQJaSwgaiwgYm94OworCWludAlsZW4gPSAwOworCWludAlib3hlcyA9IDA7CisJaW50CXBvcnRzID0gMDsKKwlpbnQJdHBvcnRzID0gMDsKKwlvZmZfdAliZWdpbiA9IDA7CisJaTJlQm9yZFN0clB0ciAgcEI7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAiaXAyaW5mbzogMS4wIGRyaXZlcjogJXNcbiIsIHBjVmVyc2lvbiApOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiRHJpdmVyOiBTTWFqb3I9JWQgQ01ham9yPSVkIElNYWpvcj0lZCBNYXhCb2FyZHM9JWQgTWF4Qm94ZXM9JWQgTWF4UG9ydHM9JWRcbiIsCisJCQlJUDJfVFRZX01BSk9SLCBJUDJfQ0FMTE9VVF9NQUpPUiwgSVAyX0lQTF9NQUpPUiwKKwkJCUlQMl9NQVhfQk9BUkRTLCBBQlNfTUFYX0JPWEVTLCBBQlNfQklHR0VTVF9CT1gpOworCisJZm9yKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCS8qIFRoaXMgbmVlZCB0byBiZSByZXNldCBmb3IgYSBib2FyZCBieSBib2FyZCBjb3VudC4uLiAqLworCQlib3hlcyA9IDA7CisJCXBCID0gaTJCb2FyZFB0clRhYmxlW2ldOworCQlpZiggcEIgKSB7CisJCQlzd2l0Y2goIHBCLT5pMmVQb20uZS5wb3JJRCAmIH5QT1JfSURfUkVTRVJWRUQgKSAKKwkJCXsKKwkJCWNhc2UgUE9SX0lEX0ZJSUVYOgorCQkJCWxlbiArPSBzcHJpbnRmKCBwYWdlK2xlbiwgIkJvYXJkICVkOiBFWCBwb3J0cz0iLCBpICk7CisJCQkJZm9yKCBib3ggPSAwOyBib3ggPCBBQlNfTUFYX0JPWEVTOyArK2JveCApCisJCQkJeworCQkJCQlwb3J0cyA9IDA7CisKKwkJCQkJaWYoIHBCLT5pMmVDaGFubmVsTWFwW2JveF0gIT0gMCApICsrYm94ZXM7CisJCQkJCWZvciggaiA9IDA7IGogPCBBQlNfQklHR0VTVF9CT1g7ICsraiApIAorCQkJCQl7CisJCQkJCQlpZiggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmIDE8PCBqICkgeworCQkJCQkJCSsrcG9ydHM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJbGVuICs9IHNwcmludGYoIHBhZ2UrbGVuLCAiJWQsIiwgcG9ydHMgKTsKKwkJCQkJdHBvcnRzICs9IHBvcnRzOworCQkJCX0KKworCQkJCS0tbGVuOwkvKiBCYWNrdXAgb3ZlciB0aGF0IGxhc3QgY29tbWEgKi8KKworCQkJCWxlbiArPSBzcHJpbnRmKCBwYWdlK2xlbiwgIiBib3hlcz0lZCB3aWR0aD0lZCIsIGJveGVzLCBwQi0+aTJlRGF0YVdpZHRoMTYgPyAxNiA6IDggKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQT1JfSURfSUlfNDoKKwkJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkJvYXJkICVkOiBJU0EtNCBwb3J0cz00IGJveGVzPTEiLCBpICk7CisJCQkJdHBvcnRzID0gcG9ydHMgPSA0OworCQkJCWJyZWFrOworCisJCQljYXNlIFBPUl9JRF9JSV84OgorCQkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiQm9hcmQgJWQ6IElTQS04LXN0ZCBwb3J0cz04IGJveGVzPTEiLCBpICk7CisJCQkJdHBvcnRzID0gcG9ydHMgPSA4OworCQkJCWJyZWFrOworCisJCQljYXNlIFBPUl9JRF9JSV84UjoKKwkJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkJvYXJkICVkOiBJU0EtOC1SSjExIHBvcnRzPTggYm94ZXM9MSIsIGkgKTsKKwkJCQl0cG9ydHMgPSBwb3J0cyA9IDg7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJCb2FyZCAlZDogdW5rbm93biIsIGkgKTsKKwkJCQkvKiBEb24ndCB0cnkgYW5kIHByb2JlIGZvciBtaW5vciBudW1iZXJzICovCisJCQkJdHBvcnRzID0gcG9ydHMgPSAwOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvKiBEb24ndCB0cnkgYW5kIHByb2JlIGZvciBtaW5vciBudW1iZXJzICovCisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkJvYXJkICVkOiB2YWNhbnQiLCBpICk7CisJCQl0cG9ydHMgPSBwb3J0cyA9IDA7CisJCX0KKworCQlpZiggdHBvcnRzICkgeworCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgbWlub3JzPSIgKTsKKworCQkJZm9yICggYm94ID0gMDsgYm94IDwgQUJTX01BWF9CT1hFUzsgKytib3ggKQorCQkJeworCQkJCWZvciAoIGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyArK2ogKQorCQkJCXsKKwkJCQkJaWYgKCBwQi0+aTJlQ2hhbm5lbE1hcFtib3hdICYgKDEgPDwgaikgKQorCQkJCQl7CisJCQkJCQlsZW4gKz0gc3ByaW50ZiAocGFnZStsZW4sIiVkLCIsCisJCQkJCQkJaiArIEFCU19CSUdHRVNUX0JPWCAqCisJCQkJCQkJKGJveCtpKkFCU19NQVhfQk9YRVMpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcGFnZVsgbGVuIC0gMSBdID0gJ1xuJzsJLyogT3ZlcndyaXRlIHRoYXQgbGFzdCBjb21tYSAqLworCQl9IGVsc2UgeworCQkJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCJcbiIgKTsKKwkJfQorCisJCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCisJCQlicmVhazsKKwkJaWYgKGxlbitiZWdpbiA8IG9mZikgeworCQkJYmVnaW4gKz0gbGVuOworCQkJbGVuID0gMDsKKwkJfQorCX0KKworCWlmIChpID49IElQMl9NQVhfQk9BUkRTKQorCQkqZW9mID0gMTsKKwlpZiAob2ZmID49IGxlbitiZWdpbikKKwkJcmV0dXJuIDA7CisKKwkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7CisJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7CisgfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMnRyYWNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBWYWx1ZSB0byBhZGQgdG8gdHJhY2UgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIElQMkRFQlVHX1RSQUNFCit2b2lkCitpcDJ0cmFjZSAodW5zaWduZWQgc2hvcnQgcG4sIHVuc2lnbmVkIGNoYXIgY2F0LCB1bnNpZ25lZCBjaGFyIGxhYmVsLCB1bnNpZ25lZCBsb25nIGNvZGVzLCAuLi4pCit7CisJbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nICpwQ29kZSA9ICZjb2RlczsKKwl1bmlvbiBpcDJicmVhZGNydW1iIGJjOworCWkyQ2hhblN0clB0ciAgcENoOworCisKKwl0cmFjZWJ1Zlt0cmFjZXN0dWZmKytdID0gamlmZmllczsKKwlpZiAoIHRyYWNlc3R1ZmYgPT0gVFJBQ0VNQVggKSB7CisJCXRyYWNlc3R1ZmYgPSAwOworCX0KKwlpZiAoIHRyYWNlc3R1ZmYgPT0gdHJhY2VzdHJpcCApIHsKKwkJaWYgKCArK3RyYWNlc3RyaXAgPT0gVFJBQ0VNQVggKSB7CisJCQl0cmFjZXN0cmlwID0gMDsKKwkJfQorCQkrK3RyYWNld3JhcDsKKwl9CisKKwliYy5oZHIucG9ydCAgPSAweGZmICYgcG47CisJYmMuaGRyLmNhdCAgID0gY2F0OworCWJjLmhkci5jb2RlcyA9ICh1bnNpZ25lZCBjaGFyKSggY29kZXMgJiAweGZmICk7CisJYmMuaGRyLmxhYmVsID0gbGFiZWw7CisJdHJhY2VidWZbdHJhY2VzdHVmZisrXSA9IGJjLnZhbHVlOworCisJZm9yICg7OykgeworCQlpZiAoIHRyYWNlc3R1ZmYgPT0gVFJBQ0VNQVggKSB7CisJCQl0cmFjZXN0dWZmID0gMDsKKwkJfQorCQlpZiAoIHRyYWNlc3R1ZmYgPT0gdHJhY2VzdHJpcCApIHsKKwkJCWlmICggKyt0cmFjZXN0cmlwID09IFRSQUNFTUFYICkgeworCQkJCXRyYWNlc3RyaXAgPSAwOworCQkJfQorCQkJKyt0cmFjZXdyYXA7CisJCX0KKworCQlpZiAoICFjb2Rlcy0tICkKKwkJCWJyZWFrOworCisJCXRyYWNlYnVmW3RyYWNlc3R1ZmYrK10gPSAqKytwQ29kZTsKKwl9Cit9CisjZW5kaWYKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRjYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZwpAQCAtMCwwICsxLDY3IEBACisjCisjIElQTUkgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiSVBNSSIKK2NvbmZpZyBJUE1JX0hBTkRMRVIKKyAgICAgICB0cmlzdGF0ZSAnSVBNSSB0b3AtbGV2ZWwgbWVzc2FnZSBoYW5kbGVyJworICAgICAgIGhlbHAKKyAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgY2VudHJhbCBJUE1JIG1lc3NhZ2UgaGFuZGxlciwgcmVxdWlyZWQgZm9yIElQTUkKKwkgdG8gd29yay4KKworICAgICAgICAgSVBNSSBpcyBhIHN0YW5kYXJkIGZvciBtYW5hZ2luZyBzZW5zb3JzICh0ZW1wZXJhdHVyZSwKKyAgICAgICAgIHZvbHRhZ2UsIGV0Yy4pIGluIGEgc3lzdGVtLgorCisgICAgICAgICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9JUE1JLnR4dD4gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgZHJpdmVyLgorCisJIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUE1JX1BBTklDX0VWRU5UCisgICAgICAgYm9vbCAnR2VuZXJhdGUgYSBwYW5pYyBldmVudCB0byBhbGwgQk1DcyBvbiBhIHBhbmljJworICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCisgICAgICAgaGVscAorICAgICAgICAgV2hlbiBhIHBhbmljIG9jY3VycywgdGhpcyB3aWxsIGNhdXNlIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciB0bworCSBnZW5lcmF0ZSBhbiBJUE1JIGV2ZW50IGRlc2NyaWJpbmcgdGhlIHBhbmljIHRvIGVhY2ggaW50ZXJmYWNlCisJIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbWVzc2FnZSBoYW5kbGVyLgorCitjb25maWcgSVBNSV9QQU5JQ19TVFJJTkcKKwlib29sICdHZW5lcmF0ZSBPRU0gZXZlbnRzIGNvbnRhaW5pbmcgdGhlIHBhbmljIHN0cmluZycKKwlkZXBlbmRzIG9uIElQTUlfUEFOSUNfRVZFTlQKKwloZWxwCisJICBXaGVuIGEgcGFuaWMgb2NjdXJzLCB0aGlzIHdpbGwgY2F1c2UgdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyIHRvCisJICBnZW5lcmF0ZSBJUE1JIE9FTSB0eXBlIGYwIGV2ZW50cyBob2xkaW5nIHRoZSBJUE1CIGFkZHJlc3Mgb2YgdGhlCisJICBwYW5pYyBnZW5lcmF0b3IgKGJ5dGUgNCBvZiB0aGUgZXZlbnQpLCBhIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlCisJICBzdHJpbmcgKGJ5dGUgNSBvZiB0aGUgZXZlbnQpIGFuZCBwYXJ0IG9mIHRoZSBzdHJpbmcgKHRoZSByZXN0IG9mIHRoZQorCSAgZXZlbnQpLiAgQnl0ZXMgMSwgMiwgYW5kIDMgYXJlIHRoZSBub3JtYWwgdXNhZ2UgZm9yIGFuIE9FTSBldmVudC4KKwkgIFlvdSBjYW4gZmV0Y2ggdGhlc2UgZXZlbnRzIGFuZCB1c2UgdGhlIHNlcXVlbmNlIG51bWJlcnMgdG8gcGllY2UgdGhlCisJICBzdHJpbmcgdG9nZXRoZXIuCisKK2NvbmZpZyBJUE1JX0RFVklDRV9JTlRFUkZBQ0UKKyAgICAgICB0cmlzdGF0ZSAnRGV2aWNlIGludGVyZmFjZSBmb3IgSVBNSScKKyAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgorICAgICAgIGhlbHAKKyAgICAgICAgIFRoaXMgcHJvdmlkZXMgYW4gSU9DVEwgaW50ZXJmYWNlIHRvIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciBzbworCSB1c2VybGFuZCBwcm9jZXNzZXMgbWF5IHVzZSBJUE1JLiAgSXQgc3VwcG9ydHMgcG9sbCgpIGFuZCBzZWxlY3QoKS4KKworY29uZmlnIElQTUlfU0kKKyAgICAgICB0cmlzdGF0ZSAnSVBNSSBTeXN0ZW0gSW50ZXJmYWNlIGhhbmRsZXInCisgICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKKyAgICAgICBoZWxwCisgICAgICAgICBQcm92aWRlcyBhIGRyaXZlciBmb3IgU3lzdGVtIEludGVyZmFjZXMgKEtDUywgU01JQywgQlQpLgorCSBDdXJyZW50bHksIG9ubHkgS0NTIGFuZCBTTUlDIGFyZSBzdXBwb3J0ZWQuICBJZgorCSB5b3UgYXJlIHVzaW5nIElQTUksIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5ICJ5IiBoZXJlLgorCitjb25maWcgSVBNSV9XQVRDSERPRworICAgICAgIHRyaXN0YXRlICdJUE1JIFdhdGNoZG9nIFRpbWVyJworICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBlbmFibGVzIHRoZSBJUE1JIHdhdGNoZG9nIHRpbWVyLgorCitjb25maWcgSVBNSV9QT1dFUk9GRgorICAgICAgIHRyaXN0YXRlICdJUE1JIFBvd2Vyb2ZmJworICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBlbmFibGVzIGEgZnVuY3Rpb24gdG8gcG93ZXIgb2ZmIHRoZSBzeXN0ZW0gd2l0aCBJUE1JIGlmCisJIHRoZSBJUE1JIG1hbmFnZW1lbnQgY29udHJvbGxlciBpcyBjYXBhYmxlIG9mIHRoaXMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2lwbWkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZjBhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBpcG1pIGRyaXZlcnMuCisjCisKK2lwbWlfc2ktb2JqcyA6PSBpcG1pX3NpX2ludGYubyBpcG1pX2tjc19zbS5vIGlwbWlfc21pY19zbS5vIGlwbWlfYnRfc20ubworCitvYmotJChDT05GSUdfSVBNSV9IQU5ETEVSKSArPSBpcG1pX21zZ2hhbmRsZXIubworb2JqLSQoQ09ORklHX0lQTUlfREVWSUNFX0lOVEVSRkFDRSkgKz0gaXBtaV9kZXZpbnRmLm8KK29iai0kKENPTkZJR19JUE1JX1NJKSArPSBpcG1pX3NpLm8KK29iai0kKENPTkZJR19JUE1JX1dBVENIRE9HKSArPSBpcG1pX3dhdGNoZG9nLm8KK29iai0kKENPTkZJR19JUE1JX1BPV0VST0ZGKSArPSBpcG1pX3Bvd2Vyb2ZmLm8KKworaXBtaV9zaS5vOgkkKGlwbWlfc2ktb2JqcykKKwkkKExEKSAtciAtbyAkQCAkKGlwbWlfc2ktb2JqcykKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWIzMzAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogIGlwbWlfYnRfc20uYworICoKKyAqICBUaGUgc3RhdGUgbWFjaGluZSBmb3IgYW4gT3BlbiBJUE1JIEJUIHN1Yi1kcml2ZXIgdW5kZXIgaXBtaV9zaS5jLCBwYXJ0CisgKiAgb2YgdGhlIGRyaXZlciBhcmNoaXRlY3R1cmUgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L29wZW5pcG1pCisgKgorICogIEF1dGhvcjoJUm9ja3kgQ3JhaWcgPGZpcnN0Lmxhc3RAaHAuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIEZvciBwcmludGsuICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLworI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKKworI2RlZmluZSBJUE1JX0JUX1ZFUlNJT04gInYzMyIKKworc3RhdGljIGludCBidF9kZWJ1ZyA9IDB4MDA7CS8qIFByb2R1Y3Rpb24gdmFsdWUgMCwgc2VlIGZvbGxvd2luZyBmbGFncyAqLworCisjZGVmaW5lCUJUX0RFQlVHX0VOQUJMRQkxCisjZGVmaW5lIEJUX0RFQlVHX01TRwkyCisjZGVmaW5lIEJUX0RFQlVHX1NUQVRFUwk0CisKKy8qIFR5cGljYWwgIkdldCBCVCBDYXBhYmlsaXRpZXMiIHZhbHVlcyBhcmUgMi0zIHJldHJpZXMsIDUtMTAgc2Vjb25kcywKKyAgIGFuZCA2NCBieXRlIGJ1ZmZlcnMuICBIb3dldmVyLCBvbmUgSFAgaW1wbGVtZW50YXRpb24gd2FudHMgMjU1IGJ5dGVzIG9mCisgICBidWZmZXIgKHdpdGggYSBkb2N1bWVudGVkIG1lc3NhZ2Ugb2YgMTYwIGJ5dGVzKSBzbyBnbyBmb3IgdGhlIG1heC4KKyAgIFNpbmNlIHRoZSBPcGVuIElQTUkgYXJjaGl0ZWN0dXJlIGlzIHNpbmdsZS1tZXNzYWdlIG9yaWVudGVkIGF0IHRoaXMKKyAgIHN0YWdlLCB0aGUgcXVldWUgZGVwdGggb2YgQlQgaXMgb2Ygbm8gY29uY2Vybi4gKi8KKworI2RlZmluZSBCVF9OT1JNQUxfVElNRU9VVAkyMDAwMDAwCS8qIHNlY29uZHMgaW4gbWljcm9zZWNvbmRzICovCisjZGVmaW5lIEJUX1JFVFJZX0xJTUlUCQkyCisjZGVmaW5lIEJUX1JFU0VUX0RFTEFZCQk2MDAwMDAwCS8qIDYgc2Vjb25kcyBhZnRlciB3YXJtIHJlc2V0ICovCisKK2VudW0gYnRfc3RhdGVzIHsKKwlCVF9TVEFURV9JRExFLAorCUJUX1NUQVRFX1hBQ1RJT05fU1RBUlQsCisJQlRfU1RBVEVfV1JJVEVfQllURVMsCisJQlRfU1RBVEVfV1JJVEVfRU5ELAorCUJUX1NUQVRFX1dSSVRFX0NPTlNVTUUsCisJQlRfU1RBVEVfQjJIX1dBSVQsCisJQlRfU1RBVEVfUkVBRF9FTkQsCisJQlRfU1RBVEVfUkVTRVQxLAkJLyogVGhlc2UgbXVzdCBjb21lIGxhc3QgKi8KKwlCVF9TVEFURV9SRVNFVDIsCisJQlRfU1RBVEVfUkVTRVQzLAorCUJUX1NUQVRFX1JFU1RBUlQsCisJQlRfU1RBVEVfSE9TRUQKK307CisKK3N0cnVjdCBzaV9zbV9kYXRhIHsKKwllbnVtIGJ0X3N0YXRlcwlzdGF0ZTsKKwllbnVtIGJ0X3N0YXRlcwlsYXN0X3N0YXRlOwkvKiBhc3Npc3QgcHJpbnRpbmcgYW5kIHJlc2V0cyAqLworCXVuc2lnbmVkIGNoYXIJc2VxOwkJLyogQlQgc2VxdWVuY2UgbnVtYmVyICovCisJc3RydWN0IHNpX3NtX2lvCSppbzsKKyAgICAgICAgdW5zaWduZWQgY2hhcgl3cml0ZV9kYXRhW0lQTUlfTUFYX01TR19MRU5HVEhdOworICAgICAgICBpbnQJCXdyaXRlX2NvdW50OworICAgICAgICB1bnNpZ25lZCBjaGFyCXJlYWRfZGF0YVtJUE1JX01BWF9NU0dfTEVOR1RIXTsKKyAgICAgICAgaW50CQlyZWFkX2NvdW50OworICAgICAgICBpbnQJCXRydW5jYXRlZDsKKyAgICAgICAgbG9uZwkJdGltZW91dDsKKyAgICAgICAgdW5zaWduZWQgaW50CWVycm9yX3JldHJpZXM7CS8qIGVuZCBvZiAiY29tbW9uIiBmaWVsZHMgKi8KKwlpbnQJCW5vbnplcm9fc3RhdHVzOwkvKiBodW5nIEJNQ3Mgc3RheSBhbGwgMCAqLworfTsKKworI2RlZmluZSBCVF9DTFJfV1JfUFRSCTB4MDEJLyogU2VlIElQTUkgMS41IHRhYmxlIDExLjYuNCAqLworI2RlZmluZSBCVF9DTFJfUkRfUFRSCTB4MDIKKyNkZWZpbmUgQlRfSDJCX0FUTgkweDA0CisjZGVmaW5lIEJUX0IySF9BVE4JMHgwOAorI2RlZmluZSBCVF9TTVNfQVROCTB4MTAKKyNkZWZpbmUgQlRfT0VNMAkJMHgyMAorI2RlZmluZSBCVF9IX0JVU1kJMHg0MAorI2RlZmluZSBCVF9CX0JVU1kJMHg4MAorCisvKiBTb21lIGJpdHMgYXJlIHRvZ2dsZWQgb24gZWFjaCB3cml0ZTogd3JpdGUgb25jZSB0byBzZXQgaXQsIG9uY2UKKyAgIG1vcmUgdG8gY2xlYXIgaXQ7IHdyaXRpbmcgYSB6ZXJvIGRvZXMgbm90aGluZy4gIFRvIGFic29sdXRlbHkKKyAgIGNsZWFyIGl0LCBjaGVjayBpdHMgc3RhdGUgYW5kIHdyaXRlIGlmIHNldC4gIFRoaXMgYXZvaWRzIHRoZSAiZ2V0CisgICBjdXJyZW50IHRoZW4gdXNlIGFzIG1hc2siIHNjaGVtZSB0byBtb2RpZnkgb25lIGJpdC4gIE5vdGUgdGhhdCB0aGUKKyAgIHZhcmlhYmxlICJidCIgaXMgaGFyZGNvZGVkIGludG8gdGhlc2UgbWFjcm9zLiAqLworCisjZGVmaW5lIEJUX1NUQVRVUwlidC0+aW8tPmlucHV0YihidC0+aW8sIDApCisjZGVmaW5lIEJUX0NPTlRST0woeCkJYnQtPmlvLT5vdXRwdXRiKGJ0LT5pbywgMCwgeCkKKworI2RlZmluZSBCTUMySE9TVAlidC0+aW8tPmlucHV0YihidC0+aW8sIDEpCisjZGVmaW5lIEhPU1QyQk1DKHgpCWJ0LT5pby0+b3V0cHV0YihidC0+aW8sIDEsIHgpCisKKyNkZWZpbmUgQlRfSU5UTUFTS19SCWJ0LT5pby0+aW5wdXRiKGJ0LT5pbywgMikKKyNkZWZpbmUgQlRfSU5UTUFTS19XKHgpCWJ0LT5pby0+b3V0cHV0YihidC0+aW8sIDIsIHgpCisKKy8qIENvbnZlbmllbmNlIHJvdXRpbmVzIGZvciBkZWJ1Z2dpbmcuICBUaGVzZSBhcmUgbm90IG11bHRpLW9wZW4gc2FmZSEKKyAgIE5vdGUgdGhlIG1hY3JvcyBoYXZlIGhhcmRjb2RlZCB2YXJpYWJsZXMgaW4gdGhlbS4gKi8KKworc3RhdGljIGNoYXIgKnN0YXRlMnR4dCh1bnNpZ25lZCBjaGFyIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBCVF9TVEFURV9JRExFOgkJcmV0dXJuKCJJRExFIik7CisJCWNhc2UgQlRfU1RBVEVfWEFDVElPTl9TVEFSVDoJcmV0dXJuKCJYQUNUSU9OIik7CisJCWNhc2UgQlRfU1RBVEVfV1JJVEVfQllURVM6CXJldHVybigiV1JfQllURVMiKTsKKwkJY2FzZSBCVF9TVEFURV9XUklURV9FTkQ6CXJldHVybigiV1JfRU5EIik7CisJCWNhc2UgQlRfU1RBVEVfV1JJVEVfQ09OU1VNRToJcmV0dXJuKCJXUl9DT05TVU1FIik7CisJCWNhc2UgQlRfU1RBVEVfQjJIX1dBSVQ6CQlyZXR1cm4oIkIySF9XQUlUIik7CisJCWNhc2UgQlRfU1RBVEVfUkVBRF9FTkQ6CQlyZXR1cm4oIlJEX0VORCIpOworCQljYXNlIEJUX1NUQVRFX1JFU0VUMToJCXJldHVybigiUkVTRVQxIik7CisJCWNhc2UgQlRfU1RBVEVfUkVTRVQyOgkJcmV0dXJuKCJSRVNFVDIiKTsKKwkJY2FzZSBCVF9TVEFURV9SRVNFVDM6CQlyZXR1cm4oIlJFU0VUMyIpOworCQljYXNlIEJUX1NUQVRFX1JFU1RBUlQ6CQlyZXR1cm4oIlJFU1RBUlQiKTsKKwkJY2FzZSBCVF9TVEFURV9IT1NFRDoJCXJldHVybigiSE9TRUQiKTsKKwl9CisJcmV0dXJuKCJCQUQgU1RBVEUiKTsKK30KKyNkZWZpbmUgU1RBVEUyVFhUIHN0YXRlMnR4dChidC0+c3RhdGUpCisKK3N0YXRpYyBjaGFyICpzdGF0dXMydHh0KHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBjaGFyICpidWYpCit7CisJc3RyY3B5KGJ1ZiwgIlsgIik7CisJaWYgKHN0YXR1cyAmIEJUX0JfQlVTWSkgc3RyY2F0KGJ1ZiwgIkJfQlVTWSAiKTsKKwlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKSBzdHJjYXQoYnVmLCAiSF9CVVNZICIpOworCWlmIChzdGF0dXMgJiBCVF9PRU0wKSBzdHJjYXQoYnVmLCAiT0VNMCAiKTsKKwlpZiAoc3RhdHVzICYgQlRfU01TX0FUTikgc3RyY2F0KGJ1ZiwgIlNNUyAiKTsKKwlpZiAoc3RhdHVzICYgQlRfQjJIX0FUTikgc3RyY2F0KGJ1ZiwgIkIySCAiKTsKKwlpZiAoc3RhdHVzICYgQlRfSDJCX0FUTikgc3RyY2F0KGJ1ZiwgIkgyQiAiKTsKKwlzdHJjYXQoYnVmLCAiXSIpOworCXJldHVybiBidWY7Cit9CisjZGVmaW5lIFNUQVRVUzJUWFQoYnVmKSBzdGF0dXMydHh0KHN0YXR1cywgYnVmKQorCisvKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoaXMgbW9kdWxlIG9uIGEgaG9zZWQgY29uZGl0aW9uICovCisjZGVmaW5lIEZJUlNUX1NFUQkwCitzdGF0aWMgdW5zaWduZWQgaW50IGJ0X2luaXRfZGF0YShzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsIHN0cnVjdCBzaV9zbV9pbyAqaW8pCit7CisJYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsKKwlidC0+bGFzdF9zdGF0ZSA9IEJUX1NUQVRFX0lETEU7CisJYnQtPnNlcSA9IEZJUlNUX1NFUTsKKwlidC0+aW8gPSBpbzsKKwlidC0+d3JpdGVfY291bnQgPSAwOworCWJ0LT5yZWFkX2NvdW50ID0gMDsKKwlidC0+ZXJyb3JfcmV0cmllcyA9IDA7CisJYnQtPm5vbnplcm9fc3RhdHVzID0gMDsKKwlidC0+dHJ1bmNhdGVkID0gMDsKKwlidC0+dGltZW91dCA9IEJUX05PUk1BTF9USU1FT1VUOworCXJldHVybiAzOyAvKiBXZSBjbGFpbSAzIGJ5dGVzIG9mIHNwYWNlOyBvdWdodCB0byBjaGVjayBTUE1JIHRhYmxlICovCit9CisKK3N0YXRpYyBpbnQgYnRfc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHNpX3NtX2RhdGEgKmJ0LAorCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoKHNpemUgPCAyKSB8fCAoc2l6ZSA+IElQTUlfTUFYX01TR19MRU5HVEgpKSByZXR1cm4gLTE7CisKKwlpZiAoKGJ0LT5zdGF0ZSAhPSBCVF9TVEFURV9JRExFKSAmJiAoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0hPU0VEKSkKKwkJcmV0dXJuIC0yOworCisJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7CisgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IHdyaXRlIHNlcT0weCUwMlg6IiwgYnQtPnNlcSk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKSBwcmludGsgKCIgJTAyeCIsIGRhdGFbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCWJ0LT53cml0ZV9kYXRhWzBdID0gc2l6ZSArIDE7CS8qIGFsbCBkYXRhIHBsdXMgc2VxIGJ5dGUgKi8KKwlidC0+d3JpdGVfZGF0YVsxXSA9ICpkYXRhOwkvKiBOZXRGbi9MVU4gKi8KKwlidC0+d3JpdGVfZGF0YVsyXSA9IGJ0LT5zZXE7CisJbWVtY3B5KGJ0LT53cml0ZV9kYXRhICsgMywgZGF0YSArIDEsIHNpemUgLSAxKTsKKwlidC0+d3JpdGVfY291bnQgPSBzaXplICsgMjsKKworCWJ0LT5lcnJvcl9yZXRyaWVzID0gMDsKKwlidC0+bm9uemVyb19zdGF0dXMgPSAwOworCWJ0LT5yZWFkX2NvdW50ID0gMDsKKwlidC0+dHJ1bmNhdGVkID0gMDsKKwlidC0+c3RhdGUgPSBCVF9TVEFURV9YQUNUSU9OX1NUQVJUOworCWJ0LT5sYXN0X3N0YXRlID0gQlRfU1RBVEVfSURMRTsKKwlidC0+dGltZW91dCA9IEJUX05PUk1BTF9USU1FT1VUOworCXJldHVybiAwOworfQorCisvKiBBZnRlciB0aGUgdXBwZXIgc3RhdGUgbWFjaGluZSBoYXMgYmVlbiB0b2xkIFNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFCisgICBpdCBjYWxscyB0aGlzLiAgU3RyaXAgb3V0IHRoZSBsZW5ndGggYW5kIHNlcSBieXRlcy4gKi8KKworc3RhdGljIGludCBidF9nZXRfcmVzdWx0KHN0cnVjdCBzaV9zbV9kYXRhICpidCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBtc2dfbGVuOworCisJbXNnX2xlbiA9IGJ0LT5yZWFkX2NvdW50IC0gMjsJCS8qIGFjY291bnQgZm9yIGxlbmd0aCAmIHNlcSAqLworCS8qIEFsd2F5cyBOZXRGbiwgQ21kLCBjQ29kZSAqLworCWlmIChtc2dfbGVuIDwgMyB8fCBtc2dfbGVuID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVCByZXN1bHRzOiBiYWQgbXNnX2xlbiA9ICVkXG4iLCBtc2dfbGVuKTsKKwkJZGF0YVswXSA9IGJ0LT53cml0ZV9kYXRhWzFdIHwgMHg0OwkvKiBLbHVkZ2UgYSByZXNwb25zZSAqLworCQlkYXRhWzFdID0gYnQtPndyaXRlX2RhdGFbM107CisJCWRhdGFbMl0gPSBJUE1JX0VSUl9VTlNQRUNJRklFRDsKKwkJbXNnX2xlbiA9IDM7CisJfSBlbHNlIHsKKwkJZGF0YVswXSA9IGJ0LT5yZWFkX2RhdGFbMV07CisJCWRhdGFbMV0gPSBidC0+cmVhZF9kYXRhWzNdOworCQlpZiAobGVuZ3RoIDwgbXNnX2xlbikgYnQtPnRydW5jYXRlZCA9IDE7CisJCWlmIChidC0+dHJ1bmNhdGVkKSB7CS8qIGNhbiBiZSBzZXQgaW4gcmVhZF9hbGxfYnl0ZXMoKSAqLworCQkJZGF0YVsyXSA9IElQTUlfRVJSX01TR19UUlVOQ0FURUQ7CisJCQltc2dfbGVuID0gMzsKKwkJfSBlbHNlIG1lbWNweShkYXRhICsgMiwgYnQtPnJlYWRfZGF0YSArIDQsIG1zZ19sZW4gLSAyKTsKKworCQlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCVDogcmVzIChyYXcpIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbXNnX2xlbjsgaSsrKSBwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7CisJCQlwcmludGsgKCJcbiIpOworCQl9CisJfQorCWJ0LT5yZWFkX2NvdW50ID0gMDsJLyogcGFyYW5vaWEgKi8KKwlyZXR1cm4gbXNnX2xlbjsKK30KKworLyogVGhpcyBiaXQncyBmdW5jdGlvbmFsaXR5IGlzIG9wdGlvbmFsICovCisjZGVmaW5lIEJUX0JNQ19IV1JTVAkweDgwCisKK3N0YXRpYyB2b2lkIHJlc2V0X2ZsYWdzKHN0cnVjdCBzaV9zbV9kYXRhICpidCkKK3sKKwlpZiAoQlRfU1RBVFVTICYgQlRfSF9CVVNZKSBCVF9DT05UUk9MKEJUX0hfQlVTWSk7CisJaWYgKEJUX1NUQVRVUyAmIEJUX0JfQlVTWSkgQlRfQ09OVFJPTChCVF9CX0JVU1kpOworCUJUX0NPTlRST0woQlRfQ0xSX1dSX1BUUik7CisJQlRfQ09OVFJPTChCVF9TTVNfQVROKTsKKwlCVF9JTlRNQVNLX1coQlRfQk1DX0hXUlNUKTsKKyNpZmRlZiBERVZFTE9QTUVOVF9PTkxZX05PVF9GT1JfUFJPRFVDVElPTgorCWlmIChCVF9TVEFUVVMgJiBCVF9CMkhfQVROKSB7CisJCWludCBpOworCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CisJCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CisJCUJUX0NPTlRST0woQlRfQ0xSX1JEX1BUUik7CisJCWZvciAoaSA9IDA7IGkgPCBJUE1JX01BWF9NU0dfTEVOR1RIICsgMjsgaSsrKSBCTUMySE9TVDsKKwkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYWxsX2J5dGVzKHN0cnVjdCBzaV9zbV9kYXRhICpidCkKK3sKKwlpbnQgaTsKKworCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykgeworICAgIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IHdyaXRlICVkIGJ5dGVzIHNlcT0weCUwMlgiLAorCQkJYnQtPndyaXRlX2NvdW50LCBidC0+c2VxKTsKKwkJZm9yIChpID0gMDsgaSA8IGJ0LT53cml0ZV9jb3VudDsgaSsrKQorCQkJcHJpbnRrICgiICUwMngiLCBidC0+d3JpdGVfZGF0YVtpXSk7CisJCXByaW50ayAoIlxuIik7CisJfQorCWZvciAoaSA9IDA7IGkgPCBidC0+d3JpdGVfY291bnQ7IGkrKykgSE9TVDJCTUMoYnQtPndyaXRlX2RhdGFbaV0pOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWFkX2FsbF9ieXRlcyhzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQpCit7CisJdW5zaWduZWQgY2hhciBpOworCisJYnQtPnJlYWRfZGF0YVswXSA9IEJNQzJIT1NUOworCWJ0LT5yZWFkX2NvdW50ID0gYnQtPnJlYWRfZGF0YVswXTsKKwlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpCisgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogcmVhZCAlZCBieXRlczoiLCBidC0+cmVhZF9jb3VudCk7CisKKwkvKiBtaW5pbXVtOiBsZW5ndGgsIE5ldEZuLCBTZXEsIENtZCwgY0NvZGUgPT0gNSB0b3RhbCwgb3IgNCBtb3JlCisJICAgZm9sbG93aW5nIHRoZSBsZW5ndGggYnl0ZS4gKi8KKwlpZiAoYnQtPnJlYWRfY291bnQgPCA0IHx8IGJ0LT5yZWFkX2NvdW50ID49IElQTUlfTUFYX01TR19MRU5HVEgpIHsKKwkJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKQorCQkJcHJpbnRrKCJiYWQgbGVuZ3RoICVkXG4iLCBidC0+cmVhZF9jb3VudCk7CisJCWJ0LT50cnVuY2F0ZWQgPSAxOworCQlyZXR1cm4gMTsJLyogbGV0IG5leHQgWEFDVElPTiBTVEFSVCBjbGVhbiBpdCB1cCAqLworCX0KKwlmb3IgKGkgPSAxOyBpIDw9IGJ0LT5yZWFkX2NvdW50OyBpKyspIGJ0LT5yZWFkX2RhdGFbaV0gPSBCTUMySE9TVDsKKwlidC0+cmVhZF9jb3VudCsrOwkvKiBhY2NvdW50IGZvciB0aGUgbGVuZ3RoIGJ5dGUgKi8KKworCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykgeworCSAgICAJZm9yIChpID0gMDsgaSA8IGJ0LT5yZWFkX2NvdW50OyBpKyspCisJCQlwcmludGsgKCIgJTAyeCIsIGJ0LT5yZWFkX2RhdGFbaV0pOworCSAgICAJcHJpbnRrICgiXG4iKTsKKwl9CisJaWYgKGJ0LT5zZXEgIT0gYnQtPndyaXRlX2RhdGFbMl0pCS8qIGlkaW90IGNoZWNrICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUOiBpbnRlcm5hbCBlcnJvcjogc2VxdWVuY2UgbWlzbWF0Y2hcbiIpOworCisJLyogcGVyIHRoZSBzcGVjLCB0aGUgKE5ldEZuLCBTZXEsIENtZCkgdHVwbGVzIHNob3VsZCBtYXRjaCAqLworCWlmICgoYnQtPnJlYWRfZGF0YVszXSA9PSBidC0+d3JpdGVfZGF0YVszXSkgJiYJCS8qIENtZCAqLworICAgICAgICAJKGJ0LT5yZWFkX2RhdGFbMl0gPT0gYnQtPndyaXRlX2RhdGFbMl0pICYmCS8qIFNlcXVlbmNlICovCisgICAgICAgIAkoKGJ0LT5yZWFkX2RhdGFbMV0gJiAweEY4KSA9PSAoYnQtPndyaXRlX2RhdGFbMV0gJiAweEY4KSkpCisJCQlyZXR1cm4gMTsKKworCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykgcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IGJhZCBwYWNrZXQ6ICIKKwkJIndhbnQgMHgoJTAyWCwgJTAyWCwgJTAyWCkgZ290ICglMDJYLCAlMDJYLCAlMDJYKVxuIiwKKwkJYnQtPndyaXRlX2RhdGFbMV0sIGJ0LT53cml0ZV9kYXRhWzJdLCBidC0+d3JpdGVfZGF0YVszXSwKKwkJYnQtPnJlYWRfZGF0YVsxXSwgIGJ0LT5yZWFkX2RhdGFbMl0sICBidC0+cmVhZF9kYXRhWzNdKTsKKwlyZXR1cm4gMDsKK30KKworLyogTW9kaWZpZXMgYnQtPnN0YXRlIGFwcHJvcHJpYXRlbHksIG5lZWQgdG8gZ2V0IGludG8gdGhlIGJ0X2V2ZW50KCkgc3dpdGNoICovCisKK3N0YXRpYyB2b2lkIGVycm9yX3JlY292ZXJ5KHN0cnVjdCBzaV9zbV9kYXRhICpidCwgY2hhciAqcmVhc29uKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWNoYXIgYnVmWzQwXTsgLyogRm9yIGdldHRpbmcgc3RhdHVzICovCisKKwlidC0+dGltZW91dCA9IEJUX05PUk1BTF9USU1FT1VUOyAvKiB2YXJpb3VzIHBsYWNlcyB3YW50IHRvIHJldHJ5ICovCisKKwlzdGF0dXMgPSBCVF9TVEFUVVM7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6ICVzIGluICVzICVzICIsIHJlYXNvbiwgU1RBVEUyVFhULAorCSAgICAgICBTVEFUVVMyVFhUKGJ1ZikpOworCisJKGJ0LT5lcnJvcl9yZXRyaWVzKSsrOworCWlmIChidC0+ZXJyb3JfcmV0cmllcyA+IEJUX1JFVFJZX0xJTUlUKSB7CisJCXByaW50aygicmV0cnkgbGltaXQgKCVkKSBleGNlZWRlZFxuIiwgQlRfUkVUUllfTElNSVQpOworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9IT1NFRDsKKwkJaWYgKCFidC0+bm9uemVyb19zdGF0dXMpCisJCQlwcmludGsoS0VSTl9FUlIgIklQTUk6IEJUIHN0dWNrLCB0cnkgcG93ZXIgY3ljbGVcbiIpOworCQllbHNlIGlmIChidC0+c2VxID09IEZJUlNUX1NFUSArIEJUX1JFVFJZX0xJTUlUKSB7CisJCQkvKiBtb3N0IGxpa2VseSBkdXJpbmcgaW5zbW9kICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJUE1JOiBCVCByZXNldCAodGFrZXMgNSBzZWNzKVxuIik7CisgICAgICAgIAkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTRVQxOworCQl9CisJcmV0dXJuOworCX0KKworCS8qIFNvbWV0aW1lcyB0aGUgQk1DIHF1ZXVlcyBnZXQgaW4gYW4gIm9mZi1ieS1vbmUiIHN0YXRlLi4uKi8KKwlpZiAoKGJ0LT5zdGF0ZSA9PSBCVF9TVEFURV9CMkhfV0FJVCkgJiYgKHN0YXR1cyAmIEJUX0IySF9BVE4pKSB7CisgICAgCQlwcmludGsoInJldHJ5IEIySF9XQUlUXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50aygicmVzdGFydCBjb21tYW5kXG4iKTsKKwlidC0+c3RhdGUgPSBCVF9TVEFURV9SRVNUQVJUOworfQorCisvKiBDaGVjayB0aGUgc3RhdHVzIGFuZCAocG9zc2libHkpIGFkdmFuY2UgdGhlIEJUIHN0YXRlIG1hY2hpbmUuICBUaGUKKyAgIGRlZmF1bHQgcmV0dXJuIGlzIFNJX1NNX0NBTExfV0lUSF9ERUxBWS4gKi8KKworc3RhdGljIGVudW0gc2lfc21fcmVzdWx0IGJ0X2V2ZW50KHN0cnVjdCBzaV9zbV9kYXRhICpidCwgbG9uZyB0aW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWNoYXIgYnVmWzQwXTsgLyogRm9yIGdldHRpbmcgc3RhdHVzICovCisJaW50IGk7CisKKwlzdGF0dXMgPSBCVF9TVEFUVVM7CisJYnQtPm5vbnplcm9fc3RhdHVzIHw9IHN0YXR1czsKKworCWlmICgoYnRfZGVidWcgJiBCVF9ERUJVR19TVEFURVMpICYmIChidC0+c3RhdGUgIT0gYnQtPmxhc3Rfc3RhdGUpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogJXMgJXMgVE89JWxkIC0gJWxkIFxuIiwKKwkJCVNUQVRFMlRYVCwKKwkJCVNUQVRVUzJUWFQoYnVmKSwKKwkJCWJ0LT50aW1lb3V0LAorCQkJdGltZSk7CisJYnQtPmxhc3Rfc3RhdGUgPSBidC0+c3RhdGU7CisKKwlpZiAoYnQtPnN0YXRlID09IEJUX1NUQVRFX0hPU0VEKSByZXR1cm4gU0lfU01fSE9TRUQ7CisKKwlpZiAoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpIHsJLyogZG8gdGltZW91dCB0ZXN0ICovCisKKwkJLyogQ2VydGFpbiBzdGF0ZXMsIG9uIGVycm9yIGNvbmRpdGlvbnMsIGNhbiBsb2NrIHVwIGEgQ1BVCisJCSAgIGJlY2F1c2UgdGhleSBhcmUgZWZmZWN0aXZlbHkgaW4gYW4gaW5maW5pdGUgbG9vcCB3aXRoCisJCSAgIENBTExfV0lUSE9VVF9ERUxBWSAocmlnaHQgYmFjayBoZXJlIHdpdGggdGltZSA9PSAwKS4KKwkJICAgUHJldmVudCBpbmZpbml0ZSBsb2NrdXAgYnkgQUxXQVlTIGRlY3JlbWVudGluZyB0aW1lb3V0LiAqLworCisgICAgCS8qIEZJWE1FOiBidF9ldmVudCBpcyBzb21ldGltZXMgY2FsbGVkIHdpdGggdGltZSA+IEJUX05PUk1BTF9USU1FT1VUCisgICAgICAgICAgICAgIChub3RpY2VkIGluIGlwbWlfc21pY19zbS5jIEphbnVhcnkgMjAwNCkgKi8KKworCQlpZiAoKHRpbWUgPD0gMCkgfHwgKHRpbWUgPj0gQlRfTk9STUFMX1RJTUVPVVQpKSB0aW1lID0gMTAwOworCQlidC0+dGltZW91dCAtPSB0aW1lOworCQlpZiAoKGJ0LT50aW1lb3V0IDwgMCkgJiYgKGJ0LT5zdGF0ZSA8IEJUX1NUQVRFX1JFU0VUMSkpIHsKKwkJCWVycm9yX3JlY292ZXJ5KGJ0LCAidGltZWQgb3V0Iik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOworCQl9CisJfQorCisJc3dpdGNoIChidC0+c3RhdGUpIHsKKworICAgIAljYXNlIEJUX1NUQVRFX0lETEU6CS8qIGNoZWNrIGZvciBhc3luY2hyb25vdXMgbWVzc2FnZXMgKi8KKwkJaWYgKHN0YXR1cyAmIEJUX1NNU19BVE4pIHsKKwkJCUJUX0NPTlRST0woQlRfU01TX0FUTik7CS8qIGNsZWFyIGl0ICovCisJCQlyZXR1cm4gU0lfU01fQVRUTjsKKwkJfQorCQlyZXR1cm4gU0lfU01fSURMRTsKKworCWNhc2UgQlRfU1RBVEVfWEFDVElPTl9TVEFSVDoKKwkJaWYgKHN0YXR1cyAmIEJUX0hfQlVTWSkgeworCQkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOworCQkJYnJlYWs7CisJCX0KKyAgICAJCWlmIChzdGF0dXMgJiBCVF9CMkhfQVROKSBicmVhazsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfV1JJVEVfQllURVM7CisJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7CS8qIGZvciBsb2dnaW5nICovCisKKwljYXNlIEJUX1NUQVRFX1dSSVRFX0JZVEVTOgorCQlpZiAoc3RhdHVzICYgKEJUX0JfQlVTWSB8IEJUX0gyQl9BVE4pKSBicmVhazsKKwkJQlRfQ09OVFJPTChCVF9DTFJfV1JfUFRSKTsKKwkJd3JpdGVfYWxsX2J5dGVzKGJ0KTsKKwkJQlRfQ09OVFJPTChCVF9IMkJfQVROKTsJLyogY2xlYXJzIHRvbyBmYXN0IHRvIGNhdGNoPyAqLworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9XUklURV9DT05TVU1FOworCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOyAvKiBpdCBNSUdIVCBzYWlsIHRocm91Z2ggKi8KKworCWNhc2UgQlRfU1RBVEVfV1JJVEVfQ09OU1VNRTogLyogQk1DcyB1c3VhbGx5IGJsb3cgcmlnaHQgdGhydSBoZXJlICovCisgICAgICAgIAlpZiAoc3RhdHVzICYgKEJUX0gyQl9BVE4gfCBCVF9CX0JVU1kpKSBicmVhazsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfQjJIX1dBSVQ7CisJCS8qIGZhbGwgdGhyb3VnaCB3aXRoIHN0YXR1cyAqLworCisJLyogU3RheSBpbiBCVF9TVEFURV9CMkhfV0FJVCB1bnRpbCBhIHBhY2tldCBtYXRjaGVzLiAgSG93ZXZlciwgc3Bpbm5pbmcKKwkgICBoYXJkIGhlcmUsIGNvbnN0YW50bHkgcmVhZGluZyBzdGF0dXMsIHNlZW1zIHRvIGhvbGQgb2ZmIHRoZQorCSAgIGdlbmVyYXRpb24gb2YgQjJIX0FUTiBzbyBBTFdBWVMgcmV0dXJuIENBTExfV0lUSF9ERUxBWS4gKi8KKworCWNhc2UgQlRfU1RBVEVfQjJIX1dBSVQ6CisgICAgCQlpZiAoIShzdGF0dXMgJiBCVF9CMkhfQVROKSkgYnJlYWs7CisKKwkJLyogQXNzdW1lIG9yZGVyZWQsIHVuY2FjaGVkIHdyaXRlczogbm8gbmVlZCB0byB3YWl0ICovCisJCWlmICghKHN0YXR1cyAmIEJUX0hfQlVTWSkpIEJUX0NPTlRST0woQlRfSF9CVVNZKTsgLyogc2V0ICovCisJCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CQkvKiBjbGVhciBpdCwgQUNLIHRvIHRoZSBCTUMgKi8KKwkJQlRfQ09OVFJPTChCVF9DTFJfUkRfUFRSKTsJLyogcmVzZXQgdGhlIHF1ZXVlICovCisJCWkgPSByZWFkX2FsbF9ieXRlcyhidCk7CisJCUJUX0NPTlRST0woQlRfSF9CVVNZKTsJCS8qIGNsZWFyICovCisJCWlmICghaSkgYnJlYWs7CQkJLyogVHJ5IHRoaXMgc3RhdGUgYWdhaW4gKi8KKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVBRF9FTkQ7CisJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7CS8qIGZvciBsb2dnaW5nICovCisKKyAgICAJY2FzZSBCVF9TVEFURV9SRUFEX0VORDoKKworCQkvKiBJIGNvdWxkIHdhaXQgb24gQlRfSF9CVVNZIHRvIGdvIGNsZWFyIGZvciBhIHRydWx5IGNsZWFuCisJCSAgIGV4aXQuICBIb3dldmVyLCB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiBYQUNUSU9OX1NUQVJUCisJCSAgIGFuZCB0aGUgKHBvc3NpYmxlKSBleHRyYSBsb29wL3N0YXR1cy9wb3NzaWJsZSB3YWl0IGFmZmVjdHMKKwkJICAgcGVyZm9ybWFuY2UuICBTbywgYXMgbG9uZyBhcyBpdCB3b3JrcywganVzdCBpZ25vcmUgSF9CVVNZICovCisKKyNpZmRlZiBNQUtFX1RISVNfVFJVRV9JRl9ORUNFU1NBUlkKKworCQlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKSBicmVhazsKKyNlbmRpZgorCQlidC0+c2VxKys7CisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX0lETEU7CisJCXJldHVybiBTSV9TTV9UUkFOU0FDVElPTl9DT01QTEVURTsKKworCWNhc2UgQlRfU1RBVEVfUkVTRVQxOgorICAgIAkJcmVzZXRfZmxhZ3MoYnQpOworICAgIAkJYnQtPnRpbWVvdXQgPSBCVF9SRVNFVF9ERUxBWTsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTRVQyOworCQlicmVhazsKKworCWNhc2UgQlRfU1RBVEVfUkVTRVQyOgkJLyogU2VuZCBhIHNvZnQgcmVzZXQgKi8KKwkJQlRfQ09OVFJPTChCVF9DTFJfV1JfUFRSKTsKKwkJSE9TVDJCTUMoMyk7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nICovCisJCUhPU1QyQk1DKDB4MTgpOwkJLyogTmV0Rm4vTFVOID09IEFwcGxpY2F0aW9uLCBMVU4gMCAqLworCQlIT1NUMkJNQyg0Mik7CQkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwkJSE9TVDJCTUMoMyk7CQkvKiBDbWQgPT0gU29mdCByZXNldCAqLworCQlCVF9DT05UUk9MKEJUX0gyQl9BVE4pOworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRVNFVDM7CisJCWJyZWFrOworCisJY2FzZSBCVF9TVEFURV9SRVNFVDM6CisJCWlmIChidC0+dGltZW91dCA+IDApIHJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFU1RBUlQ7CS8qIHByaW50ayBpbiBkZWJ1ZyBtb2RlcyAqLworCQlicmVhazsKKworCWNhc2UgQlRfU1RBVEVfUkVTVEFSVDoJCS8qIGRvbid0IHJlc2V0IHJldHJpZXMhICovCisJCWJ0LT53cml0ZV9kYXRhWzJdID0gKytidC0+c2VxOworCQlidC0+cmVhZF9jb3VudCA9IDA7CisJCWJ0LT5ub256ZXJvX3N0YXR1cyA9IDA7CisJCWJ0LT50aW1lb3V0ID0gQlRfTk9STUFMX1RJTUVPVVQ7CisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1hBQ1RJT05fU1RBUlQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoJLyogSE9TRUQgaXMgc3VwcG9zZWQgdG8gYmUgY2F1Z2h0IG11Y2ggZWFybGllciAqLworCQllcnJvcl9yZWNvdmVyeShidCwgImludGVybmFsIGxvZ2ljIGVycm9yIik7CisJCWJyZWFrOworICAJfQorICAJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKK30KKworc3RhdGljIGludCBidF9kZXRlY3Qoc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQoreworCS8qIEl0J3MgaW1wb3NzaWJsZSBmb3IgdGhlIEJUIHN0YXR1cyBhbmQgaW50ZXJydXB0IHJlZ2lzdGVycyB0byBiZQorCSAgIGFsbCAxJ3MsIChhc3N1bWluZyBhIHByb3Blcmx5IGZ1bmN0aW9uaW5nLCBzZWxmLWluaXRpYWxpemVkIEJNQykKKwkgICBidXQgdGhhdCdzIHdoYXQgeW91IGdldCBmcm9tIHJlYWRpbmcgYSBib2d1cyBhZGRyZXNzLCBzbyB3ZQorCSAgIHRlc3QgdGhhdCBmaXJzdC4gIFRoZSBjYWxsaW5nIHJvdXRpbmUgdXNlcyBuZWdhdGl2ZSBsb2dpYy4gKi8KKworCWlmICgoQlRfU1RBVFVTID09IDB4RkYpICYmIChCVF9JTlRNQVNLX1IgPT0gMHhGRikpIHJldHVybiAxOworCXJlc2V0X2ZsYWdzKGJ0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnRfY2xlYW51cChzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQpCit7Cit9CisKK3N0YXRpYyBpbnQgYnRfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IHNpX3NtX2RhdGEpOworfQorCitzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgYnRfc21pX2hhbmRsZXJzID0KK3sKKwkudmVyc2lvbiAgICAgICAgICAgPSBJUE1JX0JUX1ZFUlNJT04sCisJLmluaXRfZGF0YSAgICAgICAgID0gYnRfaW5pdF9kYXRhLAorCS5zdGFydF90cmFuc2FjdGlvbiA9IGJ0X3N0YXJ0X3RyYW5zYWN0aW9uLAorCS5nZXRfcmVzdWx0ICAgICAgICA9IGJ0X2dldF9yZXN1bHQsCisJLmV2ZW50ICAgICAgICAgICAgID0gYnRfZXZlbnQsCisJLmRldGVjdCAgICAgICAgICAgID0gYnRfZGV0ZWN0LAorCS5jbGVhbnVwICAgICAgICAgICA9IGJ0X2NsZWFudXAsCisJLnNpemUgICAgICAgICAgICAgID0gYnRfc2l6ZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDY3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYwpAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIGlwbWlfZGV2aW50Zi5jCisgKgorICogTGludXggZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNkZWZpbmUgSVBNSV9ERVZJTlRGX1ZFUlNJT04gInYzMyIKKworc3RydWN0IGlwbWlfZmlsZV9wcml2YXRlCit7CisJaXBtaV91c2VyX3QgICAgICAgICAgdXNlcjsKKwlzcGlubG9ja190ICAgICAgICAgICByZWN2X21zZ19sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgICAgIHJlY3ZfbXNnczsKKwlzdHJ1Y3QgZmlsZSAgICAgICAgICAqZmlsZTsKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmFzeW5jX3F1ZXVlOworCXdhaXRfcXVldWVfaGVhZF90ICAgIHdhaXQ7CisJc3RydWN0IHNlbWFwaG9yZSAgICAgcmVjdl9zZW07CisJaW50ICAgICAgICAgICAgICAgICAgZGVmYXVsdF9yZXRyaWVzOworCXVuc2lnbmVkIGludCAgICAgICAgIGRlZmF1bHRfcmV0cnlfdGltZV9tczsKK307CisKK3N0YXRpYyB2b2lkIGZpbGVfcmVjZWl2ZV9oYW5kbGVyKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2csCisJCQkJIHZvaWQgICAgICAgICAgICAgICAgICpoYW5kbGVyX2RhdGEpCit7CisJc3RydWN0IGlwbWlfZmlsZV9wcml2YXRlICpwcml2ID0gaGFuZGxlcl9kYXRhOworCWludCAgICAgICAgICAgICAgICAgICAgICB3YXNfZW1wdHk7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihwcml2LT5yZWN2X21zZ19sb2NrKSwgZmxhZ3MpOworCisJd2FzX2VtcHR5ID0gbGlzdF9lbXB0eSgmKHByaXYtPnJlY3ZfbXNncykpOworCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKHByaXYtPnJlY3ZfbXNncykpOworCisJaWYgKHdhc19lbXB0eSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXQpOworCQlraWxsX2Zhc3luYygmcHJpdi0+ZmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHByaXYtPnJlY3ZfbXNnX2xvY2spLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBtaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBpcG1pX2ZpbGVfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgbWFzayA9IDA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGZsYWdzOworCisJcG9sbF93YWl0KGZpbGUsICZwcml2LT53YWl0LCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWN2X21zZ19sb2NrLCBmbGFncyk7CisKKwlpZiAoISBsaXN0X2VtcHR5KCYocHJpdi0+cmVjdl9tc2dzKSkpCisJCW1hc2sgfD0gKFBPTExJTiB8IFBPTExSRE5PUk0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVjdl9tc2dfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCXN0cnVjdCBpcG1pX2ZpbGVfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OworCisJcmVzdWx0ID0gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZwcml2LT5mYXN5bmNfcXVldWUpOworCisJcmV0dXJuIChyZXN1bHQpOworfQorCitzdGF0aWMgc3RydWN0IGlwbWlfdXNlcl9obmRsIGlwbWlfaG5kbHJzID0KK3sKKwkuaXBtaV9yZWN2X2huZGwJPSBmaWxlX3JlY2VpdmVfaGFuZGxlciwKK307CisKK3N0YXRpYyBpbnQgaXBtaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCAgICAgICAgICAgICAgICAgICAgICBpZl9udW0gPSBpbWlub3IoaW5vZGUpOworCWludCAgICAgICAgICAgICAgICAgICAgICBydjsKKwlzdHJ1Y3QgaXBtaV9maWxlX3ByaXZhdGUgKnByaXY7CisKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5maWxlID0gZmlsZTsKKworCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpZl9udW0sCisJCQkgICAgICAmaXBtaV9obmRscnMsCisJCQkgICAgICBwcml2LAorCQkJICAgICAgJihwcml2LT51c2VyKSk7CisJaWYgKHJ2KSB7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gcnY7CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcHJpdjsKKworCXNwaW5fbG9ja19pbml0KCYocHJpdi0+cmVjdl9tc2dfbG9jaykpOworCUlOSVRfTElTVF9IRUFEKCYocHJpdi0+cmVjdl9tc2dzKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+d2FpdCk7CisJcHJpdi0+ZmFzeW5jX3F1ZXVlID0gTlVMTDsKKwlzZW1hX2luaXQoJihwcml2LT5yZWN2X3NlbSksIDEpOworCisJLyogVXNlIHRoZSBsb3ctbGV2ZWwgZGVmYXVsdHMuICovCisJcHJpdi0+ZGVmYXVsdF9yZXRyaWVzID0gLTE7CisJcHJpdi0+ZGVmYXVsdF9yZXRyeV90aW1lX21zID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwbWlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaXBtaV9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIHJ2OworCisJcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcihwcml2LT51c2VyKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCWlwbWlfZmFzeW5jICgtMSwgZmlsZSwgMCk7CisKKwkvKiBGSVhNRSAtIGZyZWUgdGhlIG1lc3NhZ2VzIGluIHRoZSBsaXN0LiAqLworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3NlbmRfcmVxKGlwbWlfdXNlcl90ICAgICB1c2VyLAorCQkJICAgc3RydWN0IGlwbWlfcmVxICpyZXEsCisJCQkgICBpbnQgICAgICAgICAgICAgcmV0cmllcywKKwkJCSAgIHVuc2lnbmVkIGludCAgICByZXRyeV90aW1lX21zKQoreworCWludCAgICAgICAgICAgICAgcnY7CisJc3RydWN0IGlwbWlfYWRkciBhZGRyOworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgbXNnOworCisJaWYgKHJlcS0+YWRkcl9sZW4gPiBzaXplb2Yoc3RydWN0IGlwbWlfYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhZGRyLCByZXEtPmFkZHIsIHJlcS0+YWRkcl9sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1zZy5uZXRmbiA9IHJlcS0+bXNnLm5ldGZuOworCW1zZy5jbWQgPSByZXEtPm1zZy5jbWQ7CisJbXNnLmRhdGFfbGVuID0gcmVxLT5tc2cuZGF0YV9sZW47CisJbXNnLmRhdGEgPSBrbWFsbG9jKElQTUlfTUFYX01TR19MRU5HVEgsIEdGUF9LRVJORUwpOworCWlmICghbXNnLmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRnJvbSBoZXJlIG91dCB3ZSBjYW5ub3QgcmV0dXJuLCB3ZSBtdXN0IGp1bXAgdG8gIm91dCIgZm9yCisJICAgZXJyb3IgZXhpdHMgdG8gZnJlZSBtc2dkYXRhLiAqLworCisJcnYgPSBpcG1pX3ZhbGlkYXRlX2FkZHIoJmFkZHIsIHJlcS0+YWRkcl9sZW4pOworCWlmIChydikKKwkJZ290byBvdXQ7CisKKwlpZiAocmVxLT5tc2cuZGF0YSAhPSBOVUxMKSB7CisJCWlmIChyZXEtPm1zZy5kYXRhX2xlbiA+IElQTUlfTUFYX01TR19MRU5HVEgpIHsKKwkJCXJ2ID0gLUVNU0dTSVpFOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLmRhdGEsCisJCQkJICAgcmVxLT5tc2cuZGF0YSwKKwkJCQkgICByZXEtPm1zZy5kYXRhX2xlbikpCisJCXsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJbXNnLmRhdGFfbGVuID0gMDsKKwl9CisKKwlydiA9IGlwbWlfcmVxdWVzdF9zZXR0aW1lKHVzZXIsCisJCQkJICAmYWRkciwKKwkJCQkgIHJlcS0+bXNnaWQsCisJCQkJICAmbXNnLAorCQkJCSAgTlVMTCwKKwkJCQkgIDAsCisJCQkJICByZXRyaWVzLAorCQkJCSAgcmV0cnlfdGltZV9tcyk7Cisgb3V0OgorCWtmcmVlKG1zZy5kYXRhKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9pb2N0bChzdHJ1Y3QgaW5vZGUgICppbm9kZSwKKwkJICAgICAgc3RydWN0IGZpbGUgICAqZmlsZSwKKwkJICAgICAgdW5zaWduZWQgaW50ICBjbWQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgcnYgPSAtRUlOVkFMOworCXN0cnVjdCBpcG1pX2ZpbGVfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopZGF0YTsKKworCXN3aXRjaCAoY21kKSAKKwl7CisJY2FzZSBJUE1JQ1RMX1NFTkRfQ09NTUFORDoKKwl7CisJCXN0cnVjdCBpcG1pX3JlcSByZXE7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZywgc2l6ZW9mKHJlcSkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJ2ID0gaGFuZGxlX3NlbmRfcmVxKHByaXYtPnVzZXIsCisJCQkJICAgICAmcmVxLAorCQkJCSAgICAgcHJpdi0+ZGVmYXVsdF9yZXRyaWVzLAorCQkJCSAgICAgcHJpdi0+ZGVmYXVsdF9yZXRyeV90aW1lX21zKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX1NFTkRfQ09NTUFORF9TRVRUSU1FOgorCXsKKwkJc3RydWN0IGlwbWlfcmVxX3NldHRpbWUgcmVxOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlydiA9IGhhbmRsZV9zZW5kX3JlcShwcml2LT51c2VyLAorCQkJCSAgICAgJnJlcS5yZXEsCisJCQkJICAgICByZXEucmV0cmllcywKKwkJCQkgICAgIHJlcS5yZXRyeV90aW1lX21zKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX1JFQ0VJVkVfTVNHOgorCWNhc2UgSVBNSUNUTF9SRUNFSVZFX01TR19UUlVOQzoKKwl7CisJCXN0cnVjdCBpcG1pX3JlY3YgICAgICByc3A7CisJCWludCAgICAgICAgICAgICAgYWRkcl9sZW47CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCQlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgKm1zZzsKKwkJdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKwkJCisKKwkJcnYgPSAwOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJzcCwgYXJnLCBzaXplb2YocnNwKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2UgY2xhaW0gYSBzZW1hcGhvcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHR3bworICAgICAgICAgICAgICAgICAgIHVzZXJzIGdldHRpbmcgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlIGF0IGEgdGltZS4KKyAgICAgICAgICAgICAgICAgICBTaW5jZSB3ZSBoYXZlIHRvIHJlbGVhc2UgdGhlIHNwaW5sb2NrIGJlZm9yZSB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICBjb3B5IHRoZSBkYXRhIHRvIHRoZSB1c2VyLCBpdCdzIHBvc3NpYmxlIGFub3RoZXIKKyAgICAgICAgICAgICAgICAgICB1c2VyIHdpbGwgZ3JhYiBzb21ldGhpbmcgZnJvbSB0aGUgcXVldWUsIHRvby4gIFRoZW4KKyAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZXMgbWlnaHQgZ2V0IG91dCBvZiBvcmRlciBpZiBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICBmYWlscyBhbmQgdGhlIG1lc3NhZ2UgZ2V0cyBwdXQgYmFjayBvbnRvIHRoZQorICAgICAgICAgICAgICAgICAgIHF1ZXVlLiAgVGhpcyBzZW1hcGhvcmUgcHJldmVudHMgdGhhdCBwcm9ibGVtLiAqLworCQlkb3duKCYocHJpdi0+cmVjdl9zZW0pKTsKKworCQkvKiBHcmFiIHRoZSBtZXNzYWdlIG9mZiB0aGUgbGlzdC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihwcml2LT5yZWN2X21zZ19sb2NrKSwgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmKHByaXYtPnJlY3ZfbXNncykpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocHJpdi0+cmVjdl9tc2dfbG9jayksIGZsYWdzKTsKKwkJCXJ2ID0gLUVBR0FJTjsKKwkJCWdvdG8gcmVjdl9lcnI7CisJCX0KKwkJZW50cnkgPSBwcml2LT5yZWN2X21zZ3MubmV4dDsKKwkJbXNnID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGlwbWlfcmVjdl9tc2csIGxpbmspOworCQlsaXN0X2RlbChlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwcml2LT5yZWN2X21zZ19sb2NrKSwgZmxhZ3MpOworCisJCWFkZHJfbGVuID0gaXBtaV9hZGRyX2xlbmd0aChtc2ctPmFkZHIuYWRkcl90eXBlKTsKKwkJaWYgKHJzcC5hZGRyX2xlbiA8IGFkZHJfbGVuKQorCQl7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIHJlY3ZfcHV0YmFja19vbl9lcnI7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKHJzcC5hZGRyLCAmKG1zZy0+YWRkciksIGFkZHJfbGVuKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byByZWN2X3B1dGJhY2tfb25fZXJyOworCQl9CisJCXJzcC5hZGRyX2xlbiA9IGFkZHJfbGVuOworCisJCXJzcC5yZWN2X3R5cGUgPSBtc2ctPnJlY3ZfdHlwZTsKKwkJcnNwLm1zZ2lkID0gbXNnLT5tc2dpZDsKKwkJcnNwLm1zZy5uZXRmbiA9IG1zZy0+bXNnLm5ldGZuOworCQlyc3AubXNnLmNtZCA9IG1zZy0+bXNnLmNtZDsKKworCQlpZiAobXNnLT5tc2cuZGF0YV9sZW4gPiAwKSB7CisJCQlpZiAocnNwLm1zZy5kYXRhX2xlbiA8IG1zZy0+bXNnLmRhdGFfbGVuKSB7CisJCQkJcnYgPSAtRU1TR1NJWkU7CisJCQkJaWYgKGNtZCA9PSBJUE1JQ1RMX1JFQ0VJVkVfTVNHX1RSVU5DKSB7CisJCQkJCW1zZy0+bXNnLmRhdGFfbGVuID0gcnNwLm1zZy5kYXRhX2xlbjsKKwkJCQl9IGVsc2UgeworCQkJCQlnb3RvIHJlY3ZfcHV0YmFja19vbl9lcnI7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29weV90b191c2VyKHJzcC5tc2cuZGF0YSwKKwkJCQkJIG1zZy0+bXNnLmRhdGEsCisJCQkJCSBtc2ctPm1zZy5kYXRhX2xlbikpCisJCQl7CisJCQkJcnYgPSAtRUZBVUxUOworCQkJCWdvdG8gcmVjdl9wdXRiYWNrX29uX2VycjsKKwkJCX0KKwkJCXJzcC5tc2cuZGF0YV9sZW4gPSBtc2ctPm1zZy5kYXRhX2xlbjsKKwkJfSBlbHNlIHsKKwkJCXJzcC5tc2cuZGF0YV9sZW4gPSAwOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyc3AsIHNpemVvZihyc3ApKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byByZWN2X3B1dGJhY2tfb25fZXJyOworCQl9CisKKwkJdXAoJihwcml2LT5yZWN2X3NlbSkpOworCQlpcG1pX2ZyZWVfcmVjdl9tc2cobXNnKTsKKwkJYnJlYWs7CisKKwlyZWN2X3B1dGJhY2tfb25fZXJyOgorCQkvKiBJZiB3ZSBnb3QgYW4gZXJyb3IsIHB1dCB0aGUgbWVzc2FnZSBiYWNrIG9udG8KKwkJICAgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmKHByaXYtPnJlY3ZfbXNnX2xvY2spLCBmbGFncyk7CisJCWxpc3RfYWRkKGVudHJ5LCAmKHByaXYtPnJlY3ZfbXNncykpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocHJpdi0+cmVjdl9tc2dfbG9jayksIGZsYWdzKTsKKwkJdXAoJihwcml2LT5yZWN2X3NlbSkpOworCQlicmVhazsKKworCXJlY3ZfZXJyOgorCQl1cCgmKHByaXYtPnJlY3Zfc2VtKSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9SRUdJU1RFUl9GT1JfQ01EOgorCXsKKwkJc3RydWN0IGlwbWlfY21kc3BlYyB2YWw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZywgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJ2ID0gaXBtaV9yZWdpc3Rlcl9mb3JfY21kKHByaXYtPnVzZXIsIHZhbC5uZXRmbiwgdmFsLmNtZCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9VTlJFR0lTVEVSX0ZPUl9DTUQ6CisJeworCQlzdHJ1Y3QgaXBtaV9jbWRzcGVjICAgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlydiA9IGlwbWlfdW5yZWdpc3Rlcl9mb3JfY21kKHByaXYtPnVzZXIsIHZhbC5uZXRmbiwgdmFsLmNtZCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9TRVRfR0VUU19FVkVOVFNfQ01EOgorCXsKKwkJaW50IHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSBpcG1pX3NldF9nZXRzX2V2ZW50cyhwcml2LT51c2VyLCB2YWwpOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfU0VUX01ZX0FERFJFU1NfQ01EOgorCXsKKwkJdW5zaWduZWQgaW50IHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaXBtaV9zZXRfbXlfYWRkcmVzcyhwcml2LT51c2VyLCB2YWwpOworCQlydiA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9HRVRfTVlfQUREUkVTU19DTUQ6CisJeworCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCXZhbCA9IGlwbWlfZ2V0X215X2FkZHJlc3MocHJpdi0+dXNlcik7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcnYgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfU0VUX01ZX0xVTl9DTUQ6CisJeworCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpcG1pX3NldF9teV9MVU4ocHJpdi0+dXNlciwgdmFsKTsKKwkJcnYgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfR0VUX01ZX0xVTl9DTUQ6CisJeworCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCXZhbCA9IGlwbWlfZ2V0X215X0xVTihwcml2LT51c2VyKTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlydiA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIElQTUlDVExfU0VUX1RJTUlOR19QQVJNU19DTUQ6CisJeworCQlzdHJ1Y3QgaXBtaV90aW1pbmdfcGFybXMgcGFybXM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJtcywgYXJnLCBzaXplb2YocGFybXMpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlwcml2LT5kZWZhdWx0X3JldHJpZXMgPSBwYXJtcy5yZXRyaWVzOworCQlwcml2LT5kZWZhdWx0X3JldHJ5X3RpbWVfbXMgPSBwYXJtcy5yZXRyeV90aW1lX21zOworCQlydiA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9HRVRfVElNSU5HX1BBUk1TX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcyBwYXJtczsKKworCQlwYXJtcy5yZXRyaWVzID0gcHJpdi0+ZGVmYXVsdF9yZXRyaWVzOworCQlwYXJtcy5yZXRyeV90aW1lX21zID0gcHJpdi0+ZGVmYXVsdF9yZXRyeV90aW1lX21zOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcGFybXMsIHNpemVvZihwYXJtcykpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJfQorCX0KKyAgCisJcmV0dXJuIHJ2OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwbWlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IGlwbWlfaW9jdGwsCisJLm9wZW4JCT0gaXBtaV9vcGVuLAorCS5yZWxlYXNlCT0gaXBtaV9yZWxlYXNlLAorCS5mYXN5bmMJCT0gaXBtaV9mYXN5bmMsCisJLnBvbGwJCT0gaXBtaV9wb2xsLAorfTsKKworI2RlZmluZSBERVZJQ0VfTkFNRSAgICAgImlwbWlkZXYiCisKK3N0YXRpYyBpbnQgaXBtaV9tYWpvciA9IDA7Cittb2R1bGVfcGFyYW0oaXBtaV9tYWpvciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXBtaV9tYWpvciwgIlNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgSVBNSSBkZXZpY2UuICBCeSIKKwkJICIgZGVmYXVsdCwgb3IgaWYgeW91IHNldCBpdCB0byB6ZXJvLCBpdCB3aWxsIGNob29zZSB0aGUgbmV4dCIKKwkJICIgYXZhaWxhYmxlIGRldmljZS4gIFNldHRpbmcgaXQgdG8gLTEgd2lsbCBkaXNhYmxlIHRoZSIKKwkJICIgaW50ZXJmYWNlLiAgT3RoZXIgdmFsdWVzIHdpbGwgc2V0IHRoZSBtYWpvciBkZXZpY2UgbnVtYmVyIgorCQkgIiB0byB0aGF0IHZhbHVlLiIpOworCitzdGF0aWMgdm9pZCBpcG1pX25ld19zbWkoaW50IGlmX251bSkKK3sKKwlkZXZmc19ta19jZGV2KE1LREVWKGlwbWlfbWFqb3IsIGlmX251bSksCisJCSAgICAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJICAgICAgImlwbWlkZXYvJWQiLCBpZl9udW0pOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3NtaV9nb25lKGludCBpZl9udW0pCit7CisJZGV2ZnNfcmVtb3ZlKCJpcG1pZGV2LyVkIiwgaWZfbnVtKTsKK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyIHNtaV93YXRjaGVyID0KK3sKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkubmV3X3NtaSAgPSBpcG1pX25ld19zbWksCisJLnNtaV9nb25lID0gaXBtaV9zbWlfZ29uZSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGluaXRfaXBtaV9kZXZpbnRmKHZvaWQpCit7CisJaW50IHJ2OworCisJaWYgKGlwbWlfbWFqb3IgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaW50ayhLRVJOX0lORk8gImlwbWkgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uICIKKwkgICAgICAgSVBNSV9ERVZJTlRGX1ZFUlNJT04gIlxuIik7CisKKwlydiA9IHJlZ2lzdGVyX2NocmRldihpcG1pX21ham9yLCBERVZJQ0VfTkFNRSwgJmlwbWlfZm9wcyk7CisJaWYgKHJ2IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlwbWk6IGNhbid0IGdldCBtYWpvciAlZFxuIiwgaXBtaV9tYWpvcik7CisJCXJldHVybiBydjsKKwl9CisKKwlpZiAoaXBtaV9tYWpvciA9PSAwKSB7CisJCWlwbWlfbWFqb3IgPSBydjsKKwl9CisKKwlkZXZmc19ta19kaXIoREVWSUNFX05BTUUpOworCisJcnYgPSBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisJaWYgKHJ2KSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2KGlwbWlfbWFqb3IsIERFVklDRV9OQU1FKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXBtaTogY2FuJ3QgcmVnaXN0ZXIgc21pIHdhdGNoZXJcbiIpOworCQlyZXR1cm4gcnY7CisJfQorCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpbml0X2lwbWlfZGV2aW50Zik7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBjbGVhbnVwX2lwbWkodm9pZCkKK3sKKwlpcG1pX3NtaV93YXRjaGVyX3VucmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKKwlkZXZmc19yZW1vdmUoREVWSUNFX05BTUUpOworCXVucmVnaXN0ZXJfY2hyZGV2KGlwbWlfbWFqb3IsIERFVklDRV9OQU1FKTsKK30KK21vZHVsZV9leGl0KGNsZWFudXBfaXBtaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfa2NzX3NtLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2tjc19zbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Y2NlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2tjc19zbS5jCkBAIC0wLDAgKzEsNTAwIEBACisvKgorICogaXBtaV9rY3Nfc20uYworICoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIGhhbmRsaW5nIElQTUkgS0NTIGludGVyZmFjZXMuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogVGhpcyBzdGF0ZSBtYWNoaW5lIGlzIHRha2VuIGZyb20gdGhlIHN0YXRlIG1hY2hpbmUgaW4gdGhlIElQTUkgc3BlYywKKyAqIHByZXR0eSBtdWNoIHZlcmJhdGltLiAgSWYgeW91IGhhdmUgcXVlc3Rpb25zIGFib3V0IHRoZSBzdGF0ZXMsIHNlZQorICogdGhhdCBkb2N1bWVudC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIEZvciBwcmludGsuICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLworI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKKworI2RlZmluZSBJUE1JX0tDU19WRVJTSU9OICJ2MzMiCisKKy8qIFNldCB0aGlzIGlmIHlvdSB3YW50IGEgcHJpbnRvdXQgb2Ygd2h5IHRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBob3NlZAorICAgd2hlbiBpdCBnZXRzIGhvc2VkLiAqLworI2RlZmluZSBERUJVR19IT1NFRF9SRUFTT04KKworLyogUHJpbnQgdGhlIHN0YXRlIG1hY2hpbmUgc3RhdGUgb24gZW50cnkgZXZlcnkgdGltZS4gKi8KKyN1bmRlZiBERUJVR19TVEFURQorCisvKiBUaGUgc3RhdGVzIHRoZSBLQ1MgZHJpdmVyIG1heSBiZSBpbi4gKi8KK2VudW0ga2NzX3N0YXRlcyB7CisJS0NTX0lETEUsCQkvKiBUaGUgS0NTIGludGVyZmFjZSBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9pbmcgbm90aGluZy4gKi8KKwlLQ1NfU1RBUlRfT1AsCQkvKiBXZSBhcmUgc3RhcnRpbmcgYW4gb3BlcmF0aW9uLiAgVGhlCisJCQkJICAgZGF0YSBpcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgYnV0CisJCQkJICAgbm90aGluZyBoYXMgYmVlbiBkb25lIHRvIHRoZQorCQkJCSAgIGludGVyZmFjZSB5ZXQuICBUaGlzIHdhcyBhZGRlZCB0bworCQkJCSAgIHRoZSBzdGF0ZSBtYWNoaW5lIGluIHRoZSBzcGVjIHRvCisJCQkJICAgd2FpdCBmb3IgdGhlIGluaXRpYWwgSUJGLiAqLworCUtDU19XQUlUX1dSSVRFX1NUQVJULAkvKiBXZSBoYXZlIHdyaXR0ZW4gYSB3cml0ZSBjbWQgdG8gdGhlCisJCQkJICAgaW50ZXJmYWNlLiAqLworCUtDU19XQUlUX1dSSVRFLAkJLyogV2UgYXJlIHdyaXRpbmcgYnl0ZXMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS4gKi8KKwlLQ1NfV0FJVF9XUklURV9FTkQsCS8qIFdlIGhhdmUgd3JpdHRlbiB0aGUgd3JpdGUgZW5kIGNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgaW50ZXJmYWNlLCBhbmQgc3RpbGwgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSB0aGUgbGFzdCBieXRlLiAqLworCUtDU19XQUlUX1JFQUQsCQkvKiBXZSBhcmUgd2FpdGluZyB0byByZWFkIGRhdGEgZnJvbQorCQkJCSAgIHRoZSBpbnRlcmZhY2UuICovCisJS0NTX0VSUk9SMCwJCS8qIFN0YXRlIHRvIHRyYW5zaXRpb24gdG8gdGhlIGVycm9yCisJCQkJICAgaGFuZGxlciwgdGhpcyB3YXMgYWRkZWQgdG8gdGhlCisJCQkJICAgc3RhdGUgbWFjaGluZSBpbiB0aGUgc3BlYyB0byBiZQorCQkJCSAgIHN1cmUgSUJGIHdhcyB0aGVyZS4gKi8KKwlLQ1NfRVJST1IxLAkJLyogRmlyc3Qgc3RhZ2UgZXJyb3IgaGFuZGxlciwgd2FpdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSB0byByZXNwb25kLiAqLworCUtDU19FUlJPUjIsCQkvKiBUaGUgYWJvcnQgY21kIGhhcyBiZWVuIHdyaXR0ZW4sCisJCQkJICAgd2FpdCBmb3IgdGhlIGludGVyZmFjZSB0bworCQkJCSAgIHJlc3BvbmQuICovCisJS0NTX0VSUk9SMywJCS8qIFdlIHdyb3RlIHNvbWUgZGF0YSB0byB0aGUKKwkJCQkgICBpbnRlcmZhY2UsIHdhaXQgZm9yIGl0IHRvIHN3aXRjaCB0bworCQkJCSAgIHJlYWQgbW9kZS4gKi8KKwlLQ1NfSE9TRUQJCS8qIFRoZSBoYXJkd2FyZSBmYWlsZWQgdG8gZm9sbG93IHRoZQorCQkJCSAgIHN0YXRlIG1hY2hpbmUuICovCit9OworCisjZGVmaW5lIE1BWF9LQ1NfUkVBRF9TSVpFIDgwCisjZGVmaW5lIE1BWF9LQ1NfV1JJVEVfU0laRSA4MAorCisvKiBUaW1lb3V0cyBpbiBtaWNyb3NlY29uZHMuICovCisjZGVmaW5lIElCRl9SRVRSWV9USU1FT1VUIDEwMDAwMDAKKyNkZWZpbmUgT0JGX1JFVFJZX1RJTUVPVVQgMTAwMDAwMAorI2RlZmluZSBNQVhfRVJST1JfUkVUUklFUyAxMAorCitzdHJ1Y3Qgc2lfc21fZGF0YQoreworCWVudW0ga2NzX3N0YXRlcyAgc3RhdGU7CisJc3RydWN0IHNpX3NtX2lvICppbzsKKwl1bnNpZ25lZCBjaGFyICAgIHdyaXRlX2RhdGFbTUFYX0tDU19XUklURV9TSVpFXTsKKwlpbnQgICAgICAgICAgICAgIHdyaXRlX3BvczsKKwlpbnQgICAgICAgICAgICAgIHdyaXRlX2NvdW50OworCWludCAgICAgICAgICAgICAgb3JpZ193cml0ZV9jb3VudDsKKwl1bnNpZ25lZCBjaGFyICAgIHJlYWRfZGF0YVtNQVhfS0NTX1JFQURfU0laRV07CisJaW50ICAgICAgICAgICAgICByZWFkX3BvczsKKwlpbnQJICAgICAgICAgdHJ1bmNhdGVkOworCisJdW5zaWduZWQgaW50ICBlcnJvcl9yZXRyaWVzOworCWxvbmcgICAgICAgICAgaWJmX3RpbWVvdXQ7CisJbG9uZyAgICAgICAgICBvYmZfdGltZW91dDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9rY3NfZGF0YShzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLAorCQkJCSAgc3RydWN0IHNpX3NtX2lvICppbykKK3sKKwlrY3MtPnN0YXRlID0gS0NTX0lETEU7CisJa2NzLT5pbyA9IGlvOworCWtjcy0+d3JpdGVfcG9zID0gMDsKKwlrY3MtPndyaXRlX2NvdW50ID0gMDsKKwlrY3MtPm9yaWdfd3JpdGVfY291bnQgPSAwOworCWtjcy0+cmVhZF9wb3MgPSAwOworCWtjcy0+ZXJyb3JfcmV0cmllcyA9IDA7CisJa2NzLT50cnVuY2F0ZWQgPSAwOworCWtjcy0+aWJmX3RpbWVvdXQgPSBJQkZfUkVUUllfVElNRU9VVDsKKwlrY3MtPm9iZl90aW1lb3V0ID0gT0JGX1JFVFJZX1RJTUVPVVQ7CisKKwkvKiBSZXNlcnZlIDIgSS9PIGJ5dGVzLiAqLworCXJldHVybiAyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9zdGF0dXMoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKKwlyZXR1cm4ga2NzLT5pby0+aW5wdXRiKGtjcy0+aW8sIDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9kYXRhKHN0cnVjdCBzaV9zbV9kYXRhICprY3MpCit7CisJcmV0dXJuIGtjcy0+aW8tPmlucHV0YihrY3MtPmlvLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2NtZChzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJa2NzLT5pby0+b3V0cHV0YihrY3MtPmlvLCAxLCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2RhdGEoc3RydWN0IHNpX3NtX2RhdGEgKmtjcywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCWtjcy0+aW8tPm91dHB1dGIoa2NzLT5pbywgMCwgZGF0YSk7Cit9CisKKy8qIENvbnRyb2wgY29kZXMuICovCisjZGVmaW5lIEtDU19HRVRfU1RBVFVTX0FCT1JUCTB4NjAKKyNkZWZpbmUgS0NTX1dSSVRFX1NUQVJUCQkweDYxCisjZGVmaW5lIEtDU19XUklURV9FTkQJCTB4NjIKKyNkZWZpbmUgS0NTX1JFQURfQllURQkJMHg2OAorCisvKiBTdGF0dXMgYml0cy4gKi8KKyNkZWZpbmUgR0VUX1NUQVRVU19TVEFURShzdGF0dXMpICgoKHN0YXR1cykgPj4gNikgJiAweDAzKQorI2RlZmluZSBLQ1NfSURMRV9TVEFURQkwCisjZGVmaW5lIEtDU19SRUFEX1NUQVRFCTEKKyNkZWZpbmUgS0NTX1dSSVRFX1NUQVRFCTIKKyNkZWZpbmUgS0NTX0VSUk9SX1NUQVRFCTMKKyNkZWZpbmUgR0VUX1NUQVRVU19BVE4oc3RhdHVzKSAoKHN0YXR1cykgJiAweDA0KQorI2RlZmluZSBHRVRfU1RBVFVTX0lCRihzdGF0dXMpICgoc3RhdHVzKSAmIDB4MDIpCisjZGVmaW5lIEdFVF9TVEFUVVNfT0JGKHN0YXR1cykgKChzdGF0dXMpICYgMHgwMSkKKworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbmV4dF9ieXRlKHN0cnVjdCBzaV9zbV9kYXRhICprY3MpCit7CisJd3JpdGVfZGF0YShrY3MsIGtjcy0+d3JpdGVfZGF0YVtrY3MtPndyaXRlX3Bvc10pOworCShrY3MtPndyaXRlX3BvcykrKzsKKwkoa2NzLT53cml0ZV9jb3VudCktLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2Vycm9yX3JlY292ZXJ5KHN0cnVjdCBzaV9zbV9kYXRhICprY3MsIGNoYXIgKnJlYXNvbikKK3sKKwkoa2NzLT5lcnJvcl9yZXRyaWVzKSsrOworCWlmIChrY3MtPmVycm9yX3JldHJpZXMgPiBNQVhfRVJST1JfUkVUUklFUykgeworI2lmZGVmIERFQlVHX0hPU0VEX1JFQVNPTgorCQlwcmludGsoImlwbWlfa2NzX3NtOiBrY3MgaG9zZWQ6ICVzXG4iLCByZWFzb24pOworI2VuZGlmCisJCWtjcy0+c3RhdGUgPSBLQ1NfSE9TRUQ7CisJfSBlbHNlIHsKKwkJa2NzLT5zdGF0ZSA9IEtDU19FUlJPUjA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9uZXh0X2J5dGUoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKKwlpZiAoa2NzLT5yZWFkX3BvcyA+PSBNQVhfS0NTX1JFQURfU0laRSkgeworCQkvKiBUaHJvdyB0aGUgZGF0YSBhd2F5IGFuZCBtYXJrIGl0IHRydW5jYXRlZC4gKi8KKwkJcmVhZF9kYXRhKGtjcyk7CisJCWtjcy0+dHJ1bmNhdGVkID0gMTsKKwl9IGVsc2UgeworCQlrY3MtPnJlYWRfZGF0YVtrY3MtPnJlYWRfcG9zXSA9IHJlYWRfZGF0YShrY3MpOworCQkoa2NzLT5yZWFkX3BvcykrKzsKKwl9CisJd3JpdGVfZGF0YShrY3MsIEtDU19SRUFEX0JZVEUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19pYmYoc3RydWN0IHNpX3NtX2RhdGEgKmtjcywgdW5zaWduZWQgY2hhciBzdGF0dXMsCisJCQkgICAgbG9uZyB0aW1lKQoreworCWlmIChHRVRfU1RBVFVTX0lCRihzdGF0dXMpKSB7CisJCWtjcy0+aWJmX3RpbWVvdXQgLT0gdGltZTsKKwkJaWYgKGtjcy0+aWJmX3RpbWVvdXQgPCAwKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShrY3MsICJJQkYgbm90IHJlYWR5IGluIHRpbWUiKTsKKwkJCWtjcy0+aWJmX3RpbWVvdXQgPSBJQkZfUkVUUllfVElNRU9VVDsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKwlrY3MtPmliZl90aW1lb3V0ID0gSUJGX1JFVFJZX1RJTUVPVVQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX29iZihzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCB1bnNpZ25lZCBjaGFyIHN0YXR1cywKKwkJCSAgICBsb25nIHRpbWUpCit7CisJaWYgKCEgR0VUX1NUQVRVU19PQkYoc3RhdHVzKSkgeworCQlrY3MtPm9iZl90aW1lb3V0IC09IHRpbWU7CisJCWlmIChrY3MtPm9iZl90aW1lb3V0IDwgMCkgeworCQkgICAgc3RhcnRfZXJyb3JfcmVjb3Zlcnkoa2NzLCAiT0JGIG5vdCByZWFkeSBpbiB0aW1lIik7CisJCSAgICByZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJa2NzLT5vYmZfdGltZW91dCA9IE9CRl9SRVRSWV9USU1FT1VUOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9vYmYoc3RydWN0IHNpX3NtX2RhdGEgKmtjcywgdW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJaWYgKEdFVF9TVEFUVVNfT0JGKHN0YXR1cykpCisJCXJlYWRfZGF0YShrY3MpOworfQorCitzdGF0aWMgdm9pZCByZXN0YXJ0X2tjc190cmFuc2FjdGlvbihzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzKQoreworCWtjcy0+d3JpdGVfY291bnQgPSBrY3MtPm9yaWdfd3JpdGVfY291bnQ7CisJa2NzLT53cml0ZV9wb3MgPSAwOworCWtjcy0+cmVhZF9wb3MgPSAwOworCWtjcy0+c3RhdGUgPSBLQ1NfV0FJVF9XUklURV9TVEFSVDsKKwlrY3MtPmliZl90aW1lb3V0ID0gSUJGX1JFVFJZX1RJTUVPVVQ7CisJa2NzLT5vYmZfdGltZW91dCA9IE9CRl9SRVRSWV9USU1FT1VUOworCXdyaXRlX2NtZChrY3MsIEtDU19XUklURV9TVEFSVCk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfa2NzX3RyYW5zYWN0aW9uKHN0cnVjdCBzaV9zbV9kYXRhICprY3MsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJIHVuc2lnbmVkIGludCBzaXplKQoreworCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gTUFYX0tDU19XUklURV9TSVpFKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChrY3MtPnN0YXRlICE9IEtDU19JRExFKSAmJiAoa2NzLT5zdGF0ZSAhPSBLQ1NfSE9TRUQpKSB7CisJCXJldHVybiAtMjsKKwl9CisKKwlrY3MtPmVycm9yX3JldHJpZXMgPSAwOworCW1lbWNweShrY3MtPndyaXRlX2RhdGEsIGRhdGEsIHNpemUpOworCWtjcy0+d3JpdGVfY291bnQgPSBzaXplOworCWtjcy0+b3JpZ193cml0ZV9jb3VudCA9IHNpemU7CisJa2NzLT53cml0ZV9wb3MgPSAwOworCWtjcy0+cmVhZF9wb3MgPSAwOworCWtjcy0+c3RhdGUgPSBLQ1NfU1RBUlRfT1A7CisJa2NzLT5pYmZfdGltZW91dCA9IElCRl9SRVRSWV9USU1FT1VUOworCWtjcy0+b2JmX3RpbWVvdXQgPSBPQkZfUkVUUllfVElNRU9VVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfa2NzX3Jlc3VsdChzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWlmIChsZW5ndGggPCBrY3MtPnJlYWRfcG9zKSB7CisJCWtjcy0+cmVhZF9wb3MgPSBsZW5ndGg7CisJCWtjcy0+dHJ1bmNhdGVkID0gMTsKKwl9CisKKwltZW1jcHkoZGF0YSwga2NzLT5yZWFkX2RhdGEsIGtjcy0+cmVhZF9wb3MpOworCisJaWYgKChsZW5ndGggPj0gMykgJiYgKGtjcy0+cmVhZF9wb3MgPCAzKSkgeworCQkvKiBHdWFyYW50ZWUgdGhhdCB3ZSByZXR1cm4gYXQgbGVhc3QgMyBieXRlcywgd2l0aCBhbgorCQkgICBlcnJvciBpbiB0aGUgdGhpcmQgYnl0ZSBpZiBpdCBpcyB0b28gc2hvcnQuICovCisJCWRhdGFbMl0gPSBJUE1JX0VSUl9VTlNQRUNJRklFRDsKKwkJa2NzLT5yZWFkX3BvcyA9IDM7CisJfQorCWlmIChrY3MtPnRydW5jYXRlZCkgeworCQkvKiBSZXBvcnQgYSB0cnVuY2F0ZWQgZXJyb3IuICBXZSBtaWdodCBvdmVyd3JpdGUKKwkJICAgYW5vdGhlciBlcnJvciwgYnV0IHRoYXQncyB0b28gYmFkLCB0aGUgdXNlciBuZWVkcworCQkgICB0byBrbm93IGl0IHdhcyB0cnVuY2F0ZWQuICovCisJCWRhdGFbMl0gPSBJUE1JX0VSUl9NU0dfVFJVTkNBVEVEOworCQlrY3MtPnRydW5jYXRlZCA9IDA7CisJfQorCisJcmV0dXJuIGtjcy0+cmVhZF9wb3M7Cit9CisKKy8qIFRoaXMgaW1wbGVtZW50cyB0aGUgc3RhdGUgbWFjaGluZSBkZWZpbmVkIGluIHRoZSBJUE1JIG1hbnVhbCwgc2VlCisgICB0aGF0IGZvciBkZXRhaWxzIG9uIGhvdyB0aGlzIHdvcmtzLiAgRGl2aWRlIHRoYXQgZmxvd2NoYXJ0IGludG8KKyAgIHNlY3Rpb25zIGRlbGltaXRlZCBieSAiV2FpdCBmb3IgSUJGIiBhbmQgdGhpcyB3aWxsIGJlY29tZSBjbGVhci4gKi8KK3N0YXRpYyBlbnVtIHNpX3NtX3Jlc3VsdCBrY3NfZXZlbnQoc3RydWN0IHNpX3NtX2RhdGEgKmtjcywgbG9uZyB0aW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgc3RhdGU7CisKKwlzdGF0dXMgPSByZWFkX3N0YXR1cyhrY3MpOworCisjaWZkZWYgREVCVUdfU1RBVEUKKwlwcmludGsoIiAgU3RhdGUgPSAlZCwgJXhcbiIsIGtjcy0+c3RhdGUsIHN0YXR1cyk7CisjZW5kaWYKKwkvKiBBbGwgc3RhdGVzIHdhaXQgZm9yIGliZiwgc28ganVzdCBkbyBpdCBoZXJlLiAqLworCWlmICghY2hlY2tfaWJmKGtjcywgc3RhdHVzLCB0aW1lKSkKKwkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKworCS8qIEp1c3QgYWJvdXQgZXZlcnl0aGluZyBsb29rcyBhdCB0aGUgS0NTIHN0YXRlLCBzbyBncmFiIHRoYXQsIHRvby4gKi8KKwlzdGF0ZSA9IEdFVF9TVEFUVVNfU1RBVEUoc3RhdHVzKTsKKworCXN3aXRjaCAoa2NzLT5zdGF0ZSkgeworCWNhc2UgS0NTX0lETEU6CisJCS8qIElmIHRoZXJlJ3MgYW5kIGludGVycnVwdCBzb3VyY2UsIHR1cm4gaXQgb2ZmLiAqLworCQljbGVhcl9vYmYoa2NzLCBzdGF0dXMpOworCisJCWlmIChHRVRfU1RBVFVTX0FUTihzdGF0dXMpKQorCQkJcmV0dXJuIFNJX1NNX0FUVE47CisJCWVsc2UKKwkJCXJldHVybiBTSV9TTV9JRExFOworCisJY2FzZSBLQ1NfU1RBUlRfT1A6CisJCWlmIChzdGF0ZSAhPSBLQ1NfSURMRSkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoa2NzLAorCQkJCQkgICAgICJTdGF0ZSBtYWNoaW5lIG5vdCBpZGxlIGF0IHN0YXJ0Iik7CisJCQlicmVhazsKKwkJfQorCisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCXdyaXRlX2NtZChrY3MsIEtDU19XUklURV9TVEFSVCk7CisJCWtjcy0+c3RhdGUgPSBLQ1NfV0FJVF9XUklURV9TVEFSVDsKKwkJYnJlYWs7CisKKwljYXNlIEtDU19XQUlUX1dSSVRFX1NUQVJUOgorCQlpZiAoc3RhdGUgIT0gS0NTX1dSSVRFX1NUQVRFKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeSgKKwkJCQlrY3MsCisJCQkJIk5vdCBpbiB3cml0ZSBzdGF0ZSBhdCB3cml0ZSBzdGFydCIpOworCQkJYnJlYWs7CisJCX0KKwkJcmVhZF9kYXRhKGtjcyk7CisJCWlmIChrY3MtPndyaXRlX2NvdW50ID09IDEpIHsKKwkJCXdyaXRlX2NtZChrY3MsIEtDU19XUklURV9FTkQpOworCQkJa2NzLT5zdGF0ZSA9IEtDU19XQUlUX1dSSVRFX0VORDsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX25leHRfYnl0ZShrY3MpOworCQkJa2NzLT5zdGF0ZSA9IEtDU19XQUlUX1dSSVRFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBLQ1NfV0FJVF9XUklURToKKwkJaWYgKHN0YXRlICE9IEtDU19XUklURV9TVEFURSkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoa2NzLAorCQkJCQkgICAgICJOb3QgaW4gd3JpdGUgc3RhdGUgZm9yIHdyaXRlIik7CisJCQlicmVhazsKKwkJfQorCQljbGVhcl9vYmYoa2NzLCBzdGF0dXMpOworCQlpZiAoa2NzLT53cml0ZV9jb3VudCA9PSAxKSB7CisJCQl3cml0ZV9jbWQoa2NzLCBLQ1NfV1JJVEVfRU5EKTsKKwkJCWtjcy0+c3RhdGUgPSBLQ1NfV0FJVF9XUklURV9FTkQ7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9uZXh0X2J5dGUoa2NzKTsKKwkJfQorCQlicmVhazsKKwkJCisJY2FzZSBLQ1NfV0FJVF9XUklURV9FTkQ6CisJCWlmIChzdGF0ZSAhPSBLQ1NfV1JJVEVfU1RBVEUpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KGtjcywKKwkJCQkJICAgICAiTm90IGluIHdyaXRlIHN0YXRlIGZvciB3cml0ZSBlbmQiKTsKKwkJCWJyZWFrOworCQl9CisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCXdyaXRlX25leHRfYnl0ZShrY3MpOworCQlrY3MtPnN0YXRlID0gS0NTX1dBSVRfUkVBRDsKKwkJYnJlYWs7CisKKwljYXNlIEtDU19XQUlUX1JFQUQ6CisJCWlmICgoc3RhdGUgIT0gS0NTX1JFQURfU1RBVEUpICYmIChzdGF0ZSAhPSBLQ1NfSURMRV9TVEFURSkpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KAorCQkJCWtjcywKKwkJCQkiTm90IGluIHJlYWQgb3IgaWRsZSBpbiByZWFkIHN0YXRlIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0ZSA9PSBLQ1NfUkVBRF9TVEFURSkgeworCQkJaWYgKCEgY2hlY2tfb2JmKGtjcywgc3RhdHVzLCB0aW1lKSkKKwkJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQkJcmVhZF9uZXh0X2J5dGUoa2NzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGRvbid0IGltcGxlbWVudCB0aGlzIGV4YWN0bHkgbGlrZSB0aGUgc3RhdGUKKwkJCSAgIG1hY2hpbmUgaW4gdGhlIHNwZWMuICBTb21lIGJyb2tlbiBoYXJkd2FyZQorCQkJICAgZG9lcyBub3Qgd3JpdGUgdGhlIGZpbmFsIGR1bW15IGJ5dGUgdG8gdGhlCisJCQkgICByZWFkIHJlZ2lzdGVyLiAgVGh1cyBvYmYgd2lsbCBuZXZlciBnbyBoaWdoCisJCQkgICBoZXJlLiAgV2UganVzdCBnbyBzdHJhaWdodCB0byBpZGxlLCBhbmQgd2UKKwkJCSAgIGhhbmRsZSBjbGVhcmluZyBvdXQgb2JmIGluIGlkbGUgc3RhdGUgaWYgaXQKKwkJCSAgIGhhcHBlbnMgdG8gY29tZSBpbi4gKi8KKwkJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCQlrY3MtPm9yaWdfd3JpdGVfY291bnQgPSAwOworCQkJa2NzLT5zdGF0ZSA9IEtDU19JRExFOworCQkJcmV0dXJuIFNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBLQ1NfRVJST1IwOgorCQljbGVhcl9vYmYoa2NzLCBzdGF0dXMpOworCQl3cml0ZV9jbWQoa2NzLCBLQ1NfR0VUX1NUQVRVU19BQk9SVCk7CisJCWtjcy0+c3RhdGUgPSBLQ1NfRVJST1IxOworCQlicmVhazsKKworCWNhc2UgS0NTX0VSUk9SMToKKwkJY2xlYXJfb2JmKGtjcywgc3RhdHVzKTsKKwkJd3JpdGVfZGF0YShrY3MsIDApOworCQlrY3MtPnN0YXRlID0gS0NTX0VSUk9SMjsKKwkJYnJlYWs7CisJCQorCWNhc2UgS0NTX0VSUk9SMjoKKwkJaWYgKHN0YXRlICE9IEtDU19SRUFEX1NUQVRFKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShrY3MsCisJCQkJCSAgICAgIk5vdCBpbiByZWFkIHN0YXRlIGZvciBlcnJvcjIiKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghIGNoZWNrX29iZihrY3MsIHN0YXR1cywgdGltZSkpCisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCXdyaXRlX2RhdGEoa2NzLCBLQ1NfUkVBRF9CWVRFKTsKKwkJa2NzLT5zdGF0ZSA9IEtDU19FUlJPUjM7CisJCWJyZWFrOworCQkKKwljYXNlIEtDU19FUlJPUjM6CisJCWlmIChzdGF0ZSAhPSBLQ1NfSURMRV9TVEFURSkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoa2NzLAorCQkJCQkgICAgICJOb3QgaW4gaWRsZSBzdGF0ZSBmb3IgZXJyb3IzIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghIGNoZWNrX29iZihrY3MsIHN0YXR1cywgdGltZSkpCisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCWlmIChrY3MtPm9yaWdfd3JpdGVfY291bnQpIHsKKwkJCXJlc3RhcnRfa2NzX3RyYW5zYWN0aW9uKGtjcyk7CisJCX0gZWxzZSB7CisJCQlrY3MtPnN0YXRlID0gS0NTX0lETEU7CisJCQlyZXR1cm4gU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEU7CisJCX0KKwkJYnJlYWs7CisJCQkKKwljYXNlIEtDU19IT1NFRDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGtjcy0+c3RhdGUgPT0gS0NTX0hPU0VEKSB7CisJCWluaXRfa2NzX2RhdGEoa2NzLCBrY3MtPmlvKTsKKwkJcmV0dXJuIFNJX1NNX0hPU0VEOworCX0KKworCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7Cit9CisKK3N0YXRpYyBpbnQga2NzX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzaV9zbV9kYXRhKTsKK30KKworc3RhdGljIGludCBrY3NfZGV0ZWN0KHN0cnVjdCBzaV9zbV9kYXRhICprY3MpCit7CisJLyogSXQncyBpbXBvc3NpYmxlIGZvciB0aGUgS0NTIHN0YXR1cyByZWdpc3RlciB0byBiZSBhbGwgMSdzLAorCSAgIChhc3N1bWluZyBhIHByb3Blcmx5IGZ1bmN0aW9uaW5nLCBzZWxmLWluaXRpYWxpemVkIEJNQykKKwkgICBidXQgdGhhdCdzIHdoYXQgeW91IGdldCBmcm9tIHJlYWRpbmcgYSBib2d1cyBhZGRyZXNzLCBzbyB3ZQorCSAgIHRlc3QgdGhhdCBmaXJzdC4gKi8KKwlpZiAocmVhZF9zdGF0dXMoa2NzKSA9PSAweGZmKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrY3NfY2xlYW51cChzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzKQoreworfQorCitzdHJ1Y3Qgc2lfc21faGFuZGxlcnMga2NzX3NtaV9oYW5kbGVycyA9Cit7CisJLnZlcnNpb24gICAgICAgICAgID0gSVBNSV9LQ1NfVkVSU0lPTiwKKwkuaW5pdF9kYXRhICAgICAgICAgPSBpbml0X2tjc19kYXRhLAorCS5zdGFydF90cmFuc2FjdGlvbiA9IHN0YXJ0X2tjc190cmFuc2FjdGlvbiwKKwkuZ2V0X3Jlc3VsdCAgICAgICAgPSBnZXRfa2NzX3Jlc3VsdCwKKwkuZXZlbnQgICAgICAgICAgICAgPSBrY3NfZXZlbnQsCisJLmRldGVjdCAgICAgICAgICAgID0ga2NzX2RldGVjdCwKKwkuY2xlYW51cCAgICAgICAgICAgPSBrY3NfY2xlYW51cCwKKwkuc2l6ZSAgICAgICAgICAgICAgPSBrY3Nfc2l6ZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjA2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwpAQCAtMCwwICsxLDMxNzQgQEAKKy8qCisgKiBpcG1pX21zZ2hhbmRsZXIuYworICoKKyAqIEluY29taW5nIGFuZCBvdXRnb2luZyBtZXNzYWdlIHJvdXRpbmcgZm9yIGFuIElQTUkgaW50ZXJmYWNlLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjZGVmaW5lIFBGWCAiSVBNSSBtZXNzYWdlIGhhbmRsZXI6ICIKKyNkZWZpbmUgSVBNSV9NU0dIQU5ETEVSX1ZFUlNJT04gInYzMyIKKworc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICppcG1pX2FsbG9jX3JlY3ZfbXNnKHZvaWQpOworc3RhdGljIGludCBpcG1pX2luaXRfbXNnaGFuZGxlcih2b2lkKTsKKworc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXBtaV9yb290ID0gTlVMTDsKKworI2RlZmluZSBNQVhfRVZFTlRTX0lOX1FVRVVFCTI1CisKKy8qIERvbid0IGxldCBhIG1lc3NhZ2Ugc2l0IGluIGEgcXVldWUgZm9yZXZlciwgYWx3YXlzIHRpbWUgaXQgd2l0aCBhdCBsZXN0CisgICB0aGUgbWF4IG1lc3NhZ2UgdGltZXIuICBUaGlzIGlzIGluIG1pbGxpc2Vjb25kcy4gKi8KKyNkZWZpbmUgTUFYX01TR19USU1FT1VUCQk2MDAwMAorCitzdHJ1Y3QgaXBtaV91c2VyCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCisJLyogVGhlIHVwcGVyIGxheWVyIHRoYXQgaGFuZGxlcyByZWNlaXZlIG1lc3NhZ2VzLiAqLworCXN0cnVjdCBpcG1pX3VzZXJfaG5kbCAqaGFuZGxlcjsKKwl2b2lkICAgICAgICAgICAgICpoYW5kbGVyX2RhdGE7CisKKwkvKiBUaGUgaW50ZXJmYWNlIHRoaXMgdXNlciBpcyBib3VuZCB0by4gKi8KKwlpcG1pX3NtaV90IGludGY7CisKKwkvKiBEb2VzIHRoaXMgaW50ZXJmYWNlIHJlY2VpdmUgSVBNSSBldmVudHM/ICovCisJaW50IGdldHNfZXZlbnRzOworfTsKKworc3RydWN0IGNtZF9yY3ZyCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCisJaXBtaV91c2VyX3QgICB1c2VyOworCXVuc2lnbmVkIGNoYXIgbmV0Zm47CisJdW5zaWduZWQgY2hhciBjbWQ7Cit9OworCitzdHJ1Y3Qgc2VxX3RhYmxlCit7CisJdW5zaWduZWQgaW50ICAgICAgICAgaW51c2UgOiAxOworCXVuc2lnbmVkIGludCAgICAgICAgIGJyb2FkY2FzdCA6IDE7CisKKwl1bnNpZ25lZCBsb25nICAgICAgICB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgICAgICAgIG9yaWdfdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICByZXRyaWVzX2xlZnQ7CisKKwkvKiBUbyB2ZXJpZnkgb24gYW4gaW5jb21pbmcgc2VuZCBtZXNzYWdlIHJlc3BvbnNlIHRoYXQgdGhpcyBpcworICAgICAgICAgICB0aGUgbWVzc2FnZSB0aGF0IHRoZSByZXNwb25zZSBpcyBmb3IsIHdlIGtlZXAgYSBzZXF1ZW5jZSBpZAorICAgICAgICAgICBhbmQgaW5jcmVtZW50IGl0IGV2ZXJ5IHRpbWUgd2Ugc2VuZCBhIG1lc3NhZ2UuICovCisJbG9uZyAgICAgICAgICAgICAgICAgc2VxaWQ7CisKKwkvKiBUaGlzIGlzIGhlbGQgc28gd2UgY2FuIHByb3Blcmx5IHJlc3BvbmQgdG8gdGhlIG1lc3NhZ2Ugb24gYQorICAgICAgICAgICB0aW1lb3V0LCBhbmQgaXQgaXMgdXNlZCB0byBob2xkIHRoZSB0ZW1wb3JhcnkgZGF0YSBmb3IKKyAgICAgICAgICAgcmV0cmFuc21pc3Npb24sIHRvby4gKi8KKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcmVjdl9tc2c7Cit9OworCisvKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBtc2dpZCAobG9uZykgdG8gYWxsb3cgdXMgdG8gZmluZCBhCisgICBzZXF1ZW5jZSB0YWJsZSBlbnRyeSBmcm9tIHRoZSBtc2dpZC4gKi8KKyNkZWZpbmUgU1RPUkVfU0VRX0lOX01TR0lEKHNlcSwgc2VxaWQpICgoKHNlcSYweGZmKTw8MjYpIHwgKHNlcWlkJjB4M2ZmZmZmZikpCisKKyNkZWZpbmUgR0VUX1NFUV9GUk9NX01TR0lEKG1zZ2lkLCBzZXEsIHNlcWlkKSBcCisJZG8gewkJCQkJCQkJXAorCQlzZXEgPSAoKG1zZ2lkID4+IDI2KSAmIDB4M2YpOwkJCQlcCisJCXNlcWlkID0gKG1zZ2lkICYgMHgzZmZmZmYpOwkJCQlcCisgICAgICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBORVhUX1NFUUlEKHNlcWlkKSAoKChzZXFpZCkgKyAxKSAmIDB4M2ZmZmZmKQorCitzdHJ1Y3QgaXBtaV9jaGFubmVsCit7CisJdW5zaWduZWQgY2hhciBtZWRpdW07CisJdW5zaWduZWQgY2hhciBwcm90b2NvbDsKK307CisKK3N0cnVjdCBpcG1pX3Byb2NfZW50cnkKK3sKKwljaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOworCXN0cnVjdCBpcG1pX3Byb2NfZW50cnkgKm5leHQ7Cit9OworCisjZGVmaW5lIElQTUlfSVBNQl9OVU1fU0VRCTY0CisjZGVmaW5lIElQTUlfTUFYX0NIQU5ORUxTICAgICAgIDgKK3N0cnVjdCBpcG1pX3NtaQoreworCS8qIFdoYXQgaW50ZXJmYWNlIG51bWJlciBhcmUgd2U/ICovCisJaW50IGludGZfbnVtOworCisJLyogVGhlIGxpc3Qgb2YgdXBwZXIgbGF5ZXJzIHRoYXQgYXJlIHVzaW5nIG1lLiAgV2UgcmVhZC1sb2NrCisgICAgICAgICAgIHRoaXMgd2hlbiBkZWxpdmVyaW5nIG1lc3NhZ2VzIHRvIHRoZSB1cHBlciBsYXllciB0byBrZWVwCisgICAgICAgICAgIHRoZSB1c2VyIGZyb20gZ29pbmcgYXdheSB3aGlsZSB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUKKyAgICAgICAgICAgbWVzc2FnZS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2Fubm90IGFkZCBvciBkZWxldGUgYSB1c2VyCisgICAgICAgICAgIGZyb20gdGhlIHJlY2VpdmUgY2FsbGJhY2suICovCisJcndsb2NrX3QgICAgICAgICAgICAgICAgdXNlcnNfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICB1c2VyczsKKworCS8qIFVzZWQgZm9yIHdha2UgdXBzIGF0IHN0YXJ0dXAuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisKKwkvKiBUaGUgSVBNSSB2ZXJzaW9uIG9mIHRoZSBCTUMgb24gdGhlIG90aGVyIGVuZC4gKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgIHZlcnNpb25fbWFqb3I7CisJdW5zaWduZWQgY2hhciAgICAgICB2ZXJzaW9uX21pbm9yOworCisJLyogVGhpcyBpcyB0aGUgbG93ZXItbGF5ZXIncyBzZW5kZXIgcm91dGluZS4gKi8KKwlzdHJ1Y3QgaXBtaV9zbWlfaGFuZGxlcnMgKmhhbmRsZXJzOworCXZvaWQgICAgICAgICAgICAgICAgICAgICAqc2VuZF9pbmZvOworCisJLyogQSBsaXN0IG9mIHByb2MgZW50cmllcyBmb3IgdGhpcyBpbnRlcmZhY2UuICBUaGlzIGRvZXMgbm90CisJICAgbmVlZCBhIGxvY2ssIG9ubHkgb25lIHRocmVhZCBjcmVhdGVzIGl0IGFuZCBvbmx5IG9uZSB0aHJlYWQKKwkgICBkZXN0cm95cyBpdC4gKi8KKwlzdHJ1Y3QgaXBtaV9wcm9jX2VudHJ5ICpwcm9jX2VudHJpZXM7CisKKwkvKiBBIHRhYmxlIG9mIHNlcXVlbmNlIG51bWJlcnMgZm9yIHRoaXMgaW50ZXJmYWNlLiAgV2UgdXNlIHRoZQorICAgICAgICAgICBzZXF1ZW5jZSBudW1iZXJzIGZvciBJUE1CIG1lc3NhZ2VzIHRoYXQgZ28gb3V0IG9mIHRoZQorICAgICAgICAgICBpbnRlcmZhY2UgdG8gbWF0Y2ggdGhlbSB1cCB3aXRoIHRoZWlyIHJlc3BvbnNlcy4gIEEgcm91dGluZQorICAgICAgICAgICBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIHRpbWUgdGhlIGl0ZW1zIGluIHRoaXMgbGlzdC4gKi8KKwlzcGlubG9ja190ICAgICAgIHNlcV9sb2NrOworCXN0cnVjdCBzZXFfdGFibGUgc2VxX3RhYmxlW0lQTUlfSVBNQl9OVU1fU0VRXTsKKwlpbnQgY3Vycl9zZXE7CisKKwkvKiBNZXNzYWdlcyB0aGF0IHdlcmUgZGVsYXllZCBmb3Igc29tZSByZWFzb24gKG91dCBvZiBtZW1vcnksCisgICAgICAgICAgIGZvciBpbnN0YW5jZSksIHdpbGwgZ28gaW4gaGVyZSB0byBiZSBwcm9jZXNzZWQgbGF0ZXIgaW4gYQorICAgICAgICAgICBwZXJpb2RpYyB0aW1lciBpbnRlcnJ1cHQuICovCisJc3BpbmxvY2tfdCAgICAgICB3YWl0aW5nX21zZ3NfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfbXNnczsKKworCS8qIFRoZSBsaXN0IG9mIGNvbW1hbmQgcmVjZWl2ZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgZm9yIGNvbW1hbmRzCisJICAgb24gdGhpcyBpbnRlcmZhY2UuICovCisJcndsb2NrX3QJIGNtZF9yY3ZyX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBjbWRfcmN2cnM7CisKKwkvKiBFdmVudHMgdGhhdCB3ZXJlIHF1ZXVlcyBiZWNhdXNlIG5vIG9uZSB3YXMgdGhlcmUgdG8gcmVjZWl2ZQorICAgICAgICAgICB0aGVtLiAqLworCXNwaW5sb2NrX3QgICAgICAgZXZlbnRzX2xvY2s7IC8qIEZvciBkZWFsaW5nIHdpdGggZXZlbnQgc3R1ZmYuICovCisJc3RydWN0IGxpc3RfaGVhZCB3YWl0aW5nX2V2ZW50czsKKwl1bnNpZ25lZCBpbnQgICAgIHdhaXRpbmdfZXZlbnRzX2NvdW50OyAvKiBIb3cgbWFueSBldmVudHMgaW4gcXVldWU/ICovCisKKwkvKiBUaGlzIHdpbGwgYmUgbm9uLW51bGwgaWYgc29tZW9uZSByZWdpc3RlcnMgdG8gcmVjZWl2ZSBhbGwKKwkgICBJUE1JIGNvbW1hbmRzICh0aGlzIGlzIGZvciBpbnRlcmZhY2UgZW11bGF0aW9uKS4gIFRoZXJlCisJICAgbWF5IG5vdCBiZSBhbnkgdGhpbmdzIGluIHRoZSBjbWRfcmN2cnMgbGlzdCBhYm92ZSB3aGVuCisJICAgdGhpcyBpcyByZWdpc3RlcmVkLiAqLworCWlwbWlfdXNlcl90IGFsbF9jbWRfcmN2cjsKKworCS8qIE15IHNsYXZlIGFkZHJlc3MuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIElQTUlfQk1DX1NMQVZFX0FERFIsCisJICAgYnV0IG1heSBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiAqLworCXVuc2lnbmVkIGNoYXIgbXlfYWRkcmVzczsKKworCS8qIE15IExVTi4gIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBzdGF5IHRoZSBTTVMgTFVOLCBidXQganVzdCBpbgorCSAgIGNhc2UuLi4gKi8KKwl1bnNpZ25lZCBjaGFyIG15X2x1bjsKKworCS8qIFRoZSBldmVudCByZWNlaXZlciBmb3IgbXkgQk1DLCBvbmx5IHJlYWxseSB1c2VkIGF0IHBhbmljCisJICAgc2h1dGRvd24gYXMgYSBwbGFjZSB0byBzdG9yZSB0aGlzLiAqLworCXVuc2lnbmVkIGNoYXIgZXZlbnRfcmVjZWl2ZXI7CisJdW5zaWduZWQgY2hhciBldmVudF9yZWNlaXZlcl9sdW47CisJdW5zaWduZWQgY2hhciBsb2NhbF9zZWxfZGV2aWNlOworCXVuc2lnbmVkIGNoYXIgbG9jYWxfZXZlbnRfZ2VuZXJhdG9yOworCisJLyogQSBjaGVhcCBoYWNrLCBpZiB0aGlzIGlzIG5vbi1udWxsIGFuZCBhIG1lc3NhZ2UgdG8gYW4KKwkgICBpbnRlcmZhY2UgY29tZXMgaW4gd2l0aCBhIE5VTEwgdXNlciwgY2FsbCB0aGlzIHJvdXRpbmUgd2l0aAorCSAgIGl0LiAgTm90ZSB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgc3RpbGwgYmUgZnJlZWQgYnkgdGhlCisJICAgY2FsbGVyLiAgVGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBzeXN0ZW0gaW50ZXJmYWNlLiAqLworCXZvaWQgKCpudWxsX3VzZXJfaGFuZGxlcikoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpOworCisJLyogV2hlbiB3ZSBhcmUgc2Nhbm5pbmcgdGhlIGNoYW5uZWxzIGZvciBhbiBTTUksIHRoaXMgd2lsbAorCSAgIHRlbGwgd2hpY2ggY2hhbm5lbCB3ZSBhcmUgc2Nhbm5pbmcuICovCisJaW50IGN1cnJfY2hhbm5lbDsKKworCS8qIENoYW5uZWwgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaXBtaV9jaGFubmVsIGNoYW5uZWxzW0lQTUlfTUFYX0NIQU5ORUxTXTsKKworCS8qIFByb2MgRlMgc3R1ZmYuICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RpcjsKKwljaGFyICAgICAgICAgICAgICAgICAgcHJvY19kaXJfbmFtZVsxMF07CisKKwlzcGlubG9ja190ICAgY291bnRlcl9sb2NrOyAvKiBGb3IgbWFraW5nIGNvdW50ZXJzIGF0b21pYy4gKi8KKworCS8qIENvbW1hbmRzIHdlIGdvdCB0aGF0IHdlcmUgaW52YWxpZC4gKi8KKwl1bnNpZ25lZCBpbnQgc2VudF9pbnZhbGlkX2NvbW1hbmRzOworCisJLyogQ29tbWFuZHMgd2Ugc2VudCB0byB0aGUgTUMuICovCisJdW5zaWduZWQgaW50IHNlbnRfbG9jYWxfY29tbWFuZHM7CisJLyogUmVzcG9uc2VzIGZyb20gdGhlIE1DIHRoYXQgd2VyZSBkZWxpdmVyZWQgdG8gYSB1c2VyLiAqLworCXVuc2lnbmVkIGludCBoYW5kbGVkX2xvY2FsX3Jlc3BvbnNlczsKKwkvKiBSZXNwb25zZXMgZnJvbSB0aGUgTUMgdGhhdCB3ZXJlIG5vdCBkZWxpdmVyZWQgdG8gYSB1c2VyLiAqLworCXVuc2lnbmVkIGludCB1bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzOworCisJLyogQ29tbWFuZHMgd2Ugc2VudCBvdXQgdG8gdGhlIElQTUIgYnVzLiAqLworCXVuc2lnbmVkIGludCBzZW50X2lwbWJfY29tbWFuZHM7CisJLyogQ29tbWFuZHMgc2VudCBvbiB0aGUgSVBNQiB0aGF0IGhhZCBlcnJvcnMgb24gdGhlIFNFTkQgQ01EICovCisJdW5zaWduZWQgaW50IHNlbnRfaXBtYl9jb21tYW5kX2VycnM7CisJLyogRWFjaCByZXRyYW5zbWl0IGluY3JlbWVudHMgdGhpcyBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgcmV0cmFuc21pdHRlZF9pcG1iX2NvbW1hbmRzOworCS8qIFdoZW4gYSBtZXNzYWdlIHRpbWVzIG91dCAocnVucyBvdXQgb2YgcmV0cmFuc21pdHMpIHRoaXMgaXMKKyAgICAgICAgICAgaW5jcmVtZW50ZWQuICovCisJdW5zaWduZWQgaW50IHRpbWVkX291dF9pcG1iX2NvbW1hbmRzOworCisJLyogVGhpcyBpcyBsaWtlIGFib3ZlLCBidXQgZm9yIGJyb2FkY2FzdHMuICBCcm9hZGNhc3RzIGFyZQorICAgICAgICAgICAqbm90KiBpbmNsdWRlZCBpbiB0aGUgYWJvdmUgY291bnQgKHRoZXkgYXJlIGV4cGVjdGVkIHRvCisgICAgICAgICAgIHRpbWUgb3V0KS4gKi8KKwl1bnNpZ25lZCBpbnQgdGltZWRfb3V0X2lwbWJfYnJvYWRjYXN0czsKKworCS8qIFJlc3BvbnNlcyBJIGhhdmUgc2VudCB0byB0aGUgSVBNQiBidXMuICovCisJdW5zaWduZWQgaW50IHNlbnRfaXBtYl9yZXNwb25zZXM7CisKKwkvKiBUaGUgcmVzcG9uc2Ugd2FzIGRlbGl2ZXJlZCB0byB0aGUgdXNlci4gKi8KKwl1bnNpZ25lZCBpbnQgaGFuZGxlZF9pcG1iX3Jlc3BvbnNlczsKKwkvKiBUaGUgcmVzcG9uc2UgaGFkIGludmFsaWQgZGF0YSBpbiBpdC4gKi8KKwl1bnNpZ25lZCBpbnQgaW52YWxpZF9pcG1iX3Jlc3BvbnNlczsKKwkvKiBUaGUgcmVzcG9uc2UgZGlkbid0IGhhdmUgYW55b25lIHdhaXRpbmcgZm9yIGl0LiAqLworCXVuc2lnbmVkIGludCB1bmhhbmRsZWRfaXBtYl9yZXNwb25zZXM7CisKKwkvKiBDb21tYW5kcyB3ZSBzZW50IG91dCB0byB0aGUgSVBNQiBidXMuICovCisJdW5zaWduZWQgaW50IHNlbnRfbGFuX2NvbW1hbmRzOworCS8qIENvbW1hbmRzIHNlbnQgb24gdGhlIElQTUIgdGhhdCBoYWQgZXJyb3JzIG9uIHRoZSBTRU5EIENNRCAqLworCXVuc2lnbmVkIGludCBzZW50X2xhbl9jb21tYW5kX2VycnM7CisJLyogRWFjaCByZXRyYW5zbWl0IGluY3JlbWVudHMgdGhpcyBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgcmV0cmFuc21pdHRlZF9sYW5fY29tbWFuZHM7CisJLyogV2hlbiBhIG1lc3NhZ2UgdGltZXMgb3V0IChydW5zIG91dCBvZiByZXRyYW5zbWl0cykgdGhpcyBpcworICAgICAgICAgICBpbmNyZW1lbnRlZC4gKi8KKwl1bnNpZ25lZCBpbnQgdGltZWRfb3V0X2xhbl9jb21tYW5kczsKKworCS8qIFJlc3BvbnNlcyBJIGhhdmUgc2VudCB0byB0aGUgSVBNQiBidXMuICovCisJdW5zaWduZWQgaW50IHNlbnRfbGFuX3Jlc3BvbnNlczsKKworCS8qIFRoZSByZXNwb25zZSB3YXMgZGVsaXZlcmVkIHRvIHRoZSB1c2VyLiAqLworCXVuc2lnbmVkIGludCBoYW5kbGVkX2xhbl9yZXNwb25zZXM7CisJLyogVGhlIHJlc3BvbnNlIGhhZCBpbnZhbGlkIGRhdGEgaW4gaXQuICovCisJdW5zaWduZWQgaW50IGludmFsaWRfbGFuX3Jlc3BvbnNlczsKKwkvKiBUaGUgcmVzcG9uc2UgZGlkbid0IGhhdmUgYW55b25lIHdhaXRpbmcgZm9yIGl0LiAqLworCXVuc2lnbmVkIGludCB1bmhhbmRsZWRfbGFuX3Jlc3BvbnNlczsKKworCS8qIFRoZSBjb21tYW5kIHdhcyBkZWxpdmVyZWQgdG8gdGhlIHVzZXIuICovCisJdW5zaWduZWQgaW50IGhhbmRsZWRfY29tbWFuZHM7CisJLyogVGhlIGNvbW1hbmQgaGFkIGludmFsaWQgZGF0YSBpbiBpdC4gKi8KKwl1bnNpZ25lZCBpbnQgaW52YWxpZF9jb21tYW5kczsKKwkvKiBUaGUgY29tbWFuZCBkaWRuJ3QgaGF2ZSBhbnlvbmUgd2FpdGluZyBmb3IgaXQuICovCisJdW5zaWduZWQgaW50IHVuaGFuZGxlZF9jb21tYW5kczsKKworCS8qIEludmFsaWQgZGF0YSBpbiBhbiBldmVudC4gKi8KKwl1bnNpZ25lZCBpbnQgaW52YWxpZF9ldmVudHM7CisJLyogRXZlbnRzIHRoYXQgd2VyZSByZWNlaXZlZCB3aXRoIHRoZSBwcm9wZXIgZm9ybWF0LiAqLworCXVuc2lnbmVkIGludCBldmVudHM7Cit9OworCisjZGVmaW5lIE1BWF9JUE1JX0lOVEVSRkFDRVMgNAorc3RhdGljIGlwbWlfc21pX3QgaXBtaV9pbnRlcmZhY2VzW01BWF9JUE1JX0lOVEVSRkFDRVNdOworCisvKiBVc2VkIHRvIGtlZXAgaW50ZXJmYWNlcyBmcm9tIGdvaW5nIGF3YXkgd2hpbGUgb3BlcmF0aW9ucyBhcmUKKyAgIG9wZXJhdGluZyBvbiBpbnRlcmZhY2VzLiAgR3JhYiByZWFkIGlmIHlvdSBhcmUgbm90IG1vZGlmeWluZyB0aGUKKyAgIGludGVyZmFjZXMsIHdyaXRlIGlmIHlvdSBhcmUuICovCitzdGF0aWMgREVDTEFSRV9SV1NFTShpbnRlcmZhY2VzX3NlbSk7CisKKy8qIERpcmVjdGx5IHByb3RlY3RzIHRoZSBpcG1pX2ludGVyZmFjZXMgZGF0YSBzdHJ1Y3R1cmUuICBUaGlzIGlzCisgICBjbGFpbWVkIGluIHRoZSB0aW1lciBpbnRlcnJ1cHQuICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGludGVyZmFjZXNfbG9jayk7CisKKy8qIExpc3Qgb2Ygd2F0Y2hlcnMgdGhhdCB3YW50IHRvIGtub3cgd2hlbiBzbWkncyBhcmUgYWRkZWQgYW5kCisgICBkZWxldGVkLiAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc21pX3dhdGNoZXJzID0gTElTVF9IRUFEX0lOSVQoc21pX3dhdGNoZXJzKTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKHNtaV93YXRjaGVyc19zZW0pOworCitpbnQgaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3RlcihzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlpbnQgaTsKKworCWRvd25fcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCWRvd25fd3JpdGUoJnNtaV93YXRjaGVyc19zZW0pOworCWxpc3RfYWRkKCYod2F0Y2hlci0+bGluayksICZzbWlfd2F0Y2hlcnMpOworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQlpZiAoaXBtaV9pbnRlcmZhY2VzW2ldICE9IE5VTEwpIHsKKwkJCXdhdGNoZXItPm5ld19zbWkoaSk7CisJCX0KKwl9CisJdXBfd3JpdGUoJnNtaV93YXRjaGVyc19zZW0pOworCXVwX3JlYWQoJmludGVyZmFjZXNfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlkb3duX3dyaXRlKCZzbWlfd2F0Y2hlcnNfc2VtKTsKKwlsaXN0X2RlbCgmKHdhdGNoZXItPmxpbmspKTsKKwl1cF93cml0ZSgmc21pX3dhdGNoZXJzX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitjYWxsX3NtaV93YXRjaGVycyhpbnQgaSkKK3sKKwlzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciAqdzsKKworCWRvd25fcmVhZCgmc21pX3dhdGNoZXJzX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmc21pX3dhdGNoZXJzLCBsaW5rKSB7CisJCWlmICh0cnlfbW9kdWxlX2dldCh3LT5vd25lcikpIHsKKwkJCXctPm5ld19zbWkoaSk7CisJCQltb2R1bGVfcHV0KHctPm93bmVyKTsKKwkJfQorCX0KKwl1cF9yZWFkKCZzbWlfd2F0Y2hlcnNfc2VtKTsKK30KKworc3RhdGljIGludAoraXBtaV9hZGRyX2VxdWFsKHN0cnVjdCBpcG1pX2FkZHIgKmFkZHIxLCBzdHJ1Y3QgaXBtaV9hZGRyICphZGRyMikKK3sKKwlpZiAoYWRkcjEtPmFkZHJfdHlwZSAhPSBhZGRyMi0+YWRkcl90eXBlKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGRyMS0+Y2hhbm5lbCAhPSBhZGRyMi0+Y2hhbm5lbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWRkcjEtPmFkZHJfdHlwZSA9PSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFKSB7CisJCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc21pX2FkZHIxCisJCSAgICA9IChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikgYWRkcjE7CisJCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc21pX2FkZHIyCisJCSAgICA9IChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikgYWRkcjI7CisJCXJldHVybiAoc21pX2FkZHIxLT5sdW4gPT0gc21pX2FkZHIyLT5sdW4pOworCX0KKworCWlmICgoYWRkcjEtPmFkZHJfdHlwZSA9PSBJUE1JX0lQTUJfQUREUl9UWVBFKQorCSAgICB8fCAoYWRkcjEtPmFkZHJfdHlwZSA9PSBJUE1JX0lQTUJfQlJPQURDQVNUX0FERFJfVFlQRSkpCisJeworCQlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKmlwbWJfYWRkcjEKKwkJICAgID0gKHN0cnVjdCBpcG1pX2lwbWJfYWRkciAqKSBhZGRyMTsKKwkJc3RydWN0IGlwbWlfaXBtYl9hZGRyICppcG1iX2FkZHIyCisJCSAgICA9IChzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKikgYWRkcjI7CisKKwkJcmV0dXJuICgoaXBtYl9hZGRyMS0+c2xhdmVfYWRkciA9PSBpcG1iX2FkZHIyLT5zbGF2ZV9hZGRyKQorCQkJJiYgKGlwbWJfYWRkcjEtPmx1biA9PSBpcG1iX2FkZHIyLT5sdW4pKTsKKwl9CisKKwlpZiAoYWRkcjEtPmFkZHJfdHlwZSA9PSBJUE1JX0xBTl9BRERSX1RZUEUpIHsKKwkJc3RydWN0IGlwbWlfbGFuX2FkZHIgKmxhbl9hZGRyMQorCQkJPSAoc3RydWN0IGlwbWlfbGFuX2FkZHIgKikgYWRkcjE7CisJCXN0cnVjdCBpcG1pX2xhbl9hZGRyICpsYW5fYWRkcjIKKwkJICAgID0gKHN0cnVjdCBpcG1pX2xhbl9hZGRyICopIGFkZHIyOworCisJCXJldHVybiAoKGxhbl9hZGRyMS0+cmVtb3RlX1NXSUQgPT0gbGFuX2FkZHIyLT5yZW1vdGVfU1dJRCkKKwkJCSYmIChsYW5fYWRkcjEtPmxvY2FsX1NXSUQgPT0gbGFuX2FkZHIyLT5sb2NhbF9TV0lEKQorCQkJJiYgKGxhbl9hZGRyMS0+c2Vzc2lvbl9oYW5kbGUKKwkJCSAgICA9PSBsYW5fYWRkcjItPnNlc3Npb25faGFuZGxlKQorCQkJJiYgKGxhbl9hZGRyMS0+bHVuID09IGxhbl9hZGRyMi0+bHVuKSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBpcG1pX3ZhbGlkYXRlX2FkZHIoc3RydWN0IGlwbWlfYWRkciAqYWRkciwgaW50IGxlbikKK3sKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkcikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkZHItPmFkZHJfdHlwZSA9PSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFKSB7CisJCWlmIChhZGRyLT5jaGFubmVsICE9IElQTUlfQk1DX0NIQU5ORUwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChhZGRyLT5jaGFubmVsID09IElQTUlfQk1DX0NIQU5ORUwpCisJICAgIHx8IChhZGRyLT5jaGFubmVsID49IElQTUlfTlVNX0NIQU5ORUxTKQorCSAgICB8fCAoYWRkci0+Y2hhbm5lbCA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoYWRkci0+YWRkcl90eXBlID09IElQTUlfSVBNQl9BRERSX1RZUEUpCisJICAgIHx8IChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUpKQorCXsKKwkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYWRkci0+YWRkcl90eXBlID09IElQTUlfTEFOX0FERFJfVFlQRSkgeworCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpcG1pX2xhbl9hZGRyKSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3Vuc2lnbmVkIGludCBpcG1pX2FkZHJfbGVuZ3RoKGludCBhZGRyX3R5cGUpCit7CisJaWYgKGFkZHJfdHlwZSA9PSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkcik7CisKKwlpZiAoKGFkZHJfdHlwZSA9PSBJUE1JX0lQTUJfQUREUl9UWVBFKQorCSAgICB8fCAoYWRkcl90eXBlID09IElQTUlfSVBNQl9CUk9BRENBU1RfQUREUl9UWVBFKSkKKwl7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGlwbWlfaXBtYl9hZGRyKTsKKwl9CisKKwlpZiAoYWRkcl90eXBlID09IElQTUlfTEFOX0FERFJfVFlQRSkKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaXBtaV9sYW5fYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsaXZlcl9yZXNwb25zZShzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQoreworCW1zZy0+dXNlci0+aGFuZGxlci0+aXBtaV9yZWN2X2huZGwobXNnLCBtc2ctPnVzZXItPmhhbmRsZXJfZGF0YSk7Cit9CisKKy8qIEZpbmQgdGhlIG5leHQgc2VxdWVuY2UgbnVtYmVyIG5vdCBiZWluZyB1c2VkIGFuZCBhZGQgdGhlIGdpdmVuCisgICBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHRpbWVvdXQgdG8gdGhlIHNlcXVlbmNlIHRhYmxlLiAgVGhpcyBtdXN0IGJlCisgICBjYWxsZWQgd2l0aCB0aGUgaW50ZXJmYWNlJ3Mgc2VxX2xvY2sgaGVsZC4gKi8KK3N0YXRpYyBpbnQgaW50Zl9uZXh0X3NlcShpcG1pX3NtaV90ICAgICAgICAgICBpbnRmLAorCQkJIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywKKwkJCSB1bnNpZ25lZCBsb25nICAgICAgICB0aW1lb3V0LAorCQkJIGludCAgICAgICAgICAgICAgICAgIHJldHJpZXMsCisJCQkgaW50ICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LAorCQkJIHVuc2lnbmVkIGNoYXIgICAgICAgICpzZXEsCisJCQkgbG9uZyAgICAgICAgICAgICAgICAgKnNlcWlkKQoreworCWludCAgICAgICAgICBydiA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGk9aW50Zi0+Y3Vycl9zZXE7CisJICAgICAoaSsxKSVJUE1JX0lQTUJfTlVNX1NFUSAhPSBpbnRmLT5jdXJyX3NlcTsKKwkgICAgIGk9KGkrMSklSVBNSV9JUE1CX05VTV9TRVEpCisJeworCQlpZiAoISBpbnRmLT5zZXFfdGFibGVbaV0uaW51c2UpCisJCQlicmVhazsKKwl9CisKKwlpZiAoISBpbnRmLT5zZXFfdGFibGVbaV0uaW51c2UpIHsKKwkJaW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnID0gcmVjdl9tc2c7CisKKwkJLyogU3RhcnQgd2l0aCB0aGUgbWF4aW11bSB0aW1lb3V0LCB3aGVuIHRoZSBzZW5kIHJlc3BvbnNlCisJCSAgIGNvbWVzIGluIHdlIHdpbGwgc3RhcnQgdGhlIHJlYWwgdGltZXIuICovCisJCWludGYtPnNlcV90YWJsZVtpXS50aW1lb3V0ID0gTUFYX01TR19USU1FT1VUOworCQlpbnRmLT5zZXFfdGFibGVbaV0ub3JpZ190aW1lb3V0ID0gdGltZW91dDsKKwkJaW50Zi0+c2VxX3RhYmxlW2ldLnJldHJpZXNfbGVmdCA9IHJldHJpZXM7CisJCWludGYtPnNlcV90YWJsZVtpXS5icm9hZGNhc3QgPSBicm9hZGNhc3Q7CisJCWludGYtPnNlcV90YWJsZVtpXS5pbnVzZSA9IDE7CisJCWludGYtPnNlcV90YWJsZVtpXS5zZXFpZCA9IE5FWFRfU0VRSUQoaW50Zi0+c2VxX3RhYmxlW2ldLnNlcWlkKTsKKwkJKnNlcSA9IGk7CisJCSpzZXFpZCA9IGludGYtPnNlcV90YWJsZVtpXS5zZXFpZDsKKwkJaW50Zi0+Y3Vycl9zZXEgPSAoaSsxKSVJUE1JX0lQTUJfTlVNX1NFUTsKKwl9IGVsc2UgeworCQlydiA9IC1FQUdBSU47CisJfQorCQorCXJldHVybiBydjsKK30KKworLyogUmV0dXJuIHRoZSByZWNlaXZlIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBzZXF1ZW5jZSBudW1iZXIgYW5kCisgICByZWxlYXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgc28gaXQgY2FuIGJlIHJldXNlZC4gIFNvbWUgb3RoZXIgZGF0YQorICAgaXMgcGFzc2VkIGluIHRvIGJlIHN1cmUgdGhlIG1lc3NhZ2UgbWF0Y2hlcyB1cCBjb3JyZWN0bHkgKHRvIGhlbHAKKyAgIGd1YXJkIGFnYWluc3QgbWVzc2FnZSBjb21pbmcgaW4gYWZ0ZXIgdGhlaXIgdGltZW91dCBhbmQgdGhlCisgICBzZXF1ZW5jZSBudW1iZXIgYmVpbmcgcmV1c2VkKS4gKi8KK3N0YXRpYyBpbnQgaW50Zl9maW5kX3NlcShpcG1pX3NtaV90ICAgICAgICAgICBpbnRmLAorCQkJIHVuc2lnbmVkIGNoYXIgICAgICAgIHNlcSwKKwkJCSBzaG9ydCAgICAgICAgICAgICAgICBjaGFubmVsLAorCQkJIHVuc2lnbmVkIGNoYXIgICAgICAgIGNtZCwKKwkJCSB1bnNpZ25lZCBjaGFyICAgICAgICBuZXRmbiwKKwkJCSBzdHJ1Y3QgaXBtaV9hZGRyICAgICAqYWRkciwKKwkJCSBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqKnJlY3ZfbXNnKQoreworCWludCAgICAgICAgICAgcnYgPSAtRU5PREVWOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VxID49IElQTUlfSVBNQl9OVU1fU0VRKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisJaWYgKGludGYtPnNlcV90YWJsZVtzZXFdLmludXNlKSB7CisJCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cgPSBpbnRmLT5zZXFfdGFibGVbc2VxXS5yZWN2X21zZzsKKworCQlpZiAoKG1zZy0+YWRkci5jaGFubmVsID09IGNoYW5uZWwpCisJCSAgICAmJiAobXNnLT5tc2cuY21kID09IGNtZCkKKwkJICAgICYmIChtc2ctPm1zZy5uZXRmbiA9PSBuZXRmbikKKwkJICAgICYmIChpcG1pX2FkZHJfZXF1YWwoYWRkciwgJihtc2ctPmFkZHIpKSkpCisJCXsKKwkJCSpyZWN2X21zZyA9IG1zZzsKKwkJCWludGYtPnNlcV90YWJsZVtzZXFdLmludXNlID0gMDsKKwkJCXJ2ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwlyZXR1cm4gcnY7Cit9CisKKworLyogU3RhcnQgdGhlIHRpbWVyIGZvciBhIHNwZWNpZmljIHNlcXVlbmNlIHRhYmxlIGVudHJ5LiAqLworc3RhdGljIGludCBpbnRmX3N0YXJ0X3NlcV90aW1lcihpcG1pX3NtaV90IGludGYsCisJCQkJbG9uZyAgICAgICBtc2dpZCkKK3sKKwlpbnQgICAgICAgICAgIHJ2ID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgc2VxOworCXVuc2lnbmVkIGxvbmcgc2VxaWQ7CisKKworCUdFVF9TRVFfRlJPTV9NU0dJRChtc2dpZCwgc2VxLCBzZXFpZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCS8qIFdlIGRvIHRoaXMgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgY2FuIGJlIGRlbGV0ZWQKKyAgICAgICAgICAgd2hpbGUgYSBtZXNzYWdlIGlzIG91dHN0YW5kaW5nLiAqLworCWlmICgoaW50Zi0+c2VxX3RhYmxlW3NlcV0uaW51c2UpCisJICAgICYmIChpbnRmLT5zZXFfdGFibGVbc2VxXS5zZXFpZCA9PSBzZXFpZCkpCisJeworCQlzdHJ1Y3Qgc2VxX3RhYmxlICplbnQgPSAmKGludGYtPnNlcV90YWJsZVtzZXFdKTsKKwkJZW50LT50aW1lb3V0ID0gZW50LT5vcmlnX3RpbWVvdXQ7CisJCXJ2ID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCisJcmV0dXJuIHJ2OworfQorCisvKiBHb3QgYW4gZXJyb3IgZm9yIHRoZSBzZW5kIG1lc3NhZ2UgZm9yIGEgc3BlY2lmaWMgc2VxdWVuY2UgbnVtYmVyLiAqLworc3RhdGljIGludCBpbnRmX2Vycl9zZXEoaXBtaV9zbWlfdCAgIGludGYsCisJCQlsb25nICAgICAgICAgbXNnaWQsCisJCQl1bnNpZ25lZCBpbnQgZXJyKQoreworCWludCAgICAgICAgICAgICAgICAgIHJ2ID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBsb25nICAgICAgICBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICAgICAgICBzZXE7CisJdW5zaWduZWQgbG9uZyAgICAgICAgc2VxaWQ7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZyA9IE5VTEw7CisKKworCUdFVF9TRVFfRlJPTV9NU0dJRChtc2dpZCwgc2VxLCBzZXFpZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCS8qIFdlIGRvIHRoaXMgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgY2FuIGJlIGRlbGV0ZWQKKyAgICAgICAgICAgd2hpbGUgYSBtZXNzYWdlIGlzIG91dHN0YW5kaW5nLiAqLworCWlmICgoaW50Zi0+c2VxX3RhYmxlW3NlcV0uaW51c2UpCisJICAgICYmIChpbnRmLT5zZXFfdGFibGVbc2VxXS5zZXFpZCA9PSBzZXFpZCkpCisJeworCQlzdHJ1Y3Qgc2VxX3RhYmxlICplbnQgPSAmKGludGYtPnNlcV90YWJsZVtzZXFdKTsKKworCQllbnQtPmludXNlID0gMDsKKwkJbXNnID0gZW50LT5yZWN2X21zZzsKKwkJcnYgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwlpZiAobXNnKSB7CisJCW1zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRUNWX1RZUEU7CisJCW1zZy0+bXNnX2RhdGFbMF0gPSBlcnI7CisJCW1zZy0+bXNnLm5ldGZuIHw9IDE7IC8qIENvbnZlcnQgdG8gYSByZXNwb25zZS4gKi8KKwkJbXNnLT5tc2cuZGF0YV9sZW4gPSAxOworCQltc2ctPm1zZy5kYXRhID0gbXNnLT5tc2dfZGF0YTsKKwkJZGVsaXZlcl9yZXNwb25zZShtc2cpOworCX0KKworCXJldHVybiBydjsKK30KKworCitpbnQgaXBtaV9jcmVhdGVfdXNlcih1bnNpZ25lZCBpbnQgICAgICAgICAgaWZfbnVtLAorCQkgICAgIHN0cnVjdCBpcG1pX3VzZXJfaG5kbCAqaGFuZGxlciwKKwkJICAgICB2b2lkICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfZGF0YSwKKwkJICAgICBpcG1pX3VzZXJfdCAgICAgICAgICAgKnVzZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpcG1pX3VzZXJfdCAgIG5ld191c2VyOworCWludCAgICAgICAgICAgcnYgPSAwOworCWlwbWlfc21pX3QgICAgaW50ZjsKKworCS8qIFRoZXJlIGlzIG5vIG1vZHVsZSB1c2Vjb3VudCBoZXJlLCBiZWNhdXNlIGl0J3Mgbm90CisgICAgICAgICAgIHJlcXVpcmVkLiAgU2luY2UgdGhpcyBjYW4gb25seSBiZSB1c2VkIGJ5IGFuZCBjYWxsZWQgZnJvbQorICAgICAgICAgICBvdGhlciBtb2R1bGVzLCB0aGV5IHdpbGwgaW1wbGljaXRseSB1c2UgdGhpcyBtb2R1bGUsIGFuZAorICAgICAgICAgICB0aHVzIHRoaXMgY2FuJ3QgYmUgcmVtb3ZlZCB1bmxlc3MgdGhlIG90aGVyIG1vZHVsZXMgYXJlCisgICAgICAgICAgIHJlbW92ZWQuICovCisKKwlpZiAoaGFuZGxlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGlzIGFjdHVhbGx5IGluaXRpYWxpemVkLCB0aGlzIGhhbmRsZXMKKwkgICBwcm9ibGVtcyB3aXRoIGluaXRpYWxpemF0aW9uIG9yZGVyLiAqLworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJcnYgPSBpcG1pX2luaXRfbXNnaGFuZGxlcigpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisKKwkJLyogVGhlIGluaXQgY29kZSBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBpZiBpdCB3YXMgdHVybmVkCisJCSAgIG9mZiwgYnV0IGl0IHdvbid0IGluaXRpYWxpemUuICBDaGVjayB0aGF0LiAqLworCQlpZiAoIWluaXRpYWxpemVkKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbmV3X3VzZXIgPSBrbWFsbG9jKHNpemVvZigqbmV3X3VzZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBuZXdfdXNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkb3duX3JlYWQoJmludGVyZmFjZXNfc2VtKTsKKwlpZiAoKGlmX251bSA+IE1BWF9JUE1JX0lOVEVSRkFDRVMpIHx8IGlwbWlfaW50ZXJmYWNlc1tpZl9udW1dID09IE5VTEwpCisJeworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2lmX251bV07CisKKwluZXdfdXNlci0+aGFuZGxlciA9IGhhbmRsZXI7CisJbmV3X3VzZXItPmhhbmRsZXJfZGF0YSA9IGhhbmRsZXJfZGF0YTsKKwluZXdfdXNlci0+aW50ZiA9IGludGY7CisJbmV3X3VzZXItPmdldHNfZXZlbnRzID0gMDsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoaW50Zi0+aGFuZGxlcnMtPm93bmVyKSkgeworCQlydiA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoaW50Zi0+aGFuZGxlcnMtPmluY191c2Vjb3VudCkgeworCQlydiA9IGludGYtPmhhbmRsZXJzLT5pbmNfdXNlY291bnQoaW50Zi0+c2VuZF9pbmZvKTsKKwkJaWYgKHJ2KSB7CisJCQltb2R1bGVfcHV0KGludGYtPmhhbmRsZXJzLT5vd25lcik7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmludGYtPnVzZXJzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZuZXdfdXNlci0+bGluaywgJmludGYtPnVzZXJzKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+dXNlcnNfbG9jaywgZmxhZ3MpOworCisgb3V0X3VubG9jazoJCisJaWYgKHJ2KSB7CisJCWtmcmVlKG5ld191c2VyKTsKKwl9IGVsc2UgeworCQkqdXNlciA9IG5ld191c2VyOworCX0KKworCXVwX3JlYWQoJmludGVyZmFjZXNfc2VtKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9kZXN0cm95X3VzZXJfbm9sb2NrKGlwbWlfdXNlcl90IHVzZXIpCit7CisJaW50ICAgICAgICAgICAgICBydiA9IC1FTk9ERVY7CisJaXBtaV91c2VyX3QgICAgICB0X3VzZXI7CisJc3RydWN0IGNtZF9yY3ZyICAqcmN2ciwgKnJjdnIyOworCWludCAgICAgICAgICAgICAgaTsKKwl1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisJLyogRmluZCB0aGUgdXNlciBhbmQgZGVsZXRlIHRoZW0gZnJvbSB0aGUgbGlzdC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRfdXNlciwgJih1c2VyLT5pbnRmLT51c2VycyksIGxpbmspIHsKKwkJaWYgKHRfdXNlciA9PSB1c2VyKSB7CisJCQlsaXN0X2RlbCgmdF91c2VyLT5saW5rKTsKKwkJCXJ2ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJ2KSB7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBSZW1vdmUgdGhlIHVzZXIgZnJvbSB0aGUgaW50ZXJmYWNlcyBzZXF1ZW5jZSB0YWJsZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHVzZXItPmludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCWZvciAoaT0wOyBpPElQTUlfSVBNQl9OVU1fU0VROyBpKyspIHsKKwkJaWYgKHVzZXItPmludGYtPnNlcV90YWJsZVtpXS5pbnVzZQorCQkgICAgJiYgKHVzZXItPmludGYtPnNlcV90YWJsZVtpXS5yZWN2X21zZy0+dXNlciA9PSB1c2VyKSkKKwkJeworCQkJdXNlci0+aW50Zi0+c2VxX3RhYmxlW2ldLmludXNlID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYodXNlci0+aW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwkvKiBSZW1vdmUgdGhlIHVzZXIgZnJvbSB0aGUgY29tbWFuZCByZWNlaXZlcidzIHRhYmxlLiAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmKHVzZXItPmludGYtPmNtZF9yY3ZyX2xvY2spLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjdnIsIHJjdnIyLCAmKHVzZXItPmludGYtPmNtZF9yY3ZycyksIGxpbmspIHsKKwkJaWYgKHJjdnItPnVzZXIgPT0gdXNlcikgeworCQkJbGlzdF9kZWwoJnJjdnItPmxpbmspOworCQkJa2ZyZWUocmN2cik7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJih1c2VyLT5pbnRmLT5jbWRfcmN2cl9sb2NrKSwgZmxhZ3MpOworCisJa2ZyZWUodXNlcik7CisKKyBvdXRfdW5sb2NrOgorCisJcmV0dXJuIHJ2OworfQorCitpbnQgaXBtaV9kZXN0cm95X3VzZXIoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlpbnQgICAgICAgICAgIHJ2OworCWlwbWlfc21pX3QgICAgaW50ZiA9IHVzZXItPmludGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRvd25fcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaW50Zi0+dXNlcnNfbG9jaywgZmxhZ3MpOworCXJ2ID0gaXBtaV9kZXN0cm95X3VzZXJfbm9sb2NrKHVzZXIpOworCWlmICghcnYpIHsKKwkJbW9kdWxlX3B1dChpbnRmLT5oYW5kbGVycy0+b3duZXIpOworCQlpZiAoaW50Zi0+aGFuZGxlcnMtPmRlY191c2Vjb3VudCkKKwkJCWludGYtPmhhbmRsZXJzLT5kZWNfdXNlY291bnQoaW50Zi0+c2VuZF9pbmZvKTsKKwl9CisJCQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT51c2Vyc19sb2NrLCBmbGFncyk7CisJdXBfcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCXJldHVybiBydjsKK30KKwordm9pZCBpcG1pX2dldF92ZXJzaW9uKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWFqb3IsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm1pbm9yKQoreworCSptYWpvciA9IHVzZXItPmludGYtPnZlcnNpb25fbWFqb3I7CisJKm1pbm9yID0gdXNlci0+aW50Zi0+dmVyc2lvbl9taW5vcjsKK30KKwordm9pZCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJCSB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCit7CisJdXNlci0+aW50Zi0+bXlfYWRkcmVzcyA9IGFkZHJlc3M7Cit9CisKK3Vuc2lnbmVkIGNoYXIgaXBtaV9nZXRfbXlfYWRkcmVzcyhpcG1pX3VzZXJfdCB1c2VyKQoreworCXJldHVybiB1c2VyLT5pbnRmLT5teV9hZGRyZXNzOworfQorCit2b2lkIGlwbWlfc2V0X215X0xVTihpcG1pX3VzZXJfdCAgIHVzZXIsCisJCSAgICAgdW5zaWduZWQgY2hhciBMVU4pCit7CisJdXNlci0+aW50Zi0+bXlfbHVuID0gTFVOICYgMHgzOworfQorCit1bnNpZ25lZCBjaGFyIGlwbWlfZ2V0X215X0xVTihpcG1pX3VzZXJfdCB1c2VyKQoreworCXJldHVybiB1c2VyLT5pbnRmLT5teV9sdW47Cit9CisKK2ludCBpcG1pX3NldF9nZXRzX2V2ZW50cyhpcG1pX3VzZXJfdCB1c2VyLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgKm1zZywgKm1zZzI7CisKKwlyZWFkX2xvY2soJih1c2VyLT5pbnRmLT51c2Vyc19sb2NrKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJih1c2VyLT5pbnRmLT5ldmVudHNfbG9jayksIGZsYWdzKTsKKwl1c2VyLT5nZXRzX2V2ZW50cyA9IHZhbDsKKworCWlmICh2YWwpIHsKKwkJLyogRGVsaXZlciBhbnkgcXVldWVkIGV2ZW50cy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJih1c2VyLT5pbnRmLT53YWl0aW5nX2V2ZW50cyksIGxpbmspIHsKKwkJCWxpc3RfZGVsKCZtc2ctPmxpbmspOworCQkJbXNnLT51c2VyID0gdXNlcjsKKwkJCWRlbGl2ZXJfcmVzcG9uc2UobXNnKTsKKwkJfQorCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYodXNlci0+aW50Zi0+ZXZlbnRzX2xvY2spLCBmbGFncyk7CisJcmVhZF91bmxvY2soJih1c2VyLT5pbnRmLT51c2Vyc19sb2NrKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlwbWlfcmVnaXN0ZXJfZm9yX2NtZChpcG1pX3VzZXJfdCAgIHVzZXIsCisJCQkgIHVuc2lnbmVkIGNoYXIgbmV0Zm4sCisJCQkgIHVuc2lnbmVkIGNoYXIgY21kKQoreworCXN0cnVjdCBjbWRfcmN2ciAgKmNtcDsKKwl1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCXN0cnVjdCBjbWRfcmN2ciAgKnJjdnI7CisJaW50ICAgICAgICAgICAgICBydiA9IDA7CisKKworCXJjdnIgPSBrbWFsbG9jKHNpemVvZigqcmN2ciksIEdGUF9LRVJORUwpOworCWlmICghIHJjdnIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVhZF9sb2NrKCYodXNlci0+aW50Zi0+dXNlcnNfbG9jaykpOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmKHVzZXItPmludGYtPmNtZF9yY3ZyX2xvY2spLCBmbGFncyk7CisJaWYgKHVzZXItPmludGYtPmFsbF9jbWRfcmN2ciAhPSBOVUxMKSB7CisJCXJ2ID0gLUVCVVNZOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBjb21tYW5kL25ldGZuIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbXAsICYodXNlci0+aW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQlpZiAoKGNtcC0+bmV0Zm4gPT0gbmV0Zm4pICYmIChjbXAtPmNtZCA9PSBjbWQpKSB7CisJCQlydiA9IC1FQlVTWTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCEgcnYpIHsKKwkJcmN2ci0+Y21kID0gY21kOworCQlyY3ZyLT5uZXRmbiA9IG5ldGZuOworCQlyY3ZyLT51c2VyID0gdXNlcjsKKwkJbGlzdF9hZGRfdGFpbCgmKHJjdnItPmxpbmspLCAmKHVzZXItPmludGYtPmNtZF9yY3ZycykpOworCX0KKyBvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCYodXNlci0+aW50Zi0+Y21kX3JjdnJfbG9jayksIGZsYWdzKTsKKwlyZWFkX3VubG9jaygmKHVzZXItPmludGYtPnVzZXJzX2xvY2spKTsKKworCWlmIChydikKKwkJa2ZyZWUocmN2cik7CisKKwlyZXR1cm4gcnY7Cit9CisKK2ludCBpcG1pX3VucmVnaXN0ZXJfZm9yX2NtZChpcG1pX3VzZXJfdCAgIHVzZXIsCisJCQkgICAgdW5zaWduZWQgY2hhciBuZXRmbiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCXN0cnVjdCBjbWRfcmN2ciAgKnJjdnI7CisJaW50ICAgICAgICAgICAgICBydiA9IC1FTk9FTlQ7CisKKwlyZWFkX2xvY2soJih1c2VyLT5pbnRmLT51c2Vyc19sb2NrKSk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCYodXNlci0+aW50Zi0+Y21kX3JjdnJfbG9jayksIGZsYWdzKTsKKwkvKiBNYWtlIHN1cmUgdGhlIGNvbW1hbmQvbmV0Zm4gaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYodXNlci0+aW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQlpZiAoKHJjdnItPm5ldGZuID09IG5ldGZuKSAmJiAocmN2ci0+Y21kID09IGNtZCkpIHsKKwkJCXJ2ID0gMDsKKwkJCWxpc3RfZGVsKCZyY3ZyLT5saW5rKTsKKwkJCWtmcmVlKHJjdnIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJih1c2VyLT5pbnRmLT5jbWRfcmN2cl9sb2NrKSwgZmxhZ3MpOworCXJlYWRfdW5sb2NrKCYodXNlci0+aW50Zi0+dXNlcnNfbG9jaykpOworCisJcmV0dXJuIHJ2OworfQorCit2b2lkIGlwbWlfdXNlcl9zZXRfcnVuX3RvX2NvbXBsZXRpb24oaXBtaV91c2VyX3QgdXNlciwgaW50IHZhbCkKK3sKKwl1c2VyLT5pbnRmLT5oYW5kbGVycy0+c2V0X3J1bl90b19jb21wbGV0aW9uKHVzZXItPmludGYtPnNlbmRfaW5mbywKKwkJCQkJCSAgICB2YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgoraXBtYl9jaGVja3N1bSh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNzdW0gPSAwOworCQorCWZvciAoOyBzaXplID4gMDsgc2l6ZS0tLCBkYXRhKyspCisJCWNzdW0gKz0gKmRhdGE7CisKKwlyZXR1cm4gLWNzdW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmb3JtYXRfaXBtYl9tc2coc3RydWN0IGlwbWlfc21pX21zZyAgICpzbWlfbXNnLAorCQkJCSAgIHN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgKm1zZywKKwkJCQkgICBzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKmlwbWJfYWRkciwKKwkJCQkgICBsb25nICAgICAgICAgICAgICAgICAgbXNnaWQsCisJCQkJICAgdW5zaWduZWQgY2hhciAgICAgICAgIGlwbWJfc2VxLAorCQkJCSAgIGludCAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCisJCQkJICAgdW5zaWduZWQgY2hhciAgICAgICAgIHNvdXJjZV9hZGRyZXNzLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgICAgICAgICBzb3VyY2VfbHVuKQoreworCWludCBpID0gYnJvYWRjYXN0OworCisJLyogRm9ybWF0IHRoZSBJUE1CIGhlYWRlciBkYXRhLiAqLworCXNtaV9tc2ctPmRhdGFbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwlzbWlfbXNnLT5kYXRhWzFdID0gSVBNSV9TRU5EX01TR19DTUQ7CisJc21pX21zZy0+ZGF0YVsyXSA9IGlwbWJfYWRkci0+Y2hhbm5lbDsKKwlpZiAoYnJvYWRjYXN0KQorCQlzbWlfbXNnLT5kYXRhWzNdID0gMDsKKwlzbWlfbXNnLT5kYXRhW2krM10gPSBpcG1iX2FkZHItPnNsYXZlX2FkZHI7CisJc21pX21zZy0+ZGF0YVtpKzRdID0gKG1zZy0+bmV0Zm4gPDwgMikgfCAoaXBtYl9hZGRyLT5sdW4gJiAweDMpOworCXNtaV9tc2ctPmRhdGFbaSs1XSA9IGlwbWJfY2hlY2tzdW0oJihzbWlfbXNnLT5kYXRhW2krM10pLCAyKTsKKwlzbWlfbXNnLT5kYXRhW2krNl0gPSBzb3VyY2VfYWRkcmVzczsKKwlzbWlfbXNnLT5kYXRhW2krN10gPSAoaXBtYl9zZXEgPDwgMikgfCBzb3VyY2VfbHVuOworCXNtaV9tc2ctPmRhdGFbaSs4XSA9IG1zZy0+Y21kOworCisJLyogTm93IHRhY2sgb24gdGhlIGRhdGEgdG8gdGhlIG1lc3NhZ2UuICovCisJaWYgKG1zZy0+ZGF0YV9sZW4gPiAwKQorCQltZW1jcHkoJihzbWlfbXNnLT5kYXRhW2krOV0pLCBtc2ctPmRhdGEsCisJCSAgICAgICBtc2ctPmRhdGFfbGVuKTsKKwlzbWlfbXNnLT5kYXRhX3NpemUgPSBtc2ctPmRhdGFfbGVuICsgOTsKKworCS8qIE5vdyBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGFuZCB0YWNrIGl0IG9uLiAqLworCXNtaV9tc2ctPmRhdGFbaStzbWlfbXNnLT5kYXRhX3NpemVdCisJCT0gaXBtYl9jaGVja3N1bSgmKHNtaV9tc2ctPmRhdGFbaSs2XSksCisJCQkJc21pX21zZy0+ZGF0YV9zaXplLTYpOworCisJLyogQWRkIG9uIHRoZSBjaGVja3N1bSBzaXplIGFuZCB0aGUgb2Zmc2V0IGZyb20gdGhlCisJICAgYnJvYWRjYXN0LiAqLworCXNtaV9tc2ctPmRhdGFfc2l6ZSArPSAxICsgaTsKKworCXNtaV9tc2ctPm1zZ2lkID0gbXNnaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmb3JtYXRfbGFuX21zZyhzdHJ1Y3QgaXBtaV9zbWlfbXNnICAgKnNtaV9tc2csCisJCQkJICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICptc2csCisJCQkJICBzdHJ1Y3QgaXBtaV9sYW5fYWRkciAgKmxhbl9hZGRyLAorCQkJCSAgbG9uZyAgICAgICAgICAgICAgICAgIG1zZ2lkLAorCQkJCSAgdW5zaWduZWQgY2hhciAgICAgICAgIGlwbWJfc2VxLAorCQkJCSAgdW5zaWduZWQgY2hhciAgICAgICAgIHNvdXJjZV9sdW4pCit7CisJLyogRm9ybWF0IHRoZSBJUE1CIGhlYWRlciBkYXRhLiAqLworCXNtaV9tc2ctPmRhdGFbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwlzbWlfbXNnLT5kYXRhWzFdID0gSVBNSV9TRU5EX01TR19DTUQ7CisJc21pX21zZy0+ZGF0YVsyXSA9IGxhbl9hZGRyLT5jaGFubmVsOworCXNtaV9tc2ctPmRhdGFbM10gPSBsYW5fYWRkci0+c2Vzc2lvbl9oYW5kbGU7CisJc21pX21zZy0+ZGF0YVs0XSA9IGxhbl9hZGRyLT5yZW1vdGVfU1dJRDsKKwlzbWlfbXNnLT5kYXRhWzVdID0gKG1zZy0+bmV0Zm4gPDwgMikgfCAobGFuX2FkZHItPmx1biAmIDB4Myk7CisJc21pX21zZy0+ZGF0YVs2XSA9IGlwbWJfY2hlY2tzdW0oJihzbWlfbXNnLT5kYXRhWzRdKSwgMik7CisJc21pX21zZy0+ZGF0YVs3XSA9IGxhbl9hZGRyLT5sb2NhbF9TV0lEOworCXNtaV9tc2ctPmRhdGFbOF0gPSAoaXBtYl9zZXEgPDwgMikgfCBzb3VyY2VfbHVuOworCXNtaV9tc2ctPmRhdGFbOV0gPSBtc2ctPmNtZDsKKworCS8qIE5vdyB0YWNrIG9uIHRoZSBkYXRhIHRvIHRoZSBtZXNzYWdlLiAqLworCWlmIChtc2ctPmRhdGFfbGVuID4gMCkKKwkJbWVtY3B5KCYoc21pX21zZy0+ZGF0YVsxMF0pLCBtc2ctPmRhdGEsCisJCSAgICAgICBtc2ctPmRhdGFfbGVuKTsKKwlzbWlfbXNnLT5kYXRhX3NpemUgPSBtc2ctPmRhdGFfbGVuICsgMTA7CisKKwkvKiBOb3cgY2FsY3VsYXRlIHRoZSBjaGVja3N1bSBhbmQgdGFjayBpdCBvbi4gKi8KKwlzbWlfbXNnLT5kYXRhW3NtaV9tc2ctPmRhdGFfc2l6ZV0KKwkJPSBpcG1iX2NoZWNrc3VtKCYoc21pX21zZy0+ZGF0YVs3XSksCisJCQkJc21pX21zZy0+ZGF0YV9zaXplLTcpOworCisJLyogQWRkIG9uIHRoZSBjaGVja3N1bSBzaXplIGFuZCB0aGUgb2Zmc2V0IGZyb20gdGhlCisJICAgYnJvYWRjYXN0LiAqLworCXNtaV9tc2ctPmRhdGFfc2l6ZSArPSAxOworCisJc21pX21zZy0+bXNnaWQgPSBtc2dpZDsKK30KKworLyogU2VwYXJhdGUgZnJvbSBpcG1pX3JlcXVlc3Qgc28gdGhhdCB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRvIGJlCisgICBzdXBwbGllZCBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgKG1haW5seSBhdCBwYW5pYyB0aW1lKS4gIElmCisgICBtZXNzYWdlcyBhcmUgc3VwcGxpZWQsIHRoZXkgd2lsbCBiZSBmcmVlZCwgZXZlbiBpZiBhbiBlcnJvcgorICAgb2NjdXJzLiAqLworc3RhdGljIGlubGluZSBpbnQgaV9pcG1pX3JlcXVlc3QoaXBtaV91c2VyX3QgICAgICAgICAgdXNlciwKKwkJCQkgaXBtaV9zbWlfdCAgICAgICAgICAgaW50ZiwKKwkJCQkgc3RydWN0IGlwbWlfYWRkciAgICAgKmFkZHIsCisJCQkJIGxvbmcgICAgICAgICAgICAgICAgIG1zZ2lkLAorCQkJCSBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICptc2csCisJCQkJIHZvaWQgICAgICAgICAgICAgICAgICp1c2VyX21zZ19kYXRhLAorCQkJCSB2b2lkICAgICAgICAgICAgICAgICAqc3VwcGxpZWRfc21pLAorCQkJCSBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqc3VwcGxpZWRfcmVjdiwKKwkJCQkgaW50ICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisJCQkJIHVuc2lnbmVkIGNoYXIgICAgICAgIHNvdXJjZV9hZGRyZXNzLAorCQkJCSB1bnNpZ25lZCBjaGFyICAgICAgICBzb3VyY2VfbHVuLAorCQkJCSBpbnQgICAgICAgICAgICAgICAgICByZXRyaWVzLAorCQkJCSB1bnNpZ25lZCBpbnQgICAgICAgICByZXRyeV90aW1lX21zKQoreworCWludCAgICAgICAgICAgICAgICAgIHJ2ID0gMDsKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICAqc21pX21zZzsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcmVjdl9tc2c7CisJdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7CisKKworCWlmIChzdXBwbGllZF9yZWN2KSB7CisJCXJlY3ZfbXNnID0gc3VwcGxpZWRfcmVjdjsKKwl9IGVsc2UgeworCQlyZWN2X21zZyA9IGlwbWlfYWxsb2NfcmVjdl9tc2coKTsKKwkJaWYgKHJlY3ZfbXNnID09IE5VTEwpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJlY3ZfbXNnLT51c2VyX21zZ19kYXRhID0gdXNlcl9tc2dfZGF0YTsKKworCWlmIChzdXBwbGllZF9zbWkpIHsKKwkJc21pX21zZyA9IChzdHJ1Y3QgaXBtaV9zbWlfbXNnICopIHN1cHBsaWVkX3NtaTsKKwl9IGVsc2UgeworCQlzbWlfbXNnID0gaXBtaV9hbGxvY19zbWlfbXNnKCk7CisJCWlmIChzbWlfbXNnID09IE5VTEwpIHsKKwkJCWlwbWlfZnJlZV9yZWN2X21zZyhyZWN2X21zZyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXJlY3ZfbXNnLT51c2VyID0gdXNlcjsKKwlyZWN2X21zZy0+bXNnaWQgPSBtc2dpZDsKKwkvKiBTdG9yZSB0aGUgbWVzc2FnZSB0byBzZW5kIGluIHRoZSByZWNlaXZlIG1lc3NhZ2Ugc28gdGltZW91dAorCSAgIHJlc3BvbnNlcyBjYW4gZ2V0IHRoZSBwcm9wZXIgcmVzcG9uc2UgZGF0YS4gKi8KKwlyZWN2X21zZy0+bXNnID0gKm1zZzsKKworCWlmIChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRSkgeworCQlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKnNtaV9hZGRyOworCisJCWlmIChtc2ctPm5ldGZuICYgMSkgeworCQkJLyogUmVzcG9uc2VzIGFyZSBub3QgYWxsb3dlZCB0byB0aGUgU01JLiAqLworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJc21pX2FkZHIgPSAoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICopIGFkZHI7CisJCWlmIChzbWlfYWRkci0+bHVuID4gMykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCW1lbWNweSgmcmVjdl9tc2ctPmFkZHIsIHNtaV9hZGRyLCBzaXplb2YoKnNtaV9hZGRyKSk7CisKKwkJaWYgKChtc2ctPm5ldGZuID09IElQTUlfTkVURk5fQVBQX1JFUVVFU1QpCisJCSAgICAmJiAoKG1zZy0+Y21kID09IElQTUlfU0VORF9NU0dfQ01EKQorCQkJfHwgKG1zZy0+Y21kID09IElQTUlfR0VUX01TR19DTUQpCisJCQl8fCAobXNnLT5jbWQgPT0gSVBNSV9SRUFEX0VWRU5UX01TR19CVUZGRVJfQ01EKSkpCisJCXsKKwkJCS8qIFdlIGRvbid0IGxldCB0aGUgdXNlciBkbyB0aGVzZSwgc2luY2Ugd2UgbWFuYWdlCisJCQkgICB0aGUgc2VxdWVuY2UgbnVtYmVycy4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlpZiAoKG1zZy0+ZGF0YV9sZW4gKyAyKSA+IElQTUlfTUFYX01TR19MRU5HVEgpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FTVNHU0laRTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCXNtaV9tc2ctPmRhdGFbMF0gPSAobXNnLT5uZXRmbiA8PCAyKSB8IChzbWlfYWRkci0+bHVuICYgMHgzKTsKKwkJc21pX21zZy0+ZGF0YVsxXSA9IG1zZy0+Y21kOworCQlzbWlfbXNnLT5tc2dpZCA9IG1zZ2lkOworCQlzbWlfbXNnLT51c2VyX2RhdGEgPSByZWN2X21zZzsKKwkJaWYgKG1zZy0+ZGF0YV9sZW4gPiAwKQorCQkJbWVtY3B5KCYoc21pX21zZy0+ZGF0YVsyXSksIG1zZy0+ZGF0YSwgbXNnLT5kYXRhX2xlbik7CisJCXNtaV9tc2ctPmRhdGFfc2l6ZSA9IG1zZy0+ZGF0YV9sZW4gKyAyOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPnNlbnRfbG9jYWxfY29tbWFuZHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJfSBlbHNlIGlmICgoYWRkci0+YWRkcl90eXBlID09IElQTUlfSVBNQl9BRERSX1RZUEUpCisJCSAgIHx8IChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUpKQorCXsKKwkJc3RydWN0IGlwbWlfaXBtYl9hZGRyICppcG1iX2FkZHI7CisJCXVuc2lnbmVkIGNoYXIgICAgICAgICBpcG1iX3NlcTsKKwkJbG9uZyAgICAgICAgICAgICAgICAgIHNlcWlkOworCQlpbnQgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ID0gMDsKKworCQlpZiAoYWRkci0+Y2hhbm5lbCA+IElQTUlfTlVNX0NIQU5ORUxTKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJaWYgKGludGYtPmNoYW5uZWxzW2FkZHItPmNoYW5uZWxdLm1lZGl1bQorCQkgICAgIT0gSVBNSV9DSEFOTkVMX01FRElVTV9JUE1CKQorCQl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJaWYgKHJldHJpZXMgPCAwKSB7CisJCSAgICBpZiAoYWRkci0+YWRkcl90eXBlID09IElQTUlfSVBNQl9CUk9BRENBU1RfQUREUl9UWVBFKQorCQkJcmV0cmllcyA9IDA7IC8qIERvbid0IHJldHJ5IGJyb2FkY2FzdHMuICovCisJCSAgICBlbHNlCisJCQlyZXRyaWVzID0gNDsKKwkJfQorCQlpZiAoYWRkci0+YWRkcl90eXBlID09IElQTUlfSVBNQl9CUk9BRENBU1RfQUREUl9UWVBFKSB7CisJCSAgICAvKiBCcm9hZGNhc3RzIGFkZCBhIHplcm8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkJICAgICAgIG1lc3NhZ2UsIGJ1dCBvdGhlcndpc2UgaXMgdGhlIHNhbWUgYXMgYW4gSVBNQgorCQkgICAgICAgYWRkcmVzcy4gKi8KKwkJICAgIGFkZHItPmFkZHJfdHlwZSA9IElQTUlfSVBNQl9BRERSX1RZUEU7CisJCSAgICBicm9hZGNhc3QgPSAxOworCQl9CisKKworCQkvKiBEZWZhdWx0IHRvIDEgc2Vjb25kIHJldHJpZXMuICovCisJCWlmIChyZXRyeV90aW1lX21zID09IDApCisJCSAgICByZXRyeV90aW1lX21zID0gMTAwMDsKKworCQkvKiA5IGZvciB0aGUgaGVhZGVyIGFuZCAxIGZvciB0aGUgY2hlY2tzdW0sIHBsdXMKKyAgICAgICAgICAgICAgICAgICBwb3NzaWJseSBvbmUgZm9yIHRoZSBicm9hZGNhc3QuICovCisJCWlmICgobXNnLT5kYXRhX2xlbiArIDEwICsgYnJvYWRjYXN0KSA+IElQTUlfTUFYX01TR19MRU5HVEgpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FTVNHU0laRTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCWlwbWJfYWRkciA9IChzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKikgYWRkcjsKKwkJaWYgKGlwbWJfYWRkci0+bHVuID4gMykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCW1lbWNweSgmcmVjdl9tc2ctPmFkZHIsIGlwbWJfYWRkciwgc2l6ZW9mKCppcG1iX2FkZHIpKTsKKworCQlpZiAocmVjdl9tc2ctPm1zZy5uZXRmbiAmIDB4MSkgeworCQkJLyogSXQncyBhIHJlc3BvbnNlLCBzbyB1c2UgdGhlIHVzZXIncyBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtc2dpZC4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaXBtYl9yZXNwb25zZXMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJZm9ybWF0X2lwbWJfbXNnKHNtaV9tc2csIG1zZywgaXBtYl9hZGRyLCBtc2dpZCwKKwkJCQkJbXNnaWQsIGJyb2FkY2FzdCwKKwkJCQkJc291cmNlX2FkZHJlc3MsIHNvdXJjZV9sdW4pOworCisJCQkvKiBTYXZlIHRoZSByZWNlaXZlIG1lc3NhZ2Ugc28gd2UgY2FuIHVzZSBpdAorCQkJICAgdG8gZGVsaXZlciB0aGUgcmVzcG9uc2UuICovCisJCQlzbWlfbXNnLT51c2VyX2RhdGEgPSByZWN2X21zZzsKKwkJfSBlbHNlIHsKKwkJCS8qIEl0J3MgYSBjb21tYW5kLCBzbyBnZXQgYSBzZXF1ZW5jZSBmb3IgaXQuICovCisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwkJCXNwaW5fbG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKwkJCWludGYtPnNlbnRfaXBtYl9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2soJmludGYtPmNvdW50ZXJfbG9jayk7CisKKwkJCS8qIENyZWF0ZSBhIHNlcXVlbmNlIG51bWJlciB3aXRoIGEgMSBzZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgYW5kIDQgcmV0cmllcy4gKi8KKwkJCXJ2ID0gaW50Zl9uZXh0X3NlcShpbnRmLAorCQkJCQkgICByZWN2X21zZywKKwkJCQkJICAgcmV0cnlfdGltZV9tcywKKwkJCQkJICAgcmV0cmllcywKKwkJCQkJICAgYnJvYWRjYXN0LAorCQkJCQkgICAmaXBtYl9zZXEsCisJCQkJCSAgICZzZXFpZCk7CisJCQlpZiAocnYpIHsKKwkJCQkvKiBXZSBoYXZlIHVzZWQgdXAgYWxsIHRoZSBzZXF1ZW5jZSBudW1iZXJzLAorCQkJCSAgIHByb2JhYmx5LCBzbyBhYm9ydC4gKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCQlnb3RvIG91dF9lcnI7CisJCQl9CisKKwkJCS8qIFN0b3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHdoZW4gdGhlIHNlbmQgbWVzc2FnZSByZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXMgYmFjayB3ZSBjYW4gc3RhcnQgdGhlIHRpbWVyLiAqLworCQkJZm9ybWF0X2lwbWJfbXNnKHNtaV9tc2csIG1zZywgaXBtYl9hZGRyLAorCQkJCQlTVE9SRV9TRVFfSU5fTVNHSUQoaXBtYl9zZXEsIHNlcWlkKSwKKwkJCQkJaXBtYl9zZXEsIGJyb2FkY2FzdCwKKwkJCQkJc291cmNlX2FkZHJlc3MsIHNvdXJjZV9sdW4pOworCisJCQkvKiBDb3B5IHRoZSBtZXNzYWdlIGludG8gdGhlIHJlY3YgbWVzc2FnZSBkYXRhLCBzbyB3ZQorCQkJICAgY2FuIHJldHJhbnNtaXQgaXQgbGF0ZXIgaWYgbmVjZXNzYXJ5LiAqLworCQkJbWVtY3B5KHJlY3ZfbXNnLT5tc2dfZGF0YSwgc21pX21zZy0+ZGF0YSwKKwkJCSAgICAgICBzbWlfbXNnLT5kYXRhX3NpemUpOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IHNtaV9tc2ctPmRhdGFfc2l6ZTsKKworCQkJLyogV2UgZG9uJ3QgdW5sb2NrIHVudGlsIGhlcmUsIGJlY2F1c2Ugd2UgbmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29weSB0aGUgY29tcGxldGVkIG1lc3NhZ2UgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfbXNnIGJlZm9yZSB3ZSByZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCByYWNlIGNvbmRpdGlvbnMgbWF5IGJpdGUgdXMuICBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93IHRoYXQncyBwcmV0dHkgcGFyYW5vaWQsIGJ1dCBJIHByZWZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29ycmVjdC4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKwkJfQorCX0gZWxzZSBpZiAoYWRkci0+YWRkcl90eXBlID09IElQTUlfTEFOX0FERFJfVFlQRSkgeworCQlzdHJ1Y3QgaXBtaV9sYW5fYWRkciAgKmxhbl9hZGRyOworCQl1bnNpZ25lZCBjaGFyICAgICAgICAgaXBtYl9zZXE7CisJCWxvbmcgICAgICAgICAgICAgICAgICBzZXFpZDsKKworCQlpZiAoYWRkci0+Y2hhbm5lbCA+IElQTUlfTlVNX0NIQU5ORUxTKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJaWYgKChpbnRmLT5jaGFubmVsc1thZGRyLT5jaGFubmVsXS5tZWRpdW0KKwkJICAgICE9IElQTUlfQ0hBTk5FTF9NRURJVU1fODAyM0xBTikKKwkJICAgICYmIChpbnRmLT5jaGFubmVsc1thZGRyLT5jaGFubmVsXS5tZWRpdW0KKwkJCSE9IElQTUlfQ0hBTk5FTF9NRURJVU1fQVNZTkMpKQorCQl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJcmV0cmllcyA9IDQ7CisKKwkJLyogRGVmYXVsdCB0byAxIHNlY29uZCByZXRyaWVzLiAqLworCQlpZiAocmV0cnlfdGltZV9tcyA9PSAwKQorCQkgICAgcmV0cnlfdGltZV9tcyA9IDEwMDA7CisKKwkJLyogMTEgZm9yIHRoZSBoZWFkZXIgYW5kIDEgZm9yIHRoZSBjaGVja3N1bS4gKi8KKwkJaWYgKChtc2ctPmRhdGFfbGVuICsgMTIpID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gLUVNU0dTSVpFOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJbGFuX2FkZHIgPSAoc3RydWN0IGlwbWlfbGFuX2FkZHIgKikgYWRkcjsKKwkJaWYgKGxhbl9hZGRyLT5sdW4gPiAzKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJbWVtY3B5KCZyZWN2X21zZy0+YWRkciwgbGFuX2FkZHIsIHNpemVvZigqbGFuX2FkZHIpKTsKKworCQlpZiAocmVjdl9tc2ctPm1zZy5uZXRmbiAmIDB4MSkgeworCQkJLyogSXQncyBhIHJlc3BvbnNlLCBzbyB1c2UgdGhlIHVzZXIncyBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtc2dpZC4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfbGFuX3Jlc3BvbnNlcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlmb3JtYXRfbGFuX21zZyhzbWlfbXNnLCBtc2csIGxhbl9hZGRyLCBtc2dpZCwKKwkJCQkgICAgICAgbXNnaWQsIHNvdXJjZV9sdW4pOworCisJCQkvKiBTYXZlIHRoZSByZWNlaXZlIG1lc3NhZ2Ugc28gd2UgY2FuIHVzZSBpdAorCQkJICAgdG8gZGVsaXZlciB0aGUgcmVzcG9uc2UuICovCisJCQlzbWlfbXNnLT51c2VyX2RhdGEgPSByZWN2X21zZzsKKwkJfSBlbHNlIHsKKwkJCS8qIEl0J3MgYSBjb21tYW5kLCBzbyBnZXQgYSBzZXF1ZW5jZSBmb3IgaXQuICovCisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwkJCXNwaW5fbG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKwkJCWludGYtPnNlbnRfbGFuX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKworCQkJLyogQ3JlYXRlIGEgc2VxdWVuY2UgbnVtYmVyIHdpdGggYSAxIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCBhbmQgNCByZXRyaWVzLiAqLworCQkJcnYgPSBpbnRmX25leHRfc2VxKGludGYsCisJCQkJCSAgIHJlY3ZfbXNnLAorCQkJCQkgICByZXRyeV90aW1lX21zLAorCQkJCQkgICByZXRyaWVzLAorCQkJCQkgICAwLAorCQkJCQkgICAmaXBtYl9zZXEsCisJCQkJCSAgICZzZXFpZCk7CisJCQlpZiAocnYpIHsKKwkJCQkvKiBXZSBoYXZlIHVzZWQgdXAgYWxsIHRoZSBzZXF1ZW5jZSBudW1iZXJzLAorCQkJCSAgIHByb2JhYmx5LCBzbyBhYm9ydC4gKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCQlnb3RvIG91dF9lcnI7CisJCQl9CisKKwkJCS8qIFN0b3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHdoZW4gdGhlIHNlbmQgbWVzc2FnZSByZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXMgYmFjayB3ZSBjYW4gc3RhcnQgdGhlIHRpbWVyLiAqLworCQkJZm9ybWF0X2xhbl9tc2coc21pX21zZywgbXNnLCBsYW5fYWRkciwKKwkJCQkgICAgICAgU1RPUkVfU0VRX0lOX01TR0lEKGlwbWJfc2VxLCBzZXFpZCksCisJCQkJICAgICAgIGlwbWJfc2VxLCBzb3VyY2VfbHVuKTsKKworCQkJLyogQ29weSB0aGUgbWVzc2FnZSBpbnRvIHRoZSByZWN2IG1lc3NhZ2UgZGF0YSwgc28gd2UKKwkJCSAgIGNhbiByZXRyYW5zbWl0IGl0IGxhdGVyIGlmIG5lY2Vzc2FyeS4gKi8KKwkJCW1lbWNweShyZWN2X21zZy0+bXNnX2RhdGEsIHNtaV9tc2ctPmRhdGEsCisJCQkgICAgICAgc21pX21zZy0+ZGF0YV9zaXplKTsKKwkJCXJlY3ZfbXNnLT5tc2cuZGF0YSA9IHJlY3ZfbXNnLT5tc2dfZGF0YTsKKwkJCXJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4gPSBzbWlfbXNnLT5kYXRhX3NpemU7CisKKwkJCS8qIFdlIGRvbid0IHVubG9jayB1bnRpbCBoZXJlLCBiZWNhdXNlIHdlIG5lZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcHkgdGhlIGNvbXBsZXRlZCBtZXNzYWdlIGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2X21zZyBiZWZvcmUgd2UgcmVsZWFzZSB0aGUgbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgcmFjZSBjb25kaXRpb25zIG1heSBiaXRlIHVzLiAgSQorICAgICAgICAgICAgICAgICAgICAgICAgICAga25vdyB0aGF0J3MgcHJldHR5IHBhcmFub2lkLCBidXQgSSBwcmVmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvcnJlY3QuICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisJCX0KKwl9IGVsc2UgeworCSAgICAvKiBVbmtub3duIGFkZHJlc3MgdHlwZS4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOworCX0KKworI2lmZGVmIERFQlVHX01TR0lORworCXsKKwkJaW50IG07CisJCWZvciAobT0wOyBtPHNtaV9tc2ctPmRhdGFfc2l6ZTsgbSsrKQorCQkJcHJpbnRrKCIgJTIuMngiLCBzbWlfbXNnLT5kYXRhW21dKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCWludGYtPmhhbmRsZXJzLT5zZW5kZXIoaW50Zi0+c2VuZF9pbmZvLCBzbWlfbXNnLCBwcmlvcml0eSk7CisKKwlyZXR1cm4gMDsKKworIG91dF9lcnI6CisJaXBtaV9mcmVlX3NtaV9tc2coc21pX21zZyk7CisJaXBtaV9mcmVlX3JlY3ZfbXNnKHJlY3ZfbXNnKTsKKwlyZXR1cm4gcnY7Cit9CisKK2ludCBpcG1pX3JlcXVlc3Rfc2V0dGltZShpcG1pX3VzZXJfdCAgICAgIHVzZXIsCisJCQkgc3RydWN0IGlwbWlfYWRkciAqYWRkciwKKwkJCSBsb25nICAgICAgICAgICAgIG1zZ2lkLAorCQkJIHN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICptc2csCisJCQkgdm9pZCAgICAgICAgICAgICAqdXNlcl9tc2dfZGF0YSwKKwkJCSBpbnQgICAgICAgICAgICAgIHByaW9yaXR5LAorCQkJIGludCAgICAgICAgICAgICAgcmV0cmllcywKKwkJCSB1bnNpZ25lZCBpbnQgICAgIHJldHJ5X3RpbWVfbXMpCit7CisJcmV0dXJuIGlfaXBtaV9yZXF1ZXN0KHVzZXIsCisJCQkgICAgICB1c2VyLT5pbnRmLAorCQkJICAgICAgYWRkciwKKwkJCSAgICAgIG1zZ2lkLAorCQkJICAgICAgbXNnLAorCQkJICAgICAgdXNlcl9tc2dfZGF0YSwKKwkJCSAgICAgIE5VTEwsIE5VTEwsCisJCQkgICAgICBwcmlvcml0eSwKKwkJCSAgICAgIHVzZXItPmludGYtPm15X2FkZHJlc3MsCisJCQkgICAgICB1c2VyLT5pbnRmLT5teV9sdW4sCisJCQkgICAgICByZXRyaWVzLAorCQkJICAgICAgcmV0cnlfdGltZV9tcyk7Cit9CisKK2ludCBpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3MoaXBtaV91c2VyX3QgICAgICAgICAgdXNlciwKKwkJCSAgICAgc3RydWN0IGlwbWlfYWRkciAgICAgKmFkZHIsCisJCQkgICAgIGxvbmcgICAgICAgICAgICAgICAgIG1zZ2lkLAorCQkJICAgICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICptc2csCisJCQkgICAgIHZvaWQgICAgICAgICAgICAgICAgICp1c2VyX21zZ19kYXRhLAorCQkJICAgICB2b2lkICAgICAgICAgICAgICAgICAqc3VwcGxpZWRfc21pLAorCQkJICAgICBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqc3VwcGxpZWRfcmVjdiwKKwkJCSAgICAgaW50ICAgICAgICAgICAgICAgICAgcHJpb3JpdHkpCit7CisJcmV0dXJuIGlfaXBtaV9yZXF1ZXN0KHVzZXIsCisJCQkgICAgICB1c2VyLT5pbnRmLAorCQkJICAgICAgYWRkciwKKwkJCSAgICAgIG1zZ2lkLAorCQkJICAgICAgbXNnLAorCQkJICAgICAgdXNlcl9tc2dfZGF0YSwKKwkJCSAgICAgIHN1cHBsaWVkX3NtaSwKKwkJCSAgICAgIHN1cHBsaWVkX3JlY3YsCisJCQkgICAgICBwcmlvcml0eSwKKwkJCSAgICAgIHVzZXItPmludGYtPm15X2FkZHJlc3MsCisJCQkgICAgICB1c2VyLT5pbnRmLT5teV9sdW4sCisJCQkgICAgICAtMSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaXBtYl9maWxlX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CisJaXBtaV9zbWlfdCBpbnRmID0gZGF0YTsKKworCXJldHVybiBzcHJpbnRmKG91dCwgIiV4XG4iLCBpbnRmLT5teV9hZGRyZXNzKTsKK30KKworc3RhdGljIGludCB2ZXJzaW9uX2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOworCWlwbWlfc21pX3QgaW50ZiA9IGRhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihvdXQsICIlZC4lZFxuIiwKKwkJICAgICAgIGludGYtPnZlcnNpb25fbWFqb3IsIGludGYtPnZlcnNpb25fbWlub3IpOworfQorCitzdGF0aWMgaW50IHN0YXRfZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOworCWlwbWlfc21pX3QgaW50ZiA9IGRhdGE7CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW50X2ludmFsaWRfY29tbWFuZHM6ICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW50X2xvY2FsX2NvbW1hbmRzOiAgICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+c2VudF9sb2NhbF9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaGFuZGxlZF9sb2NhbF9yZXNwb25zZXM6ICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ1bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzOiAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+dW5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2VudF9pcG1iX2NvbW1hbmRzOiAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnNlbnRfaXBtYl9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2VudF9pcG1iX2NvbW1hbmRfZXJyczogICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnNlbnRfaXBtYl9jb21tYW5kX2VycnMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInJldHJhbnNtaXR0ZWRfaXBtYl9jb21tYW5kczogJWRcbiIsCisJCSAgICAgICBpbnRmLT5yZXRyYW5zbWl0dGVkX2lwbWJfY29tbWFuZHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInRpbWVkX291dF9pcG1iX2NvbW1hbmRzOiAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT50aW1lZF9vdXRfaXBtYl9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidGltZWRfb3V0X2lwbWJfYnJvYWRjYXN0czogICAlZFxuIiwKKwkJICAgICAgIGludGYtPnRpbWVkX291dF9pcG1iX2Jyb2FkY2FzdHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInNlbnRfaXBtYl9yZXNwb25zZXM6ICAgICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5zZW50X2lwbWJfcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJoYW5kbGVkX2lwbWJfcmVzcG9uc2VzOiAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aGFuZGxlZF9pcG1iX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaW52YWxpZF9pcG1iX3Jlc3BvbnNlczogICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmludmFsaWRfaXBtYl9yZXNwb25zZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInVuaGFuZGxlZF9pcG1iX3Jlc3BvbnNlczogICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT51bmhhbmRsZWRfaXBtYl9yZXNwb25zZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInNlbnRfbGFuX2NvbW1hbmRzOiAgICAgICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5zZW50X2xhbl9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2VudF9sYW5fY29tbWFuZF9lcnJzOiAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnNlbnRfbGFuX2NvbW1hbmRfZXJycyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAicmV0cmFuc21pdHRlZF9sYW5fY29tbWFuZHM6ICAlZFxuIiwKKwkJICAgICAgIGludGYtPnJldHJhbnNtaXR0ZWRfbGFuX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ0aW1lZF9vdXRfbGFuX2NvbW1hbmRzOiAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+dGltZWRfb3V0X2xhbl9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2VudF9sYW5fcmVzcG9uc2VzOiAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnNlbnRfbGFuX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaGFuZGxlZF9sYW5fcmVzcG9uc2VzOiAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmhhbmRsZWRfbGFuX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaW52YWxpZF9sYW5fcmVzcG9uc2VzOiAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmludmFsaWRfbGFuX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidW5oYW5kbGVkX2xhbl9yZXNwb25zZXM6ICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnVuaGFuZGxlZF9sYW5fcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJoYW5kbGVkX2NvbW1hbmRzOiAgICAgICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aGFuZGxlZF9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaW52YWxpZF9jb21tYW5kczogICAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmludmFsaWRfY29tbWFuZHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInVuaGFuZGxlZF9jb21tYW5kczogICAgICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT51bmhhbmRsZWRfY29tbWFuZHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImludmFsaWRfZXZlbnRzOiAgICAgICAgICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5pbnZhbGlkX2V2ZW50cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZXZlbnRzOiAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmV2ZW50cyk7CisKKwlyZXR1cm4gKG91dCAtICgoY2hhciAqKSBwYWdlKSk7Cit9CisKK2ludCBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShpcG1pX3NtaV90IHNtaSwgY2hhciAqbmFtZSwKKwkJCSAgICByZWFkX3Byb2NfdCAqcmVhZF9wcm9jLCB3cml0ZV9wcm9jX3QgKndyaXRlX3Byb2MsCisJCQkgICAgdm9pZCAqZGF0YSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICAqZmlsZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgIHJ2ID0gMDsKKwlzdHJ1Y3QgaXBtaV9wcm9jX2VudHJ5ICplbnRyeTsKKworCS8qIENyZWF0ZSBhIGxpc3QgZWxlbWVudC4gKi8KKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCWVudHJ5LT5uYW1lID0ga21hbGxvYyhzdHJsZW4obmFtZSkrMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyeS0+bmFtZSkgeworCQlrZnJlZShlbnRyeSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzdHJjcHkoZW50cnktPm5hbWUsIG5hbWUpOworCisJZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIDAsIHNtaS0+cHJvY19kaXIpOworCWlmICghZmlsZSkgeworCQlrZnJlZShlbnRyeS0+bmFtZSk7CisJCWtmcmVlKGVudHJ5KTsKKwkJcnYgPSAtRU5PTUVNOworCX0gZWxzZSB7CisJCWZpbGUtPm5saW5rID0gMTsKKwkJZmlsZS0+ZGF0YSA9IGRhdGE7CisJCWZpbGUtPnJlYWRfcHJvYyA9IHJlYWRfcHJvYzsKKwkJZmlsZS0+d3JpdGVfcHJvYyA9IHdyaXRlX3Byb2M7CisJCWZpbGUtPm93bmVyID0gb3duZXI7CisKKwkJLyogU3RpY2sgaXQgb24gdGhlIGxpc3QuICovCisJCWVudHJ5LT5uZXh0ID0gc21pLT5wcm9jX2VudHJpZXM7CisJCXNtaS0+cHJvY19lbnRyaWVzID0gZW50cnk7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGFkZF9wcm9jX2VudHJpZXMoaXBtaV9zbWlfdCBzbWksIGludCBudW0pCit7CisJaW50IHJ2ID0gMDsKKworCXNwcmludGYoc21pLT5wcm9jX2Rpcl9uYW1lLCAiJWQiLCBudW0pOworCXNtaS0+cHJvY19kaXIgPSBwcm9jX21rZGlyKHNtaS0+cHJvY19kaXJfbmFtZSwgcHJvY19pcG1pX3Jvb3QpOworCWlmICghc21pLT5wcm9jX2RpcikKKwkJcnYgPSAtRU5PTUVNOworCWVsc2UgeworCQlzbWktPnByb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCX0KKworCWlmIChydiA9PSAwKQorCQlydiA9IGlwbWlfc21pX2FkZF9wcm9jX2VudHJ5KHNtaSwgInN0YXRzIiwKKwkJCQkJICAgICBzdGF0X2ZpbGVfcmVhZF9wcm9jLCBOVUxMLAorCQkJCQkgICAgIHNtaSwgVEhJU19NT0RVTEUpOworCisJaWYgKHJ2ID09IDApCisJCXJ2ID0gaXBtaV9zbWlfYWRkX3Byb2NfZW50cnkoc21pLCAiaXBtYiIsCisJCQkJCSAgICAgaXBtYl9maWxlX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkJICAgICBzbWksIFRISVNfTU9EVUxFKTsKKworCWlmIChydiA9PSAwKQorCQlydiA9IGlwbWlfc21pX2FkZF9wcm9jX2VudHJ5KHNtaSwgInZlcnNpb24iLAorCQkJCQkgICAgIHZlcnNpb25fZmlsZV9yZWFkX3Byb2MsIE5VTEwsCisJCQkJCSAgICAgc21pLCBUSElTX01PRFVMRSk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9wcm9jX2VudHJpZXMoaXBtaV9zbWlfdCBzbWkpCit7CisJc3RydWN0IGlwbWlfcHJvY19lbnRyeSAqZW50cnk7CisKKwl3aGlsZSAoc21pLT5wcm9jX2VudHJpZXMpIHsKKwkJZW50cnkgPSBzbWktPnByb2NfZW50cmllczsKKwkJc21pLT5wcm9jX2VudHJpZXMgPSBlbnRyeS0+bmV4dDsKKworCQlyZW1vdmVfcHJvY19lbnRyeShlbnRyeS0+bmFtZSwgc21pLT5wcm9jX2Rpcik7CisJCWtmcmVlKGVudHJ5LT5uYW1lKTsKKwkJa2ZyZWUoZW50cnkpOworCX0KKwlyZW1vdmVfcHJvY19lbnRyeShzbWktPnByb2NfZGlyX25hbWUsIHByb2NfaXBtaV9yb290KTsKK30KKworc3RhdGljIGludAorc2VuZF9jaGFubmVsX2luZm9fY21kKGlwbWlfc21pX3QgaW50ZiwgaW50IGNoYW4pCit7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIG1zZzsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXTsKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc2k7CisKKwlzaS5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCXNpLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCXNpLmx1biA9IDA7CisKKwltc2cubmV0Zm4gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUOworCW1zZy5jbWQgPSBJUE1JX0dFVF9DSEFOTkVMX0lORk9fQ01EOworCW1zZy5kYXRhID0gZGF0YTsKKwltc2cuZGF0YV9sZW4gPSAxOworCWRhdGFbMF0gPSBjaGFuOworCXJldHVybiBpX2lwbWlfcmVxdWVzdChOVUxMLAorCQkJICAgICAgaW50ZiwKKwkJCSAgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzaSwKKwkJCSAgICAgIDAsCisJCQkgICAgICAmbXNnLAorCQkJICAgICAgTlVMTCwKKwkJCSAgICAgIE5VTEwsCisJCQkgICAgICBOVUxMLAorCQkJICAgICAgMCwKKwkJCSAgICAgIGludGYtPm15X2FkZHJlc3MsCisJCQkgICAgICBpbnRmLT5teV9sdW4sCisJCQkgICAgICAtMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX2hhbmRsZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJaW50IHJ2ID0gMDsKKwlpbnQgY2hhbjsKKworCWlmICgobXNnLT5yc3BbMF0gPT0gKElQTUlfTkVURk5fQVBQX1JFU1BPTlNFIDw8IDIpKQorCSAgICAmJiAobXNnLT5yc3BbMV0gPT0gSVBNSV9HRVRfQ0hBTk5FTF9JTkZPX0NNRCkpCisJeworCQkvKiBJdCdzIHRoZSBvbmUgd2Ugd2FudCAqLworCQlpZiAobXNnLT5yc3BbMl0gIT0gMCkgeworCQkJLyogR290IGFuIGVycm9yIGZyb20gdGhlIGNoYW5uZWwsIGp1c3QgZ28gb24uICovCisKKwkJCWlmIChtc2ctPnJzcFsyXSA9PSBJUE1JX0lOVkFMSURfQ09NTUFORF9FUlIpIHsKKwkJCQkvKiBJZiB0aGUgTUMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzCisJCQkJICAgY29tbWFuZCwgdGhhdCBpcyBsZWdhbC4gIFdlIGp1c3QKKwkJCQkgICBhc3N1bWUgaXQgaGFzIG9uZSBJUE1CIGF0IGNoYW5uZWwKKwkJCQkgICB6ZXJvLiAqLworCQkJCWludGYtPmNoYW5uZWxzWzBdLm1lZGl1bQorCQkJCQk9IElQTUlfQ0hBTk5FTF9NRURJVU1fSVBNQjsKKwkJCQlpbnRmLT5jaGFubmVsc1swXS5wcm90b2NvbAorCQkJCQk9IElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9JUE1COworCQkJCXJ2ID0gLUVOT1NZUzsKKworCQkJCWludGYtPmN1cnJfY2hhbm5lbCA9IElQTUlfTUFYX0NIQU5ORUxTOworCQkJCXdha2VfdXAoJmludGYtPndhaXRxKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWdvdG8gbmV4dF9jaGFubmVsOworCQl9CisJCWlmIChtc2ctPnJzcF9zaXplIDwgNikgeworCQkJLyogTWVzc2FnZSBub3QgYmlnIGVub3VnaCwganVzdCBnbyBvbi4gKi8KKwkJCWdvdG8gbmV4dF9jaGFubmVsOworCQl9CisJCWNoYW4gPSBpbnRmLT5jdXJyX2NoYW5uZWw7CisJCWludGYtPmNoYW5uZWxzW2NoYW5dLm1lZGl1bSA9IG1zZy0+cnNwWzRdICYgMHg3ZjsKKwkJaW50Zi0+Y2hhbm5lbHNbY2hhbl0ucHJvdG9jb2wgPSBtc2ctPnJzcFs1XSAmIDB4MWY7CisKKwluZXh0X2NoYW5uZWw6CisJCWludGYtPmN1cnJfY2hhbm5lbCsrOworCQlpZiAoaW50Zi0+Y3Vycl9jaGFubmVsID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQkJd2FrZV91cCgmaW50Zi0+d2FpdHEpOworCQllbHNlCisJCQlydiA9IHNlbmRfY2hhbm5lbF9pbmZvX2NtZChpbnRmLCBpbnRmLT5jdXJyX2NoYW5uZWwpOworCisJCWlmIChydikgeworCQkJLyogR290IGFuIGVycm9yIHNvbWVob3csIGp1c3QgZ2l2ZSB1cC4gKi8KKwkJCWludGYtPmN1cnJfY2hhbm5lbCA9IElQTUlfTUFYX0NIQU5ORUxTOworCQkJd2FrZV91cCgmaW50Zi0+d2FpdHEpOworCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkJICAgICAgICJFcnJvciBzZW5kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb246ICVkXG4iLAorCQkJICAgICAgIHJ2KTsKKwkJfQorCX0KKyBvdXQ6CisJcmV0dXJuOworfQorCitpbnQgaXBtaV9yZWdpc3Rlcl9zbWkoc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzICpoYW5kbGVycywKKwkJICAgICAgdm9pZAkJICAgICAgICpzZW5kX2luZm8sCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICB2ZXJzaW9uX21ham9yLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgdmVyc2lvbl9taW5vciwKKwkJICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIHNsYXZlX2FkZHIsCisJCSAgICAgIGlwbWlfc21pX3QgICAgICAgICAgICAgICAqaW50ZikKK3sKKwlpbnQgICAgICAgICAgICAgIGksIGo7CisJaW50ICAgICAgICAgICAgICBydjsKKwlpcG1pX3NtaV90ICAgICAgIG5ld19pbnRmOworCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKworCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGlzIGFjdHVhbGx5IGluaXRpYWxpemVkLCB0aGlzIGhhbmRsZXMKKwkgICBwcm9ibGVtcyB3aXRoIGluaXRpYWxpemF0aW9uIG9yZGVyLiAqLworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJcnYgPSBpcG1pX2luaXRfbXNnaGFuZGxlcigpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJCS8qIFRoZSBpbml0IGNvZGUgZG9lc24ndCByZXR1cm4gYW4gZXJyb3IgaWYgaXQgd2FzIHR1cm5lZAorCQkgICBvZmYsIGJ1dCBpdCB3b24ndCBpbml0aWFsaXplLiAgQ2hlY2sgdGhhdC4gKi8KKwkJaWYgKCFpbml0aWFsaXplZCkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCW5ld19pbnRmID0ga21hbGxvYyhzaXplb2YoKm5ld19pbnRmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfaW50ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG5ld19pbnRmLCAwLCBzaXplb2YoKm5ld19pbnRmKSk7CisKKwluZXdfaW50Zi0+cHJvY19kaXIgPSBOVUxMOworCisJcnYgPSAtRU5PTUVNOworCisJZG93bl93cml0ZSgmaW50ZXJmYWNlc19zZW0pOworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQlpZiAoaXBtaV9pbnRlcmZhY2VzW2ldID09IE5VTEwpIHsKKwkJCW5ld19pbnRmLT5pbnRmX251bSA9IGk7CisJCQluZXdfaW50Zi0+dmVyc2lvbl9tYWpvciA9IHZlcnNpb25fbWFqb3I7CisJCQluZXdfaW50Zi0+dmVyc2lvbl9taW5vciA9IHZlcnNpb25fbWlub3I7CisJCQlpZiAoc2xhdmVfYWRkciA9PSAwKQorCQkJCW5ld19pbnRmLT5teV9hZGRyZXNzID0gSVBNSV9CTUNfU0xBVkVfQUREUjsKKwkJCWVsc2UKKwkJCQluZXdfaW50Zi0+bXlfYWRkcmVzcyA9IHNsYXZlX2FkZHI7CisJCQluZXdfaW50Zi0+bXlfbHVuID0gMjsgIC8qIHRoZSBTTVMgTFVOLiAqLworCQkJcndsb2NrX2luaXQoJihuZXdfaW50Zi0+dXNlcnNfbG9jaykpOworCQkJSU5JVF9MSVNUX0hFQUQoJihuZXdfaW50Zi0+dXNlcnMpKTsKKwkJCW5ld19pbnRmLT5oYW5kbGVycyA9IGhhbmRsZXJzOworCQkJbmV3X2ludGYtPnNlbmRfaW5mbyA9IHNlbmRfaW5mbzsKKwkJCXNwaW5fbG9ja19pbml0KCYobmV3X2ludGYtPnNlcV9sb2NrKSk7CisJCQlmb3IgKGo9MDsgajxJUE1JX0lQTUJfTlVNX1NFUTsgaisrKSB7CisJCQkJbmV3X2ludGYtPnNlcV90YWJsZVtqXS5pbnVzZSA9IDA7CisJCQkJbmV3X2ludGYtPnNlcV90YWJsZVtqXS5zZXFpZCA9IDA7CisJCQl9CisJCQluZXdfaW50Zi0+Y3Vycl9zZXEgPSAwOworCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+d2FpdGluZ19tc2dzX2xvY2spKTsKKwkJCUlOSVRfTElTVF9IRUFEKCYobmV3X2ludGYtPndhaXRpbmdfbXNncykpOworCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+ZXZlbnRzX2xvY2spKTsKKwkJCUlOSVRfTElTVF9IRUFEKCYobmV3X2ludGYtPndhaXRpbmdfZXZlbnRzKSk7CisJCQluZXdfaW50Zi0+d2FpdGluZ19ldmVudHNfY291bnQgPSAwOworCQkJcndsb2NrX2luaXQoJihuZXdfaW50Zi0+Y21kX3JjdnJfbG9jaykpOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmbmV3X2ludGYtPndhaXRxKTsKKwkJCUlOSVRfTElTVF9IRUFEKCYobmV3X2ludGYtPmNtZF9yY3ZycykpOworCQkJbmV3X2ludGYtPmFsbF9jbWRfcmN2ciA9IE5VTEw7CisKKwkJCXNwaW5fbG9ja19pbml0KCYobmV3X2ludGYtPmNvdW50ZXJfbG9jaykpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7CisJCQlpcG1pX2ludGVyZmFjZXNbaV0gPSBuZXdfaW50ZjsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOworCisJCQlydiA9IDA7CisJCQkqaW50ZiA9IG5ld19pbnRmOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkb3duZ3JhZGVfd3JpdGUoJmludGVyZmFjZXNfc2VtKTsKKworCWlmIChydiA9PSAwKQorCQlydiA9IGFkZF9wcm9jX2VudHJpZXMoKmludGYsIGkpOworCisJaWYgKHJ2ID09IDApIHsKKwkJaWYgKCh2ZXJzaW9uX21ham9yID4gMSkKKwkJICAgIHx8ICgodmVyc2lvbl9tYWpvciA9PSAxKSAmJiAodmVyc2lvbl9taW5vciA+PSA1KSkpCisJCXsKKwkJCS8qIFN0YXJ0IHNjYW5uaW5nIHRoZSBjaGFubmVscyB0byBzZWUgd2hhdCBpcworCQkJICAgYXZhaWxhYmxlLiAqLworCQkJKCppbnRmKS0+bnVsbF91c2VyX2hhbmRsZXIgPSBjaGFubmVsX2hhbmRsZXI7CisJCQkoKmludGYpLT5jdXJyX2NoYW5uZWwgPSAwOworCQkJcnYgPSBzZW5kX2NoYW5uZWxfaW5mb19jbWQoKmludGYsIDApOworCQkJaWYgKHJ2KQorCQkJCWdvdG8gb3V0OworCisJCQkvKiBXYWl0IGZvciB0aGUgY2hhbm5lbCBpbmZvIHRvIGJlIHJlYWQuICovCisJCQl1cF9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CisJCQl3YWl0X2V2ZW50KCgqaW50ZiktPndhaXRxLAorCQkJCSAgICgoKmludGYpLT5jdXJyX2NoYW5uZWw+PUlQTUlfTUFYX0NIQU5ORUxTKSk7CisJCQlkb3duX3JlYWQoJmludGVyZmFjZXNfc2VtKTsKKworCQkJaWYgKGlwbWlfaW50ZXJmYWNlc1tpXSAhPSBuZXdfaW50ZikKKwkJCQkvKiBXZWxsLCBpdCB3ZW50IGF3YXkuICBKdXN0IHJldHVybi4gKi8KKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCS8qIEFzc3VtZSBhIHNpbmdsZSBJUE1CIGNoYW5uZWwgYXQgemVyby4gKi8KKwkJCSgqaW50ZiktPmNoYW5uZWxzWzBdLm1lZGl1bSA9IElQTUlfQ0hBTk5FTF9NRURJVU1fSVBNQjsKKwkJCSgqaW50ZiktPmNoYW5uZWxzWzBdLnByb3RvY29sCisJCQkJPSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfSVBNQjsKKyAgCQl9CisKKwkJLyogQ2FsbCBhbGwgdGhlIHdhdGNoZXIgaW50ZXJmYWNlcyB0byB0ZWxsCisJCSAgIHRoZW0gdGhhdCBhIG5ldyBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlLiAqLworCQljYWxsX3NtaV93YXRjaGVycyhpKTsKKwl9CisKKyBvdXQ6CisJdXBfcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCisJaWYgKHJ2KSB7CisJCWlmIChuZXdfaW50Zi0+cHJvY19kaXIpCisJCQlyZW1vdmVfcHJvY19lbnRyaWVzKG5ld19pbnRmKTsKKwkJa2ZyZWUobmV3X2ludGYpOworCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yZWN2X21zZ19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnEpCit7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZywgKm1zZzI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCBxLCBsaW5rKSB7CisJCWxpc3RfZGVsKCZtc2ctPmxpbmspOworCQlpcG1pX2ZyZWVfcmVjdl9tc2cobXNnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY21kX3JjdnJfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpxKQoreworCXN0cnVjdCBjbWRfcmN2ciAgKnJjdnIsICpyY3ZyMjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY3ZyLCByY3ZyMiwgcSwgbGluaykgeworCQlsaXN0X2RlbCgmcmN2ci0+bGluayk7CisJCWtmcmVlKHJjdnIpOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYW5fdXBfaW50ZXJmYWNlX2RhdGEoaXBtaV9zbWlfdCBpbnRmKQoreworCWludCBpOworCisJZnJlZV9yZWN2X21zZ19saXN0KCYoaW50Zi0+d2FpdGluZ19tc2dzKSk7CisJZnJlZV9yZWN2X21zZ19saXN0KCYoaW50Zi0+d2FpdGluZ19ldmVudHMpKTsKKwlmcmVlX2NtZF9yY3ZyX2xpc3QoJihpbnRmLT5jbWRfcmN2cnMpKTsKKworCWZvciAoaT0wOyBpPElQTUlfSVBNQl9OVU1fU0VROyBpKyspIHsKKwkJaWYgKChpbnRmLT5zZXFfdGFibGVbaV0uaW51c2UpCisJCSAgICAmJiAoaW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnKSkKKwkJeworCQkJaXBtaV9mcmVlX3JlY3ZfbXNnKGludGYtPnNlcV90YWJsZVtpXS5yZWN2X21zZyk7CisJCX0JCisJfQorfQorCitpbnQgaXBtaV91bnJlZ2lzdGVyX3NtaShpcG1pX3NtaV90IGludGYpCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcnYgPSAtRU5PREVWOworCWludCAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGlwbWlfc21pX3dhdGNoZXIgKnc7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisKKwlkb3duX3dyaXRlKCZpbnRlcmZhY2VzX3NlbSk7CisJaWYgKGxpc3RfZW1wdHkoJihpbnRmLT51c2VycykpKQorCXsKKwkJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCQlpZiAoaXBtaV9pbnRlcmZhY2VzW2ldID09IGludGYpIHsKKwkJCQlyZW1vdmVfcHJvY19lbnRyaWVzKGludGYpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlcmZhY2VzX2xvY2ssIGZsYWdzKTsKKwkJCQlpcG1pX2ludGVyZmFjZXNbaV0gPSBOVUxMOworCQkJCWNsZWFuX3VwX2ludGVyZmFjZV9kYXRhKGludGYpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jayxmbGFncyk7CisJCQkJa2ZyZWUoaW50Zik7CisJCQkJcnYgPSAwOworCQkJCWdvdG8gb3V0X2NhbGxfd2F0Y2hlcjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJ2ID0gLUVCVVNZOworCX0KKwl1cF93cml0ZSgmaW50ZXJmYWNlc19zZW0pOworCisJcmV0dXJuIHJ2OworCisgb3V0X2NhbGxfd2F0Y2hlcjoKKwlkb3duZ3JhZGVfd3JpdGUoJmludGVyZmFjZXNfc2VtKTsKKworCS8qIENhbGwgYWxsIHRoZSB3YXRjaGVyIGludGVyZmFjZXMgdG8gdGVsbCB0aGVtIHRoYXQKKwkgICBhbiBpbnRlcmZhY2UgaXMgZ29uZS4gKi8KKwlkb3duX3JlYWQoJnNtaV93YXRjaGVyc19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnNtaV93YXRjaGVycywgbGluaykgeworCQl3LT5zbWlfZ29uZShpKTsKKwl9CisJdXBfcmVhZCgmc21pX3dhdGNoZXJzX3NlbSk7CisJdXBfcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9pcG1iX2dldF9tc2dfcnNwKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCQkgICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJc3RydWN0IGlwbWlfaXBtYl9hZGRyIGlwbWJfYWRkcjsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgKnJlY3ZfbXNnOworCXVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKworCQorCS8qIFRoaXMgaXMgMTEsIG5vdCAxMCwgYmVjYXVzZSB0aGUgcmVzcG9uc2UgbXVzdCBjb250YWluIGEKKwkgKiBjb21wbGV0aW9uIGNvZGUuICovCisJaWYgKG1zZy0+cnNwX3NpemUgPCAxMSkgeworCQkvKiBNZXNzYWdlIG5vdCBiaWcgZW5vdWdoLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5pbnZhbGlkX2lwbWJfcmVzcG9uc2VzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobXNnLT5yc3BbMl0gIT0gMCkgeworCQkvKiBBbiBlcnJvciBnZXR0aW5nIHRoZSByZXNwb25zZSwganVzdCBpZ25vcmUgaXQuICovCisJCXJldHVybiAwOworCX0KKworCWlwbWJfYWRkci5hZGRyX3R5cGUgPSBJUE1JX0lQTUJfQUREUl9UWVBFOworCWlwbWJfYWRkci5zbGF2ZV9hZGRyID0gbXNnLT5yc3BbNl07CisJaXBtYl9hZGRyLmNoYW5uZWwgPSBtc2ctPnJzcFszXSAmIDB4MGY7CisJaXBtYl9hZGRyLmx1biA9IG1zZy0+cnNwWzddICYgMzsKKworCS8qIEl0J3MgYSByZXNwb25zZSBmcm9tIGEgcmVtb3RlIGVudGl0eS4gIExvb2sgdXAgdGhlIHNlcXVlbmNlCisJICAgbnVtYmVyIGFuZCBoYW5kbGUgdGhlIHJlc3BvbnNlLiAqLworCWlmIChpbnRmX2ZpbmRfc2VxKGludGYsCisJCQkgIG1zZy0+cnNwWzddID4+IDIsCisJCQkgIG1zZy0+cnNwWzNdICYgMHgwZiwKKwkJCSAgbXNnLT5yc3BbOF0sCisJCQkgIChtc2ctPnJzcFs0XSA+PiAyKSAmICh+MSksCisJCQkgIChzdHJ1Y3QgaXBtaV9hZGRyICopICYoaXBtYl9hZGRyKSwKKwkJCSAgJnJlY3ZfbXNnKSkKKwl7CisJCS8qIFdlIHdlcmUgdW5hYmxlIHRvIGZpbmQgdGhlIHNlcXVlbmNlIG51bWJlciwKKwkJICAgc28ganVzdCBudWtlIHRoZSBtZXNzYWdlLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPnVuaGFuZGxlZF9pcG1iX3Jlc3BvbnNlcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtY3B5KHJlY3ZfbXNnLT5tc2dfZGF0YSwKKwkgICAgICAgJihtc2ctPnJzcFs5XSksCisJICAgICAgIG1zZy0+cnNwX3NpemUgLSA5KTsKKwkvKiBUSGUgb3RoZXIgZmllbGRzIG1hdGNoZWQsIHNvIG5vIG5lZWQgdG8gc2V0IHRoZW0sIGV4Y2VwdAorICAgICAgICAgICBmb3IgbmV0Zm4sIHdoaWNoIG5lZWRzIHRvIGJlIHRoZSByZXNwb25zZSB0aGF0IHdhcworICAgICAgICAgICByZXR1cm5lZCwgbm90IHRoZSByZXF1ZXN0IHZhbHVlLiAqLworCXJlY3ZfbXNnLT5tc2cubmV0Zm4gPSBtc2ctPnJzcFs0XSA+PiAyOworCXJlY3ZfbXNnLT5tc2cuZGF0YSA9IHJlY3ZfbXNnLT5tc2dfZGF0YTsKKwlyZWN2X21zZy0+bXNnLmRhdGFfbGVuID0gbXNnLT5yc3Bfc2l6ZSAtIDEwOworCXJlY3ZfbXNnLT5yZWN2X3R5cGUgPSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJaW50Zi0+aGFuZGxlZF9pcG1iX3Jlc3BvbnNlcysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCWRlbGl2ZXJfcmVzcG9uc2UocmVjdl9tc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2lwbWJfZ2V0X21zZ19jbWQoaXBtaV9zbWlfdCAgICAgICAgICBpbnRmLAorCQkJCSAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgY21kX3JjdnIgICAgICAgKnJjdnI7CisJaW50ICAgICAgICAgICAgICAgICAgIHJ2ID0gMDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgbmV0Zm47CisJdW5zaWduZWQgY2hhciAgICAgICAgIGNtZDsKKwlpcG1pX3VzZXJfdCAgICAgICAgICAgdXNlciA9IE5VTEw7CisJc3RydWN0IGlwbWlfaXBtYl9hZGRyICppcG1iX2FkZHI7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgICpyZWN2X21zZzsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisKKwlpZiAobXNnLT5yc3Bfc2l6ZSA8IDEwKSB7CisJCS8qIE1lc3NhZ2Ugbm90IGJpZyBlbm91Z2gsIGp1c3QgaWdub3JlIGl0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPmludmFsaWRfY29tbWFuZHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtc2ctPnJzcFsyXSAhPSAwKSB7CisJCS8qIEFuIGVycm9yIGdldHRpbmcgdGhlIHJlc3BvbnNlLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbmV0Zm4gPSBtc2ctPnJzcFs0XSA+PiAyOworCWNtZCA9IG1zZy0+cnNwWzhdOworCisJcmVhZF9sb2NrKCYoaW50Zi0+Y21kX3JjdnJfbG9jaykpOworCQorCWlmIChpbnRmLT5hbGxfY21kX3JjdnIpIHsKKwkJdXNlciA9IGludGYtPmFsbF9jbWRfcmN2cjsKKwl9IGVsc2UgeworCQkvKiBGaW5kIHRoZSBjb21tYW5kL25ldGZuLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYoaW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQkJaWYgKChyY3ZyLT5uZXRmbiA9PSBuZXRmbikgJiYgKHJjdnItPmNtZCA9PSBjbWQpKSB7CisJCQkJdXNlciA9IHJjdnItPnVzZXI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CisKKwlpZiAodXNlciA9PSBOVUxMKSB7CisJCS8qIFdlIGRpZG4ndCBmaW5kIGEgdXNlciwgZGVsaXZlciBhbiBlcnJvciByZXNwb25zZS4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT51bmhhbmRsZWRfY29tbWFuZHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisKKwkJbXNnLT5kYXRhWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCW1zZy0+ZGF0YVsxXSA9IElQTUlfU0VORF9NU0dfQ01EOworCQltc2ctPmRhdGFbMl0gPSBtc2ctPnJzcFszXTsKKwkJbXNnLT5kYXRhWzNdID0gbXNnLT5yc3BbNl07CisgICAgICAgICAgICAgICAgbXNnLT5kYXRhWzRdID0gKChuZXRmbiArIDEpIDw8IDIpIHwgKG1zZy0+cnNwWzddICYgMHgzKTsKKwkJbXNnLT5kYXRhWzVdID0gaXBtYl9jaGVja3N1bSgmKG1zZy0+ZGF0YVszXSksIDIpOworCQltc2ctPmRhdGFbNl0gPSBpbnRmLT5teV9hZGRyZXNzOworICAgICAgICAgICAgICAgIC8qIHJxc2VxL2x1biAqLworICAgICAgICAgICAgICAgIG1zZy0+ZGF0YVs3XSA9IChtc2ctPnJzcFs3XSAmIDB4ZmMpIHwgKG1zZy0+cnNwWzRdICYgMHgzKTsKKwkJbXNnLT5kYXRhWzhdID0gbXNnLT5yc3BbOF07IC8qIGNtZCAqLworCQltc2ctPmRhdGFbOV0gPSBJUE1JX0lOVkFMSURfQ01EX0NPTVBMRVRJT05fQ09ERTsKKwkJbXNnLT5kYXRhWzEwXSA9IGlwbWJfY2hlY2tzdW0oJihtc2ctPmRhdGFbNl0pLCA0KTsKKwkJbXNnLT5kYXRhX3NpemUgPSAxMTsKKworI2lmZGVmIERFQlVHX01TR0lORworCXsKKwkJaW50IG07CisJCXByaW50aygiSW52YWxpZCBjb21tYW5kOiIpOworCQlmb3IgKG09MDsgbTxtc2ctPmRhdGFfc2l6ZTsgbSsrKQorCQkJcHJpbnRrKCIgJTIuMngiLCBtc2ctPmRhdGFbbV0pOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJCWludGYtPmhhbmRsZXJzLT5zZW5kZXIoaW50Zi0+c2VuZF9pbmZvLCBtc2csIDApOworCisJCXJ2ID0gLTE7IC8qIFdlIHVzZWQgdGhlIG1lc3NhZ2UsIHNvIHJldHVybiB0aGUgdmFsdWUgdGhhdAorCQkJICAgIGNhdXNlcyBpdCB0byBub3QgYmUgZnJlZWQgb3IgcXVldWVkLiAqLworCX0gZWxzZSB7CisJCS8qIERlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+aGFuZGxlZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKworCQlyZWN2X21zZyA9IGlwbWlfYWxsb2NfcmVjdl9tc2coKTsKKwkJaWYgKCEgcmVjdl9tc2cpIHsKKwkJCS8qIFdlIGNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBzbyByZXF1ZXVlIGl0IGZvciBoYW5kbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIuICovCisJCQlydiA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBFeHRyYWN0IHRoZSBzb3VyY2UgYWRkcmVzcyBmcm9tIHRoZSBkYXRhLiAqLworCQkJaXBtYl9hZGRyID0gKHN0cnVjdCBpcG1pX2lwbWJfYWRkciAqKSAmcmVjdl9tc2ctPmFkZHI7CisJCQlpcG1iX2FkZHItPmFkZHJfdHlwZSA9IElQTUlfSVBNQl9BRERSX1RZUEU7CisJCQlpcG1iX2FkZHItPnNsYXZlX2FkZHIgPSBtc2ctPnJzcFs2XTsKKwkJCWlwbWJfYWRkci0+bHVuID0gbXNnLT5yc3BbN10gJiAzOworCQkJaXBtYl9hZGRyLT5jaGFubmVsID0gbXNnLT5yc3BbM10gJiAweGY7CisKKwkJCS8qIEV4dHJhY3QgdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2UgaW5mb3JtYXRpb24KKwkJCSAgIGZyb20gdGhlIElQTUIgaGVhZGVyLiovCisJCQlyZWN2X21zZy0+dXNlciA9IHVzZXI7CisJCQlyZWN2X21zZy0+cmVjdl90eXBlID0gSVBNSV9DTURfUkVDVl9UWVBFOworCQkJcmVjdl9tc2ctPm1zZ2lkID0gbXNnLT5yc3BbN10gPj4gMjsKKwkJCXJlY3ZfbXNnLT5tc2cubmV0Zm4gPSBtc2ctPnJzcFs0XSA+PiAyOworCQkJcmVjdl9tc2ctPm1zZy5jbWQgPSBtc2ctPnJzcFs4XTsKKwkJCXJlY3ZfbXNnLT5tc2cuZGF0YSA9IHJlY3ZfbXNnLT5tc2dfZGF0YTsKKworCQkJLyogV2UgY2hvcCBvZmYgMTAsIG5vdCA5IGJ5dGVzIGJlY2F1c2UgdGhlIGNoZWNrc3VtCisJCQkgICBhdCB0aGUgZW5kIGFsc28gbmVlZHMgdG8gYmUgcmVtb3ZlZC4gKi8KKwkJCXJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4gPSBtc2ctPnJzcF9zaXplIC0gMTA7CisJCQltZW1jcHkocmVjdl9tc2ctPm1zZ19kYXRhLAorCQkJICAgICAgICYobXNnLT5yc3BbOV0pLAorCQkJICAgICAgIG1zZy0+cnNwX3NpemUgLSAxMCk7CisJCQlkZWxpdmVyX3Jlc3BvbnNlKHJlY3ZfbXNnKTsKKwkJfQorCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBoYW5kbGVfbGFuX2dldF9tc2dfcnNwKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCQkgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgaXBtaV9sYW5fYWRkciAgbGFuX2FkZHI7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgICpyZWN2X21zZzsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisKKworCS8qIFRoaXMgaXMgMTMsIG5vdCAxMiwgYmVjYXVzZSB0aGUgcmVzcG9uc2UgbXVzdCBjb250YWluIGEKKwkgKiBjb21wbGV0aW9uIGNvZGUuICovCisJaWYgKG1zZy0+cnNwX3NpemUgPCAxMykgeworCQkvKiBNZXNzYWdlIG5vdCBiaWcgZW5vdWdoLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5pbnZhbGlkX2xhbl9yZXNwb25zZXMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtc2ctPnJzcFsyXSAhPSAwKSB7CisJCS8qIEFuIGVycm9yIGdldHRpbmcgdGhlIHJlc3BvbnNlLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbGFuX2FkZHIuYWRkcl90eXBlID0gSVBNSV9MQU5fQUREUl9UWVBFOworCWxhbl9hZGRyLnNlc3Npb25faGFuZGxlID0gbXNnLT5yc3BbNF07CisJbGFuX2FkZHIucmVtb3RlX1NXSUQgPSBtc2ctPnJzcFs4XTsKKwlsYW5fYWRkci5sb2NhbF9TV0lEID0gbXNnLT5yc3BbNV07CisJbGFuX2FkZHIuY2hhbm5lbCA9IG1zZy0+cnNwWzNdICYgMHgwZjsKKwlsYW5fYWRkci5wcml2aWxlZ2UgPSBtc2ctPnJzcFszXSA+PiA0OworCWxhbl9hZGRyLmx1biA9IG1zZy0+cnNwWzldICYgMzsKKworCS8qIEl0J3MgYSByZXNwb25zZSBmcm9tIGEgcmVtb3RlIGVudGl0eS4gIExvb2sgdXAgdGhlIHNlcXVlbmNlCisJICAgbnVtYmVyIGFuZCBoYW5kbGUgdGhlIHJlc3BvbnNlLiAqLworCWlmIChpbnRmX2ZpbmRfc2VxKGludGYsCisJCQkgIG1zZy0+cnNwWzldID4+IDIsCisJCQkgIG1zZy0+cnNwWzNdICYgMHgwZiwKKwkJCSAgbXNnLT5yc3BbMTBdLAorCQkJICAobXNnLT5yc3BbNl0gPj4gMikgJiAofjEpLAorCQkJICAoc3RydWN0IGlwbWlfYWRkciAqKSAmKGxhbl9hZGRyKSwKKwkJCSAgJnJlY3ZfbXNnKSkKKwl7CisJCS8qIFdlIHdlcmUgdW5hYmxlIHRvIGZpbmQgdGhlIHNlcXVlbmNlIG51bWJlciwKKwkJICAgc28ganVzdCBudWtlIHRoZSBtZXNzYWdlLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPnVuaGFuZGxlZF9sYW5fcmVzcG9uc2VzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1jcHkocmVjdl9tc2ctPm1zZ19kYXRhLAorCSAgICAgICAmKG1zZy0+cnNwWzExXSksCisJICAgICAgIG1zZy0+cnNwX3NpemUgLSAxMSk7CisJLyogVGhlIG90aGVyIGZpZWxkcyBtYXRjaGVkLCBzbyBubyBuZWVkIHRvIHNldCB0aGVtLCBleGNlcHQKKyAgICAgICAgICAgZm9yIG5ldGZuLCB3aGljaCBuZWVkcyB0byBiZSB0aGUgcmVzcG9uc2UgdGhhdCB3YXMKKyAgICAgICAgICAgcmV0dXJuZWQsIG5vdCB0aGUgcmVxdWVzdCB2YWx1ZS4gKi8KKwlyZWN2X21zZy0+bXNnLm5ldGZuID0gbXNnLT5yc3BbNl0gPj4gMjsKKwlyZWN2X21zZy0+bXNnLmRhdGEgPSByZWN2X21zZy0+bXNnX2RhdGE7CisJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IG1zZy0+cnNwX3NpemUgLSAxMjsKKwlyZWN2X21zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRUNWX1RZUEU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCWludGYtPmhhbmRsZWRfbGFuX3Jlc3BvbnNlcysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCWRlbGl2ZXJfcmVzcG9uc2UocmVjdl9tc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2xhbl9nZXRfbXNnX2NtZChpcG1pX3NtaV90ICAgICAgICAgIGludGYsCisJCQkJICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJc3RydWN0IGNtZF9yY3ZyICAgICAgICpyY3ZyOworCWludCAgICAgICAgICAgICAgICAgICBydiA9IDA7CisJdW5zaWduZWQgY2hhciAgICAgICAgIG5ldGZuOworCXVuc2lnbmVkIGNoYXIgICAgICAgICBjbWQ7CisJaXBtaV91c2VyX3QgICAgICAgICAgIHVzZXIgPSBOVUxMOworCXN0cnVjdCBpcG1pX2xhbl9hZGRyICAqbGFuX2FkZHI7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgICpyZWN2X21zZzsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisKKwlpZiAobXNnLT5yc3Bfc2l6ZSA8IDEyKSB7CisJCS8qIE1lc3NhZ2Ugbm90IGJpZyBlbm91Z2gsIGp1c3QgaWdub3JlIGl0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPmludmFsaWRfY29tbWFuZHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtc2ctPnJzcFsyXSAhPSAwKSB7CisJCS8qIEFuIGVycm9yIGdldHRpbmcgdGhlIHJlc3BvbnNlLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbmV0Zm4gPSBtc2ctPnJzcFs2XSA+PiAyOworCWNtZCA9IG1zZy0+cnNwWzEwXTsKKworCXJlYWRfbG9jaygmKGludGYtPmNtZF9yY3ZyX2xvY2spKTsKKworCWlmIChpbnRmLT5hbGxfY21kX3JjdnIpIHsKKwkJdXNlciA9IGludGYtPmFsbF9jbWRfcmN2cjsKKwl9IGVsc2UgeworCQkvKiBGaW5kIHRoZSBjb21tYW5kL25ldGZuLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYoaW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQkJaWYgKChyY3ZyLT5uZXRmbiA9PSBuZXRmbikgJiYgKHJjdnItPmNtZCA9PSBjbWQpKSB7CisJCQkJdXNlciA9IHJjdnItPnVzZXI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CisKKwlpZiAodXNlciA9PSBOVUxMKSB7CisJCS8qIFdlIGRpZG4ndCBmaW5kIGEgdXNlciwgZGVsaXZlciBhbiBlcnJvciByZXNwb25zZS4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT51bmhhbmRsZWRfY29tbWFuZHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisKKwkJcnYgPSAwOyAvKiBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZXNlIG1lc3NhZ2VzLCBqdXN0CisJCQkgICBhbGxvdyB0aGVtIHRvIGJlIGZyZWVkLiAqLworCX0gZWxzZSB7CisJCS8qIERlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+aGFuZGxlZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKworCQlyZWN2X21zZyA9IGlwbWlfYWxsb2NfcmVjdl9tc2coKTsKKwkJaWYgKCEgcmVjdl9tc2cpIHsKKwkJCS8qIFdlIGNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBzbyByZXF1ZXVlIGl0IGZvciBoYW5kbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIuICovCisJCQlydiA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBFeHRyYWN0IHRoZSBzb3VyY2UgYWRkcmVzcyBmcm9tIHRoZSBkYXRhLiAqLworCQkJbGFuX2FkZHIgPSAoc3RydWN0IGlwbWlfbGFuX2FkZHIgKikgJnJlY3ZfbXNnLT5hZGRyOworCQkJbGFuX2FkZHItPmFkZHJfdHlwZSA9IElQTUlfTEFOX0FERFJfVFlQRTsKKwkJCWxhbl9hZGRyLT5zZXNzaW9uX2hhbmRsZSA9IG1zZy0+cnNwWzRdOworCQkJbGFuX2FkZHItPnJlbW90ZV9TV0lEID0gbXNnLT5yc3BbOF07CisJCQlsYW5fYWRkci0+bG9jYWxfU1dJRCA9IG1zZy0+cnNwWzVdOworCQkJbGFuX2FkZHItPmx1biA9IG1zZy0+cnNwWzldICYgMzsKKwkJCWxhbl9hZGRyLT5jaGFubmVsID0gbXNnLT5yc3BbM10gJiAweGY7CisJCQlsYW5fYWRkci0+cHJpdmlsZWdlID0gbXNnLT5yc3BbM10gPj4gNDsKKworCQkJLyogRXh0cmFjdCB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbgorCQkJICAgZnJvbSB0aGUgSVBNQiBoZWFkZXIuKi8KKwkJCXJlY3ZfbXNnLT51c2VyID0gdXNlcjsKKwkJCXJlY3ZfbXNnLT5yZWN2X3R5cGUgPSBJUE1JX0NNRF9SRUNWX1RZUEU7CisJCQlyZWN2X21zZy0+bXNnaWQgPSBtc2ctPnJzcFs5XSA+PiAyOworCQkJcmVjdl9tc2ctPm1zZy5uZXRmbiA9IG1zZy0+cnNwWzZdID4+IDI7CisJCQlyZWN2X21zZy0+bXNnLmNtZCA9IG1zZy0+cnNwWzEwXTsKKwkJCXJlY3ZfbXNnLT5tc2cuZGF0YSA9IHJlY3ZfbXNnLT5tc2dfZGF0YTsKKworCQkJLyogV2UgY2hvcCBvZmYgMTIsIG5vdCAxMSBieXRlcyBiZWNhdXNlIHRoZSBjaGVja3N1bQorCQkJICAgYXQgdGhlIGVuZCBhbHNvIG5lZWRzIHRvIGJlIHJlbW92ZWQuICovCisJCQlyZWN2X21zZy0+bXNnLmRhdGFfbGVuID0gbXNnLT5yc3Bfc2l6ZSAtIDEyOworCQkJbWVtY3B5KHJlY3ZfbXNnLT5tc2dfZGF0YSwKKwkJCSAgICAgICAmKG1zZy0+cnNwWzExXSksCisJCQkgICAgICAgbXNnLT5yc3Bfc2l6ZSAtIDEyKTsKKwkJCWRlbGl2ZXJfcmVzcG9uc2UocmVjdl9tc2cpOworCQl9CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBjb3B5X2V2ZW50X2ludG9fcmVjdl9tc2coc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnLAorCQkJCSAgICAgc3RydWN0IGlwbWlfc21pX21zZyAgKm1zZykKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKnNtaV9hZGRyOworCQorCXJlY3ZfbXNnLT5tc2dpZCA9IDA7CisJc21pX2FkZHIgPSAoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICopICYocmVjdl9tc2ctPmFkZHIpOworCXNtaV9hZGRyLT5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCXNtaV9hZGRyLT5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKwlzbWlfYWRkci0+bHVuID0gbXNnLT5yc3BbMF0gJiAzOworCXJlY3ZfbXNnLT5yZWN2X3R5cGUgPSBJUE1JX0FTWU5DX0VWRU5UX1JFQ1ZfVFlQRTsKKwlyZWN2X21zZy0+bXNnLm5ldGZuID0gbXNnLT5yc3BbMF0gPj4gMjsKKwlyZWN2X21zZy0+bXNnLmNtZCA9IG1zZy0+cnNwWzFdOworCW1lbWNweShyZWN2X21zZy0+bXNnX2RhdGEsICYobXNnLT5yc3BbM10pLCBtc2ctPnJzcF9zaXplIC0gMyk7CisJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCXJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4gPSBtc2ctPnJzcF9zaXplIC0gMzsKK30KKworLyogVGhpcyB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBpbnRmLT51c2Vyc19sb2NrIHJlYWQtbG9ja2VkLCBzbyBubyBuZWVkCisgICB0byBkbyB0aGF0IGhlcmUuICovCitzdGF0aWMgaW50IGhhbmRsZV9yZWFkX2V2ZW50X3JzcChpcG1pX3NtaV90ICAgICAgICAgIGludGYsCisJCQkJIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcmVjdl9tc2csICpyZWN2X21zZzI7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgbXNnczsKKwlpcG1pX3VzZXJfdCAgICAgICAgICB1c2VyOworCWludCAgICAgICAgICAgICAgICAgIHJ2ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICBkZWxpdmVyX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICBmbGFnczsKKworCWlmIChtc2ctPnJzcF9zaXplIDwgMTkpIHsKKwkJLyogTWVzc2FnZSBpcyB0b28gc21hbGwgdG8gYmUgYW4gSVBNQiBldmVudC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5pbnZhbGlkX2V2ZW50cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJLyogQW4gZXJyb3IgZ2V0dGluZyB0aGUgZXZlbnQsIGp1c3QgaWdub3JlIGl0LiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmbXNncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPmV2ZW50c19sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCWludGYtPmV2ZW50cysrOworCXNwaW5fdW5sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCisJLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gb25lIG1lc3NhZ2UgZm9yIGV2ZXJ5IHVzZXIgdGhhdCBpcyBnZXR0aW5nCisJICAgZXZlbnRzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodXNlciwgJihpbnRmLT51c2VycyksIGxpbmspIHsKKwkJaWYgKCEgdXNlci0+Z2V0c19ldmVudHMpCisJCQljb250aW51ZTsKKworCQlyZWN2X21zZyA9IGlwbWlfYWxsb2NfcmVjdl9tc2coKTsKKwkJaWYgKCEgcmVjdl9tc2cpIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWN2X21zZywgcmVjdl9tc2cyLCAmbXNncywgbGluaykgeworCQkJCWxpc3RfZGVsKCZyZWN2X21zZy0+bGluayk7CisJCQkJaXBtaV9mcmVlX3JlY3ZfbXNnKHJlY3ZfbXNnKTsKKwkJCX0KKwkJCS8qIFdlIGNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBzbyByZXF1ZXVlIGl0IGZvciBoYW5kbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIuICovCisJCQlydiA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRlbGl2ZXJfY291bnQrKzsKKworCQljb3B5X2V2ZW50X2ludG9fcmVjdl9tc2cocmVjdl9tc2csIG1zZyk7CisJCXJlY3ZfbXNnLT51c2VyID0gdXNlcjsKKwkJbGlzdF9hZGRfdGFpbCgmKHJlY3ZfbXNnLT5saW5rKSwgJm1zZ3MpOworCX0KKworCWlmIChkZWxpdmVyX2NvdW50KSB7CisJCS8qIE5vdyBkZWxpdmVyIGFsbCB0aGUgbWVzc2FnZXMuICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWN2X21zZywgcmVjdl9tc2cyLCAmbXNncywgbGluaykgeworCQkJbGlzdF9kZWwoJnJlY3ZfbXNnLT5saW5rKTsKKwkJCWRlbGl2ZXJfcmVzcG9uc2UocmVjdl9tc2cpOworCQl9CisJfSBlbHNlIGlmIChpbnRmLT53YWl0aW5nX2V2ZW50c19jb3VudCA8IE1BWF9FVkVOVFNfSU5fUVVFVUUpIHsKKwkJLyogTm8gb25lIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UsIHB1dCBpdCBpbiBxdWV1ZSBpZiB0aGVyZSdzCisJCSAgIG5vdCBhbHJlYWR5IHRvbyBtYW55IHRoaW5ncyBpbiB0aGUgcXVldWUuICovCisJCXJlY3ZfbXNnID0gaXBtaV9hbGxvY19yZWN2X21zZygpOworCQlpZiAoISByZWN2X21zZykgeworCQkJLyogV2UgY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHNvIHJlcXVldWUgaXQgZm9yIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlci4gKi8KKwkJCXJ2ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY29weV9ldmVudF9pbnRvX3JlY3ZfbXNnKHJlY3ZfbXNnLCBtc2cpOworCQlsaXN0X2FkZF90YWlsKCYocmVjdl9tc2ctPmxpbmspLCAmKGludGYtPndhaXRpbmdfZXZlbnRzKSk7CisJfSBlbHNlIHsKKwkJLyogVGhlcmUncyB0b28gbWFueSB0aGluZ3MgaW4gdGhlIHF1ZXVlLCBkaXNjYXJkIHRoaXMKKwkJICAgbWVzc2FnZS4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkV2ZW50IHF1ZXVlIGZ1bGwsIGRpc2NhcmRpbmcgYW4iCisJCSAgICAgICAiIGluY29taW5nIGV2ZW50XG4iKTsKKwl9CisKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPmV2ZW50c19sb2NrKSwgZmxhZ3MpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGhhbmRsZV9ibWNfcnNwKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCSAgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZzsKKwlpbnQgICAgICAgICAgICAgICAgICBmb3VuZCA9IDA7CisJc3RydWN0IGlwbWlfdXNlciAgICAgKnVzZXI7CisJdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7CisKKwlyZWN2X21zZyA9IChzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqKSBtc2ctPnVzZXJfZGF0YTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgdXNlciBzdGlsbCBleGlzdHMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1c2VyLCAmKGludGYtPnVzZXJzKSwgbGluaykgeworCQlpZiAodXNlciA9PSByZWN2X21zZy0+dXNlcikgeworCQkJLyogRm91bmQgaXQsIHNvIHdlIGNhbiBkZWxpdmVyIGl0ICovCisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZm91bmQpIHsKKwkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgTlVMTCB1c2Vycy4gKi8KKwkJaWYgKCFyZWN2X21zZy0+dXNlciAmJiBpbnRmLT5udWxsX3VzZXJfaGFuZGxlcil7CisJCQlpbnRmLT5udWxsX3VzZXJfaGFuZGxlcihpbnRmLCBtc2cpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+aGFuZGxlZF9sb2NhbF9yZXNwb25zZXMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQl9ZWxzZXsKKwkJCS8qIFRoZSB1c2VyIGZvciB0aGUgbWVzc2FnZSB3ZW50IGF3YXksIHNvIGdpdmUgdXAuICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT51bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlpcG1pX2ZyZWVfcmVjdl9tc2cocmVjdl9tc2cpOworCX0gZWxzZSB7CisJCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc21pX2FkZHI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmVjdl9tc2ctPnJlY3ZfdHlwZSA9IElQTUlfUkVTUE9OU0VfUkVDVl9UWVBFOworCQlyZWN2X21zZy0+bXNnaWQgPSBtc2ctPm1zZ2lkOworCQlzbWlfYWRkciA9ICgoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICopCisJCQkgICAgJihyZWN2X21zZy0+YWRkcikpOworCQlzbWlfYWRkci0+YWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKwkJc21pX2FkZHItPmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCQlzbWlfYWRkci0+bHVuID0gbXNnLT5yc3BbMF0gJiAzOworCQlyZWN2X21zZy0+bXNnLm5ldGZuID0gbXNnLT5yc3BbMF0gPj4gMjsKKwkJcmVjdl9tc2ctPm1zZy5jbWQgPSBtc2ctPnJzcFsxXTsKKwkJbWVtY3B5KHJlY3ZfbXNnLT5tc2dfZGF0YSwKKwkJICAgICAgICYobXNnLT5yc3BbMl0pLAorCQkgICAgICAgbXNnLT5yc3Bfc2l6ZSAtIDIpOworCQlyZWN2X21zZy0+bXNnLmRhdGEgPSByZWN2X21zZy0+bXNnX2RhdGE7CisJCXJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4gPSBtc2ctPnJzcF9zaXplIC0gMjsKKwkJZGVsaXZlcl9yZXNwb25zZShyZWN2X21zZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSBhIG5ldyBtZXNzYWdlLiAgUmV0dXJuIDEgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHJlcXVldWVkLAorICAgMCBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZnJlZWQsIG9yIC0xIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBub3QKKyAgIGJlIGZyZWVkIG9yIHJlcXVldWVkLiAqLworc3RhdGljIGludCBoYW5kbGVfbmV3X3JlY3ZfbXNnKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCSAgICAgICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJaW50IHJlcXVldWU7CisJaW50IGNoYW47CisKKyNpZmRlZiBERUJVR19NU0dJTkcKKwlpbnQgbTsKKwlwcmludGsoIlJlY3Y6Iik7CisJZm9yIChtPTA7IG08bXNnLT5yc3Bfc2l6ZTsgbSsrKQorCQlwcmludGsoIiAlMi4yeCIsIG1zZy0+cnNwW21dKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlpZiAobXNnLT5yc3Bfc2l6ZSA8IDIpIHsKKwkJLyogTWVzc2FnZSBpcyB0b28gc21hbGwgdG8gYmUgY29ycmVjdC4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkJNQyByZXR1cm5lZCB0byBzbWFsbCBhIG1lc3NhZ2UiCisJCSAgICAgICAiIGZvciBuZXRmbiAleCBjbWQgJXgsIGdvdCAlZCBieXRlc1xuIiwKKwkJICAgICAgIChtc2ctPmRhdGFbMF0gPj4gMikgfCAxLCBtc2ctPmRhdGFbMV0sIG1zZy0+cnNwX3NpemUpOworCisJCS8qIEdlbmVyYXRlIGFuIGVycm9yIHJlc3BvbnNlIGZvciB0aGUgbWVzc2FnZS4gKi8KKwkJbXNnLT5yc3BbMF0gPSBtc2ctPmRhdGFbMF0gfCAoMSA8PCAyKTsKKwkJbXNnLT5yc3BbMV0gPSBtc2ctPmRhdGFbMV07CisJCW1zZy0+cnNwWzJdID0gSVBNSV9FUlJfVU5TUEVDSUZJRUQ7CisJCW1zZy0+cnNwX3NpemUgPSAzOworCX0gZWxzZSBpZiAoKChtc2ctPnJzcFswXSA+PiAyKSAhPSAoKG1zZy0+ZGF0YVswXSA+PiAyKSB8IDEpKS8qIE5ldGZuICovCisJCSAgIHx8IChtc2ctPnJzcFsxXSAhPSBtc2ctPmRhdGFbMV0pKQkJICAvKiBDb21tYW5kICovCisJeworCQkvKiBUaGUgcmVzcG9uc2UgaXMgbm90IGV2ZW4gbWFyZ2luYWxseSBjb3JyZWN0LiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQk1DIHJldHVybmVkIGluY29ycmVjdCByZXNwb25zZSwiCisJCSAgICAgICAiIGV4cGVjdGVkIG5ldGZuICV4IGNtZCAleCwgZ290IG5ldGZuICV4IGNtZCAleFxuIiwKKwkJICAgICAgIChtc2ctPmRhdGFbMF0gPj4gMikgfCAxLCBtc2ctPmRhdGFbMV0sCisJCSAgICAgICBtc2ctPnJzcFswXSA+PiAyLCBtc2ctPnJzcFsxXSk7CisKKwkJLyogR2VuZXJhdGUgYW4gZXJyb3IgcmVzcG9uc2UgZm9yIHRoZSBtZXNzYWdlLiAqLworCQltc2ctPnJzcFswXSA9IG1zZy0+ZGF0YVswXSB8ICgxIDw8IDIpOworCQltc2ctPnJzcFsxXSA9IG1zZy0+ZGF0YVsxXTsKKwkJbXNnLT5yc3BbMl0gPSBJUE1JX0VSUl9VTlNQRUNJRklFRDsKKwkJbXNnLT5yc3Bfc2l6ZSA9IDM7CisJfQorCisJaWYgKChtc2ctPnJzcFswXSA9PSAoKElQTUlfTkVURk5fQVBQX1JFUVVFU1R8MSkgPDwgMikpCisJICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX1NFTkRfTVNHX0NNRCkKKwkgICAgJiYgKG1zZy0+dXNlcl9kYXRhICE9IE5VTEwpKQorCXsKKwkJLyogSXQncyBhIHJlc3BvbnNlIHRvIGEgcmVzcG9uc2Ugd2Ugc2VudC4gIEZvciB0aGlzIHdlCisJCSAgIGRlbGl2ZXIgYSBzZW5kIG1lc3NhZ2UgcmVzcG9uc2UgdG8gdGhlIHVzZXIuICovCisJCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZyA9IG1zZy0+dXNlcl9kYXRhOworCisJCXJlcXVldWUgPSAwOworCQlpZiAobXNnLT5yc3Bfc2l6ZSA8IDIpCisJCQkvKiBNZXNzYWdlIGlzIHRvbyBzbWFsbCB0byBiZSBjb3JyZWN0LiAqLworCQkJZ290byBvdXQ7CisKKwkJY2hhbiA9IG1zZy0+ZGF0YVsyXSAmIDB4MGY7CisJCWlmIChjaGFuID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQkJLyogSW52YWxpZCBjaGFubmVsIG51bWJlciAqLworCQkJZ290byBvdXQ7CisKKwkJaWYgKHJlY3ZfbXNnKSB7CisJCQlyZWN2X21zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRVNQT05TRV9UWVBFOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IDE7CisJCQlyZWN2X21zZy0+bXNnX2RhdGFbMF0gPSBtc2ctPnJzcFsyXTsKKwkJCWRlbGl2ZXJfcmVzcG9uc2UocmVjdl9tc2cpOworCQl9CisJfSBlbHNlIGlmICgobXNnLT5yc3BbMF0gPT0gKChJUE1JX05FVEZOX0FQUF9SRVFVRVNUfDEpIDw8IDIpKQorCQkgICAmJiAobXNnLT5yc3BbMV0gPT0gSVBNSV9HRVRfTVNHX0NNRCkpCisJeworCQkvKiBJdCdzIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuICovCisJCWNoYW4gPSBtc2ctPnJzcFszXSAmIDB4ZjsKKwkJaWYgKGNoYW4gPj0gSVBNSV9NQVhfQ0hBTk5FTFMpIHsKKwkJCS8qIEludmFsaWQgY2hhbm5lbCBudW1iZXIgKi8KKwkJCXJlcXVldWUgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzd2l0Y2ggKGludGYtPmNoYW5uZWxzW2NoYW5dLm1lZGl1bSkgeworCQljYXNlIElQTUlfQ0hBTk5FTF9NRURJVU1fSVBNQjoKKwkJCWlmIChtc2ctPnJzcFs0XSAmIDB4MDQpIHsKKwkJCQkvKiBJdCdzIGEgcmVzcG9uc2UsIHNvIGZpbmQgdGhlCisJCQkJICAgcmVxdWVzdGluZyBtZXNzYWdlIGFuZCBzZW5kIGl0IHVwLiAqLworCQkJCXJlcXVldWUgPSBoYW5kbGVfaXBtYl9nZXRfbXNnX3JzcChpbnRmLCBtc2cpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJdCdzIGEgY29tbWFuZCB0byB0aGUgU01TIGZyb20gc29tZSBvdGhlcgorCQkJCSAgIGVudGl0eS4gIEhhbmRsZSB0aGF0LiAqLworCQkJCXJlcXVldWUgPSBoYW5kbGVfaXBtYl9nZXRfbXNnX2NtZChpbnRmLCBtc2cpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJUE1JX0NIQU5ORUxfTUVESVVNXzgwMjNMQU46CisJCWNhc2UgSVBNSV9DSEFOTkVMX01FRElVTV9BU1lOQzoKKwkJCWlmIChtc2ctPnJzcFs2XSAmIDB4MDQpIHsKKwkJCQkvKiBJdCdzIGEgcmVzcG9uc2UsIHNvIGZpbmQgdGhlCisJCQkJICAgcmVxdWVzdGluZyBtZXNzYWdlIGFuZCBzZW5kIGl0IHVwLiAqLworCQkJCXJlcXVldWUgPSBoYW5kbGVfbGFuX2dldF9tc2dfcnNwKGludGYsIG1zZyk7CisJCQl9IGVsc2UgeworCQkJCS8qIEl0J3MgYSBjb21tYW5kIHRvIHRoZSBTTVMgZnJvbSBzb21lIG90aGVyCisJCQkJICAgZW50aXR5LiAgSGFuZGxlIHRoYXQuICovCisJCQkJcmVxdWV1ZSA9IGhhbmRsZV9sYW5fZ2V0X21zZ19jbWQoaW50ZiwgbXNnKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBXZSBkb24ndCBoYW5kbGUgdGhlIGNoYW5uZWwgdHlwZSwgc28ganVzdAorCQkJICogZnJlZSB0aGUgbWVzc2FnZS4gKi8KKwkJCXJlcXVldWUgPSAwOworCQl9CisKKwl9IGVsc2UgaWYgKChtc2ctPnJzcFswXSA9PSAoKElQTUlfTkVURk5fQVBQX1JFUVVFU1R8MSkgPDwgMikpCisJCSAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX1JFQURfRVZFTlRfTVNHX0JVRkZFUl9DTUQpKQorCXsKKwkJLyogSXQncyBhbiBhc3luY3Jvbm91cyBldmVudC4gKi8KKwkJcmVxdWV1ZSA9IGhhbmRsZV9yZWFkX2V2ZW50X3JzcChpbnRmLCBtc2cpOworCX0gZWxzZSB7CisJCS8qIEl0J3MgYSByZXNwb25zZSBmcm9tIHRoZSBsb2NhbCBCTUMuICovCisJCXJlcXVldWUgPSBoYW5kbGVfYm1jX3JzcChpbnRmLCBtc2cpOworCX0KKworIG91dDoKKwlyZXR1cm4gcmVxdWV1ZTsKK30KKworLyogSGFuZGxlIGEgbmV3IG1lc3NhZ2UgZnJvbSB0aGUgbG93ZXIgbGF5ZXIuICovCit2b2lkIGlwbWlfc21pX21zZ19yZWNlaXZlZChpcG1pX3NtaV90ICAgICAgICAgIGludGYsCisJCQkgICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgICAgICAgIHJ2OworCisKKwkvKiBMb2NrIHRoZSB1c2VyIGxvY2sgc28gdGhlIHVzZXIgY2FuJ3QgZ28gYXdheSB3aGlsZSB3ZSBhcmUKKwkgICB3b3JraW5nIG9uIGl0LiAqLworCXJlYWRfbG9jaygmKGludGYtPnVzZXJzX2xvY2spKTsKKworCWlmICgobXNnLT5kYXRhX3NpemUgPj0gMikKKwkgICAgJiYgKG1zZy0+ZGF0YVswXSA9PSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKSkKKwkgICAgJiYgKG1zZy0+ZGF0YVsxXSA9PSBJUE1JX1NFTkRfTVNHX0NNRCkKKwkgICAgJiYgKG1zZy0+dXNlcl9kYXRhID09IE5VTEwpKSB7CisJCS8qIFRoaXMgaXMgdGhlIGxvY2FsIHJlc3BvbnNlIHRvIGEgY29tbWFuZCBzZW5kLCBzdGFydAorICAgICAgICAgICAgICAgICAgIHRoZSB0aW1lciBmb3IgdGhlc2UuICBUaGUgdXNlcl9kYXRhIHdpbGwgbm90IGJlCisgICAgICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIGlzIGEgcmVzcG9uc2Ugc2VuZCwgYW5kIHdlIHdpbGwgbGV0CisgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Ugc2VuZHMganVzdCBnbyB0aHJvdWdoLiAqLworCisJCS8qIENoZWNrIGZvciBlcnJvcnMsIGlmIHdlIGdldCBjZXJ0YWluIGVycm9ycyAob25lcworICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbiBiYXNpY2FsbHkgd2UgY2FuIHRyeSBhZ2FpbiBsYXRlciksIHdlCisgICAgICAgICAgICAgICAgICAgaWdub3JlIHRoZW0gYW5kIHN0YXJ0IHRoZSB0aW1lci4gIE90aGVyd2lzZSB3ZQorICAgICAgICAgICAgICAgICAgIHJlcG9ydCB0aGUgZXJyb3IgaW1tZWRpYXRlbHkuICovCisJCWlmICgobXNnLT5yc3Bfc2l6ZSA+PSAzKSAmJiAobXNnLT5yc3BbMl0gIT0gMCkKKwkJICAgICYmIChtc2ctPnJzcFsyXSAhPSBJUE1JX05PREVfQlVTWV9FUlIpCisJCSAgICAmJiAobXNnLT5yc3BbMl0gIT0gSVBNSV9MT1NUX0FSQklUUkFUSU9OX0VSUikpCisJCXsKKwkJCWludCBjaGFuID0gbXNnLT5yc3BbM10gJiAweGY7CisKKwkJCS8qIEdvdCBhbiBlcnJvciBzZW5kaW5nIHRoZSBtZXNzYWdlLCBoYW5kbGUgaXQuICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpZiAoY2hhbiA+PSBJUE1JX01BWF9DSEFOTkVMUykKKwkJCQk7IC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCQkJZWxzZSBpZiAoKGludGYtPmNoYW5uZWxzW2NoYW5dLm1lZGl1bQorCQkJCSAgPT0gSVBNSV9DSEFOTkVMX01FRElVTV84MDIzTEFOKQorCQkJCSB8fCAoaW50Zi0+Y2hhbm5lbHNbY2hhbl0ubWVkaXVtCisJCQkJICAgICA9PSBJUE1JX0NIQU5ORUxfTUVESVVNX0FTWU5DKSkKKwkJCQlpbnRmLT5zZW50X2xhbl9jb21tYW5kX2VycnMrKzsKKwkJCWVsc2UKKwkJCQlpbnRmLT5zZW50X2lwbWJfY29tbWFuZF9lcnJzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGZfZXJyX3NlcShpbnRmLCBtc2ctPm1zZ2lkLCBtc2ctPnJzcFsyXSk7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgbWVzc2FnZSB3YXMgc2VudCwgc3RhcnQgdGhlIHRpbWVyLiAqLworCQkJaW50Zl9zdGFydF9zZXFfdGltZXIoaW50ZiwgbXNnLT5tc2dpZCk7CisJCX0KKworCQlpcG1pX2ZyZWVfc21pX21zZyhtc2cpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogVG8gcHJlc2VydmUgbWVzc2FnZSBvcmRlciwgaWYgdGhlIGxpc3QgaXMgbm90IGVtcHR5LCB3ZQorICAgICAgICAgICB0YWNrIHRoaXMgbWVzc2FnZSBvbnRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jayksIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJihpbnRmLT53YWl0aW5nX21zZ3MpKSkgeworCQlsaXN0X2FkZF90YWlsKCYobXNnLT5saW5rKSwgJihpbnRmLT53YWl0aW5nX21zZ3MpKTsKKwkJc3Bpbl91bmxvY2soJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jaykpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jayksIGZsYWdzKTsKKwkJCisJcnYgPSBoYW5kbGVfbmV3X3JlY3ZfbXNnKGludGYsIG1zZyk7CisJaWYgKHJ2ID4gMCkgeworCQkvKiBDb3VsZCBub3QgaGFuZGxlIHRoZSBtZXNzYWdlIG5vdywganVzdCBhZGQgaXQgdG8gYQorICAgICAgICAgICAgICAgICAgIGxpc3QgdG8gaGFuZGxlIGxhdGVyLiAqLworCQlzcGluX2xvY2soJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jaykpOworCQlsaXN0X2FkZF90YWlsKCYobXNnLT5saW5rKSwgJihpbnRmLT53YWl0aW5nX21zZ3MpKTsKKwkJc3Bpbl91bmxvY2soJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jaykpOworCX0gZWxzZSBpZiAocnYgPT0gMCkgeworCQlpcG1pX2ZyZWVfc21pX21zZyhtc2cpOworCX0KKworIG91dF91bmxvY2s6CisJcmVhZF91bmxvY2soJihpbnRmLT51c2Vyc19sb2NrKSk7Cit9CisKK3ZvaWQgaXBtaV9zbWlfd2F0Y2hkb2dfcHJldGltZW91dChpcG1pX3NtaV90IGludGYpCit7CisJaXBtaV91c2VyX3QgdXNlcjsKKworCXJlYWRfbG9jaygmKGludGYtPnVzZXJzX2xvY2spKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVzZXIsICYoaW50Zi0+dXNlcnMpLCBsaW5rKSB7CisJCWlmICghIHVzZXItPmhhbmRsZXItPmlwbWlfd2F0Y2hkb2dfcHJldGltZW91dCkKKwkJCWNvbnRpbnVlOworCisJCXVzZXItPmhhbmRsZXItPmlwbWlfd2F0Y2hkb2dfcHJldGltZW91dCh1c2VyLT5oYW5kbGVyX2RhdGEpOworCX0KKwlyZWFkX3VubG9jaygmKGludGYtPnVzZXJzX2xvY2spKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9tc2dfdGltZW91dChzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQoreworCW1zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRUNWX1RZUEU7CisJbXNnLT5tc2dfZGF0YVswXSA9IElQTUlfVElNRU9VVF9DT01QTEVUSU9OX0NPREU7CisJbXNnLT5tc2cubmV0Zm4gfD0gMTsgLyogQ29udmVydCB0byBhIHJlc3BvbnNlLiAqLworCW1zZy0+bXNnLmRhdGFfbGVuID0gMTsKKwltc2ctPm1zZy5kYXRhID0gbXNnLT5tc2dfZGF0YTsKKwlkZWxpdmVyX3Jlc3BvbnNlKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2Zyb21fcmVjdl9tc2coaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcmVjdl9tc2csCisJCSAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKnNtaV9tc2csCisJCSAgIHVuc2lnbmVkIGNoYXIgc2VxLCBsb25nIHNlcWlkKQoreworCWlmICghc21pX21zZykKKwkJc21pX21zZyA9IGlwbWlfYWxsb2Nfc21pX21zZygpOworCWlmICghc21pX21zZykKKwkJLyogSWYgd2UgY2FuJ3QgYWxsb2NhdGUgdGhlIG1lc3NhZ2UsIHRoZW4ganVzdCByZXR1cm4sIHdlCisJCSAgIGdldCA0IHJldHJpZXMsIHNvIHRoaXMgc2hvdWxkIGJlIG9rLiAqLworCQlyZXR1cm47CisKKwltZW1jcHkoc21pX21zZy0+ZGF0YSwgcmVjdl9tc2ctPm1zZy5kYXRhLCByZWN2X21zZy0+bXNnLmRhdGFfbGVuKTsKKwlzbWlfbXNnLT5kYXRhX3NpemUgPSByZWN2X21zZy0+bXNnLmRhdGFfbGVuOworCXNtaV9tc2ctPm1zZ2lkID0gU1RPUkVfU0VRX0lOX01TR0lEKHNlcSwgc2VxaWQpOworCQkKKwkvKiBTZW5kIHRoZSBuZXcgbWVzc2FnZS4gIFdlIHNlbmQgd2l0aCBhIHplcm8gcHJpb3JpdHkuICBJdAorCSAgIHRpbWVkIG91dCwgSSBkb3VidCB0aW1lIGlzIHRoYXQgY3JpdGljYWwgbm93LCBhbmQgaGlnaAorCSAgIHByaW9yaXR5IG1lc3NhZ2VzIGFyZSByZWFsbHkgb25seSBmb3IgbWVzc2FnZXMgdG8gdGhlIGxvY2FsCisJICAgTUMsIHdoaWNoIGRvbid0IGdldCByZXNlbnQuICovCisJaW50Zi0+aGFuZGxlcnMtPnNlbmRlcihpbnRmLT5zZW5kX2luZm8sIHNtaV9tc2csIDApOworCisjaWZkZWYgREVCVUdfTVNHSU5HCisJeworCQlpbnQgbTsKKwkJcHJpbnRrKCJSZXNlbmQ6ICIpOworCQlmb3IgKG09MDsgbTxzbWlfbXNnLT5kYXRhX3NpemU7IG0rKykKKwkJCXByaW50aygiICUyLjJ4Iiwgc21pX21zZy0+ZGF0YVttXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2lwbWlfdGltZW91dF9oYW5kbGVyKGxvbmcgdGltZW91dF9wZXJpb2QpCit7CisJaXBtaV9zbWlfdCAgICAgICAgICAgaW50ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICB0aW1lb3V0czsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLCAqbXNnMjsKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICAqc21pX21zZywgKnNtaV9tc2cyOworCXVuc2lnbmVkIGxvbmcgICAgICAgIGZsYWdzOworCWludCAgICAgICAgICAgICAgICAgIGksIGo7CisKKwlJTklUX0xJU1RfSEVBRCgmdGltZW91dHMpOworCisJc3Bpbl9sb2NrKCZpbnRlcmZhY2VzX2xvY2spOworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOworCQlpZiAoaW50ZiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcmVhZF9sb2NrKCYoaW50Zi0+dXNlcnNfbG9jaykpOworCisJCS8qIFNlZSBpZiBhbnkgd2FpdGluZyBtZXNzYWdlcyBuZWVkIHRvIGJlIHByb2Nlc3NlZC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jayksIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNtaV9tc2csIHNtaV9tc2cyLCAmKGludGYtPndhaXRpbmdfbXNncyksIGxpbmspIHsKKwkJCWlmICghIGhhbmRsZV9uZXdfcmVjdl9tc2coaW50Ziwgc21pX21zZykpIHsKKwkJCQlsaXN0X2RlbCgmc21pX21zZy0+bGluayk7CisJCQkJaXBtaV9mcmVlX3NtaV9tc2coc21pX21zZyk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRvIHByZXNlcnZlIG1lc3NhZ2Ugb3JkZXIsIHF1aXQgaWYgd2UKKwkJCQkgICBjYW4ndCBoYW5kbGUgYSBtZXNzYWdlLiAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT53YWl0aW5nX21zZ3NfbG9jayksIGZsYWdzKTsKKworCQkvKiBHbyB0aHJvdWdoIHRoZSBzZXEgdGFibGUgYW5kIGZpbmQgYW55IG1lc3NhZ2VzIHRoYXQKKwkJICAgaGF2ZSB0aW1lZCBvdXQsIHB1dHRpbmcgdGhlbSBpbiB0aGUgdGltZW91dHMKKwkJICAgbGlzdC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKwkJZm9yIChqPTA7IGo8SVBNSV9JUE1CX05VTV9TRVE7IGorKykgeworCQkJc3RydWN0IHNlcV90YWJsZSAqZW50ID0gJihpbnRmLT5zZXFfdGFibGVbal0pOworCQkJaWYgKCFlbnQtPmludXNlKQorCQkJCWNvbnRpbnVlOworCisJCQllbnQtPnRpbWVvdXQgLT0gdGltZW91dF9wZXJpb2Q7CisJCQlpZiAoZW50LT50aW1lb3V0ID4gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGVudC0+cmV0cmllc19sZWZ0ID09IDApIHsKKwkJCQkvKiBUaGUgbWVzc2FnZSBoYXMgdXNlZCBhbGwgaXRzIHJldHJpZXMuICovCisJCQkJZW50LT5pbnVzZSA9IDA7CisJCQkJbXNnID0gZW50LT5yZWN2X21zZzsKKwkJCQlsaXN0X2FkZF90YWlsKCYobXNnLT5saW5rKSwgJnRpbWVvdXRzKTsKKwkJCQlzcGluX2xvY2soJmludGYtPmNvdW50ZXJfbG9jayk7CisJCQkJaWYgKGVudC0+YnJvYWRjYXN0KQorCQkJCQlpbnRmLT50aW1lZF9vdXRfaXBtYl9icm9hZGNhc3RzKys7CisJCQkJZWxzZSBpZiAoZW50LT5yZWN2X21zZy0+YWRkci5hZGRyX3R5cGUKKwkJCQkJID09IElQTUlfTEFOX0FERFJfVFlQRSkKKwkJCQkJaW50Zi0+dGltZWRfb3V0X2xhbl9jb21tYW5kcysrOworCQkJCWVsc2UKKwkJCQkJaW50Zi0+dGltZWRfb3V0X2lwbWJfY29tbWFuZHMrKzsKKwkJCQlzcGluX3VubG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTW9yZSByZXRyaWVzLCBzZW5kIGFnYWluLiAqLworCisJCQkJLyogU3RhcnQgd2l0aCB0aGUgbWF4IHRpbWVyLCBzZXQgdG8gbm9ybWFsCisJCQkJICAgdGltZXIgYWZ0ZXIgdGhlIG1lc3NhZ2UgaXMgc2VudC4gKi8KKwkJCQllbnQtPnRpbWVvdXQgPSBNQVhfTVNHX1RJTUVPVVQ7CisJCQkJZW50LT5yZXRyaWVzX2xlZnQtLTsKKwkJCQlzZW5kX2Zyb21fcmVjdl9tc2coaW50ZiwgZW50LT5yZWN2X21zZywgTlVMTCwKKwkJCQkJCSAgIGosIGVudC0+c2VxaWQpOworCQkJCXNwaW5fbG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKwkJCQlpZiAoZW50LT5yZWN2X21zZy0+YWRkci5hZGRyX3R5cGUKKwkJCQkgICAgPT0gSVBNSV9MQU5fQUREUl9UWVBFKQorCQkJCQlpbnRmLT5yZXRyYW5zbWl0dGVkX2xhbl9jb21tYW5kcysrOworCQkJCWVsc2UKKwkJCQkJaW50Zi0+cmV0cmFuc21pdHRlZF9pcG1iX2NvbW1hbmRzKys7CisJCQkJc3Bpbl91bmxvY2soJmludGYtPmNvdW50ZXJfbG9jayk7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZ0aW1lb3V0cywgbGluaykgeworCQkJaGFuZGxlX21zZ190aW1lb3V0KG1zZyk7CisJCX0KKworCQlyZWFkX3VubG9jaygmKGludGYtPnVzZXJzX2xvY2spKTsKKwl9CisJc3Bpbl91bmxvY2soJmludGVyZmFjZXNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcmVxdWVzdF9ldmVudCh2b2lkKQoreworCWlwbWlfc21pX3QgaW50ZjsKKwlpbnQgICAgICAgIGk7CisKKwlzcGluX2xvY2soJmludGVyZmFjZXNfbG9jayk7CisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWludGYgPSBpcG1pX2ludGVyZmFjZXNbaV07CisJCWlmIChpbnRmID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpbnRmLT5oYW5kbGVycy0+cmVxdWVzdF9ldmVudHMoaW50Zi0+c2VuZF9pbmZvKTsKKwl9CisJc3Bpbl91bmxvY2soJmludGVyZmFjZXNfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcG1pX3RpbWVyOworCisvKiBDYWxsIGV2ZXJ5IH4xMDAgbXMuICovCisjZGVmaW5lIElQTUlfVElNRU9VVF9USU1FCTEwMAorCisvKiBIb3cgbWFueSBqaWZmaWVzIGRvZXMgaXQgdGFrZSB0byBnZXQgdG8gdGhlIHRpbWVvdXQgdGltZS4gKi8KKyNkZWZpbmUgSVBNSV9USU1FT1VUX0pJRkZJRVMJKChJUE1JX1RJTUVPVVRfVElNRSAqIEhaKSAvIDEwMDApCisKKy8qIFJlcXVlc3QgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIGV2ZXJ5IHNlY29uZCAodGhpcyBpcyB0aGUgbnVtYmVyIG9mCisgICBJUE1JX1RJTUVPVVRfVElNRVMgYmV0d2VlbiBldmVudCByZXF1ZXN0cykuICBIb3BlZnVsbHksIGluIHRoZQorICAgZnV0dXJlLCBJUE1JIHdpbGwgYWRkIGEgd2F5IHRvIGtub3cgaW1tZWRpYXRlbHkgaWYgYW4gZXZlbnQgaXMgaW4KKyAgIHRoZSBxdWV1ZSBhbmQgdGhpcyBzaWxsaW5lc3MgY2FuIGdvIGF3YXkuICovCisjZGVmaW5lIElQTUlfUkVRVUVTVF9FVl9USU1FCSgxMDAwIC8gKElQTUlfVElNRU9VVF9USU1FKSkKKworc3RhdGljIHZvbGF0aWxlIGludCBzdG9wX29wZXJhdGlvbiA9IDA7CitzdGF0aWMgdm9sYXRpbGUgaW50IHRpbWVyX3N0b3BwZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB0aWNrc190b19yZXFfZXYgPSBJUE1JX1JFUVVFU1RfRVZfVElNRTsKKworc3RhdGljIHZvaWQgaXBtaV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpZiAoc3RvcF9vcGVyYXRpb24pIHsKKwkJdGltZXJfc3RvcHBlZCA9IDE7CisJCXJldHVybjsKKwl9CisKKwl0aWNrc190b19yZXFfZXYtLTsKKwlpZiAodGlja3NfdG9fcmVxX2V2ID09IDApIHsKKwkJaXBtaV9yZXF1ZXN0X2V2ZW50KCk7CisJCXRpY2tzX3RvX3JlcV9ldiA9IElQTUlfUkVRVUVTVF9FVl9USU1FOworCX0KKworCWlwbWlfdGltZW91dF9oYW5kbGVyKElQTUlfVElNRU9VVF9USU1FKTsKKworCWlwbWlfdGltZXIuZXhwaXJlcyArPSBJUE1JX1RJTUVPVVRfSklGRklFUzsKKwlhZGRfdGltZXIoJmlwbWlfdGltZXIpOworfQorCisKK3N0YXRpYyBhdG9taWNfdCBzbWlfbXNnX2ludXNlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgYXRvbWljX3QgcmVjdl9tc2dfaW51c2VfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworLyogRklYTUUgLSBjb252ZXJ0IHRoZXNlIHRvIHNsYWJzLiAqLworc3RhdGljIHZvaWQgZnJlZV9zbWlfbXNnKHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlhdG9taWNfZGVjKCZzbWlfbXNnX2ludXNlX2NvdW50KTsKKwlrZnJlZShtc2cpOworfQorCitzdHJ1Y3QgaXBtaV9zbWlfbXNnICppcG1pX2FsbG9jX3NtaV9tc2codm9pZCkKK3sKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICpydjsKKwlydiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcG1pX3NtaV9tc2cpLCBHRlBfQVRPTUlDKTsKKwlpZiAocnYpIHsKKwkJcnYtPmRvbmUgPSBmcmVlX3NtaV9tc2c7CisJCXJ2LT51c2VyX2RhdGEgPSBOVUxMOworCQlhdG9taWNfaW5jKCZzbWlfbXNnX2ludXNlX2NvdW50KTsKKwl9CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3JlY3ZfbXNnKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCit7CisJYXRvbWljX2RlYygmcmVjdl9tc2dfaW51c2VfY291bnQpOworCWtmcmVlKG1zZyk7Cit9CisKK3N0cnVjdCBpcG1pX3JlY3ZfbXNnICppcG1pX2FsbG9jX3JlY3ZfbXNnKHZvaWQpCit7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJ2OworCisJcnYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBtaV9yZWN2X21zZyksIEdGUF9BVE9NSUMpOworCWlmIChydikgeworCQlydi0+ZG9uZSA9IGZyZWVfcmVjdl9tc2c7CisJCWF0b21pY19pbmMoJnJlY3ZfbXNnX2ludXNlX2NvdW50KTsKKwl9CisJcmV0dXJuIHJ2OworfQorCisjaWZkZWYgQ09ORklHX0lQTUlfUEFOSUNfRVZFTlQKKworc3RhdGljIHZvaWQgZHVtbXlfc21pX2RvbmVfaGFuZGxlcihzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7Cit9CisKK3N0YXRpYyB2b2lkIGR1bW15X3JlY3ZfZG9uZV9oYW5kbGVyKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCit7Cit9CisKKyNpZmRlZiBDT05GSUdfSVBNSV9QQU5JQ19TVFJJTkcKK3N0YXRpYyB2b2lkIGV2ZW50X3JlY2VpdmVyX2ZldGNoZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJaWYgKChtc2ctPnJzcFswXSA9PSAoSVBNSV9ORVRGTl9TRU5TT1JfRVZFTlRfUkVTUE9OU0UgPDwgMikpCisJICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9FVkVOVF9SRUNFSVZFUl9DTUQpCisJICAgICYmIChtc2ctPnJzcFsyXSA9PSBJUE1JX0NDX05PX0VSUk9SKSkKKwl7CisJCS8qIEEgZ2V0IGV2ZW50IHJlY2VpdmVyIGNvbW1hbmQsIHNhdmUgaXQuICovCisJCWludGYtPmV2ZW50X3JlY2VpdmVyID0gbXNnLT5yc3BbM107CisJCWludGYtPmV2ZW50X3JlY2VpdmVyX2x1biA9IG1zZy0+cnNwWzRdICYgMHgzOworCX0KK30KKworc3RhdGljIHZvaWQgZGV2aWNlX2lkX2ZldGNoZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJaWYgKChtc2ctPnJzcFswXSA9PSAoSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UgPDwgMikpCisJICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01EKQorCSAgICAmJiAobXNnLT5yc3BbMl0gPT0gSVBNSV9DQ19OT19FUlJPUikpCisJeworCQkvKiBBIGdldCBkZXZpY2UgaWQgY29tbWFuZCwgc2F2ZSBpZiB3ZSBhcmUgYW4gZXZlbnQKKwkJICAgcmVjZWl2ZXIgb3IgZ2VuZXJhdG9yLiAqLworCQlpbnRmLT5sb2NhbF9zZWxfZGV2aWNlID0gKG1zZy0+cnNwWzhdID4+IDIpICYgMTsKKwkJaW50Zi0+bG9jYWxfZXZlbnRfZ2VuZXJhdG9yID0gKG1zZy0+cnNwWzhdID4+IDUpICYgMTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2VuZF9wYW5pY19ldmVudHMoY2hhciAqc3RyKQoreworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICBtc2c7CisJaXBtaV9zbWlfdCAgICAgICAgICAgICAgICAgICAgICAgIGludGY7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTZdOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc2k7CisJc3RydWN0IGlwbWlfYWRkciAgICAgICAgICAgICAgICAgIGFkZHI7CisJc3RydWN0IGlwbWlfc21pX21zZyAgICAgICAgICAgICAgIHNtaV9tc2c7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgICAgICAgICAgICAgIHJlY3ZfbXNnOworCisJc2kgPSAoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICopICZhZGRyOworCXNpLT5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCXNpLT5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKwlzaS0+bHVuID0gMDsKKworCS8qIEZpbGwgaW4gYW4gZXZlbnQgdGVsbGluZyB0aGF0IHdlIGhhdmUgZmFpbGVkLiAqLworCW1zZy5uZXRmbiA9IDB4MDQ7IC8qIFNlbnNvciBvciBFdmVudC4gKi8KKwltc2cuY21kID0gMjsgLyogUGxhdGZvcm0gZXZlbnQgY29tbWFuZC4gKi8KKwltc2cuZGF0YSA9IGRhdGE7CisJbXNnLmRhdGFfbGVuID0gODsKKwlkYXRhWzBdID0gMHgyMTsgLyogS2VybmVsIGdlbmVyYXRvciBJRCwgSVBNSSB0YWJsZSA1LTQgKi8KKwlkYXRhWzFdID0gMHgwMzsgLyogVGhpcyBpcyBmb3IgSVBNSSAxLjAuICovCisJZGF0YVsyXSA9IDB4MjA7IC8qIE9TIENyaXRpY2FsIFN0b3AsIElQTUkgdGFibGUgMzYtMyAqLworCWRhdGFbNF0gPSAweDZmOyAvKiBTZW5zb3Igc3BlY2lmaWMsIElQTUkgdGFibGUgMzYtMSAqLworCWRhdGFbNV0gPSAweGExOyAvKiBSdW50aW1lIHN0b3AgT0VNIGJ5dGVzIDIgJiAzLiAqLworCisJLyogUHV0IGEgZmV3IGJyZWFkY3J1bWJzIGluLiAgSG9wZWZ1bGx5IGxhdGVyIHdlIGNhbiBhZGQgbW9yZSB0aGluZ3MKKwkgICB0byBtYWtlIHRoZSBwYW5pYyBldmVudHMgbW9yZSB1c2VmdWwuICovCisJaWYgKHN0cikgeworCQlkYXRhWzNdID0gc3RyWzBdOworCQlkYXRhWzZdID0gc3RyWzFdOworCQlkYXRhWzddID0gc3RyWzJdOworCX0KKworCXNtaV9tc2cuZG9uZSA9IGR1bW15X3NtaV9kb25lX2hhbmRsZXI7CisJcmVjdl9tc2cuZG9uZSA9IGR1bW15X3JlY3ZfZG9uZV9oYW5kbGVyOworCisJLyogRm9yIGV2ZXJ5IHJlZ2lzdGVyZWQgaW50ZXJmYWNlLCBzZW5kIHRoZSBldmVudC4gKi8KKwlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKKwkJaWYgKGludGYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNlbmQgdGhlIGV2ZW50IGFubm91bmNpbmcgdGhlIHBhbmljLiAqLworCQlpbnRmLT5oYW5kbGVycy0+c2V0X3J1bl90b19jb21wbGV0aW9uKGludGYtPnNlbmRfaW5mbywgMSk7CisJCWlfaXBtaV9yZXF1ZXN0KE5VTEwsCisJCQkgICAgICAgaW50ZiwKKwkJCSAgICAgICAmYWRkciwKKwkJCSAgICAgICAwLAorCQkJICAgICAgICZtc2csCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICAmc21pX21zZywKKwkJCSAgICAgICAmcmVjdl9tc2csCisJCQkgICAgICAgMCwKKwkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAorCQkJICAgICAgIGludGYtPm15X2x1biwKKwkJCSAgICAgICAwLCAxKTsgLyogRG9uJ3QgcmV0cnksIGFuZCBkb24ndCB3YWl0LiAqLworCX0KKworI2lmZGVmIENPTkZJR19JUE1JX1BBTklDX1NUUklORworCS8qIE9uIGV2ZXJ5IGludGVyZmFjZSwgZHVtcCBhIGJ1bmNoIG9mIE9FTSBldmVudCBob2xkaW5nIHRoZQorCSAgIHN0cmluZy4gKi8KKwlpZiAoIXN0cikgCisJCXJldHVybjsKKworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQljaGFyICAgICAgICAgICAgICAgICAgKnAgPSBzdHI7CisJCXN0cnVjdCBpcG1pX2lwbWJfYWRkciAqaXBtYjsKKwkJaW50ICAgICAgICAgICAgICAgICAgIGo7CisKKwkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKKwkJaWYgKGludGYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZpcnN0IGpvYiBoZXJlIGlzIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZCB0aGUKKwkJICAgT0VNIGV2ZW50cy4gIFRoZXJlJ3Mgbm8gd2F5IGluIElQTUkgdG8gc2VuZCBPRU0KKwkJICAgZXZlbnRzIHVzaW5nIGFuIGV2ZW50IHNlbmQgY29tbWFuZCwgc28gd2UgaGF2ZSB0bworCQkgICBmaW5kIHRoZSBTRUwgdG8gcHV0IHRoZW0gaW4gYW5kIHN0aWNrIHRoZW0gaW4KKwkJICAgdGhlcmUuICovCisKKwkJLyogR2V0IGNhcGFiaWxpdGllcyBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkLiAqLworCQlpbnRmLT5sb2NhbF9zZWxfZGV2aWNlID0gMDsKKwkJaW50Zi0+bG9jYWxfZXZlbnRfZ2VuZXJhdG9yID0gMDsKKwkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgPSAwOworCisJCS8qIFJlcXVlc3QgdGhlIGRldmljZSBpbmZvIGZyb20gdGhlIGxvY2FsIE1DLiAqLworCQltc2cubmV0Zm4gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUOworCQltc2cuY21kID0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRDsKKwkJbXNnLmRhdGEgPSBOVUxMOworCQltc2cuZGF0YV9sZW4gPSAwOworCQlpbnRmLT5udWxsX3VzZXJfaGFuZGxlciA9IGRldmljZV9pZF9mZXRjaGVyOworCQlpX2lwbWlfcmVxdWVzdChOVUxMLAorCQkJICAgICAgIGludGYsCisJCQkgICAgICAgJmFkZHIsCisJCQkgICAgICAgMCwKKwkJCSAgICAgICAmbXNnLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgJnNtaV9tc2csCisJCQkgICAgICAgJnJlY3ZfbXNnLAorCQkJICAgICAgIDAsCisJCQkgICAgICAgaW50Zi0+bXlfYWRkcmVzcywKKwkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkgICAgICAgMCwgMSk7IC8qIERvbid0IHJldHJ5LCBhbmQgZG9uJ3Qgd2FpdC4gKi8KKworCQlpZiAoaW50Zi0+bG9jYWxfZXZlbnRfZ2VuZXJhdG9yKSB7CisJCQkvKiBSZXF1ZXN0IHRoZSBldmVudCByZWNlaXZlciBmcm9tIHRoZSBsb2NhbCBNQy4gKi8KKwkJCW1zZy5uZXRmbiA9IElQTUlfTkVURk5fU0VOU09SX0VWRU5UX1JFUVVFU1Q7CisJCQltc2cuY21kID0gSVBNSV9HRVRfRVZFTlRfUkVDRUlWRVJfQ01EOworCQkJbXNnLmRhdGEgPSBOVUxMOworCQkJbXNnLmRhdGFfbGVuID0gMDsKKwkJCWludGYtPm51bGxfdXNlcl9oYW5kbGVyID0gZXZlbnRfcmVjZWl2ZXJfZmV0Y2hlcjsKKwkJCWlfaXBtaV9yZXF1ZXN0KE5VTEwsCisJCQkJICAgICAgIGludGYsCisJCQkJICAgICAgICZhZGRyLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICAmbXNnLAorCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICAmc21pX21zZywKKwkJCQkgICAgICAgJnJlY3ZfbXNnLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAorCQkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkJICAgICAgIDAsIDEpOyAvKiBubyByZXRyeSwgYW5kIG5vIHdhaXQuICovCisJCX0KKwkJaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIgPSBOVUxMOworCisJCS8qIFZhbGlkYXRlIHRoZSBldmVudCByZWNlaXZlci4gIFRoZSBsb3cgYml0IG11c3Qgbm90CisJCSAgIGJlIDEgKGl0IG11c3QgYmUgYSB2YWxpZCBJUE1CIGFkZHJlc3MpLCBpdCBjYW5ub3QKKwkJICAgYmUgemVybywgYW5kIGl0IG11c3Qgbm90IGJlIG15IGFkZHJlc3MuICovCisgICAgICAgICAgICAgICAgaWYgKCgoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgJiAxKSA9PSAwKQorCQkgICAgJiYgKGludGYtPmV2ZW50X3JlY2VpdmVyICE9IDApCisJCSAgICAmJiAoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgIT0gaW50Zi0+bXlfYWRkcmVzcykpCisJCXsKKwkJCS8qIFRoZSBldmVudCByZWNlaXZlciBpcyB2YWxpZCwgc2VuZCBhbiBJUE1CCisJCQkgICBtZXNzYWdlLiAqLworCQkJaXBtYiA9IChzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKikgJmFkZHI7CisJCQlpcG1iLT5hZGRyX3R5cGUgPSBJUE1JX0lQTUJfQUREUl9UWVBFOworCQkJaXBtYi0+Y2hhbm5lbCA9IDA7IC8qIEZJWE1FIC0gaXMgdGhpcyByaWdodD8gKi8KKwkJCWlwbWItPmx1biA9IGludGYtPmV2ZW50X3JlY2VpdmVyX2x1bjsKKwkJCWlwbWItPnNsYXZlX2FkZHIgPSBpbnRmLT5ldmVudF9yZWNlaXZlcjsKKwkJfSBlbHNlIGlmIChpbnRmLT5sb2NhbF9zZWxfZGV2aWNlKSB7CisJCQkvKiBUaGUgZXZlbnQgcmVjZWl2ZXIgd2FzIG5vdCB2YWxpZCAob3Igd2FzCisJCQkgICBtZSksIGJ1dCBJIGFtIGFuIFNFTCBkZXZpY2UsIGp1c3QgZHVtcCBpdAorCQkJICAgaW4gbXkgU0VMLiAqLworCQkJc2kgPSAoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICopICZhZGRyOworCQkJc2ktPmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJCQlzaS0+Y2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisJCQlzaS0+bHVuID0gMDsKKwkJfSBlbHNlCisJCQljb250aW51ZTsgLyogTm8gd2hlcmUgdG8gc2VuZCB0aGUgZXZlbnQuICovCisKKwkJCisJCW1zZy5uZXRmbiA9IElQTUlfTkVURk5fU1RPUkFHRV9SRVFVRVNUOyAvKiBTdG9yYWdlLiAqLworCQltc2cuY21kID0gSVBNSV9BRERfU0VMX0VOVFJZX0NNRDsKKwkJbXNnLmRhdGEgPSBkYXRhOworCQltc2cuZGF0YV9sZW4gPSAxNjsKKworCQlqID0gMDsKKwkJd2hpbGUgKCpwKSB7CisJCQlpbnQgc2l6ZSA9IHN0cmxlbihwKTsKKworCQkJaWYgKHNpemUgPiAxMSkKKwkJCQlzaXplID0gMTE7CisJCQlkYXRhWzBdID0gMDsKKwkJCWRhdGFbMV0gPSAwOworCQkJZGF0YVsyXSA9IDB4ZjA7IC8qIE9FTSBldmVudCB3aXRob3V0IHRpbWVzdGFtcC4gKi8KKwkJCWRhdGFbM10gPSBpbnRmLT5teV9hZGRyZXNzOworCQkJZGF0YVs0XSA9IGorKzsgLyogc2VxdWVuY2UgIyAqLworCQkJLyogQWx3YXlzIGdpdmUgMTEgYnl0ZXMsIHNvIHN0cm5jcHkgd2lsbCBmaWxsCisJCQkgICBpdCB3aXRoIHplcm9lcyBmb3IgbWUuICovCisJCQlzdHJuY3B5KGRhdGErNSwgcCwgMTEpOworCQkJcCArPSBzaXplOworCisJCQlpX2lwbWlfcmVxdWVzdChOVUxMLAorCQkJCSAgICAgICBpbnRmLAorCQkJCSAgICAgICAmYWRkciwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgJm1zZywKKwkJCQkgICAgICAgTlVMTCwKKwkJCQkgICAgICAgJnNtaV9tc2csCisJCQkJICAgICAgICZyZWN2X21zZywKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgaW50Zi0+bXlfYWRkcmVzcywKKwkJCQkgICAgICAgaW50Zi0+bXlfbHVuLAorCQkJCSAgICAgICAwLCAxKTsgLyogbm8gcmV0cnksIGFuZCBubyB3YWl0LiAqLworCQl9CisJfQkKKyNlbmRpZiAvKiBDT05GSUdfSVBNSV9QQU5JQ19TVFJJTkcgKi8KK30KKyNlbmRpZiAvKiBDT05GSUdfSVBNSV9QQU5JQ19FVkVOVCAqLworCitzdGF0aWMgaW50IGhhc19wYW5pY2VkID0gMDsKKworc3RhdGljIGludCBwYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqcHRyKQoreworCWludCAgICAgICAgaTsKKwlpcG1pX3NtaV90IGludGY7CisKKwlpZiAoaGFzX3BhbmljZWQpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKwloYXNfcGFuaWNlZCA9IDE7CisKKwkvKiBGb3IgZXZlcnkgcmVnaXN0ZXJlZCBpbnRlcmZhY2UsIHNldCBpdCB0byBydW4gdG8gY29tcGxldGlvbi4gKi8KKwlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKKwkJaWYgKGludGYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWludGYtPmhhbmRsZXJzLT5zZXRfcnVuX3RvX2NvbXBsZXRpb24oaW50Zi0+c2VuZF9pbmZvLCAxKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfSVBNSV9QQU5JQ19FVkVOVAorCXNlbmRfcGFuaWNfZXZlbnRzKHB0cik7CisjZW5kaWYKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHBhbmljX2V2ZW50LAorCS5uZXh0CQk9IE5VTEwsCisJLnByaW9yaXR5CT0gMjAwCS8qIHByaW9yaXR5OiBJTlRfTUFYID49IHggPj0gMCAqLworfTsKKworc3RhdGljIGludCBpcG1pX2luaXRfbXNnaGFuZGxlcih2b2lkKQoreworCWludCBpOworCisJaWYgKGluaXRpYWxpemVkKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX0lORk8gImlwbWkgbWVzc2FnZSBoYW5kbGVyIHZlcnNpb24gIgorCSAgICAgICBJUE1JX01TR0hBTkRMRVJfVkVSU0lPTiAiXG4iKTsKKworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQlpcG1pX2ludGVyZmFjZXNbaV0gPSBOVUxMOworCX0KKworCXByb2NfaXBtaV9yb290ID0gcHJvY19ta2RpcigiaXBtaSIsIE5VTEwpOworCWlmICghcHJvY19pcG1pX3Jvb3QpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGNyZWF0ZSBJUE1JIHByb2MgZGlyIik7CisJICAgIHJldHVybiAtRU5PTUVNOworCX0KKworCXByb2NfaXBtaV9yb290LT5vd25lciA9IFRISVNfTU9EVUxFOworCisJaW5pdF90aW1lcigmaXBtaV90aW1lcik7CisJaXBtaV90aW1lci5kYXRhID0gMDsKKwlpcG1pX3RpbWVyLmZ1bmN0aW9uID0gaXBtaV90aW1lb3V0OworCWlwbWlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJUE1JX1RJTUVPVVRfSklGRklFUzsKKwlhZGRfdGltZXIoJmlwbWlfdGltZXIpOworCisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7CisKKwlpbml0aWFsaXplZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaXBtaV9pbml0X21zZ2hhbmRsZXJfbW9kKHZvaWQpCit7CisJaXBtaV9pbml0X21zZ2hhbmRsZXIoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGNsZWFudXBfaXBtaSh2b2lkKQoreworCWludCBjb3VudDsKKworCWlmICghaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCW5vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7CisKKwkvKiBUaGlzIGNhbid0IGJlIGNhbGxlZCBpZiBhbnkgaW50ZXJmYWNlcyBleGlzdCwgc28gbm8gd29ycnkgYWJvdXQKKwkgICBzaHV0dGluZyBkb3duIHRoZSBpbnRlcmZhY2VzLiAqLworCisJLyogVGVsbCB0aGUgdGltZXIgdG8gc3RvcCwgdGhlbiB3YWl0IGZvciBpdCB0byBzdG9wLiAgVGhpcyBhdm9pZHMKKwkgICBwcm9ibGVtcyB3aXRoIHJhY2UgY29uZGl0aW9ucyByZW1vdmluZyB0aGUgdGltZXIgaGVyZS4gKi8KKwlzdG9wX29wZXJhdGlvbiA9IDE7CisJd2hpbGUgKCF0aW1lcl9zdG9wcGVkKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlyZW1vdmVfcHJvY19lbnRyeShwcm9jX2lwbWlfcm9vdC0+bmFtZSwgJnByb2Nfcm9vdCk7CisKKwlpbml0aWFsaXplZCA9IDA7CisKKwkvKiBDaGVjayBmb3IgYnVmZmVyIGxlYWtzLiAqLworCWNvdW50ID0gYXRvbWljX3JlYWQoJnNtaV9tc2dfaW51c2VfY291bnQpOworCWlmIChjb3VudCAhPSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiU01JIG1lc3NhZ2UgY291bnQgJWQgYXQgZXhpdFxuIiwKKwkJICAgICAgIGNvdW50KTsKKwljb3VudCA9IGF0b21pY19yZWFkKCZyZWN2X21zZ19pbnVzZV9jb3VudCk7CisJaWYgKGNvdW50ICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJyZWN2IG1lc3NhZ2UgY291bnQgJWQgYXQgZXhpdFxuIiwKKwkJICAgICAgIGNvdW50KTsKK30KK21vZHVsZV9leGl0KGNsZWFudXBfaXBtaSk7CisKK21vZHVsZV9pbml0KGlwbWlfaW5pdF9tc2doYW5kbGVyX21vZCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0woaXBtaV9jcmVhdGVfdXNlcik7CitFWFBPUlRfU1lNQk9MKGlwbWlfZGVzdHJveV91c2VyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9nZXRfdmVyc2lvbik7CitFWFBPUlRfU1lNQk9MKGlwbWlfcmVxdWVzdF9zZXR0aW1lKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9yZWdpc3Rlcl9zbWkpOworRVhQT1JUX1NZTUJPTChpcG1pX3VucmVnaXN0ZXJfc21pKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9yZWdpc3Rlcl9mb3JfY21kKTsKK0VYUE9SVF9TWU1CT0woaXBtaV91bnJlZ2lzdGVyX2Zvcl9jbWQpOworRVhQT1JUX1NZTUJPTChpcG1pX3NtaV9tc2dfcmVjZWl2ZWQpOworRVhQT1JUX1NZTUJPTChpcG1pX3NtaV93YXRjaGRvZ19wcmV0aW1lb3V0KTsKK0VYUE9SVF9TWU1CT0woaXBtaV9hbGxvY19zbWlfbXNnKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9hZGRyX2xlbmd0aCk7CitFWFBPUlRfU1lNQk9MKGlwbWlfdmFsaWRhdGVfYWRkcik7CitFWFBPUlRfU1lNQk9MKGlwbWlfc2V0X2dldHNfZXZlbnRzKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGlwbWlfc2V0X215X2FkZHJlc3MpOworRVhQT1JUX1NZTUJPTChpcG1pX2dldF9teV9hZGRyZXNzKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zZXRfbXlfTFVOKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9nZXRfbXlfTFVOKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zbWlfYWRkX3Byb2NfZW50cnkpOworRVhQT1JUX1NZTUJPTChpcG1pX3VzZXJfc2V0X3J1bl90b19jb21wbGV0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjVjZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogaXBtaV9wb3dlcm9mZi5jCisgKgorICogTW9udGFWaXN0YSBJUE1JIFBvd2Vyb2ZmIGV4dGVuc2lvbiB0byBzeXNfcmVib290CisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIFN0ZXZlbiBEYWtlIDxzZGFrZUBtdmlzdGEuY29tPgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxjbWlueWFyZEBtdmlzdGEuY29tPgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CisKKyNkZWZpbmUgUEZYICJJUE1JIHBvd2Vyb2ZmOiAiCisjZGVmaW5lIElQTUlfUE9XRVJPRkZfVkVSU0lPTgkidjMzIgorCisvKiBXaGVyZSB0byB3ZSBpbnNlcnQgb3VyIHBvd2Vyb2ZmIGZ1bmN0aW9uPyAqLworZXh0ZXJuIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworCisvKiBTdHVmZiBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkIGNvbW1hbmQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1mZ19pZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvZF9pZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllczsKKworLyogV2UgdXNlIG91ciBvd24gbWVzc2FnZXMgZm9yIHRoaXMgb3BlcmF0aW9uLCB3ZSBkb24ndCBsZXQgdGhlIHN5c3RlbQorICAgYWxsb2NhdGUgdGhlbSwgc2luY2Ugd2UgbWF5IGJlIGluIGEgcGFuaWMgc2l0dWF0aW9uLiAgVGhlIHdob2xlCisgICB0aGluZyBpcyBzaW5nbGUtdGhyZWFkZWQsIGFueXdheSwgc28gbXVsdGlwbGUgbWVzc2FnZXMgYXJlIG5vdAorICAgcmVxdWlyZWQuICovCitzdGF0aWMgdm9pZCBkdW1teV9zbWlfZnJlZShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7Cit9CitzdGF0aWMgdm9pZCBkdW1teV9yZWN2X2ZyZWUoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKK30KK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfbXNnIGhhbHRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBkdW1teV9zbWlfZnJlZQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBoYWx0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3JlY3ZfZnJlZQorfTsKKworCisvKgorICogQ29kZSB0byBzZW5kIGEgbWVzc2FnZSBhbmQgd2FpdCBmb3IgdGhlIHJlcG9uc2UuCisgKi8KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9oYW5kbGVyKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywgdm9pZCAqaGFuZGxlcl9kYXRhKQoreworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IHJlY3ZfbXNnLT51c2VyX21zZ19kYXRhOworCisJaWYgKHNlbSkKKwkJdXAoc2VtKTsKK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3VzZXJfaG5kbCBpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIgPQoreworCS5pcG1pX3JlY3ZfaG5kbCA9IHJlY2VpdmVfaGFuZGxlcgorfTsKKworCitzdGF0aWMgaW50IGlwbWlfcmVxdWVzdF93YWl0X2Zvcl9yZXNwb25zZShpcG1pX3VzZXJfdCAgICAgICAgICAgIHVzZXIsCisJCQkJCSAgc3RydWN0IGlwbWlfYWRkciAgICAgICAqYWRkciwKKwkJCQkJICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICpzZW5kX21zZykKK3sKKwlpbnQgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCisJc2VtYV9pbml0ICgmc2VtLCAwKTsKKworCXJ2ID0gaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKHVzZXIsIGFkZHIsIDAsIHNlbmRfbXNnLCAmc2VtLAorCQkJCSAgICAgICZoYWx0X3NtaV9tc2csICZoYWx0X3JlY3ZfbXNnLCAwKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCWRvd24gKCZzZW0pOworCisJcmV0dXJuIGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMF07Cit9CisKKy8qIFdlIGFyZSBpbiBydW4tdG8tY29tcGxldGlvbiBtb2RlLCBubyBzZW1hcGhvcmUgaXMgZGVzaXJlZC4gKi8KK3N0YXRpYyBpbnQgaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUoaXBtaV91c2VyX3QgICAgICAgICAgICB1c2VyLAorCQkJCSAgIHN0cnVjdCBpcG1pX2FkZHIgICAgICAgKmFkZHIsCisJCQkJICAgc3RydWN0IGtlcm5lbF9pcG1pX21zZyAqc2VuZF9tc2cpCit7CisJaW50ICAgICAgICAgICAgICBydjsKKworCXJ2ID0gaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKHVzZXIsIGFkZHIsIDAsIHNlbmRfbXNnLCBOVUxMLAorCQkJCSAgICAgICZoYWx0X3NtaV9tc2csICZoYWx0X3JlY3ZfbXNnLCAwKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCXJldHVybiBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzBdOworfQorCisvKgorICogQVRDQSBTdXBwb3J0CisgKi8KKworI2RlZmluZSBJUE1JX05FVEZOX0FUQ0EJCQkweDJjCisjZGVmaW5lIElQTUlfQVRDQV9TRVRfUE9XRVJfQ01ECQkweDExCisjZGVmaW5lIElQTUlfQVRDQV9HRVRfQUREUl9JTkZPX0NNRAkweDAxCisjZGVmaW5lIElQTUlfUElDTUdfSUQJCQkwCisKK3N0YXRpYyBpbnQgaXBtaV9hdGNhX2RldGVjdCAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJLyoKKwkgKiBVc2UgZ2V0IGFkZHJlc3MgaW5mbyB0byBjaGVjayBhbmQgc2VlIGlmIHdlIGFyZSBBVENBCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0FUQ0E7CisJc2VuZF9tc2cuY21kID0gSVBNSV9BVENBX0dFVF9BRERSX0lORk9fQ01EOworCWRhdGFbMF0gPSBJUE1JX1BJQ01HX0lEOworCXNlbmRfbXNnLmRhdGEgPSBkYXRhOworCXNlbmRfbXNnLmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOworCXJ2ID0gaXBtaV9yZXF1ZXN0X3dhaXRfZm9yX3Jlc3BvbnNlKHVzZXIsCisJCQkJCSAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCisJCQkJCSAgICAmc2VuZF9tc2cpOworCXJldHVybiAhcnY7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcG93ZXJvZmZfYXRjYSAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyaW5nIGRvd24gdmlhIEFUQ0EgcG93ZXIgY29tbWFuZFxuIik7CisKKwkvKgorCSAqIFBvd2VyIGRvd24KKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fQVRDQTsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0FUQ0FfU0VUX1BPV0VSX0NNRDsKKwlkYXRhWzBdID0gSVBNSV9QSUNNR19JRDsKKwlkYXRhWzFdID0gMDsgLyogRlJVIGlkICovCisJZGF0YVsyXSA9IDA7IC8qIFBvd2VyIExldmVsICovCisJZGF0YVszXSA9IDA7IC8qIERvbid0IGNoYW5nZSBzYXZlZCBwcmVzZXRzICovCisJc2VuZF9tc2cuZGF0YSA9IGRhdGE7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSBzaXplb2YgKGRhdGEpOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIEFUQ0EgcG93ZXJkb3duIG1lc3NhZ2UsIgorCQkgICAgICAgIiBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCXJldHVybjsKK30KKworLyoKKyAqIENQSTEgU3VwcG9ydAorICovCisKKyNkZWZpbmUgSVBNSV9ORVRGTl9PRU1fMQkJCQkweGY4CisjZGVmaW5lIE9FTV9HUlBfQ01EX1NFVF9SRVNFVF9TVEFURQkJMHg4NAorI2RlZmluZSBPRU1fR1JQX0NNRF9TRVRfUE9XRVJfU1RBVEUJCTB4ODIKKyNkZWZpbmUgSVBNSV9ORVRGTl9PRU1fOAkJCQkweGY4CisjZGVmaW5lIE9FTV9HUlBfQ01EX1JFUVVFU1RfSE9UU1dBUF9DVFJMCTB4ODAKKyNkZWZpbmUgT0VNX0dSUF9DTURfR0VUX1NMT1RfR0EJCQkweGEzCisjZGVmaW5lIElQTUlfTkVURk5fU0VOU09SX0VWVAkJCTB4MTAKKyNkZWZpbmUgSVBNSV9DTURfR0VUX0VWRU5UX1JFQ0VJVkVSCQkweDAxCisKKyNkZWZpbmUgSVBNSV9DUEkxX1BST0RVQ1RfSUQJCTB4MDAwMTU3CisjZGVmaW5lIElQTUlfQ1BJMV9NQU5VRkFDVFVSRVJfSUQJMHgwMTA4CisKK3N0YXRpYyBpbnQgaXBtaV9jcGkxX2RldGVjdCAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlyZXR1cm4gKChtZmdfaWQgPT0gSVBNSV9DUEkxX01BTlVGQUNUVVJFUl9JRCkKKwkJJiYgKHByb2RfaWQgPT0gSVBNSV9DUEkxX1BST0RVQ1RfSUQpKTsKK30KKworc3RhdGljIHZvaWQgaXBtaV9wb3dlcm9mZl9jcGkxIChpcG1pX3VzZXJfdCB1c2VyKQoreworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBzbWlfYWRkcjsKKwlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgICAgICAgICAgICAgaXBtYl9hZGRyOworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICBzZW5kX21zZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnY7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV07CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Q7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGhvdHN3YXBfaXBtYjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgYWVyX2FkZHI7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGFlcl9sdW47CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uZmlndXJlIElQTUkgYWRkcmVzcyBmb3IgbG9jYWwgYWNjZXNzCisgICAgICAgICAqLworICAgICAgICBzbWlfYWRkci5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworICAgICAgICBzbWlfYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKyAgICAgICAgc21pX2FkZHIubHVuID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlcmluZyBkb3duIHZpYSBDUEkxIHBvd2VyIGNvbW1hbmRcbiIpOworCisJLyoKKwkgKiBHZXQgSVBNSSBpcG1iIGFkZHJlc3MKKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fT0VNXzggPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBPRU1fR1JQX0NNRF9HRVRfU0xPVF9HQTsKKwlzZW5kX21zZy5kYXRhID0gTlVMTDsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IDA7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCXNsb3QgPSBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzFdOworCWhvdHN3YXBfaXBtYiA9IChzbG90ID4gOSkgPyAoMHhiMCArIDIgKiBzbG90KSA6ICgweGFlICsgMiAqIHNsb3QpOworCisJLyoKKwkgKiBHZXQgYWN0aXZlIGV2ZW50IHJlY2VpdmVyCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX1NFTlNPUl9FVlQgPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0NNRF9HRVRfRVZFTlRfUkVDRUlWRVI7CisJc2VuZF9tc2cuZGF0YSA9IE5VTEw7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSAwOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKwlhZXJfYWRkciA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMV07CisJYWVyX2x1biA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMl07CisKKwkvKgorCSAqIFNldHVwIElQTUIgYWRkcmVzcyB0YXJnZXQgaW5zdGVhZCBvZiBsb2NhbCB0YXJnZXQKKwkgKi8KKwlpcG1iX2FkZHIuYWRkcl90eXBlID0gSVBNSV9JUE1CX0FERFJfVFlQRTsKKwlpcG1iX2FkZHIuY2hhbm5lbCA9IDA7CisJaXBtYl9hZGRyLnNsYXZlX2FkZHIgPSBhZXJfYWRkcjsKKwlpcG1iX2FkZHIubHVuID0gYWVyX2x1bjsKKworCS8qCisJICogU2VuZCByZXF1ZXN0IGhvdHN3YXAgY29udHJvbCB0byByZW1vdmUgYmxhZGUgZnJvbSBkcHYKKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fT0VNXzggPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBPRU1fR1JQX0NNRF9SRVFVRVNUX0hPVFNXQVBfQ1RSTDsKKwlzZW5kX21zZy5kYXRhID0gJmhvdHN3YXBfaXBtYjsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IDE7CisJaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkoc3RydWN0IGlwbWlfYWRkciAqKSAmaXBtYl9hZGRyLAorCQkJCSZzZW5kX21zZyk7CisKKwkvKgorCSAqIFNldCByZXNldCBhc3NlcnRlZAorCSAqLworCXNlbmRfbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9PRU1fMSA+PiAyOworCXNlbmRfbXNnLmNtZCA9IE9FTV9HUlBfQ01EX1NFVF9SRVNFVF9TVEFURTsKKwlzZW5kX21zZy5kYXRhID0gZGF0YTsKKwlkYXRhWzBdID0gMTsgLyogUmVzZXQgYXNzZXJ0ZWQgc3RhdGUgKi8KKwlzZW5kX21zZy5kYXRhX2xlbiA9IDE7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBQb3dlciBkb3duCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX09FTV8xID4+IDI7CisJc2VuZF9tc2cuY21kID0gT0VNX0dSUF9DTURfU0VUX1BPV0VSX1NUQVRFOworCXNlbmRfbXNnLmRhdGEgPSBkYXRhOworCWRhdGFbMF0gPSAxOyAvKiBQb3dlciBkb3duIHN0YXRlICovCisJc2VuZF9tc2cuZGF0YV9sZW4gPSAxOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKworIG91dDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTdGFuZGFyZCBjaGFzc2lzIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIElQTUlfTkVURk5fQ0hBU1NJU19SRVFVRVNUCTAKKyNkZWZpbmUgSVBNSV9DSEFTU0lTX0NPTlRST0xfQ01ECTB4MDIKKworc3RhdGljIGludCBpcG1pX2NoYXNzaXNfZGV0ZWN0IChpcG1pX3VzZXJfdCB1c2VyKQoreworCS8qIENoYXNzaXMgc3VwcG9ydCwgdXNlIGl0LiAqLworCXJldHVybiAoY2FwYWJpbGl0aWVzICYgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcG93ZXJvZmZfY2hhc3NpcyAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyaW5nIGRvd24gdmlhIElQTUkgY2hhc3NpcyBjb250cm9sIGNvbW1hbmRcbiIpOworCisJLyoKKwkgKiBQb3dlciBkb3duCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0NIQVNTSVNfUkVRVUVTVDsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0NIQVNTSVNfQ09OVFJPTF9DTUQ7CisJZGF0YVswXSA9IDA7IC8qIFBvd2VyIGRvd24gKi8KKwlzZW5kX21zZy5kYXRhID0gZGF0YTsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IHNpemVvZihkYXRhKTsKKwlydiA9IGlwbWlfcmVxdWVzdF9pbl9yY19tb2RlKHVzZXIsCisJCQkJICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCisJCQkJICAgICAmc2VuZF9tc2cpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyZG93biBtZXNzYWdlLCIKKwkJICAgICAgICIgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlyZXR1cm47Cit9CisKKworLyogVGFibGUgb2YgcG9zc2libGUgcG93ZXIgb2ZmIGZ1bmN0aW9ucy4gKi8KK3N0cnVjdCBwb3dlcm9mZl9mdW5jdGlvbiB7CisJY2hhciAqcGxhdGZvcm1fdHlwZTsKKwlpbnQgICgqZGV0ZWN0KShpcG1pX3VzZXJfdCB1c2VyKTsKKwl2b2lkICgqcG93ZXJvZmZfZnVuYykoaXBtaV91c2VyX3QgdXNlcik7Cit9OworCitzdGF0aWMgc3RydWN0IHBvd2Vyb2ZmX2Z1bmN0aW9uIHBvd2Vyb2ZmX2Z1bmN0aW9uc1tdID0geworCXsgLnBsYXRmb3JtX3R5cGUJPSAiQVRDQSIsCisJICAuZGV0ZWN0CQk9IGlwbWlfYXRjYV9kZXRlY3QsCisJICAucG93ZXJvZmZfZnVuYwk9IGlwbWlfcG93ZXJvZmZfYXRjYSB9LAorCXsgLnBsYXRmb3JtX3R5cGUJPSAiQ1BJMSIsCisJICAuZGV0ZWN0CQk9IGlwbWlfY3BpMV9kZXRlY3QsCisJICAucG93ZXJvZmZfZnVuYwk9IGlwbWlfcG93ZXJvZmZfY3BpMSB9LAorCS8qIENoYXNzaXMgc2hvdWxkIGdlbmVyYWxseSBiZSBsYXN0LCBvdGhlciB0aGluZ3Mgc2hvdWxkIG92ZXJyaWRlCisJICAgaXQuICovCisJeyAucGxhdGZvcm1fdHlwZQk9ICJjaGFzc2lzIiwKKwkgIC5kZXRlY3QJCT0gaXBtaV9jaGFzc2lzX2RldGVjdCwKKwkgIC5wb3dlcm9mZl9mdW5jCT0gaXBtaV9wb3dlcm9mZl9jaGFzc2lzIH0sCit9OworI2RlZmluZSBOVU1fUE9fRlVOQ1MgKHNpemVvZihwb3dlcm9mZl9mdW5jdGlvbnMpIFwKKwkJICAgICAgLyBzaXplb2Yoc3RydWN0IHBvd2Vyb2ZmX2Z1bmN0aW9uKSkKKworCisvKiBPdXIgbG9jYWwgc3RhdGUuICovCitzdGF0aWMgaW50IHJlYWR5ID0gMDsKK3N0YXRpYyBpcG1pX3VzZXJfdCBpcG1pX3VzZXI7CitzdGF0aWMgdm9pZCAoKnNwZWNpZmljX3Bvd2Vyb2ZmX2Z1bmMpKGlwbWlfdXNlcl90IHVzZXIpID0gTlVMTDsKKworLyogSG9sZHMgdGhlIG9sZCBwb3dlcm9mZiBmdW5jdGlvbiBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiByZW1vdmFsLiAqLworc3RhdGljIHZvaWQgKCpvbGRfcG93ZXJvZmZfZnVuYykodm9pZCk7CisKKworLyogQ2FsbGVkIG9uIGEgcG93ZXJkb3duIHJlcXVlc3QuICovCitzdGF0aWMgdm9pZCBpcG1pX3Bvd2Vyb2ZmX2Z1bmN0aW9uICh2b2lkKQoreworCWlmICghcmVhZHkpCisJCXJldHVybjsKKworCS8qIFVzZSBydW4tdG8tY29tcGxldGlvbiBtb2RlLCBzaW5jZSBpbnRlcnJ1cHRzIG1heSBiZSBvZmYuICovCisJaXBtaV91c2VyX3NldF9ydW5fdG9fY29tcGxldGlvbihpcG1pX3VzZXIsIDEpOworCXNwZWNpZmljX3Bvd2Vyb2ZmX2Z1bmMoaXBtaV91c2VyKTsKKwlpcG1pX3VzZXJfc2V0X3J1bl90b19jb21wbGV0aW9uKGlwbWlfdXNlciwgMCk7Cit9CisKKy8qIFdhaXQgZm9yIGFuIElQTUkgaW50ZXJmYWNlIHRvIGJlIGluc3RhbGxlZCwgdGhlIGZpcnN0IG9uZSBpbnN0YWxsZWQKKyAgIHdpbGwgYmUgZ3JhYmJlZCBieSB0aGlzIGNvZGUgYW5kIHVzZWQgdG8gcGVyZm9ybSB0aGUgcG93ZXJkb3duLiAqLworc3RhdGljIHZvaWQgaXBtaV9wb19uZXdfc21pKGludCBpZl9udW0pCit7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIHNtaV9hZGRyOworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICBzZW5kX21zZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnY7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisKKwlpZiAocmVhZHkpCisJCXJldHVybjsKKworCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpZl9udW0sICZpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIsIE5VTEwsICZpcG1pX3VzZXIpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZCBub3QgY3JlYXRlIElQTUkgdXNlciwgZXJyb3IgJWRcbiIsCisJCSAgICAgICBydik7CisJCXJldHVybjsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRG8gYSBnZXQgZGV2aWNlIGlkZSBhbmQgc3RvcmUgc29tZSByZXN1bHRzLCBzaW5jZSB0aGlzIGlzCisJICogdXNlZCBieSBzZXZlcmFsIGZ1bmN0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUOworCXNlbmRfbXNnLmNtZCA9IElQTUlfR0VUX0RFVklDRV9JRF9DTUQ7CisJc2VuZF9tc2cuZGF0YSA9IE5VTEw7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSAwOworCXJ2ID0gaXBtaV9yZXF1ZXN0X3dhaXRfZm9yX3Jlc3BvbnNlKGlwbWlfdXNlciwKKwkJCQkJICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkJICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIElQTUkgZ2V0IGRldmljZSBpZCBpbmZvLCIKKwkJICAgICAgICIgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YV9sZW4gPCAxMikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIoY2hhc3NpcykgSVBNSSBnZXQgZGV2aWNlIGlkIGluZm8gdG9vLCIKKwkJICAgICAgICIgc2hvcnQsIHdhcyAlZCBieXRlcywgbmVlZGVkICVkIGJ5dGVzXG4iLAorCQkgICAgICAgaGFsdF9yZWN2X21zZy5tc2cuZGF0YV9sZW4sIDEyKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCW1mZ19pZCA9IChoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzddCisJCSAgfCAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YVs4XSA8PCA4KQorCQkgIHwgKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbOV0gPDwgMTYpKTsKKwlwcm9kX2lkID0gKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMTBdCisJCSAgIHwgKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMTFdIDw8IDgpKTsKKwljYXBhYmlsaXRpZXMgPSBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzZdOworCisKKwkvKiBTY2FuIGZvciBhIHBvd2Vyb2ZmIG1ldGhvZCAqLworCWZvciAoaT0wOyBpPE5VTV9QT19GVU5DUzsgaSsrKSB7CisJCWlmIChwb3dlcm9mZl9mdW5jdGlvbnNbaV0uZGV0ZWN0KGlwbWlfdXNlcikpCisJCQlnb3RvIGZvdW5kOworCX0KKworIG91dF9lcnI6CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGZpbmQgYSBwb3dlcm9mZiBmdW5jdGlvbiB0aGF0IgorCSAgICAgICAiIHdpbGwgd29yaywgZ2l2aW5nIHVwXG4iKTsKKwlpcG1pX2Rlc3Ryb3lfdXNlcihpcG1pX3VzZXIpOworCXJldHVybjsKKworIGZvdW5kOgorCXByaW50ayhLRVJOX0lORk8gUEZYICJGb3VuZCBhICVzIHN0eWxlIHBvd2Vyb2ZmIGZ1bmN0aW9uXG4iLAorCSAgICAgICBwb3dlcm9mZl9mdW5jdGlvbnNbaV0ucGxhdGZvcm1fdHlwZSk7CisJc3BlY2lmaWNfcG93ZXJvZmZfZnVuYyA9IHBvd2Vyb2ZmX2Z1bmN0aW9uc1tpXS5wb3dlcm9mZl9mdW5jOworCW9sZF9wb3dlcm9mZl9mdW5jID0gcG1fcG93ZXJfb2ZmOworCXBtX3Bvd2VyX29mZiA9IGlwbWlfcG93ZXJvZmZfZnVuY3Rpb247CisJcmVhZHkgPSAxOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3BvX3NtaV9nb25lKGludCBpZl9udW0pCit7CisJLyogVGhpcyBjYW4gbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIG9uY2UgcG93ZXJvZmYgZHJpdmVyIGlzCisJICAgcmVnaXN0ZXJlZCwgdGhlIGludGVyZmFjZSBjYW4ndCBnbyBhd2F5IHVudGlsIHRoZSBwb3dlcgorCSAgIGRyaXZlciBpcyB1bnJlZ2lzdGVyZWQuICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciBzbWlfd2F0Y2hlciA9Cit7CisJLm93bmVyICAgID0gVEhJU19NT0RVTEUsCisJLm5ld19zbWkgID0gaXBtaV9wb19uZXdfc21pLAorCS5zbWlfZ29uZSA9IGlwbWlfcG9fc21pX2dvbmUKK307CisKKworLyoKKyAqIFN0YXJ0dXAgYW5kIHNodXRkb3duIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBpcG1pX3Bvd2Vyb2ZmX2luaXQgKHZvaWQpCit7CisJaW50IHJ2OworCisJcHJpbnRrICgiQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgLSIKKwkJIiBJUE1JIFBvd2VyZG93biB2aWEgc3lzX3JlYm9vdCB2ZXJzaW9uICIKKwkJSVBNSV9QT1dFUk9GRl9WRVJTSU9OICIuXG4iKTsKKworCXJ2ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlmIChydikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIFNNSSB3YXRjaGVyOiAlZFxuIiwgcnYpOworCisJcmV0dXJuIHJ2OworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgX19leGl0IHZvaWQgaXBtaV9wb3dlcm9mZl9jbGVhbnVwKHZvaWQpCit7CisJaW50IHJ2OworCisJaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisKKwlpZiAocmVhZHkpIHsKKwkJcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcihpcG1pX3VzZXIpOworCQlpZiAocnYpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZCBub3QgY2xlYW51cCB0aGUgSVBNSSIKKwkJCSAgICAgICAiIHVzZXI6IDB4JXhcbiIsIHJ2KTsKKwkJcG1fcG93ZXJfb2ZmID0gb2xkX3Bvd2Vyb2ZmX2Z1bmM7CisJfQorfQorbW9kdWxlX2V4aXQoaXBtaV9wb3dlcm9mZl9jbGVhbnVwKTsKKyNlbmRpZgorCittb2R1bGVfaW5pdChpcG1pX3Bvd2Vyb2ZmX2luaXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRlMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTAsMCArMSwyMzU5IEBACisvKgorICogaXBtaV9zaS5jCisgKgorICogVGhlIGludGVyZmFjZSB0byB0aGUgSVBNSSBkcml2ZXIgZm9yIHRoZSBzeXN0ZW0gaW50ZXJmYWNlcyAoS0NTLCBTTUlDLAorICogQlQpLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBob2xkcyB0aGUgInBvbGljeSIgZm9yIHRoZSBpbnRlcmZhY2UgdG8gdGhlIFNNSSBzdGF0ZQorICogbWFjaGluZS4gIEl0IGRvZXMgdGhlIGNvbmZpZ3VyYXRpb24sIGhhbmRsZXMgdGltZXJzIGFuZCBpbnRlcnJ1cHRzLAorICogYW5kIGRyaXZlcyB0aGUgcmVhbCBTTUkgc3RhdGUgbWFjaGluZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKyNpbmNsdWRlIDxsaW51eC9ocnRpbWUuaD4KKyMgaWYgZGVmaW5lZChzY2hlZHVsZV9uZXh0X2ludCkKKy8qIE9sZCBoaWdoLXJlcyB0aW1lciBjb2RlLCBkbyB0cmFuc2xhdGlvbnMuICovCisjICBkZWZpbmUgZ2V0X2FyY2hfY3ljbGVzKGEpIHF1aWNrX3VwZGF0ZV9qaWZmaWVzX3N1YihhKQorIyAgZGVmaW5lIGFyY2hfY3ljbGVzX3Blcl9qaWZmeSBjeWNsZXNfcGVyX2ppZmZpZXMKKyMgZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdXNlY190b190aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCwgbG9uZyB2KQoreworCXQtPnN1Yl9leHBpcmVzICs9IG5zZWNfdG9fYXJjaF9jeWNsZSh2ICogMTAwMCk7CisJd2hpbGUgKHQtPnN1Yl9leHBpcmVzID49IGFyY2hfY3ljbGVzX3Blcl9qaWZmeSkKKwl7CisJCXQtPmV4cGlyZXMrKzsKKwkJdC0+c3ViX2V4cGlyZXMgLT0gYXJjaF9jeWNsZXNfcGVyX2ppZmZ5OworCX0KK30KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9zbWkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJpcG1pX3NpX3NtLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjZGVmaW5lIElQTUlfU0lfVkVSU0lPTiAidjMzIgorCisvKiBNZWFzdXJlIHRpbWVzIGJldHdlZW4gZXZlbnRzIGluIHRoZSBkcml2ZXIuICovCisjdW5kZWYgREVCVUdfVElNSU5HCisKKy8qIENhbGwgZXZlcnkgMTAgbXMuICovCisjZGVmaW5lIFNJX1RJTUVPVVRfVElNRV9VU0VDCTEwMDAwCisjZGVmaW5lIFNJX1VTRUNfUEVSX0pJRkZZCSgxMDAwMDAwL0haKQorI2RlZmluZSBTSV9USU1FT1VUX0pJRkZJRVMJKFNJX1RJTUVPVVRfVElNRV9VU0VDL1NJX1VTRUNfUEVSX0pJRkZZKQorI2RlZmluZSBTSV9TSE9SVF9USU1FT1VUX1VTRUMgIDI1MCAvKiAuMjVtcyB3aGVuIHRoZSBTTSByZXF1ZXN0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHRpbWVvdXQgKi8KKworZW51bSBzaV9pbnRmX3N0YXRlIHsKKwlTSV9OT1JNQUwsCisJU0lfR0VUVElOR19GTEFHUywKKwlTSV9HRVRUSU5HX0VWRU5UUywKKwlTSV9DTEVBUklOR19GTEFHUywKKwlTSV9DTEVBUklOR19GTEFHU19USEVOX1NFVF9JUlEsCisJU0lfR0VUVElOR19NRVNTQUdFUywKKwlTSV9FTkFCTEVfSU5URVJSVVBUUzEsCisJU0lfRU5BQkxFX0lOVEVSUlVQVFMyCisJLyogRklYTUUgLSBhZGQgd2F0Y2hkb2cgc3R1ZmYuICovCit9OworCitlbnVtIHNpX3R5cGUgeworICAgIFNJX0tDUywgU0lfU01JQywgU0lfQlQKK307CisKK3N0cnVjdCBzbWlfaW5mbworeworCWlwbWlfc21pX3QgICAgICAgICAgICAgaW50ZjsKKwlzdHJ1Y3Qgc2lfc21fZGF0YSAgICAgICpzaV9zbTsKKwlzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgICpoYW5kbGVyczsKKwllbnVtIHNpX3R5cGUgICAgICAgICAgIHNpX3R5cGU7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICBzaV9sb2NrOworCXNwaW5sb2NrX3QgICAgICAgICAgICAgbXNnX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICB4bWl0X21zZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICBocF94bWl0X21zZ3M7CisJc3RydWN0IGlwbWlfc21pX21zZyAgICAqY3Vycl9tc2c7CisJZW51bSBzaV9pbnRmX3N0YXRlICAgICBzaV9zdGF0ZTsKKworCS8qIFVzZWQgdG8gaGFuZGxlIHRoZSB2YXJpb3VzIHR5cGVzIG9mIEkvTyB0aGF0IGNhbiBvY2N1ciB3aXRoCisgICAgICAgICAgIElQTUkgKi8KKwlzdHJ1Y3Qgc2lfc21faW8gaW87CisJaW50ICgqaW9fc2V0dXApKHN0cnVjdCBzbWlfaW5mbyAqaW5mbyk7CisJdm9pZCAoKmlvX2NsZWFudXApKHN0cnVjdCBzbWlfaW5mbyAqaW5mbyk7CisJaW50ICgqaXJxX3NldHVwKShzdHJ1Y3Qgc21pX2luZm8gKmluZm8pOworCXZvaWQgKCppcnFfY2xlYW51cCkoc3RydWN0IHNtaV9pbmZvICppbmZvKTsKKwl1bnNpZ25lZCBpbnQgaW9fc2l6ZTsKKworCS8qIEZsYWdzIGZyb20gdGhlIGxhc3QgR0VUX01TR19GTEFHUyBjb21tYW5kLCB1c2VkIHdoZW4gYW4gQVRUTgorCSAgIGlzIHNldCB0byBob2xkIHRoZSBmbGFncyB1bnRpbCB3ZSBhcmUgZG9uZSBoYW5kbGluZyBldmVyeXRoaW5nCisJICAgZnJvbSB0aGUgZmxhZ3MuICovCisjZGVmaW5lIFJFQ0VJVkVfTVNHX0FWQUlMCTB4MDEKKyNkZWZpbmUgRVZFTlRfTVNHX0JVRkZFUl9GVUxMCTB4MDIKKyNkZWZpbmUgV0RUX1BSRV9USU1FT1VUX0lOVAkweDA4CisJdW5zaWduZWQgY2hhciAgICAgICBtc2dfZmxhZ3M7CisKKwkvKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHJlcXVlc3QgZXZlbnRzIHRoZSBuZXh0IHRpbWUgdGhlCisJICAgc3RhdGUgbWFjaGluZSBpcyBpZGxlLiAqLworCWF0b21pY190ICAgICAgICAgICAgcmVxX2V2ZW50czsKKworCS8qIElmIHRydWUsIHJ1biB0aGUgc3RhdGUgbWFjaGluZSB0byBjb21wbGV0aW9uIG9uIGV2ZXJ5IHNlbmQKKwkgICBjYWxsLiAgR2VuZXJhbGx5IHVzZWQgYWZ0ZXIgYSBwYW5pYyB0byBtYWtlIHN1cmUgc3R1ZmYgZ29lcworCSAgIG91dC4gKi8KKwlpbnQgICAgICAgICAgICAgICAgIHJ1bl90b19jb21wbGV0aW9uOworCisJLyogVGhlIEkvTyBwb3J0IG9mIGFuIFNJIGludGVyZmFjZS4gKi8KKwlpbnQgICAgICAgICAgICAgICAgIHBvcnQ7CisKKwkvKiBUaGUgc3BhY2UgYmV0d2VlbiBzdGFydCBhZGRyZXNzZXMgb2YgdGhlIHR3byBwb3J0cy4gIEZvcgorCSAgIGluc3RhbmNlLCBpZiB0aGUgZmlyc3QgcG9ydCBpcyAweGNhMiBhbmQgdGhlIHNwYWNpbmcgaXMgNCwgdGhlbgorCSAgIHRoZSBzZWNvbmQgcG9ydCBpcyAweGNhNi4gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgIHNwYWNpbmc7CisKKwkvKiB6ZXJvIGlmIG5vIGlycTsgKi8KKwlpbnQgICAgICAgICAgICAgICAgIGlycTsKKworCS8qIFRoZSB0aW1lciBmb3IgdGhpcyBzaS4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCAgIHNpX3RpbWVyOworCisJLyogVGhlIHRpbWUgKGluIGppZmZpZXMpIHRoZSBsYXN0IHRpbWVvdXQgb2NjdXJyZWQgYXQuICovCisJdW5zaWduZWQgbG9uZyAgICAgICBsYXN0X3RpbWVvdXRfamlmZmllczsKKworCS8qIFVzZWQgdG8gZ3JhY2VmdWxseSBzdG9wIHRoZSB0aW1lciB3aXRob3V0IHJhY2UgY29uZGl0aW9ucy4gKi8KKwl2b2xhdGlsZSBpbnQgICAgICAgIHN0b3Bfb3BlcmF0aW9uOworCXZvbGF0aWxlIGludCAgICAgICAgdGltZXJfc3RvcHBlZDsKKworCS8qIFRoZSBkcml2ZXIgd2lsbCBkaXNhYmxlIGludGVycnVwdHMgd2hlbiBpdCBnZXRzIGludG8gYQorCSAgIHNpdHVhdGlvbiB3aGVyZSBpdCBjYW5ub3QgaGFuZGxlIG1lc3NhZ2VzIGR1ZSB0byBsYWNrIG9mCisJICAgbWVtb3J5LiAgT25jZSB0aGF0IHNpdHVhdGlvbiBjbGVhcnMgdXAsIGl0IHdpbGwgcmUtZW5hYmxlCisJICAgaW50ZXJydXB0cy4gKi8KKwlpbnQgaW50ZXJydXB0X2Rpc2FibGVkOworCisJdW5zaWduZWQgY2hhciBpcG1pX3NpX2Rldl9yZXY7CisJdW5zaWduZWQgY2hhciBpcG1pX3NpX2Z3X3Jldl9tYWpvcjsKKwl1bnNpZ25lZCBjaGFyIGlwbWlfc2lfZndfcmV2X21pbm9yOworCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21ham9yOworCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21pbm9yOworCisJLyogU2xhdmUgYWRkcmVzcywgY291bGQgYmUgcmVwb3J0ZWQgZnJvbSBETUkuICovCisJdW5zaWduZWQgY2hhciBzbGF2ZV9hZGRyOworCisJLyogQ291bnRlcnMgYW5kIHRoaW5ncyBmb3IgdGhlIHByb2MgZmlsZXN5c3RlbS4gKi8KKwlzcGlubG9ja190IGNvdW50X2xvY2s7CisJdW5zaWduZWQgbG9uZyBzaG9ydF90aW1lb3V0czsKKwl1bnNpZ25lZCBsb25nIGxvbmdfdGltZW91dHM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X3Jlc3RhcnRzOworCXVuc2lnbmVkIGxvbmcgaWRsZXM7CisJdW5zaWduZWQgbG9uZyBpbnRlcnJ1cHRzOworCXVuc2lnbmVkIGxvbmcgYXR0ZW50aW9uczsKKwl1bnNpZ25lZCBsb25nIGZsYWdfZmV0Y2hlczsKKwl1bnNpZ25lZCBsb25nIGhvc2VkX2NvdW50OworCXVuc2lnbmVkIGxvbmcgY29tcGxldGVfdHJhbnNhY3Rpb25zOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzOworCXVuc2lnbmVkIGxvbmcgd2F0Y2hkb2dfcHJldGltZW91dHM7CisJdW5zaWduZWQgbG9uZyBpbmNvbWluZ19tZXNzYWdlczsKK307CisKK3N0YXRpYyB2b2lkIHNpX3Jlc3RhcnRfc2hvcnRfdGltZXIoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyk7CisKK3N0YXRpYyB2b2lkIGRlbGl2ZXJfcmVjdl9tc2coc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbywKKwkJCSAgICAgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCS8qIERlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gdGhlIHVwcGVyIGxheWVyIHdpdGggdGhlIGxvY2sKKyAgICAgICAgICAgcmVsZWFzZWQuICovCisJc3Bpbl91bmxvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworCWlwbWlfc21pX21zZ19yZWNlaXZlZChzbWlfaW5mby0+aW50ZiwgbXNnKTsKKwlzcGluX2xvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworfQorCitzdGF0aWMgdm9pZCByZXR1cm5faG9zZWRfbXNnKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJc3RydWN0IGlwbWlfc21pX21zZyAqbXNnID0gc21pX2luZm8tPmN1cnJfbXNnOworCisJLyogTWFrZSBpdCBhIHJlcG9uc2UgKi8KKwltc2ctPnJzcFswXSA9IG1zZy0+ZGF0YVswXSB8IDQ7CisJbXNnLT5yc3BbMV0gPSBtc2ctPmRhdGFbMV07CisJbXNnLT5yc3BbMl0gPSAweEZGOyAvKiBVbmtub3duIGVycm9yLiAqLworCW1zZy0+cnNwX3NpemUgPSAzOworCisJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwlkZWxpdmVyX3JlY3ZfbXNnKHNtaV9pbmZvLCBtc2cpOworfQorCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgc3RhcnRfbmV4dF9tc2coc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpbnQgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gTlVMTDsKKyNpZmRlZiBERUJVR19USU1JTkcKKwlzdHJ1Y3QgdGltZXZhbCB0OworI2VuZGlmCisKKwkvKiBObyBuZWVkIHRvIHNhdmUgZmxhZ3MsIHdlIGFsZWFkeSBoYXZlIGludGVycnVwdHMgb2ZmIGFuZCB3ZQorCSAgIGFscmVhZHkgaG9sZCB0aGUgU01JIGxvY2suICovCisJc3Bpbl9sb2NrKCYoc21pX2luZm8tPm1zZ19sb2NrKSk7CisKKwkvKiBQaWNrIHRoZSBoaWdoIHByaW9yaXR5IHF1ZXVlIGZpcnN0LiAqLworCWlmICghIGxpc3RfZW1wdHkoJihzbWlfaW5mby0+aHBfeG1pdF9tc2dzKSkpIHsKKwkJZW50cnkgPSBzbWlfaW5mby0+aHBfeG1pdF9tc2dzLm5leHQ7CisJfSBlbHNlIGlmICghIGxpc3RfZW1wdHkoJihzbWlfaW5mby0+eG1pdF9tc2dzKSkpIHsKKwkJZW50cnkgPSBzbWlfaW5mby0+eG1pdF9tc2dzLm5leHQ7CisJfQorCisJaWYgKCFlbnRyeSkgeworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOworCQlydiA9IFNJX1NNX0lETEU7CisJfSBlbHNlIHsKKwkJaW50IGVycjsKKworCQlsaXN0X2RlbChlbnRyeSk7CisJCXNtaV9pbmZvLT5jdXJyX21zZyA9IGxpc3RfZW50cnkoZW50cnksCisJCQkJCQlzdHJ1Y3QgaXBtaV9zbWlfbXNnLAorCQkJCQkJbGluayk7CisjaWZkZWYgREVCVUdfVElNSU5HCisJCWRvX2dldHRpbWVvZmRheSgmdCk7CisJCXByaW50aygiKipTdGFydDI6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCQllcnIgPSBzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKAorCQkJc21pX2luZm8tPnNpX3NtLAorCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhLAorCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhX3NpemUpOworCQlpZiAoZXJyKSB7CisJCQlyZXR1cm5faG9zZWRfbXNnKHNtaV9pbmZvKTsKKwkJfQorCisJCXJ2ID0gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOworCX0KKwlzcGluX3VubG9jaygmKHNtaV9pbmZvLT5tc2dfbG9jaykpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBzdGFydF9lbmFibGVfaXJxKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJdW5zaWduZWQgY2hhciBtc2dbMl07CisKKwkvKiBJZiB3ZSBhcmUgZW5hYmxpbmcgaW50ZXJydXB0cywgd2UgaGF2ZSB0byB0ZWxsIHRoZQorCSAgIEJNQyB0byB1c2UgdGhlbS4gKi8KKwltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwltc2dbMV0gPSBJUE1JX0dFVF9CTUNfR0xPQkFMX0VOQUJMRVNfQ01EOworCisJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbihzbWlfaW5mby0+c2lfc20sIG1zZywgMik7CisJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfRU5BQkxFX0lOVEVSUlVQVFMxOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9jbGVhcl9mbGFncyhzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXVuc2lnbmVkIGNoYXIgbXNnWzNdOworCisJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyBwcmUtdGltZW91dCBmbGFnIGlzIG5vdCBzZXQgYXQgc3RhcnR1cC4gKi8KKwltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwltc2dbMV0gPSBJUE1JX0NMRUFSX01TR19GTEFHU19DTUQ7CisJbXNnWzJdID0gV0RUX1BSRV9USU1FT1VUX0lOVDsKKworCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oc21pX2luZm8tPnNpX3NtLCBtc2csIDMpOworCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0NMRUFSSU5HX0ZMQUdTOworfQorCisvKiBXaGVuIHdlIGhhdmUgYSBzaXR1dGFpb24gd2hlcmUgd2UgcnVuIG91dCBvZiBtZW1vcnkgYW5kIGNhbm5vdAorICAgYWxsb2NhdGUgbWVzc2FnZXMsIHdlIGp1c3QgbGVhdmUgdGhlbSBpbiB0aGUgQk1DIGFuZCBydW4gdGhlIHN5c3RlbQorICAgcG9sbGVkIHVudGlsIHdlIGNhbiBhbGxvY2F0ZSBzb21lIG1lbW9yeS4gIE9uY2Ugd2UgaGF2ZSBzb21lCisgICBtZW1vcnksIHdlIHdpbGwgcmUtZW5hYmxlIHRoZSBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9zaV9pcnEoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpZiAoKHNtaV9pbmZvLT5pcnEpICYmICghc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkpIHsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKHNtaV9pbmZvLT5pcnEpOworCQlzbWlfaW5mby0+aW50ZXJydXB0X2Rpc2FibGVkID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfc2lfaXJxKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJaWYgKChzbWlfaW5mby0+aXJxKSAmJiAoc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkpIHsKKwkJZW5hYmxlX2lycShzbWlfaW5mby0+aXJxKTsKKwkJc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZmxhZ3Moc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIFdEVF9QUkVfVElNRU9VVF9JTlQpIHsKKwkJLyogV2F0Y2hkb2cgcHJlLXRpbWVvdXQgKi8KKwkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCXNtaV9pbmZvLT53YXRjaGRvZ19wcmV0aW1lb3V0cysrOworCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCXN0YXJ0X2NsZWFyX2ZsYWdzKHNtaV9pbmZvKTsKKwkJc21pX2luZm8tPm1zZ19mbGFncyAmPSB+V0RUX1BSRV9USU1FT1VUX0lOVDsKKwkJc3Bpbl91bmxvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworCQlpcG1pX3NtaV93YXRjaGRvZ19wcmV0aW1lb3V0KHNtaV9pbmZvLT5pbnRmKTsKKwkJc3Bpbl9sb2NrKCYoc21pX2luZm8tPnNpX2xvY2spKTsKKwl9IGVsc2UgaWYgKHNtaV9pbmZvLT5tc2dfZmxhZ3MgJiBSRUNFSVZFX01TR19BVkFJTCkgeworCQkvKiBNZXNzYWdlcyBhdmFpbGFibGUuICovCisJCXNtaV9pbmZvLT5jdXJyX21zZyA9IGlwbWlfYWxsb2Nfc21pX21zZygpOworCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykgeworCQkJZGlzYWJsZV9zaV9pcnEoc21pX2luZm8pOworCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQkJcmV0dXJuOworCQl9CisJCWVuYWJsZV9zaV9pcnEoc21pX2luZm8pOworCisJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YVswXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFbMV0gPSBJUE1JX0dFVF9NU0dfQ01EOworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSA9IDI7CisKKwkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YV9zaXplKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19NRVNTQUdFUzsKKwl9IGVsc2UgaWYgKHNtaV9pbmZvLT5tc2dfZmxhZ3MgJiBFVkVOVF9NU0dfQlVGRkVSX0ZVTEwpIHsKKwkJLyogRXZlbnRzIGF2YWlsYWJsZS4gKi8KKwkJc21pX2luZm8tPmN1cnJfbXNnID0gaXBtaV9hbGxvY19zbWlfbXNnKCk7CisJCWlmICghc21pX2luZm8tPmN1cnJfbXNnKSB7CisJCQlkaXNhYmxlX3NpX2lycShzbWlfaW5mbyk7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCQlyZXR1cm47CisJCX0KKwkJZW5hYmxlX3NpX2lycShzbWlfaW5mbyk7CisKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YVsxXSA9IElQTUlfUkVBRF9FVkVOVF9NU0dfQlVGRkVSX0NNRDsKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhX3NpemUgPSAyOworCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oCisJCQlzbWlfaW5mby0+c2lfc20sCisJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGEsCisJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSk7CisJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0dFVFRJTkdfRVZFTlRTOworCX0gZWxzZSB7CisJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90cmFuc2FjdGlvbl9kb25lKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJc3RydWN0IGlwbWlfc21pX21zZyAqbXNnOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsIHQ7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipEb25lOiAlZC4lOS45ZFxuIiwgdC50dl9zZWMsIHQudHZfdXNlYyk7CisjZW5kaWYKKwlzd2l0Y2ggKHNtaV9pbmZvLT5zaV9zdGF0ZSkgeworCWNhc2UgU0lfTk9STUFMOgorCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykKKwkJCWJyZWFrOworCisJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwX3NpemUKKwkJCT0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcCwKKwkJCQlJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCQkvKiBEbyB0aGlzIGhlcmUgYmVjYXNlIGRlbGl2ZXJfcmVjdl9tc2coKSByZWxlYXNlcyB0aGUKKwkJICAgbG9jaywgYW5kIGEgbmV3IG1lc3NhZ2UgY2FuIGJlIHB1dCBpbiBkdXJpbmcgdGhlCisJCSAgIHRpbWUgdGhlIGxvY2sgaXMgcmVsZWFzZWQuICovCisJCW1zZyA9IHNtaV9pbmZvLT5jdXJyX21zZzsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwkJZGVsaXZlcl9yZWN2X21zZyhzbWlfaW5mbywgbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJX0dFVFRJTkdfRkxBR1M6CisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKwkJdW5zaWduZWQgaW50ICBsZW47CisKKwkJLyogV2UgZ290IHRoZSBmbGFncyBmcm9tIHRoZSBTTUksIG5vdyBoYW5kbGUgdGhlbS4gKi8KKwkJbGVuID0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KHNtaV9pbmZvLT5zaV9zbSwgbXNnLCA0KTsKKwkJaWYgKG1zZ1syXSAhPSAwKSB7CisJCQkvKiBFcnJvciBmZXRjaGluZyBmbGFncywganVzdCBnaXZlIHVwIGZvcgorCQkJICAgbm93LiAqLworCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQl9IGVsc2UgaWYgKGxlbiA8IDQpIHsKKwkJCS8qIEhtbSwgbm8gZmxhZ3MuICBUaGF0J3MgdGVjaG5pY2FsbHkgaWxsZWdhbCwgYnV0CisJCQkgICBkb24ndCB1c2UgdW5pbml0aWFsaXplZCBkYXRhLiAqLworCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQl9IGVsc2UgeworCQkJc21pX2luZm8tPm1zZ19mbGFncyA9IG1zZ1szXTsKKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9DTEVBUklOR19GTEFHUzoKKwljYXNlIFNJX0NMRUFSSU5HX0ZMQUdTX1RIRU5fU0VUX0lSUToKKwl7CisJCXVuc2lnbmVkIGNoYXIgbXNnWzNdOworCisJCS8qIFdlIGNsZWFyZWQgdGhlIGZsYWdzLiAqLworCQlzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDMpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGNsZWFyaW5nIGZsYWdzICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImlwbWlfc2k6IEVycm9yIGNsZWFyaW5nIGZsYWdzOiAlMi4yeFxuIiwKKwkJCSAgICAgICBtc2dbMl0pOworCQl9CisJCWlmIChzbWlfaW5mby0+c2lfc3RhdGUgPT0gU0lfQ0xFQVJJTkdfRkxBR1NfVEhFTl9TRVRfSVJRKQorCQkJc3RhcnRfZW5hYmxlX2lycShzbWlfaW5mbyk7CisJCWVsc2UKKwkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9HRVRUSU5HX0VWRU5UUzoKKwl7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwX3NpemUKKwkJCT0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcCwKKwkJCQlJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCQkvKiBEbyB0aGlzIGhlcmUgYmVjYXNlIGRlbGl2ZXJfcmVjdl9tc2coKSByZWxlYXNlcyB0aGUKKwkJICAgbG9jaywgYW5kIGEgbmV3IG1lc3NhZ2UgY2FuIGJlIHB1dCBpbiBkdXJpbmcgdGhlCisJCSAgIHRpbWUgdGhlIGxvY2sgaXMgcmVsZWFzZWQuICovCisJCW1zZyA9IHNtaV9pbmZvLT5jdXJyX21zZzsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwkJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGdldHRpbmcgZXZlbnQsIHByb2JhYmx5IGRvbmUuICovCisJCQltc2ctPmRvbmUobXNnKTsKKworCQkJLyogVGFrZSBvZmYgdGhlIGV2ZW50IGZsYWcuICovCisJCQlzbWlfaW5mby0+bXNnX2ZsYWdzICY9IH5FVkVOVF9NU0dfQlVGRkVSX0ZVTEw7CisJCQloYW5kbGVfZmxhZ3Moc21pX2luZm8pOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCQlzbWlfaW5mby0+ZXZlbnRzKys7CisJCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCQkvKiBEbyB0aGlzIGJlZm9yZSB3ZSBkZWxpdmVyIHRoZSBtZXNzYWdlCisJCQkgICBiZWNhdXNlIGRlbGl2ZXJpbmcgdGhlIG1lc3NhZ2UgcmVsZWFzZXMgdGhlCisJCQkgICBsb2NrIGFuZCBzb21ldGhpbmcgZWxzZSBjYW4gbWVzcyB3aXRoIHRoZQorCQkJICAgc3RhdGUuICovCisJCQloYW5kbGVfZmxhZ3Moc21pX2luZm8pOworCisJCQlkZWxpdmVyX3JlY3ZfbXNnKHNtaV9pbmZvLCBtc2cpOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgU0lfR0VUVElOR19NRVNTQUdFUzoKKwl7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwX3NpemUKKwkJCT0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcCwKKwkJCQlJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCQkvKiBEbyB0aGlzIGhlcmUgYmVjYXNlIGRlbGl2ZXJfcmVjdl9tc2coKSByZWxlYXNlcyB0aGUKKwkJICAgbG9jaywgYW5kIGEgbmV3IG1lc3NhZ2UgY2FuIGJlIHB1dCBpbiBkdXJpbmcgdGhlCisJCSAgIHRpbWUgdGhlIGxvY2sgaXMgcmVsZWFzZWQuICovCisJCW1zZyA9IHNtaV9pbmZvLT5jdXJyX21zZzsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwkJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGdldHRpbmcgZXZlbnQsIHByb2JhYmx5IGRvbmUuICovCisJCQltc2ctPmRvbmUobXNnKTsKKworCQkJLyogVGFrZSBvZmYgdGhlIG1zZyBmbGFnLiAqLworCQkJc21pX2luZm8tPm1zZ19mbGFncyAmPSB+UkVDRUlWRV9NU0dfQVZBSUw7CisJCQloYW5kbGVfZmxhZ3Moc21pX2luZm8pOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCQlzbWlfaW5mby0+aW5jb21pbmdfbWVzc2FnZXMrKzsKKwkJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJCS8qIERvIHRoaXMgYmVmb3JlIHdlIGRlbGl2ZXIgdGhlIG1lc3NhZ2UKKwkJCSAgIGJlY2F1c2UgZGVsaXZlcmluZyB0aGUgbWVzc2FnZSByZWxlYXNlcyB0aGUKKwkJCSAgIGxvY2sgYW5kIHNvbWV0aGluZyBlbHNlIGNhbiBtZXNzIHdpdGggdGhlCisJCQkgICBzdGF0ZS4gKi8KKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisKKwkJCWRlbGl2ZXJfcmVjdl9tc2coc21pX2luZm8sIG1zZyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9FTkFCTEVfSU5URVJSVVBUUzE6CisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKworCQkvKiBXZSBnb3QgdGhlIGZsYWdzIGZyb20gdGhlIFNNSSwgbm93IGhhbmRsZSB0aGVtLiAqLworCQlzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDQpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiaXBtaV9zaTogQ291bGQgbm90IGVuYWJsZSBpbnRlcnJ1cHRzIgorCQkJICAgICAgICIsIGZhaWxlZCBnZXQsIHVzaW5nIHBvbGxlZCBtb2RlLlxuIik7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCX0gZWxzZSB7CisJCQltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwkJCW1zZ1sxXSA9IElQTUlfU0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQ7CisJCQltc2dbMl0gPSBtc2dbM10gfCAxOyAvKiBlbmFibGUgbXNnIHF1ZXVlIGludCAqLworCQkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCQlzbWlfaW5mby0+c2lfc20sIG1zZywgMyk7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9FTkFCTEVfSU5URVJSVVBUUzI7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9FTkFCTEVfSU5URVJSVVBUUzI6CisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKworCQkvKiBXZSBnb3QgdGhlIGZsYWdzIGZyb20gdGhlIFNNSSwgbm93IGhhbmRsZSB0aGVtLiAqLworCQlzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDQpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiaXBtaV9zaTogQ291bGQgbm90IGVuYWJsZSBpbnRlcnJ1cHRzIgorCQkJICAgICAgICIsIGZhaWxlZCBzZXQsIHVzaW5nIHBvbGxlZCBtb2RlLlxuIik7CisJCX0KKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQlicmVhazsKKwl9CisJfQorfQorCisvKiBDYWxsZWQgb24gdGltZW91dHMgYW5kIGV2ZW50cy4gIFRpbWVvdXRzIHNob3VsZCBwYXNzIHRoZSBlbGFwc2VkCisgICB0aW1lLCBpbnRlcnJ1cHRzIHNob3VsZCBwYXNzIGluIHplcm8uICovCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgc21pX2V2ZW50X2hhbmRsZXIoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbywKKwkJCQkJICAgaW50IHRpbWUpCit7CisJZW51bSBzaV9zbV9yZXN1bHQgc2lfc21fcmVzdWx0OworCisgcmVzdGFydDoKKwkvKiBUaGVyZSB1c2VkIHRvIGJlIGEgbG9vcCBoZXJlIHRoYXQgd2FpdGVkIGEgbGl0dGxlIHdoaWxlCisJICAgKGFyb3VuZCAyNXVzKSBiZWZvcmUgZ2l2aW5nIHVwLiAgVGhhdCB0dXJuZWQgb3V0IHRvIGJlCisJICAgcG9pbnRsZXNzLCB0aGUgbWluaW11bSBkZWxheXMgSSB3YXMgc2VlaW5nIHdlcmUgaW4gdGhlIDMwMHVzCisJICAgcmFuZ2UsIHdoaWNoIGlzIGZhciB0b28gbG9uZyB0byB3YWl0IGluIGFuIGludGVycnVwdC4gIFNvCisJICAgd2UganVzdCBydW4gdW50aWwgdGhlIHN0YXRlIG1hY2hpbmUgdGVsbHMgdXMgc29tZXRoaW5nCisJICAgaGFwcGVuZWQgb3IgaXQgbmVlZHMgYSBkZWxheS4gKi8KKwlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgdGltZSk7CisJdGltZSA9IDA7CisJd2hpbGUgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVkpCisJeworCQlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJfQorCisJaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9UUkFOU0FDVElPTl9DT01QTEVURSkKKwl7CisJCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCQlzbWlfaW5mby0+Y29tcGxldGVfdHJhbnNhY3Rpb25zKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJaGFuZGxlX3RyYW5zYWN0aW9uX2RvbmUoc21pX2luZm8pOworCQlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJfQorCWVsc2UgaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9IT1NFRCkKKwl7CisJCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCQlzbWlfaW5mby0+aG9zZWRfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKworCQkvKiBEbyB0aGUgYmVmb3JlIHJldHVybl9ob3NlZF9tc2csIGJlY2F1c2UgdGhhdAorCQkgICByZWxlYXNlcyB0aGUgbG9jay4gKi8KKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQlpZiAoc21pX2luZm8tPmN1cnJfbXNnICE9IE5VTEwpIHsKKwkJCS8qIElmIHdlIHdlcmUgaGFuZGxpbmcgYSB1c2VyIG1lc3NhZ2UsIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSByZXNwb25zZSB0byBzZW5kIHRvIHRoZSB1cHBlciBsYXllciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsbCBpdCBhYm91dCB0aGUgZXJyb3IuICovCisJCQlyZXR1cm5faG9zZWRfbXNnKHNtaV9pbmZvKTsKKwkJfQorCQlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJfQorCisJLyogV2UgcHJlZmVyIGhhbmRsaW5nIGF0dG4gb3ZlciBuZXcgbWVzc2FnZXMuICovCisJaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9BVFROKQorCXsKKwkJdW5zaWduZWQgY2hhciBtc2dbMl07CisKKwkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCXNtaV9pbmZvLT5hdHRlbnRpb25zKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJLyogR290IGEgYXR0biwgc2VuZCBkb3duIGEgZ2V0IG1lc3NhZ2UgZmxhZ3MgdG8gc2VlCisgICAgICAgICAgICAgICAgICAgd2hhdCdzIGNhdXNpbmcgaXQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgICAgdGhpcyBpbiB0aGUgdXBwZXIgbGF5ZXIsIGJ1dCBkdWUgdG8gdGhlIHdheQorICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgd29yayB3aXRoIHRoZSBTTUksIHRoYXQncyBub3QgcmVhbGx5CisgICAgICAgICAgICAgICAgICAgcG9zc2libGUuICovCisJCW1zZ1swXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCQltc2dbMV0gPSBJUE1JX0dFVF9NU0dfRkxBR1NfQ01EOworCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oCisJCQlzbWlfaW5mby0+c2lfc20sIG1zZywgMik7CisJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0dFVFRJTkdfRkxBR1M7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGlkbGUsIHRyeSB0byBzdGFydCB0aGUgbmV4dCBtZXNzYWdlLiAqLworCWlmIChzaV9zbV9yZXN1bHQgPT0gU0lfU01fSURMRSkgeworCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJc21pX2luZm8tPmlkbGVzKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJc2lfc21fcmVzdWx0ID0gc3RhcnRfbmV4dF9tc2coc21pX2luZm8pOworCQlpZiAoc2lfc21fcmVzdWx0ICE9IFNJX1NNX0lETEUpCisJCQlnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KKworCWlmICgoc2lfc21fcmVzdWx0ID09IFNJX1NNX0lETEUpCisJICAgICYmIChhdG9taWNfcmVhZCgmc21pX2luZm8tPnJlcV9ldmVudHMpKSkKKwl7CisJCS8qIFdlIGFyZSBpZGxlIGFuZCB0aGUgdXBwZXIgbGF5ZXIgcmVxdWVzdGVkIHRoYXQgSSBmZXRjaAorCQkgICBldmVudHMsIHNvIGRvIHNvLiAqLworCQl1bnNpZ25lZCBjaGFyIG1zZ1syXTsKKworCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJc21pX2luZm8tPmZsYWdfZmV0Y2hlcysrOworCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCWF0b21pY19zZXQoJnNtaV9pbmZvLT5yZXFfZXZlbnRzLCAwKTsKKwkJbXNnWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCW1zZ1sxXSA9IElQTUlfR0VUX01TR19GTEFHU19DTUQ7CisKKwkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCXNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19GTEFHUzsKKwkJZ290byByZXN0YXJ0OworCX0KKworCXJldHVybiBzaV9zbV9yZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRlcih2b2lkICAgICAgICAgICAgICAgICpzZW5kX2luZm8sCisJCSAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZywKKwkJICAgaW50ICAgICAgICAgICAgICAgICBwcmlvcml0eSkKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gICAqc21pX2luZm8gPSBzZW5kX2luZm87CisJZW51bSBzaV9zbV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsICAgIHQ7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoc21pX2luZm8tPm1zZ19sb2NrKSwgZmxhZ3MpOworI2lmZGVmIERFQlVHX1RJTUlORworCWRvX2dldHRpbWVvZmRheSgmdCk7CisJcHJpbnRrKCIqKkVucXVldWU6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCisJaWYgKHNtaV9pbmZvLT5ydW5fdG9fY29tcGxldGlvbikgeworCQkvKiBJZiB3ZSBhcmUgcnVubmluZyB0byBjb21wbGV0aW9uLCB0aGVuIHRocm93IGl0IGluCisJCSAgIHRoZSBsaXN0IGFuZCBydW4gdHJhbnNhY3Rpb25zIHVudGlsIGV2ZXJ5dGhpbmcgaXMKKwkJICAgY2xlYXIuICBQcmlvcml0eSBkb2Vzbid0IG1hdHRlciBoZXJlLiAqLworCQlsaXN0X2FkZF90YWlsKCYobXNnLT5saW5rKSwgJihzbWlfaW5mby0+eG1pdF9tc2dzKSk7CisKKwkJLyogV2UgaGF2ZSB0byByZWxlYXNlIHRoZSBtc2cgbG9jayBhbmQgY2xhaW0gdGhlIHNtaQorCQkgICBsb2NrIGluIHRoaXMgY2FzZSwgYmVjYXVzZSBvZiByYWNlIGNvbmRpdGlvbnMuICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+bXNnX2xvY2spLCBmbGFncyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKwkJcmVzdWx0ID0gc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sIDApOworCQl3aGlsZSAocmVzdWx0ICE9IFNJX1NNX0lETEUpIHsKKwkJCXVkZWxheShTSV9TSE9SVF9USU1FT1VUX1VTRUMpOworCQkJcmVzdWx0ID0gc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sCisJCQkJCQkgICBTSV9TSE9SVF9USU1FT1VUX1VTRUMpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmIChwcmlvcml0eSA+IDApIHsKKwkJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKHNtaV9pbmZvLT5ocF94bWl0X21zZ3MpKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKHNtaV9pbmZvLT54bWl0X21zZ3MpKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPm1zZ19sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKwlpZiAoKHNtaV9pbmZvLT5zaV9zdGF0ZSA9PSBTSV9OT1JNQUwpCisJICAgICYmIChzbWlfaW5mby0+Y3Vycl9tc2cgPT0gTlVMTCkpCisJeworCQlzdGFydF9uZXh0X21zZyhzbWlfaW5mbyk7CisJCXNpX3Jlc3RhcnRfc2hvcnRfdGltZXIoc21pX2luZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ydW5fdG9fY29tcGxldGlvbih2b2lkICpzZW5kX2luZm8sIGludCBpX3J1bl90b19jb21wbGV0aW9uKQoreworCXN0cnVjdCBzbWlfaW5mbyAgICpzbWlfaW5mbyA9IHNlbmRfaW5mbzsKKwllbnVtIHNpX3NtX3Jlc3VsdCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc21pX2luZm8tPnJ1bl90b19jb21wbGV0aW9uID0gaV9ydW5fdG9fY29tcGxldGlvbjsKKwlpZiAoaV9ydW5fdG9fY29tcGxldGlvbikgeworCQlyZXN1bHQgPSBzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7CisJCXdoaWxlIChyZXN1bHQgIT0gU0lfU01fSURMRSkgeworCQkJdWRlbGF5KFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisJCQlyZXN1bHQgPSBzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywKKwkJCQkJCSAgIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBvbGwodm9pZCAqc2VuZF9pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8gPSBzZW5kX2luZm87CisKKwlzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfZXZlbnRzKHZvaWQgKnNlbmRfaW5mbykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvID0gc2VuZF9pbmZvOworCisJYXRvbWljX3NldCgmc21pX2luZm8tPnJlcV9ldmVudHMsIDEpOworfQorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZiBhbmQgd2l0aCB0aGUgc2lfbG9jayBoZWxkLiAqLworc3RhdGljIHZvaWQgc2lfcmVzdGFydF9zaG9ydF90aW1lcihzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hfUkVTX1RJTUVSUykKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgamlmZmllc19ub3c7CisKKwlpZiAoZGVsX3RpbWVyKCYoc21pX2luZm8tPnNpX3RpbWVyKSkpIHsKKwkJLyogSWYgd2UgZG9uJ3QgZGVsZXRlIHRoZSB0aW1lciwgdGhlbiBpdCB3aWxsIGdvIG9mZgorCQkgICBpbW1lZGlhdGVseSwgYW55d2F5LiAgU28gd2Ugb25seSBwcm9jZXNzIGlmIHdlCisJCSAgIGFjdHVhbGx5IGRlbGV0ZSB0aGUgdGltZXIuICovCisKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGlycXNhdmUgb24sIHNvIG5vIG5lZWQgZm9yIGl0CisgICAgICAgICAgICAgICAgICAgaGVyZS4gKi8KKwkJcmVhZF9sb2NrKCZ4dGltZV9sb2NrKTsKKwkJamlmZmllc19ub3cgPSBqaWZmaWVzOworCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXNfbm93OworCQlzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMgPSBnZXRfYXJjaF9jeWNsZXMoamlmZmllc19ub3cpOworCisJCWFkZF91c2VjX3RvX3RpbWVyKCZzbWlfaW5mby0+c2lfdGltZXIsIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisKKwkJYWRkX3RpbWVyKCYoc21pX2luZm8tPnNpX3RpbWVyKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCQlzbWlfaW5mby0+dGltZW91dF9yZXN0YXJ0cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBzbWlfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNtaV9pbmZvICAgKnNtaV9pbmZvID0gKHN0cnVjdCBzbWlfaW5mbyAqKSBkYXRhOworCWVudW0gc2lfc21fcmVzdWx0IHNtaV9yZXN1bHQ7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAgICAgamlmZmllc19ub3c7CisJdW5zaWduZWQgbG9uZyAgICAgdGltZV9kaWZmOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsICAgIHQ7CisjZW5kaWYKKworCWlmIChzbWlfaW5mby0+c3RvcF9vcGVyYXRpb24pIHsKKwkJc21pX2luZm8tPnRpbWVyX3N0b3BwZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKyNpZmRlZiBERUJVR19USU1JTkcKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipUaW1lcjogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisJamlmZmllc19ub3cgPSBqaWZmaWVzOworCXRpbWVfZGlmZiA9ICgoamlmZmllc19ub3cgLSBzbWlfaW5mby0+bGFzdF90aW1lb3V0X2ppZmZpZXMpCisJCSAgICAgKiBTSV9VU0VDX1BFUl9KSUZGWSk7CisJc21pX3Jlc3VsdCA9IHNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLCB0aW1lX2RpZmYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc21pX2luZm8tPmxhc3RfdGltZW91dF9qaWZmaWVzID0gamlmZmllc19ub3c7CisKKwlpZiAoKHNtaV9pbmZvLT5pcnEpICYmICghIHNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQpKSB7CisJCS8qIFJ1bm5pbmcgd2l0aCBpbnRlcnJ1cHRzLCBvbmx5IGRvIGxvbmcgdGltZW91dHMuICovCisJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNJX1RJTUVPVVRfSklGRklFUzsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT5sb25nX3RpbWVvdXRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCWdvdG8gZG9fYWRkX3RpbWVyOworCX0KKworCS8qIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGFza3MgZm9yIGEgc2hvcnQgZGVsYXksIHRoZW4gc2hvcnRlbgorICAgICAgICAgICB0aGUgdGltZXIgdGltZW91dC4gKi8KKwlpZiAoc21pX3Jlc3VsdCA9PSBTSV9TTV9DQUxMX1dJVEhfREVMQVkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT5zaG9ydF90aW1lb3V0cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hfUkVTX1RJTUVSUykKKwkJcmVhZF9sb2NrKCZ4dGltZV9sb2NrKTsKKyAgICAgICAgICAgICAgICBzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgc21pX2luZm8tPnNpX3RpbWVyLnN1Yl9leHBpcmVzCisgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9hcmNoX2N5Y2xlcyhzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyk7CisgICAgICAgICAgICAgICAgcmVhZF91bmxvY2soJnh0aW1lX2xvY2spOworCQlhZGRfdXNlY190b190aW1lcigmc21pX2luZm8tPnNpX3RpbWVyLCBTSV9TSE9SVF9USU1FT1VUX1VTRUMpOworI2Vsc2UKKwkJc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCQlzbWlfaW5mby0+bG9uZ190aW1lb3V0cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTSV9USU1FT1VUX0pJRkZJRVM7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSF9SRVNfVElNRVJTKQorCQlzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMgPSAwOworI2VuZGlmCisJfQorCisgZG9fYWRkX3RpbWVyOgorCWFkZF90aW1lcigmKHNtaV9pbmZvLT5zaV90aW1lcikpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsICB0OworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJc21pX2luZm8tPmludGVycnVwdHMrKzsKKwlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJaWYgKHNtaV9pbmZvLT5zdG9wX29wZXJhdGlvbikKKwkJZ290byBvdXQ7CisKKyNpZmRlZiBERUJVR19USU1JTkcKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipJbnRlcnJ1cHQ6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCXNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLCAwKTsKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyBoYW5kbGVycyA9Cit7CisJLm93bmVyICAgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuc2VuZGVyCQkJPSBzZW5kZXIsCisJLnJlcXVlc3RfZXZlbnRzCQk9IHJlcXVlc3RfZXZlbnRzLAorCS5zZXRfcnVuX3RvX2NvbXBsZXRpb24gID0gc2V0X3J1bl90b19jb21wbGV0aW9uLAorCS5wb2xsCQkJPSBwb2xsLAorfTsKKworLyogVGhlcmUgY2FuIGJlIDQgSU8gcG9ydHMgcGFzc2VkIGluICh3aXRoIG9yIHdpdGhvdXQgSVJRcyksIDQgYWRkcmVzc2VzLAorICAgYSBkZWZhdWx0IElPIHBvcnQsIGFuZCAxIEFDUEkvU1BNSSBhZGRyZXNzLiAgVGhhdCBzZXRzIFNJX01BWF9EUklWRVJTICovCisKKyNkZWZpbmUgU0lfTUFYX1BBUk1TIDQKKyNkZWZpbmUgU0lfTUFYX0RSSVZFUlMgKChTSV9NQVhfUEFSTVMgKiAyKSArIDIpCitzdGF0aWMgc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mb3NbU0lfTUFYX0RSSVZFUlNdID0KK3sgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworCisjZGVmaW5lIERFVklDRV9OQU1FICJpcG1pX3NpIgorCisjZGVmaW5lIERFRkFVTFRfS0NTX0lPX1BPUlQJMHhjYTIKKyNkZWZpbmUgREVGQVVMVF9TTUlDX0lPX1BPUlQJMHhjYTkKKyNkZWZpbmUgREVGQVVMVF9CVF9JT19QT1JUCTB4ZTQKKyNkZWZpbmUgREVGQVVMVF9SRUdTUEFDSU5HCTEKKworc3RhdGljIGludCAgICAgICAgICAgc2lfdHJ5ZGVmYXVsdHMgPSAxOworc3RhdGljIGNoYXIgICAgICAgICAgKnNpX3R5cGVbU0lfTUFYX1BBUk1TXTsKKyNkZWZpbmUgTUFYX1NJX1RZUEVfU1RSIDMwCitzdGF0aWMgY2hhciAgICAgICAgICBzaV90eXBlX3N0cltNQVhfU0lfVFlQRV9TVFJdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWRkcnNbU0lfTUFYX1BBUk1TXTsKK3N0YXRpYyBpbnQgbnVtX2FkZHJzOworc3RhdGljIHVuc2lnbmVkIGludCAgcG9ydHNbU0lfTUFYX1BBUk1TXTsKK3N0YXRpYyBpbnQgbnVtX3BvcnRzOworc3RhdGljIGludCAgICAgICAgICAgaXJxc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1faXJxczsKK3N0YXRpYyBpbnQgICAgICAgICAgIHJlZ3NwYWNpbmdzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9yZWdzcGFjaW5ncyA9IDA7CitzdGF0aWMgaW50ICAgICAgICAgICByZWdzaXplc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1fcmVnc2l6ZXMgPSAwOworc3RhdGljIGludCAgICAgICAgICAgcmVnc2hpZnRzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9yZWdzaGlmdHMgPSAwOworc3RhdGljIGludCBzbGF2ZV9hZGRyc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1fc2xhdmVfYWRkcnMgPSAwOworCisKK21vZHVsZV9wYXJhbV9uYW1lZCh0cnlkZWZhdWx0cywgc2lfdHJ5ZGVmYXVsdHMsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyh0cnlkZWZhdWx0cywgIlNldHRpbmcgdGhpcyB0byAnZmFsc2UnIHdpbGwgZGlzYWJsZSB0aGUiCisJCSAiIGRlZmF1bHQgc2NhbiBvZiB0aGUgS0NTIGFuZCBTTUlDIGludGVyZmFjZSBhdCB0aGUgc3RhbmRhcmQiCisJCSAiIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcodHlwZSwgc2lfdHlwZV9zdHIsIE1BWF9TSV9UWVBFX1NUUiwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR5cGUsICJEZWZpbmVzIHRoZSB0eXBlIG9mIGVhY2ggaW50ZXJmYWNlLCBlYWNoIgorCQkgIiBpbnRlcmZhY2Ugc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFRoZSB0eXBlcyBhcmUgJ2tjcycsIgorCQkgIiAnc21pYycsIGFuZCAnYnQnLiAgRm9yIGV4YW1wbGUgc2lfdHlwZT1rY3MsYnQgd2lsbCBzZXQiCisJCSAiIHRoZSBmaXJzdCBpbnRlcmZhY2UgdG8ga2NzIGFuZCB0aGUgc2Vjb25kIHRvIGJ0Iik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYWRkcnMsIGxvbmcsICZudW1fYWRkcnMsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZGRycywgIlNldHMgdGhlIG1lbW9yeSBhZGRyZXNzIG9mIGVhY2ggaW50ZXJmYWNlLCB0aGUiCisJCSAiIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgT25seSB1c2UgaWYgYW4gaW50ZXJmYWNlIgorCQkgIiBpcyBpbiBtZW1vcnkuICBPdGhlcndpc2UsIHNldCBpdCB0byB6ZXJvIG9yIGxlYXZlIgorCQkgIiBpdCBibGFuay4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgaW50LCAmbnVtX3BvcnRzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJTZXRzIHRoZSBwb3J0IGFkZHJlc3Mgb2YgZWFjaCBpbnRlcmZhY2UsIHRoZSIKKwkJICIgYWRkcmVzc2VzIHNlcGFyYXRlZCBieSBjb21tYXMuICBPbmx5IHVzZSBpZiBhbiBpbnRlcmZhY2UiCisJCSAiIGlzIGEgcG9ydC4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHplcm8gb3IgbGVhdmUiCisJCSAiIGl0IGJsYW5rLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycXMsIGludCwgJm51bV9pcnFzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxcywgIlNldHMgdGhlIGludGVycnVwdCBvZiBlYWNoIGludGVyZmFjZSwgdGhlIgorCQkgIiBhZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIE9ubHkgdXNlIGlmIGFuIGludGVyZmFjZSIKKwkJICIgaGFzIGFuIGludGVycnVwdC4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHplcm8gb3IgbGVhdmUiCisJCSAiIGl0IGJsYW5rLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHJlZ3NwYWNpbmdzLCBpbnQsICZudW1fcmVnc3BhY2luZ3MsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWdzcGFjaW5ncywgIlRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiB0aGUgc3RhcnQgYWRkcmVzcyIKKwkJICIgYW5kIGVhY2ggc3VjY2Vzc2l2ZSByZWdpc3RlciB1c2VkIGJ5IHRoZSBpbnRlcmZhY2UuICBGb3IiCisJCSAiIGluc3RhbmNlLCBpZiB0aGUgc3RhcnQgYWRkcmVzcyBpcyAweGNhMiBhbmQgdGhlIHNwYWNpbmciCisJCSAiIGlzIDIsIHRoZW4gdGhlIHNlY29uZCBhZGRyZXNzIGlzIGF0IDB4Y2E0LiAgRGVmYXVsdHMiCisJCSAiIHRvIDEuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocmVnc2l6ZXMsIGludCwgJm51bV9yZWdzaXplcywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlZ3NpemVzLCAiVGhlIHNpemUgb2YgdGhlIHNwZWNpZmljIElQTUkgcmVnaXN0ZXIgaW4gYnl0ZXMuIgorCQkgIiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgYmUgMSwgMiwgNCwgb3IgOCBmb3IgYW4gOC1iaXQsIgorCQkgIiAxNi1iaXQsIDMyLWJpdCwgb3IgNjQtYml0IHJlZ2lzdGVyLiAgVXNlIHRoaXMgaWYgeW91IgorCQkgIiB0aGUgOC1iaXQgSVBNSSByZWdpc3RlciBoYXMgdG8gYmUgcmVhZCBmcm9tIGEgbGFyZ2VyIgorCQkgIiByZWdpc3Rlci4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShyZWdzaGlmdHMsIGludCwgJm51bV9yZWdzaGlmdHMsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWdzaGlmdHMsICJUaGUgYW1vdW50IHRvIHNoaWZ0IHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUuIgorCQkgIiBJUE1JIHJlZ2lzdGVyLCBpbiBiaXRzLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgZGF0YSIKKwkJICIgaXMgcmVhZCBmcm9tIGEgMzItYml0IHdvcmQgYW5kIHRoZSBJUE1JIGRhdGEgaXMgaW4iCisJCSAiIGJpdCA4LTE1LCB0aGVuIHRoZSBzaGlmdCB3b3VsZCBiZSA4Iik7Cittb2R1bGVfcGFyYW1fYXJyYXkoc2xhdmVfYWRkcnMsIGludCwgJm51bV9zbGF2ZV9hZGRycywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNsYXZlX2FkZHJzLCAiU2V0IHRoZSBkZWZhdWx0IElQTUIgc2xhdmUgYWRkcmVzcyBmb3IiCisJCSAiIHRoZSBjb250cm9sbGVyLiAgTm9ybWFsbHkgdGhpcyBpcyAweDIwLCBidXQgY2FuIGJlIgorCQkgIiBvdmVycmlkZGVuIGJ5IHRoaXMgcGFybS4gIFRoaXMgaXMgYW4gYXJyYXkgaW5kZXhlZCIKKwkJICIgYnkgaW50ZXJmYWNlIG51bWJlci4iKTsKKworCisjZGVmaW5lIElQTUlfTUVNX0FERFJfU1BBQ0UgMQorI2RlZmluZSBJUE1JX0lPX0FERFJfU1BBQ0UgIDIKKworI2lmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpIHx8IGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfUENJKQorc3RhdGljIGludCBpc19uZXdfaW50ZXJmYWNlKGludCBpbnRmLCB1OCBhZGRyX3NwYWNlLCB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTSV9NQVhfUEFSTVM7ICsraSkgeworCQkvKiBEb24ndCBjaGVjayBvdXIgYWRkcmVzcy4gKi8KKwkJaWYgKGkgPT0gaW50ZikKKwkJCWNvbnRpbnVlOworCQlpZiAoc2lfdHlwZVtpXSAhPSBOVUxMKSB7CisJCQlpZiAoKGFkZHJfc3BhY2UgPT0gSVBNSV9NRU1fQUREUl9TUEFDRSAmJgorCQkJICAgICBiYXNlX2FkZHIgPT0gYWRkcnNbaV0pIHx8CisJCQkgICAgKGFkZHJfc3BhY2UgPT0gSVBNSV9JT19BRERSX1NQQUNFICYmCisJCQkgICAgIGJhc2VfYWRkciA9PSBwb3J0c1tpXSkpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzdGRfaXJxX3NldHVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwlpbnQgcnY7CisKKwlpZiAoIWluZm8tPmlycSkKKwkJcmV0dXJuIDA7CisKKwlydiA9IHJlcXVlc3RfaXJxKGluZm8tPmlycSwKKwkJCSBzaV9pcnFfaGFuZGxlciwKKwkJCSBTQV9JTlRFUlJVUFQsCisJCQkgREVWSUNFX05BTUUsCisJCQkgaW5mbyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJpcG1pX3NpOiAlcyB1bmFibGUgdG8gY2xhaW0gaW50ZXJydXB0ICVkLCIKKwkJICAgICAgICIgcnVubmluZyBwb2xsZWRcbiIsCisJCSAgICAgICBERVZJQ0VfTkFNRSwgaW5mby0+aXJxKTsKKwkJaW5mby0+aXJxID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoIiAgVXNpbmcgaXJxICVkXG4iLCBpbmZvLT5pcnEpOworCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgc3RkX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPmlycSkKKwkJcmV0dXJuOworCisJZnJlZV9pcnEoaW5mby0+aXJxLCBpbmZvKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9ydF9pbmIoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCXJldHVybiBpbmIoKCphZGRyKSsob2Zmc2V0KmlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfb3V0YihzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlvdXRiKGIsICgqYWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBvcnRfaW53KHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlyZXR1cm4gKGludygoKmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBwb3J0X291dHcoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICAgdW5zaWduZWQgY2hhciBiKQoreworCXVuc2lnbmVkIGludCAqYWRkciA9IGlvLT5pbmZvOworCisJb3V0dyhiIDw8IGlvLT5yZWdzaGlmdCwgKCphZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9ydF9pbmwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCXJldHVybiAoaW5sKCgqYWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfb3V0bChzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlvdXRsKGIgPDwgaW8tPnJlZ3NoaWZ0LCAoKmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdm9pZCBwb3J0X2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCAqYWRkciA9IGluZm8tPmlvLmluZm87CisJaW50ICAgICAgICAgICBtYXBzaXplOworCisJaWYgKGFkZHIgJiYgKCphZGRyKSkgeworCQltYXBzaXplID0gKChpbmZvLT5pb19zaXplICogaW5mby0+aW8ucmVnc3BhY2luZykKKwkJCSAgIC0gKGluZm8tPmlvLnJlZ3NwYWNpbmcgLSBpbmZvLT5pby5yZWdzaXplKSk7CisKKwkJcmVsZWFzZV9yZWdpb24gKCphZGRyLCBtYXBzaXplKTsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9zZXR1cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW5mby0+aW8uaW5mbzsKKwlpbnQgICAgICAgICAgIG1hcHNpemU7CisKKwlpZiAoIWFkZHIgfHwgKCEqYWRkcikpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mby0+aW9fY2xlYW51cCA9IHBvcnRfY2xlYW51cDsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIGFjdHVhbCBpbmIvaW53L2lubC9ldGMgcm91dGluZSB0byB1c2UgYmFzZWQKKwkgICB1cG9uIHRoZSByZWdpc3RlciBzaXplLiAqLworCXN3aXRjaCAoaW5mby0+aW8ucmVnc2l6ZSkgeworCWNhc2UgMToKKwkJaW5mby0+aW8uaW5wdXRiID0gcG9ydF9pbmI7CisJCWluZm8tPmlvLm91dHB1dGIgPSBwb3J0X291dGI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5mby0+aW8uaW5wdXRiID0gcG9ydF9pbnc7CisJCWluZm8tPmlvLm91dHB1dGIgPSBwb3J0X291dHc7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW5mby0+aW8uaW5wdXRiID0gcG9ydF9pbmw7CisJCWluZm8tPmlvLm91dHB1dGIgPSBwb3J0X291dGw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiaXBtaV9zaTogSW52YWxpZCByZWdpc3RlciBzaXplOiAlZFxuIiwKKwkJICAgICAgIGluZm8tPmlvLnJlZ3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdG8gY2xhaW0uICBUaGlzIGlzIGFuCisJICogdW51c3VhbCBsb29raW5nIGNhbGN1bGF0aW9uLCBidXQgaXQgYXZvaWRzIGNsYWltaW5nIGFueQorCSAqIG1vcmUgbWVtb3J5IHRoYW4gaXQgaGFzIHRvLiAgSXQgd2lsbCBjbGFpbSBldmVyeXRoaW5nCisJICogYmV0d2VlbiB0aGUgZmlyc3QgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IGZ1bGwKKwkgKiByZWdpc3Rlci4gKi8KKwltYXBzaXplID0gKChpbmZvLT5pb19zaXplICogaW5mby0+aW8ucmVnc3BhY2luZykKKwkJICAgLSAoaW5mby0+aW8ucmVnc3BhY2luZyAtIGluZm8tPmlvLnJlZ3NpemUpKTsKKworCWlmIChyZXF1ZXN0X3JlZ2lvbigqYWRkciwgbWFwc2l6ZSwgREVWSUNFX05BTUUpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyeV9pbml0X3BvcnQoaW50IGludGZfbnVtLCBzdHJ1Y3Qgc21pX2luZm8gKipuZXdfaW5mbykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CisKKwlpZiAoIXBvcnRzW2ludGZfbnVtXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWlzX25ld19pbnRlcmZhY2UoaW50Zl9udW0sIElQTUlfSU9fQUREUl9TUEFDRSwKKwkJCSAgICAgIHBvcnRzW2ludGZfbnVtXSkpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDEpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmlvX3NldHVwID0gcG9ydF9zZXR1cDsKKwlpbmZvLT5pby5pbmZvID0gJihwb3J0c1tpbnRmX251bV0pOworCWluZm8tPmlvLmFkZHIgPSBOVUxMOworCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NpemUgPSByZWdzaXplc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzaXplKQorCQlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKwlpbmZvLT5pcnEgPSAwOworCWluZm8tPmlycV9zZXR1cCA9IE5VTEw7CisJKm5ld19pbmZvID0gaW5mbzsKKworCWlmIChzaV90eXBlW2ludGZfbnVtXSA9PSBOVUxMKQorCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCisJcHJpbnRrKCJpcG1pX3NpOiBUcnlpbmcgXCIlc1wiIGF0IEkvTyBwb3J0IDB4JXhcbiIsCisJICAgICAgIHNpX3R5cGVbaW50Zl9udW1dLCBwb3J0c1tpbnRmX251bV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW5iKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRiKChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9vdXRiKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgdW5zaWduZWQgY2hhciBiKQoreworCXdyaXRlYihiLCAoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW53KHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIChyZWFkdygoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKKwkJJiYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgbWVtX291dHcoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJd3JpdGViKGIgPDwgaW8tPnJlZ3NoaWZ0LCAoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW5sKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIChyZWFkbCgoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKKwkJJiYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgbWVtX291dGwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJd3JpdGVsKGIgPDwgaW8tPnJlZ3NoaWZ0LCAoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCisjaWZkZWYgcmVhZHEKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1lbV9pbnEoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHJlYWRxKChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KQorCQkmJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBtZW1fb3V0cShzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgIHVuc2lnbmVkIGNoYXIgYikKK3sKKwl3cml0ZXEoYiA8PCBpby0+cmVnc2hpZnQsIChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbWVtX2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgKmFkZHIgPSBpbmZvLT5pby5pbmZvOworCWludCAgICAgICAgICAgbWFwc2l6ZTsKKworCWlmIChpbmZvLT5pby5hZGRyKSB7CisJCWlvdW5tYXAoaW5mby0+aW8uYWRkcik7CisKKwkJbWFwc2l6ZSA9ICgoaW5mby0+aW9fc2l6ZSAqIGluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCQkgICAtIChpbmZvLT5pby5yZWdzcGFjaW5nIC0gaW5mby0+aW8ucmVnc2l6ZSkpOworCisJCXJlbGVhc2VfbWVtX3JlZ2lvbigqYWRkciwgbWFwc2l6ZSk7CisJfQorCWtmcmVlKGluZm8pOworfQorCitzdGF0aWMgaW50IG1lbV9zZXR1cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyAqYWRkciA9IGluZm8tPmlvLmluZm87CisJaW50ICAgICAgICAgICBtYXBzaXplOworCisJaWYgKCFhZGRyIHx8ICghKmFkZHIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWluZm8tPmlvX2NsZWFudXAgPSBtZW1fY2xlYW51cDsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIGFjdHVhbCByZWFkYi9yZWFkdy9yZWFkbC9ldGMgcm91dGluZSB0byB1c2UgYmFzZWQKKwkgICB1cG9uIHRoZSByZWdpc3RlciBzaXplLiAqLworCXN3aXRjaCAoaW5mby0+aW8ucmVnc2l6ZSkgeworCWNhc2UgMToKKwkJaW5mby0+aW8uaW5wdXRiID0gbWVtX2luYjsKKwkJaW5mby0+aW8ub3V0cHV0YiA9IG1lbV9vdXRiOworCQlicmVhazsKKwljYXNlIDI6CisJCWluZm8tPmlvLmlucHV0YiA9IG1lbV9pbnc7CisJCWluZm8tPmlvLm91dHB1dGIgPSBtZW1fb3V0dzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbmZvLT5pby5pbnB1dGIgPSBtZW1faW5sOworCQlpbmZvLT5pby5vdXRwdXRiID0gbWVtX291dGw7CisJCWJyZWFrOworI2lmZGVmIHJlYWRxCisJY2FzZSA4OgorCQlpbmZvLT5pby5pbnB1dGIgPSBtZW1faW5xOworCQlpbmZvLT5pby5vdXRwdXRiID0gbWVtX291dHE7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpcG1pX3NpOiBJbnZhbGlkIHJlZ2lzdGVyIHNpemU6ICVkXG4iLAorCQkgICAgICAgaW5mby0+aW8ucmVnc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0byBjbGFpbS4gIFRoaXMgaXMgYW4KKwkgKiB1bnVzdWFsIGxvb2tpbmcgY2FsY3VsYXRpb24sIGJ1dCBpdCBhdm9pZHMgY2xhaW1pbmcgYW55CisJICogbW9yZSBtZW1vcnkgdGhhbiBpdCBoYXMgdG8uICBJdCB3aWxsIGNsYWltIGV2ZXJ5dGhpbmcKKwkgKiBiZXR3ZWVuIHRoZSBmaXJzdCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZnVsbAorCSAqIHJlZ2lzdGVyLiAqLworCW1hcHNpemUgPSAoKGluZm8tPmlvX3NpemUgKiBpbmZvLT5pby5yZWdzcGFjaW5nKQorCQkgICAtIChpbmZvLT5pby5yZWdzcGFjaW5nIC0gaW5mby0+aW8ucmVnc2l6ZSkpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbigqYWRkciwgbWFwc2l6ZSwgREVWSUNFX05BTUUpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJaW5mby0+aW8uYWRkciA9IGlvcmVtYXAoKmFkZHIsIG1hcHNpemUpOworCWlmIChpbmZvLT5pby5hZGRyID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKCphZGRyLCBtYXBzaXplKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyeV9pbml0X21lbShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKKworCWlmICghYWRkcnNbaW50Zl9udW1dKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghaXNfbmV3X2ludGVyZmFjZShpbnRmX251bSwgSVBNSV9NRU1fQUREUl9TUEFDRSwKKwkJCSAgICAgIGFkZHJzW2ludGZfbnVtXSkpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDIpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmlvX3NldHVwID0gbWVtX3NldHVwOworCWluZm8tPmlvLmluZm8gPSAmYWRkcnNbaW50Zl9udW1dOworCWluZm8tPmlvLmFkZHIgPSBOVUxMOworCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NpemUgPSByZWdzaXplc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzaXplKQorCQlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKwlpbmZvLT5pcnEgPSAwOworCWluZm8tPmlycV9zZXR1cCA9IE5VTEw7CisJKm5ld19pbmZvID0gaW5mbzsKKworCWlmIChzaV90eXBlW2ludGZfbnVtXSA9PSBOVUxMKQorCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCisJcHJpbnRrKCJpcG1pX3NpOiBUcnlpbmcgXCIlc1wiIGF0IG1lbW9yeSBhZGRyZXNzIDB4JWx4XG4iLAorCSAgICAgICBzaV90eXBlW2ludGZfbnVtXSwgYWRkcnNbaW50Zl9udW1dKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX0FDUElfSU5URVJQUkVURVIKKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworLyogT25jZSB3ZSBnZXQgYW4gQUNQSSBmYWlsdXJlLCB3ZSBkb24ndCB0cnkgYW55IG1vcmUsIGJlY2F1c2Ugd2UgZ28KKyAgIHRocm91Z2ggdGhlIHRhYmxlcyBzZXF1ZW50aWFsbHkuICBPbmNlIHdlIGRvbid0IGZpbmQgYSB0YWJsZSwgdGhlcmUKKyAgIGFyZSBubyBtb3JlLiAqLworc3RhdGljIGludCBhY3BpX2ZhaWx1cmUgPSAwOworCisvKiBGb3IgR1BFLXR5cGUgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyB1MzIgaXBtaV9hY3BpX2dwZSh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8gPSBjb250ZXh0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKyNpZmRlZiBERUJVR19USU1JTkcKKwlzdHJ1Y3QgdGltZXZhbCB0OworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJc21pX2luZm8tPmludGVycnVwdHMrKzsKKwlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJaWYgKHNtaV9pbmZvLT5zdG9wX29wZXJhdGlvbikKKwkJZ290byBvdXQ7CisKKyNpZmRlZiBERUJVR19USU1JTkcKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipBQ1BJX0dQRTogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisJc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sIDApOworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisKKwlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKK30KKworc3RhdGljIGludCBhY3BpX2dwZV9pcnFfc2V0dXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmICghaW5mby0+aXJxKQorCQlyZXR1cm4gMDsKKworCS8qIEZJWE1FIC0gaXMgbGV2ZWwgdHJpZ2dlcmVkIHJpZ2h0PyAqLworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihOVUxMLAorCQkJCQkgIGluZm8tPmlycSwKKwkJCQkJICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQsCisJCQkJCSAgJmlwbWlfYWNwaV9ncGUsCisJCQkJCSAgaW5mbyk7CisJaWYgKHN0YXR1cyAhPSBBRV9PSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiaXBtaV9zaTogJXMgdW5hYmxlIHRvIGNsYWltIEFDUEkgR1BFICVkLCIKKwkJICAgICAgICIgcnVubmluZyBwb2xsZWRcbiIsCisJCSAgICAgICBERVZJQ0VfTkFNRSwgaW5mby0+aXJxKTsKKwkJaW5mby0+aXJxID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgIFVzaW5nIEFDUEkgR1BFICVkXG4iLCBpbmZvLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZ3BlX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPmlycSkKKwkJcmV0dXJuOworCisJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgaW5mby0+aXJxLCAmaXBtaV9hY3BpX2dwZSk7Cit9CisKKy8qCisgKiBEZWZpbmVkIGF0CisgKiBodHRwOi8vaDIxMDA3Lnd3dzIuaHAuY29tL2RzcHAvZmlsZXMvdW5wcm90ZWN0ZWQvZGV2cmVzb3VyY2UvRG9jcy9UZWNoUGFwZXJzL0lBNjQvaHBzcG1pLnBkZgorICovCitzdHJ1Y3QgU1BNSVRhYmxlIHsKKwlzOAlTaWduYXR1cmVbNF07CisJdTMyCUxlbmd0aDsKKwl1OAlSZXZpc2lvbjsKKwl1OAlDaGVja3N1bTsKKwlzOAlPRU1JRFs2XTsKKwlzOAlPRU1UYWJsZUlEWzhdOworCXM4CU9FTVJldmlzaW9uWzRdOworCXM4CUNyZWF0b3JJRFs0XTsKKwlzOAlDcmVhdG9yUmV2aXNpb25bNF07CisJdTgJSW50ZXJmYWNlVHlwZTsKKwl1OAlJUE1JbGVnYWN5OworCXMxNglTcGVjaWZpY2F0aW9uUmV2aXNpb247CisKKwkvKgorCSAqIEJpdCAwIC0gU0NJIGludGVycnVwdCBzdXBwb3J0ZWQKKwkgKiBCaXQgMSAtIEkvTyBBUElDL1NBUElDCisJICovCisJdTgJSW50ZXJydXB0VHlwZTsKKworCS8qIElmIGJpdCAwIG9mIEludGVycnVwdFR5cGUgaXMgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIFNDSQorICAgICAgICAgICBpbnRlcnJ1cHQgaW4gdGhlIEdQRXhfU1RTIHJlZ2lzdGVyLiAqLworCXU4CUdQRTsKKworCXMxNglSZXNlcnZlZDsKKworCS8qIElmIGJpdCAxIG9mIEludGVycnVwdFR5cGUgaXMgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIEkvTworICAgICAgICAgICBBUElDL1NBUElDIGludGVycnVwdC4gKi8KKwl1MzIJR2xvYmFsU3lzdGVtSW50ZXJydXB0OworCisJLyogVGhlIGFjdHVhbCByZWdpc3RlciBhZGRyZXNzLiAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBhZGRyOworCisJdTgJVUlEWzRdOworCisJczggICAgICBzcG1pX2lkWzFdOyAvKiBBICdcMCcgdGVybWluYXRlZCBhcnJheSBzdGFydHMgaGVyZS4gKi8KK307CisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfYWNwaShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAgKmluZm87CisJYWNwaV9zdGF0dXMgICAgICBzdGF0dXM7CisJc3RydWN0IFNQTUlUYWJsZSAqc3BtaTsKKwljaGFyICAgICAgICAgICAgICppb190eXBlOworCXU4IAkJIGFkZHJfc3BhY2U7CisKKwlpZiAoYWNwaV9mYWlsdXJlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJTUE1JIiwgaW50Zl9udW0rMSwKKwkJCQkJIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAorCQkJCQkgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikgJnNwbWkpOworCWlmIChzdGF0dXMgIT0gQUVfT0spIHsKKwkJYWNwaV9mYWlsdXJlID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHNwbWktPklQTUlsZWdhY3kgIT0gMSkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICJJUE1JOiBCYWQgU1BNSSBsZWdhY3kgJWRcbiIsIHNwbWktPklQTUlsZWdhY3kpOworICAJICAgIHJldHVybiAtRU5PREVWOworCX0KKworCWlmIChzcG1pLT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkKKwkJYWRkcl9zcGFjZSA9IElQTUlfTUVNX0FERFJfU1BBQ0U7CisJZWxzZQorCQlhZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOworCWlmICghaXNfbmV3X2ludGVyZmFjZSgtMSwgYWRkcl9zcGFjZSwgc3BtaS0+YWRkci5hZGRyZXNzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXNwbWktPmFkZHIucmVnaXN0ZXJfYml0X3dpZHRoKSB7CisJCWFjcGlfZmFpbHVyZSA9IDE7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZpZ3VyZSBvdXQgdGhlIGludGVyZmFjZSB0eXBlLiAqLworCXN3aXRjaCAoc3BtaS0+SW50ZXJmYWNlVHlwZSkKKwl7CisJY2FzZSAxOgkvKiBLQ1MgKi8KKwkJc2lfdHlwZVtpbnRmX251bV0gPSAia2NzIjsKKwkJYnJlYWs7CisKKwljYXNlIDI6CS8qIFNNSUMgKi8KKwkJc2lfdHlwZVtpbnRmX251bV0gPSAic21pYyI7CisJCWJyZWFrOworCisJY2FzZSAzOgkvKiBCVCAqLworCQlzaV90eXBlW2ludGZfbnVtXSA9ICJidCI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaV9zaTogVW5rbm93biBBQ1BJL1NQTUkgU0kgdHlwZSAlZFxuIiwKKwkJCXNwbWktPkludGVyZmFjZVR5cGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMylcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaWYgKHNwbWktPkludGVycnVwdFR5cGUgJiAxKSB7CisJCS8qIFdlJ3ZlIGdvdCBhIEdQRSBpbnRlcnJ1cHQuICovCisJCWluZm8tPmlycSA9IHNwbWktPkdQRTsKKwkJaW5mby0+aXJxX3NldHVwID0gYWNwaV9ncGVfaXJxX3NldHVwOworCQlpbmZvLT5pcnFfY2xlYW51cCA9IGFjcGlfZ3BlX2lycV9jbGVhbnVwOworCX0gZWxzZSBpZiAoc3BtaS0+SW50ZXJydXB0VHlwZSAmIDIpIHsKKwkJLyogV2UndmUgZ290IGFuIEFQSUMvU0FQSUMgaW50ZXJydXB0LiAqLworCQlpbmZvLT5pcnEgPSBzcG1pLT5HbG9iYWxTeXN0ZW1JbnRlcnJ1cHQ7CisJCWluZm8tPmlycV9zZXR1cCA9IHN0ZF9pcnFfc2V0dXA7CisJCWluZm8tPmlycV9jbGVhbnVwID0gc3RkX2lycV9jbGVhbnVwOworCX0gZWxzZSB7CisJCS8qIFVzZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgc2V0dGluZy4gKi8KKwkJaW5mby0+aXJxID0gMDsKKwkJaW5mby0+aXJxX3NldHVwID0gTlVMTDsKKwl9CisKKwlyZWdzcGFjaW5nc1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCAvIDg7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHNwbWktPmFkZHIucmVnaXN0ZXJfYml0X3dpZHRoIC8gODsKKwlyZWdzaXplc1tpbnRmX251bV0gPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaW5mby0+aW8ucmVnc2l6ZSA9IHJlZ3NpemVzW2ludGZfbnVtXTsKKwlyZWdzaGlmdHNbaW50Zl9udW1dID0gc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfb2Zmc2V0OworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKworCWlmIChzcG1pLT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgeworCQlpb190eXBlID0gIm1lbW9yeSI7CisJCWluZm8tPmlvX3NldHVwID0gbWVtX3NldHVwOworCQlhZGRyc1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLmFkZHJlc3M7CisJCWluZm8tPmlvLmluZm8gPSAmKGFkZHJzW2ludGZfbnVtXSk7CisJfSBlbHNlIGlmIChzcG1pLT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSB7CisJCWlvX3R5cGUgPSAiSS9PIjsKKwkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOworCQlwb3J0c1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLmFkZHJlc3M7CisJCWluZm8tPmlvLmluZm8gPSAmKHBvcnRzW2ludGZfbnVtXSk7CisJfSBlbHNlIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXByaW50aygiaXBtaV9zaTogVW5rbm93biBBQ1BJIEkvTyBBZGRyZXNzIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkqbmV3X2luZm8gPSBpbmZvOworCisJcHJpbnRrKCJpcG1pX3NpOiBBQ1BJL1NQTUkgc3BlY2lmaWVzIFwiJXNcIiAlcyBTSSBAIDB4JWx4XG4iLAorCSAgICAgICBzaV90eXBlW2ludGZfbnVtXSwgaW9fdHlwZSwgKHVuc2lnbmVkIGxvbmcpIHNwbWktPmFkZHIuYWRkcmVzcyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODYKK3R5cGVkZWYgc3RydWN0IGRtaV9pcG1pX2RhdGEKK3sKKwl1OCAgIAkJdHlwZTsKKwl1OCAgIAkJYWRkcl9zcGFjZTsKKwl1bnNpZ25lZCBsb25nCWJhc2VfYWRkcjsKKwl1OCAgIAkJaXJxOworCXU4ICAgICAgICAgICAgICBvZmZzZXQ7CisJdTggICAgICAgICAgICAgIHNsYXZlX2FkZHI7Cit9IGRtaV9pcG1pX2RhdGFfdDsKKworc3RhdGljIGRtaV9pcG1pX2RhdGFfdCBkbWlfZGF0YVtTSV9NQVhfRFJJVkVSU107CitzdGF0aWMgaW50IGRtaV9kYXRhX2VudHJpZXM7CisKK3R5cGVkZWYgc3RydWN0IGRtaV9oZWFkZXIKK3sKKwl1OAl0eXBlOworCXU4CWxlbmd0aDsKKwl1MTYJaGFuZGxlOworfSBkbWlfaGVhZGVyX3Q7CisKK3N0YXRpYyBpbnQgZGVjb2RlX2RtaShkbWlfaGVhZGVyX3QgKmRtLCBpbnQgaW50Zl9udW0pCit7CisJdTgJCSpkYXRhID0gKHU4ICopZG07CisJdW5zaWduZWQgbG9uZyAgCWJhc2VfYWRkcjsKKwl1OAkJcmVnX3NwYWNpbmc7CisJdTggICAgICAgICAgICAgIGxlbiA9IGRtLT5sZW5ndGg7CisJZG1pX2lwbWlfZGF0YV90ICppcG1pX2RhdGEgPSBkbWlfZGF0YStpbnRmX251bTsKKworCWlwbWlfZGF0YS0+dHlwZSA9IGRhdGFbNF07CisKKwltZW1jcHkoJmJhc2VfYWRkciwgZGF0YSs4LCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWlmIChsZW4gPj0gMHgxMSkgeworCQlpZiAoYmFzZV9hZGRyICYgMSkgeworCQkJLyogSS9PICovCisJCQliYXNlX2FkZHIgJj0gMHhGRkZFOworCQkJaXBtaV9kYXRhLT5hZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOworCQl9CisJCWVsc2UgeworCQkJLyogTWVtb3J5ICovCisJCQlpcG1pX2RhdGEtPmFkZHJfc3BhY2UgPSBJUE1JX01FTV9BRERSX1NQQUNFOworCQl9CisJCS8qIElmIGJpdCA0IG9mIGJ5dGUgMHgxMCBpcyBzZXQsIHRoZW4gdGhlIGxzYiBmb3IgdGhlIGFkZHJlc3MKKwkJICAgaXMgb2RkLiAqLworCQlpcG1pX2RhdGEtPmJhc2VfYWRkciA9IGJhc2VfYWRkciB8ICgoZGF0YVsweDEwXSAmIDB4MTApID4+IDQpOworCisJCWlwbWlfZGF0YS0+aXJxID0gZGF0YVsweDExXTsKKworCQkvKiBUaGUgdG9wIHR3byBiaXRzIG9mIGJ5dGUgMHgxMCBob2xkIHRoZSByZWdpc3RlciBzcGFjaW5nLiAqLworCQlyZWdfc3BhY2luZyA9IChkYXRhWzB4MTBdICYgMHhDMCkgPj4gNjsKKwkJc3dpdGNoKHJlZ19zcGFjaW5nKXsKKwkJY2FzZSAweDAwOiAvKiBCeXRlIGJvdW5kYXJpZXMgKi8KKwkJICAgIGlwbWlfZGF0YS0+b2Zmc2V0ID0gMTsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MDE6IC8qIDMyLWJpdCBib3VuZGFyaWVzICovCisJCSAgICBpcG1pX2RhdGEtPm9mZnNldCA9IDQ7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDAyOiAvKiAxNi1ieXRlIGJvdW5kYXJpZXMgKi8KKwkJICAgIGlwbWlfZGF0YS0+b2Zmc2V0ID0gMTY7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIC8qIFNvbWUgb3RoZXIgaW50ZXJmYWNlLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJICAgIHJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJLyogT2xkIERNSSBzcGVjLiAqLworCQlpcG1pX2RhdGEtPmJhc2VfYWRkciA9IGJhc2VfYWRkcjsKKwkJaXBtaV9kYXRhLT5hZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOworCQlpcG1pX2RhdGEtPm9mZnNldCA9IDE7CisJfQorCisJaXBtaV9kYXRhLT5zbGF2ZV9hZGRyID0gZGF0YVs2XTsKKworCWlmIChpc19uZXdfaW50ZXJmYWNlKC0xLCBpcG1pX2RhdGEtPmFkZHJfc3BhY2UsaXBtaV9kYXRhLT5iYXNlX2FkZHIpKSB7CisJCWRtaV9kYXRhX2VudHJpZXMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KGlwbWlfZGF0YSwgMCwgc2l6ZW9mKGRtaV9pcG1pX2RhdGFfdCkpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSkKK3sKKwl1OCAJCSAgKmJ1ZjsKKwlzdHJ1Y3QgZG1pX2hlYWRlciAqZG07CisJdTggCQkgICpkYXRhOworCWludCAJCSAgaT0xOworCWludAkJICBzdGF0dXM9LTE7CisJaW50ICAgICAgICAgICAgICAgaW50Zl9udW0gPSAwOworCisJYnVmID0gaW9yZW1hcChiYXNlLCBsZW4pOworCWlmKGJ1Zj09TlVMTCkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IGJ1ZjsKKworCXdoaWxlKGk8bnVtICYmIChkYXRhIC0gYnVmKSA8IGxlbikKKwl7CisJCWRtPShkbWlfaGVhZGVyX3QgKilkYXRhOworCisJCWlmKChkYXRhLWJ1ZitkbS0+bGVuZ3RoKSA+PSBsZW4pCisgICAgICAgIAkJYnJlYWs7CisKKwkJaWYgKGRtLT50eXBlID09IDM4KSB7CisJCQlpZiAoZGVjb2RlX2RtaShkbSwgaW50Zl9udW0pID09IDApIHsKKwkJCQlpbnRmX251bSsrOworCQkJCWlmIChpbnRmX251bSA+PSBTSV9NQVhfRFJJVkVSUykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCSAgICAgICAgZGF0YSs9ZG0tPmxlbmd0aDsKKwkJd2hpbGUoKGRhdGEtYnVmKSA8IGxlbiAmJiAoKmRhdGEgfHwgZGF0YVsxXSkpCisJCQlkYXRhKys7CisJCWRhdGErPTI7CisJCWkrKzsKKwl9CisJaW91bm1hcChidWYpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW5saW5lIHN0YXRpYyBpbnQgZG1pX2NoZWNrc3VtKHU4ICpidWYpCit7CisJdTggICBzdW09MDsKKwlpbnQgIGE7CisKKwlmb3IoYT0wOyBhPDE1OyBhKyspCisJCXN1bSs9YnVmW2FdOworCXJldHVybiAoc3VtPT0wKTsKK30KKworc3RhdGljIGludCBkbWlfZGVjb2RlKHZvaWQpCit7CisJdTggICBidWZbMTVdOworCXUzMiAgZnA9MHhGMDAwMDsKKworI2lmZGVmIENPTkZJR19TSU1OT1cKKwlyZXR1cm4gLTE7CisjZW5kaWYKKworCXdoaWxlKGZwIDwgMHhGRkZGRikKKwl7CisJCWlzYV9tZW1jcHlfZnJvbWlvKGJ1ZiwgZnAsIDE1KTsKKwkJaWYobWVtY21wKGJ1ZiwgIl9ETUlfIiwgNSk9PTAgJiYgZG1pX2NoZWNrc3VtKGJ1ZikpCisJCXsKKwkJCXUxNiBudW09YnVmWzEzXTw8OHxidWZbMTJdOworCQkJdTE2IGxlbj1idWZbN108PDh8YnVmWzZdOworCQkJdTMyIGJhc2U9YnVmWzExXTw8MjR8YnVmWzEwXTw8MTZ8YnVmWzldPDw4fGJ1Zls4XTsKKworCQkJaWYoZG1pX3RhYmxlKGJhc2UsIGxlbiwgbnVtKSA9PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJCWZwKz0xNjsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfc21iaW9zKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICAgKmluZm87CisJZG1pX2lwbWlfZGF0YV90ICAgKmlwbWlfZGF0YSA9IGRtaV9kYXRhK2ludGZfbnVtOworCWNoYXIgICAgICAgICAgICAgICppb190eXBlOworCisJaWYgKGludGZfbnVtID49IGRtaV9kYXRhX2VudHJpZXMpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoKGlwbWlfZGF0YS0+dHlwZSkgeworCQljYXNlIDB4MDE6IC8qIEtDUyAqLworCQkJc2lfdHlwZVtpbnRmX251bV0gPSAia2NzIjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6IC8qIFNNSUMgKi8KKwkJCXNpX3R5cGVbaW50Zl9udW1dID0gInNtaWMiOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzogLyogQlQgKi8KKwkJCXNpX3R5cGVbaW50Zl9udW1dID0gImJ0IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU87CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDQpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWlmIChpcG1pX2RhdGEtPmFkZHJfc3BhY2UgPT0gMSkgeworCQlpb190eXBlID0gIm1lbW9yeSI7CisJCWluZm8tPmlvX3NldHVwID0gbWVtX3NldHVwOworCQlhZGRyc1tpbnRmX251bV0gPSBpcG1pX2RhdGEtPmJhc2VfYWRkcjsKKwkJaW5mby0+aW8uaW5mbyA9ICYoYWRkcnNbaW50Zl9udW1dKTsKKwl9IGVsc2UgaWYgKGlwbWlfZGF0YS0+YWRkcl9zcGFjZSA9PSAyKSB7CisJCWlvX3R5cGUgPSAiSS9PIjsKKwkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOworCQlwb3J0c1tpbnRmX251bV0gPSBpcG1pX2RhdGEtPmJhc2VfYWRkcjsKKwkJaW5mby0+aW8uaW5mbyA9ICYocG9ydHNbaW50Zl9udW1dKTsKKwl9IGVsc2UgeworCQlrZnJlZShpbmZvKTsKKwkJcHJpbnRrKCJpcG1pX3NpOiBVbmtub3duIFNNQklPUyBJL08gQWRkcmVzcyB0eXBlLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJlZ3NwYWNpbmdzW2ludGZfbnVtXSA9IGlwbWlfZGF0YS0+b2Zmc2V0OworCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NpemUgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOworCisJaW5mby0+c2xhdmVfYWRkciA9IGlwbWlfZGF0YS0+c2xhdmVfYWRkcjsKKworCWlycXNbaW50Zl9udW1dID0gaXBtaV9kYXRhLT5pcnE7CisKKwkqbmV3X2luZm8gPSBpbmZvOworCisJcHJpbnRrKCJpcG1pX3NpOiBGb3VuZCBTTUJJT1Mtc3BlY2lmaWVkIHN0YXRlIG1hY2hpbmUgYXQgJXMiCisJICAgICAgICIgYWRkcmVzcyAweCVseCwgc2xhdmUgYWRkcmVzcyAweCV4XG4iLAorCSAgICAgICBpb190eXBlLCAodW5zaWduZWQgbG9uZylpcG1pX2RhdGEtPmJhc2VfYWRkciwKKwkgICAgICAgaXBtaV9kYXRhLT5zbGF2ZV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2ICovCisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNkZWZpbmUgUENJX0VSTUNfQ0xBU1NDT0RFICAweDBDMDcwMAorI2RlZmluZSBQQ0lfSFBfVkVORE9SX0lEICAgIDB4MTAzQworI2RlZmluZSBQQ0lfTU1DX0RFVklDRV9JRCAgIDB4MTIxQQorI2RlZmluZSBQQ0lfTU1DX0FERFJfQ1cgICAgIDB4MTAKKworLyogQXZvaWQgbW9yZSB0aGFuIG9uZSBhdHRlbXB0IHRvIHByb2JlIHBjaSBzbWljLiAqLworc3RhdGljIGludCBwY2lfc21pY19jaGVja2VkID0gMDsKKworc3RhdGljIGludCBmaW5kX3BjaV9zbWljKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICAqaW5mbzsKKwlpbnQgICAgICAgICAgICAgIGVycm9yOworCXN0cnVjdCBwY2lfZGV2ICAgKnBjaV9kZXYgPSBOVUxMOworCXUxNiAgICAJCSBiYXNlX2FkZHI7CisJaW50ICAgICAgICAgICAgICBmZV9ybWMgPSAwOworCisJaWYgKHBjaV9zbWljX2NoZWNrZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3NtaWNfY2hlY2tlZCA9IDE7CisKKwlpZiAoKHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfSFBfVkVORE9SX0lELCBQQ0lfTU1DX0RFVklDRV9JRCwKKwkJCQkgICAgICAgTlVMTCkpKQorCQk7CisJZWxzZSBpZiAoKHBjaV9kZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9FUk1DX0NMQVNTQ09ERSwgTlVMTCkpICYmCisJCSBwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9IUF9WRU5ET1JfSUQpCisJCWZlX3JtYyA9IDE7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVycm9yID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX01NQ19BRERSX0NXLCAmYmFzZV9hZGRyKTsKKwlpZiAoZXJyb3IpCisJeworCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogcGNpX3JlYWRfY29uZmlnX3dvcmQoKSBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICAgICBlcnJvcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEJpdCAwOiAxIHNwZWNpZmllcyBwcm9ncmFtbWVkIEkvTywgMCBzcGVjaWZpZXMgbWVtb3J5IG1hcHBlZCBJL08gKi8KKwlpZiAoIShiYXNlX2FkZHIgJiAweDAwMDEpKQorCXsKKwkJcGNpX2Rldl9wdXQocGNpX2Rldik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlwbWlfc2k6IG1lbW9yeSBtYXBwZWQgSS9PIG5vdCBzdXBwb3J0ZWQgZm9yIFBDSSIKKwkJICAgICAgICIgc21pYy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwliYXNlX2FkZHIgJj0gMHhGRkZFOworCWlmICghZmVfcm1jKQorCQkvKiBEYXRhIHJlZ2lzdGVyIHN0YXJ0cyBhdCBiYXNlIGFkZHJlc3MgKyAxIGluIGVSTUMgKi8KKwkJKytiYXNlX2FkZHI7CisKKwlpZiAoIWlzX25ld19pbnRlcmZhY2UoLTEsIElQTUlfSU9fQUREUl9TUEFDRSwgYmFzZV9hZGRyKSkgeworCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQlwcmludGsoS0VSTl9FUlIgImlwbWlfc2k6IENvdWxkIG5vdCBhbGxvY2F0ZSBTSSBkYXRhICg1KVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlpbmZvLT5pb19zZXR1cCA9IHBvcnRfc2V0dXA7CisJcG9ydHNbaW50Zl9udW1dID0gYmFzZV9hZGRyOworCWluZm8tPmlvLmluZm8gPSAmKHBvcnRzW2ludGZfbnVtXSk7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKKwlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CisKKwkqbmV3X2luZm8gPSBpbmZvOworCisJaXJxc1tpbnRmX251bV0gPSBwY2lfZGV2LT5pcnE7CisJc2lfdHlwZVtpbnRmX251bV0gPSAic21pYyI7CisKKwlwcmludGsoImlwbWlfc2k6IEZvdW5kIFBDSSBTTUlDIGF0IEkvTyBhZGRyZXNzIDB4JWx4XG4iLAorCQkobG9uZyB1bnNpZ25lZCBpbnQpIGJhc2VfYWRkcik7CisKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfcGx1Z19hbmRfcGxheShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoZmluZF9wY2lfc21pYyhpbnRmX251bSwgbmV3X2luZm8pPT0wKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCS8qIEluY2x1ZGUgb3RoZXIgbWV0aG9kcyBoZXJlLiAqLworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworc3RhdGljIGludCB0cnlfZ2V0X2Rldl9pZChzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXVuc2lnbmVkIGNoYXIgICAgICBtc2dbMl07CisJdW5zaWduZWQgY2hhciAgICAgICpyZXNwOworCXVuc2lnbmVkIGxvbmcgICAgICByZXNwX2xlbjsKKwllbnVtIHNpX3NtX3Jlc3VsdCBzbWlfcmVzdWx0OworCWludCAgICAgICAgICAgICAgIHJ2ID0gMDsKKworCXJlc3AgPSBrbWFsbG9jKElQTUlfTUFYX01TR19MRU5HVEgsIEdGUF9LRVJORUwpOworCWlmICghcmVzcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEbyBhIEdldCBEZXZpY2UgSUQgY29tbWFuZCwgc2luY2UgaXQgY29tZXMgYmFjayB3aXRoIHNvbWUKKwkgICB1c2VmdWwgaW5mby4gKi8KKwltc2dbMF0gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDI7CisJbXNnWzFdID0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRDsKKwlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKHNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKKworCXNtaV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJZm9yICg7OykKKwl7CisJCWlmIChzbWlfcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSF9ERUxBWSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNtaV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwgMTAwKTsKKwkJfQorCQllbHNlIGlmIChzbWlfcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWSkKKwkJeworCQkJc21pX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoCisJCQkJc21pX2luZm8tPnNpX3NtLCAwKTsKKwkJfQorCQllbHNlCisJCQlicmVhazsKKwl9CisJaWYgKHNtaV9yZXN1bHQgPT0gU0lfU01fSE9TRUQpIHsKKwkJLyogV2UgY291bGRuJ3QgZ2V0IHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHJ1biwgc28gd2hhdGV2ZXIncyBhdAorCQkgICB0aGUgcG9ydCBpcyBwcm9iYWJseSBub3QgYW4gSVBNSSBTTUkgaW50ZXJmYWNlLiAqLworCQlydiA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE90aGVyd2lzZSwgd2UgZ290IHNvbWUgZGF0YS4gKi8KKwlyZXNwX2xlbiA9IHNtaV9pbmZvLT5oYW5kbGVycy0+Z2V0X3Jlc3VsdChzbWlfaW5mby0+c2lfc20sCisJCQkJCQkgIHJlc3AsIElQTUlfTUFYX01TR19MRU5HVEgpOworCWlmIChyZXNwX2xlbiA8IDYpIHsKKwkJLyogVGhhdCdzIG9kZCwgaXQgc2hvdWxkIGJlIGxvbmdlci4gKi8KKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHJlc3BbMV0gIT0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRCkgfHwgKHJlc3BbMl0gIT0gMCkpIHsKKwkJLyogVGhhdCdzIG9kZCwgaXQgc2hvdWxkbid0IGJlIGFibGUgdG8gZmFpbC4gKi8KKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZWNvcmQgaW5mbyBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkLCBpbiBjYXNlIHdlIG5lZWQgaXQuICovCisJc21pX2luZm8tPmlwbWlfc2lfZGV2X3JldiA9IHJlc3BbNF0gJiAweGY7CisJc21pX2luZm8tPmlwbWlfc2lfZndfcmV2X21ham9yID0gcmVzcFs1XSAmIDB4N2Y7CisJc21pX2luZm8tPmlwbWlfc2lfZndfcmV2X21pbm9yID0gcmVzcFs2XTsKKwlzbWlfaW5mby0+aXBtaV92ZXJzaW9uX21ham9yID0gcmVzcFs3XSAmIDB4ZjsKKwlzbWlfaW5mby0+aXBtaV92ZXJzaW9uX21pbm9yID0gcmVzcFs3XSA+PiA0OworCisgb3V0OgorCWtmcmVlKHJlc3ApOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCB0eXBlX2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAgICAgICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOworCXN0cnVjdCBzbWlfaW5mbyAqc21pID0gZGF0YTsKKworCXN3aXRjaCAoc21pLT5zaV90eXBlKSB7CisJICAgIGNhc2UgU0lfS0NTOgorCQlyZXR1cm4gc3ByaW50ZihvdXQsICJrY3NcbiIpOworCSAgICBjYXNlIFNJX1NNSUM6CisJCXJldHVybiBzcHJpbnRmKG91dCwgInNtaWNcbiIpOworCSAgICBjYXNlIFNJX0JUOgorCQlyZXR1cm4gc3ByaW50ZihvdXQsICJidFxuIik7CisJICAgIGRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBzdGF0X2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAgICAgICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOworCXN0cnVjdCBzbWlfaW5mbyAqc21pID0gZGF0YTsKKworCW91dCArPSBzcHJpbnRmKG91dCwgImludGVycnVwdHNfZW5hYmxlZDogICAgJWRcbiIsCisJCSAgICAgICBzbWktPmlycSAmJiAhc21pLT5pbnRlcnJ1cHRfZGlzYWJsZWQpOworCW91dCArPSBzcHJpbnRmKG91dCwgInNob3J0X3RpbWVvdXRzOiAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5zaG9ydF90aW1lb3V0cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAibG9uZ190aW1lb3V0czogICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmxvbmdfdGltZW91dHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInRpbWVvdXRfcmVzdGFydHM6ICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT50aW1lb3V0X3Jlc3RhcnRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJpZGxlczogICAgICAgICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+aWRsZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImludGVycnVwdHM6ICAgICAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5pbnRlcnJ1cHRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJhdHRlbnRpb25zOiAgICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+YXR0ZW50aW9ucyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZmxhZ19mZXRjaGVzOiAgICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmZsYWdfZmV0Y2hlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaG9zZWRfY291bnQ6ICAgICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmhvc2VkX2NvdW50KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJjb21wbGV0ZV90cmFuc2FjdGlvbnM6ICVsZFxuIiwKKwkJICAgICAgIHNtaS0+Y29tcGxldGVfdHJhbnNhY3Rpb25zKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJldmVudHM6ICAgICAgICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+ZXZlbnRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ3YXRjaGRvZ19wcmV0aW1lb3V0czogICVsZFxuIiwKKwkJICAgICAgIHNtaS0+d2F0Y2hkb2dfcHJldGltZW91dHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImluY29taW5nX21lc3NhZ2VzOiAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKwlyZXR1cm4gKG91dCAtICgoY2hhciAqKSBwYWdlKSk7Cit9CisKKy8qIFJldHVybnMgMCBpZiBpbml0aWFsaXplZCwgb3IgbmVnYXRpdmUgb24gYW4gZXJyb3IuICovCitzdGF0aWMgaW50IGluaXRfb25lX3NtaShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKnNtaSkKK3sKKwlpbnQJCXJ2OworCXN0cnVjdCBzbWlfaW5mbyAqbmV3X3NtaTsKKworCisJcnYgPSB0cnlfaW5pdF9tZW0oaW50Zl9udW0sICZuZXdfc21pKTsKKwlpZiAocnYpCisJCXJ2ID0gdHJ5X2luaXRfcG9ydChpbnRmX251bSwgJm5ld19zbWkpOworI2lmZGVmIENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisJaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworCQlydiA9IHRyeV9pbml0X2FjcGkoaW50Zl9udW0sICZuZXdfc21pKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2CisJaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworCQlydiA9IHRyeV9pbml0X3NtYmlvcyhpbnRmX251bSwgJm5ld19zbWkpOworICAgICAgICB9CisjZW5kaWYKKwlpZiAoKHJ2KSAmJiAoc2lfdHJ5ZGVmYXVsdHMpKSB7CisJCXJ2ID0gdHJ5X2luaXRfcGx1Z19hbmRfcGxheShpbnRmX251bSwgJm5ld19zbWkpOworCX0KKworCisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CisKKwkvKiBTbyB3ZSBrbm93IG5vdCB0byBmcmVlIGl0IHVubGVzcyB3ZSBoYXZlIGFsbG9jYXRlZCBvbmUuICovCisJbmV3X3NtaS0+aW50ZiA9IE5VTEw7CisJbmV3X3NtaS0+c2lfc20gPSBOVUxMOworCW5ld19zbWktPmhhbmRsZXJzID0gTlVMTDsKKworCWlmICghbmV3X3NtaS0+aXJxX3NldHVwKSB7CisJCW5ld19zbWktPmlycSA9IGlycXNbaW50Zl9udW1dOworCQluZXdfc21pLT5pcnFfc2V0dXAgPSBzdGRfaXJxX3NldHVwOworCQluZXdfc21pLT5pcnFfY2xlYW51cCA9IHN0ZF9pcnFfY2xlYW51cDsKKwl9CisKKwkvKiBEZWZhdWx0IHRvIEtDUyBpZiBubyB0eXBlIGlzIHNwZWNpZmllZC4gKi8KKwlpZiAoc2lfdHlwZVtpbnRmX251bV0gPT0gTlVMTCkgeworCQlpZiAoc2lfdHJ5ZGVmYXVsdHMpCisJCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCQllbHNlIHsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgc3RhdGUgbWFjaGluZSB0byB1c2UuICovCisJaWYgKHN0cmNtcChzaV90eXBlW2ludGZfbnVtXSwgImtjcyIpID09IDApIHsKKwkJbmV3X3NtaS0+aGFuZGxlcnMgPSAma2NzX3NtaV9oYW5kbGVyczsKKwkJbmV3X3NtaS0+c2lfdHlwZSA9IFNJX0tDUzsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaV90eXBlW2ludGZfbnVtXSwgInNtaWMiKSA9PSAwKSB7CisJCW5ld19zbWktPmhhbmRsZXJzID0gJnNtaWNfc21pX2hhbmRsZXJzOworCQluZXdfc21pLT5zaV90eXBlID0gU0lfU01JQzsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaV90eXBlW2ludGZfbnVtXSwgImJ0IikgPT0gMCkgeworCQluZXdfc21pLT5oYW5kbGVycyA9ICZidF9zbWlfaGFuZGxlcnM7CisJCW5ld19zbWktPnNpX3R5cGUgPSBTSV9CVDsKKwl9IGVsc2UgeworCQkvKiBObyBzdXBwb3J0IGZvciBhbnl0aGluZyBlbHNlIHlldC4gKi8KKwkJcnYgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIHN0YXRlIG1hY2hpbmUncyBkYXRhIGFuZCBpbml0aWFsaXplIGl0LiAqLworCW5ld19zbWktPnNpX3NtID0ga21hbGxvYyhuZXdfc21pLT5oYW5kbGVycy0+c2l6ZSgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19zbWktPnNpX3NtKSB7CisJCXByaW50aygiIENvdWxkIG5vdCBhbGxvY2F0ZSBzdGF0ZSBtYWNoaW5lIG1lbW9yeVxuIik7CisJCXJ2ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKwluZXdfc21pLT5pb19zaXplID0gbmV3X3NtaS0+aGFuZGxlcnMtPmluaXRfZGF0YShuZXdfc21pLT5zaV9zbSwKKwkJCQkJCQkmbmV3X3NtaS0+aW8pOworCisJLyogTm93IHRoYXQgd2Uga25vdyB0aGUgSS9PIHNpemUsIHdlIGNhbiBzZXQgdXAgdGhlIEkvTy4gKi8KKwlydiA9IG5ld19zbWktPmlvX3NldHVwKG5ld19zbWkpOworCWlmIChydikgeworCQlwcmludGsoIiBDb3VsZCBub3Qgc2V0IHVwIEkvTyBzcGFjZVxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmKG5ld19zbWktPnNpX2xvY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmKG5ld19zbWktPm1zZ19sb2NrKSk7CisJc3Bpbl9sb2NrX2luaXQoJihuZXdfc21pLT5jb3VudF9sb2NrKSk7CisKKwkvKiBEbyBsb3ctbGV2ZWwgZGV0ZWN0aW9uIGZpcnN0LiAqLworCWlmIChuZXdfc21pLT5oYW5kbGVycy0+ZGV0ZWN0KG5ld19zbWktPnNpX3NtKSkgeworCQlydiA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBBdHRlbXB0IGEgZ2V0IGRldmljZSBpZCBjb21tYW5kLiAgSWYgaXQgZmFpbHMsIHdlIHByb2JhYmx5CisgICAgICAgICAgIGRvbid0IGhhdmUgYSBTTUkgaGVyZS4gKi8KKwlydiA9IHRyeV9nZXRfZGV2X2lkKG5ld19zbWkpOworCWlmIChydikKKwkJZ290byBvdXRfZXJyOworCisJLyogVHJ5IHRvIGNsYWltIGFueSBpbnRlcnJ1cHRzLiAqLworCW5ld19zbWktPmlycV9zZXR1cChuZXdfc21pKTsKKworCUlOSVRfTElTVF9IRUFEKCYobmV3X3NtaS0+eG1pdF9tc2dzKSk7CisJSU5JVF9MSVNUX0hFQUQoJihuZXdfc21pLT5ocF94bWl0X21zZ3MpKTsKKwluZXdfc21pLT5jdXJyX21zZyA9IE5VTEw7CisJYXRvbWljX3NldCgmbmV3X3NtaS0+cmVxX2V2ZW50cywgMCk7CisJbmV3X3NtaS0+cnVuX3RvX2NvbXBsZXRpb24gPSAwOworCisJbmV3X3NtaS0+aW50ZXJydXB0X2Rpc2FibGVkID0gMDsKKwluZXdfc21pLT50aW1lcl9zdG9wcGVkID0gMDsKKwluZXdfc21pLT5zdG9wX29wZXJhdGlvbiA9IDA7CisKKwkvKiBTdGFydCBjbGVhcmluZyB0aGUgZmxhZ3MgYmVmb3JlIHdlIGVuYWJsZSBpbnRlcnJ1cHRzIG9yIHRoZQorCSAgIHRpbWVyIHRvIGF2b2lkIHJhY2luZyB3aXRoIHRoZSB0aW1lci4gKi8KKwlzdGFydF9jbGVhcl9mbGFncyhuZXdfc21pKTsKKwkvKiBJUlEgaXMgZGVmaW5lZCB0byBiZSBzZXQgd2hlbiBub24temVyby4gKi8KKwlpZiAobmV3X3NtaS0+aXJxKQorCQluZXdfc21pLT5zaV9zdGF0ZSA9IFNJX0NMRUFSSU5HX0ZMQUdTX1RIRU5fU0VUX0lSUTsKKworCS8qIFRoZSBpcG1pX3JlZ2lzdGVyX3NtaSgpIGNvZGUgZG9lcyBzb21lIG9wZXJhdGlvbnMgdG8KKwkgICBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24sIHNvIHdlIG11c3QgYmUgcmVhZHkgdG8KKwkgICBoYW5kbGUgb3BlcmF0aW9ucyBiZWZvcmUgaXQgaXMgY2FsbGVkLiAgVGhpcyBtZWFucyB3ZSBoYXZlCisJICAgdG8gc3RvcCB0aGUgdGltZXIgaWYgd2UgZ2V0IGFuIGVycm9yIGFmdGVyIHRoaXMgcG9pbnQuICovCisJaW5pdF90aW1lcigmKG5ld19zbWktPnNpX3RpbWVyKSk7CisJbmV3X3NtaS0+c2lfdGltZXIuZGF0YSA9IChsb25nKSBuZXdfc21pOworCW5ld19zbWktPnNpX3RpbWVyLmZ1bmN0aW9uID0gc21pX3RpbWVvdXQ7CisJbmV3X3NtaS0+bGFzdF90aW1lb3V0X2ppZmZpZXMgPSBqaWZmaWVzOworCW5ld19zbWktPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0lfVElNRU9VVF9KSUZGSUVTOworCWFkZF90aW1lcigmKG5ld19zbWktPnNpX3RpbWVyKSk7CisKKwlydiA9IGlwbWlfcmVnaXN0ZXJfc21pKCZoYW5kbGVycywKKwkJCSAgICAgICBuZXdfc21pLAorCQkJICAgICAgIG5ld19zbWktPmlwbWlfdmVyc2lvbl9tYWpvciwKKwkJCSAgICAgICBuZXdfc21pLT5pcG1pX3ZlcnNpb25fbWlub3IsCisJCQkgICAgICAgbmV3X3NtaS0+c2xhdmVfYWRkciwKKwkJCSAgICAgICAmKG5ld19zbWktPmludGYpKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZTogZXJyb3IgJWRcbiIsCisJCSAgICAgICBydik7CisJCWdvdG8gb3V0X2Vycl9zdG9wX3RpbWVyOworCX0KKworCXJ2ID0gaXBtaV9zbWlfYWRkX3Byb2NfZW50cnkobmV3X3NtaS0+aW50ZiwgInR5cGUiLAorCQkJCSAgICAgdHlwZV9maWxlX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkgICAgIG5ld19zbWksIFRISVNfTU9EVUxFKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5OiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CisJfQorCisJcnYgPSBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShuZXdfc21pLT5pbnRmLCAic2lfc3RhdHMiLAorCQkJCSAgICAgc3RhdF9maWxlX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkgICAgIG5ld19zbWksIFRISVNfTU9EVUxFKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5OiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CisJfQorCisJKnNtaSA9IG5ld19zbWk7CisKKwlwcmludGsoIiBJUE1JICVzIGludGVyZmFjZSBpbml0aWFsaXplZFxuIiwgc2lfdHlwZVtpbnRmX251bV0pOworCisJcmV0dXJuIDA7CisKKyBvdXRfZXJyX3N0b3BfdGltZXI6CisJbmV3X3NtaS0+c3RvcF9vcGVyYXRpb24gPSAxOworCisJLyogV2FpdCBmb3IgdGhlIHRpbWVyIHRvIHN0b3AuICBUaGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIHJhY2UKKwkgICBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLworCXdoaWxlICghbmV3X3NtaS0+dGltZXJfc3RvcHBlZCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisgb3V0X2VycjoKKwlpZiAobmV3X3NtaS0+aW50ZikKKwkJaXBtaV91bnJlZ2lzdGVyX3NtaShuZXdfc21pLT5pbnRmKTsKKworCW5ld19zbWktPmlycV9jbGVhbnVwKG5ld19zbWkpOworCisJLyogV2FpdCB1bnRpbCB3ZSBrbm93IHRoYXQgd2UgYXJlIG91dCBvZiBhbnkgaW50ZXJydXB0CisJICAgaGFuZGxlcnMgbWlnaHQgaGF2ZSBiZWVuIHJ1bm5pbmcgYmVmb3JlIHdlIGZyZWVkIHRoZQorCSAgIGludGVycnVwdC4gKi8KKwlzeW5jaHJvbml6ZV9rZXJuZWwoKTsKKworCWlmIChuZXdfc21pLT5zaV9zbSkgeworCQlpZiAobmV3X3NtaS0+aGFuZGxlcnMpCisJCQluZXdfc21pLT5oYW5kbGVycy0+Y2xlYW51cChuZXdfc21pLT5zaV9zbSk7CisJCWtmcmVlKG5ld19zbWktPnNpX3NtKTsKKwl9CisJbmV3X3NtaS0+aW9fY2xlYW51cChuZXdfc21pKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaW5pdF9pcG1pX3NpKHZvaWQpCit7CisJaW50ICBydiA9IDA7CisJaW50ICBwb3MgPSAwOworCWludCAgaTsKKwljaGFyICpzdHI7CisKKwlpZiAoaW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCWluaXRpYWxpemVkID0gMTsKKworCS8qIFBhcnNlIG91dCB0aGUgc2lfdHlwZSBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50cy4gKi8KKwlzdHIgPSBzaV90eXBlX3N0cjsKKwlpZiAoKnN0ciAhPSAnXDAnKSB7CisJCWZvciAoaT0wOyAoaTxTSV9NQVhfUEFSTVMpICYmICgqc3RyICE9ICdcMCcpOyBpKyspIHsKKwkJCXNpX3R5cGVbaV0gPSBzdHI7CisJCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQkJaWYgKHN0cikgeworCQkJCSpzdHIgPSAnXDAnOworCQkJCXN0cisrOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gIklQTUkgU3lzdGVtIEludGVyZmFjZSBkcml2ZXIgdmVyc2lvbiAiCisJICAgICAgIElQTUlfU0lfVkVSU0lPTik7CisJaWYgKGtjc19zbWlfaGFuZGxlcnMudmVyc2lvbikKKwkJcHJpbnRrKCIsIEtDUyB2ZXJzaW9uICVzIiwga2NzX3NtaV9oYW5kbGVycy52ZXJzaW9uKTsKKwlpZiAoc21pY19zbWlfaGFuZGxlcnMudmVyc2lvbikKKwkJcHJpbnRrKCIsIFNNSUMgdmVyc2lvbiAlcyIsIHNtaWNfc21pX2hhbmRsZXJzLnZlcnNpb24pOworCWlmIChidF9zbWlfaGFuZGxlcnMudmVyc2lvbikKKyAgIAkgICAgICAgIHByaW50aygiLCBCVCB2ZXJzaW9uICVzIiwgYnRfc21pX2hhbmRsZXJzLnZlcnNpb24pOworCXByaW50aygiXG4iKTsKKworI2lmZGVmIENPTkZJR19YODYKKwlkbWlfZGVjb2RlKCk7CisjZW5kaWYKKworCXJ2ID0gaW5pdF9vbmVfc21pKDAsICYoc21pX2luZm9zW3Bvc10pKTsKKwlpZiAocnYgJiYgIXBvcnRzWzBdICYmIHNpX3RyeWRlZmF1bHRzKSB7CisJCS8qIElmIHdlIGFyZSB0cnlpbmcgZGVmYXVsdHMgYW5kIHRoZSBpbml0aWFsIHBvcnQgaXMKKyAgICAgICAgICAgICAgICAgICBub3Qgc2V0LCB0aGVuIHNldCBpdC4gKi8KKwkJc2lfdHlwZVswXSA9ICJrY3MiOworCQlwb3J0c1swXSA9IERFRkFVTFRfS0NTX0lPX1BPUlQ7CisJCXJ2ID0gaW5pdF9vbmVfc21pKDAsICYoc21pX2luZm9zW3Bvc10pKTsKKwkJaWYgKHJ2KSB7CisJCQkvKiBObyBLQ1MgLSB0cnkgU01JQyAqLworCQkJc2lfdHlwZVswXSA9ICJzbWljIjsKKwkJCXBvcnRzWzBdID0gREVGQVVMVF9TTUlDX0lPX1BPUlQ7CisJCQlydiA9IGluaXRfb25lX3NtaSgwLCAmKHNtaV9pbmZvc1twb3NdKSk7CisJCX0KKwkJaWYgKHJ2KSB7CisJCQkvKiBObyBTTUlDIC0gdHJ5IEJUICovCisJCQlzaV90eXBlWzBdID0gImJ0IjsKKwkJCXBvcnRzWzBdID0gREVGQVVMVF9CVF9JT19QT1JUOworCQkJcnYgPSBpbml0X29uZV9zbWkoMCwgJihzbWlfaW5mb3NbcG9zXSkpOworCQl9CisJfQorCWlmIChydiA9PSAwKQorCQlwb3MrKzsKKworCWZvciAoaT0xOyBpIDwgU0lfTUFYX1BBUk1TOyBpKyspIHsKKwkJcnYgPSBpbml0X29uZV9zbWkoaSwgJihzbWlfaW5mb3NbcG9zXSkpOworCQlpZiAocnYgPT0gMCkKKwkJCXBvcysrOworCX0KKworCWlmIChzbWlfaW5mb3NbMF0gPT0gTlVMTCkgeworCQlwcmludGsoImlwbWlfc2k6IFVuYWJsZSB0byBmaW5kIGFueSBTeXN0ZW0gSW50ZXJmYWNlKHMpXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpbml0X2lwbWlfc2kpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9vbmVfc2koc3RydWN0IHNtaV9pbmZvICp0b19jbGVhbikKK3sKKwlpbnQgICAgICAgICAgIHJ2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoISB0b19jbGVhbikKKwkJcmV0dXJuOworCisJLyogVGVsbCB0aGUgdGltZXIgYW5kIGludGVycnVwdCBoYW5kbGVycyB0aGF0IHdlIGFyZSBzaHV0dGluZworCSAgIGRvd24uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJih0b19jbGVhbi0+c2lfbG9jayksIGZsYWdzKTsKKwlzcGluX2xvY2soJih0b19jbGVhbi0+bXNnX2xvY2spKTsKKworCXRvX2NsZWFuLT5zdG9wX29wZXJhdGlvbiA9IDE7CisKKwl0b19jbGVhbi0+aXJxX2NsZWFudXAodG9fY2xlYW4pOworCisJc3Bpbl91bmxvY2soJih0b19jbGVhbi0+bXNnX2xvY2spKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYodG9fY2xlYW4tPnNpX2xvY2spLCBmbGFncyk7CisKKwkvKiBXYWl0IHVudGlsIHdlIGtub3cgdGhhdCB3ZSBhcmUgb3V0IG9mIGFueSBpbnRlcnJ1cHQKKwkgICBoYW5kbGVycyBtaWdodCBoYXZlIGJlZW4gcnVubmluZyBiZWZvcmUgd2UgZnJlZWQgdGhlCisJICAgaW50ZXJydXB0LiAqLworCXN5bmNocm9uaXplX2tlcm5lbCgpOworCisJLyogV2FpdCBmb3IgdGhlIHRpbWVyIHRvIHN0b3AuICBUaGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIHJhY2UKKwkgICBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLworCXdoaWxlICghdG9fY2xlYW4tPnRpbWVyX3N0b3BwZWQpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCS8qIEludGVycnVwdHMgYW5kIHRpbWVvdXRzIGFyZSBzdG9wcGVkLCBub3cgbWFrZSBzdXJlIHRoZQorCSAgIGludGVyZmFjZSBpcyBpbiBhIGNsZWFuIHN0YXRlLiAqLworCXdoaWxlICgodG9fY2xlYW4tPmN1cnJfbXNnKSB8fCAodG9fY2xlYW4tPnNpX3N0YXRlICE9IFNJX05PUk1BTCkpIHsKKwkJcG9sbCh0b19jbGVhbik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlydiA9IGlwbWlfdW5yZWdpc3Rlcl9zbWkodG9fY2xlYW4tPmludGYpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX3NpOiBVbmFibGUgdG8gdW5yZWdpc3RlciBkZXZpY2U6IGVycm5vPSVkXG4iLAorCQkgICAgICAgcnYpOworCX0KKworCXRvX2NsZWFuLT5oYW5kbGVycy0+Y2xlYW51cCh0b19jbGVhbi0+c2lfc20pOworCisJa2ZyZWUodG9fY2xlYW4tPnNpX3NtKTsKKworCXRvX2NsZWFuLT5pb19jbGVhbnVwKHRvX2NsZWFuKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGNsZWFudXBfaXBtaV9zaSh2b2lkKQoreworCWludCBpOworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJZm9yIChpPTA7IGk8U0lfTUFYX0RSSVZFUlM7IGkrKykgeworCQljbGVhbnVwX29uZV9zaShzbWlfaW5mb3NbaV0pOworCX0KK30KK21vZHVsZV9leGl0KGNsZWFudXBfaXBtaV9zaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfc20uaCBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDIxMmIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9zbS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogaXBtaV9zaV9zbS5oCisgKgorICogU3RhdGUgbWFjaGluZSBpbnRlcmZhY2UgZm9yIGxvdy1sZXZlbCBJUE1JIHN5c3RlbSBtYW5hZ2VtZW50CisgKiBpbnRlcmZhY2Ugc3RhdGUgbWFjaGluZXMuICBUaGlzIGNvZGUgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuCisgKiB0aGUgaXBtaV9zbWkgY29kZSAodGhhdCBoYW5kbGVzIHRoZSBwb2xpY3kgb2YgYSBLQ1MsIFNNSUMsIG9yCisgKiBCVCBpbnRlcmZhY2UpIGFuZCB0aGUgYWN0dWFsIGxvdy1sZXZlbCBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogVGhpcyBpcyBkZWZpbmVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lcyB0aGVtc2VsdmVzLCBpdCBpcyBhbiBvcGFxdWUKKyAgIGRhdGEgdHlwZSBmb3IgdGhlbSB0byB1c2UuICovCitzdHJ1Y3Qgc2lfc21fZGF0YTsKKworLyogVGhlIHN0cnVjdHVyZSBmb3IgZG9pbmcgSS9PIGluIHRoZSBzdGF0ZSBtYWNoaW5lLiAgVGhlIHN0YXRlCisgICBtYWNoaW5lIGRvZXNuJ3QgaGF2ZSB0aGUgYWN0dWFsIEkvTyByb3V0aW5lcywgdGhleSBhcmUgZG9uZSB0aHJvdWdoCisgICB0aGlzIGludGVyZmFjZS4gKi8KK3N0cnVjdCBzaV9zbV9pbworeworCXVuc2lnbmVkIGNoYXIgKCppbnB1dGIpKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpOworCXZvaWQgKCpvdXRwdXRiKShzdHJ1Y3Qgc2lfc21faW8gKmlvLAorCQkJdW5zaWduZWQgaW50ICBvZmZzZXQsCisJCQl1bnNpZ25lZCBjaGFyIGIpOworCisJLyogR2VuZXJpYyBpbmZvIHVzZWQgYnkgdGhlIGFjdHVhbCBoYW5kbGluZyByb3V0aW5lcywgdGhlCisgICAgICAgICAgIHN0YXRlIG1hY2hpbmUgc2hvdWxkbid0IHRvdWNoIHRoZXNlLiAqLworCXZvaWQgKmluZm87CisJdm9pZCAqYWRkcjsKKwlpbnQgIHJlZ3NwYWNpbmc7CisJaW50ICByZWdzaXplOworCWludCAgcmVnc2hpZnQ7Cit9OworCisvKiBSZXN1bHRzIG9mIFNNSSBldmVudHMuICovCitlbnVtIHNpX3NtX3Jlc3VsdAoreworCVNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWSwgLyogQ2FsbCB0aGUgZHJpdmVyIGFnYWluIGltbWVkaWF0ZWx5ICovCisJU0lfU01fQ0FMTF9XSVRIX0RFTEFZLAkvKiBEZWxheSBzb21lIGJlZm9yZSBjYWxsaW5nIGFnYWluLiAqLworCVNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFLCAvKiBBIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLiAqLworCVNJX1NNX0lETEUsCQkvKiBUaGUgU00gaXMgaW4gaWRsZSBzdGF0ZS4gKi8KKwlTSV9TTV9IT1NFRCwJCS8qIFRoZSBoYXJkd2FyZSB2aW9sYXRlZCB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKwlTSV9TTV9BVFROCQkvKiBUaGUgaGFyZHdhcmUgaXMgYXNzZXJ0aW5nIGF0dG4gYW5kIHRoZQorCQkJCSAgIHN0YXRlIG1hY2hpbmUgaXMgaWRsZS4gKi8KK307CisKKy8qIEhhbmRsZXJzIGZvciB0aGUgU01JIHN0YXRlIG1hY2hpbmUuICovCitzdHJ1Y3Qgc2lfc21faGFuZGxlcnMKK3sKKwkvKiBQdXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdGF0ZSBtYWNoaW5lIGhlcmUgc28gdGhlCisgICAgICAgICAgIHVwcGVyIGxheWVyIGNhbiBwcmludCBpdC4gKi8KKwljaGFyICp2ZXJzaW9uOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBhbW91bnQgb2YgSS9PIHNwYWNlIHRvCisgICAgICAgICAgIHJlc2VydmUgZm9yIHRoZSBzcGFjZS4gKi8KKwl1bnNpZ25lZCBpbnQgKCppbml0X2RhdGEpKHN0cnVjdCBzaV9zbV9kYXRhICpzbWksCisJCQkJICBzdHJ1Y3Qgc2lfc21faW8gICAqaW8pOworCisJLyogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gaW4gdGhlIHN0YXRlIG1hY2hpbmUuICBUaGlzIHdpbGwKKwkgICByZXR1cm4gLTIgaWYgdGhlIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIC0xIGlmIHRoZSBzaXplCisJICAgaXMgaW52YWxpZCAodG8gbGFyZ2Ugb3IgdG9vIHNtYWxsKSwgb3IgMCBpZiB0aGUgdHJhbnNhY3Rpb24KKwkgICBpcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAqLworCWludCAoKnN0YXJ0X3RyYW5zYWN0aW9uKShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pLAorCQkJCSB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKwkvKiBSZXR1cm4gdGhlIHJlc3VsdHMgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyB3aWxsIHJldHVybgorCSAgIC0xIGlmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCB6ZXJvIGlmIG5vIHRyYW5zYWN0aW9uIGlzCisJICAgcHJlc2VudCwgb3IgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHJlc3VsdCBkYXRhLiAqLworCWludCAoKmdldF9yZXN1bHQpKHN0cnVjdCBzaV9zbV9kYXRhICpzbWksCisJCQkgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW5ndGgpOworCisJLyogQ2FsbCB0aGlzIHBlcmlvZGljYWxseSAoZm9yIGEgcG9sbGVkIGludGVyZmFjZSkgb3IgdXBvbgorCSAgIHJlY2VpdmluZyBhbiBpbnRlcnJ1cHQgKGZvciBhIGludGVycnVwdC1kcml2ZW4gaW50ZXJmYWNlKS4KKwkgICBJZiBpbnRlcnJ1cHQgZHJpdmVuLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHBvbGwgdGhpcworCSAgIHBlcmlvZGljYWxseSB3aGVuIG5vdCBpbiBpZGxlIHN0YXRlLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkCisJICAgd2l0aCB0aGUgdGltZSB0aGF0IHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsLCBpZiBpdCBpcworCSAgIHNpZ25pZmljYW50LiAgVGltZSBpcyBpbiBtaWNyb3NlY29uZHMuICovCisJZW51bSBzaV9zbV9yZXN1bHQgKCpldmVudCkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSwgbG9uZyB0aW1lKTsKKworCS8qIEF0dGVtcHQgdG8gZGV0ZWN0IGFuIFNNSS4gIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5vbnplcm8KKyAgICAgICAgICAgb24gZmFpbHVyZS4gKi8KKwlpbnQgKCpkZXRlY3QpKHN0cnVjdCBzaV9zbV9kYXRhICpzbWkpOworCisJLyogVGhlIGludGVyZmFjZSBpcyBzaHV0dGluZyBkb3duLCBzbyBjbGVhbiBpdCB1cC4gKi8KKwl2b2lkICgqY2xlYW51cCkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSk7CisKKwkvKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIFNNSSBzdHJ1Y3R1cmUgaW4gYnl0ZXMuICovCisJaW50ICgqc2l6ZSkodm9pZCk7Cit9OworCisvKiBDdXJyZW50IHN0YXRlIG1hY2hpbmVzIHRoYXQgd2UgY2FuIHVzZS4gKi8KK2V4dGVybiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMga2NzX3NtaV9oYW5kbGVyczsKK2V4dGVybiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgc21pY19zbWlfaGFuZGxlcnM7CitleHRlcm4gc3RydWN0IHNpX3NtX2hhbmRsZXJzIGJ0X3NtaV9oYW5kbGVyczsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NtaWNfc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE4NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBpcG1pX3NtaWNfc20uYworICoKKyAqIFRoZSBzdGF0ZS1tYWNoaW5lIGRyaXZlciBmb3IgYW4gSVBNSSBTTUlDIGRyaXZlcgorICoKKyAqIEl0IHN0YXJ0ZWQgYXMgYSBjb3B5IG9mIENvcmV5IE1pbnlhcmQncyBkcml2ZXIgZm9yIHRoZSBLU0MgaW50ZXJmYWNlCisgKiBhbmQgdGhlIGtlcm5lbCBwYXRjaCAibW1jZGV2LXBhdGNoLTI0NSIgYnkgSFAKKyAqCisgKiBtb2RpZmllZCBieToJSGFubmVzIFNjaHVseiA8c2NodWx6QHNjaHdhYXIuY29tPgorICoJCWlwbWlAc2Nod2Fhci5jb20KKyAqCisgKgorICogQ29yZXkgTWlueWFyZCdzIGRyaXZlciBmb3IgdGhlIEtTQyBpbnRlcmZhY2UgaGFzIHRoZSBmb2xsb3dpbmcKKyAqIGNvcHlyaWdodCBub3RpY2U6CisgKiAgIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIHRoZSBrZXJuZWwgcGF0Y2ggIm1tY2Rldi1wYXRjaC0yNDUiIGJ5IEhQIGhhcyB0aGUgZm9sbG93aW5nCisgKiBjb3B5cmlnaHQgbm90aWNlOgorICogKGMpIENvcHlyaWdodCAyMDAxIEdyYW50IEdydW5kbGVyIChjKSBDb3B5cmlnaHQKKyAqIDIwMDEgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIEZvciBwcmludGsuICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLworI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKKworI2RlZmluZSBJUE1JX1NNSUNfVkVSU0lPTiAidjMzIgorCisvKiBzbWljX2RlYnVnIGlzIGEgYml0LWZpZWxkCisgKglTTUlDX0RFQlVHX0VOQUJMRSAtCXR1cm5lZCBvbiBmb3Igbm93CisgKglTTUlDX0RFQlVHX01TRyAtCWNvbW1hbmRzIGFuZCB0aGVpciByZXNwb25zZXMKKyAqCVNNSUNfREVCVUdfU1RBVEVTIC0Jc3RhdGUgbWFjaGluZQorKi8KKyNkZWZpbmUgU01JQ19ERUJVR19TVEFURVMJNAorI2RlZmluZSBTTUlDX0RFQlVHX01TRwkJMgorI2RlZmluZQlTTUlDX0RFQlVHX0VOQUJMRQkxCisKK3N0YXRpYyBpbnQgc21pY19kZWJ1ZyA9IDE7CisKK2VudW0gc21pY19zdGF0ZXMgeworCVNNSUNfSURMRSwKKwlTTUlDX1NUQVJUX09QLAorCVNNSUNfT1BfT0ssCisJU01JQ19XUklURV9TVEFSVCwKKwlTTUlDX1dSSVRFX05FWFQsCisJU01JQ19XUklURV9FTkQsCisJU01JQ19XUklURTJSRUFELAorCVNNSUNfUkVBRF9TVEFSVCwKKwlTTUlDX1JFQURfTkVYVCwKKwlTTUlDX1JFQURfRU5ELAorCVNNSUNfSE9TRUQKK307CisKKyNkZWZpbmUgTUFYX1NNSUNfUkVBRF9TSVpFIDgwCisjZGVmaW5lIE1BWF9TTUlDX1dSSVRFX1NJWkUgODAKKyNkZWZpbmUgU01JQ19NQVhfRVJST1JfUkVUUklFUyAzCisKKy8qIFRpbWVvdXRzIGluIG1pY3Jvc2Vjb25kcy4gKi8KKyNkZWZpbmUgU01JQ19SRVRSWV9USU1FT1VUIDEwMDAwMAorCisvKiBTTUlDIEZsYWdzIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgU01JQ19SWF9EQVRBX1JFQURZCTB4ODAKKyNkZWZpbmUgU01JQ19UWF9EQVRBX1JFQURZCTB4NDAKKyNkZWZpbmUgU01JQ19TTUkJCTB4MTAKKyNkZWZpbmUgU01JQ19FVk1fREFUQV9BVkFJTAkweDA4CisjZGVmaW5lIFNNSUNfU01TX0RBVEFfQVZBSUwJMHgwNAorI2RlZmluZSBTTUlDX0ZMQUdfQlNZCQkweDAxCisKKy8qIFNNSUMgRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUJRUNfTk9fRVJST1IJCTB4MDAKKyNkZWZpbmUJRUNfQUJPUlRFRAkJMHgwMQorI2RlZmluZQlFQ19JTExFR0FMX0NPTlRST0wJMHgwMgorI2RlZmluZQlFQ19OT19SRVNQT05TRQkJMHgwMworI2RlZmluZQlFQ19JTExFR0FMX0NPTU1BTkQJMHgwNAorI2RlZmluZQlFQ19CVUZGRVJfRlVMTAkJMHgwNQorCitzdHJ1Y3Qgc2lfc21fZGF0YQoreworCWVudW0gc21pY19zdGF0ZXMgc3RhdGU7CisJc3RydWN0IHNpX3NtX2lvICppbzsKKyAgICAgICAgdW5zaWduZWQgY2hhcgkgd3JpdGVfZGF0YVtNQVhfU01JQ19XUklURV9TSVpFXTsKKyAgICAgICAgaW50CQkgd3JpdGVfcG9zOworICAgICAgICBpbnQJCSB3cml0ZV9jb3VudDsKKyAgICAgICAgaW50CQkgb3JpZ193cml0ZV9jb3VudDsKKyAgICAgICAgdW5zaWduZWQgY2hhcgkgcmVhZF9kYXRhW01BWF9TTUlDX1JFQURfU0laRV07CisgICAgICAgIGludAkJIHJlYWRfcG9zOworICAgICAgICBpbnQJCSB0cnVuY2F0ZWQ7CisgICAgICAgIHVuc2lnbmVkIGludAkgZXJyb3JfcmV0cmllczsKKyAgICAgICAgbG9uZwkJIHNtaWNfdGltZW91dDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9zbWljX2RhdGEgKHN0cnVjdCBzaV9zbV9kYXRhICpzbWljLAorCQkJCSAgICBzdHJ1Y3Qgc2lfc21faW8gKmlvKQoreworCXNtaWMtPnN0YXRlID0gU01JQ19JRExFOworCXNtaWMtPmlvID0gaW87CisJc21pYy0+d3JpdGVfcG9zID0gMDsKKwlzbWljLT53cml0ZV9jb3VudCA9IDA7CisJc21pYy0+b3JpZ193cml0ZV9jb3VudCA9IDA7CisJc21pYy0+cmVhZF9wb3MgPSAwOworCXNtaWMtPmVycm9yX3JldHJpZXMgPSAwOworCXNtaWMtPnRydW5jYXRlZCA9IDA7CisJc21pYy0+c21pY190aW1lb3V0ID0gU01JQ19SRVRSWV9USU1FT1VUOworCisJLyogV2UgdXNlIDMgYnl0ZXMgb2YgSS9PLiAqLworCXJldHVybiAzOworfQorCitzdGF0aWMgaW50IHN0YXJ0X3NtaWNfdHJhbnNhY3Rpb24oc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gTUFYX1NNSUNfV1JJVEVfU0laRSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKHNtaWMtPnN0YXRlICE9IFNNSUNfSURMRSkgJiYgKHNtaWMtPnN0YXRlICE9IFNNSUNfSE9TRUQpKSB7CisJCXJldHVybiAtMjsKKwl9CisJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX01TRykgeworCQlwcmludGsoS0VSTl9JTkZPICJzdGFydF9zbWljX3RyYW5zYWN0aW9uIC0iKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKKwkJCXByaW50ayAoIiAlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpIChkYXRhIFtpXSkpOworCQl9CisJCXByaW50ayAoIlxuIik7CisJfQorCXNtaWMtPmVycm9yX3JldHJpZXMgPSAwOworCW1lbWNweShzbWljLT53cml0ZV9kYXRhLCBkYXRhLCBzaXplKTsKKwlzbWljLT53cml0ZV9jb3VudCA9IHNpemU7CisJc21pYy0+b3JpZ193cml0ZV9jb3VudCA9IHNpemU7CisJc21pYy0+d3JpdGVfcG9zID0gMDsKKwlzbWljLT5yZWFkX3BvcyA9IDA7CisJc21pYy0+c3RhdGUgPSBTTUlDX1NUQVJUX09QOworCXNtaWMtPnNtaWNfdGltZW91dCA9IFNNSUNfUkVUUllfVElNRU9VVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWljX2dldF9yZXN1bHQoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX01TRykgeworCQlwcmludGsgKEtFUk5fSU5GTyAic21pY19nZXQgcmVzdWx0IC0iKTsKKwkJZm9yIChpID0gMDsgaSA8IHNtaWMtPnJlYWRfcG9zOyBpICsrKSB7CisJCQlwcmludGsgKCIgJTAyeCIsIChzbWljLT5yZWFkX2RhdGEgW2ldKSk7CisJCX0KKwkJcHJpbnRrICgiXG4iKTsKKwl9CisJaWYgKGxlbmd0aCA8IHNtaWMtPnJlYWRfcG9zKSB7CisJCXNtaWMtPnJlYWRfcG9zID0gbGVuZ3RoOworCQlzbWljLT50cnVuY2F0ZWQgPSAxOworCX0KKwltZW1jcHkoZGF0YSwgc21pYy0+cmVhZF9kYXRhLCBzbWljLT5yZWFkX3Bvcyk7CisKKwlpZiAoKGxlbmd0aCA+PSAzKSAmJiAoc21pYy0+cmVhZF9wb3MgPCAzKSkgeworCQlkYXRhWzJdID0gSVBNSV9FUlJfVU5TUEVDSUZJRUQ7CisJCXNtaWMtPnJlYWRfcG9zID0gMzsKKwl9CisJaWYgKHNtaWMtPnRydW5jYXRlZCkgeworCQlkYXRhWzJdID0gSVBNSV9FUlJfTVNHX1RSVU5DQVRFRDsKKwkJc21pYy0+dHJ1bmNhdGVkID0gMDsKKwl9CisJcmV0dXJuIHNtaWMtPnJlYWRfcG9zOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9zbWljX2ZsYWdzKHN0cnVjdCBzaV9zbV9kYXRhICpzbWljKQoreworCXJldHVybiBzbWljLT5pby0+aW5wdXRiKHNtaWMtPmlvLCAyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfc21pY19zdGF0dXMoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJcmV0dXJuIHNtaWMtPmlvLT5pbnB1dGIoc21pYy0+aW8sIDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9zbWljX2RhdGEoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJcmV0dXJuIHNtaWMtPmlvLT5pbnB1dGIoc21pYy0+aW8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc21pY19mbGFncyhzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywKKwkJCQkgICAgdW5zaWduZWQgY2hhciAgIGZsYWdzKQoreworCXNtaWMtPmlvLT5vdXRwdXRiKHNtaWMtPmlvLCAyLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zbWljX2NvbnRyb2woc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAgIGNvbnRyb2wpCit7CisJc21pYy0+aW8tPm91dHB1dGIoc21pYy0+aW8sIDEsIGNvbnRyb2wpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc2lfc21fZGF0YSAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICAgdW5zaWduZWQgY2hhciAgIGRhdGEpCit7CisJc21pYy0+aW8tPm91dHB1dGIoc21pYy0+aW8sIDAsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsIGNoYXIgKnJlYXNvbikKK3sKKwkoc21pYy0+ZXJyb3JfcmV0cmllcykrKzsKKwlpZiAoc21pYy0+ZXJyb3JfcmV0cmllcyA+IFNNSUNfTUFYX0VSUk9SX1JFVFJJRVMpIHsKKwkJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX0VOQUJMRSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJpcG1pX3NtaWNfZHJ2OiBzbWljIGhvc2VkOiAlc1xuIiwgcmVhc29uKTsKKwkJfQorCQlzbWljLT5zdGF0ZSA9IFNNSUNfSE9TRUQ7CisJfSBlbHNlIHsKKwkJc21pYy0+d3JpdGVfY291bnQgPSBzbWljLT5vcmlnX3dyaXRlX2NvdW50OworCQlzbWljLT53cml0ZV9wb3MgPSAwOworCQlzbWljLT5yZWFkX3BvcyA9IDA7CisJCXNtaWMtPnN0YXRlID0gU01JQ19TVEFSVF9PUDsKKwkJc21pYy0+c21pY190aW1lb3V0ID0gU01JQ19SRVRSWV9USU1FT1VUOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX25leHRfYnl0ZShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYykKK3sKKwl3cml0ZV9zaV9zbV9kYXRhKHNtaWMsIHNtaWMtPndyaXRlX2RhdGFbc21pYy0+d3JpdGVfcG9zXSk7CisJKHNtaWMtPndyaXRlX3BvcykrKzsKKwkoc21pYy0+d3JpdGVfY291bnQpLS07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX25leHRfYnl0ZSAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJaWYgKHNtaWMtPnJlYWRfcG9zID49IE1BWF9TTUlDX1JFQURfU0laRSkgeworCQlyZWFkX3NtaWNfZGF0YSAoc21pYyk7CisJCXNtaWMtPnRydW5jYXRlZCA9IDE7CisJfSBlbHNlIHsKKwkJc21pYy0+cmVhZF9kYXRhW3NtaWMtPnJlYWRfcG9zXSA9IHJlYWRfc21pY19kYXRhKHNtaWMpOworCQkoc21pYy0+cmVhZF9wb3MpKys7CisJfQorfQorCisvKiAgU01JQyBDb250cm9sL1N0YXR1cyBDb2RlIENvbXBvbmVudHMgKi8KKyNkZWZpbmUJU01JQ19HRVRfU1RBVFVTCQkweDAwCS8qIENvbnRyb2wgZm9ybSdzIG5hbWUgKi8KKyNkZWZpbmUJU01JQ19SRUFEWQkJMHgwMAkvKiBTdGF0dXMgIGZvcm0ncyBuYW1lICovCisjZGVmaW5lCVNNSUNfV1JfU1RBUlQJCTB4MDEJLyogVW5pZmllZCBDb250cm9sL1N0YXR1cyBuYW1lcy4uLiAqLworI2RlZmluZQlTTUlDX1dSX05FWFQJCTB4MDIKKyNkZWZpbmUJU01JQ19XUl9FTkQJCTB4MDMKKyNkZWZpbmUJU01JQ19SRF9TVEFSVAkJMHgwNAorI2RlZmluZQlTTUlDX1JEX05FWFQJCTB4MDUKKyNkZWZpbmUJU01JQ19SRF9FTkQJCTB4MDYKKyNkZWZpbmUJU01JQ19DT0RFX01BU0sJCTB4MGYKKworI2RlZmluZQlTTUlDX0NPTlRST0wJCTB4MDAKKyNkZWZpbmUJU01JQ19TVEFUVVMJCTB4ODAKKyNkZWZpbmUJU01JQ19DU19NQVNLCQkweDgwCisKKyNkZWZpbmUJU01JQ19TTVMJCTB4NDAKKyNkZWZpbmUJU01JQ19TTU0JCTB4NjAKKyNkZWZpbmUJU01JQ19TVFJFQU1fTUFTSwkweDYwCisKKy8qICBTTUlDIENvbnRyb2wgQ29kZXMgKi8KKyNkZWZpbmUJU01JQ19DQ19TTVNfR0VUX1NUQVRVUwkoU01JQ19DT05UUk9MfFNNSUNfU01TfFNNSUNfR0VUX1NUQVRVUykKKyNkZWZpbmUJU01JQ19DQ19TTVNfV1JfU1RBUlQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1dSX1NUQVJUKQorI2RlZmluZQlTTUlDX0NDX1NNU19XUl9ORVhUCShTTUlDX0NPTlRST0x8U01JQ19TTVN8U01JQ19XUl9ORVhUKQorI2RlZmluZQlTTUlDX0NDX1NNU19XUl9FTkQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1dSX0VORCkKKyNkZWZpbmUJU01JQ19DQ19TTVNfUkRfU1RBUlQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1JEX1NUQVJUKQorI2RlZmluZQlTTUlDX0NDX1NNU19SRF9ORVhUCShTTUlDX0NPTlRST0x8U01JQ19TTVN8U01JQ19SRF9ORVhUKQorI2RlZmluZQlTTUlDX0NDX1NNU19SRF9FTkQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1JEX0VORCkKKworI2RlZmluZQlTTUlDX0NDX1NNTV9HRVRfU1RBVFVTCShTTUlDX0NPTlRST0x8U01JQ19TTU18U01JQ19HRVRfU1RBVFVTKQorI2RlZmluZQlTTUlDX0NDX1NNTV9XUl9TVEFSVAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfV1JfU1RBUlQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1dSX05FWFQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNTXxTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1dSX0VORAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfV1JfRU5EKQorI2RlZmluZQlTTUlDX0NDX1NNTV9SRF9TVEFSVAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfUkRfU1RBUlQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1JEX05FWFQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNTXxTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1JEX0VORAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfUkRfRU5EKQorCisvKiAgU01JQyBTdGF0dXMgQ29kZXMgKi8KKyNkZWZpbmUJU01JQ19TQ19TTVNfUkVBRFkJKFNNSUNfU1RBVFVTfFNNSUNfU01TfFNNSUNfUkVBRFkpCisjZGVmaW5lCVNNSUNfU0NfU01TX1dSX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1dSX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNU19XUl9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1dSX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTVN8U01JQ19XUl9FTkQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1JEX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1JEX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNU19SRF9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1JEX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTVN8U01JQ19SRF9FTkQpCisKKyNkZWZpbmUJU01JQ19TQ19TTU1fUkVBRFkJKFNNSUNfU1RBVFVTfFNNSUNfU01NfFNNSUNfUkVBRFkpCisjZGVmaW5lCVNNSUNfU0NfU01NX1dSX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1dSX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNTV9XUl9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1dSX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTU18U01JQ19XUl9FTkQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1JEX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1JEX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNTV9SRF9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1JEX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTU18U01JQ19SRF9FTkQpCisKKy8qIHRoZXNlIGFyZSB0aGUgY29udHJvbC9zdGF0dXMgY29kZXMgd2UgYWN0dWFsbHkgdXNlCisJU01JQ19DQ19TTVNfR0VUX1NUQVRVUwkweDQwCisJU01JQ19DQ19TTVNfV1JfU1RBUlQJMHg0MQorCVNNSUNfQ0NfU01TX1dSX05FWFQJMHg0MgorCVNNSUNfQ0NfU01TX1dSX0VORAkweDQzCisJU01JQ19DQ19TTVNfUkRfU1RBUlQJMHg0NAorCVNNSUNfQ0NfU01TX1JEX05FWFQJMHg0NQorCVNNSUNfQ0NfU01TX1JEX0VORAkweDQ2CisKKwlTTUlDX1NDX1NNU19SRUFEWQkweEMwCisJU01JQ19TQ19TTVNfV1JfU1RBUlQJMHhDMQorCVNNSUNfU0NfU01TX1dSX05FWFQJMHhDMgorCVNNSUNfU0NfU01TX1dSX0VORAkweEMzCisJU01JQ19TQ19TTVNfUkRfU1RBUlQJMHhDNAorCVNNSUNfU0NfU01TX1JEX05FWFQJMHhDNQorCVNNSUNfU0NfU01TX1JEX0VORAkweEM2CisqLworCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgc21pY19ldmVudCAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsIGxvbmcgdGltZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCWlmIChzbWljLT5zdGF0ZSA9PSBTTUlDX0hPU0VEKSB7CisJCWluaXRfc21pY19kYXRhKHNtaWMsIHNtaWMtPmlvKTsKKwkJcmV0dXJuIFNJX1NNX0hPU0VEOworCX0KKwlpZiAoc21pYy0+c3RhdGUgIT0gU01JQ19JRExFKSB7CisJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19TVEFURVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic21pY19ldmVudCAtIHNtaWMtPnNtaWNfdGltZW91dCA9ICVsZCwiCisJCQkgICAgICAgIiB0aW1lID0gJWxkXG4iLAorCQkJICAgICAgIHNtaWMtPnNtaWNfdGltZW91dCwgdGltZSk7CisJCX0KKy8qIEZJWE1FOiBzbWljX2V2ZW50IGlzIHNvbWV0aW1lcyBjYWxsZWQgd2l0aCB0aW1lID4gU01JQ19SRVRSWV9USU1FT1VUICovCisJCWlmICh0aW1lIDwgU01JQ19SRVRSWV9USU1FT1VUKSB7CisJCQlzbWljLT5zbWljX3RpbWVvdXQgLT0gdGltZTsKKwkJCWlmIChzbWljLT5zbWljX3RpbWVvdXQgPCAwKSB7CisJCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywgInNtaWMgdGltZWQgb3V0LiIpOworCQkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCQl9CisJCX0KKwl9CisJZmxhZ3MgPSByZWFkX3NtaWNfZmxhZ3Moc21pYyk7CisJaWYgKGZsYWdzICYgU01JQ19GTEFHX0JTWSkKKwkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKworCXN0YXR1cyA9IHJlYWRfc21pY19zdGF0dXMgKHNtaWMpOworCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19TVEFURVMpCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJzbWljX2V2ZW50IC0gc3RhdGUgPSAlZCwgZmxhZ3MgPSAweCUwMngsIgorCQkgICAgICAgIiBzdGF0dXMgPSAweCUwMnhcbiIsCisJCSAgICAgICBzbWljLT5zdGF0ZSwgZmxhZ3MsIHN0YXR1cyk7CisKKwlzd2l0Y2ggKHNtaWMtPnN0YXRlKSB7CisJY2FzZSBTTUlDX0lETEU6CisJCS8qIGluIElETEUgd2UgY2hlY2sgZm9yIGF2YWlsYWJsZSBtZXNzYWdlcyAqLworCQlpZiAoZmxhZ3MgJiAoU01JQ19TTUkgfAorCQkJICAgICBTTUlDX0VWTV9EQVRBX0FWQUlMIHwgU01JQ19TTVNfREFUQV9BVkFJTCkpCisJCXsKKwkJCXJldHVybiBTSV9TTV9BVFROOworCQl9CisJCXJldHVybiBTSV9TTV9JRExFOworCisJY2FzZSBTTUlDX1NUQVJUX09QOgorCQkvKiBzYW5pdHkgY2hlY2sgd2hldGhlciBzbWljIGlzIHJlYWxseSBpZGxlICovCisJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19HRVRfU1RBVFVTKTsKKwkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQlzbWljLT5zdGF0ZSA9IFNNSUNfT1BfT0s7CisJCWJyZWFrOworCisJY2FzZSBTTUlDX09QX09LOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZKSB7CisJCQkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywKKwkJCQkJICAgICAic3RhdGUgPSBTTUlDX09QX09LLCIKKwkJCQkJICAgICAiIHN0YXR1cyAhPSBTTUlDX1NDX1NNU19SRUFEWSIpOworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQkvKiBPSyBzbyBmYXI7IHNtaWMgaXMgaWRsZSBsZXQgdXMgc3RhcnQgLi4uICovCisJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9TVEFSVCk7CisJCXdyaXRlX25leHRfYnl0ZShzbWljKTsKKwkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfU1RBUlQ7CisJCWJyZWFrOworCisJY2FzZSBTTUlDX1dSSVRFX1NUQVJUOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX1NUQVJUKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfU1RBUlQsICIKKwkJCQkJICAgICAic3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX1NUQVJUIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCS8qIHdlIG11c3Qgbm90IGlzc3VlIFdSXyhORVhUfEVORCkgdW5sZXNzCisgICAgICAgICAgICAgICAgICAgVFhfREFUQV9SRUFEWSBpcyBzZXQgKi8KKwkJaWYgKGZsYWdzICYgU01JQ19UWF9EQVRBX1JFQURZKSB7CisJCQlpZiAoc21pYy0+d3JpdGVfY291bnQgPT0gMSkgeworCQkJCS8qIGxhc3QgYnl0ZSAqLworCQkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9FTkQpOworCQkJCXNtaWMtPnN0YXRlID0gU01JQ19XUklURV9FTkQ7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9ORVhUKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfTkVYVDsKKwkJCX0KKwkJCXdyaXRlX25leHRfYnl0ZShzbWljKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfV1JJVEVfTkVYVDoKKwkJaWYgKHN0YXR1cyAhPSBTTUlDX1NDX1NNU19XUl9ORVhUKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfTkVYVCwgIgorCQkJCQkgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfTkVYVCIpOworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQkvKiB0aGlzIGlzIHRoZSBzYW1lIGNvZGUgYXMgaW4gU01JQ19XUklURV9TVEFSVCAqLworCQlpZiAoZmxhZ3MgJiBTTUlDX1RYX0RBVEFfUkVBRFkpIHsKKwkJCWlmIChzbWljLT53cml0ZV9jb3VudCA9PSAxKSB7CisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1dSX0VORCk7CisJCQkJc21pYy0+c3RhdGUgPSBTTUlDX1dSSVRFX0VORDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9ORVhUKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfTkVYVDsKKwkJCX0KKwkJCXdyaXRlX25leHRfYnl0ZShzbWljKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfV1JJVEVfRU5EOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX0VORCkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3ZlcnkgKHNtaWMsCisJCQkJCSAgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfRU5ELCAiCisJCQkJCSAgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfRU5EIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCS8qIGRhdGEgcmVnaXN0ZXIgaG9sZHMgYW4gZXJyb3IgY29kZSAqLworCQlkYXRhID0gcmVhZF9zbWljX2RhdGEoc21pYyk7CisJCWlmIChkYXRhICE9IDApIHsKKwkJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19FTkFCTEUpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJTTUlDX1dSSVRFX0VORDogZGF0YSA9ICUwMnhcbiIsIGRhdGEpOworCQkJfQorCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywKKwkJCQkJICAgICAic3RhdGUgPSBTTUlDX1dSSVRFX0VORCwgIgorCQkJCQkgICAgICJkYXRhICE9IFNVQ0NFU1MiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0gZWxzZSB7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEUyUkVBRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19XUklURTJSRUFEOgorCQkvKiB3ZSBtdXN0IHdhaXQgZm9yIFJYX0RBVEFfUkVBRFkgdG8gYmUgc2V0IGJlZm9yZSB3ZQorICAgICAgICAgICAgICAgICAgIGNhbiBjb250aW51ZSAqLworCQlpZiAoZmxhZ3MgJiBTTUlDX1JYX0RBVEFfUkVBRFkpIHsKKwkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19SRF9TVEFSVCk7CisJCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9TVEFSVDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfUkVBRF9TVEFSVDoKKwkJaWYgKHN0YXR1cyAhPSBTTUlDX1NDX1NNU19SRF9TVEFSVCkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywKKwkJCQkJICAgICAic3RhdGUgPSBTTUlDX1JFQURfU1RBUlQsICIKKwkJCQkJICAgICAic3RhdHVzICE9IFNNSUNfU0NfU01TX1JEX1NUQVJUIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWlmIChmbGFncyAmIFNNSUNfUlhfREFUQV9SRUFEWSkgeworCQkJcmVhZF9uZXh0X2J5dGUoc21pYyk7CisJCQl3cml0ZV9zbWljX2NvbnRyb2woc21pYywgU01JQ19DQ19TTVNfUkRfTkVYVCk7CisJCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9ORVhUOworCQl9IGVsc2UgeworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19SRUFEX05FWFQ6CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCS8qIHNtaWMgdGVsbHMgdXMgdGhhdCB0aGlzIGlzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgcmVhZAorICAgICAgICAgICAgICAgICAgIC0tPiBjbGVhbiB1cCAqLworCQljYXNlIFNNSUNfU0NfU01TX1JEX0VORDoKKwkJCXJlYWRfbmV4dF9ieXRlKHNtaWMpOworCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1JEX0VORCk7CisJCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9FTkQ7CisJCQlicmVhazsKKwkJY2FzZSBTTUlDX1NDX1NNU19SRF9ORVhUOgorCQkJaWYgKGZsYWdzICYgU01JQ19SWF9EQVRBX1JFQURZKSB7CisJCQkJcmVhZF9uZXh0X2J5dGUoc21pYyk7CisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1JEX05FWFQpOworCQkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9ORVhUOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeSgKKwkJCQlzbWljLAorCQkJCSJzdGF0ZSA9IFNNSUNfUkVBRF9ORVhULCAiCisJCQkJInN0YXR1cyAhPSBTTUlDX1NDX1NNU19SRF8oTkVYVHxFTkQpIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTUlDX1JFQURfRU5EOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfUkVBRF9FTkQsICIKKwkJCQkJICAgICAic3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWRhdGEgPSByZWFkX3NtaWNfZGF0YShzbWljKTsKKwkJLyogZGF0YSByZWdpc3RlciBob2xkcyBhbiBlcnJvciBjb2RlICovCisJCWlmIChkYXRhICE9IDApIHsKKwkJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19FTkFCTEUpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJTTUlDX1JFQURfRU5EOiBkYXRhID0gJTAyeFxuIiwgZGF0YSk7CisJCQl9CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfUkVBRF9FTkQsICIKKwkJCQkJICAgICAiZGF0YSAhPSBTVUNDRVNTIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9IGVsc2UgeworCQkJc21pYy0+c3RhdGUgPSBTTUlDX0lETEU7CisJCQlyZXR1cm4gU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEU7CisJCX0KKworCWNhc2UgU01JQ19IT1NFRDoKKwkJaW5pdF9zbWljX2RhdGEoc21pYywgc21pYy0+aW8pOworCQlyZXR1cm4gU0lfU01fSE9TRUQ7CisKKwlkZWZhdWx0OgorCQlpZiAoc21pY19kZWJ1ZyAmIFNNSUNfREVCVUdfRU5BQkxFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbWljLT5zdGF0ZSA9ICVkXG4iLCBzbWljLT5zdGF0ZSk7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLCAic3RhdGUgPSBVTktOT1dOIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJfQorCXNtaWMtPnNtaWNfdGltZW91dCA9IFNNSUNfUkVUUllfVElNRU9VVDsKKwlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOworfQorCitzdGF0aWMgaW50IHNtaWNfZGV0ZWN0KHN0cnVjdCBzaV9zbV9kYXRhICpzbWljKQoreworCS8qIEl0J3MgaW1wb3NzaWJsZSBmb3IgdGhlIFNNSUMgZm5hZ3MgcmVnaXN0ZXIgdG8gYmUgYWxsIDEncywKKwkgICAoYXNzdW1pbmcgYSBwcm9wZXJseSBmdW5jdGlvbmluZywgc2VsZi1pbml0aWFsaXplZCBCTUMpCisJICAgYnV0IHRoYXQncyB3aGF0IHlvdSBnZXQgZnJvbSByZWFkaW5nIGEgYm9ndXMgYWRkcmVzcywgc28gd2UKKwkgICB0ZXN0IHRoYXQgZmlyc3QuICovCisJaWYgKHJlYWRfc21pY19mbGFncyhzbWljKSA9PSAweGZmKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWljX2NsZWFudXAoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKK30KKworc3RhdGljIGludCBzbWljX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzaV9zbV9kYXRhKTsKK30KKworc3RydWN0IHNpX3NtX2hhbmRsZXJzIHNtaWNfc21pX2hhbmRsZXJzID0KK3sKKwkudmVyc2lvbiAgICAgICAgICAgPSBJUE1JX1NNSUNfVkVSU0lPTiwKKwkuaW5pdF9kYXRhICAgICAgICAgPSBpbml0X3NtaWNfZGF0YSwKKwkuc3RhcnRfdHJhbnNhY3Rpb24gPSBzdGFydF9zbWljX3RyYW5zYWN0aW9uLAorCS5nZXRfcmVzdWx0ICAgICAgICA9IHNtaWNfZ2V0X3Jlc3VsdCwKKwkuZXZlbnQgICAgICAgICAgICAgPSBzbWljX2V2ZW50LAorCS5kZXRlY3QgICAgICAgICAgICA9IHNtaWNfZGV0ZWN0LAorCS5jbGVhbnVwICAgICAgICAgICA9IHNtaWNfY2xlYW51cCwKKwkuc2l6ZSAgICAgICAgICAgICAgPSBzbWljX3NpemUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzA5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKQEAgLTAsMCArMSwxMDY4IEBACisvKgorICogaXBtaV93YXRjaGRvZy5jCisgKgorICogQSB3YXRjaGRvZyB0aW1lciBiYXNlZCB1cG9uIHRoZSBJUE1JIGludGVyZmFjZS4KKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pX3NtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNlbmRpZgorCisjZGVmaW5lCVBGWCAiSVBNSSBXYXRjaGRvZzogIgorCisjZGVmaW5lIElQTUlfV0FUQ0hET0dfVkVSU0lPTiAidjMzIgorCisvKgorICogVGhlIElQTUkgY29tbWFuZC9yZXNwb25zZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyLgorICovCisKKy8qIHZhbHVlcyBmb3IgYnl0ZSAxIG9mIHRoZSBzZXQgY29tbWFuZCwgYnl0ZSAyIG9mIHRoZSBnZXQgcmVzcG9uc2UuICovCisjZGVmaW5lIFdET0dfRE9OVF9MT0cJCSgxIDw8IDcpCisjZGVmaW5lIFdET0dfRE9OVF9TVE9QX09OX1NFVAkoMSA8PCA2KQorI2RlZmluZSBXRE9HX1NFVF9USU1FUl9VU0UoYnl0ZSwgdXNlKSBcCisJYnl0ZSA9ICgoYnl0ZSkgJiAweGY4KSB8ICgodXNlKSAmIDB4NykKKyNkZWZpbmUgV0RPR19HRVRfVElNRVJfVVNFKGJ5dGUpICgoYnl0ZSkgJiAweDcpCisjZGVmaW5lIFdET0dfVElNRVJfVVNFX0JJT1NfRlJCMgkxCisjZGVmaW5lIFdET0dfVElNRVJfVVNFX0JJT1NfUE9TVAkyCisjZGVmaW5lIFdET0dfVElNRVJfVVNFX09TX0xPQUQJCTMKKyNkZWZpbmUgV0RPR19USU1FUl9VU0VfU01TX09TCQk0CisjZGVmaW5lIFdET0dfVElNRVJfVVNFX09FTQkJNQorCisvKiB2YWx1ZXMgZm9yIGJ5dGUgMiBvZiB0aGUgc2V0IGNvbW1hbmQsIGJ5dGUgMyBvZiB0aGUgZ2V0IHJlc3BvbnNlLiAqLworI2RlZmluZSBXRE9HX1NFVF9QUkVUSU1FT1VUX0FDVChieXRlLCB1c2UpIFwKKwlieXRlID0gKChieXRlKSAmIDB4OGYpIHwgKCgodXNlKSAmIDB4NykgPDwgNCkKKyNkZWZpbmUgV0RPR19HRVRfUFJFVElNRU9VVF9BQ1QoYnl0ZSkgKCgoYnl0ZSkgPj4gNCkgJiAweDcpCisjZGVmaW5lIFdET0dfUFJFVElNRU9VVF9OT05FCQkwCisjZGVmaW5lIFdET0dfUFJFVElNRU9VVF9TTUkJCTEKKyNkZWZpbmUgV0RPR19QUkVUSU1FT1VUX05NSQkJMgorI2RlZmluZSBXRE9HX1BSRVRJTUVPVVRfTVNHX0lOVAkJMworCisvKiBPcGVyYXRpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhIHByZXRpbW91dC4gKi8KKyNkZWZpbmUgV0RPR19QUkVPUF9OT05FCQkwCisjZGVmaW5lIFdET0dfUFJFT1BfUEFOSUMJMQorI2RlZmluZSBXRE9HX1BSRU9QX0dJVkVfREFUQQkyIC8qIENhdXNlIGRhdGEgdG8gYmUgYXZhaWxhYmxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC4gIERvZXNuJ3Qgd29yayBpbiBOTUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLiAqLworCisvKiBBY3Rpb25zIHRvIHBlcmZvcm0gb24gYSBmdWxsIHRpbWVvdXQuICovCisjZGVmaW5lIFdET0dfU0VUX1RJTUVPVVRfQUNUKGJ5dGUsIHVzZSkgXAorCWJ5dGUgPSAoKGJ5dGUpICYgMHhmOCkgfCAoKHVzZSkgJiAweDcpCisjZGVmaW5lIFdET0dfR0VUX1RJTUVPVVRfQUNUKGJ5dGUpICgoYnl0ZSkgJiAweDcpCisjZGVmaW5lIFdET0dfVElNRU9VVF9OT05FCQkwCisjZGVmaW5lIFdET0dfVElNRU9VVF9SRVNFVAkJMQorI2RlZmluZSBXRE9HX1RJTUVPVVRfUE9XRVJfRE9XTgkJMgorI2RlZmluZSBXRE9HX1RJTUVPVVRfUE9XRVJfQ1lDTEUJMworCisvKiBCeXRlIDMgb2YgdGhlIGdldCBjb21tYW5kLCBieXRlIDQgb2YgdGhlIGdldCByZXNwb25zZSBpcyB0aGUKKyAgIHByZS10aW1lb3V0IGluIHNlY29uZHMuICovCisKKy8qIEJpdHMgZm9yIHNldHRpbmcgYnl0ZSA0IG9mIHRoZSBzZXQgY29tbWFuZCwgYnl0ZSA1IG9mIHRoZSBnZXQgcmVzcG9uc2UuICovCisjZGVmaW5lIFdET0dfRVhQSVJFX0NMRUFSX0JJT1NfRlJCMgkoMSA8PCAxKQorI2RlZmluZSBXRE9HX0VYUElSRV9DTEVBUl9CSU9TX1BPU1QJKDEgPDwgMikKKyNkZWZpbmUgV0RPR19FWFBJUkVfQ0xFQVJfT1NfTE9BRAkoMSA8PCAzKQorI2RlZmluZSBXRE9HX0VYUElSRV9DTEVBUl9TTVNfT1MJKDEgPDwgNCkKKyNkZWZpbmUgV0RPR19FWFBJUkVfQ0xFQVJfT0VNCQkoMSA8PCA1KQorCisvKiBTZXR0aW5nL2dldHRpbmcgdGhlIHdhdGNoZG9nIHRpbWVyIHZhbHVlLiAgVGhpcyBpcyBmb3IgYnl0ZXMgNSBhbmQKKyAgIDYgKHRoZSB0aW1lb3V0IHRpbWUpIG9mIHRoZSBzZXQgY29tbWFuZCwgYW5kIGJ5dGVzIDYgYW5kIDcgKHRoZQorICAgdGltZW91dCB0aW1lKSBhbmQgOCBhbmQgOSAodGhlIGN1cnJlbnQgY291bnRkb3duIHZhbHVlKSBvZiB0aGUKKyAgIHJlc3BvbnNlLiAgVGhlIHRpbWVvdXQgdmFsdWUgaXMgZ2l2ZW4gaW4gc2Vjb25kcyAoaW4gdGhlIGNvbW1hbmQgaXQKKyAgIGlzIDEwMG1zIGludGVydmFscykuICovCisjZGVmaW5lIFdET0dfU0VUX1RJTUVPVVQoYnl0ZTEsIGJ5dGUyLCB2YWwpIFwKKwkoYnl0ZTEpID0gKCgodmFsKSAqIDEwKSAmIDB4ZmYpLCAoYnl0ZTIpID0gKCgodmFsKSAqIDEwKSA+PiA4KQorI2RlZmluZSBXRE9HX0dFVF9USU1FT1VUKGJ5dGUxLCBieXRlMikgXAorCSgoKGJ5dGUxKSB8ICgoYnl0ZTIpIDw8IDgpKSAvIDEwKQorCisjZGVmaW5lIElQTUlfV0RPR19SRVNFVF9USU1FUgkJMHgyMgorI2RlZmluZSBJUE1JX1dET0dfU0VUX1RJTUVSCQkweDI0CisjZGVmaW5lIElQTUlfV0RPR19HRVRfVElNRVIJCTB4MjUKKworLyogVGhlc2UgYXJlIGhlcmUgdW50aWwgdGhlIHJlYWwgb25lcyBnZXQgaW50byB0aGUgd2F0Y2hkb2cuaCBpbnRlcmZhY2UuICovCisjaWZuZGVmIFdESU9DX0dFVFRJTUVPVVQKKyNkZWZpbmUJV0RJT0NfR0VUVElNRU9VVCAgICAgICAgX0lPVyhXQVRDSERPR19JT0NUTF9CQVNFLCAyMCwgaW50KQorI2VuZGlmCisjaWZuZGVmIFdESU9DX1NFVF9QUkVUSU1FT1VUCisjZGVmaW5lCVdESU9DX1NFVF9QUkVUSU1FT1VUICAgICBfSU9XKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDIxLCBpbnQpCisjZW5kaWYKKyNpZm5kZWYgV0RJT0NfR0VUX1BSRVRJTUVPVVQKKyNkZWZpbmUJV0RJT0NfR0VUX1BSRVRJTUVPVVQgICAgIF9JT1coV0FUQ0hET0dfSU9DVExfQkFTRSwgMjIsIGludCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0OworI2VuZGlmCisKK3N0YXRpYyBpcG1pX3VzZXJfdCB3YXRjaGRvZ191c2VyID0gTlVMTDsKKworLyogRGVmYXVsdCB0aGUgdGltZW91dCB0byAxMCBzZWNvbmRzLiAqLworc3RhdGljIGludCB0aW1lb3V0ID0gMTA7CisKKy8qIFRoZSBwcmUtdGltZW91dCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiAqLworc3RhdGljIGludCBwcmV0aW1lb3V0ID0gMDsKKworLyogRGVmYXVsdCBhY3Rpb24gaXMgdG8gcmVzZXQgdGhlIGJvYXJkIG9uIGEgdGltZW91dC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisKK3N0YXRpYyBjaGFyIGFjdGlvblsxNl0gPSAicmVzZXQiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisKK3N0YXRpYyBjaGFyIHByZWFjdGlvblsxNl0gPSAicHJlX25vbmUiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwcmVvcF92YWwgPSBXRE9HX1BSRU9QX05PTkU7CisKK3N0YXRpYyBjaGFyIHByZW9wWzE2XSA9ICJwcmVvcF9ub25lIjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBtaV9yZWFkX2xvY2spOworc3RhdGljIGNoYXIgZGF0YV90b19yZWFkID0gMDsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyZWFkX3EpOworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmNfcSA9IE5VTEw7CitzdGF0aWMgY2hhciBwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0ID0gMDsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworLyogSWYgdHJ1ZSwgdGhlIGRyaXZlciB3aWxsIHN0YXJ0IHJ1bm5pbmcgYXMgc29vbiBhcyBpdCBpcyBjb25maWd1cmVkCisgICBhbmQgcmVhZHkuICovCitzdGF0aWMgaW50IHN0YXJ0X25vdyA9IDA7CisKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiVGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLiIpOworbW9kdWxlX3BhcmFtKHByZXRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZXRpbWVvdXQsICJQcmV0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuIik7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGFjdGlvbiwgYWN0aW9uLCBzaXplb2YoYWN0aW9uKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjdGlvbiwgIlRpbWVvdXQgYWN0aW9uLiBPbmUgb2Y6ICIKKwkJICJyZXNldCwgbm9uZSwgcG93ZXJfY3ljbGUsIHBvd2VyX29mZi4iKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocHJlYWN0aW9uLCBwcmVhY3Rpb24sIHNpemVvZihwcmVhY3Rpb24pLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJlYWN0aW9uLCAiUHJldGltZW91dCBhY3Rpb24uICBPbmUgb2Y6ICIKKwkJICJwcmVfbm9uZSwgcHJlX3NtaSwgcHJlX25taSwgcHJlX2ludC4iKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocHJlb3AsIHByZW9wLCBzaXplb2YocHJlb3ApLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJlb3AsICJQcmV0aW1lb3V0IGRyaXZlciBvcGVyYXRpb24uICBPbmUgb2Y6ICIKKwkJICJwcmVvcF9ub25lLCBwcmVvcF9wYW5pYywgcHJlb3BfZ2l2ZV9kYXRhLiIpOworbW9kdWxlX3BhcmFtKHN0YXJ0X25vdywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfbm93LCAiU2V0IHRvIDEgdG8gc3RhcnQgdGhlIHdhdGNoZG9nIGFzIgorCQkgInNvb24gYXMgdGhlIGRyaXZlciBpcyBsb2FkZWQuIik7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyogRGVmYXVsdCBzdGF0ZSBvZiB0aGUgdGltZXIuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisKKy8qIElmIHNodXR0aW5nIGRvd24gdmlhIElQTUksIHdlIGlnbm9yZSB0aGUgaGVhcnRiZWF0LiAqLworc3RhdGljIGludCBpcG1pX2lnbm9yZV9oZWFydGJlYXQgPSAwOworCisvKiBJcyBzb21lb25lIHVzaW5nIHRoZSB3YXRjaGRvZz8gIE9ubHkgb25lIHVzZXIgaXMgYWxsb3dlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwbWlfd2RvZ19vcGVuID0gMDsKKworLyogSWYgc2V0IHRvIDEsIHRoZSBoZWFydGJlYXQgY29tbWFuZCB3aWxsIHNldCB0aGUgc3RhdGUgdG8gcmVzZXQgYW5kCisgICBzdGFydCB0aGUgdGltZXIuICBUaGUgdGltZXIgZG9lc24ndCBub3JtYWxseSBydW4gd2hlbiB0aGUgZHJpdmVyIGlzCisgICBmaXJzdCBvcGVuZWQgdW50aWwgdGhlIGhlYXJ0YmVhdCBpcyBzZXQgdGhlIGZpcnN0IHRpbWUsIHRoaXMKKyAgIHZhcmlhYmxlIGlzIHVzZWQgdG8gYWNjb21wbGlzaCB0aGlzLiAqLworc3RhdGljIGludCBpcG1pX3N0YXJ0X3RpbWVyX29uX2hlYXJ0YmVhdCA9IDA7CisKKy8qIElQTUkgdmVyc2lvbiBvZiB0aGUgQk1DLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21ham9yOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21pbm9yOworCisKK3N0YXRpYyBpbnQgaXBtaV9oZWFydGJlYXQodm9pZCk7CitzdGF0aWMgdm9pZCBwYW5pY19oYWx0X2lwbWlfaGVhcnRiZWF0KHZvaWQpOworCisKKy8qIFdlIHVzZSBhIHNlbWFwaG9yZSB0byBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSB0aGluZyBjYW4gc2VuZCBhIHNldAorICAgdGltZW91dCBhdCBvbmUgdGltZSwgYmVjYXVzZSB3ZSBvbmx5IGhhdmUgb25lIGNvcHkgb2YgdGhlIGRhdGEuCisgICBUaGUgc2VtYXBob3JlIGlzIGNsYWltZWQgd2hlbiB0aGUgc2V0X3RpbWVvdXQgaXMgc2VudCBhbmQgZnJlZWQKKyAgIHdoZW4gYm90aCBtZXNzYWdlcyBhcmUgZnJlZS4gKi8KK3N0YXRpYyBhdG9taWNfdCBzZXRfdGltZW91dF90b2ZyZWUgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNldF90aW1lb3V0X2xvY2spOworc3RhdGljIHZvaWQgc2V0X3RpbWVvdXRfZnJlZV9zbWkoc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworICAgIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXRfdGltZW91dF90b2ZyZWUpKQorCSAgICB1cCgmc2V0X3RpbWVvdXRfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBzZXRfdGltZW91dF9mcmVlX3JlY3Yoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKKyAgICBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2V0X3RpbWVvdXRfdG9mcmVlKSkKKwkgICAgdXAoJnNldF90aW1lb3V0X2xvY2spOworfQorc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9tc2cgc2V0X3RpbWVvdXRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBzZXRfdGltZW91dF9mcmVlX3NtaQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBzZXRfdGltZW91dF9yZWN2X21zZyA9Cit7CisJLmRvbmUgPSBzZXRfdGltZW91dF9mcmVlX3JlY3YKK307CisgCitzdGF0aWMgaW50IGlfaXBtaV9zZXRfdGltZW91dChzdHJ1Y3QgaXBtaV9zbWlfbXNnICAqc21pX21zZywKKwkJCSAgICAgIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywKKwkJCSAgICAgIGludCAgICAgICAgICAgICAgICAgICpzZW5kX2hlYXJ0YmVhdF9ub3cpCit7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIG1zZzsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnY7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIGFkZHI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhibm93ID0gMDsKKworCisJZGF0YVswXSA9IDA7CisJV0RPR19TRVRfVElNRVJfVVNFKGRhdGFbMF0sIFdET0dfVElNRVJfVVNFX1NNU19PUyk7CisKKwlpZiAoKGlwbWlfdmVyc2lvbl9tYWpvciA+IDEpCisJICAgIHx8ICgoaXBtaV92ZXJzaW9uX21ham9yID09IDEpICYmIChpcG1pX3ZlcnNpb25fbWlub3IgPj0gNSkpKQorCXsKKwkJLyogVGhpcyBpcyBhbiBJUE1JIDEuNS1vbmx5IGZlYXR1cmUuICovCisJCWRhdGFbMF0gfD0gV0RPR19ET05UX1NUT1BfT05fU0VUOworCX0gZWxzZSBpZiAoaXBtaV93YXRjaGRvZ19zdGF0ZSAhPSBXRE9HX1RJTUVPVVRfTk9ORSkgeworCQkvKiBJbiBpcG1pIDEuMCwgc2V0dGluZyB0aGUgdGltZXIgc3RvcHMgdGhlIHdhdGNoZG9nLCB3ZQorCQkgICBuZWVkIHRvIHN0YXJ0IGl0IGJhY2sgdXAgYWdhaW4uICovCisJCWhibm93ID0gMTsKKwl9CisKKwlkYXRhWzFdID0gMDsKKwlXRE9HX1NFVF9USU1FT1VUX0FDVChkYXRhWzFdLCBpcG1pX3dhdGNoZG9nX3N0YXRlKTsKKwlpZiAocHJldGltZW91dCA+IDApIHsKKwkgICAgV0RPR19TRVRfUFJFVElNRU9VVF9BQ1QoZGF0YVsxXSwgcHJlYWN0aW9uX3ZhbCk7CisJICAgIGRhdGFbMl0gPSBwcmV0aW1lb3V0OworCX0gZWxzZSB7CisJICAgIFdET0dfU0VUX1BSRVRJTUVPVVRfQUNUKGRhdGFbMV0sIFdET0dfUFJFVElNRU9VVF9OT05FKTsKKwkgICAgZGF0YVsyXSA9IDA7IC8qIE5vIHByZXRpbWVvdXQuICovCisJfQorCWRhdGFbM10gPSAwOworCVdET0dfU0VUX1RJTUVPVVQoZGF0YVs0XSwgZGF0YVs1XSwgdGltZW91dCk7CisKKwlhZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKwlhZGRyLmx1biA9IDA7CisKKwltc2cubmV0Zm4gPSAweDA2OworCW1zZy5jbWQgPSBJUE1JX1dET0dfU0VUX1RJTUVSOworCW1zZy5kYXRhID0gZGF0YTsKKwltc2cuZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7CisJcnYgPSBpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3Mod2F0Y2hkb2dfdXNlciwKKwkJCQkgICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmYWRkciwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgICZtc2csCisJCQkJICAgICAgTlVMTCwKKwkJCQkgICAgICBzbWlfbXNnLAorCQkJCSAgICAgIHJlY3ZfbXNnLAorCQkJCSAgICAgIDEpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAic2V0IHRpbWVvdXQgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgcnYpOworCX0KKworCWlmIChzZW5kX2hlYXJ0YmVhdF9ub3cpCisJICAgICpzZW5kX2hlYXJ0YmVhdF9ub3cgPSBoYm5vdzsKKworCXJldHVybiBydjsKK30KKworLyogUGFyYW1ldGVycyB0byBpcG1pX3NldF90aW1lb3V0ICovCisjZGVmaW5lIElQTUlfU0VUX1RJTUVPVVRfTk9fSEIJCQkwCisjZGVmaW5lIElQTUlfU0VUX1RJTUVPVVRfSEJfSUZfTkVDRVNTQVJZCTEKKyNkZWZpbmUgSVBNSV9TRVRfVElNRU9VVF9GT1JDRV9IQgkJMgorCitzdGF0aWMgaW50IGlwbWlfc2V0X3RpbWVvdXQoaW50IGRvX2hlYXJ0YmVhdCkKK3sKKwlpbnQgc2VuZF9oZWFydGJlYXRfbm93OworCWludCBydjsKKworCisJLyogV2UgY2FuIG9ubHkgc2VuZCBvbmUgb2YgdGhlc2UgYXQgYSB0aW1lLiAqLworCWRvd24oJnNldF90aW1lb3V0X2xvY2spOworCisJYXRvbWljX3NldCgmc2V0X3RpbWVvdXRfdG9mcmVlLCAyKTsKKworCXJ2ID0gaV9pcG1pX3NldF90aW1lb3V0KCZzZXRfdGltZW91dF9zbWlfbXNnLAorCQkJCSZzZXRfdGltZW91dF9yZWN2X21zZywKKwkJCQkmc2VuZF9oZWFydGJlYXRfbm93KTsKKwlpZiAocnYpIHsKKwkJdXAoJnNldF90aW1lb3V0X2xvY2spOworCX0gZWxzZSB7CisJCWlmICgoZG9faGVhcnRiZWF0ID09IElQTUlfU0VUX1RJTUVPVVRfRk9SQ0VfSEIpCisJCSAgICB8fCAoKHNlbmRfaGVhcnRiZWF0X25vdykKKwkJCSYmIChkb19oZWFydGJlYXQgPT0gSVBNSV9TRVRfVElNRU9VVF9IQl9JRl9ORUNFU1NBUlkpKSkKKwkJeworCQkJcnYgPSBpcG1pX2hlYXJ0YmVhdCgpOworCQl9CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBkdW1teV9zbWlfZnJlZShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7Cit9CitzdGF0aWMgdm9pZCBkdW1teV9yZWN2X2ZyZWUoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKK30KK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfbXNnIHBhbmljX2hhbHRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBkdW1teV9zbWlfZnJlZQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBwYW5pY19oYWx0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3JlY3ZfZnJlZQorfTsKKworLyogU3BlY2lhbCBjYWxsLCBkb2Vzbid0IGNsYWltIGFueSBsb2Nrcy4gIFRoaXMgaXMgb25seSB0byBiZSBjYWxsZWQKKyAgIGF0IHBhbmljIG9yIGhhbHQgdGltZSwgaW4gcnVuLXRvLWNvbXBsZXRpb24gbW9kZSwgd2hlbiB0aGUgY2FsbGVyCisgICBpcyB0aGUgb25seSBDUFUgYW5kIHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBiZSBnb2luZyBpcyB0aGVzZSBJUE1JCisgICBjYWxscy4gKi8KK3N0YXRpYyB2b2lkIHBhbmljX2hhbHRfaXBtaV9zZXRfdGltZW91dCh2b2lkKQoreworCWludCBzZW5kX2hlYXJ0YmVhdF9ub3c7CisJaW50IHJ2OworCisJcnYgPSBpX2lwbWlfc2V0X3RpbWVvdXQoJnBhbmljX2hhbHRfc21pX21zZywKKwkJCQkmcGFuaWNfaGFsdF9yZWN2X21zZywKKwkJCQkmc2VuZF9oZWFydGJlYXRfbm93KTsKKwlpZiAoIXJ2KSB7CisJCWlmIChzZW5kX2hlYXJ0YmVhdF9ub3cpCisJCQlwYW5pY19oYWx0X2lwbWlfaGVhcnRiZWF0KCk7CisJfQorfQorCisvKiBXZSB1c2UgYSBzZW1hcGhvcmUgdG8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgdGhpbmcgY2FuIHNlbmQgYQorICAgaGVhcnRiZWF0IGF0IG9uZSB0aW1lLCBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgZGF0YS4KKyAgIFRoZSBzZW1hcGhvcmUgaXMgY2xhaW1lZCB3aGVuIHRoZSBzZXRfdGltZW91dCBpcyBzZW50IGFuZCBmcmVlZAorICAgd2hlbiBib3RoIG1lc3NhZ2VzIGFyZSBmcmVlLiAqLworc3RhdGljIGF0b21pY190IGhlYXJ0YmVhdF90b2ZyZWUgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGhlYXJ0YmVhdF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYX0xPQ0tFRChoZWFydGJlYXRfd2FpdF9sb2NrKTsKK3N0YXRpYyB2b2lkIGhlYXJ0YmVhdF9mcmVlX3NtaShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhlYXJ0YmVhdF90b2ZyZWUpKQorCSAgICB1cCgmaGVhcnRiZWF0X3dhaXRfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBoZWFydGJlYXRfZnJlZV9yZWN2KHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCit7CisgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhlYXJ0YmVhdF90b2ZyZWUpKQorCSAgICB1cCgmaGVhcnRiZWF0X3dhaXRfbG9jayk7Cit9CitzdGF0aWMgc3RydWN0IGlwbWlfc21pX21zZyBoZWFydGJlYXRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBoZWFydGJlYXRfZnJlZV9zbWkKK307CitzdGF0aWMgc3RydWN0IGlwbWlfcmVjdl9tc2cgaGVhcnRiZWF0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGhlYXJ0YmVhdF9mcmVlX3JlY3YKK307CisgCitzdGF0aWMgc3RydWN0IGlwbWlfc21pX21zZyBwYW5pY19oYWx0X2hlYXJ0YmVhdF9zbWlfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3NtaV9mcmVlCit9Oworc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnIHBhbmljX2hhbHRfaGVhcnRiZWF0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3JlY3ZfZnJlZQorfTsKKyAKK3N0YXRpYyBpbnQgaXBtaV9oZWFydGJlYXQodm9pZCkKK3sKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgYWRkcjsKKworCWlmIChpcG1pX2lnbm9yZV9oZWFydGJlYXQpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0KSB7CisJCWlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMDsKKwkJaXBtaV93YXRjaGRvZ19zdGF0ZSA9IGFjdGlvbl92YWw7CisJCXJldHVybiBpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfRk9SQ0VfSEIpOworCX0gZWxzZSBpZiAocHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCkgeworCQkvKiBBIHByZXRpbWVvdXQgb2NjdXJyZWQsIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIHRpbWVvdXQuCisJCSAgIFdlIGRvbid0IHdhbnQgdG8gc2V0IHRoZSBhY3Rpb24sIHRob3VnaCwgd2Ugd2FudCB0bworCQkgICBsZWF2ZSB0aGF0IGFsb25lICh0aHVzIGl0IGNhbid0IGJlIGNvbWJpbmVkIHdpdGggdGhlCisJCSAgIGFib3ZlIG9wZXJhdGlvbi4gKi8KKwkJcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDA7CisJCXJldHVybiBpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfSEJfSUZfTkVDRVNTQVJZKTsKKwl9CisKKwlkb3duKCZoZWFydGJlYXRfbG9jayk7CisKKwlhdG9taWNfc2V0KCZoZWFydGJlYXRfdG9mcmVlLCAyKTsKKworCS8qIERvbid0IHJlc2V0IHRoZSB0aW1lciBpZiB3ZSBoYXZlIHRoZSB0aW1lciB0dXJuZWQgb2ZmLCB0aGF0CisgICAgICAgICAgIHJlLWVuYWJsZXMgdGhlIHdhdGNoZG9nLiAqLworCWlmIChpcG1pX3dhdGNoZG9nX3N0YXRlID09IFdET0dfVElNRU9VVF9OT05FKSB7CisJCXVwKCZoZWFydGJlYXRfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWFkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKwlhZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCWFkZHIubHVuID0gMDsKKworCW1zZy5uZXRmbiA9IDB4MDY7CisJbXNnLmNtZCA9IElQTUlfV0RPR19SRVNFVF9USU1FUjsKKwltc2cuZGF0YSA9IE5VTEw7CisJbXNnLmRhdGFfbGVuID0gMDsKKwlydiA9IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh3YXRjaGRvZ191c2VyLAorCQkJCSAgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZhZGRyLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgJm1zZywKKwkJCQkgICAgICBOVUxMLAorCQkJCSAgICAgICZoZWFydGJlYXRfc21pX21zZywKKwkJCQkgICAgICAmaGVhcnRiZWF0X3JlY3ZfbXNnLAorCQkJCSAgICAgIDEpOworCWlmIChydikgeworCQl1cCgmaGVhcnRiZWF0X2xvY2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiaGVhcnRiZWF0IGZhaWx1cmU6ICVkXG4iLAorCQkgICAgICAgcnYpOworCQlyZXR1cm4gcnY7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGhlYXJ0YmVhdCB0byBiZSBzZW50LiAqLworCWRvd24oJmhlYXJ0YmVhdF93YWl0X2xvY2spOworCisJaWYgKGhlYXJ0YmVhdF9yZWN2X21zZy5tc2cuZGF0YVswXSAhPSAwKSB7CisJICAgIC8qIEdvdCBhbiBlcnJvciBpbiB0aGUgaGVhcnRiZWF0IHJlc3BvbnNlLiAgSXQgd2FzIGFscmVhZHkKKwkgICAgICAgcmVwb3J0ZWQgaW4gaXBtaV93ZG9nX21zZ19oYW5kbGVyLCBidXQgd2Ugc2hvdWxkIHJldHVybgorCSAgICAgICBhbiBlcnJvciBoZXJlLiAqLworCSAgICBydiA9IC1FSU5WQUw7CisJfQorCisJdXAoJmhlYXJ0YmVhdF9sb2NrKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgcGFuaWNfaGFsdF9pcG1pX2hlYXJ0YmVhdCh2b2lkKQoreworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICAgbXNnOworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBhZGRyOworCisKKwkvKiBEb24ndCByZXNldCB0aGUgdGltZXIgaWYgd2UgaGF2ZSB0aGUgdGltZXIgdHVybmVkIG9mZiwgdGhhdAorICAgICAgICAgICByZS1lbmFibGVzIHRoZSB3YXRjaGRvZy4gKi8KKwlpZiAoaXBtaV93YXRjaGRvZ19zdGF0ZSA9PSBXRE9HX1RJTUVPVVRfTk9ORSkKKwkJcmV0dXJuOworCisJYWRkci5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCWFkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisJYWRkci5sdW4gPSAwOworCisJbXNnLm5ldGZuID0gMHgwNjsKKwltc2cuY21kID0gSVBNSV9XRE9HX1JFU0VUX1RJTUVSOworCW1zZy5kYXRhID0gTlVMTDsKKwltc2cuZGF0YV9sZW4gPSAwOworCWlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh3YXRjaGRvZ191c2VyLAorCQkJCSAoc3RydWN0IGlwbWlfYWRkciAqKSAmYWRkciwKKwkJCQkgMCwKKwkJCQkgJm1zZywKKwkJCQkgTlVMTCwKKwkJCQkgJnBhbmljX2hhbHRfaGVhcnRiZWF0X3NtaV9tc2csCisJCQkJICZwYW5pY19oYWx0X2hlYXJ0YmVhdF9yZWN2X21zZywKKwkJCQkgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudD0KK3sKKwkub3B0aW9ucwk9IDAsCS8qIFdESU9GX1NFVFRJTUVPVVQsICovCisJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCS5pZGVudGl0eQk9ICJJUE1JIgorfTsKKworc3RhdGljIGludCBpcG1pX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgaTsKKwlpbnQgdmFsOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpOworCQlyZXR1cm4gaSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpID0gY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpOworCQlpZiAoaSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0aW1lb3V0ID0gdmFsOworCQlyZXR1cm4gaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX0hCX0lGX05FQ0VTU0FSWSk7CisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCWkgPSBjb3B5X3RvX3VzZXIoYXJncCwgJnRpbWVvdXQsIHNpemVvZih0aW1lb3V0KSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRfUFJFVElNRU9VVDoKKwkJaSA9IGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHJldGltZW91dCA9IHZhbDsKKwkJcmV0dXJuIGlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9IQl9JRl9ORUNFU1NBUlkpOworCisJY2FzZSBXRElPQ19HRVRfUFJFVElNRU9VVDoKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmcHJldGltZW91dCwgc2l6ZW9mKHByZXRpbWVvdXQpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJcmV0dXJuIGlwbWlfaGVhcnRiZWF0KCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCWkgPSBjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgJiBXRElPU19ESVNBQkxFQ0FSRCkKKwkJeworCQkJaXBtaV93YXRjaGRvZ19zdGF0ZSA9IFdET0dfVElNRU9VVF9OT05FOworCQkJaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX05PX0hCKTsKKwkJCWlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMDsKKwkJfQorCisJCWlmICh2YWwgJiBXRElPU19FTkFCTEVDQVJEKQorCQl7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gYWN0aW9uX3ZhbDsKKwkJCWlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9GT1JDRV9IQik7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJdmFsID0gMDsKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCBzaXplb2YodmFsKSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlwbWlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNvbnN0IGNoYXIgIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgICAgICBsZW4sCisJCQkgIGxvZmZfdCAgICAgICpwcG9zKQoreworCWludCBydjsKKworCWlmIChsZW4pIHsKKwkgICAgCWlmICghbm93YXlvdXQpIHsKKwkJICAgIAlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisgICAgCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlydiA9IGlwbWlfaGVhcnRiZWF0KCk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBpcG1pX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgY2hhciAgICAgICAgX191c2VyICpidWYsCisJCQkgc2l6ZV90ICAgICAgY291bnQsCisJCQkgbG9mZl90ICAgICAgKnBwb3MpCit7CisJaW50ICAgICAgICAgIHJ2ID0gMDsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFJlYWRpbmcgcmV0dXJucyBpZiB0aGUgcHJldGltZW91dCBoYXMgZ29uZSBvZmYsIGFuZCBpdCBvbmx5IGRvZXMKKwkgICBpdCBvbmNlIHBlciBwcmV0aW1lb3V0LiAqLworCXNwaW5fbG9jaygmaXBtaV9yZWFkX2xvY2spOworCWlmICghZGF0YV90b19yZWFkKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcnYgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJCisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUoJnJlYWRfcSwgJndhaXQpOworCQl3aGlsZSAoIWRhdGFfdG9fcmVhZCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fdW5sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJc3Bpbl9sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJlYWRfcSwgJndhaXQpOworCSAgICAKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlydiA9IC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWRhdGFfdG9fcmVhZCA9IDA7CisKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKworCWlmIChydiA9PSAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZGF0YV90b19yZWFkLCAxKSkKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcnYgPSAxOworCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBpcG1pX29wZW4oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKyAgICAgICAgc3dpdGNoIChpbWlub3IoaW5vKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0FUQ0hET0dfTUlOT1I6CisJCSAgICBpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZpcG1pX3dkb2dfb3BlbikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJCSAgICAvKiBEb24ndCBzdGFydCB0aGUgdGltZXIgbm93LCBsZXQgaXQgc3RhcnQgb24gdGhlCisJCSAgICAgICBmaXJzdCBoZWFydGJlYXQuICovCisJCSAgICBpcG1pX3N0YXJ0X3RpbWVyX29uX2hlYXJ0YmVhdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtRU5PREVWKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwbWlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJCisJcG9sbF93YWl0KGZpbGUsICZyZWFkX3EsIHdhaXQpOworCisJc3Bpbl9sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJaWYgKGRhdGFfdG9fcmVhZCkKKwkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGlwbWlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZmYXN5bmNfcSk7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCWlmIChpbWlub3IoaW5vKT09V0FUQ0hET0dfTUlOT1IpCisJeworCQlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisJCQlpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfTk9fSEIpOworCQkJY2xlYXJfYml0KDAsICZpcG1pX3dkb2dfb3Blbik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCQlpcG1pX2hlYXJ0YmVhdCgpOworCQl9CisJfQorCisJaXBtaV9mYXN5bmMgKC0xLCBmaWxlcCwgMCk7CisJZXhwZWN0X2Nsb3NlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcG1pX3dkb2dfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5yZWFkICAgID0gaXBtaV9yZWFkLAorCS5wb2xsICAgID0gaXBtaV9wb2xsLAorCS53cml0ZSAgID0gaXBtaV93cml0ZSwKKwkuaW9jdGwgICA9IGlwbWlfaW9jdGwsCisJLm9wZW4gICAgPSBpcG1pX29wZW4sCisJLnJlbGVhc2UgPSBpcG1pX2Nsb3NlLAorCS5mYXN5bmMgID0gaXBtaV9mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaXBtaV93ZG9nX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJmlwbWlfd2RvZ19mb3BzCit9OworCitzdGF0aWMgREVDTEFSRV9SV1NFTShyZWdpc3Rlcl9zZW0pOworCitzdGF0aWMgdm9pZCBpcG1pX3dkb2dfbXNnX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZywKKwkJCQkgIHZvaWQgICAgICAgICAgICAgICAgICpoYW5kbGVyX2RhdGEpCit7CisJaWYgKG1zZy0+bXNnLmRhdGFbMF0gIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZXNwb25zZTogRXJyb3IgJXggb24gY21kICV4XG4iLAorCQkgICAgICAgbXNnLT5tc2cuZGF0YVswXSwKKwkJICAgICAgIG1zZy0+bXNnLmNtZCk7CisJfQorCQorCWlwbWlfZnJlZV9yZWN2X21zZyhtc2cpOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3dkb2dfcHJldGltZW91dF9oYW5kbGVyKHZvaWQgKmhhbmRsZXJfZGF0YSkKK3sKKwlpZiAocHJlYWN0aW9uX3ZhbCAhPSBXRE9HX1BSRVRJTUVPVVRfTk9ORSkgeworCQlpZiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfUEFOSUMpCisJCQlwYW5pYygiV2F0Y2hkb2cgcHJlLXRpbWVvdXQiKTsKKwkJZWxzZSBpZiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfR0lWRV9EQVRBKSB7CisJCQlzcGluX2xvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwkJCWRhdGFfdG9fcmVhZCA9IDE7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlYWRfcSk7CisJCQlraWxsX2Zhc3luYygmZmFzeW5jX3EsIFNJR0lPLCBQT0xMX0lOKTsKKworCQkJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwkJfQorCX0KKworCS8qIE9uIHNvbWUgbWFjaGluZXMsIHRoZSBoZWFydGJlYXQgd2lsbCBnaXZlCisJICAgYW4gZXJyb3IgYW5kIG5vdCB3b3JrIHVubGVzcyB3ZSByZS1lbmFibGUKKwkgICB0aGUgdGltZXIuICAgU28gZG8gc28uICovCisJcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBtaV91c2VyX2huZGwgaXBtaV9obmRscnMgPQoreworCS5pcG1pX3JlY3ZfaG5kbCAgICAgICAgICAgPSBpcG1pX3dkb2dfbXNnX2hhbmRsZXIsCisJLmlwbWlfd2F0Y2hkb2dfcHJldGltZW91dCA9IGlwbWlfd2RvZ19wcmV0aW1lb3V0X2hhbmRsZXIKK307CisKK3N0YXRpYyB2b2lkIGlwbWlfcmVnaXN0ZXJfd2F0Y2hkb2coaW50IGlwbWlfaW50ZikKK3sKKwlpbnQgcnYgPSAtRUJVU1k7CisKKwlkb3duX3dyaXRlKCZyZWdpc3Rlcl9zZW0pOworCWlmICh3YXRjaGRvZ191c2VyKQorCQlnb3RvIG91dDsKKworCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpcG1pX2ludGYsICZpcG1pX2huZGxycywgTlVMTCwgJndhdGNoZG9nX3VzZXIpOworCWlmIChydiA8IDApIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuYWJsZSB0byByZWdpc3RlciB3aXRoIGlwbWlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpcG1pX2dldF92ZXJzaW9uKHdhdGNoZG9nX3VzZXIsCisJCQkgJmlwbWlfdmVyc2lvbl9tYWpvciwKKwkJCSAmaXBtaV92ZXJzaW9uX21pbm9yKTsKKworCXJ2ID0gbWlzY19yZWdpc3RlcigmaXBtaV93ZG9nX21pc2NkZXYpOworCWlmIChydiA8IDApIHsKKwkJaXBtaV9kZXN0cm95X3VzZXIod2F0Y2hkb2dfdXNlcik7CisJCXdhdGNoZG9nX3VzZXIgPSBOVUxMOworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwl9CisKKyBvdXQ6CisJdXBfd3JpdGUoJnJlZ2lzdGVyX3NlbSk7CisKKwlpZiAoKHN0YXJ0X25vdykgJiYgKHJ2ID09IDApKSB7CisJCS8qIFJ1biBmcm9tIHN0YXJ0dXAsIHNvIHN0YXJ0IHRoZSB0aW1lciBub3cuICovCisJCXN0YXJ0X25vdyA9IDA7IC8qIERpc2FibGUgdGhpcyBmdW5jdGlvbiBhZnRlciBmaXJzdCBzdGFydHVwLiAqLworCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gYWN0aW9uX3ZhbDsKKwkJaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX0ZPUkNFX0hCKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlN0YXJ0aW5nIG5vdyFcbiIpOworCX0KK30KKworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKK3N0YXRpYyBpbnQKK2lwbWlfbm1pKHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUsIGludCBoYW5kbGVkKQoreworCS8qIElmIG5vIG9uZSBlbHNlIGhhbmRsZWQgdGhlIE5NSSwgd2UgYXNzdW1lIGl0IHdhcyB0aGUgSVBNSQorICAgICAgICAgICB3YXRjaGRvZy4gKi8KKwlpZiAoKCFoYW5kbGVkKSAmJiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfUEFOSUMpKQorCQlwYW5pYyhQRlggInByZS10aW1lb3V0Iik7CisKKwkvKiBPbiBzb21lIG1hY2hpbmVzLCB0aGUgaGVhcnRiZWF0IHdpbGwgZ2l2ZQorCSAgIGFuIGVycm9yIGFuZCBub3Qgd29yayB1bmxlc3Mgd2UgcmUtZW5hYmxlCisJICAgdGhlIHRpbWVyLiAgIFNvIGRvIHNvLiAqLworCXByZXRpbWVvdXRfc2luY2VfbGFzdF9oZWFydGJlYXQgPSAxOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5taV9oYW5kbGVyIGlwbWlfbm1pX2hhbmRsZXIgPQoreworCS5saW5rICAgICA9IExJU1RfSEVBRF9JTklUKGlwbWlfbm1pX2hhbmRsZXIubGluayksCisJLmRldl9uYW1lID0gImlwbWlfd2F0Y2hkb2ciLAorCS5kZXZfaWQgICA9IE5VTEwsCisJLmhhbmRsZXIgID0gaXBtaV9ubWksCisJLnByaW9yaXR5ID0gMCwgLyogQ2FsbCB1cyBsYXN0LiAqLworfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHdkb2dfcmVib290X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBjb2RlLAorCQkJICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdW51c2VkKQoreworCXN0YXRpYyBpbnQgcmVib290X2V2ZW50X2hhbmRsZWQgPSAwOworCisJaWYgKCh3YXRjaGRvZ191c2VyKSAmJiAoIXJlYm9vdF9ldmVudF9oYW5kbGVkKSkgeworCQkvKiBNYWtlIHN1cmUgd2Ugb25seSBkbyB0aGlzIG9uY2UuICovCisJCXJlYm9vdF9ldmVudF9oYW5kbGVkID0gMTsKKworCQlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCQkvKiBEaXNhYmxlIHRoZSBXRFQgaWYgd2UgYXJlIHNodXR0aW5nIGRvd24uICovCisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisJCQlwYW5pY19oYWx0X2lwbWlfc2V0X3RpbWVvdXQoKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCBhIGxvbmcgdGltZXIgdG8gbGV0IHRoZSByZWJvb3QgaGFwcGVucywgYnV0CisJCQkgICByZWJvb3QgaWYgaXQgaGFuZ3MuICovCisJCQl0aW1lb3V0ID0gMTIwOworCQkJcHJldGltZW91dCA9IDA7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX1JFU0VUOworCQkJcGFuaWNfaGFsdF9pcG1pX3NldF90aW1lb3V0KCk7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZG9nX3JlYm9vdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHdkb2dfcmVib290X2hhbmRsZXIsCisJLm5leHQJCT0gTlVMTCwKKwkucHJpb3JpdHkJPSAwCit9OworCitzdGF0aWMgaW50IHdkb2dfcGFuaWNfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgZXZlbnQsCisJCQkgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnVudXNlZCkKK3sKKwlzdGF0aWMgaW50IHBhbmljX2V2ZW50X2hhbmRsZWQgPSAwOworCisJLyogT24gYSBwYW5pYywgaWYgd2UgaGF2ZSBhIHBhbmljIHRpbWVvdXQsIG1ha2Ugc3VyZSB0aGF0IHRoZSB0aGluZworCSAgIHJlYm9vdHMsIGV2ZW4gaWYgaXQgaGFuZ3MgZHVyaW5nIHRoYXQgcGFuaWMuICovCisJaWYgKHdhdGNoZG9nX3VzZXIgJiYgIXBhbmljX2V2ZW50X2hhbmRsZWQpIHsKKwkJLyogTWFrZSBzdXJlIHRoZSBwYW5pYyBkb2Vzbid0IGhhbmcsIGFuZCBtYWtlIHN1cmUgd2UKKwkJICAgZG8gdGhpcyBvbmx5IG9uY2UuICovCisJCXBhbmljX2V2ZW50X2hhbmRsZWQgPSAxOworCSAgICAKKwkJdGltZW91dCA9IDI1NTsKKwkJcHJldGltZW91dCA9IDA7CisJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisJCXBhbmljX2hhbHRfaXBtaV9zZXRfdGltZW91dCgpOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2RvZ19wYW5pY19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHdkb2dfcGFuaWNfaGFuZGxlciwKKwkubmV4dAkJPSBOVUxMLAorCS5wcmlvcml0eQk9IDE1MAkvKiBwcmlvcml0eTogSU5UX01BWCA+PSB4ID49IDAgKi8KK307CisKKworc3RhdGljIHZvaWQgaXBtaV9uZXdfc21pKGludCBpZl9udW0pCit7CisJaXBtaV9yZWdpc3Rlcl93YXRjaGRvZyhpZl9udW0pOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3NtaV9nb25lKGludCBpZl9udW0pCit7CisJLyogVGhpcyBjYW4gbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIG9uY2UgdGhlIHdhdGNoZG9nIGlzCisJICAgcmVnaXN0ZXJlZCwgdGhlIGludGVyZmFjZSBjYW4ndCBnbyBhd2F5IHVudGlsIHRoZSB3YXRjaGRvZworCSAgIGlzIHVucmVnaXN0ZXJlZC4gKi8KK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyIHNtaV93YXRjaGVyID0KK3sKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkubmV3X3NtaSAgPSBpcG1pX25ld19zbWksCisJLnNtaV9nb25lID0gaXBtaV9zbWlfZ29uZQorfTsKKworc3RhdGljIGludCBfX2luaXQgaXBtaV93ZG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiZHJpdmVyIHZlcnNpb24gIgorCSAgICAgICBJUE1JX1dBVENIRE9HX1ZFUlNJT04gIlxuIik7CisKKwlpZiAoc3RyY21wKGFjdGlvbiwgInJlc2V0IikgPT0gMCkgeworCQlhY3Rpb25fdmFsID0gV0RPR19USU1FT1VUX1JFU0VUOworCX0gZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgIm5vbmUiKSA9PSAwKSB7CisJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfTk9ORTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJwb3dlcl9jeWNsZSIpID09IDApIHsKKwkJYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9QT1dFUl9DWUNMRTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJwb3dlcl9vZmYiKSA9PSAwKSB7CisJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUE9XRVJfRE9XTjsKKwl9IGVsc2UgeworCQlhY3Rpb25fdmFsID0gV0RPR19USU1FT1VUX1JFU0VUOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5rbm93biBhY3Rpb24gJyVzJywgZGVmYXVsdGluZyB0byIKKwkJICAgICAgICIgcmVzZXRcbiIsIGFjdGlvbik7CisJfQorCisJaWYgKHN0cmNtcChwcmVhY3Rpb24sICJwcmVfbm9uZSIpID09IDApIHsKKwkJcHJlYWN0aW9uX3ZhbCA9IFdET0dfUFJFVElNRU9VVF9OT05FOworCX0gZWxzZSBpZiAoc3RyY21wKHByZWFjdGlvbiwgInByZV9zbWkiKSA9PSAwKSB7CisJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfU01JOworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKKwl9IGVsc2UgaWYgKHN0cmNtcChwcmVhY3Rpb24sICJwcmVfbm1pIikgPT0gMCkgeworCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05NSTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoc3RyY21wKHByZWFjdGlvbiwgInByZV9pbnQiKSA9PSAwKSB7CisJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfTVNHX0lOVDsKKwl9IGVsc2UgeworCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbmtub3duIHByZWFjdGlvbiAnJXMnLCBkZWZhdWx0aW5nIHRvIgorCQkgICAgICAgIiBub25lXG4iLCBwcmVhY3Rpb24pOworCX0KKworCWlmIChzdHJjbXAocHJlb3AsICJwcmVvcF9ub25lIikgPT0gMCkgeworCQlwcmVvcF92YWwgPSBXRE9HX1BSRU9QX05PTkU7CisJfSBlbHNlIGlmIChzdHJjbXAocHJlb3AsICJwcmVvcF9wYW5pYyIpID09IDApIHsKKwkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9QQU5JQzsKKwl9IGVsc2UgaWYgKHN0cmNtcChwcmVvcCwgInByZW9wX2dpdmVfZGF0YSIpID09IDApIHsKKwkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9HSVZFX0RBVEE7CisJfSBlbHNlIHsKKwkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9OT05FOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5rbm93biBwcmVvcCAnJXMnLCBkZWZhdWx0aW5nIHRvIgorCQkgICAgICAgIiBub25lXG4iLCBwcmVvcCk7CisJfQorCisjaWZkZWYgSEFWRV9OTUlfSEFORExFUgorCWlmIChwcmVhY3Rpb25fdmFsID09IFdET0dfUFJFVElNRU9VVF9OTUkpIHsKKwkJaWYgKHByZW9wX3ZhbCA9PSBXRE9HX1BSRU9QX0dJVkVfREFUQSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlByZXRpbWVvdXQgb3AgaXMgdG8gZ2l2ZSBkYXRhIgorCQkJICAgICAgICIgYnV0IE5NSSBwcmV0aW1lb3V0IGlzIGVuYWJsZWQsIHNldHRpbmciCisJCQkgICAgICAgIiBwcmV0aW1lb3V0IG9wIHRvIG5vbmVcbiIpOworCQkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9OT05FOworCQl9CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJubWlfd2F0Y2hkb2cgaXMgc2V0IHRvIElPIEFQSUMiCisJCQkgICAgICAgIiBtb2RlICh2YWx1ZSBpcyAlZCksIHRoYXQgaXMgaW5jb21wYXRpYmxlIgorCQkJICAgICAgICIgd2l0aCB1c2luZyBOTUkgaW4gdGhlIElQTUkgd2F0Y2hkb2cuIgorCQkJICAgICAgICIgRGlzYWJsaW5nIElQTUkgbm1pIHByZXRpbWVvdXQuXG4iLAorCQkJICAgICAgIG5taV93YXRjaGRvZyk7CisJCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJcnYgPSByZXF1ZXN0X25taSgmaXBtaV9ubWlfaGFuZGxlcik7CisJCWlmIChydikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkNhbid0IHJlZ2lzdGVyIG5taSBoYW5kbGVyXG4iKTsKKwkJCXJldHVybiBydjsKKwkJfQorI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCQl9CisjZW5kaWYKKwl9CisjZW5kaWYKKworCXJ2ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlmIChydikgeworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKKwkJaWYgKHByZWFjdGlvbl92YWwgPT0gV0RPR19QUkVUSU1FT1VUX05NSSkKKwkJCXJlbGVhc2Vfbm1pKCZpcG1pX25taV9oYW5kbGVyKTsKKyNlbmRpZgorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiY2FuJ3QgcmVnaXN0ZXIgc21pIHdhdGNoZXJcbiIpOworCQlyZXR1cm4gcnY7CisJfQorCisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZG9nX3JlYm9vdF9ub3RpZmllcik7CisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKHZvaWQpCit7CisJaW50IHJ2OworCisJZG93bl93cml0ZSgmcmVnaXN0ZXJfc2VtKTsKKworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKKwlpZiAocHJlYWN0aW9uX3ZhbCA9PSBXRE9HX1BSRVRJTUVPVVRfTk1JKQorCQlyZWxlYXNlX25taSgmaXBtaV9ubWlfaGFuZGxlcik7CisjZW5kaWYKKworCW5vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2RvZ19yZWJvb3Rfbm90aWZpZXIpOworCisJaWYgKCEgd2F0Y2hkb2dfdXNlcikKKwkJZ290byBvdXQ7CisKKwkvKiBNYWtlIHN1cmUgbm8gb25lIGNhbiBjYWxsIHVzIGFueSBtb3JlLiAqLworCW1pc2NfZGVyZWdpc3RlcigmaXBtaV93ZG9nX21pc2NkZXYpOworCisJLyogV2FpdCB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgbWFrZXMgaXQgb3V0LiAgVGhlIGxvd2VyIGxheWVyIGhhcworCSAgIHBvaW50ZXJzIHRvIG91ciBidWZmZXJzLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkb25lIGJlZm9yZQorCSAgIHdlIHJlbGVhc2Ugb3VyIG1lbW9yeS4gKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJnNldF90aW1lb3V0X3RvZnJlZSkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCS8qIERpc2Nvbm5lY3QgZnJvbSBJUE1JLiAqLworCXJ2ID0gaXBtaV9kZXN0cm95X3VzZXIod2F0Y2hkb2dfdXNlcik7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJlcnJvciB1bmxpbmtpbmcgZnJvbSBJUE1JOiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwl9CisJd2F0Y2hkb2dfdXNlciA9IE5VTEw7CisKKyBvdXQ6CisJdXBfd3JpdGUoJnJlZ2lzdGVyX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcG1pX3dkb2dfZXhpdCh2b2lkKQoreworCWlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlwbWlfdW5yZWdpc3Rlcl93YXRjaGRvZygpOworfQorbW9kdWxlX2V4aXQoaXBtaV93ZG9nX2V4aXQpOworbW9kdWxlX2luaXQoaXBtaV93ZG9nX2luaXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWM3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKQEAgLTAsMCArMSwyMDc5IEBACisvKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglPcmlnaW5hbCBkcml2ZXIgY29kZSBzdXBwbGllZCBieSBNdWx0aS1UZWNoCisgKgorICoJQ2hhbmdlcworICoJMS85Lzk4CWFsYW5AcmVkaGF0LmNvbQkJTWVyZ2UgdG8gMi4wLngga2VybmVsIHRyZWUKKyAqCQkJCQlPYnRhaW4gYW5kIHVzZSBvZmZpY2lhbCBtYWpvci9taW5vcnMKKyAqCQkJCQlMb2FkZXIgc3dpdGNoZWQgdG8gYSBtaXNjIGRldmljZQorICoJCQkJCShmaXhlZCByYW5nZSBjaGVjayBidWcgYXMgYSBzaWRlIGVmZmVjdCkKKyAqCQkJCQlQcmludGsgY2xlYW4gdXAKKyAqCTkvMTIvOTgJYWxhbkByZWRoYXQuY29tCQlSb3VnaCBwb3J0IHRvIDIuMS54CisgKgorICoJMTAvNi85OSBzYW1lZXIJCQlNZXJnZWQgdGhlIElTQSBhbmQgUENJIGRyaXZlcnMgdG8KKyAqCQkJCQlhIG5ldyB1bmlmaWVkIGRyaXZlci4KKyAqCisgKgkzLzkvOTkJc2FtZWVyCQkJQWRkZWQgc3VwcG9ydCBmb3IgSVNJNDYxNiBjYXJkcy4KKyAqCisgKgkxNi85Lzk5CXNhbWVlcgkJCVdlIGRvIG5vdCBmb3JjZSBSVFMgbG93IGFueW1vcmUuCisgKgkJCQkJVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBmaXJtd2FyZSAKKyAqCQkJCQlmcm9tIGdldHRpbmcgY29uZnVzZWQuCisgKgorICoJMjYvMTAvOTkgc2FtZWVyCQkJQ29zbWV0aWMgY2hhbmdlczpUaGUgZHJpdmVyIG5vdworICoJCQkJCWR1bXBzIHRoZSBQb3J0IENvdW50IGluZm9ybWF0aW9uCisgKgkJCQkJYWxvbmcgd2l0aCBJL08gYWRkcmVzcyBhbmQgSVJRLgorICoKKyAqCTEzLzEyLzk5IHNhbWVlcgkJCUZpeGVkIHRoZSBwcm9ibGVtIHdpdGggSVJRIHNoYXJpbmcuCisgKgorICoJMTAvNS8wMCAgc2FtZWVyCQkJRml4ZWQgaXNpY29tX3NodXRkb3duX2JvYXJkKCkKKyAqCQkJCQl0byBub3QgbG93ZXIgRFRSIG9uIGFsbCB0aGUgcG9ydHMKKyAqCQkJCQl3aGVuIHRoZSBsYXN0IHBvcnQgb24gdGhlIGNhcmQgaXMgCisgKgkJCQkJY2xvc2VkLgorICoKKyAqCTEwLzUvMDAgIHNhbWVlcgkJCVNpZ25hbCBtYXNrIHNldHVwIGNvbW1hbmQgYWRkZWQKKyAqCQkJCQl0byAgaXNpY29tX3NldHVwX3BvcnQgYW5kIAorICoJCQkJCWlzaWNvbV9zaHV0ZG93bl9wb3J0LgorICoKKyAqCTI0LzUvMDAgIHNhbWVlcgkJCVRoZSBkcml2ZXIgaXMgbm93IFNNUCBhd2FyZS4KKyAqCQkJCQkKKyAqCQorICoJMjcvMTEvMDAgVmluYXlhayBQIFJpc2J1ZAlGaXhlZCB0aGUgRHJpdmVyIENyYXNoIFByb2JsZW0KKyAqCQorICoJCisgKgkwMy8wMS8wMSAgYW5pbCAucwkJQWRkZWQgc3VwcG9ydCBmb3IgcmVzZXR0aW5nIHRoZQorICoJCQkJCWludGVybmFsIG1vZGVtcyBvbiBJU0kgY2FyZHMuCisgKgorICoJMDgvMDIvMDEgIGFuaWwgLnMJCVVwZ3JhZGVkIHRoZSBkcml2ZXIgZm9yIGtlcm5lbAorICoJCQkJCTIuNC54CisgKgorICogICAgICAxMS8wNC8wMSAgS2V2aW4JCQlGaXhlZCBmaXJtd2FyZSBsb2FkIHByb2JsZW0gd2l0aAorICoJCQkJCUlTSUhQLTRYIGNhcmQKKyAqCQorICoJMzAvMDQvMDEgIGFuaWwgLnMJCUZpeGVkIHRoZSByZW1vdGUgbG9naW4gdGhyb3VnaAorICoJCQkJCUlTSSBwb3J0IHByb2JsZW0uIE5vdyB0aGUgbGluaworICoJCQkJCWRvZXMgbm90IGdvIGRvd24gYmVmb3JlIHBhc3N3b3JkCisgKgkJCQkJcHJvbXB0LgorICoKKyAqCTAzLzA1LzAxICBhbmlsIC5zCQlGaXhlZCB0aGUgcHJvYmxlbSB3aXRoIElSUSBzaGFyaW5nCisgKgkJCQkJYW1vbmcgSVNJLVBDSSBjYXJkcy4KKyAqCisgKgkwMy8wNS8wMSAgYW5pbCAucwkJQWRkZWQgc3VwcG9ydCB0byBkaXNwbGF5IHRoZSB2ZXJzaW9uCisgKgkJCQkJaW5mbyBkdXJpbmcgaW5zbW9kIGFzIHdlbGwgYXMgbW9kdWxlIAorICoJCQkJCWxpc3RpbmcgYnkgbHNtb2QuCisgKgkKKyAqCTEwLzA1LzAxICBhbmlsIC5zCQlEb25lIHRoZSBtb2RpZmljYXRpb25zIHRvIHRoZSBzb3VyY2UKKyAqCQkJCQlmaWxlIGFuZCBJbnN0YWxsIHNjcmlwdCBzbyB0aGF0IHRoZQorICoJCQkJCXNhbWUgaW5zdGFsbGF0aW9uIGNhbiBiZSB1c2VkIGZvcgorICoJCQkJCTIuMi54IGFuZCAyLjQueCBrZXJuZWwuCisgKgorICoJMDYvMDYvMDEgIGFuaWwgLnMJCU5vdyB3ZSBkcm9wIGJvdGggZHRyIGFuZCBydHMgZHVyaW5nCisgKgkJCQkJc2h1dGRvd25fcG9ydCBhcyB3ZWxsIGFzIHJhaXNlIHRoZW0KKyAqCQkJCQlkdXJpbmcgaXNpY29tX2NvbmZpZ19wb3J0LgorICogIAkKKyAqCTA5LzA2LzAxIGFjbWVAY29uZWN0aXZhLmNvbS5icgl1c2UgY2FwYWJsZSwgbm90IHN1c2VyLCBkbworICoJCQkJCXJlc3RvcmVfZmxhZ3Mgb24gZmFpbHVyZSBpbgorICoJCQkJCWlzaWNvbV9zZW5kX2JyZWFrLCB2ZXJpZnkgcHV0X3VzZXIKKyAqCQkJCQlyZXN1bHQKKyAqCisgKiAgCTExLzAyLzAzICByYW5qZWV0aAkJQWRkZWQgc3VwcG9ydCBmb3IgMjMwIEticHMgYW5kIDQ2MCBLYnBzCisgKiAgCQkJCQlCYXVkIGluZGV4IGV4dGVuZGVkIHRvIDIxCisgKiAgCQorICogIAkyMC8wMy8wMyAgcmFuamVldGgJCU1hZGUgdG8gd29yayBmb3IgTGludXggQWR2YW5jZWQgc2VydmVyLgorICogIAkJCQkJVGFrZW4gY2FyZSBvZiBsaWNlbnNlIHdhcm5pbmcuCQorICogICAgICAKKyAqCTEwLzEyLzAzICBSYXZpbmRyYQkJTWFkZSB0byB3b3JrIGZvciBGZWRvcmEgQ29yZSAxIG9mIAorICoJCQkJCVJlZCBIYXQgRGlzdHJpYnV0aW9uCisgKgorICoJMDYvMDEvMDUgIEFsYW4gQ294IAkJTWVyZ2VkIHRoZSBJU0kgYW5kIGJhc2Uga2VybmVsIHN0cmFuZHMKKyAqCQkJCQlpbnRvIGEgc2luZ2xlIDIuNiBkcml2ZXIKKyAqCisgKgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVRvIHVzZSB0aGlzIGRyaXZlciB5b3UgYWxzbyBuZWVkIHRoZSBzdXBwb3J0IHBhY2thZ2UuIFlvdSAKKyAqCWNhbiBmaW5kIHRoaXMgaW4gUlBNIGZvcm1hdCBvbgorICoJCWZ0cDovL2Z0cC5saW51eC5vcmcudWsvcHViL2xpbnV4L2FsYW4KKyAqIAkKKyAqCVlvdSBjYW4gZmluZCB0aGUgb3JpZ2luYWwgdG9vbHMgZm9yIHRoaXMgZGlyZWN0IGZyb20gTXVsdGl0ZWNoCisgKgkJZnRwOi8vZnRwLm11bHRpdGVjaC5jb20vSVNJLUNhcmRzLworICoKKyAqCUhhdmluZyBpbnN0YWxsZWQgdGhlIGNhcmRzIHRoZSBtb2R1bGUgb3B0aW9ucyAoL2V0Yy9tb2Rwcm9iZS5jb25mKQorICoKKyAqCW9wdGlvbnMgaXNpY29tICAgaW89Y2FyZDEsY2FyZDIsY2FyZDMsY2FyZDQgaXJxPWNhcmQxLGNhcmQyLGNhcmQzLGNhcmQ0CisgKgorICoJT21pdCB0aG9zZSBlbnRyaWVzIGZvciBib2FyZHMgeW91IGRvbid0IGhhdmUgaW5zdGFsbGVkLgorICoKKyAqCVRPRE8KKyAqCQlIb3RwbHVnCisgKgkJTWVyZ2UgdGVzdGluZworICoJCTY0LWJpdCB2ZXJpZmljYXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8bGludXgvaXNpY29tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpc2ljb21fcGNpX3RibFtdID0geworCXsgVkVORE9SX0lELCAweDIwMjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDUxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDU0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlzaWNvbV9wY2lfdGJsKTsKKworc3RhdGljIGludCBwcmV2X2NhcmQgPSAzOwkvKglzdGFydCBzZXJ2aWNpbmcgaXNpX2NhcmRbMF0JKi8KK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaXNpY29tX25vcm1hbDsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHR4Oworc3RhdGljIGNoYXIgcmVfc2NoZWR1bGUgPSAxOworI2lmZGVmIElTSUNPTV9ERUJVRworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHhfY291bnQgPSAwOworI2VuZGlmCisKK3N0YXRpYyBpbnQgSVNJTG9hZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHZvaWQgaXNpY29tX3R4KHVuc2lnbmVkIGxvbmcgX2RhdGEpOworc3RhdGljIHZvaWQgaXNpY29tX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmOworc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOworCisvKiAgIGJhdWQgaW5kZXggbWFwcGluZ3MgZnJvbSBsaW51eCBkZWZucyB0byBpc2kgKi8KKworc3RhdGljIHNpZ25lZCBjaGFyIGxpbnV4Yl90b19pc2liW10gPSB7CisJLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDExLCAxMywgMTUsIDE2LCAxNywgICAgIAorCTE4LCAxOQorfTsKKworc3RydWN0CWlzaV9ib2FyZCB7CisJdW5zaWduZWQgc2hvcnQJCWJhc2U7CisJdW5zaWduZWQgY2hhcgkJaXJxOworCXVuc2lnbmVkIGNoYXIJCXBvcnRfY291bnQ7CisJdW5zaWduZWQgc2hvcnQJCXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAkJcG9ydF9zdGF0dXM7IC8qIGVhY2ggYml0IHJlcHJlc2VudHMgYSBzaW5nbGUgcG9ydCAqLworCXVuc2lnbmVkIHNob3J0CQlzaGlmdF9jb3VudDsKKwlzdHJ1Y3QgaXNpX3BvcnQJCSogcG9ydHM7CisJc2lnbmVkIGNoYXIJCWNvdW50OworCXVuc2lnbmVkIGNoYXIJCWlzYTsKKwlzcGlubG9ja190CQljYXJkX2xvY2s7IC8qIENhcmQgd2lkZSBsb2NrIDExLzUvMDAgLXNhbWVlciAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworfTsKKworc3RydWN0CWlzaV9wb3J0IHsKKwl1bnNpZ25lZCBzaG9ydAkJbWFnaWM7CisJdW5zaWduZWQgaW50CQlmbGFnczsKKwlpbnQJCQljb3VudDsKKwlpbnQJCQlibG9ja2VkX29wZW47CisJaW50CQkJY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJCWNoYW5uZWw7CisJdW5zaWduZWQgc2hvcnQJCXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OworCXN0cnVjdCBpc2lfYm9hcmQJKiBjYXJkOworCXN0cnVjdCB0dHlfc3RydWN0IAkqIHR0eTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJaGFuZ3VwX3RxOworCXN0cnVjdCB3b3JrX3N0cnVjdAliaF90cXVldWU7CisJdW5zaWduZWQgY2hhcgkJKiB4bWl0X2J1ZjsKKwlpbnQJCQl4bWl0X2hlYWQ7CisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworfTsKKworc3RhdGljIHN0cnVjdCBpc2lfYm9hcmQgaXNpX2NhcmRbQk9BUkRfQ09VTlRdOworc3RhdGljIHN0cnVjdCBpc2lfcG9ydCAgaXNpX3BvcnRzW1BPUlRfQ09VTlRdOworCisvKgorICoJTG9ja2luZyBmdW5jdGlvbnMgZm9yIGNhcmQgbGV2ZWwgbG9ja2luZy4gV2UgbmVlZCB0byBvd24gYm90aAorICoJdGhlIGtlcm5lbCBsb2NrIGZvciB0aGUgY2FyZCBhbmQgaGF2ZSB0aGUgY2FyZCBpbiBhIHBvc2l0aW9uIHRoYXQKKyAqCWl0IHdhbnRzIHRvIHRhbGsuCisgKi8KKyAKK3N0YXRpYyBpbnQgbG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCit7CisJY2hhcgkJcmV0cmllczsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDA7IHJldHJpZXMrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpIHsKKwkJCXJldHVybiAxOyAKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCQkJdWRlbGF5KDEwMDApOyAgIC8qIDFtcyAqLworCQl9CisJfQorCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogRmFpbGVkIHRvIGxvY2sgQ2FyZCAoMHgleClcbiIsIGNhcmQtPmJhc2UpOworCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gYXF1aXJlIHRoZSBjYXJkISAqLworfQorCitzdGF0aWMgaW50IGxvY2tfY2FyZF9hdF9pbnRlcnJ1cHQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBjaGFyCQlyZXRyaWVzOworCXVuc2lnbmVkIHNob3J0IAkJYmFzZSA9IGNhcmQtPmJhc2U7CisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMjAwOyByZXRyaWVzKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCisJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpCisJCQlyZXR1cm4gMTsgCisJCWVsc2UKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCX0KKwkvKiBGYWlsaW5nIGluIGludGVycnVwdCBpcyBhbiBhY2NlcHRhYmxlIGV2ZW50ICovCisJcmV0dXJuIDA7CS8qIEZhaWxlZCB0byBhcXVpcmUgdGhlIGNhcmQhICovCit9CisKK3N0YXRpYyB2b2lkIHVubG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Cit9CisKKy8qCisgKiAgSVNJIENhcmQgc3BlY2lmaWMgb3BzIC4uLgorICovCisgCitzdGF0aWMgdm9pZCByYWlzZV9kdHIoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MDUwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwlwb3J0LT5zdGF0dXMgfD0gSVNJX0RUUjsKKwl1bmxvY2tfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRyb3BfZHRyKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CQorCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwNDA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOwkKKwlwb3J0LT5zdGF0dXMgJj0gfklTSV9EVFI7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MGEwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJcG9ydC0+c3RhdHVzIHw9IElTSV9SVFM7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZHJvcF9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MDgwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJcG9ydC0+c3RhdHVzICY9IH5JU0lfUlRTOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwZjA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCXBvcnQtPnN0YXR1cyB8PSAoSVNJX0RUUiB8IElTSV9SVFMpOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgdm9pZCBkcm9wX2R0cl9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MGMwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJcG9ydC0+c3RhdHVzICY9IH4oSVNJX1JUUyB8IElTSV9EVFIpOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga2lsbF9xdWV1ZShzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LCBzaG9ydCBxdWV1ZSkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KChxdWV1ZSA8PCA4KSB8IDB4MDYsIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CQorCXVubG9ja19jYXJkKGNhcmQpOworfQorCisKKy8qIAorICogIEZpcm13YXJlIGxvYWRlciBkcml2ZXIgc3BlY2lmaWMgcm91dGluZXMuIFRoaXMgbmVlZHMgdG8gbW9zdGx5IGRpZQorICogIGFuZCBiZSByZXBsYWNlZCB3aXRoIHJlcXVlc3RfZmlybXdhcmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgSVNJTG9hZF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gSVNJTG9hZF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpc2lsb2FkZXJfZGV2aWNlID0geworCUlTSUxPQURfTUlTQ19NSU5PUiwgImlzaWN0bCIsICZJU0lMb2FkX2ZvcHMKK307CisKKyAKK3N0YXRpYyBpbmxpbmUgaW50IFdhaXRUaWxsQ2FyZElzRnJlZSh1bnNpZ25lZCBzaG9ydCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgY291bnQ9MDsKKwl3aGlsZSggKCEoaW53KGJhc2UrMHhlKSAmIDB4MSkpICYmIChjb3VudCsrIDwgNjAwMDAwMCkpOworCWlmIChpbncoYmFzZSsweGUpJjB4MSkgIAorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IElTSUxvYWRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBjYXJkLCBpLCBqLCBzaWduYXR1cmUsIHN0YXR1cywgcG9ydGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIHQ7CisJdW5zaWduZWQgc2hvcnQgd29yZF9jb3VudCwgYmFzZTsKKwliaW5fZnJhbWUgZnJhbWU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJLyogZXhlY19yZWNvcmQgZXhlY19yZWM7ICovCisJCisJaWYoZ2V0X3VzZXIoY2FyZCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCWlmKGNhcmQgPCAwIHx8IGNhcmQgPj0gQk9BUkRfQ09VTlQpCisJCXJldHVybiAtRU5YSU87CisJCQorCWJhc2U9aXNpX2NhcmRbY2FyZF0uYmFzZTsKKwkKKwlpZihiYXNlPT0wKQorCQlyZXR1cm4gLUVOWElPOwkvKiBkaXNhYmxlZCBvciBub3QgdXNlZCAqLworCQorCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBNSU9DVExfUkVTRVRfQ0FSRDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUxvYWQ6UmVzZXR0aW5nIENhcmQlZCBhdCAweCV4ICIsY2FyZCsxLGJhc2UpOworCQkJCQkJCQkKKwkJCWludyhiYXNlKzB4OCk7CisJCQkKKwkJCWZvcih0PWppZmZpZXMrSFovMTAwO3RpbWVfYmVmb3JlKGppZmZpZXMsIHQpOyk7CisJCQkJCisJCQlvdXR3KDAsYmFzZSsweDgpOyAvKiBSZXNldCAqLworCQkJCisJCQlmb3Ioaj0xO2o8PTM7aisrKSB7CisJCQkJZm9yKHQ9amlmZmllcytIWjt0aW1lX2JlZm9yZShqaWZmaWVzLCB0KTspOworCQkJCXByaW50aygiLiIpOworCQkJfQkKKwkJCXNpZ25hdHVyZT0oaW53KGJhc2UrMHg0KSkgJiAweGZmOwkKKwkJCWlmIChpc2lfY2FyZFtjYXJkXS5pc2EpIHsKKwkJCQkJCisJCQkJaWYgKCEoaW53KGJhc2UrMHhlKSAmIDB4MSkgfHwgKGludyhiYXNlKzB4MikpKSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQkJCQorCQkJCQlwcmludGsoIlxuYmFzZSsweDI9MHgleCAsIGJhc2UrMHhlPTB4JXgiLGludyhiYXNlKzB4MiksaW53KGJhc2UrMHhlKSk7CisjZW5kaWYJCQkJCisJCQkJCXByaW50aygiXG5JU0lMb2FkOklTQSBDYXJkJWQgcmVzZXQgZmFpbHVyZSAoUG9zc2libGUgYmFkIEkvTyBQb3J0IEFkZHJlc3MgMHgleCkuXG4iLGNhcmQrMSxiYXNlKTsKKwkJCQkJcmV0dXJuIC1FSU87CQkJCQkKKwkJCQl9CisJCQl9CQorCQkJZWxzZSB7CisJCQkJcG9ydGNvdW50ID0gaW53KGJhc2UrMHgyKTsKKwkJCQlpZiAoIShpbncoYmFzZSsweGUpICYgMHgxKSB8fCAoKHBvcnRjb3VudCE9MCkgJiYgKHBvcnRjb3VudCE9NCkgJiYgKHBvcnRjb3VudCE9OCkpKSB7CQorI2lmZGVmIElTSUNPTV9ERUJVRworCQkJCQlwcmludGsoIlxuYmFzZSsweDI9MHgleCAsIGJhc2UrMHhlPTB4JXgiLGludyhiYXNlKzB4MiksaW53KGJhc2UrMHhlKSk7CisjZW5kaWYKKwkJCQkJcHJpbnRrKCJcbklTSUxvYWQ6UENJIENhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCV4KS5cbiIsY2FyZCsxLGJhc2UpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQl9CQorCQkJc3dpdGNoKHNpZ25hdHVyZSkgeworCQkJY2FzZQkweGE1OgorCQkJY2FzZQkweGJiOgorCQkJY2FzZQkweGRkOgkKKwkJCQkJaWYgKGlzaV9jYXJkW2NhcmRdLmlzYSkgCisJCQkJCQlpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gODsKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAocG9ydGNvdW50ID09IDQpCisJCQkJCQkJaXNpX2NhcmRbY2FyZF0ucG9ydF9jb3VudCA9IDQ7CisJCQkJCQllbHNlCisJCQkJCQkJaXNpX2NhcmRbY2FyZF0ucG9ydF9jb3VudCA9IDg7CisJCQkJCX0JCisJCQkJICAgICAJaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQgPSAxMjsKKwkJCQkgICAgIAlicmVhazsKKwkJCQkgICAgICAgIAorCQkJY2FzZQkweGNjOglpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gMTY7CisJCQkJCWlzaV9jYXJkW2NhcmRdLnNoaWZ0X2NvdW50ID0gMTE7CisJCQkJCWJyZWFrOyAgCQkJCisJCQkJCQorCQkJZGVmYXVsdDogcHJpbnRrKCJJU0lMb2FkOkNhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCV4KS5cbiIsY2FyZCsxLGJhc2UpOworI2lmZGVmIElTSUNPTV9ERUJVRwkJCQorCQkJCSBwcmludGsoIlNpZz0weCV4XG4iLHNpZ25hdHVyZSk7CisjZW5kaWYJCQkJIAorCQkJCSByZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXByaW50aygiLURvbmVcbiIpOworCQkJcmV0dXJuIHB1dF91c2VyKHNpZ25hdHVyZSwodW5zaWduZWQgX191c2VyICopYXJncCk7CisJCQkJCQkKKwljYXNlCU1JT0NUTF9MT0FEX0ZJUk1XQVJFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQkJCisJCQlpZihjb3B5X2Zyb21fdXNlcigmZnJhbWUsIGFyZ3AsIHNpemVvZihiaW5fZnJhbWUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQorCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQorCQkJb3V0dygweGYwLGJhc2UpOwkvKiBzdGFydCB1cGxvYWQgc2VxdWVuY2UgKi8gCisJCQlvdXR3KDB4MDAsYmFzZSk7CisJCQlvdXR3KChmcmFtZS5hZGRyKSwgYmFzZSk7LyogICAgICBsc2Igb2YgYWRkZXJlc3MgICAgKi8KKwkJCQorCQkJd29yZF9jb3VudD0oZnJhbWUuY291bnQgPj4gMSkgKyBmcmFtZS5jb3VudCAlIDI7CisJCQlvdXR3KHdvcmRfY291bnQsIGJhc2UpOworCQkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJCQorCQkJZm9yKGk9MDtpPD0weDJmO2krKyk7CS8qIGEgd2VlIGJpdCBvZiBkZWxheSAqLworCQkJCisJCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKSAKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQkKKwkJCWlmICgoc3RhdHVzPWludyhiYXNlKzB4NCkpIT0wKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJTG9hZDpDYXJkJWQgcmVqZWN0ZWQgbG9hZCBoZWFkZXI6XG5BZGRyZXNzOjB4JXggXG5Db3VudDoweCV4IFxuU3RhdHVzOjB4JXggXG4iLCAKKwkJCQljYXJkKzEsIGZyYW1lLmFkZHIsIGZyYW1lLmNvdW50LCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJb3V0c3coYmFzZSwgKHZvaWQgKikgZnJhbWUuYmluX2RhdGEsIHdvcmRfY291bnQpOworCQkJCisJCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQkJCisJCQlmb3IoaT0wO2k8PTB4MGY7aSsrKTsJLyogYW5vdGhlciB3ZWUgYml0IG9mIGRlbGF5ICovIAorCQkJCisJCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKSAKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQkKKwkJCWlmICgoc3RhdHVzPWludyhiYXNlKzB4NCkpIT0wKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lMb2FkOkNhcmQlZCBnb3Qgb3V0IG9mIHN5bmMuQ2FyZCBTdGF0dXM6MHgleFxuIixjYXJkKzEsIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CQorCQkJcmV0dXJuIDA7CisJCQkJCQkKKwljYXNlCU1JT0NUTF9SRUFEX0ZJUk1XQVJFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQkJCisJCQlpZihjb3B5X2Zyb21fdXNlcigmZnJhbWUsIGFyZ3AsIHNpemVvZihiaW5faGVhZGVyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpCisJCQkJcmV0dXJuIC1FSU87CisJCQkKKwkJCW91dHcoMHhmMSxiYXNlKTsJLyogc3RhcnQgZG93bmxvYWQgc2VxdWVuY2UgKi8gCisJCQlvdXR3KDB4MDAsYmFzZSk7CisJCQlvdXR3KChmcmFtZS5hZGRyKSwgYmFzZSk7LyogICAgICBsc2Igb2YgYWRkZXJlc3MgICAgKi8KKwkJCQorCQkJd29yZF9jb3VudD0oZnJhbWUuY291bnQgPj4gMSkgKyBmcmFtZS5jb3VudCAlIDI7CisJCQlvdXR3KHdvcmRfY291bnQrMSwgYmFzZSk7CisJCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQkJCisJCQlmb3IoaT0wO2k8PTB4ZjtpKyspOwkvKiBhIHdlZSBiaXQgb2YgZGVsYXkgKi8KKwkJCQorCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkgCisJCQkJcmV0dXJuIC1FSU87CisJCQkJCisJCQlpZiAoKHN0YXR1cz1pbncoYmFzZSsweDQpKSE9MCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUxvYWQ6Q2FyZCVkIHJlamVjdGVkIHZlcmlmeSBoZWFkZXI6XG5BZGRyZXNzOjB4JXggXG5Db3VudDoweCV4IFxuU3RhdHVzOjB4JXggXG4iLCAKKwkJCQljYXJkKzEsIGZyYW1lLmFkZHIsIGZyYW1lLmNvdW50LCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJCisJCQlpbncoYmFzZSk7CisJCQlpbnN3KGJhc2UsIGZyYW1lLmJpbl9kYXRhLCB3b3JkX2NvdW50KTsKKwkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCQkKKwkJCWZvcihpPTA7aTw9MHgwZjtpKyspOwkvKiBhbm90aGVyIHdlZSBiaXQgb2YgZGVsYXkgKi8gCisJCQkKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAorCQkJCXJldHVybiAtRUlPOworCQkJCQorCQkJaWYgKChzdGF0dXM9aW53KGJhc2UrMHg0KSkhPTApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklTSUxvYWQ6Q2FyZCVkIHZlcmlmeSBnb3Qgb3V0IG9mIHN5bmMuQ2FyZCBTdGF0dXM6MHgleFxuIixjYXJkKzEsIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CQorCQkJCisJCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmZyYW1lLCBzaXplb2YoYmluX2ZyYW1lKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkKKwljYXNlCU1JT0NUTF9YRkVSX0NUUkw6CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAorCQkJCXJldHVybiAtRUlPOworCQkJCQkKKwkJCW91dHcoMHhmMiwgYmFzZSk7CisJCQlvdXR3KDB4ODAwLCBiYXNlKTsKKwkJCW91dHcoMHgwLCBiYXNlKTsKKwkJCW91dHcoMHgwLCBiYXNlKTsKKwkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCQlvdXR3KDB4MCwgYmFzZSsweDQpOyAgICAvKiBmb3IgSVNJNDYwOCBjYXJkcyAqLworCQkJCQkJCQorCQkJaXNpX2NhcmRbY2FyZF0uc3RhdHVzIHw9IEZJUk1XQVJFX0xPQURFRDsKKwkJCXJldHVybiAwOwkKKwkJCQorCWRlZmF1bHQ6CisjaWZkZWYgSVNJQ09NX0RFQlVHCQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJTG9hZDogUmVjZWl2ZWQgSW9jdGwgY21kIDB4JXguXG4iLCBjbWQpOyAKKyNlbmRpZgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQorCX0KKwkKK30KKwkJICAgICAgICAJCisKKy8qCisgKglJU0lDT00gRHJpdmVyIHNwZWNpZmljIHJvdXRpbmVzIC4uLgorICoKKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNpY29tX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBpc2lfcG9ydCBjb25zdCAqIHBvcnQsIGNoYXIgKm5hbWUsIAorCQkJCQljb25zdCBjaGFyICogcm91dGluZSkKK3sKKyNpZmRlZiBJU0lDT01fREVCVUcgCisJc3RhdGljIGNvbnN0IGNoYXIgKiBiYWRtYWdpYyA9IAorCQkJS0VSTl9XQVJOSU5HICJJU0lDT006IFdhcm5pbmc6IGJhZCBpc2ljb20gbWFnaWMgZm9yIGRldiAlcyBpbiAlcy5cbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBiYWRwb3J0ID0gCisJCQlLRVJOX1dBUk5JTkcgIklTSUNPTTogV2FybmluZzogTlVMTCBpc2ljb20gcG9ydCBmb3IgZGV2ICVzIGluICVzLlxuIjsJCQorCWlmICghcG9ydCkgeworCQlwcmludGsoYmFkcG9ydCwgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocG9ydC0+bWFnaWMgIT0gSVNJQ09NX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0JCisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisJCQkKKy8qCisgKglUcmFuc21pdHRlci4gCisgKgorICoJV2Ugc2hvdmVsIGRhdGEgaW50byB0aGUgY2FyZCBidWZmZXJzIG9uIGEgcmVndWxhciBiYXNpcy4gVGhlIGNhcmQKKyAqCXdpbGwgZG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmsgZm9yIHVzLgorICovCisKK3N0YXRpYyB2b2lkIGlzaWNvbV90eCh1bnNpZ25lZCBsb25nIF9kYXRhKQoreworCXNob3J0IGNvdW50ID0gKEJPQVJEX0NPVU5ULTEpLCBjYXJkLCBiYXNlOworCXNob3J0IHR4Y291bnQsIHdyZCwgcmVzaWR1ZSwgd29yZF9jb3VudCwgY250OworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7CisJCisjaWZkZWYgSVNJQ09NX0RFQlVHCisJKyt0eF9jb3VudDsKKyNlbmRpZgkKKwkKKwkvKglmaW5kIG5leHQgYWN0aXZlIGJvYXJkCSovCisJY2FyZCA9IChwcmV2X2NhcmQgKyAxKSAmIDB4MDAwMzsKKwl3aGlsZShjb3VudC0tID4gMCkgeworCQlpZiAoaXNpX2NhcmRbY2FyZF0uc3RhdHVzICYgQk9BUkRfQUNUSVZFKSAKKwkJCWJyZWFrOworCQljYXJkID0gKGNhcmQgKyAxKSAmIDB4MDAwMzsJCisJfQorCWlmICghKGlzaV9jYXJkW2NhcmRdLnN0YXR1cyAmIEJPQVJEX0FDVElWRSkpCisJCWdvdG8gc2NoZWRfYWdhaW47CisJCQorCXByZXZfY2FyZCA9IGNhcmQ7CisJCisJY291bnQgPSBpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50OworCXBvcnQgPSBpc2lfY2FyZFtjYXJkXS5wb3J0czsKKwliYXNlID0gaXNpX2NhcmRbY2FyZF0uYmFzZTsKKwlmb3IgKDtjb3VudCA+IDA7Y291bnQtLSwgcG9ydCsrKSB7CisJCWlmICghbG9ja19jYXJkX2F0X2ludGVycnVwdCgmaXNpX2NhcmRbY2FyZF0pKQorCQkJY29udGludWU7CisJCS8qIHBvcnQgbm90IGFjdGl2ZSBvciB0eCBkaXNhYmxlZCB0byBmb3JjZSBmbG93IGNvbnRyb2wgKi8KKwkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgfHwKKwkJIAkhKHBvcnQtPnN0YXR1cyAmIElTSV9UWE9LKSkKKwkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CisJCQljb250aW51ZTsKKwkJCisJCXR0eSA9IHBvcnQtPnR0eTsKKwkJCisJCQorCQlpZih0dHkgPT0gTlVMTCkgeworCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQl0eGNvdW50ID0gbWluX3Qoc2hvcnQsIFRYX1NJWkUsIHBvcnQtPnhtaXRfY250KTsKKwkJaWYgKHR4Y291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKSB7CisJCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEoaW53KGJhc2UgKyAweDAyKSAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSkgeworCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJCWNvbnRpbnVlOwkJCisJCX0KKyNpZmRlZiBJU0lDT01fREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogdHhpbmcgJWQgYnl0ZXMsIHBvcnQlZC5cbiIsIAorCQkJCXR4Y291bnQsIHBvcnQtPmNoYW5uZWwrMSk7IAorI2VuZGlmCQorCQlvdXR3KChwb3J0LT5jaGFubmVsIDw8IGlzaV9jYXJkW2NhcmRdLnNoaWZ0X2NvdW50KSB8IHR4Y291bnQKKwkJCQkJLCBiYXNlKTsKKwkJcmVzaWR1ZSA9IE5POworCQl3cmQgPSAwOwkJCQorCQl3aGlsZSAoMSkgeworCQkJY250ID0gbWluX3QoaW50LCB0eGNvdW50LCAoU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfdGFpbCkpOworCQkJaWYgKHJlc2lkdWUgPT0gWUVTKSB7CisJCQkJcmVzaWR1ZSA9IE5POworCQkJCWlmIChjbnQgPiAwKSB7CisJCQkJCXdyZCB8PSAocG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsXSA8PCA4KTsKKwkJCQkJcG9ydC0+eG1pdF90YWlsID0gKHBvcnQtPnhtaXRfdGFpbCArIDEpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJCQkJcG9ydC0+eG1pdF9jbnQtLTsKKwkJCQkJdHhjb3VudC0tOworCQkJCQljbnQtLTsKKwkJCQkJb3V0dyh3cmQsIGJhc2UpOwkJCQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJb3V0dyh3cmQsIGJhc2UpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CQkKKwkJCWlmIChjbnQgPD0gMCkgYnJlYWs7CisJCQl3b3JkX2NvdW50ID0gY250ID4+IDE7CisJCQlvdXRzdyhiYXNlLCBwb3J0LT54bWl0X2J1Zitwb3J0LT54bWl0X3RhaWwsIHdvcmRfY291bnQpOworCQkJcG9ydC0+eG1pdF90YWlsID0gKHBvcnQtPnhtaXRfdGFpbCArICh3b3JkX2NvdW50IDw8IDEpKSAmCisJCQkJCQkoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQkJdHhjb3VudCAtPSAod29yZF9jb3VudCA8PCAxKTsKKwkJCXBvcnQtPnhtaXRfY250IC09ICh3b3JkX2NvdW50IDw8IDEpOworCQkJaWYgKGNudCAmIDB4MDAwMSkgeworCQkJCXJlc2lkdWUgPSBZRVM7CisJCQkJd3JkID0gcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsXTsKKwkJCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsICsgMSkgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQkJCXBvcnQtPnhtaXRfY250LS07CisJCQkJdHhjb3VudC0tOworCQkJfQorCQl9CisKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJaWYgKHBvcnQtPnhtaXRfY250IDw9IDApCisJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9UWE9LOworCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gV0FLRVVQX0NIQVJTKQorCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+YmhfdHF1ZXVlKTsKKwkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwl9CQorCisJLyoJc2NoZWR1bGUgYW5vdGhlciB0eCBmb3IgaG9wZWZ1bGx5IGluIGFib3V0IDEwbXMJKi8JCitzY2hlZF9hZ2FpbjoJCisJaWYgKCFyZV9zY2hlZHVsZSkJCisJCXJldHVybjsKKwlpbml0X3RpbWVyKCZ0eCk7CisJdHguZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8xMDA7CisJdHguZGF0YSA9IDA7CisJdHguZnVuY3Rpb24gPSBpc2ljb21fdHg7CisJYWRkX3RpbWVyKCZ0eCk7CisJCisJcmV0dXJuOwkKK30JCQorIAorLyogCUludGVycnVwdCBoYW5kbGVycyAJKi8KKworIAorc3RhdGljIHZvaWQgaXNpY29tX2JvdHRvbWhhbGYodm9pZCAqIGRhdGEpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgZGF0YTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSA9IHBvcnQtPnR0eTsKKwkKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJdHR5X3dha2V1cCh0dHkpOwkKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9IAkJCisgCQkKKy8qCisgKglNYWluIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUgCisgKi8KKyAKK3N0YXRpYyBpcnFyZXR1cm5fdCBpc2ljb21faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQ7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlLCBoZWFkZXIsIHdvcmRfY291bnQsIGNvdW50OworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKwlzaG9ydCBieXRlX2NvdW50OworCQorCWNhcmQgPSAoc3RydWN0IGlzaV9ib2FyZCAqKSBkZXZfaWQ7CisKKwlpZiAoIWNhcmQgfHwgIShjYXJkLT5zdGF0dXMgJiBGSVJNV0FSRV9MT0FERUQpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCisJYmFzZSA9IGNhcmQtPmJhc2U7CisJc3Bpbl9sb2NrKCZjYXJkLT5jYXJkX2xvY2spOworCQorCWlmIChjYXJkLT5pc2EgPT0gTk8pIHsKKwkJLyoKKwkJICogICAgICBkaXNhYmxlIGFueSBpbnRlcnJ1cHRzIGZyb20gdGhlIFBDSSBjYXJkIGFuZCBsb3dlciB0aGUKKwkJICogICAgICBpbnRlcnJ1cHQgbGluZQorCQkgKi8KKwkJb3V0dygweDgwMDAsIGJhc2UrMHgwNCk7CisJCUNsZWFySW50ZXJydXB0KGJhc2UpOworCX0KKwkKKwlpbncoYmFzZSk7CQkvKiBnZXQgdGhlIGR1bW15IHdvcmQgb3V0ICovCisJaGVhZGVyID0gaW53KGJhc2UpOworCWNoYW5uZWwgPSAoaGVhZGVyICYgMHg3ODAwKSA+PiBjYXJkLT5zaGlmdF9jb3VudDsKKwlieXRlX2NvdW50ID0gaGVhZGVyICYgMHhmZjsKKworCWlmIChjaGFubmVsICsgMSA+IGNhcmQtPnBvcnRfY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOiBpc2ljb21faW50ZXJydXB0KDB4JXgpOiAlZChjaGFubmVsKSA+IHBvcnRfY291bnQuXG4iLAorCQkJCWJhc2UsIGNoYW5uZWwrMSk7CisJCWlmIChjYXJkLT5pc2EpCisJCQlDbGVhckludGVycnVwdChiYXNlKTsKKwkJZWxzZQorCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCQkKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmNhcmRfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsJCQkKKwl9CisJcG9ydCA9IGNhcmQtPnBvcnRzICsgY2hhbm5lbDsKKwlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQlpZiAoY2FyZC0+aXNhKQorCQkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CisJCWVsc2UKKwkJCW91dHcoMHgwMDAwLCBiYXNlKzB4MDQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQkKKwkJCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkgPT0gTlVMTCkgeworCQl3b3JkX2NvdW50ID0gYnl0ZV9jb3VudCA+PiAxOworCQl3aGlsZShieXRlX2NvdW50ID4gMSkgeworCQkJaW53KGJhc2UpOworCQkJYnl0ZV9jb3VudCAtPSAyOworCQl9CisJCWlmIChieXRlX2NvdW50ICYgMHgwMSkKKwkJCWludyhiYXNlKTsKKwkJaWYgKGNhcmQtPmlzYSA9PSBZRVMpCisJCQlDbGVhckludGVycnVwdChiYXNlKTsKKwkJZWxzZQorCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXNwaW5fdW5sb2NrKCZjYXJkLT5jYXJkX2xvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCQorCWlmIChoZWFkZXIgJiAweDgwMDApIHsJCS8qIFN0YXR1cyBQYWNrZXQgKi8KKwkJaGVhZGVyID0gaW53KGJhc2UpOworCQlzd2l0Y2goaGVhZGVyICYgMHhmZikgeworCQkJY2FzZSAwOgkvKiBDaGFuZ2UgaW4gRUlBIHNpZ25hbHMgKi8KKwkJCQkKKwkJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQkJCQlpZiAocG9ydC0+c3RhdHVzICYgSVNJX0RDRCkgeworCQkJCQkJaWYgKCEoaGVhZGVyICYgSVNJX0RDRCkpIHsKKwkJCQkJCS8qIENhcnJpZXIgaGFzIGJlZW4gbG9zdCAgKi8KKyNpZmRlZiBJU0lDT01fREVCVUcJCQkJCQkKKwkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBpbnRlcnJ1cHQ6IERDRC0+bG93LlxuIik7CisjZW5kaWYJCQkJCQkJCisJCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRENEOworCQkJCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPmhhbmd1cF90cSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAoaGVhZGVyICYgSVNJX0RDRCkgeworCQkJCQkJLyogQ2FycmllciBoYXMgYmVlbiBkZXRlY3RlZCAqLworI2lmZGVmIElTSUNPTV9ERUJVRworCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGludGVycnVwdDogRENELT5oaWdoLlxuIik7CisjZW5kaWYJCQkJCQkJCisJCQkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9EQ0Q7CisJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoaGVhZGVyICYgSVNJX0RDRCkgCisJCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0RDRDsKKwkJCQkJZWxzZQorCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRENEOworCQkJCX0JCisJCQkJCisJCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKKwkJCQkJaWYgKHBvcnQtPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCQkJaWYgKGhlYWRlciAmIElTSV9DVFMpIHsKKwkJCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQkJCS8qIHN0YXJ0IHR4IGluZyAqLworCQkJCQkJCXBvcnQtPnN0YXR1cyB8PSAoSVNJX1RYT0sgfCBJU0lfQ1RTKTsKKwkJCQkJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5iaF90cXVldWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKCEoaGVhZGVyICYgSVNJX0NUUykpIHsKKwkJCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCQkJCS8qIHN0b3AgdHggaW5nICovCisJCQkJCQkJcG9ydC0+c3RhdHVzICY9IH4oSVNJX1RYT0sgfCBJU0lfQ1RTKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKGhlYWRlciAmIElTSV9DVFMpIAorCQkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9DVFM7CisJCQkJCWVsc2UKKwkJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX0NUUzsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGhlYWRlciAmIElTSV9EU1IpIAorCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0RTUjsKKwkJCQllbHNlCisJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX0RTUjsKKwkJCQkKKwkJCQlpZiAoaGVhZGVyICYgSVNJX1JJKSAKKwkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9SSTsKKwkJCQllbHNlCisJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX1JJOwkJCQkJCQorCQkJCQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAxOgkvKiBSZWNlaXZlZCBCcmVhayAhISEJICovCisJCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJCQlicmVhazsKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQkJZG9fU0FLKHR0eSk7CisJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIDI6CS8qIFN0YXRpc3RpY3MJCSAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGlzaWNvbV9pbnRlcnJ1cHQ6IHN0YXRzISEhLlxuIik7CQkJCisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogSW50cjogVW5rbm93biBjb2RlIGluIHN0YXR1cyBwYWNrZXQuXG4iKTsKKwkJCQlicmVhazsKKwkJfQkgCisJfQorCWVsc2UgewkJCQkvKiBEYXRhICAgUGFja2V0ICovCisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgc2hvcnQsIGJ5dGVfY291bnQsIChUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSk7CisjaWZkZWYgSVNJQ09NX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IEludHI6IENhbiByeCAlZCBvZiAlZCBieXRlcy5cbiIsIAorCQkJCQljb3VudCwgYnl0ZV9jb3VudCk7CisjZW5kaWYJCQkKKwkJd29yZF9jb3VudCA9IGNvdW50ID4+IDE7CisJCWluc3coYmFzZSwgdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgd29yZF9jb3VudCk7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gKHdvcmRfY291bnQgPDwgMSk7CQkKKwkJYnl0ZV9jb3VudCAtPSAod29yZF9jb3VudCA8PCAxKTsKKwkJaWYgKGNvdW50ICYgMHgwMDAxKSB7CisJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gKGNoYXIpKGludyhiYXNlKSAmIDB4ZmYpOworCQkJYnl0ZV9jb3VudCAtPSAyOworCQl9CQorCQltZW1zZXQodHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgMCwgY291bnQpOworCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGNvdW50OworCQl0dHktPmZsaXAuY291bnQgKz0gY291bnQ7CisJCQorCQlpZiAoYnl0ZV9jb3VudCA+IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IEludHIoMHgleDolZCk6IEZsaXAgYnVmZmVyIG92ZXJmbG93ISBkcm9wcGluZyBieXRlcy4uLlxuIiwKKwkJCQkJYmFzZSwgY2hhbm5lbCsxKTsKKwkJCXdoaWxlKGJ5dGVfY291bnQgPiAwKSB7IC8qIGRyYWluIG91dCB1bnJlYWQgeHRyYSBkYXRhICovCisJCQkJaW53KGJhc2UpOworCQkJCWJ5dGVfY291bnQgLT0gMjsKKwkJCX0KKwkJfQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwl9CisJaWYgKGNhcmQtPmlzYSA9PSBZRVMpCisJCUNsZWFySW50ZXJydXB0KGJhc2UpOworCWVsc2UKKwkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCQorCXJldHVybiBJUlFfSEFORExFRDsKK30gCisKK3N0YXRpYyB2b2lkIGlzaWNvbV9jb25maWdfcG9ydChzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwl1bnNpZ25lZCBsb25nIGJhdWQ7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbF9zZXR1cCwgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWwsIHNoaWZ0X2NvdW50ID0gY2FyZC0+c2hpZnRfY291bnQ7CisJdW5zaWduZWQgY2hhciBmbG93X2N0cmw7CisJCisJaWYgKCEodHR5ID0gcG9ydC0+dHR5KSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJYmF1ZCA9IENfQkFVRCh0dHkpOworCWlmIChiYXVkICYgQ0JBVURFWCkgeworCQliYXVkICY9IH5DQkFVREVYOworCQkKKwkJLyogIGlmIENCQVVERVggYml0IGlzIG9uIGFuZCB0aGUgYmF1ZCBpcyBzZXQgdG8gZWl0aGVyIDUwIG9yIDc1CisJCSAqICB0aGVuIHRoZSBjYXJkIGlzIHByb2dyYW1tZWQgZm9yIDU3LjZLYnBzIG9yIDExNUticHMKKwkJICogIHJlc3BlY3RpdmVseS4KKwkJICovICAgCisJCSAKKwkJaWYgKGJhdWQgPCAxIHx8IGJhdWQgPiAyKQorCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQliYXVkICs9IDE1OworCX0JCisJaWYgKGJhdWQgPT0gMTUpIHsKKwkKKwkJLyogIHRoZSBBU1lOQ19TUERfSEkgYW5kIEFTWU5DX1NQRF9WSEkgb3B0aW9ucyBhcmUgc2V0IAorCQkgKiAgYnkgdGhlIHNldF9zZXJpYWxfaW5mbyBpb2N0bCAuLi4gdGhpcyBpcyBkb25lIGJ5CisJCSAqICB0aGUgJ3NldHNlcmlhbCcgdXRpbGl0eS4KKwkJICovICAKKwkJCQorCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWJhdWQrKzsgICAgIC8qICA1Ny42IEticHMgKi8KKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJYmF1ZCArPTI7ICAgLyogIDExNSAgS2JwcyAqLwkgCisJfQorCWlmIChsaW51eGJfdG9faXNpYltiYXVkXSA9PSAtMSkgeworCQkvKiBoYW5nIHVwICovCisJIAlkcm9wX2R0cihwb3J0KTsKKwkgCXJldHVybjsKKwl9CQorCWVsc2UgIAorCQlyYWlzZV9kdHIocG9ydCk7CisJCQorCWlmIChsb2NrX2NhcmQoY2FyZCkpIHsKKwkJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBzaGlmdF9jb3VudCkgfDB4MDMsIGJhc2UpOworCQlvdXR3KGxpbnV4Yl90b19pc2liW2JhdWRdIDw8IDggfCAweDAzLCBiYXNlKTsKKwkJY2hhbm5lbF9zZXR1cCA9IDA7CisJCXN3aXRjaChDX0NTSVpFKHR0eSkpIHsKKwkJCWNhc2UgQ1M1OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M2OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M3OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M4OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTODsKKwkJCQlicmVhazsKKwkJfQorCQkJCisJCWlmIChDX0NTVE9QQih0dHkpKQorCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fMlNCOworCQlpZiAoQ19QQVJFTkIodHR5KSkgeworCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fRVZQQVI7CisJCQlpZiAoQ19QQVJPREQodHR5KSkKKwkJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9PRFBBUjsJCisJCX0KKwkJb3V0dyhjaGFubmVsX3NldHVwLCBiYXNlKTsJCisJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCXVubG9ja19jYXJkKGNhcmQpOwkKKwl9CQorCWlmIChDX0NMT0NBTCh0dHkpKQorCQlwb3J0LT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsJCisJCisJLyogZmxvdyBjb250cm9sIHNldHRpbmdzIC4uLiovCisJZmxvd19jdHJsID0gMDsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJaWYgKENfQ1JUU0NUUyh0dHkpKSB7CisJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlmbG93X2N0cmwgfD0gSVNJQ09NX0NUU1JUUzsKKwl9CQorCWlmIChJX0lYT04odHR5KSkJCisJCWZsb3dfY3RybCB8PSBJU0lDT01fUkVTUE9ORF9YT05YT0ZGOworCWlmIChJX0lYT0ZGKHR0eSkpCisJCWZsb3dfY3RybCB8PSBJU0lDT01fSU5JVElBVEVfWE9OWE9GRjsJCisJCQorCWlmIChsb2NrX2NhcmQoY2FyZCkpIHsKKwkJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBzaGlmdF9jb3VudCkgfDB4MDQsIGJhc2UpOworCQlvdXR3KGZsb3dfY3RybCA8PCA4IHwgMHgwNSwgYmFzZSk7CisJCW91dHcoKFNUT1BfQ0hBUih0dHkpKSA8PCA4IHwgKFNUQVJUX0NIQVIodHR5KSksIGJhc2UpOworCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQl1bmxvY2tfY2FyZChjYXJkKTsKKwl9CisJCisJLyoJcnggZW5hYmxlZCAtPiBlbmFibGUgcG9ydCBmb3Igcnggb24gdGhlIGNhcmQJKi8KKwlpZiAoQ19DUkVBRCh0dHkpKSB7CisJCWNhcmQtPnBvcnRfc3RhdHVzIHw9ICgxIDw8IGNoYW5uZWwpOworCQlvdXR3KGNhcmQtPnBvcnRfc3RhdHVzLCBiYXNlICsgMHgwMik7CisJfQorfQorIAorLyogb3BlbiBldCBhbGwgKi8gCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2V0dXBfYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqIGJwKQoreworCWludCBjaGFubmVsOworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChicC0+c3RhdHVzICYgQk9BUkRfQUNUSVZFKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwb3J0ID0gYnAtPnBvcnRzOworCWJwLT5zdGF0dXMgfD0gQk9BUkRfQUNUSVZFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlmb3IoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBicC0+cG9ydF9jb3VudDsgY2hhbm5lbCsrLCBwb3J0KyspCisJCWRyb3BfZHRyX3J0cyhwb3J0KTsKKwlyZXR1cm47Cit9CisgCitzdGF0aWMgaW50IGlzaWNvbV9zZXR1cF9wb3J0KHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcG9ydC0+eG1pdF9idWYpIHsKKwkJdW5zaWduZWQgbG9uZyBwYWdlOworCQkKKwkJaWYgKCEocGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKHBhZ2UpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CQorCX0JCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCWlmIChwb3J0LT5jb3VudCA9PSAxKQorCQljYXJkLT5jb3VudCsrOworCQkKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJCisJLyoJZGlzY2FyZCBhbnkgcmVzaWR1YWwgZGF0YQkqLworCWtpbGxfcXVldWUocG9ydCwgSVNJQ09NX0tJTExUWCB8IElTSUNPTV9LSUxMUlgpOworCQorCWlzaWNvbV9jb25maWdfcG9ydChwb3J0KTsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsJCQorfSAKKyAKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpIAoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlpbnQgZG9fY2xvY2FsID0gMCwgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiBibG9jayBpZiBwb3J0IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNsb3NlZCAqLworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgcG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBibG9ja190aWxfcmVhZHk6IGNsb3NlIGluIHByb2dyZXNzLlxuIik7CisjZW5kaWYJCQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0LT5jbG9zZV93YWl0KTsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybiAtRUFHQUlOOworCQllbHNlCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwkKKwkvKiBpZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQgLi4uICovCisJCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworI2lmZGVmIElTSUNPTV9ERUJVRwkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogYmxvY2tfdGlsX3JlYWR5OiBub24tYmxvY2sgbW9kZS5cbiIpOworI2VuZGlmCQkKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CQorCX0JCisJCisJaWYgKENfQ0xPQ0FMKHR0eSkpCisJCWRvX2Nsb2NhbCA9IDE7CisJCisJLyogYmxvY2sgd2FpdGluZyBmb3IgRENEIHRvIGJlIGFzc2VydGVkLCBhbmQgd2hpbGUgCisJCQkJCQljYWxsb3V0IGRldiBpcyBidXN5ICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudC0tOworCXBvcnQtPmJsb2NrZWRfb3BlbisrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQorCXdoaWxlICgxKSB7CisJCXJhaXNlX2R0cl9ydHMocG9ydCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeyAJCisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0JCisJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwgfHwgKHBvcnQtPnN0YXR1cyAmIElTSV9EQ0QpKSkgeworCQkJYnJlYWs7CisJCX0JCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsJCQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudCsrOworCXBvcnQtPmJsb2NrZWRfb3Blbi0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBpbnQgaXNpY29tX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkOworCXVuc2lnbmVkIGludCBsaW5lLCBib2FyZDsKKwlpbnQgZXJyb3I7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+IFBPUlRfQ09VTlQtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYm9hcmQgPSBCT0FSRChsaW5lKTsKKwljYXJkID0gJmlzaV9jYXJkW2JvYXJkXTsKKwkKKwlpZiAoIShjYXJkLT5zdGF0dXMgJiBGSVJNV0FSRV9MT0FERUQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwkvKiAgb3BlbiBvbiBhIHBvcnQgZ3JlYXRlciB0aGFuIHRoZSBwb3J0IGNvdW50IGZvciB0aGUgY2FyZCAhISEgKi8KKwlpZiAobGluZSA+ICgoYm9hcmQgKiAxNikgKyBjYXJkLT5wb3J0X2NvdW50IC0gMSkpCisJCXJldHVybiAtRU5PREVWOworCisJcG9ydCA9ICZpc2lfcG9ydHNbbGluZV07CQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX29wZW4iKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCQorCWlzaWNvbV9zZXR1cF9ib2FyZChjYXJkKTsJCQorCQorCXBvcnQtPmNvdW50Kys7CisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7CisJcG9ydC0+dHR5ID0gdHR5OworCWlmICgoZXJyb3IgPSBpc2ljb21fc2V0dXBfcG9ydChwb3J0KSkhPTApCisJCXJldHVybiBlcnJvcjsKKwlpZiAoKGVycm9yID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgcG9ydCkpIT0wKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsgICAgICAJCQorfQorIAorLyogY2xvc2UgZXQgYWxsICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2h1dGRvd25fYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqIGJwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChicC0+c3RhdHVzICYgQk9BUkRfQUNUSVZFKSB7CisJCWJwLT5zdGF0dXMgJj0gfkJPQVJEX0FDVElWRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpc2ljb21fc2h1dGRvd25fcG9ydChzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsJCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CQorCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0JCisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCS8qIDNyZCBPY3RvYmVyIDIwMDAgOiBWaW5heWFrIFAgUmlzYnVkICovCisJcG9ydC0+dHR5ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwkvKkZpeCBkb25lIGJ5IEFuaWwgLlMgb24gMzAtMDQtMjAwMQorCXJlbW90ZSBsb2dpbiB0aHJvdWdoIGlzaSBwb3J0IGhhcyBkdHIgdG9nZ2xlIHByb2JsZW0KKwlkdWUgdG8gd2hpY2ggdGhlIGNhcnJpZXIgZHJvcHMgYmVmb3JlIHRoZSBwYXNzd29yZCBwcm9tcHQKKwlhcHBlYXJzIG9uIHRoZSByZW1vdGUgZW5kLiBOb3cgd2UgZHJvcCB0aGUgZHRyIG9ubHkgaWYgdGhlIAorCUhVUENMKEhhbmd1cCBvbiBjbG9zZSkgZmxhZyBpcyBzZXQgZm9yIHRoZSB0dHkqLworCQorCWlmIChDX0hVUENMKHR0eSkpIAorCQkvKiBkcm9wIGR0ciBvbiB0aGlzIHBvcnQgKi8KKwkJZHJvcF9kdHIocG9ydCk7CisJCQorCS8qIGFueSBvdGhlciBwb3J0IHVuaW5pdHMgICovIAorCWlmICh0dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJCisJaWYgKC0tY2FyZC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGlzaWNvbV9zaHV0ZG93bl9wb3J0OiBiYWQgYm9hcmQoMHgleCkgY291bnQgJWQuXG4iLAorCQkJY2FyZC0+YmFzZSwgY2FyZC0+Y291bnQpOworCQljYXJkLT5jb3VudCA9IDA7CQorCX0KKwkKKwkvKiBsYXN0IHBvcnQgd2FzIGNsb3NlZCAsIHNodXRkb3duIHRoYXQgYm9hZCB0b28gKi8KKwlpZihDX0hVUENMKHR0eSkpIHsKKwkJaWYgKCFjYXJkLT5jb3VudCkKKwkJCWlzaWNvbV9zaHV0ZG93bl9ib2FyZChjYXJkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzaWNvbV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCFwb3J0KQorCQlyZXR1cm47CisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fY2xvc2UiKSkKKwkJcmV0dXJuOworCQorI2lmZGVmIElTSUNPTV9ERUJVRwkJCisJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ2xvc2Ugc3RhcnQhISEuXG4iKTsKKyNlbmRpZgkKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHR0eS0+Y291bnQgPT0gMSAmJiBwb3J0LT5jb3VudCAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTooMHgleCkgaXNpY29tX2Nsb3NlOiBiYWQgcG9ydCBjb3VudCIKKwkJCSJ0dHktPmNvdW50ID0gMQlwb3J0IGNvdW50ID0gJWQuXG4iLAorCQkJY2FyZC0+YmFzZSwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDE7CisJfQorCWlmICgtLXBvcnQtPmNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006KDB4JXgpIGlzaWNvbV9jbG9zZTogYmFkIHBvcnQgY291bnQgZm9yIgorCQkJImNoYW5uZWwlZCA9ICVkIiwgY2FyZC0+YmFzZSwgcG9ydC0+Y2hhbm5lbCwgCisJCQlwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMDsJCisJfQorCQorCWlmIChwb3J0LT5jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0gCQorCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJdHR5LT5jbG9zaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwlpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsKKwkvKiBpbmRpY2F0ZSB0byB0aGUgY2FyZCB0aGF0IG5vIG1vcmUgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgCisJICAgb24gdGhpcyBwb3J0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7ICAgCisJCWNhcmQtPnBvcnRfc3RhdHVzICY9IH4oMSA8PCBwb3J0LT5jaGFubmVsKTsKKwkJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOworCX0JCisJaXNpY29tX3NodXRkb3duX3BvcnQocG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwl0dHktPmNsb3NpbmcgPSAwOworCisJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQkJCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBzY2hlZHVsaW5nIHVudGlsIHRpbWUgb3V0LlxuIik7CisjZW5kaWYJCQkKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwl9CQorCXBvcnQtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIHdyaXRlIGV0IGFsbCAqLworc3RhdGljIGludCBpc2ljb21fd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY250LCB0b3RhbCA9IDA7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV93cml0ZSIpKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAwOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJd2hpbGUoMSkgewkKKwkJY250ID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDEsCisJCQkJCSAgICBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkKSk7CisJCWlmIChjbnQgPD0gMCkgCisJCQlicmVhazsKKwkJCisJCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjbnQpOworCQlwb3J0LT54bWl0X2hlYWQgPSAocG9ydC0+eG1pdF9oZWFkICsgY250KSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCXBvcnQtPnhtaXRfY250ICs9IGNudDsKKwkJYnVmICs9IGNudDsKKwkJY291bnQgLT0gY250OworCQl0b3RhbCArPSBjbnQ7CisJfQkJCisJaWYgKHBvcnQtPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkKKwkJcG9ydC0+c3RhdHVzIHw9IElTSV9UWE9LOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXJldHVybiB0b3RhbDsJCit9CisKKy8qIHB1dF9jaGFyIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCQorCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwkKKwlwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X2hlYWQrK10gPSBjaDsKKwlwb3J0LT54bWl0X2hlYWQgJj0gKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwlwb3J0LT54bWl0X2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworfQorCisvKiBmbHVzaF9jaGFycyBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2ZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKwkKKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8ICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCQkKKwkvKiB0aGlzIHRlbGxzIHRoZSB0cmFuc21pdHRlciB0byBjb25zaWRlciB0aGlzIHBvcnQgZm9yCisJICAgZGF0YSBvdXRwdXQgdG8gdGhlIGNhcmQgLi4uIHRoYXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8uICovCisJcG9ydC0+c3RhdHVzIHw9IElTSV9UWE9LOwkKK30KKworLyogd3JpdGVfcm9vbSBldCBhbGwgKi8KK3N0YXRpYyBpbnQgaXNpY29tX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgZnJlZTsKKworCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisJCisJZnJlZSA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDE7CisJaWYgKGZyZWUgPCAwKQorCQlmcmVlID0gMDsKKwlyZXR1cm4gZnJlZTsKK30KKworLyogY2hhcnNfaW5fYnVmZmVyIGV0IGFsbCAqLworc3RhdGljIGludCBpc2ljb21fY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fY2hhcnNfaW5fYnVmZmVyIikpCisJCXJldHVybiAwOworCXJldHVybiBwb3J0LT54bWl0X2NudDsKK30KKworLyogaW9jdGwgZXQgYWxsICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXNpY29tX3NlbmRfYnJlYWsoc3RydWN0IGlzaV9wb3J0ICogcG9ydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOwkKKwkKKwlpZighbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisJCQorCW91dHcoMHg4MDAwIHwgKChwb3J0LT5jaGFubmVsKSA8PCAoY2FyZC0+c2hpZnRfY291bnQpKSB8IDB4MywgYmFzZSk7CisJb3V0dygobGVuZ3RoICYgMHhmZikgPDwgOCB8IDB4MDAsIGJhc2UpOworCW91dHcoKGxlbmd0aCAmIDB4ZmYwMCksIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisKKwl1bmxvY2tfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBpc2ljb21fdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkvKiBqdXN0IHNlbmQgdGhlIHBvcnQgc3RhdHVzICovCisJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gcG9ydC0+c3RhdHVzOworCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21faW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJcmV0dXJuICAoKHN0YXR1cyAmIElTSV9SVFMpID8gVElPQ01fUlRTIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9EVFIpID8gVElPQ01fRFRSIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9EU1IpID8gVElPQ01fRFNSIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9DVFMpID8gVElPQ01fQ1RTIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9SSSApID8gVElPQ01fUkkgIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgaXNpY29tX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21faW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcmFpc2VfcnRzKHBvcnQpOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCXJhaXNlX2R0cihwb3J0KTsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJZHJvcF9ydHMocG9ydCk7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlkcm9wX2R0cihwb3J0KTsKKworCXJldHVybiAwOworfQkJCQorCitzdGF0aWMgaW50IGlzaWNvbV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IGlzaV9wb3J0ICogcG9ydCwKKwkJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld2luZm87CisJaW50IHJlY29uZmlnX3BvcnQ7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmbmV3aW5mbywgaW5mbywgc2l6ZW9mKG5ld2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCXJlY29uZmlnX3BvcnQgPSAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9IAorCQkJIChuZXdpbmZvLmZsYWdzICYgQVNZTkNfU1BEX01BU0spKTsKKwkKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChuZXdpbmZvLmNsb3NlX2RlbGF5ICE9IHBvcnQtPmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKG5ld2luZm8uY2xvc2luZ193YWl0ICE9IHBvcnQtPmNsb3Npbmdfd2FpdCkgfHwKKwkJICAgICgobmV3aW5mby5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0gCisJCSAgICAgKHBvcnQtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+IEFTWU5DX1VTUl9NQVNLKSB8CisJCQkJKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCX0JCisJZWxzZSB7CisJCXBvcnQtPmNsb3NlX2RlbGF5ID0gbmV3aW5mby5jbG9zZV9kZWxheTsKKwkJcG9ydC0+Y2xvc2luZ193YWl0ID0gbmV3aW5mby5jbG9zaW5nX3dhaXQ7IAorCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwgCisJCQkJKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19GTEFHUykpOworCX0KKwlpZiAocmVjb25maWdfcG9ydCkgeworCQlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CisJfQorCXJldHVybiAwOwkJIAorfQkJCisKK3N0YXRpYyBpbnQgaXNpY29tX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LCAKKwkJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG91dF9pbmZvOworCQorCW1lbXNldCgmb3V0X2luZm8sIDAsIHNpemVvZihvdXRfaW5mbykpOworLyoJb3V0X2luZm8udHlwZSA9ID8gKi8KKwlvdXRfaW5mby5saW5lID0gcG9ydCAtIGlzaV9wb3J0czsKKwlvdXRfaW5mby5wb3J0ID0gcG9ydC0+Y2FyZC0+YmFzZTsKKwlvdXRfaW5mby5pcnEgPSBwb3J0LT5jYXJkLT5pcnE7CisJb3V0X2luZm8uZmxhZ3MgPSBwb3J0LT5mbGFnczsKKy8qCW91dF9pbmZvLmJhdWRfYmFzZSA9ID8gKi8KKwlvdXRfaW5mby5jbG9zZV9kZWxheSA9IHBvcnQtPmNsb3NlX2RlbGF5OworCW91dF9pbmZvLmNsb3Npbmdfd2FpdCA9IHBvcnQtPmNsb3Npbmdfd2FpdDsKKwlpZihjb3B5X3RvX3VzZXIoaW5mbywgJm91dF9pbmZvLCBzaXplb2Yob3V0X2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CQkJCQkKKworc3RhdGljIGludCBpc2ljb21faW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKSAKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXR2YWw7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBUQ1NCUks6CisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlpZiAoIWFyZykKKwkJCQlpc2ljb21fc2VuZF9icmVhayhwb3J0LCBIWi80KTsKKwkJCXJldHVybiAwOworCQkJCisJCWNhc2UgVENTQlJLUDoJCisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlpc2ljb21fc2VuZF9icmVhayhwb3J0LCBhcmcgPyBhcmcgKiAoSFovMTApIDogSFovNCk7CisJCQlyZXR1cm4gMDsKKwkJCQorCQljYXNlIFRJT0NHU09GVENBUjoKKwkJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCQkJCisJCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQkJaWYoZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCShhcmcgPyBDTE9DQUwgOiAwKSk7CisJCQlyZXR1cm4gMDsJCisJCQkKKwkJY2FzZSBUSU9DR1NFUklBTDoKKwkJCXJldHVybiBpc2ljb21fZ2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCQkKKwkJY2FzZSBUSU9DU1NFUklBTDoKKwkJCXJldHVybiBpc2ljb21fc2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCQkJCQkKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CQkJCQkJCisJfQorCXJldHVybiAwOworfQorCisvKiBzZXRfdGVybWlvcyBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3NldF90ZXJtaW9zIikpCisJCXJldHVybjsKKwkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKKwkJcmV0dXJuOworCQkKKwlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CisJCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsJCisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCWlzaWNvbV9zdGFydCh0dHkpOyAgIAorCX0gICAgCit9CisKKy8qIHRocm90dGxlIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3Rocm90dGxlIikpCisJCXJldHVybjsKKwkKKwkvKiB0ZWxsIHRoZSBjYXJkIHRoYXQgdGhpcyBwb3J0IGNhbm5vdCBoYW5kbGUgYW55IG1vcmUgZGF0YSBmb3Igbm93ICovCisJY2FyZC0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IHBvcnQtPmNoYW5uZWwpOworCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKK30KKworLyogdW50aHJvdHRsZSBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCS8qIHRlbGwgdGhlIGNhcmQgdGhhdCB0aGlzIHBvcnQgaXMgcmVhZHkgdG8gYWNjZXB0IG1vcmUgZGF0YSAqLworCWNhcmQtPnBvcnRfc3RhdHVzIHw9ICgxIDw8IHBvcnQtPmNoYW5uZWwpOworCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKK30KKworLyogc3RvcCBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9zdG9wIikpCisJCXJldHVybjsKKwkKKwkvKiB0aGlzIHRlbGxzIHRoZSB0cmFuc21pdHRlciBub3QgdG8gY29uc2lkZXIgdGhpcyBwb3J0IGZvcgorCSAgIGRhdGEgb3V0cHV0IHRvIHRoZSBjYXJkLiAqLworCXBvcnQtPnN0YXR1cyAmPSB+SVNJX1RYT0s7Cit9CisKKy8qIHN0YXJ0IGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fc3RhcnQiKSkKKwkJcmV0dXJuOworCQorCS8qIHRoaXMgdGVsbHMgdGhlIHRyYW5zbWl0dGVyIHRvIGNvbnNpZGVyIHRoaXMgcG9ydCBmb3IKKwkgICBkYXRhIG91dHB1dCB0byB0aGUgY2FyZC4gKi8KKwlwb3J0LT5zdGF0dXMgfD0gSVNJX1RYT0s7Cit9CisKKy8qIGhhbmd1cCBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGRvX2lzaWNvbV9oYW5ndXAodm9pZCAqIGRhdGEpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgZGF0YTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eSkKKwkJdHR5X2hhbmd1cCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBpc2ljb21faGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21faGFuZ3VwIikpCisJCXJldHVybjsKKwkKKwlpc2ljb21fc2h1dGRvd25fcG9ydChwb3J0KTsKKwlwb3J0LT5jb3VudCA9IDA7CisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcG9ydC0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7Cit9CisKKy8qIGZsdXNoX2J1ZmZlciBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9mbHVzaF9idWZmZXIiKSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9pb3JlZ2lvbih2b2lkKQoreworCWludCBjb3VudCwgZG9uZT0wOworCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKyApIHsKKwkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKQorCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNixJU0lDT01fTkFNRSkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJL08gUmVnaW9uIDB4JXgtMHgleCBpcyBidXN5LiBDYXJkJWQgd2lsbCBiZSBkaXNhYmxlZC5cbiIsCisJCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlLGlzaV9jYXJkW2NvdW50XS5iYXNlKzE1LGNvdW50KzEpOworCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlPTA7CisJCQkJZG9uZSsrOworCQkJfQorCX0KKwlyZXR1cm4gZG9uZTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfaW9yZWdpb24odm9pZCkKK3sKKwlpbnQgY291bnQ7CisJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgCisJCWlmIChpc2lfY2FyZFtjb3VudF0uYmFzZSkgeworCQkJcmVsZWFzZV9yZWdpb24oaXNpX2NhcmRbY291bnRdLmJhc2UsMTYpOworI2lmZGVmIElTSUNPTV9ERUJVRwkJCQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogSS9PIFJlZ2lvbiAweCV4LTB4JXggcmVsZWFzZWQgZm9yIENhcmQlZC5cbiIsaXNpX2NhcmRbY291bnRdLmJhc2UsaXNpX2NhcmRbY291bnRdLmJhc2UrMTUsY291bnQrMSk7CisjZW5kaWYJCQkKKwkJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGlzaWNvbV9vcHMgPSB7CisJLm9wZW4JPSBpc2ljb21fb3BlbiwKKwkuY2xvc2UJPSBpc2ljb21fY2xvc2UsCisJLndyaXRlCT0gaXNpY29tX3dyaXRlLAorCS5wdXRfY2hhcgk9IGlzaWNvbV9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMJPSBpc2ljb21fZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20JPSBpc2ljb21fd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyCT0gaXNpY29tX2NoYXJzX2luX2J1ZmZlciwKKwkuaW9jdGwJPSBpc2ljb21faW9jdGwsCisJLnNldF90ZXJtaW9zCT0gaXNpY29tX3NldF90ZXJtaW9zLAorCS50aHJvdHRsZQk9IGlzaWNvbV90aHJvdHRsZSwKKwkudW50aHJvdHRsZQk9IGlzaWNvbV91bnRocm90dGxlLAorCS5zdG9wCT0gaXNpY29tX3N0b3AsCisJLnN0YXJ0CT0gaXNpY29tX3N0YXJ0LAorCS5oYW5ndXAJPSBpc2ljb21faGFuZ3VwLAorCS5mbHVzaF9idWZmZXIJPSBpc2ljb21fZmx1c2hfYnVmZmVyLAorCS50aW9jbWdldAk9IGlzaWNvbV90aW9jbWdldCwKKwkudGlvY21zZXQJPSBpc2ljb21fdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJLyogdHR5IGRyaXZlciBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gKi8KKwlpc2ljb21fbm9ybWFsID0gYWxsb2NfdHR5X2RyaXZlcihQT1JUX0NPVU5UKTsKKwlpZiAoIWlzaWNvbV9ub3JtYWwpCisJCXJldHVybiAtRU5PTUVNOworCisJaXNpY29tX25vcm1hbC0+b3duZXIJPSBUSElTX01PRFVMRTsKKwlpc2ljb21fbm9ybWFsLT5uYW1lIAk9ICJ0dHlNIjsKKwlpc2ljb21fbm9ybWFsLT5kZXZmc19uYW1lID0gImlzaWNvbS8iOworCWlzaWNvbV9ub3JtYWwtPm1ham9yCT0gSVNJQ09NX05NQUpPUjsKKwlpc2ljb21fbm9ybWFsLT5taW5vcl9zdGFydAk9IDA7CisJaXNpY29tX25vcm1hbC0+dHlwZQk9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJaXNpY29tX25vcm1hbC0+c3VidHlwZQk9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MJPSB0dHlfc3RkX3Rlcm1pb3M7CisJaXNpY29tX25vcm1hbC0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcJPSAKKwkJCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfENMT0NBTDsKKwlpc2ljb21fbm9ybWFsLT5mbGFncwk9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGlzaWNvbV9ub3JtYWwsICZpc2ljb21fb3BzKTsKKwkKKwlpZiAoKGVycm9yPXR0eV9yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCkpIT0wKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IENvdWxkbid0IHJlZ2lzdGVyIHRoZSBkaWFsaW4gZHJpdmVyLCBlcnJvcj0lZFxuIiwKKwkJCWVycm9yKTsKKwkJcHV0X3R0eV9kcml2ZXIoaXNpY29tX25vcm1hbCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bnJlZ2lzdGVyX2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3IgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCk7CisJaWYgKGVycm9yKQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBjb3VsZG4ndCB1bnJlZ2lzdGVyIG5vcm1hbCBkcml2ZXIgZXJyb3I9JWQuXG4iLGVycm9yKTsKKwlwdXRfdHR5X2RyaXZlcihpc2ljb21fbm9ybWFsKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfaXNyKHZvaWQpCit7CisJaW50IGNvdW50LCBkb25lPTA7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKyApIHsKKwkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKSB7CisJCQlpcnFmbGFncyA9IChpc2lfY2FyZFtjb3VudF0uaXNhID09IFlFUykgPyAKKwkJCQkJU0FfSU5URVJSVVBUIDogCisJCQkJCShTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSk7CisKKwkJCWlmIChyZXF1ZXN0X2lycShpc2lfY2FyZFtjb3VudF0uaXJxLCAKKwkJCQkJaXNpY29tX2ludGVycnVwdCwgCisJCQkJCWlycWZsYWdzLCAKKwkJCQkJSVNJQ09NX05BTUUsICZpc2lfY2FyZFtjb3VudF0pKSB7CisKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IENvdWxkIG5vdCIKKwkJCQkJIiBpbnN0YWxsIGhhbmRsZXIgYXQgSXJxICVkLiIKKwkJCQkJIiBDYXJkJWQgd2lsbCBiZSBkaXNhYmxlZC5cbiIsCisJCQkJCWlzaV9jYXJkW2NvdW50XS5pcnEsIGNvdW50KzEpOworCisJCQkJcmVsZWFzZV9yZWdpb24oaXNpX2NhcmRbY291bnRdLmJhc2UsMTYpOworCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlPTA7CisJCQl9CisJCQllbHNlCisJCQkJZG9uZSsrOworCQl9CQorCX0KKwlyZXR1cm4gZG9uZTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfaXNyKHZvaWQpCit7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgeworCQlpZiAoaXNpX2NhcmRbY291bnRdLmJhc2UpCisJCQlmcmVlX2lycShpc2lfY2FyZFtjb3VudF0uaXJxLCAmaXNpX2NhcmRbY291bnRdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlzaWNvbV9pbml0KHZvaWQpCit7CisJaW50IGNhcmQsIGNoYW5uZWwsIGJhc2U7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJCisJaWYgKCF0bXBfYnVmKSB7IAorCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCSAgICAgIAlpZiAoIXBhZ2UpIHsKKyNpZmRlZiBJU0lDT01fREVCVUcJICAgICAgCQorCSAgICAgIAkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ291bGRuJ3QgYWxsb2NhdGUgcGFnZSBmb3IgdG1wX2J1Zi5cbiIpOworI2Vsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBOb3QgZW5vdWdoIG1lbW9yeS4uLlxuIik7CisjZW5kaWYJICAgICAgCisJICAgICAgCQlyZXR1cm4gMDsKKwkgICAgICAJfQkKKwkgICAgICAJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJfQorCQorCWlmICghcmVnaXN0ZXJfaW9yZWdpb24oKSkgCisJeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogQWxsIHJlcXVpcmVkIEkvTyBzcGFjZSBmb3VuZCBidXN5LlxuIik7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZWdpc3Rlcl9kcml2ZXJzKCkpIAorCXsKKwkJdW5yZWdpc3Rlcl9pb3JlZ2lvbigpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXJlZ2lzdGVyX2lzcigpKSAKKwl7CisJCXVucmVnaXN0ZXJfZHJpdmVycygpOworCQkvKiAgaW9wb3J0cyBhbHJlYWR5IHVyZWdpc3RlcmVkIGluIHJlZ2lzdGVyX2lzciAqLworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXJldHVybiAwOwkJCisJfQorCQorCW1lbXNldChpc2lfcG9ydHMsIDAsIHNpemVvZihpc2lfcG9ydHMpKTsKKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgQk9BUkRfQ09VTlQ7IGNhcmQrKykgeworCQlwb3J0ID0gJmlzaV9wb3J0c1tjYXJkICogMTZdOworCQlpc2lfY2FyZFtjYXJkXS5wb3J0cyA9IHBvcnQ7CisJCXNwaW5fbG9ja19pbml0KCZpc2lfY2FyZFtjYXJkXS5jYXJkX2xvY2spOworCQliYXNlID0gaXNpX2NhcmRbY2FyZF0uYmFzZTsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IDE2OyBjaGFubmVsKyssIHBvcnQrKykgeworCQkJcG9ydC0+bWFnaWMgPSBJU0lDT01fTUFHSUM7CisJCQlwb3J0LT5jYXJkID0gJmlzaV9jYXJkW2NhcmRdOworCQkJcG9ydC0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCSAJcG9ydC0+Y2xvc2VfZGVsYXkgPSA1MCAqIEhaLzEwMDsKKwkJIAlwb3J0LT5jbG9zaW5nX3dhaXQgPSAzMDAwICogSFovMTAwOworCQkgCUlOSVRfV09SSygmcG9ydC0+aGFuZ3VwX3RxLCBkb19pc2ljb21faGFuZ3VwLCBwb3J0KTsKKwkJIAlJTklUX1dPUksoJnBvcnQtPmJoX3RxdWV1ZSwgaXNpY29tX2JvdHRvbWhhbGYsIHBvcnQpOworCQkgCXBvcnQtPnN0YXR1cyA9IDA7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5vcGVuX3dhaXQpOwkgCQkJCQorCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCQkvKiAgLiAuIC4gICovCisgCQl9CisJfSAKKwkKKwlyZXR1cm4gMTsJCit9CisKKy8qCisgKglJbnNtb2QgY2FuIHNldCBzdGF0aWMgc3ltYm9scyBzbyBrZWVwIHRoZXNlIHN0YXRpYworICovCisgCitzdGF0aWMgaW50IGlvWzRdOworc3RhdGljIGludCBpcnFbNF07CisKK01PRFVMRV9BVVRIT1IoIk11bHRpVGVjaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBJU0kgc2VyaWVzIG9mIGNhcmRzIGJ5IE11bHRpVGVjaCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBwb3J0cyBmb3IgdGhlIGNhcmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJbnRlcnJ1cHRzIGZvciB0aGUgY2FyZHMiKTsKKworc3RhdGljIGludCBfX2RldmluaXQgaXNpY29tX3NldHVwKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaW50IHJldHZhbCwgY2FyZCwgaWR4LCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyIHBjaWlycTsKKwl1bnNpZ25lZCBpbnQgaW9hZGRyOworCSAgICAgICAgICAgICAgICAKKwljYXJkID0gMDsKKwlmb3IoaWR4PTA7IGlkeCA8IEJPQVJEX0NPVU5UOyBpZHgrKykgewkKKwkJaWYgKGlvW2lkeF0pIHsKKwkJCWlzaV9jYXJkW2lkeF0uYmFzZT1pb1tpZHhdOworCQkJaXNpX2NhcmRbaWR4XS5pcnE9aXJxW2lkeF07CisJCQlpc2lfY2FyZFtpZHhdLmlzYT1ZRVM7CisJCQljYXJkKys7CisJCX0KKwkJZWxzZSB7CisJCQlpc2lfY2FyZFtpZHhdLmJhc2UgPSAwOworCQkJaXNpX2NhcmRbaWR4XS5pcnEgPSAwOworCQl9CisJfQorCQorCWZvciAoaWR4PTAgO2lkeCA8IGNhcmQ7IGlkeCsrKSB7CisJCWlmICghKChpc2lfY2FyZFtpZHhdLmlycT09Mil8fChpc2lfY2FyZFtpZHhdLmlycT09Myl8fAorCQkgICAgKGlzaV9jYXJkW2lkeF0uaXJxPT00KXx8KGlzaV9jYXJkW2lkeF0uaXJxPT01KXx8CisJCSAgICAoaXNpX2NhcmRbaWR4XS5pcnE9PTcpfHwoaXNpX2NhcmRbaWR4XS5pcnE9PTEwKXx8CisJCSAgICAoaXNpX2NhcmRbaWR4XS5pcnE9PTExKXx8KGlzaV9jYXJkW2lkeF0uaXJxPT0xMil8fAorCQkgICAgKGlzaV9jYXJkW2lkeF0uaXJxPT0xNSkpKSB7CisJCQkKKwkJCWlmIChpc2lfY2FyZFtpZHhdLmJhc2UpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogSXJxICVkIHVuc3VwcG9ydGVkLiBEaXNhYmxpbmcgQ2FyZCVkLi4uXG4iLAorCQkJCQlpc2lfY2FyZFtpZHhdLmlycSwgaWR4KzEpOworCQkJCWlzaV9jYXJkW2lkeF0uYmFzZT0wOworCQkJCWNhcmQtLTsKKwkJCX0JCisJCX0KKwl9CQorCQorCWlmIChjYXJkIDwgQk9BUkRfQ09VTlQpIHsKKwkJZm9yIChpZHg9MDsgaWR4IDwgREVWSURfQ09VTlQ7IGlkeCsrKSB7CisJCQlkZXYgPSBOVUxMOworCQkJZm9yICg7Oyl7CisJCQkJaWYgKCEoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFZFTkRPUl9JRCwgaXNpY29tX3BjaV90YmxbaWR4XS5kZXZpY2UsIGRldikpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoY2FyZCA+PSBCT0FSRF9DT1VOVCkKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKQorCQkJCQlicmVhazsKKworCQkJCS8qIGZvdW5kIGEgUENJIElTSSBjYXJkISAqLworCQkJCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAoZGV2LCAzKTsgLyogaS5lIGF0IG9mZnNldCAweDFjIGluIHRoZQorCQkJCQkJCQkgICAgICAgKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCQkJCQkJCQkgICAgICAgKiBzcGFjZS4KKwkJCQkJCQkJICAgICAgICovCisJCQkJcGNpaXJxID0gZGV2LT5pcnE7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVNJIFBDSSBDYXJkKERldmljZSBJRCAweCV4KVxuIiwgaXNpY29tX3BjaV90YmxbaWR4XS5kZXZpY2UpOworCQkJCS8qCisJCQkJICogYWxsb3QgdGhlIGZpcnN0IGVtcHR5IHNsb3QgaW4gdGhlIGFycmF5CisJCQkJICovCQkJCQorCQkJCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKykgewkJCQkKKwkJCQkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlID09IDApIHsKKwkJCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlID0gaW9hZGRyOworCQkJCQkJaXNpX2NhcmRbY291bnRdLmlycSA9IHBjaWlycTsKKwkJCQkJCWlzaV9jYXJkW2NvdW50XS5pc2EgPSBOTzsKKwkJCQkJCWNhcmQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQkJCQkKKwkJCWlmIChjYXJkID49IEJPQVJEX0NPVU5UKSBicmVhazsKKwkJfQorCX0KKwkKKwlpZiAoIShpc2lfY2FyZFswXS5iYXNlIHx8IGlzaV9jYXJkWzFdLmJhc2UgfHwgaXNpX2NhcmRbMl0uYmFzZSB8fCBpc2lfY2FyZFszXS5iYXNlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogTm8gdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLiBEcml2ZXIgY2Fubm90IGJlIGluaXRpYWxpemVkLi4uXG4iKTsgCisJCXJldHVybiAtRUlPOworCX0JCisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZpc2lsb2FkZXJfZGV2aWNlKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkcml2ZXIuXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJCisJaWYgKCFpc2ljb21faW5pdCgpKSB7CisJCWlmIChtaXNjX2RlcmVnaXN0ZXIoJmlzaWxvYWRlcl9kZXZpY2UpKSAKKwkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBVbmFibGUgdG8gdW5yZWdpc3RlciBGaXJtd2FyZSBMb2FkZXIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCQorCWluaXRfdGltZXIoJnR4KTsKKwl0eC5leHBpcmVzID0gamlmZmllcyArIDE7CisJdHguZGF0YSA9IDA7CisJdHguZnVuY3Rpb24gPSBpc2ljb21fdHg7CisJcmVfc2NoZWR1bGUgPSAxOworCWFkZF90aW1lcigmdHgpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNpY29tX2V4aXQodm9pZCkKK3sKKwlyZV9zY2hlZHVsZSA9IDA7CisJLyogRklYTUUgKi8KKwltc2xlZXAoMTAwMCk7CisJdW5yZWdpc3Rlcl9pc3IoKTsKKwl1bnJlZ2lzdGVyX2RyaXZlcnMoKTsKKwl1bnJlZ2lzdGVyX2lvcmVnaW9uKCk7CQorCWlmKHRtcF9idWYpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwlpZiAobWlzY19kZXJlZ2lzdGVyKCZpc2lsb2FkZXJfZGV2aWNlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IFVuYWJsZSB0byB1bnJlZ2lzdGVyIEZpcm13YXJlIExvYWRlciBkcml2ZXJcbiIpOworfQorCittb2R1bGVfaW5pdChpc2ljb21fc2V0dXApOworbW9kdWxlX2V4aXQoaXNpY29tX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWVkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKQEAgLTAsMCArMSw1Mjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglpc3RhbGxpb24uYyAgLS0gc3RhbGxpb24gaW50ZWxsaWdlbnQgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgIFN0YWxsaW9uIFRlY2hub2xvZ2llcworICoJQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIEdyZWcgVW5nZXJlci4KKyAqCisgKglUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICoJTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lzdGFsbGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIGRpZmZlcmVudCBib2FyZCB0eXBlcy4gTm90IGFsbCBvZiB0aGUgZm9sbG93aW5nIGJvYXJkIHR5cGVzCisgKglhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiBCdXQgSSB3aWxsIHVzZSB0aGUgc3RhbmRhcmQgImFzc2lnbmVkIgorICoJYm9hcmQgbnVtYmVycy4gQ3VycmVudGx5IHN1cHBvcnRlZCBib2FyZHMgYXJlIGFiYnJldmlhdGVkIGFzOgorICoJRUNQID0gRWFzeUNvbm5lY3Rpb24gOC82NCwgT05CID0gT05ib2FyZCwgQkJZID0gQnJ1bWJ5IGFuZAorICoJU1RBTCA9IFN0YWxsaW9uLgorICovCisjZGVmaW5lCUJSRF9VTktOT1dOCTAKKyNkZWZpbmUJQlJEX1NUQUxMSU9OCTEKKyNkZWZpbmUJQlJEX0JSVU1CWTQJMgorI2RlZmluZQlCUkRfT05CT0FSRDIJMworI2RlZmluZQlCUkRfT05CT0FSRAk0CisjZGVmaW5lCUJSRF9CUlVNQlk4CTUKKyNkZWZpbmUJQlJEX0JSVU1CWTE2CTYKKyNkZWZpbmUJQlJEX09OQk9BUkRFCTcKKyNkZWZpbmUJQlJEX09OQk9BUkQzMgk5CisjZGVmaW5lCUJSRF9PTkJPQVJEMl8zMgkxMAorI2RlZmluZQlCUkRfT05CT0FSRFJTCTExCisjZGVmaW5lCUJSRF9FQVNZSU8JMjAKKyNkZWZpbmUJQlJEX0VDSAkJMjEKKyNkZWZpbmUJQlJEX0VDSE1DCTIyCisjZGVmaW5lCUJSRF9FQ1AJCTIzCisjZGVmaW5lIEJSRF9FQ1BFCTI0CisjZGVmaW5lCUJSRF9FQ1BNQwkyNQorI2RlZmluZQlCUkRfRUNIUENJCTI2CisjZGVmaW5lCUJSRF9FQ0g2NFBDSQkyNworI2RlZmluZQlCUkRfRUFTWUlPUENJCTI4CisjZGVmaW5lCUJSRF9FQ1BQQ0kJMjkKKworI2RlZmluZQlCUkRfQlJVTUJZCUJSRF9CUlVNQlk0CisKKy8qCisgKglEZWZpbmUgYSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byBob2xkIHRoZSBib2FyZCBjb25maWd1cmF0aW9uLgorICoJTmVlZCB0byBzZXQgdGhpcyB1cCBpbiB0aGUgY29kZSAoZm9yIG5vdykgd2l0aCB0aGUgYm9hcmRzIHRoYXQgYXJlCisgKgl0byBiZSBjb25maWd1cmVkIGludG8gdGhlIHN5c3RlbS4gVGhpcyBpcyB3aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkCisgKgl3aGVuIGFkZGluZy9yZW1vdmluZy9tb2RpZnlpbmcgYm9hcmRzLiBFYWNoIGxpbmUgZW50cnkgaW4gdGhlCisgKglzdGxpX2JyZGNvbmZbXSBhcnJheSBpcyBhIGJvYXJkLiBFYWNoIGxpbmUgY29udGFpbnMgaW8vaXJxL21lbW9yeQorICoJcmFuZ2VzIGZvciB0aGF0IGJvYXJkIChhcyB3ZWxsIGFzIHdoYXQgdHlwZSBvZiBib2FyZCBpdCBpcykuCisgKglTb21lIGV4YW1wbGVzOgorICoJCXsgQlJEX0VDUCwgMHgyYTAsIDAsIDB4Y2MwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBFYXN5Q29ubmVjdGlvbiA4LzY0IGF0IGlvIGFkZHJlc3MgMmEwLAorICoJYW5kIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBvZiBjYzAwMC4gTXVsdGlwbGUgRWFzeUNvbm5lY3Rpb24gOC82NAorICoJYm9hcmRzIGNhbiBzaGFyZSB0aGUgc2FtZSBzaGFyZWQgbWVtb3J5IGFkZHJlc3Mgc3BhY2UuIE5vIGludGVycnVwdAorICoJaXMgcmVxdWlyZWQgZm9yIHRoaXMgYm9hcmQgdHlwZS4KKyAqCUFub3RoZXIgZXhhbXBsZToKKyAqCQl7IEJSRF9FQ1BFLCAweDUwMDAsIDAsIDB4ODAwMDAwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBFYXN5Q29ubmVjdGlvbiA4LzY0IEVJU0EgaW4gc2xvdCA1IGFuZAorICoJc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIDB4ODAwMDAwMDAgKDIgR0J5dGUpLiBNdWx0aXBsZQorICoJRWFzeUNvbm5lY3Rpb24gOC82NCBFSVNBIGJvYXJkcyBjYW4gc2hhcmUgdGhlIHNhbWUgc2hhcmVkIG1lbW9yeQorICoJYWRkcmVzcyBzcGFjZS4gTm8gaW50ZXJydXB0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGJvYXJkIHR5cGUuCisgKglBbm90aGVyIGV4YW1wbGU6CisgKgkJeyBCUkRfT05CT0FSRCwgMHgyNDAsIDAsIDB4ZDAwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBPTmJvYXJkIChJU0EgdHlwZSkgYXQgaW8gYWRkcmVzcyAyNDAsCisgKglhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIGQwMDAwLiBNdWx0aXBsZSBPTmJvYXJkcyBjYW4gc2hhcmUKKyAqCXRoZSBzYW1lIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzcGFjZS4gTm8gaW50ZXJydXB0IHJlcXVpcmVkLgorICoJQW5vdGhlciBleGFtcGxlOgorICoJCXsgQlJEX0JSVU1CWTQsIDB4MzYwLCAwLCAweGM4MDAwLCAwLCAwIH0sCisgKglUaGlzIGxpbmUgd2lsbCBjb25maWd1cmUgYSBCcnVtYnkgYm9hcmQgKGFueSBudW1iZXIgb2YgcG9ydHMhKSBhdAorICoJaW8gYWRkcmVzcyAzNjAgYW5kIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBvZiBjODAwMC4gQWxsIEJydW1ieSBib2FyZHMKKyAqCWNvbmZpZ3VyZWQgaW50byBhIHN5c3RlbSBtdXN0IGhhdmUgdGhlaXIgb3duIHNlcGFyYXRlIGlvIGFuZCBtZW1vcnkKKyAqCWFkZHJlc3Nlcy4gTm8gaW50ZXJydXB0IGlzIHJlcXVpcmVkLgorICoJQW5vdGhlciBleGFtcGxlOgorICoJCXsgQlJEX1NUQUxMSU9OLCAweDMzMCwgMCwgMHhkMDAwMCwgMCwgMCB9LAorICoJVGhpcyBsaW5lIHdpbGwgY29uZmlndXJlIGFuIG9yaWdpbmFsIFN0YWxsaW9uIGJvYXJkIGF0IGlvIGFkZHJlc3MgMzMwCisgKglhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIGQwMDAwICh0aGlzIHdvdWxkIG9ubHkgYmUgdmFsaWQgZm9yIGEgIlY0LjAiCisgKglvciBSZXYuTyBTdGFsbGlvbiBib2FyZCkuIEFsbCBTdGFsbGlvbiBib2FyZHMgY29uZmlndXJlZCBpbnRvIHRoZQorICoJc3lzdGVtIG11c3QgaGF2ZSB0aGVpciBvd24gc2VwYXJhdGUgaW8gYW5kIG1lbW9yeSBhZGRyZXNzZXMuIE5vCisgKglpbnRlcnJ1cHQgaXMgcmVxdWlyZWQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAkJYnJkdHlwZTsKKwlpbnQJCWlvYWRkcjE7CisJaW50CQlpb2FkZHIyOworCXVuc2lnbmVkIGxvbmcJbWVtYWRkcjsKKwlpbnQJCWlycTsKKwlpbnQJCWlycXR5cGU7Cit9IHN0bGNvbmZfdDsKKworc3RhdGljIHN0bGNvbmZfdAlzdGxpX2JyZGNvbmZbXSA9IHsKKwkvKnsgQlJEX0VDUCwgMHgyYTAsIDAsIDB4Y2MwMDAsIDAsIDAgfSwqLworfTsKKworc3RhdGljIGludAlzdGxpX25yYnJkcyA9IHNpemVvZihzdGxpX2JyZGNvbmYpIC8gc2l6ZW9mKHN0bGNvbmZfdCk7CisKKy8qCisgKglUaGVyZSBpcyBzb21lIGV4cGVyaW1lbnRhbCBFSVNBIGJvYXJkIGRldGVjdGlvbiBjb2RlIGluIHRoaXMgZHJpdmVyLgorICoJQnkgZGVmYXVsdCBpdCBpcyBkaXNhYmxlZCwgYnV0IGZvciB0aG9zZSB0aGF0IHdhbnQgdG8gdHJ5IGl0IG91dCwKKyAqCXRoZW4gc2V0IHRoZSBkZWZpbmUgYmVsb3cgdG8gYmUgMS4KKyAqLworI2RlZmluZQlTVExJX0VJU0FQUk9CRQkwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBzb21lIGltcG9ydGFudCBkcml2ZXIgY2hhcmFjdGVyaXN0aWNzLiBEZXZpY2UgbWFqb3IgbnVtYmVycworICoJYWxsb2NhdGVkIGFzIHBlciBMaW51eCBEZXZpY2UgUmVnaXN0cnkuCisgKi8KKyNpZm5kZWYJU1RMX1NJT01FTU1BSk9SCisjZGVmaW5lCVNUTF9TSU9NRU1NQUpPUgkJMjgKKyNlbmRpZgorI2lmbmRlZglTVExfU0VSSUFMTUFKT1IKKyNkZWZpbmUJU1RMX1NFUklBTE1BSk9SCQkyNAorI2VuZGlmCisjaWZuZGVmCVNUTF9DQUxMT1VUTUFKT1IKKyNkZWZpbmUJU1RMX0NBTExPVVRNQUpPUgkyNQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBvdXIgbG9jYWwgZHJpdmVyIGlkZW50aXR5IGZpcnN0LiBTZXQgdXAgc3R1ZmYgdG8gZGVhbCB3aXRoCisgKglhbGwgdGhlIGxvY2FsIHN0cnVjdHVyZXMgcmVxdWlyZWQgYnkgYSBzZXJpYWwgdHR5IGRyaXZlci4KKyAqLworc3RhdGljIGNoYXIJKnN0bGlfZHJ2dGl0bGUgPSAiU3RhbGxpb24gSW50ZWxsaWdlbnQgTXVsdGlwb3J0IFNlcmlhbCBEcml2ZXIiOworc3RhdGljIGNoYXIJKnN0bGlfZHJ2bmFtZSA9ICJpc3RhbGxpb24iOworc3RhdGljIGNoYXIJKnN0bGlfZHJ2dmVyc2lvbiA9ICI1LjYuMCI7CitzdGF0aWMgY2hhcgkqc3RsaV9zZXJpYWxuYW1lID0gInR0eUUiOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIJKnN0bGlfc2VyaWFsOworCisvKgorICoJV2Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlciBmb3IgY2hhcnMgdGhhdAorICoJY29tZSBkaXJlY3QgZnJvbSB1c2VyIHNwYWNlLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGEgY29weSBmcm9tIHVzZXIKKyAqCXNwYWNlIG1pZ2h0IGNhdXNlIGEgcGFnZSBmYXVsdCAodHlwaWNhbGx5IG9uIGEgc3lzdGVtIHRoYXQgaXMKKyAqCXN3YXBwaW5nISkuIEFsbCBwb3J0cyB3aWxsIHNoYXJlIG9uZSBidWZmZXIgLSBzaW5jZSBpZiB0aGUgc3lzdGVtCisgKglpcyBhbHJlYWR5IHN3YXBwaW5nIGEgc2hhcmVkIGJ1ZmZlciB3b24ndCBtYWtlIHRoaW5ncyBhbnkgd29yc2UuCisgKi8KK3N0YXRpYyBjaGFyCQkJKnN0bGlfdG1wd3JpdGVidWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWChzdGxpX3RtcHdyaXRlc2VtKTsKKworI2RlZmluZQlTVExJX1RYQlVGU0laRQkJNDA5NgorCisvKgorICoJVXNlIGEgZmFzdCBsb2NhbCBidWZmZXIgZm9yIGNvb2tlZCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgYSB3aG9sZQorICoJYnVuY2ggb2YgY29va2VkIGNoYXJhY3RlcnMgY29tZSBpbiBmb3IgYSBwb3J0LCAxIGF0IGEgdGltZS4gU28gd2UKKyAqCXNhdmUgdGhvc2UgdXAgaW50byBhIGxvY2FsIGJ1ZmZlciwgdGhlbiB3cml0ZSBvdXQgdGhlIHdob2xlIGxvdAorICoJd2l0aCBhIGxhcmdlIG1lbWNweS4gSnVzdCB1c2UgMSBidWZmZXIgZm9yIGFsbCBwb3J0cywgc2luY2UgaXRzCisgKgl1c2UgaXQgaXMgb25seSBuZWVkIGZvciBzaG9ydCBwZXJpb2RzIG9mIHRpbWUgYnkgZWFjaCBwb3J0LgorICovCitzdGF0aWMgY2hhcgkJCSpzdGxpX3R4Y29va2J1ZjsKK3N0YXRpYyBpbnQJCQlzdGxpX3R4Y29va3NpemU7CitzdGF0aWMgaW50CQkJc3RsaV90eGNvb2tyZWFsc2l6ZTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdAkqc3RsaV90eGNvb2t0dHk7CisKKy8qCisgKglEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCisgKgl3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuIEJhc2ljYWxseSBhbGwgaXQgZGVmaW5lcyBpcyBhIHJhdyBwb3J0CisgKglhdCA5NjAwIGJhdWQsIDggZGF0YSBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcwkJc3RsaV9kZWZ0ZXJtaW9zID0geworCS5jX2NmbGFnCT0gKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCksCisJLmNfY2MJCT0gSU5JVF9DX0NDLAorfTsKKworLyoKKyAqCURlZmluZSBnbG9iYWwgc3RhdHMgc3RydWN0dXJlcy4gTm90IHVzZWQgb2Z0ZW4sIGFuZCBjYW4gYmUKKyAqCXJlLXVzZWQgZm9yIGVhY2ggc3RhdHMgY2FsbC4KKyAqLworc3RhdGljIGNvbXN0YXRzX3QJc3RsaV9jb21zdGF0czsKK3N0YXRpYyBjb21icmRfdAkJc3RsaV9icmRzdGF0czsKK3N0YXRpYyBhc3lzdGF0c190CXN0bGlfY2Rrc3RhdHM7CitzdGF0aWMgc3RsaWJyZF90CXN0bGlfZHVtbXlicmQ7CitzdGF0aWMgc3RsaXBvcnRfdAlzdGxpX2R1bW15cG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RsaWJyZF90CSpzdGxpX2JyZHNbU1RMX01BWEJSRFNdOworCitzdGF0aWMgaW50CQlzdGxpX3NoYXJlZDsKKworLyoKKyAqCVBlciBib2FyZCBzdGF0ZSBmbGFncy4gVXNlZCB3aXRoIHRoZSBzdGF0ZSBmaWVsZCBvZiB0aGUgYm9hcmQgc3RydWN0LgorICoJTm90IHJlYWxseSBtdWNoIGhlcmUuLi4gQWxsIHdlIG5lZWQgdG8gZG8gaXMga2VlcCB0cmFjayBvZiB3aGV0aGVyCisgKgl0aGUgYm9hcmQgaGFzIGJlZW4gZGV0ZWN0ZWQsIGFuZCB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgYSBzbGF2ZQorICoJb3Igbm90LgorICovCisjZGVmaW5lCUJTVF9GT1VORAkweDEKKyNkZWZpbmUJQlNUX1NUQVJURUQJMHgyCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBwb3J0IHN0YXRlIGZsYWdzLiBUaGVzZSBhcmUgbWFya2VkIGZvciBpbnRlcm5hbAorICoJc3RhdGUgcHVycG9zZXMgb25seSwgdXN1YWxseSB0byBkbyB3aXRoIHRoZSBzdGF0ZSBvZiBjb21tdW5pY2F0aW9ucworICoJd2l0aCB0aGUgc2xhdmUuIE1vc3Qgb2YgdGhlbSBuZWVkIHRvIGJlIHVwZGF0ZWQgYXRvbWljYWxseSwgc28gYWx3YXlzCisgKgl1c2UgdGhlIGJpdCBzZXR0aW5nIG9wZXJhdGlvbnMgKHVubGVzcyBwcm90ZWN0ZWQgYnkgY2xpL3N0aSkuCisgKi8KKyNkZWZpbmUJU1RfSU5JVElBTElaSU5HCTEKKyNkZWZpbmUJU1RfT1BFTklORwkyCisjZGVmaW5lCVNUX0NMT1NJTkcJMworI2RlZmluZQlTVF9DTURJTkcJNAorI2RlZmluZQlTVF9UWEJVU1kJNQorI2RlZmluZQlTVF9SWElORwk2CisjZGVmaW5lCVNUX0RPRkxVU0hSWAk3CisjZGVmaW5lCVNUX0RPRkxVU0hUWAk4CisjZGVmaW5lCVNUX0RPU0lHUwk5CisjZGVmaW5lCVNUX1JYU1RPUAkxMAorI2RlZmluZQlTVF9HRVRTSUdTCTExCisKKy8qCisgKglEZWZpbmUgYW4gYXJyYXkgb2YgYm9hcmQgbmFtZXMgYXMgcHJpbnRhYmxlIHN0cmluZ3MuIEhhbmR5IGZvcgorICoJcmVmZXJlbmNpbmcgYm9hcmRzIHdoZW4gcHJpbnRpbmcgdHJhY2UgYW5kIHN0dWZmLgorICovCitzdGF0aWMgY2hhcgkqc3RsaV9icmRuYW1lc1tdID0geworCSJVbmtub3duIiwKKwkiU3RhbGxpb24iLAorCSJCcnVtYnkiLAorCSJPTmJvYXJkLU1DIiwKKwkiT05ib2FyZCIsCisJIkJydW1ieSIsCisJIkJydW1ieSIsCisJIk9OYm9hcmQtRUkiLAorCShjaGFyICopIE5VTEwsCisJIk9OYm9hcmQiLAorCSJPTmJvYXJkLU1DIiwKKwkiT05ib2FyZC1NQyIsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCSJFYXN5SU8iLAorCSJFQzgvMzItQVQiLAorCSJFQzgvMzItTUMiLAorCSJFQzgvNjQtQVQiLAorCSJFQzgvNjQtRUkiLAorCSJFQzgvNjQtTUMiLAorCSJFQzgvMzItUENJIiwKKwkiRUM4LzY0LVBDSSIsCisJIkVhc3lJTy1QQ0kiLAorCSJFQy9SQS1QQ0kiLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgTU9EVUxFCisvKgorICoJRGVmaW5lIHNvbWUgc3RyaW5nIGxhYmVscyBmb3IgYXJndW1lbnRzIHBhc3NlZCBmcm9tIHRoZSBtb2R1bGUKKyAqCWxvYWQgbGluZS4gVGhlc2UgYWxsb3cgZm9yIGVhc3kgYm9hcmQgZGVmaW5pdGlvbnMsIGFuZCBlYXN5CisgKgltb2RpZmljYXRpb24gb2YgdGhlIGlvLCBtZW1vcnkgYW5kIGlycSByZXNvdWNyZXMuCisgKi8KKworc3RhdGljIGNoYXIJKmJvYXJkMFs4XTsKK3N0YXRpYyBjaGFyCSpib2FyZDFbOF07CitzdGF0aWMgY2hhcgkqYm9hcmQyWzhdOworc3RhdGljIGNoYXIJKmJvYXJkM1s4XTsKKworc3RhdGljIGNoYXIJKipzdGxpX2JyZHNwW10gPSB7CisJKGNoYXIgKiopICZib2FyZDAsCisJKGNoYXIgKiopICZib2FyZDEsCisJKGNoYXIgKiopICZib2FyZDIsCisJKGNoYXIgKiopICZib2FyZDMKK307CisKKy8qCisgKglEZWZpbmUgYSBzZXQgb2YgY29tbW9uIGJvYXJkIG5hbWVzLCBhbmQgdHlwZXMuIFRoaXMgaXMgdXNlZCB0bworICoJcGFyc2UgYW55IG1vZHVsZSBhcmd1bWVudHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3RsaWJyZHR5cGUgeworCWNoYXIJKm5hbWU7CisJaW50CXR5cGU7Cit9IHN0bGlicmR0eXBlX3Q7CisKK3N0YXRpYyBzdGxpYnJkdHlwZV90CXN0bGlfYnJkc3RyW10gPSB7CisJeyAic3RhbGxpb24iLCBCUkRfU1RBTExJT04gfSwKKwl7ICIxIiwgQlJEX1NUQUxMSU9OIH0sCisJeyAiYnJ1bWJ5IiwgQlJEX0JSVU1CWSB9LAorCXsgImJydW1ieTQiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5LzQiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5LTQiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5OCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkvOCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnktOCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkxNiIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkvMTYiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5LTE2IiwgQlJEX0JSVU1CWSB9LAorCXsgIjIiLCBCUkRfQlJVTUJZIH0sCisJeyAib25ib2FyZDIiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkLTIiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkLzIiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkLW1jIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZC9tYyIsIEJSRF9PTkJPQVJEMiB9LAorCXsgIm9uYm9hcmQtbWNhIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZC9tY2EiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICIzIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZCIsIEJSRF9PTkJPQVJEIH0sCisJeyAib25ib2FyZGF0IiwgQlJEX09OQk9BUkQgfSwKKwl7ICI0IiwgQlJEX09OQk9BUkQgfSwKKwl7ICJvbmJvYXJkZSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQtZSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQvZSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQtZWkiLCBCUkRfT05CT0FSREUgfSwKKwl7ICJvbmJvYXJkL2VpIiwgQlJEX09OQk9BUkRFIH0sCisJeyAiNyIsIEJSRF9PTkJPQVJERSB9LAorCXsgImVjcCIsIEJSRF9FQ1AgfSwKKwl7ICJlY3BhdCIsIEJSRF9FQ1AgfSwKKwl7ICJlYzgvNjQiLCBCUkRfRUNQIH0sCisJeyAiZWM4LzY0LWF0IiwgQlJEX0VDUCB9LAorCXsgImVjOC82NC1pc2EiLCBCUkRfRUNQIH0sCisJeyAiMjMiLCBCUkRfRUNQIH0sCisJeyAiZWNwZSIsIEJSRF9FQ1BFIH0sCisJeyAiZWNwZWkiLCBCUkRfRUNQRSB9LAorCXsgImVjOC82NC1lIiwgQlJEX0VDUEUgfSwKKwl7ICJlYzgvNjQtZWkiLCBCUkRfRUNQRSB9LAorCXsgIjI0IiwgQlJEX0VDUEUgfSwKKwl7ICJlY3BtYyIsIEJSRF9FQ1BNQyB9LAorCXsgImVjOC82NC1tYyIsIEJSRF9FQ1BNQyB9LAorCXsgImVjOC82NC1tY2EiLCBCUkRfRUNQTUMgfSwKKwl7ICIyNSIsIEJSRF9FQ1BNQyB9LAorCXsgImVjcHBjaSIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICJlYy9yYSIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICJlYy9yYS1wYyIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICJlYy9yYS1wY2kiLCBCUkRfRUNQUENJIH0sCisJeyAiMjkiLCBCUkRfRUNQUENJIH0sCit9OworCisvKgorICoJRGVmaW5lIHRoZSBtb2R1bGUgYWdydW1lbnRzLgorICovCitNT0RVTEVfQVVUSE9SKCJHcmVnIFVuZ2VyZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3RhbGxpb24gSW50ZWxsaWdlbnQgTXVsdGlwb3J0IFNlcmlhbCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitNT0RVTEVfUEFSTShib2FyZDAsICIxLTNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMCwgIkJvYXJkIDAgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssbWVtYWRkcl0iKTsKK01PRFVMRV9QQVJNKGJvYXJkMSwgIjEtM3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQxLCAiQm9hcmQgMSBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxtZW1hZGRyXSIpOworTU9EVUxFX1BBUk0oYm9hcmQyLCAiMS0zcyIpOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDIsICJCb2FyZCAyIGNvbmZpZyAtPiBuYW1lWyxpb2FkZHJbLG1lbWFkZHJdIik7CitNT0RVTEVfUEFSTShib2FyZDMsICIxLTNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMywgIkJvYXJkIDMgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssbWVtYWRkcl0iKTsKKworI2VuZGlmCisKKy8qCisgKglTZXQgdXAgYSBkZWZhdWx0IG1lbW9yeSBhZGRyZXNzIHRhYmxlIGZvciBFSVNBIGJvYXJkIHByb2JpbmcuCisgKglUaGUgZGVmYXVsdCBhZGRyZXNzZXMgYXJlIGFsbCBiZWxsb3cgMU1ieXRlLCB3aGljaCBoYXMgdG8gYmUgdGhlCisgKgljYXNlIGFueXdheS4gVGhleSBzaG91bGQgYmUgc2FmZSwgc2luY2Ugd2Ugb25seSByZWFkIHZhbHVlcyBmcm9tCisgKgl0aGVtLCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgd2hpbGUgd2UgZG8gaXQuIElmIHRoZSBoaWdoZXIKKyAqCW1lbW9yeSBzdXBwb3J0IGlzIGNvbXBpbGVkIGluIHRoZW4gd2UgYWxzbyB0cnkgcHJvYmluZyBhcm91bmQKKyAqCXRoZSAxR2IsIDJHYiBhbmQgM0diIGFyZWFzIGFzIHdlbGwuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJc3RsaV9laXNhbWVtcHJvYmVhZGRyc1tdID0geworCTB4YzAwMDAsICAgIDB4ZDAwMDAsICAgIDB4ZTAwMDAsICAgIDB4ZjAwMDAsCisJMHg4MDAwMDAwMCwgMHg4MDAxMDAwMCwgMHg4MDAyMDAwMCwgMHg4MDAzMDAwMCwKKwkweDQwMDAwMDAwLCAweDQwMDEwMDAwLCAweDQwMDIwMDAwLCAweDQwMDMwMDAwLAorCTB4YzAwMDAwMDAsIDB4YzAwMTAwMDAsIDB4YzAwMjAwMDAsIDB4YzAwMzAwMDAsCisJMHhmZjAwMDAwMCwgMHhmZjAxMDAwMCwgMHhmZjAyMDAwMCwgMHhmZjAzMDAwMCwKK307CisKK3N0YXRpYyBpbnQJc3RsaV9laXNhbWVtcHNpemUgPSBzaXplb2Yoc3RsaV9laXNhbWVtcHJvYmVhZGRycykgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CitpbnQJCXN0bGlfZWlzYXByb2JlID0gU1RMSV9FSVNBUFJPQkU7CisKKy8qCisgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCisgKi8KKyNpZmRlZiBDT05GSUdfUENJCisjaWZuZGVmCVBDSV9WRU5ET1JfSURfU1RBTExJT04KKyNkZWZpbmUJUENJX1ZFTkRPUl9JRF9TVEFMTElPTgkJMHgxMjRkCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FQ1JBCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRUNSQQkJMHgwMDA0CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlzdGFsbGlvbl9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1NUQUxMSU9OLCBQQ0lfREVWSUNFX0lEX0VDUkEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpc3RhbGxpb25fcGNpX3RibCk7CisKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgRUNQIGJvYXJkcy4gVGhlc2UgZGVmaW5lcyBhcHBseQorICoJdG8gdGhlIGRpcmVjdGx5IGFjY2Vzc2libGUgaW8gcG9ydHMgb2YgdGhlIEVDUC4gVGhlcmUgaXMgYSBzZXQgb2YKKyAqCWRlZmluZXMgZm9yIGVhY2ggRUNQIGJvYXJkIHR5cGUsIElTQSwgRUlTQSwgTUNBIGFuZCBQQ0kuCisgKi8KKyNkZWZpbmUJRUNQX0lPU0laRQk0CisKKyNkZWZpbmUJRUNQX01FTVNJWkUJKDEyOCAqIDEwMjQpCisjZGVmaW5lCUVDUF9QQ0lNRU1TSVpFCSgyNTYgKiAxMDI0KQorCisjZGVmaW5lCUVDUF9BVFBBR0VTSVpFCSg0ICogMTAyNCkKKyNkZWZpbmUJRUNQX01DUEFHRVNJWkUJKDQgKiAxMDI0KQorI2RlZmluZQlFQ1BfRUlQQUdFU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlFQ1BfUENJUEFHRVNJWkUJKDY0ICogMTAyNCkKKworI2RlZmluZQlTVExfRUlTQUlECTB4OGM0ZQorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBJU0EgY2xhc3Mgb2YgRUNQIGJvYXJkLgorICovCisjZGVmaW5lCUVDUF9BVElSRUcJMAorI2RlZmluZQlFQ1BfQVRDT05GUgkxCisjZGVmaW5lCUVDUF9BVE1FTUFSCTIKKyNkZWZpbmUJRUNQX0FUTUVNUFIJMworI2RlZmluZQlFQ1BfQVRTVE9QCTB4MQorI2RlZmluZQlFQ1BfQVRJTlRFTkFCCTB4MTAKKyNkZWZpbmUJRUNQX0FURU5BQkxFCTB4MjAKKyNkZWZpbmUJRUNQX0FURElTQUJMRQkweDAwCisjZGVmaW5lCUVDUF9BVEFERFJNQVNLCTB4M2YwMDAKKyNkZWZpbmUJRUNQX0FUQUREUlNIRlQJMTIKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgRUlTQSBjbGFzcyBvZiBFQ1AgYm9hcmQuCisgKi8KKyNkZWZpbmUJRUNQX0VJSVJFRwkwCisjZGVmaW5lCUVDUF9FSU1FTUFSTAkxCisjZGVmaW5lCUVDUF9FSUNPTkZSCTIKKyNkZWZpbmUJRUNQX0VJTUVNQVJICTMKKyNkZWZpbmUJRUNQX0VJRU5BQkxFCTB4MQorI2RlZmluZQlFQ1BfRUlESVNBQkxFCTB4MAorI2RlZmluZQlFQ1BfRUlTVE9QCTB4NAorI2RlZmluZQlFQ1BfRUlFREdFCTB4MDAKKyNkZWZpbmUJRUNQX0VJTEVWRUwJMHg4MAorI2RlZmluZQlFQ1BfRUlBRERSTUFTS0wJMHgwMGZmMDAwMAorI2RlZmluZQlFQ1BfRUlBRERSU0hGVEwJMTYKKyNkZWZpbmUJRUNQX0VJQUREUk1BU0tICTB4ZmYwMDAwMDAKKyNkZWZpbmUJRUNQX0VJQUREUlNIRlRICTI0CisjZGVmaW5lCUVDUF9FSUJSREVOQUIJMHhjODQKKworI2RlZmluZQlFQ1BfRUlTQUlECTB4NAorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBNaWNyby1jaGFubmVsIGNsYXNzIG9mIEVDUCBib2FyZC4KKyAqCShJdCBoYXMgYSBsb3QgaW4gY29tbW9uIHdpdGggdGhlIElTQSBib2FyZHMuKQorICovCisjZGVmaW5lCUVDUF9NQ0lSRUcJMAorI2RlZmluZQlFQ1BfTUNDT05GUgkxCisjZGVmaW5lCUVDUF9NQ1NUT1AJMHgyMAorI2RlZmluZQlFQ1BfTUNFTkFCTEUJMHg4MAorI2RlZmluZQlFQ1BfTUNESVNBQkxFCTB4MDAKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgUENJIGNsYXNzIG9mIEVDUCBib2FyZC4KKyAqCShJdCBoYXMgYSBsb3QgaW4gY29tbW9uIHdpdGggdGhlIG90aGVyIEVDUCBib2FyZHMuKQorICovCisjZGVmaW5lCUVDUF9QQ0lJUkVHCTAKKyNkZWZpbmUJRUNQX1BDSUNPTkZSCTEKKyNkZWZpbmUJRUNQX1BDSVNUT1AJMHgwMQorCisvKgorICoJSGFyZHdhcmUgY29uZmlndXJhdGlvbiBpbmZvIGZvciBPTmJvYXJkIGFuZCBCcnVtYnkgYm9hcmRzLiBUaGVzZQorICoJZGVmaW5lcyBhcHBseSB0byB0aGUgZGlyZWN0bHkgYWNjZXNzaWJsZSBpbyBwb3J0cyBvZiB0aGVzZSBib2FyZHMuCisgKi8KKyNkZWZpbmUJT05CX0lPU0laRQkxNgorI2RlZmluZQlPTkJfTUVNU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlPTkJfQVRQQUdFU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlPTkJfTUNQQUdFU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlPTkJfRUlNRU1TSVpFCSgxMjggKiAxMDI0KQorI2RlZmluZQlPTkJfRUlQQUdFU0laRQkoNjQgKiAxMDI0KQorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBJU0EgY2xhc3Mgb2YgT05ib2FyZCBib2FyZC4KKyAqLworI2RlZmluZQlPTkJfQVRJUkVHCTAKKyNkZWZpbmUJT05CX0FUTUVNQVIJMQorI2RlZmluZQlPTkJfQVRDT05GUgkyCisjZGVmaW5lCU9OQl9BVFNUT1AJMHg0CisjZGVmaW5lCU9OQl9BVEVOQUJMRQkweDAxCisjZGVmaW5lCU9OQl9BVERJU0FCTEUJMHgwMAorI2RlZmluZQlPTkJfQVRBRERSTUFTSwkweGZmMDAwMAorI2RlZmluZQlPTkJfQVRBRERSU0hGVAkxNgorCisjZGVmaW5lCU9OQl9NRU1FTkFCTE8JMAorI2RlZmluZQlPTkJfTUVNRU5BQkhJCTB4MDIKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgRUlTQSBjbGFzcyBvZiBPTmJvYXJkIGJvYXJkLgorICovCisjZGVmaW5lCU9OQl9FSUlSRUcJMAorI2RlZmluZQlPTkJfRUlNRU1BUkwJMQorI2RlZmluZQlPTkJfRUlDT05GUgkyCisjZGVmaW5lCU9OQl9FSU1FTUFSSAkzCisjZGVmaW5lCU9OQl9FSUVOQUJMRQkweDEKKyNkZWZpbmUJT05CX0VJRElTQUJMRQkweDAKKyNkZWZpbmUJT05CX0VJU1RPUAkweDQKKyNkZWZpbmUJT05CX0VJRURHRQkweDAwCisjZGVmaW5lCU9OQl9FSUxFVkVMCTB4ODAKKyNkZWZpbmUJT05CX0VJQUREUk1BU0tMCTB4MDBmZjAwMDAKKyNkZWZpbmUJT05CX0VJQUREUlNIRlRMCTE2CisjZGVmaW5lCU9OQl9FSUFERFJNQVNLSAkweGZmMDAwMDAwCisjZGVmaW5lCU9OQl9FSUFERFJTSEZUSAkyNAorI2RlZmluZQlPTkJfRUlCUkRFTkFCCTB4Yzg0CisKKyNkZWZpbmUJT05CX0VJU0FJRAkweDEKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgQnJ1bWJ5IGJvYXJkcy4gVGhleSBhcmUgcHJldHR5IHNpbXBsZSwKKyAqCXRoZXJlIGlzIG5vdCBtdWNoIHRoYXQgaXMgcHJvZ3JhbW1hYmx5IGNvbmZpZ3VyYWJsZS4KKyAqLworI2RlZmluZQlCQllfSU9TSVpFCTE2CisjZGVmaW5lCUJCWV9NRU1TSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lCUJCWV9QQUdFU0laRQkoMTYgKiAxMDI0KQorCisjZGVmaW5lCUJCWV9BVElSRUcJMAorI2RlZmluZQlCQllfQVRDT05GUgkxCisjZGVmaW5lCUJCWV9BVFNUT1AJMHg0CisKKy8qCisgKglJbXBvcnRhbnQgZGVmaW5lcyBmb3IgdGhlIFN0YWxsaW9uIGJvYXJkcy4gVGhleSBhcmUgcHJldHR5IHNpbXBsZSwKKyAqCXRoZXJlIGlzIG5vdCBtdWNoIHRoYXQgaXMgcHJvZ3JhbW1hYmx5IGNvbmZpZ3VyYWJsZS4KKyAqLworI2RlZmluZQlTVEFMX0lPU0laRQkxNgorI2RlZmluZQlTVEFMX01FTVNJWkUJKDY0ICogMTAyNCkKKyNkZWZpbmUJU1RBTF9QQUdFU0laRQkoNjQgKiAxMDI0KQorCisvKgorICoJRGVmaW5lIHRoZSBzZXQgb2Ygc3RhdHVzIHJlZ2lzdGVyIHZhbHVlcyBmb3IgRWFzeUNvbm5lY3Rpb24gcGFuZWxzLgorICoJVGhlIHNpZ25hdHVyZSB3aWxsIHJldHVybiB3aXRoIHRoZSBzdGF0dXMgdmFsdWUgZm9yIGVhY2ggcGFuZWwuIEZyb20KKyAqCXRoaXMgd2UgY2FuIGRldGVybWluZSB3aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBib2FyZCAtIGJlZm9yZSB3ZSBoYXZlCisgKglhY3R1YWxseSBkb3duIGxvYWRlZCBhbnkgY29kZSB0byBpdC4KKyAqLworI2RlZmluZQlFQ0hfUE5MU1RBVFVTCTIKKyNkZWZpbmUJRUNIX1BOTDE2UE9SVAkweDIwCisjZGVmaW5lCUVDSF9QTkxJRE1BU0sJMHgwNworI2RlZmluZQlFQ0hfUE5MWFBJRAkweDQwCisjZGVmaW5lCUVDSF9QTkxJTlRSUEVORAkweDgwCisKKy8qCisgKglEZWZpbmUgc29tZSBtYWNyb3MgdG8gZG8gdGhpbmdzIHRvIHRoZSBib2FyZC4gRXZlbiB0aG9zZSB0aGVzZSBib2FyZHMKKyAqCWFyZSBzb21ld2hhdCByZWxhdGVkIHRoZXJlIGlzIG9mdGVuIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHdheXMgb2YKKyAqCWRvaW5nIHNvbWUgb3BlcmF0aW9uIG9uIGl0IChsaWtlIGVuYWJsZSwgcGFnaW5nLCByZXNldCwgZXRjKS4gU28gZWFjaAorICoJYm9hcmQgY2xhc3MgaGFzIGEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBkbyB0aGUgY29tbW9ubHkgcmVxdWlyZWQKKyAqCW9wZXJhdGlvbnMuIFRoZSBtYWNyb3MgYmVsb3cgYmFzaWNhbGx5IGp1c3QgY2FsbCB0aGVzZSBmdW5jdGlvbnMsCisgKglnZW5lcmFsbHkgY2hlY2tpbmcgZm9yIGEgTlVMTCBmdW5jdGlvbiAtIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGJvYXJkCisgKgluZWVkcyBub3RoaW5nIGRvbmUgdG8gaXQgdG8gYWNoaWV2ZSB0aGlzIG9wZXJhdGlvbiEKKyAqLworI2RlZmluZQlFQlJESU5JVChicmRwKQkJCQkJCVwKKwlpZiAoYnJkcC0+aW5pdCAhPSBOVUxMKQkJCQkJXAorCQkoKiBicmRwLT5pbml0KShicmRwKQorCisjZGVmaW5lCUVCUkRFTkFCTEUoYnJkcCkJCQkJCVwKKwlpZiAoYnJkcC0+ZW5hYmxlICE9IE5VTEwpCQkJCVwKKwkJKCogYnJkcC0+ZW5hYmxlKShicmRwKTsKKworI2RlZmluZQlFQlJERElTQUJMRShicmRwKQkJCQkJXAorCWlmIChicmRwLT5kaXNhYmxlICE9IE5VTEwpCQkJCVwKKwkJKCogYnJkcC0+ZGlzYWJsZSkoYnJkcCk7CisKKyNkZWZpbmUJRUJSRElOVFIoYnJkcCkJCQkJCQlcCisJaWYgKGJyZHAtPmludHIgIT0gTlVMTCkJCQkJCVwKKwkJKCogYnJkcC0+aW50cikoYnJkcCk7CisKKyNkZWZpbmUJRUJSRFJFU0VUKGJyZHApCQkJCQkJXAorCWlmIChicmRwLT5yZXNldCAhPSBOVUxMKQkJCQlcCisJCSgqIGJyZHAtPnJlc2V0KShicmRwKTsKKworI2RlZmluZQlFQlJER0VUTUVNUFRSKGJyZHAsb2Zmc2V0KQkJCQlcCisJKCogYnJkcC0+Z2V0bWVtcHRyKShicmRwLCBvZmZzZXQsIF9fTElORV9fKQorCisvKgorICoJRGVmaW5lIHRoZSBtYXhpbWFsIGJhdWQgcmF0ZSwgYW5kIHRoZSBkZWZhdWx0IGJhdWQgYmFzZSBmb3IgcG9ydHMuCisgKi8KKyNkZWZpbmUJU1RMX01BWEJBVUQJNDYwODAwCisjZGVmaW5lCVNUTF9CQVVEQkFTRQkxMTUyMDAKKyNkZWZpbmUJU1RMX0NMT1NFREVMQVkJKDUgKiBIWiAvIDEwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgbWFjcm9zIHRvIGV4dHJhY3QgYSBicmQgb3IgcG9ydCBudW1iZXIgZnJvbSBhIG1pbm9yIG51bWJlci4KKyAqLworI2RlZmluZQlNSU5PUjJCUkQobWluKQkJKCgobWluKSAmIDB4YzApID4+IDYpCisjZGVmaW5lCU1JTk9SMlBPUlQobWluKQkJKChtaW4pICYgMHgzZikKKworLyoKKyAqCURlZmluZSBhIGJhdWQgcmF0ZSB0YWJsZSB0aGF0IGNvbnZlcnRzIHRlcm1pb3MgYmF1ZCByYXRlIHNlbGVjdG9yCisgKglpbnRvIHRoZSBhY3R1YWwgYmF1ZCByYXRlIHZhbHVlLiBBbGwgYmF1ZCByYXRlIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQKKyAqCW9uIHRoZSBhY3R1YWwgYmF1ZCByYXRlIHJlcXVpcmVkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CXN0bGlfYmF1ZHJhdGVzW10gPSB7CisJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLAorCTk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHNvbWUgaGFuZHkgbG9jYWwgbWFjcm9zLi4uCisgKi8KKyN1bmRlZiBNSU4KKyNkZWZpbmUJTUlOKGEsYikJKCgoYSkgPD0gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCVRPTE9XRVIKKyNkZWZpbmUJVE9MT1dFUih4KQkoKCgoeCkgPj0gJ0EnKSAmJiAoKHgpIDw9ICdaJykpID8gKCh4KSArIDB4MjApIDogKHgpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQcm90b3R5cGUgYWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGRyaXZlciEKKyAqLworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZAlzdGxpX2FyZ2JyZHModm9pZCk7CitzdGF0aWMgaW50CXN0bGlfcGFyc2VicmQoc3RsY29uZl90ICpjb25mcCwgY2hhciAqKmFyZ3ApOworCitzdGF0aWMgdW5zaWduZWQgbG9uZwlzdGxpX2F0b2woY2hhciAqc3RyKTsKKyNlbmRpZgorCitpbnQJCXN0bGlfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQJc3RsaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkCXN0bGlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIGludAlzdGxpX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkCXN0bGlfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkCXN0bGlfZmx1c2hjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsaV93cml0ZXJvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bGlfY2hhcnNpbmJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsaV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQJc3RsaV9zZXR0ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGQpOworc3RhdGljIHZvaWQJc3RsaV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxpX2ZsdXNoYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsaV9icmVha2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQJc3RsaV93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkCXN0bGlfc2VuZHhjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOworc3RhdGljIHZvaWQJc3RsaV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bGlfcG9ydGluZm8oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgaW50IHBvcnRuciwgY2hhciAqcG9zKTsKKworc3RhdGljIGludAlzdGxpX2JyZGluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9zdGFydGJyZChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHNzaXplX3QJc3RsaV9tZW1yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApOworc3RhdGljIHNzaXplX3QJc3RsaV9tZW13cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKTsKK3N0YXRpYyBpbnQJc3RsaV9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkCXN0bGlfYnJkcG9sbChzdGxpYnJkX3QgKmJyZHAsIHZvbGF0aWxlIGNka2hkcl90ICpoZHJwKTsKK3N0YXRpYyB2b2lkCXN0bGlfcG9sbCh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50CXN0bGlfaG9zdGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0b3BlbihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9yYXdvcGVuKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCk7CitzdGF0aWMgaW50CXN0bGlfcmF3Y2xvc2Uoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKK3N0YXRpYyBpbnQJc3RsaV93YWl0Y2FycmllcihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZAlzdGxpX2RvaGFuZ3VwKHZvaWQgKmFyZyk7CitzdGF0aWMgaW50CXN0bGlfc2V0cG9ydChzdGxpcG9ydF90ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfY21kd2FpdChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKK3N0YXRpYyB2b2lkCXN0bGlfc2VuZGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKK3N0YXRpYyB2b2lkCXN0bGlfZG9kZWxheWNtZChzdGxpcG9ydF90ICpwb3J0cCwgdm9sYXRpbGUgY2RrY3RybF90ICpjcCk7CitzdGF0aWMgdm9pZAlzdGxpX21rYXN5cG9ydChzdGxpcG9ydF90ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKK3N0YXRpYyB2b2lkCXN0bGlfbWthc3lzaWdzKGFzeXNpZ3NfdCAqc3AsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIGxvbmcJc3RsaV9ta3Rpb2NtKHVuc2lnbmVkIGxvbmcgc2lndmFsdWUpOworc3RhdGljIHZvaWQJc3RsaV9yZWFkKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxpX2dldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCk7CitzdGF0aWMgaW50CXN0bGlfc2V0c2VyaWFsKHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRicmRzdGF0cyhjb21icmRfdCBfX3VzZXIgKmJwKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bGlfcG9ydGNtZHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9jbHJwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bGlfZ2V0cG9ydHN0cnVjdChzdGxpcG9ydF90IF9fdXNlciAqYXJnKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRicmRzdHJ1Y3Qoc3RsaWJyZF90IF9fdXNlciAqYXJnKTsKK3N0YXRpYyB2b2lkCSpzdGxpX21lbWFsbG9jKGludCBsZW4pOworc3RhdGljIHN0bGlicmRfdCAqc3RsaV9hbGxvY2JyZCh2b2lkKTsKKworc3RhdGljIHZvaWQJc3RsaV9lY3Bpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGVuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgY2hhcgkqc3RsaV9lY3BnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3ByZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BpbnRyKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGVpaW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BlaWVuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BlaWRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX2VjcGVpZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZWlyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BtY2VuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BtY2Rpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX2VjcG1jZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwbWNyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgY2hhcgkqc3RsaV9lY3BwY2lnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lyZXNldChzdGxpYnJkX3QgKmJyZHApOworCitzdGF0aWMgdm9pZAlzdGxpX29uYmluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX29uYmdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX29uYnJlc2V0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVlbmFibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZWRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX29uYmVnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9vbmJlcmVzZXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfYmJ5aW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfYmJ5Z2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfYmJ5cmVzZXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfc3RhbGluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX3N0YWxnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9zdGFscmVzZXQoc3RsaWJyZF90ICpicmRwKTsKKworc3RhdGljIHN0bGlwb3J0X3QgKnN0bGlfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKTsKKworc3RhdGljIGludAlzdGxpX2luaXRlY3Aoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0b25iKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgaW50CXN0bGlfZWlzYW1lbXByb2JlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgaW50CXN0bGlfaW5pdHBvcnRzKHN0bGlicmRfdCAqYnJkcCk7CisKKyNpZmRlZglDT05GSUdfUENJCitzdGF0aWMgaW50CXN0bGlfaW5pdHBjaWJyZChpbnQgYnJkdHlwZSwgc3RydWN0IHBjaV9kZXYgKmRldnApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSB0aGUgZHJpdmVyIGluZm8gZm9yIGEgdXNlciBsZXZlbCBzaGFyZWQgbWVtb3J5IGRldmljZS4gVGhpcworICoJZGV2aWNlIHdpbGwgd29yayBzb3J0IG9mIGxpa2UgdGhlIC9kZXYva21lbSBkZXZpY2UgLSBleGNlcHQgdGhhdCBpdAorICoJd2lsbCBnaXZlIGFjY2VzcyB0byB0aGUgc2hhcmVkIG1lbW9yeSBvbiB0aGUgU3RhbGxpb24gaW50ZWxsaWdlbnQKKyAqCWJvYXJkLiBUaGlzIGlzIGFsc28gYSB2ZXJ5IHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4KKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJc3RsaV9mc2lvbWVtID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBzdGxpX21lbXJlYWQsCisJLndyaXRlCQk9IHN0bGlfbWVtd3JpdGUsCisJLmlvY3RsCQk9IHN0bGlfbWVtaW9jdGwsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgYSB0aW1lcl9saXN0IGVudHJ5IGZvciBvdXIgcG9sbCByb3V0aW5lLiBUaGUgc2xhdmUgYm9hcmQKKyAqCWlzIHBvbGxlZCBldmVyeSBzbyBvZnRlbiB0byBzZWUgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcuIFRoaXMgaXMKKyAqCW11Y2ggY2hlYXBlciBvbiBob3N0IGNwdSB0aGFuIHVzaW5nIGludGVycnVwdHMuIEl0IHR1cm5zIG91dCB0bworICoJbm90IGluY3JlYXNlIGNoYXJhY3RlciBsYXRlbmN5IGJ5IG11Y2ggZWl0aGVyLi4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzdGxpX3RpbWVybGlzdCA9IFRJTUVSX0lOSVRJQUxJWkVSKHN0bGlfcG9sbCwgMCwgMCk7CisKK3N0YXRpYyBpbnQJc3RsaV90aW1lcm9uOworCisvKgorICoJRGVmaW5lIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIHRpbWVvdXQgcm91dGluZS4KKyAqLworI2RlZmluZQlTVExJX1RJTUVPVVQJKGppZmZpZXMgKyAxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICppc3RhbGxpb25fY2xhc3M7CisKKyNpZmRlZiBNT0RVTEUKKworLyoKKyAqCUxvYWRhYmxlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBzdHVmZi4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpc3RhbGxpb25fbW9kdWxlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImluaXRfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlzdGxpX2luaXQoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXN0YWxsaW9uX21vZHVsZV9leGl0KHZvaWQpCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlpLCBqOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImNsZWFudXBfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHN0bGlfZHJ2dGl0bGUsCisJCXN0bGlfZHJ2dmVyc2lvbik7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworLyoKKyAqCUZyZWUgdXAgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMgdXNlZCBieSB0aGUgcG9ydHMuIFRoaXMgaW5jbHVkZXMKKyAqCW1lbW9yeSBhbmQgaW50ZXJydXB0cy4KKyAqLworCWlmIChzdGxpX3RpbWVyb24pIHsKKwkJc3RsaV90aW1lcm9uID0gMDsKKwkJZGVsX3RpbWVyKCZzdGxpX3RpbWVybGlzdCk7CisJfQorCisJaSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdGxpX3NlcmlhbCk7CisJaWYgKGkpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHVuLXJlZ2lzdGVyIHR0eSBkcml2ZXIsICIKKwkJCSJlcnJubz0lZFxuIiwgLWkpOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwdXRfdHR5X2RyaXZlcihzdGxpX3NlcmlhbCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlkZXZmc19yZW1vdmUoInN0YWxpb21lbS8lZCIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpKTsKKwl9CisJZGV2ZnNfcmVtb3ZlKCJzdGFsaW9tZW0iKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShpc3RhbGxpb25fY2xhc3MpOworCWlmICgoaSA9IHVucmVnaXN0ZXJfY2hyZGV2KFNUTF9TSU9NRU1NQUpPUiwgInN0YWxpb21lbSIpKSkKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHVuLXJlZ2lzdGVyIHNlcmlhbCBtZW1vcnkgZGV2aWNlLCAiCisJCQkiZXJybm89JWRcbiIsIC1pKTsKKwlpZiAoc3RsaV90bXB3cml0ZWJ1ZiAhPSAoY2hhciAqKSBOVUxMKQorCQlrZnJlZShzdGxpX3RtcHdyaXRlYnVmKTsKKwlpZiAoc3RsaV90eGNvb2tidWYgIT0gKGNoYXIgKikgTlVMTCkKKwkJa2ZyZWUoc3RsaV90eGNvb2tidWYpOworCisJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQlpZiAoKGJyZHAgPSBzdGxpX2JyZHNbaV0pID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyAoaiA8IFNUTF9NQVhQT1JUUyk7IGorKykgeworCQkJcG9ydHAgPSBicmRwLT5wb3J0c1tqXTsKKwkJCWlmIChwb3J0cCAhPSAoc3RsaXBvcnRfdCAqKSBOVUxMKSB7CisJCQkJaWYgKHBvcnRwLT50dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCQkJCXR0eV9oYW5ndXAocG9ydHAtPnR0eSk7CisJCQkJa2ZyZWUocG9ydHApOworCQkJfQorCQl9CisKKwkJaW91bm1hcChicmRwLT5tZW1iYXNlKTsKKwkJaWYgKGJyZHAtPmlvc2l6ZSA+IDApCisJCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CisJCWtmcmVlKGJyZHApOworCQlzdGxpX2JyZHNbaV0gPSAoc3RsaWJyZF90ICopIE5VTEw7CisJfQorCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK21vZHVsZV9pbml0KGlzdGFsbGlvbl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpc3RhbGxpb25fbW9kdWxlX2V4aXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDaGVjayBmb3IgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4gb24gdGhlIG1vZHVsZSBsb2FkIGNvbW1hbmQgbGluZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2FyZ2JyZHModm9pZCkKK3sKKwlzdGxjb25mX3QJY29uZjsKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlucmFyZ3MsIGk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9hcmdicmRzKClcbiIpOworI2VuZGlmCisKKwlucmFyZ3MgPSBzaXplb2Yoc3RsaV9icmRzcCkgLyBzaXplb2YoY2hhciAqKik7CisKKwlmb3IgKGkgPSBzdGxpX25yYnJkczsgKGkgPCBucmFyZ3MpOyBpKyspIHsKKwkJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOworCQlpZiAoc3RsaV9wYXJzZWJyZCgmY29uZiwgc3RsaV9icmRzcFtpXSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlzdGxpX25yYnJkcyA9IGkgKyAxOworCQlicmRwLT5icmRuciA9IGk7CisJCWJyZHAtPmJyZHR5cGUgPSBjb25mLmJyZHR5cGU7CisJCWJyZHAtPmlvYmFzZSA9IGNvbmYuaW9hZGRyMTsKKwkJYnJkcC0+bWVtYWRkciA9IGNvbmYubWVtYWRkcjsKKwkJc3RsaV9icmRpbml0KGJyZHApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29udmVydCBhbiBhc2NpaSBzdHJpbmcgbnVtYmVyIGludG8gYW4gdW5zaWduZWQgbG9uZy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGxpX2F0b2woY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcJdmFsOworCWludAkJYmFzZSwgYzsKKwljaGFyCQkqc3A7CisKKwl2YWwgPSAwOworCXNwID0gc3RyOworCWlmICgoKnNwID09ICcwJykgJiYgKCooc3ArMSkgPT0gJ3gnKSkgeworCQliYXNlID0gMTY7CisJCXNwICs9IDI7CisJfSBlbHNlIGlmICgqc3AgPT0gJzAnKSB7CisJCWJhc2UgPSA4OworCQlzcCsrOworCX0gZWxzZSB7CisJCWJhc2UgPSAxMDsKKwl9CisKKwlmb3IgKDsgKCpzcCAhPSAwKTsgc3ArKykgeworCQljID0gKCpzcCA+ICc5JykgPyAoVE9MT1dFUigqc3ApIC0gJ2EnICsgMTApIDogKCpzcCAtICcwJyk7CisJCWlmICgoYyA8IDApIHx8IChjID49IGJhc2UpKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGFyZ3VtZW50ICVzXG4iLCBzdHIpOworCQkJdmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXZhbCA9ICh2YWwgKiBiYXNlKSArIGM7CisJfQorCXJldHVybih2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQYXJzZSB0aGUgc3VwcGxpZWQgYXJndW1lbnQgc3RyaW5nLCBpbnRvIHRoZSBib2FyZCBjb25mIHN0cnVjdC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfcGFyc2VicmQoc3RsY29uZl90ICpjb25mcCwgY2hhciAqKmFyZ3ApCit7CisJY2hhcgkqc3A7CisJaW50CW5yYnJkbmFtZXMsIGk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9wYXJzZWJyZChjb25mcD0leCxhcmdwPSV4KVxuIiwgKGludCkgY29uZnAsIChpbnQpIGFyZ3ApOworI2VuZGlmCisKKwlpZiAoKGFyZ3BbMF0gPT0gKGNoYXIgKikgTlVMTCkgfHwgKCphcmdwWzBdID09IDApKQorCQlyZXR1cm4oMCk7CisKKwlmb3IgKHNwID0gYXJncFswXSwgaSA9IDA7ICgoKnNwICE9IDApICYmIChpIDwgMjUpKTsgc3ArKywgaSsrKQorCQkqc3AgPSBUT0xPV0VSKCpzcCk7CisKKwlucmJyZG5hbWVzID0gc2l6ZW9mKHN0bGlfYnJkc3RyKSAvIHNpemVvZihzdGxpYnJkdHlwZV90KTsKKwlmb3IgKGkgPSAwOyAoaSA8IG5yYnJkbmFtZXMpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChzdGxpX2JyZHN0cltpXS5uYW1lLCBhcmdwWzBdKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IG5yYnJkbmFtZXMpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCBuYW1lLCAlcz9cbiIsIGFyZ3BbMF0pOworCQlyZXR1cm4oMCk7CisJfQorCisJY29uZnAtPmJyZHR5cGUgPSBzdGxpX2JyZHN0cltpXS50eXBlOworCWlmICgoYXJncFsxXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbMV0gIT0gMCkpCisJCWNvbmZwLT5pb2FkZHIxID0gc3RsaV9hdG9sKGFyZ3BbMV0pOworCWlmICgoYXJncFsyXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbMl0gIT0gMCkpCisJCWNvbmZwLT5tZW1hZGRyID0gc3RsaV9hdG9sKGFyZ3BbMl0pOworCXJldHVybigxKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUxvY2FsIGRyaXZlciBrZXJuZWwgbWFsbG9jIHJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQgKnN0bGlfbWVtYWxsb2MoaW50IGxlbikKK3sKKwlyZXR1cm4oKHZvaWQgKikga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bGlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CW1pbm9yZGV2OworCWludAkJYnJkbnIsIHBvcnRuciwgcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9vcGVuKHR0eT0leCxmaWxwPSV4KTogZGV2aWNlPSVzXG4iLCAoaW50KSB0dHksCisJCShpbnQpIGZpbHAsIHR0eS0+bmFtZSk7CisjZW5kaWYKKworCW1pbm9yZGV2ID0gdHR5LT5pbmRleDsKKwlicmRuciA9IE1JTk9SMkJSRChtaW5vcmRldik7CisJaWYgKGJyZG5yID49IHN0bGlfbnJicmRzKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChicmRwLT5zdGF0ZSAmIEJTVF9TVEFSVEVEKSA9PSAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydG5yID0gTUlOT1IyUE9SVChtaW5vcmRldik7CisJaWYgKChwb3J0bnIgPCAwKSB8fCAocG9ydG5yID4gYnJkcC0+bnJwb3J0cykpCisJCXJldHVybigtRU5PREVWKTsKKworCXBvcnRwID0gYnJkcC0+cG9ydHNbcG9ydG5yXTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChwb3J0cC0+ZGV2bnIgPCAxKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKworLyoKKyAqCUNoZWNrIGlmIHRoaXMgcG9ydCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNsb3NpbmcuIElmIHNvIHRoZW4gd2FpdAorICoJdW50aWwgaXQgaXMgY2xvc2VkIHRoZW4gcmV0dXJuIGVycm9yIHN0YXR1cyBiYXNlZCBvbiBmbGFnIHNldHRpbmdzLgorICoJVGhlIHNsZWVwIGhlcmUgZG9lcyBub3QgbmVlZCBpbnRlcnJ1cHQgcHJvdGVjdGlvbiBzaW5jZSB0aGUgd2FrZXVwCisgKglmb3IgaXQgaXMgZG9uZSB3aXRoIHRoZSBzYW1lIGNvbnRleHQuCisgKi8KKwlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0cC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuKC1FQUdBSU4pOworCQlyZXR1cm4oLUVSRVNUQVJUU1lTKTsKKwl9CisKKy8qCisgKglPbiB0aGUgZmlyc3Qgb3BlbiBvZiB0aGUgZGV2aWNlIHNldHVwIHRoZSBwb3J0IGhhcmR3YXJlLCBhbmQKKyAqCWluaXRpYWxpemUgdGhlIHBlciBwb3J0IGRhdGEgc3RydWN0dXJlLiBTaW5jZSBpbml0aWFsaXppbmcgdGhlIHBvcnQKKyAqCXJlcXVpcmVzIHNldmVyYWwgY29tbWFuZHMgdG8gdGhlIGJvYXJkIHdlIHdpbGwgbmVlZCB0byB3YWl0IGZvciBhbnkKKyAqCW90aGVyIG9wZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemluZyB0aGUgcG9ydC4KKyAqLworCXBvcnRwLT50dHkgPSB0dHk7CisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnRwOworCXBvcnRwLT5yZWZjb3VudCsrOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybigtRVJFU1RBUlRTWVMpOworCisJaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkgeworCQlzZXRfYml0KFNUX0lOSVRJQUxJWklORywgJnBvcnRwLT5zdGF0ZSk7CisJCWlmICgocmMgPSBzdGxpX2luaXRvcGVuKGJyZHAsIHBvcnRwKSkgPj0gMCkgeworCQkJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOworCQl9CisJCWNsZWFyX2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4ocmMpOworCX0KKworLyoKKyAqCUNoZWNrIGlmIHRoaXMgcG9ydCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNsb3NpbmcuIElmIHNvIHRoZW4gd2FpdAorICoJdW50aWwgaXQgaXMgY2xvc2VkIHRoZW4gcmV0dXJuIGVycm9yIHN0YXR1cywgYmFzZWQgb24gZmxhZyBzZXR0aW5ncy4KKyAqCVRoZSBzbGVlcCBoZXJlIGRvZXMgbm90IG5lZWQgaW50ZXJydXB0IHByb3RlY3Rpb24gc2luY2UgdGhlIHdha2V1cAorICoJZm9yIGl0IGlzIGRvbmUgd2l0aCB0aGUgc2FtZSBjb250ZXh0LgorICovCisJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydHAtPmNsb3NlX3dhaXQpOworCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybigtRUFHQUlOKTsKKwkJcmV0dXJuKC1FUkVTVEFSVFNZUyk7CisJfQorCisvKgorICoJQmFzZWQgb24gdHlwZSBvZiBvcGVuIGJlaW5nIGRvbmUgY2hlY2sgaWYgaXQgY2FuIG92ZXJsYXAgd2l0aCBhbnkKKyAqCXByZXZpb3VzIG9wZW5zIHN0aWxsIGluIGVmZmVjdC4gSWYgd2UgYXJlIGEgbm9ybWFsIHNlcmlhbCBkZXZpY2UKKyAqCXRoZW4gYWxzbyB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgZm9yIGNhcnJpZXIuCisgKi8KKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJaWYgKChyYyA9IHN0bGlfd2FpdGNhcnJpZXIoYnJkcCwgcG9ydHAsIGZpbHApKSAhPSAwKQorCQkJcmV0dXJuKHJjKTsKKwl9CisJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9jbG9zZSh0dHk9JXgsZmlscD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgZmlscCk7CisjZW5kaWYKKworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChwb3J0cC0+cmVmY291bnQgIT0gMSkpCisJCXBvcnRwLT5yZWZjb3VudCA9IDE7CisJaWYgKHBvcnRwLT5yZWZjb3VudC0tID4gMSkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCisvKgorICoJTWF5IHdhbnQgdG8gd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBiZWZvcmUgY2xvc2luZy4gVGhlIEJVU1kgZmxhZworICoJa2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSBhcmUgc3RpbGwgdHJhbnNtaXR0aW5nIG9yIG5vdC4gSXQgaXMKKyAqCXVwZGF0ZWQgYnkgbWVzc2FnZXMgZnJvbSB0aGUgc2xhdmUgLSBpbmRpY2F0aW5nIHdoZW4gYWxsIGNoYXJzCisgKglyZWFsbHkgaGF2ZSBkcmFpbmVkLgorICovCisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkKKwkJc3RsaV9mbHVzaGNoYXJzKHR0eSk7CisJdHR5LT5jbG9zaW5nID0gMTsKKwlpZiAocG9ydHAtPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHBvcnRwLT5jbG9zaW5nX3dhaXQpOworCisJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJc3RsaV9yYXdjbG9zZShicmRwLCBwb3J0cCwgMCwgMCk7CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisJCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMCwgMCk7CisJCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKQorCQkJc2V0X2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpOworCQllbHNlCisJCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAorCQkJCXNpemVvZihhc3lzaWdzX3QpLCAwKTsKKwl9CisJY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisJY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7CisJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpCisJCSh0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcikodHR5KTsKKwlzZXRfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7CisJc3RsaV9mbHVzaGJ1ZmZlcih0dHkpOworCisJdHR5LT5jbG9zaW5nID0gMDsKKwlwb3J0cC0+dHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEw7CisKKwlpZiAocG9ydHAtPm9wZW53YWl0Y250KSB7CisJCWlmIChwb3J0cC0+Y2xvc2VfZGVsYXkpCisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnRwLT5jbG9zZV9kZWxheSkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5vcGVuX3dhaXQpOworCX0KKworCXBvcnRwLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+Y2xvc2Vfd2FpdCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNhcnJ5IG91dCBmaXJzdCBvcGVuIG9wZXJhdGlvbnMgb24gYSBwb3J0LiBUaGlzIGludm9sdmVzIGEgbnVtYmVyIG9mCisgKgljb21tYW5kcyB0byBiZSBzZW50IHRvIHRoZSBzbGF2ZS4gV2UgbmVlZCB0byBvcGVuIHRoZSBwb3J0LCBzZXQgdGhlCisgKglub3RpZmljYXRpb24gZXZlbnRzLCBzZXQgdGhlIGluaXRpYWwgcG9ydCBzZXR0aW5ncywgZ2V0IGFuZCBzZXQgdGhlCisgKglpbml0aWFsIHNpZ25hbCB2YWx1ZXMuIFdlIHNsZWVwIGFuZCB3YWl0IGluIGJldHdlZW4gZWFjaCBvbmUuIEJ1dAorICoJdGhpcyBzdGlsbCBhbGwgaGFwcGVucyBwcmV0dHkgcXVpY2tseS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaW5pdG9wZW4oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCWFzeW5vdGlmeV90CQludDsKKwlhc3lwb3J0X3QJCWFwb3J0OworCWludAkJCXJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfaW5pdG9wZW4oYnJkcD0leCxwb3J0cD0leClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKChyYyA9IHN0bGlfcmF3b3BlbihicmRwLCBwb3J0cCwgMCwgMSkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCW1lbXNldCgmbnQsIDAsIHNpemVvZihhc3lub3RpZnlfdCkpOworCW50LmRhdGEgPSAoRFRfVFhMT1cgfCBEVF9UWEVNUFRZIHwgRFRfUlhCVVNZIHwgRFRfUlhCUkVBSyk7CisJbnQuc2lnbmFsID0gU0dfRENEOworCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUTk9USUZZLCAmbnQsCisJICAgIHNpemVvZihhc3lub3RpZnlfdCksIDApKSA8IDApCisJCXJldHVybihyYyk7CisKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlzdGxpX21rYXN5cG9ydChwb3J0cCwgJmFwb3J0LCB0dHktPnRlcm1pb3MpOworCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUUE9SVCwgJmFwb3J0LAorCSAgICBzaXplb2YoYXN5cG9ydF90KSwgMCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCXNldF9iaXQoU1RfR0VUU0lHUywgJnBvcnRwLT5zdGF0ZSk7CisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9HRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJICAgIHNpemVvZihhc3lzaWdzX3QpLCAxKSkgPCAwKQorCQlyZXR1cm4ocmMpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RfR0VUU0lHUywgJnBvcnRwLT5zdGF0ZSkpCisJCXBvcnRwLT5zaWdzID0gc3RsaV9ta3Rpb2NtKHBvcnRwLT5hc2lnLnNpZ3ZhbHVlKTsKKwlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsIDEsIDEpOworCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAorCSAgICBzaXplb2YoYXN5c2lnc190KSwgMCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhbiBvcGVuIG1lc3NhZ2UgdG8gdGhlIHNsYXZlLiBUaGlzIHdpbGwgc2xlZXAgd2FpdGluZyBmb3IgdGhlCisgKglhY2tub3dsZWRnZW1lbnQsIHNvIG11c3QgaGF2ZSB1c2VyIGNvbnRleHQuIFdlIG5lZWQgdG8gY28tb3JkaW5hdGUKKyAqCXdpdGggY2xvc2UgZXZlbnRzIGhlcmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgb3BlbiBhbmQgY2xvc2UgZXZlbnRzCisgKgl0byBvdmVybGFwLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9yYXdvcGVuKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCkKK3sKKwl2b2xhdGlsZSBjZGtoZHJfdAkqaGRycDsKKwl2b2xhdGlsZSBjZGtjdHJsX3QJKmNwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9yYXdvcGVuKGJyZHA9JXgscG9ydHA9JXgsYXJnPSV4LHdhaXQ9JWQpXG4iLAorCQkoaW50KSBicmRwLCAoaW50KSBwb3J0cCwgKGludCkgYXJnLCB3YWl0KTsKKyNlbmRpZgorCisvKgorICoJU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNsYXZlIHRvIG9wZW4gdGhpcyBwb3J0LgorICovCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKy8qCisgKglTbGF2ZSBpcyBhbHJlYWR5IGNsb3NpbmcgdGhpcyBwb3J0LiBUaGlzIGNhbiBoYXBwZW4gaWYgYSBoYW5ndXAKKyAqCW9jY3VycyBvbiB0aGlzIHBvcnQuIFNvIHdlIG11c3Qgd2FpdCB1bnRpbCBpdCBpcyBjb21wbGV0ZS4gVGhlCisgKglvcmRlciBvZiBvcGVucyBhbmQgY2xvc2VzIG1heSBub3QgYmUgcHJlc2VydmVkIGFjcm9zcyBzaGFyZWQKKyAqCW1lbW9yeSwgc28gd2UgbXVzdCB3YWl0IHVudGlsIGl0IGlzIGNvbXBsZXRlLgorICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworLyoKKyAqCUV2ZXJ5dGhpbmcgaXMgcmVhZHkgbm93LCBzbyB3cml0ZSB0aGUgb3BlbiBtZXNzYWdlIGludG8gc2hhcmVkCisgKgltZW1vcnkuIE9uY2UgdGhlIG1lc3NhZ2UgaXMgaW4gc2V0IHRoZSBzZXJ2aWNlIGJpdHMgdG8gc2F5IHRoYXQKKyAqCXRoaXMgcG9ydCB3YW50cyBzZXJ2aWNlLgorICovCisJRUJSREVOQUJMRShicmRwKTsKKwljcCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+Y3RybDsKKwljcC0+b3BlbmFyZyA9IGFyZzsKKwljcC0+b3BlbiA9IDE7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlFQlJERElTQUJMRShicmRwKTsKKworCWlmICh3YWl0ID09IDApIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybigwKTsKKwl9CisKKy8qCisgKglTbGF2ZSBpcyBpbiBhY3Rpb24sIHNvIG5vdyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSBvcGVuIGFja25vd2xlZGdtZW50CisgKgl0byBjb21lIGJhY2suCisgKi8KKwlyYyA9IDA7CisJc2V0X2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX09QRU5JTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJjID0gLUVSRVNUQVJUU1lTOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKChyYyA9PSAwKSAmJiAocG9ydHAtPnJjICE9IDApKQorCQlyYyA9IC1FSU87CisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIHNsYXZlLiBOb3JtYWxseSB0aGlzIHdpbGwgc2xlZXAgd2FpdGluZworICoJZm9yIHRoZSBhY2tub3dsZWRnZW1lbnQsIGJ1dCBpZiB3YWl0IHBhcmFtZXRlciBpcyAwIGl0IHdpbGwgbm90LiBJZgorICoJd2FpdCBpcyB0cnVlIHRoZW4gbXVzdCBoYXZlIHVzZXIgY29udGV4dCAodG8gc2xlZXApLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9yYXdjbG9zZShzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHdhaXQpCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJdm9sYXRpbGUgY2RrY3RybF90CSpjcDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpiaXRzOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfcmF3Y2xvc2UoYnJkcD0leCxwb3J0cD0leCxhcmc9JXgsd2FpdD0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBhcmcsIHdhaXQpOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworLyoKKyAqCVNsYXZlIGlzIGFscmVhZHkgY2xvc2luZyB0aGlzIHBvcnQuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGhhbmd1cAorICoJb2NjdXJzIG9uIHRoaXMgcG9ydC4KKyAqLworCWlmICh3YWl0KSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwb3J0cC0+cmF3X3dhaXQsCisJCQkJIXRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwl9CisKKy8qCisgKglXcml0ZSB0aGUgY2xvc2UgY29tbWFuZCBpbnRvIHNoYXJlZCBtZW1vcnkuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCWNwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5jdHJsOworCWNwLT5jbG9zZWFyZyA9IGFyZzsKKwljcC0+Y2xvc2UgPSAxOworCWhkcnAgPSAodm9sYXRpbGUgY2RraGRyX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfQ0RLQUREUik7CisJYml0cyA9ICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBoZHJwKSArIGJyZHAtPnNsYXZlb2Zmc2V0ICsKKwkJcG9ydHAtPnBvcnRpZHg7CisJKmJpdHMgfD0gcG9ydHAtPnBvcnRiaXQ7CisJRUJSRERJU0FCTEUoYnJkcCk7CisKKwlzZXRfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpOworCWlmICh3YWl0ID09IDApIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybigwKTsKKwl9CisKKy8qCisgKglTbGF2ZSBpcyBpbiBhY3Rpb24sIHNvIG5vdyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSBvcGVuIGFja25vd2xlZGdtZW50CisgKgl0byBjb21lIGJhY2suCisgKi8KKwlyYyA9IDA7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWlmICgocmMgPT0gMCkgJiYgKHBvcnRwLT5yYyAhPSAwKSkKKwkJcmMgPSAtRUlPOworCXJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNlbmQgYSBjb21tYW5kIHRvIHRoZSBzbGF2ZSBhbmQgd2FpdCBmb3IgdGhlIHJlc3BvbnNlLiBUaGlzIG11c3QKKyAqCWhhdmUgdXNlciBjb250ZXh0IChpdCBzbGVlcHMpLiBUaGlzIHJvdXRpbmUgaXMgZ2VuZXJpYyBpbiB0aGF0IGl0CisgKgljYW4gc2VuZCBhbnkgdHlwZSBvZiBjb21tYW5kLiBJdHMgcHVycG9zZSBpcyB0byB3YWl0IGZvciB0aGF0IGNvbW1hbmQKKyAqCXRvIGNvbXBsZXRlIChhcyBvcHBvc2VkIHRvIGluaXRpYXRpbmcgdGhlIGNvbW1hbmQgdGhlbiByZXR1cm5pbmcpLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9jbWR3YWl0KHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2NtZHdhaXQoYnJkcD0leCxwb3J0cD0leCxjbWQ9JXgsYXJnPSV4LHNpemU9JWQsIgorCQkiY29weWJhY2s9JWQpXG4iLCAoaW50KSBicmRwLCAoaW50KSBwb3J0cCwgKGludCkgY21kLAorCQkoaW50KSBhcmcsIHNpemUsIGNvcHliYWNrKTsKKyNlbmRpZgorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJc3RsaV9zZW5kY21kKGJyZHAsIHBvcnRwLCBjbWQsIGFyZywgc2l6ZSwgY29weWJhY2spOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKHBvcnRwLT5yYyAhPSAwKQorCQlyZXR1cm4oLUVJTyk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZW5kIHRoZSB0ZXJtaW9zIHNldHRpbmdzIGZvciB0aGlzIHBvcnQgdG8gdGhlIHNsYXZlLiBUaGlzIHNsZWVwcworICoJd2FpdGluZyBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgLSBzbyBtdXN0IGhhdmUgdXNlciBjb250ZXh0LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9zZXRwb3J0KHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlhc3lwb3J0X3QJYXBvcnQ7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9zZXRwb3J0KHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChwb3J0cC0+dHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSAmJiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKworCXN0bGlfbWthc3lwb3J0KHBvcnRwLCAmYXBvcnQsIHBvcnRwLT50dHktPnRlcm1pb3MpOworCXJldHVybihzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUUE9SVCwgJmFwb3J0LCBzaXplb2YoYXN5cG9ydF90KSwgMCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQb3NzaWJseSBuZWVkIHRvIHdhaXQgZm9yIGNhcnJpZXIgKERDRCBzaWduYWwpIHRvIGNvbWUgaGlnaC4gU2F5CisgKgltYXliZSBiZWNhdXNlIGlmIHdlIGFyZSBjbG9jYWwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHdhaXQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfd2FpdGNhcnJpZXIoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXJjLCBkb2Nsb2NhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3dhaXRjYXJyaWVyKGJyZHA9JXgscG9ydHA9JXgsZmlscD0leClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBmaWxwKTsKKyNlbmRpZgorCisJcmMgPSAwOworCWRvY2xvY2FsID0gMDsKKworCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb2Nsb2NhbCsrOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJcG9ydHAtPm9wZW53YWl0Y250Kys7CisJaWYgKCEgdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydHAtPnJlZmNvdW50LS07CisKKwlmb3IgKDs7KSB7CisJCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMSwgMSk7CisJCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywKKwkJICAgICZwb3J0cC0+YXNpZywgc2l6ZW9mKGFzeXNpZ3NfdCksIDApKSA8IDApCisJCQlicmVhazsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICgocG9ydHAtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApKSB7CisJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyYyA9IC1FQlVTWTsKKwkJCWVsc2UKKwkJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpID09IDApICYmCisJCSAgICAoZG9jbG9jYWwgfHwgKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnRwLT5vcGVuX3dhaXQpOworCX0KKworCWlmICghIHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXBvcnRwLT5yZWZjb3VudCsrOworCXBvcnRwLT5vcGVud2FpdGNudC0tOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJV3JpdGUgcm91dGluZS4gVGFrZSB0aGUgZGF0YSBhbmQgcHV0IGl0IGluIHRoZSBzaGFyZWQgbWVtb3J5IHJpbmcKKyAqCXF1ZXVlLiBJZiBwb3J0IGlzIG5vdCBhbHJlYWR5IHNlbmRpbmcgY2hhcnMgdGhlbiBuZWVkIHRvIG1hcmsgdGhlCisgKglzZXJ2aWNlIGJpdHMgZm9yIHRoaXMgcG9ydC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJdm9sYXRpbGUgY2RrYXN5X3QJKmFwOworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdW5zaWduZWQgY2hhcgkJKnNoYnVmLCAqY2hidWY7CisJc3RsaXBvcnRfdAkJKnBvcnRwOworCXN0bGlicmRfdAkJKmJyZHA7CisJdW5zaWduZWQgaW50CQlsZW4sIHN0bGVuLCBoZWFkLCB0YWlsLCBzaXplOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfd3JpdGUodHR5PSV4LGJ1Zj0leCxjb3VudD0lZClcbiIsCisJCShpbnQpIHR0eSwgKGludCkgYnVmLCBjb3VudCk7CisjZW5kaWYKKworCWlmICgodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB8fAorCSAgICAoc3RsaV90bXB3cml0ZWJ1ZiA9PSAoY2hhciAqKSBOVUxMKSkKKwkJcmV0dXJuKDApOworCWlmICh0dHkgPT0gc3RsaV90eGNvb2t0dHkpCisJCXN0bGlfZmx1c2hjaGFycyh0dHkpOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJY2hidWYgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CisKKy8qCisgKglBbGwgZGF0YSBpcyBub3cgbG9jYWwsIHNob3ZlIGFzIG11Y2ggYXMgcG9zc2libGUgaW50byBzaGFyZWQgbWVtb3J5LgorICovCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgYXAtPnR4cS5oZWFkOworCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJaWYgKHRhaWwgIT0gKCh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJc2l6ZSA9IHBvcnRwLT50eHNpemU7CisJaWYgKGhlYWQgPj0gdGFpbCkgeworCQlsZW4gPSBzaXplIC0gKGhlYWQgLSB0YWlsKSAtIDE7CisJCXN0bGVuID0gc2l6ZSAtIGhlYWQ7CisJfSBlbHNlIHsKKwkJbGVuID0gdGFpbCAtIGhlYWQgLSAxOworCQlzdGxlbiA9IGxlbjsKKwl9CisKKwlsZW4gPSBNSU4obGVuLCBjb3VudCk7CisJY291bnQgPSAwOworCXNoYnVmID0gKGNoYXIgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+dHhvZmZzZXQpOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RsZW4gPSBNSU4obGVuLCBzdGxlbik7CisJCW1lbWNweSgoc2hidWYgKyBoZWFkKSwgY2hidWYsIHN0bGVuKTsKKwkJY2hidWYgKz0gc3RsZW47CisJCWxlbiAtPSBzdGxlbjsKKwkJY291bnQgKz0gc3RsZW47CisJCWhlYWQgKz0gc3RsZW47CisJCWlmIChoZWFkID49IHNpemUpIHsKKwkJCWhlYWQgPSAwOworCQkJc3RsZW4gPSB0YWlsOworCQl9CisJfQorCisJYXAgPSAodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcik7CisJYXAtPnR4cS5oZWFkID0gaGVhZDsKKwlpZiAodGVzdF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAoYXAtPmNoYW5nZWQuZGF0YSAmIERUX1RYRU1QVFkpCisJCQlhcC0+Y2hhbmdlZC5kYXRhICY9IH5EVF9UWEVNUFRZOworCX0KKwloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCWJpdHMgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5zbGF2ZW9mZnNldCArCisJCXBvcnRwLT5wb3J0aWR4OworCSpiaXRzIHw9IHBvcnRwLT5wb3J0Yml0OworCXNldF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKwlFQlJERElTQUJMRShicmRwKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKGNvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJT3V0cHV0IGEgc2luZ2xlIGNoYXJhY3Rlci4gV2UgcHV0IGl0IGludG8gYSB0ZW1wb3JhcnkgbG9jYWwgYnVmZmVyCisgKgkoZm9yIHNwZWVkKSB0aGVuIHdyaXRlIG91dCB0aGF0IGJ1ZmZlciB3aGVuIHRoZSBmbHVzaGNoYXJzIHJvdXRpbmUKKyAqCWlzIGNhbGxlZC4gVGhlcmUgaXMgYSBzYWZldHkgY2F0Y2ggaGVyZSBzbyB0aGF0IGlmIHNvbWUgb3RoZXIgcG9ydAorICoJd3JpdGVzIGNoYXJzIGJlZm9yZSB0aGUgY3VycmVudCBidWZmZXIgaGFzIGJlZW4sIHRoZW4gd2Ugd3JpdGUgdGhlbQorICoJZmlyc3QgdGhlbSBkbyB0aGUgbmV3IHBvcnRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3B1dGNoYXIodHR5PSV4LGNoPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBjaCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAodHR5ICE9IHN0bGlfdHhjb29rdHR5KSB7CisJCWlmIChzdGxpX3R4Y29va3R0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJCXN0bGlfZmx1c2hjaGFycyhzdGxpX3R4Y29va3R0eSk7CisJCXN0bGlfdHhjb29rdHR5ID0gdHR5OworCX0KKworCXN0bGlfdHhjb29rYnVmW3N0bGlfdHhjb29rc2l6ZSsrXSA9IGNoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcmFuc2ZlciBjaGFyYWN0ZXJzIGZyb20gdGhlIGxvY2FsIFRYIGNvb2tpbmcgYnVmZmVyIHRvIHRoZSBib2FyZC4KKyAqCVdlIHNvcnQgb2YgaWdub3JlIHRoZSB0dHkgdGhhdCBnZXRzIHBhc3NlZCBpbiBoZXJlLiBXZSByZWx5IG9uIHRoZQorICoJaW5mbyBzdG9yZWQgd2l0aCB0aGUgVFggY29vayBidWZmZXIgdG8gdGVsbCB1cyB3aGljaCBwb3J0IHRvIGZsdXNoCisgKgl0aGUgZGF0YSBvbi4gSW4gYW55IGNhc2Ugd2UgY2xlYW4gb3V0IHRoZSBUWCBjb29rIGJ1ZmZlciwgZm9yIHJlLXVzZQorICoJYnkgc29tZW9uZSBlbHNlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZmx1c2hjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdm9sYXRpbGUgY2RrYXN5X3QJKmFwOworCXN0cnVjdCB0dHlfc3RydWN0CSpjb29rdHR5OworCXN0bGlwb3J0X3QJCSpwb3J0cDsKKwlzdGxpYnJkX3QJCSpicmRwOworCXVuc2lnbmVkIGludAkJbGVuLCBzdGxlbiwgaGVhZCwgdGFpbCwgc2l6ZSwgY291bnQsIGNvb2tzaXplOworCXVuc2lnbmVkIGNoYXIJCSpidWYsICpzaGJ1ZjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2ZsdXNoY2hhcnModHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJY29va3NpemUgPSBzdGxpX3R4Y29va3NpemU7CisJY29va3R0eSA9IHN0bGlfdHhjb29rdHR5OworCXN0bGlfdHhjb29rc2l6ZSA9IDA7CisJc3RsaV90eGNvb2tyZWFsc2l6ZSA9IDA7CisJc3RsaV90eGNvb2t0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTDsKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoY29va3R0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICh0dHkgIT0gY29va3R0eSkKKwkJdHR5ID0gY29va3R0eTsKKwlpZiAoY29va3NpemUgPT0gMCkKKwkJcmV0dXJuOworCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgYXAtPnR4cS5oZWFkOworCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJaWYgKHRhaWwgIT0gKCh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJc2l6ZSA9IHBvcnRwLT50eHNpemU7CisJaWYgKGhlYWQgPj0gdGFpbCkgeworCQlsZW4gPSBzaXplIC0gKGhlYWQgLSB0YWlsKSAtIDE7CisJCXN0bGVuID0gc2l6ZSAtIGhlYWQ7CisJfSBlbHNlIHsKKwkJbGVuID0gdGFpbCAtIGhlYWQgLSAxOworCQlzdGxlbiA9IGxlbjsKKwl9CisKKwlsZW4gPSBNSU4obGVuLCBjb29rc2l6ZSk7CisJY291bnQgPSAwOworCXNoYnVmID0gKGNoYXIgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+dHhvZmZzZXQpOworCWJ1ZiA9IHN0bGlfdHhjb29rYnVmOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RsZW4gPSBNSU4obGVuLCBzdGxlbik7CisJCW1lbWNweSgoc2hidWYgKyBoZWFkKSwgYnVmLCBzdGxlbik7CisJCWJ1ZiArPSBzdGxlbjsKKwkJbGVuIC09IHN0bGVuOworCQljb3VudCArPSBzdGxlbjsKKwkJaGVhZCArPSBzdGxlbjsKKwkJaWYgKGhlYWQgPj0gc2l6ZSkgeworCQkJaGVhZCA9IDA7CisJCQlzdGxlbiA9IHRhaWw7CisJCX0KKwl9CisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwlhcC0+dHhxLmhlYWQgPSBoZWFkOworCisJaWYgKHRlc3RfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJaWYgKGFwLT5jaGFuZ2VkLmRhdGEgJiBEVF9UWEVNUFRZKQorCQkJYXAtPmNoYW5nZWQuZGF0YSAmPSB+RFRfVFhFTVBUWTsKKwl9CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlzZXRfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bGlfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdm9sYXRpbGUgY2RrYXN5cnFfdAkqcnA7CisJc3RsaXBvcnRfdAkJKnBvcnRwOworCXN0bGlicmRfdAkJKmJyZHA7CisJdW5zaWduZWQgaW50CQloZWFkLCB0YWlsLCBsZW47CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV93cml0ZXJvb20odHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICh0dHkgPT0gc3RsaV90eGNvb2t0dHkpIHsKKwkJaWYgKHN0bGlfdHhjb29rcmVhbHNpemUgIT0gMCkgeworCQkJbGVuID0gc3RsaV90eGNvb2tyZWFsc2l6ZSAtIHN0bGlfdHhjb29rc2l6ZTsKKwkJCXJldHVybihsZW4pOworCQl9CisJfQorCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJcnAgPSAmKCh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKSktPnR4cTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgcnAtPmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIHJwLT50YWlsOworCWlmICh0YWlsICE9ICgodW5zaWduZWQgaW50KSBycC0+dGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBycC0+dGFpbDsKKwlsZW4gPSAoaGVhZCA+PSB0YWlsKSA/IChwb3J0cC0+dHhzaXplIC0gKGhlYWQgLSB0YWlsKSkgOiAodGFpbCAtIGhlYWQpOworCWxlbi0tOworCUVCUkRESVNBQkxFKGJyZHApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkgeworCQlzdGxpX3R4Y29va3JlYWxzaXplID0gbGVuOworCQlsZW4gLT0gc3RsaV90eGNvb2tzaXplOworCX0KKwlyZXR1cm4obGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgdHJhbnNtaXQgYnVmZmVyLiBOb3JtYWxseSB3ZQorICoJd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgc2hhcmVkIG1lbW9yeSByaW5nIHF1ZXVlLgorICoJV2UgbmVlZCB0byBrbHVkZ2UgYXJvdW5kIHRoZSBjYXNlIHdoZXJlIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBpcworICoJZW1wdHkgYnV0IG5vdCBhbGwgY2hhcmFjdGVycyBoYXZlIGRyYWluZWQgeWV0LCBmb3IgdGhpcyBjYXNlIGp1c3QKKyAqCXJldHVybiB0aGF0IHRoZXJlIGlzIDEgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIhCisgKi8KKworc3RhdGljIGludCBzdGxpX2NoYXJzaW5idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl2b2xhdGlsZSBjZGthc3lycV90CSpycDsKKwlzdGxpcG9ydF90CQkqcG9ydHA7CisJc3RsaWJyZF90CQkqYnJkcDsKKwl1bnNpZ25lZCBpbnQJCWhlYWQsIHRhaWwsIGxlbjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2NoYXJzaW5idWZmZXIodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICh0dHkgPT0gc3RsaV90eGNvb2t0dHkpCisJCXN0bGlfZmx1c2hjaGFycyh0dHkpOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlFQlJERU5BQkxFKGJyZHApOworCXJwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT50eHE7CisJaGVhZCA9ICh1bnNpZ25lZCBpbnQpIHJwLT5oZWFkOworCXRhaWwgPSAodW5zaWduZWQgaW50KSBycC0+dGFpbDsKKwlpZiAodGFpbCAhPSAoKHVuc2lnbmVkIGludCkgcnAtPnRhaWwpKQorCQl0YWlsID0gKHVuc2lnbmVkIGludCkgcnAtPnRhaWw7CisJbGVuID0gKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDogKHBvcnRwLT50eHNpemUgLSAodGFpbCAtIGhlYWQpKTsKKwlpZiAoKGxlbiA9PSAwKSAmJiB0ZXN0X2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpKQorCQlsZW4gPSAxOworCUVCUkRESVNBQkxFKGJyZHApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKGxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUdlbmVyYXRlIHRoZSBzZXJpYWwgc3RydWN0IGluZm8uCisgKi8KKworc3RhdGljIGludCBzdGxpX2dldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdAlzaW87CisJc3RsaWJyZF90CQkqYnJkcDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2dldHNlcmlhbChwb3J0cD0leCxzcD0leClcbiIsIChpbnQpIHBvcnRwLCAoaW50KSBzcCk7CisjZW5kaWYKKworCW1lbXNldCgmc2lvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKTsKKwlzaW8udHlwZSA9IFBPUlRfVU5LTk9XTjsKKwlzaW8ubGluZSA9IHBvcnRwLT5wb3J0bnI7CisJc2lvLmlycSA9IDA7CisJc2lvLmZsYWdzID0gcG9ydHAtPmZsYWdzOworCXNpby5iYXVkX2Jhc2UgPSBwb3J0cC0+YmF1ZF9iYXNlOworCXNpby5jbG9zZV9kZWxheSA9IHBvcnRwLT5jbG9zZV9kZWxheTsKKwlzaW8uY2xvc2luZ193YWl0ID0gcG9ydHAtPmNsb3Npbmdfd2FpdDsKKwlzaW8uY3VzdG9tX2Rpdmlzb3IgPSBwb3J0cC0+Y3VzdG9tX2Rpdmlzb3I7CisJc2lvLnhtaXRfZmlmb19zaXplID0gMDsKKwlzaW8uaHViNiA9IDA7CisKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgIT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlzaW8ucG9ydCA9IGJyZHAtPmlvYmFzZTsKKwkJCisJcmV0dXJuIGNvcHlfdG9fdXNlcihzcCwgJnNpbywgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkgPworCQkJLUVGQVVMVCA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNldCBwb3J0IGFjY29yZGluZyB0byB0aGUgc2VyaWFsIHN0cnVjdCBpbmZvLgorICoJQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgZG8gYW55IGF1dG8tY29uZmlndXJlIHN0dWZmLCBzbyB3ZSB3aWxsCisgKglqdXN0IHF1aWV0bHkgaWdub3JlIGFueSByZXF1ZXN0cyB0byBjaGFuZ2UgaXJxLCBldGMuCisgKi8KKworc3RhdGljIGludCBzdGxpX3NldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdAlzaW87CisJaW50CQkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9zZXRzZXJpYWwocG9ydHA9JXAsc3A9JXApXG4iLCBwb3J0cCwgc3ApOworI2VuZGlmCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNpbywgc3AsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChzaW8uYmF1ZF9iYXNlICE9IHBvcnRwLT5iYXVkX2Jhc2UpIHx8CisJCSAgICAoc2lvLmNsb3NlX2RlbGF5ICE9IHBvcnRwLT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICgoc2lvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgKHBvcnRwLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuKC1FUEVSTSk7CisJfSAKKworCXBvcnRwLT5mbGFncyA9IChwb3J0cC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJKHNpby5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKTsKKwlwb3J0cC0+YmF1ZF9iYXNlID0gc2lvLmJhdWRfYmFzZTsKKwlwb3J0cC0+Y2xvc2VfZGVsYXkgPSBzaW8uY2xvc2VfZGVsYXk7CisJcG9ydHAtPmNsb3Npbmdfd2FpdCA9IHNpby5jbG9zaW5nX3dhaXQ7CisJcG9ydHAtPmN1c3RvbV9kaXZpc29yID0gc2lvLmN1c3RvbV9kaXZpc29yOworCisJaWYgKChyYyA9IHN0bGlfc2V0cG9ydChwb3J0cCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdGxpX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0bGlwb3J0X3QgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdGxpYnJkX3QgKmJyZHA7CisJaW50IHJjOworCisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm4oMCk7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuKC1FSU8pOworCisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9HRVRTSUdOQUxTLAorCQkJICAgICAgICZwb3J0cC0+YXNpZywgc2l6ZW9mKGFzeXNpZ3NfdCksIDEpKSA8IDApCisJCXJldHVybihyYyk7CisKKwlyZXR1cm4gc3RsaV9ta3Rpb2NtKHBvcnRwLT5hc2lnLnNpZ3ZhbHVlKTsKK30KKworc3RhdGljIGludCBzdGxpX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdGxpcG9ydF90ICpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RsaWJyZF90ICpicmRwOworCWludCBydHMgPSAtMSwgZHRyID0gLTE7CisKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4oLUVJTyk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlydHMgPSAxOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDE7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlydHMgPSAwOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJZHRyID0gMDsKKworCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgZHRyLCBydHMpOworCisJcmV0dXJuIHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJCQkgICAgc2l6ZW9mKGFzeXNpZ3NfdCksIDApOworfQorCitzdGF0aWMgaW50IHN0bGlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwl1bnNpZ25lZCBpbnQJaXZhbDsKKwlpbnQJCXJjOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfaW9jdGwodHR5PSV4LGZpbGU9JXgsY21kPSV4LGFyZz0leClcbiIsCisJCShpbnQpIHR0eSwgKGludCkgZmlsZSwgY21kLCAoaW50KSBhcmcpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorIAkgICAgKGNtZCAhPSBDT01fR0VUUE9SVFNUQVRTKSAmJiAoY21kICE9IENPTV9DTFJQT1JUU1RBVFMpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJCXJldHVybigtRUlPKTsKKwl9CisKKwlyYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyYyA9IHB1dF91c2VyKCgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSA/IDEgOiAwKSwKKwkJCSh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCWlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgX191c2VyICopIGFyZykpID09IDApCisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJKGl2YWwgPyBDTE9DQUwgOiAwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmMgPSBzdGxpX2dldHNlcmlhbChwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJjID0gc3RsaV9zZXRzZXJpYWwocG9ydHAsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFNUTF9HRVRQRkxBRzoKKwkJcmMgPSBwdXRfdXNlcihwb3J0cC0+cGZsYWcsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBTVExfU0VUUEZMQUc6CisJCWlmICgocmMgPSBnZXRfdXNlcihwb3J0cC0+cGZsYWcsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKSkgPT0gMCkKKwkJCXN0bGlfc2V0cG9ydChwb3J0cCk7CisJCWJyZWFrOworCWNhc2UgQ09NX0dFVFBPUlRTVEFUUzoKKwkJcmMgPSBzdGxpX2dldHBvcnRzdGF0cyhwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKKwkJcmMgPSBzdGxpX2NscnBvcnRzdGF0cyhwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NFUkNPTkZJRzoKKwljYXNlIFRJT0NTRVJHV0lMRDoKKwljYXNlIFRJT0NTRVJTV0lMRDoKKwljYXNlIFRJT0NTRVJHRVRMU1I6CisJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwljYXNlIFRJT0NTRVJHRVRNVUxUSToKKwljYXNlIFRJT0NTRVJTRVRNVUxUSToKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB3ZSBoYXZlIHVzZXIgY29udGV4dCBhbmQgY2FuIHNsZWVwLgorICoJTG9va3MgbGlrZSBpdCBpcyB0cnVlIGZvciB0aGUgY3VycmVudCB0dHlzIGltcGxlbWVudGF0aW9uLi4hIQorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwlzdHJ1Y3QgdGVybWlvcwkqdGlvc3A7CisJYXN5cG9ydF90CWFwb3J0OworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfc2V0dGVybWlvcyh0dHk9JXgsb2xkPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBvbGQpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXRpb3NwID0gdHR5LT50ZXJtaW9zOworCWlmICgodGlvc3AtPmNfY2ZsYWcgPT0gb2xkLT5jX2NmbGFnKSAmJgorCSAgICAodGlvc3AtPmNfaWZsYWcgPT0gb2xkLT5jX2lmbGFnKSkKKwkJcmV0dXJuOworCisJc3RsaV9ta2FzeXBvcnQocG9ydHAsICZhcG9ydCwgdGlvc3ApOworCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRQT1JULCAmYXBvcnQsIHNpemVvZihhc3lwb3J0X3QpLCAwKTsKKwlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPyAxIDogMCksIC0xKTsKKwlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAorCQlzaXplb2YoYXN5c2lnc190KSwgMCk7CisJaWYgKChvbGQtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAoKHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMCkpCisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJaWYgKCgob2xkLT5jX2NmbGFnICYgQ0xPQ0FMKSA9PSAwKSAmJiAodGlvc3AtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5vcGVuX3dhaXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBdHRlbXB0IHRvIGZsb3cgY29udHJvbCB3aG8gZXZlciBpcyBzZW5kaW5nIHVzIGRhdGEuIFdlIHdvbid0IHJlYWxseQorICoJZG8gYW55IGZsb3cgY29udHJvbCBhY3Rpb24gaGVyZS4gV2UgY2FuJ3QgZGlyZWN0bHksIGFuZCBldmVuIGlmIHdlCisgKgl3YW50ZWQgdG8gd2Ugd291bGQgaGF2ZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgc2xhdmUuIFRoZSBzbGF2ZQorICoJa25vd3MgaG93IHRvIGZsb3cgY29udHJvbCwgYW5kIHdpbGwgZG8gc28gd2hlbiBpdHMgYnVmZmVycyByZWFjaCBpdHMKKyAqCWludGVybmFsIGhpZ2ggd2F0ZXIgbWFya3MuIFNvIHdoYXQgd2Ugd2lsbCBkbyBpcyBzZXQgYSBsb2NhbCBzdGF0ZQorICoJYml0IHRoYXQgd2lsbCBzdG9wIHVzIHNlbmRpbmcgYW55IFJYIGRhdGEgdXAgZnJvbSB0aGUgcG9sbCByb3V0aW5lCisgKgkod2hpY2ggaXMgdGhlIHBsYWNlIHdoZXJlIFJYIGRhdGEgZnJvbSB0aGUgc2xhdmUgaXMgaGFuZGxlZCkuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfdGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2V0X2JpdChTVF9SWFNUT1AsICZwb3J0cC0+c3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglVbmZsb3cgY29udHJvbCB0aGUgZGV2aWNlIHNlbmRpbmcgdXMgZGF0YS4uLiBUaGF0IG1lYW5zIHRoYXQgYWxsCisgKgl3ZSBoYXZlIHRvIGRvIGlzIGNsZWFyIHRoZSBSWFNUT1Agc3RhdGUgYml0LiBUaGUgbmV4dCBwb2xsIGNhbGwKKyAqCXdpbGwgdGhlbiBiZSBhYmxlIHRvIHBhc3MgdGhlIFJYIGRhdGEgYmFjayB1cC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3VudGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVN0b3AgdGhlIHRyYW5zbWl0dGVyLiBCYXNpY2FsbHkgdG8gZG8gdGhpcyB3ZSB3aWxsIGp1c3QgdHVybiBUWAorICoJaW50ZXJydXB0cyBvZmYuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCWFzeWN0cmxfdAlhY3RybDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3N0b3AodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFjdHJsLCAwLCBzaXplb2YoYXN5Y3RybF90KSk7CisJYWN0cmwudHhjdHJsID0gQ1RfU1RPUEZMT1c7CisjaWYgMAorCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9QT1JUQ1RSTCwgJmFjdHJsLCBzaXplb2YoYXN5Y3RybF90KSwgMCk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RhcnQgdGhlIHRyYW5zbWl0dGVyIGFnYWluLiBKdXN0IHR1cm4gVFggaW50ZXJydXB0cyBiYWNrIG9uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdGxpYnJkX3QJKmJyZHA7CisJYXN5Y3RybF90CWFjdHJsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfc3RhcnQodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFjdHJsLCAwLCBzaXplb2YoYXN5Y3RybF90KSk7CisJYWN0cmwudHhjdHJsID0gQ1RfU1RBUlRGTE9XOworI2lmIDAKKwlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfUE9SVENUUkwsICZhY3RybCwgc2l6ZW9mKGFzeWN0cmxfdCksIDApOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNjaGVkdWxlciBjYWxsZWQgaGFuZyB1cCByb3V0aW5lLiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBzY2hlZHVsZXIsCisgKglub3QgZGlyZWN0IGZyb20gdGhlIGRyaXZlciAicG9sbCIgcm91dGluZS4gV2UgY2FuJ3QgY2FsbCBpdCB0aGVyZQorICoJc2luY2UgdGhlIHJlYWwgbG9jYWwgaGFuZ3VwIGNvZGUgd2lsbCBlbmFibGUvZGlzYWJsZSB0aGUgYm9hcmQgYW5kCisgKglvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4ndCBkbyB3aGlsZSBoYW5kbGluZyB0aGUgcG9sbC4gTXVjaCBlYXNpZXIKKyAqCXRvIGRlYWwgd2l0aCBpdCBzb21lIHRpbWUgbGF0ZXIgKGRvbid0IHJlYWxseSBjYXJlIHdoZW4sIGhhbmd1cHMKKyAqCWFyZW4ndCB0aGF0IHRpbWUgY3JpdGljYWwpLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZG9oYW5ndXAodm9pZCAqYXJnKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9kb2hhbmd1cChwb3J0cD0leClcbiIsIChpbnQpIGFyZyk7CisjZW5kaWYKKworCS8qCisJICogRklYTUU6IFRoZXJlJ3MgYSBtb2R1bGUgcmVtb3ZhbCByYWNlIGhlcmU6IHR0eV9oYW5ndXAKKwkgKiBjYWxscyBzY2hlZHVsZV93b3JrIHdoaWNoIHdpbGwgY2FsbCBpbnRvIHRoaXMKKwkgKiBkcml2ZXIgbGF0ZXIuCisJICovCisJcG9ydHAgPSAoc3RsaXBvcnRfdCAqKSBhcmc7CisJaWYgKHBvcnRwICE9IChzdGxpcG9ydF90ICopIE5VTEwpIHsKKwkJaWYgKHBvcnRwLT50dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJCXR0eV9oYW5ndXAocG9ydHAtPnR0eSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUhhbmd1cCB0aGlzIHBvcnQuIFRoaXMgaXMgcHJldHR5IG11Y2ggbGlrZSBjbG9zaW5nIHRoZSBwb3J0LCBvbmx5CisgKglhIGxpdHRsZSBtb3JlIGJydXRhbC4gTm8gd2FpdGluZyBmb3IgZGF0YSB0byBkcmFpbi4gU2h1dGRvd24gdGhlCisgKglwb3J0IGFuZCBtYXliZSBkcm9wIHNpZ25hbHMuIFRoaXMgaXMgcmF0aGVyIHRyaWNreSByZWFsbHkuIFdlIHdhbnQKKyAqCXRvIGNsb3NlIHRoZSBwb3J0IGFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdGxpYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaGFuZ3VwKHR0eT0leClcbiIsIChpbnQpIHR0eSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm47CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmICghIHRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpKQorCQlzdGxpX3Jhd2Nsb3NlKGJyZHAsIHBvcnRwLCAwLCAwKTsKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKwkJc3RsaV9ta2FzeXNpZ3MoJnBvcnRwLT5hc2lnLCAwLCAwKTsKKwkJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJCXNldF9iaXQoU1RfRE9TSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXNldF9iaXQoU1RfRE9GTFVTSFRYLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXNldF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN0bGlfc2VuZGNtZChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTRiwKKwkJCQkmcG9ydHAtPmFzaWcsIHNpemVvZihhc3lzaWdzX3QpLCAwKTsKKwkJfQorCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWNsZWFyX2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpOworCWNsZWFyX2JpdChTVF9SWFNUT1AsICZwb3J0cC0+c3RhdGUpOworCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJcG9ydHAtPnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCXBvcnRwLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlwb3J0cC0+cmVmY291bnQgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZsdXNoIGNoYXJhY3RlcnMgZnJvbSB0aGUgbG93ZXIgYnVmZmVyLiBXZSBtYXkgbm90IGhhdmUgdXNlciBjb250ZXh0CisgKglzbyB3ZSBjYW5ub3Qgc2xlZXAgd2FpdGluZyBmb3IgaXQgdG8gY29tcGxldGUuIEFsc28gd2UgbmVlZCB0byBjaGVjaworICoJaWYgdGhlcmUgaXMgY2hhcnMgZm9yIHRoaXMgcG9ydCBpbiB0aGUgVFggY29vayBidWZmZXIsIGFuZCBmbHVzaCB0aGVtCisgKglhcyB3ZWxsLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdGxpYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgbG9uZwlmdHlwZSwgZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2ZsdXNoYnVmZmVyKHR0eT0leClcbiIsIChpbnQpIHR0eSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm47CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkgeworCQlzdGxpX3R4Y29va3R0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCQlzdGxpX3R4Y29va3NpemUgPSAwOworCQlzdGxpX3R4Y29va3JlYWxzaXplID0gMDsKKwl9CisJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJc2V0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpOworCX0gZWxzZSB7CisJCWZ0eXBlID0gRkxVU0hUWDsKKwkJaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJCWZ0eXBlIHw9IEZMVVNIUlg7CisJCQljbGVhcl9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwkJfQorCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfRkxVU0gsICZmdHlwZSwKKwkJCXNpemVvZih1bnNpZ25lZCBsb25nKSwgMCk7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCWlmICgodHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgorCSAgICB0dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwkJKHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKSh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfYnJlYWtjdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlsb25nCQlhcmc7CisJLyogbG9uZyBzYXZlc3RhdGUsIHNhdmV0aW1lOyAqLworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9icmVha2N0bCh0dHk9JXgsc3RhdGU9JWQpXG4iLCAoaW50KSB0dHksIHN0YXRlKTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKy8qCisgKglEdWUgdG8gYSBidWcgaW4gdGhlIHR0eSBzZW5kX2JyZWFrKCkgY29kZSB3ZSBuZWVkIHRvIHByZXNlcnZlCisgKgl0aGUgY3VycmVudCBwcm9jZXNzIHN0YXRlIGFuZCB0aW1lb3V0Li4uCisJc2F2ZXRpbWUgPSBjdXJyZW50LT50aW1lb3V0OworCXNhdmVzdGF0ZSA9IGN1cnJlbnQtPnN0YXRlOworICovCisKKwlhcmcgPSAoc3RhdGUgPT0gLTEpID8gQlJFQUtPTiA6IEJSRUFLT0ZGOworCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9CUkVBSywgJmFyZywgc2l6ZW9mKGxvbmcpLCAwKTsKKworLyoKKyAqCisJY3VycmVudC0+dGltZW91dCA9IHNhdmV0aW1lOworCWN1cnJlbnQtPnN0YXRlID0gc2F2ZXN0YXRlOworICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJdGVuZDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfd2FpdHVudGlsc2VudCh0dHk9JXgsdGltZW91dD0leClcbiIsIChpbnQpIHR0eSwgdGltZW91dCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCWlmICh0aW1lb3V0ID09IDApCisJCXRpbWVvdXQgPSBIWjsKKwl0ZW5kID0gamlmZmllcyArIHRpbWVvdXQ7CisKKwl3aGlsZSAodGVzdF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0ZW5kKSkKKwkJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX3NlbmR4Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlhc3ljdHJsX3QJYWN0cmw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3NlbmR4Y2hhcih0dHk9JXgsY2g9JXgpXG4iLCAoaW50KSB0dHksIGNoKTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFjdHJsLCAwLCBzaXplb2YoYXN5Y3RybF90KSk7CisJaWYgKGNoID09IFNUT1BfQ0hBUih0dHkpKSB7CisJCWFjdHJsLnJ4Y3RybCA9IENUX1NUT1BGTE9XOworCX0gZWxzZSBpZiAoY2ggPT0gU1RBUlRfQ0hBUih0dHkpKSB7CisJCWFjdHJsLnJ4Y3RybCA9IENUX1NUQVJURkxPVzsKKwl9IGVsc2UgeworCQlhY3RybC50eGN0cmwgPSBDVF9TRU5EQ0hSOworCQlhY3RybC50eGltZGNoID0gY2g7CisJfQorCisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1BPUlRDVFJMLCAmYWN0cmwsIHNpemVvZihhc3ljdHJsX3QpLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCU1BWExJTkUJCTgwCisKKy8qCisgKglGb3JtYXQgaW5mbyBmb3IgYSBzcGVjaWZpZWQgcG9ydC4gVGhlIGxpbmUgaXMgZGVsaWJlcmF0ZWx5IGxpbWl0ZWQKKyAqCXRvIDgwIGNoYXJhY3RlcnMuIChJZiBpdCBpcyB0b28gbG9uZyBpdCB3aWxsIGJlIHRydW5jYXRlZCwgaWYgdG9vCisgKglzaG9ydCB0aGVuIHBhZGRlZCB3aXRoIHNwYWNlcykuCisgKi8KKworc3RhdGljIGludCBzdGxpX3BvcnRpbmZvKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcykKK3sKKwljaGFyCSpzcCwgKnVhcnQ7CisJaW50CXJjLCBjbnQ7CisKKwlyYyA9IHN0bGlfcG9ydGNtZHN0YXRzKHBvcnRwKTsKKworCXVhcnQgPSAiVU5LTk9XTiI7CisJaWYgKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpIHsKKwkJc3dpdGNoIChzdGxpX2NvbXN0YXRzLmh3aWQpIHsKKwkJY2FzZSAwOgkJdWFydCA9ICIyNjgxIjsgYnJlYWs7CisJCWNhc2UgMToJCXVhcnQgPSAiU0MyNjE5OCI7IGJyZWFrOworCQlkZWZhdWx0Ogl1YXJ0ID0gIkNEMTQwMCI7IGJyZWFrOworCQl9CisJfQorCisJc3AgPSBwb3M7CisJc3AgKz0gc3ByaW50ZihzcCwgIiVkOiB1YXJ0OiVzICIsIHBvcnRuciwgdWFydCk7CisKKwlpZiAoKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpICYmIChyYyA+PSAwKSkgeworCQlzcCArPSBzcHJpbnRmKHNwLCAidHg6JWQgcng6JWQiLCAoaW50KSBzdGxpX2NvbXN0YXRzLnR4dG90YWwsCisJCQkoaW50KSBzdGxpX2NvbXN0YXRzLnJ4dG90YWwpOworCisJCWlmIChzdGxpX2NvbXN0YXRzLnJ4ZnJhbWluZykKKwkJCXNwICs9IHNwcmludGYoc3AsICIgZmU6JWQiLAorCQkJCShpbnQpIHN0bGlfY29tc3RhdHMucnhmcmFtaW5nKTsKKwkJaWYgKHN0bGlfY29tc3RhdHMucnhwYXJpdHkpCisJCQlzcCArPSBzcHJpbnRmKHNwLCAiIHBlOiVkIiwKKwkJCQkoaW50KSBzdGxpX2NvbXN0YXRzLnJ4cGFyaXR5KTsKKwkJaWYgKHN0bGlfY29tc3RhdHMucnhicmVha3MpCisJCQlzcCArPSBzcHJpbnRmKHNwLCAiIGJyazolZCIsCisJCQkJKGludCkgc3RsaV9jb21zdGF0cy5yeGJyZWFrcyk7CisJCWlmIChzdGxpX2NvbXN0YXRzLnJ4b3ZlcnJ1bikKKwkJCXNwICs9IHNwcmludGYoc3AsICIgb2U6JWQiLAorCQkJCShpbnQpIHN0bGlfY29tc3RhdHMucnhvdmVycnVuKTsKKworCQljbnQgPSBzcHJpbnRmKHNwLCAiJXMlcyVzJXMlcyAiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX1JUUykgPyAifFJUUyIgOiAiIiwKKwkJCShzdGxpX2NvbXN0YXRzLnNpZ25hbHMgJiBUSU9DTV9DVFMpID8gInxDVFMiIDogIiIsCisJCQkoc3RsaV9jb21zdGF0cy5zaWduYWxzICYgVElPQ01fRFRSKSA/ICJ8RFRSIiA6ICIiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX0NEKSA/ICJ8RENEIiA6ICIiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX0RTUikgPyAifERTUiIgOiAiIik7CisJCSpzcCA9ICcgJzsKKwkJc3AgKz0gY250OworCX0KKworCWZvciAoY250ID0gKHNwIC0gcG9zKTsgKGNudCA8IChNQVhMSU5FIC0gMSkpOyBjbnQrKykKKwkJKnNwKysgPSAnICc7CisJaWYgKGNudCA+PSBNQVhMSU5FKQorCQlwb3NbKE1BWExJTkUgLSAyKV0gPSAnKyc7CisJcG9zWyhNQVhMSU5FIC0gMSldID0gJ1xuJzsKKworCXJldHVybihNQVhMSU5FKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUG9ydCBpbmZvLCByZWFkIGZyb20gdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9yZWFkcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJaW50CQlicmRuciwgcG9ydG5yLCB0b3RhbHBvcnQ7CisJaW50CQljdXJvZmYsIG1heG9mZjsKKwljaGFyCQkqcG9zOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9yZWFkcHJvYyhwYWdlPSV4LHN0YXJ0PSV4LG9mZj0leCxjb3VudD0lZCxlb2Y9JXgsIgorCQkiZGF0YT0leFxuIiwgKGludCkgcGFnZSwgKGludCkgc3RhcnQsIChpbnQpIG9mZiwgY291bnQsCisJCShpbnQpIGVvZiwgKGludCkgZGF0YSk7CisjZW5kaWYKKworCXBvcyA9IHBhZ2U7CisJdG90YWxwb3J0ID0gMDsKKwljdXJvZmYgPSAwOworCisJaWYgKG9mZiA9PSAwKSB7CisJCXBvcyArPSBzcHJpbnRmKHBvcywgIiVzOiB2ZXJzaW9uICVzIiwgc3RsaV9kcnZ0aXRsZSwKKwkJCXN0bGlfZHJ2dmVyc2lvbik7CisJCXdoaWxlIChwb3MgPCAocGFnZSArIE1BWExJTkUgLSAxKSkKKwkJCSpwb3MrKyA9ICcgJzsKKwkJKnBvcysrID0gJ1xuJzsKKwl9CisJY3Vyb2ZmID0gIE1BWExJTkU7CisKKy8qCisgKglXZSBzY2FuIHRocm91Z2ggZm9yIGVhY2ggYm9hcmQsIHBhbmVsIGFuZCBwb3J0LiBUaGUgb2Zmc2V0IGlzCisgKgljYWxjdWxhdGVkIG9uIHRoZSBmbHksIGFuZCBpcnJlbGV2YW50IHBvcnRzIGFyZSBza2lwcGVkLgorICovCisJZm9yIChicmRuciA9IDA7IChicmRuciA8IHN0bGlfbnJicmRzKTsgYnJkbnIrKykgeworCQlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJY29udGludWU7CisJCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQkJY29udGludWU7CisKKwkJbWF4b2ZmID0gY3Vyb2ZmICsgKGJyZHAtPm5ycG9ydHMgKiBNQVhMSU5FKTsKKwkJaWYgKG9mZiA+PSBtYXhvZmYpIHsKKwkJCWN1cm9mZiA9IG1heG9mZjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdG90YWxwb3J0ID0gYnJkbnIgKiBTVExfTUFYUE9SVFM7CisJCWZvciAocG9ydG5yID0gMDsgKHBvcnRuciA8IGJyZHAtPm5ycG9ydHMpOyBwb3J0bnIrKywKKwkJICAgIHRvdGFscG9ydCsrKSB7CisJCQlwb3J0cCA9IGJyZHAtPnBvcnRzW3BvcnRucl07CisJCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChvZmYgPj0gKGN1cm9mZiArPSBNQVhMSU5FKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgocG9zIC0gcGFnZSArIE1BWExJTkUpID4gY291bnQpCisJCQkJZ290byBzdGxpX3JlYWRkb25lOworCQkJcG9zICs9IHN0bGlfcG9ydGluZm8oYnJkcCwgcG9ydHAsIHRvdGFscG9ydCwgcG9zKTsKKwkJfQorCX0KKworCSplb2YgPSAxOworCitzdGxpX3JlYWRkb25lOgorCSpzdGFydCA9IHBhZ2U7CisJcmV0dXJuKHBvcyAtIHBhZ2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglHZW5lcmljIHNlbmQgY29tbWFuZCByb3V0aW5lLiBUaGlzIHdpbGwgc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNsYXZlLAorICoJb2YgdGhlIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudC4gTXVzdCBiZSB2ZXJ5CisgKgljYXJlZnVsIG9mIGRhdGEgdGhhdCB3aWxsIGJlIGNvcGllZCBvdXQgZnJvbSBzaGFyZWQgbWVtb3J5IC0KKyAqCWNvbnRhaW5pbmcgY29tbWFuZCByZXN1bHRzLiBUaGUgY29tbWFuZCBjb21wbGV0aW9uIGlzIGFsbCBkb25lIGZyb20KKyAqCWEgcG9sbCByb3V0aW5lIHRoYXQgZG9lcyBub3QgaGF2ZSB1c2VyIGNvbnRleHQuIFRoZXJlZm9yZSB5b3UgY2Fubm90CisgKgljb3B5IGJhY2sgZGlyZWN0bHkgaW50byB1c2VyIHNwYWNlLCBvciB0byB0aGUga2VybmVsIHN0YWNrIG9mIGEKKyAqCXByb2Nlc3MuIFRoaXMgcm91dGluZSBkb2VzIG5vdCBzbGVlcCwgc28gY2FuIGJlIGNhbGxlZCBmcm9tIGFueXdoZXJlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc2VuZGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIGNka2N0cmxfdAkqY3A7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqYml0czsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfc2VuZGNtZChicmRwPSV4LHBvcnRwPSV4LGNtZD0leCxhcmc9JXgsc2l6ZT0lZCwiCisJCSJjb3B5YmFjaz0lZClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBjbWQsCisJCShpbnQpIGFyZywgc2l6ZSwgY29weWJhY2spOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGNvbW1hbmQgYWxyZWFkeSBidXN5LCBjbWQ9JXghXG4iLAorCQkJCShpbnQpIGNtZCk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJRUJSREVOQUJMRShicmRwKTsKKwljcCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+Y3RybDsKKwlpZiAoc2l6ZSA+IDApIHsKKwkJbWVtY3B5KCh2b2lkICopICYoY3AtPmFyZ3NbMF0pLCBhcmcsIHNpemUpOworCQlpZiAoY29weWJhY2spIHsKKwkJCXBvcnRwLT5hcmdwID0gYXJnOworCQkJcG9ydHAtPmFyZ3NpemUgPSBzaXplOworCQl9CisJfQorCWNwLT5zdGF0dXMgPSAwOworCWNwLT5jbWQgPSBjbWQ7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlzZXRfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSk7CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJlYWQgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBzaGFyZWQgbWVtb3J5CisgKglpcyBlbmFibGVkIGFuZCB0aGF0IGludGVycnVwdHMgYXJlIG9mZi4gQmFzaWNhbGx5IHdlIGp1c3QgZW1wdHkgb3V0CisgKgl0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgaW50byB0aGUgdHR5IGJ1ZmZlci4gTXVzdCBiZSBjYXJlZnVsIHRvCisgKgloYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZmlsbCB1cCB0aGUgdHR5IGJ1ZmZlciwgYnV0IHN0aWxsIGhhdmUKKyAqCW1vcmUgY2hhcnMgdG8gdW5sb2FkLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfcmVhZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXZvbGF0aWxlIGNka2FzeXJxX3QJKnJwOworCXZvbGF0aWxlIGNoYXIJCSpzaGJ1ZjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCXVuc2lnbmVkIGludAkJaGVhZCwgdGFpbCwgc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCWxlbiwgc3RsZW47CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3JlYWQoYnJkcD0leCxwb3J0cD0lZClcbiIsCisJCQkoaW50KSBicmRwLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmICh0ZXN0X2JpdChTVF9SWFNUT1AsICZwb3J0cC0+c3RhdGUpKQorCQlyZXR1cm47CisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlycCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+cnhxOworCWhlYWQgPSAodW5zaWduZWQgaW50KSBycC0+aGVhZDsKKwlpZiAoaGVhZCAhPSAoKHVuc2lnbmVkIGludCkgcnAtPmhlYWQpKQorCQloZWFkID0gKHVuc2lnbmVkIGludCkgcnAtPmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIHJwLT50YWlsOworCXNpemUgPSBwb3J0cC0+cnhzaXplOworCWlmIChoZWFkID49IHRhaWwpIHsKKwkJbGVuID0gaGVhZCAtIHRhaWw7CisJCXN0bGVuID0gbGVuOworCX0gZWxzZSB7CisJCWxlbiA9IHNpemUgLSAodGFpbCAtIGhlYWQpOworCQlzdGxlbiA9IHNpemUgLSB0YWlsOworCX0KKworCWxlbiA9IE1JTihsZW4sIChUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSk7CisJc2hidWYgPSAodm9sYXRpbGUgY2hhciAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5yeG9mZnNldCk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlzdGxlbiA9IE1JTihsZW4sIHN0bGVuKTsKKwkJbWVtY3B5KHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIChjaGFyICopIChzaGJ1ZiArIHRhaWwpLCBzdGxlbik7CisJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBzdGxlbik7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gc3RsZW47CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gc3RsZW47CisJCXR0eS0+ZmxpcC5jb3VudCArPSBzdGxlbjsKKworCQlsZW4gLT0gc3RsZW47CisJCXRhaWwgKz0gc3RsZW47CisJCWlmICh0YWlsID49IHNpemUpIHsKKwkJCXRhaWwgPSAwOworCQkJc3RsZW4gPSBoZWFkOworCQl9CisJfQorCXJwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5yeHE7CisJcnAtPnRhaWwgPSB0YWlsOworCisJaWYgKGhlYWQgIT0gdGFpbCkKKwkJc2V0X2JpdChTVF9SWElORywgJnBvcnRwLT5zdGF0ZSk7CisKKwl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXQgdXAgYW5kIGNhcnJ5IG91dCBhbnkgZGVsYXllZCBjb21tYW5kcy4gVGhlcmUgaXMgb25seSBhIHNtYWxsIHNldAorICoJb2Ygc2xhdmUgY29tbWFuZHMgdGhhdCBjYW4gYmUgZG9uZSAib2ZmLWxldmVsIi4gU28gaXQgaXMgbm90IHRvbworICoJZGlmZmljdWx0IHRvIGRlYWwgd2l0aCB0aGVtIGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9kb2RlbGF5Y21kKHN0bGlwb3J0X3QgKnBvcnRwLCB2b2xhdGlsZSBjZGtjdHJsX3QgKmNwKQoreworCWludAljbWQ7CisKKwlpZiAodGVzdF9iaXQoU1RfRE9TSUdTLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAodGVzdF9iaXQoU1RfRE9GTFVTSFRYLCAmcG9ydHAtPnN0YXRlKSAmJgorCQkgICAgdGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkKKwkJCWNtZCA9IEFfU0VUU0lHTkFMU0Y7CisJCWVsc2UgaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSkpCisJCQljbWQgPSBBX1NFVFNJR05BTFNGVFg7CisJCWVsc2UgaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSkpCisJCQljbWQgPSBBX1NFVFNJR05BTFNGUlg7CisJCWVsc2UKKwkJCWNtZCA9IEFfU0VUU0lHTkFMUzsKKwkJY2xlYXJfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSk7CisJCWNsZWFyX2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpOworCQljbGVhcl9iaXQoU1RfRE9TSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwkJbWVtY3B5KCh2b2lkICopICYoY3AtPmFyZ3NbMF0pLCAodm9pZCAqKSAmcG9ydHAtPmFzaWcsCisJCQlzaXplb2YoYXN5c2lnc190KSk7CisJCWNwLT5zdGF0dXMgPSAwOworCQljcC0+Y21kID0gY21kOworCQlzZXRfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSk7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpIHx8CisJICAgIHRlc3RfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJY21kID0gKCh0ZXN0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpKSA/IEZMVVNIVFggOiAwKTsKKwkJY21kIHw9ICgodGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkgPyBGTFVTSFJYIDogMCk7CisJCWNsZWFyX2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpOworCQljbGVhcl9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwkJbWVtY3B5KCh2b2lkICopICYoY3AtPmFyZ3NbMF0pLCAodm9pZCAqKSAmY21kLCBzaXplb2YoaW50KSk7CisJCWNwLT5zdGF0dXMgPSAwOworCQljcC0+Y21kID0gQV9GTFVTSDsKKwkJc2V0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSG9zdCBjb21tYW5kIHNlcnZpY2UgY2hlY2tpbmcuIFRoaXMgaGFuZGxlcyBjb21tYW5kcyBvciBtZXNzYWdlcworICoJY29taW5nIGZyb20gdGhlIHNsYXZlIHRvIHRoZSBob3N0LiBNdXN0IGhhdmUgYm9hcmQgc2hhcmVkIG1lbW9yeQorICoJZW5hYmxlZCBhbmQgaW50ZXJydXB0cyBvZmYgd2hlbiBjYWxsZWQuIE5vdGljZSB0aGF0IGJ5IHNlcnZpY2luZyB0aGUKKyAqCXJlYWQgZGF0YSBsYXN0IHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBzaGFyZWQgbWVtb3J5IHBvaW50ZXIKKyAqCWR1cmluZyBwcm9jZXNzaW5nICh3aGljaCBpcyBhIHNsb3cgSU8gb3BlcmF0aW9uKS4KKyAqCVJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhpcyBwb3J0IGlzIHN0aWxsIGF3YWl0aW5nIGFjdGlvbnMgZnJvbQorICoJdGhlIHNsYXZlIChsaWtlIG9wZW4sIGNvbW1hbmQsIG9yIGV2ZW4gVFggZGF0YSBiZWluZyBzZW50KS4gSWYgMAorICoJdGhlbiBwb3J0IGlzIHN0aWxsIGJ1c3ksIG90aGVyd2lzZSBubyBsb25nZXIgYnVzeS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaG9zdGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXZvbGF0aWxlIGNka2FzeV90CSphcDsKKwl2b2xhdGlsZSBjZGtjdHJsX3QJKmNwOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJYXN5bm90aWZ5X3QJCW50OworCXVuc2lnbmVkIGxvbmcJCW9sZHNpZ3M7CisJaW50CQkJcmMsIGRvbmVyeDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaG9zdGNtZChicmRwPSV4LGNoYW5ucj0lZClcbiIsCisJCQkoaW50KSBicmRwLCBjaGFubnIpOworI2VuZGlmCisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwljcCA9ICZhcC0+Y3RybDsKKworLyoKKyAqCUNoZWNrIGlmIHdlIGFyZSB3YWl0aW5nIGZvciBhbiBvcGVuIGNvbXBsZXRpb24gbWVzc2FnZS4KKyAqLworCWlmICh0ZXN0X2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQlyYyA9IChpbnQpIGNwLT5vcGVuYXJnOworCQlpZiAoKGNwLT5vcGVuID09IDApICYmIChyYyAhPSAwKSkgeworCQkJaWYgKHJjID4gMCkKKwkJCQlyYy0tOworCQkJY3AtPm9wZW5hcmcgPSAwOworCQkJcG9ydHAtPnJjID0gcmM7CisJCQljbGVhcl9iaXQoU1RfT1BFTklORywgJnBvcnRwLT5zdGF0ZSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJCX0KKwl9CisKKy8qCisgKglDaGVjayBpZiB3ZSBhcmUgd2FpdGluZyBmb3IgYSBjbG9zZSBjb21wbGV0aW9uIG1lc3NhZ2UuCisgKi8KKwlpZiAodGVzdF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJcmMgPSAoaW50KSBjcC0+Y2xvc2Vhcmc7CisJCWlmICgoY3AtPmNsb3NlID09IDApICYmIChyYyAhPSAwKSkgeworCQkJaWYgKHJjID4gMCkKKwkJCQlyYy0tOworCQkJY3AtPmNsb3NlYXJnID0gMDsKKwkJCXBvcnRwLT5yYyA9IHJjOworCQkJY2xlYXJfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+cmF3X3dhaXQpOworCQl9CisJfQorCisvKgorICoJQ2hlY2sgaWYgd2UgYXJlIHdhaXRpbmcgZm9yIGEgY29tbWFuZCBjb21wbGV0aW9uIG1lc3NhZ2UuIFdlIG1heQorICoJbmVlZCB0byBjb3B5IG91dCB0aGUgY29tbWFuZCByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQuCisgKi8KKwlpZiAodGVzdF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQlyYyA9IGNwLT5zdGF0dXM7CisJCWlmICgoY3AtPmNtZCA9PSAwKSAmJiAocmMgIT0gMCkpIHsKKwkJCWlmIChyYyA+IDApCisJCQkJcmMtLTsKKwkJCWlmIChwb3J0cC0+YXJncCAhPSAodm9pZCAqKSBOVUxMKSB7CisJCQkJbWVtY3B5KHBvcnRwLT5hcmdwLCAodm9pZCAqKSAmKGNwLT5hcmdzWzBdKSwKKwkJCQkJcG9ydHAtPmFyZ3NpemUpOworCQkJCXBvcnRwLT5hcmdwID0gKHZvaWQgKikgTlVMTDsKKwkJCX0KKwkJCWNwLT5zdGF0dXMgPSAwOworCQkJcG9ydHAtPnJjID0gcmM7CisJCQljbGVhcl9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXN0bGlfZG9kZWxheWNtZChwb3J0cCwgY3ApOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+cmF3X3dhaXQpOworCQl9CisJfQorCisvKgorICoJQ2hlY2sgZm9yIGFueSBub3RpZmljYXRpb24gbWVzc2FnZXMgcmVhZHkuIFRoaXMgaW5jbHVkZXMgbG90cyBvZgorICoJZGlmZmVyZW50IHR5cGVzIG9mIGV2ZW50cyAtIFJYIGNoYXJzIHJlYWR5LCBSWCBicmVhayByZWNlaXZlZCwKKyAqCVRYIGRhdGEgbG93IG9yIGVtcHR5IGluIHRoZSBzbGF2ZSwgbW9kZW0gc2lnbmFscyBjaGFuZ2VkIHN0YXRlLgorICovCisJZG9uZXJ4ID0gMDsKKworCWlmIChhcC0+bm90aWZ5KSB7CisJCW50ID0gYXAtPmNoYW5nZWQ7CisJCWFwLT5ub3RpZnkgPSAwOworCQl0dHkgPSBwb3J0cC0+dHR5OworCisJCWlmIChudC5zaWduYWwgJiBTR19EQ0QpIHsKKwkJCW9sZHNpZ3MgPSBwb3J0cC0+c2lnczsKKwkJCXBvcnRwLT5zaWdzID0gc3RsaV9ta3Rpb2NtKG50LnNpZ3ZhbHVlKTsKKwkJCWNsZWFyX2JpdChTVF9HRVRTSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwkJCWlmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgJiYKKwkJCSAgICAoKG9sZHNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKKwkJCWlmICgob2xkc2lncyAmIFRJT0NNX0NEKSAmJgorCQkJICAgICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpIHsKKwkJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIHsKKwkJCQkJaWYgKHR0eSkKKwkJCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cWhhbmd1cCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG50LmRhdGEgJiBEVF9UWEVNUFRZKQorCQkJY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisJCWlmIChudC5kYXRhICYgKERUX1RYRU1QVFkgfCBEVF9UWExPVykpIHsKKwkJCWlmICh0dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJCQlpZiAoKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKKwkJCQkgICAgdHR5LT5sZGlzYy53cml0ZV93YWtldXApIHsKKwkJCQkJKHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKSh0dHkpOworCQkJCQlFQlJERU5BQkxFKGJyZHApOworCQkJCX0KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJCQl9CisJCX0KKworCQlpZiAoKG50LmRhdGEgJiBEVF9SWEJSRUFLKSAmJiAocG9ydHAtPnJ4bWFya21zayAmIEJSS0lOVCkpIHsKKwkJCWlmICh0dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQkJCQl0dHktPmZsaXAuY291bnQrKzsKKwkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCQkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TQUspIHsKKwkJCQkJCWRvX1NBSyh0dHkpOworCQkJCQkJRUJSREVOQUJMRShicmRwKTsKKwkJCQkJfQorCQkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChudC5kYXRhICYgRFRfUlhCVVNZKSB7CisJCQlkb25lcngrKzsKKwkJCXN0bGlfcmVhZChicmRwLCBwb3J0cCk7CisJCX0KKwl9CisKKy8qCisgKglJdCBtaWdodCBzZWVtIG9kZCB0aGF0IHdlIGFyZSBjaGVja2luZyBmb3IgbW9yZSBSWCBjaGFycyBoZXJlLgorICoJQnV0LCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdHR5IGJ1ZmZlciB3YXMgcHJldmlvdXNseQorICoJZmlsbGVkLCBidXQgd2UgaGFkIG1vcmUgY2hhcmFjdGVycyB0byBwYXNzIHVwLiBUaGUgc2xhdmUgd2lsbCBub3QKKyAqCXNlbmQgYW55IG1vcmUgUlggbm90aWZ5IG1lc3NhZ2VzIHVudGlsIHRoZSBSWCBidWZmZXIgaGFzIGJlZW4gZW1wdGllZC4KKyAqCUJ1dCBpdCB3aWxsIGxlYXZlIHRoZSBzZXJ2aWNlIGJpdHMgb24gKHNpbmNlIHRoZSBidWZmZXIgaXMgbm90IGVtcHR5KS4KKyAqCVNvIGZyb20gaGVyZSB3ZSBjYW4gdHJ5IHRvIHByb2Nlc3MgbW9yZSBSWCBjaGFycy4KKyAqLworCWlmICgoIWRvbmVyeCkgJiYgdGVzdF9iaXQoU1RfUlhJTkcsICZwb3J0cC0+c3RhdGUpKSB7CisJCWNsZWFyX2JpdChTVF9SWElORywgJnBvcnRwLT5zdGF0ZSk7CisJCXN0bGlfcmVhZChicmRwLCBwb3J0cCk7CisJfQorCisJcmV0dXJuKCh0ZXN0X2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKSB8fAorCQl0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSB8fAorCQl0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpIHx8CisJCXRlc3RfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSkgfHwKKwkJdGVzdF9iaXQoU1RfUlhJTkcsICZwb3J0cC0+c3RhdGUpKSA/IDAgOiAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VydmljZSBhbGwgcG9ydHMgb24gYSBwYXJ0aWN1bGFyIGJvYXJkLiBBc3N1bWVzIHRoYXQgdGhlIGJvYXJkcworICoJc2hhcmVkIG1lbW9yeSBpcyBlbmFibGVkLCBhbmQgdGhhdCB0aGUgcGFnZSBwb2ludGVyIGlzIHBvaW50ZWQKKyAqCWF0IHRoZSBjZGsgaGVhZGVyIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2JyZHBvbGwoc3RsaWJyZF90ICpicmRwLCB2b2xhdGlsZSBjZGtoZHJfdCAqaGRycCkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBjaGFyCWhvc3RiaXRzWyhTVExfTUFYQ0hBTlMgLyA4KSArIDFdOworCXVuc2lnbmVkIGNoYXIJc2xhdmViaXRzWyhTVExfTUFYQ0hBTlMgLyA4KSArIDFdOworCXVuc2lnbmVkIGNoYXIJKnNsYXZlcDsKKwlpbnQJCWJpdHBvcywgYml0YXQsIGJpdHNpemU7CisJaW50IAkJY2hhbm5yLCBucmRldnMsIHNsYXZlYml0Y2hhbmdlOworCisJYml0c2l6ZSA9IGJyZHAtPmJpdHNpemU7CisJbnJkZXZzID0gYnJkcC0+bnJkZXZzOworCisvKgorICoJQ2hlY2sgaWYgc2xhdmUgd2FudHMgYW55IHNlcnZpY2UuIEJhc2ljYWxseSB3ZSB0cnkgdG8gZG8gYXMKKyAqCWxpdHRsZSB3b3JrIGFzIHBvc3NpYmxlIGhlcmUuIFRoZXJlIGFyZSAyIGxldmVscyBvZiBzZXJ2aWNlCisgKgliaXRzLiBTbyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdlIGJhaWwgZWFybHkuIFdlIGNoZWNrCisgKgk4IHNlcnZpY2UgYml0cyBhdCBhIHRpbWUgaW4gdGhlIGlubmVyIGxvb3AsIHNvIHdlIGNhbiBieXBhc3MKKyAqCXRoZSBsb3QgaWYgbm9uZSBvZiB0aGVtIHdhbnQgc2VydmljZS4KKyAqLworCW1lbWNweSgmaG9zdGJpdHNbMF0sICgoKHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5ob3N0b2Zmc2V0KSwKKwkJYml0c2l6ZSk7CisKKwltZW1zZXQoJnNsYXZlYml0c1swXSwgMCwgYml0c2l6ZSk7CisJc2xhdmViaXRjaGFuZ2UgPSAwOworCisJZm9yIChiaXRwb3MgPSAwOyAoYml0cG9zIDwgYml0c2l6ZSk7IGJpdHBvcysrKSB7CisJCWlmIChob3N0Yml0c1tiaXRwb3NdID09IDApCisJCQljb250aW51ZTsKKwkJY2hhbm5yID0gYml0cG9zICogODsKKwkJZm9yIChiaXRhdCA9IDB4MTsgKGNoYW5uciA8IG5yZGV2cyk7IGNoYW5ucisrLCBiaXRhdCA8PD0gMSkgeworCQkJaWYgKGhvc3RiaXRzW2JpdHBvc10gJiBiaXRhdCkgeworCQkJCXBvcnRwID0gYnJkcC0+cG9ydHNbKGNoYW5uciAtIDEpXTsKKwkJCQlpZiAoc3RsaV9ob3N0Y21kKGJyZHAsIHBvcnRwKSkgeworCQkJCQlzbGF2ZWJpdGNoYW5nZSsrOworCQkJCQlzbGF2ZWJpdHNbYml0cG9zXSB8PSBiaXRhdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKy8qCisgKglJZiBhbnkgb2YgdGhlIHBvcnRzIGFyZSBubyBsb25nZXIgYnVzeSB0aGVuIHVwZGF0ZSB0aGVtIGluIHRoZQorICoJc2xhdmUgcmVxdWVzdCBiaXRzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIsIHNpbmNlIGEgaG9zdCBwb3J0CisgKglzZXJ2aWNlIG1heSBpbml0aWF0ZSBtb3JlIHNsYXZlIHJlcXVlc3RzLgorICovCisJaWYgKHNsYXZlYml0Y2hhbmdlKSB7CisJCWhkcnAgPSAodm9sYXRpbGUgY2RraGRyX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfQ0RLQUREUik7CisJCXNsYXZlcCA9ICgodW5zaWduZWQgY2hhciAqKSBoZHJwKSArIGJyZHAtPnNsYXZlb2Zmc2V0OworCQlmb3IgKGJpdHBvcyA9IDA7IChiaXRwb3MgPCBiaXRzaXplKTsgYml0cG9zKyspIHsKKwkJCWlmIChzbGF2ZWJpdHNbYml0cG9zXSkKKwkJCQlzbGF2ZXBbYml0cG9zXSAmPSB+c2xhdmViaXRzW2JpdHBvc107CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURyaXZlciBwb2xsIHJvdXRpbmUuIFRoaXMgcm91dGluZSBwb2xscyB0aGUgYm9hcmRzIGluIHVzZSBhbmQgcGFzc2VzCisgKgltZXNzYWdlcyBiYWNrIHVwIHRvIGhvc3Qgd2hlbiBuZWNlc3NhcnkuIFRoaXMgaXMgYWN0dWFsbHkgdmVyeQorICoJQ1BVIGVmZmljaWVudCwgc2luY2Ugd2Ugd2lsbCBhbHdheXMgaGF2ZSB0aGUga2VybmVsIHBvbGwgY2xvY2ssIGl0CisgKglhZGRzIG9ubHkgYSBmZXcgY3ljbGVzIHdoZW4gaWRsZSAoc2luY2UgYm9hcmQgc2VydmljZSBjYW4gYmUKKyAqCWRldGVybWluZWQgdmVyeSBlYXNpbHkpLCBidXQgd2hlbiBsb2FkZWQgZ2VuZXJhdGVzIG5vIGludGVycnVwdHMKKyAqCSh3aXRoIHRoZWlyIGV4cGVuc2l2ZSBhc3NvY2lhdGVkIGNvbnRleHQgY2hhbmdlKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJc3RsaWJyZF90CQkqYnJkcDsKKwlpbnQgCQkJYnJkbnI7CisKKwlzdGxpX3RpbWVybGlzdC5leHBpcmVzID0gU1RMSV9USU1FT1VUOworCWFkZF90aW1lcigmc3RsaV90aW1lcmxpc3QpOworCisvKgorICoJQ2hlY2sgZWFjaCBib2FyZCBhbmQgZG8gYW55IHNlcnZpY2luZyByZXF1aXJlZC4KKyAqLworCWZvciAoYnJkbnIgPSAwOyAoYnJkbnIgPCBzdGxpX25yYnJkcyk7IGJyZG5yKyspIHsKKwkJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpID09IDApCisJCQljb250aW51ZTsKKworCQlFQlJERU5BQkxFKGJyZHApOworCQloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCQlpZiAoaGRycC0+aG9zdHJlcSkKKwkJCXN0bGlfYnJkcG9sbChicmRwLCBoZHJwKTsKKwkJRUJSRERJU0FCTEUoYnJkcCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcmFuc2xhdGUgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgaW50byB0aGUgcG9ydCBzZXR0aW5nIHN0cnVjdHVyZSBvZgorICoJdGhlIHNsYXZlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfbWthc3lwb3J0KHN0bGlwb3J0X3QgKnBvcnRwLCBhc3lwb3J0X3QgKnBwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ta2FzeXBvcnQocG9ydHA9JXgscHA9JXgsdGlvc3A9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgKGludCkgcHAsIChpbnQpIHRpb3NwKTsKKyNlbmRpZgorCisJbWVtc2V0KHBwLCAwLCBzaXplb2YoYXN5cG9ydF90KSk7CisKKy8qCisgKglTdGFydCBvZiBieSBzZXR0aW5nIHRoZSBiYXVkLCBjaGFyIHNpemUsIHBhcml0eSBhbmQgc3RvcCBiaXQgaW5mby4KKyAqLworCXBwLT5iYXVkb3V0ID0gdGlvc3AtPmNfY2ZsYWcgJiBDQkFVRDsKKwlpZiAocHAtPmJhdWRvdXQgJiBDQkFVREVYKSB7CisJCXBwLT5iYXVkb3V0ICY9IH5DQkFVREVYOworCQlpZiAoKHBwLT5iYXVkb3V0IDwgMSkgfHwgKHBwLT5iYXVkb3V0ID4gNCkpCisJCQl0aW9zcC0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKKwkJZWxzZQorCQkJcHAtPmJhdWRvdXQgKz0gMTU7CisJfQorCXBwLT5iYXVkb3V0ID0gc3RsaV9iYXVkcmF0ZXNbcHAtPmJhdWRvdXRdOworCWlmICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjM4NDAwKSB7CisJCWlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCXBwLT5iYXVkb3V0ID0gNTc2MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCXBwLT5iYXVkb3V0ID0gMTE1MjAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQlwcC0+YmF1ZG91dCA9IDIzMDQwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCXBwLT5iYXVkb3V0ID0gNDYwODAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKQorCQkJcHAtPmJhdWRvdXQgPSAocG9ydHAtPmJhdWRfYmFzZSAvIHBvcnRwLT5jdXN0b21fZGl2aXNvcik7CisJfQorCWlmIChwcC0+YmF1ZG91dCA+IFNUTF9NQVhCQVVEKQorCQlwcC0+YmF1ZG91dCA9IFNUTF9NQVhCQVVEOworCXBwLT5iYXVkaW4gPSBwcC0+YmF1ZG91dDsKKworCXN3aXRjaCAodGlvc3AtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQlwcC0+Y3NpemUgPSA1OworCQlicmVhazsKKwljYXNlIENTNjoKKwkJcHAtPmNzaXplID0gNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCXBwLT5jc2l6ZSA9IDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBwLT5jc2l6ZSA9IDg7CisJCWJyZWFrOworCX0KKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENTVE9QQikKKwkJcHAtPnN0b3BicyA9IFBUX1NUT1AyOworCWVsc2UKKwkJcHAtPnN0b3BicyA9IFBUX1NUT1AxOworCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmICh0aW9zcC0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJCXBwLT5wYXJpdHkgPSBQVF9PRERQQVJJVFk7CisJCWVsc2UKKwkJCXBwLT5wYXJpdHkgPSBQVF9FVkVOUEFSSVRZOworCX0gZWxzZSB7CisJCXBwLT5wYXJpdHkgPSBQVF9OT1BBUklUWTsKKwl9CisKKy8qCisgKglTZXQgdXAgYW55IGZsb3cgY29udHJvbCBvcHRpb25zIGVuYWJsZWQuCisgKi8KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJWE9OKSB7CisJCXBwLT5mbG93IHw9IEZfSVhPTjsKKwkJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhBTlkpCisJCQlwcC0+ZmxvdyB8PSBGX0lYQU5ZOworCX0KKwlpZiAodGlvc3AtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQlwcC0+ZmxvdyB8PSAoRl9SVFNGTE9XIHwgRl9DVFNGTE9XKTsKKworCXBwLT5zdGFydGluID0gdGlvc3AtPmNfY2NbVlNUQVJUXTsKKwlwcC0+c3RvcGluID0gdGlvc3AtPmNfY2NbVlNUT1BdOworCXBwLT5zdGFydG91dCA9IHRpb3NwLT5jX2NjW1ZTVEFSVF07CisJcHAtPnN0b3BvdXQgPSB0aW9zcC0+Y19jY1tWU1RPUF07CisKKy8qCisgKglTZXQgdXAgdGhlIFJYIGNoYXIgbWFya2luZyBtYXNrIHdpdGggdGhvc2UgUlggZXJyb3IgdHlwZXMgd2UgbXVzdAorICoJY2F0Y2guIFdlIGNhbiBnZXQgdGhlIHNsYXZlIHRvIGhlbHAgdXMgb3V0IGEgbGl0dGxlIGhlcmUsIGl0IHdpbGwKKyAqCWlnbm9yZSBwYXJpdHkgZXJyb3JzIGFuZCBicmVha3MgZm9yIHVzLCBhbmQgbWFyayBwYXJpdHkgZXJyb3JzIGluCisgKgl0aGUgZGF0YSBzdHJlYW0uCisgKi8KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05QQVIpCisJCXBwLT5pZmxhZyB8PSBGSV9JR05SWEVSUlM7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSUdOQlJLKQorCQlwcC0+aWZsYWcgfD0gRklfSUdOQlJFQUs7CisKKwlwb3J0cC0+cnhtYXJrbXNrID0gMDsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiAoSU5QQ0sgfCBQQVJNUkspKQorCQlwcC0+aWZsYWcgfD0gRklfMU1BUktSWEVSUlM7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgQlJLSU5UKQorCQlwb3J0cC0+cnhtYXJrbXNrIHw9IEJSS0lOVDsKKworLyoKKyAqCVNldCB1cCBjbG9jYWwgcHJvY2Vzc2luZyBhcyByZXF1aXJlZC4KKyAqLworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENMT0NBTCkKKwkJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworLyoKKyAqCVRyYW5zZmVyIGFueSBwZXJzaXN0ZW50IGZsYWdzIGludG8gdGhlIGFzeXBvcnQgc3RydWN0dXJlLgorICovCisJcHAtPnBmbGFnID0gKHBvcnRwLT5wZmxhZyAmIDB4ZmZmZik7CisJcHAtPnZtaW4gPSAocG9ydHAtPnBmbGFnICYgUF9SWElNSU4pID8gMSA6IDA7CisJcHAtPnZ0aW1lID0gKHBvcnRwLT5wZmxhZyAmIFBfUlhJVElNRSkgPyAxIDogMDsKKwlwcC0+Y2NbMV0gPSAocG9ydHAtPnBmbGFnICYgUF9SWFRIT0xEKSA/IDEgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDb25zdHJ1Y3QgYSBzbGF2ZSBzaWduYWxzIHN0cnVjdHVyZSBmb3Igc2V0dGluZyB0aGUgRFRSIGFuZCBSVFMKKyAqCXNpZ25hbHMgYXMgc3BlY2lmaWVkLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfbWthc3lzaWdzKGFzeXNpZ3NfdCAqc3AsIGludCBkdHIsIGludCBydHMpCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ta2FzeXNpZ3Moc3A9JXgsZHRyPSVkLHJ0cz0lZClcbiIsCisJCQkoaW50KSBzcCwgZHRyLCBydHMpOworI2VuZGlmCisKKwltZW1zZXQoc3AsIDAsIHNpemVvZihhc3lzaWdzX3QpKTsKKwlpZiAoZHRyID49IDApIHsKKwkJc3AtPnNpZ25hbCB8PSBTR19EVFI7CisJCXNwLT5zaWd2YWx1ZSB8PSAoKGR0ciA+IDApID8gU0dfRFRSIDogMCk7CisJfQorCWlmIChydHMgPj0gMCkgeworCQlzcC0+c2lnbmFsIHw9IFNHX1JUUzsKKwkJc3AtPnNpZ3ZhbHVlIHw9ICgocnRzID4gMCkgPyBTR19SVFMgOiAwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNvbnZlcnQgdGhlIHNpZ25hbHMgcmV0dXJuZWQgZnJvbSB0aGUgc2xhdmUgaW50byBhIGxvY2FsIFRJT0NNIHR5cGUKKyAqCXNpZ25hbHMgdmFsdWUuIFdlIGtlZXAgdGhlbSBsb2NhbGx5IGluIFRJT0NNIGZvcm1hdC4KKyAqLworCitzdGF0aWMgbG9uZyBzdGxpX21rdGlvY20odW5zaWduZWQgbG9uZyBzaWd2YWx1ZSkKK3sKKwlsb25nCXRpb2NtOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ta3Rpb2NtKHNpZ3ZhbHVlPSV4KVxuIiwgKGludCkgc2lndmFsdWUpOworI2VuZGlmCisKKwl0aW9jbSA9IDA7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX0RDRCkgPyBUSU9DTV9DRCA6IDApOworCXRpb2NtIHw9ICgoc2lndmFsdWUgJiBTR19DVFMpID8gVElPQ01fQ1RTIDogMCk7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX1JJKSA/IFRJT0NNX1JJIDogMCk7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX0RTUikgPyBUSU9DTV9EU1IgOiAwKTsKKwl0aW9jbSB8PSAoKHNpZ3ZhbHVlICYgU0dfRFRSKSA/IFRJT0NNX0RUUiA6IDApOworCXRpb2NtIHw9ICgoc2lndmFsdWUgJiBTR19SVFMpID8gVElPQ01fUlRTIDogMCk7CisJcmV0dXJuKHRpb2NtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQWxsIHBhbmVscyBhbmQgcG9ydHMgYWN0dWFsbHkgYXR0YWNoZWQgaGF2ZSBiZWVuIHdvcmtlZCBvdXQuIEFsbAorICoJd2UgbmVlZCB0byBkbyBoZXJlIGlzIHNldCB1cCB0aGUgYXBwcm9wcmlhdGUgcGVyIHBvcnQgZGF0YSBzdHJ1Y3R1cmVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9pbml0cG9ydHMoc3RsaWJyZF90ICpicmRwKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCWludAkJaSwgcGFuZWxuciwgcGFuZWxwb3J0OworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0cG9ydHMoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlmb3IgKGkgPSAwLCBwYW5lbG5yID0gMCwgcGFuZWxwb3J0ID0gMDsgKGkgPCBicmRwLT5ucnBvcnRzKTsgaSsrKSB7CisJCXBvcnRwID0gKHN0bGlwb3J0X3QgKikgc3RsaV9tZW1hbGxvYyhzaXplb2Yoc3RsaXBvcnRfdCkpOworCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkgeworCQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIHBvcnQgc3RydWN0dXJlXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVtc2V0KHBvcnRwLCAwLCBzaXplb2Yoc3RsaXBvcnRfdCkpOworCQlwb3J0cC0+bWFnaWMgPSBTVExJX1BPUlRNQUdJQzsKKwkJcG9ydHAtPnBvcnRuciA9IGk7CisJCXBvcnRwLT5icmRuciA9IGJyZHAtPmJyZG5yOworCQlwb3J0cC0+cGFuZWxuciA9IHBhbmVsbnI7CisJCXBvcnRwLT5iYXVkX2Jhc2UgPSBTVExfQkFVREJBU0U7CisJCXBvcnRwLT5jbG9zZV9kZWxheSA9IFNUTF9DTE9TRURFTEFZOworCQlwb3J0cC0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJSU5JVF9XT1JLKCZwb3J0cC0+dHFoYW5ndXAsIHN0bGlfZG9oYW5ndXAsIHBvcnRwKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnRwLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPnJhd193YWl0KTsKKwkJcGFuZWxwb3J0Kys7CisJCWlmIChwYW5lbHBvcnQgPj0gYnJkcC0+cGFuZWxzW3BhbmVsbnJdKSB7CisJCQlwYW5lbHBvcnQgPSAwOworCQkJcGFuZWxucisrOworCQl9CisJCWJyZHAtPnBvcnRzW2ldID0gcG9ydHA7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBbGwgdGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgYm9hcmQgc3BlY2lmaWMgaGFyZHdhcmUgb3BlcmF0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwaW5pdChicmRwPSVkKVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoRUNQX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKEVDUF9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfQVRDT05GUikpOworCXVkZWxheSgxMDApOworCisJbWVtY29uZiA9IChicmRwLT5tZW1hZGRyICYgRUNQX0FUQUREUk1BU0spID4+IEVDUF9BVEFERFJTSEZUOworCW91dGIobWVtY29uZiwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVE1FTUFSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BlbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcGVuYWJsZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKEVDUF9BVEVOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BkaXNhYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoRUNQX0FURElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKnN0bGlfZWNwZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCQkqcHRyOworCXVuc2lnbmVkIGNoYXIJdmFsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgpXG4iLCAoaW50KSBicmRwLAorCQkoaW50KSBvZmZzZXQpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJyZD0lZFxuIiwKKwkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwkJdmFsID0gMDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIEVDUF9BVFBBR0VTSVpFKTsKKwkJdmFsID0gKHVuc2lnbmVkIGNoYXIpIChvZmZzZXQgLyBFQ1BfQVRQQUdFU0laRSk7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUTUVNUFIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcHJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3ByZXNldChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoRUNQX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKEVDUF9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfQVRDT05GUikpOworCXVkZWxheSg1MDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwaW50cihzdGxpYnJkX3QgKmJyZHApCit7CQorI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwaW50cihicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKDB4MSwgYnJkcC0+aW9iYXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zIGFjdCBvbiBFQ1AgRUlTQSBib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BlaWluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwZWlpbml0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YigweDEsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlCUkRFTkFCKSk7CisJb3V0YihFQ1BfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoRUNQX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7CisJdWRlbGF5KDUwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBFQ1BfRUlBRERSTUFTS0wpID4+IEVDUF9FSUFERFJTSEZUTDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlNRU1BUkwpKTsKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBFQ1BfRUlBRERSTUFTS0gpID4+IEVDUF9FSUFERFJTSEZUSDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlNRU1BUkgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfRUlFTkFCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwZWlkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BlaWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwZWlnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgsbGluZT0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIG9mZnNldCwgbGluZSk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgRUNQX0VJUEFHRVNJWkUpOworCQlpZiAob2Zmc2V0IDwgRUNQX0VJUEFHRVNJWkUpCisJCQl2YWwgPSBFQ1BfRUlFTkFCTEU7CisJCWVsc2UKKwkJCXZhbCA9IEVDUF9FSUVOQUJMRSB8IDB4NDA7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpcmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zIGFjdCBvbiBFQ1AgTUNBIGJvYXJkcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcG1jZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfTUNFTkFCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfTUNDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwbWNkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfTUNESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX01DQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BtY2dldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgRUNQX01DUEFHRVNJWkUpOworCQl2YWwgPSAoKHVuc2lnbmVkIGNoYXIpIChvZmZzZXQgLyBFQ1BfTUNQQUdFU0laRSkpIHwgRUNQX01DRU5BQkxFOworCX0KKwlvdXRiKHZhbCwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BtY3Jlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfTUNTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX01DQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoRUNQX01DRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CisJdWRlbGF5KDUwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgc2V0IG9mIGZ1bmN0aW9ucyBhY3Qgb24gRUNQIFBDSSBib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BwY2lpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcHBjaWluaXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKEVDUF9QQ0lTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX1BDSUNPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIChicmRwLT5pb2Jhc2UgKyBFQ1BfUENJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BwY2lnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcHBjaWdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leCxsaW5lPSVkKVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgb2Zmc2V0LCBsaW5lKTsKKyNlbmRpZgorCisJaWYgKG9mZnNldCA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2hhcmVkIG1lbW9yeSBwb2ludGVyPSV4IG91dCBvZiAiCisJCQkJInJhbmdlIGF0IGxpbmU9JWQoJWQpLCBib2FyZD0lZFxuIiwKKwkJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBFQ1BfUENJUEFHRVNJWkUpOworCQl2YWwgPSAob2Zmc2V0IC8gRUNQX1BDSVBBR0VTSVpFKSA8PCAxOworCX0KKwlvdXRiKHZhbCwgKGJyZHAtPmlvYmFzZSArIEVDUF9QQ0lDT05GUikpOworCXJldHVybihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwcGNpcmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9QQ0lTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX1BDSUNPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIChicmRwLT5pb2Jhc2UgKyBFQ1BfUENJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY3Qgb24gT05ib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKwl1bnNpZ25lZCBsb25nCW1lbWNvbmY7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmluaXQoYnJkcD0lZClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKE9OQl9BVFNUT1AsIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihPTkJfQVRESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBPTkJfQVRBRERSTUFTSykgPj4gT05CX0FUQUREUlNIRlQ7CisJb3V0YihtZW1jb25mLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUTUVNQVIpKTsKKwlvdXRiKDB4MSwgYnJkcC0+aW9iYXNlKTsKKwltZGVsYXkoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJlbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmVuYWJsZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKChicmRwLT5lbmFidmFsIHwgT05CX0FURU5BQkxFKSwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJkaXNhYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoKGJyZHAtPmVuYWJ2YWwgfCBPTkJfQVRESVNBQkxFKSwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKnN0bGlfb25iZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCSpwdHI7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leClcbiIsIChpbnQpIGJyZHAsCisJCShpbnQpIG9mZnNldCk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIE9OQl9BVFBBR0VTSVpFKTsKKwl9CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJyZXNldChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoT05CX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKE9OQl9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRDT05GUikpOworCW1kZWxheSgxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY3Qgb24gT05ib2FyZCBFSVNBLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfb25iZWluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfb25iZWluaXQoYnJkcD0lZClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUJSREVOQUIpKTsKKwlvdXRiKE9OQl9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihPTkJfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBPTkJfRUlBRERSTUFTS0wpID4+IE9OQl9FSUFERFJTSEZUTDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlNRU1BUkwpKTsKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBPTkJfRUlBRERSTUFTS0gpID4+IE9OQl9FSUFERFJTSEZUSDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlNRU1BUkgpKTsKKwlvdXRiKDB4MSwgYnJkcC0+aW9iYXNlKTsKKwltZGVsYXkoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJlZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJlZW5hYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoT05CX0VJRU5BQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmVkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJlZGlzYWJsZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKE9OQl9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX29uYmVnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmVnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgsbGluZT0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIG9mZnNldCwgbGluZSk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgT05CX0VJUEFHRVNJWkUpOworCQlpZiAob2Zmc2V0IDwgT05CX0VJUEFHRVNJWkUpCisJCQl2YWwgPSBPTkJfRUlFTkFCTEU7CisJCWVsc2UKKwkJCXZhbCA9IE9OQl9FSUVOQUJMRSB8IDB4NDA7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmVyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9FUlIgInN0bGlfb25iZXJlc2V0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihPTkJfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoT05CX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUNPTkZSKSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBCcnVtYnkgYm9hcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfYmJ5aW5pdChzdGxpYnJkX3QgKmJyZHApCit7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0VSUiAic3RsaV9iYnlpbml0KGJyZHA9JWQpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihCQllfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgKGJyZHAtPmlvYmFzZSArIEJCWV9BVENPTkZSKSk7CisJbWRlbGF5KDEwMDApOworCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9iYnlnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0VSUiAic3RsaV9iYnlnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgpXG4iLCAoaW50KSBicmRwLAorCQkoaW50KSBvZmZzZXQpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJyZD0lZFxuIiwKKwkJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBCQllfUEFHRVNJWkUpOworCQl2YWwgPSAodW5zaWduZWQgY2hhcikgKG9mZnNldCAvIEJCWV9QQUdFU0laRSk7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2JieXJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2JieXJlc2V0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihCQllfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgKGJyZHAtPmlvYmFzZSArIEJCWV9BVENPTkZSKSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBvcmlnaW5hbCBvbGQgU3RhbGxpb24gYm9hcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc3RhbGluaXQoc3RsaWJyZF90ICpicmRwKQoreworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zdGFsaW5pdChicmRwPSVkKVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9zdGFsZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCSpwdHI7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3N0YWxnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgpXG4iLCAoaW50KSBicmRwLAorCQkoaW50KSBvZmZzZXQpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJyZD0lZFxuIiwKKwkJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBTVEFMX1BBR0VTSVpFKTsKKwl9CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9zdGFscmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSp2ZWNwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zdGFscmVzZXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwl2ZWNwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGJyZHAtPm1lbWJhc2UgKyAweDMwKTsKKwkqdmVjcCA9IDB4ZmZmZjAwMDA7CisJb3V0YigwLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVHJ5IHRvIGZpbmQgYW4gRUNQIGJvYXJkIGFuZCBpbml0aWFsaXplIGl0LiBUaGlzIGhhbmRsZXMgb25seSBFQ1AKKyAqCWJvYXJkIHR5cGVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9pbml0ZWNwKHN0bGlicmRfdCAqYnJkcCkKK3sKKwljZGtlY3BzaWdfdAlzaWc7CisJY2RrZWNwc2lnX3QJKnNpZ3NwOworCXVuc2lnbmVkIGludAlzdGF0dXMsIG54dGlkOworCWNoYXIJCSpuYW1lOworCWludAkJcGFuZWxuciwgbnJwb3J0czsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaW5pdGVjcChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUsICJpc3RhbGxpb24iKSkKKwkJcmV0dXJuIC1FSU87CisJCisJaWYgKChicmRwLT5pb2Jhc2UgPT0gMCkgfHwgKGJyZHAtPm1lbWFkZHIgPT0gMCkpCisJeworCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwlicmRwLT5pb3NpemUgPSBFQ1BfSU9TSVpFOworCisvKgorICoJQmFzZWQgb24gdGhlIHNwZWNpZmljIGJvYXJkIHR5cGUgc2V0dXAgdGhlIGNvbW1vbiB2YXJzIHRvIGFjY2VzcworICoJYW5kIGVuYWJsZSBzaGFyZWQgbWVtb3J5LiBTZXQgYWxsIGJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uIG5vdworICoJYXMgd2VsbC4KKyAqLworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCWNhc2UgQlJEX0VDUDoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfQVRQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfZWNwaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9lY3BlbmFibGU7CisJCWJyZHAtPnJlZW5hYmxlID0gc3RsaV9lY3BlbmFibGU7CisJCWJyZHAtPmRpc2FibGUgPSBzdGxpX2VjcGRpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfZWNwcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEVDOC82NCkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDUEU6CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gRUNQX01FTVNJWkU7CisJCWJyZHAtPnBhZ2VzaXplID0gRUNQX0VJUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX2VjcGVpaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9lY3BlaWVuYWJsZTsKKwkJYnJkcC0+cmVlbmFibGUgPSBzdGxpX2VjcGVpZW5hYmxlOworCQlicmRwLT5kaXNhYmxlID0gc3RsaV9lY3BlaWRpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwZWlnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9lY3BlaXJlc2V0OworCQluYW1lID0gInNlcmlhbChFQzgvNjQtRUkpIjsKKwkJYnJlYWs7CisKKwljYXNlIEJSRF9FQ1BNQzoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfTUNQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IE5VTEw7CisJCWJyZHAtPmVuYWJsZSA9IHN0bGlfZWNwbWNlbmFibGU7CisJCWJyZHAtPnJlZW5hYmxlID0gc3RsaV9lY3BtY2VuYWJsZTsKKwkJYnJkcC0+ZGlzYWJsZSA9IHN0bGlfZWNwbWNkaXNhYmxlOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX2VjcG1jZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfZWNwbWNyZXNldDsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzY0LU1DQSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDUFBDSToKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfUENJTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfUENJUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX2VjcHBjaWluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IE5VTEw7CisJCWJyZHAtPnJlZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+ZGlzYWJsZSA9IE5VTEw7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwcGNpZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfZWNwcGNpcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEVDL1JBLVBDSSkiOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKworLyoKKyAqCVRoZSBwZXItYm9hcmQgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgaXMgYWxsIHNldCB1cCwgc28gbm93IGxldCdzIGdvCisgKglhbmQgZ2V0IHRoZSBib2FyZCBvcGVyYXRpb25hbC4gRmlyc3RseSBpbml0aWFsaXplIGJvYXJkIGNvbmZpZ3VyYXRpb24KKyAqCXJlZ2lzdGVycy4gU2V0IHRoZSBtZW1vcnkgbWFwcGluZyBpbmZvIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGJvYXJkcworICoJc2hhcmVkIG1lbW9yeS4KKyAqLworCUVCUkRJTklUKGJyZHApOworCisJYnJkcC0+bWVtYmFzZSA9IGlvcmVtYXAoYnJkcC0+bWVtYWRkciwgYnJkcC0+bWVtc2l6ZSk7CisJaWYgKGJyZHAtPm1lbWJhc2UgPT0gKHZvaWQgKikgTlVMTCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKworLyoKKyAqCU5vdyB0aGF0IGFsbCBzcGVjaWZpYyBjb2RlIGlzIHNldCB1cCwgZW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5IGFuZAorICoJbG9vayBmb3IgdGhlIGEgc2lnbmF0dXJlIGFyZWEgdGhhdCB3aWxsIHRlbGwgdXMgZXhhY3RseSB3aGF0IGJvYXJkCisgKgl0aGlzIGlzLCBhbmQgd2hhdCBpdCBpcyBjb25uZWN0ZWQgdG8gaXQuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCXNpZ3NwID0gKGNka2VjcHNpZ190ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX1NJR0FERFIpOworCW1lbWNweSgmc2lnLCBzaWdzcCwgc2l6ZW9mKGNka2VjcHNpZ190KSk7CisJRUJSRERJU0FCTEUoYnJkcCk7CisKKyNpZiAwCisJcHJpbnRrKCIlcyglZCk6IHNpZy0+IG1hZ2ljPSV4IHJvbT0leCBwYW5lbD0leCwleCwleCwleCwleCwleCwleCwleFxuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCAoaW50KSBzaWcubWFnaWMsIHNpZy5yb212ZXIsIHNpZy5wYW5lbGlkWzBdLAorCQkoaW50KSBzaWcucGFuZWxpZFsxXSwgKGludCkgc2lnLnBhbmVsaWRbMl0sCisJCShpbnQpIHNpZy5wYW5lbGlkWzNdLCAoaW50KSBzaWcucGFuZWxpZFs0XSwKKwkJKGludCkgc2lnLnBhbmVsaWRbNV0sIChpbnQpIHNpZy5wYW5lbGlkWzZdLAorCQkoaW50KSBzaWcucGFuZWxpZFs3XSk7CisjZW5kaWYKKworCWlmIChzaWcubWFnaWMgIT0gRUNQX01BR0lDKQorCXsKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisvKgorICoJU2NhbiB0aHJvdWdoIHRoZSBzaWduYXR1cmUgbG9va2luZyBhdCB0aGUgcGFuZWxzIGNvbm5lY3RlZCB0byB0aGUKKyAqCWJvYXJkLiBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwb3J0cyBhcyB3ZSBnby4KKyAqLworCWZvciAocGFuZWxuciA9IDAsIG54dGlkID0gMDsgKHBhbmVsbnIgPCBTVExfTUFYUEFORUxTKTsgcGFuZWxucisrKSB7CisJCXN0YXR1cyA9IHNpZy5wYW5lbGlkW254dGlkXTsKKwkJaWYgKChzdGF0dXMgJiBFQ0hfUE5MSURNQVNLKSAhPSBueHRpZCkKKwkJCWJyZWFrOworCisJCWJyZHAtPnBhbmVsaWRzW3BhbmVsbnJdID0gc3RhdHVzOworCQlucnBvcnRzID0gKHN0YXR1cyAmIEVDSF9QTkwxNlBPUlQpID8gMTYgOiA4OworCQlpZiAoKG5ycG9ydHMgPT0gMTYpICYmICgoc3RhdHVzICYgRUNIX1BOTFhQSUQpID09IDApKQorCQkJbnh0aWQrKzsKKwkJYnJkcC0+cGFuZWxzW3BhbmVsbnJdID0gbnJwb3J0czsKKwkJYnJkcC0+bnJwb3J0cyArPSBucnBvcnRzOworCQlueHRpZCsrOworCQlicmRwLT5ucnBhbmVscysrOworCX0KKworCisJYnJkcC0+c3RhdGUgfD0gQlNUX0ZPVU5EOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVHJ5IHRvIGZpbmQgYW4gT05ib2FyZCwgQnJ1bWJ5IG9yIFN0YWxsaW9uIGJvYXJkIGFuZCBpbml0aWFsaXplIGl0LgorICoJVGhpcyBoYW5kbGVzIG9ubHkgdGhlc2UgYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRvbmIoc3RsaWJyZF90ICpicmRwKQoreworCWNka29uYnNpZ190CXNpZzsKKwljZGtvbmJzaWdfdAkqc2lnc3A7CisJY2hhcgkJKm5hbWU7CisJaW50CQlpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0b25iKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisvKgorICoJRG8gYSBiYXNpYyBzYW5pdHkgY2hlY2sgb24gdGhlIElPIGFuZCBtZW1vcnkgYWRkcmVzc2VzLgorICovCisJaWYgKChicmRwLT5pb2Jhc2UgPT0gMCkgfHwgKGJyZHAtPm1lbWFkZHIgPT0gMCkpCisJCXJldHVybigtRU5PREVWKTsKKworCWJyZHAtPmlvc2l6ZSA9IE9OQl9JT1NJWkU7CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSwgImlzdGFsbGlvbiIpKQorCQlyZXR1cm4gLUVJTzsKKworLyoKKyAqCUJhc2VkIG9uIHRoZSBzcGVjaWZpYyBib2FyZCB0eXBlIHNldHVwIHRoZSBjb21tb24gdmFycyB0byBhY2Nlc3MKKyAqCWFuZCBlbmFibGUgc2hhcmVkIG1lbW9yeS4gU2V0IGFsbCBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBub3cKKyAqCWFzIHdlbGwuCisgKi8KKwlzd2l0Y2ggKGJyZHAtPmJyZHR5cGUpIHsKKwljYXNlIEJSRF9PTkJPQVJEOgorCWNhc2UgQlJEX09OQk9BUkQzMjoKKwljYXNlIEJSRF9PTkJPQVJEMjoKKwljYXNlIEJSRF9PTkJPQVJEMl8zMjoKKwljYXNlIEJSRF9PTkJPQVJEUlM6CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gT05CX01FTVNJWkU7CisJCWJyZHAtPnBhZ2VzaXplID0gT05CX0FUUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX29uYmluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IHN0bGlfb25iZW5hYmxlOworCQlicmRwLT5yZWVuYWJsZSA9IHN0bGlfb25iZW5hYmxlOworCQlicmRwLT5kaXNhYmxlID0gc3RsaV9vbmJkaXNhYmxlOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX29uYmdldG1lbXB0cjsKKwkJYnJkcC0+aW50ciA9IHN0bGlfZWNwaW50cjsKKwkJYnJkcC0+cmVzZXQgPSBzdGxpX29uYnJlc2V0OworCQlpZiAoYnJkcC0+bWVtYWRkciA+IDB4MTAwMDAwKQorCQkJYnJkcC0+ZW5hYnZhbCA9IE9OQl9NRU1FTkFCSEk7CisJCWVsc2UKKwkJCWJyZHAtPmVuYWJ2YWwgPSBPTkJfTUVNRU5BQkxPOworCQluYW1lID0gInNlcmlhbChPTkJvYXJkKSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfT05CT0FSREU6CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gT05CX0VJTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBPTkJfRUlQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfb25iZWluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IHN0bGlfb25iZWVuYWJsZTsKKwkJYnJkcC0+cmVlbmFibGUgPSBzdGxpX29uYmVlbmFibGU7CisJCWJyZHAtPmRpc2FibGUgPSBzdGxpX29uYmVkaXNhYmxlOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX29uYmVnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9vbmJlcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKE9OQm9hcmQvRSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0JSVU1CWTQ6CisJY2FzZSBCUkRfQlJVTUJZODoKKwljYXNlIEJSRF9CUlVNQlkxNjoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBCQllfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBCQllfUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX2JieWluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IE5VTEw7CisJCWJyZHAtPnJlZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+ZGlzYWJsZSA9IE5VTEw7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfYmJ5Z2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfYmJ5cmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEJydW1ieSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX1NUQUxMSU9OOgorCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtc2l6ZSA9IFNUQUxfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBTVEFMX1BBR0VTSVpFOworCQlicmRwLT5pbml0ID0gc3RsaV9zdGFsaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+cmVlbmFibGUgPSBOVUxMOworCQlicmRwLT5kaXNhYmxlID0gTlVMTDsKKwkJYnJkcC0+Z2V0bWVtcHRyID0gc3RsaV9zdGFsZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfc3RhbHJlc2V0OworCQluYW1lID0gInNlcmlhbChTdGFsbGlvbikiOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKworLyoKKyAqCVRoZSBwZXItYm9hcmQgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgaXMgYWxsIHNldCB1cCwgc28gbm93IGxldCdzIGdvCisgKglhbmQgZ2V0IHRoZSBib2FyZCBvcGVyYXRpb25hbC4gRmlyc3RseSBpbml0aWFsaXplIGJvYXJkIGNvbmZpZ3VyYXRpb24KKyAqCXJlZ2lzdGVycy4gU2V0IHRoZSBtZW1vcnkgbWFwcGluZyBpbmZvIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGJvYXJkcworICoJc2hhcmVkIG1lbW9yeS4KKyAqLworCUVCUkRJTklUKGJyZHApOworCisJYnJkcC0+bWVtYmFzZSA9IGlvcmVtYXAoYnJkcC0+bWVtYWRkciwgYnJkcC0+bWVtc2l6ZSk7CisJaWYgKGJyZHAtPm1lbWJhc2UgPT0gKHZvaWQgKikgTlVMTCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKworLyoKKyAqCU5vdyB0aGF0IGFsbCBzcGVjaWZpYyBjb2RlIGlzIHNldCB1cCwgZW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5IGFuZAorICoJbG9vayBmb3IgdGhlIGEgc2lnbmF0dXJlIGFyZWEgdGhhdCB3aWxsIHRlbGwgdXMgZXhhY3RseSB3aGF0IGJvYXJkCisgKgl0aGlzIGlzLCBhbmQgaG93IG1hbnkgcG9ydHMuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCXNpZ3NwID0gKGNka29uYnNpZ190ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX1NJR0FERFIpOworCW1lbWNweSgmc2lnLCBzaWdzcCwgc2l6ZW9mKGNka29uYnNpZ190KSk7CisJRUJSRERJU0FCTEUoYnJkcCk7CisKKyNpZiAwCisJcHJpbnRrKCIlcyglZCk6IHNpZy0+IG1hZ2ljPSV4OiV4OiV4OiV4IHJvbXZlcj0leCBhbWFzaz0leDoleDoleFxuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBzaWcubWFnaWMwLCBzaWcubWFnaWMxLCBzaWcubWFnaWMyLAorCQlzaWcubWFnaWMzLCBzaWcucm9tdmVyLCBzaWcuYW1hc2swLCBzaWcuYW1hc2sxLCBzaWcuYW1hc2syKTsKKyNlbmRpZgorCisJaWYgKChzaWcubWFnaWMwICE9IE9OQl9NQUdJQzApIHx8IChzaWcubWFnaWMxICE9IE9OQl9NQUdJQzEpIHx8CisJICAgIChzaWcubWFnaWMyICE9IE9OQl9NQUdJQzIpIHx8IChzaWcubWFnaWMzICE9IE9OQl9NQUdJQzMpKQorCXsKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisvKgorICoJU2NhbiB0aHJvdWdoIHRoZSBzaWduYXR1cmUgYWxpdmUgbWFzayBhbmQgY2FsY3VsYXRlIGhvdyBtYW55IHBvcnRzCisgKgl0aGVyZSBhcmUgb24gdGhpcyBib2FyZC4KKyAqLworCWJyZHAtPm5ycGFuZWxzID0gMTsKKwlpZiAoc2lnLmFtYXNrMSkgeworCQlicmRwLT5ucnBvcnRzID0gMzI7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgKGkgPCAxNik7IGkrKykgeworCQkJaWYgKCgoc2lnLmFtYXNrMCA8PCBpKSAmIDB4ODAwMCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlicmRwLT5ucnBvcnRzID0gaTsKKwl9CisJYnJkcC0+cGFuZWxzWzBdID0gYnJkcC0+bnJwb3J0czsKKworCisJYnJkcC0+c3RhdGUgfD0gQlNUX0ZPVU5EOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RhcnQgdXAgYSBydW5uaW5nIGJvYXJkLiBUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlCisgKgljb2RlIGhhcyBiZWVuIGRvd24gbG9hZGVkIHRvIHRoZSBib2FyZCBhbmQgaXMgb3BlcmF0aW9uYWwuIEl0IHdpbGwKKyAqCXJlYWQgaW4gdGhlIG1lbW9yeSBtYXAsIGFuZCBnZXQgdGhlIHNob3cgb24gdGhlIHJvYWQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfc3RhcnRicmQoc3RsaWJyZF90ICpicmRwKQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIGNka21lbV90CSptZW1wOworCXZvbGF0aWxlIGNka2FzeV90CSphcDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdGxpcG9ydF90CQkqcG9ydHA7CisJaW50CQkJcG9ydG5yLCBucmRldnMsIGksIHJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zdGFydGJyZChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCXJjID0gMDsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwlucmRldnMgPSBoZHJwLT5ucmRldnM7CisKKyNpZiAwCisJcHJpbnRrKCIlcyglZCk6IENESyB2ZXJzaW9uICVkLiVkLiVkIC0tPiAiCisJCSJucmRldnM9JWQgbWVtcD0leCBob3N0cD0leCBzbGF2ZXA9JXhcbiIsCisJCSBfX0ZJTEVfXywgX19MSU5FX18sIGhkcnAtPnZlcl9yZWxlYXNlLCBoZHJwLT52ZXJfbW9kaWZpY2F0aW9uLAorCQkgaGRycC0+dmVyX2ZpeCwgbnJkZXZzLCAoaW50KSBoZHJwLT5tZW1wLCAoaW50KSBoZHJwLT5ob3N0cCwKKwkJIChpbnQpIGhkcnAtPnNsYXZlcCk7CisjZW5kaWYKKworCWlmIChucmRldnMgPCAoYnJkcC0+bnJwb3J0cyArIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNsYXZlIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCQkiYWxsIGRldmljZXMsIGRldmljZXM9JWRcbiIsIG5yZGV2cyk7CisJCWJyZHAtPm5ycG9ydHMgPSBucmRldnMgLSAxOworCX0KKwlicmRwLT5ucmRldnMgPSBucmRldnM7CisJYnJkcC0+aG9zdG9mZnNldCA9IGhkcnAtPmhvc3RwIC0gQ0RLX0NES0FERFI7CisJYnJkcC0+c2xhdmVvZmZzZXQgPSBoZHJwLT5zbGF2ZXAgLSBDREtfQ0RLQUREUjsKKwlicmRwLT5iaXRzaXplID0gKG5yZGV2cyArIDcpIC8gODsKKwltZW1wID0gKHZvbGF0aWxlIGNka21lbV90ICopIGhkcnAtPm1lbXA7CisJaWYgKCgodW5zaWduZWQgbG9uZykgbWVtcCkgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGNvcnJ1cHRlZCBzaGFyZWQgbWVtb3J5IHJlZ2lvbj9cbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gc3RsaV9kb25lc3RhcnR1cDsKKwl9CisJbWVtcCA9ICh2b2xhdGlsZSBjZGttZW1fdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsICh1bnNpZ25lZCBsb25nKSBtZW1wKTsKKwlpZiAobWVtcC0+ZHR5cGUgIT0gVFlQX0FTWU5DVFJMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IG5vIHNsYXZlIGNvbnRyb2wgZGV2aWNlIGZvdW5kXG4iKTsKKwkJZ290byBzdGxpX2RvbmVzdGFydHVwOworCX0KKwltZW1wKys7CisKKy8qCisgKglDeWNsZSB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIG9mIGVhY2ggcG9ydC4gV2UgYXJlIGd1YXJhbnRlZWQgdG8KKyAqCWhhdmUgYWxsIHBvcnRzIGluc2lkZSB0aGUgZmlyc3QgcGFnZSBvZiBzbGF2ZSB3aW5kb3csIHNvIG5vIG5lZWQgdG8KKyAqCWNoYW5nZSBwYWdlcyB3aGlsZSByZWFkaW5nIG1lbW9yeSBtYXAuCisgKi8KKwlmb3IgKGkgPSAxLCBwb3J0bnIgPSAwOyAoaSA8IG5yZGV2cyk7IGkrKywgcG9ydG5yKyssIG1lbXArKykgeworCQlpZiAobWVtcC0+ZHR5cGUgIT0gVFlQX0FTWU5DKQorCQkJYnJlYWs7CisJCXBvcnRwID0gYnJkcC0+cG9ydHNbcG9ydG5yXTsKKwkJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCQlicmVhazsKKwkJcG9ydHAtPmRldm5yID0gaTsKKwkJcG9ydHAtPmFkZHIgPSBtZW1wLT5vZmZzZXQ7CisJCXBvcnRwLT5yZXFiaXQgPSAodW5zaWduZWQgY2hhcikgKDB4MSA8PCAoaSAqIDggLyBucmRldnMpKTsKKwkJcG9ydHAtPnBvcnRpZHggPSAodW5zaWduZWQgY2hhcikgKGkgLyA4KTsKKwkJcG9ydHAtPnBvcnRiaXQgPSAodW5zaWduZWQgY2hhcikgKDB4MSA8PCAoaSAlIDgpKTsKKwl9CisKKwloZHJwLT5zbGF2ZXJlcSA9IDB4ZmY7CisKKy8qCisgKglGb3IgZWFjaCBwb3J0IHNldHVwIGEgbG9jYWwgY29weSBvZiB0aGUgUlggYW5kIFRYIGJ1ZmZlciBvZmZzZXRzCisgKglhbmQgc2l6ZXMuIFdlIGRvIHRoaXMgc2VwYXJhdGUgZnJvbSB0aGUgYWJvdmUsIGJlY2F1c2Ugd2UgbmVlZCB0bworICoJbW92ZSB0aGUgc2hhcmVkIG1lbW9yeSBwYWdlLi4uCisgKi8KKwlmb3IgKGkgPSAxLCBwb3J0bnIgPSAwOyAoaSA8IG5yZGV2cyk7IGkrKywgcG9ydG5yKyspIHsKKwkJcG9ydHAgPSBicmRwLT5wb3J0c1twb3J0bnJdOworCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJCWJyZWFrOworCQlpZiAocG9ydHAtPmFkZHIgPT0gMCkKKwkJCWJyZWFrOworCQlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwkJaWYgKGFwICE9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBOVUxMKSB7CisJCQlwb3J0cC0+cnhzaXplID0gYXAtPnJ4cS5zaXplOworCQkJcG9ydHAtPnR4c2l6ZSA9IGFwLT50eHEuc2l6ZTsKKwkJCXBvcnRwLT5yeG9mZnNldCA9IGFwLT5yeHEub2Zmc2V0OworCQkJcG9ydHAtPnR4b2Zmc2V0ID0gYXAtPnR4cS5vZmZzZXQ7CisJCX0KKwl9CisKK3N0bGlfZG9uZXN0YXJ0dXA6CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlpZiAocmMgPT0gMCkKKwkJYnJkcC0+c3RhdGUgfD0gQlNUX1NUQVJURUQ7CisKKwlpZiAoISBzdGxpX3RpbWVyb24pIHsKKwkJc3RsaV90aW1lcm9uKys7CisJCXN0bGlfdGltZXJsaXN0LmV4cGlyZXMgPSBTVExJX1RJTUVPVVQ7CisJCWFkZF90aW1lcigmc3RsaV90aW1lcmxpc3QpOworCX0KKworCXJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVByb2JlIGFuZCBpbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgYm9hcmQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc3RsaV9icmRpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2JyZGluaXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlzdGxpX2JyZHNbYnJkcC0+YnJkbnJdID0gYnJkcDsKKworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCWNhc2UgQlJEX0VDUDoKKwljYXNlIEJSRF9FQ1BFOgorCWNhc2UgQlJEX0VDUE1DOgorCWNhc2UgQlJEX0VDUFBDSToKKwkJc3RsaV9pbml0ZWNwKGJyZHApOworCQlicmVhazsKKwljYXNlIEJSRF9PTkJPQVJEOgorCWNhc2UgQlJEX09OQk9BUkRFOgorCWNhc2UgQlJEX09OQk9BUkQyOgorCWNhc2UgQlJEX09OQk9BUkQzMjoKKwljYXNlIEJSRF9PTkJPQVJEMl8zMjoKKwljYXNlIEJSRF9PTkJPQVJEUlM6CisJY2FzZSBCUkRfQlJVTUJZNDoKKwljYXNlIEJSRF9CUlVNQlk4OgorCWNhc2UgQlJEX0JSVU1CWTE2OgorCWNhc2UgQlJEX1NUQUxMSU9OOgorCQlzdGxpX2luaXRvbmIoYnJkcCk7CisJCWJyZWFrOworCWNhc2UgQlJEX0VBU1lJTzoKKwljYXNlIEJSRF9FQ0g6CisJY2FzZSBCUkRfRUNITUM6CisJY2FzZSBCUkRfRUNIUENJOgorCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiAlcyBib2FyZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gIgorCQkJCSJ0aGlzIGRyaXZlclxuIiwgc3RsaV9icmRuYW1lc1ticmRwLT5icmR0eXBlXSk7CisJCXJldHVybihFTk9ERVYpOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGJvYXJkPSVkIGlzIHVua25vd24gYm9hcmQgIgorCQkJCSJ0eXBlPSVkXG4iLCBicmRwLT5icmRuciwgYnJkcC0+YnJkdHlwZSk7CisJCXJldHVybihFTk9ERVYpOworCX0KKworCWlmICgoYnJkcC0+c3RhdGUgJiBCU1RfRk9VTkQpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogJXMgYm9hcmQgbm90IGZvdW5kLCBib2FyZD0lZCAiCisJCQkJImlvPSV4IG1lbT0leFxuIiwKKwkJCXN0bGlfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sIGJyZHAtPmJyZG5yLAorCQkJYnJkcC0+aW9iYXNlLCAoaW50KSBicmRwLT5tZW1hZGRyKTsKKwkJcmV0dXJuKEVOT0RFVik7CisJfQorCisJc3RsaV9pbml0cG9ydHMoYnJkcCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiU1RBTExJT046ICVzIGZvdW5kLCBib2FyZD0lZCBpbz0leCBtZW09JXggIgorCQkibnJwYW5lbHM9JWQgbnJwb3J0cz0lZFxuIiwgc3RsaV9icmRuYW1lc1ticmRwLT5icmR0eXBlXSwKKwkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYmFzZSwgKGludCkgYnJkcC0+bWVtYWRkciwKKwkJYnJkcC0+bnJwYW5lbHMsIGJyZHAtPm5ycG9ydHMpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUHJvYmUgYXJvdW5kIHRyeWluZyB0byBmaW5kIHdoZXJlIHRoZSBFSVNBIGJvYXJkcyBzaGFyZWQgbWVtb3J5CisgKgltaWdodCBiZS4gVGhpcyBpcyBhIGJpdCBpZiBoYWNrLCBidXQgaXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9laXNhbWVtcHJvYmUoc3RsaWJyZF90ICpicmRwKQoreworCWNka2VjcHNpZ190CWVjcHNpZywgKmVjcHNpZ3A7CisJY2Rrb25ic2lnX3QJb25ic2lnLCAqb25ic2lncDsKKwlpbnQJCWksIGZvdW5kaXQ7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2Vpc2FtZW1wcm9iZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworLyoKKyAqCUZpcnN0IHVwIHdlIHJlc2V0IHRoZSBib2FyZCwgdG8gZ2V0IGl0IGludG8gYSBrbm93biBzdGF0ZS4gVGhlcmUKKyAqCWlzIG9ubHkgMiBib2FyZCB0eXBlcyBoZXJlIHdlIG5lZWQgdG8gd29ycnkgYWJvdXQuIERvbjt0IHVzZSB0aGUKKyAqCXN0YW5kYXJkIGJvYXJkIGluaXQgcm91dGluZSBoZXJlLCBpdCBwcm9ncmFtcyB1cCB0aGUgc2hhcmVkCisgKgltZW1vcnkgYWRkcmVzcywgYW5kIHdlIGRvbid0IGtub3cgaXQgeWV0Li4uCisgKi8KKwlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNQRSkgeworCQlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUJSREVOQUIpKTsKKwkJb3V0YihFQ1BfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwkJdWRlbGF5KDUwMCk7CisJCXN0bGlfZWNwZWllbmFibGUoYnJkcCk7CisJfSBlbHNlIGlmIChicmRwLT5icmR0eXBlID09IEJSRF9PTkJPQVJERSkgeworCQlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUJSREVOQUIpKTsKKwkJb3V0YihPTkJfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3V0YihPTkJfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwkJbWRlbGF5KDEwMCk7CisJCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCQltZGVsYXkoMSk7CisJCXN0bGlfb25iZWVuYWJsZShicmRwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJZm91bmRpdCA9IDA7CisJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOworCisvKgorICoJQm9hcmQgc2hhcmVkIG1lbW9yeSBpcyBlbmFibGVkLCBzbyBub3cgd2UgaGF2ZSBhIHBva2UgYXJvdW5kIGFuZAorICoJc2VlIGlmIHdlIGNhbiBmaW5kIGl0LgorICovCisJZm9yIChpID0gMDsgKGkgPCBzdGxpX2Vpc2FtZW1wc2l6ZSk7IGkrKykgeworCQlicmRwLT5tZW1hZGRyID0gc3RsaV9laXNhbWVtcHJvYmVhZGRyc1tpXTsKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbWJhc2UgPSBpb3JlbWFwKGJyZHAtPm1lbWFkZHIsIGJyZHAtPm1lbXNpemUpOworCQlpZiAoYnJkcC0+bWVtYmFzZSA9PSAodm9pZCAqKSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDUEUpIHsKKwkJCWVjcHNpZ3AgPSAoY2RrZWNwc2lnX3QgKikgc3RsaV9lY3BlaWdldG1lbXB0cihicmRwLAorCQkJCUNES19TSUdBRERSLCBfX0xJTkVfXyk7CisJCQltZW1jcHkoJmVjcHNpZywgZWNwc2lncCwgc2l6ZW9mKGNka2VjcHNpZ190KSk7CisJCQlpZiAoZWNwc2lnLm1hZ2ljID09IEVDUF9NQUdJQykKKwkJCQlmb3VuZGl0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCW9uYnNpZ3AgPSAoY2Rrb25ic2lnX3QgKikgc3RsaV9vbmJlZ2V0bWVtcHRyKGJyZHAsCisJCQkJQ0RLX1NJR0FERFIsIF9fTElORV9fKTsKKwkJCW1lbWNweSgmb25ic2lnLCBvbmJzaWdwLCBzaXplb2YoY2Rrb25ic2lnX3QpKTsKKwkJCWlmICgob25ic2lnLm1hZ2ljMCA9PSBPTkJfTUFHSUMwKSAmJgorCQkJICAgIChvbmJzaWcubWFnaWMxID09IE9OQl9NQUdJQzEpICYmCisJCQkgICAgKG9uYnNpZy5tYWdpYzIgPT0gT05CX01BR0lDMikgJiYKKwkJCSAgICAob25ic2lnLm1hZ2ljMyA9PSBPTkJfTUFHSUMzKSkKKwkJCQlmb3VuZGl0ID0gMTsKKwkJfQorCisJCWlvdW5tYXAoYnJkcC0+bWVtYmFzZSk7CisJCWlmIChmb3VuZGl0KQorCQkJYnJlYWs7CisJfQorCisvKgorICoJUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGZvdW5kIHRoZSBzaGFyZWQgbWVtb3J5IG9yIG5vdCB3ZSBtdXN0CisgKglkaXNhYmxlIHRoZSByZWdpb24uIEFmdGVyIHRoYXQgcmV0dXJuIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqLworCWlmIChicmRwLT5icmR0eXBlID09IEJSRF9FQ1BFKQorCQlzdGxpX2VjcGVpZGlzYWJsZShicmRwKTsKKwllbHNlCisJCXN0bGlfb25iZWRpc2FibGUoYnJkcCk7CisKKwlpZiAoISBmb3VuZGl0KSB7CisJCWJyZHAtPm1lbWFkZHIgPSAwOworCQlicmRwLT5tZW1iYXNlID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIHByb2JlIHNoYXJlZCBtZW1vcnkgIgorCQkJCSJyZWdpb24gZm9yICVzIGluIEVJU0Egc2xvdD0lZFxuIiwKKwkJCXN0bGlfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sIChicmRwLT5pb2Jhc2UgPj4gMTIpKTsKKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc3RsaV9nZXRicmRucih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNUTF9NQVhCUkRTOyBpKyspIHsKKwkJaWYgKCFzdGxpX2JyZHNbaV0pIHsKKwkJCWlmIChpID49IHN0bGlfbnJicmRzKQorCQkJCXN0bGlfbnJicmRzID0gaSArIDE7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVByb2JlIGFyb3VuZCBhbmQgdHJ5IHRvIGZpbmQgYW55IEVJU0EgYm9hcmRzIGluIHN5c3RlbS4gVGhlIGJpZ2dlc3QKKyAqCXByb2JsZW0gaGVyZSBpcyBmaW5kaW5nIG91dCB3aGF0IG1lbW9yeSBhZGRyZXNzIGlzIGFzc29jaWF0ZWQgd2l0aAorICoJYW4gRUlTQSBib2FyZCBhZnRlciBpdCBpcyBmb3VuZC4gVGhlIHJlZ2lzdGVycyBvZiB0aGUgRUNQRSBhbmQKKyAqCU9OYm9hcmRFIGFyZSBub3QgcmVhZGFibGUgLSBzbyB3ZSBjYW4ndCByZWFkIHRoZW0gZnJvbSB0aGVyZS4gV2UKKyAqCWRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBFSVNBIENNT1MgKG9yIEVJU0EgQklPUykgc28gd2UgZG9uJ3QKKyAqCWFjdHVhbGx5IGhhdmUgYW55IHdheSB0byBmaW5kIG91dCB0aGUgcmVhbCB2YWx1ZS4gVGhlIGJlc3Qgd2UgY2FuCisgKglkbyBpcyBnbyBwcm9iaW5nIGFyb3VuZCBpbiB0aGUgdXN1YWwgcGxhY2VzIGhvcGluZyB3ZSBjYW4gZmluZCBpdC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZmluZGVpc2FicmRzKHZvaWQpCit7CisJc3RsaWJyZF90CSpicmRwOworCXVuc2lnbmVkIGludAlpb2Jhc2UsIGVpZDsKKwlpbnQJCWk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2ZpbmRlaXNhYnJkcygpXG4iKTsKKyNlbmRpZgorCisvKgorICoJRmlyc3RseSBjaGVjayBpZiB0aGlzIGlzIGFuIEVJU0Egc3lzdGVtLiBEbyB0aGlzIGJ5IHByb2JpbmcgZm9yCisgKgl0aGUgc3lzdGVtIGJvYXJkIEVJU0EgSUQuIElmIHRoaXMgaXMgbm90IGFuIEVJU0Egc3lzdGVtIHRoZW4KKyAqCWRvbid0IGJvdGhlciBnb2luZyBhbnkgZnVydGhlciEKKyAqLworCW91dGIoMHhmZiwgMHhjODApOworCWlmIChpbmIoMHhjODApID09IDB4ZmYpCisJCXJldHVybigwKTsKKworLyoKKyAqCUxvb2tzIGxpa2UgYW4gRUlTQSBzeXN0ZW0sIHNvIGdvIHNlYXJjaGluZyBmb3IgRUlTQSBib2FyZHMuCisgKi8KKwlmb3IgKGlvYmFzZSA9IDB4MTAwMDsgKGlvYmFzZSA8PSAweGMwMDApOyBpb2Jhc2UgKz0gMHgxMDAwKSB7CisJCW91dGIoMHhmZiwgKGlvYmFzZSArIDB4YzgwKSk7CisJCWVpZCA9IGluYihpb2Jhc2UgKyAweGM4MCk7CisJCWVpZCB8PSBpbmIoaW9iYXNlICsgMHhjODEpIDw8IDg7CisJCWlmIChlaWQgIT0gU1RMX0VJU0FJRCkKKwkJCWNvbnRpbnVlOworCisvKgorICoJCVdlIGhhdmUgZm91bmQgYSBib2FyZC4gTmVlZCB0byBjaGVjayBpZiB0aGlzIGJvYXJkIHdhcworICoJCXN0YXRpY2FsbHkgY29uZmlndXJlZCBhbHJlYWR5IChqdXN0IGluIGNhc2UhKS4KKyAqLworCQlmb3IgKGkgPSAwOyAoaSA8IFNUTF9NQVhCUkRTKTsgaSsrKSB7CisJCQlicmRwID0gc3RsaV9icmRzW2ldOworCQkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGJyZHAtPmlvYmFzZSA9PSBpb2Jhc2UpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPCBTVExfTUFYQlJEUykKKwkJCWNvbnRpbnVlOworCisvKgorICoJCVdlIGhhdmUgZm91bmQgYSBTdGFsbGlvbiBib2FyZCBhbmQgaXQgaXMgbm90IGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAqCQlBbGxvY2F0ZSBhIGJvYXJkIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZSBpdC4KKyAqLworCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PTUVNKTsKKwkJaWYgKChicmRwLT5icmRuciA9IHN0bGlfZ2V0YnJkbnIoKSkgPCAwKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQllaWQgPSBpbmIoaW9iYXNlICsgMHhjODIpOworCQlpZiAoZWlkID09IEVDUF9FSVNBSUQpCisJCQlicmRwLT5icmR0eXBlID0gQlJEX0VDUEU7CisJCWVsc2UgaWYgKGVpZCA9PSBPTkJfRUlTQUlEKQorCQkJYnJkcC0+YnJkdHlwZSA9IEJSRF9PTkJPQVJERTsKKwkJZWxzZQorCQkJYnJkcC0+YnJkdHlwZSA9IEJSRF9VTktOT1dOOworCQlicmRwLT5pb2Jhc2UgPSBpb2Jhc2U7CisJCW91dGIoMHgxLCAoaW9iYXNlICsgMHhjODQpKTsKKwkJaWYgKHN0bGlfZWlzYW1lbXByb2JlKGJyZHApKQorCQkJb3V0YigwLCAoaW9iYXNlICsgMHhjODQpKTsKKwkJc3RsaV9icmRpbml0KGJyZHApOworCX0KKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmluZCB0aGUgbmV4dCBhdmFpbGFibGUgYm9hcmQgbnVtYmVyIHRoYXQgaXMgZnJlZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglDT05GSUdfUENJCisKKy8qCisgKglXZSBoYXZlIGEgU3RhbGxpb24gYm9hcmQuIEFsbG9jYXRlIGEgYm9hcmQgc3RydWN0dXJlIGFuZAorICoJaW5pdGlhbGl6ZSBpdC4gUmVhZCBpdHMgSU8gYW5kIE1FTU9SWSByZXNvdXJjZXMgZnJvbSBQQ0kKKyAqCWNvbmZpZ3VyYXRpb24gc3BhY2UuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRwY2licmQoaW50IGJyZHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpkZXZwKQoreworCXN0bGlicmRfdAkqYnJkcDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaW5pdHBjaWJyZChicmR0eXBlPSVkLGJ1c25yPSV4LGRldm5yPSV4KVxuIiwKKwkJYnJkdHlwZSwgZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CisjZW5kaWYKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXZwKSkKKwkJcmV0dXJuKC1FSU8pOworCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT01FTSk7CisJaWYgKChicmRwLT5icmRuciA9IHN0bGlfZ2V0YnJkbnIoKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgZm91bmQsICIKKwkJCSJtYXhpbXVtIHN1cHBvcnRlZCAlZFxuIiwgU1RMX01BWEJSRFMpOworCQlyZXR1cm4oMCk7CisJfQorCWJyZHAtPmJyZHR5cGUgPSBicmR0eXBlOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMoJWQpOiBCQVJbXT0lbHgsJWx4LCVseCwlbHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDApLAorCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMSksCisJCXBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKSwKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDMpKTsKKyNlbmRpZgorCisvKgorICoJV2UgaGF2ZSBhbGwgcmVzb3VyY2VzIGZyb20gdGhlIGJvYXJkLCBzbyBsZXRzIHNldHVwIHRoZSBhY3R1YWwKKyAqCWJvYXJkIHN0cnVjdHVyZSBub3cuCisgKi8KKwlicmRwLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMyk7CisJYnJkcC0+bWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKTsKKwlzdGxpX2JyZGluaXQoYnJkcCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpbmQgYWxsIFN0YWxsaW9uIFBDSSBib2FyZHMgdGhhdCBtaWdodCBiZSBpbnN0YWxsZWQuIEluaXRpYWxpemUgZWFjaAorICoJb25lIGFzIGl0IGlzIGZvdW5kLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9maW5kcGNpYnJkcyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2CSpkZXYgPSBOVUxMOworCWludAkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9maW5kcGNpYnJkcygpXG4iKTsKKyNlbmRpZgorCisJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TVEFMTElPTiwKKwkgICAgUENJX0RFVklDRV9JRF9FQ1JBLCBkZXYpKSkgeworCQlpZiAoKHJjID0gc3RsaV9pbml0cGNpYnJkKEJSRF9FQ1BQQ0ksIGRldikpKQorCQkJcmV0dXJuKHJjKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBbGxvY2F0ZSBhIG5ldyBib2FyZCBzdHJ1Y3R1cmUuIEZpbGwgb3V0IHRoZSBiYXNpYyBpbmZvIGluIGl0LgorICovCisKK3N0YXRpYyBzdGxpYnJkX3QgKnN0bGlfYWxsb2NicmQodm9pZCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisKKwlicmRwID0gKHN0bGlicmRfdCAqKSBzdGxpX21lbWFsbG9jKHNpemVvZihzdGxpYnJkX3QpKTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJIihzaXplPSVkKVxuIiwgc2l6ZW9mKHN0bGlicmRfdCkpOworCQlyZXR1cm4oKHN0bGlicmRfdCAqKSBOVUxMKTsKKwl9CisKKwltZW1zZXQoYnJkcCwgMCwgc2l6ZW9mKHN0bGlicmRfdCkpOworCWJyZHAtPm1hZ2ljID0gU1RMSV9CT0FSRE1BR0lDOworCXJldHVybihicmRwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2NhbiB0aHJvdWdoIGFsbCB0aGUgYm9hcmRzIGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCBzZWUgd2hhdCB3ZQorICoJY2FuIGZpbmQuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRicmRzKHZvaWQpCit7CisJc3RsaWJyZF90CSpicmRwLCAqbnh0YnJkcDsKKwlzdGxjb25mX3QJKmNvbmZwOworCWludAkJaSwgajsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaW5pdGJyZHMoKVxuIik7CisjZW5kaWYKKworCWlmIChzdGxpX25yYnJkcyA+IFNUTF9NQVhCUkRTKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgaW4gY29uZmlndXJhdGlvbiAiCisJCQkidGFibGUsIHRydW5jYXRpbmcgdG8gJWRcbiIsIFNUTF9NQVhCUkRTKTsKKwkJc3RsaV9ucmJyZHMgPSBTVExfTUFYQlJEUzsKKwl9CisKKy8qCisgKglGaXJzdGx5IHNjYW4gdGhlIGxpc3Qgb2Ygc3RhdGljIGJvYXJkcyBjb25maWd1cmVkLiBBbGxvY2F0ZQorICoJcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIHRoZSBib2FyZHMgYXMgZm91bmQuIElmIHRoaXMgaXMgYQorICoJbW9kdWxlIHRoZW4gbGV0IHRoZSBtb2R1bGUgYXJncyBvdmVycmlkZSBzdGF0aWMgY29uZmlndXJhdGlvbi4KKyAqLworCWZvciAoaSA9IDA7IChpIDwgc3RsaV9ucmJyZHMpOyBpKyspIHsKKwkJY29uZnAgPSAmc3RsaV9icmRjb25mW2ldOworI2lmZGVmIE1PRFVMRQorCQlzdGxpX3BhcnNlYnJkKGNvbmZwLCBzdGxpX2JyZHNwW2ldKTsKKyNlbmRpZgorCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PTUVNKTsKKwkJYnJkcC0+YnJkbnIgPSBpOworCQlicmRwLT5icmR0eXBlID0gY29uZnAtPmJyZHR5cGU7CisJCWJyZHAtPmlvYmFzZSA9IGNvbmZwLT5pb2FkZHIxOworCQlicmRwLT5tZW1hZGRyID0gY29uZnAtPm1lbWFkZHI7CisJCXN0bGlfYnJkaW5pdChicmRwKTsKKwl9CisKKy8qCisgKglTdGF0aWMgY29uZmlndXJhdGlvbiB0YWJsZSBkb25lLCBzbyBub3cgdXNlIGR5bmFtaWMgbWV0aG9kcyB0bworICoJc2VlIGlmIGFueSBtb3JlIGJvYXJkcyBzaG91bGQgYmUgY29uZmlndXJlZC4KKyAqLworI2lmZGVmIE1PRFVMRQorCXN0bGlfYXJnYnJkcygpOworI2VuZGlmCisJaWYgKHN0bGlfZWlzYXByb2JlKQorCQlzdGxpX2ZpbmRlaXNhYnJkcygpOworI2lmZGVmIENPTkZJR19QQ0kKKwlzdGxpX2ZpbmRwY2licmRzKCk7CisjZW5kaWYKKworLyoKKyAqCUFsbCBmb3VuZCBib2FyZHMgYXJlIGluaXRpYWxpemVkLiBOb3cgZm9yIGEgbGl0dGxlIG9wdGltaXphdGlvbiwgaWYKKyAqCW5vIGJvYXJkcyBhcmUgc2hhcmluZyB0aGUgInNoYXJlZCBtZW1vcnkiIHJlZ2lvbnMgdGhlbiB3ZSBjYW4ganVzdAorICoJbGVhdmUgdGhlbSBhbGwgZW5hYmxlZC4gVGhpcyBpcyBpbiBmYWN0IHRoZSB1c3VhbCBjYXNlLgorICovCisJc3RsaV9zaGFyZWQgPSAwOworCWlmIChzdGxpX25yYnJkcyA+IDEpIHsKKwkJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQkJYnJkcCA9IHN0bGlfYnJkc1tpXTsKKwkJCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IGkgKyAxOyAoaiA8IHN0bGlfbnJicmRzKTsgaisrKSB7CisJCQkJbnh0YnJkcCA9IHN0bGlfYnJkc1tqXTsKKwkJCQlpZiAobnh0YnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoYnJkcC0+bWVtYmFzZSA+PSBueHRicmRwLT5tZW1iYXNlKSAmJgorCQkJCSAgICAoYnJkcC0+bWVtYmFzZSA8PSAobnh0YnJkcC0+bWVtYmFzZSArCisJCQkJICAgIG54dGJyZHAtPm1lbXNpemUgLSAxKSkpIHsKKwkJCQkJc3RsaV9zaGFyZWQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKHN0bGlfc2hhcmVkID09IDApIHsKKwkJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQkJYnJkcCA9IHN0bGlfYnJkc1tpXTsKKwkJCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChicmRwLT5zdGF0ZSAmIEJTVF9GT1VORCkgeworCQkJCUVCUkRFTkFCTEUoYnJkcCk7CisJCQkJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwkJCQlicmRwLT5kaXNhYmxlID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29kZSB0byBoYW5kbGUgYW4gInN0YWxpb21lbSIgcmVhZCBvcGVyYXRpb24uIFRoaXMgZGV2aWNlIGlzIHRoZSAKKyAqCWNvbnRlbnRzIG9mIHRoZSBib2FyZCBzaGFyZWQgbWVtb3J5LiBJdCBpcyB1c2VkIGZvciBkb3duIGxvYWRpbmcKKyAqCXRoZSBzbGF2ZSBpbWFnZSAoYW5kIGRlYnVnZ2luZyA6LSkKKyAqLworCitzdGF0aWMgc3NpemVfdCBzdGxpX21lbXJlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXZvaWQJCSptZW1wdHI7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJYnJkbnIsIHNpemUsIG47CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX21lbXJlYWQoZnA9JXgsYnVmPSV4LGNvdW50PSV4LG9mZnA9JXgpXG4iLAorCQkJKGludCkgZnAsIChpbnQpIGJ1ZiwgY291bnQsIChpbnQpIG9mZnApOworI2VuZGlmCisKKwlicmRuciA9IGltaW5vcihmcC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChicmRuciA+PSBzdGxpX25yYnJkcykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGZwLT5mX3BvcyA+PSBicmRwLT5tZW1zaXplKQorCQlyZXR1cm4oMCk7CisKKwlzaXplID0gTUlOKGNvdW50LCAoYnJkcC0+bWVtc2l6ZSAtIGZwLT5mX3BvcykpOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJbWVtcHRyID0gKHZvaWQgKikgRUJSREdFVE1FTVBUUihicmRwLCBmcC0+Zl9wb3MpOworCQluID0gTUlOKHNpemUsIChicmRwLT5wYWdlc2l6ZSAtICgoKHVuc2lnbmVkIGxvbmcpIGZwLT5mX3BvcykgJSBicmRwLT5wYWdlc2l6ZSkpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIG1lbXB0ciwgbikpIHsKKwkJCWNvdW50ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZwLT5mX3BvcyArPSBuOworCQlidWYgKz0gbjsKKwkJc2l6ZSAtPSBuOworCX0KK291dDoKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybihjb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNvZGUgdG8gaGFuZGxlIGFuICJzdGFsaW9tZW0iIHdyaXRlIG9wZXJhdGlvbi4gVGhpcyBkZXZpY2UgaXMgdGhlIAorICoJY29udGVudHMgb2YgdGhlIGJvYXJkIHNoYXJlZCBtZW1vcnkuIEl0IGlzIHVzZWQgZm9yIGRvd24gbG9hZGluZworICoJdGhlIHNsYXZlIGltYWdlIChhbmQgZGVidWdnaW5nIDotKQorICovCisKK3N0YXRpYyBzc2l6ZV90IHN0bGlfbWVtd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXZvaWQJCSptZW1wdHI7CisJc3RsaWJyZF90CSpicmRwOworCWNoYXIJCV9fdXNlciAqY2hidWY7CisJaW50CQlicmRuciwgc2l6ZSwgbjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfbWVtd3JpdGUoZnA9JXgsYnVmPSV4LGNvdW50PSV4LG9mZnA9JXgpXG4iLAorCQkJKGludCkgZnAsIChpbnQpIGJ1ZiwgY291bnQsIChpbnQpIG9mZnApOworI2VuZGlmCisKKwlicmRuciA9IGltaW5vcihmcC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChicmRuciA+PSBzdGxpX25yYnJkcykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGZwLT5mX3BvcyA+PSBicmRwLT5tZW1zaXplKQorCQlyZXR1cm4oMCk7CisKKwljaGJ1ZiA9IChjaGFyIF9fdXNlciAqKSBidWY7CisJc2l6ZSA9IE1JTihjb3VudCwgKGJyZHAtPm1lbXNpemUgLSBmcC0+Zl9wb3MpKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCW1lbXB0ciA9ICh2b2lkICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgZnAtPmZfcG9zKTsKKwkJbiA9IE1JTihzaXplLCAoYnJkcC0+cGFnZXNpemUgLSAoKCh1bnNpZ25lZCBsb25nKSBmcC0+Zl9wb3MpICUgYnJkcC0+cGFnZXNpemUpKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihtZW1wdHIsIGNoYnVmLCBuKSkgeworCQkJY291bnQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJZnAtPmZfcG9zICs9IG47CisJCWNoYnVmICs9IG47CisJCXNpemUgLT0gbjsKKwl9CitvdXQ6CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4oY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGJvYXJkIHN0YXRzIHN0cnVjdHVyZSB0byB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0YnJkc3RhdHMoY29tYnJkX3QgX191c2VyICpicCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxpX2JyZHN0YXRzLCBicCwgc2l6ZW9mKGNvbWJyZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzdGxpX2JyZHN0YXRzLmJyZCA+PSBTVExfTUFYQlJEUykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbc3RsaV9icmRzdGF0cy5icmRdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJbWVtc2V0KCZzdGxpX2JyZHN0YXRzLCAwLCBzaXplb2YoY29tYnJkX3QpKTsKKwlzdGxpX2JyZHN0YXRzLmJyZCA9IGJyZHAtPmJyZG5yOworCXN0bGlfYnJkc3RhdHMudHlwZSA9IGJyZHAtPmJyZHR5cGU7CisJc3RsaV9icmRzdGF0cy5od2lkID0gMDsKKwlzdGxpX2JyZHN0YXRzLnN0YXRlID0gYnJkcC0+c3RhdGU7CisJc3RsaV9icmRzdGF0cy5pb2FkZHIgPSBicmRwLT5pb2Jhc2U7CisJc3RsaV9icmRzdGF0cy5tZW1hZGRyID0gYnJkcC0+bWVtYWRkcjsKKwlzdGxpX2JyZHN0YXRzLm5ycGFuZWxzID0gYnJkcC0+bnJwYW5lbHM7CisJc3RsaV9icmRzdGF0cy5ucnBvcnRzID0gYnJkcC0+bnJwb3J0czsKKwlmb3IgKGkgPSAwOyAoaSA8IGJyZHAtPm5ycGFuZWxzKTsgaSsrKSB7CisJCXN0bGlfYnJkc3RhdHMucGFuZWxzW2ldLnBhbmVsID0gaTsKKwkJc3RsaV9icmRzdGF0cy5wYW5lbHNbaV0uaHdpZCA9IGJyZHAtPnBhbmVsaWRzW2ldOworCQlzdGxpX2JyZHN0YXRzLnBhbmVsc1tpXS5ucnBvcnRzID0gYnJkcC0+cGFuZWxzW2ldOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYnAsICZzdGxpX2JyZHN0YXRzLCBzaXplb2YoY29tYnJkX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXNvbHZlIHRoZSByZWZlcmVuY2VkIHBvcnQgbnVtYmVyIGludG8gYSBwb3J0IHN0cnVjdCBwb2ludGVyLgorICovCisKK3N0YXRpYyBzdGxpcG9ydF90ICpzdGxpX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucikKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlpOworCisJaWYgKChicmRuciA8IDApIHx8IChicmRuciA+PSBTVExfTUFYQlJEUykpCisJCXJldHVybigoc3RsaXBvcnRfdCAqKSBOVUxMKTsKKwlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigoc3RsaXBvcnRfdCAqKSBOVUxMKTsKKwlmb3IgKGkgPSAwOyAoaSA8IHBhbmVsbnIpOyBpKyspCisJCXBvcnRuciArPSBicmRwLT5wYW5lbHNbaV07CisJaWYgKChwb3J0bnIgPCAwKSB8fCAocG9ydG5yID49IGJyZHAtPm5ycG9ydHMpKQorCQlyZXR1cm4oKHN0bGlwb3J0X3QgKikgTlVMTCk7CisJcmV0dXJuKGJyZHAtPnBvcnRzW3BvcnRucl0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIHBvcnQgc3RhdHMgc3RydWN0dXJlIHRvIHVzZXIgYXBwLiBBIE5VTEwgcG9ydCBzdHJ1Y3QKKyAqCXBvaW50ZXIgcGFzc2VkIGluIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBmaW5kIG91dCBmcm9tIHRoZSBhcHAKKyAqCXdoYXQgcG9ydCB0byBnZXQgc3RhdHMgZm9yICh1c2VkIHRocm91Z2ggYm9hcmQgY29udHJvbCBkZXZpY2UpLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9wb3J0Y21kc3RhdHMoc3RsaXBvcnRfdCAqcG9ydHApCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlyYzsKKworCW1lbXNldCgmc3RsaV9jb21zdGF0cywgMCwgc2l6ZW9mKGNvbXN0YXRzX3QpKTsKKworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJaWYgKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpIHsKKwkJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9HRVRTVEFUUywKKwkJICAgICZzdGxpX2Nka3N0YXRzLCBzaXplb2YoYXN5c3RhdHNfdCksIDEpKSA8IDApCisJCQlyZXR1cm4ocmMpOworCX0gZWxzZSB7CisJCW1lbXNldCgmc3RsaV9jZGtzdGF0cywgMCwgc2l6ZW9mKGFzeXN0YXRzX3QpKTsKKwl9CisKKwlzdGxpX2NvbXN0YXRzLmJyZCA9IHBvcnRwLT5icmRucjsKKwlzdGxpX2NvbXN0YXRzLnBhbmVsID0gcG9ydHAtPnBhbmVsbnI7CisJc3RsaV9jb21zdGF0cy5wb3J0ID0gcG9ydHAtPnBvcnRucjsKKwlzdGxpX2NvbXN0YXRzLnN0YXRlID0gcG9ydHAtPnN0YXRlOworCXN0bGlfY29tc3RhdHMuZmxhZ3MgPSBwb3J0cC0+ZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgeworCQlpZiAocG9ydHAtPnR0eS0+ZHJpdmVyX2RhdGEgPT0gcG9ydHApIHsKKwkJCXN0bGlfY29tc3RhdHMudHR5c3RhdGUgPSBwb3J0cC0+dHR5LT5mbGFnczsKKwkJCXN0bGlfY29tc3RhdHMucnhidWZmZXJlZCA9IHBvcnRwLT50dHktPmZsaXAuY291bnQ7CisJCQlpZiAocG9ydHAtPnR0eS0+dGVybWlvcyAhPSAoc3RydWN0IHRlcm1pb3MgKikgTlVMTCkgeworCQkJCXN0bGlfY29tc3RhdHMuY2ZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJCQlzdGxpX2NvbXN0YXRzLmlmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CisJCQkJc3RsaV9jb21zdGF0cy5vZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX29mbGFnOworCQkJCXN0bGlfY29tc3RhdHMubGZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19sZmxhZzsKKwkJCX0KKwkJfQorCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXN0bGlfY29tc3RhdHMudHh0b3RhbCA9IHN0bGlfY2Rrc3RhdHMudHhjaGFyczsKKwlzdGxpX2NvbXN0YXRzLnJ4dG90YWwgPSBzdGxpX2Nka3N0YXRzLnJ4Y2hhcnMgKyBzdGxpX2Nka3N0YXRzLnJpbmdvdmVyOworCXN0bGlfY29tc3RhdHMudHhidWZmZXJlZCA9IHN0bGlfY2Rrc3RhdHMudHhyaW5ncTsKKwlzdGxpX2NvbXN0YXRzLnJ4YnVmZmVyZWQgKz0gc3RsaV9jZGtzdGF0cy5yeHJpbmdxOworCXN0bGlfY29tc3RhdHMucnhvdmVycnVuID0gc3RsaV9jZGtzdGF0cy5vdmVycnVuczsKKwlzdGxpX2NvbXN0YXRzLnJ4cGFyaXR5ID0gc3RsaV9jZGtzdGF0cy5wYXJpdHk7CisJc3RsaV9jb21zdGF0cy5yeGZyYW1pbmcgPSBzdGxpX2Nka3N0YXRzLmZyYW1pbmc7CisJc3RsaV9jb21zdGF0cy5yeGxvc3QgPSBzdGxpX2Nka3N0YXRzLnJpbmdvdmVyOworCXN0bGlfY29tc3RhdHMucnhicmVha3MgPSBzdGxpX2Nka3N0YXRzLnJ4YnJlYWtzOworCXN0bGlfY29tc3RhdHMudHhicmVha3MgPSBzdGxpX2Nka3N0YXRzLnR4YnJlYWtzOworCXN0bGlfY29tc3RhdHMudHh4b24gPSBzdGxpX2Nka3N0YXRzLnR4c3RhcnQ7CisJc3RsaV9jb21zdGF0cy50eHhvZmYgPSBzdGxpX2Nka3N0YXRzLnR4c3RvcDsKKwlzdGxpX2NvbXN0YXRzLnJ4eG9uID0gc3RsaV9jZGtzdGF0cy5yeHN0YXJ0OworCXN0bGlfY29tc3RhdHMucnh4b2ZmID0gc3RsaV9jZGtzdGF0cy5yeHN0b3A7CisJc3RsaV9jb21zdGF0cy5yeHJ0c29mZiA9IHN0bGlfY2Rrc3RhdHMucnRzY250IC8gMjsKKwlzdGxpX2NvbXN0YXRzLnJ4cnRzb24gPSBzdGxpX2Nka3N0YXRzLnJ0c2NudCAtIHN0bGlfY29tc3RhdHMucnhydHNvZmY7CisJc3RsaV9jb21zdGF0cy5tb2RlbSA9IHN0bGlfY2Rrc3RhdHMuZGNkY250OworCXN0bGlfY29tc3RhdHMuaHdpZCA9IHN0bGlfY2Rrc3RhdHMuaHdpZDsKKwlzdGxpX2NvbXN0YXRzLnNpZ25hbHMgPSBzdGxpX21rdGlvY20oc3RsaV9jZGtzdGF0cy5zaWduYWxzKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBwb3J0IHN0YXRzIHN0cnVjdHVyZSB0byB1c2VyIGFwcC4gQSBOVUxMIHBvcnQgc3RydWN0CisgKglwb2ludGVyIHBhc3NlZCBpbiBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZmluZCBvdXQgZnJvbSB0aGUgYXBwCisgKgl3aGF0IHBvcnQgdG8gZ2V0IHN0YXRzIGZvciAodXNlZCB0aHJvdWdoIGJvYXJkIGNvbnRyb2wgZGV2aWNlKS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0cG9ydHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCit7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJcmM7CisKKwlpZiAoIXBvcnRwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9jb21zdGF0cy5icmQsIHN0bGlfY29tc3RhdHMucGFuZWwsCisJCQlzdGxpX2NvbXN0YXRzLnBvcnQpOworCQlpZiAoIXBvcnRwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmICghYnJkcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKHJjID0gc3RsaV9wb3J0Y21kc3RhdHMocG9ydHApKSA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBjb3B5X3RvX3VzZXIoY3AsICZzdGxpX2NvbXN0YXRzLCBzaXplb2YoY29tc3RhdHNfdCkpID8KKwkJCS1FRkFVTFQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDbGVhciB0aGUgcG9ydCBzdGF0cyBzdHJ1Y3R1cmUuIFdlIGFsc28gcmV0dXJuIGl0IHplcm9lZCBvdXQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfY2xycG9ydHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCit7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJcmM7CisKKwlpZiAoIXBvcnRwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9jb21zdGF0cy5icmQsIHN0bGlfY29tc3RhdHMucGFuZWwsCisJCQlzdGxpX2NvbXN0YXRzLnBvcnQpOworCQlpZiAoIXBvcnRwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmICghYnJkcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgeworCQlpZiAoKHJjID0gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0NMRUFSU1RBVFMsIE5VTEwsIDAsIDApKSA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJbWVtc2V0KCZzdGxpX2NvbXN0YXRzLCAwLCBzaXplb2YoY29tc3RhdHNfdCkpOworCXN0bGlfY29tc3RhdHMuYnJkID0gcG9ydHAtPmJyZG5yOworCXN0bGlfY29tc3RhdHMucGFuZWwgPSBwb3J0cC0+cGFuZWxucjsKKwlzdGxpX2NvbXN0YXRzLnBvcnQgPSBwb3J0cC0+cG9ydG5yOworCisJaWYgKGNvcHlfdG9fdXNlcihjcCwgJnN0bGlfY29tc3RhdHMsIHNpemVvZihjb21zdGF0c190KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGVudGlyZSBkcml2ZXIgcG9ydHMgc3RydWN0dXJlIHRvIGEgdXNlciBhcHAuCisgKi8KKworc3RhdGljIGludCBzdGxpX2dldHBvcnRzdHJ1Y3Qoc3RsaXBvcnRfdCBfX3VzZXIgKmFyZykKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9kdW1teXBvcnQsIGFyZywgc2l6ZW9mKHN0bGlwb3J0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9kdW1teXBvcnQuYnJkbnIsIHN0bGlfZHVtbXlwb3J0LnBhbmVsbnIsCisJCSBzdGxpX2R1bW15cG9ydC5wb3J0bnIpOworCWlmICghcG9ydHApCisJCXJldHVybiAtRU5PREVWOworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBwb3J0cCwgc2l6ZW9mKHN0bGlwb3J0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgZW50aXJlIGRyaXZlciBib2FyZCBzdHJ1Y3R1cmUgdG8gYSB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0YnJkc3RydWN0KHN0bGlicmRfdCBfX3VzZXIgKmFyZykKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bGlfZHVtbXlicmQsIGFyZywgc2l6ZW9mKHN0bGlicmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKHN0bGlfZHVtbXlicmQuYnJkbnIgPCAwKSB8fCAoc3RsaV9kdW1teWJyZC5icmRuciA+PSBTVExfTUFYQlJEUykpCisJCXJldHVybiAtRU5PREVWOworCWJyZHAgPSBzdGxpX2JyZHNbc3RsaV9kdW1teWJyZC5icmRucl07CisJaWYgKCFicmRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoY29weV90b191c2VyKGFyZywgYnJkcCwgc2l6ZW9mKHN0bGlicmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlICJzdGFsaW9tZW0iIGRldmljZSBpcyBhbHNvIHJlcXVpcmVkIHRvIGRvIHNvbWUgc3BlY2lhbCBvcGVyYXRpb25zIG9uCisgKgl0aGUgYm9hcmQuIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBzZW5kIGFuIGludGVycnVwdCB0byB0aGUgYm9hcmQsCisgKglyZXNldCBpdCwgYW5kIHN0YXJ0L3N0b3AgaXQuCisgKi8KKworc3RhdGljIGludCBzdGxpX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJYnJkbnIsIHJjLCBkb25lOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9tZW1pb2N0bChpcD0leCxmcD0leCxjbWQ9JXgsYXJnPSV4KVxuIiwKKwkJCShpbnQpIGlwLCAoaW50KSBmcCwgY21kLCAoaW50KSBhcmcpOworI2VuZGlmCisKKy8qCisgKglGaXJzdCB1cCBoYW5kbGUgdGhlIGJvYXJkIGluZGVwZW5kZW50IGlvY3Rscy4KKyAqLworCWRvbmUgPSAwOworCXJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgorCQlyYyA9IHN0bGlfZ2V0cG9ydHN0YXRzKE5VTEwsIGFyZ3ApOworCQlkb25lKys7CisJCWJyZWFrOworCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKKwkJcmMgPSBzdGxpX2NscnBvcnRzdGF0cyhOVUxMLCBhcmdwKTsKKwkJZG9uZSsrOworCQlicmVhazsKKwljYXNlIENPTV9HRVRCUkRTVEFUUzoKKwkJcmMgPSBzdGxpX2dldGJyZHN0YXRzKGFyZ3ApOworCQlkb25lKys7CisJCWJyZWFrOworCWNhc2UgQ09NX1JFQURQT1JUOgorCQlyYyA9IHN0bGlfZ2V0cG9ydHN0cnVjdChhcmdwKTsKKwkJZG9uZSsrOworCQlicmVhazsKKwljYXNlIENPTV9SRUFEQk9BUkQ6CisJCXJjID0gc3RsaV9nZXRicmRzdHJ1Y3QoYXJncCk7CisJCWRvbmUrKzsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRvbmUpCisJCXJldHVybihyYyk7CisKKy8qCisgKglOb3cgaGFuZGxlIHRoZSBib2FyZCBzcGVjaWZpYyBpb2N0bHMuIFRoZXNlIGFsbCBkZXBlbmQgb24gdGhlCisgKgltaW5vciBudW1iZXIgb2YgdGhlIGRldmljZSB0aGV5IHdlcmUgY2FsbGVkIGZyb20uCisgKi8KKwlicmRuciA9IGltaW5vcihpcCk7CisJaWYgKGJyZG5yID49IFNUTF9NQVhCUkRTKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJaWYgKCFicmRwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGJyZHAtPnN0YXRlID09IDApCisJCXJldHVybigtRU5PREVWKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTVExfQklOVFI6CisJCUVCUkRJTlRSKGJyZHApOworCQlicmVhazsKKwljYXNlIFNUTF9CU1RBUlQ6CisJCXJjID0gc3RsaV9zdGFydGJyZChicmRwKTsKKwkJYnJlYWs7CisJY2FzZSBTVExfQlNUT1A6CisJCWJyZHAtPnN0YXRlICY9IH5CU1RfU1RBUlRFRDsKKwkJYnJlYWs7CisJY2FzZSBTVExfQlJFU0VUOgorCQlicmRwLT5zdGF0ZSAmPSB+QlNUX1NUQVJURUQ7CisJCUVCUkRSRVNFVChicmRwKTsKKwkJaWYgKHN0bGlfc2hhcmVkID09IDApIHsKKwkJCWlmIChicmRwLT5yZWVuYWJsZSAhPSBOVUxMKQorCQkJCSgqIGJyZHAtPnJlZW5hYmxlKShicmRwKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKHJjKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzdGxpX29wcyA9IHsKKwkub3BlbiA9IHN0bGlfb3BlbiwKKwkuY2xvc2UgPSBzdGxpX2Nsb3NlLAorCS53cml0ZSA9IHN0bGlfd3JpdGUsCisJLnB1dF9jaGFyID0gc3RsaV9wdXRjaGFyLAorCS5mbHVzaF9jaGFycyA9IHN0bGlfZmx1c2hjaGFycywKKwkud3JpdGVfcm9vbSA9IHN0bGlfd3JpdGVyb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBzdGxpX2NoYXJzaW5idWZmZXIsCisJLmlvY3RsID0gc3RsaV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgPSBzdGxpX3NldHRlcm1pb3MsCisJLnRocm90dGxlID0gc3RsaV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHN0bGlfdW50aHJvdHRsZSwKKwkuc3RvcCA9IHN0bGlfc3RvcCwKKwkuc3RhcnQgPSBzdGxpX3N0YXJ0LAorCS5oYW5ndXAgPSBzdGxpX2hhbmd1cCwKKwkuZmx1c2hfYnVmZmVyID0gc3RsaV9mbHVzaGJ1ZmZlciwKKwkuYnJlYWtfY3RsID0gc3RsaV9icmVha2N0bCwKKwkud2FpdF91bnRpbF9zZW50ID0gc3RsaV93YWl0dW50aWxzZW50LAorCS5zZW5kX3hjaGFyID0gc3RsaV9zZW5keGNoYXIsCisJLnJlYWRfcHJvYyA9IHN0bGlfcmVhZHByb2MsCisJLnRpb2NtZ2V0ID0gc3RsaV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBzdGxpX3Rpb2Ntc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgX19pbml0IHN0bGlfaW5pdCh2b2lkKQoreworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBzdGxpX2RydnRpdGxlLCBzdGxpX2RydnZlcnNpb24pOworCisJc3RsaV9pbml0YnJkcygpOworCisJc3RsaV9zZXJpYWwgPSBhbGxvY190dHlfZHJpdmVyKFNUTF9NQVhCUkRTICogU1RMX01BWFBPUlRTKTsKKwlpZiAoIXN0bGlfc2VyaWFsKQorCQlyZXR1cm4gLUVOT01FTTsKKworLyoKKyAqCUFsbG9jYXRlIGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlci4KKyAqLworCXN0bGlfdG1wd3JpdGVidWYgPSAoY2hhciAqKSBzdGxpX21lbWFsbG9jKFNUTElfVFhCVUZTSVpFKTsKKwlpZiAoc3RsaV90bXB3cml0ZWJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkiKHNpemU9JWQpXG4iLCBTVExJX1RYQlVGU0laRSk7CisJc3RsaV90eGNvb2tidWYgPSBzdGxpX21lbWFsbG9jKFNUTElfVFhCVUZTSVpFKTsKKwlpZiAoc3RsaV90eGNvb2tidWYgPT0gKGNoYXIgKikgTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJIihzaXplPSVkKVxuIiwgU1RMSV9UWEJVRlNJWkUpOworCisvKgorICoJU2V0IHVwIGEgY2hhcmFjdGVyIGRyaXZlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uLiBXZSBuZWVkIHRoaXMKKyAqCXRvIGRvd24gbG9hZCB0aGUgc2xhdmUgY29kZSBpbWFnZS4gQWxzbyBpdCBpcyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4KKyAqLworCWlmIChyZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIiwgJnN0bGlfZnNpb21lbSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgbWVtb3J5ICIKKwkJCQkiZGV2aWNlXG4iKTsKKworCWRldmZzX21rX2Rpcigic3RhbGlvbWVtIik7CisJaXN0YWxsaW9uX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInN0YWxpb21lbSIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZGV2ZnNfbWtfY2RldihNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAorCQkJICAgICAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCSAgICAgICAic3RhbGlvbWVtLyVkIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGlzdGFsbGlvbl9jbGFzcywgTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSwgCisJCQkJTlVMTCwgInN0YWxpb21lbSVkIiwgaSk7CisJfQorCisvKgorICoJU2V0IHVwIHRoZSB0dHkgZHJpdmVyIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdXMgYXMgYSBkcml2ZXIuCisgKi8KKwlzdGxpX3NlcmlhbC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdGxpX3NlcmlhbC0+ZHJpdmVyX25hbWUgPSBzdGxpX2Rydm5hbWU7CisJc3RsaV9zZXJpYWwtPm5hbWUgPSBzdGxpX3NlcmlhbG5hbWU7CisJc3RsaV9zZXJpYWwtPm1ham9yID0gU1RMX1NFUklBTE1BSk9SOworCXN0bGlfc2VyaWFsLT5taW5vcl9zdGFydCA9IDA7CisJc3RsaV9zZXJpYWwtPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXN0bGlfc2VyaWFsLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXN0bGlfc2VyaWFsLT5pbml0X3Rlcm1pb3MgPSBzdGxpX2RlZnRlcm1pb3M7CisJc3RsaV9zZXJpYWwtPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc3RsaV9zZXJpYWwsICZzdGxpX29wcyk7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihzdGxpX3NlcmlhbCkpIHsKKwkJcHV0X3R0eV9kcml2ZXIoc3RsaV9zZXJpYWwpOworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2l0ZV9ncGlvLmMgYi9kcml2ZXJzL2NoYXIvaXRlX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWVkNmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2l0ZV9ncGlvLmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBGSUxFIE5BTUUgaXRlX2dwaW8uYworICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICogIEFQSSBmb3IgSVRFIEdQSU8gZGV2aWNlLgorICogIERyaXZlciBmb3IgSVRFIEdQSU8gZGV2aWNlLgorICoKKyAqICBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgIEhhaS1QYW8gRmFuIDxoYWlwYW9AbXZpc3RhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQlMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL2l0ODE3Mi9pdDgxNzJfaW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pdGVfZ3Bpby5oPgorCisjZGVmaW5lIGl0ZV9ncGlvX2Jhc2UgMHgxNDAxMzgwMAorCisjZGVmaW5lCUlURV9HUEFEUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MDAgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEJEUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MDggKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUENEUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MTAgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEFDUgkoKih2b2xhdGlsZSBfX3UxNiAqKSgweDE0MDEzODAyICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BCQ1IJKCoodm9sYXRpbGUgX191MTYgKikoMHgxNDAxMzgwYSArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQ0NSCSgqKHZvbGF0aWxlIF9fdTE2ICopKDB4MTQwMTM4MTIgKyBLU0VHMSkpCisjZGVmaW5lIElURV9HUEFJQ1IJKCoodm9sYXRpbGUgX191MTYgKikoMHgxNDAxMzgwNCArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQklDUgkoKih2b2xhdGlsZSBfX3UxNiAqKSgweDE0MDEzODBjICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BDSUNSCSgqKHZvbGF0aWxlIF9fdTE2ICopKDB4MTQwMTM4MTQgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEFJU1IJKCoodm9sYXRpbGUgX191OCAqKSgweDE0MDEzODA2ICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BCSVNSCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgwZSArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQ0lTUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MTYgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HQ1IJCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgxOCArIEtTRUcxKSkKKworI2RlZmluZSBNQVhfR1BJT19MSU5FCQkyMQorc3RhdGljIGludCBpdGVfZ3Bpb19pcnE9SVQ4MTcyX0dQSU9fSVJROworCitzdGF0aWMgbG9uZyBpdGVfaXJxX2NvdW50ZXJbTUFYX0dQSU9fTElORV07Cit3YWl0X3F1ZXVlX2hlYWRfdCBpdGVfZ3Bpb193YWl0W01BWF9HUElPX0xJTkVdOworc3RhdGljIGludCBpdGVfZ3Bpb19pcnFfcGVuZGluZ1tNQVhfR1BJT19MSU5FXTsKKworc3RhdGljIGludCBpdGVfZ3Bpb19kZWJ1Zz0wOworI2RlZmluZSBERUIoeCkgIGlmIChpdGVfZ3Bpb19kZWJ1Zz49MSkgeAorCitpbnQgaXRlX2dwaW9faW4oX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCB2b2xhdGlsZSBfX3UzMiAqZGF0YSkKK3sKKwlERUIocHJpbnRrKCJpdGVfZ3Bpb19pbiBtYXNrPTB4JXhcbiIsbWFzaykpOyAKKworCXN3aXRjaCAoZGV2aWNlKSB7CisJY2FzZSBJVEVfR1BJT19QT1JUQToKKwkJSVRFX0dQQUNSID0gKF9fdTE2KW1hc2s7CS8qIDB4ZmZmZiAqLworCQkqZGF0YSA9IElURV9HUEFEUjsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQjoKKwkJSVRFX0dQQkNSID0gKF9fdTE2KW1hc2s7CS8qIDB4ZmZmZiAqLworCQkqZGF0YSA9IElURV9HUEJEUjsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQzoKKwkJSVRFX0dQQ0NSID0gKF9fdTE2KW1hc2s7CS8qIDB4MDNmZiAqLworCQkqZGF0YSA9IElURV9HUENEUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IGl0ZV9ncGlvX291dChfX3UzMiBkZXZpY2UsIF9fdTMyIG1hc2ssIF9fdTMyIGRhdGEpCit7CisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQlJVEVfR1BBQ1IgPSAoX191MTYpbWFzazsJLyogMHg1NTU1ICovCisJCUlURV9HUEFEUiA9IChfX3U4KWRhdGE7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCUlURV9HUEJDUiA9IChfX3UxNiltYXNrOwkvKiAweDU1NTUgKi8KKwkJSVRFX0dQQkRSID0gKF9fdTgpZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQzoKKwkJSVRFX0dQQ0NSID0gKF9fdTE2KW1hc2s7CS8qIDB4MDE1NSAqLworCQlJVEVfR1BDRFIgPSAoX191OClkYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl0ZV9ncGlvX2ludF9jdHJsKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgX191MzIgZGF0YSkKK3sKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgSVRFX0dQSU9fUE9SVEE6CisJCUlURV9HUEFJQ1IgPSAoSVRFX0dQQUlDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCUlURV9HUEJJQ1IgPSAoSVRFX0dQQklDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEM6CisJCUlURV9HUENJQ1IgPSAoSVRFX0dQQ0lDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaXRlX2dwaW9faW5fc3RhdHVzKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgdm9sYXRpbGUgX191MzIgKmRhdGEpCit7CisJaW50IHJldD0tMTsKKworCWlmICgoTUFYX0dQSU9fTElORSA+ICpkYXRhKSAmJiAoKmRhdGEgPj0gMCkpIAorCQlyZXQ9aXRlX2dwaW9faXJxX3BlbmRpbmdbKmRhdGFdOworIAorCURFQihwcmludGsoIml0ZV9ncGlvX2luX3N0YXR1cyAlZCByZXQ9JWRcbiIsKmRhdGEsIHJldCkpOworCisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQkqZGF0YSA9IElURV9HUEFJU1IgJiBtYXNrOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQkqZGF0YSA9IElURV9HUEJJU1IgJiBtYXNrOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRDOgorCQkqZGF0YSA9IElURV9HUENJU1IgJiBtYXNrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaXRlX2dwaW9fb3V0X3N0YXR1cyhfX3UzMiBkZXZpY2UsIF9fdTMyIG1hc2ssIF9fdTMyIGRhdGEpCit7CisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQlJVEVfR1BBSVNSID0gKElURV9HUEFJU1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQlJVEVfR1BCSVNSID0gKElURV9HUEJJU1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRDOgorCQlJVEVfR1BDSVNSID0gKElURV9HUENJU1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl0ZV9ncGlvX2dlbl9jdHJsKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgX191MzIgZGF0YSkKK3sKKwlJVEVfR0NSID0gKElURV9HQ1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpdGVfZ3Bpb19pbnRfd2FpdCAoX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCBfX3UzMiBkYXRhKQoreworCWludCBpLGxpbmU9MCwgcmV0PTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoZGV2aWNlKSB7CisJY2FzZSBJVEVfR1BJT19QT1JUQToKKwkJbGluZSA9IGRhdGEgJiBtYXNrOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQlsaW5lID0gKGRhdGEgJiBtYXNrKSA8PDg7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEM6CisJCWxpbmUgPSAoZGF0YSAmIG1hc2spIDw8MTY7CisJCWJyZWFrOworCX0KKwlmb3IgKGk9TUFYX0dQSU9fTElORS0xOyBpID49IDA7IGktLSkgeworCQlpZiAoIChsaW5lKSAmICgxIDw8IGkpKQorCQkJYnJlYWs7CisJfQorCisJREVCKHByaW50aygid2FpdCBkZXZpY2U9MHglZCBtYXNrPTB4JXggZGF0YT0weCV4IGluZGV4ICVkXG4iLCAKKwkJZGV2aWNlLCBtYXNrLCBkYXRhLCBpKSk7CisKKwlpZiAobGluZSAmIH4oMTw8aSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGl0ZV9ncGlvX2lycV9wZW5kaW5nW2ldPT0xKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNhdmVfZmxhZ3MgKGZsYWdzKTsKKwljbGkoKTsKKwlpdGVfZ3Bpb19pcnFfcGVuZGluZ1tpXSA9IDE7CisJcmV0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZpdGVfZ3Bpb193YWl0W2ldLCAzKkhaKTsKKwlyZXN0b3JlX2ZsYWdzIChmbGFncyk7CisJaXRlX2dwaW9faXJxX3BlbmRpbmdbaV0gPSAwOworCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChpdGVfZ3Bpb19pbik7CitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX291dCk7CitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX2ludF9jdHJsKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9faW5fc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9fb3V0X3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX2dlbl9jdHJsKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9faW50X3dhaXQpOworCitzdGF0aWMgaW50IGl0ZV9ncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpdGVfZ3Bpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXRlX2dwaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RhdGljIHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhIGlvY3RsX2RhdGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsX2RhdGEsIChzdHJ1Y3QgaXRlX2dwaW9faW9jdGxfZGF0YSAqKWFyZywKKwkJCXNpemVvZihpb2N0bF9kYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgoaW9jdGxfZGF0YS5kZXZpY2UgPCBJVEVfR1BJT19QT1JUQSkgfHwKKwkJCShpb2N0bF9kYXRhLmRldmljZSA+IElURV9HUElPX1BPUlRDKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgSVRFX0dQSU9fSU46CisJCQlpZiAoaXRlX2dwaW9faW4oaW9jdGxfZGF0YS5kZXZpY2UsIGlvY3RsX2RhdGEubWFzaywKKwkJCQkJICAgJmlvY3RsX2RhdGEuZGF0YSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhICopYXJnLAorCQkJCQkgJmlvY3RsX2RhdGEsIHNpemVvZihpb2N0bF9kYXRhKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIElURV9HUElPX09VVDoKKwkJCXJldHVybiBpdGVfZ3Bpb19vdXQoaW9jdGxfZGF0YS5kZXZpY2UsCisJCQkJCWlvY3RsX2RhdGEubWFzaywgaW9jdGxfZGF0YS5kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVRFX0dQSU9fSU5UX0NUUkw6CisJCQlyZXR1cm4gaXRlX2dwaW9faW50X2N0cmwoaW9jdGxfZGF0YS5kZXZpY2UsCisJCQkJCWlvY3RsX2RhdGEubWFzaywgaW9jdGxfZGF0YS5kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVRFX0dQSU9fSU5fU1RBVFVTOgorCQkJaWYgKGl0ZV9ncGlvX2luX3N0YXR1cyhpb2N0bF9kYXRhLmRldmljZSwgaW9jdGxfZGF0YS5tYXNrLAorCQkJCQkmaW9jdGxfZGF0YS5kYXRhKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhICopYXJnLAorCQkJCQkmaW9jdGxfZGF0YSwgc2l6ZW9mKGlvY3RsX2RhdGEpKSkgCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIElURV9HUElPX09VVF9TVEFUVVM6CisJCQlyZXR1cm4gaXRlX2dwaW9fb3V0X3N0YXR1cyhpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJVEVfR1BJT19HRU5fQ1RSTDoKKwkJCXJldHVybiBpdGVfZ3Bpb19nZW5fY3RybChpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJVEVfR1BJT19JTlRfV0FJVDoKKwkJCXJldHVybiBpdGVfZ3Bpb19pbnRfd2FpdChpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXRlX2dwaW9faXJxX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsCisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGksbGluZTsKKworCWxpbmUgPSBJVEVfR1BDSVNSICYgMHgxZjsKKwlmb3IgKGk9NDsgaSA+PTA7IGktLSkgeworCQlpZiAoIGxpbmUgJiAoMSA8PCBpKSkgeyAKKwkJCSsraXRlX2lycV9jb3VudGVyW2krMTZdOworCQkJaXRlX2dwaW9faXJxX3BlbmRpbmdbaSsxNl0gPSAyOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpdGVfZ3Bpb193YWl0W2krMTZdKTsKKworREVCKHByaW50aygiaW50ZXJydXB0IDB4JXggJWRcbiIsICZpdGVfZ3Bpb193YWl0W2krMTZdLCBpKzE2KSk7CisKKwkJCUlURV9HUENJU1IgPSBJVEVfR1BDSVNSICYgKDE8PGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCWxpbmUgPSBJVEVfR1BCSVNSOworCWZvciAoaT03OyBpID49IDA7IGktLSkgeworCQlpZiAoIGxpbmUgJiAoMSA8PCBpKSkgeworCQkJKytpdGVfaXJxX2NvdW50ZXJbaSs4XTsKKwkJCWl0ZV9ncGlvX2lycV9wZW5kaW5nW2krOF0gPSAyOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpdGVfZ3Bpb193YWl0W2krOF0pOworCitERUIocHJpbnRrKCJpbnRlcnJ1cHQgMHgleCAlZFxuIixJVEVfR1BCSVNSLCBpKzgpKTsKKworCQkJSVRFX0dQQklTUiA9IElURV9HUEJJU1IgJiAoMTw8aSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGluZSA9IElURV9HUEFJU1I7CisJZm9yIChpPTc7IGkgPj0gMDsgaS0tKSB7CisJCWlmICggbGluZSAmICgxIDw8IGkpKSB7CisJCQkrK2l0ZV9pcnFfY291bnRlcltpXTsKKwkJCWl0ZV9ncGlvX2lycV9wZW5kaW5nW2ldID0gMjsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXRlX2dwaW9fd2FpdFtpXSk7CisKK0RFQihwcmludGsoImludGVycnVwdCAweCV4ICVkXG4iLElURV9HUEFJU1IsIGkpKTsKKworCQkJSVRFX0dQQUlTUiA9IElURV9HUEFJU1IgJiAoMTw8aSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl0ZV9ncGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBpdGVfZ3Bpb19pb2N0bCwKKwkub3BlbgkJPSBpdGVfZ3Bpb19vcGVuLAorCS5yZWxlYXNlCT0gaXRlX2dwaW9fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpdGVfZ3Bpb19taXNjZGV2ID0geworCU1JU0NfRFlOQU1JQ19NSU5PUiwKKwkiaXRlX2dwaW8iLAorCSZpdGVfZ3Bpb19mb3BzCit9OworCitpbnQgX19pbml0IGl0ZV9ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChtaXNjX3JlZ2lzdGVyKCZpdGVfZ3Bpb19taXNjZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGl0ZV9ncGlvX2Jhc2UsIDB4MWMsICJJVEUgR1BJTyIpKQorCXsKKwkJbWlzY19kZXJlZ2lzdGVyKCZpdGVfZ3Bpb19taXNjZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogaW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKyAgICAgICAgSVRFX0dQQUNSID0gMHhmZmZmOworICAgICAgICBJVEVfR1BCQ1IgPSAweGZmZmY7CisgICAgICAgIElURV9HUENDUiA9IDB4ZmZmZjsKKyAgICAgICAgSVRFX0dQQUlDUiA9IDB4MDBmZjsKKyAgICAgICAgSVRFX0dQQklDUiA9IDB4MDBmZjsKKyAgICAgICAgSVRFX0dQQ0lDUiA9IDB4MDBmZjsKKyAgICAgICAgSVRFX0dDUiA9IDA7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9HUElPX0xJTkU7IGkrKykgeworCQlpdGVfZ3Bpb19pcnFfcGVuZGluZ1tpXT0wOwkKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaXRlX2dwaW9fd2FpdFtpXSk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGl0ZV9ncGlvX2lycSwgaXRlX2dwaW9faXJxX2hhbmRsZXIsIFNBX1NISVJRLCAiZ3BpbyIsIDApIDwgMCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJml0ZV9ncGlvX21pc2NkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihpdGVfZ3Bpb19iYXNlLCAweDFjKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKCJHUElPIGF0IDB4JXggKGlycSA9ICVkKVxuIiwgaXRlX2dwaW9fYmFzZSwgaXRlX2dwaW9faXJxKTsKKworCXJldHVybiAwOworfQkKKworc3RhdGljIHZvaWQgX19leGl0IGl0ZV9ncGlvX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJml0ZV9ncGlvX21pc2NkZXYpOworfQorCittb2R1bGVfaW5pdChpdGVfZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KGl0ZV9ncGlvX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTUxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwpAQCAtMCwwICsxLDEyNTQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYworICoKKyAqIFdyaXR0ZW4gZm9yIGxpbnV4IGJ5IEpvaGFuIE15cmVlbiBhcyBhIHRyYW5zbGF0aW9uIGZyb20KKyAqIHRoZSBhc3NlbWJseSB2ZXJzaW9uIGJ5IExpbnVzICh3aXRoIGRpYWNyaXRpY2FscyBhZGRlZCkKKyAqCisgKiBTb21lIGFkZGl0aW9uYWwgZmVhdHVyZXMgYWRkZWQgYnkgQ2hyaXN0b3BoIE5pZW1hbm4gKENoTiksIE1hcmNoIDE5OTMKKyAqCisgKiBMb2FkYWJsZSBrZXltYXBzIGJ5IFJpc3RvIEthbmtrdW5lbiwgTWF5IDE5OTMKKyAqCisgKiBEaWFjcml0aWNhbHMgcmVkb25lICYgb3RoZXIgc21hbGwgY2hhbmdlcywgYWViQGN3aS5ubCwgSnVuZSAxOTkzCisgKiBBZGRlZCBkZWNyL2luY3JfY29uc29sZSwgZHluYW1pYyBrZXltYXBzLCBVbmljb2RlIHN1cHBvcnQsCisgKiBkeW5hbWljIGZ1bmN0aW9uL3N0cmluZyBrZXlzLCBsZWQgc2V0dGluZywgIFNlcHQgMTk5NAorICogYFN0aWNreScgbW9kaWZpZXIga2V5cywgOTUxMDA2LgorICoKKyAqIDExLTExLTk2OiBTQUsgc2hvdWxkIG5vdyB3b3JrIGluIHRoZSByYXcgbW9kZSAoTWFydGluIE1hcmVzKQorICogCisgKiBNb2RpZmllZCB0byBwcm92aWRlICdnZW5lcmljJyBrZXlib2FyZCBzdXBwb3J0IGJ5IEhhbWlzaCBNYWNkb25hbGQKKyAqIE1lcmdlIHdpdGggdGhlIG02OGsga2V5Ym9hcmQgZHJpdmVyIGFuZCBzcGxpdC1vZmYgb2YgdGhlIFBDIGxvdy1sZXZlbAorICogcGFydHMgYnkgR2VlcnQgVXl0dGVyaG9ldmVuLCBNYXkgMTk5NworICoKKyAqIDI3LTA1LTk3OiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTWFnaWMgU3lzUnEgS2V5IChNYXJ0aW4gTWFyZXMpCisgKiAzMC0wNy05ODogRGVhZCBrZXlzIHJlZG9uZSwgYWViQGN3aS5ubC4KKyAqIDIxLTA4LTAyOiBDb252ZXJ0ZWQgdG8gaW5wdXQgQVBJLCBtYWpvciBjbGVhbnVwLiAoVm9qdGVjaCBQYXZsaWspCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9kaWFjci5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKK3N0YXRpYyB2b2lkIGtiZF9kaXNjb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSk7CitleHRlcm4gdm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7CisKKy8qCisgKiBFeHBvcnRlZCBmdW5jdGlvbnMvdmFyaWFibGVzCisgKi8KKworI2RlZmluZSBLQkRfREVGTU9ERSAoKDEgPDwgVkNfUkVQRUFUKSB8ICgxIDw8IFZDX01FVEEpKQorCisvKgorICogU29tZSBsYXB0b3BzIHRha2UgdGhlIDc4OXVpb2prbG0sLiBrZXlzIGFzIG51bWJlciBwYWQgd2hlbiBOdW1Mb2NrIGlzIG9uLgorICogVGhpcyBzZWVtcyBhIGdvb2QgcmVhc29uIHRvIHN0YXJ0IHdpdGggTnVtTG9jayBvZmYuIE9uIEhJTCBrZXlib2FyZHMKKyAqIG9mIFBBUklTQyBtYWNoaW5lcyBob3dldmVyIHRoZXJlIGlzIG5vIE51bUxvY2sga2V5IGFuZCBldmVyeW9uZSBleHBlY3RzIHRoZSBrZXlwYWQgCisgKiB0byBiZSB1c2VkIGZvciBudW1iZXJzLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJJU0MpICYmIChkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9ISUwpIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0hJTF9PTEQpKQorI2RlZmluZSBLQkRfREVGTEVEUyAoMSA8PCBWQ19OVU1MT0NLKQorI2Vsc2UKKyNkZWZpbmUgS0JEX0RFRkxFRFMgMAorI2VuZGlmCisKKyNkZWZpbmUgS0JEX0RFRkxPQ0sgMAorCit2b2lkIGNvbXB1dGVfc2hpZnRzdGF0ZSh2b2lkKTsKKworLyoKKyAqIEhhbmRsZXIgVGFibGVzLgorICovCisKKyNkZWZpbmUgS19IQU5ETEVSU1wKKwlrX3NlbGYsCQlrX2ZuLAkJa19zcGVjLAkJa19wYWQsXAorCWtfZGVhZCwJCWtfY29ucywJCWtfY3VyLAkJa19zaGlmdCxcCisJa19tZXRhLAkJa19hc2NpaSwJa19sb2NrLAkJa19sb3dlcmNhc2UsXAorCWtfc2xvY2ssCWtfZGVhZDIsCWtfaWdub3JlLAlrX2lnbm9yZQorCit0eXBlZGVmIHZvaWQgKGtfaGFuZGxlcl9mbikoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCAKKwkJCSAgICBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBrX2hhbmRsZXJfZm4gS19IQU5ETEVSUzsKK3N0YXRpYyBrX2hhbmRsZXJfZm4gKmtfaGFuZGxlclsxNl0gPSB7IEtfSEFORExFUlMgfTsKKworI2RlZmluZSBGTl9IQU5ETEVSU1wKKwlmbl9udWxsLCAJZm5fZW50ZXIsCWZuX3Nob3dfcHRyZWdzLAlmbl9zaG93X21lbSxcCisJZm5fc2hvd19zdGF0ZSwJZm5fc2VuZF9pbnRyLCAJZm5fbGFzdGNvbnMsIAlmbl9jYXBzX3RvZ2dsZSxcCisJZm5fbnVtLAkJZm5faG9sZCwgCWZuX3Njcm9sbF9mb3J3LAlmbl9zY3JvbGxfYmFjayxcCisJZm5fYm9vdF9pdCwgCWZuX2NhcHNfb24sIAlmbl9jb21wb3NlLAlmbl9TQUssXAorCWZuX2RlY19jb25zb2xlLCBmbl9pbmNfY29uc29sZSwgZm5fc3Bhd25fY29uLCAJZm5fYmFyZV9udW0KKwordHlwZWRlZiB2b2lkIChmbl9oYW5kbGVyX2ZuKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBmbl9oYW5kbGVyX2ZuIEZOX0hBTkRMRVJTOworc3RhdGljIGZuX2hhbmRsZXJfZm4gKmZuX2hhbmRsZXJbXSA9IHsgRk5fSEFORExFUlMgfTsKKworLyoKKyAqIFZhcmlhYmxlcyBleHBvcnRlZCBmb3IgdnRfaW9jdGwuYworICovCisKKy8qIG1heGltdW0gdmFsdWVzIGVhY2gga2V5X2hhbmRsZXIgY2FuIGhhbmRsZSAqLworY29uc3QgaW50IG1heF92YWxzW10gPSB7CisJMjU1LCBBUlJBWV9TSVpFKGZ1bmNfdGFibGUpIC0gMSwgQVJSQVlfU0laRShmbl9oYW5kbGVyKSAtIDEsIE5SX1BBRCAtIDEsCisJTlJfREVBRCAtIDEsIDI1NSwgMywgTlJfU0hJRlQgLSAxLCAyNTUsIE5SX0FTQ0lJIC0gMSwgTlJfTE9DSyAtIDEsCisJMjU1LCBOUl9MT0NLIC0gMSwgMjU1Cit9OworCitjb25zdCBpbnQgTlJfVFlQRVMgPSBBUlJBWV9TSVpFKG1heF92YWxzKTsKKworc3RydWN0IGtiZF9zdHJ1Y3Qga2JkX3RhYmxlW01BWF9OUl9DT05TT0xFU107CitzdGF0aWMgc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCA9IGtiZF90YWJsZTsKK3N0YXRpYyBzdHJ1Y3Qga2JkX3N0cnVjdCBrYmQwOworCitpbnQgc3Bhd25waWQsIHNwYXduc2lnOworCisvKgorICogVmFyaWFibGVzIGV4cG9ydGVkIGZvciB2dC5jCisgKi8KKworaW50IHNoaWZ0X3N0YXRlID0gMDsKKworLyoKKyAqIEludGVybmFsIERhdGEuCisgKi8KKworc3RhdGljIHN0cnVjdCBpbnB1dF9oYW5kbGVyIGtiZF9oYW5kbGVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcga2V5X2Rvd25bTkJJVFMoS0VZX01BWCldOwkJLyoga2V5Ym9hcmQga2V5IGJpdG1hcCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hpZnRfZG93bltOUl9TSElGVF07CQkvKiBzaGlmdCBzdGF0ZSBjb3VudGVycy4uICovCitzdGF0aWMgaW50IGRlYWRfa2V5X25leHQ7CitzdGF0aWMgaW50IG5wYWRjaCA9IC0xOwkJCQkJLyogLTEgb3IgbnVtYmVyIGFzc2VtYmxlZCBvbiBwYWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpYWNyOworc3RhdGljIGNoYXIgcmVwOwkJCQkJLyogZmxhZyB0ZWxsaW5nIGNoYXJhY3RlciByZXBlYXQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVkc3RhdGUgPSAweGZmOwkJCS8qIHVuZGVmaW5lZCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVkaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgbGVkcHRyIHsKKwl1bnNpZ25lZCBpbnQgKmFkZHI7CisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgY2hhciB2YWxpZDoxOworfSBsZWRwdHJzWzNdOworCisvKiBTaW1wbGUgdHJhbnNsYXRpb24gdGFibGUgZm9yIHRoZSBTeXNScSBrZXlzICovCisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKK3Vuc2lnbmVkIGNoYXIga2JkX3N5c3JxX3hsYXRlW0tFWV9NQVggKyAxXSA9CisgICAgICAgICJcMDAwXDAzMzEyMzQ1Njc4OTAtPVwxNzdcdCIgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgLSAweDBmICovCisgICAgICAgICJxd2VydHl1aW9wW11cclwwMDBhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTAgLSAweDFmICovCisgICAgICAgICJkZmdoamtsOydgXDAwMFxcenhjdiIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MjAgLSAweDJmICovCisgICAgICAgICJibm0sLi9cMDAwKlwwMDAgXDAwMFwyMDFcMjAyXDIwM1wyMDRcMjA1IiAgICAgIC8qIDB4MzAgLSAweDNmICovCisgICAgICAgICJcMjA2XDIwN1wyMTBcMjExXDIxMlwwMDBcMDAwNzg5LTQ1NisxIiAgICAgICAgIC8qIDB4NDAgLSAweDRmICovCisgICAgICAgICIyMzBcMTc3XDAwMFwwMDBcMjEzXDIxNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiIC8qIDB4NTAgLSAweDVmICovCisgICAgICAgICJcclwwMDAvIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NjAgLSAweDZmICovCitzdGF0aWMgaW50IHN5c3JxX2Rvd247CisjZW5kaWYKK3N0YXRpYyBpbnQgc3lzcnFfYWx0OworCisvKgorICogVHJhbnNsYXRpb24gb2Ygc2NhbmNvZGVzIHRvIGtleWNvZGVzLiBXZSBzZXQgdGhlbSBvbiBvbmx5IHRoZSBmaXJzdCBhdHRhY2hlZAorICoga2V5Ym9hcmQgLSBmb3IgcGVyLWtleWJvYXJkIHNldHRpbmcsIC9kZXYvaW5wdXQvZXZlbnQgaXMgbW9yZSB1c2VmdWwuCisgKi8KK2ludCBnZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJc3RydWN0IGlucHV0X2hhbmRsZSAqIGhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQlpZiAoaGFuZGxlLT5kZXYtPmtleWNvZGVzaXplKSB7IAorCQkJZGV2ID0gaGFuZGxlLT5kZXY7IAorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc2NhbmNvZGUgPj0gZGV2LT5rZXljb2RlbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBJTlBVVF9LRVlDT0RFKGRldiwgc2NhbmNvZGUpOworfQorCitpbnQgc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGksIG9sZGtleTsKKworCWxpc3RfZm9yX2VhY2gobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQlpZiAoaGFuZGxlLT5kZXYtPmtleWNvZGVzaXplKSB7IAorCQkJZGV2ID0gaGFuZGxlLT5kZXY7IAorCQkJYnJlYWs7IAorCQl9CisJfQorCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNjYW5jb2RlID49IGRldi0+a2V5Y29kZW1heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtleWNvZGUgPiBLRVlfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJb2xka2V5ID0gU0VUX0lOUFVUX0tFWUNPREUoZGV2LCBzY2FuY29kZSwga2V5Y29kZSk7CisKKwljbGVhcl9iaXQob2xka2V5LCBkZXYtPmtleWJpdCk7CisJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5rZXljb2RlbWF4OyBpKyspCisJCWlmIChJTlBVVF9LRVlDT0RFKGRldixpKSA9PSBvbGRrZXkpCisJCQlzZXRfYml0KG9sZGtleSwgZGV2LT5rZXliaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWtpbmcgYmVlcHMgYW5kIGJlbGxzLiAKKyAqLworc3RhdGljIHZvaWQga2Rfbm9zb3VuZCh1bnNpZ25lZCBsb25nIGlnbm9yZWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisKKwlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKKwkJaWYgKHRlc3RfYml0KEVWX1NORCwgaGFuZGxlLT5kZXYtPmV2Yml0KSkgeworCQkJaWYgKHRlc3RfYml0KFNORF9UT05FLCBoYW5kbGUtPmRldi0+c25kYml0KSkKKwkJCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfU05ELCBTTkRfVE9ORSwgMCk7CisJCQlpZiAodGVzdF9iaXQoU05EX0JFTEwsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKQorCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9CRUxMLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGtkX21rc291bmRfdGltZXIgPQorCQlUSU1FUl9JTklUSUFMSVpFUihrZF9ub3NvdW5kLCAwLCAwKTsKKwordm9pZCBrZF9ta3NvdW5kKHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCisJZGVsX3RpbWVyKCZrZF9ta3NvdW5kX3RpbWVyKTsKKworCWlmIChoeikgeworCQlsaXN0X2Zvcl9lYWNoX3ByZXYobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKKwkJCWlmICh0ZXN0X2JpdChFVl9TTkQsIGhhbmRsZS0+ZGV2LT5ldmJpdCkpIHsKKwkJCQlpZiAodGVzdF9iaXQoU05EX1RPTkUsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKSB7CisJCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9UT05FLCBoeik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodGVzdF9iaXQoU05EX0JFTEwsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKSB7CisJCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9CRUxMLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh0aWNrcykKKwkJCW1vZF90aW1lcigma2RfbWtzb3VuZF90aW1lciwgamlmZmllcyArIHRpY2tzKTsKKwl9IGVsc2UKKwkJa2Rfbm9zb3VuZCgwKTsKK30KKworLyoKKyAqIFNldHRpbmcgdGhlIGtleWJvYXJkIHJhdGUuCisgKi8KKworaW50IGtiZF9yYXRlKHN0cnVjdCBrYmRfcmVwZWF0ICpyZXApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKKwl1bnNpZ25lZCBpbnQgZCA9IDA7CisJdW5zaWduZWQgaW50IHAgPSAwOworCisJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGhhbmRsZS0+ZGV2OworCisJCWlmICh0ZXN0X2JpdChFVl9SRVAsIGRldi0+ZXZiaXQpKSB7CisJCQlpZiAocmVwLT5kZWxheSA+IDApCisJCQkJaW5wdXRfZXZlbnQoZGV2LCBFVl9SRVAsIFJFUF9ERUxBWSwgcmVwLT5kZWxheSk7CisJCQlpZiAocmVwLT5wZXJpb2QgPiAwKQorCQkJCWlucHV0X2V2ZW50KGRldiwgRVZfUkVQLCBSRVBfUEVSSU9ELCByZXAtPnBlcmlvZCk7CisJCQlkID0gZGV2LT5yZXBbUkVQX0RFTEFZXTsKKwkJCXAgPSBkZXYtPnJlcFtSRVBfUEVSSU9EXTsKKwkJfQorCX0KKwlyZXAtPmRlbGF5ICA9IGQ7CisJcmVwLT5wZXJpb2QgPSBwOworCXJldHVybiAwOworfQorCisvKgorICogSGVscGVyIEZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgcHV0X3F1ZXVlKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGNoKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB2Yy0+dmNfdHR5OworCisJaWYgKHR0eSkgeworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCAwKTsKKwkJY29uX3NjaGVkdWxlX2ZsaXAodHR5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB1dHNfcXVldWUoc3RydWN0IHZjX2RhdGEgKnZjLCBjaGFyICpjcCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdmMtPnZjX3R0eTsKKworCWlmICghdHR5KQorCQlyZXR1cm47CisKKwl3aGlsZSAoKmNwKSB7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgKmNwLCAwKTsKKwkJY3ArKzsKKwl9CisJY29uX3NjaGVkdWxlX2ZsaXAodHR5KTsKK30KKworc3RhdGljIHZvaWQgYXBwbGtleShzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBrZXksIGNoYXIgbW9kZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbXSA9IHsgMHgxYiwgJ08nLCAweDAwLCAweDAwIH07CisKKwlidWZbMV0gPSAobW9kZSA/ICdPJyA6ICdbJyk7CisJYnVmWzJdID0ga2V5OworCXB1dHNfcXVldWUodmMsIGJ1Zik7Cit9CisKKy8qCisgKiBNYW55IG90aGVyIHJvdXRpbmVzIGRvIHB1dF9xdWV1ZSwgYnV0IEkgdGhpbmsgZWl0aGVyCisgKiB0aGV5IHByb2R1Y2UgQVNDSUksIG9yIHRoZXkgcHJvZHVjZSBzb21lIHVzZXItYXNzaWduZWQKKyAqIHN0cmluZywgYW5kIGluIGJvdGggY2FzZXMgd2UgbWlnaHQgYXNzdW1lIHRoYXQgaXQgaXMKKyAqIGluIHV0Zi04IGFscmVhZHkuIFVURi04IGlzIGRlZmluZWQgZm9yIHdvcmRzIG9mIHVwIHRvIDMxIGJpdHMsCisgKiBidXQgd2UgbmVlZCBvbmx5IDE2IGJpdHMgaGVyZQorICovCitzdGF0aWMgdm9pZCB0b191dGY4KHN0cnVjdCB2Y19kYXRhICp2YywgdXNob3J0IGMpCit7CisJaWYgKGMgPCAweDgwKQorCQkvKiAgMCoqKioqKiogKi8KKwkJcHV0X3F1ZXVlKHZjLCBjKTsKKyAgICAJZWxzZSBpZiAoYyA8IDB4ODAwKSB7CisJCS8qIDExMCoqKioqIDEwKioqKioqICovCisJCXB1dF9xdWV1ZSh2YywgMHhjMCB8IChjID4+IDYpKTsgCisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOworICAgIAl9IGVsc2UgeworCQkvKiAxMTEwKioqKiAxMCoqKioqKiAxMCoqKioqKiAqLworCQlwdXRfcXVldWUodmMsIDB4ZTAgfCAoYyA+PiAxMikpOworCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSk7CisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOworICAgIAl9Cit9CisKKy8qIAorICogQ2FsbGVkIGFmdGVyIHJldHVybmluZyBmcm9tIFJBVyBtb2RlIG9yIHdoZW4gY2hhbmdpbmcgY29uc29sZXMgLSByZWNvbXB1dGUKKyAqIHNoaWZ0X2Rvd25bXSBhbmQgc2hpZnRfc3RhdGUgZnJvbSBrZXlfZG93bltdIG1heWJlIGNhbGxlZCB3aGVuIGtleW1hcCBpcworICogdW5kZWZpbmVkLCBzbyB0aGF0IHNoaWZ0a2V5IHJlbGVhc2UgaXMgc2VlbgorICovCit2b2lkIGNvbXB1dGVfc2hpZnRzdGF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqLCBrLCBzeW0sIHZhbDsKKworCXNoaWZ0X3N0YXRlID0gMDsKKwltZW1zZXQoc2hpZnRfZG93biwgMCwgc2l6ZW9mKHNoaWZ0X2Rvd24pKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXlfZG93bik7IGkrKykgeworCisJCWlmICgha2V5X2Rvd25baV0pCisJCQljb250aW51ZTsKKworCQlrID0gaSAqIEJJVFNfUEVSX0xPTkc7CisKKwkJZm9yIChqID0gMDsgaiA8IEJJVFNfUEVSX0xPTkc7IGorKywgaysrKSB7CisKKwkJCWlmICghdGVzdF9iaXQoaywga2V5X2Rvd24pKQorCQkJCWNvbnRpbnVlOworCisJCQlzeW0gPSBVKGtleV9tYXBzWzBdW2tdKTsKKwkJCWlmIChLVFlQKHN5bSkgIT0gS1RfU0hJRlQgJiYgS1RZUChzeW0pICE9IEtUX1NMT0NLKQorCQkJCWNvbnRpbnVlOworCisJCQl2YWwgPSBLVkFMKHN5bSk7CisJCQlpZiAodmFsID09IEtWQUwoS19DQVBTU0hJRlQpKQorCQkJCXZhbCA9IEtWQUwoS19TSElGVCk7CisKKwkJCXNoaWZ0X2Rvd25bdmFsXSsrOworCQkJc2hpZnRfc3RhdGUgfD0gKDEgPDwgdmFsKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFdlIGhhdmUgYSBjb21iaW5pbmcgY2hhcmFjdGVyIERJQUNSIGhlcmUsIGZvbGxvd2VkIGJ5IHRoZSBjaGFyYWN0ZXIgQ0guCisgKiBJZiB0aGUgY29tYmluYXRpb24gb2NjdXJzIGluIHRoZSB0YWJsZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgorICogT3RoZXJ3aXNlLCBpZiBDSCBpcyBhIHNwYWNlIG9yIGVxdWFscyBESUFDUiwgcmV0dXJuIERJQUNSLgorICogT3RoZXJ3aXNlLCBjb25jbHVkZSB0aGF0IERJQUNSIHdhcyBub3QgY29tYmluaW5nIGFmdGVyIGFsbCwKKyAqIHF1ZXVlIGl0IGFuZCByZXR1cm4gQ0guCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhhbmRsZV9kaWFjcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJaW50IGQgPSBkaWFjcjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRpYWNyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhY2NlbnRfdGFibGVfc2l6ZTsgaSsrKSB7CisJCWlmIChhY2NlbnRfdGFibGVbaV0uZGlhY3IgPT0gZCAmJiBhY2NlbnRfdGFibGVbaV0uYmFzZSA9PSBjaCkKKwkJCXJldHVybiBhY2NlbnRfdGFibGVbaV0ucmVzdWx0OworCX0KKworCWlmIChjaCA9PSAnICcgfHwgY2ggPT0gZCkKKwkJcmV0dXJuIGQ7CisKKwlwdXRfcXVldWUodmMsIGQpOworCXJldHVybiBjaDsKK30KKworLyoKKyAqIFNwZWNpYWwgZnVuY3Rpb24gaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgZm5fZW50ZXIoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoZGlhY3IpIHsKKwkJcHV0X3F1ZXVlKHZjLCBkaWFjcik7CisJCWRpYWNyID0gMDsKKwl9CisJcHV0X3F1ZXVlKHZjLCAxMyk7CisJaWYgKHZjX2tiZF9tb2RlKGtiZCwgVkNfQ1JMRikpCisJCXB1dF9xdWV1ZSh2YywgMTApOworfQorCitzdGF0aWMgdm9pZCBmbl9jYXBzX3RvZ2dsZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZXApCisJCXJldHVybjsKKwljaGdfdmNfa2JkX2xlZChrYmQsIFZDX0NBUFNMT0NLKTsKK30KKworc3RhdGljIHZvaWQgZm5fY2Fwc19vbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZXApCisJCXJldHVybjsKKwlzZXRfdmNfa2JkX2xlZChrYmQsIFZDX0NBUFNMT0NLKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2hvd19wdHJlZ3Moc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVncykKKwkJc2hvd19yZWdzKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBmbl9ob2xkKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAocmVwIHx8ICF0dHkpCisJCXJldHVybjsKKworCS8qCisJICogTm90ZTogU0NST0xMT0NLIHdpbGwgYmUgc2V0IChjbGVhcmVkKSBieSBzdG9wX3R0eSAoc3RhcnRfdHR5KTsKKwkgKiB0aGVzZSByb3V0aW5lcyBhcmUgYWxzbyBhY3RpdmF0ZWQgYnkgXlMvXlEuCisJICogKEFuZCBTQ1JPTExPQ0sgY2FuIGFsc28gYmUgc2V0IGJ5IHRoZSBpb2N0bCBLRFNLQkxFRC4pCisJICovCisJaWYgKHR0eS0+c3RvcHBlZCkKKwkJc3RhcnRfdHR5KHR0eSk7CisJZWxzZQorCQlzdG9wX3R0eSh0dHkpOworfQorCitzdGF0aWMgdm9pZCBmbl9udW0oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodmNfa2JkX21vZGUoa2JkLFZDX0FQUExJQykpCisJCWFwcGxrZXkodmMsICdQJywgMSk7CisJZWxzZQorCQlmbl9iYXJlX251bSh2YywgcmVncyk7Cit9CisKKy8qCisgKiBCaW5kIHRoaXMgdG8gU2hpZnQtTnVtTG9jayBpZiB5b3Ugd29yayBpbiBhcHBsaWNhdGlvbiBrZXlwYWQgbW9kZQorICogYnV0IHdhbnQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIE51bUxvY2sgZmxhZy4KKyAqIEJpbmQgdGhpcyB0byBOdW1Mb2NrIGlmIHlvdSBwcmVmZXIgdGhhdCB0aGUgTnVtTG9jayBrZXkgYWx3YXlzCisgKiBjaGFuZ2VzIHRoZSBOdW1Mb2NrIGZsYWcuCisgKi8KK3N0YXRpYyB2b2lkIGZuX2JhcmVfbnVtKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKCFyZXApCisJCWNoZ192Y19rYmRfbGVkKGtiZCwgVkNfTlVNTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2xhc3Rjb25zKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogc3dpdGNoIHRvIHRoZSBsYXN0IHVzZWQgY29uc29sZSwgQ2hOICovCisJc2V0X2NvbnNvbGUobGFzdF9jb25zb2xlKTsKK30KKworc3RhdGljIHZvaWQgZm5fZGVjX2NvbnNvbGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgY3VyID0gZmdfY29uc29sZTsKKworCS8qIEN1cnJlbnRseSBzd2l0Y2hpbmc/ICBRdWV1ZSB0aGlzIG5leHQgc3dpdGNoIHJlbGF0aXZlIHRvIHRoYXQuICovCisJaWYgKHdhbnRfY29uc29sZSAhPSAtMSkKKwkJY3VyID0gd2FudF9jb25zb2xlOworCisJZm9yIChpID0gY3VyLTE7IGkgIT0gY3VyOyBpLS0pIHsKKwkJaWYgKGkgPT0gLTEpCisJCQlpID0gTUFYX05SX0NPTlNPTEVTLTE7CisJCWlmICh2Y19jb25zX2FsbG9jYXRlZChpKSkKKwkJCWJyZWFrOworCX0KKwlzZXRfY29uc29sZShpKTsKK30KKworc3RhdGljIHZvaWQgZm5faW5jX2NvbnNvbGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgY3VyID0gZmdfY29uc29sZTsKKworCS8qIEN1cnJlbnRseSBzd2l0Y2hpbmc/ICBRdWV1ZSB0aGlzIG5leHQgc3dpdGNoIHJlbGF0aXZlIHRvIHRoYXQuICovCisJaWYgKHdhbnRfY29uc29sZSAhPSAtMSkKKwkJY3VyID0gd2FudF9jb25zb2xlOworCisJZm9yIChpID0gY3VyKzE7IGkgIT0gY3VyOyBpKyspIHsKKwkJaWYgKGkgPT0gTUFYX05SX0NPTlNPTEVTKQorCQkJaSA9IDA7CisJCWlmICh2Y19jb25zX2FsbG9jYXRlZChpKSkKKwkJCWJyZWFrOworCX0KKwlzZXRfY29uc29sZShpKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2VuZF9pbnRyKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0JSRUFLKTsKKwljb25fc2NoZWR1bGVfZmxpcCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBmbl9zY3JvbGxfZm9ydyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNjcm9sbGZyb250KHZjLCAwKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2Nyb2xsX2JhY2soc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzY3JvbGxiYWNrKHZjLCAwKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2hvd19tZW0oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X21lbSgpOworfQorCitzdGF0aWMgdm9pZCBmbl9zaG93X3N0YXRlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19zdGF0ZSgpOworfQorCitzdGF0aWMgdm9pZCBmbl9ib290X2l0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY3RybF9hbHRfZGVsKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2NvbXBvc2Uoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkZWFkX2tleV9uZXh0ID0gMTsKK30KKworc3RhdGljIHZvaWQgZm5fc3Bhd25fY29uKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIGlmIChzcGF3bnBpZCkKKwkgICBpZihraWxsX3Byb2Moc3Bhd25waWQsIHNwYXduc2lnLCAxKSkKKwkgICAgIHNwYXducGlkID0gMDsKK30KKworc3RhdGljIHZvaWQgZm5fU0FLKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwkvKgorCSAqIFNBSyBzaG91bGQgYWxzbyB3b3JrIGluIGFsbCByYXcgbW9kZXMgYW5kIHJlc2V0CisJICogdGhlbSBwcm9wZXJseS4KKwkgKi8KKwlpZiAodHR5KQorCQlkb19TQUsodHR5KTsKKwlyZXNldF92Yyh2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX251bGwoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljb21wdXRlX3NoaWZ0c3RhdGUoKTsKK30KKworLyoKKyAqIFNwZWNpYWwga2V5IGhhbmRsZXJzCisgKi8KK3N0YXRpYyB2b2lkIGtfaWdub3JlKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KKworc3RhdGljIHZvaWQga19zcGVjKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCWlmICh2YWx1ZSA+PSBBUlJBWV9TSVpFKGZuX2hhbmRsZXIpKQorCQlyZXR1cm47CisJaWYgKChrYmQtPmtiZG1vZGUgPT0gVkNfUkFXIHx8IAorCSAgICAga2JkLT5rYmRtb2RlID09IFZDX01FRElVTVJBVykgJiYgCisJICAgICB2YWx1ZSAhPSBLVkFMKEtfU0FLKSkKKwkJcmV0dXJuOwkJLyogU0FLIGlzIGFsbG93ZWQgZXZlbiBpbiByYXcgbW9kZSAqLworCWZuX2hhbmRsZXJbdmFsdWVdKHZjLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQga19sb3dlcmNhc2Uoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ayhLRVJOX0VSUiAia2V5Ym9hcmQuYzoga19sb3dlcmNhc2Ugd2FzIGNhbGxlZCAtIGltcG9zc2libGVcbiIpOworfQorCitzdGF0aWMgdm9pZCBrX3NlbGYoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CQkvKiBubyBhY3Rpb24sIGlmIHRoaXMgaXMgYSBrZXkgcmVsZWFzZSAqLworCisJaWYgKGRpYWNyKQorCQl2YWx1ZSA9IGhhbmRsZV9kaWFjcih2YywgdmFsdWUpOworCisJaWYgKGRlYWRfa2V5X25leHQpIHsKKwkJZGVhZF9rZXlfbmV4dCA9IDA7CisJCWRpYWNyID0gdmFsdWU7CisJCXJldHVybjsKKwl9CisJcHV0X3F1ZXVlKHZjLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVhZCBrZXkuIE5vdGUgdGhhdCB3ZSBub3cgbWF5IGhhdmUgc2V2ZXJhbAorICogZGVhZCBrZXlzIG1vZGlmeWluZyB0aGUgc2FtZSBjaGFyYWN0ZXIuIFZlcnkgdXNlZnVsCisgKiBmb3IgVmlldG5hbWVzZS4KKyAqLworc3RhdGljIHZvaWQga19kZWFkMihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKwlkaWFjciA9IChkaWFjciA/IGhhbmRsZV9kaWFjcih2YywgdmFsdWUpIDogdmFsdWUpOworfQorCisvKgorICogT2Jzb2xldGUgLSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seQorICovCitzdGF0aWMgdm9pZCBrX2RlYWQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJldF9kaWFjcltOUl9ERUFEXSA9IHsnYCcsICdcJycsICdeJywgJ34nLCAnIicsICcsJyB9OworCXZhbHVlID0gcmV0X2RpYWNyW3ZhbHVlXTsKKwlrX2RlYWQyKHZjLCB2YWx1ZSwgdXBfZmxhZywgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGtfY29ucyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKwlzZXRfY29uc29sZSh2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGtfZm4oc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIHY7CisKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCXYgPSB2YWx1ZTsKKwlpZiAodiA8IEFSUkFZX1NJWkUoZnVuY190YWJsZSkpIHsKKwkJaWYgKGZ1bmNfdGFibGVbdmFsdWVdKQorCQkJcHV0c19xdWV1ZSh2YywgZnVuY190YWJsZVt2YWx1ZV0pOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImtfZm4gY2FsbGVkIHdpdGggdmFsdWU9JWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQga19jdXIoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjdXJfY2hhcnMgPSAiQkRDQSI7CisKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCWFwcGxrZXkodmMsIGN1cl9jaGFyc1t2YWx1ZV0sIHZjX2tiZF9tb2RlKGtiZCwgVkNfQ0tNT0RFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGtfcGFkKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcGFkX2NoYXJzID0gIjAxMjM0NTY3ODkrLSovXDAxNSwuPygpIyI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmFwcF9tYXAgPSAicHFyc3R1dnd4eWxTUlFNbm5tUFFTIjsKKworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CQkvKiBubyBhY3Rpb24sIGlmIHRoaXMgaXMgYSBrZXkgcmVsZWFzZSAqLworCisJLyoga2x1ZGdlLi4uIHNoaWZ0IGZvcmNlcyBjdXJzb3IvbnVtYmVyIGtleXMgKi8KKwlpZiAodmNfa2JkX21vZGUoa2JkLCBWQ19BUFBMSUMpICYmICFzaGlmdF9kb3duW0tHX1NISUZUXSkgeworCQlhcHBsa2V5KHZjLCBhcHBfbWFwW3ZhbHVlXSwgMSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXZjX2tiZF9sZWQoa2JkLCBWQ19OVU1MT0NLKSkKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBLVkFMKEtfUENPTU1BKToKKwkJCWNhc2UgS1ZBTChLX1BET1QpOgorCQkJCWtfZm4odmMsIEtWQUwoS19SRU1PVkUpLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QMCk6CisJCQkJa19mbih2YywgS1ZBTChLX0lOU0VSVCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1AxKToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfU0VMRUNUKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDIpOgorCQkJCWtfY3VyKHZjLCBLVkFMKEtfRE9XTiksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1AzKToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfUEdETiksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A0KToKKwkJCQlrX2N1cih2YywgS1ZBTChLX0xFRlQpLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QNik6CisJCQkJa19jdXIodmMsIEtWQUwoS19SSUdIVCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A3KToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfRklORCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A4KToKKwkJCQlrX2N1cih2YywgS1ZBTChLX1VQKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDkpOgorCQkJCWtfZm4odmMsIEtWQUwoS19QR1VQKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDUpOgorCQkJCWFwcGxrZXkodmMsICdHJywgdmNfa2JkX21vZGUoa2JkLCBWQ19BUFBMSUMpKTsKKwkJCQlyZXR1cm47CisJCX0KKworCXB1dF9xdWV1ZSh2YywgcGFkX2NoYXJzW3ZhbHVlXSk7CisJaWYgKHZhbHVlID09IEtWQUwoS19QRU5URVIpICYmIHZjX2tiZF9tb2RlKGtiZCwgVkNfQ1JMRikpCisJCXB1dF9xdWV1ZSh2YywgMTApOworfQorCitzdGF0aWMgdm9pZCBrX3NoaWZ0KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgb2xkX3N0YXRlID0gc2hpZnRfc3RhdGU7CisKKwlpZiAocmVwKQorCQlyZXR1cm47CisJLyoKKwkgKiBNaW1pYyB0eXBld3JpdGVyOgorCSAqIGEgQ2Fwc1NoaWZ0IGtleSBhY3RzIGxpa2UgU2hpZnQgYnV0IHVuZG9lcyBDYXBzTG9jaworCSAqLworCWlmICh2YWx1ZSA9PSBLVkFMKEtfQ0FQU1NISUZUKSkgeworCQl2YWx1ZSA9IEtWQUwoS19TSElGVCk7CisJCWlmICghdXBfZmxhZykKKwkJCWNscl92Y19rYmRfbGVkKGtiZCwgVkNfQ0FQU0xPQ0spOworCX0KKworCWlmICh1cF9mbGFnKSB7CisJCS8qCisJCSAqIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHR3byBzaGlmdCBvciBjb250cm9sCisJCSAqIGtleXMgYXJlIGRlcHJlc3NlZCBzaW11bHRhbmVvdXNseQorCQkgKi8KKwkJaWYgKHNoaWZ0X2Rvd25bdmFsdWVdKQorCQkJc2hpZnRfZG93blt2YWx1ZV0tLTsKKwl9IGVsc2UKKwkJc2hpZnRfZG93blt2YWx1ZV0rKzsKKworCWlmIChzaGlmdF9kb3duW3ZhbHVlXSkKKwkJc2hpZnRfc3RhdGUgfD0gKDEgPDwgdmFsdWUpOworCWVsc2UKKwkJc2hpZnRfc3RhdGUgJj0gfigxIDw8IHZhbHVlKTsKKworCS8qIGtsdWRnZSAqLworCWlmICh1cF9mbGFnICYmIHNoaWZ0X3N0YXRlICE9IG9sZF9zdGF0ZSAmJiBucGFkY2ggIT0gLTEpIHsKKwkJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKQorCQkJdG9fdXRmOCh2YywgbnBhZGNoICYgMHhmZmZmKTsKKwkJZWxzZQorCQkJcHV0X3F1ZXVlKHZjLCBucGFkY2ggJiAweGZmKTsKKwkJbnBhZGNoID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBrX21ldGEoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CisKKwlpZiAodmNfa2JkX21vZGUoa2JkLCBWQ19NRVRBKSkgeworCQlwdXRfcXVldWUodmMsICdcMDMzJyk7CisJCXB1dF9xdWV1ZSh2YywgdmFsdWUpOworCX0gZWxzZQorCQlwdXRfcXVldWUodmMsIHZhbHVlIHwgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGtfYXNjaWkoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBiYXNlOworCisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKworCWlmICh2YWx1ZSA8IDEwKSB7CisJCS8qIGRlY2ltYWwgaW5wdXQgb2YgY29kZSwgd2hpbGUgQWx0IGRlcHJlc3NlZCAqLworCQliYXNlID0gMTA7CisJfSBlbHNlIHsKKwkJLyogaGV4YWRlY2ltYWwgaW5wdXQgb2YgY29kZSwgd2hpbGUgQWx0R3IgZGVwcmVzc2VkICovCisJCXZhbHVlIC09IDEwOworCQliYXNlID0gMTY7CisJfQorCisJaWYgKG5wYWRjaCA9PSAtMSkKKwkJbnBhZGNoID0gdmFsdWU7CisJZWxzZQorCQlucGFkY2ggPSBucGFkY2ggKiBiYXNlICsgdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGtfbG9jayhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcgfHwgcmVwKQorCQlyZXR1cm47CisJY2hnX3ZjX2tiZF9sb2NrKGtiZCwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBrX3Nsb2NrKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrX3NoaWZ0KHZjLCB2YWx1ZSwgdXBfZmxhZywgcmVncyk7CisJaWYgKHVwX2ZsYWcgfHwgcmVwKQorCQlyZXR1cm47CisJY2hnX3ZjX2tiZF9zbG9jayhrYmQsIHZhbHVlKTsKKwkvKiB0cnkgdG8gbWFrZSBBbHQsIG9vcHMsIEFsdEdyIGFuZCBzdWNoIHdvcmsgKi8KKwlpZiAoIWtleV9tYXBzW2tiZC0+bG9ja3N0YXRlIF4ga2JkLT5zbG9ja3N0YXRlXSkgeworCQlrYmQtPnNsb2Nrc3RhdGUgPSAwOworCQljaGdfdmNfa2JkX3Nsb2NrKGtiZCwgdmFsdWUpOworCX0KK30KKworLyoKKyAqIFRoZSBsZWRzIGRpc3BsYXkgZWl0aGVyIChpKSB0aGUgc3RhdHVzIG9mIE51bUxvY2ssIENhcHNMb2NrLCBTY3JvbGxMb2NrLAorICogb3IgKGlpKSB3aGF0ZXZlciBwYXR0ZXJuIG9mIGxpZ2h0cyBwZW9wbGUgd2FudCB0byBzaG93IHVzaW5nIEtEU0VUTEVELAorICogb3IgKGlpaSkgc3BlY2lmaWVkIGJpdHMgb2Ygc3BlY2lmaWVkIHdvcmRzIGluIGtlcm5lbCBtZW1vcnkuCisgKi8KK3Vuc2lnbmVkIGNoYXIgZ2V0bGVkc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gbGVkc3RhdGU7Cit9CisKK3ZvaWQgc2V0bGVkc3RhdGUoc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCwgdW5zaWduZWQgaW50IGxlZCkKK3sKKwlpZiAoIShsZWQgJiB+NykpIHsKKwkJbGVkaW9jdGwgPSBsZWQ7CisJCWtiZC0+bGVkbW9kZSA9IExFRF9TSE9XX0lPQ1RMOworCX0gZWxzZQorCQlrYmQtPmxlZG1vZGUgPSBMRURfU0hPV19GTEFHUzsKKwlzZXRfbGVkcygpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0bGVkcyh2b2lkKQoreworCXN0cnVjdCBrYmRfc3RydWN0ICprYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCXVuc2lnbmVkIGNoYXIgbGVkczsKKwlpbnQgaTsKKworCWlmIChrYmQtPmxlZG1vZGUgPT0gTEVEX1NIT1dfSU9DVEwpCisJCXJldHVybiBsZWRpb2N0bDsKKworCWxlZHMgPSBrYmQtPmxlZGZsYWdzdGF0ZTsKKworCWlmIChrYmQtPmxlZG1vZGUgPT0gTEVEX1NIT1dfTUVNKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlpZiAobGVkcHRyc1tpXS52YWxpZCkgeworCQkJCWlmICgqbGVkcHRyc1tpXS5hZGRyICYgbGVkcHRyc1tpXS5tYXNrKQorCQkJCQlsZWRzIHw9ICgxIDw8IGkpOworCQkJCWVsc2UKKwkJCQkJbGVkcyAmPSB+KDEgPDwgaSk7CisJCQl9CisJfQorCXJldHVybiBsZWRzOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIHRoZSBib3R0b20gaGFsZiBvZiB0aGUga2V5Ym9hcmQgaW50ZXJydXB0CisgKiByb3V0aW5lLCBhbmQgcnVucyB3aXRoIGFsbCBpbnRlcnJ1cHRzIGVuYWJsZWQuIEl0IGRvZXMKKyAqIGNvbnNvbGUgY2hhbmdpbmcsIGxlZCBzZXR0aW5nIGFuZCBjb3B5X3RvX2Nvb2tlZCwgd2hpY2ggY2FuCisgKiB0YWtlIGEgcmVhc29uYWJseSBsb25nIHRpbWUuCisgKgorICogQXNpZGUgZnJvbSB0aW1pbmcgKHdoaWNoIGlzbid0IHJlYWxseSB0aGF0IGltcG9ydGFudCBmb3IKKyAqIGtleWJvYXJkIGludGVycnVwdHMgYXMgdGhleSBoYXBwZW4gb2Z0ZW4pLCB1c2luZyB0aGUgc29mdHdhcmUKKyAqIGludGVycnVwdCByb3V0aW5lcyBmb3IgdGhpcyB0aGluZyBhbGxvd3MgdXMgdG8gZWFzaWx5IG1hc2sKKyAqIHRoaXMgd2hlbiB3ZSBkb24ndCB3YW50IGFueSBvZiB0aGUgYWJvdmUgdG8gaGFwcGVuLgorICogVGhpcyBhbGxvd3MgZm9yIGVhc3kgYW5kIGVmZmljaWVudCByYWNlLWNvbmRpdGlvbiBwcmV2ZW50aW9uCisgKiBmb3Iga2JkX3JlZnJlc2hfbGVkcyA9PiBpbnB1dF9ldmVudChkZXYsIEVWX0xFRCwgLi4uKSA9PiAuLi4KKyAqLworCitzdGF0aWMgdm9pZCBrYmRfYmgodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKwl1bnNpZ25lZCBjaGFyIGxlZHMgPSBnZXRsZWRzKCk7CisKKwlpZiAobGVkcyAhPSBsZWRzdGF0ZSkgeworCQlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQkJc3RydWN0IGlucHV0X2hhbmRsZSAqIGhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX1NDUk9MTEwsICEhKGxlZHMgJiAweDAxKSk7CisJCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfTlVNTCwgICAgISEobGVkcyAmIDB4MDIpKTsKKwkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9DQVBTTCwgICAhIShsZWRzICYgMHgwNCkpOworCQkJaW5wdXRfc3luYyhoYW5kbGUtPmRldik7CisJCX0KKwl9CisKKwlsZWRzdGF0ZSA9IGxlZHM7Cit9CisKK0RFQ0xBUkVfVEFTS0xFVF9ESVNBQkxFRChrZXlib2FyZF90YXNrbGV0LCBrYmRfYmgsIDApOworCisvKgorICogVGhpcyBhbGxvd3MgYSBuZXdseSBwbHVnZ2VkIGtleWJvYXJkIHRvIHBpY2sgdGhlIExFRCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQga2JkX3JlZnJlc2hfbGVkcyhzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCit7CisJdW5zaWduZWQgY2hhciBsZWRzID0gbGVkc3RhdGU7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmtleWJvYXJkX3Rhc2tsZXQpOworCWlmIChsZWRzICE9IDB4ZmYpIHsKKwkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX1NDUk9MTEwsICEhKGxlZHMgJiAweDAxKSk7CisJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9OVU1MLCAgICAhIShsZWRzICYgMHgwMikpOworCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfQ0FQU0wsICAgISEobGVkcyAmIDB4MDQpKTsKKwkJaW5wdXRfc3luYyhoYW5kbGUtPmRldik7CisJfQorCXRhc2tsZXRfZW5hYmxlKCZrZXlib2FyZF90YXNrbGV0KTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfQUxQSEEpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX01JUFMpIHx8IGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHxcCisgICAgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkgfHwgZGVmaW5lZChDT05GSUdfUEFSSVNDKSB8fCBkZWZpbmVkKENPTkZJR19TVVBFUkgpIHx8XAorICAgIChkZWZpbmVkKENPTkZJR19BUk0pICYmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0FUS0JEKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9SUEMpKQorCisjZGVmaW5lIEhXX1JBVyhkZXYpICh0ZXN0X2JpdChFVl9NU0MsIGRldi0+ZXZiaXQpICYmIHRlc3RfYml0KE1TQ19SQVcsIGRldi0+bXNjYml0KSAmJlwKKwkJCSgoZGV2KS0+aWQuYnVzdHlwZSA9PSBCVVNfSTgwNDIpICYmICgoZGV2KS0+aWQudmVuZG9yID09IDB4MDAwMSkgJiYgKChkZXYpLT5pZC5wcm9kdWN0ID09IDB4MDAwMSkpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB4ODZfa2V5Y29kZXNbMjU2XSA9CisJeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorCSAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKwkgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisJIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorCSA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwKKwkgODAsIDgxLCA4MiwgODMsIDg0LDExOCwgODYsIDg3LCA4OCwxMTUsMTIwLDExOSwxMjEsMTEyLDEyMywgOTIsCisJMjg0LDI4NSwzMDksMjk4LDMxMiwgOTEsMzI3LDMyOCwzMjksMzMxLDMzMywzMzUsMzM2LDMzNywzMzgsMzM5LAorCTM2NywyODgsMzAyLDMwNCwzNTAsIDg5LDMzNCwzMjYsMjY3LDEyNiwyNjgsMjY5LDEyNSwzNDcsMzQ4LDM0OSwKKwkzNjAsMjYxLDI2MiwyNjMsMjY4LDM3NiwxMDAsMTAxLDMyMSwzMTYsMzczLDI4NiwyODksMTAyLDM1MSwzNTUsCisJMTAzLDEwNCwxMDUsMjc1LDI4NywyNzksMzA2LDEwNiwyNzQsMTA3LDI5NCwzNjQsMzU4LDM2MywzNjIsMzYxLAorCTI5MSwxMDgsMzgxLDI4MSwyOTAsMjcyLDI5MiwzMDUsMjgwLCA5OSwxMTIsMjU3LDI1OCwzNTksMTEzLDExNCwKKwkyNjQsMTE3LDI3MSwzNzQsMzc5LDI2NSwyNjYsIDkzLCA5NCwgOTUsIDg1LDI1OSwzNzUsMjYwLCA5MCwxMTYsCisJMzc3LDEwOSwxMTEsMjc3LDI3OCwyODIsMjgzLDI5NSwyOTYsMjk3LDI5OSwzMDAsMzAxLDI5MywzMDMsMzA3LAorCTMwOCwzMTAsMzEzLDMxNCwzMTUsMzE3LDMxOCwzMTksMzIwLDM1NywzMjIsMzIzLDMyNCwzMjUsMjc2LDMzMCwKKwkzMzIsMzQwLDM2NSwzNDIsMzQzLDM0NCwzNDUsMzQ2LDM1NiwyNzAsMzQxLDM2OCwzNjksMzcwLDM3MSwzNzIgfTsKKworI2lmZGVmIENPTkZJR19NQUNfRU1VTU9VU0VCVE4KK2V4dGVybiBpbnQgbWFjX2hpZF9tb3VzZV9lbXVsYXRlX2J1dHRvbnMoaW50LCBpbnQsIGludCk7CisjZW5kaWYgLyogQ09ORklHX01BQ19FTVVNT1VTRUJUTiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKK3N0YXRpYyBpbnQgc3BhcmNfbDFfYV9zdGF0ZSA9IDA7CitleHRlcm4gdm9pZCBzdW5fZG9fYnJlYWsodm9pZCk7CisjZW5kaWYKKworc3RhdGljIGludCBlbXVsYXRlX3JhdyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBrZXljb2RlLCAKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgdXBfZmxhZykKK3sKKwlpZiAoa2V5Y29kZSA+IDI1NSB8fCAheDg2X2tleWNvZGVzW2tleWNvZGVdKQorCQlyZXR1cm4gLTE7IAorCisJc3dpdGNoIChrZXljb2RlKSB7CisJCWNhc2UgS0VZX1BBVVNFOgorCQkJcHV0X3F1ZXVlKHZjLCAweGUxKTsKKwkJCXB1dF9xdWV1ZSh2YywgMHgxZCB8IHVwX2ZsYWcpOworCQkJcHV0X3F1ZXVlKHZjLCAweDQ1IHwgdXBfZmxhZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBLRVlfSEFOR1VFTDoKKwkJCWlmICghdXBfZmxhZykgcHV0X3F1ZXVlKHZjLCAweGYxKTsKKwkJCXJldHVybiAwOworCQljYXNlIEtFWV9IQU5KQToKKwkJCWlmICghdXBfZmxhZykgcHV0X3F1ZXVlKHZjLCAweGYyKTsKKwkJCXJldHVybiAwOworCX0gCisKKwlpZiAoa2V5Y29kZSA9PSBLRVlfU1lTUlEgJiYgc3lzcnFfYWx0KSB7CisJCXB1dF9xdWV1ZSh2YywgMHg1NCB8IHVwX2ZsYWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoeDg2X2tleWNvZGVzW2tleWNvZGVdICYgMHgxMDApCisJCXB1dF9xdWV1ZSh2YywgMHhlMCk7CisKKwlwdXRfcXVldWUodmMsICh4ODZfa2V5Y29kZXNba2V5Y29kZV0gJiAweDdmKSB8IHVwX2ZsYWcpOworCisJaWYgKGtleWNvZGUgPT0gS0VZX1NZU1JRKSB7CisJCXB1dF9xdWV1ZSh2YywgMHhlMCk7CisJCXB1dF9xdWV1ZSh2YywgMHgzNyB8IHVwX2ZsYWcpOworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorCisjZGVmaW5lIEhXX1JBVyhkZXYpCTAKKworI3dhcm5pbmcgIkNhbm5vdCBnZW5lcmF0ZSByYXdtb2RlIGtleWJvYXJkIGZvciB5b3VyIGFyY2hpdGVjdHVyZSB5ZXQuIgorCitzdGF0aWMgaW50IGVtdWxhdGVfcmF3KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IGtleWNvZGUsIHVuc2lnbmVkIGNoYXIgdXBfZmxhZykKK3sKKwlpZiAoa2V5Y29kZSA+IDEyNykKKwkJcmV0dXJuIC0xOworCisJcHV0X3F1ZXVlKHZjLCBrZXljb2RlIHwgdXBfZmxhZyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQga2JkX3Jhd2NvZGUodW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwlrYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfUkFXKQorCQlwdXRfcXVldWUodmMsIGRhdGEpOworfQorCit2b2lkIGtiZF9rZXljb2RlKHVuc2lnbmVkIGludCBrZXljb2RlLCBpbnQgZG93biwgaW50IGh3X3Jhdywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCXVuc2lnbmVkIHNob3J0IGtleXN5bSwgKmtleV9tYXA7CisJdW5zaWduZWQgY2hhciB0eXBlLCByYXdfbW9kZTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBzaGlmdF9maW5hbDsKKworCXR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAodHR5ICYmICghdHR5LT5kcml2ZXJfZGF0YSkpIHsKKwkJLyogTm8gZHJpdmVyIGRhdGE/IFN0cmFuZ2UuIE9rYXkgd2UgZml4IGl0IHRoZW4uICovCisJCXR0eS0+ZHJpdmVyX2RhdGEgPSB2YzsKKwl9CisKKwlrYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCisJaWYgKGtleWNvZGUgPT0gS0VZX0xFRlRBTFQgfHwga2V5Y29kZSA9PSBLRVlfUklHSFRBTFQpCisJCXN5c3JxX2FsdCA9IGRvd247CisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKKwlpZiAoa2V5Y29kZSA9PSBLRVlfU1RPUCkKKwkJc3BhcmNfbDFfYV9zdGF0ZSA9IGRvd247CisjZW5kaWYKKworCXJlcCA9IChkb3duID09IDIpOworCisjaWZkZWYgQ09ORklHX01BQ19FTVVNT1VTRUJUTgorCWlmIChtYWNfaGlkX21vdXNlX2VtdWxhdGVfYnV0dG9ucygxLCBrZXljb2RlLCBkb3duKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIENPTkZJR19NQUNfRU1VTU9VU0VCVE4gKi8KKworCWlmICgocmF3X21vZGUgPSAoa2JkLT5rYmRtb2RlID09IFZDX1JBVykpICYmICFod19yYXcpCisJCWlmIChlbXVsYXRlX3Jhdyh2Yywga2V5Y29kZSwgIWRvd24gPDwgNykpCisJCQlpZiAoa2V5Y29kZSA8IEJUTl9NSVNDKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImtleWJvYXJkLmM6IGNhbid0IGVtdWxhdGUgcmF3bW9kZSBmb3Iga2V5Y29kZSAlZFxuIiwga2V5Y29kZSk7CisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEJICAgICAgIC8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLworCWlmIChrZXljb2RlID09IEtFWV9TWVNSUSAmJiAoc3lzcnFfZG93biB8fCAoZG93biA9PSAxICYmIHN5c3JxX2FsdCkpKSB7CisJCXN5c3JxX2Rvd24gPSBkb3duOworCQlyZXR1cm47CisJfQorCWlmIChzeXNycV9kb3duICYmIGRvd24gJiYgIXJlcCkgeworCQloYW5kbGVfc3lzcnEoa2JkX3N5c3JxX3hsYXRlW2tleWNvZGVdLCByZWdzLCB0dHkpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKKwlpZiAoa2V5Y29kZSA9PSBLRVlfQSAmJiBzcGFyY19sMV9hX3N0YXRlKSB7CisJCXNwYXJjX2wxX2Ffc3RhdGUgPSAwOworCQlzdW5fZG9fYnJlYWsoKTsKKwl9CisjZW5kaWYKKworCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfTUVESVVNUkFXKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgZXh0ZW5kZWQgbWVkaXVtIHJhdyBtb2RlLCB3aXRoIGtleXMgYWJvdmUgMTI3CisJCSAqIGVuY29kZWQgYXMgMCwgaGlnaCA3IGJpdHMsIGxvdyA3IGJpdHMsIHdpdGggdGhlIDAgYmVhcmluZworCQkgKiB0aGUgJ3VwJyBmbGFnIGlmIG5lZWRlZC4gMCBpcyByZXNlcnZlZCwgc28gdGhpcyBzaG91bGRuJ3QKKwkJICogaW50ZXJmZXJlIHdpdGggYW55dGhpbmcgZWxzZS4gVGhlIHR3byBieXRlcyBhZnRlciAwIHdpbGwKKwkJICogYWx3YXlzIGhhdmUgdGhlIHVwIGZsYWcgc2V0IG5vdCB0byBpbnRlcmZlcmUgd2l0aCBvbGRlcgorCQkgKiBhcHBsaWNhdGlvbnMuIFRoaXMgYWxsb3dzIGZvciAxNjM4NCBkaWZmZXJlbnQga2V5Y29kZXMsCisJCSAqIHdoaWNoIHNob3VsZCBiZSBlbm91Z2guCisJCSAqLworCQlpZiAoa2V5Y29kZSA8IDEyOCkgeworCQkJcHV0X3F1ZXVlKHZjLCBrZXljb2RlIHwgKCFkb3duIDw8IDcpKTsKKwkJfSBlbHNlIHsKKwkJCXB1dF9xdWV1ZSh2YywgIWRvd24gPDwgNyk7CisJCQlwdXRfcXVldWUodmMsIChrZXljb2RlID4+IDcpIHwgMHg4MCk7CisJCQlwdXRfcXVldWUodmMsIGtleWNvZGUgfCAweDgwKTsKKwkJfQorCQlyYXdfbW9kZSA9IDE7CisJfQorCisJaWYgKGRvd24pCisJCXNldF9iaXQoa2V5Y29kZSwga2V5X2Rvd24pOworCWVsc2UKKwkJY2xlYXJfYml0KGtleWNvZGUsIGtleV9kb3duKTsKKworCWlmIChyZXAgJiYgKCF2Y19rYmRfbW9kZShrYmQsIFZDX1JFUEVBVCkgfHwgKHR0eSAmJiAKKwkJKCFMX0VDSE8odHR5KSAmJiB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpKSkpIHsKKwkJLyoKKwkJICogRG9uJ3QgcmVwZWF0IGEga2V5IGlmIHRoZSBpbnB1dCBidWZmZXJzIGFyZSBub3QgZW1wdHkgYW5kIHRoZQorCQkgKiBjaGFyYWN0ZXJzIGdldCBhcmVuJ3QgZWNob2VkIGxvY2FsbHkuIFRoaXMgbWFrZXMga2V5IHJlcGVhdCAKKwkJICogdXNhYmxlIHdpdGggc2xvdyBhcHBsaWNhdGlvbnMgYW5kIHVuZGVyIGhlYXZ5IGxvYWRzLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCXNoaWZ0X2ZpbmFsID0gKHNoaWZ0X3N0YXRlIHwga2JkLT5zbG9ja3N0YXRlKSBeIGtiZC0+bG9ja3N0YXRlOworCWtleV9tYXAgPSBrZXlfbWFwc1tzaGlmdF9maW5hbF07CisKKwlpZiAoIWtleV9tYXApIHsKKwkJY29tcHV0ZV9zaGlmdHN0YXRlKCk7CisJCWtiZC0+c2xvY2tzdGF0ZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoa2V5Y29kZSA+IE5SX0tFWVMpCisJCXJldHVybjsKKworCWtleXN5bSA9IGtleV9tYXBba2V5Y29kZV07CisJdHlwZSA9IEtUWVAoa2V5c3ltKTsKKworCWlmICh0eXBlIDwgMHhmMCkgeworCQlpZiAoZG93biAmJiAhcmF3X21vZGUpIHRvX3V0ZjgodmMsIGtleXN5bSk7CisJCXJldHVybjsKKwl9CisKKwl0eXBlIC09IDB4ZjA7CisKKwlpZiAocmF3X21vZGUgJiYgdHlwZSAhPSBLVF9TUEVDICYmIHR5cGUgIT0gS1RfU0hJRlQpCisJCXJldHVybjsKKworCWlmICh0eXBlID09IEtUX0xFVFRFUikgeworCQl0eXBlID0gS1RfTEFUSU47CisJCWlmICh2Y19rYmRfbGVkKGtiZCwgVkNfQ0FQU0xPQ0spKSB7CisJCQlrZXlfbWFwID0ga2V5X21hcHNbc2hpZnRfZmluYWwgXiAoMSA8PCBLR19TSElGVCldOworCQkJaWYgKGtleV9tYXApCisJCQkJa2V5c3ltID0ga2V5X21hcFtrZXljb2RlXTsKKwkJfQorCX0KKworCSgqa19oYW5kbGVyW3R5cGVdKSh2Yywga2V5c3ltICYgMHhmZiwgIWRvd24sIHJlZ3MpOworCisJaWYgKHR5cGUgIT0gS1RfU0xPQ0spCisJCWtiZC0+c2xvY2tzdGF0ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF9ldmVudChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsIHVuc2lnbmVkIGludCBldmVudF90eXBlLCAKKwkJICAgICAgdW5zaWduZWQgaW50IGV2ZW50X2NvZGUsIGludCB2YWx1ZSkKK3sKKwlpZiAoZXZlbnRfdHlwZSA9PSBFVl9NU0MgJiYgZXZlbnRfY29kZSA9PSBNU0NfUkFXICYmIEhXX1JBVyhoYW5kbGUtPmRldikpCisJCWtiZF9yYXdjb2RlKHZhbHVlKTsKKwlpZiAoZXZlbnRfdHlwZSA9PSBFVl9LRVkpCisJCWtiZF9rZXljb2RlKGV2ZW50X2NvZGUsIHZhbHVlLCBIV19SQVcoaGFuZGxlLT5kZXYpLCBoYW5kbGUtPmRldi0+cmVncyk7CisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7CisJZG9fcG9rZV9ibGFua2VkX2NvbnNvbGUgPSAxOworCXNjaGVkdWxlX2NvbnNvbGVfY2FsbGJhY2soKTsKK30KKworc3RhdGljIGNoYXIga2JkX25hbWVbXSA9ICJrYmQiOworCisvKgorICogV2hlbiBhIGtleWJvYXJkIChvciBvdGhlciBpbnB1dCBkZXZpY2UpIGlzIGZvdW5kLCB0aGUga2JkX2Nvbm5lY3QKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhlIGZ1bmN0aW9uIHRoZW4gbG9va3MgYXQgdGhlIGRldmljZSwgYW5kIGlmIGl0CisgKiBsaWtlcyBpdCwgaXQgY2FuIG9wZW4gaXQgYW5kIGdldCBldmVudHMgZnJvbSBpdC4gSW4gdGhpcyAoa2JkX2Nvbm5lY3QpCisgKiBmdW5jdGlvbiwgd2Ugc2hvdWxkIGRlY2lkZSB3aGljaCBWVCB0byBiaW5kIHRoYXQga2V5Ym9hcmQgdG8gaW5pdGlhbGx5LgorICovCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZSAqa2JkX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsIAorCQkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJCQkJCXN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IEtFWV9SRVNFUlZFRDsgaSA8IEJUTl9NSVNDOyBpKyspCisJCWlmICh0ZXN0X2JpdChpLCBkZXYtPmtleWJpdCkpIGJyZWFrOworCisJaWYgKChpID09IEJUTl9NSVNDKSAmJiAhdGVzdF9iaXQoRVZfU05ELCBkZXYtPmV2Yml0KSkgCisJCXJldHVybiBOVUxMOworCisJaWYgKCEoaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2hhbmRsZSksIEdGUF9LRVJORUwpKSkgCisJCXJldHVybiBOVUxMOworCW1lbXNldChoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3QgaW5wdXRfaGFuZGxlKSk7CisKKwloYW5kbGUtPmRldiA9IGRldjsKKwloYW5kbGUtPmhhbmRsZXIgPSBoYW5kbGVyOworCWhhbmRsZS0+bmFtZSA9IGtiZF9uYW1lOworCisJaW5wdXRfb3Blbl9kZXZpY2UoaGFuZGxlKTsKKwlrYmRfcmVmcmVzaF9sZWRzKGhhbmRsZSk7CisKKwlyZXR1cm4gaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBrYmRfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCit7CisJaW5wdXRfY2xvc2VfZGV2aWNlKGhhbmRsZSk7CisJa2ZyZWUoaGFuZGxlKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnB1dF9kZXZpY2VfaWQga2JkX2lkc1tdID0geworCXsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCisgICAgICAgICAgICAgICAgLmV2Yml0ID0geyBCSVQoRVZfS0VZKSB9LAorICAgICAgICB9LAorCQorCXsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCisgICAgICAgICAgICAgICAgLmV2Yml0ID0geyBCSVQoRVZfU05EKSB9LAorICAgICAgICB9LAkKKworCXsgfSwgICAgLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaW5wdXQsIGtiZF9pZHMpOworCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZXIga2JkX2hhbmRsZXIgPSB7CisJLmV2ZW50CQk9IGtiZF9ldmVudCwKKwkuY29ubmVjdAk9IGtiZF9jb25uZWN0LAorCS5kaXNjb25uZWN0CT0ga2JkX2Rpc2Nvbm5lY3QsCisJLm5hbWUJCT0gImtiZCIsCisJLmlkX3RhYmxlCT0ga2JkX2lkcywKK307CisKK2ludCBfX2luaXQga2JkX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworICAgICAgICBrYmQwLmxlZGZsYWdzdGF0ZSA9IGtiZDAuZGVmYXVsdF9sZWRmbGFnc3RhdGUgPSBLQkRfREVGTEVEUzsKKyAgICAgICAga2JkMC5sZWRtb2RlID0gTEVEX1NIT1dfRkxBR1M7CisgICAgICAgIGtiZDAubG9ja3N0YXRlID0gS0JEX0RFRkxPQ0s7CisgICAgICAgIGtiZDAuc2xvY2tzdGF0ZSA9IDA7CisgICAgICAgIGtiZDAubW9kZWZsYWdzID0gS0JEX0RFRk1PREU7CisgICAgICAgIGtiZDAua2JkbW9kZSA9IFZDX1hMQVRFOworCisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgTUFYX05SX0NPTlNPTEVTIDsgaSsrKQorICAgICAgICAgICAgICAgIGtiZF90YWJsZVtpXSA9IGtiZDA7CisKKwlpbnB1dF9yZWdpc3Rlcl9oYW5kbGVyKCZrYmRfaGFuZGxlcik7CisKKwl0YXNrbGV0X2VuYWJsZSgma2V5Ym9hcmRfdGFza2xldCk7CisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9sY2QuYyBiL2RyaXZlcnMvY2hhci9sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAxYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2xjZC5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogTENELCBMRUQgYW5kIEJ1dHRvbiBpbnRlcmZhY2UgZm9yIENvYmFsdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBieSBBbmRyZXcgQm9zZQorICoKKyAqIExpbnV4IGtlcm5lbCB2ZXJzaW9uIGhpc3Rvcnk6CisgKiAgICAgICBNYXJjaCAyMDAxOiBQb3J0ZWQgZnJvbSAyLjAuMzQgIGJ5IExpYW0gRGF2aWVzCisgKgorICovCisKKyNkZWZpbmUgUlRDX0lPX0VYVEVOVAkweDEwCS8qT25seSByZWFsbHkgdHdvIHBvcnRzLCBidXQuLi4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibGNkLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobGNkX2xvY2spOworCitzdGF0aWMgaW50IGxjZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGNkX3ByZXNlbnQgPSAxOworCisvKiB1c2VkIGluIGFyY2gvbWlwcy9jb2JhbHQvcmVzZXQuYyAqLworaW50IGxlZF9zdGF0ZSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19UVUxJUCkgJiYgMAorCisjZGVmaW5lIE1BWF9JTlRFUkZBQ0VTCTgKK3N0YXRpYyBsaW5rY2hlY2tfZnVuY190IGxpbmtjaGVja19jYWxsYmFja3NbTUFYX0lOVEVSRkFDRVNdOworc3RhdGljIHZvaWQgKmxpbmtjaGVja19jb29raWVzW01BWF9JTlRFUkZBQ0VTXTsKKworaW50IGxjZF9yZWdpc3Rlcl9saW5rY2hlY2tfZnVuYyhpbnQgaWZhY2VfbnVtLCB2b2lkICpmdW5jLCB2b2lkICpjb29raWUpCit7CisJaWYgKGlmYWNlX251bSA8IDAgfHwKKwkgICAgaWZhY2VfbnVtID49IE1BWF9JTlRFUkZBQ0VTIHx8CisJICAgIGxpbmtjaGVja19jYWxsYmFja3NbaWZhY2VfbnVtXSAhPSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbGlua2NoZWNrX2NhbGxiYWNrc1tpZmFjZV9udW1dID0gKGxpbmtjaGVja19mdW5jX3QpIGZ1bmM7CisJbGlua2NoZWNrX2Nvb2tpZXNbaWZhY2VfbnVtXSA9IGNvb2tpZTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGxjZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbGNkX2Rpc3BsYXkgYnV0dG9uX2Rpc3BsYXk7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIExDRF9PbjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwRik7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfT2ZmOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDA4KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9SZXNldDoKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDAxKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDA2KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9DbGVhcjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwMSk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX0xlZnQ6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MTApOworCQlicmVhazsKKworCWNhc2UgTENEX0N1cnNvcl9SaWdodDoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgxNCk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX09mZjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwQyk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX09uOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDBGKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9CbGlua19PZmY6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MEUpOworCQlicmVhazsKKworCWNhc2UgTENEX0dldF9DdXJzb3JfUG9zOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJZGlzcGxheS5jdXJzb3JfYWRkcmVzcyA9IChMQ0RSZWFkSW5zdCk7CisJCQlkaXNwbGF5LmN1cnNvcl9hZGRyZXNzID0KKwkJCSAgICAoZGlzcGxheS5jdXJzb3JfYWRkcmVzcyAmIDB4MDdGKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsICZkaXNwbGF5LAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCQl9CisKKworCWNhc2UgTENEX1NldF9DdXJzb3JfUG9zOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmRpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWEgPSAoZGlzcGxheS5jdXJzb3JfYWRkcmVzcyB8IGtMQ0RfQWRkcik7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoYSk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExDRF9HZXRfQ3Vyc29yOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJZGlzcGxheS5jaGFyYWN0ZXIgPSBMQ0RSZWFkRGF0YTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmRpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoMHgxMCk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExDRF9TZXRfQ3Vyc29yOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmRpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZURhdGEoZGlzcGxheS5jaGFyYWN0ZXIpOworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCUxDRFdyaXRlSW5zdCgweDEwKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJY2FzZSBMQ0RfRGlzcF9MZWZ0OgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDE4KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9EaXNwX1JpZ2h0OgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDFDKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9Ib21lOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDAyKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9Xcml0ZTp7CisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgZGlzcGxheTsKKwkJCXVuc2lnbmVkIGludCBpbmRleDsKKworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmRpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoMHg4MCk7CisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAoZGlzcGxheS5zaXplMSk7IGluZGV4KyspIHsKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlMQ0RXcml0ZURhdGEoZGlzcGxheS5saW5lMVtpbmRleF0pOworCQkJCUJ1c3lDaGVjaygpOworCQkJfQorCisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJTENEV3JpdGVJbnN0KDB4QzApOworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChkaXNwbGF5LnNpemUyKTsgaW5kZXgrKykgeworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCUxDRFdyaXRlRGF0YShkaXNwbGF5LmxpbmUyW2luZGV4XSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExDRF9SZWFkOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlCdXN5Q2hlY2soKTsKKwkJCWZvciAoYWRkcmVzcyA9IGtERF9SMDA7IGFkZHJlc3MgPD0ga0REX1IwMTsKKwkJCSAgICAgYWRkcmVzcysrKSB7CisJCQkJYSA9IChhZGRyZXNzIHwga0xDRF9BZGRyKTsKKworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCUxDRFdyaXRlSW5zdChhKTsKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlkaXNwbGF5LmxpbmUxW2FkZHJlc3NdID0gTENEUmVhZERhdGE7CisJCQl9CisKKwkJCWRpc3BsYXkubGluZTFbMHgyN10gPSAnXDAnOworCisJCQlmb3IgKGFkZHJlc3MgPSBrRERfUjEwOyBhZGRyZXNzIDw9IGtERF9SMTE7CisJCQkgICAgIGFkZHJlc3MrKykgeworCQkJCWEgPSAoYWRkcmVzcyB8IGtMQ0RfQWRkcik7CisKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlMQ0RXcml0ZUluc3QoYSk7CisKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlkaXNwbGF5LmxpbmUyW2FkZHJlc3MgLSAweDQwXSA9CisJCQkJICAgIExDRFJlYWREYXRhOworCQkJfQorCisJCQlkaXNwbGF5LmxpbmUyWzB4MjddID0gJ1wwJzsKKworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmRpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKy8vICBzZXQgYWxsIEdQSU8gbGVkcyB0byBsZWRfZGlzcGxheS5sZWRzCisKKwljYXNlIExFRF9TZXQ6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGxlZF9kaXNwbGF5OworCisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmbGVkX2Rpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWxlZF9zdGF0ZSA9IGxlZF9kaXNwbGF5LmxlZHM7CisJCQlMRURTZXQobGVkX3N0YXRlKTsKKworCQkJYnJlYWs7CisJCX0KKworCisvLyAgc2V0IG9ubHkgYml0IGxlZF9kaXNwbGF5LmxlZHMKKworCWNhc2UgTEVEX0JpdF9TZXQ6eworCQkJdW5zaWduZWQgaW50IGk7CisJCQlpbnQgYml0ID0gMTsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBsZWRfZGlzcGxheTsKKworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmxlZF9kaXNwbGF5LCAoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlmb3IgKGkgPSAwOyBpIDwgKGludCkgbGVkX2Rpc3BsYXkubGVkczsgaSsrKSB7CisJCQkJYml0ID0gMiAqIGJpdDsKKwkJCX0KKworCQkJbGVkX3N0YXRlID0gbGVkX3N0YXRlIHwgYml0OworCQkJTEVEU2V0KGxlZF9zdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCisvLyAgY2xlYXIgb25seSBiaXQgbGVkX2Rpc3BsYXkubGVkcworCisJY2FzZSBMRURfQml0X0NsZWFyOnsKKwkJCXVuc2lnbmVkIGludCBpOworCQkJaW50IGJpdCA9IDE7CisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgbGVkX2Rpc3BsYXk7CisKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgICAgKCZsZWRfZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJZm9yIChpID0gMDsgaSA8IChpbnQpIGxlZF9kaXNwbGF5LmxlZHM7IGkrKykgeworCQkJCWJpdCA9IDIgKiBiaXQ7CisJCQl9CisKKwkJCWxlZF9zdGF0ZSA9IGxlZF9zdGF0ZSAmIH5iaXQ7CisJCQlMRURTZXQobGVkX3N0YXRlKTsKKwkJCWJyZWFrOworCQl9CisKKworCWNhc2UgQlVUVE9OX1JlYWQ6eworCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9IEdQSVJlYWQ7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLCAmYnV0dG9uX2Rpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExJTktfQ2hlY2s6eworCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9CisJCQkgICAgKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoMHhCMDEwMDA2MCkpOworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmJ1dHRvbl9kaXNwbGF5LAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBMSU5LX0NoZWNrXzI6eworCQkJaW50IGlmYWNlX251bTsKKworCQkJLyogcGFuZWwtdXRpbHMgc2hvdWxkIHBhc3MgaW4gdGhlIGRlc2lyZWQgaW50ZXJmYWNlIHN0YXR1cyBpcyB3YW50ZWQgZm9yCisJCQkgKiBpbiAiYnV0dG9ucyIgb2YgdGhlIHN0cnVjdHVyZS4gIFdlIHdpbGwgc2V0IHRoaXMgdG8gbm9uLXplcm8gaWYgdGhlCisJCQkgKiBsaW5rIGlzIGluIGZhY3QgdXAgZm9yIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlLiAgLS1EYXZlTQorCQkJICovCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmJ1dHRvbl9kaXNwbGF5LCAoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywKKwkJCSAgICAgc2l6ZW9mKGJ1dHRvbl9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZmFjZV9udW0gPSBidXR0b25fZGlzcGxheS5idXR0b25zOworI2lmIGRlZmluZWQoQ09ORklHX1RVTElQKSAmJiAwCisJCQlpZiAoaWZhY2VfbnVtID49IDAgJiYKKwkJCSAgICBpZmFjZV9udW0gPCBNQVhfSU5URVJGQUNFUyAmJgorCQkJICAgIGxpbmtjaGVja19jYWxsYmFja3NbaWZhY2VfbnVtXSAhPSBOVUxMKSB7CisJCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9CisJCQkJICAgIGxpbmtjaGVja19jYWxsYmFja3NbaWZhY2VfbnVtXQorCQkJCSAgICAobGlua2NoZWNrX2Nvb2tpZXNbaWZhY2VfbnVtXSk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCWJ1dHRvbl9kaXNwbGF5LmJ1dHRvbnMgPSAwOworCisJCQlpZiAoX19jb3B5X3RvX3VzZXIKKwkJCSAgICAoKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsICZidXR0b25fZGlzcGxheSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworLy8gIEVyYXNlIHRoZSBmbGFzaAorCisJY2FzZSBGTEFTSF9FcmFzZTp7CisKKwkJCWludCBjdHIgPSAwOworCisJCQlpZiAoICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkgcmV0dXJuIC1FUEVSTTsKKworCQkJcHJfaW5mbyhMQ0QgIkVyYXNpbmcgRmxhc2hcbiIpOworCisJCQkvLyBDaGlwIEVyYXNlIFNlcXVlbmNlCisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsIGtGbGFzaF9EYXRhMSk7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjIsIGtGbGFzaF9EYXRhMik7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsIGtGbGFzaF9FcmFzZTMpOworCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLCBrRmxhc2hfRGF0YTEpOworCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIyLCBrRmxhc2hfRGF0YTIpOworCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLCBrRmxhc2hfRXJhc2U2KTsKKworCQkJd2hpbGUgKCghZHFwb2xsKDB4MDAwMDAwMDAsIDB4RkYpKQorCQkJICAgICAgICYmICghdGltZW91dCgweDAwMDAwMDAwKSkpIHsKKwkJCQljdHIrKzsKKwkJCX0KKworCQkJaWYgKFJFQURfRkxBU0goMHgwN0ZGRjApID09IDB4RkYpIHsKKwkJCQlwcl9pbmZvKExDRCAiRXJhc2UgU3VjY2Vzc2Z1bFxuIik7CisJCQl9IGVsc2UgaWYgKHRpbWVvdXQpIHsKKwkJCQlwcl9pbmZvKExDRCAiRXJhc2UgVGltZWQgT3V0XG4iKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworLy8gYnVybiB0aGUgZmxhc2gKKworCWNhc2UgRkxBU0hfQnVybjp7CisKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYnVybl9hZGRyOworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCXVuc2lnbmVkIGludCBpLCBpbmRleDsKKwkJCXVuc2lnbmVkIGNoYXIgKnJvbTsKKworCisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgZGlzcGxheTsKKworCQkJaWYgKCAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApIHJldHVybiAtRVBFUk07CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJvbSA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoKDEyOCksIEdGUF9BVE9NSUMpOworCQkJaWYgKHJvbSA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIExDRCAia21hbGxvYygpIGZhaWxlZCBpbiAlc1xuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJCXByX2luZm8oTENEICJTdGFydGluZyBGbGFzaCBidXJuXG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBGTEFTSF9TSVpFOyBpID0gaSArIDEyOCkgeworCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJICAgIChyb20sIGRpc3BsYXkuUm9tSW1hZ2UgKyBpLCAxMjgpKSB7CisJCQkJCWtmcmVlKHJvbSk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlidXJuX2FkZHIgPSBrRmxhc2hCYXNlICsgaTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGNkX2xvY2ssIGZsYWdzKTsKKwkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAoMTI4KTsgaW5kZXgrKykgeworCisJCQkJCVdSSVRFX0ZMQVNIKGtGbGFzaF9BZGRyMSwKKwkJCQkJCSAgICBrRmxhc2hfRGF0YTEpOworCQkJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjIsCisJCQkJCQkgICAga0ZsYXNoX0RhdGEyKTsKKwkJCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLAorCQkJCQkJICAgIGtGbGFzaF9Qcm9nKTsKKwkJCQkJKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKWJ1cm5fYWRkcikgPQorCQkJCQkgICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKSByb21baW5kZXhdOworCisJCQkJCXdoaWxlICgoIWRxcG9sbCAoYnVybl9hZGRyLAorCQkJCQkJKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIpCisJCQkJCQlyb21baW5kZXhdKSkgJiYKKwkJCQkJCSghdGltZW91dChidXJuX2FkZHIpKSkgeyB9CisJCQkJCWJ1cm5fYWRkcisrOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsY2RfbG9jaywgZmxhZ3MpOworCQkJCWlmICgqICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKQorCQkJCQkoYnVybl9hZGRyIC0gMSkpID09CisJCQkJCSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKQorCQkJCQlyb21baW5kZXggLSAxXSkgeworCQkJCX0gZWxzZSBpZiAodGltZW91dCkgeworCQkJCQlwcl9pbmZvKExDRCAiRmxhc2ggYnVybiB0aW1lZCBvdXRcbiIpOworCQkJCX0KKworCisJCQl9CisJCQlrZnJlZShyb20pOworCisJCQlwcl9pbmZvKExDRCAiRmxhc2ggc3VjY2Vzc2Z1bGx5IGJ1cm5lZFxuIik7CisKKwkJCWJyZWFrOworCQl9CisKKy8vICByZWFkIHRoZSBmbGFzaCBhbGwgYXQgb25jZQorCisJY2FzZSBGTEFTSF9SZWFkOnsKKworCQkJdW5zaWduZWQgY2hhciAqdXNlcl9ieXRlczsKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcmVhZF9hZGRyOworCQkJdW5zaWduZWQgaW50IGk7CisKKwkJCXVzZXJfYnl0ZXMgPQorCQkJICAgICYoKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnKS0+Um9tSW1hZ2VbMF0pOworCisJCQlpZiAoIWFjY2Vzc19vaworCQkJICAgIChWRVJJRllfV1JJVEUsIHVzZXJfYnl0ZXMsIEZMQVNIX1NJWkUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlwcl9pbmZvKExDRCAiUmVhZGluZyBGbGFzaCIpOworCQkJZm9yIChpID0gMDsgaSA8IEZMQVNIX1NJWkU7IGkrKykgeworCQkJCXVuc2lnbmVkIGNoYXIgdG1wX2J5dGU7CisJCQkJcmVhZF9hZGRyID0ga0ZsYXNoQmFzZSArIGk7CisJCQkJdG1wX2J5dGUgPQorCQkJCSAgICAqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopCisJCQkJICAgICAgcmVhZF9hZGRyKTsKKwkJCQlpZiAoX19wdXRfdXNlcih0bXBfYnl0ZSwgJnVzZXJfYnl0ZXNbaV0pKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGxjZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghbGNkX3ByZXNlbnQpCisJCXJldHVybiAtRU5YSU87CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogT25seSBSRVNFVCBvciBORVhUIGNvdW50cyBhcyBidXR0b24gcHJlc3NlZCAqLworCitzdGF0aWMgaW5saW5lIGludCBidXR0b25fcHJlc3NlZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYnV0dG9ucyA9IEdQSVJlYWQ7CisKKwlpZiAoKGJ1dHRvbnMgPT0gQlVUVE9OX05leHQpIHx8IChidXR0b25zID09IEJVVFRPTl9OZXh0X0IpCisJICAgIHx8IChidXR0b25zID09IEJVVFRPTl9SZXNldF9CKSkKKwkJcmV0dXJuIGJ1dHRvbnM7CisJcmV0dXJuIDA7Cit9CisKKy8qIExFRCBkYWVtb24gc2l0cyBvbiB0aGlzIGFuZCB3ZSB3YWtlIGhpbSB1cCBvbmNlIGEga2V5IGlzIHByZXNzZWQuICovCisKK3N0YXRpYyBpbnQgbGNkX3dhaXRlcnMgPSAwOworCitzdGF0aWMgbG9uZyBsY2RfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJbG9uZyBidXR0b25zX25vdzsKKworCWlmIChsY2Rfd2FpdGVycyA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbGNkX3dhaXRlcnMrKzsKKwl3aGlsZSAoKChidXR0b25zX25vdyA9IChsb25nKSBidXR0b25fcHJlc3NlZCgpKSA9PSAwKSAmJgorCSAgICAgICAhKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDAwKTsKKwl9CisJbGNkX3dhaXRlcnMtLTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gYnV0dG9uc19ub3c7Cit9CisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsY2RfZm9wcyA9IHsKKwkucmVhZCA9IGxjZF9yZWFkLAorCS5pb2N0bCA9IGxjZF9pb2N0bCwKKwkub3BlbiA9IGxjZF9vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGxjZF9kZXYgPSB7CisJTUlTQ19EWU5BTUlDX01JTk9SLAorCSJsY2QiLAorCSZsY2RfZm9wcworfTsKKworc3RhdGljIGludCBsY2RfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKworCXByX2luZm8oIiVzXG4iLCBMQ0RfRFJJVkVSKTsKKwltaXNjX3JlZ2lzdGVyKCZsY2RfZGV2KTsKKworCS8qIENoZWNrIHJlZ2lvbj8gTmFhYWghIEp1c3Qgc25hcmYgaXQgdXAuICovCisvKglyZXF1ZXN0X3JlZ2lvbihSVENfUE9SVCgwKSwgUlRDX0lPX0VYVEVOVCwgImxjZCIpOyovCisKKwl1ZGVsYXkoMTUwKTsKKwlkYXRhID0gTENEUmVhZERhdGE7CisJaWYgKChkYXRhICYgMHgwMDAwMDBGRikgPT0gKDB4MDApKSB7CisJCWxjZF9wcmVzZW50ID0gMDsKKwkJcHJfaW5mbyhMQ0QgIkxDRCBOb3QgUHJlc2VudFxuIik7CisJfSBlbHNlIHsKKwkJbGNkX3ByZXNlbnQgPSAxOworCQlXUklURV9HQUwoa0dhbF9EZXZCYW5rMlBSZWcsIGtHYWxfRGV2QmFuazJDZmcpOworCQlXUklURV9HQUwoa0dhbF9EZXZCYW5rM1BSZWcsIGtHYWxfRGV2QmFuazNDZmcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGNkX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmxjZF9kZXYpOworfQorCisvLworLy8gRnVuY3Rpb246IGRxcG9sbAorLy8KKy8vIERlc2NyaXB0aW9uOiAgUG9sbHMgdGhlIGRhdGEgbGluZXMgdG8gc2VlIGlmIHRoZSBmbGFzaCBpcyBidXN5CisvLworLy8gSW46IGFkZHJlc3MsIGJ5dGUgZGF0YQorLy8KKy8vIE91dDogMCA9IGJ1c3ksIDEgPSB3cml0ZSBvciBlcmFzZSBjb21wbGV0ZQorLy8KKy8vCisKK3N0YXRpYyBpbnQgZHFwb2xsKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZHE3OworCisJZHE3ID0gZGF0YSAmIDB4ODA7CisKKwlyZXR1cm4gKChSRUFEX0ZMQVNIKGFkZHJlc3MpICYgMHg4MCkgPT0gZHE3KTsKK30KKworLy8KKy8vIEZ1bmN0aW9uOiB0aW1lb3V0CisvLworLy8gRGVzY3JpcHRpb246IENoZWNrcyB0byBzZWUgaWYgZXJhc2Ugb3Igd3JpdGUgaGFzIHRpbWVkIG91dAorLy8gICAgICAgICAgICAgIEJ5IHBvbGxpbmcgZHE1CisvLworLy8gSW46IGFkZHJlc3MKKy8vCisvLworLy8gT3V0OiAwID0gbm90IHRpbWVkIG91dCwgMSA9IHRpbWVkIG91dAorCitzdGF0aWMgaW50IHRpbWVvdXQodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiAoUkVBRF9GTEFTSChhZGRyZXNzKSAmIDB4MjApID09IDB4MjA7Cit9CisKK21vZHVsZV9pbml0KGxjZF9pbml0KTsKK21vZHVsZV9leGl0KGxjZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmV3IEJvc2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9sY2QuaCBiL2RyaXZlcnMvY2hhci9sY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzhhOTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2xjZC5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogTEVELCBMQ0QgYW5kIEJ1dHRvbiBwYW5lbCBkcml2ZXIgZm9yIENvYmFsdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBieSBBbmRyZXcgQm9zZQorICoKKyAqIExpbnV4IGtlcm5lbCB2ZXJzaW9uIGhpc3Rvcnk6CisgKiAgICAgICBNYXJjaCAyMDAxOiBQb3J0ZWQgZnJvbSAyLjAuMzQgIGJ5IExpYW0gRGF2aWVzCisgKgorICovCisKKy8vIGZ1bmN0aW9uIGhlYWRlcnMKKworc3RhdGljIGludCBkcXBvbGwodm9sYXRpbGUgdW5zaWduZWQgbG9uZywgdm9sYXRpbGUgdW5zaWduZWQgY2hhciApOworc3RhdGljIGludCB0aW1lb3V0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIExDRF9DSEFSU19QRVJfTElORSA0MAorI2RlZmluZSBGTEFTSF9TSVpFIDUyNDI4OAorI2RlZmluZSBNQVhfSURMRV9USU1FIDEyMAorCitzdHJ1Y3QgbGNkX2Rpc3BsYXkgeworICAgICAgICB1bnNpZ25lZCBsb25nIGJ1dHRvbnM7CisgICAgICAgIGludCBzaXplMTsKKyAgICAgICAgaW50IHNpemUyOworICAgICAgICB1bnNpZ25lZCBjaGFyIGxpbmUxW0xDRF9DSEFSU19QRVJfTElORV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbGluZTJbTENEX0NIQVJTX1BFUl9MSU5FXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjdXJzb3JfYWRkcmVzczsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjaGFyYWN0ZXI7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbGVkczsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqUm9tSW1hZ2U7Cit9OworCisKKworI2RlZmluZSBMQ0RfRFJJVkVSCSJDb2JhbHQgTENEIERyaXZlciB2Mi4xMCIKKworI2RlZmluZSBMQ0QJCSJsY2Q6ICIKKworI2RlZmluZSBrTENEX0lSCQkweDBGMDAwMDAwCisjZGVmaW5lIGtMQ0RfRFIJCTB4MEYwMDAwMTAKKyNkZWZpbmUga0dQSQkJMHgwRDAwMDAwMAorI2RlZmluZSBrTEVECQkweDBDMDAwMDAwCisKKyNkZWZpbmUga0REX1IwMCAgICAgICAgIDB4MDAKKyNkZWZpbmUga0REX1IwMSAgICAgICAgIDB4MjcKKyNkZWZpbmUga0REX1IxMCAgICAgICAgIDB4NDAKKyNkZWZpbmUga0REX1IxMSAgICAgICAgIDB4NjcKKworI2RlZmluZSBrTENEX0FkZHIgICAgICAgMHgwMDAwMDA4MAorCisjZGVmaW5lIExDRFRpbWVvdXRWYWx1ZQkweGZmZgorCisKKy8vIEZsYXNoIGRlZmluaXRpb25zIEFNRCAyOUYwNDAKKyNkZWZpbmUga0ZsYXNoQmFzZQkweDBGQzAwMDAwCisKKyNkZWZpbmUga0ZsYXNoX0FkZHIxICAgIDB4NTU1NQorI2RlZmluZSBrRmxhc2hfQWRkcjIgICAgMHgyQUFBCisjZGVmaW5lIGtGbGFzaF9EYXRhMSAgICAweEFBCisjZGVmaW5lIGtGbGFzaF9EYXRhMiAgICAweDU1CisjZGVmaW5lIGtGbGFzaF9Qcm9nICAgICAweEEwCisjZGVmaW5lIGtGbGFzaF9FcmFzZTMgICAweDgwCisjZGVmaW5lIGtGbGFzaF9FcmFzZTYgICAweDEwCisjZGVmaW5lIGtGbGFzaF9SZWFkICAgICAweEYwCisKKyNkZWZpbmUga0ZsYXNoX0lEICAgICAgIDB4OTAKKyNkZWZpbmUga0ZsYXNoX1ZlbkFkZHIgIDB4MDAKKyNkZWZpbmUga0ZsYXNoX0RldkFkZHIgIDB4MDEKKyNkZWZpbmUga0ZsYXNoX1ZlbklEICAgIDB4MDEKKyNkZWZpbmUga0ZsYXNoX0RldklEICAgIDB4QTQgICAgLy8gMjlGMDQwCisvLyNkZWZpbmUga0ZsYXNoX0RldklEICAweEFEICAgIC8vIDI5RjAxNgorCisKKy8vIE1hY3JvcworCisjZGVmaW5lIExDRFdyaXRlRGF0YSh4KQlvdXRsKCh4IDw8IDI0KSwga0xDRF9EUikKKyNkZWZpbmUgTENEV3JpdGVJbnN0KHgpCW91dGwoKHggPDwgMjQpLCBrTENEX0lSKQorCisjZGVmaW5lIExDRFJlYWREYXRhCShpbmwoa0xDRF9EUikgPj4gMjQpCisjZGVmaW5lIExDRFJlYWRJbnN0CShpbmwoa0xDRF9JUikgPj4gMjQpCisKKyNkZWZpbmUgR1BJUmVhZAkJKGlubChrR1BJKSA+PiAyNCkKKworI2RlZmluZSBMRURTZXQoeCkJb3V0YigoY2hhcil4LCBrTEVEKQorCisjZGVmaW5lIFdSSVRFX0dBTCh4LHkpCW91dGwoeSwgMHgwNDAwMDAwMCB8ICh4KSkKKyNkZWZpbmUgQnVzeUNoZWNrKCkJd2hpbGUgKChMQ0RSZWFkSW5zdCAmIDB4ODApID09IDB4ODApCisKKyNkZWZpbmUgV1JJVEVfRkxBU0goeCx5KSBvdXRiKChjaGFyKXksIGtGbGFzaEJhc2UgfCAoeCkpCisjZGVmaW5lIFJFQURfRkxBU0goeCkJKGluYihrRmxhc2hCYXNlIHwgKHgpKSkKKworCisKKy8qCisgKiBGdW5jdGlvbiBjb21tYW5kIGNvZGVzIGZvciBpb19jdGwuCisgKi8KKyNkZWZpbmUgTENEX09uCQkJMQorI2RlZmluZSBMQ0RfT2ZmCQkJMgorI2RlZmluZSBMQ0RfQ2xlYXIJCTMKKyNkZWZpbmUgTENEX1Jlc2V0CQk0CisjZGVmaW5lIExDRF9DdXJzb3JfTGVmdAkJNQorI2RlZmluZSBMQ0RfQ3Vyc29yX1JpZ2h0CTYKKyNkZWZpbmUgTENEX0Rpc3BfTGVmdAkJNworI2RlZmluZSBMQ0RfRGlzcF9SaWdodAkJOAorI2RlZmluZSBMQ0RfR2V0X0N1cnNvcgkJOQorI2RlZmluZSBMQ0RfU2V0X0N1cnNvcgkJMTAKKyNkZWZpbmUgTENEX0hvbWUJCTExCisjZGVmaW5lIExDRF9SZWFkCQkxMgorI2RlZmluZSBMQ0RfV3JpdGUJCTEzCisjZGVmaW5lIExDRF9DdXJzb3JfT2ZmCQkxNAorI2RlZmluZSBMQ0RfQ3Vyc29yX09uCQkxNQorI2RlZmluZSBMQ0RfR2V0X0N1cnNvcl9Qb3MJMTYKKyNkZWZpbmUgTENEX1NldF9DdXJzb3JfUG9zCTE3CisjZGVmaW5lIExDRF9CbGlua19PZmYgICAgICAgICAgIDE4CisKKyNkZWZpbmUgTEVEX1NldAkJCTQwCisjZGVmaW5lIExFRF9CaXRfU2V0CQk0MQorI2RlZmluZSBMRURfQml0X0NsZWFyCQk0MgorCisKKy8vICBCdXR0b24gZGVmcworI2RlZmluZSBCVVRUT05fUmVhZCAgICAgICAgICAgICA1MAorCisvLyAgRmxhc2ggY29tbWFuZCBjb2RlcworI2RlZmluZSBGTEFTSF9FcmFzZQkJNjAKKyNkZWZpbmUgRkxBU0hfQnVybgkJNjEKKyNkZWZpbmUgRkxBU0hfUmVhZAkJNjIKKworCisvLyBFdGhlcm5ldCBMSU5LIGNoZWNrIGhhY2thcm9vCisjZGVmaW5lIExJTktfQ2hlY2sgICAgICAgICAgICAgIDkwCisjZGVmaW5lIExJTktfQ2hlY2tfMgkJOTEKKworLy8gIEJ1dHRvbiBwYXR0ZXJucyAgX0IgLSBzaW5nbGUgbGF5ZXIgbGNkIGJvYXJkcworCisjZGVmaW5lIEJVVFRPTl9OT05FICAgICAgICAgICAgICAgMHgzRgorI2RlZmluZSBCVVRUT05fTk9ORV9CICAgICAgICAgICAgIDB4RkUKKworI2RlZmluZSBCVVRUT05fTGVmdCAgICAgICAgICAgICAgIDB4M0IKKyNkZWZpbmUgQlVUVE9OX0xlZnRfQiAgICAgICAgICAgICAweEZBCisKKyNkZWZpbmUgQlVUVE9OX1JpZ2h0ICAgICAgICAgICAgICAweDM3CisjZGVmaW5lIEJVVFRPTl9SaWdodF9CICAgICAgICAgICAgMHhERQorCisjZGVmaW5lIEJVVFRPTl9VcCAgICAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBCVVRUT05fVXBfQiAgICAgICAgICAgICAgIDB4RjYKKworI2RlZmluZSBCVVRUT05fRG93biAgICAgICAgICAgICAgIDB4MUYKKyNkZWZpbmUgQlVUVE9OX0Rvd25fQiAgICAgICAgICAgICAweEVFCisKKyNkZWZpbmUgQlVUVE9OX05leHQgICAgICAgICAgICAgICAweDNECisjZGVmaW5lIEJVVFRPTl9OZXh0X0IgICAgICAgICAgICAgMHg3RQorCisjZGVmaW5lIEJVVFRPTl9FbnRlciAgICAgICAgICAgICAgMHgzRQorI2RlZmluZSBCVVRUT05fRW50ZXJfQiAgICAgICAgICAgIDB4QkUKKworI2RlZmluZSBCVVRUT05fUmVzZXRfQiAgICAgICAgICAgIDB4RkMKKworCisvLyBkZWJvdW5jZSBjb25zdGFudHMKKworI2RlZmluZSBCVVRUT05fU0VOU0UgICAgICAgICAgICAxNjAwMDAKKyNkZWZpbmUgQlVUVE9OX0RFQk9VTkNFCQk1MDAwCisKKworLy8gIEdhbGlsZW8gcmVnaXN0ZXIgc3R1ZmYKKworI2RlZmluZSBrR2FsX0RldkJhbmsyQ2ZnICAgICAgICAweDE0NjZEQjMzCisjZGVmaW5lIGtHYWxfRGV2QmFuazJQUmVnICAgICAgIDB4NDY0CisjZGVmaW5lIGtHYWxfRGV2QmFuazNDZmcgICAgICAgIDB4MTQ2RkRGRkIKKyNkZWZpbmUga0dhbF9EZXZCYW5rM1BSZWcgICAgICAgMHg0NjgKKworLy8gTmV0d29yaworCisjZGVmaW5lIGtJUEFERFIJCQkxCisjZGVmaW5lIGtORVRNQVNLCQkyCisjZGVmaW5lIGtHQVRFV0FZCQkzCisjZGVmaW5lIGtETlMJCQk0CisKKyNkZWZpbmUga0NsYXNzQQkJCTUKKyNkZWZpbmUga0NsYXNzQgkJCTYKKyNkZWZpbmUga0NsYXNzQwkJCTcKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2xwLmMgYi9kcml2ZXJzL2NoYXIvbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVlOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2xwLmMKQEAgLTAsMCArMSw5OTUgQEAKKy8qCisgKiBHZW5lcmljIHBhcmFsbGVsIHByaW50ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyIGJ5IEppbSBXZWlnYW5kIGFuZCBMaW51cyBUb3J2YWxkcworICogQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMgYnkgTWljaGFlbCBLLiBKb2huc29uCisgKiAtIFRoYW5rcyBtdWNoIHRvIEd1bnRlciBXaW5kYXUgZm9yIHBvaW50aW5nIG91dCB0byBtZSB3aGVyZSB0aGUgZXJyb3IKKyAqICAgY2hlY2tpbmcgb3VnaHQgdG8gYmUuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgTmlnZWwgR2FtYmxlIChhZGRlZCBpbnRlcnJ1cHQgY29kZSkKKyAqIENvcHlyaWdodCAoQykgMTk5NCBieSBBbGFuIENveCAoTW9kdWxhcmlzZWQgaXQpCisgKiBMUENBUkVGVUwsIExQQUJPUlQsIExQR0VUU1RBVFVTIGFkZGVkIGJ5IENocmlzIE1ldGNhbGYsIG1ldGNhbGZAbGNzLm1pdC5lZHUKKyAqIFN0YXRpc3RpY3MgYW5kIHN1cHBvcnQgZm9yIHNsb3cgcHJpbnRlcnMgYnkgUm9iIEphbnNzZW4sIHJvYkBrbm93YXJlLm5sCisgKiAibHA9IiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBhZGRlZCBieSBHcmFudCBHdWVudGhlciwgZ3JhbnRAdG9ycXVlLm5ldAorICogbHBfcmVhZCAoU3RhdHVzIHJlYWRiYWNrKSBzdXBwb3J0IGFkZGVkIGJ5IENhcnN0ZW4gR3Jvc3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcnN0ZW5Ac29sLndvaG5oZWltLnVuaS11bG0uZGUKKyAqIFN1cHBvcnQgZm9yIHBhcnBvcnQgYnkgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogUGFycG9ydCBzaGFyaW5nIGhhY2tpbmcgYnkgQW5kcmVhIEFyY2FuZ2VsaQorICogRml4ZWQga2VybmVsXyh0by9mcm9tKV91c2VyIG1lbW9yeSBjb3B5IHRvIGNoZWNrIGZvciBlcnJvcnMKKyAqIAkJCQlieSBSaWNjYXJkbyBGYWNjaGV0dGkgPGZpemJhbkB0aW4uaXQ+CisgKiAyMi1KQU4tMTk5OCAgQWRkZWQgc3VwcG9ydCBmb3IgZGV2ZnMgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICogUmVkZXNpZ25lZCBpbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIGhhbmRsZSBwcmludGVycyB3aXRoIGJ1Z2d5IGhhbmRzaGFrZQorICoJCQkJYnkgQW5kcmVhIEFyY2FuZ2VsaSwgMTEgTWF5IDE5OTgKKyAqIEZ1bGwgZWZmaWNpZW50IGhhbmRsaW5nIG9mIHByaW50ZXIgd2l0aCBidWdneSBpcnEgaGFuZHNoYWtlIChub3cgSSBoYXZlCisgKiB1bmRlcnN0b29kIHRoZSBtZWFuaW5nIG9mIHRoZSBzdHJhbmdlIGhhbmRzaGFrZSkuIFRoaXMgaXMgZG9uZSBzZW5kaW5nIG5ldworICogY2hhcmFjdGVycyBpZiB0aGUgaW50ZXJydXB0IGlzIGp1c3QgaGFwcGVuZWQsIGV2ZW4gaWYgdGhlIHByaW50ZXIgc2F5IHRvCisgKiBiZSBzdGlsbCBCVVNZLiBUaGlzIGlzIG5lZWRlZCBhdCBsZWFzdCB3aXRoIEVwc29uIFN0eWx1cyBDb2xvci4gVG8gZW5hYmxlCisgKiB0aGUgbmV3IFRSVVNUX0lSUSBtb2RlIHJlYWQgdGhlIGBMUCBPUFRJTUlaQVRJT04nIHNlY3Rpb24gYmVsb3cuLi4KKyAqIEZpeGVkIHRoZSBpcnEgb24gdGhlIHJpc2luZyBlZGdlIG9mIHRoZSBzdHJvYmUgY2FzZS4KKyAqIE9ic29sZXRlZCB0aGUgQ0FSRUZVTCBmbGFnIHNpbmNlIGEgcHJpbnRlciB0aGF0IGRvZXNuJyB0IHdvcmsgd2l0aAorICogQ0FSRUZVTCB3aWxsIGJsb2NrIGEgYml0IGFmdGVyIGluIGxwX2NoZWNrX3N0YXR1cygpLgorICoJCQkJQW5kcmVhIEFyY2FuZ2VsaSwgMTUgT2N0IDE5OTgKKyAqIE9ic29sZXRlZCBhbmQgcmVtb3ZlZCBhbGwgdGhlIGxvd2xldmVsIHN0dWZmIGltcGxlbWVudGVkIGluIHRoZSBsYXN0CisgKiBtb250aCB0byB1c2UgdGhlIElFRUUxMjg0IGZ1bmN0aW9ucyAodGhhdCBoYW5kbGUgdGhlIF9uZXdfIGNvbXBhdGliaWx0eQorICogbW9kZSBmaW5lKS4KKyAqLworCisvKiBUaGlzIGRyaXZlciBzaG91bGQsIGluIHRoZW9yeSwgd29yayB3aXRoIGFueSBwYXJhbGxlbCBwb3J0IHRoYXQgaGFzIGFuCisgKiBhcHByb3ByaWF0ZSBsb3ctbGV2ZWwgZHJpdmVyOyBhbGwgSS9PIGlzIGRvbmUgdGhyb3VnaCB0aGUgcGFycG9ydAorICogYWJzdHJhY3Rpb24gbGF5ZXIuCisgKgorICogSWYgdGhpcyBkcml2ZXIgaXMgYnVpbHQgaW50byB0aGUga2VybmVsLCB5b3UgY2FuIGNvbmZpZ3VyZSBpdCB1c2luZyB0aGUKKyAqIGtlcm5lbCBjb21tYW5kLWxpbmUuICBGb3IgZXhhbXBsZToKKyAqCisgKglscD1wYXJwb3J0MSxub25lLHBhcnBvcnQyCShiaW5kIGxwMCB0byBwYXJwb3J0MSwgZGlzYWJsZSBscDEgYW5kCisgKgkJCQkJIGJpbmQgbHAyIHRvIHBhcnBvcnQyKQorICoKKyAqCWxwPWF1dG8JCQkJKGFzc2lnbiBscCBkZXZpY2VzIHRvIGFsbCBwb3J0cyB0aGF0CisgKgkJCQkgICAgICAgICBoYXZlIHByaW50ZXJzIGF0dGFjaGVkLCBhcyBkZXRlcm1pbmVkCisgKgkJCQkJIGJ5IHRoZSBJRUVFLTEyODQgYXV0b3Byb2JlKQorICogCisgKglscD1yZXNldAkJCShyZXNldCB0aGUgcHJpbnRlciBkdXJpbmcgCisgKgkJCQkJIGluaXRpYWxpc2F0aW9uKQorICoKKyAqCWxwPW9mZgkJCQkoZGlzYWJsZSB0aGUgcHJpbnRlciBkcml2ZXIgZW50aXJlbHkpCisgKgorICogSWYgdGhlIGRyaXZlciBpcyBsb2FkZWQgYXMgYSBtb2R1bGUsIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUKKyAqIHVzaW5nIG1vZHVsZSBwYXJhbWV0ZXJzLiAgVGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlIGNvbW1hbmRzIHdvdWxkIGJlOgorICoKKyAqCSMgaW5zbW9kIGxwLm8gcGFycG9ydD0xLG5vbmUsMgorICoKKyAqCSMgaW5zbW9kIGxwLm8gcGFycG9ydD1hdXRvCisgKgorICoJIyBpbnNtb2QgbHAubyByZXNldD0xCisgKi8KKworLyogQ09NUEFUSUJJTElUWSBXSVRIIE9MRCBLRVJORUxTCisgKgorICogVW5kZXIgTGludXggMi4wIGFuZCBwcmV2aW91cyB2ZXJzaW9ucywgbHAgZGV2aWNlcyB3ZXJlIGJvdW5kIHRvIHBvcnRzIGF0CisgKiBwYXJ0aWN1bGFyIEkvTyBhZGRyZXNzZXMsIGFzIGZvbGxvd3M6CisgKgorICoJbHAwCQkweDNiYworICoJbHAxCQkweDM3OAorICoJbHAyCQkweDI3OAorICoKKyAqIFRoZSBuZXcgZHJpdmVyLCBieSBkZWZhdWx0LCBiaW5kcyBscCBkZXZpY2VzIHRvIHBhcnBvcnQgZGV2aWNlcyBhcyBpdAorICogZmluZHMgdGhlbS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3Ugb25seSBoYXZlIG9uZSBwb3J0LCBpdCB3aWxsIGJlIGJvdW5kCisgKiB0byBscDAgcmVnYXJkbGVzcyBvZiBpdHMgSS9PIGFkZHJlc3MuICBJZiB5b3UgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciwgeW91CisgKiBjYW4gZm9yY2UgaXQgdXNpbmcgdGhlIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGFib3ZlLgorICovCisKKy8qCisgKiBUaGUgbmV3IGludGVycnVwdCBoYW5kbGluZyBjb2RlIHRha2UgY2FyZSBvZiB0aGUgYnVnZ3kgaGFuZHNoYWtlCisgKiBvZiBzb21lIEhQIGFuZCBFcHNvbiBwcmludGVyOgorICogX19fCisgKiBBQ0sgICAgX19fX19fX19fX19fX19fICAgIF9fX19fX19fX19fCisgKiAgICAgICAgICAgICAgICAgICAgICAgfF9ffAorICogX19fXworICogQlVTWSAgIF9fX19fX19fXyAgICAgICAgICAgICAgX19fX19fXworICogICAgICAgICAgICAgICAgIHxfX19fX19fX19fX198CisgKgorICogSSBkaXNjb3ZlcmVkIHRoaXMgdXNpbmcgdGhlIHByaW50ZXIgc2Nhbm5lciB0aGF0IHlvdSBjYW4gZmluZCBhdDoKKyAqCisgKglmdHA6Ly9lLW1pbmQuY29tL3B1Yi9saW51eC9wc2Nhbi8KKyAqCisgKgkJCQkJMTEgTWF5IDk4LCBBbmRyZWEgQXJjYW5nZWxpCisgKgorICogTXkgcHJpbnRlciBzY2FubmVyIHJ1biBvbiBhbiBFcHNvbiBTdHlsdXMgQ29sb3Igc2hvdyB0aGF0IHN1Y2ggcHJpbnRlcgorICogZ2VuZXJhdGVzIHRoZSBpcnEgb24gdGhlIF9yaXNpbmdfIGVkZ2Ugb2YgdGhlIFNUUk9CRS4gTm93IGxwIGhhbmRsZQorICogdGhpcyBjYXNlIGZpbmUgdG9vLgorICoKKyAqCQkJCQkxNSBPY3QgMTk5OCwgQW5kcmVhIEFyY2FuZ2VsaQorICoKKyAqIFRoZSBzbyBjYWxsZWQgYGJ1Z2d5JyBoYW5kc2hha2UgaXMgcmVhbGx5IHRoZSB3ZWxsIGRvY3VtZW50ZWQKKyAqIGNvbXBhdGliaWxpdHkgbW9kZSBJRUVFMTI4NCBoYW5kc2hha2UuIFRoZXkgY2hhbmdlZCB0aGUgd2VsbCBrbm93bgorICogQ2VudHJvbmljcyBoYW5kc2hha2UgYWNraW5nIGluIHRoZSBtaWRkbGUgb2YgYnVzeSBleHBlY3RpbmcgdG8gbm90CisgKiBicmVhayBkcml2ZXJzIG9yIGxlZ2FjeSBhcHBsaWNhdGlvbiwgd2hpbGUgdGhleSBicm9rZW4gbGludXggbHAKKyAqIHVudGlsIEkgZml4ZWQgaXQgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgcHJvdG9jb2wgYnkgaGFuZCBzb21lCisgKiBtb250aCBhZ28uLi4KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCBEZWMgMTk5OCwgQW5kcmVhIEFyY2FuZ2VsaQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBUaW0gV2F1Z2ggKGFkZGVkIExQU0VUVElNRU9VVCBpb2N0bCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI3VuZGVmIExQX1NUQVRTCisjaW5jbHVkZSA8bGludXgvbHAuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogaWYgeW91IGhhdmUgbW9yZSB0aGFuIDggcHJpbnRlcnMsIHJlbWVtYmVyIHRvIGluY3JlYXNlIExQX05PICovCisjZGVmaW5lIExQX05PIDgKKworLyogUk9VTkRfVVAgbWFjcm8gZnJvbSBmcy9zZWxlY3QuYyAqLworI2RlZmluZSBST1VORF9VUCh4LHkpICgoKHgpKyh5KS0xKS8oeSkpCisKK3N0YXRpYyBzdHJ1Y3QgbHBfc3RydWN0IGxwX3RhYmxlW0xQX05PXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBscF9jb3VudCA9IDA7CitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqbHBfY2xhc3M7CisKKyNpZmRlZiBDT05GSUdfTFBfQ09OU09MRQorc3RhdGljIHN0cnVjdCBwYXJwb3J0ICpjb25zb2xlX3JlZ2lzdGVyZWQ7IC8vIGluaXRpYWxseSBOVUxMCisjZW5kaWYgLyogQ09ORklHX0xQX0NPTlNPTEUgKi8KKworI3VuZGVmIExQX0RFQlVHCisKKy8qIEJpdHMgdXNlZCB0byBtYW5hZ2UgY2xhaW1pbmcgdGhlIHBhcnBvcnQgZGV2aWNlICovCisjZGVmaW5lIExQX1BSRUVNUFRfUkVRVUVTVCAxCisjZGVmaW5lIExQX1BBUlBPUlRfQ0xBSU1FRCAyCisKKy8qIC0tLSBsb3ctbGV2ZWwgcG9ydCBhY2Nlc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSByX2R0cih4KQkocGFycG9ydF9yZWFkX2RhdGEobHBfdGFibGVbKHgpXS5kZXYtPnBvcnQpKQorI2RlZmluZSByX3N0cih4KQkocGFycG9ydF9yZWFkX3N0YXR1cyhscF90YWJsZVsoeCldLmRldi0+cG9ydCkpCisjZGVmaW5lIHdfY3RyKHgseSkJZG8geyBwYXJwb3J0X3dyaXRlX2NvbnRyb2wobHBfdGFibGVbKHgpXS5kZXYtPnBvcnQsICh5KSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHdfZHRyKHgseSkJZG8geyBwYXJwb3J0X3dyaXRlX2RhdGEobHBfdGFibGVbKHgpXS5kZXYtPnBvcnQsICh5KSk7IH0gd2hpbGUgKDApCisKKy8qIENsYWltIHRoZSBwYXJwb3J0IG9yIGJsb2NrIHRyeWluZyB1bmxlc3Mgd2UndmUgYWxyZWFkeSBjbGFpbWVkIGl0ICovCitzdGF0aWMgdm9pZCBscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrKHN0cnVjdCBscF9zdHJ1Y3QgKnRoaXNfbHApCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KExQX1BBUlBPUlRfQ0xBSU1FRCwgJnRoaXNfbHAtPmJpdHMpKSB7CisJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKHRoaXNfbHAtPmRldik7CisJfQorfQorCisvKiBDbGFpbSB0aGUgcGFycG9ydCBvciBibG9jayB0cnlpbmcgdW5sZXNzIHdlJ3ZlIGFscmVhZHkgY2xhaW1lZCBpdCAqLworc3RhdGljIHZvaWQgbHBfcmVsZWFzZV9wYXJwb3J0KHN0cnVjdCBscF9zdHJ1Y3QgKnRoaXNfbHApCit7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChMUF9QQVJQT1JUX0NMQUlNRUQsICZ0aGlzX2xwLT5iaXRzKSkgeworCQlwYXJwb3J0X3JlbGVhc2UgKHRoaXNfbHAtPmRldik7CisJfQorfQorCisKKworc3RhdGljIGludCBscF9wcmVlbXB0KHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgbHBfc3RydWN0ICp0aGlzX2xwID0gKHN0cnVjdCBscF9zdHJ1Y3QgKiloYW5kbGU7CisJc2V0X2JpdChMUF9QUkVFTVBUX1JFUVVFU1QsICZ0aGlzX2xwLT5iaXRzKTsKKwlyZXR1cm4gKDEpOworfQorCisKKy8qIAorICogVHJ5IHRvIG5lZ290aWF0ZSB0byBhIG5ldyBtb2RlOyBpZiB1bnN1Y2Nlc3NmdWwgbmVnb3RpYXRlIHRvCisgKiBjb21wYXRpYmlsaXR5IG1vZGUuICBSZXR1cm4gdGhlIG1vZGUgd2UgZW5kZWQgdXAgaW4uCisgKi8KK3N0YXRpYyBpbnQgbHBfbmVnb3RpYXRlKHN0cnVjdCBwYXJwb3J0ICogcG9ydCwgaW50IG1vZGUpCit7CisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlIChwb3J0LCBtb2RlKSAhPSAwKSB7CisJCW1vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwkJcGFycG9ydF9uZWdvdGlhdGUgKHBvcnQsIG1vZGUpOworCX0KKworCXJldHVybiAobW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgbHBfcmVzZXQoaW50IG1pbm9yKQoreworCWludCByZXR2YWw7CisJbHBfY2xhaW1fcGFycG9ydF9vcl9ibG9jayAoJmxwX3RhYmxlW21pbm9yXSk7CisJd19jdHIobWlub3IsIExQX1BTRUxFQ1ApOworCXVkZWxheSAoTFBfREVMQVkpOworCXdfY3RyKG1pbm9yLCBMUF9QU0VMRUNQIHwgTFBfUElOSVRQKTsKKwlyZXR2YWwgPSByX3N0cihtaW5vcik7CisJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBscF9lcnJvciAoaW50IG1pbm9yKQoreworCURFRklORV9XQUlUKHdhaXQpOworCWludCBwb2xsaW5nOworCisJaWYgKExQX0YobWlub3IpICYgTFBfQUJPUlQpCisJCXJldHVybjsKKworCXBvbGxpbmcgPSBscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LT5pcnEgPT0gUEFSUE9SVF9JUlFfTk9ORTsKKwlpZiAocG9sbGluZykgbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwlwcmVwYXJlX3RvX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChMUF9USU1FT1VUX1BPTExFRCk7CisJZmluaXNoX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQpOworCWlmIChwb2xsaW5nKSBscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwllbHNlIHBhcnBvcnRfeWllbGRfYmxvY2tpbmcgKGxwX3RhYmxlW21pbm9yXS5kZXYpOworfQorCitzdGF0aWMgaW50IGxwX2NoZWNrX3N0YXR1cyhpbnQgbWlub3IpCit7CisJaW50IGVycm9yID0gMDsKKwl1bnNpZ25lZCBpbnQgbGFzdCA9IGxwX3RhYmxlW21pbm9yXS5sYXN0X2Vycm9yOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gcl9zdHIobWlub3IpOworCWlmICgoc3RhdHVzICYgTFBfUEVSUk9SUCkgJiYgIShMUF9GKG1pbm9yKSAmIExQX0NBUkVGVUwpKQorCQkvKiBObyBlcnJvci4gKi8KKwkJbGFzdCA9IDA7CisJZWxzZSBpZiAoKHN0YXR1cyAmIExQX1BPVVRQQSkpIHsKKwkJaWYgKGxhc3QgIT0gTFBfUE9VVFBBKSB7CisJCQlsYXN0ID0gTFBfUE9VVFBBOworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHAlZCBvdXQgb2YgcGFwZXJcbiIsIG1pbm9yKTsKKwkJfQorCQllcnJvciA9IC1FTk9TUEM7CisJfSBlbHNlIGlmICghKHN0YXR1cyAmIExQX1BTRUxFQ0QpKSB7CisJCWlmIChsYXN0ICE9IExQX1BTRUxFQ0QpIHsKKwkJCWxhc3QgPSBMUF9QU0VMRUNEOworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHAlZCBvZmYtbGluZVxuIiwgbWlub3IpOworCQl9CisJCWVycm9yID0gLUVJTzsKKwl9IGVsc2UgaWYgKCEoc3RhdHVzICYgTFBfUEVSUk9SUCkpIHsKKwkJaWYgKGxhc3QgIT0gTFBfUEVSUk9SUCkgeworCQkJbGFzdCA9IExQX1BFUlJPUlA7CisJCQlwcmludGsoS0VSTl9JTkZPICJscCVkIG9uIGZpcmVcbiIsIG1pbm9yKTsKKwkJfQorCQllcnJvciA9IC1FSU87CisJfSBlbHNlIHsKKwkJbGFzdCA9IDA7IC8qIENvbWUgaGVyZSBpZiBMUF9DQVJFRlVMIGlzIHNldCBhbmQgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzIGFyZSByZXBvcnRlZC4gKi8KKwl9CisKKwlscF90YWJsZVttaW5vcl0ubGFzdF9lcnJvciA9IGxhc3Q7CisKKwlpZiAobGFzdCAhPSAwKQorCQlscF9lcnJvcihtaW5vcik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbHBfd2FpdF9yZWFkeShpbnQgbWlub3IsIGludCBub25ibG9jaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJLyogSWYgd2UncmUgbm90IGluIGNvbXBhdGliaWxpdHkgbW9kZSwgd2UncmUgcmVhZHkgbm93ISAqLworCWlmIChscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlICE9IElFRUUxMjg0X01PREVfQ09NUEFUKSB7CisJICByZXR1cm4gKDApOworCX0KKworCWRvIHsKKwkJZXJyb3IgPSBscF9jaGVja19zdGF0dXMgKG1pbm9yKTsKKwkJaWYgKGVycm9yICYmIChub25ibG9jayB8fCAoTFBfRihtaW5vcikgJiBMUF9BQk9SVCkpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCWVycm9yID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3NpemVfdCBscF93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPSBscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0OworCWNoYXIgKmtidWYgPSBscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyOworCXNzaXplX3QgcmV0diA9IDA7CisJc3NpemVfdCB3cml0dGVuOworCXNpemVfdCBjb3B5X3NpemUgPSBjb3VudDsKKwlpbnQgbm9uYmxvY2sgPSAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCQkJKExQX0YobWlub3IpICYgTFBfQUJPUlQpKTsKKworI2lmZGVmIExQX1NUQVRTCisJaWYgKGppZmZpZXMtbHBfdGFibGVbbWlub3JdLmxhc3RjYWxsID4gTFBfVElNRShtaW5vcikpCisJCWxwX3RhYmxlW21pbm9yXS5ydW5jaGFycyA9IDA7CisKKwlscF90YWJsZVttaW5vcl0ubGFzdGNhbGwgPSBqaWZmaWVzOworI2VuZGlmCisKKwkvKiBOZWVkIHRvIGNvcHkgdGhlIGRhdGEgZnJvbSB1c2VyLXNwYWNlLiAqLworCWlmIChjb3B5X3NpemUgPiBMUF9CVUZGRVJfU0laRSkKKwkJY29weV9zaXplID0gTFBfQlVGRkVSX1NJWkU7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbHBfdGFibGVbbWlub3JdLnBvcnRfbXV0ZXgpKQorCQlyZXR1cm4gLUVJTlRSOworCisJaWYgKGNvcHlfZnJvbV91c2VyIChrYnVmLCBidWYsIGNvcHlfc2l6ZSkpIHsKKwkJcmV0diA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKyAJLyogQ2xhaW0gUGFycG9ydCBvciBzbGVlcCB1bnRpbCBpdCBiZWNvbWVzIGF2YWlsYWJsZQorIAkgKi8KKwlscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwkvKiBHbyB0byB0aGUgcHJvcGVyIG1vZGUuICovCisJbHBfdGFibGVbbWlub3JdLmN1cnJlbnRfbW9kZSA9IGxwX25lZ290aWF0ZSAocG9ydCwgCisJCQkJCQkgICAgIGxwX3RhYmxlW21pbm9yXS5iZXN0X21vZGUpOworCisJcGFycG9ydF9zZXRfdGltZW91dCAobHBfdGFibGVbbWlub3JdLmRldiwKKwkJCSAgICAgKG5vbmJsb2NrID8gUEFSUE9SVF9JTkFDVElWSVRZX09fTk9OQkxPQ0sKKwkJCSAgICAgIDogbHBfdGFibGVbbWlub3JdLnRpbWVvdXQpKTsKKworCWlmICgocmV0diA9IGxwX3dhaXRfcmVhZHkgKG1pbm9yLCBub25ibG9jaykpID09IDApCisJZG8geworCQkvKiBXcml0ZSB0aGUgZGF0YS4gKi8KKwkJd3JpdHRlbiA9IHBhcnBvcnRfd3JpdGUgKHBvcnQsIGtidWYsIGNvcHlfc2l6ZSk7CisJCWlmICh3cml0dGVuID4gMCkgeworCQkJY29weV9zaXplIC09IHdyaXR0ZW47CisJCQljb3VudCAtPSB3cml0dGVuOworCQkJYnVmICArPSB3cml0dGVuOworCQkJcmV0diArPSB3cml0dGVuOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJaWYgKHJldHYgPT0gMCkKKwkJCQlyZXR2ID0gLUVJTlRSOworCisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X3NpemUgPiAwKSB7CisJCQkvKiBpbmNvbXBsZXRlIHdyaXRlIC0+IGNoZWNrIGVycm9yICEgKi8KKwkJCWludCBlcnJvcjsKKworCQkJcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIAorCQkJCQkgICBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJCQlscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlID0gSUVFRTEyODRfTU9ERV9DT01QQVQ7CisKKwkJCWVycm9yID0gbHBfd2FpdF9yZWFkeSAobWlub3IsIG5vbmJsb2NrKTsKKworCQkJaWYgKGVycm9yKSB7CisJCQkJaWYgKHJldHYgPT0gMCkKKwkJCQkJcmV0diA9IGVycm9yOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChub25ibG9jaykgeworCQkJCWlmIChyZXR2ID09IDApCisJCQkJCXJldHYgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwYXJwb3J0X3lpZWxkX2Jsb2NraW5nIChscF90YWJsZVttaW5vcl0uZGV2KTsKKwkJCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgCisJCQkgID0gbHBfbmVnb3RpYXRlIChwb3J0LCAKKwkJCQkJICBscF90YWJsZVttaW5vcl0uYmVzdF9tb2RlKTsKKworCQl9IGVsc2UgaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJc2NoZWR1bGUgKCk7CisKKwkJaWYgKGNvdW50KSB7CisJCQljb3B5X3NpemUgPSBjb3VudDsKKwkJCWlmIChjb3B5X3NpemUgPiBMUF9CVUZGRVJfU0laRSkKKwkJCQljb3B5X3NpemUgPSBMUF9CVUZGRVJfU0laRTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgY29weV9zaXplKSkgeworCQkJCWlmIChyZXR2ID09IDApCisJCQkJCXJldHYgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9CQorCX0gd2hpbGUgKGNvdW50ID4gMCk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KExQX1BSRUVNUFRfUkVRVUVTVCwgCisJCQkgICAgICAgJmxwX3RhYmxlW21pbm9yXS5iaXRzKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJscCVkIHJlbGVhc2luZyBwYXJwb3J0XG4iLCBtaW5vcik7CisJCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCAKKwkJCQkgICBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwkJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwl9CitvdXRfdW5sb2NrOgorCXVwICgmbHBfdGFibGVbbWlub3JdLnBvcnRfbXV0ZXgpOworCisgCXJldHVybiByZXR2OworfQorCisjaWZkZWYgQ09ORklHX1BBUlBPUlRfMTI4NAorCisvKiBTdGF0dXMgcmVhZGJhY2sgY29uZm9ybWluZyB0byBpZWVlMTI4NCAqLworc3RhdGljIHNzaXplX3QgbHBfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJdW5zaWduZWQgaW50IG1pbm9yPWltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPSBscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0OworCXNzaXplX3QgcmV0dmFsID0gMDsKKwljaGFyICprYnVmID0gbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlcjsKKwlpbnQgbm9uYmxvY2sgPSAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCQkJKExQX0YobWlub3IpICYgTFBfQUJPUlQpKTsKKworCWlmIChjb3VudCA+IExQX0JVRkZFUl9TSVpFKQorCQljb3VudCA9IExQX0JVRkZFUl9TSVpFOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmxwX3RhYmxlW21pbm9yXS5wb3J0X211dGV4KSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCisJcGFycG9ydF9zZXRfdGltZW91dCAobHBfdGFibGVbbWlub3JdLmRldiwKKwkJCSAgICAgKG5vbmJsb2NrID8gUEFSUE9SVF9JTkFDVElWSVRZX09fTk9OQkxPQ0sKKwkJCSAgICAgIDogbHBfdGFibGVbbWlub3JdLnRpbWVvdXQpKTsKKworCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LAorCQkJICAgICAgIElFRUUxMjg0X01PREVfTklCQkxFKSkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAocmV0dmFsID09IDApIHsKKwkJcmV0dmFsID0gcGFycG9ydF9yZWFkIChwb3J0LCBrYnVmLCBjb3VudCk7CisKKwkJaWYgKHJldHZhbCA+IDApCisJCQlicmVhazsKKworCQlpZiAobm9uYmxvY2spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdhaXQgZm9yIGRhdGEuICovCisKKwkJaWYgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQtPmlycSA9PSBQQVJQT1JUX0lSUV9OT05FKSB7CisJCQlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwKKwkJCQkJICAgSUVFRTEyODRfTU9ERV9DT01QQVQpOworCQkJbHBfZXJyb3IgKG1pbm9yKTsKKwkJCWlmIChwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwKKwkJCQkJICAgICAgIElFRUUxMjg0X01PREVfTklCQkxFKSkgeworCQkJCXJldHZhbCA9IC1FSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmVwYXJlX3RvX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KExQX1RJTUVPVVRfUE9MTEVEKTsKKwkJCWZpbmlzaF93YWl0KCZscF90YWJsZVttaW5vcl0ud2FpdHEsICZ3YWl0KTsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uZF9yZXNjaGVkICgpOworCX0KKwlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpOworIG91dDoKKwlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCisJaWYgKHJldHZhbCA+IDAgJiYgY29weV90b191c2VyIChidWYsIGtidWYsIHJldHZhbCkpCisJCXJldHZhbCA9IC1FRkFVTFQ7CisKKwl1cCAoJmxwX3RhYmxlW21pbm9yXS5wb3J0X211dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBJRUVFIDEyODQgc3VwcG9ydCAqLworCitzdGF0aWMgaW50IGxwX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCisJaWYgKG1pbm9yID49IExQX05PKQorCQlyZXR1cm4gLUVOWElPOworCWlmICgoTFBfRihtaW5vcikgJiBMUF9FWElTVCkgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChMUF9CVVNZX0JJVF9QT1MsICZMUF9GKG1pbm9yKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBJZiBBQk9SVE9QRU4gaXMgc2V0IGFuZCB0aGUgcHJpbnRlciBpcyBvZmZsaW5lIG9yIG91dCBvZiBwYXBlciwKKwkgICB3ZSBtYXkgc3RpbGwgd2FudCB0byBvcGVuIGl0IHRvIHBlcmZvcm0gaW9jdGwoKXMuICBUaGVyZWZvcmUgd2UKKwkgICBoYXZlIGNvbW1hbmRlZXJlZCBPX05PTkJMT0NLLCBldmVuIHRob3VnaCBpdCBpcyBiZWluZyB1c2VkIGluCisJICAgYSBub24tc3RhbmRhcmQgbWFubmVyLiAgVGhpcyBpcyBzdHJpY3RseSBhIExpbnV4IGhhY2ssIGFuZAorCSAgIHNob3VsZCBtb3N0IGxpa2VseSBvbmx5IGV2ZXIgYmUgdXNlZCBieSB0aGUgdHVuZWxwIGFwcGxpY2F0aW9uLiAqLworCWlmICgoTFBfRihtaW5vcikgJiBMUF9BQk9SVE9QRU4pICYmICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCWludCBzdGF0dXM7CisJCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCQlzdGF0dXMgPSByX3N0cihtaW5vcik7CisJCWxwX3JlbGVhc2VfcGFycG9ydCAoJmxwX3RhYmxlW21pbm9yXSk7CisJCWlmIChzdGF0dXMgJiBMUF9QT1VUUEEpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImxwJWQgb3V0IG9mIHBhcGVyXG4iLCBtaW5vcik7CisJCQlMUF9GKG1pbm9yKSAmPSB+TFBfQlVTWTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9IGVsc2UgaWYgKCEoc3RhdHVzICYgTFBfUFNFTEVDRCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImxwJWQgb2ZmLWxpbmVcbiIsIG1pbm9yKTsKKwkJCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAoIShzdGF0dXMgJiBMUF9QRVJST1JQKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJscCVkIHByaW50ZXIgZXJyb3JcbiIsIG1pbm9yKTsKKwkJCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlciA9IChjaGFyICopIGttYWxsb2MoTFBfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlcikgeworCQlMUF9GKG1pbm9yKSAmPSB+TFBfQlVTWTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIERldGVybWluZSBpZiB0aGUgcGVyaXBoZXJhbCBzdXBwb3J0cyBFQ1AgbW9kZSAqLworCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCWlmICggKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQtPm1vZGVzICYgUEFSUE9SVF9NT0RFX0VDUCkgJiYKKyAgICAgICAgICAgICAhcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTEyODRfTU9ERV9FQ1ApKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJscCVkOiBFQ1AgbW9kZVxuIiwgbWlub3IpOworCQlscF90YWJsZVttaW5vcl0uYmVzdF9tb2RlID0gSUVFRTEyODRfTU9ERV9FQ1A7CisJfSBlbHNlIHsKKwkJbHBfdGFibGVbbWlub3JdLmJlc3RfbW9kZSA9IElFRUUxMjg0X01PREVfQ09NUEFUOworCX0KKwkvKiBMZWF2ZSBwZXJpcGhlcmFsIGluIGNvbXBhdGliaWxpdHkgbW9kZSAqLworCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwlscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlID0gSUVFRTEyODRfTU9ERV9DT01QQVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwlscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpOworCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCWtmcmVlKGxwX3RhYmxlW21pbm9yXS5scF9idWZmZXIpOworCWxwX3RhYmxlW21pbm9yXS5scF9idWZmZXIgPSBOVUxMOworCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgc3RhdHVzOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgTFBfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAibHAlZCBpb2N0bCwgY21kOiAweCV4LCBhcmc6IDB4JWx4XG4iLCBtaW5vciwgY21kLCBhcmcpOworI2VuZGlmCisJaWYgKG1pbm9yID49IExQX05PKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoKExQX0YobWlub3IpICYgTFBfRVhJU1QpID09IDApCisJCXJldHVybiAtRU5PREVWOworCXN3aXRjaCAoIGNtZCApIHsKKwkJc3RydWN0IHRpbWV2YWwgcGFyX3RpbWVvdXQ7CisJCWxvbmcgdG9famlmZmllczsKKworCQljYXNlIExQVElNRToKKwkJCUxQX1RJTUUobWlub3IpID0gYXJnICogSFovMTAwOworCQkJYnJlYWs7CisJCWNhc2UgTFBDSEFSOgorCQkJTFBfQ0hBUihtaW5vcikgPSBhcmc7CisJCQlicmVhazsKKwkJY2FzZSBMUEFCT1JUOgorCQkJaWYgKGFyZykKKwkJCQlMUF9GKG1pbm9yKSB8PSBMUF9BQk9SVDsKKwkJCWVsc2UKKwkJCQlMUF9GKG1pbm9yKSAmPSB+TFBfQUJPUlQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEFCT1JUT1BFTjoKKwkJCWlmIChhcmcpCisJCQkJTFBfRihtaW5vcikgfD0gTFBfQUJPUlRPUEVOOworCQkJZWxzZQorCQkJCUxQX0YobWlub3IpICY9IH5MUF9BQk9SVE9QRU47CisJCQlicmVhazsKKwkJY2FzZSBMUENBUkVGVUw6CisJCQlpZiAoYXJnKQorCQkJCUxQX0YobWlub3IpIHw9IExQX0NBUkVGVUw7CisJCQllbHNlCisJCQkJTFBfRihtaW5vcikgJj0gfkxQX0NBUkVGVUw7CisJCQlicmVhazsKKwkJY2FzZSBMUFdBSVQ6CisJCQlMUF9XQUlUKG1pbm9yKSA9IGFyZzsKKwkJCWJyZWFrOworCQljYXNlIExQU0VUSVJROiAKKwkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTFBHRVRJUlE6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZMUF9JUlEobWlub3IpLAorCQkJCQlzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEdFVFNUQVRVUzoKKwkJCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCQkJc3RhdHVzID0gcl9zdHIobWlub3IpOworCQkJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmc3RhdHVzLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBMUFJFU0VUOgorCQkJbHBfcmVzZXQobWlub3IpOworCQkJYnJlYWs7CisjaWZkZWYgTFBfU1RBVFMKKwkJY2FzZSBMUEdFVFNUQVRTOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmTFBfU1RBVChtaW5vciksCisJCQkJCXNpemVvZihzdHJ1Y3QgbHBfc3RhdHMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCW1lbXNldCgmTFBfU1RBVChtaW5vciksIDAsCisJCQkJCQlzaXplb2Yoc3RydWN0IGxwX3N0YXRzKSk7CisJCQlicmVhazsKKyNlbmRpZgorIAkJY2FzZSBMUEdFVEZMQUdTOgorIAkJCXN0YXR1cyA9IExQX0YobWlub3IpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmc3RhdHVzLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIExQU0VUVElNRU9VVDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlciAoJnBhcl90aW1lb3V0LCBhcmdwLAorCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgdGltZXZhbCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQkvKiBDb252ZXJ0IHRvIGppZmZpZXMsIHBsYWNlIGluIGxwX3RhYmxlICovCisJCQlpZiAoKHBhcl90aW1lb3V0LnR2X3NlYyA8IDApIHx8CisJCQkgICAgKHBhcl90aW1lb3V0LnR2X3VzZWMgPCAwKSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJdG9famlmZmllcyA9IFJPVU5EX1VQKHBhcl90aW1lb3V0LnR2X3VzZWMsIDEwMDAwMDAvSFopOworCQkJdG9famlmZmllcyArPSBwYXJfdGltZW91dC50dl9zZWMgKiAobG9uZykgSFo7CisJCQlpZiAodG9famlmZmllcyA8PSAwKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlscF90YWJsZVttaW5vcl0udGltZW91dCA9IHRvX2ppZmZpZXM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLndyaXRlCQk9IGxwX3dyaXRlLAorCS5pb2N0bAkJPSBscF9pb2N0bCwKKwkub3BlbgkJPSBscF9vcGVuLAorCS5yZWxlYXNlCT0gbHBfcmVsZWFzZSwKKyNpZmRlZiBDT05GSUdfUEFSUE9SVF8xMjg0CisJLnJlYWQJCT0gbHBfcmVhZCwKKyNlbmRpZgorfTsKKworLyogLS0tIHN1cHBvcnQgZm9yIGNvbnNvbGUgb24gdGhlIGxpbmUgcHJpbnRlciAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0xQX0NPTlNPTEUKKworI2RlZmluZSBDT05TT0xFX0xQIDAKKworLyogSWYgdGhlIHByaW50ZXIgaXMgb3V0IG9mIHBhcGVyLCB3ZSBjYW4gZWl0aGVyIGxvc2UgdGhlIG1lc3NhZ2VzIG9yCisgKiBzdGFsbCB1bnRpbCB0aGUgcHJpbnRlciBpcyBoYXBweSBhZ2Fpbi4gIERlZmluZSBDT05TT0xFX0xQX1NUUklDVAorICogbm9uLXplcm8gdG8gZ2V0IHRoZSBsYXR0ZXIgYmVoYXZpb3VyLiAqLworI2RlZmluZSBDT05TT0xFX0xQX1NUUklDVCAxCisKKy8qIFRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuICovCisKK3N0YXRpYyB2b2lkIGxwX2NvbnNvbGVfd3JpdGUgKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCSAgICAgIHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCBwYXJkZXZpY2UgKmRldiA9IGxwX3RhYmxlW0NPTlNPTEVfTFBdLmRldjsKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGRldi0+cG9ydDsKKwlzc2l6ZV90IHdyaXR0ZW47CisKKwlpZiAocGFycG9ydF9jbGFpbSAoZGV2KSkKKwkJLyogTm90aGluZyB3ZSBjYW4gZG8uICovCisJCXJldHVybjsKKworCXBhcnBvcnRfc2V0X3RpbWVvdXQgKGRldiwgMCk7CisKKwkvKiBHbyB0byBjb21wYXRpYmlsaXR5IG1vZGUuICovCisJcGFycG9ydF9uZWdvdGlhdGUgKHBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKworCWRvIHsKKwkJLyogV3JpdGUgdGhlIGRhdGEsIGNvbnZlcnRpbmcgTEYtPkNSTEYgYXMgd2UgZ28uICovCisJCXNzaXplX3QgY2Fud3JpdGUgPSBjb3VudDsKKwkJY2hhciAqbGYgPSBtZW1jaHIgKHMsICdcbicsIGNvdW50KTsKKwkJaWYgKGxmKQorCQkJY2Fud3JpdGUgPSBsZiAtIHM7CisKKwkJaWYgKGNhbndyaXRlID4gMCkgeworCQkJd3JpdHRlbiA9IHBhcnBvcnRfd3JpdGUgKHBvcnQsIHMsIGNhbndyaXRlKTsKKworCQkJaWYgKHdyaXR0ZW4gPD0gMCkKKwkJCQljb250aW51ZTsKKworCQkJcyArPSB3cml0dGVuOworCQkJY291bnQgLT0gd3JpdHRlbjsKKwkJCWNhbndyaXRlIC09IHdyaXR0ZW47CisJCX0KKworCQlpZiAobGYgJiYgY2Fud3JpdGUgPD0gMCkgeworCQkJY29uc3QgY2hhciAqY3JsZiA9ICJcclxuIjsKKwkJCWludCBpID0gMjsKKworCQkJLyogRG9kZ2UgdGhlIG9yaWdpbmFsICdcbicsIGFuZCBwdXQgJ1xyXG4nIGluc3RlYWQuICovCisJCQlzKys7CisJCQljb3VudC0tOworCQkJZG8geworCQkJCXdyaXR0ZW4gPSBwYXJwb3J0X3dyaXRlIChwb3J0LCBjcmxmLCBpKTsKKwkJCQlpZiAod3JpdHRlbiA+IDApCisJCQkJCWkgLT0gd3JpdHRlbiwgY3JsZiArPSB3cml0dGVuOworCQkJfSB3aGlsZSAoaSA+IDAgJiYgKENPTlNPTEVfTFBfU1RSSUNUIHx8IHdyaXR0ZW4gPiAwKSk7CisJCX0KKwl9IHdoaWxlIChjb3VudCA+IDAgJiYgKENPTlNPTEVfTFBfU1RSSUNUIHx8IHdyaXR0ZW4gPiAwKSk7CisKKwlwYXJwb3J0X3JlbGVhc2UgKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBscGNvbnMgPSB7CisJLm5hbWUJCT0gImxwIiwKKwkud3JpdGUJCT0gbHBfY29uc29sZV93cml0ZSwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorfTsKKworI2VuZGlmIC8qIGNvbnNvbGUgb24gbGluZSBwcmludGVyICovCisKKy8qIC0tLSBpbml0aWFsaXNhdGlvbiBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBwYXJwb3J0X25yW0xQX05PXSA9IHsgWzAgLi4uIExQX05PLTFdID0gTFBfUEFSUE9SVF9VTlNQRUMgfTsKK3N0YXRpYyBjaGFyICpwYXJwb3J0W0xQX05PXSA9IHsgTlVMTCwgIH07CitzdGF0aWMgaW50IHJlc2V0ID0gMDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHBhcnBvcnQsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShyZXNldCwgYm9vbCwgMCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBscF9zZXR1cCAoY2hhciAqc3RyKQoreworCXN0YXRpYyBpbnQgcGFycG9ydF9wdHI7IC8vIGluaXRpYWxseSB6ZXJvCisJaW50IHg7CisKKwlpZiAoZ2V0X29wdGlvbiAoJnN0ciwgJngpKSB7CisJCWlmICh4ID09IDApIHsKKwkJCS8qIGRpc2FibGUgZHJpdmVyIG9uICJscD0iIG9yICJscD0wIiAqLworCQkJcGFycG9ydF9uclswXSA9IExQX1BBUlBPUlRfT0ZGOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FybmluZzogJ2xwPTB4JXgnIGlzIGRlcHJlY2F0ZWQsIGlnbm9yZWRcbiIsIHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgInBhcnBvcnQiLCA3KSkgeworCQlpbnQgbiA9IHNpbXBsZV9zdHJ0b3VsKHN0cis3LCBOVUxMLCAxMCk7CisJCWlmIChwYXJwb3J0X3B0ciA8IExQX05PKQorCQkJcGFycG9ydF9ucltwYXJwb3J0X3B0cisrXSA9IG47CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gImxwOiB0b28gbWFueSBwb3J0cywgJXMgaWdub3JlZC5cbiIsCisJCQkgICAgICAgc3RyKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYXV0byIpKSB7CisJCXBhcnBvcnRfbnJbMF0gPSBMUF9QQVJQT1JUX0FVVE87CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vbmUiKSkgeworCQlwYXJwb3J0X25yW3BhcnBvcnRfcHRyKytdID0gTFBfUEFSUE9SVF9OT05FOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyZXNldCIpKSB7CisJCXJlc2V0ID0gMTsKKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBscF9yZWdpc3RlcihpbnQgbnIsIHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWxwX3RhYmxlW25yXS5kZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCAibHAiLCAKKwkJCQkJCSAgIGxwX3ByZWVtcHQsIE5VTEwsIE5VTEwsIDAsCisJCQkJCQkgICAodm9pZCAqKSAmbHBfdGFibGVbbnJdKTsKKwlpZiAobHBfdGFibGVbbnJdLmRldiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKwlscF90YWJsZVtucl0uZmxhZ3MgfD0gTFBfRVhJU1Q7CisKKwlpZiAocmVzZXQpCisJCWxwX3Jlc2V0KG5yKTsKKworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGxwX2NsYXNzLCBNS0RFVihMUF9NQUpPUiwgbnIpLCBOVUxMLAorCQkJCSJscCVkIiwgbnIpOworCWRldmZzX21rX2NkZXYoTUtERVYoTFBfTUFKT1IsIG5yKSwgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJInByaW50ZXJzLyVkIiwgbnIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibHAlZDogdXNpbmcgJXMgKCVzKS5cbiIsIG5yLCBwb3J0LT5uYW1lLCAKKwkgICAgICAgKHBvcnQtPmlycSA9PSBQQVJQT1JUX0lSUV9OT05FKT8icG9sbGluZyI6ImludGVycnVwdC1kcml2ZW4iKTsKKworI2lmZGVmIENPTkZJR19MUF9DT05TT0xFCisJaWYgKCFucikgeworCQlpZiAocG9ydC0+bW9kZXMgJiBQQVJQT1JUX01PREVfU0FGRUlOSU5UKSB7CisJCQlyZWdpc3Rlcl9jb25zb2xlICgmbHBjb25zKTsKKwkJCWNvbnNvbGVfcmVnaXN0ZXJlZCA9IHBvcnQ7CisJCQlwcmludGsgKEtFUk5fSU5GTyAibHAlZDogY29uc29sZSByZWFkeVxuIiwgQ09OU09MRV9MUCk7CisJCX0gZWxzZQorCQkJcHJpbnRrIChLRVJOX0VSUiAibHAlZDogY2Fubm90IHJ1biBjb25zb2xlIG9uICVzXG4iLAorCQkJCUNPTlNPTEVfTFAsIHBvcnQtPm5hbWUpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwX2F0dGFjaCAoc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlzd2l0Y2ggKHBhcnBvcnRfbnJbMF0pCisJeworCWNhc2UgTFBfUEFSUE9SVF9VTlNQRUM6CisJY2FzZSBMUF9QQVJQT1JUX0FVVE86CisJCWlmIChwYXJwb3J0X25yWzBdID09IExQX1BBUlBPUlRfQVVUTyAmJgorCQkgICAgcG9ydC0+cHJvYmVfaW5mb1swXS5jbGFzcyAhPSBQQVJQT1JUX0NMQVNTX1BSSU5URVIpCisJCQlyZXR1cm47CisJCWlmIChscF9jb3VudCA9PSBMUF9OTykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHA6IGlnbm9yaW5nIHBhcmFsbGVsIHBvcnQgKG1heC4gJWQpXG4iLExQX05PKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWxwX3JlZ2lzdGVyKGxwX2NvdW50LCBwb3J0KSkKKwkJCWxwX2NvdW50Kys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZm9yIChpID0gMDsgaSA8IExQX05POyBpKyspIHsKKwkJCWlmIChwb3J0LT5udW1iZXIgPT0gcGFycG9ydF9ucltpXSkgeworCQkJCWlmICghbHBfcmVnaXN0ZXIoaSwgcG9ydCkpCisJCQkJCWxwX2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBscF9kZXRhY2ggKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCS8qIFdyaXRlIHRoaXMgc29tZSBkYXkuICovCisjaWZkZWYgQ09ORklHX0xQX0NPTlNPTEUKKwlpZiAoY29uc29sZV9yZWdpc3RlcmVkID09IHBvcnQpIHsKKwkJdW5yZWdpc3Rlcl9jb25zb2xlICgmbHBjb25zKTsKKwkJY29uc29sZV9yZWdpc3RlcmVkID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX0xQX0NPTlNPTEUgKi8KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBscF9kcml2ZXIgPSB7CisJLm5hbWUgPSAibHAiLAorCS5hdHRhY2ggPSBscF9hdHRhY2gsCisJLmRldGFjaCA9IGxwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxwX2luaXQgKHZvaWQpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlpZiAocGFycG9ydF9uclswXSA9PSBMUF9QQVJQT1JUX09GRikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTFBfTk87IGkrKykgeworCQlscF90YWJsZVtpXS5kZXYgPSBOVUxMOworCQlscF90YWJsZVtpXS5mbGFncyA9IDA7CisJCWxwX3RhYmxlW2ldLmNoYXJzID0gTFBfSU5JVF9DSEFSOworCQlscF90YWJsZVtpXS50aW1lID0gTFBfSU5JVF9USU1FOworCQlscF90YWJsZVtpXS53YWl0ID0gTFBfSU5JVF9XQUlUOworCQlscF90YWJsZVtpXS5scF9idWZmZXIgPSBOVUxMOworI2lmZGVmIExQX1NUQVRTCisJCWxwX3RhYmxlW2ldLmxhc3RjYWxsID0gMDsKKwkJbHBfdGFibGVbaV0ucnVuY2hhcnMgPSAwOworCQltZW1zZXQgKCZscF90YWJsZVtpXS5zdGF0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgbHBfc3RhdHMpKTsKKyNlbmRpZgorCQlscF90YWJsZVtpXS5sYXN0X2Vycm9yID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCAoJmxwX3RhYmxlW2ldLndhaXRxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCAoJmxwX3RhYmxlW2ldLmRhdGFxKTsKKwkJaW5pdF9NVVRFWCAoJmxwX3RhYmxlW2ldLnBvcnRfbXV0ZXgpOworCQlscF90YWJsZVtpXS50aW1lb3V0ID0gMTAgKiBIWjsKKwl9CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2IChMUF9NQUpPUiwgImxwIiwgJmxwX2ZvcHMpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImxwOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLCBMUF9NQUpPUik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldmZzX21rX2RpcigicHJpbnRlcnMiKTsKKwlscF9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJwcmludGVyIik7CisJaWYgKElTX0VSUihscF9jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihscF9jbGFzcyk7CisJCWdvdG8gb3V0X2RldmZzOworCX0KKworCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlciAoJmxwX2RyaXZlcikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAibHA6IHVuYWJsZSB0byByZWdpc3RlciB3aXRoIHBhcnBvcnRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwlpZiAoIWxwX2NvdW50KSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJscDogZHJpdmVyIGxvYWRlZCBidXQgbm8gZGV2aWNlcyBmb3VuZFxuIik7CisjaWZuZGVmIENPTkZJR19QQVJQT1JUXzEyODQKKwkJaWYgKHBhcnBvcnRfbnJbMF0gPT0gTFBfUEFSUE9SVF9BVVRPKQorCQkJcHJpbnRrIChLRVJOX0lORk8gImxwOiAoaXMgSUVFRSAxMjg0IHN1cHBvcnQgZW5hYmxlZD8pXG4iKTsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobHBfY2xhc3MpOworb3V0X2RldmZzOgorCWRldmZzX3JlbW92ZSgicHJpbnRlcnMiKTsKKwl1bnJlZ2lzdGVyX2NocmRldihMUF9NQUpPUiwgImxwIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgbHBfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJaWYgKHBhcnBvcnRbMF0pIHsKKwkJLyogVGhlIHVzZXIgZ2F2ZSBzb21lIHBhcmFtZXRlcnMuICBMZXQncyBzZWUgd2hhdCB0aGV5IHdlcmUuICAqLworCQlpZiAoIXN0cm5jbXAocGFycG9ydFswXSwgImF1dG8iLCA0KSkKKwkJCXBhcnBvcnRfbnJbMF0gPSBMUF9QQVJQT1JUX0FVVE87CisJCWVsc2UgeworCQkJaW50IG47CisJCQlmb3IgKG4gPSAwOyBuIDwgTFBfTk8gJiYgcGFycG9ydFtuXTsgbisrKSB7CisJCQkJaWYgKCFzdHJuY21wKHBhcnBvcnRbbl0sICJub25lIiwgNCkpCisJCQkJCXBhcnBvcnRfbnJbbl0gPSBMUF9QQVJQT1JUX05PTkU7CisJCQkJZWxzZSB7CisJCQkJCWNoYXIgKmVwOworCQkJCQl1bnNpZ25lZCBsb25nIHIgPSBzaW1wbGVfc3RydG91bChwYXJwb3J0W25dLCAmZXAsIDApOworCQkJCQlpZiAoZXAgIT0gcGFycG9ydFtuXSkgCisJCQkJCQlwYXJwb3J0X25yW25dID0gcjsKKwkJCQkJZWxzZSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgImxwOiBiYWQgcG9ydCBzcGVjaWZpZXIgYCVzJ1xuIiwgcGFycG9ydFtuXSk7CisJCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBscF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGxwX2NsZWFudXBfbW9kdWxlICh2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyICgmbHBfZHJpdmVyKTsKKworI2lmZGVmIENPTkZJR19MUF9DT05TT0xFCisJdW5yZWdpc3Rlcl9jb25zb2xlICgmbHBjb25zKTsKKyNlbmRpZgorCisJdW5yZWdpc3Rlcl9jaHJkZXYoTFBfTUFKT1IsICJscCIpOworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgTFBfTk87IG9mZnNldCsrKSB7CisJCWlmIChscF90YWJsZVtvZmZzZXRdLmRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UobHBfdGFibGVbb2Zmc2V0XS5kZXYpOworCQlkZXZmc19yZW1vdmUoInByaW50ZXJzLyVkIiwgb2Zmc2V0KTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoTFBfTUFKT1IsIG9mZnNldCkpOworCX0KKwlkZXZmc19yZW1vdmUoInByaW50ZXJzIik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobHBfY2xhc3MpOworfQorCitfX3NldHVwKCJscD0iLCBscF9zZXR1cCk7Cittb2R1bGVfaW5pdChscF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChscF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKExQX01BSk9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdjYjNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0wLDAgKzEsODgwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci9tZW0uYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEFkZGVkIGRldmZzIHN1cHBvcnQuIAorICogICAgSmFuLTExLTE5OTgsIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgorICogIFNoYXJlZCAvZGV2L3plcm8gbW1hcGluZyBzdXBwb3J0LCBGZWIgMjAwMCwgS2Fub2ogU2FyY2FyIDxrYW5vakBzZ2kuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmF3Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBDT05GSUdfSUE2NAorIyBpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUzM5MF9UQVBFKSAmJiBkZWZpbmVkKENPTkZJR19TMzkwX1RBUEVfQ0hBUikKK2V4dGVybiB2b2lkIHRhcGVjaGFyX2luaXQodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIEFyY2hpdGVjdHVyZXMgdmFyeSBpbiBob3cgdGhleSBoYW5kbGUgY2FjaGluZyBmb3IgYWRkcmVzc2VzCisgKiBvdXRzaWRlIG9mIG1haW4gbWVtb3J5LgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgdW5jYWNoZWRfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwkvKgorCSAqIE9uIHRoZSBQUHJvIGFuZCBzdWNjZXNzb3JzLCB0aGUgTVRSUnMgYXJlIHVzZWQgdG8gc2V0CisJICogbWVtb3J5IHR5cGVzIGZvciBwaHlzaWNhbCBhZGRyZXNzZXMgb3V0c2lkZSBtYWluIG1lbW9yeSwKKwkgKiBzbyBibGluZGx5IHNldHRpbmcgUENEIG9yIFBXVCBvbiB0aG9zZSBwYWdlcyBpcyB3cm9uZy4KKwkgKiBGb3IgUGVudGl1bXMgYW5kIGVhcmxpZXIsIHRoZSBzdXJyb3VuZCBsb2dpYyBzaG91bGQgZGlzYWJsZQorCSAqIGNhY2hpbmcgZm9yIHRoZSBoaWdoIGFkZHJlc3NlcyB0aHJvdWdoIHRoZSBLRU4gcGluLCBidXQKKwkgKiB3ZSBtYWludGFpbiB0aGUgdHJhZGl0aW9uIG9mIHBhcmFub2lhIGluIHRoaXMgY29kZS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwkJcmV0dXJuIDE7CisgCXJldHVybiAhKCB0ZXN0X2JpdChYODZfRkVBVFVSRV9NVFJSLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KSB8fAorCQkgIHRlc3RfYml0KFg4Nl9GRUFUVVJFX0s2X01UUlIsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpIHx8CisJCSAgdGVzdF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KSB8fAorCQkgIHRlc3RfYml0KFg4Nl9GRUFUVVJFX0NFTlRBVVJfTUNSLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KSApCisJICAmJiBhZGRyID49IF9fcGEoaGlnaF9tZW1vcnkpOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCS8qIAorCSAqIFRoaXMgaXMgYnJva2VuIGJlY2F1c2UgaXQgY2FuIGdlbmVyYXRlIG1lbW9yeSB0eXBlIGFsaWFzZXMsCisJICogd2hpY2ggY2FuIGNhdXNlIGNhY2hlIGNvcnJ1cHRpb25zCisJICogQnV0IGl0IGlzIG9ubHkgYXZhaWxhYmxlIGZvciByb290IGFuZCB3ZSBoYXZlIHRvIGJlIGJ1Zy10by1idWcKKwkgKiBjb21wYXRpYmxlIHdpdGggaTM4Ni4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwkJcmV0dXJuIDE7CisJLyogc2FtZSBiZWhhdmlvdXIgYXMgaTM4Ni4gUEFUIGFsd2F5cyBzZXQgdG8gY2FjaGVkIGFuZCBNVFJScyBjb250cm9sIHRoZQorCSAgIGNhY2hpbmcgYmVoYXZpb3VyLiAKKwkgICBIb3BlZnVsbHkgYSBmdWxsIFBBVCBpbXBsZW1lbnRhdGlvbiB3aWxsIGZpeCB0aGF0IHNvb24uICovCSAgIAorCXJldHVybiAwOworI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKKwkvKgorCSAqIE9uIGlhNjQsIHdlIGlnbm9yZSBPX1NZTkMgYmVjYXVzZSB3ZSBjYW5ub3QgdG9sZXJhdGUgbWVtb3J5IGF0dHJpYnV0ZSBhbGlhc2VzLgorCSAqLworCXJldHVybiAhKGVmaV9tZW1fYXR0cmlidXRlcyhhZGRyKSAmIEVGSV9NRU1PUllfV0IpOworI2Vsc2UKKwkvKgorCSAqIEFjY2Vzc2luZyBtZW1vcnkgYWJvdmUgdGhlIHRvcCB0aGUga2VybmVsIGtub3dzIGFib3V0IG9yIHRocm91Z2ggYSBmaWxlIHBvaW50ZXIKKwkgKiB0aGF0IHdhcyBtYXJrZWQgT19TWU5DIHdpbGwgYmUgZG9uZSBub24tY2FjaGVkLgorCSAqLworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gYWRkciA+PSBfX3BhKGhpZ2hfbWVtb3J5KTsKKyNlbmRpZgorfQorCisjaWZuZGVmIEFSQ0hfSEFTX1ZBTElEX1BIWVNfQUREUl9SQU5HRQorc3RhdGljIGlubGluZSBpbnQgdmFsaWRfcGh5c19hZGRyX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90ICpjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF9tZW07CisKKwllbmRfbWVtID0gX19wYShoaWdoX21lbW9yeSk7CisJaWYgKGFkZHIgPj0gZW5kX21lbSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKmNvdW50ID4gZW5kX21lbSAtIGFkZHIpCisJCSpjb3VudCA9IGVuZF9tZW0gLSBhZGRyOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY2lvbiByZWFkcyB0aGUgKnBoeXNpY2FsKiBtZW1vcnkuIFRoZSBmX3BvcyBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIAorICogbWVtb3J5IGxvY2F0aW9uLiAKKyAqLworc3RhdGljIHNzaXplX3QgcmVhZF9tZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXNzaXplX3QgcmVhZCwgc3o7CisJY2hhciAqcHRyOworCisJaWYgKCF2YWxpZF9waHlzX2FkZHJfcmFuZ2UocCwgJmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmVhZCA9IDA7CisjaWZkZWYgX19BUkNIX0hBU19OT19QQUdFX1pFUk9fTUFQUEVECisJLyogd2UgZG9uJ3QgaGF2ZSBwYWdlIDAgbWFwcGVkIG9uIHNwYXJjIGFuZCBtNjhrLi4gKi8KKwlpZiAocCA8IFBBR0VfU0laRSkgeworCQlzeiA9IFBBR0VfU0laRSAtIHA7CisJCWlmIChzeiA+IGNvdW50KSAKKwkJCXN6ID0gY291bnQ7IAorCQlpZiAoc3ogPiAwKSB7CisJCQlpZiAoY2xlYXJfdXNlcihidWYsIHN6KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZiArPSBzejsgCisJCQlwICs9IHN6OyAKKwkJCWNvdW50IC09IHN6OyAKKwkJCXJlYWQgKz0gc3o7IAorCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qCisJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkgKi8KKwkJaWYgKC1wICYgKFBBR0VfU0laRSAtIDEpKQorCQkJc3ogPSAtcCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJZWxzZQorCQkJc3ogPSBQQUdFX1NJWkU7CisKKwkJc3ogPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBzeiwgY291bnQpOworCisJCS8qCisJCSAqIE9uIGlhNjQgaWYgYSBwYWdlIGhhcyBiZWVuIG1hcHBlZCBzb21ld2hlcmUgYXMKKwkJICogdW5jYWNoZWQsIHRoZW4gaXQgbXVzdCBhbHNvIGJlIGFjY2Vzc2VkIHVuY2FjaGVkCisJCSAqIGJ5IHRoZSBrZXJuZWwgb3IgZGF0YSBjb3JydXB0aW9uIG1heSBvY2N1cgorCQkgKi8KKwkJcHRyID0geGxhdGVfZGV2X21lbV9wdHIocCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHB0ciwgc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZiArPSBzejsKKwkJcCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXJlYWQgKz0gc3o7CisJfQorCisJKnBwb3MgKz0gcmVhZDsKKwlyZXR1cm4gcmVhZDsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbWVtKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXNzaXplX3Qgd3JpdHRlbiwgc3o7CisJdW5zaWduZWQgbG9uZyBjb3BpZWQ7CisJdm9pZCAqcHRyOworCisJaWYgKCF2YWxpZF9waHlzX2FkZHJfcmFuZ2UocCwgJmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3cml0dGVuID0gMDsKKworI2lmZGVmIF9fQVJDSF9IQVNfTk9fUEFHRV9aRVJPX01BUFBFRAorCS8qIHdlIGRvbid0IGhhdmUgcGFnZSAwIG1hcHBlZCBvbiBzcGFyYyBhbmQgbTY4ay4uICovCisJaWYgKHAgPCBQQUdFX1NJWkUpIHsKKwkJdW5zaWduZWQgbG9uZyBzeiA9IFBBR0VfU0laRSAtIHA7CisJCWlmIChzeiA+IGNvdW50KQorCQkJc3ogPSBjb3VudDsKKwkJLyogSG1tLiBEbyBzb21ldGhpbmc/ICovCisJCWJ1ZiArPSBzejsKKwkJcCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXdyaXR0ZW4gKz0gc3o7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qCisJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkgKi8KKwkJaWYgKC1wICYgKFBBR0VfU0laRSAtIDEpKQorCQkJc3ogPSAtcCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJZWxzZQorCQkJc3ogPSBQQUdFX1NJWkU7CisKKwkJc3ogPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBzeiwgY291bnQpOworCisJCS8qCisJCSAqIE9uIGlhNjQgaWYgYSBwYWdlIGhhcyBiZWVuIG1hcHBlZCBzb21ld2hlcmUgYXMKKwkJICogdW5jYWNoZWQsIHRoZW4gaXQgbXVzdCBhbHNvIGJlIGFjY2Vzc2VkIHVuY2FjaGVkCisJCSAqIGJ5IHRoZSBrZXJuZWwgb3IgZGF0YSBjb3JydXB0aW9uIG1heSBvY2N1cgorCQkgKi8KKwkJcHRyID0geGxhdGVfZGV2X21lbV9wdHIocCk7CisKKwkJY29waWVkID0gY29weV9mcm9tX3VzZXIocHRyLCBidWYsIHN6KTsKKwkJaWYgKGNvcGllZCkgeworCQkJc3NpemVfdCByZXQ7CisKKwkJCXJldCA9IHdyaXR0ZW4gKyAoc3ogLSBjb3BpZWQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQljb3VudCAtPSBzejsKKwkJd3JpdHRlbiArPSBzejsKKwl9CisKKwkqcHBvcyArPSB3cml0dGVuOworCXJldHVybiB3cml0dGVuOworfQorCitzdGF0aWMgaW50IG1tYXBfbWVtKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworI2lmIGRlZmluZWQoX19IQVZFX1BIWVNfTUVNX0FDQ0VTU19QUk9UKQorCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCBvZmZzZXQsCisJCQkJCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCQkJIHZtYS0+dm1fcGFnZV9wcm90KTsKKyNlbGlmIGRlZmluZWQocGdwcm90X25vbmNhY2hlZCkKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlpbnQgdW5jYWNoZWQ7CisKKwl1bmNhY2hlZCA9IHVuY2FjaGVkX2FjY2VzcyhmaWxlLCBvZmZzZXQpOworCWlmICh1bmNhY2hlZCkKKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKyNlbmRpZgorCisJLyogUmVtYXAtcGZuLXJhbmdlIHdpbGwgbWFyayB0aGUgcmFuZ2UgVk1fSU8gYW5kIFZNX1JFU0VSVkVEICovCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsCisJCQkgICAgdm1hLT52bV9zdGFydCwKKwkJCSAgICB2bWEtPnZtX3Bnb2ZmLAorCQkJICAgIHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQsCisJCQkgICAgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbWFwX2ttZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisJLyoKKwkgKiBSRUQtUEVOOiBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhlcmUgaXMgbW9yZSBtYXBwZWQgbWVtb3J5CisJICogdGhhbiBhdmFpbGFibGUgaW4gbWVtX21hcCB3aGljaCBwZm5fdmFsaWQgY2hlY2tzCisJICogZm9yLiBQZXJoYXBzIHNob3VsZCBhZGQgYSBuZXcgbWFjcm8gaGVyZS4KKwkgKgorCSAqIFJFRC1QRU46IHZtYWxsb2MgaXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cuCisJICovCisJaWYgKCFwZm5fdmFsaWQodm1hLT52bV9wZ29mZikpCisJCXJldHVybiAtRUlPOworCXZhbCA9ICh1NjQpdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXZtYS0+dm1fcGdvZmYgPSBfX3BhKHZhbCkgPj4gUEFHRV9TSElGVDsKKwlyZXR1cm4gbW1hcF9tZW0oZmlsZSwgdm1hKTsKK30KKworZXh0ZXJuIGxvbmcgdnJlYWQoY2hhciAqYnVmLCBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2V4dGVybiBsb25nIHZ3cml0ZShjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworCisvKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgKnZpcnR1YWwqIG1lbW9yeSBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHJlYWRfa21lbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwgCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisJc3NpemVfdCBsb3dfY291bnQsIHJlYWQsIHN6OworCWNoYXIgKiBrYnVmOyAvKiBrLWFkZHIgYmVjYXVzZSB2cmVhZCgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLworCisJcmVhZCA9IDA7CisJaWYgKHAgPCAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkpIHsKKwkJbG93X2NvdW50ID0gY291bnQ7CisJCWlmIChjb3VudCA+ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSAtIHApCisJCQlsb3dfY291bnQgPSAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgLSBwOworCisjaWZkZWYgX19BUkNIX0hBU19OT19QQUdFX1pFUk9fTUFQUEVECisJCS8qIHdlIGRvbid0IGhhdmUgcGFnZSAwIG1hcHBlZCBvbiBzcGFyYyBhbmQgbTY4ay4uICovCisJCWlmIChwIDwgUEFHRV9TSVpFICYmIGxvd19jb3VudCA+IDApIHsKKwkJCXNpemVfdCB0bXAgPSBQQUdFX1NJWkUgLSBwOworCQkJaWYgKHRtcCA+IGxvd19jb3VudCkgdG1wID0gbG93X2NvdW50OworCQkJaWYgKGNsZWFyX3VzZXIoYnVmLCB0bXApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnVmICs9IHRtcDsKKwkJCXAgKz0gdG1wOworCQkJcmVhZCArPSB0bXA7CisJCQlsb3dfY291bnQgLT0gdG1wOworCQkJY291bnQgLT0gdG1wOworCQl9CisjZW5kaWYKKwkJd2hpbGUgKGxvd19jb3VudCA+IDApIHsKKwkJCS8qCisJCQkgKiBIYW5kbGUgZmlyc3QgcGFnZSBpbiBjYXNlIGl0J3Mgbm90IGFsaWduZWQKKwkJCSAqLworCQkJaWYgKC1wICYgKFBBR0VfU0laRSAtIDEpKQorCQkJCXN6ID0gLXAgJiAoUEFHRV9TSVpFIC0gMSk7CisJCQllbHNlCisJCQkJc3ogPSBQQUdFX1NJWkU7CisKKwkJCXN6ID0gbWluX3QodW5zaWduZWQgbG9uZywgc3osIGxvd19jb3VudCk7CisKKwkJCS8qCisJCQkgKiBPbiBpYTY0IGlmIGEgcGFnZSBoYXMgYmVlbiBtYXBwZWQgc29tZXdoZXJlIGFzCisJCQkgKiB1bmNhY2hlZCwgdGhlbiBpdCBtdXN0IGFsc28gYmUgYWNjZXNzZWQgdW5jYWNoZWQKKwkJCSAqIGJ5IHRoZSBrZXJuZWwgb3IgZGF0YSBjb3JydXB0aW9uIG1heSBvY2N1cgorCQkJICovCisJCQlrYnVmID0geGxhdGVfZGV2X2ttZW1fcHRyKChjaGFyICopcCk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrYnVmLCBzeikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlidWYgKz0gc3o7CisJCQlwICs9IHN6OworCQkJcmVhZCArPSBzejsKKwkJCWxvd19jb3VudCAtPSBzejsKKwkJCWNvdW50IC09IHN6OworCQl9CisJfQorCisJaWYgKGNvdW50ID4gMCkgeworCQlrYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICgha2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQlpbnQgbGVuID0gY291bnQ7CisKKwkJCWlmIChsZW4gPiBQQUdFX1NJWkUpCisJCQkJbGVuID0gUEFHRV9TSVpFOworCQkJbGVuID0gdnJlYWQoa2J1ZiwgKGNoYXIgKilwLCBsZW4pOworCQkJaWYgKCFsZW4pCisJCQkJYnJlYWs7CisJCQlpZiAoY29weV90b191c2VyKGJ1Ziwga2J1ZiwgbGVuKSkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWNvdW50IC09IGxlbjsKKwkJCWJ1ZiArPSBsZW47CisJCQlyZWFkICs9IGxlbjsKKwkJCXAgKz0gbGVuOworCQl9CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwl9CisgCSpwcG9zID0gcDsKKyAJcmV0dXJuIHJlYWQ7Cit9CisKKworc3RhdGljIGlubGluZSBzc2l6ZV90Citkb193cml0ZV9rbWVtKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgcmVhbHAsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3Qgd3JpdHRlbiwgc3o7CisJdW5zaWduZWQgbG9uZyBjb3BpZWQ7CisKKwl3cml0dGVuID0gMDsKKyNpZmRlZiBfX0FSQ0hfSEFTX05PX1BBR0VfWkVST19NQVBQRUQKKwkvKiB3ZSBkb24ndCBoYXZlIHBhZ2UgMCBtYXBwZWQgb24gc3BhcmMgYW5kIG02OGsuLiAqLworCWlmIChyZWFscCA8IFBBR0VfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIHN6ID0gUEFHRV9TSVpFIC0gcmVhbHA7CisJCWlmIChzeiA+IGNvdW50KQorCQkJc3ogPSBjb3VudDsKKwkJLyogSG1tLiBEbyBzb21ldGhpbmc/ICovCisJCWJ1ZiArPSBzejsKKwkJcCArPSBzejsKKwkJcmVhbHAgKz0gc3o7CisJCWNvdW50IC09IHN6OworCQl3cml0dGVuICs9IHN6OworCX0KKyNlbmRpZgorCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQljaGFyICpwdHI7CisJCS8qCisJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkgKi8KKwkJaWYgKC1yZWFscCAmIChQQUdFX1NJWkUgLSAxKSkKKwkJCXN6ID0gLXJlYWxwICYgKFBBR0VfU0laRSAtIDEpOworCQllbHNlCisJCQlzeiA9IFBBR0VfU0laRTsKKworCQlzeiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHN6LCBjb3VudCk7CisKKwkJLyoKKwkJICogT24gaWE2NCBpZiBhIHBhZ2UgaGFzIGJlZW4gbWFwcGVkIHNvbWV3aGVyZSBhcworCQkgKiB1bmNhY2hlZCwgdGhlbiBpdCBtdXN0IGFsc28gYmUgYWNjZXNzZWQgdW5jYWNoZWQKKwkJICogYnkgdGhlIGtlcm5lbCBvciBkYXRhIGNvcnJ1cHRpb24gbWF5IG9jY3VyCisJCSAqLworCQlwdHIgPSB4bGF0ZV9kZXZfa21lbV9wdHIocCk7CisKKwkJY29waWVkID0gY29weV9mcm9tX3VzZXIocHRyLCBidWYsIHN6KTsKKwkJaWYgKGNvcGllZCkgeworCQkJc3NpemVfdCByZXQ7CisKKwkJCXJldCA9IHdyaXR0ZW4gKyAoc3ogLSBjb3BpZWQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQlyZWFscCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXdyaXR0ZW4gKz0gc3o7CisJfQorCisJKnBwb3MgKz0gd3JpdHRlbjsKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8gdGhlICp2aXJ0dWFsKiBtZW1vcnkgYXMgc2VlbiBieSB0aGUga2VybmVsLgorICovCitzdGF0aWMgc3NpemVfdCB3cml0ZV9rbWVtKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKKwlzc2l6ZV90IHdyb3RlID0gMDsKKwlzc2l6ZV90IHZpcnRyID0gMDsKKwlzc2l6ZV90IHdyaXR0ZW47CisJY2hhciAqIGtidWY7IC8qIGstYWRkciBiZWNhdXNlIHZ3cml0ZSgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLworCisJaWYgKHAgPCAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkpIHsKKworCQl3cm90ZSA9IGNvdW50OworCQlpZiAoY291bnQgPiAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgLSBwKQorCQkJd3JvdGUgPSAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgLSBwOworCisJCXdyaXR0ZW4gPSBkb193cml0ZV9rbWVtKCh2b2lkKilwLCBwLCBidWYsIHdyb3RlLCBwcG9zKTsKKwkJaWYgKHdyaXR0ZW4gIT0gd3JvdGUpCisJCQlyZXR1cm4gd3JpdHRlbjsKKwkJd3JvdGUgPSB3cml0dGVuOworCQlwICs9IHdyb3RlOworCQlidWYgKz0gd3JvdGU7CisJCWNvdW50IC09IHdyb3RlOworCX0KKworCWlmIChjb3VudCA+IDApIHsKKwkJa2J1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWtidWYpCisJCQlyZXR1cm4gd3JvdGUgPyB3cm90ZSA6IC1FTk9NRU07CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCWludCBsZW4gPSBjb3VudDsKKworCQkJaWYgKGxlbiA+IFBBR0VfU0laRSkKKwkJCQlsZW4gPSBQQUdFX1NJWkU7CisJCQlpZiAobGVuKSB7CisJCQkJd3JpdHRlbiA9IGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgbGVuKTsKKwkJCQlpZiAod3JpdHRlbikgeworCQkJCQlzc2l6ZV90IHJldDsKKworCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa2J1Zik7CisJCQkJCXJldCA9IHdyb3RlICsgdmlydHIgKyAobGVuIC0gd3JpdHRlbik7CisJCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJCWxlbiA9IHZ3cml0ZShrYnVmLCAoY2hhciAqKXAsIGxlbik7CisJCQljb3VudCAtPSBsZW47CisJCQlidWYgKz0gbGVuOworCQkJdmlydHIgKz0gbGVuOworCQkJcCArPSBsZW47CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCX0KKworIAkqcHBvcyA9IHA7CisgCXJldHVybiB2aXJ0ciArIHdyb3RlOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKK3N0YXRpYyBzc2l6ZV90IHJlYWRfcG9ydChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgaSA9ICpwcG9zOworCWNoYXIgX191c2VyICp0bXAgPSBidWY7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsgCisJd2hpbGUgKGNvdW50LS0gPiAwICYmIGkgPCA2NTUzNikgeworCQlpZiAoX19wdXRfdXNlcihpbmIoaSksdG1wKSA8IDApIAorCQkJcmV0dXJuIC1FRkFVTFQ7ICAKKwkJaSsrOworCQl0bXArKzsKKwl9CisJKnBwb3MgPSBpOworCXJldHVybiB0bXAtYnVmOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9wb3J0KHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgaSA9ICpwcG9zOworCWNvbnN0IGNoYXIgX191c2VyICogdG1wID0gYnVmOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsYnVmLGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJd2hpbGUgKGNvdW50LS0gPiAwICYmIGkgPCA2NTUzNikgeworCQljaGFyIGM7CisJCWlmIChfX2dldF91c2VyKGMsIHRtcCkpIAorCQkJcmV0dXJuIC1FRkFVTFQ7IAorCQlvdXRiKGMsaSk7CisJCWkrKzsKKwkJdG1wKys7CisJfQorCSpwcG9zID0gaTsKKwlyZXR1cm4gdG1wLWJ1ZjsKK30KKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCByZWFkX251bGwoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbnVsbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTU1VCisvKgorICogRm9yIGZ1biwgd2UgYXJlIHVzaW5nIHRoZSBNTVUgZm9yIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHJlYWRfemVyb19wYWdlYWxpZ25lZChjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOworCXVuc2lnbmVkIGxvbmcgYWRkcj0odW5zaWduZWQgbG9uZylidWY7CisKKwltbSA9IGN1cnJlbnQtPm1tOworCS8qIE9vcHMsIHRoaXMgd2FzIGZvcmdvdHRlbiBiZWZvcmUuIC1iZW4gKi8KKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBGb3IgcHJpdmF0ZSBtYXBwaW5ncywganVzdCBtYXAgaW4gemVybyBwYWdlcy4gKi8KKwlmb3IgKHZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJdW5zaWduZWQgbG9uZyBjb3VudDsKKworCQlpZiAodm1hLT52bV9zdGFydCA+IGFkZHIgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgPT0gMCkKKwkJCWdvdG8gb3V0X3VwOworCQlpZiAodm1hLT52bV9mbGFncyAmIChWTV9TSEFSRUQgfCBWTV9IVUdFVExCKSkKKwkJCWJyZWFrOworCQljb3VudCA9IHZtYS0+dm1fZW5kIC0gYWRkcjsKKwkJaWYgKGNvdW50ID4gc2l6ZSkKKwkJCWNvdW50ID0gc2l6ZTsKKworCQl6YXBfcGFnZV9yYW5nZSh2bWEsIGFkZHIsIGNvdW50LCBOVUxMKTsKKyAgICAgICAgCXplcm9tYXBfcGFnZV9yYW5nZSh2bWEsIGFkZHIsIGNvdW50LCBQQUdFX0NPUFkpOworCisJCXNpemUgLT0gY291bnQ7CisJCWJ1ZiArPSBjb3VudDsKKwkJYWRkciArPSBjb3VudDsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCWdvdG8gb3V0X3VwOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCisJLyogVGhlIHNoYXJlZCBjYXNlIGlzIGhhcmQuIExldCdzIGRvIHRoZSBjb252ZW50aW9uYWwgemVyb2luZy4gKi8gCisJZG8geworCQl1bnNpZ25lZCBsb25nIHVud3JpdHRlbiA9IGNsZWFyX3VzZXIoYnVmLCBQQUdFX1NJWkUpOworCQlpZiAodW53cml0dGVuKQorCQkJcmV0dXJuIHNpemUgKyB1bndyaXR0ZW4gLSBQQUdFX1NJWkU7CisJCWNvbmRfcmVzY2hlZCgpOworCQlidWYgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9IHdoaWxlIChzaXplKTsKKworCXJldHVybiBzaXplOworb3V0X3VwOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfemVybyhzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCAKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIGxlZnQsIHVud3JpdHRlbiwgd3JpdHRlbiA9IDA7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVmdCA9IGNvdW50OworCisJLyogZG8gd2Ugd2FudCB0byBiZSBjbGV2ZXI/IEFyYml0cmFyeSBjdXQtb2ZmICovCisJaWYgKGNvdW50ID49IFBBR0VfU0laRSo0KSB7CisJCXVuc2lnbmVkIGxvbmcgcGFydGlhbDsKKworCQkvKiBIb3cgbXVjaCBsZWZ0IG9mIHRoZSBwYWdlPyAqLworCQlwYXJ0aWFsID0gKFBBR0VfU0laRS0xKSAmIC0odW5zaWduZWQgbG9uZykgYnVmOworCQl1bndyaXR0ZW4gPSBjbGVhcl91c2VyKGJ1ZiwgcGFydGlhbCk7CisJCXdyaXR0ZW4gPSBwYXJ0aWFsIC0gdW53cml0dGVuOworCQlpZiAodW53cml0dGVuKQorCQkJZ290byBvdXQ7CisJCWxlZnQgLT0gcGFydGlhbDsKKwkJYnVmICs9IHBhcnRpYWw7CisJCXVud3JpdHRlbiA9IHJlYWRfemVyb19wYWdlYWxpZ25lZChidWYsIGxlZnQgJiBQQUdFX01BU0spOworCQl3cml0dGVuICs9IChsZWZ0ICYgUEFHRV9NQVNLKSAtIHVud3JpdHRlbjsKKwkJaWYgKHVud3JpdHRlbikKKwkJCWdvdG8gb3V0OworCQlidWYgKz0gbGVmdCAmIFBBR0VfTUFTSzsKKwkJbGVmdCAmPSB+UEFHRV9NQVNLOworCX0KKwl1bndyaXR0ZW4gPSBjbGVhcl91c2VyKGJ1ZiwgbGVmdCk7CisJd3JpdHRlbiArPSBsZWZ0IC0gdW53cml0dGVuOworb3V0OgorCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgbW1hcF96ZXJvKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQorCQlyZXR1cm4gc2htZW1femVyb19zZXR1cCh2bWEpOworCWlmICh6ZXJvbWFwX3BhZ2VfcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBDT05GSUdfTU1VICovCitzdGF0aWMgc3NpemVfdCByZWFkX3plcm8oc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyICogYnVmLCAKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzaXplX3QgdG9kbyA9IGNvdW50OworCisJd2hpbGUgKHRvZG8pIHsKKwkJc2l6ZV90IGNodW5rID0gdG9kbzsKKworCQlpZiAoY2h1bmsgPiA0MDk2KQorCQkJY2h1bmsgPSA0MDk2OwkvKiBKdXN0IGZvciBsYXRlbmN5IHJlYXNvbnMgKi8KKwkJaWYgKGNsZWFyX3VzZXIoYnVmLCBjaHVuaykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnVmICs9IGNodW5rOworCQl0b2RvIC09IGNodW5rOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IG1tYXBfemVybyhzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2Z1bGwoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKy8qCisgKiBTcGVjaWFsIGxzZWVrKCkgZnVuY3Rpb24gZm9yIC9kZXYvbnVsbCBhbmQgL2Rldi96ZXJvLiAgTW9zdCBub3RhYmx5LCB5b3UKKyAqIGNhbiBmb3BlbigpIGJvdGggZGV2aWNlcyB3aXRoICJhIiBub3cuICBUaGlzIHdhcyBwcmV2aW91c2x5IGltcG9zc2libGUuCisgKiAtLSBTUkIuCisgKi8KKworc3RhdGljIGxvZmZfdCBudWxsX2xzZWVrKHN0cnVjdCBmaWxlICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJcmV0dXJuIGZpbGUtPmZfcG9zID0gMDsKK30KKworLyoKKyAqIFRoZSBtZW1vcnkgZGV2aWNlcyB1c2UgdGhlIGZ1bGwgMzIvNjQgYml0cyBvZiB0aGUgb2Zmc2V0LCBhbmQgc28gd2UgY2Fubm90CisgKiBjaGVjayBhZ2FpbnN0IG5lZ2F0aXZlIGFkZHJlc3NlczogdGhleSBhcmUgb2suIFRoZSByZXR1cm4gdmFsdWUgaXMgd2VpcmQsCisgKiB0aG91Z2gsIGluIHRoYXQgY2FzZSAoMCkuCisgKgorICogYWxzbyBub3RlIHRoYXQgc2Vla2luZyByZWxhdGl2ZSB0byB0aGUgImVuZCBvZiBmaWxlIiBpc24ndCBzdXBwb3J0ZWQ6CisgKiBpdCBoYXMgbm8gbWVhbmluZywgc28gaXQgcmV0dXJucyAtRUlOVkFMLgorICovCitzdGF0aWMgbG9mZl90IG1lbW9yeV9sc2VlayhzdHJ1Y3QgZmlsZSAqIGZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworCWxvZmZfdCByZXQ7CisKKwlkb3duKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXN3aXRjaCAob3JpZykgeworCQljYXNlIDA6CisJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJCXJldCA9IGZpbGUtPmZfcG9zOworCQkJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJCXJldCA9IGZpbGUtPmZfcG9zOworCQkJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1cCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wZW5fcG9ydChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiBjYXBhYmxlKENBUF9TWVNfUkFXSU8pID8gMCA6IC1FUEVSTTsKK30KKworI2RlZmluZSB6ZXJvX2xzZWVrCW51bGxfbHNlZWsKKyNkZWZpbmUgZnVsbF9sc2VlayAgICAgIG51bGxfbHNlZWsKKyNkZWZpbmUgd3JpdGVfemVybwl3cml0ZV9udWxsCisjZGVmaW5lIHJlYWRfZnVsbCAgICAgICByZWFkX3plcm8KKyNkZWZpbmUgb3Blbl9tZW0Jb3Blbl9wb3J0CisjZGVmaW5lIG9wZW5fa21lbQlvcGVuX21lbQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZW1fZm9wcyA9IHsKKwkubGxzZWVrCQk9IG1lbW9yeV9sc2VlaywKKwkucmVhZAkJPSByZWFkX21lbSwKKwkud3JpdGUJCT0gd3JpdGVfbWVtLAorCS5tbWFwCQk9IG1tYXBfbWVtLAorCS5vcGVuCQk9IG9wZW5fbWVtLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga21lbV9mb3BzID0geworCS5sbHNlZWsJCT0gbWVtb3J5X2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfa21lbSwKKwkud3JpdGUJCT0gd3JpdGVfa21lbSwKKwkubW1hcAkJPSBtbWFwX2ttZW0sCisJLm9wZW4JCT0gb3Blbl9rbWVtLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnVsbF9mb3BzID0geworCS5sbHNlZWsJCT0gbnVsbF9sc2VlaywKKwkucmVhZAkJPSByZWFkX251bGwsCisJLndyaXRlCQk9IHdyaXRlX251bGwsCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBvcnRfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG1lbW9yeV9sc2VlaywKKwkucmVhZAkJPSByZWFkX3BvcnQsCisJLndyaXRlCQk9IHdyaXRlX3BvcnQsCisJLm9wZW4JCT0gb3Blbl9wb3J0LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6ZXJvX2ZvcHMgPSB7CisJLmxsc2VlawkJPSB6ZXJvX2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfemVybywKKwkud3JpdGUJCT0gd3JpdGVfemVybywKKwkubW1hcAkJPSBtbWFwX3plcm8sCit9OworCitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gemVyb19iZGkgPSB7CisJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTUFQX0NPUFksCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdWxsX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBmdWxsX2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfZnVsbCwKKwkud3JpdGUJCT0gd3JpdGVfZnVsbCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGttc2dfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqdG1wOworCWludCByZXQ7CisKKwl0bXAgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSAtRUZBVUxUOworCWlmICghY29weV9mcm9tX3VzZXIodG1wLCBidWYsIGNvdW50KSkgeworCQl0bXBbY291bnRdID0gMDsKKwkJcmV0ID0gcHJpbnRrKCIlcyIsIHRtcCk7CisJfQorCWtmcmVlKHRtcCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga21zZ19mb3BzID0geworCS53cml0ZSA9CWttc2dfd3JpdGUsCit9OworCitzdGF0aWMgaW50IG1lbW9yeV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3dpdGNoIChpbWlub3IoaW5vZGUpKSB7CisJCWNhc2UgMToKKwkJCWZpbHAtPmZfb3AgPSAmbWVtX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZmlscC0+Zl9vcCA9ICZrbWVtX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZmlscC0+Zl9vcCA9ICZudWxsX2ZvcHM7CisJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKQorCQljYXNlIDQ6CisJCQlmaWxwLT5mX29wID0gJnBvcnRfZm9wczsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgNToKKwkJCWZpbHAtPmZfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZ6ZXJvX2JkaTsKKwkJCWZpbHAtPmZfb3AgPSAmemVyb19mb3BzOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWZpbHAtPmZfb3AgPSAmZnVsbF9mb3BzOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWZpbHAtPmZfb3AgPSAmcmFuZG9tX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJZmlscC0+Zl9vcCA9ICZ1cmFuZG9tX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCWZpbHAtPmZfb3AgPSAma21zZ19mb3BzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5vcGVuKQorCQlyZXR1cm4gZmlscC0+Zl9vcC0+b3Blbihpbm9kZSxmaWxwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtb3J5X2ZvcHMgPSB7CisJLm9wZW4JCT0gbWVtb3J5X29wZW4sCS8qIGp1c3QgYSBzZWxlY3RvciBmb3IgdGhlIHJlYWwgb3BlbiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgaW50CQltaW5vcjsKKwljaGFyCQkJKm5hbWU7CisJdW1vZGVfdAkJCW1vZGU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqZm9wczsKK30gZGV2bGlzdFtdID0geyAvKiBsaXN0IG9mIG1pbm9yIGRldmljZXMgKi8KKwl7MSwgIm1lbSIsICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZtZW1fZm9wc30sCisJezIsICJrbWVtIiwgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLCAma21lbV9mb3BzfSwKKwl7MywgIm51bGwiLCAgICBTX0lSVUdPIHwgU19JV1VHTywgICAgICAgICAgICZudWxsX2ZvcHN9LAorI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pCisJezQsICJwb3J0IiwgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLCAmcG9ydF9mb3BzfSwKKyNlbmRpZgorCXs1LCAiemVybyIsICAgIFNfSVJVR08gfCBTX0lXVUdPLCAgICAgICAgICAgJnplcm9fZm9wc30sCisJezcsICJmdWxsIiwgICAgU19JUlVHTyB8IFNfSVdVR08sICAgICAgICAgICAmZnVsbF9mb3BzfSwKKwl7OCwgInJhbmRvbSIsICBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZyYW5kb21fZm9wc30sCisJezksICJ1cmFuZG9tIiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAmdXJhbmRvbV9mb3BzfSwKKwl7MTEsImttc2ciLCAgICBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZrbXNnX2ZvcHN9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKm1lbV9jbGFzczsKKworc3RhdGljIGludCBfX2luaXQgY2hyX2Rldl9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KE1FTV9NQUpPUiwibWVtIiwmbWVtb3J5X2ZvcHMpKQorCQlwcmludGsoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIG1lbW9yeSBkZXZzXG4iLCBNRU1fTUFKT1IpOworCisJbWVtX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgIm1lbSIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmxpc3QpOyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQobWVtX2NsYXNzLAorCQkJCQlNS0RFVihNRU1fTUFKT1IsIGRldmxpc3RbaV0ubWlub3IpLAorCQkJCQlOVUxMLCBkZXZsaXN0W2ldLm5hbWUpOworCQlkZXZmc19ta19jZGV2KE1LREVWKE1FTV9NQUpPUiwgZGV2bGlzdFtpXS5taW5vciksCisJCQkJU19JRkNIUiB8IGRldmxpc3RbaV0ubW9kZSwgZGV2bGlzdFtpXS5uYW1lKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK2ZzX2luaXRjYWxsKGNocl9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM3NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21pc2MuYwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9taXNjLmMKKyAqCisgKiBHZW5lcmljIG1pc2Mgb3BlbiByb3V0aW5lIGJ5IEpvaGFuIE15cmVlbgorICoKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBMaW51cworICoKKyAqIFRlZW11IFJhbnRhbmVuJ3MgTWljcm9zb2Z0IEJ1c21vdXNlIHN1cHBvcnQgYW5kIERlcnJpY2sgQ29sZSdzCisgKiAgIGNoYW5nZXMgaW5jb3Jwb3JhdGVkIGludG8gMC45N3BsNAorICogICBieSBQZXRlciBDZXJ2YXNpbyAocGV0ZSVxMTA2Zm0udXVjcEB3dXBvc3Qud3VzdGwuZWR1KSAoMDhTRVA5MikKKyAqICAgU2VlIGJ1c21vdXNlLmMgZm9yIHBhcnRpY3VsYXJzLgorICoKKyAqIE1hZGUgdGhpbmdzIGEgbG90IG1vZGUgbW9kdWxhciAtIGVhc3kgdG8gY29tcGlsZSBpbiBqdXN0IG9uZSBvciB0d28KKyAqIG9mIHRoZSBtaXNjIGRyaXZlcnMsIGFzIHRoZXkgYXJlIG5vdyBjb21wbGV0ZWx5IGluZGVwZW5kZW50LiBMaW51cy4KKyAqCisgKiBTdXBwb3J0IGZvciBsb2FkYWJsZSBtb2R1bGVzLiA4LVNlcC05NSBQaGlsaXAgQmx1bmRlbGwgPHBqYjI3QGNhbS5hYy51az4KKyAqCisgKiBGaXhlZCBhIGZhaWxpbmcgc3ltYm9sIHJlZ2lzdGVyIHRvIGZyZWUgdGhlIGRldmljZSByZWdpc3RyYXRpb24KKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiAyMS1KYW4tOTYKKyAqCisgKiBEeW5hbWljIG1pbm9ycyBhbmQgL3Byb2MvbWljZSBieSBBbGVzc2FuZHJvIFJ1YmluaS4gMjYtTWFyLTk2CisgKgorICogUmVuYW1lZCB0byBtaXNjIGFuZCBtaXNjZGV2aWNlIHRvIGJlIG1vcmUgYWNjdXJhdGUuIEFsYW4gQ294IDI2LU1hci05NgorICoKKyAqIEhhbmRsaW5nIG9mIG1vdXNlIG1pbm9yIG51bWJlcnMgZm9yIGtlcm5lbGQ6CisgKiAgSWRlYSBieSBKYWNxdWVzIEdlbGluYXMgPGphY2tAc29sdWNvcnAucWMuY2E+LAorICogIGFkYXB0ZWQgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgorICogIGNvcnJlY3RlZCBieSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoKKyAqIENoYW5nZXMgZm9yIGttb2QgKGZyb20ga2VybmVsZCk6CisgKglDeXJ1cyBEdXJnaW4gPGNpZGVyQHNwZWFrZWFzeS5vcmc+CisgKgorICogQWRkZWQgZGV2ZnMgc3VwcG9ydC4gUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+ICAxMC1KYW4tMTk5OAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKy8qCisgKiBIZWFkIGVudHJ5IGZvciB0aGUgZG91Ymx5IGxpbmtlZCBtaXNjZGV2aWNlIGxpc3QKKyAqLworc3RhdGljIExJU1RfSEVBRChtaXNjX2xpc3QpOworc3RhdGljIERFQ0xBUkVfTVVURVgobWlzY19zZW0pOworCisvKgorICogQXNzaWduZWQgbnVtYmVycywgdXNlZCBmb3IgZHluYW1pYyBtaW5vcnMKKyAqLworI2RlZmluZSBEWU5BTUlDX01JTk9SUyA2NCAvKiBsaWtlIGR5bmFtaWMgbWFqb3JzICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBtaXNjX21pbm9yc1tEWU5BTUlDX01JTk9SUyAvIDhdOworCitleHRlcm4gaW50IHJ0Y19EUDg1NzBBX2luaXQodm9pZCk7CitleHRlcm4gaW50IHJ0Y19NSzQ4VDA4X2luaXQodm9pZCk7CitleHRlcm4gaW50IHBtdV9kZXZpY2VfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdG9zaF9pbml0KHZvaWQpOworZXh0ZXJuIGludCBpOGtfaW5pdCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqbWlzY19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBtaXNjZGV2aWNlICpwOworCWxvZmZfdCBvZmYgPSAwOworCisJZG93bigmbWlzY19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm1pc2NfbGlzdCwgbGlzdCkgeworCQlpZiAoKnBvcyA9PSBvZmYrKykgCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICptaXNjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuID0gKChzdHJ1Y3QgbWlzY2RldmljZSAqKXYpLT5saXN0Lm5leHQ7CisKKwkrKypwb3M7CisKKwlyZXR1cm4gKG4gIT0gJm1pc2NfbGlzdCkgPyBsaXN0X2VudHJ5KG4sIHN0cnVjdCBtaXNjZGV2aWNlLCBsaXN0KQorCQkgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtaXNjX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXVwKCZtaXNjX3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgbWlzY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwljb25zdCBzdHJ1Y3QgbWlzY2RldmljZSAqcCA9IHY7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUzaSAlc1xuIiwgcC0+bWlub3IsIHAtPm5hbWUgPyBwLT5uYW1lIDogIiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbWlzY19zZXFfb3BzID0geworCS5zdGFydCA9IG1pc2Nfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IG1pc2Nfc2VxX25leHQsCisJLnN0b3AgID0gbWlzY19zZXFfc3RvcCwKKwkuc2hvdyAgPSBtaXNjX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBtaXNjX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbWlzY19zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWlzY19wcm9jX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gbWlzY19zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbWlzY2RldmljZSAqYzsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wcywgKm5ld19mb3BzID0gTlVMTDsKKwkKKwlkb3duKCZtaXNjX3NlbSk7CisJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmbWlzY19saXN0LCBsaXN0KSB7CisJCWlmIChjLT5taW5vciA9PSBtaW5vcikgeworCQkJbmV3X2ZvcHMgPSBmb3BzX2dldChjLT5mb3BzKTsJCQorCQkJYnJlYWs7CisJCX0KKwl9CisJCQorCWlmICghbmV3X2ZvcHMpIHsKKwkJdXAoJm1pc2Nfc2VtKTsKKwkJcmVxdWVzdF9tb2R1bGUoImNoYXItbWFqb3ItJWQtJWQiLCBNSVNDX01BSk9SLCBtaW5vcik7CisJCWRvd24oJm1pc2Nfc2VtKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZtaXNjX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChjLT5taW5vciA9PSBtaW5vcikgeworCQkJCW5ld19mb3BzID0gZm9wc19nZXQoYy0+Zm9wcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFuZXdfZm9wcykKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSAwOworCW9sZF9mb3BzID0gZmlsZS0+Zl9vcDsKKwlmaWxlLT5mX29wID0gbmV3X2ZvcHM7CisJaWYgKGZpbGUtPmZfb3AtPm9wZW4pIHsKKwkJZXJyPWZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsZmlsZSk7CisJCWlmIChlcnIpIHsKKwkJCWZvcHNfcHV0KGZpbGUtPmZfb3ApOworCQkJZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKKwkJfQorCX0KKwlmb3BzX3B1dChvbGRfZm9wcyk7CitmYWlsOgorCXVwKCZtaXNjX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworLyogCisgKiBUT0RPIGZvciAyLjc6CisgKiAgLSBhZGQgYSBzdHJ1Y3QgY2xhc3NfZGV2aWNlIHRvIHN0cnVjdCBtaXNjZGV2aWNlIGFuZCBtYWtlIGFsbCB1c2FnZXMgb2YKKyAqICAgIHRoZW0gZHluYW1pYy4KKyAqLworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKm1pc2NfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pc2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gbWlzY19vcGVuLAorfTsKKworCisvKioKKyAqCW1pc2NfcmVnaXN0ZXIJLQlyZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlCisgKglAbWlzYzogZGV2aWNlIHN0cnVjdHVyZQorICoJCisgKglSZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlIHdpdGggdGhlIGtlcm5lbC4gSWYgdGhlIG1pbm9yCisgKgludW1iZXIgaXMgc2V0IHRvICVNSVNDX0RZTkFNSUNfTUlOT1IgYSBtaW5vciBudW1iZXIgaXMgYXNzaWduZWQKKyAqCWFuZCBwbGFjZWQgaW4gdGhlIG1pbm9yIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUuIEZvciBvdGhlciBjYXNlcworICoJdGhlIG1pbm9yIG51bWJlciByZXF1ZXN0ZWQgaXMgdXNlZC4KKyAqCisgKglUaGUgc3RydWN0dXJlIHBhc3NlZCBpcyBsaW5rZWQgaW50byB0aGUga2VybmVsIGFuZCBtYXkgbm90IGJlCisgKglkZXN0cm95ZWQgdW50aWwgaXQgaGFzIGJlZW4gdW5yZWdpc3RlcmVkLgorICoKKyAqCUEgemVybyBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yCisgKglmYWlsdXJlLgorICovCisgCitpbnQgbWlzY19yZWdpc3RlcihzdHJ1Y3QgbWlzY2RldmljZSAqIG1pc2MpCit7CisJc3RydWN0IG1pc2NkZXZpY2UgKmM7CisJZGV2X3QgZGV2OworCWludCBlcnI7CisKKwlkb3duKCZtaXNjX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmbWlzY19saXN0LCBsaXN0KSB7CisJCWlmIChjLT5taW5vciA9PSBtaXNjLT5taW5vcikgeworCQkJdXAoJm1pc2Nfc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAobWlzYy0+bWlub3IgPT0gTUlTQ19EWU5BTUlDX01JTk9SKSB7CisJCWludCBpID0gRFlOQU1JQ19NSU5PUlM7CisJCXdoaWxlICgtLWkgPj0gMCkKKwkJCWlmICggKG1pc2NfbWlub3JzW2k+PjNdICYgKDEgPDwgKGkmNykpKSA9PSAwKQorCQkJCWJyZWFrOworCQlpZiAoaTwwKSB7CisJCQl1cCgmbWlzY19zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQltaXNjLT5taW5vciA9IGk7CisJfQorCisJaWYgKG1pc2MtPm1pbm9yIDwgRFlOQU1JQ19NSU5PUlMpCisJCW1pc2NfbWlub3JzW21pc2MtPm1pbm9yID4+IDNdIHw9IDEgPDwgKG1pc2MtPm1pbm9yICYgNyk7CisJaWYgKG1pc2MtPmRldmZzX25hbWVbMF0gPT0gJ1wwJykgeworCQlzbnByaW50ZihtaXNjLT5kZXZmc19uYW1lLCBzaXplb2YobWlzYy0+ZGV2ZnNfbmFtZSksCisJCQkJIm1pc2MvJXMiLCBtaXNjLT5uYW1lKTsKKwl9CisJZGV2ID0gTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpOworCisJbWlzYy0+Y2xhc3MgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChtaXNjX2NsYXNzLCBkZXYsCisJCQkJCSAgICAgIG1pc2MtPmRldiwgbWlzYy0+bmFtZSk7CisJaWYgKElTX0VSUihtaXNjLT5jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihtaXNjLT5jbGFzcyk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGRldmZzX21rX2NkZXYoZGV2LCBTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUnxTX0lSR1JQLCAKKwkJCSAgICBtaXNjLT5kZXZmc19uYW1lKTsKKwlpZiAoZXJyKSB7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKGRldik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQWRkIGl0IHRvIHRoZSBmcm9udCwgc28gdGhhdCBsYXRlciBkZXZpY2VzIGNhbiAib3ZlcnJpZGUiCisJICogZWFybGllciBkZWZhdWx0cworCSAqLworCWxpc3RfYWRkKCZtaXNjLT5saXN0LCAmbWlzY19saXN0KTsKKyBvdXQ6CisJdXAoJm1pc2Nfc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqCW1pc2NfZGVyZWdpc3RlciAtIHVucmVnaXN0ZXIgYSBtaXNjZWxsYW5lb3VzIGRldmljZQorICoJQG1pc2M6IGRldmljZSB0byB1bnJlZ2lzdGVyCisgKgorICoJVW5yZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAqCXN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIHdpdGggbWlzY19yZWdpc3RlcigpLiBTdWNjZXNzCisgKglpcyBpbmRpY2F0ZWQgYnkgYSB6ZXJvIHJldHVybiwgYSBuZWdhdGl2ZSBlcnJubyBjb2RlCisgKglpbmRpY2F0ZXMgYW4gZXJyb3IuCisgKi8KKworaW50IG1pc2NfZGVyZWdpc3RlcihzdHJ1Y3QgbWlzY2RldmljZSAqIG1pc2MpCit7CisJaW50IGkgPSBtaXNjLT5taW5vcjsKKworCWlmIChsaXN0X2VtcHR5KCZtaXNjLT5saXN0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZtaXNjX3NlbSk7CisJbGlzdF9kZWwoJm1pc2MtPmxpc3QpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKE1JU0NfTUFKT1IsIG1pc2MtPm1pbm9yKSk7CisJZGV2ZnNfcmVtb3ZlKG1pc2MtPmRldmZzX25hbWUpOworCWlmIChpIDwgRFlOQU1JQ19NSU5PUlMgJiYgaT4wKSB7CisJCW1pc2NfbWlub3JzW2k+PjNdICY9IH4oMSA8PCAobWlzYy0+bWlub3IgJiA3KSk7CisJfQorCXVwKCZtaXNjX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wobWlzY19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKG1pc2NfZGVyZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IG1pc2NfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgibWlzYyIsIDAsIE5VTEwpOworCWlmIChlbnQpCisJCWVudC0+cHJvY19mb3BzID0gJm1pc2NfcHJvY19mb3BzOworI2VuZGlmCisJbWlzY19jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJtaXNjIik7CisJaWYgKElTX0VSUihtaXNjX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIobWlzY19jbGFzcyk7CisjaWZkZWYgQ09ORklHX01WTUUxNngKKwlydGNfTUs0OFQwOF9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlZNRTYwMDAKKwlydGNfRFA4NTcwQV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworCXBtdV9kZXZpY2VfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RPU0hJQkEKKwl0b3NoX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JOEsKKwlpOGtfaW5pdCgpOworI2VuZGlmCisJaWYgKHJlZ2lzdGVyX2NocmRldihNSVNDX01BSk9SLCJtaXNjIiwmbWlzY19mb3BzKSkgeworCQlwcmludGsoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIG1pc2MgZGV2aWNlc1xuIiwKKwkJICAgICAgIE1JU0NfTUFKT1IpOworCQljbGFzc19zaW1wbGVfZGVzdHJveShtaXNjX2NsYXNzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKG1pc2NfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW10aW1lci5jIGIvZHJpdmVycy9jaGFyL21tdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVkZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21tdGltZXIuYwpAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIEludGVsIE11bHRpbWVkaWEgVGltZXIgZGV2aWNlIGltcGxlbWVudGF0aW9uIGZvciBTR0kgU04gcGxhdGZvcm1zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBkcml2ZXIgZXhwb3J0cyBhbiBBUEkgdGhhdCBzaG91bGQgYmUgc3VwcG9ydGFibGUgYnkgYW55IEhQRVQgb3IgSUEtUEMKKyAqIG11bHRpbWVkaWEgdGltZXIuICBUaGUgY29kZSBiZWxvdyBpcyBjdXJyZW50bHkgc3BlY2lmaWMgdG8gdGhlIFNHSSBBbHRpeAorICogU0h1YiBSVEMsIGhvd2V2ZXIuCisgKgorICogMTEvMDEvMDEgLSBqYmFybmVzIC0gaW5pdGlhbCByZXZpc2lvbgorICogOS8xMC8wNCAtIENocmlzdG9waCBMYW1ldGVyIC0gcmVtb3ZlIGludGVycnVwdCBzdXBwb3J0IGZvciBrZXJuZWwgaW5jbHVzaW9uCisgKiAxMC8xLzA0IC0gQ2hyaXN0b3BoIExhbWV0ZXIgLSBwcm92aWRlIHBvc2l4IGNsb2NrIENMT0NLX1NHSV9DWUNMRQorICogMTAvMTMvMDQgLSBDaHJpc3RvcGggTGFtZXRlciwgRGltaXRyaSBTaXZhbmljaCAtIHByb3ZpZGUgdGltZXIgaW50ZXJydXB0CisgKgkJc3VwcG9ydCB2aWEgdGhlIHBvc2l4IHRpbWVyIGludGVyZmFjZQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vaW50ci5oPgorI2luY2x1ZGUgPGFzbS9zbi9zaHViX21tci5oPgorI2luY2x1ZGUgPGFzbS9zbi9ub2RlcGRhLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NodWJpby5oPgorCitNT0RVTEVfQVVUSE9SKCJKZXNzZSBCYXJuZXMgPGpiYXJuZXNAc2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IFJUQyBUaW1lciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBuYW1lIG9mIHRoZSBkZXZpY2UsIHVzdWFsbHkgaW4gL2RldiAqLworI2RlZmluZSBNTVRJTUVSX05BTUUgIm1tdGltZXIiCisjZGVmaW5lIE1NVElNRVJfREVTQyAiU0dJIEFsdGl4IFJUQyBUaW1lciIKKyNkZWZpbmUgTU1USU1FUl9WRVJTSU9OICIyLjAiCisKKyNkZWZpbmUgUlRDX0JJVFMgNTUgLyogNTUgYml0cyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisKKyNkZWZpbmUgUlRDX0NPVU5URVJfQUREUiAgICAgICAgKChsb25nICopTE9DQUxfTU1SX0FERFIoU0hfUlRDKSkKKworI2RlZmluZSBydGNfdGltZSgpICAgICAgICAgICAgICAoKlJUQ19DT1VOVEVSX0FERFIpCisKK3N0YXRpYyBpbnQgbW10aW1lcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IG1tdGltZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCisvKgorICogUGVyaW9kIGluIGZlbXRvc2Vjb25kcyAoMTBeLTE1IHMpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1tdGltZXJfZmVtdG9wZXJpb2QgPSAwOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtbXRpbWVyX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm1tYXAgPQkJbW10aW1lcl9tbWFwLAorCS5pb2N0bCA9CW1tdGltZXJfaW9jdGwsCit9OworCisvKgorICogV2Ugb25seSBoYXZlIGNvbXBhcmlzb24gcmVnaXN0ZXJzIFJUQzEtNCBjdXJyZW50bHkgYXZhaWxhYmxlIHBlcgorICogbm9kZS4gIFJUQzAgaXMgdXNlZCBieSBTQUwuCisgKi8KKyNkZWZpbmUgTlVNX0NPTVBBUkFUT1JTIDMKKy8qIENoZWNrIGZvciBhbiBSVEMgaW50ZXJydXB0IHBlbmRpbmcgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1tdGltZXJfaW50X3BlbmRpbmcoaW50IGNvbXBhcmF0b3IpCit7CisJaWYgKEhVQl9MKCh1bnNpZ25lZCBsb25nICopTE9DQUxfTU1SX0FERFIoU0hfRVZFTlRfT0NDVVJSRUQpKSAmCisJCQlTSF9FVkVOVF9PQ0NVUlJFRF9SVEMxX0lOVF9NQVNLIDw8IGNvbXBhcmF0b3IpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisvKiBDbGVhciB0aGUgUlRDIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworc3RhdGljIHZvaWQgaW5saW5lIG1tdGltZXJfY2xyX2ludF9wZW5kaW5nKGludCBjb21wYXJhdG9yKQoreworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9FVkVOVF9PQ0NVUlJFRF9BTElBUyksCisJCVNIX0VWRU5UX09DQ1VSUkVEX1JUQzFfSU5UX01BU0sgPDwgY29tcGFyYXRvcik7Cit9CisKKy8qIFNldHVwIHRpbWVyIG9uIGNvbXBhcmF0b3IgUlRDMSAqLworc3RhdGljIHZvaWQgaW5saW5lIG1tdGltZXJfc2V0dXBfaW50XzAodTY0IGV4cGlyZXMpCit7CisJdTY0IHZhbDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0ICovCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0VOQUJMRSksIDBVTCk7CisKKwkvKiBJbml0aWFsaXplIGNvbXBhcmF0b3IgdmFsdWUgKi8KKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEIpLCAtMUwpOworCisJLyogQ2xlYXIgcGVuZGluZyBiaXQgKi8KKwltbXRpbWVyX2Nscl9pbnRfcGVuZGluZygwKTsKKworCXZhbCA9ICgodTY0KVNHSV9NTVRJTUVSX1ZFQ1RPUiA8PCBTSF9SVEMxX0lOVF9DT05GSUdfSURYX1NIRlQpIHwKKwkJKCh1NjQpY3B1X3BoeXNpY2FsX2lkKHNtcF9wcm9jZXNzb3JfaWQoKSkgPDwKKwkJCVNIX1JUQzFfSU5UX0NPTkZJR19QSURfU0hGVCk7CisKKwkvKiBTZXQgY29uZmlndXJhdGlvbiAqLworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMxX0lOVF9DT05GSUcpLCB2YWwpOworCisJLyogRW5hYmxlIFJUQyBpbnRlcnJ1cHRzICovCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0VOQUJMRSksIDFVTCk7CisKKwkvKiBJbml0aWFsaXplIGNvbXBhcmF0b3IgdmFsdWUgKi8KKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEIpLCBleHBpcmVzKTsKKworCit9CisKKy8qIFNldHVwIHRpbWVyIG9uIGNvbXBhcmF0b3IgUlRDMiAqLworc3RhdGljIHZvaWQgaW5saW5lIG1tdGltZXJfc2V0dXBfaW50XzEodTY0IGV4cGlyZXMpCit7CisJdTY0IHZhbDsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMyX0lOVF9FTkFCTEUpLCAwVUwpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX0lOVF9DTVBDKSwgLTFMKTsKKworCW1tdGltZXJfY2xyX2ludF9wZW5kaW5nKDEpOworCisJdmFsID0gKCh1NjQpU0dJX01NVElNRVJfVkVDVE9SIDw8IFNIX1JUQzJfSU5UX0NPTkZJR19JRFhfU0hGVCkgfAorCQkoKHU2NCljcHVfcGh5c2ljYWxfaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKSA8PAorCQkJU0hfUlRDMl9JTlRfQ09ORklHX1BJRF9TSEZUKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMyX0lOVF9DT05GSUcpLCB2YWwpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzJfSU5UX0VOQUJMRSksIDFVTCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEMpLCBleHBpcmVzKTsKK30KKworLyogU2V0dXAgdGltZXIgb24gY29tcGFyYXRvciBSVEMzICovCitzdGF0aWMgdm9pZCBpbmxpbmUgbW10aW1lcl9zZXR1cF9pbnRfMih1NjQgZXhwaXJlcykKK3sKKwl1NjQgdmFsOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzNfSU5UX0VOQUJMRSksIDBVTCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEQpLCAtMUwpOworCisJbW10aW1lcl9jbHJfaW50X3BlbmRpbmcoMik7CisKKwl2YWwgPSAoKHU2NClTR0lfTU1USU1FUl9WRUNUT1IgPDwgU0hfUlRDM19JTlRfQ09ORklHX0lEWF9TSEZUKSB8CisJCSgodTY0KWNwdV9waHlzaWNhbF9pZChzbXBfcHJvY2Vzc29yX2lkKCkpIDw8CisJCQlTSF9SVEMzX0lOVF9DT05GSUdfUElEX1NIRlQpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzNfSU5UX0NPTkZJRyksIHZhbCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDM19JTlRfRU5BQkxFKSwgMVVMKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9JTlRfQ01QRCksIGV4cGlyZXMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgYW5kIHByZWVtcHRpb24gb2ZmCisgKiBpbiBvcmRlciB0byBpbnN1cmUgdGhhdCB0aGUgc2V0dXAgc3VjY2VlZHMgaW4gYSBkZXRlcm1pbmlzdGljIHRpbWUgZnJhbWUuCisgKiBJdCB3aWxsIGNoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgc2V0dXAgc3VjY2VlZGVkLgorICovCitzdGF0aWMgaW50IGlubGluZSBtbXRpbWVyX3NldHVwKGludCBjb21wYXJhdG9yLCB1bnNpZ25lZCBsb25nIGV4cGlyZXMpCit7CisKKwlzd2l0Y2ggKGNvbXBhcmF0b3IpIHsKKwljYXNlIDA6CisJCW1tdGltZXJfc2V0dXBfaW50XzAoZXhwaXJlcyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbW10aW1lcl9zZXR1cF9pbnRfMShleHBpcmVzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltbXRpbWVyX3NldHVwX2ludF8yKGV4cGlyZXMpOworCQlicmVhazsKKwl9CisJLyogV2UgbWlnaHQndmUgbWlzc2VkIG91ciBleHBpcmF0aW9uIHRpbWUgKi8KKwlpZiAocnRjX3RpbWUoKSA8IGV4cGlyZXMpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBJZiBhbiBpbnRlcnJ1cHQgaXMgYWxyZWFkeSBwZW5kaW5nIHRoZW4gaXRzIG9rYXkKKwkgKiBpZiBub3QgdGhlbiB3ZSBmYWlsZWQKKwkgKi8KKwlyZXR1cm4gbW10aW1lcl9pbnRfcGVuZGluZyhjb21wYXJhdG9yKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgbW10aW1lcl9kaXNhYmxlX2ludChsb25nIG5hc2lkLCBpbnQgY29tcGFyYXRvcikKK3sKKwlzd2l0Y2ggKGNvbXBhcmF0b3IpIHsKKwljYXNlIDA6CisJCW5hc2lkID09IC0xID8gSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0VOQUJMRSksCisJCQkwVUwpIDogUkVNT1RFX0hVQl9TKG5hc2lkLCBTSF9SVEMxX0lOVF9FTkFCTEUsIDBVTCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbmFzaWQgPT0gLTEgPyBIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDMl9JTlRfRU5BQkxFKSwKKwkJCTBVTCkgOiBSRU1PVEVfSFVCX1MobmFzaWQsIFNIX1JUQzJfSU5UX0VOQUJMRSwgMFVMKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQluYXNpZCA9PSAtMSA/IEhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMzX0lOVF9FTkFCTEUpLAorCQkJMFVMKSA6IFJFTU9URV9IVUJfUyhuYXNpZCwgU0hfUlRDM19JTlRfRU5BQkxFLCAwVUwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVElNRVJfT0ZGIDB4YmFkY2FiTEwKKworLyogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBlYWNoIGNvbXBhcmF0b3IgKi8KK3R5cGVkZWYgc3RydWN0IG1tdGltZXIgeworCXNwaW5sb2NrX3QgbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IGtfaXRpbWVyICp0aW1lcjsKKwlpbnQgaTsKKwlpbnQgY3B1OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworfSBtbXRpbWVyX3Q7CisKKy8qCisgKiBUb3RhbCBudW1iZXIgb2YgY29tcGFyYXRvcnMgaXMgY29tcGFyYXRvcnMvbm9kZSAqIE1BWCBub2Rlcy9ydW5uaW5nIGtlcm5lbAorICovCitzdGF0aWMgbW10aW1lcl90IHRpbWVyc1tOVU1fQ09NUEFSQVRPUlMqTUFYX0NPTVBBQ1RfTk9ERVNdOworCisvKioKKyAqIG1tdGltZXJfaW9jdGwgLSBpb2N0bCBpbnRlcmZhY2UgZm9yIC9kZXYvbW10aW1lcgorICogQGlub2RlOiBpbm9kZSBvZiB0aGUgZGV2aWNlCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIEBjbWQ6IGNvbW1hbmQgdG8gZXhlY3V0ZQorICogQGFyZzogb3B0aW9uYWwgYXJndW1lbnQgdG8gY29tbWFuZAorICoKKyAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSBAY21kLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCA8IDAgZm9yCisgKiBmYWlsdXJlLgorICoKKyAqIFZhbGlkIGNvbW1hbmRzOgorICoKKyAqICVNTVRJTUVSX0dFVE9GRlNFVCAtIFNob3VsZCByZXR1cm4gdGhlIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0CisgKiBvZiB0aGUgcGFnZSB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQpIGZvciB0aGUgY291bnRlciBpbiBxdWVzdGlvbi4KKyAqCisgKiAlTU1USU1FUl9HRVRSRVMgLSBSZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBpbiBmZW10byAoMTBeLTE1KQorICogc2Vjb25kcworICoKKyAqICVNTVRJTUVSX0dFVEZSRVEgLSBDb3BpZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY2xvY2sgaW4gSHogdG8gdGhlIGFkZHJlc3MKKyAqIHNwZWNpZmllZCBieSBAYXJnCisgKgorICogJU1NVElNRVJfR0VUQklUUyAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjbG9jaydzIGNvdW50ZXIKKyAqCisgKiAlTU1USU1FUl9NTUFQQVZBSUwgLSBSZXR1cm5zIDEgaWYgdGhlIHJlZ2lzdGVycyBjYW4gYmUgbW1hcCdkIGludG8gdXNlcnNwYWNlCisgKgorICogJU1NVElNRVJfR0VUQ09VTlRFUiAtIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGNvdW50ZXIgYW5kIHBsYWNlcyBpdAorICogaW4gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGJ5IEBhcmcuCisgKi8KK3N0YXRpYyBpbnQgbW10aW1lcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNTVRJTUVSX0dFVE9GRlNFVDoJLyogb2Zmc2V0IG9mIHRoZSBjb3VudGVyICovCisJCS8qCisJCSAqIFNOIFJUQyByZWdpc3RlcnMgYXJlIG9uIHRoZWlyIG93biA2NGsgcGFnZQorCQkgKi8KKwkJaWYoUEFHRV9TSVpFIDw9ICgxIDw8IDE2KSkKKwkJCXJldCA9ICgoKGxvbmcpUlRDX0NPVU5URVJfQUREUikgJiAoUEFHRV9TSVpFLTEpKSAvIDg7CisJCWVsc2UKKwkJCXJldCA9IC1FTk9TWVM7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVFJFUzogLyogcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2sgaW4gMTBeLTE1IHMgKi8KKwkJaWYoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkmbW10aW1lcl9mZW10b3BlcmlvZCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9HRVRGUkVROiAvKiBmcmVxdWVuY3kgaW4gSHogKi8KKwkJaWYoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkmc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kLAorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIE1NVElNRVJfR0VUQklUUzogLyogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNsb2NrICovCisJCXJldCA9IFJUQ19CSVRTOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9NTUFQQVZBSUw6IC8qIGNhbiB3ZSBtbWFwIHRoZSBjbG9jayBpbnRvIHVzZXJzcGFjZT8gKi8KKwkJcmV0ID0gKFBBR0VfU0laRSA8PSAoMSA8PCAxNikpID8gMSA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVENPVU5URVI6CisJCWlmKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcsCisJCQkJUlRDX0NPVU5URVJfQUREUiwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1tdGltZXJfbW1hcCAtIG1hcHMgdGhlIGNsb2NrJ3MgcmVnaXN0ZXJzIGludG8gdXNlcnNwYWNlCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIEB2bWE6IFZNQSB0byBtYXAgdGhlIHJlZ2lzdGVycyBpbnRvCisgKgorICogQ2FsbHMgcmVtYXBfcGZuX3JhbmdlKCkgdG8gbWFwIHRoZSBjbG9jaydzIHJlZ2lzdGVycyBpbnRvCisgKiB0aGUgY2FsbGluZyBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW50IG1tdGltZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyBtbXRpbWVyX2FkZHI7CisKKwlpZiAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICE9IFBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKFBBR0VfU0laRSA+ICgxIDw8IDE2KSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1NITSB8IFZNX0xPQ0tFRCApOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwltbXRpbWVyX2FkZHIgPSBfX3BhKFJUQ19DT1VOVEVSX0FERFIpOworCW1tdGltZXJfYWRkciAmPSB+KFBBR0VfU0laRSAtIDEpOworCW1tdGltZXJfYWRkciAmPSAweGZmZmZmZmZmZmZmZmZmZlVMOworCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG1tdGltZXJfYWRkciA+PiBQQUdFX1NISUZULAorCQkJCQlQQUdFX1NJWkUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlwcmludGsoS0VSTl9FUlIgInJlbWFwX3Bmbl9yYW5nZSBmYWlsZWQgaW4gbW10aW1lci5jXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtbXRpbWVyX21pc2NkZXYgPSB7CisJU0dJX01NVElNRVIsCisJTU1USU1FUl9OQU1FLAorCSZtbXRpbWVyX2ZvcHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgc2dpX2Nsb2NrX29mZnNldDsKK3N0YXRpYyBpbnQgc2dpX2Nsb2NrX3BlcmlvZDsKKworLyoKKyAqIFBvc2l4IFRpbWVyIEludGVyZmFjZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgc2dpX2Nsb2NrX29mZnNldDsKK3N0YXRpYyBpbnQgc2dpX2Nsb2NrX3BlcmlvZDsKKworc3RhdGljIGludCBzZ2lfY2xvY2tfZ2V0KGNsb2NraWRfdCBjbG9ja2lkLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoreworCXU2NCBuc2VjOworCisJbnNlYyA9IHJ0Y190aW1lKCkgKiBzZ2lfY2xvY2tfcGVyaW9kCisJCQkrIHNnaV9jbG9ja19vZmZzZXQudHZfbnNlYzsKKwl0cC0+dHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmdHAtPnR2X25zZWMpCisJCQkrIHNnaV9jbG9ja19vZmZzZXQudHZfc2VjOworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBzZ2lfY2xvY2tfc2V0KGNsb2NraWRfdCBjbG9ja2lkLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoreworCisJdTY0IG5zZWM7CisJdTY0IHJlbTsKKworCW5zZWMgPSBydGNfdGltZSgpICogc2dpX2Nsb2NrX3BlcmlvZDsKKworCXNnaV9jbG9ja19vZmZzZXQudHZfc2VjID0gdHAtPnR2X3NlYyAtIGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnJlbSk7CisKKwlpZiAocmVtIDw9IHRwLT50dl9uc2VjKQorCQlzZ2lfY2xvY2tfb2Zmc2V0LnR2X25zZWMgPSB0cC0+dHZfc2VjIC0gcmVtOworCWVsc2UgeworCQlzZ2lfY2xvY2tfb2Zmc2V0LnR2X25zZWMgPSB0cC0+dHZfc2VjICsgTlNFQ19QRVJfU0VDIC0gcmVtOworCQlzZ2lfY2xvY2tfb2Zmc2V0LnR2X3NlYy0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNjaGVkdWxlIHRoZSBuZXh0IHBlcmlvZGljIGludGVycnVwdC4gVGhpcyBmdW5jdGlvbiB3aWxsIGF0dGVtcHQKKyAqIHRvIHNjaGVkdWxlIGEgcGVyaW9kaWMgaW50ZXJydXB0IGxhdGVyIGlmIG5lY2Vzc2FyeS4gSWYgdGhlIHNjaGVkdWxpbmcKKyAqIG9mIGFuIGludGVycnVwdCBmYWlscyB0aGVuIHRoZSB0aW1lIHRvIHNraXAgaXMgbGVuZ3RoZW5lZAorICogZXhwb25lbnRpYWxseSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgbmV4dCBpbnRlcnJ1cHQKKyAqIGNhbiBiZSBwcm9wZXJseSBzY2hlZHVsZWQuLgorICovCitzdGF0aWMgaW50IGlubGluZSByZXNjaGVkdWxlX3BlcmlvZGljX3RpbWVyKG1tdGltZXJfdCAqeCkKK3sKKwlpbnQgbjsKKwlzdHJ1Y3Qga19pdGltZXIgKnQgPSB4LT50aW1lcjsKKworCXQtPml0Lm1tdGltZXIuY2xvY2sgPSB4LT5pOworCXQtPml0X292ZXJydW4tLTsKKworCW4gPSAwOworCWRvIHsKKworCQl0LT5pdC5tbXRpbWVyLmV4cGlyZXMgKz0gdC0+aXQubW10aW1lci5pbmNyIDw8IG47CisJCXQtPml0X292ZXJydW4gKz0gMSA8PCBuOworCQluKys7CisJCWlmIChuID4gMjApCisJCQlyZXR1cm4gMTsKKworCX0gd2hpbGUgKCFtbXRpbWVyX3NldHVwKHgtPmksIHQtPml0Lm1tdGltZXIuZXhwaXJlcykpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbW10aW1lcl9pbnRlcnJ1cHQgLSB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGlycTogaXJxIHJlY2VpdmVkCisgKiBAZGV2X2lkOiBkZXZpY2UgdGhlIGlycSBjYW1lIGZyb20KKyAqIEByZWdzOiByZWdpc3RlciBzdGF0ZSB1cG9uIHJlY2VpcHQgb2YgdGhlIGludGVycnVwdAorICoKKyAqIENhbGxlZCB3aGVuIG9uZSBvZiB0aGUgY29tYXJhdG9ycyBtYXRjaGVzIHRoZSBjb3VudGVyLCBUaGlzCisgKiByb3V0aW5lIHdpbGwgc2VuZCBzaWduYWxzIHRvIHByb2Nlc3NlcyB0aGF0IGhhdmUgcmVxdWVzdGVkCisgKiB0aGVtLgorICoKKyAqIFRoaXMgaW50ZXJydXB0IGlzIHJ1biBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dAorICogYnkgdGhlIFNIVUIuIEl0IGlzIHRoZXJlZm9yZSBzYWZlIHRvIGxvY2FsbHkgYWNjZXNzIFNIdWIKKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGlycXJldHVybl90CittbXRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCW1tdGltZXJfdCAqYmFzZSA9IHRpbWVycyArIGNwdWlkX3RvX2Nub2RlaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKSAqCisJCQkJCQlOVU1fQ09NUEFSQVRPUlM7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gMDsKKwlpbnQgcmVzdWx0ID0gSVJRX05PTkU7CisKKwkvKgorCSAqIERvIHRoaXMgb25jZSBmb3IgZWFjaCBjb21wYXJpc29uIHJlZ2lzdGVyCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT01QQVJBVE9SUzsgaSsrKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZ2V0IHJldXNlZCBiZWZvcmUgdGFza2xldF9zY2hlZCAqLworCQlzcGluX2xvY2soJmJhc2VbaV0ubG9jayk7CisJCWlmIChiYXNlW2ldLmNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJCWlmIChiYXNlW2ldLnRpbWVyKQorCQkJCWV4cGlyZXMgPSBiYXNlW2ldLnRpbWVyLT5pdC5tbXRpbWVyLmV4cGlyZXM7CisJCQkvKiBleHBpcmVzIHRlc3Qgd29uJ3Qgd29yayB3aXRoIHNoYXJlZCBpcnFzICovCisJCQlpZiAoKG1tdGltZXJfaW50X3BlbmRpbmcoaSkgPiAwKSB8fAorCQkJCShleHBpcmVzICYmIChleHBpcmVzIDwgcnRjX3RpbWUoKSkpKSB7CisJCQkJbW10aW1lcl9jbHJfaW50X3BlbmRpbmcoaSk7CisJCQkJdGFza2xldF9zY2hlZHVsZSgmYmFzZVtpXS50YXNrbGV0KTsKKwkJCQlyZXN1bHQgPSBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmYmFzZVtpXS5sb2NrKTsKKwkJZXhwaXJlcyA9IDA7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgbW10aW1lcl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkgeworCW1tdGltZXJfdCAqeCA9IChtbXRpbWVyX3QgKilkYXRhOworCXN0cnVjdCBrX2l0aW1lciAqdCA9IHgtPnRpbWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBTZW5kIHNpZ25hbCBhbmQgZGVhbCB3aXRoIHBlcmlvZGljIHNpZ25hbHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdC0+aXRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmeC0+bG9jayk7CisJLyogSWYgdGltZXIgd2FzIGRlbGV0ZWQgYmV0d2VlbiBpbnRlcnJ1cHQgYW5kIGhlcmUsIGxlYXZlICovCisJaWYgKHQgIT0geC0+dGltZXIpCisJCWdvdG8gb3V0OworCXQtPml0X292ZXJydW4gPSAwOworCisJaWYgKHRhc2tsaXN0X2xvY2sud3JpdGVfbG9jayB8fCBwb3NpeF90aW1lcl9ldmVudCh0LCAwKSAhPSAwKSB7CisKKwkJLy8gcHJpbnRrKEtFUk5fV0FSTklORyAibW10aW1lcjogY2Fubm90IGRlbGl2ZXIgc2lnbmFsLlxuIik7CisKKwkJdC0+aXRfb3ZlcnJ1bisrOworCX0KKwlpZih0LT5pdC5tbXRpbWVyLmluY3IpIHsKKwkJLyogUGVyaW9kaWMgdGltZXIgKi8KKwkJaWYgKHJlc2NoZWR1bGVfcGVyaW9kaWNfdGltZXIoeCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1tdGltZXI6IHVuYWJsZSB0byByZXNjaGVkdWxlXG4iKTsKKwkJCXgtPnRpbWVyID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEVuc3VyZSB3ZSBkb24ndCBmYWxzZSB0cmlnZ2VyIGluIG1tdGltZXJfaW50ZXJydXB0ICovCisJCXQtPml0Lm1tdGltZXIuZXhwaXJlcyA9IDA7CisJfQorCXQtPml0X292ZXJydW5fbGFzdCA9IHQtPml0X292ZXJydW47CitvdXQ6CisJc3Bpbl91bmxvY2soJngtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPml0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzZ2lfdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqdGltZXIpCit7CisJLyogSW5zdXJlIHRoYXQgYSBuZXdseSBjcmVhdGVkIHRpbWVyIGlzIG9mZiAqLworCXRpbWVyLT5pdC5tbXRpbWVyLmNsb2NrID0gVElNRVJfT0ZGOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGRvZXMgbm90IHJlYWxseSBkZWxldGUgYSB0aW1lci4gSXQganVzdCBpbnN1cmVzCisgKiB0aGF0IHRoZSB0aW1lciBpcyBub3QgYWN0aXZlCisgKgorICogQXNzdW1wdGlvbjogaXRfbG9jayBpcyBhbHJlYWR5IGhlbGQgd2l0aCBpcnEncyBkaXNhYmxlZAorICovCitzdGF0aWMgaW50IHNnaV90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1yKQoreworCWludCBpID0gdGltci0+aXQubW10aW1lci5jbG9jazsKKwljbm9kZWlkX3Qgbm9kZWlkID0gdGltci0+aXQubW10aW1lci5ub2RlOworCW1tdGltZXJfdCAqdCA9IHRpbWVycyArIG5vZGVpZCAqIE5VTV9DT01QQVJBVE9SUyAraTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJaWYgKGkgIT0gVElNRVJfT0ZGKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0LT5sb2NrLCBpcnFmbGFncyk7CisJCW1tdGltZXJfZGlzYWJsZV9pbnQoY25vZGVpZF90b19uYXNpZChub2RlaWQpLGkpOworCQl0LT50aW1lciA9IE5VTEw7CisJCXRpbXItPml0Lm1tdGltZXIuY2xvY2sgPSBUSU1FUl9PRkY7CisJCXRpbXItPml0Lm1tdGltZXIuZXhwaXJlcyA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPmxvY2ssIGlycWZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgdGltZXNwZWNfdG9fbnMoeCkgKCh4KS50dl9uc2VjICsgKHgpLnR2X3NlYyAqIE5TRUNfUEVSX1NFQykKKyNkZWZpbmUgbnNfdG9fdGltZXNwZWModHMsIG5zZWMpICh0cykudHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmKHRzKS50dl9uc2VjKQorCisvKiBBc3N1bXB0aW9uOiBpdF9sb2NrIGlzIGFscmVhZHkgaGVsZCB3aXRoIGlycSdzIGRpc2FibGVkICovCitzdGF0aWMgdm9pZCBzZ2lfdGltZXJfZ2V0KHN0cnVjdCBrX2l0aW1lciAqdGltciwgc3RydWN0IGl0aW1lcnNwZWMgKmN1cl9zZXR0aW5nKQoreworCisJaWYgKHRpbXItPml0Lm1tdGltZXIuY2xvY2sgPT0gVElNRVJfT0ZGKSB7CisJCWN1cl9zZXR0aW5nLT5pdF9pbnRlcnZhbC50dl9uc2VjID0gMDsKKwkJY3VyX3NldHRpbmctPml0X2ludGVydmFsLnR2X3NlYyA9IDA7CisJCWN1cl9zZXR0aW5nLT5pdF92YWx1ZS50dl9uc2VjID0gMDsKKwkJY3VyX3NldHRpbmctPml0X3ZhbHVlLnR2X3NlYyA9MDsKKwkJcmV0dXJuOworCX0KKworCW5zX3RvX3RpbWVzcGVjKGN1cl9zZXR0aW5nLT5pdF9pbnRlcnZhbCwgdGltci0+aXQubW10aW1lci5pbmNyICogc2dpX2Nsb2NrX3BlcmlvZCk7CisJbnNfdG9fdGltZXNwZWMoY3VyX3NldHRpbmctPml0X3ZhbHVlLCAodGltci0+aXQubW10aW1lci5leHBpcmVzIC0gcnRjX3RpbWUoKSkqIHNnaV9jbG9ja19wZXJpb2QpOworCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IHNnaV90aW1lcl9zZXQoc3RydWN0IGtfaXRpbWVyICp0aW1yLCBpbnQgZmxhZ3MsCisJc3RydWN0IGl0aW1lcnNwZWMgKiBuZXdfc2V0dGluZywKKwlzdHJ1Y3QgaXRpbWVyc3BlYyAqIG9sZF9zZXR0aW5nKQoreworCisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB3aGVuLCBwZXJpb2QsIGlycWZsYWdzOworCWludCBlcnIgPSAwOworCWNub2RlaWRfdCBub2RlaWQ7CisJbW10aW1lcl90ICpiYXNlOworCisJaWYgKG9sZF9zZXR0aW5nKQorCQlzZ2lfdGltZXJfZ2V0KHRpbXIsIG9sZF9zZXR0aW5nKTsKKworCXNnaV90aW1lcl9kZWwodGltcik7CisJd2hlbiA9IHRpbWVzcGVjX3RvX25zKG5ld19zZXR0aW5nLT5pdF92YWx1ZSk7CisJcGVyaW9kID0gdGltZXNwZWNfdG9fbnMobmV3X3NldHRpbmctPml0X2ludGVydmFsKTsKKworCWlmICh3aGVuID09IDApCisJCS8qIENsZWFyIHRpbWVyICovCisJCXJldHVybiAwOworCisJaWYgKGZsYWdzICYgVElNRVJfQUJTVElNRSkgeworCQlzdHJ1Y3QgdGltZXNwZWMgbjsKKwkJdW5zaWduZWQgbG9uZyBub3c7CisKKwkJZ2V0bnN0aW1lb2ZkYXkoJm4pOworCQlub3cgPSB0aW1lc3BlY190b19ucyhuKTsKKwkJaWYgKHdoZW4gPiBub3cpCisJCQl3aGVuIC09IG5vdzsKKwkJZWxzZQorCQkJLyogRmlyZSB0aGUgdGltZXIgaW1tZWRpYXRlbHkgKi8KKwkJCXdoZW4gPSAwOworCX0KKworCS8qCisJICogQ29udmVydCB0byBzZ2kgY2xvY2sgcGVyaW9kLiBOZWVkIHRvIGtlZXAgcnRjX3RpbWUoKSBhcyBuZWFyIGFzIHBvc3NpYmxlCisJICogdG8gZ2V0bnN0aW1lb2ZkYXkoKSBpbiBvcmRlciB0byBiZSBhcyBmYWl0aGZ1bCBhcyBwb3NzaWJsZSB0byB0aGUgdGltZQorCSAqIHNwZWNpZmllZC4KKwkgKi8KKwl3aGVuID0gKHdoZW4gKyBzZ2lfY2xvY2tfcGVyaW9kIC0gMSkgLyBzZ2lfY2xvY2tfcGVyaW9kICsgcnRjX3RpbWUoKTsKKwlwZXJpb2QgPSAocGVyaW9kICsgc2dpX2Nsb2NrX3BlcmlvZCAtIDEpICAvIHNnaV9jbG9ja19wZXJpb2Q7CisKKwkvKgorCSAqIFdlIGFyZSBhbGxvY2F0aW5nIGEgbG9jYWwgU0h1YiBjb21wYXJhdG9yLiBJZiB3ZSB3b3VsZCBiZSBtb3ZlZCB0byBhbm90aGVyCisJICogY3B1IHRoZW4gYW5vdGhlciBTSHViIG1heSBiZSBsb2NhbCB0byB1cy4gUHJvaGliaXQgdGhhdCBieSBzd2l0Y2hpbmcgb2ZmCisJICogcHJlZW1wdGlvbi4KKwkgKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCW5vZGVpZCA9ICBjcHVpZF90b19jbm9kZWlkKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJYmFzZSA9IHRpbWVycyArIG5vZGVpZCAqIE5VTV9DT01QQVJBVE9SUzsKK3JldHJ5OgorCS8qIERvbid0IHVzZSBhbiBhbGxvY2F0ZWQgdGltZXIsIG9yIGEgZGVsZXRlZCBvbmUgdGhhdCdzIHBlbmRpbmcgKi8KKwlmb3IoaSA9IDA7IGk8IE5VTV9DT01QQVJBVE9SUzsgaSsrKSB7CisJCWlmICghYmFzZVtpXS50aW1lciAmJiAhYmFzZVtpXS50YXNrbGV0LnN0YXRlKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IE5VTV9DT01QQVJBVE9SUykgeworCQlwcmVlbXB0X2VuYWJsZSgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYXNlW2ldLmxvY2ssIGlycWZsYWdzKTsKKworCWlmIChiYXNlW2ldLnRpbWVyIHx8IGJhc2VbaV0udGFza2xldC5zdGF0ZSAhPSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2VbaV0ubG9jaywgaXJxZmxhZ3MpOworCQlnb3RvIHJldHJ5OworCX0KKwliYXNlW2ldLnRpbWVyID0gdGltcjsKKwliYXNlW2ldLmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXRpbXItPml0Lm1tdGltZXIuY2xvY2sgPSBpOworCXRpbXItPml0Lm1tdGltZXIubm9kZSA9IG5vZGVpZDsKKwl0aW1yLT5pdC5tbXRpbWVyLmluY3IgPSBwZXJpb2Q7CisJdGltci0+aXQubW10aW1lci5leHBpcmVzID0gd2hlbjsKKworCWlmIChwZXJpb2QgPT0gMCkgeworCQlpZiAoIW1tdGltZXJfc2V0dXAoaSwgd2hlbikpIHsKKwkJCW1tdGltZXJfZGlzYWJsZV9pbnQoLTEsIGkpOworCQkJcG9zaXhfdGltZXJfZXZlbnQodGltciwgMCk7CisJCQl0aW1yLT5pdC5tbXRpbWVyLmV4cGlyZXMgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJdGltci0+aXQubW10aW1lci5leHBpcmVzIC09IHBlcmlvZDsKKwkJaWYgKHJlc2NoZWR1bGVfcGVyaW9kaWNfdGltZXIoYmFzZStpKSkKKwkJCWVyciA9IC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZVtpXS5sb2NrLCBpcnFmbGFncyk7CisKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBrX2Nsb2NrIHNnaV9jbG9jayA9IHsKKwkucmVzID0gMCwKKwkuY2xvY2tfc2V0ID0gc2dpX2Nsb2NrX3NldCwKKwkuY2xvY2tfZ2V0ID0gc2dpX2Nsb2NrX2dldCwKKwkudGltZXJfY3JlYXRlID0gc2dpX3RpbWVyX2NyZWF0ZSwKKwkubnNsZWVwID0gZG9fcG9zaXhfY2xvY2tfbm9uYW5vc2xlZXAsCisJLnRpbWVyX3NldCA9IHNnaV90aW1lcl9zZXQsCisJLnRpbWVyX2RlbCA9IHNnaV90aW1lcl9kZWwsCisJLnRpbWVyX2dldCA9IHNnaV90aW1lcl9nZXQKK307CisKKy8qKgorICogbW10aW1lcl9pbml0IC0gZGV2aWNlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqCisgKiBEb2VzIGluaXRpYWwgc2V0dXAgZm9yIHRoZSBtbXRpbWVyIGRldmljZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgbW10aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikpCisJCXJldHVybiAtMTsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIHRoZSBjeWNsZXMvc2VjIHZhcmlhYmxlCisJICovCisJaWYgKHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCA8IDEwMDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZGV0ZXJtaW5lIGNsb2NrIGZyZXF1ZW5jeVxuIiwKKwkJICAgICAgIE1NVElNRVJfTkFNRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltbXRpbWVyX2ZlbXRvcGVyaW9kID0gKCh1bnNpZ25lZCBsb25nKTFFMTUgKyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQgLworCQkJICAgICAgIDIpIC8gc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kOworCisJZm9yIChpPTA7IGk8IE5VTV9DT01QQVJBVE9SUypNQVhfQ09NUEFDVF9OT0RFUzsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCZ0aW1lcnNbaV0ubG9jayk7CisJCXRpbWVyc1tpXS50aW1lciA9IE5VTEw7CisJCXRpbWVyc1tpXS5jcHUgPSAwOworCQl0aW1lcnNbaV0uaSA9IGkgJSBOVU1fQ09NUEFSQVRPUlM7CisJCXRhc2tsZXRfaW5pdCgmdGltZXJzW2ldLnRhc2tsZXQsIG1tdGltZXJfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpICh0aW1lcnMraSkpOworCX0KKworCWlmIChyZXF1ZXN0X2lycShTR0lfTU1USU1FUl9WRUNUT1IsIG1tdGltZXJfaW50ZXJydXB0LCBTQV9QRVJDUFVfSVJRLCBNTVRJTUVSX05BTUUsIE5VTEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0LiIsCisJCQlNTVRJTUVSX05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KG1tdGltZXJfbWlzY2Rldi5kZXZmc19uYW1lLCBNTVRJTUVSX05BTUUpOworCWlmIChtaXNjX3JlZ2lzdGVyKCZtbXRpbWVyX21pc2NkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2VcbiIsCisJCSAgICAgICBNTVRJTUVSX05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2dpX2Nsb2NrX3BlcmlvZCA9IHNnaV9jbG9jay5yZXMgPSBOU0VDX1BFUl9TRUMgLyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisJcmVnaXN0ZXJfcG9zaXhfY2xvY2soQ0xPQ0tfU0dJX0NZQ0xFLCAmc2dpX2Nsb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiB2JXMsICVsZCBNSHpcbiIsIE1NVElNRVJfREVTQywgTU1USU1FUl9WRVJTSU9OLAorCSAgICAgICBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQvKHVuc2lnbmVkIGxvbmcpMUU2KTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChtbXRpbWVyX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI0ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21veGEuYwpAQCAtMCwwICsxLDMyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgICAgICAgICAgbW94YS5jICAtLSBNT1hBIEludGVsbGlvIGZhbWlseSBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAwICBNb3hhIFRlY2hub2xvZ2llcyAoc3VwcG9ydEBtb3hhLmNvbS50dykuCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICogICAgICBMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogICAgTU9YQSBJbnRlbGxpbyBTZXJpZXMgRHJpdmVyCisgKiAgICAgIGZvciAgICAgICAgICAgICA6IExJTlVYCisgKiAgICAgIGRhdGUgICAgICAgICAgICA6IDE5OTkvMS83CisgKiAgICAgIHZlcnNpb24gICAgICAgICA6IDUuMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUJCU1PWEFfVkVSU0lPTgkJIjUuMWsiCisKKyNkZWZpbmUgTU9YQU1BSk9SICAgICAgIDE3MgorI2RlZmluZSBNT1hBQ1VNQUpPUiAgICAgMTczCisKKyNkZWZpbmUgcHV0X3RvX3VzZXIoYXJnMSwgYXJnMikgcHV0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIGxvbmcgKilhcmcyKQorI2RlZmluZSBnZXRfZnJvbV91c2VyKGFyZzEsIGFyZzIpIGdldF91c2VyKGFyZzEsICh1bnNpZ25lZCBpbnQgKilhcmcyKQorCisjZGVmaW5lIE1BWF9CT0FSRFMgCQk0CS8qIERvbid0IGNoYW5nZSB0aGlzIHZhbHVlICovCisjZGVmaW5lIE1BWF9QT1JUU19QRVJfQk9BUkQJMzIJLyogRG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUgKi8KKyNkZWZpbmUgTUFYX1BPUlRTIAkJMTI4CS8qIERvbid0IGNoYW5nZSB0aGlzIHZhbHVlICovCisKKy8qCisgKiAgICBEZWZpbmUgdGhlIE1veGEgUENJIHZlbmRvciBhbmQgZGV2aWNlIElEcy4KKyAqLworI2RlZmluZSBNT1hBX0JVU19UWVBFX0lTQQkJMAorI2RlZmluZSBNT1hBX0JVU19UWVBFX1BDSQkJMQorCisjaWZuZGVmCVBDSV9WRU5ET1JfSURfTU9YQQorI2RlZmluZQlQQ0lfVkVORE9SX0lEX01PWEEJMHgxMzkzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DUDIwNEoKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DUDIwNEoJMHgyMDQwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DMjE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQzIxOAkweDIxODAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0MzMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DMzIwCTB4MzIwMAorI2VuZGlmCisKK2VudW0geworCU1PWEFfQk9BUkRfQzIxOF9QQ0kgPSAxLAorCU1PWEFfQk9BUkRfQzIxOF9JU0EsCisJTU9YQV9CT0FSRF9DMzIwX1BDSSwKKwlNT1hBX0JPQVJEX0MzMjBfSVNBLAorCU1PWEFfQk9BUkRfQ1AyMDRKLAorfTsKKworc3RhdGljIGNoYXIgKm1veGFfYnJkbmFtZVtdID0KK3sKKwkiQzIxOCBUdXJibyBQQ0kgc2VyaWVzIiwKKwkiQzIxOCBUdXJibyBJU0Egc2VyaWVzIiwKKwkiQzMyMCBUdXJibyBQQ0kgc2VyaWVzIiwKKwkiQzMyMCBUdXJibyBJU0Egc2VyaWVzIiwKKwkiQ1AtMjA0SiBzZXJpZXMiLAorfTsKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtb3hhX3BjaWJyZHNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9DMjE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAKKwkgIDAsIDAsIE1PWEFfQk9BUkRfQzIxOF9QQ0kgfSwKKwl7IFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9DMzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAKKwkgIDAsIDAsIE1PWEFfQk9BUkRfQzMyMF9QQ0kgfSwKKwl7IFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9DUDIwNEosIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIAorCSAgMCwgMCwgTU9YQV9CT0FSRF9DUDIwNEogfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtb3hhX3BjaWJyZHMpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX21veGFfaXNhX2JvYXJkX2NvbmYgeworCWludCBib2FyZFR5cGU7CisJaW50IG51bVBvcnRzOworCXVuc2lnbmVkIGxvbmcgYmFzZUFkZHI7Cit9IG1veGFfaXNhX2JvYXJkX2NvbmY7CisKK3N0YXRpYyBtb3hhX2lzYV9ib2FyZF9jb25mIG1veGFfaXNhX2JvYXJkc1tdID0KK3sKKy8qICAgICAgIHtNT1hBX0JPQVJEX0MyMThfSVNBLDgsMHhEQzAwMH0sICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfbW94YV9wY2lfZGV2aW5mbyB7CisJdXNob3J0IGJ1c051bTsKKwl1c2hvcnQgZGV2TnVtOworfSBtb3hhX3BjaV9kZXZpbmZvOworCit0eXBlZGVmIHN0cnVjdCBfbW94YV9ib2FyZF9jb25mIHsKKwlpbnQgYm9hcmRUeXBlOworCWludCBudW1Qb3J0czsKKwl1bnNpZ25lZCBsb25nIGJhc2VBZGRyOworCWludCBidXNUeXBlOworCW1veGFfcGNpX2RldmluZm8gcGNpSW5mbzsKK30gbW94YV9ib2FyZF9jb25mOworCitzdGF0aWMgbW94YV9ib2FyZF9jb25mIG1veGFfYm9hcmRzW01BWF9CT0FSRFNdOworc3RhdGljIHZvaWQgX19pb21lbSAqbW94YUJhc2VBZGRyW01BWF9CT0FSRFNdOworCitzdHJ1Y3QgbW94YV9zdHIgeworCWludCB0eXBlOworCWludCBwb3J0OworCWludCBjbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydCBjbG9zaW5nX3dhaXQ7CisJaW50IGNvdW50OworCWludCBibG9ja2VkX29wZW47CisJbG9uZyBldmVudDsgLyogbG9uZyByZXEnZCBmb3Igc2V0X2JpdCAtLVJSICovCisJaW50IGFzeW5jZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBjZmxhZzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY2xvc2Vfd2FpdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHF1ZXVlOworfTsKKworc3RydWN0IG14c2VyX21zdGF0dXMgeworCXRjZmxhZ190IGNmbGFnOworCWludCBjdHM7CisJaW50IGRzcjsKKwlpbnQgcmk7CisJaW50IGRjZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbXN0YXR1cyBHTVN0YXR1c1tNQVhfUE9SVFNdOworCisvKiBzdGF0dXNmbGFncyAqLworI2RlZmluZSBUWFNUT1BQRUQJMHgxCisjZGVmaW5lIExPV1dBSVQgCTB4MgorI2RlZmluZSBFTVBUWVdBSVQJMHg0CisjZGVmaW5lIFRIUk9UVExFCTB4OAorCisvKiBldmVudCAqLworI2RlZmluZSBNT1hBX0VWRU5UX0hBTkdVUAkxCisKKyNkZWZpbmUgU0VSSUFMX0RPX1JFU1RBUlQKKworCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCisKKyNkZWZpbmUgV0FLRVVQX0NIQVJTCQkyNTYKKworI2RlZmluZSBQT1JUTk8oeCkJCSgoeCktPmluZGV4KQorCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCB0dHltYWpvciA9IE1PWEFNQUpPUjsKKy8qIFZhcmlhYmxlcyBmb3IgaW5zbW9kICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IGJhc2VhZGRyW10gCT0gCXswLCAwLCAwLCAwfTsKK3N0YXRpYyBpbnQgdHlwZVtdCT0JezAsIDAsIDAsIDB9Oworc3RhdGljIGludCBudW1wb3J0c1tdIAk9CXswLCAwLCAwLCAwfTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJXaWxsaWFtIENoZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTU9YQSBJbnRlbGxpbyBGYW1pbHkgTXVsdGlwb3J0IEJvYXJkIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9wYXJhbV9hcnJheSh0eXBlLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2VhZGRyLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG51bXBvcnRzLCBpbnQsIE5VTEwsIDApOworI2VuZGlmCittb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odmVyYm9zZSwgYm9vbCwgMDY0NCk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbW94YURyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgbW94YV9zdHIgbW94YUNoYW5uZWxzW01BWF9QT1JUU107CitzdGF0aWMgdW5zaWduZWQgY2hhciAqbW94YVhtaXRCdWZmOworc3RhdGljIGludCBtb3hhVGltZXJfb247CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbW94YVRpbWVyOworc3RhdGljIGludCBtb3hhRW1wdHlUaW1lcl9vbltNQVhfUE9SVFNdOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1veGFFbXB0eVRpbWVyW01BWF9QT1JUU107CitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBtb3hhQnVmZlNlbTsKKworLyoKKyAqIHN0YXRpYyBmdW5jdGlvbnM6CisgKi8KK3N0YXRpYyB2b2lkIGRvX21veGFfc29mdGludCh2b2lkICopOworc3RhdGljIGludCBtb3hhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBtb3hhX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBtb3hhX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgbW94YV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG1veGFfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IG1veGFfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIG1veGFfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgbW94YV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGludCBtb3hhX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgbW94YV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOworc3RhdGljIHZvaWQgbW94YV9wb2xsKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2V0X3R0eV9wYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgYmxvY2tfdGlsbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorCQkJICAgIHN0cnVjdCBtb3hhX3N0ciAqKTsKK3N0YXRpYyB2b2lkIHNldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgY2hlY2tfeG1pdF9lbXB0eSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHNodXRfZG93bihzdHJ1Y3QgbW94YV9zdHIgKik7CitzdGF0aWMgdm9pZCByZWNlaXZlX2RhdGEoc3RydWN0IG1veGFfc3RyICopOworLyoKKyAqIG1veGEgYm9hcmQgaW50ZXJmYWNlIGZ1bmN0aW9uczoKKyAqLworc3RhdGljIHZvaWQgTW94YURyaXZlckluaXQodm9pZCk7CitzdGF0aWMgaW50IE1veGFEcml2ZXJJb2N0bCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsIGludCk7CitzdGF0aWMgaW50IE1veGFEcml2ZXJQb2xsKHZvaWQpOworc3RhdGljIGludCBNb3hhUG9ydHNPZkNhcmQoaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRJc1ZhbGlkKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydEVuYWJsZShpbnQpOworc3RhdGljIHZvaWQgTW94YVBvcnREaXNhYmxlKGludCk7CitzdGF0aWMgbG9uZyBNb3hhUG9ydEdldE1heEJhdWQoaW50KTsKK3N0YXRpYyBsb25nIE1veGFQb3J0U2V0QmF1ZChpbnQsIGxvbmcpOworc3RhdGljIGludCBNb3hhUG9ydFNldFRlcm1pbyhpbnQsIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIGludCBNb3hhUG9ydEdldExpbmVPdXQoaW50LCBpbnQgKiwgaW50ICopOworc3RhdGljIHZvaWQgTW94YVBvcnRMaW5lQ3RybChpbnQsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE1veGFQb3J0Rmxvd0N0cmwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0TGluZVN0YXR1cyhpbnQpOworc3RhdGljIGludCBNb3hhUG9ydERDRENoYW5nZShpbnQpOworc3RhdGljIGludCBNb3hhUG9ydERDRE9OKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydEZsdXNoRGF0YShpbnQsIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0V3JpdGVEYXRhKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFJlYWREYXRhKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFR4UXVldWUoaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRSeFF1ZXVlKGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0VHhGcmVlKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydFR4RGlzYWJsZShpbnQpOworc3RhdGljIHZvaWQgTW94YVBvcnRUeEVuYWJsZShpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFJlc2V0QnJrQ250KGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydFNlbmRCcmVhayhpbnQsIGludCk7CitzdGF0aWMgaW50IG1veGFfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtb3hhX3N0ciAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CitzdGF0aWMgaW50IG1veGFfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtb3hhX3N0ciAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CitzdGF0aWMgdm9pZCBNb3hhU2V0RmlmbyhpbnQgcG9ydCwgaW50IGVuYWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbW94YV9vcHMgPSB7CisJLm9wZW4gPSBtb3hhX29wZW4sCisJLmNsb3NlID0gbW94YV9jbG9zZSwKKwkud3JpdGUgPSBtb3hhX3dyaXRlLAorCS53cml0ZV9yb29tID0gbW94YV93cml0ZV9yb29tLAorCS5mbHVzaF9idWZmZXIgPSBtb3hhX2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbW94YV9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2NoYXJzID0gbW94YV9mbHVzaF9jaGFycywKKwkucHV0X2NoYXIgPSBtb3hhX3B1dF9jaGFyLAorCS5pb2N0bCA9IG1veGFfaW9jdGwsCisJLnRocm90dGxlID0gbW94YV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IG1veGFfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBtb3hhX3NldF90ZXJtaW9zLAorCS5zdG9wID0gbW94YV9zdG9wLAorCS5zdGFydCA9IG1veGFfc3RhcnQsCisJLmhhbmd1cCA9IG1veGFfaGFuZ3VwLAorCS50aW9jbWdldCA9IG1veGFfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gbW94YV90aW9jbXNldCwKK307CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IG1veGFfZ2V0X1BDSV9jb25mKHN0cnVjdCBwY2lfZGV2ICpwLCBpbnQgYm9hcmRfdHlwZSwgbW94YV9ib2FyZF9jb25mICogYm9hcmQpCit7CisJYm9hcmQtPmJhc2VBZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwLCAyKTsKKwlib2FyZC0+Ym9hcmRUeXBlID0gYm9hcmRfdHlwZTsKKwlzd2l0Y2ggKGJvYXJkX3R5cGUpIHsKKwljYXNlIE1PWEFfQk9BUkRfQzIxOF9JU0E6CisJY2FzZSBNT1hBX0JPQVJEX0MyMThfUENJOgorCQlib2FyZC0+bnVtUG9ydHMgPSA4OworCQlicmVhazsKKworCWNhc2UgTU9YQV9CT0FSRF9DUDIwNEo6CisJCWJvYXJkLT5udW1Qb3J0cyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJvYXJkLT5udW1Qb3J0cyA9IDA7CisJCWJyZWFrOworCX0KKwlib2FyZC0+YnVzVHlwZSA9IE1PWEFfQlVTX1RZUEVfUENJOworCWJvYXJkLT5wY2lJbmZvLmJ1c051bSA9IHAtPmJ1cy0+bnVtYmVyOworCWJvYXJkLT5wY2lJbmZvLmRldk51bSA9IHAtPmRldmZuID4+IDM7CisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworc3RhdGljIGludCBfX2luaXQgbW94YV9pbml0KHZvaWQpCit7CisJaW50IGksIG51bUJvYXJkczsKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTU9YQSBJbnRlbGxpbyBmYW1pbHkgZHJpdmVyIHZlcnNpb24gJXNcbiIsIE1PWEFfVkVSU0lPTik7CisJbW94YURyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX1BPUlRTICsgMSk7CisJaWYgKCFtb3hhRHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfTVVURVgoJm1veGFCdWZmU2VtKTsKKwltb3hhRHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCW1veGFEcml2ZXItPm5hbWUgPSAidHR5YSI7CisJbW94YURyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvYSI7CisJbW94YURyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKKwltb3hhRHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJbW94YURyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJbW94YURyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJbW94YURyaXZlci0+aW5pdF90ZXJtaW9zLmNfaWZsYWcgPSAwOworCW1veGFEcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBDTE9DQUwgfCBIVVBDTDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJbW94YURyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhtb3hhRHJpdmVyLCAmbW94YV9vcHMpOworCisJbW94YVhtaXRCdWZmID0gTlVMTDsKKworCWZvciAoaSA9IDAsIGNoID0gbW94YUNoYW5uZWxzOyBpIDwgTUFYX1BPUlRTOyBpKyssIGNoKyspIHsKKwkJY2gtPnR5cGUgPSBQT1JUXzE2NTUwQTsKKwkJY2gtPnBvcnQgPSBpOworCQlJTklUX1dPUksoJmNoLT50cXVldWUsIGRvX21veGFfc29mdGludCwgY2gpOworCQljaC0+dHR5ID0gTlVMTDsKKwkJY2gtPmNsb3NlX2RlbGF5ID0gNSAqIEhaIC8gMTA7CisJCWNoLT5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOworCQljaC0+Y291bnQgPSAwOworCQljaC0+YmxvY2tlZF9vcGVuID0gMDsKKwkJY2gtPmNmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IENMT0NBTCB8IEhVUENMOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNsb3NlX3dhaXQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKKwkJbW94YV9ib2FyZHNbaV0uYm9hcmRUeXBlID0gMDsKKwkJbW94YV9ib2FyZHNbaV0ubnVtUG9ydHMgPSAwOworCQltb3hhX2JvYXJkc1tpXS5iYXNlQWRkciA9IDA7CisJCW1veGFfYm9hcmRzW2ldLmJ1c1R5cGUgPSAwOworCQltb3hhX2JvYXJkc1tpXS5wY2lJbmZvLmJ1c051bSA9IDA7CisJCW1veGFfYm9hcmRzW2ldLnBjaUluZm8uZGV2TnVtID0gMDsKKwl9CisJTW94YURyaXZlckluaXQoKTsKKwlwcmludGsoIlR0eSBkZXZpY2VzIG1ham9yIG51bWJlciA9ICVkXG4iLCB0dHltYWpvcik7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihtb3hhRHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGluc3RhbGwgTU9YQSBTbWFydGlvIGZhbWlseSBkcml2ZXIgIVxuIik7CisJCXB1dF90dHlfZHJpdmVyKG1veGFEcml2ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykgeworCQlpbml0X3RpbWVyKCZtb3hhRW1wdHlUaW1lcltpXSk7CisJCW1veGFFbXB0eVRpbWVyW2ldLmZ1bmN0aW9uID0gY2hlY2tfeG1pdF9lbXB0eTsKKwkJbW94YUVtcHR5VGltZXJbaV0uZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmIG1veGFDaGFubmVsc1tpXTsKKwkJbW94YUVtcHR5VGltZXJfb25baV0gPSAwOworCX0KKworCWluaXRfdGltZXIoJm1veGFUaW1lcik7CisJbW94YVRpbWVyLmZ1bmN0aW9uID0gbW94YV9wb2xsOworCW1veGFUaW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDUwKTsKKwltb3hhVGltZXJfb24gPSAxOworCWFkZF90aW1lcigmbW94YVRpbWVyKTsKKworCS8qIEZpbmQgdGhlIGJvYXJkcyBkZWZpbmVkIGluIHNvdXJjZSBjb2RlICovCisJbnVtQm9hcmRzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEUzsgaSsrKSB7CisJCWlmICgobW94YV9pc2FfYm9hcmRzW2ldLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MyMThfSVNBKSB8fAorCQkgKG1veGFfaXNhX2JvYXJkc1tpXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX0lTQSkpIHsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYm9hcmRUeXBlID0gbW94YV9pc2FfYm9hcmRzW2ldLmJvYXJkVHlwZTsKKwkJCWlmIChtb3hhX2lzYV9ib2FyZHNbaV0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzIxOF9JU0EpCisJCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5udW1Qb3J0cyA9IDg7CisJCQllbHNlCisJCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5udW1Qb3J0cyA9IG1veGFfaXNhX2JvYXJkc1tpXS5udW1Qb3J0czsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYnVzVHlwZSA9IE1PWEFfQlVTX1RZUEVfSVNBOworCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5iYXNlQWRkciA9IG1veGFfaXNhX2JvYXJkc1tpXS5iYXNlQWRkcjsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50aygiQm9hcmQgJTJkOiAlcyBib2FyZChiYXNlQWRkcj0lbHgpXG4iLAorCQkJCSAgICAgICBudW1Cb2FyZHMgKyAxLAorCQkJCSAgICAgICBtb3hhX2JyZG5hbWVbbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5ib2FyZFR5cGUgLSAxXSwKKwkJCQkgICAgICAgbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5iYXNlQWRkcik7CisJCQludW1Cb2FyZHMrKzsKKwkJfQorCX0KKwkvKiBGaW5kIHRoZSBib2FyZHMgZGVmaW5lZCBmb3JtIG1vZHVsZSBhcmdzLiAqLworI2lmZGVmIE1PRFVMRQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKKwkJaWYgKCh0eXBlW2ldID09IE1PWEFfQk9BUkRfQzIxOF9JU0EpIHx8CisJCSAgICAodHlwZVtpXSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRrKCJCb2FyZCAlMmQ6ICVzIGJvYXJkKGJhc2VBZGRyPSVseClcbiIsCisJCQkJICAgICAgIG51bUJvYXJkcyArIDEsCisJCQkJICAgICAgIG1veGFfYnJkbmFtZVt0eXBlW2ldIC0gMV0sCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBiYXNlYWRkcltpXSk7CisJCQlpZiAobnVtQm9hcmRzID49IE1BWF9CT0FSRFMpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJpbnRrKCJNb3JlIHRoYW4gJWQgTU9YQSBJbnRlbGxpbyBmYW1pbHkgYm9hcmRzIGZvdW5kLiBCb2FyZCBpcyBpZ25vcmVkLiIsIE1BWF9CT0FSRFMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5ib2FyZFR5cGUgPSB0eXBlW2ldOworCQkJaWYgKG1veGFfaXNhX2JvYXJkc1tpXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMjE4X0lTQSkKKwkJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLm51bVBvcnRzID0gODsKKwkJCWVsc2UKKwkJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLm51bVBvcnRzID0gbnVtcG9ydHNbaV07CisJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLmJ1c1R5cGUgPSBNT1hBX0JVU19UWVBFX0lTQTsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYmFzZUFkZHIgPSBiYXNlYWRkcltpXTsKKwkJCW51bUJvYXJkcysrOworCQl9CisJfQorI2VuZGlmCisJLyogRmluZCBQQ0kgYm9hcmRzIGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJeworCQlzdHJ1Y3QgcGNpX2RldiAqcCA9IE5VTEw7CisJCWludCBuID0gKHNpemVvZihtb3hhX3BjaWJyZHMpIC8gc2l6ZW9mKG1veGFfcGNpYnJkc1swXSkpIC0gMTsKKwkJaSA9IDA7CisJCXdoaWxlIChpIDwgbikgeworCQkJd2hpbGUgKChwID0gcGNpX2ZpbmRfZGV2aWNlKG1veGFfcGNpYnJkc1tpXS52ZW5kb3IsIG1veGFfcGNpYnJkc1tpXS5kZXZpY2UsIHApKSE9TlVMTCkKKwkJCXsKKwkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocCkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChudW1Cb2FyZHMgPj0gTUFYX0JPQVJEUykgeworCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCXByaW50aygiTW9yZSB0aGFuICVkIE1PWEEgSW50ZWxsaW8gZmFtaWx5IGJvYXJkcyBmb3VuZC4gQm9hcmQgaXMgaWdub3JlZC4iLCBNQVhfQk9BUkRTKTsKKwkJCQl9IGVsc2UgeworCQkJCQltb3hhX2dldF9QQ0lfY29uZihwLCBtb3hhX3BjaWJyZHNbaV0uZHJpdmVyX2RhdGEsCisJCQkJCQkmbW94YV9ib2FyZHNbbnVtQm9hcmRzXSk7CisJCQkJCW51bUJvYXJkcysrOworCQkJCX0KKwkJCX0KKwkJCWkrKzsKKwkJfQorCX0KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBudW1Cb2FyZHM7IGkrKykgeworCQltb3hhQmFzZUFkZHJbaV0gPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBtb3hhX2JvYXJkc1tpXS5iYXNlQWRkciwgMHg0MDAwKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbW94YV9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKCJVbmxvYWRpbmcgbW9kdWxlIG1veGEgLi4uXG4iKTsKKworCWlmIChtb3hhVGltZXJfb24pCisJCWRlbF90aW1lcigmbW94YVRpbWVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykKKwkJaWYgKG1veGFFbXB0eVRpbWVyX29uW2ldKQorCQkJZGVsX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltpXSk7CisKKwlpZiAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKG1veGFEcml2ZXIpKQorCQlwcmludGsoIkNvdWxkbid0IHVucmVnaXN0ZXIgTU9YQSBJbnRlbGxpbyBmYW1pbHkgc2VyaWFsIGRyaXZlclxuIik7CisJcHV0X3R0eV9kcml2ZXIobW94YURyaXZlcik7CisJaWYgKHZlcmJvc2UpCisJCXByaW50aygiRG9uZVxuIik7Cit9CisKK21vZHVsZV9pbml0KG1veGFfaW5pdCk7Cittb2R1bGVfZXhpdChtb3hhX2V4aXQpOworCitzdGF0aWMgdm9pZCBkb19tb3hhX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCWlmIChjaCAmJiAodHR5ID0gY2gtPnR0eSkpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNT1hBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCkpIHsKKwkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CisJCQljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtb3hhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlpbnQgcG9ydDsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAocG9ydCA9PSBNQVhfUE9SVFMpIHsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKCFNb3hhUG9ydElzVmFsaWQocG9ydCkpIHsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCWRvd24oJm1veGFCdWZmU2VtKTsKKwlpZiAoIW1veGFYbWl0QnVmZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXVwKCZtb3hhQnVmZlNlbSk7CisJCQlyZXR1cm4gKC1FTk9NRU0pOworCQl9CisJCS8qIFRoaXMgdGVzdCBpcyBndWFyZGVkIGJ5IHRoZSBCdWZmU2VtIHNvIG5vIGxvbmdlciBuZWVkZWQKKwkJICAgZGVsZXRlIG1lIGluIDIuNSAqLworCQlpZiAobW94YVhtaXRCdWZmKQorCQkJZnJlZV9wYWdlKHBhZ2UpOworCQllbHNlCisJCQltb3hhWG1pdEJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCX0KKwl1cCgmbW94YUJ1ZmZTZW0pOworCisJY2ggPSAmbW94YUNoYW5uZWxzW3BvcnRdOworCWNoLT5jb3VudCsrOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBjaDsKKwljaC0+dHR5ID0gdHR5OworCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCWNoLT5zdGF0dXNmbGFncyA9IDA7CisJCXNldF90dHlfcGFyYW0odHR5KTsKKwkJTW94YVBvcnRMaW5lQ3RybChjaC0+cG9ydCwgMSwgMSk7CisJCU1veGFQb3J0RW5hYmxlKGNoLT5wb3J0KTsKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJfQorCXJldHZhbCA9IGJsb2NrX3RpbGxfcmVhZHkodHR5LCBmaWxwLCBjaCk7CisKKwltb3hhX3VudGhyb3R0bGUodHR5KTsKKworCWlmIChjaC0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgeworCQlNb3hhU2V0RmlmbyhjaC0+cG9ydCwgMSk7CisJfSBlbHNlIHsKKwkJTW94YVNldEZpZm8oY2gtPnBvcnQsIDApOworCX0KKworCXJldHVybiAocmV0dmFsKTsKK30KKworc3RhdGljIHZvaWQgbW94YV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCWludCBwb3J0OworCisJcG9ydCA9IFBPUlROTyh0dHkpOworCWlmIChwb3J0ID09IE1BWF9QT1JUUykgeworCQlyZXR1cm47CisJfQorCWlmICghTW94YVBvcnRJc1ZhbGlkKHBvcnQpKSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NMT1NFCisJCXByaW50aygiSW52YWxpZCBwb3J0bm8gaW4gbW94YV9jbG9zZVxuIik7CisjZW5kaWYKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJaWYgKHR0eS0+ZHJpdmVyX2RhdGEgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXJldHVybjsKKwl9CisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGNoLT5jb3VudCAhPSAxKSkgeworCQlwcmludGsoIm1veGFfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiY2gtPmNvdW50IGlzICVkXG4iLCBjaC0+Y291bnQpOworCQljaC0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1jaC0+Y291bnQgPCAwKSB7CisJCXByaW50aygibW94YV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50LCBkZXZpY2U9JXNcbiIsCisJCSAgICAgICB0dHktPm5hbWUpOworCQljaC0+Y291bnQgPSAwOworCX0KKwlpZiAoY2gtPmNvdW50KSB7CisJCXJldHVybjsKKwl9CisJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKworCWNoLT5jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlzZXR1cF9lbXB0eV9ldmVudCh0dHkpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMzAgKiBIWik7CS8qIDMwIHNlY29uZHMgdGltZW91dCAqLworCQltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAwOworCQlkZWxfdGltZXIoJm1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XSk7CisJfQorCXNodXRfZG93bihjaCk7CisJTW94YVBvcnRGbHVzaERhdGEocG9ydCwgMik7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQkJCisJdHR5LT5jbG9zaW5nID0gMDsKKwljaC0+ZXZlbnQgPSAwOworCWNoLT50dHkgPSBOVUxMOworCWlmIChjaC0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChjaC0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2gtPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKwl9CisJY2gtPmFzeW5jZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2xvc2Vfd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCWludCBsZW4sIHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCXBvcnQgPSBjaC0+cG9ydDsKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlsZW4gPSBNb3hhUG9ydFdyaXRlRGF0YShwb3J0LCAodW5zaWduZWQgY2hhciAqKSBidWYsIGNvdW50KTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlpZiAoICEoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgJiYKKwkgICAgICgobGVuICE9IGNvdW50KSB8fCAoTW94YVBvcnRUeEZyZWUocG9ydCkgPD0gMTAwKSkgKQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKKwlyZXR1cm4gKGxlbik7Cit9CisKK3N0YXRpYyBpbnQgbW94YV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKworCWlmICh0dHktPnN0b3BwZWQpCisJCXJldHVybiAoMCk7CisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChNb3hhUG9ydFR4RnJlZShjaC0+cG9ydCkpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCU1veGFQb3J0Rmx1c2hEYXRhKGNoLT5wb3J0LCAxKTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyBpbnQgbW94YV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgY2hhcnM7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCS8qCisJICogU2lnaC4uLkkgaGF2ZSB0byBjaGVjayBpZiBkcml2ZXJfZGF0YSBpcyBOVUxMIGhlcmUsIGJlY2F1c2UKKwkgKiBpZiBhbiBvcGVuKCkgZmFpbHMsIHRoZSBUVFkgc3Vic3lzdGVtIGV2ZW50dWFsbHkgY2FsbHMKKwkgKiB0dHlfd2FpdF91bnRpbF9zZW50KCksIHdoaWNoIGNhbGxzIHRoZSBkcml2ZXIncyBjaGFyc19pbl9idWZmZXIoKQorCSAqIHJvdXRpbmUuICBBbmQgc2luY2UgdGhlIG9wZW4oKSBmYWlsZWQsIHdlIHJldHVybiAwIGhlcmUuICBUREoKKwkgKi8KKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwljaGFycyA9IE1veGFQb3J0VHhRdWV1ZShjaC0+cG9ydCk7CisJaWYgKGNoYXJzKSB7CisJCS8qCisJCSAqIE1ha2UgaXQgcG9zc2libGUgdG8gd2FrZXVwIGFueXRoaW5nIHdhaXRpbmcgZm9yIG91dHB1dAorCQkgKiBpbiB0dHlfaW9jdGwuYywgZXRjLgorCQkgKi8KKwkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSk7CisJfQorCXJldHVybiAoY2hhcnMpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLyoKKwkgKiBEb24ndCB0aGluayBJIG5lZWQgdGhpcywgYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCB0byBlbXB0eSB0aGUgVFgKKwkgKiBidWZmZXIgZm9yIHRoZSAxNjQ1MCwgMTY1NTAsIGV0Yy4KKwkgKi8KK30KKworc3RhdGljIHZvaWQgbW94YV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlpbnQgcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybjsKKwlwb3J0ID0gY2gtPnBvcnQ7CisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJbW94YVhtaXRCdWZmWzBdID0gYzsKKwlNb3hhUG9ydFdyaXRlRGF0YShwb3J0LCBtb3hhWG1pdEJ1ZmYsIDEpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlpZiAoICEoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgJiYgKE1veGFQb3J0VHhGcmVlKHBvcnQpIDw9IDEwMCkgKQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7Cit9CisKK3N0YXRpYyBpbnQgbW94YV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCBwb3J0OworCWludCBmbGFnID0gMCwgZHRyLCBydHM7CisKKwlwb3J0ID0gUE9SVE5PKHR0eSk7CisJaWYgKChwb3J0ICE9IE1BWF9QT1JUUykgJiYgKCFjaCkpCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwlNb3hhUG9ydEdldExpbmVPdXQoY2gtPnBvcnQsICZkdHIsICZydHMpOworCWlmIChkdHIpCisJCWZsYWcgfD0gVElPQ01fRFRSOworCWlmIChydHMpCisJCWZsYWcgfD0gVElPQ01fUlRTOworCWR0ciA9IE1veGFQb3J0TGluZVN0YXR1cyhjaC0+cG9ydCk7CisJaWYgKGR0ciAmIDEpCisJCWZsYWcgfD0gVElPQ01fQ1RTOworCWlmIChkdHIgJiAyKQorCQlmbGFnIHw9IFRJT0NNX0RTUjsKKwlpZiAoZHRyICYgNCkKKwkJZmxhZyB8PSBUSU9DTV9DRDsKKwlyZXR1cm4gZmxhZzsKK30KKworc3RhdGljIGludCBtb3hhX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCBwb3J0OworCWludCBkdHIsIHJ0czsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAoKHBvcnQgIT0gTUFYX1BPUlRTKSAmJiAoIWNoKSkKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCU1veGFQb3J0R2V0TGluZU91dChjaC0+cG9ydCwgJmR0ciwgJnJ0cyk7CisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcnRzID0gMTsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlkdHIgPSAxOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcnRzID0gMDsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDA7CisJTW94YVBvcnRMaW5lQ3RybChjaC0+cG9ydCwgZHRyLCBydHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1veGFfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcmVnaXN0ZXIgaW50IHBvcnQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAoKHBvcnQgIT0gTUFYX1BPUlRTKSAmJiAoIWNoKSkKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUQ1NCUks6CQkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQlzZXR1cF9lbXB0eV9ldmVudCh0dHkpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCWlmICghYXJnKQorCQkJTW94YVBvcnRTZW5kQnJlYWsoY2gtPnBvcnQsIDApOworCQlyZXR1cm4gKDApOworCWNhc2UgVENTQlJLUDoJCS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQlzZXR1cF9lbXB0eV9ldmVudCh0dHkpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCU1veGFQb3J0U2VuZEJyZWFrKGNoLT5wb3J0LCBhcmcpOworCQlyZXR1cm4gKDApOworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCk7CisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCWlmKGdldF91c2VyKHJldHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWFyZyA9IHJldHZhbDsKKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJCSAoYXJnID8gQ0xPQ0FMIDogMCkpOworCQlpZiAoQ19DTE9DQUwodHR5KSkKKwkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwkJZWxzZQorCQkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJCXJldHVybiAoMCk7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmV0dXJuIG1veGFfZ2V0X3NlcmlhbF9pbmZvKGNoLCBhcmdwKTsKKworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJldHVybiBtb3hhX3NldF9zZXJpYWxfaW5mbyhjaCwgYXJncCk7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gTW94YURyaXZlcklvY3RsKGNtZCwgYXJnLCBwb3J0KTsKKwl9CisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWNoLT5zdGF0dXNmbGFncyB8PSBUSFJPVFRMRTsKK30KKworc3RhdGljIHZvaWQgbW94YV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWNoLT5zdGF0dXNmbGFncyAmPSB+VEhST1RUTEU7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCXNldF90dHlfcGFyYW0odHR5KTsKKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgJiYKKwkgICAgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCU1veGFQb3J0VHhEaXNhYmxlKGNoLT5wb3J0KTsKKwljaC0+c3RhdHVzZmxhZ3MgfD0gVFhTVE9QUEVEOworfQorCisKK3N0YXRpYyB2b2lkIG1veGFfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICghKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkpCisJCXJldHVybjsKKworCU1veGFQb3J0VHhFbmFibGUoY2gtPnBvcnQpOworCWNoLT5zdGF0dXNmbGFncyAmPSB+VFhTVE9QUEVEOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwltb3hhX2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRfZG93bihjaCk7CisJY2gtPmV2ZW50ID0gMDsKKwljaC0+Y291bnQgPSAwOworCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCWNoLT50dHkgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfcG9sbCh1bnNpZ25lZCBsb25nIGlnbm9yZWQpCit7CisJcmVnaXN0ZXIgaW50IGNhcmQ7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHA7CisJaW50IGksIHBvcnRzOworCisJbW94YVRpbWVyX29uID0gMDsKKwlkZWxfdGltZXIoJm1veGFUaW1lcik7CisKKwlpZiAoTW94YURyaXZlclBvbGwoKSA8IDApIHsKKwkJbW94YVRpbWVyLmZ1bmN0aW9uID0gbW94YV9wb2xsOworCQltb3hhVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyA1MCk7CisJCW1veGFUaW1lcl9vbiA9IDE7CisJCWFkZF90aW1lcigmbW94YVRpbWVyKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTUFYX0JPQVJEUzsgY2FyZCsrKSB7CisJCWlmICgocG9ydHMgPSBNb3hhUG9ydHNPZkNhcmQoY2FyZCkpIDw9IDApCisJCQljb250aW51ZTsKKwkJY2ggPSAmbW94YUNoYW5uZWxzW2NhcmQgKiBNQVhfUE9SVFNfUEVSX0JPQVJEXTsKKwkJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyssIGNoKyspIHsKKwkJCWlmICgoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghKGNoLT5zdGF0dXNmbGFncyAmIFRIUk9UVExFKSAmJgorCQkJICAgIChNb3hhUG9ydFJ4UXVldWUoY2gtPnBvcnQpID4gMCkpCisJCQkJcmVjZWl2ZV9kYXRhKGNoKTsKKwkJCWlmICgodHAgPSBjaC0+dHR5KSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpIHsKKwkJCQlpZiAoTW94YVBvcnRUeFF1ZXVlKGNoLT5wb3J0KSA8PSBXQUtFVVBfQ0hBUlMpIHsKKwkJCQkJaWYgKCF0cC0+c3RvcHBlZCkgeworCQkJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5MT1dXQUlUOworCQkJCQkJdHR5X3dha2V1cCh0cCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIUlfSUdOQlJLKHRwKSAmJiAoTW94YVBvcnRSZXNldEJya0NudChjaC0+cG9ydCkgPiAwKSkgeworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHRwLCAwLCBUVFlfQlJFQUspOworCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHRwKTsKKwkJCX0KKwkJCWlmIChNb3hhUG9ydERDRENoYW5nZShjaC0+cG9ydCkpIHsKKwkJCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQkJCQlpZiAoTW94YVBvcnREQ0RPTihjaC0+cG9ydCkpCisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCQkJCQllbHNlIHsKKwkJCQkJCXNldF9iaXQoTU9YQV9FVkVOVF9IQU5HVVAsICZjaC0+ZXZlbnQpOworCQkJCQkJc2NoZWR1bGVfd29yaygmY2gtPnRxdWV1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwltb3hhVGltZXIuZnVuY3Rpb24gPSBtb3hhX3BvbGw7CisJbW94YVRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gNTApOworCW1veGFUaW1lcl9vbiA9IDE7CisJYWRkX3RpbWVyKCZtb3hhVGltZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzZXRfdHR5X3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmVnaXN0ZXIgc3RydWN0IHRlcm1pb3MgKnRzOworCXN0cnVjdCBtb3hhX3N0ciAqY2g7CisJaW50IHJ0cywgY3RzLCB0eGZsb3csIHJ4ZmxvdywgeGFueTsKKworCWNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCXRzID0gdHR5LT50ZXJtaW9zOworCWlmICh0cy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJcnRzID0gY3RzID0gdHhmbG93ID0gcnhmbG93ID0geGFueSA9IDA7CisJaWYgKHRzLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJcnRzID0gY3RzID0gMTsKKwlpZiAodHMtPmNfaWZsYWcgJiBJWE9OKQorCQl0eGZsb3cgPSAxOworCWlmICh0cy0+Y19pZmxhZyAmIElYT0ZGKQorCQlyeGZsb3cgPSAxOworCWlmICh0cy0+Y19pZmxhZyAmIElYQU5ZKQorCQl4YW55ID0gMTsKKwlNb3hhUG9ydEZsb3dDdHJsKGNoLT5wb3J0LCBydHMsIGN0cywgdHhmbG93LCByeGZsb3csIHhhbnkpOworCU1veGFQb3J0U2V0VGVybWlvKGNoLT5wb3J0LCB0cyk7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfdGlsbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICBzdHJ1Y3QgbW94YV9zdHIgKmNoKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCWludCBkb19jbG9jYWwgPSBDX0NMT0NBTCh0dHkpOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNoLT5jbG9zZV93YWl0KTsKKyNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAorCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuICgtRUFHQUlOKTsKKwkJZWxzZQorCQkJcmV0dXJuICgtRVJFU1RBUlRTWVMpOworI2Vsc2UKKwkJcmV0dXJuICgtRUFHQUlOKTsKKyNlbmRpZgorCX0KKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udAorCSAqIGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUgZnJlZQorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBjaC0+bGluZSwgY2gtPmNvdW50KTsKKyNlbmRpZgorCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJY2gtPmNvdW50LS07CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJY2gtPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisjaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKKwkJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisjZWxzZQorCQkJcmV0dmFsID0gLUVBR0FJTjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJiAoZG9fY2xvY2FsIHx8CisJCQkJCQlNb3hhUG9ydERDRE9OKGNoLT5wb3J0KSkpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWNoLT5jb3VudCsrOworCWNoLT5ibG9ja2VkX29wZW4tLTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIGNoLT5saW5lLCBjaC0+Y291bnQpOworI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJY2gtPnN0YXR1c2ZsYWdzIHw9IEVNUFRZV0FJVDsKKwltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAwOworCWRlbF90aW1lcigmbW94YUVtcHR5VGltZXJbY2gtPnBvcnRdKTsKKwltb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0uZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAxOworCWFkZF90aW1lcigmbW94YUVtcHR5VGltZXJbY2gtPnBvcnRdKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfeG1pdF9lbXB0eSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKworCWNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSBkYXRhOworCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDA7CisJZGVsX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOworCWlmIChjaC0+dHR5ICYmIChjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpKSB7CisJCWlmIChNb3hhUG9ydFR4UXVldWUoY2gtPnBvcnQpID09IDApIHsKKwkJCWNoLT5zdGF0dXNmbGFncyAmPSB+RU1QVFlXQUlUOworCQkJdHR5X3dha2V1cChjaC0+dHR5KTsKKwkJCXJldHVybjsKKwkJfQorCQltb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0uZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJbW94YUVtcHR5VGltZXJfb25bY2gtPnBvcnRdID0gMTsKKwkJYWRkX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOworCX0gZWxzZQorCQljaC0+c3RhdHVzZmxhZ3MgJj0gfkVNUFRZV0FJVDsKK30KKworc3RhdGljIHZvaWQgc2h1dF9kb3duKHN0cnVjdCBtb3hhX3N0ciAqY2gpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRwOworCisJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworCXRwID0gY2gtPnR0eTsKKworCU1veGFQb3J0RGlzYWJsZShjaC0+cG9ydCk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGEgbW9kZW0gY29udHJvbCBkZXZpY2UgYW5kIEhVUENMIGlzIG9uLCBkcm9wIFJUUyAmIERUUi4KKwkgKi8KKwlpZiAodHAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKKwkJTW94YVBvcnRMaW5lQ3RybChjaC0+cG9ydCwgMCwgMCk7CisKKwljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VpdmVfZGF0YShzdHJ1Y3QgbW94YV9zdHIgKmNoKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKKwlzdHJ1Y3QgdGVybWlvcyAqdHM7CisJaW50IGksIGNvdW50LCByYywgc3BhY2U7CisJdW5zaWduZWQgY2hhciAqY2hhcnB0ciwgKmZsYWdwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRzID0gTlVMTDsKKwl0cCA9IGNoLT50dHk7CisJaWYgKHRwKQorCQl0cyA9IHRwLT50ZXJtaW9zOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWlmICggIXRwIHx8ICF0cyB8fCAhKHRzLT5jX2NmbGFnICYgQ1JFQUQpICkgeworCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmICghdHAgfHwgIXRzKSB7CisJCU1veGFQb3J0Rmx1c2hEYXRhKGNoLT5wb3J0LCAwKTsKKwkJcmV0dXJuOworCX0KKwlzcGFjZSA9IFRUWV9GTElQQlVGX1NJWkUgLSB0cC0+ZmxpcC5jb3VudDsKKwlpZiAoc3BhY2UgPD0gMCkKKwkJcmV0dXJuOworCWNoYXJwdHIgPSB0cC0+ZmxpcC5jaGFyX2J1Zl9wdHI7CisJZmxhZ3B0ciA9IHRwLT5mbGlwLmZsYWdfYnVmX3B0cjsKKwlyYyA9IHRwLT5mbGlwLmNvdW50OworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWNvdW50ID0gTW94YVBvcnRSZWFkRGF0YShjaC0+cG9ydCwgY2hhcnB0ciwgc3BhY2UpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkqZmxhZ3B0cisrID0gMDsKKwljaGFycHRyICs9IGNvdW50OworCXJjICs9IGNvdW50OworCXRwLT5mbGlwLmNvdW50ID0gcmM7CisJdHAtPmZsaXAuY2hhcl9idWZfcHRyID0gY2hhcnB0cjsKKwl0cC0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBmbGFncHRyOworCXR0eV9zY2hlZHVsZV9mbGlwKGNoLT50dHkpOworfQorCisjZGVmaW5lIE1hZ2ljX2NvZGUJMHg0MDQKKworLyoKKyAqICAgIFN5c3RlbSBDb25maWd1cmF0aW9uCisgKi8KKy8qCisgKiAgICBmb3IgQzIxOCBCSU9TIGluaXRpYWxpemF0aW9uCisgKi8KKyNkZWZpbmUgQzIxOF9Db25mQmFzZQkweDgwMAorI2RlZmluZSBDMjE4X3N0YXR1cwkoQzIxOF9Db25mQmFzZSArIDApCS8qIEJJT1MgcnVubmluZyBzdGF0dXMgICAgKi8KKyNkZWZpbmUgQzIxOF9kaWFnCShDMjE4X0NvbmZCYXNlICsgMikJLyogZGlhZ25vc3RpYyBzdGF0dXMgICAgICAqLworI2RlZmluZSBDMjE4X2tleQkoQzIxOF9Db25mQmFzZSArIDQpCS8qIFdPUkQgKDB4MjE4IGZvciBDMjE4KSAqLworI2RlZmluZSBDMjE4RExvYWRfbGVuCShDMjE4X0NvbmZCYXNlICsgNikJLyogV09SRCAgICAgICAgICAgKi8KKyNkZWZpbmUgQzIxOGNoZWNrX3N1bQkoQzIxOF9Db25mQmFzZSArIDgpCS8qIEJZVEUgICAgICAgICAgICovCisjZGVmaW5lIEMyMThjaGtzdW1fb2sJKEMyMThfQ29uZkJhc2UgKyAweDBhKQkvKiBCWVRFICgxOm9rKSAgICAgICAgICAgICovCisjZGVmaW5lIEMyMThfVGVzdFJ4CShDMjE4X0NvbmZCYXNlICsgMHgxMCkJLyogOCBieXRlcyBmb3IgOCBwb3J0cyAgICAqLworI2RlZmluZSBDMjE4X1Rlc3RUeAkoQzIxOF9Db25mQmFzZSArIDB4MTgpCS8qIDggYnl0ZXMgZm9yIDggcG9ydHMgICAgKi8KKyNkZWZpbmUgQzIxOF9SWGVycgkoQzIxOF9Db25mQmFzZSArIDB4MjApCS8qIDggYnl0ZXMgZm9yIDggcG9ydHMgICAgKi8KKyNkZWZpbmUgQzIxOF9FcnJGbGFnCShDMjE4X0NvbmZCYXNlICsgMHgyOCkJLyogOCBieXRlcyBmb3IgOCBwb3J0cyAgICAqLworCisjZGVmaW5lIEMyMThfTG9hZEJ1ZgkweDBGMDAKKyNkZWZpbmUgQzIxOF9LZXlDb2RlCTB4MjE4CisjZGVmaW5lIENQMjA0Sl9LZXlDb2RlCTB4MjA0CisKKy8qCisgKiAgICBmb3IgQzMyMCBCSU9TIGluaXRpYWxpemF0aW9uCisgKi8KKyNkZWZpbmUgQzMyMF9Db25mQmFzZQkweDgwMAorI2RlZmluZSBDMzIwX0xvYWRCdWYJMHgwZjAwCisjZGVmaW5lIFNUU19pbml0CTB4MDUJLyogZm9yIEMzMjBfc3RhdHVzICAgICAgICAqLworCisjZGVmaW5lIEMzMjBfc3RhdHVzCUMzMjBfQ29uZkJhc2UgKyAwCS8qIEJJT1MgcnVubmluZyBzdGF0dXMgICAgKi8KKyNkZWZpbmUgQzMyMF9kaWFnCUMzMjBfQ29uZkJhc2UgKyAyCS8qIGRpYWdub3N0aWMgc3RhdHVzICAgICAgKi8KKyNkZWZpbmUgQzMyMF9rZXkJQzMyMF9Db25mQmFzZSArIDQJLyogV09SRCAoMDMyMEggZm9yIEMzMjApICovCisjZGVmaW5lIEMzMjBETG9hZF9sZW4JQzMyMF9Db25mQmFzZSArIDYJLyogV09SRCAgICAgICAgICAgKi8KKyNkZWZpbmUgQzMyMGNoZWNrX3N1bQlDMzIwX0NvbmZCYXNlICsgOAkvKiBXT1JEICAgICAgICAgICAqLworI2RlZmluZSBDMzIwY2hrc3VtX29rCUMzMjBfQ29uZkJhc2UgKyAweDBhCS8qIFdPUkQgKDE6b2spICAgICAgICAgICAgKi8KKyNkZWZpbmUgQzMyMGJhcGlfbGVuCUMzMjBfQ29uZkJhc2UgKyAweDBjCS8qIFdPUkQgICAgICAgICAgICovCisjZGVmaW5lIEMzMjBVQVJUX25vCUMzMjBfQ29uZkJhc2UgKyAweDBlCS8qIFdPUkQgICAgICAgICAgICovCisKKyNkZWZpbmUgQzMyMF9LZXlDb2RlCTB4MzIwCisKKyNkZWZpbmUgRml4UGFnZV9hZGRyCTB4MDAwMAkvKiBzdGFydGluZyBhZGRyIG9mIHN0YXRpYyBwYWdlICAqLworI2RlZmluZSBEeW5QYWdlX2FkZHIJMHgyMDAwCS8qIHN0YXJ0aW5nIGFkZHIgb2YgZHluYW1pYyBwYWdlICovCisjZGVmaW5lIEMyMThfc3RhcnQJMHgzMDAwCS8qIHN0YXJ0aW5nIGFkZHIgb2YgQzIxOCBCSU9TIHByZyAqLworI2RlZmluZSBDb250cm9sX3JlZwkweDFmZjAJLyogc2VsZWN0IHBhZ2UgYW5kIHJlc2V0IGNvbnRyb2wgKi8KKyNkZWZpbmUgSFdfcmVzZXQJMHg4MAorCisvKgorICogICAgRnVuY3Rpb24gQ29kZXMKKyAqLworI2RlZmluZSBGQ19DYXJkUmVzZXQJMHg4MAorI2RlZmluZSBGQ19DaGFubmVsUmVzZXQgMQkvKiBDMzIwIGZpcm13YXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkNfRW5hYmxlQ0gJMgorI2RlZmluZSBGQ19EaXNhYmxlQ0gJMworI2RlZmluZSBGQ19TZXRQYXJhbQk0CisjZGVmaW5lIEZDX1NldE1vZGUJNQorI2RlZmluZSBGQ19TZXRSYXRlCTYKKyNkZWZpbmUgRkNfTGluZUNvbnRyb2wJNworI2RlZmluZSBGQ19MaW5lU3RhdHVzCTgKKyNkZWZpbmUgRkNfWG1pdENvbnRyb2wJOQorI2RlZmluZSBGQ19GbHVzaFF1ZXVlCTEwCisjZGVmaW5lIEZDX1NlbmRCcmVhawkxMQorI2RlZmluZSBGQ19TdG9wQnJlYWsJMTIKKyNkZWZpbmUgRkNfTG9vcGJhY2tPTgkxMworI2RlZmluZSBGQ19Mb29wYmFja09GRgkxNAorI2RlZmluZSBGQ19DbHJJcnFUYWJsZQkxNQorI2RlZmluZSBGQ19TZW5kWG9uCTE2CisjZGVmaW5lIEZDX1NldFRlcm1JcnEJMTcJLyogQzMyMCBmaXJtd2FyZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEZDX1NldENudElycQkxOAkvKiBDMzIwIGZpcm13YXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkNfU2V0QnJlYWtJcnEJMTkKKyNkZWZpbmUgRkNfU2V0TGluZUlycQkyMAorI2RlZmluZSBGQ19TZXRGbG93Q3RsCTIxCisjZGVmaW5lIEZDX0dlbklycQkyMgorI2RlZmluZSBGQ19JbkNEMTgwCTIzCisjZGVmaW5lIEZDX091dENEMTgwCTI0CisjZGVmaW5lIEZDX0luVUFSVHJlZwkyMworI2RlZmluZSBGQ19PdXRVQVJUcmVnCTI0CisjZGVmaW5lIEZDX1NldFhvblhvZmYJMjUKKyNkZWZpbmUgRkNfT3V0Q0QxODBDQ1IJMjYKKyNkZWZpbmUgRkNfRXh0SVF1ZXVlCTI3CisjZGVmaW5lIEZDX0V4dE9RdWV1ZQkyOAorI2RlZmluZSBGQ19DbHJMaW5lSXJxCTI5CisjZGVmaW5lIEZDX0hXRmxvd0N0bAkzMAorI2RlZmluZSBGQ19HZXRDbG9ja1JhdGUgMzUKKyNkZWZpbmUgRkNfU2V0QmF1ZAkzNgorI2RlZmluZSBGQ19TZXREYXRhTW9kZSAgNDEKKyNkZWZpbmUgRkNfR2V0Q0NTUiAgICAgIDQzCisjZGVmaW5lIEZDX0dldERhdGFFcnJvciA0NQorI2RlZmluZSBGQ19SeENvbnRyb2wJNTAKKyNkZWZpbmUgRkNfSW1tU2VuZAk1MQorI2RlZmluZSBGQ19TZXRYb25TdGF0ZQk1MgorI2RlZmluZSBGQ19TZXRYb2ZmU3RhdGUJNTMKKyNkZWZpbmUgRkNfU2V0UnhGSUZPVHJpZyA1NAorI2RlZmluZSBGQ19TZXRUeEZJRk9DbnQgNTUKKyNkZWZpbmUgRkNfVW5peFJhdGUJNTYKKyNkZWZpbmUgRkNfVW5peFJlc2V0VGltZXIgNTcKKworI2RlZmluZQlSeEZJRk9UcmlnMQkwCisjZGVmaW5lCVJ4RklGT1RyaWc0CTEKKyNkZWZpbmUJUnhGSUZPVHJpZzgJMgorI2RlZmluZQlSeEZJRk9UcmlnMTQJMworCisvKgorICogICAgRHVhbC1Qb3J0ZWQgUkFNCisgKi8KKyNkZWZpbmUgRFJBTV9nbG9iYWwJMAorI2RlZmluZSBJTlRfZGF0YQkoRFJBTV9nbG9iYWwgKyAwKQorI2RlZmluZSBDb25maWdfYmFzZQkoRFJBTV9nbG9iYWwgKyAweDEwOCkKKworI2RlZmluZSBJUlFpbmRleAkoSU5UX2RhdGEgKyAwKQorI2RlZmluZSBJUlFwZW5kaW5nCShJTlRfZGF0YSArIDQpCisjZGVmaW5lIElSUXRhYmxlCShJTlRfZGF0YSArIDgpCisKKy8qCisgKiAgICBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KKyNkZWZpbmUgSW50clJ4CQkweDAxCS8qIHJlY2VpdmVyIGRhdGEgTy5LLiAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRyVHgJCTB4MDIJLyogdHJhbnNtaXQgYnVmZmVyIGVtcHR5ICAqLworI2RlZmluZSBJbnRyRnVuYwkweDA0CS8qIGZ1bmN0aW9uIGNvbXBsZXRlICAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRyQnJlYWsJMHgwOAkvKiByZWNlaXZlZCBicmVhayAgICAgICAgICovCisjZGVmaW5lIEludHJMaW5lCTB4MTAJLyogbGluZSBzdGF0dXMgY2hhbmdlCisJCQkJICAgZm9yIHRyYW5zbWl0dGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJJbnRyCTB4MjAJLyogcmVjZWl2ZWQgSU5UUiBjb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJRdWl0CTB4NDAJLyogcmVjZWl2ZWQgUVVJVCBjb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJFT0YgCTB4ODAJLyogcmVjZWl2ZWQgRU9GIGNvZGUgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSW50clJ4VHJpZ2dlciAJMHgxMDAJLyogcnggZGF0YSBjb3VudCByZWFjaCB0aWdnZXIgdmFsdWUgKi8KKyNkZWZpbmUgSW50clR4VHJpZ2dlciAJMHgyMDAJLyogdHggZGF0YSBjb3VudCBiZWxvdyB0cmlnZ2VyIHZhbHVlICovCisKKyNkZWZpbmUgTWFnaWNfbm8JKENvbmZpZ19iYXNlICsgMCkKKyNkZWZpbmUgQ2FyZF9tb2RlbF9ubwkoQ29uZmlnX2Jhc2UgKyAyKQorI2RlZmluZSBUb3RhbF9wb3J0cwkoQ29uZmlnX2Jhc2UgKyA0KQorI2RlZmluZSBNb2R1bGVfY250CShDb25maWdfYmFzZSArIDgpCisjZGVmaW5lIE1vZHVsZV9ubwkoQ29uZmlnX2Jhc2UgKyAxMCkKKyNkZWZpbmUgVGltZXJfMTBtcwkoQ29uZmlnX2Jhc2UgKyAxNCkKKyNkZWZpbmUgRGlzYWJsZV9JUlEJKENvbmZpZ19iYXNlICsgMjApCisjZGVmaW5lIFRNUzMyMF9QT1JUMQkoQ29uZmlnX2Jhc2UgKyAyMikKKyNkZWZpbmUgVE1TMzIwX1BPUlQyCShDb25maWdfYmFzZSArIDI0KQorI2RlZmluZSBUTVMzMjBfQ0xPQ0sJKENvbmZpZ19iYXNlICsgMjYpCisKKy8qCisgKiAgICBEQVRBIEJVRkZFUiBpbiBEUkFNCisgKi8KKyNkZWZpbmUgRXh0ZXJuX3RhYmxlCTB4NDAwCS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgZXh0ZXJuYWwgdGFibGUKKwkJCQkgICAoMjQgd29yZHMgKiAgICA2NCkgdG90YWwgM0sgYnl0ZXMKKwkJCQkgICAoMjQgd29yZHMgKiAxMjgpIHRvdGFsIDZLIGJ5dGVzICovCisjZGVmaW5lIEV4dGVybl9zaXplCTB4NjAJLyogOTYgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYcnB0cgkJMHgwMAkvKiByZWFkIHBvaW50ZXIgZm9yIFJYIGJ1ZmZlciAgICAgKi8KKyNkZWZpbmUgUlh3cHRyCQkweDAyCS8qIHdyaXRlIHBvaW50ZXIgZm9yIFJYIGJ1ZmZlciAgICAqLworI2RlZmluZSBUWHJwdHIJCTB4MDQJLyogcmVhZCBwb2ludGVyIGZvciBUWCBidWZmZXIgICAgICovCisjZGVmaW5lIFRYd3B0cgkJMHgwNgkvKiB3cml0ZSBwb2ludGVyIGZvciBUWCBidWZmZXIgICAgKi8KKyNkZWZpbmUgSG9zdFN0YXQJMHgwOAkvKiBJUlEgZmxhZyBhbmQgZ2VuZXJhbCBmbGFnICAgICAgKi8KKyNkZWZpbmUgRmxhZ1N0YXQJMHgwQQorI2RlZmluZSBGbG93Q29udHJvbAkweDBDCS8qIEI3IEI2IEI1IEI0IEIzIEIyIEIxIEIwICAgICAgICAgICAgICAqLworCQkJCQkvKiAgeCAgeCAgeCAgeCAgfCAgfCAgfCAgfCAgICAgICAgICAgICovCisJCQkJCS8qICAgICAgICAgICAgICB8ICB8ICB8ICArIENUUyBmbG93ICAgKi8KKwkJCQkJLyogICAgICAgICAgICAgIHwgIHwgICstLS0gUlRTIGZsb3cgICAqLworCQkJCQkvKiAgICAgICAgICAgICAgfCAgKy0tLS0tLSBUWCBYb24vWG9mZiAqLworCQkJCQkvKiAgICAgICAgICAgICAgKy0tLS0tLS0tLSBSWCBYb24vWG9mZiAqLworI2RlZmluZSBCcmVha19jbnQJMHgwRQkvKiByZWNlaXZlZCBicmVhayBjb3VudCAgICovCisjZGVmaW5lIENEMTgwVFhpcnEJMHgxMAkvKiBpZiBub24tMDogZW5hYmxlIFRYIGlycSAgICAgICAgKi8KKyNkZWZpbmUgUlhfbWFzayAJMHgxMgorI2RlZmluZSBUWF9tYXNrIAkweDE0CisjZGVmaW5lIE9mc19yeGIgCTB4MTYKKyNkZWZpbmUgT2ZzX3R4YiAJMHgxOAorI2RlZmluZSBQYWdlX3J4YgkweDFBCisjZGVmaW5lIFBhZ2VfdHhiCTB4MUMKKyNkZWZpbmUgRW5kUGFnZV9yeGIJMHgxRQorI2RlZmluZSBFbmRQYWdlX3R4YgkweDIwCisjZGVmaW5lIERhdGFfZXJyb3IJMHgyMgorI2RlZmluZSBSeFRyaWdnZXIJMHgyOAorI2RlZmluZSBUeFRyaWdnZXIJMHgyYQorCisjZGVmaW5lIHJSWHdwdHIgCTB4MzQKKyNkZWZpbmUgTG93X3dhdGVyCTB4MzYKKworI2RlZmluZSBGdW5jQ29kZQkweDQwCisjZGVmaW5lIEZ1bmNBcmcgCTB4NDIKKyNkZWZpbmUgRnVuY0FyZzEJMHg0NAorCisjZGVmaW5lIEMyMThyeF9zaXplCTB4MjAwMAkvKiA4SyBieXRlcyAqLworI2RlZmluZSBDMjE4dHhfc2l6ZQkweDgwMDAJLyogMzJLIGJ5dGVzICovCisKKyNkZWZpbmUgQzIxOHJ4X21hc2sJKEMyMThyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzIxOHR4X21hc2sJKEMyMTh0eF9zaXplIC0gMSkKKworI2RlZmluZSBDMzIwcDhyeF9zaXplCTB4MjAwMAorI2RlZmluZSBDMzIwcDh0eF9zaXplCTB4ODAwMAorI2RlZmluZSBDMzIwcDhyeF9tYXNrCShDMzIwcDhyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzMyMHA4dHhfbWFzawkoQzMyMHA4dHhfc2l6ZSAtIDEpCisKKyNkZWZpbmUgQzMyMHAxNnJ4X3NpemUJMHgyMDAwCisjZGVmaW5lIEMzMjBwMTZ0eF9zaXplCTB4NDAwMAorI2RlZmluZSBDMzIwcDE2cnhfbWFzawkoQzMyMHAxNnJ4X3NpemUgLSAxKQorI2RlZmluZSBDMzIwcDE2dHhfbWFzawkoQzMyMHAxNnR4X3NpemUgLSAxKQorCisjZGVmaW5lIEMzMjBwMjRyeF9zaXplCTB4MjAwMAorI2RlZmluZSBDMzIwcDI0dHhfc2l6ZQkweDIwMDAKKyNkZWZpbmUgQzMyMHAyNHJ4X21hc2sJKEMzMjBwMjRyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzMyMHAyNHR4X21hc2sJKEMzMjBwMjR0eF9zaXplIC0gMSkKKworI2RlZmluZSBDMzIwcDMycnhfc2l6ZQkweDEwMDAKKyNkZWZpbmUgQzMyMHAzMnR4X3NpemUJMHgxMDAwCisjZGVmaW5lIEMzMjBwMzJyeF9tYXNrCShDMzIwcDMycnhfc2l6ZSAtIDEpCisjZGVmaW5lIEMzMjBwMzJ0eF9tYXNrCShDMzIwcDMydHhfc2l6ZSAtIDEpCisKKyNkZWZpbmUgUGFnZV9zaXplCTB4MjAwMAorI2RlZmluZSBQYWdlX21hc2sJKFBhZ2Vfc2l6ZSAtIDEpCisjZGVmaW5lIEMyMThyeF9zcGFnZQkzCisjZGVmaW5lIEMyMTh0eF9zcGFnZQk0CisjZGVmaW5lIEMyMThyeF9wYWdlbm8JMQorI2RlZmluZSBDMjE4dHhfcGFnZW5vCTQKKyNkZWZpbmUgQzIxOGJ1Zl9wYWdlbm8JNQorCisjZGVmaW5lIEMzMjBwOHJ4X3NwYWdlCTMKKyNkZWZpbmUgQzMyMHA4dHhfc3BhZ2UJNAorI2RlZmluZSBDMzIwcDhyeF9wZ25vCTEKKyNkZWZpbmUgQzMyMHA4dHhfcGdubwk0CisjZGVmaW5lIEMzMjBwOGJ1Zl9wZ25vCTUKKworI2RlZmluZSBDMzIwcDE2cnhfc3BhZ2UgMworI2RlZmluZSBDMzIwcDE2dHhfc3BhZ2UgNAorI2RlZmluZSBDMzIwcDE2cnhfcGdubwkxCisjZGVmaW5lIEMzMjBwMTZ0eF9wZ25vCTIKKyNkZWZpbmUgQzMyMHAxNmJ1Zl9wZ25vIDMKKworI2RlZmluZSBDMzIwcDI0cnhfc3BhZ2UgMworI2RlZmluZSBDMzIwcDI0dHhfc3BhZ2UgNAorI2RlZmluZSBDMzIwcDI0cnhfcGdubwkxCisjZGVmaW5lIEMzMjBwMjR0eF9wZ25vCTEKKyNkZWZpbmUgQzMyMHAyNGJ1Zl9wZ25vIDIKKworI2RlZmluZSBDMzIwcDMycnhfc3BhZ2UgMworI2RlZmluZSBDMzIwcDMydHhfb2ZzCUMzMjBwMzJyeF9zaXplCisjZGVmaW5lIEMzMjBwMzJ0eF9zcGFnZSAzCisjZGVmaW5lIEMzMjBwMzJidWZfcGdubyAxCisKKy8qCisgKiAgICBIb3N0IFN0YXR1cworICovCisjZGVmaW5lIFdha2V1cFJ4CTB4MDEKKyNkZWZpbmUgV2FrZXVwVHgJMHgwMgorI2RlZmluZSBXYWtldXBCcmVhawkweDA4CisjZGVmaW5lIFdha2V1cExpbmUJMHgxMAorI2RlZmluZSBXYWtldXBJbnRyCTB4MjAKKyNkZWZpbmUgV2FrZXVwUXVpdAkweDQwCisjZGVmaW5lIFdha2V1cEVPRgkweDgwCS8qIHVzZWQgaW4gVlRJTUUgY29udHJvbCAqLworI2RlZmluZSBXYWtldXBSeFRyaWdnZXIJMHgxMDAKKyNkZWZpbmUgV2FrZXVwVHhUcmlnZ2VyCTB4MjAwCisvKgorICogICAgRmxhZyBzdGF0dXMKKyAqLworI2RlZmluZSBSeF9vdmVyCQkweDAxCisjZGVmaW5lIFhvZmZfc3RhdGUJMHgwMgorI2RlZmluZSBUeF9mbG93T2ZmCTB4MDQKKyNkZWZpbmUgVHhfZW5hYmxlCTB4MDgKKyNkZWZpbmUgQ1RTX3N0YXRlCTB4MTAKKyNkZWZpbmUgRFNSX3N0YXRlCTB4MjAKKyNkZWZpbmUgRENEX3N0YXRlCTB4ODAKKy8qCisgKiAgICBGbG93Q29udHJvbAorICovCisjZGVmaW5lIENUU19GbG93Q3RsCTEKKyNkZWZpbmUgUlRTX0Zsb3dDdGwJMgorI2RlZmluZSBUeF9GbG93Q3RsCTQKKyNkZWZpbmUgUnhfRmxvd0N0bAk4CisjZGVmaW5lIElYTV9JWEFOWQkweDEwCisKKyNkZWZpbmUgTG93V2F0ZXIJMTI4CisKKyNkZWZpbmUgRFRSX09OCQkxCisjZGVmaW5lIFJUU19PTgkJMgorI2RlZmluZSBDVFNfT04JCTEKKyNkZWZpbmUgRFNSX09OCQkyCisjZGVmaW5lIERDRF9PTgkJOAorCisvKiBtb2RlIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJTVhfQ1M4CQkweDAzCisjZGVmaW5lCU1YX0NTNwkJMHgwMgorI2RlZmluZQlNWF9DUzYJCTB4MDEKKyNkZWZpbmUJTVhfQ1M1CQkweDAwCisKKyNkZWZpbmUJTVhfU1RPUDEJMHgwMAorI2RlZmluZQlNWF9TVE9QMTUJMHgwNAorI2RlZmluZQlNWF9TVE9QMgkweDA4CisKKyNkZWZpbmUJTVhfUEFSTk9ORQkweDAwCisjZGVmaW5lCU1YX1BBUkVWRU4JMHg0MAorI2RlZmluZQlNWF9QQVJPREQJMHhDMAorCisvKgorICogICAgUXVlcnkKKyAqLworI2RlZmluZSBRdWVyeVBvcnQJTUFYX1BPUlRTCisKKworCitzdHJ1Y3QgbW9uX3N0ciB7CisJaW50IHRpY2s7CisJaW50IHJ4Y250W01BWF9QT1JUU107CisJaW50IHR4Y250W01BWF9QT1JUU107Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW9uX3N0ciBtb25fc3Q7CisKKyNkZWZpbmUgCURDRF9jaGFuZ2VkCTB4MDEKKyNkZWZpbmUgCURDRF9vbGRzdGF0ZQkweDgwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1veGFCdWZmWzEwMjQwXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFJbnROZHhbTUFYX0JPQVJEU107CitzdGF0aWMgdm9pZCBfX2lvbWVtICptb3hhSW50UGVuZFtNQVhfQk9BUkRTXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFJbnRUYWJsZVtNQVhfQk9BUkRTXTsKK3N0YXRpYyBjaGFyIG1veGFDaGtQb3J0W01BWF9QT1JUU107CitzdGF0aWMgY2hhciBtb3hhTGluZUN0cmxbTUFYX1BPUlRTXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFUYWJsZUFkZHJbTUFYX1BPUlRTXTsKK3N0YXRpYyBsb25nIG1veGFDdXJCYXVkW01BWF9QT1JUU107CitzdGF0aWMgY2hhciBtb3hhRENEU3RhdGVbTUFYX1BPUlRTXTsKK3N0YXRpYyBjaGFyIG1veGFMb3dDaGtGbGFnW01BWF9QT1JUU107CitzdGF0aWMgaW50IG1veGFMb3dXYXRlckNoazsKK3N0YXRpYyBpbnQgbW94YUNhcmQ7CitzdGF0aWMgbW9uX3N0IG1veGFMb2c7CitzdGF0aWMgaW50IG1veGFGdW5jVG91dDsKK3N0YXRpYyB1c2hvcnQgbW94YUJyZWFrQ250W01BWF9QT1JUU107CisKK3N0YXRpYyB2b2lkIG1veGFkZWxheShpbnQpOworc3RhdGljIHZvaWQgbW94YWZ1bmModm9pZCBfX2lvbWVtICosIGludCwgdXNob3J0KTsKK3N0YXRpYyB2b2lkIHdhaXRfZmluaXNoKHZvaWQgX19pb21lbSAqKTsKK3N0YXRpYyB2b2lkIGxvd193YXRlcl9jaGVjayh2b2lkIF9faW9tZW0gKik7CitzdGF0aWMgaW50IG1veGFsb2FkYmlvcyhpbnQsIHVuc2lnbmVkIGNoYXIgX191c2VyICosIGludCk7CitzdGF0aWMgaW50IG1veGFmaW5kY2FyZChpbnQpOworc3RhdGljIGludCBtb3hhbG9hZDMyMGIoaW50LCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqLCBpbnQpOworc3RhdGljIGludCBtb3hhbG9hZGNvZGUoaW50LCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqLCBpbnQpOworc3RhdGljIGludCBtb3hhbG9hZGMyMTgoaW50LCB2b2lkIF9faW9tZW0gKiwgaW50KTsKK3N0YXRpYyBpbnQgbW94YWxvYWRjMzIwKGludCwgdm9pZCBfX2lvbWVtICosIGludCwgaW50ICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCURyaXZlciBsZXZlbCBmdW5jdGlvbnM6IAkJCQkJICAgICAqCisgKgkxLiBNb3hhRHJpdmVySW5pdCh2b2lkKTsJCQkJCSAgICAgKgorICoJMi4gTW94YURyaXZlcklvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgcG9ydCk7ICAgKgorICoJMy4gTW94YURyaXZlclBvbGwodm9pZCk7CQkJCQkgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTW94YURyaXZlckluaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW1veGFGdW5jVG91dCA9IEhaIC8gMjsJLyogNTAwIG1pbmktc2Vjb25kcyAqLworCW1veGFDYXJkID0gMDsKKwltb3hhTG9nLnRpY2sgPSAwOworCW1veGFMb3dXYXRlckNoayA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCW1veGFDaGtQb3J0W2ldID0gMDsKKwkJbW94YUxvd0Noa0ZsYWdbaV0gPSAwOworCQltb3hhTGluZUN0cmxbaV0gPSAwOworCQltb3hhTG9nLnJ4Y250W2ldID0gMDsKKwkJbW94YUxvZy50eGNudFtpXSA9IDA7CisJfQorfQorCisjZGVmaW5lCU1PWEEJCTB4NDAwCisjZGVmaW5lIE1PWEFfR0VUX0lRVUVVRSAJKE1PWEEgKyAxKQkvKiBnZXQgaW5wdXQgYnVmZmVyZWQgY291bnQgKi8KKyNkZWZpbmUgTU9YQV9HRVRfT1FVRVVFIAkoTU9YQSArIDIpCS8qIGdldCBvdXRwdXQgYnVmZmVyZWQgY291bnQgKi8KKyNkZWZpbmUgTU9YQV9JTklUX0RSSVZFUgkoTU9YQSArIDYpCS8qIG1veGFDYXJkPTAgKi8KKyNkZWZpbmUgTU9YQV9MT0FEX0JJT1MJCShNT1hBICsgOSkJLyogZG93bmxvYWQgQklPUyAqLworI2RlZmluZSBNT1hBX0ZJTkRfQk9BUkQJCShNT1hBICsgMTApCS8qIENoZWNrIGlmIE1PWEEgY2FyZCBleGlzdD8gKi8KKyNkZWZpbmUgTU9YQV9MT0FEX0MzMjBCCQkoTU9YQSArIDExKQkvKiBkb3dubG9hZCAzMjBCIGZpcm13YXJlICovCisjZGVmaW5lIE1PWEFfTE9BRF9DT0RFCQkoTU9YQSArIDEyKQkvKiBkb3dubG9hZCBmaXJtd2FyZSAqLworI2RlZmluZSBNT1hBX0dFVERBVEFDT1VOVCAgICAgICAoTU9YQSArIDIzKQorI2RlZmluZSBNT1hBX0dFVF9JT1FVRVVFCShNT1hBICsgMjcpCisjZGVmaW5lIE1PWEFfRkxVU0hfUVVFVUUJKE1PWEEgKyAyOCkKKyNkZWZpbmUgTU9YQV9HRVRfQ09ORgkJKE1PWEEgKyAzNSkJLyogY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNT1hBX0dFVF9NQUpPUiAgICAgICAgICAoTU9YQSArIDYzKQorI2RlZmluZSBNT1hBX0dFVF9DVU1BSk9SICAgICAgICAoTU9YQSArIDY0KQorI2RlZmluZSBNT1hBX0dFVE1TVEFUVVMgICAgICAgICAoTU9YQSArIDY1KQorCisKK3N0cnVjdCBtb3hhcV9zdHIgeworCWludCBpbnE7CisJaW50IG91dHE7Cit9OworCitzdHJ1Y3QgZGxfc3RyIHsKKwljaGFyIF9fdXNlciAqYnVmOworCWludCBsZW47CisJaW50IGNhcmRubzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbW94YXFfc3RyIHRlbXBfcXVldWVbTUFYX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3QgZGxfc3RyIGRsdG1wOworCit2b2lkIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaWYgKChtb2RlIDwgMCkgfHwgKG1vZGUgPiAyKSkKKwkJcmV0dXJuOworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX0ZsdXNoUXVldWUsIG1vZGUpOworCWlmIChtb2RlICE9IDEpIHsKKwkJbW94YUxvd0Noa0ZsYWdbcG9ydF0gPSAwOworCQlsb3dfd2F0ZXJfY2hlY2sob2ZzQWRkcik7CisJfQorfQorCitpbnQgTW94YURyaXZlcklvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCWludCBNb3hhUG9ydFR4UXVldWUoaW50KSwgTW94YVBvcnRSeFF1ZXVlKGludCk7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAocG9ydCA9PSBRdWVyeVBvcnQpIHsKKwkJaWYgKChjbWQgIT0gTU9YQV9HRVRfQ09ORikgJiYgKGNtZCAhPSBNT1hBX0lOSVRfRFJJVkVSKSAmJgorCQkgICAgKGNtZCAhPSBNT1hBX0xPQURfQklPUykgJiYgKGNtZCAhPSBNT1hBX0ZJTkRfQk9BUkQpICYmIChjbWQgIT0gTU9YQV9MT0FEX0MzMjBCKSAmJgorCQkgKGNtZCAhPSBNT1hBX0xPQURfQ09ERSkgJiYgKGNtZCAhPSBNT1hBX0dFVERBVEFDT1VOVCkgJiYKKwkJICAoY21kICE9IE1PWEFfR0VUX0lPUVVFVUUpICYmIChjbWQgIT0gTU9YQV9HRVRfTUFKT1IpICYmCisJCSAgICAoY21kICE9IE1PWEFfR0VUX0NVTUFKT1IpICYmIChjbWQgIT0gTU9YQV9HRVRNU1RBVFVTKSkKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNT1hBX0dFVF9DT05GOgorCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJm1veGFfYm9hcmRzLCBNQVhfQk9BUkRTICogc2l6ZW9mKG1veGFfYm9hcmRfY29uZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0lOSVRfRFJJVkVSOgorCQlpZiAoKGludCkgYXJnID09IDB4NDA0KQorCQkJTW94YURyaXZlckluaXQoKTsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfR0VUREFUQUNPVU5UOgorCQltb3hhTG9nLnRpY2sgPSBqaWZmaWVzOworCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJm1veGFMb2csIHNpemVvZihtb25fc3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gKDApOworCWNhc2UgTU9YQV9GTFVTSF9RVUVVRToKKwkJTW94YVBvcnRGbHVzaERhdGEocG9ydCwgYXJnKTsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfR0VUX0lPUVVFVUU6CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykgeworCQkJaWYgKG1veGFDaGtQb3J0W2ldKSB7CisJCQkJdGVtcF9xdWV1ZVtpXS5pbnEgPSBNb3hhUG9ydFJ4UXVldWUoaSk7CisJCQkJdGVtcF9xdWV1ZVtpXS5vdXRxID0gTW94YVBvcnRUeFF1ZXVlKGkpOworCQkJfQorCQl9CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCB0ZW1wX3F1ZXVlLCBzaXplb2Yoc3RydWN0IG1veGFxX3N0cikgKiBNQVhfUE9SVFMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0dFVF9PUVVFVUU6CisJCWkgPSBNb3hhUG9ydFR4UXVldWUocG9ydCk7CisJCXJldHVybiBwdXRfdXNlcihpLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKKwljYXNlIE1PWEFfR0VUX0lRVUVVRToKKwkJaSA9IE1veGFQb3J0UnhRdWV1ZShwb3J0KTsKKwkJcmV0dXJuIHB1dF91c2VyKGksICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9HRVRfTUFKT1I6CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmdHR5bWFqb3IsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIE1PWEFfR0VUX0NVTUFKT1I6CisJCWkgPSAwOworCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmksIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIE1PWEFfR0VUTVNUQVRVUzoKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCQlHTVN0YXR1c1tpXS5yaSA9IDA7CisJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKwkJCUdNU3RhdHVzW2ldLmN0cyA9IDA7CisJCQlpZiAoIW1veGFDaGtQb3J0W2ldKSB7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IE1veGFQb3J0TGluZVN0YXR1cyhtb3hhQ2hhbm5lbHNbaV0ucG9ydCk7CisJCQkJaWYgKHN0YXR1cyAmIDEpCisJCQkJCUdNU3RhdHVzW2ldLmN0cyA9IDE7CisJCQkJaWYgKHN0YXR1cyAmIDIpCisJCQkJCUdNU3RhdHVzW2ldLmRzciA9IDE7CisJCQkJaWYgKHN0YXR1cyAmIDQpCisJCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7CisJCQl9CisKKwkJCWlmICghbW94YUNoYW5uZWxzW2ldLnR0eSB8fCAhbW94YUNoYW5uZWxzW2ldLnR0eS0+dGVybWlvcykKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG1veGFDaGFubmVsc1tpXS5jZmxhZzsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG1veGFDaGFubmVsc1tpXS50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJCX0KKwkJaWYoY29weV90b191c2VyKGFyZ3AsIEdNU3RhdHVzLCBzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTUFYX1BPUlRTKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC1FTk9JT0NUTENNRCk7CisJY2FzZSBNT1hBX0xPQURfQklPUzoKKwljYXNlIE1PWEFfRklORF9CT0FSRDoKKwljYXNlIE1PWEFfTE9BRF9DMzIwQjoKKwljYXNlIE1PWEFfTE9BRF9DT0RFOgorCQlicmVhazsKKwl9CisKKwlpZihjb3B5X2Zyb21fdXNlcigmZGx0bXAsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgZGxfc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmKGRsdG1wLmNhcmRubyA8IDAgfHwgZGx0bXAuY2FyZG5vID49IE1BWF9CT0FSRFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBNT1hBX0xPQURfQklPUzoKKwkJaSA9IG1veGFsb2FkYmlvcyhkbHRtcC5jYXJkbm8sIGRsdG1wLmJ1ZiwgZGx0bXAubGVuKTsKKwkJcmV0dXJuIChpKTsKKwljYXNlIE1PWEFfRklORF9CT0FSRDoKKwkJcmV0dXJuIG1veGFmaW5kY2FyZChkbHRtcC5jYXJkbm8pOworCWNhc2UgTU9YQV9MT0FEX0MzMjBCOgorCQltb3hhbG9hZDMyMGIoZGx0bXAuY2FyZG5vLCBkbHRtcC5idWYsIGRsdG1wLmxlbik7CisJZGVmYXVsdDogLyogdG8ga2VlcCBnY2MgaGFwcHkgKi8KKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfTE9BRF9DT0RFOgorCQlpID0gbW94YWxvYWRjb2RlKGRsdG1wLmNhcmRubywgZGx0bXAuYnVmLCBkbHRtcC5sZW4pOworCQlpZiAoaSA9PSAtMSkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCXJldHVybiAoaSk7CisKKwl9Cit9CisKK2ludCBNb3hhRHJpdmVyUG9sbCh2b2lkKQoreworCXJlZ2lzdGVyIHVzaG9ydCB0ZW1wOworCXJlZ2lzdGVyIGludCBjYXJkOworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl2b2lkIF9faW9tZW0gKmlwOworCWludCBwb3J0LCBwLCBwb3J0czsKKworCWlmIChtb3hhQ2FyZCA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTUFYX0JPQVJEUzsgY2FyZCsrKSB7CisJCWlmICgocG9ydHMgPSBtb3hhX2JvYXJkc1tjYXJkXS5udW1Qb3J0cykgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVhZGIobW94YUludFBlbmRbY2FyZF0pID09IDB4ZmYpIHsKKwkJCWlwID0gbW94YUludFRhYmxlW2NhcmRdICsgcmVhZGIobW94YUludE5keFtjYXJkXSk7CisJCQlwID0gY2FyZCAqIE1BWF9QT1JUU19QRVJfQk9BUkQ7CisJCQlwb3J0cyA8PD0gMTsKKwkJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0czsgcG9ydCArPSAyLCBwKyspIHsKKwkJCQlpZiAoKHRlbXAgPSByZWFkdyhpcCArIHBvcnQpKSAhPSAwKSB7CisJCQkJCXdyaXRldygwLCBpcCArIHBvcnQpOworCQkJCQlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwXTsKKwkJCQkJaWYgKHRlbXAgJiBJbnRyVHgpCisJCQkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIEhvc3RTdGF0KSAmIH5XYWtldXBUeCwgb2ZzQWRkciArIEhvc3RTdGF0KTsKKwkJCQkJaWYgKHRlbXAgJiBJbnRyQnJlYWspIHsKKwkJCQkJCW1veGFCcmVha0NudFtwXSsrOworCQkJCQl9CisJCQkJCWlmICh0ZW1wICYgSW50ckxpbmUpIHsKKwkJCQkJCWlmIChyZWFkYihvZnNBZGRyICsgRmxhZ1N0YXQpICYgRENEX3N0YXRlKSB7CisJCQkJCQkJaWYgKChtb3hhRENEU3RhdGVbcF0gJiBEQ0Rfb2xkc3RhdGUpID09IDApCisJCQkJCQkJCW1veGFEQ0RTdGF0ZVtwXSA9IChEQ0Rfb2xkc3RhdGUgfAorCQkJCQkJCQkJCSAgIERDRF9jaGFuZ2VkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKG1veGFEQ0RTdGF0ZVtwXSAmIERDRF9vbGRzdGF0ZSkKKwkJCQkJCQkJbW94YURDRFN0YXRlW3BdID0gRENEX2NoYW5nZWQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl3cml0ZWIoMCwgbW94YUludFBlbmRbY2FyZF0pOworCQl9CisJCWlmIChtb3hhTG93V2F0ZXJDaGspIHsKKwkJCXAgPSBjYXJkICogTUFYX1BPUlRTX1BFUl9CT0FSRDsKKwkJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0czsgcG9ydCsrLCBwKyspIHsKKwkJCQlpZiAobW94YUxvd0Noa0ZsYWdbcF0pIHsKKwkJCQkJbW94YUxvd0Noa0ZsYWdbcF0gPSAwOworCQkJCQlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwXTsKKwkJCQkJbG93X3dhdGVyX2NoZWNrKG9mc0FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwltb3hhTG93V2F0ZXJDaGsgPSAwOworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQ2FyZCBsZXZlbCBmdW5jdGlvbjoJCQkJCQkgICAgICoKKyAqCTEuIE1veGFQb3J0c09mQ2FyZChpbnQgY2FyZG5vKTsgCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IE1veGFQb3J0c09mQ2FyZChpbnQgY2FyZG5vKQoreworCisJaWYgKG1veGFfYm9hcmRzW2NhcmRub10uYm9hcmRUeXBlID09IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglQb3J0IGxldmVsIGZ1bmN0aW9uczoJCQkJCQkgICAgICoKKyAqCTEuICBNb3hhUG9ydElzVmFsaWQoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkyLiAgTW94YVBvcnRFbmFibGUoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkzLiAgTW94YVBvcnREaXNhYmxlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJNC4gIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJNS4gIE1veGFQb3J0R2V0Q3VyQmF1ZChpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJNi4gIE1veGFQb3J0U2V0QmF1ZChpbnQgcG9ydCwgbG9uZyBiYXVkKTsJCQkgICAgICoKKyAqCTcuICBNb3hhUG9ydFNldE1vZGUoaW50IHBvcnQsIGludCBkYXRhYml0LCBpbnQgc3RvcGJpdCwgaW50IHBhcml0eSk7ICoKKyAqCTguICBNb3hhUG9ydFNldFRlcm1pbyhpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqdGVybWlvKTsgCSAgICAgKgorICoJOS4gIE1veGFQb3J0R2V0TGluZU91dChpbnQgcG9ydCwgaW50ICpkdHJTdGF0ZSwgaW50ICpydHNTdGF0ZSk7ICAgICAgKgorICoJMTAuIE1veGFQb3J0TGluZUN0cmwoaW50IHBvcnQsIGludCBkdHJTdGF0ZSwgaW50IHJ0c1N0YXRlKTsJICAgICAqCisgKgkxMS4gTW94YVBvcnRGbG93Q3RybChpbnQgcG9ydCwgaW50IHJ0cywgaW50IGN0cywgaW50IHJ4LCBpbnQgdHgsaW50IHhhbnkpOyAgICAqCisgKgkxMi4gTW94YVBvcnRMaW5lU3RhdHVzKGludCBwb3J0KTsJCQkJICAgICAqCisgKgkxMy4gTW94YVBvcnREQ0RDaGFuZ2UoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTE0LiBNb3hhUG9ydERDRE9OKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMTUuIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSk7CSAgICAgICAgICAgICAgICAgICAgICoKKyAqCTE2LiBNb3hhUG9ydFdyaXRlRGF0YShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCk7ICoKKyAqCTE3LiBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKTsgICoKKyAqCTE4LiBNb3hhUG9ydFR4QnVmU2l6ZShpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJMTkuIE1veGFQb3J0UnhCdWZTaXplKGludCBwb3J0KTsJCQkJICAgICAqCisgKgkyMC4gTW94YVBvcnRUeFF1ZXVlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMjEuIE1veGFQb3J0VHhGcmVlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMjIuIE1veGFQb3J0UnhRdWV1ZShpbnQgcG9ydCk7CQkJCQkgICAgICoKKyAqCTIzLiBNb3hhUG9ydFJ4RnJlZShpbnQgcG9ydCk7CQkJCQkgICAgICoKKyAqCTI0LiBNb3hhUG9ydFR4RGlzYWJsZShpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJMjUuIE1veGFQb3J0VHhFbmFibGUoaW50IHBvcnQpOyAJCQkJICAgICAqCisgKgkyNi4gTW94YVBvcnRHZXRCcmtDbnQoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTI3LiBNb3hhUG9ydFJlc2V0QnJrQ250KGludCBwb3J0KTsJCQkJICAgICAqCisgKgkyOC4gTW94YVBvcnRTZXRYb25Yb2ZmKGludCBwb3J0LCBpbnQgeG9uVmFsdWUsIGludCB4b2ZmVmFsdWUpOwkgICAgICoKKyAqCTI5LiBNb3hhUG9ydElzVHhIb2xkKGludCBwb3J0KTsgCQkJCSAgICAgKgorICoJMzAuIE1veGFQb3J0U2VuZEJyZWFrKGludCBwb3J0LCBpbnQgdGlja3MpOwkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAgIE1veGEgUG9ydCBOdW1iZXIgRGVzY3JpcHRpb246CisgKgorICogICAgICBNT1hBIHNlcmlhbCBkcml2ZXIgc3VwcG9ydHMgdXAgdG8gNCBNT1hBLUMyMTgvQzMyMCBib2FyZHMuIEFuZCwKKyAqICAgICAgdGhlIHBvcnQgbnVtYmVyIHVzaW5nIGluIE1PWEEgZHJpdmVyIGZ1bmN0aW9ucyB3aWxsIGJlIDAgdG8gMzEgZm9yCisgKiAgICAgIGZpcnN0IE1PWEEgYm9hcmQsIDMyIHRvIDYzIGZvciBzZWNvbmQsIDY0IHRvIDk1IGZvciB0aGlyZCBhbmQgOTYKKyAqICAgICAgdG8gMTI3IGZvciBmb3VydGguIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0dXAgdGhyZWUgTU9YQSBib2FyZHMsCisgKiAgICAgIGZpcnN0IGJvYXJkIGlzIEMyMTgsIHNlY29uZCBib2FyZCBpcyBDMzIwLTE2IGFuZCB0aGlyZCBib2FyZCBpcworICogICAgICBDMzIwLTMyLiBUaGUgcG9ydCBudW1iZXIgb2YgZmlyc3QgYm9hcmQgKEMyMTggLSA4IHBvcnRzKSBpcyBmcm9tCisgKiAgICAgIDAgdG8gNy4gVGhlIHBvcnQgbnVtYmVyIG9mIHNlY29uZCBib2FyZCAoQzMyMCAtIDE2IHBvcnRzKSBpcyBmb3JtCisgKiAgICAgIDMyIHRvIDQ3LiBUaGUgcG9ydCBudW1iZXIgb2YgdGhpcmQgYm9hcmQgKEMzMjAgLSAzMiBwb3J0cykgaXMgZnJvbQorICogICAgICA2NCB0byA5NS4gQW5kIHRob3NlIHBvcnQgbnVtYmVycyBmb3JtIDggdG8gMzEsIDQ4IHRvIDYzIGFuZCA5NiB0bworICogICAgICAxMjcgd2lsbCBiZSBpbnZhbGlkLgorICoKKyAqCisgKiAgICAgIE1veGEgRnVuY3Rpb25zIERlc2NyaXB0aW9uOgorICoKKyAqICAgICAgRnVuY3Rpb24gMTogICAgIERyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lLCB0aGlzIHJvdXRpbmUgbXVzdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHdoZW4gaW5pdGlhbGl6ZWQgZHJpdmVyLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YURyaXZlckluaXQoKTsKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyOiAgICAgTW94YSBkcml2ZXIgcHJpdmF0ZSBJT0NUTCBjb21tYW5kIHByb2Nlc3NpbmcuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhRHJpdmVySW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCBwb3J0KTsKKyAqCisgKiAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCAgIDogSU9DVEwgY29tbWFuZAorICogICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnICA6IElPQ1RMIGFyZ3VtZW50CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgKE9LKQorICogICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTAorICogICAgICAgICAgICAgICAgICAgICAgLUVOT0lPQ1RMQ01ECisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzogICAgIE1veGEgZHJpdmVyIHBvbGxpbmcgcHJvY2VzcyByb3V0aW5lLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YURyaXZlclBvbGwodm9pZCk7CisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA7IHBvbGxpbmcgTy5LLgorICogICAgICAgICAgICAgICAgICAgICAgLTEgICAgICA6IG5vIGFueSBNb3hhIGNhcmQuICAgICAgICAgICAgIAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDQ6ICAgICBHZXQgdGhlIHBvcnRzIG9mIHRoaXMgY2FyZC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0c09mQ2FyZChpbnQgY2FyZG5vKTsKKyAqCisgKiAgICAgICAgICAgaW50IGNhcmRubyAgICAgICAgIDogY2FyZCBudW1iZXIgKDAgLSAzKQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiB0aGlzIGNhcmQgaXMgaW52YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgOC8xNi8yNC8zMgorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDU6ICAgICBDaGVjayB0aGlzIHBvcnQgaXMgdmFsaWQgb3IgaW52YWxpZAorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRJc1ZhbGlkKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNywgcmVmIHBvcnQgZGVzY3JpcHRpb24pCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IHRoaXMgcG9ydCBpcyBpbnZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIDogdGhpcyBwb3J0IGlzIHZhbGlkCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gNjogICAgIEVuYWJsZSB0aGlzIHBvcnQgdG8gc3RhcnQgVHgvUnggZGF0YS4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0RW5hYmxlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKgorICogICAgICBGdW5jdGlvbiA3OiAgICAgRGlzYWJsZSB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0RGlzYWJsZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gODogICAgIEdldCB0aGUgbWF4aW11biBhdmFpbGFibGUgYmF1ZCByYXRlIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBsb25nIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IHRoaXMgcG9ydCBpcyBpbnZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICAzODQwMC81NzYwMC8xMTUyMDAgYnBzCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gOTogICAgIEdldCB0aGUgY3VycmVudCBiYXVkIHJhdGUgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGxvbmcgTW94YVBvcnRHZXRDdXJCYXVkKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIDUwIC0gMTE1MjAwIGJwcworICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDEwOiAgICBTZXR0aW5nIGJhdWQgcmF0ZSBvZiB0aGlzIHBvcnQuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgbG9uZyBNb3hhUG9ydFNldEJhdWQoaW50IHBvcnQsIGxvbmcgYmF1ZCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgbG9uZyBiYXVkICAgICAgICAgIDogYmF1ZCByYXRlICg1MCAtIDExNTIwMCkKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQgb3IgYmF1ZCA8IDUwCisgKiAgICAgICAgICAgICAgICAgICAgICA1MCAtIDExNTIwMCA6IHRoZSByZWFsIGJhdWQgcmF0ZSBzZXQgdG8gdGhlIHBvcnQsIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcmd1bWVudCBiYXVkIGlzIGxhcmdlIHRoYW4gbWF4aW11bgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgYmF1ZCByYXRlLCB0aGUgcmVhbCBzZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdWQgcmF0ZSB3aWxsIGJlIHRoZSBtYXhpbXVuIGJhdWQgcmF0ZS4KKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxMTogICAgU2V0dGluZyB0aGUgZGF0YS1iaXRzL3N0b3AtYml0cy9wYXJpdHkgb2YgdGhpcyBwb3J0CisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFNldE1vZGUoaW50IHBvcnQsIGludCBkYXRhYml0cywgaW50IHN0b3BiaXRzLCBpbnQgcGFyaXR5KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgZGF0YWJpdHMgICAgICAgOiBkYXRhIGJpdHMgKDgvNy82LzUpCisgKiAgICAgICAgICAgaW50IHN0b3BiaXRzICAgICAgIDogc3RvcCBiaXRzICgyLzEvMCwgMCBzaG93IDEuNSBzdG9wIGJpdHMpCisgaW50IHBhcml0eSAgICAgOiBwYXJpdHkgKDA6Tm9uZSwxOk9kZCwyOkV2ZW4sMzpNYXJrLDQ6U3BhY2UpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLTEgICAgICA6IGludmFsaWQgcGFyYW1ldGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAwICAgICAgIDogc2V0dGluZyBPLksuCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTI6ICAgIENvbmZpZ3VyZSB0aGUgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0U2V0VGVybWlvKGludCBwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqIHRlcm1pbyA6IHRlcm1pbyBzdHJ1Y3R1cmUgcG9pbnRlcgorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC0xICAgICAgOiB0aGlzIHBvcnQgaXMgaW52YWxpZCBvciB0ZXJtaW8gPT0gTlVMTAorICogICAgICAgICAgICAgICAgICAgICAgMCAgICAgICA6IHNldHRpbmcgTy5LLgorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDEzOiAgICBHZXQgdGhlIERUUi9SVFMgc3RhdGUgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRHZXRMaW5lT3V0KGludCBwb3J0LCBpbnQgKmR0clN0YXRlLCBpbnQgKnJ0c1N0YXRlKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgKiBkdHJTdGF0ZSAgICAgOiBwb2ludGVyIHRvIElOVCB0byByZWNlaXZlIHRoZSBjdXJyZW50IERUUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLiAoaWYgTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRvIHRoaXMgYWRkcmVzcykKKyAqICAgICAgICAgICBpbnQgKiBydHNTdGF0ZSAgICAgOiBwb2ludGVyIHRvIElOVCB0byByZWNlaXZlIHRoZSBjdXJyZW50IFJUUworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLiAoaWYgTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRvIHRoaXMgYWRkcmVzcykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAtMSAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgOiBPLksuCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTQ6ICAgIFNldHRpbmcgdGhlIERUUi9SVFMgb3V0cHV0IHN0YXRlIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0TGluZUN0cmwoaW50IHBvcnQsIGludCBkdHJTdGF0ZSwgaW50IHJ0c1N0YXRlKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgZHRyU3RhdGUgICAgICAgOiBEVFIgb3V0cHV0IHN0YXRlICgwOiBvZmYsIDE6IG9uKQorICogICAgICAgICAgIGludCBydHNTdGF0ZSAgICAgICA6IFJUUyBvdXRwdXQgc3RhdGUgKDA6IG9mZiwgMTogb24pCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTU6ICAgIFNldHRpbmcgdGhlIGZsb3cgY29udHJvbCBvZiB0aGlzIHBvcnQuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhUG9ydEZsb3dDdHJsKGludCBwb3J0LCBpbnQgcnRzRmxvdywgaW50IGN0c0Zsb3csIGludCByeEZsb3csCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHhGbG93LGludCB4YW55KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgcnRzRmxvdyAgICAgICAgOiBIL1cgUlRTIGZsb3cgY29udHJvbCAoMDogbm8sIDE6IHllcykKKyAqICAgICAgICAgICBpbnQgY3RzRmxvdyAgICAgICAgOiBIL1cgQ1RTIGZsb3cgY29udHJvbCAoMDogbm8sIDE6IHllcykKKyAqICAgICAgICAgICBpbnQgcnhGbG93ICAgICAgICAgOiBTL1cgUnggWE9OL1hPRkYgZmxvdyBjb250cm9sICgwOiBubywgMTogeWVzKQorICogICAgICAgICAgIGludCB0eEZsb3cgICAgICAgICA6IFMvVyBUeCBYT04vWE9GRiBmbG93IGNvbnRyb2wgKDA6IG5vLCAxOiB5ZXMpCisgKiAgICAgICAgICAgaW50IHhhbnkgICAgICAgICAgIDogUy9XIFhBTlkgZmxvdyBjb250cm9sICgwOiBubywgMTogeWVzKQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDE2OiAgICBHZXQgdGhzIGxpbmUgc3RhdHVzIG9mIHRoaXMgcG9ydAorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRMaW5lU3RhdHVzKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICBCaXQgMCAtIENUUyBzdGF0ZSAoMDogb2ZmLCAxOiBvbikKKyAqICAgICAgICAgICAgICAgICAgICAgIEJpdCAxIC0gRFNSIHN0YXRlICgwOiBvZmYsIDE6IG9uKQorICogICAgICAgICAgICAgICAgICAgICAgQml0IDIgLSBEQ0Qgc3RhdGUgKDA6IG9mZiwgMTogb24pCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTc6ICAgIENoZWNrIHRoZSBEQ0Qgc3RhdGUgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgcmVhZAorICogICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmdW5jdGlvbi4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0RENEQ2hhbmdlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogbm8gY2hhbmdlZAorICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICA6IERDRCBoYXMgY2hhbmdlZAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDE4OiAgICBDaGVjayB0aHMgY3VycmVudCBEQ0Qgc3RhdGUgaXMgT04gb3Igbm90LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnREQ0RPTihpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IERDRCBvZmYKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiBEQ0Qgb24KKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxOTogICAgRmx1c2ggdGhlIFJ4L1R4IGJ1ZmZlciBkYXRhIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgaW50IG1vZGUgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAwICAgICAgIDogZmx1c2ggdGhlIFJ4IGJ1ZmZlciAKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiBmbHVzaCB0aGUgVHggYnVmZmVyIAorICogICAgICAgICAgICAgICAgICAgICAgMiAgICAgICA6IGZsdXNoIHRoZSBSeCBhbmQgVHggYnVmZmVyIAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDIwOiAgICBXcml0ZSBkYXRhLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRXcml0ZURhdGEoaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIGludCBsZW5ndGgpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIgICAgIDogcG9pbnRlciB0byB3cml0ZSBkYXRhIGJ1ZmZlci4KKyAqICAgICAgICAgICBpbnQgbGVuZ3RoICAgICAgICAgOiB3cml0ZSBkYXRhIGxlbmd0aAorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgLSBsZW5ndGggICAgICA6IHJlYWwgd3JpdGUgZGF0YSBsZW5ndGgKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyMTogICAgUmVhZCBkYXRhLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRSZWFkRGF0YShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciAgICAgOiBwb2ludGVyIHRvIHJlYWQgZGF0YSBidWZmZXIuCisgKiAgICAgICAgICAgaW50IGxlbmd0aCAgICAgICAgIDogcmVhZCBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwIC0gbGVuZ3RoICAgICAgOiByZWFsIHJlYWQgZGF0YSBsZW5ndGgKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyMjogICAgR2V0IHRoZSBUeCBidWZmZXIgc2l6ZSBvZiB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0VHhCdWZTaXplKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogVHggYnVmZmVyIHNpemUKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyMzogICAgR2V0IHRoZSBSeCBidWZmZXIgc2l6ZSBvZiB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0UnhCdWZTaXplKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogUnggYnVmZmVyIHNpemUKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNDogICAgR2V0IHRoZSBUeCBidWZmZXIgY3VycmVudCBxdWV1ZWQgZGF0YSBieXRlcworICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRUeFF1ZXVlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogVHggYnVmZmVyIGN1cnJlbnQgcXVldWVkIGRhdGEgYnl0ZXMKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNTogICAgR2V0IHRoZSBUeCBidWZmZXIgY3VycmVudCBmcmVlIHNwYWNlCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFR4RnJlZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLi4gICAgICA6IFR4IGJ1ZmZlciBjdXJyZW50IGZyZWUgc3BhY2UKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNjogICAgR2V0IHRoZSBSeCBidWZmZXIgY3VycmVudCBxdWV1ZWQgZGF0YSBieXRlcworICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRSeFF1ZXVlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogUnggYnVmZmVyIGN1cnJlbnQgcXVldWVkIGRhdGEgYnl0ZXMKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNzogICAgR2V0IHRoZSBSeCBidWZmZXIgY3VycmVudCBmcmVlIHNwYWNlCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFJ4RnJlZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLi4gICAgICA6IFJ4IGJ1ZmZlciBjdXJyZW50IGZyZWUgc3BhY2UKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyODogICAgRGlzYWJsZSBwb3J0IGRhdGEgdHJhbnNtaXNzaW9uLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRUeERpc2FibGUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI5OiAgICBFbmFibGUgcG9ydCBkYXRhIHRyYW5zbWlzc2lvbi4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0VHhFbmFibGUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDMwOiAgICBHZXQgdGhlIHJlY2VpdmVkIEJSRUFLIHNpZ25hbCBjb3VudC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0R2V0QnJrQ250KGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwIC0gLi4gIDogQlJFQUsgc2lnbmFsIGNvdW50CisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzE6ICAgIEdldCB0aGUgcmVjZWl2ZWQgQlJFQUsgc2lnbmFsIGNvdW50IGFuZCByZXNldCBpdC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0UmVzZXRCcmtDbnQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgLSAuLiAgOiBCUkVBSyBzaWduYWwgY291bnQKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzMjogICAgU2V0IHRoZSBTL1cgZmxvdyBjb250cm9sIG5ldyBYT04vWE9GRiB2YWx1ZSwgZGVmYXVsdAorICogICAgICAgICAgICAgICAgICAgICAgWE9OIGlzIDB4MTEgJiBYT0ZGIGlzIDB4MTMuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhUG9ydFNldFhvblhvZmYoaW50IHBvcnQsIGludCB4b25WYWx1ZSwgaW50IHhvZmZWYWx1ZSk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgaW50IHhvblZhbHVlICAgICAgIDogbmV3IFhPTiB2YWx1ZSAoMCAtIDI1NSkKKyAqICAgICAgICAgICBpbnQgeG9mZlZhbHVlICAgICAgOiBuZXcgWE9GRiB2YWx1ZSAoMCAtIDI1NSkKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzMzogICAgQ2hlY2sgdGhpcyBwb3J0J3MgdHJhbnNtaXNzaW9uIGlzIGhvbGQgYnkgcmVtb3RlIHNpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIGZsb3cgY29udHJvbC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0SXNUeEhvbGQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiBub3JtYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiBob2xkIGJ5IHJlbW90ZSBzaXRlCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzQ6ICAgIFNlbmQgb3V0IGEgQlJFQUsgc2lnbmFsLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRTZW5kQnJlYWsoaW50IHBvcnQsIGludCBtczEwMCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgaW50IG1zMTAwICAgICAgICAgIDogYnJlYWsgc2lnbmFsIHRpbWUgaW50ZXJ2YWwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogMTAwIG1pbmktc2Vjb25kLiBpZiBtczEwMCA9PSAwLCBpdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCBvdXQgYSBhYm91dCAyNTAgbXMgQlJFQUsgc2lnbmFsLgorICoKKyAqLworaW50IE1veGFQb3J0SXNWYWxpZChpbnQgcG9ydCkKK3sKKworCWlmIChtb3hhQ2FyZCA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmIChtb3hhQ2hrUG9ydFtwb3J0XSA9PSAwKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoMSk7Cit9CisKK3ZvaWQgTW94YVBvcnRFbmFibGUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWludCBNb3hhUG9ydExpbmVTdGF0dXMoaW50KTsKKwlzaG9ydCBsb3d3YXRlciA9IDUxMjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXdyaXRldyhsb3d3YXRlciwgb2ZzQWRkciArIExvd193YXRlcik7CisJbW94YUJyZWFrQ250W3BvcnRdID0gMDsKKwlpZiAoKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX0lTQSkgfHwKKwkgICAgKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX1BDSSkpIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0QnJlYWtJcnEsIDApOworCX0gZWxzZSB7CisJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgSG9zdFN0YXQpIHwgV2FrZXVwQnJlYWssIG9mc0FkZHIgKyBIb3N0U3RhdCk7CisJfQorCisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0TGluZUlycSwgTWFnaWNfY29kZSk7CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfRmx1c2hRdWV1ZSwgMik7CisKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19FbmFibGVDSCwgTWFnaWNfY29kZSk7CisJTW94YVBvcnRMaW5lU3RhdHVzKHBvcnQpOworfQorCit2b2lkIE1veGFQb3J0RGlzYWJsZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0Rmxvd0N0bCwgMCk7CS8qIGRpc2FibGUgZmxvdyBjb250cm9sICovCisJbW94YWZ1bmMob2ZzQWRkciwgRkNfQ2xyTGluZUlycSwgTWFnaWNfY29kZSk7CisJd3JpdGV3KDAsIG9mc0FkZHIgKyBIb3N0U3RhdCk7CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfRGlzYWJsZUNILCBNYWdpY19jb2RlKTsKK30KKworbG9uZyBNb3hhUG9ydEdldE1heEJhdWQoaW50IHBvcnQpCit7CisJaWYgKChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpIHx8CisJICAgIChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9QQ0kpKQorCQlyZXR1cm4gKDQ2MDgwMEwpOworCWVsc2UKKwkJcmV0dXJuICg5MjE2MDBMKTsKK30KKworCitsb25nIE1veGFQb3J0U2V0QmF1ZChpbnQgcG9ydCwgbG9uZyBiYXVkKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlsb25nIG1heCwgY2xvY2s7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICgoYmF1ZCA8IDUwTCkgfHwgKChtYXggPSBNb3hhUG9ydEdldE1heEJhdWQocG9ydCkpID09IDApKQorCQlyZXR1cm4gKDApOworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWlmIChiYXVkID4gbWF4KQorCQliYXVkID0gbWF4OworCWlmIChtYXggPT0gMzg0MDBMKQorCQljbG9jayA9IDYxNDQwMEw7CS8qIGZvciA5LjgzMDQgTWh6IDogbWF4LiAzODQwMCBicHMgKi8KKwllbHNlIGlmIChtYXggPT0gNTc2MDBMKQorCQljbG9jayA9IDY5MTIwMEw7CS8qIGZvciAxMS4wNTkyIE1oeiA6IG1heC4gNTc2MDAgYnBzICovCisJZWxzZQorCQljbG9jayA9IDkyMTYwMEw7CS8qIGZvciAxNC43NDU2IE1oeiA6IG1heC4gMTE1MjAwIGJwcyAqLworCXZhbCA9IGNsb2NrIC8gYmF1ZDsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRCYXVkLCB2YWwpOworCWJhdWQgPSBjbG9jayAvIHZhbDsKKwltb3hhQ3VyQmF1ZFtwb3J0XSA9IGJhdWQ7CisJcmV0dXJuIChiYXVkKTsKK30KKworaW50IE1veGFQb3J0U2V0VGVybWlvKGludCBwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl0Y2ZsYWdfdCBjZmxhZzsKKwlsb25nIGJhdWQ7CisJdGNmbGFnX3QgbW9kZSA9IDA7CisKKwlpZiAobW94YUNoa1BvcnRbcG9ydF0gPT0gMCB8fCB0ZXJtaW8gPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJY2ZsYWcgPSB0ZXJtaW8tPmNfY2ZsYWc7CS8qIHRlcm1pby0+Y19jZmxhZyAqLworCisJbW9kZSA9IHRlcm1pby0+Y19jZmxhZyAmIENTSVpFOworCWlmIChtb2RlID09IENTNSkKKwkJbW9kZSA9IE1YX0NTNTsKKwllbHNlIGlmIChtb2RlID09IENTNikKKwkJbW9kZSA9IE1YX0NTNjsKKwllbHNlIGlmIChtb2RlID09IENTNykKKwkJbW9kZSA9IE1YX0NTNzsKKwllbHNlIGlmIChtb2RlID09IENTOCkKKwkJbW9kZSA9IE1YX0NTODsKKworCWlmICh0ZXJtaW8tPmNfY2ZsYWcgJiBDU1RPUEIpIHsKKwkJaWYgKG1vZGUgPT0gTVhfQ1M1KQorCQkJbW9kZSB8PSBNWF9TVE9QMTU7CisJCWVsc2UKKwkJCW1vZGUgfD0gTVhfU1RPUDI7CisJfSBlbHNlCisJCW1vZGUgfD0gTVhfU1RPUDE7CisKKwlpZiAodGVybWlvLT5jX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmICh0ZXJtaW8tPmNfY2ZsYWcgJiBQQVJPREQpCisJCQltb2RlIHw9IE1YX1BBUk9ERDsKKwkJZWxzZQorCQkJbW9kZSB8PSBNWF9QQVJFVkVOOworCX0gZWxzZQorCQltb2RlIHw9IE1YX1BBUk5PTkU7CisKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXREYXRhTW9kZSwgKHVzaG9ydCkgbW9kZSk7CisKKwljZmxhZyAmPSAoQ0JBVUQgfCBDQkFVREVYKTsKKyNpZm5kZWYgQjkyMTYwMAorI2RlZmluZQlCOTIxNjAwCShCNDYwODAwKzEpCisjZW5kaWYKKwlzd2l0Y2ggKGNmbGFnKSB7CisJY2FzZSBCOTIxNjAwOgorCQliYXVkID0gOTIxNjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCNDYwODAwOgorCQliYXVkID0gNDYwODAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMjMwNDAwOgorCQliYXVkID0gMjMwNDAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMTE1MjAwOgorCQliYXVkID0gMTE1MjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCNTc2MDA6CisJCWJhdWQgPSA1NzYwMEw7CisJCWJyZWFrOworCWNhc2UgQjM4NDAwOgorCQliYXVkID0gMzg0MDBMOworCQlicmVhazsKKwljYXNlIEIxOTIwMDoKKwkJYmF1ZCA9IDE5MjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCOTYwMDoKKwkJYmF1ZCA9IDk2MDBMOworCQlicmVhazsKKwljYXNlIEI0ODAwOgorCQliYXVkID0gNDgwMEw7CisJCWJyZWFrOworCWNhc2UgQjI0MDA6CisJCWJhdWQgPSAyNDAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMTgwMDoKKwkJYmF1ZCA9IDE4MDBMOworCQlicmVhazsKKwljYXNlIEIxMjAwOgorCQliYXVkID0gMTIwMEw7CisJCWJyZWFrOworCWNhc2UgQjYwMDoKKwkJYmF1ZCA9IDYwMEw7CisJCWJyZWFrOworCWNhc2UgQjMwMDoKKwkJYmF1ZCA9IDMwMEw7CisJCWJyZWFrOworCWNhc2UgQjIwMDoKKwkJYmF1ZCA9IDIwMEw7CisJCWJyZWFrOworCWNhc2UgQjE1MDoKKwkJYmF1ZCA9IDE1MEw7CisJCWJyZWFrOworCWNhc2UgQjEzNDoKKwkJYmF1ZCA9IDEzNEw7CisJCWJyZWFrOworCWNhc2UgQjExMDoKKwkJYmF1ZCA9IDExMEw7CisJCWJyZWFrOworCWNhc2UgQjc1OgorCQliYXVkID0gNzVMOworCQlicmVhazsKKwljYXNlIEI1MDoKKwkJYmF1ZCA9IDUwTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmF1ZCA9IDA7CisJfQorCWlmICgobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSB8fAorCSAgICAobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfUENJKSkgeworCQlpZiAoYmF1ZCA9PSA5MjE2MDBMKQorCQkJcmV0dXJuICgtMSk7CisJfQorCU1veGFQb3J0U2V0QmF1ZChwb3J0LCBiYXVkKTsKKworCWlmICh0ZXJtaW8tPmNfaWZsYWcgJiAoSVhPTiB8IElYT0ZGIHwgSVhBTlkpKSB7CisJCXdyaXRlYih0ZXJtaW8tPmNfY2NbVlNUQVJUXSwgb2ZzQWRkciArIEZ1bmNBcmcpOworCQl3cml0ZWIodGVybWlvLT5jX2NjW1ZTVE9QXSwgb2ZzQWRkciArIEZ1bmNBcmcxKTsKKwkJd3JpdGViKEZDX1NldFhvblhvZmYsIG9mc0FkZHIgKyBGdW5jQ29kZSk7CisJCXdhaXRfZmluaXNoKG9mc0FkZHIpOworCisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludCBNb3hhUG9ydEdldExpbmVPdXQoaW50IHBvcnQsIGludCAqZHRyU3RhdGUsIGludCAqcnRzU3RhdGUpCit7CisKKwlpZiAoIU1veGFQb3J0SXNWYWxpZChwb3J0KSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKGR0clN0YXRlKSB7CisJCWlmIChtb3hhTGluZUN0cmxbcG9ydF0gJiBEVFJfT04pCisJCQkqZHRyU3RhdGUgPSAxOworCQllbHNlCisJCQkqZHRyU3RhdGUgPSAwOworCX0KKwlpZiAocnRzU3RhdGUpIHsKKwkJaWYgKG1veGFMaW5lQ3RybFtwb3J0XSAmIFJUU19PTikKKwkJCSpydHNTdGF0ZSA9IDE7CisJCWVsc2UKKwkJCSpydHNTdGF0ZSA9IDA7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgTW94YVBvcnRMaW5lQ3RybChpbnQgcG9ydCwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IG1vZGU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb2RlID0gMDsKKwlpZiAoZHRyKQorCQltb2RlIHw9IERUUl9PTjsKKwlpZiAocnRzKQorCQltb2RlIHw9IFJUU19PTjsKKwltb3hhTGluZUN0cmxbcG9ydF0gPSBtb2RlOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX0xpbmVDb250cm9sLCBtb2RlKTsKK30KKwordm9pZCBNb3hhUG9ydEZsb3dDdHJsKGludCBwb3J0LCBpbnQgcnRzLCBpbnQgY3RzLCBpbnQgdHhmbG93LCBpbnQgcnhmbG93LCBpbnQgdHhhbnkpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWludCBtb2RlOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJbW9kZSA9IDA7CisJaWYgKHJ0cykKKwkJbW9kZSB8PSBSVFNfRmxvd0N0bDsKKwlpZiAoY3RzKQorCQltb2RlIHw9IENUU19GbG93Q3RsOworCWlmICh0eGZsb3cpCisJCW1vZGUgfD0gVHhfRmxvd0N0bDsKKwlpZiAocnhmbG93KQorCQltb2RlIHw9IFJ4X0Zsb3dDdGw7CisJaWYgKHR4YW55KQorCQltb2RlIHw9IElYTV9JWEFOWTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRGbG93Q3RsLCBtb2RlKTsKK30KKworaW50IE1veGFQb3J0TGluZVN0YXR1cyhpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IHZhbDsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWlmICgobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSB8fAorCSAgICAobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfUENJKSkgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19MaW5lU3RhdHVzLCAwKTsKKwkJdmFsID0gcmVhZHcob2ZzQWRkciArIEZ1bmNBcmcpOworCX0gZWxzZSB7CisJCXZhbCA9IHJlYWR3KG9mc0FkZHIgKyBGbGFnU3RhdCkgPj4gNDsKKwl9CisJdmFsICY9IDB4MEI7CisJaWYgKHZhbCAmIDgpIHsKKwkJdmFsIHw9IDQ7CisJCWlmICgobW94YURDRFN0YXRlW3BvcnRdICYgRENEX29sZHN0YXRlKSA9PSAwKQorCQkJbW94YURDRFN0YXRlW3BvcnRdID0gKERDRF9vbGRzdGF0ZSB8IERDRF9jaGFuZ2VkKTsKKwl9IGVsc2UgeworCQlpZiAobW94YURDRFN0YXRlW3BvcnRdICYgRENEX29sZHN0YXRlKQorCQkJbW94YURDRFN0YXRlW3BvcnRdID0gRENEX2NoYW5nZWQ7CisJfQorCXZhbCAmPSA3OworCXJldHVybiAodmFsKTsKK30KKworaW50IE1veGFQb3J0RENEQ2hhbmdlKGludCBwb3J0KQoreworCWludCBuOworCisJaWYgKG1veGFDaGtQb3J0W3BvcnRdID09IDApCisJCXJldHVybiAoMCk7CisJbiA9IG1veGFEQ0RTdGF0ZVtwb3J0XTsKKwltb3hhRENEU3RhdGVbcG9ydF0gJj0gfkRDRF9jaGFuZ2VkOworCW4gJj0gRENEX2NoYW5nZWQ7CisJcmV0dXJuIChuKTsKK30KKworaW50IE1veGFQb3J0RENET04oaW50IHBvcnQpCit7CisJaW50IG47CisKKwlpZiAobW94YUNoa1BvcnRbcG9ydF0gPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlpZiAobW94YURDRFN0YXRlW3BvcnRdICYgRENEX29sZHN0YXRlKQorCQluID0gMTsKKwllbHNlCisJCW4gPSAwOworCXJldHVybiAobik7Cit9CisKKworLyoKKyAgIGludCBNb3hhRHVtcE1lbShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbikKKyAgIHsKKyAgIGludCAgICAgICAgICBpOworICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBiYXNlQWRkcixvZnNBZGRyLG9mczsKKworICAgYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdOworICAgb2ZzID0gYmFzZUFkZHIgKyBEeW5QYWdlX2FkZHIgKyBwYWdlb2ZzOworICAgaWYgKGxlbiA+IDB4MjAwMEwpCisgICBsZW4gPSAweDIwMDBMOworICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgYnVmZmVyW2ldID0gcmVhZGIob2ZzK2kpOworICAgfQorICovCisKKworaW50IE1veGFQb3J0V3JpdGVEYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBjLCB0b3RhbCwgaTsKKwl1c2hvcnQgdGFpbDsKKwlpbnQgY250OworCXVzaG9ydCBoZWFkLCB0eF9tYXNrLCBzcGFnZSwgZXBhZ2U7CisJdXNob3J0IHBhZ2VubywgcGFnZW9mcywgYnVmaGVhZDsKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyLCAqb2ZzQWRkciwgKm9mczsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWJhc2VBZGRyID0gbW94YUJhc2VBZGRyW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXTsKKwl0eF9tYXNrID0gcmVhZHcob2ZzQWRkciArIFRYX21hc2spOworCXNwYWdlID0gcmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKTsKKwllcGFnZSA9IHJlYWR3KG9mc0FkZHIgKyBFbmRQYWdlX3R4Yik7CisJdGFpbCA9IHJlYWR3KG9mc0FkZHIgKyBUWHdwdHIpOworCWhlYWQgPSByZWFkdyhvZnNBZGRyICsgVFhycHRyKTsKKwljID0gKGhlYWQgPiB0YWlsKSA/IChoZWFkIC0gdGFpbCAtIDEpCisJICAgIDogKGhlYWQgLSB0YWlsICsgdHhfbWFzayk7CisJaWYgKGMgPiBsZW4pCisJCWMgPSBsZW47CisJbW94YUxvZy50eGNudFtwb3J0XSArPSBjOworCXRvdGFsID0gYzsKKwlpZiAoc3BhZ2UgPT0gZXBhZ2UpIHsKKwkJYnVmaGVhZCA9IHJlYWR3KG9mc0FkZHIgKyBPZnNfdHhiKTsKKwkJd3JpdGV3KHNwYWdlLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsKKwkJd2hpbGUgKGMgPiAwKSB7CisJCQlpZiAoaGVhZCA+IHRhaWwpCisJCQkJbGVuID0gaGVhZCAtIHRhaWwgLSAxOworCQkJZWxzZQorCQkJCWxlbiA9IHR4X21hc2sgKyAxIC0gdGFpbDsKKwkJCWxlbiA9IChjID4gbGVuKSA/IGxlbiA6IGM7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIGJ1ZmhlYWQgKyB0YWlsOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCXdyaXRlYigqYnVmZmVyKyssIG9mcyArIGkpOworCQkJdGFpbCA9ICh0YWlsICsgbGVuKSAmIHR4X21hc2s7CisJCQljIC09IGxlbjsKKwkJfQorCQl3cml0ZXcodGFpbCwgb2ZzQWRkciArIFRYd3B0cik7CisJfSBlbHNlIHsKKwkJbGVuID0gYzsKKwkJcGFnZW5vID0gc3BhZ2UgKyAodGFpbCA+PiAxMyk7CisJCXBhZ2VvZnMgPSB0YWlsICYgUGFnZV9tYXNrOworCQlkbyB7CisJCQljbnQgPSBQYWdlX3NpemUgLSBwYWdlb2ZzOworCQkJaWYgKGNudCA+IGMpCisJCQkJY250ID0gYzsKKwkJCWMgLT0gY250OworCQkJd3JpdGViKHBhZ2VubywgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIHBhZ2VvZnM7CisJCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQkJd3JpdGViKCpidWZmZXIrKywgb2ZzICsgaSk7CisJCQlpZiAoYyA9PSAwKSB7CisJCQkJd3JpdGV3KCh0YWlsICsgbGVuKSAmIHR4X21hc2ssIG9mc0FkZHIgKyBUWHdwdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCsrcGFnZW5vID09IGVwYWdlKQorCQkJCXBhZ2VubyA9IHNwYWdlOworCQkJcGFnZW9mcyA9IDA7CisJCX0gd2hpbGUgKDEpOworCX0KKwl3cml0ZWIoMSwgb2ZzQWRkciArIENEMTgwVFhpcnEpOwkvKiBzdGFydCB0byBzZW5kICovCisJcmV0dXJuICh0b3RhbCk7Cit9CisKK2ludCBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgc3BhY2UpCit7CisJcmVnaXN0ZXIgdXNob3J0IGhlYWQsIHBhZ2VvZnM7CisJaW50IGksIGNvdW50LCBjbnQsIGxlbiwgdG90YWwsIHJlbWFpbjsKKwl1c2hvcnQgdGFpbCwgcnhfbWFzaywgc3BhZ2UsIGVwYWdlOworCXVzaG9ydCBwYWdlbm8sIGJ1ZmhlYWQ7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkciwgKm9mc0FkZHIsICpvZnM7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwliYXNlQWRkciA9IG1veGFCYXNlQWRkcltwb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF07CisJaGVhZCA9IHJlYWR3KG9mc0FkZHIgKyBSWHJwdHIpOworCXRhaWwgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwlyeF9tYXNrID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCXNwYWdlID0gcmVhZHcob2ZzQWRkciArIFBhZ2VfcnhiKTsKKwllcGFnZSA9IHJlYWR3KG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJY291bnQgPSAodGFpbCA+PSBoZWFkKSA/ICh0YWlsIC0gaGVhZCkKKwkgICAgOiAodGFpbCAtIGhlYWQgKyByeF9tYXNrICsgMSk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAoMCk7CisKKwl0b3RhbCA9IChzcGFjZSA+IGNvdW50KSA/IGNvdW50IDogc3BhY2U7CisJcmVtYWluID0gY291bnQgLSB0b3RhbDsKKwltb3hhTG9nLnJ4Y250W3BvcnRdICs9IHRvdGFsOworCWNvdW50ID0gdG90YWw7CisJaWYgKHNwYWdlID09IGVwYWdlKSB7CisJCWJ1ZmhlYWQgPSByZWFkdyhvZnNBZGRyICsgT2ZzX3J4Yik7CisJCXdyaXRldyhzcGFnZSwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCWlmICh0YWlsID49IGhlYWQpCisJCQkJbGVuID0gdGFpbCAtIGhlYWQ7CisJCQllbHNlCisJCQkJbGVuID0gcnhfbWFzayArIDEgLSBoZWFkOworCQkJbGVuID0gKGNvdW50ID4gbGVuKSA/IGxlbiA6IGNvdW50OworCQkJb2ZzID0gYmFzZUFkZHIgKyBEeW5QYWdlX2FkZHIgKyBidWZoZWFkICsgaGVhZDsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQkqYnVmZmVyKysgPSByZWFkYihvZnMgKyBpKTsKKwkJCWhlYWQgPSAoaGVhZCArIGxlbikgJiByeF9tYXNrOworCQkJY291bnQgLT0gbGVuOworCQl9CisJCXdyaXRldyhoZWFkLCBvZnNBZGRyICsgUlhycHRyKTsKKwl9IGVsc2UgeworCQlsZW4gPSBjb3VudDsKKwkJcGFnZW5vID0gc3BhZ2UgKyAoaGVhZCA+PiAxMyk7CisJCXBhZ2VvZnMgPSBoZWFkICYgUGFnZV9tYXNrOworCQlkbyB7CisJCQljbnQgPSBQYWdlX3NpemUgLSBwYWdlb2ZzOworCQkJaWYgKGNudCA+IGNvdW50KQorCQkJCWNudCA9IGNvdW50OworCQkJY291bnQgLT0gY250OworCQkJd3JpdGV3KHBhZ2VubywgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIHBhZ2VvZnM7CisJCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQkJKmJ1ZmZlcisrID0gcmVhZGIob2ZzICsgaSk7CisJCQlpZiAoY291bnQgPT0gMCkgeworCQkJCXdyaXRldygoaGVhZCArIGxlbikgJiByeF9tYXNrLCBvZnNBZGRyICsgUlhycHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgrK3BhZ2VubyA9PSBlcGFnZSkKKwkJCQlwYWdlbm8gPSBzcGFnZTsKKwkJCXBhZ2VvZnMgPSAwOworCQl9IHdoaWxlICgxKTsKKwl9CisJaWYgKChyZWFkYihvZnNBZGRyICsgRmxhZ1N0YXQpICYgWG9mZl9zdGF0ZSkgJiYgKHJlbWFpbiA8IExvd1dhdGVyKSkgeworCQltb3hhTG93V2F0ZXJDaGsgPSAxOworCQltb3hhTG93Q2hrRmxhZ1twb3J0XSA9IDE7CisJfQorCXJldHVybiAodG90YWwpOworfQorCisKK2ludCBNb3hhUG9ydFR4UXVldWUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXVzaG9ydCBycHRyLCB3cHRyLCBtYXNrOworCWludCBsZW47CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlycHRyID0gcmVhZHcob2ZzQWRkciArIFRYcnB0cik7CisJd3B0ciA9IHJlYWR3KG9mc0FkZHIgKyBUWHdwdHIpOworCW1hc2sgPSByZWFkdyhvZnNBZGRyICsgVFhfbWFzayk7CisJbGVuID0gKHdwdHIgLSBycHRyKSAmIG1hc2s7CisJcmV0dXJuIChsZW4pOworfQorCitpbnQgTW94YVBvcnRUeEZyZWUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXVzaG9ydCBycHRyLCB3cHRyLCBtYXNrOworCWludCBsZW47CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlycHRyID0gcmVhZHcob2ZzQWRkciArIFRYcnB0cik7CisJd3B0ciA9IHJlYWR3KG9mc0FkZHIgKyBUWHdwdHIpOworCW1hc2sgPSByZWFkdyhvZnNBZGRyICsgVFhfbWFzayk7CisJbGVuID0gbWFzayAtICgod3B0ciAtIHJwdHIpICYgbWFzayk7CisJcmV0dXJuIChsZW4pOworfQorCitpbnQgTW94YVBvcnRSeFF1ZXVlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl1c2hvcnQgcnB0ciwgd3B0ciwgbWFzazsKKwlpbnQgbGVuOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJcnB0ciA9IHJlYWR3KG9mc0FkZHIgKyBSWHJwdHIpOworCXdwdHIgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwltYXNrID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCWxlbiA9ICh3cHRyIC0gcnB0cikgJiBtYXNrOworCXJldHVybiAobGVuKTsKK30KKworCit2b2lkIE1veGFQb3J0VHhEaXNhYmxlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFhvZmZTdGF0ZSwgTWFnaWNfY29kZSk7Cit9CisKK3ZvaWQgTW94YVBvcnRUeEVuYWJsZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRYb25TdGF0ZSwgTWFnaWNfY29kZSk7Cit9CisKKworaW50IE1veGFQb3J0UmVzZXRCcmtDbnQoaW50IHBvcnQpCit7CisJdXNob3J0IGNudDsKKwljbnQgPSBtb3hhQnJlYWtDbnRbcG9ydF07CisJbW94YUJyZWFrQ250W3BvcnRdID0gMDsKKwlyZXR1cm4gKGNudCk7Cit9CisKKwordm9pZCBNb3hhUG9ydFNlbmRCcmVhayhpbnQgcG9ydCwgaW50IG1zMTAwKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWlmIChtczEwMCkgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZW5kQnJlYWssIE1hZ2ljX2NvZGUpOworCQltb3hhZGVsYXkobXMxMDAgKiAoSFogLyAxMCkpOworCX0gZWxzZSB7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NlbmRCcmVhaywgTWFnaWNfY29kZSk7CisJCW1veGFkZWxheShIWiAvIDQpOwkvKiAyNTAgbXMgKi8KKwl9CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU3RvcEJyZWFrLCBNYWdpY19jb2RlKTsKK30KKworc3RhdGljIGludCBtb3hhX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbW94YV9zdHIgKmluZm8sCisJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnR5cGUgPSBpbmZvLT50eXBlOworCXRtcC5saW5lID0gaW5mby0+cG9ydDsKKwl0bXAucG9ydCA9IDA7CisJdG1wLmlycSA9IDA7CisJdG1wLmZsYWdzID0gaW5mby0+YXN5bmNmbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gOTIxNjAwOworCXRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OworCXRtcC5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQ7CisJdG1wLmN1c3RvbV9kaXZpc29yID0gMDsKKwl0bXAuaHViNiA9IDA7CisJaWYoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gKDApOworfQorCisKK3N0YXRpYyBpbnQgbW94YV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IG1veGFfc3RyICppbmZvLAorCQkJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdfaW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKG5ld19zZXJpYWwuaXJxICE9IDApIHx8CisJICAgIChuZXdfc2VyaWFsLnBvcnQgIT0gMCkgfHwKKy8vICAgICAgICAgICAobmV3X3NlcmlhbC50eXBlICE9IGluZm8tPnR5cGUpIHx8CisJICAgIChuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9IDApIHx8CisJICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSA5MjE2MDApKQorCQlyZXR1cm4gKC1FUEVSTSk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKCgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAoaW5mby0+YXN5bmNmbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuICgtRVBFUk0pOworCX0gZWxzZSB7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOworCX0KKworCW5ld19zZXJpYWwuZmxhZ3MgPSAobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19GTEFHUyk7CisJbmV3X3NlcmlhbC5mbGFncyB8PSAoaW5mby0+YXN5bmNmbGFncyAmIEFTWU5DX0ZMQUdTKTsKKworCWlmIChuZXdfc2VyaWFsLnR5cGUgPT0gUE9SVF8xNjU1MEEpIHsKKwkJTW94YVNldEZpZm8oaW5mby0+cG9ydCwgMSk7CisJfSBlbHNlIHsKKwkJTW94YVNldEZpZm8oaW5mby0+cG9ydCwgMCk7CisJfQorCisJaW5mby0+dHlwZSA9IG5ld19zZXJpYWwudHlwZTsKKwlyZXR1cm4gKDApOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglTdGF0aWMgbG9jYWwgZnVuY3Rpb25zOiAJCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1veGFkZWxheSAtIGRlbGF5cyBhIHNwZWNpZmllZCBudW1iZXIgdGlja3MKKyAqLworc3RhdGljIHZvaWQgbW94YWRlbGF5KGludCB0aWNrKQoreworCXVuc2lnbmVkIGxvbmcgc3QsIGV0OworCisJc3QgPSBqaWZmaWVzOworCWV0ID0gc3QgKyB0aWNrOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBldCkpOworfQorCitzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKm9mc0FkZHIsIGludCBjbWQsIHVzaG9ydCBhcmcpCit7CisKKwl3cml0ZXcoYXJnLCBvZnNBZGRyICsgRnVuY0FyZyk7CisJd3JpdGV3KGNtZCwgb2ZzQWRkciArIEZ1bmNDb2RlKTsKKwl3YWl0X2ZpbmlzaChvZnNBZGRyKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9maW5pc2godm9pZCBfX2lvbWVtICpvZnNBZGRyKQoreworCXVuc2lnbmVkIGxvbmcgaSwgajsKKworCWkgPSBqaWZmaWVzOworCXdoaWxlIChyZWFkdyhvZnNBZGRyICsgRnVuY0NvZGUpICE9IDApIHsKKwkJaiA9IGppZmZpZXM7CisJCWlmICgoaiAtIGkpID4gbW94YUZ1bmNUb3V0KSB7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvd193YXRlcl9jaGVjayh2b2lkIF9faW9tZW0gKm9mc0FkZHIpCit7CisJaW50IGxlbjsKKwl1c2hvcnQgcnB0ciwgd3B0ciwgbWFzazsKKworCWlmIChyZWFkYihvZnNBZGRyICsgRmxhZ1N0YXQpICYgWG9mZl9zdGF0ZSkgeworCQlycHRyID0gcmVhZHcob2ZzQWRkciArIFJYcnB0cik7CisJCXdwdHIgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwkJbWFzayA9IHJlYWR3KG9mc0FkZHIgKyBSWF9tYXNrKTsKKwkJbGVuID0gKHdwdHIgLSBycHRyKSAmIG1hc2s7CisJCWlmIChsZW4gPD0gTG93X3dhdGVyKQorCQkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2VuZFhvbiwgMCk7CisJfQorfQorCitzdGF0aWMgaW50IG1veGFsb2FkYmlvcyhpbnQgY2FyZG5vLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqdG1wLCBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqYmFzZUFkZHI7CisJaW50IGk7CisKKwlpZihjb3B5X2Zyb21fdXNlcihtb3hhQnVmZiwgdG1wLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwliYXNlQWRkciA9IG1veGFCYXNlQWRkcltjYXJkbm9dOworCXdyaXRlYihIV19yZXNldCwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CS8qIHJlc2V0ICovCisJbW94YWRlbGF5KDEpOwkJLyogZGVsYXkgMTAgbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDA5NjsgaSsrKQorCQl3cml0ZWIoMCwgYmFzZUFkZHIgKyBpKTsJLyogY2xlYXIgZml4IHBhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXdyaXRlYihtb3hhQnVmZltpXSwgYmFzZUFkZHIgKyBpKTsJLyogZG93bmxvYWQgQklPUyAqLworCXdyaXRlYigwLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsJLyogcmVzdGFydCAqLworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWZpbmRjYXJkKGludCBjYXJkbm8pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkcjsKKwl1c2hvcnQgdG1wOworCisJYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbY2FyZG5vXTsKKwlzd2l0Y2ggKG1veGFfYm9hcmRzW2NhcmRub10uYm9hcmRUeXBlKSB7CisJY2FzZSBNT1hBX0JPQVJEX0MyMThfSVNBOgorCWNhc2UgTU9YQV9CT0FSRF9DMjE4X1BDSToKKwkJaWYgKCh0bXAgPSByZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSkgIT0gQzIxOF9LZXlDb2RlKSB7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1PWEFfQk9BUkRfQ1AyMDRKOgorCQlpZiAoKHRtcCA9IHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpKSAhPSBDUDIwNEpfS2V5Q29kZSkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCh0bXAgPSByZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSkgIT0gQzMyMF9LZXlDb2RlKSB7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoKHRtcCA9IHJlYWR3KGJhc2VBZGRyICsgQzMyMF9zdGF0dXMpKSAhPSBTVFNfaW5pdCkgeworCQkJcmV0dXJuICgtMik7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBtb3hhbG9hZDMyMGIoaW50IGNhcmRubywgdW5zaWduZWQgY2hhciBfX3VzZXIgKnRtcCwgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyOworCWludCBpOworCisJaWYobGVuID4gc2l6ZW9mKG1veGFCdWZmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYoY29weV9mcm9tX3VzZXIobW94YUJ1ZmYsIHRtcCwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbY2FyZG5vXTsKKwl3cml0ZXcobGVuIC0gNzE2OCAtIDIsIGJhc2VBZGRyICsgQzMyMGJhcGlfbGVuKTsKKwl3cml0ZWIoMSwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CS8qIFNlbGVjdCBQYWdlIDEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzE2ODsgaSsrKQorCQl3cml0ZWIobW94YUJ1ZmZbaV0sIGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgaSk7CisJd3JpdGViKDIsIGJhc2VBZGRyICsgQ29udHJvbF9yZWcpOwkvKiBTZWxlY3QgUGFnZSAyICovCisJZm9yIChpID0gMDsgaSA8IChsZW4gLSA3MTY4KTsgaSsrKQorCQl3cml0ZWIobW94YUJ1ZmZbaSArIDcxNjhdLCBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIGkpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRjb2RlKGludCBjYXJkbm8sIHVuc2lnbmVkIGNoYXIgX191c2VyICp0bXAsIGludCBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkciwgKm9mc0FkZHI7CisJaW50IHJldHZhbCwgcG9ydCwgaTsKKworCWlmKGNvcHlfZnJvbV91c2VyKG1veGFCdWZmLCB0bXAsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWJhc2VBZGRyID0gbW94YUJhc2VBZGRyW2NhcmRub107CisJc3dpdGNoIChtb3hhX2JvYXJkc1tjYXJkbm9dLmJvYXJkVHlwZSkgeworCWNhc2UgTU9YQV9CT0FSRF9DMjE4X0lTQToKKwljYXNlIE1PWEFfQk9BUkRfQzIxOF9QQ0k6CisJY2FzZSBNT1hBX0JPQVJEX0NQMjA0SjoKKwkJcmV0dmFsID0gbW94YWxvYWRjMjE4KGNhcmRubywgYmFzZUFkZHIsIGxlbik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXBvcnQgPSBjYXJkbm8gKiBNQVhfUE9SVFNfUEVSX0JPQVJEOworCQlmb3IgKGkgPSAwOyBpIDwgbW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0czsgaSsrLCBwb3J0KyspIHsKKwkJCW1veGFDaGtQb3J0W3BvcnRdID0gMTsKKwkJCW1veGFDdXJCYXVkW3BvcnRdID0gOTYwMEw7CisJCQltb3hhRENEU3RhdGVbcG9ydF0gPSAwOworCQkJbW94YVRhYmxlQWRkcltwb3J0XSA9IGJhc2VBZGRyICsgRXh0ZXJuX3RhYmxlICsgRXh0ZXJuX3NpemUgKiBpOworCQkJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJCQl3cml0ZXcoQzIxOHJ4X21hc2ssIG9mc0FkZHIgKyBSWF9tYXNrKTsKKwkJCXdyaXRldyhDMjE4dHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJd3JpdGV3KEMyMThyeF9zcGFnZSArIGkgKiBDMjE4YnVmX3BhZ2Vubywgb2ZzQWRkciArIFBhZ2VfcnhiKTsKKwkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV9yeGIpICsgQzIxOHJ4X3BhZ2Vubywgb2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKworCQkJd3JpdGV3KEMyMTh0eF9zcGFnZSArIGkgKiBDMjE4YnVmX3BhZ2Vubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV90eGIpICsgQzIxOHR4X3BhZ2Vubywgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IG1veGFsb2FkYzMyMChjYXJkbm8sIGJhc2VBZGRyLCBsZW4sCisJCQkJICAgICAgJm1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQlwb3J0ID0gY2FyZG5vICogTUFYX1BPUlRTX1BFUl9CT0FSRDsKKwkJZm9yIChpID0gMDsgaSA8IG1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHM7IGkrKywgcG9ydCsrKSB7CisJCQltb3hhQ2hrUG9ydFtwb3J0XSA9IDE7CisJCQltb3hhQ3VyQmF1ZFtwb3J0XSA9IDk2MDBMOworCQkJbW94YURDRFN0YXRlW3BvcnRdID0gMDsKKwkJCW1veGFUYWJsZUFkZHJbcG9ydF0gPSBiYXNlQWRkciArIEV4dGVybl90YWJsZSArIEV4dGVybl9zaXplICogaTsKKwkJCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCQkJaWYgKG1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHMgPT0gOCkgeworCQkJCXdyaXRldyhDMzIwcDhyeF9tYXNrLCBvZnNBZGRyICsgUlhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwOHR4X21hc2ssIG9mc0FkZHIgKyBUWF9tYXNrKTsKKwkJCQl3cml0ZXcoQzMyMHA4cnhfc3BhZ2UgKyBpICogQzMyMHA4YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3J4YikgKyBDMzIwcDhyeF9wZ25vLCBvZnNBZGRyICsgRW5kUGFnZV9yeGIpOworCQkJCXdyaXRldyhDMzIwcDh0eF9zcGFnZSArIGkgKiBDMzIwcDhidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKSArIEMzMjBwOHR4X3Bnbm8sIG9mc0FkZHIgKyBFbmRQYWdlX3R4Yik7CisKKwkJCX0gZWxzZSBpZiAobW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0cyA9PSAxNikgeworCQkJCXdyaXRldyhDMzIwcDE2cnhfbWFzaywgb2ZzQWRkciArIFJYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDE2dHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDE2cnhfc3BhZ2UgKyBpICogQzMyMHAxNmJ1Zl9wZ25vLCBvZnNBZGRyICsgUGFnZV9yeGIpOworCQkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV9yeGIpICsgQzMyMHAxNnJ4X3Bnbm8sIG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJCQkJd3JpdGV3KEMzMjBwMTZ0eF9zcGFnZSArIGkgKiBDMzIwcDE2YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3R4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3R4YikgKyBDMzIwcDE2dHhfcGdubywgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKworCQkJfSBlbHNlIGlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzID09IDI0KSB7CisJCQkJd3JpdGV3KEMzMjBwMjRyeF9tYXNrLCBvZnNBZGRyICsgUlhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMjR0eF9tYXNrLCBvZnNBZGRyICsgVFhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMjRyeF9zcGFnZSArIGkgKiBDMzIwcDI0YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3J4YikgKyBDMzIwcDI0cnhfcGdubywgb2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcoQzMyMHAyNHR4X3NwYWdlICsgaSAqIEMzMjBwMjRidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKSwgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKwkJCX0gZWxzZSBpZiAobW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0cyA9PSAzMikgeworCQkJCXdyaXRldyhDMzIwcDMycnhfbWFzaywgb2ZzQWRkciArIFJYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDMydHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDMydHhfb2ZzLCBvZnNBZGRyICsgT2ZzX3R4Yik7CisJCQkJd3JpdGV3KEMzMjBwMzJyeF9zcGFnZSArIGkgKiBDMzIwcDMyYnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWRiKG9mc0FkZHIgKyBQYWdlX3J4YiksIG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJCQkJd3JpdGV3KEMzMjBwMzJ0eF9zcGFnZSArIGkgKiBDMzIwcDMyYnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3R4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3R4YiksIG9mc0FkZHIgKyBFbmRQYWdlX3R4Yik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRjMjE4KGludCBjYXJkbm8sIHZvaWQgX19pb21lbSAqYmFzZUFkZHIsIGludCBsZW4pCit7CisJY2hhciByZXRyeTsKKwlpbnQgaSwgaiwgbGVuMSwgbGVuMjsKKwl1c2hvcnQgdXN1bSwgKnB0ciwga2V5Y29kZTsKKworCWlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0NQMjA0SikKKwkJa2V5Y29kZSA9IENQMjA0Sl9LZXlDb2RlOworCWVsc2UKKwkJa2V5Y29kZSA9IEMyMThfS2V5Q29kZTsKKwl1c3VtID0gMDsKKwlsZW4xID0gbGVuID4+IDE7CisJcHRyID0gKHVzaG9ydCAqKSBtb3hhQnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuMTsgaSsrKQorCQl1c3VtICs9ICoocHRyICsgaSk7CisJcmV0cnkgPSAwOworCWRvIHsKKwkJbGVuMSA9IGxlbiA+PiAxOworCQlqID0gMDsKKwkJd2hpbGUgKGxlbjEpIHsKKwkJCWxlbjIgPSAobGVuMSA+IDIwNDgpID8gMjA0OCA6IGxlbjE7CisJCQlsZW4xIC09IGxlbjI7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuMiA8PCAxOyBpKyspCisJCQkJd3JpdGViKG1veGFCdWZmW2kgKyBqXSwgYmFzZUFkZHIgKyBDMjE4X0xvYWRCdWYgKyBpKTsKKwkJCWogKz0gaTsKKworCQkJd3JpdGV3KGxlbjIsIGJhc2VBZGRyICsgQzIxOERMb2FkX2xlbik7CisJCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMjE4X2tleSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgPT0ga2V5Y29kZSkKKwkJCQkJYnJlYWs7CisJCQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQkJfQorCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpICE9IGtleWNvZGUpIHsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJfQorCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMjE4RExvYWRfbGVuKTsKKwkJd3JpdGV3KHVzdW0sIGJhc2VBZGRyICsgQzIxOGNoZWNrX3N1bSk7CisJCXdyaXRldygwLCBiYXNlQWRkciArIEMyMThfa2V5KTsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgPT0ga2V5Y29kZSkKKwkJCQlicmVhazsKKwkJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJfQorCQlyZXRyeSsrOworCX0gd2hpbGUgKChyZWFkYihiYXNlQWRkciArIEMyMThjaGtzdW1fb2spICE9IDEpICYmIChyZXRyeSA8IDMpKTsKKwlpZiAocmVhZGIoYmFzZUFkZHIgKyBDMjE4Y2hrc3VtX29rKSAhPSAxKSB7CisJCXJldHVybiAoLTEpOworCX0KKwl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMjE4X2tleSk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQorCQkJYnJlYWs7CisJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwl9CisJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCXdyaXRldygxLCBiYXNlQWRkciArIERpc2FibGVfSVJRKTsKKwl3cml0ZXcoMCwgYmFzZUFkZHIgKyBNYWdpY19ubyk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQorCQkJYnJlYWs7CisJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwl9CisJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCW1veGFDYXJkID0gMTsKKwltb3hhSW50TmR4W2NhcmRub10gPSBiYXNlQWRkciArIElSUWluZGV4OworCW1veGFJbnRQZW5kW2NhcmRub10gPSBiYXNlQWRkciArIElSUXBlbmRpbmc7CisJbW94YUludFRhYmxlW2NhcmRub10gPSBiYXNlQWRkciArIElSUXRhYmxlOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRjMzIwKGludCBjYXJkbm8sIHZvaWQgX19pb21lbSAqYmFzZUFkZHIsIGludCBsZW4sIGludCAqbnVtUG9ydHMpCit7CisJdXNob3J0IHVzdW07CisJaW50IGksIGosIHdsZW4sIGxlbjIsIHJldHJ5OworCXVzaG9ydCAqdXB0cjsKKworCXVzdW0gPSAwOworCXdsZW4gPSBsZW4gPj4gMTsKKwl1cHRyID0gKHVzaG9ydCAqKSBtb3hhQnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgd2xlbjsgaSsrKQorCQl1c3VtICs9IHVwdHJbaV07CisJcmV0cnkgPSAwOworCWogPSAwOworCWRvIHsKKwkJd2hpbGUgKHdsZW4pIHsKKwkJCWlmICh3bGVuID4gMjA0OCkKKwkJCQlsZW4yID0gMjA0ODsKKwkJCWVsc2UKKwkJCQlsZW4yID0gd2xlbjsKKwkJCXdsZW4gLT0gbGVuMjsKKwkJCWxlbjIgPDw9IDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuMjsgaSsrKQorCQkJCXdyaXRlYihtb3hhQnVmZltqICsgaV0sIGJhc2VBZGRyICsgQzMyMF9Mb2FkQnVmICsgaSk7CisJCQlsZW4yID4+PSAxOworCQkJaiArPSBpOworCQkJd3JpdGV3KGxlbjIsIGJhc2VBZGRyICsgQzMyMERMb2FkX2xlbik7CisJCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMzIwX2tleSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSA9PSBDMzIwX0tleUNvZGUpCisJCQkJCWJyZWFrOworCQkJCW1veGFkZWxheSgxKTsKKwkJCX0KKwkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSAhPSBDMzIwX0tleUNvZGUpCisJCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJd3JpdGV3KDAsIGJhc2VBZGRyICsgQzMyMERMb2FkX2xlbik7CisJCXdyaXRldyh1c3VtLCBiYXNlQWRkciArIEMzMjBjaGVja19zdW0pOworCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMzIwX2tleSk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMzIwX2tleSkgPT0gQzMyMF9LZXlDb2RlKQorCQkJCWJyZWFrOworCQkJbW94YWRlbGF5KDEpOworCQl9CisJCXJldHJ5Kys7CisJfSB3aGlsZSAoKHJlYWRiKGJhc2VBZGRyICsgQzMyMGNoa3N1bV9vaykgIT0gMSkgJiYgKHJldHJ5IDwgMykpOworCWlmIChyZWFkYihiYXNlQWRkciArIEMzMjBjaGtzdW1fb2spICE9IDEpCisJCXJldHVybiAoLTEpOworCXdyaXRldygwLCBiYXNlQWRkciArIEMzMjBfa2V5KTsKKwlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKKwkJcmV0dXJuICgtMTAwKTsKKworCWlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLmJ1c1R5cGUgPT0gTU9YQV9CVVNfVFlQRV9QQ0kpIHsJCS8qIEFTSUMgYm9hcmQgKi8KKwkJd3JpdGV3KDB4MzgwMCwgYmFzZUFkZHIgKyBUTVMzMjBfUE9SVDEpOworCQl3cml0ZXcoMHgzOTAwLCBiYXNlQWRkciArIFRNUzMyMF9QT1JUMik7CisJCXdyaXRldygyODQ5OSwgYmFzZUFkZHIgKyBUTVMzMjBfQ0xPQ0spOworCX0gZWxzZSB7CisJCXdyaXRldygweDMyMDAsIGJhc2VBZGRyICsgVE1TMzIwX1BPUlQxKTsKKwkJd3JpdGV3KDB4MzQwMCwgYmFzZUFkZHIgKyBUTVMzMjBfUE9SVDIpOworCQl3cml0ZXcoMTk5OTksIGJhc2VBZGRyICsgVE1TMzIwX0NMT0NLKTsKKwl9CisJd3JpdGV3KDEsIGJhc2VBZGRyICsgRGlzYWJsZV9JUlEpOworCXdyaXRldygwLCBiYXNlQWRkciArIE1hZ2ljX25vKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKKwkJcmV0dXJuICgtMTAyKTsKKworCWogPSByZWFkdyhiYXNlQWRkciArIE1vZHVsZV9jbnQpOworCWlmIChqIDw9IDApCisJCXJldHVybiAoLTEwMSk7CisJKm51bVBvcnRzID0gaiAqIDg7CisJd3JpdGV3KGosIGJhc2VBZGRyICsgTW9kdWxlX25vKTsKKwl3cml0ZXcoMCwgYmFzZUFkZHIgKyBNYWdpY19ubyk7CisJZm9yIChpID0gMDsgaSA8IDYwMDsgaSsrKSB7CisJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQorCQkJYnJlYWs7CisJCW1veGFkZWxheSgxKTsKKwl9CisJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpCisJCXJldHVybiAoLTEwMik7CisJbW94YUNhcmQgPSAxOworCW1veGFJbnROZHhbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRaW5kZXg7CisJbW94YUludFBlbmRbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRcGVuZGluZzsKKwltb3hhSW50VGFibGVbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRdGFibGU7CisJcmV0dXJuICgwKTsKK30KKworI2lmIDAKK2xvbmcgTW94YVBvcnRHZXRDdXJCYXVkKGludCBwb3J0KQoreworCisJaWYgKG1veGFDaGtQb3J0W3BvcnRdID09IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChtb3hhQ3VyQmF1ZFtwb3J0XSk7Cit9CisjZW5kaWYgIC8qICAwICAqLworCitzdGF0aWMgdm9pZCBNb3hhU2V0RmlmbyhpbnQgcG9ydCwgaW50IGVuYWJsZSkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCisJaWYgKCFlbmFibGUpIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0UnhGSUZPVHJpZywgMCk7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFR4RklGT0NudCwgMSk7CisJfSBlbHNlIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0UnhGSUZPVHJpZywgMyk7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFR4RklGT0NudCwgMTYpOworCX0KK30KKworI2lmIDAKK2ludCBNb3hhUG9ydFNldE1vZGUoaW50IHBvcnQsIGludCBkYXRhYml0cywgaW50IHN0b3BiaXRzLCBpbnQgcGFyaXR5KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgdmFsOworCisJdmFsID0gMDsKKwlzd2l0Y2ggKGRhdGFiaXRzKSB7CisJY2FzZSA1OgorCQl2YWwgfD0gMDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl2YWwgfD0gMTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl2YWwgfD0gMjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2YWwgfD0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgtMSk7CisJfQorCXN3aXRjaCAoc3RvcGJpdHMpIHsKKwljYXNlIDA6CisJCXZhbCB8PSAwOworCQlicmVhazsJCS8qIHN0b3AgYml0cyAxLjUgKi8KKwljYXNlIDE6CisJCXZhbCB8PSAwOworCQlicmVhazsKKwljYXNlIDI6CisJCXZhbCB8PSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC0xKTsKKwl9CisJc3dpdGNoIChwYXJpdHkpIHsKKwljYXNlIDA6CisJCXZhbCB8PSAweDAwOworCQlicmVhazsJCS8qIE5vbmUgICovCisJY2FzZSAxOgorCQl2YWwgfD0gMHgwODsKKwkJYnJlYWs7CQkvKiBPZGQgICAqLworCWNhc2UgMjoKKwkJdmFsIHw9IDB4MTg7CisJCWJyZWFrOwkJLyogRXZlbiAgKi8KKwljYXNlIDM6CisJCXZhbCB8PSAweDI4OworCQlicmVhazsJCS8qIE1hcmsgICovCisJY2FzZSA0OgorCQl2YWwgfD0gMHgzODsKKwkJYnJlYWs7CQkvKiBTcGFjZSAqLworCWRlZmF1bHQ6CisJCXJldHVybiAoLTEpOworCX0KKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRNb2RlLCB2YWwpOworCXJldHVybiAoMCk7Cit9CisKK2ludCBNb3hhUG9ydFR4QnVmU2l6ZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IHNpemU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlzaXplID0gcmVhZHcob2ZzQWRkciArIFRYX21hc2spOworCXJldHVybiAoc2l6ZSk7Cit9CisKK2ludCBNb3hhUG9ydFJ4QnVmU2l6ZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IHNpemU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlzaXplID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCXJldHVybiAoc2l6ZSk7Cit9CisKK2ludCBNb3hhUG9ydFJ4RnJlZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJdXNob3J0IHJwdHIsIHdwdHIsIG1hc2s7CisJaW50IGxlbjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXJwdHIgPSByZWFkdyhvZnNBZGRyICsgUlhycHRyKTsKKwl3cHRyID0gcmVhZHcob2ZzQWRkciArIFJYd3B0cik7CisJbWFzayA9IHJlYWR3KG9mc0FkZHIgKyBSWF9tYXNrKTsKKwlsZW4gPSBtYXNrIC0gKCh3cHRyIC0gcnB0cikgJiBtYXNrKTsKKwlyZXR1cm4gKGxlbik7Cit9CitpbnQgTW94YVBvcnRHZXRCcmtDbnQoaW50IHBvcnQpCit7CisJcmV0dXJuIChtb3hhQnJlYWtDbnRbcG9ydF0pOworfQorCit2b2lkIE1veGFQb3J0U2V0WG9uWG9mZihpbnQgcG9ydCwgaW50IHhvblZhbHVlLCBpbnQgeG9mZlZhbHVlKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXdyaXRldyh4b25WYWx1ZSwgb2ZzQWRkciArIEZ1bmNBcmcpOworCXdyaXRldyh4b2ZmVmFsdWUsIG9mc0FkZHIgKyBGdW5jQXJnMSk7CisJd3JpdGV3KEZDX1NldFhvblhvZmYsIG9mc0FkZHIgKyBGdW5jQ29kZSk7CisJd2FpdF9maW5pc2gob2ZzQWRkcik7Cit9CisKK2ludCBNb3hhUG9ydElzVHhIb2xkKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgdmFsOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJaWYgKChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpIHx8CisJICAgIChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9QQ0kpKSB7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX0dldENDU1IsIDApOworCQl2YWwgPSByZWFkdyhvZnNBZGRyICsgRnVuY0FyZyk7CisJCWlmICh2YWwgJiAweDA0KQorCQkJcmV0dXJuICgxKTsKKwl9IGVsc2UgeworCQlpZiAocmVhZHcob2ZzQWRkciArIEZsYWdTdGF0KSAmIFR4X2Zsb3dPZmYpCisJCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDBmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYwpAQCAtMCwwICsxLDcyNyBAQAorLyoKKyoKKyogMzc4MGkuYyAtLSBoZWxwZXIgcm91dGluZXMgZm9yIHRoZSAzNzgwaSBEU1AKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlICJzbWFwaS5oIgorI2luY2x1ZGUgIm13YXZlZGQuaCIKKyNpbmNsdWRlICIzNzgwaS5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRzcF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZsYWdzOworCisKK3N0YXRpYyB2b2lkIFBhY2VNc2FBY2Nlc3ModW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8pCit7CisJY29uZF9yZXNjaGVkKCk7CisJdWRlbGF5KDEwMCk7CisJY29uZF9yZXNjaGVkKCk7Cit9CisKK3Vuc2lnbmVkIHNob3J0IGRzcDM3ODBJX1JlYWRNc2FDZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxNc2FBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX1JlYWRNc2FDZmcgZW50cnkgdXNEc3BCYXNlSU8gJXggdWxNc2FBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHVsTXNhQWRkcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRyTG93LCAodW5zaWduZWQgc2hvcnQpIHVsTXNhQWRkcik7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckhpZ2gsICh1bnNpZ25lZCBzaG9ydCkgKHVsTXNhQWRkciA+PiAxNikpOworCXZhbCA9IEluV29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MElfUmVhZE1zYUNmZyBleGl0IHZhbCAleFxuIiwgdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgZHNwMzc4MElfV3JpdGVNc2FDZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxNc2FBZGRyLCB1bnNpZ25lZCBzaG9ydCB1c1ZhbHVlKQoreworCisJUFJJTlRLXzQoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVNc2FDZmcgZW50cnkgdXNEc3BCYXNlSU8gJXggdWxNc2FBZGRyICVseCB1c1ZhbHVlICV4XG4iLAorCQl1c0RzcEJhc2VJTywgdWxNc2FBZGRyLCB1c1ZhbHVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxNc2FBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxNc2FBZGRyID4+IDE2KSk7CisJT3V0V29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoLCB1c1ZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGRzcDM3ODBJX1dyaXRlR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB1bnNpZ25lZCB1SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdWNWYWx1ZSkKK3sKKwlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbDsKKwlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbF9TYXZlOworCisKKwlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyBlbnRyeSB1c0RzcEJhc2VJTyAleCB1SW5kZXggJXggdWNWYWx1ZSAleFxuIiwKKwkJdXNEc3BCYXNlSU8sIHVJbmRleCwgdWNWYWx1ZSk7CisKKwlNS0JZVEUoclNsYXZlQ29udHJvbCkgPSBJbkJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyByU2xhdmVDb250cm9sICV4XG4iLAorCQlNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCisJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVHZW5DZmcgZW50cnkgclNsYXZlQ29udHJvbCtDb25maWdNb2RlICV4XG4iLAorCQlNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCisJT3V0Qnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCU91dEJ5dGVEc3AoRFNQX0NvbmZpZ0FkZHJlc3MsICh1bnNpZ25lZCBjaGFyKSB1SW5kZXgpOworCU91dEJ5dGVEc3AoRFNQX0NvbmZpZ0RhdGEsIHVjVmFsdWUpOworCU91dEJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtCWVRFKHJTbGF2ZUNvbnRyb2xfU2F2ZSkpOworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVHZW5DZmcgZXhpdFxuIik7CisKKworfQorCit1bnNpZ25lZCBjaGFyIGRzcDM3ODBJX1JlYWRHZW5DZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUluZGV4KQoreworCURTUF9JU0FfU0xBVkVfQ09OVFJPTCByU2xhdmVDb250cm9sOworCURTUF9JU0FfU0xBVkVfQ09OVFJPTCByU2xhdmVDb250cm9sX1NhdmU7CisJdW5zaWduZWQgY2hhciB1Y1ZhbHVlOworCisKKwlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9SZWFkR2VuQ2ZnIGVudHJ5IHVzRHNwQmFzZUlPICV4IHVJbmRleCAleFxuIiwKKwkJdXNEc3BCYXNlSU8sIHVJbmRleCk7CisKKwlNS0JZVEUoclNsYXZlQ29udHJvbCkgPSBJbkJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCU91dEJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtCWVRFKHJTbGF2ZUNvbnRyb2wpKTsKKwlPdXRCeXRlRHNwKERTUF9Db25maWdBZGRyZXNzLCAodW5zaWduZWQgY2hhcikgdUluZGV4KTsKKwl1Y1ZhbHVlID0gSW5CeXRlRHNwKERTUF9Db25maWdEYXRhKTsKKwlPdXRCeXRlRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LQllURShyU2xhdmVDb250cm9sX1NhdmUpKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX1JlYWRHZW5DZmcgZXhpdCB1Y1ZhbHVlICV4XG4iLCB1Y1ZhbHVlKTsKKworCisJcmV0dXJuIHVjVmFsdWU7Cit9CisKK2ludCBkc3AzNzgwSV9FbmFibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnBJcnFNYXAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwRG1hTWFwKQoreworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlpbnQgaTsKKwlEU1BfVUFSVF9DRkdfMSByVWFydENmZzE7CisJRFNQX1VBUlRfQ0ZHXzIgclVhcnRDZmcyOworCURTUF9IQlJJREdFX0NGR18xIHJIQnJpZGdlQ2ZnMTsKKwlEU1BfSEJSSURHRV9DRkdfMiBySEJyaWRnZUNmZzI7CisJRFNQX0JVU01BU1RFUl9DRkdfMSByQnVzbWFzdGVyQ2ZnMTsKKwlEU1BfQlVTTUFTVEVSX0NGR18yIHJCdXNtYXN0ZXJDZmcyOworCURTUF9JU0FfUFJPVF9DRkcgcklzYVByb3RDZmc7CisJRFNQX1BPV0VSX01HTVRfQ0ZHIHJQb3dlck1nbXRDZmc7CisJRFNQX0hCVVNfVElNRVJfQ0ZHIHJIQnVzVGltZXJDZmc7CisJRFNQX0xCVVNfVElNRU9VVF9ESVNBQkxFIHJMQnVzVGltZW91dERpc2FibGU7CisJRFNQX0NISVBfUkVTRVQgckNoaXBSZXNldDsKKwlEU1BfQ0xPQ0tfQ09OVFJPTF8xIHJDbG9ja0NvbnRyb2wxOworCURTUF9DTE9DS19DT05UUk9MXzIgckNsb2NrQ29udHJvbDI7CisJRFNQX0lTQV9TTEFWRV9DT05UUk9MIHJTbGF2ZUNvbnRyb2w7CisJRFNQX0hCUklER0VfQ09OVFJPTCBySEJyaWRnZUNvbnRyb2w7CisJdW5zaWduZWQgc2hvcnQgQ2hpcElEID0gMDsKKwl1bnNpZ25lZCBzaG9ydCB0dmFsOworCisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9FbmFibGVEU1AgZW50cnkgcFNldHRpbmdzLT5iRFNQRW5hYmxlZCAleFxuIiwKKwkJcFNldHRpbmdzLT5iRFNQRW5hYmxlZCk7CisKKworCWlmICghcFNldHRpbmdzLT5iRFNQRW5hYmxlZCkgeworCQlQUklOVEtfRVJST1IoIEtFUk5fRVJSICIzNzgwaTo6ZHNwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogRFNQIG5vdCBlbmFibGVkLiBBYm9ydGluZy5cbiIgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgZW50cnkgcFNldHRpbmdzLT5iTW9kZW1FbmFibGVkICV4XG4iLAorCQlwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQpOworCisJaWYgKHBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCkgeworCQlyVWFydENmZzEuUmVzZXJ2ZWQgPSByVWFydENmZzIuUmVzZXJ2ZWQgPSAwOworCQlyVWFydENmZzEuSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdzsKKwkJclVhcnRDZmcxLklycVB1bHNlID0gcFNldHRpbmdzLT5iVWFydElycVB1bHNlOworCQlyVWFydENmZzEuSXJxID0KKwkJCSh1bnNpZ25lZCBjaGFyKSBwSXJxTWFwW3BTZXR0aW5ncy0+dXNVYXJ0SXJxXTsKKwkJc3dpdGNoIChwU2V0dGluZ3MtPnVzVWFydEJhc2VJTykgeworCQljYXNlIDB4MDNGODoKKwkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMkY4OgorCQkJclVhcnRDZmcxLkJhc2VJTyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDAzRTg6CisJCQlyVWFydENmZzEuQmFzZUlPID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDJFODoKKwkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAzOworCQkJYnJlYWs7CisJCX0KKwkJclVhcnRDZmcyLkVuYWJsZSA9IFRSVUU7CisJfQorCisJckhCcmlkZ2VDZmcxLlJlc2VydmVkID0gckhCcmlkZ2VDZmcyLlJlc2VydmVkID0gMDsKKwlySEJyaWRnZUNmZzEuSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93OworCXJIQnJpZGdlQ2ZnMS5JcnFQdWxzZSA9IHBTZXR0aW5ncy0+YkRzcElycVB1bHNlOworCXJIQnJpZGdlQ2ZnMS5JcnEgPSAodW5zaWduZWQgY2hhcikgcElycU1hcFtwU2V0dGluZ3MtPnVzRHNwSXJxXTsKKwlySEJyaWRnZUNmZzEuQWNjZXNzTW9kZSA9IDE7CisJckhCcmlkZ2VDZmcyLkVuYWJsZSA9IFRSVUU7CisKKworCXJCdXNtYXN0ZXJDZmcyLlJlc2VydmVkID0gMDsKKwlyQnVzbWFzdGVyQ2ZnMS5EbWEgPSAodW5zaWduZWQgY2hhcikgcERtYU1hcFtwU2V0dGluZ3MtPnVzRHNwRG1hXTsKKwlyQnVzbWFzdGVyQ2ZnMS5OdW1UcmFuc2ZlcnMgPQorCQkodW5zaWduZWQgY2hhcikgcFNldHRpbmdzLT51c051bVRyYW5zZmVyczsKKwlyQnVzbWFzdGVyQ2ZnMS5SZVJlcXVlc3QgPSAodW5zaWduZWQgY2hhcikgcFNldHRpbmdzLT51c1JlUmVxdWVzdDsKKwlyQnVzbWFzdGVyQ2ZnMS5NRU1DUzE2ID0gcFNldHRpbmdzLT5iRW5hYmxlTUVNQ1MxNjsKKwlyQnVzbWFzdGVyQ2ZnMi5Jc2FNZW1DbWRXaWR0aCA9CisJCSh1bnNpZ25lZCBjaGFyKSBwU2V0dGluZ3MtPnVzSXNhTWVtQ21kV2lkdGg7CisKKworCXJJc2FQcm90Q2ZnLlJlc2VydmVkID0gMDsKKwlySXNhUHJvdENmZy5HYXRlSU9DSFJEWSA9IHBTZXR0aW5ncy0+YkdhdGVJT0NIUkRZOworCisJclBvd2VyTWdtdENmZy5SZXNlcnZlZCA9IDA7CisJclBvd2VyTWdtdENmZy5FbmFibGUgPSBwU2V0dGluZ3MtPmJFbmFibGVQd3JNZ210OworCisJckhCdXNUaW1lckNmZy5Mb2FkVmFsdWUgPQorCQkodW5zaWduZWQgY2hhcikgcFNldHRpbmdzLT51c0hCdXNUaW1lckxvYWRWYWx1ZTsKKworCXJMQnVzVGltZW91dERpc2FibGUuUmVzZXJ2ZWQgPSAwOworCXJMQnVzVGltZW91dERpc2FibGUuRGlzYWJsZVRpbWVvdXQgPQorCQlwU2V0dGluZ3MtPmJEaXNhYmxlTEJ1c1RpbWVvdXQ7CisKKwlNS1dPUkQockNoaXBSZXNldCkgPSB+cFNldHRpbmdzLT51c0NoaXBsZXRFbmFibGU7CisKKwlyQ2xvY2tDb250cm9sMS5SZXNlcnZlZDEgPSByQ2xvY2tDb250cm9sMS5SZXNlcnZlZDIgPSAwOworCXJDbG9ja0NvbnRyb2wxLk5fRGl2aXNvciA9IHBTZXR0aW5ncy0+dXNOX0Rpdmlzb3I7CisJckNsb2NrQ29udHJvbDEuTV9NdWx0aXBsaWVyID0gcFNldHRpbmdzLT51c01fTXVsdGlwbGllcjsKKworCXJDbG9ja0NvbnRyb2wyLlJlc2VydmVkID0gMDsKKwlyQ2xvY2tDb250cm9sMi5QbGxCeXBhc3MgPSBwU2V0dGluZ3MtPmJQbGxCeXBhc3M7CisKKwkvKiBJc3N1ZSBhIHNvZnQgcmVzZXQgdG8gdGhlIGNoaXAgKi8KKwkvKiBOb3RlOiBTaW5jZSB3ZSBtYXkgYmUgY29taW5nIGluIHdpdGggMzc4MGkgY2xvY2tzIHN1c3BlbmRlZCwgd2UgbXVzdCBrZWVwCisJKiBzb2Z0LXJlc2V0IGFjdGl2ZSBmb3IgMTBtcy4KKwkqLworCXJTbGF2ZUNvbnRyb2wuQ2xvY2tDb250cm9sID0gMDsKKwlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IFRSVUU7CisJclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gRkFMU0U7CisJclNsYXZlQ29udHJvbC5SZXNlcnZlZCA9IDA7CisKKwlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgdXNEc3BCYXNlSU8gJXggaW5kZXggJXggdGFkZHIgJXhcbiIsCisJCXVzRHNwQmFzZUlPLCBEU1BfSXNhU2xhdmVDb250cm9sLAorCQl1c0RzcEJhc2VJTyArIERTUF9Jc2FTbGF2ZUNvbnRyb2wpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIHJTbGF2ZUNvbnRybCAleFxuIiwKKwkJTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKKwlNS1dPUkQodHZhbCkgPSBJbldvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgclNsYXZlQ29udHJvbCAyICV4XG4iLCB0dmFsKTsKKworCisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspCisJCXVkZWxheSgyMDAwKTsKKworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gRkFMU0U7CisJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOworCisJTUtXT1JEKHR2YWwpID0gSW5Xb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIHJTbGF2ZUNvbnRyb2wgMyAleFxuIiwgdHZhbCk7CisKKworCS8qIFByb2dyYW0gb3VyIGdlbmVyYWwgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwlXcml0ZUdlbkNmZyhEU1BfSEJyaWRnZUNmZzFJbmRleCwgTUtCWVRFKHJIQnJpZGdlQ2ZnMSkpOworCVdyaXRlR2VuQ2ZnKERTUF9IQnJpZGdlQ2ZnMkluZGV4LCBNS0JZVEUockhCcmlkZ2VDZmcyKSk7CisJV3JpdGVHZW5DZmcoRFNQX0J1c01hc3RlckNmZzFJbmRleCwgTUtCWVRFKHJCdXNtYXN0ZXJDZmcxKSk7CisJV3JpdGVHZW5DZmcoRFNQX0J1c01hc3RlckNmZzJJbmRleCwgTUtCWVRFKHJCdXNtYXN0ZXJDZmcyKSk7CisJV3JpdGVHZW5DZmcoRFNQX0lzYVByb3RDZmdJbmRleCwgTUtCWVRFKHJJc2FQcm90Q2ZnKSk7CisJV3JpdGVHZW5DZmcoRFNQX1Bvd2VyTWdDZmdJbmRleCwgTUtCWVRFKHJQb3dlck1nbXRDZmcpKTsKKwlXcml0ZUdlbkNmZyhEU1BfSEJ1c1RpbWVyQ2ZnSW5kZXgsIE1LQllURShySEJ1c1RpbWVyQ2ZnKSk7CisKKwlpZiAocFNldHRpbmdzLT5iTW9kZW1FbmFibGVkKSB7CisJCVdyaXRlR2VuQ2ZnKERTUF9VYXJ0Q2ZnMUluZGV4LCBNS0JZVEUoclVhcnRDZmcxKSk7CisJCVdyaXRlR2VuQ2ZnKERTUF9VYXJ0Q2ZnMkluZGV4LCBNS0JZVEUoclVhcnRDZmcyKSk7CisJfQorCisKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJckhCcmlkZ2VDb250cm9sLk1lbUF1dG9JbmMgPSBUUlVFOworCXJIQnJpZGdlQ29udHJvbC5Jb0F1dG9JbmMgPSBGQUxTRTsKKwlySEJyaWRnZUNvbnRyb2wuRGlhZ25vc3RpY01vZGUgPSBGQUxTRTsKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX0VuYWJsZURTUCBEU1BfSEJyaWRnZUNvbnRyb2wgJXggckhCcmlkZ2VDb250cm9sICV4XG4iLAorCQlEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlXcml0ZU1zYUNmZyhEU1BfTEJ1c1RpbWVvdXREaXNhYmxlLCBNS1dPUkQockxCdXNUaW1lb3V0RGlzYWJsZSkpOworCVdyaXRlTXNhQ2ZnKERTUF9DbG9ja0NvbnRyb2xfMSwgTUtXT1JEKHJDbG9ja0NvbnRyb2wxKSk7CisJV3JpdGVNc2FDZmcoRFNQX0Nsb2NrQ29udHJvbF8yLCBNS1dPUkQockNsb2NrQ29udHJvbDIpKTsKKwlXcml0ZU1zYUNmZyhEU1BfQ2hpcFJlc2V0LCBNS1dPUkQockNoaXBSZXNldCkpOworCisJQ2hpcElEID0gUmVhZE1zYUNmZyhEU1BfQ2hpcElEKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0VuYWJsZURTUCBleGl0aW5nIGJSQz1UUlVFLCBDaGlwSUQgJXhcbiIsCisJCUNoaXBJRCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRzcDM3ODBJX0Rpc2FibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJRFNQX0lTQV9TTEFWRV9DT05UUk9MIHJTbGF2ZUNvbnRyb2w7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX0Rpc2FibGVEU1AgZW50cnlcbiIpOworCisJclNsYXZlQ29udHJvbC5DbG9ja0NvbnRyb2wgPSAwOworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gVFJVRTsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBGQUxTRTsKKwlyU2xhdmVDb250cm9sLlJlc2VydmVkID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LV09SRChyU2xhdmVDb250cm9sKSk7CisKKwl1ZGVsYXkoNSk7CisKKwlyU2xhdmVDb250cm9sLkNsb2NrQ29udHJvbCA9IDE7CisJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwl1ZGVsYXkoNSk7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX0Rpc2FibGVEU1AgZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRzcDM3ODBJX1Jlc2V0KERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpCit7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCURTUF9CT09UX0RPTUFJTiByQm9vdERvbWFpbjsKKwlEU1BfSEJSSURHRV9DT05UUk9MIHJIQnJpZGdlQ29udHJvbDsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgZW50cnlcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJLyogTWFzayBEU1AgdG8gUEMgaW50ZXJydXB0ICovCisJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkgPSBJbldvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IHJIQnJpZGdlQ29udHJvbCAleFxuIiwKKwkJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOworCisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IEZBTFNFOworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFJlc2V0IHRoZSBjb3JlIHZpYSB0aGUgYm9vdCBkb21haW4gcmVnaXN0ZXIgKi8KKwlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOworCXJCb290RG9tYWluLkhhbHQgPSBUUlVFOworCXJCb290RG9tYWluLk5NSSA9IFRSVUU7CisJckJvb3REb21haW4uUmVzZXJ2ZWQgPSAwOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgckJvb3REb21haW4gJXhcbiIsCisJCU1LV09SRChyQm9vdERvbWFpbikpOworCisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCisJLyogUmVzZXQgYWxsIHRoZSBjaGlwbGV0cyBhbmQgdGhlbiByZWFjdGl2YXRlIHRoZW0gKi8KKwlXcml0ZU1zYUNmZyhEU1BfQ2hpcFJlc2V0LCAweEZGRkYpOworCXVkZWxheSg1KTsKKwlXcml0ZU1zYUNmZyhEU1BfQ2hpcFJlc2V0LAorCQkJKHVuc2lnbmVkIHNob3J0KSAofnBTZXR0aW5ncy0+dXNDaGlwbGV0RW5hYmxlKSk7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IGV4aXQgYlJDPTBcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGRzcDM3ODBJX1J1bihEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzKQoreworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlEU1BfQk9PVF9ET01BSU4gckJvb3REb21haW47CisJRFNQX0hCUklER0VfQ09OVFJPTCBySEJyaWRnZUNvbnRyb2w7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBlbnRyeVxuIik7CisKKworCS8qIFRyYW5zaXRpb24gdGhlIGNvcmUgdG8gYSBydW5uaW5nIHN0YXRlICovCisJckJvb3REb21haW4uUmVzZXRDb3JlID0gVFJVRTsKKwlyQm9vdERvbWFpbi5IYWx0ID0gRkFMU0U7CisJckJvb3REb21haW4uTk1JID0gVFJVRTsKKwlyQm9vdERvbWFpbi5SZXNlcnZlZCA9IDA7CisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCisJdWRlbGF5KDUpOworCisJckJvb3REb21haW4uUmVzZXRDb3JlID0gRkFMU0U7CisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCXVkZWxheSg1KTsKKworCXJCb290RG9tYWluLk5NSSA9IEZBTFNFOworCVdyaXRlTXNhQ2ZnKERTUF9Nc3BCb290RG9tYWluLCBNS1dPUkQockJvb3REb21haW4pKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBFbmFibGUgRFNQIHRvIFBDIGludGVycnVwdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU1LV09SRChySEJyaWRnZUNvbnRyb2wpID0gSW5Xb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCk7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IFRSVUU7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9SdW4gckhCcmlkZ2VDb250cm9sICV4XG4iLAorCQlNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisKKwlPdXRXb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCwgTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9SZWFkRFN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisKKwlQUklOVEtfNShUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9SZWFkRFN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKiBTZXQgdGhlIGluaXRpYWwgTVNBIGFkZHJlc3MuIE5vIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZSB0byBkYXRhIHN0b3JlIGFkZHJlc3NlcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gSW5Xb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCQlpZihwdXRfdXNlcih2YWwsIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkRFN0b3JlIHVDb3VudCAleCB2YWwgJXhcbiIsCisJCQl1Q291bnQsIHZhbCk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisJfQorCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkRFN0b3JlIGV4aXQgYlJDPVRSVUVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKnB1c0J1ZmZlciA9IHB2QnVmZmVyOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCisJUFJJTlRLXzUoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MElfUmVhZEFuZERTdG9yZSBlbnRyeSB1c0RzcEJhc2VJTyAleCwgcHVzQnVmZmVyICVwLCB1Q291bnQgJXgsIHVsRFNQQWRkciAlbHhcbiIsCisJCXVzRHNwQmFzZUlPLCBwdXNCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKworCisJLyogU2V0IHRoZSBpbml0aWFsIE1TQSBhZGRyZXNzLiBObyBhZGp1c3RtZW50cyBuZWVkIHRvIGJlIG1hZGUgdG8gZGF0YSBzdG9yZSBhZGRyZXNzZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRyTG93LCAodW5zaWduZWQgc2hvcnQpIHVsRFNQQWRkcik7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckhpZ2gsICh1bnNpZ25lZCBzaG9ydCkgKHVsRFNQQWRkciA+PiAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkvKiBUcmFuc2ZlciB0aGUgbWVtb3J5IGJsb2NrICovCisJd2hpbGUgKHVDb3VudC0tICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCXZhbCA9IEluV29yZERzcChEU1BfUmVhZEFuZENsZWFyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJaWYocHV0X3VzZXIodmFsLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZEFuZENsZWFuRFN0b3JlIHVDb3VudCAleCB2YWwgJXhcbiIsCisJCQl1Q291bnQsIHZhbCk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisJfQorCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZHNwMzc4MElfV3JpdGVEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisKKworCVBSSU5US181KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBEX1dyaXRlRFN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKiBTZXQgdGhlIGluaXRpYWwgTVNBIGFkZHJlc3MuIE5vIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZSB0byBkYXRhIHN0b3JlIGFkZHJlc3NlcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQl1bnNpZ25lZCBzaG9ydCB2YWw7CisJCWlmKGdldF91c2VyKHZhbCwgcHVzQnVmZmVyKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCQlPdXRXb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gsIHZhbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCisJCQkiMzc4MEk6OmRzcDM3ODBJX1dyaXRlRFN0b3JlIHVDb3VudCAleCB2YWwgJXhcbiIsCisJCQl1Q291bnQsIHZhbCk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisJfQorCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwRF9Xcml0ZURTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9SZWFkSVN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisKKwlQUklOVEtfNShUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9SZWFkSVN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisJLyoKKwkqIFNldCB0aGUgaW5pdGlhbCBNU0EgYWRkcmVzcy4gVG8gY29udmVydCBmcm9tIGFuIGluc3RydWN0aW9uIHN0b3JlCisJKiBhZGRyZXNzIHRvIGFuIE1TQSBhZGRyZXNzCisJKiBzaGlmdCB0aGUgYWRkcmVzcyB0d28gYml0cyB0byB0aGUgbGVmdCBhbmQgc2V0IGJpdCAyMgorCSovCisJdWxEU1BBZGRyID0gKHVsRFNQQWRkciA8PCAyKSB8ICgxIDw8IDIyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRyTG93LCAodW5zaWduZWQgc2hvcnQpIHVsRFNQQWRkcik7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckhpZ2gsICh1bnNpZ25lZCBzaG9ydCkgKHVsRFNQQWRkciA+PiAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkvKiBUcmFuc2ZlciB0aGUgbWVtb3J5IGJsb2NrICovCisJd2hpbGUgKHVDb3VudC0tICE9IDApIHsKKwkJdW5zaWduZWQgc2hvcnQgdmFsX2xvLCB2YWxfaGk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCQl2YWxfbG8gPSBJbldvcmREc3AoRFNQX01zYURhdGFJU0xvdyk7CisJCXZhbF9oaSA9IEluV29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJaWYocHV0X3VzZXIodmFsX2xvLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYocHV0X3VzZXIodmFsX2hpLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSB1Q291bnQgJXggdmFsX2xvICV4IHZhbF9oaSAleFxuIiwKKwkJCXVDb3VudCwgdmFsX2xvLCB2YWxfaGkpOworCisJCVBhY2VNc2FBY2Nlc3ModXNEc3BCYXNlSU8pOworCisJfQorCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCisJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9Xcml0ZUlTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBwdkJ1ZmZlcjsKKworCVBSSU5US181KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX1dyaXRlSVN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKgorCSogU2V0IHRoZSBpbml0aWFsIE1TQSBhZGRyZXNzLiBUbyBjb252ZXJ0IGZyb20gYW4gaW5zdHJ1Y3Rpb24gc3RvcmUKKwkqIGFkZHJlc3MgdG8gYW4gTVNBIGFkZHJlc3MKKwkqIHNoaWZ0IHRoZSBhZGRyZXNzIHR3byBiaXRzIHRvIHRoZSBsZWZ0IGFuZCBzZXQgYml0IDIyCisJKi8KKwl1bERTUEFkZHIgPSAodWxEU1BBZGRyIDw8IDIpIHwgKDEgPDwgMjIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQl1bnNpZ25lZCBzaG9ydCB2YWxfbG8sIHZhbF9oaTsKKwkJaWYoZ2V0X3VzZXIodmFsX2xvLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYoZ2V0X3VzZXIodmFsX2hpLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCU91dFdvcmREc3AoRFNQX01zYURhdGFJU0xvdywgdmFsX2xvKTsKKwkJT3V0V29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoLCB2YWxfaGkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJCVBSSU5US180KFRSQUNFXzM3ODBJLAorCQkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSB1Q291bnQgJXggdmFsX2xvICV4IHZhbF9oaSAleFxuIiwKKwkJCXVDb3VudCwgdmFsX2xvLCB2YWxfaGkpOworCisJCVBhY2VNc2FBY2Nlc3ModXNEc3BCYXNlSU8pOworCisJfQorCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCisJCSIzNzgwSTo6ZHNwMzc4MElfV3JpdGVJU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZHNwMzc4MElfR2V0SVBDU291cmNlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcHVzSVBDU291cmNlKQoreworCURTUF9IQlJJREdFX0NPTlRST0wgckhCcmlkZ2VDb250cm9sOworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0dldElQQ1NvdXJjZSBlbnRyeSB1c0RzcEJhc2VJTyAleCBwdXNJUENTb3VyY2UgJXBcbiIsCisJCXVzRHNwQmFzZUlPLCBwdXNJUENTb3VyY2UpOworCisJLyoKKwkqIERpc2FibGUgRFNQIHRvIFBDIGludGVycnVwdHMsIHJlYWQgdGhlIGludGVycnVwdCByZWdpc3RlciwKKwkqIGNsZWFyIHRoZSBwZW5kaW5nIElQQyBiaXRzLCBhbmQgcmVlbmFibGUgRFNQIHRvIFBDIGludGVycnVwdHMKKwkqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU1LV09SRChySEJyaWRnZUNvbnRyb2wpID0gSW5Xb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCk7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IEZBTFNFOworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisKKwkqcHVzSVBDU291cmNlID0gSW5Xb3JkRHNwKERTUF9JbnRlcnJ1cHQpOworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpIH4oKnB1c0lQQ1NvdXJjZSk7CisKKwlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9HZXRJUENTb3VyY2UsIHVzSVBDU291cmNlICV4IH4gJXhcbiIsCisJCSpwdXNJUENTb3VyY2UsIHRlbXApOworCisJT3V0V29yZERzcChEU1BfSW50ZXJydXB0LCAodW5zaWduZWQgc2hvcnQpIH4oKnB1c0lQQ1NvdXJjZSkpOworCisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IFRSVUU7CisJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9HZXRJUENTb3VyY2UgZXhpdCB1c0lQQ1NvdXJjZSAleFxuIiwKKwkJKnB1c0lQQ1NvdXJjZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ZDAyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5oCkBAIC0wLDAgKzEsMzYyIEBACisvKgorKgorKiAzNzgwaS5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgMzc4MGkuYworKgorKgorKiBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuIElCTSBDb3Jwb3JhdGlvbgorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIE5PIFdBUlJBTlRZCisqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyoKKyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyoKKyoKKyogMTAvMjMvMjAwMCAtIEFscGhhIFJlbGVhc2UKKyoJRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisqLworCisjaWZuZGVmIF9MSU5VWF8zNzgwSV9ICisjZGVmaW5lIF9MSU5VWF8zNzgwSV9ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogRFNQIEkvTyBwb3J0IG9mZnNldHMgYW5kIGRlZmluaXRpb25zICovCisjZGVmaW5lIERTUF9Jc2FTbGF2ZUNvbnRyb2wgICAgICAgIDB4MDAwMAkvKiBJU0Egc2xhdmUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBEU1BfSXNhU2xhdmVTdGF0dXMgICAgICAgICAweDAwMDEJLyogSVNBIHNsYXZlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBEU1BfQ29uZmlnQWRkcmVzcyAgICAgICAgICAweDAwMDIJLyogR2VuZXJhbCBjb25maWcgYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSBEU1BfQ29uZmlnRGF0YSAgICAgICAgICAgICAweDAwMDMJLyogR2VuZXJhbCBjb25maWcgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBEU1BfSEJyaWRnZUNvbnRyb2wgICAgICAgICAweDAwMDIJLyogSEJyaWRnZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Nc2FBZGRyTG93ICAgICAgICAgICAgIDB4MDAwNAkvKiBNU1AgU3lzdGVtIEFkZHJlc3MsIGxvdyB3b3JkICovCisjZGVmaW5lIERTUF9Nc2FBZGRySGlnaCAgICAgICAgICAgIDB4MDAwNgkvKiBNU1AgU3lzdGVtIEFkZHJlc3MsIGhpZ2ggd29yZCAqLworI2RlZmluZSBEU1BfTXNhRGF0YURTSVNIaWdoICAgICAgICAweDAwMDgJLyogTVNBIGRhdGEgcmVnaXN0ZXI6IGQtc3RvcmUgd29yZCBvciBoaWdoIGJ5dGUgb2YgaS1zdG9yZSAqLworI2RlZmluZSBEU1BfTXNhRGF0YUlTTG93ICAgICAgICAgICAweDAwMEEJLyogTVNBIGRhdGEgcmVnaXN0ZXI6IGxvdyB3b3JkIG9mIGktc3RvcmUgKi8KKyNkZWZpbmUgRFNQX1JlYWRBbmRDbGVhciAgICAgICAgICAgMHgwMDBDCS8qIE1TQSByZWFkIGFuZCBjbGVhciBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9JbnRlcnJ1cHQgICAgICAgICAgICAgIDB4MDAwRQkvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgKElQQyBzb3VyY2UpICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIENsb2NrQ29udHJvbDoxOwkvKiBSVzogQ2xvY2sgY29udHJvbDogMD1ub3JtYWwsIDE9c3RvcCAzNzgwaSBjbG9ja3MgKi8KKwl1bnNpZ25lZCBjaGFyIFNvZnRSZXNldDoxOwkvKiBSVzogU29mdCByZXNldCAwPW5vcm1hbCwgMT1zb2Z0IHJlc2V0IGFjdGl2ZSAqLworCXVuc2lnbmVkIGNoYXIgQ29uZmlnTW9kZToxOwkvKiBSVzogQ29uZmlndXJhdGlvbiBtb2RlLCAwPW5vcm1hbCwgMT1jb25maWcgbW9kZSAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NTsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0lTQV9TTEFWRV9DT05UUk9MOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGVEc3BJbnQ6MTsJLyogUlc6IEVuYWJsZSBEU1AgdG8gWDg2IElTQSBpbnRlcnJ1cHQgMD1tYXNrIGl0LCAxPWVuYWJsZSBpdCAqLworCXVuc2lnbmVkIHNob3J0IE1lbUF1dG9JbmM6MTsJLyogUlc6IE1lbW9yeSBhZGRyZXNzIGF1dG8gaW5jcmVtZW50LCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisJdW5zaWduZWQgc2hvcnQgSW9BdXRvSW5jOjE7CS8qIFJXOiBJL08gYWRkcmVzcyBhdXRvIGluY3JlbWVudCwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworCXVuc2lnbmVkIHNob3J0IERpYWdub3N0aWNNb2RlOjE7CS8qIFJXOiBEaXNnbm9zdGljIG1vZGUgMD1ucm9tYWwsIDE9ZGlhZ25vc3RpYyBtb2RlICovCisJdW5zaWduZWQgc2hvcnQgSXNhUGFjaW5nVGltZXI6MTI7CS8qIFI6IElTQSBhY2Nlc3MgcGFjaW5nIHRpbWVyOiBjb3VudCBvZiBjb3JlIGN5Y2xlcyBzdG9sZW4gKi8KK30gRFNQX0hCUklER0VfQ09OVFJPTDsKKworCisvKiBEU1AgcmVnaXN0ZXIgaW5kZXhlcyB1c2VkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWRkcmVzcyAoaW5kZXgpIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9VYXJ0Q2ZnMUluZGV4ICAgICAgICAgIDB4MDAwMwkvKiBVQVJUIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIERTUF9VYXJ0Q2ZnMkluZGV4ICAgICAgICAgIDB4MDAwNAkvKiBVQVJUIGNvbmZpZyByZWdpc3RlciAyICovCisjZGVmaW5lIERTUF9IQnJpZGdlQ2ZnMUluZGV4ICAgICAgIDB4MDAwNwkvKiBIQnJpZGdlIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIERTUF9IQnJpZGdlQ2ZnMkluZGV4ICAgICAgIDB4MDAwOAkvKiBIQnJpZGdlIGNvbmZpZyByZWdpc3RlciAyICovCisjZGVmaW5lIERTUF9CdXNNYXN0ZXJDZmcxSW5kZXggICAgIDB4MDAwOQkvKiBJU0EgYnVzIG1hc3RlciBjb25maWcgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBEU1BfQnVzTWFzdGVyQ2ZnMkluZGV4ICAgICAweDAwMEEJLyogSVNBIGJ1cyBtYXN0ZXIgY29uZmlnIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRFNQX0lzYVByb3RDZmdJbmRleCAgICAgICAgMHgwMDBGCS8qIElTQSBwcm90b2NvbCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Qb3dlck1nQ2ZnSW5kZXggICAgICAgIDB4MDAxMAkvKiBMb3cgcG9zZXIgc3VzcGVuZC9yZXN1bWUgZW5hYmxlICovCisjZGVmaW5lIERTUF9IQnVzVGltZXJDZmdJbmRleCAgICAgIDB4MDAxMQkvKiBIQlVTIHRpbWVyIGxvYWQgdmFsdWUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgSXJxQWN0aXZlTG93OjE7CS8qIFJXOiBJUlEgYWN0aXZlIGhpZ2ggb3IgbG93OiAwPWhpZ2gsIDE9bG93ICovCisJdW5zaWduZWQgY2hhciBJcnFQdWxzZToxOwkvKiBSVzogSVJRIHB1bHNlIG9yIGxldmVsOiAwPWxldmVsLCAxPXB1bHNlICAqLworCXVuc2lnbmVkIGNoYXIgSXJxOjM7CS8qIFJXOiBJUlEgc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBCYXNlSU86MjsJLyogUlc6IEJhc2UgSS9PIHNlbGVjdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6MTsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX1VBUlRfQ0ZHXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogRW5hYmxlIEkvTyBhbmQgSVJROiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9VQVJUX0NGR18yOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBJcnFBY3RpdmVMb3c6MTsJLyogUlc6IElSUSBhY3RpdmUgaGlnaD0wIG9yIGxvdz0xICovCisJdW5zaWduZWQgY2hhciBJcnFQdWxzZToxOwkvKiBSVzogSVJRIHB1bHNlPTEgb3IgbGV2ZWw9MCAqLworCXVuc2lnbmVkIGNoYXIgSXJxOjM7CS8qIFJXOiBJUlEgc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBBY2Nlc3NNb2RlOjE7CS8qIFJXOiAxNi1iaXQgcmVnaXN0ZXIgYWNjZXNzIG1ldGhvZCAwPWJ5dGUsIDE9d29yZCAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6MjsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0hCUklER0VfQ0ZHXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogZW5hYmxlIEkvTyBhbmQgSVJROiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9IQlJJREdFX0NGR18yOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIERtYTozOwkvKiBSVzogRE1BIGNoYW5uZWwgc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBOdW1UcmFuc2ZlcnM6MjsJLyogUlc6IE1heGltdW0gIyBvZiB0cmFuc2ZlcnMgb25jZSBiZWluZyBncmFudGVkIHRoZSBJU0EgYnVzICovCisJdW5zaWduZWQgY2hhciBSZVJlcXVlc3Q6MjsJLyogUlc6IE1pbnVtdW0gZGVsYXkgYmV0d2VlbiByZWxlYXNpbmcgdGhlIElTQSBidXMgYW5kIHJlcXVlc3RpbmcgaXQgYWdhaW4gKi8KKwl1bnNpZ25lZCBjaGFyIE1FTUNTMTY6MTsJLyogUlc6IElTQSBzaWduYWwgTUVNQ1MxNjogMD1kaXNhYmxlZCwgMT1lbmFibGVkICovCit9IERTUF9CVVNNQVNURVJfQ0ZHXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIElzYU1lbUNtZFdpZHRoOjI7CS8qIFJXOiBJU0EgbWVtb3J5IGNvbW1hbmQgd2lkdGggKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjY7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9CVVNNQVNURVJfQ0ZHXzI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgR2F0ZUlPQ0hSRFk6MTsJLyogUlc6IEVuYWJsZSBJT0NIUkRZIGdhdGluZzogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfSVNBX1BST1RfQ0ZHOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IEVuYWJsZSBsb3cgcG93ZXIgc3VzcGVuZC9yZXN1bWUgMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfUE9XRVJfTUdNVF9DRkc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIExvYWRWYWx1ZTo4OwkvKiBSVzogSEJVUyB0aW1lciBsb2FkIHZhbHVlICovCit9IERTUF9IQlVTX1RJTUVSX0NGRzsKKworCisKKy8qIERTUCByZWdpc3RlcnMgdGhhdCBleGlzdCBpbiBNU0EgSS9PIHNwYWNlICovCisjZGVmaW5lIERTUF9DaGlwSUQgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRFNQX01zcEJvb3REb21haW4gICAgICAgICAgMHg4MDAwMDU4MAorI2RlZmluZSBEU1BfTEJ1c1RpbWVvdXREaXNhYmxlICAgICAweDgwMDAwNTgwCisjZGVmaW5lIERTUF9DbG9ja0NvbnRyb2xfMSAgICAgICAgIDB4ODAwMDA1OEEKKyNkZWZpbmUgRFNQX0Nsb2NrQ29udHJvbF8yICAgICAgICAgMHg4MDAwMDU4QworI2RlZmluZSBEU1BfQ2hpcFJlc2V0ICAgICAgICAgICAgICAweDgwMDAwNTg4CisjZGVmaW5lIERTUF9HcGlvTW9kZUNvbnRyb2xfMTVfOCAgIDB4ODAwMDAwODIKKyNkZWZpbmUgRFNQX0dwaW9Ecml2ZXJFbmFibGVfMTVfOCAgMHg4MDAwMDA3NgorI2RlZmluZSBEU1BfR3Bpb091dHB1dERhdGFfMTVfOCAgICAweDgwMDAwMDcyCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBOTUk6MTsJLyogUlc6IG5vbiBtYXNrYWJsZSBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBzaG9ydCBIYWx0OjE7CS8qIFJXOiBIYWx0IE1TUCBjbG9jayAqLworCXVuc2lnbmVkIHNob3J0IFJlc2V0Q29yZToxOwkvKiBSVzogUmVzZXQgTVNQIGNvcmUgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6MTM7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9CT09UX0RPTUFJTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IERpc2FibGVUaW1lb3V0OjE7CS8qIFJXOiBEaXNhYmxlIExCdXMgdGltZW91dCAqLworCXVuc2lnbmVkIHNob3J0IFJlc2VydmVkOjE1OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfTEJVU19USU1FT1VUX0RJU0FCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBNZW1vcnk6MTsJLyogUlc6IFJlc2V0IG1lbW9yeSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBTZXJpYWxQb3J0MToxOwkvKiBSVzogUmVzZXQgc2VyaWFsIHBvcnQgMSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBTZXJpYWxQb3J0MjoxOwkvKiBSVzogUmVzZXQgc2VyaWFsIHBvcnQgMiBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBTZXJpYWxQb3J0MzoxOwkvKiBSVzogUmVzZXQgc2VyaWFsIHBvcnQgMyBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBHcGlvOjE7CS8qIFJXOiBSZXNldCBHUElPIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IERtYToxOwkvKiBSVzogUmVzZXQgRE1BIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFNvdW5kQmxhc3RlcjoxOwkvKiBSVzogUmVzZXQgc291bmRibGFzdGVyIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFVhcnQ6MTsJLyogUlc6IFJlc2V0IFVBUlQgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgTWlkaToxOwkvKiBSVzogUmVzZXQgTUlESSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBJc2FNYXN0ZXI6MTsJLyogUlc6IFJlc2V0IElTQSBtYXN0ZXIgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6NjsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0NISVBfUkVTRVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBOX0Rpdmlzb3I6NjsJLyogUlc6IChOKSBQTEwgb3V0cHV0IGNsb2NrIGRpdmlzb3IgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZXNlcnZlZDE6MjsJLyogMDogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBNX011bHRpcGxpZXI6NjsJLyogUlc6IChNKSBQTEwgZmVlZGJhY2sgY2xvY2sgbXVsdGlwbGllciAqLworCXVuc2lnbmVkIHNob3J0IFJlc2VydmVkMjoyOwkvKiAwOiByZXNlcnZlZCAqLworfSBEU1BfQ0xPQ0tfQ09OVFJPTF8xOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgUGxsQnlwYXNzOjE7CS8qIFJXOiBQTEwgQnlwYXNzICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6MTU7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9DTE9DS19DT05UUk9MXzI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDg6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDk6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDEwOjE7CisJdW5zaWduZWQgc2hvcnQgTGF0Y2gxMToxOworCXVuc2lnbmVkIHNob3J0IExhdGNoMTI6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDEzOjE7CisJdW5zaWduZWQgc2hvcnQgTGF0Y2gxNDoxOworCXVuc2lnbmVkIHNob3J0IExhdGNoMTU6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrODoxOworCXVuc2lnbmVkIHNob3J0IE1hc2s5OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazEwOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazExOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazEyOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazEzOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazE0OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazE1OjE7Cit9IERTUF9HUElPX09VVFBVVF9EQVRBXzE1Xzg7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGU4OjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlOToxOworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTEwOjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlMTE6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGUxMjoxOworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTEzOjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlMTQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGUxNToxOworCXVuc2lnbmVkIHNob3J0IE1hc2s4OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazk6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTA6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTE6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTI6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTM6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTU6MTsKK30gRFNQX0dQSU9fRFJJVkVSX0VOQUJMRV8xNV84OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGU4OjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGU5OjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGUxMDoyOworCXVuc2lnbmVkIHNob3J0IEdwaW9Nb2RlMTE6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTEyOjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGUxMzoyOworCXVuc2lnbmVkIHNob3J0IEdwaW9Nb2RlMTQ6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTE1OjI7Cit9IERTUF9HUElPX01PREVfMTVfODsKKworLyogQ29tcG9uZW50IG1hc2tzIHRoYXQgYXJlIGRlZmluZWQgaW4gZHNwbWdyLmggKi8KKyNkZWZpbmUgTVdfQURDX01BU0sgICAgMHgwMDAxCisjZGVmaW5lIE1XX0FJQzJfTUFTSyAgIDB4MDAwNgorI2RlZmluZSBNV19NSURJX01BU0sgICAweDAwMDgKKyNkZWZpbmUgTVdfQ0REQUNfTUFTSyAgMHg4MDAxCisjZGVmaW5lIE1XX0FJQzFfTUFTSyAgIDB4RTAwNgorI2RlZmluZSBNV19VQVJUX01BU0sgICAweEUwMEEKKyNkZWZpbmUgTVdfQUNJX01BU0sgICAgMHhFMDBCCisKKy8qCisqIERlZmluaXRpb24gb2YgMzc4MGkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICBVbmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwKKyogdGhlc2UgdmFsdWVzIGFyZSBwcm92aWRlZCBhcyBpbnB1dCB0byB0aGUgMzc4MGkgc3VwcG9ydCBsYXllci4gIEF0IHByZXNlbnQsCisqIHRoZSBvbmx5IHZhbHVlcyBtYWludGFpbmVkIGJ5IHRoZSAzNzgwaSBzdXBwb3J0IGxheWVyIGFyZSB0aGUgc2F2ZWQgVUFSVAorKiByZWdpc3RlcnMuCisqLwordHlwZWRlZiBzdHJ1Y3QgX0RTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgeworCisJLyogTG9jYXRpb24gb2YgYmFzZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJdW5zaWduZWQgc2hvcnQgdXNCYXNlQ29uZmlnSU87CisKKwkvKiBFbmFibGVzIGZvciB2YXJpb3VzIERTUCBjb21wb25lbnRzICovCisJaW50IGJEU1BFbmFibGVkOworCWludCBiTW9kZW1FbmFibGVkOworCWludCBiSW50ZXJydXB0Q2xhaW1lZDsKKworCS8qIElSUSwgRE1BLCBhbmQgQmFzZSBJL08gYWRkcmVzc2VzIGZvciB2YXJpb3VzIERTUCBjb21wb25lbnRzICovCisJdW5zaWduZWQgc2hvcnQgdXNEc3BJcnE7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BEbWE7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU87CisJdW5zaWduZWQgc2hvcnQgdXNVYXJ0SXJxOworCXVuc2lnbmVkIHNob3J0IHVzVWFydEJhc2VJTzsKKworCS8qIElSUSBtb2RlcyBmb3IgdmFyaW91cyBEU1AgY29tcG9uZW50cyAqLworCWludCBiRHNwSXJxQWN0aXZlTG93OworCWludCBiVWFydElycUFjdGl2ZUxvdzsKKwlpbnQgYkRzcElycVB1bHNlOworCWludCBiVWFydElycVB1bHNlOworCisJLyogQ2FyZCBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCB1SXBzOworCXVuc2lnbmVkIHVEU3RvcmVTaXplOworCXVuc2lnbmVkIHVJU3RvcmVTaXplOworCXVuc2lnbmVkIHVEbWFCYW5kd2lkdGg7CisKKwkvKiBBZGFwdGVyIHNwZWNpZmljIDM3ODBpIHNldHRpbmdzICovCisJdW5zaWduZWQgc2hvcnQgdXNOdW1UcmFuc2ZlcnM7CisJdW5zaWduZWQgc2hvcnQgdXNSZVJlcXVlc3Q7CisJaW50IGJFbmFibGVNRU1DUzE2OworCXVuc2lnbmVkIHNob3J0IHVzSXNhTWVtQ21kV2lkdGg7CisJaW50IGJHYXRlSU9DSFJEWTsKKwlpbnQgYkVuYWJsZVB3ck1nbXQ7CisJdW5zaWduZWQgc2hvcnQgdXNIQnVzVGltZXJMb2FkVmFsdWU7CisJaW50IGJEaXNhYmxlTEJ1c1RpbWVvdXQ7CisJdW5zaWduZWQgc2hvcnQgdXNOX0Rpdmlzb3I7CisJdW5zaWduZWQgc2hvcnQgdXNNX011bHRpcGxpZXI7CisJaW50IGJQbGxCeXBhc3M7CisJdW5zaWduZWQgc2hvcnQgdXNDaGlwbGV0RW5hYmxlOwkvKiBVc2VkIHdpdGggdGhlIGNoaXAgcmVzZXQgcmVnaXN0ZXIgdG8gZW5hYmxlIHNwZWNpZmljIGNoaXBsZXRzICovCisKKwkvKiBTYXZlZCBVQVJUIHJlZ2lzdGVycy4gVGhlc2UgYXJlIG1haW50YWluZWQgYnkgdGhlIDM3ODBpIHN1cHBvcnQgbGF5ZXIuICovCisJaW50IGJVYXJ0U2F2ZWQ7CQkvKiBUcnVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzYXZlIG9mIHRoZSBVQVJUIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGNoYXIgdWNJRVI7CS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjRkNSOwkvKiBGSUZPIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjTENSOwkvKiBMaW5lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjTUNSOwkvKiBNb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgY2hhciB1Y1NDUjsJLyogU2NyYXRjaCByZWdpc3RlciAqLworCXVuc2lnbmVkIGNoYXIgdWNETEw7CS8qIERpdmlzb3IgbGF0Y2gsIGxvdyBieXRlICovCisJdW5zaWduZWQgY2hhciB1Y0RMTTsJLyogRGl2aXNvciBsYXRjaCwgaGlnaCBieXRlICovCit9IERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1M7CisKKworLyogMzc4MGkgc3VwcG9ydCBmdW5jdGlvbnMgKi8KK2ludCBkc3AzNzgwSV9FbmFibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnBJcnFNYXAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwRG1hTWFwKTsKK2ludCBkc3AzNzgwSV9EaXNhYmxlRFNQKERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpOworaW50IGRzcDM3ODBJX1Jlc2V0KERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpOworaW50IGRzcDM3ODBJX1J1bihEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzKTsKK2ludCBkc3AzNzgwSV9SZWFkRFN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcik7CitpbnQgZHNwMzc4MElfV3JpdGVEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9SZWFkSVN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9Xcml0ZUlTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOwordW5zaWduZWQgc2hvcnQgZHNwMzc4MElfUmVhZE1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIpOwordm9pZCBkc3AzNzgwSV9Xcml0ZU1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIsIHVuc2lnbmVkIHNob3J0IHVzVmFsdWUpOwordm9pZCBkc3AzNzgwSV9Xcml0ZUdlbkNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdW5zaWduZWQgdUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVjVmFsdWUpOwordW5zaWduZWQgY2hhciBkc3AzNzgwSV9SZWFkR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVJbmRleCk7CitpbnQgZHNwMzc4MElfR2V0SVBDU291cmNlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcHVzSVBDU291cmNlKTsKKworLyogSS9PIHBvcnQgYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBNS1dPUkQodmFyKSAoKigodW5zaWduZWQgc2hvcnQgKikoJnZhcikpKQorI2RlZmluZSBNS0JZVEUodmFyKSAoKigodW5zaWduZWQgY2hhciAqKSgmdmFyKSkpCisKKyNkZWZpbmUgV3JpdGVNc2FDZmcoYWRkcix2YWx1ZSkgZHNwMzc4MElfV3JpdGVNc2FDZmcodXNEc3BCYXNlSU8sYWRkcix2YWx1ZSkKKyNkZWZpbmUgUmVhZE1zYUNmZyhhZGRyKSBkc3AzNzgwSV9SZWFkTXNhQ2ZnKHVzRHNwQmFzZUlPLGFkZHIpCisjZGVmaW5lIFdyaXRlR2VuQ2ZnKGluZGV4LHZhbHVlKSBkc3AzNzgwSV9Xcml0ZUdlbkNmZyh1c0RzcEJhc2VJTyxpbmRleCx2YWx1ZSkKKyNkZWZpbmUgUmVhZEdlbkNmZyhpbmRleCkgZHNwMzc4MElfUmVhZEdlbkNmZyh1c0RzcEJhc2VJTyxpbmRleCkKKworI2RlZmluZSBJbldvcmREc3AoaW5kZXgpICAgICAgICAgIGludyh1c0RzcEJhc2VJTytpbmRleCkKKyNkZWZpbmUgSW5CeXRlRHNwKGluZGV4KSAgICAgICAgICBpbmIodXNEc3BCYXNlSU8raW5kZXgpCisjZGVmaW5lIE91dFdvcmREc3AoaW5kZXgsdmFsdWUpICAgb3V0dyh2YWx1ZSx1c0RzcEJhc2VJTytpbmRleCkKKyNkZWZpbmUgT3V0Qnl0ZURzcChpbmRleCx2YWx1ZSkgICBvdXRiKHZhbHVlLHVzRHNwQmFzZUlPK2luZGV4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9td2F2ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRjOWUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFDUCBNb2RlbSAoTXdhdmUpLgorIworIyBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm8uIDxwYXVsc2NoQHVzLmlibS5jb20+CisjCisKK29iai0kKENPTkZJR19NV0FWRSkgKz0gbXdhdmUubworCittd2F2ZS1vYmpzIDo9IG13YXZlZGQubyBzbWFwaS5vIHRwMzc4MGkubyAzNzgwaS5vCisKKyMgVG8gaGF2ZSB0aGUgbXdhdmUgZHJpdmVyIGRpc2FibGUgb3RoZXIgdWFydHMgaWYgbmVjZXNzYXJ5CisjIEVYVFJBX0NGTEFHUyArPSAtRE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisKKyMgVG8gY29tcGlsZSBpbiBsb3RzICh+MjAgS2lCKSBvZiBydW4tdGltZSBlbmFibGFibGUgcHJpbnRrKClzIGZvciBkZWJ1Z2dpbmc6CitFWFRSQV9DRkxBR1MgKz0gLURNV19UUkFDRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL1JFQURNRSBiL2RyaXZlcnMvY2hhci9td2F2ZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmOGQxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9SRUFETUUKQEAgLTAsMCArMSw1MCBAQAorTW9kdWxlIG9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBtd2F2ZSBtb2R1bGUgdGFrZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zLiAgTm90ZSB0aGF0IHRoZXNlIG9wdGlvbnMKK2FyZSBub3Qgc2F2ZWQgYnkgdGhlIEJJT1MgYW5kIHNvIGRvIG5vdCBwZXJzaXN0IGFmdGVyIHVubG9hZCBhbmQgcmVsb2FkLgorCisgIG13YXZlX2RlYnVnPXZhbHVlLCB3aGVyZSB2YWx1ZSBpcyBiaXR3aXNlIE9SIG9mIHRyYWNlIGZsYWdzOgorCTB4MDAwMSBtd2F2ZWRkIGFwaSB0cmFjaW5nCisJMHgwMDAyIHNtYXBpIGFwaSB0cmFjaW5nCisJMHgwMDA0IDM3ODBpIHRyYWNpbmcKKwkweDAwMDggdHAzNzgwaSB0cmFjaW5nCisKKyAgICAgICAgVHJhY2luZyBvbmx5IG9jY3VycyBpZiB0aGUgZHJpdmVyIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggdGhlCisgICAgICAgIE1XX1RSQUNFIG1hY3JvICNkZWZpbmVkICAoaS5lLiBsZXQgRVhUUkFfQ0ZMQUdTICs9IC1ETVdfVFJBQ0UKKyAgICAgICAgaW4gdGhlIE1ha2VmaWxlKS4KKworICBtd2F2ZV8zNzgwaV9pcnE9NS83LzEwLzExLzE1CisJSWYgdGhlIGRzcCBpcnEgaGFzIG5vdCBiZWVuIHNldHVwIGFuZCBzdG9yZWQgaW4gYmlvcyBieSB0aGUgCisJdGhpbmtwYWQgY29uZmlndXJhdGlvbiB1dGlsaXR5IHRoZW4gdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRoZQorCWlycSB1c2VkIGJ5IHRoZSBkc3AgdG8gYmUgY29uZmlndXJlZC4KKworICBtd2F2ZV8zNzgwaV9pbz0weDEzMC8weDM1MC8weDAwNzAvMHhEQjAKKwlJZiB0aGUgZHNwIGlvIHJhbmdlIGhhcyBub3QgYmVlbiBzZXR1cCBhbmQgc3RvcmVkIGluIGJpb3MgYnkgdGhlIAorCXRoaW5rcGFkIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSB0aGVuIHRoaXMgcGFyYW1ldGVyIGFsbG93cyB0aGUKKwlpbyByYW5nZSB1c2VkIGJ5IHRoZSBkc3AgdG8gYmUgY29uZmlndXJlZC4KKworICBtd2F2ZV91YXJ0X2lycT0zLzQKKwlJZiB0aGUgbXdhdmUncyB1YXJ0IGlycSBoYXMgbm90IGJlZW4gc2V0dXAgYW5kIHN0b3JlZCBpbiBiaW9zIGJ5IHRoZSAKKwl0aGlua3BhZCBjb25maWd1cmF0aW9uIHV0aWxpdHkgdGhlbiB0aGlzIHBhcmFtZXRlciBhbGxvd3MgdGhlCisJaXJxIHVzZWQgYnkgdGhlIG13YXZlIHVhcnQgdG8gYmUgY29uZmlndXJlZC4KKworICBtd2F2ZV91YXJ0X2lvPTB4M2Y4LzB4MmY4LzB4M0U4LzB4MkU4CisJSWYgdGhlIHVhcnQgaW8gcmFuZ2UgaGFzIG5vdCBiZWVuIHNldHVwIGFuZCBzdG9yZWQgaW4gYmlvcyBieSB0aGUgCisJdGhpbmtwYWQgY29uZmlndXJhdGlvbiB1dGlsaXR5IHRoZW4gdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRoZQorCWlvIHJhbmdlIHVzZWQgYnkgdGhlIG13YXZlIHVhcnQgdG8gYmUgY29uZmlndXJlZC4KKworRXhhbXBsZSB0byBlbmFibGUgdGhlIDM3ODBpIERTUCB1c2luZyB0dHlTMSByZXNvdXJjZXM6CisJCisgIGluc21vZCBtd2F2ZSBtd2F2ZV8zNzgwaV9pcnE9MTAgbXdhdmVfMzc4MGlfaW89MHgwMTMwIG13YXZlX3VhcnRfaXJxPTMgbXdhdmVfdWFydF9pbz0weDJmOAorCitBY2Nlc3NpbmcgdGhlIGRyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IG11c3QgYWxzbyBjcmVhdGUgYSBub2RlIGZvciB0aGUgZHJpdmVyLiAgV2l0aG91dCBkZXZmczoKKyAgbWtkaXIgLXAgL2Rldi9tb2RlbXMKKyAgbWtub2QgLS1tb2RlPTY2MCAvZGV2L21vZGVtcy9td2F2ZSBjIDEwIDIxOQorV2l0aCBkZXZmczoKKyAgbWtkaXIgLXAgL2Rldi9tb2RlbXMKKyAgbG4gLXMgLi4vbWlzYy9td2F2ZSAvZGV2L21vZGVtcy9td2F2ZQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc2MjVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwpAQCAtMCwwICsxLDY3NCBAQAorLyoKKyoKKyogbXdhdmVkZC5jIC0tIG13YXZlIGRldmljZSBkcml2ZXIKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNtYXBpLmgiCisjaW5jbHVkZSAibXdhdmVkZC5oIgorI2luY2x1ZGUgIjM3ODBpLmgiCisjaW5jbHVkZSAidHAzNzgwaS5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIjM3ODBpIEFkdmFuY2VkIENvbW11bmljYXRpb25zIFByb2Nlc3NvciAoTXdhdmUpIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBTdWxsaXZhbiBhbmQgUGF1bCBTY2hyb2VkZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyogVGhlc2UgcGFyYW1ldGVycyBzdXBwb3J0IHRoZSBzZXR0aW5nIG9mIE1XYXZlIHJlc291cmNlcy4gTm90ZSB0aGF0IG5vCisqIGNoZWNrcyBhcmUgbWFkZSBhZ2FpbnN0IG90aGVyIGRldmljZXMgKGllLiBzdXBlcmlvKSBmb3IgY29uZmxpY3RzLgorKiBXZSdsbCBkZXBlbmQgb24gdXNlcnMgdXNpbmcgdGhlIHRwY3RsIHV0aWxpdHkgdG8gZG8gdGhhdCBmb3Igbm93CisqLworaW50IG13YXZlX2RlYnVnID0gMDsKK2ludCBtd2F2ZV8zNzgwaV9pcnEgPSAwOworaW50IG13YXZlXzM3ODBpX2lvID0gMDsKK2ludCBtd2F2ZV91YXJ0X2lycSA9IDA7CitpbnQgbXdhdmVfdWFydF9pbyA9IDA7Cittb2R1bGVfcGFyYW0obXdhdmVfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXdhdmVfMzc4MGlfaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG13YXZlXzM3ODBpX2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG13YXZlX3VhcnRfaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG13YXZlX3VhcnRfaW8sIGludCwgMCk7CisKK3N0YXRpYyBpbnQgbXdhdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IG13YXZlX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgbXdhdmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpb2NtZCwgdW5zaWduZWQgbG9uZyBpb2FyZyk7CisKK01XQVZFX0RFVklDRV9EQVRBIG13YXZlX3NfbWRkOworCitzdGF0aWMgaW50IG13YXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX29wZW4sIGVudHJ5IGlub2RlICVwIGZpbGUgJXBcbiIsCisJCSBpbm9kZSwgZmlsZSk7CisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9vcGVuLCBleGl0IHJldHVybiByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG13YXZlX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCByZXR2YWwgPSAwOworCisJUFJJTlRLXzMoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9jbG9zZSwgZW50cnkgaW5vZGUgJXAgZmlsZSAlcFxuIiwKKwkJIGlub2RlLCAgZmlsZSk7CisKKwlQUklOVEtfMihUUkFDRV9NV0FWRSwgIm13YXZlZGQ6Om13YXZlX2Nsb3NlLCBleGl0IHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbXdhdmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpb2NtZCwgdW5zaWduZWQgbG9uZyBpb2FyZykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKKwlwTVdBVkVfREVWSUNFX0RBVEEgcERydkRhdGEgPSAmbXdhdmVfc19tZGQ7CisJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKWlvYXJnOworCisJUFJJTlRLXzUoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgZW50cnkgaW5vZGUgJXAgZmlsZSAlcCBjbWQgJXggYXJnICV4XG4iLAorCQkgaW5vZGUsICBmaWxlLCBpb2NtZCwgKGludCkgaW9hcmcpOworCisJc3dpdGNoIChpb2NtZCkgeworCisJCWNhc2UgSU9DVExfTVdfUkVTRVQ6CisJCQlQUklOVEtfMShUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIElPQ1RMX01XX1JFU0VUIgorCQkJCSIgY2FsbGluZyB0cDM3ODBJX1Jlc2V0RFNQXG4iKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVzZXREU1AoJnBEcnZEYXRhLT5yQkREYXRhKTsKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfUkVTRVQiCisJCQkJIiByZXR2YWwgJXggZnJvbSB0cDM3ODBJX1Jlc2V0RFNQXG4iLAorCQkJCXJldHZhbCk7CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19SVU46CisJCQlQUklOVEtfMShUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIElPQ1RMX01XX1JVTiIKKwkJCQkiIGNhbGxpbmcgdHAzNzgwSV9TdGFydERTUFxuIik7CisJCQlyZXR2YWwgPSB0cDM3ODBJX1N0YXJ0RFNQKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIElPQ1RMX01XX1JVTiIKKwkJCQkiIHJldHZhbCAleCBmcm9tIHRwMzc4MElfU3RhcnREU1BcbiIsCisJCQkJcmV0dmFsKTsKKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX0RTUF9BQklMSVRJRVM6IHsKKwkJCU1XX0FCSUxJVElFUyByQWJpbGl0aWVzOworCQorCQkJUFJJTlRLXzEoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsLCIKKwkJCQkiIElPQ1RMX01XX0RTUF9BQklMSVRJRVMgY2FsbGluZyIKKwkJCQkiIHRwMzc4MElfUXVlcnlBYmlsaXRpZXNcbiIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9RdWVyeUFiaWxpdGllcygmcERydkRhdGEtPnJCRERhdGEsCisJCQkJCSZyQWJpbGl0aWVzKTsKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfRFNQX0FCSUxJVElFUyIKKwkJCQkiIHJldHZhbCAleCBmcm9tIHRwMzc4MElfUXVlcnlBYmlsaXRpZXNcbiIsCisJCQkJcmV0dmFsKTsKKwkJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJCWlmKCBjb3B5X3RvX3VzZXIoYXJnLCAmckFiaWxpdGllcywKKwkJCQkJCQlzaXplb2YoTVdfQUJJTElUSUVTKSkgKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfRFNQX0FCSUxJVElFUyIKKwkJCQkiIGV4aXQgcmV0dmFsICV4XG4iLAorCQkJCXJldHZhbCk7CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1JFQURfREFUQToKKwkJY2FzZSBJT0NUTF9NV19SRUFEQ0xFQVJfREFUQTogeworCQkJTVdfUkVBRFdSSVRFIHJSZWFkRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmclJlYWREYXRhLCBhcmcsCisJCQkJCQlzaXplb2YoTVdfUkVBRFdSSVRFKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHVzQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoclJlYWREYXRhLnBCdWYpOworCQorCQkJUFJJTlRLXzQoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX1JFQURfREFUQSwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyUmVhZERhdGEudWxEYXRhTGVuZ3RoLCBpb2FyZywgcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJaW9jbWQsCisJCQkJCXB1c0J1ZmZlciwKKwkJCQkJclJlYWREYXRhLnVsRGF0YUxlbmd0aCwKKwkJCQkJclJlYWREYXRhLnVzRHNwQWRkcmVzcyk7CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1JFQURfSU5TVDogeworCQkJTVdfUkVBRFdSSVRFIHJSZWFkRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmclJlYWREYXRhLCBhcmcsCisJCQkJCQlzaXplb2YoTVdfUkVBRFdSSVRFKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHVzQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoclJlYWREYXRhLnBCdWYpOworCQorCQkJUFJJTlRLXzQoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX1JFQURfSU5TVCwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyUmVhZERhdGEudWxEYXRhTGVuZ3RoIC8gMiwgaW9hcmcsCisJCQkJcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQlpb2NtZCwgcHVzQnVmZmVyLAorCQkJCXJSZWFkRGF0YS51bERhdGFMZW5ndGggLyAyLAorCQkJCXJSZWFkRGF0YS51c0RzcEFkZHJlc3MpOworCQl9CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19XUklURV9EQVRBOiB7CisJCQlNV19SRUFEV1JJVEUgcldyaXRlRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmcldyaXRlRGF0YSwgYXJnLAorCQkJCQkJc2l6ZW9mKE1XX1JFQURXUklURSkpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB1c0J1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHJXcml0ZURhdGEucEJ1Zik7CisJCisJCQlQUklOVEtfNChUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfV1JJVEVfREFUQSwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyV3JpdGVEYXRhLnVsRGF0YUxlbmd0aCwgaW9hcmcsCisJCQkJcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJaW9jbWQsIHB1c0J1ZmZlciwKKwkJCQkJcldyaXRlRGF0YS51bERhdGFMZW5ndGgsCisJCQkJCXJXcml0ZURhdGEudXNEc3BBZGRyZXNzKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfV1JJVEVfSU5TVDogeworCQkJTVdfUkVBRFdSSVRFIHJXcml0ZURhdGE7CisJCQl1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKnB1c0J1ZmZlciA9IE5VTEw7CisJCisJCQlpZiggY29weV9mcm9tX3VzZXIoJnJXcml0ZURhdGEsIGFyZywKKwkJCQkJCXNpemVvZihNV19SRUFEV1JJVEUpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdXNCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQgX191c2VyICopKHJXcml0ZURhdGEucEJ1Zik7CisJCisJCQlQUklOVEtfNChUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfV1JJVEVfSU5TVCwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyV3JpdGVEYXRhLnVsRGF0YUxlbmd0aCwgaW9hcmcsCisJCQkJcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJaW9jbWQsIHB1c0J1ZmZlciwKKwkJCQkJcldyaXRlRGF0YS51bERhdGFMZW5ndGgsCisJCQkJCXJXcml0ZURhdGEudXNEc3BBZGRyZXNzKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfUkVHSVNURVJfSVBDOiB7CisJCQl1bnNpZ25lZCBpbnQgaXBjbnVtID0gKHVuc2lnbmVkIGludCkgaW9hcmc7CisJCisJCQlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfUkVHSVNURVJfSVBDIgorCQkJCSIgaXBjbnVtICV4IGVudHJ5IHVzSW50Q291bnQgJXhcbiIsCisJCQkJaXBjbnVtLAorCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCk7CisJCisJCQlpZiAoaXBjbnVtID4gQVJSQVlfU0laRShwRHJ2RGF0YS0+SVBDcykpIHsKKwkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bDoiCisJCQkJCQkiIElPQ1RMX01XX1JFR0lTVEVSX0lQQzoiCisJCQkJCQkiIEVycm9yOiBJbnZhbGlkIGlwY251bSAleFxuIiwKKwkJCQkJCWlwY251bSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSBGQUxTRTsKKwkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9IFRSVUU7CisJCisJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfUkVHSVNURVJfSVBDIgorCQkJCSIgaXBjbnVtICV4IGV4aXRcbiIsCisJCQkJaXBjbnVtKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfR0VUX0lQQzogeworCQkJdW5zaWduZWQgaW50IGlwY251bSA9ICh1bnNpZ25lZCBpbnQpIGlvYXJnOworCQorCQkJUFJJTlRLXzMoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX0dFVF9JUEMiCisJCQkJIiBpcGNudW0gJXgsIHVzSW50Q291bnQgJXhcbiIsCisJCQkJaXBjbnVtLAorCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCk7CisJCQlpZiAoaXBjbnVtID4gQVJSQVlfU0laRShwRHJ2RGF0YS0+SVBDcykpIHsKKwkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bDoiCisJCQkJCQkiIElPQ1RMX01XX0dFVF9JUEM6IEVycm9yOiIKKwkJCQkJCSIgSW52YWxpZCBpcGNudW0gJXhcbiIsIGlwY251bSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCisJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IFRSVUUpIHsKKwkJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIHRocmVhZCBmb3IiCisJCQkJCSIgaXBjICV4IGdvaW5nIHRvIHNsZWVwXG4iLAorCQkJCQlpcGNudW0pOworCQkJCWFkZF93YWl0X3F1ZXVlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlLCAmd2FpdCk7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gVFJVRTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCS8qIGNoZWNrIHdoZXRoZXIgYW4gZXZlbnQgd2FzIHNpZ25hbGxlZCBieSAqLworCQkJCS8qIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZSB3ZSB3ZXJlIGdvbmUgKi8KKwkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50ID09IDEpIHsJLyogZmlyc3QgaW50IGhhcyBvY2N1cnJlZCAocmFjZSBjb25kaXRpb24pICovCisJCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCA9IDI7CS8qIGZpcnN0IGludCBoYXMgYmVlbiBoYW5kbGVkICovCisJCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIgorCQkJCQkJIiBJT0NUTF9NV19HRVRfSVBDIGlwY251bSAleCIKKwkJCQkJCSIgaGFuZGxpbmcgZmlyc3QgaW50XG4iLAorCQkJCQkJaXBjbnVtKTsKKwkJCQl9IGVsc2UgewkvKiBlaXRoZXIgMXN0IGludCBoYXMgbm90IHlldCBvY2N1cnJlZCwgb3Igd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIGZpcnN0IGludCAqLworCQkJCQlzY2hlZHVsZSgpOworCQkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50ID09IDEpIHsKKwkJCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCA9IDI7CisJCQkJCX0KKwkJCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwiCisJCQkJCQkiIElPQ1RMX01XX0dFVF9JUEMgaXBjbnVtICV4IgorCQkJCQkJIiB3b2tlIHVwIGFuZCByZXR1cm5pbmcgdG8iCisJCQkJCQkiIGFwcGxpY2F0aW9uXG4iLAorCQkJCQkJaXBjbnVtKTsKKwkJCQl9CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gRkFMU0U7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfR0VUX0lQQywiCisJCQkJCSIgcmV0dXJuaW5nIHRocmVhZCBmb3IgaXBjICV4IgorCQkJCQkiIHByb2Nlc3NpbmdcbiIsCisJCQkJCWlwY251bSk7CisJCQl9CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1VOUkVHSVNURVJfSVBDOiB7CisJCQl1bnNpZ25lZCBpbnQgaXBjbnVtID0gKHVuc2lnbmVkIGludCkgaW9hcmc7CisJCisJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfVU5SRUdJU1RFUl9JUEMiCisJCQkJIiBpcGNudW0gJXhcbiIsCisJCQkJaXBjbnVtKTsKKwkJCWlmIChpcGNudW0gPiBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKSkgeworCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsOiIKKwkJCQkJCSIgSU9DVExfTVdfVU5SRUdJU1RFUl9JUEM6IgorCQkJCQkJIiBFcnJvcjogSW52YWxpZCBpcGNudW0gJXhcbiIsCisJCQkJCQlpcGNudW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gRkFMU0U7CisJCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9PSBUUlVFKSB7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcERydkRhdGEtPklQQ3NbaXBjbnVtXS5pcGNfd2FpdF9xdWV1ZSk7CisJCQkJfQorCQkJfQorCQl9CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAibXdhdmVkZDo6bXdhdmVfaW9jdGw6IgorCQkJCQkiIEVycm9yOiBVbnJlY29nbml6ZWQgaW9jbWQgJXhcbiIsCisJCQkJCWlvY21kKTsKKwkJCXJldHVybiAtRU5PVFRZOworCQkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKi8KKworCVBSSU5US18yKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfaW9jdGwsIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgc3NpemVfdCBtd2F2ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqIHBwb3MpCit7CisJUFJJTlRLXzUoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9yZWFkIGVudHJ5IGZpbGUgJXAsIGJ1ZiAlcCwgY291bnQgJXp4IHBwb3MgJXBcbiIsCisJCWZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIHNzaXplX3QgbXdhdmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJUFJJTlRLXzUoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV93cml0ZSBlbnRyeSBmaWxlICVwLCBidWYgJXAsIgorCQkiIGNvdW50ICV6eCBwcG9zICVwXG4iLAorCQlmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfc2VyaWFsX3BvcnRhbmRpcnEodW5zaWduZWQgaW50IHBvcnQsIGludCBpcnEpCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaWFsOworCisJc3dpdGNoICggcG9ydCApIHsKKwkJY2FzZSAweDNmODoKKwkJY2FzZSAweDJmODoKKwkJY2FzZSAweDNlODoKKwkJY2FzZSAweDJlODoKKwkJCS8qIE9LICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkibXdhdmVkZDo6cmVnaXN0ZXJfc2VyaWFsX3BvcnRhbmRpcnE6IgorCQkJCQkiIEVycm9yOiBJbGxlZ2FsIHBvcnQgJXhcbiIsIHBvcnQgKTsKKwkJCXJldHVybiAtMTsKKwl9IC8qIHN3aXRjaCAqLworCS8qIHBvcnQgaXMgb2theSAqLworCisJc3dpdGNoICggaXJxICkgeworCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQljYXNlIDc6CisJCQkvKiBPSyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJIm13YXZlZGQ6OnJlZ2lzdGVyX3NlcmlhbF9wb3J0YW5kaXJxOiIKKwkJCQkJIiBFcnJvcjogSWxsZWdhbCBpcnEgJXhcbiIsIGlycSApOworCQkJcmV0dXJuIC0xOworCX0gLyogc3dpdGNoICovCisJLyogaXJxIGlzIG9rYXkgKi8KKworCW1lbXNldCgmc2VyaWFsLCAwLCBzaXplb2Yoc2VyaWFsKSk7CisJc2VyaWFsLnBvcnQgPSBwb3J0OworCXNlcmlhbC5pcnEgPSBpcnE7CisJc2VyaWFsLmZsYWdzID0gQVNZTkNfU0hBUkVfSVJROworCisJcmV0dXJuIHJlZ2lzdGVyX3NlcmlhbCgmc2VyaWFsKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtd2F2ZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBtd2F2ZV9yZWFkLAorCS53cml0ZQkJPSBtd2F2ZV93cml0ZSwKKwkuaW9jdGwJCT0gbXdhdmVfaW9jdGwsCisJLm9wZW4JCT0gbXdhdmVfb3BlbiwKKwkucmVsZWFzZQk9IG13YXZlX2Nsb3NlCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtd2F2ZV9taXNjX2RldiA9IHsgTVdBVkVfTUlOT1IsICJtd2F2ZSIsICZtd2F2ZV9mb3BzIH07CisKKyNpZiAwIC8qIHRvdGFsbHkgYjBya2VkICovCisvKgorICogc3lzZnMgc3VwcG9ydCA8cGF1bHNjaEB1cy5pYm0uY29tPgorICovCisKK3N0cnVjdCBkZXZpY2UgbXdhdmVfZGV2aWNlOworCisvKiBQcmV2ZW50IGNvZGUgcmVkdW5kYW5jeSwgY3JlYXRlIGEgbWFjcm8gZm9yIG13YXZlX3Nob3dfKiBmdW5jdGlvbnMuICovCisjZGVmaW5lIG13YXZlX3Nob3dfZnVuY3Rpb24oYXR0cl9uYW1lLCBmb3JtYXRfc3RyaW5nLCBmaWVsZCkJCVwKK3N0YXRpYyBzc2l6ZV90IG13YXZlX3Nob3dfIyNhdHRyX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0JCQkJXAorCQkmbXdhdmVfc19tZGQuckJERGF0YS5yRHNwU2V0dGluZ3M7CQkJXAorICAgICAgICByZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdF9zdHJpbmcsIHBTZXR0aW5ncy0+ZmllbGQpOwkJXAorfQorCisvKiBBbGwgb2Ygb3VyIGF0dHJpYnV0ZXMgYXJlIHJlYWQgYXR0cmlidXRlcy4gKi8KKyNkZWZpbmUgbXdhdmVfZGV2X3JkX2F0dHIoYXR0cl9uYW1lLCBmb3JtYXRfc3RyaW5nLCBmaWVsZCkJCVwKKwltd2F2ZV9zaG93X2Z1bmN0aW9uKGF0dHJfbmFtZSwgZm9ybWF0X3N0cmluZywgZmllbGQpCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoYXR0cl9uYW1lLCBTX0lSVUdPLCBtd2F2ZV9zaG93XyMjYXR0cl9uYW1lLCBOVUxMKQorCittd2F2ZV9kZXZfcmRfYXR0ciAoMzc4MGlfZG1hLCAiJWlcbiIsIHVzRHNwRG1hKTsKK213YXZlX2Rldl9yZF9hdHRyICgzNzgwaV9pcnEsICIlaVxuIiwgdXNEc3BJcnEpOworbXdhdmVfZGV2X3JkX2F0dHIgKDM3ODBpX2lvLCAiJSMuNHhcbiIsIHVzRHNwQmFzZUlPKTsKK213YXZlX2Rldl9yZF9hdHRyICh1YXJ0X2lycSwgIiVpXG4iLCB1c1VhcnRJcnEpOworbXdhdmVfZGV2X3JkX2F0dHIgKHVhcnRfaW8sICIlIy40eFxuIiwgdXNVYXJ0QmFzZUlPKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogY29uc3QgbXdhdmVfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyXzM3ODBpX2RtYSwKKwkmZGV2X2F0dHJfMzc4MGlfaXJxLAorCSZkZXZfYXR0cl8zNzgwaV9pbywKKwkmZGV2X2F0dHJfdWFydF9pcnEsCisJJmRldl9hdHRyX3VhcnRfaW8sCit9OworI2VuZGlmCisKKy8qCisqIG13YXZlX2luaXQgaXMgY2FsbGVkIG9uIG1vZHVsZSBsb2FkCisqCisqIG13YXZlX2V4aXQgaXMgY2FsbGVkIG9uIG1vZHVsZSB1bmxvYWQKKyogbXdhdmVfZXhpdCBpcyBhbHNvIHVzZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgYW4gYWJvcnRlZCBtd2F2ZV9pbml0CisqLworc3RhdGljIHZvaWQgbXdhdmVfZXhpdCh2b2lkKQoreworCXBNV0FWRV9ERVZJQ0VfREFUQSBwRHJ2RGF0YSA9ICZtd2F2ZV9zX21kZDsKKworCVBSSU5US18xKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfZXhpdCBlbnRyeVxuIik7CisKKyNpZiAwCisJZm9yIChpID0gMDsgaSA8IHBEcnZEYXRhLT5ucl9yZWdpc3RlcmVkX2F0dHJzOyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmbXdhdmVfZGV2aWNlLCBtd2F2ZV9kZXZfYXR0cnNbaV0pOworCXBEcnZEYXRhLT5ucl9yZWdpc3RlcmVkX2F0dHJzID0gMDsKKworCWlmIChwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQpIHsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJm13YXZlX2RldmljZSk7CisJCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KKyNlbmRpZgorCisJaWYgKCBwRHJ2RGF0YS0+c0xpbmUgPj0gMCApIHsKKwkJdW5yZWdpc3Rlcl9zZXJpYWwocERydkRhdGEtPnNMaW5lKTsKKwl9CisJaWYgKHBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkKSB7CisJCW1pc2NfZGVyZWdpc3RlcigmbXdhdmVfbWlzY19kZXYpOworCX0KKwlpZiAocERydkRhdGEtPmJEU1BFbmFibGVkKSB7CisJCXRwMzc4MElfRGlzYWJsZURTUCgmcERydkRhdGEtPnJCRERhdGEpOworCX0KKwlpZiAocERydkRhdGEtPmJSZXNvdXJjZXNDbGFpbWVkKSB7CisJCXRwMzc4MElfUmVsZWFzZVJlc291cmNlcygmcERydkRhdGEtPnJCRERhdGEpOworCX0KKwlpZiAocERydkRhdGEtPmJCREluaXRpYWxpemVkKSB7CisJCXRwMzc4MElfQ2xlYW51cCgmcERydkRhdGEtPnJCRERhdGEpOworCX0KKworCVBSSU5US18xKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfZXhpdCBleGl0XG4iKTsKK30KKworbW9kdWxlX2V4aXQobXdhdmVfZXhpdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IG13YXZlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0dmFsID0gMDsKKwlwTVdBVkVfREVWSUNFX0RBVEEgcERydkRhdGEgPSAmbXdhdmVfc19tZGQ7CisKKwlQUklOVEtfMShUUkFDRV9NV0FWRSwgIm13YXZlZGQ6Om13YXZlX2luaXQgZW50cnlcbiIpOworCisJbWVtc2V0KCZtd2F2ZV9zX21kZCwgMCwgc2l6ZW9mKE1XQVZFX0RFVklDRV9EQVRBKSk7CisKKwlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YkRTUFJlc2V0ID0gRkFMU0U7CisJcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+c0xpbmUgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKTsgaSsrKSB7CisJCXBEcnZEYXRhLT5JUENzW2ldLmJJc0VuYWJsZWQgPSBGQUxTRTsKKwkJcERydkRhdGEtPklQQ3NbaV0uYklzSGVyZSA9IEZBTFNFOworCQlwRHJ2RGF0YS0+SVBDc1tpXS51c0ludENvdW50ID0gMDsJLyogbm8gaW50cyByZWNlaXZlZCB5ZXQgKi8KKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcERydkRhdGEtPklQQ3NbaV0uaXBjX3dhaXRfcXVldWUpOworCX0KKworCXJldHZhbCA9IHRwMzc4MElfSW5pdGlhbGl6ZUJvYXJkRGF0YSgmcERydkRhdGEtPnJCRERhdGEpOworCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkibXdhdmVkZDo6bXdhdmVfaW5pdCwgcmV0dXJuIGZyb20gdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhIgorCQkiIHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBib2FyZCBkYXRhXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBUUlVFOworCisJcmV0dmFsID0gdHAzNzgwSV9DYWxjUmVzb3VyY2VzKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9pbml0LCByZXR1cm4gZnJvbSB0cDM3ODBJX0NhbGNSZXNvdXJjZXMiCisJCSIgcmV0dmFsICV4XG4iLAorCQlyZXR2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIGNhbGN1bGF0ZSByZXNvdXJjZXNcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCisJcmV0dmFsID0gdHAzNzgwSV9DbGFpbVJlc291cmNlcygmcERydkRhdGEtPnJCRERhdGEpOworCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkibXdhdmVkZDo6bXdhdmVfaW5pdCwgcmV0dXJuIGZyb20gdHAzNzgwSV9DbGFpbVJlc291cmNlcyIKKwkJIiByZXR2YWwgJXhcbiIsCisJCXJldHZhbCk7CisJaWYgKHJldHZhbCkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkibXdhdmVkZDptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2VzXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBUUlVFOworCisJcmV0dmFsID0gdHAzNzgwSV9FbmFibGVEU1AoJnBEcnZEYXRhLT5yQkREYXRhKTsKKwlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX2luaXQsIHJldHVybiBmcm9tIHRwMzc4MElfRW5hYmxlRFNQIgorCQkiIHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCSJtd2F2ZWRkOm13YXZlX2luaXQ6IEVycm9yOiIKKwkJCQkiIEZhaWxlZCB0byBlbmFibGUgRFNQXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBUUlVFOworCisJaWYgKG1pc2NfcmVnaXN0ZXIoJm13YXZlX21pc2NfZGV2KSA8IDApIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+Yk13YXZlRGV2UmVnaXN0ZXJlZCA9IFRSVUU7CisKKwlwRHJ2RGF0YS0+c0xpbmUgPSByZWdpc3Rlcl9zZXJpYWxfcG9ydGFuZGlycSgKKwkJcERydkRhdGEtPnJCRERhdGEuckRzcFNldHRpbmdzLnVzVWFydEJhc2VJTywKKwkJcERydkRhdGEtPnJCRERhdGEuckRzcFNldHRpbmdzLnVzVWFydElycQorCSk7CisJaWYgKHBEcnZEYXRhLT5zTGluZSA8IDApIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCS8qIHVhcnQgaXMgcmVnaXN0ZXJlZCAqLworCisjaWYgMAorCS8qIHN5c2ZzICovCisJbWVtc2V0KCZtd2F2ZV9kZXZpY2UsIDAsIHNpemVvZiAoc3RydWN0IGRldmljZSkpOworCXNucHJpbnRmKG13YXZlX2RldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAibXdhdmUiKTsKKworCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm13YXZlX2RldmljZSkpCisJCWdvdG8gY2xlYW51cF9lcnJvcjsKKwlwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQgPSBUUlVFOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG13YXZlX2Rldl9hdHRycyk7IGkrKykgeworCQlpZihkZXZpY2VfY3JlYXRlX2ZpbGUoJm13YXZlX2RldmljZSwgbXdhdmVfZGV2X2F0dHJzW2ldKSkgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCSJtd2F2ZWRkOm13YXZlX2luaXQ6IEVycm9yOiIKKwkJCQkJIiBGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgJXNcbiIsCisJCQkJCW13YXZlX2Rldl9hdHRyc1tpXS0+YXR0ci5uYW1lKTsKKwkJCWdvdG8gY2xlYW51cF9lcnJvcjsKKwkJfQorCQlwRHJ2RGF0YS0+bnJfcmVnaXN0ZXJlZF9hdHRycysrOworCX0KKyNlbmRpZgorCisJLyogU1VDQ0VTUyEgKi8KKwlyZXR1cm4gMDsKKworY2xlYW51cF9lcnJvcjoKKwlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCSJtd2F2ZWRkOjptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkiIEZhaWxlZCB0byBpbml0aWFsaXplXG4iKTsKKwltd2F2ZV9leGl0KCk7IC8qIGNsZWFuIHVwICovCisKKwlyZXR1cm4gLUVJTzsKK30KKworbW9kdWxlX2luaXQobXdhdmVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmggYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2E2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorKgorKiBtd2F2ZWRkLmggLS0gZGVjbGFyYXRpb25zIGZvciBtd2F2ZSBkZXZpY2UgZHJpdmVyCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX01XQVZFRERfSAorI2RlZmluZSBfTElOVVhfTVdBVkVERF9ICisjaW5jbHVkZSAiMzc4MGkuaCIKKyNpbmNsdWRlICJ0cDM3ODBpLmgiCisjaW5jbHVkZSAic21hcGkuaCIKKyNpbmNsdWRlICJtd2F2ZXB1Yi5oIgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKK2V4dGVybiBpbnQgbXdhdmVfZGVidWc7CitleHRlcm4gaW50IG13YXZlXzM3ODBpX2lycTsKK2V4dGVybiBpbnQgbXdhdmVfMzc4MGlfaW87CitleHRlcm4gaW50IG13YXZlX3VhcnRfaXJxOworZXh0ZXJuIGludCBtd2F2ZV91YXJ0X2lvOworCisjZGVmaW5lIFBSSU5US19FUlJPUiBwcmludGsKKyNkZWZpbmUgS0VSTl9FUlJfTVdBVkUgS0VSTl9FUlIgIm13YXZlOiAiCisKKyNkZWZpbmUgVFJBQ0VfTVdBVkUgICAgIDB4MDAwMQorI2RlZmluZSBUUkFDRV9TTUFQSSAgICAgMHgwMDAyCisjZGVmaW5lIFRSQUNFXzM3ODBJICAgICAweDAwMDQKKyNkZWZpbmUgVFJBQ0VfVFAzNzgwSSAgIDB4MDAwOAorCisjaWZkZWYgTVdfVFJBQ0UKKyNkZWZpbmUgUFJJTlRLXzEoZixzKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US18yKGYscyx2MSkgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBQUklOVEtfMyhmLHMsdjEsdjIpICAgICAgICAgICAgICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyx2MSx2Mik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzQoZixzLHYxLHYyLHYzKSAgICAgICAgICAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEsdjIsdjMpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US181KGYscyx2MSx2Mix2Myx2NCkgICAgICAgICAgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxLHYyLHYzLHY0KTsgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBQUklOVEtfNihmLHMsdjEsdjIsdjMsdjQsdjUpICAgICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyx2MSx2Mix2Myx2NCx2NSk7ICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzcoZixzLHYxLHYyLHYzLHY0LHY1LHY2KSAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEsdjIsdjMsdjQsdjUsdjYpOyAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US184KGYscyx2MSx2Mix2Myx2NCx2NSx2Nix2NykgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxLHYyLHYzLHY0LHY1LHY2LHY3KTsgICAgICAgICBcCisgIH0KKworI2Vsc2UKKyNkZWZpbmUgUFJJTlRLXzEoZixzKQorI2RlZmluZSBQUklOVEtfMihmLHMsdjEpCisjZGVmaW5lIFBSSU5US18zKGYscyx2MSx2MikKKyNkZWZpbmUgUFJJTlRLXzQoZixzLHYxLHYyLHYzKQorI2RlZmluZSBQUklOVEtfNShmLHMsdjEsdjIsdjMsdjQpCisjZGVmaW5lIFBSSU5US182KGYscyx2MSx2Mix2Myx2NCx2NSkKKyNkZWZpbmUgUFJJTlRLXzcoZixzLHYxLHYyLHYzLHY0LHY1LHY2KQorI2RlZmluZSBQUklOVEtfOChmLHMsdjEsdjIsdjMsdjQsdjUsdjYsdjcpCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBfTVdBVkVfSVBDIHsKKwl1bnNpZ25lZCBzaG9ydCB1c0ludENvdW50OwkvKiAwPW5vbmUsIDE9Zmlyc3QsIDI9Z3JlYXRlciB0aGFuIDFzdCAqLworCUJPT0xFQU4gYklzRW5hYmxlZDsKKwlCT09MRUFOIGJJc0hlcmU7CisJLyogZW50cnkgc3BpbiBsb2NrICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgaXBjX3dhaXRfcXVldWU7Cit9IE1XQVZFX0lQQzsKKwordHlwZWRlZiBzdHJ1Y3QgX01XQVZFX0RFVklDRV9EQVRBIHsKKwlUSElOS1BBRF9CRF9EQVRBIHJCRERhdGE7CS8qIGJvYXJkIGRyaXZlcidzIGRhdGEgYXJlYSAqLworCXVuc2lnbmVkIGxvbmcgdWxJUENTb3VyY2VfSVNSOwkvKiBJUEMgc291cmNlIGJpdHMgZm9yIHJlY2VudGx5IHByb2Nlc3NlZCBpbnRyLCBzZXQgZHVyaW5nIElTUiBwcm9jZXNzaW5nICovCisJdW5zaWduZWQgbG9uZyB1bElQQ1NvdXJjZV9EUEM7CS8qIElQQyBzb3VyY2UgYml0cyBmb3IgcmVjZW50bHkgcHJvY2Vzc2VkIGludHIsIHNldCBkdXJpbmcgRFBDIHByb2Nlc3NpbmcgKi8KKwlCT09MRUFOIGJCREluaXRpYWxpemVkOworCUJPT0xFQU4gYlJlc291cmNlc0NsYWltZWQ7CisJQk9PTEVBTiBiRFNQRW5hYmxlZDsKKwlCT09MRUFOIGJEU1BSZXNldDsKKwlNV0FWRV9JUEMgSVBDc1sxNl07CisJQk9PTEVBTiBiTXdhdmVEZXZSZWdpc3RlcmVkOworCXNob3J0IHNMaW5lOworCWludCBucl9yZWdpc3RlcmVkX2F0dHJzOworCWludCBkZXZpY2VfcmVnaXN0ZXJlZDsKKworfSBNV0FWRV9ERVZJQ0VfREFUQSwgKnBNV0FWRV9ERVZJQ0VfREFUQTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVwdWIuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZXB1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjlkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVwdWIuaApAQCAtMCwwICsxLDg5IEBACisvKgorKgorKiBtd2F2ZXB1Yi5oIC0tIFBVQkxJQyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtd2F2ZSBkcml2ZXIKKyogICAgICAgICAgICAgICBhbmQgYXBwbGljYXRpb25zIHVzaW5nIGl0CisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX01XQVZFUFVCX0gKKyNkZWZpbmUgX0xJTlVYX01XQVZFUFVCX0gKKworI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworCit0eXBlZGVmIHN0cnVjdCBfTVdfQUJJTElUSUVTIHsKKwl1bnNpZ25lZCBsb25nIGluc3RyX3Blcl9zZWM7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7CisJdW5zaWduZWQgbG9uZyBpbnN0X3NpemU7CisJdW5zaWduZWQgbG9uZyBidXNfZG1hX2J3OworCXVuc2lnbmVkIHNob3J0IHVhcnRfZW5hYmxlOworCXNob3J0IGNvbXBvbmVudF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGNvbXBvbmVudF9saXN0WzddOworCWNoYXIgbXdhdmVfb3NfbmFtZVsxNl07CisJY2hhciBiaW9zX3Rhc2tfbmFtZVsxNl07Cit9IE1XX0FCSUxJVElFUywgKnBNV19BQklMSVRJRVM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX01XX1JFQURXUklURSB7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BBZGRyZXNzOwkvKiBUaGUgZHNwIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIHVsRGF0YUxlbmd0aDsJLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgb3IgdXNlciBidWZmZXIgKi8KKwl2b2lkICpwQnVmOwkJLyogSW5wdXQ6dmFyaWFibGUgc2l6ZWQgYnVmZmVyICovCit9IE1XX1JFQURXUklURSwgKnBNV19SRUFEV1JJVEU7CisKKyNkZWZpbmUgSU9DVExfTVdfUkVTRVQgICAgICAgICAgIF9JTyhNV0FWRV9NSU5PUiwxKQorI2RlZmluZSBJT0NUTF9NV19SVU4gICAgICAgICAgICAgX0lPKE1XQVZFX01JTk9SLDIpCisjZGVmaW5lIElPQ1RMX01XX0RTUF9BQklMSVRJRVMgICBfSU9SKE1XQVZFX01JTk9SLDMsTVdfQUJJTElUSUVTKQorI2RlZmluZSBJT0NUTF9NV19SRUFEX0RBVEEgICAgICAgX0lPUihNV0FWRV9NSU5PUiw0LE1XX1JFQURXUklURSkKKyNkZWZpbmUgSU9DVExfTVdfUkVBRENMRUFSX0RBVEEgIF9JT1IoTVdBVkVfTUlOT1IsNSxNV19SRUFEV1JJVEUpCisjZGVmaW5lIElPQ1RMX01XX1JFQURfSU5TVCAgICAgICBfSU9SKE1XQVZFX01JTk9SLDYsTVdfUkVBRFdSSVRFKQorI2RlZmluZSBJT0NUTF9NV19XUklURV9EQVRBICAgICAgX0lPVyhNV0FWRV9NSU5PUiw3LE1XX1JFQURXUklURSkKKyNkZWZpbmUgSU9DVExfTVdfV1JJVEVfSU5TVCAgICAgIF9JT1coTVdBVkVfTUlOT1IsOCxNV19SRUFEV1JJVEUpCisjZGVmaW5lIElPQ1RMX01XX1JFR0lTVEVSX0lQQyAgICBfSU9XKE1XQVZFX01JTk9SLDksaW50KQorI2RlZmluZSBJT0NUTF9NV19VTlJFR0lTVEVSX0lQQyAgX0lPVyhNV0FWRV9NSU5PUiwxMCxpbnQpCisjZGVmaW5lIElPQ1RMX01XX0dFVF9JUEMgICAgICAgICBfSU9XKE1XQVZFX01JTk9SLDExLGludCkKKyNkZWZpbmUgSU9DVExfTVdfVFJBQ0UgICAgICAgICAgIF9JT1IoTVdBVkVfTUlOT1IsMTIsTVdfUkVBRFdSSVRFKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg3ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisqCisqIHNtYXBpLmMgLS0gU01BUEkgaW50ZXJmYWNlIHJvdXRpbmVzCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgkvKiBDTU9TIGRlZmluZXMgKi8KKyNpbmNsdWRlICJzbWFwaS5oIgorI2luY2x1ZGUgIm13YXZlZGQuaCIKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdfdXNTbWFwaVBvcnQgPSAwOworCisKK3N0YXRpYyBpbnQgc21hcGlfcmVxdWVzdCh1bnNpZ25lZCBzaG9ydCBpbkJYLCB1bnNpZ25lZCBzaG9ydCBpbkNYLAorCQkJIHVuc2lnbmVkIHNob3J0IGluREksIHVuc2lnbmVkIHNob3J0IGluU0ksCisJCQkgdW5zaWduZWQgc2hvcnQgKm91dEFYLCB1bnNpZ25lZCBzaG9ydCAqb3V0QlgsCisJCQkgdW5zaWduZWQgc2hvcnQgKm91dENYLCB1bnNpZ25lZCBzaG9ydCAqb3V0RFgsCisJCQkgdW5zaWduZWQgc2hvcnQgKm91dERJLCB1bnNpZ25lZCBzaG9ydCAqb3V0U0kpCit7CisJdW5zaWduZWQgc2hvcnQgbXlvdXRBWCA9IDIsICpwbXlvdXRBWCA9ICZteW91dEFYOworCXVuc2lnbmVkIHNob3J0IG15b3V0QlggPSAzLCAqcG15b3V0QlggPSAmbXlvdXRCWDsKKwl1bnNpZ25lZCBzaG9ydCBteW91dENYID0gNCwgKnBteW91dENYID0gJm15b3V0Q1g7CisJdW5zaWduZWQgc2hvcnQgbXlvdXREWCA9IDUsICpwbXlvdXREWCA9ICZteW91dERYOworCXVuc2lnbmVkIHNob3J0IG15b3V0REkgPSA2LCAqcG15b3V0REkgPSAmbXlvdXRESTsKKwl1bnNpZ25lZCBzaG9ydCBteW91dFNJID0gNywgKnBteW91dFNJID0gJm15b3V0U0k7CisJdW5zaWduZWQgc2hvcnQgdXNTbWFwaU9LID0gLUVJTywgKnB1c1NtYXBpT0sgPSAmdXNTbWFwaU9LOworCXVuc2lnbmVkIGludCBpbkJYQ1ggPSAoaW5CWCA8PCAxNikgfCBpbkNYOworCXVuc2lnbmVkIGludCBpbkRJU0kgPSAoaW5ESSA8PCAxNikgfCBpblNJOworCWludCByZXR2YWwgPSAwOworCisJUFJJTlRLXzUoVFJBQ0VfU01BUEksICJpbkJYICV4IGluQ1ggJXggaW5ESSAleCBpblNJICV4XG4iLAorCQlpbkJYLCBpbkNYLCBpbkRJLCBpblNJKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICAkMHg1MzgwLCUlYXhcblx0IgorCQkJICAgICJtb3ZsICAlNywlJWVieFxuXHQiCisJCQkgICAgInNocmwgICQxNiwgJSVlYnhcblx0IgorCQkJICAgICJtb3Z3ICAlNywlJWN4XG5cdCIKKwkJCSAgICAibW92bCAgJTgsJSVlZGlcblx0IgorCQkJICAgICJzaHJsICAkMTYsJSVlZGlcblx0IgorCQkJICAgICJtb3Z3ICAlOCwlJXNpXG5cdCIKKwkJCSAgICAibW92dyAgJTksJSVkeFxuXHQiCisJCQkgICAgIm91dCAgICUlYWwsJSVkeFxuXHQiCisJCQkgICAgIm91dCAgICUlYWwsJDB4NEZcblx0IgorCQkJICAgICJjbXBiICAkMHg1MywlJWFoXG5cdCIKKwkJCSAgICAiamUgICAgMmZcblx0IgorCQkJICAgICIxOlxuXHQiCisJCQkgICAgIm9yYiAgICUlYWgsJSVhaFxuXHQiCisJCQkgICAgImpueiAgIDJmXG5cdCIKKwkJCSAgICAibW92dyAgJSVheCwlMFxuXHQiCisJCQkgICAgIm1vdncgICUlYngsJTFcblx0IgorCQkJICAgICJtb3Z3ICAlJWN4LCUyXG5cdCIKKwkJCSAgICAibW92dyAgJSVkeCwlM1xuXHQiCisJCQkgICAgIm1vdncgICUlZGksJTRcblx0IgorCQkJICAgICJtb3Z3ICAlJXNpLCU1XG5cdCIKKwkJCSAgICAibW92dyAgJDEsJTZcblx0IgorCQkJICAgICIyOlxuXHQiOiI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwbXlvdXRBWCksCisJCQkgICAgIj1tIigqKHVuc2lnbmVkIHNob3J0ICopIHBteW91dEJYKSwKKwkJCSAgICAiPW0iKCoodW5zaWduZWQgc2hvcnQgKikgcG15b3V0Q1gpLAorCQkJICAgICI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwbXlvdXREWCksCisJCQkgICAgIj1tIigqKHVuc2lnbmVkIHNob3J0ICopIHBteW91dERJKSwKKwkJCSAgICAiPW0iKCoodW5zaWduZWQgc2hvcnQgKikgcG15b3V0U0kpLAorCQkJICAgICI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwdXNTbWFwaU9LKQorCQkJICAgIDoibSIoaW5CWENYKSwgIm0iKGluRElTSSksICJtIihnX3VzU21hcGlQb3J0KQorCQkJICAgIDoiJWVheCIsICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZWRpIiwKKwkJCSAgICAiJWVzaSIpOworCisJUFJJTlRLXzgoVFJBQ0VfU01BUEksCisJCSJteW91dEFYICV4IG15b3V0QlggJXggbXlvdXRDWCAleCBteW91dERYICV4IG15b3V0REkgJXggbXlvdXRTSSAleCB1c1NtYXBpT0sgJXhcbiIsCisJCW15b3V0QVgsIG15b3V0QlgsIG15b3V0Q1gsIG15b3V0RFgsIG15b3V0REksIG15b3V0U0ksCisJCXVzU21hcGlPSyk7CisJKm91dEFYID0gbXlvdXRBWDsKKwkqb3V0QlggPSBteW91dEJYOworCSpvdXRDWCA9IG15b3V0Q1g7CisJKm91dERYID0gbXlvdXREWDsKKwkqb3V0REkgPSBteW91dERJOworCSpvdXRTSSA9IG15b3V0U0k7CisKKwlyZXR2YWwgPSAodXNTbWFwaU9LID09IDEpID8gMCA6IC1FSU87CisJUFJJTlRLXzIoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfcmVxdWVzdCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2ludCBzbWFwaV9xdWVyeV9EU1BfY2ZnKFNNQVBJX0RTUF9TRVRUSU5HUyAqIHBTZXR0aW5ncykKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOworCXVuc2lnbmVkIHNob3J0IGF1c0RzcEJhc2VzW10gPSB7IDB4MDAzMCwgMHg0RTMwLCAweDhFMzAsIDB4Q0UzMCwgMHgwMTMwLCAweDAzNTAsIDB4MDA3MCwgMHgwREIwIH07CisJdW5zaWduZWQgc2hvcnQgYXVzVWFydEJhc2VzW10gPSB7IDB4MDNGOCwgMHgwMkY4LCAweDAzRTgsIDB4MDJFOCB9OworCXVuc2lnbmVkIHNob3J0IG51bURzcEJhc2VzID0gODsKKwl1bnNpZ25lZCBzaG9ydCBudW1VYXJ0QmFzZXMgPSA0OworCisJUFJJTlRLXzEoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZyBlbnRyeVxuIik7CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMiwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmc6IEVycm9yOiBDb3VsZCBub3QgZ2V0IERTUCBTZXR0aW5ncy4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGJSQzsKKwl9CisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnLCBzbWFwaV9yZXF1ZXN0IE9LXG4iKTsKKworCXBTZXR0aW5ncy0+YkRTUFByZXNlbnQgPSAoKHVzQlggJiAweDAxMDApICE9IDApOworCXBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgPSAoKHVzQ1ggJiAweDAwMDEpICE9IDApOworCXBTZXR0aW5ncy0+dXNEc3BJUlEgPSB1c1NJICYgMHgwMEZGOworCXBTZXR0aW5ncy0+dXNEc3BETUEgPSAodXNTSSAmIDB4RkYwMCkgPj4gODsKKwlpZiAoKHVzREkgJiAweDAwRkYpIDwgbnVtRHNwQmFzZXMpIHsKKwkJcFNldHRpbmdzLT51c0RzcEJhc2VJTyA9IGF1c0RzcEJhc2VzW3VzREkgJiAweDAwRkZdOworCX0gZWxzZSB7CisJCXBTZXR0aW5ncy0+dXNEc3BCYXNlSU8gPSAwOworCX0KKwlQUklOVEtfNihUUkFDRV9TTUFQSSwKKwkJInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnIGdldCBEU1AgU2V0dGluZ3MgYkRTUFByZXNlbnQgJXggYkRTUEVuYWJsZWQgJXggdXNEc3BJUlEgJXggdXNEc3BETUEgJXggdXNEc3BCYXNlSU8gJXhcbiIsCisJCXBTZXR0aW5ncy0+YkRTUFByZXNlbnQsIHBTZXR0aW5ncy0+YkRTUEVuYWJsZWQsCisJCXBTZXR0aW5ncy0+dXNEc3BJUlEsIHBTZXR0aW5ncy0+dXNEc3BETUEsCisJCXBTZXR0aW5ncy0+dXNEc3BCYXNlSU8pOworCisJLyogY2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzICovCisJaWYgKCBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPID09IDAgKSAKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IERTUCBiYXNlIEkvTyBhZGRyZXNzIGlzIDBcbiIpOworCWlmICggcFNldHRpbmdzLT51c0RzcElSUSA9PSAwICkKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IERTUCBJUlEgbGluZSBpcyAwXG4iKTsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA0LCAweDAwMDAsIDAsIDAsCisJICAgCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIHsKKwkJUFJJTlRLX0VSUk9SKCJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogRXJyb3I6IENvdWxkIG5vdCBnZXQgRFNQIG1vZGVtIHNldHRpbmdzLiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gYlJDOworCX0gCisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnLCBzbWFwaV9yZXF1ZXN0IE9LXG4iKTsKKworCXBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCA9ICgodXNDWCAmIDB4MDAwMSkgIT0gMCk7CisJcFNldHRpbmdzLT51c1VhcnRJUlEgPSB1c1NJICYgMHgwMDBGOworCWlmICgoKHVzU0kgJiAweEZGMDApID4+IDgpIDwgbnVtVWFydEJhc2VzKSB7CisJCXBTZXR0aW5ncy0+dXNVYXJ0QmFzZUlPID0gYXVzVWFydEJhc2VzWyh1c1NJICYgMHhGRjAwKSA+PiA4XTsKKwl9IGVsc2UgeworCQlwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyA9IDA7CisJfQorCisJUFJJTlRLXzQoVFJBQ0VfU01BUEksCisJCSJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZyBnZXQgRFNQIG1vZGVtIHNldHRpbmdzIGJNb2RlbUVuYWJsZWQgJXggdXNVYXJ0SVJRICV4IHVzVWFydEJhc2VJTyAleFxuIiwKKwkJcFNldHRpbmdzLT5iTW9kZW1FbmFibGVkLAorCQlwU2V0dGluZ3MtPnVzVWFydElSUSwKKwkJcFNldHRpbmdzLT51c1VhcnRCYXNlSU8pOworCisJLyogY2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzICovCisJaWYgKCBwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyA9PSAwICkgCisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmc6IFdvcnJ5OiBVQVJUIGJhc2UgSS9PIGFkZHJlc3MgaXMgMFxuIik7CisJaWYgKCBwU2V0dGluZ3MtPnVzVWFydElSUSA9PSAwICkKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IFVBUlQgSVJRIGxpbmUgaXMgMFxuIik7CisKKwlQUklOVEtfMihUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnIGV4aXQgYlJDICV4XG4iLCBiUkMpOworCisJcmV0dXJuIGJSQzsKK30KKworCitpbnQgc21hcGlfc2V0X0RTUF9jZmcodm9pZCkKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOworCXVuc2lnbmVkIHNob3J0IGF1c0RzcEJhc2VzW10gPSB7IDB4MDAzMCwgMHg0RTMwLCAweDhFMzAsIDB4Q0UzMCwgMHgwMTMwLCAweDAzNTAsIDB4MDA3MCwgMHgwREIwIH07CisJdW5zaWduZWQgc2hvcnQgYXVzVWFydEJhc2VzW10gPSB7IDB4MDNGOCwgMHgwMkY4LCAweDAzRTgsIDB4MDJFOCB9OworCXVuc2lnbmVkIHNob3J0IGF1c0RzcElycXNbXSA9IHsgNSwgNywgMTAsIDExLCAxNSB9OworCXVuc2lnbmVkIHNob3J0IGF1c1VhcnRJcnFzW10gPSB7IDMsIDQgfTsKKworCXVuc2lnbmVkIHNob3J0IG51bURzcEJhc2VzID0gODsKKwl1bnNpZ25lZCBzaG9ydCBudW1VYXJ0QmFzZXMgPSA0OworCXVuc2lnbmVkIHNob3J0IG51bURzcElycXMgPSA1OworCXVuc2lnbmVkIHNob3J0IG51bVVhcnRJcnFzID0gMjsKKwl1bnNpZ25lZCBzaG9ydCBkc3Bpb19pbmRleCA9IDAsIHVhcnRpb19pbmRleCA9IDA7CisKKwlQUklOVEtfNShUUkFDRV9TTUFQSSwKKwkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBlbnRyeSBtd2F2ZV8zNzgwaV9pcnEgJXggbXdhdmVfMzc4MGlfaW8gJXggbXdhdmVfdWFydF9pcnEgJXggbXdhdmVfdWFydF9pbyAleFxuIiwKKwkJbXdhdmVfMzc4MGlfaXJxLCBtd2F2ZV8zNzgwaV9pbywgbXdhdmVfdWFydF9pcnEsIG13YXZlX3VhcnRfaW8pOworCisJaWYgKG13YXZlXzM3ODBpX2lvKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1Ec3BCYXNlczsgaSsrKSB7CisJCQlpZiAobXdhdmVfMzc4MGlfaW8gPT0gYXVzRHNwQmFzZXNbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gbnVtRHNwQmFzZXMpIHsKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBFcnJvcjogSW52YWxpZCBtd2F2ZV8zNzgwaV9pbyBhZGRyZXNzICV4LiBBYm9ydGluZy5cbiIsIG13YXZlXzM3ODBpX2lvKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwkJZHNwaW9faW5kZXggPSBpOworCX0KKworCWlmIChtd2F2ZV8zNzgwaV9pcnEpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bURzcElycXM7IGkrKykgeworCQkJaWYgKG13YXZlXzM3ODBpX2lycSA9PSBhdXNEc3BJcnFzW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IG51bURzcElycXMpIHsKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBFcnJvcjogSW52YWxpZCBtd2F2ZV8zNzgwaV9pcnEgJXguIEFib3J0aW5nLlxuIiwgbXdhdmVfMzc4MGlfaXJxKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwl9CisKKwlpZiAobXdhdmVfdWFydF9pbykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtVWFydEJhc2VzOyBpKyspIHsKKwkJCWlmIChtd2F2ZV91YXJ0X2lvID09IGF1c1VhcnRCYXNlc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1VYXJ0QmFzZXMpIHsKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBFcnJvcjogSW52YWxpZCBtd2F2ZV91YXJ0X2lvIGFkZHJlc3MgJXguIEFib3J0aW5nLlxuIiwgbXdhdmVfdWFydF9pbyk7CisJCQlyZXR1cm4gYlJDOworCQl9CisJCXVhcnRpb19pbmRleCA9IGk7CisJfQorCisKKwlpZiAobXdhdmVfdWFydF9pcnEpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bVVhcnRJcnFzOyBpKyspIHsKKwkJCWlmIChtd2F2ZV91YXJ0X2lycSA9PSBhdXNVYXJ0SXJxc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1VYXJ0SXJxcykgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IEVycm9yOiBJbnZhbGlkIG13YXZlX3VhcnRfaXJxICV4LiBBYm9ydGluZy5cbiIsIG13YXZlX3VhcnRfaXJxKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwl9CisKKwlpZiAobXdhdmVfdWFydF9pcnEgfHwgbXdhdmVfdWFydF9pbykgeworCisJCS8qIENoZWNrIHNlcmlhbCBwb3J0IEEgKi8KKwkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDIsIDB4MDAwMCwgMCwgMCwKKwkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJLyogYlJDID09IDAgKi8KKwkJaWYgKHVzQlggJiAweDAxMDApIHsJLyogc2VyaWFsIHBvcnQgQSBpcyBwcmVzZW50ICovCisJCQlpZiAodXNDWCAmIDEpIHsJLyogc2VyaWFsIHBvcnQgaXMgZW5hYmxlZCAqLworCQkJCWlmICgodXNTSSAmIDB4RkYpID09IG13YXZlX3VhcnRfaXJxKSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQSBpcnEgJXggY29uZmxpY3RzIHdpdGggbXdhdmVfdWFydF9pcnEgJXhcbiIsIHVzU0kgJiAweEZGLCBtd2F2ZV91YXJ0X2lycSk7CisjZWxzZQorCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEEgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c1NJICYgMHhGRiwgbXdhdmVfdWFydF9pcnEpOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLXzEoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBzZXJpYWwgcG9ydFxuIik7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDAzLCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDAyLCAweDAwMDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHVzU0kgPj4gOCkgPT0gdWFydGlvX2luZGV4KSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBBIGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJID4+IDhdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZWxzZQorCQkJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQSBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSA+PiA4XSwgYXVzVWFydEJhc2VzW3VhcnRpb19pbmRleF0pOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJCVBSSU5US18xKFRSQUNFX1NNQVBJLAorCQkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgRGlzYWJsaW5nIGNvbmZsaWN0aW5nIHNlcmlhbCBwb3J0IEFcbiIpOworCQkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCAoMHgxNDAzLCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QgKDB4MTQwMiwgMHgwMDAwLCAwLCAwLAorCQkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQkJZ290byBleGl0X2NvbmZsaWN0OworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBzZXJpYWwgcG9ydCBCICovCisJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDA0LCAweDAwMDAsIDAsIDAsCisJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCS8qIGJSQyA9PSAwICovCisJCWlmICh1c0JYICYgMHgwMTAwKSB7CS8qIHNlcmlhbCBwb3J0IEIgaXMgcHJlc2VudCAqLworCQkJaWYgKHVzQ1ggJiAxKSB7CS8qIHNlcmlhbCBwb3J0IGlzIGVuYWJsZWQgKi8KKwkJCQlpZiAoKHVzU0kgJiAweEZGKSA9PSBtd2F2ZV91YXJ0X2lycSkgeworI2lmbmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEIgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c1NJICYgMHhGRiwgbXdhdmVfdWFydF9pcnEpOworI2Vsc2UKKwkJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBCIGlycSAleCBjb25mbGljdHMgd2l0aCBtd2F2ZV91YXJ0X2lycSAleFxuIiwgdXNTSSAmIDB4RkYsIG13YXZlX3VhcnRfaXJxKTsKKyNlbmRpZgorI2lmZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US18xKFRSQUNFX1NNQVBJLAorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBEaXNhYmxpbmcgY29uZmxpY3Rpbmcgc2VyaWFsIHBvcnQgQlxuIik7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDA1LCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDA0LCAweDAwMDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHVzU0kgPj4gOCkgPT0gdWFydGlvX2luZGV4KSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBCIGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJID4+IDhdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZWxzZQorCQkJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQiBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSA+PiA4XSwgYXVzVWFydEJhc2VzW3VhcnRpb19pbmRleF0pOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJCVBSSU5US18xIChUUkFDRV9TTUFQSSwKKwkJCQkJCSAgICAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBzZXJpYWwgcG9ydCBCXG4iKTsKKwkJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QgKDB4MTQwNSwgMHgwMTAwLCAwLCB1c1NJLAorCQkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0ICgweDE0MDQsIDB4MDAwMCwgMCwgMCwKKwkJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworI2Vsc2UKKwkJCQkJCWdvdG8gZXhpdF9jb25mbGljdDsKKyNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgSVIgcG9ydCAqLworCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwMCwgMHgwMDAwLCAwLCAwLAorCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwNCwgMHgwMDAwLCAwLCAwLAorCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkvKiBiUkMgPT0gMCAqLworCQlpZiAoKHVzQ1ggJiAweGZmKSAhPSAweGZmKSB7IC8qIElSIHBvcnQgbm90IGRpc2FibGVkICovCisJCQlpZiAoKHVzQ1ggJiAweGZmKSA9PSBtd2F2ZV91YXJ0X2lycSkgeworI2lmbmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBJUiBwb3J0IGlycSAleCBjb25mbGljdHMgd2l0aCBtd2F2ZV91YXJ0X2lycSAleFxuIiwgdXNDWCAmIDB4ZmYsIG13YXZlX3VhcnRfaXJxKTsKKyNlbHNlCisJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IElSIHBvcnQgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c0NYICYgMHhmZiwgbXdhdmVfdWFydF9pcnEpOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQlQUklOVEtfMShUUkFDRV9TTUFQSSwKKwkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBEaXNhYmxpbmcgY29uZmxpY3RpbmcgSVIgcG9ydFxuIik7CisJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDEsIDB4MDEwMCwgMCwgMCwKKwkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDAsIDAsIDAsIDAsCisJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA1LCAweDAxZmYsIDAsIHVzU0ksCisJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA0LCAweDAwMDAsIDAsIDAsCisJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworI2Vsc2UKKwkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh1c1NJICYgMHhmZikgPT0gdWFydGlvX2luZGV4KSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogSVIgcG9ydCBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSAmIDB4ZmZdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZWxzZQorCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IElSIHBvcnQgYmFzZSBJL08gYWRkcmVzcyAleCBjb25mbGljdHMgd2l0aCBtd2F2ZSB1YXJ0IEkvTyAleFxuIiwgYXVzVWFydEJhc2VzW3VzU0kgJiAweGZmXSwgYXVzVWFydEJhc2VzW3VhcnRpb19pbmRleF0pOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLXzEoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBJUiBwb3J0XG4iKTsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDEsIDB4MDEwMCwgMCwgMCwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDAsIDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA1LCAweDAxZmYsIDAsIHVzU0ksCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA0LCAweDAwMDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMiwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworCWlmIChtd2F2ZV8zNzgwaV9pbykgeworCQl1c0RJID0gZHNwaW9faW5kZXg7CisJfQorCWlmIChtd2F2ZV8zNzgwaV9pcnEpIHsKKwkJdXNTSSA9ICh1c1NJICYgMHhmZjAwKSB8IG13YXZlXzM3ODBpX2lycTsKKwl9CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMywgMHgwMTAxLCB1c0RJLCB1c1NJLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA0LCAweDAwMDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisJaWYgKG13YXZlX3VhcnRfaW8pIHsKKwkJdXNTSSA9ICh1c1NJICYgMHgwMGZmKSB8ICh1YXJ0aW9faW5kZXggPDwgOCk7CisJfQorCWlmIChtd2F2ZV91YXJ0X2lycSkgeworCQl1c1NJID0gKHVzU0kgJiAweGZmMDApIHwgbXdhdmVfdWFydF9pcnE7CisJfQorCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA1LCAweDAxMDEsIDAsIHVzU0ksCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisJYlJDID0gc21hcGlfcmVxdWVzdCgweDE4MDIsIDB4MDAwMCwgMCwgMCwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwNCwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworLyogbm9ybWFsIGV4aXQ6ICovCisJUFJJTlRLXzEoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgZXhpdFxuIik7CisJcmV0dXJuIDA7CisKK2V4aXRfY29uZmxpY3Q6CisJLyogTWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIHByaW50ZWQgKi8KKwlyZXR1cm4gLUVJTzsKKworZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOgorCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIGV4aXQgb24gc21hcGlfcmVxdWVzdCBlcnJvciBiUkMgJXhcbiIsIGJSQyk7CisJcmV0dXJuIGJSQzsKK30KKworCitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbikKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOworCXVuc2lnbmVkIHNob3J0IHVzUG93ZXJGdW5jdGlvbjsKKworCVBSSU5US18yKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUgZW50cnkgYk9uICV4XG4iLCBiT24pOworCisJdXNQb3dlckZ1bmN0aW9uID0gKGJPbikgPyAxIDogMDsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHg0OTAxLCAweDAwMDAsIDAsIHVzUG93ZXJGdW5jdGlvbiwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisKKwlQUklOVEtfMihUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlIGV4aXQgYlJDICV4XG4iLCBiUkMpOworCisJcmV0dXJuIGJSQzsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgU21hcGlRdWVyeVN5c3RlbUlEKHZvaWQpCit7CisJaW50IGJSQyA9IC1FSU87CisJdW5zaWduZWQgc2hvcnQgdXNBWCA9IDB4ZmZmZiwgdXNCWCA9IDB4ZmZmZiwgdXNDWCA9IDB4ZmZmZiwKKwkJdXNEWCA9IDB4ZmZmZiwgdXNESSA9IDB4ZmZmZiwgdXNTSSA9IDB4ZmZmZjsKKworCXByaW50aygic21hcGk6OlNtYXBpUVVlcnlTeXN0ZW1JRCBlbnRyeVxuIik7CisJYlJDID0gc21hcGlfcmVxdWVzdCgweDAwMDAsIDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCisJaWYgKGJSQyA9PSAwKSB7CisJCXByaW50aygiQVg9JXgsIEJYPSV4LCBDWD0leCwgRFg9JXgsIERJPSV4LCBTST0leFxuIiwKKwkJCXVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0kpOworCX0gZWxzZSB7CisJCXByaW50aygic21hcGk6OlNtYXBpUXVlcnlTeXN0ZW1JRCBzbWFwaV9yZXF1ZXN0IGVycm9yXG4iKTsKKwl9CisKKwlyZXR1cm4gYlJDOworfQorI2VuZGlmICAvKiAgMCAgKi8KKworaW50IHNtYXBpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c1NtYXBpSUQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9pbml0IGVudHJ5XG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXVzU21hcGlJRCA9IENNT1NfUkVBRCgweDdDKTsKKwl1c1NtYXBpSUQgfD0gKENNT1NfUkVBRCgweDdEKSA8PCA4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCVBSSU5US18yKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX2luaXQgdXNTbWFwaUlEICV4XG4iLCB1c1NtYXBpSUQpOworCisJaWYgKHVzU21hcGlJRCA9PSAweDUzNDkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJCWdfdXNTbWFwaVBvcnQgPSBDTU9TX1JFQUQoMHg3RSk7CisJCWdfdXNTbWFwaVBvcnQgfD0gKENNT1NfUkVBRCgweDdGKSA8PCA4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGdfdXNTbWFwaVBvcnQgPT0gMCkgeworCQkJUFJJTlRLX0VSUk9SKCJzbWFwaTo6c21hcGlfaW5pdCwgRVJST1IgdW5hYmxlIHRvIHJlYWQgZnJvbSBTTUFQSSBwb3J0XG4iKTsKKwkJfSBlbHNlIHsKKwkJCVBSSU5US18yKFRSQUNFX1NNQVBJLAorCQkJCSJzbWFwaTo6c21hcGlfaW5pdCwgZXhpdCBUUlVFIGdfdXNTbWFwaVBvcnQgJXhcbiIsCisJCQkJZ191c1NtYXBpUG9ydCk7CisJCQlyZXR2YWwgPSAwOworCQkJLy9TbWFwaVF1ZXJ5U3lzdGVtSUQoKTsKKwkJfQorCX0gZWxzZSB7CisJCVBSSU5US19FUlJPUigic21hcGk6OnNtYXBpX2luaXQsIEVSUk9SIGludmFsaWQgdXNTbWFwaUlEXG4iKTsKKwkJcmV0dmFsID0gLUVOWElPOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuaApAQCAtMCwwICsxLDgwIEBACisvKgorKgorKiBzbWFwaS5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgU01BUEkgaW50ZXJmYWNlIHJvdXRpbmVzCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX1NNQVBJX0gKKyNkZWZpbmUgX0xJTlVYX1NNQVBJX0gKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBCT09MRUFOIGludAorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGJEU1BQcmVzZW50OworCWludCBiRFNQRW5hYmxlZDsKKwlpbnQgYk1vZGVtRW5hYmxlZDsKKwlpbnQgYk1JRElFbmFibGVkOworCWludCBiU2Jsc3RFbmFibGVkOworCXVuc2lnbmVkIHNob3J0IHVzRHNwSVJROworCXVuc2lnbmVkIHNob3J0IHVzRHNwRE1BOworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPOworCXVuc2lnbmVkIHNob3J0IHVzVWFydElSUTsKKwl1bnNpZ25lZCBzaG9ydCB1c1VhcnRCYXNlSU87CisJdW5zaWduZWQgc2hvcnQgdXNNaWRpSVJROworCXVuc2lnbmVkIHNob3J0IHVzTWlkaUJhc2VJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c1NuZGJsc3RJUlE7CisJdW5zaWduZWQgc2hvcnQgdXNTbmRibHN0RE1BOworCXVuc2lnbmVkIHNob3J0IHVzU25kYmxzdEJhc2VJTzsKK30gU01BUElfRFNQX1NFVFRJTkdTOworCitpbnQgc21hcGlfaW5pdCh2b2lkKTsKK2ludCBzbWFwaV9xdWVyeV9EU1BfY2ZnKFNNQVBJX0RTUF9TRVRUSU5HUyAqIHBTZXR0aW5ncyk7CitpbnQgc21hcGlfc2V0X0RTUF9jZmcodm9pZCk7CitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY1MGNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYwpAQCAtMCwwICsxLDU5MiBAQAorLyoKKyoKKyogdHAzNzgwaS5jIC0tIGJvYXJkIGRyaXZlciBmb3IgMzc4MGkgb24gVGhpbmtQYWRzCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAic21hcGkuaCIKKyNpbmNsdWRlICJtd2F2ZWRkLmgiCisjaW5jbHVkZSAidHAzNzgwaS5oIgorI2luY2x1ZGUgIjM3ODBpLmgiCisjaW5jbHVkZSAibXdhdmVwdWIuaCIKKworZXh0ZXJuIE1XQVZFX0RFVklDRV9EQVRBIG13YXZlX3NfbWRkOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc19hdXNUaGlua3BhZElycVRvRmllbGRbMTZdID0KKwl7IDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4RkZGRiwgMHgwMDA0LAorCTB4RkZGRiwgMHhGRkZGLCAweDAwMDUsIDB4MDAwNiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDA3IH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc19hdXNUaGlua3BhZERtYVRvRmllbGRbOF0gPQorCXsgMHgwMDAxLCAweDAwMDIsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAzLCAweDAwMDQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzX251bUlycXMgPSAxNiwgc19udW1EbWFzID0gODsKKworCitzdGF0aWMgdm9pZCBFbmFibGVTUkFNKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCURTUF9HUElPX09VVFBVVF9EQVRBXzE1XzggckdwaW9PdXRwdXREYXRhOworCURTUF9HUElPX0RSSVZFUl9FTkFCTEVfMTVfOCByR3Bpb0RyaXZlckVuYWJsZTsKKwlEU1BfR1BJT19NT0RFXzE1XzggckdwaW9Nb2RlOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OkVuYWJsZVNSQU0sIGVudHJ5XG4iKTsKKworCU1LV09SRChyR3Bpb01vZGUpID0gUmVhZE1zYUNmZyhEU1BfR3Bpb01vZGVDb250cm9sXzE1XzgpOworCXJHcGlvTW9kZS5HcGlvTW9kZTEwID0gMDsKKwlXcml0ZU1zYUNmZyhEU1BfR3Bpb01vZGVDb250cm9sXzE1XzgsIE1LV09SRChyR3Bpb01vZGUpKTsKKworCU1LV09SRChyR3Bpb0RyaXZlckVuYWJsZSkgPSAwOworCXJHcGlvRHJpdmVyRW5hYmxlLkVuYWJsZTEwID0gVFJVRTsKKwlyR3Bpb0RyaXZlckVuYWJsZS5NYXNrMTAgPSBUUlVFOworCVdyaXRlTXNhQ2ZnKERTUF9HcGlvRHJpdmVyRW5hYmxlXzE1XzgsIE1LV09SRChyR3Bpb0RyaXZlckVuYWJsZSkpOworCisJTUtXT1JEKHJHcGlvT3V0cHV0RGF0YSkgPSAwOworCXJHcGlvT3V0cHV0RGF0YS5MYXRjaDEwID0gMDsKKwlyR3Bpb091dHB1dERhdGEuTWFzazEwID0gVFJVRTsKKwlXcml0ZU1zYUNmZyhEU1BfR3Bpb091dHB1dERhdGFfMTVfOCwgTUtXT1JEKHJHcGlvT3V0cHV0RGF0YSkpOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OkVuYWJsZVNSQU0gZXhpdFxuIik7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IFVhcnRJbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlQUklOVEtfMyhUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6VWFydEludGVycnVwdCBlbnRyeSBpcnEgJXggZGV2X2lkICVwXG4iLCBpcnEsIGRldl9pZCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgRHNwSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcE1XQVZFX0RFVklDRV9EQVRBIHBEcnZEYXRhID0gJm13YXZlX3NfbWRkOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwRHJ2RGF0YS0+ckJERGF0YS5yRHNwU2V0dGluZ3M7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCXVuc2lnbmVkIHNob3J0IHVzSVBDU291cmNlID0gMCwgdXNJc29sYXRpb25NYXNrLCB1c1BDTnVtOworCisJUFJJTlRLXzMoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OkRzcEludGVycnVwdCBlbnRyeSBpcnEgJXggZGV2X2lkICVwXG4iLCBpcnEsIGRldl9pZCk7CisKKwlpZiAoZHNwMzc4MElfR2V0SVBDU291cmNlKHVzRHNwQmFzZUlPLCAmdXNJUENTb3VyY2UpID09IDApIHsKKwkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIHJldHVybiBmcm9tIGRzcDM3ODBpX0dldElQQ1NvdXJjZSwgdXNJUENTb3VyY2UgJXhcbiIsCisJCQl1c0lQQ1NvdXJjZSk7CisJCXVzSXNvbGF0aW9uTWFzayA9IDE7CisJCWZvciAodXNQQ051bSA9IDE7IHVzUENOdW0gPD0gMTY7IHVzUENOdW0rKykgeworCQkJaWYgKHVzSVBDU291cmNlICYgdXNJc29sYXRpb25NYXNrKSB7CisJCQkJdXNJUENTb3VyY2UgJj0gfnVzSXNvbGF0aW9uTWFzazsKKwkJCQlQUklOVEtfMyhUUkFDRV9UUDM3ODBJLAorCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0IHVzUENOdW0gJXggdXNJUENTb3VyY2UgJXhcbiIsCisJCQkJCXVzUENOdW0sIHVzSVBDU291cmNlKTsKKwkJCQlpZiAocERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLnVzSW50Q291bnQgPT0gMCkgeworCQkJCQlwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0udXNJbnRDb3VudCA9IDE7CisJCQkJfQorCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQgdXNJbnRDb3VudCAleFxuIiwKKwkJCQkJcERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLnVzSW50Q291bnQpOworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCB3YWtpbmcgdXAgdXNQQ051bSAleFxuIiwKKwkJCQkJCXVzUENOdW0gLSAxKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uaXBjX3dhaXRfcXVldWUpOworCQkJCX0gZWxzZSB7CisJCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCBubyBvbmUgd2FpdGluZyBmb3IgSVBDICV4XG4iLAorCQkJCQkJdXNQQ051bSAtIDEpOworCQkJCX0KKwkJCX0KKwkJCWlmICh1c0lQQ1NvdXJjZSA9PSAwKQorCQkJCWJyZWFrOworCQkJLyogdHJ5IG5leHQgSVBDICovCisJCQl1c0lzb2xhdGlvbk1hc2sgPSB1c0lzb2xhdGlvbk1hc2sgPDwgMTsKKwkJfQorCX0gZWxzZSB7CisJCVBSSU5US18xKFRSQUNFX1RQMzc4MEksCisJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCByZXR1cm4gZmFsc2UgZnJvbSBkc3AzNzgwaV9HZXRJUENTb3VyY2VcbiIpOworCX0KKwlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6RHNwSW50ZXJydXB0IGV4aXRcbiIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitpbnQgdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IEZBTFNFOworCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKworCXJldHZhbCA9IHNtYXBpX2luaXQoKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhOiBFcnJvcjogU01BUEkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIG1hY2hpbmVcbiIpOworCX0gZWxzZSB7CisJCWlmIChtd2F2ZV8zNzgwaV9pcnEgfHwgbXdhdmVfMzc4MGlfaW8gfHwgbXdhdmVfdWFydF9pcnEgfHwgbXdhdmVfdWFydF9pbykgeworCQkJcmV0dmFsID0gc21hcGlfc2V0X0RTUF9jZmcoKTsKKwkJfQorCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdHAzNzgwSV9DbGVhbnVwKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfQ2xlYW51cCBlbnRyeSBhbmQgZXhpdCBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB0cDM3ODBJX0NhbGNSZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJU01BUElfRFNQX1NFVFRJTkdTIHJTbWFwaUluZm87CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXMgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlpZiAoc21hcGlfcXVlcnlfRFNQX2NmZygmclNtYXBpSW5mbykpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXM6IEVycm9yOiBDb3VsZCBub3QgcXVlcnkgRFNQIGNvbmZpZy4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKAorCQkoIHJTbWFwaUluZm8udXNEc3BJUlEgPT0gMCApCisJCXx8ICggclNtYXBpSW5mby51c0RzcEJhc2VJTyA9PSAgMCApCisJCXx8ICggclNtYXBpSW5mby51c1VhcnRJUlEgPT0gIDAgKQorCQl8fCAoIHJTbWFwaUluZm8udXNVYXJ0QmFzZUlPID09ICAwICkKKwkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXM6IEVycm9yOiBJbGxlZ2FsIHJlc291cmNlIHNldHRpbmcuIEFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgPSAoclNtYXBpSW5mby5iRFNQRW5hYmxlZCAmJiByU21hcGlJbmZvLmJEU1BQcmVzZW50KTsKKwlwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQgPSByU21hcGlJbmZvLmJNb2RlbUVuYWJsZWQ7CisJcFNldHRpbmdzLT51c0RzcElycSA9IHJTbWFwaUluZm8udXNEc3BJUlE7CisJcFNldHRpbmdzLT51c0RzcERtYSA9IHJTbWFwaUluZm8udXNEc3BETUE7CisJcFNldHRpbmdzLT51c0RzcEJhc2VJTyA9IHJTbWFwaUluZm8udXNEc3BCYXNlSU87CisJcFNldHRpbmdzLT51c1VhcnRJcnEgPSByU21hcGlJbmZvLnVzVWFydElSUTsKKwlwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyA9IHJTbWFwaUluZm8udXNVYXJ0QmFzZUlPOworCisJcFNldHRpbmdzLT51RFN0b3JlU2l6ZSA9IFRQX0FCSUxJVElFU19EQVRBX1NJWkU7CisJcFNldHRpbmdzLT51SVN0b3JlU2l6ZSA9IFRQX0FCSUxJVElFU19JTlNUX1NJWkU7CisJcFNldHRpbmdzLT51SXBzID0gVFBfQUJJTElUSUVTX0lOVFNfUEVSX1NFQzsKKworCWlmIChwU2V0dGluZ3MtPmJEU1BFbmFibGVkICYmIHBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCAmJiBwU2V0dGluZ3MtPnVzRHNwSXJxID09IHBTZXR0aW5ncy0+dXNVYXJ0SXJxKSB7CisJCXBCRERhdGEtPmJTaGFyZURzcElycSA9IHBCRERhdGEtPmJTaGFyZVVhcnRJcnEgPSAxOworCX0gZWxzZSB7CisJCXBCRERhdGEtPmJTaGFyZURzcElycSA9IHBCRERhdGEtPmJTaGFyZVVhcnRJcnEgPSAwOworCX0KKworCVBSSU5US18xKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXMgZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgdHAzNzgwSV9DbGFpbVJlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKwlzdHJ1Y3QgcmVzb3VyY2UgKnByZXM7CisjZW5kaWYKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX0NsYWltUmVzb3VyY2VzIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorCXByZXMgPSByZXF1ZXN0X3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPLCAxNiwgIm13YXZlXzM3ODBpIik7CisJaWYgKCBwcmVzID09IE5VTEwgKSByZXR2YWwgPSAtRUlPOworI2Vsc2UKKwlyZXR2YWwgPSBjaGVja19yZWdpb24ocFNldHRpbmdzLT51c0RzcEJhc2VJTywgMTYpOworCWlmICghcmV0dmFsKSByZXF1ZXN0X3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPLCAxNiwgIm13YXZlXzM3ODBpIik7CisjZW5kaWYKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9DbGFpbVJlc291cmNlczogRXJyb3I6IENvdWxkIG5vdCBjbGFpbSBJL08gcmVnaW9uIHN0YXJ0aW5nIGF0ICV4XG4iLCBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPKTsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9DbGFpbVJlc291cmNlcyBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB0cDM3ODBJX1JlbGVhc2VSZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX1JlbGVhc2VSZXNvdXJjZXMgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlyZWxlYXNlX3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPICYgKH4zKSwgMTYpOworCisJaWYgKHBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQpIHsKKwkJZnJlZV9pcnEocFNldHRpbmdzLT51c0RzcElycSwgTlVMTCk7CisJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9SZWxlYXNlUmVzb3VyY2VzIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCisKK2ludCB0cDM3ODBJX0VuYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCUJPT0xFQU4gYkRTUFBvd2VyZWRVcCA9IEZBTFNFLCBiRFNQRW5hYmxlZCA9IEZBTFNFLCBiSW50ZXJydXB0QWxsb2NhdGVkID0gRkFMU0U7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlpZiAocEJERGF0YS0+YkRTUEVuYWJsZWQpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IERTUCBhbHJlYWR5IGVuYWJsZWQhXG4iKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfQorCisJaWYgKCFwU2V0dGluZ3MtPmJEU1BFbmFibGVkKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IHBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgbm90IHNldFxuIik7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0KKworCWlmICgKKwkJKHBTZXR0aW5ncy0+dXNEc3BJcnEgPj0gc19udW1JcnFzKQorCQl8fCAocFNldHRpbmdzLT51c0RzcERtYSA+PSBzX251bURtYXMpCisJCXx8IChzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZFtwU2V0dGluZ3MtPnVzRHNwSXJxXSA9PSAweEZGRkYpCisJCXx8IChzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZFtwU2V0dGluZ3MtPnVzRHNwRG1hXSA9PSAweEZGRkYpCisJKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBpbnZhbGlkIGlycSAleFxuIiwgcFNldHRpbmdzLT51c0RzcElycSk7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0KKworCWlmICgKKwkJKChwU2V0dGluZ3MtPnVzRHNwQmFzZUlPICYgMHhGMDBGKSAhPSAwKQorCQl8fCAocFNldHRpbmdzLT51c0RzcEJhc2VJTyAmIDB4MEZGMCkgPT0gMAorCSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogSW52YWxpZCBEU1AgYmFzZSBJL08gYWRkcmVzcyAleFxuIiwgcFNldHRpbmdzLT51c0RzcEJhc2VJTyk7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0KKworCWlmIChwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQpIHsKKwkJaWYgKAorCQkJcFNldHRpbmdzLT51c1VhcnRJcnEgPj0gc19udW1JcnFzCisJCQl8fCBzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZFtwU2V0dGluZ3MtPnVzVWFydElycV0gPT0gMHhGRkZGCisJCSkgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IEludmFsaWQgVUFSVCBJUlEgJXhcbiIsIHBTZXR0aW5ncy0+dXNVYXJ0SXJxKTsKKwkJCWdvdG8gZXhpdF9jbGVhbnVwOworCQl9CisJCXN3aXRjaCAocFNldHRpbmdzLT51c1VhcnRCYXNlSU8pIHsKKwkJCWNhc2UgMHgwM0Y4OgorCQkJY2FzZSAweDAyRjg6CisJCQljYXNlIDB4MDNFODoKKwkJCWNhc2UgMHgwMkU4OgorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBJbnZhbGlkIFVBUlQgYmFzZSBJL08gYWRkcmVzcyAleFxuIiwgcFNldHRpbmdzLT51c1VhcnRCYXNlSU8pOworCQkJCWdvdG8gZXhpdF9jbGVhbnVwOworCQl9CisJfQorCisJcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iRHNwSXJxUHVsc2UgPSBUUlVFOworCXBTZXR0aW5ncy0+YlVhcnRJcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJVYXJ0SXJxUHVsc2UgPSBUUlVFOworCisJaWYgKHBCRERhdGEtPmJTaGFyZURzcElycSkgeworCQlwU2V0dGluZ3MtPmJEc3BJcnFBY3RpdmVMb3cgPSBGQUxTRTsKKwl9CisJaWYgKHBCRERhdGEtPmJTaGFyZVVhcnRJcnEpIHsKKwkJcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdyA9IEZBTFNFOworCX0KKworCXBTZXR0aW5ncy0+dXNOdW1UcmFuc2ZlcnMgPSBUUF9DRkdfTnVtVHJhbnNmZXJzOworCXBTZXR0aW5ncy0+dXNSZVJlcXVlc3QgPSBUUF9DRkdfUmVyZXF1ZXN0VGltZXI7CisJcFNldHRpbmdzLT5iRW5hYmxlTUVNQ1MxNiA9IFRQX0NGR19NRU1DUzE2OworCXBTZXR0aW5ncy0+dXNJc2FNZW1DbWRXaWR0aCA9IFRQX0NGR19Jc2FNZW1DbWRXaWR0aDsKKwlwU2V0dGluZ3MtPmJHYXRlSU9DSFJEWSA9IFRQX0NGR19HYXRlSU9DSFJEWTsKKwlwU2V0dGluZ3MtPmJFbmFibGVQd3JNZ210ID0gVFBfQ0ZHX0VuYWJsZVB3ck1nbXQ7CisJcFNldHRpbmdzLT51c0hCdXNUaW1lckxvYWRWYWx1ZSA9IFRQX0NGR19IQnVzVGltZXJWYWx1ZTsKKwlwU2V0dGluZ3MtPmJEaXNhYmxlTEJ1c1RpbWVvdXQgPSBUUF9DRkdfRGlzYWJsZUxCdXNUaW1lb3V0OworCXBTZXR0aW5ncy0+dXNOX0Rpdmlzb3IgPSBUUF9DRkdfTl9EaXZpc29yOworCXBTZXR0aW5ncy0+dXNNX011bHRpcGxpZXIgPSBUUF9DRkdfTV9NdWx0aXBsaWVyOworCXBTZXR0aW5ncy0+YlBsbEJ5cGFzcyA9IFRQX0NGR19QbGxCeXBhc3M7CisJcFNldHRpbmdzLT51c0NoaXBsZXRFbmFibGUgPSBUUF9DRkdfQ2hpcGxldEVuYWJsZTsKKworCWlmIChyZXF1ZXN0X2lycShwU2V0dGluZ3MtPnVzVWFydElycSwgJlVhcnRJbnRlcnJ1cHQsIDAsICJtd2F2ZV91YXJ0IiwgTlVMTCkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IENvdWxkIG5vdCBnZXQgVUFSVCBJUlEgJXhcbiIsIHBTZXR0aW5ncy0+dXNVYXJ0SXJxKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfSBlbHNlIHsJCS8qIG5vIGNvbmZsaWN0IGp1c3QgcmVsZWFzZSAqLworCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzVWFydElycSwgTlVMTCk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBTZXR0aW5ncy0+dXNEc3BJcnEsICZEc3BJbnRlcnJ1cHQsIDAsICJtd2F2ZV8zNzgwaSIsIE5VTEwpKSB7CisJCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBDb3VsZCBub3QgZ2V0IDM3ODBpIElSUSAleFxuIiwgcFNldHRpbmdzLT51c0RzcElycSk7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0gZWxzZSB7CisJCVBSSU5US18zKFRSQUNFX1RQMzc4MEksCisJCQkidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AsIGdvdCBpbnRlcnJ1cHQgJXggYlNoYXJlRHNwSXJxICV4XG4iLAorCQkJcFNldHRpbmdzLT51c0RzcElycSwgcEJERGF0YS0+YlNoYXJlRHNwSXJxKTsKKwkJYkludGVycnVwdEFsbG9jYXRlZCA9IFRSVUU7CisJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBUUlVFOworCX0KKworCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoRkFMU0UpOworCWlmIChzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKFRSVUUpKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKFRSVUUpIGZhaWxlZFxuIik7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0gZWxzZSB7CisJCWJEU1BQb3dlcmVkVXAgPSBUUlVFOworCX0KKworCWlmIChkc3AzNzgwSV9FbmFibGVEU1AocFNldHRpbmdzLCBzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZCwgc19hdXNUaGlua3BhZERtYVRvRmllbGQpKSB7CisJCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBkc3A3ODgwSV9FbmFibGVEU1AoKSBmYWlsZWRcbiIpOworCQlnb3RvIGV4aXRfY2xlYW51cDsKKwl9IGVsc2UgeworCQliRFNQRW5hYmxlZCA9IFRSVUU7CisJfQorCisJRW5hYmxlU1JBTShwQkREYXRhKTsKKworCXBCRERhdGEtPmJEU1BFbmFibGVkID0gVFJVRTsKKworCVBSSU5US18xKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUCBleGl0XG4iKTsKKworCXJldHVybiAwOworCitleGl0X2NsZWFudXA6CisJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogQ2xlYW5pbmcgdXBcbiIpOworCWlmIChiRFNQRW5hYmxlZCkKKwkJZHNwMzc4MElfRGlzYWJsZURTUChwU2V0dGluZ3MpOworCWlmIChiRFNQUG93ZXJlZFVwKQorCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKKwlpZiAoYkludGVycnVwdEFsbG9jYXRlZCkgeworCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworCitpbnQgdHAzNzgwSV9EaXNhYmxlRFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9EaXNhYmxlRFNQIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisJaWYgKHBCRERhdGEtPmJEU1BFbmFibGVkKSB7CisJCWRzcDM3ODBJX0Rpc2FibGVEU1AoJnBCRERhdGEtPnJEc3BTZXR0aW5ncyk7CisJCWlmIChwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkKSB7CisJCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKKwkJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJfQorCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKKwkJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9EaXNhYmxlRFNQIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgdHAzNzgwSV9SZXNldERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfUmVzZXREU1AgZW50cnkgcEJERGF0YSAlcFxuIiwKKwkJcEJERGF0YSk7CisKKwlpZiAoZHNwMzc4MElfUmVzZXQocFNldHRpbmdzKSA9PSAwKSB7CisJCUVuYWJsZVNSQU0ocEJERGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9SZXNldERTUCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHRwMzc4MElfU3RhcnREU1AoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX1N0YXJ0RFNQIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisJaWYgKGRzcDM3ODBJX1J1bihwU2V0dGluZ3MpID09IDApIHsKKwkJLy8gQEJVRyBAVEJEIEVuYWJsZVNSQU0ocEJERGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9TdGFydERTUCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHRwMzc4MElfUXVlcnlBYmlsaXRpZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEsIE1XX0FCSUxJVElFUyAqIHBBYmlsaXRpZXMpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9RdWVyeUFiaWxpdGllcyBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCS8qIGZpbGwgb3V0IHN0YW5kYXJkIGNvbnN0YW50IGZpZWxkcyAqLworCXBBYmlsaXRpZXMtPmluc3RyX3Blcl9zZWMgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudUlwczsKKwlwQWJpbGl0aWVzLT5kYXRhX3NpemUgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudURTdG9yZVNpemU7CisJcEFiaWxpdGllcy0+aW5zdF9zaXplID0gcEJERGF0YS0+ckRzcFNldHRpbmdzLnVJU3RvcmVTaXplOworCXBBYmlsaXRpZXMtPmJ1c19kbWFfYncgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudURtYUJhbmR3aWR0aDsKKworCS8qIGZpbGwgb3V0IGR5bmFtaWNhbGx5IGRldGVybWluZWQgZmllbGRzICovCisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbMF0gPSAweDAwMDEwMDAwIHwgTVdfQURDX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbMV0gPSAweDAwMDEwMDAwIHwgTVdfQUNJX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbMl0gPSAweDAwMDEwMDAwIHwgTVdfQUlDMV9NQVNLOworCXBBYmlsaXRpZXMtPmNvbXBvbmVudF9saXN0WzNdID0gMHgwMDAxMDAwMCB8IE1XX0FJQzJfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFs0XSA9IDB4MDAwMTAwMDAgfCBNV19DRERBQ19NQVNLOworCXBBYmlsaXRpZXMtPmNvbXBvbmVudF9saXN0WzVdID0gMHgwMDAxMDAwMCB8IE1XX01JRElfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFs2XSA9IDB4MDAwMTAwMDAgfCBNV19VQVJUX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2NvdW50ID0gNzsKKworCS8qIEZpbGwgb3V0IE13YXZlIE9TIGFuZCBCSU9TIHRhc2sgbmFtZXMgKi8KKworCW1lbWNweShwQWJpbGl0aWVzLT5td2F2ZV9vc19uYW1lLCBUUF9BQklMSVRJRVNfTVdBVkVPU19OQU1FLAorCQlzaXplb2YoVFBfQUJJTElUSUVTX01XQVZFT1NfTkFNRSkpOworCW1lbWNweShwQWJpbGl0aWVzLT5iaW9zX3Rhc2tfbmFtZSwgVFBfQUJJTElUSUVTX0JJT1NUQVNLX05BTUUsCisJCXNpemVvZihUUF9BQklMSVRJRVNfQklPU1RBU0tfTkFNRSkpOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUXVlcnlBYmlsaXRpZXMgZXhpdCByZXR2YWw9U1VDQ0VTU0ZVTFxuIik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEsIHVuc2lnbmVkIGludCB1T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgaW50IHVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlCT09MRUFOIGJSQyA9IDA7CisKKwlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJcEJERGF0YSwgdU9wY29kZSwgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKworCWlmIChwQkREYXRhLT5iRFNQRW5hYmxlZCkgeworCQlzd2l0Y2ggKHVPcGNvZGUpIHsKKwkJY2FzZSBJT0NUTF9NV19SRUFEX0RBVEE6CisJCQliUkMgPSBkc3AzNzgwSV9SZWFkRFN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJT0NUTF9NV19SRUFEQ0xFQVJfREFUQToKKwkJCWJSQyA9IGRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSh1c0RzcEJhc2VJTywgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU9DVExfTVdfV1JJVEVfREFUQToKKwkJCWJSQyA9IGRzcDM3ODBJX1dyaXRlRFN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAoYlJDKSA/IC1FSU8gOiAwOworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX1JlYWRXcml0ZURzcERTdG9yZSBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhLCB1bnNpZ25lZCBpbnQgdU9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqcHZCdWZmZXIsIHVuc2lnbmVkIGludCB1Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJQk9PTEVBTiBiUkMgPSAwOworCisJUFJJTlRLXzYoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlIGVudHJ5IHBCRERhdGEgJXAsIHVPcGNvZGUgJXgsIHB2QnVmZmVyICVwLCB1Q291bnQgJXgsIHVsRFNQQWRkciAlbHhcbiIsCisJCXBCRERhdGEsIHVPcGNvZGUsIHB2QnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisKKwlpZiAocEJERGF0YS0+YkRTUEVuYWJsZWQpIHsKKwkJc3dpdGNoICh1T3Bjb2RlKSB7CisJCWNhc2UgSU9DVExfTVdfUkVBRF9JTlNUOgorCQkJYlJDID0gZHNwMzc4MElfUmVhZElTdG9yZSh1c0RzcEJhc2VJTywgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU9DVExfTVdfV1JJVEVfSU5TVDoKKwkJCWJSQyA9IGRzcDM3ODBJX1dyaXRlSVN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAoYlJDKSA/IC1FSU8gOiAwOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2ODViNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisqCisqIHRwMzc4MGkuaCAtLSBkZWNsYXJhdGlvbnMgZm9yIHRwMzc4MGkuYworKgorKgorKiBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuIElCTSBDb3Jwb3JhdGlvbgorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIE5PIFdBUlJBTlRZCisqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyoKKyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyoKKyoKKyogMTAvMjMvMjAwMCAtIEFscGhhIFJlbGVhc2UKKyoJRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisqLworCisjaWZuZGVmIF9MSU5VWF9UUDM3ODBJX0gKKyNkZWZpbmUgX0xJTlVYX1RQMzc4MElfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAibXdhdmVwdWIuaCIKKworCisvKiBEU1AgYWJpbGl0aWVzIGNvbnN0YW50cyBmb3IgMzc4MGkgYmFzZWQgVGhpbmtwYWRzICovCisjZGVmaW5lIFRQX0FCSUxJVElFU19JTlRTX1BFUl9TRUMgICAgICAgMzkxNjA4MDAKKyNkZWZpbmUgVFBfQUJJTElUSUVTX0RBVEFfU0laRSAgICAgICAgICAzMjc2OAorI2RlZmluZSBUUF9BQklMSVRJRVNfSU5TVF9TSVpFICAgICAgICAgIDMyNzY4CisjZGVmaW5lIFRQX0FCSUxJVElFU19NV0FWRU9TX05BTUUgICAgICAgIm13YXZlb3MwNzAwLmRzcCIKKyNkZWZpbmUgVFBfQUJJTElUSUVTX0JJT1NUQVNLX05BTUUgICAgICAibXdiaW83MDEuZHNwIgorCisKKy8qIERTUCBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgMzc4MGkgYmFzZWQgVGhpbmtwYWRzICovCisjZGVmaW5lIFRQX0NGR19OdW1UcmFuc2ZlcnMgICAgIDMJLyogMTYgdHJhbnNmZXJzICovCisjZGVmaW5lIFRQX0NGR19SZXJlcXVlc3RUaW1lciAgIDEJLyogMiB1c2VjICovCisjZGVmaW5lIFRQX0NGR19NRU1DUzE2ICAgICAgICAgIDAJLyogRGlzYWJsZWQsIDE2LWJpdCBtZW1vcnkgYXNzdW1lZCAqLworI2RlZmluZSBUUF9DRkdfSXNhTWVtQ21kV2lkdGggICAzCS8qIDI5NSBuc2VjICgxNi1iaXQpICovCisjZGVmaW5lIFRQX0NGR19HYXRlSU9DSFJEWSAgICAgIDAJLyogTm8gSU9DSFJEWSBnYXRpbmcgKi8KKyNkZWZpbmUgVFBfQ0ZHX0VuYWJsZVB3ck1nbXQgICAgMQkvKiBFbmFibGUgbG93IHBvc2VyIHN1c3BlbmQvcmVzdW1lICovCisjZGVmaW5lIFRQX0NGR19IQnVzVGltZXJWYWx1ZSAyNTUJLyogSEJ1cyB0aW1lciBsb2FkIHZhbHVlICovCisjZGVmaW5lIFRQX0NGR19EaXNhYmxlTEJ1c1RpbWVvdXQgMAkvKiBFbmFibGUgTEJ1cyB0aW1lb3V0ICovCisjZGVmaW5lIFRQX0NGR19OX0Rpdmlzb3IgICAgICAgMzIJLyogQ2xvY2sgPSAzOS4xNjA4IE1oeiAqLworI2RlZmluZSBUUF9DRkdfTV9NdWx0aXBsaWVyICAgIDM3CS8qICIgKi8KKyNkZWZpbmUgVFBfQ0ZHX1BsbEJ5cGFzcyAgICAgICAgMAkvKiBkb24ndCBieXBhc3MgKi8KKyNkZWZpbmUgVFBfQ0ZHX0NoaXBsZXRFbmFibGUgMHhGRkZGCS8qIEVuYWJsZSBhbGwgY2hpcGxldHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBiRFNQRW5hYmxlZDsKKwlpbnQgYlNoYXJlRHNwSXJxOworCWludCBiU2hhcmVVYXJ0SXJxOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgckRzcFNldHRpbmdzOworfSBUSElOS1BBRF9CRF9EQVRBOworCitpbnQgdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX0NhbGNSZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfQ2xhaW1SZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfUmVsZWFzZVJlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9FbmFibGVEU1AoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfRGlzYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9SZXNldERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9TdGFydERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9RdWVyeUFiaWxpdGllcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgTVdfQUJJTElUSUVTICogcEFiaWxpdGllcyk7CitpbnQgdHAzNzgwSV9DbGVhbnVwKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX1JlYWRXcml0ZURzcERTdG9yZShUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgdW5zaWduZWQgaW50IHVPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCBpbnQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCB0cDM3ODBJX1JlYWRXcml0ZURzcElTdG9yZShUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgdW5zaWduZWQgaW50IHVPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCBpbnQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyNDUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC0wLDAgKzEsMzE3MCBAQAorLyoKKyAqICAgICAgICAgIG14c2VyLmMgIC0tIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgTW94YSBUZWNobm9sb2dpZXMgKHN1cHBvcnRAbW94YS5jb20udHcpLgorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIExpbnV4IHNlcmlhbCBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqICAgICAgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKglPcmlnaW5hbCByZWxlYXNlCTEwLzI2LzAwCisgKgorICoJMDIvMDYvMDEJU3VwcG9ydCBNT1hBIEluZHVzdGlvIGZhbWlseSBib2FyZHMuCisgKgkwMi8wNi8wMQlTdXBwb3J0IFRJT0NHSUNPVU5ULgorICoJMDIvMDYvMDEJRml4IHRoZSBwcm9ibGVtIGZvciBjb25uZWN0aW5nIHRvIHNlcmlhbCBtb3VzZS4KKyAqCTAyLzA2LzAxCUZpeCB0aGUgcHJvYmxlbSBmb3IgSC9XIGZsb3cgY29udHJvbC4KKyAqCTAyLzA2LzAxCUZpeCB0aGUgY29tcGxpbmcgd2FybmluZyB3aGVuIENPTkZJR19QQ0kKKyAqCQkJZG9uJ3QgYmUgZGVmaW5lZC4KKyAqCisgKglGZWQgdGhyb3VnaCBhIGNsZWFudXAsIGluZGVudCBhbmQgcmVtb3ZlIG9mIG5vbiAyLjYgY29kZSBieSBBbGFuIENveAorICoJPGFsYW5AcmVkaGF0LmNvbT4uIFRoZSBvcmlnaW5hbCAxLjggY29kZSBpcyBhdmFpbGFibGUgb24gd3d3Lm1veGEuY29tLgorICoJLSBGaXhlZCB4ODZfNjQgY2xlYW5uZXNzCisgKgktIEZpeGVkIHNsZWVwIHdpdGggc3BpbmxvY2sgaGVsZCBpbiBteHNlcl9zZW5kX2JyZWFrCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibXhzZXIuaCIKKworI2RlZmluZQlNWFNFUl9WRVJTSU9OCSIxLjgiCisjZGVmaW5lCU1YU0VSTUFKT1IJIDE3NAorI2RlZmluZQlNWFNFUkNVTUFKT1IJIDE3NQorCisjZGVmaW5lCU1YU0VSX0VWRU5UX1RYTE9XCSAxCisjZGVmaW5lCU1YU0VSX0VWRU5UX0hBTkdVUAkgMgorCisjZGVmaW5lIE1YU0VSX0JPQVJEUwkJNAkvKiBNYXguIGJvYXJkcyAqLworI2RlZmluZSBNWFNFUl9QT1JUUwkJMzIJLyogTWF4LiBwb3J0cyAqLworI2RlZmluZSBNWFNFUl9QT1JUU19QRVJfQk9BUkQJOAkvKiBNYXguIHBvcnRzIHBlciBib2FyZCAqLworI2RlZmluZSBNWFNFUl9JU1JfUEFTU19MSU1JVAkyNTYKKworI2RlZmluZQlNWFNFUl9FUlJfSU9BRERSCS0xCisjZGVmaW5lCU1YU0VSX0VSUl9JUlEJCS0yCisjZGVmaW5lCU1YU0VSX0VSUl9JUlFfQ09ORkxJVAktMworI2RlZmluZQlNWFNFUl9FUlJfVkVDVE9SCS00CisKKyNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMCTEKKyNkZWZpbmUgU0VSSUFMX1RZUEVfQ0FMTE9VVAkyCisKKyNkZWZpbmUgV0FLRVVQX0NIQVJTCQkyNTYKKworI2RlZmluZSBVQVJUX01DUl9BRkUJCTB4MjAKKyNkZWZpbmUgVUFSVF9MU1JfU1BFQ0lBTAkweDFFCisKKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCShpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0t8SVhPTnxJWE9GRikpCisKKyNkZWZpbmUgSVJRX1QoaW5mbykgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NIQVJFX0lSUSkgPyBTQV9TSElSUSA6IFNBX0lOVEVSUlVQVCkKKworI2RlZmluZSBDMTY4X0FTSUNfSUQgICAgMQorI2RlZmluZSBDMTA0X0FTSUNfSUQgICAgMgorI2RlZmluZSBDMTAyX0FTSUNfSUQJMHhCCisjZGVmaW5lIENJMTMyX0FTSUNfSUQJNAorI2RlZmluZSBDSTEzNF9BU0lDX0lECTMKKyNkZWZpbmUgQ0kxMDRKX0FTSUNfSUQgIDUKKworZW51bSB7CisJTVhTRVJfQk9BUkRfQzE2OF9JU0EgPSAxLAorCU1YU0VSX0JPQVJEX0MxMDRfSVNBLAorCU1YU0VSX0JPQVJEX0NJMTA0SiwKKwlNWFNFUl9CT0FSRF9DMTY4X1BDSSwKKwlNWFNFUl9CT0FSRF9DMTA0X1BDSSwKKwlNWFNFUl9CT0FSRF9DMTAyX0lTQSwKKwlNWFNFUl9CT0FSRF9DSTEzMiwKKwlNWFNFUl9CT0FSRF9DSTEzNCwKKwlNWFNFUl9CT0FSRF9DUDEzMiwKKwlNWFNFUl9CT0FSRF9DUDExNCwKKwlNWFNFUl9CT0FSRF9DVDExNCwKKwlNWFNFUl9CT0FSRF9DUDEwMiwKKwlNWFNFUl9CT0FSRF9DUDEwNFUsCisJTVhTRVJfQk9BUkRfQ1AxNjhVLAorCU1YU0VSX0JPQVJEX0NQMTMyVSwKKwlNWFNFUl9CT0FSRF9DUDEzNFUsCisJTVhTRVJfQk9BUkRfQ1AxMDRKVSwKKwlNWFNFUl9CT0FSRF9SQzcwMDAsCisJTVhTRVJfQk9BUkRfQ1AxMThVLAorCU1YU0VSX0JPQVJEX0NQMTAyVUwsCisJTVhTRVJfQk9BUkRfQ1AxMDJVLAorfTsKKworc3RhdGljIGNoYXIgKm14c2VyX2JyZG5hbWVbXSA9IHsKKwkiQzE2OCBzZXJpZXMiLAorCSJDMTA0IHNlcmllcyIsCisJIkNJLTEwNEogc2VyaWVzIiwKKwkiQzE2OEgvUENJIHNlcmllcyIsCisJIkMxMDRIL1BDSSBzZXJpZXMiLAorCSJDMTAyIHNlcmllcyIsCisJIkNJLTEzMiBzZXJpZXMiLAorCSJDSS0xMzQgc2VyaWVzIiwKKwkiQ1AtMTMyIHNlcmllcyIsCisJIkNQLTExNCBzZXJpZXMiLAorCSJDVC0xMTQgc2VyaWVzIiwKKwkiQ1AtMTAyIHNlcmllcyIsCisJIkNQLTEwNFUgc2VyaWVzIiwKKwkiQ1AtMTY4VSBzZXJpZXMiLAorCSJDUC0xMzJVIHNlcmllcyIsCisJIkNQLTEzNFUgc2VyaWVzIiwKKwkiQ1AtMTA0SlUgc2VyaWVzIiwKKwkiTW94YSBVQzcwMDAgU2VyaWFsIiwKKwkiQ1AtMTE4VSBzZXJpZXMiLAorCSJDUC0xMDJVTCBzZXJpZXMiLAorCSJDUC0xMDJVIHNlcmllcyIsCit9OworCitzdGF0aWMgaW50IG14c2VyX251bXBvcnRzW10gPSB7CisJOCwJCQkvLyBDMTY4LUlTQQorCTQsCQkJLy8gQzEwNC1JU0EKKwk0LAkJCS8vIENJMTA0SgorCTgsCQkJLy8gQzE2OC1QQ0kKKwk0LAkJCS8vIEMxMDQtUENJCisJMiwJCQkvLyBDMTAyLUlTQQorCTIsCQkJLy8gQ0kxMzIKKwk0LAkJCS8vIENJMTM0CisJMiwJCQkvLyBDUDEzMgorCTQsCQkJLy8gQ1AxMTQKKwk0LAkJCS8vIENUMTE0CisJMiwJCQkvLyBDUDEwMgorCTQsCQkJLy8gQ1AxMDRVCisJOCwJCQkvLyBDUDE2OFUKKwkyLAkJCS8vIENQMTMyVQorCTQsCQkJLy8gQ1AxMzRVCisJNCwJCQkvLyBDUDEwNEpVCisJOCwJCQkvLyBSQzcwMDAKKwk4LAkJCS8vIENQMTE4VSAKKwkyLAkJCS8vIENQMTAyVUwgCisJMiwJCQkvLyBDUDEwMlUKK307CisKKyNkZWZpbmUgVUFSVF9UWVBFX05VTQkyCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgR21veGFfdWFydF9pZFtVQVJUX1RZUEVfTlVNXSA9IHsKKwlNT1hBX01VU1RfTVUxNTBfSFdJRCwKKwlNT1hBX01VU1RfTVU4NjBfSFdJRAorfTsKKworLy8gVGhpcyBpcyBvbmx5IGZvciBQQ0kKKyNkZWZpbmUgVUFSVF9JTkZPX05VTQkzCitzdHJ1Y3QgbXhwY2l1YXJ0X2luZm8geworCWludCB0eXBlOworCWludCB0eF9maWZvOworCWludCByeF9maWZvOworCWludCB4bWl0X2ZpZm9fc2l6ZTsKKwlpbnQgcnhfaGlnaF93YXRlcjsKKwlpbnQgcnhfdHJpZ2dlcjsKKwlpbnQgcnhfbG93X3dhdGVyOworCWxvbmcgbWF4X2JhdWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cGNpdWFydF9pbmZvIEdwY2lfdWFydF9pbmZvW1VBUlRfSU5GT19OVU1dID0geworCXtNT1hBX09USEVSX1VBUlQsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMSwgOTIxNjAwTH0sCisJe01PWEFfTVVTVF9NVTE1MF9IV0lELCA2NCwgNjQsIDY0LCA0OCwgNDgsIDE2LCAyMzA0MDBMfSwKKwl7TU9YQV9NVVNUX01VODYwX0hXSUQsIDEyOCwgMTI4LCAxMjgsIDk2LCA5NiwgMzIsIDkyMTYwMEx9Cit9OworCisKKyNpZmRlZiBDT05GSUdfUENJCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBteHNlcl9wY2licmRzW10gPSB7CisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0MxNjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0MxNjhfUENJfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQzEwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQzEwNF9QQ0l9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMzJ9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDExNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMTR9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DVDExNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1QxMTR9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDJ9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNFUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTA0VX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTY4VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxNjhVfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMzJVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEzMlV9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzNFUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTM0VX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTA0SlUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTA0SlV9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9SQzcwMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX1JDNzAwMH0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE4VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMThVfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDJVTCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDJVTH0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyVSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDJVfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBteHNlcl9wY2licmRzKTsKKworCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX21veGFfcGNpX2luZm8geworCXVuc2lnbmVkIHNob3J0IGJ1c051bTsKKwl1bnNpZ25lZCBzaG9ydCBkZXZOdW07CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA2LTIzLTIwMDMKK30gbW94YV9wY2lfaW5mbzsKKworc3RhdGljIGludCBpb2FkZHJbTVhTRVJfQk9BUkRTXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCB0dHltYWpvciA9IE1YU0VSTUFKT1I7CitzdGF0aWMgaW50IGNhbGxvdXRtYWpvciA9IE1YU0VSQ1VNQUpPUjsKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CisKKy8qIFZhcmlhYmxlcyBmb3IgaW5zbW9kICovCisKK01PRFVMRV9BVVRIT1IoIkNhc3BlciBZYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1PWEEgU21hcnRpby9JbmR1c3RpbyBGYW1pbHkgTXVsdGlwb3J0IEJvYXJkIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9QQVJNKGlvYWRkciwgIjEtNGkiKTsKK01PRFVMRV9QQVJNKHR0eW1ham9yLCAiaSIpOworTU9EVUxFX1BBUk0oY2FsbG91dG1ham9yLCAiaSIpOworTU9EVUxFX1BBUk0odmVyYm9zZSwgImkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IG14c2VyX2xvZyB7CisJaW50IHRpY2s7CisJdW5zaWduZWQgbG9uZyByeGNudFtNWFNFUl9QT1JUU107CisJdW5zaWduZWQgbG9uZyB0eGNudFtNWFNFUl9QT1JUU107Cit9OworCisKK3N0cnVjdCBteHNlcl9tb24geworCXVuc2lnbmVkIGxvbmcgcnhjbnQ7CisJdW5zaWduZWQgbG9uZyB0eGNudDsKKwl1bnNpZ25lZCBsb25nIHVwX3J4Y250OworCXVuc2lnbmVkIGxvbmcgdXBfdHhjbnQ7CisJaW50IG1vZGVtX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGhvbGRfcmVhc29uOworfTsKKworc3RydWN0IG14c2VyX21vbl9leHQgeworCXVuc2lnbmVkIGxvbmcgcnhfY250WzMyXTsKKwl1bnNpZ25lZCBsb25nIHR4X2NudFszMl07CisJdW5zaWduZWQgbG9uZyB1cF9yeGNudFszMl07CisJdW5zaWduZWQgbG9uZyB1cF90eGNudFszMl07CisJaW50IG1vZGVtX3N0YXR1c1szMl07CisKKwlsb25nIGJhdWRyYXRlWzMyXTsKKwlpbnQgZGF0YWJpdHNbMzJdOworCWludCBzdG9wYml0c1szMl07CisJaW50IHBhcml0eVszMl07CisJaW50IGZsb3djdHJsWzMyXTsKKwlpbnQgZmlmb1szMl07CisJaW50IGlmdHlwZVszMl07Cit9Oworc3RydWN0IG14c2VyX2h3Y29uZiB7CisJaW50IGJvYXJkX3R5cGU7CisJaW50IHBvcnRzOworCWludCBpcnE7CisJaW50IHZlY3RvcjsKKwlpbnQgdmVjdG9yX21hc2s7CisJaW50IHVhcnRfdHlwZTsKKwlpbnQgaW9hZGRyW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CisJaW50IGJhdWRfYmFzZVtNWFNFUl9QT1JUU19QRVJfQk9BUkRdOworCW1veGFfcGNpX2luZm8gcGNpSW5mbzsKKwlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJaW50IE1heENhblNldEJhdWRSYXRlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwlpbnQgb3Btb2RlX2lvYWRkcltNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0Cit9OworCitzdHJ1Y3QgbXhzZXJfc3RydWN0IHsKKwlpbnQgcG9ydDsKKwlpbnQgYmFzZTsJCS8qIHBvcnQgYmFzZSBhZGRyZXNzICovCisJaW50IGlycTsJCS8qIHBvcnQgdXNpbmcgaXJxIG5vLiAqLworCWludCB2ZWN0b3I7CQkvKiBwb3J0IGlycSB2ZWN0b3IgKi8KKwlpbnQgdmVjdG9ybWFzazsJCS8qIHBvcnQgdmVjdG9yIG1hc2sgKi8KKwlpbnQgcnhfaGlnaF93YXRlcjsKKwlpbnQgcnhfdHJpZ2dlcjsJCS8qIFJ4IGZpZm8gdHJpZ2dlciBsZXZlbCAqLworCWludCByeF9sb3dfd2F0ZXI7CisJaW50IGJhdWRfYmFzZTsJCS8qIG1heC4gc3BlZWQgKi8KKwlpbnQgZmxhZ3M7CQkvKiBkZWZpbmVkIGluIHR0eS5oICovCisJaW50IHR5cGU7CQkvKiBVQVJUIHR5cGUgKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCByZWFkX3N0YXR1c19tYXNrOworCWludCBpZ25vcmVfc3RhdHVzX21hc2s7CisJaW50IHhtaXRfZmlmb19zaXplOworCWludCBjdXN0b21fZGl2aXNvcjsKKwlpbnQgeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50IGNsb3NlX2RlbGF5OworCXVuc2lnbmVkIHNob3J0IGNsb3Npbmdfd2FpdDsKKwlpbnQgSUVSOwkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworCWludCBNQ1I7CQkvKiBNb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgbG9uZyBldmVudDsKKwlpbnQgY291bnQ7CQkvKiAjIG9mIGZkIG9uIGRldmljZSAqLworCWludCBibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCWxvbmcgc2Vzc2lvbjsJCS8qIFNlc3Npb24gb2Ygb3BlbmluZyBwcm9jZXNzICovCisJbG9uZyBwZ3JwOwkJLyogcGdycCBvZiBvcGVuaW5nIHByb2Nlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICp4bWl0X2J1ZjsKKwlpbnQgeG1pdF9oZWFkOworCWludCB4bWl0X3RhaWw7CisJaW50IHhtaXRfY250OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0cXVldWU7CisJc3RydWN0IHRlcm1pb3Mgbm9ybWFsX3Rlcm1pb3M7CisJc3RydWN0IHRlcm1pb3MgY2FsbG91dF90ZXJtaW9zOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjbG9zZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OworCXN0cnVjdCBhc3luY19pY291bnQgaWNvdW50OwkvKiBrZXJuZWwgY291bnRlcnMgZm9yIHRoZSA0IGlucHV0IGludGVycnVwdHMgKi8KKwlpbnQgdGltZW91dDsKKwlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJaW50IE1heENhblNldEJhdWRSYXRlOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCisJaW50IG9wbW9kZV9pb2FkZHI7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwl1bnNpZ25lZCBjaGFyIHN0b3Bfcng7CisJdW5zaWduZWQgY2hhciBsZGlzY19zdG9wX3J4OworCWxvbmcgcmVhbGJhdWQ7CisJc3RydWN0IG14c2VyX21vbiBtb25fZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGVycl9zaGFkb3c7CisJc3BpbmxvY2tfdCBzbG9jazsKK307CisKKworc3RydWN0IG14c2VyX21zdGF0dXMgeworCXRjZmxhZ190IGNmbGFnOworCWludCBjdHM7CisJaW50IGRzcjsKKwlpbnQgcmk7CisJaW50IGRjZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbXN0YXR1cyBHTVN0YXR1c1tNWFNFUl9QT1JUU107CisKK3N0YXRpYyBpbnQgbXhzZXJCb2FyZENBUFtNWFNFUl9CT0FSRFNdID0geworCTAsIDAsIDAsIDAKKwkgICAgLyogIDB4MTgwLCAweDI4MCwgMHgyMDAsIDB4MzIwICAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbXh2YXJfc2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfc3RydWN0IG14dmFyX3RhYmxlW01YU0VSX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqbXh2YXJfdHR5W01YU0VSX1BPUlRTICsgMV07CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgKm14dmFyX3Rlcm1pb3NbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyAqbXh2YXJfdGVybWlvc19sb2NrZWRbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbG9nIG14dmFyX2xvZzsKK3N0YXRpYyBpbnQgbXh2YXJfZGlhZ2ZsYWc7CitzdGF0aWMgdW5zaWduZWQgY2hhciBteHNlcl9tc3JbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbW9uX2V4dCBtb25fZGF0YV9leHQ7CitzdGF0aWMgaW50IG14c2VyX3NldF9iYXVkX21ldGhvZFtNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHNwaW5sb2NrX3QgZ21fbG9jazsKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzCisgKi8KKworc3RhdGljIHN0cnVjdCBteHNlcl9od2NvbmYgbXhzZXJjZmdbTVhTRVJfQk9BUkRTXTsKKworLyoKKyAqIHN0YXRpYyBmdW5jdGlvbnM6CisgKi8KKworc3RhdGljIHZvaWQgbXhzZXJfZ2V0Y2ZnKGludCBib2FyZCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKTsKK3N0YXRpYyBpbnQgbXhzZXJfaW5pdCh2b2lkKTsKKworLy9zdGF0aWMgdm9pZCAgIG14c2VyX3BvbGwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IG14c2VyX2dldF9JU0FfY29uZihpbnQsIHN0cnVjdCBteHNlcl9od2NvbmYgKik7CitzdGF0aWMgaW50IG14c2VyX2dldF9QQ0lfY29uZihpbnQsIGludCwgaW50LCBzdHJ1Y3QgbXhzZXJfaHdjb25mICopOworc3RhdGljIHZvaWQgbXhzZXJfZG9fc29mdGludCh2b2lkICopOworc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIHZvaWQgbXhzZXJfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgbXhzZXJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgdWludCwgdWxvbmcpOworc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CitzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3JzX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICosIGludCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3JlY2VpdmVfY2hhcnMoc3RydWN0IG14c2VyX3N0cnVjdCAqLCBpbnQgKik7CitzdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3NodXRkb3duKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOworc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqLCB1bnNpZ25lZCBpbnQgX191c2VyICopOworc3RhdGljIHZvaWQgbXhzZXJfc2VuZF9icmVhayhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIGludCk7CitzdGF0aWMgaW50IG14c2VyX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBteHNlcl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IG14c2VyX3NldF9iYXVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIGxvbmcgbmV3c3BkKTsKK3N0YXRpYyB2b2lkIG14c2VyX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0cngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBteHNlcl9zdG9wcngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKKworc3RhdGljIGludCBDaGVja0lzTW94YU11c3QoaW50IGlvKQoreworCXU4IG9sZG1jciwgaHdpZDsKKwlpbnQgaTsKKworCW91dGIoMCwgaW8gKyBVQVJUX0xDUik7CisJRElTQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShpbyk7CisJb2xkbWNyID0gaW5iKGlvICsgVUFSVF9NQ1IpOworCW91dGIoMCwgaW8gKyBVQVJUX01DUik7CisJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGlvLCAweDExKTsKKwlpZiAoKGh3aWQgPSBpbmIoaW8gKyBVQVJUX01DUikpICE9IDApIHsKKwkJb3V0YihvbGRtY3IsIGlvICsgVUFSVF9NQ1IpOworCQlyZXR1cm4gKE1PWEFfT1RIRVJfVUFSVCk7CisJfQorCisJR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChpbywgJmh3aWQpOworCWZvciAoaSA9IDA7IGkgPCBVQVJUX1RZUEVfTlVNOyBpKyspIHsKKwkJaWYgKGh3aWQgPT0gR21veGFfdWFydF9pZFtpXSkKKwkJCXJldHVybiAoaW50KSBod2lkOworCX0KKwlyZXR1cm4gTU9YQV9PVEhFUl9VQVJUOworfQorCisvLyBhYm92ZSBpcyBtb2RpZmllZCBieSBWaWN0b3IgWXUuIDA4LTE1LTIwMDIKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBteHNlcl9vcHMgPSB7CisJLm9wZW4gPSBteHNlcl9vcGVuLAorCS5jbG9zZSA9IG14c2VyX2Nsb3NlLAorCS53cml0ZSA9IG14c2VyX3dyaXRlLAorCS5wdXRfY2hhciA9IG14c2VyX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IG14c2VyX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gbXhzZXJfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBteHNlcl9mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gbXhzZXJfaW9jdGwsCisJLnRocm90dGxlID0gbXhzZXJfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBteHNlcl91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IG14c2VyX3NldF90ZXJtaW9zLAorCS5zdG9wID0gbXhzZXJfc3RvcCwKKwkuc3RhcnQgPSBteHNlcl9zdGFydCwKKwkuaGFuZ3VwID0gbXhzZXJfaGFuZ3VwLAorCS50aW9jbWdldCA9IG14c2VyX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IG14c2VyX3Rpb2Ntc2V0LAorfTsKKworLyoKKyAqIFRoZSBNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7CisJcmV0ID0gbXhzZXJfaW5pdCgpOworCWlmICh2ZXJib3NlKQorCQlwcmludGsoS0VSTl9ERUJVRyAiRG9uZS5cbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBteHNlcl9tb2R1bGVfZXhpdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCisJaWYgKHZlcmJvc2UpCisJCXByaW50ayhLRVJOX0RFQlVHICJVbmxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7CisKKwlpZiAoKGVyciB8PSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcikpKQorCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IHVucmVnaXN0ZXIgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBzZXJpYWwgZHJpdmVyXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCQlpZiAobXhzZXJjZmdbaV0uYm9hcmRfdHlwZSA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQllbHNlIHsKKwkJCXBkZXYgPSBteHNlcmNmZ1tpXS5wY2lJbmZvLnBkZXY7CisJCQlmcmVlX2lycShteHNlcmNmZ1tpXS5pcnEsICZteHZhcl90YWJsZVtpICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEXSk7CisJCQlpZiAocGRldiAhPSBOVUxMKSB7CS8vUENJCisJCQkJcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKKwkJCQlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykpOworCQkJfSBlbHNlIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihteHNlcmNmZ1tpXS5pb2FkZHJbMF0sIDggKiBteHNlcmNmZ1tpXS5wb3J0cyk7CisJCQkJcmVsZWFzZV9yZWdpb24obXhzZXJjZmdbaV0udmVjdG9yLCAxKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkRvbmUuXG4iKTsKKworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3R4cnhfZmlmbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQoreworCWludCBpOworCisJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY0NTApIHx8IChpbmZvLT50eXBlID09IFBPUlRfODI1MCkpIHsKKwkJaW5mby0+cnhfdHJpZ2dlciA9IDE7CisJCWluZm8tPnJ4X2hpZ2hfd2F0ZXIgPSAxOworCQlpbmZvLT5yeF9sb3dfd2F0ZXIgPSAxOworCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDE7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IFVBUlRfSU5GT19OVU07IGkrKykgeworCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBHcGNpX3VhcnRfaW5mb1tpXS50eXBlKSB7CisJCQkJaW5mby0+cnhfdHJpZ2dlciA9IEdwY2lfdWFydF9pbmZvW2ldLnJ4X3RyaWdnZXI7CisJCQkJaW5mby0+cnhfbG93X3dhdGVyID0gR3BjaV91YXJ0X2luZm9baV0ucnhfbG93X3dhdGVyOworCQkJCWluZm8tPnJ4X2hpZ2hfd2F0ZXIgPSBHcGNpX3VhcnRfaW5mb1tpXS5yeF9oaWdoX3dhdGVyOworCQkJCWluZm8tPnhtaXRfZmlmb19zaXplID0gR3BjaV91YXJ0X2luZm9baV0ueG1pdF9maWZvX3NpemU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfaW5pdGJyZChpbnQgYm9hcmQsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvOworCWludCByZXR2YWw7CisJaW50IGksIG47CisKKwluID0gYm9hcmQgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7CisJaW5mbyA9ICZteHZhcl90YWJsZVtuXTsKKwkvKmlmICh2ZXJib3NlKSAqLyAgeworCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICB0dHlNJWQgLSB0dHlNJWQgIiwgbiwgbiArIGh3Y29uZi0+cG9ydHMgLSAxKTsKKwkJcHJpbnRrKCIgbWF4LiBiYXVkIHJhdGUgPSAlZCBicHMuXG4iLCBod2NvbmYtPk1heENhblNldEJhdWRSYXRlWzBdKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrLCBuKyssIGluZm8rKykgeworCQlpbmZvLT5wb3J0ID0gbjsKKwkJaW5mby0+YmFzZSA9IGh3Y29uZi0+aW9hZGRyW2ldOworCQlpbmZvLT5pcnEgPSBod2NvbmYtPmlycTsKKwkJaW5mby0+dmVjdG9yID0gaHdjb25mLT52ZWN0b3I7CisJCWluZm8tPnZlY3Rvcm1hc2sgPSBod2NvbmYtPnZlY3Rvcl9tYXNrOworCQlpbmZvLT5vcG1vZGVfaW9hZGRyID0gaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJCWluZm8tPnN0b3BfcnggPSAwOworCQlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMDsKKworCQlpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBod2NvbmYtPklzTW94YU11c3RDaGlwRmxhZzsKKwkJLy9FbmhhbmNlIG1vZGUgZW5hYmxlZCBoZXJlCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7CisJCQlFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoaW5mby0+YmFzZSk7CisJCX0KKworCQlpbmZvLT5mbGFncyA9IEFTWU5DX1NIQVJFX0lSUTsKKwkJaW5mby0+dHlwZSA9IGh3Y29uZi0+dWFydF90eXBlOworCQlpbmZvLT5iYXVkX2Jhc2UgPSBod2NvbmYtPmJhdWRfYmFzZVtpXTsKKworCQlpbmZvLT5NYXhDYW5TZXRCYXVkUmF0ZSA9IGh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV07CisKKwkJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7CisKKworCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IGh3Y29uZi0+YmF1ZF9iYXNlW2ldICogMTY7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSAqIEhaIC8gMTA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisJCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBteHNlcl9kb19zb2Z0aW50LCBpbmZvKTsKKwkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSBteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3M7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCW1lbXNldCgmaW5mby0+bW9uX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uKSk7CisJCWluZm8tPmVycl9zaGFkb3cgPSAwOworCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+c2xvY2spOworCX0KKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBJUlEgaWYgbmVjZXNzYXJ5CisJICovCisKKworCS8qIGJlZm9yZSBzZXQgSU5UIElTUiwgZGlzYWJsZSBhbGwgaW50ICovCisJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgeworCQlvdXRiKGluYihod2NvbmYtPmlvYWRkcltpXSArIFVBUlRfSUVSKSAmIDB4ZjAsIGh3Y29uZi0+aW9hZGRyW2ldICsgVUFSVF9JRVIpOworCX0KKworCW4gPSBib2FyZCAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKKwlpbmZvID0gJm14dmFyX3RhYmxlW25dOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoaHdjb25mLT5pcnEsIG14c2VyX2ludGVycnVwdCwgSVJRX1QoaW5mbyksICJteHNlciIsIGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCb2FyZCAlZDogJXMiLCBib2FyZCwgbXhzZXJfYnJkbmFtZVtod2NvbmYtPmJvYXJkX3R5cGUgLSAxXSk7CisJCXByaW50aygiICBSZXF1ZXN0IGlycSBmYWlsLElSUSAoJWQpIG1heSBiZSBjb25mbGl0IHdpdGggYW5vdGhlciBkZXZpY2UuXG4iLCBpbmZvLT5pcnEpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9nZXRjZmcoaW50IGJvYXJkLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCit7CisJbXhzZXJjZmdbYm9hcmRdID0gKmh3Y29uZjsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X1BDSV9jb25mKGludCBidXNudW0sIGludCBkZXZudW0sIGludCBib2FyZF90eXBlLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCit7CisJaW50IGksIGo7CisvLyAgICAgIHVuc2lnbmVkIGludCAgICB2YWw7CisJdW5zaWduZWQgaW50IGlvYWRkcmVzczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGh3Y29uZi0+cGNpSW5mby5wZGV2OworCisJLy9pbyBhZGRyZXNzCisJaHdjb25mLT5ib2FyZF90eXBlID0gYm9hcmRfdHlwZTsKKwlod2NvbmYtPnBvcnRzID0gbXhzZXJfbnVtcG9ydHNbYm9hcmRfdHlwZSAtIDFdOworCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMiksICJteHNlcihJTykiKTsKKworCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKKwkJaHdjb25mLT5pb2FkZHJbaV0gPSBpb2FkZHJlc3MgKyA4ICogaTsKKwl9CisKKwkvL3ZlY3RvcgorCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyksICJteHNlcih2ZWN0b3IpIik7CisJaHdjb25mLT52ZWN0b3IgPSBpb2FkZHJlc3M7CisKKwkvL2lycQorCWh3Y29uZi0+aXJxID0gaHdjb25mLT5wY2lJbmZvLnBkZXYtPmlycTsKKworCWh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnID0gQ2hlY2tJc01veGFNdXN0KGh3Y29uZi0+aW9hZGRyWzBdKTsKKwlod2NvbmYtPnVhcnRfdHlwZSA9IFBPUlRfMTY1NTBBOworCWh3Y29uZi0+dmVjdG9yX21hc2sgPSAwOworCisKKwlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBVQVJUX0lORk9fTlVNOyBqKyspIHsKKwkJCWlmIChHcGNpX3VhcnRfaW5mb1tqXS50eXBlID09IGh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IEdwY2lfdWFydF9pbmZvW2pdLm1heF9iYXVkOworCisJCQkJLy9leGNlcHRpb24uLi4uQ1AtMTAyCisJCQkJaWYgKGJvYXJkX3R5cGUgPT0gTVhTRVJfQk9BUkRfQ1AxMDIpCisJCQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSA5MjE2MDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgeworCQkJaWYgKGkgPCA0KQorCQkJCWh3Y29uZi0+b3Btb2RlX2lvYWRkcltpXSA9IGlvYWRkcmVzcyArIDQ7CisJCQllbHNlCisJCQkJaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldID0gaW9hZGRyZXNzICsgMHgwYzsKKwkJfQorCQlvdXRiKDAsIGlvYWRkcmVzcyArIDQpOwkvLyBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlCisJCW91dGIoMCwgaW9hZGRyZXNzICsgMHgwYyk7CS8vZGVmYXVsdCBzZXQgdG8gUlMyMzIgbW9kZQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKKwkJaHdjb25mLT52ZWN0b3JfbWFzayB8PSAoMSA8PCBpKTsKKwkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBteHNlcl9pbml0KHZvaWQpCit7CisJaW50IGksIG0sIHJldHZhbCwgYiwgbjsKKwlpbnQgcmV0MTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IGluZGV4OworCXVuc2lnbmVkIGNoYXIgYnVzbnVtLCBkZXZudW07CisJc3RydWN0IG14c2VyX2h3Y29uZiBod2NvbmY7CisKKwlteHZhcl9zZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNWFNFUl9QT1JUUyArIDEpOworCWlmICghbXh2YXJfc2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJc3Bpbl9sb2NrX2luaXQoJmdtX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CisJCW14c2VyY2ZnW2ldLmJvYXJkX3R5cGUgPSAtMTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciB2ZXJzaW9uICVzXG4iLCBNWFNFUl9WRVJTSU9OKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisJbWVtc2V0KG14dmFyX3Nkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOworCW14dmFyX3Nkcml2ZXItPm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKKwlteHZhcl9zZHJpdmVyLT5uYW1lID0gInR0eU0iOworCW14dmFyX3Nkcml2ZXItPm1ham9yID0gdHR5bWFqb3I7CisJbXh2YXJfc2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCW14dmFyX3Nkcml2ZXItPm51bSA9IE1YU0VSX1BPUlRTICsgMTsKKwlteHZhcl9zZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlteHZhcl9zZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlteHZhcl9zZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKG14dmFyX3Nkcml2ZXIsICZteHNlcl9vcHMpOworCW14dmFyX3Nkcml2ZXItPnR0eXMgPSBteHZhcl90dHk7CisJbXh2YXJfc2RyaXZlci0+dGVybWlvcyA9IG14dmFyX3Rlcm1pb3M7CisJbXh2YXJfc2RyaXZlci0+dGVybWlvc19sb2NrZWQgPSBteHZhcl90ZXJtaW9zX2xvY2tlZDsKKworCW14dmFyX3Nkcml2ZXItPm9wZW4gPSBteHNlcl9vcGVuOworCW14dmFyX3Nkcml2ZXItPmNsb3NlID0gbXhzZXJfY2xvc2U7CisJbXh2YXJfc2RyaXZlci0+d3JpdGUgPSBteHNlcl93cml0ZTsKKwlteHZhcl9zZHJpdmVyLT5wdXRfY2hhciA9IG14c2VyX3B1dF9jaGFyOworCW14dmFyX3Nkcml2ZXItPmZsdXNoX2NoYXJzID0gbXhzZXJfZmx1c2hfY2hhcnM7CisJbXh2YXJfc2RyaXZlci0+d3JpdGVfcm9vbSA9IG14c2VyX3dyaXRlX3Jvb207CisJbXh2YXJfc2RyaXZlci0+Y2hhcnNfaW5fYnVmZmVyID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyOworCW14dmFyX3Nkcml2ZXItPmZsdXNoX2J1ZmZlciA9IG14c2VyX2ZsdXNoX2J1ZmZlcjsKKwlteHZhcl9zZHJpdmVyLT5pb2N0bCA9IG14c2VyX2lvY3RsOworCW14dmFyX3Nkcml2ZXItPnRocm90dGxlID0gbXhzZXJfdGhyb3R0bGU7CisJbXh2YXJfc2RyaXZlci0+dW50aHJvdHRsZSA9IG14c2VyX3VudGhyb3R0bGU7CisJbXh2YXJfc2RyaXZlci0+c2V0X3Rlcm1pb3MgPSBteHNlcl9zZXRfdGVybWlvczsKKwlteHZhcl9zZHJpdmVyLT5zdG9wID0gbXhzZXJfc3RvcDsKKwlteHZhcl9zZHJpdmVyLT5zdGFydCA9IG14c2VyX3N0YXJ0OworCW14dmFyX3Nkcml2ZXItPmhhbmd1cCA9IG14c2VyX2hhbmd1cDsKKwlteHZhcl9zZHJpdmVyLT5icmVha19jdGwgPSBteHNlcl9yc19icmVhazsKKwlteHZhcl9zZHJpdmVyLT53YWl0X3VudGlsX3NlbnQgPSBteHNlcl93YWl0X3VudGlsX3NlbnQ7CisKKwlteHZhcl9kaWFnZmxhZyA9IDA7CisJbWVtc2V0KG14dmFyX3RhYmxlLCAwLCBNWFNFUl9QT1JUUyAqIHNpemVvZihzdHJ1Y3QgbXhzZXJfc3RydWN0KSk7CisJbWVtc2V0KCZteHZhcl9sb2csIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbG9nKSk7CisKKwltZW1zZXQoJm14c2VyX21zciwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogKE1YU0VSX1BPUlRTICsgMSkpOworCW1lbXNldCgmbW9uX2RhdGFfZXh0LCAwLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbl9leHQpKTsKKwltZW1zZXQoJm14c2VyX3NldF9iYXVkX21ldGhvZCwgMCwgc2l6ZW9mKGludCkgKiAoTVhTRVJfUE9SVFMgKyAxKSk7CisJbWVtc2V0KCZod2NvbmYsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSk7CisKKwltID0gMDsKKwkvKiBTdGFydCBmaW5kaW5nIElTQSBib2FyZHMgaGVyZSAqLworCWZvciAoYiA9IDA7IGIgPCBNWFNFUl9CT0FSRFMgJiYgbSA8IE1YU0VSX0JPQVJEUzsgYisrKSB7CisJCWludCBjYXA7CisJCWlmICghKGNhcCA9IG14c2VyQm9hcmRDQVBbYl0pKQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgJmh3Y29uZik7CisKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLCBteHNlcl9icmRuYW1lW2h3Y29uZi5ib2FyZF90eXBlIC0gMV0sIGlvYWRkcltiXSk7CisKKwkJaWYgKHJldHZhbCA8PSAwKSB7CisJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWh3Y29uZi5wY2lJbmZvLmJ1c051bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLmRldk51bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBOVUxMOworCisJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKKwkJLy9pbml0IG14c2VyY2ZnIGZpcnN0LCBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KKwkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKKwkJCWNvbnRpbnVlOworCisKKwkJbSsrOworCX0KKworCS8qIFN0YXJ0IGZpbmRpbmcgSVNBIGJvYXJkcyBmcm9tIG1vZHVsZSBhcmcgKi8KKwlmb3IgKGIgPSAwOyBiIDwgTVhTRVJfQk9BUkRTICYmIG0gPCBNWFNFUl9CT0FSRFM7IGIrKykgeworCQlpbnQgY2FwOworCQlpZiAoIShjYXAgPSBpb2FkZHJbYl0pKQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgJmh3Y29uZik7CisKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLCBteHNlcl9icmRuYW1lW2h3Y29uZi5ib2FyZF90eXBlIC0gMV0sIGlvYWRkcltiXSk7CisKKwkJaWYgKHJldHZhbCA8PSAwKSB7CisJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWh3Y29uZi5wY2lJbmZvLmJ1c051bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLmRldk51bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBOVUxMOworCisJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKKwkJLy9pbml0IG14c2VyY2ZnIGZpcnN0LCBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KKwkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCW0rKzsKKwl9CisKKwkvKiBzdGFydCBmaW5kaW5nIFBDSSBib2FyZCBoZXJlICovCisjaWZkZWYgQ09ORklHX1BDSQorCW4gPSAoc2l6ZW9mKG14c2VyX3BjaWJyZHMpIC8gc2l6ZW9mKG14c2VyX3BjaWJyZHNbMF0pKSAtIDE7CisJaW5kZXggPSAwOworCWIgPSAwOworCXdoaWxlIChiIDwgbikgeworCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKG14c2VyX3BjaWJyZHNbYl0udmVuZG9yLCBteHNlcl9wY2licmRzW2JdLmRldmljZSwgcGRldik7CisJCQlpZiAocGRldiA9PSBOVUxMKSB7CisJCQliKys7CisJCQljb250aW51ZTsKKwkJfQorCQlod2NvbmYucGNpSW5mby5idXNOdW0gPSBidXNudW0gPSBwZGV2LT5idXMtPm51bWJlcjsKKwkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gZGV2bnVtID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pIDw8IDM7CisJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBwZGV2OworCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkKEJ1c05vPSVkLERldk5vPSVkKVxuIiwgbXhzZXJfYnJkbmFtZVsoaW50KSAobXhzZXJfcGNpYnJkc1tiXS5kcml2ZXJfZGF0YSkgLSAxXSwgYnVzbnVtLCBkZXZudW0gPj4gMyk7CisJCWluZGV4Kys7CisJCWlmIChtID49IE1YU0VSX0JPQVJEUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUb28gbWFueSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBib2FyZHMgZmluZCAobWF4aW11bSAlZCksYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIsIE1YU0VSX0JPQVJEUyk7CisJCX0gZWxzZSB7CisJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk1veGEgU21hcnRJL08gUENJIGVuYWJsZSBmYWlsICFcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dmFsID0gbXhzZXJfZ2V0X1BDSV9jb25mKGJ1c251bSwgZGV2bnVtLCAoaW50KSBteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhLCAmaHdjb25mKTsKKwkJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlteHNlcl9nZXRjZmcobSwgJmh3Y29uZik7CisJCQkvL2luaXQgbXhzZXJjZmcgZmlyc3QsIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgorCQkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCQlpZiAobXhzZXJfaW5pdGJyZChtLCAmaHdjb25mKSA8IDApCisJCQkJY29udGludWU7CisJCQltKys7CisJCX0KKwl9CisjZW5kaWYKKworCXJldDEgPSAwOworCWlmICghKHJldDEgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKG14dmFyX3Nkcml2ZXIpKSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBpbnN0YWxsIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgZHJpdmVyICFcbiIpOworCisKKwlpZiAocmV0MSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspIHsKKwkJCWlmIChteHNlcmNmZ1tpXS5ib2FyZF90eXBlID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSB7CisJCQkJZnJlZV9pcnEobXhzZXJjZmdbaV0uaXJxLCAmbXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pOworCQkJCS8vdG9kbzogcmVsZWFzZSBpbywgdmVjdG9yCisJCQl9CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwl0dHkgPSBpbmZvLT50dHk7CisKKwlpZiAodHR5KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCkpCisJCQl0dHlfd2FrZXVwKHR0eSk7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVhTRVJfRVZFTlRfSEFOR1VQLCAmaW5mby0+ZXZlbnQpKQorCQkJdHR5X2hhbmd1cCh0dHkpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXhzZXJfZ2V0X21zcihpbnQgYmFzZWFkZHIsIGludCBtb2RlLCBpbnQgcG9ydCwgc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwlzdGF0dXMgPSBpbmIoYmFzZWFkZHIgKyBVQVJUX01TUik7CisKKwlteHNlcl9tc3JbcG9ydF0gJj0gMHgwRjsKKwlteHNlcl9tc3JbcG9ydF0gfD0gc3RhdHVzOworCXN0YXR1cyA9IG14c2VyX21zcltwb3J0XTsKKwlpZiAobW9kZSkKKwkJbXhzZXJfbXNyW3BvcnRdID0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGEgc2VyaWFsIHBvcnQgaXMgb3BlbmVkLiAgSXQKKyAqIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBzZXJpYWwgcG9ydCwgbGlua2luZyBpbiBpdHMgYXN5bmMgc3RydWN0dXJlIGludG8KKyAqIHRoZSBJUlEgY2hhaW4uICAgSXQgYWxzbyBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljCisgKiBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgbXhzZXJfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvOworCWludCByZXR2YWwsIGxpbmU7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAobGluZSA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIDA7CisJaWYgKGxpbmUgPCAwIHx8IGxpbmUgPiBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaW5mbyA9IG14dmFyX3RhYmxlICsgbGluZTsKKwlpZiAoIWluZm8tPmJhc2UpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisJLyoKKwkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAorCSAqLworCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCisJcmV0dmFsID0gbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCisJaW5mby0+Y291bnQrKzsKKworCWlmICgoaW5mby0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BMSVRfVEVSTUlPUykpIHsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFNFUklBTF9UWVBFX05PUk1BTCkKKwkJCSp0dHktPnRlcm1pb3MgPSBpbmZvLT5ub3JtYWxfdGVybWlvczsKKwkJZWxzZQorCQkJKnR0eS0+dGVybWlvcyA9IGluZm8tPmNhbGxvdXRfdGVybWlvczsKKwkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCX0KKworCWluZm8tPnNlc3Npb24gPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CisJaW5mby0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKworCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKwkvL214c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCisvKiB1bm1hcmsgaGVyZSBmb3IgdmVyeSBoaWdoIGJhdWQgcmF0ZSAoZXguIDkyMTYwMCBicHMpIHVzZWQKKyovCisJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcmlhbCBwb3J0IGdldHMgY2xvc2VkLiAgRmlyc3QsIHdlCisgKiB3YWl0IGZvciB0aGUgbGFzdCByZW1haW5pbmcgZGF0YSB0byBiZSBzZW50LiAgVGhlbiwgd2UgdW5saW5rIGl0cworICogYXN5bmMgc3RydWN0dXJlIGZyb20gdGhlIGludGVycnVwdCBjaGFpbiBpZiBuZWNlc3NhcnksIGFuZCB3ZSBmcmVlCisgKiB0aGF0IElSUSBpZiBub3RoaW5nIGlzIGxlZnQgaW4gdGhlIGNoYWluLgorICovCitzdGF0aWMgdm9pZCBteHNlcl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybjsKKwlpZiAoIWluZm8pCisJCUJVRygpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCisJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCisJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisJCWluZm8tPmNvdW50ID0gMTsKKwl9CisJaWYgKC0taW5mby0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5cyVkOiAlZFxuIiwgaW5mby0+cG9ydCwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFNhdmUgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLCBzaW5jZSB0aGlzIHBvcnQgbWF5IGhhdmUKKwkgKiBzZXBhcmF0ZSB0ZXJtaW9zIGZvciBjYWxsb3V0IGFuZCBkaWFsaW4uCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfTk9STUFMX0FDVElWRSkKKwkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSAqdHR5LT50ZXJtaW9zOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOworCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCWluZm8tPklFUiAmPSB+TU9YQV9NVVNUX1JFQ1ZfSVNSOworLyogYnkgV2lsbGlhbQorCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOworKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJLyoKKwkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCQl3aGlsZSAoIShpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCg1KTsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfQorCW14c2VyX3NodXRkb3duKGluZm8pOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmKGxkLT5mbHVzaF9idWZmZXIpCisJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorCQkKKwl0dHktPmNsb3NpbmcgPSAwOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChpbmZvLT5jbG9zZV9kZWxheSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKworCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisKK30KKworc3RhdGljIGludCBteHNlcl93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgYywgdG90YWwgPSAwOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisJCXJldHVybiAoMCk7CisKKwl3aGlsZSAoMSkgeworCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEsIFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQpKTsKKwkJaWYgKGMgPD0gMCkKKwkJCWJyZWFrOworCisJCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWluZm8tPnhtaXRfaGVhZCA9IChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCWluZm8tPnhtaXRfY250ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXRvdGFsICs9IGM7CisKKwl9CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWlmICghdHR5LT5od19zdG9wcGVkIHx8IChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X2hlYWQrK10gPSBjaDsKKwlpbmZvLT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRSAtIDE7CisJaW5mby0+eG1pdF9jbnQrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmICghdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgIWluZm8tPnhtaXRfYnVmIHx8ICh0dHktPmh3X3N0b3BwZWQgJiYgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG14c2VyX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIGluZm8tPnhtaXRfY250OworfQorCitzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwljaGFyIGZjcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisKKwkvKiBiZWxvdyBhZGRlZCBieSBzaGluaGF5ICovCisJZmNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJb3V0YigoZmNyIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCW91dGIoZmNyLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkvKiBhYm92ZSBhZGRlZCBieSBzaGluaGF5ICovCisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJaWYgKCh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmIHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorCQkodHR5LT5sZGlzYy53cml0ZV93YWtldXApICh0dHkpOworfQorCitzdGF0aWMgaW50IG14c2VyX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXYsIGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOworCXVuc2lnbmVkIGxvbmcgdGVtcGw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gKG14c2VyX2lvY3RsX3NwZWNpYWwoY21kLCBhcmdwKSk7CisKKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNAorCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSB8fCBjbWQgPT0gTU9YQV9HRVRfT1BfTU9ERSkgeworCQlpbnQgb3Btb2RlLCBwOworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBNb2RlTWFza1tdID0geyAweGZjLCAweGYzLCAweGNmLCAweDNmIH07CisJCWludCBzaGlmdGJpdDsKKwkJdW5zaWduZWQgY2hhciB2YWwsIG1hc2s7CisKKwkJcCA9IGluZm8tPnBvcnQgJSA0OworCQlpZiAoY21kID09IE1PWEFfU0VUX09QX01PREUpIHsKKwkJCWlmIChnZXRfdXNlcihvcG1vZGUsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKG9wbW9kZSAhPSBSUzIzMl9NT0RFICYmIG9wbW9kZSAhPSBSUzQ4NV8yV0lSRV9NT0RFICYmIG9wbW9kZSAhPSBSUzQyMl9NT0RFICYmIG9wbW9kZSAhPSBSUzQ4NV80V0lSRV9NT0RFKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbWFzayA9IE1vZGVNYXNrW3BdOworCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCXZhbCA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKTsKKwkJCXZhbCAmPSBtYXNrOworCQkJdmFsIHw9IChvcG1vZGUgPDwgc2hpZnRiaXQpOworCQkJb3V0Yih2YWwsIGluZm8tPm9wbW9kZV9pb2FkZHIpOworCQl9IGVsc2UgeworCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCW9wbW9kZSA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKSA+PiBzaGlmdGJpdDsKKwkJCW9wbW9kZSAmPSBPUF9NT0RFX01BU0s7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZvcG1vZGUsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNAorCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkJcmV0dXJuICgtRUlPKTsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRDU0JSSzoJCS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJaWYgKCFhcmcpCisJCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIEhaIC8gNCk7CS8qIDEvNCBzZWNvbmQgKi8KKwkJcmV0dXJuICgwKTsKKwljYXNlIFRDU0JSS1A6CQkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiAocmV0dmFsKTsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyAqIChIWiAvIDEwKSA6IEhaIC8gNCk7CisJCXJldHVybiAoMCk7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKGdldF91c2VyKHRlbXBsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYXJnID0gdGVtcGw7CisJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfCAoYXJnID8gQ0xPQ0FMIDogMCkpOworCQlyZXR1cm4gKDApOworCWNhc2UgVElPQ0dTRVJJQUw6CisJCXJldHVybiBteHNlcl9nZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0dXJuIG14c2VyX3NldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKwljYXNlIFRJT0NTRVJHRVRMU1I6CS8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworCQlyZXR1cm4gbXhzZXJfZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOworCQkvKgorCQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCisJCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAorCQkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKKwkJICovCisJY2FzZSBUSU9DTUlXQUlUOnsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJaW50IHJldDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJY3ByZXYgPSBpbmZvLT5pY291bnQ7CS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJCQlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQsICZ3YWl0KTsKKwkJCXdoaWxlICgxKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQkJY25vdyA9IGluZm8tPmljb3VudDsJLyogYXRvbWljIGNvcHkgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fCAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8ICgoYXJnICYgVElPQ01fQ0QpICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fCAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7CisJCQkJCXJldCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNwcmV2ID0gY25vdzsKKwkJCX0KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBOT1RSRUFDSEVEICovCisJCS8qCisJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAorCQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCQkgKi8KKwljYXNlIFRJT0NHSUNPVU5UOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcF9jdXNlciA9IGFyZ3A7CisJCS8qIG1vZGlmaWVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwkJaWYgKHB1dF91c2VyKGNub3cuZnJhbWUsICZwX2N1c2VyLT5mcmFtZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNub3cuYnJrLCAmcF9jdXNlci0+YnJrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNub3cucGFyaXR5LCAmcF9jdXNlci0+cGFyaXR5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5yeCwgJnBfY3VzZXItPnJ4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy50eCwgJnBfY3VzZXItPnR4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cyk7CisJCXB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKKwkJcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCk7CisKKy8qICovCisJCXJldHVybiAwOworCWNhc2UgTU9YQV9IaWdoU3BlZWRPbjoKKwkJcmV0dXJuIHB1dF91c2VyKGluZm8tPmJhdWRfYmFzZSAhPSAxMTUyMDAgPyAxIDogMCwgKGludCBfX3VzZXIgKikgYXJncCk7CisKKwljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOnsKKwkJCWluZm8tPm1vbl9kYXRhLnJ4Y250ID0gMDsKKwkJCWluZm8tPm1vbl9kYXRhLnR4Y250ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCWNhc2UgTU9YQV9BU1BQX1NFVEJBVUQ6eworCQkJbG9uZyBiYXVkOworCQkJaWYgKGdldF91c2VyKGJhdWQsIChsb25nIF9fdXNlciAqKSBhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCW14c2VyX3NldF9iYXVkKGluZm8sIGJhdWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIE1PWEFfQVNQUF9HRVRCQVVEOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5yZWFsYmF1ZCwgc2l6ZW9mKGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCisJY2FzZSBNT1hBX0FTUFBfT1FVRVVFOnsKKwkJCWludCBsZW4sIGxzcjsKKworCQkJbGVuID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHR0eSk7CisKKwkJCWxzciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVDsKKworCQkJbGVuICs9IChsc3IgPyAwIDogMSk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmxlbiwgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTU9YQV9BU1BQX01PTjp7CisJCQlpbnQgbWNyLCBzdGF0dXM7CisvLyAgICAgIGluZm8tPm1vbl9kYXRhLnNlcl9wYXJhbSA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCQkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAxLCBpbmZvLT5wb3J0LCBpbmZvKTsKKwkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCisJCQltY3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJCWlmIChtY3IgJiBNT1hBX01VU1RfTUNSX1hPTl9GTEFHKQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGSE9MRDsKKwkJCWVsc2UKKwkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGSE9MRDsKKworCQkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfVFhfWE9OKQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGWEVOVDsKKwkJCWVsc2UKKwkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGWEVOVDsKKworCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkKKwkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9DVFNIT0xEOworCQkJZWxzZQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9DVFNIT0xEOworCisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPm1vbl9kYXRhLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gMDsKKworCQl9CisKKwljYXNlIE1PWEFfQVNQUF9MU1RBVFVTOnsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPmVycl9zaGFkb3csIHNpemVvZih1bnNpZ25lZCBjaGFyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWluZm8tPmVycl9zaGFkb3cgPSAwOworCQkJcmV0dXJuIDA7CisKKwkJfQorCWNhc2UgTU9YQV9TRVRfQkFVRF9NRVRIT0Q6eworCQkJaW50IG1ldGhvZDsKKwkJCWlmIChnZXRfdXNlcihtZXRob2QsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbXhzZXJfc2V0X2JhdWRfbWV0aG9kW2luZm8tPnBvcnRdID0gbWV0aG9kOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbWV0aG9kLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgQ01TUEFSCisjZGVmaW5lCUNNU1BBUiAwMTAwMDAwMDAwMDAKKyNlbmRpZgorCitzdGF0aWMgaW50IG14c2VyX2lvY3RsX3NwZWNpYWwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJaW50IGksIHJlc3VsdCwgc3RhdHVzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1PWEFfR0VUX0NPTkY6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbXhzZXJjZmcsIHNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSAqIDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9HRVRfTUFKT1I6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnR0eW1ham9yLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE1PWEFfR0VUX0NVTUFKT1I6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNhbGxvdXRtYWpvciwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBNT1hBX0NIS1BPUlRFTkFCTEU6CisJCXJlc3VsdCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9QT1JUUzsgaSsrKSB7CisJCQlpZiAobXh2YXJfdGFibGVbaV0uYmFzZSkKKwkJCQlyZXN1bHQgfD0gKDEgPDwgaSk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCWNhc2UgTU9YQV9HRVREQVRBQ09VTlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm14dmFyX2xvZywgc2l6ZW9mKG14dmFyX2xvZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0dFVE1TVEFUVVM6CisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9QT1JUUzsgaSsrKSB7CisJCQlHTVN0YXR1c1tpXS5yaSA9IDA7CisJCQlpZiAoIW14dmFyX3RhYmxlW2ldLmJhc2UpIHsKKwkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCQkJCUdNU3RhdHVzW2ldLmRzciA9IDA7CisJCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFteHZhcl90YWJsZVtpXS50dHkgfHwgIW14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcykKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG14dmFyX3RhYmxlW2ldLm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7CisJCQllbHNlCisJCQkJR01TdGF0dXNbaV0uY2ZsYWcgPSBteHZhcl90YWJsZVtpXS50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkJCXN0YXR1cyA9IGluYihteHZhcl90YWJsZVtpXS5iYXNlICsgVUFSVF9NU1IpOworCQkJaWYgKHN0YXR1cyAmIDB4ODAgLypVQVJUX01TUl9EQ0QgKi8gKQorCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7CisJCQllbHNlCisJCQkJR01TdGF0dXNbaV0uZGNkID0gMDsKKworCQkJaWYgKHN0YXR1cyAmIDB4MjAgLypVQVJUX01TUl9EU1IgKi8gKQorCQkJCUdNU3RhdHVzW2ldLmRzciA9IDE7CisJCQllbHNlCisJCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKworCisJCQlpZiAoc3RhdHVzICYgMHgxMCAvKlVBUlRfTVNSX0NUUyAqLyApCisJCQkJR01TdGF0dXNbaV0uY3RzID0gMTsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgR01TdGF0dXMsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbXN0YXR1cykgKiBNWFNFUl9QT1JUUykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBNT1hBX0FTUFBfTU9OX0VYVDp7CisJCQlpbnQgc3RhdHVzOworCQkJaW50IG9wbW9kZSwgcDsKKwkJCWludCBzaGlmdGJpdDsKKwkJCXVuc2lnbmVkIGNmbGFnLCBpZmxhZzsKKworCQkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKKworCQkJCWlmICghbXh2YXJfdGFibGVbaV0uYmFzZSkKKwkJCQkJY29udGludWU7CisKKwkJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKG14dmFyX3RhYmxlW2ldLmJhc2UsIDAsIGksICYobXh2YXJfdGFibGVbaV0pKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cygmbXh2YXJfdGFibGVbaV0sIHN0YXR1cyk7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5ybmcrKzsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJCQkJbXh2YXJfdGFibGVbaV0uaWNvdW50LmRzcisrOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQkJCQlteHZhcl90YWJsZVtpXS5pY291bnQuZGNkKys7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5jdHMrKzsKKworCQkJCW14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKKwkJCQltb25fZGF0YV9leHQucnhfY250W2ldID0gbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEucnhjbnQ7CisJCQkJbW9uX2RhdGFfZXh0LnR4X2NudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnR4Y250OworCQkJCW1vbl9kYXRhX2V4dC51cF9yeGNudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnVwX3J4Y250OworCQkJCW1vbl9kYXRhX2V4dC51cF90eGNudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnVwX3R4Y250OworCQkJCW1vbl9kYXRhX2V4dC5tb2RlbV9zdGF0dXNbaV0gPSBteHZhcl90YWJsZVtpXS5tb25fZGF0YS5tb2RlbV9zdGF0dXM7CisJCQkJbW9uX2RhdGFfZXh0LmJhdWRyYXRlW2ldID0gbXh2YXJfdGFibGVbaV0ucmVhbGJhdWQ7CisKKwkJCQlpZiAoIW14dmFyX3RhYmxlW2ldLnR0eSB8fCAhbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zKSB7CisJCQkJCWNmbGFnID0gbXh2YXJfdGFibGVbaV0ubm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCQkJaWZsYWcgPSBteHZhcl90YWJsZVtpXS5ub3JtYWxfdGVybWlvcy5jX2lmbGFnOworCQkJCX0gZWxzZSB7CisJCQkJCWNmbGFnID0gbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQkJCQlpZmxhZyA9IG14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQl9CisKKwkJCQltb25fZGF0YV9leHQuZGF0YWJpdHNbaV0gPSBjZmxhZyAmIENTSVpFOworCisJCQkJbW9uX2RhdGFfZXh0LnN0b3BiaXRzW2ldID0gY2ZsYWcgJiBDU1RPUEI7CisKKwkJCQltb25fZGF0YV9leHQucGFyaXR5W2ldID0gY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKKworCQkJCW1vbl9kYXRhX2V4dC5mbG93Y3RybFtpXSA9IDB4MDA7CisKKwkJCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwMzsKKworCQkJCWlmIChpZmxhZyAmIChJWE9OIHwgSVhPRkYpKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwQzsKKworCQkJCWlmIChteHZhcl90YWJsZVtpXS50eXBlID09IFBPUlRfMTY1NTBBKQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDE7CisJCQkJZWxzZQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDA7CisKKwkJCQlwID0gaSAlIDQ7CisJCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCQlvcG1vZGUgPSBpbmIobXh2YXJfdGFibGVbaV0ub3Btb2RlX2lvYWRkcikgPj4gc2hpZnRiaXQ7CisJCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKKworCQkJCW1vbl9kYXRhX2V4dC5pZnR5cGVbaV0gPSBvcG1vZGU7CisKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1vbl9kYXRhX2V4dCwgc2l6ZW9mKHN0cnVjdCBteHNlcl9tb25fZXh0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9zdG9wcngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWluZm8tPmxkaXNjX3N0b3BfcnggPSAxOworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKworCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisJCQkvLyAgICAgIG91dGIoaW5mby0+SUVSLCAwKTsgLy8gbWFzayBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCW91dGIoMCwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQl9CQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJfQorCisJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0cngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMDsKKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlmIChpbmZvLT54X2NoYXIpCisJCQlpbmZvLT54X2NoYXIgPSAwOworCQllbHNlIHsKKwkJCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOworCisJCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7CisJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQl9IGVsc2UgeworCQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkJCWluZm8tPnhfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKKwkJCQkvLyAgICAgICAgICBvdXRiKGluZm8tPklFUiwgMCk7IC8vIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJfQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCQl9CisJfQorCisJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCX0KK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwgdGhhdAorICogaW5jb21pbmcgY2hhcmFjdGVycyBzaG91bGQgYmUgdGhyb3R0bGVkLgorICovCitzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8vc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJbXhzZXJfc3RvcHJ4KHR0eSk7CisJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8vc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJbXhzZXJfc3RhcnRyeCh0dHkpOworCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpIHx8IChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpICE9IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpIHsKKworCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOworCisJCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJbXhzZXJfc3RhcnQodHR5KTsKKwkJfQorCX0KKworLyogSGFuZGxlIHN3IHN0b3BwZWQgKi8KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikgJiYgISh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSkgeworCQl0dHktPnN0b3BwZWQgPSAwOworCisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisKKwkJbXhzZXJfc3RhcnQodHR5KTsKKwl9Cit9CisKKy8qCisgKiBteHNlcl9zdG9wKCkgYW5kIG14c2VyX3N0YXJ0KCkKKyAqCisgKiBUaGlzIHJvdXRpbmVzIGFyZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgb3IgcmVzZXR0aW5nIHR0eS0+c3RvcHBlZC4KKyAqIFRoZXkgZW5hYmxlIG9yIGRpc2FibGUgdHJhbnNtaXR0ZXIgaW50ZXJydXB0cywgYXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgdm9pZCBteHNlcl9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSB7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIG14c2VyX3dhaXRfdW50aWxfc2VudCgpIC0tLSB3YWl0IHVudGlsIHRoZSB0cmFuc21pdHRlciBpcyBlbXB0eQorICovCitzdGF0aWMgdm9pZCBteHNlcl93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKwlpbnQgbHNyOworCisJaWYgKGluZm8tPnR5cGUgPT0gUE9SVF9VTktOT1dOKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdF9maWZvX3NpemUgPT0gMCkKKwkJcmV0dXJuOwkJLyogSnVzdCBpbiBjYXNlLi4uLiAqLworCisJb3JpZ19qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIFNldCB0aGUgY2hlY2sgaW50ZXJ2YWwgdG8gYmUgMS81IG9mIHRoZSBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBzaW5nbGUgY2hhcmFjdGVyLCBhbmQgbWFrZSBpdCBhdCBsZWFzdCAxLiAgVGhlIGNoZWNrCisJICogaW50ZXJ2YWwgc2hvdWxkIGFsc28gYmUgbGVzcyB0aGFuIHRoZSB0aW1lb3V0LgorCSAqCisJICogTm90ZTogd2UgaGF2ZSB0byB1c2UgcHJldHR5IHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5CisJICogdGhlIE5JU1QtUENUUy4KKwkgKi8KKwljaGFyX3RpbWUgPSAoaW5mby0+dGltZW91dCAtIEhaIC8gNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7CisJY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKKwlpZiAoY2hhcl90aW1lID09IDApCisJCWNoYXJfdGltZSA9IDE7CisJaWYgKHRpbWVvdXQgJiYgdGltZW91dCA8IGNoYXJfdGltZSkKKwkJY2hhcl90aW1lID0gdGltZW91dDsKKwkvKgorCSAqIElmIHRoZSB0cmFuc21pdHRlciBoYXNuJ3QgY2xlYXJlZCBpbiB0d2ljZSB0aGUgYXBwcm94aW1hdGUKKwkgKiBhbW91bnQgb2YgdGltZSB0byBzZW5kIHRoZSBlbnRpcmUgRklGTywgaXQgcHJvYmFibHkgd29uJ3QKKwkgKiBldmVyIGNsZWFyLiAgVGhpcyBhc3N1bWVzIHRoZSBVQVJUIGlzbid0IGRvaW5nIGZsb3cKKwkgKiBjb250cm9sLCB3aGljaCBpcyBjdXJyZW50bHkgdGhlIGNhc2UuICBIZW5jZSwgaWYgaXQgZXZlcgorCSAqIHRha2VzIGxvbmdlciB0aGFuIGluZm8tPnRpbWVvdXQsIHRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEKKwkgKiBVQVJUIGJ1ZyBvZiBzb21lIGtpbmQuICBTbywgd2UgY2xhbXAgdGhlIHRpbWVvdXQgcGFyYW1ldGVyIGF0CisJICogMippbmZvLT50aW1lb3V0LgorCSAqLworCWlmICghdGltZW91dCB8fCB0aW1lb3V0ID4gMiAqIGluZm8tPnRpbWVvdXQpCisJCXRpbWVvdXQgPSAyICogaW5mby0+dGltZW91dDsKKyNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCisJcHJpbnRrKEtFUk5fREVCVUcgIkluIHJzX3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwgdGltZW91dCwgY2hhcl90aW1lKTsKKwlwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CisjZW5kaWYKKwl3aGlsZSAoISgobHNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikpICYgVUFSVF9MU1JfVEVNVCkpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCisJCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjaGFyX3RpbWUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLmRvbmVcbiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KKyAqLwordm9pZCBteHNlcl9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCW14c2VyX2ZsdXNoX2J1ZmZlcih0dHkpOworCW14c2VyX3NodXRkb3duKGluZm8pOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKworLy8gYWRkZWQgYnkgSmFtZXMgMDMtMTItMjAwNC4KKy8qCisgKiBteHNlcl9yc19icmVhaygpIC0tLSByb3V0aW5lIHdoaWNoIHR1cm5zIHRoZSBicmVhayBoYW5kbGluZyBvbiBvciBvZmYKKyAqLworc3RhdGljIHZvaWQgbXhzZXJfcnNfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisJZWxzZQorCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgZ2VuZXJpYyBpbnRlcnJ1cHQgcm91dGluZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHN0YXR1cywgaWlyLCBpOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm87CisJc3RydWN0IG14c2VyX3N0cnVjdCAqcG9ydDsKKwlpbnQgbWF4LCBpcnFiaXRzLCBiaXRzLCBtc3I7CisJaW50IHBhc3NfY291bnRlciA9IDA7CisJaW50IGhhbmRsZWQgPSBJUlFfTk9ORTsKKworCXBvcnQgPSBOVUxMOworCS8vc3Bpbl9sb2NrKCZnbV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgeworCQlpZiAoZGV2X2lkID09ICYobXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pKSB7CisJCQlwb3J0ID0gZGV2X2lkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpIHsKKwkJZ290byBpcnFfc3RvcDsKKwl9CisJaWYgKHBvcnQgPT0gMCkgeworCQlnb3RvIGlycV9zdG9wOworCX0KKwltYXggPSBteHNlcl9udW1wb3J0c1tteHNlcmNmZ1tpXS5ib2FyZF90eXBlIC0gMV07CisJd2hpbGUgKDEpIHsKKwkJaXJxYml0cyA9IGluYihwb3J0LT52ZWN0b3IpICYgcG9ydC0+dmVjdG9ybWFzazsKKwkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykgeworCQkJYnJlYWs7CisJCX0KKworCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisJCWZvciAoaSA9IDAsIGJpdHMgPSAxOyBpIDwgbWF4OyBpKyssIGlycWJpdHMgfD0gYml0cywgYml0cyA8PD0gMSkgeworCQkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQorCQkJCWNvbnRpbnVlOworCQkJaW5mbyA9IHBvcnQgKyBpOworCisJCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJaWlyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7CisJCQlpZiAoaWlyICYgVUFSVF9JSVJfTk9fSU5UKQorCQkJCWNvbnRpbnVlOworCQkJaWlyICY9IE1PWEFfTVVTVF9JSVJfTUFTSzsKKwkJCWlmICghaW5mby0+dHR5KSB7CisJCQkJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7CisJCQkJb3V0YigweDI3LCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCQkJCWluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJLyoKKwkJCSAgIGlmICggaW5mby0+dHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRS80ICl7CisJCQkgICBpbmZvLT5JRVIgfD0gTU9YQV9NVVNUX1JFQ1ZfSVNSOworCQkJICAgb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkgICB9CisJCQkgKi8KKworCisJCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJICAgaWYgKCAhaW5mby0+dHR5IHx8CisJCQkgICAoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9OT19JTlQpICkKKwkJCSAgIGNvbnRpbnVlOworCQkJICovCisJCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJICAgc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkJICovCisKKwkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1BFKSB7CisJCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9QQVJJVFk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRkUpIHsKKwkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0ZSQU1JTkc7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKKwkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0hXX09WRVJSVU47CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfQkkpCisJCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9CUkVBSzsKKworCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJCS8qCisJCQkJICAgaWYgKCAoc3RhdHVzICYgMHgwMikgJiYgIShzdGF0dXMgJiAweDAxKSApIHsKKwkJCQkgICBvdXRiKGluZm8tPmJhc2UrVUFSVF9GQ1IsICAweDIzKTsKKwkJCQkgICBjb250aW51ZTsKKwkJCQkgICB9CisJCQkJICovCisJCQkJaWYgKGlpciA9PSBNT1hBX01VU1RfSUlSX0dEQSB8fCBpaXIgPT0gTU9YQV9NVVNUX0lJUl9SREEgfHwgaWlyID09IE1PWEFfTVVTVF9JSVJfUlRPIHx8IGlpciA9PSBNT1hBX01VU1RfSUlSX0xTUikKKwkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhpbmZvLCAmc3RhdHVzKTsKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisKKwkJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCisJCQkJCW14c2VyX3JlY2VpdmVfY2hhcnMoaW5mbywgJnN0YXR1cyk7CisJCQl9CisJCQltc3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKKwkJCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpIHsKKwkJCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgbXNyKTsKKwkJCX0KKwkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQkJaWYgKChpaXIgPT0gMHgwMikgJiYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpKSB7CisJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKGluZm8pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKKy8qIDgtMi05OSBieSBXaWxsaWFtCisJCQkgICAgaWYgKCBpbmZvLT54X2NoYXIgfHwgKGluZm8tPnhtaXRfY250ID4gMCkgKQorKi8KKwkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMoaW5mbyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwYXNzX2NvdW50ZXIrKyA+IE1YU0VSX0lTUl9QQVNTX0xJTUlUKSB7CisJCQlicmVhazsJLyogUHJldmVudCBpbmZpbml0ZSBsb29wcyAqLworCQl9CisJfQorCisgICAgICBpcnFfc3RvcDoKKwkvL3NwaW5fdW5sb2NrKCZnbV9sb2NrKTsKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBpbnQgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCXVuc2lnbmVkIGNoYXIgY2gsIGdkbDsKKwlpbnQgaWdub3JlZCA9IDA7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgY2hhciAqY3A7CisJY2hhciAqZnA7CisJaW50IGNvdW50OworCWludCByZWN2X3Jvb207CisJaW50IG1heCA9IDI1NjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlyZWN2X3Jvb20gPSB0dHktPmxkaXNjLnJlY2VpdmVfcm9vbSh0dHkpOworCWlmICgocmVjdl9yb29tID09IDApICYmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkpIHsKKwkJLy9teHNlcl90aHJvdHRsZSh0dHkpOworCQlteHNlcl9zdG9wcngodHR5KTsKKwkJLy9yZXR1cm47CisJfQorCisJY3AgPSB0dHktPmZsaXAuY2hhcl9idWY7CisJZnAgPSB0dHktPmZsaXAuZmxhZ19idWY7CisJY291bnQgPSAwOworCisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnICE9IE1PWEFfT1RIRVJfVUFSVCkgeworCisJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfU1BFQ0lBTCkgeworCQkJZ290byBpbnRyX29sZDsKKwkJfQorCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNAorCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEICYmICgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKSkKKwkJCWdvdG8gaW50cl9vbGQ7CisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDAyLTE0LTIwMDQKKwkJaWYgKCpzdGF0dXMgJiBNT1hBX01VU1RfTFNSX1JFUlIpCisJCQlnb3RvIGludHJfb2xkOworCisJCWdkbCA9IGluYihpbmZvLT5iYXNlICsgTU9YQV9NVVNUX0dETF9SRUdJU1RFUik7CisKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBNT1hBX01VU1RfTVUxNTBfSFdJRCkJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNAorCQkJZ2RsICY9IE1PWEFfTVVTVF9HRExfTUFTSzsKKwkJaWYgKGdkbCA+PSByZWN2X3Jvb20pIHsKKwkJCWlmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkgeworCQkJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJCQlteHNlcl9zdG9wcngodHR5KTsKKwkJCX0KKwkJCS8vcmV0dXJuOworCQl9CisJCXdoaWxlIChnZGwtLSkgeworCQkJY2ggPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOworCQkJY291bnQrKzsKKwkJCSpjcCsrID0gY2g7CisJCQkqZnArKyA9IDA7CisJCQljbnQrKzsKKwkJCS8qCisJCQkgICBpZigoY291bnQ+PUhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeD09MCkpeworCQkJICAgbXhzZXJfc3RvcHJ4KHR0eSk7CisJCQkgICBpbmZvLT5zdG9wX3J4PTE7CisJCQkgICBicmVhazsKKwkJCSAgIH0gKi8KKwkJfQorCQlnb3RvIGVuZF9pbnRyOworCX0KK2ludHJfb2xkOgorCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCWRvIHsKKwkJaWYgKG1heC0tIDwgMCkKKwkJCWJyZWFrOworCQkvKgorCQkgICBpZigoY291bnQ+PUhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeD09MCkpeworCQkgICBteHNlcl9zdG9wcngodHR5KTsKKwkJICAgaW5mby0+c3RvcF9yeD0xOworCQkgICBicmVhazsKKwkJICAgfQorCQkgKi8KKworCQljaCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7CisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgJiYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgLyomJiAhKCpzdGF0dXMmVUFSVF9MU1JfRFIpICovICkKKwkJCW91dGIoMHgyMywgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwkJKnN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmICgqc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKSB7CisJCQlpZiAoKytpZ25vcmVkID4gMTAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJY291bnQrKzsKKwkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfU1BFQ0lBTCkgeworCQkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfQkkpIHsKKwkJCQkJKmZwKysgPSBUVFlfQlJFQUs7CisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJCQkJCWluZm8tPmljb3VudC5icmsrKzsKKworLyogKi8KKwkJCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJCQkJZG9fU0FLKHR0eSk7CisJCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfUEUpIHsKKwkJCQkJKmZwKysgPSBUVFlfUEFSSVRZOworLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLworCQkJCQlpbmZvLT5pY291bnQucGFyaXR5Kys7CisvKiAqLworCQkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0ZFKSB7CisJCQkJCSpmcCsrID0gVFRZX0ZSQU1FOworLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLworCQkJCQlpbmZvLT5pY291bnQuZnJhbWUrKzsKKy8qICovCisJCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKKwkJCQkJKmZwKysgPSBUVFlfT1ZFUlJVTjsKKy8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwkJCQkJaW5mby0+aWNvdW50Lm92ZXJydW4rKzsKKy8qICovCisJCQkJfSBlbHNlCisJCQkJCSpmcCsrID0gMDsKKwkJCX0gZWxzZQorCQkJCSpmcCsrID0gMDsKKwkJCSpjcCsrID0gY2g7CisJCQljbnQrKzsKKwkJCWlmIChjbnQgPj0gcmVjdl9yb29tKSB7CisJCQkJaWYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSB7CisJCQkJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJCQkJbXhzZXJfc3RvcHJ4KHR0eSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCX0KKworCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQkJYnJlYWs7CisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkgKnN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJICovCisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCSpzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCX0gd2hpbGUgKCpzdGF0dXMgJiBVQVJUX0xTUl9EUik7CisKKyAgICAgIGVuZF9pbnRyOgkJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisJbXh2YXJfbG9nLnJ4Y250W2luZm8tPnBvcnRdICs9IGNudDsKKwlpbmZvLT5tb25fZGF0YS5yeGNudCArPSBjbnQ7CisJaW5mby0+bW9uX2RhdGEudXBfcnhjbnQgKz0gY250OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfdHJhbnNtaXRfY2hhcnMoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgY291bnQsIGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+eF9jaGFyKSB7CisJCW91dGIoaW5mby0+eF9jaGFyLCBpbmZvLT5iYXNlICsgVUFSVF9UWCk7CisJCWluZm8tPnhfY2hhciA9IDA7CisJCW14dmFyX2xvZy50eGNudFtpbmZvLT5wb3J0XSsrOworCQlpbmZvLT5tb25fZGF0YS50eGNudCsrOworCQlpbmZvLT5tb25fZGF0YS51cF90eGNudCsrOworCisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJCWluZm8tPmljb3VudC50eCsrOworLyogKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmZvLT54bWl0X2J1ZiA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGluZm8tPnhtaXRfY250IDw9IDApIHx8IGluZm8tPnR0eS0+c3RvcHBlZCB8fCAoaW5mby0+dHR5LT5od19zdG9wcGVkICYmIChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpKSB7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwljbnQgPSBpbmZvLT54bWl0X2NudDsKKwljb3VudCA9IGluZm8tPnhtaXRfZmlmb19zaXplOworCWRvIHsKKwkJb3V0YihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK10sIGluZm8tPmJhc2UgKyBVQVJUX1RYKTsKKwkJaW5mby0+eG1pdF90YWlsID0gaW5mby0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJaWYgKC0taW5mby0+eG1pdF9jbnQgPD0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwlteHZhcl9sb2cudHhjbnRbaW5mby0+cG9ydF0gKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKKworLy8gYWRkZWQgYnkgSmFtZXMgMDMtMTItMjAwNC4KKwlpbmZvLT5tb25fZGF0YS50eGNudCArPSAoY250IC0gaW5mby0+eG1pdF9jbnQpOworCWluZm8tPm1vbl9kYXRhLnVwX3R4Y250ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJaW5mby0+aWNvdW50LnR4ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CisvKiAqLworCisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJCXNldF9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7CisJfQorCWlmIChpbmZvLT54bWl0X2NudCA8PSAwKSB7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBpbnQgc3RhdHVzKQoreworCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCWluZm8tPmljb3VudC5ybmcrKzsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJaW5mby0+aWNvdW50LmRzcisrOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQlpbmZvLT5pY291bnQuZGNkKys7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCWluZm8tPmljb3VudC5jdHMrKzsKKwlpbmZvLT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgJiYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpKSB7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKKwkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgeworCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisKKwkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkJfQorCQkJCXNldF9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCk7CisJCQkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7CisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBteHNlcl9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IHJldHZhbDsKKwlpbnQgZG9fY2xvY2FsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiBteHNlcl9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlpbmZvLT5jb3VudC0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01DUikgfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIChkb19jbG9jYWwgfHwgKGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpICYgVUFSVF9NU1JfRENEKSkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCit7CisKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKCFpbmZvLT5iYXNlIHx8ICFpbmZvLT50eXBlKSB7CisJCWlmIChpbmZvLT50dHkpCisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChpbmZvLT54bWl0X2J1ZikKKwkJZnJlZV9wYWdlKHBhZ2UpOworCWVsc2UKKwkJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisJLyoKKwkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KKwkgKiAodGhleSB3aWxsIGJlIHJlZW5hYmxlZCBpbiBteHNlcl9jaGFuZ2Vfc3BlZWQoKSkKKwkgKi8KKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwllbHNlCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vIHdheSB0aGUgTFNSIGNvdWxkIHN0aWxsIGJlIDB4RkY7CisJICogaWYgaXQgaXMsIHRoZW4gYmFpbCBvdXQsIGJlY2F1c2UgdGhlcmUncyBsaWtlbHkgbm8gVUFSVAorCSAqIGhlcmUuCisJICovCisJaWYgKGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpID09IDB4ZmYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCWlmIChpbmZvLT50dHkpCisJCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZQorCQkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgorCSAqLworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7CisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCisJLyoKKwkgKiBOb3csIGluaXRpYWxpemUgdGhlIFVBUlQKKwkgKi8KKwlvdXRiKFVBUlRfTENSX1dMRU44LCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwkvKiByZXNldCBETEFCICovCisJaW5mby0+TUNSID0gVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTOworCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgaW50ZXJydXB0cworCSAqLworCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSSB8IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisvLyAgICAgIGluZm8tPklFUiA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisKKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfSUVSX0VHREFJOworCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKworCS8qCisJICogQW5kIGNsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFnYWluIGZvciBsdWNrLgorCSAqLworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7CisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCisJaWYgKGluZm8tPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKworCS8qCisJICogYW5kIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0CisJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBtYXliZSBkaXNhYmxlZCwgYW5kCisgKiBEVFIgaXMgZHJvcHBlZCBpZiB0aGUgaGFuZ3VwIG9uIGNsb3NlIHRlcm1pbyBmbGFnIGlzIG9uLgorICovCitzdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bihzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGNsZWFyIGRlbHRhX21zcl93YWl0IHF1ZXVlIHRvIGF2b2lkIG1lbSBsZWFrczogd2UgbWF5IGZyZWUgdGhlIGlycQorCSAqIGhlcmUgc28gdGhlIHF1ZXVlIG1pZ2h0IG5ldmVyIGJlIHdha2VuIHVwCisJICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkvKgorCSAqIEZyZWUgdGhlIElSUSwgaWYgbmVjZXNzYXJ5CisJICovCisJaWYgKGluZm8tPnhtaXRfYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mby0+eG1pdF9idWYpOworCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJfQorCisJaW5mby0+SUVSID0gMDsKKwlvdXRiKDB4MDAsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKQorCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOworCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCisJLyogY2xlYXIgUngvVHggRklGTydzICovCisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwllbHNlCisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCisJLyogcmVhZCBkYXRhIHBvcnQgdG8gcmVzZXQgdGhpbmdzICovCisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7CisKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCVNFVF9NT1hBX01VU1RfTk9fU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCX0KKwkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0yMy0yMDAyCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICovCitzdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjcjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwlsb25nIGJhdWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuIHJldDsKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpZiAoIShpbmZvLT5iYXNlKSkKKwkJcmV0dXJuIHJldDsKKworCisjaWZuZGVmIEI5MjE2MDAKKyNkZWZpbmUgQjkyMTYwMCAoQjQ2MDgwMCArMSkKKyNlbmRpZgorCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+cG9ydF0gPT0gMCkgeworCQlzd2l0Y2ggKGNmbGFnICYgKENCQVVEIHwgQ0JBVURFWCkpIHsKKwkJY2FzZSBCOTIxNjAwOgorCQkJYmF1ZCA9IDkyMTYwMDsKKwkJCWJyZWFrOworCQljYXNlIEI0NjA4MDA6CisJCQliYXVkID0gNDYwODAwOworCQkJYnJlYWs7CisJCWNhc2UgQjIzMDQwMDoKKwkJCWJhdWQgPSAyMzA0MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMTE1MjAwOgorCQkJYmF1ZCA9IDExNTIwMDsKKwkJCWJyZWFrOworCQljYXNlIEI1NzYwMDoKKwkJCWJhdWQgPSA1NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIEIzODQwMDoKKwkJCWJhdWQgPSAzODQwMDsKKwkJCWJyZWFrOworCQljYXNlIEIxOTIwMDoKKwkJCWJhdWQgPSAxOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIEI5NjAwOgorCQkJYmF1ZCA9IDk2MDA7CisJCQlicmVhazsKKwkJY2FzZSBCNDgwMDoKKwkJCWJhdWQgPSA0ODAwOworCQkJYnJlYWs7CisJCWNhc2UgQjI0MDA6CisJCQliYXVkID0gMjQwMDsKKwkJCWJyZWFrOworCQljYXNlIEIxODAwOgorCQkJYmF1ZCA9IDE4MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMTIwMDoKKwkJCWJhdWQgPSAxMjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjYwMDoKKwkJCWJhdWQgPSA2MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMzAwOgorCQkJYmF1ZCA9IDMwMDsKKwkJCWJyZWFrOworCQljYXNlIEIyMDA6CisJCQliYXVkID0gMjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjE1MDoKKwkJCWJhdWQgPSAxNTA7CisJCQlicmVhazsKKwkJY2FzZSBCMTM0OgorCQkJYmF1ZCA9IDEzNDsKKwkJCWJyZWFrOworCQljYXNlIEIxMTA6CisJCQliYXVkID0gMTEwOworCQkJYnJlYWs7CisJCWNhc2UgQjc1OgorCQkJYmF1ZCA9IDc1OworCQkJYnJlYWs7CisJCWNhc2UgQjUwOgorCQkJYmF1ZCA9IDUwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYXVkID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW14c2VyX3NldF9iYXVkKGluZm8sIGJhdWQpOworCX0KKworCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWN2YWwgPSAweDAwOworCQlicmVhazsKKwljYXNlIENTNjoKKwkJY3ZhbCA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQljdmFsID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBDUzg6CisJCWN2YWwgPSAweDAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljdmFsID0gMHgwMDsKKwkJYnJlYWs7CQkvKiB0b28ga2VlcCBHQ0Mgc2h1dC4uLiAqLworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpCisJCWN2YWwgfD0gMHgwNDsKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpCisJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOworCWlmICghKGNmbGFnICYgUEFST0REKSkgeworCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7CisJfQorCWlmIChjZmxhZyAmIENNU1BBUikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOworCisJaWYgKChpbmZvLT50eXBlID09IFBPUlRfODI1MCkgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjQ1MCkpIHsKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87CisJCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7CisJCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7CisJCX0gZWxzZQorCQkJZmNyID0gMDsKKwl9IGVsc2UgeworCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJZmNyIHw9IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFOworCQkJU0VUX01PWEFfTVVTVF9GSUZPX1ZBTFVFKGluZm8pOworCQl9IGVsc2UgeworCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCisJCQlzd2l0Y2ggKGluZm8tPnJ4X3RyaWdnZXIpIHsKKwkJCWNhc2UgMToKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7CisJaW5mby0+TUNSICY9IH5VQVJUX01DUl9BRkU7CisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKKwkJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0FGRTsKKwkJCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKy8qCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCXN0YXR1cyA9IGluYihiYXNlYWRkciArIFVBUlRfTVNSKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsqLworCQkJLy9teHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKworCQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKKwkJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgeworCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCQkJfQorCQkJCQlzZXRfYml0KE1YU0VSX0VWRU5UX1RYTE9XLCAmaW5mby0+ZXZlbnQpOworCQkJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKKwkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCX0KKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpIHsKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCX0gZWxzZSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0KKwlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKworCS8qCisJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCisJICovCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKKwlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKworCWlmIChJX0lHTkJSSyhpbmZvLT50dHkpKSB7CisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKKwkJLyoKKwkJICogSWYgd2UncmUgaWdub3JlIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywgaWdub3JlCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkgeworCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwkJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOworCQl9CisJfQorCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGluZm8tPmJhc2UsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CisJCVNFVF9NT1hBX01VU1RfWE9GRjFfVkFMVUUoaW5mby0+YmFzZSwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCQlpZiAoSV9JWE9OKGluZm8tPnR0eSkpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9IGVsc2UgeworCQkJRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9CisJCWlmIChJX0lYT0ZGKGluZm8tPnR0eSkpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9IGVsc2UgeworCQkJRElTQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9CisJCS8qCisJCSAgIGlmICggSV9JWEFOWShpbmZvLT50dHkpICkgeworCQkgICBpbmZvLT5NQ1IgfD0gTU9YQV9NVVNUX01DUl9YT05fQU5ZOworCQkgICBFTkFCTEVfTU9YQV9NVVNUX1hPTl9BTllfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQkgICB9IGVsc2UgeworCQkgICBpbmZvLT5NQ1IgJj0gfk1PWEFfTVVTVF9NQ1JfWE9OX0FOWTsKKwkJICAgRElTQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCSAgIH0KKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJfQorCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCisJb3V0YihmY3IsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CS8qIHNldCBmY3IgKi8KKwlvdXRiKGN2YWwsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWQoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgbG9uZyBuZXdzcGQpCit7CisJaW50IHF1b3QgPSAwOworCXVuc2lnbmVkIGNoYXIgY3ZhbDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuIHJldDsKKworCWlmICghKGluZm8tPmJhc2UpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ld3NwZCA+IGluZm8tPk1heENhblNldEJhdWRSYXRlKQorCQlyZXR1cm4gMDsKKworCWluZm8tPnJlYWxiYXVkID0gbmV3c3BkOworCWlmIChuZXdzcGQgPT0gMTM0KSB7CisJCXF1b3QgPSAoMiAqIGluZm8tPmJhdWRfYmFzZSAvIDI2OSk7CisJfSBlbHNlIGlmIChuZXdzcGQpIHsKKwkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAvIG5ld3NwZDsKKworCQlpZiAocXVvdCA9PSAwKQorCQkJcXVvdCA9IDE7CisKKwl9IGVsc2UgeworCQlxdW90ID0gMDsKKwl9CisKKwlpbmZvLT50aW1lb3V0ID0gKChpbmZvLT54bWl0X2ZpZm9fc2l6ZSAqIEhaICogMTAgKiBxdW90KSAvIGluZm8tPmJhdWRfYmFzZSk7CisJaW5mby0+dGltZW91dCArPSBIWiAvIDUwOwkvKiBBZGQgLjAyIHNlY29uZHMgb2Ygc2xvcCAqLworCisJaWYgKHF1b3QpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0RUUjsKKwkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiByZXQ7CisJfQorCisJY3ZhbCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCisJb3V0YihjdmFsIHwgVUFSVF9MQ1JfRExBQiwgaW5mby0+YmFzZSArIFVBUlRfTENSKTsJLyogc2V0IERMQUIgKi8KKworCW91dGIocXVvdCAmIDB4ZmYsIGluZm8tPmJhc2UgKyBVQVJUX0RMTCk7CS8qIExTIG9mIGRpdmlzb3IgKi8KKwlvdXRiKHF1b3QgPj4gOCwgaW5mby0+YmFzZSArIFVBUlRfRExNKTsJLyogTVMgb2YgZGl2aXNvciAqLworCW91dGIoY3ZhbCwgaW5mby0+YmFzZSArIFVBUlRfTENSKTsJLyogcmVzZXQgRExBQiAqLworCisKKwlyZXR1cm4gcmV0OworfQorCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZnJpZW5kcyBvZiBteHNlcl9pb2N0bCgpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBteHNlcl9nZXRfc2VyaWFsX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuICgtRUZBVUxUKTsKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC50eXBlID0gaW5mby0+dHlwZTsKKwl0bXAubGluZSA9IGluZm8tPnBvcnQ7CisJdG1wLnBvcnQgPSBpbmZvLT5iYXNlOworCXRtcC5pcnEgPSBpbmZvLT5pcnE7CisJdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisJdG1wLmJhdWRfYmFzZSA9IGluZm8tPmJhdWRfYmFzZTsKKwl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gaW5mby0+Y2xvc2luZ193YWl0OworCXRtcC5jdXN0b21fZGl2aXNvciA9IGluZm8tPmN1c3RvbV9kaXZpc29yOworCXRtcC5odWI2ID0gMDsKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IG14c2VyX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFuZXdfaW5mbyB8fCAhaW5mby0+YmFzZSkKKwkJcmV0dXJuICgtRUZBVUxUKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+aXJxKSB8fCAobmV3X3NlcmlhbC5wb3J0ICE9IGluZm8tPmJhc2UpIHx8IChuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9IGluZm8tPmN1c3RvbV9kaXZpc29yKSB8fCAobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSkKKwkJcmV0dXJuICgtRVBFUk0pOworCisJZmxhZ3MgPSBpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSB8fCAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwgKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAoLUVQRVJNKTsKKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8IChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KKwkJICovCisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfCAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOworCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAwOwkvLyhpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCX0KKworCS8qIGFkZGVkIGJ5IGNhc3BlciwgMy8xNy8yMDAwLCBmb3IgbW91c2UgKi8KKwlpbmZvLT50eXBlID0gbmV3X3NlcmlhbC50eXBlOworCisJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7CisKKwkvKiAqLworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWlmIChmbGFncyAhPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKKwkJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisJfQorCXJldHVybiAocmV0dmFsKTsKK30KKworLyoKKyAqIG14c2VyX2dldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQorICoJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCisgKgkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQorICoJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KKyAqLworc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSAoKHN0YXR1cyAmIFVBUlRfTFNSX1RFTVQpID8gVElPQ1NFUl9URU1UIDogMCk7CisJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHNlbmRzIGEgYnJlYWsgY2hhcmFjdGVyIG91dCB0aGUgc2VyaWFsIHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3NlbmRfYnJlYWsoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgaW50IGR1cmF0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPmJhc2UpCisJCXJldHVybjsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG14c2VyX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gKC1FTk9JT0NUTENNRCk7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gKC1FSU8pOworCisJY29udHJvbCA9IGluZm8tPk1DUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpCisJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuICgoY29udHJvbCAmIFVBUlRfTUNSX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8CisJICAgICgoY29udHJvbCAmIFVBUlRfTUNSX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8ICgoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKSB8ICgoc3RhdHVzICYgVUFSVF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7CisKKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbXhzZXJfcmVhZF9yZWdpc3RlcihpbnQsIHVuc2lnbmVkIHNob3J0ICopOworc3RhdGljIGludCBteHNlcl9wcm9ncmFtX21vZGUoaW50KTsKK3N0YXRpYyB2b2lkIG14c2VyX25vcm1hbF9tb2RlKGludCk7CisKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X0lTQV9jb25mKGludCBjYXAsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKK3sKKwlpbnQgaWQsIGksIGJpdHM7CisJdW5zaWduZWQgc2hvcnQgcmVnc1sxNl0sIGlycTsKKwl1bnNpZ25lZCBjaGFyIHNjcmF0Y2gsIHNjcmF0Y2gyOworCisJaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBNT1hBX09USEVSX1VBUlQ7CisKKwlpZCA9IG14c2VyX3JlYWRfcmVnaXN0ZXIoY2FwLCByZWdzKTsKKwlpZiAoaWQgPT0gQzE2OF9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0MxNjhfSVNBOworCQlod2NvbmYtPnBvcnRzID0gODsKKwl9IGVsc2UgaWYgKGlkID09IEMxMDRfQVNJQ19JRCkgeworCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DMTA0X0lTQTsKKwkJaHdjb25mLT5wb3J0cyA9IDQ7CisJfSBlbHNlIGlmIChpZCA9PSBDMTAyX0FTSUNfSUQpIHsKKwkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQzEwMl9JU0E7CisJCWh3Y29uZi0+cG9ydHMgPSAyOworCX0gZWxzZSBpZiAoaWQgPT0gQ0kxMzJfQVNJQ19JRCkgeworCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DSTEzMjsKKwkJaHdjb25mLT5wb3J0cyA9IDI7CisJfSBlbHNlIGlmIChpZCA9PSBDSTEzNF9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0NJMTM0OworCQlod2NvbmYtPnBvcnRzID0gNDsKKwl9IGVsc2UgaWYgKGlkID09IENJMTA0Sl9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0NJMTA0SjsKKwkJaHdjb25mLT5wb3J0cyA9IDQ7CisJfSBlbHNlCisJCXJldHVybiAoMCk7CisKKwlpcnEgPSAwOworCWlmIChod2NvbmYtPnBvcnRzID09IDIpIHsKKwkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKKwkJaWYgKGlycSAhPSAocmVnc1s5XSAmIDB4RkYwMCkpCisJCQlyZXR1cm4gKE1YU0VSX0VSUl9JUlFfQ09ORkxJVCk7CisJfSBlbHNlIGlmIChod2NvbmYtPnBvcnRzID09IDQpIHsKKwkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA4KTsKKwkJaWYgKGlycSAhPSByZWdzWzldKQorCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCX0gZWxzZSBpZiAoaHdjb25mLT5wb3J0cyA9PSA4KSB7CisJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CisJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CisJCWlycSA9IGlycSB8IChpcnEgPj4gOCk7CisJCWlmICgoaXJxICE9IHJlZ3NbOV0pIHx8IChpcnEgIT0gcmVnc1sxMF0pKQorCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCX0KKworCWlmICghaXJxKSB7CisJCXJldHVybiAoTVhTRVJfRVJSX0lSUSk7CisJfQorCWh3Y29uZi0+aXJxID0gKChpbnQpIChpcnEgJiAweEYwMDApID4+IDEyKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlod2NvbmYtPmlvYWRkcltpXSA9IChpbnQpIHJlZ3NbaSArIDFdICYgMHhGRkY4OworCWlmICgocmVnc1sxMl0gJiAweDgwKSA9PSAwKSB7CisJCXJldHVybiAoTVhTRVJfRVJSX1ZFQ1RPUik7CisJfQorCWh3Y29uZi0+dmVjdG9yID0gKGludCkgcmVnc1sxMV07CS8qIGludGVycnVwdCB2ZWN0b3IgKi8KKwlpZiAoaWQgPT0gMSkKKwkJaHdjb25mLT52ZWN0b3JfbWFzayA9IDB4MDBGRjsKKwllbHNlCisJCWh3Y29uZi0+dmVjdG9yX21hc2sgPSAweDAwMEY7CisJZm9yIChpID0gNywgYml0cyA9IDB4MDEwMDsgaSA+PSAwOyBpLS0sIGJpdHMgPDw9IDEpIHsKKwkJaWYgKHJlZ3NbMTJdICYgYml0cykgeworCQkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7CisJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gOTIxNjAwOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCisJCX0gZWxzZSB7CisJCQlod2NvbmYtPmJhdWRfYmFzZVtpXSA9IDExNTIwMDsKKwkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSAxMTUyMDA7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwkJfQorCX0KKwlzY3JhdGNoMiA9IGluYihjYXAgKyBVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpOworCW91dGIoc2NyYXRjaDIgfCBVQVJUX0xDUl9ETEFCLCBjYXAgKyBVQVJUX0xDUik7CisJb3V0YigwLCBjYXAgKyBVQVJUX0VGUik7CS8qIEVGUiBpcyB0aGUgc2FtZSBhcyBGQ1IgKi8KKwlvdXRiKHNjcmF0Y2gyLCBjYXAgKyBVQVJUX0xDUik7CisJb3V0YihVQVJUX0ZDUl9FTkFCTEVfRklGTywgY2FwICsgVUFSVF9GQ1IpOworCXNjcmF0Y2ggPSBpbmIoY2FwICsgVUFSVF9JSVIpOworCisJaWYgKHNjcmF0Y2ggJiAweEMwKQorCQlod2NvbmYtPnVhcnRfdHlwZSA9IFBPUlRfMTY1NTBBOworCWVsc2UKKwkJaHdjb25mLT51YXJ0X3R5cGUgPSBQT1JUXzE2NDUwOworCWlmIChpZCA9PSAxKQorCQlod2NvbmYtPnBvcnRzID0gODsKKwllbHNlCisJCWh3Y29uZi0+cG9ydHMgPSA0OworCXJlcXVlc3RfcmVnaW9uKGh3Y29uZi0+aW9hZGRyWzBdLCA4ICogaHdjb25mLT5wb3J0cywgIm14c2VyKElPKSIpOworCXJlcXVlc3RfcmVnaW9uKGh3Y29uZi0+dmVjdG9yLCAxLCAibXhzZXIodmVjdG9yKSIpOworCXJldHVybiAoaHdjb25mLT5wb3J0cyk7Cit9CisKKyNkZWZpbmUgQ0hJUF9TSyAJMHgwMQkvKiBTZXJpYWwgRGF0YSBDbG9jayAgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ETyAJMHgwMgkvKiBTZXJpYWwgRGF0YSBPdXRwdXQgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9DUyAJMHgwNAkvKiBTZXJpYWwgQ2hpcCBTZWxlY3QgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ESSAJMHgwOAkvKiBTZXJpYWwgRGF0YSBJbnB1dCAgaW4gRXByb20gKi8KKyNkZWZpbmUgRU5fQ0NNRCAJMHgwMDAJLyogQ2hpcCdzIGNvbW1hbmQgcmVnaXN0ZXIgICAgICovCisjZGVmaW5lIEVOMF9SU0FSTE8JMHgwMDgJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDAgICovCisjZGVmaW5lIEVOMF9SU0FSSEkJMHgwMDkJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDEgICovCisjZGVmaW5lIEVOMF9SQ05UTE8JMHgwMEEJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9SQ05USEkJMHgwMEIJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9EQ0ZHCTB4MDBFCS8qIERhdGEgY29uZmlndXJhdGlvbiByZWcgV1IgICAqLworI2RlZmluZSBFTjBfUE9SVAkweDAxMAkvKiBSY3YgbWlzc2VkIGZyYW1lIGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU5DX1BBR0UwCTB4MDAwCS8qIFNlbGVjdCBwYWdlIDAgb2YgY2hpcCByZWdpc3RlcnMgICAqLworI2RlZmluZSBFTkNfUEFHRTMJMHgwQzAJLyogU2VsZWN0IHBhZ2UgMyBvZiBjaGlwIHJlZ2lzdGVycyAgICovCitzdGF0aWMgaW50IG14c2VyX3JlYWRfcmVnaXN0ZXIoaW50IHBvcnQsIHVuc2lnbmVkIHNob3J0ICpyZWdzKQoreworCWludCBpLCBrLCB2YWx1ZSwgaWQ7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZCA9IG14c2VyX3Byb2dyYW1fbW9kZShwb3J0KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gKGlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykgeworCQlrID0gKGkgJiAweDNGKSB8IDB4MTgwOworCQlmb3IgKGogPSAweDEwMDsgaiA+IDA7IGogPj49IDEpIHsKKwkJCW91dGIoQ0hJUF9DUywgcG9ydCk7CisJCQlpZiAoayAmIGopIHsKKwkJCQlvdXRiKENISVBfQ1MgfCBDSElQX0RPLCBwb3J0KTsKKwkJCQlvdXRiKENISVBfQ1MgfCBDSElQX0RPIHwgQ0hJUF9TSywgcG9ydCk7CS8qIEE/IGJpdCBvZiByZWFkICovCisJCQl9IGVsc2UgeworCQkJCW91dGIoQ0hJUF9DUywgcG9ydCk7CisJCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9TSywgcG9ydCk7CS8qIEE/IGJpdCBvZiByZWFkICovCisJCQl9CisJCX0KKwkJKHZvaWQpIGluYihwb3J0KTsKKwkJdmFsdWUgPSAwOworCQlmb3IgKGsgPSAwLCBqID0gMHg4MDAwOyBrIDwgMTY7IGsrKywgaiA+Pj0gMSkgeworCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOworCQkJaWYgKGluYihwb3J0KSAmIENISVBfREkpCisJCQkJdmFsdWUgfD0gajsKKwkJfQorCQlyZWdzW2ldID0gdmFsdWU7CisJCW91dGIoMCwgcG9ydCk7CisJfQorCW14c2VyX25vcm1hbF9tb2RlKHBvcnQpOworCXJldHVybiAoaWQpOworfQorCitzdGF0aWMgaW50IG14c2VyX3Byb2dyYW1fbW9kZShpbnQgcG9ydCkKK3sKKwlpbnQgaWQsIGksIGosIG47CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZnbV9sb2NrKTsKKwlvdXRiKDAsIHBvcnQpOworCW91dGIoMCwgcG9ydCk7CisJb3V0YigwLCBwb3J0KTsKKwkodm9pZCkgaW5iKHBvcnQpOworCSh2b2lkKSBpbmIocG9ydCk7CisJb3V0YigwLCBwb3J0KTsKKwkodm9pZCkgaW5iKHBvcnQpOworCS8vcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2soJmdtX2xvY2spOworCisJaWQgPSBpbmIocG9ydCArIDEpICYgMHgxRjsKKwlpZiAoKGlkICE9IEMxNjhfQVNJQ19JRCkgJiYgKGlkICE9IEMxMDRfQVNJQ19JRCkgJiYgKGlkICE9IEMxMDJfQVNJQ19JRCkgJiYgKGlkICE9IENJMTMyX0FTSUNfSUQpICYmIChpZCAhPSBDSTEzNF9BU0lDX0lEKSAmJiAoaWQgIT0gQ0kxMDRKX0FTSUNfSUQpKQorCQlyZXR1cm4gKC0xKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgeworCQluID0gaW5iKHBvcnQgKyAyKTsKKwkJaWYgKG4gPT0gJ00nKSB7CisJCQlqID0gMTsKKwkJfSBlbHNlIGlmICgoaiA9PSAxKSAmJiAobiA9PSAxKSkgeworCQkJaiA9IDI7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlqID0gMDsKKwl9CisJaWYgKGogIT0gMikKKwkJaWQgPSAtMjsKKwlyZXR1cm4gKGlkKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfbm9ybWFsX21vZGUoaW50IHBvcnQpCit7CisJaW50IGksIG47CisKKwlvdXRiKDB4QTUsIHBvcnQgKyAxKTsKKwlvdXRiKDB4ODAsIHBvcnQgKyAzKTsKKwlvdXRiKDEyLCBwb3J0ICsgMCk7CS8qIDk2MDAgYnBzICovCisJb3V0YigwLCBwb3J0ICsgMSk7CisJb3V0YigweDAzLCBwb3J0ICsgMyk7CS8qIDggZGF0YSBiaXRzICovCisJb3V0YigweDEzLCBwb3J0ICsgNCk7CS8qIGxvb3AgYmFjayBtb2RlICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbiA9IGluYihwb3J0ICsgNSk7CisJCWlmICgobiAmIDB4NjEpID09IDB4NjApCisJCQlicmVhazsKKwkJaWYgKChuICYgMSkgPT0gMSkKKwkJCSh2b2lkKSBpbmIocG9ydCk7CisJfQorCW91dGIoMHgwMCwgcG9ydCArIDQpOworfQorCittb2R1bGVfaW5pdChteHNlcl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChteHNlcl9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuaCBiL2RyaXZlcnMvY2hhci9teHNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmQwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXhzZXIuaApAQCAtMCwwICsxLDQ1MCBAQAorI2lmbmRlZiBfTVhTRVJfSAorI2RlZmluZSBfTVhTRVJfSAorCisvKgorICoJU2VtaS1wdWJsaWMgY29udHJvbCBpbnRlcmZhY2VzCisgKi8KKyAKKy8qCisgKglNT1hBIGlvY3RscworICovCisKKyNkZWZpbmUgTU9YQQkJCTB4NDAwCisjZGVmaW5lIE1PWEFfR0VUREFUQUNPVU5UCShNT1hBICsgMjMpCisjZGVmaW5lCU1PWEFfR0VUX0NPTkYJCShNT1hBICsgMzUpCisjZGVmaW5lIE1PWEFfRElBR05PU0UJCShNT1hBICsgNTApCisjZGVmaW5lIE1PWEFfQ0hLUE9SVEVOQUJMRQkoTU9YQSArIDYwKQorI2RlZmluZSBNT1hBX0hpZ2hTcGVlZE9uCShNT1hBICsgNjEpCisjZGVmaW5lIE1PWEFfR0VUX01BSk9SCQkoTU9YQSArIDYzKQorI2RlZmluZSBNT1hBX0dFVF9DVU1BSk9SCShNT1hBICsgNjQpCisjZGVmaW5lIE1PWEFfR0VUTVNUQVRVUwkJKE1PWEEgKyA2NSkKKyNkZWZpbmUgTU9YQV9TRVRfT1BfTU9ERQkoTU9YQSArIDY2KQorI2RlZmluZSBNT1hBX0dFVF9PUF9NT0RFCShNT1hBICsgNjcpCisKKyNkZWZpbmUgUlMyMzJfTU9ERQkJMAorI2RlZmluZSBSUzQ4NV8yV0lSRV9NT0RFCTEKKyNkZWZpbmUgUlM0MjJfTU9ERQkJMgorI2RlZmluZSBSUzQ4NV80V0lSRV9NT0RFCTMKKyNkZWZpbmUgT1BfTU9ERV9NQVNLCQkzCisvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisKKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSAgMTI4CisKKyNkZWZpbmUgTE9fV0FURVIJIAkoVFRZX0ZMSVBCVUZfU0laRSkKKyNkZWZpbmUgSElfV0FURVIJCShUVFlfRkxJUEJVRl9TSVpFKjIqMy80KQorCisvLyBhZGRlZCBieSBKYW1lcy4gMDMtMTEtMjAwNC4KKyNkZWZpbmUgTU9YQV9TRFNfR0VUSUNPVU5URVIgIAkoTU9YQSArIDY4KQorI2RlZmluZSBNT1hBX1NEU19SU1RJQ09VTlRFUiAgCShNT1hBICsgNjkpCisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisjZGVmaW5lIE1PWEFfQVNQUF9PUVVFVUUgIAkoTU9YQSArIDcwKQorI2RlZmluZSBNT1hBX0FTUFBfU0VUQkFVRCAJKE1PWEEgKyA3MSkKKyNkZWZpbmUgTU9YQV9BU1BQX0dFVEJBVUQgCShNT1hBICsgNzIpCisjZGVmaW5lIE1PWEFfQVNQUF9NT04gICAgIAkoTU9YQSArIDczKQorI2RlZmluZSBNT1hBX0FTUFBfTFNUQVRVUyAJKE1PWEEgKyA3NCkKKyNkZWZpbmUgTU9YQV9BU1BQX01PTl9FWFQgCShNT1hBICsgNzUpCisjZGVmaW5lIE1PWEFfU0VUX0JBVURfTUVUSE9ECShNT1hBICsgNzYpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlBQSV9OT1RJRllfUEFSSVRZCTB4MDEKKyNkZWZpbmUgTlBQSV9OT1RJRllfRlJBTUlORwkweDAyCisjZGVmaW5lIE5QUElfTk9USUZZX0hXX09WRVJSVU4JMHgwNAorI2RlZmluZSBOUFBJX05PVElGWV9TV19PVkVSUlVOCTB4MDgKKyNkZWZpbmUgTlBQSV9OT1RJRllfQlJFQUsJMHgxMAorCisjZGVmaW5lIE5QUElfTk9USUZZX0NUU0hPTEQgICAgICAgICAweDAxCS8vIFR4IGhvbGQgYnkgQ1RTIGxvdworI2RlZmluZSBOUFBJX05PVElGWV9EU1JIT0xEICAgICAgICAgMHgwMgkvLyBUeCBob2xkIGJ5IERTUiBsb3cKKyNkZWZpbmUgTlBQSV9OT1RJRllfWE9GRkhPTEQgICAgICAgIDB4MDgJLy8gVHggaG9sZCBieSBYb2ZmIHJlY2VpdmVkCisjZGVmaW5lIE5QUElfTk9USUZZX1hPRkZYRU5UICAgICAgICAweDEwCS8vIFhvZmYgU2VudAorCisvL0NoZWNrSXNNb3hhTXVzdCByZXR1cm4gdmFsdWUKKyNkZWZpbmUgTU9YQV9PVEhFUl9VQVJUCQkJMHgwMAorI2RlZmluZSBNT1hBX01VU1RfTVUxNTBfSFdJRAkJMHgwMQorI2RlZmluZSBNT1hBX01VU1RfTVU4NjBfSFdJRAkJMHgwMgorCisvLyBmb2xsb3cganVzdCBmb3IgTW94YSBNdXN0IGNoaXAgZGVmaW5lLgorLy8KKy8vIHdoZW4gTENSIHJlZ2lzdGVyIChvZmZzZXQgMHgwMykgd3JpdGUgZm9sbG93aW5nIHZhbHVlLAorLy8gdGhlIE11c3QgY2hpcCB3aWxsIGVudGVyIGVuY2hhbmNlIG1vZGUuIEFuZCB3cml0ZSB2YWx1ZQorLy8gb24gRUZSIChvZmZzZXQgMHgwMikgYml0IDYsNyB0byBjaGFuZ2UgYmFuay4KKyNkZWZpbmUgTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFCTB4QkYKKworLy8gd2hlbiBlbmhhbmNlIG1vZGUgZW5hYmxlLCBhY2Nlc3Mgb24gZ2VuZXJhbCBiYW5rIHJlZ2lzdGVyCisjZGVmaW5lIE1PWEFfTVVTVF9HRExfUkVHSVNURVIJCTB4MDcKKyNkZWZpbmUgTU9YQV9NVVNUX0dETF9NQVNLCQkweDdGCisjZGVmaW5lIE1PWEFfTVVTVF9HRExfSEFTX0JBRF9EQVRBCTB4ODAKKworI2RlZmluZSBNT1hBX01VU1RfTFNSX1JFUlIJCTB4ODAJLy8gZXJyb3IgaW4gcmVjZWl2ZSBGSUZPCisvLyBlbmNoYW5jZSByZWdpc3RlciBiYW5rIHNlbGVjdCBhbmQgZW5jaGFuY2UgbW9kZSBzZXR0aW5nIHJlZ2lzdGVyCisvLyB3aGVuIExDUiByZWdpc3RlciBlcXVhbCB0byAweEJGCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfUkVHSVNURVIJCTB4MDIKKy8vIGVuY2hhbmNlIG1vZGUgZW5hYmxlCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEUJMHgxMAorLy8gZW5jaGFuY2UgcmVpc3RlciBiYW5rIHNldCAwLCAxLCAyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzAJCTB4MDAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMQkJMHg0MAorI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTksyCQkweDgwCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzMJCTB4QzAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LX01BU0sJCTB4QzAKKworLy8gc2V0IFhPTjEgdmFsdWUgcmVnaXN0ZXIsIHdoZW4gTENSPTB4QkYgYW5kIGNoYW5nZSB0byBiYW5rMAorI2RlZmluZSBNT1hBX01VU1RfWE9OMV9SRUdJU1RFUgkJMHgwNAorCisvLyBzZXQgWE9OMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT04yX1JFR0lTVEVSCQkweDA1CisKKy8vIHNldCBYT0ZGMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUgkweDA2CisKKy8vIHNldCBYT0ZGMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMl9SRUdJU1RFUgkweDA3CisKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRMX1JFR0lTVEVSCTB4MDQKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSCTB4MDUKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSCTB4MDYKKyNkZWZpbmUgTU9YQV9NVVNUX1RIUlRMX1JFR0lTVEVSCTB4MDcKKyNkZWZpbmUgTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIJCTB4MDQKKyNkZWZpbmUgTU9YQV9NVVNUX0hXSURfUkVHSVNURVIJCTB4MDUKKyNkZWZpbmUgTU9YQV9NVVNUX0VDUl9SRUdJU1RFUgkJMHgwNgorI2RlZmluZSBNT1hBX01VU1RfQ1NSX1JFR0lTVEVSCQkweDA3CisKKy8vIGdvb2QgZGF0YSBtb2RlIGVuYWJsZQorI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRQkweDIwCisvLyBvbmx5IGdvb2QgZGF0YSBwdXQgaW50byBSeEZJRk8KKyNkZWZpbmUgTU9YQV9NVVNUX0ZDUl9HREFfT05MWV9FTkFCTEUJMHgxMAorCisvLyBlbmFibGUgQ1RTIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VDVFNJCQkweDgwCisvLyBlYW5ibGUgUlRTIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VSVFNJCQkweDQwCisvLyBlbmFibGUgWG9uL1hvZmYgaW50ZXJydXB0CisjZGVmaW5lIE1PWEFfTVVTVF9JRVJfWElOVAkJMHgyMAorLy8gZW5hYmxlIEdEQSBpbnRlcnJ1cHQKKyNkZWZpbmUgTU9YQV9NVVNUX0lFUl9FR0RBSQkJMHgxMAorCisjZGVmaW5lIE1PWEFfTVVTVF9SRUNWX0lTUgkJKFVBUlRfSUVSX1JESSB8IE1PWEFfTVVTVF9JRVJfRUdEQUkpCisKKy8vIEdEQSBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX0dEQQkJMHgxQworI2RlZmluZSBNT1hBX01VU1RfSUlSX1JEQQkJMHgwNAorI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUTwkJMHgwQworI2RlZmluZSBNT1hBX01VU1RfSUlSX0xTUgkJMHgwNgorCisvLyByZWNpZXZlZCBYb24vWG9mZiBvciBzcGVjaWNhbCBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX1hTQwkJMHgxMAorCisvLyBSVFMvQ1RTIGNoYW5nZSBzdGF0ZSBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUU0NUUwkJMHgyMAorI2RlZmluZSBNT1hBX01VU1RfSUlSX01BU0sJCTB4M0UKKworI2RlZmluZSBNT1hBX01VU1RfTUNSX1hPTl9GTEFHCQkweDQwCisjZGVmaW5lIE1PWEFfTVVTVF9NQ1JfWE9OX0FOWQkJMHg4MAorI2RlZmluZSBNT1hBX01VU1RfTUNSX1RYX1hPTgkJMHgwOAorCisKKy8vIHNvZnR3YXJlIGZsb3cgY29udHJvbCBvbiBjaGlwIG1hc2sgdmFsdWUKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9NQVNLCQkweDBGCisvLyBzZW5kIFhvbjEvWG9mZjEKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEJCTB4MDgKKy8vIHNlbmQgWG9uMi9Yb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYMgkJMHgwNAorLy8gc2VuZCBYb24xLFhvbjIvWG9mZjEsWG9mZjIKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEyCQkweDBDCisvLyBkb24ndCBzZW5kIFhvbi9Yb2ZmCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTk8JCTB4MDAKKy8vIFR4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSwkweDBDCisvLyBkb24ndCByZWNlaXZlIFhvbi9Yb2ZmCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlhfTk8JCTB4MDAKKy8vIHJlY2VpdmUgWG9uMS9Yb2ZmMQorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMQkJMHgwMgorLy8gcmVjZWl2ZSBYb24yL1hvZmYyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlgyCQkweDAxCisvLyByZWNlaXZlIFhvbjEsWG9uMi9Yb2ZmMSxYb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMTIJCTB4MDMKKy8vIFJ4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSwkweDAzCisKKy8vI2RlZmluZSBNT1hBX01VU1RfTUlOX1hPRkZMSU1JVCAgICAgICAgICAgICAgIDY2CisvLyNkZWZpbmUgTU9YQV9NVVNUX01JTl9YT05MSU1JVCAgICAgICAgICAgICAgICAyMAorLy8jZGVmaW5lIElEMV9SWF9UUklHICAgICAgICAgICAgICAgICAgIDEyMAorCisKKyNkZWZpbmUgQ0hFQ0tfTU9YQV9NVVNUX1hPRkZMSU1JVChpbmZvKSB7IAlcCisJaWYgKCAoaW5mbyktPklzTW94YU11c3RDaGlwRmxhZyAmJiAJXAorCSAoaW5mbyktPkhhbmRGbG93LlhvZmZMaW1pdCA8IE1PWEFfTVVTVF9NSU5fWE9GRkxJTUlUICkgewlcCisJCShpbmZvKS0+SGFuZEZsb3cuWG9mZkxpbWl0ID0gTU9YQV9NVVNUX01JTl9YT0ZGTElNSVQ7CVwKKwkJKGluZm8pLT5IYW5kRmxvdy5Yb25MaW1pdCA9IE1PWEFfTVVTVF9NSU5fWE9OTElNSVQ7CVwKKwl9CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoYmFzZWlvKSB7IFwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0VGUkJfRU5BQkxFOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEU7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9OMV9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPTjJfVkFMVUUoYmFzZWlvLCBWYWx1ZSkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMDsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKFZhbHVlKSwgKGJhc2VpbykrTU9YQV9NVVNUX1hPTjJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjFfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMl9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUTF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUSF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVEhfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUSV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVElfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9USFJUTF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfVEhSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKy8vI2RlZmluZSBNT1hBX01VU1RfUkJSTF9WQUxVRSAgNAorI2RlZmluZSBTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGluZm8pLT5iYXNlK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoaW5mbyktPmJhc2UrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGluZm8pLT5iYXNlK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMTsJXAorCW91dGIoX19lZnIsIChpbmZvKS0+YmFzZStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2hpZ2hfd2F0ZXIpLCAoaW5mbyktPmJhc2UrTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X3RyaWdnZXIpLCAoaW5mbyktPmJhc2UrTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2xvd193YXRlciksIChpbmZvKS0+YmFzZStNT1hBX01VU1RfUkJSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGluZm8pLT5iYXNlK1VBUlRfTENSKTsJXAorfQorCisKKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX0VOVU1fVkFMVUUoYmFzZWlvLCBWYWx1ZSkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMjsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKFZhbHVlKSwgKGJhc2VpbykrTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChiYXNlaW8sIHBJZCkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMjsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJKnBJZCA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfSFdJRF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX01BU0s7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfSlVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9UWDE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfVFgxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX0pVU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfUlgxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1JYX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1JYMTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSzsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9UWF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9NQVNLOwlcCisJX19lZnIgfD0gKE1PWEFfTVVTVF9FRlJfU0ZfUlgxfE1PWEFfTVVTVF9FRlJfU0ZfVFgxKTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9YT05fQU5ZX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbWNyOwlcCisJX19vbGRtY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9NQ1IpOwlcCisJX19vbGRtY3IgfD0gTU9YQV9NVVNUX01DUl9YT05fQU5ZOwlcCisJb3V0YihfX29sZG1jciwgKGJhc2VpbykrVUFSVF9NQ1IpOwlcCit9CisKKyNkZWZpbmUgRElTQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZG1jcjsJXAorCV9fb2xkbWNyID0gaW5iKChiYXNlaW8pK1VBUlRfTUNSKTsJXAorCV9fb2xkbWNyICY9IH5NT1hBX01VU1RfTUNSX1hPTl9BTlk7CVwKKwlvdXRiKF9fb2xkbWNyLCAoYmFzZWlvKStVQVJUX01DUik7CVwKK30KKworI2RlZmluZSBSRUFEX01PWEFfTVVTVF9HREwoYmFzZWlvKQlpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0dETF9SRUdJU1RFUikKKworCisjaWZuZGVmIElOSVRfV09SSworI2RlZmluZSBJTklUX1dPUksoX3dvcmssIF9mdW5jLCBfZGF0YSl7CVwKKwlfZGF0YS0+dHF1ZXVlLnJvdXRpbmUgPSBfZnVuYztcCisJX2RhdGEtPnRxdWV1ZS5kYXRhID0gX2RhdGE7XAorCX0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX2hkbGMuYyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RiZmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL25faGRsYy5jCkBAIC0wLDAgKzEsOTc4IEBACisvKiBnZW5lcmljIEhETEMgbGluZSBkaXNjaXBsaW5lIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYnkgUGF1bCBGdWxnaHVtIHBhdWxrZkBtaWNyb2dhdGUuY29tCisgKiBmb3IgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKgorICogTWljcm9nYXRlIGFuZCBTeW5jTGluayBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIEFkYXB0ZWQgZnJvbSBwcHAuYywgd3JpdHRlbiBieSBNaWNoYWVsIENhbGxhaGFuIDxjYWxsYWhhbkBtYXRocy5veC5hYy51az4sCisgKglBbCBMb25neWVhciA8bG9uZ3llYXJAbmV0Y29tLmNvbT4sCisgKglQYXVsIE1hY2tlcnJhcyA8UGF1bC5NYWNrZXJyYXNAY3MuYW51LmVkdS5hdT4KKyAqCisgKiBPcmlnaW5hbCByZWxlYXNlIDAxLzExLzk5CisgKiAkSWQ6IG5faGRsYy5jLHYgNC44IDIwMDMvMDUvMDYgMjE6MTg6NTEgcGF1bGtmIEV4cCAkCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQorICoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHR0eSBsaW5lIGRpc2NpcGxpbmUgTl9IRExDIGZvciB1c2Ugd2l0aAorICogdHR5IGRldmljZSBkcml2ZXJzIHRoYXQgc3VwcG9ydCBiaXQtc3luY2hyb25vdXMgSERMQyBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiBBbGwgSERMQyBkYXRhIGlzIGZyYW1lIG9yaWVudGVkIHdoaWNoIG1lYW5zOgorICoKKyAqIDEuIHR0eSB3cml0ZSBjYWxscyByZXByZXNlbnQgb25lIGNvbXBsZXRlIHRyYW5zbWl0IGZyYW1lIG9mIGRhdGEKKyAqICAgIFRoZSBkZXZpY2UgZHJpdmVyIHNob3VsZCBhY2NlcHQgdGhlIGNvbXBsZXRlIGZyYW1lIG9yIG5vbmUgb2YgCisgKiAgICB0aGUgZnJhbWUgKGJ1c3kpIGluIHRoZSB3cml0ZSBtZXRob2QuIEVhY2ggd3JpdGUgY2FsbCBzaG91bGQgaGF2ZQorICogICAgYSBieXRlIGNvdW50IGluIHRoZSByYW5nZSBvZiAyLTY1NTM1IGJ5dGVzICgyIGlzIG1pbiBIRExDIGZyYW1lCisgKiAgICB3aXRoIDEgYWRkciBieXRlIGFuZCAxIGN0cmwgYnl0ZSkuIFRoZSBtYXggYnl0ZSBjb3VudCBvZiA2NTUzNQorICogICAgc2hvdWxkIGluY2x1ZGUgYW55IGNyYyBieXRlcyByZXF1aXJlZC4gRm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcKKyAqICAgIENDSVRUIENSQzMyLCA0IGNyYyBieXRlcyBhcmUgcmVxdWlyZWQsIHNvIHRoZSBtYXhpbXVtIHNpemUgZnJhbWUKKyAqICAgIHRoZSBhcHBsaWNhdGlvbiBtYXkgdHJhbnNtaXQgaXMgbGltaXRlZCB0byA2NTUzMSBieXRlcy4gRm9yIENDSVRUCisgKiAgICBDUkMxNiwgdGhlIG1heGltdW0gYXBwbGljYXRpb24gZnJhbWUgc2l6ZSB3b3VsZCBiZSA2NTUzMy4KKyAqCisgKgorICogMi4gcmVjZWl2ZSBjYWxsYmFja3MgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciByZXByZXNlbnRzCisgKiAgICBvbmUgcmVjZWl2ZWQgZnJhbWUuIFRoZSBkZXZpY2UgZHJpdmVyIHNob3VsZCBieXBhc3MKKyAqICAgIHRoZSB0dHkgZmxpcCBidWZmZXIgYW5kIGNhbGwgdGhlIGxpbmUgZGlzY2lwbGluZSByZWNlaXZlCisgKiAgICBjYWxsYmFjayBkaXJlY3RseSB0byBhdm9pZCBmcmFnbWVudGluZyBvciBjb25jYXRlbmF0aW5nCisgKiAgICBtdWx0aXBsZSBmcmFtZXMgaW50byBhIHNpbmdsZSByZWNlaXZlIGNhbGxiYWNrLgorICoKKyAqICAgIFRoZSBIRExDIGxpbmUgZGlzY2lwbGluZSBxdWV1ZXMgdGhlIHJlY2VpdmUgZnJhbWVzIGluIHNlcGFyYXRlCisgKiAgICBidWZmZXJzIHNvIGNvbXBsZXRlIHJlY2VpdmUgZnJhbWVzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUKKyAqICAgIHR0eSByZWFkIGNhbGxzLgorICoKKyAqIDMuIHR0eSByZWFkIGNhbGxzIHJldHVybnMgYW4gZW50aXJlIGZyYW1lIG9mIGRhdGEgb3Igbm90aGluZy4KKyAqICAgIAorICogNC4gYWxsIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBpcyBjb25zaWRlcmVkIHJhdy4gTm8gcHJvY2Vzc2luZworICogICAgb3IgdHJhbnNsYXRpb24gaXMgcGVyZm9ybWVkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUsIHJlZ2FyZGxlc3MKKyAqICAgIG9mIHRoZSB0dHkgZmxhZ3MKKyAqCisgKiA1LiBXaGVuIGxpbmUgZGlzY2lwbGluZSBpcyBxdWVyaWVkIGZvciB0aGUgYW1vdW50IG9mIHJlY2VpdmUKKyAqICAgIGRhdGEgYXZhaWxhYmxlIChGSU9DKSwgMCBpcyByZXR1cm5lZCBpZiBubyBkYXRhIGF2YWlsYWJsZSwKKyAqICAgIG90aGVyd2lzZSB0aGUgY291bnQgb2YgdGhlIG5leHQgYXZhaWxhYmxlIGZyYW1lIGlzIHJldHVybmVkLgorICogICAgKGluc3RlYWQgb2YgdGhlIHN1bSBvZiBhbGwgcmVjZWl2ZWQgZnJhbWUgY291bnRzKS4KKyAqCisgKiBUaGVzZSBjb252ZW50aW9ucyBhbGxvdyB0aGUgc3RhbmRhcmQgdHR5IHByb2dyYW1taW5nIGludGVyZmFjZQorICogdG8gYmUgdXNlZCBmb3Igc3luY2hyb25vdXMgSERMQyBhcHBsaWNhdGlvbnMgd2hlbiB1c2VkIHdpdGgKKyAqIHRoaXMgbGluZSBkaXNjaXBsaW5lIChvciBhbm90aGVyIGxpbmUgZGlzY2lwbGluZSB0aGF0IGlzIGZyYW1lCisgKiBvcmllbnRlZCBzdWNoIGFzIE5fUFBQKS4KKyAqCisgKiBUaGUgU3luY0xpbmsgZHJpdmVyIChzeW5jbGluay5jKSBpbXBsZW1lbnRzIGJvdGggYXN5bmNocm9ub3VzCisgKiAodXNpbmcgc3RhbmRhcmQgbGluZSBkaXNjaXBsaW5lIE5fVFRZKSBhbmQgc3luY2hyb25vdXMgSERMQworICogKHVzaW5nIE5fSERMQykgY29tbXVuaWNhdGlvbnMsIHdpdGggdGhlIGxhdHRlciB1c2luZyB0aGUgYWJvdmUKKyAqIGNvbnZlbnRpb25zLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgZG9lcyBub3QgbWFpbnRhaW4KKyAqIGFueSBzdGF0aXN0aWNzLiBUaGUgbWFpbiBwb2ludCBpcyB0byBlbmZvcmNlIHRoZSByYXcgZGF0YQorICogYW5kIGZyYW1lIG9yaWVudGF0aW9uIG9mIEhETEMgY29tbXVuaWNhdGlvbnMuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgSERMQ19NQUdJQyAweDIzOWUKKyNkZWZpbmUgSERMQ19WRVJTSU9OICIkUmV2aXNpb246IDQuOCAkIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjdW5kZWYgVkVSU0lPTgorI2RlZmluZSBWRVJTSU9OKG1ham9yLG1pbm9yLHBhdGNoKSAoKCgoKG1ham9yKTw8OCkrKG1pbm9yKSk8PDgpKyhwYXRjaCkpCisKKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiB1c2VkIGluIG5ldyB0dHkgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgkvKiB1c2VkIGluIG5ldyB0dHkgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogQnVmZmVycyBmb3IgaW5kaXZpZHVhbCBIRExDIGZyYW1lcworICovCisjZGVmaW5lIE1BWF9IRExDX0ZSQU1FX1NJWkUgNjU1MzUgCisjZGVmaW5lIERFRkFVTFRfUlhfQlVGX0NPVU5UIDEwCisjZGVmaW5lIE1BWF9SWF9CVUZfQ09VTlQgNjAKKyNkZWZpbmUgREVGQVVMVF9UWF9CVUZfQ09VTlQgMQorCitzdHJ1Y3Qgbl9oZGxjX2J1ZiB7CisJc3RydWN0IG5faGRsY19idWYgKmxpbms7CisJaW50CQkgIGNvdW50OworCWNoYXIJCSAgYnVmWzFdOworfTsKKworI2RlZmluZQlOX0hETENfQlVGX1NJWkUJKHNpemVvZihzdHJ1Y3Qgbl9oZGxjX2J1ZikgKyBtYXhmcmFtZSkKKworc3RydWN0IG5faGRsY19idWZfbGlzdCB7CisJc3RydWN0IG5faGRsY19idWYgKmhlYWQ7CisJc3RydWN0IG5faGRsY19idWYgKnRhaWw7CisJaW50CQkgIGNvdW50OworCXNwaW5sb2NrX3QJICBzcGlubG9jazsKK307CisKKy8qKgorICogc3RydWN0IG5faGRsYyAtIHBlciBkZXZpY2UgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBtYWdpYyAtIG1hZ2ljIHZhbHVlIGZvciBzdHJ1Y3R1cmUKKyAqIEBmbGFncyAtIG1pc2NlbGxhbmVvdXMgY29udHJvbCBmbGFncworICogQHR0eSAtIHB0ciB0byBUVFkgc3RydWN0dXJlCisgKiBAYmFja3VwX3R0eSAtIFRUWSB0byB1c2UgaWYgdHR5IGdldHMgY2xvc2VkCisgKiBAdGJ1c3kgLSByZWVudHJhbmN5IGZsYWcgZm9yIHR4IHdha2V1cCBjb2RlCisgKiBAd29rZV91cCAtIEZJWE1FOiBkZXNjcmliZSB0aGlzIGZpZWxkCisgKiBAdGJ1ZiAtIGN1cnJlbnRseSB0cmFuc21pdHRpbmcgdHggYnVmZmVyCisgKiBAdHhfYnVmX2xpc3QgLSBsaXN0IG9mIHBlbmRpbmcgdHJhbnNtaXQgZnJhbWUgYnVmZmVycworICogQHJ4X2J1Zl9saXN0IC0gbGlzdCBvZiByZWNlaXZlZCBmcmFtZSBidWZmZXJzCisgKiBAdHhfZnJlZV9idWZfbGlzdCAtIGxpc3QgdW51c2VkIHRyYW5zbWl0IGZyYW1lIGJ1ZmZlcnMKKyAqIEByeF9mcmVlX2J1Zl9saXN0IC0gbGlzdCB1bnVzZWQgcmVjZWl2ZWQgZnJhbWUgYnVmZmVycworICovCitzdHJ1Y3Qgbl9oZGxjIHsKKwlpbnQJCQltYWdpYzsKKwlfX3UzMgkJCWZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKmJhY2t1cF90dHk7CisJaW50CQkJdGJ1c3k7CisJaW50CQkJd29rZV91cDsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZgkqdGJ1ZjsKKwlzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0CXR4X2J1Zl9saXN0OworCXN0cnVjdCBuX2hkbGNfYnVmX2xpc3QJcnhfYnVmX2xpc3Q7CisJc3RydWN0IG5faGRsY19idWZfbGlzdAl0eF9mcmVlX2J1Zl9saXN0OworCXN0cnVjdCBuX2hkbGNfYnVmX2xpc3QJcnhfZnJlZV9idWZfbGlzdDsKK307CisKKy8qCisgKiBIRExDIGJ1ZmZlciBsaXN0IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgbl9oZGxjX2J1Zl9saXN0X2luaXQoc3RydWN0IG5faGRsY19idWZfbGlzdCAqbGlzdCk7CitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX3B1dChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0LAorCQkJICAgc3RydWN0IG5faGRsY19idWYgKmJ1Zik7CitzdGF0aWMgc3RydWN0IG5faGRsY19idWYgKm5faGRsY19idWZfZ2V0KHN0cnVjdCBuX2hkbGNfYnVmX2xpc3QgKmxpc3QpOworCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHN0cnVjdCBuX2hkbGMgKm5faGRsY19hbGxvYyAodm9pZCk7CisKKy8qIGRlYnVnIGxldmVsIGNhbiBiZSBzZXQgYnkgaW5zbW9kIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgREVCVUdfTEVWRUxfSU5GTwkxCitzdGF0aWMgaW50IGRlYnVnbGV2ZWw7CisKKy8qIG1heCBmcmFtZSBzaXplIGZvciBtZW1vcnkgYWxsb2NhdGlvbnMgKi8KK3N0YXRpYyBpbnQgbWF4ZnJhbWUgPSA0MDk2OworCisvKiBUVFkgY2FsbGJhY2tzICovCisKK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIF9fdTggX191c2VyICpidWYsIHNpemVfdCBucik7CitzdGF0aWMgc3NpemVfdCBuX2hkbGNfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdW5zaWduZWQgaW50IG5faGRsY190dHlfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgcG9sbF90YWJsZSAqd2FpdCk7CitzdGF0aWMgaW50IG5faGRsY190dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIG5faGRsY190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IG5faGRsY190dHlfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIG5faGRsY190dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCBfX3U4ICpjcCwKKwkJCSAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIG5faGRsY190dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCisjZGVmaW5lIGJzZXQocCxiKQkoKHApWyhiKSA+PiA1XSB8PSAoMSA8PCAoKGIpICYgMHgxZikpKQorCisjZGVmaW5lIHR0eTJuX2hkbGModHR5KQkoKHN0cnVjdCBuX2hkbGMgKikgKCh0dHkpLT5kaXNjX2RhdGEpKQorI2RlZmluZSBuX2hkbGMydHR5KG5faGRsYykJKChuX2hkbGMpLT50dHkpCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIG5faGRsY19sZGlzYyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm1hZ2ljCQk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQkJPSAiaGRsYyIsCisJLm9wZW4JCT0gbl9oZGxjX3R0eV9vcGVuLAorCS5jbG9zZQkJPSBuX2hkbGNfdHR5X2Nsb3NlLAorCS5yZWFkCQk9IG5faGRsY190dHlfcmVhZCwKKwkud3JpdGUJCT0gbl9oZGxjX3R0eV93cml0ZSwKKwkuaW9jdGwJCT0gbl9oZGxjX3R0eV9pb2N0bCwKKwkucG9sbAkJPSBuX2hkbGNfdHR5X3BvbGwsCisJLnJlY2VpdmVfYnVmCT0gbl9oZGxjX3R0eV9yZWNlaXZlLAorCS5yZWNlaXZlX3Jvb20JPSBuX2hkbGNfdHR5X3Jvb20sCisJLndyaXRlX3dha2V1cAk9IG5faGRsY190dHlfd2FrZXVwLAorfTsKKworLyoqCisgKiBuX2hkbGNfcmVsZWFzZSAtIHJlbGVhc2UgYW4gbl9oZGxjIHBlciBkZXZpY2UgbGluZSBkaXNjaXBsaW5lIGluZm8gc3RydWN0dXJlCisgKiBAbl9oZGxjIC0gcGVyIGRldmljZSBsaW5lIGRpc2NpcGxpbmUgaW5mbyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbl9oZGxjX3JlbGVhc2Uoc3RydWN0IG5faGRsYyAqbl9oZGxjKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBuX2hkbGMydHR5IChuX2hkbGMpOworCXN0cnVjdCBuX2hkbGNfYnVmICpidWY7CisJCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3JlbGVhc2UoKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKKwkvKiBFbnN1cmUgdGhhdCB0aGUgbl9oZGxjZCBwcm9jZXNzIGlzIG5vdCBoYW5naW5nIG9uIHNlbGVjdCgpL3BvbGwoKSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnR0eS0+cmVhZF93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZ0dHktPndyaXRlX3dhaXQpOworCisJaWYgKHR0eSAhPSBOVUxMICYmIHR0eS0+ZGlzY19kYXRhID09IG5faGRsYykKKwkJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwkvKiBCcmVhayB0aGUgdHR5LT5uX2hkbGMgbGluayAqLworCisJLyogUmVsZWFzZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXJzICovCisJZm9yKDs7KSB7CisJCWJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QpOworCQlpZiAoYnVmKSB7CisJCQlrZnJlZShidWYpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlmb3IoOzspIHsKKwkJYnVmID0gbl9oZGxjX2J1Zl9nZXQoJm5faGRsYy0+dHhfZnJlZV9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWZvcig7OykgeworCQlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT5yeF9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWZvcig7OykgeworCQlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWlmIChuX2hkbGMtPnRidWYpCisJCWtmcmVlKG5faGRsYy0+dGJ1Zik7CisJa2ZyZWUobl9oZGxjKTsKKwkKK30JLyogZW5kIG9mIG5faGRsY19yZWxlYXNlKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X2Nsb3NlIC0gbGluZSBkaXNjaXBsaW5lIGNsb3NlCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBDYWxsZWQgd2hlbiB0aGUgbGluZSBkaXNjaXBsaW5lIGlzIGNoYW5nZWQgdG8gc29tZXRoaW5nCisgKiBlbHNlLCB0aGUgdHR5IGlzIGNsb3NlZCwgb3IgdGhlIHR0eSBkZXRlY3RzIGEgaGFuZ3VwLgorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfY2xvc2UoKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKKwlpZiAobl9oZGxjICE9IE5VTEwpIHsKKwkJaWYgKG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQykgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcibl9oZGxjOiB0cnlpbmcgdG8gY2xvc2UgdW5vcGVuZWQgdHR5IVxuIik7CisJCQlyZXR1cm47CisJCX0KKyNpZiBkZWZpbmVkKFRUWV9OT19XUklURV9TUExJVCkKKwkJY2xlYXJfYml0KFRUWV9OT19XUklURV9TUExJVCwmdHR5LT5mbGFncyk7CisjZW5kaWYKKwkJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCQlpZiAodHR5ID09IG5faGRsYy0+YmFja3VwX3R0eSkKKwkJCW5faGRsYy0+YmFja3VwX3R0eSA9IE5VTEw7CisJCWlmICh0dHkgIT0gbl9oZGxjLT50dHkpCisJCQlyZXR1cm47CisJCWlmIChuX2hkbGMtPmJhY2t1cF90dHkpIHsKKwkJCW5faGRsYy0+dHR5ID0gbl9oZGxjLT5iYWNrdXBfdHR5OworCQl9IGVsc2UgeworCQkJbl9oZGxjX3JlbGVhc2UgKG5faGRsYyk7CisJCX0KKwl9CisJCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9jbG9zZSgpIHN1Y2Nlc3NcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKK30JLyogZW5kIG9mIG5faGRsY190dHlfY2xvc2UoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfb3BlbiAtIGNhbGxlZCB3aGVuIGxpbmUgZGlzY2lwbGluZSBjaGFuZ2VkIHRvIG5faGRsYworICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9vcGVuIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X29wZW4oKSBjYWxsZWQgKGRldmljZT0lcylcbiIsCisJCV9fRklMRV9fLF9fTElORV9fLAorCQl0dHktPm5hbWUpOworCQkKKwkvKiBUaGVyZSBzaG91bGQgbm90IGJlIGFuIGV4aXN0aW5nIHRhYmxlIGZvciB0aGlzIHNsb3QuICovCisJaWYgKG5faGRsYykgeworCQlwcmludGsgKEtFUk5fRVJSIm5faGRsY190dHlfb3Blbjp0dHkgYWxyZWFkeSBhc3NvY2lhdGVkIVxuIiApOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisJCisJbl9oZGxjID0gbl9oZGxjX2FsbG9jKCk7CisJaWYgKCFuX2hkbGMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAibl9oZGxjX2FsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5GSUxFOworCX0KKwkJCisJdHR5LT5kaXNjX2RhdGEgPSBuX2hkbGM7CisJbl9oZGxjLT50dHkgICAgPSB0dHk7CisJCisjaWYgZGVmaW5lZChUVFlfTk9fV1JJVEVfU1BMSVQpCisJLyogY2hhbmdlIHR0eV9pbyB3cml0ZSgpIHRvIG5vdCBzcGxpdCBsYXJnZSB3cml0ZXMgaW50byA4SyBjaHVua3MgKi8KKwlzZXRfYml0KFRUWV9OT19XUklURV9TUExJVCwmdHR5LT5mbGFncyk7CisjZW5kaWYKKwkKKwkvKiBGbHVzaCBhbnkgcGVuZGluZyBjaGFyYWN0ZXJzIGluIHRoZSBkcml2ZXIgYW5kIGRpc2NpcGxpbmUuICovCisJCisJaWYgKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKQorCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlciAodHR5KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyICh0dHkpOworCQkKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X29wZW4oKSBzdWNjZXNzXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBuX3R0eV9oZGxjX29wZW4oKSAqLworCisvKioKKyAqIG5faGRsY19zZW5kX2ZyYW1lcyAtIHNlbmQgZnJhbWVzIG9uIHBlbmRpbmcgc2VuZCBidWZmZXIgbGlzdAorICogQG5faGRsYyAtIHBvaW50ZXIgdG8gbGRpc2MgaW5zdGFuY2UgZGF0YQorICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqCisgKiBTZW5kIGZyYW1lcyBvbiBwZW5kaW5nIHNlbmQgYnVmZmVyIGxpc3QgdW50aWwgdGhlIGRyaXZlciBkb2VzIG5vdCBhY2NlcHQgYQorICogZnJhbWUgKGJ1c3kpIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFkZGluZyBhIGZyYW1lIHRvIHRoZSBzZW5kIGJ1ZmZlcgorICogbGlzdCBhbmQgYnkgdGhlIHR0eSB3YWtldXAgY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY19zZW5kX2ZyYW1lcyhzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmVnaXN0ZXIgaW50IGFjdHVhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuX2hkbGNfYnVmICp0YnVmOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3NlbmRfZnJhbWVzKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKyBjaGVja19hZ2FpbjoKKwkJCisgCXNwaW5fbG9ja19pcnFzYXZlKCZuX2hkbGMtPnR4X2J1Zl9saXN0LnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKG5faGRsYy0+dGJ1c3kpIHsKKwkJbl9oZGxjLT53b2tlX3VwID0gMTsKKyAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwluX2hkbGMtPnRidXN5ID0gMTsKKwluX2hkbGMtPndva2VfdXAgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIGdldCBjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlciBvciBnZXQgbmV3IHRyYW5zbWl0ICovCisJLyogYnVmZmVyIGZyb20gbGlzdCBvZiBwZW5kaW5nIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwkJCisJdGJ1ZiA9IG5faGRsYy0+dGJ1ZjsKKwlpZiAoIXRidWYpCisJCXRidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9idWZfbGlzdCk7CisJCQorCXdoaWxlICh0YnVmKSB7CisJCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZClzZW5kaW5nIGZyYW1lICVwLCBjb3VudD0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyx0YnVmLHRidWYtPmNvdW50KTsKKwkJCQorCQkvKiBTZW5kIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgdG8gZGV2aWNlICovCisJCXR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHRidWYtPmJ1ZiwgdGJ1Zi0+Y291bnQpOworCQkgICAgCisJCS8qIGlmIHRyYW5zbWl0IGVycm9yLCB0aHJvdyBmcmFtZSBhd2F5IGJ5ICovCisJCS8qIHByZXRlbmRpbmcgaXQgd2FzIGFjY2VwdGVkIGJ5IGRyaXZlciAqLworCQlpZiAoYWN0dWFsIDwgMCkKKwkJCWFjdHVhbCA9IHRidWYtPmNvdW50OworCQkKKwkJaWYgKGFjdHVhbCA9PSB0YnVmLT5jb3VudCkgeworCQkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQkJcHJpbnRrKCIlcyglZClmcmFtZSAlcCBjb21wbGV0ZWRcbiIsCisJCQkJCV9fRklMRV9fLF9fTElORV9fLHRidWYpOworCQkJCQkKKwkJCS8qIGZyZWUgY3VycmVudCB0cmFuc21pdCBidWZmZXIgKi8KKwkJCW5faGRsY19idWZfcHV0KCZuX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QsIHRidWYpOworCQkJCisJCQkvKiB0aGlzIHR4IGJ1ZmZlciBpcyBkb25lICovCisJCQluX2hkbGMtPnRidWYgPSBOVUxMOworCQkJCisJCQkvKiB3YWl0IHVwIHNsZWVwaW5nIHdyaXRlcnMgKi8KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwkKKwkJCS8qIGdldCBuZXh0IHBlbmRpbmcgdHJhbnNtaXQgYnVmZmVyICovCisJCQl0YnVmID0gbl9oZGxjX2J1Zl9nZXQoJm5faGRsYy0+dHhfYnVmX2xpc3QpOworCQl9IGVsc2UgeworCQkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQkJcHJpbnRrKCIlcyglZClmcmFtZSAlcCBwZW5kaW5nXG4iLAorCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyx0YnVmKTsKKwkJCQkJCisJCQkvKiBidWZmZXIgbm90IGFjY2VwdGVkIGJ5IGRyaXZlciAqLworCQkJLyogc2V0IHRoaXMgYnVmZmVyIGFzIHBlbmRpbmcgYnVmZmVyICovCisJCQluX2hkbGMtPnRidWYgPSB0YnVmOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKCF0YnVmKQorCQl0dHktPmZsYWdzICAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCisJLyogQ2xlYXIgdGhlIHJlLWVudHJ5IGZsYWcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jaywgZmxhZ3MpOworCW5faGRsYy0+dGJ1c3kgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsgCisJCisgICAgICAgIGlmIChuX2hkbGMtPndva2VfdXApCisJICBnb3RvIGNoZWNrX2FnYWluOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3NlbmRfZnJhbWVzKCkgZXhpdFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3NlbmRfZnJhbWVzKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X3dha2V1cCAtIENhbGxiYWNrIGZvciB0cmFuc21pdCB3YWtldXAKKyAqIEB0dHkJLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IGluc3RhbmNlIGRhdGEKKyAqCisgKiBDYWxsZWQgd2hlbiBsb3cgbGV2ZWwgZGV2aWNlIGRyaXZlciBjYW4gYWNjZXB0IG1vcmUgc2VuZCBkYXRhLgorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGModHR5KTsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfd2FrZXVwKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCisJaWYgKCFuX2hkbGMpCisJCXJldHVybjsKKworCWlmICh0dHkgIT0gbl9oZGxjLT50dHkpIHsKKwkJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCXJldHVybjsKKwl9CisKKwluX2hkbGNfc2VuZF9mcmFtZXMgKG5faGRsYywgdHR5KTsKKwkJCit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3dha2V1cCgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9yb29tIC0gUmV0dXJuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbGVmdCBpbiB0aGUgcmVjZWl2ZXIncyBidWZmZXIKKyAqIEB0dHkJLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IGluc3RhbmNlIGRhdGEKKyAqCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmcm9tIHR0eSBkcml2ZXIuIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIGxlZnQgaW4gdGhlCisgKiByZWNlaXZlcidzIGJ1ZmZlciB0byBkZWNpZGUgaWYgcmVtb3RlIHRyYW5zbWl0dGVyIGlzIHRvIGJlIHRocm90dGxlZC4KKyAqLworc3RhdGljIGludCBuX2hkbGNfdHR5X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X3Jvb20oKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCS8qIGFsd2F5cyByZXR1cm4gYSBsYXJnZXIgbnVtYmVyIHRvIHByZXZlbnQgKi8KKwkvKiB0aHJvdHRsaW5nIG9mIHJlbW90ZSB0cmFuc21pdHRlci4gKi8KKwlyZXR1cm4gNjU1MzY7Cit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3Jvb3QoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfcmVjZWl2ZSAtIENhbGxlZCBieSB0dHkgZHJpdmVyIHdoZW4gcmVjZWl2ZSBkYXRhIGlzIGF2YWlsYWJsZQorICogQHR0eQktIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIEBkYXRhIC0gcG9pbnRlciB0byByZWNlaXZlZCBkYXRhCisgKiBAZmxhZ3MgLSBwb2ludGVyIHRvIGZsYWdzIGZvciBkYXRhCisgKiBAY291bnQgLSBjb3VudCBvZiByZWNlaXZlZCBkYXRhIGluIGJ5dGVzCisgKgorICogQ2FsbGVkIGJ5IHR0eSBsb3cgbGV2ZWwgZHJpdmVyIHdoZW4gcmVjZWl2ZSBkYXRhIGlzIGF2YWlsYWJsZS4gRGF0YSBpcworICogaW50ZXJwcmV0ZWQgYXMgb25lIEhETEMgZnJhbWUuCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY190dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCBfX3U4ICpkYXRhLAorCQkJICAgICAgIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJcmVnaXN0ZXIgc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKwlyZWdpc3RlciBzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9yZWNlaXZlKCkgY2FsbGVkIGNvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sIGNvdW50KTsKKwkJCisJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHN0dWZmIGNvbWVzIGluIG9uIHRoZSBiYWNrdXAgdHR5ICovCisJaWYgKG5faGRsYyA9PSAwIHx8IHR0eSAhPSBuX2hkbGMtPnR0eSkKKwkJcmV0dXJuOworCQkKKwkvKiB2ZXJpZnkgbGluZSBpcyB1c2luZyBIRExDIGRpc2NpcGxpbmUgKi8KKwlpZiAobl9oZGxjLT5tYWdpYyAhPSBIRExDX01BR0lDKSB7CisJCXByaW50aygiJXMoJWQpIGxpbmUgbm90IHVzaW5nIEhETEMgZGlzY2lwbGluZVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIGNvdW50Pm1heGZyYW1lICkgeworCQlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJCXByaW50aygiJXMoJWQpIHJ4IGNvdW50Pm1heGZyYW1lc2l6ZSwgZGF0YSBkaXNjYXJkZWRcbiIsCisJCQkgICAgICAgX19GSUxFX18sX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IGEgZnJlZSBIRExDIGJ1ZmZlciAqLwkKKwlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT5yeF9mcmVlX2J1Zl9saXN0KTsKKwlpZiAoIWJ1ZikgeworCQkvKiBubyBidWZmZXJzIGluIGZyZWUgbGlzdCwgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhbm90aGVyIHJ4IGJ1ZmZlciAqLworCQkvKiB1bmxlc3MgdGhlIG1heGltdW0gY291bnQgaGFzIGJlZW4gcmVhY2hlZCAqLworCQlpZiAobl9oZGxjLT5yeF9idWZfbGlzdC5jb3VudCA8IE1BWF9SWF9CVUZfQ09VTlQpCisJCQlidWYgPSBrbWFsbG9jKE5fSERMQ19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CisJfQorCQorCWlmICghYnVmKSB7CisJCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZCkgbm8gbW9yZSByeCBidWZmZXJzLCBkYXRhIGRpc2NhcmRlZFxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisJCQorCS8qIGNvcHkgcmVjZWl2ZWQgZGF0YSB0byBIRExDIGJ1ZmZlciAqLworCW1lbWNweShidWYtPmJ1ZixkYXRhLGNvdW50KTsKKwlidWYtPmNvdW50PWNvdW50OworCisJLyogYWRkIEhETEMgYnVmZmVyIHRvIGxpc3Qgb2YgcmVjZWl2ZWQgZnJhbWVzICovCisJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+cnhfYnVmX2xpc3QsIGJ1Zik7CisJCisJLyogd2FrZSB1cCBhbnkgYmxvY2tlZCByZWFkcyBhbmQgcGVyZm9ybSBhc3luYyBzaWduYWxsaW5nICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmdHR5LT5yZWFkX3dhaXQpOworCWlmIChuX2hkbGMtPnR0eS0+ZmFzeW5jICE9IE5VTEwpCisJCWtpbGxfZmFzeW5jICgmbl9oZGxjLT50dHktPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOworCit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3JlY2VpdmUoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfcmVhZCAtIENhbGxlZCB0byByZXRyZWl2ZSBvbmUgZnJhbWUgb2YgZGF0YSAoaWYgYXZhaWxhYmxlKQorICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIEBmaWxlIC0gcG9pbnRlciB0byBvcGVuIGZpbGUgb2JqZWN0CisgKiBAYnVmIC0gcG9pbnRlciB0byByZXR1cm5lZCBkYXRhIGJ1ZmZlcgorICogQG5yIC0gc2l6ZSBvZiByZXR1cm5lZCBkYXRhIGJ1ZmZlcgorICogCQorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIG9yIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIF9fdTggX191c2VyICpidWYsIHNpemVfdCBucikKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjKHR0eSk7CisJaW50IHJldDsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqcmJ1ZjsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfcmVhZCgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorCS8qIFZhbGlkYXRlIHRoZSBwb2ludGVycyAqLworCWlmICghbl9oZGxjKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHZlcmlmeSB1c2VyIGFjY2VzcyB0byBidWZmZXIgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbnIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCVkKSBuX2hkbGNfdHR5X3JlYWQoKSBjYW4ndCB2ZXJpZnkgdXNlciAiCisJCSJidWZmZXJcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZvciAoOzspIHsKKwkJaWYgKHRlc3RfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKSkKKwkJCXJldHVybiAtRUlPOworCisJCW5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJCWlmICghbl9oZGxjIHx8IG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQyB8fAorCQkJIHR0eSAhPSBuX2hkbGMtPnR0eSkKKwkJCXJldHVybiAwOworCisJCXJidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT5yeF9idWZfbGlzdCk7CisJCWlmIChyYnVmKQorCQkJYnJlYWs7CisJCQkKKwkJLyogbm8gZGF0YSAqLworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmdHR5LT5yZWFkX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KKwkJCisJaWYgKHJidWYtPmNvdW50ID4gbnIpCisJCS8qIGZyYW1lIHRvbyBsYXJnZSBmb3IgY2FsbGVyJ3MgYnVmZmVyIChkaXNjYXJkIGZyYW1lKSAqLworCQlyZXQgPSAtRU9WRVJGTE9XOworCWVsc2UgeworCQkvKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBjYWxsZXIncyBidWZmZXIgKi8KKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJidWYtPmJ1ZiwgcmJ1Zi0+Y291bnQpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0ID0gcmJ1Zi0+Y291bnQ7CisJfQorCQorCS8qIHJldHVybiBIRExDIGJ1ZmZlciB0byBmcmVlIGxpc3QgdW5sZXNzIHRoZSBmcmVlIGxpc3QgKi8KKwkvKiBjb3VudCBoYXMgZXhjZWVkZWQgdGhlIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoIGNhc2UgdGhlICovCisJLyogYnVmZmVyIGlzIGZyZWVkIGJhY2sgdG8gdGhlIE9TIHRvIGNvbnNlcnZlIG1lbW9yeSAqLworCWlmIChuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QuY291bnQgPiBERUZBVUxUX1JYX0JVRl9DT1VOVCkKKwkJa2ZyZWUocmJ1Zik7CisJZWxzZQkKKwkJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+cnhfZnJlZV9idWZfbGlzdCxyYnVmKTsKKwkKKwlyZXR1cm4gcmV0OworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9yZWFkKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X3dyaXRlIC0gd3JpdGUgYSBzaW5nbGUgZnJhbWUgb2YgZGF0YSB0byBkZXZpY2UKKyAqIEB0dHkJLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBAZmlsZSAtIHBvaW50ZXIgdG8gZmlsZSBvYmplY3QgZGF0YQorICogQGRhdGEgLSBwb2ludGVyIHRvIHRyYW5zbWl0IGRhdGEgKG9uZSBmcmFtZSkKKyAqIEBjb3VudCAtIHNpemUgb2YgdHJhbnNtaXQgZnJhbWUgaW4gYnl0ZXMKKyAqIAkJCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAob3IgZXJyb3IgY29kZSkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJaW50IGVycm9yID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqdGJ1ZjsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfd3JpdGUoKSBjYWxsZWQgY291bnQ9JVpkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sY291bnQpOworCQkKKwkvKiBWZXJpZnkgcG9pbnRlcnMgKi8KKwlpZiAoIW5faGRsYykKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobl9oZGxjLT5tYWdpYyAhPSBIRExDX01BR0lDKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHZlcmlmeSBmcmFtZSBzaXplICovCisJaWYgKGNvdW50ID4gbWF4ZnJhbWUgKSB7CisJCWlmIChkZWJ1Z2xldmVsICYgREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJIm5faGRsY190dHlfd3JpdGU6IHRydW5jYXRpbmcgdXNlciBwYWNrZXQgIgorCQkJCSJmcm9tICVsdSB0byAlZFxuIiwgKHVuc2lnbmVkIGxvbmcpIGNvdW50LAorCQkJCW1heGZyYW1lICk7CisJCWNvdW50ID0gbWF4ZnJhbWU7CisJfQorCQorCWFkZF93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQorCS8qIEFsbG9jYXRlIHRyYW5zbWl0IGJ1ZmZlciAqLworCS8qIHNsZWVwIHVudGlsIHRyYW5zbWl0IGJ1ZmZlciBhdmFpbGFibGUgKi8JCQorCXdoaWxlICghKHRidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0KSkpIHsKKwkJc2NoZWR1bGUoKTsKKwkJCQorCQluX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCQlpZiAoIW5faGRsYyB8fCBuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMgfHwgCisJCSAgICB0dHkgIT0gbl9oZGxjLT50dHkpIHsKKwkJCXByaW50aygibl9oZGxjX3R0eV93cml0ZTogJXAgaW52YWxpZCBhZnRlciB3YWl0IVxuIiwgbl9oZGxjKTsKKwkJCWVycm9yID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCQkKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQllcnJvciA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisKKwlpZiAoIWVycm9yKSB7CQkKKwkJLyogUmV0cmlldmUgdGhlIHVzZXIncyBidWZmZXIgKi8KKwkJbWVtY3B5KHRidWYtPmJ1ZiwgZGF0YSwgY291bnQpOworCisJCS8qIFNlbmQgdGhlIGRhdGEgKi8KKwkJdGJ1Zi0+Y291bnQgPSBlcnJvciA9IGNvdW50OworCQluX2hkbGNfYnVmX3B1dCgmbl9oZGxjLT50eF9idWZfbGlzdCx0YnVmKTsKKwkJbl9oZGxjX3NlbmRfZnJhbWVzKG5faGRsYyx0dHkpOworCX0KKworCXJldHVybiBlcnJvcjsKKwkKK30JLyogZW5kIG9mIG5faGRsY190dHlfd3JpdGUoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfaW9jdGwgLSBwcm9jZXNzIElPQ1RMIHN5c3RlbSBjYWxsIGZvciB0aGUgdHR5IGRldmljZS4KKyAqIEB0dHkgLSBwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiBAZmlsZSAtIHBvaW50ZXIgdG8gb3BlbiBmaWxlIG9iamVjdCBmb3IgZGV2aWNlCisgKiBAY21kIC0gSU9DVEwgY29tbWFuZCBjb2RlCisgKiBAYXJnIC0gYXJndW1lbnQgZm9yIElPQ1RMIGNhbGwgKGNtZCBkZXBlbmRlbnQpCisgKgorICogUmV0dXJucyBjb21tYW5kIGRlcGVuZGVudCByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCWludCBlcnJvciA9IDA7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9pb2N0bCgpIGNhbGxlZCAlZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGNtZCk7CisJCQorCS8qIFZlcmlmeSB0aGUgc3RhdHVzIG9mIHRoZSBkZXZpY2UgKi8KKwlpZiAoIW5faGRsYyB8fCBuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMpCisJCXJldHVybiAtRUJBREY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRklPTlJFQUQ6CisJCS8qIHJlcG9ydCBjb3VudCBvZiByZWFkIGRhdGEgYXZhaWxhYmxlICovCisJCS8qIGluIG5leHQgYXZhaWxhYmxlIGZyYW1lIChpZiBhbnkpICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuX2hkbGMtPnJ4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKG5faGRsYy0+cnhfYnVmX2xpc3QuaGVhZCkKKwkJCWNvdW50ID0gbl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkLT5jb3VudDsKKwkJZWxzZQorCQkJY291bnQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuX2hkbGMtPnJ4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJZXJyb3IgPSBwdXRfdXNlcihjb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgVElPQ09VVFE6CisJCS8qIGdldCB0aGUgcGVuZGluZyB0eCBieXRlIGNvdW50IGluIHRoZSBkcml2ZXIgKi8KKwkJY291bnQgPSB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyID8KKwkJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgOiAwOworCQkvKiBhZGQgc2l6ZSBvZiBuZXh0IG91dHB1dCBmcmFtZSBpbiBxdWV1ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jayxmbGFncyk7CisJCWlmIChuX2hkbGMtPnR4X2J1Zl9saXN0LmhlYWQpCisJCQljb3VudCArPSBuX2hkbGMtPnR4X2J1Zl9saXN0LmhlYWQtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuX2hkbGMtPnR4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJZXJyb3IgPSBwdXRfdXNlcihjb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycm9yID0gbl90dHlfaW9jdGwgKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9pb2N0bCgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9wb2xsIC0gVFRZIGNhbGxiYWNrIGZvciBwb2xsIHN5c3RlbSBjYWxsCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICogQGZpbHAgLSBwb2ludGVyIHRvIG9wZW4gZmlsZSBvYmplY3QgZm9yIGRldmljZQorICogQHBvbGxfdGFibGUgLSB3YWl0IHF1ZXVlIGZvciBvcGVyYXRpb25zCisgKiAKKyAqIERldGVybWluZSB3aGljaCBvcGVyYXRpb25zIChyZWFkL3dyaXRlKSB3aWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGluZm8KKyAqIHRvIGNhbGxlci4KKyAqIFJldHVybnMgYSBiaXQgbWFzayBjb250YWluaW5nIGluZm8gb24gd2hpY2ggb3BzIHdpbGwgbm90IGJsb2NrLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5faGRsY190dHlfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfcG9sbCgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorCWlmIChuX2hkbGMgJiYgbl9oZGxjLT5tYWdpYyA9PSBIRExDX01BR0lDICYmIHR0eSA9PSBuX2hkbGMtPnR0eSkgeworCQkvKiBxdWV1ZSBjdXJyZW50IHByb2Nlc3MgaW50byBhbnkgd2FpdCBxdWV1ZSB0aGF0ICovCisJCS8qIG1heSBhd2FrZW4gaW4gdGhlIGZ1dHVyZSAocmVhZCBhbmQgd3JpdGUpICovCisKKwkJcG9sbF93YWl0KGZpbHAsICZ0dHktPnJlYWRfd2FpdCwgd2FpdCk7CisJCXBvbGxfd2FpdChmaWxwLCAmdHR5LT53cml0ZV93YWl0LCB3YWl0KTsKKworCQkvKiBzZXQgYml0cyBmb3Igb3BlcmF0aW9ucyB0aGF0IHdvbid0IGJsb2NrICovCisJCWlmKG5faGRsYy0+cnhfYnVmX2xpc3QuaGVhZCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsJLyogcmVhZGFibGUgKi8KKwkJaWYgKHRlc3RfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKSkKKwkJCW1hc2sgfD0gUE9MTEhVUDsKKwkJaWYodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJCW1hc2sgfD0gUE9MTEhVUDsKKwkJaWYobl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0LmhlYWQpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwkvKiB3cml0YWJsZSAqLworCX0KKwlyZXR1cm4gbWFzazsKK30JLyogZW5kIG9mIG5faGRsY190dHlfcG9sbCgpICovCisKKy8qKgorICogbl9oZGxjX2FsbG9jIC0gYWxsb2NhdGUgYW4gbl9oZGxjIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBzdHJ1Y3R1cmUgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlICVOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbl9oZGxjICpuX2hkbGNfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmOworCWludCBpOworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IGttYWxsb2Moc2l6ZW9mKCpuX2hkbGMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbl9oZGxjKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChuX2hkbGMsIDAsIHNpemVvZigqbl9oZGxjKSk7CisKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT5yeF9mcmVlX2J1Zl9saXN0KTsKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0KTsKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT5yeF9idWZfbGlzdCk7CisJbl9oZGxjX2J1Zl9saXN0X2luaXQoJm5faGRsYy0+dHhfYnVmX2xpc3QpOworCQorCS8qIGFsbG9jYXRlIGZyZWUgcnggYnVmZmVyIGxpc3QgKi8KKwlmb3IoaT0wO2k8REVGQVVMVF9SWF9CVUZfQ09VTlQ7aSsrKSB7CisJCWJ1ZiA9IGttYWxsb2MoTl9IRExDX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZikKKwkJCW5faGRsY19idWZfcHV0KCZuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QsYnVmKTsKKwkJZWxzZSBpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJCXByaW50aygiJXMoJWQpbl9oZGxjX2FsbG9jKCksIGthbGxvYygpIGZhaWxlZCBmb3IgcnggYnVmZmVyICVkXG4iLF9fRklMRV9fLF9fTElORV9fLCBpKTsKKwl9CisJCisJLyogYWxsb2NhdGUgZnJlZSB0eCBidWZmZXIgbGlzdCAqLworCWZvcihpPTA7aTxERUZBVUxUX1RYX0JVRl9DT1VOVDtpKyspIHsKKwkJYnVmID0ga21hbGxvYyhOX0hETENfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmKQorCQkJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+dHhfZnJlZV9idWZfbGlzdCxidWYpOworCQllbHNlIGlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZCluX2hkbGNfYWxsb2MoKSwga2FsbG9jKCkgZmFpbGVkIGZvciB0eCBidWZmZXIgJWRcbiIsX19GSUxFX18sX19MSU5FX18sIGkpOworCX0KKwkKKwkvKiBJbml0aWFsaXplIHRoZSBjb250cm9sIGJsb2NrICovCisJbl9oZGxjLT5tYWdpYyAgPSBIRExDX01BR0lDOworCW5faGRsYy0+ZmxhZ3MgID0gMDsKKwkKKwlyZXR1cm4gbl9oZGxjOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX2FsbG9jKCkgKi8KKworLyoqCisgKiBuX2hkbGNfYnVmX2xpc3RfaW5pdCAtIGluaXRpYWxpemUgc3BlY2lmaWVkIEhETEMgYnVmZmVyIGxpc3QKKyAqIEBsaXN0IC0gcG9pbnRlciB0byBidWZmZXIgbGlzdAorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX2xpc3RfaW5pdChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0KQoreworCW1lbXNldChsaXN0LCAwLCBzaXplb2YoKmxpc3QpKTsKKwlzcGluX2xvY2tfaW5pdCgmbGlzdC0+c3BpbmxvY2spOworfQkvKiBlbmQgb2Ygbl9oZGxjX2J1Zl9saXN0X2luaXQoKSAqLworCisvKioKKyAqIG5faGRsY19idWZfcHV0IC0gYWRkIHNwZWNpZmllZCBIRExDIGJ1ZmZlciB0byB0YWlsIG9mIHNwZWNpZmllZCBsaXN0CisgKiBAbGlzdCAtIHBvaW50ZXIgdG8gYnVmZmVyIGxpc3QKKyAqIEBidWYJLSBwb2ludGVyIHRvIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX3B1dChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0LAorCQkJICAgc3RydWN0IG5faGRsY19idWYgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5zcGlubG9jayxmbGFncyk7CisJCisJYnVmLT5saW5rPU5VTEw7CisJaWYobGlzdC0+dGFpbCkKKwkJbGlzdC0+dGFpbC0+bGluayA9IGJ1ZjsKKwllbHNlCisJCWxpc3QtPmhlYWQgPSBidWY7CisJbGlzdC0+dGFpbCA9IGJ1ZjsKKwkobGlzdC0+Y291bnQpKys7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX2J1Zl9wdXQoKSAqLworCisvKioKKyAqIG5faGRsY19idWZfZ2V0IC0gcmVtb3ZlIGFuZCByZXR1cm4gYW4gSERMQyBidWZmZXIgZnJvbSBsaXN0CisgKiBAbGlzdCAtIHBvaW50ZXIgdG8gSERMQyBidWZmZXIgbGlzdAorICogCisgKiBSZW1vdmUgYW5kIHJldHVybiBhbiBIRExDIGJ1ZmZlciBmcm9tIHRoZSBoZWFkIG9mIHRoZSBzcGVjaWZpZWQgSERMQyBidWZmZXIKKyAqIGxpc3QuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBIRExDIGJ1ZmZlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSAlTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBuX2hkbGNfYnVmKiBuX2hkbGNfYnVmX2dldChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5faGRsY19idWYgKmJ1ZjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOworCQorCWJ1ZiA9IGxpc3QtPmhlYWQ7CisJaWYgKGJ1ZikgeworCQlsaXN0LT5oZWFkID0gYnVmLT5saW5rOworCQkobGlzdC0+Y291bnQpLS07CisJfQorCWlmICghbGlzdC0+aGVhZCkKKwkJbGlzdC0+dGFpbCA9IE5VTEw7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOworCXJldHVybiBidWY7CisJCit9CS8qIGVuZCBvZiBuX2hkbGNfYnVmX2dldCgpICovCisKK3N0YXRpYyBjaGFyIGhkbGNfYmFubmVyW10gX19pbml0ZGF0YSA9CisJS0VSTl9JTkZPICJIRExDIGxpbmUgZGlzY2lwbGluZTogdmVyc2lvbiAiIEhETENfVkVSU0lPTgorCSIsIG1heGZyYW1lPSV1XG4iOworc3RhdGljIGNoYXIgaGRsY19yZWdpc3Rlcl9va1tdIF9faW5pdGRhdGEgPQorCUtFUk5fSU5GTyAiTl9IRExDIGxpbmUgZGlzY2lwbGluZSByZWdpc3RlcmVkLlxuIjsKK3N0YXRpYyBjaGFyIGhkbGNfcmVnaXN0ZXJfZmFpbFtdIF9faW5pdGRhdGEgPQorCUtFUk5fRVJSICJlcnJvciByZWdpc3RlcmluZyBsaW5lIGRpc2NpcGxpbmU6ICVkXG4iOworc3RhdGljIGNoYXIgaGRsY19pbml0X2ZhaWxbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gIk5fSERMQzogaW5pdCBmYWlsdXJlICVkXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBuX2hkbGNfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwkvKiByYW5nZSBjaGVjayBtYXhmcmFtZSBhcmcgKi8KKwlpZiAobWF4ZnJhbWUgPCA0MDk2KQorCQltYXhmcmFtZSA9IDQwOTY7CisJZWxzZSBpZiAobWF4ZnJhbWUgPiA2NTUzNSkKKwkJbWF4ZnJhbWUgPSA2NTUzNTsKKworCXByaW50ayhoZGxjX2Jhbm5lciwgbWF4ZnJhbWUpOworCisJc3RhdHVzID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fSERMQywgJm5faGRsY19sZGlzYyk7CisJaWYgKCFzdGF0dXMpCisJCXByaW50ayhoZGxjX3JlZ2lzdGVyX29rKTsKKwllbHNlCisJCXByaW50ayhoZGxjX3JlZ2lzdGVyX2ZhaWwsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoaGRsY19pbml0X2ZhaWwsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKKwkKK30JLyogZW5kIG9mIGluaXRfbW9kdWxlKCkgKi8KKworc3RhdGljIGNoYXIgaGRsY191bnJlZ2lzdGVyX29rW10gX19leGl0ZGF0YSA9CisJS0VSTl9JTkZPICJOX0hETEM6IGxpbmUgZGlzY2lwbGluZSB1bnJlZ2lzdGVyZWRcbiI7CitzdGF0aWMgY2hhciBoZGxjX3VucmVnaXN0ZXJfZmFpbFtdIF9fZXhpdGRhdGEgPQorCUtFUk5fRVJSICJOX0hETEM6IGNhbid0IHVucmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiI7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuX2hkbGNfZXhpdCh2b2lkKQoreworCS8qIFJlbGVhc2UgdHR5IHJlZ2lzdHJhdGlvbiBvZiBsaW5lIGRpc2NpcGxpbmUgKi8KKwlpbnQgc3RhdHVzID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fSERMQywgTlVMTCk7CisKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoaGRsY191bnJlZ2lzdGVyX2ZhaWwsIHN0YXR1cyk7CisJZWxzZQorCQlwcmludGsoaGRsY191bnJlZ2lzdGVyX29rKTsKK30KKworbW9kdWxlX2luaXQobl9oZGxjX2luaXQpOworbW9kdWxlX2V4aXQobl9oZGxjX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIEZ1bGdodW0gcGF1bGtmQG1pY3JvZ2F0ZS5jb20iKTsKK21vZHVsZV9wYXJhbShkZWJ1Z2xldmVsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heGZyYW1lLCBpbnQsIDApOworTU9EVUxFX0FMSUFTX0xESVNDKE5fSERMQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODgzMDczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpAQCAtMCwwICsxLDE0MTYgQEAKKy8qIHIzOTY0IGxpbmVkaXNjaXBsaW5lIGZvciBsaW51eAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgYnkgCisgKiBQaGlsaXBzIEF1dG9tYXRpb24gUHJvamVjdHMKKyAqIEthc3NlbCAoR2VybWFueSkKKyAqIGh0dHA6Ly93d3cucGFwLXBoaWxpcHMuZGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEF1dGhvcjoKKyAqIEwuIEhhYWcKKyAqCisgKiAkTG9nOiBuX3IzOTY0LmMsdiAkCisgKiBSZXZpc2lvbiAxLjEwICAyMDAxLzAzLzE4IDEzOjAyOjI0ICBkd213MgorICogRml4IHRpbWVyIHVzYWdlLCB1c2Ugc3BpbmxvY2tzIHByb3Blcmx5LgorICoKKyAqIFJldmlzaW9uIDEuOSAgMjAwMS8wMy8xOCAxMjo1MjoxNCAgZHdtdzIKKyAqIE1lcmdlIGNoYW5nZXMgaW4gMi40LjIKKyAqCisgKiBSZXZpc2lvbiAxLjggIDIwMDAvMDMvMjMgMTQ6MTQ6NTQgIGR3bXcyCisgKiBGaXggcmFjZSBpbiBzbGVlcGluZyBpbiByMzk2NF9yZWFkKCkKKyAqCisgKiBSZXZpc2lvbiAxLjcgIDE5OTkvMjgvMDggMTE6NDE6NTAgIGR3bXcyCisgKiBQb3J0IHRvIDIuMyBrZXJuZWwKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDE5OTgvMDkvMzAgMDA6NDA6NDAgIGR3bXcyCisgKiBGaXhlZCBjb21waWxhdGlvbiBvbiAyLjAueCBrZXJuZWxzCisgKiBVcGRhdGVkIHRvIG5ld2x5IHJlZ2lzdGVyZWQgdHR5LWxkaXNjIG51bWJlciA5CisgKgorICogUmV2aXNpb24gMS41ICAxOTk4LzA5LzA0IDIxOjU3OjM2ICBkd213MgorICogU2lnbmFsIGhhbmRsaW5nIGJ1ZyBmaXhlcywgcG9ydCB0byAyLjEueC4KKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTgvMDQvMDIgMjA6MjY6NTkgIGxoYWFnCisgKiBzZWxlY3QsIGJsb2NraW5nLCAuLi4KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTgvMDIvMTIgMTg6NTg6NDMgIHJvb3QKKyAqIGZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzCisgKiBjYWxjdWxhdGlvbiBvZiBjaGVja3N1bSBjaGFyYWN0ZXJzCisgKgorICogUmV2aXNpb24gMS4yICAxOTk4LzAyLzA3IDEzOjAzOjM0ICByb290CisgKiBpb2N0bCByZWFkX3RlbGVncmFtCisgKgorICogUmV2aXNpb24gMS4xICAxOTk4LzAyLzA2IDE5OjIxOjAzICByb290CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gICAvKiB1c2VkIGluIG5ldyB0dHkgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPiAgIC8qIHVzZWQgaW4gbmV3IHR0eSBkcml2ZXJzICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uX3IzOTY0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8vI2RlZmluZSBERUJVR19RVUVVRQorCisvKiBMb2cgc3VjY2Vzc2Z1bCBoYW5kc2hha2UgYW5kIHByb3RvY29sIG9wZXJhdGlvbnMgICovCisvLyNkZWZpbmUgREVCVUdfUFJPVE9fUworCisvKiBMb2cgaGFuZHNoYWtlIGFuZCBwcm90b2NvbCBlcnJvcnM6ICovCisvLyNkZWZpbmUgREVCVUdfUFJPVE9fRQorCisvKiBMb2cgTGluZWRpc2NpcGxpbmUgb3BlcmF0aW9ucyAob3BlbiwgY2xvc2UsIHJlYWQsIHdyaXRlLi4uKTogKi8KKy8vI2RlZmluZSBERUJVR19MRElTQworCisvKiBMb2cgbW9kdWxlIGFuZCBtZW1vcnkgb3BlcmF0aW9ucyAoaW5pdCwgY2xlYW51cDsga21hbGxvYywga2ZyZWUpOiAqLworLy8jZGVmaW5lIERFQlVHX01PRFVMCisKKy8qIE1hY3JvIGhlbHBlcnMgZm9yIGRlYnVnIG91dHB1dDogKi8KKyNkZWZpbmUgVFJBQ0UoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisKKyNpZmRlZiBERUJVR19NT0RVTAorI2RlZmluZSBUUkFDRV9NKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCJyMzk2NDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgVFJBQ0VfTShmbXQsIGFyZy4uLikgLyoqLworI2VuZGlmCisKKyNpZmRlZiBERUJVR19QUk9UT19TCisjZGVmaW5lIFRSQUNFX1BTKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCJyMzk2NDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgVFJBQ0VfUFMoZm10LCBhcmcuLi4pIC8qKi8KKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUFJPVE9fRQorI2RlZmluZSBUUkFDRV9QRShmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygicjM5NjQ6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmdzKTsKKyNlbHNlCisjZGVmaW5lIFRSQUNFX1BFKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworI2lmZGVmIERFQlVHX0xESVNDCisjZGVmaW5lIFRSQUNFX0woZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisjZWxzZQorI2RlZmluZSBUUkFDRV9MKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1FVRVVFCisjZGVmaW5lIFRSQUNFX1EoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisjZWxzZQorI2RlZmluZSBUUkFDRV9RKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworc3RhdGljIHZvaWQgYWRkX3R4X3F1ZXVlKHN0cnVjdCByMzk2NF9pbmZvICosIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKik7CitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV90eF9xdWV1ZShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGludCBlcnJvcl9jb2RlKTsKK3N0YXRpYyB2b2lkIHB1dF9jaGFyKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgdW5zaWduZWQgY2hhciBjaCk7CitzdGF0aWMgdm9pZCB0cmlnZ2VyX3RyYW5zbWl0KHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbyk7CitzdGF0aWMgdm9pZCByZXRyeV90cmFuc21pdChzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pOworc3RhdGljIHZvaWQgdHJhbnNtaXRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKTsKK3N0YXRpYyB2b2lkIHJlY2VpdmVfY2hhcihzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGNvbnN0IHVuc2lnbmVkIGNoYXIgYyk7CitzdGF0aWMgdm9pZCByZWNlaXZlX2Vycm9yKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgY2hhciBmbGFnKTsKK3N0YXRpYyB2b2lkIG9uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwcml2KTsKK3N0YXRpYyBpbnQgZW5hYmxlX3NpZ25hbHMoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQsIGludCBhcmcpOworc3RhdGljIGludCByZWFkX3RlbGVncmFtKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmKTsKK3N0YXRpYyB2b2lkIGFkZF9tc2coc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50LCBpbnQgbXNnX2lkLCBpbnQgYXJnLAorICAgICAgICAgICAgIGludCBlcnJvcl9jb2RlLCBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwQmxvY2spOworc3RhdGljIHN0cnVjdCByMzk2NF9tZXNzYWdlKiByZW1vdmVfbXNnKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgCisgICAgICAgICAgICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50KTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9jbGllbnRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQpOworCitzdGF0aWMgaW50ICByMzk2NF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgcjM5NjRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgc3NpemVfdCByMzk2NF9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBzc2l6ZV90IHIzOTY0X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBpbnQgcjM5NjRfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcjM5NjRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpOworc3RhdGljIHVuc2lnbmVkIGludCByMzk2NF9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAgKndhaXQpOworc3RhdGljIHZvaWQgcjM5NjRfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgIHIzOTY0X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjX05fUjM5NjQgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5tYWdpYwk9IFRUWV9MRElTQ19NQUdJQywgCisJLm5hbWUJPSAiUjM5NjQiLAorCS5vcGVuCT0gcjM5NjRfb3BlbiwKKwkuY2xvc2UJPSByMzk2NF9jbG9zZSwKKwkucmVhZAk9IHIzOTY0X3JlYWQsCisJLndyaXRlCT0gcjM5NjRfd3JpdGUsCisJLmlvY3RsCT0gcjM5NjRfaW9jdGwsCisJLnNldF90ZXJtaW9zID0gcjM5NjRfc2V0X3Rlcm1pb3MsCisJLnBvbGwJPSByMzk2NF9wb2xsLCAgICAgICAgICAgIAorCS5yZWNlaXZlX2J1ZiA9IHIzOTY0X3JlY2VpdmVfYnVmLAorCS5yZWNlaXZlX3Jvb20gPSByMzk2NF9yZWNlaXZlX3Jvb20sCit9OworCisKKworc3RhdGljIHZvaWQgZHVtcF9ibG9jayhjb25zdCB1bnNpZ25lZCBjaGFyICpibG9jaywgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgIHVuc2lnbmVkIGludCBpLGo7CisgICBjaGFyIGxpbmVidWZbMTYqMysxXTsKKyAgIAorICAgZm9yKGk9MDtpPGxlbmd0aDtpKz0xNikKKyAgIHsKKyAgICAgIGZvcihqPTA7KGo8MTYpICYmIChqK2k8bGVuZ3RoKTtqKyspCisgICAgICB7CisgICAgICAgICBzcHJpbnRmKGxpbmVidWYrMypqLCIlMDJ4ICIsYmxvY2tbaStqXSk7CisgICAgICB9CisgICAgICBsaW5lYnVmWzMqal09J1wwJzsKKyAgICAgIFRSQUNFX1BTKCIlcyIsbGluZWJ1Zik7CisgICB9Cit9CisKKyAgICAgICAgIAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEcml2ZXIgaW5pdGlhbGlzYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgc3VwcG9ydCByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCByMzk2NF9leGl0KHZvaWQpCit7CisgICBpbnQgc3RhdHVzOworICAgCisgICBUUkFDRV9NICgiY2xlYW51cF9tb2R1bGUoKSIpOworCisgICBzdGF0dXM9dHR5X3JlZ2lzdGVyX2xkaXNjKE5fUjM5NjQsIE5VTEwpOworICAgCisgICBpZihzdGF0dXMhPTApCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBlcnJvciB1bnJlZ2lzdGVyaW5nIGxpbmVkaXNjaXBsaW5lOiAlZFxuIiwgc3RhdHVzKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFRSQUNFX0woImxpbmVkaXNjaXBsaW5lIHN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQiKTsKKyAgIH0KKyAgIAorfQorCitzdGF0aWMgaW50IF9faW5pdCByMzk2NF9pbml0KHZvaWQpCit7CisgICBpbnQgc3RhdHVzOworICAgCisgICBwcmludGsgKCJyMzk2NDogUGhpbGlwcyByMzk2NCBEcml2ZXIgJFJldmlzaW9uOiAxLjEwICRcbiIpOworCisgICAvKgorICAgICogUmVnaXN0ZXIgdGhlIHR0eSBsaW5lIGRpc2NpcGxpbmUKKyAgICAqLworICAgCisgICBzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MgKE5fUjM5NjQsICZ0dHlfbGRpc2NfTl9SMzk2NCk7CisgICBpZiAoc3RhdHVzID09IDApCisgICAgIHsKKyAgICAgICBUUkFDRV9MKCJsaW5lIGRpc2NpcGxpbmUgJWQgcmVnaXN0ZXJlZCIsIE5fUjM5NjQpOworICAgICAgIFRSQUNFX0woImZsYWdzPSV4IG51bT0leCIsIHR0eV9sZGlzY19OX1IzOTY0LmZsYWdzLCAKKyAgICAgICAgICAgICAgIHR0eV9sZGlzY19OX1IzOTY0Lm51bSk7CisgICAgICAgVFJBQ0VfTCgib3Blbj0leCIsIChpbnQpdHR5X2xkaXNjX05fUjM5NjQub3Blbik7CisgICAgICAgVFJBQ0VfTCgidHR5X2xkaXNjX05fUjM5NjQgPSAleCIsIChpbnQpJnR0eV9sZGlzY19OX1IzOTY0KTsKKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgcHJpbnRrIChLRVJOX0VSUiAicjM5NjQ6IGVycm9yIHJlZ2lzdGVyaW5nIGxpbmUgZGlzY2lwbGluZTogJWRcbiIsIHN0YXR1cyk7CisgICAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK21vZHVsZV9pbml0KHIzOTY0X2luaXQpOworbW9kdWxlX2V4aXQocjM5NjRfZXhpdCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb3RvY29sIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWRkX3R4X3F1ZXVlKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlcikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBwSGVhZGVyLT5uZXh0ID0gTlVMTDsKKworICAgaWYocEluZm8tPnR4X2xhc3QgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBJbmZvLT50eF9maXJzdCA9IHBJbmZvLT50eF9sYXN0ID0gcEhlYWRlcjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBJbmZvLT50eF9sYXN0LT5uZXh0ID0gcEhlYWRlcjsKKyAgICAgIHBJbmZvLT50eF9sYXN0ID0gcEhlYWRlcjsKKyAgIH0KKyAgIAorICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgVFJBQ0VfUSgiYWRkX3R4X3F1ZXVlICV4LCBsZW5ndGggJWQsIHR4X2ZpcnN0ID0gJXgiLCAKKyAgICAgICAgICAoaW50KXBIZWFkZXIsIHBIZWFkZXItPmxlbmd0aCwgKGludClwSW5mby0+dHhfZmlyc3QgKTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2Zyb21fdHhfcXVldWUoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBpbnQgZXJyb3JfY29kZSkKK3sKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXI7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIERFQlVHX1FVRVVFCisgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwRHVtcDsKKyNlbmRpZgorICAgCisgICBwSGVhZGVyID0gcEluZm8tPnR4X2ZpcnN0OworCisgICBpZihwSGVhZGVyPT1OVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgREVCVUdfUVVFVUUKKyAgIHByaW50aygicjM5NjQ6IHJlbW92ZV9mcm9tX3R4X3F1ZXVlOiAleCwgbGVuZ3RoICVkIC0gIiwKKyAgICAgICAgICAoaW50KXBIZWFkZXIsIChpbnQpcEhlYWRlci0+bGVuZ3RoICk7CisgICBmb3IocER1bXA9cEhlYWRlcjtwRHVtcDtwRHVtcD1wRHVtcC0+bmV4dCkKKwkgcHJpbnRrKCIleCAiLCAoaW50KXBEdW1wKTsKKyAgIHByaW50aygiXG4iKTsKKyNlbmRpZgorCisKKyAgIGlmKHBIZWFkZXItPm93bmVyKQorICAgeworICAgICAgaWYoZXJyb3JfY29kZSkKKyAgICAgIHsKKyAgICAgICAgICBhZGRfbXNnKHBIZWFkZXItPm93bmVyLCBSMzk2NF9NU0dfQUNLLCAwLCAKKyAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUsIE5VTEwpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIGFkZF9tc2cocEhlYWRlci0+b3duZXIsIFIzOTY0X01TR19BQ0ssIHBIZWFkZXItPmxlbmd0aCwgCisgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnBJbmZvLT5yZWFkX3dhaXQpOworICAgfQorCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgcEluZm8tPnR4X2ZpcnN0ID0gcEhlYWRlci0+bmV4dDsKKyAgIGlmKHBJbmZvLT50eF9maXJzdD09TlVMTCkKKyAgIHsKKyAgICAgIHBJbmZvLT50eF9sYXN0ID0gTlVMTDsKKyAgIH0KKworICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAga2ZyZWUocEhlYWRlcik7CisgICBUUkFDRV9NKCJyZW1vdmVfZnJvbV90eF9xdWV1ZSAtIGtmcmVlICV4IiwoaW50KXBIZWFkZXIpOworCisgICBUUkFDRV9RKCJyZW1vdmVfZnJvbV90eF9xdWV1ZTogdHhfZmlyc3QgPSAleCwgdHhfbGFzdCA9ICV4IiwKKyAgICAgICAgICAoaW50KXBJbmZvLT50eF9maXJzdCwgKGludClwSW5mby0+dHhfbGFzdCApOworfQorCitzdGF0aWMgdm9pZCBhZGRfcnhfcXVldWUoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwSGVhZGVyKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgIHBIZWFkZXItPm5leHQgPSBOVUxMOworCisgICBpZihwSW5mby0+cnhfbGFzdCA9PSBOVUxMKQorICAgeworICAgICAgcEluZm8tPnJ4X2ZpcnN0ID0gcEluZm8tPnJ4X2xhc3QgPSBwSGVhZGVyOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcEluZm8tPnJ4X2xhc3QtPm5leHQgPSBwSGVhZGVyOworICAgICAgcEluZm8tPnJ4X2xhc3QgPSBwSGVhZGVyOworICAgfQorICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSsrOworICAgCisgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBUUkFDRV9RKCJhZGRfcnhfcXVldWU6ICV4LCBsZW5ndGggPSAlZCwgcnhfZmlyc3QgPSAleCwgY291bnQgPSAlZCIsCisgICAgICAgICAgKGludClwSGVhZGVyLCBwSGVhZGVyLT5sZW5ndGgsCisgICAgICAgICAgKGludClwSW5mby0+cnhfZmlyc3QsIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUpOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV9yeF9xdWV1ZShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sCisgICAgICAgICAgICAgICAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXIpCit7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEZpbmQ7CisgICAKKyAgIGlmKHBIZWFkZXI9PU5VTEwpCisgICAgICByZXR1cm47CisKKyAgIFRSQUNFX1EoInJlbW92ZV9mcm9tX3J4X3F1ZXVlOiByeF9maXJzdCA9ICV4LCByeF9sYXN0ID0gJXgsIGNvdW50ID0gJWQiLAorICAgICAgICAgIChpbnQpcEluZm8tPnJ4X2ZpcnN0LCAoaW50KXBJbmZvLT5yeF9sYXN0LCBwSW5mby0+YmxvY2tzX2luX3J4X3F1ZXVlICk7CisgICBUUkFDRV9RKCJyZW1vdmVfZnJvbV9yeF9xdWV1ZTogJXgsIGxlbmd0aCAlZCIsCisgICAgICAgICAgKGludClwSGVhZGVyLCAoaW50KXBIZWFkZXItPmxlbmd0aCApOworCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgaWYocEluZm8tPnJ4X2ZpcnN0ID09IHBIZWFkZXIpCisgICB7CisgICAgICAvKiBSZW1vdmUgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBsaW5rZWQgbGlzdDogKi8KKyAgICAgIHBJbmZvLT5yeF9maXJzdCA9IHBIZWFkZXItPm5leHQ7CisgICAgICAKKyAgICAgIGlmKHBJbmZvLT5yeF9maXJzdD09TlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBJbmZvLT5yeF9sYXN0ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUtLTsKKyAgIH0KKyAgIGVsc2UgCisgICB7CisgICAgICAvKiBGaW5kIGJsb2NrIHRvIHJlbW92ZTogKi8KKyAgICAgIGZvcihwRmluZD1wSW5mby0+cnhfZmlyc3Q7IHBGaW5kOyBwRmluZD1wRmluZC0+bmV4dCkKKyAgICAgIHsKKyAgICAgICAgIGlmKHBGaW5kLT5uZXh0ID09IHBIZWFkZXIpIAorICAgICAgICAgeworICAgICAgICAgICAgLyogR290IGl0LiAqLworICAgICAgICAgICAgcEZpbmQtPm5leHQgPSBwSGVhZGVyLT5uZXh0OworICAgICAgICAgICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZS0tOworICAgICAgICAgICAgaWYocEZpbmQtPm5leHQ9PU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBPaCwgcmVtb3ZlZCB0aGUgbGFzdCBvbmUhICovCisgICAgICAgICAgICAgICBwSW5mby0+cnhfbGFzdCA9IHBGaW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgIGtmcmVlKHBIZWFkZXIpOworICAgVFJBQ0VfTSgicmVtb3ZlX2Zyb21fcnhfcXVldWUgLSBrZnJlZSAleCIsKGludClwSGVhZGVyKTsKKworICAgVFJBQ0VfUSgicmVtb3ZlX2Zyb21fcnhfcXVldWU6IHJ4X2ZpcnN0ID0gJXgsIHJ4X2xhc3QgPSAleCwgY291bnQgPSAlZCIsCisgICAgICAgICAgKGludClwSW5mby0+cnhfZmlyc3QsIChpbnQpcEluZm8tPnJ4X2xhc3QsIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUgKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2NoYXIoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCB1bnNpZ25lZCBjaGFyIGNoKQoreworICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBJbmZvLT50dHk7CisKKyAgIGlmKHR0eT09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYodHR5LT5kcml2ZXItPnB1dF9jaGFyKQorICAgeworICAgICAgdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgY2gpOworICAgfQorICAgcEluZm8tPmJjYyBePSBjaDsKK30KKworc3RhdGljIHZvaWQgZmx1c2goc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBJbmZvLT50dHk7CisKKyAgIGlmKHR0eT09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorICAgeworICAgICAgdHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKHR0eSk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdHJhbnNtaXQoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgaWYoKHBJbmZvLT5zdGF0ZSA9PSBSMzk2NF9JRExFKSAmJiAocEluZm8tPnR4X2ZpcnN0IT1OVUxMKSkKKyAgIHsKKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1RYX1JFUVVFU1Q7CisgICAgICBwSW5mby0+blJldHJ5PTA7CisgICAgICBwSW5mby0+ZmxhZ3MgJj0gflIzOTY0X0VSUk9SOworICAgICAgbW9kX3RpbWVyKCZwSW5mby0+dG1yLCBqaWZmaWVzICsgUjM5NjRfVE9fUVZaKTsKKworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgICAgVFJBQ0VfUFMoInRyaWdnZXJfdHJhbnNtaXQgLSBzZW50IFNUWCIpOworCisgICAgICBwdXRfY2hhcihwSW5mbywgU1RYKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKworICAgICAgcEluZm8tPmJjYyA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworICAgfQorfQorCitzdGF0aWMgdm9pZCByZXRyeV90cmFuc21pdChzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pCit7CisgICBpZihwSW5mby0+blJldHJ5PFIzOTY0X01BWF9SRVRSSUVTKQorICAgeworICAgICAgVFJBQ0VfUEUoInRyYW5zbWlzc2lvbiBmYWlsZWQuIFJldHJ5ICMlZCIsIAorICAgICAgICAgICAgIHBJbmZvLT5uUmV0cnkpOworICAgICAgcEluZm8tPmJjYyA9IDA7CisgICAgICBwdXRfY2hhcihwSW5mbywgU1RYKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1RYX1JFUVVFU1Q7CisgICAgICBwSW5mby0+blJldHJ5Kys7CisgICAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19RVlopOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVFJBQ0VfUEUoInRyYW5zbWlzc2lvbiBmYWlsZWQgYWZ0ZXIgJWQgcmV0cmllcyIsIAorICAgICAgICAgICAgIFIzOTY0X01BWF9SRVRSSUVTKTsKKworICAgICAgcmVtb3ZlX2Zyb21fdHhfcXVldWUocEluZm8sIFIzOTY0X1RYX0ZBSUwpOworICAgICAgCisgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X0lETEU7CisKKyAgICAgIHRyaWdnZXJfdHJhbnNtaXQocEluZm8pOworICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRyYW5zbWl0X2Jsb2NrKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbykKK3sKKyAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwSW5mby0+dHR5OworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEJsb2NrID0gcEluZm8tPnR4X2ZpcnN0OworICAgaW50IHJvb209MDsKKworICAgaWYoKHR0eT09TlVMTCkgfHwgKHBCbG9jaz09TlVMTCkpCisgICB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmKHR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKQorICAgICAgcm9vbT10dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpOworCisgICBUUkFDRV9QUygidHJhbnNtaXRfYmxvY2sgJXgsIHJvb20gJWQsIGxlbmd0aCAlZCIsIAorICAgICAgICAgIChpbnQpcEJsb2NrLCByb29tLCBwQmxvY2stPmxlbmd0aCk7CisgICAKKyAgIHdoaWxlKHBJbmZvLT50eF9wb3NpdGlvbiA8IHBCbG9jay0+bGVuZ3RoKQorICAgeworICAgICAgaWYocm9vbTwyKQorICAgICAgICAgYnJlYWs7CisgCisgICAgICBpZihwQmxvY2stPmRhdGFbcEluZm8tPnR4X3Bvc2l0aW9uXT09RExFKQorICAgICAgeworICAgICAgICAgLyogc2VuZCBhZGRpdGlvbmFsIERMRSBjaGFyOiAqLworICAgICAgICAgcHV0X2NoYXIocEluZm8sIERMRSk7CisgICAgICB9CisgICAgICBwdXRfY2hhcihwSW5mbywgcEJsb2NrLT5kYXRhW3BJbmZvLT50eF9wb3NpdGlvbisrXSk7CisgICAgICAKKyAgICAgIHJvb20tLTsKKyAgIH0KKworICAgaWYoKHBJbmZvLT50eF9wb3NpdGlvbiA9PSBwQmxvY2stPmxlbmd0aCkgJiYgKHJvb20+PTMpKQorICAgeworICAgICAgcHV0X2NoYXIocEluZm8sIERMRSk7CisgICAgICBwdXRfY2hhcihwSW5mbywgRVRYKTsKKyAgICAgIGlmKHBJbmZvLT5mbGFncyAmIFIzOTY0X0JDQykKKyAgICAgIHsKKyAgICAgICAgIHB1dF9jaGFyKHBJbmZvLCBwSW5mby0+YmNjKTsKKyAgICAgIH0KKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1dBSVRfRk9SX1RYX0FDSzsKKyAgICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgamlmZmllcyArIFIzOTY0X1RPX1FWWik7CisgICB9CisgICBmbHVzaChwSW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX3JlY2VpdmVfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBCbG9jazsKKyAgIAorICAgbGVuZ3RoPXBJbmZvLT5yeF9wb3NpdGlvbjsKKworICAgLyogY29tcGFyZSBieXRlIGNoZWNrc3VtIGNoYXJhY3RlcnM6ICovCisgICBpZihwSW5mby0+ZmxhZ3MgJiBSMzk2NF9CQ0MpCisgICB7CisgICAgICBpZihwSW5mby0+YmNjIT1wSW5mby0+bGFzdF9yeCkKKyAgICAgIHsKKyAgICAgICAgIFRSQUNFX1BFKCJjaGVja3N1bSBlcnJvciAtIGdvdCAleCBidXQgZXhwZWN0ZWQgJXgiLAorICAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4LCBwSW5mby0+YmNjKTsKKyAgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9DSEVDS1NVTTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogY2hlY2sgZm9yIGVycm9ycyAocGFyaXR5LCBvdmVycnVuLC4uLik6ICovCisgICBpZihwSW5mby0+ZmxhZ3MgJiBSMzk2NF9FUlJPUikKKyAgIHsKKyAgICAgIFRSQUNFX1BFKCJvbl9yZWNlaXZlX2Jsb2NrIC0gdHJhbnNtaXNzaW9uIGZhaWxlZCBlcnJvciAleCIsCisgICAgICAgICAgICAgcEluZm8tPmZsYWdzICYgUjM5NjRfRVJST1IpOworICAgICAgCisgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgIGlmKHBJbmZvLT5uUmV0cnk8UjM5NjRfTUFYX1JFVFJJRVMpCisgICAgICB7CisgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOworICAgICAgICAgcEluZm8tPm5SZXRyeSsrOworCSBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19SWF9QQU5JQyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBUUkFDRV9QRSgib25fcmVjZWl2ZV9ibG9jayAtIGZhaWxlZCBhZnRlciBtYXggcmV0cmllcyIpOworICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIAorICAgLyogcmVjZWl2ZWQgYmxvY2s7IHN1Ym1pdCBETEU6ICovCisgICBwdXRfY2hhcihwSW5mbywgRExFKTsKKyAgIGZsdXNoKHBJbmZvKTsKKyAgIGRlbF90aW1lcl9zeW5jKCZwSW5mby0+dG1yKTsKKyAgIFRSQUNFX1BTKCIgcnggc3VjY2VzczogZ290ICVkIGNoYXJzIiwgbGVuZ3RoKTsKKworICAgLyogcHJlcGFyZSBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyOiAqLworICAgcEJsb2NrID0ga21hbGxvYyhsZW5ndGgrc2l6ZW9mKHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIpLCBHRlBfS0VSTkVMKTsKKyAgIFRSQUNFX00oIm9uX3JlY2VpdmVfYmxvY2sgLSBrbWFsbG9jICV4IiwoaW50KXBCbG9jayk7CisKKyAgIGlmKHBCbG9jaz09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcEJsb2NrLT5sZW5ndGggPSBsZW5ndGg7CisgICBwQmxvY2stPmRhdGEgICA9ICgodW5zaWduZWQgY2hhciopcEJsb2NrKStzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlcik7CisgICBwQmxvY2stPmxvY2tzICA9IDA7CisgICBwQmxvY2stPm5leHQgICA9IE5VTEw7CisgICBwQmxvY2stPm93bmVyICA9IE5VTEw7CisKKyAgIG1lbWNweShwQmxvY2stPmRhdGEsIHBJbmZvLT5yeF9idWYsIGxlbmd0aCk7CisKKyAgIC8qIHF1ZXVlIGJsb2NrIGludG8gcnhfcXVldWU6ICovCisgICBhZGRfcnhfcXVldWUocEluZm8sIHBCbG9jayk7CisKKyAgIC8qIG5vdGlmeSBhdHRhY2hlZCBjbGllbnQgcHJvY2Vzc2VzOiAqLworICAgZm9yKHBDbGllbnQ9cEluZm8tPmZpcnN0Q2xpZW50OyBwQ2xpZW50OyBwQ2xpZW50PXBDbGllbnQtPm5leHQpCisgICB7CisgICAgICBpZihwQ2xpZW50LT5zaWdfZmxhZ3MgJiBSMzk2NF9TSUdfREFUQSkKKyAgICAgIHsKKyAgICAgICAgIGFkZF9tc2cocENsaWVudCwgUjM5NjRfTVNHX0RBVEEsIGxlbmd0aCwgUjM5NjRfT0ssIHBCbG9jayk7CisgICAgICB9CisgICB9CisgICB3YWtlX3VwX2ludGVycnVwdGlibGUgKCZwSW5mby0+cmVhZF93YWl0KTsKKyAgIAorICAgcEluZm8tPnN0YXRlID0gUjM5NjRfSURMRTsKKworICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7Cit9CisKKworc3RhdGljIHZvaWQgcmVjZWl2ZV9jaGFyKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgdW5zaWduZWQgY2hhciBjKQoreworICAgc3dpdGNoKHBJbmZvLT5zdGF0ZSkKKyAgIHsKKyAgICAgIGNhc2UgUjM5NjRfVFhfUkVRVUVTVDoKKyAgICAgICAgIGlmKGM9PURMRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BTKCJUWF9SRVFVRVNUIC0gZ290IERMRSIpOworCisgICAgICAgICAgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9UUkFOU01JVFRJTkc7CisgICAgICAgICAgICBwSW5mby0+dHhfcG9zaXRpb24gPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cmFuc21pdF9ibG9jayhwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmKGM9PVNUWCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbmZvLT5uUmV0cnk9PTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIGluaXQgY29uZmxpY3QiKTsKKyAgICAgICAgICAgICAgIGlmKHBJbmZvLT5wcmlvcml0eSA9PSBSMzk2NF9TTEFWRSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gc3RhcnRfcmVjZWl2aW5nOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIHNlY29uZGFyeSBpbml0IGNvbmZsaWN0IT8iCisgICAgICAgICAgICAgICAgICAgICAgICAiIFN3aXRjaGluZyB0byBTTEFWRSBtb2RlIGZvciBuZXh0IHJ4LiIpOworICAgICAgICAgICAgICAgZ290byBzdGFydF9yZWNlaXZpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIGNoYXIgIT0gRExFOiAleCIsIGMpOworICAgICAgICAgICAgcmV0cnlfdHJhbnNtaXQocEluZm8pOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1RSQU5TTUlUVElORzoKKyAgICAgICAgIGlmKGM9PU5BSykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BFKCJUUkFOU01JVFRJTkcgLSBnb3QgTkFLIik7CisgICAgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBUUkFDRV9QRSgiVFJBTlNNSVRUSU5HIC0gZ290IGludmFsaWQgY2hhciIpOworIAorICAgICAgICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfV0FJVF9aVlpfQkVGT1JFX1RYX1JFVFJZOworCSAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19aVlopOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1dBSVRfRk9SX1RYX0FDSzoKKyAgICAgICAgIGlmKGM9PURMRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BTKCJXQUlUX0ZPUl9UWF9BQ0sgLSBnb3QgRExFIik7CisgICAgICAgICAgICByZW1vdmVfZnJvbV90eF9xdWV1ZShwSW5mbywgUjM5NjRfT0spOworICAgICAgICAgICAgCisgICAgICAgICAgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9JRExFOworICAgICAgICAgICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOgorICAgICAgICAgLyogRkFMTFRST1VHSCAqLworICAgICAgY2FzZSBSMzk2NF9JRExFOgorICAgICAgICAgaWYoYz09U1RYKQorICAgICAgICAgeworICAgICAgICAgICAgLyogUHJldmVudCByeF9xdWV1ZSBmcm9tIG92ZXJmbG93OiAqLworICAgICAgICAgICAgaWYocEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSA+PSBSMzk2NF9NQVhfQkxPQ0tTX0lOX1JYX1FVRVVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVFJBQ0VfUEUoIklETEUgLSBnb3QgU1RYIGJ1dCBubyBzcGFjZSBpbiByeF9xdWV1ZSEiKTsKKyAgICAgICAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9XQUlUX0ZPUl9SWF9CVUY7CisJICAgICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgUjM5NjRfVE9fTk9fQlVGKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorc3RhcnRfcmVjZWl2aW5nOgorICAgICAgICAgICAgLyogT2ssIHN0YXJ0IHJlY2VpdmluZzogKi8KKyAgICAgICAgICAgIFRSQUNFX1BTKCJJRExFIC0gZ290IFNUWCIpOworICAgICAgICAgICAgcEluZm8tPnJ4X3Bvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gMDsKKyAgICAgICAgICAgIHBJbmZvLT5mbGFncyAmPSB+UjM5NjRfRVJST1I7CisgICAgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfUkVDRUlWSU5HOworCSAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIFIzOTY0X1RPX1pWWik7CisJICAgIHBJbmZvLT5uUmV0cnkgPSAwOworICAgICAgICAgICAgcHV0X2NoYXIocEluZm8sIERMRSk7CisgICAgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICAgICBwSW5mby0+YmNjID0gMDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9SRUNFSVZJTkc6CisgICAgICAgICBpZihwSW5mby0+cnhfcG9zaXRpb24gPCBSWF9CVUZfU0laRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBJbmZvLT5iY2MgXj0gYzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoYz09RExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYocEluZm8tPmxhc3Rfcng9PURMRSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gMDsKKyAgICAgICAgICAgICAgICAgIGdvdG8gY2hhcl90b19idWY7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwSW5mby0+bGFzdF9yeCA9IERMRTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgaWYoKGM9PUVUWCkgJiYgKHBJbmZvLT5sYXN0X3J4PT1ETEUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYocEluZm8tPmZsYWdzICYgUjM5NjRfQkNDKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfV0FJVF9GT1JfQkNDOworCQkgIG1vZF90aW1lcigmcEluZm8tPnRtciwgUjM5NjRfVE9fWlZaKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBvbl9yZWNlaXZlX2Jsb2NrKHBJbmZvKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gYzsKK2NoYXJfdG9fYnVmOgorICAgICAgICAgICAgICAgcEluZm8tPnJ4X2J1ZltwSW5mby0+cnhfcG9zaXRpb24rK10gPSBjOworCSAgICAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIFIzOTY0X1RPX1pWWik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgIC8qIGVsc2U6IG92ZXJmbG93LW1zZz8gQlVGX1NJWkU+TVRVOyBzaG91bGQgbm90IGhhcHBlbj8gKi8gCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfQkNDOgorICAgICAgICAgcEluZm8tPmxhc3RfcnggPSBjOworICAgICAgICAgb25fcmVjZWl2ZV9ibG9jayhwSW5mbyk7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9lcnJvcihzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGNvbnN0IGNoYXIgZmxhZykKK3sKKyAgICBzd2l0Y2ggKGZsYWcpIAorICAgIHsKKyAgICBjYXNlIFRUWV9OT1JNQUw6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX0JSRUFLOgorICAgICAgICBUUkFDRV9QRSgicmVjZWl2ZWQgYnJlYWsiKQorICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfQlJFQUs7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX1BBUklUWToKKyAgICAgICAgVFJBQ0VfUEUoInBhcml0eSBlcnJvciIpCisgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9QQVJJVFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX0ZSQU1FOgorICAgICAgICBUUkFDRV9QRSgiZnJhbWUgZXJyb3IiKQorICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfRlJBTUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX09WRVJSVU46CisgICAgICAgIFRSQUNFX1BFKCJmcmFtZSBvdmVycnVuIikKKyAgICAgICAgcEluZm8tPmZsYWdzIHw9IFIzOTY0X09WRVJSVU47CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFRSQUNFX1BFKCJyZWNlaXZlX2Vycm9yIC0gdW5rbm93biBmbGFnICVkIiwgZmxhZyk7CisgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9VTktOT1dOOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwcml2KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvID0gKHZvaWQgKilwcml2OworCisgICBzd2l0Y2gocEluZm8tPnN0YXRlKQorICAgeworICAgICAgY2FzZSBSMzk2NF9UWF9SRVFVRVNUOgorICAgICAgICAgVFJBQ0VfUEUoIlRYX1JFUVVFU1QgLSB0aW1lb3V0Iik7CisgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9aVlpfQkVGT1JFX1RYX1JFVFJZOgorICAgICAgICAgcHV0X2NoYXIocEluZm8sIE5BSyk7CisgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfVFhfQUNLOgorICAgICAgICAgVFJBQ0VfUEUoIldBSVRfRk9SX1RYX0FDSyAtIHRpbWVvdXQiKTsKKyAgICAgICAgIHJldHJ5X3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX0ZPUl9SWF9CVUY6CisgICAgICAgICBUUkFDRV9QRSgiV0FJVF9GT1JfUlhfQlVGIC0gdGltZW91dCIpOworICAgICAgICAgcHV0X2NoYXIocEluZm8sIE5BSyk7CisgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfSURMRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9SRUNFSVZJTkc6CisgICAgICAgICBUUkFDRV9QRSgiUkVDRUlWSU5HIC0gdGltZW91dCBhZnRlciAlZCBjaGFycyIsIAorICAgICAgICAgICAgICAgICAgcEluZm8tPnJ4X3Bvc2l0aW9uKTsKKyAgICAgICAgIHB1dF9jaGFyKHBJbmZvLCBOQUspOworICAgICAgICAgZmx1c2gocEluZm8pOworICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOgorICAgICAgICAgVFJBQ0VfUEUoIldBSVRfRk9SX1JYX1JFUEVBVCAtIHRpbWVvdXQiKTsKKyAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1dBSVRfRk9SX0JDQzoKKyAgICAgICAgIFRSQUNFX1BFKCJXQUlUX0ZPUl9CQ0MgLSB0aW1lb3V0Iik7CisgICAgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgICAgICAgYnJlYWs7CisgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKmZpbmRDbGllbnQoCisgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkKQoreworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgCisgICBmb3IocENsaWVudD1wSW5mby0+Zmlyc3RDbGllbnQ7IHBDbGllbnQ7IHBDbGllbnQ9cENsaWVudC0+bmV4dCkKKyAgIHsKKyAgICAgIGlmKHBDbGllbnQtPnBpZCA9PSBwaWQpCisgICAgICB7CisgICAgICAgICByZXR1cm4gcENsaWVudDsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGVuYWJsZV9zaWduYWxzKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkLCBpbnQgYXJnKQoreworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICoqcHBDbGllbnQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKKyAgIAorICAgaWYoKGFyZyAmIFIzOTY0X1NJR19BTEwpPT0wKQorICAgeworICAgICAgLyogUmVtb3ZlIGNsaWVudCBmcm9tIGNsaWVudCBsaXN0ICovCisgICAgICBmb3IocHBDbGllbnQ9JnBJbmZvLT5maXJzdENsaWVudDsgKnBwQ2xpZW50OyBwcENsaWVudD0mKCpwcENsaWVudCktPm5leHQpCisgICAgICB7CisgICAgICAgICBwQ2xpZW50ID0gKnBwQ2xpZW50OworICAgICAgICAgCisgICAgICAgICBpZihwQ2xpZW50LT5waWQgPT0gcGlkKQorICAgICAgICAgeworICAgICAgICAgICAgVFJBQ0VfUFMoInJlbW92aW5nIGNsaWVudCAlZCBmcm9tIGNsaWVudCBsaXN0IiwgcGlkKTsKKyAgICAgICAgICAgICpwcENsaWVudCA9IHBDbGllbnQtPm5leHQ7CisgICAgICAgICAgICB3aGlsZShwQ2xpZW50LT5tc2dfY291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwTXNnPXJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOworICAgICAgICAgICAgICAgaWYocE1zZykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGtmcmVlKHBNc2cpOworICAgICAgICAgICAgICAgICAgVFJBQ0VfTSgiZW5hYmxlX3NpZ25hbHMgLSBtc2cga2ZyZWUgJXgiLChpbnQpcE1zZyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwQ2xpZW50KTsKKyAgICAgICAgICAgIFRSQUNFX00oImVuYWJsZV9zaWduYWxzIC0ga2ZyZWUgJXgiLChpbnQpcENsaWVudCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAtRUlOVkFMOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgICAgaWYocENsaWVudCkKKyAgICAgIHsKKyAgICAgICAgIC8qIHVwZGF0ZSBzaWduYWwgb3B0aW9ucyAqLworICAgICAgICAgcENsaWVudC0+c2lnX2ZsYWdzPWFyZzsKKyAgICAgIH0gCisgICAgICBlbHNlIAorICAgICAgeworICAgICAgICAgLyogYWRkIGNsaWVudCB0byBjbGllbnQgbGlzdCAqLworICAgICAgICAgcENsaWVudD1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8pLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgIFRSQUNFX00oImVuYWJsZV9zaWduYWxzIC0ga21hbGxvYyAleCIsKGludClwQ2xpZW50KTsKKyAgICAgICAgIGlmKHBDbGllbnQ9PU5VTEwpCisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICAgVFJBQ0VfUFMoImFkZCBjbGllbnQgJWQgdG8gY2xpZW50IGxpc3QiLCBwaWQpOworCSBzcGluX2xvY2tfaW5pdCgmcENsaWVudC0+bG9jayk7CisgICAgICAgICBwQ2xpZW50LT5zaWdfZmxhZ3M9YXJnOworICAgICAgICAgcENsaWVudC0+cGlkID0gcGlkOworICAgICAgICAgcENsaWVudC0+bmV4dD1wSW5mby0+Zmlyc3RDbGllbnQ7CisgICAgICAgICBwQ2xpZW50LT5maXJzdF9tc2cgPSBOVUxMOworICAgICAgICAgcENsaWVudC0+bGFzdF9tc2cgPSBOVUxMOworICAgICAgICAgcENsaWVudC0+bmV4dF9ibG9ja190b19yZWFkID0gTlVMTDsKKyAgICAgICAgIHBDbGllbnQtPm1zZ19jb3VudCA9IDA7CisgICAgICAgICBwSW5mby0+Zmlyc3RDbGllbnQ9cENsaWVudDsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90ZWxlZ3JhbShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHBpZF90IHBpZCwgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqYmxvY2s7CisKKyAgICBpZighYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLHBpZCk7CisgICAgaWYocENsaWVudD09TlVMTCkKKyAgICB7CisgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIAorICAgIGJsb2NrPXBDbGllbnQtPm5leHRfYmxvY2tfdG9fcmVhZDsKKyAgICBpZighYmxvY2spCisgICAgeworICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGNvcHlfdG9fdXNlciAoYnVmLCBibG9jay0+ZGF0YSwgYmxvY2stPmxlbmd0aCkpCisJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICByZW1vdmVfY2xpZW50X2Jsb2NrKHBJbmZvLCBwQ2xpZW50KTsKKyAgICAgICByZXR1cm4gYmxvY2stPmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYWRkX21zZyhzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQsIGludCBtc2dfaWQsIGludCBhcmcsCisgICAgICAgICAgICAgaW50IGVycm9yX2NvZGUsIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBCbG9jaykKK3sKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnOworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorICAgaWYocENsaWVudC0+bXNnX2NvdW50PFIzOTY0X01BWF9NU0dfQ09VTlQtMSkKKyAgIHsKK3F1ZXVlX3RoZV9tZXNzYWdlOgorCisgICAgICBwTXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHIzOTY0X21lc3NhZ2UpLCBHRlBfS0VSTkVMKTsKKyAgICAgIFRSQUNFX00oImFkZF9tc2cgLSBrbWFsbG9jICV4IiwoaW50KXBNc2cpOworICAgICAgaWYocE1zZz09TlVMTCkgeworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworCisgICAgICBwTXNnLT5tc2dfaWQgPSBtc2dfaWQ7CisgICAgICBwTXNnLT5hcmcgICAgPSBhcmc7CisgICAgICBwTXNnLT5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKyAgICAgIHBNc2ctPmJsb2NrICA9IHBCbG9jazsKKyAgICAgIHBNc2ctPm5leHQgICA9IE5VTEw7CisgICAgICAKKyAgICAgIGlmKHBDbGllbnQtPmxhc3RfbXNnPT1OVUxMKQorICAgICAgeworICAgICAgICAgcENsaWVudC0+Zmlyc3RfbXNnPXBDbGllbnQtPmxhc3RfbXNnPXBNc2c7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwQ2xpZW50LT5sYXN0X21zZy0+bmV4dCA9IHBNc2c7CisgICAgICAgICBwQ2xpZW50LT5sYXN0X21zZz1wTXNnOworICAgICAgfQorCisgICAgICBwQ2xpZW50LT5tc2dfY291bnQrKzsKKworICAgICAgaWYocEJsb2NrIT1OVUxMKQorICAgICAgeworICAgICAgICAgcEJsb2NrLT5sb2NrcysrOworICAgICAgfQorICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYoKHBDbGllbnQtPmxhc3RfbXNnLT5tc2dfaWQgPT0gUjM5NjRfTVNHX0FDSykKKwkJICYmIChwQ2xpZW50LT5sYXN0X21zZy0+ZXJyb3JfY29kZT09UjM5NjRfT1ZFUkZMT1cpKQorICAgICAgeworICAgICAgICAgcENsaWVudC0+bGFzdF9tc2ctPmFyZysrOworCQkgVFJBQ0VfUEUoImFkZF9tc2cgLSBpbmMgcHJldiBPVkVSRkxPVy1tc2ciKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIG1zZ19pZCA9IFIzOTY0X01TR19BQ0s7CisgICAgICAgICBhcmcgPSAwOworCQkgZXJyb3JfY29kZSA9IFIzOTY0X09WRVJGTE9XOworICAgICAgICAgcEJsb2NrID0gTlVMTDsKKwkJIFRSQUNFX1BFKCJhZGRfbXNnIC0gcXVldWUgT1ZFUkZMT1ctbXNnIik7CisgICAgICAgICBnb3RvIHF1ZXVlX3RoZV9tZXNzYWdlOworICAgICAgfQorICAgfQorICAgLyogU2VuZCBTSUdJTyBzaWduYWwgdG8gY2xpZW50IHByb2Nlc3M6ICovCisgICBpZihwQ2xpZW50LT5zaWdfZmxhZ3MgJiBSMzk2NF9VU0VfU0lHSU8pCisgICB7CisgICAgICBraWxsX3Byb2MocENsaWVudC0+cGlkLCBTSUdJTywgMSk7CisgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcmVtb3ZlX21zZyhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudCkKK3sKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnPU5VTEw7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICBpZihwQ2xpZW50LT5maXJzdF9tc2cpCisgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworCisgICAgICBwTXNnID0gcENsaWVudC0+Zmlyc3RfbXNnOworICAgICAgcENsaWVudC0+Zmlyc3RfbXNnID0gcE1zZy0+bmV4dDsKKyAgICAgIGlmKHBDbGllbnQtPmZpcnN0X21zZz09TlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBDbGllbnQtPmxhc3RfbXNnID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcENsaWVudC0+bXNnX2NvdW50LS07CisgICAgICBpZihwTXNnLT5ibG9jaykKKyAgICAgIHsKKyAgICAgICAgcmVtb3ZlX2NsaWVudF9ibG9jayhwSW5mbywgcENsaWVudCk7CisgICAgICAgIHBDbGllbnQtPm5leHRfYmxvY2tfdG9fcmVhZCA9IHBNc2ctPmJsb2NrOworICAgICAgfQorICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworICAgfQorICAgcmV0dXJuIHBNc2c7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9jbGllbnRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQpCit7CisgICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqYmxvY2s7CisKKyAgICBUUkFDRV9QUygicmVtb3ZlX2NsaWVudF9ibG9jayBQSUQgJWQiLCBwQ2xpZW50LT5waWQpOworCisgICAgYmxvY2s9cENsaWVudC0+bmV4dF9ibG9ja190b19yZWFkOworICAgIGlmKGJsb2NrKQorICAgIHsKKyAgICAgICAgYmxvY2stPmxvY2tzLS07CisgICAgICAgIGlmKGJsb2NrLT5sb2Nrcz09MCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlX2Zyb21fcnhfcXVldWUocEluZm8sIGJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwQ2xpZW50LT5uZXh0X2Jsb2NrX3RvX3JlYWQgPSBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW5lIGRpc2NpcGxpbmUgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHIzOTY0X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbzsKKyAgIAorICAgVFJBQ0VfTCgib3BlbiIpOworICAgVFJBQ0VfTCgidHR5PSV4LCBQSUQ9JWQsIGRpc2NfZGF0YT0leCIsIAorICAgICAgICAgIChpbnQpdHR5LCBjdXJyZW50LT5waWQsIChpbnQpdHR5LT5kaXNjX2RhdGEpOworICAgCisgICBwSW5mbz1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcjM5NjRfaW5mbyksIEdGUF9LRVJORUwpOyAKKyAgIFRSQUNFX00oInIzOTY0X29wZW4gLSBpbmZvIGttYWxsb2MgJXgiLChpbnQpcEluZm8pOworCisgICBpZighcEluZm8pCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBmYWlsZWQgdG8gYWxsb2MgaW5mbyBzdHJ1Y3R1cmVcbiIpOworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICB9CisKKyAgIHBJbmZvLT5yeF9idWYgPSBrbWFsbG9jKFJYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKyAgIFRSQUNFX00oInIzOTY0X29wZW4gLSByeF9idWYga21hbGxvYyAleCIsKGludClwSW5mby0+cnhfYnVmKTsKKworICAgaWYoIXBJbmZvLT5yeF9idWYpCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBmYWlsZWQgdG8gYWxsb2MgcmVjZWl2ZSBidWZmZXJcbiIpOworICAgICAga2ZyZWUocEluZm8pOworICAgICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIGluZm8ga2ZyZWUgJXgiLChpbnQpcEluZm8pOworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICB9CisgICAKKyAgIHBJbmZvLT50eF9idWYgPSBrbWFsbG9jKFRYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKyAgIFRSQUNFX00oInIzOTY0X29wZW4gLSB0eF9idWYga21hbGxvYyAleCIsKGludClwSW5mby0+dHhfYnVmKTsKKworICAgaWYoIXBJbmZvLT50eF9idWYpCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBmYWlsZWQgdG8gYWxsb2MgdHJhbnNtaXQgYnVmZmVyXG4iKTsKKyAgICAgIGtmcmVlKHBJbmZvLT5yeF9idWYpOworICAgICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIHJ4X2J1ZiBrZnJlZSAleCIsKGludClwSW5mby0+cnhfYnVmKTsKKyAgICAgIGtmcmVlKHBJbmZvKTsKKyAgICAgIFRSQUNFX00oInIzOTY0X29wZW4gLSBpbmZvIGtmcmVlICV4IiwoaW50KXBJbmZvKTsKKyAgICAgIHJldHVybiAtRU5PTUVNOworICAgfQorCisgICBzcGluX2xvY2tfaW5pdCgmcEluZm8tPmxvY2spOworICAgcEluZm8tPnR0eSA9IHR0eTsKKyAgIGluaXRfd2FpdHF1ZXVlX2hlYWQgKCZwSW5mby0+cmVhZF93YWl0KTsKKyAgIHBJbmZvLT5wcmlvcml0eSA9IFIzOTY0X01BU1RFUjsKKyAgIHBJbmZvLT5yeF9maXJzdCA9IHBJbmZvLT5yeF9sYXN0ID0gTlVMTDsKKyAgIHBJbmZvLT50eF9maXJzdCA9IHBJbmZvLT50eF9sYXN0ID0gTlVMTDsKKyAgIHBJbmZvLT5yeF9wb3NpdGlvbiA9IDA7CisgICBwSW5mby0+dHhfcG9zaXRpb24gPSAwOworICAgcEluZm8tPmxhc3RfcnggPSAwOworICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSA9IDA7CisgICBwSW5mby0+Zmlyc3RDbGllbnQ9TlVMTDsKKyAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgcEluZm8tPmZsYWdzID0gUjM5NjRfREVCVUc7CisgICBwSW5mby0+blJldHJ5ID0gMDsKKyAgIAorICAgdHR5LT5kaXNjX2RhdGEgPSBwSW5mbzsKKworICAgaW5pdF90aW1lcigmcEluZm8tPnRtcik7CisgICBwSW5mby0+dG1yLmRhdGEgPSAodW5zaWduZWQgbG9uZylwSW5mbzsKKyAgIHBJbmZvLT50bXIuZnVuY3Rpb24gPSBvbl90aW1lb3V0OworCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcjM5NjRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50LCAqcE5leHQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXIsICpwTmV4dEhlYWRlcjsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgIFRSQUNFX0woImNsb3NlIik7CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGF0IG91ciB0YXNrIHF1ZXVlIGlzbid0IGFjdGl2YXRlZC4gIElmIGl0CisgICAgICogaXMsIHRha2UgaXQgb3V0IG9mIHRoZSBsaW5rZWQgbGlzdC4KKyAgICAgKi8KKyAgICBkZWxfdGltZXJfc3luYygmcEluZm8tPnRtcik7CisKKyAgIC8qIFJlbW92ZSBjbGllbnQtc3RydWN0cyBhbmQgbWVzc2FnZSBxdWV1ZXM6ICovCisgICAgcENsaWVudD1wSW5mby0+Zmlyc3RDbGllbnQ7CisgICAgd2hpbGUocENsaWVudCkKKyAgICB7CisgICAgICAgcE5leHQ9cENsaWVudC0+bmV4dDsKKyAgICAgICB3aGlsZShwQ2xpZW50LT5tc2dfY291bnQpCisgICAgICAgeworICAgICAgICAgIHBNc2c9cmVtb3ZlX21zZyhwSW5mbywgcENsaWVudCk7CisgICAgICAgICAgaWYocE1zZykKKyAgICAgICAgICB7CisgICAgICAgICAgICAga2ZyZWUocE1zZyk7CisgICAgICAgICAgICAgVFJBQ0VfTSgicjM5NjRfY2xvc2UgLSBtc2cga2ZyZWUgJXgiLChpbnQpcE1zZyk7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBrZnJlZShwQ2xpZW50KTsKKyAgICAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIGNsaWVudCBrZnJlZSAleCIsKGludClwQ2xpZW50KTsKKyAgICAgICBwQ2xpZW50PXBOZXh0OworICAgIH0KKyAgICAvKiBSZW1vdmUgam9icyBmcm9tIHR4X3F1ZXVlOiAqLworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKwlwSGVhZGVyPXBJbmZvLT50eF9maXJzdDsKKwlwSW5mby0+dHhfZmlyc3Q9cEluZm8tPnR4X2xhc3Q9TlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCQorICAgIHdoaWxlKHBIZWFkZXIpCisJeworCSAgIHBOZXh0SGVhZGVyPXBIZWFkZXItPm5leHQ7CisJICAga2ZyZWUocEhlYWRlcik7CisJICAgcEhlYWRlcj1wTmV4dEhlYWRlcjsKKwl9CisKKyAgICAvKiBGcmVlIGJ1ZmZlcnM6ICovCisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwSW5mby0+cmVhZF93YWl0KTsKKyAgICBrZnJlZShwSW5mby0+cnhfYnVmKTsKKyAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIHJ4X2J1ZiBrZnJlZSAleCIsKGludClwSW5mby0+cnhfYnVmKTsKKyAgICBrZnJlZShwSW5mby0+dHhfYnVmKTsKKyAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIHR4X2J1ZiBrZnJlZSAleCIsKGludClwSW5mby0+dHhfYnVmKTsKKyAgICBrZnJlZShwSW5mbyk7CisgICAgVFJBQ0VfTSgicjM5NjRfY2xvc2UgLSBpbmZvIGtmcmVlICV4IiwoaW50KXBJbmZvKTsKK30KKworc3RhdGljIHNzaXplX3QgcjM5NjRfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfbWVzc2FnZSB0aGVNc2c7CisgICBERUNMQVJFX1dBSVRRVUVVRSAod2FpdCwgY3VycmVudCk7CisgICAKKyAgIGludCBwaWQgPSBjdXJyZW50LT5waWQ7CisgICBpbnQgY291bnQ7CisgICAKKyAgIFRSQUNFX0woInJlYWQoKSIpOworIAorICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgaWYocENsaWVudCkKKyAgIHsKKyAgICAgIHBNc2cgPSByZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KTsKKyAgICAgIGlmKHBNc2c9PU5VTEwpCisgICAgICB7CisJCSAvKiBubyBtZXNzYWdlcyBhdmFpbGFibGUuICovCisgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCSB7CisgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKwkJIH0KKyAgICAgICAgIC8qIGJsb2NrIHVudGlsIHRoZXJlIGlzIGEgbWVzc2FnZTogKi8KKyAgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZwSW5mby0+cmVhZF93YWl0LCAmd2FpdCk7CityZXBlYXQ6CisgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgICAgICAgIHBNc2cgPSByZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KTsKKwkgaWYgKCFwTXNnICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJIHsKKyAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICBnb3RvIHJlcGVhdDsKKyAgICAgICAgIH0KKyAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnBJbmZvLT5yZWFkX3dhaXQsICZ3YWl0KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogSWYgd2Ugc3RpbGwgaGF2ZW4ndCBnb3QgYSBtZXNzYWdlLCB3ZSBtdXN0IGhhdmUgYmVlbiBzaWduYWxsZWQgKi8KKworICAgICAgaWYgKCFwTXNnKSByZXR1cm4gLUVJTlRSOworCisgICAgICAvKiBkZWxpdmVyIG1zZyB0byBjbGllbnQgcHJvY2VzczogKi8KKyAgICAgIHRoZU1zZy5tc2dfaWQgPSBwTXNnLT5tc2dfaWQ7CisgICAgICB0aGVNc2cuYXJnICAgID0gcE1zZy0+YXJnOworICAgICAgdGhlTXNnLmVycm9yX2NvZGUgPSBwTXNnLT5lcnJvcl9jb2RlOworICAgICAgY291bnQgPSBzaXplb2Yoc3RydWN0IHIzOTY0X2NsaWVudF9tZXNzYWdlKTsKKworICAgICAga2ZyZWUocE1zZyk7CisgICAgICBUUkFDRV9NKCJyMzk2NF9yZWFkIC0gbXNnIGtmcmVlICV4IiwoaW50KXBNc2cpOworCisgICAgICBpZiAoY29weV90b191c2VyKGJ1ZiwmdGhlTXNnLCBjb3VudCkpCisJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgIFRSQUNFX1BTKCJyZWFkIC0gcmV0dXJuICVkIiwgY291bnQpOworICAgICAgcmV0dXJuIGNvdW50OworICAgfQorICAgcmV0dXJuIC1FUEVSTTsKK30KKworc3RhdGljIHNzaXplX3QgcjM5NjRfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlcjsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKKyAgIHVuc2lnbmVkIGNoYXIgKm5ld19kYXRhOworICAgaW50IHBpZDsKKyAgIAorICAgVFJBQ0VfTCgid3JpdGUgcmVxdWVzdCwgJWQgY2hhcmFjdGVycyIsIGNvdW50KTsKKy8qIAorICogVmVyaWZ5IHRoZSBwb2ludGVycyAKKyAqLworCisgICBpZighcEluZm8pCisgICAgICByZXR1cm4gLUVJTzsKKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3Qgd2lzaCB0byBzZW5kIHRvbyBtdWNoLgorICovCisgICBpZiAoY291bnQgPiBSMzk2NF9NVFUpIAorICAgeworICAgICAgaWYgKHBJbmZvLT5mbGFncyAmIFIzOTY0X0RFQlVHKQorICAgICAgeworICAgICAgICAgVFJBQ0VfTCAoS0VSTl9XQVJOSU5HCisgICAgICAgICAgICAgICAgICJyMzk2NF93cml0ZTogdHJ1bmNhdGluZyB1c2VyIHBhY2tldCAiCisgICAgICAgICAgICAgICAgICJmcm9tICV1IHRvIG10dSAlZCIsIGNvdW50LCBSMzk2NF9NVFUpOworICAgICAgfQorICAgICAgY291bnQgPSBSMzk2NF9NVFU7CisgICB9CisvKgorICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBkYXRhIGFuZCBjb3B5IGl0IGZyb20gdGhlIGJ1ZmZlciB3aXRoIGhlYWRlciBwcmVwZW5kZWQKKyAqLworICAgbmV3X2RhdGEgPSBrbWFsbG9jIChjb3VudCtzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciksIEdGUF9LRVJORUwpOworICAgVFJBQ0VfTSgicjM5NjRfd3JpdGUgLSBrbWFsbG9jICV4IiwoaW50KW5ld19kYXRhKTsKKyAgIGlmIChuZXdfZGF0YSA9PSBOVUxMKSB7CisgICAgICBpZiAocEluZm8tPmZsYWdzICYgUjM5NjRfREVCVUcpCisgICAgICB7CisgICAgICAgICBwcmludGsgKEtFUk5fRVJSCisgICAgICAgICAgICAgICAicjM5NjRfd3JpdGU6IG5vIG1lbW9yeVxuIik7CisgICAgICB9CisgICAgICByZXR1cm4gLUVOT1NQQzsKKyAgIH0KKyAgIAorICAgcEhlYWRlciA9IChzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICopbmV3X2RhdGE7CisgICBwSGVhZGVyLT5kYXRhID0gbmV3X2RhdGEgKyBzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlcik7CisgICBwSGVhZGVyLT5sZW5ndGggPSBjb3VudDsKKyAgIHBIZWFkZXItPmxvY2tzID0gMDsKKyAgIHBIZWFkZXItPm93bmVyID0gTlVMTDsKKyAgIAorICAgcGlkPWN1cnJlbnQtPnBpZDsKKyAgIAorICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgaWYocENsaWVudCkKKyAgIHsKKyAgICAgIHBIZWFkZXItPm93bmVyID0gcENsaWVudDsKKyAgIH0KKworICAgbWVtY3B5KHBIZWFkZXItPmRhdGEsIGRhdGEsIGNvdW50KTsgLyogV2UgYWxyZWFkeSB2ZXJpZmllZCB0aGlzICovCisKKyAgIGlmKHBJbmZvLT5mbGFncyAmIFIzOTY0X0RFQlVHKQorICAgeworICAgICAgZHVtcF9ibG9jayhwSGVhZGVyLT5kYXRhLCBjb3VudCk7CisgICB9CisKKy8qCisgKiBBZGQgYnVmZmVyIHRvIHRyYW5zbWl0LXF1ZXVlOgorICovCisgICBhZGRfdHhfcXVldWUocEluZm8sIHBIZWFkZXIpOworICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7CisgICAKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIzOTY0X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgaWYocEluZm89PU5VTEwpCisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgIHN3aXRjaChjbWQpCisgICB7CisgICAgICBjYXNlIFIzOTY0X0VOQUJMRV9TSUdOQUxTOgorICAgICAgICAgcmV0dXJuIGVuYWJsZV9zaWduYWxzKHBJbmZvLCBjdXJyZW50LT5waWQsIGFyZyk7CisgICAgICBjYXNlIFIzOTY0X1NFVFBSSU9SSVRZOgorICAgICAgICAgaWYoYXJnPFIzOTY0X01BU1RFUiB8fCBhcmc+UjM5NjRfU0xBVkUpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgIHBJbmZvLT5wcmlvcml0eSA9IGFyZyAmIDB4ZmY7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgUjM5NjRfVVNFX0JDQzoKKyAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfQkNDOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcEluZm8tPmZsYWdzICY9IH5SMzk2NF9CQ0M7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgUjM5NjRfUkVBRF9URUxFR1JBTToKKyAgICAgICAgIHJldHVybiByZWFkX3RlbGVncmFtKHBJbmZvLCBjdXJyZW50LT5waWQsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWFyZyk7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIC1FTk9JT0NUTENNRDsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgcjM5NjRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCit7CisgICBUUkFDRV9MKCJzZXRfdGVybWlvcyIpOworfQorCisvKiBDYWxsZWQgd2l0aG91dCB0aGUga2VybmVsIGxvY2sgaGVsZCAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcjM5NjRfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisgICBzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm89KHN0cnVjdCByMzk2NF9pbmZvKil0dHktPmRpc2NfZGF0YTsKKyAgIGludCBwaWQ9Y3VycmVudC0+cGlkOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgc3RydWN0IHIzOTY0X21lc3NhZ2UgKnBNc2c9TlVMTDsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICBpbnQgcmVzdWx0ID0gUE9MTE9VVDsKKworICAgVFJBQ0VfTCgiUE9MTCIpOworCisgICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8scGlkKTsKKyAgIGlmKHBDbGllbnQpCisgICAgIHsKKyAgICAgICBwb2xsX3dhaXQoZmlsZSwgJnBJbmZvLT5yZWFkX3dhaXQsIHdhaXQpOworICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworICAgICAgIHBNc2c9cENsaWVudC0+Zmlyc3RfbXNnOworICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisgICAgICAgaWYocE1zZykKKwkgICByZXN1bHQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgcmVzdWx0ID0gLUVJTlZBTDsKKyAgICAgfQorICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgcjM5NjRfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgICBjaGFyICpmLCBmbGFncyA9IDA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9Y291bnQsIHAgPSBjcCwgZiA9IGZwOyBpOyBpLS0sIHArKykgeworICAgICAgICBpZiAoZikKKyAgICAgICAgICAgIGZsYWdzID0gKmYrKzsKKyAgICAgICAgaWYoZmxhZ3M9PVRUWV9OT1JNQUwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlY2VpdmVfY2hhcihwSW5mbywgKnApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVjZWl2ZV9lcnJvcihwSW5mbywgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KK30KKworc3RhdGljIGludCByMzk2NF9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgIFRSQUNFX0woInJlY2VpdmVfcm9vbSIpOworICAgcmV0dXJuIC0xOworfQorCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1IzOTY0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiYTVhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC0wLDAgKzEsMTU2MiBAQAorLyoKKyAqIG5fdHR5LmMgLS0tIGltcGxlbWVudHMgdGhlIE5fVFRZIGxpbmUgZGlzY2lwbGluZS4KKyAqIAorICogVGhpcyBjb2RlIHVzZWQgdG8gYmUgaW4gdHR5X2lvLmMsIGJ1dCB0aGluZ3MgYXJlIGdldHRpbmcgaGFpcnkKKyAqIGVub3VnaCB0aGF0IGl0IG1hZGUgc2Vuc2UgdG8gc3BsaXQgdGhpbmdzIG9mZi4gIChUaGUgTl9UVFkKKyAqIHByb2Nlc3NpbmcgaGFzIGNoYW5nZWQgc28gbXVjaCB0aGF0IGl0J3MgaGFyZGx5IHJlY29nbml6YWJsZSwKKyAqIGFueXdheS4uLikKKyAqCisgKiBOb3RlIHRoYXQgdGhlIG9wZW4gcm91dGluZSBmb3IgTl9UVFkgaXMgZ3VhcmFudGVlZCBuZXZlciB0byByZXR1cm4KKyAqIGFuIGVycm9yLiAgVGhpcyBpcyBiZWNhdXNlIExpbnV4IHdpbGwgZmFsbCBiYWNrIHRvIHNldHRpbmcgYSBsaW5lCisgKiB0byBOX1RUWSBpZiBpdCBjYW4gbm90IHN3aXRjaCB0byBhbnkgb3RoZXIgbGluZSBkaXNjaXBsaW5lLiAgCisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCBDb3B5cmlnaHQgMTk5NC4KKyAqIAorICogVGhpcyBmaWxlIGFsc28gY29udGFpbnMgY29kZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMsCisgKiBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MywgYW5kIGJ5IEp1bGlhbiBDb3dsZXksIENvcHlyaWdodCAxOTk0LgorICogCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKgorICogUmVkdWNlZCBtZW1vcnkgdXNhZ2UgZm9yIG9sZGVyIEFSTSBzeXN0ZW1zICAtIFJ1c3NlbGwgS2luZy4KKyAqCisgKiAyMDAwLzAxLzIwICAgRml4ZWQgU01QIGxvY2tpbmcgb24gcHV0X3R0eV9xdWV1ZSB1c2luZyBiaXRzIG9mIAorICoJCXRoZSBwYXRjaCBieSBBbmRyZXcgSi4gS3JvbGwgPGFnNzg0QGZyZWVuZXQuYnVmZmFsby5lZHU+CisgKgkJd2hvIGFjdHVhbGx5IGZpbmFsbHkgcHJvdmVkIHRoZXJlIHJlYWxseSB3YXMgYSByYWNlLgorICoKKyAqIDIwMDIvMDMvMTggICBJbXBsZW1lbnRlZCBuX3R0eV93YWtldXAgdG8gc2VuZCBTSUdJTyBQT0xMX09VVHMgdG8KKyAqCQl3YWl0aW5nIHdyaXRpbmcgcHJvY2Vzc2VzLVNhcGFuIEJoYXRpYSA8c2FwYW5AY29yZXdhcnMub3JnPi4KKyAqCQlBbHNvIGZpeGVkIGEgYnVnIGluIEJMT0NLSU5HIG1vZGUgd2hlcmUgd3JpdGVfY2hhbiByZXR1cm5zCisgKgkJRUFHQUlOCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHNlbGVjdCBoYXMgd2UgaGF2ZSByb29tICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgbG93LSBhbmQgaGlnaC13YXRlcm1hcmtzIGZvciB0aHJvdHRsaW5nIGFuZAorICogdW50aHJvdHRsaW5nIHRoZSBUVFkgZHJpdmVyLiAgVGhlc2Ugd2F0ZXJtYXJrcyBhcmUgdXNlZCBmb3IKKyAqIGNvbnRyb2xsaW5nIHRoZSBzcGFjZSBpbiB0aGUgcmVhZCBidWZmZXIuCisgKi8KKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRQkJMTI4IC8qIG5vdyBiYXNlZCBvbiByZW1haW5pbmcgcm9vbSAqLworI2RlZmluZSBUVFlfVEhSRVNIT0xEX1VOVEhST1RUTEUgCTEyOAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKmFsbG9jX2J1Zih2b2lkKQoreworCWludCBwcmlvID0gaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKKworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCXJldHVybiBrbWFsbG9jKE5fVFRZX0JVRl9TSVpFLCBwcmlvKTsKKwllbHNlCisJCXJldHVybiAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShwcmlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQorCQlrZnJlZShidWYpOworCWVsc2UKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3R0eV9xdWV1ZV9ub2xvY2sodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHktPnJlYWRfY250IDwgTl9UVFlfQlVGX1NJWkUpIHsKKwkJdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfaGVhZF0gPSBjOworCQl0dHktPnJlYWRfaGVhZCA9ICh0dHktPnJlYWRfaGVhZCArIDEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQl0dHktPnJlYWRfY250Kys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3R0eV9xdWV1ZSh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKgorCSAqCVRoZSBwcm9ibGVtIG9mIHN0b21waW5nIG9uIHRoZSBidWZmZXJzIGVuZHMgaGVyZS4KKwkgKglXaHkgZGlkbid0IGFueW9uZSBzZWUgdGhpcyBvbmUgY29taW5nPyAtLUFKSworCSovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJcHV0X3R0eV9xdWV1ZV9ub2xvY2soYywgdHR5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCWNoZWNrX3VudGhyb3R0bGUJLQlhbGxvdyBuZXcgcmVjZWl2ZSBkYXRhCisgKglAdHR5OyB0dHkgZGV2aWNlCisgKgorICoJQ2hlY2sgd2hldGhlciB0byBjYWxsIHRoZSBkcml2ZXIudW50aHJvdHRsZSBmdW5jdGlvbi4KKyAqCVdlIHRlc3QgdGhlIFRUWV9USFJPVFRMRUQgYml0IGZpcnN0IHNvIHRoYXQgaXQgYWx3YXlzCisgKglpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSBkZWNpc2lvbiBhYm91dCB3aGV0aGVyCisgKglpdCBpcyB3b3J0aCBhbGxvd2luZyBtb3JlIGlucHV0IGhhcyBiZWVuIHRha2VuIGJ5IHRoZSBjYWxsZXIuCisgKglDYW4gc2xlZXAsIG1heSBiZSBjYWxsZWQgdW5kZXIgdGhlIGF0b21pY19yZWFkIHNlbWFwaG9yZSBidXQKKyAqCXRoaXMgaXMgbm90IGd1YXJhbnRlZWQuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGNoZWNrX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJaWYgKHR0eS0+Y291bnQgJiYKKwkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSAmJiAKKwkgICAgdHR5LT5kcml2ZXItPnVudGhyb3R0bGUpCisJCXR0eS0+ZHJpdmVyLT51bnRocm90dGxlKHR0eSk7Cit9CisKKy8qKgorICoJcmVzZXRfYnVmZmVyX2ZsYWdzCS0JcmVzZXQgYnVmZmVyIHN0YXRlCisgKglAdHR5OiB0ZXJtaW5hbCB0byByZXNldAorICoKKyAqCVJlc2V0IHRoZSByZWFkIGJ1ZmZlciBjb3VudGVycywgY2xlYXIgdGhlIGZsYWdzLCAKKyAqCWFuZCBtYWtlIHN1cmUgdGhlIGRyaXZlciBpcyB1bnRocm90dGxlZC4gQ2FsbGVkCisgKglmcm9tIG5fdHR5X29wZW4oKSBhbmQgbl90dHlfZmx1c2hfYnVmZmVyKCkuCisgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2J1ZmZlcl9mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwl0dHktPnJlYWRfaGVhZCA9IHR0eS0+cmVhZF90YWlsID0gdHR5LT5yZWFkX2NudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwl0dHktPmNhbm9uX2hlYWQgPSB0dHktPmNhbm9uX2RhdGEgPSB0dHktPmVyYXNpbmcgPSAwOworCW1lbXNldCgmdHR5LT5yZWFkX2ZsYWdzLCAwLCBzaXplb2YgdHR5LT5yZWFkX2ZsYWdzKTsKKwljaGVja191bnRocm90dGxlKHR0eSk7Cit9CisKKy8qKgorICoJbl90dHlfZmx1c2hfYnVmZmVyCS0JY2xlYW4gaW5wdXQgcXVldWUKKyAqCUB0dHk6CXRlcm1pbmFsIGRldmljZQorICoKKyAqCUZsdXNoIHRoZSBpbnB1dCBidWZmZXIuIENhbGxlZCB3aGVuIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMKKyAqCWJlaW5nIGNsb3NlZCwgd2hlbiB0aGUgdHR5IGxheWVyIHdhbnRzIHRoZSBidWZmZXIgZmx1c2hlZCAoZWcKKyAqCWF0IGhhbmd1cCkgb3Igd2hlbiB0aGUgTl9UVFkgbGluZSBkaXNjaXBsaW5lIGludGVybmFsbHkgaGFzIHRvCisgKgljbGVhbiB0aGUgcGVuZGluZyBxdWV1ZSAoZm9yIGV4YW1wbGUgc29tZSBzaWduYWxzKS4KKyAqCisgKglGSVhNRTogdHR5LT5jdHJsX3N0YXR1cyBpcyBub3Qgc3BpbmxvY2tlZCBhbmQgcmVsaWVzIG9uCisgKglsb2NrX2tlcm5lbCgpIHN0aWxsLgorICovCisgCitzdGF0aWMgdm9pZCBuX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJLyogY2xlYXIgZXZlcnl0aGluZyBhbmQgdW50aHJvdHRsZSB0aGUgZHJpdmVyICovCisJcmVzZXRfYnVmZmVyX2ZsYWdzKHR0eSk7CisJCisJaWYgKCF0dHktPmxpbmspCisJCXJldHVybjsKKworCWlmICh0dHktPmxpbmstPnBhY2tldCkgeworCQl0dHktPmN0cmxfc3RhdHVzIHw9IFRJT0NQS1RfRkxVU0hSRUFEOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwl9Cit9CisKKy8qKgorICoJbl90dHlfY2hhcnNfaW5fYnVmZmVyCS0JcmVwb3J0IGF2YWlsYWJsZSBieXRlcworICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCVJlcG9ydCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnVmZmVyZWQgdG8gYmUgZGVsaXZlcmVkIHRvIHVzZXIKKyAqCWF0IHRoaXMgaW5zdGFudCBpbiB0aW1lLiAKKyAqLworIAorc3RhdGljIHNzaXplX3Qgbl90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzc2l6ZV90IG4gPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHktPmljYW5vbikgeworCQluID0gdHR5LT5yZWFkX2NudDsKKwl9IGVsc2UgaWYgKHR0eS0+Y2Fub25fZGF0YSkgeworCQluID0gKHR0eS0+Y2Fub25faGVhZCA+IHR0eS0+cmVhZF90YWlsKSA/CisJCQl0dHktPmNhbm9uX2hlYWQgLSB0dHktPnJlYWRfdGFpbCA6CisJCQl0dHktPmNhbm9uX2hlYWQgKyAoTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfdGFpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICoJaXNfdXRmOF9jb250aW51YXRpb24JLQl1dGY4IG11bHRpYnl0ZSBjaGVjaworICoJQGM6IGJ5dGUgdG8gY2hlY2sKKyAqCisgKglSZXR1cm5zIHRydWUgaWYgdGhlIHV0ZjggY2hhcmFjdGVyICdjJyBpcyBhIG11bHRpYnl0ZSBjb250aW51YXRpb24KKyAqCWNoYXJhY3Rlci4gV2UgdXNlIHRoaXMgdG8gY29ycmVjdGx5IGNvbXB1dGUgdGhlIG9uIHNjcmVlbiBzaXplCisgKglvZiB0aGUgY2hhcmFjdGVyIHdoZW4gcHJpbnRpbmcKKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNfdXRmOF9jb250aW51YXRpb24odW5zaWduZWQgY2hhciBjKQoreworCXJldHVybiAoYyAmIDB4YzApID09IDB4ODA7Cit9CisKKy8qKgorICoJaXNfY29udGludWF0aW9uCQktCW11bHRpYnl0ZSBjaGVjaworICoJQGM6IGJ5dGUgdG8gY2hlY2sKKyAqCisgKglSZXR1cm5zIHRydWUgaWYgdGhlIHV0ZjggY2hhcmFjdGVyICdjJyBpcyBhIG11bHRpYnl0ZSBjb250aW51YXRpb24KKyAqCWNoYXJhY3RlciBhbmQgdGhlIHRlcm1pbmFsIGlzIGluIHVuaWNvZGUgbW9kZS4KKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNfY29udGludWF0aW9uKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gSV9JVVRGOCh0dHkpICYmIGlzX3V0ZjhfY29udGludWF0aW9uKGMpOworfQorCisvKioKKyAqCW9wb3N0CQkJLQlvdXRwdXQgcG9zdCBwcm9jZXNzb3IKKyAqCUBjOiBjaGFyYWN0ZXIgKG9yIHBhcnRpYWwgdW5pY29kZSBzeW1ib2wpCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCisgKglQZXJmb3JtIE9QT1NUIHByb2Nlc3NpbmcuICBSZXR1cm5zIC0xIHdoZW4gdGhlIG91dHB1dCBkZXZpY2UgaXMKKyAqCWZ1bGwgYW5kIHRoZSBjaGFyYWN0ZXIgbXVzdCBiZSByZXRyaWVkLiBOb3RlIHRoYXQgTGludXggY3VycmVudGx5CisgKglpZ25vcmVzIFRBQkRMWSwgQ1JETFksIFZURExZLCBGRkRMWSBhbmQgTkxETFkuIFRoZXkgc2ltcGx5IGFyZW4ndAorICoJcmVsZXZhbnQgaW4gdGhlIHdvcmxkIHRvZGF5LiBJZiB5b3UgZXZlciBuZWVkIHRoZW0sIGFkZCB0aGVtIGhlcmUuCisgKgorICoJQ2FsbGVkIGZyb20gYm90aCB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2lkZXMgYW5kIGNhbiBiZSBjYWxsZWQKKyAqCXJlLWVudHJhbnRseS4gUmVsaWVzIG9uIGxvY2tfa2VybmVsKCkgc3RpbGwuCisgKi8KKyAKK3N0YXRpYyBpbnQgb3Bvc3QodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludAlzcGFjZSwgc3BhY2VzOworCisJc3BhY2UgPSB0dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpOworCWlmICghc3BhY2UpCisJCXJldHVybiAtMTsKKworCWlmIChPX09QT1NUKHR0eSkpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1xuJzoKKwkJCWlmIChPX09OTFJFVCh0dHkpKQorCQkJCXR0eS0+Y29sdW1uID0gMDsKKwkJCWlmIChPX09OTENSKHR0eSkpIHsKKwkJCQlpZiAoc3BhY2UgPCAyKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgJ1xyJyk7CisJCQkJdHR5LT5jb2x1bW4gPSAwOworCQkJfQorCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbjsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlpZiAoT19PTk9DUih0dHkpICYmIHR0eS0+Y29sdW1uID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoT19PQ1JOTCh0dHkpKSB7CisJCQkJYyA9ICdcbic7CisJCQkJaWYgKE9fT05MUkVUKHR0eSkpCisJCQkJCXR0eS0+Y2Fub25fY29sdW1uID0gdHR5LT5jb2x1bW4gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJc3BhY2VzID0gOCAtICh0dHktPmNvbHVtbiAmIDcpOworCQkJaWYgKE9fVEFCRExZKHR0eSkgPT0gWFRBQlMpIHsKKwkJCQlpZiAoc3BhY2UgPCBzcGFjZXMpCisJCQkJCXJldHVybiAtMTsKKwkJCQl0dHktPmNvbHVtbiArPSBzcGFjZXM7CisJCQkJdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgIiAgICAgICAgIiwgc3BhY2VzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXR0eS0+Y29sdW1uICs9IHNwYWNlczsKKwkJCWJyZWFrOworCQljYXNlICdcYic6CisJCQlpZiAodHR5LT5jb2x1bW4gPiAwKQorCQkJCXR0eS0+Y29sdW1uLS07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChPX09MQ1VDKHR0eSkpCisJCQkJYyA9IHRvdXBwZXIoYyk7CisJCQlpZiAoIWlzY250cmwoYykgJiYgIWlzX2NvbnRpbnVhdGlvbihjLCB0dHkpKQorCQkJCXR0eS0+Y29sdW1uKys7CisJCQlicmVhazsKKwkJfQorCX0KKwl0dHktPmRyaXZlci0+cHV0X2NoYXIodHR5LCBjKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglvcG9zdF9ibG9jawkJLQlibG9jayBwb3N0cHJvY2VzcworICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAaW5idWY6IHVzZXIgYnVmZmVyCisgKglAbnI6IG51bWJlciBvZiBieXRlcworICoKKyAqCVRoaXMgcGF0aCBpcyB1c2VkIHRvIHNwZWVkIHVwIGJsb2NrIGNvbnNvbGUgd3JpdGVzLCBhbW9uZyBvdGhlcgorICoJdGhpbmdzIHdoZW4gcHJvY2Vzc2luZyBibG9ja3Mgb2Ygb3V0cHV0IGRhdGEuIEl0IGhhbmRsZXMgb25seQorICoJdGhlIHNpbXBsZSBjYXNlcyBub3JtYWxseSBmb3VuZCBhbmQgaGVscHMgdG8gZ2VuZXJhdGUgYmxvY2tzIG9mCisgKglzeW1ib2xzIGZvciB0aGUgY29uc29sZSBkcml2ZXIgYW5kIHRodXMgaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqCisgKglDYWxsZWQgZnJvbSB3cml0ZV9jaGFuIHVuZGVyIHRoZSB0dHkgbGF5ZXIgd3JpdGUgbG9jay4KKyAqLworIAorc3RhdGljIHNzaXplX3Qgb3Bvc3RfYmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJaW50CXNwYWNlOworCWludCAJaTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcDsKKworCXNwYWNlID0gdHR5LT5kcml2ZXItPndyaXRlX3Jvb20odHR5KTsKKwlpZiAoIXNwYWNlKQorCQlyZXR1cm4gMDsKKwlpZiAobnIgPiBzcGFjZSkKKwkJbnIgPSBzcGFjZTsKKworCWZvciAoaSA9IDAsIGNwID0gYnVmOyBpIDwgbnI7IGkrKywgY3ArKykgeworCQlzd2l0Y2ggKCpjcCkgeworCQljYXNlICdcbic6CisJCQlpZiAoT19PTkxSRVQodHR5KSkKKwkJCQl0dHktPmNvbHVtbiA9IDA7CisJCQlpZiAoT19PTkxDUih0dHkpKQorCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbjsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlpZiAoT19PTk9DUih0dHkpICYmIHR0eS0+Y29sdW1uID09IDApCisJCQkJZ290byBicmVha19vdXQ7CisJCQlpZiAoT19PQ1JOTCh0dHkpKQorCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJZ290byBicmVha19vdXQ7CisJCWNhc2UgJ1xiJzoKKwkJCWlmICh0dHktPmNvbHVtbiA+IDApCisJCQkJdHR5LT5jb2x1bW4tLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKE9fT0xDVUModHR5KSkKKwkJCQlnb3RvIGJyZWFrX291dDsKKwkJCWlmICghaXNjbnRybCgqY3ApKQorCQkJCXR0eS0+Y29sdW1uKys7CisJCQlicmVhazsKKwkJfQorCX0KK2JyZWFrX291dDoKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKKwlpID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYnVmLCBpKTsJCisJcmV0dXJuIGk7Cit9CisKKworLyoqCisgKglwdXRfY2hhcgktCXdyaXRlIGNoYXJhY3RlciB0byBkcml2ZXIKKyAqCUBjOiBjaGFyYWN0ZXIgKG9yIHBhcnQgb2YgdW5pY29kZSBzeW1ib2wpCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCisgKglRdWV1ZSBhIGJ5dGUgdG8gdGhlIGRyaXZlciBsYXllciBmb3Igb3V0cHV0CisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfY2hhcih1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgYyk7Cit9CisKKy8qKgorICoJZWNob19jaGFyCS0JZWNobyBjaGFyYWN0ZXJzCisgKglAYzogdW5pY29kZSBieXRlIHRvIGVjaG8KKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoKKyAqCUVjaG8gdXNlciBpbnB1dCBiYWNrIG9udG8gdGhlIHNjcmVlbi4gVGhpcyBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4gCisgKglMX0VDSE8odHR5KSBpcyB0cnVlLiBDYWxsZWQgZnJvbSB0aGUgZHJpdmVyIHJlY2VpdmVfYnVmIHBhdGguCisgKi8KKworc3RhdGljIHZvaWQgZWNob19jaGFyKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoTF9FQ0hPQ1RMKHR0eSkgJiYgaXNjbnRybChjKSAmJiBjICE9ICdcdCcpIHsKKwkJcHV0X2NoYXIoJ14nLCB0dHkpOworCQlwdXRfY2hhcihjIF4gMDEwMCwgdHR5KTsKKwkJdHR5LT5jb2x1bW4gKz0gMjsKKwl9IGVsc2UKKwkJb3Bvc3QoYywgdHR5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9lcmFzaW5nKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eS0+ZXJhc2luZykgeworCQlwdXRfY2hhcignLycsIHR0eSk7CisJCXR0eS0+Y29sdW1uKys7CisJCXR0eS0+ZXJhc2luZyA9IDA7CisJfQorfQorCisvKioKKyAqCWVyYXNlcgkJLQloYW5kbGUgZXJhc2UgZnVuY3Rpb24KKyAqCUBjOiBjaGFyYWN0ZXIgaW5wdXQKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoKKyAqCVBlcmZvcm0gZXJhc2UgYW5kIG5lY2Nlc3Nhcnkgb3V0cHV0IHdoZW4gYW4gZXJhc2UgY2hhcmFjdGVyIGlzCisgKglwcmVzZW50IGluIHRoZSBzdHJlYW0gZnJvbSB0aGUgZHJpdmVyIGxheWVyLiBIYW5kbGVzIHRoZSBjb21wbGV4aXRpZXMKKyAqCW9mIFVURi04IG11bHRpYnl0ZSBzeW1ib2xzLgorICovCisgCitzdGF0aWMgdm9pZCBlcmFzZXIodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWVudW0geyBFUkFTRSwgV0VSQVNFLCBLSUxMIH0ga2lsbF90eXBlOworCWludCBoZWFkLCBzZWVuX2FsbnVtcywgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodHR5LT5yZWFkX2hlYWQgPT0gdHR5LT5jYW5vbl9oZWFkKSB7CisJCS8qIG9wb3N0KCdcYScsIHR0eSk7ICovCQkvKiB3aGF0IGRvIHlvdSB0aGluaz8gKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoYyA9PSBFUkFTRV9DSEFSKHR0eSkpCisJCWtpbGxfdHlwZSA9IEVSQVNFOworCWVsc2UgaWYgKGMgPT0gV0VSQVNFX0NIQVIodHR5KSkKKwkJa2lsbF90eXBlID0gV0VSQVNFOworCWVsc2UgeworCQlpZiAoIUxfRUNITyh0dHkpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXR0eS0+cmVhZF9jbnQgLT0gKCh0dHktPnJlYWRfaGVhZCAtIHR0eS0+Y2Fub25faGVhZCkgJgorCQkJCQkgIChOX1RUWV9CVUZfU0laRSAtIDEpKTsKKwkJCXR0eS0+cmVhZF9oZWFkID0gdHR5LT5jYW5vbl9oZWFkOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIUxfRUNIT0sodHR5KSB8fCAhTF9FQ0hPS0UodHR5KSB8fCAhTF9FQ0hPRSh0dHkpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXR0eS0+cmVhZF9jbnQgLT0gKCh0dHktPnJlYWRfaGVhZCAtIHR0eS0+Y2Fub25faGVhZCkgJgorCQkJCQkgIChOX1RUWV9CVUZfU0laRSAtIDEpKTsKKwkJCXR0eS0+cmVhZF9oZWFkID0gdHR5LT5jYW5vbl9oZWFkOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJCQllY2hvX2NoYXIoS0lMTF9DSEFSKHR0eSksIHR0eSk7CisJCQkvKiBBZGQgYSBuZXdsaW5lIGlmIEVDSE9LIGlzIG9uIGFuZCBFQ0hPS0UgaXMgb2ZmLiAqLworCQkJaWYgKExfRUNIT0sodHR5KSkKKwkJCQlvcG9zdCgnXG4nLCB0dHkpOworCQkJcmV0dXJuOworCQl9CisJCWtpbGxfdHlwZSA9IEtJTEw7CisJfQorCisJc2Vlbl9hbG51bXMgPSAwOworCXdoaWxlICh0dHktPnJlYWRfaGVhZCAhPSB0dHktPmNhbm9uX2hlYWQpIHsKKwkJaGVhZCA9IHR0eS0+cmVhZF9oZWFkOworCisJCS8qIGVyYXNlIGEgc2luZ2xlIHBvc3NpYmx5IG11bHRpYnl0ZSBjaGFyYWN0ZXIgKi8KKwkJZG8geworCQkJaGVhZCA9IChoZWFkIC0gMSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCQljID0gdHR5LT5yZWFkX2J1ZltoZWFkXTsKKwkJfSB3aGlsZSAoaXNfY29udGludWF0aW9uKGMsIHR0eSkgJiYgaGVhZCAhPSB0dHktPmNhbm9uX2hlYWQpOworCisJCS8qIGRvIG5vdCBwYXJ0aWFsbHkgZXJhc2UgKi8KKwkJaWYgKGlzX2NvbnRpbnVhdGlvbihjLCB0dHkpKQorCQkJYnJlYWs7CisKKwkJaWYgKGtpbGxfdHlwZSA9PSBXRVJBU0UpIHsKKwkJCS8qIEVxdWl2YWxlbnQgdG8gQlNEJ3MgQUxUV0VSQVNFLiAqLworCQkJaWYgKGlzYWxudW0oYykgfHwgYyA9PSAnXycpCisJCQkJc2Vlbl9hbG51bXMrKzsKKwkJCWVsc2UgaWYgKHNlZW5fYWxudW1zKQorCQkJCWJyZWFrOworCQl9CisJCWNudCA9ICh0dHktPnJlYWRfaGVhZCAtIGhlYWQpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJdHR5LT5yZWFkX2hlYWQgPSBoZWFkOworCQl0dHktPnJlYWRfY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJaWYgKExfRUNITyh0dHkpKSB7CisJCQlpZiAoTF9FQ0hPUFJUKHR0eSkpIHsKKwkJCQlpZiAoIXR0eS0+ZXJhc2luZykgeworCQkJCQlwdXRfY2hhcignXFwnLCB0dHkpOworCQkJCQl0dHktPmNvbHVtbisrOworCQkJCQl0dHktPmVyYXNpbmcgPSAxOworCQkJCX0KKwkJCQkvKiBpZiBjbnQgPiAxLCBvdXRwdXQgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciAqLworCQkJCWVjaG9fY2hhcihjLCB0dHkpOworCQkJCXdoaWxlICgtLWNudCA+IDApIHsKKwkJCQkJaGVhZCA9IChoZWFkKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQkJCQlwdXRfY2hhcih0dHktPnJlYWRfYnVmW2hlYWRdLCB0dHkpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoa2lsbF90eXBlID09IEVSQVNFICYmICFMX0VDSE9FKHR0eSkpIHsKKwkJCQllY2hvX2NoYXIoRVJBU0VfQ0hBUih0dHkpLCB0dHkpOworCQkJfSBlbHNlIGlmIChjID09ICdcdCcpIHsKKwkJCQl1bnNpZ25lZCBpbnQgY29sID0gdHR5LT5jYW5vbl9jb2x1bW47CisJCQkJdW5zaWduZWQgbG9uZyB0YWlsID0gdHR5LT5jYW5vbl9oZWFkOworCisJCQkJLyogRmluZCB0aGUgY29sdW1uIG9mIHRoZSBsYXN0IGNoYXIuICovCisJCQkJd2hpbGUgKHRhaWwgIT0gdHR5LT5yZWFkX2hlYWQpIHsKKwkJCQkJYyA9IHR0eS0+cmVhZF9idWZbdGFpbF07CisJCQkJCWlmIChjID09ICdcdCcpCisJCQkJCQljb2wgPSAoY29sIHwgNykgKyAxOworCQkJCQllbHNlIGlmIChpc2NudHJsKGMpKSB7CisJCQkJCQlpZiAoTF9FQ0hPQ1RMKHR0eSkpCisJCQkJCQkJY29sICs9IDI7CisJCQkJCX0gZWxzZSBpZiAoIWlzX2NvbnRpbnVhdGlvbihjLCB0dHkpKQorCQkJCQkJY29sKys7CisJCQkJCXRhaWwgPSAodGFpbCsxKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkJCQl9CisKKwkJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQkJaWYgKHR0eS0+Y29sdW1uID4gMHg4MDAwMDAwMCkKKwkJCQkJdHR5LT5jb2x1bW4gPSAwOyAKKworCQkJCS8qIE5vdyBiYWNrdXAgdG8gdGhhdCBjb2x1bW4uICovCisJCQkJd2hpbGUgKHR0eS0+Y29sdW1uID4gY29sKSB7CisJCQkJCS8qIENhbid0IHVzZSBvcG9zdCBoZXJlLiAqLworCQkJCQlwdXRfY2hhcignXGInLCB0dHkpOworCQkJCQlpZiAodHR5LT5jb2x1bW4gPiAwKQorCQkJCQkJdHR5LT5jb2x1bW4tLTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChpc2NudHJsKGMpICYmIExfRUNIT0NUTCh0dHkpKSB7CisJCQkJCXB1dF9jaGFyKCdcYicsIHR0eSk7CisJCQkJCXB1dF9jaGFyKCcgJywgdHR5KTsKKwkJCQkJcHV0X2NoYXIoJ1xiJywgdHR5KTsKKwkJCQkJaWYgKHR0eS0+Y29sdW1uID4gMCkKKwkJCQkJCXR0eS0+Y29sdW1uLS07CisJCQkJfQorCQkJCWlmICghaXNjbnRybChjKSB8fCBMX0VDSE9DVEwodHR5KSkgeworCQkJCQlwdXRfY2hhcignXGInLCB0dHkpOworCQkJCQlwdXRfY2hhcignICcsIHR0eSk7CisJCQkJCXB1dF9jaGFyKCdcYicsIHR0eSk7CisJCQkJCWlmICh0dHktPmNvbHVtbiA+IDApCisJCQkJCQl0dHktPmNvbHVtbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoa2lsbF90eXBlID09IEVSQVNFKQorCQkJYnJlYWs7CisJfQorCWlmICh0dHktPnJlYWRfaGVhZCA9PSB0dHktPmNhbm9uX2hlYWQpCisJCWZpbmlzaF9lcmFzaW5nKHR0eSk7Cit9CisKKy8qKgorICoJaXNpZwkJLQloYW5kbGUgdGhlIElTSUcgb3B0aW8KKyAqCUBzaWc6IHNpZ25hbAorICoJQHR0eTogdGVybWluYWwKKyAqCUBmbHVzaDogZm9yY2UgZmx1c2gKKyAqCisgKglDYWxsZWQgd2hlbiBhIHNpZ25hbCBpcyBiZWluZyBzZW50IGR1ZSB0byB0ZXJtaW5hbCBpbnB1dC4gVGhpcworICoJbWF5IGNhdXMgdGVybWluYWwgZmx1c2hpbmcgdG8gdGFrZSBwbGFjZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1pb3MKKyAqCXNldHRpbmdzIGFuZCBjaGFyYWN0ZXIgdXNlZC4gQ2FsbGVkIGZyb20gdGhlIGRyaXZlciByZWNlaXZlX2J1ZgorICoJcGF0aCBzbyBzZXJpYWxpemVkLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgaXNpZyhpbnQgc2lnLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgZmx1c2gpCit7CisJaWYgKHR0eS0+cGdycCA+IDApCisJCWtpbGxfcGcodHR5LT5wZ3JwLCBzaWcsIDEpOworCWlmIChmbHVzaCB8fCAhTF9OT0ZMU0godHR5KSkgeworCQluX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJfQorfQorCisvKioKKyAqCW5fdHR5X3JlY2VpdmVfYnJlYWsJLQloYW5kbGUgYnJlYWsKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJQW4gUlMyMzIgYnJlYWsgZXZlbnQgaGFzIGJlZW4gaGl0IGluIHRoZSBpbmNvbWluZyBiaXRzdHJlYW0uIFRoaXMKKyAqCWNhbiBjYXVzZSBhIHZhcmlldHkgb2YgZXZlbnRzIGRlcGVuZGluZyB1cG9uIHRoZSB0ZXJtaW9zIHNldHRpbmdzLgorICoKKyAqCUNhbGxlZCBmcm9tIHRoZSByZWNlaXZlX2J1ZiBwYXRoIHNvIHNpbmdsZSB0aHJlYWRlZC4KKyAqLworIAorc3RhdGljIGlubGluZSB2b2lkIG5fdHR5X3JlY2VpdmVfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoSV9JR05CUksodHR5KSkKKwkJcmV0dXJuOworCWlmIChJX0JSS0lOVCh0dHkpKSB7CisJCWlzaWcoU0lHSU5ULCB0dHksIDEpOworCQlyZXR1cm47CisJfQorCWlmIChJX1BBUk1SSyh0dHkpKSB7CisJCXB1dF90dHlfcXVldWUoJ1wzNzcnLCB0dHkpOworCQlwdXRfdHR5X3F1ZXVlKCdcMCcsIHR0eSk7CisJfQorCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKK30KKworLyoqCisgKgluX3R0eV9yZWNlaXZlX292ZXJydW4JLQloYW5kbGUgb3ZlcnJ1biByZXBvcnRpbmcKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJRGF0YSBhcnJpdmVkIGZhc3RlciB0aGFuIHdlIGNvdWxkIHByb2Nlc3MgaXQuIFdoaWxlIHRoZSB0dHkKKyAqCWRyaXZlciBoYXMgZmxhZ2dlZCB0aGlzIHRoZSBiaXRzIHRoYXQgd2VyZSBtaXNzZWQgYXJlIGdvbmUKKyAqCWZvcmV2ZXIuCisgKgorICoJQ2FsbGVkIGZyb20gdGhlIHJlY2VpdmVfYnVmIHBhdGggc28gc2luZ2xlIHRocmVhZGVkLiBEb2VzIG5vdAorICoJbmVlZCBsb2NraW5nIGFzIG51bV9vdmVycnVuIGFuZCBvdmVycnVuX3RpbWUgYXJlIGZ1bmN0aW9uCisgKglwcml2YXRlLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9vdmVycnVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJY2hhciBidWZbNjRdOworCisJdHR5LT5udW1fb3ZlcnJ1bisrOworCWlmICh0aW1lX2JlZm9yZSh0dHktPm92ZXJydW5fdGltZSwgamlmZmllcyAtIEhaKSB8fAorCQkJdGltZV9hZnRlcih0dHktPm92ZXJydW5fdGltZSwgamlmZmllcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVkIGlucHV0IG92ZXJydW4ocylcbiIsCisJCQl0dHlfbmFtZSh0dHksIGJ1ZiksCisJCQl0dHktPm51bV9vdmVycnVuKTsKKwkJdHR5LT5vdmVycnVuX3RpbWUgPSBqaWZmaWVzOworCQl0dHktPm51bV9vdmVycnVuID0gMDsKKwl9Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9wYXJpdHlfZXJyb3IJLQllcnJvciBub3RpZmllcgorICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAYzogY2hhcmFjdGVyCisgKgorICoJUHJvY2VzcyBhIHBhcml0eSBlcnJvciBhbmQgcXVldWUgdGhlIHJpZ2h0IGRhdGEgdG8gaW5kaWNhdGUKKyAqCXRoZSBlcnJvciBjYXNlIGlmIG5lY2Nlc3NhcnkuIExvY2tpbmcgYXMgcGVyIG5fdHR5X3JlY2VpdmVfYnVmLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9wYXJpdHlfZXJyb3Ioc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJICAgICAgdW5zaWduZWQgY2hhciBjKQoreworCWlmIChJX0lHTlBBUih0dHkpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKElfUEFSTVJLKHR0eSkpIHsKKwkJcHV0X3R0eV9xdWV1ZSgnXDM3NycsIHR0eSk7CisJCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCX0gZWxzZQlpZiAoSV9JTlBDSyh0dHkpKQorCQlwdXRfdHR5X3F1ZXVlKCdcMCcsIHR0eSk7CisJZWxzZQorCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9jaGFyCS0JcGVyZm9ybSBwcm9jZXNzaW5nCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBjOiBjaGFyYWN0ZXIKKyAqCisgKglQcm9jZXNzIGFuIGluZGl2aWR1YWwgY2hhcmFjdGVyIG9mIGlucHV0IHJlY2VpdmVkIGZyb20gdGhlIGRyaXZlci4KKyAqCVRoaXMgaXMgc2VyaWFsaXplZCB3aXRoIHJlc3BlY3QgdG8gaXRzZWxmIGJ5IHRoZSBydWxlcyBmb3IgdGhlIAorICoJZHJpdmVyIGFib3ZlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuX3R0eV9yZWNlaXZlX2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodHR5LT5yYXcpIHsKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCQlyZXR1cm47CisJfQorCQorCWlmICh0dHktPnN0b3BwZWQgJiYgIXR0eS0+Zmxvd19zdG9wcGVkICYmCisJICAgIElfSVhPTih0dHkpICYmIElfSVhBTlkodHR5KSkgeworCQlzdGFydF90dHkodHR5KTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoSV9JU1RSSVAodHR5KSkKKwkJYyAmPSAweDdmOworCWlmIChJX0lVQ0xDKHR0eSkgJiYgTF9JRVhURU4odHR5KSkKKwkJYz10b2xvd2VyKGMpOworCisJaWYgKHR0eS0+Y2xvc2luZykgeworCQlpZiAoSV9JWE9OKHR0eSkpIHsKKwkJCWlmIChjID09IFNUQVJUX0NIQVIodHR5KSkKKwkJCQlzdGFydF90dHkodHR5KTsKKwkJCWVsc2UgaWYgKGMgPT0gU1RPUF9DSEFSKHR0eSkpCisJCQkJc3RvcF90dHkodHR5KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyBMTkVYVCwgb3Igd2Uga25vdyB0aGF0IHRoaXMKKwkgKiBjaGFyYWN0ZXIgaXMgbm90IG9uZSBvZiB0aGUgY2hhcmFjdGVycyB0aGF0IHdlJ2xsIGhhdmUgdG8KKwkgKiBoYW5kbGUgc3BlY2lhbGx5LCBkbyBzaG9ydGN1dCBwcm9jZXNzaW5nIHRvIHNwZWVkIHRoaW5ncworCSAqIHVwLgorCSAqLworCWlmICghdGVzdF9iaXQoYywgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKSB8fCB0dHktPmxuZXh0KSB7CisJCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJCXR0eS0+bG5leHQgPSAwOworCQlpZiAoTF9FQ0hPKHR0eSkpIHsKKwkJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCQlwdXRfY2hhcignXGEnLCB0dHkpOyAvKiBiZWVwIGlmIG5vIHNwYWNlICovCisJCQkJcmV0dXJuOworCQkJfQorCQkJLyogUmVjb3JkIHRoZSBjb2x1bW4gb2YgZmlyc3QgY2Fub24gY2hhci4gKi8KKwkJCWlmICh0dHktPmNhbm9uX2hlYWQgPT0gdHR5LT5yZWFkX2hlYWQpCisJCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbjsKKwkJCWVjaG9fY2hhcihjLCB0dHkpOworCQl9CisJCWlmIChJX1BBUk1SSyh0dHkpICYmIGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykKKwkJCXB1dF90dHlfcXVldWUoYywgdHR5KTsKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCQlyZXR1cm47CisJfQorCQkKKwlpZiAoYyA9PSAnXHInKSB7CisJCWlmIChJX0lHTkNSKHR0eSkpCisJCQlyZXR1cm47CisJCWlmIChJX0lDUk5MKHR0eSkpCisJCQljID0gJ1xuJzsKKwl9IGVsc2UgaWYgKGMgPT0gJ1xuJyAmJiBJX0lOTENSKHR0eSkpCisJCWMgPSAnXHInOworCWlmIChJX0lYT04odHR5KSkgeworCQlpZiAoYyA9PSBTVEFSVF9DSEFSKHR0eSkpIHsKKwkJCXN0YXJ0X3R0eSh0dHkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09IFNUT1BfQ0hBUih0dHkpKSB7CisJCQlzdG9wX3R0eSh0dHkpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChMX0lTSUcodHR5KSkgeworCQlpbnQgc2lnbmFsOworCQlzaWduYWwgPSBTSUdJTlQ7CisJCWlmIChjID09IElOVFJfQ0hBUih0dHkpKQorCQkJZ290byBzZW5kX3NpZ25hbDsKKwkJc2lnbmFsID0gU0lHUVVJVDsKKwkJaWYgKGMgPT0gUVVJVF9DSEFSKHR0eSkpCisJCQlnb3RvIHNlbmRfc2lnbmFsOworCQlzaWduYWwgPSBTSUdUU1RQOworCQlpZiAoYyA9PSBTVVNQX0NIQVIodHR5KSkgeworc2VuZF9zaWduYWw6CisJCQlpc2lnKHNpZ25hbCwgdHR5LCAwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAodHR5LT5pY2Fub24pIHsKKwkJaWYgKGMgPT0gRVJBU0VfQ0hBUih0dHkpIHx8IGMgPT0gS0lMTF9DSEFSKHR0eSkgfHwKKwkJICAgIChjID09IFdFUkFTRV9DSEFSKHR0eSkgJiYgTF9JRVhURU4odHR5KSkpIHsKKwkJCWVyYXNlcihjLCB0dHkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09IExORVhUX0NIQVIodHR5KSAmJiBMX0lFWFRFTih0dHkpKSB7CisJCQl0dHktPmxuZXh0ID0gMTsKKwkJCWlmIChMX0VDSE8odHR5KSkgeworCQkJCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJCQkJaWYgKExfRUNIT0NUTCh0dHkpKSB7CisJCQkJCXB1dF9jaGFyKCdeJywgdHR5KTsKKwkJCQkJcHV0X2NoYXIoJ1xiJywgdHR5KTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGMgPT0gUkVQUklOVF9DSEFSKHR0eSkgJiYgTF9FQ0hPKHR0eSkgJiYKKwkJICAgIExfSUVYVEVOKHR0eSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgdGFpbCA9IHR0eS0+Y2Fub25faGVhZDsKKworCQkJZmluaXNoX2VyYXNpbmcodHR5KTsKKwkJCWVjaG9fY2hhcihjLCB0dHkpOworCQkJb3Bvc3QoJ1xuJywgdHR5KTsKKwkJCXdoaWxlICh0YWlsICE9IHR0eS0+cmVhZF9oZWFkKSB7CisJCQkJZWNob19jaGFyKHR0eS0+cmVhZF9idWZbdGFpbF0sIHR0eSk7CisJCQkJdGFpbCA9ICh0YWlsKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlmIChMX0VDSE8odHR5KSB8fCBMX0VDSE9OTCh0dHkpKSB7CisJCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkgeworCQkJCQlwdXRfY2hhcignXGEnLCB0dHkpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCW9wb3N0KCdcbicsIHR0eSk7CisJCQl9CisJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOworCQl9CisJCWlmIChjID09IEVPRl9DSEFSKHR0eSkpIHsKKwkJICAgICAgICBpZiAodHR5LT5jYW5vbl9oZWFkICE9IHR0eS0+cmVhZF9oZWFkKQorCQkJICAgICAgICBzZXRfYml0KFRUWV9QVVNILCAmdHR5LT5mbGFncyk7CisJCQljID0gX19ESVNBQkxFRF9DSEFSOworCQkJZ290byBoYW5kbGVfbmV3bGluZTsKKwkJfQorCQlpZiAoKGMgPT0gRU9MX0NIQVIodHR5KSkgfHwKKwkJICAgIChjID09IEVPTDJfQ0hBUih0dHkpICYmIExfSUVYVEVOKHR0eSkpKSB7CisJCQkvKgorCQkJICogWFhYIGFyZSBFT0xfQ0hBUiBhbmQgRU9MMl9DSEFSIGVjaG9lZD8hPworCQkJICovCisJCQlpZiAoTF9FQ0hPKHR0eSkpIHsKKwkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKSB7CisJCQkJCXB1dF9jaGFyKCdcYScsIHR0eSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyogUmVjb3JkIHRoZSBjb2x1bW4gb2YgZmlyc3QgY2Fub24gY2hhci4gKi8KKwkJCQlpZiAodHR5LT5jYW5vbl9oZWFkID09IHR0eS0+cmVhZF9oZWFkKQorCQkJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJCWVjaG9fY2hhcihjLCB0dHkpOworCQkJfQorCQkJLyoKKwkJCSAqIFhYWCBkb2VzIFBBUk1SSyBkb3VibGluZyBoYXBwZW4gZm9yCisJCQkgKiBFT0xfQ0hBUiBhbmQgRU9MMl9DSEFSPworCQkJICovCisJCQlpZiAoSV9QQVJNUksodHR5KSAmJiBjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpCisJCQkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCisJCWhhbmRsZV9uZXdsaW5lOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCQlzZXRfYml0KHR0eS0+cmVhZF9oZWFkLCB0dHktPnJlYWRfZmxhZ3MpOworCQkJcHV0X3R0eV9xdWV1ZV9ub2xvY2soYywgdHR5KTsKKwkJCXR0eS0+Y2Fub25faGVhZCA9IHR0eS0+cmVhZF9oZWFkOworCQkJdHR5LT5jYW5vbl9kYXRhKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpKQorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5yZWFkX3dhaXQpOworCQkJcmV0dXJuOworCQl9CisJfQorCQorCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJaWYgKExfRUNITyh0dHkpKSB7CisJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCXB1dF9jaGFyKCdcYScsIHR0eSk7IC8qIGJlZXAgaWYgbm8gc3BhY2UgKi8KKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYyA9PSAnXG4nKQorCQkJb3Bvc3QoJ1xuJywgdHR5KTsKKwkJZWxzZSB7CisJCQkvKiBSZWNvcmQgdGhlIGNvbHVtbiBvZiBmaXJzdCBjYW5vbiBjaGFyLiAqLworCQkJaWYgKHR0eS0+Y2Fub25faGVhZCA9PSB0dHktPnJlYWRfaGVhZCkKKwkJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJZWNob19jaGFyKGMsIHR0eSk7CisJCX0KKwl9CisKKwlpZiAoSV9QQVJNUksodHR5KSAmJiBjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpCisJCXB1dF90dHlfcXVldWUoYywgdHR5KTsKKworCXB1dF90dHlfcXVldWUoYywgdHR5KTsKK30JCisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9yb29tCS0JcmVjZWl2ZSBzcGFjZQorICoJQHR0eTogdGVybWluYWwKKyAqCisgKglDYWxsZWQgYnkgdGhlIGRyaXZlciB0byBmaW5kIG91dCBob3cgbXVjaCBkYXRhIGl0IGlzCisgKglwZXJtaXR0ZWQgdG8gZmVlZCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIHdpdGhvdXQgYW55IGJlaW5nIGxvc3QKKyAqCWFuZCB0aHVzIHRvIG1hbmFnZSBmbG93IGNvbnRyb2wuIE5vdCBzZXJpYWxpemVkLiBBbnN3ZXJzIGZvciB0aGUKKyAqCSJpbnN0YW50Ii4KKyAqLworIAorc3RhdGljIGludCBuX3R0eV9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQJbGVmdCA9IE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2NudCAtIDE7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBpbnB1dCBjYW5vbmljYWxpemF0aW9uLCBhbmQgdGhlcmUgYXJlIG5vCisJICogcGVuZGluZyBuZXdsaW5lcywgbGV0IGNoYXJhY3RlcnMgdGhyb3VnaCB3aXRob3V0IGxpbWl0LCBzbworCSAqIHRoYXQgZXJhc2UgY2hhcmFjdGVycyB3aWxsIGJlIGhhbmRsZWQuICBPdGhlciBleGNlc3MKKwkgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgYmVlcGVkLgorCSAqLworCWlmICh0dHktPmljYW5vbiAmJiAhdHR5LT5jYW5vbl9kYXRhKQorCQlyZXR1cm4gTl9UVFlfQlVGX1NJWkU7CisKKwlpZiAobGVmdCA+IDApCisJCXJldHVybiBsZWZ0OworCXJldHVybiAwOworfQorCisvKioKKyAqCW5fdHR5X3dyaXRlX3dha2V1cAktCWFzeW5jaHJvbm91cyBJL08gbm90aWZpZXIKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCisgKglSZXF1aXJlZCBmb3IgdGhlIHB0eXMsIHNlcmlhbCBkcml2ZXIgZXRjLiBzaW5jZSBwcm9jZXNzZXMKKyAqCXRoYXQgYXR0YWNoIHRoZW1zZWx2ZXMgdG8gdGhlIG1hc3RlciBhbmQgcmVseSBvbiBBU1lOQworICoJSU8gbXVzdCBiZSB3b2tlbiB1cAorICovCisKK3N0YXRpYyB2b2lkIG5fdHR5X3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHktPmZhc3luYykKKwl7CisgCQlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9PVVQpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9idWYJLQlkYXRhIHJlY2VpdmUKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoJQGNwOiBidWZmZXIKKyAqCUBmcDogZmxhZyBidWZmZXIKKyAqCUBjb3VudDogY2hhcmFjdGVycworICoKKyAqCUNhbGxlZCBieSB0aGUgdGVybWluYWwgZHJpdmVyIHdoZW4gYSBibG9jayBvZiBjaGFyYWN0ZXJzIGhhcworICoJYmVlbiByZWNlaXZlZC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHNvZnQgY29udGV4dHMKKyAqCW5vdCBmcm9tIGludGVycnVwdCBjb250ZXh0LiBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcKKyAqCWNhbGxzIG9uZSBhdCBhIHRpbWUgYW5kIGluIG9yZGVyIChvciB1c2luZyBmbHVzaF90b19sZGlzYykKKyAqLworIAorc3RhdGljIHZvaWQgbl90dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJY2hhciAqZiwgZmxhZ3MgPSBUVFlfTk9STUFMOworCWludAlpOworCWNoYXIJYnVmWzY0XTsKKwl1bnNpZ25lZCBsb25nIGNwdWZsYWdzOworCisJaWYgKCF0dHktPnJlYWRfYnVmKQorCQlyZXR1cm47CisKKwlpZiAodHR5LT5yZWFsX3JhdykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKKwkJaSA9IG1pbihOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9jbnQsCisJCQlOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9oZWFkKTsKKwkJaSA9IG1pbihjb3VudCwgaSk7CisJCW1lbWNweSh0dHktPnJlYWRfYnVmICsgdHR5LT5yZWFkX2hlYWQsIGNwLCBpKTsKKwkJdHR5LT5yZWFkX2hlYWQgPSAodHR5LT5yZWFkX2hlYWQgKyBpKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkJdHR5LT5yZWFkX2NudCArPSBpOworCQljcCArPSBpOworCQljb3VudCAtPSBpOworCisJCWkgPSBtaW4oTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250LAorCQkJTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfaGVhZCk7CisJCWkgPSBtaW4oY291bnQsIGkpOworCQltZW1jcHkodHR5LT5yZWFkX2J1ZiArIHR0eS0+cmVhZF9oZWFkLCBjcCwgaSk7CisJCXR0eS0+cmVhZF9oZWFkID0gKHR0eS0+cmVhZF9oZWFkICsgaSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCXR0eS0+cmVhZF9jbnQgKz0gaTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKKwl9IGVsc2UgeworCQlmb3IgKGk9Y291bnQsIHAgPSBjcCwgZiA9IGZwOyBpOyBpLS0sIHArKykgeworCQkJaWYgKGYpCisJCQkJZmxhZ3MgPSAqZisrOworCQkJc3dpdGNoIChmbGFncykgeworCQkJY2FzZSBUVFlfTk9STUFMOgorCQkJCW5fdHR5X3JlY2VpdmVfY2hhcih0dHksICpwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVFRZX0JSRUFLOgorCQkJCW5fdHR5X3JlY2VpdmVfYnJlYWsodHR5KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVFRZX1BBUklUWToKKwkJCWNhc2UgVFRZX0ZSQU1FOgorCQkJCW5fdHR5X3JlY2VpdmVfcGFyaXR5X2Vycm9yKHR0eSwgKnApOworCQkJCWJyZWFrOworCQkJY2FzZSBUVFlfT1ZFUlJVTjoKKwkJCQluX3R0eV9yZWNlaXZlX292ZXJydW4odHR5KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCIlczogdW5rbm93biBmbGFnICVkXG4iLAorCQkJCSAgICAgICB0dHlfbmFtZSh0dHksIGJ1ZiksIGZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorCQkJdHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKHR0eSk7CisJfQorCisJaWYgKCF0dHktPmljYW5vbiAmJiAodHR5LT5yZWFkX2NudCA+PSB0dHktPm1pbmltdW1fdG9fd2FrZSkpIHsKKwkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSByZW1haW5pbmcgcm9vbSBmb3IgdGhlIGlucHV0IGNhbm9uaWNhbGl6YXRpb24KKwkgKiBtb2RlLiAgV2UgZG9uJ3Qgd2FudCB0byB0aHJvdHRsZSB0aGUgZHJpdmVyIGlmIHdlJ3JlIGluCisJICogY2Fub25pY2FsIG1vZGUgYW5kIGRvbid0IGhhdmUgYSBuZXdsaW5lIHlldCEKKwkgKi8KKwlpZiAobl90dHlfcmVjZWl2ZV9yb29tKHR0eSkgPCBUVFlfVEhSRVNIT0xEX1RIUk9UVExFKSB7CisJCS8qIGNoZWNrIFRUWV9USFJPVFRMRUQgZmlyc3Qgc28gaXQgaW5kaWNhdGVzIG91ciBzdGF0ZSAqLworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpICYmCisJCSAgICB0dHktPmRyaXZlci0+dGhyb3R0bGUpCisJCQl0dHktPmRyaXZlci0+dGhyb3R0bGUodHR5KTsKKwl9Cit9CisKK2ludCBpc19pZ25vcmVkKGludCBzaWcpCit7CisJcmV0dXJuIChzaWdpc21lbWJlcigmY3VycmVudC0+YmxvY2tlZCwgc2lnKSB8fAorCSAgICAgICAgY3VycmVudC0+c2lnaGFuZC0+YWN0aW9uW3NpZy0xXS5zYS5zYV9oYW5kbGVyID09IFNJR19JR04pOworfQorCisvKioKKyAqCW5fdHR5X3NldF90ZXJtaW9zCS0JdGVybWlvcyBkYXRhIGNoYW5nZWQKKyAqCUB0dHk6IHRlcm1pbmFsCisgKglAb2xkOiBwcmV2aW91cyBkYXRhCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB0dHkgbGF5ZXIgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRlcm1pb3MgZmxhZ3Mgc28KKyAqCXRoYXQgdGhlIGxpbmUgZGlzY2lwbGluZSBjYW4gcGxhbiBhaGVhZC4gVGhpcyBmdW5jdGlvbiBjYW5ub3Qgc2xlZXAKKyAqCWFuZCBpcyBwcm90ZWN0ZWQgZnJvbSByZS1lbnRyeSBieSB0aGUgdHR5IGxheWVyLiBUaGUgdXNlciBpcyAKKyAqCWd1YXJhbnRlZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIHJlLWVudGVyZWQgb3IgaW4gcHJvZ3Jlc3MKKyAqCXdoZW4gdGhlIGxkaXNjIGlzIGNsb3NlZC4KKyAqLworIAorc3RhdGljIHZvaWQgbl90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCit7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwkKKwl0dHktPmljYW5vbiA9IChMX0lDQU5PTih0dHkpICE9IDApOworCWlmICh0ZXN0X2JpdChUVFlfSFdfQ09PS19JTiwgJnR0eS0+ZmxhZ3MpKSB7CisJCXR0eS0+cmF3ID0gMTsKKwkJdHR5LT5yZWFsX3JhdyA9IDE7CisJCXJldHVybjsKKwl9CisJaWYgKElfSVNUUklQKHR0eSkgfHwgSV9JVUNMQyh0dHkpIHx8IElfSUdOQ1IodHR5KSB8fAorCSAgICBJX0lDUk5MKHR0eSkgfHwgSV9JTkxDUih0dHkpIHx8IExfSUNBTk9OKHR0eSkgfHwKKwkgICAgSV9JWE9OKHR0eSkgfHwgTF9JU0lHKHR0eSkgfHwgTF9FQ0hPKHR0eSkgfHwKKwkgICAgSV9QQVJNUksodHR5KSkgeworCQltZW1zZXQodHR5LT5wcm9jZXNzX2NoYXJfbWFwLCAwLCAyNTYvOCk7CisKKwkJaWYgKElfSUdOQ1IodHR5KSB8fCBJX0lDUk5MKHR0eSkpCisJCQlzZXRfYml0KCdccicsIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCWlmIChJX0lOTENSKHR0eSkpCisJCQlzZXRfYml0KCdcbicsIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisKKwkJaWYgKExfSUNBTk9OKHR0eSkpIHsKKwkJCXNldF9iaXQoRVJBU0VfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChLSUxMX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoRU9GX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoJ1xuJywgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoRU9MX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCWlmIChMX0lFWFRFTih0dHkpKSB7CisJCQkJc2V0X2JpdChXRVJBU0VfQ0hBUih0dHkpLAorCQkJCQl0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJCXNldF9iaXQoTE5FWFRfQ0hBUih0dHkpLAorCQkJCQl0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJCXNldF9iaXQoRU9MMl9DSEFSKHR0eSksCisJCQkJCXR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQkJaWYgKExfRUNITyh0dHkpKQorCQkJCQlzZXRfYml0KFJFUFJJTlRfQ0hBUih0dHkpLAorCQkJCQkJdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCX0KKwkJfQorCQlpZiAoSV9JWE9OKHR0eSkpIHsKKwkJCXNldF9iaXQoU1RBUlRfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChTVE9QX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJfQorCQlpZiAoTF9JU0lHKHR0eSkpIHsKKwkJCXNldF9iaXQoSU5UUl9DSEFSKHR0eSksIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQlzZXRfYml0KFFVSVRfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChTVVNQX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJfQorCQljbGVhcl9iaXQoX19ESVNBQkxFRF9DSEFSLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQl0dHktPnJhdyA9IDA7CisJCXR0eS0+cmVhbF9yYXcgPSAwOworCX0gZWxzZSB7CisJCXR0eS0+cmF3ID0gMTsKKwkJaWYgKChJX0lHTkJSSyh0dHkpIHx8ICghSV9CUktJTlQodHR5KSAmJiAhSV9QQVJNUksodHR5KSkpICYmCisJCSAgICAoSV9JR05QQVIodHR5KSB8fCAhSV9JTlBDSyh0dHkpKSAmJgorCQkgICAgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVBTF9SQVcpKQorCQkJdHR5LT5yZWFsX3JhdyA9IDE7CisJCWVsc2UKKwkJCXR0eS0+cmVhbF9yYXcgPSAwOworCX0KK30KKworLyoqCisgKgluX3R0eV9jbG9zZQkJLQljbG9zZSB0aGUgbGRpc2MgZm9yIHRoaXMgdHR5CisgKglAdHR5OiBkZXZpY2UKKyAqCisgKglDYWxsZWQgZnJvbSB0aGUgdGVybWluYWwgbGF5ZXIgd2hlbiB0aGlzIGxpbmUgZGlzY2lwbGluZSBpcyAKKyAqCWJlaW5nIHNodXQgZG93biwgZWl0aGVyIGJlY2F1c2Ugb2YgYSBjbG9zZSBvciBiZWNzdXNlIG9mIGEgCisgKglkaXNjaXBsaW5lIGNoYW5nZS4gVGhlIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZCB3aGlsZSBvdGhlcgorICoJbGRpc2MgbWV0aG9kcyBhcmUgaW4gcHJvZ3Jlc3MuCisgKi8KKyAKK3N0YXRpYyB2b2lkIG5fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJbl90dHlfZmx1c2hfYnVmZmVyKHR0eSk7CisJaWYgKHR0eS0+cmVhZF9idWYpIHsKKwkJZnJlZV9idWYodHR5LT5yZWFkX2J1Zik7CisJCXR0eS0+cmVhZF9idWYgPSBOVUxMOworCX0KK30KKworLyoqCisgKgluX3R0eV9vcGVuCQktCW9wZW4gYW4gbGRpc2MKKyAqCUB0dHk6IHRlcm1pbmFsIHRvIG9wZW4KKyAqCisgKglDYWxsZWQgd2hlbiB0aGlzIGxpbmUgZGlzY2lwbGluZSBpcyBiZWluZyBhdHRhY2hlZCB0byB0aGUgCisgKgl0ZXJtaW5hbCBkZXZpY2UuIENhbiBzbGVlcC4gQ2FsbGVkIHNlcmlhbGl6ZWQgc28gdGhhdCBubworICoJb3RoZXIgZXZlbnRzIHdpbGwgb2NjdXIgaW4gcGFyYWxsZWwuIE5vIGZ1cnRoZXIgb3BlbiB3aWxsIG9jY3VyCisgKgl1bnRpbCBhIGNsb3NlLgorICovCisKK3N0YXRpYyBpbnQgbl90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghdHR5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoaXMgb25lIGlzIHVnbHkuIEN1cnJlbnRseSBhIG1hbGxvYyBmYWlsdXJlIGhlcmUgY2FuIHBhbmljICovCisJaWYgKCF0dHktPnJlYWRfYnVmKSB7CisJCXR0eS0+cmVhZF9idWYgPSBhbGxvY19idWYoKTsKKwkJaWYgKCF0dHktPnJlYWRfYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0dHktPnJlYWRfYnVmLCAwLCBOX1RUWV9CVUZfU0laRSk7CisJcmVzZXRfYnVmZmVyX2ZsYWdzKHR0eSk7CisJdHR5LT5jb2x1bW4gPSAwOworCW5fdHR5X3NldF90ZXJtaW9zKHR0eSwgTlVMTCk7CisJdHR5LT5taW5pbXVtX3RvX3dha2UgPSAxOworCXR0eS0+Y2xvc2luZyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlucHV0X2F2YWlsYWJsZV9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBhbXQpCit7CisJaWYgKHR0eS0+aWNhbm9uKSB7CisJCWlmICh0dHktPmNhbm9uX2RhdGEpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHR0eS0+cmVhZF9jbnQgPj0gKGFtdCA/IGFtdCA6IDEpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIAljb3B5X2Zyb21fcmVhZF9idWYJLQljb3B5IHJlYWQgZGF0YSBkaXJlY3RseQorICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAYjogdXNlciBkYXRhCisgKglAbnI6IHNpemUgb2YgZGF0YQorICoKKyAqCUhlbHBlciBmdW5jdGlvbiB0byBzcGVlZCB1cCByZWFkX2NoYW4uICBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuCisgKglJQ0FOT04gaXMgb2ZmOyBpdCBjb3BpZXMgY2hhcmFjdGVycyBzdHJhaWdodCBmcm9tIHRoZSB0dHkgcXVldWUgdG8KKyAqCXVzZXIgc3BhY2UgZGlyZWN0bHkuICBJdCBjYW4gYmUgcHJvZml0YWJseSBjYWxsZWQgdHdpY2U7IG9uY2UgdG8KKyAqCWRyYWluIHRoZSBzcGFjZSBmcm9tIHRoZSB0YWlsIHBvaW50ZXIgdG8gdGhlIChwaHlzaWNhbCkgZW5kIG9mIHRoZQorICoJYnVmZmVyLCBhbmQgb25jZSB0byBkcmFpbiB0aGUgc3BhY2UgZnJvbSB0aGUgKHBoeXNpY2FsKSBiZWdpbm5pbmcgb2YKKyAqCXRoZSBidWZmZXIgdG8gaGVhZCBwb2ludGVyLgorICoKKyAqCUNhbGxlZCB1bmRlciB0aGUgdHR5LT5hdG9taWNfcmVhZCBzZW0gYW5kIHdpdGggVFRZX0RPTlRfRkxJUCBzZXQKKyAqCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfZnJvbV9yZWFkX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICoqYiwKKwkJCQkgICAgICBzaXplX3QgKm5yKQorCit7CisJaW50IHJldHZhbDsKKwlzaXplX3QgbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmV0dmFsID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwluID0gbWluKHR0eS0+cmVhZF9jbnQsIE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX3RhaWwpOworCW4gPSBtaW4oKm5yLCBuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCWlmIChuKSB7CisJCW1iKCk7CisJCXJldHZhbCA9IGNvcHlfdG9fdXNlcigqYiwgJnR0eS0+cmVhZF9idWZbdHR5LT5yZWFkX3RhaWxdLCBuKTsKKwkJbiAtPSByZXR2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQl0dHktPnJlYWRfdGFpbCA9ICh0dHktPnJlYWRfdGFpbCArIG4pICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQl0dHktPnJlYWRfY250IC09IG47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCSpiICs9IG47CisJCSpuciAtPSBuOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitleHRlcm4gc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqLGNvbnN0IGNoYXIgKixzaXplX3QsbG9mZl90ICopOworCisvKioKKyAqCWpvYl9jb250cm9sCQktCWNoZWNrIGpvYiBjb250cm9sCisgKglAdHR5OiB0dHkKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZQorICoKKyAqCVBlcmZvcm0gam9iIGNvbnRyb2wgbWFuYWdlbWVudCBjaGVja3Mgb24gdGhpcyBmaWxlL3R0eSBkZXNjcmlwdG9yCisgKglhbmQgaWYgYXBwcm9wcmlhdGUgc2VuZCBhbnkgbmVlZGVkIHNpZ25hbHMgYW5kIHJldHVybiBhIG5lZ2F0aXZlIAorICoJZXJyb3IgY29kZSBpZiBhY3Rpb24gc2hvdWxkIGJlIHRha2VuLgorICovCisgCitzdGF0aWMgaW50IGpvYl9jb250cm9sKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIEpvYiBjb250cm9sIGNoZWNrIC0tIG11c3QgYmUgZG9uZSBhdCBzdGFydCBhbmQgYWZ0ZXIKKwkgICBldmVyeSBzbGVlcCAoUE9TSVguMSA3LjEuMS40KS4gKi8KKwkvKiBOT1RFOiBub3QgeWV0IGRvbmUgYWZ0ZXIgZXZlcnkgc2xlZXAgcGVuZGluZyBhIHRob3JvdWdoCisJICAgY2hlY2sgb2YgdGhlIGxvZ2ljIG9mIHRoaXMgY2hhbmdlLiAtLSBqbGMgKi8KKwkvKiBkb24ndCBzdG9wIG9uIC9kZXYvY29uc29sZSAqLworCWlmIChmaWxlLT5mX29wLT53cml0ZSAhPSByZWRpcmVjdGVkX3R0eV93cml0ZSAmJgorCSAgICBjdXJyZW50LT5zaWduYWwtPnR0eSA9PSB0dHkpIHsKKwkJaWYgKHR0eS0+cGdycCA8PSAwKQorCQkJcHJpbnRrKCJyZWFkX2NoYW46IHR0eS0+cGdycCA8PSAwIVxuIik7CisJCWVsc2UgaWYgKHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgIT0gdHR5LT5wZ3JwKSB7CisJCQlpZiAoaXNfaWdub3JlZChTSUdUVElOKSB8fAorCQkJICAgIGlzX29ycGhhbmVkX3BncnAocHJvY2Vzc19ncm91cChjdXJyZW50KSkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlraWxsX3BnKHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIFNJR1RUSU4sIDEpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyAKKworLyoqCisgKglyZWFkX2NoYW4JCS0JcmVhZCBmdW5jdGlvbiBmb3IgdHR5CisgKglAdHR5OiB0dHkgZGV2aWNlCisgKglAZmlsZTogZmlsZSBvYmplY3QKKyAqCUBidWY6IHVzZXJzcGFjZSBidWZmZXIgcG9pbnRlcgorICoJQG5yOiBzaXplIG9mIEkvTworICoKKyAqCVBlcmZvcm0gcmVhZHMgZm9yIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlCisgKglsaW5lIGRpc2NpcGxpbmUgd2lsbCBub3QgYmUgY2xvc2VkIHVuZGVyIHVzIGJ1dCB3ZSBtYXkgZ2V0IG11bHRpcGxlCisgKglwYXJhbGxlbCByZWFkZXJzIGFuZCBtdXN0IGhhbmRsZSB0aGlzIG91cnNlbHZlcy4gV2UgbWF5IGFsc28gZ2V0CisgKglhIGhhbmd1cC4gQWx3YXlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQsIG1heSBzbGVlcC4KKyAqCisgKglUaGlzIGNvZGUgbXVzdCBiZSBzdXJlIG5ldmVyIHRvIHNsZWVwIHRocm91Z2ggYSBoYW5ndXAuCisgKi8KKyAKK3N0YXRpYyBzc2l6ZV90IHJlYWRfY2hhbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbnIpCit7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmIgPSBidWY7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGM7CisJaW50IG1pbmltdW0sIHRpbWU7CisJc3NpemVfdCByZXR2YWwgPSAwOworCXNzaXplX3Qgc2l6ZTsKKwlsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworZG9faXRfYWdhaW46CisKKwlpZiAoIXR0eS0+cmVhZF9idWYpIHsKKwkJcHJpbnRrKCJuX3R0eV9yZWFkX2NoYW46IGNhbGxlZCB3aXRoIHJlYWRfYnVmID09IE5VTEw/IT9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljID0gam9iX2NvbnRyb2wodHR5LCBmaWxlKTsKKwlpZihjIDwgMCkKKwkJcmV0dXJuIGM7CisJCisJbWluaW11bSA9IHRpbWUgPSAwOworCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwlpZiAoIXR0eS0+aWNhbm9uKSB7CisJCXRpbWUgPSAoSFogLyAxMCkgKiBUSU1FX0NIQVIodHR5KTsKKwkJbWluaW11bSA9IE1JTl9DSEFSKHR0eSk7CisJCWlmIChtaW5pbXVtKSB7CisJCQlpZiAodGltZSkKKwkJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CisJCQllbHNlIGlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpIHx8CisJCQkJICh0dHktPm1pbmltdW1fdG9fd2FrZSA+IG1pbmltdW0pKQorCQkJCXR0eS0+bWluaW11bV90b193YWtlID0gbWluaW11bTsKKwkJfSBlbHNlIHsKKwkJCXRpbWVvdXQgPSAwOworCQkJaWYgKHRpbWUpIHsKKwkJCQl0aW1lb3V0ID0gdGltZTsKKwkJCQl0aW1lID0gMDsKKwkJCX0KKwkJCXR0eS0+bWluaW11bV90b193YWtlID0gbWluaW11bSA9IDE7CisJCX0KKwl9CisKKwkvKgorCSAqCUludGVybmFsIHNlcmlhbGl6YXRpb24gb2YgcmVhZHMuCisJICovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmIChkb3duX3RyeWxvY2soJnR0eS0+YXRvbWljX3JlYWQpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfQorCWVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY19yZWFkKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJYWRkX3dhaXRfcXVldWUoJnR0eS0+cmVhZF93YWl0LCAmd2FpdCk7CisJc2V0X2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJd2hpbGUgKG5yKSB7CisJCS8qIEZpcnN0IHRlc3QgZm9yIHN0YXR1cyBjaGFuZ2UuICovCisJCWlmICh0dHktPnBhY2tldCAmJiB0dHktPmxpbmstPmN0cmxfc3RhdHVzKSB7CisJCQl1bnNpZ25lZCBjaGFyIGNzOworCQkJaWYgKGIgIT0gYnVmKQorCQkJCWJyZWFrOworCQkJY3MgPSB0dHktPmxpbmstPmN0cmxfc3RhdHVzOworCQkJdHR5LT5saW5rLT5jdHJsX3N0YXR1cyA9IDA7CisJCQlpZiAocHV0X3VzZXIoY3MsIGIrKykpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWItLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5yLS07CisJCQlicmVhazsKKwkJfQorCQkvKiBUaGlzIHN0YXRlbWVudCBtdXN0IGJlIGZpcnN0IGJlZm9yZSBjaGVja2luZyBmb3IgaW5wdXQKKwkJICAgc28gdGhhdCBhbnkgaW50ZXJydXB0IHdpbGwgc2V0IHRoZSBzdGF0ZSBiYWNrIHRvCisJCSAgIFRBU0tfUlVOTklORy4gKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCisJCWlmICgoKG1pbmltdW0gLSAoYiAtIGJ1ZikpIDwgdHR5LT5taW5pbXVtX3RvX3dha2UpICYmCisJCSAgICAoKG1pbmltdW0gLSAoYiAtIGJ1ZikpID49IDEpKQorCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSAobWluaW11bSAtIChiIC0gYnVmKSk7CisJCQorCQlpZiAoIWlucHV0X2F2YWlsYWJsZV9wKHR0eSwgMCkpIHsKKwkJCWlmICh0ZXN0X2JpdChUVFlfT1RIRVJfQ0xPU0VELCAmdHR5LT5mbGFncykpIHsKKwkJCQlyZXR2YWwgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpCisJCQkJYnJlYWs7CisJCQlpZiAoIXRpbWVvdXQpCisJCQkJYnJlYWs7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJc2V0X2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJLyogRGVhbCB3aXRoIHBhY2tldCBtb2RlLiAqLworCQlpZiAodHR5LT5wYWNrZXQgJiYgYiA9PSBidWYpIHsKKwkJCWlmIChwdXRfdXNlcihUSU9DUEtUX0RBVEEsIGIrKykpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWItLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5yLS07CisJCX0KKworCQlpZiAodHR5LT5pY2Fub24pIHsKKwkJCS8qIE4uQi4gYXZvaWQgb3ZlcnJ1biBpZiBuciA9PSAwICovCisJCQl3aGlsZSAobnIgJiYgdHR5LT5yZWFkX2NudCkgeworIAkJCQlpbnQgZW9sOworCisJCQkJZW9sID0gdGVzdF9hbmRfY2xlYXJfYml0KHR0eS0+cmVhZF90YWlsLAorCQkJCQkJdHR5LT5yZWFkX2ZsYWdzKTsKKwkJCQljID0gdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfdGFpbF07CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCQkJdHR5LT5yZWFkX3RhaWwgPSAoKHR0eS0+cmVhZF90YWlsKzEpICYKKwkJCQkJCSAgKE5fVFRZX0JVRl9TSVpFLTEpKTsKKwkJCQl0dHktPnJlYWRfY250LS07CisJCQkJaWYgKGVvbCkgeworCQkJCQkvKiB0aGlzIHRlc3Qgc2hvdWxkIGJlIHJlZHVuZGFudDoKKwkJCQkJICogd2Ugc2hvdWxkbid0IGJlIHJlYWRpbmcgZGF0YSBpZgorCQkJCQkgKiBjYW5vbl9kYXRhIGlzIDAKKwkJCQkJICovCisJCQkJCWlmICgtLXR0eS0+Y2Fub25fZGF0YSA8IDApCisJCQkJCQl0dHktPmNhbm9uX2RhdGEgPSAwOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCisJCQkJaWYgKCFlb2wgfHwgKGMgIT0gX19ESVNBQkxFRF9DSEFSKSkgeworCQkJCQlpZiAocHV0X3VzZXIoYywgYisrKSkgeworCQkJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQkJCWItLTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW5yLS07CisJCQkJfQorCQkJCWlmIChlb2wpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHJldHZhbCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWludCB1bmNvcGllZDsKKwkJCXVuY29waWVkID0gY29weV9mcm9tX3JlYWRfYnVmKHR0eSwgJmIsICZucik7CisJCQl1bmNvcGllZCArPSBjb3B5X2Zyb21fcmVhZF9idWYodHR5LCAmYiwgJm5yKTsKKwkJCWlmICh1bmNvcGllZCkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBJZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIHJlYWQgYnVmZmVyIG5vdywgbGV0IHRoZQorCQkgKiBsb3ctbGV2ZWwgZHJpdmVyIGtub3cuIFdlIHVzZSBuX3R0eV9jaGFyc19pbl9idWZmZXIoKSB0bworCQkgKiBjaGVjayB0aGUgYnVmZmVyLCBhcyBpdCBub3cga25vd3MgYWJvdXQgY2Fub25pY2FsIG1vZGUuCisJCSAqIE90aGVyd2lzZSwgaWYgdGhlIGRyaXZlciBpcyB0aHJvdHRsZWQgYW5kIHRoZSBsaW5lIGlzCisJCSAqIGxvbmdlciB0aGFuIFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSBpbiBjYW5vbmljYWwgbW9kZSwKKwkJICogd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIGNoYXJhY3RlcnMuCisJCSAqLworCQlpZiAobl90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSkgPD0gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFKQorCQkJY2hlY2tfdW50aHJvdHRsZSh0dHkpOworCisJCWlmIChiIC0gYnVmID49IG1pbmltdW0pCisJCQlicmVhazsKKwkJaWYgKHRpbWUpCisJCQl0aW1lb3V0ID0gdGltZTsKKwl9CisJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwl1cCgmdHR5LT5hdG9taWNfcmVhZCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnR0eS0+cmVhZF93YWl0LCAmd2FpdCk7CisKKwlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+cmVhZF93YWl0KSkKKwkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBtaW5pbXVtOworCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXNpemUgPSBiIC0gYnVmOworCWlmIChzaXplKSB7CisJCXJldHZhbCA9IHNpemU7CisJCWlmIChucikKKwkgICAgICAgCQljbGVhcl9iaXQoVFRZX1BVU0gsICZ0dHktPmZsYWdzKTsKKwl9IGVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfUFVTSCwgJnR0eS0+ZmxhZ3MpKQorCQkgZ290byBkb19pdF9hZ2FpbjsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJd3JpdGVfY2hhbgkJLQl3cml0ZSBmdW5jdGlvbiBmb3IgdHR5CisgKglAdHR5OiB0dHkgZGV2aWNlCisgKglAZmlsZTogZmlsZSBvYmplY3QKKyAqCUBidWY6IHVzZXJzcGFjZSBidWZmZXIgcG9pbnRlcgorICoJQG5yOiBzaXplIG9mIEkvTworICoKKyAqCVdyaXRlIGZ1bmN0aW9uIG9mIHRoZSB0ZXJtaW5hbCBkZXZpY2UuIFRoaXMgaXMgc2VyaWFsaXplZCB3aXRoCisgKglyZXNwZWN0IHRvIG90aGVyIHdyaXRlIGNhbGxlcnMgYnV0IG5vdCB0byB0ZXJtaW9zIGNoYW5nZXMsIHJlYWRzCisgKglhbmQgb3RoZXIgc3VjaCBldmVudHMuIFdlIG11c3QgYmUgY2FyZWZ1bCB3aXRoIE5fVFRZIGFzIHRoZSByZWNlaXZlCisgKgljb2RlIHdpbGwgZWNobyBjaGFyYWN0ZXJzLCB0aHVzIGNhbGxpbmcgZHJpdmVyIHdyaXRlIG1ldGhvZHMuCisgKgorICoJVGhpcyBjb2RlIG11c3QgYmUgc3VyZSBuZXZlciB0byBzbGVlcCB0aHJvdWdoIGEgaGFuZ3VwLgorICovCisgCitzdGF0aWMgc3NpemVfdCB3cml0ZV9jaGFuKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWYsIHNpemVfdCBucikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpiID0gYnVmOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCBjOworCXNzaXplX3QgcmV0dmFsID0gMDsKKworCS8qIEpvYiBjb250cm9sIGNoZWNrIC0tIG11c3QgYmUgZG9uZSBhdCBzdGFydCAoUE9TSVguMSA3LjEuMS40KS4gKi8KKwlpZiAoTF9UT1NUT1AodHR5KSAmJiBmaWxlLT5mX29wLT53cml0ZSAhPSByZWRpcmVjdGVkX3R0eV93cml0ZSkgeworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWFkZF93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbGUpIHx8ICh0dHktPmxpbmsgJiYgIXR0eS0+bGluay0+Y291bnQpKSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKE9fT1BPU1QodHR5KSAmJiAhKHRlc3RfYml0KFRUWV9IV19DT09LX09VVCwgJnR0eS0+ZmxhZ3MpKSkgeworCQkJd2hpbGUgKG5yID4gMCkgeworCQkJCXNzaXplX3QgbnVtID0gb3Bvc3RfYmxvY2sodHR5LCBiLCBucik7CisJCQkJaWYgKG51bSA8IDApIHsKKwkJCQkJaWYgKG51bSA9PSAtRUFHQUlOKQorCQkJCQkJYnJlYWs7CisJCQkJCXJldHZhbCA9IG51bTsKKwkJCQkJZ290byBicmVha19vdXQ7CisJCQkJfQorCQkJCWIgKz0gbnVtOworCQkJCW5yIC09IG51bTsKKwkJCQlpZiAobnIgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJYyA9ICpiOworCQkJCWlmIChvcG9zdChjLCB0dHkpIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJYisrOyBuci0tOworCQkJfQorCQkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycykKKwkJCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKKwkJfSBlbHNlIHsKKwkJCWMgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBiLCBucik7CisJCQlpZiAoYyA8IDApIHsKKwkJCQlyZXR2YWwgPSBjOworCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJfQorCQkJYiArPSBjOworCQkJbnIgLT0gYzsKKwkJfQorCQlpZiAoIW5yKQorCQkJYnJlYWs7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorYnJlYWtfb3V0OgorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisJcmV0dXJuIChiIC0gYnVmKSA/IGIgLSBidWYgOiByZXR2YWw7Cit9CisKKy8qKgorICoJbm9ybWFsX3BvbGwJCS0JcG9sbCBtZXRob2QgZm9yIE5fVFRZCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGFjY2Vzc2luZyBpdAorICoJQHdhaXQ6IHBvbGwgdGFibGUKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgbGluZSBkaXNjaXBsaW5lIGlzIGFza2VkIHRvIHBvbGwoKSBmb3IgZGF0YSBvcgorICoJZm9yIHNwZWNpYWwgZXZlbnRzLiBUaGlzIGNvZGUgaXMgbm90IHNlcmlhbGl6ZWQgd2l0aCByZXNwZWN0IHRvCisgKglvdGhlciBldmVudHMgc2F2ZSBvcGVuL2Nsb3NlLgorICoKKyAqCVRoaXMgY29kZSBtdXN0IGJlIHN1cmUgbmV2ZXIgdG8gc2xlZXAgdGhyb3VnaCBhIGhhbmd1cC4KKyAqCUNhbGxlZCB3aXRob3V0IHRoZSBrZXJuZWwgbG9jayBoZWxkIC0gZmluZQorICoKKyAqCUZJWE1FOiBpZiBzb21lb25lIGNoYW5nZXMgdGhlIFZNSU4gb3IgZGlzY2lwbGluZSBzZXR0aW5ncyBmb3IgdGhlCisgKgl0ZXJtaW5hbCB3aGlsZSBhbm90aGVyIHByb2Nlc3MgaXMgaW4gcG9sbCgpIHRoZSBwb2xsIGRvZXMgbm90CisgKglyZWNvbXB1dGUgdGhlIG5ldyBsaW1pdHMuIFBvc3NpYmx5IHNldF90ZXJtaW9zIHNob3VsZCBpc3N1ZQorICoJYSByZWFkIHdha2V1cCB0byBmaXggdGhpcyBidWcuCisgKi8KKyAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnR0eS0+cmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnR0eS0+d3JpdGVfd2FpdCwgd2FpdCk7CisJaWYgKGlucHV0X2F2YWlsYWJsZV9wKHR0eSwgVElNRV9DSEFSKHR0eSkgPyAwIDogTUlOX0NIQVIodHR5KSkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAodHR5LT5wYWNrZXQgJiYgdHR5LT5saW5rLT5jdHJsX3N0YXR1cykKKwkJbWFzayB8PSBQT0xMUFJJIHwgUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQorCQltYXNrIHw9IFBPTExIVVA7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpCisJCW1hc2sgfD0gUE9MTEhVUDsKKwlpZiAoIShtYXNrICYgKFBPTExIVVAgfCBQT0xMSU4gfCBQT0xMUkROT1JNKSkpIHsKKwkJaWYgKE1JTl9DSEFSKHR0eSkgJiYgIVRJTUVfQ0hBUih0dHkpKQorCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBNSU5fQ0hBUih0dHkpOworCQllbHNlCisJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CisJfQorCWlmICh0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgPCBXQUtFVVBfQ0hBUlMgJiYKKwkJCXR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKHR0eSkgPiAwKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCXJldHVybiBtYXNrOworfQorCitzdHJ1Y3QgdHR5X2xkaXNjIHR0eV9sZGlzY19OX1RUWSA9IHsKKwlUVFlfTERJU0NfTUFHSUMsCS8qIG1hZ2ljICovCisJIm5fdHR5IiwJCS8qIG5hbWUgKi8KKwkwLAkJCS8qIG51bSAqLworCTAsCQkJLyogZmxhZ3MgKi8KKwluX3R0eV9vcGVuLAkJLyogb3BlbiAqLworCW5fdHR5X2Nsb3NlLAkJLyogY2xvc2UgKi8KKwluX3R0eV9mbHVzaF9idWZmZXIsCS8qIGZsdXNoX2J1ZmZlciAqLworCW5fdHR5X2NoYXJzX2luX2J1ZmZlciwJLyogY2hhcnNfaW5fYnVmZmVyICovCisJcmVhZF9jaGFuLAkJLyogcmVhZCAqLworCXdyaXRlX2NoYW4sCQkvKiB3cml0ZSAqLworCW5fdHR5X2lvY3RsLAkJLyogaW9jdGwgKi8KKwluX3R0eV9zZXRfdGVybWlvcywJLyogc2V0X3Rlcm1pb3MgKi8KKwlub3JtYWxfcG9sbCwJCS8qIHBvbGwgKi8KKwlOVUxMLAkJCS8qIGhhbmd1cCAqLworCW5fdHR5X3JlY2VpdmVfYnVmLAkvKiByZWNlaXZlX2J1ZiAqLworCW5fdHR5X3JlY2VpdmVfcm9vbSwJLyogcmVjZWl2ZV9yb29tICovCisJbl90dHlfd3JpdGVfd2FrZXVwCS8qIHdyaXRlX3dha2V1cCAqLworfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL252cmFtLmMgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNhM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL252cmFtLmMKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKiBDTU9TL05WLVJBTSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJvbWFuIEhvZGVrIDxSb21hbi5Ib2Rla0BpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKyAqIGlkZWEgYnkgYW5kIHdpdGggaGVscCBmcm9tIFJpY2hhcmQgSmVsaW5layA8cmpAc3VzZS5kZT4KKyAqIFBvcnRpb25zIGNvcHlyaWdodCAoYykgMjAwMSwyMDAyIFN1biBNaWNyb3N5c3RlbXMgKHRob2NraW5Ac3VuLmNvbSkKKyAqCisgKiBUaGlzIGRyaXZlciBhbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgY29udGVudHMgb2YgdGhlIG5vbi12b2xhdGlsZSBtZW1vcnkgaW4KKyAqIHRoZSBtYzE0NjgxOHJ0Yy5oIHJlYWwtdGltZSBjbG9jay4gVGhpcyBjaGlwIGlzIGJ1aWx0IGludG8gYWxsIFBDcyBhbmQgaW50bworICogbWFueSBBdGFyaSBtYWNoaW5lcy4gSW4gdGhlIGZvcm1lciBpdCdzIGNhbGxlZCAiQ01PUy1SQU0iLCBpbiB0aGUgbGF0dGVyCisgKiAiTlZSQU0iIChOViBzdGFuZHMgZm9yIG5vbi12b2xhdGlsZSkuCisgKgorICogVGhlIGRhdGEgYXJlIHN1cHBsaWVkIGFzIGEgKHNlZWthYmxlKSBjaGFyYWN0ZXIgZGV2aWNlLCAvZGV2L252cmFtLiBUaGUKKyAqIHNpemUgb2YgdGhpcyBmaWxlIGlzIGRlcGVuZGVudCBvbiB0aGUgY29udHJvbGxlci4gIFRoZSB1c3VhbCBzaXplIGlzIDExNCwKKyAqIHRoZSBudW1iZXIgb2YgZnJlZWx5IGF2YWlsYWJsZSBieXRlcyBpbiB0aGUgbWVtb3J5IChpLmUuLCBub3QgdXNlZCBieSB0aGUKKyAqIFJUQyBpdHNlbGYpLgorICoKKyAqIENoZWNrc3VtcyBvdmVyIHRoZSBOVlJBTSBjb250ZW50cyBhcmUgbWFuYWdlZCBieSB0aGlzIGRyaXZlci4gSW4gY2FzZSBvZiBhCisgKiBiYWQgY2hlY2tzdW0sIHJlYWRzIGFuZCB3cml0ZXMgcmV0dXJuIC1FSU8uIFRoZSBjaGVja3N1bSBjYW4gYmUgaW5pdGlhbGl6ZWQKKyAqIHRvIGEgc2FuZSBzdGF0ZSBlaXRoZXIgYnkgaW9jdGwoTlZSQU1fSU5JVCkgKGNsZWFyIHdob2xlIE5WUkFNKSBvcgorICogaW9jdGwoTlZSQU1fU0VUQ0tTKSAoZG9lc24ndCBjaGFuZ2UgY29udGVudHMsIGp1c3QgbWFrZXMgY2hlY2tzdW0gdmFsaWQKKyAqIGFnYWluOyB1c2Ugd2l0aCBjYXJlISkKKyAqCisgKiBUaGlzIGZpbGUgYWxzbyBwcm92aWRlcyBzb21lIGZ1bmN0aW9ucyBmb3Igb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbCB0aGF0CisgKiB3YW50IHRvIGFjY2VzcyB0aGUgTlZSQU06IG52cmFtX3tyZWFkLHdyaXRlLGNoZWNrX2NoZWNrc3VtLHNldF9jaGVja3N1bX0uCisgKiBPYnZpb3VzbHkgdGhpcyBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoaXMgZHJpdmVyIGlzIGFsd2F5cyBjb25maWd1cmVkIGludG8KKyAqIHRoZSBrZXJuZWwgYW5kIGlzIG5vdCBhIG1vZHVsZS4gU2luY2UgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSBzb21lIEF0YXJpCisgKiBkcml2ZXJzLCB0aGlzIGlzIHRoZSBjYXNlIG9uIHRoZSBBdGFyaS4KKyAqCisgKgorICogCTEuMQlDZXNhciBCYXJyb3M6IFNNUCBsb2NraW5nIGZpeGVzCisgKiAJCWFkZGVkIGNoYW5nZWxvZworICogCTEuMglFcmlrIEdpbGxpbmc6IENvYmFsdCBOZXR3b3JrcyBzdXBwb3J0CisgKiAJCVRpbSBIb2NraW46IGdlbmVyYWwgY2xlYW51cCwgQ29iYWx0IHN1cHBvcnQKKyAqLworCisjZGVmaW5lIE5WUkFNX1ZFUlNJT04JIjEuMiIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgorCisjZGVmaW5lIFBDCQkxCisjZGVmaW5lIEFUQVJJCQkyCisjZGVmaW5lIENPQkFMVAkJMworCisvKiBzZWxlY3QgbWFjaGluZSBjb25maWd1cmF0aW9uICovCisjaWYgZGVmaW5lZChDT05GSUdfQVRBUkkpCisjICBkZWZpbmUgTUFDSCBBVEFSSQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYXJtX18pICAvKiBhbmQgb3RoZXJzPz8gKi8KKyNkZWZpbmUgTUFDSCBQQworIyAgaWYgZGVmaW5lZChDT05GSUdfQ09CQUxUKQorIyAgICBpbmNsdWRlIDxsaW51eC9jb2JhbHQtbnZyYW0uaD4KKyMgICAgZGVmaW5lIE1BQ0ggQ09CQUxUCisjICBlbHNlCisjICAgIGRlZmluZSBNQUNIIFBDCisjICBlbmRpZgorI2Vsc2UKKyMgIGVycm9yIENhbm5vdCBidWlsZCBudnJhbSBkcml2ZXIgZm9yIHRoaXMgbWFjaGluZSBjb25maWd1cmF0aW9uLgorI2VuZGlmCisKKyNpZiBNQUNIID09IFBDCisKKy8qIFJUQyBpbiBhIFBDICovCisjZGVmaW5lIENIRUNLX0RSSVZFUl9JTklUKCkJMQorCisvKiBPbiBQQ3MsIHRoZSBjaGVja3N1bSBpcyBidWlsdCBvbmx5IG92ZXIgYnl0ZXMgMi4uMzEgKi8KKyNkZWZpbmUgUENfQ0tTX1JBTkdFX1NUQVJUCTIKKyNkZWZpbmUgUENfQ0tTX1JBTkdFX0VORAkzMQorI2RlZmluZSBQQ19DS1NfTE9DCQkzMgorI2RlZmluZSBOVlJBTV9CWVRFUwkJKDEyOC1OVlJBTV9GSVJTVF9CWVRFKQorCisjZGVmaW5lIG1hY2hfY2hlY2tfY2hlY2tzdW0JcGNfY2hlY2tfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JcGNfc2V0X2NoZWNrc3VtCisjZGVmaW5lIG1hY2hfcHJvY19pbmZvcwkJcGNfcHJvY19pbmZvcworCisjZW5kaWYKKworI2lmIE1BQ0ggPT0gQ09CQUxUCisKKyNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKSAgICAgMQorCisjZGVmaW5lIE5WUkFNX0JZVEVTCQkoMTI4LU5WUkFNX0ZJUlNUX0JZVEUpCisKKyNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQljb2JhbHRfY2hlY2tfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JY29iYWx0X3NldF9jaGVja3N1bQorI2RlZmluZSBtYWNoX3Byb2NfaW5mb3MJCWNvYmFsdF9wcm9jX2luZm9zCisKKyNlbmRpZgorCisjaWYgTUFDSCA9PSBBVEFSSQorCisvKiBTcGVjaWFsIHBhcmFtZXRlcnMgZm9yIFJUQyBpbiBBdGFyaSBtYWNoaW5lcyAqLworI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgorI2RlZmluZSBSVENfUE9SVCh4KQkJKFRUX1JUQ19CQVMgKyAyKih4KSkKKyNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKQkoTUFDSF9JU19BVEFSSSAmJiBBVEFSSUhXX1BSRVNFTlQoVFRfQ0xLKSkKKworI2RlZmluZSBOVlJBTV9CWVRFUwkJNTAKKworLyogT24gQXRhcmlzLCB0aGUgY2hlY2tzdW0gaXMgb3ZlciBhbGwgYnl0ZXMgZXhjZXB0IHRoZSBjaGVja3N1bSBieXRlcworICogdGhlbXNlbHZlczsgdGhlc2UgYXJlIGF0IHRoZSB2ZXJ5IGVuZCAqLworI2RlZmluZSBBVEFSSV9DS1NfUkFOR0VfU1RBUlQJMAorI2RlZmluZSBBVEFSSV9DS1NfUkFOR0VfRU5ECTQ3CisjZGVmaW5lIEFUQVJJX0NLU19MT0MJCTQ4CisKKyNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQlhdGFyaV9jaGVja19jaGVja3N1bQorI2RlZmluZSBtYWNoX3NldF9jaGVja3N1bQlhdGFyaV9zZXRfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9wcm9jX2luZm9zCQlhdGFyaV9wcm9jX2luZm9zCisKKyNlbmRpZgorCisvKiBOb3RlIHRoYXQgKmFsbCogY2FsbHMgdG8gQ01PU19SRUFEIGFuZCBDTU9TX1dSSVRFIG11c3QgYmUgZG9uZSB3aXRoCisgKiBydGNfbG9jayBoZWxkLiBEdWUgdG8gdGhlIGluZGV4LXBvcnQvZGF0YS1wb3J0IGRlc2lnbiBvZiB0aGUgUlRDLCB3ZQorICogZG9uJ3Qgd2FudCB0d28gZGlmZmVyZW50IHRoaW5ncyB0cnlpbmcgdG8gZ2V0IHRvIGl0IGF0IG9uY2UuIChlLmcuIHRoZQorICogcGVyaW9kaWMgMTEgbWluIHN5bmMgZnJvbSB0aW1lLmMgdnMuIHRoaXMgZHJpdmVyLikKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG52cmFtX3N0YXRlX2xvY2spOworc3RhdGljIGludCBudnJhbV9vcGVuX2NudDsJLyogI3RpbWVzIG9wZW5lZCAqLworc3RhdGljIGludCBudnJhbV9vcGVuX21vZGU7CS8qIHNwZWNpYWwgb3BlbiBtb2RlcyAqLworI2RlZmluZSBOVlJBTV9XUklURQkJMSAvKiBvcGVuZWQgZm9yIHdyaXRpbmcgKGV4Y2x1c2l2ZSkgKi8KKyNkZWZpbmUgTlZSQU1fRVhDTAkJMiAvKiBvcGVuZWQgd2l0aCBPX0VYQ0wgKi8KKworc3RhdGljIGludCBtYWNoX2NoZWNrX2NoZWNrc3VtKHZvaWQpOworc3RhdGljIHZvaWQgbWFjaF9zZXRfY2hlY2tzdW0odm9pZCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCBtYWNoX3Byb2NfaW5mb3ModW5zaWduZWQgY2hhciAqY29udGVudHMsIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW4sCisgICAgb2ZmX3QgKmJlZ2luLCBvZmZfdCBvZmZzZXQsIGludCBzaXplKTsKKyNlbmRpZgorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBiZSBjYWxsZWQgaW50ZXJuYWxseSBvciBieSBvdGhlciBwYXJ0cyBvZgorICogdGhlIGtlcm5lbC4gSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSBjb3JyZWN0IGNoZWNrc3VtIGJlZm9yZSByZWFkaW5nCisgKiBvciBhZnRlciB3cml0aW5nIChuZWVkcyB0byBiZSBkb25lIG9ubHkgb25jZSkuCisgKgorICogSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFsbCBhY2Nlc3MgYnl0ZXMgb2YgZ2VuZXJhbAorICogcHVycG9zZSBtZW1vcnkgaW4gdGhlIE5WUkFNIC0gdGhhdCBpcyB0byBzYXksIHRoZXkgYWxsIGFkZCB0aGUKKyAqIE5WUkFNX0ZJUlNUX0JZVEUgb2Zmc2V0LiAgUGFzcyB0aGVtIG9mZnNldHMgaW50byBOVlJBTSBhcyBpZiB5b3UgZGlkIG5vdCAKKyAqIGtub3cgYWJvdXQgdGhlIFJUQyBjcnVmdC4KKyAqLworCit1bnNpZ25lZCBjaGFyCitfX252cmFtX3JlYWRfYnl0ZShpbnQgaSkKK3sKKwlyZXR1cm4gQ01PU19SRUFEKE5WUkFNX0ZJUlNUX0JZVEUgKyBpKTsKK30KKwordW5zaWduZWQgY2hhcgorbnZyYW1fcmVhZF9ieXRlKGludCBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJYyA9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGM7Cit9CisKKy8qIFRoaXMgcmFjZXMgbmljZWx5IHdpdGggdHJ5aW5nIHRvIHJlYWQgd2l0aCBjaGVja3N1bSBjaGVja2luZyAobnZyYW1fcmVhZCkgKi8KK3ZvaWQKK19fbnZyYW1fd3JpdGVfYnl0ZSh1bnNpZ25lZCBjaGFyIGMsIGludCBpKQoreworCUNNT1NfV1JJVEUoYywgTlZSQU1fRklSU1RfQllURSArIGkpOworfQorCit2b2lkCitudnJhbV93cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgYywgaW50IGkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCV9fbnZyYW1fd3JpdGVfYnl0ZShjLCBpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworfQorCitpbnQKK19fbnZyYW1fY2hlY2tfY2hlY2tzdW0odm9pZCkKK3sKKwlyZXR1cm4gbWFjaF9jaGVja19jaGVja3N1bSgpOworfQorCitpbnQKK252cmFtX2NoZWNrX2NoZWNrc3VtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlydiA9IF9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCXJldHVybiBydjsKK30KKwordm9pZAorX19udnJhbV9zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwltYWNoX3NldF9jaGVja3N1bSgpOworfQorCit2b2lkCitudnJhbV9zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJX19udnJhbV9zZXRfY2hlY2tzdW0oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhlIGFyZSB0aGUgZmlsZSBvcGVyYXRpb24gZnVuY3Rpb24gZm9yIHVzZXIgYWNjZXNzIHRvIC9kZXYvbnZyYW0KKyAqLworCitzdGF0aWMgbG9mZl90IG52cmFtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSxsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luICkKK3sKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSAwOgorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6CisJCW9mZnNldCArPSBOVlJBTV9CWVRFUzsKKwkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gKG9mZnNldCA+PSAwKSA/IChmaWxlLT5mX3BvcyA9IG9mZnNldCkgOiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdAorbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgY2hhciBjb250ZW50c1tOVlJBTV9CWVRFU107CisJdW5zaWduZWQgaSA9ICpwcG9zOworCXVuc2lnbmVkIGNoYXIgKnRtcDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghX19udnJhbV9jaGVja19jaGVja3N1bSgpKQorCQlnb3RvIGNoZWNrc3VtX2VycjsKKworCWZvciAodG1wID0gY29udGVudHM7IGNvdW50LS0gPiAwICYmIGkgPCBOVlJBTV9CWVRFUzsgKytpLCArK3RtcCkKKwkJKnRtcCA9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgY29udGVudHMsIHRtcCAtIGNvbnRlbnRzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkqcHBvcyA9IGk7CisKKwlyZXR1cm4gdG1wIC0gY29udGVudHM7CisKKyAgICAgIGNoZWNrc3VtX2VycjoKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHNzaXplX3QKK252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbnRlbnRzW05WUkFNX0JZVEVTXTsKKwl1bnNpZ25lZCBpID0gKnBwb3M7CisJdW5zaWduZWQgY2hhciAqdG1wOworCWludCBsZW47CisKKwlsZW4gPSAoTlZSQU1fQllURVMgLSBpKSA8IGNvdW50ID8gKE5WUkFNX0JZVEVTIC0gaSkgOiBjb3VudDsKKwlpZiAoY29weV9mcm9tX3VzZXIoY29udGVudHMsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoIV9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKSkKKwkJZ290byBjaGVja3N1bV9lcnI7CisKKwlmb3IgKHRtcCA9IGNvbnRlbnRzOyBjb3VudC0tID4gMCAmJiBpIDwgTlZSQU1fQllURVM7ICsraSwgKyt0bXApCisJCV9fbnZyYW1fd3JpdGVfYnl0ZSgqdG1wLCBpKTsKKworCV9fbnZyYW1fc2V0X2NoZWNrc3VtKCk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCSpwcG9zID0gaTsKKworCXJldHVybiB0bXAgLSBjb250ZW50czsKKworICAgICAgY2hlY2tzdW1fZXJyOgorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50CitudnJhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIE5WUkFNX0lOSVQ6CisJCS8qIGluaXRpYWxpemUgTlZSQU0gY29udGVudHMgYW5kIGNoZWNrc3VtICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlZSQU1fQllURVM7ICsraSkKKwkJCV9fbnZyYW1fd3JpdGVfYnl0ZSgwLCBpKTsKKwkJX19udnJhbV9zZXRfY2hlY2tzdW0oKTsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE5WUkFNX1NFVENLUzoKKwkJLyoganVzdCBzZXQgY2hlY2tzdW0sIGNvbnRlbnRzIHVuY2hhbmdlZCAobWF5YmUgdXNlZnVsIGFmdGVyIAorCQkgKiBjaGVja3N1bSBnYXJiYWdlZCBzb21laG93Li4uKSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCV9fbnZyYW1fc2V0X2NoZWNrc3VtKCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGludAorbnZyYW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJaWYgKChudnJhbV9vcGVuX2NudCAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fRVhDTCkpIHx8CisJICAgIChudnJhbV9vcGVuX21vZGUgJiBOVlJBTV9FWENMKSB8fAorCSAgICAoKGZpbGUtPmZfbW9kZSAmIDIpICYmIChudnJhbV9vcGVuX21vZGUgJiBOVlJBTV9XUklURSkpKSB7CisJCXNwaW5fdW5sb2NrKCZudnJhbV9zdGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRVhDTCkKKwkJbnZyYW1fb3Blbl9tb2RlIHw9IE5WUkFNX0VYQ0w7CisJaWYgKGZpbGUtPmZfbW9kZSAmIDIpCisJCW52cmFtX29wZW5fbW9kZSB8PSBOVlJBTV9XUklURTsKKwludnJhbV9vcGVuX2NudCsrOworCisJc3Bpbl91bmxvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252cmFtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrKCZudnJhbV9zdGF0ZV9sb2NrKTsKKworCW52cmFtX29wZW5fY250LS07CisKKwkvKiBpZiBvbmx5IG9uZSBpbnN0YW5jZSBpcyBvcGVuLCBjbGVhciB0aGUgRVhDTCBiaXQgKi8KKwlpZiAobnZyYW1fb3Blbl9tb2RlICYgTlZSQU1fRVhDTCkKKwkJbnZyYW1fb3Blbl9tb2RlICY9IH5OVlJBTV9FWENMOworCWlmIChmaWxlLT5mX21vZGUgJiAyKQorCQludnJhbV9vcGVuX21vZGUgJj0gfk5WUkFNX1dSSVRFOworCisJc3Bpbl91bmxvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQKK252cmFtX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorICAgIGludCBzaXplLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisKK3N0YXRpYyBpbnQKK252cmFtX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorICAgIGludCBzaXplLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbnRlbnRzW05WUkFNX0JZVEVTXTsKKwlpbnQgaSwgbGVuID0gMDsKKwlvZmZfdCBiZWdpbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE5WUkFNX0JZVEVTOyArK2kpCisJCWNvbnRlbnRzW2ldID0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwkqZW9mID0gbWFjaF9wcm9jX2luZm9zKGNvbnRlbnRzLCBidWZmZXIsICZsZW4sICZiZWdpbiwgb2Zmc2V0LCBzaXplKTsKKworCWlmIChvZmZzZXQgPj0gYmVnaW4gKyBsZW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CisJcmV0dXJuIChzaXplIDwgYmVnaW4gKyBsZW4gLSBvZmZzZXQpID8gc2l6ZSA6IGJlZ2luICsgbGVuIC0gb2Zmc2V0OworCit9CisKKy8qIFRoaXMgbWFjcm8gZnJlZXMgdGhlIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gZnJvbSBib3VuZHMgY2hlY2tpbmcgYW5kCisgKiB0aGlzIGxpa2UgdGhhdC4uLiAqLworI2RlZmluZSBQUklOVF9QUk9DKGZtdCxhcmdzLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQkqbGVuICs9IHNwcmludGYoYnVmZmVyKypsZW4sIGZtdCwgIyNhcmdzKTsJXAorCQlpZiAoKmJlZ2luICsgKmxlbiA+IG9mZnNldCArIHNpemUpCQlcCisJCQlyZXR1cm4gMDsJCQkJXAorCQlpZiAoKmJlZ2luICsgKmxlbiA8IG9mZnNldCkgewkJCVwKKwkJCSpiZWdpbiArPSAqbGVuOwkJCQlcCisJCQkqbGVuID0gMDsJCQkJXAorCQl9CQkJCQkJXAorCX0gd2hpbGUoMCkKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG52cmFtX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbnZyYW1fbGxzZWVrLAorCS5yZWFkCQk9IG52cmFtX3JlYWQsCisJLndyaXRlCQk9IG52cmFtX3dyaXRlLAorCS5pb2N0bAkJPSBudnJhbV9pb2N0bCwKKwkub3BlbgkJPSBudnJhbV9vcGVuLAorCS5yZWxlYXNlCT0gbnZyYW1fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBudnJhbV9kZXYgPSB7CisJTlZSQU1fTUlOT1IsCisJIm52cmFtIiwKKwkmbnZyYW1fZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQKK252cmFtX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBkcml2ZXIgc2hvdWxkIGluaXQgYXQgYWxsICovCisJaWYgKCFDSEVDS19EUklWRVJfSU5JVCgpKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmbnZyYW1fZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAibnZyYW06IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCSAgICBOVlJBTV9NSU5PUik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9udnJhbSIsIDAsIE5VTEwsIG52cmFtX3JlYWRfcHJvYywKKwkJTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogY2FuJ3QgY3JlYXRlIC9wcm9jL2RyaXZlci9udnJhbVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0bWlzYzsKKwl9CisJcmV0ID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJOb24tdm9sYXRpbGUgbWVtb3J5IGRyaXZlciB2IiBOVlJBTV9WRVJTSU9OICJcbiIpOworICAgICAgb3V0OgorCXJldHVybiByZXQ7CisgICAgICBvdXRtaXNjOgorCW1pc2NfZGVyZWdpc3RlcigmbnZyYW1fZGV2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitudnJhbV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvbnZyYW0iLCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJm52cmFtX2Rldik7Cit9CisKK21vZHVsZV9pbml0KG52cmFtX2luaXQpOworbW9kdWxlX2V4aXQobnZyYW1fY2xlYW51cF9tb2R1bGUpOworCisvKgorICogTWFjaGluZSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworCisjaWYgTUFDSCA9PSBQQworCitzdGF0aWMgaW50CitwY19jaGVja19jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisJdW5zaWduZWQgc2hvcnQgZXhwZWN0OworCisJZm9yIChpID0gUENfQ0tTX1JBTkdFX1NUQVJUOyBpIDw9IFBDX0NLU19SQU5HRV9FTkQ7ICsraSkKKwkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCWV4cGVjdCA9IF9fbnZyYW1fcmVhZF9ieXRlKFBDX0NLU19MT0MpPDw4IHwKKwkgICAgX19udnJhbV9yZWFkX2J5dGUoUENfQ0tTX0xPQysxKTsKKwlyZXR1cm4gKChzdW0gJiAweGZmZmYpID09IGV4cGVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitwY19zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworCisJZm9yIChpID0gUENfQ0tTX1JBTkdFX1NUQVJUOyBpIDw9IFBDX0NLU19SQU5HRV9FTkQ7ICsraSkKKwkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gPj4gOCwgUENfQ0tTX0xPQyk7CisJX19udnJhbV93cml0ZV9ieXRlKHN1bSAmIDB4ZmYsIFBDX0NLU19MT0MgKyAxKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBjaGFyICpmbG9wcHlfdHlwZXNbXSA9IHsKKwkibm9uZSIsICI1LjI1JycgMzYwayIsICI1LjI1JycgMS4yTSIsICIzLjUnJyA3MjBrIiwgIjMuNScnIDEuNDRNIiwKKwkiMy41JycgMi44OE0iLCAiMy41JycgMi44OE0iCit9OworCitzdGF0aWMgY2hhciAqZ2Z4X3R5cGVzW10gPSB7CisJIkVHQSwgVkdBLCAuLi4gKHdpdGggQklPUykiLAorCSJDR0EgKDQwIGNvbHMpIiwKKwkiQ0dBICg4MCBjb2xzKSIsCisJIm1vbm9jaHJvbWUiLAorfTsKKworc3RhdGljIGludAorcGNfcHJvY19pbmZvcyh1bnNpZ25lZCBjaGFyICpudnJhbSwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbiwKKyAgICBvZmZfdCAqYmVnaW4sIG9mZl90IG9mZnNldCwgaW50IHNpemUpCit7CisJaW50IGNoZWNrc3VtOworCWludCB0eXBlOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWNoZWNrc3VtID0gX19udnJhbV9jaGVja19jaGVja3N1bSgpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzOiAlc3ZhbGlkXG4iLCBjaGVja3N1bSA/ICIiIDogIm5vdCAiKTsKKworCVBSSU5UX1BST0MoIiMgZmxvcHBpZXMgICAgIDogJWRcbiIsCisJICAgIChudnJhbVs2XSAmIDEpID8gKG52cmFtWzZdID4+IDYpICsgMSA6IDApOworCVBSSU5UX1BST0MoIkZsb3BweSAwIHR5cGUgIDogIik7CisJdHlwZSA9IG52cmFtWzJdID4+IDQ7CisJaWYgKHR5cGUgPCBzaXplb2YgKGZsb3BweV90eXBlcykgLyBzaXplb2YgKCpmbG9wcHlfdHlwZXMpKQorCQlQUklOVF9QUk9DKCIlc1xuIiwgZmxvcHB5X3R5cGVzW3R5cGVdKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiVkICh1bmtub3duKVxuIiwgdHlwZSk7CisJUFJJTlRfUFJPQygiRmxvcHB5IDEgdHlwZSAgOiAiKTsKKwl0eXBlID0gbnZyYW1bMl0gJiAweDBmOworCWlmICh0eXBlIDwgc2l6ZW9mIChmbG9wcHlfdHlwZXMpIC8gc2l6ZW9mICgqZmxvcHB5X3R5cGVzKSkKKwkJUFJJTlRfUFJPQygiJXNcbiIsIGZsb3BweV90eXBlc1t0eXBlXSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCIlZCAodW5rbm93bilcbiIsIHR5cGUpOworCisJUFJJTlRfUFJPQygiSEQgMCB0eXBlICAgICAgOiAiKTsKKwl0eXBlID0gbnZyYW1bNF0gPj4gNDsKKwlpZiAodHlwZSkKKwkJUFJJTlRfUFJPQygiJTAyeFxuIiwgdHlwZSA9PSAweDBmID8gbnZyYW1bMTFdIDogdHlwZSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCJub25lXG4iKTsKKworCVBSSU5UX1BST0MoIkhEIDEgdHlwZSAgICAgIDogIik7CisJdHlwZSA9IG52cmFtWzRdICYgMHgwZjsKKwlpZiAodHlwZSkKKwkJUFJJTlRfUFJPQygiJTAyeFxuIiwgdHlwZSA9PSAweDBmID8gbnZyYW1bMTJdIDogdHlwZSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCJub25lXG4iKTsKKworCVBSSU5UX1BST0MoIkhEIHR5cGUgNDggZGF0YTogJWQvJWQvJWQgQy9IL1MsIHByZWNvbXAgJWQsIGx6ICVkXG4iLAorCSAgICBudnJhbVsxOF0gfCAobnZyYW1bMTldIDw8IDgpLAorCSAgICBudnJhbVsyMF0sIG52cmFtWzI1XSwKKwkgICAgbnZyYW1bMjFdIHwgKG52cmFtWzIyXSA8PCA4KSwgbnZyYW1bMjNdIHwgKG52cmFtWzI0XSA8PCA4KSk7CisJUFJJTlRfUFJPQygiSEQgdHlwZSA0OSBkYXRhOiAlZC8lZC8lZCBDL0gvUywgcHJlY29tcCAlZCwgbHogJWRcbiIsCisJICAgIG52cmFtWzM5XSB8IChudnJhbVs0MF0gPDwgOCksCisJICAgIG52cmFtWzQxXSwgbnZyYW1bNDZdLAorCSAgICBudnJhbVs0Ml0gfCAobnZyYW1bNDNdIDw8IDgpLCBudnJhbVs0NF0gfCAobnZyYW1bNDVdIDw8IDgpKTsKKworCVBSSU5UX1BST0MoIkRPUyBiYXNlIG1lbW9yeTogJWQga0JcbiIsIG52cmFtWzddIHwgKG52cmFtWzhdIDw8IDgpKTsKKwlQUklOVF9QUk9DKCJFeHRlbmRlZCBtZW1vcnk6ICVkIGtCIChjb25maWd1cmVkKSwgJWQga0IgKHRlc3RlZClcbiIsCisJICAgIG52cmFtWzldIHwgKG52cmFtWzEwXSA8PCA4KSwgbnZyYW1bMzRdIHwgKG52cmFtWzM1XSA8PCA4KSk7CisKKwlQUklOVF9QUk9DKCJHZnggYWRhcHRlciAgICA6ICVzXG4iLCBnZnhfdHlwZXNbKG52cmFtWzZdID4+IDQpICYgM10pOworCisJUFJJTlRfUFJPQygiRlBVICAgICAgICAgICAgOiAlc2luc3RhbGxlZFxuIiwKKwkgICAgKG52cmFtWzZdICYgMikgPyAiIiA6ICJub3QgIik7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTUFDSCA9PSBQQyAqLworCisjaWYgTUFDSCA9PSBDT0JBTFQKKworLyogdGhlIGNvYmFsdCBDTU9TIGhhcyBhIHdpZGVyIHJhbmdlIG9mIGl0cyBjaGVja3N1bSAqLworc3RhdGljIGludCBjb2JhbHRfY2hlY2tfY2hlY2tzdW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworCXVuc2lnbmVkIHNob3J0IGV4cGVjdDsKKworCWZvciAoaSA9IENPQlRfQ01PU19DS1NfU1RBUlQ7IGkgPD0gQ09CVF9DTU9TX0NLU19FTkQ7ICsraSkgeworCQlpZiAoKGkgPT0gQ09CVF9DTU9TX0NIRUNLU1VNKSB8fCAoaSA9PSAoQ09CVF9DTU9TX0NIRUNLU1VNKzEpKSkKKwkJCWNvbnRpbnVlOworCisJCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwl9CisJZXhwZWN0ID0gX19udnJhbV9yZWFkX2J5dGUoQ09CVF9DTU9TX0NIRUNLU1VNKSA8PCA4IHwKKwkgICAgX19udnJhbV9yZWFkX2J5dGUoQ09CVF9DTU9TX0NIRUNLU1VNKzEpOworCXJldHVybiAoKHN1bSAmIDB4ZmZmZikgPT0gZXhwZWN0KTsKK30KKworc3RhdGljIHZvaWQgY29iYWx0X3NldF9jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisKKwlmb3IgKGkgPSBDT0JUX0NNT1NfQ0tTX1NUQVJUOyBpIDw9IENPQlRfQ01PU19DS1NfRU5EOyArK2kpIHsKKwkJaWYgKChpID09IENPQlRfQ01PU19DSEVDS1NVTSkgfHwgKGkgPT0gKENPQlRfQ01PU19DSEVDS1NVTSsxKSkpCisJCQljb250aW51ZTsKKworCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJfQorCisJX19udnJhbV93cml0ZV9ieXRlKHN1bSA+PiA4LCBDT0JUX0NNT1NfQ0hFQ0tTVU0pOworCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gJiAweGZmLCBDT0JUX0NNT1NfQ0hFQ0tTVU0rMSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW50IGNvYmFsdF9wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAorCW9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tzdW07CisJdW5zaWduZWQgaW50IGZsYWdzOworCWNoYXIgc2VybnVtWzE0XTsKKwljaGFyICprZXkgPSAiY05vRWJUYVdsT3RSISI7CisJdW5zaWduZWQgY2hhciBidG9fY3N1bTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwljaGVja3N1bSA9IF9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCVBSSU5UX1BST0MoIkNoZWNrc3VtIHN0YXR1czogJXN2YWxpZFxuIiwgY2hlY2tzdW0gPyAiIiA6ICJub3QgIik7CisKKwlmbGFncyA9IG52cmFtW0NPQlRfQ01PU19GTEFHX0JZVEVfMF0gPDwgOCAKKwkgICAgfCBudnJhbVtDT0JUX0NNT1NfRkxBR19CWVRFXzFdOworCisJUFJJTlRfUFJPQygiQ29uc29sZTogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0NPTlNPTEVfRkxBRyA/ICAib24iOiAib2ZmIik7CisKKwlQUklOVF9QUk9DKCJGaXJtd2FyZSBEZWJ1ZyBNZXNzYWdlczogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0RFQlVHX0ZMQUcgPyAib24iOiAib2ZmIik7CisKKwlQUklOVF9QUk9DKCJBdXRvIFByb21wdDogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0FVVE9fUFJPTVBUX0ZMQUcgPyAib24iOiAib2ZmIik7CisKKwlQUklOVF9QUk9DKCJTaHV0ZG93biBTdGF0dXM6ICVzXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19DTEVBTl9CT09UX0ZMQUcgPyAiY2xlYW4iOiAiZGlydHkiKTsKKworCVBSSU5UX1BST0MoIkhhcmR3YXJlIFByb2JlOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfSFdfTk9QUk9CRV9GTEFHID8gInBhcnRpYWwiOiAiZnVsbCIpOworCisJUFJJTlRfUFJPQygiU3lzdGVtIEZhdWx0OiAlc2RldGVjdGVkXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19TWVNGQVVMVF9GTEFHID8gIiI6ICJub3QgIik7CisKKwlQUklOVF9QUk9DKCJQYW5pYyBvbiBPT1BTOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfT09QU1BBTklDX0ZMQUcgPyAieWVzIjogIm5vIik7CisKKwlQUklOVF9QUk9DKCJEZWxheWVkIENhY2hlIEluaXRpYWxpemF0aW9uOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfREVMQVlfQ0FDSEVfRkxBRyA/ICJ5ZXMiOiAibm8iKTsKKworCVBSSU5UX1BST0MoIlNob3cgTG9nbyBhdCBCb290OiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfTk9MT0dPX0ZMQUcgPyAibm8iOiAieWVzIik7CisKKwlQUklOVF9QUk9DKCJCb290IE1ldGhvZDogIik7CisJc3dpdGNoIChudnJhbVtDT0JUX0NNT1NfQk9PVF9NRVRIT0RdKSB7CisJY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfRElTSzoKKwkJUFJJTlRfUFJPQygiZGlza1xuIik7CisJCWJyZWFrOworCisJY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfUk9NOgorCQlQUklOVF9QUk9DKCJyb21cbiIpOworCQlicmVhazsKKworCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX05FVDoKKwkJUFJJTlRfUFJPQygibmV0XG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQUklOVF9QUk9DKCJ1bmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQorCisJUFJJTlRfUFJPQygiUHJpbWFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCisJCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjBfTUFKXSwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMF9NSU5dICk7CisJUFJJTlRfUFJPQygiU2Vjb25kYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMV9NQUpdLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYxX01JTl0gKTsKKwlQUklOVF9QUk9DKCJUZXJ0aWFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCisJCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjJfTUFKXSwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMl9NSU5dICk7CisKKwlQUklOVF9QUk9DKCJVcHRpbWU6ICVkXG4iLAorCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzBdIDw8IDI0IHwKKwkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8xXSA8PCAxNiB8CisJCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMl0gPDwgOCAgfAorCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzNdKTsKKworCVBSSU5UX1BST0MoIkJvb3QgQ291bnQ6ICVkXG4iLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzBdIDw8IDI0IHwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8xXSA8PCAxNiB8CisJCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMl0gPDwgOCAgfAorCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzNdKTsKKworCS8qIDEzIGJ5dGVzIG9mIHNlcmlhbCBudW0gKi8KKwlmb3IgKGk9MCA7IGk8MTMgOyBpKyspIHsKKwkJc2VybnVtW2ldID0gbnZyYW1bQ09CVF9DTU9TX1NZU19TRVJOVU1fMCArIGldOworCX0KKwlzZXJudW1bMTNdID0gJ1wwJzsKKworCWNoZWNrc3VtID0gMDsKKwlmb3IgKGk9MCA7IGk8MTMgOyBpKyspIHsKKwkJY2hlY2tzdW0gKz0gc2VybnVtW2ldIF4ga2V5W2ldOworCX0KKwljaGVja3N1bSA9ICgoY2hlY2tzdW0gJiAweDdmKSBeICgweGQ2KSkgJiAweGZmOworCisJUFJJTlRfUFJPQygiU2VyaWFsIE51bWJlcjogJXMiLCBzZXJudW0pOworCWlmIChjaGVja3N1bSAhPSBudnJhbVtDT0JUX0NNT1NfU1lTX1NFUk5VTV9DU1VNXSkgeworCQlQUklOVF9QUk9DKCIgKGludmFsaWQgY2hlY2tzdW0pIik7CisJfQorCVBSSU5UX1BST0MoIlxuIik7CisKKwlQUklOVF9QUk9DKCJSb20gUmV2aXNvbjogJWQuJWQuJWRcbiIsIG52cmFtW0NPQlRfQ01PU19ST01fUkVWX01BSl0sCisJCW52cmFtW0NPQlRfQ01PU19ST01fUkVWX01JTl0sIG52cmFtW0NPQlRfQ01PU19ST01fUkVWX1JFVl0pOworCisJUFJJTlRfUFJPQygiQlRPIFNlcnZlcjogJWQuJWQuJWQuJWQiLCBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzBdLAorCQludnJhbVtDT0JUX0NNT1NfQlRPX0lQXzFdLCBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzJdLAorCQludnJhbVtDT0JUX0NNT1NfQlRPX0lQXzNdKTsKKwlidG9fY3N1bSA9IG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMF0gKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzFdCisJCSsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8yXSArIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfM107CisJaWYgKGJ0b19jc3VtICE9IG52cmFtW0NPQlRfQ01PU19CVE9fSVBfQ1NVTV0pIHsKKwkJUFJJTlRfUFJPQygiIChpbnZhbGlkIGNoZWNrc3VtKSIpOworCX0KKwlQUklOVF9QUk9DKCJcbiIpOworCisJaWYgKGZsYWdzICYgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRworCSAmJiBudnJhbVtDT0JUX0NNT1NfVkVSU0lPTl0gPj0gQ09CVF9DTU9TX1ZFUl9CVE9DT0RFKSB7CisJCVBSSU5UX1BST0MoIkJUTyBDb2RlOiAweCV4XG4iLAorCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzBdIDw8IDI0IHwKKwkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8xXSA8PCAxNiB8CisJCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMl0gPDwgOCB8CisJCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfM10pOworCX0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyNlbmRpZiAvKiBNQUNIID09IENPQkFMVCAqLworCisjaWYgTUFDSCA9PSBBVEFSSQorCitzdGF0aWMgaW50CithdGFyaV9jaGVja19jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgc3VtID0gMDsKKworCWZvciAoaSA9IEFUQVJJX0NLU19SQU5HRV9TVEFSVDsgaSA8PSBBVEFSSV9DS1NfUkFOR0VfRU5EOyArK2kpCisJCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwlyZXR1cm4gKF9fbnZyYW1fcmVhZF9ieXRlKEFUQVJJX0NLU19MT0MpID09ICh+c3VtICYgMHhmZikgJiYKKwkgICAgX19udnJhbV9yZWFkX2J5dGUoQVRBUklfQ0tTX0xPQyArIDEpID09IChzdW0gJiAweGZmKSk7Cit9CisKK3N0YXRpYyB2b2lkCithdGFyaV9zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHN1bSA9IDA7CisKKwlmb3IgKGkgPSBBVEFSSV9DS1NfUkFOR0VfU1RBUlQ7IGkgPD0gQVRBUklfQ0tTX1JBTkdFX0VORDsgKytpKQorCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJX19udnJhbV93cml0ZV9ieXRlKH5zdW0sIEFUQVJJX0NLU19MT0MpOworCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0sIEFUQVJJX0NLU19MT0MgKyAxKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgdmFsOworCWNoYXIgKm5hbWU7Cit9IGJvb3RfcHJlZnNbXSA9IHsKKwl7IDB4ODAsICJUT1MiIH0sCisJeyAweDQwLCAiQVNWIiB9LAorCXsgMHgyMCwgIk5ldEJTRCAoPykiIH0sCisJeyAweDEwLCAiTGludXgiIH0sCisJeyAweDAwLCAidW5zcGVjaWZpZWQiIH0KK307CisKK3N0YXRpYyBjaGFyICpsYW5ndWFnZXNbXSA9IHsKKwkiRW5nbGlzaCAoVVMpIiwKKwkiR2VybWFuIiwKKwkiRnJlbmNoIiwKKwkiRW5nbGlzaCAoVUspIiwKKwkiU3BhbmlzaCIsCisJIkl0YWxpYW4iLAorCSI2ICh1bmRlZmluZWQpIiwKKwkiU3dpc3MgKEZyZW5jaCkiLAorCSJTd2lzcyAoR2VybWFuKSIKK307CisKK3N0YXRpYyBjaGFyICpkYXRlZm9ybWF0W10gPSB7CisJIk1NJWNERCVjWVkiLAorCSJERCVjTU0lY1lZIiwKKwkiWVklY01NJWNERCIsCisJIllZJWNERCVjTU0iLAorCSI0ICh1bmRlZmluZWQpIiwKKwkiNSAodW5kZWZpbmVkKSIsCisJIjYgKHVuZGVmaW5lZCkiLAorCSI3ICh1bmRlZmluZWQpIgorfTsKKworc3RhdGljIGNoYXIgKmNvbG9yc1tdID0geworCSIyIiwgIjQiLCAiMTYiLCAiMjU2IiwgIjY1NTM2IiwgIj8/IiwgIj8/IiwgIj8/IgorfTsKKworI2RlZmluZSBmaWVsZHNpemUoYSkJKHNpemVvZihhKS9zaXplb2YoKmEpKQorCitzdGF0aWMgaW50CithdGFyaV9wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAorICAgIG9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlpbnQgY2hlY2tzdW0gPSBudnJhbV9jaGVja19jaGVja3N1bSgpOworCWludCBpOworCXVuc2lnbmVkIHZtb2RlOworCisJUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzICA6ICVzdmFsaWRcbiIsIGNoZWNrc3VtID8gIiIgOiAibm90ICIpOworCisJUFJJTlRfUFJPQygiQm9vdCBwcmVmZXJlbmNlICA6ICIpOworCWZvciAoaSA9IGZpZWxkc2l6ZShib290X3ByZWZzKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisJCWlmIChudnJhbVsxXSA9PSBib290X3ByZWZzW2ldLnZhbCkgeworCQkJUFJJTlRfUFJPQygiJXNcbiIsIGJvb3RfcHJlZnNbaV0ubmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA8IDApCisJCVBSSU5UX1BST0MoIjB4JTAyeCAodW5kZWZpbmVkKVxuIiwgbnZyYW1bMV0pOworCisJUFJJTlRfUFJPQygiU0NTSSBhcmJpdHJhdGlvbiA6ICVzXG4iLAorCSAgICAobnZyYW1bMTZdICYgMHg4MCkgPyAib24iIDogIm9mZiIpOworCVBSSU5UX1BST0MoIlNDU0kgaG9zdCBJRCAgICAgOiAiKTsKKwlpZiAobnZyYW1bMTZdICYgMHg4MCkKKwkJUFJJTlRfUFJPQygiJWRcbiIsIG52cmFtWzE2XSAmIDcpOworCWVsc2UKKwkJUFJJTlRfUFJPQygibi9hXG4iKTsKKworCS8qIHRoZSBmb2xsb3dpbmcgZW50cmllcyBhcmUgZGVmaW5lZCBvbmx5IGZvciB0aGUgRmFsY29uICovCisJaWYgKChhdGFyaV9tY2hfY29va2llID4+IDE2KSAhPSBBVEFSSV9NQ0hfRkFMQ09OKQorCQlyZXR1cm4gMTsKKworCVBSSU5UX1BST0MoIk9TIGxhbmd1YWdlICAgICAgOiAiKTsKKwlpZiAobnZyYW1bNl0gPCBmaWVsZHNpemUobGFuZ3VhZ2VzKSkKKwkJUFJJTlRfUFJPQygiJXNcbiIsIGxhbmd1YWdlc1tudnJhbVs2XV0pOworCWVsc2UKKwkJUFJJTlRfUFJPQygiJXUgKHVuZGVmaW5lZClcbiIsIG52cmFtWzZdKTsKKwlQUklOVF9QUk9DKCJLZXlib2FyZCBsYW5ndWFnZTogIik7CisJaWYgKG52cmFtWzddIDwgZmllbGRzaXplKGxhbmd1YWdlcykpCisJCVBSSU5UX1BST0MoIiVzXG4iLCBsYW5ndWFnZXNbbnZyYW1bN11dKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiV1ICh1bmRlZmluZWQpXG4iLCBudnJhbVs3XSk7CisJUFJJTlRfUFJPQygiRGF0ZSBmb3JtYXQgICAgICA6ICIpOworCVBSSU5UX1BST0MoZGF0ZWZvcm1hdFtudnJhbVs4XSAmIDddLAorCSAgICBudnJhbVs5XSA/IG52cmFtWzldIDogJy8nLCBudnJhbVs5XSA/IG52cmFtWzldIDogJy8nKTsKKwlQUklOVF9QUk9DKCIsICVkaCBjbG9ja1xuIiwgbnZyYW1bOF0gJiAxNiA/IDI0IDogMTIpOworCVBSSU5UX1BST0MoIkJvb3QgZGVsYXkgICAgICAgOiAiKTsKKwlpZiAobnZyYW1bMTBdID09IDApCisJCVBSSU5UX1BST0MoImRlZmF1bHQiKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiVkcyVzXG4iLCBudnJhbVsxMF0sCisJCSAgICBudnJhbVsxMF0gPCA4ID8gIiwgbm8gbWVtb3J5IHRlc3QiIDogIiIpOworCisJdm1vZGUgPSAobnZyYW1bMTRdIDw8IDgpIHx8IG52cmFtWzE1XTsKKwlQUklOVF9QUk9DKCJWaWRlbyBtb2RlICAgICAgIDogJXMgY29sb3JzLCAlZCBjb2x1bW5zLCAlcyAlcyBtb25pdG9yXG4iLAorCSAgICBjb2xvcnNbdm1vZGUgJiA3XSwKKwkgICAgdm1vZGUgJiA4ID8gODAgOiA0MCwKKwkgICAgdm1vZGUgJiAxNiA/ICJWR0EiIDogIlRWIiwgdm1vZGUgJiAzMiA/ICJQQUwiIDogIk5UU0MiKTsKKwlQUklOVF9QUk9DKCIgICAgICAgICAgICAgICAgICAgJXNvdmVyc2NhbiwgY29tcGF0LiBtb2RlICVzJXNcbiIsCisJICAgIHZtb2RlICYgNjQgPyAiIiA6ICJubyAiLAorCSAgICB2bW9kZSAmIDEyOCA/ICJvbiIgOiAib2ZmIiwKKwkgICAgdm1vZGUgJiAyNTYgPworCSAgICAodm1vZGUgJiAxNiA/ICIsIGxpbmUgZG91YmxpbmciIDogIiwgaGFsZiBzY3JlZW4iKSA6ICIiKTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBNQUNIID09IEFUQVJJICovCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChfX252cmFtX3JlYWRfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKG52cmFtX3JlYWRfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKF9fbnZyYW1fd3JpdGVfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKG52cmFtX3dyaXRlX2J5dGUpOworRVhQT1JUX1NZTUJPTChfX252cmFtX2NoZWNrX2NoZWNrc3VtKTsKK0VYUE9SVF9TWU1CT0wobnZyYW1fY2hlY2tfY2hlY2tzdW0pOworRVhQT1JUX1NZTUJPTChfX252cmFtX3NldF9jaGVja3N1bSk7CitFWFBPUlRfU1lNQk9MKG52cmFtX3NldF9jaGVja3N1bSk7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihOVlJBTV9NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbndidXR0b24uYyBiL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODNiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbndidXR0b24uYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIAlOZXRXaW5kZXIgQnV0dG9uIERyaXZlci0KKyAqCUNvcHlyaWdodCAoQykgQWxleCBIb2xkZW4gPGFsZXhAbGludXhoYWNrZXIub3JnPiAxOTk4LCAxOTk5LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNkZWZpbmUgX19OV0JVVFRPTl9DCQkvKiBUZWxsIHRoZSBoZWFkZXIgZmlsZSB3aG8gd2UgYXJlICovCisjaW5jbHVkZSAibndidXR0b24uaCIKKworc3RhdGljIGludCBidXR0b25fcHJlc3NfY291bnQ7CQkvKiBUaGUgY291bnQgb2YgYnV0dG9uIHByZXNzZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBidXR0b25fdGltZXI7CS8qIFRpbWVzIGZvciB0aGUgZW5kIG9mIGEgc2VxdWVuY2UgKi8gCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYnV0dG9uX3dhaXRfcXVldWUpOyAvKiBVc2VkIGZvciBibG9ja2luZyByZWFkICovCitzdGF0aWMgY2hhciBidXR0b25fb3V0cHV0X2J1ZmZlclszMl07CS8qIFN0b3JlcyBkYXRhIHRvIHdyaXRlIG91dCBvZiBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgYmNvdW50OwkJCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciAqLworc3RhdGljIGludCBiZGVsYXkgPSBCVVRUT05fREVMQVk7CS8qIFRoZSBkZWxheSwgaW4gamlmZmllcyAqLworc3RhdGljIHN0cnVjdCBidXR0b25fY2FsbGJhY2sgYnV0dG9uX2NhbGxiYWNrX2xpc3RbMzJdOyAvKiBUaGUgY2FsbGJhY2sgbGlzdCAqLworc3RhdGljIGludCBjYWxsYmFja19jb3VudDsJCS8qIFRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgKi8KK3N0YXRpYyBpbnQgcmVib290X2NvdW50ID0gTlVNX1BSRVNTRVNfUkVCT09UOyAvKiBOdW1iZXIgb2YgcHJlc3NlcyB0byByZWJvb3QgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG90aGVyIGRyaXZlcnMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbgorICogdG8gYmUgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIG51bWJlciBvZiBidXR0b24gcHJlc3NlcyBvY2N1cnMuCisgKiBUaGUgY2FsbGJhY2sgbGlzdCBpcyBhIHN0YXRpYyBhcnJheSBvZiAzMiBlbnRyaWVzIChJIHNvbWVob3cgZG91YnQgbWFueQorICogcGVvcGxlIGFyZSBldmVyIGdvaW5nIHRvIHdhbnQgdG8gcmVnaXN0ZXIgbW9yZSB0aGFuIDMyIGRpZmZlcmVudCBhY3Rpb25zCisgKiB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIGtlcm5lbCBvbiBkaWZmZXJlbnQgbnVtYmVycyBvZiBidXR0b24gcHJlc3NlcyA7KS4KKyAqIEhvd2V2ZXIsIGlmIGFuIGF0dGVtcHQgdG8gcmVnaXN0ZXIgYSAzM3JkIGVudHJ5IChwZXJoYXBzIGEgc3R1Y2sgbG9vcAorICogc29tZXdoZXJlIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGVudHJ5IG92ZXIgYW5kIG92ZXI/KSBpdCB3aWxsIGZhaWwgdG8KKyAqIGRvIHNvIGFuZCByZXR1cm4gLUVOT01FTS4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlZ2lzdGVyIGEgbnVsbCBwb2ludGVyLAorICogaXQgd2lsbCBmYWlsIHRvIGRvIHNvIGFuZCByZXR1cm4gLUVJTlZBTC4KKyAqIEJlY2F1c2UgY2FsbGJhY2tzIGNhbiBiZSB1bnJlZ2lzdGVyZWQgYXQgcmFuZG9tIHRoZSBsaXN0IGNhbiBiZWNvbWUKKyAqIGZyYWdtZW50ZWQsIHNvIHdlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCB0aGUgZmlyc3QKKyAqIGZyZWUgZW50cnkuCisgKgorICogRklYTUU6IEhhcyBhbnlvbmUgc3BvdHRlZCBhbnkgbG9ja2luZyBmdW5jdGlvbnMgaW50IGhpcyBjb2RlIHJlY2VudGx5ID8/CisgKi8KKworaW50IGJ1dHRvbl9hZGRfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpLCBpbnQgY291bnQpCit7CisJaW50IGxwID0gMDsKKwlpZiAoY2FsbGJhY2tfY291bnQgPT0gMzIpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICghY2FsbGJhY2spIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNhbGxiYWNrX2NvdW50Kys7CisJZm9yICg7IChidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNhbGxiYWNrKTsgbHArKyk7CisJYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jYWxsYmFjayA9IGNhbGxiYWNrOworCWJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY291bnQgPSBjb3VudDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG90aGVyIGRyaXZlcnMgdG8gZGVyZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogSWYgeW91IGF0dGVtcHQgdG8gdW5yZWdpc3RlciBhIGNhbGxiYWNrIHdoaWNoIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGZhaWwKKyAqIHdpdGggLUVJTlZBTC4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBlbnRyeSB3aXRoIHRoZSBzYW1lIGFkZHJlc3MsCisgKiBiZWNhdXNlIGl0IHNlYXJjaGVzIHRoZSBsaXN0IGZyb20gZW5kIHRvIGJlZ2lubmluZywgaXQgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICogbGFzdCBvbmUgdG8gYmUgcmVnaXN0ZXJlZCBmaXJzdCAoRklMTy0gRmlyc3QgSW4gTGFzdCBPdXQpLgorICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Nlc3NhcmlseSB0cnVlIGlmIHRoZSBlbnRyaWVzIGFyZSBub3Qgc3VibWl0dGVkCisgKiBhdCB0aGUgc2FtZSB0aW1lLCBiZWNhdXNlIGFub3RoZXIgZHJpdmVyIGNvdWxkIGhhdmUgdW5yZWdpc3RlcmVkIGEgY2FsbGJhY2sKKyAqIGJldHdlZW4gdGhlIHN1Ym1pc3Npb25zIGNyZWF0aW5nIGEgZ2FwIGVhcmxpZXIgaW4gdGhlIGxpc3QsIHdoaWNoIHdvdWxkCisgKiBiZSBmaWxsZWQgZmlyc3QgYXQgc3VibWlzc2lvbiB0aW1lLgorICovCisKK2ludCBidXR0b25fZGVsX2NhbGxiYWNrICh2b2lkICgqY2FsbGJhY2spICh2b2lkKSkKK3sKKwlpbnQgbHAgPSAzMTsKKwlpZiAoIWNhbGxiYWNrKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3aGlsZSAobHAgPj0gMCkgeworCQlpZiAoKGJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY2FsbGJhY2spID09IGNhbGxiYWNrKSB7CisJCQlidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNhbGxiYWNrID0gTlVMTDsKKwkJCWJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY291bnQgPSAwOworCQkJY2FsbGJhY2tfY291bnQtLTsKKwkJCXJldHVybiAwOworCQl9OworCQlscC0tOworCX07CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBidXR0b25fc2VxdWVuY2VfZmluaXNoZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlCisgKiBsaXN0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucywgYW5kIGNhbGwgYW55IG9mIHRoZW0gd2hvc2UgY291bnQgYXJndW1lbnQKKyAqIG1hdGNoZXMgdGhlIGN1cnJlbnQgY291bnQgb2YgYnV0dG9uIHByZXNzZXMuIEl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgbGlzdCBhbmQgd29ya3MgdXAgdG8gdGhlIGVuZC4gSXQgd2lsbCByZWZ1c2UgdG8gZm9sbG93IGEgbnVsbAorICogcG9pbnRlciAod2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiBhbnl3YXkpLgorICovCisKK3N0YXRpYyB2b2lkIGJ1dHRvbl9jb25zdW1lX2NhbGxiYWNrcyAoaW50IGJwY291bnQpCit7CisJaW50IGxwID0gMDsKKwlmb3IgKDsgbHAgPD0gMzE7IGxwKyspIHsKKwkJaWYgKChidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNvdW50KSA9PSBicGNvdW50KSB7CisJCQlpZiAoYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jYWxsYmFjaykgeworCQkJCWJ1dHRvbl9jYWxsYmFja19saXN0W2xwXS5jYWxsYmFjaygpOworCQkJfQorCQl9CisJfQorfQorCisvKiAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGJ1dHRvbl90aW1lciB0aW1lcyBvdXQuCisgKiBpZS4gV2hlbiB5b3UgZG9uJ3QgcHJlc3MgdGhlIGJ1dHRvbiBmb3IgYmRlbGF5IGppZmZpZXMsIHRoaXMgaXMgdGFrZW4gdG8KKyAqIG1lYW4geW91IGhhdmUgZW5kZWQgdGhlIHNlcXVlbmNlIG9mIGtleSBwcmVzc2VzLCBhbmQgdGhpcyBmdW5jdGlvbiBpcworICogY2FsbGVkIHRvIHdpbmQgdGhpbmdzIHVwICh3cml0ZSB0aGUgcHJlc3NfY291bnQgb3V0IHRvIC9kZXYvYnV0dG9uLCBjYWxsCisgKiBhbnkgbWF0Y2hpbmcgcmVnaXN0ZXJlZCBmdW5jdGlvbiBjYWxsYmFja3MsIGluaXRpYXRlIHJlYm9vdCwgZXRjLikuCisgKi8KKworc3RhdGljIHZvaWQgYnV0dG9uX3NlcXVlbmNlX2ZpbmlzaGVkICh1bnNpZ25lZCBsb25nIHBhcmFtZXRlcnMpCit7CisjaWZkZWYgQ09ORklHX05XQlVUVE9OX1JFQk9PVAkJLyogUmVib290IHVzaW5nIGJ1dHRvbiBpcyBlbmFibGVkICovCisJaWYgKGJ1dHRvbl9wcmVzc19jb3VudCA9PSByZWJvb3RfY291bnQpIHsKKwkJa2lsbF9wcm9jICgxLCBTSUdJTlQsIDEpOwkvKiBBc2sgaW5pdCB0byByZWJvb3QgdXMgKi8KKwl9CisjZW5kaWYgLyogQ09ORklHX05XQlVUVE9OX1JFQk9PVCAqLworCWJ1dHRvbl9jb25zdW1lX2NhbGxiYWNrcyAoYnV0dG9uX3ByZXNzX2NvdW50KTsKKwliY291bnQgPSBzcHJpbnRmIChidXR0b25fb3V0cHV0X2J1ZmZlciwgIiVkXG4iLCBidXR0b25fcHJlc3NfY291bnQpOworCWJ1dHRvbl9wcmVzc19jb3VudCA9IDA7CQkvKiBSZXNldCB0aGUgYnV0dG9uIHByZXNzIGNvdW50ZXIgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZidXR0b25fd2FpdF9xdWV1ZSk7Cit9CisKKy8qIAorICogIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgb3JhbmdlIGJ1dHRvbiBpcyBwcmVzc2VkIChHUElPIDEwIG9mIHRoZQorICogIFN1cGVySU8gY2hpcCwgd2hpY2ggbWFwcyB0byBsb2dpY2FsIElSUSAyNikuIElmIHRoZSBwcmVzc19jb3VudCBpcyAwLAorICogIHRoaXMgaXMgdGhlIGZpcnN0IHByZXNzLCBzbyBpdCBzdGFydHMgYSB0aW1lciBhbmQgaW5jcmVtZW50cyB0aGUgY291bnRlci4KKyAqICBJZiBpdCBpcyBoaWdoZXIgdGhhbiAwLCBpdCBkZWxldGVzIHRoZSBvbGQgdGltZXIsIHN0YXJ0cyBhIG5ldyBvbmUsIGFuZAorICogIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuCisgKi8gCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBidXR0b25faGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoYnV0dG9uX3ByZXNzX2NvdW50KSB7CisJCWRlbF90aW1lciAoJmJ1dHRvbl90aW1lcik7CisJfQorCWJ1dHRvbl9wcmVzc19jb3VudCsrOworCWluaXRfdGltZXIgKCZidXR0b25fdGltZXIpOworCWJ1dHRvbl90aW1lci5mdW5jdGlvbiA9IGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZDsKKwlidXR0b25fdGltZXIuZXhwaXJlcyA9IChqaWZmaWVzICsgYmRlbGF5KTsKKwlhZGRfdGltZXIgKCZidXR0b25fdGltZXIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgc3BhY2UgcHJvZ3JhbSBhdHRlbXB0cyB0byByZWFkCisgKiAvZGV2L253YnV0dG9uLiBJdCBwdXRzIHRoZSBkZXZpY2UgdG8gc2xlZXAgb24gdGhlIHdhaXQgcXVldWUgdW50aWwKKyAqIGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZCB3cml0ZXMgc29tZSBkYXRhIHRvIHRoZSBidWZmZXIgYW5kIGZsdXNoZXMKKyAqIHRoZSBxdWV1ZSwgYXQgd2hpY2ggcG9pbnQgaXQgd3JpdGVzIHRoZSBkYXRhIG91dCB0byB0aGUgZGV2aWNlIGFuZAorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXQgaGFzIHdyaXR0ZW4uIFRoaXMgZnVuY3Rpb24gaXMKKyAqIHJlZW50cmFudCwgc28gdGhhdCBtYW55IHByb2Nlc3NlcyBjYW4gYmUgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhlCisgKiBkZXZpY2UgYXQgYW55IG9uZSB0aW1lLgorICovCisKK3N0YXRpYyBpbnQgYnV0dG9uX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbiAoJmJ1dHRvbl93YWl0X3F1ZXVlKTsKKwlyZXR1cm4gKGNvcHlfdG9fdXNlciAoYnVmZmVyLCAmYnV0dG9uX291dHB1dF9idWZmZXIsIGJjb3VudCkpCisJCSA/IC1FRkFVTFQgOiBiY291bnQ7Cit9CisKKy8qIAorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUsIHdoaWNoIHNwZWNpZmllcyB3aGF0CisgKiBjYWxsYmFja3MgZnVuY3Rpb25zIHRoZSBrZXJuZWwgc2hvdWxkIGNhbGwgd2hlbiBhIHVzZXIgbW9kZSBwcm9jZXNzCisgKiBhdHRlbXB0cyB0byBwZXJmb3JtIHRoZXNlIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZS4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidXR0b25fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gYnV0dG9uX3JlYWQsCit9OworCisvKiAKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBtaXNjIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIHNwZWNpZmllcyB0aGUgbWlub3IKKyAqIGRldmljZSBudW1iZXIgKDE1OCBpbiB0aGlzIGNhc2UpLCB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIChmb3IgL3Byb2MvbWlzYyksCisgKiBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGFib3ZlIGZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGJ1dHRvbl9taXNjX2RldmljZSA9IHsKKwlCVVRUT05fTUlOT1IsCisJIm53YnV0dG9uIiwKKwkmYnV0dG9uX2ZvcHMsCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbGlzZSB0aGUgZHJpdmVyLCBlaXRoZXIgZnJvbSBtaXNjLmMgYXQKKyAqIGJvb3R1cCBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgb3IgZnJvbSBpbml0X21vZHVsZQorICogYmVsb3cgYXQgbW9kdWxlIGluc2VydCB0aW1lLiBJdCBhdHRlbXB0cyB0byByZWdpc3RlciB0aGUgZGV2aWNlIG5vZGUKKyAqIGFuZCB0aGUgSVJRIGFuZCBmYWlscyB3aXRoIGEgd2FybmluZyBtZXNzYWdlIGlmIGVpdGhlciBmYWlscywgdGhvdWdoCisgKiBuZWl0aGVyIGV2ZXIgc2hvdWxkIGJlY2F1c2UgdGhlIGRldmljZSBudW1iZXIgYW5kIElSUSBhcmUgdW5pcXVlIHRvCisgKiB0aGlzIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBud2J1dHRvbl9pbml0KHZvaWQpCit7CisJaWYgKCFtYWNoaW5lX2lzX25ldHdpbmRlcigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayAoS0VSTl9JTkZPICJOZXRXaW5kZXIgQnV0dG9uIERyaXZlciBWZXJzaW9uICVzIChDKSBBbGV4IEhvbGRlbiAiCisJCQkiPGFsZXhAbGludXhoYWNrZXIub3JnPiAxOTk4LlxuIiwgVkVSU0lPTik7CisKKwlpZiAobWlzY19yZWdpc3RlciAoJmJ1dHRvbl9taXNjX2RldmljZSkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm53YnV0dG9uOiBDb3VsZG4ndCByZWdpc3RlciBkZXZpY2UgMTAsICIKKwkJCQkiJWQuXG4iLCBCVVRUT05fTUlOT1IpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChyZXF1ZXN0X2lycSAoSVJRX05FVFdJTkRFUl9CVVRUT04sIGJ1dHRvbl9oYW5kbGVyLCBTQV9JTlRFUlJVUFQsCisJCQkibndidXR0b24iLCBOVUxMKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAibndidXR0b246IElSUSAlZCBpcyBub3QgZnJlZS5cbiIsCisJCQkJSVJRX05FVFdJTkRFUl9CVVRUT04pOworCQltaXNjX2RlcmVnaXN0ZXIgKCZidXR0b25fbWlzY19kZXZpY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBud2J1dHRvbl9leGl0ICh2b2lkKSAKK3sKKwlmcmVlX2lycSAoSVJRX05FVFdJTkRFUl9CVVRUT04sIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlciAoJmJ1dHRvbl9taXNjX2RldmljZSk7Cit9CisKKworTU9EVUxFX0FVVEhPUigiQWxleCBIb2xkZW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQobndidXR0b25faW5pdCk7Cittb2R1bGVfZXhpdChud2J1dHRvbl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5oIGIvZHJpdmVycy9jaGFyL253YnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiN2I5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX19OV0JVVFRPTl9ICisjZGVmaW5lIF9fTldCVVRUT05fSAorCisvKgorICogCU5ldFdpbmRlciBCdXR0b24gRHJpdmVyLQorICoJQ29weXJpZ2h0IChDKSBBbGV4IEhvbGRlbiA8YWxleEBsaW51eGhhY2tlci5vcmc+IDE5OTgsIDE5OTkuCisgKi8KKworI2lmZGVmIF9fTldCVVRUT05fQwkvKiBBY3R1YWxseSBjb21waWxpbmcgdGhlIGRyaXZlciBpdHNlbGYgKi8KKworLyogVmFyaW91cyBkZWZpbmVzOiAqLworCisjZGVmaW5lIE5VTV9QUkVTU0VTX1JFQk9PVCAyCS8qIEhvdyBtYW55IHByZXNzZXMgdG8gYWN0aXZhdGUgc2h1dGRvd24gKi8KKyNkZWZpbmUgQlVUVE9OX0RFTEFZIDMwIAkvKiBIb3cgbWFueSBqaWZmaWVzIGZvciBzZXF1ZW5jZSB0byBlbmQgKi8KKyNkZWZpbmUgVkVSU0lPTiAiMC4zIgkJLyogRHJpdmVyIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIEJVVFRPTl9NSU5PUiAxNTgJLyogTWFqb3IgMTAsIE1pbm9yIDE1OCwgL2Rldi9ud2J1dHRvbiAqLworCisvKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnM6ICovCisKK3N0cnVjdCBidXR0b25fY2FsbGJhY2sgeworCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQpOworCWludCBjb3VudDsKK307CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXM6ICovCisKK3N0YXRpYyB2b2lkIGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZCAodW5zaWduZWQgbG9uZyBwYXJhbWV0ZXJzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBidXR0b25faGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpbnQgYnV0dG9uX2luaXQgKHZvaWQpOworaW50IGJ1dHRvbl9hZGRfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpLCBpbnQgY291bnQpOworaW50IGJ1dHRvbl9kZWxfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGJ1dHRvbl9jb25zdW1lX2NhbGxiYWNrcyAoaW50IGJwY291bnQpOworCisjZWxzZSAvKiBOb3QgY29tcGlsaW5nIHRoZSBkcml2ZXIgaXRzZWxmICovCisKK2V4dGVybiBpbnQgYnV0dG9uX2FkZF9jYWxsYmFjayAodm9pZCAoKmNhbGxiYWNrKSAodm9pZCksIGludCBjb3VudCk7CitleHRlcm4gaW50IGJ1dHRvbl9kZWxfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpKTsKKworI2VuZGlmIC8qIF9fTldCVVRUT05fQyAqLworI2VuZGlmIC8qIF9fTldCVVRUT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL253Zmxhc2guYyBiL2RyaXZlcnMvY2hhci9ud2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0MWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ud2ZsYXNoLmMKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBGbGFzaCBtZW1vcnkgaW50ZXJmYWNlIHJldi41IGRyaXZlciBmb3IgdGhlIEludGVsCisgKiBGbGFzaCBjaGlwcyB1c2VkIG9uIHRoZSBOZXRXaW5kZXIuCisgKgorICogMjAvMDgvMjAwMAlSTUsJdXNlIF9faW9yZW1hcCB0byBtYXAgZmxhc2ggaW50byB2aXJ0dWFsIG1lbW9yeQorICoJCQltYWtlIGEgZmV3IG1vcmUgcGxhY2VzIHVzZSAidm9sYXRpbGUiCisgKiAyMi8wNS8yMDAxCVJNSwktIExvY2sgcmVhZCBhZ2FpbnN0IHdyaXRlCisgKgkJCS0gbWVyZ2UgcHJpbnRrIGxldmVsIGNoYW5nZXMgKHdpdGggbW9kcykgZnJvbSBBbGFuIENveC4KKyAqCQkJLSB1c2UgKnBwb3MgYXMgdGhlIGZpbGUgcG9zaXRpb24sIG5vdCBmaWxlLT5mX3Bvcy4KKyAqCQkJLSBmaXggY2hlY2sgZm9yIG91dCBvZiByYW5nZSBwb3MgYW5kIHIvdyBzaXplCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB3ZSBhcmUgdGFtcGVyaW5nIHdpdGggdGhlIG9ubHkgZmxhc2ggY2hpcCBpbiB0aGUKKyAqIG1hY2hpbmUsIHdoaWNoIGNvbnRhaW5zIHRoZSBib290dXAgY29kZS4gIFdlIHRoZXJlZm9yZSBoYXZlIHRoZQorICogcG93ZXIgdG8gY29udmVydCB0aGVzZSBtYWNoaW5lcyBpbnRvIGRvb3JzdG9wcy4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGFzbS9ud2ZsYXNoLmg+CisKKyNkZWZpbmUJTldGTEFTSF9WRVJTSU9OICI2LjQiCisKK3N0YXRpYyB2b2lkIGtpY2tfb3Blbih2b2lkKTsKK3N0YXRpYyBpbnQgZ2V0X2ZsYXNoX2lkKHZvaWQpOworc3RhdGljIGludCBlcmFzZV9ibG9jayhpbnQgbkJsb2NrKTsKK3N0YXRpYyBpbnQgd3JpdGVfYmxvY2sodW5zaWduZWQgbG9uZyBwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpOworCisjZGVmaW5lIEtGTEFTSF9TSVpFCTEwMjQqMTAyNAkvLzEgTWVnCisjZGVmaW5lIEtGTEFTSF9TSVpFNAk0KjEwMjQqMTAyNAkvLzQgTWVnCisjZGVmaW5lIEtGTEFTSF9JRAkweDg5QTYJCS8vSW50ZWwgZmxhc2gKKyNkZWZpbmUgS0ZMQVNIX0lENAkweEIwRDQJCS8vSW50ZWwgZmxhc2ggNE1lZworCitzdGF0aWMgaW50IGZsYXNoZGVidWc7CQkvL2lmIHNldCAtIHdlIHdpbGwgZGlzcGxheSBwcm9ncmVzcyBtc2dzCisKK3N0YXRpYyBpbnQgZ2JXcml0ZUVuYWJsZTsKK3N0YXRpYyBpbnQgZ2JXcml0ZUJhc2U2NEVuYWJsZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpGTEFTSF9CQVNFOworc3RhdGljIGludCBnYkZsYXNoU2l6ZSA9IEtGTEFTSF9TSVpFOworc3RhdGljIERFQ0xBUkVfTVVURVgobndmbGFzaF9zZW0pOworCitleHRlcm4gc3BpbmxvY2tfdCBncGlvX2xvY2s7CisKK3N0YXRpYyBpbnQgZ2V0X2ZsYXNoX2lkKHZvaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGMxLCBjMjsKKworCS8qCisJICogdHJ5IHRvIGdldCBmbGFzaCBjaGlwIElECisJICovCisJa2lja19vcGVuKCk7CisJYzIgPSBpbmIoMHg4MCk7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4OTA7CisJdWRlbGF5KDE1KTsKKwljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBGTEFTSF9CQVNFOworCWMyID0gaW5iKDB4ODApOworCisJLyoKKwkgKiBvbiA0IE1lZyBmbGFzaCB0aGUgc2Vjb25kIGJ5dGUgaXMgYWN0dWFsbHkgYXQgb2Zmc2V0IDIuLi4KKwkgKi8KKwlpZiAoYzEgPT0gMHhCMCkKKwkJYzIgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAyKTsKKwllbHNlCisJCWMyID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMSk7CisKKwljMiArPSAoYzEgPDwgOCk7CisKKwkvKgorCSAqIHNldCBpdCBiYWNrIHRvIHJlYWQgbW9kZQorCSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCkgPSAweEZGOworCisJaWYgKGMyID09IEtGTEFTSF9JRDQpCisJCWdiRmxhc2hTaXplID0gS0ZMQVNIX1NJWkU0OworCisJcmV0dXJuIGMyOworfQorCitzdGF0aWMgaW50IGZsYXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGVwLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDTURfV1JJVEVfRElTQUJMRToKKwkJZ2JXcml0ZUJhc2U2NEVuYWJsZSA9IDA7CisJCWdiV3JpdGVFbmFibGUgPSAwOworCQlicmVhazsKKworCWNhc2UgQ01EX1dSSVRFX0VOQUJMRToKKwkJZ2JXcml0ZUVuYWJsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBDTURfV1JJVEVfQkFTRTY0S19FTkFCTEU6CisJCWdiV3JpdGVCYXNlNjRFbmFibGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdiV3JpdGVCYXNlNjRFbmFibGUgPSAwOworCQlnYldyaXRlRW5hYmxlID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBmbGFzaF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNpemU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZmxhc2hkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3JlYWQ6IGZsYXNoX3JlYWQ6IG9mZnNldD0weCVsWCwgIgorCQkgICAgICAgImJ1ZmZlcj0lcCwgY291bnQ9MHglWC5cbiIsIHAsIGJ1ZiwgY291bnQpOworCisJaWYgKGNvdW50KQorCQlyZXQgPSAtRU5YSU87CisKKwlpZiAocCA8IGdiRmxhc2hTaXplKSB7CisJCWlmIChjb3VudCA+IGdiRmxhc2hTaXplIC0gcCkKKwkJCWNvdW50ID0gZ2JGbGFzaFNpemUgLSBwOworCisJCS8qCisJCSAqIFdlIG5vdyBsb2NrIGFnYWluc3QgcmVhZHMgYW5kIHdyaXRlcy4gLS1ybWsKKwkJICovCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJm53Zmxhc2hfc2VtKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJcmV0ID0gY29weV90b191c2VyKGJ1ZiwgKHZvaWQgKikoRkxBU0hfQkFTRSArIHApLCBjb3VudCk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gY291bnQ7CisJCQkqcHBvcyArPSBjb3VudDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRUZBVUxUOworCQl1cCgmbndmbGFzaF9zZW0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBmbGFzaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKiBwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNpemU7CisJaW50IHdyaXR0ZW47CisJaW50IG5CbG9jaywgdGVtcCwgcmM7CisJaW50IGksIGo7CisKKwlpZiAoZmxhc2hkZWJ1ZykKKwkJcHJpbnRrKCJmbGFzaF93cml0ZTogb2Zmc2V0PTB4JWxYLCBidWZmZXI9MHglcCwgY291bnQ9MHglWC5cbiIsCisJCSAgICAgICBwLCBidWYsIGNvdW50KTsKKworCWlmICghZ2JXcml0ZUVuYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocCA8IDY0ICogMTAyNCAmJiAoIWdiV3JpdGVCYXNlNjRFbmFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogY2hlY2sgZm9yIG91dCBvZiByYW5nZSBwb3Mgb3IgY291bnQKKwkgKi8KKwlpZiAocCA+PSBnYkZsYXNoU2l6ZSkKKwkJcmV0dXJuIGNvdW50ID8gLUVOWElPIDogMDsKKworCWlmIChjb3VudCA+IGdiRmxhc2hTaXplIC0gcCkKKwkJY291bnQgPSBnYkZsYXNoU2l6ZSAtIHA7CisJCQkKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBXZSBub3cgbG9jayBhZ2FpbnN0IHJlYWRzIGFuZCB3cml0ZXMuIC0tcm1rCisJICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbndmbGFzaF9zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJd3JpdHRlbiA9IDA7CisKKwlsZWRzX2V2ZW50KGxlZF9jbGFpbSk7CisJbGVkc19ldmVudChsZWRfZ3JlZW5fb24pOworCisJbkJsb2NrID0gKGludCkgcCA+PiAxNjsJLy9ibG9jayAjIG9mIDY0SyBieXRlcworCisJLyoKKwkgKiAjIG9mIDY0SyBibG9ja3MgdG8gZXJhc2UgYW5kIHdyaXRlCisJICovCisJdGVtcCA9ICgoaW50KSAocCArIGNvdW50KSA+PiAxNikgLSBuQmxvY2sgKyAxOworCisJLyoKKwkgKiB3cml0ZSBlbmRzIGF0IGV4YWN0bHkgNjRrIGJvdW5kYXJ5PworCSAqLworCWlmICgoKGludCkgKHAgKyBjb3VudCkgJiAweEZGRkYpID09IDApCisJCXRlbXAgLT0gMTsKKworCWlmIChmbGFzaGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZmxhc2hfd3JpdGU6IHdyaXRpbmcgJWQgYmxvY2socykgIgorCQkJInN0YXJ0aW5nIGF0ICVkLlxuIiwgdGVtcCwgbkJsb2NrKTsKKworCWZvciAoOyB0ZW1wOyB0ZW1wLS0sIG5CbG9jaysrKSB7CisJCWlmIChmbGFzaGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3dyaXRlOiBlcmFzaW5nIGJsb2NrICVkLlxuIiwgbkJsb2NrKTsKKworCQkvKgorCQkgKiBmaXJzdCB3ZSBoYXZlIHRvIGVyYXNlIHRoZSBibG9jayhzKSwgd2hlcmUgd2Ugd2lsbCB3cml0ZS4uLgorCQkgKi8KKwkJaSA9IDA7CisJCWogPSAwOworCSAgUmV0cnlCbG9jazoKKwkJZG8geworCQkJcmMgPSBlcmFzZV9ibG9jayhuQmxvY2spOworCQkJaSsrOworCQl9IHdoaWxlIChyYyAmJiBpIDwgMTApOworCisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmbGFzaF93cml0ZTogZXJhc2UgZXJyb3IgJXhcbiIsIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmbGFzaGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3dyaXRlOiB3cml0aW5nIG9mZnNldCAlbFgsICIKKwkJCSAgICAgICAiZnJvbSBidWYgJXAsIGJ5dGVzIGxlZnQgJVguXG4iLCBwLCBidWYsCisJCQkgICAgICAgY291bnQgLSB3cml0dGVuKTsKKworCQkvKgorCQkgKiB3cml0ZV9ibG9jayB3aWxsIGxpbWl0IHdyaXRlIHRvIHNwYWNlIGxlZnQgaW4gdGhpcyBibG9jaworCQkgKi8KKwkJcmMgPSB3cml0ZV9ibG9jayhwLCBidWYsIGNvdW50IC0gd3JpdHRlbik7CisJCWorKzsKKworCQkvKgorCQkgKiBpZiBzb21laG93IHdyaXRlIHZlcmlmeSBmYWlsZWQ/IENhbid0IGhhcHBlbj8/CisJCSAqLworCQlpZiAoIXJjKSB7CisJCQkvKgorCQkJICogcmV0cnkgdXAgdG8gMTAgdGltZXMKKwkJCSAqLworCQkJaWYgKGogPCAxMCkKKwkJCQlnb3RvIFJldHJ5QmxvY2s7CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBlbHNlIHF1aXQgd2l0aCBlcnJvci4uLgorCQkJCSAqLworCQkJCXJjID0gLTE7CisKKwkJfQorCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImZsYXNoX3dyaXRlOiB3cml0ZSBlcnJvciAlWFxuIiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJcCArPSByYzsKKwkJYnVmICs9IHJjOworCQl3cml0dGVuICs9IHJjOworCQkqcHBvcyArPSByYzsKKworCQlpZiAoZmxhc2hkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF93cml0ZTogd3JpdHRlbiAweCVYIGJ5dGVzIE9LLlxuIiwgd3JpdHRlbik7CisJfQorCisJLyoKKwkgKiByZXN0b3JlIHJlZyBvbiBleGl0CisJICovCisJbGVkc19ldmVudChsZWRfcmVsZWFzZSk7CisKKwl1cCgmbndmbGFzaF9zZW0pOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKKworLyoKKyAqIFRoZSBtZW1vcnkgZGV2aWNlcyB1c2UgdGhlIGZ1bGwgMzIvNjQgYml0cyBvZiB0aGUgb2Zmc2V0LCBhbmQgc28gd2UgY2Fubm90CisgKiBjaGVjayBhZ2FpbnN0IG5lZ2F0aXZlIGFkZHJlc3NlczogdGhleSBhcmUgb2suIFRoZSByZXR1cm4gdmFsdWUgaXMgd2VpcmQsCisgKiB0aG91Z2gsIGluIHRoYXQgY2FzZSAoMCkuCisgKgorICogYWxzbyBub3RlIHRoYXQgc2Vla2luZyByZWxhdGl2ZSB0byB0aGUgImVuZCBvZiBmaWxlIiBpc24ndCBzdXBwb3J0ZWQ6CisgKiBpdCBoYXMgbm8gbWVhbmluZywgc28gaXQgcmV0dXJucyAtRUlOVkFMLgorICovCitzdGF0aWMgbG9mZl90IGZsYXNoX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZsYXNoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF9sbHNlZWs6IG9mZnNldD0weCVYLCBvcmlnPTB4JVguXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludCkgb2Zmc2V0LCBvcmlnKTsKKworCXN3aXRjaCAob3JpZykgeworCWNhc2UgMDoKKwkJaWYgKG9mZnNldCA8IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgodW5zaWduZWQgaW50KSBvZmZzZXQgPiBnYkZsYXNoU2l6ZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJZmlsZS0+Zl9wb3MgPSAodW5zaWduZWQgaW50KSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDE6CisJCWlmICgoZmlsZS0+Zl9wb3MgKyBvZmZzZXQpID4gZ2JGbGFzaFNpemUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGZpbGUtPmZfcG9zICsgb2Zmc2V0KSA8IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogYXNzdW1lIHRoYXQgbWFpbiBXcml0ZSByb3V0aW5lIGRpZCB0aGUgcGFyYW1ldGVyIGNoZWNraW5nLi4uCisgKiBzbyBqdXN0IGdvIGFoZWFkIGFuZCBlcmFzZSwgd2hhdCByZXF1ZXN0ZWQhCisgKi8KKworc3RhdGljIGludCBlcmFzZV9ibG9jayhpbnQgbkJsb2NrKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwV3JpdGVQdHI7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCB0ZW1wLCB0ZW1wMTsKKworCS8qCisJICogb3JhbmdlIExFRCA9PSBlcmFzZQorCSAqLworCWxlZHNfZXZlbnQobGVkX2FtYmVyX29uKTsKKworCS8qCisJICogcmVzZXQgZm9vdGJyaWRnZSB0byB0aGUgY29ycmVjdCBvZmZzZXQgMCAoLi4uMC4uMykKKwkgKi8KKwkqQ1NSX1JPTVdSSVRFUkVHID0gMDsKKworCS8qCisJICogZHVtbXkgUk9NIHJlYWQKKwkgKi8KKwljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCk7CisKKwlraWNrX29wZW4oKTsKKwkvKgorCSAqIHJlc2V0IHN0YXR1cyBpZiBvbGQgZXJyb3JzCisJICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4NTA7CisKKwkvKgorCSAqIGVyYXNlIGEgYmxvY2suLi4KKwkgKiBhaW0gYXQgdGhlIG1pZGRsZSBvZiBhIGN1cnJlbnQgYmxvY2suLi4KKwkgKi8KKwlwV3JpdGVQdHIgPSAodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKEZMQVNIX0JBU0UgKyAweDgwMDAgKyAobkJsb2NrIDw8IDE2KSkpOworCS8qCisJICogZHVtbXkgcmVhZAorCSAqLworCWMxID0gKnBXcml0ZVB0cjsKKworCWtpY2tfb3BlbigpOworCS8qCisJICogZXJhc2UKKwkgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgcFdyaXRlUHRyID0gMHgyMDsKKworCS8qCisJICogY29uZmlybQorCSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBwV3JpdGVQdHIgPSAweEQwOworCisJLyoKKwkgKiB3YWl0IDEwIG1zCisJICovCisJbXNsZWVwKDEwKTsKKworCS8qCisJICogd2FpdCB3aGlsZSBlcmFzaW5nIGluIHByb2Nlc3MgKHVwIHRvIDEwIHNlYykKKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDEwICogSFo7CisJYzEgPSAwOworCXdoaWxlICghKGMxICYgMHg4MCkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJbXNsZWVwKDEwKTsKKwkJLyoKKwkJICogcmVhZCBhbnkgYWRkcmVzcworCQkgKi8KKwkJYzEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKHBXcml0ZVB0cik7CisJCS8vICAgICAgICAgICAgICBwcmludGsoIkZsYXNoX2VyYXNlOiBzdGF0dXM9JVguXG4iLGMxKTsKKwl9CisKKwkvKgorCSAqIHNldCBmbGFzaCBmb3Igbm9ybWFsIHJlYWQgYWNjZXNzCisJICovCisJa2lja19vcGVuKCk7CisvLyAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKEZMQVNIX0JBU0UrMHg4MDAwKSA9IDB4RkY7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIHBXcml0ZVB0ciA9IDB4RkY7CS8vYmFjayB0byBub3JtYWwgb3BlcmF0aW9uCisKKwkvKgorCSAqIGNoZWNrIGlmIGVyYXNlIGVycm9ycyB3ZXJlIHJlcG9ydGVkCisJICovCisJaWYgKGMxICYgMHgyMCkgeworCQlwcmludGsoS0VSTl9FUlIgImZsYXNoX2VyYXNlOiBlcnIgYXQgJXBcbiIsIHBXcml0ZVB0cik7CisKKwkJLyoKKwkJICogcmVzZXQgZXJyb3IKKwkJICovCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCkgPSAweDUwOworCQlyZXR1cm4gLTI7CisJfQorCisJLyoKKwkgKiBqdXN0IHRvIG1ha2Ugc3VyZSAtIHZlcmlmeSBpZiBlcmFzZWQgT0suLi4KKwkgKi8KKwltc2xlZXAoMTApOworCisJcFdyaXRlUHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKCh1bnNpZ25lZCBpbnQpIChGTEFTSF9CQVNFICsgKG5CbG9jayA8PCAxNikpKTsKKworCWZvciAodGVtcCA9IDA7IHRlbXAgPCAxNiAqIDEwMjQ7IHRlbXArKywgcFdyaXRlUHRyICs9IDQpIHsKKwkJaWYgKCh0ZW1wMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIHBXcml0ZVB0cikgIT0gMHhGRkZGRkZGRikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmbGFzaF9lcmFzZTogdmVyaWZ5IGVyciBhdCAlcCA9ICVYXG4iLAorCQkJICAgICAgIHBXcml0ZVB0ciwgdGVtcDEpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIHdyaXRlX2Jsb2NrIHdpbGwgbGltaXQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHNwYWNlIGluIHRoaXMgYmxvY2sKKyAqLworc3RhdGljIGludCB3cml0ZV9ibG9jayh1bnNpZ25lZCBsb25nIHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYzE7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGMyOworCXVuc2lnbmVkIGNoYXIgKnBXcml0ZVB0cjsKKwl1bnNpZ25lZCBpbnQgdUFkZHJlc3M7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0MTsKKworCS8qCisJICogcmVkIExFRCA9PSB3cml0ZQorCSAqLworCWxlZHNfZXZlbnQobGVkX2FtYmVyX29mZik7CisJbGVkc19ldmVudChsZWRfcmVkX29uKTsKKworCXBXcml0ZVB0ciA9ICh1bnNpZ25lZCBjaGFyICopICgodW5zaWduZWQgaW50KSAoRkxBU0hfQkFTRSArIHApKTsKKworCS8qCisJICogY2hlY2sgaWYgd3JpdGUgd2lsbCBlbmQgaW4gdGhpcyBibG9jay4uLi4KKwkgKi8KKwlvZmZzZXQgPSBwICYgMHhGRkZGOworCisJaWYgKG9mZnNldCArIGNvdW50ID4gMHgxMDAwMCkKKwkJY291bnQgPSAweDEwMDAwIC0gb2Zmc2V0OworCisJLyoKKwkgKiB3YWl0IHVwIHRvIDMwIHNlYyBmb3IgdGhpcyBibG9jaworCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgMzAgKiBIWjsKKworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY291bnQ7IG9mZnNldCsrLCBwV3JpdGVQdHIrKykgeworCQl1QWRkcmVzcyA9ICh1bnNpZ25lZCBpbnQpIHBXcml0ZVB0cjsKKwkJdUFkZHJlc3MgJj0gMHhGRkZGRkZGQzsKKwkJaWYgKF9fZ2V0X3VzZXIoYzIsIGJ1ZiArIG9mZnNldCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCSAgV3JpdGVSZXRyeToKKwkgIAkvKgorCSAgCSAqIGR1bW15IHJlYWQKKwkgIAkgKi8KKwkJYzEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApOworCisJCS8qCisJCSAqIGtpY2sgb3BlbiB0aGUgd3JpdGUgZ2F0ZQorCQkgKi8KKwkJa2lja19vcGVuKCk7CisKKwkJLyoKKwkJICogcHJvZ3JhbSBmb290YnJpZGdlIHRvIHRoZSBjb3JyZWN0IG9mZnNldC4uLjAuLjMKKwkJICovCisJCSpDU1JfUk9NV1JJVEVSRUcgPSAodW5zaWduZWQgaW50KSBwV3JpdGVQdHIgJiAzOworCisJCS8qCisJCSAqIHdyaXRlIGNtZAorCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopICh1QWRkcmVzcykgPSAweDQwOworCisJCS8qCisJCSAqIGRhdGEgdG8gd3JpdGUKKwkJICovCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAodUFkZHJlc3MpID0gYzI7CisKKwkJLyoKKwkJICogZ2V0IHN0YXR1cworCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHgxMDAwMCkgPSAweDcwOworCisJCWMxID0gMDsKKworCQkvKgorCQkgKiB3YWl0IHVwIHRvIDEgc2VjIGZvciB0aGlzIGJ5dGUKKwkJICovCisJCXRpbWVvdXQxID0gamlmZmllcyArIDEgKiBIWjsKKworCQkvKgorCQkgKiB3aGlsZSBub3QgcmVhZHkuLi4KKwkJICovCisJCXdoaWxlICghKGMxICYgMHg4MCkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dDEpKQorCQkJYzEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApOworCisJCS8qCisJCSAqIGlmIHRpbWVvdXQgZ2V0dGluZyBzdGF0dXMKKwkJICovCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQxKSkgeworCQkJa2lja19vcGVuKCk7CisJCQkvKgorCQkJICogcmVzZXQgZXJyCisJCQkgKi8KKwkJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCkgPSAweDUwOworCisJCQlnb3RvIFdyaXRlUmV0cnk7CisJCX0KKwkJLyoKKwkJICogc3dpdGNoIG9uIHJlYWQgYWNjZXNzLCBhcyBhIGRlZmF1bHQgZmxhc2ggb3BlcmF0aW9uIG1vZGUKKwkJICovCisJCWtpY2tfb3BlbigpOworCQkvKgorCQkgKiByZWFkIGFjY2VzcworCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4RkY7CisKKwkJLyoKKwkJICogaWYgaGFyZHdhcmUgcmVwb3J0cyBhbiBlcnJvciB3cml0aW5nLCBhbmQgbm90IHRpbWVvdXQgLSAKKwkJICogcmVzZXQgdGhlIGNoaXAgYW5kIHJldHJ5CisJCSAqLworCQlpZiAoYzEgJiAweDEwKSB7CisJCQlraWNrX29wZW4oKTsKKwkJCS8qCisJCQkgKiByZXNldCBlcnIKKwkJCSAqLworCQkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4NTA7CisKKwkJCS8qCisJCQkgKiBiZWZvcmUgdGltZW91dD8KKwkJCSAqLworCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJaWYgKGZsYXNoZGVidWcpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJ3cml0ZV9ibG9jazogUmV0cnlpbmcgd3JpdGUgYXQgMHglWCluIiwKKwkJCQkJICAgICAgIHBXcml0ZVB0ciAtIEZMQVNIX0JBU0UpOworCisJCQkJLyoKKwkJCQkgKiBubyBMRUQgPT0gd2FpdGluZworCQkJCSAqLworCQkJCWxlZHNfZXZlbnQobGVkX2FtYmVyX29mZik7CisJCQkJLyoKKwkJCQkgKiB3YWl0IGNvdXBsZSBtcworCQkJCSAqLworCQkJCW1zbGVlcCgxMCk7CisJCQkJLyoKKwkJCQkgKiByZWQgTEVEID09IHdyaXRlCisJCQkJICovCisJCQkJbGVkc19ldmVudChsZWRfcmVkX29uKTsKKworCQkJCWdvdG8gV3JpdGVSZXRyeTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ3cml0ZV9ibG9jazogdGltZW91dCBhdCAweCVYXG4iLAorCQkJCSAgICAgICBwV3JpdGVQdHIgLSBGTEFTSF9CQVNFKTsKKwkJCQkvKgorCQkJCSAqIHJldHVybiBlcnJvciAtMgorCQkJCSAqLworCQkJCXJldHVybiAtMjsKKworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBncmVlbiBMRUQgPT0gcmVhZC92ZXJpZnkKKwkgKi8KKwlsZWRzX2V2ZW50KGxlZF9hbWJlcl9vZmYpOworCWxlZHNfZXZlbnQobGVkX2dyZWVuX29uKTsKKworCW1zbGVlcCgxMCk7CisKKwlwV3JpdGVQdHIgPSAodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKEZMQVNIX0JBU0UgKyBwKSk7CisKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGNvdW50OyBvZmZzZXQrKykgeworCQljaGFyIGMsIGMxOworCQlpZiAoX19nZXRfdXNlcihjLCBidWYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZisrOworCQlpZiAoKGMxID0gKnBXcml0ZVB0cisrKSAhPSBjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndyaXRlX2Jsb2NrOiB2ZXJpZnkgZXJyb3IgYXQgMHglWCAoJTAyWCE9JTAyWClcbiIsCisJCQkgICAgICAgcFdyaXRlUHRyIC0gRkxBU0hfQkFTRSwgYzEsIGMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHZvaWQga2lja19vcGVuKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogd2Ugd2FudCB0byB3cml0ZSBhIGJpdCBwYXR0ZXJuIFhYWDEgdG8gWGlsaW54IHRvIGVuYWJsZQorCSAqIHRoZSB3cml0ZSBnYXRlLCB3aGljaCB3aWxsIGJlIG9wZW4gZm9yIGFib3V0IHRoZSBuZXh0IDJtcy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJY3BsZF9tb2RpZnkoMSwgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGxldCB0aGUgSVNBIGJ1cyB0byBjYXRjaCBvbi4uLgorCSAqLworCXVkZWxheSgyNSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZsYXNoX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IGZsYXNoX2xsc2VlaywKKwkucmVhZAkJPSBmbGFzaF9yZWFkLAorCS53cml0ZQkJPSBmbGFzaF93cml0ZSwKKwkuaW9jdGwJCT0gZmxhc2hfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZmxhc2hfbWlzY2RldiA9Cit7CisJRkxBU0hfTUlOT1IsCisJIm53Zmxhc2giLAorCSZmbGFzaF9mb3BzCit9OworCitzdGF0aWMgaW50IF9faW5pdCBud2ZsYXNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCWludCBpZDsKKworCQlGTEFTSF9CQVNFID0gaW9yZW1hcChEQzIxMjg1X0ZMQVNILCBLRkxBU0hfU0laRTQpOworCQlpZiAoIUZMQVNIX0JBU0UpCisJCQlnb3RvIG91dDsKKworCQlpZCA9IGdldF9mbGFzaF9pZCgpOworCQlpZiAoKGlkICE9IEtGTEFTSF9JRCkgJiYgKGlkICE9IEtGTEFTSF9JRDQpKSB7CisJCQlyZXQgPSAtRU5YSU87CisJCQlpb3VubWFwKCh2b2lkICopRkxBU0hfQkFTRSk7CisJCQlwcmludGsoIkZsYXNoOiBpbmNvcnJlY3QgSUQgMHglMDRYLlxuIiwgaWQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwcmludGsoIkZsYXNoIFJPTSBkcml2ZXIgdi4lcywgZmxhc2ggZGV2aWNlIElEIDB4JTA0WCwgc2l6ZSAlZCBNYi5cbiIsCisJCSAgICAgICBOV0ZMQVNIX1ZFUlNJT04sIGlkLCBnYkZsYXNoU2l6ZSAvICgxMDI0ICogMTAyNCkpOworCisJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmZsYXNoX21pc2NkZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJaW91bm1hcCgodm9pZCAqKUZMQVNIX0JBU0UpOworCQl9CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBud2ZsYXNoX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmZsYXNoX21pc2NkZXYpOworCWlvdW5tYXAoKHZvaWQgKilGTEFTSF9CQVNFKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZmxhc2hkZWJ1ZywgYm9vbCwgMDY0NCk7CisKK21vZHVsZV9pbml0KG53Zmxhc2hfaW5pdCk7Cittb2R1bGVfZXhpdChud2ZsYXNoX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmJmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL0tjb25maWcKQEAgLTAsMCArMSwyMiBAQAorIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIEhPVFBMVUcgJiYgUENNQ0lBIT1uCisKK2NvbmZpZyBTWU5DTElOS19DUworCXRyaXN0YXRlICJTeW5jTGluayBQQyBDYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ01DSUEKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFN5bmNMaW5rIFBDIENhcmQgc2VyaWFsIGFkYXB0ZXIsIHJ1bm5pbmcKKwkgIGFzeW5jaHJvbm91cyBhbmQgSERMQyBjb21tdW5pY2F0aW9ucyB1cCB0byA1MTJLYnBzLiBUaGUgcG9ydCBpcworCSAgc2VsZWN0YWJsZSBmb3IgUlMtMjMyLCBWLjM1LCBSUy00NDksIFJTLTUzMCwgYW5kIFguMjEKKworCSAgVGhpcyBkcml2ZXIgbWF5IGJlIGJ1aWx0IGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW5jbGlua21wLiAgSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0KKwkgIGhlcmUuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIGRyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBQQ01DSUEgY2hhciBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX1NZTkNMSU5LX0NTKSArPSBzeW5jbGlua19jcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4ZDg2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwpAQCAtMCwwICsxLDQ2MTEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKyAqCisgKiAkSWQ6IHN5bmNsaW5rX2NzLmMsdiA0LjI2IDIwMDQvMDgvMTEgMTk6MzA6MDIgcGF1bGtmIEV4cCAkCisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgTWljcm9nYXRlIFN5bmNMaW5rIFBDIENhcmQKKyAqIG11bHRpcHJvdG9jb2wgc2VyaWFsIGFkYXB0ZXIuCisgKgorICogd3JpdHRlbiBieSBQYXVsIEZ1bGdodW0gZm9yIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICogcGF1bGtmQG1pY3JvZ2F0ZS5jb20KKyAqCisgKiBNaWNyb2dhdGUgYW5kIFN5bmNMaW5rIGFyZSB0cmFkZW1hcmtzIG9mIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBWRVJTSU9OKHZlcixyZWwsc2VxKSAoKCh2ZXIpPDwxNikgfCAoKHJlbCk8PDgpIHwgKHNlcSkpCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyMgIGRlZmluZSBCUkVBS1BPSU5UKCkgYXNtKCIgICBpbnQgJDMiKTsKKyNlbHNlCisjICBkZWZpbmUgQlJFQUtQT0lOVCgpIHsgfQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0RFVklDRV9DT1VOVCA0CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpZmRlZiBDT05GSUdfSERMQ19NT0RVTEUKKyNkZWZpbmUgQ09ORklHX0hETEMgMQorI2VuZGlmCisKKyNkZWZpbmUgR0VUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBnZXRfdXNlcih2YWx1ZSxhZGRyKQorI2RlZmluZSBDT1BZX0ZST01fVVNFUihlcnJvcixkZXN0LHNyYyxzaXplKSBlcnJvciA9IGNvcHlfZnJvbV91c2VyKGRlc3Qsc3JjLHNpemUpID8gLUVGQVVMVCA6IDAKKyNkZWZpbmUgUFVUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBwdXRfdXNlcih2YWx1ZSxhZGRyKQorI2RlZmluZSBDT1BZX1RPX1VTRVIoZXJyb3IsZGVzdCxzcmMsc2l6ZSkgZXJyb3IgPSBjb3B5X3RvX3VzZXIoZGVzdCxzcmMsc2l6ZSkgPyAtRUZBVUxUIDogMAorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImxpbnV4L3N5bmNsaW5rLmgiCisKK3N0YXRpYyBNR1NMX1BBUkFNUyBkZWZhdWx0X3BhcmFtcyA9IHsKKwlNR1NMX01PREVfSERMQywJCQkvKiB1bnNpZ25lZCBsb25nIG1vZGUgKi8KKwkwLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGxvb3BiYWNrOyAqLworCUhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1LAkvKiB1bnNpZ25lZCBzaG9ydCBmbGFnczsgKi8KKwlIRExDX0VOQ09ESU5HX05SWklfU1BBQ0UsCS8qIHVuc2lnbmVkIGNoYXIgZW5jb2Rpbmc7ICovCisJMCwJCQkJLyogdW5zaWduZWQgbG9uZyBjbG9ja19zcGVlZDsgKi8KKwkweGZmLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGFkZHJfZmlsdGVyOyAqLworCUhETENfQ1JDXzE2X0NDSVRULAkJLyogdW5zaWduZWQgc2hvcnQgY3JjX3R5cGU7ICovCisJSERMQ19QUkVBTUJMRV9MRU5HVEhfOEJJVFMsCS8qIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVfbGVuZ3RoOyAqLworCUhETENfUFJFQU1CTEVfUEFUVEVSTl9OT05FLAkvKiB1bnNpZ25lZCBjaGFyIHByZWFtYmxlOyAqLworCTk2MDAsCQkJCS8qIHVuc2lnbmVkIGxvbmcgZGF0YV9yYXRlOyAqLworCTgsCQkJCS8qIHVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOyAqLworCTEsCQkJCS8qIHVuc2lnbmVkIGNoYXIgc3RvcF9iaXRzOyAqLworCUFTWU5DX1BBUklUWV9OT05FCQkvKiB1bnNpZ25lZCBjaGFyIHBhcml0eTsgKi8KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWNoYXIgZGF0YVsxXTsKK30gUlhCVUY7CisKKy8qIFRoZSBxdWV1ZSBvZiBCSCBhY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCAqLworCisjZGVmaW5lIEJIX1JFQ0VJVkUgIDEKKyNkZWZpbmUgQkhfVFJBTlNNSVQgMgorI2RlZmluZSBCSF9TVEFUVVMgICA0CisKKyNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworc3RydWN0IF9pbnB1dF9zaWduYWxfZXZlbnRzIHsKKwlpbnQJcmlfdXA7CQorCWludAlyaV9kb3duOworCWludAlkc3JfdXA7CisJaW50CWRzcl9kb3duOworCWludAlkY2RfdXA7CisJaW50CWRjZF9kb3duOworCWludAljdHNfdXA7CisJaW50CWN0c19kb3duOworfTsKKworCisvKgorICogRGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKi8KKyAKK3R5cGVkZWYgc3RydWN0IF9tZ3NscGNfaW5mbyB7CisJdm9pZCAqaWZfcHRyOwkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCWludAkJCW1hZ2ljOworCWludAkJCWZsYWdzOworCWludAkJCWNvdW50OwkJLyogY291bnQgb2Ygb3BlbnMgKi8KKwlpbnQJCQlsaW5lOworCXVuc2lnbmVkIHNob3J0CQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OwkvKiB0aW1lIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgKi8KKwkKKwlzdHJ1Y3QgbWdzbF9pY291bnQJaWNvdW50OworCQorCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OworCWludAkJCXRpbWVvdXQ7CisJaW50CQkJeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50CQkJYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwl1bnNpZ25lZCBjaGFyCQlyZWFkX3N0YXR1c19tYXNrOworCXVuc2lnbmVkIGNoYXIJCWlnbm9yZV9zdGF0dXNfbWFzazsJCisKKwl1bnNpZ25lZCBjaGFyICp0eF9idWY7CisJaW50ICAgICAgICAgICAgdHhfcHV0OworCWludCAgICAgICAgICAgIHR4X2dldDsKKwlpbnQgICAgICAgICAgICB0eF9jb3VudDsKKworCS8qIGNpcmN1bGFyIGxpc3Qgb2YgZml4ZWQgbGVuZ3RoIHJ4IGJ1ZmZlcnMgKi8KKworCXVuc2lnbmVkIGNoYXIgICpyeF9idWY7ICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdGVkIGZvciBhbGwgcnggYnVmZmVycyAqLworCWludCAgICAgICAgICAgIHJ4X2J1Zl90b3RhbF9zaXplOyAvKiBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJ4IGJ1ZmZlcnMgKi8KKwlpbnQgICAgICAgICAgICByeF9wdXQ7ICAgICAgICAgLyogaW5kZXggb2YgbmV4dCBlbXB0eSByeCBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgICByeF9nZXQ7ICAgICAgICAgLyogaW5kZXggb2YgbmV4dCBmdWxsIHJ4IGJ1ZmZlciAqLworCWludCAgICAgICAgICAgIHJ4X2J1Zl9zaXplOyAgICAvKiBzaXplIGluIGJ5dGVzIG9mIHNpbmdsZSByeCBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgICByeF9idWZfY291bnQ7ICAgLyogdG90YWwgbnVtYmVyIG9mIHJ4IGJ1ZmZlcnMgKi8KKwlpbnQgICAgICAgICAgICByeF9mcmFtZV9jb3VudDsgLyogbnVtYmVyIG9mIGZ1bGwgcnggYnVmZmVycyAqLworCQorCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCQorCXdhaXRfcXVldWVfaGVhZF90CXN0YXR1c19ldmVudF93YWl0X3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZXZlbnRfd2FpdF9xOworCXN0cnVjdCB0aW1lcl9saXN0CXR4X3RpbWVyOwkvKiBIRExDIHRyYW5zbWl0IHRpbWVvdXQgdGltZXIgKi8KKwlzdHJ1Y3QgX21nc2xwY19pbmZvCSpuZXh0X2RldmljZTsJLyogZGV2aWNlIGxpc3QgbGluayAqLworCisJdW5zaWduZWQgc2hvcnQgaW1yYV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCBpbXJiX3ZhbHVlOworCXVuc2lnbmVkIGNoYXIgIHBpbV92YWx1ZTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsJCS8qIHRhc2sgc3RydWN0dXJlIGZvciBzY2hlZHVsaW5nIGJoICovCisKKwl1MzIgbWF4X2ZyYW1lX3NpemU7CisKKwl1MzIgcGVuZGluZ19iaDsKKworCWludCBiaF9ydW5uaW5nOworCWludCBiaF9yZXF1ZXN0ZWQ7CisJCisJaW50IGRjZF9jaGtjb3VudDsgLyogY2hlY2sgY291bnRzIHRvIHByZXZlbnQgKi8KKwlpbnQgY3RzX2Noa2NvdW50OyAvKiB0b28gbWFueSBJUlFzIGlmIGEgc2lnbmFsICovCisJaW50IGRzcl9jaGtjb3VudDsgLyogaXMgZmxvYXRpbmcgKi8KKwlpbnQgcmlfY2hrY291bnQ7CisKKwlpbnQgcnhfZW5hYmxlZDsKKwlpbnQgcnhfb3ZlcmZsb3c7CisKKwlpbnQgdHhfZW5hYmxlZDsKKwlpbnQgdHhfYWN0aXZlOworCWludCB0eF9hYm9ydGluZzsKKwl1MzIgaWRsZV9tb2RlOworCisJaW50IGlmX21vZGU7IC8qIHNlcmlhbCBpbnRlcmZhY2Ugc2VsZWN0aW9uIChSUy0yMzIsIHYuMzUgZXRjKSAqLworCisJY2hhciBkZXZpY2VfbmFtZVsyNV07CQkvKiBkZXZpY2UgaW5zdGFuY2UgbmFtZSAqLworCisJdW5zaWduZWQgaW50IGlvX2Jhc2U7CS8qIGJhc2UgSS9PIGFkZHJlc3Mgb2YgYWRhcHRlciAqLworCXVuc2lnbmVkIGludCBpcnFfbGV2ZWw7CisJCisJTUdTTF9QQVJBTVMgcGFyYW1zOwkJLyogY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLworCisJdW5zaWduZWQgY2hhciBzZXJpYWxfc2lnbmFsczsJLyogY3VycmVudCBzZXJpYWwgc2lnbmFsIHN0YXRlcyAqLworCisJY2hhciBpcnFfb2NjdXJyZWQ7CQkvKiBmb3IgZGlhZ25vc3RpY3MgdXNlICovCisJY2hhciB0ZXN0aW5nX2lycTsKKwl1bnNpZ25lZCBpbnQgaW5pdF9lcnJvcjsJLyogc3RhcnR1cCBlcnJvciAoRElBR1MpCSovCisKKwljaGFyIGZsYWdfYnVmW01BWF9BU1lOQ19CVUZGRVJfU0laRV07CisJQk9PTEVBTiBkcm9wX3J0c19vbl90eF9kb25lOworCisJc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzCWlucHV0X3NpZ25hbF9ldmVudHM7CisKKwkvKiBQQ01DSUEgc3VwcG9ydCAqLworCWRldl9saW5rX3QJICAgICAgbGluazsKKwlkZXZfbm9kZV90CSAgICAgIG5vZGU7CisJaW50CQkgICAgICBzdG9wOworCisJLyogU1BQUC9DaXNjbyBIRExDIGRldmljZSBwYXJ0cyAqLworCWludCBuZXRjb3VudDsKKwlpbnQgZG9zeW5jcHBwOworCXNwaW5sb2NrX3QgbmV0bG9jazsKKworI2lmZGVmIENPTkZJR19IRExDCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyNlbmRpZgorCit9IE1HU0xQQ19JTkZPOworCisjZGVmaW5lIE1HU0xQQ19NQUdJQyAweDU0MDIKKworLyoKKyAqIFRoZSBzaXplIG9mIHRoZSBzZXJpYWwgeG1pdCBidWZmZXIgaXMgMSBwYWdlLCBvciA0MDk2IGJ5dGVzCisgKi8KKyNkZWZpbmUgVFhCVUZTSVpFIDQwOTYKKworICAgIAorI2RlZmluZSBDSEEgICAgIDB4MDAgICAvKiBjaGFubmVsIEEgb2Zmc2V0ICovCisjZGVmaW5lIENIQiAgICAgMHg0MCAgIC8qIGNoYW5uZWwgQiBvZmZzZXQgKi8KKworLyoKKyAqICBGSVhNRTogUFBDIGhhcyBQVlIgZGVmaW5lZCBpbiBhc20vcmVnLmguICBGb3Igbm93IHdlIGp1c3QgdW5kZWYgaXQuCisgKi8KKyN1bmRlZiBQVlIKKworI2RlZmluZSBSWEZJRk8gIDAKKyNkZWZpbmUgVFhGSUZPICAwCisjZGVmaW5lIFNUQVIgICAgMHgyMAorI2RlZmluZSBDTURSICAgIDB4MjAKKyNkZWZpbmUgUlNUQSAgICAweDIxCisjZGVmaW5lIFBSRSAgICAgMHgyMQorI2RlZmluZSBNT0RFICAgIDB4MjIKKyNkZWZpbmUgVElNUiAgICAweDIzCisjZGVmaW5lIFhBRDEgICAgMHgyNAorI2RlZmluZSBYQUQyICAgIDB4MjUKKyNkZWZpbmUgUkFIMSAgICAweDI2CisjZGVmaW5lIFJBSDIgICAgMHgyNworI2RlZmluZSBEQUZPICAgIDB4MjcKKyNkZWZpbmUgUkFMMSAgICAweDI4CisjZGVmaW5lIFJGQyAgICAgMHgyOAorI2RlZmluZSBSSENSICAgIDB4MjkKKyNkZWZpbmUgUkFMMiAgICAweDI5CisjZGVmaW5lIFJCQ0wgICAgMHgyYQorI2RlZmluZSBYQkNMICAgIDB4MmEKKyNkZWZpbmUgUkJDSCAgICAweDJiCisjZGVmaW5lIFhCQ0ggICAgMHgyYgorI2RlZmluZSBDQ1IwICAgIDB4MmMKKyNkZWZpbmUgQ0NSMSAgICAweDJkCisjZGVmaW5lIENDUjIgICAgMHgyZQorI2RlZmluZSBDQ1IzICAgIDB4MmYKKyNkZWZpbmUgVlNUUiAgICAweDM0CisjZGVmaW5lIEJHUiAgICAgMHgzNAorI2RlZmluZSBSTENSICAgIDB4MzUKKyNkZWZpbmUgQU1MICAgICAweDM2CisjZGVmaW5lIEFNSCAgICAgMHgzNworI2RlZmluZSBHSVMgICAgIDB4MzgKKyNkZWZpbmUgSVZBICAgICAweDM4CisjZGVmaW5lIElQQyAgICAgMHgzOQorI2RlZmluZSBJU1IgICAgIDB4M2EKKyNkZWZpbmUgSU1SICAgICAweDNhCisjZGVmaW5lIFBWUiAgICAgMHgzYworI2RlZmluZSBQSVMgICAgIDB4M2QKKyNkZWZpbmUgUElNICAgICAweDNkCisjZGVmaW5lIFBDUiAgICAgMHgzZQorI2RlZmluZSBDQ1I0ICAgIDB4M2YKKyAgICAKKy8vIElNUi9JU1IKKyAgICAKKyNkZWZpbmUgSVJRX0JSRUFLX09OICAgIEJJVDE1ICAgLy8gcnggYnJlYWsgZGV0ZWN0ZWQKKyNkZWZpbmUgSVJRX0RBVEFPVkVSUlVOIEJJVDE0CS8vIHJlY2VpdmUgZGF0YSBvdmVyZmxvdworI2RlZmluZSBJUlFfQUxMU0VOVCAgICAgQklUMTMJLy8gYWxsIHNlbnQKKyNkZWZpbmUgSVJRX1VOREVSUlVOICAgIEJJVDEyCS8vIHRyYW5zbWl0IGRhdGEgdW5kZXJydW4KKyNkZWZpbmUgSVJRX1RJTUVSICAgICAgIEJJVDExCS8vIHRpbWVyIGludGVycnVwdAorI2RlZmluZSBJUlFfQ1RTICAgICAgICAgQklUMTAJLy8gQ1RTIHN0YXR1cyBjaGFuZ2UKKyNkZWZpbmUgSVJRX1RYUkVQRUFUICAgIEJJVDkJLy8gdHggbWVzc2FnZSByZXBlYXQKKyNkZWZpbmUgSVJRX1RYRklGTyAgICAgIEJJVDgJLy8gdHJhbnNtaXQgcG9vbCByZWFkeQorI2RlZmluZSBJUlFfUlhFT00gICAgICAgQklUNwkvLyByZWNlaXZlIG1lc3NhZ2UgZW5kCisjZGVmaW5lIElSUV9FWElUSFVOVCAgICBCSVQ2CS8vIHJlY2VpdmUgZnJhbWUgc3RhcnQKKyNkZWZpbmUgSVJRX1JYVElNRSAgICAgIEJJVDYgICAgLy8gcnggY2hhciB0aW1lb3V0CisjZGVmaW5lIElSUV9EQ0QgICAgICAgICBCSVQyCS8vIGNhcnJpZXIgZGV0ZWN0IHN0YXR1cyBjaGFuZ2UKKyNkZWZpbmUgSVJRX09WRVJSVU4gICAgIEJJVDEJLy8gcmVjZWl2ZSBmcmFtZSBvdmVyZmxvdworI2RlZmluZSBJUlFfUlhGSUZPICAgICAgQklUMAkvLyByZWNlaXZlIHBvb2wgZnVsbAorICAgIAorLy8gU1RBUgorICAgIAorI2RlZmluZSBYRlcgICBCSVQ2CQkvLyB0cmFuc21pdCBGSUZPIHdyaXRlIGVuYWJsZQorI2RlZmluZSBDRUMgICBCSVQyCQkvLyBjb21tYW5kIGV4ZWN1dGluZworI2RlZmluZSBDVFMgICBCSVQxCQkvLyBDVFMgc3RhdGUKKyAgICAKKyNkZWZpbmUgUFZSX0RUUiAgICAgIEJJVDAKKyNkZWZpbmUgUFZSX0RTUiAgICAgIEJJVDEKKyNkZWZpbmUgUFZSX1JJICAgICAgIEJJVDIKKyNkZWZpbmUgUFZSX0FVVE9DVFMgIEJJVDMKKyNkZWZpbmUgUFZSX1JTMjMyICAgIDB4MjAgICAvKiAwMDEwYiAqLworI2RlZmluZSBQVlJfVjM1ICAgICAgMHhlMCAgIC8qIDExMTBiICovCisjZGVmaW5lIFBWUl9SUzQyMiAgICAweDQwICAgLyogMDEwMGIgKi8KKyAgICAKKy8qIFJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8gCisgICAgCisjZGVmaW5lIHdyaXRlX3JlZyhpbmZvLCByZWcsIHZhbCkgb3V0YigodmFsKSwoaW5mbyktPmlvX2Jhc2UgKyAocmVnKSkKKyNkZWZpbmUgcmVhZF9yZWcoaW5mbywgcmVnKSBpbmIoKGluZm8pLT5pb19iYXNlICsgKHJlZykpCisKKyNkZWZpbmUgcmVhZF9yZWcxNihpbmZvLCByZWcpIGludygoaW5mbyktPmlvX2Jhc2UgKyAocmVnKSkgIAorI2RlZmluZSB3cml0ZV9yZWcxNihpbmZvLCByZWcsIHZhbCkgb3V0dygodmFsKSwgKGluZm8pLT5pb19iYXNlICsgKHJlZykpCisgICAgCisjZGVmaW5lIHNldF9yZWdfYml0cyhpbmZvLCByZWcsIG1hc2spIFwKKyAgICB3cml0ZV9yZWcoaW5mbywgKHJlZyksIFwKKwkJICh1bnNpZ25lZCBjaGFyKSAocmVhZF9yZWcoaW5mbywgKHJlZykpIHwgKG1hc2spKSkgIAorI2RlZmluZSBjbGVhcl9yZWdfYml0cyhpbmZvLCByZWcsIG1hc2spIFwKKyAgICB3cml0ZV9yZWcoaW5mbywgKHJlZyksIFwKKwkJICh1bnNpZ25lZCBjaGFyKSAocmVhZF9yZWcoaW5mbywgKHJlZykpICYgfihtYXNrKSkpICAKKy8qCisgKiBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgcm91dGluZXMKKyAqLyAKK3N0YXRpYyB2b2lkIGlycV9kaXNhYmxlKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IG1hc2spIAoreworCWlmIChjaGFubmVsID09IENIQSkgeworCQlpbmZvLT5pbXJhX3ZhbHVlIHw9IG1hc2s7CisJCXdyaXRlX3JlZzE2KGluZm8sIENIQSArIElNUiwgaW5mby0+aW1yYV92YWx1ZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+aW1yYl92YWx1ZSB8PSBtYXNrOworCQl3cml0ZV9yZWcxNihpbmZvLCBDSEIgKyBJTVIsIGluZm8tPmltcmJfdmFsdWUpOworCX0KK30KK3N0YXRpYyB2b2lkIGlycV9lbmFibGUoTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgbWFzaykgCit7CisJaWYgKGNoYW5uZWwgPT0gQ0hBKSB7CisJCWluZm8tPmltcmFfdmFsdWUgJj0gfm1hc2s7CisJCXdyaXRlX3JlZzE2KGluZm8sIENIQSArIElNUiwgaW5mby0+aW1yYV92YWx1ZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+aW1yYl92YWx1ZSAmPSB+bWFzazsKKwkJd3JpdGVfcmVnMTYoaW5mbywgQ0hCICsgSU1SLCBpbmZvLT5pbXJiX3ZhbHVlKTsKKwl9Cit9CisKKyNkZWZpbmUgcG9ydF9pcnFfZGlzYWJsZShpbmZvLCBtYXNrKSBcCisgIHsgaW5mby0+cGltX3ZhbHVlIHw9IChtYXNrKTsgd3JpdGVfcmVnKGluZm8sIFBJTSwgaW5mby0+cGltX3ZhbHVlKTsgfQorCisjZGVmaW5lIHBvcnRfaXJxX2VuYWJsZShpbmZvLCBtYXNrKSBcCisgIHsgaW5mby0+cGltX3ZhbHVlICY9IH4obWFzayk7IHdyaXRlX3JlZyhpbmZvLCBQSU0sIGluZm8tPnBpbV92YWx1ZSk7IH0KKworc3RhdGljIHZvaWQgcnhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcnhfc3RvcChNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHR4X3N0YXJ0KE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHR4X3N0b3AoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfc2V0X2lkbGUoTUdTTFBDX0lORk8gKmluZm8pOworCitzdGF0aWMgdm9pZCBnZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBzZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHJlc2V0X2RldmljZShNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIGhkbGNfbW9kZShNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBhc3luY19tb2RlKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpOworCitzdGF0aWMgaW50IGlvY3RsX2NvbW1vbihNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgQ09ORklHX0hETEMKKyNkZWZpbmUgZGV2X3RvX3BvcnQoRCkgKGRldl90b19oZGxjKEQpLT5wcml2KQorc3RhdGljIHZvaWQgaGRsY2Rldl90eF9kb25lKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoTUdTTFBDX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCAgaGRsY2Rldl9pbml0KE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfZXhpdChNR1NMUENfSU5GTyAqaW5mbyk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgdHJhY2VfYmxvY2soTUdTTFBDX0lORk8gKmluZm8sY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCk7CisKK3N0YXRpYyBCT09MRUFOIHJlZ2lzdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIEJPT0xFQU4gaXJxX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIGludCBhZGFwdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pOworCitzdGF0aWMgaW50IGNsYWltX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NscGNfYWRkX2RldmljZShNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NscGNfcmVtb3ZlX2RldmljZShNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyBpbnQgIHJ4X2dldF9mcmFtZShNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9yZXNldF9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIHJ4X2FsbG9jX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcnhfZnJlZV9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIGlycXJldHVybl90IG1nc2xwY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisvKgorICogQm90dG9tIGhhbGYgaW50ZXJydXB0IGhhbmRsZXJzCisgKi8KK3N0YXRpYyB2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCk7CitzdGF0aWMgdm9pZCBiaF90cmFuc21pdChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBiaF9zdGF0dXMoTUdTTFBDX0lORk8gKmluZm8pOworCisvKgorICogaW9jdGwgaGFuZGxlcnMKKyAqLworc3RhdGljIGludCB0aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgZ2V0X3N0YXRzKE1HU0xQQ19JTkZPICppbmZvLCBzdHJ1Y3QgbWdzbF9pY291bnQgX191c2VyICp1c2VyX2ljb3VudCk7CitzdGF0aWMgaW50IGdldF9wYXJhbXMoTUdTTFBDX0lORk8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqdXNlcl9wYXJhbXMpOworc3RhdGljIGludCBzZXRfcGFyYW1zKE1HU0xQQ19JTkZPICppbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKm5ld19wYXJhbXMpOworc3RhdGljIGludCBnZXRfdHhpZGxlKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgX191c2VyICppZGxlX21vZGUpOworc3RhdGljIGludCBzZXRfdHhpZGxlKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgaWRsZV9tb2RlKTsKK3N0YXRpYyBpbnQgc2V0X3R4ZW5hYmxlKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyBpbnQgdHhfYWJvcnQoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIGludCBzZXRfcnhlbmFibGUoTUdTTFBDX0lORk8gKmluZm8sIGludCBlbmFibGUpOworc3RhdGljIGludCB3YWl0X2V2ZW50cyhNR1NMUENfSU5GTyAqaW5mbywgaW50IF9fdXNlciAqbWFzayk7CisKK3N0YXRpYyBNR1NMUENfSU5GTyAqbWdzbHBjX2RldmljZV9saXN0ID0gTlVMTDsKK3N0YXRpYyBpbnQgbWdzbHBjX2RldmljZV9jb3VudCA9IDA7CisKKy8qCisgKiBTZXQgdGhpcyBwYXJhbSB0byBub24temVybyB0byBsb2FkIGVheCB3aXRoIHRoZQorICogLnRleHQgc2VjdGlvbiBhZGRyZXNzIGFuZCBicmVha3BvaW50IG9uIG1vZHVsZSBsb2FkLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHVzZSB3aXRoIGdkYiBhbmQgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgYnJlYWtfb25fbG9hZD0wOworCisvKgorICogRHJpdmVyIG1ham9yIG51bWJlciwgZGVmYXVsdHMgdG8gemVybyB0byBnZXQgYXV0bworICogYXNzaWduZWQgbWFqb3IgbnVtYmVyLiBNYXkgYmUgZm9yY2VkIGFzIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgdHR5bWFqb3I9MDsKKworc3RhdGljIGludCBkZWJ1Z19sZXZlbCA9IDA7CitzdGF0aWMgaW50IG1heGZyYW1lW01BWF9ERVZJQ0VfQ09VTlRdID0gezAsfTsKK3N0YXRpYyBpbnQgZG9zeW5jcHBwW01BWF9ERVZJQ0VfQ09VTlRdID0gezEsMSwxLDF9OworCittb2R1bGVfcGFyYW0oYnJlYWtfb25fbG9hZCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWdfbGV2ZWwsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4ZnJhbWUsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG9zeW5jcHBwLCBpbnQsIE5VTEwsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBQQyBDYXJkIGRyaXZlciI7CitzdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjI2ICQiOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKK3N0YXRpYyB2b2lkIG1nc2xwY19jaGFuZ2VfcGFyYW1zKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xwY193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworCisvKiBQQ01DSUEgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBtZ3NscGNfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgbWdzbHBjX3JlbGVhc2UodV9sb25nIGFyZyk7CitzdGF0aWMgaW50ICBtZ3NscGNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgZGV2X2xpbmtfdCAqbWdzbHBjX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIG1nc2xwY19kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAic3luY2xpbmtfY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyoKKyAqIDFzdCBmdW5jdGlvbiBkZWZpbmVkIGluIC50ZXh0IHNlY3Rpb24uIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbgorICogaW5pdF9tb2R1bGUoKSBmb2xsb3dlZCBieSBhIGJyZWFrcG9pbnQgYWxsb3dzIGEgcmVtb3RlIGRlYnVnZ2VyCisgKiAoZ2RiKSB0byBnZXQgdGhlIC50ZXh0IGFkZHJlc3MgZm9yIHRoZSBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqIFRoaXMgYWxsb3dzIHJlbW90ZSBkZWJ1Z2dpbmcgb2YgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcy4KKyAqLworc3RhdGljIHZvaWQqIG1nc2xwY19nZXRfdGV4dF9wdHIodm9pZCkKK3sKKwlyZXR1cm4gbWdzbHBjX2dldF90ZXh0X3B0cjsKK30KKworLyoqCisgKiBsaW5lIGRpc2NpcGxpbmUgY2FsbGJhY2sgd3JhcHBlcnMKKyAqCisgKiBUaGUgd3JhcHBlcnMgbWFpbnRhaW4gbGluZSBkaXNjaXBsaW5lIHJlZmVyZW5jZXMKKyAqIHdoaWxlIGNhbGxpbmcgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIGxkaXNjX2ZsdXNoX2J1ZmZlciAtIGZsdXNoIGxpbmUgZGlzY2lwbGluZSByZWNlaXZlIGJ1ZmZlcnMKKyAqIGxkaXNjX3JlY2VpdmVfYnVmICAtIHBhc3MgcmVjZWl2ZSBkYXRhIHRvIGxpbmUgZGlzY2lwbGluZQorICovCisKK3N0YXRpYyB2b2lkIGxkaXNjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChsZCkgeworCQlpZiAobGQtPmZsdXNoX2J1ZmZlcikKKwkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxkaXNjX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICAgICBjb25zdCBfX3U4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWlmICghdHR5KQorCQlyZXR1cm47CisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmIChsZC0+cmVjZWl2ZV9idWYpCisJCQlsZC0+cmVjZWl2ZV9idWYodHR5LCBkYXRhLCBmbGFncywgY291bnQpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KK30KKworc3RhdGljIGRldl9saW5rX3QgKm1nc2xwY19hdHRhY2godm9pZCkKK3sKKyAgICBNR1NMUENfSU5GTyAqaW5mbzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisgICAgCisgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJICAgIHByaW50aygibWdzbHBjX2F0dGFjaFxuIik7CisJCisgICAgaW5mbyA9IChNR1NMUENfSU5GTyAqKWttYWxsb2Moc2l6ZW9mKE1HU0xQQ19JTkZPKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFpbmZvKSB7CisJICAgIHByaW50aygiRXJyb3IgY2FuJ3QgYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlIGRhdGFcbiIpOworCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKE1HU0xQQ19JTkZPKSk7CisgICAgaW5mby0+bWFnaWMgPSBNR1NMUENfTUFHSUM7CisgICAgSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBiaF9oYW5kbGVyLCBpbmZvKTsKKyAgICBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDQwOTY7CisgICAgaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworICAgIGluZm8tPmNsb3Npbmdfd2FpdCA9IDMwKkhaOworICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKyAgICBzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisgICAgc3Bpbl9sb2NrX2luaXQoJmluZm8tPm5ldGxvY2spOworICAgIG1lbWNweSgmaW5mby0+cGFyYW1zLCZkZWZhdWx0X3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKyAgICBpbmZvLT5pZGxlX21vZGUgPSBIRExDX1RYSURMRV9GTEFHUzsJCQorICAgIGluZm8tPmltcmFfdmFsdWUgPSAweGZmZmY7CisgICAgaW5mby0+aW1yYl92YWx1ZSA9IDB4ZmZmZjsKKyAgICBpbmZvLT5waW1fdmFsdWUgPSAweGZmOworCisgICAgbGluayA9ICZpbmZvLT5saW5rOworICAgIGxpbmstPnByaXYgPSBpbmZvOworICAgIAorICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgICA9IElSUV9JTkZPMl9WQUxJRCB8IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9IE5VTEw7CisgICAgCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm1nc2xwY19ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCSAgICBtZ3NscGNfZGV0YWNoKGxpbmspOworCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZ3NscGNfYWRkX2RldmljZShpbmZvKTsKKworICAgIHJldHVybiBsaW5rOworfQorCisvKiBDYXJkIGhhcyBiZWVuIGluc2VydGVkLgorICovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbWdzbHBjX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgTUdTTFBDX0lORk8gKmluZm8gPSBsaW5rLT5wcml2OworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisgICAgdV9jaGFyIGJ1Zls2NF07CisgICAgY29uZmlnX2luZm9fdCBjb25mOworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZzsKKyAgICAKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIHJlYWQgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworICAgIAorICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCisgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisgICAgLyogZ2V0IENJUyBjb25maWd1cmF0aW9uIGVudHJ5ICovCisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisKKyAgICBjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKworICAgIGlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CisgICAgaWYgKGNmZy0+aW5kZXggPT0gMCkKKwkgICAgZ290byBjc19mYWlsZWQ7CisKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQorICAgIC8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDA7CisgICAgaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkgICAgY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOworCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCSAgICBpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwkgICAgaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJICAgIENTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKTsKKyAgICB9CisKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gODsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKyAgICAKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyB8PSBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgICAgID0gbWdzbHBjX2lzcjsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgICAgPSBpbmZvOworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworICAgIGluZm8tPmlvX2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgaW5mby0+aXJxX2xldmVsID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCisgICAgLyogYWRkIHRvIGxpbmtlZCBsaXN0IG9mIGRldmljZXMgKi8KKyAgICBzcHJpbnRmKGluZm8tPm5vZGUuZGV2X25hbWUsICJtZ3NscGMwIik7CisgICAgaW5mby0+bm9kZS5tYWpvciA9IGluZm8tPm5vZGUubWlub3IgPSAwOworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGluZGV4IDB4JTAyeDoiLAorCSAgIGluZm8tPm5vZGUuZGV2X25hbWUsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOworICAgIGlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJICAgIHByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJICAgIHByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworICAgIHByaW50aygiXG4iKTsKKyAgICAKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworICAgIG1nc2xwY19yZWxlYXNlKCh1X2xvbmcpbGluayk7Cit9CisKKy8qIENhcmQgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqIFVucmVnaXN0ZXIgZGV2aWNlIGFuZCByZWxlYXNlIFBDTUNJQSBjb25maWd1cmF0aW9uLgorICogSWYgZGV2aWNlIGlzIG9wZW4sIHBvc3Rwb25lIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3JlbGVhc2UodV9sb25nIGFyZykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gKGRldl9saW5rX3QgKilhcmc7CisKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIGlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9TVEFMRV9MSU5LKQorCSAgICBtZ3NscGNfZGV0YWNoKGxpbmspOworfQorCitzdGF0aWMgdm9pZCBtZ3NscGNfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJICAgIHByaW50aygibWdzbHBjX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogZmluZCBkZXZpY2UgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCSAgICBpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICAvKiBkZXZpY2UgaXMgY29uZmlndXJlZC9hY3RpdmUsIG1hcmsgaXQgc28gd2hlbgorCSAgICAgKiByZWxlYXNlKCkgaXMgY2FsbGVkIGEgcHJvcGVyIGRldGFjaCgpIG9jY3Vycy4KKwkgICAgICovCisJICAgIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkgICAgcHJpbnRrKEtFUk5fREVCVUcgInN5bmNsaW5rcGM6IGRldGFjaCBwb3N0cG9uZWQsICclcycgIgorCQkJICAgInN0aWxsIGxvY2tlZFxuIiwgbGluay0+ZGV2LT5kZXZfbmFtZSk7CisJICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVEFMRV9MSU5LOworCSAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwkgICAgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisgICAgCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGFuZCBmcmVlIGl0ICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBtZ3NscGNfcmVtb3ZlX2RldmljZSgoTUdTTFBDX0lORk8gKilsaW5rLT5wcml2KTsKK30KKworc3RhdGljIGludCBtZ3NscGNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBNR1NMUENfSU5GTyAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgCisgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJICAgIHByaW50aygibWdzbHBjX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkgICAgKChNR1NMUENfSU5GTyAqKWxpbmstPnByaXYpLT5zdG9wID0gMTsKKwkJICAgIG1nc2xwY19yZWxlYXNlKCh1X2xvbmcpbGluayk7CisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJICAgIG1nc2xwY19jb25maWcobGluayk7CisJICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJICAgIC8qIE1hcmsgdGhlIGRldmljZSBhcyBzdG9wcGVkLCB0byBibG9jayBJTyB1bnRpbCBsYXRlciAqLworCSAgICBpbmZvLT5zdG9wID0gMTsKKwkgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJICAgIGxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCSAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaW5mby0+c3RvcCA9IDA7CisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWdzbHBjX3BhcmFub2lhX2NoZWNrKE1HU0xQQ19JTkZPICppbmZvLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIE1HU0xQQ19QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBtZ3NsIHN0cnVjdCAoJXMpIGluICVzXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRpbmZvID0KKwkJIldhcm5pbmc6IG51bGwgbWdzbHBjX2luZm8gZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IE1HU0xQQ19NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmICghaW5mbykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIENNRF9SWEZJRk8gICAgICBCSVQ3CS8vIHJlbGVhc2UgY3VycmVudCByeCBGSUZPCisjZGVmaW5lIENNRF9SWFJFU0VUICAgICBCSVQ2CS8vIHJlY2VpdmVyIHJlc2V0CisjZGVmaW5lIENNRF9SWEZJRk9fUkVBRCBCSVQ1CisjZGVmaW5lIENNRF9TVEFSVF9USU1FUiBCSVQ0CisjZGVmaW5lIENNRF9UWEZJRk8gICAgICBCSVQzCS8vIHJlbGVhc2UgY3VycmVudCB0eCBGSUZPCisjZGVmaW5lIENNRF9UWEVPTSAgICAgICBCSVQxCS8vIHRyYW5zbWl0IGVuZCBtZXNzYWdlCisjZGVmaW5lIENNRF9UWFJFU0VUICAgICBCSVQwCS8vIHRyYW5zbWl0IHJlc2V0CisKK3N0YXRpYyBCT09MRUFOIHdhaXRfY29tbWFuZF9jb21wbGV0ZShNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBjaGFubmVsKSAKK3sKKwlpbnQgaSA9IDA7CisJLyogd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uICovIAorCXdoaWxlIChyZWFkX3JlZyhpbmZvLCAodW5zaWduZWQgY2hhcikoY2hhbm5lbCtTVEFSKSkgJiBCSVQyKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKGkrKyA9PSAxMDAwKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgaXNzdWVfY29tbWFuZChNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBjaGFubmVsLCB1bnNpZ25lZCBjaGFyIGNtZCkgCit7CisJd2FpdF9jb21tYW5kX2NvbXBsZXRlKGluZm8sIGNoYW5uZWwpOworCXdyaXRlX3JlZyhpbmZvLCAodW5zaWduZWQgY2hhcikgKGNoYW5uZWwgKyBDTURSKSwgY21kKTsKK30KKworc3RhdGljIHZvaWQgdHhfcGF1c2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInR4X3BhdXNlIikpCisJCXJldHVybjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJ0eF9wYXVzZSglcylcbiIsaW5mby0+ZGV2aWNlX25hbWUpOwkKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT50eF9lbmFibGVkKQorCSAJdHhfc3RvcChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdHhfcmVsZWFzZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidHhfcmVsZWFzZSIpKQorCQlyZXR1cm47CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygidHhfcmVsZWFzZSglcylcbiIsaW5mby0+ZGV2aWNlX25hbWUpOwkKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkgCXR4X3N0YXJ0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBSZXR1cm4gbmV4dCBib3R0b20gaGFsZiBhY3Rpb24gdG8gcGVyZm9ybS4KKyAqIG9yIDAgaWYgbm90aGluZyB0byBkby4KKyAqLworc3RhdGljIGludCBiaF9hY3Rpb24oTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfUkVDRUlWRSkgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9SRUNFSVZFOworCQlyYyA9IEJIX1JFQ0VJVkU7CisJfSBlbHNlIGlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfVFJBTlNNSVQpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfVFJBTlNNSVQ7CisJCXJjID0gQkhfVFJBTlNNSVQ7CisJfSBlbHNlIGlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfU1RBVFVTKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1NUQVRVUzsKKwkJcmMgPSBCSF9TVEFUVVM7CisJfQorCisJaWYgKCFyYykgeworCQkvKiBNYXJrIEJIIHJvdXRpbmUgYXMgY29tcGxldGUgKi8KKwkJaW5mby0+YmhfcnVubmluZyAgID0gMDsKKwkJaW5mby0+YmhfcmVxdWVzdGVkID0gMDsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisJcmV0dXJuIHJjOworfQorCit2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyopQ29udGV4dDsKKwlpbnQgYWN0aW9uOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkKKwkJcHJpbnRrKCAiJXMoJWQpOmJoX2hhbmRsZXIoJXMpIGVudHJ5XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQorCWluZm8tPmJoX3J1bm5pbmcgPSAxOworCisJd2hpbGUoKGFjdGlvbiA9IGJoX2FjdGlvbihpbmZvKSkgIT0gMCkgeworCQorCQkvKiBQcm9jZXNzIHdvcmsgaXRlbSAqLworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJCXByaW50ayggIiVzKCVkKTpiaF9oYW5kbGVyKCkgd29yayBpdGVtIGFjdGlvbj0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxhY3Rpb24pOworCisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCQorCQljYXNlIEJIX1JFQ0VJVkU6CisJCQl3aGlsZShyeF9nZXRfZnJhbWUoaW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgQkhfVFJBTlNNSVQ6CisJCQliaF90cmFuc21pdChpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEJIX1NUQVRVUzoKKwkJCWJoX3N0YXR1cyhpbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW5rbm93biB3b3JrIGl0ZW0gSUQgKi8KKwkJCXByaW50aygiVW5rbm93biB3b3JrIGl0ZW0gSUQ9JTA4WCFcbiIsIGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkKKwkJcHJpbnRrKCAiJXMoJWQpOmJoX2hhbmRsZXIoJXMpIGV4aXRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Cit9CisKK3ZvaWQgYmhfdHJhbnNtaXQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkgpCisJCXByaW50aygiYmhfdHJhbnNtaXQoKSBlbnRyeSBvbiAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCisJaWYgKHR0eSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9Cit9CisKK3ZvaWQgYmhfc3RhdHVzKE1HU0xQQ19JTkZPICppbmZvKQoreworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCWluZm8tPmRjZF9jaGtjb3VudCA9IDA7CisJaW5mby0+Y3RzX2Noa2NvdW50ID0gMDsKK30KKworLyogZW9tOiBub24temVybyA9IGVuZCBvZiBmcmFtZSAqLyAKK3N0YXRpYyB2b2lkIHJ4X3JlYWR5X2hkbGMoTUdTTFBDX0lORk8gKmluZm8sIGludCBlb20pCit7CisJdW5zaWduZWQgY2hhciBkYXRhWzJdOworCXVuc2lnbmVkIGNoYXIgZmlmb19jb3VudCwgcmVhZF9jb3VudCwgaTsKKwlSWEJVRiAqYnVmID0gKFJYQlVGKikoaW5mby0+cnhfYnVmICsgKGluZm8tPnJ4X3B1dCAqIGluZm8tPnJ4X2J1Zl9zaXplKSk7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTpyeF9yZWFkeV9oZGxjKGVvbT0lZClcbiIsX19GSUxFX18sX19MSU5FX18sZW9tKTsKKwkKKwlpZiAoIWluZm8tPnJ4X2VuYWJsZWQpCisJCXJldHVybjsKKworCWlmIChpbmZvLT5yeF9mcmFtZV9jb3VudCA+PSBpbmZvLT5yeF9idWZfY291bnQpIHsKKwkJLyogbm8gbW9yZSBmcmVlIGJ1ZmZlcnMgKi8KKwkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWFJFU0VUKTsKKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9SRUNFSVZFOworCQlpbmZvLT5yeF9vdmVyZmxvdyA9IDE7CisJCWluZm8tPmljb3VudC5idWZfb3ZlcnJ1bisrOworCQlyZXR1cm47CisJfQorCisJaWYgKGVvbSkgeworCQkvKiBlbmQgb2YgZnJhbWUsIGdldCBGSUZPIGNvdW50IGZyb20gUkJDTCByZWdpc3RlciAqLyAKKwkJaWYgKCEoZmlmb19jb3VudCA9ICh1bnNpZ25lZCBjaGFyKShyZWFkX3JlZyhpbmZvLCBDSEErUkJDTCkgJiAweDFmKSkpCisJCQlmaWZvX2NvdW50ID0gMzI7CisJfSBlbHNlCisJCWZpZm9fY291bnQgPSAzMjsKKwkKKwlkbyB7CisJCWlmIChmaWZvX2NvdW50ID09IDEpIHsKKwkJCXJlYWRfY291bnQgPSAxOworCQkJZGF0YVswXSA9IHJlYWRfcmVnKGluZm8sIENIQSArIFJYRklGTyk7CisJCX0gZWxzZSB7CisJCQlyZWFkX2NvdW50ID0gMjsKKwkJCSooKHVuc2lnbmVkIHNob3J0ICopIGRhdGEpID0gcmVhZF9yZWcxNihpbmZvLCBDSEEgKyBSWEZJRk8pOworCQl9CisJCWZpZm9fY291bnQgLT0gcmVhZF9jb3VudDsKKwkJaWYgKCFmaWZvX2NvdW50ICYmIGVvbSkKKwkJCWJ1Zi0+c3RhdHVzID0gZGF0YVstLXJlYWRfY291bnRdOworCisJCWZvciAoaSA9IDA7IGkgPCByZWFkX2NvdW50OyBpKyspIHsKKwkJCWlmIChidWYtPmNvdW50ID49IGluZm8tPm1heF9mcmFtZV9zaXplKSB7CisJCQkJLyogZnJhbWUgdG9vIGxhcmdlLCByZXNldCByZWNlaXZlciBhbmQgcmVzZXQgY3VycmVudCBidWZmZXIgKi8KKwkJCQlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYUkVTRVQpOworCQkJCWJ1Zi0+Y291bnQgPSAwOworCQkJCXJldHVybjsKKwkJCX0KKwkJCSooYnVmLT5kYXRhICsgYnVmLT5jb3VudCkgPSBkYXRhW2ldOworCQkJYnVmLT5jb3VudCsrOworCQl9CisJfSB3aGlsZSAoZmlmb19jb3VudCk7CisKKwlpZiAoZW9tKSB7CisJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKKwkJaW5mby0+cnhfZnJhbWVfY291bnQrKzsKKwkJaW5mby0+cnhfcHV0Kys7CisJCWlmIChpbmZvLT5yeF9wdXQgPj0gaW5mby0+cnhfYnVmX2NvdW50KQorCQkJaW5mby0+cnhfcHV0ID0gMDsKKwl9CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWEZJRk8pOworfQorCitzdGF0aWMgdm9pZCByeF9yZWFkeV9hc3luYyhNR1NMUENfSU5GTyAqaW5mbywgaW50IHRjZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGEsIHN0YXR1czsKKwlpbnQgZmlmb19jb3VudDsKKyAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAJc3RydWN0IG1nc2xfaWNvdW50ICppY291bnQgPSAmaW5mby0+aWNvdW50OworCisJaWYgKHRjZCkgeworCQkvKiBlYXJseSB0ZXJtaW5hdGlvbiwgZ2V0IEZJRk8gY291bnQgZnJvbSBSQkNMIHJlZ2lzdGVyICovIAorCQlmaWZvX2NvdW50ID0gKHVuc2lnbmVkIGNoYXIpKHJlYWRfcmVnKGluZm8sIENIQStSQkNMKSAmIDB4MWYpOworCisJCS8qIFplcm8gZmlmbyBjb3VudCBjb3VsZCBtZWFuIDAgb3IgMzIgYnl0ZXMgYXZhaWxhYmxlLgorCQkgKiBJZiBCSVQ1IG9mIFNUQVIgaXMgc2V0IHRoZW4gYXQgbGVhc3QgMSBieXRlIGlzIGF2YWlsYWJsZS4KKwkJICovCisJCWlmICghZmlmb19jb3VudCAmJiAocmVhZF9yZWcoaW5mbyxDSEErU1RBUikgJiBCSVQ1KSkKKwkJCWZpZm9fY291bnQgPSAzMjsKKwl9IGVsc2UKKwkJZmlmb19jb3VudCA9IDMyOworCQorCS8qIEZsdXNoIHJlY2VpdmVkIGFzeW5jIGRhdGEgdG8gcmVjZWl2ZSBkYXRhIGJ1ZmZlci4gKi8gCisJd2hpbGUgKGZpZm9fY291bnQpIHsKKwkJZGF0YSAgID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKKwkJc3RhdHVzID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKKwkJZmlmb19jb3VudCAtPSAyOworCisJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkJCWJyZWFrOworCQkJCisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gZGF0YTsKKwkJaWNvdW50LT5yeCsrOworCQkKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCisJCS8vIGlmIG5vIGZyYW1laW5nL2NyYyBlcnJvciB0aGVuIHNhdmUgZGF0YQorCQkvLyBCSVQ3OnBhcml0eSBlcnJvcgorCQkvLyBCSVQ2OmZyYW1pbmcgZXJyb3IKKworCQlpZiAoc3RhdHVzICYgKEJJVDcgKyBCSVQ2KSkgeworCQkJaWYgKHN0YXR1cyAmIEJJVDcpIAorCQkJCWljb3VudC0+cGFyaXR5Kys7CisJCQllbHNlCisJCQkJaWNvdW50LT5mcmFtZSsrOworCisJCQkvKiBkaXNjYXJkIGNoYXIgaWYgdHR5IGNvbnRyb2wgZmxhZ3Mgc2F5IHNvICovCisJCQlpZiAoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKQorCQkJCWNvbnRpbnVlOworCQkJCQorCQkJc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CisKKwkJCWlmIChzdGF0dXMgJiBCSVQ3KQorCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIEJJVDYpCisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCX0KKwkJCisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQl0dHktPmZsaXAuY291bnQrKzsKKwl9CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWEZJRk8pOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikgeworCQlwcmludGsoIiVzKCVkKTpyeF9yZWFkeV9hc3luYyBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLHR0eS0+ZmxpcC5jb3VudCk7CisJCXByaW50aygiJXMoJWQpOnJ4PSVkIGJyaz0lZCBwYXJpdHk9JWQgZnJhbWU9JWQgb3ZlcnJ1bj0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGljb3VudC0+cngsaWNvdW50LT5icmssCisJCQlpY291bnQtPnBhcml0eSxpY291bnQtPmZyYW1lLGljb3VudC0+b3ZlcnJ1bik7CisJfQorCQkJCisJaWYgKHR0eS0+ZmxpcC5jb3VudCkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworCitzdGF0aWMgdm9pZCB0eF9kb25lKE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmICghaW5mby0+dHhfYWN0aXZlKQorCQlyZXR1cm47CisJCQkKKwlpbmZvLT50eF9hY3RpdmUgPSAwOworCWluZm8tPnR4X2Fib3J0aW5nID0gMDsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpCisJCXJldHVybjsKKworCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJCisJaWYgKGluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUpIHsKKwkJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCQkJc2V0X3NpZ25hbHMoaW5mbyk7CisJCX0KKwkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlIAorI2VuZGlmCisJeworCQlpZiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJdHhfc3RvcChpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1RSQU5TTUlUOworCX0KK30KKworc3RhdGljIHZvaWQgdHhfcmVhZHkoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBmaWZvX2NvdW50ID0gMzI7CisJaW50IGM7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp0eF9yZWFkeSglcylcbiIsIF9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkJCXJldHVybjsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJdHhfc3RvcChpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWluZm8tPnR4X2NvdW50KQorCQkJaW5mby0+dHhfYWN0aXZlID0gMDsKKwl9CisKKwlpZiAoIWluZm8tPnR4X2NvdW50KQorCQlyZXR1cm47CisKKwl3aGlsZSAoaW5mby0+dHhfY291bnQgJiYgZmlmb19jb3VudCkgeworCQljID0gbWluKDIsIG1pbl90KGludCwgZmlmb19jb3VudCwgbWluKGluZm8tPnR4X2NvdW50LCBUWEJVRlNJWkUgLSBpbmZvLT50eF9nZXQpKSk7CisJCQorCQlpZiAoYyA9PSAxKSB7CisJCQl3cml0ZV9yZWcoaW5mbywgQ0hBICsgVFhGSUZPLCAqKGluZm8tPnR4X2J1ZiArIGluZm8tPnR4X2dldCkpOworCQl9IGVsc2UgeworCQkJd3JpdGVfcmVnMTYoaW5mbywgQ0hBICsgVFhGSUZPLAorCQkJCQkgICooKHVuc2lnbmVkIHNob3J0KikoaW5mby0+dHhfYnVmICsgaW5mby0+dHhfZ2V0KSkpOworCQl9CisJCWluZm8tPnR4X2NvdW50IC09IGM7CisJCWluZm8tPnR4X2dldCA9IChpbmZvLT50eF9nZXQgKyBjKSAmIChUWEJVRlNJWkUgLSAxKTsKKwkJZmlmb19jb3VudCAtPSBjOworCX0KKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpIHsKKwkJaWYgKGluZm8tPnR4X2NvdW50IDwgV0FLRVVQX0NIQVJTKQorCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWEZJRk8pOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT50eF9jb3VudCkKKwkJCWlzc3VlX2NvbW1hbmQoaW5mbywgQ0hBLCBDTURfVFhGSUZPKTsKKwkJZWxzZQorCQkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWEZJRk8gKyBDTURfVFhFT00pOworCX0KK30KKworc3RhdGljIHZvaWQgY3RzX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPmN0c19jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCWlycV9kaXNhYmxlKGluZm8sIENIQiwgSVJRX0NUUyk7CisJaW5mby0+aWNvdW50LmN0cysrOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuY3RzX3VwKys7CisJZWxzZQorCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmN0c19kb3duKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSB7CisJCQkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJCQkJcHJpbnRrKCJDVFMgdHggc3RhcnQuLi4iKTsKKwkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCXR4X3N0YXJ0KGluZm8pOworCQkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSkgeworCQkJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCQkJCXByaW50aygiQ1RTIHR4IHN0b3AuLi4iKTsKKwkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCXR4X3N0b3AoaW5mbyk7CisJCQl9CisJCX0KKwl9CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKK3N0YXRpYyB2b2lkIGRjZF9jaGFuZ2UoTUdTTFBDX0lORk8gKmluZm8pCit7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJaWYgKChpbmZvLT5kY2RfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKQorCQlpcnFfZGlzYWJsZShpbmZvLCBDSEIsIElSUV9EQ0QpOworCWluZm8tPmljb3VudC5kY2QrKzsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSB7CisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZGNkX3VwKys7CisJfQorCWVsc2UKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOworI2lmZGVmIENPTkZJR19IRExDCisJaWYgKGluZm8tPm5ldGNvdW50KQorCQloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgaW5mby0+bmV0ZGV2KTsKKyNlbmRpZgorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJCXByaW50aygiJXMgQ0Qgbm93ICVzLi4uIiwgaW5mby0+ZGV2aWNlX25hbWUsCisJCQkgICAgICAgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyAib24iIDogIm9mZiIpOworCQlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQllbHNlIHsKKwkJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCQkJcHJpbnRrKCJkb2luZyBzZXJpYWwgaGFuZ3VwLi4uIik7CisJCQlpZiAoaW5mby0+dHR5KQorCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJfQorCX0KKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKK30KKworc3RhdGljIHZvaWQgZHNyX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPmRzcl9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCXBvcnRfaXJxX2Rpc2FibGUoaW5mbywgUFZSX0RTUik7CisJaW5mby0+aWNvdW50LmRzcisrOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX3VwKys7CisJZWxzZQorCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRzcl9kb3duKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKK3N0YXRpYyB2b2lkIHJpX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPnJpX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkKKwkJcG9ydF9pcnFfZGlzYWJsZShpbmZvLCBQVlJfUkkpOworCWluZm8tPmljb3VudC5ybmcrKzsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfdXArKzsKKwllbHNlCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfZG93bisrOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfU1RBVFVTOworfQorCisvKiBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGVudHJ5IHBvaW50LgorICogCQorICogQXJndW1lbnRzOgorICogCisgKiBpcnEgICAgIGludGVycnVwdCBudW1iZXIgdGhhdCBjYXVzZWQgaW50ZXJydXB0CisgKiBkZXZfaWQgIGRldmljZSBJRCBzdXBwbGllZCBkdXJpbmcgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbgorICogcmVncyAgICBpbnRlcnJ1cHRlZCBwcm9jZXNzb3IgY29udGV4dAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWdzbHBjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKilkZXZfaWQ7CisJdW5zaWduZWQgc2hvcnQgaXNyOworCXVuc2lnbmVkIGNoYXIgZ2lzLCBwaXM7CisJaW50IGNvdW50PTA7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQkKKwkJcHJpbnRrKCJtZ3NscGNfaXNyKCVkKSBlbnRyeS5cbiIsIGlycSk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCQorCWlmICghKGluZm8tPmxpbmsuc3RhdGUgJiBERVZfQ09ORklHKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKworCXdoaWxlICgoZ2lzID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgR0lTKSkpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikJCisJCQlwcmludGsoIm1nc2xwY19pc3IgJXMgZ2lzPSUwNFhcbiIsIGluZm8tPmRldmljZV9uYW1lLGdpcyk7CisKKwkJaWYgKChnaXMgJiAweDcwKSB8fCBjb3VudCA+IDEwMDApIHsKKwkJCXByaW50aygic3luY2xpbmtfY3M6aGFyZHdhcmUgZmFpbGVkIG9yIGVqZWN0ZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQrKzsKKworCQlpZiAoZ2lzICYgKEJJVDEgKyBCSVQwKSkgeworCQkJaXNyID0gcmVhZF9yZWcxNihpbmZvLCBDSEIgKyBJU1IpOworCQkJaWYgKGlzciAmIElSUV9EQ0QpCisJCQkJZGNkX2NoYW5nZShpbmZvKTsKKwkJCWlmIChpc3IgJiBJUlFfQ1RTKQorCQkJCWN0c19jaGFuZ2UoaW5mbyk7CisJCX0KKwkJaWYgKGdpcyAmIChCSVQzICsgQklUMikpCisJCXsKKwkJCWlzciA9IHJlYWRfcmVnMTYoaW5mbywgQ0hBICsgSVNSKTsKKwkJCWlmIChpc3IgJiBJUlFfVElNRVIpIHsKKwkJCQlpbmZvLT5pcnFfb2NjdXJyZWQgPSAxOworCQkJCWlycV9kaXNhYmxlKGluZm8sIENIQSwgSVJRX1RJTUVSKTsKKwkJCX0KKworCQkJLyogcmVjZWl2ZSBJUlFzICovIAorCQkJaWYgKGlzciAmIElSUV9FWElUSFVOVCkgeworCQkJCWluZm8tPmljb3VudC5leGl0aHVudCsrOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwkJCX0KKwkJCWlmIChpc3IgJiBJUlFfQlJFQUtfT04pIHsKKwkJCQlpbmZvLT5pY291bnQuYnJrKys7CisJCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJCQlkb19TQUsoaW5mby0+dHR5KTsKKwkJCX0KKwkJCWlmIChpc3IgJiBJUlFfUlhUSU1FKSB7CisJCQkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWEZJRk9fUkVBRCk7CisJCQl9CisJCQlpZiAoaXNyICYgKElSUV9SWEVPTSArIElSUV9SWEZJRk8pKSB7CisJCQkJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKQorCQkJCQlyeF9yZWFkeV9oZGxjKGluZm8sIGlzciAmIElSUV9SWEVPTSk7IAorCQkJCWVsc2UKKwkJCQkJcnhfcmVhZHlfYXN5bmMoaW5mbywgaXNyICYgSVJRX1JYRU9NKTsKKwkJCX0KKworCQkJLyogdHJhbnNtaXQgSVJRcyAqLyAKKwkJCWlmIChpc3IgJiBJUlFfVU5ERVJSVU4pIHsKKwkJCQlpZiAoaW5mby0+dHhfYWJvcnRpbmcpCisJCQkJCWluZm8tPmljb3VudC50eGFib3J0Kys7CisJCQkJZWxzZQorCQkJCQlpbmZvLT5pY291bnQudHh1bmRlcisrOworCQkJCXR4X2RvbmUoaW5mbyk7CisJCQl9CisJCQllbHNlIGlmIChpc3IgJiBJUlFfQUxMU0VOVCkgeworCQkJCWluZm8tPmljb3VudC50eG9rKys7CisJCQkJdHhfZG9uZShpbmZvKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGlzciAmIElSUV9UWEZJRk8pCisJCQkJdHhfcmVhZHkoaW5mbyk7CisJCX0KKwkJaWYgKGdpcyAmIEJJVDcpIHsKKwkJCXBpcyA9IHJlYWRfcmVnKGluZm8sIENIQSArIFBJUyk7CisJCQlpZiAocGlzICYgQklUMSkKKwkJCQlkc3JfY2hhbmdlKGluZm8pOworCQkJaWYgKHBpcyAmIEJJVDIpCisJCQkJcmlfY2hhbmdlKGluZm8pOworCQl9CisJfQorCQorCS8qIFJlcXVlc3QgYm90dG9tIGhhbGYgcHJvY2Vzc2luZyBpZiB0aGVyZSdzIHNvbWV0aGluZyAKKwkgKiBmb3IgaXQgdG8gZG8gYW5kIHRoZSBiaCBpcyBub3QgYWxyZWFkeSBydW5uaW5nCisJICovCisKKwlpZiAoaW5mby0+cGVuZGluZ19iaCAmJiAhaW5mby0+YmhfcnVubmluZyAmJiAhaW5mby0+YmhfcmVxdWVzdGVkKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCQlwcmludGsoIiVzKCVkKTolcyBxdWV1ZWluZyBiaCB0YXNrLlxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRhc2spOworCQlpbmZvLT5iaF9yZXF1ZXN0ZWQgPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2lzciglZClleGl0LlxuIiwKKwkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLGlycSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIEluaXRpYWxpemUgYW5kIHN0YXJ0IGRldmljZS4KKyAqLworc3RhdGljIGludCBzdGFydHVwKE1HU0xQQ19JTkZPICogaW5mbykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6c3RhcnR1cCglcylcbiIsX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQkKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJcmV0dXJuIDA7CisJCisJaWYgKCFpbmZvLT50eF9idWYpIHsKKwkJLyogYWxsb2NhdGUgYSBwYWdlIG9mIG1lbW9yeSBmb3IgYSB0cmFuc21pdCBidWZmZXIgKi8KKwkJaW5mby0+dHhfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mby0+dHhfYnVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIiJXMoJWQpOiVzIGNhbid0IGFsbG9jYXRlIHRyYW5zbWl0IGJ1ZmZlclxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWluZm8tPnBlbmRpbmdfYmggPSAwOworCQorCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwlpbmZvLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwlpbmZvLT50eF90aW1lci5mdW5jdGlvbiA9IHR4X3RpbWVvdXQ7CisKKwkvKiBBbGxvY2F0ZSBhbmQgY2xhaW0gYWRhcHRlciByZXNvdXJjZXMgKi8KKwlyZXR2YWwgPSBjbGFpbV9yZXNvdXJjZXMoaW5mbyk7CisJCisJLyogcGVyZm9ybSBleGlzdGFuY2UgY2hlY2sgYW5kIGRpYWdub3N0aWNzICovCisJaWYgKCAhcmV0dmFsICkKKwkJcmV0dmFsID0gYWRhcHRlcl90ZXN0KGluZm8pOworCQkKKwlpZiAoIHJldHZhbCApIHsKKyAgCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiBpbmZvLT50dHkpCisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKyAgCQlyZXR1cm4gcmV0dmFsOworICAJfQorCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCisJbWdzbHBjX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisJCisJaWYgKGluZm8tPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBieSBtZ3NscGNfY2xvc2UoKSBhbmQgbWdzbHBjX2hhbmd1cCgpIHRvIHNodXRkb3duIGhhcmR3YXJlCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKE1HU0xQQ19JTkZPICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX3NodXRkb3duKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCS8qIGNsZWFyIHN0YXR1cyB3YWl0IHF1ZXVlIGJlY2F1c2Ugc3RhdHVzIGNoYW5nZXMgKi8KKwkvKiBjYW4ndCBoYXBwZW4gYWZ0ZXIgc2h1dHRpbmcgZG93biB0aGUgaGFyZHdhcmUgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKworCWlmIChpbmZvLT50eF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT50eF9idWYpOworCQlpbmZvLT50eF9idWYgPSBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJ4X3N0b3AoaW5mbyk7CisJdHhfc3RvcChpbmZvKTsKKworCS8qIFRPRE86ZGlzYWJsZSBpbnRlcnJ1cHRzIGluc3RlYWQgb2YgcmVzZXQgdG8gcHJlc2VydmUgc2lnbmFsIHN0YXRlcyAqLworCXJlc2V0X2RldmljZShpbmZvKTsKKwkKKyAJaWYgKCFpbmZvLT50dHkgfHwgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKyAJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFMpOworCQlzZXRfc2lnbmFscyhpbmZvKTsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsJCisJCisJaWYgKGluZm8tPnR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKK30KKworc3RhdGljIHZvaWQgbWdzbHBjX3Byb2dyYW1faHcoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlyeF9zdG9wKGluZm8pOworCXR4X3N0b3AoaW5mbyk7CisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fCBpbmZvLT5uZXRjb3VudCkKKwkJaGRsY19tb2RlKGluZm8pOworCWVsc2UKKwkJYXN5bmNfbW9kZShpbmZvKTsKKwkJCisJc2V0X3NpZ25hbHMoaW5mbyk7CisJCisJaW5mby0+ZGNkX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5jdHNfY2hrY291bnQgPSAwOworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCisJaXJxX2VuYWJsZShpbmZvLCBDSEIsIElSUV9EQ0QgfCBJUlFfQ1RTKTsKKwlwb3J0X2lycV9lbmFibGUoaW5mbywgKHVuc2lnbmVkIGNoYXIpIFBWUl9EU1IgfCBQVlJfUkkpOworCWdldF9zaWduYWxzKGluZm8pOworCQkKKwlpZiAoaW5mby0+bmV0Y291bnQgfHwgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpCisJCXJ4X3N0YXJ0KGluZm8pOworCQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogUmVjb25maWd1cmUgYWRhcHRlciBiYXNlZCBvbiBuZXcgcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBtZ3NscGNfY2hhbmdlX3BhcmFtcyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjZmxhZzsKKwlpbnQgYml0c19wZXJfY2hhcjsKKworCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCisJCXJldHVybjsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jaGFuZ2VfcGFyYW1zKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8qIGlmIEIwIHJhdGUgKGhhbmd1cCkgc3BlY2lmaWVkIHRoZW4gbmVnYXRlIERUUiBhbmQgUlRTICovCisJLyogb3RoZXJ3aXNlIGFzc2VydCBEVFIgYW5kIFJUUyAqLworIAlpZiAoY2ZsYWcgJiBDQkFVRCkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJZWxzZQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkKKwkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLworCQorCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNTsgYnJlYWs7CisJY2FzZSBDUzY6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA2OyBicmVhazsKKwljYXNlIENTNzogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDc7IGJyZWFrOworCWNhc2UgQ1M4OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gODsgYnJlYWs7CisJZGVmYXVsdDogIGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA3OyBicmVhazsKKwl9CisJICAgICAgCisJaWYgKGNmbGFnICYgQ1NUT1BCKQorCQlpbmZvLT5wYXJhbXMuc3RvcF9iaXRzID0gMjsKKwllbHNlCisJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgPSAxOworCisJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9OT05FOworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlpZiAoY2ZsYWcgJiBQQVJPREQpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX09ERDsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9FVkVOOworI2lmZGVmIENNU1BBUgorCQlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX1NQQUNFOworI2VuZGlmCisJfQorCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBqaWZmaWVzIHRvIHRyYW5zbWl0IGEgZnVsbAorCSAqIEZJRk8gKDMyIGJ5dGVzKSBhdCBzcGVjaWZpZWQgZGF0YSByYXRlCisJICovCisJYml0c19wZXJfY2hhciA9IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgKyAKKwkJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgKyAxOworCisJLyogaWYgcG9ydCBkYXRhIHJhdGUgaXMgc2V0IHRvIDQ2MDgwMCBvciBsZXNzIHRoZW4KKwkgKiBhbGxvdyB0dHkgc2V0dGluZ3MgdG8gb3ZlcnJpZGUsIG90aGVyd2lzZSBrZWVwIHRoZQorCSAqIGN1cnJlbnQgZGF0YSByYXRlLgorCSAqLworCWlmIChpbmZvLT5wYXJhbXMuZGF0YV9yYXRlIDw9IDQ2MDgwMCkgeworCQlpbmZvLT5wYXJhbXMuZGF0YV9yYXRlID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwl9CisJCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICkgeworCQlpbmZvLT50aW1lb3V0ID0gKDMyKkhaKmJpdHNfcGVyX2NoYXIpIC8gCisJCQkJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZTsKKwl9CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwllbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkJCisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworCS8qIHByb2Nlc3MgdHR5IGlucHV0IGNvbnRyb2wgZmxhZ3MgKi8KKwkKKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IEJJVDcgfCBCSVQ2OworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gQklUNyB8IEJJVDY7CisKKwltZ3NscGNfcHJvZ3JhbV9odyhpbmZvKTsKK30KKworLyogQWRkIGEgY2hhcmFjdGVyIHRvIHRoZSB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykgeworCQlwcmludGsoICIlcyglZCk6bWdzbHBjX3B1dF9jaGFyKCVkKSBvbiAlc1xuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGNoLGluZm8tPmRldmljZV9uYW1lKTsKKwl9CisKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19wdXRfY2hhciIpKQorCQlyZXR1cm47CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQyB8fCAhaW5mby0+dHhfYWN0aXZlKSB7CisJCWlmIChpbmZvLT50eF9jb3VudCA8IFRYQlVGU0laRSAtIDEpIHsKKwkJCWluZm8tPnR4X2J1ZltpbmZvLT50eF9wdXQrK10gPSBjaDsKKwkJCWluZm8tPnR4X3B1dCAmPSBUWEJVRlNJWkUtMTsKKwkJCWluZm8tPnR4X2NvdW50Kys7CisJCX0KKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIEVuYWJsZSB0cmFuc21pdHRlciBzbyByZW1haW5pbmcgY2hhcmFjdGVycyBpbiB0aGUKKyAqIHRyYW5zbWl0IGJ1ZmZlciBhcmUgc2VudC4KKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayggIiVzKCVkKTptZ3NscGNfZmx1c2hfY2hhcnMoKSBlbnRyeSBvbiAlcyB0eF9jb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGluZm8tPnR4X2NvdW50KTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+dHhfY291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwKKwkgICAgdHR5LT5od19zdG9wcGVkIHx8ICFpbmZvLT50eF9idWYpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6bWdzbHBjX2ZsdXNoX2NoYXJzKCkgZW50cnkgb24gJXMgc3RhcnRpbmcgdHJhbnNtaXR0ZXJcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCFpbmZvLT50eF9hY3RpdmUpCisJIAl0eF9zdGFydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogU2VuZCBhIGJsb2NrIG9mIGRhdGEKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogdHR5ICAgICAgICBwb2ludGVyIHRvIHR0eSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIGJ1ZgkgICAgICBwb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIHNlbmQgZGF0YQorICogY291bnQgICAgICBzaXplIG9mIHNlbmQgZGF0YSBpbiBieXRlcworICogCQorICogUmV0dXJuczogbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IG1nc2xwY193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBjLCByZXQgPSAwOworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6bWdzbHBjX3dyaXRlKCVzKSBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGNvdW50KTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY193cml0ZSIpIHx8CisJICAgICF0dHkgfHwgIWluZm8tPnR4X2J1ZikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWlmIChjb3VudCA+IFRYQlVGU0laRSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoaW5mby0+dHhfYWN0aXZlKQorCQkJZ290byBjbGVhbnVwOworCQllbHNlIGlmIChpbmZvLT50eF9jb3VudCkKKwkJCWdvdG8gc3RhcnQ7CisJfQorCisJZm9yICg7OykgeworCQljID0gbWluKGNvdW50LAorCQkJbWluKFRYQlVGU0laRSAtIGluZm8tPnR4X2NvdW50IC0gMSwKKwkJCSAgICBUWEJVRlNJWkUgLSBpbmZvLT50eF9wdXQpKTsKKwkJaWYgKGMgPD0gMCkKKwkJCWJyZWFrOworCQkJCisJCW1lbWNweShpbmZvLT50eF9idWYgKyBpbmZvLT50eF9wdXQsIGJ1ZiwgYyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpbmZvLT50eF9wdXQgPSAoaW5mby0+dHhfcHV0ICsgYykgJiAoVFhCVUZTSVpFLTEpOworCQlpbmZvLT50eF9jb3VudCArPSBjOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0ICs9IGM7CisJfQorc3RhcnQ6CisgCWlmIChpbmZvLT50eF9jb3VudCAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkJIAl0eF9zdGFydChpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisgCX0KK2NsZWFudXA6CQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6bWdzbHBjX3dyaXRlKCVzKSByZXR1cm5pbmc9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxyZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJldHVybiB0aGUgY291bnQgb2YgZnJlZSBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCBtZ3NscGNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCQkJCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJLyogSERMQyAoZnJhbWUgb3JpZW50ZWQpIG1vZGUgKi8KKwkJaWYgKGluZm8tPnR4X2FjdGl2ZSkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gSERMQ19NQVhfRlJBTUVfU0laRTsKKwl9IGVsc2UgeworCQlyZXQgPSBUWEJVRlNJWkUgLSBpbmZvLT50eF9jb3VudCAtIDE7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0ID0gMDsKKwl9CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY193cml0ZV9yb29tKCVzKT0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIHRoZSBjb3VudCBvZiBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCBtZ3NscGNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCWludCByYzsKKwkJIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfY2hhcnNfaW5fYnVmZmVyKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykKKwkJcmMgPSBpbmZvLT50eF9hY3RpdmUgPyBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA6IDA7CisJZWxzZQorCQlyYyA9IGluZm8tPnR4X2NvdW50OworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jaGFyc19pbl9idWZmZXIoJXMpPSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmMpOworCQkJIAorCXJldHVybiByYzsKK30KKworLyogRGlzY2FyZCBhbGwgZGF0YSBpbiB0aGUgc2VuZCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfZmx1c2hfYnVmZmVyKCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19mbHVzaF9idWZmZXIiKSkKKwkJcmV0dXJuOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7IAorCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKiBTZW5kIGEgaGlnaC1wcmlvcml0eSBYT04vWE9GRiBjaGFyYWN0ZXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfc2VuZF94Y2hhciglcywlZClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBjaCApOworCQkJIAorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3NlbmRfeGNoYXIiKSkKKwkJcmV0dXJuOworCisJaW5mby0+eF9jaGFyID0gY2g7CisJaWYgKGNoKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCQkgCXR4X3N0YXJ0KGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIFNpZ25hbCByZW1vdGUgZGV2aWNlIHRvIHRocm90dGxlIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfdGhyb3R0bGUoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfdGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWlmIChJX0lYT0ZGKHR0eSkpCisJCW1nc2xwY19zZW5kX3hjaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOworIAorIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogU2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gc3RvcCB0aHJvdHRsaW5nIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY191bnRocm90dGxlKCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UKKwkJCW1nc2xwY19zZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKKwl9CisJCisgCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCBzZXJpYWwgc3RhdGlzdGljcworICovCitzdGF0aWMgaW50IGdldF9zdGF0cyhNR1NMUENfSU5GTyAqIGluZm8sIHN0cnVjdCBtZ3NsX2ljb3VudCBfX3VzZXIgKnVzZXJfaWNvdW50KQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X3BhcmFtcyglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfaWNvdW50LCAmaW5mby0+aWNvdW50LCBzaXplb2Yoc3RydWN0IG1nc2xfaWNvdW50KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCBzZXJpYWwgcGFyYW1ldGVycworICovCitzdGF0aWMgaW50IGdldF9wYXJhbXMoTUdTTFBDX0lORk8gKiBpbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKnVzZXJfcGFyYW1zKQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X3BhcmFtcyglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfcGFyYW1zLCAmaW5mby0+cGFyYW1zLCBzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBzZXJpYWwgcGFyYW1ldGVycworICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCW5ld19wYXJhbXMJdXNlciBidWZmZXIgY29udGFpbmluZyBuZXcgc2VyaWFsIHBhcmFtcworICoKKyAqIFJldHVybnM6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBzZXRfcGFyYW1zKE1HU0xQQ19JTkZPICogaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICpuZXdfcGFyYW1zKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCU1HU0xfUEFSQU1TIHRtcF9wYXJhbXM7CisJaW50IGVycjsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6c2V0X3BhcmFtcyAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSApOworCUNPUFlfRlJPTV9VU0VSKGVyciwmdG1wX3BhcmFtcywgbmV3X3BhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOnNldF9wYXJhbXMoJXMpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwltZW1jcHkoJmluZm8tPnBhcmFtcywmdG1wX3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKyAJbWdzbHBjX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3R4aWRsZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKmlkbGVfbW9kZSkKK3sKKwlpbnQgZXJyOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoImdldF90eGlkbGUoJXMpPSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aWRsZV9tb2RlKTsKKwlDT1BZX1RPX1VTRVIoZXJyLGlkbGVfbW9kZSwgJmluZm8tPmlkbGVfbW9kZSwgc2l6ZW9mKGludCkpOworCWlmIChlcnIpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF90eGlkbGUoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgaWRsZV9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInNldF90eGlkbGUoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaWRsZV9tb2RlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaW5mby0+aWRsZV9tb2RlID0gaWRsZV9tb2RlOworCXR4X3NldF9pZGxlKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9pbnRlcmZhY2UoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgX191c2VyICppZl9tb2RlKQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X2ludGVyZmFjZSglcyk9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pZl9tb2RlKTsKKwlDT1BZX1RPX1VTRVIoZXJyLGlmX21vZGUsICZpbmZvLT5pZl9tb2RlLCBzaXplb2YoaW50KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ludGVyZmFjZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBpZl9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInNldF9pbnRlcmZhY2UoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaWZfbW9kZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPmlmX21vZGUgPSBpZl9tb2RlOworCisJdmFsID0gcmVhZF9yZWcoaW5mbywgUFZSKSAmIDB4MGY7CisJc3dpdGNoIChpbmZvLT5pZl9tb2RlKQorCXsKKwljYXNlIE1HU0xfSU5URVJGQUNFX1JTMjMyOiB2YWwgfD0gUFZSX1JTMjMyOyBicmVhazsKKwljYXNlIE1HU0xfSU5URVJGQUNFX1YzNTogICB2YWwgfD0gUFZSX1YzNTsgICBicmVhazsKKwljYXNlIE1HU0xfSU5URVJGQUNFX1JTNDIyOiB2YWwgfD0gUFZSX1JTNDIyOyBicmVhazsKKwl9CisJd3JpdGVfcmVnKGluZm8sIFBWUiwgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF90eGVuYWJsZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygic2V0X3R4ZW5hYmxlKCVzLCVkKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGVuYWJsZSk7CisJCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJCQl0eF9zdGFydChpbmZvKTsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+dHhfZW5hYmxlZCkKKwkJCXR4X3N0b3AoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR4X2Fib3J0KE1HU0xQQ19JTkZPICogaW5mbykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJ0eF9hYm9ydCglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwkJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoaW5mby0+dHhfYWN0aXZlICYmIGluZm8tPnR4X2NvdW50ICYmCisJICAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCS8qIGNsZWFyIGRhdGEgY291bnQgc28gRklGTyBpcyBub3QgZmlsbGVkIG9uIG5leHQgSVJRLgorCQkgKiBUaGlzIHJlc3VsdHMgaW4gdW5kZXJydW4gYW5kIGFib3J0IHRyYW5zbWlzc2lvbi4KKwkJICovCisJCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKwkJaW5mby0+dHhfYWJvcnRpbmcgPSBUUlVFOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfcnhlbmFibGUoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgZW5hYmxlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInNldF9yeGVuYWJsZSglcywlZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBlbmFibGUpOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChlbmFibGUpIHsKKwkJaWYgKCFpbmZvLT5yeF9lbmFibGVkKQorCQkJcnhfc3RhcnQoaW5mbyk7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPnJ4X2VuYWJsZWQpCisJCQlyeF9zdG9wKGluZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCisgKiAJCisgKiBBcmd1bWVudHM6CSAJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCQltYXNrCXBvaW50ZXIgdG8gYml0bWFzayBvZiBldmVudHMgdG8gd2FpdCBmb3IKKyAqIFJldHVybiBWYWx1ZToJMCAJaWYgc3VjY2Vzc2Z1bCBhbmQgYml0IG1hc2sgdXBkYXRlZCB3aXRoCisgKgkJCQlvZiBldmVudHMgdHJpZ2dlcnJlZCwKKyAqIAkJCW90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9ldmVudHMoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgX191c2VyICptYXNrX3B0cikKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgczsKKwlpbnQgcmM9MDsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJaW50IGV2ZW50czsKKwlpbnQgbWFzazsKKwlzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgb2xkc2lncywgbmV3c2lnczsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCUNPUFlfRlJPTV9VU0VSKHJjLCZtYXNrLCBtYXNrX3B0ciwgc2l6ZW9mKGludCkpOworCWlmIChyYykKKwkJcmV0dXJuICAtRUZBVUxUOworCQkgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygid2FpdF9ldmVudHMoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgbWFzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgc3RhdGUgbWF0Y2hlcyByZXF1ZXN0ZWQgZXZlbnRzICovCisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJcyA9IGluZm8tPnNlcmlhbF9zaWduYWxzOworCWV2ZW50cyA9IG1hc2sgJgorCQkoICgocyAmIFNlcmlhbFNpZ25hbF9EU1IpID8gTWdzbEV2ZW50X0RzckFjdGl2ZTpNZ3NsRXZlbnRfRHNySW5hY3RpdmUpICsKKyAJCSAgKChzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyBNZ3NsRXZlbnRfRGNkQWN0aXZlOk1nc2xFdmVudF9EY2RJbmFjdGl2ZSkgKworCQkgICgocyAmIFNlcmlhbFNpZ25hbF9DVFMpID8gTWdzbEV2ZW50X0N0c0FjdGl2ZTpNZ3NsRXZlbnRfQ3RzSW5hY3RpdmUpICsKKwkJICAoKHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IE1nc2xFdmVudF9SaUFjdGl2ZSA6TWdzbEV2ZW50X1JpSW5hY3RpdmUpICk7CisJaWYgKGV2ZW50cykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHNhdmUgY3VycmVudCBpcnEgY291bnRzICovCisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJb2xkc2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisJCisJaWYgKChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgJiYKKwkgICAgKG1hc2sgJiBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlKSkKKwkJaXJxX2VuYWJsZShpbmZvLCBDSEEsIElSUV9FWElUSFVOVCk7CisJCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+ZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisJCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkJCisJCS8qIGdldCBjdXJyZW50IGlycSBjb3VudHMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQluZXdzaWdzID0gaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50czsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkJLyogaWYgbm8gY2hhbmdlLCB3YWl0IGFib3J0ZWQgZm9yIHNvbWUgcmVhc29uICovCisJCWlmIChuZXdzaWdzLmRzcl91cCAgID09IG9sZHNpZ3MuZHNyX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuZHNyX2Rvd24gPT0gb2xkc2lncy5kc3JfZG93biAmJgorCQkgICAgbmV3c2lncy5kY2RfdXAgICA9PSBvbGRzaWdzLmRjZF91cCAgICYmCisJCSAgICBuZXdzaWdzLmRjZF9kb3duID09IG9sZHNpZ3MuZGNkX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MuY3RzX3VwICAgPT0gb2xkc2lncy5jdHNfdXAgICAmJgorCQkgICAgbmV3c2lncy5jdHNfZG93biA9PSBvbGRzaWdzLmN0c19kb3duICYmCisJCSAgICBuZXdzaWdzLnJpX3VwICAgID09IG9sZHNpZ3MucmlfdXAgICAgJiYKKwkJICAgIG5ld3NpZ3MucmlfZG93biAgPT0gb2xkc2lncy5yaV9kb3duICAmJgorCQkgICAgY25vdy5leGl0aHVudCAgICA9PSBjcHJldi5leGl0aHVudCAgICYmCisJCSAgICBjbm93LnJ4aWRsZSAgICAgID09IGNwcmV2LnJ4aWRsZSkgeworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlldmVudHMgPSBtYXNrICYKKwkJCSggKG5ld3NpZ3MuZHNyX3VwICAgIT0gb2xkc2lncy5kc3JfdXAgICA/IE1nc2xFdmVudF9Ec3JBY3RpdmU6MCkgICArCisJCQkgIChuZXdzaWdzLmRzcl9kb3duICE9IG9sZHNpZ3MuZHNyX2Rvd24gPyBNZ3NsRXZlbnRfRHNySW5hY3RpdmU6MCkgKworCQkJICAobmV3c2lncy5kY2RfdXAgICAhPSBvbGRzaWdzLmRjZF91cCAgID8gTWdzbEV2ZW50X0RjZEFjdGl2ZTowKSAgICsKKwkJCSAgKG5ld3NpZ3MuZGNkX2Rvd24gIT0gb2xkc2lncy5kY2RfZG93biA/IE1nc2xFdmVudF9EY2RJbmFjdGl2ZTowKSArCisJCQkgIChuZXdzaWdzLmN0c191cCAgICE9IG9sZHNpZ3MuY3RzX3VwICAgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlOjApICAgKworCQkJICAobmV3c2lncy5jdHNfZG93biAhPSBvbGRzaWdzLmN0c19kb3duID8gTWdzbEV2ZW50X0N0c0luYWN0aXZlOjApICsKKwkJCSAgKG5ld3NpZ3MucmlfdXAgICAgIT0gb2xkc2lncy5yaV91cCAgICA/IE1nc2xFdmVudF9SaUFjdGl2ZTowKSAgICArCisJCQkgIChuZXdzaWdzLnJpX2Rvd24gICE9IG9sZHNpZ3MucmlfZG93biAgPyBNZ3NsRXZlbnRfUmlJbmFjdGl2ZTowKSAgKworCQkJICAoY25vdy5leGl0aHVudCAgICAhPSBjcHJldi5leGl0aHVudCAgID8gTWdzbEV2ZW50X0V4aXRIdW50TW9kZTowKSArCisJCQkgIChjbm93LnJ4aWRsZSAgICAgICE9IGNwcmV2LnJ4aWRsZSAgICAgPyBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkOjApICk7CisJCWlmIChldmVudHMpCisJCQlicmVhazsKKwkJCisJCWNwcmV2ID0gY25vdzsKKwkJb2xkc2lncyA9IG5ld3NpZ3M7CisJfQorCQorCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJaWYgKG1hc2sgJiBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZpbmZvLT5ldmVudF93YWl0X3EpKQorCQkJaXJxX2Rpc2FibGUoaW5mbywgQ0hBLCBJUlFfRVhJVEhVTlQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9CitleGl0OgorCWlmIChyYyA9PSAwKQorCQlQVVRfVVNFUihyYywgZXZlbnRzLCBtYXNrX3B0cik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1vZGVtX2lucHV0X3dhaXQoTUdTTFBDX0lORk8gKmluZm8saW50IGFyZykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisJc3RydWN0IG1nc2xfaWNvdW50IGNwcmV2LCBjbm93OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyogc2F2ZSBjdXJyZW50IGlycSBjb3VudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGdldCBuZXcgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCS8qIGlmIG5vIGNoYW5nZSwgd2FpdCBhYm9ydGVkIGZvciBzb21lIHJlYXNvbiAqLworCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJgorCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykgeworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBmb3IgY2hhbmdlIGluIGNhbGxlciBzcGVjaWZpZWQgbW9kZW0gaW5wdXQgKi8KKwkJaWYgKChhcmcgJiBUSU9DTV9STkcgJiYgY25vdy5ybmcgIT0gY3ByZXYucm5nKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0RTUiAmJiBjbm93LmRzciAhPSBjcHJldi5kc3IpIHx8CisJCSAgICAoYXJnICYgVElPQ01fQ0QgICYmIGNub3cuZGNkICE9IGNwcmV2LmRjZCkgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9DVFMgJiYgY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgeworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQljcHJldiA9IGNub3c7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHNlcmlhbCBjb250cm9sIGFuZCBzdGF0dXMgc2lnbmFscworICovCitzdGF0aWMgaW50IHRpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJlc3VsdCA9ICgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKSA/IFRJT0NNX1JUUzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKSA/IFRJT0NNX0RUUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IFRJT0NNX0NBUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IFRJT0NNX1JORzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IFRJT0NNX0RTUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSA/IFRJT0NNX0NUUzowKTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbWdldCgpIHZhbHVlPSUwOFhcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXN1bHQgKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBzZXQgbW9kZW0gY29udHJvbCBzaWduYWxzIChEVFIvUlRTKQorICovCitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbXNldCgleCwleClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgc2V0LCBjbGVhcik7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EVFI7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfRFRSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlzZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBTZXQgb3IgY2xlYXIgdHJhbnNtaXQgYnJlYWsgY29uZGl0aW9uCisgKgorICogQXJndW1lbnRzOgkJdHR5CQlwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKgkJCWJyZWFrX3N0YXRlCS0xPXNldCBicmVhayBjb25kaXRpb24sIDA9Y2xlYXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19icmVhayglcywlZClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBicmVha19zdGF0ZSk7CisJCQkgCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfYnJlYWsiKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEErREFGTywgQklUNik7CisJZWxzZSAKKwkJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBK0RBRk8sIEJJVDYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBTZXJ2aWNlIGFuIElPQ1RMIHJlcXVlc3QKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQlwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiAJZmlsZQlwb2ludGVyIHRvIGFzc29jaWF0ZWQgZmlsZSBvYmplY3QgZm9yIGRldmljZQorICogCWNtZAlJT0NUTCBjb21tYW5kIGNvZGUKKyAqIAlhcmcJY29tbWFuZCBhcmd1bWVudC9jb250ZXh0CisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NscGNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJTUdTTFBDX0lORk8gKiBpbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2lvY3RsICVzIGNtZD0lMDhYXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lLCBjbWQgKTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXJldHVybiBpb2N0bF9jb21tb24oaW5mbywgY21kLCBhcmcpOworfQorCitpbnQgaW9jdGxfY29tbW9uKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IG1nc2xfaWNvdW50IGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOwkvKiB1c2VyIHNwYWNlICovCisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUdTTF9JT0NHUEFSQU1TOgorCQlyZXR1cm4gZ2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DU1BBUkFNUzoKKwkJcmV0dXJuIHNldF9wYXJhbXMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ0dUWElETEU6CisJCXJldHVybiBnZXRfdHhpZGxlKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NTVFhJRExFOgorCQlyZXR1cm4gc2V0X3R4aWRsZShpbmZvLCAoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ0dJRjoKKwkJcmV0dXJuIGdldF9pbnRlcmZhY2UoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1NJRjoKKwkJcmV0dXJuIHNldF9pbnRlcmZhY2UoaW5mbywoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ1RYRU5BQkxFOgorCQlyZXR1cm4gc2V0X3R4ZW5hYmxlKGluZm8sKGludClhcmcpOworCWNhc2UgTUdTTF9JT0NSWEVOQUJMRToKKwkJcmV0dXJuIHNldF9yeGVuYWJsZShpbmZvLChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DVFhBQk9SVDoKKwkJcmV0dXJuIHR4X2Fib3J0KGluZm8pOworCWNhc2UgTUdTTF9JT0NHU1RBVFM6CisJCXJldHVybiBnZXRfc3RhdHMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1dBSVRFVkVOVDoKKwkJcmV0dXJuIHdhaXRfZXZlbnRzKGluZm8sIGFyZ3ApOworCWNhc2UgVElPQ01JV0FJVDoKKwkJcmV0dXJuIG1vZGVtX2lucHV0X3dhaXQoaW5mbywoaW50KWFyZyk7CisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJcF9jdXNlciA9IGFyZ3A7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cucm5nLCAmcF9jdXNlci0+cm5nKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cucngsICZwX2N1c2VyLT5yeCk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LnR4LCAmcF9jdXNlci0+dHgpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cub3ZlcnJ1biwgJnBfY3VzZXItPm92ZXJydW4pOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5icmssICZwX2N1c2VyLT5icmspOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBTZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQkJcG9pbnRlciB0byB0dHkgc3RydWN0dXJlCisgKiAJdGVybWlvcwkJcG9pbnRlciB0byBidWZmZXIgdG8gaG9sZCByZXR1cm5lZCBvbGQgdGVybWlvcworICovCitzdGF0aWMgdm9pZCBtZ3NscGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfc2V0X3Rlcm1pb3MgJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJdHR5LT5kcml2ZXItPm5hbWUgKTsKKwkKKwkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCisJICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAorCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQorCSAgcmV0dXJuOworCisJbWdzbHBjX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KKwkKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gQjAgc3RhdHVzICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKyAJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IAorIAkJICAgICF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisgCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9CisJCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJdHhfcmVsZWFzZSh0dHkpOworCX0KK30KKworc3RhdGljIHZvaWQgbWdzbHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfY2xvc2UiKSkKKwkJcmV0dXJuOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfY2xvc2UoJXMpIGVudHJ5LCBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmNvdW50KTsKKwkJCSAKKwlpZiAoIWluZm8tPmNvdW50KQorCQlyZXR1cm47CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJZ290byBjbGVhbnVwOworCQkJCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiB0dHktPmNvdW50IGlzIDEgYW5kIHRoZSB0dHkgc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuCisJCSAqIGluZm8tPmNvdW50IHNob3VsZCBiZSBvbmUgaW4gdGhpcyBjYXNlLgorCQkgKiBpZiBpdCdzIG5vdCwgY29ycmVjdCBpdCBzbyB0aGF0IHRoZSBwb3J0IGlzIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKCJtZ3NscGNfY2xvc2U6IGJhZCByZWZjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwkKKwlpbmZvLT5jb3VudC0tOworCQorCS8qIGlmIGF0IGxlYXN0IG9uZSBvcGVuIHJlbWFpbmluZywgbGVhdmUgaGFyZHdhcmUgYWN0aXZlICovCisJaWYgKGluZm8tPmNvdW50KQorCQlnb3RvIGNsZWFudXA7CisJCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwkKKwkvKiBzZXQgdHR5LT5jbG9zaW5nIHRvIG5vdGlmeSBsaW5lIGRpc2NpcGxpbmUgdG8gCisJICogb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuIE9ubHkgdGhlIE5fVFRZCisJICogZGlzY2lwbGluZSBhcHBlYXJzIHRvIHVzZSB0aGlzIChwcHAgZG9lcyBub3QpLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgZGF0YSB0byBjbGVhciBhbGwgbGF5ZXJzICovCisJCisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOm1nc2xwY19jbG9zZSglcykgY2FsbGluZyB0dHlfd2FpdF91bnRpbF9zZW50XG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJfQorCQkKKyAJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisgCQltZ3NscGNfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCisJbGRpc2NfZmx1c2hfYnVmZmVyKHR0eSk7CisJCQorCXNodXRkb3duKGluZm8pOworCQorCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKwkKKwlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwl9CisJCisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCQkJIAorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCitjbGVhbnVwOgkJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfY2xvc2UoJXMpIGV4aXQsIGNvdW50PSVkXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCXR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5LgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCU1HU0xQQ19JTkZPICogaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKworCWlmICghaW5mbyApCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfd2FpdF91bnRpbF9zZW50KCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKyAgICAgIAorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3dhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJZ290byBleGl0OworCSAKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworICAgICAgCisJLyogU2V0IGNoZWNrIGludGVydmFsIHRvIDEvNSBvZiBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuIFRoZSBjaGVjaworCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KKwkgKiBOb3RlOiB1c2UgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkgdGhlIE5JU1QtUENUUy4KKwkgKi8gCisgICAgICAgCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICkgeworCSAgICAgICAJY2hhcl90aW1lID0gaW5mby0+dGltZW91dC8oMzIgKiA1KTsKKwkJaWYgKCFjaGFyX3RpbWUpCisJCQljaGFyX3RpbWUrKzsKKwl9IGVsc2UKKwkJY2hhcl90aW1lID0gMTsKKwkJCisJaWYgKHRpbWVvdXQpCisJCWNoYXJfdGltZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNoYXJfdGltZSwgdGltZW91dCk7CisJCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQl3aGlsZSAoaW5mby0+dHhfYWN0aXZlKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgoaW5mby0+dHhfY291bnQgfHwgaW5mby0+dHhfYWN0aXZlKSAmJgorCQkJaW5mby0+dHhfZW5hYmxlZCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisgICAgICAKK2V4aXQ6CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY193YWl0X3VudGlsX3NlbnQoJXMpIGV4aXRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7Cit9CisKKy8qIENhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KKyAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2xvc2luZyBhbGwgb3BlbiBmaWxlcyBmb3IgdGhlIHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xwY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfaGFuZ3VwKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19oYW5ndXAiKSkKKwkJcmV0dXJuOworCisJbWdzbHBjX2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCQorCWluZm8tPmNvdW50ID0gMDsJCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKK30KKworLyogQmxvY2sgdGhlIGN1cnJlbnQgcHJvY2VzcyB1bnRpbCB0aGUgc3BlY2lmaWVkIHBvcnQKKyAqIGlzIHJlYWR5IHRvIGJlIG9wZW5lZC4KKyAqLworc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICBNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgb24gJXNcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lICk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgfHwgdHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpeworCQkvKiBub25ibG9jayBtb2RlIGlzIHNldCBvciBwb3J0IGlzIG5vdCBlbmFibGVkICovCisJCS8qIGp1c3QgdmVyaWZ5IHRoYXQgY2FsbG91dCBkZXZpY2UgaXMgbm90IGFjdGl2ZSAqLworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyogV2FpdCBmb3IgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIG1nc2xwY19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCSAKKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jayBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCWluZm8tPmNvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5ibG9ja2VkX29wZW4rKzsKKwkKKwl3aGlsZSAoMSkgeworCQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJfQorCQkKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpeworCQkJcmV0dmFsID0gKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkgCWdldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCisgCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisgCQkgICAgKGRvX2Nsb2NhbCB8fCAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSkgKSB7CisgCQkJYnJlYWs7CisJCX0KKwkJCQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBibG9ja2luZyBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCApOworCQkJCSAKKwkJc2NoZWR1bGUoKTsKKwl9CisJCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisJCisJaWYgKGV4dHJhX2NvdW50KQorCQlpbmZvLT5jb3VudCsrOworCWluZm8tPmJsb2NrZWRfb3Blbi0tOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmcgb24gJXMgY291bnQ9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCApOworCQkJIAorCWlmICghcmV0dmFsKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQkKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG1nc2xwY19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlNR1NMUENfSU5GTwkqaW5mbzsKKwlpbnQgCQkJcmV0dmFsLCBsaW5lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiB2ZXJpZnkgcmFuZ2Ugb2Ygc3BlY2lmaWVkIGxpbmUgbnVtYmVyICovCQorCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IG1nc2xwY19kZXZpY2VfY291bnQpKSB7CisJCXByaW50aygiJXMoJWQpOm1nc2xwY19vcGVuIHdpdGggaW52YWxpZCBsaW5lICMlZC5cbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxsaW5lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZmluZCB0aGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgbGluZSAqLworCWluZm8gPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbyAmJiBpbmZvLT5saW5lICE9IGxpbmUpCisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19vcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCQorCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnR0eSA9IHR0eTsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19vcGVuKCVzKSwgb2xkIHJlZiBjb3VudCA9ICVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7CisKKwkvKiBJZiBwb3J0IGlzIGNsb3NpbmcsIHNpZ25hbCBjYWxsZXIgdG8gdHJ5IGFnYWluICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKXsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlyZXR2YWwgPSAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJCisJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IChpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+bmV0Y291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaW5mby0+Y291bnQrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+Y291bnQgPT0gMSkgeworCQkvKiAxc3Qgb3BlbiBvbiB0aGlzIGRldmljZSwgaW5pdCBoYXJkd2FyZSAqLworCQlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5KCVzKSByZXR1cm5lZCAlZFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXR2YWwpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19vcGVuKCVzKSBzdWNjZXNzXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJcmV0dmFsID0gMDsKKwkKK2NsZWFudXA6CQkJCisJaWYgKHJldHZhbCkgeworCQlpZiAodHR5LT5jb3VudCA9PSAxKQorCQkJaW5mby0+dHR5ID0gTlVMTDsgLyogdHR5IGxheWVyIHdpbGwgcmVsZWFzZSB0dHkgc3RydWN0ICovCisJCWlmKGluZm8tPmNvdW50KQorCQkJaW5mby0+Y291bnQtLTsKKwl9CisJCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIC9wcm9jIGZzIHJvdXRpbmVzLi4uLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmVfaW5mbyhjaGFyICpidWYsIE1HU0xQQ19JTkZPICppbmZvKQoreworCWNoYXIJc3RhdF9idWZbMzBdOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJXM6aW86JTA0WCBpcnE6JWQiLAorCQkgICAgICBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW9fYmFzZSwgaW5mby0+aXJxX2xldmVsKTsKKworCS8qIG91dHB1dCBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlzdGF0X2J1ZlswXSA9IDA7CisJc3RhdF9idWZbMV0gPSAwOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSVFMiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8Q1RTIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERUUiIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxEU1IiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8Q0QiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSSSIpOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgSERMQyB0eG9rOiVkIHJ4b2s6JWQiLAorCQkJICAgICAgaW5mby0+aWNvdW50LnR4b2ssIGluZm8tPmljb3VudC5yeG9rKTsKKwkJaWYgKGluZm8tPmljb3VudC50eHVuZGVyKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eHVuZGVyOiVkIiwgaW5mby0+aWNvdW50LnR4dW5kZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnR4YWJvcnQpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4YWJvcnQ6JWQiLCBpbmZvLT5pY291bnQudHhhYm9ydCk7CisJCWlmIChpbmZvLT5pY291bnQucnhzaG9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhzaG9ydDolZCIsIGluZm8tPmljb3VudC5yeHNob3J0KTsJCisJCWlmIChpbmZvLT5pY291bnQucnhsb25nKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeGxvbmc6JWQiLCBpbmZvLT5pY291bnQucnhsb25nKTsKKwkJaWYgKGluZm8tPmljb3VudC5yeG92ZXIpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4b3ZlcjolZCIsIGluZm8tPmljb3VudC5yeG92ZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4Y3JjKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeGNyYzolZCIsIGluZm8tPmljb3VudC5yeGNyYyk7CisJfSBlbHNlIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBBU1lOQyB0eDolZCByeDolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHgsIGluZm8tPmljb3VudC5yeCk7CisJCWlmIChpbmZvLT5pY291bnQuZnJhbWUpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIGZlOiVkIiwgaW5mby0+aWNvdW50LmZyYW1lKTsKKwkJaWYgKGluZm8tPmljb3VudC5wYXJpdHkpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHBlOiVkIiwgaW5mby0+aWNvdW50LnBhcml0eSk7CisJCWlmIChpbmZvLT5pY291bnQuYnJrKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBicms6JWQiLCBpbmZvLT5pY291bnQuYnJrKTsJCisJCWlmIChpbmZvLT5pY291bnQub3ZlcnJ1bikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgb2U6JWQiLCBpbmZvLT5pY291bnQub3ZlcnJ1bik7CisJfQorCQorCS8qIEFwcGVuZCBzZXJpYWwgc2lnbmFsIHN0YXR1cyB0byBlbmQgKi8KKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiICVzXG4iLCBzdGF0X2J1ZisxKTsKKwkKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAidHhhY3RpdmU9JWQgYmhfcmVxPSVkIGJoX3J1bj0lZCBwZW5kaW5nX2JoPSV4XG4iLAorCQkgICAgICAgaW5mby0+dHhfYWN0aXZlLGluZm8tPmJoX3JlcXVlc3RlZCxpbmZvLT5iaF9ydW5uaW5nLAorCQkgICAgICAgaW5mby0+cGVuZGluZ19iaCk7CisJCisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0IGRldmljZXMKKyAqLworc3RhdGljIGludCBtZ3NscGNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgbDsKKwlvZmZfdAliZWdpbiA9IDA7CisJTUdTTFBDX0lORk8gKmluZm87CisJCisJbGVuICs9IHNwcmludGYocGFnZSwgInN5bmNsaW5rIGRyaXZlcjolc1xuIiwgZHJpdmVyX3ZlcnNpb24pOworCQorCWluZm8gPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJd2hpbGUoIGluZm8gKSB7CisJCWwgPSBsaW5lX2luZm8ocGFnZSArIGxlbiwgaW5mbyk7CisJCWxlbiArPSBsOworCQlpZiAobGVuK2JlZ2luID4gb2ZmK2NvdW50KQorCQkJZ290byBkb25lOworCQlpZiAobGVuK2JlZ2luIDwgb2ZmKSB7CisJCQliZWdpbiArPSBsZW47CisJCQlsZW4gPSAwOworCQl9CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwl9CisKKwkqZW9mID0gMTsKK2RvbmU6CisJaWYgKG9mZiA+PSBsZW4rYmVnaW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IHBhZ2UgKyAob2ZmLWJlZ2luKTsKKwlyZXR1cm4gKChjb3VudCA8IGJlZ2luK2xlbi1vZmYpID8gY291bnQgOiBiZWdpbitsZW4tb2ZmKTsKK30KKworaW50IHJ4X2FsbG9jX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJLyogZWFjaCBidWZmZXIgaGFzIGhlYWRlciBhbmQgZGF0YSAqLworCWluZm8tPnJ4X2J1Zl9zaXplID0gc2l6ZW9mKFJYQlVGKSArIGluZm8tPm1heF9mcmFtZV9zaXplOworCisJLyogY2FsY3VsYXRlIHRvdGFsIGFsbG9jYXRpb24gc2l6ZSBmb3IgOCBidWZmZXJzICovCisJaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgPSBpbmZvLT5yeF9idWZfc2l6ZSAqIDg7CisKKwkvKiBsaW1pdCB0b3RhbCBhbGxvY2F0ZWQgbWVtb3J5ICovCisJaWYgKGluZm8tPnJ4X2J1Zl90b3RhbF9zaXplID4gMHgxMDAwMCkKKwkJaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgPSAweDEwMDAwOworCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBidWZmZXJzICovCisJaW5mby0+cnhfYnVmX2NvdW50ID0gaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgLyBpbmZvLT5yeF9idWZfc2l6ZTsKKworCWluZm8tPnJ4X2J1ZiA9IGttYWxsb2MoaW5mby0+cnhfYnVmX3RvdGFsX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChpbmZvLT5yeF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyeF9yZXNldF9idWZmZXJzKGluZm8pOworCXJldHVybiAwOworfQorCit2b2lkIHJ4X2ZyZWVfYnVmZmVycyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoaW5mby0+cnhfYnVmKQorCQlrZnJlZShpbmZvLT5yeF9idWYpOworCWluZm8tPnJ4X2J1ZiA9IE5VTEw7Cit9CisKK2ludCBjbGFpbV9yZXNvdXJjZXMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKHJ4X2FsbG9jX2J1ZmZlcnMoaW5mbykgPCAwICkgeworCQlwcmludGsoICJDYW50IGFsbG9jYXRlIHJ4IGJ1ZmZlciAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQkKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWxlYXNlX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJyZWxlYXNlX3Jlc291cmNlcyglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwlyeF9mcmVlX2J1ZmZlcnMoaW5mbyk7Cit9CisKKy8qIEFkZCB0aGUgc3BlY2lmaWVkIGRldmljZSBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZSB0byB0aGUKKyAqIGdsb2JhbCBsaW5rZWQgbGlzdCBvZiBkZXZpY2VzIGFuZCBpbmNyZW1lbnQgdGhlIGRldmljZSBjb3VudC4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICovCit2b2lkIG1nc2xwY19hZGRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKQoreworCWluZm8tPm5leHRfZGV2aWNlID0gTlVMTDsKKwlpbmZvLT5saW5lID0gbWdzbHBjX2RldmljZV9jb3VudDsKKwlzcHJpbnRmKGluZm8tPmRldmljZV9uYW1lLCJ0dHlTTFAlZCIsaW5mby0+bGluZSk7CisJCisJaWYgKGluZm8tPmxpbmUgPCBNQVhfREVWSUNFX0NPVU5UKSB7CisJCWlmIChtYXhmcmFtZVtpbmZvLT5saW5lXSkKKwkJCWluZm8tPm1heF9mcmFtZV9zaXplID0gbWF4ZnJhbWVbaW5mby0+bGluZV07CisJCWluZm8tPmRvc3luY3BwcCA9IGRvc3luY3BwcFtpbmZvLT5saW5lXTsKKwl9CisKKwltZ3NscGNfZGV2aWNlX2NvdW50Kys7CisJCisJaWYgKCFtZ3NscGNfZGV2aWNlX2xpc3QpCisJCW1nc2xwY19kZXZpY2VfbGlzdCA9IGluZm87CisJZWxzZSB7CQorCQlNR1NMUENfSU5GTyAqY3VycmVudF9kZXYgPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJCXdoaWxlKCBjdXJyZW50X2Rldi0+bmV4dF9kZXZpY2UgKQorCQkJY3VycmVudF9kZXYgPSBjdXJyZW50X2Rldi0+bmV4dF9kZXZpY2U7CisJCWN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSA9IGluZm87CisJfQorCQorCWlmIChpbmZvLT5tYXhfZnJhbWVfc2l6ZSA8IDQwOTYpCisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKwllbHNlIGlmIChpbmZvLT5tYXhfZnJhbWVfc2l6ZSA+IDY1NTM1KQorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDY1NTM1OworCQorCXByaW50ayggIlN5bmNMaW5rIFBDIENhcmQgJXM6SU89JTA0WCBJUlE9JWRcbiIsCisJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwpOworCisjaWZkZWYgQ09ORklHX0hETEMKKwloZGxjZGV2X2luaXQoaW5mbyk7CisjZW5kaWYKK30KKwordm9pZCBtZ3NscGNfcmVtb3ZlX2RldmljZShNR1NMUENfSU5GTyAqcmVtb3ZlX2luZm8pCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJTUdTTFBDX0lORk8gKmxhc3QgPSBOVUxMOworCisJd2hpbGUoaW5mbykgeworCQlpZiAoaW5mbyA9PSByZW1vdmVfaW5mbykgeworCQkJaWYgKGxhc3QpCisJCQkJbGFzdC0+bmV4dF9kZXZpY2UgPSBpbmZvLT5uZXh0X2RldmljZTsKKwkJCWVsc2UKKwkJCQltZ3NscGNfZGV2aWNlX2xpc3QgPSBpbmZvLT5uZXh0X2RldmljZTsKKyNpZmRlZiBDT05GSUdfSERMQworCQkJaGRsY2Rldl9leGl0KGluZm8pOworI2VuZGlmCisJCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwkJCWtmcmVlKGluZm8pOworCQkJbWdzbHBjX2RldmljZV9jb3VudC0tOworCQkJcmV0dXJuOworCQl9CisJCWxhc3QgPSBpbmZvOworCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbWdzbHBjX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gInN5bmNsaW5rX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gbWdzbHBjX2F0dGFjaCwKKwkuZGV0YWNoCQk9IG1nc2xwY19kZXRhY2gsCit9OworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIG1nc2xwY19vcHMgPSB7CisJLm9wZW4gPSBtZ3NscGNfb3BlbiwKKwkuY2xvc2UgPSBtZ3NscGNfY2xvc2UsCisJLndyaXRlID0gbWdzbHBjX3dyaXRlLAorCS5wdXRfY2hhciA9IG1nc2xwY19wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBtZ3NscGNfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBtZ3NscGNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbWdzbHBjX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gbWdzbHBjX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBtZ3NscGNfaW9jdGwsCisJLnRocm90dGxlID0gbWdzbHBjX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gbWdzbHBjX3VudGhyb3R0bGUsCisJLnNlbmRfeGNoYXIgPSBtZ3NscGNfc2VuZF94Y2hhciwKKwkuYnJlYWtfY3RsID0gbWdzbHBjX2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSBtZ3NscGNfd2FpdF91bnRpbF9zZW50LAorCS5yZWFkX3Byb2MgPSBtZ3NscGNfcmVhZF9wcm9jLAorCS5zZXRfdGVybWlvcyA9IG1nc2xwY19zZXRfdGVybWlvcywKKwkuc3RvcCA9IHR4X3BhdXNlLAorCS5zdGFydCA9IHR4X3JlbGVhc2UsCisJLmhhbmd1cCA9IG1nc2xwY19oYW5ndXAsCisJLnRpb2NtZ2V0ID0gdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gdGlvY21zZXQsCit9OworCitzdGF0aWMgdm9pZCBzeW5jbGlua19jc19jbGVhbnVwKHZvaWQpCit7CisJaW50IHJjOworCisJcHJpbnRrKCJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisKKwl3aGlsZShtZ3NscGNfZGV2aWNlX2xpc3QpCisJCW1nc2xwY19yZW1vdmVfZGV2aWNlKG1nc2xwY19kZXZpY2VfbGlzdCk7CisKKwlpZiAoc2VyaWFsX2RyaXZlcikgeworCQlpZiAoKHJjID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKSkKKwkJCXByaW50aygiJXMoJWQpIGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgZXJyPSVkXG4iLAorCQkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLHJjKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJfQorCisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZtZ3NscGNfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN5bmNsaW5rX2NzX2luaXQodm9pZCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoYnJlYWtfb25fbG9hZCkgeworCSAgICBtZ3NscGNfZ2V0X3RleHRfcHRyKCk7CisJICAgIEJSRUFLUE9JTlQoKTsKKyAgICB9CisKKyAgICBwcmludGsoIiVzICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCisgICAgaWYgKChyYyA9IHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm1nc2xwY19kcml2ZXIpKSA8IDApCisJICAgIHJldHVybiByYzsKKworICAgIHNlcmlhbF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWF9ERVZJQ0VfQ09VTlQpOworICAgIGlmICghc2VyaWFsX2RyaXZlcikgeworCSAgICByYyA9IC1FTk9NRU07CisJICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKwkKKyAgICBzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworICAgIHNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gInN5bmNsaW5rX2NzIjsKKyAgICBzZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eVNMUCI7CisgICAgc2VyaWFsX2RyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKKyAgICBzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OworICAgIHNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworICAgIHNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisgICAgc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworICAgIHNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgICAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworICAgIHNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKyAgICB0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJm1nc2xwY19vcHMpOworCisgICAgaWYgKChyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpIDwgMCkgeworCSAgICBwcmludGsoIiVzKCVkKTpDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iLAorCQkgICBfX0ZJTEVfXyxfX0xJTkVfXyk7CisJICAgIHB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCSAgICBzZXJpYWxfZHJpdmVyID0gTlVMTDsKKwkgICAgZ290byBlcnJvcjsKKyAgICB9CisJCQkKKyAgICBwcmludGsoIiVzICVzLCB0dHkgbWFqb3IjJWRcbiIsCisJICAgZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uLAorCSAgIHNlcmlhbF9kcml2ZXItPm1ham9yKTsKKwkKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgc3luY2xpbmtfY3NfY2xlYW51cCgpOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN5bmNsaW5rX2NzX2V4aXQodm9pZCkgCit7CisJc3luY2xpbmtfY3NfY2xlYW51cCgpOworfQorCittb2R1bGVfaW5pdChzeW5jbGlua19jc19pbml0KTsKK21vZHVsZV9leGl0KHN5bmNsaW5rX2NzX2V4aXQpOworCitzdGF0aWMgdm9pZCBtZ3NscGNfc2V0X3JhdGUoTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IE0sIE47CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwkvKiBub3RlOnN0YW5kYXJkIEJSRyBtb2RlIGlzIGJyb2tlbiBpbiBWMy4yIGNoaXAgCisJICogc28gZW5oYW5jZWQgbW9kZSBpcyBhbHdheXMgdXNlZCAKKwkgKi8KKworCWlmIChyYXRlKSB7CisJCU4gPSAzNjg2NDAwIC8gcmF0ZTsKKwkJaWYgKCFOKQorCQkJTiA9IDE7CisJCU4gPj49IDE7CisJCWZvciAoTSA9IDE7IE4gPiA2NCAmJiBNIDwgMTY7IE0rKykKKwkJCU4gPj49IDE7CisJCU4tLTsKKworCQkvKiBCR1JbNS4uMF0gPSBOCisJCSAqIEJHUls5Li42XSA9IE0KKwkJICogQkdSWzcuLjBdIGNvbnRhaW5lZCBpbiBCR1IgcmVnaXN0ZXIKKwkJICogQkdSWzkuLjhdIGNvbnRhaW5lZCBpbiBDQ1IyWzcuLjZdCisJCSAqIGRpdmlzb3IgPSAoTisxKSoyXk0KKwkJICoKKwkJICogTm90ZTogTSAqbXVzdCogbm90IGJlIHplcm8gKGNhdXNlcyBhc3ltZXRyaWMgZHV0eSBjeWNsZSkKKwkJICovIAorCQl3cml0ZV9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpIChjaGFubmVsICsgQkdSKSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyKSAoKE0gPDwgNikgKyBOKSk7CisJCXZhbCA9IHJlYWRfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSAoY2hhbm5lbCArIENDUjIpKSAmIDB4M2Y7CisJCXZhbCB8PSAoKE0gPDwgNCkgJiAweGMwKTsKKwkJd3JpdGVfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSAoY2hhbm5lbCArIENDUjIpLCB2YWwpOworCX0KK30KKworLyogRW5hYmxlZCB0aGUgQVVYIGNsb2NrIG91dHB1dCBhdCB0aGUgc3BlY2lmaWVkIGZyZXF1ZW5jeS4KKyAqLworc3RhdGljIHZvaWQgZW5hYmxlX2F1eGNsayhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwkKKwkvKiBNT0RFCisJICoKKwkgKiAwNy4uMDYgIE1EU1sxLi4wXSAxMCA9IHRyYW5zcGFyZW50IEhETEMgbW9kZQorCSAqIDA1ICAgICAgQURNIEFkZHJlc3MgTW9kZSwgMCA9IG5vIGFkZHIgcmVjb2duaXRpb24KKwkgKiAwNCAgICAgIFRNRCBUaW1lciBNb2RlLCAwID0gZXh0ZXJuYWwKKwkgKiAwMyAgICAgIFJBQyBSZWNlaXZlciBBY3RpdmUsIDAgPSBpbmFjdGl2ZQorCSAqIDAyICAgICAgUlRTIDA9UlRTIGFjdGl2ZSBkdXJpbmcgeG1pdCwgMT1SVFMgYWx3YXlzIGFjdGl2ZQorCSAqIDAxICAgICAgVFJTIFRpbWVyIFJlc29sdXRpb24sIDE9NTEyCisJICogMDAgICAgICBUTFAgVGVzdCBMb29wLCAwID0gbm8gbG9vcAorCSAqCisJICogMTAwMCAwMDEwCisJICovIAorCXZhbCA9IDB4ODI7CisJCisJLyogY2hhbm5lbCBCIFJUUyBpcyB1c2VkIHRvIGVuYWJsZSBBVVhDTEsgZHJpdmVyIG9uIFNQNTA1ICovIAorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyAmJiBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCXZhbCB8PSBCSVQyOworCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBNT0RFLCB2YWwpOworCQorCS8qIENDUjAKKwkgKgorCSAqIDA3ICAgICAgUFUgUG93ZXIgVXAsIDE9YWN0aXZlLCAwPXBvd2VyIGRvd24KKwkgKiAwNiAgICAgIE1DRSBNYXN0ZXIgQ2xvY2sgRW5hYmxlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFJlc2VydmVkLCAwCisJICogMDQuLjAyICBTQ1syLi4wXSBFbmNvZGluZworCSAqIDAxLi4wMCAgU01bMS4uMF0gU2VyaWFsIE1vZGUsIDAwPUhETEMKKwkgKgorCSAqIDExMDAwMDAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBDQ1IwLCAweGMwKTsKKwkKKwkvKiBDQ1IxCisJICoKKwkgKiAwNyAgICAgIFNGTEcgU2hhcmVkIEZsYWcsIDAgPSBkaXNhYmxlIHNoYXJlZCBmbGFncworCSAqIDA2ICAgICAgR0FMUCBHbyBBY3RpdmUgT24gTG9vcCwgMCA9IG5vdCB1c2VkCisJICogMDUgICAgICBHTFAgR28gT24gTG9vcCwgMCA9IG5vdCB1c2VkCisJICogMDQgICAgICBPRFMgT3V0cHV0IERyaXZlciBTZWxlY3QsIDE9VHhEIGlzIHB1c2gtcHVsbCBvdXRwdXQKKwkgKiAwMyAgICAgIElURiBJbnRlcmZyYW1lIFRpbWUgRmlsbCwgMD1tYXJrLCAxPWZsYWcKKwkgKiAwMi4uMDAgIENNWzIuLjBdIENsb2NrIE1vZGUKKwkgKgorCSAqIDAwMDEgMDExMQorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMSwgMHgxNyk7CisJCisJLyogQ0NSMiAoQ2hhbm5lbCBCKQorCSAqCisJICogMDcuLjA2ICBCR1JbOS4uOF0gQmF1ZCByYXRlIGJpdHMgOS4uOAorCSAqIDA1ICAgICAgQkRGIEJhdWQgcmF0ZSBkaXZpc29yIGZhY3RvciwgMD0xLCAxPUJHUiB2YWx1ZQorCSAqIDA0ICAgICAgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYgorCSAqIDAzICAgICAgVE9FIDA9VHhDTEsgaXMgaW5wdXQsIDE9VHhDTEsgaXMgb3V0cHV0CisJICogMDIgICAgICBSV1ggUmVhZC9Xcml0ZSBFeGNoYW5nZSAwPWRpc2FibGVkCisJICogMDEgICAgICBDMzIsIENSQyBzZWxlY3QsIDA9Q1JDLTE2LCAxPUNSQy0zMgorCSAqIDAwICAgICAgRElWLCBkYXRhIGludmVyc2lvbiAwPWRpc2FibGVkLCAxPWVuYWJsZWQKKwkgKgorCSAqIDAwMTEgMTAwMAorCSAqLyAKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgJiYgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKQorCQl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMiwgMHgzOCk7CisJZWxzZQorCQl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMiwgMHgzMCk7CisJCisJLyogQ0NSNAorCSAqCisJICogMDcgICAgICBNQ0s0IE1hc3RlciBDbG9jayBEaXZpZGUgYnkgNCwgMT1lbmFibGVkCisJICogMDYgICAgICBFQlJHIEVuaGFuY2VkIEJhdWQgUmF0ZSBHZW5lcmF0b3IgTW9kZSwgMT1lbmFibGVkCisJICogMDUgICAgICBUU1QxIFRlc3QgUGluLCAwPW5vcm1hbCBvcGVyYXRpb24KKwkgKiAwNCAgICAgIElDRCBJdmVydCBDYXJyaWVyIERldGVjdCwgMT1lbmFibGVkIChhY3RpdmUgbG93KQorCSAqIDAzLi4wMiAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAxLi4wMCAgUkZUWzEuLjBdIFJ4RklGTyBUaHJlc2hvbGQgMDA9MzIgYnl0ZXMKKwkgKgorCSAqIDAxMDEgMDAwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSNCwgMHg1MCk7CisJCisJLyogaWYgYXV4Y2xrIG5vdCBlbmFibGVkLCBzZXQgaW50ZXJuYWwgQlJHIHNvCisJICogQ1RTIHRyYW5zaXRpb25zIGNhbiBiZSBkZXRlY3RlZCAocmVxdWlyZXMgVHhDKQorCSAqLyAKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgJiYgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hCLCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpOworCWVsc2UKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQiwgOTIxNjAwKTsKK30KKworc3RhdGljIHZvaWQgbG9vcGJhY2tfZW5hYmxlKE1HU0xQQ19JTkZPICppbmZvKSAKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwkKKwkvKiBDQ1IxOjAyLi4wMCAgQ01bMi4uMF0gQ2xvY2sgTW9kZSA9IDExMSAoY2xvY2sgbW9kZSA3KSAqLyAKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBDQ1IxKSB8IChCSVQyICsgQklUMSArIEJJVDApOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IxLCB2YWwpOworCQorCS8qIENDUjI6MDQgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYiAqLyAKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBDQ1IyKSB8IChCSVQ0ICsgQklUNSk7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjIsIHZhbCk7CisJCisJLyogc2V0IExpbmtTcGVlZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDJNYnBzICovIAorCWlmIChpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCW1nc2xwY19zZXRfcmF0ZShpbmZvLCBDSEEsIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisJZWxzZQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hBLCAxODQzMjAwKTsKKwkKKwkvKiBNT0RFOjAwIFRMUCBUZXN0IExvb3AsIDE9bG9vcGJhY2sgZW5hYmxlZCAqLyAKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBNT0RFKSB8IEJJVDA7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIE1PREUsIHZhbCk7Cit9CisKK3ZvaWQgaGRsY19tb2RlKE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCXVuc2lnbmVkIGNoYXIgY2xrbW9kZSwgY2xrc3VibW9kZTsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8gCisJaXJxX2Rpc2FibGUoaW5mbywgQ0hBLCAweGZmZmYpOworCWlycV9kaXNhYmxlKGluZm8sIENIQiwgMHhmZmZmKTsKKwlwb3J0X2lycV9kaXNhYmxlKGluZm8sIDB4ZmYpOworCQorCS8qIGFzc3VtZSBjbG9jayBtb2RlIDBhLCByY3Y9UnhDIHhtdD1UeEMgKi8gCisJY2xrbW9kZSA9IGNsa3N1Ym1vZGUgPSAwOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwKKwkgICAgJiYgaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19EUExMKSB7CisJCS8qIGNsb2NrIG1vZGUgN2EsIHJjdiA9IERQTEwsIHhtdCA9IERQTEwgKi8gCisJCWNsa21vZGUgPSA3OworCX0gZWxzZSBpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19CUkcKKwkJICYmIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKSB7CisJCS8qIGNsb2NrIG1vZGUgN2IsIHJjdiA9IEJSRywgeG10ID0gQlJHICovIAorCQljbGttb2RlID0gNzsKKwkJY2xrc3VibW9kZSA9IDE7CisJfSBlbHNlIGlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwpIHsKKwkJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKSB7CisJCQkvKiBjbG9jayBtb2RlIDZiLCByY3YgPSBEUExMLCB4bXQgPSBCUkcvMTYgKi8gCisJCQljbGttb2RlID0gNjsKKwkJCWNsa3N1Ym1vZGUgPSAxOworCQl9IGVsc2UgeworCQkJLyogY2xvY2sgbW9kZSA2YSwgcmN2ID0gRFBMTCwgeG10ID0gVHhDICovIAorCQkJY2xrbW9kZSA9IDY7CisJCX0KKwl9IGVsc2UgaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKSB7CisJCS8qIGNsb2NrIG1vZGUgMGIsIHJjdiA9IFJ4QywgeG10ID0gQlJHICovIAorCQljbGtzdWJtb2RlID0gMTsKKwl9CisJCisJLyogTU9ERQorCSAqCisJICogMDcuLjA2ICBNRFNbMS4uMF0gMTAgPSB0cmFuc3BhcmVudCBIRExDIG1vZGUKKwkgKiAwNSAgICAgIEFETSBBZGRyZXNzIE1vZGUsIDAgPSBubyBhZGRyIHJlY29nbml0aW9uCisJICogMDQgICAgICBUTUQgVGltZXIgTW9kZSwgMCA9IGV4dGVybmFsCisJICogMDMgICAgICBSQUMgUmVjZWl2ZXIgQWN0aXZlLCAwID0gaW5hY3RpdmUKKwkgKiAwMiAgICAgIFJUUyAwPVJUUyBhY3RpdmUgZHVyaW5nIHhtaXQsIDE9UlRTIGFsd2F5cyBhY3RpdmUKKwkgKiAwMSAgICAgIFRSUyBUaW1lciBSZXNvbHV0aW9uLCAxPTUxMgorCSAqIDAwICAgICAgVExQIFRlc3QgTG9vcCwgMCA9IG5vIGxvb3AKKwkgKgorCSAqIDEwMDAgMDAxMAorCSAqLyAKKwl2YWwgPSAweDgyOworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCXZhbCB8PSBCSVQwOworCQorCS8qIHByZXNlcnZlIFJUUyBzdGF0ZSAqLyAKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKQorCQl2YWwgfD0gQklUMjsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKKwkKKwkvKiBDQ1IwCisJICoKKwkgKiAwNyAgICAgIFBVIFBvd2VyIFVwLCAxPWFjdGl2ZSwgMD1wb3dlciBkb3duCisJICogMDYgICAgICBNQ0UgTWFzdGVyIENsb2NrIEVuYWJsZSwgMT1lbmFibGVkCisJICogMDUgICAgICBSZXNlcnZlZCwgMAorCSAqIDA0Li4wMiAgU0NbMi4uMF0gRW5jb2RpbmcKKwkgKiAwMS4uMDAgIFNNWzEuLjBdIFNlcmlhbCBNb2RlLCAwMD1IRExDCisJICoKKwkgKiAxMTAwMDAwMAorCSAqLyAKKwl2YWwgPSAweGMwOworCXN3aXRjaCAoaW5mby0+cGFyYW1zLmVuY29kaW5nKQorCXsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSToKKwkJdmFsIHw9IEJJVDM7CisJCWJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOgorCQl2YWwgfD0gQklUNDsKKwkJYnJlYWs7CQkvLyBGTTAKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOgorCQl2YWwgfD0gQklUNCArIEJJVDI7CisJCWJyZWFrOwkJLy8gRk0xCisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6CisJCXZhbCB8PSBCSVQ0ICsgQklUMzsKKwkJYnJlYWs7CQkvLyBNYW5jaGVzdGVyCisJfQorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IwLCB2YWwpOworCQorCS8qIENDUjEKKwkgKgorCSAqIDA3ICAgICAgU0ZMRyBTaGFyZWQgRmxhZywgMCA9IGRpc2FibGUgc2hhcmVkIGZsYWdzCisJICogMDYgICAgICBHQUxQIEdvIEFjdGl2ZSBPbiBMb29wLCAwID0gbm90IHVzZWQKKwkgKiAwNSAgICAgIEdMUCBHbyBPbiBMb29wLCAwID0gbm90IHVzZWQKKwkgKiAwNCAgICAgIE9EUyBPdXRwdXQgRHJpdmVyIFNlbGVjdCwgMT1UeEQgaXMgcHVzaC1wdWxsIG91dHB1dAorCSAqIDAzICAgICAgSVRGIEludGVyZnJhbWUgVGltZSBGaWxsLCAwPW1hcmssIDE9ZmxhZworCSAqIDAyLi4wMCAgQ01bMi4uMF0gQ2xvY2sgTW9kZQorCSAqCisJICogMDAwMSAwMDAwCisJICovIAorCXZhbCA9IDB4MTAgKyBjbGttb2RlOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IxLCB2YWwpOworCQorCS8qIENDUjIKKwkgKgorCSAqIDA3Li4wNiAgQkdSWzkuLjhdIEJhdWQgcmF0ZSBiaXRzIDkuLjgKKwkgKiAwNSAgICAgIEJERiBCYXVkIHJhdGUgZGl2aXNvciBmYWN0b3IsIDA9MSwgMT1CR1IgdmFsdWUKKwkgKiAwNCAgICAgIFNTRUwgQ2xvY2sgc291cmNlIHNlbGVjdCwgMT1zdWJtb2RlIGIKKwkgKiAwMyAgICAgIFRPRSAwPVR4Q0xLIGlzIGlucHV0LCAwPVR4Q0xLIGlzIGlucHV0CisJICogMDIgICAgICBSV1ggUmVhZC9Xcml0ZSBFeGNoYW5nZSAwPWRpc2FibGVkCisJICogMDEgICAgICBDMzIsIENSQyBzZWxlY3QsIDA9Q1JDLTE2LCAxPUNSQy0zMgorCSAqIDAwICAgICAgRElWLCBkYXRhIGludmVyc2lvbiAwPWRpc2FibGVkLCAxPWVuYWJsZWQKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChjbGttb2RlID09IDIgfHwgY2xrbW9kZSA9PSAzIHx8IGNsa21vZGUgPT0gNgorCSAgICB8fCBjbGttb2RlID09IDcgfHwgKGNsa21vZGUgPT0gMCAmJiBjbGtzdWJtb2RlID09IDEpKQorCQl2YWwgfD0gQklUNTsKKwlpZiAoY2xrc3VibW9kZSkKKwkJdmFsIHw9IEJJVDQ7CisJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18zMl9DQ0lUVCkKKwkJdmFsIHw9IEJJVDE7CisJaWYgKGluZm8tPnBhcmFtcy5lbmNvZGluZyA9PSBIRExDX0VOQ09ESU5HX05SWkIpCisJCXZhbCB8PSBCSVQwOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IyLCB2YWwpOworCQorCS8qIENDUjMKKwkgKgorCSAqIDA3Li4wNiAgUFJFWzEuLjBdIFByZWFtYmxlIGNvdW50IDAwPTEsIDAxPTIsIDEwPTQsIDExPTgKKwkgKiAwNSAgICAgIEVQVCBFbmFibGUgcHJlYW1ibGUgdHJhbnNtaXNzaW9uLCAxPWVuYWJsZWQKKwkgKiAwNCAgICAgIFJBREQgUmVjZWl2ZSBhZGRyZXNzIHB1c2hlZCB0byBGSUZPLCAwPWRpc2FibGVkCisJICogMDMgICAgICBDUkwgQ1JDIFJlc2V0IExldmVsLCAwPUZGRkYKKwkgKiAwMiAgICAgIFJDUkMgUnggQ1JDIDA9T24gMT1PZmYKKwkgKiAwMSAgICAgIFRDUkMgVHggQ1JDIDA9T24gMT1PZmYKKwkgKiAwMCAgICAgIFBTRCBEUExMIFBoYXNlIFNoaWZ0IERpc2FibGUKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgPT0gSERMQ19DUkNfTk9ORSkKKwkJdmFsIHw9IEJJVDIgKyBCSVQxOworCWlmIChpbmZvLT5wYXJhbXMucHJlYW1ibGUgIT0gSERMQ19QUkVBTUJMRV9QQVRURVJOX05PTkUpCisJCXZhbCB8PSBCSVQ1OworCXN3aXRjaCAoaW5mby0+cGFyYW1zLnByZWFtYmxlX2xlbmd0aCkKKwl7CisJY2FzZSBIRExDX1BSRUFNQkxFX0xFTkdUSF8xNkJJVFM6CisJCXZhbCB8PSBCSVQ2OworCQlicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfTEVOR1RIXzMyQklUUzoKKwkJdmFsIHw9IEJJVDY7CisJCWJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9MRU5HVEhfNjRCSVRTOgorCQl2YWwgfD0gQklUNyArIEJJVDY7CisJCWJyZWFrOworCX0KKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMywgdmFsKTsKKwkKKwkvKiBQUkUgLSBQcmVhbWJsZSBwYXR0ZXJuICovIAorCXZhbCA9IDA7CisJc3dpdGNoIChpbmZvLT5wYXJhbXMucHJlYW1ibGUpCisJeworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX0ZMQUdTOiB2YWwgPSAweDdlOyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfUEFUVEVSTl8xMDogICAgdmFsID0gMHhhYTsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMDE6ICAgIHZhbCA9IDB4NTU7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX09ORVM6ICB2YWwgPSAweGZmOyBicmVhazsKKwl9CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFBSRSwgdmFsKTsKKwkKKwkvKiBDQ1I0CisJICoKKwkgKiAwNyAgICAgIE1DSzQgTWFzdGVyIENsb2NrIERpdmlkZSBieSA0LCAxPWVuYWJsZWQKKwkgKiAwNiAgICAgIEVCUkcgRW5oYW5jZWQgQmF1ZCBSYXRlIEdlbmVyYXRvciBNb2RlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFRTVDEgVGVzdCBQaW4sIDA9bm9ybWFsIG9wZXJhdGlvbgorCSAqIDA0ICAgICAgSUNEIEl2ZXJ0IENhcnJpZXIgRGV0ZWN0LCAxPWVuYWJsZWQgKGFjdGl2ZSBsb3cpCisJICogMDMuLjAyICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDEuLjAwICBSRlRbMS4uMF0gUnhGSUZPIFRocmVzaG9sZCAwMD0zMiBieXRlcworCSAqCisJICogMDEwMSAwMDAwCisJICovIAorCXZhbCA9IDB4NTA7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjQsIHZhbCk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkICogMTYpOworCWVsc2UKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKwkKKwkvKiBSTENSIFJlY2VpdmUgbGVuZ3RoIGNoZWNrIHJlZ2lzdGVyCisJICoKKwkgKiA3ICAgICAxPWVuYWJsZSByZWNlaXZlIGxlbmd0aCBjaGVjaworCSAqIDYuLjAgIE1heCBmcmFtZSBsZW5ndGggPSAoUkwgKyAxKSAqIDMyCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBSTENSLCAwKTsKKwkKKwkvKiBYQkNIIFRyYW5zbWl0IEJ5dGUgQ291bnQgSGlnaAorCSAqCisJICogMDcgICAgICBETUEgbW9kZSwgMCA9IGludGVycnVwdCBkcml2ZW4KKwkgKiAwNiAgICAgIE5STSwgMD1BQk0gKGlnbm9yZWQpCisJICogMDUgICAgICBDQVMgQ2FycmllciBBdXRvIFN0YXJ0CisJICogMDQgICAgICBYQyBUcmFuc21pdCBDb250aW51b3VzbHkgKGlnbm9yZWQpCisJICogMDMuLjAwICBYQkNbMTAuLjhdIFRyYW5zbWl0IGJ5dGUgY291bnQgYml0cyAxMC4uOAorCSAqCisJICogMDAwMCAwMDAwCisJICovIAorCXZhbCA9IDB4MDA7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0RDRCkKKwkJdmFsIHw9IEJJVDU7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFhCQ0gsIHZhbCk7CisJZW5hYmxlX2F1eGNsayhpbmZvKTsKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrIHx8IGluZm8tPnRlc3RpbmdfaXJxKQorCQlsb29wYmFja19lbmFibGUoaW5mbyk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0NUUykKKwl7CisJCWlycV9lbmFibGUoaW5mbywgQ0hCLCBJUlFfQ1RTKTsKKwkJLyogUFZSWzNdIDE9QVVUTyBDVFMgYWN0aXZlICovIAorCQlzZXRfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBCSVQzKTsKKwl9IGVsc2UKKwkJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBCSVQzKTsKKworCWlycV9lbmFibGUoaW5mbywgQ0hBLAorCQkJIElSUV9SWEVPTSArIElSUV9SWEZJRk8gKyBJUlFfQUxMU0VOVCArCisJCQkgSVJRX1VOREVSUlVOICsgSVJRX1RYRklGTyk7CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWFJFU0VUICsgQ01EX1JYUkVTRVQpOworCXdhaXRfY29tbWFuZF9jb21wbGV0ZShpbmZvLCBDSEEpOworCXJlYWRfcmVnMTYoaW5mbywgQ0hBICsgSVNSKTsJLyogY2xlYXIgcGVuZGluZyBJUlFzICovCisJCisJLyogTWFzdGVyIGNsb2NrIG1vZGUgZW5hYmxlZCBhYm92ZSB0byBhbGxvdyByZXNldCBjb21tYW5kcworCSAqIHRvIGNvbXBsZXRlIGV2ZW4gaWYgbm8gZGF0YSBjbG9ja3MgYXJlIHByZXNlbnQuCisJICoKKwkgKiBEaXNhYmxlIG1hc3RlciBjbG9jayBtb2RlIGZvciBub3JtYWwgY29tbXVuaWNhdGlvbnMgYmVjYXVzZQorCSAqIFYzLjIgb2YgdGhlIEVTQ0MyIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHRoZSB0cmFuc21pdCBhbGwgc2VudAorCSAqIElSUSB3aGVuIGluIG1hc3RlciBjbG9jayBtb2RlLgorCSAqCisJICogTGVhdmUgbWFzdGVyIGNsb2NrIG1vZGUgZW5hYmxlZCBmb3IgSVJRIHRlc3QgYmVjYXVzZSB0aGUKKwkgKiB0aW1lciBJUlEgdXNlZCBieSB0aGUgdGVzdCBjYW4gb25seSBoYXBwZW4gaW4gbWFzdGVyIGNsb2NrIG1vZGUuCisJICovIAorCWlmICghaW5mby0+dGVzdGluZ19pcnEpCisJCWNsZWFyX3JlZ19iaXRzKGluZm8sIENIQSArIENDUjAsIEJJVDYpOworCisJdHhfc2V0X2lkbGUoaW5mbyk7CisKKwl0eF9zdG9wKGluZm8pOworCXJ4X3N0b3AoaW5mbyk7Cit9CisKK3ZvaWQgcnhfc3RvcChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTpyeF9zdG9wKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwkvKiBNT0RFOjAzIFJBQyBSZWNlaXZlciBBY3RpdmUsIDA9aW5hY3RpdmUgKi8gCisJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBICsgTU9ERSwgQklUMyk7CisKKwlpbmZvLT5yeF9lbmFibGVkID0gMDsKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IDA7Cit9CisKK3ZvaWQgcnhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6cnhfc3RhcnQoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJcnhfcmVzZXRfYnVmZmVycyhpbmZvKTsKKwlpbmZvLT5yeF9lbmFibGVkID0gMDsKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IDA7CisKKwkvKiBNT0RFOjAzIFJBQyBSZWNlaXZlciBBY3RpdmUsIDE9YWN0aXZlICovIAorCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBNT0RFLCBCSVQzKTsKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworfQorCit2b2lkIHR4X3N0YXJ0KE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnR4X3N0YXJ0KCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAoaW5mby0+dHhfY291bnQpIHsKKwkJLyogSWYgYXV0byBSVFMgZW5hYmxlZCBhbmQgUlRTIGlzIGluYWN0aXZlLCB0aGVuIGFzc2VydCAqLworCQkvKiBSVFMgYW5kIHNldCBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkICovCisJCS8qIG5lZ2F0ZSBSVFMgd2hlbiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlcy4gKi8KKwkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisKKwkJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX1JUUykgeworCQkJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCQlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpKSB7CisJCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkJCQlzZXRfc2lnbmFscyhpbmZvKTsKKwkJCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMTsKKwkJCX0KKwkJfQorCisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpIHsKKwkJCWlmICghaW5mby0+dHhfYWN0aXZlKSB7CisJCQkJaW5mby0+dHhfYWN0aXZlID0gMTsKKwkJCQl0eF9yZWFkeShpbmZvKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWluZm8tPnR4X2FjdGl2ZSA9IDE7CisJCQl0eF9yZWFkeShpbmZvKTsKKwkJCWluZm8tPnR4X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKTsKKwkJCWFkZF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKwkJfQorCX0KKworCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkJaW5mby0+dHhfZW5hYmxlZCA9IDE7Cit9CisKK3ZvaWQgdHhfc3RvcChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp0eF9zdG9wKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisKKwlpbmZvLT50eF9lbmFibGVkID0gMDsKKwlpbmZvLT50eF9hY3RpdmUgID0gMDsKK30KKworLyogUmVzZXQgdGhlIGFkYXB0ZXIgdG8gYSBrbm93biBzdGF0ZSBhbmQgcHJlcGFyZSBpdCBmb3IgZnVydGhlciB1c2UuCisgKi8KK3ZvaWQgcmVzZXRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKQoreworCS8qIHBvd2VyIHVwIGJvdGggY2hhbm5lbHMgKHNldCBCSVQ3KSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMCwgMHg4MCk7CisJd3JpdGVfcmVnKGluZm8sIENIQiArIENDUjAsIDB4ODApOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBNT0RFLCAwKTsKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgTU9ERSwgMCk7CisJCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLyAKKwlpcnFfZGlzYWJsZShpbmZvLCBDSEEsIDB4ZmZmZik7CisJaXJxX2Rpc2FibGUoaW5mbywgQ0hCLCAweGZmZmYpOworCXBvcnRfaXJxX2Rpc2FibGUoaW5mbywgMHhmZik7CisJCisJLyogUENSIFBvcnQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCSAqCisJICogMDcuLjA0ICBERUNbMy4uMF0gU2VyaWFsIEkvRiBzZWxlY3Qgb3V0cHV0cworCSAqIDAzICAgICAgb3V0cHV0LCAxPUFVVE8gQ1RTIGNvbnRyb2wgZW5hYmxlZAorCSAqIDAyICAgICAgUkkgUmluZyBJbmRpY2F0b3IgaW5wdXQgMD1hY3RpdmUKKwkgKiAwMSAgICAgIERTUiBpbnB1dCAwPWFjdGl2ZQorCSAqIDAwICAgICAgRFRSIG91dHB1dCAwPWFjdGl2ZQorCSAqCisJICogMDAwMCAwMTEwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBQQ1IsIDB4MDYpOworCQorCS8qIFBWUiBQb3J0IFZhbHVlIFJlZ2lzdGVyCisJICoKKwkgKiAwNy4uMDQgIERFQ1szLi4wXSBTZXJpYWwgSS9GIHNlbGVjdCAoMDAwMD1kaXNhYmxlZCkKKwkgKiAwMyAgICAgIEFVVE8gQ1RTIG91dHB1dCAxPWVuYWJsZWQKKwkgKiAwMiAgICAgIFJJIFJpbmcgSW5kaWNhdG9yIGlucHV0CisJICogMDEgICAgICBEU1IgaW5wdXQKKwkgKiAwMCAgICAgIERUUiBvdXRwdXQgKDE9aW5hY3RpdmUpCisJICoKKwkgKiAwMDAwIDAwMDEKKwkgKi8KKy8vCXdyaXRlX3JlZyhpbmZvLCBQVlIsIFBWUl9EVFIpOworCQorCS8qIElQQyBJbnRlcnJ1cHQgUG9ydCBDb25maWd1cmF0aW9uCisJICoKKwkgKiAwNyAgICAgIFZJUyAxPU1hc2tlZCBpbnRlcnJ1cHRzIHZpc2libGUKKwkgKiAwNi4uMDUgIFJlc2VydmVkLCAwCisJICogMDQuLjAzICBTTEEgU2xhdmUgYWRkcmVzcywgMDAgaWdub3JlZAorCSAqIDAyICAgICAgQ0FTTSBDYXNjYWRpbmcgTW9kZSwgMT1kYWlzeSBjaGFpbgorCSAqIDAxLi4wMCAgSUNbMS4uMF0gSW50ZXJydXB0IENvbmZpZywgMDE9cHVzaC1wdWxsIG91dHB1dCwgYWN0aXZlIGxvdworCSAqCisJICogMDAwMCAwMTAxCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBJUEMsIDB4MDUpOworfQorCit2b2lkIGFzeW5jX21vZGUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovIAorCWlycV9kaXNhYmxlKGluZm8sIENIQSwgMHhmZmZmKTsKKwlpcnFfZGlzYWJsZShpbmZvLCBDSEIsIDB4ZmZmZik7CisJcG9ydF9pcnFfZGlzYWJsZShpbmZvLCAweGZmKTsKKwkKKwkvKiBNT0RFCisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCAwCisJICogMDYgICAgICBGUlRTIFJUUyBTdGF0ZSwgMD1hY3RpdmUKKwkgKiAwNSAgICAgIEZDVFMgRmxvdyBDb250cm9sIG9uIENUUworCSAqIDA0ICAgICAgRkxPTiBGbG93IENvbnRyb2wgRW5hYmxlCisJICogMDMgICAgICBSQUMgUmVjZWl2ZXIgQWN0aXZlLCAwID0gaW5hY3RpdmUKKwkgKiAwMiAgICAgIFJUUyAwPUF1dG8gUlRTLCAxPW1hbnVhbCBSVFMKKwkgKiAwMSAgICAgIFRSUyBUaW1lciBSZXNvbHV0aW9uLCAxPTUxMgorCSAqIDAwICAgICAgVExQIFRlc3QgTG9vcCwgMCA9IG5vIGxvb3AKKwkgKgorCSAqIDAwMDAgMDExMAorCSAqLyAKKwl2YWwgPSAweDA2OworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCXZhbCB8PSBCSVQwOworCQorCS8qIHByZXNlcnZlIFJUUyBzdGF0ZSAqLyAKKwlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpKQorCQl2YWwgfD0gQklUNjsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKKwkKKwkvKiBDQ1IwCisJICoKKwkgKiAwNyAgICAgIFBVIFBvd2VyIFVwLCAxPWFjdGl2ZSwgMD1wb3dlciBkb3duCisJICogMDYgICAgICBNQ0UgTWFzdGVyIENsb2NrIEVuYWJsZSwgMT1lbmFibGVkCisJICogMDUgICAgICBSZXNlcnZlZCwgMAorCSAqIDA0Li4wMiAgU0NbMi4uMF0gRW5jb2RpbmcsIDAwMD1OUloKKwkgKiAwMS4uMDAgIFNNWzEuLjBdIFNlcmlhbCBNb2RlLCAxMT1Bc3luYworCSAqCisJICogMTAwMCAwMDExCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IwLCAweDgzKTsKKwkKKwkvKiBDQ1IxCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCAwCisJICogMDQgICAgICBPRFMgT3V0cHV0IERyaXZlciBTZWxlY3QsIDE9VHhEIGlzIHB1c2gtcHVsbCBvdXRwdXQKKwkgKiAwMyAgICAgIEJDUiBCaXQgQ2xvY2sgUmF0ZSwgMT0xNngKKwkgKiAwMi4uMDAgIENNWzIuLjBdIENsb2NrIE1vZGUsIDExMT1CUkcKKwkgKgorCSAqIDAwMDEgMTExMQorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMSwgMHgxZik7CisJCisJLyogQ0NSMiAoY2hhbm5lbCBBKQorCSAqCisJICogMDcuLjA2ICBCR1JbOS4uOF0gQmF1ZCByYXRlIGJpdHMgOS4uOAorCSAqIDA1ICAgICAgQkRGIEJhdWQgcmF0ZSBkaXZpc29yIGZhY3RvciwgMD0xLCAxPUJHUiB2YWx1ZQorCSAqIDA0ICAgICAgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYgorCSAqIDAzICAgICAgVE9FIDA9VHhDTEsgaXMgaW5wdXQsIDA9VHhDTEsgaXMgaW5wdXQKKwkgKiAwMiAgICAgIFJXWCBSZWFkL1dyaXRlIEV4Y2hhbmdlIDA9ZGlzYWJsZWQKKwkgKiAwMSAgICAgIFJlc2VydmVkLCAwCisJICogMDAgICAgICBESVYsIGRhdGEgaW52ZXJzaW9uIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZAorCSAqCisJICogMDAwMSAwMDAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IyLCAweDEwKTsKKwkKKwkvKiBDQ1IzCisJICoKKwkgKiAwNy4uMDEgIFJlc2VydmVkLCAwCisJICogMDAgICAgICBQU0QgRFBMTCBQaGFzZSBTaGlmdCBEaXNhYmxlCisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjMsIDApOworCQorCS8qIENDUjQKKwkgKgorCSAqIDA3ICAgICAgTUNLNCBNYXN0ZXIgQ2xvY2sgRGl2aWRlIGJ5IDQsIDE9ZW5hYmxlZAorCSAqIDA2ICAgICAgRUJSRyBFbmhhbmNlZCBCYXVkIFJhdGUgR2VuZXJhdG9yIE1vZGUsIDE9ZW5hYmxlZAorCSAqIDA1ICAgICAgVFNUMSBUZXN0IFBpbiwgMD1ub3JtYWwgb3BlcmF0aW9uCisJICogMDQgICAgICBJQ0QgSXZlcnQgQ2FycmllciBEZXRlY3QsIDE9ZW5hYmxlZCAoYWN0aXZlIGxvdykKKwkgKiAwMy4uMDAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKgorCSAqIDAxMDEgMDAwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSNCwgMHg1MCk7CisJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSAqIDE2KTsKKwkKKwkvKiBEQUZPIERhdGEgRm9ybWF0CisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCAwCisJICogMDYgICAgICBYQlJLIHRyYW5zbWl0IGJyZWFrLCAwPW5vcm1hbCBvcGVyYXRpb24KKwkgKiAwNSAgICAgIFN0b3AgYml0cyAoMD0xLCAxPTIpCisJICogMDQuLjAzICBQQVJbMS4uMF0gUGFyaXR5ICgwMT1vZGQsIDEwPWV2ZW4pCisJICogMDIgICAgICBQQVJFTiBQYXJpdHkgRW5hYmxlCisJICogMDEuLjAwICBDSExbMS4uMF0gQ2hhcmFjdGVyIExlbmd0aCAoMDA9OCwgMDE9NykKKwkgKgorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMuZGF0YV9iaXRzICE9IDgpCisJCXZhbCB8PSBCSVQwOwkvKiA3IGJpdHMgKi8KKwlpZiAoaW5mby0+cGFyYW1zLnN0b3BfYml0cyAhPSAxKQorCQl2YWwgfD0gQklUNTsKKwlpZiAoaW5mby0+cGFyYW1zLnBhcml0eSAhPSBBU1lOQ19QQVJJVFlfTk9ORSkKKwl7CisJCXZhbCB8PSBCSVQyOwkvKiBQYXJpdHkgZW5hYmxlICovCisJCWlmIChpbmZvLT5wYXJhbXMucGFyaXR5ID09IEFTWU5DX1BBUklUWV9PREQpCisJCQl2YWwgfD0gQklUMzsKKwkJZWxzZQorCQkJdmFsIHw9IEJJVDQ7CisJfQorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBEQUZPLCB2YWwpOworCQorCS8qIFJGQyBSeCBGSUZPIENvbnRyb2wKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwNiAgICAgIERQUywgMT1wYXJpdHkgYml0IG5vdCBzdG9yZWQgaW4gZGF0YSBieXRlCisJICogMDUgICAgICBEWFMsIDA9YWxsIGRhdGEgc3RvcmVkIGluIEZJRk8gKGluY2x1ZGluZyBYT04vWE9GRikKKwkgKiAwNCAgICAgIFJGREYgUnggRklGTyBEYXRhIEZvcm1hdCwgMT1zdGF0dXMgYnl0ZSBzdG9yZWQgaW4gRklGTworCSAqIDAzLi4wMiAgUkZUSFsxLi4wXSwgcnggdGhyZXNob2xkLCAxMT0xNiBzdGF0dXMgKyAxNiBkYXRhIGJ5dGUKKwkgKiAwMSAgICAgIFJlc2VydmVkLCAwCisJICogMDAgICAgICBUQ0RFIFRlcm1pbmF0ZSBDaGFyIERldGVjdCBFbmFibGUsIDA9ZGlzYWJsZWQKKwkgKgorCSAqIDAxMDEgMTEwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgUkZDLCAweDVjKTsKKwkKKwkvKiBSTENSIFJlY2VpdmUgbGVuZ3RoIGNoZWNrIHJlZ2lzdGVyCisJICoKKwkgKiBNYXggZnJhbWUgbGVuZ3RoID0gKFJMICsgMSkgKiAzMgorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgUkxDUiwgMCk7CisJCisJLyogWEJDSCBUcmFuc21pdCBCeXRlIENvdW50IEhpZ2gKKwkgKgorCSAqIDA3ICAgICAgRE1BIG1vZGUsIDAgPSBpbnRlcnJ1cHQgZHJpdmVuCisJICogMDYgICAgICBOUk0sIDA9QUJNIChpZ25vcmVkKQorCSAqIDA1ICAgICAgQ0FTIENhcnJpZXIgQXV0byBTdGFydAorCSAqIDA0ICAgICAgWEMgVHJhbnNtaXQgQ29udGludW91c2x5IChpZ25vcmVkKQorCSAqIDAzLi4wMCAgWEJDWzEwLi44XSBUcmFuc21pdCBieXRlIGNvdW50IGJpdHMgMTAuLjgKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19EQ0QpCisJCXZhbCB8PSBCSVQ1OworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBYQkNILCB2YWwpOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19DVFMpCisJCWlycV9lbmFibGUoaW5mbywgQ0hBLCBJUlFfQ1RTKTsKKwkKKwkvKiBNT0RFOjAzIFJBQyBSZWNlaXZlciBBY3RpdmUsIDE9YWN0aXZlICovIAorCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBNT0RFLCBCSVQzKTsKKwllbmFibGVfYXV4Y2xrKGluZm8pOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19DVFMpIHsKKwkJaXJxX2VuYWJsZShpbmZvLCBDSEIsIElSUV9DVFMpOworCQkvKiBQVlJbM10gMT1BVVRPIENUUyBhY3RpdmUgKi8gCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIEJJVDMpOworCX0gZWxzZQorCQljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIEJJVDMpOworCWlycV9lbmFibGUoaW5mbywgQ0hBLAorCQkJICBJUlFfUlhFT00gKyBJUlFfUlhGSUZPICsgSVJRX0JSRUFLX09OICsgSVJRX1JYVElNRSArCisJCQkgIElSUV9BTExTRU5UICsgSVJRX1RYRklGTyk7CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWFJFU0VUICsgQ01EX1JYUkVTRVQpOworCXdhaXRfY29tbWFuZF9jb21wbGV0ZShpbmZvLCBDSEEpOworCXJlYWRfcmVnMTYoaW5mbywgQ0hBICsgSVNSKTsJLyogY2xlYXIgcGVuZGluZyBJUlFzICovCit9CisKKy8qIFNldCB0aGUgSERMQyBpZGxlIG1vZGUgZm9yIHRoZSB0cmFuc21pdHRlci4KKyAqLwordm9pZCB0eF9zZXRfaWRsZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwkvKiBOb3RlOiBFU0NDMiBvbmx5IHN1cHBvcnRzIGZsYWdzIGFuZCBvbmUgaWRsZSBtb2RlcyAqLyAKKwlpZiAoaW5mby0+aWRsZV9tb2RlID09IEhETENfVFhJRExFX0ZMQUdTKQorCQlzZXRfcmVnX2JpdHMoaW5mbywgQ0hBICsgQ0NSMSwgQklUMyk7CisJZWxzZQorCQljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEEgKyBDQ1IxLCBCSVQzKTsKK30KKworLyogZ2V0IHN0YXRlIG9mIHRoZSBWMjQgc3RhdHVzIChpbnB1dCkgc2lnbmFscy4KKyAqLwordm9pZCBnZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisJCisJLyogcHJlc2VydmUgRFRSIGFuZCBSVFMgKi8gCisJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFM7CisKKwlpZiAocmVhZF9yZWcoaW5mbywgQ0hCICsgVlNUUikgJiBCSVQ3KQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRENEOworCWlmIChyZWFkX3JlZyhpbmZvLCBDSEIgKyBTVEFSKSAmIEJJVDEpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9DVFM7CisKKwlzdGF0dXMgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBQVlIpOworCWlmICghKHN0YXR1cyAmIFBWUl9SSSkpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SSTsKKwlpZiAoIShzdGF0dXMgJiBQVlJfRFNSKSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RTUjsKK30KKworLyogU2V0IHRoZSBzdGF0ZSBvZiBEVFIgYW5kIFJUUyBiYXNlZCBvbiBjb250ZW50cyBvZgorICogc2VyaWFsX3NpZ25hbHMgbWVtYmVyIG9mIGRldmljZSBleHRlbnNpb24uCisgKi8KK3ZvaWQgc2V0X3NpZ25hbHMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBNT0RFKTsKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCQl2YWwgJj0gfkJJVDY7CisJCWVsc2UKKwkJCXZhbCB8PSBCSVQ2OworCX0gZWxzZSB7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCQl2YWwgfD0gQklUMjsKKwkJZWxzZQorCQkJdmFsICY9IH5CSVQyOworCX0KKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKKworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpCisJCWNsZWFyX3JlZ19iaXRzKGluZm8sIENIQSArIFBWUiwgUFZSX0RUUik7CisJZWxzZQorCQlzZXRfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBQVlJfRFRSKTsKK30KKwordm9pZCByeF9yZXNldF9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKQoreworCVJYQlVGICpidWY7CisJaW50IGk7CisKKwlpbmZvLT5yeF9wdXQgPSAwOworCWluZm8tPnJ4X2dldCA9IDA7CisJaW5mby0+cnhfZnJhbWVfY291bnQgPSAwOworCWZvciAoaT0wIDsgaSA8IGluZm8tPnJ4X2J1Zl9jb3VudCA7IGkrKykgeworCQlidWYgPSAoUlhCVUYqKShpbmZvLT5yeF9idWYgKyAoaSAqIGluZm8tPnJ4X2J1Zl9zaXplKSk7CisJCWJ1Zi0+c3RhdHVzID0gYnVmLT5jb3VudCA9IDA7CisJfQorfQorCisvKiBBdHRlbXB0IHRvIHJldHVybiBhIHJlY2VpdmVkIEhETEMgZnJhbWUKKyAqIE9ubHkgZnJhbWVzIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIGFyZSByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm5zIDEgaWYgZnJhbWUgcmV0dXJuZWQsIG90aGVyd2lzZSAwCisgKi8KK2ludCByeF9nZXRfZnJhbWUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCVJYQlVGICpidWY7CisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWludCByZXR1cm5fZnJhbWUgPSAwOworCQorCWlmIChpbmZvLT5yeF9mcmFtZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWJ1ZiA9IChSWEJVRiopKGluZm8tPnJ4X2J1ZiArIChpbmZvLT5yeF9nZXQgKiBpbmZvLT5yeF9idWZfc2l6ZSkpOworCisJc3RhdHVzID0gYnVmLT5zdGF0dXM7CisKKwkvKiAwNyAgVkZSICAxPXZhbGlkIGZyYW1lCisJICogMDYgIFJETyAgMT1kYXRhIG92ZXJydW4KKwkgKiAwNSAgQ1JDICAxPU9LLCAwPWVycm9yCisJICogMDQgIFJBQiAgMT1mcmFtZSBhYm9ydGVkCisJICovCisJaWYgKChzdGF0dXMgJiAweGYwKSAhPSAweEEwKSB7CisJCWlmICghKHN0YXR1cyAmIEJJVDcpIHx8IChzdGF0dXMgJiBCSVQ0KSkKKwkJCWluZm8tPmljb3VudC5yeGFib3J0Kys7CisJCWVsc2UgaWYgKHN0YXR1cyAmIEJJVDYpCisJCQlpbmZvLT5pY291bnQucnhvdmVyKys7CisJCWVsc2UgaWYgKCEoc3RhdHVzICYgQklUNSkpIHsKKwkJCWluZm8tPmljb3VudC5yeGNyYysrOworCQkJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCkKKwkJCQlyZXR1cm5fZnJhbWUgPSAxOworCQl9CisJCWZyYW1lc2l6ZSA9IDA7CisjaWZkZWYgQ09ORklHX0hETEMKKwkJeworCQkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhpbmZvLT5uZXRkZXYpOworCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQl9CisjZW5kaWYKKwl9IGVsc2UKKwkJcmV0dXJuX2ZyYW1lID0gMTsKKworCWlmIChyZXR1cm5fZnJhbWUpCisJCWZyYW1lc2l6ZSA9IGJ1Zi0+Y291bnQ7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkgpCisJCXByaW50aygiJXMoJWQpOnJ4X2dldF9mcmFtZSglcykgc3RhdHVzPSUwNFggc2l6ZT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyxmcmFtZXNpemUpOworCQkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEpCisJCXRyYWNlX2Jsb2NrKGluZm8sIGJ1Zi0+ZGF0YSwgZnJhbWVzaXplLCAwKTsJCisJCQorCWlmIChmcmFtZXNpemUpIHsKKwkJaWYgKChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVggJiYKKwkJICAgICAgZnJhbWVzaXplKzEgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkgfHwKKwkJICAgIGZyYW1lc2l6ZSA+IGluZm8tPm1heF9mcmFtZV9zaXplKQorCQkJaW5mby0+aWNvdW50LnJ4bG9uZysrOworCQllbHNlIHsKKwkJCWlmIChzdGF0dXMgJiBCSVQ1KQorCQkJCWluZm8tPmljb3VudC5yeG9rKys7CisKKwkJCWlmIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVgpIHsKKwkJCQkqKGJ1Zi0+ZGF0YSArIGZyYW1lc2l6ZSkgPSBzdGF0dXMgJiBCSVQ1ID8gUlhfT0s6UlhfQ1JDX0VSUk9SOworCQkJCSsrZnJhbWVzaXplOworCQkJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjZGV2X3J4KGluZm8sIGJ1Zi0+ZGF0YSwgZnJhbWVzaXplKTsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWxkaXNjX3JlY2VpdmVfYnVmKHR0eSwgYnVmLT5kYXRhLCBpbmZvLT5mbGFnX2J1ZiwgZnJhbWVzaXplKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlidWYtPnN0YXR1cyA9IGJ1Zi0+Y291bnQgPSAwOworCWluZm8tPnJ4X2ZyYW1lX2NvdW50LS07CisJaW5mby0+cnhfZ2V0Kys7CisJaWYgKGluZm8tPnJ4X2dldCA+PSBpbmZvLT5yeF9idWZfY291bnQpCisJCWluZm8tPnJ4X2dldCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworQk9PTEVBTiByZWdpc3Rlcl90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhdHRlcm5zW10gPSAKKwkgICAgeyAweDAwLCAweGZmLCAweGFhLCAweDU1LCAweDY5LCAweDk2LCAweDBmIH07CisJc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IHNpemVvZihwYXR0ZXJucykgLyBzaXplb2YocGF0dGVybnNbMF0pOworCXVuc2lnbmVkIGludCBpOworCUJPT0xFQU4gcmMgPSBUUlVFOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfZGV2aWNlKGluZm8pOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJd3JpdGVfcmVnKGluZm8sIFhBRDEsIHBhdHRlcm5zW2ldKTsKKwkJd3JpdGVfcmVnKGluZm8sIFhBRDIsIHBhdHRlcm5zWyhpICsgMSkgJSBjb3VudF0pOworCQlpZiAoKHJlYWRfcmVnKGluZm8sIFhBRDEpICE9IHBhdHRlcm5zW2ldKSB8fCAKKwkJICAgIChyZWFkX3JlZyhpbmZvLCBYQUQyKSAhPSBwYXR0ZXJuc1soaSArIDEpICUgY291bnRdKSkgeworCQkJcmMgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitCT09MRUFOIGlycV90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9kZXZpY2UoaW5mbyk7CisKKwlpbmZvLT50ZXN0aW5nX2lycSA9IFRSVUU7CisJaGRsY19tb2RlKGluZm8pOworCisJaW5mby0+aXJxX29jY3VycmVkID0gRkFMU0U7CisKKwkvKiBpbml0IGhkbGMgbW9kZSAqLworCisJaXJxX2VuYWJsZShpbmZvLCBDSEEsIElSUV9USU1FUik7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFRJTVIsIDApOwkvKiA1MTIgY3ljbGVzICovCisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9TVEFSVF9USU1FUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWVuZF90aW1lPTEwMDsKKwl3aGlsZShlbmRfdGltZS0tICYmICFpbmZvLT5pcnFfb2NjdXJyZWQpIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCX0KKwkKKwlpbmZvLT50ZXN0aW5nX2lycSA9IEZBTFNFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJlc2V0X2RldmljZShpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlyZXR1cm4gaW5mby0+aXJxX29jY3VycmVkID8gVFJVRSA6IEZBTFNFOworfQorCitpbnQgYWRhcHRlcl90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmICghcmVnaXN0ZXJfdGVzdChpbmZvKSkgeworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzRmFpbHVyZTsKKwkJcHJpbnRrKCAiJXMoJWQpOlJlZ2lzdGVyIHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIEFkZHI9JTA0WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPmlvX2Jhc2UpICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghaXJxX3Rlc3QoaW5mbykpIHsKKwkJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfSXJxRmFpbHVyZTsKKwkJcHJpbnRrKCAiJXMoJWQpOkludGVycnVwdCB0ZXN0IGZhaWx1cmUgZm9yIGRldmljZSAlcyBJUlE9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5pcnFfbGV2ZWwpICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpkZXZpY2UgJXMgcGFzc2VkIGRpYWdub3N0aWNzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCXJldHVybiAwOworfQorCit2b2lkIHRyYWNlX2Jsb2NrKE1HU0xQQ19JTkZPICppbmZvLGNvbnN0IGNoYXIqIGRhdGEsIGludCBjb3VudCwgaW50IHhtaXQpCit7CisJaW50IGk7CisJaW50IGxpbmVjb3VudDsKKwlpZiAoeG1pdCkKKwkJcHJpbnRrKCIlcyB0eCBkYXRhOlxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CisJZWxzZQorCQlwcmludGsoIiVzIHJ4IGRhdGE6XG4iLGluZm8tPmRldmljZV9uYW1lKTsKKwkJCisJd2hpbGUoY291bnQpIHsKKwkJaWYgKGNvdW50ID4gMTYpCisJCQlsaW5lY291bnQgPSAxNjsKKwkJZWxzZQorCQkJbGluZWNvdW50ID0gY291bnQ7CisJCQkKKwkJZm9yKGk9MDtpPGxpbmVjb3VudDtpKyspCisJCQlwcmludGsoIiUwMlggIiwodW5zaWduZWQgY2hhcilkYXRhW2ldKTsKKwkJZm9yKDtpPDE3O2krKykKKwkJCXByaW50aygiICAgIik7CisJCWZvcihpPTA7aTxsaW5lY291bnQ7aSsrKSB7CisJCQlpZiAoZGF0YVtpXT49MDQwICYmIGRhdGFbaV08PTAxNzYpCisJCQkJcHJpbnRrKCIlYyIsZGF0YVtpXSk7CisJCQllbHNlCisJCQkJcHJpbnRrKCIuIik7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCQkKKwkJZGF0YSAgKz0gbGluZWNvdW50OworCQljb3VudCAtPSBsaW5lY291bnQ7CisJfQorfQorCisvKiBIRExDIGZyYW1lIHRpbWUgb3V0CisgKiB1cGRhdGUgc3RhdHMgYW5kIGRvIHR4IGNvbXBsZXRpb24gcHJvY2Vzc2luZworICovCit2b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPKiljb250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOnR4X3RpbWVvdXQoJXMpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCWlmKGluZm8tPnR4X2FjdGl2ZSAmJgorCSAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWluZm8tPmljb3VudC50eHRpbWVvdXQrKzsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlCisjZW5kaWYKKwkJYmhfdHJhbnNtaXQoaW5mbyk7Cit9CisKKyNpZmRlZiBDT05GSUdfSERMQworCisvKioKKyAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgd2hlbiBwcm90b2NvbCBzZWxlY3RlZCAoUFBQLCBmcmFtZSByZWxheSwgZXRjLikKKyAqIHNldCBlbmNvZGluZyBhbmQgZnJhbWUgY2hlY2sgc2VxdWVuY2UgKEZDUykgb3B0aW9ucworICoKKyAqIGRldiAgICAgICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogZW5jb2RpbmcgIHNlcmlhbCBlbmNvZGluZyBzZXR0aW5nCisgKiBwYXJpdHkgICAgRkNTIHNldHRpbmcKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywKKwkJCSAgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICBuZXdfZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgbmV3X2NyY3R5cGU7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChlbmNvZGluZykKKwl7CisJY2FzZSBFTkNPRElOR19OUlo6ICAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWjsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19OUlpJOiAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzogICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6ICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX01BTkNIRVNURVI6IG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwYXJpdHkpCisJeworCWNhc2UgUEFSSVRZX05PTkU6ICAgICAgICAgICAgbmV3X2NyY3R5cGUgPSBIRExDX0NSQ19OT05FOyBicmVhazsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ6IG5ld19jcmN0eXBlID0gSERMQ19DUkNfMTZfQ0NJVFQ7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18zMl9DQ0lUVDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mby0+cGFyYW1zLmVuY29kaW5nID0gbmV3X2VuY29kaW5nOworCWluZm8tPnBhcmFtcy5jcmNfdHlwZSA9IG5ld19jcmN0eXBlOzsKKworCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB0byBzZW5kIGZyYW1lCisgKgorICogc2tiICBzb2NrZXQgYnVmZmVyIGNvbnRhaW5pbmcgSERMQyBmcmFtZQorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoS0VSTl9JTkZPICIlczpoZGxjX3htaXQoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiBzdG9wIHNlbmRpbmcgdW50aWwgdGhpcyBmcmFtZSBjb21wbGV0ZXMgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBjb3B5IGRhdGEgdG8gZGV2aWNlIGJ1ZmZlcnMgKi8KKwltZW1jcHkoaW5mby0+dHhfYnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpbmZvLT50eF9nZXQgPSAwOworCWluZm8tPnR4X3B1dCA9IGluZm8tPnR4X2NvdW50ID0gc2tiLT5sZW47CisKKwkvKiB1cGRhdGUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBkb25lIHdpdGggc29ja2V0IGJ1ZmZlciwgc28gZnJlZSBpdCAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIHNhdmUgc3RhcnQgdGltZSBmb3IgdHJhbnNtaXQgdGltZW91dCBkZXRlY3Rpb24gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIHN0YXJ0IGhhcmR3YXJlIHRyYW5zbWl0dGVyIGlmIG5lY2Vzc2FyeSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkgCXR4X3N0YXJ0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiBpbnRlcmZhY2UgZW5hYmxlZAorICogY2xhaW0gcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIGhhcmR3YXJlCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfb3BlbiglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBvcGVuIHByb2Nlc3NpbmcgKi8KKwlpZiAoKHJjID0gaGRsY19vcGVuKGRldikpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBhcmJpdHJhdGUgYmV0d2VlbiBuZXR3b3JrIGFuZCB0dHkgb3BlbnMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5jb3VudCAhPSAwIHx8IGluZm8tPm5ldGNvdW50ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhkbGNfb3BlbiByZXR1cm5pbmcgYnVzeVxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpbmZvLT5uZXRjb3VudD0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCS8qIGNsYWltIHJlc291cmNlcyBhbmQgaW5pdCBhZGFwdGVyICovCisJaWYgKChyYyA9IHN0YXJ0dXAoaW5mbykpICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJaW5mby0+bmV0Y291bnQ9MDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogYXNzZXJ0IERUUiBhbmQgUlRTLCBhcHBseSBoYXJkd2FyZSBzZXR0aW5ncyAqLworCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworCisJLyogZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogaW5mb3JtIGdlbmVyaWMgSERMQyBsYXllciBvZiBjdXJyZW50IERDRCBzdGF0dXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gaW50ZXJmYWNlIGlzIGRpc2FibGVkCisgKiBzaHV0ZG93biBoYXJkd2FyZSBhbmQgcmVsZWFzZSByZXNvdXJjZXMKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9jbG9zZSglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHNodXRkb3duIGFkYXB0ZXIgYW5kIHJlbGVhc2UgcmVzb3VyY2VzICovCisJc2h1dGRvd24oaW5mbyk7CisKKwloZGxjX2Nsb3NlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWluZm8tPm5ldGNvdW50PTA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgdG8gcHJvY2VzcyBJT0NUTCBjYWxsIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogaWZyICBwb2ludGVyIHRvIG5ldHdvcmsgaW50ZXJmYWNlIHJlcXVlc3Qgc3RydWN0dXJlCisgKiBjbWQgIElPQ1RMIGNvbW1hbmQgY29kZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIG5ld19saW5lOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIF9fdXNlciAqbGluZSA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmM7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfaW9jdGwoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6IC8qIHJldHVybiBjdXJyZW50IHN5bmNfc2VyaWFsX3NldHRpbmdzICovCisKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1NZTkNfU0VSSUFMOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKworCQlmbGFncyA9IGluZm8tPnBhcmFtcy5mbGFncyAmIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOworCisJCXN3aXRjaCAoZmxhZ3MpeworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfVFhDUElOKTogbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkcpOiAgICBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWElOVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfVFhGUk9NUlg7IGJyZWFrOworCQlkZWZhdWx0OiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfREVGQVVMVDsKKwkJfQorCisJCW5ld19saW5lLmNsb2NrX3JhdGUgPSBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQ7CisJCW5ld19saW5lLmxvb3BiYWNrICAgPSBpbmZvLT5wYXJhbXMubG9vcGJhY2sgPyAxOjA7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmbmV3X2xpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDogLyogc2V0IHN5bmNfc2VyaWFsX3NldHRpbmdzICovCisKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19saW5lLCBsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAobmV3X2xpbmUuY2xvY2tfdHlwZSkKKwkJeworCQljYXNlIENMT0NLX0VYVDogICAgICBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU47IGJyZWFrOworCQljYXNlIENMT0NLX1RYRlJPTVJYOiBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19SWENQSU47IGJyZWFrOworCQljYXNlIENMT0NLX0lOVDogICAgICBmbGFncyA9IEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkc7ICAgIGJyZWFrOworCQljYXNlIENMT0NLX1RYSU5UOiAgICBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19CUkc7ICAgIGJyZWFrOworCQljYXNlIENMT0NLX0RFRkFVTFQ6ICBmbGFncyA9IGluZm8tPnBhcmFtcy5mbGFncyAmCisJCQkJCSAgICAgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7IGJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChuZXdfbGluZS5sb29wYmFjayAhPSAwICYmIG5ld19saW5lLmxvb3BiYWNrICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpbmZvLT5wYXJhbXMuZmxhZ3MgJj0gfihIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCUhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQlIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCUhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOworCQlpbmZvLT5wYXJhbXMuZmxhZ3MgfD0gZmxhZ3M7CisKKwkJaW5mby0+cGFyYW1zLmxvb3BiYWNrID0gbmV3X2xpbmUubG9vcGJhY2s7CisKKwkJaWYgKGZsYWdzICYgKEhETENfRkxBR19SWENfQlJHIHwgSERMQ19GTEFHX1RYQ19CUkcpKQorCQkJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gbmV3X2xpbmUuY2xvY2tfcmF0ZTsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gMDsKKworCQkvKiBpZiBuZXR3b3JrIGludGVyZmFjZSB1cCwgcmVwcm9ncmFtIGhhcmR3YXJlICovCisJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIHRyYW5zbWl0IHRpbWVvdXQgaXMgZGV0ZWN0ZWQKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoImhkbGNkZXZfdHhfdGltZW91dCglcylcbiIsZGV2LT5uYW1lKTsKKworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl0eF9zdG9wKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gdHJhbnNtaXQgY29tcGxldGVzCisgKiByZWVuYWJsZSBuZXR3b3JrIGxheWVyIHRyYW5zbWl0IGlmIHN0b3BwZWQKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoaW5mby0+bmV0ZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShpbmZvLT5uZXRkZXYpOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gZnJhbWUgcmVjZWl2ZWQKKyAqIHBhc3MgZnJhbWUgdG8gbmV0d29yayBsYXllcgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKiBidWYgICBwb2ludGVyIHRvIGJ1ZmZlciBjb250aWFuaW5nIGZyYW1lIGRhdGEKKyAqIHNpemUgIGNvdW50IG9mIGRhdGEgYnl0ZXMgaW4gYnVmCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoTUdTTFBDX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJoZGxjZGV2X3J4KCVzKVxuIixkZXYtPm5hbWUpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNhbid0IGFsbG9jIHNrYiwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSxidWYsc2l6ZSk7CisKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgaW5mby0+bmV0ZGV2KTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNpemU7CisKKwluZXRpZl9yeChza2IpOworCisJaW5mby0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGFkZGluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBpbml0aWFsaXphdGlvbgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pbml0KE1HU0xQQ19JTkZPICppbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWhkbGNfZGV2aWNlICpoZGxjOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbmV0d29yayBhbmQgSERMQyBsYXllciBvYmplY3RzICovCisKKwlpZiAoIShkZXYgPSBhbGxvY19oZGxjZGV2KGluZm8pKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOmhkbGMgZGV2aWNlIGFsbG9jYXRpb24gZmFpbHVyZVxuIixfX0ZJTEVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZvciBuZXR3b3JrIGxheWVyIHJlcG9ydGluZyBwdXJwb3NlcyBvbmx5ICovCisJZGV2LT5iYXNlX2FkZHIgPSBpbmZvLT5pb19iYXNlOworCWRldi0+aXJxICAgICAgID0gaW5mby0+aXJxX2xldmVsOworCisJLyogbmV0d29yayBsYXllciBjYWxsYmFja3MgYW5kIHNldHRpbmdzICovCisJZGV2LT5kb19pb2N0bCAgICAgICA9IGhkbGNkZXZfaW9jdGw7CisJZGV2LT5vcGVuICAgICAgICAgICA9IGhkbGNkZXZfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgID0gaGRsY2Rldl9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgICAgID0gaGRsY2Rldl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAxMCpIWjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAgID0gNTA7CisKKwkvKiBnZW5lcmljIEhETEMgbGF5ZXIgY2FsbGJhY2tzIGFuZCBzZXR0aW5ncyAqLworCWhkbGMgICAgICAgICA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+YXR0YWNoID0gaGRsY2Rldl9hdHRhY2g7CisJaGRsYy0+eG1pdCAgID0gaGRsY2Rldl94bWl0OworCisJLyogcmVnaXN0ZXIgb2JqZWN0cyB3aXRoIEhETEMgbGF5ZXIgKi8KKwlpZiAoKHJjID0gcmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6dW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgZGV2aWNlXG4iLF9fRklMRV9fKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCWluZm8tPm5ldGRldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIHJlbW92aW5nIGRldmljZSBpbnN0YW5jZQorICogZG8gZ2VuZXJpYyBIRExDIGNsZWFudXAKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X2V4aXQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShpbmZvLT5uZXRkZXYpOworCWZyZWVfbmV0ZGV2KGluZm8tPm5ldGRldik7CisJaW5mby0+bmV0ZGV2ID0gTlVMTDsKK30KKworI2VuZGlmIC8qIENPTkZJR19IRExDICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wcGRldi5jIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkYTA3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wcGRldi5jCkBAIC0wLDAgKzEsODI0IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3BwZGV2LmMKKyAqCisgKiBUaGlzIGlzIHRoZSBjb2RlIGJlaGluZCAvZGV2L3BhcnBvcnQqIC0tIGl0IGFsbG93cyBhIHVzZXItc3BhY2UKKyAqIGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUgcGFycG9ydCBzdWJzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIDIwMDIgVGltIFdhdWdoIDx0aW1AY3liZXJlbGsubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQSAvZGV2L3BhcnBvcnR4IGRldmljZSBub2RlIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IGRldmljZQorICogb24gcG9ydCAneCcuICBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHBvc3NpYmxlOgorICoKKyAqIG9wZW4JCWRvIG5vdGhpbmcsIHNldCB1cCBkZWZhdWx0IElFRUUgMTI4NCBwcm90b2NvbCB0byBiZSBDT01QQVQKKyAqIGNsb3NlCXJlbGVhc2UgcG9ydCBhbmQgdW5yZWdpc3RlciBkZXZpY2UgKGlmIG5lY2Vzc2FyeSkKKyAqIGlvY3RsCisgKiAgIEVYQ0wJcmVnaXN0ZXIgZGV2aWNlIGV4Y2x1c2l2ZWx5IChtYXkgZmFpbCkKKyAqICAgQ0xBSU0JKHJlZ2lzdGVyIGRldmljZSBmaXJzdCB0aW1lKSBwYXJwb3J0X2NsYWltX29yX2Jsb2NrCisgKiAgIFJFTEVBU0UJcGFycG9ydF9yZWxlYXNlCisgKiAgIFNFVE1PREUJc2V0IHRoZSBJRUVFIDEyODQgcHJvdG9jb2wgdG8gdXNlIGZvciByZWFkL3dyaXRlCisgKiAgIFNFVFBIQVNFCXNldCB0aGUgSUVFRSAxMjg0IHBoYXNlIG9mIGEgcGFydGljdWxhciBtb2RlLiAgTm90IHRvIGJlCisgKiAgICAgICAgICAgICAgY29uZnVzZWQgd2l0aCBpb2N0bChmZCwgU0VUUEhBU0VSLCAmc3R1bikuIDstKQorICogICBEQVRBRElSCWRhdGFfZm9yd2FyZCAvIGRhdGFfcmV2ZXJzZQorICogICBXREFUQQl3cml0ZV9kYXRhCisgKiAgIFJEQVRBCXJlYWRfZGF0YQorICogICBXQ09OVFJPTAl3cml0ZV9jb250cm9sCisgKiAgIFJDT05UUk9MCXJlYWRfY29udHJvbAorICogICBGQ09OVFJPTAlmcm9iX2NvbnRyb2wKKyAqICAgUlNUQVRVUwlyZWFkX3N0YXR1cworICogICBORUdPVAlwYXJwb3J0X25lZ290aWF0ZQorICogICBZSUVMRAlwYXJwb3J0X3lpZWxkX2Jsb2NraW5nCisgKiAgIFdDVExPTklSUQlvbiBpbnRlcnJ1cHQsIHNldCBjb250cm9sIGxpbmVzCisgKiAgIENMUklSUQljbGVhciAoYW5kIHJldHVybikgaW50ZXJydXB0IGNvdW50CisgKiAgIFNFVFRJTUUJc2V0cyBkZXZpY2UgdGltZW91dCAoc3RydWN0IHRpbWV2YWwpCisgKiAgIEdFVFRJTUUJZ2V0cyBkZXZpY2UgdGltZW91dCAoc3RydWN0IHRpbWV2YWwpCisgKiAgIEdFVE1PREVTCWdldHMgaGFyZHdhcmUgc3VwcG9ydGVkIG1vZGVzICh1bnNpZ25lZCBpbnQpCisgKiAgIEdFVE1PREUJZ2V0cyB0aGUgY3VycmVudCBJRUVFMTI4NCBtb2RlCisgKiAgIEdFVFBIQVNFICAgZ2V0cyB0aGUgY3VycmVudCBJRUVFMTI4NCBwaGFzZQorICogICBHRVRGTEFHUyAgIGdldHMgY3VycmVudCAodXNlci12aXNpYmxlKSBmbGFncworICogICBTRVRGTEFHUyAgIHNldHMgY3VycmVudCAodXNlci12aXNpYmxlKSBmbGFncworICogcmVhZC93cml0ZQlyZWFkIG9yIHdyaXRlIGluIGN1cnJlbnQgSUVFRSAxMjg0IHByb3RvY29sCisgKiBzZWxlY3QJd2FpdCBmb3IgaW50ZXJydXB0IChpbiByZWFkZmRzKQorICoKKyAqIENoYW5nZXM6CisgKiBBZGRlZCBTRVRUSU1FL0dFVFRJTUUgaW9jdGwsIEZyZWQgQmFybmVzLCAxOTk5LgorICoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAyMDAwLzA4LzI1CisgKiAtIE9uIGVycm9yLCBjb3B5X2Zyb21fdXNlciBhbmQgY29weV90b191c2VyIGRvIG5vdCByZXR1cm4gLUVGQVVMVCwKKyAqICAgVGhleSByZXR1cm4gdGhlIHBvc2l0aXZlIG51bWJlciBvZiBieXRlcyAqbm90KiBjb3BpZWQgZHVlIHRvIGFkZHJlc3MKKyAqICAgc3BhY2UgZXJyb3JzLgorICoKKyAqIEFkZGVkIEdFVE1PREVTL0dFVE1PREUvR0VUUEhBU0UgaW9jdGxzLCBGcmVkIEJhcm5lcyA8ZnJtYjJAdWtjLmFjLnVrPiwgMDMvMDEvMjAwMS4KKyAqIEFkZGVkIEdFVEZMQUdTL1NFVEZMQUdTIGlvY3RscywgRnJlZCBCYXJuZXMsIDA0LzIwMDEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNkZWZpbmUgUFBfVkVSU0lPTiAicHBkZXY6IHVzZXItc3BhY2UgcGFyYWxsZWwgcG9ydCBkcml2ZXIiCisjZGVmaW5lIENIUkRFViAicHBkZXYiCisKK3N0cnVjdCBwcF9zdHJ1Y3QgeworCXN0cnVjdCBwYXJkZXZpY2UgKiBwZGV2OworCXdhaXRfcXVldWVfaGVhZF90IGlycV93YWl0OworCWF0b21pY190IGlycWM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWludCBpcnFyZXNwb25zZTsKKwl1bnNpZ25lZCBjaGFyIGlycWN0bDsKKwlzdHJ1Y3QgaWVlZTEyODRfaW5mbyBzdGF0ZTsKKwlzdHJ1Y3QgaWVlZTEyODRfaW5mbyBzYXZlZF9zdGF0ZTsKKwlsb25nIGRlZmF1bHRfaW5hY3Rpdml0eTsKK307CisKKy8qIHBwX3N0cnVjdC5mbGFncyBiaXRmaWVsZHMgKi8KKyNkZWZpbmUgUFBfQ0xBSU1FRCAgICAoMTw8MCkKKyNkZWZpbmUgUFBfRVhDTCAgICAgICAoMTw8MSkKKworLyogT3RoZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFBQX0lOVEVSUlVQVF9USU1FT1VUICgxMCAqIEhaKSAvKiAxMHMgKi8KKyNkZWZpbmUgUFBfQlVGRkVSX1NJWkUgMTAyNAorI2RlZmluZSBQQVJERVZJQ0VfTUFYIDgKKworLyogUk9VTkRfVVAgbWFjcm8gZnJvbSBmcy9zZWxlY3QuYyAqLworI2RlZmluZSBST1VORF9VUCh4LHkpICgoKHgpKyh5KS0xKS8oeSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcF9lbmFibGVfaXJxIChzdHJ1Y3QgcHBfc3RydWN0ICpwcCkKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IHBwLT5wZGV2LT5wb3J0OworCXBvcnQtPm9wcy0+ZW5hYmxlX2lycSAocG9ydCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwX3JlYWQgKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwKKwkJCWxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICoga2J1ZmZlcjsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCXN0cnVjdCBwYXJwb3J0ICpwcG9ydDsKKwlpbnQgbW9kZTsKKworCWlmICghKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpKSB7CisJCS8qIERvbid0IGhhdmUgdGhlIHBvcnQgY2xhaW1lZCAqLworCQlwcmludGsgKEtFUk5fREVCVUcgQ0hSREVWICIleDogY2xhaW0gdGhlIHBvcnQgZmlyc3RcbiIsCisJCQltaW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRyaXZpYWwgY2FzZS4gKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlrYnVmZmVyID0ga21hbGxvYyhtaW5fdChzaXplX3QsIGNvdW50LCBQUF9CVUZGRVJfU0laRSksIEdGUF9LRVJORUwpOworCWlmICgha2J1ZmZlcikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHBvcnQgPSBwcC0+cGRldi0+cG9ydDsKKwltb2RlID0gcHBvcnQtPmllZWUxMjg0Lm1vZGUgJiB+KElFRUUxMjg0X0RFVklDRUlEIHwgSUVFRTEyODRfQUREUik7CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwKKwkJCSAgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/CisJCQkgICAgIFBBUlBPUlRfSU5BQ1RJVklUWV9PX05PTkJMT0NLIDoKKwkJCSAgICAgcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSk7CisKKwl3aGlsZSAoYnl0ZXNfcmVhZCA9PSAwKSB7CisJCXNzaXplX3QgbmVlZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LCBQUF9CVUZGRVJfU0laRSk7CisKKwkJaWYgKG1vZGUgPT0gSUVFRTEyODRfTU9ERV9FUFApIHsKKwkJCS8qIHZhcmlvdXMgc3BlY2lhbHMgZm9yIEVQUCBtb2RlICovCisJCQlpbnQgZmxhZ3MgPSAwOworCQkJc2l6ZV90ICgqZm4pKHN0cnVjdCBwYXJwb3J0ICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOworCisJCQlpZiAocHAtPmZsYWdzICYgUFBfVzkxMjg0UElDKSB7CisJCQkJZmxhZ3MgfD0gUEFSUE9SVF9XOTEyODRQSUM7CisJCQl9CisJCQlpZiAocHAtPmZsYWdzICYgUFBfRkFTVFJFQUQpIHsKKwkJCQlmbGFncyB8PSBQQVJQT1JUX0VQUF9GQVNUOworCQkJfQorCQkJaWYgKHBwb3J0LT5pZWVlMTI4NC5tb2RlICYgSUVFRTEyODRfQUREUikgeworCQkJCWZuID0gcHBvcnQtPm9wcy0+ZXBwX3JlYWRfYWRkcjsKKwkJCX0gZWxzZSB7CisJCQkJZm4gPSBwcG9ydC0+b3BzLT5lcHBfcmVhZF9kYXRhOworCQkJfQorCQkJYnl0ZXNfcmVhZCA9ICgqZm4pKHBwb3J0LCBrYnVmZmVyLCBuZWVkLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlieXRlc19yZWFkID0gcGFycG9ydF9yZWFkIChwcG9ydCwga2J1ZmZlciwgbmVlZCk7CisJCX0KKworCQlpZiAoYnl0ZXNfcmVhZCAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlieXRlc19yZWFkID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJYnl0ZXNfcmVhZCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCisJcGFycG9ydF9zZXRfdGltZW91dCAocHAtPnBkZXYsIHBwLT5kZWZhdWx0X2luYWN0aXZpdHkpOworCisJaWYgKGJ5dGVzX3JlYWQgPiAwICYmIGNvcHlfdG9fdXNlciAoYnVmLCBrYnVmZmVyLCBieXRlc19yZWFkKSkKKwkJYnl0ZXNfcmVhZCA9IC1FRkFVTFQ7CisKKwlrZnJlZSAoa2J1ZmZlcik7CisJcHBfZW5hYmxlX2lycSAocHApOworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgc3NpemVfdCBwcF93cml0ZSAoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICoga2J1ZmZlcjsKKwlzc2l6ZV90IGJ5dGVzX3dyaXR0ZW4gPSAwOworCXNzaXplX3Qgd3JvdGU7CisJaW50IG1vZGU7CisJc3RydWN0IHBhcnBvcnQgKnBwb3J0OworCisJaWYgKCEocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkpIHsKKwkJLyogRG9uJ3QgaGF2ZSB0aGUgcG9ydCBjbGFpbWVkICovCisJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiBjbGFpbSB0aGUgcG9ydCBmaXJzdFxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa2J1ZmZlciA9IGttYWxsb2MobWluX3Qoc2l6ZV90LCBjb3VudCwgUFBfQlVGRkVSX1NJWkUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtidWZmZXIpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBwb3J0ID0gcHAtPnBkZXYtPnBvcnQ7CisJbW9kZSA9IHBwb3J0LT5pZWVlMTI4NC5tb2RlICYgfihJRUVFMTI4NF9ERVZJQ0VJRCB8IElFRUUxMjg0X0FERFIpOworCisJcGFycG9ydF9zZXRfdGltZW91dCAocHAtPnBkZXYsCisJCQkgICAgIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPworCQkJICAgICBQQVJQT1JUX0lOQUNUSVZJVFlfT19OT05CTE9DSyA6CisJCQkgICAgIHBwLT5kZWZhdWx0X2luYWN0aXZpdHkpOworCisJd2hpbGUgKGJ5dGVzX3dyaXR0ZW4gPCBjb3VudCkgeworCQlzc2l6ZV90IG4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4sIFBQX0JVRkZFUl9TSVpFKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIgKGtidWZmZXIsIGJ1ZiArIGJ5dGVzX3dyaXR0ZW4sIG4pKSB7CisJCQlieXRlc193cml0dGVuID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChwcC0+ZmxhZ3MgJiBQUF9GQVNUV1JJVEUpICYmIChtb2RlID09IElFRUUxMjg0X01PREVfRVBQKSkgeworCQkJLyogZG8gYSBmYXN0IEVQUCB3cml0ZSAqLworCQkJaWYgKHBwb3J0LT5pZWVlMTI4NC5tb2RlICYgSUVFRTEyODRfQUREUikgeworCQkJCXdyb3RlID0gcHBvcnQtPm9wcy0+ZXBwX3dyaXRlX2FkZHIgKHBwb3J0LAorCQkJCQlrYnVmZmVyLCBuLCBQQVJQT1JUX0VQUF9GQVNUKTsKKwkJCX0gZWxzZSB7CisJCQkJd3JvdGUgPSBwcG9ydC0+b3BzLT5lcHBfd3JpdGVfZGF0YSAocHBvcnQsCisJCQkJCWtidWZmZXIsIG4sIFBBUlBPUlRfRVBQX0ZBU1QpOworCQkJfQorCQl9IGVsc2UgeworCQkJd3JvdGUgPSBwYXJwb3J0X3dyaXRlIChwcC0+cGRldi0+cG9ydCwga2J1ZmZlciwgbik7CisJCX0KKworCQlpZiAod3JvdGUgPD0gMCkgeworCQkJaWYgKCFieXRlc193cml0dGVuKSB7CisJCQkJYnl0ZXNfd3JpdHRlbiA9IHdyb3RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlieXRlc193cml0dGVuICs9IHdyb3RlOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJaWYgKCFieXRlc193cml0dGVuKQorCQkJCWJ5dGVzX3dyaXR0ZW4gPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlpZiAoIWJ5dGVzX3dyaXR0ZW4pIHsKKwkJCQlieXRlc193cml0dGVuID0gLUVJTlRSOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwgcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSk7CisKKwlrZnJlZSAoa2J1ZmZlcik7CisJcHBfZW5hYmxlX2lycSAocHApOworCXJldHVybiBieXRlc193cml0dGVuOworfQorCitzdGF0aWMgdm9pZCBwcF9pcnEgKGludCBpcnEsIHZvaWQgKiBwcml2YXRlLCBzdHJ1Y3QgcHRfcmVncyAqIHVudXNlZCkKK3sKKwlzdHJ1Y3QgcHBfc3RydWN0ICogcHAgPSAoc3RydWN0IHBwX3N0cnVjdCAqKSBwcml2YXRlOworCisJaWYgKHBwLT5pcnFyZXNwb25zZSkgeworCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2wgKHBwLT5wZGV2LT5wb3J0LCBwcC0+aXJxY3RsKTsKKwkJcHAtPmlycXJlc3BvbnNlID0gMDsKKwl9CisKKwlhdG9taWNfaW5jICgmcHAtPmlycWMpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnBwLT5pcnFfd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfZGV2aWNlIChpbnQgbWlub3IsIHN0cnVjdCBwcF9zdHJ1Y3QgKnBwKQoreworCXN0cnVjdCBwYXJwb3J0ICpwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UgKiBwZGV2ID0gTlVMTDsKKwljaGFyICpuYW1lOworCWludCBmbDsKKworCW5hbWUgPSBrbWFsbG9jIChzdHJsZW4gKENIUkRFVikgKyAzLCBHRlBfS0VSTkVMKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwcmludGYgKG5hbWUsIENIUkRFViAiJXgiLCBtaW5vcik7CisKKwlwb3J0ID0gcGFycG9ydF9maW5kX251bWJlciAobWlub3IpOworCWlmICghcG9ydCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IG5vIGFzc29jaWF0ZWQgcG9ydCFcbiIsIG5hbWUpOworCQlrZnJlZSAobmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZmwgPSAocHAtPmZsYWdzICYgUFBfRVhDTCkgPyBQQVJQT1JUX0ZMQUdfRVhDTCA6IDA7CisJcGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlIChwb3J0LCBuYW1lLCBOVUxMLAorCQkJCQlOVUxMLCBwcF9pcnEsIGZsLCBwcCk7CisJcGFycG9ydF9wdXRfcG9ydCAocG9ydCk7CisKKwlpZiAoIXBkZXYpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIVxuIiwgbmFtZSk7CisJCWtmcmVlIChuYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwcC0+cGRldiA9IHBkZXY7CisJcHJpbnRrIChLRVJOX0RFQlVHICIlczogcmVnaXN0ZXJlZCBwYXJkZXZpY2VcbiIsIG5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBpZWVlMTI4NF9waGFzZSBpbml0X3BoYXNlIChpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUgJiB+KElFRUUxMjg0X0RFVklDRUlECisJCQkgfCBJRUVFMTI4NF9BRERSKSkgeworCWNhc2UgSUVFRTEyODRfTU9ERV9OSUJCTEU6CisJY2FzZSBJRUVFMTI4NF9NT0RFX0JZVEU6CisJCXJldHVybiBJRUVFMTI4NF9QSF9SRVZfSURMRTsKKwl9CisJcmV0dXJuIElFRUUxMjg0X1BIX0ZXRF9JRExFOworfQorCitzdGF0aWMgaW50IHBwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGFycG9ydCAqIHBvcnQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwkvKiBGaXJzdCBoYW5kbGUgdGhlIGNhc2VzIHRoYXQgZG9uJ3QgdGFrZSBhcmd1bWVudHMuICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQQ0xBSU06CisJICAgIHsKKwkJc3RydWN0IGllZWUxMjg0X2luZm8gKmluZm87CisJCWludCByZXQ7CisKKwkJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYKKwkJCQkiJXg6IHlvdSd2ZSBhbHJlYWR5IGdvdCBpdCFcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogRGVmZXJyZWQgZGV2aWNlIHJlZ2lzdHJhdGlvbi4gKi8KKwkJaWYgKCFwcC0+cGRldikgeworCQkJaW50IGVyciA9IHJlZ2lzdGVyX2RldmljZSAobWlub3IsIHBwKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisKKwkJcmV0ID0gcGFycG9ydF9jbGFpbV9vcl9ibG9jayAocHAtPnBkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcHAtPmZsYWdzIHw9IFBQX0NMQUlNRUQ7CisKKwkJLyogRm9yIGludGVycnVwdC1yZXBvcnRpbmcgdG8gd29yaywgd2UgbmVlZCB0byBiZQorCQkgKiBpbmZvcm1lZCBvZiBlYWNoIGludGVycnVwdC4gKi8KKwkJcHBfZW5hYmxlX2lycSAocHApOworCisJCS8qIFdlIG1heSBuZWVkIHRvIGZpeCB1cCB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKwkJaW5mbyA9ICZwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQ7CisJCXBwLT5zYXZlZF9zdGF0ZS5tb2RlID0gaW5mby0+bW9kZTsKKwkJcHAtPnNhdmVkX3N0YXRlLnBoYXNlID0gaW5mby0+cGhhc2U7CisJCWluZm8tPm1vZGUgPSBwcC0+c3RhdGUubW9kZTsKKwkJaW5mby0+cGhhc2UgPSBwcC0+c3RhdGUucGhhc2U7CisJCXBwLT5kZWZhdWx0X2luYWN0aXZpdHkgPSBwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwgMCk7CisJCXBhcnBvcnRfc2V0X3RpbWVvdXQgKHBwLT5wZGV2LCBwcC0+ZGVmYXVsdF9pbmFjdGl2aXR5KTsKKworCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBFWENMOgorCQlpZiAocHAtPnBkZXYpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiB0b28gbGF0ZSBmb3IgUFBFWENMOyAiCisJCQkJImFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgbWlub3IpOworCQkJaWYgKHBwLT5mbGFncyAmIFBQX0VYQ0wpCisJCQkJLyogQnV0IGl0J3Mgbm90IHJlYWxseSBhbiBlcnJvci4gKi8KKwkJCQlyZXR1cm4gMDsKKwkJCS8qIFRoZXJlJ3Mgbm8gY2hhbmNlIG9mIG1ha2luZyB0aGUgZHJpdmVyIGhhcHB5LiAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBKdXN0IHJlbWVtYmVyIHRvIHJlZ2lzdGVyIHRoZSBkZXZpY2UgZXhjbHVzaXZlbHkKKwkJICogd2hlbiB3ZSBmaW5hbGx5IGRvIHRoZSByZWdpc3RyYXRpb24uICovCisJCXBwLT5mbGFncyB8PSBQUF9FWENMOworCQlyZXR1cm4gMDsKKwljYXNlIFBQU0VUTU9ERToKKwkgICAgeworCQlpbnQgbW9kZTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbW9kZSwgYXJncCwgc2l6ZW9mIChtb2RlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogRklYTUU6IHZhbGlkYXRlIG1vZGUgKi8KKwkJcHAtPnN0YXRlLm1vZGUgPSBtb2RlOworCQlwcC0+c3RhdGUucGhhc2UgPSBpbml0X3BoYXNlIChtb2RlKTsKKworCQlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQkJcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0Lm1vZGUgPSBtb2RlOworCQkJcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0LnBoYXNlID0gcHAtPnN0YXRlLnBoYXNlOworCQl9CisKKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQR0VUTU9ERToKKwkgICAgeworCQlpbnQgbW9kZTsKKworCQlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQkJbW9kZSA9IHBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5tb2RlOworCQl9IGVsc2UgeworCQkJbW9kZSA9IHBwLT5zdGF0ZS5tb2RlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIgKGFyZ3AsICZtb2RlLCBzaXplb2YgKG1vZGUpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQU0VUUEhBU0U6CisJICAgIHsKKwkJaW50IHBoYXNlOworCQlpZiAoY29weV9mcm9tX3VzZXIgKCZwaGFzZSwgYXJncCwgc2l6ZW9mIChwaGFzZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvKiBGSVhNRTogdmFsaWRhdGUgcGhhc2UgKi8KKwkJcHAtPnN0YXRlLnBoYXNlID0gcGhhc2U7CisKKwkJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJCXBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5waGFzZSA9IHBoYXNlOworCQl9CisKKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQR0VUUEhBU0U6CisJICAgIHsKKwkJaW50IHBoYXNlOworCisJCWlmIChwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSB7CisJCQlwaGFzZSA9IHBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5waGFzZTsKKwkJfSBlbHNlIHsKKwkJCXBoYXNlID0gcHAtPnN0YXRlLnBoYXNlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIgKGFyZ3AsICZwaGFzZSwgc2l6ZW9mIChwaGFzZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBHRVRNT0RFUzoKKwkgICAgeworCQl1bnNpZ25lZCBpbnQgbW9kZXM7CisKKwkJcG9ydCA9IHBhcnBvcnRfZmluZF9udW1iZXIgKG1pbm9yKTsKKwkJaWYgKCFwb3J0KQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJbW9kZXMgPSBwb3J0LT5tb2RlczsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJm1vZGVzLCBzaXplb2YgKG1vZGVzKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCSAgICB9CisJY2FzZSBQUFNFVEZMQUdTOgorCSAgICB7CisJCWludCB1ZmxhZ3M7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmdWZsYWdzLCBhcmdwLCBzaXplb2YgKHVmbGFncykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwcC0+ZmxhZ3MgJj0gflBQX0ZMQUdNQVNLOworCQlwcC0+ZmxhZ3MgfD0gKHVmbGFncyAmIFBQX0ZMQUdNQVNLKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQR0VURkxBR1M6CisJICAgIHsKKwkJaW50IHVmbGFnczsKKworCQl1ZmxhZ3MgPSBwcC0+ZmxhZ3MgJiBQUF9GTEFHTUFTSzsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnVmbGFncywgc2l6ZW9mICh1ZmxhZ3MpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CS8qIGVuZCBzd2l0Y2goKSAqLworCisJLyogRXZlcnl0aGluZyBlbHNlIHJlcXVpcmVzIHRoZSBwb3J0IHRvIGJlIGNsYWltZWQsIHNvIGNoZWNrCisJICogdGhhdCBub3cuICovCisJaWYgKChwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiBjbGFpbSB0aGUgcG9ydCBmaXJzdFxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcG9ydCA9IHBwLT5wZGV2LT5wb3J0OworCXN3aXRjaCAoY21kKSB7CisJCXN0cnVjdCBpZWVlMTI4NF9pbmZvICppbmZvOworCQl1bnNpZ25lZCBjaGFyIHJlZzsKKwkJdW5zaWduZWQgY2hhciBtYXNrOworCQlpbnQgbW9kZTsKKwkJaW50IHJldDsKKwkJc3RydWN0IHRpbWV2YWwgcGFyX3RpbWVvdXQ7CisJCWxvbmcgdG9famlmZmllczsKKworCWNhc2UgUFBSU1RBVFVTOgorCQlyZWcgPSBwYXJwb3J0X3JlYWRfc3RhdHVzIChwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJlZywgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFBQUkRBVEE6CisJCXJlZyA9IHBhcnBvcnRfcmVhZF9kYXRhIChwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJlZywgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFBQUkNPTlRST0w6CisJCXJlZyA9IHBhcnBvcnRfcmVhZF9jb250cm9sIChwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJlZywgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFBQWUlFTEQ6CisJCXBhcnBvcnRfeWllbGRfYmxvY2tpbmcgKHBwLT5wZGV2KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQUkVMRUFTRToKKwkJLyogU2F2ZSB0aGUgc3RhdGUgbWFjaGluZSdzIHN0YXRlLiAqLworCQlpbmZvID0gJnBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NDsKKwkJcHAtPnN0YXRlLm1vZGUgPSBpbmZvLT5tb2RlOworCQlwcC0+c3RhdGUucGhhc2UgPSBpbmZvLT5waGFzZTsKKwkJaW5mby0+bW9kZSA9IHBwLT5zYXZlZF9zdGF0ZS5tb2RlOworCQlpbmZvLT5waGFzZSA9IHBwLT5zYXZlZF9zdGF0ZS5waGFzZTsKKwkJcGFycG9ydF9yZWxlYXNlIChwcC0+cGRldik7CisJCXBwLT5mbGFncyAmPSB+UFBfQ0xBSU1FRDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQV0NPTlRST0w6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnJlZywgYXJncCwgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2wgKHBvcnQsIHJlZyk7CisJCXJldHVybiAwOworCisJY2FzZSBQUFdEQVRBOgorCQlpZiAoY29weV9mcm9tX3VzZXIgKCZyZWcsIGFyZ3AsIHNpemVvZiAocmVnKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcGFycG9ydF93cml0ZV9kYXRhIChwb3J0LCByZWcpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBGQ09OVFJPTDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbWFzaywgYXJncCwKKwkJCQkgICAgc2l6ZW9mIChtYXNrKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmcmVnLCAxICsgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGFyZywKKwkJCQkgICAgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwgbWFzaywgcmVnKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQREFUQURJUjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbW9kZSwgYXJncCwgc2l6ZW9mIChtb2RlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG1vZGUpCisJCQlwb3J0LT5vcHMtPmRhdGFfcmV2ZXJzZSAocG9ydCk7CisJCWVsc2UKKwkJCXBvcnQtPm9wcy0+ZGF0YV9mb3J3YXJkIChwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQTkVHT1Q6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJm1vZGUsIGFyZ3AsIHNpemVvZiAobW9kZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN3aXRjaCAoKHJldCA9IHBhcnBvcnRfbmVnb3RpYXRlIChwb3J0LCBtb2RlKSkpIHsKKwkJY2FzZSAwOiBicmVhazsKKwkJY2FzZSAtMTogLyogaGFuZHNoYWtlIGZhaWxlZCwgcGVyaXBoZXJhbCBub3QgSUVFRSAxMjg0ICovCisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCWNhc2UgMTogIC8qIGhhbmRzaGFrZSBzdWNjZWVkZWQsIHBlcmlwaGVyYWwgcmVqZWN0ZWQgbW9kZSAqLworCQkJcmV0ID0gLUVOWElPOworCQkJYnJlYWs7CisJCX0KKwkJcHBfZW5hYmxlX2lycSAocHApOworCQlyZXR1cm4gcmV0OworCisJY2FzZSBQUFdDVExPTklSUToKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmcmVnLCBhcmdwLCBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogUmVtZW1iZXIgd2hhdCB0byBzZXQgdGhlIGNvbnRyb2wgbGluZXMgdG8sIGZvciBuZXh0CisJCSAqIHRpbWUgd2UgZ2V0IGFuIGludGVycnVwdC4gKi8KKwkJcHAtPmlycWN0bCA9IHJlZzsKKwkJcHAtPmlycXJlc3BvbnNlID0gMTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQQ0xSSVJROgorCQlyZXQgPSBhdG9taWNfcmVhZCAoJnBwLT5pcnFjKTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJldCwgc2l6ZW9mIChyZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhdG9taWNfc3ViIChyZXQsICZwcC0+aXJxYyk7CisJCXJldHVybiAwOworCisJY2FzZSBQUFNFVFRJTUU6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnBhcl90aW1lb3V0LCBhcmdwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyogQ29udmVydCB0byBqaWZmaWVzLCBwbGFjZSBpbiBwcC0+cGRldi0+dGltZW91dCAqLworCQlpZiAoKHBhcl90aW1lb3V0LnR2X3NlYyA8IDApIHx8IChwYXJfdGltZW91dC50dl91c2VjIDwgMCkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXRvX2ppZmZpZXMgPSBST1VORF9VUChwYXJfdGltZW91dC50dl91c2VjLCAxMDAwMDAwL0haKTsKKwkJdG9famlmZmllcyArPSBwYXJfdGltZW91dC50dl9zZWMgKiAobG9uZylIWjsKKwkJaWYgKHRvX2ppZmZpZXMgPD0gMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHAtPnBkZXYtPnRpbWVvdXQgPSB0b19qaWZmaWVzOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBHRVRUSU1FOgorCQl0b19qaWZmaWVzID0gcHAtPnBkZXYtPnRpbWVvdXQ7CisJCXBhcl90aW1lb3V0LnR2X3NlYyA9IHRvX2ppZmZpZXMgLyBIWjsKKwkJcGFyX3RpbWVvdXQudHZfdXNlYyA9ICh0b19qaWZmaWVzICUgKGxvbmcpSFopICogKDEwMDAwMDAvSFopOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmcGFyX3RpbWVvdXQsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFViAiJXg6IFdoYXQ/IChjbWQ9MHgleClcbiIsIG1pbm9yLAorCQkJY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogS2VlcCB0aGUgY29tcGlsZXIgaGFwcHkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcF9vcGVuIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHBwX3N0cnVjdCAqcHA7CisKKwlpZiAobWlub3IgPj0gUEFSUE9SVF9NQVgpCisJCXJldHVybiAtRU5YSU87CisKKwlwcCA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IHBwX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmICghcHApCisJCXJldHVybiAtRU5PTUVNOworCisJcHAtPnN0YXRlLm1vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwlwcC0+c3RhdGUucGhhc2UgPSBpbml0X3BoYXNlIChwcC0+c3RhdGUubW9kZSk7CisJcHAtPmZsYWdzID0gMDsKKwlwcC0+aXJxcmVzcG9uc2UgPSAwOworCWF0b21pY19zZXQgKCZwcC0+aXJxYywgMCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJnBwLT5pcnFfd2FpdCk7CisKKwkvKiBEZWZlciB0aGUgYWN0dWFsIGRldmljZSByZWdpc3RyYXRpb24gdW50aWwgdGhlIGZpcnN0IGNsYWltLgorCSAqIFRoYXQgd2F5LCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBkcml2ZXIgd2FudHMgdG8gaGF2ZQorCSAqIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHBvcnQgKFBQRVhDTCkuCisJICovCisJcHAtPnBkZXYgPSBOVUxMOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBfcmVsZWFzZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBwcF9zdHJ1Y3QgKnBwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBjb21wYXRfbmVnb3Q7CisKKwljb21wYXRfbmVnb3QgPSAwOworCWlmICghKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpICYmIHBwLT5wZGV2ICYmCisJICAgIChwcC0+c3RhdGUubW9kZSAhPSBJRUVFMTI4NF9NT0RFX0NPTVBBVCkpIHsKKwkgICAgCXN0cnVjdCBpZWVlMTI4NF9pbmZvICppbmZvOworCisJCS8qIHBhcnBvcnQgcmVsZWFzZWQsIGJ1dCBub3QgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKHBwLT5wZGV2KTsKKwkJcHAtPmZsYWdzIHw9IFBQX0NMQUlNRUQ7CisJCWluZm8gPSAmcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0OworCQlwcC0+c2F2ZWRfc3RhdGUubW9kZSA9IGluZm8tPm1vZGU7CisJCXBwLT5zYXZlZF9zdGF0ZS5waGFzZSA9IGluZm8tPnBoYXNlOworCQlpbmZvLT5tb2RlID0gcHAtPnN0YXRlLm1vZGU7CisJCWluZm8tPnBoYXNlID0gcHAtPnN0YXRlLnBoYXNlOworCQljb21wYXRfbmVnb3QgPSAxOworCX0gZWxzZSBpZiAoKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpICYmIHBwLT5wZGV2ICYmCisJICAgIChwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQubW9kZSAhPSBJRUVFMTI4NF9NT0RFX0NPTVBBVCkpIHsKKwkJY29tcGF0X25lZ290ID0gMjsKKwl9CisJaWYgKGNvbXBhdF9uZWdvdCkgeworCQlwYXJwb3J0X25lZ290aWF0ZSAocHAtPnBkZXYtPnBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFVgorCQkJIiV4OiBuZWdvdGlhdGVkIGJhY2sgdG8gY29tcGF0aWJpbGl0eSBtb2RlIGJlY2F1c2UgIgorCQkJInVzZXItc3BhY2UgZm9yZ290XG4iLCBtaW5vcik7CisJfQorCisJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJc3RydWN0IGllZWUxMjg0X2luZm8gKmluZm87CisKKwkJaW5mbyA9ICZwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQ7CisJCXBwLT5zdGF0ZS5tb2RlID0gaW5mby0+bW9kZTsKKwkJcHAtPnN0YXRlLnBoYXNlID0gaW5mby0+cGhhc2U7CisJCWluZm8tPm1vZGUgPSBwcC0+c2F2ZWRfc3RhdGUubW9kZTsKKwkJaW5mby0+cGhhc2UgPSBwcC0+c2F2ZWRfc3RhdGUucGhhc2U7CisJCXBhcnBvcnRfcmVsZWFzZSAocHAtPnBkZXYpOworCQlpZiAoY29tcGF0X25lZ290ICE9IDEpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiByZWxlYXNlZCBwYXJkZXZpY2UgIgorCQkJCSJiZWNhdXNlIHVzZXItc3BhY2UgZm9yZ290XG4iLCBtaW5vcik7CisJCX0KKwl9CisKKwlpZiAocHAtPnBkZXYpIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHBwLT5wZGV2LT5uYW1lOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlIChwcC0+cGRldik7CisJCWtmcmVlIChuYW1lKTsKKwkJcHAtPnBkZXYgPSBOVUxMOworCQlwcmludGsgKEtFUk5fREVCVUcgQ0hSREVWICIleDogdW5yZWdpc3RlcmVkIHBhcmRldmljZVxuIiwKKwkJCW1pbm9yKTsKKwl9CisKKwlrZnJlZSAocHApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIGhlbGQgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBwX3BvbGwgKHN0cnVjdCBmaWxlICogZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJc3RydWN0IHBwX3N0cnVjdCAqcHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcG9sbF93YWl0IChmaWxlLCAmcHAtPmlycV93YWl0LCB3YWl0KTsKKwlpZiAoYXRvbWljX3JlYWQgKCZwcC0+aXJxYykpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqcHBkZXZfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHBwX3JlYWQsCisJLndyaXRlCQk9IHBwX3dyaXRlLAorCS5wb2xsCQk9IHBwX3BvbGwsCisJLmlvY3RsCQk9IHBwX2lvY3RsLAorCS5vcGVuCQk9IHBwX29wZW4sCisJLnJlbGVhc2UJPSBwcF9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgcHBfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHBwZGV2X2NsYXNzLCBNS0RFVihQUF9NQUpPUiwgcG9ydC0+bnVtYmVyKSwKKwkJCU5VTEwsICJwYXJwb3J0JWQiLCBwb3J0LT5udW1iZXIpOworfQorCitzdGF0aWMgdm9pZCBwcF9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlcikpOworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBwX2RyaXZlciA9IHsKKwkubmFtZQkJPSBDSFJERVYsCisJLmF0dGFjaAkJPSBwcF9hdHRhY2gsCisJLmRldGFjaAkJPSBwcF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGRldl9pbml0ICh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldiAoUFBfTUFKT1IsIENIUkRFViwgJnBwX2ZvcHMpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIENIUkRFViAiOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLAorCQkJUFBfTUFKT1IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHBkZXZfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCBDSFJERVYpOworCWlmIChJU19FUlIocHBkZXZfY2xhc3MpKSB7CisJCWVyciA9IFBUUl9FUlIocHBkZXZfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWRldmZzX21rX2RpcigicGFycG9ydHMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgUEFSUE9SVF9NQVg7IGkrKykgeworCQlkZXZmc19ta19jZGV2KE1LREVWKFBQX01BSk9SLCBpKSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sICJwYXJwb3J0cy8lZCIsIGkpOworCX0KKwlpZiAocGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnBwX2RyaXZlcikpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgQ0hSREVWICI6IHVuYWJsZSB0byByZWdpc3RlciB3aXRoIHBhcnBvcnRcbiIpOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBQUF9WRVJTSU9OICJcbiIpOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJZm9yIChpID0gMDsgaSA8IFBBUlBPUlRfTUFYOyBpKyspCisJCWRldmZzX3JlbW92ZSgicGFycG9ydHMvJWQiLCBpKTsKKwlkZXZmc19yZW1vdmUoInBhcnBvcnRzIik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocHBkZXZfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihQUF9NQUpPUiwgQ0hSREVWKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHBkZXZfY2xlYW51cCAodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBDbGVhbiB1cCBhbGwgcGFycG9ydCBzdHVmZiAqLworCWZvciAoaSA9IDA7IGkgPCBQQVJQT1JUX01BWDsgaSsrKQorCQlkZXZmc19yZW1vdmUoInBhcnBvcnRzLyVkIiwgaSk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcHBfZHJpdmVyKTsKKwlkZXZmc19yZW1vdmUoInBhcnBvcnRzIik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocHBkZXZfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2IChQUF9NQUpPUiwgQ0hSREVWKTsKK30KKworbW9kdWxlX2luaXQocHBkZXZfaW5pdCk7Cittb2R1bGVfZXhpdChwcGRldl9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoUFBfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzI4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL3B0eS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQWRkZWQgc3VwcG9ydCBmb3IgYSBVbml4OTgtc3R5bGUgcHRteCBkZXZpY2UuCisgKiAgICAtLSBDLiBTY290dCBBbmFuaWFuIDxjYW5hbmlhbkBhbHVtbmkucHJpbmNldG9uLmVkdT4sIDE0LUphbi0xOTk4CisgKiAgQWRkZWQgVFRZX0RPX1dSSVRFX1dBS0VVUCB0byBlbmFibGUgbl90dHkgdG8gc2VuZCBQT0xMX09VVCB0bworICogICAgICB3YWl0aW5nIHdyaXRlcnMgLS0gU2FwYW4gQmhhdGlhIDxzYXBhbkBjb3Jld2Fycy5vcmc+CisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIEZvciBFWFBPUlRfU1lNQk9MICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZwdHNfZnMuaD4KKworLyogVGhlc2UgYXJlIGdsb2JhbCBiZWNhdXNlIHRoZXkgYXJlIGFjY2Vzc2VkIGluIHR0eV9pby5jICovCisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCitzdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRzX2RyaXZlcjsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwdHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCWlmICh0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpIHsKKwkJaWYgKHR0eS0+Y291bnQgPiAxKQorCQkJcHJpbnRrKCJtYXN0ZXIgcHR5X2Nsb3NlOiBjb3VudCA9ICVkISFcbiIsIHR0eS0+Y291bnQpOworCX0gZWxzZSB7CisJCWlmICh0dHktPmNvdW50ID4gMikKKwkJCXJldHVybjsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eS0+cGFja2V0ID0gMDsKKwlpZiAoIXR0eS0+bGluaykKKwkJcmV0dXJuOworCXR0eS0+bGluay0+cGFja2V0ID0gMDsKKwlzZXRfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmxpbmstPmZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+d3JpdGVfd2FpdCk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikgeworCQlzZXRfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKTsKKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKKwkJaWYgKHR0eS0+ZHJpdmVyID09IHB0bV9kcml2ZXIpCisJCQlkZXZwdHNfcHR5X2tpbGwodHR5LT5pbmRleCk7CisjZW5kaWYKKwkJdHR5X3ZoYW5ndXAodHR5LT5saW5rKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgdW50aHJvdHRsZSByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIHNpZ25hbAorICogdGhhdCBpdCBjYW4gcmVjZWl2ZSBtb3JlIGNoYXJhY3RlcnMuICBGb3IgUFRZJ3MsIHRoZSBUVFlfVEhST1RUTEVECisgKiBmbGFnIGlzIGFsd2F5cyBzZXQsIHRvIGZvcmNlIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gYWx3YXlzIGNhbGwgdGhlCisgKiB1bnRocm90dGxlIHJvdXRpbmUgd2hlbiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBUVFlfVEhSRVNIT0xEX1VOVEhST1RUTEUgCisgKiBjaGFyYWN0ZXJzIGluIHRoZSBxdWV1ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGVhY2ggdGltZSB0aGlzCisgKiBoYXBwZW5zLCB3ZSBuZWVkIHRvIHdha2UgdXAgYW55IHNsZWVwaW5nIHByb2Nlc3NlcyB0aGF0IGNvdWxkIGJlCisgKiAoMSkgdHJ5aW5nIHRvIHNlbmQgZGF0YSB0byB0aGUgcHR5LCBvciAoMikgd2FpdGluZyBpbiB3YWl0X3VudGlsX3NlbnQoKQorICogZm9yIHRoZSBwdHkgYnVmZmVyIHRvIGJlIGRyYWluZWQuCisgKi8KK3N0YXRpYyB2b2lkIHB0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICpvX3R0eSA9IHR0eS0+bGluazsKKworCWlmICghb190dHkpCisJCXJldHVybjsKKworCXR0eV93YWtldXAob190dHkpOworCXNldF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpOworfQorCisvKgorICogV1NIIDA1LzI0Lzk3OiBtb2RpZmllZCB0byAKKyAqICAgKDEpIHVzZSBzcGFjZSBpbiB0dHktPmZsaXAgaW5zdGVhZCBvZiBhIHNoYXJlZCB0ZW1wIGJ1ZmZlcgorICoJIFRoZSBmbGlwIGJ1ZmZlcnMgYXJlbid0IGJlaW5nIHVzZWQgZm9yIGEgcHR5LCBzbyB0aGVyZSdzIGxvdHMKKyAqCSBvZiBzcGFjZSBhdmFpbGFibGUuICBUaGUgYnVmZmVyIGlzIHByb3RlY3RlZCBieSBhIHBlci1wdHkKKyAqCSBzZW1hcGhvcmUgdGhhdCBzaG91bGQgYWxtb3N0IG5ldmVyIGNvbWUgdW5kZXIgY29udGVudGlvbi4KKyAqICAgKDIpIGF2b2lkIHJlZHVuZGFudCBjb3B5aW5nIGZvciBjYXNlcyB3aGVyZSBjb3VudCA+PiByZWNlaXZlX3Jvb20KKyAqIE4uQi4gQ2FsbHMgZnJvbSB1c2VyIHNwYWNlIG1heSBub3cgcmV0dXJuIGFuIGVycm9yIGNvZGUgaW5zdGVhZCBvZgorICogYSBjb3VudC4KKyAqCisgKiBGSVhNRTogT3VyIHB0eV93cml0ZSBtZXRob2QgaXMgY2FsbGVkIHdpdGggb3VyIGxkaXNjIGxvY2sgaGVsZCBidXQKKyAqIG5vdCBvdXIgcGFydG5lcnMuIFdlIGNhbid0IGp1c3QgdGFrZSB0aGUgb3RoZXIgb25lIGJsaW5kbHkgd2l0aG91dAorICogcmlza2luZyBkZWFkbG9ja3MuICBUaGVyZSBpcyBhbHNvIHRoZSBzbWFsbCBtYXR0ZXIgb2YgVFRZX0RPTlRfRkxJUAorICovCitzdGF0aWMgaW50IHB0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRvID0gdHR5LT5saW5rOworCWludAljOworCisJaWYgKCF0byB8fCB0dHktPnN0b3BwZWQpCisJCXJldHVybiAwOworCisJYyA9IHRvLT5sZGlzYy5yZWNlaXZlX3Jvb20odG8pOworCWlmIChjID4gY291bnQpCisJCWMgPSBjb3VudDsKKwl0by0+bGRpc2MucmVjZWl2ZV9idWYodG8sIGJ1ZiwgTlVMTCwgYyk7CisJCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgcHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdG8gPSB0dHktPmxpbms7CisKKwlpZiAoIXRvIHx8IHR0eS0+c3RvcHBlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdG8tPmxkaXNjLnJlY2VpdmVfcm9vbSh0byk7Cit9CisKKy8qCisgKglXU0ggMDUvMjQvOTc6ICBNb2RpZmllZCBmb3IgYXN5bW1ldHJpYyBNQVNURVIvU0xBVkUgYmVoYXZpb3IKKyAqCVRoZSBjaGFyc19pbl9idWZmZXIoKSB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBsZGlzYyBzZWxlY3QoKSBmdW5jdGlvbiAKKyAqCXRvIGhvbGQgb2ZmIHdyaXRpbmcgd2hlbiBjaGFyc19pbl9idWZmZXIgPiBXQUtFVVBfQ0hBUlMgKD09IDI1NikuCisgKglUaGUgcHR5IGRyaXZlciBjaGFyc19pbl9idWZmZXIoKSBNYXN0ZXIvU2xhdmUgbXVzdCBiZWhhdmUgZGlmZmVyZW50bHk6CisgKgorICogICAgICBUaGUgTWFzdGVyIHNpZGUgbmVlZHMgdG8gYWxsb3cgdHlwZWQtYWhlYWQgY29tbWFuZHMgdG8gYWNjdW11bGF0ZQorICogICAgICB3aGlsZSBiZWluZyBjYW5vbmljYWxpemVkLCBzbyB3ZSByZXBvcnQgIm91ciBidWZmZXIiIGFzIGVtcHR5IHVudGlsCisgKglzb21lIHRocmVzaG9sZCBpcyByZWFjaGVkLCBhbmQgdGhlbiByZXBvcnQgdGhlIGNvdW50LiAoQW55IGNvdW50ID4KKyAqCVdBS0VVUF9DSEFSUyBpcyByZWdhcmRlZCBieSBzZWxlY3QoKSBhcyAiZnVsbCIuKSAgVG8gYXZvaWQgZGVhZGxvY2sgCisgKgl0aGUgY291bnQgcmV0dXJuZWQgbXVzdCBiZSAwIGlmIG5vIGNhbm9uaWNhbCBkYXRhIGlzIGF2YWlsYWJsZSB0byBiZSAKKyAqCXJlYWQuIChUaGUgTl9UVFkgbGRpc2MuY2hhcnNfaW5fYnVmZmVyIG5vdyBrbm93cyB0aGlzLikKKyAqICAKKyAqCVRoZSBTbGF2ZSBzaWRlIHBhc3NlcyBhbGwgY2hhcmFjdGVycyBpbiByYXcgbW9kZSB0byB0aGUgTWFzdGVyIHNpZGUncworICoJYnVmZmVyIHdoZXJlIHRoZXkgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHksIHNvIGluIHRoaXMgY2FzZSB3ZSBjYW4KKyAqCXJldHVybiB0aGUgdHJ1ZSBjb3VudCBpbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHB0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdG8gPSB0dHktPmxpbms7CisJc3NpemVfdCAoKmNoYXJzX2luX2J1ZmZlcikoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CisJaW50IGNvdW50OworCisJLyogV2Ugc2hvdWxkIGdldCB0aGUgbGluZSBkaXNjaXBsaW5lIGxvY2sgZm9yICJ0dHktPmxpbmsiICovCisJaWYgKCF0byB8fCAhKGNoYXJzX2luX2J1ZmZlciA9IHRvLT5sZGlzYy5jaGFyc19pbl9idWZmZXIpKQorCQlyZXR1cm4gMDsKKworCS8qIFRoZSBsZGlzYyBtdXN0IHJlcG9ydCAwIGlmIG5vIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KKwljb3VudCA9IGNoYXJzX2luX2J1ZmZlcih0byk7CisKKwlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUpIHJldHVybiBjb3VudDsKKworCS8qIE1hc3RlciBzaWRlIGRyaXZlciAuLi4gaWYgdGhlIG90aGVyIHNpZGUncyByZWFkIGJ1ZmZlciBpcyBsZXNzIHRoYW4gCisJICogaGFsZiBmdWxsLCByZXR1cm4gMCB0byBhbGxvdyB3cml0ZXJzIHRvIHByb2NlZWQ7IG90aGVyd2lzZSByZXR1cm4KKwkgKiB0aGUgY291bnQuICBUaGlzIGxlYXZlcyBhIGNvbWZvcnRhYmxlIG1hcmdpbiB0byBhdm9pZCBvdmVyZmxvdywgCisJICogYW5kIHN0aWxsIGFsbG93cyBoYWxmIGEgYnVmZmVyJ3Mgd29ydGggb2YgdHlwZWQtYWhlYWQgY29tbWFuZHMuCisJICovCisJcmV0dXJuICgoY291bnQgPCBOX1RUWV9CVUZfU0laRS8yKSA/IDAgOiBjb3VudCk7Cit9CisKKy8qIFNldCB0aGUgbG9jayBmbGFnIG9uIGEgcHR5ICovCitzdGF0aWMgaW50IHB0eV9zZXRfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICogYXJnKQoreworCWludCB2YWw7CisJaWYgKGdldF91c2VyKHZhbCxhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodmFsKQorCQlzZXRfYml0KFRUWV9QVFlfTE9DSywgJnR0eS0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KFRUWV9QVFlfTE9DSywgJnR0eS0+ZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRvID0gdHR5LT5saW5rOworCQorCWlmICghdG8pCisJCXJldHVybjsKKwkKKwlpZiAodG8tPmxkaXNjLmZsdXNoX2J1ZmZlcikKKwkJdG8tPmxkaXNjLmZsdXNoX2J1ZmZlcih0byk7CisJCisJaWYgKHRvLT5wYWNrZXQpIHsKKwkJdHR5LT5jdHJsX3N0YXR1cyB8PSBUSU9DUEtUX0ZMVVNIV1JJVEU7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdG8tPnJlYWRfd2FpdCk7CisJfQorfQorCitzdGF0aWMgaW50IHB0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQJcmV0dmFsID0gLUVOT0RFVjsKKworCWlmICghdHR5IHx8ICF0dHktPmxpbmspCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQorCQlnb3RvIG91dDsKKwlpZiAodGVzdF9iaXQoVFRZX1BUWV9MT0NLLCAmdHR5LT5saW5rLT5mbGFncykpCisJCWdvdG8gb3V0OworCWlmICh0dHktPmxpbmstPmNvdW50ICE9IDEpCisJCWdvdG8gb3V0OworCisJY2xlYXJfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmxpbmstPmZsYWdzKTsKKwlzZXRfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKTsKKwlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHB0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisgICAgICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+KENTSVpFIHwgUEFSRU5CKTsKKyAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChDUzggfCBDUkVBRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcHR5X29wcyA9IHsKKwkub3BlbiA9IHB0eV9vcGVuLAorCS5jbG9zZSA9IHB0eV9jbG9zZSwKKwkud3JpdGUgPSBwdHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBwdHlfd3JpdGVfcm9vbSwKKwkuZmx1c2hfYnVmZmVyID0gcHR5X2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcHR5X2NoYXJzX2luX2J1ZmZlciwKKwkudW50aHJvdHRsZSA9IHB0eV91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHB0eV9zZXRfdGVybWlvcywKK307CisKKy8qIFRyYWRpdGlvbmFsIEJTRCBkZXZpY2VzICovCisjaWZkZWYgQ09ORklHX0xFR0FDWV9QVFlTCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnB0eV9kcml2ZXIsICpwdHlfc2xhdmVfZHJpdmVyOworCitzdGF0aWMgaW50IHB0eV9ic2RfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NTUFRMQ0s6IC8qIFNldCBQVCBMb2NrIChkaXNhbGxvdyBzbGF2ZSBvcGVuKSAqLworCQlyZXR1cm4gcHR5X3NldF9sb2NrKHR0eSwgKGludCBfX3VzZXIgKikgYXJnKTsKKwl9CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxlZ2FjeV9wdHlfaW5pdCh2b2lkKQoreworCisJcHR5X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfUFRZUyk7CisJaWYgKCFwdHlfZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgcHR5IGRyaXZlciIpOworCisJcHR5X3NsYXZlX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfUFRZUyk7CisJaWYgKCFwdHlfc2xhdmVfZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgcHR5IHNsYXZlIGRyaXZlciIpOworCisJcHR5X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwdHlfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJwdHlfbWFzdGVyIjsKKwlwdHlfZHJpdmVyLT5uYW1lID0gInB0eSI7CisJcHR5X2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJwdHkvbSI7CisJcHR5X2RyaXZlci0+bWFqb3IgPSBQVFlfTUFTVEVSX01BSk9SOworCXB0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwdHlfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1BUWTsKKwlwdHlfZHJpdmVyLT5zdWJ0eXBlID0gUFRZX1RZUEVfTUFTVEVSOworCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJcHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQ7CisJcHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXB0eV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwgVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwlwdHlfZHJpdmVyLT5vdGhlciA9IHB0eV9zbGF2ZV9kcml2ZXI7CisJdHR5X3NldF9vcGVyYXRpb25zKHB0eV9kcml2ZXIsICZwdHlfb3BzKTsKKwlwdHlfZHJpdmVyLT5pb2N0bCA9IHB0eV9ic2RfaW9jdGw7CisKKwlwdHlfc2xhdmVfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXB0eV9zbGF2ZV9kcml2ZXItPmRyaXZlcl9uYW1lID0gInB0eV9zbGF2ZSI7CisJcHR5X3NsYXZlX2RyaXZlci0+bmFtZSA9ICJ0dHlwIjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5kZXZmc19uYW1lID0gInB0eS9zIjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5tYWpvciA9IFBUWV9TTEFWRV9NQUpPUjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJcHR5X3NsYXZlX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9QVFk7CisJcHR5X3NsYXZlX2RyaXZlci0+c3VidHlwZSA9IFBUWV9UWVBFX1NMQVZFOworCXB0eV9zbGF2ZV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdHlfc2xhdmVfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEOworCXB0eV9zbGF2ZV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwKKwkJCQkJVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwlwdHlfc2xhdmVfZHJpdmVyLT5vdGhlciA9IHB0eV9kcml2ZXI7CisJdHR5X3NldF9vcGVyYXRpb25zKHB0eV9zbGF2ZV9kcml2ZXIsICZwdHlfb3BzKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0eV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgcHR5IGRyaXZlciIpOworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0eV9zbGF2ZV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgcHR5IHNsYXZlIGRyaXZlciIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWdhY3lfcHR5X2luaXQodm9pZCkgeyB9CisjZW5kaWYKKworLyogVW5peDk4IGRldmljZXMgKi8KKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKKy8qCisgKiBzeXNjdGwgc3VwcG9ydCBmb3Igc2V0dGluZyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBVbml4OTggcHR5cyBhbGxvY2F0ZWQuCisgKiBPdGhlcndpc2Ugb25lIGNhbiBlYXQgdXAgYWxsIGtlcm5lbCBtZW1vcnkgYnkgb3BlbmluZyAvZGV2L3B0bXggcmVwZWF0ZWRseS4KKyAqLworaW50IHB0eV9saW1pdCA9IE5SX1VOSVg5OF9QVFlfREVGQVVMVDsKK3N0YXRpYyBpbnQgcHR5X2xpbWl0X21pbiA9IDA7CitzdGF0aWMgaW50IHB0eV9saW1pdF9tYXggPSBOUl9VTklYOThfUFRZX01BWDsKKworY3RsX3RhYmxlIHB0eV90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gUFRZX01BWCwKKwkJLnByb2NuYW1lCT0gIm1heCIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5kYXRhCQk9ICZwdHlfbGltaXQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZwdHlfbGltaXRfbWluLAorCQkuZXh0cmEyCQk9ICZwdHlfbGltaXRfbWF4LAorCX0sIHsKKwkJLmN0bF9uYW1lCT0gUFRZX05SLAorCQkucHJvY25hbWUJPSAibnIiLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwgeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKworc3RhdGljIGludCBwdHlfdW5peDk4X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DU1BUTENLOiAvKiBTZXQgUFQgTG9jayAoZGlzYWxsb3cgc2xhdmUgb3BlbikgKi8KKwkJcmV0dXJuIHB0eV9zZXRfbG9jayh0dHksIChpbnQgX191c2VyICopYXJnKTsKKwljYXNlIFRJT0NHUFROOiAvKiBHZXQgUFQgTnVtYmVyICovCisJCXJldHVybiBwdXRfdXNlcih0dHktPmluZGV4LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHVuaXg5OF9wdHlfaW5pdCh2b2lkKQoreworCWRldmZzX21rX2RpcigicHRzIik7CisJcHRtX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfVU5JWDk4X1BUWV9NQVgpOworCWlmICghcHRtX2RyaXZlcikKKwkJcGFuaWMoIkNvdWxkbid0IGFsbG9jYXRlIFVuaXg5OCBwdG0gZHJpdmVyIik7CisJcHRzX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfVU5JWDk4X1BUWV9NQVgpOworCWlmICghcHRzX2RyaXZlcikKKwkJcGFuaWMoIkNvdWxkbid0IGFsbG9jYXRlIFVuaXg5OCBwdHMgZHJpdmVyIik7CisKKwlwdG1fZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXB0bV9kcml2ZXItPmRyaXZlcl9uYW1lID0gInB0eV9tYXN0ZXIiOworCXB0bV9kcml2ZXItPm5hbWUgPSAicHRtIjsKKwlwdG1fZHJpdmVyLT5tYWpvciA9IFVOSVg5OF9QVFlfTUFTVEVSX01BSk9SOworCXB0bV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwdG1fZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1BUWTsKKwlwdG1fZHJpdmVyLT5zdWJ0eXBlID0gUFRZX1RZUEVfTUFTVEVSOworCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJcHRtX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQ7CisJcHRtX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXB0bV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwgVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCVRUWV9EUklWRVJfTk9fREVWRlMgfCBUVFlfRFJJVkVSX0RFVlBUU19NRU07CisJcHRtX2RyaXZlci0+b3RoZXIgPSBwdHNfZHJpdmVyOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwdG1fZHJpdmVyLCAmcHR5X29wcyk7CisJcHRtX2RyaXZlci0+aW9jdGwgPSBwdHlfdW5peDk4X2lvY3RsOworCisJcHRzX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwdHNfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJwdHlfc2xhdmUiOworCXB0c19kcml2ZXItPm5hbWUgPSAicHRzIjsKKwlwdHNfZHJpdmVyLT5tYWpvciA9IFVOSVg5OF9QVFlfU0xBVkVfTUFKT1I7CisJcHRzX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXB0c19kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfUFRZOworCXB0c19kcml2ZXItPnN1YnR5cGUgPSBQVFlfVFlQRV9TTEFWRTsKKwlwdHNfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcHRzX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCMzg0MDAgfCBDUzggfCBDUkVBRDsKKwlwdHNfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVcgfAorCQlUVFlfRFJJVkVSX05PX0RFVkZTIHwgVFRZX0RSSVZFUl9ERVZQVFNfTUVNOworCXB0c19kcml2ZXItPm90aGVyID0gcHRtX2RyaXZlcjsKKwl0dHlfc2V0X29wZXJhdGlvbnMocHRzX2RyaXZlciwgJnB0eV9vcHMpOworCQorCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0bV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgVW5peDk4IHB0bSBkcml2ZXIiKTsKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwdHNfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIFVuaXg5OCBwdHMgZHJpdmVyIik7CisKKwlwdHlfdGFibGVbMV0uZGF0YSA9ICZwdG1fZHJpdmVyLT5yZWZjb3VudDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdW5peDk4X3B0eV9pbml0KHZvaWQpIHsgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHB0eV9pbml0KHZvaWQpCit7CisJbGVnYWN5X3B0eV9pbml0KCk7CisJdW5peDk4X3B0eV9pbml0KCk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChwdHlfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcXRyb25peC5jIGIvZHJpdmVycy9jaGFyL3F0cm9uaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGEzY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3F0cm9uaXguYwpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqCVF0cm9uaXggOTkwUCBpbmZyYXJlZCBrZXlib2FyZCBkcml2ZXIuCisgKgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqCisgKiAgVGhlIGJvdHRvbSBwb3J0aW9uIG9mIHRoaXMgZHJpdmVyIHdhcyB0YWtlIGZyb20gCisgKiAgcGNfa2V5Yi5jICBQbGVhc2Ugc2VlIHRoYXQgZmlsZSBmb3IgY29weXJpZ2h0cy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiAKKyAqIE5PVEU6ICAKKyAqCisgKglUaGlzIGRyaXZlciBoYXMgb25seSBiZWVuIHRlc3RlZCB3aXRoIHRoZSBDb25zdW1lciBJUgorICoJcG9ydCBvZiB0aGUgSVRFIDgxNzIgc3lzdGVtIGNvbnRyb2xsZXIuCisgKgorICoJWW91IGRvIG5vdCBuZWVkIHRoaXMgZHJpdmVyIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHBzLzIgb3IKKyAqCVVTQiBhZGFwdGVyIHRoYXQgdGhlIGtleWJvYXJkIHNoaXBzIHdpdGguICBZb3Ugb25seSBuZWVkIAorICoJdGhpcyBkcml2ZXIgaWYgeW91ciBib2FyZCBoYXMgYSBJUiBwb3J0IGFuZCB0aGUga2V5Ym9hcmQKKyAqCWRhdGEgaXMgYmVpbmcgc2VudCBkaXJlY3RseSB0byB0aGUgSVIuICBJbiB0aGF0IGNhc2UsCisgKgl5b3UgYWxzbyBuZWVkIHNvbWUgbG93LWxldmVsIElSIHN1cHBvcnQuIFNlZSBpdDgxNzJfY2lyLmMuCisgKgkKKyAqLworCisjaWZkZWYgQ09ORklHX1FUUk9OSVhfS0VZQk9BUkQKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vaXQ4MTcyL2l0ODE3Mi5oPgorI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyX2ludC5oPgorI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyX2Npci5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjX2tleWIuaD4KKworI2luY2x1ZGUgPGFzbS9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBsZWFkaW5nMSAwCisjZGVmaW5lIGxlYWRpbmcyIDB4RgorCisjZGVmaW5lIEtCRF9DSVJfUE9SVCAwCisjZGVmaW5lIEFVWF9SRUNPTk5FQ1QgMTcwIC8qIHNjYW5jb2RlIHdoZW4gcHMyIGRldmljZSBpcyBwbHVnZ2VkIChiYWNrKSBpbiAqLworCitzdGF0aWMgaW50IGRhdGFfaW5kZXg7CitzdHJ1Y3QgY2lyX3BvcnQgKmNpcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZGJ5dGVzWzVdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2lyX2RhdGFbMzJdOyAvKiB3ZSBvbmx5IG5lZWQgMTYgY2hhcnMgKi8KKworc3RhdGljIHZvaWQga2JkX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBoYW5kbGVfZGF0YSh1bnNpZ25lZCBjaGFyICpwX2RhdGEpOworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9tb3VzZV9ldmVudCh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfa2V5Ym9hcmRfZXZlbnQodW5zaWduZWQgY2hhciBzY2FuY29kZSwgaW50IGRvd24pOworc3RhdGljIGludCBfX2luaXQgcHNhdXhfaW5pdCh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBhdXhfcXVldWUgKnF1ZXVlOwkvKiBNb3VzZSBkYXRhIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgYXV4X2NvdW50ID0gMDsKKworLyoKKyAqIEtleXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgJ0ZuJyBrZXkKKyAqIFRoZSBGbiBrZXkgZG9lcyBub3QgcHJvZHVjZSBhIGtleS11cCBzZXF1ZW5jZS4gU28sIHRoZSBmaXJzdAorICogdGltZSB0aGUgdXNlciBwcmVzc2VzIGl0LCBpdCB3aWxsIGJlIGtleS1kb3duIGV2ZW50LiBUaGUga2V5CisgKiBzdGF5cyBkb3duIHVudGlsIHRoZSB1c2VyIHByZXNzZXMgaXQgYWdhaW4uCisgKi8KKyNkZWZpbmUgTlVNX0ZOX0tFWVMgNTYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZuX2tleXNbTlVNX0ZOX0tFWVNdID0geworCTAsMCwwLDAsMCwwLDAsMCwgICAgICAgIC8qIDAgNyAgICovCisJOCw5LDEwLDkzLDAsMCwwLDAsICAgICAgLyogOCAxNSAgKi8KKwkwLDAsMCwwLDAsMCwwLDUsICAgICAgICAvKiAxNiAyMyAqLworCTYsNyw5MSwwLDAsMCwwLDAsICAgICAgIC8qIDI0IDMxICovCisJMCwwLDAsMCwwLDIsMyw0LCAgICAgICAgLyogMzIgMzkgKi8KKwk5MiwwLDAsMCwwLDAsMCwwLCAgICAgICAvKiA0MCA0NyAqLworCTAsMCwwLDAsMTEsMCw5NCw5NSAgICAgICAgLyogNDggNTUgKi8KKworfTsKKwordm9pZCBfX2luaXQgaW5pdF9xdHJvbml4Xzk5MFBfa2JkKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWNpciA9IChzdHJ1Y3QgY2lyX3BvcnQgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lyX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNpcikgeworCQlwcmludGsoIlVuYWJsZSB0byBpbml0aWFsaXplIFF0cm9uaXgga2V5Ym9hcmRcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogCisJICogcmV2aXNpdAorCSAqIHRoaXMgc2hvdWxkIGJlIHByb2dyYW1tYWJsZSwgc29tZWhvdyBieSB0aGUsIGJ5IHRoZSB1c2VyLgorCSAqLworCWNpci0+cG9ydCA9IEtCRF9DSVJfUE9SVDsKKwljaXItPmJhdWRfcmF0ZSA9IDB4MWQ7CisJY2lyLT5yZHdvcyA9IDA7CisJY2lyLT5yeGRjciA9IDB4MzsKKwljaXItPmhjZnMgPSAwOworCWNpci0+Zmlmb190bCA9IDA7CisJY2lyLT5jZnEgPSAweDFkOworCWNpcl9wb3J0X2luaXQoY2lyKTsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKElUODE3Ml9DSVIwX0lSUSwga2JkX2ludF9oYW5kbGVyLCAKKwkJCSh1bnNpZ25lZCBsb25nICkoU0FfSU5URVJSVVBUfFNBX1NISVJRKSwgCisJCQkoY29uc3QgY2hhciAqKSJRdHJvbml4IElSIEtleWJvYXJkIiwgKHZvaWQgKiljaXIpOworCisJaWYgKHJldHZhbCkgeworCQlwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSBjaXIgJWQgaXJxICVkXG4iLCAKKwkJCQljaXItPnBvcnQsIElUODE3Ml9DSVIwX0lSUSk7CisJfQorI2lmZGVmIENPTkZJR19QU01PVVNFCisJcHNhdXhfaW5pdCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBCaXRSZXZlcnNlKHVuc2lnbmVkIHNob3J0IGtleSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJrZXkgPSAwOworCXJrZXkgfD0gKGtleSAmIDB4MSkgPDwgNzsKKwlya2V5IHw9IChrZXkgJiAweDIpIDw8IDU7CisJcmtleSB8PSAoa2V5ICYgMHg0KSA8PCAzOworCXJrZXkgfD0gKGtleSAmIDB4OCkgPDwgMTsKKwlya2V5IHw9IChrZXkgJiAweDEwKSA+PiAxOworCXJrZXkgfD0gKGtleSAmIDB4MjApID4+IDM7CisJcmtleSB8PSAoa2V5ICYgMHg0MCkgPj4gNTsKKwlya2V5IHw9IChrZXkgJiAweDgwKSA+PiA3OworCXJldHVybiBya2V5OworCit9CisKKworc3RhdGljIGlubGluZSB1X2ludDhfdCBVcHBlckJ5dGUodV9pbnQ4X3QgZGF0YSkKK3sKKwlyZXR1cm4gKGRhdGEgPj4gNCk7Cit9CisKKworc3RhdGljIGlubGluZSB1X2ludDhfdCBMb3dlckJ5dGUodV9pbnQ4X3QgZGF0YSkKK3sKKwlyZXR1cm4gKGRhdGEgJiAweEYpOworfQorCisKK2ludCBDaGVja1N1bU9rKHVfaW50OF90IGJ5dGUxLCB1X2ludDhfdCBieXRlMiwgCisJCXVfaW50OF90IGJ5dGUzLCB1X2ludDhfdCBieXRlNCwgdV9pbnQ4X3QgYnl0ZTUpCit7CisJdV9pbnQ4X3QgQ2hlY2tTdW07CisKKwlDaGVja1N1bSA9IChieXRlMSAmIDB4MEYpICsgYnl0ZTIgKyBieXRlMyArIGJ5dGU0ICsgYnl0ZTU7CisJaWYgKCBMb3dlckJ5dGUoVXBwZXJCeXRlKENoZWNrU3VtKSArIExvd2VyQnl0ZShDaGVja1N1bSkpICE9IFVwcGVyQnl0ZShieXRlMSkgKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGtiZF9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBjaXJfcG9ydCAqY2lyOworCWludCBqOworCXVuc2lnbmVkIGNoYXIgaW50X3N0YXR1czsKKworCWNpciA9IChzdHJ1Y3QgY2lyX3BvcnQgKilkZXZfaWQ7CisJaW50X3N0YXR1cyA9IGdldF9pbnRfc3RhdHVzKGNpcik7CisJaWYgKGludF9zdGF0dXMgJiAweDQpIHsKKwkJY2xlYXJfZmlmbyhjaXIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGNpcl9nZXRfcnhfY291bnQoY2lyKSkgeworCisJCWNpcl9kYXRhW2RhdGFfaW5kZXhdID0gY2lyX3JlYWRfZGF0YShjaXIpOworCisJCWlmIChkYXRhX2luZGV4ID09IDApIHsvKiBleHBlY3RpbmcgZmlyc3QgYnl0ZSAqLworCQkJaWYgKGNpcl9kYXRhW2RhdGFfaW5kZXhdICE9IGxlYWRpbmcxKSB7CisJCQkJLy9wcmludGsoIiFsZWFkaW5nIGJ5dGUgJXhcbiIsIGNpcl9kYXRhW2RhdGFfaW5kZXhdKTsKKwkJCQlzZXRfcnhfYWN0aXZlKGNpcik7CisJCQkJY2xlYXJfZmlmbyhjaXIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChkYXRhX2luZGV4ID09IDEpIHsKKwkJCWlmICgoY2lyX2RhdGFbZGF0YV9pbmRleF0gJiAweGYpICE9IGxlYWRpbmcyKSB7CisJCQkJc2V0X3J4X2FjdGl2ZShjaXIpOworCQkJCWRhdGFfaW5kZXggPSAwOyAvKiBzdGFydCBvdmVyICovCisJCQkJY2xlYXJfZmlmbyhjaXIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKCAoY2lyX2RhdGFbZGF0YV9pbmRleF0gPT0gMHhmZikpIHsgLyogbGFzdCBieXRlICovCisJCQkvL3ByaW50aygiZGF0YV9pbmRleCAlZFxuIiwgZGF0YV9pbmRleCk7CisJCQlzZXRfcnhfYWN0aXZlKGNpcik7CisjaWYgMAorCQkJZm9yIChqPTA7IGo8PWRhdGFfaW5kZXg7IGorKykgeworCQkJCXByaW50aygicnhfZGF0YSAlZDogICV4XG4iLCBqLCBjaXJfZGF0YVtqXSk7CisJCQl9CisjZW5kaWYKKwkJCWRhdGFfaW5kZXggPSAwOworCQkJaGFuZGxlX2RhdGEoY2lyX2RhdGEpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgaWYgKGRhdGFfaW5kZXg+MTYpIHsKKwkJCXNldF9yeF9hY3RpdmUoY2lyKTsKKyNpZiAwCisJCQlwcmludGsoIndhcm5pbmc6IGRhdGFfaW5kZXggJWRcbiIsIGRhdGFfaW5kZXgpOworCQkJZm9yIChqPTA7IGo8PWRhdGFfaW5kZXg7IGorKykgeworCQkJCXByaW50aygicnhfZGF0YSAlZDogICV4XG4iLCBqLCBjaXJfZGF0YVtqXSk7CisJCQl9CisjZW5kaWYKKwkJCWRhdGFfaW5kZXggPSAwOworCQkJY2xlYXJfZmlmbyhjaXIpOworCQkJcmV0dXJuOworCQl9CisJCWRhdGFfaW5kZXgrKzsKKwl9Cit9CisKKworI2RlZmluZSBOVU1fS0JEX0JZVEVTIDUKK3N0YXRpYyBpbnQgaGFuZGxlX2RhdGEodW5zaWduZWQgY2hhciAqcF9kYXRhKQoreworCXVfaW50MzJfdCBiaXRfYnVja2V0OworCXVfaW50MzJfdCBpLCBqOworCXVfaW50MzJfdCBnb3RfYml0cywgbmV4dF9ieXRlOworCWludCBkb3duID0gMDsKKworCS8qIFJlb3JnYW5pemUgdGhlIGJpdCBzdHJlYW0gKi8KKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQlwX2RhdGFbaV0gPSBCaXRSZXZlcnNlKH5wX2RhdGFbaV0pOworCisJLyogCisJICogV2UndmUgYWxyZWFkeSBwcmV2aW91c2x5IGNoZWNrZWQgdGhhdCBwX2RhdGFbMF0KKwkgKiBpcyBlcXVhbCB0byBsZWFkaW5nMSBhbmQgdGhhdCAocF9kYXRhWzFdICYgMHhmKQorCSAqIGlzIGVxdWFsIHRvIGxlYWRpbmcyLiBUaGVzZSB0d2VsdmUgYml0cyBhcmUgdGhlCisJICogbGVhZGVyIGNvZGUuICBXZSBjYW4gbm93IHRocm93IHRoZW0gYXdheSAodGhlIDEyCisJICogYml0cykgYW5kIGNvbnRpbnVlIHBhcnNpbmcgdGhlIHN0cmVhbS4KKwkgKi8KKwliaXRfYnVja2V0ID0gcF9kYXRhWzFdIDw8IDEyOworCWdvdF9iaXRzID0gNDsKKwluZXh0X2J5dGUgPSAyOworCisJLyogCisJICogUHJvY2VzcyBmb3VyIGJpdHMgYXQgYSB0aW1lCisJICovCisJZm9yIChpPTA7IGk8TlVNX0tCRF9CWVRFUzsgaSsrKSB7CisKKwkJa2JkYnl0ZXNbaV09MDsKKworCQlmb3IgKGo9MDsgajw4OyBqKyspIC8qIDggYml0cyBwZXIgYnl0ZSAqLworCQl7CisJCQlpZiAoZ290X2JpdHMgPCA0KSB7CisJCQkJYml0X2J1Y2tldCB8PSAocF9kYXRhW25leHRfYnl0ZSsrXSA8PCAoOCAtIGdvdF9iaXRzKSk7CisJCQkJZ290X2JpdHMgKz0gODsKKwkJCX0KKworCQkJaWYgKChiaXRfYnVja2V0ICYgMHhGMDAwKSA9PSAweDgwMDApIHsgCisJCQkJLyogQ29udmVydCAxMDAwYiB0byAxICovCisJCQkJa2JkYnl0ZXNbaV0gPSAweDgwIHwgKGtiZGJ5dGVzW2ldID4+IDEpOworCQkJCWdvdF9iaXRzIC09IDQ7CisJCQkJYml0X2J1Y2tldCA9IGJpdF9idWNrZXQgPDwgNDsKKwkJCX0KKwkJCWVsc2UgaWYgKChiaXRfYnVja2V0ICYgMHhDMDAwKSA9PSAweDgwMDApIHsKKwkJCQkvKiBDb252ZXJ0IDEwYiB0byAwICovCisJCQkJa2JkYnl0ZXNbaV0gPSAga2JkYnl0ZXNbaV0gPj4gMTsKKwkJCQlnb3RfYml0cyAtPSAyOworCQkJCWJpdF9idWNrZXQgPSBiaXRfYnVja2V0IDw8IDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBiYWQgc2VyaWFsIHN0cmVhbSAqLworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlpZiAobmV4dF9ieXRlID4gMTYpIHsKKwkJCQkvL3ByaW50aygiZXJyb3I6IHRvbyBtYW55IGJ5dGVzXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYgKCFDaGVja1N1bU9rKGtiZGJ5dGVzWzBdLCBrYmRieXRlc1sxXSwgCisJCQkJa2JkYnl0ZXNbMl0sIGtiZGJ5dGVzWzNdLCBrYmRieXRlc1s0XSkpIHsKKwkJLy9wcmludGsoImNoZWNrc3VtIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChrYmRieXRlc1sxXSAmIDB4MDgpIHsKKwkJLy9wcmludGsoIm06ICV4ICV4ICV4XG4iLCBrYmRieXRlc1sxXSwga2JkYnl0ZXNbMl0sIGtiZGJ5dGVzWzNdKTsKKwkJaGFuZGxlX21vdXNlX2V2ZW50KGtiZGJ5dGVzWzFdKTsKKwkJaGFuZGxlX21vdXNlX2V2ZW50KGtiZGJ5dGVzWzJdKTsKKwkJaGFuZGxlX21vdXNlX2V2ZW50KGtiZGJ5dGVzWzNdKTsKKwl9CisJZWxzZSB7CisJCWlmIChrYmRieXRlc1syXSA9PSAwKSBkb3duID0gMTsKKyNpZiAwCisJCWlmIChkb3duKQorCQkJcHJpbnRrKCJkb3duICVkXG4iLCBrYmRieXRlc1szXSk7CisJCWVsc2UKKwkJCXByaW50aygidXAgJWRcbiIsIGtiZGJ5dGVzWzNdKTsKKyNlbmRpZgorCQloYW5kbGVfa2V5Ym9hcmRfZXZlbnQoa2JkYnl0ZXNbM10sIGRvd24pOworCX0KKwlyZXR1cm4gMDsKK30KKworCitERUZJTkVfU1BJTkxPQ0soa2JkX2NvbnRyb2xsZXJfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBoYW5kbGVfa2JkX2V2ZW50KHZvaWQpOworCisKK2ludCBrYmRfc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQoreworCXByaW50aygia2JkX3NldGtleWNvZGUgc2NhbmNvZGUgJXgga2V5Y29kZSAleFxuIiwgc2NhbmNvZGUsIGtleWNvZGUpOworCXJldHVybiAwOworfQorCitpbnQga2JkX2dldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlKQoreworCXJldHVybiBzY2FuY29kZTsKK30KKworCitpbnQga2JkX3RyYW5zbGF0ZSh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlLCB1bnNpZ25lZCBjaGFyICprZXljb2RlLAorCQkgICAgY2hhciByYXdfbW9kZSkKK3sKKwlzdGF0aWMgaW50IHByZXZfc2NhbmNvZGUgPSAwOworCisJaWYgKHNjYW5jb2RlID09IDB4MDAgfHwgc2NhbmNvZGUgPT0gMHhmZikgeworCQlwcmV2X3NjYW5jb2RlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdG9kbyAqLworCWlmICghcHJldl9zY2FuY29kZSAmJiBzY2FuY29kZSA9PSAxNjApIHsgLyogRm4ga2V5IGRvd24gKi8KKwkJLy9wcmludGsoIkZuIGtleSBkb3duXG4iKTsKKwkJcHJldl9zY2FuY29kZSA9IDE2MDsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgaWYgKHByZXZfc2NhbmNvZGUgJiYgc2NhbmNvZGUgPT0gMTYwKSB7IC8qIEZuIGtleSB1cCAqLworCQkvL3ByaW50aygiRm4ga2V5IHVwXG4iKTsKKwkJcHJldl9zY2FuY29kZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIHRvZG8gKi8KKwlpZiAocHJldl9zY2FuY29kZSA9PSAxNjApIHsKKwkJaWYgKHNjYW5jb2RlIDw9IE5VTV9GTl9LRVlTKSB7CisJCQkqa2V5Y29kZSA9IGZuX2tleXNbc2NhbmNvZGVdOworCQkJLy9wcmludGsoImZuIGtleWNvZGUgJWRcbiIsICprZXljb2RlKTsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IAorCWVsc2UgaWYgKHNjYW5jb2RlIDw9IDEyNykgeworCQkqa2V5Y29kZSA9IHNjYW5jb2RlOworCX0KKwllbHNlCisJCXJldHVybiAwOworCisKKyAJcmV0dXJuIDE7Cit9CisKK2NoYXIga2JkX3VuZXhwZWN0ZWRfdXAodW5zaWduZWQgY2hhciBrZXljb2RlKQoreworCS8vcHJpbnRrKCJrYmRfdW5leHBlY3RlZF91cFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9leGlzdHMgPSAxOworCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2tleWJvYXJkX2V2ZW50KHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUsIGludCBkb3duKQoreworCWtiZF9leGlzdHMgPSAxOworCWhhbmRsZV9zY2FuY29kZShzY2FuY29kZSwgZG93bik7CisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7Cit9CQorCisKK3ZvaWQga2JkX2xlZHModW5zaWduZWQgY2hhciBsZWRzKQoreworfQorCisvKiBkdW1teSAqLwordm9pZCBrYmRfaW5pdF9odyh2b2lkKQoreworfQorCisKKworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9tb3VzZV9ldmVudCh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlKQoreworCWlmKHNjYW5jb2RlID09IEFVWF9SRUNPTk5FQ1QpeworCQlxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gMDsgIC8qIEZsdXNoIGlucHV0IHF1ZXVlICovCisJLy8JX19hdXhfd3JpdGVfYWNrKEFVWF9FTkFCTEVfREVWKTsgIC8qIHBpbmcgdGhlIG1vdXNlIDopICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoYXV4X2NvdW50KSB7CisJCWludCBoZWFkID0gcXVldWUtPmhlYWQ7CisKKwkJcXVldWUtPmJ1ZltoZWFkXSA9IHNjYW5jb2RlOworCQloZWFkID0gKGhlYWQgKyAxKSAmIChBVVhfQlVGX1NJWkUtMSk7CisJCWlmIChoZWFkICE9IHF1ZXVlLT50YWlsKSB7CisJCQlxdWV1ZS0+aGVhZCA9IGhlYWQ7CisJCQlraWxsX2Zhc3luYygmcXVldWUtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxdWV1ZS0+cHJvY19saXN0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2Zyb21fcXVldWUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtiZF9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSBxdWV1ZS0+YnVmW3F1ZXVlLT50YWlsXTsKKwlxdWV1ZS0+dGFpbCA9IChxdWV1ZS0+dGFpbCArIDEpICYgKEFVWF9CVUZfU0laRS0xKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYmRfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV9lbXB0eSh2b2lkKQoreworCXJldHVybiBxdWV1ZS0+aGVhZCA9PSBxdWV1ZS0+dGFpbDsKK30KKworc3RhdGljIGludCBmYXN5bmNfYXV4KGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlpbnQgcmV0dmFsOworCisJLy9wcmludGsoImZhc3luY19hdXhcbiIpOworCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmcXVldWUtPmZhc3luYyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJhbmRvbSBtYWdpYyBjb29raWUgZm9yIHRoZSBhdXggZGV2aWNlCisgKi8KKyNkZWZpbmUgQVVYX0RFViAoKHZvaWQgKilxdWV1ZSkKKworc3RhdGljIGludCByZWxlYXNlX2F1eChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCWZhc3luY19hdXgoLTEsIGZpbGUsIDApOworCWF1eF9jb3VudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5fYXV4KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaWYgKGF1eF9jb3VudCsrKSB7CisJCXJldHVybiAwOworCX0KKwlxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gMDsJCS8qIEZsdXNoIGlucHV0IHF1ZXVlICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQgYnl0ZXMgZnJvbSBpbnB1dCBxdWV1ZSB0byBidWZmZXIuCisgKi8KKworc3RhdGljIHNzaXplX3QgcmVhZF9hdXgoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyICogYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCBpID0gY291bnQ7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHF1ZXVlX2VtcHR5KCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWFkZF93YWl0X3F1ZXVlKCZxdWV1ZS0+cHJvY19saXN0LCAmd2FpdCk7CityZXBlYXQ6CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChxdWV1ZV9lbXB0eSgpICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2NoZWR1bGUoKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcXVldWUtPnByb2NfbGlzdCwgJndhaXQpOworCX0KKwl3aGlsZSAoaSA+IDAgJiYgIXF1ZXVlX2VtcHR5KCkpIHsKKwkJYyA9IGdldF9mcm9tX3F1ZXVlKCk7CisJCXB1dF91c2VyKGMsIGJ1ZmZlcisrKTsKKwkJaS0tOworCX0KKwlpZiAoY291bnQtaSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIGNvdW50LWk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIHRvIHRoZSBhdXggZGV2aWNlLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2F1eChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBidWZmZXIsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJLyoKKwkgKiBUaGUgSVRFIGJvYXJkcyB0aGlzIHdhcyB0ZXN0ZWQgb24gZGlkIG5vdCBoYXZlIHRoZQorCSAqIHRyYW5zbWl0IHdpcmVzIGNvbm5lY3RlZC4KKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXV4X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmcXVldWUtPnByb2NfbGlzdCwgd2FpdCk7CisJaWYgKCFxdWV1ZV9lbXB0eSgpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwc2F1eF9mb3BzID0geworCS5yZWFkCQk9IHJlYWRfYXV4LAorCS53cml0ZQkJPSB3cml0ZV9hdXgsCisJLnBvbGwJCT0gYXV4X3BvbGwsCisJLm9wZW4JCT0gb3Blbl9hdXgsCisJLnJlbGVhc2UJPSByZWxlYXNlX2F1eCwKKwkuZmFzeW5jCQk9IGZhc3luY19hdXgsCit9OworCisvKgorICogSW5pdGlhbGl6ZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBwc2F1eF9tb3VzZSA9IHsKKwlQU01PVVNFX01JTk9SLCAicHNhdXgiLCAmcHNhdXhfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgcHNhdXhfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZwc2F1eF9tb3VzZSk7CisJaWYocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXF1ZXVlID0gKHN0cnVjdCBhdXhfcXVldWUgKikga21hbGxvYyhzaXplb2YoKnF1ZXVlKSwgR0ZQX0tFUk5FTCk7CisJbWVtc2V0KHF1ZXVlLCAwLCBzaXplb2YoKnF1ZXVlKSk7CisJcXVldWUtPmhlYWQgPSBxdWV1ZS0+dGFpbCA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUtPnByb2NfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGluaXRfcXRyb25peF85OTBQX2tiZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLmNfc2hpcHBlZCBiL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJiOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3F0cm9uaXhtYXAuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjY1IEBACisKKy8qIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICAgKi8KKy8qICAgIGxvYWRrZXlzIC0tbWt0YWJsZSBkZWZrZXltYXAubWFwID4gZGVma2V5bWFwLmMgICAgICAgICAgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCit1X3Nob3J0IHBsYWluX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjA2MCwJMHhmMDMxLAkweGYwMzIsCTB4ZjAzMywJMHhmMDM0LAkweGYwMzUsCTB4ZjAzNiwKKwkweGYwMzcsCTB4ZjAzOCwJMHhmMDM5LAkweGYwMzAsCTB4ZjAyZCwJMHhmMDNkLAkweGYyMDAsCTB4ZjA3ZiwKKwkweGYwMDksCTB4ZmI3MSwJMHhmYjc3LAkweGZiNjUsCTB4ZmI3MiwJMHhmYjc0LAkweGZiNzksCTB4ZmI3NSwKKwkweGZiNjksCTB4ZmI2ZiwJMHhmYjcwLAkweGYwNWIsCTB4ZjA1ZCwJMHhmMDVjLAkweGYyMDcsCTB4ZmI2MSwKKwkweGZiNzMsCTB4ZmI2NCwJMHhmYjY2LAkweGZiNjcsCTB4ZmI2OCwJMHhmYjZhLAkweGZiNmIsCTB4ZmI2YywKKwkweGYwM2IsCTB4ZjAyNywJMHhmMDYwLAkweGYyMDEsCTB4ZjcwMCwJMHhmMjAwLAkweGZiN2EsCTB4ZmI3OCwKKwkweGZiNjMsCTB4ZmI3NiwJMHhmYjYyLAkweGZiNmUsCTB4ZmI2ZCwJMHhmMDJjLAkweGYwMmUsCTB4ZjAyZiwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmMDIwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMSwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjYwMiwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYwMWIsCTB4ZjIwMCwKKwkweGYxMDAsCTB4ZjEwMSwJMHhmMTAyLAkweGYxMDMsCTB4ZjEwNCwJMHhmMTA1LAkweGYxMDYsCTB4ZjEwNywKKwkweGYxMDgsCTB4ZjEwOSwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgc2hpZnRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMDdlLAkweGYwMjEsCTB4ZjA0MCwJMHhmMDIzLAkweGYwMjQsCTB4ZjAyNSwJMHhmMDVlLAorCTB4ZjAyNiwJMHhmMDJhLAkweGYwMjgsCTB4ZjAyOSwJMHhmMDVmLAkweGYwMmIsCTB4ZjIwMCwJMHhmMDdmLAorCTB4ZjAwOSwJMHhmYjUxLAkweGZiNTcsCTB4ZmI0NSwJMHhmYjUyLAkweGZiNTQsCTB4ZmI1OSwJMHhmYjU1LAorCTB4ZmI0OSwJMHhmYjRmLAkweGZiNTAsCTB4ZjA3YiwJMHhmMDdkLAkweGYwN2MsCTB4ZjIwNywJMHhmYjQxLAorCTB4ZmI1MywJMHhmYjQ0LAkweGZiNDYsCTB4ZmI0NywJMHhmYjQ4LAkweGZiNGEsCTB4ZmI0YiwJMHhmYjRjLAorCTB4ZjAzYSwJMHhmMDIyLAkweGYwN2UsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZmI1YSwJMHhmYjU4LAorCTB4ZmI0MywJMHhmYjU2LAkweGZiNDIsCTB4ZmI0ZSwJMHhmYjRkLAkweGYwM2MsCTB4ZjAzZSwJMHhmMDNmLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYwMjAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYyMGIsCTB4ZjIwYSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMTMsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjAxYiwJMHhmMjAwLAorCTB4ZjEwYSwJMHhmMTBiLAkweGYxMGMsCTB4ZjEwZCwJMHhmMTBlLAkweGYxMGYsCTB4ZjExMCwJMHhmMTExLAorCTB4ZjExMiwJMHhmMTEzLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBhbHRncl9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDQwLAkweGYyMDAsCTB4ZjAyNCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMDdiLAkweGYwNWIsCTB4ZjA1ZCwJMHhmMDdkLAkweGYwNWMsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGZiNzEsCTB4ZmI3NywJMHhmYjY1LAkweGZiNzIsCTB4ZmI3NCwJMHhmYjc5LAkweGZiNzUsCisJMHhmYjY5LAkweGZiNmYsCTB4ZmI3MCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjA3LAkweGZiNjEsCisJMHhmYjczLAkweGZiNjQsCTB4ZmI2NiwJMHhmYjY3LAkweGZiNjgsCTB4ZmI2YSwJMHhmYjZiLAkweGZiNmMsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAxLAkweGY3MDAsCTB4ZjIwMCwJMHhmYjdhLAkweGZiNzgsCisJMHhmYjYzLAkweGZiNzYsCTB4ZmI2MiwJMHhmYjZlLAkweGZiNmQsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGY3MDAsCTB4ZjcwMiwJMHhmMjAwLAkweGY3MDMsCTB4ZjIwMCwJMHhmNzAzLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE1LAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDEsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAzLAkweGY2MDAsCTB4ZjExOCwJMHhmMTE5LAkweGYyMDAsCisJMHhmMjAwLAkweGY2MDIsCTB4ZjIwOCwJMHhmMDJkLAkweGYwMmIsCTB4ZjMwYywJMHhmMDJlLAkweGYzMGQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE3LAkweGY2MDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmNTBjLAkweGY1MGQsCTB4ZjUwZSwJMHhmNTBmLAkweGY1MTAsCTB4ZjUxMSwJMHhmNTEyLAkweGY1MTMsCisJMHhmNTE0LAkweGY1MTUsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTFkLAkweGYyMDAsCit9OworCit1X3Nob3J0IGN0cmxfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAwMCwJMHhmMDFiLAkweGYwMWMsCTB4ZjAxZCwJMHhmMDFlLAorCTB4ZjAxZiwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDFmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDA4LAorCTB4ZjIwMCwJMHhmMDExLAkweGYwMTcsCTB4ZjAwNSwJMHhmMDEyLAkweGYwMTQsCTB4ZjAxOSwJMHhmMDE1LAorCTB4ZjAwOSwJMHhmMDBmLAkweGYwMTAsCTB4ZjAxYiwJMHhmMDFkLAkweGYwMWMsCTB4ZjIwNywJMHhmMDAxLAorCTB4ZjAxMywJMHhmMDA0LAkweGYwMDYsCTB4ZjAwNywJMHhmMDA4LAkweGYwMGEsCTB4ZjAwYiwJMHhmMDBjLAorCTB4ZjAwNywJMHhmMDAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZjAxYSwJMHhmMDE4LAorCTB4ZjAwMywJMHhmMDE2LAkweGYwMDIsCTB4ZjAwZSwJMHhmMjBlLAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYwMDAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjEwMCwJMHhmMTAxLAkweGYxMDIsCTB4ZjEwMywJMHhmMTA0LAkweGYxMDUsCTB4ZjEwNiwJMHhmMTA3LAorCTB4ZjEwOCwJMHhmMTA5LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBzaGlmdF9jdHJsX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYwMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAxZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjAxMSwJMHhmMDE3LAkweGYwMDUsCTB4ZjAxMiwJMHhmMDE0LAkweGYwMTksCTB4ZjAxNSwKKwkweGYwMDksCTB4ZjAwZiwJMHhmMDEwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDcsCTB4ZjAwMSwKKwkweGYwMTMsCTB4ZjAwNCwJMHhmMDA2LAkweGYwMDcsCTB4ZjAwOCwJMHhmMDBhLAkweGYwMGIsCTB4ZjAwYywKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDEsCTB4ZjcwMCwJMHhmMjAwLAkweGYwMWEsCTB4ZjAxOCwKKwkweGYwMDMsCTB4ZjAxNiwJMHhmMDAyLAkweGYwMGUsCTB4ZjAwZCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmMjAwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMSwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjYwMiwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgYWx0X21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjgxYiwJMHhmODMxLAkweGY4MzIsCTB4ZjgzMywJMHhmODM0LAkweGY4MzUsCTB4ZjgzNiwKKwkweGY4MzcsCTB4ZjgzOCwJMHhmODM5LAkweGY4MzAsCTB4ZjgyZCwJMHhmODNkLAkweGYyMDAsCTB4Zjg3ZiwKKwkweGY4MDksCTB4Zjg3MSwJMHhmODc3LAkweGY4NjUsCTB4Zjg3MiwJMHhmODc0LAkweGY4NzksCTB4Zjg3NSwKKwkweGY4NjksCTB4Zjg2ZiwJMHhmODcwLAkweGY4NWIsCTB4Zjg1ZCwJMHhmODVjLAkweGYyMDcsCTB4Zjg2MSwKKwkweGY4NzMsCTB4Zjg2NCwJMHhmODY2LAkweGY4NjcsCTB4Zjg2OCwJMHhmODZhLAkweGY4NmIsCTB4ZjgzYiwKKwkweGY4MjcsCTB4Zjg2MCwJMHhmMjAwLAkweGY4MGQsCTB4ZjcwMCwJMHhmMjAwLAkweGY4N2EsCTB4Zjg3OCwKKwkweGY4NjMsCTB4Zjg3NiwJMHhmODYyLAkweGY4MmMsCTB4ZjgyZSwJMHhmODJmLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmODIwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIxMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIxMSwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGY1MDAsCTB4ZjUwMSwJMHhmNTAyLAkweGY1MDMsCTB4ZjUwNCwJMHhmNTA1LAkweGY1MDYsCTB4ZjUwNywKKwkweGY1MDgsCTB4ZjUwOSwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgY3RybF9hbHRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmODExLAkweGY4MTcsCTB4ZjgwNSwJMHhmODEyLAkweGY4MTQsCTB4ZjgxOSwJMHhmODE1LAorCTB4ZjgwOSwJMHhmODBmLAkweGY4MTAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwNywJMHhmODAxLAorCTB4ZjgxMywJMHhmODA0LAkweGY4MDYsCTB4ZjgwNywJMHhmODA4LAkweGY4MGEsCTB4ZjgwYiwJMHhmODBjLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZjgxYSwJMHhmODE4LAorCTB4ZjgwMywJMHhmODE2LAkweGY4MDIsCTB4ZjgwZSwJMHhmODBkLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYyMDAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjUwMCwJMHhmNTAxLAkweGY1MDIsCTB4ZjUwMywJMHhmNTA0LAkweGY1MDUsCTB4ZjUwNiwJMHhmNTA3LAorCTB4ZjUwOCwJMHhmNTA5LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordXNob3J0ICprZXlfbWFwc1tNQVhfTlJfS0VZTUFQU10gPSB7CisJcGxhaW5fbWFwLCBzaGlmdF9tYXAsIGFsdGdyX21hcCwgMCwKKwljdHJsX21hcCwgc2hpZnRfY3RybF9tYXAsIDAsIDAsCisJYWx0X21hcCwgMCwgMCwgMCwKKwljdHJsX2FsdF9tYXAsCTAKK307CisKK3Vuc2lnbmVkIGludCBrZXltYXBfY291bnQgPSA3OworCisKKy8qCisgKiBQaGlsb3NvcGh5OiBtb3N0IHBlb3BsZSBkbyBub3QgZGVmaW5lIG1vcmUgc3RyaW5ncywgYnV0IHRoZXkgd2hvIGRvCisgKiBvZnRlbiB3YW50IHF1aXRlIGEgbG90IG9mIHN0cmluZyBzcGFjZS4gU28sIHdlIHN0YXRpY2FsbHkgYWxsb2NhdGUKKyAqIHRoZSBkZWZhdWx0IGFuZCBhbGxvY2F0ZSBkeW5hbWljYWxseSBpbiBjaHVua3Mgb2YgNTEyIGJ5dGVzLgorICovCisKK2NoYXIgZnVuY19idWZbXSA9IHsKKwknXDAzMycsICdbJywgJ1snLCAnQScsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdCJywgMCwgCisJJ1wwMzMnLCAnWycsICdbJywgJ0MnLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnRCcsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdFJywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJzcnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICc4JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzEnLCAnOScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzAnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICcxJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnMycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzQnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc1JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnNicsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzgnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc5JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnMScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzInLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICczJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnNCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICc0JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzUnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnNicsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICdNJywgMCwgCisJJ1wwMzMnLCAnWycsICdQJywgMCwgCit9OworCisKK2NoYXIgKmZ1bmNidWZwdHIgPSBmdW5jX2J1ZjsKK2ludCBmdW5jYnVmc2l6ZSA9IHNpemVvZihmdW5jX2J1Zik7CitpbnQgZnVuY2J1ZmxlZnQgPSAwOyAgICAgICAgICAvKiBzcGFjZSBsZWZ0ICovCisKK2NoYXIgKmZ1bmNfdGFibGVbTUFYX05SX0ZVTkNdID0geworCWZ1bmNfYnVmICsgMCwKKwlmdW5jX2J1ZiArIDUsCisJZnVuY19idWYgKyAxMCwKKwlmdW5jX2J1ZiArIDE1LAorCWZ1bmNfYnVmICsgMjAsCisJZnVuY19idWYgKyAyNSwKKwlmdW5jX2J1ZiArIDMxLAorCWZ1bmNfYnVmICsgMzcsCisJZnVuY19idWYgKyA0MywKKwlmdW5jX2J1ZiArIDQ5LAorCWZ1bmNfYnVmICsgNTUsCisJZnVuY19idWYgKyA2MSwKKwlmdW5jX2J1ZiArIDY3LAorCWZ1bmNfYnVmICsgNzMsCisJZnVuY19idWYgKyA3OSwKKwlmdW5jX2J1ZiArIDg1LAorCWZ1bmNfYnVmICsgOTEsCisJZnVuY19idWYgKyA5NywKKwlmdW5jX2J1ZiArIDEwMywKKwlmdW5jX2J1ZiArIDEwOSwKKwlmdW5jX2J1ZiArIDExNSwKKwlmdW5jX2J1ZiArIDEyMCwKKwlmdW5jX2J1ZiArIDEyNSwKKwlmdW5jX2J1ZiArIDEzMCwKKwlmdW5jX2J1ZiArIDEzNSwKKwlmdW5jX2J1ZiArIDE0MCwKKwlmdW5jX2J1ZiArIDE0NSwKKwkwLAorCTAsCisJZnVuY19idWYgKyAxNDksCisJMCwKK307CisKK3N0cnVjdCBrYmRpYWNyIGFjY2VudF90YWJsZVtNQVhfRElBQ1JdID0geworCXsnYCcsICdBJywgJ8AnfSwJeydgJywgJ2EnLCAn4Cd9LAorCXsnXCcnLCAnQScsICfBJ30sCXsnXCcnLCAnYScsICfhJ30sCisJeydeJywgJ0EnLCAnwid9LAl7J14nLCAnYScsICfiJ30sCisJeyd+JywgJ0EnLCAnwyd9LAl7J34nLCAnYScsICfjJ30sCisJeyciJywgJ0EnLCAnxCd9LAl7JyInLCAnYScsICfkJ30sCisJeydPJywgJ0EnLCAnxSd9LAl7J28nLCAnYScsICflJ30sCisJeycwJywgJ0EnLCAnxSd9LAl7JzAnLCAnYScsICflJ30sCisJeydBJywgJ0EnLCAnxSd9LAl7J2EnLCAnYScsICflJ30sCisJeydBJywgJ0UnLCAnxid9LAl7J2EnLCAnZScsICfmJ30sCisJeycsJywgJ0MnLCAnxyd9LAl7JywnLCAnYycsICfnJ30sCisJeydgJywgJ0UnLCAnyCd9LAl7J2AnLCAnZScsICfoJ30sCisJeydcJycsICdFJywgJ8knfSwJeydcJycsICdlJywgJ+knfSwKKwl7J14nLCAnRScsICfKJ30sCXsnXicsICdlJywgJ+onfSwKKwl7JyInLCAnRScsICfLJ30sCXsnIicsICdlJywgJ+snfSwKKwl7J2AnLCAnSScsICfMJ30sCXsnYCcsICdpJywgJ+wnfSwKKwl7J1wnJywgJ0knLCAnzSd9LAl7J1wnJywgJ2knLCAn7Sd9LAorCXsnXicsICdJJywgJ84nfSwJeydeJywgJ2knLCAn7id9LAorCXsnIicsICdJJywgJ88nfSwJeyciJywgJ2knLCAn7yd9LAorCXsnLScsICdEJywgJ9AnfSwJeyctJywgJ2QnLCAn8Cd9LAorCXsnficsICdOJywgJ9EnfSwJeyd+JywgJ24nLCAn8Sd9LAorCXsnYCcsICdPJywgJ9InfSwJeydgJywgJ28nLCAn8id9LAorCXsnXCcnLCAnTycsICfTJ30sCXsnXCcnLCAnbycsICfzJ30sCisJeydeJywgJ08nLCAn1Cd9LAl7J14nLCAnbycsICf0J30sCisJeyd+JywgJ08nLCAn1Sd9LAl7J34nLCAnbycsICf1J30sCisJeyciJywgJ08nLCAn1id9LAl7JyInLCAnbycsICf2J30sCisJeycvJywgJ08nLCAn2Cd9LAl7Jy8nLCAnbycsICf4J30sCisJeydgJywgJ1UnLCAn2Sd9LAl7J2AnLCAndScsICf5J30sCisJeydcJycsICdVJywgJ9onfSwJeydcJycsICd1JywgJ/onfSwKKwl7J14nLCAnVScsICfbJ30sCXsnXicsICd1JywgJ/snfSwKKwl7JyInLCAnVScsICfcJ30sCXsnIicsICd1JywgJ/wnfSwKKwl7J1wnJywgJ1knLCAn3Sd9LAl7J1wnJywgJ3knLCAn/Sd9LAorCXsnVCcsICdIJywgJ94nfSwJeyd0JywgJ2gnLCAn/id9LAorCXsncycsICdzJywgJ98nfSwJeyciJywgJ3knLCAn/yd9LAorCXsncycsICd6JywgJ98nfSwJeydpJywgJ2onLCAn/yd9LAorfTsKKwordW5zaWduZWQgaW50IGFjY2VudF90YWJsZV9zaXplID0gNjg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcXRyb25peG1hcC5tYXAgYi9kcml2ZXJzL2NoYXIvcXRyb25peG1hcC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxZmY1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLm1hcApAQCAtMCwwICsxLDI4NyBAQAorIyBEZWZhdWx0IGtlcm5lbCBrZXltYXAuIFRoaXMgdXNlcyA3IG1vZGlmaWVyIGNvbWJpbmF0aW9ucy4KK2tleW1hcHMgMC0yLDQtNSw4LDEyCisjIENoYW5nZSB0aGUgYWJvdmUgbGluZSBpbnRvCisjCWtleW1hcHMgMC0yLDQtNiw4LDEyCisjIGluIGNhc2UgeW91IHdhbnQgdGhlIGVudHJpZXMKKyMJYWx0Z3IgICBjb250cm9sIGtleWNvZGUgIDgzID0gQm9vdCAgICAgICAgICAgIAorIwlhbHRnciAgIGNvbnRyb2wga2V5Y29kZSAxMTEgPSBCb290ICAgICAgICAgICAgCisjIGJlbG93LgorIworIyBJbiBmYWN0IEFsdEdyIGlzIHVzZWQgdmVyeSBsaXR0bGUsIGFuZCBvbmUgbW9yZSBrZXltYXAgY2FuCisjIGJlIHNhdmVkIGJ5IG1hcHBpbmcgQWx0R3IgdG8gQWx0IChhbmQgYWRhcHRpbmcgYSBmZXcgZW50cmllcyk6CisjIGtleWNvZGUgMTAwID0gQWx0CisjCitrZXljb2RlICAgMSA9IGdyYXZlICAgICAgICBhc2NpaXRpbGRlCisJYWx0ICAgICBrZXljb2RlICAgMSA9IE1ldGFfRXNjYXBlICAgICAKK2tleWNvZGUgICAyID0gb25lICAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMiA9IE1ldGFfb25lICAgICAgICAKK2tleWNvZGUgICAzID0gdHdvICAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICAKKwljb250cm9sCWtleWNvZGUgICAzID0gbnVsICAgICAgICAgICAgIAorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgIDMgPSBudWwgICAgICAgICAgICAgCisJYWx0CWtleWNvZGUgICAzID0gTWV0YV90d28gICAgICAgIAora2V5Y29kZSAgIDQgPSB0aHJlZSAgICAgICAgICAgIG51bWJlcnNpZ24gICAgICAKKwljb250cm9sIGtleWNvZGUgICA0ID0gRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgIDQgPSBNZXRhX3RocmVlICAgICAgCitrZXljb2RlICAgNSA9IGZvdXIgICAgICAgICAgICAgZG9sbGFyICAgICAgICAgICBkb2xsYXIgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAgNSA9IE1ldGFfZm91ciAgICAgICAKK2tleWNvZGUgICA2ID0gZml2ZSAgICAgICAgICAgICBwZXJjZW50ICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNiA9IENvbnRyb2xfYnJhY2tldHJpZ2h0CisJYWx0ICAgICBrZXljb2RlICAgNiA9IE1ldGFfZml2ZSAgICAgICAKK2tleWNvZGUgICA3ID0gc2l4ICAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgCisJY29udHJvbCBrZXljb2RlICAgNyA9IENvbnRyb2xfYXNjaWljaXJjdW0KKwlhbHQgICAgIGtleWNvZGUgICA3ID0gTWV0YV9zaXggICAgICAgIAora2V5Y29kZSAgIDggPSBzZXZlbiAgICAgICAgICAgIGFtcGVyc2FuZCAgICAgICAgYnJhY2VsZWZ0ICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDggPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQgICAgIGtleWNvZGUgICA4ID0gTWV0YV9zZXZlbiAgICAgIAora2V5Y29kZSAgIDkgPSBlaWdodCAgICAgICAgICAgIGFzdGVyaXNrICAgICAgICAgYnJhY2tldGxlZnQgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDkgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgOSA9IE1ldGFfZWlnaHQgICAgICAKK2tleWNvZGUgIDEwID0gbmluZSAgICAgICAgICAgICBwYXJlbmxlZnQgICAgICAgIGJyYWNrZXRyaWdodCAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEwID0gTWV0YV9uaW5lICAgICAgIAora2V5Y29kZSAgMTEgPSB6ZXJvICAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICAgYnJhY2VyaWdodCAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEgPSBNZXRhX3plcm8gICAgICAgCitrZXljb2RlICAxMiA9IG1pbnVzICAgICAgICAgICAgdW5kZXJzY29yZSAgICAgICBiYWNrc2xhc2ggICAgICAgCisJY29udHJvbAlrZXljb2RlICAxMiA9IENvbnRyb2xfdW5kZXJzY29yZQorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgMTIgPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQJa2V5Y29kZSAgMTIgPSBNZXRhX21pbnVzICAgICAgCitrZXljb2RlICAxMyA9IGVxdWFsICAgICAgICAgICAgcGx1cyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTMgPSBNZXRhX2VxdWFsICAgICAgCitrZXljb2RlICAxNSA9IERlbGV0ZSAgICAgICAgICAgRGVsZXRlICAgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTUgPSBCYWNrU3BhY2UKKwlhbHQgICAgIGtleWNvZGUgIDE1ID0gTWV0YV9EZWxldGUgICAgIAora2V5Y29kZSAgMTYgPSBUYWIgICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDE2ID0gTWV0YV9UYWIgICAgICAgIAora2V5Y29kZSAgMTcgPSBxICAgICAgICAgICAgICAgCitrZXljb2RlICAxOCA9IHcgICAgICAgICAgICAgICAKK2tleWNvZGUgIDE5ID0gZQora2V5Y29kZSAgMjAgPSByICAgICAgICAgICAgICAgCitrZXljb2RlICAyMSA9IHQgICAgICAgICAgICAgICAKK2tleWNvZGUgIDIyID0geSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjMgPSB1CSAKK2tleWNvZGUgIDI0ID0gaSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjUgPSBvICAgICAgICAgICAgICAgCitrZXljb2RlICAyNiA9IHAgICAgICAgICAgICAgICAKK2tleWNvZGUgIDI3ID0gYnJhY2tldGxlZnQgICAgICBicmFjZWxlZnQgICAgICAgCisJY29udHJvbCBrZXljb2RlICAyNyA9IEVzY2FwZSAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDI3ID0gTWV0YV9icmFja2V0bGVmdAora2V5Y29kZSAgMjggPSBicmFja2V0cmlnaHQgICAgIGJyYWNlcmlnaHQKKwljb250cm9sIGtleWNvZGUgIDI4ID0gQ29udHJvbF9icmFja2V0cmlnaHQKKwlhbHQgICAgIGtleWNvZGUgIDI4ID0gTWV0YV9icmFja2V0cmlnaHQKK2tleWNvZGUgIDI5ID0gYmFja3NsYXNoICAgICAgICBiYXIgICAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAyOSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAyOSA9IE1ldGFfYmFja3NsYXNoICAKK2tleWNvZGUgIDMwID0gQ2Fwc19Mb2NrCitrZXljb2RlICAzMSA9IGEgICAgICAgICAgICAgICAKK2tleWNvZGUgIDMyID0gcwora2V5Y29kZSAgMzMgPSBkCitrZXljb2RlICAzNCA9IGYgICAgICAgICAgICAgICAKK2tleWNvZGUgIDM1ID0gZyAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzYgPSBoICAgICAgICAgICAgICAgCitrZXljb2RlICAzNyA9IGogICAgICAgICAgICAgICAKK2tleWNvZGUgIDM4ID0gayAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzkgPSBsICAgICAgICAgICAgICAgCitrZXljb2RlICA0MCA9IHNlbWljb2xvbiAgICAgICAgY29sb24gICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMzkgPSBNZXRhX3NlbWljb2xvbiAgCitrZXljb2RlICA0MSA9IGFwb3N0cm9waGUgICAgICAgcXVvdGVkYmwgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNDAgPSBDb250cm9sX2cgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA0MCA9IE1ldGFfYXBvc3Ryb3BoZSAKK2tleWNvZGUgIDQyID0gZ3JhdmUgICAgICAgICAgICBhc2NpaXRpbGRlICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MSA9IG51bCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDQxID0gTWV0YV9ncmF2ZSAgICAgIAora2V5Y29kZSAgNDMgPSBSZXR1cm4gICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA0MyA9IE1ldGFfQ29udHJvbF9tICAKK2tleWNvZGUgIDQ0ID0gU2hpZnQgICAgICAgICAgICAgICAKK2tleWNvZGUgIDQ2ID0gegora2V5Y29kZSAgNDcgPSB4ICAgICAgICAgICAgICAgCitrZXljb2RlICA0OCA9IGMKK2tleWNvZGUgIDQ5ID0gdiAgICAgICAgICAgICAgIAora2V5Y29kZSAgNTAgPSBiICAgICAgICAgICAgICAgCitrZXljb2RlICA1MSA9IG4KK2tleWNvZGUgIDUyID0gbQora2V5Y29kZSAgNTMgPSBjb21tYSAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDUxID0gTWV0YV9jb21tYSAgICAgIAora2V5Y29kZSAgNTQgPSBwZXJpb2QgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDUyID0gQ29tcG9zZSAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNTIgPSBNZXRhX3BlcmlvZCAgICAgCitrZXljb2RlICA1NSA9IHNsYXNoICAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNTMgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA1MyA9IE1ldGFfc2xhc2ggICAgICAKK2tleWNvZGUgIDU3ID0gU2hpZnQKK2tleWNvZGUgIDU4ID0gQ29udHJvbAora2V5Y29kZSAgNjAgPSBBbHQKK2tleWNvZGUgIDYxID0gc3BhY2UgICAgICAgICAgICBzcGFjZSAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA2MSA9IG51bCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDYxID0gTWV0YV9zcGFjZSAgICAgIAora2V5Y29kZSAgNjIgPSBBbHQKKwora2V5Y29kZSA3NSA9IEluc2VydCAgICAgICAgICAKK2tleWNvZGUgNzYgPSBEZWxldGUgICAgICAgICAgCisKK2tleWNvZGUgODMgPSBVcCAgICAgICAgICAgICAgCitrZXljb2RlIDg0ID0gRG93biAgICAgICAgICAgICAgCisKK2tleWNvZGUgODUgPSBQcmlvciAgICAgICAgICAgCisJc2hpZnQgICBrZXljb2RlIDg1ID0gU2Nyb2xsX0JhY2t3YXJkIAora2V5Y29kZSA4NiA9IE5leHQgICAgICAgICAgICAKKwlzaGlmdCAgIGtleWNvZGUgODYgPSBTY3JvbGxfRm9yd2FyZCAgCitrZXljb2RlIDg5ID0gUmlnaHQgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSA4OSA9IEluY3JfQ29uc29sZQora2V5Y29kZSA3OSA9IExlZnQgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgNzkgPSBEZWNyX0NvbnNvbGUKKwora2V5Y29kZSAgOTAgPSBOdW1fTG9jaworCXNoaWZ0ICAga2V5Y29kZSAgOTAgPSBCYXJlX051bV9Mb2NrCisKK2tleWNvZGUgOTEgPSBtaW51cwora2V5Y29kZSA5MiA9IHBsdXMKK2tleWNvZGUgOTMgPSBLUF9NdWx0aXBseQora2V5Y29kZSA5NCA9IHBlcmlvZAora2V5Y29kZSA5NSA9IEtQX0RpdmlkZQorCitrZXljb2RlIDEwNyA9IFNlbGVjdCAgICAgICAgICAKK2tleWNvZGUgMTA4ID0gRG93biAgICAgICAgICAgIAorCitrZXljb2RlIDExMCA9IEVzY2FwZSAgICAgICAgICAgRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgIDEgPSBNZXRhX0VzY2FwZSAgICAgCisKK2tleWNvZGUgIDExMiA9IEYxICAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgIENvbnNvbGVfMTMgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExMiA9IEYxICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExMiA9IENvbnNvbGVfMSAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTEyID0gQ29uc29sZV8xICAgICAgIAora2V5Y29kZSAgMTEzID0gRjIgICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICAgQ29uc29sZV8xNCAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTEzID0gRjIgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEzID0gQ29uc29sZV8yICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTMgPSBDb25zb2xlXzIgICAgICAgCitrZXljb2RlICAxMTQgPSBGMyAgICAgICAgICAgICAgRjEzICAgICAgICAgICAgICBDb25zb2xlXzE1ICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTQgPSBGMyAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTQgPSBDb25zb2xlXzMgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExNCA9IENvbnNvbGVfMyAgICAgICAKK2tleWNvZGUgIDExNSA9IEY0ICAgICAgICAgICAgICBGMTQgICAgICAgICAgICAgIENvbnNvbGVfMTYgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExNSA9IEY0ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExNSA9IENvbnNvbGVfNCAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTE1ID0gQ29uc29sZV80ICAgICAgIAora2V5Y29kZSAgMTE2ID0gRjUgICAgICAgICAgICAgIEYxNSAgICAgICAgICAgICAgQ29uc29sZV8xNyAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTE2ID0gRjUgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTE2ID0gQ29uc29sZV81ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTYgPSBDb25zb2xlXzUgICAgICAgCitrZXljb2RlICAxMTcgPSBGNiAgICAgICAgICAgICAgRjE2ICAgICAgICAgICAgICBDb25zb2xlXzE4ICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTcgPSBGNiAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTcgPSBDb25zb2xlXzYgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExNyA9IENvbnNvbGVfNiAgICAgICAKK2tleWNvZGUgIDExOCA9IEY3ICAgICAgICAgICAgICBGMTcgICAgICAgICAgICAgIENvbnNvbGVfMTkgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExOCA9IEY3ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExOCA9IENvbnNvbGVfNyAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTE4ID0gQ29uc29sZV83ICAgICAgIAora2V5Y29kZSAgMTE5ID0gRjggICAgICAgICAgICAgIEYxOCAgICAgICAgICAgICAgQ29uc29sZV8yMCAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTE5ID0gRjggICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTE5ID0gQ29uc29sZV84ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTkgPSBDb25zb2xlXzggICAgICAgCitrZXljb2RlICAxMjAgPSBGOSAgICAgICAgICAgICAgRjE5ICAgICAgICAgICAgICBDb25zb2xlXzIxICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMjAgPSBGOSAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMjAgPSBDb25zb2xlXzkgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDEyMCA9IENvbnNvbGVfOSAgICAgICAKK2tleWNvZGUgIDEyMSA9IEYxMCAgICAgICAgICAgICBGMjAgICAgICAgICAgICAgIENvbnNvbGVfMjIgICAgICAKKwljb250cm9sIGtleWNvZGUgIDEyMSA9IEYxMCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEyMSA9IENvbnNvbGVfMTAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTIxID0gQ29uc29sZV8xMCAgICAgIAorCQora2V5Y29kZSAxMjYgPSBQYXVzZSAgICAgICAgICAgCisKKworc3RyaW5nIEYxID0gIlwwMzNbW0EiCitzdHJpbmcgRjIgPSAiXDAzM1tbQiIKK3N0cmluZyBGMyA9ICJcMDMzW1tDIgorc3RyaW5nIEY0ID0gIlwwMzNbW0QiCitzdHJpbmcgRjUgPSAiXDAzM1tbRSIKK3N0cmluZyBGNiA9ICJcMDMzWzE3fiIKK3N0cmluZyBGNyA9ICJcMDMzWzE4fiIKK3N0cmluZyBGOCA9ICJcMDMzWzE5fiIKK3N0cmluZyBGOSA9ICJcMDMzWzIwfiIKK3N0cmluZyBGMTAgPSAiXDAzM1syMX4iCitzdHJpbmcgRjExID0gIlwwMzNbMjN+Igorc3RyaW5nIEYxMiA9ICJcMDMzWzI0fiIKK3N0cmluZyBGMTMgPSAiXDAzM1syNX4iCitzdHJpbmcgRjE0ID0gIlwwMzNbMjZ+Igorc3RyaW5nIEYxNSA9ICJcMDMzWzI4fiIKK3N0cmluZyBGMTYgPSAiXDAzM1syOX4iCitzdHJpbmcgRjE3ID0gIlwwMzNbMzF+Igorc3RyaW5nIEYxOCA9ICJcMDMzWzMyfiIKK3N0cmluZyBGMTkgPSAiXDAzM1szM34iCitzdHJpbmcgRjIwID0gIlwwMzNbMzR+Igorc3RyaW5nIEZpbmQgPSAiXDAzM1sxfiIKK3N0cmluZyBJbnNlcnQgPSAiXDAzM1syfiIKK3N0cmluZyBSZW1vdmUgPSAiXDAzM1szfiIKK3N0cmluZyBTZWxlY3QgPSAiXDAzM1s0fiIKK3N0cmluZyBQcmlvciA9ICJcMDMzWzV+Igorc3RyaW5nIE5leHQgPSAiXDAzM1s2fiIKK3N0cmluZyBNYWNybyA9ICJcMDMzW00iCitzdHJpbmcgUGF1c2UgPSAiXDAzM1tQIgorY29tcG9zZSAnYCcgJ0EnIHRvICfAJworY29tcG9zZSAnYCcgJ2EnIHRvICfgJworY29tcG9zZSAnXCcnICdBJyB0byAnwScKK2NvbXBvc2UgJ1wnJyAnYScgdG8gJ+EnCitjb21wb3NlICdeJyAnQScgdG8gJ8InCitjb21wb3NlICdeJyAnYScgdG8gJ+InCitjb21wb3NlICd+JyAnQScgdG8gJ8MnCitjb21wb3NlICd+JyAnYScgdG8gJ+MnCitjb21wb3NlICciJyAnQScgdG8gJ8QnCitjb21wb3NlICciJyAnYScgdG8gJ+QnCitjb21wb3NlICdPJyAnQScgdG8gJ8UnCitjb21wb3NlICdvJyAnYScgdG8gJ+UnCitjb21wb3NlICcwJyAnQScgdG8gJ8UnCitjb21wb3NlICcwJyAnYScgdG8gJ+UnCitjb21wb3NlICdBJyAnQScgdG8gJ8UnCitjb21wb3NlICdhJyAnYScgdG8gJ+UnCitjb21wb3NlICdBJyAnRScgdG8gJ8YnCitjb21wb3NlICdhJyAnZScgdG8gJ+YnCitjb21wb3NlICcsJyAnQycgdG8gJ8cnCitjb21wb3NlICcsJyAnYycgdG8gJ+cnCitjb21wb3NlICdgJyAnRScgdG8gJ8gnCitjb21wb3NlICdgJyAnZScgdG8gJ+gnCitjb21wb3NlICdcJycgJ0UnIHRvICfJJworY29tcG9zZSAnXCcnICdlJyB0byAn6ScKK2NvbXBvc2UgJ14nICdFJyB0byAnyicKK2NvbXBvc2UgJ14nICdlJyB0byAn6icKK2NvbXBvc2UgJyInICdFJyB0byAnyycKK2NvbXBvc2UgJyInICdlJyB0byAn6ycKK2NvbXBvc2UgJ2AnICdJJyB0byAnzCcKK2NvbXBvc2UgJ2AnICdpJyB0byAn7CcKK2NvbXBvc2UgJ1wnJyAnSScgdG8gJ80nCitjb21wb3NlICdcJycgJ2knIHRvICftJworY29tcG9zZSAnXicgJ0knIHRvICfOJworY29tcG9zZSAnXicgJ2knIHRvICfuJworY29tcG9zZSAnIicgJ0knIHRvICfPJworY29tcG9zZSAnIicgJ2knIHRvICfvJworY29tcG9zZSAnLScgJ0QnIHRvICfQJworY29tcG9zZSAnLScgJ2QnIHRvICfwJworY29tcG9zZSAnficgJ04nIHRvICfRJworY29tcG9zZSAnficgJ24nIHRvICfxJworY29tcG9zZSAnYCcgJ08nIHRvICfSJworY29tcG9zZSAnYCcgJ28nIHRvICfyJworY29tcG9zZSAnXCcnICdPJyB0byAn0ycKK2NvbXBvc2UgJ1wnJyAnbycgdG8gJ/MnCitjb21wb3NlICdeJyAnTycgdG8gJ9QnCitjb21wb3NlICdeJyAnbycgdG8gJ/QnCitjb21wb3NlICd+JyAnTycgdG8gJ9UnCitjb21wb3NlICd+JyAnbycgdG8gJ/UnCitjb21wb3NlICciJyAnTycgdG8gJ9YnCitjb21wb3NlICciJyAnbycgdG8gJ/YnCitjb21wb3NlICcvJyAnTycgdG8gJ9gnCitjb21wb3NlICcvJyAnbycgdG8gJ/gnCitjb21wb3NlICdgJyAnVScgdG8gJ9knCitjb21wb3NlICdgJyAndScgdG8gJ/knCitjb21wb3NlICdcJycgJ1UnIHRvICfaJworY29tcG9zZSAnXCcnICd1JyB0byAn+icKK2NvbXBvc2UgJ14nICdVJyB0byAn2ycKK2NvbXBvc2UgJ14nICd1JyB0byAn+ycKK2NvbXBvc2UgJyInICdVJyB0byAn3CcKK2NvbXBvc2UgJyInICd1JyB0byAn/CcKK2NvbXBvc2UgJ1wnJyAnWScgdG8gJ90nCitjb21wb3NlICdcJycgJ3knIHRvICf9JworY29tcG9zZSAnVCcgJ0gnIHRvICfeJworY29tcG9zZSAndCcgJ2gnIHRvICf+JworY29tcG9zZSAncycgJ3MnIHRvICffJworY29tcG9zZSAnIicgJ3knIHRvICf/JworY29tcG9zZSAncycgJ3onIHRvICffJworY29tcG9zZSAnaScgJ2onIHRvICf/JwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWI1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKQEAgLTAsMCArMSwxNjI5IEBACisvKgorICogcmFuZG9tLmMgLS0gQSBzdHJvbmcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCisgKiBWZXJzaW9uIDEuODksIGxhc3QgbW9kaWZpZWQgMTktU2VwLTk5CisgKgorICogQ29weXJpZ2h0IFRoZW9kb3JlIFRzJ28sIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkuICBBbGwKKyAqIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHByb2R1Y3QgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlCisgKiByZXF1aXJlZCBJTlNURUFEIE9GIHRoZSBhYm92ZSByZXN0cmljdGlvbnMuICAoVGhpcyBjbGF1c2UgaXMKKyAqIG5lY2Vzc2FyeSBkdWUgdG8gYSBwb3RlbnRpYWwgYmFkIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIEdQTCBhbmQKKyAqIHRoZSByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIGEgQlNELXN0eWxlIGNvcHlyaWdodC4pCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKi8KKworLyoKKyAqIChub3csIHdpdGggbGVnYWwgQi5TLiBvdXQgb2YgdGhlIHdheS4uLi4uKQorICoKKyAqIFRoaXMgcm91dGluZSBnYXRoZXJzIGVudmlyb25tZW50YWwgbm9pc2UgZnJvbSBkZXZpY2UgZHJpdmVycywgZXRjLiwKKyAqIGFuZCByZXR1cm5zIGdvb2QgcmFuZG9tIG51bWJlcnMsIHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4KKyAqIEJlc2lkZXMgdGhlIG9idmlvdXMgY3J5cHRvZ3JhcGhpYyB1c2VzLCB0aGVzZSBudW1iZXJzIGFyZSBhbHNvIGdvb2QKKyAqIGZvciBzZWVkaW5nIFRDUCBzZXF1ZW5jZSBudW1iZXJzLCBhbmQgb3RoZXIgcGxhY2VzIHdoZXJlIGl0IGlzCisgKiBkZXNpcmFibGUgdG8gaGF2ZSBudW1iZXJzIHdoaWNoIGFyZSBub3Qgb25seSByYW5kb20sIGJ1dCBoYXJkIHRvCisgKiBwcmVkaWN0IGJ5IGFuIGF0dGFja2VyLgorICoKKyAqIFRoZW9yeSBvZiBvcGVyYXRpb24KKyAqID09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBDb21wdXRlcnMgYXJlIHZlcnkgcHJlZGljdGFibGUgZGV2aWNlcy4gIEhlbmNlIGl0IGlzIGV4dHJlbWVseSBoYXJkCisgKiB0byBwcm9kdWNlIHRydWx5IHJhbmRvbSBudW1iZXJzIG9uIGEgY29tcHV0ZXIgLS0tIGFzIG9wcG9zZWQgdG8KKyAqIHBzZXVkby1yYW5kb20gbnVtYmVycywgd2hpY2ggY2FuIGVhc2lseSBnZW5lcmF0ZWQgYnkgdXNpbmcgYQorICogYWxnb3JpdGhtLiAgVW5mb3J0dW5hdGVseSwgaXQgaXMgdmVyeSBlYXN5IGZvciBhdHRhY2tlcnMgdG8gZ3Vlc3MKKyAqIHRoZSBzZXF1ZW5jZSBvZiBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCBhbmQgZm9yIHNvbWUKKyAqIGFwcGxpY2F0aW9ucyB0aGlzIGlzIG5vdCBhY2NlcHRhYmxlLiAgU28gaW5zdGVhZCwgd2UgbXVzdCB0cnkgdG8KKyAqIGdhdGhlciAiZW52aXJvbm1lbnRhbCBub2lzZSIgZnJvbSB0aGUgY29tcHV0ZXIncyBlbnZpcm9ubWVudCwgd2hpY2gKKyAqIG11c3QgYmUgaGFyZCBmb3Igb3V0c2lkZSBhdHRhY2tlcnMgdG8gb2JzZXJ2ZSwgYW5kIHVzZSB0aGF0IHRvCisgKiBnZW5lcmF0ZSByYW5kb20gbnVtYmVycy4gIEluIGEgVW5peCBlbnZpcm9ubWVudCwgdGhpcyBpcyBiZXN0IGRvbmUKKyAqIGZyb20gaW5zaWRlIHRoZSBrZXJuZWwuCisgKgorICogU291cmNlcyBvZiByYW5kb21uZXNzIGZyb20gdGhlIGVudmlyb25tZW50IGluY2x1ZGUgaW50ZXIta2V5Ym9hcmQKKyAqIHRpbWluZ3MsIGludGVyLWludGVycnVwdCB0aW1pbmdzIGZyb20gc29tZSBpbnRlcnJ1cHRzLCBhbmQgb3RoZXIKKyAqIGV2ZW50cyB3aGljaCBhcmUgYm90aCAoYSkgbm9uLWRldGVybWluaXN0aWMgYW5kIChiKSBoYXJkIGZvciBhbgorICogb3V0c2lkZSBvYnNlcnZlciB0byBtZWFzdXJlLiAgUmFuZG9tbmVzcyBmcm9tIHRoZXNlIHNvdXJjZXMgYXJlCisgKiBhZGRlZCB0byBhbiAiZW50cm9weSBwb29sIiwgd2hpY2ggaXMgbWl4ZWQgdXNpbmcgYSBDUkMtbGlrZSBmdW5jdGlvbi4KKyAqIFRoaXMgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZywgYnV0IGl0IGlzIGFkZXF1YXRlIGFzc3VtaW5nCisgKiB0aGUgcmFuZG9tbmVzcyBpcyBub3QgY2hvc2VuIG1hbGljaW91c2x5LCBhbmQgaXQgaXMgZmFzdCBlbm91Z2ggdGhhdAorICogdGhlIG92ZXJoZWFkIG9mIGRvaW5nIGl0IG9uIGV2ZXJ5IGludGVycnVwdCBpcyB2ZXJ5IHJlYXNvbmFibGUuCisgKiBBcyByYW5kb20gYnl0ZXMgYXJlIG1peGVkIGludG8gdGhlIGVudHJvcHkgcG9vbCwgdGhlIHJvdXRpbmVzIGtlZXAKKyAqIGFuICplc3RpbWF0ZSogb2YgaG93IG1hbnkgYml0cyBvZiByYW5kb21uZXNzIGhhdmUgYmVlbiBzdG9yZWQgaW50bworICogdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yJ3MgaW50ZXJuYWwgc3RhdGUuCisgKgorICogV2hlbiByYW5kb20gYnl0ZXMgYXJlIGRlc2lyZWQsIHRoZXkgYXJlIG9idGFpbmVkIGJ5IHRha2luZyB0aGUgU0hBCisgKiBoYXNoIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgImVudHJvcHkgcG9vbCIuICBUaGUgU0hBIGhhc2ggYXZvaWRzCisgKiBleHBvc2luZyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGVudHJvcHkgcG9vbC4gIEl0IGlzIGJlbGlldmVkIHRvCisgKiBiZSBjb21wdXRhdGlvbmFsbHkgaW5mZWFzaWJsZSB0byBkZXJpdmUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbgorICogYWJvdXQgdGhlIGlucHV0IG9mIFNIQSBmcm9tIGl0cyBvdXRwdXQuICBFdmVuIGlmIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBhbmFseXplIFNIQSBpbiBzb21lIGNsZXZlciB3YXksIGFzIGxvbmcgYXMgdGhlIGFtb3VudCBvZiBkYXRhCisgKiByZXR1cm5lZCBmcm9tIHRoZSBnZW5lcmF0b3IgaXMgbGVzcyB0aGFuIHRoZSBpbmhlcmVudCBlbnRyb3B5IGluCisgKiB0aGUgcG9vbCwgdGhlIG91dHB1dCBkYXRhIGlzIHRvdGFsbHkgdW5wcmVkaWN0YWJsZS4gIEZvciB0aGlzCisgKiByZWFzb24sIHRoZSByb3V0aW5lIGRlY3JlYXNlcyBpdHMgaW50ZXJuYWwgZXN0aW1hdGUgb2YgaG93IG1hbnkKKyAqIGJpdHMgb2YgInRydWUgcmFuZG9tbmVzcyIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZW50cm9weSBwb29sIGFzIGl0CisgKiBvdXRwdXRzIHJhbmRvbSBudW1iZXJzLgorICoKKyAqIElmIHRoaXMgZXN0aW1hdGUgZ29lcyB0byB6ZXJvLCB0aGUgcm91dGluZSBjYW4gc3RpbGwgZ2VuZXJhdGUKKyAqIHJhbmRvbSBudW1iZXJzOyBob3dldmVyLCBhbiBhdHRhY2tlciBtYXkgKGF0IGxlYXN0IGluIHRoZW9yeSkgYmUKKyAqIGFibGUgdG8gaW5mZXIgdGhlIGZ1dHVyZSBvdXRwdXQgb2YgdGhlIGdlbmVyYXRvciBmcm9tIHByaW9yCisgKiBvdXRwdXRzLiAgVGhpcyByZXF1aXJlcyBzdWNjZXNzZnVsIGNyeXB0YW5hbHlzaXMgb2YgU0hBLCB3aGljaCBpcworICogbm90IGJlbGlldmVkIHRvIGJlIGZlYXNpYmxlLCBidXQgdGhlcmUgaXMgYSByZW1vdGUgcG9zc2liaWxpdHkuCisgKiBOb25ldGhlbGVzcywgdGhlc2UgbnVtYmVycyBzaG91bGQgYmUgdXNlZnVsIGZvciB0aGUgdmFzdCBtYWpvcml0eQorICogb2YgcHVycG9zZXMuCisgKgorICogRXhwb3J0ZWQgaW50ZXJmYWNlcyAtLS0tIG91dHB1dAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBleHBvcnRlZCBpbnRlcmZhY2VzOyB0aGUgZmlyc3QgaXMgb25lIGRlc2lnbmVkIHRvCisgKiBiZSB1c2VkIGZyb20gd2l0aGluIHRoZSBrZXJuZWw6CisgKgorICogCXZvaWQgZ2V0X3JhbmRvbV9ieXRlcyh2b2lkICpidWYsIGludCBuYnl0ZXMpOworICoKKyAqIFRoaXMgaW50ZXJmYWNlIHdpbGwgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHJhbmRvbSBieXRlcywKKyAqIGFuZCBwbGFjZSBpdCBpbiB0aGUgcmVxdWVzdGVkIGJ1ZmZlci4KKyAqCisgKiBUaGUgdHdvIG90aGVyIGludGVyZmFjZXMgYXJlIHR3byBjaGFyYWN0ZXIgZGV2aWNlcyAvZGV2L3JhbmRvbSBhbmQKKyAqIC9kZXYvdXJhbmRvbS4gIC9kZXYvcmFuZG9tIGlzIHN1aXRhYmxlIGZvciB1c2Ugd2hlbiB2ZXJ5IGhpZ2gKKyAqIHF1YWxpdHkgcmFuZG9tbmVzcyBpcyBkZXNpcmVkIChmb3IgZXhhbXBsZSwgZm9yIGtleSBnZW5lcmF0aW9uIG9yCisgKiBvbmUtdGltZSBwYWRzKSwgYXMgaXQgd2lsbCBvbmx5IHJldHVybiBhIG1heGltdW0gb2YgdGhlIG51bWJlciBvZgorICogYml0cyBvZiByYW5kb21uZXNzIChhcyBlc3RpbWF0ZWQgYnkgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yKQorICogY29udGFpbmVkIGluIHRoZSBlbnRyb3B5IHBvb2wuCisgKgorICogVGhlIC9kZXYvdXJhbmRvbSBkZXZpY2UgZG9lcyBub3QgaGF2ZSB0aGlzIGxpbWl0LCBhbmQgd2lsbCByZXR1cm4KKyAqIGFzIG1hbnkgYnl0ZXMgYXMgYXJlIHJlcXVlc3RlZC4gIEFzIG1vcmUgYW5kIG1vcmUgcmFuZG9tIGJ5dGVzIGFyZQorICogcmVxdWVzdGVkIHdpdGhvdXQgZ2l2aW5nIHRpbWUgZm9yIHRoZSBlbnRyb3B5IHBvb2wgdG8gcmVjaGFyZ2UsCisgKiB0aGlzIHdpbGwgcmVzdWx0IGluIHJhbmRvbSBudW1iZXJzIHRoYXQgYXJlIG1lcmVseSBjcnlwdG9ncmFwaGljYWxseQorICogc3Ryb25nLiAgRm9yIG1hbnkgYXBwbGljYXRpb25zLCBob3dldmVyLCB0aGlzIGlzIGFjY2VwdGFibGUuCisgKgorICogRXhwb3J0ZWQgaW50ZXJmYWNlcyAtLS0tIGlucHV0CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGUgY3VycmVudCBleHBvcnRlZCBpbnRlcmZhY2VzIGZvciBnYXRoZXJpbmcgZW52aXJvbm1lbnRhbCBub2lzZQorICogZnJvbSB0aGUgZGV2aWNlcyBhcmU6CisgKgorICogCXZvaWQgYWRkX2lucHV0X3JhbmRvbW5lc3ModW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSk7CisgKiAJdm9pZCBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaW50IGlycSk7CisgKgorICogYWRkX2lucHV0X3JhbmRvbW5lc3MoKSB1c2VzIHRoZSBpbnB1dCBsYXllciBpbnRlcnJ1cHQgdGltaW5nLCBhcyB3ZWxsIGFzCisgKiB0aGUgZXZlbnQgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoKSB1c2VzIHRoZSBpbnRlci1pbnRlcnJ1cHQgdGltaW5nIGFzIHJhbmRvbQorICogaW5wdXRzIHRvIHRoZSBlbnRyb3B5IHBvb2wuICBOb3RlIHRoYXQgbm90IGFsbCBpbnRlcnJ1cHRzIGFyZSBnb29kCisgKiBzb3VyY2VzIG9mIHJhbmRvbW5lc3MhICBGb3IgZXhhbXBsZSwgdGhlIHRpbWVyIGludGVycnVwdHMgaXMgbm90IGEKKyAqIGdvb2QgY2hvaWNlLCBiZWNhdXNlIHRoZSBwZXJpb2RpY2l0eSBvZiB0aGUgaW50ZXJydXB0cyBpcyB0b28KKyAqIHJlZ3VsYXIsIGFuZCBoZW5jZSBwcmVkaWN0YWJsZSB0byBhbiBhdHRhY2tlci4gIERpc2sgaW50ZXJydXB0cyBhcmUKKyAqIGEgYmV0dGVyIG1lYXN1cmUsIHNpbmNlIHRoZSB0aW1pbmcgb2YgdGhlIGRpc2sgaW50ZXJydXB0cyBhcmUgbW9yZQorICogdW5wcmVkaWN0YWJsZS4KKyAqCisgKiBBbGwgb2YgdGhlc2Ugcm91dGluZXMgdHJ5IHRvIGVzdGltYXRlIGhvdyBtYW55IGJpdHMgb2YgcmFuZG9tbmVzcyBhCisgKiBwYXJ0aWN1bGFyIHJhbmRvbW5lc3Mgc291cmNlLiAgVGhleSBkbyB0aGlzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCisgKiBmaXJzdCBhbmQgc2Vjb25kIG9yZGVyIGRlbHRhcyBvZiB0aGUgZXZlbnQgdGltaW5ncy4KKyAqCisgKiBFbnN1cmluZyB1bnByZWRpY3RhYmlsaXR5IGF0IHN5c3RlbSBzdGFydHVwCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFdoZW4gYW55IG9wZXJhdGluZyBzeXN0ZW0gc3RhcnRzIHVwLCBpdCB3aWxsIGdvIHRocm91Z2ggYSBzZXF1ZW5jZQorICogb2YgYWN0aW9ucyB0aGF0IGFyZSBmYWlybHkgcHJlZGljdGFibGUgYnkgYW4gYWR2ZXJzYXJ5LCBlc3BlY2lhbGx5CisgKiBpZiB0aGUgc3RhcnQtdXAgZG9lcyBub3QgaW52b2x2ZSBpbnRlcmFjdGlvbiB3aXRoIGEgaHVtYW4gb3BlcmF0b3IuCisgKiBUaGlzIHJlZHVjZXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYml0cyBvZiB1bnByZWRpY3RhYmlsaXR5IGluIHRoZQorICogZW50cm9weSBwb29sIGJlbG93IHRoZSB2YWx1ZSBpbiBlbnRyb3B5X2NvdW50LiAgSW4gb3JkZXIgdG8KKyAqIGNvdW50ZXJhY3QgdGhpcyBlZmZlY3QsIGl0IGhlbHBzIHRvIGNhcnJ5IGluZm9ybWF0aW9uIGluIHRoZQorICogZW50cm9weSBwb29sIGFjcm9zcyBzaHV0LWRvd25zIGFuZCBzdGFydC11cHMuICBUbyBkbyB0aGlzLCBwdXQgdGhlCisgKiBmb2xsb3dpbmcgbGluZXMgYW4gYXBwcm9wcmlhdGUgc2NyaXB0IHdoaWNoIGlzIHJ1biBkdXJpbmcgdGhlIGJvb3QKKyAqIHNlcXVlbmNlOgorICoKKyAqCWVjaG8gIkluaXRpYWxpemluZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4uLiIKKyAqCXJhbmRvbV9zZWVkPS92YXIvcnVuL3JhbmRvbS1zZWVkCisgKgkjIENhcnJ5IGEgcmFuZG9tIHNlZWQgZnJvbSBzdGFydC11cCB0byBzdGFydC11cAorICoJIyBMb2FkIGFuZCB0aGVuIHNhdmUgdGhlIHdob2xlIGVudHJvcHkgcG9vbAorICoJaWYgWyAtZiAkcmFuZG9tX3NlZWQgXTsgdGhlbgorICoJCWNhdCAkcmFuZG9tX3NlZWQgPi9kZXYvdXJhbmRvbQorICoJZWxzZQorICoJCXRvdWNoICRyYW5kb21fc2VlZAorICoJZmkKKyAqCWNobW9kIDYwMCAkcmFuZG9tX3NlZWQKKyAqCWRkIGlmPS9kZXYvdXJhbmRvbSBvZj0kcmFuZG9tX3NlZWQgY291bnQ9MSBicz01MTIKKyAqCisgKiBhbmQgdGhlIGZvbGxvd2luZyBsaW5lcyBpbiBhbiBhcHByb3ByaWF0ZSBzY3JpcHQgd2hpY2ggaXMgcnVuIGFzCisgKiB0aGUgc3lzdGVtIGlzIHNodXRkb3duOgorICoKKyAqCSMgQ2FycnkgYSByYW5kb20gc2VlZCBmcm9tIHNodXQtZG93biB0byBzdGFydC11cAorICoJIyBTYXZlIHRoZSB3aG9sZSBlbnRyb3B5IHBvb2wKKyAqCWVjaG8gIlNhdmluZyByYW5kb20gc2VlZC4uLiIKKyAqCXJhbmRvbV9zZWVkPS92YXIvcnVuL3JhbmRvbS1zZWVkCisgKgl0b3VjaCAkcmFuZG9tX3NlZWQKKyAqCWNobW9kIDYwMCAkcmFuZG9tX3NlZWQKKyAqCWRkIGlmPS9kZXYvdXJhbmRvbSBvZj0kcmFuZG9tX3NlZWQgY291bnQ9MSBicz01MTIKKyAqCisgKiBGb3IgZXhhbXBsZSwgb24gbW9zdCBtb2Rlcm4gc3lzdGVtcyB1c2luZyB0aGUgU3lzdGVtIFYgaW5pdAorICogc2NyaXB0cywgc3VjaCBjb2RlIGZyYWdtZW50cyB3b3VsZCBiZSBmb3VuZCBpbgorICogL2V0Yy9yYy5kL2luaXQuZC9yYW5kb20uICBPbiBvbGRlciBMaW51eCBzeXN0ZW1zLCB0aGUgY29ycmVjdCBzY3JpcHQKKyAqIGxvY2F0aW9uIG1pZ2h0IGJlIGluIC9ldGMvcmNiLmQvcmMubG9jYWwgb3IgL2V0Yy9yYy5kL3JjLjAuCisgKgorICogRWZmZWN0aXZlbHksIHRoZXNlIGNvbW1hbmRzIGNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgZW50cm9weSBwb29sCisgKiB0byBiZSBzYXZlZCBhdCBzaHV0LWRvd24gdGltZSBhbmQgcmVsb2FkZWQgaW50byB0aGUgZW50cm9weSBwb29sIGF0CisgKiBzdGFydC11cC4gIChUaGUgJ2RkJyBpbiB0aGUgYWRkaXRpb24gdG8gdGhlIGJvb3R1cCBzY3JpcHQgaXMgdG8KKyAqIG1ha2Ugc3VyZSB0aGF0IC9ldGMvcmFuZG9tLXNlZWQgaXMgZGlmZmVyZW50IGZvciBldmVyeSBzdGFydC11cCwKKyAqIGV2ZW4gaWYgdGhlIHN5c3RlbSBjcmFzaGVzIHdpdGhvdXQgZXhlY3V0aW5nIHJjLjAuKSAgRXZlbiB3aXRoCisgKiBjb21wbGV0ZSBrbm93bGVkZ2Ugb2YgdGhlIHN0YXJ0LXVwIGFjdGl2aXRpZXMsIHByZWRpY3RpbmcgdGhlIHN0YXRlCisgKiBvZiB0aGUgZW50cm9weSBwb29sIHJlcXVpcmVzIGtub3dsZWRnZSBvZiB0aGUgcHJldmlvdXMgaGlzdG9yeSBvZgorICogdGhlIHN5c3RlbS4KKyAqCisgKiBDb25maWd1cmluZyB0aGUgL2Rldi9yYW5kb20gZHJpdmVyIHVuZGVyIExpbnV4CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlIC9kZXYvcmFuZG9tIGRyaXZlciB1bmRlciBMaW51eCB1c2VzIG1pbm9yIG51bWJlcnMgOCBhbmQgOSBvZgorICogdGhlIC9kZXYvbWVtIG1ham9yIG51bWJlciAoIzEpLiAgU28gaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZQorICogL2Rldi9yYW5kb20gYW5kIC9kZXYvdXJhbmRvbSBjcmVhdGVkIGFscmVhZHksIHRoZXkgY2FuIGJlIGNyZWF0ZWQKKyAqIGJ5IHVzaW5nIHRoZSBjb21tYW5kczoKKyAqCisgKiAJbWtub2QgL2Rldi9yYW5kb20gYyAxIDgKKyAqIAlta25vZCAvZGV2L3VyYW5kb20gYyAxIDkKKyAqCisgKiBBY2tub3dsZWRnZW1lbnRzOgorICogPT09PT09PT09PT09PT09PT0KKyAqCisgKiBJZGVhcyBmb3IgY29uc3RydWN0aW5nIHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2VyZSBkZXJpdmVkCisgKiBmcm9tIFByZXR0eSBHb29kIFByaXZhY3kncyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYW5kIGZyb20gcHJpdmF0ZQorICogZGlzY3Vzc2lvbnMgd2l0aCBQaGlsIEthcm4uICBDb2xpbiBQbHVtYiBwcm92aWRlZCBhIGZhc3RlciByYW5kb20KKyAqIG51bWJlciBnZW5lcmF0b3IsIHdoaWNoIHNwZWVkIHVwIHRoZSBtaXhpbmcgZnVuY3Rpb24gb2YgdGhlIGVudHJvcHkKKyAqIHBvb2wsIHRha2VuIGZyb20gUEdQZm9uZS4gIERhbGUgV29ybGV5IGhhcyBhbHNvIGNvbnRyaWJ1dGVkIG1hbnkKKyAqIHVzZWZ1bCBpZGVhcyBhbmQgc3VnZ2VzdGlvbnMgdG8gaW1wcm92ZSB0aGlzIGRyaXZlci4KKyAqCisgKiBBbnkgZmxhd3MgaW4gdGhlIGRlc2lnbiBhcmUgc29sZWx5IG15IHJlc3BvbnNpYmlsaXR5LCBhbmQgc2hvdWxkCisgKiBub3QgYmUgYXR0cmlidXRlZCB0byB0aGUgUGhpbCwgQ29saW4sIG9yIGFueSBvZiBhdXRob3JzIG9mIFBHUC4KKyAqCisgKiBGdXJ0aGVyIGJhY2tncm91bmQgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYyBtYXkgYmUgb2J0YWluZWQgZnJvbQorICogUkZDIDE3NTAsICJSYW5kb21uZXNzIFJlY29tbWVuZGF0aW9ucyBmb3IgU2VjdXJpdHkiLCBieSBEb25hbGQKKyAqIEVhc3RsYWtlLCBTdGV2ZSBDcm9ja2VyLCBhbmQgSmVmZiBTY2hpbGxlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgSU5QVVRfUE9PTF9XT1JEUyAxMjgKKyNkZWZpbmUgT1VUUFVUX1BPT0xfV09SRFMgMzIKKyNkZWZpbmUgU0VDX1hGRVJfU0laRSA1MTIKKworLyoKKyAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIG9mIGVudHJvcHkgYmVmb3JlIHdlIHdha2UgdXAgYSByZWFkIG9uCisgKiAvZGV2L3JhbmRvbS4gIFNob3VsZCBiZSBlbm91Z2ggdG8gZG8gYSBzaWduaWZpY2FudCByZXNlZWQuCisgKi8KK3N0YXRpYyBpbnQgcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCA9IDY0OworCisvKgorICogSWYgdGhlIGVudHJvcHkgY291bnQgZmFsbHMgdW5kZXIgdGhpcyBudW1iZXIgb2YgYml0cywgdGhlbiB3ZQorICogc2hvdWxkIHdha2UgdXAgcHJvY2Vzc2VzIHdoaWNoIGFyZSBzZWxlY3Rpbmcgb3IgcG9sbGluZyBvbiB3cml0ZQorICogYWNjZXNzIHRvIC9kZXYvcmFuZG9tLgorICovCitzdGF0aWMgaW50IHJhbmRvbV93cml0ZV93YWtldXBfdGhyZXNoID0gMTI4OworCisvKgorICogV2hlbiB0aGUgaW5wdXQgcG9vbCBnb2VzIG92ZXIgdHJpY2tsZV90aHJlc2gsIHN0YXJ0IGRyb3BwaW5nIG1vc3QKKyAqIHNhbXBsZXMgdG8gYXZvaWQgd2FzdGluZyBDUFUgdGltZSBhbmQgcmVkdWNlIGxvY2sgY29udGVudGlvbi4KKyAqLworCitzdGF0aWMgaW50IHRyaWNrbGVfdGhyZXNoID0gSU5QVVRfUE9PTF9XT1JEUyAqIDI4OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCB0cmlja2xlX2NvdW50KSA9IDA7CisKKy8qCisgKiBBIHBvb2wgb2Ygc2l6ZSAucG9vbHdvcmRzIGlzIHN0aXJyZWQgd2l0aCBhIHByaW1pdGl2ZSBwb2x5bm9taWFsCisgKiBvZiBkZWdyZWUgLnBvb2x3b3JkcyBvdmVyIEdGKDIpLiAgVGhlIHRhcHMgZm9yIHZhcmlvdXMgc2l6ZXMgYXJlCisgKiBkZWZpbmVkIGJlbG93LiAgVGhleSBhcmUgY2hvc2VuIHRvIGJlIGV2ZW5seSBzcGFjZWQgKG1pbmltdW0gUk1TCisgKiBkaXN0YW5jZSBmcm9tIGV2ZW5seSBzcGFjZWQ7IHRoZSBudW1iZXJzIGluIHRoZSBjb21tZW50cyBhcmUgYQorICogc2NhbGVkIHNxdWFyZWQgZXJyb3Igc3VtKSBleGNlcHQgZm9yIHRoZSBsYXN0IHRhcCwgd2hpY2ggaXMgMSB0bworICogZ2V0IHRoZSB0d2lzdGluZyBoYXBwZW5pbmcgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBwb29saW5mbyB7CisJaW50IHBvb2x3b3JkczsKKwlpbnQgdGFwMSwgdGFwMiwgdGFwMywgdGFwNCwgdGFwNTsKK30gcG9vbGluZm9fdGFibGVbXSA9IHsKKwkvKiB4XjEyOCArIHheMTAzICsgeF43NiArIHheNTEgK3heMjUgKyB4ICsgMSAtLSAxMDUgKi8KKwl7IDEyOCwJMTAzLAk3NiwJNTEsCTI1LAkxIH0sCisJLyogeF4zMiArIHheMjYgKyB4XjIwICsgeF4xNCArIHheNyArIHggKyAxIC0tIDE1ICovCisJeyAzMiwJMjYsCTIwLAkxNCwJNywJMSB9LAorI2lmIDAKKwkvKiB4XjIwNDggKyB4XjE2MzggKyB4XjEyMzEgKyB4XjgxOSArIHheNDExICsgeCArIDEgIC0tIDExNSAqLworCXsgMjA0OCwJMTYzOCwJMTIzMSwJODE5LAk0MTEsCTEgfSwKKworCS8qIHheMTAyNCArIHheODE3ICsgeF42MTUgKyB4XjQxMiArIHheMjA0ICsgeCArIDEgLS0gMjkwICovCisJeyAxMDI0LAk4MTcsCTYxNSwJNDEyLAkyMDQsCTEgfSwKKworCS8qIHheMTAyNCArIHheODE5ICsgeF42MTYgKyB4XjQxMCArIHheMjA3ICsgeF4yICsgMSAtLSAxMTUgKi8KKwl7IDEwMjQsCTgxOSwJNjE2LAk0MTAsCTIwNywJMiB9LAorCisJLyogeF41MTIgKyB4XjQxMSArIHheMzA4ICsgeF4yMDggKyB4XjEwNCArIHggKyAxIC0tIDIyNSAqLworCXsgNTEyLAk0MTEsCTMwOCwJMjA4LAkxMDQsCTEgfSwKKworCS8qIHheNTEyICsgeF40MDkgKyB4XjMwNyArIHheMjA2ICsgeF4xMDIgKyB4XjIgKyAxIC0tIDk1ICovCisJeyA1MTIsCTQwOSwJMzA3LAkyMDYsCTEwMiwJMiB9LAorCS8qIHheNTEyICsgeF40MDkgKyB4XjMwOSArIHheMjA1ICsgeF4xMDMgKyB4XjIgKyAxIC0tIDk1ICovCisJeyA1MTIsCTQwOSwJMzA5LAkyMDUsCTEwMywJMiB9LAorCisJLyogeF4yNTYgKyB4XjIwNSArIHheMTU1ICsgeF4xMDEgKyB4XjUyICsgeCArIDEgLS0gMTI1ICovCisJeyAyNTYsCTIwNSwJMTU1LAkxMDEsCTUyLAkxIH0sCisKKwkvKiB4XjEyOCArIHheMTAzICsgeF43OCArIHheNTEgKyB4XjI3ICsgeF4yICsgMSAtLSA3MCAqLworCXsgMTI4LAkxMDMsCTc4LAk1MSwJMjcsCTIgfSwKKworCS8qIHheNjQgKyB4XjUyICsgeF4zOSArIHheMjYgKyB4XjE0ICsgeCArIDEgLS0gMTUgKi8KKwl7IDY0LAk1MiwJMzksCTI2LAkxNCwJMSB9LAorI2VuZGlmCit9OworCisjZGVmaW5lIFBPT0xCSVRTCXBvb2x3b3JkcyozMgorI2RlZmluZSBQT09MQllURVMJcG9vbHdvcmRzKjQKKworLyoKKyAqIEZvciB0aGUgcHVycG9zZXMgb2YgYmV0dGVyIG1peGluZywgd2UgdXNlIHRoZSBDUkMtMzIgcG9seW5vbWlhbCBhcworICogd2VsbCB0byBtYWtlIGEgdHdpc3RlZCBHZW5lcmFsaXplZCBGZWVkYmFjayBTaGlmdCBSZWlnc3RlcgorICoKKyAqIChTZWUgTS4gTWF0c3Vtb3RvICYgWS4gS3VyaXRhLCAxOTkyLiAgVHdpc3RlZCBHRlNSIGdlbmVyYXRvcnMuICBBQ00KKyAqIFRyYW5zYWN0aW9ucyBvbiBNb2RlbGluZyBhbmQgQ29tcHV0ZXIgU2ltdWxhdGlvbiAyKDMpOjE3OS0xOTQuCisgKiBBbHNvIHNlZSBNLiBNYXRzdW1vdG8gJiBZLiBLdXJpdGEsIDE5OTQuICBUd2lzdGVkIEdGU1IgZ2VuZXJhdG9ycworICogSUkuICBBQ00gVHJhbnNhY3Rpb25zIG9uIE1kZWxpbmcgYW5kIENvbXB1dGVyIFNpbXVsYXRpb24gNDoyNTQtMjY2KQorICoKKyAqIFRoYW5rcyB0byBDb2xpbiBQbHVtYiBmb3Igc3VnZ2VzdGluZyB0aGlzLgorICoKKyAqIFdlIGhhdmUgbm90IGFuYWx5emVkIHRoZSByZXN1bHRhbnQgcG9seW5vbWlhbCB0byBwcm92ZSBpdCBwcmltaXRpdmU7CisgKiBpbiBmYWN0IGl0IGFsbW9zdCBjZXJ0YWlubHkgaXNuJ3QuICBOb25ldGhlbGVzcywgdGhlIGlycmVkdWNpYmxlIGZhY3RvcnMKKyAqIG9mIGEgcmFuZG9tIGxhcmdlLWRlZ3JlZSBwb2x5bm9taWFsIG92ZXIgR0YoMikgYXJlIG1vcmUgdGhhbiBsYXJnZSBlbm91Z2gKKyAqIHRoYXQgcGVyaW9kaWNpdHkgaXMgbm90IGEgY29uY2Vybi4KKyAqCisgKiBUaGUgaW5wdXQgaGFzaCBpcyBtdWNoIGxlc3Mgc2Vuc2l0aXZlIHRoYW4gdGhlIG91dHB1dCBoYXNoLiAgQWxsCisgKiB0aGF0IHdlIHdhbnQgb2YgaXQgaXMgdGhhdCBpdCBiZSBhIGdvb2Qgbm9uLWNyeXB0b2dyYXBoaWMgaGFzaDsKKyAqIGkuZS4gaXQgbm90IHByb2R1Y2UgY29sbGlzaW9ucyB3aGVuIGZlZCAicmFuZG9tIiBkYXRhIG9mIHRoZSBzb3J0CisgKiB3ZSBleHBlY3QgdG8gc2VlLiAgQXMgbG9uZyBhcyB0aGUgcG9vbCBzdGF0ZSBkaWZmZXJzIGZvciBkaWZmZXJlbnQKKyAqIGlucHV0cywgd2UgaGF2ZSBwcmVzZXJ2ZWQgdGhlIGlucHV0IGVudHJvcHkgYW5kIGRvbmUgYSBnb29kIGpvYi4KKyAqIFRoZSBmYWN0IHRoYXQgYW4gaW50ZWxsaWdlbnQgYXR0YWNrZXIgY2FuIGNvbnN0cnVjdCBpbnB1dHMgdGhhdAorICogd2lsbCBwcm9kdWNlIGNvbnRyb2xsZWQgYWx0ZXJhdGlvbnMgdG8gdGhlIHBvb2wncyBzdGF0ZSBpcyBub3QKKyAqIGltcG9ydGFudCBiZWNhdXNlIHdlIGRvbid0IGNvbnNpZGVyIHN1Y2ggaW5wdXRzIHRvIGNvbnRyaWJ1dGUgYW55CisgKiByYW5kb21uZXNzLiAgVGhlIG9ubHkgcHJvcGVydHkgd2UgbmVlZCB3aXRoIHJlc3BlY3QgdG8gdGhlbSBpcyB0aGF0CisgKiB0aGUgYXR0YWNrZXIgY2FuJ3QgaW5jcmVhc2UgaGlzL2hlciBrbm93bGVkZ2Ugb2YgdGhlIHBvb2wncyBzdGF0ZS4KKyAqIFNpbmNlIGFsbCBhZGRpdGlvbnMgYXJlIHJldmVyc2libGUgKGtub3dpbmcgdGhlIGZpbmFsIHN0YXRlIGFuZCB0aGUKKyAqIGlucHV0LCB5b3UgY2FuIHJlY29uc3RydWN0IHRoZSBpbml0aWFsIHN0YXRlKSwgaWYgYW4gYXR0YWNrZXIgaGFzCisgKiBhbnkgdW5jZXJ0YWludHkgYWJvdXQgdGhlIGluaXRpYWwgc3RhdGUsIGhlL3NoZSBjYW4gb25seSBzaHVmZmxlCisgKiB0aGF0IHVuY2VydGFpbnR5IGFib3V0LCBidXQgbmV2ZXIgY2F1c2UgYW55IGNvbGxpc2lvbnMgKHdoaWNoIHdvdWxkCisgKiBkZWNyZWFzZSB0aGUgdW5jZXJ0YWludHkpLgorICoKKyAqIFRoZSBjaG9zZW4gc3lzdGVtIGxldHMgdGhlIHN0YXRlIG9mIHRoZSBwb29sIGJlIChlc3NlbnRpYWxseSkgdGhlIGlucHV0CisgKiBtb2R1bG8gdGhlIGdlbmVyYXRvciBwb2x5bW5vbWlhbC4gIE5vdywgZm9yIHJhbmRvbSBwcmltaXRpdmUgcG9seW5vbWlhbHMsCisgKiB0aGlzIGlzIGEgdW5pdmVyc2FsIGNsYXNzIG9mIGhhc2ggZnVuY3Rpb25zLCBtZWFuaW5nIHRoYXQgdGhlIGNoYW5jZQorICogb2YgYSBjb2xsaXNpb24gaXMgbGltaXRlZCBieSB0aGUgYXR0YWNrZXIncyBrbm93bGVkZ2Ugb2YgdGhlIGdlbmVyYXRvcgorICogcG9seW5vbWFpbCwgc28gaWYgaXQgaXMgY2hvc2VuIGF0IHJhbmRvbSwgYW4gYXR0YWNrZXIgY2FuIG5ldmVyIGZvcmNlCisgKiBhIGNvbGxpc2lvbi4gIEhlcmUsIHdlIHVzZSBhIGZpeGVkIHBvbHlub21pYWwsIGJ1dCB3ZSAqY2FuKiBhc3N1bWUgdGhhdAorICogIyMjLS0+IGl0IGlzIHVua25vd24gdG8gdGhlIHByb2Nlc3NlcyBnZW5lcmF0aW5nIHRoZSBpbnB1dCBlbnRyb3B5LiA8LSMjIworICogQmVjYXVzZSBvZiB0aGlzIGltcG9ydGFudCBwcm9wZXJ0eSwgdGhpcyBpcyBhIGdvb2QsIGNvbGxpc2lvbi1yZXNpc3RhbnQKKyAqIGhhc2g7IGhhc2ggY29sbGlzaW9ucyB3aWxsIG9jY3VyIG5vIG1vcmUgb2Z0ZW4gdGhhbiBjaGFuY2UuCisgKi8KKworLyoKKyAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyYW5kb21fcmVhZF93YWl0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyYW5kb21fd3JpdGVfd2FpdCk7CisKKyNpZiAwCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CisjZGVmaW5lIERFQlVHX0VOVChmbXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAicmFuZG9tICUwNGQgJTA0ZCAlMDRkOiAiIFwKKwlmbXQsXAorCWlucHV0X3Bvb2wuZW50cm9weV9jb3VudCxcCisJYmxvY2tpbmdfcG9vbC5lbnRyb3B5X2NvdW50LFwKKwlub25ibG9ja2luZ19wb29sLmVudHJvcHlfY291bnQsXAorCSMjIGFyZyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBERUJVR19FTlQoZm10LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT1MgaW5kZXBlbmRlbnQgZW50cm9weSBzdG9yZS4gICBIZXJlIGFyZSB0aGUgZnVuY3Rpb25zIHdoaWNoIGhhbmRsZQorICogc3RvcmluZyBlbnRyb3B5IGluIGFuIGVudHJvcHkgcG9vbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGVudHJvcHlfc3RvcmU7CitzdHJ1Y3QgZW50cm9weV9zdG9yZSB7CisJLyogbW9zdGx5LXJlYWQgZGF0YTogKi8KKwlzdHJ1Y3QgcG9vbGluZm8gKnBvb2xpbmZvOworCV9fdTMyICpwb29sOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGxpbWl0OworCXN0cnVjdCBlbnRyb3B5X3N0b3JlICpwdWxsOworCisJLyogcmVhZC13cml0ZSBkYXRhOiAqLworCXNwaW5sb2NrX3QgbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCXVuc2lnbmVkIGFkZF9wdHI7CisJaW50IGVudHJvcHlfY291bnQ7CisJaW50IGlucHV0X3JvdGF0ZTsKK307CisKK3N0YXRpYyBfX3UzMiBpbnB1dF9wb29sX2RhdGFbSU5QVVRfUE9PTF9XT1JEU107CitzdGF0aWMgX191MzIgYmxvY2tpbmdfcG9vbF9kYXRhW09VVFBVVF9QT09MX1dPUkRTXTsKK3N0YXRpYyBfX3UzMiBub25ibG9ja2luZ19wb29sX2RhdGFbT1VUUFVUX1BPT0xfV09SRFNdOworCitzdGF0aWMgc3RydWN0IGVudHJvcHlfc3RvcmUgaW5wdXRfcG9vbCA9IHsKKwkucG9vbGluZm8gPSAmcG9vbGluZm9fdGFibGVbMF0sCisJLm5hbWUgPSAiaW5wdXQiLAorCS5saW1pdCA9IDEsCisJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnBvb2wgPSBpbnB1dF9wb29sX2RhdGEKK307CisKK3N0YXRpYyBzdHJ1Y3QgZW50cm9weV9zdG9yZSBibG9ja2luZ19wb29sID0geworCS5wb29saW5mbyA9ICZwb29saW5mb190YWJsZVsxXSwKKwkubmFtZSA9ICJibG9ja2luZyIsCisJLmxpbWl0ID0gMSwKKwkucHVsbCA9ICZpbnB1dF9wb29sLAorCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5wb29sID0gYmxvY2tpbmdfcG9vbF9kYXRhCit9OworCitzdGF0aWMgc3RydWN0IGVudHJvcHlfc3RvcmUgbm9uYmxvY2tpbmdfcG9vbCA9IHsKKwkucG9vbGluZm8gPSAmcG9vbGluZm9fdGFibGVbMV0sCisJLm5hbWUgPSAibm9uYmxvY2tpbmciLAorCS5wdWxsID0gJmlucHV0X3Bvb2wsCisJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnBvb2wgPSBub25ibG9ja2luZ19wb29sX2RhdGEKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBieXRlIGludG8gdGhlIGVudHJvcHkgInBvb2wiLiAgSXQgZG9lcyBub3QKKyAqIHVwZGF0ZSB0aGUgZW50cm9weSBlc3RpbWF0ZS4gIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKKyAqIGNyZWRpdF9lbnRyb3B5X3N0b3JlIGlmIHRoaXMgaXMgYXBwcm9wcmlhdGUuCisgKgorICogVGhlIHBvb2wgaXMgc3RpcnJlZCB3aXRoIGEgcHJpbWl0aXZlIHBvbHlub21pYWwgb2YgdGhlIGFwcHJvcHJpYXRlCisgKiBkZWdyZWUsIGFuZCB0aGVuIHR3aXN0ZWQuICBXZSB0d2lzdCBieSB0aHJlZSBiaXRzIGF0IGEgdGltZSBiZWNhdXNlCisgKiBpdCdzIGNoZWFwIHRvIGRvIHNvIGFuZCBoZWxwcyBzbGlnaHRseSBpbiB0aGUgZXhwZWN0ZWQgY2FzZSB3aGVyZQorICogdGhlIGVudHJvcHkgaXMgY29uY2VudHJhdGVkIGluIHRoZSBsb3ctb3JkZXIgYml0cy4KKyAqLworc3RhdGljIHZvaWQgX19hZGRfZW50cm9weV93b3JkcyhzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgY29uc3QgX191MzIgKmluLAorCQkJCWludCBud29yZHMsIF9fdTMyIG91dFsxNl0pCit7CisJc3RhdGljIF9fdTMyIGNvbnN0IHR3aXN0X3RhYmxlWzhdID0geworCQkweDAwMDAwMDAwLCAweDNiNmUyMGM4LCAweDc2ZGM0MTkwLCAweDRkYjI2MTU4LAorCQkweGVkYjg4MzIwLCAweGQ2ZDZhM2U4LCAweDliNjRjMmIwLCAweGEwMGFlMjc4IH07CisJdW5zaWduZWQgbG9uZyBpLCBhZGRfcHRyLCB0YXAxLCB0YXAyLCB0YXAzLCB0YXA0LCB0YXA1OworCWludCBuZXdfcm90YXRlLCBpbnB1dF9yb3RhdGU7CisJaW50IHdvcmRtYXNrID0gci0+cG9vbGluZm8tPnBvb2x3b3JkcyAtIDE7CisJX191MzIgdywgbmV4dF93OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBUYXBzIGFyZSBjb25zdGFudCwgc28gd2UgY2FuIGxvYWQgdGhlbSB3aXRob3V0IGhvbGRpbmcgci0+bG9jay4gICovCisJdGFwMSA9IHItPnBvb2xpbmZvLT50YXAxOworCXRhcDIgPSByLT5wb29saW5mby0+dGFwMjsKKwl0YXAzID0gci0+cG9vbGluZm8tPnRhcDM7CisJdGFwNCA9IHItPnBvb2xpbmZvLT50YXA0OworCXRhcDUgPSByLT5wb29saW5mby0+dGFwNTsKKwluZXh0X3cgPSAqaW4rKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5sb2NrLCBmbGFncyk7CisJcHJlZmV0Y2hfcmFuZ2Uoci0+cG9vbCwgd29yZG1hc2spOworCWlucHV0X3JvdGF0ZSA9IHItPmlucHV0X3JvdGF0ZTsKKwlhZGRfcHRyID0gci0+YWRkX3B0cjsKKworCXdoaWxlIChud29yZHMtLSkgeworCQl3ID0gcm9sMzIobmV4dF93LCBpbnB1dF9yb3RhdGUpOworCQlpZiAobndvcmRzID4gMCkKKwkJCW5leHRfdyA9ICppbisrOworCQlpID0gYWRkX3B0ciA9IChhZGRfcHRyIC0gMSkgJiB3b3JkbWFzazsKKwkJLyoKKwkJICogTm9ybWFsbHksIHdlIGFkZCA3IGJpdHMgb2Ygcm90YXRpb24gdG8gdGhlIHBvb2wuCisJCSAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBvb2wsIGFkZCBhbiBleHRyYSA3IGJpdHMKKwkJICogcm90YXRpb24sIHNvIHRoYXQgc3VjY2Vzc2l2ZSBwYXNzZXMgc3ByZWFkIHRoZQorCQkgKiBpbnB1dCBiaXRzIGFjcm9zcyB0aGUgcG9vbCBldmVubHkuCisJCSAqLworCQluZXdfcm90YXRlID0gaW5wdXRfcm90YXRlICsgMTQ7CisJCWlmIChpKQorCQkJbmV3X3JvdGF0ZSA9IGlucHV0X3JvdGF0ZSArIDc7CisJCWlucHV0X3JvdGF0ZSA9IG5ld19yb3RhdGUgJiAzMTsKKworCQkvKiBYT1IgaW4gdGhlIHZhcmlvdXMgdGFwcyAqLworCQl3IF49IHItPnBvb2xbKGkgKyB0YXAxKSAmIHdvcmRtYXNrXTsKKwkJdyBePSByLT5wb29sWyhpICsgdGFwMikgJiB3b3JkbWFza107CisJCXcgXj0gci0+cG9vbFsoaSArIHRhcDMpICYgd29yZG1hc2tdOworCQl3IF49IHItPnBvb2xbKGkgKyB0YXA0KSAmIHdvcmRtYXNrXTsKKwkJdyBePSByLT5wb29sWyhpICsgdGFwNSkgJiB3b3JkbWFza107CisJCXcgXj0gci0+cG9vbFtpXTsKKwkJci0+cG9vbFtpXSA9ICh3ID4+IDMpIF4gdHdpc3RfdGFibGVbdyAmIDddOworCX0KKworCXItPmlucHV0X3JvdGF0ZSA9IGlucHV0X3JvdGF0ZTsKKwlyLT5hZGRfcHRyID0gYWRkX3B0cjsKKworCWlmIChvdXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCW91dFtpXSA9IHItPnBvb2xbYWRkX3B0cl07CisJCQlhZGRfcHRyID0gKGFkZF9wdHIgLSAxKSAmIHdvcmRtYXNrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2VudHJvcHlfd29yZHMoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIGNvbnN0IF9fdTMyICppbiwKKwkJCQkgICAgIGludCBud29yZHMpCit7CisJX19hZGRfZW50cm9weV93b3JkcyhyLCBpbiwgbndvcmRzLCBOVUxMKTsKK30KKworLyoKKyAqIENyZWRpdCAob3IgZGViaXQpIHRoZSBlbnRyb3B5IHN0b3JlIHdpdGggbiBiaXRzIG9mIGVudHJvcHkKKyAqLworc3RhdGljIHZvaWQgY3JlZGl0X2VudHJvcHlfc3RvcmUoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIGludCBuYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmxvY2ssIGZsYWdzKTsKKworCWlmIChyLT5lbnRyb3B5X2NvdW50ICsgbmJpdHMgPCAwKSB7CisJCURFQlVHX0VOVCgibmVnYXRpdmUgZW50cm9weS9vdmVyZmxvdyAoJWQrJWQpXG4iLAorCQkJICByLT5lbnRyb3B5X2NvdW50LCBuYml0cyk7CisJCXItPmVudHJvcHlfY291bnQgPSAwOworCX0gZWxzZSBpZiAoci0+ZW50cm9weV9jb3VudCArIG5iaXRzID4gci0+cG9vbGluZm8tPlBPT0xCSVRTKSB7CisJCXItPmVudHJvcHlfY291bnQgPSByLT5wb29saW5mby0+UE9PTEJJVFM7CisJfSBlbHNlIHsKKwkJci0+ZW50cm9weV9jb3VudCArPSBuYml0czsKKwkJaWYgKG5iaXRzKQorCQkJREVCVUdfRU5UKCJhZGRlZCAlZCBlbnRyb3B5IGNyZWRpdHMgdG8gJXNcbiIsCisJCQkJICBuYml0cywgci0+bmFtZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW50cm9weSBpbnB1dCBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlcmUgaXMgb25lIG9mIHRoZXNlIHBlciBlbnRyb3B5IHNvdXJjZSAqLworc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgeworCWN5Y2xlc190IGxhc3RfdGltZTsKKwlsb25nIGxhc3RfZGVsdGEsbGFzdF9kZWx0YTI7CisJdW5zaWduZWQgZG9udF9jb3VudF9lbnRyb3B5OjE7Cit9OworCitzdGF0aWMgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgaW5wdXRfdGltZXJfc3RhdGU7CitzdGF0aWMgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKmlycV90aW1lcl9zdGF0ZVtOUl9JUlFTXTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBlbnRyb3B5IHRvIHRoZSBlbnRyb3B5ICJwb29sIiBieSB1c2luZyB0aW1pbmcKKyAqIGRlbGF5cy4gIEl0IHVzZXMgdGhlIHRpbWVyX3JhbmRfc3RhdGUgc3RydWN0dXJlIHRvIG1ha2UgYW4gZXN0aW1hdGUKKyAqIG9mIGhvdyBtYW55IGJpdHMgb2YgZW50cm9weSB0aGlzIGNhbGwgaGFzIGFkZGVkIHRvIHRoZSBwb29sLgorICoKKyAqIFRoZSBudW1iZXIgIm51bSIgaXMgYWxzbyBhZGRlZCB0byB0aGUgcG9vbCAtIGl0IHNob3VsZCBzb21laG93IGRlc2NyaWJlCisgKiB0aGUgdHlwZSBvZiBldmVudCB3aGljaCBqdXN0IGhhcHBlbmVkLiAgVGhpcyBpcyBjdXJyZW50bHkgMC0yNTUgZm9yCisgKiBrZXlib2FyZCBzY2FuIGNvZGVzLCBhbmQgMjU2IHVwd2FyZHMgZm9yIGludGVycnVwdHMuCisgKgorICovCitzdGF0aWMgdm9pZCBhZGRfdGltZXJfcmFuZG9tbmVzcyhzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIG51bSkKK3sKKwlzdHJ1Y3QgeworCQljeWNsZXNfdCBjeWNsZXM7CisJCWxvbmcgamlmZmllczsKKwkJdW5zaWduZWQgbnVtOworCX0gc2FtcGxlOworCWxvbmcgZGVsdGEsIGRlbHRhMiwgZGVsdGEzOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyogaWYgb3ZlciB0aGUgdHJpY2tsZSB0aHJlc2hvbGQsIHVzZSBvbmx5IDEgaW4gNDA5NiBzYW1wbGVzICovCisJaWYgKGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCA+IHRyaWNrbGVfdGhyZXNoICYmCisJICAgIChfX2dldF9jcHVfdmFyKHRyaWNrbGVfY291bnQpKysgJiAweGZmZikpCisJCWdvdG8gb3V0OworCisJc2FtcGxlLmppZmZpZXMgPSBqaWZmaWVzOworCXNhbXBsZS5jeWNsZXMgPSBnZXRfY3ljbGVzKCk7CisJc2FtcGxlLm51bSA9IG51bTsKKwlhZGRfZW50cm9weV93b3JkcygmaW5wdXRfcG9vbCwgKHUzMiAqKSZzYW1wbGUsIHNpemVvZihzYW1wbGUpLzQpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJpdHMgb2YgcmFuZG9tbmVzcyB3ZSBwcm9iYWJseSBhZGRlZC4KKwkgKiBXZSB0YWtlIGludG8gYWNjb3VudCB0aGUgZmlyc3QsIHNlY29uZCBhbmQgdGhpcmQtb3JkZXIgZGVsdGFzCisJICogaW4gb3JkZXIgdG8gbWFrZSBvdXIgZXN0aW1hdGUuCisJICovCisKKwlpZiAoIXN0YXRlLT5kb250X2NvdW50X2VudHJvcHkpIHsKKwkJZGVsdGEgPSBzYW1wbGUuamlmZmllcyAtIHN0YXRlLT5sYXN0X3RpbWU7CisJCXN0YXRlLT5sYXN0X3RpbWUgPSBzYW1wbGUuamlmZmllczsKKworCQlkZWx0YTIgPSBkZWx0YSAtIHN0YXRlLT5sYXN0X2RlbHRhOworCQlzdGF0ZS0+bGFzdF9kZWx0YSA9IGRlbHRhOworCisJCWRlbHRhMyA9IGRlbHRhMiAtIHN0YXRlLT5sYXN0X2RlbHRhMjsKKwkJc3RhdGUtPmxhc3RfZGVsdGEyID0gZGVsdGEyOworCisJCWlmIChkZWx0YSA8IDApCisJCQlkZWx0YSA9IC1kZWx0YTsKKwkJaWYgKGRlbHRhMiA8IDApCisJCQlkZWx0YTIgPSAtZGVsdGEyOworCQlpZiAoZGVsdGEzIDwgMCkKKwkJCWRlbHRhMyA9IC1kZWx0YTM7CisJCWlmIChkZWx0YSA+IGRlbHRhMikKKwkJCWRlbHRhID0gZGVsdGEyOworCQlpZiAoZGVsdGEgPiBkZWx0YTMpCisJCQlkZWx0YSA9IGRlbHRhMzsKKworCQkvKgorCQkgKiBkZWx0YSBpcyBub3cgbWluaW11bSBhYnNvbHV0ZSBkZWx0YS4KKwkJICogUm91bmQgZG93biBieSAxIGJpdCBvbiBnZW5lcmFsIHByaW5jaXBsZXMsCisJCSAqIGFuZCBsaW1pdCBlbnRyb3B5IGVudGltYXRlIHRvIDEyIGJpdHMuCisJCSAqLworCQljcmVkaXRfZW50cm9weV9zdG9yZSgmaW5wdXRfcG9vbCwKKwkJCQkgICAgIG1pbl90KGludCwgZmxzKGRlbHRhPj4xKSwgMTEpKTsKKwl9CisKKwlpZihpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPj0gcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYW5kb21fcmVhZF93YWl0KTsKKworb3V0OgorCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK2V4dGVybiB2b2lkIGFkZF9pbnB1dF9yYW5kb21uZXNzKHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwKKwkJCQkgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhc3RfdmFsdWU7CisKKwkvKiBpZ25vcmUgYXV0b3JlcGVhdCBhbmQgdGhlIGxpa2UgKi8KKwlpZiAodmFsdWUgPT0gbGFzdF92YWx1ZSkKKwkJcmV0dXJuOworCisJREVCVUdfRU5UKCJpbnB1dCBldmVudFxuIik7CisJbGFzdF92YWx1ZSA9IHZhbHVlOworCWFkZF90aW1lcl9yYW5kb21uZXNzKCZpbnB1dF90aW1lcl9zdGF0ZSwKKwkJCSAgICAgKHR5cGUgPDwgNCkgXiBjb2RlIF4gKGNvZGUgPj4gNCkgXiB2YWx1ZSk7Cit9CisKK3ZvaWQgYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGludCBpcnEpCit7CisJaWYgKGlycSA+PSBOUl9JUlFTIHx8IGlycV90aW1lcl9zdGF0ZVtpcnFdID09IDApCisJCXJldHVybjsKKworCURFQlVHX0VOVCgiaXJxIGV2ZW50ICVkXG4iLCBpcnEpOworCWFkZF90aW1lcl9yYW5kb21uZXNzKGlycV90aW1lcl9zdGF0ZVtpcnFdLCAweDEwMCArIGlycSk7Cit9CisKK3ZvaWQgYWRkX2Rpc2tfcmFuZG9tbmVzcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlpZiAoIWRpc2sgfHwgIWRpc2stPnJhbmRvbSkKKwkJcmV0dXJuOworCS8qIGZpcnN0IG1ham9yIGlzIDEsIHNvIHdlIGdldCA+PSAweDIwMCBoZXJlICovCisJREVCVUdfRU5UKCJkaXNrIGV2ZW50ICVkOiVkXG4iLCBkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IpOworCisJYWRkX3RpbWVyX3JhbmRvbW5lc3MoZGlzay0+cmFuZG9tLAorCQkJICAgICAweDEwMCArIE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcikpOworfQorCitFWFBPUlRfU1lNQk9MKGFkZF9kaXNrX3JhbmRvbW5lc3MpOworCisjZGVmaW5lIEVYVFJBQ1RfU0laRSAxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW50cm9weSBleHRyYWN0aW9uIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgZXh0cmFjdF9lbnRyb3B5KHN0cnVjdCBlbnRyb3B5X3N0b3JlICpyLCB2b2lkICogYnVmLAorCQkJICAgICAgIHNpemVfdCBuYnl0ZXMsIGludCBtaW4sIGludCByc3ZkKTsKKworLyoKKyAqIFRoaXMgdXRpbGl0eSBpbmxpbmUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHRyYW5zZmVyaW5nIGVudHJvcHkKKyAqIGZyb20gdGhlIHByaW1hcnkgcG9vbCB0byB0aGUgc2Vjb25kYXJ5IGV4dHJhY3Rpb24gcG9vbC4gV2UgbWFrZQorICogc3VyZSB3ZSBwdWxsIGVub3VnaCBmb3IgYSAnY2F0YXN0cm9waGljIHJlc2VlZCcuCisgKi8KK3N0YXRpYyB2b2lkIHhmZXJfc2Vjb25kYXJ5X3Bvb2woc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHNpemVfdCBuYnl0ZXMpCit7CisJX191MzIgdG1wW09VVFBVVF9QT09MX1dPUkRTXTsKKworCWlmIChyLT5wdWxsICYmIHItPmVudHJvcHlfY291bnQgPCBuYnl0ZXMgKiA4ICYmCisJICAgIHItPmVudHJvcHlfY291bnQgPCByLT5wb29saW5mby0+UE9PTEJJVFMpIHsKKwkJaW50IGJ5dGVzID0gbWF4X3QoaW50LCByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoIC8gOCwKKwkJCQltaW5fdChpbnQsIG5ieXRlcywgc2l6ZW9mKHRtcCkpKTsKKwkJaW50IHJzdmQgPSByLT5saW1pdCA/IDAgOiByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoLzQ7CisKKwkJREVCVUdfRU5UKCJnb2luZyB0byByZXNlZWQgJXMgd2l0aCAlZCBiaXRzICIKKwkJCSAgIiglZCBvZiAlZCByZXF1ZXN0ZWQpXG4iLAorCQkJICByLT5uYW1lLCBieXRlcyAqIDgsIG5ieXRlcyAqIDgsIHItPmVudHJvcHlfY291bnQpOworCisJCWJ5dGVzPWV4dHJhY3RfZW50cm9weShyLT5wdWxsLCB0bXAsIGJ5dGVzLAorCQkJCSAgICAgIHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2ggLyA4LCByc3ZkKTsKKwkJYWRkX2VudHJvcHlfd29yZHMociwgdG1wLCAoYnl0ZXMgKyAzKSAvIDQpOworCQljcmVkaXRfZW50cm9weV9zdG9yZShyLCBieXRlcyo4KTsKKwl9Cit9CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgZXh0cmFjdHMgcmFuZG9tbmVzcyBmcm9tIHRoZSAiZW50cm9weSBwb29sIiwgYW5kCisgKiByZXR1cm5zIGl0IGluIGEgYnVmZmVyLgorICoKKyAqIFRoZSBtaW4gcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbWluaW11bSBhbW91bnQgd2UgY2FuIHB1bGwgYmVmb3JlCisgKiBmYWlsaW5nIHRvIGF2b2lkIHJhY2VzIHRoYXQgZGVmZWF0IGNhdGFzdHJvcGhpYyByZXNlZWRpbmcgd2hpbGUgdGhlCisgKiByZXNlcnZlZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyBtdWNoIGVudHJvcHkgd2UgbXVzdCBsZWF2ZSBpbiB0aGUKKyAqIHBvb2wgYWZ0ZXIgZWFjaCBwdWxsIHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHJlYWRlcnMuCisgKgorICogTm90ZTogZXh0cmFjdF9lbnRyb3B5KCkgYXNzdW1lcyB0aGF0IC5wb29sd29yZHMgaXMgYSBtdWx0aXBsZSBvZiAxNiB3b3Jkcy4KKyAqLworCitzdGF0aWMgc2l6ZV90IGFjY291bnQoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHNpemVfdCBuYnl0ZXMsIGludCBtaW4sCisJCSAgICAgIGludCByZXNlcnZlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOworCisJLyogSG9sZCBsb2NrIHdoaWxlIGFjY291bnRpbmcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOworCisJREVCVUdfRU5UKCJ0cnlpbmcgdG8gZXh0cmFjdCAlZCBiaXRzIGZyb20gJXNcbiIsCisJCSAgbmJ5dGVzICogOCwgci0+bmFtZSk7CisKKwkvKiBDYW4gd2UgcHVsbCBlbm91Z2g/ICovCisJaWYgKHItPmVudHJvcHlfY291bnQgLyA4IDwgbWluICsgcmVzZXJ2ZWQpIHsKKwkJbmJ5dGVzID0gMDsKKwl9IGVsc2UgeworCQkvKiBJZiBsaW1pdGVkLCBuZXZlciBwdWxsIG1vcmUgdGhhbiBhdmFpbGFibGUgKi8KKwkJaWYgKHItPmxpbWl0ICYmIG5ieXRlcyArIHJlc2VydmVkID49IHItPmVudHJvcHlfY291bnQgLyA4KQorCQkJbmJ5dGVzID0gci0+ZW50cm9weV9jb3VudC84IC0gcmVzZXJ2ZWQ7CisKKwkJaWYoci0+ZW50cm9weV9jb3VudCAvIDggPj0gbmJ5dGVzICsgcmVzZXJ2ZWQpCisJCQlyLT5lbnRyb3B5X2NvdW50IC09IG5ieXRlcyo4OworCQllbHNlCisJCQlyLT5lbnRyb3B5X2NvdW50ID0gcmVzZXJ2ZWQ7CisKKwkJaWYgKHItPmVudHJvcHlfY291bnQgPCByYW5kb21fd3JpdGVfd2FrZXVwX3RocmVzaCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmFuZG9tX3dyaXRlX3dhaXQpOworCX0KKworCURFQlVHX0VOVCgiZGViaXRpbmcgJWQgZW50cm9weSBjcmVkaXRzIGZyb20gJXMlc1xuIiwKKwkJICBuYnl0ZXMgKiA4LCByLT5uYW1lLCByLT5saW1pdCA/ICIiIDogIiAodW5saW1pdGVkKSIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHZvaWQgZXh0cmFjdF9idWYoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIF9fdTggKm91dCkKK3sKKwlpbnQgaSwgeDsKKwlfX3UzMiBkYXRhWzE2XSwgYnVmWzUgKyBTSEFfV09SS1NQQUNFX1dPUkRTXTsKKworCXNoYV9pbml0KGJ1Zik7CisJLyoKKwkgKiBBcyB3ZSBoYXNoIHRoZSBwb29sLCB3ZSBtaXggaW50ZXJtZWRpYXRlIHZhbHVlcyBvZgorCSAqIHRoZSBoYXNoIGJhY2sgaW50byB0aGUgcG9vbC4gIFRoaXMgZWxpbWluYXRlcworCSAqIGJhY2t0cmFja2luZyBhdHRhY2tzICh3aGVyZSB0aGUgYXR0YWNrZXIga25vd3MKKwkgKiB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgcGx1cyB0aGUgY3VycmVudCBvdXRwdXRzLCBhbmQKKwkgKiBhdHRlbXB0cyB0byBmaW5kIHByZXZpb3VzIG91cHV0cyksIHVubGVzcyB0aGUgaGFzaAorCSAqIGZ1bmN0aW9uIGNhbiBiZSBpbnZlcnRlZC4KKwkgKi8KKwlmb3IgKGkgPSAwLCB4ID0gMDsgaSA8IHItPnBvb2xpbmZvLT5wb29sd29yZHM7IGkgKz0gMTYsIHgrPTIpIHsKKwkJc2hhX3RyYW5zZm9ybShidWYsIChfX3U4ICopci0+cG9vbCtpLCBidWYgKyA1KTsKKwkJYWRkX2VudHJvcHlfd29yZHMociwgJmJ1Zlt4ICUgNV0sIDEpOworCX0KKworCS8qCisJICogVG8gYXZvaWQgZHVwbGljYXRlcywgd2UgYXRvbWljYWxseSBleHRyYWN0IGEKKwkgKiBwb3J0aW9uIG9mIHRoZSBwb29sIHdoaWxlIG1peGluZywgYW5kIGhhc2ggb25lCisJICogZmluYWwgdGltZS4KKwkgKi8KKwlfX2FkZF9lbnRyb3B5X3dvcmRzKHIsICZidWZbeCAlIDVdLCAxLCBkYXRhKTsKKwlzaGFfdHJhbnNmb3JtKGJ1ZiwgKF9fdTggKilkYXRhLCBidWYgKyA1KTsKKworCS8qCisJICogSW4gY2FzZSB0aGUgaGFzaCBmdW5jdGlvbiBoYXMgc29tZSByZWNvZ25pemFibGUKKwkgKiBvdXRwdXQgcGF0dGVybiwgd2UgZm9sZCBpdCBpbiBoYWxmLgorCSAqLworCisJYnVmWzBdIF49IGJ1ZlszXTsKKwlidWZbMV0gXj0gYnVmWzRdOworCWJ1ZlswXSBePSByb2wzMihidWZbM10sIDE2KTsKKwltZW1jcHkob3V0LCBidWYsIEVYVFJBQ1RfU0laRSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworfQorCitzdGF0aWMgc3NpemVfdCBleHRyYWN0X2VudHJvcHkoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHZvaWQgKiBidWYsCisJCQkgICAgICAgc2l6ZV90IG5ieXRlcywgaW50IG1pbiwgaW50IHJlc2VydmVkKQoreworCXNzaXplX3QgcmV0ID0gMCwgaTsKKwlfX3U4IHRtcFtFWFRSQUNUX1NJWkVdOworCisJeGZlcl9zZWNvbmRhcnlfcG9vbChyLCBuYnl0ZXMpOworCW5ieXRlcyA9IGFjY291bnQociwgbmJ5dGVzLCBtaW4sIHJlc2VydmVkKTsKKworCXdoaWxlIChuYnl0ZXMpIHsKKwkJZXh0cmFjdF9idWYociwgdG1wKTsKKwkJaSA9IG1pbl90KGludCwgbmJ5dGVzLCBFWFRSQUNUX1NJWkUpOworCQltZW1jcHkoYnVmLCB0bXAsIGkpOworCQluYnl0ZXMgLT0gaTsKKwkJYnVmICs9IGk7CisJCXJldCArPSBpOworCX0KKworCS8qIFdpcGUgZGF0YSBqdXN0IHJldHVybmVkIGZyb20gbWVtb3J5ICovCisJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZXh0cmFjdF9lbnRyb3B5X3VzZXIoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHZvaWQgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBuYnl0ZXMpCit7CisJc3NpemVfdCByZXQgPSAwLCBpOworCV9fdTggdG1wW0VYVFJBQ1RfU0laRV07CisKKwl4ZmVyX3NlY29uZGFyeV9wb29sKHIsIG5ieXRlcyk7CisJbmJ5dGVzID0gYWNjb3VudChyLCBuYnl0ZXMsIDAsIDApOworCisJd2hpbGUgKG5ieXRlcykgeworCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmIChyZXQgPT0gMCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJfQorCisJCWV4dHJhY3RfYnVmKHIsIHRtcCk7CisJCWkgPSBtaW5fdChpbnQsIG5ieXRlcywgRVhUUkFDVF9TSVpFKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHRtcCwgaSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCW5ieXRlcyAtPSBpOworCQlidWYgKz0gaTsKKwkJcmV0ICs9IGk7CisJfQorCisJLyogV2lwZSBkYXRhIGp1c3QgcmV0dXJuZWQgZnJvbSBtZW1vcnkgKi8KKwltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgZXhwb3J0ZWQga2VybmVsIGludGVyZmFjZS4gIEl0IHJldHVybnMgc29tZQorICogbnVtYmVyIG9mIGdvb2QgcmFuZG9tIG51bWJlcnMsIHN1aXRhYmxlIGZvciBzZWVkaW5nIFRDUCBzZXF1ZW5jZQorICogbnVtYmVycywgZXRjLgorICovCit2b2lkIGdldF9yYW5kb21fYnl0ZXModm9pZCAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWV4dHJhY3RfZW50cm9weSgmbm9uYmxvY2tpbmdfcG9vbCwgYnVmLCBuYnl0ZXMsIDAsIDApOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9yYW5kb21fYnl0ZXMpOworCisvKgorICogaW5pdF9zdGRfZGF0YSAtIGluaXRpYWxpemUgcG9vbCB3aXRoIHN5c3RlbSBkYXRhCisgKgorICogQHI6IHBvb2wgdG8gaW5pdGlhbGl6ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBwb29sJ3MgZW50cm9weSBjb3VudCBhbmQgbWl4ZXMgc29tZSBzeXN0ZW0KKyAqIGRhdGEgaW50byB0aGUgcG9vbCB0byBwcmVwYXJlIGl0IGZvciB1c2UuIFRoZSBwb29sIGlzIG5vdCBjbGVhcmVkCisgKiBhcyB0aGF0IGNhbiBvbmx5IGRlY3JlYXNlIHRoZSBlbnRyb3B5IGluIHRoZSBwb29sLgorICovCitzdGF0aWMgdm9pZCBpbml0X3N0ZF9kYXRhKHN0cnVjdCBlbnRyb3B5X3N0b3JlICpyKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOworCXItPmVudHJvcHlfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmxvY2ssIGZsYWdzKTsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWFkZF9lbnRyb3B5X3dvcmRzKHIsIChfX3UzMiAqKSZ0diwgc2l6ZW9mKHR2KS80KTsKKwlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKikmc3lzdGVtX3V0c25hbWUsCisJCQkgIHNpemVvZihzeXN0ZW1fdXRzbmFtZSkvNCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJhbmRfaW5pdGlhbGl6ZSh2b2lkKQoreworCWluaXRfc3RkX2RhdGEoJmlucHV0X3Bvb2wpOworCWluaXRfc3RkX2RhdGEoJmJsb2NraW5nX3Bvb2wpOworCWluaXRfc3RkX2RhdGEoJm5vbmJsb2NraW5nX3Bvb2wpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQocmFuZF9pbml0aWFsaXplKTsKKwordm9pZCByYW5kX2luaXRpYWxpemVfaXJxKGludCBpcnEpCit7CisJc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlOworCisJaWYgKGlycSA+PSBOUl9JUlFTIHx8IGlycV90aW1lcl9zdGF0ZVtpcnFdKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGttYWxsb2MgcmV0dXJucyBudWxsLCB3ZSBqdXN0IHdvbid0IHVzZSB0aGF0IGVudHJvcHkKKwkgKiBzb3VyY2UuCisJICovCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkgeworCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSkpOworCQlpcnFfdGltZXJfc3RhdGVbaXJxXSA9IHN0YXRlOworCX0KK30KKwordm9pZCByYW5kX2luaXRpYWxpemVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGU7CisKKwkvKgorCSAqIElmIGttYWxsb2MgcmV0dXJucyBudWxsLCB3ZSBqdXN0IHdvbid0IHVzZSB0aGF0IGVudHJvcHkKKwkgKiBzb3VyY2UuCisJICovCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkgeworCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSkpOworCQlkaXNrLT5yYW5kb20gPSBzdGF0ZTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90CityYW5kb21fcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCBuLCByZXR2YWwgPSAwLCBjb3VudCA9IDA7CisKKwlpZiAobmJ5dGVzID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKG5ieXRlcyA+IDApIHsKKwkJbiA9IG5ieXRlczsKKwkJaWYgKG4gPiBTRUNfWEZFUl9TSVpFKQorCQkJbiA9IFNFQ19YRkVSX1NJWkU7CisKKwkJREVCVUdfRU5UKCJyZWFkaW5nICVkIGJpdHNcbiIsIG4qOCk7CisKKwkJbiA9IGV4dHJhY3RfZW50cm9weV91c2VyKCZibG9ja2luZ19wb29sLCBidWYsIG4pOworCisJCURFQlVHX0VOVCgicmVhZCBnb3QgJWQgYml0cyAoJWQgc3RpbGwgbmVlZGVkKVxuIiwKKwkJCSAgbio4LCAobmJ5dGVzLW4pKjgpOworCisJCWlmIChuID09IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCURFQlVHX0VOVCgic2xlZXBpbmc/XG4iKTsKKworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJhbmRvbV9yZWFkX3dhaXQsCisJCQkJaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID49CisJCQkJCQkgcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCk7CisKKwkJCURFQlVHX0VOVCgiYXdha2VcbiIpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG4gPCAwKSB7CisJCQlyZXR2YWwgPSBuOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQgKz0gbjsKKwkJYnVmICs9IG47CisJCW5ieXRlcyAtPSBuOworCQlicmVhazsJCS8qIFRoaXMgYnJlYWsgbWFrZXMgdGhlIGRldmljZSB3b3JrICovCisJCQkJLyogbGlrZSBhIG5hbWVkIHBpcGUgKi8KKwl9CisKKwkvKgorCSAqIElmIHdlIGdhdmUgdGhlIHVzZXIgc29tZSBieXRlcywgdXBkYXRlIHRoZSBhY2Nlc3MgdGltZS4KKwkgKi8KKwlpZiAoY291bnQpCisJCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisKKwlyZXR1cm4gKGNvdW50ID8gY291bnQgOiByZXR2YWwpOworfQorCitzdGF0aWMgc3NpemVfdAordXJhbmRvbV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCSAgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gZXh0cmFjdF9lbnRyb3B5X3VzZXIoJm5vbmJsb2NraW5nX3Bvb2wsIGJ1ZiwgbmJ5dGVzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcmFuZG9tX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG9sbF93YWl0KGZpbGUsICZyYW5kb21fcmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnJhbmRvbV93cml0ZV93YWl0LCB3YWl0KTsKKwltYXNrID0gMDsKKwlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID49IHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50IDwgcmFuZG9tX3dyaXRlX3dha2V1cF90aHJlc2gpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzc2l6ZV90CityYW5kb21fd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQgPSAwOworCXNpemVfdCBieXRlczsKKwlfX3UzMiBidWZbMTZdOworCWNvbnN0IGNoYXIgX191c2VyICpwID0gYnVmZmVyOworCXNpemVfdCBjID0gY291bnQ7CisKKwl3aGlsZSAoYyA+IDApIHsKKwkJYnl0ZXMgPSBtaW4oYywgc2l6ZW9mKGJ1ZikpOworCisJCWJ5dGVzIC09IGNvcHlfZnJvbV91c2VyKCZidWYsIHAsIGJ5dGVzKTsKKwkJaWYgKCFieXRlcykgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWMgLT0gYnl0ZXM7CisJCXAgKz0gYnl0ZXM7CisKKwkJYWRkX2VudHJvcHlfd29yZHMoJmlucHV0X3Bvb2wsIGJ1ZiwgKGJ5dGVzICsgMykgLyA0KTsKKwl9CisJaWYgKHAgPT0gYnVmZmVyKSB7CisJCXJldHVybiAoc3NpemVfdClyZXQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCSAgICAgICAgaW5vZGUtPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIChzc2l6ZV90KShwIC0gYnVmZmVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JhbmRvbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHNpemUsIGVudF9jb3VudDsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSTkRHRVRFTlRDTlQ6CisJCWVudF9jb3VudCA9IGlucHV0X3Bvb2wuZW50cm9weV9jb3VudDsKKwkJaWYgKHB1dF91c2VyKGVudF9jb3VudCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBSTkRBRERUT0VOVENOVDoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGdldF91c2VyKGVudF9jb3VudCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJY3JlZGl0X2VudHJvcHlfc3RvcmUoJmlucHV0X3Bvb2wsIGVudF9jb3VudCk7CisJCS8qCisJCSAqIFdha2UgdXAgd2FpdGluZyBwcm9jZXNzZXMgaWYgd2UgaGF2ZSBlbm91Z2gKKwkJICogZW50cm9weS4KKwkJICovCisJCWlmIChpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPj0gcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmFuZG9tX3JlYWRfd2FpdCk7CisJCXJldHVybiAwOworCWNhc2UgUk5EQURERU5UUk9QWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGdldF91c2VyKGVudF9jb3VudCwgcCsrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZW50X2NvdW50IDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgcCsrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR2YWwgPSByYW5kb21fd3JpdGUoZmlsZSwgKGNvbnN0IGNoYXIgX191c2VyICopIHAsCisJCQkJICAgICAgc2l6ZSwgJmZpbGUtPmZfcG9zKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQljcmVkaXRfZW50cm9weV9zdG9yZSgmaW5wdXRfcG9vbCwgZW50X2NvdW50KTsKKwkJLyoKKwkJICogV2FrZSB1cCB3YWl0aW5nIHByb2Nlc3NlcyBpZiB3ZSBoYXZlIGVub3VnaAorCQkgKiBlbnRyb3B5LgorCQkgKi8KKwkJaWYgKGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCA+PSByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYW5kb21fcmVhZF93YWl0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSTkRaQVBFTlRDTlQ6CisJY2FzZSBSTkRDTEVBUlBPT0w6CisJCS8qIENsZWFyIHRoZSBlbnRyb3B5IHBvb2wgY291bnRlcnMuICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluaXRfc3RkX2RhdGEoJmlucHV0X3Bvb2wpOworCQlpbml0X3N0ZF9kYXRhKCZibG9ja2luZ19wb29sKTsKKwkJaW5pdF9zdGRfZGF0YSgmbm9uYmxvY2tpbmdfcG9vbCk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW5kb21fZm9wcyA9IHsKKwkucmVhZCAgPSByYW5kb21fcmVhZCwKKwkud3JpdGUgPSByYW5kb21fd3JpdGUsCisJLnBvbGwgID0gcmFuZG9tX3BvbGwsCisJLmlvY3RsID0gcmFuZG9tX2lvY3RsLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1cmFuZG9tX2ZvcHMgPSB7CisJLnJlYWQgID0gdXJhbmRvbV9yZWFkLAorCS53cml0ZSA9IHJhbmRvbV93cml0ZSwKKwkuaW9jdGwgPSByYW5kb21faW9jdGwsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYW5kb20gVVVJRCBpbnRlcmZhY2UKKyAqCisgKiBVc2VkIGhlcmUgZm9yIGEgQm9vdCBJRCwgYnV0IGNhbiBiZSB1c2VmdWwgZm9yIG90aGVyIGtlcm5lbAorICogZHJpdmVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBHZW5lcmF0ZSByYW5kb20gVVVJRAorICovCit2b2lkIGdlbmVyYXRlX3JhbmRvbV91dWlkKHVuc2lnbmVkIGNoYXIgdXVpZF9vdXRbMTZdKQoreworCWdldF9yYW5kb21fYnl0ZXModXVpZF9vdXQsIDE2KTsKKwkvKiBTZXQgVVVJRCB2ZXJzaW9uIHRvIDQgLS0tIHRydWVseSByYW5kb20gZ2VuZXJhdGlvbiAqLworCXV1aWRfb3V0WzZdID0gKHV1aWRfb3V0WzZdICYgMHgwRikgfCAweDQwOworCS8qIFNldCB0aGUgVVVJRCB2YXJpYW50IHRvIERDRSAqLworCXV1aWRfb3V0WzhdID0gKHV1aWRfb3V0WzhdICYgMHgzRikgfCAweDgwOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyYXRlX3JhbmRvbV91dWlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3lzY3RsIGludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19TWVNDVEwKKworI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCitzdGF0aWMgaW50IG1pbl9yZWFkX3RocmVzaCA9IDgsIG1pbl93cml0ZV90aHJlc2g7CitzdGF0aWMgaW50IG1heF9yZWFkX3RocmVzaCA9IElOUFVUX1BPT0xfV09SRFMgKiAzMjsKK3N0YXRpYyBpbnQgbWF4X3dyaXRlX3RocmVzaCA9IElOUFVUX1BPT0xfV09SRFMgKiAzMjsKK3N0YXRpYyBjaGFyIHN5c2N0bF9ib290aWRbMTZdOworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGlzIHVzZWQgdG8gcmV0dXJuIGJvdGggdGhlIGJvb3RpZCBVVUlELCBhbmQgcmFuZG9tCisgKiBVVUlELiAgVGhlIGRpZmZlcmVuY2UgaXMgaW4gd2hldGhlciB0YWJsZS0+ZGF0YSBpcyBOVUxMOyBpZiBpdCBpcywKKyAqIHRoZW4gYSBuZXcgVVVJRCBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkIHRvIHRoZSB1c2VyLgorICoKKyAqIElmIHRoZSB1c2VyIGFjY2Vzc2VzIHRoaXMgdmlhIHRoZSBwcm9jIGludGVyZmFjZSwgaXQgd2lsbCBiZSByZXR1cm5lZAorICogYXMgYW4gQVNDSUkgc3RyaW5nIGluIHRoZSBzdGFuZGFyZCBVVUlEIGZvcm1hdC4gIElmIGFjY2Vzc2VzIHZpYSB0aGUKKyAqIHN5c2N0bCBzeXN0ZW0gY2FsbCwgaXQgaXMgcmV0dXJuZWQgYXMgMTYgYnl0ZXMgb2YgYmluYXJ5IGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgcHJvY19kb191dWlkKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwljdGxfdGFibGUgZmFrZV90YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2NF0sIHRtcF91dWlkWzE2XSwgKnV1aWQ7CisKKwl1dWlkID0gdGFibGUtPmRhdGE7CisJaWYgKCF1dWlkKSB7CisJCXV1aWQgPSB0bXBfdXVpZDsKKwkJdXVpZFs4XSA9IDA7CisJfQorCWlmICh1dWlkWzhdID09IDApCisJCWdlbmVyYXRlX3JhbmRvbV91dWlkKHV1aWQpOworCisJc3ByaW50ZihidWYsICIlMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSIKKwkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCXV1aWRbMF0sICB1dWlkWzFdLCAgdXVpZFsyXSwgIHV1aWRbM10sCisJCXV1aWRbNF0sICB1dWlkWzVdLCAgdXVpZFs2XSwgIHV1aWRbN10sCisJCXV1aWRbOF0sICB1dWlkWzldLCAgdXVpZFsxMF0sIHV1aWRbMTFdLAorCQl1dWlkWzEyXSwgdXVpZFsxM10sIHV1aWRbMTRdLCB1dWlkWzE1XSk7CisJZmFrZV90YWJsZS5kYXRhID0gYnVmOworCWZha2VfdGFibGUubWF4bGVuID0gc2l6ZW9mKGJ1Zik7CisKKwlyZXR1cm4gcHJvY19kb3N0cmluZygmZmFrZV90YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgdXVpZF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJCSB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQoreworCXVuc2lnbmVkIGNoYXIgdG1wX3V1aWRbMTZdLCAqdXVpZDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFvbGR2YWwgfHwgIW9sZGxlbnApCisJCXJldHVybiAxOworCisJdXVpZCA9IHRhYmxlLT5kYXRhOworCWlmICghdXVpZCkgeworCQl1dWlkID0gdG1wX3V1aWQ7CisJCXV1aWRbOF0gPSAwOworCX0KKwlpZiAodXVpZFs4XSA9PSAwKQorCQlnZW5lcmF0ZV9yYW5kb21fdXVpZCh1dWlkKTsKKworCWlmIChnZXRfdXNlcihsZW4sIG9sZGxlbnApKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAobGVuKSB7CisJCWlmIChsZW4gPiAxNikKKwkJCWxlbiA9IDE2OworCQlpZiAoY29weV90b191c2VyKG9sZHZhbCwgdXVpZCwgbGVuKSB8fAorCQkgICAgcHV0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzeXNjdGxfcG9vbHNpemUgPSBJTlBVVF9QT09MX1dPUkRTICogMzI7CitjdGxfdGFibGUgcmFuZG9tX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUgCT0gUkFORE9NX1BPT0xTSVpFLAorCQkucHJvY25hbWUJPSAicG9vbHNpemUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3Bvb2xzaXplLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFJBTkRPTV9FTlRST1BZX0NPVU5ULAorCQkucHJvY25hbWUJPSAiZW50cm9weV9hdmFpbCIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJLmRhdGEJCT0gJmlucHV0X3Bvb2wuZW50cm9weV9jb3VudCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gUkFORE9NX1JFQURfVEhSRVNILAorCQkucHJvY25hbWUJPSAicmVhZF93YWtldXBfdGhyZXNob2xkIiwKKwkJLmRhdGEJCT0gJnJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fcmVhZF90aHJlc2gsCisJCS5leHRyYTIJCT0gJm1heF9yZWFkX3RocmVzaCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gUkFORE9NX1dSSVRFX1RIUkVTSCwKKwkJLnByb2NuYW1lCT0gIndyaXRlX3dha2V1cF90aHJlc2hvbGQiLAorCQkuZGF0YQkJPSAmcmFuZG9tX3dyaXRlX3dha2V1cF90aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fd3JpdGVfdGhyZXNoLAorCQkuZXh0cmEyCQk9ICZtYXhfd3JpdGVfdGhyZXNoLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBSQU5ET01fQk9PVF9JRCwKKwkJLnByb2NuYW1lCT0gImJvb3RfaWQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2Jvb3RpZCwKKwkJLm1heGxlbgkJPSAxNiwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX3V1aWQsCisJCS5zdHJhdGVneQk9ICZ1dWlkX3N0cmF0ZWd5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBSQU5ET01fVVVJRCwKKwkJLnByb2NuYW1lCT0gInV1aWQiLAorCQkubWF4bGVuCQk9IDE2LAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9fdXVpZCwKKwkJLnN0cmF0ZWd5CT0gJnV1aWRfc3RyYXRlZ3ksCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKyNlbmRpZiAJLyogQ09ORklHX1NZU0NUTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSYW5kb20gZnVudGlvbnMgZm9yIG5ldHdvcmtpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUQ1AgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgcGlja2luZy4gIFRoaXMgdXNlcyB0aGUgcmFuZG9tIG51bWJlcgorICogZ2VuZXJhdG9yIHRvIHBpY2sgYW4gaW5pdGlhbCBzZWNyZXQgdmFsdWUuICBUaGlzIHZhbHVlIGlzIGhhc2hlZAorICogYWxvbmcgd2l0aCB0aGUgVENQIGVuZHBvaW50IGluZm9ybWF0aW9uIHRvIHByb3ZpZGUgYSB1bmlxdWUKKyAqIHN0YXJ0aW5nIHBvaW50IGZvciBlYWNoIHBhaXIgb2YgVENQIGVuZHBvaW50cy4gIFRoaXMgZGVmZWF0cworICogYXR0YWNrcyB3aGljaCByZWx5IG9uIGd1ZXNzaW5nIHRoZSBpbml0aWFsIFRDUCBzZXF1ZW5jZSBudW1iZXIuCisgKiBUaGlzIGFsZ29yaXRobSB3YXMgc3VnZ2VzdGVkIGJ5IFN0ZXZlIEJlbGxvdmluLgorICoKKyAqIFVzaW5nIGEgdmVyeSBzdHJvbmcgaGFzaCB3YXMgdGFraW5nIGFuIGFwcHJlY2lhYmxlIGFtb3VudCBvZiB0aGUgdG90YWwKKyAqIFRDUCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgdGltZSwgc28gdGhpcyBpcyBhIHdlYWtlciBoYXNoLAorICogY29tcGVuc2F0ZWQgZm9yIGJ5IGNoYW5naW5nIHRoZSBzZWNyZXQgcGVyaW9kaWNhbGx5LgorICovCisKKy8qIEYsIEcgYW5kIEggYXJlIGJhc2ljIE1ENCBmdW5jdGlvbnM6IHNlbGVjdGlvbiwgbWFqb3JpdHksIHBhcml0eSAqLworI2RlZmluZSBGKHgsIHksIHopICgoeikgXiAoKHgpICYgKCh5KSBeICh6KSkpKQorI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHkpKSArICgoKHgpIF4gKHkpKSAmICh6KSkpCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKworLyoKKyAqIFRoZSBnZW5lcmljIHJvdW5kIGZ1bmN0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGlzIHNvIHNwZWNpZmljIHRoYXQKKyAqIHdlIGRvbid0IGJvdGhlciBwcm90ZWN0aW5nIGFsbCB0aGUgYXJndW1lbnRzIHdpdGggcGFyZW5zLCBhcyBpcyBnZW5lcmFsbHkKKyAqIGdvb2QgbWFjcm8gcHJhY3RpY2UsIGluIGZhdm9yIG9mIGV4dHJhIGxlZ2liaWxpdHkuCisgKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbgorICovCisjZGVmaW5lIFJPVU5EKGYsIGEsIGIsIGMsIGQsIHgsIHMpCVwKKwkoYSArPSBmKGIsIGMsIGQpICsgeCwgYSA9IChhIDw8IHMpIHwgKGEgPj4gKDMyIC0gcykpKQorI2RlZmluZSBLMSAwCisjZGVmaW5lIEsyIDAxMzI0MDQ3NDYzMVVMCisjZGVmaW5lIEszIDAxNTY2NjM2NTY0MVVMCisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKworc3RhdGljIF9fdTMyIHR3b3RoaXJkc01ENFRyYW5zZm9ybSAoX191MzIgY29uc3QgYnVmWzRdLCBfX3UzMiBjb25zdCBpblsxMl0pCit7CisJX191MzIgYSA9IGJ1ZlswXSwgYiA9IGJ1ZlsxXSwgYyA9IGJ1ZlsyXSwgZCA9IGJ1ZlszXTsKKworCS8qIFJvdW5kIDEgKi8KKwlST1VORChGLCBhLCBiLCBjLCBkLCBpblsgMF0gKyBLMSwgIDMpOworCVJPVU5EKEYsIGQsIGEsIGIsIGMsIGluWyAxXSArIEsxLCAgNyk7CisJUk9VTkQoRiwgYywgZCwgYSwgYiwgaW5bIDJdICsgSzEsIDExKTsKKwlST1VORChGLCBiLCBjLCBkLCBhLCBpblsgM10gKyBLMSwgMTkpOworCVJPVU5EKEYsIGEsIGIsIGMsIGQsIGluWyA0XSArIEsxLCAgMyk7CisJUk9VTkQoRiwgZCwgYSwgYiwgYywgaW5bIDVdICsgSzEsICA3KTsKKwlST1VORChGLCBjLCBkLCBhLCBiLCBpblsgNl0gKyBLMSwgMTEpOworCVJPVU5EKEYsIGIsIGMsIGQsIGEsIGluWyA3XSArIEsxLCAxOSk7CisJUk9VTkQoRiwgYSwgYiwgYywgZCwgaW5bIDhdICsgSzEsICAzKTsKKwlST1VORChGLCBkLCBhLCBiLCBjLCBpblsgOV0gKyBLMSwgIDcpOworCVJPVU5EKEYsIGMsIGQsIGEsIGIsIGluWzEwXSArIEsxLCAxMSk7CisJUk9VTkQoRiwgYiwgYywgZCwgYSwgaW5bMTFdICsgSzEsIDE5KTsKKworCS8qIFJvdW5kIDIgKi8KKwlST1VORChHLCBhLCBiLCBjLCBkLCBpblsgMV0gKyBLMiwgIDMpOworCVJPVU5EKEcsIGQsIGEsIGIsIGMsIGluWyAzXSArIEsyLCAgNSk7CisJUk9VTkQoRywgYywgZCwgYSwgYiwgaW5bIDVdICsgSzIsICA5KTsKKwlST1VORChHLCBiLCBjLCBkLCBhLCBpblsgN10gKyBLMiwgMTMpOworCVJPVU5EKEcsIGEsIGIsIGMsIGQsIGluWyA5XSArIEsyLCAgMyk7CisJUk9VTkQoRywgZCwgYSwgYiwgYywgaW5bMTFdICsgSzIsICA1KTsKKwlST1VORChHLCBjLCBkLCBhLCBiLCBpblsgMF0gKyBLMiwgIDkpOworCVJPVU5EKEcsIGIsIGMsIGQsIGEsIGluWyAyXSArIEsyLCAxMyk7CisJUk9VTkQoRywgYSwgYiwgYywgZCwgaW5bIDRdICsgSzIsICAzKTsKKwlST1VORChHLCBkLCBhLCBiLCBjLCBpblsgNl0gKyBLMiwgIDUpOworCVJPVU5EKEcsIGMsIGQsIGEsIGIsIGluWyA4XSArIEsyLCAgOSk7CisJUk9VTkQoRywgYiwgYywgZCwgYSwgaW5bMTBdICsgSzIsIDEzKTsKKworCS8qIFJvdW5kIDMgKi8KKwlST1VORChILCBhLCBiLCBjLCBkLCBpblsgM10gKyBLMywgIDMpOworCVJPVU5EKEgsIGQsIGEsIGIsIGMsIGluWyA3XSArIEszLCAgOSk7CisJUk9VTkQoSCwgYywgZCwgYSwgYiwgaW5bMTFdICsgSzMsIDExKTsKKwlST1VORChILCBiLCBjLCBkLCBhLCBpblsgMl0gKyBLMywgMTUpOworCVJPVU5EKEgsIGEsIGIsIGMsIGQsIGluWyA2XSArIEszLCAgMyk7CisJUk9VTkQoSCwgZCwgYSwgYiwgYywgaW5bMTBdICsgSzMsICA5KTsKKwlST1VORChILCBjLCBkLCBhLCBiLCBpblsgMV0gKyBLMywgMTEpOworCVJPVU5EKEgsIGIsIGMsIGQsIGEsIGluWyA1XSArIEszLCAxNSk7CisJUk9VTkQoSCwgYSwgYiwgYywgZCwgaW5bIDldICsgSzMsICAzKTsKKwlST1VORChILCBkLCBhLCBiLCBjLCBpblsgMF0gKyBLMywgIDkpOworCVJPVU5EKEgsIGMsIGQsIGEsIGIsIGluWyA0XSArIEszLCAxMSk7CisJUk9VTkQoSCwgYiwgYywgZCwgYSwgaW5bIDhdICsgSzMsIDE1KTsKKworCXJldHVybiBidWZbMV0gKyBiOyAvKiAibW9zdCBoYXNoZWQiIHdvcmQgKi8KKwkvKiBBbHRlcm5hdGl2ZTogcmV0dXJuIHN1bSBvZiBhbGwgd29yZHM/ICovCit9CisjZW5kaWYKKworI3VuZGVmIFJPVU5ECisjdW5kZWYgRgorI3VuZGVmIEcKKyN1bmRlZiBICisjdW5kZWYgSzEKKyN1bmRlZiBLMgorI3VuZGVmIEszCisKKy8qIFRoaXMgc2hvdWxkIG5vdCBiZSBkZWNyZWFzZWQgc28gbG93IHRoYXQgSVNOcyB3cmFwIHRvbyBmYXN0LiAqLworI2RlZmluZSBSRUtFWV9JTlRFUlZBTCAoMzAwICogSFopCisvKgorICogQml0IGxheW91dCBvZiB0aGUgdGNwIHNlcXVlbmNlIG51bWJlcnMgKGJlZm9yZSBhZGRpbmcgY3VycmVudCB0aW1lKToKKyAqIGJpdCAyNC0zMTogaW5jcmVhc2VkIGFmdGVyIGV2ZXJ5IGtleSBleGNoYW5nZQorICogYml0IDAtMjM6IGhhc2goc291cmNlLGRlc3QpCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIGFsZ29yaXRobSBkZXNjcmliZWQKKyAqIGluIHRoZSBBcHBlbmRpeCBvZiBSRkMgMTE4NSwgZXhjZXB0IHRoYXQKKyAqIC0gaXQgdXNlcyBhIDEgTUh6IGNsb2NrIGluc3RlYWQgb2YgYSAyNTAga0h6IGNsb2NrCisgKiAtIGl0IHBlcmZvcm1zIGEgcmVrZXkgZXZlcnkgNSBtaW51dGVzLCB3aGljaCBpcyBlcXVpdmFsZW50CisgKiAJdG8gYSAoc291cmNlLGRlc3QpIHR1bHBsZSBkZXBlbmRlbnQgZm9yd2FyZCBqdW1wIG9mIHRoZQorICogCWNsb2NrIGJ5IDAuLjJeKEhBU0hfQklUUysxKQorICoKKyAqIFRodXMgdGhlIGF2ZXJhZ2UgSVNOIHdyYXBhcm91bmQgdGltZSBpcyA2OCBtaW51dGVzIGluc3RlYWQgb2YKKyAqIDQuNTUgaG91cnMuCisgKgorICogU01QIGNsZWFudXAgYW5kIGxvY2sgYXZvaWRhbmNlIHdpdGggcG9vciBtYW4ncyBSQ1UuCisgKiAJCQlNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgorICoKKyAqLworI2RlZmluZSBDT1VOVF9CSVRTIDgKKyNkZWZpbmUgQ09VTlRfTUFTSyAoKDEgPDwgQ09VTlRfQklUUykgLSAxKQorI2RlZmluZSBIQVNIX0JJVFMgMjQKKyNkZWZpbmUgSEFTSF9NQVNLICgoMSA8PCBIQVNIX0JJVFMpIC0gMSkKKworc3RhdGljIHN0cnVjdCBrZXlkYXRhIHsKKwlfX3UzMiBjb3VudDsgLyogYWxyZWFkeSBzaGlmdGVkIHRvIHRoZSBmaW5hbCBwb3NpdGlvbiAqLworCV9fdTMyIHNlY3JldFsxMl07Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcF9rZXlkYXRhWzJdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2NudDsKKworc3RhdGljIHZvaWQgcmVrZXlfc2VxX2dlbmVyYXRvcih2b2lkICpwcml2YXRlXyk7CisKK3N0YXRpYyBERUNMQVJFX1dPUksocmVrZXlfd29yaywgcmVrZXlfc2VxX2dlbmVyYXRvciwgTlVMTCk7CisKKy8qCisgKiBMb2NrIGF2b2lkYW5jZToKKyAqIFRoZSBJU04gZ2VuZXJhdGlvbiBydW5zIGxvY2tsZXNzIC0gaXQncyBqdXN0IGEgaGFzaCBvdmVyIHJhbmRvbSBkYXRhLgorICogU3RhdGUgY2hhbmdlcyBoYXBwZW4gZXZlcnkgNSBtaW51dGVzIHdoZW4gdGhlIHJhbmRvbSBrZXkgaXMgcmVwbGFjZWQuCisgKiBTeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkIGJ5IGhhdmluZyB0d28gY29waWVzIG9mIHRoZSBoYXNoIGZ1bmN0aW9uCisgKiBzdGF0ZSBhbmQgcmVrZXlfc2VxX2dlbmVyYXRvciBhbHdheXMgdXBkYXRlcyB0aGUgaW5hY3RpdmUgY29weS4KKyAqIFRoZSBjb3B5IGlzIHRoZW4gYWN0aXZhdGVkIGJ5IHVwZGF0aW5nIGlwX2NudC4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBicmVha3MgZG93biBpZiBzb21lb25lIGJsb2NrcyB0aGUgdGhyZWFkCisgKiB0aGF0IHByb2Nlc3NlcyBTWU4gcmVxdWVzdHMgZm9yIG1vcmUgdGhhbiA1IG1pbnV0ZXMuIFNob3VsZCBuZXZlcgorICogaGFwcGVuLCBhbmQgZXZlbiBpZiB0aGF0IGhhcHBlbnMgb25seSBhIG5vdCBwZXJmZWN0bHkgY29tcGxpYW50CisgKiBJU04gaXMgZ2VuZXJhdGVkLCBub3RoaW5nIGZhdGFsLgorICovCitzdGF0aWMgdm9pZCByZWtleV9zZXFfZ2VuZXJhdG9yKHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSAmaXBfa2V5ZGF0YVsxIF4gKGlwX2NudCAmIDEpXTsKKworCWdldF9yYW5kb21fYnl0ZXMoa2V5cHRyLT5zZWNyZXQsIHNpemVvZihrZXlwdHItPnNlY3JldCkpOworCWtleXB0ci0+Y291bnQgPSAoaXBfY250ICYgQ09VTlRfTUFTSykgPDwgSEFTSF9CSVRTOworCXNtcF93bWIoKTsKKwlpcF9jbnQrKzsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJla2V5X3dvcmssIFJFS0VZX0lOVEVSVkFMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2V5ZGF0YSAqZ2V0X2tleXB0cih2b2lkKQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSAmaXBfa2V5ZGF0YVtpcF9jbnQgJiAxXTsKKworCXNtcF9ybWIoKTsKKworCXJldHVybiBrZXlwdHI7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHNlcWdlbl9pbml0KHZvaWQpCit7CisJcmVrZXlfc2VxX2dlbmVyYXRvcihOVUxMKTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc2VxZ2VuX2luaXQpOworCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCitfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fdTMyICpzYWRkciwgX191MzIgKmRhZGRyLAorCQkJCSAgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlfX3UzMiBzZXE7CisJX191MzIgaGFzaFsxMl07CisJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKKworCS8qIFRoZSBwcm9jZWR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIElQdjQsIGJ1dCBhZGRyZXNzZXMgYXJlIGxvbmdlci4KKwkgKiBUaHVzIHdlIG11c3QgdXNlIHR3b3RoaXJkc01ENFRyYW5zZm9ybS4KKwkgKi8KKworCW1lbWNweShoYXNoLCBzYWRkciwgMTYpOworCWhhc2hbNF09KHNwb3J0IDw8IDE2KSArIGRwb3J0OworCW1lbWNweSgmaGFzaFs1XSxrZXlwdHItPnNlY3JldCxzaXplb2YoX191MzIpICogNyk7CisKKwlzZXEgPSB0d290aGlyZHNNRDRUcmFuc2Zvcm0oZGFkZHIsIGhhc2gpICYgSEFTSF9NQVNLOworCXNlcSArPSBrZXlwdHItPmNvdW50OworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJc2VxICs9IHR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwOworCisJcmV0dXJuIHNlcTsKK30KK0VYUE9SVF9TWU1CT0woc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcik7CisjZW5kaWYKKworLyogIFRoZSBjb2RlIGJlbG93IGlzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKCkuCisgKiAgQWxsIGJsYW1lcyB0byBBbmRyZXkgVi4gU2F2b2Noa2luIDxzYXdAbXN1LnJ1Pi4KKyAqLworX191MzIgc2VjdXJlX2lwX2lkKF9fdTMyIGRhZGRyKQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHI7CisJX191MzIgaGFzaFs0XTsKKworCWtleXB0ciA9IGdldF9rZXlwdHIoKTsKKworCS8qCisJICogIFBpY2sgYSB1bmlxdWUgc3RhcnRpbmcgb2Zmc2V0IGZvciBlYWNoIElQIGRlc3RpbmF0aW9uLgorCSAqICBUaGUgZGVzdCBpcCBhZGRyZXNzIGlzIHBsYWNlZCBpbiB0aGUgc3RhcnRpbmcgdmVjdG9yLAorCSAqICB3aGljaCBpcyB0aGVuIGhhc2hlZCB3aXRoIHJhbmRvbSBkYXRhLgorCSAqLworCWhhc2hbMF0gPSBkYWRkcjsKKwloYXNoWzFdID0ga2V5cHRyLT5zZWNyZXRbOV07CisJaGFzaFsyXSA9IGtleXB0ci0+c2VjcmV0WzEwXTsKKwloYXNoWzNdID0ga2V5cHRyLT5zZWNyZXRbMTFdOworCisJcmV0dXJuIGhhbGZfbWQ0X3RyYW5zZm9ybShoYXNoLCBrZXlwdHItPnNlY3JldCk7Cit9CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCitfX3UzMiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCisJCQkJIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlfX3UzMiBzZXE7CisJX191MzIgaGFzaFs0XTsKKwlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOworCisJLyoKKwkgKiAgUGljayBhIHVuaXF1ZSBzdGFydGluZyBvZmZzZXQgZm9yIGVhY2ggVENQIGNvbm5lY3Rpb24gZW5kcG9pbnRzCisJICogIChzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCkuCisJICogIE5vdGUgdGhhdCB0aGUgd29yZHMgYXJlIHBsYWNlZCBpbnRvIHRoZSBzdGFydGluZyB2ZWN0b3IsIHdoaWNoIGlzCisJICogIHRoZW4gbWl4ZWQgd2l0aCBhIHBhcnRpYWwgTUQ0IG92ZXIgcmFuZG9tIGRhdGEuCisJICovCisJaGFzaFswXT1zYWRkcjsKKwloYXNoWzFdPWRhZGRyOworCWhhc2hbMl09KHNwb3J0IDw8IDE2KSArIGRwb3J0OworCWhhc2hbM109a2V5cHRyLT5zZWNyZXRbMTFdOworCisJc2VxID0gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KSAmIEhBU0hfTUFTSzsKKwlzZXEgKz0ga2V5cHRyLT5jb3VudDsKKwkvKgorCSAqCUFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIFJGQyA3OTMsIHdoaWNoCisJICoJc3VnZ2VzdHMgdXNpbmcgYSAyNTAga0h6IGNsb2NrLgorCSAqCUZ1cnRoZXIgcmVhZGluZyBzaG93cyB0aGlzIGFzc3VtZXMgMiBNYi9zIG5ldHdvcmtzLgorCSAqCUZvciAxMCBNYi9zIEV0aGVybmV0LCBhIDEgTUh6IGNsb2NrIGlzIGFwcHJvcHJpYXRlLgorCSAqCVRoYXQncyBmdW5ueSwgTGludXggaGFzIG9uZSBidWlsdCBpbiEgIFVzZSBpdCEKKwkgKgkoTmV0d29ya3MgYXJlIGZhc3RlciBub3cgLSBzaG91bGQgdGhpcyBiZSBpbmNyZWFzZWQ/KQorCSAqLworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCXNlcSArPSB0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMDsKKyNpZiAwCisJcHJpbnRrKCJpbml0X3NlcSglbHgsICVseCwgJWQsICVkKSA9ICVkXG4iLAorCSAgICAgICBzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCwgc2VxKTsKKyNlbmRpZgorCXJldHVybiBzZXE7Cit9CisKK0VYUE9SVF9TWU1CT0woc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOworCisKKworLyogR2VuZXJhdGUgc2VjdXJlIHN0YXJ0aW5nIHBvaW50IGZvciBlcGhlbWVyYWwgVENQIHBvcnQgc2VhcmNoICovCit1MzIgc2VjdXJlX3RjcF9wb3J0X2VwaGVtZXJhbChfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CisJdTMyIGhhc2hbNF07CisKKwkvKgorCSAqICBQaWNrIGEgdW5pcXVlIHN0YXJ0aW5nIG9mZnNldCBmb3IgZWFjaCBlcGhlbWVyYWwgcG9ydCBzZWFyY2gKKwkgKiAgKHNhZGRyLCBkYWRkciwgZHBvcnQpIGFuZCA0OGJpdHMgb2YgcmFuZG9tIGRhdGEuCisJICovCisJaGFzaFswXSA9IHNhZGRyOworCWhhc2hbMV0gPSBkYWRkcjsKKwloYXNoWzJdID0gZHBvcnQgXiBrZXlwdHItPnNlY3JldFsxMF07CisJaGFzaFszXSA9IGtleXB0ci0+c2VjcmV0WzExXTsKKworCXJldHVybiBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCit1MzIgc2VjdXJlX3RjcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fdTMyICpzYWRkciwgY29uc3QgX191MzIgKmRhZGRyLCBfX3UxNiBkcG9ydCkKK3sKKwlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOworCXUzMiBoYXNoWzEyXTsKKworCW1lbWNweShoYXNoLCBzYWRkciwgMTYpOworCWhhc2hbNF0gPSBkcG9ydDsKKwltZW1jcHkoJmhhc2hbNV0sa2V5cHRyLT5zZWNyZXQsc2l6ZW9mKF9fdTMyKSAqIDcpOworCisJcmV0dXJuIHR3b3RoaXJkc01ENFRyYW5zZm9ybShkYWRkciwgaGFzaCk7Cit9CitFWFBPUlRfU1lNQk9MKHNlY3VyZV90Y3B2Nl9wb3J0X2VwaGVtZXJhbCk7CisjZW5kaWYKKworI2VuZGlmIC8qIENPTkZJR19JTkVUICovCisKKworLyoKKyAqIEdldCBhIHJhbmRvbSB3b3JkIGZvciBpbnRlcm5hbCBrZXJuZWwgdXNlIG9ubHkuIFNpbWlsYXIgdG8gdXJhbmRvbSBidXQKKyAqIHdpdGggdGhlIGdvYWwgb2YgbWluaW1hbCBlbnRyb3B5IHBvb2wgZGVwbGV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIHJhbmRvbQorICogdmFsdWUgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBidXQgZm9yIHNldmVyYWwgdXNlcyB0aGUgY29zdCBvZgorICogZGVwbGV0aW5nIGVudHJvcHkgaXMgdG9vIGhpZ2gKKyAqLwordW5zaWduZWQgaW50IGdldF9yYW5kb21faW50KHZvaWQpCit7CisJLyoKKwkgKiBVc2UgSVAncyBSTkcuIEl0IHN1aXRzIG91ciBwdXJwb3NlIHBlcmZlY3RseTogaXQgcmUta2V5cyBpdHNlbGYKKwkgKiBldmVyeSBzZWNvbmQsIGZyb20gdGhlIGVudHJvcHkgcG9vbCAoYW5kIHRodXMgY3JlYXRlcyBhIGxpbWl0ZWQKKwkgKiBkcmFpbiBvbiBpdCksIGFuZCB1c2VzIGhhbGZNRDRUcmFuc2Zvcm0gd2l0aGluIHRoZSBzZWNvbmQuIFdlCisJICogYWxzbyBtaXggaXQgd2l0aCBqaWZmaWVzIGFuZCB0aGUgUElEOgorCSAqLworCXJldHVybiBzZWN1cmVfaXBfaWQoY3VycmVudC0+cGlkICsgamlmZmllcyk7Cit9CisKKy8qCisgKiByYW5kb21pemVfcmFuZ2UoKSByZXR1cm5zIGEgc3RhcnQgYWRkcmVzcyBzdWNoIHRoYXQKKyAqCisgKiAgICBbLi4uLi4uIDxyYW5nZT4gLi4uLi5dCisgKiAgc3RhcnQgICAgICAgICAgICAgICAgICBlbmQKKyAqCisgKiBhIDxyYW5nZT4gd2l0aCBzaXplICJsZW4iIHN0YXJ0aW5nIGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgaW5zaWRlIGluIHRoZQorICogYXJlYSBkZWZpbmVkIGJ5IFtzdGFydCwgZW5kXSwgYnV0IGlzIG90aGVyd2lzZSByYW5kb21pemVkLgorICovCit1bnNpZ25lZCBsb25nCityYW5kb21pemVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBlbmQgLSBsZW4gLSBzdGFydDsKKworCWlmIChlbmQgPD0gc3RhcnQgKyBsZW4pCisJCXJldHVybiAwOworCXJldHVybiBQQUdFX0FMSUdOKGdldF9yYW5kb21faW50KCkgJSByYW5nZSArIHN0YXJ0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYXcuYyBiL2RyaXZlcnMvY2hhci9yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmUzM2VjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jhdy5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3Jhdy5jCisgKgorICogRnJvbnQtZW5kIHJhdyBjaGFyYWN0ZXIgZGV2aWNlcy4gIFRoZXNlIGNhbiBiZSBib3VuZCB0byBhbnkgYmxvY2sKKyAqIGRldmljZXMgdG8gcHJvdmlkZSBnZW51aW5lIFVuaXggcmF3IGNoYXJhY3RlciBkZXZpY2Ugc2VtYW50aWNzLgorICoKKyAqIFdlIHJlc2VydmUgbWlub3IgbnVtYmVyIDAgZm9yIGEgY29udHJvbCBpbnRlcmZhY2UuICBpb2N0bCgpcyBvbiB0aGlzCisgKiBkZXZpY2UgYXJlIHVzZWQgdG8gYmluZCB0aGUgb3RoZXIgbWlub3IgbnVtYmVycyB0byBibG9jayBkZXZpY2VzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jhdy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdHJ1Y3QgcmF3X2RldmljZV9kYXRhIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiaW5kaW5nOworCWludCBpbnVzZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpyYXdfY2xhc3M7CitzdGF0aWMgc3RydWN0IHJhd19kZXZpY2VfZGF0YSByYXdfZGV2aWNlc1tNQVhfUkFXX01JTk9SU107CitzdGF0aWMgREVDTEFSRV9NVVRFWChyYXdfbXV0ZXgpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2N0bF9mb3BzOwkgICAgIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworLyoKKyAqIE9wZW4vY2xvc2UgY29kZSBmb3IgcmF3IElPLgorICoKKyAqIFdlIGp1c3QgcmV3cml0ZSB0aGUgaV9tYXBwaW5nIGZvciB0aGUgL2Rldi9yYXcvcmF3TiBmaWxlIGRlc2NyaXB0b3IgdG8KKyAqIHBvaW50IGF0IHRoZSBibG9ja2RldidzIGFkZHJlc3Nfc3BhY2UgYW5kIHNldCB0aGUgZmlsZSBoYW5kbGUgdG8gdXNlCisgKiBPX0RJUkVDVC4KKyAqCisgKiBTZXQgdGhlIGRldmljZSdzIHNvZnQgYmxvY2tzaXplIHRvIHRoZSBtaW5pbXVtIHBvc3NpYmxlLiAgVGhpcyBnaXZlcyB0aGUKKyAqIGZpbmVzdCBwb3NzaWJsZSBhbGlnbm1lbnQgYW5kIGhhcyBubyBhZHZlcnNlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4KKyAqLworc3RhdGljIGludCByYXdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwljb25zdCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJaW50IGVycjsKKworCWlmIChtaW5vciA9PSAwKSB7CS8qIEl0IGlzIHRoZSBjb250cm9sIGRldmljZSAqLworCQlmaWxwLT5mX29wID0gJnJhd19jdGxfZm9wczsKKwkJcmV0dXJuIDA7CisJfQorCisJZG93bigmcmF3X211dGV4KTsKKworCS8qCisJICogQWxsIHdlIG5lZWQgdG8gZG8gb24gb3BlbiBpcyBjaGVjayB0aGF0IHRoZSBkZXZpY2UgaXMgYm91bmQuCisJICovCisJYmRldiA9IHJhd19kZXZpY2VzW21pbm9yXS5iaW5kaW5nOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFiZGV2KQorCQlnb3RvIG91dDsKKwlpZ3JhYihiZGV2LT5iZF9pbm9kZSk7CisJZXJyID0gYmxrZGV2X2dldChiZGV2LCBmaWxwLT5mX21vZGUsIDApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IGJkX2NsYWltKGJkZXYsIHJhd19vcGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gc2V0X2Jsb2Nrc2l6ZShiZGV2LCBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwlmaWxwLT5mX2ZsYWdzIHw9IE9fRElSRUNUOworCWZpbHAtPmZfbWFwcGluZyA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CisJaWYgKCsrcmF3X2RldmljZXNbbWlub3JdLmludXNlID09IDEpCisJCWZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcgPQorCQkJYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBiZGV2OworCXVwKCZyYXdfbXV0ZXgpOworCXJldHVybiAwOworCitvdXQyOgorCWJkX3JlbGVhc2UoYmRldik7CitvdXQxOgorCWJsa2Rldl9wdXQoYmRldik7CitvdXQ6CisJdXAoJnJhd19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFdoZW4gdGhlIGZpbmFsIGZkIHdoaWNoIHJlZmVycyB0byB0aGlzIGNoYXJhY3Rlci1zcGVjaWFsIG5vZGUgaXMgY2xvc2VkLCB3ZQorICogbWFrZSBpdHMgLT5tYXBwaW5nIHBvaW50IGJhY2sgYXQgaXRzIG93biBpX2RhdGEuCisgKi8KK3N0YXRpYyBpbnQgcmF3X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJY29uc3QgaW50IG1pbm9yPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKKwlkb3duKCZyYXdfbXV0ZXgpOworCWJkZXYgPSByYXdfZGV2aWNlc1ttaW5vcl0uYmluZGluZzsKKwlpZiAoLS1yYXdfZGV2aWNlc1ttaW5vcl0uaW51c2UgPT0gMCkgeworCQkvKiBIZXJlICBpbm9kZS0+aV9tYXBwaW5nID09IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcgICovCisJCWlub2RlLT5pX21hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CisJfQorCXVwKCZyYXdfbXV0ZXgpOworCisJYmRfcmVsZWFzZShiZGV2KTsKKwlibGtkZXZfcHV0KGJkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogRm9yd2FyZCBpb2N0bHMgdG8gdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlLgorICovCitzdGF0aWMgaW50CityYXdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gaW9jdGxfYnlfYmRldihiZGV2LCBjb21tYW5kLCBhcmcpOworfQorCitzdGF0aWMgdm9pZCBiaW5kX2RldmljZShzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0ICpycSkKK3sKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihSQVdfTUFKT1IsIHJxLT5yYXdfbWlub3IpKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChyYXdfY2xhc3MsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vciksCisJCQkJICAgICAgTlVMTCwgInJhdyVkIiwgcnEtPnJhd19taW5vcik7Cit9CisKKy8qCisgKiBEZWFsIHdpdGggaW9jdGxzIGFnYWluc3QgdGhlIHJhdy1kZXZpY2UgY29udHJvbCBpbnRlcmZhY2UsIHRvIGJpbmQKKyAqIGFuZCB1bmJpbmQgb3RoZXIgcmF3IGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgcmF3X2N0bF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0IHJxOworCXN0cnVjdCByYXdfZGV2aWNlX2RhdGEgKnJhd2RldjsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgUkFXX1NFVEJJTkQ6CisJY2FzZSBSQVdfR0VUQklORDoKKworCQkvKiBGaXJzdCwgZmluZCBvdXQgd2hpY2ggcmF3IG1pbm9yIHdlIHdhbnQgKi8KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJxLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocnEpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHJxLnJhd19taW5vciA8IDAgfHwgcnEucmF3X21pbm9yID49IE1BWF9SQVdfTUlOT1JTKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmF3ZGV2ID0gJnJhd19kZXZpY2VzW3JxLnJhd19taW5vcl07CisKKwkJaWYgKGNvbW1hbmQgPT0gUkFXX1NFVEJJTkQpIHsKKwkJCWRldl90IGRldjsKKworCQkJLyoKKwkJCSAqIFRoaXMgaXMgbGlrZSBtYWtpbmcgYmxvY2sgZGV2aWNlcywgc28gZGVtYW5kIHRoZQorCQkJICogc2FtZSBjYXBhYmlsaXR5CisJCQkgKi8KKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEZvciBub3csIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgdW5kZXJseWluZworCQkJICogYmxvY2sgZGV2aWNlIGlzIHByZXNlbnQgb3Igbm90OiB3ZSBjYW4gZG8gdGhhdCB3aGVuCisJCQkgKiB0aGUgcmF3IGRldmljZSBpcyBvcGVuZWQuICBKdXN0IGNoZWNrIHRoYXQgdGhlCisJCQkgKiBtYWpvci9taW5vciBudW1iZXJzIG1ha2Ugc2Vuc2UuCisJCQkgKi8KKworCQkJZGV2ID0gTUtERVYocnEuYmxvY2tfbWFqb3IsIHJxLmJsb2NrX21pbm9yKTsKKwkJCWlmICgocnEuYmxvY2tfbWFqb3IgPT0gMCAmJiBycS5ibG9ja19taW5vciAhPSAwKSB8fAorCQkJCQlNQUpPUihkZXYpICE9IHJxLmJsb2NrX21ham9yIHx8CisJCQkJCU1JTk9SKGRldikgIT0gcnEuYmxvY2tfbWlub3IpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlkb3duKCZyYXdfbXV0ZXgpOworCQkJaWYgKHJhd2Rldi0+aW51c2UpIHsKKwkJCQl1cCgmcmF3X211dGV4KTsKKwkJCQllcnIgPSAtRUJVU1k7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAocmF3ZGV2LT5iaW5kaW5nKSB7CisJCQkJYmRwdXQocmF3ZGV2LT5iaW5kaW5nKTsKKwkJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwkJCX0KKwkJCWlmIChycS5ibG9ja19tYWpvciA9PSAwICYmIHJxLmJsb2NrX21pbm9yID09IDApIHsKKwkJCQkvKiB1bmJpbmQgKi8KKwkJCQlyYXdkZXYtPmJpbmRpbmcgPSBOVUxMOworCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFJBV19NQUpPUiwKKwkJCQkJCQkJcnEucmF3X21pbm9yKSk7CisJCQl9IGVsc2UgeworCQkJCXJhd2Rldi0+YmluZGluZyA9IGJkZ2V0KGRldik7CisJCQkJaWYgKHJhd2Rldi0+YmluZGluZyA9PSBOVUxMKQorCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCWVsc2UgeworCQkJCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQkJCQliaW5kX2RldmljZSgmcnEpOworCQkJCX0KKwkJCX0KKwkJCXVwKCZyYXdfbXV0ZXgpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKworCQkJZG93bigmcmF3X211dGV4KTsKKwkJCWJkZXYgPSByYXdkZXYtPmJpbmRpbmc7CisJCQlpZiAoYmRldikgeworCQkJCXJxLmJsb2NrX21ham9yID0gTUFKT1IoYmRldi0+YmRfZGV2KTsKKwkJCQlycS5ibG9ja19taW5vciA9IE1JTk9SKGJkZXYtPmJkX2Rldik7CisJCQl9IGVsc2UgeworCQkJCXJxLmJsb2NrX21ham9yID0gcnEuYmxvY2tfbWlub3IgPSAwOworCQkJfQorCQkJdXAoJnJhd19tdXRleCk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJxLCBzaXplb2YocnEpKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJhd19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpb3ZlYyBsb2NhbF9pb3YgPSB7CisJCS5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKWJ1ZiwKKwkJLmlvdl9sZW4gPSBjb3VudAorCX07CisKKwlyZXR1cm4gZ2VuZXJpY19maWxlX3dyaXRlX25vbG9jayhmaWxlLCAmbG9jYWxfaW92LCAxLCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QgcmF3X2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBpb3ZlYyBsb2NhbF9pb3YgPSB7CisJCS5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKWJ1ZiwKKwkJLmlvdl9sZW4gPSBjb3VudAorCX07CisKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZV9ub2xvY2soaW9jYiwgJmxvY2FsX2lvdiwgMSwgJmlvY2ItPmtpX3Bvcyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2ZvcHMgPSB7CisJLnJlYWQJPQlnZW5lcmljX2ZpbGVfcmVhZCwKKwkuYWlvX3JlYWQgPSAJZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS53cml0ZQk9CXJhd19maWxlX3dyaXRlLAorCS5haW9fd3JpdGUgPSAJcmF3X2ZpbGVfYWlvX3dyaXRlLAorCS5vcGVuCT0JcmF3X29wZW4sCisJLnJlbGVhc2U9CXJhd19yZWxlYXNlLAorCS5pb2N0bAk9CXJhd19pb2N0bCwKKwkucmVhZHYJPSAJZ2VuZXJpY19maWxlX3JlYWR2LAorCS53cml0ZXYJPSAJZ2VuZXJpY19maWxlX3dyaXRldiwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhd19jdGxfZm9wcyA9IHsKKwkuaW9jdGwJPQlyYXdfY3RsX2lvY3RsLAorCS5vcGVuCT0JcmF3X29wZW4sCisJLm93bmVyCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IGNkZXYgcmF3X2NkZXYgPSB7CisJLmtvYmoJPQl7Lm5hbWUgPSAicmF3IiwgfSwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJhd19pbml0KHZvaWQpCit7CisJaW50IGk7CisJZGV2X3QgZGV2ID0gTUtERVYoUkFXX01BSk9SLCAwKTsKKworCWlmIChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgTUFYX1JBV19NSU5PUlMsICJyYXciKSkKKwkJZ290byBlcnJvcjsKKworCWNkZXZfaW5pdCgmcmF3X2NkZXYsICZyYXdfZm9wcyk7CisJaWYgKGNkZXZfYWRkKCZyYXdfY2RldiwgZGV2LCBNQVhfUkFXX01JTk9SUykpIHsKKwkJa29iamVjdF9wdXQoJnJhd19jZGV2LmtvYmopOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBNQVhfUkFXX01JTk9SUyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmF3X2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInJhdyIpOworCWlmIChJU19FUlIocmF3X2NsYXNzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNyZWF0aW5nIHJhdyBjbGFzcy5cbiIpOworCQljZGV2X2RlbCgmcmF3X2NkZXYpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBNQVhfUkFXX01JTk9SUyk7CisJCWdvdG8gZXJyb3I7CisJfQorCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHJhd19jbGFzcywgTUtERVYoUkFXX01BSk9SLCAwKSwgTlVMTCwgInJhd2N0bCIpOworCisJZGV2ZnNfbWtfY2RldihNS0RFVihSQVdfTUFKT1IsIDApLAorCQkgICAgICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCSAgICAgICJyYXcvcmF3Y3RsIik7CisJZm9yIChpID0gMTsgaSA8IE1BWF9SQVdfTUlOT1JTOyBpKyspCisJCWRldmZzX21rX2NkZXYoTUtERVYoUkFXX01BSk9SLCBpKSwKKwkJCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJCSAgICAgICJyYXcvcmF3JWQiLCBpKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcHJpbnRrKEtFUk5fRVJSICJlcnJvciByZWdpc3RlciByYXcgZGV2aWNlXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhd19leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgTUFYX1JBV19NSU5PUlM7IGkrKykKKwkJZGV2ZnNfcmVtb3ZlKCJyYXcvcmF3JWQiLCBpKTsKKwlkZXZmc19yZW1vdmUoInJhdy9yYXdjdGwiKTsKKwlkZXZmc19yZW1vdmUoInJhdyIpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFJBV19NQUpPUiwgMCkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KHJhd19jbGFzcyk7CisJY2Rldl9kZWwoJnJhd19jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoUkFXX01BSk9SLCAwKSwgTUFYX1JBV19NSU5PUlMpOworfQorCittb2R1bGVfaW5pdChyYXdfaW5pdCk7Cittb2R1bGVfZXhpdChyYXdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3Jpby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UyYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggcmlvLXN1YnN5c3RlbS4KKyMKKyMgKEMpIFIuRS5Xb2xmZkBCaXRXaXphcmQubmwgCisjIAorIyBUaGlzIGZpbGUgaXMgR1BMLiBTZWUgb3RoZXIgZmlsZXMgZm9yIHRoZSBmdWxsIEJsdXJiLiBJJ20gbGF6eSB0b2RheS4gCisjCisKK29iai0kKENPTkZJR19SSU8pICs9IHJpby5vCisKK3Jpby1vYmpzIDo9IHJpb19saW51eC5vIHJpb2luaXQubyByaW9ib290Lm8gcmlvY21kLm8gcmlvY3RybC5vIHJpb2ludHIubyBcCisgICAgICAgICAgICByaW9wYXJhbS5vIHJpb3BjaWNvcHkubyByaW9yb3V0ZS5vIHJpb3RhYmxlLm8gcmlvdHR5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vYm9hcmQuaCBiL2RyaXZlcnMvY2hhci9yaW8vYm9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM5N2UxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9ib2FyZC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4gCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogYm9hcmQuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDcKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCisqKiAgaWRlbnQgQCgjKWJvYXJkLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJX19yaW9fYm9hcmRfaF9fCisjZGVmaW5lCV9fcmlvX2JvYXJkX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfYm9hcmRfaF9zY2NzXyA9ICJAKCMpYm9hcmQuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBib2FyZC5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlICpoYXJkd2FyZSogb2YgdGhlIGhvc3QgY2FyZHMuCisqKiBJdCBkZXNjcmliZXMgdGhlIG1lbW9yeSBvdmVybGF5IGZvciB0aGUgZHVhbCBwb3J0IFJBTSBhcmVhLgorKi8KKworI2RlZmluZQlEUF9TUkFNMV9TSVpFCTB4N0MwMAorI2RlZmluZQlEUF9TUkFNMl9TSVpFCTB4MDIwMAorI2RlZmluZQlEUF9TUkFNM19TSVpFCTB4NzAwMAorI2RlZmluZQlEUF9TQ1JBVENIX1NJWkUJMHgxMDAwCisjZGVmaW5lCURQX1BBUk1NQVBfQUREUgkweDAxRkUJLyogb2Zmc2V0IGludG8gU1JBTTIgKi8KKyNkZWZpbmUJRFBfU1RBUlRVUF9BRERSCTB4MDFGOAkvKiBvZmZzZXQgaW50byBTUkFNMiAqLworCisvKgorKioJVGhlIHNoYXBlIG9mIHRoZSBIb3N0IENvbnRyb2wgYXJlYSwgYXQgb2Zmc2V0IDB4N0MwMCwgV3JpdGUgT25seQorKi8KK3N0cnVjdCBzX0N0cmwKK3sKKwlCWVRFCURwQ3RsOwkJCQkvKiA3QzAwICovCisJQllURQlEcF9VbnVzZWQyX1sxMjddOworCUJZVEUJRHBJbnRTZXQ7CQkJLyogN0M4MCAqLworCUJZVEUJRHBfVW51c2VkM19bMTI3XTsKKwlCWVRFCURwVHB1UmVzZXQ7CQkJLyogN0QwMCAqLworCUJZVEUJRHBfVW51c2VkNF9bMTI3XTsKKwlCWVRFCURwSW50UmVzZXQ7CQkJLyogN0Q4MCAqLworCUJZVEUJRHBfVW51c2VkNV9bMTI3XTsKK307CisKKy8qCisqKiBUaGUgUFJPTSBkYXRhIGFyZWEgb24gdGhlIGhvc3QgKDB4N0MwMCksIFJlYWQgT25seQorKi8KK3N0cnVjdCBzX1Byb20KK3sKKwlXT1JECURwU2x4Q29kZVsyXTsKKwlXT1JECURwUmV2OworCVdPUkQJRHBfVW51c2VkNl87CisJV09SRAlEcFVuaXFbNF07CisJV09SRAlEcEphaHJlOworCVdPUkQJRHBXb2NoZTsKKwlXT1JECURwSHdGZWF0dXJlWzVdOworCVdPUkQJRHBPZW1JZDsKKwlXT1JECURwU2lnZ3lbMTZdOworfTsKKworLyoKKyoqIFVuaW9uIG9mIHRoZSBDdHJsIGFuZCBQcm9tIGFyZWFzCisqLwordW5pb24gdV9DdHJsUHJvbQkvKiBUaGlzIGlzIHRoZSBjb250cm9sL1BST00gYXJlYSAoMHg3QzAwKSAqLworeworCXN0cnVjdCBzX0N0cmwJRHBDdHJsOworCXN0cnVjdCBzX1Byb20JRHBQcm9tOworfTsKKworLyoKKyoqIFRoZSB0b3AgZW5kIG9mIG1lbW9yeSEKKyovCitzdHJ1Y3Qgc19QYXJtTWFwUwkJLyogQXJlYSBjb250YWluaW5nIFBhcm0gTWFwIFBvaW50ZXIgKi8KK3sKKwlCWVRFCURwX1VudXNlZDhfW0RQX1BBUk1NQVBfQUREUl07CisJV09SRAlEcFBhcm1NYXBBZDsKK307CisKK3N0cnVjdCBzX1N0YXJ0VXBTCit7CisJQllURSAgICBEcF9VbnVzZWQ5X1tEUF9TVEFSVFVQX0FERFJdOworCUJZVEUJRHBfTG9uZ0p1bXBbMHg0XTsKKwlCWVRFCURwX1VudXNlZDEwX1syXTsKKwlCWVRFCURwX1Nob3J0SnVtcFsweDJdOworfTsKKwordW5pb24gdV9TcmFtMlBhcm1NYXAJLyogVGhpcyBpcyB0aGUgdG9wIG9mIG1lbW9yeSAoMHg3RTAwLTB4N0ZGRikgKi8KK3sKKwlCWVRFCURwU3JhbU1lbVtEUF9TUkFNMl9TSVpFXTsKKwlzdHJ1Y3Qgc19QYXJtTWFwUyBEcFBhcm1NYXBTOworCXN0cnVjdCBzX1N0YXJ0VXBTIERwU3RhcnRVcFM7Cit9OworCisvKgorKioJVGhpcyBpcyB0aGUgRFAgUkFNIG92ZXJsYXkuCisqLworc3RydWN0IERwUmFtCit7CisgICAgQllURSAJCSBEcFNyYW0xW0RQX1NSQU0xX1NJWkVdOyAgICAgLyogMDAwMCAtIDdCRkYgKi8KKyAgICB1bmlvbiB1X0N0cmxQcm9tICAgICBEcEN0cmxQcm9tOyAgICAgICAgICAgICAgICAgLyogN0MwMCAtIDdERkYgKi8KKyAgICB1bmlvbiB1X1NyYW0yUGFybU1hcCBEcFNyYW0yUGFybU1hcDsgICAgICAgICAgICAgLyogN0UwMCAtIDdGRkYgKi8KKyAgICBCWVRFCQkgRHBTY3JhdGNoW0RQX1NDUkFUQ0hfU0laRV07IC8qIDgwMDAgLSA4RkZGICovCisgICAgQllURQkJIERwU3JhbTNbRFBfU1JBTTNfU0laRV07ICAgICAvKiA5MDAwIC0gRkZGRiAqLworfTsKKworI2RlZmluZQlEcENvbnRyb2wJRHBDdHJsUHJvbS5EcEN0cmwuRHBDdGwKKyNkZWZpbmUJRHBTZXRJbnQJRHBDdHJsUHJvbS5EcEN0cmwuRHBJbnRTZXQKKyNkZWZpbmUJRHBSZXNldFRwdQlEcEN0cmxQcm9tLkRwQ3RybC5EcFRwdVJlc2V0CisjZGVmaW5lCURwUmVzZXRJbnQJRHBDdHJsUHJvbS5EcEN0cmwuRHBJbnRSZXNldAorCisjZGVmaW5lCURwU2x4CQlEcEN0cmxQcm9tLkRwUHJvbS5EcFNseENvZGUKKyNkZWZpbmUJRHBSZXZpc2lvbglEcEN0cmxQcm9tLkRwUHJvbS5EcFJldgorI2RlZmluZQlEcFVuaXF1ZQlEcEN0cmxQcm9tLkRwUHJvbS5EcFVuaXEKKyNkZWZpbmUJRHBZZWFyCQlEcEN0cmxQcm9tLkRwUHJvbS5EcEphaHJlCisjZGVmaW5lCURwV2VlawkJRHBDdHJsUHJvbS5EcFByb20uRHBXb2NoZQorI2RlZmluZQlEcFNpZ25hdHVyZQlEcEN0cmxQcm9tLkRwUHJvbS5EcFNpZ2d5CisKKyNkZWZpbmUJRHBQYXJtTWFwUglEcFNyYW0yUGFybU1hcC5EcFBhcm1NYXBTLkRwUGFybU1hcEFkCisjZGVmaW5lCURwU3JhbTIJCURwU3JhbTJQYXJtTWFwLkRwU3JhbU1lbQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ib290cGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyOWFlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oCkBAIC0wLDAgKzEsNjIgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICBCIE8gTyBUICAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9wa3RfaAorI2RlZmluZSBfcGt0X2ggMQorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19ib290cGt0X2hfc2NjcyA9ICJAKCMpYm9vdHBrdC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogT3ZlcmxheWVkIG9udG8gdGhlIERhdGEgZmllbGRzIG9mIGEgcmVndWxhcgorICAgICAqIFBhY2tldAorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBCT09UX1BLVCBCT09UX1BLVCA7CitzdHJ1Y3QgQk9PVF9QS1QgeworICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgc2VxX251bSA7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICBkYXRhWzEwXSA7CisgICAgICAgICAgICAgICAgfSA7CisKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9icmF0ZXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vYnJhdGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0ZmM4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vYnJhdGVzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioJCUJSQVRFUy5ICQkJCSAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEplcmVteSBSb2xscworIERhdGUgICAgOiAxIE5vdiAxOTkwCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX2JyYXRlc19oCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICogX2JyYXRlc19oX3NjY3MgPSAiQCgjKWJyYXRlcy5oCTEuNCI7ICovCisjZW5kaWYKKyNkZWZpbmUgX2JyYXRlc19oIDEKKy8qIExpc3Qgb2YgYmF1ZCByYXRlIGRlZmluZXMuIE1vc3QgYXJlIGJvcnJvd2VkIGZyb20gL3Vzci9pbmNsdWRlL3N5cy90ZXJtaW8uaAorKi8KKyNpZm5kZWYgSU5LRVJORUwKKworI2RlZmluZQlCMAkweDAwCisjZGVmaW5lCUI1MAkweDAxCisjZGVmaW5lCUI3NQkweDAyCisjZGVmaW5lCUIxMTAJMHgwMworI2RlZmluZQlCMTM0CTB4MDQKKyNkZWZpbmUJQjE1MAkweDA1CisjZGVmaW5lCUIyMDAJMHgwNgorI2RlZmluZQlCMzAwCTB4MDcKKyNkZWZpbmUJQjYwMAkweDA4CisjZGVmaW5lCUIxMjAwCTB4MDkKKyNkZWZpbmUJQjE4MDAJMHgwYQorI2RlZmluZQlCMjQwMAkweDBiCisjZGVmaW5lCUI0ODAwCTB4MGMKKyNkZWZpbmUJQjk2MDAJMHgwZAorI2RlZmluZQlCMTkyMDAJMHgwZQorI2RlZmluZQlCMzg0MDAJMHgwZgorCisjZW5kaWYKKworLyoKKyoqIFRoZSBmb2xsb3dpbmcgYmF1ZHJhdGVzIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQKKyoqIG9uIHZhcmlvdXMgVU5JWCBzeXN0ZW1zLgorKiogSWYgdGhleSBhcmUgbm90IHRoZW4gd2UgZGVmaW5lIHRoZW0uCisqKiBJZiB0aGV5IGFyZSB0aGVuIHdlIGRvIG5vdCBkZWZpbmUgdGhlbSA7LSkKKyoqCisqKiBUaGlzIGlzIGFwcGFsbGluZyB0aGF0IHdlIHVzZSBzYW1lIGRlZmluaXRpb25zIGFzIFVOSVgKKyoqIGZvciBvdXIgb3duIGRvd25sb2FkIGNvZGUgYXMgdGhlcmUgaXMgbm8gZ2FydW50ZWUgdGhhdAorKiogQjU3NjAwIHdpbGwgYmUgZGVmaW5lZCBhcyAweDExIGJ5IGEgVU5JWCBzeXN0ZW0uLi4uCisqKiBBcmdoaGhoaCEhISEhISEhISEhISEhCisqLworI2lmICFkZWZpbmVkKEI1NjAwMCkKKyNkZWZpbmUJQjU2MDAwCTB4MTAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQjU3NjAwKQorI2RlZmluZQlCNTc2MDAJMHgxMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChCNjQwMDApCisjZGVmaW5lCUI2NDAwMAkweDEyCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEIxMTUyMDApCisjZGVmaW5lCUIxMTUyMDAJMHgxMworI2VuZGlmCisKKworI2lmICFkZWZpbmVkKEIyMDAwKQorI2RlZmluZSBCMjAwMAkweDE0CisjZW5kaWYKKworCisjZGVmaW5lIE1BWF9SQVRFIEIyMDAwCisKK3N0cnVjdCAgICBiYXVkX3JhdGUgICAgICAgICAgICAvKiBUYWcgZm9yIGJhdWQgcmF0ZXMgKi8KK3sKKyAgICAgLyogc2hvcnQgICAgaG9zdF9yYXRlLCovICAgICAgICAvKiBBcyBwYXNzZWQgYnkgdGhlIGRyaXZlciAqLworICAgICBzaG9ydCAgICBkaXZpc29yLCAgICAgICAgICAvKiBUaGUgZGl2aXNvciAqLworICAgICAgICAgICAgICBwcmVzY2FsZXI7ICAgICAgICAvKiBUaGUgcHJlLXNjYWxlciAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NoYW4uaCBiL2RyaXZlcnMvY2hhci9yaW8vY2hhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzA2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NoYW4uaApAQCAtMCwwICsxLDMzIEBACisvKgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworI2lmbmRlZiBfY2hhbl9oCisjZGVmaW5lIF9jaGFuX2gKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDUworc3RhdGljIGNoYXIgKl9yaW9fY2hhbl9oX3NjY3MgPSAiQCgjKWNoYW4uaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTGluazAgICAwCisjZGVmaW5lIExpbmsxICAgMQorI2RlZmluZSBMaW5rMiAgIDIKKyNkZWZpbmUgTGluazMgICAzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jaXJydXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vY2lycnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwNTZhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY2lycnVzLmgKQEAgLTAsMCArMSw0NjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioJCUNJUlJVUy5ICQkJCSAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEplcmVteSBSb2xscworIERhdGUgICAgOiAzIEF1ZyAxOTkwCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX2NpcnJ1c19oCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyKiBfY2lycnVzX2hfc2NjcyA9ICJAKCMpY2lycnVzLmgJMS4xNiI7ICovCisjZW5kaWYKKyNkZWZpbmUgX2NpcnJ1c19oIDEKKworI2lmZGVmIFJUQQorI2RlZmluZQlUT19VQVJUCVJYCisjZGVmaW5lIFRPX0RSSVZFUiBUWAorI2VuZGlmCisKKyNpZmRlZiBIT1NUCisjZGVmaW5lCVRPX1VBUlQJVFgKKyNkZWZpbmUgVE9fRFJJVkVSIFJYCisjZW5kaWYKKyNpZmRlZiBSVEEKKy8qIE1pc2NlbGxhbmVvdXMgZGVmaW5lcyBmb3IgQ0lSUlVTIGFkZHJlc3NlcyBhbmQgcmVsYXRlZCBsb2dpYyBmb3IKKyAgIGludGVycnVwdHMgZXRjLgorKi8KKyNkZWZpbmUJTUFQKGEpCQkoKHNob3J0ICopKGNpcnJ1c19iYXNlICsgKGEpKSkKKyNkZWZpbmUgb3V0cChhLGIpCSgqTUFQIChhKSA9KGIpKQorI2RlZmluZSBpbnAoYSkJCSgoKk1BUCAoYSkpICYgMHhmZikKKyNkZWZpbmUJQ0lSUlVTX0ZJUlNUCShzaG9ydCopMHg3MzAwCisjZGVmaW5lCUNJUlJVU19TRUNPTkQJKHNob3J0KikweDcyMDAKKyNkZWZpbmUJQ0lSUlVTX1RISVJECShzaG9ydCopMHg3MTAwCisjZGVmaW5lCUNJUlJVU19GT1VSVEgJKHNob3J0KikweDcwMDAKKyNkZWZpbmUJUE9SVFNfT05fQ0lSUlVTCTQKKyNkZWZpbmUJQ0lSUlVTX0ZJRk9fU0laRQkxMgorI2RlZmluZQlTUEFDRQkJMHgyMAorI2RlZmluZQlUQUIJCTB4MDkKKyNkZWZpbmUJTElORV9GRUVECTB4MGEKKyNkZWZpbmUJQ0FSUklBR0VfUkVUVVJOCTB4MGQKKyNkZWZpbmUJQkFDS1NQQUNFCTB4MDgKKyNkZWZpbmUJU1BBQ0VTX0lOX1RBQlMJOAorI2RlZmluZQlTRU5EX0VTQ0FQRQkweDAwCisjZGVmaW5lIFNUQVJUX0JSRUFLCTB4ODEKKyNkZWZpbmUJVElNRVJfVElDSwkweDgyCisjZGVmaW5lIFNUT1BfQlJFQUsJMHg4MworI2RlZmluZSBCQVNFKGEpICgoYSkgPCA0ID8gKHNob3J0KilDSVJSVVNfRklSU1QgOiAoKGEpIDwgOCA/IChzaG9ydCAqKUNJUlJVU19TRUNPTkQgOiAoKGEpIDwgMTIgPyAoc2hvcnQqKUNJUlJVU19USElSRCA6IChzaG9ydCAqKUNJUlJVU19GT1VSVEgpKSkKKyNkZWZpbmUgdHhhY2sxCSgoc2hvcnQgKikweDcxMDQpIAorI2RlZmluZSByeGFjazEJKChzaG9ydCAqKTB4NzEwMikgCisjZGVmaW5lIG1kYWNrMSAgKChzaG9ydCAqKTB4NzEwNikKKyNkZWZpbmUgdHhhY2syICAoKHNob3J0ICopMHg3MDA2KSAKKyNkZWZpbmUgcnhhY2syCSgoc2hvcnQgKikweDcwMDQpIAorI2RlZmluZSBtZGFjazIgICgoc2hvcnQgKikweDcxMDApIAorI2RlZmluZSBpbnRfbGF0Y2ggICAgICAgKChzaG9ydCAqKSAweDc4MDApCisjZGVmaW5lIGludF9zdGF0dXMgICAgICAoKHNob3J0ICopIDB4N2MwMCkgCisjZGVmaW5lIHR4MV9wZW5kaW5nICAgICAweDIwIAorI2RlZmluZSByeDFfcGVuZGluZyAgICAgMHgxMCAKKyNkZWZpbmUgbWQxX3BlbmRpbmcgICAgIDB4NDAgCisjZGVmaW5lIHR4Ml9wZW5kaW5nICAgICAweDAyIAorI2RlZmluZSByeDJfcGVuZGluZyAgICAgMHgwMSAKKyNkZWZpbmUgbWQyX3BlbmRpbmcgICAgIDB4NDAgCisjZGVmaW5lIG1vZHVsZTFfYml0cwkweDA3CisjZGVmaW5lIG1vZHVsZTFfbW9kZXJuCTB4MDgKKyNkZWZpbmUgbW9kdWxlMl9iaXRzCTB4NzAKKyNkZWZpbmUgbW9kdWxlMl9tb2Rlcm4JMHg4MAorI2RlZmluZSBtb2R1bGVfYmxhbmsJMHhmCisjZGVmaW5lIHJzMjMyX2QyNQkweDAKKyNkZWZpbmUJcnMyMzJfcmo0NQkweDEKKyNkZWZpbmUgcnM0MjJfZDI1CTB4MworI2RlZmluZSBwYXJhbGxlbAkweDUKKworI2RlZmluZQlDTEswCTB4MDAKKyNkZWZpbmUgQ0xLMQkweDAxCisjZGVmaW5lIENMSzIJMHgwMgorI2RlZmluZSBDTEszCTB4MDMKKyNkZWZpbmUgQ0xLNAkweDA0CisKKyNkZWZpbmUgQ0lSUlVTX1JFVkMgICAgMHg0MgorI2RlZmluZSBDSVJSVVNfUkVWRSAgICAweDQ0CisKKyNkZWZpbmUJVFVSTk9OCTEKKyNkZWZpbmUgVFVSTk9GRiAwCisKKy8qIFRoZSBsaXN0IG9mIENJUlJVUyByZWdpc3RlcnMuIAorICAgTkIuIFRoZXNlIHJlZ2lzdGVycyBhcmUgcmVsYXRpdmUgdmFsdWVzIG9uIDggYml0IGJvdW5kYXJpZXMgd2hlcmVhcworICAgb24gdGhlIFJUQSdzIHRoZSBDSVJSVVMgcmVnaXN0ZXJzIGFyZSBvbiB3b3JkIGJvdW5kYXJpZXMuIFVzZSBwb2ludGVyCisgICBhcml0aG1ldGljIChzaG9ydCAqKSB0byBvYnRhaW4gdGhlIHJlYWwgYWRkcmVzc2VzIHJlcXVpcmVkICovCisjZGVmaW5lIGNjcgkweDA1CS8qIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgaWVyCTB4MDYJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAqLworI2RlZmluZSBjb3IxCTB4MDgJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAgICAqLworI2RlZmluZSBjb3IyCTB4MDkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAgICAqLworI2RlZmluZSBjb3IzCTB4MGEJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMyAgICAqLworI2RlZmluZSBjb3I0CTB4MWUJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgNCAgICAqLworI2RlZmluZQljb3I1CTB4MWYJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgNQkqLworCisjZGVmaW5lIGNjc3IJMHgwYgkvKiBDaGFubmVsIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIHJkY3IJMHgwZQkvKiBSZWNlaXZlIERhdGEgQ291bnQgUmVnaXN0ZXIgICovCisjZGVmaW5lIHRkY3IJMHgxMgkvKiBUcmFuc21pdCBEYXRhIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIG1jb3IxCTB4MTUJLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIG1jb3IyCTB4MTYJLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdzaXRlciAyICovCisKKyNkZWZpbmUgbGl2cgkweDE4CS8qIExvY2FsIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgc2NocjEJMHgxYQkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAxICovCisjZGVmaW5lIHNjaHIyCTB4MWIJLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBzY2hyMwkweDFjCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgc2NocjQJMHgxZAkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciA0ICovCisKKyNkZWZpbmUgcnRyCTB4MjAgICAgLyogUmVjZWl2ZSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBydHByCTB4MjEJLyogUmVjZWl2ZSBUaW1lb3V0IFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSBsbmMJMHgyNAkvKiBMbmV4dCBjaGFyYWN0ZXIgKi8KKworI2RlZmluZSByaXZyCTB4NDMJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIHRpdnIJMHg0MgkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgbWl2cgkweDQxCS8qIE1vZGVtIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBnZnJjcgkweDQwCS8qIEdsb2JhbCBGaXJtd2FyZSBSZXZpc2lvbiBjb2RlIFJlZyAgICAqLworI2RlZmluZSByaWNyCTB4NDQJLyogUmVjZWl2ZSBJbnRlcnJ1cHRpbmcgQ2hhbm5lbCBSZWcgICAgICovCisjZGVmaW5lIHRpY3IJMHg0NQkvKiBUcmFuc21pdCBJbnRlcnJ1cHRpbmcgQ2hhbm5lbCBSZWcgICAgKi8KKyNkZWZpbmUgbWljcgkweDQ2CS8qIE1vZGVtIEludGVycnVwdGluZyBDaGFubmVsIFJlZ2lzdGVyICAqLworCisjZGVmaW5lIGdjcgkweDRiCS8qIEdsb2JhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyKi8KKyNkZWZpbmUgbWlzciAgICAweDRjICAgIC8qIE1vZGVtIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSByYnVzcgkweDU5CisjZGVmaW5lIHRidXNyCTB4NWEKKyNkZWZpbmUgbWJ1c3IJMHg1YgorCisjZGVmaW5lIGVvaXIJMHg2MAkvKiBFbmQgT2YgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHJkc3IJMHg2MgkvKiBSZWNlaXZlIERhdGEgLyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgdGRyCTB4NjMJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBzdnJyCTB4NjcJLyogU2VydmljZSBSZXF1ZXN0IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgY2FyCTB4NjgJLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgbWlyCTB4NjkJLyogTW9kZW0gSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHRpcgkweDZhCS8qIFRyYW5zbWl0IEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSByaXIJMHg2YgkvKiBSZWNlaXZlIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSBtc3ZyMQkweDZjCS8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAxICovCisjZGVmaW5lIG1zdnIyCTB4NmQJLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyIDIqLworI2RlZmluZSBwc3ZyCTB4NmYJLyogUHJpbnRlciBTaWduYWwgVmFsdWUgUmVnaXN0ZXIqLworCisjZGVmaW5lIHRicHIJMHg3MgkvKiBUcmFuc21pdCBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lIHRjb3IJMHg3NgkvKiBUcmFuc21pdCBDbG9jayBPcHRpb24gUmVnaXN0ZXIgKi8KKworI2RlZmluZSByYnByCTB4NzgJLyogUmVjZWl2ZSBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lIHJiZXIJMHg3YQkvKiBSZWNlaXZlIEJhdWQgUmF0ZSBFeHRlbnNpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgcmNvcgkweDdjCS8qIFJlY2VpdmUgQ2xvY2sgT3B0aW9uIFJlZ2lzdGVyKi8KKyNkZWZpbmUgcHByCTB4N2UJLyogUHJlc2NhbGFyIFBlcmlvZCBSZWdpc3RlciAgICAqLworCisvKiBNaXNjIHJlZ2lzdGVycyB1c2VkIGZvciBmb3JjaW5nIHRoZSAxNDAwIG91dCBvZiBpdHMgcmVzZXQgd29lcyAqLworI2RlZmluZSBhaXJsCTB4NmQKKyNkZWZpbmUgYWlybQkweDZlCisjZGVmaW5lIGFpcmgJMHg2ZgorI2RlZmluZSBidGNyCTB4NjYKKyNkZWZpbmUgbXRjcgkweDZjCisjZGVmaW5lIHRiZXIJMHg3NAorCisjZW5kaWYJCQkJLyogI2lmZGVmIFJUQSAqLworCisKKy8qIEJpdCBmaWVsZHMgZm9yIHBhcnRpY3VsYXIgcmVnaXN0ZXJzICovCisKKy8qIEdDUiAqLworI2RlZmluZSBHQ1JfU0VSSUFMCTB4MDAJLyogQ29uZmlndXJlIGFzIHNlcmlhbCBjaGFubmVsICovCisjZGVmaW5lIEdDUl9QQVJBTExFTAkweDgwCS8qIENvbmZpZ3VyZSBhcyBwYXJhbGxlbCBjaGFubmVsICovCisKKy8qIFJEU1IgLSB3aGVuIHN0YXR1cyByZWFkIGZyb20gRklGTyAqLworI2RlZmluZQlSRFNSX0JSRUFLCQkweDA4CS8qIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lIFJEU1JfVElNRU9VVCAgICAJMHg4MCAgICAvKiBObyBuZXcgZGF0YSB0aW1lb3V0ICovCisjZGVmaW5lIFJEU1JfU0MxICAJICAJMHgxMCAgICAvKiBTcGVjaWFsIGNoYXIgMSAodHggWE9OKSBtYXRjaGVkICovCisjZGVmaW5lIFJEU1JfU0MyICAJICAJMHgyMCAgICAvKiBTcGVjaWFsIGNoYXIgMiAodHggWE9GRikgbWF0Y2hlZCAqLworI2RlZmluZSBSRFNSX1NDMTJfTUFTSwkgIAkweDMwICAgIC8qIE1hc2sgZm9yIHNwZWNpYWwgY2hhcnMgMSBhbmQgMiAqLworCisvKiBQUFIgKi8KKyNkZWZpbmUgUFBSX0RFRkFVTFQJMHgzMQkvKiBEZWZhdWx0IHZhbHVlIC0gZm9yIGEgMjVNaHogY2xvY2sgZ2l2ZXMKKwkJCQkgICBhIHRpbWVvdXQgcGVyaW9kIG9mIDFtcyAqLworCisvKiBMSVZSICovCisjZGVmaW5lCUxJVlJfRVhDRVBUSU9OCTB4MDcJLyogUmVjZWl2ZSBleGNlcHRpb24gaW50ZXJydXB0ICovCisKKy8qIENDUiAqLworI2RlZmluZQlDQ1JfUkVTRVQJMHg4MAkvKiBSZXNldCBjaGFubmVsICovCisjZGVmaW5lCUNDUl9DSEFOR0UJMHg0ZQkvKiBDT1IncyBoYXZlIGNoYW5nZWQgLSBOQiBhbHdheXMgY2hhbmdlIGFsbAorCQkJCSAgIENPUidzICovCisjZGVmaW5lCUNDUl9XRkxVU0gJMHg4MgkvKiBGbHVzaCB0cmFuc21pdCBGSUZPIGFuZCBUU1IgLyBUSFIgKi8KKworI2RlZmluZQlDQ1JfU0VORFNDMQkweDIxCS8qIFNlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgb25lICovCisjZGVmaW5lIENDUl9TRU5EU0MyCTB4MjIJLyogU2VuZCBzcGVjaWFsIGNoYXJhY3RlciB0d28gKi8KKyNkZWZpbmUgQ0NSX1NFTkRTQzMJMHgyMwkvKiBTZW5kIHNwZWNpYWwgY2hhcmFjdGVyIHRocmVlICovCisjZGVmaW5lIENDUl9TRU5EU0M0CTB4MjQJLyogU2VuZCBzcGVjaWFsIGNoYXJhY3RlciBmb3VyICovCisKKyNkZWZpbmUgQ0NSX1RFTkFCTEUJMHgxOAkvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUJQ0NSX1RESVNBQkxFCTB4MTQJLyogRGlzYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBDQ1JfUkVOQUJMRQkweDEyCS8qIEVuYWJsZSByZWNlaXZlciAqLworI2RlZmluZSBDQ1JfUkRJU0FCTEUJMHgxMQkvKiBEaXNhYmxlIHJlY2VpdmVyICovCisKKyNkZWZpbmUJQ0NSX1JFQURZCTB4MDAJLyogQ0NSIGlzIHJlYWR5IGZvciBhbm90aGVyIGNvbW1hbmQgKi8KKworLyogQ0NTUiAqLworI2RlZmluZSBDQ1NSX1RYRU5BQkxFCTB4MDgJLyogVHJhbnNtaXR0ZXIgZW5hYmxlICovCisjZGVmaW5lIENDU1JfUlhFTkFCTEUJMHg4MAkvKiBSZWNlaXZlciBlbmFibGUgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT1dPRkYJMHgwNAkvKiBUcmFuc21pdCBmbG93IG9mZiAqLworI2RlZmluZSBDQ1NSX1RYRkxPV09OCTB4MDIJLyogVHJhbnNtaXQgZmxvdyBvbiAqLworCisvKiBTVlJSICovCisjZGVmaW5lCVNWUlJfUkVDRUlWRQkweDAxCS8qIFJlY2VpdmUgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJU1ZSUl9UUkFOU01JVAkweDAyCS8qIFRyYW5zbWl0IGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lCVNWUlJfTU9ERU0JMHgwNAkvKiBNb2RlbSBpbnRlcnJ1cHQgcGVuZGluZyAqLworCisvKiBDQVIgKi8KKyNkZWZpbmUgQ0FSX1BPUlRTCTB4MDMJLyogQml0IGZpZWxkcyBmb3IgcG9ydHMgKi8KKworLyogSUVSICovCisjZGVmaW5lCUlFUl9NT0RFTQkweDgwCS8qIENoYW5nZSBpbiBtb2RlbSBzdGF0dXMgKi8KKyNkZWZpbmUJSUVSX1JFQ0VJVkUJMHgxMAkvKiBHb29kIGRhdGEgLyBkYXRhIGV4Y2VwdGlvbiAqLworI2RlZmluZSBJRVJfVFJBTlNNSVRSCTB4MDQJLyogVHJhbnNtaXQgcmVhZHkgKEZJRk8gZW1wdHkpICovCisjZGVmaW5lCUlFUl9UUkFOU01JVEUJMHgwMgkvKiBUcmFuc21pdCBlbXB0eSAqLworI2RlZmluZSBJRVJfVElNRU9VVAkweDAxCS8qIFRpbWVvdXQgb24gbm8gZGF0YSAqLworCisjZGVmaW5lCUlFUl9ERUZBVUxUCTB4OTQJLyogRGVmYXVsdCB2YWx1ZXMgKi8KKyNkZWZpbmUgSUVSX1BBUkFMTEVMICAgIDB4ODQgICAgLyogRGVmYXVsdCBmb3IgUGFyYWxsZWwgKi8KKyNkZWZpbmUJSUVSX0VNUFRZCTB4OTIJLyogVHJhbnNtaXR0ZXIgZW1wdHkgcmF0aGVyIHRoYW4gcmVhZHkgKi8KKworLyogQ09SMSAtIERyaXZlciBvbmx5ICovCisjZGVmaW5lCUNPUjFfSU5QQ0sJMHgxMAkvKiBDaGVjayBwYXJpdHkgb2YgcmVjZWl2ZWQgY2hhcmFjdGVycyAqLworCisvKiBDT1IxIC0gZHJpdmVyIGFuZCBSVEEgKi8KKyNkZWZpbmUJQ09SMV9PREQJMHg4MAkvKiBPZGQgcGFyaXR5ICovCisjZGVmaW5lIENPUjFfRVZFTgkweDAwCS8qIEV2ZW4gcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfTk9QCTB4MDAJLyogTm8gcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfRk9SQ0UJMHgyMAkvKiBGb3JjZSBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9OT1JNQUwJMHg0MAkvKiBXaXRoIHBhcml0eSAqLworI2RlZmluZQlDT1IxXzFTVE9QCTB4MDAJLyogMSBzdG9wIGJpdCAqLworI2RlZmluZQlDT1IxXzE1U1RPUAkweDA0CS8qIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV8yU1RPUAkweDA4CS8qIDIgc3RvcCBiaXRzICovCisjZGVmaW5lCUNPUjFfNUJJVFMJMHgwMAkvKiA1IGRhdGEgYml0cyAqLworI2RlZmluZQlDT1IxXzZCSVRTCTB4MDEJLyogNiBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV83QklUUwkweDAyCS8qIDcgZGF0YSBiaXRzICovCisjZGVmaW5lCUNPUjFfOEJJVFMJMHgwMwkvKiA4IGRhdGEgYml0cyAqLworCisjZGVmaW5lIENPUjFfSE9TVCAgICAgICAweGVmICAgIC8qIFNhZmUgaG9zdCBiaXRzICovCisKKy8qIFJUQSBvbmx5ICovCisjZGVmaW5lIENPUjFfQ0lOUENLICAgICAweDAwICAgIC8qIENoZWNrIHBhcml0eSBvZiByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisjZGVmaW5lIENPUjFfQ05JTlBDSyAgICAweDEwICAgIC8qIERvbid0IGNoZWNrIHBhcml0eSAqLworCisvKiBDT1IyIGJpdHMgZm9yIGJvdGggUlRBIGFuZCBkcml2ZXIgdXNlICovCisjZGVmaW5lCUNPUjJfSVhBTlkJMHg4MAkvKiBJWEFOWSAtIGFueSBjaGFyYWN0ZXIgaXMgWE9OICovCisjZGVmaW5lCUNPUjJfSVhPTgkweDQwCS8qIElYT04gLSBlbmFibGUgdHggc29mdCBmbG93Y29udHJvbCAqLworI2RlZmluZQlDT1IyX1JUU0ZMT1cJMHgwMgkvKiBFbmFibGUgdHggaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisKKy8qIEFkZGl0aW9uYWwgZHJpdmVyIGJpdHMgKi8KKyNkZWZpbmUJQ09SMl9IVVBDTAkweDIwCS8qIEhhbmcgdXAgb24gY2xvc2UgKi8KKyNkZWZpbmUJQ09SMl9DVFNGTE9XCTB4MDQJLyogRW5hYmxlIHJ4IGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLworI2RlZmluZQlDT1IyX0lYT0ZGCTB4MDEJLyogRW5hYmxlIHJ4IHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBDT1IyX0RUUkZMT1cJMHgwOAkvKiBFbmFibGUgdHggaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisKKy8qIFJUQSB1c2Ugb25seSAqLworI2RlZmluZSBDT1IyX0VUQwkweDIwCS8qIEVtYmVkZGVkIHRyYW5zbWl0IG9wdGlvbnMgKi8KKyNkZWZpbmUJQ09SMl9MT0NBTAkweDEwCS8qIExvY2FsIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUJQ09SMl9SRU1PVEUJMHgwOAkvKiBSZW1vdGUgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZQlDT1IyX0hPU1QJMHhjMgkvKiBTYWZlIGhvc3QgYml0cyAqLworCisvKiBDT1IzIC0gUlRBIHVzZSBvbmx5ICovCisjZGVmaW5lCUNPUjNfU0NEUk5HCTB4ODAJLyogRW5hYmxlIHNwZWNpYWwgY2hhciBkZXRlY3QgZm9yIHJhbmdlICovCisjZGVmaW5lCUNPUjNfU0NEMzQJMHg0MAkvKiBTcGVjaWFsIGNoYXJhY3RlciBkZXRlY3QgZm9yIFNDSFIncyAzICsgNCAqLworI2RlZmluZQlDT1IzX0ZDVAkweDIwCS8qIEZsb3cgY29udHJvbCB0cmFuc3BhcmVuY3kgKi8KKyNkZWZpbmUJQ09SM19TQ0QxMgkweDEwCS8qIFNwZWNpYWwgY2hhcmFjdGVyIGRldGVjdCBmb3IgU0NIUidzIDEgKyAyICovCisjZGVmaW5lCUNPUjNfRklGTzEyCTB4MGMJLyogMTIgY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQ09SM19GSUZPMTAgICAgIDB4MGEgICAgLyogMTAgY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQ09SM19GSUZPOCAgICAgIDB4MDggICAgLyogOCBjaGFycyBmb3IgcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBDT1IzX0ZJRk82ICAgICAgMHgwNiAgICAvKiA2IGNoYXJzIGZvciByZWNlaXZlIEZJRk8gdGhyZXNob2xkICovCisKKyNkZWZpbmUgQ09SM19USFJFU0hPTEQgIENPUjNfRklGTzgJLyogTVVTVCBCRSBMRVNTIFRIQU4gTUNPUl9USFJFU0hPTEQgKi8KKworI2RlZmluZQlDT1IzX0RFRkFVTFQJKENPUjNfRkNUIHwgQ09SM19USFJFU0hPTEQpCisJCQkJLyogRGVmYXVsdCBiaXRzIGZvciBDT1IzICovCisKKy8qIENPUjQgZHJpdmVyIGFuZCBSVEEgdXNlICovCisjZGVmaW5lCUNPUjRfSUdOQ1IJMHg4MAkvKiBUaHJvdyBhd2F5IENSJ3Mgb24gaW5wdXQgKi8KKyNkZWZpbmUJQ09SNF9JQ1JOTAkweDQwCS8qIE1hcCBDUiAtPiBOTCBvbiBpbnB1dCAqLworI2RlZmluZQlDT1I0X0lOTENSCTB4MjAJLyogTWFwIE5MIC0+IENSIG9uIGlucHV0ICovCisjZGVmaW5lCUNPUjRfSUdOQlJLCTB4MTAJLyogSWdub3JlIEJyZWFrICovCisjZGVmaW5lCUNPUjRfTkJSS0lOVAkweDA4CS8qIE5vIGludGVycnVwdCBvbiBicmVhayAoLUJSS0lOVCkgKi8KKyNkZWZpbmUgQ09SNF9SQUlTRU1PRAkweDAxCS8qIFJhaXNlIG1vZGVtIG91dHB1dCBsaW5lcyBvbiBub24temVybyBiYXVkICovCisKKworLyogQ09SNCBkcml2ZXIgb25seSAqLworI2RlZmluZSBDT1I0X0lHTlBBUgkweDA0CS8qIElHTlBBUiAoaWdub3JlIGNoYXJhY3RlcnMgd2l0aCBlcnJvcnMpICovCisjZGVmaW5lIENPUjRfUEFSTVJLCTB4MDIJLyogUEFSTVJLICovCisKKyNkZWZpbmUgQ09SNF9IT1NUCTB4ZjgJLyogU2FmZSBob3N0IGJpdHMgKi8KKworLyogQ09SNCBSVEEgb25seSAqLworI2RlZmluZSBDT1I0X0NJR05QQVIJMHgwMgkvKiBUaHJvd24gYXdheSBiYWQgY2hhcmFjdGVycyAqLworI2RlZmluZSBDT1I0X0NQQVJNUksJMHgwNAkvKiBQQVJNUksgY2hhcmFjdGVycyAqLworI2RlZmluZSBDT1I0X0NOUEFSTVJLCTB4MDMJLyogRG9uJ3QgUEFSTVJLICovCisKKy8qIENPUjUgZHJpdmVyIGFuZCBSVEEgdXNlICovCisjZGVmaW5lCUNPUjVfSVNUUklQCTB4ODAJLyogU3RyaXAgaW5wdXQgY2hhcnMgdG8gNyBiaXRzICovCisjZGVmaW5lCUNPUjVfTE5FCTB4NDAJLyogRW5hYmxlIExORVhUIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUJQ09SNV9DTU9FCTB4MjAJLyogTWF0Y2ggZ29vZCBhbmQgZXJyb3JlZCBjaGFyYWN0ZXJzICovCisjZGVmaW5lCUNPUjVfT05MQ1IJMHgwMgkvKiBOTCAtPiBDUiBOTCBvbiBvdXRwdXQgKi8KKyNkZWZpbmUJQ09SNV9PQ1JOTAkweDAxCS8qIENSIC0+IE5MIG9uIG91dHB1dCAqLworCisvKgorKiogU3BhcmUgYml0cyAtIHRoZXNlIGFyZSBub3QgdXNlZCBpbiB0aGUgQ0lSUlVTIHJlZ2lzdGVycywgc28gd2UgdXNlCisqKiB0aGVtIHRvIHNldCB2YXJpb3VzIG90aGVyIGZlYXR1cmVzLgorKi8KKy8qCisqKiB0c3RvcCBhbmQgdGJ1c3kgaW5kaWNhdGlvbgorKi8KKyNkZWZpbmUJQ09SNV9UU1RBVEVfT04JMHgwOAkvKiBUdXJuIG9uIG1vbml0b3Jpbmcgb2YgdGJ1c3kgYW5kIHRzdG9wICovCisjZGVmaW5lCUNPUjVfVFNUQVRFX09GRgkweDA0CS8qIFR1cm4gb2ZmIG1vbml0b3Jpbmcgb2YgdGJ1c3kgYW5kIHRzdG9wICovCisvKgorKiogVEFCMworKi8KKyNkZWZpbmUJQ09SNV9UQUIzCTB4MTAJLyogVEFCMyBtb2RlICovCisKKyNkZWZpbmUJQ09SNV9IT1NUCTB4YzMJLyogU2FmZSBob3N0IGJpdHMgKi8KKworLyogQ0NTUiAqLworI2RlZmluZQlDQ1NSX1RYRkxPRkYJMHgwNAkvKiBUeCBpcyB4b2ZmZWQgKi8KKworLyogTVNWUjEgKi8KKy8qIE5CLiBEVFIgLyBDRCBzd2FwcGVkIGZyb20gQ2lycnVzIHNwZWMgYXMgdGhlIHBpbnMgYXJlIGFsc28gcmV2ZXJzZWQgb24gdGhlCisgICBSVEEuIFRoaXMgaXMgYmVjYXVzZSBvdGhlcndpc2UgRENEIHdvdWxkIGdldCBsb3N0IG9uIHRoZSAxIHBhcmFsbGVsIC8gMworICAgc2VyaWFsIG9wdGlvbi4KKyovCisjZGVmaW5lCU1TVlIxX0NECTB4ODAJLyogQ0QgKERTUiBvbiBDaXJydXMpICovCisjZGVmaW5lCU1TVlIxX1JUUwkweDQwCS8qIFJUUyAoQ1RTIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTVNWUjFfUkkJMHgyMAkvKiBSSSAqLworI2RlZmluZQlNU1ZSMV9EVFIJMHgxMAkvKiBEVFIgKENEIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTVNWUjFfQ1RTCTB4MDEJLyogQ1RTIG91dHB1dCBwaW4gKFJUUyBvbiBDaXJydXMpICovCisvKiBOZXh0IHR3byB1c2VkIHRvIGluZGljYXRlIHN0YXRlIG9mIHRidXN5IGFuZCB0c3RvcCB0byBkcml2ZXIgKi8KKyNkZWZpbmUJTVNWUjFfVFNUT1AJMHgwOAkvKiBTZXQgaWYgcG9ydCBmbG93IGNvbnRyb2xsZWQgKi8KKyNkZWZpbmUJTVNWUjFfVEVNUFRZCTB4MDQJLyogU2V0IGlmIHBvcnQgdHggYnVmZmVyIGVtcHR5ICovCisKKyNkZWZpbmUJTVNWUjFfSE9TVAkweGYzCS8qIFRoZSBiaXRzIHRoZSBob3N0IHdhbnRzICovCisKKy8qIE1TVlIyICovCisjZGVmaW5lCU1TVlIyX0RTUgkweDAyCS8qIERTUiBvdXRwdXQgcGluIChEVFIgb24gQ2lycnVzKSAqLworCisvKiBNQ09SICovCisjZGVmaW5lCU1DT1JfQ0QJICAgICAgICAweDgwCS8qIENEIChEU1Igb24gQ2lycnVzKSAqLworI2RlZmluZQlNQ09SX1JUUwkweDQwCS8qIFJUUyAoQ1RTIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTUNPUl9SSQkgICAgICAgIDB4MjAJLyogUkkgKi8KKyNkZWZpbmUJTUNPUl9EVFIJMHgxMAkvKiBEVFIgKENEIG9uIENpcnJ1cykgKi8KKworI2RlZmluZSBNQ09SX0RFRkFVTFQgICAgKE1DT1JfQ0QgfCBNQ09SX1JUUyB8IE1DT1JfUkkgfCBNQ09SX0RUUikKKyNkZWZpbmUgTUNPUl9GVUxMTU9ERU0gIE1DT1JfREVGQVVMVAorI2RlZmluZSBNQ09SX1JKNDUgICAgICAgKE1DT1JfQ0QgfCBNQ09SX1JUUyB8IE1DT1JfRFRSKQorI2RlZmluZSBNQ09SX1JFU1RSSUNURUQgKE1DT1JfQ0QgfCBNQ09SX1JUUykKKworLyogTW9yZSBNQ09SIC0gSC9XIEhhbmRzaGFrZSAoZmxvd2NvbnRyb2wpIHN0dWZmICovCisjZGVmaW5lCU1DT1JfVEhSRVNIOAkweDA4CS8qIGVpZ2h0IGNoYXJhY3RlcnMgdGhlbiB3ZSBzdG9wICovCisjZGVmaW5lCU1DT1JfVEhSRVNIOQkweDA5CS8qIG5pbmUgY2hhcmFjdGVycyB0aGVuIHdlIHN0b3AgKi8KKyNkZWZpbmUJTUNPUl9USFJFU0gxMAkweDBBCS8qIHRlbiBjaGFyYWN0ZXJzIHRoZW4gd2Ugc3RvcCAqLworI2RlZmluZQlNQ09SX1RIUkVTSDExCTB4MEIJLyogZWxldmVuIGNoYXJhY3RlcnMgdGhlbiB3ZSBzdG9wICovCisKKyNkZWZpbmUJTUNPUl9USFJFU0hCSVRTIDB4MEYJLyogbWFzayBmb3IgQU5EaW5nIG91dCB0aGUgYWJvdmUgKi8KKworI2RlZmluZQlNQ09SX1RIUkVTSE9MRAlNQ09SX1RIUkVTSDkgLyogTVVTVCBCRSBHUkVBVEVSIFRIQU4gQ09SM19USFJFU0hPTEQgKi8KKworCisvKiBSVFBSICovCisjZGVmaW5lIFJUUFJfREVGQVVMVAkweDAyCS8qIERlZmF1bHQgKi8KKworCisvKiBEZWZpbmVzIGZvciB0aGUgc3Vic2NyaXB0cyBvZiBhIENPTkZJRyBwYWNrZXQgKi8KKyNkZWZpbmUJQ09ORklHX0NPUjEJMQkvKiBPcHRpb24gcmVnaXN0ZXIgMSAqLworI2RlZmluZQlDT05GSUdfQ09SMgkyCS8qIE9wdGlvbiByZWdpc3RlciAyICovCisjZGVmaW5lCUNPTkZJR19DT1I0CTMJLyogT3B0aW9uIHJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJQ09ORklHX0NPUjUJNAkvKiBPcHRpb24gcmVnaXN0ZXIgNSAqLworI2RlZmluZQlDT05GSUdfVFhYT04JNQkvKiBUeCBYT04gY2hhcmFjdGVyICovCisjZGVmaW5lCUNPTkZJR19UWFhPRkYJNgkvKiBUeCBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZQlDT05GSUdfUlhYT04JNwkvKiBSeCBYT04gY2hhcmFjdGVyICovCisjZGVmaW5lCUNPTkZJR19SWFhPRkYJOAkvKiBSeCBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZSBDT05GSUdfTE5FWFQJOQkvKiBMTkVYVCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQ09ORklHX1RYQkFVRAkxMAkvKiBUeCBiYXVkIHJhdGUgKi8KKyNkZWZpbmUJQ09ORklHX1JYQkFVRAkxMQkvKiBSeCBiYXVkIHJhdGUgKi8KKworLyogUG9ydCBzdGF0dXMgc3R1ZmYgKi8KKyNkZWZpbmUJSURMRV9DTE9TRUQJMAkvKiBDbG9zZWQgKi8KKyNkZWZpbmUgSURMRV9PUEVOCTEJLyogSWRsZSBvcGVuICovCisjZGVmaW5lIElETEVfQlJFQUsJMgkvKiBJZGxlIG9uIGJyZWFrICovCisKKy8qIFN1YnNjcmlwdCBvZiBNT0RFTSBTVEFUVVMgcGFja2V0ICovCisjZGVmaW5lCU1PREVNX1ZBTFVFCTMJLyogQ3VycmVudCB2YWx1ZXMgb2YgaGFuZHNoYWtlIHBpbnMgKi8KKy8qIFN1YnNjcmlwdCBvZiBTQlJFQUsgcGFja2V0ICovCisjZGVmaW5lIEJSRUFLX0xFTkdUSAkxCS8qIExlbmd0aCBvZiBhIGJyZWFrIGluIHNsaWNlcyBvZiAwLjAxIHNlY29uZHMKKwkJCQkgICAwID0gc3RheSBvbiBicmVhayB1bnRpbCBhbiBFQlJFQUsgY29tbWFuZAorCQkJCSAgIGlzIHNlbnQgKi8KKworCisjZGVmaW5lCVBSRV9FTVBUSVZFCTB4ODAJLyogUHJlLWVtcHRpdmUgYml0IGluIGNvbW1hbmQgZmllbGQgKi8KKworLyogUGFja2V0IHR5cGVzIGdvaW5nIGZyb20gSG9zdCB0byByZW1vdGUgLSB3aXRoIHRoZSBleGNlcHRpb24gb2YgT1BFTiwgTU9QRU4sCisgICBDT05GSUcsIFNCUkVBSyBhbmQgTUVNRFVNUCB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSBkYXRhIGFycmF5IHdpbGwgbm90CisgICBiZSB1c2VkIAorKi8KKyNkZWZpbmUJT1BFTgkJMHgwMAkvKiBPcGVuIGEgcG9ydCAqLworI2RlZmluZSBDT05GSUcJCTB4MDEJLyogQ29uZmlndXJlIGEgcG9ydCAqLworI2RlZmluZQlNT1BFTgkJMHgwMgkvKiBNb2RlbSBvcGVuIChibG9jayBmb3IgRENEKSAqLworI2RlZmluZQlDTE9TRQkJMHgwMwkvKiBDbG9zZSBhIHBvcnQgKi8KKyNkZWZpbmUJV0ZMVVNICQkoMHgwNCB8IFBSRV9FTVBUSVZFKSAvKiBXcml0ZSBmbHVzaCAqLworI2RlZmluZQlSRkxVU0gJCSgweDA1IHwgUFJFX0VNUFRJVkUpIC8qIFJlYWQgZmx1c2ggKi8KKyNkZWZpbmUJUkVTVU1FCQkoMHgwNiB8IFBSRV9FTVBUSVZFKSAvKiBSZXN1bWUgaWYgeG9mZmVkICovCisjZGVmaW5lCVNCUkVBSwkJMHgwNyAJLyogU3RhcnQgYnJlYWsgKi8KKyNkZWZpbmUJRUJSRUFLCQkweDA4CS8qIEVuZCBicmVhayAqLworI2RlZmluZQlTVVNQRU5ECQkoMHgwOSB8IFBSRV9FTVBUSVZFKSAvKiBTdXNwIG9wIChiZWhhdmUgYXMgdGhvIHhvZmZlZCkgKi8KKyNkZWZpbmUgRkNMT1NFICAgICAgICAgICgweDBhIHwgUFJFX0VNUFRJVkUpIC8qIEZvcmNlIGNsb3NlICovCisjZGVmaW5lIFhQUklOVCAgICAgICAgICAweDBiICAgIC8qIFhwcmludCBwYWNrZXQgKi8KKyNkZWZpbmUgTUJJUwkJKDB4MGMgfCBQUkVfRU1QVElWRSkgLyogU2V0IG1vZGVtIGxpbmVzICovCisjZGVmaW5lIE1CSUMJCSgweDBkIHwgUFJFX0VNUFRJVkUpIC8qIENsZWFyIG1vZGVtIGxpbmVzICovCisjZGVmaW5lIE1TRVQJCSgweDBlIHwgUFJFX0VNUFRJVkUpIC8qIFNldCBtb2RlbSBsaW5lcyAqLworI2RlZmluZSBQQ0xPU0UJCTB4MGYJLyogUHNldWRvIGNsb3NlIC0gTGVhdmVzIHJ4L3R4IGVuYWJsZWQgKi8KKyNkZWZpbmUgTUdFVAkJKDB4MTAgfCBQUkVfRU1QVElWRSkgLyogRm9yY2UgdXBkYXRlIG9mIG1vZGVtIHN0YXR1cyAqLworI2RlZmluZSBNRU1EVU1QCQkoMHgxMSB8IFBSRV9FTVBUSVZFKSAvKiBTZW5kIGJhY2sgbWVtIGZyb20gYWRkciBzdXBwbGllZCAqLworI2RlZmluZQlSRUFEX1JFR0lTVEVSCSgweDEyIHwgUFJFX0VNUFRJVkUpIC8qIFJlYWQgQ0QxNDAwIHJlZ2lzdGVyIChkZWJ1ZykgKi8KKworLyogIkNvbW1hbmQiIHBhY2tldHMgZ29pbmcgZnJvbSByZW1vdGUgdG8gaG9zdCBDT01QTEVURSBhbmQgTU9ERU1fU1RBVFVTCisgICB1c2UgZGF0YVs0XSAvIGRhdGFbM10gdG8gaW5kaWNhdGUgY3VycmVudCBzdGF0ZSBhbmQgbW9kZW0gc3RhdHVzIHJlc3BlY3RpdmVseQorKi8gCisKKyNkZWZpbmUJQ09NUExFVEUJKDB4MjAgfCBQUkVfRU1QVElWRSkKKwkJCQkvKiBDb21tYW5kIGNvbXBsZXRlICovCisjZGVmaW5lIEJSRUFLX1JFQ0VJVkVECSgweDIxIHwgUFJFX0VNUFRJVkUpCisJCQkJLyogQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTU9ERU1fU1RBVFVTCSgweDIyIHwgUFJFX0VNUFRJVkUpCisJCQkJLyogQ2hhbmdlIGluIG1vZGVtIHN0YXR1cyAqLworCisvKiAiQ29tbWFuZCIgcGFja2V0IHRoYXQgY291bGQgZ28gZWl0aGVyIHdheSAtIGhhbmRzaGFrZSB3YWtlLXVwICovCisjZGVmaW5lIEhBTkRTSEFLRQkoMHgyMyB8IFBSRV9FTVBUSVZFKQorCQkJCS8qIFdha2UtdXAgdG8gSE9TVCAvIFJUQSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY21kLmggYi9kcml2ZXJzL2NoYXIvcmlvL2NtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjllZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NtZC5oCkBAIC0wLDAgKzEsODQgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICBDIE8gTSBNIEEgTiBEICAgUCBBIEMgSyBFIFQgICBIIEUgQSBEIEUgUiBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX2NtZF9oCisjZGVmaW5lIF9jbWRfaAorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19jbWRfaF9zY2NzID0gIkAoIyljbWQuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKworI2RlZmluZSBQUkVfRU1QVElWRV9DTUQgICAgICAgICAweDgwCisjZGVmaW5lIElOTElORV9DTUQgICAgICAgICAgICAgIH5QUkVfRU1QVElWRV9DTUQKKworI2RlZmluZSBDTURfSUdOT1JFX1BLVCAgICAgICAgICAoICh1c2hvcnQpIDApCisjZGVmaW5lIENNRF9TVEFUVVNfUkVRICAgICAgICAgICggKHVzaG9ydCkgMSkKKyNkZWZpbmUgQ01EX1VOSVRfU1RBVFVTX1JFUSAgICAgKCAodXNob3J0KSAyKSAgICAgLyogSXMgdGhpcyBuZWVkZWQgPz8/ICovCisjZGVmaW5lIENNRF9DT05GX1BPUlQgICAgICAgICAgICggKHVzaG9ydCkgMykKKyNkZWZpbmUgQ01EX0NPTkZfVU5JVCAgICAgICAgICAgKCAodXNob3J0KSA0KQorI2RlZmluZSBDTURfUk9VVEVfTUFQX1JFUSAgICAgICAoICh1c2hvcnQpIDUpCisjZGVmaW5lIENNRF9GTFVTSF9UWCAgICAgICAgICAgICggKHVzaG9ydCkgNikKKyNkZWZpbmUgQ01EX0ZMVVNIX1JYICAgICAgICAgICAgKCAodXNob3J0KSA3KQorI2RlZmluZSBDTURfUEFSVElPTl9QT1JUICAgICAgICAoICh1c2hvcnQpIDgpCisjZGVmaW5lIENNRF9SRVNFVF9QT1JUICAgICAgICAgICggKHVzaG9ydCkgMHgwYSkKKyNkZWZpbmUgQ01EX0JPT1RfVU5JVCAgICAgICAgICAgKCAodXNob3J0KSAweDBiKQorI2RlZmluZSBDTURfRk9VTkRfVU5JVCAgICAgICAgICAoICh1c2hvcnQpIDB4MGMpCisjZGVmaW5lIENNRF9BVFRBQ0hFRF9SVEFfMiAgICAgICggKHVzaG9ydCkgMHgwZCkKKyNkZWZpbmUgQ01EX1BST1ZJREVfQk9PVCAgICAgICAgKCAodXNob3J0KSAweDBlKQorI2RlZmluZSBDTURfQ0lSUlVTICAgICAgICAgICAgICAoICh1c2hvcnQpIDB4MGYpCisKKyNkZWZpbmUgRk9STV9TVEFUVVNfUEtUICAgICAgICAgKCAodXNob3J0KSAxICkKKyNkZWZpbmUgRk9STV9QT0xMX1BLVCAgICAgICAgICAgKCAodXNob3J0KSAyICkKKyNkZWZpbmUgRk9STV9MSU5LX1NUQVRVU19QS1QgICAgKCAodXNob3J0KSAzICkKKworCisjZGVmaW5lIENNRF9EQVRBX1BPUlQgICAgICAgICAgICggKHVzaG9ydCkgMSApCisjZGVmaW5lIENNRF9EQVRBICAgICAgICAgICAgICAgICggKHVzaG9ydCkgMiApCisKKyNkZWZpbmUgQ01EX1RYX1BBUlQgICAgICAgICAgICAgKCAodXNob3J0KSAyICkKKyNkZWZpbmUgQ01EX1JYX1BBUlQgICAgICAgICAgICAgKCAodXNob3J0KSAzICkKKyNkZWZpbmUgQ01EX1JYX0xJTUlUICAgICAgICAgICAgKCAodXNob3J0KSA0ICkKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jbWRibGsuaCBiL2RyaXZlcnMvY2hhci9yaW8vY21kYmxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4ZWZiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY21kYmxrLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogY21kYmxrLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjA5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIwCisqKgorKiogIGlkZW50IEAoIyljbWRibGsuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19jbWRibGtfaF9fCisjZGVmaW5lIF9fcmlvX2NtZGJsa19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfY21kYmxrX2hfc2Njc18gPSAiQCgjKWNtZGJsay5oCTEuMiI7CisjZW5kaWYKKyNlbmRpZgorCisvKgorKiogdGhlIHN0cnVjdHVyZSBvZiBhIGNvbW1hbmQgYmxvY2ssIHVzZWQgdG8gcXVldWUgY29tbWFuZHMgZGVzdGluZWQgZm9yCisqKiBhIHJ1cC4KKyovCisKK3N0cnVjdCBDbWRCbGsKK3sKKyBzdHJ1Y3QgQ21kQmxrICpOZXh0UDsgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGNvbW1hbmQgYmxvY2sgKi8KKyBzdHJ1Y3QJUEtUICAgICBQYWNrZXQ7ICAgICAgICAgLyogQSBwYWNrZXQsIHRvIGNvcHkgdG8gdGhlIHJ1cCAqLworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZnVuYyB0byBjYWxsIHRvIGNoZWNrIGlmIE9LICovCisgICAgCWludCAgICAgKCpQcmVGdW5jUCkoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworICAgIAlpbnQgICAgIFByZUFyZzsgICAgICAgICAvKiBUaGUgYXJnIGZvciB0aGUgZnVuYyAqLworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZnVuYyB0byBjYWxsIHdoZW4gY29tcGxldGVkICovCisgICAgCWludCAgICAgKCpQb3N0RnVuY1ApKGludCwgc3RydWN0IENtZEJsayAqKTsKKyAgICAJaW50ICAgICBQb3N0QXJnOyAgICAgICAgLyogVGhlIGFyZyBmb3IgdGhlIGZ1bmMgKi8KK307CisKKyNkZWZpbmUgTlVNX1JJT19DTURfQkxLUyAoMyAqIChNQVhfUlVQICogNCArIExJTktTX1BFUl9VTklUICogNCkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY21kcGt0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2NtZHBrdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmVmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NtZHBrdC5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBjbWRwa3QuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCisqKiAgaWRlbnQgQCgjKWNtZHBrdC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmbmRlZiBfX3Jpb19jbWRwa3RfaF9fCisjZGVmaW5lIF9fcmlvX2NtZHBrdF9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfY21kcGt0X2hfc2Njc18gPSAiQCgjKWNtZHBrdC5oCTEuMiI7CisjZW5kaWYKKyNlbmRpZgorCisvKgorKiogb3ZlcmxheXMgZm9yIHRoZSBkYXRhIGFyZWEgb2YgYSBwYWNrZXQuIFVzZWQgaW4gYm90aCBkaXJlY3Rpb25zCisqKiAodG8gYnVpbGQgYSBwYWNrZXQgdG8gc2VuZCwgYW5kIHRvIGludGVycHJldCBhIHBhY2tldCB0aGF0IGFycml2ZXMpCisqKiBhbmQgaXMgdmVyeSBpbmNvbnZlbmllbnQgZm9yIE1JUFMsIHNvIHRoZXkgYXBwZWFyIGFzIHR3byBzZXBhcmF0ZQorKiogc3RydWN0dXJlcyAtIHRob3NlIHVzZWQgZm9yIG1vZGlmeWluZy9yZWFkaW5nIHBhY2tldHMgb24gdGhlIGNhcmQKKyoqIGFuZCB0aG9zZSBmb3IgbW9kaWZ5aW5nL3JlYWRpbmcgcGFja2V0cyBpbiByZWFsIG1lbW9yeSwgd2hpY2ggaGF2ZSBhbiBfTQorKiogc3VmZml4LgorKi8KKworI2RlZmluZQlSVEFfQk9PVF9EQVRBX1NJWkUgKFBLVF9NQVhfREFUQV9MRU4tMikKKworLyoKKyoqIFRoZSBib290IGluZm9ybWF0aW9uIHBhY2tldCBsb29rcyBsaWtlIHRoaXM6CisqKiBUaGlzIHN0cnVjdHVyZSBvdmVybGF5cyBhIFBrdENtZC0+Q21kRGF0YSBzdHJ1Y3R1cmUsIGFuZCBzbyBzdGFydHMKKyoqIGF0IERhdGFbMl0gaW4gdGhlIGFjdHVhbCBwa3QhCisqLworc3RydWN0IEJvb3RTZXF1ZW5jZQoreworICAgIFdPUkQJTnVtUGFja2V0czsKKyAgICBXT1JECUxvYWRCYXNlOworICAgIFdPUkQJQ29kZVNpemU7Cit9OworCisjZGVmaW5lCUJPT1RfU0VRVUVOQ0VfTEVOCTgKKworc3RydWN0IFNhbVRvcAoreworICAgIEJZVEUgVW5pdDsKKyAgICBCWVRFIExpbms7Cit9OworCitzdHJ1Y3QgQ21kSGRyCit7CisgICAgQllURSBQY0NvbW1hbmQ7CisgICAgdW5pb24KKyAgICB7CisgICAgQllURSBQY1BoYk51bTsKKyAgICBCWVRFIFBjTGlua051bTsKKyAgICBCWVRFIFBjSUROdW07CisgICAgfSBVMDsKK307CisKKworc3RydWN0IFBrdENtZAoreworICAgIHVuaW9uCisgICAgeworCXN0cnVjdCAKKwl7CisJICAgIHN0cnVjdCBDbWRIZHIgQ21kSGRyOworCSAgICBzdHJ1Y3QgQm9vdFNlcXVlbmNlIFBjQm9vdFNlcXVlbmNlOworCX0gUzE7CisJc3RydWN0CisJeworCSAgICBXT1JEIFBjU2VxdWVuY2U7CisJICAgIEJZVEUgUGNCb290RGF0YVtSVEFfQk9PVF9EQVRBX1NJWkVdOworCX0gUzI7CisJc3RydWN0CisJeworCSAgICBXT1JEICBfX2NydWRfXzsKKwkgICAgQllURSAgUGNVbmlxTnVtWzRdOwkgICAgICAgIC8qIHRoaXMgaXMgcmVhbGx5IGEgdWludC4gKi8KKwkgICAgQllURSAgUGNNb2R1bGVUeXBlczsgIAkvKiB3aGF0IG1vZHVsZXMgYXJlIGZpdHRlZCAqLworCX0gUzM7CisJc3RydWN0CisJeworCSAgICBzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkgICAgQllURSAgIF9fdW5kZWZpbmVkX187CisJICAgIEJZVEUgICBQY01vZGVtU3RhdHVzOworCSAgICBCWVRFICAgUGNQb3J0U3RhdHVzOworCSAgICBCWVRFICAgUGNTdWJDb21tYW5kOwkvKiBjb21tYW5kcyBsaWtlIG1lbSBvciByZWdpc3RlciBkdW1wICovCisJICAgIFdPUkQgICBQY1N1YkFkZHI7CQkvKiBBZGRyZXNzIGZvciBjb21tYW5kICovCisJICAgIEJZVEUgICBQY1N1YkRhdGFbNjRdOwkvKiBEYXRlIGFyZWEgZm9yIGNvbW1hbmQgKi8KKwl9IFM0OworCXN0cnVjdAorCXsKKwkgICAgc3RydWN0IENtZEhkciBDbWRIZHI7CisJICAgIEJZVEUgICBQY0NvbW1hbmRUZXh0WzFdOworCSAgICBCWVRFICAgX19jcnVkX19bMjBdOworCSAgICBCWVRFICAgUGNJRE51bTI7CQkvKiBJdCBoYWQgdG8gZ28gc29tZXdoZXJlISAqLworCX0gUzU7CisJc3RydWN0CisJeworCSAgICBzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkgICAgc3RydWN0IFNhbVRvcCAgICBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CisJfSBTNjsKKyAgICB9IFUxOworfTsKKworc3RydWN0IFBrdENtZF9NCit7CisgICAgdW5pb24KKyAgICB7CisJc3RydWN0IAorCXsKKwkgICAgc3RydWN0CisJICAgIHsKKyAgICAJCXVjaGFyIFBjQ29tbWFuZDsKKyAgICAJCXVuaW9uCisgICAgCQl7CisgICAgCQkgICAgdWNoYXIgUGNQaGJOdW07CisgICAgCQkgICAgdWNoYXIgUGNMaW5rTnVtOworICAgIAkJICAgIHVjaGFyIFBjSUROdW07CisgICAgCQl9IFUwOworCSAgICB9IENtZEhkcjsKKwkgICAgc3RydWN0CisJICAgIHsKKyAgICAgICAgICAgICAgICB1c2hvcnQJTnVtUGFja2V0czsKKyAgICAgICAgICAgICAgICB1c2hvcnQJTG9hZEJhc2U7CisgICAgICAgICAgICAgICAgdXNob3J0CUNvZGVTaXplOworICAgICAgICAgICAgfSBQY0Jvb3RTZXF1ZW5jZTsKKwl9IFMxOworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0IFBjU2VxdWVuY2U7CisJICAgIHVjaGFyIFBjQm9vdERhdGFbUlRBX0JPT1RfREFUQV9TSVpFXTsKKwl9IFMyOworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0ICBfX2NydWRfXzsKKwkgICAgdWNoYXIgIFBjVW5pcU51bVs0XTsJICAgICAgICAvKiB0aGlzIGlzIHJlYWxseSBhIHVpbnQuICovCisJICAgIHVjaGFyICBQY01vZHVsZVR5cGVzOyAgCS8qIHdoYXQgbW9kdWxlcyBhcmUgZml0dGVkICovCisJfSBTMzsKKwlzdHJ1Y3QKKwl7CisJICAgIHVzaG9ydCAgX19jbWRfaGRyX187CisJICAgIHVjaGFyICAgX191bmRlZmluZWRfXzsKKwkgICAgdWNoYXIgICBQY01vZGVtU3RhdHVzOworCSAgICB1Y2hhciAgIFBjUG9ydFN0YXR1czsKKwkgICAgdWNoYXIgICBQY1N1YkNvbW1hbmQ7CisJICAgIHVzaG9ydCAgUGNTdWJBZGRyOworCSAgICB1Y2hhciAgIFBjU3ViRGF0YVs2NF07CisJfSBTNDsKKwlzdHJ1Y3QKKwl7CisJICAgIHVzaG9ydCAgX19jbWRfaGRyX187CisJICAgIHVjaGFyICAgUGNDb21tYW5kVGV4dFsxXTsKKwkgICAgdWNoYXIgICBfX2NydWRfX1syMF07CisJICAgIHVjaGFyICAgUGNJRE51bTI7CQkvKiBUYWNrZWQgb24gZW5kICovCisJfSBTNTsKKwlzdHJ1Y3QKKwl7CisJICAgIHVzaG9ydCAgX19jbWRfaGRyX187CisJICAgIHN0cnVjdCBUb3AgVG9wb2xvZ3lbTElOS1NfUEVSX1VOSVRdOworCX0gUzY7CisgICAgfSBVMTsKK307CisKKyNkZWZpbmUgQ29tbWFuZAkJVTEuUzEuQ21kSGRyLlBjQ29tbWFuZAorI2RlZmluZSBQaGJOdW0JCVUxLlMxLkNtZEhkci5VMC5QY1BoYk51bQorI2RlZmluZSBJRE51bQkJVTEuUzEuQ21kSGRyLlUwLlBjSUROdW0KKyNkZWZpbmUgSUROdW0yCQlVMS5TNS5QY0lETnVtMgorI2RlZmluZSBMaW5rTnVtCQlVMS5TMS5DbWRIZHIuVTAuUGNMaW5rTnVtCisjZGVmaW5lIFNlcXVlbmNlCVUxLlMyLlBjU2VxdWVuY2UKKyNkZWZpbmUgQm9vdERhdGEJVTEuUzIuUGNCb290RGF0YQorI2RlZmluZSBCb290U2VxdWVuY2UJVTEuUzEuUGNCb290U2VxdWVuY2UKKyNkZWZpbmUgVW5pcU51bQkJVTEuUzMuUGNVbmlxTnVtCisjZGVmaW5lIE1vZGVtU3RhdHVzCVUxLlM0LlBjTW9kZW1TdGF0dXMKKyNkZWZpbmUgUG9ydFN0YXR1cwlVMS5TNC5QY1BvcnRTdGF0dXMKKyNkZWZpbmUgU3ViQ29tbWFuZAlVMS5TNC5QY1N1YkNvbW1hbmQKKyNkZWZpbmUgU3ViQWRkcgkJVTEuUzQuUGNTdWJBZGRyCisjZGVmaW5lIFN1YkRhdGEJCVUxLlM0LlBjU3ViRGF0YQorI2RlZmluZSBDb21tYW5kVGV4dAlVMS5TNS5QY0NvbW1hbmRUZXh0CisjZGVmaW5lIFJvdXRlVG9wb2xvZ3kJVTEuUzYuVG9wb2xvZ3kKKyNkZWZpbmUgTW9kdWxlVHlwZXMJVTEuUzMuUGNNb2R1bGVUeXBlcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY29udHJvbC5oIGIvZHJpdmVycy9jaGFyL3Jpby9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxMmY2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY29udHJvbC5oCkBAIC0wLDAgKzEsNjIgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICBDIE8gTiBUIFIgTyBMICAgUCBBIEMgSyBFIFQgICBIIEUgQSBEIEUgUiBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBKb24gQnJhd24KKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9jb250cm9sX2gKKyNkZWZpbmUgX2NvbnRyb2xfaAorCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICpfcmlvX2NvbnRyb2xfaF9zY2NzID0gIkAoIyljb250cm9sLmgJMS40IjsgKi8KKyNlbmRpZgorCisjZGVmaW5lCUNPTlRST0wJCSdeJworI2RlZmluZSBJRk9BRAkJKCBDT05UUk9MICsgMSApCisjZGVmaW5lCUlERU5USUZZCSggQ09OVFJPTCArIDIgKQorI2RlZmluZQlaT01CSUUJCSggQ09OVFJPTCArIDMgKQorI2RlZmluZQlVRk9BRAkJKCBDT05UUk9MICsgNCApCisjZGVmaW5lIElXQUlUCQkoIENPTlRST0wgKyA1ICkKKworI2RlZmluZQlJRk9BRF9NQUdJQwkweEYwQUQJCS8qIG9mIGNvdXJzZSAqLworI2RlZmluZQlaT01CSUVfTUFHSUMJKH4weERFQUQpCS8qIG5vdCBkZWFkIC0+IHpvbWJpZSAqLworI2RlZmluZQlVRk9BRF9NQUdJQwkweEQxRQkJLyoga2lsbC15b3VyLW5laWdoYm91ciAqLworI2RlZmluZQlJV0FJVF9NQUdJQwkweEIxREUJCS8qIEJpZGUgeW91ciB0aW1lICovCisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGFlbW9uLmggYi9kcml2ZXJzL2NoYXIvcmlvL2RhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGJhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RhZW1vbi5oCkBAIC0wLDAgKzEsMzM0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBkYWVtb24uaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWRhZW1vbi5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX2RhZW1vbl9oX18KKyNkZWZpbmUJX19yaW9fZGFlbW9uX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9kYWVtb25faF9zY2NzXyA9ICJAKCMpZGFlbW9uLmgJMS4zIjsKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyoqIHN0cnVjdHVyZXMgdXNlZCBvbiAvZGV2L3JpbworKi8KKworc3RydWN0IEVycm9yCit7CisJdWludAlFcnJvcjsKKwl1aW50CUVudHJ5OworCXVpbnQJT3RoZXI7Cit9OworCitzdHJ1Y3QgRG93bkxvYWQKK3sKKwljaGFyCSpEYXRhUDsKKwl1aW50CUNvdW50OworCXVpbnQJUHJvZHVjdENvZGU7Cit9OworCisvKgorKiogQSBmZXcgY29uc3RhbnRzLi4uLgorKi8KKyNpZm5kZWYgTUFYX1ZFUlNJT05fTEVOCisjZGVmaW5lCU1BWF9WRVJTSU9OX0xFTgkyNTYKKyNlbmRpZgorCisjaWZuZGVmIE1BWF9YUF9DVFJMX0xFTgorI2RlZmluZQlNQVhfWFBfQ1RSTF9MRU4gMTYJCS8qIEFMU08gSU4gUE9SVC5IICovCisjZW5kaWYKKworc3RydWN0CVBvcnRTZXR1cAoreworCXVpbnQJRnJvbTsJLyogU2V0L0NsZWFyIFhQICYgSVhBTlkgQ29udHJvbCBmcm9tIHRoaXMgcG9ydC4uLi4gKi8KKwl1aW50CVRvOwkvKiAuLi4uIHRvIHRoaXMgcG9ydCAqLworCXVpbnQJWHBDcHM7CQkJLyogYXQgdGhpcyBzcGVlZCAqLworCWNoYXIJWHBPbltNQVhfWFBfQ1RSTF9MRU5dOwkvKiB0aGlzIGlzIHRoZSBzdGFydCBzdHJpbmcgKi8KKwljaGFyCVhwT2ZmW01BWF9YUF9DVFJMX0xFTl07CS8qIHRoaXMgaXMgdGhlIHN0b3Agc3RyaW5nICovCisJdWNoYXIJSXhBbnk7CQkJLyogZW5hYmxlL2Rpc2FibGUgSVhBTlkgKi8KKwl1Y2hhcglJeE9uOwkJCS8qIGVuYWJsZS9kaXNhYmxlIElYT04gKi8KKwl1Y2hhcglMb2NrOwkJCS8qIGxvY2sgcG9ydCBwYXJhbXMgKi8KKwl1Y2hhcglTdG9yZTsJCQkvKiBzdG9yZSBwYXJhbXMgYWNyb3NzIGNsb3NlcyAqLworCXVjaGFyCURyYWluOwkJCS8qIGNsb3NlIG9ubHkgd2hlbiBkcmFpbmVkICovCit9OworCitzdHJ1Y3QJTHBiUmVxCit7CisJdWludAlIb3N0OworCXVpbnQJTGluazsKKwlzdHJ1Y3QgIExQQiAgICAgKkxwYlA7Cit9OworCitzdHJ1Y3QJUnVwUmVxCit7CisJdWludAlIb3N0TnVtOworCXVpbnQJUnVwTnVtOworCXN0cnVjdCAgUlVQIAkqUnVwUDsKK307CisKK3N0cnVjdAlQb3J0UmVxCit7CisJdWludAlTeXNQb3J0OworCXN0cnVjdCAgUG9ydCAJKlBvcnRQOworfTsKKworc3RydWN0ICBTdHJlYW1JbmZvCit7CisJdWludAlTeXNQb3J0OworI2lmIDAKKwlxdWV1ZV90IFJRdWV1ZTsKKwlxdWV1ZV90IFdRdWV1ZTsKKyNlbHNlCisJaW50IFJRdWV1ZTsKKwlpbnQgV1F1ZXVlOworI2VuZGlmCit9OworCitzdHJ1Y3QJSG9zdFJlcQoreworCXVpbnQJSG9zdE51bTsKKwlzdHJ1Y3QgIEhvc3QgCSpIb3N0UDsKK307CisKK3N0cnVjdAlIb3N0RHBSYW0KK3sKKwl1aW50CUhvc3ROdW07CisJc3RydWN0CURwUmFtCSpEcFJhbVA7Cit9OworCitzdHJ1Y3QJRGVidWdDdHJsCit7CisJdWludAlTeXNQb3J0OworCXVpbnQJRGVidWc7CisJdWludAlXYWl0OworfTsKKworc3RydWN0CU1hcEluZm8KK3sKKwl1aW50CUZpcnN0UG9ydDsJLyogOCBwb3J0cywgc3RhcnRpbmcgZnJvbSB0aGlzICh0dHkpIG51bWJlciAqLworCXVpbnQJUnRhVW5pcXVlOwkvKiByZXNpZGUgb24gdGhpcyBSVEEgKHVuaXF1ZSBudW1iZXIpICovCit9OworCitzdHJ1Y3QJTWFwSW4KK3sKKwl1aW50CU51bUVudHJpZXM7CQkvKiBIb3cgbWFueSBwb3J0IHNldHMgYXJlIHdlIG1hcHBpbmc/ICovCisJc3RydWN0ICBNYXBJbmZvCSpNYXBJbmZvUDsJLyogUG9pbnRlciB0byAodXNlciBzcGFjZSkgaW5mbyAqLworfTsKKworc3RydWN0ICBTZW5kUGFjaworeworICAgICAgICB1bnNpZ25lZCBpbnQJUG9ydE51bTsKKwl1bnNpZ25lZCBjaGFyCUxlbjsKKwl1bnNpZ25lZCBjaGFyCURhdGFbUEtUX01BWF9EQVRBX0xFTl07Cit9OworCitzdHJ1Y3QgU3BlY2lhbFJ1cENtZAoreworCXN0cnVjdAlQS1QJCVBhY2tldDsKKwl1bnNpZ25lZCBzaG9ydAlIb3N0OworCXVuc2lnbmVkIHNob3J0CVJ1cE51bTsKK307CisKK3N0cnVjdAlJZGVudGlmeVJ0YQoreworCXVsb25nCVJ0YVVuaXF1ZTsKKwl1Y2hhcglJRDsKK307CisKK3N0cnVjdAlLaWxsTmVpZ2hib3VyCit7CisJdWxvbmcJVW5pcXVlTnVtOworCXVjaGFyCUxpbms7Cit9OworCitzdHJ1Y3QgcmlvVmVyc2lvbiB7CisgICAgY2hhciAgICAgICAgdmVyc2lvbltNQVhfVkVSU0lPTl9MRU5dOworICAgIGNoYXIgICAgICAgIHJlbGlkW01BWF9WRVJTSU9OX0xFTl07CisgICAgaW50ICAgICAgICAgYnVpbGRMZXZlbDsKKyAgICBjaGFyICAgICAgICBidWlsZERhdGVbTUFYX1ZFUlNJT05fTEVOXTsKK307CisKKworLyoKKyoqCVJJT0MgY29tbWFuZHMgYXJlIGZvciB0aGUgZGFlbW9uIHR5cGUgb3BlcmF0aW9ucworKioKKyoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IHBhcnQgZml4CisqKiBEZWZpbml0aW9uIGZvciAnUklPQycgYWxzbyBhcHBlYXJzIGluIHJpb2lvY3RsLmgsIHNvIHdlJ2QgYmV0dGVyIGRvIGEKKyoqICNpZm5kZWYgaGVyZSBmaXJzdC4KKyoqIHJpb2lvY3RsLmggYWxzbyBub3cgaGFzICNkZWZpbmUgJ1JJT19RVUlDS19DSEVDSycgYXMgdGhpcyBpb2N0bCBpcyBub3cKKyoqIGFsbG93ZWQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCisqLworI2lmbmRlZiBSSU9DCisjZGVmaW5lCVJJT0MJKCdSJzw8OCl8KCdpJzw8MTYpfCgnbyc8PDI0KQorI2VuZGlmCisKKy8qCisqKiBCb290IHN0dWZmCisqLworI2RlZmluZQlSSU9fR0VUX1RBQkxFICAgICAoUklPQyB8IDEwMCkKKyNkZWZpbmUgUklPX1BVVF9UQUJMRSAgICAgKFJJT0MgfCAxMDEpCisjZGVmaW5lIFJJT19BU1NJR05fUlRBICAgIChSSU9DIHwgMTAyKQorI2RlZmluZSBSSU9fREVMRVRFX1JUQSAgICAoUklPQyB8IDEwMykKKyNkZWZpbmUJUklPX0hPU1RfRk9BRAkgIChSSU9DIHwgMTA0KQorI2RlZmluZQlSSU9fUVVJQ0tfQ0hFQ0sJICAoUklPQyB8IDEwNSkKKyNkZWZpbmUgUklPX1NJR05BTFNfT04gICAgKFJJT0MgfCAxMDYpCisjZGVmaW5lIFJJT19TSUdOQUxTX09GRiAgIChSSU9DIHwgMTA3KQorI2RlZmluZQlSSU9fQ0hBTkdFX05BTUUgICAoUklPQyB8IDEwOCkKKyNkZWZpbmUgUklPX0RPV05MT0FEICAgICAgKFJJT0MgfCAxMDkpCisjZGVmaW5lCVJJT19HRVRfTE9HCSAgKFJJT0MgfCAxMTApCisjZGVmaW5lCVJJT19TRVRVUF9QT1JUUyAgIChSSU9DIHwgMTExKQorI2RlZmluZSBSSU9fQUxMX01PREVNICAgICAoUklPQyB8IDExMikKKworLyoKKyoqIGNhcmQgc3RhdGUsIGRlYnVnIHN0dWZmCisqLworI2RlZmluZQlSSU9fTlVNX0hPU1RTCSAgKFJJT0MgfCAxMjApCisjZGVmaW5lCVJJT19IT1NUX0xQQgkgIChSSU9DIHwgMTIxKQorI2RlZmluZQlSSU9fSE9TVF9SVVAJICAoUklPQyB8IDEyMikKKyNkZWZpbmUJUklPX0hPU1RfUE9SVAkgIChSSU9DIHwgMTIzKQorI2RlZmluZQlSSU9fUEFSTVMgCSAgKFJJT0MgfCAxMjQpCisjZGVmaW5lIFJJT19IT1NUX1JFUQkgIChSSU9DIHwgMTI1KQorI2RlZmluZQlSSU9fUkVBRF9DT05GSUcJICAoUklPQyB8IDEyNikKKyNkZWZpbmUJUklPX1NFVF9DT05GSUcJICAoUklPQyB8IDEyNykKKyNkZWZpbmUJUklPX1ZFUlNJRAkgIChSSU9DIHwgMTI4KQorI2RlZmluZQlSSU9fRkxBR1MJICAoUklPQyB8IDEyOSkKKyNkZWZpbmUJUklPX1NFVERFQlVHCSAgKFJJT0MgfCAxMzApCisjZGVmaW5lCVJJT19HRVRERUJVRwkgIChSSU9DIHwgMTMxKQorI2RlZmluZQlSSU9fUkVBRF9MRVZFTFMgICAoUklPQyB8IDEzMikKKyNkZWZpbmUJUklPX1NFVF9GQVNUX0JVUyAgKFJJT0MgfCAxMzMpCisjZGVmaW5lCVJJT19TRVRfU0xPV19CVVMgIChSSU9DIHwgMTM0KQorI2RlZmluZQlSSU9fU0VUX0JZVEVfTU9ERSAoUklPQyB8IDEzNSkKKyNkZWZpbmUJUklPX1NFVF9XT1JEX01PREUgKFJJT0MgfCAxMzYpCisjZGVmaW5lIFJJT19TVFJFQU1fSU5GTyAgIChSSU9DIHwgMTM3KQorI2RlZmluZQlSSU9fU1RBUlRfUE9MTEVSICAoUklPQyB8IDEzOCkKKyNkZWZpbmUJUklPX1NUT1BfUE9MTEVSICAgKFJJT0MgfCAxMzkpCisjZGVmaW5lCVJJT19MQVNUX0VSUk9SICAgIChSSU9DIHwgMTQwKQorI2RlZmluZQlSSU9fVElDSwkgIChSSU9DIHwgMTQxKQorI2RlZmluZQlSSU9fVE9DSwkgIChSSU9DIHwgMjQxKQkvKiBJIGRpZCB0aGlzIG9uIHB1cnBvc2UsIHlvdSBrbm93LiAqLworI2RlZmluZQlSSU9fU0VORF9QQUNLRVQgICAoUklPQyB8IDE0MikKKyNkZWZpbmUJUklPX1NFVF9CVVNZCSAgKFJJT0MgfCAxNDMpCisjZGVmaW5lCVNQRUNJQUxfUlVQX0NNRCAgIChSSU9DIHwgMTQ0KQorI2RlZmluZQlSSU9fRk9BRF9SVEEgICAgICAoUklPQyB8IDE0NSkKKyNkZWZpbmUJUklPX1pPTUJJRV9SVEEgICAgKFJJT0MgfCAxNDYpCisjZGVmaW5lIFJJT19JREVOVElGWV9SVEEgIChSSU9DIHwgMTQ3KQorI2RlZmluZSBSSU9fS0lMTF9ORUlHSEJPVVIgKFJJT0MgfCAxNDgpCisjZGVmaW5lIFJJT19ERUJVR19NRU0gICAgIChSSU9DIHwgMTQ5KQorLyoKKyoqIDE1MCAtIDE2NyB1c2VkLi4uLi4gICBTZWUgYmVsb3cKKyovCisjZGVmaW5lIFJJT19HRVRfUE9SVF9TRVRVUCAoUklPQyB8IDE2OCkKKyNkZWZpbmUgUklPX1JFU1VNRSAgICAgICAgKFJJT0MgfCAxNjkpCisjZGVmaW5lCVJJT19NRVNHCShSSU9DIHwgMTcwKQorI2RlZmluZQlSSU9fTk9fTUVTRwkoUklPQyB8IDE3MSkKKyNkZWZpbmUJUklPX1dIQVRfTUVTRwkoUklPQyB8IDE3MikKKyNkZWZpbmUgUklPX0hPU1RfRFBSQU0JKFJJT0MgfCAxNzMpCisjZGVmaW5lIFJJT19NQVBfQjUwX1RPXzUwCShSSU9DIHwgMTc0KQorI2RlZmluZSBSSU9fTUFQX0I1MF9UT181NzYwMAkoUklPQyB8IDE3NSkKKyNkZWZpbmUgUklPX01BUF9CMTEwX1RPXzExMAkoUklPQyB8IDE3NikKKyNkZWZpbmUgUklPX01BUF9CMTEwX1RPXzExNTIwMAkoUklPQyB8IDE3NykKKyNkZWZpbmUgUklPX0dFVF9QT1JUX1BBUkFNUwkoUklPQyB8IDE3OCkKKyNkZWZpbmUgUklPX1NFVF9QT1JUX1BBUkFNUwkoUklPQyB8IDE3OSkKKyNkZWZpbmUgUklPX0dFVF9QT1JUX1RUWQkoUklPQyB8IDE4MCkKKyNkZWZpbmUgUklPX1NFVF9QT1JUX1RUWQkoUklPQyB8IDE4MSkKKyNkZWZpbmUgUklPX1NZU0xPR19PTkxZCShSSU9DIHwgMTgyKQorI2RlZmluZSBSSU9fU1lTTE9HX0NPTlMJKFJJT0MgfCAxODMpCisjZGVmaW5lIFJJT19DT05TX09OTFkJKFJJT0MgfCAxODQpCisjZGVmaW5lIFJJT19CTE9DS19PUEVOUwkoUklPQyB8IDE4NSkKKworLyoKKyoqIDAyLjAzLjE5OTkgQVJHIC0gRVNJTCAwODIwIGZpeCA6CisqKiBSSU9Cb290TW9kZSBpcyBubyBsb25nZXIgdXNlIGJ5IHRoZSBkcml2ZXIsIHNvIHRoZXNlIGlvY3RscworKiogYXJlIG5vdyBvYnNvbGV0ZSA6CisqKgorI2RlZmluZSBSSU9fR0VUX0JPT1RfTU9ERQkoUklPQyB8IDE4NikKKyNkZWZpbmUgUklPX1NFVF9CT09UX01PREUJKFJJT0MgfCAxODcpCisqKgorKi8KKworI2RlZmluZSBSSU9fTUVNX0RVTVAJKFJJT0MgfCAxODkpCisjZGVmaW5lIFJJT19SRUFEX1JFR0lTVEVSCShSSU9DIHwgMTkwKQorI2RlZmluZSBSSU9fR0VUX01PRFRZUEUJKFJJT0MgfCAxOTEpCisjZGVmaW5lIFJJT19TRVRfVElNRVIJKFJJT0MgfCAxOTIpCisjZGVmaW5lIFJJT19SRUFEX0NIRUNLCShSSU9DIHwgMTk2KQorI2RlZmluZSBSSU9fV0FJVElOR19GT1JfUkVTVEFSVAkoUklPQyB8IDE5NykKKyNkZWZpbmUgUklPX0JJTkRfUlRBCShSSU9DIHwgMTk4KQorI2RlZmluZSBSSU9fR0VUX0JJTkRJTkdTCShSSU9DIHwgMTk5KQorI2RlZmluZSBSSU9fUFVUX0JJTkRJTkdTCShSSU9DIHwgMjAwKQorCisjZGVmaW5lCVJJT19NQUtFX0RFVgkJKFJJT0MgfCAyMDEpCisjZGVmaW5lCVJJT19NSU5PUgkJKFJJT0MgfCAyMDIpCisKKyNkZWZpbmUJUklPX0lERU5USUZZX0RSSVZFUgkoUklPQyB8IDIwMykKKyNkZWZpbmUJUklPX0RJU1BMQVlfSE9TVF9DRkcJKFJJT0MgfCAyMDQpCisKKworLyoKKyoqIE1BS0VfREVWIC8gTUlOT1Igc3R1ZmYKKyovCisjZGVmaW5lCVJJT19ERVZfRElSRUNUCQkweDAwMDAKKyNkZWZpbmUJUklPX0RFVl9NT0RFTQkJMHgwMjAwCisjZGVmaW5lCVJJT19ERVZfWFBSSU5UCQkweDA0MDAKKyNkZWZpbmUJUklPX0RFVl9NQVNLCQkweDA2MDAKKworLyoKKyoqIHBvcnQgbWFuYWdlbWVudCwgeHByaW50IHN0dWZmCisqLworI2RlZmluZQlySU9DTihOKQkoUklPQ3woTikpCisjZGVmaW5lCXJJT0NSKE4sVCkJKFJJT0N8KE4pKQorI2RlZmluZQlySU9DVyhOLFQpCShSSU9DfChOKSkKKworI2RlZmluZQlSSU9fR0VUX1hQX09OICAgICBySU9DUigxNTAsY2hhclsxNl0pCS8qIHN0YXJ0IHhwcmludCBzdHJpbmcgKi8KKyNkZWZpbmUJUklPX1NFVF9YUF9PTiAgICAgcklPQ1coMTUxLGNoYXJbMTZdKQorI2RlZmluZQlSSU9fR0VUX1hQX09GRiAgICBySU9DUigxNTIsY2hhclsxNl0pCS8qIGZpbmlzaCB4cHJpbnQgc3RyaW5nICovCisjZGVmaW5lCVJJT19TRVRfWFBfT0ZGICAgIHJJT0NXKDE1MyxjaGFyWzE2XSkKKyNkZWZpbmUJUklPX0dFVF9YUF9DUFMgICAgcklPQ1IoMTU0LGludCkJLyogeHByaW50IENQUyAqLworI2RlZmluZQlSSU9fU0VUX1hQX0NQUyAgICBySU9DVygxNTUsaW50KQorI2RlZmluZSBSSU9fR0VUX0lYQU5ZICAgICBySU9DUigxNTYsaW50KQkvKiBpeGFueSBhbGxvd2VkPyAqLworI2RlZmluZSBSSU9fU0VUX0lYQU5ZICAgICBySU9DVygxNTcsaW50KQorI2RlZmluZSBSSU9fU0VUX0lYQU5ZX09OICBySU9DTigxNTgpCQkvKiBhbGxvdyBpeGFueSAqLworI2RlZmluZSBSSU9fU0VUX0lYQU5ZX09GRiBySU9DTigxNTkpCQkvKiBkaXNhbGxvdyBpeGFueSAqLworI2RlZmluZSBSSU9fR0VUX01PREVNICAgICBySU9DUigxNjAsaW50KQkvKiBwb3J0IGlzIG1vZGVtL2RpcmVjdCBsaW5lPyAqLworI2RlZmluZSBSSU9fU0VUX01PREVNICAgICBySU9DVygxNjEsaW50KQorI2RlZmluZSBSSU9fU0VUX01PREVNX09OICBySU9DTigxNjIpCQkvKiBwb3J0IGlzIGEgbW9kZW0gKi8KKyNkZWZpbmUgUklPX1NFVF9NT0RFTV9PRkYgcklPQ04oMTYzKQkJLyogcG9ydCBpcyBkaXJlY3QgKi8KKyNkZWZpbmUgUklPX0dFVF9JWE9OICAgICAgcklPQ1IoMTY0LGludCkJLyogaXhvbiBhbGxvd2VkPyAqLworI2RlZmluZSBSSU9fU0VUX0lYT04gICAgICBySU9DVygxNjUsaW50KQorI2RlZmluZSBSSU9fU0VUX0lYT05fT04gICBySU9DTigxNjYpCQkvKiBhbGxvdyBpeG9uICovCisjZGVmaW5lIFJJT19TRVRfSVhPTl9PRkYgIHJJT0NOKDE2NykJCS8qIGRpc2FsbG93IGl4b24gKi8KKworI2RlZmluZSBSSU9fR0VUX1NJVklFVwkgICgoKCdzJyk8PDgpIHwgMTA2KQkvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFNJICovCisKKyNkZWZpbmUJUklPX0lPQ1RMX1VOS05PV04JLTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2RhdGEuaCBiL2RyaXZlcnMvY2hhci9yaW8vZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmMyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RhdGEuaApAQCAtMCwwICsxLDQwIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBkYXRhLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjA5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIylkYXRhLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fZGF0YWRleF9fCisjZGVmaW5lIF9fcmlvX2RhdGFkZXhfXworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfZGF0YV9oX3NjY3NfID0gIkAoIylkYXRhLmgJMS4yIjsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGVidWcuaCBiL2RyaXZlcnMvY2hhci9yaW8vZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUwZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9kZWJ1Zy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisqKiBGaWxlOgkJZGVidWcuaAorKioKKyoqIEF1dGhvcjoJCURhdmlkIERpeAorKioKKyoqIENyZWF0ZWQ6CQkxMnRoIE1hcmNoIDE5OTMKKyoqCisqKiBMYXN0IG1vZGlmaWVkOgk5My8wNC8yNworKioKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfZGVidWdfaF8KKyNkZWZpbmUgX2RlYnVnX2hfCisKKworI2lmIGRlZmluZWQoRENJUlJVUykKKyNkZWZpbmUJREJQQUNLRVQocGt0LCBvcHQsIHN0ciwgY2huKSAJZGVidWdfcGFja2V0KChwa3QpLCAob3B0KSwgKHN0ciksIChjaG4pKQorI2Vsc2UKKyNkZWZpbmUJREJQQUNLRVQocGt0LCBvcHQsIHN0ciwgYykKKyNlbmRpZgkvKiBEQ0lSUlVTICovCisKKworI2VuZGlmCS8qIF9kZWJ1Z19oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9kZWZhdWx0cy5oIGIvZHJpdmVycy9jaGFyL3Jpby9kZWZhdWx0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzMwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RlZmF1bHRzLmgKQEAgLTAsMCArMSw1OSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgRCBFIEYgQSBVIEwgVCBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19kZWZhdWx0c19oX3NjY3MgPSAiQCgjKWRlZmF1bHRzLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKyNkZWZpbmUgTUlMTElTRUNPTkQgICAgICAgICAgIChpbnQpICgxMDAwLzY0KSAgIC8qIDE1LjYyNSBsb3cgdGlja3MgKi8KKyNkZWZpbmUgU0VDT05EICAgICAgICAgICAgICAgIChpbnQpIDE1NjI1ICAgICAgIC8qIExvdyBwcmlvcml0eSB0aWNrcyAqLworCisjaWZkZWYgUlRBCisjZGVmaW5lIFJYX0xJTUlUICAgICAgICh1c2hvcnQpIDMKKyNlbmRpZgorI2lmZGVmIEhPU1QKKyNkZWZpbmUgUlhfTElNSVQgICAgICAgKHVzaG9ydCkgMQorI2VuZGlmCisKKyNkZWZpbmUgTElOS19USU1FT1VUICAgICAgICAgIChpbnQpIChQT0xMX1BFUklPRCAvIDIpCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Vpc2EuaCBiL2RyaXZlcnMvY2hhci9yaW8vZWlzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzcxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Vpc2EuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBlaXNhLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEwCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIyllaXNhLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fZWlzYV9oX18KKyNkZWZpbmUgX19yaW9fZWlzYV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfZWlzYV9oX3NjY3NfID0gIkAoIyllaXNhLmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiB0aGluZ3MgdG8gZG8gd2l0aCB0aGUgRUlTQSBidXMKKyovCisKKyNkZWZpbmUgUklPX0VJU0FfU1RSSU5HX0FERFJFU1MgCTB4ZmZmZDkJLyogd2hlcmUgRUlTQSBpcyBzdG9yZWQgKi8KKworI2RlZmluZQlSSU9fTUFYX0VJU0FfU0xPVFMJCTE2CS8qIGhvdyBtYW55IEVJU0Egc2xvdHM/ICovCisKKyNkZWZpbmUJUklPX0VJU0FfSURFTlQJCQkweDk4NEQJLyogU3BlY2lhbGl4ICovCisjZGVmaW5lCVJJT19FSVNBX1BST0RVQ1RfQ09ERQkJMHgxNAkvKiBDb2RlIDE0ICovCisjZGVmaW5lCVJJT19FSVNBX0VOQUJMRV9CSVQJCTB4MDEJLyogVG8gZW5hYmxlIGNhcmQgKi8KKworI2RlZmluZQlFSVNBX01FTU9SWV9CQVNFX0xPCQkweEMwMAkvKiBBMTYtQTIzICovCisjZGVmaW5lCUVJU0FfTUVNT1JZX0JBU0VfSEkJCTB4QzAxCS8qIEEyNC1BMzEgKi8KKyNkZWZpbmUJRUlTQV9JTlRFUlJVUFRfVkVDCQkweEMwMgkvKiBzZWUgYmVsb3cgKi8KKyNkZWZpbmUJRUlTQV9DT05UUk9MX1BPUlQJCTB4QzAyCS8qIHNlZSBiZWxvdyAqLworI2RlZmluZQlFSVNBX0lOVEVSUlVQVF9SRVNFVAkJMHhDMDMJLyogcmVhZCB0byBjbGVhciBJUlEgKi8KKworI2RlZmluZQlFSVNBX1BST0RVQ1RfSURFTlRfTE8JCTB4QzgwCS8qIHdoZXJlIFJJT19FSVNBX0lERU5UIGlzICovCisjZGVmaW5lCUVJU0FfUFJPRFVDVF9JREVOVF9ISQkJMHhDODEKKyNkZWZpbmUJRUlTQV9QUk9EVUNUX05VTUJFUgkJMHhDODIgICAvKiB3aGVyZSBQUk9EX0NPREUgaXMgKi8KKyNkZWZpbmUJRUlTQV9SRVZJU0lPTl9OVU1CRVIJCTB4QzgzCS8qIHJldmlzaW9uICgxZHApICovCisjZGVmaW5lCUVJU0FfRU5BQkxFCQkJMHhDODQJLyogc2V0IExTQiB0byBlbmFibGUgY2FyZCAqLworI2RlZmluZQlFSVNBX1VOSVFVRV9OVU1fMAkJMHhDODgJLyogdm9taXQgKi8KKyNkZWZpbmUJRUlTQV9VTklRVUVfTlVNXzEJCTB4QzhBCisjZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8yCQkweEM5MAkvKiBiaXQgc3RyYW5nZWx5IGFycmFuZ2VkICovCisjZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8zCQkweEM5MgorI2RlZmluZQlFSVNBX01BTlVGX1lFQVIJCQkweEM5OAkvKiB3aGVuICovCisjZGVmaW5lCUVJU0FfTUFOVUZfV0VFSwkJCTB4QzlBCS8qIG1vcmUgd2hlbiAqLworCisjZGVmaW5lCUVJU0FfVFBfQk9PVF9GUk9NX1JBTQkweDAxCisjZGVmaW5lCUVJU0FfVFBfQk9PVF9GUk9NX0xJTksJMHgwMAorI2RlZmluZQlFSVNBX1RQX0ZBU1RfTElOS1MJMHgwMgorI2RlZmluZQlFSVNBX1RQX1NMT1dfTElOS1MJMHgwMAorI2RlZmluZQlFSVNBX1RQX0JVU19FTkFCTEUJMHgwNAorI2RlZmluZQlFSVNBX1RQX0JVU19ESVNBQkxFCTB4MDAKKyNkZWZpbmUJRUlTQV9UUF9SVU4JCTB4MDgKKyNkZWZpbmUJRUlTQV9UUF9SRVNFVAkJMHgwMAorI2RlZmluZQlFSVNBX1BPTExFRAkJMHgwMAorI2RlZmluZQlFSVNBX0lSUV8zCQkweDMwCisjZGVmaW5lCUVJU0FfSVJRXzQJCTB4NDAKKyNkZWZpbmUJRUlTQV9JUlFfNQkJMHg1MAorI2RlZmluZQlFSVNBX0lSUV82CQkweDYwCisjZGVmaW5lCUVJU0FfSVJRXzcJCTB4NzAKKyNkZWZpbmUJRUlTQV9JUlFfOQkJMHg5MAorI2RlZmluZQlFSVNBX0lSUV8xMAkJMHhBMAorI2RlZmluZQlFSVNBX0lSUV8xMQkJMHhCMAorI2RlZmluZQlFSVNBX0lSUV8xMgkJMHhDMAorI2RlZmluZQlFSVNBX0lSUV8xNAkJMHhFMAorI2RlZmluZQlFSVNBX0lSUV8xNQkJMHhGMAorCisjZGVmaW5lCUVJU0FfSU5URVJSVVBUX01BU0sJMHhGMAorI2RlZmluZQlFSVNBX0NPTlRST0xfTUFTSwkweDBGCisKKyNkZWZpbmUJUklPX0VJU0FfREVGQVVMVF9NT0RFCUVJU0FfVFBfU0xPV19MSU5LUworCisjZGVmaW5lCVJJT0Vpc2FUb0l2ZWMoWCkJKHVjaGFyICkoKHVjaGFyKSgoWCkgJiBFSVNBX0lOVEVSUlVQVF9NQVNLKT4+NCkKKworI2RlZmluZQlJTkJaKHoseCkJaW5iKCgoeik8PDEyKSB8ICh4KSkKKyNkZWZpbmUJT1VUQlooeix4LHkpCW91dGIoKCgoeik8PDEyKSB8ICh4KSksIHkpCisKKyNlbmRpZiAvKiBfX3Jpb19laXNhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9lbmFibGUuaCBiL2RyaXZlcnMvY2hhci9yaW8vZW5hYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5YTQxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2VuYWJsZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICBFIE4gQSBCIEwgRSAgIEggRSBBIEQgRSBSIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX2VuYWJsZV9oX3NjY3MgPSAiQCgjKWVuYWJsZS5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworCisjZGVmaW5lIEVOQUJMRV9MVFQgIFRSVUUKKyNkZWZpbmUgRU5BQkxFX0xSVCAgVFJVRQorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Vycm9yLmggYi9kcml2ZXJzL2NoYXIvcmlvL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5NDM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZXJyb3IuaApAQCAtMCwwICsxLDg1IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgIEUgUiBSIE8gUiAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICpfcmlvX2Vycm9yX2hfc2NjcyA9ICJAKCMpZXJyb3IuaAkxLjMiOyAqLworI2VuZGlmCisKKyNkZWZpbmUgRV9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDApCisjZGVmaW5lIEVfUFJPQ0VTU19OT1RfSU5JVCAgICAgICAgICAgICAgICgodXNob3J0KSAxKQorI2RlZmluZSBFX0xJTktfVElNRU9VVCAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMikKKyNkZWZpbmUgRV9OT19ST1VURSAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDMpCisjZGVmaW5lIEVfQ09ORlVTRUQgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSA0KQorI2RlZmluZSBFX0hPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgNSkKKyNkZWZpbmUgRV9DU1VNX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDYpCisjZGVmaW5lIEVfRElTQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICgodXNob3J0KSA3KQorI2RlZmluZSBFX0JBRF9SVVAgICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgOCkKKyNkZWZpbmUgRV9OT19WSVJHSU4gICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDkpCisjZGVmaW5lIEVfQk9PVF9SVVBfQlVTWSAgICAgICAgICAgICAgICAgICgodXNob3J0KSAxMCkKKworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIFBhcnNlZCB0byBtZW1faGFsdCgpCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRV9DSEFOQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODApCisjZGVmaW5lIEVfUE9MTF9BTExPQyAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDgxKQorI2RlZmluZSBFX0xUVFdBS0UgICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4MikKKyNkZWZpbmUgRV9MVFRfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODMpCisjZGVmaW5lIEVfTFJUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDg0KQorI2RlZmluZSBFX0NJUlJVUyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4NSkKKyNkZWZpbmUgRV9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODYpCisjZGVmaW5lIEVfUEhCX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDg3KQorI2RlZmluZSBFX0FSUkFZX0FMTE9DICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4OCkKKyNkZWZpbmUgRV9RQlVGX0FMTE9DICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODkpCisjZGVmaW5lIEVfUEtUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDhhKQorI2RlZmluZSBFX0dFVF9UWF9RX0JVRiAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4YikKKyNkZWZpbmUgRV9HRVRfUlhfUV9CVUYgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OGMpCisjZGVmaW5lIEVfTUVNX09VVCAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDhkKQorI2RlZmluZSBFX01NVV9JTklUICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4ZSkKKyNkZWZpbmUgRV9MVFRfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OGYpCisjZGVmaW5lIEVfTFJUX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDkwKQorI2RlZmluZSBFX0xJTktfUlVOICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg5MSkKKyNkZWZpbmUgRV9NT05JVE9SX0FMTE9DICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OTIpCisjZGVmaW5lIEVfTU9OSVRPUl9JTklUICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDkzKQorI2RlZmluZSBFX1BPTExfSU5JVCAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg5NCkKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oIGIvZHJpdmVycy9jaGFyL3Jpby9lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTIwYjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9lcnJvcnMuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogZXJyb3JzLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEwCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIyllcnJvcnMuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZglfX3Jpb19lcnJvcnNfaF9fCisjZGVmaW5lCV9fcmlvX2Vycm9yc19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfZXJyb3JzX2hfc2Njc18gPSAiQCgjKWVycm9ycy5oCTEuMiI7CisjZW5kaWYKKyNlbmRpZgorCisvKgorKiogZXJyb3IgY29kZXMKKyovCisKKyNkZWZpbmUJTk9USElOR19XUk9OR19BVF9BTEwJCTAKKyNkZWZpbmUJQkFEX0NIQVJBQ1RFUl9JTl9OQU1FCQkxCisjZGVmaW5lCVRBQkxFX0VOVFJZX0lTTlRfUFJPUEVSTFlfTlVMTAkyCisjZGVmaW5lCVVOS05PV05fSE9TVF9OVU1CRVIJCTMKKyNkZWZpbmUJWkVST19SVEFfSUQJCQk0CisjZGVmaW5lCUJBRF9SVEFfSUQJCQk1CisjZGVmaW5lCURVUExJQ0FURURfUlRBX0lECQk2CisjZGVmaW5lCURVUExJQ0FURV9VTklRVUVfTlVNQkVSCQk3CisjZGVmaW5lCUJBRF9UVFlfTlVNQkVSCQkJOAorI2RlZmluZQlUVFlfTlVNQkVSX0lOX1VTRQkJOQorI2RlZmluZQlOQU1FX1VTRURfVFdJQ0UJCQkxMAorI2RlZmluZQlIT1NUX0lEX05PVF9aRVJPCQkxMQorI2RlZmluZQlCT09UX0lOX1BST0dSRVNTCQkxMgorI2RlZmluZQlDT1BZSU5fRkFJTEVECQkJMTMKKyNkZWZpbmUJSE9TVF9GSUxFX1RPT19MQVJHRQkJMTQKKyNkZWZpbmUJQ09QWU9VVF9GQUlMRUQJCQkxNQorI2RlZmluZQlOT1RfU1VQRVJfVVNFUgkJCTE2CisjZGVmaW5lCVJJT19BTFJFQURZX1BPTExJTkcJCTE3CisKKyNkZWZpbmUJSURfTlVNQkVSX09VVF9PRl9SQU5HRQkJMTgKKyNkZWZpbmUgUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFCTE5CisjZGVmaW5lCUhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRQkyMAorI2RlZmluZQlSVVBfTlVNQkVSX09VVF9PRl9SQU5HRQkJMjEKKyNkZWZpbmUJVFRZX05VTUJFUl9PVVRfT0ZfUkFOR0UJCTIyCisjZGVmaW5lCUxJTktfTlVNQkVSX09VVF9PRl9SQU5HRQkyMworCisjZGVmaW5lCUhPU1RfTk9UX1JVTk5JTkcJCTI0CisjZGVmaW5lCUlPQ1RMX0NPTU1BTkRfVU5LTk9XTgkJMjUKKyNkZWZpbmUJUklPX1NZU1RFTV9IQUxURUQJCTI2CisjZGVmaW5lCVdBSVRfRk9SX0RSQUlOX0JST0tFTgkJMjcKKyNkZWZpbmUJUE9SVF9OT1RfTUFQUEVEX0lOVE9fU1lTVEVNCTI4CisjZGVmaW5lCUVYQ0xVU0lWRV9VU0VfU0VUCQkyOQorI2RlZmluZQlXQUlUX0ZPUl9OT1RfQ0xPU0lOR19CUk9LRU4JMzAKKyNkZWZpbmUJV0FJVF9GT1JfUE9SVF9UT19PUEVOX0JST0tFTgkzMQorI2RlZmluZQlXQUlUX0ZPUl9DQVJSSUVSX0JST0tFTgkJMzIKKyNkZWZpbmUJV0FJVF9GT1JfTk9UX0lOX1VTRV9CUk9LRU4JMzMKKyNkZWZpbmUJV0FJVF9GT1JfQ0FOX0FERF9DT01NQU5EX0JST0tFTgkzNAorI2RlZmluZQlXQUlUX0ZPUl9BRERfQ09NTUFORF9CUk9LRU4JMzUKKyNkZWZpbmUJV0FJVF9GT1JfTk9UX1BBUkFNX0JST0tFTgkzNgorI2RlZmluZQlXQUlUX0ZPUl9SRVRSWV9CUk9LRU4JCTM3CisjZGVmaW5lCUhPU1RfSEFTX0FMUkVBRFlfQkVFTl9CT09URUQJMzgKKyNkZWZpbmUJVU5JVF9JU19JTl9VU0UJCQkzOQorI2RlZmluZQlDT1VMRE5UX0ZJTkRfRU5UUlkJCTQwCisjZGVmaW5lCVJUQV9VTklRVUVfTlVNQkVSX1pFUk8JCTQxCisjZGVmaW5lCUNMT1NFX0NPTU1BTkRfRkFJTEVECQk0MgorI2RlZmluZQlXQUlUX0ZPUl9DTE9TRV9CUk9LRU4JCTQzCisjZGVmaW5lCUNQU19WQUxVRV9PVVRfT0ZfUkFOR0UJCTQ0CisjZGVmaW5lCUlEX0FMUkVBRFlfSU5fVVNFCQk0NQorI2RlZmluZQlTSUdOQUxTX0FMUkVBRFlfU0VUCQk0NgorI2RlZmluZQlOT1RfUkVDRUlWSU5HX1BST0NFU1MJCTQ3CisjZGVmaW5lCVJUQV9OVU1CRVJfV1JPTkcJCTQ4CisjZGVmaW5lIE5PX1NVQ0hfUFJPRFVDVAkJCTQ5CisjZGVmaW5lCUhPU1RfU1lTUE9SVF9CQUQJCTUwCisjZGVmaW5lCUlEX05PVF9URU5UQVRJVkUJCTUxCisjZGVmaW5lIFhQUklOVF9DUFNfT1VUX09GX1JBTkdFCQk1MgorI2RlZmluZQlOT1RfRU5PVUdIX0NPUkVfRk9SX1BDSV9DT1BZCTUzCisKKworI2VuZGlmIC8qIF9fcmlvX2Vycm9yc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZm9ybXBrdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9mb3JtcGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiNjVhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZm9ybXBrdC5oCkBAIC0wLDAgKzEsMTU0IEBACisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgIEYgTyBSIE0gICBQIEEgQyBLIEUgVCAgIEggRSBBIEQgRSBSICAgRiBJIEwgRQorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfZm9ybXBrdF9oCisjZGVmaW5lIF9mb3JtcGt0X2ggMQorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19mb3JtcGt0X2hfc2NjcyA9ICJAKCMpZm9ybXBrdC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9CT09UX1BLVF8xIEZPUk1fQk9PVF9QS1RfMSA7CitzdHJ1Y3QgRk9STV9CT09UX1BLVF8xIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBwa3RfbnVtYmVyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBwa3RfdG90YWwgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGJvb3RfdG9wIDsKKyAgICAgICAgICAgICAgICAgICAgICAgfSA7CisKK3R5cGVkZWYgc3RydWN0IEZPUk1fQk9PVF9QS1RfMiBGT1JNX0JPT1RfUEtUXzIgOworc3RydWN0IEZPUk1fQk9PVF9QS1RfMiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgcGt0X251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgYm9vdF9kYXRhWzEwXSA7CisgICAgICAgICAgICAgICAgICAgICAgIH0gOworCisKK3R5cGVkZWYgc3RydWN0IEZPUk1fQVRUQUNIX1JUQSAgIEZPUk1fQVRUQUNIX1JUQSA7CitzdHJ1Y3QgRk9STV9BVFRBQ0hfUlRBICB7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3Rlcl9zZXJpYWxbNF0gOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3Rlcl9saW5rIDsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfc2VyaWFsWzRdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfbGluayA7CisgICAgICAgICAgICAgICAgICAgfSA7CisKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9CT09UX0lEICAgRk9STV9CT09UX0lEIDsKK3N0cnVjdCBGT1JNX0JPT1RfSUQgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVlX3NlcmlhbFs0XSA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVlX3Byb2RfaWQgOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9saW5rIDsKKyAgICAgICAgICAgICAgICAgICB9IDsKKworCisKK3R5cGVkZWYgc3RydWN0IEZPUk1fUk9VVEVfMSAgIEZPUk1fUk9VVEVfMSA7CitzdHJ1Y3QgRk9STV9ST1VURV8xIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgIHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgdG90YWxfaW5fc2VxdWVuY2UgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgdW5pdF9pZCA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICBob3N0X3VuaXRfaWQgOworICAgICAgICAgICAgICAgICAgICB9IDsKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9ST1VURV8yICAgRk9STV9ST1VURV8yIDsKK3N0cnVjdCBGT1JNX1JPVVRFXzIgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBwa3RfbnVtYmVyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICB0b3RhbF9pbl9zZXF1ZW5jZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcm91dGVfZGF0YVs5XSA7CisgICAgICAgICAgICAgICAgICAgIH0gOworCit0eXBlZGVmIHN0cnVjdCBGT1JNX1JPVVRFX1JFUSAgIEZPUk1fUk9VVEVfUkVRIDsKK3N0cnVjdCBGT1JNX1JPVVRFX1JFUSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBwa3RfbnVtYmVyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHRvdGFsX2luX3NlcXVlbmNlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHJvdXRlX2RhdGFbMTBdIDsKKyAgICAgICAgICAgICAgICAgICAgICB9IDsKKworCit0eXBlZGVmIHN0cnVjdCBGT1JNX0VSUk9SICAgRk9STV9FUlJPUiA7CitzdHJ1Y3QgRk9STV9FUlJPUiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGVycm9yX2NvZGUgOworCisgICAgICAgICAgICAgICAgICAgIH0gOworCit0eXBlZGVmIHN0cnVjdCBGT1JNX1NUQVRVUyAgIEZPUk1fU1RBVFVTIDsKK3N0cnVjdCBGT1JNX1NUQVRVUyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHN0YXR1c19jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBsYXN0X3BhY2tldF92YWxpZCA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgdHhfYnVmZmVyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICByeF9idWZmZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBvcnRfc3RhdHVzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBwaGJfc3RhdHVzIDsKKyAgICAgICAgICAgICAgICAgICAgfSA7CisKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9MSU5LX1NUQVRVUyAgIEZPUk1fTElOS19TVEFUVVMgOworc3RydWN0IEZPUk1fTElOS19TVEFUVVMgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHN0YXR1c19jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgbGlua19udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0ICByeF9lcnJvcnMgOworICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0ICB0eF9lcnJvcnMgOworICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0ICBjc3VtX2Vycm9ycyA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIGRpc2Nvbm5lY3RzIDsKKyAgICAgICAgICAgICAgICAgICAgfSA7CisKKworCit0eXBlZGVmIHN0cnVjdCBGT1JNX1BBUlRJVElPTiBGT1JNX1BBUlRJVElPTiA7CitzdHJ1Y3QgRk9STV9QQVJUSVRJT04geworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHN0YXR1c19jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgcG9ydF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICB0eF9tYXggOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICByeF9tYXggOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICByeF9saW1pdCA7CisgICAgICAgICAgICAgICAgICAgICAgfSA7CisKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9mdW5jLmggYi9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGYzODYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9mdW5jLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IGZ1bmMuaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTAKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWZ1bmMuaAkxLjMKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX2Z1bmNfaF9kZWYKKyNkZWZpbmUgX19mdW5jX2hfZGVmCisKKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfZnVuY19oX3NjY3NfID0gIkAoIylmdW5jLmgJMS4zIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qIHJpb2Jvb3QuYyAqLworaW50IFJJT0Jvb3RDb2RlUlRBKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgRG93bkxvYWQgKik7CitpbnQgUklPQm9vdENvZGVIT1NUKHN0cnVjdCByaW9faW5mbyAqLCByZWdpc3RlciBzdHJ1Y3QgRG93bkxvYWQgKik7CitpbnQgUklPQm9vdENvZGVVTktOT1dOKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgRG93bkxvYWQgKik7Cit2b2lkIG1zZWNfdGltZW91dChzdHJ1Y3QgSG9zdCAqKTsKK2ludCBSSU9Cb290UnVwKHN0cnVjdCByaW9faW5mbyAqLCB1aW50LCBzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgUEtUICopOworaW50IFJJT0Jvb3RPayhzdHJ1Y3QgcmlvX2luZm8gKixzdHJ1Y3QgSG9zdCAqLCB1bG9uZyk7CitpbnQgUklPUnRhQm91bmQoc3RydWN0IHJpb19pbmZvICosIHVpbnQpOyAKK3ZvaWQgRmlsbFNsb3QoaW50LCBpbnQsIHVpbnQsIHN0cnVjdCBIb3N0ICopOworCisvKiByaW9jbWQuYyAqLworaW50IFJJT0ZvYWRSdGEoc3RydWN0IEhvc3QgKiwgc3RydWN0IE1hcCAqKTsKK2ludCBSSU9ab21iaWVSdGEoc3RydWN0IEhvc3QgKiwgc3RydWN0IE1hcCAqKTsKK2ludCBSSU9Db21tYW5kUnRhKHN0cnVjdCByaW9faW5mbyAqLCB1aW50LCBpbnQgKCogZnVuYykoIHN0cnVjdCBIb3N0ICosIAorCQkJCQkJCQlzdHJ1Y3QgTWFwICopKTsKK2ludCBSSU9JZGVudGlmeVJ0YShzdHJ1Y3QgcmlvX2luZm8gKiwgY2FkZHJfdCk7IAoraW50IFJJT0tpbGxOZWlnaGJvdXIoc3RydWN0IHJpb19pbmZvICosIGNhZGRyX3QpOworaW50IFJJT1N1c3BlbmRCb290UnRhKHN0cnVjdCBIb3N0ICosIGludCwgaW50KTsKK2ludCBSSU9Gb2FkV2FrZXVwKHN0cnVjdCByaW9faW5mbyAqKTsKK3N0cnVjdCBDbWRCbGsgKiBSSU9HZXRDbWRCbGsodm9pZCk7Cit2b2lkIFJJT0ZyZWVDbWRCbGsoc3RydWN0IENtZEJsayAqKTsKK2ludCBSSU9RdWV1ZUNtZEJsayhzdHJ1Y3QgSG9zdCAqLCB1aW50LCBzdHJ1Y3QgQ21kQmxrICopOwordm9pZCBSSU9Qb2xsSG9zdENvbW1hbmRzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqKTsKK2ludCBSSU9XRmx1c2hNYXJrKGludCwgc3RydWN0IENtZEJsayAqKTsKK2ludCBSSU9SRmx1c2hFbmFibGUoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworaW50IFJJT1VuVXNlKGludCwgc3RydWN0IENtZEJsayAqKTsKK3ZvaWQgU2hvd1BhY2tldCh1aW50LCBzdHJ1Y3QgUEtUICopOworCisvKiByaW9jdHJsLmMgKi8KK2ludCBjb3B5aW4oaW50LCBjYWRkcl90LCBpbnQpOworaW50IHJpb2NvbnRyb2woc3RydWN0IHJpb19pbmZvICosIGRldl90LGludCxjYWRkcl90LGludCk7IAoraW50IFJJT1ByZWVtcHRpdmVDbWQoc3RydWN0IHJpb19pbmZvICosc3RydWN0IFBvcnQgKix1Y2hhcik7CisKKy8qIHJpb2luaXQuYyAqLwordm9pZCByaW9pbml0KHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgUmlvSG9zdEluZm8gKik7Cit2b2lkIFJJT0luaXRIb3N0cyhzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IFJpb0hvc3RJbmZvICopOwordm9pZCBSSU9JU0Fpbml0KHN0cnVjdCByaW9faW5mbyAqLGludCk7CitpbnQgUklPRG9BVChzdHJ1Y3QgcmlvX2luZm8gKiwgaW50LCBpbnQpOworY2FkZHJfdCBSSU9DaGVja0ZvckFUQ2FyZChpbnQpOworaW50IFJJT0Fzc2lnbkFUKHN0cnVjdCByaW9faW5mbyAqLCBpbnQsIGNhZGRyX3QsIGludCk7CitpbnQgUklPQm9hcmRUZXN0KHBhZGRyX3QsIGNhZGRyX3QsIHVjaGFyLCBpbnQpOwordm9pZCBSSU9BbGxvY0RhdGFTdHJ1Y3RzKHN0cnVjdCByaW9faW5mbyAqKTsKK3ZvaWQgUklPU2V0dXBEYXRhU3RydWN0cyhzdHJ1Y3QgcmlvX2luZm8gKik7CitpbnQgUklPRGVmYXVsdE5hbWUoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICosIHVpbnQpOworc3RydWN0IHJpb1ZlcnNpb24gKiBSSU9WZXJzaWQodm9pZCk7CitpbnQgUklPTWFwaW4ocGFkZHJfdCwgaW50LCBjYWRkcl90ICopOwordm9pZCBSSU9NYXBvdXQocGFkZHJfdCwgbG9uZywgY2FkZHJfdCk7Cit2b2lkIFJJT0hvc3RSZXNldCh1aW50LCB2b2xhdGlsZSBzdHJ1Y3QgRHBSYW0gKiwgdWludCk7CisKKy8qIHJpb2ludHIuYyAqLwordm9pZCBSSU9UeEVuYWJsZShjaGFyICopOwordm9pZCBSSU9TZXJ2aWNlSG9zdChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgaW50KTsKK2ludCByaW90cHJvYyhzdHJ1Y3QgcmlvX2luZm8gKiwgcmVnaXN0ZXIgc3RydWN0IHR0eXN0YXRpY3MgKiwgaW50LCBpbnQpOworCisvKiByaW9wYXJhbS5jICovCitpbnQgUklPUGFyYW0oc3RydWN0IFBvcnQgKiwgaW50LCBpbnQsIGludCk7CitpbnQgUklPRGVsYXkoc3RydWN0IFBvcnQgKlBvcnRQLCBpbnQpOworaW50IFJJT0RlbGF5X25pKHN0cnVjdCBQb3J0ICpQb3J0UCwgaW50KTsKK3ZvaWQgbXNfdGltZW91dChzdHJ1Y3QgUG9ydCAqKTsKK2ludCBjYW5fYWRkX3RyYW5zbWl0KHN0cnVjdCBQS1QgKiosIHN0cnVjdCBQb3J0ICopOwordm9pZCBhZGRfdHJhbnNtaXQoc3RydWN0IFBvcnQgKik7Cit2b2lkIHB1dF9mcmVlX2VuZChzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgUEtUICopOworaW50IGNhbl9yZW1vdmVfcmVjZWl2ZShzdHJ1Y3QgUEtUICoqLCBzdHJ1Y3QgUG9ydCAqKTsKK3ZvaWQgcmVtb3ZlX3JlY2VpdmUoc3RydWN0IFBvcnQgKik7CisKKy8qIHJpb3JvdXRlLmMgKi8KK2ludCBSSU9Sb3V0ZVJ1cChzdHJ1Y3QgcmlvX2luZm8gKiwgdWludCwgc3RydWN0IEhvc3QgKiwgc3RydWN0IFBLVCAqKTsKK3ZvaWQgUklPRml4UGhicyhzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7IAordWludCBHZXRVbml0VHlwZSh1aW50KTsKK2ludCBSSU9TZXRDaGFuZ2Uoc3RydWN0IHJpb19pbmZvICopOworaW50IFJJT0ZpbmRGcmVlSUQoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICosIHVpbnQgKiwgdWludCAqKTsKKworCisvKiByaW90dHkuYyAqLworCitpbnQgcmlvdG9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CitpbnQgcmlvdGNsb3NlKHZvaWQgICpwdHIpOworaW50IHJpb3Rpb2N0bChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IHR0eV9zdHJ1Y3QgKiwgcmVnaXN0ZXIgaW50LCByZWdpc3RlciBjYWRkcl90KTsgCit2b2lkIHR0eXNldGgoc3RydWN0IFBvcnQgKiwgc3RydWN0IHR0eXN0YXRpY3MgKiwgc3RydWN0IG9sZF9zZ3R0eWIgKnNnKTsKKworLyogcmlvdGFibGUuYyAqLworaW50IFJJT05ld1RhYmxlKHN0cnVjdCByaW9faW5mbyAqKTsKK2ludCBSSU9BcGVsKHN0cnVjdCByaW9faW5mbyAqKTsKK2ludCBSSU9EZWxldGVSdGEoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBNYXAgKik7CitpbnQgUklPQXNzaWduUnRhKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgTWFwICopOworaW50IFJJT1JlTWFwUG9ydHMoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICosIHN0cnVjdCBNYXAgKik7CitpbnQgUklPQ2hhbmdlTmFtZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IE1hcCopOworCisjaWYgMAorLyogcmlvZHJ2ci5jICovCitzdHJ1Y3QgcmlvX2luZm8gKiByaW9faW5zdGFsbChzdHJ1Y3QgUmlvSG9zdEluZm8gKik7CitpbnQgcmlvX3VuaW5zdGFsbChyZWdpc3RlciBzdHJ1Y3QgcmlvX2luZm8gKik7CitpbnQgcmlvX29wZW4oc3RydWN0IHJpb19pbmZvICosIGludCwgc3RydWN0IGZpbGUgKik7CitpbnQgcmlvX2Nsb3NlKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqKTsKK2ludCByaW9fcmVhZChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgY2hhciAqLCBpbnQpOworaW50IHJpb193cml0ZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IGZpbGUgKglmLCBjaGFyICosIGludCk7CitpbnQgcmlvX2lvY3RsKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBpbnQsIGNoYXIgKik7CitpbnQgcmlvX3NlbGVjdChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IGZpbGUgKglmLCBpbnQsIHN0cnVjdCBzZWwgKik7CitpbnQJcmlvX2ludHIoY2hhciAqKTsKK2ludCByaW9faXNyX3RocmVhZChjaGFyICAqKTsKK3N0cnVjdCByaW9faW5mbyAqIHJpb19pbmZvX3N0b3JlKCBpbnQgY21kLCBzdHJ1Y3QgcmlvX2luZm8gKiBwKTsKKyNlbmRpZgorCitleHRlcm4gaW50ICAgIHJpb19wY2ljb3B5KGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbik7CitleHRlcm4gaW50IHJpb19taW5vciAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gaW50IHJpb19pc21vZGVtIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHJpb191ZGVsYXkgKGludCB1c2Vjcyk7CisKK2V4dGVybiB2b2lkIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKHN0cnVjdCBIb3N0ICogSG9zdFApOworCisjZW5kaWYJLyogX19mdW5jX2hfZGVmICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2hvc3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjU5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2hvc3QuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogaG9zdC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpaG9zdC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX2hvc3RfaF9fCisjZGVmaW5lIF9fcmlvX2hvc3RfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciAqX2hvc3RfaF9zY2NzXyA9ICJAKCMpaG9zdC5oCTEuMiI7CisjZW5kaWYKKyNlbmRpZgorCisvKgorKiogdGhlIGhvc3Qgc3RydWN0dXJlIC0gb25lIHBlciBob3N0IGNhcmQgaW4gdGhlIHN5c3RlbS4KKyovCisKKyNkZWZpbmUJTUFYX0VYVFJBX1VOSVRTCTY0CisKKy8qCisqKiAgICBIb3N0IGRhdGEgc3RydWN0dXJlLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBzb2Z0d2FyZSBlcXVpdi4gb2YKKyoqICAgIHRoZSBob3N0LgorKi8KK3N0cnVjdCAgICBIb3N0Cit7CisgICAgdWNoYXIgICAgICAgICAgICAgCSAgICBUeXBlOyAgICAgIC8qIFJJT19FSVNBLCBSSU9fTUNBLCAuLi4gKi8KKyAgICB1Y2hhciAgICAgICAgICAgICAJICAgIEl2ZWM7ICAgICAgLyogUE9MTEVEIG9yIGl2ZWMgbnVtYmVyICovCisgICAgdWNoYXIgICAgICAgICAgICAgCSAgICBNb2RlOyAgICAgIC8qIENvbnRyb2wgc3R1ZmYgKi8KKyAgICB1Y2hhciAgICAgICAgICAgICAgICAgICBTbG90OyAgICAgIC8qIFNsb3QgKi8KKyAgICB2b2xhdGlsZSBjYWRkcl90ICAgICAgICBDYWRkcjsgICAgIC8qIEtWIGFkZHJlc3Mgb2YgRFBSQU0gKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3QgRHBSYW0gICpDYXJkUDsgICAgIC8qIEtWIGFkZHJlc3Mgb2YgRFBSQU0sIHdpdGggb3ZlcmxheSAqLworICAgIHBhZGRyX3QgICAgICAgICAgCSAgICBQYWRkclA7ICAgIC8qIFBoeXMuIGFkZHJlc3Mgb2YgRFBSQU0gKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICBOYW1lW01BWF9OQU1FX0xFTl07ICAvKiBUaGUgbmFtZSBvZiB0aGUgaG9zdCAqLworICAgIHVpbnQgICAgICAgICAgICAJICAgIFVuaXF1ZU51bTsgLyogaG9zdCB1bmlxdWUgbnVtYmVyICovCisgICAgc3BpbmxvY2tfdAkgICAgICAgICAgICBIb3N0TG9jazsgIC8qIExvY2sgc3RydWN0dXJlIGZvciBNUFggKi8KKyAgICAvKnN0cnVjdCBwY2lfZGV2aW5mbyAgICBQY2lEZXZJbmZvOyAqLy8qIFBDSSBCdXMvRGV2aWNlL0Z1bmN0aW9uIHN0dWZmICovCisgICAgLypzdHJ1Y3QgbG9ja2IJICAgIEhvc3RMb2NrOyAgKi8vKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCisgICAgdWludCAgICAgICAgICAgICAgICAgICAgV29ya1RvQmVEb25lOyAvKiBzZXQgdG8gdHJ1ZSBlYWNoIGludGVycnVwdCAqLworICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIEluSW50cjsgICAgLyogQmVpbmcgc2VydmljZWQ/ICovCisgICAgdWludCAgICAgICAgICAgICAgICAgICAgSW50U3J2RG9uZTsvKiBob3N0J3MgaW50ZXJydXB0IGhhcyBiZWVuIHNlcnZpY2VkICovCisgICAgaW50CQkJICAgICgqQ29weSkoIGNhZGRyX3QsIGNhZGRyX3QsIGludCApOyAvKiBjb3B5IGZ1bmMgKi8KKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICAvKgorICAgICoqICAgICAgICAgICAgICAgSSBNIFAgTyBSIFQgQSBOIFQgIQorICAgICoqCisgICAgKiogVGhlIHJlc3Qgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBjbGVhcmVkIHRvIHplcm8gYWZ0ZXIKKyAgICAqKiBhIFJJT19IT1NUX0ZPQUQgY29tbWFuZC4KKyAgICAqLworICAgIAorICAgIHVsb25nICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgLyogV2hhdHMgZ29pbmcgZG93biAqLworI2RlZmluZSBSQ19XQUlUSU5HICAgICAgICAgICAgMAorI2RlZmluZSBSQ19TVEFSVFVQICAgICAgICAgICAgMQorI2RlZmluZSBSQ19SVU5OSU5HICAgICAgICAgICAgMgorI2RlZmluZSBSQ19TVFVGRkVEICAgICAgICAgICAgMworI2RlZmluZSBSQ19TT01FVEhJTkcgICAgICAgICAgNAorI2RlZmluZSBSQ19TT01FVEhJTkdfTkVXICAgICAgNQorI2RlZmluZSBSQ19TT01FVEhJTkdfRUxTRSAgICAgNgorI2RlZmluZSBSQ19SRUFEWSAgICAgICAgICAgICAgNworI2RlZmluZSBSVU5fU1RBVEUgICAgICAgICAgICAgNworLyoKKyoqIEJvb3QgbW9kZSBhcHBsaWVzIHRvIHRoZSB3YXkgaW4gd2hpY2ggaG9zdHMgaW4gdGhpcyBzeXN0ZW0gd2lsbAorKiogYm9vdCBSVEFzCisqLworI2RlZmluZSBSQ19CT09UX0FMTCAgICAgICAgICAgMHg4CS8qIEJvb3QgYWxsIFJUQXMgYXR0YWNoZWQgKi8KKyNkZWZpbmUgUkNfQk9PVF9PV04gICAgICAgICAgIDB4MTAJLyogT25seSBib290IFJUQXMgYm91bmQgdG8gdGhpcyBzeXN0ZW0gKi8KKyNkZWZpbmUgUkNfQk9PVF9OT05FICAgICAgICAgIDB4MjAJLyogRG9uJ3QgYm9vdCBhbnkgUlRBcyAoc2xhdmUgbW9kZSkgKi8KKworICAgIHN0cnVjdCBUb3AJCSAgICBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07IC8qIG9uZSBwZXIgbGluayAqLworICAgIHN0cnVjdCBNYXAgICAgICAgICAgICAgIE1hcHBpbmdbTUFYX1JVUF07ICAgICAvKiBNYXBwaW5ncyBmb3IgaG9zdCAqLworICAgIHN0cnVjdCBQSEIJCSAgICAqUGhiUDsgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgUEhCIGFycmF5ICovCisgICAgdXNob3J0ICAgICAgICAgICAJICAgICpQaGJOdW1QOyAgICAgICAgICAgICAvKiBQdHIgdG8gTnVtYmVyIG9mIFBIQidzICovCisgICAgc3RydWN0IExQQiAJICAgICAgICAgICAgKkxpbmtTdHJQIDsgICAgICAgICAgIC8qIExpbmsgU3RydWN0dXJlIEFycmF5ICovCisgICAgc3RydWN0IFJVUCAgICAgICAJICAgICpSdXBQOyAgICAgICAgICAgICAgICAvKiBTaXh0ZWVuIHJlYWwgcnVwcyBoZXJlICovCisgICAgc3RydWN0IFBBUk1fTUFQICAJICAgICpQYXJtTWFwUDsgICAgICAgICAgICAvKiBwb2ludHMgdG8gdGhlIHBhcm1tYXAgKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBFeHRyYVVuaXRzW01BWF9FWFRSQV9VTklUU107IC8qIHVua25vd24gdGhpbmdzICovCisgICAgdWludCAgICAgICAgICAgICAgICAgICAgTnVtRXh0cmFCb290ZWQ7ICAgICAgIC8qIGhvdyBtYW55IG9mIHRoZSBhYm92ZSAqLworICAgIC8qCisgICAgKiogVHdlbnR5IGxvZ2ljYWwgcnVwcy4KKyAgICAqKiBUaGUgZmlyc3Qgc2l4dGVlbiBhcmUgdGhlIHJlYWwgUnVwIGVudHJpZXMgKGFib3ZlKSwgdGhlIGxhc3QgZm91cgorICAgICoqIGFyZSB0aGUgbGluayBSVVBzLgorICAgICovCisgICAgc3RydWN0IFVuaXhSdXAJICAgIFVuaXhSdXBzW01BWF9SVVArTElOS1NfUEVSX1VOSVRdOworCWludAkJCQl0aW1lb3V0X2lkOwkvKiBGb3IgY2FsbGluZyAxMDAgbXMgZGVsYXlzICovCisJaW50CQkJCXRpbWVvdXRfc2VtOy8qIEZvciBjYWxsaW5nIDEwMCBtcyBkZWxheXMgKi8KKyAgICBsb25nIGxvY2tzOyAvKiBsb25nIHJlcSdkIGZvciBzZXRfYml0IC0tUlIgKi8KKyAgICBjaGFyICAgICAgICAgICAgIAkgICAgX19fX2VuZF9tYXJrZXJfX19fOworfTsKKyNkZWZpbmUgQ29udHJvbCAgICAgIENhcmRQLT5EcENvbnRyb2wKKyNkZWZpbmUgU2V0SW50ICAgICAgIENhcmRQLT5EcFNldEludAorI2RlZmluZSBSZXNldFRwdSAgICAgQ2FyZFAtPkRwUmVzZXRUcHUKKyNkZWZpbmUgUmVzZXRJbnQgICAgIENhcmRQLT5EcFJlc2V0SW50CisjZGVmaW5lIFNpZ25hdHVyZSAgICBDYXJkUC0+RHBTaWduYXR1cmUKKyNkZWZpbmUgU3JhbTEgICAgICAgIENhcmRQLT5EcFNyYW0xCisjZGVmaW5lIFNyYW0yICAgICAgICBDYXJkUC0+RHBTcmFtMgorI2RlZmluZSBTcmFtMyAgICAgICAgQ2FyZFAtPkRwU3JhbTMKKyNkZWZpbmUgU2NyYXRjaCAgICAgIENhcmRQLT5EcFNjcmF0Y2gKKyNkZWZpbmUgX19QYXJtTWFwUiAgIENhcmRQLT5EcFBhcm1NYXBSCisjZGVmaW5lIFNMWCAgICAgICAgICBDYXJkUC0+RHBTbHgKKyNkZWZpbmUgUmV2aXNpb24gICAgIENhcmRQLT5EcFJldmlzaW9uCisjZGVmaW5lIFVuaXF1ZSAgICAgICBDYXJkUC0+RHBVbmlxdWUKKyNkZWZpbmUgWWVhciAgICAgICAgIENhcmRQLT5EcFllYXIKKyNkZWZpbmUgV2VlayAgICAgICAgIENhcmRQLT5EcFdlZWsKKworI2RlZmluZSBSSU9fRFVNQlBBUk0gMHgwODYwICAgIC8qIHdoYXQgbm90IHRvIGV4cGVjdCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vaG9zdGh3LmggYi9kcml2ZXJzL2NoYXIvcmlvL2hvc3Rody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjMxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2hvc3Rody5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgSCBPIFMgVCAgICAgIEggQSBSIEQgVyBBIFIgRQorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9faG9zdGh3X2hfc2NjcyA9ICJAKCMpaG9zdGh3LmgJMS4yIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFNFVF9PVEhFUl9JTlRFUlJVUFQgICggKHZvbGF0aWxlIHVfc2hvcnQgKikgMHg3YzgwICkKKyNkZWZpbmUgU0VUX0VJU0FfSU5URVJSVVBUICAoICh2b2xhdGlsZSB1X3Nob3J0ICopIDB4N2VmMCApCisKKyNkZWZpbmUgRUlTQV9IT1NUICAgIDB4MzAKKyNkZWZpbmUgQVRfSE9TVCAgICAgIDB4YTAKKyNkZWZpbmUgTUNBX0hPU1QgICAgIDB4YjAKKyNkZWZpbmUgUENJX0hPU1QgICAgIDB4ZDAKKworI2RlZmluZSBQUk9EVUNUX01BU0sgMHhmMAorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2xpbmsuaCBiL2RyaXZlcnMvY2hhci9yaW8vbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MjI1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xpbmsuaApAQCAtMCwwICsxLDE4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICBMIEkgTiBLCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9saW5rX2gKKyNkZWZpbmUgX2xpbmtfaCAxCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCisvKiBzdGF0aWMgY2hhciAqX3Jpb19saW5rX2hfc2NjcyA9ICJAKCMpbGluay5oCTEuMTUiOyAqLworI2VuZGlmCisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmUgdGhlIExpbmsgU3RhdHVzIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMUlRfQUNUSVZFICAgICAgICAgKCh1c2hvcnQpIDB4MDEpCisjZGVmaW5lIExSVF9TUEFSRTEgICAgICAgICAoKHVzaG9ydCkgMHgwMikKKyNkZWZpbmUgSU5UUk9fUkNWRCAgICAgICAgICgodXNob3J0KSAweDA0KQorI2RlZmluZSBGT1JDRURfRElTQ09OTkVDVCAgKCh1c2hvcnQpIDB4MDgpCisjZGVmaW5lIExSVF9TUEFSRTIJICAgKCh1c2hvcnQpIDB4ODApCisKKyNkZWZpbmUgVE9QX09GX1JUQV9SQU0gICAgICgodXNob3J0KSAweDcwMDApCisjZGVmaW5lIEhPU1RfU0VSSUFMX1BPSU5URVIgKHVuc2lnbmVkIGNoYXIgKiopIChUT1BfT0ZfUlRBX1JBTSAtIDIgKiBzaXplb2YgKHVzaG9ydCkpCisKKy8qIEZsYWdzIGZvciBsdHRfc3RhdHVzICovCisjZGVmaW5lICBXQUlUSU5HX0FDSwkJKHVzaG9ydCkgMHgwMDAxCisjZGVmaW5lICBEQVRBX1NFTlQJCSh1c2hvcnQpIDB4MDAwMgorI2RlZmluZSAgV0FJVElOR19SVVAJCSh1c2hvcnQpIDB4MDAwNAorI2RlZmluZSAgV0FJVElOR19SRVRSWQkJKHVzaG9ydCkgMHgwMDA4CisjZGVmaW5lICBXQUlUSU5HX1RPUE9MT0dZCSh1c2hvcnQpIDB4MDAxMAorI2RlZmluZSAgU0VORF9TWU5DCQkodXNob3J0KSAweDAwMjAKKyNkZWZpbmUgIEZPQURfVEhJU19MSU5LCQkodXNob3J0KSAweDAwNDAKKyNkZWZpbmUgIFJFUVVFU1RfU1lOQwkJKHVzaG9ydCkgMHgwMDgwCisjZGVmaW5lICBSRU1PVEVfRFlJTkcJCSh1c2hvcnQpIDB4MDEwMAorI2RlZmluZSAgRElFX05PVwkJKHVzaG9ydCkgMHgwMjAwCisKKy8qIEJvb3QgcmVxdWVzdCBzdHVmZiAqLworI2RlZmluZSBCT09UX1JFUVVFU1QgICAgICAgKCh1c2hvcnQpIDApICAgIC8qIFJlcXVlc3QgZm9yIGEgYm9vdCAqLworI2RlZmluZSBCT09UX0FCT1JUICAgICAgICAgKCh1c2hvcnQpIDEpICAgIC8qIEFib3J0IGEgYm9vdCAqLworI2RlZmluZSBCT09UX1NFUVVFTkNFICAgICAgKCh1c2hvcnQpIDIpICAgIC8qIFBhY2tldCB3aXRoIHRoZSBudW1iZXIgb2YgcGFja2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQk9PVF9DT01QTEVURUQgICAgICgodXNob3J0KSAzKSAgICAvKiBCb290IGNvbXBsZXRlZCAqLworCisvKiBTdGF0ZXMgdGhhdCBhIGxpbmsgY2FuIGJlIGluICovCisjZGVmaW5lCUxJTktfRElTQ09OTkVDVEVEICAoKHVzaG9ydCkgMCkgICAgLyogRGlzY29ubmVjdGVkICovCisjZGVmaW5lIExJTktfQk9PVDEgICAgICAgICAoKHVzaG9ydCkgMSkgICAgLyogVHJ5aW5nIHRvIHNlbmQgMXN0IHN0YWdlIGJvb3QgKi8KKyNkZWZpbmUgTElOS19CT09UMiAgICAgICAgICgodXNob3J0KSAyKSAgICAvKiBUcnlpbmcgdG8gc2VuZCAybmQgc3RhZ2UgYm9vdCAqLworI2RlZmluZSBMSU5LX0JPT1QyV0FJVCAgICAgKCh1c2hvcnQpIDMpICAgIC8qIFdhaXRpbmcgZm9yIHNlbGZ0ZXN0IHJlc3VsdHMgKi8KKyNkZWZpbmUgTElOS19CT09UMyAgICAgICAgICgodXNob3J0KSA0KSAgICAvKiBUcnlpbmcgdG8gc2VuZCAzcmQgc3RhZ2UgYm9vdHMgKi8KKyNkZWZpbmUgTElOS19TWU5DICAgICAgICAgICgodXNob3J0KSA1KSAgICAvKiBTeW5jaW5nICovCisKKyNkZWZpbmUgTElOS19JTlRSTyAgICAgICAgICgodXNob3J0KSAxMCkgICAgLyogSW50cm9kdWN0b3J5IHBhY2tldCAqLworI2RlZmluZSBMSU5LX1NVUFBMWUlEICAgICAgKCh1c2hvcnQpIDExKSAgICAvKiBUcnlpbmcgdG8gc3VwcGx5IGFuIElEICovCisjZGVmaW5lIExJTktfVE9QT0xPR1kgICAgICAoKHVzaG9ydCkgMTIpICAgIC8qIFNlbmQgYSB0b3BvbG9neSB1cGRhdGUgKi8KKyNkZWZpbmUgTElOS19SRVFVRVNUSUQgICAgICgodXNob3J0KSAxMykgICAgLyogV2FpdGluZyBmb3IgYW4gSUQgKi8KKyNkZWZpbmUgTElOS19DT05ORUNURUQgICAgICgodXNob3J0KSAxNCkgICAgLyogQ29ubmVjdGVkICovCisKKyNkZWZpbmUgTElOS19JTlRFUkNPTk5FQ1QgICgodXNob3J0KSAyMCkgICAvKiBTdWJuZXRzIGludGVyY29ubmVjdGVkICovCisKKyNkZWZpbmUgTElOS19TUEFSRQkgICAoKHVzaG9ydCkgNDApCisKKy8qCisqKiBTZXQgdGhlIGRlZmF1bHQgdGltZW91dCBmb3IgbGluayBjb21tdW5pY2F0aW9ucy4KKyovCisjZGVmaW5lCUxJTktUSU1FT1VUCQkoNDAwICogTUlMTElTRUNPTkQpCisKKy8qCisqKiBMRUQgc3R1ZmYKKyovCisjaWYgZGVmaW5lZChSVEEpCisjZGVmaW5lIExFRF9PRkYgICAgICAgICAgICAoKHVzaG9ydCkgMCkgICAgLyogTEVEIG9mZiAqLworI2RlZmluZSBMRURfUkVEICAgICAgICAgICAgKCh1c2hvcnQpIDEpICAgIC8qIExFRCBSZWQgKi8KKyNkZWZpbmUgTEVEX0dSRUVOICAgICAgICAgICgodXNob3J0KSAyKSAgICAvKiBMRUQgR3JlZW4gKi8KKyNkZWZpbmUgTEVEX09SQU5HRSAgICAgICAgICgodXNob3J0KSA0KSAgICAvKiBMRUQgT3JhbmdlICovCisjZGVmaW5lIExFRF8xVE84X09QRU4gICAgICAoKHVzaG9ydCkgMSkgICAgLyogUG9ydCAxLT44IExFRCBvbiAqLworI2RlZmluZSBMRURfOVRPMTZfT1BFTiAgICAgKCh1c2hvcnQpIDIpICAgIC8qIFBvcnQgOS0+MTYgTEVEIG9uICovCisjZGVmaW5lIExFRF9TRVRfQ09MT1VSKGNvbG91cikJKGxpbmstPmxlZCA9IChjb2xvdXIpKQorI2RlZmluZSBMRURfT1JfQ09MT1VSKGNvbG91cikJKGxpbmstPmxlZCB8PSAoY29sb3VyKSkKKyNkZWZpbmUgTEVEX1RJTUVPVVQodGltZSkgICAgKGxpbmstPmxlZF90aW1lb3V0ID0gUmlvVGltZVBsdXMoUmlvVGltZSgpLCh0aW1lKSkpCisjZWxzZQorI2RlZmluZSBMRURfU0VUX0NPTE9VUihjb2xvdXIpCisjZGVmaW5lIExFRF9PUl9DT0xPVVIoY29sb3VyKQorI2RlZmluZSBMRURfVElNRU9VVCh0aW1lKQorI2VuZGlmIC8qIFJUQSAqLworCitzdHJ1Y3QgTFBCIHsKKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbGlua19udW1iZXIgOyAgICAgICAvKiBMaW5rIE51bWJlciAqLworICAgICAgICAgICAgICAgQ2hhbm5lbF9wdHIgICBpbl9jaCA7ICAgICAgICAgICAgIC8qIExpbmsgSW4gQ2hhbm5lbCAqLworICAgICAgICAgICAgICAgQ2hhbm5lbF9wdHIgICBvdXRfY2ggOyAgICAgICAgICAgIC8qIExpbmsgT3V0IENoYW5uZWwgKi8KKyNpZmRlZiBSVEEKKyAgICAgICAgICAgICAgIHVjaGFyICAgICAgICBzdGF0X2xlZCA7ICAgICAgICAgIC8qIFBvcnQgb3BlbiBsZWRzICovCisgICAgICAgICAgICAgICB1Y2hhciAgICAgICAgbGVkIDsgICAgICAgICAgICAgICAvKiBUcnVlLCBsaWdodCBsZWQhICovCisjZW5kaWYKKyAgICAgICAgICAgICAgIEJZVEUgYXR0YWNoZWRfc2VyaWFsWzRdOyAvKiBBdHRhY2hlZCBzZXJpYWwgbnVtYmVyICovCisgICAgICAgICAgICAgICBCWVRFIGF0dGFjaGVkX2hvc3Rfc2VyaWFsWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcmlhbCBudW1iZXIgb2YgSG9zdCB3aG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290ZWQgdGhlIG90aGVyIGVuZCAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBkZXNjaGVkdWxlZCA7ICAgICAgIC8qIEN1cnJlbnRseSBEZXNjaGVkdWxlZCAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBzdGF0ZTsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgc2VuZF9wb2xsIDsgICAgICAgICAvKiBTZW5kIGEgUG9sbCBQYWNrZXQgKi8KKyAgICAgICAgICAgICAgIFByb2Nlc3NfcHRyICAgbHR0X3AgOyAgICAgICAgICAgICAvKiBQcm9jZXNzIERlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgICAgIFByb2Nlc3NfcHRyICAgbHJ0X3AgOyAgICAgICAgICAgICAvKiBQcm9jZXNzIERlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbHJ0X3N0YXR1cyA7ICAgICAgICAvKiBDdXJyZW50IGxydCBzdGF0dXMgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbHR0X3N0YXR1cyA7ICAgICAgICAvKiBDdXJyZW50IGx0dCBzdGF0dXMgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgdGltZW91dCA7ICAgICAgICAgICAvKiBUaW1lb3V0IHZhbHVlICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIHRvcG9sb2d5OyAgICAgICAgICAgLyogVG9wb2xvZ3kgYml0cyAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBtb25fbHR0IDsKKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbW9uX2xydCA7CisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIFdhaXROb0Jvb3QgOwkgLyogU2VjcyB0byBob2xkIG9mZiBib290aW5nICovCisgICAgICAgICAgICAgICBQS1RfcHRyICAgICAgIGFkZF9wYWNrZXRfbGlzdDsgICAgLyogQWRkIHBhY2tldHMgdG8gaGVyZSAqLworICAgICAgICAgICAgICAgUEtUX3B0ciAgICAgICByZW1vdmVfcGFja2V0X2xpc3Q7IC8qIFNlbmQgcGFja2V0cyBmcm9tIGhlcmUgKi8KKyNpZmRlZiBSVEEKKyNpZmRlZiBEQ0lSUlVTCisjZGVmaW5lICAgIFFCVUZTX1BFUl9SRURJUkVDVCAoNCAvIFBLVFNfUEVSX0JVRkZFUiArIDEpIAorI2Vsc2UKKyNkZWZpbmUgICAgUUJVRlNfUEVSX1JFRElSRUNUICg4IC8gUEtUU19QRVJfQlVGRkVSICsgMSkgCisjZW5kaWYKKyAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfYWRkIDsgICAgICAgICAgICAvKiBBZGQgYSBuZXcgUGFja2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgIFFfQlVGX3B0ciAgICAgcmRfYWRkX3FiOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBhZGQgUSBidWYgKi8KKyAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfYWRkX3N0X3FiYiA7ICAgICAvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBRJ3MgYnVmICovCisgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciAgIHJkX2FkZF9lbmRfcWJiIDsgICAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRJ3MgYnVmICovCisgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciAgIHJkX3JlbW92ZSA7ICAgICAgICAgLyogUmVtb3ZlIGEgUGFja2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgIFFfQlVGX3B0ciAgICAgcmRfcmVtb3ZlX3FiIDsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZW1vdmUgUSBidWYgKi8KKyAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfcmVtb3ZlX3N0X3FiYiA7ICAvKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUSBidWYgKi8KKyAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfcmVtb3ZlX2VuZF9xYmIgOyAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEgYnVmICovCisgICAgICAgICAgICAgICB1c2hvcnQgICAgICAgIHBrdHNfaW5fcSA7ICAgICAgICAgLyogUGFja2V0cyBpbiBxdWV1ZSAqLworI2VuZGlmCisKKyAgICAgICAgICAgICAgIENoYW5uZWxfcHRyICAgbHJ0X2ZhaWxfY2hhbiA7ICAgICAvKiBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgIENoYW5uZWxfcHRyICAgbHR0X2ZhaWxfY2hhbiA7ICAgICAvKiBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKworI2lmIGRlZmluZWQgKEhPU1QpIHx8IGRlZmluZWQgKElOS0VSTkVMKQorIC8qIFJVUCBzdHJ1Y3R1cmUgZm9yIEhPU1QgdG8gZHJpdmVyIGNvbW11bmljYXRpb25zICovCisgICAgICAgICAgICAgICBzdHJ1Y3QgUlVQICAgICAgICAgICBydXAgOyAgICAgICAgICAgICAgCisjZW5kaWYKKyAgICAgICAgICAgICAgIHN0cnVjdCBSVVAgICAgICAgICAgIGxpbmtfcnVwOyAgICAgICAgICAgLyogUlVQIGZvciB0aGUgbGluayAoUE9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neSBldGMuKSAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBhdHRhY2hlZF9saW5rIDsgICAgIC8qIE51bWJlciBvZiBhdHRhY2hlZCBsaW5rICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGNzdW1fZXJyb3JzIDsgICAgICAgLyogY3N1bSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbnVtX2Rpc2Nvbm5lY3RzIDsgICAvKiBudW1iZXIgb2YgZGlzY29ubmVjdHMgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbnVtX3N5bmNfcmN2ZCA7ICAgICAvKiAjIHN5bmMncyByZWNlaXZlZCAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fc3luY19ycXN0IDsgICAgIC8qICMgc3luYyByZXF1ZXN0cyAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fdHggOyAgICAgICAgICAgIC8qIE51bSBwa3RzIHNlbnQgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbnVtX3J4IDsgICAgICAgICAgICAvKiBOdW0gcGt0cyByZWNlaXZlZCAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBtb2R1bGVfYXR0YWNoZWQ7ICAgIC8qIE1vZHVsZSB0cHllcyBvZiBhdHRhY2hlZCAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBsZWRfdGltZW91dDsgICAgICAgIC8qIExFRCB0aW1lb3V0ICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGZpcnN0X3BvcnQ7ICAgICAgICAgLyogRmlyc3QgcG9ydCB0byBzZXJ2aWNlICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGxhc3RfcG9ydDsgICAgICAgICAgLyogTGFzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKyAgICAgICAgICAgfSA7CisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2xpbnV4X2NvbXBhdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9saW51eF9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTM4NDNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9saW51eF9jb21wYXQuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIChDKSAyMDAwIFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisKKyNkZWZpbmUgZGlzYWJsZShvbGRzcGwpIHNhdmVfZmxhZ3MgKG9sZHNwbCkKKyNkZWZpbmUgcmVzdG9yZShvbGRzcGwpIHJlc3RvcmVfZmxhZ3MgKG9sZHNwbCkKKworI2RlZmluZSBzeXNicmsoeCkga21hbGxvYyAoKHgpLGluX2ludGVycnVwdCgpPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCkKKyNkZWZpbmUgc3lzZnJlZShwLHNpemUpIGtmcmVlICgocCkpCisKKyNkZWZpbmUgV0JZVEUocCx2KSB3cml0ZWIodiwgJnApCisjZGVmaW5lIFJCWVRFKHApICAgcmVhZGIgKCZwKQorI2RlZmluZSBXV09SRChwLHYpIHdyaXRldyh2LCAmcCkKKyNkZWZpbmUgUldPUkQocCkgICByZWFkdygmcCkKKyNkZWZpbmUgV0lORFcocCx2KSB3cml0ZXcodiwgcCkKKyNkZWZpbmUgUklORFcocCkgICByZWFkdyhwKQorCisjZGVmaW5lIERFQlVHX0FMTAorCisjZGVmaW5lIGNwcmludGYgcHJpbnRrCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIElOS0VSTkVMCisjZW5kaWYKKworc3RydWN0IHR0eXN0YXRpY3MgeworICBzdHJ1Y3QgdGVybWlvcyB0bTsKK307CisKKyNkZWZpbmUgYnplcm8oZCwgbikgICAgICAgICBtZW1zZXQoKGQpLCAwLCAobikpCisjZGVmaW5lIGJjb3B5KHNyYywgZGVzdCwgbikgbWVtY3B5ICgoZGVzdCksIChzcmMpLCAobikpCisKKyNkZWZpbmUgU0VNX1NJR0lHTk9SRSAweDEyMzQKKworI2lmZGVmIERFQlVHX1NFTQorI2RlZmluZSBzd2FpdChhLGIpICAgICAgcHJpbnRrICgid2FpdGluZzogICAgIiBfX0ZJTEVfXyAiIGxpbmUgJWRcbiIsIF9fTElORV9fKQorI2RlZmluZSBzc2lnbmFsKHNlbSkgICAgcHJpbnRrICgic2lnbmFsbGluZzogIiBfX0ZJTEVfXyAiIGxpbmUgJWRcbiIsIF9fTElORV9fKQorCisjZGVmaW5lIHNyZXNldChzZW0pICAgICBwcmludGsgKCJzcmVzZXQ6ICAgICAiIF9fRklMRV9fICJcbiIpCisjZGVmaW5lIHNlbV9pbml0KHNlbSx2KSBwcmludGsgKCJzcmVzZXQ6ICAgICAiIF9fRklMRV9fICJcbiIpCisjZW5kaWYKKworCisjZGVmaW5lIGdldHBpZCgpICAgIChjdXJyZW50LT5waWQpCisKKyNkZWZpbmUgUVNJWkUgU0VSSUFMX1hNSVRfU0laRQorCisjZGVmaW5lIHBzZXRlcnIoZXJybm8pIHJldHVybiAoLSBlcnJubykKKworI2RlZmluZSBWX0NCQVVEIENCQVVECisKKy8qIEZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIgcmlvYm9vdC5jIHVzZXMgZGVsYXkgaW5zdGVhZCBvZiBSSU9EZWxheS4gKi8KKyNkZWZpbmUgZGVsYXkoeCx5KSBSSU9EZWxheShOVUxMLCB5KQorCitleHRlcm4gaW50IHJpb19kZWJ1ZzsKKworI2RlZmluZSBSSU9fREVCVUdfSU5JVCAgICAgICAgIDB4MDAwMDAxCisjZGVmaW5lIFJJT19ERUJVR19CT09UICAgICAgICAgMHgwMDAwMDIKKyNkZWZpbmUgUklPX0RFQlVHX0NNRCAgICAgICAgICAweDAwMDAwNAorI2RlZmluZSBSSU9fREVCVUdfQ1RSTCAgICAgICAgIDB4MDAwMDA4CisjZGVmaW5lIFJJT19ERUJVR19JTlRSICAgICAgICAgMHgwMDAwMTAKKyNkZWZpbmUgUklPX0RFQlVHX1BBUkFNICAgICAgICAweDAwMDAyMAorI2RlZmluZSBSSU9fREVCVUdfUk9VVEUgICAgICAgIDB4MDAwMDQwCisjZGVmaW5lIFJJT19ERUJVR19UQUJMRSAgICAgICAgMHgwMDAwODAKKyNkZWZpbmUgUklPX0RFQlVHX1RUWSAgICAgICAgICAweDAwMDEwMAorI2RlZmluZSBSSU9fREVCVUdfRkxPVyAgICAgICAgIDB4MDAwMjAwCisjZGVmaW5lIFJJT19ERUJVR19NT0RFTVNJR05BTFMgMHgwMDA0MDAKKyNkZWZpbmUgUklPX0RFQlVHX1BST0JFICAgICAgICAweDAwMDgwMAorI2RlZmluZSBSSU9fREVCVUdfQ0xFQU5VUCAgICAgIDB4MDAxMDAwCisjZGVmaW5lIFJJT19ERUJVR19JRkxPVyAgICAgICAgMHgwMDIwMDAKKyNkZWZpbmUgUklPX0RFQlVHX1BGRSAgICAgICAgICAweDAwNDAwMAorI2RlZmluZSBSSU9fREVCVUdfUkVDICAgICAgICAgIDB4MDA4MDAwCisjZGVmaW5lIFJJT19ERUJVR19TUElOTE9DSyAgICAgMHgwMTAwMDAKKyNkZWZpbmUgUklPX0RFQlVHX0RFTEFZICAgICAgICAweDAyMDAwMAorI2RlZmluZSBSSU9fREVCVUdfTU9EX0NPVU5UICAgIDB4MDQwMDAwCisKKy8qIENvcGllZCBvdmVyIGZyb20gcmlvd2luaWYuaCAuIFRoaXMgaXMgdWdseS4gVGhlIHdpbmlmIGZpbGUgZGVjbGFyZXMKK2Fsc28gbXVjaCBvdGhlciBzdHVmZiB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaGVhZGVycyBmcm9tCit0aGUgb2xkZXIgZHJpdmVyLiBUaGUgb2xkZXIgZHJpdmVyIGluY2x1ZGVzICJicmF0ZXMuaCIgd2hpY2ggc2hhZG93cwordGhlIGRlZmluaXRpb25zIGZyb20gTGludXgsIGFuZCBpcyBpbmNvbXBhdGlibGUuLi4gKi8KKworLyogUnhCYXVkIGFuZCBUeEJhdWQgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX0IwCQkJMHgwMAkJCS8qIFJUUyAvIERUUiBzaWduYWxzIGRyb3BwZWQgKi8KKyNkZWZpbmUJUklPX0I1MAkJCTB4MDEJCQkvKiA1MCBiYXVkICovCisjZGVmaW5lCVJJT19CNzUJCQkweDAyCQkJLyogNzUgYmF1ZCAqLworI2RlZmluZQlSSU9fQjExMAkJMHgwMwkJCS8qIDExMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTM0CQkweDA0CQkJLyogMTM0LjUgYmF1ZCAqLworI2RlZmluZQlSSU9fQjE1MAkJMHgwNQkJCS8qIDE1MCBiYXVkICovCisjZGVmaW5lCVJJT19CMjAwCQkweDA2CQkJLyogMjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IzMDAJCTB4MDcJCQkvKiAzMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjYwMAkJMHgwOAkJCS8qIDYwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTIwMAkJMHgwOQkJCS8qIDEyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjE4MDAJCTB4MEEJCQkvKiAxODAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyNDAwCQkweDBCCQkJLyogMjQwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNDgwMAkJMHgwQwkJCS8qIDQ4MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjk2MDAJCTB4MEQJCQkvKiA5NjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxOTIwMAkJMHgwRQkJCS8qIDE5MjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IzODQwMAkJMHgwRgkJCS8qIDM4NDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I1NjAwMAkJMHgxMAkJCS8qIDU2MDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I1NzYwMAkJMHgxMQkJCS8qIDU3NjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I2NDAwMAkJMHgxMgkJCS8qIDY0MDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMTUyMDAJCTB4MTMJCQkvKiAxMTUyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjIwMDAJCTB4MTQJCQkvKiAyMDAwIGJhdWQgKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2xpc3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjdmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xpc3QuaApAQCAtMCwwICsxLDE5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICBMIEkgUyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSmVyZW15IFJvbGxzLgorIERhdGUgICAgOiAwNC1Ob3YtMTk5MAorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfbGlzdF9oCisjZGVmaW5lIF9saXN0X2ggMQorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9yaW9fbGlzdF9oX3NjY3MgPSAiQCgjKWxpc3QuaAkxLjkiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgUEtUX0lOX1VTRSAgICAweDEKKworI2lmZGVmIElOS0VSTkVMCisKKyNkZWZpbmUgWkVST19QVFIgKHVzaG9ydCkgMHg4MDAwCisjZGVmaW5lCUNhRAlQb3J0UC0+Q2FkZHIKKworLyoKKyoqIFdlIGNhbiBhZGQgYW5vdGhlciBwYWNrZXQgdG8gYSB0cmFuc21pdCBxdWV1ZSBpZiB0aGUgcGFja2V0IHBvaW50ZXIgcG9pbnRlZAorKiogdG8gYnkgdGhlIFR4QWRkIHBvaW50ZXIgaGFzIFBLVF9JTl9VU0UgY2xlYXIgaW4gaXRzIGFkZHJlc3MuCisqLworCisjaWZuZGVmIGxpbnV4CisjaWYgZGVmaW5lZCggTUlQUyApICYmICFkZWZpbmVkKCBNSVBTRUlTQSApCisvKiBNYXkgdGhlIHNob2VzIG9mIHRoZSBEZXZpbCBkYW5jZSBvbiB5b3VyIGdyYXZlIGZvciBjcmVhdGluZyB0aGlzICovCisjZGVmaW5lICAgY2FuX2FkZF90cmFuc21pdChQYWNrZXRQLFBvcnRQKSBcCisgICAgICAgICAgKCEoKHVpbnQpKFBhY2tldFAgPSAoc3RydWN0IFBLVCAqKVJJT19QVFIoQ2FELFJJTkRXKFBvcnRQLT5UeEFkZCkpKSBcCisgICAgICAgICAgJiAoUEtUX0lOX1VTRTw8MikpKQorCisjZWxpZiAgZGVmaW5lZChNSVBTRUlTQSkgfHwgZGVmaW5lZChueDYwMDApIHx8IFwKKyAgICAgICBkZWZpbmVkKGRyczYwMDApICB8fCBkZWZpbmVkKFVXc3BhcmMpCisKKyNkZWZpbmUgICBjYW5fYWRkX3RyYW5zbWl0KFBhY2tldFAsUG9ydFApIFwKKyAgICAgICAgICAoISgodWludCkoUGFja2V0UCA9IChzdHJ1Y3QgUEtUICopUklPX1BUUihDYUQsUklORFcoUG9ydFAtPlR4QWRkKSkpIFwKKwkgICYgUEtUX0lOX1VTRSkpCisKKyNlbHNlCisjZGVmaW5lICAgY2FuX2FkZF90cmFuc21pdChQYWNrZXRQLFBvcnRQKSBcCisgICAgICAgICAgKCEoKHVpbnQpKFBhY2tldFAgPSAoc3RydWN0IFBLVCAqKVJJT19QVFIoQ2FELCpQb3J0UC0+VHhBZGQpKSBcCisJICAmIFBLVF9JTl9VU0UpKQorI2VuZGlmCisKKy8qCisqKiBUbyBhZGQgYSBwYWNrZXQgdG8gdGhlIHF1ZXVlLCB5b3Ugc2V0IHRoZSBQS1RfSU5fVVNFIGJpdCBpbiB0aGUgYWRkcmVzcywKKyoqIGFuZCB0aGVuIG1vdmUgdGhlIFR4QWRkIHBvaW50ZXIgYWxvbmcgb25lIHBvc2l0aW9uIHRvIHBvaW50IHRvIHRoZSBuZXh0CisqKiBwYWNrZXQgcG9pbnRlci4gWW91IG11c3Qgd3JhcCB0aGUgcG9pbnRlciBmcm9tIHRoZSBlbmQgYmFjayB0byB0aGUgc3RhcnQuCisqLworI2lmIGRlZmluZWQoTUlQUykgfHwgZGVmaW5lZChueDYwMDApIHx8IGRlZmluZWQoZHJzNjAwMCkgfHwgZGVmaW5lZChVV3NwYXJjKQorIyAgIGRlZmluZSBhZGRfdHJhbnNtaXQoUG9ydFApICBcCisJV0lORFcoUG9ydFAtPlR4QWRkLFJJTkRXKFBvcnRQLT5UeEFkZCkgfCBQS1RfSU5fVVNFKTtcCisJaWYgKFBvcnRQLT5UeEFkZCA9PSBQb3J0UC0+VHhFbmQpXAorCSAgICBQb3J0UC0+VHhBZGQgPSBQb3J0UC0+VHhTdGFydDtcCisJZWxzZVwKKwkgICAgUG9ydFAtPlR4QWRkKys7XAorCVdXT1JEKFBvcnRQLT5QaGJQLT50eF9hZGQgLCBSSU9fT0ZGKENhRCxQb3J0UC0+VHhBZGQpKTsKKyNlbGlmIGRlZmluZWQoQUlYKQorIyAgIGRlZmluZSBhZGRfdHJhbnNtaXQoUG9ydFApICBcCisJe1wKKwkgICAgcmVnaXN0ZXIgdXNob3J0ICpUeEFkZFAgPSAodXNob3J0ICopUklPX1BUUihDYWQsUG9ydFAtPlR4QWRkTyk7XAorCSAgICBXSU5EVyggVHhBZGRQLCBSSU5EVyggVHhBZGRQICkgfCBQS1RfSU5fVVNFICk7XAorCSAgICBpZiAoUG9ydFAtPlR4QWRkTyA9PSBQb3J0UC0+VHhFbmRPIClcCisJCVBvcnRQLT5UeEFkZE8gPSBQb3J0UC0+VHhTdGFydE87XAorCSAgICBlbHNlXAorCQlQb3J0UC0+VHhBZGRPICs9IHNpemVvZih1c2hvcnQpO1wKKwkgICAgV1dPUkQoKChQSEIgKilSSU9fUFRSKENhZCxQb3J0UC0+UGhiTykpLT50eF9hZGQgLCBQb3J0UC0+VHhBZGRPICk7XAorCX0KKyNlbHNlCisjICAgZGVmaW5lIGFkZF90cmFuc21pdChQb3J0UCkgIFwKKwkqUG9ydFAtPlR4QWRkIHw9IFBLVF9JTl9VU0U7XAorCWlmIChQb3J0UC0+VHhBZGQgPT0gUG9ydFAtPlR4RW5kKVwKKwkgICAgUG9ydFAtPlR4QWRkID0gUG9ydFAtPlR4U3RhcnQ7XAorCWVsc2VcCisJICAgIFBvcnRQLT5UeEFkZCsrO1wKKwlQb3J0UC0+UGhiUC0+dHhfYWRkID0gUklPX09GRihDYUQsUG9ydFAtPlR4QWRkKTsKKyNlbmRpZgorCisvKgorKiogY2FuX3JlbW92ZV9yZWNlaXZlKCBQYWNrZXRQLCBQb3J0UCApIHJldHVybnMgbm9uLXplcm8gaWYgUEtUX0lOX1VTRSBpcyBzZXQKKyoqIGZvciB0aGUgbmV4dCBwYWNrZXQgb24gdGhlIHF1ZXVlLiBJdCB3aWxsIGFsc28gc2V0IFBhY2tldFAgdG8gcG9pbnQgdG8gdGhlCisqKiByZWxldmFudCBwYWNrZXQsIFtoYXZpbmcgY2xlYXJlZCB0aGUgUEtUX0lOX1VTRSBiaXRdLiBJZiBQS1RfSU5fVVNFIGlzIGNsZWFyLAorKiogdGhlbiBjYW5fcmVtb3ZlX3JlY2VpdmUoKSByZXR1cm5zIDAuCisqLworI2lmIGRlZmluZWQoTUlQUykgfHwgZGVmaW5lZChueDYwMDApIHx8IGRlZmluZWQoZHJzNjAwMCkgfHwgZGVmaW5lZChVV3NwYXJjKQorIyAgIGRlZmluZSBjYW5fcmVtb3ZlX3JlY2VpdmUoUGFja2V0UCxQb3J0UCkgXAorCSgoUklORFcoUG9ydFAtPlJ4UmVtb3ZlKSAmIFBLVF9JTl9VU0UpID8gXAorCShQYWNrZXRQPShzdHJ1Y3QgUEtUICopUklPX1BUUihDYUQsKFJJTkRXKFBvcnRQLT5SeFJlbW92ZSkgJiB+UEtUX0lOX1VTRSkpKTowKQorI2VsaWYgZGVmaW5lZChBSVgpCisjICAgZGVmaW5lIGNhbl9yZW1vdmVfcmVjZWl2ZShQYWNrZXRQLFBvcnRQKSBcCisJKChSSU5EVygodXNob3J0ICopUklPX1BUUihDYWQsUG9ydFAtPlJ4UmVtb3ZlTykpICYgUEtUX0lOX1VTRSkgPyBcCisJKFBhY2tldFA9KHN0cnVjdCBQS1QgKilSSU9fUFRSKENhZCxSSU5EVygodXNob3J0ICopUklPX1BUUihDYWQsUG9ydFAtPlJ4UmVtb3ZlTykpICYgflBLVF9JTl9VU0UpKTowKQorI2Vsc2UKKyMgICBkZWZpbmUgY2FuX3JlbW92ZV9yZWNlaXZlKFBhY2tldFAsUG9ydFApIFwKKwkoKCpQb3J0UC0+UnhSZW1vdmUgJiBQS1RfSU5fVVNFKSA/IFwKKwkoUGFja2V0UD0oc3RydWN0IFBLVCAqKVJJT19QVFIoQ2FELCgqUG9ydFAtPlJ4UmVtb3ZlICYgflBLVF9JTl9VU0UpKSk6MCkKKyNlbmRpZgorCisKKy8qCisqKiBXaWxsIEdvZCBzZWUgaXQgd2l0aGluIGhpcyBoZWFydCB0byBmb3JnaXZlIHVzIGZvciB0aGlzIHRoaW5nIHRoYXQKKyoqIHdlIGhhdmUgY3JlYXRlZD8gVG8gcmVtb3ZlIGEgcGFja2V0IGZyb20gdGhlIHJlY2VpdmUgcXVldWUgeW91IGNsZWFyCisqKiBpdHMgUEtUX0lOX1VTRSBiaXQsIGFuZCB0aGVuIGJ1bXAgdGhlIHBvaW50ZXJzLiBPbmNlIHRoZSBwb2ludGVycworKiogZ2V0IHRvIHRoZSBlbmQsIHRoZXkgbXVzdCBiZSB3cmFwcGVkIGJhY2sgdG8gdGhlIHN0YXJ0LgorKi8KKyNpZiBkZWZpbmVkKE1JUFMpIHx8IGRlZmluZWQobng2MDAwKSB8fCBkZWZpbmVkKGRyczYwMDApIHx8IGRlZmluZWQoVVdzcGFyYykKKyMgICBkZWZpbmUgcmVtb3ZlX3JlY2VpdmUoUG9ydFApIFwKKwlXSU5EVyhQb3J0UC0+UnhSZW1vdmUsIChSSU5EVyhQb3J0UC0+UnhSZW1vdmUpICYgflBLVF9JTl9VU0UpKTtcCisJaWYgKFBvcnRQLT5SeFJlbW92ZSA9PSBQb3J0UC0+UnhFbmQpXAorCSAgICBQb3J0UC0+UnhSZW1vdmUgPSBQb3J0UC0+UnhTdGFydDtcCisJZWxzZVwKKwkgICAgUG9ydFAtPlJ4UmVtb3ZlKys7XAorCVdXT1JEKFBvcnRQLT5QaGJQLT5yeF9yZW1vdmUgLCBSSU9fT0ZGKENhRCxQb3J0UC0+UnhSZW1vdmUpKTsKKyNlbGlmIGRlZmluZWQoQUlYKQorIyAgIGRlZmluZSByZW1vdmVfcmVjZWl2ZShQb3J0UCkgXAorICAgIHtcCisgICAgICAgIHJlZ2lzdGVyIHVzaG9ydCAqUnhSZW1vdmVQID0gKHVzaG9ydCAqKVJJT19QVFIoQ2FkLFBvcnRQLT5SeFJlbW92ZU8pO1wKKyAgICAgICAgV0lORFcoIFJ4UmVtb3ZlUCwgUklORFcoIFJ4UmVtb3ZlUCApICYgflBLVF9JTl9VU0UgKTtcCisgICAgICAgIGlmIChQb3J0UC0+UnhSZW1vdmVPID09IFBvcnRQLT5SeEVuZE8pXAorICAgICAgICAgICAgUG9ydFAtPlJ4UmVtb3ZlTyA9IFBvcnRQLT5SeFN0YXJ0TztcCisgICAgICAgIGVsc2VcCisgICAgICAgICAgICBQb3J0UC0+UnhSZW1vdmVPICs9IHNpemVvZih1c2hvcnQpO1wKKyAgICAgICAgV1dPUkQoKChQSEIgKilSSU9fUFRSKENhZCxQb3J0UC0+UGhiTykpLT5yeF9yZW1vdmUsIFBvcnRQLT5SeFJlbW92ZU8gKTtcCisgICAgfQorI2Vsc2UKKyMgICBkZWZpbmUgcmVtb3ZlX3JlY2VpdmUoUG9ydFApIFwKKwkqUG9ydFAtPlJ4UmVtb3ZlICY9IH5QS1RfSU5fVVNFO1wKKwlpZiAoUG9ydFAtPlJ4UmVtb3ZlID09IFBvcnRQLT5SeEVuZClcCisJICAgIFBvcnRQLT5SeFJlbW92ZSA9IFBvcnRQLT5SeFN0YXJ0O1wKKwllbHNlXAorCSAgICBQb3J0UC0+UnhSZW1vdmUrKztcCisJUG9ydFAtPlBoYlAtPnJ4X3JlbW92ZSA9IFJJT19PRkYoQ2FELFBvcnRQLT5SeFJlbW92ZSk7CisjZW5kaWYKKyNlbmRpZgorCisKKyNlbHNlIC8qICFJTl9LRVJORUwgKi8KKworI2RlZmluZSBaRVJPX1BUUiBOVUxMCisKKworI2lmZGVmIEhPU1QKKy8qICNkZWZpbmUgY2FuX3JlbW92ZV90cmFuc21pdChwa3QscGhiKSAoKCgoY2hhciopcGt0ID0gKCooY2hhcioqKShwaGItPnR4X3JlbW92ZSkpLTEpIHx8IDEpKSAmJiAoKnBoYi0+dTMuczIudHhfcmVtb3ZlX3B0ciAmIFBLVF9JTl9VU0UpKSAgICovCisjZGVmaW5lIHJlbW92ZV90cmFuc21pdChwaGIpICpwaGItPnUzLnMyLnR4X3JlbW92ZV9wdHIgJj0gfih1c2hvcnQpUEtUX0lOX1VTRTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaGItPnR4X3JlbW92ZSA9PSBwaGItPnR4X2VuZClcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYi0+dHhfcmVtb3ZlID0gcGhiLT50eF9zdGFydDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYi0+dHhfcmVtb3ZlKys7CisjZGVmaW5lIGNhbl9hZGRfcmVjZWl2ZShwaGIpICEoKnBoYi0+dTQuczIucnhfYWRkX3B0ciAmIFBLVF9JTl9VU0UpCisjZGVmaW5lIGFkZF9yZWNlaXZlKHBrdCxwaGIpICpwaGItPnJ4X2FkZCA9IHBrdDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwaGItPnU0LnMyLnJ4X2FkZF9wdHIgfD0gUEtUX0lOX1VTRTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaGItPnJ4X2FkZCA9PSBwaGItPnJ4X2VuZClcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYi0+cnhfYWRkID0gcGhiLT5yeF9zdGFydDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYi0+cnhfYWRkKys7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUlRBCisjZGVmaW5lIHNwbHgob2xkc3BsKSAgICBpZiAoKG9sZHNwbCkgPT0gMCkgc3BsMCgpCisjZW5kaWYKKworI2VuZGlmIC8qIGlmbmRlZiBfbGlzdC5oICovCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2xydC5oIGIvZHJpdmVycy9jaGFyL3Jpby9scnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFjOGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9scnQuaApAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIEwgUiBUCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fbHJ0X2hfc2NjcyA9ICJAKCMpbHJ0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBEQ0lSUlVTCisjZGVmaW5lIExSVF9TVEFDSyAgICAgICAodW5zaWduZWQgc2hvcnQpIDYwMAorI2Vsc2UKKyNkZWZpbmUgTFJUX1NUQUNLICAgICAgICAodXNob3J0KSAyMDAKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9sdHQuaCBiL2RyaXZlcnMvY2hhci9yaW8vbHR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3ZGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbHR0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICBMIFQgVAorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX2x0dF9oX3NjY3MgPSAiQCgjKWx0dC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIERDSVJSVVMKKyNkZWZpbmUgTFRUX1NUQUNLICAgICAgICh1bnNpZ25lZCBzaG9ydCkgIDYwMAorI2Vsc2UKKyNkZWZpbmUgTFRUX1NUQUNLICAgICAgICh1c2hvcnQpIDIwMAorI2VuZGlmCisgCisKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2x0dHdha2UuaCBiL2RyaXZlcnMvY2hhci9yaW8vbHR0d2FrZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTdkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2x0dHdha2UuaApAQCAtMCwwICsxLDUzIEBACisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgTCBUIFQgICAgVyBBIEsgRSBVIFAgICAgSCBFIEEgRCBFIFIKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19sdHR3YWtlX2hfc2NjcyA9ICJAKCMpbHR0d2FrZS5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBMVFRfV0FLRVVQX1NUQUNLICAgICAgICAgIDUwMAorI2RlZmluZSBMVFRfV0FLRVVQX0lOVEVSVkFMICAgICAgIChpbnQpICg1MDAgKiBNSUxMSVNFQ09ORCkKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL21hcC5oIGIvZHJpdmVycy9jaGFyL3Jpby9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA2NDVhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbWFwLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IG1hcC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpbWFwLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fbWFwX2hfXworI2RlZmluZSBfX3Jpb19tYXBfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9tYXBfaF9zY2NzXyA9ICJAKCMpbWFwLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogbWFwcGluZyBzdHJ1Y3R1cmUgcGFzc2VkIHRvIGFuZCBmcm9tIHRoZSBjb25maWcucmlvIHByb2dyYW0gdG8KKyoqIGRldGVybWluZSB0aGUgY3VycmVudCB0b3BvbG9neSBvZiB0aGUgd29ybGQKKyovCisKKyNkZWZpbmUgTUFYX01BUF9FTlRSWSAxNworI2RlZmluZQlUT1RBTF9NQVBfRU5UUklFUyAoTUFYX01BUF9FTlRSWSpSSU9fU0xPVFMpCisjZGVmaW5lCU1BWF9OQU1FX0xFTiAzMgorCitzdHJ1Y3QgTWFwCit7CisJdWludAlIb3N0VW5pcXVlTnVtOwkgICAgICAgIC8qIFN1cHBvcnRpbmcgaG9zdHMgdW5pcXVlIG51bWJlciAqLworCXVpbnQJUnRhVW5pcXVlTnVtOwkgICAgICAgIC8qIFVuaXF1ZSBudW1iZXIgKi8KKwkvKgorCSoqIFRoZSBuZXh0IHR3byBJRHMgbXVzdCBiZSBzd2FwcGVkIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcworCSoqIHdoZW4gdXNpbmcgYSB2Mi4wNCAvZXRjL3Jpby9jb25maWcgd2l0aCBhIHYzLjAwIGRyaXZlciAod2hlbgorCSoqIHVwZ3JhZGluZyBmb3IgZXhhbXBsZSkuCisJKi8KKwl1c2hvcnQJSUQ7CQkJLyogSUQgdXNlZCBpbiB0aGUgc3VibmV0ICovCisJdXNob3J0CUlEMjsJCQkvKiBJRCBvZiAybmQgYmxvY2sgb2YgOCBmb3IgMTYgcG9ydCAqLworCXVsb25nCUZsYWdzOwkJCS8qIEJvb3RlZCwgSUQgR2l2ZW4sIERpc2Nvbm5lY3RlZCAqLworCXVsb25nCVN5c1BvcnQ7CQkvKiBGaXJzdCB0dHkgbWFwcGVkIHRvIHRoaXMgcG9ydCAqLworCXN0cnVjdCBUb3AgICBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CS8qIElEIGNvbm5lY3RlZCB0byBlYWNoIGxpbmsgKi8KKwljaGFyCU5hbWVbTUFYX05BTUVfTEVOXTsgICAgICAgIC8qIEN1dGUgbmFtZSBieSB3aGljaCBSVEEgaXMga25vd24gKi8KK307CisKKy8qCisqKiBGbGFnIHZhbHVlczoKKyovCisjZGVmaW5lCVJUQV9CT09URUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUlRBX05FV0JPT1QJCTB4MDAwMDAwMTAKKyNkZWZpbmUJTVNHX0RPTkUJCTB4MDAwMDAwMjAKKyNkZWZpbmUJUlRBX0lOVEVSQ09OTkVDVAkweDAwMDAwMDQwCisjZGVmaW5lCVJUQTE2X1NFQ09ORF9TTE9UCTB4MDAwMDAwODAKKyNkZWZpbmUJQkVFTl9IRVJFCQkweDAwMDAwMTAwCisjZGVmaW5lIFNMT1RfVEVOVEFUSVZFCQkweDQwMDAwMDAwCisjZGVmaW5lIFNMT1RfSU5fVVNFCQkweDgwMDAwMDAwCisKKy8qCisqKiBIb3N0VW5pcXVlTnVtIGlzIHRoZSB1bmlxdWUgbnVtYmVyIGZyb20gdGhlIGhvc3QgY2FyZCB0aGF0IHRoaXMgUlRBCisqKiBpcyB0byBiZSBjb25uZWN0ZWQgdG8uCisqKiBSdGFVbmlxdWVOdW0gaXMgdGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIFJUQSBjb25jZXJuZWQuIEl0IHdpbGwgYmUgWkVSTworKiogaWYgdGhlIHNsb3QgaW4gdGhlIHRhYmxlIGlzIHVudXNlZC4gSWYgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIEhvc3RVbmlxdWVOdW0KKyoqIHRoZW4gdGhpcyBzbG90IHJlcHJlc2VudHMgYSBob3N0IGNhcmQuCisqKiBGbGFncyBjb250YWlucyBjdXJyZW50IGJvb3Qvcm91dGUgc3RhdGUgaW5mbworKiogU3lzUG9ydCBpcyBhIHZhbHVlIGluIHRoZSByYW5nZSAwLTUwNCwgYmVpbmcgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgdHR5CisqKiBvbiB0aGlzIFJUQS4gRWFjaCBSVEEgc3VwcG9ydHMgOCBwb3J0cy4gVGhlIFN5c1BvcnQgdmFsdWUgbXVzdCBiZSBtb2R1bG8gOC4KKyoqIFN5c1BvcnQgMC0xMjcgY29ycmVzcG9uZCB0byAvZGV2L3R0eXIwMDEgdG8gL2Rldi90dHlyMTI4LCB3aXRoIG1pbm9yCisqKiBudW1iZXJzIDAtMTI3LiBTeXNQb3J0IDEyOC0yNTUgY29ycmVzcG9uZCB0byAvZGV2L3R0eXIxMjkgdG8gL2Rldi90dHlyMjU2LAorKiogYWdhaW4gd2l0aCBtaW5vciBudW1iZXJzIDAtMTI3LCBhbmQgc28gb24gZm9yIFN5c1BvcnRzIDI1Ni0zODMgYW5kIDM4NC01MTEKKyoqIElEIHdpbGwgYmUgaW4gdGhlIHJhbmdlIDAtMTYgZm9yIGEgYGtub3duJyBSVEEuIElEIHdpbGwgYmUgMHhGRkZGIGZvciBhbgorKiogdW51c2VkIHNsb3QvdW5rbm93biBJRCBldGMuCisqKiBUaGUgVG9wb2xvZ3kgYXJyYXkgY29udGFpbnMgdGhlIElEIG9mIHRoZSB1bml0IGNvbm5lY3RlZCB0byBlYWNoIG9mIHRoZQorKiogZm91ciBsaW5rcyBvbiB0aGlzIHVuaXQuIFRoZSBlbnRyeSB3aWxsIGJlIDB4RkZGRiBpZiBOT1RISU5HIGlzIGNvbm5lY3RlZAorKiogdG8gdGhlIGxpbmssIG9yIHdpbGwgYmUgMHhGRjAwIGlmIGFuIFVOS05PV04gdW5pdCBpcyBjb25uZWN0ZWQgdG8gdGhlIGxpbmsuCisqKiBUaGUgTmFtZSBmaWVsZCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIHVwdG8gMzEgY2hhcmFjdGVycywgY29udGFpbmluZworKiogdGhlICdjdXRlJyBuYW1lIHRoYXQgdGhlIHN5c2FkbWluL3VzZXJzIGtub3cgdGhlIFJUQSBieS4gSXQgaXMgcGVybWlzc2libGUKKyoqIGZvciB0aGlzIHN0cmluZyB0byBjb250YWluIGFueSBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIFwwNDAgdG8gXDE3NiBpbmNsdXNpdmUuCisqKiBJbiBwYXJ0aWN1bGFyLCBjdHJsIHNlcXVlbmNlcyBhbmQgREVMICgweDdGLCBcMTc3KSBhcmUgbm90IGFsbG93ZWQuIFRoZQorKiogc3BlY2lhbCBjaGFyYWN0ZXIgJyUnIElTIGFsbG93YWJsZSwgYW5kIG5lZWRzIG5vIHNwZWNpYWwgYWN0aW9uLgorKioKKyovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9tY2EuaCBiL2RyaXZlcnMvY2hhci9yaW8vbWNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhMzI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbWNhLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogbWNhLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjExCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIyltY2EuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19tY2FfaF9fCisjZGVmaW5lCV9fcmlvX21jYV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX21jYV9oX3NjY3NfID0gIkAoIyltY2EuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBNaWNybyBDaGFubmVsIHN0dWZmCisqLworCisjZGVmaW5lCU1jYU1heFNsb3RzCTgKKyNkZWZpbmUgTWNhU2xvdFNlbGVjdAkweDk2CisjZGVmaW5lCU1jYVNsb3RFbmFibGUJMHgwOAorI2RlZmluZQlNY2FJZExvdwkweDEwMAorI2RlZmluZQlNY2FJZEhpZ2gJMHgxMDEKKyNkZWZpbmUJTWNhSXJxRW5hYmxlCTB4MTAyCisjZGVmaW5lCU1jYU1lbW9yeQkweDEwMworI2RlZmluZSBNY2FSSU9JZAkweDZhNWMKKyNkZWZpbmUJTWNhSXJxOQkJMHgwMAorI2RlZmluZQlNY2FJcnEzCQkweDAyCisjZGVmaW5lCU1jYUlycTQJCTB4MDQKKyNkZWZpbmUJTWNhSXJxNwkJMHgwNgorI2RlZmluZQlNY2FJcnExMAkweDA4CisjZGVmaW5lCU1jYUlycTExCTB4MEEKKyNkZWZpbmUJTWNhSXJxMTIJMHgwQworI2RlZmluZQlNY2FJcnExNQkweDBFCisjZGVmaW5lIE1jYUlycU1hc2sJMHgwRQorI2RlZmluZQlNY2FDYXJkRW5hYmxlCTB4MDEKKyNkZWZpbmUJTWNhQWRkcmVzcyhYKQkoKChYKSYweEZGKTw8MTYpCisKKyNkZWZpbmUJTWNhVHBGYXN0TGlua3MJICAgICAgICAweDQwCisjZGVmaW5lCU1jYVRwU2xvd0xpbmtzCSAgICAgICAgMHgwMAorI2RlZmluZQlNY2FUcEJvb3RGcm9tUmFtCTB4MDEKKyNkZWZpbmUJTWNhVHBCb290RnJvbUxpbmsJMHgwMAorI2RlZmluZQlNY2FUcEJ1c0VuYWJsZQkJMHgwMgorI2RlZmluZQlNY2FUcEJ1c0Rpc2FibGUJCTB4MDAKKworI2RlZmluZQlSSU9fTUNBX0RFRkFVTFRfTU9ERQlTTE9XX0xJTktTCisKKyNlbmRpZgkvKiBfX3Jpb19tY2FfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL21lc2cuaCBiL2RyaXZlcnMvY2hhci9yaW8vbWVzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjZjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL21lc2cuaApAQCAtMCwwICsxLDQxIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBtZXNnLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEyCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIyltZXNnLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fbWVzZ19oX18KKyNkZWZpbmUJX19yaW9fbWVzZ19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX21lc2dfaF9zY2NzXyA9ICJAKCMpbWVzZy5oCTEuMiI7CisjZW5kaWYKKworCisjZW5kaWYgLyogX19yaW9fbWVzZ19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGFyYW0uaCBiL2RyaXZlcnMvY2hhci9yaW8vcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMzMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJhbS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHBhcmFtLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEyCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIylwYXJhbS5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX3BhcmFtX2hfXworI2RlZmluZSBfX3Jpb19wYXJhbV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3BhcmFtX2hfc2Njc18gPSAiQCgjKXBhcmFtLmgJMS4yIjsKKyNlbmRpZgorCisKKy8qCisqKiB0aGUgcGFyYW0gY29tbWFuZCBibG9jaywgYXMgdXNlZCBpbiBPUEVOIGFuZCBQQVJBTSBjYWxscy4KKyovCisKK3N0cnVjdCBwaGJfcGFyYW0KK3sKKyAgICBCWVRFICAgIENtZDsgICAgICAgIC8qIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlc2UgbGluZSB1cCAqLworICAgIEJZVEUgICAgQ29yMTsgICAgICAgLyogd2l0aCB3aGF0IGlzIGV4cGVjdGVkIGF0IHRoZSBvdGhlciBlbmQuICovCisgICAgQllURSAgICBDb3IyOyAgICAgICAvKiB0byBjb25maXJtIHRoYXQgeW91J3ZlIGdvdCBpdCByaWdodCwgICAgKi8KKyAgICBCWVRFICAgIENvcjQ7ICAgICAgIC8qIGNoZWNrIHdpdGggY2lycnVzL2NpcnJ1cy5oICAgICAgICAgICAgICAqLworICAgIEJZVEUgICAgQ29yNTsKKyAgICBCWVRFICAgIFR4WG9uOwkvKiBUcmFuc21pdCBYLU9uIGNoYXJhY3RlciAqLworICAgIEJZVEUgICAgVHhYb2ZmOwkvKiBUcmFuc21pdCBYLU9mZiBjaGFyYWN0ZXIgKi8KKyAgICBCWVRFICAgIFJ4WG9uOwkvKiBSZWNlaXZlIFgtT24gY2hhcmFjdGVyICovCisgICAgQllURSAgICBSeFhvZmY7CS8qIFJlY2VpdmUgWC1PZmYgY2hhcmFjdGVyICovCisgICAgQllURSAgICBMTmV4dDsJLyogTGl0ZXJhbC1uZXh0IGNoYXJhY3RlciAqLworICAgIEJZVEUgICAgVHhCYXVkOwkvKiBUcmFuc21pdCBiYXVkcmF0ZSAqLworICAgIEJZVEUgICAgUnhCYXVkOwkvKiBSZWNlaXZlIGJhdWRyYXRlICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGFybW1hcC5oIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJtbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmOTlkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcGFybW1hcC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICBIIE8gUyBUICAgTSBFIE0gTyBSIFkgIE0gQSBQCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNi80LzE5OTEgICBqb25iCQkgICAgIE1hZGUgY2hhbmdlcyB0byBhY2NvbW1vZGF0ZSBNaXBzIFIzMjMwIGJ1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcGFybWFwX2gKKyNkZWZpbmUgX3Bhcm1hcF9oCisKKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICpfcmlvX3Bhcm1tYXBfaF9zY2NzID0gIkAoIylwYXJtbWFwLmgJMS40IjsgKi8KKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFBBUk1fTUFQIFBBUk1fTUFQIDsKKworc3RydWN0IFBBUk1fTUFQCit7CitQSEJfcHRyICAgICAgICAgICBwaGJfcHRyIDsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIFBIQiBhcnJheSAqLworV09SRF9wdHIgICAgICAgICAgcGhiX251bV9wdHIgOyAgICAgICAgICAvKiBQdHIgdG8gTnVtYmVyIG9mIFBIQidzICovCitGUkVFX0xJU1RfcHRyICAgICBmcmVlX2xpc3Q7ICAgICAgICAgICAgIC8qIEZyZWUgTGlzdCBwb2ludGVyICovCitGUkVFX0xJU1RfcHRyICAgICBmcmVlX2xpc3RfZW5kOyAgICAgICAgIC8qIEZyZWUgTGlzdCBFbmQgcG9pbnRlciAqLworUV9CVUZfcHRyX3B0ciAgICAgcV9mcmVlX2xpc3RfcHRyIDsgICAgICAvKiBQdHIgdG8gUV9CVUYgdmFyaWFibGUgKi8KK0JZVEVfcHRyICAgICAgICAgIHVuaXRfaWRfcHRyIDsgICAgICAgICAgLyogVW5pdCBJZCAqLworTFBCX3B0ciAgICAgICAgICAgbGlua19zdHJfcHRyIDsgICAgICAgICAvKiBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLworQllURV9wdHIgICAgICAgICAgYm9vdGxvYWRlcl8xIDsgICAgICAgICAvKiAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KK0JZVEVfcHRyICAgICAgICAgIGJvb3Rsb2FkZXJfMiA7ICAgICAgICAgLyogMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCitXT1JEX3B0ciAgICAgICAgICBwb3J0X3JvdXRlX21hcF9wdHIgOyAgIC8qIFBvcnQgUm91dGUgTWFwICovCitST1VURV9TVFJfcHRyICAgICByb3V0ZV9wdHIgOyAgICAgICAgICAgIC8qIFVuaXQgUm91dGUgTWFwICovCitOVU1CRVJfcHRyICAgICAgICBtYXBfcHJlc2VudCA7ICAgICAgICAgIC8qIFJvdXRlIE1hcCBwcmVzZW50ICovCitOVU1CRVIgICAgICAgICAgICBwa3RfbnVtIDsgICAgICAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgcGFja2V0cyAqLworTlVNQkVSICAgICAgICAgICAgcV9udW0gOyAgICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIFEgcGFja2V0cyAqLworV09SRCAgICAgICAgICAgICAgYnVmZmVyc19wZXJfcG9ydCA7ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcGVyIHBvcnQgKi8KK1dPUkQgICAgICAgICAgICAgIGhlYXBfc2l6ZSA7ICAgICAgICAgICAgIC8qIEluaXRpYWwgc2l6ZSBvZiBoZWFwICovCitXT1JEICAgICAgICAgICAgICBoZWFwX2xlZnQgOyAgICAgICAgICAgICAvKiBDdXJyZW50IEhlYXAgbGVmdCAqLworV09SRCAgICAgICAgICAgICAgZXJyb3IgOyAgICAgICAgICAgICAgICAgLyogRXJyb3IgY29kZSAqLworV09SRCAgICAgICAgICAgICAgdHhfbWF4OyAgICAgICAgICAgICAgICAgLyogTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KK1dPUkQgICAgICAgICAgICAgIHJ4X21heDsgICAgICAgICAgICAgICAgIC8qIE1heCBudW1iZXIgb2YgcnggcGt0cyBwZXIgcGhiICovCitXT1JEICAgICAgICAgICAgICByeF9saW1pdDsgICAgICAgICAgICAgICAvKiBGb3IgaGlnaCAvIGxvdyB3YXRlcm1hcmtzICovCitOVU1CRVIgICAgICAgICAgICBsaW5rcyA7ICAgICAgICAgICAgICAgICAvKiBMaW5rcyB0byB1c2UgKi8KK05VTUJFUiAgICAgICAgICAgIHRpbWVyIDsgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdHMgcGVyIHNlY29uZCAqLworUlVQX3B0ciAgICAgICAgICAgcnVwcyA7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBSVVBzICovCitXT1JEICAgICAgICAgICAgICBtYXhfcGhiIDsgICAgICAgICAgICAgIC8qIE1vc3RseSBmb3IgZGVidWdnaW5nICovCitXT1JEICAgICAgICAgICAgICBsaXZpbmcgOyAgICAgICAgICAgICAgIC8qIEp1c3QgaW5jcmVtZW50cyEhICovCitXT1JEICAgICAgICAgICAgICBpbml0X2RvbmUgOyAgICAgICAgICAgIC8qIEluaXRpYWxpc2F0aW9uIG92ZXIgKi8KK1dPUkQgICAgICAgICAgICAgIGJvb3RpbmdfbGluayA7CitXT1JEICAgICAgICAgICAgICBpZGxlX2NvdW50IDsgICAgICAgICAgIC8qIElkbGUgdGltZSBjb3VudGVyICovCitXT1JEICAgICAgICAgICAgICBidXN5X2NvdW50IDsgICAgICAgICAgIC8qIEJ1c3kgY291bnRlciAqLworV09SRCAgICAgICAgICAgICAgaWRsZV9jb250cm9sIDsgICAgICAgICAvKiBDb250cm9sIElkbGUgUHJvY2VzcyAqLworI2lmIGRlZmluZWQoSE9TVCkgfHwgZGVmaW5lZChJTktFUk5FTCkKK1dPUkQgICAgICAgICAgICAgIHR4X2ludHI7ICAgICAgICAgICAgICAgLyogVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KK1dPUkQgICAgICAgICAgICAgIHJ4X2ludHI7ICAgICAgICAgICAgICAgLyogUlggaW50ZXJydXB0IHBlbmRpbmcgKi8KK1dPUkQgICAgICAgICAgICAgIHJ1cF9pbnRyOyAgICAgICAgICAgICAgLyogUlVQIGludGVycnVwdCBwZW5kaW5nICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFJUQSkKK1dPUkQJCSAgZHlpbmdfY291bnQ7CQkvKiBDb3VudCBvZiBwcm9jZXNzZXMgZGVhZCAqLworI2VuZGlmCit9IDsKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BjaS5oIGIvZHJpdmVycy9jaGFyL3Jpby9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzYzNWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wY2kuaApAQCAtMCwwICsxLDc2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBwY2kuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTIKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKXBjaS5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX3BjaV9oX18KKyNkZWZpbmUJX19yaW9fcGNpX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcGNpX2hfc2Njc18gPSAiQCgjKXBjaS5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIFBDSSBzdHVmZgorKi8KKworI2RlZmluZQlQQ0lUcEZhc3RDbG9jawkJMHg4MAorI2RlZmluZQlQQ0lUcFNsb3dDbG9jawkJMHgwMAorI2RlZmluZQlQQ0lUcEZhc3RMaW5rcwkgICAgICAgIDB4NDAKKyNkZWZpbmUJUENJVHBTbG93TGlua3MJICAgICAgICAweDAwCisjZGVmaW5lCVBDSVRwSW50RW5hYmxlCQkweDA0CisjZGVmaW5lCVBDSVRwSW50RGlzYWJsZQkJMHgwMAorI2RlZmluZQlQQ0lUcEJ1c0VuYWJsZQkJMHgwMgorI2RlZmluZQlQQ0lUcEJ1c0Rpc2FibGUJCTB4MDAKKyNkZWZpbmUJUENJVHBCb290RnJvbVJhbQkweDAxCisjZGVmaW5lCVBDSVRwQm9vdEZyb21MaW5rCTB4MDAKKworI2RlZmluZQlSSU9fUENJX1ZFTkRPUgkJMHgxMUNCCisjZGVmaW5lCVJJT19QQ0lfREVWSUNFCQkweDgwMDAKKyNkZWZpbmUJUklPX1BDSV9CQVNFX0NMQVNTCTB4MDIKKyNkZWZpbmUJUklPX1BDSV9TVUJfQ0xBU1MJMHg4MAorI2RlZmluZQlSSU9fUENJX1BST0dfSUZBQ0UJMHgwMAorCisjZGVmaW5lIFJJT19QQ0lfUklECQkweDAwMDgKKyNkZWZpbmUgUklPX1BDSV9CQURSMAkJMHgwMDEwCisjZGVmaW5lIFJJT19QQ0lfSU5UTE4JCTB4MDAzQworI2RlZmluZSBSSU9fUENJX0lOVFBJTgkJMHgwMDNECisKKyNkZWZpbmUJUklPX1BDSV9NRU1fU0laRQk2NTUzNgorCisjZGVmaW5lCVJJT19QQ0lfVFVSQk9fVFAJMHg4MAorI2RlZmluZQlSSU9fUENJX0ZBU1RfTElOS1MJMHg0MAorI2RlZmluZQlSSU9fUENJX0lOVF9FTkFCTEUJMHgwNAorI2RlZmluZQlSSU9fUENJX1RQX0JVU19FTkFCTEUJMHgwMgorI2RlZmluZQlSSU9fUENJX0JPT1RfRlJPTV9SQU0JMHgwMQorCisjZGVmaW5lCVJJT19QQ0lfREVGQVVMVF9NT0RFCTB4MDUKKworI2VuZGlmCS8qIF9fcmlvX3BjaV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGhiLmggYi9kcml2ZXJzL2NoYXIvcmlvL3BoYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDgzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BoYi5oCkBAIC0wLDAgKzEsMjkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICBQIEggQiAgICAgSCBFIEEgRCBFIFIgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSwgSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6IAorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9waGJfaAorI2RlZmluZSBfcGhiX2ggMQorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcGhiX2hfc2NjcyA9ICJAKCMpcGhiLmgJMS4xMiI7ICovCisjZW5kaWYKKyNlbmRpZgorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIFNldCB0aGUgTElNSVQgdmFsdWVzLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUlRBCisjZGVmaW5lIFJYX0xJTUlUICAgICAgICh1c2hvcnQpIDMKKyNlbmRpZgorI2lmZGVmIEhPU1QKKyNkZWZpbmUgUlhfTElNSVQgICAgICAgKHVzaG9ydCkgMQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhhbmRzaGFrZSBhc3NlcnRlZC4gRGVhc3NlcnRlZCBieSB0aGUgTFRUKHMpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfSEFORFNIQUtFX1NFVCAgICAgICgodXNob3J0KSAweDAwMSkgLyogU2V0IGJ5IExSVCAqLworCisjZGVmaW5lIFBIQl9IQU5EU0hBS0VfUkVTRVQgICAgICgodXNob3J0KSAweDAwMikgLyogU2V0IGJ5IElTUiAvIGRyaXZlciAqLworCisjZGVmaW5lIFBIQl9IQU5EU0hBS0VfRkxBR1MgICAgIChQSEJfSEFORFNIQUtFX1JFU0VUIHwgUEhCX0hBTkRTSEFLRV9TRVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBieSBsdHQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF4aW11bSBudW1iZXIgb2YgUEhCJ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCAoSE9TVCkgfHwgZGVmaW5lZCAoSU5LRVJORUwpCisjZGVmaW5lIE1BWF9QSEIgICAgICAgICAgICAgICAoKHVzaG9ydCkgMTI4KSAgLyogcmFuZ2UgMC0xMjcgKi8KKyNlbHNlCisjZGVmaW5lIE1BWF9QSEIgICAgICAgICAgICAgICAoKHVzaG9ydCkgOCkgICAgLyogcmFuZ2UgMC03ICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZXMgZm9yIHRoZSBtb2RlIGZpZWxkcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFhQS1RfSU5DT01QTEVURSAgICAgICAgMHgwMDAxICAvKiBQcmV2aW91cyB0eCBwYWNrZXQgbm90IGNvbXBsZXRlZCAqLworI2RlZmluZSBUWElOVFJfRU5BQkxFRCAgICAgICAgICAweDAwMDIgIC8qIFR4IGludGVycnVwdCBpcyBlbmFibGVkICovCisjZGVmaW5lIFRYX1RBQjMgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogVEFCMyBtb2RlICovCisjZGVmaW5lIFRYX09DUk5MICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogT0NSTkwgbW9kZSAqLworI2RlZmluZSBUWF9PTkxDUiAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE9OTENSIG1vZGUgKi8KKyNkZWZpbmUgVFhfU0VORFNQQUNFUyAgICAgICAgICAgMHgwMDIwICAvKiBTZW5kIG4gc3BhY2VzIGNvbW1hbmQgbmVlZHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGluZyAqLworI2RlZmluZSBUWF9TRU5ETlVMTCAgICAgICAgICAgICAweDAwNDAgIC8qIEVzY2FwaW5nIE5VTEwgbmVlZHMgY29tcGxldGluZyAqLworI2RlZmluZSBUWF9TRU5ETEYgICAgICAgICAgICAgICAweDAwODAgIC8qIExGIC0+IENSIExGIG5lZWRzIGNvbXBsZXRpbmcgKi8KKyNkZWZpbmUgVFhfUEFSQUxMRUxCVUcgICAgICAgICAgMHgwMTAwICAvKiBDRDE0MDAgTEYgLT4gQ1IgTEYgYnVnIG9uIHBhcmFsbGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAqLworI2RlZmluZSBUWF9IQU5HT1ZFUiAgICAgICAgICAgICAoVFhfU0VORFNQQUNFUyB8IFRYX1NFTkRMRiB8IFRYX1NFTkROVUxMKQorI2RlZmluZSBUWF9EVFJGTE9XCQkweDAyMDAJLyogRFRSIHR4IGZsb3cgY29udHJvbCAqLworI2RlZmluZQlUWF9EVFJGTE9XRUQJCTB4MDQwMAkvKiBEVFIgaXMgbG93IC0gZG9uJ3QgYWxsb3cgbW9yZSBkYXRhCisJCQkJCSAgIGludG8gdGhlIEZJRk8gKi8KKyNkZWZpbmUJVFhfREFUQUlORklGTwkJMHgwODAwCS8qIFRoZXJlIGlzIGRhdGEgaW4gdGhlIEZJRk8gKi8KKyNkZWZpbmUJVFhfQlVTWQkJCTB4MTAwMAkvKiBEYXRhIGluIEZJRk8sIHNoaWZ0IG9yIGhvbGRpbmcgcmVncyAqLworCisjZGVmaW5lIFJYX1NQQVJFCSAgICAgICAgMHgwMDAxICAgLyogU1BBUkUgKi8KKyNkZWZpbmUgUlhJTlRSX0VOQUJMRUQgICAgICAgICAgMHgwMDAyICAgLyogUnggaW50ZXJydXB0IGVuYWJsZWQgKi8KKyNkZWZpbmUgUlhfSUNSTkwgICAgICAgICAgICAgICAgMHgwMDA4ICAgLyogSUNSTkwgbW9kZSAqLworI2RlZmluZSBSWF9JTkxDUiAgICAgICAgICAgICAgICAweDAwMTAgICAvKiBJTkxDUiBtb2RlICovCisjZGVmaW5lIFJYX0lHTkNSICAgICAgICAgICAgICAgIDB4MDAyMCAgIC8qIElHTkNSIG1vZGUgKi8KKyNkZWZpbmUgUlhfQ1RTRkxPVyAgICAgICAgICAgICAgMHgwMDQwICAgLyogQ1RTRkxPVyBlbmFibGVkICovCisjZGVmaW5lIFJYX0lYT0ZGICAgICAgICAgICAgICAgIDB4MDA4MCAgIC8qIElYT0ZGIGVuYWJsZWQgKi8KKyNkZWZpbmUgUlhfQ1RTRkxPV0VEICAgICAgICAgICAgMHgwMTAwICAgLyogQ1RTRkxPVyBhbmQgQ1RTIGRyb3BwZWQgKi8KKyNkZWZpbmUgUlhfSVhPRkZFRCAgICAgICAgICAgICAgMHgwMjAwICAgLyogSVhPRkYgYW5kIHhvZmYgc2VudCAqLworI2RlZmluZSBSWF9CVUZGRVJFRAkJMHgwNDAwCSAvKiBUcnkgYW5kIHBhc3Mgb24gY29tcGxldGUgcGFja2V0cyAqLworCisjZGVmaW5lIFBPUlRfSVNPUEVOICAgICAgICAgICAgIDB4MDAwMSAgLyogUG9ydCBvcGVuPyAqLworI2RlZmluZSBQT1JUX0hVUENMICAgICAgICAgICAgICAweDAwMDIgIC8qIEhhbmd1cCBvbiBjbG9zZT8gKi8KKyNkZWZpbmUgUE9SVF9NT1BFTlBFTkQgICAgICAgICAgMHgwMDA0ICAvKiBNb2RlbSBvcGVuIHBlbmRpbmcgKi8KKyNkZWZpbmUgUE9SVF9JU1BBUkFMTEVMICAgICAgICAgMHgwMDA4ICAvKiBQYXJhbGxlbCBwb3J0ICovCisjZGVmaW5lIFBPUlRfQlJFQUsgICAgICAgICAgICAgIDB4MDAxMCAgLyogUG9ydCBvbiBicmVhayAqLworI2RlZmluZSBQT1JUX1NUQVRVU1BFTkQJCTB4MDAyMCAgLyogU3RhdHVzIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lIFBPUlRfQlJFQUtQRU5EICAgICAgICAgIDB4MDA0MCAgLyogQnJlYWsgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUgUE9SVF9NT0RFTVBFTkQgICAgICAgICAgMHgwMDgwICAvKiBNb2RlbSBzdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUgUE9SVF9QQVJBTExFTEJVRyAgICAgICAgMHgwMTAwICAvKiBDRDE0MDAgTEYgLT4gQ1IgTEYgYnVnIG9uIHBhcmFsbGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAqLworI2RlZmluZSBQT1JUX0ZVTExNT0RFTSAgICAgICAgICAweDAyMDAgIC8qIEZ1bGwgbW9kZW0gc2lnbmFscyAqLworI2RlZmluZSBQT1JUX1JKNDUgICAgICAgICAgICAgICAweDA0MDAgIC8qIFJKNDUgY29ubmVjdG9yIC0gbm8gUkkgc2lnbmFsICovCisjZGVmaW5lIFBPUlRfUkVTVFJJQ1RFRCAgICAgICAgIDB4MDYwMCAgLyogUmVzdHJpY3RlZCBjb25uZWN0b3IgLSBubyBSSSAvIERUUiAqLworCisjZGVmaW5lIFBPUlRfTU9ERU1CSVRTICAgICAgICAgIDB4MDYwMCAgLyogTWFzayBmb3IgbW9kZW0gZmllbGRzICovCisKKyNkZWZpbmUgUE9SVF9XQ0xPU0UgICAgICAgICAgICAgMHgwODAwICAvKiBXYWl0aW5nIGZvciBjbG9zZSAqLworI2RlZmluZQlQT1JUX0hBTkRTSEFLRUZJWAkweDEwMDAJLyogUG9ydCBoYXMgSC9XIGZsb3cgY29udHJvbCBmaXggKi8KKyNkZWZpbmUJUE9SVF9XQVNQQ0xPU0VECQkweDIwMDAJLyogUG9ydCBjbG9zZWQgd2l0aCBQQ0xPU0UgKi8KKyNkZWZpbmUJRFVNUE1PREUJCTB4NDAwMAkvKiBEdW1wIFJUQSBtZW0gKi8KKyNkZWZpbmUJUkVBRF9SRUcJCTB4ODAwMAkvKiBSZWFkIENEMTQwMCByZWdpc3RlciAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQSEIgU3RydWN0dXJlCisgKiBBICBmZXcgd29yZHMuCisgKgorICogTm9ybWFsbHkgUGFja2V0cyBhcmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgcmVtb3ZlZCBmcm9tCisgKiB0aGUgc3RhcnQuIFRoZSBwb2ludGVyIHR4X2FkZCBwb2ludHMgdG8gYSBTUEFDRSB0byBwdXQgYSBQYWNrZXQuCisgKiBUaGUgcG9pbnRlciB0eF9yZW1vdmUgcG9pbnRzIHRvIHRoZSBuZXh0IFBhY2tldCB0byByZW1vdmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBJTktFUk5FTAorI2RlZmluZSBzcmNfdW5pdCAgICAgdTIuczIudW5pdAorI2RlZmluZSBzcmNfcG9ydCAgICAgdTIuczIucG9ydAorI2RlZmluZSBkZXN0X3VuaXQgICAgdTEuczEudW5pdAorI2RlZmluZSBkZXN0X3BvcnQgICAgdTEuczEucG9ydAorI2VuZGlmCisjaWZkZWYgSE9TVAorI2RlZmluZSB0eF9zdGFydCAgICAgdTMuczEudHhfc3RhcnRfcHRyX3B0cgorI2RlZmluZSB0eF9hZGQgICAgICAgdTMuczEudHhfYWRkX3B0cl9wdHIKKyNkZWZpbmUgdHhfZW5kICAgICAgIHUzLnMxLnR4X2VuZF9wdHJfcHRyCisjZGVmaW5lIHR4X3JlbW92ZSAgICB1My5zMS50eF9yZW1vdmVfcHRyX3B0cgorI2RlZmluZSByeF9zdGFydCAgICAgdTQuczEucnhfc3RhcnRfcHRyX3B0cgorI2RlZmluZSByeF9hZGQgICAgICAgdTQuczEucnhfYWRkX3B0cl9wdHIKKyNkZWZpbmUgcnhfZW5kICAgICAgIHU0LnMxLnJ4X2VuZF9wdHJfcHRyCisjZGVmaW5lIHJ4X3JlbW92ZSAgICB1NC5zMS5yeF9yZW1vdmVfcHRyX3B0cgorI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBQSEIgUEhCIDsKK3N0cnVjdCBQSEIgeworI2lmZGVmIFJUQQorICAgICAgICB1c2hvcnQgICAgICBwb3J0OworI2VuZGlmCisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgV09SRCAgICAgIHNvdXJjZTsKKyNlbHNlCisgICAgICAgIHVuaW9uICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICB1c2hvcnQgc291cmNlOyAgICAgICAgICAgICAgLyogQ29tcGxldGUgc291cmNlICovCisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVuaXQ7ICAgICAvKiBTb3VyY2UgdW5pdCAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsgICAgIC8qIFNvdXJjZSBwb3J0ICovCisgICAgICAgICAgICB9IHMyOworICAgICAgICB9IHUyOworI2VuZGlmCisgICAgICAgIFdPUkQgICAgICBoYW5kc2hha2UgOworICAgICAgICBXT1JEICAgICAgc3RhdHVzIDsKKyAgICAgICAgTlVNQkVSICAgICAgIHRpbWVvdXQgOyAgICAgICAgICAgLyogTWF4aW11bSBvZiAxLjkgc2Vjb25kcyAqLworICAgICAgICBXT1JEICAgICAgbGluayA7ICAgICAgICAgICAgICAvKiBTZW5kIGRvd24gdGhpcyBsaW5rICovCisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgV09SRCAgICAgIGRlc3RpbmF0aW9uOworI2Vsc2UKKyAgICAgICAgdW5pb24gICAgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaG9ydCBkZXN0aW5hdGlvbjsgICAgICAgICAvKiBDb21wbGV0ZSBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogRGVzdGluYXRpb24gdW5pdCAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsgICAgIC8qIERlc3RpbmF0aW9uIHBvcnQgKi8KKyAgICAgICAgICAgIH0gczE7CisgICAgICAgIH0gdTE7CisjZW5kaWYKKyNpZmRlZiBSVEEKKyAgICAgICAgdXNob3J0ICAgICAgdHhfcGt0c19hZGRlZDsKKyAgICAgICAgdXNob3J0ICAgICAgdHhfcGt0c19yZW1vdmVkOworICAgICAgICBRX0JVRl9wdHIgICB0eF9xX3N0YXJ0IDsgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBRIGxpc3QgY2hhaW4gKi8KKyAgICAgICAgc2hvcnQgICAgICAgbnVtX3R4X3FfYnVmcyA7ICAgICAvKiBOdW1iZXIgb2YgUSBidWZmZXJzIGluIHRoZSBjaGFpbiAqLworICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGQgOyAgICAgICAgICAgIC8qIEFkZCBhIG5ldyBQYWNrZXQgaGVyZSAqLworICAgICAgICBRX0JVRl9wdHIgICB0eF9hZGRfcWI7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGFkZCBRIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGRfc3RfcWJiIDsgICAgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFEncyBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfYWRkX2VuZF9xYmIgOyAgICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEncyBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfcmVtb3ZlIDsgICAgICAgICAvKiBSZW1vdmUgYSBQYWNrZXQgaGVyZSAqLworICAgICAgICBRX0JVRl9wdHIgICB0eF9yZW1vdmVfcWIgOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlbW92ZSBRIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmVfc3RfcWJiIDsgIC8qIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBRIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmVfZW5kX3FiYiA7IC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSBidWYgKi8KKyNlbmRpZgorI2lmZGVmIElOS0VSTkVMCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X3N0YXJ0IDsKKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfZW5kIDsKKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfYWRkIDsKKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfcmVtb3ZlIDsKKyNlbmRpZgorI2lmZGVmIEhPU1QKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgdHhfc3RhcnRfcHRyX3B0cjsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9lbmRfcHRyX3B0cjsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGRfcHRyX3B0cjsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmVfcHRyX3B0cjsKKyAgICAgICAgICAgIH0gczE7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiB0eF9zdGFydF9wdHI7CisgICAgICAgICAgICAgICAgdXNob3J0ICogdHhfZW5kX3B0cjsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiB0eF9hZGRfcHRyOworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHR4X3JlbW92ZV9wdHI7CisgICAgICAgICAgICB9IHMyOworICAgICAgICB9IHUzOworI2VuZGlmCisKKyNpZmRlZiAgUlRBCisgICAgICAgIHVzaG9ydCAgICAgIHJ4X3BrdHNfYWRkZWQ7CisgICAgICAgIHVzaG9ydCAgICAgIHJ4X3BrdHNfcmVtb3ZlZDsKKyAgICAgICAgUV9CVUZfcHRyICAgcnhfcV9zdGFydCA7ICAgICAgICAvKiBTdGFydCBvZiB0aGUgUSBsaXN0IGNoYWluICovCisgICAgICAgIHNob3J0ICAgICAgIG51bV9yeF9xX2J1ZnMgOyAgICAgLyogTnVtYmVyIG9mIFEgYnVmZmVycyBpbiB0aGUgY2hhaW4gKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkIDsgICAgICAgICAgICAvKiBBZGQgYSBuZXcgUGFja2V0IGhlcmUgKi8KKyAgICAgICAgUV9CVUZfcHRyICAgcnhfYWRkX3FiIDsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBhZGQgUSBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkX3N0X3FiYiA7ICAgICAvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBRJ3MgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZF9lbmRfcWJiIDsgICAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRJ3MgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZSA7ICAgICAgICAgLyogUmVtb3ZlIGEgUGFja2V0IGhlcmUgKi8KKyAgICAgICAgUV9CVUZfcHRyICAgcnhfcmVtb3ZlX3FiIDsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZW1vdmUgUSBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlX3N0X3FiYiA7ICAvKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUSBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlX2VuZF9xYmIgOyAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEgYnVmICovCisjZW5kaWYKKyNpZmRlZiBJTktFUk5FTAorICAgICAgICBQS1RfcHRyX3B0ciByeF9zdGFydCA7CisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2VuZCA7CisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZCA7CisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZSA7CisjZW5kaWYKKyNpZmRlZiBIT1NUCisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3N0YXJ0X3B0cl9wdHI7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgcnhfZW5kX3B0cl9wdHI7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkX3B0cl9wdHI7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlX3B0cl9wdHI7CisgICAgICAgICAgICB9IHMxOworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNob3J0ICogcnhfc3RhcnRfcHRyOworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHJ4X2VuZF9wdHI7CisgICAgICAgICAgICAgICAgdXNob3J0ICogcnhfYWRkX3B0cjsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiByeF9yZW1vdmVfcHRyOworICAgICAgICAgICAgfSBzMjsKKyAgICAgICAgfSB1NDsKKyNlbmRpZgorCisjaWZkZWYgUlRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29tZSBmaWVsZHMgZm9yIHRoZSByZW1vdGVzICovCisgICAgICAgIHVzaG9ydCAgICAgZmx1c2hfY291bnQ7CQkvKiBDb3VudCBvZiB3cml0ZSBmbHVzaGVzICovCisgICAgICAgIHVzaG9ydCAgICAgdHhtb2RlOwkJLyogTW9kZXMgZm9yIHR4ICovCisgICAgICAgIHVzaG9ydCAgICAgcnhtb2RlOwkJLyogTW9kZXMgZm9yIHJ4ICovCisgICAgICAgIHVzaG9ydCAgICAgcG9ydG1vZGU7CQkvKiBHZW5lcmljIG1vZGVzICovCisgICAgICAgIHVzaG9ydCAgICAgY29sdW1uOwkJLyogVEFCMyBjb2x1bW4gY291bnQgKi8KKyAgICAgICAgdXNob3J0ICAgICB0eF9zdWJzY3JpcHQ7CS8qIChUWCkgU3Vic2NyaXB0IGludG8gZGF0YSBmaWVsZCAqLworICAgICAgICB1c2hvcnQgICAgIHJ4X3N1YnNjcmlwdDsJLyogKFJYKSBTdWJzY3JpcHQgaW50byBkYXRhIGZpZWxkICovCisgICAgICAgIFBLVF9wdHIgICAgcnhfaW5jb21wbGV0ZTsJLyogSG9sZCBhbiBpbmNvbXBsZXRlIHBhY2tldCBoZXJlICovCisgICAgICAgIHVzaG9ydCAgICAgbW9kZW1fYml0czsJCS8qIE1vZGVtIGJpdHMgdG8gbWFzayAqLworCXVzaG9ydAkgICBsYXN0TW9kZW07CQkvKiBNb2RlbSBjb250cm9sIGxpbmVzLiAqLworICAgICAgICB1c2hvcnQgICAgIGFkZHI7CQkvKiBBZGRyZXNzIGZvciBzdWIgY29tbWFuZHMgKi8KKyAgICAgICAgdXNob3J0ICAgICBNb25pdG9yVHN0YXRlOwkvKiBUUlVFIGlmIG1vbml0b3JpbmcgdHN0b3AgKi8KKyNlbmRpZgorCisgICAgICAgIH0gOworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BrdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9wa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmJiMmZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wa3QuaApAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9wa3RfaAorI2RlZmluZSBfcGt0X2ggMQorCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19wa3RfaF9zY2NzID0gIkAoIylwa3QuaAkxLjgiOyAqLworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBNQVhfVFRMICAgICAgICAgMHhmCisjZGVmaW5lIFBLVF9DTURfQklUICAgICAoKHVzaG9ydCkgMHgwODApCisjZGVmaW5lIFBLVF9DTURfREFUQSAgICAoKHVzaG9ydCkgMHgwODApCisKKyNkZWZpbmUgUEtUX0FDSyAgICAgICAgICgodXNob3J0KSAweDA0MCkKKworI2RlZmluZSBQS1RfVEdMICAgICAgICAgKCh1c2hvcnQpIDB4MDIwKQorCisjZGVmaW5lIFBLVF9MRU5fTUFTSyAgICAoKHVzaG9ydCkgMHgwN2YpCisKKyNkZWZpbmUgREFUQV9XTkRXICAgICAgICgodXNob3J0KSAweDEwKQorI2RlZmluZSBQS1RfVFRMX01BU0sgICAgKCh1c2hvcnQpIDB4MGYpCisKKyNkZWZpbmUgUEtUX01BWF9EQVRBX0xFTiAgIDcyCisKKyNkZWZpbmUgUEtUX0xFTkdUSCAgICAgICAgIHNpemVvZihzdHJ1Y3QgUEtUKQorI2RlZmluZSBTWU5DX1BLVF9MRU5HVEggICAgKFBLVF9MRU5HVEggKyA0KQorCisjZGVmaW5lIENPTlRST0xfUEtUX0xFTl9NQVNLIFBLVF9MRU5fTUFTSworI2RlZmluZSBDT05UUk9MX1BLVF9DTURfQklUICBQS1RfQ01EX0JJVAorI2RlZmluZSBDT05UUk9MX1BLVF9BQ0sgKFBLVF9BQ0sgPDwgOCkKKyNkZWZpbmUgQ09OVFJPTF9QS1RfVEdMIChQS1RfVEdMIDw8IDgpCisjZGVmaW5lIENPTlRST0xfUEtUX1RUTF9NQVNLIChQS1RfVFRMX01BU0sgPDwgOCkKKyNkZWZpbmUgQ09OVFJPTF9EQVRBX1dORFcgIChEQVRBX1dORFcgPDwgOCkKKworc3RydWN0IFBLVCAgICB7CisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgICAgICAgICAgICBCWVRFICAgIGRlc3RfdW5pdCA7ICAgIC8qIERlc3RpbmF0aW9uIFVuaXQgSWQgKi8KKyAgICAgICAgICAgICAgICAgICBCWVRFICAgIGRlc3RfcG9ydCA7ICAgIC8qIERlc3RpbmF0aW9uIFBPcnQgKi8KKyAgICAgICAgICAgICAgICAgICBCWVRFICAgIHNyY191bml0IDsgICAgIC8qIFNvdXJjZSBVbml0IElkICovCisgICAgICAgICAgICAgICAgICAgQllURSAgICBzcmNfcG9ydCA7ICAgICAvKiBTb3VyY2UgUE9ydCAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICB1bmlvbiAgICAgICAKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBkZXN0aW5hdGlvbjsgICAgICAgICAvKiBDb21wbGV0ZSBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogRGVzdGluYXRpb24gdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogRGVzdGluYXRpb24gcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICB9IHMxOworICAgICAgICAgICAgICAgICAgIH0gdTE7CisgICAgICAgICAgICAgICAgICAgdW5pb24gICAgICAgCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgc291cmNlOyAgICAgICAgICAgICAgLyogQ29tcGxldGUgc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVuaXQ7ICAgICAvKiBTb3VyY2UgdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogU291cmNlIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgfSBzMjsKKyAgICAgICAgICAgICAgICAgICB9IHUyOworI2VuZGlmCisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgICAgICAgICAgICBCWVRFIGxlbiA7CisgICAgICAgICAgICAgICAgICAgQllURSBjb250cm9sOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCAgICAgIGNvbnRyb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHMzOworICAgICAgICAgICAgICAgICAgICB9IHUzOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgQllURSAgICBkYXRhW1BLVF9NQVhfREFUQV9MRU5dIDsgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIGRhdGEgOi0pICovCisgICAgICAgICAgICAgICAgICAgV09SRCAgY3N1bSA7ICAgICAgICAgICAgICAgICAgLyogQy1TVU0gKi8KKyAgICAgICAgICAgICAgIH0gOworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaCBiL2RyaXZlcnMvY2hhci9yaW8vcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjhlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaApAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIFAgTyBMIEwKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3BvbGxfaAorI2RlZmluZSBfcG9sbF9oCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19wb2xsX2hfc2NjcyA9ICJAKCMpcG9sbC5oCTEuMiIgOworI2VuZGlmCisjZW5kaWYKKworCisjaWZkZWYgSE9TVAorI2RlZmluZSBQT0xMX1NUQUNLICAgICAgICAgICAgMTAwCisjZW5kaWYKKyNpZmRlZiBSVEEKKyNkZWZpbmUgUE9MTF9TVEFDSyAgICAgICAgICAgIDIwMAorI2VuZGlmCisKKyNkZWZpbmUgUE9MTF9QRVJJT0QgICAgICAgICAgIChpbnQpIFNFQ09ORAorCisvKiBUaGUgdmFyaW91cyBwb2xsIGNvbW1hbmRzICovCisjZGVmaW5lIFBPTExfUE9MTCAgICAgICAgICAgICAwICAgICAgICAgICAgLyogV2UgYXJlIGNvbm5lY3RlZCBhbmQgaGFwcHkuLiAqLworI2RlZmluZSBQT0xMX0lOVFJPICAgICAgICAgICAgMSAgICAgICAgICAgIC8qIEludHJvZHVjdGlvbiBwYWNrZXQgKi8KKyNkZWZpbmUgUE9MTF9UT1BPTE9HWSAgICAgICAgIDIgICAgICAgICAgICAvKiBUb3BvbG9neSB1cGRhdGUgKi8KKyNkZWZpbmUgUE9MTF9BU1NJR04gICAgICAgICAgIDMgICAgICAgICAgICAvKiBJRCBhc3NpZ24gKi8KKyNkZWZpbmUgUE9MTF9GT0FEICAgICAgICAgICAgIDQgICAgICAgICAgICAvKiBGKioqIE9mZiBBbmQgRGllICovCisjZGVmaW5lIFBPTExfTE1ECSAgICAgIDUJCSAgIC8qIExldCBNZSBEaWUgKi8KKyNkZWZpbmUgUE9MTF9EWUIJICAgICAgNgkJICAgLyogRGllIFlvdSBCYSoqKioqICovCisKKy8qIFRoZSB3YXkgZGF0YSBmaWVsZHMgYXJlIHNwbGl0IHVwIGZvciBQT0xMIHBhY2tldHMgKi8KKyNkZWZpbmUgUE9MTF9IT1NUX1NFUklBTCAgICAgIDIgICAgICAgICAgICAvKiBIb3N0IHdobyBib290ZWQgbWUgKi8KKyNkZWZpbmUgUE9MTF9NWV9TRVJJQUwgICAgICAgIDYgICAgICAgICAgICAvKiBNeSBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lIFBPTExfWU9VUl9JRCAgICAgICAgICAxICAgICAgICAgICAgLyogWW91ciBJRCBudW1iZXIgKi8KKyNkZWZpbmUgUE9MTF9UT1BPTE9HWV9GSUVMRFMgIDIgICAgICAgICAgICAvKiBUb3BvbG9neSBtYXBzICovCisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BvcnQuaCBiL2RyaXZlcnMvY2hhci9yaW8vcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDZhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BvcnQuaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcG9ydC5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpcG9ydC5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX3BvcnRfaF9fCisjZGVmaW5lCV9fcmlvX3BvcnRfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9wb3J0X2hfc2Njc18gPSAiQCgjKXBvcnQuaAkxLjMiOworI2VuZGlmCisKKworI3VuZGVmIFZQSVgKKworCisvKgorKiogdGhlIHBvcnQgZGF0YSBzdHJ1Y3R1cmUgLSBvbmUgcGVyIHBvcnQgaW4gdGhlIHN5c3RlbQorKi8KKworI2lmZGVmIFNUQVRTCitzdHJ1Y3QgUklPU3RhdHMKK3sKKwkvKgorCSoqIGludGVycnVwdCBzdGF0aXN0aWNzCisJKi8KKwl1aW50CUJyZWFrSW50Q250OworCXVpbnQJTW9kZW1PZmZDbnQ7CisJdWludAlNb2RlbU9uQ250OworCXVpbnQJUnhJbnRDbnQ7CisJdWludAlUeEludENudDsKKwkvKgorCSoqIHRocm91Z2hwdXQgc3RhdGlzdGljcworCSovCisJdWludAlSeENoYXJDbnQ7CisJdWludAlSeFBrdENudDsKKwl1aW50CVJ4U2F2ZUNudDsKKwl1aW50CVR4Q2hhckNudDsKKwl1aW50CVR4UGt0Q250OworCS8qCisJKiogZHJpdmVyIGVudHJ5IHN0YXRpc3RpY3MKKwkqLworCXVpbnQJQ2xvc2VDbnQ7CisJdWludAlJb2N0bENudDsKKwl1aW50CU9wZW5DbnQ7CisJdWludAlSZWFkQ250OworCXVpbnQJV3JpdGVDbnQ7CisJLyoKKwkqKiBwcm9jIHN0YXRpc3RpY3MKKwkqLworCXVpbnQJQmxvY2tDbnQ7CisJdWludAlPdXRwdXRDbnQ7CisJdWludAlSZXN1bWVDbnQ7CisJdWludAlSZmx1c2hDbnQ7CisJdWludAlTdXNwZW5kQ250OworCXVpbnQJVGJyZWFrQ250OworCXVpbnQJVGltZW91dENudDsKKwl1aW50CVVuYmxvY2tDbnQ7CisJdWludAlXZmx1c2hDbnQ7CisJdWludAlXRkJvZGdlQ250OworfTsKKyNlbmRpZgorCisvKgorKioJUG9ydCBkYXRhIHN0cnVjdHVyZQorKi8KK3N0cnVjdAlQb3J0Cit7CisgIHN0cnVjdCBnc19wb3J0IGdzOyAKKyAgaW50CQkJCVBvcnROdW07CS8qIFJJTyBwb3J0IG5vLiwgMC01MTEgKi8KKyAgc3RydWN0IEhvc3QJKkhvc3RQOworICB2b2xhdGlsZSBjYWRkcl90CQlDYWRkcjsKKyAgdXNob3J0CQkJSG9zdFBvcnQ7ICAvKiBQb3J0IG51bWJlciBvbiBob3N0IGNhcmQgKi8KKyAgdWNoYXIJCQlSdXBOdW07CS8qIE51bWJlciBvZiBSVVAgZm9yIHBvcnQgKi8KKyAgdWNoYXIJCQlJRDI7CS8qIFNlY29uZCBJRCBvZiBSVEEgZm9yIHBvcnQgKi8KKyAgdWxvbmcJCQlTdGF0ZTsJLyogRkxBR1MgZm9yIG9wZW4gJiB4b3BlbiAqLworI2RlZmluZQlSSU9fTE9QRU4JMHgwMDAwMQkJLyogTG9jYWwgb3BlbiAqLworI2RlZmluZQlSSU9fTU9QRU4JMHgwMDAwMgkJLyogTW9kZW0gb3BlbiAqLworI2RlZmluZQlSSU9fV09QRU4JMHgwMDAwNAkJLyogV2FpdGluZyBmb3Igb3BlbiAqLworI2RlZmluZQlSSU9fQ0xPU0lORwkweDAwMDA4CQkvKiBUaGUgcG9ydCBpcyBiZWluZyBjbG9zZSAqLworI2RlZmluZQlSSU9fWFBCVVNZCTB4MDAwMTAJCS8qIFRyYW5zcGFyZW50IHByaW50ZXIgYnVzeSAqLworI2RlZmluZQlSSU9fQlJFQUtJTkcJMHgwMDAyMAkJLyogQnJlYWsgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJUklPX0RJUkVDVAkweDAwMDQwCQkvKiBEb2luZyBEaXJlY3Qgb3V0cHV0ICovCisjZGVmaW5lCVJJT19FWENMVVNJVkUJMHgwMDA4MAkJLyogU3RyZWFtIG9wZW4gZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKyNkZWZpbmUJUklPX05ERUxBWQkweDAwMTAwCQkvKiBTdHJlYW0gaXMgb3BlbiBGTkRFTEFZICovCisjZGVmaW5lCVJJT19DQVJSX09OCTB4MDAyMDAJCS8qIFN0cmVhbSBoYXMgY2FycmllciBwcmVzZW50ICovCisjZGVmaW5lCVJJT19YUFdBTlRSCTB4MDA0MDAJCS8qIFN0cmVhbSB3YW50ZWQgYnkgWHByaW50ICovCisjZGVmaW5lCVJJT19SQkxLCTB4MDA4MDAJCS8qIFN0cmVhbSBpcyByZWFkLWJsb2NrZWQgKi8KKyNkZWZpbmUJUklPX0JVU1kJMHgwMTAwMAkJLyogU3RyZWFtIGlzIEJVU1kgZm9yIHdyaXRlICovCisjZGVmaW5lCVJJT19USU1FT1VUCTB4MDIwMDAJCS8qIFN0cmVhbSB0aW1lb3V0IGluIHByb2dyZXNzICovCisjZGVmaW5lCVJJT19UWFNUT1AJMHgwNDAwMAkJLyogU3RyZWFtIG91dHB1dCBpcyBzdG9wcGVkICovCisjZGVmaW5lCVJJT19XQUlURkxVU0gJMHgwODAwMAkJLyogU3RyZWFtIHdhaXRpbmcgZm9yIGZsdXNoICovCisjZGVmaW5lCVJJT19EWU5PUk9ECTB4MTAwMDAJCS8qIERyYWluIGZhaWxlZCAqLworI2RlZmluZQlSSU9fREVMRVRFRAkweDIwMDAwCQkvKiBSVEEgaGFzIGJlZW4gZGVsZXRlZCAqLworI2RlZmluZSBSSU9fSVNTQ0FOQ09ERQkweDQwMDAwCQkvKiBUaGlzIGxpbmUgaXMgaW4gc2NhbmNvZGUgbW9kZSAqLworI2RlZmluZQlSSU9fVVNJTkdfRVVDCTB4MTAwMDAwCS8qIFVzaW5nIGV4dGVuZGVkIFVuaXggY2hhcnMgKi8KKyNkZWZpbmUJUklPX0NBTl9DT09LCTB4MjAwMDAwCS8qIFRoaXMgbGluZSBjYW4gZG8gY29va2luZyAqLworI2RlZmluZSBSSU9fVFJJQURfTU9ERSAgMHg0MDAwMDAgICAgICAgIC8qIEVuYWJsZSBUUklBRCBzcGVjaWFsIG9wcy4gKi8KKyNkZWZpbmUgUklPX1RSSUFEX0JMT0NLIDB4ODAwMDAwICAgICAgICAvKiBOZXh0IHJlYWQgd2lsbCBibG9jayAqLworI2RlZmluZSBSSU9fVFJJQURfRlVOQyAgMHgxMDAwMDAwICAgICAgIC8qIFNlZW4gYSBmdW5jdGlvbiBrZXkgY29taW5nIGluICovCisjZGVmaW5lIFJJT19USFJPVFRMRV9SWCAweDIwMDAwMDAgICAgICAgLyogUlggbmVlZHMgdG8gYmUgdGhyb3R0bGVkLiAqLworCisgICAgdWxvbmcJCQlDb25maWc7CS8qIEZMQUdTIGZvciBOT1JFQUQuLi4uICovCisjZGVmaW5lCVJJT19OT1JFQUQJMHgwMDAxCQkvKiBBcmUgbm90IGFsbG93ZWQgdG8gcmVhZCBwb3J0ICovCisjZGVmaW5lCVJJT19OT1dSSVRFCTB4MDAwMgkJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHdyaXRlIHBvcnQgKi8KKyNkZWZpbmUJUklPX05PWFBSSU5UCTB4MDAwNAkJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHhwcmludCBwb3J0ICovCisjZGVmaW5lCVJJT19OT01BU0sJMHgwMDA3CQkvKiBBbGwgbm90IGFsbG93ZWQgdGhpbmdzICovCisjZGVmaW5lIFJJT19JWEFOWQkweDAwMDggICAgICAgICAgLyogUG9ydCBpcyBhbGxvd2VkIGl4YW55ICovCisjZGVmaW5lCVJJT19NT0RFTQkweDAwMTAJCS8qIFN0cmVhbSBpcyBhIG1vZGVtIGRldmljZSAqLworI2RlZmluZQlSSU9fSVhPTgkweDAwMjAJCS8qIFBvcnQgaXMgYWxsb3dlZCBpeG9uICovCisjZGVmaW5lIFJJT19XQUlURFJBSU4JMHgwMDQwCQkvKiBXYWl0IGZvciBwb3J0IHRvIGNvbXBsZXRlbHkgZHJhaW4gKi8KKyNkZWZpbmUgUklPX01BUF81MF9UT181MAkweDAwODAJLyogTWFwIDUwIGJhdWQgdG8gNTAgYmF1ZCAqLworI2RlZmluZSBSSU9fTUFQXzExMF9UT18xMTAJMHgwMTAwCS8qIE1hcCAxMTAgYmF1ZCB0byAxMTAgYmF1ZCAqLworCisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjEgcHJ0IGZpeAorKiogQXMgTHlueE9TIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEhhcmR3YXJlIEZsb3cgQ29udHJvbCAuLi4uLgorKiogRGVmaW5lIG91ciBvd24gZmxvdyBjb250cm9sIGZsYWdzIGluICdDb25maWcnLgorKi8KKyNkZWZpbmUgUklPX0NUU0ZMT1cJMHgwMjAwCQkvKiBSSU8ncyBvd24gQ1RTRkxPVyBmbGFnICovCisjZGVmaW5lIFJJT19SVFNGTE9XCTB4MDQwMAkJLyogUklPJ3Mgb3duIFJUU0ZMT1cgZmxhZyAqLworCisKKyAgICBzdHJ1Y3QgUEhCCQkJKlBoYlA7CSAgLyogcG9pbnRlciB0byBQSEIgZm9yIHBvcnQgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlR4QWRkOyAgIC8qIEFkZCBwYWNrZXRzIGhlcmUgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlR4U3RhcnQ7IC8qIFN0YXJ0IG9mIGFkZCBhcnJheSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqVHhFbmQ7ICAgICAgICAgLyogRW5kIG9mIGFkZCBhcnJheSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqUnhSZW1vdmU7ICAgICAgLyogUmVtb3ZlIHBhY2tldHMgaGVyZSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqUnhTdGFydDsgICAgICAgLyogU3RhcnQgb2YgcmVtb3ZlIGFycmF5ICovCisgICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICpSeEVuZDsgICAgICAgICAvKiBFbmQgb2YgcmVtb3ZlIGFycmF5ICovCisgICAgdWludAkJCVJ0YVVuaXF1ZU51bTsJLyogVW5pcXVlIG51bWJlciBvZiBSVEEgKi8KKyAgICB1c2hvcnQJCQlQb3J0U3RhdGU7CS8qIHN0YXR1cyBvZiBwb3J0ICovCisgICAgdXNob3J0CQkJTW9kZW1TdGF0ZTsJLyogc3RhdHVzIG9mIG1vZGVtIGxpbmVzICovCisgICAgdWxvbmcJCQlNb2RlbUxpbmVzOwkvKiBNb2RlbSBiaXRzIHNlbnQgdG8gUlRBICovCisgICAgdWNoYXIJCQlDb29rTW9kZTsJLyogd2hvIGV4cGFuZHMgQ1IvTEY/ICovCisgICAgdWNoYXIJCQlQYXJhbVNlbTsJLyogUHJldmVudCB3cml0ZSBkdXJpbmcgcGFyYW0gKi8KKyAgICB1Y2hhcgkJCU1hcHBlZDsJCS8qIGlmIHBvcnQgbWFwcGVkIG9udG8gaG9zdCAqLworICAgIHVjaGFyCQkJU2Vjb25kQmxvY2s7CS8qIGlmIHBvcnQgYmVsb25ncyB0byAybmQgYmxvY2sKKwkJCQkJCSAgIG9mIDE2IHBvcnQgUlRBICovCisgICAgdWNoYXIJCQlJblVzZTsJCS8qIGhvdyBtYW55IHByZS1lbXB0aXZlIGNtZHMgKi8KKyAgICB1Y2hhcgkJCUxvY2s7CQkvKiBpZiBwYXJhbXMgbG9ja2VkICovCisgICAgdWNoYXIJCQlTdG9yZTsJLyogaWYgcGFyYW1zIHN0b3JlZCBhY3Jvc3MgY2xvc2VzICovCisgICAgdWNoYXIJCQlGaXJzdE9wZW47IC8qIFRSVUUgaWYgZmlyc3QgdGltZSBwb3J0IG9wZW5lZCAqLworICAgIHVjaGFyCQkJRmx1c2hDbWRCb2RnZTsJLyogaWYgZG9pbmcgYSAobm9uKWZsdXNoICovCisgICAgdWNoYXIJCQlNYWdpY0ZsYWdzOwkvKiByZXF1aXJlIGludHIgcHJvY2Vzc2luZyAqLworI2RlZmluZQlNQUdJQ19GTFVTSAkweDAxCS8qIG1pcnJvciBvZiBXZmx1c2hGbGFnICovCisjZGVmaW5lCU1BR0lDX1JFQk9PVAkweDAyCS8qIFJUQSByZS1ib290ZWQsIHJlLW9wZW4gcG9ydHMgKi8KKyNkZWZpbmUJTU9SRV9PVVRQVVRfRVlHT1IgMHgwNAkvKiByaW90cHJvYyBmYWlsZWQgdG8gZW1wdHkgY2xpc3RzICovCisgICAgdWNoYXIJCQlXZmx1c2hGbGFnOwkvKiAxIEhvdyBtYW55IFdGTFVTSHMgYWN0aXZlICovCisvKgorKiogVHJhbnNwYXJlbnQgcHJpbnQgc3R1ZmYKKyovCisgICAgc3RydWN0IFhwcmludAorICAgIHsKKyNpZm5kZWYgTUFYX1hQX0NUUkxfTEVOCisjZGVmaW5lIE1BWF9YUF9DVFJMX0xFTgkJMTYJCS8qIEFMU08gSU4gREFFTU9OLkggKi8KKyNlbmRpZgorCXVpbnQJCQlYcENwczsKKwljaGFyCQkJWHBPbltNQVhfWFBfQ1RSTF9MRU5dOworCWNoYXIJCQlYcE9mZltNQVhfWFBfQ1RSTF9MRU5dOworCXVzaG9ydAkJCVhwTGVuOwkJLyogc3RybGVuKFhwT24pK3N0cmxlbihYcE9mZikgKi8KKwl1Y2hhcgkJCVhwQWN0aXZlOworCXVjaGFyCQkJWHBMYXN0VGlja09rOwkvKiBUUlVFIGlmIHdlIGNhbiBwcm9jZXNzICovCisjZGVmaW5lCVhQX09QRU4JCTAwMDAxCisjZGVmaW5lCVhQX1JVTkFCTEUJMDAwMDIKKwlzdHJ1Y3QgdHR5c3RhdGljcyAJCSpYdHR5UDsKKyAgICB9IFhwcmludDsKKyNpZmRlZiBWUElYCisgICAgdjg2X3QJCQkqU3Rhc2hQOworICAgIHVpbnQJCQlJbnRNYXNrOworICAgIHN0cnVjdCB0ZXJtc3MgCQlWcGl4U3M7CisgICAgdWNoYXIJCQlNb2RlbVN0YXR1c1JlZzsJLyogTW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCisjZW5kaWYKKyAgICB1Y2hhcgkJCVJ4RGF0YVN0YXJ0OworICAgIHVjaGFyCQkJQ29yMkNvcHk7CS8qIGNvcHkgb2YgQ09SMiAqLworICAgIGNoYXIJCQkqTmFtZTsJCS8qIHBvaW50cyB0byB0aGUgUnRhJ3MgbmFtZSAqLworI2lmZGVmIFNUQVRTCisgICAgc3RydWN0IFJJT1N0YXRzIAkJU3RhdDsJCS8qIHBvcnRzIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorICAgIGNoYXIJCQkqVHhSaW5nQnVmZmVyOworICAgIHVzaG9ydAkJCVR4QnVmZmVySW47CS8qIE5ldyBkYXRhIGFycml2ZXMgaGVyZSAqLworICAgIHVzaG9ydAkJCVR4QnVmZmVyT3V0OwkvKiBJbnRyIHJlbW92ZXMgZGF0YSBoZXJlICovCisgICAgdXNob3J0CQkJT2xkVHhCdWZmZXJPdXQ7CS8qIEluZGljYXRlcyBpZiBkcmFpbmluZyAqLworICAgIGludAkJCQlUaW1lb3V0SWQ7CS8qIFRpbWVvdXQgSUQgKi8KKyAgICB1aW50CQkJRGVidWc7CisgICAgdWNoYXIJCQlXYWl0VW50aWxCb290ZWQ7IC8qIFRydWUgaWYgb3BlbiBzaG91bGQgYmxvY2sgKi8KKyAgICB1aW50CQkJc3RhdHNHYXRoZXI7CS8qIFRydWUgaWYgZ2F0aGVyaW5nIHN0YXRzICovCisgICAgdWxvbmcJCQl0eGNoYXJzOwkvKiBDaGFycyB0cmFuc21pdHRlZCAqLworICAgIHVsb25nCQkJcnhjaGFyczsJLyogQ2hhcnMgcmVjZWl2ZWQgKi8KKyAgICB1bG9uZwkJCW9wZW5zOwkJLyogcG9ydCBvcGVuIGNvdW50ICovCisgICAgdWxvbmcJCQljbG9zZXM7CQkvKiBwb3J0IGNsb3NlIGNvdW50ICovCisgICAgdWxvbmcJCQlpb2N0bHM7CQkvKiBpb2N0bCBjb3VudCAqLworICAgIHVjaGFyCQkJTGFzdFJ4VGdsOwkvKiBMYXN0IHN0YXRlIG9mIHJ4IHRvZ2dsZSBiaXQgKi8KKyAgc3BpbmxvY2tfdAkJCQlwb3J0U2VtOwkvKiBMb2NrIHVzaW5nIHRoaXMgc2VtICovCisJaW50CQkJCU1vbml0b3JUc3RhdGU7CS8qIE1vbml0b3JpbmcgPyAqLworCWludAkJCQl0aW1lb3V0X2lkOwkvKiBGb3IgY2FsbGluZyAxMDAgbXMgZGVsYXlzICovCisJaW50CQkJCXRpbWVvdXRfc2VtOy8qIEZvciBjYWxsaW5nIDEwMCBtcyBkZWxheXMgKi8KKwlpbnQJCQkJZmlyc3RPcGVuOwkvKiBGaXJzdCB0aW1lIG9wZW4gPyAqLworCWNoYXIgKgkJCXA7CQkJLyogc2F2ZSB0aGUgZ2xvYmFsIHN0cnVjIGhlcmUgLi4gKi8KK307CisKK3N0cnVjdCBNb2R1bGVJbmZvCit7CisJY2hhcgkqTmFtZTsKKwl1aW50CUZsYWdzWzRdOwkvKiBvbmUgcGVyIHBvcnQgb24gYSBtb2R1bGUgKi8KK307CisjZW5kaWYKKworLyoKKyoqIFRoaXMgc3RydWN0IGlzIHJlcXVpcmVkIGJlY2F1c2UgdHJ5aW5nIHRvIGdyYWIgYW4gZW50aXJlIFBvcnQgc3RydWN0dXJlCisqKiBydW5zIGludG8gcHJvYmxlbXMgd2l0aCBkaWZmZXJpbmcgc3RydWN0IHNpemVzIGJldHdlZW4gZHJpdmVyIGFuZCBjb25maWcuCisqLworc3RydWN0IFBvcnRQYXJhbXMgeworCXVpbnQJUG9ydDsKKwl1bG9uZwlDb25maWc7CisJdWxvbmcJU3RhdGU7CisJc3RydWN0IHR0eXN0YXRpY3MJKlR0eVA7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wcm90by5oIGIvZHJpdmVycy9jaGFyL3Jpby9wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Byb3RvLmgKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZglfcHJvdG90eXBlc19oCisjZGVmaW5lIF9wcm90b3R5cGVzX2gKKworCisvKgorKiogYm9vdC5jCisqLwordm9pZCBpbml0X2Jvb3QoIGNoYXIgKnAsIHNob3J0IHN0YWdlKTsKKworLyoKKyoqIGRpc2NvbmN0LmMKKyovCit2b2lkIGtpbGxfYm9vdCAoIExQQiAqbGluayApOwordm9pZCBkaXNjb25uZWN0ZWQoIExQQiAqbGluayApOworc2hvcnQgYm9vdF8zKCBMUEIgKmxpbmssIFBLVCAqcGt0ICk7CitzaG9ydCBzZW5kXzNfcGt0KCBMUEIgKmxpbmssIFBLVCAqcGt0KTsKKworLyoKKyoqIGVycm9yLmMKKyovCit2b2lkIGR1X2Vycm9yKHZvaWQpOworCisvKgorKiogZm9ybXBrdC5jCisqLwordXNob3J0IHN1bV9pdCggUEtUICpwa3QgKSA7Cit2b2lkIGZvcm1fcnVwX3BrdCggUlVQICpmb3JtX3J1cCwgUEtUICpwa3QgKTsKK3ZvaWQgZm9ybV9wb2xsX3BrdCAoIGludCB0eXBlLCBMUEIgKmxpbmssIGludCBub2RlICk7Cit2b2lkIGZvcm1fcm91dGVfcGt0ICggaW50IHR5cGUsIFBLVCAqcGt0LCBMUEIgKmxpbmsgKTsKKworLyoKKyoqIGlkbGUuYworKi8KK3ZvaWQgaWRsZSggUHJvY2VzcyAqaWRsZV9wICk7CisKKy8qCisqKiBpbml0LmMKKyovCit2b2lkIGdlbmVyYWxfaW5pdCh2b2lkKTsKK3ZvaWQgbWVtX2hhbHQoIGludCBlcnJvcik7CisKKy8qCisqKiBsaW5raW5pdC5jCisqLwordm9pZCBpbml0bGluayggdV9zaG9ydCBudW1iZXIsIExQQiAqbGluayk7Cit2b2lkIHJ1bmxpbmsoIExQQiAqbGluayk7CisKKy8qCisqKiBsaXN0LmMKKyovCitQS1QgKmdldF9mcmVlX3N0YXJ0KHZvaWQpOwordm9pZCBwdXRfZnJlZV9zdGFydCggUEtUICpwa3QpOworCisjaWZkZWYgSE9TVAoraW50IGNhbl9yZW1vdmVfdHJhbnNtaXQgKCBQS1QgKipwa3QsIFBLVCAqcG9pbnRlciApOworI2VuZGlmCisKKyNpZmRlZiBSVEEKK2ludCBzcGw3ICggdm9pZCApOworaW50IHNwbDAgKCB2b2lkICk7CitRX0JVRiAqZ2V0X2ZyZWVfcSggdm9pZCApOworUEtUICpnZXRfZnJlZV9lbmQodm9pZCk7CitpbnQgYWRkX2VuZCggUEtUICpwa3QsIFBIQiAqcGhiLCBpbnQgdHlwZSk7Cit1bnNpZ25lZCBzaG9ydCBmcmVlX3BhY2tldHMoIFBIQiAqcGhiLCBpbnQgdHlwZSk7CitpbnQgY2FuX3JlbW92ZV9zdGFydCggUEtUICoqcGt0LCBQSEIgKnBoYiwgaW50IHR5cGUpOworaW50IGNhbl9hZGRfc3RhcnQoIFBIQiAqcGhiLCBpbnQgdHlwZSk7CitpbnQgY2FuX2FkZF9lbmQoIFBIQiAqcGhiLCBpbnQgdHlwZSk7Cit2b2lkIHB1dF9mcmVlX2VuZCggUEtUICpwa3QpOworaW50IHJlbW92ZV9zdGFydCggUEtUICoqcGt0LCBQSEIgKnBoYiwgaW50IHR5cGUpOworI2VuZGlmCisKKy8qCisqKiBMcnQuYworKi8KK3ZvaWQgbHJ0KCBQcm9jZXNzICpscnRfcCwgTFBCICpsaW5rICk7CisKKyNpZmRlZiBSVEEKK3ZvaWQgc2V0X2xlZF9yZWQgKCBMUEIgKmxpbmsgKTsKKyNlbmRpZgorCisvKgorKiogbHR0LmMKKyovCit2b2lkIGx0dCggUHJvY2VzcyAqbHR0X3AsIExQQiAqbGluaywgUEhCICpwaGJfcHRyW10gKTsKK3ZvaWQgc2VuZF9wb2xsICggTFBCICpsaW5rICk7Cit2b2lkIHJlcXVlc3RfaWQgKCBMUEIgKmxpbmsgKTsKK3ZvaWQgc2VuZF90b3BvbG9neV91cGRhdGUgKCBMUEIgKmxpbmsgKTsKK3ZvaWQgc2VuZF90b3BvbG9neSAoIExQQiAqbGluayApOwordm9pZCBzdXBwbHlfaWQgKCBMUEIgKmxpbmsgKTsKKworI2lmZGVmIFJUQQordm9pZCByZWRpcmVjdF9xdWV1ZSAoIExQQiAqbGluaywgdXNob3J0IGZsdXNoICk7CitpbnQgb2J0YWluX3J1cCAoIGludCBydXBfbnVtYmVyLCBQS1QgKipwa3RfYWRkcmVzcywgTFBCICpsaW5rICk7CisjZW5kaWYKKworI2lmZGVmIFRFU1RJTkdfUEVSRgoraW50IGNvbnN1bWVfY3B1KCB2b2lkICk7CisjZW5kaWYKKworLyoKKyoqIGx0dHdha2UuYworKi8KKyNpZmRlZiBIT1NUCit2b2lkIGx0dF93YWtldXAoIFByb2Nlc3MgKmx0dF93YWtldXBfcCApOworI2VuZGlmCisKKy8qCisqKiBtYXBnZW4uYworKi8KK3ZvaWQgZ2VuZXJhdGVfaWRfbWFwKCBzaG9ydCBtYXBwaW5nLCBST1VURV9TVFIgcm91dGVbXSApOwordm9pZCBnZW5fbWFwKCBpbnQgbWFwcGluZywgaW50IGxvb2tpbmdfYXQsIGludCBjb21lX2Zyb20sIFJPVVRFX1NUUiByb3V0ZVtdLCBpbnQgbGluaywgaW50ICp0dGwgKTsKK3ZvaWQgYWRqdXN0X3R0bCggaW50IG1hcHBpbmcsIGludCBsb29raW5nX2F0LCBpbnQgY29tZV9mcm9tLCBST1VURV9TVFIgcm91dGVbXSwgaW50IGxpbmssIGludCAqdHRsKTsKK3ZvaWQgaW5pdF9zeXNfbWFwKHZvaWQpOworCisvKgorKiogbW11LmMKKyovCitjaGFyICpyaW9fbWFsbG9jKCB1bnNpZ25lZCBpbnQgYW1vdW50KTsKK2NoYXIgKnJpb19jYWxsb2MoIHVuc2lnbmVkIGludCBudW0sIHVuc2lnbmVkIGludCBzaXplKTsKK0VSUk9SIHJpb19tbXVfaW5pdCggdWludCB0b3RhbF9tZW0gKTsKKworLyoKKyoqIHBhcnRuLmMKKyovCit2b2lkIHBhcnRpdGlvbl90eCggc3RydWN0IFBIQiAqcGhiLCB1X3Nob3J0IHR4X3NpemUsIHVfc2hvcnQgcnhfc2l6ZSwgdV9zaG9ydCByeF9saW1pdCk7CisKKy8qCisqKiBwb2xsLmMKKyovCit2b2lkIHR4X3BvbGwoIFByb2Nlc3MgKnR4X3BvbGxfcCk7CisKKy8qCisqKiBwcm9jZXNzLmMKKyovCitpbnQgIGdldF9wcm9jX3NwYWNlKCBQcm9jZXNzICoqcGQsIGludCAqKnB3cywgaW50IHdzc2l6ZSk7CisKKy8qCisqKiByZWFkcm9tLmMKKyovCit2b2lkIHJlYWRfc2VyaWFsX251bWJlcihjaGFyICpidWYpOworCisvKgorKiogcmlvLmMKKyovCitpbnQgbWFpbiggdm9pZCApOworCisvKgorKiogcm91dGUuYworKi8KK3ZvaWQgcm91dGVfdXBkYXRlICggUEtUICpwa3QsIExQQiAqbGluayk7CisKKy8qCisqKiBydGFpbml0LmMKKyovCisjaWYgZGVmaW5lZChSVEEpCit2b2lkIHJ0YV9pbml0KHVzaG9ydCBSdGFUeXBlKTsKKyNlbmRpZiAvKiBkZWZpbmVkKFJUQSkgKi8KKworLyoKKyoqIHJ1cGJvb3QuYworKi8KK3ZvaWQgcnVwX2Jvb3QoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmspOworCisjaWZkZWYgUlRBCit2b2lkIGtpbGxfeW91cl9uZWlnaGJvdXIoIGludCBsaW5rX3RvX2tpbGwgKTsKKyNlbmRpZgorCisvKgorKiogcnVwY21kLmMKKyovCit2b2lkIHJ1cF9jb21tYW5kKCBQS1QgKnBrdCwgc3RydWN0IFJVUCAqdGhpc19ydXAsIExQQiAqbGluayk7CisKKy8qCisqKiBydXBlcnIuYworKi8KK3ZvaWQgcnVwX2Vycm9yKCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rICk7Cit2b2lkIGlsbGVnYWxfY21kKCBQS1QgKnNyY19wa3QgKTsKKworLyoKKyoqIHJ1cHBvbGwuYworKi8KK3ZvaWQgcnVwX3BvbGwoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmsgKTsKKworLyoKKyoqIHJ1cHBvd2VyLmMKKyovCit2b2lkIHJ1cF9wb3dlciggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayApOworCisvKgorKiogcnVwcm0uYworKi8KK3ZvaWQgcnVwX3JvdXRlX21hcCggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayk7CisKKy8qCisqKiBydXBzdGF0LmMKKyovCit2b2lkIHJ1cF9zdGF0dXMoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmspOworCisvKgorKiogcnVwc3luYy5jCisqLwordm9pZCBydXBfc3luYyggUEtUICpwa3QpOworCisvKgorKiogcnhwa3QuYworKi8KK0VSUk9SICByeF9wa3QoIFBLVF9wdHJfcHRyIHBrdF9hZGRyZXNzLCBMUEIgKmxpbmspOworCisvKgorKiogc2VuZHN0cy5jCisqLwordm9pZCBzZW5kX3N0YXR1cyggUEtUICpyZXF1ZXN0aW5nX3BrdCwgUlVQICp0aGlzX3J1cCk7CisKKy8qCisqKiBzZXJpYWwuYworKi8KK3ZvaWQgYXNzaWduX3NlcmlhbCAoIGNoYXIgKnNlcl9pbiwgY2hhciAqc2VyX291dCk7CitpbnQgY21wX3NlcmlhbCAoIGNoYXIgKnNlcl8xLCBjaGFyICpzZXJfMik7CisKKy8qCisqKiB0eHBrdC5jCisqLworRVJST1IgIHR4X3BrdCggUEtUICpwa3QsIExQQiAqbGluayk7CitzaG9ydCBzZW5kX3N5bmMoIExQQiAqbGluayk7CisKKyNlbmRpZgkvKiBfcHJvdG90eXBlc19oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Byb3RzdHMuaCBiL2RyaXZlcnMvY2hhci9yaW8vcHJvdHN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODExMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Byb3RzdHMuaApAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgIFAgUiBPIFQgTyBDIE8gTCAgICBTIFQgQSBUIFUgUyAgIFMgVCBSIFUgQyBUIFUgUiBFICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcHJvdHN0c19oCisjZGVmaW5lIF9wcm90c3RzX2ggMQorCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19wcm90c3RzX2hfc2NjcyA9ICJAKCMpcHJvdHN0cy5oCTEuNCI7ICovCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQUNLIGJpdC4gTGFzdCBQYWNrZXQgcmVjZWl2ZWQgT0suIFNldCBieQorICogcnhwa3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUGFja2V0IGhhcyBiZWVuCisgKiByZWNlaXZlZCBPSyBhbmQgdGhhdCB0aGUgTFRUIG11c3Qgc2V0IHRoZSBBQ0sKKyAqIGJpdCBpbiB0aGUgbmV4dCBvdXR3YXJkIGJvdW5kIFBhY2tldAorICogYW5kIHJlLXNldCBieSBMVFQncyBhZnRlciB4bWl0LgorICoKKyAqIEdldHMgc2hvdmVkIGludG8gcnhfc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfUlhfTEFTVF9QS1RfQUNLRUQgICAgKCh1c2hvcnQpIDB4MDgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFJ4IFRPR0dMRSBiaXQuCisgKiBTdHVmZmVkIGludG8gcnhfc3RhdHVzIGJ5IFJYUEtUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfUlhfREFUQV9XTkRXICAgICAgICAgKCh1c2hvcnQpIDB4MDQwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFJ4IFRPR0dMRSBiaXQuIE1hdGNoZXMgdGhlIHNldHRpbmcgaW4gUEtULkgKKyAqIFN0dWZmZWQgaW50byByeF9zdGF0dXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9SWF9UR0wgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHgyMDAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGJpdCBpcyBzZXQgYnkgdGhlIExSVCB0byBpbmRpY2F0ZSB0aGF0CisgKiBhbiBBQ0sgKHBhY2tldCkgbXVzdCBiZSByZXR1cm5lZC4KKyAqCisgKiBHZXRzIHNob3ZlZCBpbnRvIHR4X3N0YXR1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX1RYX1NFTkRfUEtUX0FDSyAgICAgICgodXNob3J0KSAweDA4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IGJ5IExUVCB0byBpbmRpY2F0ZSB0aGF0IGFuIEFDSyBpcyByZXF1aXJlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9BQ0tfUlFSRCAgICAgICAgICgodXNob3J0KSAweDAxKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgVHggVE9HR0xFIGJpdC4KKyAqIFN0dWZmZWQgaW50byB0eF9zdGF0dXMgYnkgUlhQS1QgZnJvbSB0aGUgUEtUIFduZFcKKyAqIGZpZWxkLiBMb29rZWQgYnkgdGhlIExUVCB3aGVuIHRoZSBORVhUIFBhY2tldAorICogaXMgZ29pbmcgdG8gYmUgc2VudC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9EQVRBX1dORFcgICAgICAgICAoKHVzaG9ydCkgMHgwNCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFR4IFRPR0dMRSBiaXQuIE1hdGNoZXMgdGhlIHNldHRpbmcgaW4gUEtULkgKKyAqIFN0dWZmZWQgaW50byB0eF9zdGF0dXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9UR0wgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHgwMikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlcXVlc3QgaW50ciBiaXQuIFNldCB3aGVuIHRoZSBxdWV1ZSBoYXMgZ29uZSBxdWlldAorICogYW5kIHRoZSBQSEIgaGFzIHJlcXVlc3RlZCBhbiBpbnRlcnJ1cHQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfSU5UUiAgICAgICAgICAgICAoKHVzaG9ydCkgMHgxMDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRVQgaWYgdGhlIFBIQiBjYW5ub3Qgc2VuZCBhbnkgbW9yZSBkYXRhIGRvd24gdGhlCisgKiBMaW5rCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfSEFORFNIQUtFICAgICAgICAgKCh1c2hvcnQpIDB4MDEwKQorCisKKyNkZWZpbmUgUlVQX1NFTkRfV05EVwkJICgodXNob3J0KSAweDA4KSA7CisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9xYnVmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3FidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNlMDJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9xYnVmLmgKQEAgLTAsMCArMSw2NyBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgIFEgVSBFIFUgRSAgICBCIFUgRiBGIEUgUiAgIFMgVCBSIFUgQyBUIFUgUiBFIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3FidWZfaAorI2RlZmluZSBfcWJ1Zl9oIDEKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX3FidWZfaF9zY2NzID0gIkAoIylxYnVmLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKworI2lmZGVmIEhPU1QKKyNkZWZpbmUgUEtUU19QRVJfQlVGRkVSICAgIDEKKyNlbHNlCisjZGVmaW5lIFBLVFNfUEVSX0JVRkZFUiAgICAoMjIwIC8gUEtUX0xFTkdUSCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBRX0JVRiBRX0JVRiA7CitzdHJ1Y3QgUV9CVUYgIHsKKyAgICAgICAgICAgICAgICAgIFFfQlVGX3B0ciBuZXh0IDsKKyAgICAgICAgICAgICAgICAgIFFfQlVGX3B0ciBwcmV2IDsKKyAgICAgICAgICAgICAgICAgIFBLVF9wdHIgYnVmW1BLVFNfUEVSX0JVRkZFUl0gOworICAgICAgICAgICAgICB9IDsKKworCisjZW5kaWYKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTk5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpby5oCkBAIC0wLDAgKzEsMjk0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAxOTk4IFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW8uaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpby5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX3Jpb19oX18KKyNkZWZpbmUJX19yaW9fcmlvX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX2hfc2Njc18gPSAiQCgjKXJpby5oCTEuMyI7CisjZW5kaWYKKworLyoKKyoqIDMwLjA5LjE5OTggQVJHIC0KKyoqIEludHJvZHVjZWQgZHJpdmVyIHZlcnNpb24gYW5kIGhvc3QgY2FyZCB0eXBlIHN0cmluZ3MKKyovCisjZGVmaW5lIFJJT19EUlZfU1RSICJTcGVjaWFsaXggUklPIERyaXZlciIKKyNkZWZpbmUgUklPX0FUX0hPU1RfU1RSICJJU0EiCisjZGVmaW5lIFJJT19QQ0lfSE9TVF9TVFIgIlBDSSIKKworCisvKgorKiogcmlvX2luZm9fc3RvcmUoKSBjb21tYW5kcyAoYXJiaXRhcnkgdmFsdWVzKSA6CisqLworI2RlZmluZSBSSU9fSU5GT19QVVQJMHhBNEIzQzJEMQorI2RlZmluZSBSSU9fSU5GT19HRVQJMHhGMUUyRDNDNAorCisKKy8qCisqKiBhbnl0aGluZyB0aGF0IEkgY291bGRuJ3QgY3JhbSBpbiBzb21ld2hlcmUgZWxzZQorKi8KKy8qCisjaWZuZGVmIFJJT0RFQlVHCisjZGVmaW5lIGRlYnVnCisjZWxzZQorI2RlZmluZSBkZWJ1ZyByaW9wcmludAorI2VuZGlmCisqLworCisKKy8qCisqKglNYXhpbXVtIG51bWJlcnMgb2YgdGhpbmdzCisqLworI2RlZmluZQlSSU9fU0xPVFMJNAkvKiBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBzbG90cyAqLworI2RlZmluZQlSSU9fSE9TVFMJNAkvKiBudW1iZXIgb2YgaG9zdHMgdGhhdCBjYW4gYmUgZm91bmQgKi8KKyNkZWZpbmUJUE9SVFNfUEVSX0hPU1QJMTI4CS8qIG51bWJlciBvZiBwb3J0cyBwZXIgaG9zdCAqLworI2RlZmluZQlMSU5LU19QRVJfVU5JVAk0CS8qIG51bWJlciBvZiBsaW5rcyBmcm9tIGEgaG9zdCAqLworI2RlZmluZQlSSU9fUE9SVFMJKFBPUlRTX1BFUl9IT1NUICogUklPX0hPU1RTKSAvKiBtYXguIG5vLiBvZiBwb3J0cyAqLworI2RlZmluZQlSVEFTX1BFUl9IT1NUCShNQVhfUlVQKSAvKiBudW1iZXIgb2YgUlRBcyBwZXIgaG9zdCAqLworI2RlZmluZQlQT1JUU19QRVJfUlRBCShQT1JUU19QRVJfSE9TVC9SVEFTX1BFUl9IT1NUKQkvKiBwb3J0cyBvbiBhIHJ0YSAqLworI2RlZmluZQlQT1JUU19QRVJfTU9EVUxFIDQJLyogbnVtYmVyIG9mIHBvcnRzIG9uIGEgcGx1Zy1pbiBtb2R1bGUgKi8KKwkJCQkvKiBudW1iZXIgb2YgbW9kdWxlcyBvbiBhbiBSVEEgKi8KKyNkZWZpbmUJTU9EVUxFU19QRVJfUlRBCSAoUE9SVFNfUEVSX1JUQS9QT1JUU19QRVJfTU9EVUxFKQorI2RlZmluZSBNQVhfUFJPRFVDVAkxNgkvKiBudW1iciBvZiBkaWZmZXJlbnQgcHJvZHVjdCBjb2RlcyAqLworI2RlZmluZSBNQVhfTU9EVUxFX1RZUEVTIDE2CS8qIG51bWJlciBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgbW9kdWxlICovCisKKyNkZWZpbmUgUklPX0NPTlRST0xfREVWCTEyOAkvKiBtaW5vciBudW1iZXIgb2YgaG9zdC9jb250cm9sIGRldmljZSAqLworI2RlZmluZSBSSU9fSU5WQUxJRF9NQUpPUiAwCS8qIHRlc3QgZmlyc3QgaG9zdCBjYXJkJ3MgbWFqb3Igbm8gZm9yIHZhbGlkaXR5ICovCisKKy8qCisqKiBudW1iZXIgb2YgUlRBcyB0aGF0IGNhbiBiZSBib3VuZCB0byBhIG1hc3RlcgorKi8KKyNkZWZpbmUgTUFYX1JUQV9CSU5ESU5HUyAoTUFYX1JVUCAqIFJJT19IT1NUUykKKworLyoKKyoqCVVuaXQgdHlwZXMKKyovCisjZGVmaW5lIFBDX1JUQTE2CTB4OTAwMDAwMDAKKyNkZWZpbmUgUENfUlRBOAkJMHhlMDAwMDAwMAorI2RlZmluZSBUWVBFX0hPU1QJMAorI2RlZmluZSBUWVBFX1JUQTgJMQorI2RlZmluZSBUWVBFX1JUQTE2CTIKKworLyoKKyoqCUZsYWcgdmFsdWVzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucworKi8KKyNkZWZpbmUJUklPX0ZBSUwJLTEKKyNkZWZpbmUJUklPX1NVQ0NFU1MJMAorI2RlZmluZQlDT1BZRkFJTAktMQkvKiBjb3B5W2lufG91dF0gZmFpbGVkICovCisKKy8qCisqKiBTeXNQb3J0IHZhbHVlIGZvciBzb21ldGhpbmcgdGhhdCBoYXNuJ3QgYW55IHBvcnRzCisqLworI2RlZmluZQlOT19QT1JUCTB4RkZGRkZGRkYKKworLyoKKyoqIFVuaXQgSUQgT2YgYWxsIGhvc3RzCisqLworI2RlZmluZQlIT1NUX0lECTAKKworLyoKKyoqIEJyZWFrIGJ5dGVzIGludG8gbnlibGVzCisqLworI2RlZmluZQlMT05ZQkxFKFgpCSgoWCkgJiAweEYpCisjZGVmaW5lCUhJTllCTEUoWCkJKCgoWCk+PjQpICYgMHhGKQorCisvKgorKiogRmxhZyB2YWx1ZXMgcGFzc2VkIGludG8gc29tZSBmdW5jdGlvbnMKKyovCisjZGVmaW5lCURPTlRfU0xFRVAJMAorI2RlZmluZQlPS19UT19TTEVFUAkxCisKKyNkZWZpbmUJRE9OVF9QUklOVAkxCisjZGVmaW5lCURPX1BSSU5UCTAKKworI2RlZmluZSBQUklOVF9UT19MT0dfQ09OUwkwCisjZGVmaW5lIFBSSU5UX1RPX0NPTlMJMQorI2RlZmluZSBQUklOVF9UT19MT0cJMgorCisvKgorKiogVGltZW91dCBoYXMgdHJvdWJsZSB3aXRoIHRpbWVzIG9mIGxlc3MgdGhhbiAzIHRpY2tzLi4uCisqLworI2RlZmluZQlNSU5fVElNRU9VVAkzCisKKy8qCisqKglHZW5lcmFsbHkgdXNlZnVsIGNvbnN0YW50cworKi8KKyNkZWZpbmUJSEFMRl9BX1NFQ09ORAkJKChIWik+PjEpCisjZGVmaW5lCUFfU0VDT05ECQkoSFopCisjZGVmaW5lCUhVTkRSRURfSFoJCSgoSFovMTAwKT8oSFovMTAwKToxKQorI2RlZmluZQlGSUZUWV9IWgkJKChIWi81MCk/KEhaLzUwKToxKQorI2RlZmluZQlUV0VOVFlfSFoJCSgoSFovMjApPyhIWi8yMCk6MSkKKyNkZWZpbmUJVEVOX0haCQkJKChIWi8xMCk/KEhaLzEwKToxKQorI2RlZmluZQlGSVZFX0haCQkJKChIWi81KT8oSFovNSk6MSkKKyNkZWZpbmUJSFVORFJFRF9NUwkJVEVOX0haCisjZGVmaW5lCUZJRlRZX01TCQlUV0VOVFlfSFoKKyNkZWZpbmUJVFdFTlRZX01TCQlGSUZUWV9IWgorI2RlZmluZQlURU5fTVMJCQlIVU5EUkVEX0haCisjZGVmaW5lCVRXT19TRUNPTkRTCQkoKEFfU0VDT05EKSoyKQorI2RlZmluZQlGSVZFX1NFQ09ORFMJCSgoQV9TRUNPTkQpKjUpCisjZGVmaW5lCVRFTl9TRUNPTkRTCQkoKEFfU0VDT05EKSoxMCkKKyNkZWZpbmUJRklGVEVFTl9TRUNPTkRTCQkoKEFfU0VDT05EKSoxNSkKKyNkZWZpbmUJVFdFTlRZX1NFQ09ORFMJCSgoQV9TRUNPTkQpKjIwKQorI2RlZmluZQlIQUxGX0FfTUlOVVRFCQkoQV9NSU5VVEU+PjEpCisjZGVmaW5lCUFfTUlOVVRFCQkoQV9TRUNPTkQqNjApCisjZGVmaW5lCUZJVkVfTUlOVVRFUwkJKEFfTUlOVVRFKjUpCisjZGVmaW5lCVFVQVJURVJfSE9VUgkJKEFfTUlOVVRFKjE1KQorI2RlZmluZQlIQUxGX0hPVVIJCShBX01JTlVURSozMCkKKyNkZWZpbmUJSE9VUgkJCShBX01JTlVURSo2MCkKKworI2RlZmluZQlTSVhURUVOX01FRwkJMHgxMDAwMDAwCisjZGVmaW5lCU9ORV9NRUcJCQkweDEwMDAwMAorI2RlZmluZQlTSVhUWV9GT1VSX0sJCTB4MTAwMDAKKworI2RlZmluZQlSSU9fQVRfTUVNX1NJWkUJCVNJWFRZX0ZPVVJfSworI2RlZmluZQlSSU9fRUlTQV9NRU1fU0laRQlTSVhUWV9GT1VSX0sKKyNkZWZpbmUJUklPX01DQV9NRU1fU0laRQlTSVhUWV9GT1VSX0sKKworI2RlZmluZQlQT0xMX1ZFQ1RPUgkJMHgxMDAKKworI2RlZmluZQlDT09LX1dFTEwJCTAKKyNkZWZpbmUJQ09PS19NRURJVU0JCTEKKyNkZWZpbmUJQ09PS19SQVcJCTIKKworLyoKKyoqCVBvaW50ZXIgbWFuaXB1bGF0aW9uIHN0dWZmCisqKglSSU9fUFRSIHRha2VzIGhvc3RwLT5DYWRkciBhbmQgdGhlIG9mZnNldCBpbnRvIHRoZSBEUCBSQU0gYXJlYQorKioJYW5kIHByb2R1Y2VzIGEgVU5JWCBjYWRkcl90IChwb2ludGVyKSB0byB0aGUgb2JqZWN0CisqKglSSU9fT0JKIHRha2VzIGhvc3RwLT5DYWRkciBhbmQgYSBVTklYIHBvaW50ZXIgdG8gYW4gb2JqZWN0IGFuZAorKioJcmV0dXJucyB0aGUgb2Zmc2V0IGludG8gdGhlIERQIFJBTSBhcmVhLgorKi8KKyNkZWZpbmUJUklPX1BUUihDLE8pICgoKGNhZGRyX3QpKEMpKSsoMHhGRkZGJihPKSkpCisjZGVmaW5lCVJJT19PRkYoQyxPKSAoKGludCkoTyktKGludCkoQykpCisKKy8qCisqKglIb3cgdG8gY29udmVydCBmcm9tIHZhcmlvdXMgZGlmZmVyZW50IGRldmljZSBudW1iZXIgZm9ybWF0czoKKyoqCURFViBpcyBhIGRldiBudW1iZXIsIGFzIHBhc3NlZCB0byBvcGVuLCBjbG9zZSBldGMgLSBOT1QgYSBtaW5vcgorKioJbnVtYmVyIQorKioKKyoqCU5vdGU6CUx5bnhPUyBvbmx5IGdpdmVzIHVzIDggYml0cyBmb3IgdGhlIGRldmljZSBtaW5vciBudW1iZXIsCisqKgkJc28gYWxsIHRoaXMgY3JhcCBoZXJlIHRvIGRlYWwgd2l0aCAnbW9kZW0nIGJpdHMgZXRjLiBpcworKioJCWp1c3QgYSBsb2FkIG9mIGlycmVsZXZhbnQgb2xkIGJ1bmt1bSEKKyoqCQlUaGlzIGhvd2V2ZXIgZG9lcyBub3Qgc3RvcCB1cyBuZWVkaW5nIHRvIGRlZmluZSBhIHZhbHVlCisqKgkJZm9yIFJJT19NT0RFTU9GRlNFVCB3aGljaCBpcyByZXF1aXJlZCBieSB0aGUgJ3Jpb21rZGV2JworKioJCXV0aWxpdHkgaW4gdGhlIE5ldyBDb25maWcgVXRpbGl0aWVzIHN1aXRlLgorKi8KKy8qIDAtNTExOiBkaXJlY3QgNTEyLTEwMjM6IG1vZGVtICovCisjZGVmaW5lCVJJT19NT0RFTU9GRlNFVAkJMHgyMDAJLyogZG9lc24ndCBtZWFuIGFueXRoaW5nICovCisjZGVmaW5lCVJJT19NT0RFTV9NQVNLCQkweDFGRgorI2RlZmluZQlSSU9fTU9ERU1fQklUCQkweDIwMAorI2RlZmluZQlSSU9fVU5NT0RFTShERVYpCShNSU5PUihERVYpICYgUklPX01PREVNX01BU0spCisjZGVmaW5lCVJJT19JU01PREVNKERFVikJKE1JTk9SKERFVikgJiBSSU9fTU9ERU1fQklUKQorI2RlZmluZSBSSU9fUE9SVChERVYsRklSU1RfTUFKKQkoIChNQUpPUihERVYpIC0gRklSU1RfTUFKKSAqIFBPUlRTX1BFUl9IT1NUKSBcCisJCQkJCSsgTUlOT1IoREVWKQorCisjZGVmaW5lCXNwbHJpbwlzcGx0dHkKKworI2RlZmluZQlSSU9fSVBMCTUKKyNkZWZpbmUJUklPX1BSSQkoUFpFUk8rMTApCisjZGVmaW5lIFJJT19DTE9TRV9QUkkJUFpFUk8tMQkvKiB1bmludGVycnVwdGlibGUgc2xlZXBzIGZvciBjbG9zZSAqLworCit0eXBlZGVmIHN0cnVjdCBEYkluZgoreworCXVpbnQJRmxhZzsKKwljaGFyCU5hbWVbOF07Cit9IERiSW5mOworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUJVFJVRSAoMT09MSkKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZQlGQUxTRQkoIVRSVUUpCisjZW5kaWYKKworI2RlZmluZSBDU1VNKHBrdF9wdHIpICAoKCh1c2hvcnQgKikocGt0X3B0cikpWzBdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzFdICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzJdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzNdICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzRdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzVdICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzZdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzddICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzhdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzldICkKKworLyoKKyoqIFRoaXMgaGFwcHkgbGl0dGxlIG1hY3JvIGNvcGllcyBTSVpFIGJ5dGVzIG9mIGRhdGEgZnJvbSBGUk9NIHRvIFRPCisqKiBxdWl0ZSB3ZWxsLiBTSVpFIG11c3QgYmUgYSBjb25zdGFudC4KKyovCisjZGVmaW5lIENDT1BZKCBGUk9NLCBUTywgU0laRSApIHsgKihzdHJ1Y3QgcyB7IGNoYXIgZGF0YVtTSVpFXTsgfSAqKShUTykgPSAqKHN0cnVjdCBzICopKEZST00pOyB9CisKKy8qCisqKiBpbmNyZW1lbnQgYSBidWZmZXIgcG9pbnRlciBtb2R1bG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4uLgorKi8KKyNkZWZpbmUJQlVNUCggUCwgSSApCSgoUCkgPSAoKChQKSsoSSkpICYgUklPQnVmZmVyTWFzaykpCisKKyNkZWZpbmUgSU5JVF9QQUNLRVQoIFBLLCBQUCApIFwKK3sgXAorCSooKHVpbnQgKilQSykgICAgPSBQUC0+UGFja2V0SW5mbzsgXAorfQorCisjZGVmaW5lCVJJT19MSU5LX0VOQUJMRQkweDgwRkYgLyogRkYgaXMgYSBoYWNrLCBtYWlubHkgZm9yIE1pcHMsIHRvICAgICAgICAqLworCQkJICAgICAgIC8qIHByZXZlbnQgYSByZWFsbHkgc3R1cGlkIHJhY2UgY29uZGl0aW9uLiAgKi8KKworI2RlZmluZQlOT1RfSU5JVElBTElTRUQJMAorI2RlZmluZQlJTklUSUFMSVNFRAkxCisKKyNkZWZpbmUJTk9UX1BPTExJTkcJMAorI2RlZmluZQlQT0xMSU5HCQkxCisKKyNkZWZpbmUJTk9UX0NIQU5HRUQJMAorI2RlZmluZQlDSEFOR0VECQkxCisKKyNkZWZpbmUJTk9UX0lOVVNFCTAKKworI2RlZmluZQlESVNDT05ORUNUCTAKKyNkZWZpbmUJQ09OTkVDVAkJMQorCisKKy8qCisqKiBNYWNoaW5lIHR5cGVzIC0gdGhlc2UgbXVzdCBOT1Qgb3ZlcmxhcCB3aXRoIHByb2R1Y3QgY29kZXMgMC0xNQorKi8KKyNkZWZpbmUJUklPX01JUFNfUjMyMzAJMzEKKyNkZWZpbmUJUklPX01JUFNfUjQwMzAJMzIKKworI2RlZmluZQlSSU9fSU9fVU5LTk9XTgktMgorCisjdW5kZWYJTU9ERVJOCisjZGVmaW5lCUVSUk9SKCBFICkJZG8geyB1LnVfZXJyb3IgPSBFOyByZXR1cm4gT1BFTkZBSUwgfSB3aGlsZSAoIDAgKQorCisvKiBEZWZpbmVzIGZvciBNUFggbGluZSBkaXNjaXBsaW5lIHJvdXRpbmVzICovCisKKyNkZWZpbmUgRElTVF9MSU5FU1dfT1BFTgkweDAxCisjZGVmaW5lIERJU1RfTElORVNXX0NMT1NFCTB4MDIKKyNkZWZpbmUgRElTVF9MSU5FU1dfUkVBRAkweDA0CisjZGVmaW5lIERJU1RfTElORVNXX1dSSVRFCTB4MDgKKyNkZWZpbmUgRElTVF9MSU5FU1dfSU9DVEwJMHgxMAorI2RlZmluZSBESVNUX0xJTkVTV19JTlBVVAkweDIwCisjZGVmaW5lIERJU1RfTElORVNXX09VVFBVVAkweDQwCisjZGVmaW5lIERJU1RfTElORVNXX01ETUlOVAkweDgwCisKKyNlbmRpZiAvKiBfX3Jpb19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWFlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCkBAIC0wLDAgKzEsMTM4MCBAQAorCisvKiByaW9fbGludXguYyAtLSBMaW51eCBkcml2ZXIgZm9yIHRoZSBTcGVjaWFsaXggUklPIHNlcmllcyBjYXJkcy4gCisgKgorICoKKyAqICAgKEMpIDE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqIFNwZWNpYWxpeCBwYXlzIGZvciB0aGUgZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQgb2YgdGhpcyBkcml2ZXIuCisgKiBQbGVhc2UgRE8gY29udGFjdCBzdXBwb3J0QHNwZWNpYWxpeC5jby51ayBpZiB5b3UgcmVxdWlyZQorICogc3VwcG9ydC4gQnV0IHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIChyaW8udHh0KSBmaXJzdC4KKyAqCisgKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiAgICAgIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgIFVTQS4KKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICogJExvZzogcmlvLmMsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTkvMDcvMTEgMTA6MTM6NTQgIHdvbGZmCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWYgQklUU19QRVJfTE9ORyAhPSAzMgorIyAgZXJyb3IgRklYTUU6IHRoaXMgZHJpdmVyIG9ubHkgd29ya3Mgb24gMzItYml0IHBsYXRmb3JtcworI2VuZGlmCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKyNpbmNsdWRlICJyaW9pb2N0bC5oIgorI2luY2x1ZGUgInBhcmFtLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInNhbS5oIgorI2luY2x1ZGUgInByb3RzdHMuaCIKKyNpbmNsdWRlICJyaW9ib2FyZC5oIgorCisKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKworLyogSSBkb24ndCB0aGluayB0aGF0IHRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgbW9yZSB0aGFuIDUxMiBwb3J0cyBvbgorb25lIG1hY2hpbmUuICBTcGVjaWFsaXggc3BlY2lmaWVzIG1heCA0IGJvYXJkcyBpbiBvbmUgbWFjaGluZS4gSSBkb24ndAora25vdyB3aHkuIElmIHlvdSB3YW50IHRvIHRyeSBhbnl3YXkgeW91J2xsIGhhdmUgdG8gaW5jcmVhc2UgdGhlIG51bWJlcgorb2YgYm9hcmRzIGluIHJpby5oLiAgWW91J2xsIGhhdmUgdG8gYWxsb2NhdGUgbW9yZSBtYWpvcnMgaWYgeW91IG5lZWQKK21vcmUgdGhhbiA1MTIgcG9ydHMuLi4uICovCisKKyNpZm5kZWYgUklPX05PUk1BTF9NQUpPUjAKKy8qIFRoaXMgYWxsb3dzIG92ZXJyaWRpbmcgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmRsaW5lLCBvciBpbiBhICJtYWpvci5oIiAKKyAgIGluY2x1ZGUgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCAqLworI2RlZmluZSBSSU9fTk9STUFMX01BSk9SMCAgMTU0CisjZGVmaW5lIFJJT19OT1JNQUxfTUFKT1IxICAxNTYKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCAweDIwMDAKKyNlbmRpZgorCisjaWZuZGVmIFJJT19XSU5ET1dfTEVOIAorI2RlZmluZSBSSU9fV0lORE9XX0xFTiAweDEwMDAwCisjZW5kaWYKKworCisvKiBDb25maWd1cmFibGUgb3B0aW9uczogCisgICAoRG9uJ3QgYmUgdG9vIHN1cmUgdGhhdCBpdCdsbCB3b3JrIGlmIHlvdSB0b2dnbGUgdGhlbSkgKi8KKworLyogQW0gSSBwYXJhbm9pZCBvciBub3QgPyA7LSkgKi8KKyN1bmRlZiBSSU9fUEFSQU5PSUFfQ0hFQ0sKKworCisvKiAyMCAtPiAyMDAwIHBlciBzZWNvbmQuIFRoZSBjYXJkIHNob3VsZCByYXRlLWxpbWl0IGludGVycnVwdHMgYXQgMTAwMAorICAgSHosIGJ1dCBpdCBpcyB1c2VyIGNvbmZpZ3VyYWJsZS4gSSBkb24ndCByZWNvbW1lbmQgZ29pbmcgYWJvdmUgMTAwMAorICAgSHouIFRoZSBpbnRlcnJ1cHQgcmF0ZWxpbWl0IG1pZ2h0IHRyaWdnZXIgaWYgdGhlIGludGVycnVwdCBpcworICAgc2hhcmVkIHdpdGggYSB2ZXJ5IGFjdGl2ZSBvdGhlciBkZXZpY2UuIAorICAgdW5kZWYgdGhpcyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjaGVjay4uLi4KKyovCisjZGVmaW5lIElSUV9SQVRFX0xJTUlUIDIwMAorCisjaWYgMAorLyogTm90IGltcGxlbWVudGVkICovCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBCdXQgaWYgeW91IG5lZWQKKyAqIHNvbWUgbmljZSByZXBvcnRpbmcgaW4geW91ciBzeXNsb2csIHlvdSBjYW4gZGVmaW5lIHRoZW0gYWxzby4KKyAqLworI2RlZmluZSBSSU9fUkVQT1JUX0ZJRk8KKyNkZWZpbmUgUklPX1JFUE9SVF9PVkVSUlVOCisjZW5kaWYgCisKKworLyogVGhlc2UgY29uc3RhbnRzIGFyZSBkZXJpdmVkIGZyb20gU0NPIFNvdXJjZSAqLworc3RhdGljIHN0cnVjdCBDb25mCitSSU9Db25mID0KK3sKKyAgLyogbG9jYXRvciAqLyAgICAgICAgICJSSU8gQ29uZmlnIGhlcmUiLAorICAvKiBzdGFydHVwdGltZSAqLyAgICAgSFoqMiwgICAgICAgICAgIC8qIGhvdyBsb25nIHRvIHdhaXQgZm9yIGNhcmQgdG8gcnVuICovCisgIC8qIHNsb3djb29rICovICAgICAgICAwLCAgICAgICAgICAgICAgLyogVFJVRSAtPiBhbHdheXMgdXNlIGxpbmUgZGlzYy4gKi8KKyAgLyogaW50cnBvbGx0aW1lICovICAgIDEsICAgICAgICAgICAgICAvKiBUaGUgZnJlcXVlbmN5IG9mIE9VUiBwb2xscyAqLworICAvKiBicmVha2ludGVydmFsICovICAgMjUsICAgICAgICAgICAgIC8qIHgxMCBtUyBYWFg6IHVuaXRzIHNlZW0gdG8gYmUgMW1zIG5vdCAxMCEgLS0gUkVXKi8KKyAgLyogdGltZXIgKi8gICAgICAgICAgIDEwLCAgICAgICAgICAgICAvKiBtUyAqLworICAvKiBSdGFMb2FkQmFzZSAqLyAgICAgMHg3MDAwLAorICAvKiBIb3N0TG9hZEJhc2UgKi8gICAgMHg3QzAwLAorICAvKiBYcEh6ICovICAgICAgICAgICAgNSwgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBYcHJpbnQgaGl0cyBwZXIgc2Vjb25kICovCisgIC8qIFhwQ3BzICovICAgICAgICAgICAxMjAsICAgICAgICAgICAgLyogWHByaW50IGNoYXJhY3RlcnMgcGVyIHNlY29uZCAqLworICAvKiBYcE9uICovICAgICAgICAgICAgIlwwMzNkIyIsICAgICAgIC8qIHN0YXJ0IFhwcmludCBmb3IgYSB3eXNlIDYwICovCisgIC8qIFhwT2ZmICovICAgICAgICAgICAiXDAyNCIsICAgICAgICAgLyogZW5kIFhwcmludCBmb3IgYSB3eXNlIDYwICovCisgIC8qIE1heFhwQ3BzICovICAgICAgICAyMDAwLCAgICAgICAgICAgLyogaGlnaGVzdCBYcHJpbnQgc3BlZWQgKi8KKyAgLyogTWluWHBDcHMgKi8gICAgICAgIDEwLCAgICAgICAgICAgICAvKiBzbG93ZXN0IFhwcmludCBzcGVlZCAqLworICAvKiBTcGluQ21kcyAqLyAgICAgICAgMSwgICAgICAgICAgICAgIC8qIG5vbi16ZXJvIGZvciBtZWdhIGZhc3QgYm9vdHMgKi8KKyAgLyogRmlyc3QgQWRkciAqLyAgICAgIDB4MEEwMDAwLCAgICAgICAvKiBGaXJzdCBhZGRyZXNzIHRvIGxvb2sgYXQgKi8KKyAgLyogTGFzdCBBZGRyICovICAgICAgIDB4RkYwMDAwLCAgICAgICAvKiBMYXN0IGFkZHJlc3MgbG9va2VkIGF0ICovCisgIC8qIEJ1ZmZlclNpemUgKi8gICAgICAxMDI0LCAgICAgICAgICAgLyogQnl0ZXMgcGVyIHBvcnQgb2YgYnVmZmVyaW5nICovCisgIC8qIExvd1dhdGVyICovICAgICAgICAyNTYsICAgICAgICAgICAgLyogaG93IG11Y2ggZGF0YSBsZWZ0IGJlZm9yZSB3YWtldXAgKi8KKyAgLyogTGluZUxlbmd0aCAqLyAgICAgIDgwLCAgICAgICAgICAgICAvKiBob3cgd2lkZSBpcyB0aGUgY29uc29sZT8gKi8KKyAgLyogQ21kVGltZW91dCAqLyAgICAgIEhaLCAgICAgICAgICAgICAvKiBob3cgbG9uZyBhIGNsb3NlIGNvbW1hbmQgbWF5IHRha2UgKi8KK307CisKKworCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgcmlvX2VuYWJsZV90eF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCByaW9fZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyBpbnQgIHJpb19nZXRfQ0QgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyB2b2lkIHJpb19zaHV0ZG93bl9wb3J0ICh2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgIHJpb19zZXRfcmVhbF90ZXJtaW9zICh2b2lkICAqcHRyKTsKK3N0YXRpYyB2b2lkIHJpb19odW5ndXAgKHZvaWQgICpwdHIpOworc3RhdGljIHZvaWQgcmlvX2Nsb3NlICh2b2lkICAqcHRyKTsKK3N0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cik7CitzdGF0aWMgaW50IHJpb19md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgcmlvX2luaXRfZHJpdmVycyh2b2lkKTsKKworc3RhdGljIHZvaWQgbXlfaGQgKHZvaWQgKmFkZHIsIGludCBsZW4pOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnJpb19kcml2ZXIsICpyaW9fZHJpdmVyMjsKKworLyogVGhlIG5hbWUgInAiIGlzIGEgYml0IG5vbi1kZXNjcmlwdC4gQnV0IHRoYXQncyB3aGF0IHRoZSByaW8tbHlueG9zCitzb3VyY2VzIHVzZSBhbGwgb3ZlciB0aGUgcGxhY2UuICovCitzdHJ1Y3QgcmlvX2luZm8gKnA7CisKK2ludCByaW9fZGVidWc7CisKKworLyogWW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgcG9sbCB5b3VyIGNhcmQuIAorICAgIC0gU2V0IHJpb19wb2xsIHRvIDEgdG8gcG9sbCBldmVyeSB0aW1lciB0aWNrICgxMG1zIG9uIEludGVsKS4gCisgICAgICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgY2FyZCBjYW5ub3QgdXNlIGFuIGludGVycnVwdCBmb3Igc29tZSByZWFzb24uCisqLworc3RhdGljIGludCByaW9fcG9sbCA9IDE7CisKKworLyogVGhlc2UgYXJlIHRoZSBvbmx5IG9wZW4gc3BhY2VzIGluIG15IGNvbXB1dGVyLiBZb3VycyBtYXkgaGF2ZSBtb3JlCisgICBvciBsZXNzLi4uLiAqLworc3RhdGljIGludCByaW9fcHJvYmVfYWRkcnNbXT0gezB4YzAwMDAsIDB4ZDAwMDAsIDB4ZTAwMDB9OworCisjZGVmaW5lIE5SX1JJT19BRERSUyAoc2l6ZW9mKHJpb19wcm9iZV9hZGRycykvc2l6ZW9mIChpbnQpKQorCisKKy8qIFNldCB0aGUgbWFzayB0byBhbGwtb25lcy4gVGhpcyBhbGFzLCBvbmx5IHN1cHBvcnRzIDMyIGludGVycnVwdHMuIAorICAgU29tZSBhcmNoaXRlY3R1cmVzIG1heSBuZWVkIG1vcmUuIC0tIENoYW5nZWQgdG8gTE9ORyB0bworICAgc3VwcG9ydCB1cCB0byA2NCBiaXRzIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMuIC0tIFJFVyAyMC8wNi85OSAqLworbG9uZyByaW9faXJxbWFzayA9IC0xOworCitNT0RVTEVfQVVUSE9SKCJSb2dpZXIgV29sZmYgPFIuRS5Xb2xmZkBiaXR3aXphcmQubmw+LCBQYXRyaWNrIHZhbiBkZSBMYWdld2VnIDxwYXRyaWNrQGJpdHdpemFyZC5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUklPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKHJpb19wb2xsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJpb19kZWJ1ZywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShyaW9faXJxbWFzaywgbG9uZywgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVhbF9kcml2ZXIgcmlvX3JlYWxfZHJpdmVyID0geworICByaW9fZGlzYWJsZV90eF9pbnRlcnJ1cHRzLAorICByaW9fZW5hYmxlX3R4X2ludGVycnVwdHMsCisgIHJpb19kaXNhYmxlX3J4X2ludGVycnVwdHMsCisgIHJpb19lbmFibGVfcnhfaW50ZXJydXB0cywKKyAgcmlvX2dldF9DRCwKKyAgcmlvX3NodXRkb3duX3BvcnQsIAorICByaW9fc2V0X3JlYWxfdGVybWlvcywgCisgIHJpb19jaGFyc19pbl9idWZmZXIsCisgIHJpb19jbG9zZSwKKyAgcmlvX2h1bmd1cCwKKyAgTlVMTAorfTsKKworLyogCisgKiAgRmlybXdhcmUgbG9hZGVyIGRyaXZlciBzcGVjaWZpYyByb3V0aW5lcworICoKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByaW9fZndfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHJpb19md19pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSByaW9fZndfZGV2aWNlID0geworCVJJT0NUTF9NSVNDX01JTk9SLCAicmlvY3RsIiwgJnJpb19md19mb3BzCit9OworCisKKworCisKKyNpZmRlZiBSSU9fUEFSQU5PSUFfQ0hFQ0sKKworLyogVGhpcyBkb2Vzbid0IHdvcmsuIFdobydzIHBhcmFub2lkIGFyb3VuZCBoZXJlPyBOb3QgbWUhICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJpb19wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgcmlvX3BvcnQgY29uc3QgKiBwb3J0LAorCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworCisgIHN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisgICAgS0VSTl9FUlIgInJpbzogV2FybmluZzogYmFkIHJpbyBwb3J0IG1hZ2ljIG51bWJlciBmb3IgZGV2aWNlICVzIGluICVzXG4iOworICBzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9CisgICAgS0VSTl9FUlIgInJpbzogV2FybmluZzogbnVsbCByaW8gcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOworIAorICBpZiAoIXBvcnQpIHsKKyAgICBwcmludGsgKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChwb3J0LT5tYWdpYyAhPSBSSU9fTUFHSUMpIHsKKyAgICBwcmludGsgKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcmlvX3BhcmFub2lhX2NoZWNrKGEsYixjKSAwCisjZW5kaWYKKworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIG15X2hkICh2b2lkICphZCwgaW50IGxlbikKK3sKKyAgaW50IGksIGosIGNoOworICB1bnNpZ25lZCBjaGFyICphZGRyID0gYWQ7CisgIAorICBmb3IgKGk9MDtpPGxlbjtpKz0xNikgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIlMDh4ICIsIChpbnQpIGFkZHIraSk7CisgICAgZm9yIChqPTA7ajwxNjtqKyspIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIlMDJ4ICVzIiwgYWRkcltqK2ldLCAoaj09Nyk/IiAiOiIiKTsKKyAgICB9CisgICAgZm9yIChqPTA7ajwxNjtqKyspIHsKKyAgICAgIGNoID0gYWRkcltqK2ldOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIiVjIiwgKGNoIDwgMHgyMCk/Jy4nOigoY2ggPiAweDdmKT8nLic6Y2gpKTsKKyAgICB9CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlxuIik7CisgIH0KK30KKyNlbHNlCisjZGVmaW5lIG15X2hkKGFkLGxlbikgZG97Lyogbm90aGluZyovIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBEZWxheSBhIG51bWJlciBvZiBqaWZmaWVzLCBhbGxvd2luZyBhIHNpZ25hbCB0byBpbnRlcnJ1cHQgKi8gCitpbnQgUklPRGVsYXkgKHN0cnVjdCBQb3J0ICpQb3J0UCwgaW50IG5qaWZmaWVzKQoreworICBmdW5jX2VudGVyICgpOworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfREVMQVksICJkZWxheWluZyAlZCBqaWZmaWVzXG4iLCBuamlmZmllcyk7ICAKKyAgbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhuamlmZmllcykpOworICBmdW5jX2V4aXQoKTsKKworICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgcmV0dXJuIFJJT19GQUlMOworICBlbHNlCisgICAgcmV0dXJuICFSSU9fRkFJTDsKK30KKworCisvKiBEZWxheSBhIG51bWJlciBvZiBqaWZmaWVzLCBkaXNhbGxvd2luZyBhIHNpZ25hbCB0byBpbnRlcnJ1cHQgKi8gCitpbnQgUklPRGVsYXlfbmkgKHN0cnVjdCBQb3J0ICpQb3J0UCwgaW50IG5qaWZmaWVzKQoreworICBmdW5jX2VudGVyICgpOworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfREVMQVksICJkZWxheWluZyAlZCBqaWZmaWVzIChuaSlcbiIsIG5qaWZmaWVzKTsgIAorICBtc2xlZXAoamlmZmllc190b19tc2VjcyhuamlmZmllcykpOworICBmdW5jX2V4aXQoKTsKKyAgcmV0dXJuICFSSU9fRkFJTDsKK30KKworCitpbnQgcmlvX21pbm9yKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIHR0eS0+aW5kZXggKyAodHR5LT5kcml2ZXIgPT0gcmlvX2RyaXZlcikgPyAwIDogMjU2OworfQorCisKK2ludCByaW9faXNtb2RlbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiAxOworfQorCisKK3ZvaWQgcmlvX3VkZWxheSAoaW50IHVzZWNzKQoreworICB1ZGVsYXkgKHVzZWNzKTsKK30KKworc3RhdGljIGludCByaW9fc2V0X3JlYWxfdGVybWlvcyAodm9pZCAqcHRyKQoreworICBpbnQgcnYsIG1vZGVtOworICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICBmdW5jX2VudGVyKCk7CisKKyAgdHR5ID0gKChzdHJ1Y3QgUG9ydCAqKXB0ciktPmdzLnR0eTsKKworICBtb2RlbSA9IHJpb19pc21vZGVtKHR0eSk7CisKKyAgcnYgPSBSSU9QYXJhbSggKHN0cnVjdCBQb3J0ICopIHB0ciwgQ09ORklHLCBtb2RlbSwgMSk7CisKKyAgZnVuY19leGl0ICgpOworCisgIHJldHVybiBydjsKK30KKworCitzdGF0aWMgdm9pZCByaW9fcmVzZXRfaW50ZXJydXB0IChzdHJ1Y3QgSG9zdCAqSG9zdFApCit7CisgIGZ1bmNfZW50ZXIoKTsKKworICBzd2l0Y2goIEhvc3RQLT5UeXBlICkgeworICBjYXNlIFJJT19BVDoKKyAgY2FzZSBSSU9fTUNBOgorICBjYXNlIFJJT19QQ0k6CisgICAgV0JZVEUoSG9zdFAtPlJlc2V0SW50ICwgMHhmZik7CisgIH0KKworICBmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgcmlvX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqcHRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgc3RydWN0IEhvc3QgKkhvc3RQOworICBmdW5jX2VudGVyICgpOworCisgIEhvc3RQID0gKHN0cnVjdCBIb3N0KilwdHI7IC8qICZwLT5SSU9Ib3N0c1sobG9uZylwdHJdOyAqLworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBlbnRlciByaW9faW50ZXJydXB0ICglZC8lZClcbiIsIAorICAgICAgICAgICAgICAgaXJxLCBIb3N0UC0+SXZlYyk7IAorCisgIC8qIEFBYXJnaCEgVGhlIG9yZGVyIGluIHdoaWNoIHRvIGRvIHRoZXNlIHRoaW5ncyBpcyBlc3NlbnRpYWwgYW5kCisgICAgIG5vdCB0cml2aWFsLiAKKyAgICAgCisgICAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSAicmVjdXJzaXZlIi4gT3RoZXJ3aXNlIGEgc2VyaWVzIG9mCisgICAgICAgcmVjdXJzaXZlIGNhbGxzIHdpbGwgaGFuZyB0aGUgbWFjaGluZSBpbiB0aGUgaW50ZXJydXB0IHJvdXRpbmUuIAorCisgICAgIC0gaGFyZHdhcmUgdHdpZGRsaW5nIGdvZXMgYmVmb3JlICJyZWN1cnNpdmUiLiBPdGhlcndpc2Ugd2hlbiB3ZQorICAgICAgIHBvbGwgdGhlIGNhcmQsIGFuZCBhIHJlY3Vyc2l2ZSBpbnRlcnJ1cHQgaGFwcGVucywgd2Ugd29uJ3QKKyAgICAgICBhY2sgdGhlIGNhcmQsIHNvIGl0IG1pZ2h0IGtlZXAgb24gaW50ZXJydXB0aW5nIHVzLiAoZXNwZWNpYWxseQorICAgICAgIGxldmVsIHNlbnNpdGl2ZSBpbnRlcnJ1cHQgc3lzdGVtcyBsaWtlIFBDSSkuCisKKyAgICAgLSBSYXRlIGxpbWl0IGdvZXMgYmVmb3JlIGhhcmR3YXJlIHR3aWRkbGluZy4gT3RoZXJ3aXNlIHdlIHdvbid0CisgICAgICAgY2F0Y2ggYSBjYXJkIHRoYXQgaGFzIGdvbmUgYm9ua2Vycy4KKworICAgICAtIFRoZSAiaW5pdGlhbGl6ZWQiIHRlc3QgZ29lcyBhZnRlciB0aGUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2UKKyAgICAgICB0aGUgY2FyZCB3aWxsIHN0aWNrIHVzIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhZ2Fpbi4KKworICAgICAtIFRoZSBpbml0aWFsaXplZCB0ZXN0IGdvZXMgYmVmb3JlIHJlY3Vyc2l2ZS4gCisgICovCisKKworCisjaWZkZWYgSVJRX1JBVEVfTElNSVQKKyAgLyogQWFhcmdoISBJJ20gYXNoYW1lZC4gVGhpcyBjb3N0cyBtb3JlIGxpbmVzLW9mLWNvZGUgdGhhbiB0aGUKKyAgICAgYWN0dWFsIGludGVycnVwdCByb3V0aW5lIS4gKFdlbGwsIHVzZWQgdG8gd2hlbiBJIHdyb3RlIHRoYXQgY29tbWVudCkgKi8KKyAgeworICAgIHN0YXRpYyBpbnQgbGFzdGppZjsKKyAgICBzdGF0aWMgaW50IG5pbnRyPTA7CisKKyAgICBpZiAobGFzdGppZiA9PSBqaWZmaWVzKSB7CisgICAgICBpZiAoKytuaW50ciA+IElSUV9SQVRFX0xJTUlUKSB7CisgICAgICAgIGZyZWVfaXJxIChIb3N0UC0+SXZlYywgcHRyKTsKKyAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAicmlvOiBUb28gbWFueSBpbnRlcnJ1cHRzLiBUdXJuaW5nIG9mZiBpbnRlcnJ1cHQgJWQuXG4iLCAKKyAgICAgICAgICAgICAgICBIb3N0UC0+SXZlYyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3RqaWYgPSBqaWZmaWVzOworICAgICAgbmludHIgPSAwOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSUZMT1csICJyaW86IFdlJ3ZlIGhhdmUgbm90aWNlZCB0aGUgaW50ZXJydXB0XG4iKTsgCisgIGlmIChIb3N0UC0+SXZlYyA9PSBpcnEpIHsKKyAgICAvKiBUZWxsIHRoZSBjYXJkIHdlJ3ZlIG5vdGljZWQgdGhlIGludGVycnVwdC4gKi8KKyAgICByaW9fcmVzZXRfaW50ZXJydXB0IChIb3N0UCk7CisgIH0KKworICBpZiAoKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORykKKyAgCXJldHVybiBJUlFfSEFORExFRDsKKworICBpZiAodGVzdF9hbmRfc2V0X2JpdCAoUklPX0JPQVJEX0lOVFJfTE9DSywgJkhvc3RQLT5sb2NrcykpIHsKKyAgICBwcmludGsgKEtFUk5fRVJSICJSZWN1cnNpdmUgaW50ZXJydXB0ISAoaG9zdCAlZC9pcnElZClcbiIsIAorICAgICAgICAgICAgKGludCkgcHRyLCBIb3N0UC0+SXZlYyk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICB9CisKKyAgUklPU2VydmljZUhvc3QocCwgSG9zdFAsIGlycSk7CisKKyAgcmlvX2RwcmludGsgKCBSSU9fREVCVUdfSUZMT1csICJyaW9pbnRyKCkgZG9pbmcgaG9zdCAlZCB0eXBlICVkXG4iLCAKKyAgICAgICAgICAgICAgICAoaW50KSBwdHIsIEhvc3RQLT5UeXBlKTsKKworICBjbGVhcl9iaXQgKFJJT19CT0FSRF9JTlRSX0xPQ0ssICZIb3N0UC0+bG9ja3MpOworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBleGl0IHJpb19pbnRlcnJ1cHQgKCVkLyVkKVxuIiwgCisgICAgICAgICAgICAgICBpcnEsIEhvc3RQLT5JdmVjKTsgCisgIGZ1bmNfZXhpdCAoKTsKKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIHJpb19wb2xsZnVuYyAodW5zaWduZWQgbG9uZyBkYXRhKQoreworICBmdW5jX2VudGVyICgpOworCisgIHJpb19pbnRlcnJ1cHQgKDAsICZwLT5SSU9Ib3N0c1tkYXRhXSwgTlVMTCk7CisgIHAtPlJJT0hvc3RzW2RhdGFdLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcmlvX3BvbGw7CisgIGFkZF90aW1lciAoJnAtPlJJT0hvc3RzW2RhdGFdLnRpbWVyKTsKKworICBmdW5jX2V4aXQgKCk7Cit9CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICBIZXJlIGFyZSB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2VuZXJpY19zZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBFaGhtLiBJIGRvbid0IGtub3cgaG93IHRvIGZpZGRsZSB3aXRoIGludGVycnVwdHMgb24gdGhlIFNwZWNpYWxpeCAKKyAgIGNhcmRzLiAuLi4uICAgSG1tLiBPayBJIGZpZ3VyZWQgaXQgb3V0LiBZb3UgZG9uJ3QuICAtLSBSRVcgKi8KKworc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cikgCit7CisgIGZ1bmNfZW50ZXIoKTsKKworICAvKiAgcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOyAqLworCisgIGZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHJpb19lbmFibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cikgCit7CisgIHN0cnVjdCBQb3J0ICpQb3J0UCA9IHB0cjsKKyAgLyogaW50IGhuOyAqLworCisgIGZ1bmNfZW50ZXIoKTsKKworICAvKiBobiA9IFBvcnRQLT5Ib3N0UCAtIHAtPlJJT0hvc3RzOworCisgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUHVzaGluZyBob3N0ICVkXG4iLCBobik7CisgICAgIHJpb19pbnRlcnJ1cHQgKC0xLCh2b2lkICopIGhuLCBOVUxMKTsgKi8KKworICBSSU9UeEVuYWJsZSgoY2hhciAqKSBQb3J0UCk7CisKKyAgLyogCisgICAqIEluIGdlbmVyYWwgd2UgY2Fubm90IGNvdW50IG9uICJ0eCBlbXB0eSIgaW50ZXJydXB0cywgYWx0aG91Z2gKKyAgICogdGhlIGludGVycnVwdCByb3V0aW5lIHNlZW1zIHRvIGJlIGFibGUgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZS4gCisgICAqLworICBQb3J0UC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCisgIGZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworICBmdW5jX2VudGVyKCk7CisgIGZ1bmNfZXhpdCgpOworfQorCitzdGF0aWMgdm9pZCByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworICAvKiAgc3RydWN0IHJpb19wb3J0ICpwb3J0ID0gcHRyOyAqLworICBmdW5jX2VudGVyKCk7CisgIGZ1bmNfZXhpdCgpOworfQorCisKKy8qIEplZXouIElzbid0IHRoaXMgc2ltcGxlPyAgKi8KK3N0YXRpYyBpbnQgcmlvX2dldF9DRCAodm9pZCAqIHB0cikgCit7CisgIHN0cnVjdCBQb3J0ICpQb3J0UCA9IHB0cjsKKyAgaW50IHJ2OworCisgIGZ1bmNfZW50ZXIoKTsKKyAgcnYgPSAoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9DRCkgIT0gMDsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJHZXR0aW5nIENEIHN0YXR1czogJWRcbiIsIHJ2KTsKKyAgCisgIGZ1bmNfZXhpdCgpOyAgCisgIHJldHVybiBydjsKK30KKworCisvKiBKZWV6LiBJc24ndCB0aGlzIHNpbXBsZT8gQWN0dWFsbHksIHdlIGNhbiBzeW5jIHdpdGggdGhlIGFjdHVhbCBwb3J0CisgICBieSBqdXN0IHB1c2hpbmcgc3R1ZmYgaW50byB0aGUgcXVldWUgZ29pbmcgdG8gdGhlIHBvcnQuLi4gKi8KK3N0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cikgCit7CisgIGZ1bmNfZW50ZXIoKTsKKworICBmdW5jX2V4aXQoKTsgIAorICByZXR1cm4gMDsKK30KKworCisvKiBOb3RoaW5nIHNwZWNpYWwgaGVyZS4uLiAqLworc3RhdGljIHZvaWQgcmlvX3NodXRkb3duX3BvcnQgKHZvaWQgKiBwdHIpIAoreworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisKKyAgZnVuY19lbnRlcigpOworCisgIFBvcnRQID0gKHN0cnVjdCBQb3J0ICopcHRyOworICBQb3J0UC0+Z3MudHR5ID0gTlVMTDsKKyNpZiAwCisgIHBvcnQtPmdzLmZsYWdzICY9IH4gR1NfQUNUSVZFOworICBpZiAoIXBvcnQtPmdzLnR0eSkgeworICAgIHJpb19kcHJpbnRrIChSSU9fREJVR19UVFksICJObyB0dHkuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwb3J0LT5ncy50dHktPnRlcm1pb3MpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIk5vIHRlcm1pb3MuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisgICAgcmlvX3NldHNpZ25hbHMgKHBvcnQsIDAsIDApOworICB9CisjZW5kaWYKKworICBmdW5jX2V4aXQoKTsKK30KKworCisvKiBJIGhhdmVuJ3QgdGhlIGZvZ2dpZXN0IHdoeSB0aGUgZGVjcmVtZW50IHVzZSBjb3VudCBoYXMgdG8gaGFwcGVuCisgICBoZXJlLiBUaGUgd2hvbGUgbGludXggc2VyaWFsIGRyaXZlcnMgc3R1ZmYgbmVlZHMgdG8gYmUgcmVkZXNpZ25lZC4KKyAgIE15IGd1ZXNzIGlzIHRoYXQgdGhpcyBpcyBhIGhhY2sgdG8gbWluaW1pemUgdGhlIGltcGFjdCBvZiBhIGJ1ZworICAgZWxzZXdoZXJlLiBUaGlua2luZyBhYm91dCBpdCBzb21lIG1vcmUuICh0cnkgaXQgc29tZXRpbWUpIFRyeQorICAgcnVubmluZyBtaW5pY29tIG9uIGEgc2VyaWFsIHBvcnQgdGhhdCBpcyBkcml2ZW4gYnkgYSBtb2R1bGFyaXplZAorICAgZHJpdmVyLiBIYXZlIHRoZSBtb2RlbSBoYW5ndXAuIFRoZW4gcmVtb3ZlIHRoZSBkcml2ZXIgbW9kdWxlLiBUaGVuCisgICBleGl0IG1pbmljb20uICBJIGV4cGVjdCBhbiAib29wcyIuICAtLSBSRVcgKi8KK3N0YXRpYyB2b2lkIHJpb19odW5ndXAgKHZvaWQgKnB0cikKK3sKKyAgc3RydWN0IFBvcnQgKlBvcnRQOworCisgIGZ1bmNfZW50ZXIoKTsKKyAgCisgIFBvcnRQID0gKHN0cnVjdCBQb3J0ICopcHRyOworICBQb3J0UC0+Z3MudHR5ID0gTlVMTDsKKworICBmdW5jX2V4aXQgKCk7Cit9CisKKworLyogVGhlIHN0YW5kYXJkIHNlcmlhbF9jbG9zZSB3b3VsZCBiZWNvbWUgc2hvcnRlciBpZiB5b3UnZCB3cmFwIGl0IGxpa2UKKyAgIHRoaXMuIAorICAgcnNfY2xvc2UgKC4uLil7c2F2ZV9mbGFncztjbGk7cmVhbF9jbG9zZSgpO2RlY191c2VfY291bnQ7cmVzdG9yZV9mbGFnczt9CisgKi8KK3N0YXRpYyB2b2lkIHJpb19jbG9zZSAodm9pZCAqcHRyKQoreworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisKKyAgZnVuY19lbnRlciAoKTsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXB0cjsKKworICByaW90Y2xvc2UgKHB0cik7CisKKyAgaWYoUG9ydFAtPmdzLmNvdW50KSB7CisgICAgcHJpbnRrIChLRVJOX0VSUiAiV0FSTklORyBwb3J0IGNvdW50OiVkXG4iLCBQb3J0UC0+Z3MuY291bnQpOworICAgIFBvcnRQLT5ncy5jb3VudCA9IDA7IAorICB9ICAgICAgICAgICAgICAgIAorCisgIFBvcnRQLT5ncy50dHkgPSBOVUxMOworICBmdW5jX2V4aXQgKCk7Cit9CisKKworCitzdGF0aWMgaW50IHJpb19md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICBpbnQgcmMgPSAwOworICBmdW5jX2VudGVyKCk7CisKKyAgLyogVGhlICJkZXYiIGFyZ3VtZW50IGlzbid0IHVzZWQuICovCisgIHJjID0gcmlvY29udHJvbCAocCwgMCwgY21kLCAodm9pZCAqKWFyZywgY2FwYWJsZShDQVBfU1lTX0FETUlOKSk7CisKKyAgZnVuY19leGl0ICgpOworICByZXR1cm4gcmM7Cit9CisKK2V4dGVybiBpbnQgUklPU2hvcnRDb21tYW5kKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IFBvcnQgKlBvcnRQLAorICAgICAgICAgICAgICAgaW50IGNvbW1hbmQsIGludCBsZW4sIGludCBhcmcpOworCitzdGF0aWMgaW50IHJpb19pb2N0bCAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwgCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgaW50IHJjOworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisgIGludCBpdmFsOworCisgIGZ1bmNfZW50ZXIoKTsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKyAgcmMgID0gMDsKKyAgc3dpdGNoIChjbWQpIHsKKyNpZiAwCisgIGNhc2UgVElPQ0dTT0ZUQ0FSOgorICAgIHJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAorICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCAqKSBhcmcpOworICAgIGJyZWFrOworI2VuZGlmCisgIGNhc2UgVElPQ1NTT0ZUQ0FSOgorICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKKyAgICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisgICAgICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisgICAgICAgIChpdmFsID8gQ0xPQ0FMIDogMCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRJT0NHU0VSSUFMOgorICAgIHJjID0gLUVGQVVMVDsKKyAgICBpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgKikgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKyAgICAgIHJjID0gZ3NfZ2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworICAgIGJyZWFrOworICBjYXNlIFRDU0JSSzoKKyAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7CisgICAgICByYyA9IC1FSU87ICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChSSU9TaG9ydENvbW1hbmQocCwgUG9ydFAsIFNCUkVBSywgMiwgMjUwKSA9PSBSSU9fRkFJTCkgeworICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOworICAgICAgICAgcmMgPSAtRUlPOworICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVENTQlJLUDoKKyAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7CisgICAgICByYyA9IC1FSU87ICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIGludCBsOworICAgICAgbCA9IGFyZz9hcmcqMTAwOjI1MDsKKyAgICAgIGlmIChsID4gMjU1KSBsID0gMjU1OworICAgICAgaWYgKFJJT1Nob3J0Q29tbWFuZChwLCBQb3J0UCwgU0JSRUFLLCAyLCBhcmc/YXJnKjEwMDoyNTApID09IFJJT19GQUlMKSB7CisgICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7CisgICAgICAgICByYyA9IC1FSU87CisgICAgICB9ICAgICAgICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU9DU1NFUklBTDoKKyAgICByYyA9IC1FRkFVTFQ7CisgICAgaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgKikgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKyAgICAgIHJjID0gZ3Nfc2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworICAgIGJyZWFrOworI2lmIDAKKyAgLyoKKyAgICogbm90ZTogdGhlc2UgSU9DVExzIG5vIGxvbmdlciByZWFjaCBoZXJlLiAgVXNlCisgICAqIHRpb2Ntc2V0L3Rpb2NtZ2V0IGRyaXZlciBtZXRob2RzIGluc3RlYWQuICBUaGUKKyAgICogI2lmIDAgZGlzYWJsZW1lbnQgcHJlZGF0ZXMgdGhpcyBjb21tZW50LgorICAgKi8KKyAgY2FzZSBUSU9DTUdFVDoKKyAgICByYyA9IC1FRkFVTFQ7CisgICAgaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7CisgICAgICByYyA9IDA7CisgICAgICBpdmFsID0gcmlvX2dldHNpZ25hbHMocG9ydCk7CisgICAgICBwdXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRJT0NNQklTOgorICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKKyAgICAgIHJpb19zZXRzaWduYWxzKHBvcnQsICgoaXZhbCAmIFRJT0NNX0RUUikgPyAxIDogLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpdmFsICYgVElPQ01fUlRTKSA/IDEgOiAtMSkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU9DTUJJQzoKKyAgICBpZiAoKHJjID0gZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpKSA9PSAwKSB7CisgICAgICByaW9fc2V0c2lnbmFscyhwb3J0LCAoKGl2YWwgJiBUSU9DTV9EVFIpID8gMCA6IC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAwIDogLTEpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElPQ01TRVQ6CisgICAgaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBpbnQgKikgYXJnKSkgPT0gMCkgeworICAgICAgcmlvX3NldHNpZ25hbHMocG9ydCwgKChpdmFsICYgVElPQ01fRFRSKSA/IDEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAxIDogMCkpOworICAgIH0KKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIHJjID0gLUVOT0lPQ1RMQ01EOworICAgIGJyZWFrOworICB9CisgIGZ1bmNfZXhpdCgpOworICByZXR1cm4gcmM7Cit9CisKKworLyogVGhlIHRocm90dGxlL3VudGhyb3R0bGUgc2NoZW1lIGZvciB0aGUgU3BlY2lhbGl4IGNhcmQgaXMgZGlmZmVyZW50CisgKiBmcm9tIG90aGVyIGRyaXZlcnMgYW5kIGRlc2VydmVzIHNvbWUgZXhwbGFuYXRpb24uIAorICogVGhlIFNwZWNpYWxpeCBoYXJkd2FyZSB0YWtlcyBjYXJlIG9mIFhPTi9YT0ZGCisgKiBhbmQgQ1RTL1JUUyBmbG93IGNvbnRyb2wgaXRzZWxmLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB3ZSBoYXZlIHRvCisgKiBkbyB3aGVuIHNpZ25hbGxlZCBieSB0aGUgdXBwZXIgdHR5IGxheWVyIHRvIHRocm90dGxlL3VudGhyb3R0bGUgaXMKKyAqIHRvIG1ha2UgYSBub3RlIG9mIGl0IGhlcmUuICBXaGVuIHdlIGNvbWUgdG8gcmVhZCBjaGFyYWN0ZXJzIGZyb20gdGhlCisgKiByeCBidWZmZXJzIG9uIHRoZSBjYXJkIChyaW9fcmVjZWl2ZV9jaGFycygpKSB3ZSBsb29rIHRvIHNlZSBpZiB0aGUKKyAqIHVwcGVyIGxheWVyIGNhbiBhY2NlcHQgbW9yZSAoYXMgbm90ZWQgaGVyZSBpbiByaW9fcnhfdGhyb3RbXSkuIAorICogSWYgaXQgY2FuJ3Qgd2Ugc2ltcGx5IGRvbid0IHJlbW92ZSBjaGFycyBmcm9tIHRoZSBjYXJkcyBidWZmZXIuIAorICogV2hlbiB0aGUgdHR5IGxheWVyIGNhbiBhY2NlcHQgY2hhcnMsIHdlIGFnYWluIG5vdGUgdGhhdCBoZXJlIGFuZCB3aGVuCisgKiByaW9fcmVjZWl2ZV9jaGFycygpIGlzIGNhbGxlZCBpdCB3aWxsIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNhcmRzIGJ1ZmZlci4KKyAqIFRoZSBjYXJkIHdpbGwgbm90aWNlIHRoYXQgYSBwb3J0cyBidWZmZXIgaGFzIGRyYWluZWQgYmVsb3cgc29tZSBsb3cKKyAqIHdhdGVyIG1hcmsgYW5kIHdpbGwgdW5mbG93IGNvbnRyb2wgdGhlIGxpbmUgaXRzZWxmLCB1c2luZyB3aGF0ZXZlcgorICogZmxvdyBjb250cm9sIHNjaGVtZSBpcyBpbiB1c2UgZm9yIHRoYXQgcG9ydC4gLS0gU2ltb24gQWxsZW4KKyAqLworCitzdGF0aWMgdm9pZCByaW9fdGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworICBzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIAorICBmdW5jX2VudGVyKCk7CisgIC8qIElmIHRoZSBwb3J0IGlzIHVzaW5nIGFueSB0eXBlIG9mIGlucHV0IGZsb3cKKyAgICogY29udHJvbCB0aGVuIHRocm90dGxlIHRoZSBwb3J0LgorICAgKi8KKworICBpZigodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgfHwgKElfSVhPRkYodHR5KSkgKSB7CisgICAgcG9ydC0+U3RhdGUgfD0gUklPX1RIUk9UVExFX1JYOworICB9CisKKyAgZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgcmlvX3VudGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworICBzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKyAgZnVuY19lbnRlcigpOworICAvKiBBbHdheXMgdW50aHJvdHRsZSBldmVuIGlmIGZsb3cgY29udHJvbCBpcyBub3QgZW5hYmxlZCBvbgorICAgKiB0aGlzIHBvcnQgaW4gY2FzZSB3ZSBkaXNhYmxlZCBmbG93IGNvbnRyb2wgd2hpbGUgdGhlIHBvcnQKKyAgICogd2FzIHRocm90dGxlZAorICAgKi8KKworICBwb3J0LT5TdGF0ZSAmPSB+UklPX1RIUk9UVExFX1JYOworCisgIGZ1bmNfZXhpdCgpOworICByZXR1cm47Cit9CisKKworCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICAgICAgSGVyZSBhcmUgdGhlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLiAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCitzdGF0aWMgc3RydWN0IHZwZF9wcm9tICpnZXRfVlBEX1BST00gKHN0cnVjdCBIb3N0ICpocCkKK3sKKyAgc3RhdGljIHN0cnVjdCB2cGRfcHJvbSB2cGRwOworICBjaGFyICpwOworICBpbnQgaTsKKworICBmdW5jX2VudGVyKCk7CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB2ZXJpZnkgdnBkIHByb20gYXQgJXAuXG4iLCAKKyAgICAgICAgICAgICAgaHAtPkNhZGRyICsgUklPX1ZQRF9ST00pOworCisgIHAgPSAoY2hhciAqKSAmdnBkcDsKKyAgZm9yIChpPTA7aTwgc2l6ZW9mIChzdHJ1Y3QgdnBkX3Byb20pO2krKykKKyAgICAqcCsrID0gcmVhZGIgKGhwLT5DYWRkcitSSU9fVlBEX1JPTSArIGkqMik7CisgICAgICAvKiByZWFkX3Jpb19ieXRlIChocCwgUklPX1ZQRF9ST00gKyBpKjIpOyAqLworCisgIC8qIFRlcm1pbmF0ZSB0aGUgaWRlbnRpZmllciBzdHJpbmcuIAorICAgICAqKiogcmVxdWlyZXMgb25lIGV4dHJhIGJ5dGUgaW4gc3RydWN0IHZwZF9wcm9tICoqKiAqLworICAqcCsrPTA7IAorCisgIGlmIChyaW9fZGVidWcgJiBSSU9fREVCVUdfUFJPQkUpCisgICAgbXlfaGQgKChjaGFyICopJnZwZHAsIDB4MjApOworICAKKyAgZnVuY19leGl0KCk7CisKKyAgcmV0dXJuICZ2cGRwOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHJpb19vcHMgPSB7CisJLm9wZW4gID0gcmlvdG9wZW4sCisJLmNsb3NlID0gZ3NfY2xvc2UsCisJLndyaXRlID0gZ3Nfd3JpdGUsCisJLnB1dF9jaGFyID0gZ3NfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gZ3NfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBnc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBnc19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IGdzX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSByaW9faW9jdGwsCisJLnRocm90dGxlID0gcmlvX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcmlvX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gZ3Nfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBnc19zdG9wLAorCS5zdGFydCA9IGdzX3N0YXJ0LAorCS5oYW5ndXAgPSBnc19oYW5ndXAsCit9OworCitzdGF0aWMgaW50IHJpb19pbml0X2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCisJcmlvX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoMjU2KTsKKwlpZiAoIXJpb19kcml2ZXIpCisJCWdvdG8gb3V0OworCXJpb19kcml2ZXIyID0gYWxsb2NfdHR5X2RyaXZlcigyNTYpOworCWlmICghcmlvX2RyaXZlcjIpCisJCWdvdG8gb3V0MTsKKworCWZ1bmNfZW50ZXIoKTsKKworCXJpb19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcmlvX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAic3BlY2lhbGl4X3JpbyI7CisJcmlvX2RyaXZlci0+bmFtZSA9ICJ0dHlTUiI7CisJcmlvX2RyaXZlci0+bWFqb3IgPSBSSU9fTk9STUFMX01BSk9SMDsKKwlyaW9fZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlyaW9fZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXJpb19kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlyaW9fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlyaW9fZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHJpb19kcml2ZXIsICZyaW9fb3BzKTsKKworCXJpb19kcml2ZXIyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXJpb19kcml2ZXIyLT5kcml2ZXJfbmFtZSA9ICJzcGVjaWFsaXhfcmlvIjsKKwlyaW9fZHJpdmVyMi0+bmFtZSA9ICJ0dHlTUiI7CisJcmlvX2RyaXZlcjItPm1ham9yID0gUklPX05PUk1BTF9NQUpPUjE7CisJcmlvX2RyaXZlcjItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXJpb19kcml2ZXIyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXJpb19kcml2ZXIyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcmlvX2RyaXZlcjItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXJpb19kcml2ZXIyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHJpb19kcml2ZXIyLCAmcmlvX29wcyk7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJzZXRfdGVybWlvcyA9ICVwXG4iLCBnc19zZXRfdGVybWlvcyk7CisKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihyaW9fZHJpdmVyKSkpCisJCWdvdG8gb3V0MjsKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihyaW9fZHJpdmVyMikpKQorCQlnb3RvIG91dDM7CisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7CitvdXQzOgorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihyaW9fZHJpdmVyKTsKK291dDI6CisJcHV0X3R0eV9kcml2ZXIocmlvX2RyaXZlcjIpOworb3V0MToKKwlwdXRfdHR5X2RyaXZlcihyaW9fZHJpdmVyKTsKK291dDoKKwlwcmludGsoS0VSTl9FUlIgInJpbzogQ291bGRuJ3QgcmVnaXN0ZXIgYSByaW8gZHJpdmVyLCBlcnJvciA9ICVkXG4iLAorCSAgICAgZXJyb3IpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkICogY2ttYWxsb2MgKGludCBzaXplKQoreworICB2b2lkICpwOworCisgIHAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworICBpZiAocCkgCisgICAgbWVtc2V0KHAsIDAsIHNpemUpOworICByZXR1cm4gcDsKK30KKworCisKK3N0YXRpYyBpbnQgcmlvX2luaXRfZGF0YXN0cnVjdHVyZXMgKHZvaWQpCit7CisgIGludCBpOworICBzdHJ1Y3QgUG9ydCAqcG9ydDsKKyAgZnVuY19lbnRlcigpOworCisgIC8qIE1hbnkgZHJpdmVycyBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3J0cworICAgICBUaGVyZSBpcyBubyByZWFzb24gbm90IHRvIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHkuIElzIHRoZXJlPyAtLSBSRVcgKi8KKyAgLyogSG93ZXZlciwgdGhlIFJJTyBkcml2ZXIgYWxsb3dzIHVzZXJzIHRvIGNvbmZpZ3VyZSB0aGVpciBmaXJzdAorICAgICBSVEEgYXMgdGhlIHBvcnRzIG51bWJlcmVkIDUwNC01MTEuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIGFsbG9jYXRlIAorICAgICB0aGUgd2hvbGUgcmFuZ2UuIDotKCAgIC0tIFJFVyAqLworICAKKyNkZWZpbmUgUklfU1ogICBzaXplb2Yoc3RydWN0IHJpb19pbmZvKQorI2RlZmluZSBIT1NUX1NaIHNpemVvZihzdHJ1Y3QgSG9zdCkKKyNkZWZpbmUgUE9SVF9TWiBzaXplb2Yoc3RydWN0IFBvcnQgKikKKyNkZWZpbmUgVE1JT19TWiBzaXplb2Yoc3RydWN0IHRlcm1pb3MgKikKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiZ2V0dGluZyA6ICVkICVkICVkICVkICVkIGJ5dGVzXG4iLCAKKyAgICAgICAgICAgICAgIFJJX1NaLCAKKyAgICAgICAgICAgICAgIFJJT19IT1NUUyAqIEhPU1RfU1osCisgICAgICAgICAgICAgICBSSU9fUE9SVFMgKiBQT1JUX1NaLAorICAgICAgICAgICAgICAgUklPX1BPUlRTICogVE1JT19TWiwKKyAgICAgICAgICAgICAgIFJJT19QT1JUUyAqIFRNSU9fU1opOworICAKKyAgaWYgKCEocCAgICAgICAgICAgICAgICAgID0gY2ttYWxsb2MgKCAgICAgICAgICAgICAgUklfU1opKSkgZ290byBmcmVlMDsKKyAgaWYgKCEocC0+UklPSG9zdHMgICAgICAgID0gY2ttYWxsb2MgKFJJT19IT1NUUyAqIEhPU1RfU1opKSkgZ290byBmcmVlMTsKKyAgaWYgKCEocC0+UklPUG9ydHAgICAgICAgID0gY2ttYWxsb2MgKFJJT19QT1JUUyAqIFBPUlRfU1opKSkgZ290byBmcmVlMjsKKyAgcC0+UklPQ29uZiA9IFJJT0NvbmY7CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkdvdCA6ICVwICVwICVwXG4iLCAKKyAgICAgICAgICAgICAgIHAsIHAtPlJJT0hvc3RzLCBwLT5SSU9Qb3J0cCk7CisKKyNpZiAxCisgIGZvciAoaSA9IDA7IGkgPCBSSU9fUE9SVFM7IGkrKykgeworICAgIHBvcnQgPSBwLT5SSU9Qb3J0cFtpXSA9IGNrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBQb3J0KSk7CisgICAgaWYgKCFwb3J0KSB7CisgICAgICBnb3RvIGZyZWU2OworICAgIH0KKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJpbml0aW5nIHBvcnQgJWQgKCVkKVxuIiwgaSwgcG9ydC0+TWFwcGVkKTsKKyAgICBwb3J0LT5Qb3J0TnVtID0gaTsKKyAgICBwb3J0LT5ncy5tYWdpYyA9IFJJT19NQUdJQzsKKyAgICBwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaLzI7CisgICAgcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKyAgICBwb3J0LT5ncy5yZCA9ICZyaW9fcmVhbF9kcml2ZXI7CisgICAgc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnBvcnRTZW0pOworICAgIC8qCisgICAgICogSW5pdGlhbGl6aW5nIHdhaXQgcXVldWUKKyAgICAgKi8KKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5vcGVuX3dhaXQpOworICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLmNsb3NlX3dhaXQpOworICB9CisjZWxzZQorICAvKiBXZSBjb3VsZCBwb3N0cG9uZSBpbml0aWFsaXppbmcgdGhlbSB0byB3aGVuIHRoZXkgYXJlIGNvbmZpZ3VyZWQuICovCisjZW5kaWYKKworCisgIAorICBpZiAocmlvX2RlYnVnICYgUklPX0RFQlVHX0lOSVQpIHsKKyAgICBteV9oZCAoJnJpb19yZWFsX2RyaXZlciwgc2l6ZW9mIChyaW9fcmVhbF9kcml2ZXIpKTsKKyAgfQorCisgIAorICBmdW5jX2V4aXQoKTsKKyAgcmV0dXJuIDA7CisKKyBmcmVlNjpmb3IgKGktLTtpPj0wO2ktLSkKKyAgICAgICAga2ZyZWUgKHAtPlJJT1BvcnRwW2ldKTsKKy8qZnJlZTU6CisgZnJlZTQ6CisgZnJlZTM6Ki9rZnJlZSAocC0+UklPUG9ydHApOworIGZyZWUyOmtmcmVlIChwLT5SSU9Ib3N0cyk7CisgZnJlZTE6CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk5vdCBlbm91Z2ggbWVtb3J5ISAlcCAlcCAlcFxuIiwgCisgICAgICAgIAkgICAgICAgcCwgcC0+UklPSG9zdHMsIHAtPlJJT1BvcnRwKTsKKyAga2ZyZWUocCk7ICAgICAgICAJICAgICAgCisgZnJlZTA6CisgIHJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCAgX19leGl0IHJpb19yZWxlYXNlX2RyaXZlcnModm9pZCkKK3sKKyAgZnVuY19lbnRlcigpOworICB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcjIpOworICB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcik7CisgIHB1dF90dHlfZHJpdmVyKHJpb19kcml2ZXIyKTsKKyAgcHV0X3R0eV9kcml2ZXIocmlvX2RyaXZlcik7CisgIGZ1bmNfZXhpdCgpOworfQorCisKKyNpZmRlZiBDT05GSUdfUENJCisgLyogVGhpcyB3YXMgd3JpdHRlbiBmb3IgU1gsIGJ1dCBhcHBsaWVzIHRvIFJJTyB0b28uLi4KKyAgICAoaW5jbHVkaW5nIGJ1Z3MuLi4uKQorCisgICAgVGhlcmUgaXMgYW5vdGhlciBiaXQgYmVzaWRlcyBCaXQgMTcuIFR1cm5pbmcgdGhhdCBiaXQgb2ZmCisgICAgKG9uIGJvYXJkcyBzaGlwcGVkIHdpdGggdGhlIGZpeCBpbiB0aGUgZWVwcm9tKSByZXN1bHRzIGluIGEgCisgICAgaGFuZyBvbiB0aGUgbmV4dCBhY2Nlc3MgdG8gdGhlIGNhcmQuIAorICovCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBTZXR0aW5nIGJpdCAxNyBpbiB0aGUgQ05UUkwgcmVnaXN0ZXIgb2YgdGhlIFBMWCA5MDUwICAqIAorICogY2hpcCBmb3JjZXMgYSByZXRyeSBvbiB3cml0ZXMgd2hpbGUgYSByZWFkIGlzIHBlbmRpbmcuKgorICogVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBjYXJkIGxvY2tpbmcgdXAgb24gSW50ZWwgWGVvbiAgKgorICogbXVsdGlwcm9jZXNzb3Igc3lzdGVtcyB3aXRoIHRoZSBOWCBjaGlwc2V0LiAgICAtLSBOViAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOZXdlciBjYXJkcyBhcmUgcHJvZHVjZWQgd2l0aCB0aGlzIGJpdCBzZXQgZnJvbSB0aGUgY29uZmlndXJhdGlvbgorICAgRUVwcm9tLiAgQXMgdGhlIGJpdCBpcyByZWFkL3dyaXRlIGZvciB0aGUgQ1BVLCB3ZSBjYW4gZml4IGl0IGhlcmUsCisgICBpZiB3ZSBkZXRlY3QgdGhhdCBpdCBpc24ndCBzZXQgY29ycmVjdGx5LiAtLSBSRVcgKi8KKworc3RhdGljIHZvaWQgZml4X3Jpb19wY2kgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICB1bnNpZ25lZCBpbnQgaHdiYXNlOworICB1bnNpZ25lZCBsb25nIHJlYmFzZTsKKyAgdW5zaWduZWQgaW50IHQ7CisKKyNkZWZpbmUgQ05UUkxfUkVHX09GRlNFVCAgICAgICAgMHg1MAorI2RlZmluZSBDTlRSTF9SRUdfR09PRFZBTFVFICAgICAweDE4MjYwMDAwCisKKyAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmh3YmFzZSk7CisgIGh3YmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworICByZWJhc2UgPSAgKHVsb25nKSBpb3JlbWFwKGh3YmFzZSwgMHg4MCk7CisgIHQgPSByZWFkbCAocmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7CisgIGlmICh0ICE9IENOVFJMX1JFR19HT09EVkFMVUUpIHsKKyAgICBwcmludGsgKEtFUk5fREVCVUcgInJpbzogcGVyZm9ybWluZyBjbnRybCByZWcgZml4OiAlMDh4IC0+ICUwOHhcbiIsIAorICAgICAgICAgICAgdCwgQ05UUkxfUkVHX0dPT0RWQUxVRSk7IAorICAgIHdyaXRlbCAoQ05UUkxfUkVHX0dPT0RWQUxVRSwgcmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7ICAKKyAgfQorICBpb3VubWFwKChjaGFyKikgcmViYXNlKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgX19pbml0IHJpb19pbml0KHZvaWQpIAoreworICBpbnQgZm91bmQgPSAwOworICBpbnQgaTsKKyAgc3RydWN0IEhvc3QgKmhwOworICBpbnQgcmV0dmFsOworICBzdHJ1Y3QgdnBkX3Byb20gKnZwZHA7CisgIGludCBva2JvYXJkOworCisjaWZkZWYgQ09ORklHX1BDSQorICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB0aW50OworICB1bnNpZ25lZCBzaG9ydCB0c2hvcnQ7CisjZW5kaWYKKworICBmdW5jX2VudGVyKCk7CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkluaXRpbmcgcmlvIG1vZHVsZS4uLiAocmlvX2RlYnVnPSVkKVxuIiwgCisJICAgICAgIHJpb19kZWJ1Zyk7CisKKyAgaWYgKGFicyAoKGxvbmcpICgmcmlvX2RlYnVnKSAtIHJpb19kZWJ1ZykgPCAweDEwMDAwKSB7CisgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgInJpbzogcmlvX2RlYnVnIGlzIGFuIGFkZHJlc3MsIGluc3RlYWQgb2YgYSB2YWx1ZS4gIgorICAgICAgICAgICAgIkFzc3VtaW5nIC0xLiBXYXMgJXgvJXAuXG4iLCByaW9fZGVidWcsICZyaW9fZGVidWcpOworICAgIHJpb19kZWJ1Zz0tMTsKKyAgfQorCisgIGlmIChtaXNjX3JlZ2lzdGVyKCZyaW9fZndfZGV2aWNlKSA8IDApIHsKKyAgICBwcmludGsoS0VSTl9FUlIgIlJJTzogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkcml2ZXIuXG4iKTsKKyAgICByZXR1cm4gLUVJTzsKKyAgfQorCisgIHJldHZhbCA9IHJpb19pbml0X2RhdGFzdHJ1Y3R1cmVzICgpOworICBpZiAocmV0dmFsIDwgMCkgeworICAgIG1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSk7CisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorCisjaWZkZWYgQ09ORklHX1BDSQorICAgIC8qIEZpcnN0IGxvb2sgZm9yIHRoZSBKRVQgZGV2aWNlczogKi8KKyAgICB3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CisgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKKworICAgICAgLyogU3BlY2lhbGl4IGhhcyBhIHdob2xlIGJ1bmNoIG9mIGNhcmRzIHdpdGgKKyAgICAgICAgIDB4MjAwMCBhcyB0aGUgZGV2aWNlIElELiBUaGV5IHNheSBpdHMgYmVjYXVzZQorICAgICAgICAgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIGl0LiBTdHVwaWQgc3RhbmRhcmQuICovCisgICAgICAvKiBJdCBzZWVtcyB0aGF0IHJlYWRpbmcgYSB3b3JkIGRvZXNuJ3Qgd29yayByZWxpYWJseSBvbiAyLjAuCisgICAgICAgICBBbHNvLCByZWFkaW5nIGEgbm9uLWFsaWduZWQgZHdvcmQgZG9lc24ndCB3b3JrLiBTbyB3ZSByZWFkIHRoZQorICAgICAgICAgd2hvbGUgZHdvcmQgYXQgMHgyYyBhbmQgZXh0cmFjdCB0aGUgd29yZCBhdCAweDJlIChTVUJTWVNURU1fSUQpCisgICAgICAgICBvdXJzZWx2ZXMgKi8KKyAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGRlZmluZSBkb2Vzbid0IHdvcmssIGNvbnN0YW50IDB4MmMgZG9lcyAtLVJFVyAqLyAKKyAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgMHgyYywgJnRpbnQpOworICAgICAgdHNob3J0ID0gKHRpbnQgPj4gMTYpICYgMHhmZmZmOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkdvdCBhIHNwZWNpYWxpeCBjYXJkOiAleC5cbiIsIHRpbnQpOworICAgICAgaWYgKHRzaG9ydCAhPSAweDAxMDApIHsKKyAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkJ1dCBpdCdzIG5vdCBhIFJJTyBjYXJkICglZCkuLi5cbiIsIAorICAgICAgICAgICAgICAgICAgICB0c2hvcnQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJjcDFcbiIpOworCisgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmdGludCk7CisKKyAgICAgIGhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKKyAgICAgIGhwLT5QYWRkclAgPSAgdGludCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisgICAgICBocC0+SXZlYyA9IHBkZXYtPmlycTsKKyAgICAgIGlmICgoKDEgPDwgaHAtPkl2ZWMpICYgcmlvX2lycW1hc2spID09IDApCisgICAgICAgICAgICAgIGhwLT5JdmVjID0gMDsKKyAgICAgIGhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworICAgICAgaHAtPkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKSBocC0+Q2FkZHI7CisgICAgICBocC0+VHlwZSAgPSBSSU9fUENJOworICAgICAgaHAtPkNvcHkgID0gcmlvX3BjaWNvcHk7IAorICAgICAgaHAtPk1vZGUgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOworICAgICAgc3Bpbl9sb2NrX2luaXQoJmhwLT5Ib3N0TG9jayk7CisgICAgICByaW9fcmVzZXRfaW50ZXJydXB0IChocCk7CisgICAgICByaW9fc3RhcnRfY2FyZF9ydW5uaW5nIChocCk7CisKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOworICAgICAgaWYgKFJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICBSSU9fUENJLCAwICkgPT0gUklPX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRG9uZSBSSU9Cb2FyZFRlc3RcbiIpOworICAgICAgICAgICAgICBXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsIDB4ZmYpOworICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtICA9CisgICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSAmMHhGRik8PCAwKXwKKyAgICAgICAgICAgICAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pICYweEZGKTw8IDgpfAorICAgICAgICAgICAgICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkgJjB4RkYpPDwxNil8CisgICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSAmMHhGRik8PDI0KTsKKyAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIHVuaXFpZCA9ICV4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZml4X3Jpb19wY2kgKHBkZXYpOworICAgICAgICAgICAgICBwLT5SSU9MYXN0UENJU2VhcmNoID0gUklPX1NVQ0NFU1M7CisgICAgICAgICAgICAgIHAtPlJJT051bUhvc3RzKys7CisgICAgICAgICAgICAgIGZvdW5kKys7CisgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpb3VubWFwKChjaGFyKikgKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcikpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBQQ0kgY2FyZC4uLi4gOiAqLworCisgIC8qIFRoZXNlIG9sZGVyIFBDSSBjYXJkcyBoYXZlIHByb2JsZW1zIChvbmx5IGJ5dGUtbW9kZSBhY2Nlc3MgaXMKKyAgICAgc3VwcG9ydGVkKSwgd2hpY2ggbWFrZXMgdGhlbSBhIGJpdCBhd2t3YXJkIHRvIHN1cHBvcnQuIAorICAgICBUaGV5IGFsc28gaGF2ZSBwcm9ibGVtcyBzaGFyaW5nIGludGVycnVwdHMuIEJlIGNhcmVmdWwuIAorICAgICAoVGhlIGRyaXZlciBub3cgcmVmdXNlcyB0byBzaGFyZSBpbnRlcnJ1cHRzIGZvciB0aGVzZQorICAgICBjYXJkcy4gVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCkuCisgICovCisKKyAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBSSU8vUENJIGRldmljZXM6ICovCisgICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9SSU8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CisgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKKworI2lmZGVmIENPTkZJR19SSU9fT0xEUENJCisgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmdGludCk7CisKKyAgICAgIGhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKKyAgICAgIGhwLT5QYWRkclAgPSAgdGludCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisgICAgICBocC0+SXZlYyA9IHBkZXYtPmlycTsKKyAgICAgIGlmICgoKDEgPDwgaHAtPkl2ZWMpICYgcmlvX2lycW1hc2spID09IDApIAorICAgICAgCWhwLT5JdmVjID0gMDsKKyAgICAgIGhwLT5JdmVjIHw9IDB4ODAwMDsgLyogTWFyayBhcyBub24tc2hhcmFibGUgKi8KKyAgICAgIGhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworICAgICAgaHAtPkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKSBocC0+Q2FkZHI7CisgICAgICBocC0+VHlwZSAgPSBSSU9fUENJOworICAgICAgaHAtPkNvcHkgID0gcmlvX3BjaWNvcHk7CisgICAgICBocC0+TW9kZSAgPSBSSU9fUENJX0JPT1RfRlJPTV9SQU07CisgICAgICBzcGluX2xvY2tfaW5pdCgmaHAtPkhvc3RMb2NrKTsKKworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkl2ZWM6ICV4XG4iLCBocC0+SXZlYyk7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiTW9kZTogJXhcbiIsIGhwLT5Nb2RlKTsKKworICAgICAgcmlvX3Jlc2V0X2ludGVycnVwdCAoaHApOworICAgICAgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoaHApOworICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOworICAgICAgaWYgKFJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICBSSU9fUENJLCAwICkgPT0gUklPX1NVQ0NFU1MpIHsKKyAgICAgICAgV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LCAweGZmKTsKKyAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSAgPQorICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkgJjB4RkYpPDwgMCl8CisgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSAmMHhGRik8PCA4KXwKKyAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMl0pICYweEZGKTw8MTYpfAorICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkgJjB4RkYpPDwyNCk7CisgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsCisgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSk7CisKKyAgICAgICAgcC0+UklPTGFzdFBDSVNlYXJjaCA9IFJJT19TVUNDRVNTOworICAgICAgICBwLT5SSU9OdW1Ib3N0cysrOworICAgICAgICBmb3VuZCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW91bm1hcCgoY2hhciopIChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBwcmludGsgKEtFUk5fRVJSICJGb3VuZCBhbiBvbGRlciBSSU8gUENJIGNhcmQsIGJ1dCB0aGUgZHJpdmVyIGlzIG5vdCAiCisgICAgICAgICAgICAgICJjb21waWxlZCB0byBzdXBwb3J0IGl0LlxuIik7CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogUENJICovCisKKyAgLyogTm93IHByb2JlIGZvciBJU0EgY2FyZHMuLi4gKi8KKyAgZm9yIChpPTA7aTxOUl9SSU9fQUREUlM7aSsrKSB7CisgICAgaHAgPSAmcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdOworICAgIGhwLT5QYWRkclAgPSByaW9fcHJvYmVfYWRkcnNbaV07CisgICAgLyogVGhlcmUgd2FzIHNvbWV0aGluZyBhYm91dCB0aGUgSVJRcyBvZiB0aGVzZSBjYXJkcy4gJ0ZvcmdldCB3aGF0Li0tUkVXICovCisgICAgaHAtPkl2ZWMgPSAwOworICAgIGhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworICAgIGhwLT5DYXJkUCA9IChzdHJ1Y3QgRHBSYW0gKikgaHAtPkNhZGRyOworICAgIGhwLT5UeXBlID0gUklPX0FUOworICAgIGhwLT5Db3B5ID0gcmlvX3BjaWNvcHk7IC8qIEFUIGNhcmQgUENJPz8/PyAtIFBWREwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAtLSBZRVMhIHRoaXMgaXMgbm93IGEgbm9ybWFsIGNvcHkuIE9ubHkgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9sZCBQQ0kgY2FyZCB1c2VzIHRoZSBzcGVjaWFsIFBDSSBjb3B5LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBNb3Jlb3ZlciwgdGhlIElTQSBjYXJkIHdpbGwgd29yayB3aXRoIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzcGVjaWFsIFBDSSBjb3B5IGFueXdheS4gLS0gUkVXICovCisgICAgaHAtPk1vZGUgPSAwOworICAgIHNwaW5fbG9ja19pbml0KCZocC0+SG9zdExvY2spOworCisgICAgdnBkcCA9IGdldF9WUERfUFJPTSAoaHApOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb3QgVlBEIFJPTVxuIik7CisgICAgb2tib2FyZCA9IDA7CisgICAgaWYgKChzdHJuY21wICh2cGRwLT5pZGVudGlmaWVyLCBSSU9fSVNBX0lERU5ULCAxNikgPT0gMCkgfHwKKyAgICAgICAgKHN0cm5jbXAgKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EyX0lERU5ULCAxNikgPT0gMCkgfHwKKyAgICAgICAgKHN0cm5jbXAgKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EzX0lERU5ULCAxNikgPT0gMCkpIHsKKyAgICAgIC8qIEJvYXJkIGlzIHByZXNlbnQuLi4gKi8KKyAgICAgIGlmIChSSU9Cb2FyZFRlc3QgKGhwLT5QYWRkclAsIAorICAgICAgICAgICAgICAgICAgICAgICAgaHAtPkNhZGRyLCBSSU9fQVQsIDApID09IFJJT19TVUNDRVNTKSB7CisgICAgICAgIC8qIC4uLiBhbmQgZmVlbGluZyBmaW5lISEhISAqLworICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLAorICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworICAgICAgICBpZiAoUklPQXNzaWduQVQocCwgaHAtPlBhZGRyUCwgaHAtPkNhZGRyLCAwKSkgeyAgICAgICAgCisgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIGhvc3QlZCB1bmlxaWQgPSAleC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT051bUhvc3RzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHMtMV0uVW5pcXVlTnVtKTsKKyAgICAgICAgICBva2JvYXJkKys7CisgICAgICAgICAgZm91bmQrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgaWYgKCFva2JvYXJkKQorICAgICAgaW91bm1hcCAoKGNoYXIqKSAoaHAtPkNhZGRyKSk7CisgICAgfQorICB9CisKKworICBmb3IgKGk9MDtpPHAtPlJJT051bUhvc3RzO2krKykgeworICAgIGhwID0gJnAtPlJJT0hvc3RzW2ldOworICAgIGlmIChocC0+SXZlYykgeworICAgICAgaW50IG1vZGUgPSBTQV9TSElSUTsKKyAgICAgIGlmIChocC0+SXZlYyAmIDB4ODAwMCkge21vZGUgPSAwOyBocC0+SXZlYyAmPSAweDdmZmY7fQorICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUmVxdWVzdGluZyBpbnRlcnJ1cHQgaHA6ICVwIHJpb19pbnRlcnJ1cHQ6ICVkIE1vZGU6ICV4XG4iLCBocCxocC0+SXZlYywgaHAtPk1vZGUpOworICAgICAgcmV0dmFsID0gcmVxdWVzdF9pcnEgKGhwLT5JdmVjLCByaW9faW50ZXJydXB0LCBtb2RlLCAicmlvIiwgaHApOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUmV0dXJuIHZhbHVlIGZyb20gcmVxdWVzdF9pcnE6ICVkXG4iLCByZXR2YWwpOworICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInJpbzogQ2Fubm90IGFsbG9jYXRlIGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKKyAgICAgICAgICAgICAgaHAtPkl2ZWMgPSAwOworICAgICAgfQorICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiR290IGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKKyAgICAgIGlmIChocC0+SXZlYyAhPSAwKXsKKyAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRW5hYmxpbmcgaW50ZXJydXB0cyBvbiByaW8gY2FyZC5cbiIpOyAKKyAgICAgICAgICAgICAgaHAtPk1vZGUgfD0gUklPX1BDSV9JTlRfRU5BQkxFOworICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIGhwLT5Nb2RlICY9ICFSSU9fUENJX0lOVF9FTkFCTEU7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOZXcgTW9kZTogJXhcbiIsIGhwLT5Nb2RlKTsKKyAgICAgIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKGhwKTsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgdGltZXIgImFsd2F5cyIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgY2FuIHNhZmVseSBiZSAKKyAgICAgICBkZWxldGVkIHdoZW4gd2UgdW5sb2FkLi4uICovCisKKyAgICBpbml0X3RpbWVyICgmaHAtPnRpbWVyKTsKKyAgICBpZiAoIWhwLT5JdmVjKSB7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTdGFydGluZyBwb2xsaW5nIGF0ICVkaiBpbnRlcnZhbHMuXG4iLCAKKyAgICAgICAgICAgICAgICAgICByaW9fcG9sbCk7CisgICAgICBocC0+dGltZXIuZGF0YSA9IGk7CisgICAgICBocC0+dGltZXIuZnVuY3Rpb24gPSByaW9fcG9sbGZ1bmM7CisgICAgICBocC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyByaW9fcG9sbDsKKyAgICAgIGFkZF90aW1lciAoJmhwLT50aW1lcik7CisgICAgfQorICB9CisKKyAgaWYgKGZvdW5kKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAicmlvOiB0b3RhbCBvZiAlZCBib2FyZHMgZGV0ZWN0ZWQuXG4iLCBmb3VuZCk7CisgICAgcmlvX2luaXRfZHJpdmVycyAoKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBkZXJlZ2lzdGVyIHRoZSBtaXNjIGRldmljZSB3ZSBjcmVhdGVkIGVhcmxpZXIgKi8KKyAgICBtaXNjX2RlcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpOworICB9CisKKyAgZnVuY19leGl0KCk7CisgIHJldHVybiBmb3VuZD8wOi1FSU87Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHJpb19leGl0ICh2b2lkKQoreworICBpbnQgaTsgCisgIHN0cnVjdCBIb3N0ICpocDsKKyAgCisgIGZ1bmNfZW50ZXIoKTsKKworICBmb3IgKGk9MCxocD1wLT5SSU9Ib3N0cztpPHAtPlJJT051bUhvc3RzO2krKywgaHArKykgeworICAgIFJJT0hvc3RSZXNldCAoaHAtPlR5cGUsIGhwLT5DYXJkUCwgaHAtPlNsb3QpOworICAgIGlmIChocC0+SXZlYykgeworICAgICAgZnJlZV9pcnEgKGhwLT5JdmVjLCBocCk7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJmcmVlZCBpcnEgJWQuXG4iLCBocC0+SXZlYyk7CisgICAgfQorICAgIC8qIEl0IGlzIHNhZmUvYWxsb3dlZCB0byBkZWxfdGltZXIgYSBub24tYWN0aXZlIHRpbWVyICovCisgICAgZGVsX3RpbWVyICgmaHAtPnRpbWVyKTsKKyAgfQorCisgIGlmIChtaXNjX2RlcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpIDwgMCkgeworICAgIHByaW50ayAoS0VSTl9JTkZPICJyaW86IGNvdWxkbid0IGRlcmVnaXN0ZXIgY29udHJvbC1kZXZpY2VcbiIpOworICB9CisKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBkcml2ZXJzXG4iKTsKKworICByaW9fcmVsZWFzZV9kcml2ZXJzICgpOworCisgIC8qIFJlbGVhc2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICBrZnJlZSAocC0+UklPUG9ydHApOworICBrZnJlZSAocC0+UklPSG9zdHMpOworICBrZnJlZSAocCk7CisKKyAgZnVuY19leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KHJpb19pbml0KTsKK21vZHVsZV9leGl0KHJpb19leGl0KTsKKworLyoKKyAqIEFueWJvZHkgd2hvIGtub3dzIHdoeSB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgbWUsIHBsZWFzZSB0ZWxsIG1lIC0tIFJFVy4KKyAqIFNuYXRjaGVkIGZyb20gc2NzaS5jIChmaXhlZCBvbmUgc3BlbGxpbmcgZXJyb3IpOgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cycgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiA0CisgKiBjLWJyYWNlLWltYWdpbmFyeS1vZmZzZXQ6IDAKKyAqIGMtYnJhY2Utb2Zmc2V0OiAtNAorICogYy1hcmdkZWNsLWluZGVudDogNAorICogYy1sYWJlbC1vZmZzZXQ6IC00CisgKiBjLWNvbnRpbnVlZC1zdGF0ZW1lbnQtb2Zmc2V0OiA0CisgKiBjLWNvbnRpbnVlZC1icmFjZS1vZmZzZXQ6IDAKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiYTE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5oCkBAIC0wLDAgKzEsMTg3IEBACisKKy8qCisgKiAgcmlvX2xpbnV4LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LDE5OTksMjAwMCBSLkUuV29sZmZAQml0V2l6YXJkLm5sCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBSSU8gc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgVmVyc2lvbiAxLjAgLS0gSnVseSwgMTk5OS4gCisgKiAKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIFJJT19OQk9BUkRTICAgICAgICA0CisjZGVmaW5lIFJJT19QT1JUU1BFUkJPQVJEIDEyOAorI2RlZmluZSBSSU9fTlBPUlRTICAgICAgICAoUklPX05CT0FSRFMgKiBSSU9fUE9SVFNQRVJCT0FSRCkKKworI2RlZmluZSBNT0RFTV9TVVBQT1JUCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUklPX01BR0lDIDB4MTIzNDU2NzgKKworCitzdHJ1Y3QgdnBkX3Byb20geworICB1bnNpZ25lZCBzaG9ydCBpZDsKKyAgY2hhciBod3JldjsKKyAgY2hhciBod2FzczsKKyAgaW50IHVuaXFpZDsKKyAgY2hhciBteWVhcjsKKyAgY2hhciBtd2VlazsKKyAgY2hhciBod19mZWF0dXJlWzVdOworICBjaGFyIG9lbV9pZDsKKyAgY2hhciBpZGVudGlmaWVyWzE2XTsKK307CisKKworI2RlZmluZSBSSU9fREVCVUdfQUxMICAgICAgICAgICAweGZmZmZmZmZmCisKKyNkZWZpbmUgT19PVEhFUih0dHkpICAgIFwKKyAgICAgICgoT19PTENVQyh0dHkpKSAgfHxcCisgICAgICAoT19PTkxDUih0dHkpKSAgIHx8XAorICAgICAgKE9fT0NSTkwodHR5KSkgICB8fFwKKyAgICAgIChPX09OT0NSKHR0eSkpICAgfHxcCisgICAgICAoT19PTkxSRVQodHR5KSkgIHx8XAorICAgICAgKE9fT0ZJTEwodHR5KSkgICB8fFwKKyAgICAgIChPX09GREVMKHR0eSkpICAgfHxcCisgICAgICAoT19OTERMWSh0dHkpKSAgIHx8XAorICAgICAgKE9fQ1JETFkodHR5KSkgICB8fFwKKyAgICAgIChPX1RBQkRMWSh0dHkpKSAgfHxcCisgICAgICAoT19CU0RMWSh0dHkpKSAgIHx8XAorICAgICAgKE9fVlRETFkodHR5KSkgICB8fFwKKyAgICAgIChPX0ZGRExZKHR0eSkpKQorCisvKiBTYW1lIGZvciBpbnB1dC4gKi8KKyNkZWZpbmUgSV9PVEhFUih0dHkpICAgIFwKKyAgICAgICgoSV9JTkxDUih0dHkpKSAgfHxcCisgICAgICAoSV9JR05DUih0dHkpKSAgIHx8XAorICAgICAgKElfSUNSTkwodHR5KSkgICB8fFwKKyAgICAgIChJX0lVQ0xDKHR0eSkpICAgfHxcCisgICAgICAoTF9JU0lHKHR0eSkpKQorCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworI2RlZmluZSBSSU9fQk9BUkRfSU5UUl9MT0NLICAxCisKKworI2lmbmRlZiBSSU9DVExfTUlTQ19NSU5PUiAKKy8qIEFsbG93IG90aGVycyB0byBnYXRoZXIgdGhpcyBpbnRvICJtYWpvci5oIiBvciBzb21ldGhpbmcgbGlrZSB0aGF0ICovCisjZGVmaW5lIFJJT0NUTF9NSVNDX01JTk9SICAgIDE2OQorI2VuZGlmCisKKworLyogQWxsb3cgdXMgdG8gZGVidWcgImluIHRoZSBmaWVsZCIgd2l0aG91dCByZXF1aXJpbmcgY2xpZW50cyB0bworICAgcmVjb21waWxlLi4uLiAqLworI2lmIDEKKyNkZWZpbmUgcmlvX3NwaW5fbG9ja19pcnFzYXZlKHNlbSwgZmxhZ3MpIGRvIHsgXAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfU1BJTkxPQ0ssICJzcGlubG9ja2lycXNhdmU6ICVwICVzOiVkXG4iLCBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW0sIF9fRklMRV9fLCBfX0xJTkVfXyk7XAorCXNwaW5fbG9ja19pcnFzYXZlKHNlbSwgZmxhZ3MpO1wKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpIGRvIHsgXAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfU1BJTkxPQ0ssICJzcGludW5sb2NraXJxcmVzdG9yZTogJXAgJXM6JWRcbiIsXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtLCBfX0ZJTEVfXywgX19MSU5FX18pO1wKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpO1wKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHJpb19zcGluX2xvY2soc2VtKSBkbyB7IFwKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1NQSU5MT0NLLCAic3BpbmxvY2s6ICVwICVzOiVkXG4iLFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbSwgX19GSUxFX18sIF9fTElORV9fKTtcCisJc3Bpbl9sb2NrKHNlbSk7XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgcmlvX3NwaW5fdW5sb2NrKHNlbSkgZG8geyBcCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19TUElOTE9DSywgInNwaW51bmxvY2s6ICVwICVzOiVkXG4iLFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbSwgX19GSUxFX18sIF9fTElORV9fKTtcCisJc3Bpbl91bmxvY2soc2VtKTtcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHJpb19zcGluX2xvY2tfaXJxc2F2ZShzZW0sIGZsYWdzKSBcCisgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZShzZW0sIGZsYWdzKQorCisjZGVmaW5lIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpIFwKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2VtLCBmbGFncykKKworI2RlZmluZSByaW9fc3Bpbl9sb2NrKHNlbSkgXAorICAgICAgICAgICAgc3Bpbl9sb2NrKHNlbSkgCisKKyNkZWZpbmUgcmlvX3NwaW5fdW5sb2NrKHNlbSkgXAorICAgICAgICAgICAgc3Bpbl91bmxvY2soc2VtKSAKKworI2VuZGlmCisKKworCisjaWZkZWYgQ09ORklHX1JJT19PTERQQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmlvX21lbWNweV90b2lvICh2b2lkICpkdW1teSwgdm9pZCAqZGVzdCwgdm9pZCAqc291cmNlLCBpbnQgbikKK3sKKyAgY2hhciAqZHN0ID0gZGVzdDsKKyAgY2hhciAqc3JjID0gc291cmNlOworCisgIHdoaWxlIChuLS0pIHsKKyAgICB3cml0ZWIgKCpzcmMrKywgZHN0KyspOworICAgICh2b2lkKSByZWFkYiAoZHVtbXkpOworICB9CisKKyAgcmV0dXJuIGRlc3Q7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkICpyaW9fbWVtY3B5X2Zyb21pbyAodm9pZCAqZGVzdCwgdm9pZCAqc291cmNlLCBpbnQgbikKK3sKKyAgY2hhciAqZHN0ID0gZGVzdDsKKyAgY2hhciAqc3JjID0gc291cmNlOworCisgIHdoaWxlIChuLS0pIAorICAgICpkc3QrKyA9IHJlYWRiIChzcmMrKyk7CisKKyAgcmV0dXJuIGRlc3Q7Cit9CisKKyNlbHNlCisjZGVmaW5lIHJpb19tZW1jcHlfdG9pbyhkdW1teSxkZXN0LHNvdXJjZSxuKSAgIG1lbWNweV90b2lvKGRlc3QsIHNvdXJjZSwgbikKKyNkZWZpbmUgcmlvX21lbWNweV9mcm9taW8gICAgICAgICAgICAgICAgICAgICAgbWVtY3B5X2Zyb21pbworI2VuZGlmCisKKyNkZWZpbmUgREVCVUcgMQorCisKKy8qIAorICAgVGhpcyBkcml2ZXIgY2FuIHNwZXcgYSB3aG9sZSBsb3Qgb2YgZGVidWdnaW5nIG91dHB1dCBhdCB5b3UuIElmIHlvdQorICAgbmVlZCBtYXhpbXVtIHBlcmZvcm1hbmNlLCB5b3Ugc2hvdWxkIGRpc2FibGUgdGhlIERFQlVHIGRlZmluZS4gVG8KKyAgIGFpZCBpbiBkZWJ1Z2dpbmcgaW4gdGhlIGZpZWxkLCBJJ20gbGVhdmluZyB0aGUgY29tcGlsZS10aW1lIGRlYnVnCisgICBmZWF0dXJlcyBlbmFibGVkLCBhbmQgZGlzYWJsZSB0aGVtICJydW50aW1lIi4gVGhhdCBhbGxvd3MgbWUgdG8KKyAgIGluc3RydWN0IHBlb3BsZSB3aXRoIHByb2JsZW1zIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgd2l0aG91dCByZXF1aXJpbmcKKyAgIHRoZW0gdG8gcmVjb21waWxlLi4uIAorKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIHJpb19kcHJpbnRrKGYsIHN0ci4uLikgZG8geyBpZiAocmlvX2RlYnVnICYgZikgcHJpbnRrIChzdHIpO30gd2hpbGUgKDApCisjZGVmaW5lIGZ1bmNfZW50ZXIoKSByaW9fZHByaW50ayAoUklPX0RFQlVHX0ZMT1csICJyaW86IGVudGVyICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIGZ1bmNfZXhpdCgpICByaW9fZHByaW50ayAoUklPX0RFQlVHX0ZMT1csICJyaW86IGV4aXQgICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIGZ1bmNfZW50ZXIyKCkgcmlvX2RwcmludGsgKFJJT19ERUJVR19GTE9XLCAicmlvOiBlbnRlciAlcyAocG9ydCAlZClcbiIsX19GVU5DVElPTl9fLCBwb3J0LT5saW5lKQorI2Vsc2UKKyNkZWZpbmUgcmlvX2RwcmludGsoZiwgc3RyLi4uKSAvKiBub3RoaW5nICovCisjZGVmaW5lIGZ1bmNfZW50ZXIoKQorI2RlZmluZSBmdW5jX2V4aXQoKQorI2RlZmluZSBmdW5jX2VudGVyMigpCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmFjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2JvYXJkLmgKQEAgLTAsMCArMSwyODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaXRsZQkJOglSSU8gSG9zdCBDYXJkIEhhcmR3YXJlIERlZmluaXRpb25zCSovCisvKgkJCQkJCQkJCSovCisvKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDcmVhdGlvbgk6CTI2dGggQXByaWwgMTk5OQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJVmVyc2lvbgkJOgkxLjAuMAkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNvcHlyaWdodAk6CShjKSBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuIDE5OTkJKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCQkJCQkJCQkJKi8KKy8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KKy8qCQkJCWRlc2NyaWJpbmcgdGhlIFJJTyBib2FyZCBoYXJkd2FyZQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGlzdG9yeS4uLgorCisxLjAuMAkyNi8wNC85OSBOUFYJQ3JlYXRpb24uCisKKyovCisKKyNpZm5kZWYJX3Jpb2JvYXJkX2gJCQkJLyogSWYgUklPQk9BUkQuSCBub3QgYWxyZWFkeSBkZWZpbmVkICovCisjZGVmaW5lCV9yaW9ib2FyZF9oICAgIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgSGFyZHdhcmUgQ29udHJvbCBSZWdpc3RlcnMgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGFyZHdhcmUgUmVnaXN0ZXJzLi4uICovCisKKyNkZWZpbmUJUklPX1JFR19CQVNFCTB4N0MwMAkJCS8qIEJhc2Ugb2YgY29udHJvbCByZWdpc3RlcnMgKi8KKworI2RlZmluZQlSSU9fQ09ORklHCVJJT19SRUdfQkFTRSArIDB4MDAwMAkvKiBXUklURTogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlSSU9fSU5UU0VUCVJJT19SRUdfQkFTRSArIDB4MDA4MAkvKiBXUklURTogSW50ZXJydXB0IFNldCAqLworI2RlZmluZQlSSU9fUkVTRVQJUklPX1JFR19CQVNFICsgMHgwMTAwCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisjZGVmaW5lCVJJT19JTlRSRVNFVAlSSU9fUkVHX0JBU0UgKyAweDAxODAJLyogV1JJVEU6IEludGVycnVwdCBSZXNldCAqLworCisjZGVmaW5lCVJJT19WUERfUk9NCVJJT19SRUdfQkFTRSArIDB4MDAwMAkvKiBSRUFEOiBWaXRhbCBQcm9kdWN0IERhdGEgUk9NICovCisjZGVmaW5lCVJJT19JTlRTVEFUCVJJT19SRUdfQkFTRSArIDB4MDA4MAkvKiBSRUFEOiBJbnRlcnJ1cHQgU3RhdHVzIChKZXQgYm9hcmRzIG9ubHkpICovCisjZGVmaW5lCVJJT19SRVNFVFNUQVQJUklPX1JFR19CQVNFICsgMHgwMTAwCS8qIFJFQUQ6IFJlc2V0IFN0YXR1cyAoSmV0IGJvYXJkcyBvbmx5KSAqLworCisvKiBSSU9fVlBEX1JPTSBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlWUERfU0xYX0lEMQkweDAwCQkJLyogUkVBRDogU3BlY2lhbGl4IElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJVlBEX1NMWF9JRDIJMHgwMQkJCS8qIFJFQUQ6IFNwZWNpYWxpeCBJZGVudGlmaWVyICMyICovCisjZGVmaW5lCVZQRF9IV19SRVYJMHgwMgkJCS8qIFJFQUQ6IEhhcmR3YXJlIFJldmlzaW9uICovCisjZGVmaW5lCVZQRF9IV19BU1NFTQkweDAzCQkJLyogUkVBRDogSGFyZHdhcmUgQXNzZW1ibHkgTGV2ZWwgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlENAkweDA0CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzQgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMwkweDA1CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzMgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMgkweDA2CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzIgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMQkweDA3CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJVlBEX01BTlVfWUVBUgkweDA4CQkJLyogUkVBRDogWWVhciBPZiBNYW51ZmFjdHVyZSAoMCA9IDE5NzApICovCisjZGVmaW5lCVZQRF9NQU5VX1dFRUsJMHgwOQkJCS8qIFJFQUQ6IFdlZWsgT2YgTWFudWZhY3R1cmUgKDAgPSB3ZWVrIDEgSmFuKSAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFMQkweDBBCQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDEgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTIJMHgwQgkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSAyICovCisjZGVmaW5lCVZQRF9IV0ZFQVRVUkUzCTB4MEMJCQkvKiBSRUFEOiBIYXJkd2FyZSBGZWF0dXJlIEJ5dGUgMyAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFNAkweDBECQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDQgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTUJMHgwRQkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSA1ICovCisjZGVmaW5lCVZQRF9PRU1JRAkweDBGCQkJLyogUkVBRDogT0VNIElkZW50aWZpZXIgKi8KKyNkZWZpbmUJVlBEX0lERU5UCTB4MTAJCQkvKiBSRUFEOiBJZGVudGlmaWVyIHN0cmluZyAoMTYgYnl0ZXMpICovCisjZGVmaW5lCVZQRF9JREVOVF9MRU4JMHgxMAorCisvKiBWUEQgUk9NIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVNMWF9JRDEJCTB4NEQKKyNkZWZpbmUJU0xYX0lEMgkJMHg5OAorCisjZGVmaW5lCVBST0RVQ1RfSUQoYSkJKChhPj40KSYweEYpCQkvKiBVc2UgdG8gb2J0YWluIFByb2R1Y3QgSUQgZnJvbSBWUERfVU5JUVVFSUQxICovCisKKyNkZWZpbmUJSURfU1hfSVNBCTB4MgorI2RlZmluZQlJRF9SSU9fRUlTQQkweDMKKyNkZWZpbmUJSURfU1hfUENJCTB4NQorI2RlZmluZQlJRF9TWF9FSVNBCTB4NworI2RlZmluZQlJRF9SSU9fUlRBMTYJMHg5CisjZGVmaW5lCUlEX1JJT19JU0EJMHhBCisjZGVmaW5lCUlEX1JJT19NQ0EJMHhCCisjZGVmaW5lCUlEX1JJT19TQlVTCTB4QworI2RlZmluZQlJRF9SSU9fUENJCTB4RAorI2RlZmluZQlJRF9SSU9fUlRBOAkweEUKKworLyogVHJhbnNwdXRlciBib290c3RyYXAgZGVmaW5pdGlvbnMuLi4gKi8KKworI2RlZmluZQlCT09UTE9BREFERFIJCSgweDgwMDAgLSA2KQorI2RlZmluZQlCT09USU5ESUNBVEUJCSgweDgwMDAgLSAyKQorCisvKiBGaXJtd2FyZSBsb2FkIHBvc2l0aW9uLi4uICovCisKKyNkZWZpbmUJRklSTVdBUkVMT0FEQUREUgkweDdDMDAJCS8qIEZpcm13YXJlIGlzIGxvYWRlZCBfYmVmb3JlXyB0aGlzIGFkZHJlc3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIChSZXYxKSBJU0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fSVNBX0lERU5UCSJKQkpHUEdHSElOU01KUEpSIgorCisjZGVmaW5lCVJJT19JU0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19JU0FfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fSVNBX0NGR19JUlFNQVNLCTB4MzAJCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJRMTIJMHgxMAkJLyogSW50ZXJydXB0IExldmVsIDEyICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJRMTEJMHgyMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJROQkweDMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgOSAqLworI2RlZmluZQlSSU9fSVNBX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19JU0FfQ0ZHX1dBSVRTVEFURTAJMHg4MAkJLyogMCB3YWl0c3RhdGVzLCBlbHNlIDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIChSZXYyKSBJU0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fSVNBMl9JREVOVAkiSkJKR1BHR0hJTlNNSlBKUiIKKworI2RlZmluZQlSSU9fSVNBMl9DRkdfQk9PVFJBTQkweDAxCQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fSVNBMl9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fSVNBMl9DRkdfMTZCSVQJMHgwOAkJLyogMTZiaXQgbW9kZSwgZWxzZSA4Yml0ICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19JUlFNQVNLCTB4MzAJCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTE1CTB4MDAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLworI2RlZmluZQkgIFJJT19JU0EyX0NGR19JUlExMgkweDEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTEJMHgyMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTkJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0xJTksyMAkweDQwCQkvKiAyME1icHMgbGluaywgZWxzZSAxME1icHMgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX1dBSVRTVEFURTAJMHg4MAkJLyogMCB3YWl0c3RhdGVzLCBlbHNlIDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIChKZXQpIElTQSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fSVNBM19JREVOVAkiSkVUIEhPU1QgQlkgS0VWIyIKKworI2RlZmluZQlSSU9fSVNBM19DRkdfQlVTRU5BQkxFCTB4MDIJCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCisjZGVmaW5lCVJJT19JU0EzX0NGR19JTlRFTkFCTEUJMHgwNAkJLyogSW50ZXJydXB0IGVuYWJsZSwgZWxzZSBkaXNhYmxlICovCisjZGVmaW5lCVJJT19JU0EzMl9DRkdfSVJRTUFTSwkweEYzMAkJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJICBSSU9fSVNBM19DRkdfSVJRMTUJMHhGMAkJLyogSW50ZXJydXB0IExldmVsIDE1ICovCisjZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTEyCTB4QzAJCS8qIEludGVycnVwdCBMZXZlbCAxMiAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMQkweEIwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTEgKi8KKyNkZWZpbmUJICBSSU9fSVNBM19DRkdfSVJRMTAJMHhBMAkJLyogSW50ZXJydXB0IExldmVsIDEwICovCisjZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTkJMHg5MAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyBNQ0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fTUNBX0lERU5UCSJKQkpHUEdHSElOU01KUEpSIgorCisjZGVmaW5lCVJJT19NQ0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19NQ0FfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fTUNBX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyBFSVNBICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVJU0EgQ29uZmlndXJhdGlvbiBTcGFjZSBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlFSVNBX1BST0RVQ1RfSUQxCTB4QzgwCisjZGVmaW5lCUVJU0FfUFJPRFVDVF9JRDIJMHhDODEKKyNkZWZpbmUJRUlTQV9QUk9EVUNUX05VTUJFUgkweEM4MgorI2RlZmluZQlFSVNBX1JFVklTSU9OX05VTUJFUgkweEM4MworI2RlZmluZQlFSVNBX0NBUkRfRU5BQkxFCTB4Qzg0CisjZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlENAkweEM4OAkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzQgKi8KKyNkZWZpbmUJRUlTQV9WUERfVU5JUVVFSUQzCTB4QzhBCQkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjMyAqLworI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDIJMHhDOTAJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMyICovCisjZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlEMQkweEM5MgkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJRUlTQV9WUERfTUFOVV9ZRUFSCTB4Qzk4CQkvKiBSRUFEOiBZZWFyIE9mIE1hbnVmYWN0dXJlICgwID0gMTk3MCkgKi8KKyNkZWZpbmUJRUlTQV9WUERfTUFOVV9XRUVLCTB4QzlBCQkvKiBSRUFEOiBXZWVrIE9mIE1hbnVmYWN0dXJlICgwID0gd2VlayAxIEphbikgKi8KKyNkZWZpbmUJRUlTQV9NRU1fQUREUl8yM18xNgkweEMwMAorI2RlZmluZQlFSVNBX01FTV9BRERSXzMxXzI0CTB4QzAxCisjZGVmaW5lCUVJU0FfUklPX0NPTkZJRwkJMHhDMDIJCS8qIFdSSVRFOiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUVJU0FfUklPX0lOVFNFVAkJMHhDMDMJCS8qIFdSSVRFOiBJbnRlcnJ1cHQgU2V0ICovCisjZGVmaW5lCUVJU0FfUklPX0lOVFJFU0VUCTB4QzAzCQkvKiBSRUFEOiAgSW50ZXJydXB0IFJlc2V0ICovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19MSU5LMjAJMHgwMgkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19CVVNFTkFCTEUJMHgwNAkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX1BST0NSVU4JMHgwOAkJLyogUHJvY2Vzc29yIHJ1bm5pbmcsIGVsc2UgcmVzZXQgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX0lSUU1BU0sJMHhGMAkJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMTUJMHhGMAkJLyogSW50ZXJydXB0IExldmVsIDE1ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTE0CTB4RTAJCS8qIEludGVycnVwdCBMZXZlbCAxNCAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlExMgkweEMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMTEJMHhCMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTEwCTB4QTAJCS8qIEludGVycnVwdCBMZXZlbCAxMCAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE5CTB4OTAJCS8qIEludGVycnVwdCBMZXZlbCA5ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTcJMHg3MAkJLyogSW50ZXJydXB0IExldmVsIDcgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRNgkweDYwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNiAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE1CTB4NTAJCS8qIEludGVycnVwdCBMZXZlbCA1ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTQJMHg0MAkJLyogSW50ZXJydXB0IExldmVsIDQgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMwkweDMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gU0J1cyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19TQlVTX0lERU5UCSJKQlBHSyNcMFwwXDBcMFwwXDBcMFwwXDBcMCIKKworI2RlZmluZQlSSU9fU0JVU19DRkdfQk9PVFJBTQkweDAxCQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfSVJRTUFTSwkweDM4CQkvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlFOT05FCTB4MDAJCS8qIE5vIEludGVycnVwdCAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE3CTB4MzgJCS8qIEludGVycnVwdCBMZXZlbCA3ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTYJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDYgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNQkweDI4CQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNSAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE0CTB4MjAJCS8qIEludGVycnVwdCBMZXZlbCA0ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTMJMHgxOAkJLyogSW50ZXJydXB0IExldmVsIDMgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRMgkweDEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMiAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlExCTB4MDgJCS8qIEludGVycnVwdCBMZXZlbCAxICovCisjZGVmaW5lCVJJT19TQlVTX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19TQlVTX0NGR19QUk9DMjUJMHg4MAkJLyogMjVNaHogcHJvY2Vzc29yIGNsb2NrLCBlbHNlIDIwTWh6ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gUENJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX1BDSV9JREVOVAkiRUNERFBHSkdKSEpSR1NLIyIKKworI2RlZmluZQlSSU9fUENJX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fUENJX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX1BDSV9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fUENJX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19QQ0lfQ0ZHX1BST0MyNQkweDgwCQkvKiAyNU1oeiBwcm9jZXNzb3IgY2xvY2ssIGVsc2UgMjBNaHogKi8KKworLyogUENJIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVNQWF9WRU5ET1JfSUQJCTB4MTFDQgkJLyogQXNzaWduZWQgYnkgdGhlIFBDSSBTSUcgKi8KKyNkZWZpbmUJU1BYX0RFVklDRV9JRAkJMHg4MDAwCQkvKiBSSU8gYnJpZGdlIGJvYXJkcyAqLworI2RlZmluZQlTUFhfUExYREVWSUNFX0lECTB4MjAwMAkJLyogUExYIGJyaWRnZSBib2FyZHMgKi8KKyNkZWZpbmUJU1BYX1NVQl9WRU5ET1JfSUQJU1BYX1ZFTkRPUl9JRAkvKiBTYW1lIGFzIHZlbmRvciBpZCAqLworI2RlZmluZQlSSU9fU1VCX1NZU19JRAkJMHgwODAwCQkvKiBSSU8gUENJIGJvYXJkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyAoSmV0KSBQQ0kgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX1BDSTJfSURFTlQJIkpFVCBIT1NUIEJZIEtFViMiCisKKyNkZWZpbmUJUklPX1BDSTJfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fUENJMl9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworCisvKiBQQ0kgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPMl9TVUJfU1lTX0lECQkweDAxMDAJCS8qIFJJTyAoSmV0KSBQQ0kgYm9hcmQgKi8KKworI2VuZGlmCQkJCQkJLypfcmlvYm9hcmRfaCAqLworCisvKiBFbmQgb2YgUklPQk9BUkQuSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9ib290LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGJlMTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib290LmMKQEAgLTAsMCArMSwxMzYwIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9ib290LmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjM2CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjQ4CisqKgorKiogIGlkZW50IEAoIylyaW9ib290LmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9ib290X2Nfc2Njc18gPSAiQCgjKXJpb2Jvb3QuYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorCitzdGF0aWMgaW50IFJJT0Jvb3RDb21wbGV0ZSggc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIHVpbnQgUnVwLCBzdHJ1Y3QgUGt0Q21kICpQa3RDbWRQICk7CisKK3N0YXRpYyB1Y2hhcgorUklPQXRWZWMyQ3RybFtdID0KK3sKKwkvKiAwICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAxICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAyICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAzICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA0ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA1ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA2ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA3ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA4ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA5ICovICBJUlFfOXxJTlRFUlJVUFRfRU5BQkxFLAorCS8qIDEwICovIElOVEVSUlVQVF9ESVNBQkxFLAorCS8qIDExICovIElSUV8xMXxJTlRFUlJVUFRfRU5BQkxFLAorCS8qIDEyICovIElSUV8xMnxJTlRFUlJVUFRfRU5BQkxFLAorCS8qIDEzICovIElOVEVSUlVQVF9ESVNBQkxFLAorCS8qIDE0ICovIElOVEVSUlVQVF9ESVNBQkxFLAorCS8qIDE1ICovIElSUV8xNXxJTlRFUlJVUFRfRU5BQkxFCit9OworCisvKgorKiogTG9hZCBpbiB0aGUgUlRBIGJvb3QgY29kZS4KKyovCitpbnQKK1JJT0Jvb3RDb2RlUlRBKHAsIHJicCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgRG93bkxvYWQgKglyYnA7IAoreworCWludCBvZmZzZXQ7CisKKwlmdW5jX2VudGVyICgpOworCisJLyogTGludXggZG9lc24ndCBhbGxvdyB5b3UgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyBhCisJICAgImNvcHlpbiIuIChDcmFzaCB3aGVuIGEgcGFnZWZhdWx0IG9jY3VycykuICovCisJLyogZGlzYWJsZShvbGRzcGwpOyAqLworCQorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkRhdGEgYXQgdXNlciBhZGRyZXNzIDB4JXhcbiIsKGludClyYnAtPkRhdGFQKTsKKworCS8qCisJKiogQ2hlY2sgdGhhdCB3ZSBoYXZlIHNldCBhc3NpZGUgZW5vdWdoIG1lbW9yeSBmb3IgdGhpcworCSovCisJaWYgKCByYnAtPkNvdW50ID4gU0lYVFlfRk9VUl9LICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgQm9vdCBDb2RlIFRvbyBMYXJnZSFcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfRklMRV9UT09fTEFSR0U7CisJCS8qIHJlc3RvcmUob2xkc3BsKTsgKi8KKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIHAtPlJJT0Jvb3RpbmcgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSBCb290IENvZGUgOiBCVVNZIEJVU1kgQlVTWSFcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IEJPT1RfSU5fUFJPR1JFU1M7CisJCS8qIHJlc3RvcmUob2xkc3BsKTsgKi8KKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qCisJKiogVGhlIGRhdGEgd2UgbG9hZCBpbiBtdXN0IGVuZCBvbiBhIChSVEFfQk9PVF9EQVRBX1NJWkUpIGJ5dGUgYm91bmRhcnksCisJKiogc28gY2FsY3VsYXRlIGhvdyBmYXIgd2UgaGF2ZSB0byBtb3ZlIHRoZSBkYXRhIHVwIHRoZSBidWZmZXIKKwkqKiB0byBhY2hpZXZlIHRoaXMuCisJKi8KKwlvZmZzZXQgPSAoUlRBX0JPT1RfREFUQV9TSVpFIC0gKHJicC0+Q291bnQgJSBSVEFfQk9PVF9EQVRBX1NJWkUpKSAlIAorCQkJCQkJCVJUQV9CT09UX0RBVEFfU0laRTsKKworCS8qCisJKiogQmUgY2xlYW4sIGFuZCBjbGVhciB0aGUgJ3VudXNlZCcgcG9ydGlvbiBvZiB0aGUgYm9vdCBidWZmZXIsCisJKiogYmVjYXVzZSBpdCB3aWxsIChldmVudHVhbGx5KSBiZSBwYXJ0IG9mIHRoZSBSdGEgcnVuIHRpbWUgZW52aXJvbm1lbnQKKwkqKiBhbmQgc28gc2hvdWxkIGJlIHplcm9lZC4KKwkqLworCWJ6ZXJvKCAoY2FkZHJfdClwLT5SSU9Cb290UGFja2V0cywgb2Zmc2V0ICk7CisKKwkvKgorCSoqIENvcHkgdGhlIGRhdGEgZnJvbSB1c2VyIHNwYWNlLgorCSovCisKKwlpZiAoIGNvcHlpbigoaW50KXJicC0+RGF0YVAsKChjYWRkcl90KShwLT5SSU9Cb290UGFja2V0cykpK29mZnNldCwKKwkJCQlyYnAtPkNvdW50KSA9PUNPUFlGQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJCYWQgZGF0YSBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJLyogcmVzdG9yZShvbGRzcGwpOyAqLworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qCisJKiogTWFrZSBzdXJlIHRoYXQgb3VyIGNvcHkgb2YgdGhlIHNpemUgaW5jbHVkZXMgdGhhdCBvZmZzZXQgd2UgZGlzY3Vzc2VkCisJKiogZWFybGllci4KKwkqLworCXAtPlJJT051bUJvb3RQa3RzID0gKHJicC0+Q291bnQrb2Zmc2V0KS9SVEFfQk9PVF9EQVRBX1NJWkU7CisJcC0+UklPQm9vdENvdW50ICAgPSByYnAtPkNvdW50OworCisJLyogcmVzdG9yZShvbGRzcGwpOyAqLworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCit2b2lkIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKHN0cnVjdCBIb3N0ICogSG9zdFApCit7CisJZnVuY19lbnRlciAoKTsKKworCXN3aXRjaCAoIEhvc3RQLT5UeXBlICkgeworCWNhc2UgUklPX0FUOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTdGFydCBJU0EgY2FyZCBydW5uaW5nXG4iKTsKKwkJV0JZVEUoSG9zdFAtPkNvbnRyb2wsIAorCQkgICAgICBCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09OCisJCSAgICAgIHwgSG9zdFAtPk1vZGUKKwkJICAgICAgfCBSSU9BdFZlYzJDdHJsW0hvc3RQLT5JdmVjICYgMHhGXSApOworCQlicmVhazsKKwkJCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwljYXNlIFJJT19NQ0E6CisJCQkJLyoKKwkJCQkqKiBNQ0EgaGFuZGxlcyBJUlEgdmVjdG9ycyBkaWZmZXJlbnRseSwgc28gd2UgZG9uJ3Qgd3JpdGUgCisJCQkJKiogdGhlbSB0byB0aGlzIHJlZ2lzdGVyLgorCQkJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlN0YXJ0IE1DQSBjYXJkIHJ1bm5pbmdcbiIpOworCQlXQllURShIb3N0UC0+Q29udHJvbCwgTWNhVHBCb290RnJvbVJhbSB8IE1jYVRwQnVzRW5hYmxlIHwgSG9zdFAtPk1vZGUpOworCQlicmVhazsKKworCWNhc2UgUklPX0VJU0E6CisJCQkJLyoKKwkJCQkqKiBFSVNBIGlzIHRvdGFsbHkgZGlmZmVyZW50IGFuZCBleHBlY3RzIE9VVEJacyB0byB0dXJuIGl0IG9uLgorCQkJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlN0YXJ0IEVJU0EgY2FyZCBydW5uaW5nXG4iKTsKKwkJT1VUQlooIEhvc3RQLT5TbG90LCBFSVNBX0NPTlRST0xfUE9SVCwgSG9zdFAtPk1vZGUgfCBSSU9FaXNhVmVjMkN0cmxbSG9zdFAtPkl2ZWNdIHwgRUlTQV9UUF9SVU4gfCBFSVNBX1RQX0JVU19FTkFCTEUgfCBFSVNBX1RQX0JPT1RfRlJPTV9SQU0gKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgUklPX1BDSToKKwkJCQkvKgorCQkJCSoqIFBDSSBpcyBtdWNoIHRoZSBzYW1lIGFzIE1DQS4gRXZlcnl0aGluZyBpcyBvbmNlIGFnYWluIG1lbW9yeQorCQkJCSoqIG1hcHBlZCwgc28gd2UgYXJlIHdyaXRpbmcgdG8gbWVtb3J5IHJlZ2lzdGVycyBpbnN0ZWFkIG9mIGlvCisJCQkJKiogcG9ydHMuCisJCQkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU3RhcnQgUENJIGNhcmQgcnVubmluZ1xuIik7CisJCVdCWVRFKEhvc3RQLT5Db250cm9sLCBQQ0lUcEJvb3RGcm9tUmFtIHwgUENJVHBCdXNFbmFibGUgfCBIb3N0UC0+TW9kZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlVua25vd24gaG9zdCB0eXBlICVkXG4iLCBIb3N0UC0+VHlwZSk7CisJCWJyZWFrOworCX0KKy8qIAorCXByaW50ayAoS0VSTl9JTkZPICJEb25lIHdpdGggc3RhcnRpbmcgdGhlIGNhcmRcbiIpOworCWZ1bmNfZXhpdCAoKTsKKyovCisJcmV0dXJuOworfQorCisvKgorKiogTG9hZCBpbiB0aGUgaG9zdCBib290IGNvZGUgLSBsb2FkIGl0IGRpcmVjdGx5IG9udG8gYWxsIGhhbHRlZCBob3N0cworKiogb2YgdGhlIGNvcnJlY3QgdHlwZS4KKyoqCisqKiBQdXQgeW91ciBydWJiZXIgcGFudHMgb24gYmVmb3JlIG1lc3Npbmcgd2l0aCB0aGlzIGNvZGUgLSBldmVuIHRoZSBtYWdpYworKiogbnVtYmVycyBoYXZlIHRyb3VibGUgdW5kZXJzdGFuZGluZyB3aGF0IHRoZXkgYXJlIGRvaW5nIGhlcmUuCisqLworaW50CitSSU9Cb290Q29kZUhPU1QocCwgcmJwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3JlZ2lzdGVyIHN0cnVjdCBEb3duTG9hZCAqcmJwOworeworCXJlZ2lzdGVyIHN0cnVjdCBIb3N0ICpIb3N0UDsKKwlyZWdpc3RlciBjYWRkcl90IENhZDsKKwlyZWdpc3RlciBQQVJNX01BUCAqUGFybU1hcFA7CisJcmVnaXN0ZXIgaW50IFJ1cE47CisJaW50IFBvcnROOworCXVpbnQgaG9zdDsKKwljYWRkcl90IFN0YXJ0UDsKKwlCWVRFICpEZXN0UDsKKwlpbnQgd2FpdF9jb3VudDsKKwl1c2hvcnQgT2xkUGFybU1hcDsKKwl1c2hvcnQgb2Zmc2V0OwkvKiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYSB1c2hvcnQgKi8KKwkvKiB1aW50IGJ5dGU7ICovCisJY2FkZHJfdCBEb3duQ29kZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUhvc3RQID0gTlVMTDsgLyogQXNzdXJlIHRoZSBjb21waWxlciB3ZSd2ZSBpbml0aWFsaXplZCBpdCAqLworCWZvciAoIGhvc3Q9MDsgaG9zdDxwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJBdHRlbXB0IHRvIGJvb3QgaG9zdCAlZFxuIixob3N0KTsKKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisJCQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICAiSG9zdCBUeXBlID0gMHgleCwgTW9kZSA9IDB4JXgsIElWZWMgPSAweCV4XG4iLAorCQkgICAgSG9zdFAtPlR5cGUsIEhvc3RQLT5Nb2RlLCBIb3N0UC0+SXZlYyk7CisKKworCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1dBSVRJTkcgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICIlcyAlZCBhbHJlYWR5IHJ1bm5pbmdcbiIsIkhvc3QiLGhvc3QpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkqKiBHcmFiIGEgMzIgYml0IHBvaW50ZXIgdG8gdGhlIGNhcmQuCisJCSovCisJCUNhZCA9IEhvc3RQLT5DYWRkcjsKKworCQkvKgorCQkqKiBXZSBhcmUgZ29pbmcgdG8gKHRyeSkgYW5kIGxvYWQgaW4gcmJwLT5Db3VudCBieXRlcy4KKwkJKiogVGhlIGxhc3QgYnl0ZSB3aWxsIHJlc2lkZSBhdCBwLT5SSU9Db25mLkhvc3RMb2FkQmFzZS0xOworCQkqKiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gc3RhcnQgY29weWluZyBhdCBhZGRyZXNzCisJCSoqIChjYWRkcitwLT5SSU9Db25mLkhvc3RMb2FkQmFzZS1yYnAtPkNvdW50KQorCQkqLworCQlTdGFydFAgPSAoY2FkZHJfdCkmQ2FkW3AtPlJJT0NvbmYuSG9zdExvYWRCYXNlLXJicC0+Q291bnRdOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgImtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIGhvc3QgaXMgMHgleFxuIiwgKGludClDYWQgKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAia2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgZG93bmxvYWQgaXMgMHgleFxuIiwgKGludClTdGFydFApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJob3N0IGxvYWRiYXNlIGlzIDB4JXhcbiIscC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJzaXplIG9mIGRvd25sb2FkIGlzIDB4JXhcbiIsIHJicC0+Q291bnQpOworCisJCWlmICggcC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UgPCByYnAtPkNvdW50ICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmluIHRvbyBsYXJnZVxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfRklMRV9UT09fTEFSR0U7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gLUVGQklHOworCQl9CisJCS8qCisJCSoqIEVuc3VyZSB0aGF0IHRoZSBob3N0IHJlYWxseSBpcyBzdG9wcGVkLgorCQkqKiBEaXNhYmxlIGl0J3MgZXh0ZXJuYWwgYnVzICYgdHdhbmcgaXRzIHJlc2V0IGxpbmUuCisJCSovCisJCVJJT0hvc3RSZXNldCggSG9zdFAtPlR5cGUsIChzdHJ1Y3QgRHBSYW0gKilIb3N0UC0+Q2FyZFAsIEhvc3RQLT5TbG90ICk7CisKKwkJLyoKKwkJKiogQ29weSB0aGUgZGF0YSBkaXJlY3RseSBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIFNSQU0uCisJCSoqIFRoaXMgYWluJ3QgZ29pbmcgdG8gYmUgbm9uZSB0b28gY2xldmVyIGlmIHRoZSBkb3dubG9hZAorCQkqKiBjb2RlIGlzIGJpZ2dlciB0aGFuIHRoaXMgc2VnbWVudC4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQ29weSBpbiBjb2RlXG4iKTsKKworCQkvKgorCQkqKiBQQ0kgaG9zdGNhcmQgY2FuJ3QgY29wZSB3aXRoIDMyIGJpdCBhY2Nlc3NlcyBhbmQgc28gbmVlZCB0byBjb3B5IAorCQkqKiBkYXRhIHRvIGEgbG9jYWwgYnVmZmVyLCBhbmQgdGhlbiBkcmlwZmVlZCB0aGUgY2FyZC4KKwkJKi8KKwkJaWYgKCBIb3N0UC0+VHlwZSA9PSBSSU9fUENJICkgeworCQkgIC8qIGludCBvZmZzZXQ7ICovCisKKwkJCURvd25Db2RlID0gc3lzYnJrKHJicC0+Q291bnQpOworCQkJaWYgKCAhRG93bkNvZGUgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTm8gc3lzdGVtIG1lbW9yeSBhdmFpbGFibGVcbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX0VOT1VHSF9DT1JFX0ZPUl9QQ0lfQ09QWTsKKwkJCQlmdW5jX2V4aXQgKCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQliemVybyhEb3duQ29kZSwgcmJwLT5Db3VudCk7CisKKwkJCWlmICggY29weWluKChpbnQpcmJwLT5EYXRhUCxEb3duQ29kZSxyYnAtPkNvdW50KT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmFkIGNvcHlpbiBvZiBob3N0IGRhdGFcbiIpOworCQkJCXN5c2ZyZWUoIERvd25Db2RlLCByYnAtPkNvdW50ICk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJSG9zdFAtPkNvcHkoIERvd25Db2RlLCBTdGFydFAsIHJicC0+Q291bnQgKTsKKworCQkJc3lzZnJlZSggRG93bkNvZGUsIHJicC0+Q291bnQgKTsKKwkJfQorCQllbHNlIGlmICggY29weWluKChpbnQpcmJwLT5EYXRhUCxTdGFydFAscmJwLT5Db3VudCk9PUNPUFlGQUlMICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmFkIGNvcHlpbiBvZiBob3N0IGRhdGFcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJDb3B5IGNvbXBsZXRlZFxuIik7CisKKwkJLyoKKwkJKioJCQlTIFQgTyBQICEKKwkJKioKKwkJKiogVXB0byB0aGlzIHBvaW50IHRoZSBjb2RlIGhhcyBiZWVuIGZhaXJseSByYXRpb25hbCwgYW5kIHBvc3NpYmx5CisJCSoqIGV2ZW4gc3RyYWlnaHQgZm9yd2FyZC4gV2hhdCBmb2xsb3dzIGlzIGEgcGlsZSBvZiBjcnVkIHRoYXQgd2lsbAorCQkqKiBtYWdpY2FsbHkgdHVybiBpbnRvIHNpeCBieXRlcyBvZiB0cmFuc3B1dGVyIGFzc2VtYmxlci4gTm9ybWFsbHkKKwkJKiogeW91IHdvdWxkIGV4cGVjdCBhbiBhcnJheSBvciBzb21ldGhpbmcsIGJ1dCwgYmVpbmcgbWUsIEkgaGF2ZQorCQkqKiBjaG9zZW4gW2JlZW4gdG9sZF0gdG8gdXNlIGEgdGVjaG5pcXVlIHdoZXJlYnkgdGhlIHN0YXJ0dXAgY29kZQorCQkqKiB3aWxsIGJlIGNvcnJlY3QgaWYgd2UgY2hhbmdlIHRoZSBsb2FkYmFzZSBmb3IgdGhlIGNvZGUuIFdoaWNoCisJCSoqIGJyaW5ncyB1cyBvbnRvIGFub3RoZXIgaXNzdWUgLSB0aGUgbG9hZGJhc2UgaXMgdGhlICplbmQqIG9mIHRoZQorCQkqKiBjb2RlLCBub3QgdGhlIHN0YXJ0LgorCQkqKgorCQkqKiBJZiBJIHdlcmUgeW91IEkgd291bGRuJ3Qgc3RhcnQgZnJvbSBoZXJlLgorCQkqLworCisJCS8qCisJCSoqIFdlIG5vdyBuZWVkIHRvIGluc2VydCBhIHNob3J0IGJvb3Qgc2VjdGlvbiBpbnRvCisJCSoqIHRoZSBtZW1vcnkgYXQgdGhlIGVuZCBvZiBTcmFtMi4gVGhpcyBpcyBub3JtYWxseSAoZGUpY29tcG9zZWQKKwkJKiogb2YgdGhlIGxhc3QgZWlnaHQgYnl0ZXMgb2YgdGhlIGRvd25sb2FkIGNvZGUuIFRoZQorCQkqKiBkb3dubG9hZCBoYXMgYmVlbiBhc3NlbWJsZWQvY29tcGlsZWQgdG8gZXhwZWN0IHRvIGJlCisJCSoqIGxvYWRlZCBmcm9tIDB4N0ZGRiBkb3dud2FyZHMuIFdlIGhhdmUgbG9hZGVkIGl0CisJCSoqIGF0IHNvbWUgb3RoZXIgYWRkcmVzcy4gVGhlIHN0YXJ0dXAgY29kZSBnb2VzIGludG8gdGhlIHNtYWxsCisJCSoqIHJhbSB3aW5kb3cgYXQgU3JhbTIsIGluIHRoZSBsYXN0IDggYnl0ZXMsIHdoaWNoIGFyZSByZWFsbHkKKwkJKiogYXQgYWRkcmVzc2VzIDB4N0ZGOC0weDdGRkYuCisJCSoqCisJCSoqIElmIHRoZSBsb2FkYmFzZSBpcywgc2F5LCAweDdDMDAsIHRoZW4gd2UgbmVlZCB0byBicmFuY2ggdG8KKwkJKiogYWRkcmVzcyAweDdCRkUgdG8gcnVuIHRoZSBob3N0LmJpbiBzdGFydHVwIGNvZGUuIFdlIGFzc2VtYmxlCisJCSoqIHRoaXMganVtcCBtYW51YWxseS4KKwkJKioKKwkJKiogVGhlIHR3byBieXRlIHNlcXVlbmNlIDYwIDA4IGlzIGxvYWRlZCBpbnRvIG1lbW9yeSBhdCBhZGRyZXNzCisJCSoqIDB4N0ZGRSxGLiBUaGlzIGlzIGEgbG9jYWwgYnJhbmNoIHRvIGxvY2F0aW9uIDB4N0ZGOCAoNjAgaXMgbmZpeCAwLAorCQkqKiB3aGljaCBhZGRzICcwJyB0byB0aGUgLk8gcmVnaXN0ZXIsIGNvbXBsZW1lbnRzIC5PLCBhbmQgdGhlbiBzaGlmdHMKKwkJKiogaXQgbGVmdCBieSA0IGJpdCBwb3NpdGlvbnMsIDA4IGlzIGEganVtcCAuTys4IGluc3RydWN0aW9uLiBUaGlzIHdpbGwKKwkJKiogYWRkIDggdG8gLk8gKHdoaWNoIHdhcyAweEZGRjApLCBhbmQgd2lsbCBicmFuY2ggUkVMQVRJVkUgdG8gdGhlIG5ldworCQkqKiBsb2NhdGlvbi4gTm93LCB0aGUgYnJhbmNoIHN0YXJ0cyBmcm9tIHRoZSB2YWx1ZSBvZiAuUEMgKG9yIC5JUCBvcgorCQkqKiB3aGF0ZXZlciB0aGUgYmxvb2R5IHJlZ2lzdGVyIGlzIGNhbGxlZCBvbiB0aGlzIGNoaXApLCBhbmQgdGhlIC5QQworCQkqKiB3aWxsIGJlIHBvaW50aW5nIHRvIHRoZSBsb2NhdGlvbiBBRlRFUiB0aGUgYnJhbmNoLCBpbiB0aGlzIGNhc2UKKwkJKiogLlBDID09IDB4ODAwMCwgc28gdGhlIGJyYW5jaCB3aWxsIGJlIHRvIDB4ODAwMCsweEZGRjggPSAweDdGRjguCisJCSoqCisJCSoqIEEgbG9uZyBicmFuY2ggaXMgY29kZWQgYXQgMHg3RkY4LiBUaGlzIGNvbnNpc3RzIG9mIGxvYWRpbmcgYSBmb3VyCisJCSoqIGJ5dGUgb2Zmc2V0IGludG8gLk8gdXNpbmcgbmZpeCAoYXMgYWJvdmUpIGFuZCBwZml4IG9wZXJhdG9ycy4gVGhlCisJCSoqIHBmaXggb3BlcmF0ZXMgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIG5maXggb3BlcmF0b3IsIGJ1dAorCQkqKiB3aXRob3V0IHRoZSBjb21wbGVtZW50IG9wZXJhdGlvbi4gVGhlIG9mZnNldCwgb2YgY291cnNlLCBtdXN0IGJlCisJCSoqIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIEFGVEVSIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24sCisJCSoqIHdoaWNoIHdpbGwgYmUgKHVybSkgMHg3RkZDLCBzbywgb3VyIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2gKKwkJKiogKGxvYWRiYXNlLTIpLCBoYXMgdG8gYmUgcmVhY2hlZCBmcm9tIGhlcmUuIEltYWdpbmUgdGhhdCB0aGUgbG9hZGJhc2UKKwkJKiogaXMgMHg3QzAwICh3aGljaCBpdCBpcyksIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIGJyYW5jaCB0byAweDdCRkUgKHdoaWNoCisJCSoqIGlzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbml0aWFsIHR3byBieXRlIHNob3J0IGxvY2FsIGJyYW5jaCBvZiB0aGUKKwkJKiogZG93bmxvYWQgY29kZSkuCisJCSoqCisJCSoqIFRvIGNvZGUgYSBqdW1wIGZyb20gMHg3RkZDICh3aGljaCBpcyB3aGVyZSB0aGUgYnJhbmNoIHdpbGwgc3RhcnQKKwkJKiogZnJvbSkgdG8gMHg3QkZFLCB3ZSB3aWxsIG5lZWQgdG8gYnJhbmNoIDB4RkMwMiBieXRlcyAoMHg3RkZDKzB4RkMwMik9CisJCSoqIDB4N0JGRS4KKwkJKiogVGhpcyB3aWxsIGJlIGNvZGVkIGFzIGZvdXIgYnl0ZXM6CisJCSoqIDYwIDJDIDIwIDAyCisJCSoqIGJlaW5nIG5maXggLk8rMAorCQkqKgkgICBwZml4IC5PK0MKKwkJKioJICAgcGZpeCAuTyswCisJCSoqCSAgIGp1bXAgLk8rMgorCQkqKgorCQkqKiBUaGUgbmZpeCBvcGVyYXRvciBpcyB1c2VkLCBzbyB0aGF0IHRoZSBzdGFydHVwIGNvZGUgd2lsbCBiZQorCQkqKiBjb21wYXRpYmxlIHdpdGggdGhlIHdob2xlIFRwIGZhbWlseS4gKGxpZXMsIGRhbW4gbGllcywgaXQnbGwgbmV2ZXIKKwkJKiogd29yayBpbiBhIG1vbnRoIG9mIFN1bmRheXMpLgorCQkqKgorCQkqKiBUaGUgbmZpeCBueWJsZSBpcyB0aGUgMXMgY29tcGxlbWVudCBvZiB0aGUgbnlibGUgdmFsdWUgeW91CisJCSoqIHdhbnQgdG8gbG9hZCAtIGluIHRoaXMgY2FzZSB3ZSB3YW50ZWQgJ0YnIHNvIHdlIG5maXggbG9hZGVkICcwJy4KKwkJKi8KKworCisJCS8qCisJCSoqIERlc3QgcG9pbnRzIHRvIHRoZSB0b3AgOCBieXRlcyBvZiBTcmFtMi4gVGhlIFRwIGp1bXBzCisJCSoqIHRvIDB4N0ZGRSBhdCByZXNldCB0aW1lLCBhbmQgc3RhcnRzIGV4ZWN1dGluZy4gVGhpcyBpcworCQkqKiBhIHNob3J0IGJyYW5jaCB0byAweDdGRjgsIHdoZXJlIGEgbG9uZyBicmFuY2ggaXMgY29kZWQuCisJCSovCisKKwkJRGVzdFAgPSAoQllURSAqKSZDYWRbMHg3RkY4XTsJLyogPDw8LS0tLSBSRUFEIFRIRSBBQk9WRSBDT01NRU5UUyAqLworCisjZGVmaW5lCU5GSVgoTikJKDB4NjAgfCAoTikpCS8qIC5PICA9ICh+KC5PICsgTikpPDw0ICovCisjZGVmaW5lCVBGSVgoTikJKDB4MjAgfCAoTikpCS8qIC5PICA9ICAgKC5PICsgTik8PDQgICovCisjZGVmaW5lCUpVTVAoTikJKDB4MDAgfCAoTikpCS8qIC5QQyA9ICAgLlBDICsgLk8JICovCisKKwkJLyoKKwkJKiogMHg3RkZDIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBmb2xsb3dpbmcgdGhlIGxhc3QgYnl0ZSBvZgorCQkqKiB0aGUgZm91ciBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24uCisJCSoqIFJFQUQgVEhFIEFCT1ZFIENPTU1FTlRTCisJCSoqCisJCSoqIG9mZnNldCBpcyAoVE8tRlJPTSkgJSBNRU1TSVpFLCBidXQgd2l0aCBjb21wb3VuZCBidWdnZXJpbmcgYWJvdXQuCisJCSoqIE1lbXNpemUgaXMgNjRLIGZvciB0aGlzIHJhbmdlIG9mIFRwLCBzbyBvZmZzZXQgaXMgYSBzaG9ydCAodW5zaWduZWQsCisJCSoqIGNvcyBJIGRvbid0IHVuZGVyc3RhbmQgMidzIGNvbXBsZW1lbnQpLgorCQkqLworCQlvZmZzZXQgPSAocC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UtMiktMHg3RkZDOworCQlXQllURSggRGVzdFBbMF0gLCBORklYKCgodXNob3J0KSh+b2Zmc2V0KSA+PiAodXNob3J0KTEyKSAmIDB4RikgKTsKKwkJV0JZVEUoIERlc3RQWzFdICwgUEZJWCgoIG9mZnNldCA+PiA4KSAmIDB4RikgKTsKKwkJV0JZVEUoIERlc3RQWzJdICwgUEZJWCgoIG9mZnNldCA+PiA0KSAmIDB4RikgKTsKKwkJV0JZVEUoIERlc3RQWzNdICwgSlVNUCggb2Zmc2V0ICYgMHhGKSApOworCisJCVdCWVRFKCBEZXN0UFs2XSAsIE5GSVgoMCkgKTsKKwkJV0JZVEUoIERlc3RQWzddICwgSlVNUCg4KSApOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgImhvc3QgbG9hZGJhc2UgaXMgMHgleFxuIixwLT5SSU9Db25mLkhvc3RMb2FkQmFzZSk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgInN0YXJ0dXAgb2Zmc2V0IGlzIDB4JXhcbiIsb2Zmc2V0KTsKKworCQkvKgorCQkqKiBGbGFnIHdoYXQgaXMgZ29pbmcgb24KKwkJKi8KKwkJSG9zdFAtPkZsYWdzICY9IH5SVU5fU1RBVEU7CisJCUhvc3RQLT5GbGFncyB8PSBSQ19TVEFSVFVQOworCisJCS8qCisJCSoqIEdyYWIgYSBjb3B5IG9mIHRoZSBjdXJyZW50IFBhcm1NYXAgcG9pbnRlciwgc28gd2UKKwkJKiogY2FuIHRlbGwgd2hlbiBpdCBoYXMgY2hhbmdlZC4KKwkJKi8KKwkJT2xkUGFybU1hcCA9IFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJPcmlnaW5hbCBwYXJtbWFwIGlzIDB4JXhcbiIsT2xkUGFybU1hcCk7CisKKwkJLyoKKwkJKiogQW5kIHN0YXJ0IGl0IHJ1bm5pbmcgKEkgaG9wZSkuCisJCSoqIEFzIHRoZXJlIGlzIG5vdGhpbmcgZG9kZ3kgb3Igb2JzY3VyZSBhYm91dCB0aGUKKwkJKiogYWJvdmUgY29kZSwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIHdvcmsgZXZlcnkgdGltZS4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAgIkhvc3QgVHlwZSA9IDB4JXgsIE1vZGUgPSAweCV4LCBJVmVjID0gMHgleFxuIiwKKwkJICAgIEhvc3RQLT5UeXBlLCBIb3N0UC0+TW9kZSwgSG9zdFAtPkl2ZWMpOworCisJCXJpb19zdGFydF9jYXJkX3J1bm5pbmcoSG9zdFApOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlNldCBjb250cm9sIHBvcnRcbiIpOworCisJCS8qCisJCSoqIE5vdywgd2FpdCBmb3IgdXB0byBmaXZlIHNlY29uZHMgZm9yIHRoZSBUcCB0byBzZXR1cCB0aGUgcGFybW1hcAorCQkqKiBwb2ludGVyOgorCQkqLworCQlmb3IgKCB3YWl0X2NvdW50PTA7ICh3YWl0X2NvdW50PHAtPlJJT0NvbmYuU3RhcnR1cFRpbWUpJiYKKwkJCShSV09SRChIb3N0UC0+X19QYXJtTWFwUik9PU9sZFBhcm1NYXApOyB3YWl0X2NvdW50KysgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJDaGVja291dCAlZCwgMHgleFxuIix3YWl0X2NvdW50LFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisJCQlkZWxheShIb3N0UCwgSFVORFJFRF9NUyk7CisKKwkJfQorCisJCS8qCisJCSoqIElmIHRoZSBwYXJtbWFwIHBvaW50ZXIgaXMgdW5jaGFuZ2VkLCB0aGVuIHRoZSBob3N0IGNvZGUKKwkJKiogaGFzIGNyYXNoZWQgJiBidXJuZWQgaW4gYSByZWFsbHkgc3BlY3RhY3VsYXIgd2F5CisJCSovCisJCWlmICggUldPUkQoSG9zdFAtPl9fUGFybU1hcFIpID09IE9sZFBhcm1NYXAgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJwYXJtbWFwIDB4JXhcbiIsIFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSSU8gTWVzZyBSdW4gRmFpbFxuIik7CisKKyNkZWZpbmUJSE9TVF9ESVNBQkxFIFwKKwkJSG9zdFAtPkZsYWdzICY9IH5SVU5fU1RBVEU7IFwKKwkJSG9zdFAtPkZsYWdzIHw9IFJDX1NUVUZGRUQ7IFwKKwkJUklPSG9zdFJlc2V0KCBIb3N0UC0+VHlwZSwgKHN0cnVjdCBEcFJhbSAqKUhvc3RQLT5DYXJkUCwgSG9zdFAtPlNsb3QgKTtcCisJCWNvbnRpbnVlCisKKwkJCUhPU1RfRElTQUJMRTsKKwkJfQorCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJ1bm5pbmcgMHgleFxuIiwgUldPUkQoSG9zdFAtPl9fUGFybU1hcFIpKTsKKworCQkvKgorCQkqKiBXZWxsLCB0aGUgYm9hcmQgdGhvdWdodCBpdCB3YXMgT0ssIGFuZCBzZXR1cCBpdHMgcGFybW1hcAorCQkqKiBwb2ludGVyLiBGb3IgdGhlIHRpbWUgYmVpbmcsIHdlIHdpbGwgcHJldGVuZCB0aGF0IHRoaXMKKwkJKiogYm9hcmQgaXMgcnVubmluZywgYW5kIGNoZWNrIG91dCB3aGF0IHRoZSBlcnJvciBmbGFnIHNheXMuCisJCSovCisKKwkJLyoKKwkJKiogR3JhYiBhIDMyIGJpdCBwb2ludGVyIHRvIHRoZSBwYXJtbWFwIHN0cnVjdHVyZQorCQkqLworCQlQYXJtTWFwUCA9IChQQVJNX01BUCAqKVJJT19QVFIoQ2FkLFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlBhcm1NYXBQIDogJXhcbiIsIChpbnQpUGFybU1hcFApOworCQlQYXJtTWFwUCA9IChQQVJNX01BUCAqKSgodW5zaWduZWQgbG9uZylDYWQgKyAKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSgoUldPUkQoKEhvc3RQLT5fX1Bhcm1NYXBSKSkpICYgMHhGRkZGKSk7IAorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJQYXJtTWFwUCA6ICV4XG4iLCAoaW50KVBhcm1NYXBQKTsKKworCQkvKgorCQkqKiBUaGUgbGlua3MgZW50cnkgc2hvdWxkIGJlIDB4RkZGRjsgd2Ugc2V0IGl0IHVwCisJCSoqIHdpdGggYSBtYXNrIHRvIHNheSBob3cgbWFueSBQSEJzIHRvIHVzZSwgYW5kIAorCQkqKiB3aGljaCBsaW5rcyB0byB1c2UuCisJCSovCisJCWlmICggKFJXT1JEKFBhcm1NYXBQLT5saW5rcykgJiAweEZGRkYpICE9IDB4RkZGRiApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJJTyBNZXNnIFJ1biBGYWlsICVzXG4iLCBIb3N0UC0+TmFtZSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJMaW5rcyA9IDB4JXhcbiIsUldPUkQoUGFybU1hcFAtPmxpbmtzKSk7CisJCQlIT1NUX0RJU0FCTEU7CisJCX0KKworCQlXV09SRChQYXJtTWFwUC0+bGlua3MgLCBSSU9fTElOS19FTkFCTEUpOworCisJCS8qCisJCSoqIG5vdyB3YWl0IGZvciB0aGUgY2FyZCB0byBzZXQgYWxsIHRoZSBwYXJtbWFwLT5YWFggc3R1ZmYKKwkJKiogdGhpcyBpcyBhIHdhaXQgb2YgdXB0byB0d28gc2Vjb25kcy4uLi4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTG9va2luZyBmb3IgaW5pdF9kb25lIC0gJWQgdGlja3NcbiIscC0+UklPQ29uZi5TdGFydHVwVGltZSk7CisJCUhvc3RQLT50aW1lb3V0X2lkID0gMDsKKwkJZm9yICggd2FpdF9jb3VudD0wOyAod2FpdF9jb3VudDxwLT5SSU9Db25mLlN0YXJ0dXBUaW1lKSAmJiAKKwkJCQkJCSFSV09SRChQYXJtTWFwUC0+aW5pdF9kb25lKTsgd2FpdF9jb3VudCsrICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiV2FpdGluZyBmb3IgaW5pdF9kb25lXG4iKTsKKwkJCWRlbGF5KEhvc3RQLCBIVU5EUkVEX01TKTsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJPSyEgaW5pdF9kb25lIVxuIik7CisKKwkJaWYgKFJXT1JEKFBhcm1NYXBQLT5lcnJvcikgIT0gRV9OT19FUlJPUiB8fCAKKwkJCQkJCQkhUldPUkQoUGFybU1hcFAtPmluaXRfZG9uZSkgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSSU8gTWVzZyBSdW4gRmFpbCAlc1xuIiwgSG9zdFAtPk5hbWUpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGltZWRvdXQgd2FpdGluZyBmb3IgaW5pdF9kb25lXG4iKTsKKwkJCUhPU1RfRElTQUJMRTsKKwkJfQorCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkdvdCBpbml0X2RvbmVcbiIpOworCisJCS8qCisJCSoqIEl0IHJ1bnMhIEl0IHJ1bnMhCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkhvc3QgSUQgJXggUnVubmluZ1xuIixIb3N0UC0+VW5pcXVlTnVtKTsKKworCQkvKgorCQkqKiBzZXQgdGhlIHRpbWUgcGVyaW9kIGJldHdlZW4gaW50ZXJydXB0cy4KKwkJKi8KKwkJV1dPUkQoUGFybU1hcFAtPnRpbWVyLCAoc2hvcnQpcC0+UklPQ29uZi5UaW1lciApOworCisJCS8qCisJCSoqIFRyYW5zbGF0ZSBhbGwgdGhlIDE2IGJpdCBwb2ludGVycyBpbiB0aGUgX19QYXJtTWFwUiBpbnRvCisJCSoqIDMyIGJpdCBwb2ludGVycyBmb3IgdGhlIGRyaXZlci4KKwkJKi8KKwkJSG9zdFAtPlBhcm1NYXBQCSA9CVBhcm1NYXBQOworCQlIb3N0UC0+UGhiUAkJID0JKFBIQiopUklPX1BUUihDYWQsUldPUkQoUGFybU1hcFAtPnBoYl9wdHIpKTsKKwkJSG9zdFAtPlJ1cFAJCSA9CShSVVAqKVJJT19QVFIoQ2FkLFJXT1JEKFBhcm1NYXBQLT5ydXBzKSk7CisJCUhvc3RQLT5QaGJOdW1QCSAgPSAodXNob3J0KilSSU9fUFRSKENhZCxSV09SRChQYXJtTWFwUC0+cGhiX251bV9wdHIpKTsKKwkJSG9zdFAtPkxpbmtTdHJQCSA9CShMUEIqKVJJT19QVFIoQ2FkLFJXT1JEKFBhcm1NYXBQLT5saW5rX3N0cl9wdHIpKTsKKworCQkvKgorCQkqKiBwb2ludCB0aGUgVW5peFJ1cHMgYXQgdGhlIHJlYWwgUnVwcworCQkqLworCQlmb3IgKCBSdXBOID0gMDsgUnVwTjxNQVhfUlVQOyBSdXBOKysgKSB7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTl0uUnVwUAkJPSAmSG9zdFAtPlJ1cFBbUnVwTl07CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTl0uSWQJCSAgPSBSdXBOKzE7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTl0uQmFzZVN5c1BvcnQgPSBOT19QT1JUOworCQkJc3Bpbl9sb2NrX2luaXQoJkhvc3RQLT5Vbml4UnVwc1tSdXBOXS5SdXBMb2NrKTsKKwkJfQorCisJCWZvciAoIFJ1cE4gPSAwOyBSdXBOPExJTktTX1BFUl9VTklUOyBSdXBOKysgKSB7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTitNQVhfUlVQXS5SdXBQCT0gJkhvc3RQLT5MaW5rU3RyUFtSdXBOXS5ydXA7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTitNQVhfUlVQXS5JZCAgPSAwOworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE4rTUFYX1JVUF0uQmFzZVN5c1BvcnQgPSBOT19QT1JUOworCQkJc3Bpbl9sb2NrX2luaXQoJkhvc3RQLT5Vbml4UnVwc1tSdXBOK01BWF9SVVBdLlJ1cExvY2spOworCQl9CisKKwkJLyoKKwkJKiogcG9pbnQgdGhlIFBvcnRQLT5QaGJzIGF0IHRoZSByZWFsIFBoYnMKKwkJKi8KKwkJZm9yICggUG9ydE49cC0+UklPRmlyc3RQb3J0c01hcHBlZDsgCisJCQkJUG9ydE48cC0+UklPTGFzdFBvcnRzTWFwcGVkK1BPUlRTX1BFUl9SVEE7IFBvcnROKysgKSB7CisJCQlpZiAoIHAtPlJJT1BvcnRwW1BvcnROXS0+SG9zdFAgPT0gSG9zdFAgKSB7CisJCQkJc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbUG9ydE5dOworCQkJCXN0cnVjdCBQSEIgKlBoYlA7CisJCQkJLyogaW50IG9sZHNwbDsgKi8KKworCQkJCWlmICggIVBvcnRQLT5NYXBwZWQgKQorCQkJCQljb250aW51ZTsKKworCQkJCVBoYlAgPSAmSG9zdFAtPlBoYlBbUG9ydFAtPkhvc3RQb3J0XTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlQb3J0UC0+UGhiUCA9IFBoYlA7CisKKwkJCQlQb3J0UC0+VHhBZGQJPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnR4X2FkZCkpOworCQkJCVBvcnRQLT5UeFN0YXJ0ICA9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+dHhfc3RhcnQpKTsKKwkJCQlQb3J0UC0+VHhFbmQJPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnR4X2VuZCkpOworCQkJCVBvcnRQLT5SeFJlbW92ZSA9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+cnhfcmVtb3ZlKSk7CisJCQkJUG9ydFAtPlJ4U3RhcnQgID0gKFdPUkQgKilSSU9fUFRSKENhZCxSV09SRChQaGJQLT5yeF9zdGFydCkpOworCQkJCVBvcnRQLT5SeEVuZAk9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+cnhfZW5kKSk7CisKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkvKgorCQkJCSoqIHBvaW50IHRoZSBVbml4UnVwIGF0IHRoZSBiYXNlIFN5c1BvcnQKKwkJCQkqLworCQkJCWlmICggIShQb3J0TiAlIFBPUlRTX1BFUl9SVEEpICkKKwkJCQkJSG9zdFAtPlVuaXhSdXBzW1BvcnRQLT5SdXBOdW1dLkJhc2VTeXNQb3J0ID0gUG9ydE47CisJCQl9CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTZXQgdGhlIGNhcmQgcnVubmluZy4uLiBcbiIpOworCQkvKgorCQkqKiBsYXN0IHRoaW5nIC0gc2hvdyB0aGUgd29ybGQgdGhhdCBldmVyeXRoaW5nIGlzIGluIHBsYWNlCisJCSovCisJCUhvc3RQLT5GbGFncyAmPSB+UlVOX1NUQVRFOworCQlIb3N0UC0+RmxhZ3MgfD0gUkNfUlVOTklORzsKKwl9CisJLyoKKwkqKiBNUFggYWx3YXlzIHVzZXMgYSBwb2xsZXIuIFRoaXMgaXMgYWN0dWFsbHkgcGF0Y2hlZCBpbnRvIHRoZSBzeXN0ZW0KKwkqKiBjb25maWd1cmF0aW9uIGFuZCBjYWxsZWQgZGlyZWN0bHkgZnJvbSBlYWNoIGNsb2NrIHRpY2suCisJKioKKwkqLworCXAtPlJJT1BvbGxpbmcgPSAxOworCisJcC0+UklPU3lzdGVtVXArKzsKKwkKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJEb25lIGV2ZXJ5dGhpbmcgJXhcbiIsIEhvc3RQLT5JdmVjKTsKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKgorKiogQm9vdCBhbiBSVEEuIElmIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB0aGlzIGJvb3QsIHRoZW4KKyoqIHJldHVybiAxLiBJZiB3ZSBoYXZlbnQsIHRoZW4gcmV0dXJuIDAuCisqLworaW50CitSSU9Cb290UnVwKCBwLCBSdXAsIEhvc3RQLCBQYWNrZXRQKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3VpbnQgUnVwOworc3RydWN0IEhvc3QgKkhvc3RQOworc3RydWN0IFBLVCAqUGFja2V0UDsgCit7CisJc3RydWN0IFBrdENtZCAqUGt0Q21kUCA9IChzdHJ1Y3QgUGt0Q21kICopUGFja2V0UC0+ZGF0YTsKKwlzdHJ1Y3QgUGt0Q21kX00gKlBrdFJlcGx5UDsKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCXVpbnQgc2VxdWVuY2U7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdChIb3N0KTsKKwlDaGVja1J1cChSdXApOworCUNoZWNrSG9zdFAoSG9zdFApOworCUNoZWNrUGFja2V0UChQYWNrZXRQKTsKKyNlbmRpZgorCisJLyoKKwkqKiBJZiB3ZSBoYXZlbid0IGJlZW4gdG9sZCB3aGF0IHRvIGJvb3QsIHdlIGNhbid0IGJvb3QgaXQuCisJKi8KKwlpZiAoIHAtPlJJT051bUJvb3RQa3RzID09IDAgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIk5vIFJUQSBjb2RlIHRvIGRvd25sb2FkIHlldFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX0JPT1QsIE5VTEwsREJHX0JPT1QsIkluY29taW5nIGNvbW1hbmQgcGFja2V0XG4iKTsgKi8KKwkvKiBTaG93UGFja2V0KCBEQkdfQk9PVCwgUGFja2V0UCApOyAqLworCisJLyoKKwkqKiBTcGVjaWFsIGNhc2Ugb2YgYm9vdCBjb21wbGV0ZWQgLSBpZiB3ZSBnZXQgb25lIG9mIHRoZXNlIHRoZW4gd2UKKwkqKiBkb24ndCBuZWVkIGEgY29tbWFuZCBibG9jay4gRm9yIGFsbCBvdGhlciBjYXNlcyB3ZSBkbywgc28gaGFuZGxlCisJKiogdGhpcyBmaXJzdCBhbmQgdGhlbiBnZXQgYSBjb21tYW5kIGJsb2NrLCB0aGVuIGhhbmRsZSBldmVyeSBvdGhlcgorCSoqIGNhc2UsIHJlbGlucXVpc2hpbmcgdGhlIGNvbW1hbmQgYmxvY2sgaWYgZGlzYXN0ZXIgc3RyaWtlcyEKKwkqLworCWlmICggKFJCWVRFKFBhY2tldFAtPmxlbikgJiBQS1RfQ01EX0JJVCkgJiYgCisJCQkoUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCk9PUJPT1RfQ09NUExFVEVEKSApCisJCXJldHVybiBSSU9Cb290Q29tcGxldGUocCwgSG9zdFAsIFJ1cCwgUGt0Q21kUCApOworCisJLyoKKwkqKiB0cnkgdG8gdW5ob29rIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZSBjb21tYW5kIGZyZWUgbGlzdC4KKwkqLworCWlmICggIShDbWRCbGtQID0gUklPR2V0Q21kQmxrKCkpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJObyBjb21tYW5kIGJsb2NrcyB0byBib290IFJUQSEgY29tZSBiYWNrIGxhdGVyLlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJKiogRmlsbCBpbiB0aGUgZGVmYXVsdCBpbmZvIG9uIHRoZSBjb21tYW5kIGJsb2NrCisJKi8KKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gUnVwIDwgKHVzaG9ydClNQVhfUlVQID8gUnVwIDogMDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCisJQ21kQmxrUC0+UHJlRnVuY1AgPSBDbWRCbGtQLT5Qb3N0RnVuY1AgPSBOVUxMOworCVBrdFJlcGx5UCA9IChzdHJ1Y3QgUGt0Q21kX00gKilDbWRCbGtQLT5QYWNrZXQuZGF0YTsKKworCS8qCisJKiogcHJvY2VzcyBDT01NQU5EUyBvbiB0aGUgYm9vdCBydXAhCisJKi8KKwlpZiAoIFJCWVRFKFBhY2tldFAtPmxlbikgJiBQS1RfQ01EX0JJVCApIHsKKwkJLyoKKwkJKiogV2Ugb25seSBleHBlY3Qgb25lIHR5cGUgb2YgY29tbWFuZCAtIGEgQk9PVF9SRVFVRVNUIQorCQkqLworCQlpZiAoIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICE9IEJPT1RfUkVRVUVTVCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlVuZXhwZWN0ZWQgY29tbWFuZCAlZCBvbiBCT09UIFJVUCAlZCBvZiBob3N0ICVkXG4iLCAKKwkJCQkJCVBrdENtZFAtPkNvbW1hbmQsUnVwLEhvc3RQLXAtPlJJT0hvc3RzKTsKKwkJCVNob3dQYWNrZXQoIERCR19CT09ULCBQYWNrZXRQICk7CisJCQlSSU9GcmVlQ21kQmxrKCBDbWRCbGtQICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qCisJCSoqIEJ1aWxkIGEgQm9vdCBTZXF1ZW5jZSBjb21tYW5kIGJsb2NrCisJCSoqCisJCSoqIDAyLjAzLjE5OTkgQVJHIC0gRVNJTCAwODIwIGZpeAorCQkqKiBXZSBubyBsb25nZXIgbmVlZCB0byB1c2UgIkJvb3QgTW9kZSIsIHdlJ2xsIGFsd2F5cyBhbGxvdworCQkqKiBib290IHJlcXVlc3RzIC0gdGhlIGJvb3Qgd2lsbCBub3QgY29tcGxldGUgaWYgdGhlIGRldmljZQorCQkqKiBhcHBlYXJzIGluIHRoZSBiaW5kaW5ncyB0YWJsZS4KKwkJKiogU28sIHRoaXMgY29uZGl0aW9uYWwgaXMgbm90IHJlcXVpcmVkIC4uLgorCQkqKgorCQlpZiAocC0+UklPQm9vdE1vZGUgPT0gUkNfQk9PVF9OT05FKQorCQkJKioKKwkJCSoqIElmIHRoZSBzeXN0ZW0gaXMgaW4gc2xhdmUgbW9kZSwgYW5kIGEgYm9vdCByZXF1ZXN0IGlzCisJCQkqKiByZWNlaXZlZCwgc2V0IGNvbW1hbmQgdG8gQk9PVF9BQk9SVCBzbyB0aGF0IHRoZSBib290CisJCQkqKiB3aWxsIG5vdCBjb21wbGV0ZS4KKwkJCSoqCisJCQlQa3RSZXBseVAtPkNvbW1hbmQJCQkgPSBCT09UX0FCT1JUOworCQllbHNlCisJCSoqCisJCSoqIFdlJ2xsIGp1c3QgKGFsd2F5cykgc2V0IHRoZSBjb21tYW5kIGZpZWxkIGluIHBhY2tldCByZXBseQorCQkqKiB0byBhbGxvdyBhbiBhdHRlbXB0ZWQgYm9vdCBzZXF1ZW5jZSA6CisJCSovCisJCVBrdFJlcGx5UC0+Q29tbWFuZCA9IEJPT1RfU0VRVUVOQ0U7CisKKwkJUGt0UmVwbHlQLT5Cb290U2VxdWVuY2UuTnVtUGFja2V0cyA9IHAtPlJJT051bUJvb3RQa3RzOworCQlQa3RSZXBseVAtPkJvb3RTZXF1ZW5jZS5Mb2FkQmFzZSAgID0gcC0+UklPQ29uZi5SdGFMb2FkQmFzZTsKKwkJUGt0UmVwbHlQLT5Cb290U2VxdWVuY2UuQ29kZVNpemUgICA9IHAtPlJJT0Jvb3RDb3VudDsKKworCQlDbWRCbGtQLT5QYWNrZXQubGVuCQkJCT0gQk9PVF9TRVFVRU5DRV9MRU4gfCBQS1RfQ01EX0JJVDsKKworCQliY29weSgiQk9PVCIsKHZvaWQgKikmQ21kQmxrUC0+UGFja2V0LmRhdGFbQk9PVF9TRVFVRU5DRV9MRU5dLDQpOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJvb3QgUlRBIG9uIEhvc3QgJWQgUnVwICVkIC0gJWQgKDB4JXgpIHBhY2tldHMgdG8gMHgleFxuIiwKKwkJCUhvc3RQLXAtPlJJT0hvc3RzLCBSdXAsIHAtPlJJT051bUJvb3RQa3RzLCBwLT5SSU9OdW1Cb290UGt0cywgCisJCQkJCQkJCXAtPlJJT0NvbmYuUnRhTG9hZEJhc2UpOworCisJCS8qCisJCSoqIElmIHRoaXMgaG9zdCBpcyBpbiBzbGF2ZSBtb2RlLCBzZW5kIHRoZSBSVEEgYW4gaW52YWxpZCBib290CisJCSoqIHNlcXVlbmNlIGNvbW1hbmQgYmxvY2sgdG8gZm9yY2UgaXQgdG8ga2lsbCB0aGUgYm9vdC4gV2Ugd2FpdAorCQkqKiBmb3IgaGFsZiBhIHNlY29uZCBiZWZvcmUgc2VuZGluZyB0aGlzIHBhY2tldCB0byBwcmV2ZW50IHRoZSBSVEEKKwkJKiogYXR0ZW1wdGluZyB0byBib290IHRvbyBvZnRlbi4gVGhlIG1hc3RlciBob3N0IHNob3VsZCB0aGVuIGdyYWIKKwkJKiogdGhlIFJUQSBhbmQgbWFrZSBpdCBpdHMgb3duLgorCQkqLworCQlwLT5SSU9Cb290aW5nKys7CisJCVJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQICk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJKiogSXQgaXMgYSByZXF1ZXN0IGZvciBib290IGRhdGEuCisJKi8KKwlzZXF1ZW5jZSA9IFJXT1JEKFBrdENtZFAtPlNlcXVlbmNlKTsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJvb3QgYmxvY2sgJWQgb24gSG9zdCAlZCBSdXAlZFxuIixzZXF1ZW5jZSxIb3N0UC1wLT5SSU9Ib3N0cyxSdXApOworCisJaWYgKCBzZXF1ZW5jZSA+PSBwLT5SSU9OdW1Cb290UGt0cyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiR290IGEgcmVxdWVzdCBmb3IgcGFja2V0ICVkLCBtYXggaXMgJWRcbiIsIHNlcXVlbmNlLCAKKwkJCQkJcC0+UklPTnVtQm9vdFBrdHMpOworCQlTaG93UGFja2V0KCBEQkdfQk9PVCwgUGFja2V0UCApOworCX0KKworCVBrdFJlcGx5UC0+U2VxdWVuY2UgPSBzZXF1ZW5jZTsKKworCWJjb3B5KCBwLT5SSU9Cb290UGFja2V0c1sgcC0+UklPTnVtQm9vdFBrdHMgLSBzZXF1ZW5jZSAtIDEgXSwgCisJCQkJUGt0UmVwbHlQLT5Cb290RGF0YSwgUlRBX0JPT1RfREFUQV9TSVpFICk7CisKKwlDbWRCbGtQLT5QYWNrZXQubGVuID0gUEtUX01BWF9EQVRBX0xFTjsKKwlTaG93UGFja2V0KCBEQkdfQk9PVCwgJkNtZEJsa1AtPlBhY2tldCApOworCVJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQICk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIFJUQSBiZWVuIGJvb3RlZC4KKyoqIElmIGJvb3RlZCBieSBhIGhvc3QsIEhvc3RQLT5Ib3N0VW5pcXVlTnVtIGlzIHRoZSBib290aW5nIGhvc3QuCisqKiBJZiBib290ZWQgYnkgYW4gUlRBLCBIb3N0UC0+TWFwcGluZ1tSdXBdLlJ0YVVuaXF1ZU51bSBpcyB0aGUgYm9vdGluZyBSVEEuCisqKiBSdGFVbmlxIGlzIHRoZSBib290ZWQgUlRBLgorKi8KK3N0YXRpYyBpbnQgUklPQm9vdENvbXBsZXRlKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgdWludCBSdXAsIHN0cnVjdCBQa3RDbWQgKlBrdENtZFAgKQoreworCXN0cnVjdCBNYXAJKk1hcFAgPSBOVUxMOworCXN0cnVjdCBNYXAJKk1hcFAyID0gTlVMTDsKKwlpbnQJRmxhZzsKKwlpbnQJZm91bmQ7CisJaW50CWhvc3QsIHJ0YTsKKwlpbnQJRW1wdHlTbG90ID0gLTE7CisJaW50CWVudHJ5LCBlbnRyeTI7CisJY2hhcgkqTXlUeXBlLCAqTXlOYW1lOworCXVpbnQJTXlMaW5rOworCXVzaG9ydAlSdGFUeXBlOworCXVpbnQJUnRhVW5pcSA9IChSQllURShQa3RDbWRQLT5VbmlxTnVtWzBdKSkgKworCQkJICAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVsxXSkgPDwgOCkgKworCQkJICAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVsyXSkgPDwgMTYpICsKKwkJCSAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bM10pIDw8IDI0KTsKKworCS8qIFdhcyBSSU9Cb290aW5nLS0gLiBUaGF0J3MgYmFkLiBJZiBhbiBSVEEgc2VuZHMgdHdvIG9mIHRoZW0sIHRoZQorCSAgIGRyaXZlciB3aWxsIG5ldmVyIHRoaW5rIHRoYXQgdGhlIFJUQSBoYXMgYm9vdGVkLi4uIC0tIFJFVyAqLworCXAtPlJJT0Jvb3RpbmcgPSAwOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBIEJvb3QgY29tcGxldGVkIC0gQm9vdEluUHJvZ3Jlc3Mgbm93ICVkXG4iLCBwLT5SSU9Cb290aW5nKTsKKworCS8qCisJKiogRGV0ZXJtaW5lIHR5cGUgb2YgdW5pdCAoMTYvOCBwb3J0IFJUQSkuCisJKi8KKwlSdGFUeXBlID0gR2V0VW5pdFR5cGUoUnRhVW5pcSk7CisgICAgICAgIGlmICggUnVwID49ICh1c2hvcnQpTUFYX1JVUCApIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUklPOiBIb3N0ICVzIGhhcyBib290ZWQgYW4gUlRBKCVkKSBvbiBsaW5rICVjXG4iLAorCSAgICAgSG9zdFAtPk5hbWUsIDggKiBSdGFUeXBlLCBSQllURShQa3RDbWRQLT5MaW5rTnVtKSsnQScpOworCX0gZWxzZSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJJTzogUlRBICVzIGhhcyBib290ZWQgYW4gUlRBKCVkKSBvbiBsaW5rICVjXG4iLAorCSAgICAgSG9zdFAtPk1hcHBpbmdbUnVwXS5OYW1lLCA4ICogUnRhVHlwZSwKKwkgICAgIFJCWVRFKFBrdENtZFAtPkxpbmtOdW0pKydBJyk7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVW5pcU51bSBpcyAweCV4XG4iLFJ0YVVuaXEpOworCisgICAgICAgIGlmICggKCBSdGFVbmlxID09IDB4MDAwMDAwMDAgKSB8fCAoIFJ0YVVuaXEgPT0gMHhmZmZmZmZmZiApICkKKwl7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIklsbGVnYWwgUlRBIFVuaXEgTnVtYmVyXG4iKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCisJLyoKKwkqKiBJZiB0aGlzIFJUQSBoYXMganVzdCBib290ZWQgYW4gUlRBIHdoaWNoIGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMKKwkqKiBzeXN0ZW0sIG9yIHRoZSBzeXN0ZW0gaXMgaW4gc2xhdmUgbW9kZSwgZG8gbm90IGF0dGVtcHQgdG8gY3JlYXRlCisJKiogYSBuZXcgdGFibGUgZW50cnkgZm9yIGl0LgorCSovCisJaWYgKCFSSU9Cb290T2socCwgSG9zdFAsIFJ0YVVuaXEpKQorCXsKKwkgICAgTXlMaW5rID0gUkJZVEUoUGt0Q21kUC0+TGlua051bSk7CisJICAgIGlmIChSdXAgPCAodXNob3J0KSBNQVhfUlVQKQorCSAgICB7CisJCS8qCisJCSoqIFJ0YVVuaXEgd2FzIGNsb25lIGJvb3RlZCAoYnkgdGhpcyBSVEEpLiBJbnN0cnVjdCB0aGlzIFJUQQorCQkqKiB0byBob2xkIG9mZiBmdXJ0aGVyIGF0dGVtcHRzIHRvIGJvb3Qgb24gdGhpcyBsaW5rIGZvciAzMAorCQkqKiBzZWNvbmRzLgorCQkqLworCQlpZiAoUklPU3VzcGVuZEJvb3RSdGEoSG9zdFAsIEhvc3RQLT5NYXBwaW5nW1J1cF0uSUQsIE15TGluaykpCisJCXsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSBmYWlsZWQgdG8gc3VzcGVuZCBib290aW5nIG9uIGxpbmsgJWNcbiIsCisJCSAgICAgJ0EnICsgTXlMaW5rKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkqKiBSdGFVbmlxIHdhcyBib290ZWQgYnkgdGhpcyBob3N0LiBTZXQgdGhlIGJvb3RpbmcgbGluaworCQkqKiB0byBob2xkIG9mZiBmb3IgMzAgc2Vjb25kcyB0byBnaXZlIGFub3RoZXIgdW5pdCBhCisJCSoqIGNoYW5jZSB0byBib290IGl0LgorCQkqLworCQlXV09SRChIb3N0UC0+TGlua1N0clBbTXlMaW5rXS5XYWl0Tm9Cb290LCAzMCk7CisJICAgIH0KKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBICV4IG5vdCBvd25lZCAtIHN1c3BlbmQgYm9vdGluZyBkb3duIGxpbmsgJWMgb24gdW5pdCAleFxuIiwKKwkgICAgICBSdGFVbmlxLCAnQScgKyBNeUxpbmssIEhvc3RQLT5NYXBwaW5nW1J1cF0uUnRhVW5pcXVlTnVtKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCisJLyoKKwkqKiBDaGVjayBmb3IgYSBTTE9UX0lOX1VTRSBlbnRyeSBmb3IgdGhpcyBSVEEgYXR0YWNoZWQgdG8gdGhlCisJKiogY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIGl0IGV4aXN0cywgbWFrZSBhIG5vdGUgdGhhdCB3ZSBoYXZlIGJvb3RlZCBpdC4gT3RoZXIgcGFydHMgb2YKKwkqKiB0aGUgZHJpdmVyIGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgaW5mb3JtYXRpb24gYXQgYSBsYXRlciBkYXRlLAorCSoqIGluIHBhcnRpY3VsYXIgd2hlbiB0aGUgYm9vdGluZyBSVEEgYXNrcyBmb3IgYW4gSUQgZm9yIHRoaXMgdW5pdCwKKwkqKiB3ZSBtdXN0IGhhdmUgc2V0IHRoZSBCT09URUQgZmxhZywgYW5kIHRoZSBORVdCT09UIGZsYWcgaXMgdXNlZAorCSoqIHRvIGZvcmNlIGFuIG9wZW4gb24gYW55IHBvcnRzIHRoYXQgd2hlcmUgcHJldmlvdXNseSBvcGVuIG9uIHRoaXMKKwkqKiB1bml0LgorCSovCisgICAgICAgIGZvciAoIGVudHJ5PTA7IGVudHJ5PE1BWF9SVVA7IGVudHJ5KysgKQorCXsKKwkgICAgdWludCBzeXNwb3J0OworCisJICAgIGlmICgoSG9zdFAtPk1hcHBpbmdbZW50cnldLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmIAorCSAgICAgICAoSG9zdFAtPk1hcHBpbmdbZW50cnldLlJ0YVVuaXF1ZU51bT09UnRhVW5pcSkpCisJICAgIHsKKwkgICAgICAgIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyB8PSBSVEFfQk9PVEVEfFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCVJJT19TVl9CUk9BRENBU1QoSG9zdFAtPnN2RmxhZ3NbZW50cnldKTsKKyNlbmRpZgorCQlpZiAoIChzeXNwb3J0PUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0KSAhPSBOT19QT1JUICkKKwkJeworCQkgICBpZiAoIHN5c3BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkICkKKwkJCXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgPSBzeXNwb3J0OworCQkgICBpZiAoIHN5c3BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkJcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gc3lzcG9ydDsKKwkJICAgLyoKKwkJICAgKiogRm9yIGEgMTYgcG9ydCBSVEEsIGNoZWNrIHRoZSBzZWNvbmQgYmFuayBvZiA4IHBvcnRzCisJCSAgICovCisJCSAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCSAgIHsKKwkJCWVudHJ5MiA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgLSAxOworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyB8PSBSVEFfQk9PVEVEfFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCQlSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5Ml0pOworI2VuZGlmCisJCQlzeXNwb3J0ID0gSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0OworCQkJaWYgKCBzeXNwb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCisJCQkgICAgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCA9IHN5c3BvcnQ7CisJCQlpZiAoIHN5c3BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkJICAgIHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCA9IHN5c3BvcnQ7CisJCSAgIH0KKwkJfQorCQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KSB7CisJCSAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSB3aWxsIGJlIGdpdmVuIElEcyAlZCslZFxuIiwKKwkJICAgIGVudHJ5KzEsIGVudHJ5MisxKTsKKwkJfSBlbHNlIHsKKwkJICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBIHdpbGwgYmUgZ2l2ZW4gSUQgJWRcbiIsZW50cnkrMSk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgaG9zdFxuIik7CisKKwlpZiAoIFJ1cCA+PSAodXNob3J0KU1BWF9SVVAgKQorCXsKKwkgICAgLyoKKwkgICAgKiogSXQgd2FzIGEgaG9zdCB0aGF0IGRpZCB0aGUgYm9vdGluZworCSAgICAqLworCSAgICBNeVR5cGUgPSAiSG9zdCI7CisJICAgIE15TmFtZSA9IEhvc3RQLT5OYW1lOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAqKiBJdCB3YXMgYW4gUlRBIHRoYXQgZGlkIHRoZSBib290aW5nCisJICAgICovCisJICAgIE15VHlwZSA9ICJSVEEiOworCSAgICBNeU5hbWUgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWU7CisJfQorI2lmZGVmIENIRUNLCisJQ2hlY2tTdHJpbmcoTXlUeXBlKTsKKwlDaGVja1N0cmluZyhNeU5hbWUpOworI2VuZGlmCisKKwlNeUxpbmsgPSBSQllURShQa3RDbWRQLT5MaW5rTnVtKTsKKworCS8qCisJKiogVGhlcmUgaXMgbm8gU0xPVF9JTl9VU0UgZW50cnkgZm9yIHRoaXMgUlRBIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50CisJKiogaG9zdCBjYXJkIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBDaGVjayBmb3IgYSBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEgYXR0YWNoZWQgdG8gdGhlCisJKiogY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIHdlIGZpbmQgb25lLCB0aGVuIHdlIHJlLXVzZSB0aGF0IHNsb3QuCisJKi8KKwlmb3IgKCBlbnRyeT0wOyBlbnRyeTxNQVhfUlVQOyBlbnRyeSsrICkKKwl7CisJICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKSAmJgorCQkgKEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcSkgKQorCSAgICB7CisJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCXsKKwkJICAgIGVudHJ5MiA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgLSAxOworCQkgICAgaWYgKCAoSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKSAmJgorCQkJIChIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKSApCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJGb3VuZCBwcmV2aW91cyB0ZW50YXRpdmUgc2xvdHMgKCVkKyVkKVxuIiwKKwkJCSBlbnRyeSwgZW50cnkyKTsKKwkJICAgIGVsc2UKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkZvdW5kIHByZXZpb3VzIHRlbnRhdGl2ZSBzbG90ICglZClcbiIsZW50cnkpOworCQlpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJCSAgICBjcHJpbnRmKCJSVEEgY29ubmVjdGVkIHRvICVzICclcycgKCVjKSBub3QgY29uZmlndXJlZC5cbiIsTXlUeXBlLE15TmFtZSxNeUxpbmsrJ0EnKTsKKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwl9CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIFNMT1RfSU5fVVNFIG9yIFNMT1RfVEVOVEFUSVZFIGVudHJ5IGZvciB0aGlzIFJUQQorCSoqIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGhvc3QgY2FyZCBpbiB0aGUgZHJpdmVyIHRhYmxlLgorCSoqCisJKiogQ2hlY2sgaWYgdGhlcmUgaXMgYSBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBvbiBhbm90aGVyCisJKiogaG9zdCBmb3IgdGhpcyBSVEEgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIEZvciBhIFNMT1RfSU5fVVNFIGVudHJ5IG9uIGFub3RoZXIgaG9zdCwgd2UgbmVlZCB0byBkZWxldGUgdGhlIFJUQQorCSoqIGVudHJ5IGZyb20gdGhlIG90aGVyIGhvc3QgYW5kIGFkZCBpdCB0byB0aGlzIGhvc3QgKHVzaW5nIHNvbWUgb2YKKwkqKiB0aGUgZnVuY3Rpb25zIGZyb20gdGFibGUuYyB3aGljaCBkbyB0aGlzKS4KKwkqKiBGb3IgYSBTTE9UX1RFTlRBVElWRSBlbnRyeSBvbiBhbm90aGVyIGhvc3QsIHdlIG11c3QgY29wZSB3aXRoIHRoZQorCSoqIGZvbGxvd2luZyBzY2VuYXJpbzoKKwkqKgorCSoqICsgUGx1ZyA4IHBvcnQgUlRBIGludG8gaG9zdCBBLiAoVGhpcyBjcmVhdGVzIFNMT1RfVEVOVEFUSVZFIGVudHJ5CisJKiogICBpbiB0YWJsZSkKKwkqKiArIFVucGx1ZyBSVEEgYW5kIHBsdWcgaW50byBob3N0IEIuIChXZSBub3cgaGF2ZSAyIFNMT1RfVEVOVEFUSVZFCisJKiogICBlbnRyaWVzKQorCSoqICsgQ29uZmlndXJlIFJUQSBvbiBob3N0IEIuIChUaGlzIHNsb3Qgbm93IGJlY29tZXMgU0xPVF9JTl9VU0UpCisJKiogKyBVbnBsdWcgUlRBIGFuZCBwbHVnIGJhY2sgaW50byBob3N0IEEuCisJKiogKyBDb25maWd1cmUgUlRBIG9uIGhvc3QgQS4gV2Ugbm93IGhhdmUgdGhlIHNhbWUgUlRBIGNvbmZpZ3VyZWQKKwkqKiAgIHdpdGggZGlmZmVyZW50IHBvcnRzIG9uIHR3byBkaWZmZXJlbnQgaG9zdHMuCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJIYXZlIHdlIHNlZW4gUlRBICV4IGJlZm9yZT9cbiIsIFJ0YVVuaXEgKTsKKwlmb3VuZCA9IDA7CisJRmxhZyA9IDA7IC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGlzIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkICovCisJZm9yICggaG9zdCA9IDA7ICFmb3VuZCAmJiAoaG9zdCA8IHAtPlJJT051bUhvc3RzKTsgaG9zdCsrICkKKwl7CisJICAgIGZvciAoIHJ0YT0wOyBydGE8TUFYX1JVUDsgcnRhKysgKQorCSAgICB7CisJCWlmICgocC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tydGFdLkZsYWdzICYKKwkJIChTTE9UX0lOX1VTRSB8IFNMT1RfVEVOVEFUSVZFKSkgJiYKKwkJIChwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3J0YV0uUnRhVW5pcXVlTnVtPT1SdGFVbmlxKSkKKwkJeworCQkgICAgRmxhZyA9IHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbcnRhXS5GbGFnczsKKwkJICAgIE1hcFAgPSAmcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tydGFdOworCQkgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwkJICAgIHsKKwkJCU1hcFAyID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQyIC0gMV07CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJUaGlzIFJUQSBpcyB1bml0cyAlZCslZCBmcm9tIGhvc3QgJXNcbiIsCisJCQkgcnRhKzEsIE1hcFAtPklEMiwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJUaGlzIFJUQSBpcyB1bml0ICVkIGZyb20gaG9zdCAlc1xuIiwKKwkJCSBydGErMSwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSk7CisJCSAgICBmb3VuZCA9IDE7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEKKwkqKiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIHdlIGhhdmUgbm90IGZvdW5kIGEgU0xPVF9JTl9VU0Ugb3IgU0xPVF9URU5UQVRJVkUgZW50cnkgb24KKwkqKiBhbm90aGVyIGhvc3QgZm9yIHRoaXMgUlRBIGluIHRoZSBkcml2ZXIgdGFibGUuLi4KKwkqKgorCSoqIENoZWNrIGZvciBhIFNMT1RfSU5fVVNFIGVudHJ5IGZvciB0aGlzIFJUQSBpbiB0aGUgY29uZmlnIHRhYmxlLgorCSovCisJaWYgKCAhTWFwUCApCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJMb29rIGZvciBSVEEgJXggaW4gUklPU2F2ZWRUYWJsZVxuIixSdGFVbmlxKTsKKwkgICAgZm9yICggcnRhPTA7IHJ0YSA8IFRPVEFMX01BUF9FTlRSSUVTOyBydGErKyApCisJICAgIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQ2hlY2sgdGFibGUgZW50cnkgJWQgKCV4KSIsCisJCSAgICAgIHJ0YSwKKwkJICAgICAgcC0+UklPU2F2ZWRUYWJsZVtydGFdLlJ0YVVuaXF1ZU51bSk7CisKKwkJaWYgKCAocC0+UklPU2F2ZWRUYWJsZVtydGFdLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmCisJCSAocC0+UklPU2F2ZWRUYWJsZVtydGFdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKSApCisJCXsKKwkJICAgIE1hcFAgPSAmcC0+UklPU2F2ZWRUYWJsZVtydGFdOworCQkgICAgRmxhZyA9IHAtPlJJT1NhdmVkVGFibGVbcnRhXS5GbGFnczsKKwkJICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGVudHJ5MiA9IHJ0YSArIDE7IGVudHJ5MiA8IFRPVEFMX01BUF9FTlRSSUVTOworICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5MisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLT5SSU9TYXZlZFRhYmxlW2VudHJ5Ml0uUnRhVW5pcXVlTnVtID09IFJ0YVVuaXEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTWFwUDIgPSAmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeTJdOworICAgICAgICAgICAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGhpcyBSVEEgaXMgZnJvbSB0YWJsZSBlbnRyaWVzICVkKyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhLCBlbnRyeTIpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGhpcyBSVEEgaXMgZnJvbSB0YWJsZSBlbnRyeSAlZFxuIiwgcnRhKTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIFNMT1RfSU5fVVNFIG9yIFNMT1RfVEVOVEFUSVZFIGVudHJ5IGZvciB0aGlzIFJUQQorCSoqIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGhvc3QgY2FyZCBpbiB0aGUgZHJpdmVyIHRhYmxlLgorCSoqCisJKiogV2UgbWF5IGhhdmUgZm91bmQgYSBTTE9UX0lOX1VTRSBlbnRyeSBvbiBhbm90aGVyIGhvc3QgZm9yIHRoaXMKKwkqKiBSVEEgaW4gdGhlIGNvbmZpZyB0YWJsZSwgb3IgYSBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeQorCSoqIG9uIGFub3RoZXIgaG9zdCBmb3IgdGhpcyBSVEEgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIENoZWNrIHRoZSBkcml2ZXIgdGFibGUgZm9yIHJvb20gdG8gZml0IHRoaXMgbmV3bHkgZGlzY292ZXJlZCBSVEEuCisJKiogUklPRmluZEZyZWVJRCgpIGZpcnN0IGxvb2tzIGZvciBmcmVlIHNsb3RzIGFuZCBpZiBpdCBkb2VzIG5vdAorCSoqIGZpbmQgYW55IGZyZWUgc2xvdHMgaXQgd2lsbCB0aGVuIGF0dGVtcHQgdG8gb3VzdCBhbnkKKwkqKiB0ZW50YXRpdmUgZW50cnkgaW4gdGhlIHRhYmxlLgorCSovCisJRW1wdHlTbG90ID0gMTsKKwlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCXsKKwkgICAgaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZlbnRyeSwgJmVudHJ5MikgPT0gMCkKKwkgICAgeworCQlSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgZW50cnkpOworCQlGaWxsU2xvdChlbnRyeSwgZW50cnkyLCBSdGFVbmlxLCBIb3N0UCk7CisJCUVtcHR5U2xvdCA9IDA7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZlbnRyeSwgTlVMTCkgPT0gMCkKKwkgICAgeworCQlSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgZW50cnkpOworCQlGaWxsU2xvdChlbnRyeSwgMCwgUnRhVW5pcSwgSG9zdFApOworCQlFbXB0eVNsb3QgPSAwOworCSAgICB9CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEKKwkqKiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIHdlIGZvdW5kIGEgU0xPVF9JTl9VU0UgZW50cnkgb24gYW5vdGhlciBob3N0IGZvciB0aGlzCisJKiogUlRBIGluIHRoZSBjb25maWcgb3IgZHJpdmVyIHRhYmxlLCBhbmQgdGhlcmUgYXJlIGVub3VnaCBmcmVlCisJKiogc2xvdHMgaW4gdGhlIGRyaXZlciB0YWJsZSwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgaXQgb3ZlciBhbmQKKwkqKiBkZWxldGUgaXQgZnJvbSB0aGUgb3RoZXIgaG9zdC4KKwkqKiBJZiB3ZSBmb3VuZCBhIFNMT1RfVEVOVEFUSVZFIGVudHJ5IG9uIGFub3RoZXIgaG9zdCBmb3IgdGhpcworCSoqIFJUQSBpbiB0aGUgZHJpdmVyIHRhYmxlLCBqdXN0IGRlbGV0ZSB0aGUgb3RoZXIgaG9zdCBlbnRyeS4KKwkqLworCWlmIChFbXB0eVNsb3QgPT0gMCkKKwl7CisJICAgIGlmICggTWFwUCApCisJICAgIHsKKwkJaWYgKEZsYWcgJiBTTE9UX0lOX1VTRSkKKwkJeworCQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAKKyAgICAiVGhpcyBSVEEgY29uZmlndXJlZCBvbiBhbm90aGVyIGhvc3QgLSBtb3ZlIGVudHJ5IHRvIGN1cnJlbnQgaG9zdCAoMSlcbiIpOworCQkgICAgSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPSBNYXBQLT5TeXNQb3J0OworCQkgICAgQ0NPUFkoIE1hcFAtPk5hbWUsIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5OYW1lLCBNQVhfTkFNRV9MRU4gKTsKKwkJICAgIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyA9CisJCSAgICAgU0xPVF9JTl9VU0UgfCBSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1Q7CisjaWYgTkVFRF9UT19GSVgKKwkJICAgIFJJT19TVl9CUk9BRENBU1QoSG9zdFAtPnN2RmxhZ3NbZW50cnldKTsKKyNlbmRpZgorCQkgICAgUklPUmVNYXBQb3J0cyggcCwgSG9zdFAsICZIb3N0UC0+TWFwcGluZ1tlbnRyeV0gKTsKKwkJICAgIGlmICggSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkICkKKwkJCXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgPSBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uU3lzUG9ydDsKKwkJICAgIGlmICggSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkJcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQ7CisJCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTeXNQb3J0ICVkLCBOYW1lICVzXG4iLChpbnQpTWFwUC0+U3lzUG9ydCxNYXBQLT5OYW1lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgCisgICAiVGhpcyBSVEEgaGFzIGEgdGVudGF0aXZlIGVudHJ5IG9uIGFub3RoZXIgaG9zdCAtIGRlbGV0ZSB0aGF0IGVudHJ5ICgxKVxuIik7CisJCSAgICBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uRmxhZ3MgPQorCQkgICAgIFNMT1RfVEVOVEFUSVZFIHwgUlRBX0JPT1RFRCB8IFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCSAgICBSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5XSk7CisjZW5kaWYKKwkJfQorCQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCQl7CisJCSAgICBpZiAoRmxhZyAmIFNMT1RfSU5fVVNFKQorCQkgICAgeworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyA9IFNMT1RfSU5fVVNFIHwKKwkJCSBSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1QgfCBSVEExNl9TRUNPTkRfU0xPVDsKKyNpZiBORUVEX1RPX0ZJWAorCQkJUklPX1NWX0JST0FEQ0FTVChIb3N0UC0+c3ZGbGFnc1tlbnRyeTJdKTsKKyNlbmRpZgorCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0ID0gTWFwUDItPlN5c1BvcnQ7CisJCQkvKgorCQkJKiogTWFwIHNlY29uZCBibG9jayBvZiB0dHlzIGZvciAxNiBwb3J0IFJUQQorCQkJKi8KKwkJCVJJT1JlTWFwUG9ydHMoIHAsIEhvc3RQLCAmSG9zdFAtPk1hcHBpbmdbZW50cnkyXSApOworCQkgICAgICAgaWYgKEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNCb290ZWQpCisJCQkgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydDsKKwkJICAgICAgIGlmIChIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQpCisJCQkgcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0OworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU3lzUG9ydCAlZCwgTmFtZSAlc1xuIiwKKwkJCSAgICAgICAoaW50KUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydCwKKwkJCSAgICAgICBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uTmFtZSk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLkZsYWdzID0gU0xPVF9URU5UQVRJVkUgfAorCQkJIFJUQV9CT09URUQgfCBSVEFfTkVXQk9PVCB8IFJUQTE2X1NFQ09ORF9TTE9UOworI2lmIE5FRURfVE9fRklYCisJCQlSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5Ml0pOworI2VuZGlmCisJCSAgICBiemVybyggKGNhZGRyX3QpTWFwUDIsIHNpemVvZihzdHJ1Y3QgTWFwKSApOworCQl9CisJCWJ6ZXJvKCAoY2FkZHJfdClNYXBQLCBzaXplb2Yoc3RydWN0IE1hcCkgKTsKKwkJaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQkgICAgY3ByaW50ZigiQW4gb3JwaGFuZWQgUlRBIGhhcyBiZWVuIGFkb3B0ZWQgYnkgJXMgJyVzJyAoJWMpLlxuIixNeVR5cGUsTXlOYW1lLE15TGluaysnQScpOworCSAgICB9CisJICAgIGVsc2UgaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQljcHJpbnRmKCJSVEEgY29ubmVjdGVkIHRvICVzICclcycgKCVjKSBub3QgY29uZmlndXJlZC5cbiIsTXlUeXBlLE15TmFtZSxNeUxpbmsrJ0EnKTsKKwkgICAgUklPU2V0Q2hhbmdlKHApOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIGRyaXZlciB0YWJsZSB0byBtYWtlIGFuIGVudHJ5IGZvciB0aGUKKwkqKiBib290ZWQgUlRBLiBLZWVwIGEgbm90ZSBvZiBpdHMgVW5pcSBOdW0gaW4gdGhlIG92ZXJmbG93IHRhYmxlLAorCSoqIHNvIHdlIGNhbiBpZ25vcmUgaXQncyBJRCByZXF1ZXN0cy4KKwkqLworCWlmICghIHAtPlJJT05vTWVzc2FnZSkKKwkgICAgY3ByaW50ZigiVGhlIFJUQSBjb25uZWN0ZWQgdG8gJXMgJyVzJyAoJWMpIGNhbm5vdCBiZSBjb25maWd1cmVkLiAgWW91IGNhbm5vdCBjb25maWd1cmUgbW9yZSB0aGFuIDEyOCBwb3J0cyB0byBvbmUgaG9zdCBjYXJkLlxuIixNeVR5cGUsTXlOYW1lLE15TGluaysnQScpOworCWZvciAoIGVudHJ5PTA7IGVudHJ5PEhvc3RQLT5OdW1FeHRyYUJvb3RlZDsgZW50cnkrKyApCisJeworCSAgICBpZiAoIEhvc3RQLT5FeHRyYVVuaXRzW2VudHJ5XSA9PSBSdGFVbmlxICkKKwkgICAgeworCQkvKgorCQkqKiBhbHJlYWR5IGdvdCBpdCEKKwkJKi8KKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwl9CisJLyoKKwkqKiBJZiB0aGVyZSBpcyByb29tLCBhZGQgdGhlIHVuaXQgdG8gdGhlIGxpc3Qgb2YgZXh0cmFzCisJKi8KKwlpZiAoIEhvc3RQLT5OdW1FeHRyYUJvb3RlZCA8IE1BWF9FWFRSQV9VTklUUyApCisJICAgIEhvc3RQLT5FeHRyYVVuaXRzW0hvc3RQLT5OdW1FeHRyYUJvb3RlZCsrXSA9IFJ0YVVuaXE7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyoqIElmIHRoZSBSVEEgb3IgaXRzIGhvc3QgYXBwZWFycyBpbiB0aGUgUklPQmluZFRhYltdIHN0cnVjdHVyZSB0aGVuCisqKiB3ZSBtdXN0bid0IGJvb3QgdGhlIFJUQSBhbmQgc2hvdWxkIHJldHVybiBGQUxTRS4KKyoqIFRoaXMgb3BlcmF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBkcml2ZXJzIGZvciBSSU8KKyoqIGluIHRoYXQgdGhpcyBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIG5ldyB1dGlsaXRpZXMKKyoqIG5vdCBjb25maWcucmlvIGFuZCBpcyBGQVIgU0lNUExFUi4KKyoqIFdlIG5vIGxvbmdlciBzdXBwb3J0IHRoZSBSSU9Cb290TW9kZSB2YXJpYWJsZS4gSXQgaXMgYWxsIGRvbmUgZnJvbSB0aGUKKyoqICJib290L25vYm9vdCIgZmllbGQgaW4gdGhlIHJpby5jZiBmaWxlLgorKi8KK2ludAorUklPQm9vdE9rKHAsIEhvc3RQLCBSdGFVbmlxKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3N0cnVjdCBIb3N0ICoJCUhvc3RQOwordWxvbmcgUnRhVW5pcTsKK3sKKyAgICBpbnQJCUVudHJ5OworICAgIHVpbnQgSG9zdFVuaXEgPSBIb3N0UC0+VW5pcXVlTnVtOworCisJLyoKKwkqKiBTZWFyY2ggYmluZGluZ3MgdGFibGUgZm9yIFJUQSBvciBpdHMgcGFyZW50LgorCSoqIElmIGl0IGV4aXN0cywgcmV0dXJuIDAsIGVsc2UgMS4KKwkqLworCWZvciAoRW50cnkgPSAwOworCSAgICAoIEVudHJ5IDwgTUFYX1JUQV9CSU5ESU5HUyApICYmICggcC0+UklPQmluZFRhYltFbnRyeV0gIT0gMCApOworCSAgICBFbnRyeSsrKQorCXsKKwkJaWYgKCAocC0+UklPQmluZFRhYltFbnRyeV0gPT0gSG9zdFVuaXEpIHx8CisJCSAgICAgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IFJ0YVVuaXEpICkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyoqIE1ha2UgYW4gZW1wdHkgc2xvdCB0ZW50YXRpdmUuIElmIHRoaXMgaXMgYSAxNiBwb3J0IFJUQSwgbWFrZSBib3RoCisqKiBzbG90cyB0ZW50YXRpdmUsIGFuZCB0aGUgc2Vjb25kIG9uZSBSVEFfU0VDT05EX1NMT1QgYXMgd2VsbC4KKyovCisKK3ZvaWQKK0ZpbGxTbG90KGVudHJ5LCBlbnRyeTIsIFJ0YVVuaXEsIEhvc3RQKQoraW50IGVudHJ5OworaW50IGVudHJ5MjsKK3VpbnQgUnRhVW5pcTsKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK3sKKwlpbnQJCWxpbms7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJGaWxsU2xvdCglZCwgJWQsIDB4JXguLi4pXG4iLCBlbnRyeSwgZW50cnkyLCBSdGFVbmlxKTsKKworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyA9IChSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1QgfCBTTE9UX1RFTlRBVElWRSk7CisJSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPSBOT19QT1JUOworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW0gPSBSdGFVbmlxOworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5Ib3N0VW5pcXVlTnVtID0gSG9zdFAtPlVuaXF1ZU51bTsKKwlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uSUQgPSBlbnRyeSArIDE7CisJSG9zdFAtPk1hcHBpbmdbZW50cnldLklEMiA9IDA7CisJaWYgKGVudHJ5MikgeworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLkZsYWdzID0gKFJUQV9CT09URUQgfCBSVEFfTkVXQk9PVCB8IAorCQkJCQkJCQlTTE9UX1RFTlRBVElWRSB8IFJUQTE2X1NFQ09ORF9TTE9UKTsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0ID0gTk9fUE9SVDsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5SdGFVbmlxdWVOdW0gPSBSdGFVbmlxOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLkhvc3RVbmlxdWVOdW0gPSBIb3N0UC0+VW5pcXVlTnVtOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLk5hbWVbMF0gPSAnXDAnOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLklEID0gZW50cnkyICsgMTsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5JRDIgPSBlbnRyeSArIDE7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgPSBlbnRyeTIgKyAxOworCX0KKwkvKgorCSoqIE11c3Qgc2V0IHRoZXNlIHVwLCBzbyB0aGF0IHV0aWxpdGllcyBzaG93CisJKiogdG9wb2xvZ3kgb2YgMTYgcG9ydCBSVEFzIGNvcnJlY3RseQorCSovCisJZm9yICggbGluaz0wOyBsaW5rPExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5Ub3BvbG9neVtsaW5rXS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnldLlRvcG9sb2d5W2xpbmtdLkxpbmsgPSBOT19MSU5LOworCQlpZiAoZW50cnkyKSB7CisJCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlRvcG9sb2d5W2xpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5Ub3BvbG9neVtsaW5rXS5MaW5rID0gTk9fTElOSzsKKwkJfQorCX0KK30KKworI2lmIDAKKy8qCisJRnVuY3Rpb246CVRoaXMgZnVuY3Rpb24gaXMgdG8gZGlzYWJsZSB0aGUgZGlzayBpbnRlcnJ1cHQgCisgICAgUmV0dXJucyA6ICAgTm90aGluZworKi8KK3ZvaWQKK2Rpc2FibGVfaW50ZXJydXB0KHZlY3RvcikKK2ludAl2ZWN0b3I7Cit7CisJaW50CXBzOworCWludAl2YWw7CisKKwlkaXNhYmxlKHBzKTsKKwlpZiAodmVjdG9yID4gNDApICB7CisJCXZhbCA9IDEgPDwgKHZlY3RvciAtIDQwKTsKKwkJX19vdXRiKFM4MjU5KzEsIF9faW5iKFM4MjU5KzEpIHwgdmFsKTsKKwl9CisJZWxzZSB7CisJCXZhbCA9IDEgPDwgKHZlY3RvciAtIDMyKTsKKwkJX19vdXRiKE04MjU5KzEsIF9faW5iKE04MjU5KzEpIHwgdmFsKTsKKwl9CisJcmVzdG9yZShwcyk7Cit9CisKKy8qCisJRnVuY3Rpb246CVRoaXMgZnVuY3Rpb24gaXMgdG8gZW5hYmxlIHRoZSBkaXNrIGludGVycnVwdCAKKyAgICBSZXR1cm5zIDogICBOb3RoaW5nCisqLwordm9pZAorZW5hYmxlX2ludGVycnVwdCh2ZWN0b3IpCitpbnQJdmVjdG9yOworeworCWludAlwczsKKwlpbnQJdmFsOworCisJZGlzYWJsZShwcyk7CisJaWYgKHZlY3RvciA+IDQwKSAgeworCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSA0MCk7CisJCXZhbCA9IH52YWw7CisJCV9fb3V0YihTODI1OSsxLCBfX2luYihTODI1OSsxKSAmIHZhbCk7CisJfQorCWVsc2UgeworCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSAzMik7CisJCXZhbCA9IH52YWw7CisJCV9fb3V0YihNODI1OSsxLCBfX2luYihNODI1OSsxKSAmIHZhbCk7CisJfQorCXJlc3RvcmUocHMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMwODVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwpAQCAtMCwwICsxLDEwNDEgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIHBvcnRlZCBmcm9tIHRoZSBleGlzdGluZyBTQ08gZHJpdmVyIHNvdXJjZQorKioKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9jbWQuYworKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDEKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NDkKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2NtZC5jCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2NtZF9jX3NjY3NfID0gIkAoIylyaW9jbWQuYwkxLjIiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKworCitzdGF0aWMgc3RydWN0IElkZW50aWZ5UnRhIElkUnRhOworc3RhdGljIHN0cnVjdCBLaWxsTmVpZ2hib3VyIEtpbGxVbml0OworCitpbnQKK1JJT0ZvYWRSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKQoreworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZPQUQgUlRBXG4iKTsKKworCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKworCWlmICggIUNtZEJsa1AgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRk9BRCBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBNYXBQLT5JRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdICAgPSBJRk9BRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsxXSAgID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSAgID0gSUZPQURfTUFHSUMgJiAweEZGOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzNdICAgPSAoSUZPQURfTUFHSUMgPj4gOCkgJiAweEZGOworCisJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIE1hcFAtPklELTEsIENtZEJsa1ApID09IFJJT19GQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZPQUQgUlRBOiBGYWlsZWQgdG8gcXVldWUgZm9hZCBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitpbnQKK1JJT1pvbWJpZVJ0YShzdHJ1Y3QgSG9zdCAqSG9zdFAsIHN0cnVjdCBNYXAgKk1hcFApCit7CisJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiWk9NQklFIFJUQVxuIik7CisKKwlDbWRCbGtQID0gUklPR2V0Q21kQmxrKCk7CisKKwlpZiAoICFDbWRCbGtQICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlpPTUJJRSBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBNYXBQLT5JRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdICAgPSBaT01CSUU7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMl0gICA9IFpPTUJJRV9NQUdJQyAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChaT01CSUVfTUFHSUMgPj4gOCkgJiAweEZGOworCisJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIE1hcFAtPklELTEsIENtZEJsa1ApID09IFJJT19GQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlpPTUJJRSBSVEE6IEZhaWxlZCB0byBxdWV1ZSB6b21iaWUgY29tbWFuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitSSU9Db21tYW5kUnRhKHN0cnVjdCByaW9faW5mbyAqcCwgdWludCBSdGFVbmlxdWUsCisJaW50ICgqIGZ1bmMpKHN0cnVjdCBIb3N0ICpIb3N0UCwgc3RydWN0IE1hcCAqTWFwUCkpCit7CisJdWludCBIb3N0OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIFJUQSAweCV4IGZ1bmMgMHgleFxuIiwgUnRhVW5pcXVlLCAoaW50KWZ1bmMpOworCisJaWYgKCAhUnRhVW5pcXVlICkKKwkJcmV0dXJuKDApOworCisJZm9yICggSG9zdCA9IDA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQl1aW50IFJ0YTsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCisJCWZvciAoIFJ0YSA9IDA7IFJ0YSA8IFJUQVNfUEVSX0hPU1Q7IFJ0YSsrICkgeworCQkJc3RydWN0IE1hcCAqTWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tSdGFdOworCisJCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxdWUgKSB7CisJCQkJdWludCBMaW5rOworCisJCQkJLyoKKwkJCQkqKiBub3csIGxldHMganVzdCBjaGVjayB3ZSBoYXZlIGEgcm91dGUgdG8gaXQuLi4KKwkJCQkqKiBJRiB0aGUgcm91dGluZyBzdHVmZiBpcyB3b3JraW5nLCB0aGVuIG9uZSBvZiB0aGUKKwkJCQkqKiB0b3BvbG9neSBlbnRyaWVzIGZvciB0aGlzIHVuaXQgd2lsbCBoYXZlIGEgbGVnaXQKKwkJCQkqKiByb3V0ZSAqc29tZXdoZXJlKi4gV2UgY2FyZSBub3Qgd2hlcmUgLSBpZiBpdHMgZ290CisJCQkJKiogYW55IGNvbm5lY3Rpb25zLCB3ZSBjYW4gZ2V0IHRvIGl0LgorCQkJCSovCisJCQkJZm9yICggTGluayA9IDA7IExpbmsgPCBMSU5LU19QRVJfVU5JVDsgTGluaysrICkgeworCQkJCQlpZiAoIE1hcFAtPlRvcG9sb2d5W0xpbmtdLlVuaXQgPD0gKHVjaGFyKU1BWF9SVVAgKSB7CisJCQkJCQkvKgorCQkJCQkJKiogSXRzIHdvcnRoIHRyeWluZyB0aGUgb3BlcmF0aW9uLi4uCisJCQkJCQkqLworCQkJCQkJcmV0dXJuICgqZnVuYykoIEhvc3RQLCBNYXBQICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC1FTlhJTzsKK30KKworCitpbnQKK1JJT0lkZW50aWZ5UnRhKHN0cnVjdCByaW9faW5mbyAqcCwgY2FkZHJfdCBhcmcpCit7CisJdWludCBIb3N0OworCisJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmSWRSdGEsIHNpemVvZihJZFJ0YSkgKSA9PSBDT1BZRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSSU9fSURFTlRJRllfUlRBIGNvcHkgZmFpbGVkXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlmb3IgKCBIb3N0ID0gMCA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQl1aW50IFJ0YTsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCisJCWZvciAoIFJ0YSA9IDA7IFJ0YSA8IFJUQVNfUEVSX0hPU1Q7IFJ0YSsrICkgeworCQkJc3RydWN0IE1hcCAqTWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tSdGFdOworCisJCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBJZFJ0YS5SdGFVbmlxdWUgKSB7CisJCQkJdWludCBMaW5rOworCQkJCS8qCisJCQkJKiogbm93LCBsZXRzIGp1c3QgY2hlY2sgd2UgaGF2ZSBhIHJvdXRlIHRvIGl0Li4uCisJCQkJKiogSUYgdGhlIHJvdXRpbmcgc3R1ZmYgaXMgd29ya2luZywgdGhlbiBvbmUgb2YgdGhlCisJCQkJKiogdG9wb2xvZ3kgZW50cmllcyBmb3IgdGhpcyB1bml0IHdpbGwgaGF2ZSBhIGxlZ2l0CisJCQkJKiogcm91dGUgKnNvbWV3aGVyZSouIFdlIGNhcmUgbm90IHdoZXJlIC0gaWYgaXRzIGdvdAorCQkJCSoqIGFueSBjb25uZWN0aW9ucywgd2UgY2FuIGdldCB0byBpdC4KKwkJCQkqLworCQkJCWZvciAoIExpbmsgPSAwOyBMaW5rIDwgTElOS1NfUEVSX1VOSVQ7IExpbmsrKyApIHsKKwkJCQkJaWYgKCBNYXBQLT5Ub3BvbG9neVtMaW5rXS5Vbml0IDw9ICh1Y2hhcilNQVhfUlVQICkgeworCQkJCQkJLyoKKwkJCQkJCSoqIEl0cyB3b3J0aCB0cnlpbmcgdGhlIG9wZXJhdGlvbi4uLgorCQkJCQkJKi8KKwkJCQkJCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBXG4iKTsKKworCQkJCQkJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCisJCQkJCQlpZiAoICFDbWRCbGtQICkgeworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBOiBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCQkJfQorCQkKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBNYXBQLT5JRDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCQkJCQkJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCQkJCQkJQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gSURFTlRJRlk7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVsxXSAgID0gMDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBJZFJ0YS5JRDsKKwkJCisJCQkJCQlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgTWFwUC0+SUQtMSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwgKSB7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJJREVOVElGWSBSVEE6IEZhaWxlZCB0byBxdWV1ZSBjb21tYW5kXG4iKTsKKwkJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSAKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworCitpbnQKK1JJT0tpbGxOZWlnaGJvdXIoc3RydWN0IHJpb19pbmZvICpwLCBjYWRkcl90IGFyZykKK3sKKwl1aW50IEhvc3Q7CisJdWludCBJRDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiS0lMTCBIT1NUIE5FSUdIQk9VUlxuIik7CisKKwlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZLaWxsVW5pdCwgc2l6ZW9mKEtpbGxVbml0KSApID09IENPUFlGQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJJT19LSUxMX05FSUdIQk9VUiBjb3B5IGZhaWxlZFxuIik7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCBLaWxsVW5pdC5MaW5rID4gMyApCisJCXJldHVybiAtRU5YSU87CisgCisJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCisJaWYgKCAhQ21kQmxrUCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVRk9BRDogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuCSAgID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gVUZPQUQ7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IEtpbGxVbml0Lkxpbms7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMl0gICA9IFVGT0FEX01BR0lDICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSAgID0gKFVGT0FEX01BR0lDID4+IDgpICYgMHhGRjsKKworCWZvciAoIEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJSUQgPSAwOworCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKworCQlpZiAoIEhvc3RQLT5VbmlxdWVOdW0gPT0gS2lsbFVuaXQuVW5pcXVlTnVtICkgeworCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJUQVNfUEVSX0hPU1QrS2lsbFVuaXQuTGluaywKKwkJCQkJCQlDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVGT0FEOiBGYWlsZWQgcXVldWUgY29tbWFuZFxuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZvciAoIElEPTA7IElEIDwgUlRBU19QRVJfSE9TVDsgSUQrKyApIHsKKwkJCWlmICggSG9zdFAtPk1hcHBpbmdbSURdLlJ0YVVuaXF1ZU51bSA9PSBLaWxsVW5pdC5VbmlxdWVOdW0gKSB7CisJCQkJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IElEKzE7CisJCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIElELCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVRk9BRDogRmFpbGVkIHF1ZXVlIGNvbW1hbmRcbiIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJUklPRnJlZUNtZEJsayggQ21kQmxrUCApOworCXJldHVybiAtRU5YSU87Cit9CisKK2ludAorUklPU3VzcGVuZEJvb3RSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBpbnQgSUQsIGludCBMaW5rKQoreworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlNVU1BFTkQgQk9PVCBPTiBSVEEgSUQgJWQsIGxpbmsgJWNcbiIsIElELCAnQScgKyBMaW5rKTsKKworCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKworCWlmICggIUNtZEJsa1AgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiU1VTUEVORCBCT09UIE9OIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IElEOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IElXQUlUOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSBMaW5rOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBJV0FJVF9NQUdJQyAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChJV0FJVF9NQUdJQyA+PiA4KSAmIDB4RkY7CisKKwlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgSUQgLSAxLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJTVVNQRU5EIEJPT1QgT04gUlRBOiBGYWlsZWQgdG8gcXVldWUgaXdhaXQgY29tbWFuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitSSU9Gb2FkV2FrZXVwKHN0cnVjdCByaW9faW5mbyAqcCkKK3sKKwlpbnQgcG9ydDsKKwlyZWdpc3RlciBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoIHBvcnQ9MDsgcG9ydDxSSU9fUE9SVFM7IHBvcnQrKykgeworCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJUG9ydFAtPkNvbmZpZyA9IDA7CisJCVBvcnRQLT5TdGF0ZSA9IDA7CisJCVBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKwkJUG9ydFAtPlBvcnRTdGF0ZSA9IDA7CisJCVBvcnRQLT5GbHVzaENtZEJvZGdlID0gMDsKKwkJUG9ydFAtPk1vZGVtTGluZXMgPSAwOworCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IDA7CisJCVBvcnRQLT5Db29rTW9kZSA9IDA7CisJCVBvcnRQLT5QYXJhbVNlbSA9IDA7CisJCVBvcnRQLT5NYXBwZWQgPSAwOworCQlQb3J0UC0+V2ZsdXNoRmxhZyA9IDA7CisJCVBvcnRQLT5NYWdpY0ZsYWdzID0gMDsKKwkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJUG9ydFAtPlR4QnVmZmVySW4gPSAwOworCQlQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKgorKiogSW5jb21pbmcgY29tbWFuZCBvbiB0aGUgQ09NTUFORF9SVVAgdG8gYmUgcHJvY2Vzc2VkLgorKi8KK3N0YXRpYyBpbnQKK1JJT0NvbW1hbmRSdXAoc3RydWN0IHJpb19pbmZvICpwLCB1aW50IFJ1cCwgc3RydWN0IEhvc3QgKkhvc3RQLCBQS1QgKlBhY2tldFApCit7CisJc3RydWN0IFBrdENtZCAqUGt0Q21kUCA9IChzdHJ1Y3QgUGt0Q21kICopUGFja2V0UC0+ZGF0YTsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJc3RydWN0IFVuaXhSdXAgKlVuaXhSdXBQOworCXVzaG9ydCBTeXNQb3J0OworCXVzaG9ydCBSZXBvcnRlZE1vZGVtU3RhdHVzOworCXVzaG9ydCBydXA7CisJdXNob3J0IHN1YkNvbW1hbmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdCggSG9zdCApOworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tQYWNrZXRQKCBQYWNrZXRQICk7CisjZW5kaWYKKworCS8qCisJKiogMTYgcG9ydCBSVEEgbm90ZToKKwkqKiBDb21tYW5kIHJ1cCBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBSVEEgd2lsbCBoYXZlIHBrdC0+ZGF0YVsxXSAod2hpY2gKKwkqKiB0cmFuc2xhdGVzIHRvIFBrdENtZFAtPlBoYk51bSkgc2V0IHRvIHRoZSBob3N0IHBvcnQgbnVtYmVyIGZvciB0aGUKKwkqKiBwYXJ0aWN1bGFyIHVuaXQuIFRvIGFjY2VzcyB0aGUgY29ycmVjdCBCYXNlU3lzUG9ydCBmb3IgYSAxNiBwb3J0IFJUQSwKKwkqKiB3ZSBjYW4gdXNlIFBoYk51bSB0byBnZXQgdGhlIHJ1cCBudW1iZXIgZm9yIHRoZSBhcHByb3ByaWF0ZSA4IHBvcnQKKwkqKiBibG9jayAoZm9yIHRoZSBmaXJzdCBibG9jaywgdGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gJ1J1cCcpLgorCSovCisJcnVwID0gUkJZVEUoUGt0Q21kUC0+UGhiTnVtKSAvICh1c2hvcnQpUE9SVFNfUEVSX1JUQTsKKwlVbml4UnVwUCA9ICZIb3N0UC0+VW5peFJ1cHNbcnVwXTsKKwlTeXNQb3J0ID0gVW5peFJ1cFAtPkJhc2VTeXNQb3J0ICsgCisJCQkoUkJZVEUoUGt0Q21kUC0+UGhiTnVtKSAlICh1c2hvcnQpUE9SVFNfUEVSX1JUQSk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIG9uIHJ1cCAlZCwgcG9ydCAlZFxuIiwgcnVwLCBTeXNQb3J0KTsKKworI2lmZGVmIENIRUNLCisJQ2hlY2tSdXAoIHJ1cCApOworCUNoZWNrVW5peFJ1cFAoIFVuaXhSdXBQICk7CisjZW5kaWYKKwlpZiAoIFVuaXhSdXBQLT5CYXNlU3lzUG9ydCA9PSBOT19QT1JUICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk9CU0NVUkUgRVJST1IhXG4iKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJEaWFnbm9zdGljcyBmb2xsb3cuIFBsZWFzZSBXUklURSBUSEVTRSBET1dOIGFuZCByZXBvcnQgdGhlbSB0byBTcGVjaWFsaXggVGVjaG5pY2FsIFN1cHBvcnRcbiIpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IEhvc3QgbnVtYmVyICVkLCBuYW1lIGBgJXMnJ1xuIiwgCisJCQkgICAgIEhvc3RQLXAtPlJJT0hvc3RzLCBIb3N0UC0+TmFtZSApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IFJ1cCBudW1iZXIgIDB4JXhcbiIsIHJ1cCk7CisKKwkJaWYgKCBSdXAgPj0gKHVzaG9ydClNQVhfUlVQICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBUaGlzIGlzIHRoZSBSVVAgZm9yIFJUQSBgYCVzJydcbiIsCisJCQkJICAgICBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWUpOworCQl9IGVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBsaW5rIGBgJWMnJyBvZiBob3N0IGBgJXMnJ1xuIiwgCisJCQkJICAgICAoJ0EnICsgUnVwIC0gTUFYX1JVUCksIEhvc3RQLT5OYW1lKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogRGVzdGluYXRpb24gMHgleDoweCV4XG4iLAorCQkJICAgICBQYWNrZXRQLT5kZXN0X3VuaXQsIFBhY2tldFAtPmRlc3RfcG9ydCApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogU291cmNlCSAgMHgleDoweCV4XG4iLAorCQkJICAgICBQYWNrZXRQLT5zcmNfdW5pdCwgUGFja2V0UC0+c3JjX3BvcnQgKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IExlbmd0aAkgIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+bGVuLFBhY2tldFAtPmxlbiApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogQ29udHJvbAkgMHgleCAoJWQpXG4iLCBQYWNrZXRQLT5jb250cm9sLCBQYWNrZXRQLT5jb250cm9sKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IENoZWNrCSAgIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+Y3N1bSwgUGFja2V0UC0+Y3N1bSApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTU1BTkQgaW5mb3JtYXRpb246IEhvc3QgUG9ydCBOdW1iZXIgMHgleCwgIgorCQkJCQkiQ29tbWFuZCBDb2RlIDB4JXhcbiIsIFBrdENtZFAtPlBoYk51bSwgUGt0Q21kUC0+Q29tbWFuZCApOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKyNpZmRlZiBDSEVDSworCUNoZWNrU3lzUG9ydCggU3lzUG9ydCApOworI2VuZGlmCisJUG9ydFAgPSBwLT5SSU9Qb3J0cFsgU3lzUG9ydCBdOworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlzd2l0Y2goIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICkgeworCQljYXNlIEJSRUFLX1JFQ0VJVkVEOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSZWNlaXZlZCBhIGJyZWFrIVxuIik7CisJCQkvKiBJZiB0aGUgY3VycmVudCBsaW5lIGRpc2MuIGlzIG5vdCBtdWx0aS10aHJlYWRpbmcgYW5kCisJICAgCQkJdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGlzIG5vdCB0aGUgZGVmYXVsdCwgcmVzZXQgcnVwX2ludHIKKwkgICAJCQlhbmQgcmV0dXJuIEZBTFNFIHRvIGVuc3VyZSB0aGF0IHRoZSBjb21tYW5kIHBhY2tldCBpcworCSAgIAkJCW5vdCBmcmVlZC4gKi8KKwkJCS8qIENhbGwgdG1nciBIQU5HVVAgSEVSRSAqLworCQkJLyogRml4IHRoaXMgbGF0ZXIgd2hlbiBldmVyeSB0aGluZyB3b3JrcyAhISEhIFJBTVJBSiAqLworCQkJZ3NfZ290X2JyZWFrICgmUG9ydFAtPmdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ09NUExFVEU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgY29tcGxldGUgb24gcGhiICVkIGhvc3QgJWRcbiIsCisJCQkgICAgIFJCWVRFKFBrdENtZFAtPlBoYk51bSksIEhvc3RQLXAtPlJJT0hvc3RzKTsKKwkJCXN1YkNvbW1hbmQgPSAxOworCQkJc3dpdGNoIChSQllURShQa3RDbWRQLT5TdWJDb21tYW5kKSkgeworCQkJCWNhc2UgTUVNRFVNUCA6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1lbW9yeSBkdW1wIGNtZCAoMHgleCkgZnJvbSBhZGRyIDB4JXhcbiIsCisJCQkJICAgICBSQllURShQa3RDbWRQLT5TdWJDb21tYW5kKSwgUldPUkQoUGt0Q21kUC0+U3ViQWRkcikpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFQURfUkVHSVNURVIgOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSZWFkIHJlZ2lzdGVyICgweCV4KVxuIiwgUldPUkQoUGt0Q21kUC0+U3ViQWRkcikpOworCQkJCQlwLT5DZFJlZ2lzdGVyID0gKFJCWVRFKFBrdENtZFAtPk1vZGVtU3RhdHVzKSAmIE1TVlIxX0hPU1QpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJc3ViQ29tbWFuZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3ViQ29tbWFuZCkKKwkJCQlicmVhazsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTmV3IHN0YXR1cyBpcyAweCV4IHdhcyAweCV4XG4iLAorCQkJCSAgICAgUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cyksUG9ydFAtPlBvcnRTdGF0ZSk7CisJCQlpZiAoUG9ydFAtPlBvcnRTdGF0ZSAhPSBSQllURShQa3RDbWRQLT5Qb3J0U3RhdHVzKSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTWFyayBzdGF0dXMgJiB3YWtldXBcbiIpOworCQkJCVBvcnRQLT5Qb3J0U3RhdGUgPSBSQllURShQa3RDbWRQLT5Qb3J0U3RhdHVzKTsKKwkJCQkvKiBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlIC4uLgorCQkJCXdha2V1cCggJlBvcnRQLT5Qb3J0U3RhdGUgKTsKKwkJCQkqLworCQl9IGVsc2UgCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vIGNoYW5nZVxuIik7CisKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgTU9ERU1fU1RBVFVTOgorCQkJLyoKKwkJCSoqIEtub2NrIG91dCB0aGUgdGJ1c3kgYW5kIHRzdG9wIGJpdHMsIGFzIHRoZXNlIGFyZSBub3QgcmVsZXZhbnQKKwkJCSoqIHRvIHRoZSBjaGVjayBmb3IgbW9kZW0gc3RhdHVzIGNoYW5nZSAodGhleSdyZSBqdXN0IHRoZXJlIGJlY2F1c2UKKwkJCSoqIGl0J3MgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCB0aGVtISkuCisJCQkqLworCQkJUmVwb3J0ZWRNb2RlbVN0YXR1cyA9IFJCWVRFKFBrdENtZFAtPk1vZGVtU3RhdHVzKTsKKwkJCWlmICgoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9IT1NUKSA9PQorCQkJCQkoUmVwb3J0ZWRNb2RlbVN0YXR1cyAmIE1TVlIxX0hPU1QpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNb2RlbSBzdGF0dXMgdW5jaGFuZ2VkIDB4JXhcbiIsIFBvcnRQLT5Nb2RlbVN0YXRlKTsKKwkJCQkvKgorCQkJCSoqIFVwZGF0ZSBNb2RlbVN0YXRlIGp1c3QgaW4gY2FzZSB0YnVzeSBvciB0c3RvcCBzdGF0ZXMgaGF2ZQorCQkJCSoqIGNoYW5nZWQuCisJCQkJKi8KKwkJCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IFJlcG9ydGVkTW9kZW1TdGF0dXM7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1vZGVtIHN0YXR1cyBjaGFuZ2UgZnJvbSAweCV4IHRvIDB4JXhcbiIsCisJCQkJICAgICBQb3J0UC0+TW9kZW1TdGF0ZSwgUmVwb3J0ZWRNb2RlbVN0YXR1cyk7CisJCQkJUG9ydFAtPk1vZGVtU3RhdGUgPSBSZXBvcnRlZE1vZGVtU3RhdHVzOworI2lmZGVmIE1PREVNX1NVUFBPUlQKKwkJCQlpZiAoIFBvcnRQLT5NYXBwZWQgKSB7CisJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorCQkJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCQkqKioJCQkJCQkJCQkJCQkJICAgKioqCisJCQkJKioqCQkgIE0gTyBEIEUgTSAgIFMgVCBBIFQgRSAgIEMgSCBBIE4gRyBFCQkgICoqKgorCQkJCSoqKgkJCQkJCQkJCQkJCQkgICAqKioKKwkJCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJCS8qCisJCQkJKiogSWYgdGhlIGRldmljZSBpcyBhIG1vZGVtLCB0aGVuIGNoZWNrIHRoZSBtb2RlbQorCQkJCSoqIGNhcnJpZXIuCisJCQkJKi8KKwkJCQlpZiAoUG9ydFAtPmdzLnR0eSA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQlpZiAoUG9ydFAtPmdzLnR0eS0+dGVybWlvcyA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCSAgCisJCQkJaWYgKCEoUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgJiYKKwkJCQkoKFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU58UklPX1dPUEVOKSkpKSB7CisKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJJcyB0aGVyZSBhIENhcnJpZXI/XG4iKTsKKwkJCS8qCisJCQkqKiBJcyB0aGVyZSBhIGNhcnJpZXI/CisJCQkqLworCQkJCQlpZiAoIFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QgKSB7CisJCQkvKgorCQkJKiogSGFzIGNhcnJpZXIganVzdCBhcHBlYXJlZD8KKwkJCSovCisJCQkJCQlpZiAoIShQb3J0UC0+U3RhdGUgJiBSSU9fQ0FSUl9PTikpIHsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNhcnJpZXIganVzdCBjYW1lIHVwLlxuIik7CisJCQkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19DQVJSX09OOworCQkJCS8qCisJCQkJKiogd2FrZXVwIGFueW9uZSBpbiBXT1BFTgorCQkJCSovCisJCQkJCQkJaWYgKFBvcnRQLT5TdGF0ZSAmIChQT1JUX0lTT1BFTiB8IFJJT19XT1BFTikgKQorCQkJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZQb3J0UC0+Z3Mub3Blbl93YWl0KTsKKyNpZmRlZiBTVEFUUworCQkJCVBvcnRQLT5TdGF0Lk1vZGVtT25DbnQrKzsKKyNlbmRpZgorCQkJfQorCQkJCQl9IGVsc2UgeworCQkJLyoKKwkJCSoqIEhhcyBjYXJyaWVyIGp1c3QgZHJvcHBlZD8KKwkJCSovCisJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgUklPX0NBUlJfT04pIHsKKwkJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgKFBPUlRfSVNPUEVOfFJJT19XT1BFTnxSSU9fTU9QRU4pKQorCQkJCQkJCQl0dHlfaGFuZ3VwIChQb3J0UC0+Z3MudHR5KTsKKwkJCQkJCQlQb3J0UC0+U3RhdGUgJj0gflJJT19DQVJSX09OOworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ2FycmlyZXIganVzdCB3ZW50IGRvd25cbiIpOworI2lmZGVmIFNUQVRTCisJCQkJUG9ydFAtPlN0YXQuTW9kZW1PZmZDbnQrKzsKKyNlbmRpZgorCQkJfQorCQkJfQorCQl9CisJCX0KKyNlbmRpZgorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiVW5rbm93biBjb21tYW5kICVkIG9uIENNRF9SVVAgb2YgaG9zdCAlZFxuIiwKKwkJCSAgICAgUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCksSG9zdFAtcC0+UklPSG9zdHMpOworCQkJYnJlYWs7CisJfQorCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJZnVuY19leGl0ICgpOworCisJcmV0dXJuIFRSVUU7Cit9CisvKgorKiogVGhlIGNvbW1hbmQgbWVjaGFuaXNtOgorKioJRWFjaCBydXAgaGFzIGEgY2hhaW4gb2YgY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIGl0LgorKioJVGhpcyBjaGFpbiBpcyBtYWludGFpbmVkIGJ5IHJvdXRpbmVzIGluIHRoaXMgZmlsZS4KKyoqCVBlcmlvZGljYWxseSB3ZSBhcmUgY2FsbGVkIGFuZCB3ZSBydW4gYSBxdWljayBjaGVjayBvZiBhbGwgdGhlCisqKglhY3RpdmUgY2hhaW5zIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsCisqKglhbmQgaWYgdGhlIHJ1cCBpcyByZWFkeSB0byBhY2NlcHQgaXQuCisqKgorKi8KKworLyoKKyoqIEFsbG9jYXRlIGFuIGVtcHR5IGNvbW1hbmQgYmxvY2suCisqLworc3RydWN0IENtZEJsayAqCitSSU9HZXRDbWRCbGsodm9pZCkKK3sKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCisJQ21kQmxrUCA9IChzdHJ1Y3QgQ21kQmxrICopc3lzYnJrKHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CisJaWYgKENtZEJsa1ApCisJCWJ6ZXJvKENtZEJsa1AsIHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CisKKwlyZXR1cm4gQ21kQmxrUDsKK30KKworLyoKKyoqIFJldHVybiBhIGJsb2NrIHRvIHRoZSBoZWFkIG9mIHRoZSBmcmVlIGxpc3QuCisqLwordm9pZAorUklPRnJlZUNtZEJsayhzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQoreworCXN5c2ZyZWUoKHZvaWQgKilDbWRCbGtQLCBzaXplb2Yoc3RydWN0IENtZEJsaykpOworfQorCisvKgorKiogYXR0YWNoIGEgY29tbWFuZCBibG9jayB0byB0aGUgbGlzdCBvZiBjb21tYW5kcyB0byBiZSBwZXJmb3JtZWQgZm9yCisqKiBhIGdpdmVuIHJ1cC4KKyovCitpbnQKK1JJT1F1ZXVlQ21kQmxrKHN0cnVjdCBIb3N0ICpIb3N0UCwgdWludCBSdXAsIHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCit7CisJc3RydWN0IENtZEJsayAqKkJhc2U7CisJc3RydWN0IFVuaXhSdXAgKlVuaXhSdXBQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tSdXAoIFJ1cCApOworCUNoZWNrQ21kQmxrUCggQ21kQmxrUCApOworI2VuZGlmCisJaWYgKCBSdXAgPj0gKHVzaG9ydCkoTUFYX1JVUCtMSU5LU19QRVJfVU5JVCkgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSWxsZWdhbCBydXAgbnVtYmVyICVkIGluIFJJT1F1ZXVlQ21kQmxrXG4iLFJ1cCk7CisJCVJJT0ZyZWVDbWRCbGsoIENtZEJsa1AgKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCVVuaXhSdXBQID0gJkhvc3RQLT5Vbml4UnVwc1tSdXBdOworCisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCisJLyoKKwkqKiBJZiB0aGUgUlVQIGlzIGN1cnJlbnRseSBpbmFjdGl2ZSwgdGhlbiBwdXQgdGhlIHJlcXVlc3QKKwkqKiBzdHJhaWdodCBvbiB0aGUgUlVQLi4uLgorCSovCisJaWYgKCAoVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCA9PSBOVUxMKSAmJiAoVW5peFJ1cFAtPkNtZFBlbmRpbmdQID09IE5VTEwpICYmIAorCSAgICAgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wpID09IFRYX1JVUF9JTkFDVElWRSApICYmCisJCShDbWRCbGtQLT5QcmVGdW5jUCA/ICgqQ21kQmxrUC0+UHJlRnVuY1ApKENtZEJsa1AtPlByZUFyZyxDbWRCbGtQKQorCQkJCQkJCTpUUlVFKSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJVUCBpbmFjdGl2ZS1wbGFjaW5nIGNvbW1hbmQgc3RyYWlnaHQgb24uIENtZCBieXRlIGlzIDB4JXhcbiIsCisJCQkJCSAgICAgQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0pOworCisJCS8qCisJCSoqIFdoYW1teSEgYmxhdCB0aGF0IHBhY2shCisJCSovCisJCUhvc3RQLT5Db3B5KCAoY2FkZHJfdCkmQ21kQmxrUC0+UGFja2V0LCAKKwkJCVJJT19QVFIoSG9zdFAtPkNhZGRyLCBVbml4UnVwUC0+UnVwUC0+dHhwa3QgKSwgc2l6ZW9mKFBLVCkgKTsKKworCQkvKgorCQkqKiBwbGFjZSBjb21tYW5kIHBhY2tldCBvbiB0aGUgcGVuZGluZyBwb3NpdGlvbi4KKwkJKi8KKwkJVW5peFJ1cFAtPkNtZFBlbmRpbmdQID0gQ21kQmxrUDsKKworCQkvKgorCQkqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKwkJKi8KKwkJV1dPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCAsIFRYX1BBQ0tFVF9SRUFEWSk7CisKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIFJJT19TVUNDRVNTOworCX0KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJVUCBhY3RpdmUgLSBlbi1xdWVpbmdcbiIpOworCisJaWYgKCBVbml4UnVwUC0+Q21kc1dhaXRpbmdQICE9IE5VTEwpCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUnVwIGFjdGl2ZSAtIGNvbW1hbmQgd2FpdGluZ1xuIik7CisJaWYgKCBVbml4UnVwUC0+Q21kUGVuZGluZ1AgIT0gTlVMTCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUnVwIGFjdGl2ZSAtIGNvbW1hbmQgcGVuZGluZ1xuIik7CisJaWYgKCBSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSAhPSBUWF9SVVBfSU5BQ1RJVkUgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHJ1cCBub3QgcmVhZHlcbiIpOworCisJQmFzZSA9ICZVbml4UnVwUC0+Q21kc1dhaXRpbmdQOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGaXJzdCB0cnkgdG8gcXVldWUgY21kYmxrIDB4JXggYXQgMHgleFxuIiwgKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisKKwl3aGlsZSAoICpCYXNlICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgY21kYmxrIDB4JXggaGVyZVxuIiwgKGludCkoKkJhc2UpKTsKKwkJQmFzZSA9ICYoKCpCYXNlKS0+TmV4dFApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vdyB0cnkgdG8gcXVldWUgY21kIGNtZGJsayAweCV4IGF0IDB4JXhcbiIsCisJCQkJCSAgICAgKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJXaWxsIHF1ZXVlIGNtZGJsayAweCV4IGF0IDB4JXhcbiIsKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisKKwkqQmFzZSA9IENtZEJsa1A7CisKKwlDbWRCbGtQLT5OZXh0UCA9IE5VTEw7CisKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKworCXJldHVybiBSSU9fU1VDQ0VTUzsKK30KKworLyoKKyoqIEhlcmUgd2UgZ28gLSBpZiB0aGVyZSBpcyBhbiBlbXB0eSBydXAsIGZpbGwgaXQhCisqKiBtdXN0IGJlIGNhbGxlZCBhdCBzcGxyaW8oKSBvciBoaWdoZXIuCisqLwordm9pZAorUklPUG9sbEhvc3RDb21tYW5kcyhzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCXJlZ2lzdGVyIHN0cnVjdCBVbml4UnVwICpVbml4UnVwUDsKKwlzdHJ1Y3QgUEtUICpQYWNrZXRQOworCXVzaG9ydCBSdXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJUnVwID0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVDsKKworCWRvIHsJLyogZG8gdGhpcyBsb29wIGZvciBlYWNoIFJVUCAqLworCQkvKgorCQkqKiBsb2NhdGUgdGhlIHJ1cCB3ZSBhcmUgcHJvY2Vzc2luZyAmIGxvY2sgaXQKKwkJKi8KKwkJVW5peFJ1cFAgPSAmSG9zdFAtPlVuaXhSdXBzWy0tUnVwXTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKworCQkvKgorCQkqKiBGaXJzdCBjaGVjayBmb3IgaW5jb21pbmcgY29tbWFuZHM6CisJCSovCisJCWlmICggUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnJ4Y29udHJvbCkgIT0gUlhfUlVQX0lOQUNUSVZFICkgeworCQkJaW50IEZyZWVNZTsKKworCQkJUGFja2V0UCA9KFBLVCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeHBrdCkpOworCisJCQlTaG93UGFja2V0KCBEQkdfQ01ELCBQYWNrZXRQICk7CisKKwkJCXN3aXRjaCAoIFJCWVRFKFBhY2tldFAtPmRlc3RfcG9ydCkgKSB7CisJCQkJY2FzZSBCT09UX1JVUDoKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJJbmNvbWluZyBCb290ICVzIHBhY2tldCAnJXgnXG4iLCAKKwkJCQkJCVJCWVRFKFBhY2tldFAtPmxlbikgJiAweDgwID8gIkNvbW1hbmQiOiJEYXRhIiwgCisJCQkJCQkJICAgICBSQllURShQYWNrZXRQLT5kYXRhWzBdKSk7IAorCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJRnJlZU1lPSBSSU9Cb290UnVwKHAsIFJ1cCxIb3N0UCxQYWNrZXRQKTsKKwkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQ09NTUFORF9SVVA6CisJCQkJCS8qCisJCQkJCSoqIEZyZWUgdGhlIFJVUCBsb2NrIGFzIGxvc3Mgb2YgY2FycmllciBjYXVzZXMgYQorCQkJCQkqKiB0dHlmbHVzaCB3aGljaCB3aWxsIChldmVudHVhbGx5KSBjYWxsIGFub3RoZXIKKwkJCQkJKiogcm91dGluZSB0aGF0IHVzZXMgdGhlIFJVUCBsb2NrLgorCQkJCQkqLworCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJRnJlZU1lPSBSSU9Db21tYW5kUnVwKHAsIFJ1cCxIb3N0UCxQYWNrZXRQKTsKKwkJCQkJaWYgKFBhY2tldFAtPmRhdGFbNV0gPT0gTUVNRFVNUCkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNZW1kdW1wIGZyb20gMHgleCBjb21wbGV0ZVxuIiwKKwkJCQkJCQkJICAgICAqKHVzaG9ydCAqKSAmKFBhY2tldFAtPmRhdGFbNl0pKTsKKwkJCQkJCUhvc3RQLT5Db3B5KCAoY2FkZHJfdCkmKFBhY2tldFAtPmRhdGFbOF0pLCAKKwkJCQkJCQkJKGNhZGRyX3QpcC0+UklPTWVtRHVtcCwgMzIgKTsKKwkJCQkJfQorCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBST1VURV9SVVA6CisJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJRnJlZU1lID0gUklPUm91dGVSdXAocCwgUnVwLCBIb3N0UCwgUGFja2V0UCApOworCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVua25vd24gUlVQICVkXG4iLCBSQllURShQYWNrZXRQLT5kZXN0X3BvcnQpKTsKKwkJCQkJRnJlZU1lID0gMTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICggRnJlZU1lICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRnJlZSBwcm9jZXNzZWQgaW5jb21pbmcgY29tbWFuZCBwYWNrZXRcbiIpOworCQkJCXB1dF9mcmVlX2VuZChIb3N0UCxQYWNrZXRQKTsKKworCQkJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeGNvbnRyb2wgLCBSWF9SVVBfSU5BQ1RJVkUpOworCisJCQkJaWYgKCBSV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlKT09UEhCX0hBTkRTSEFLRV9TRVQgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSGFuZHNoYWtlIHJ1cCAlZFxuIixSdXApOworCQkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlLAorCQkJCQkJUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJKiogSUYgYSBjb21tYW5kIHdhcyBydW5uaW5nIG9uIHRoZSBwb3J0LCAKKwkJKiogYW5kIGl0IGhhcyBjb21wbGV0ZWQsIHRoZW4gdGlkeSBpdCB1cC4KKwkJKi8KKwkJaWYgKCAoQ21kQmxrUCA9IFVuaXhSdXBQLT5DbWRQZW5kaW5nUCkgJiYgLyogQVNTSUdOISAqLworCQkgICAgIChSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSA9PSBUWF9SVVBfSU5BQ1RJVkUpKSB7CisJCQkvKgorCQkJKiogd2UgYXJlIGlkbGUuCisJCQkqKiB0aGVyZSBpcyBhIGNvbW1hbmQgaW4gcGVuZGluZy4KKwkJCSoqIFRoZXJlZm9yZSwgdGhpcyBjb21tYW5kIGhhcyBmaW5pc2hlZC4KKwkJCSoqIFNvLCB3YWtldXAgd2hvZXZlciBpcyB3YWl0aW5nIGZvciBpdCAoYW5kIHRlbGwgdGhlbQorCQkJKiogd2hhdCBoYXBwZW5lZCkuCisJCQkqLworCQkJaWYgKCBDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID09IEJPT1RfUlVQICkKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZyZWUgQm9vdCAlcyBDb21tYW5kIEJsb2NrICcleCdcbiIsIAorCQkJCQkJQ21kQmxrUC0+UGFja2V0LmxlbiAmIDB4ODAgPyAiQ29tbWFuZCI6IkRhdGEiLCAKKwkJCQkJCQkgICAgIENtZEJsa1AtPlBhY2tldC5kYXRhWzBdKTsKKworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIDB4JXggY29tcGxldGVkXG4iLChpbnQpQ21kQmxrUCk7CisKKwkJCS8qCisJCQkqKiBDbGVhciB0aGUgUnVwIGxvY2sgdG8gcHJldmVudCBtdXR1YWwgZXhjbHVzaW9uLgorCQkJKi8KKwkJCWlmICggQ21kQmxrUC0+UG9zdEZ1bmNQICkgeworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJCSgqQ21kQmxrUC0+UG9zdEZ1bmNQKSAoQ21kQmxrUC0+UG9zdEFyZyxDbWRCbGtQKTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQl9CisKKwkJCS8qCisJCQkqKiAuLi4uY2xlYXIgdGhlIHBlbmRpbmcgZmxhZy4uLi4KKwkJCSovCisJCQlVbml4UnVwUC0+Q21kUGVuZGluZ1AgPSBOVUxMOworCisJCQkvKgorCQkJKiogLi4uLmFuZCByZXR1cm4gdGhlIGNvbW1hbmQgYmxvY2sgdG8gdGhlIGZyZWVsaXN0LgorCQkJKi8KKwkJCVJJT0ZyZWVDbWRCbGsoIENtZEJsa1AgKTsKKwkJfQorCisJCS8qCisJCSoqIElmIHRoZXJlIGlzIGEgY29tbWFuZCBmb3IgdGhpcyBydXAsIGFuZCB0aGUgcnVwCisJCSoqIGlzIGlkbGUsIHRoZW4gcHJvY2VzcyB0aGUgY29tbWFuZAorCQkqLworCQlpZiAoIChDbWRCbGtQID0gVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCkgJiYgLyogQVNTSUdOISAqLworCQkJKFVuaXhSdXBQLT5DbWRQZW5kaW5nUCA9PSBOVUxMKSAmJgorCQkgICAgIChSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSA9PSBUWF9SVVBfSU5BQ1RJVkUpKSB7CisJCQkvKgorCQkJKiogaWYgdGhlIHByZS1mdW5jdGlvbiBpcyBub24temVybywgY2FsbCBpdC4KKwkJCSoqIElmIGl0IHJldHVybnMgUklPX0ZBSUwgdGhlbiBkb24ndAorCQkJKiogc2VuZCB0aGlzIGNvbW1hbmQgeWV0IQorCQkJKi8KKyNpZmRlZiBDSEVDSworCQkJQ2hlY2tDbWRCbGtQIChDbWRCbGtQKTsKKyNlbmRpZgorCQkJaWYgKCAhKENtZEJsa1AtPlByZUZ1bmNQID8KKwkJCQkoKkNtZEJsa1AtPlByZUZ1bmNQKShDbWRCbGtQLT5QcmVBcmcsIENtZEJsa1ApIDogVFJVRSkpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vdCByZWFkeSB0byBzdGFydCBjb21tYW5kIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiU3RhcnQgbmV3IGNvbW1hbmQgMHgleCBDbWQgYnl0ZSBpcyAweCV4XG4iLAorCQkJCQkJCSAgICAgKGludClDbWRCbGtQLCBDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSk7CisJCQkJLyoKKwkJCQkqKiBXaGFtbXkhIGJsYXQgdGhhdCBwYWNrIQorCQkJCSovCisjaWZkZWYgQ0hFQ0sKKwkJCQlDaGVja1BhY2tldFAgKChQS1QgKilSSU9fUFRSKEhvc3RQLT5DYWRkciwgVW5peFJ1cFAtPlJ1cFAtPnR4cGt0KSk7CisjZW5kaWYKKwkJCQlIb3N0UC0+Q29weSggKGNhZGRyX3QpJkNtZEJsa1AtPlBhY2tldCwgCisJCQkJCVJJT19QVFIoSG9zdFAtPkNhZGRyLCBVbml4UnVwUC0+UnVwUC0+dHhwa3QpLCBzaXplb2YoUEtUKSk7CisKKwkJCQkvKgorCQkJCSoqIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBydXAgY29tbWFuZCBxdWV1ZS4uLgorCQkJCSovCisJCQkJVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCA9IENtZEJsa1AtPk5leHRQOworCisJCQkJLyoKKwkJCQkqKiAuLi5hbmQgcGxhY2UgaXQgb24gdGhlIHBlbmRpbmcgcG9zaXRpb24uCisJCQkJKi8KKwkJCQlVbml4UnVwUC0+Q21kUGVuZGluZ1AgPSBDbWRCbGtQOworCisJCQkJLyoKKwkJCQkqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKwkJCQkqLworCQkJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wsVFhfUEFDS0VUX1JFQURZKTsKKworCQkJCS8qCisJCQkJKiogdGhlIGNvbW1hbmQgYmxvY2sgd2lsbCBiZSBmcmVlZAorCQkJCSoqIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorCQkJCSovCisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwl9IHdoaWxlICggUnVwICk7Cit9CisKK2ludAorUklPV0ZsdXNoTWFyayhpbnQgaVBvcnRQLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQoreworCXN0cnVjdCBQb3J0ICoJUG9ydFAgPSAoc3RydWN0IFBvcnQgKilpUG9ydFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisjZW5kaWYKKwlQb3J0UC0+V2ZsdXNoRmxhZysrOworCVBvcnRQLT5NYWdpY0ZsYWdzIHw9IE1BR0lDX0ZMVVNIOworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiBSSU9VblVzZSggaVBvcnRQLCBDbWRCbGtQICk7Cit9CisKK2ludAorUklPUkZsdXNoRW5hYmxlKGludCBpUG9ydFAsIHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCit7CisJc3RydWN0IFBvcnQgKglQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKWlQb3J0UDsKKwlQS1QgKlBhY2tldFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCXdoaWxlICggY2FuX3JlbW92ZV9yZWNlaXZlKCZQYWNrZXRQLCBQb3J0UCkgKSB7CisJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJU2hvd1BhY2tldChEQkdfUFJPQywgUGFja2V0UCApOworCQlwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCX0KKworCWlmICggUldPUkQoUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSk9PVBIQl9IQU5EU0hBS0VfU0VUICkgeworCQkvKgorCQkqKiBNQUdJQyEgKEJhc2ljYWxseSwgaGFuZHNoYWtlIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQKKwkJKiogdGhlIFJUQXMgdXBzdHJlYW0gY2FuIGJlIHJlLWVuYWJsZWQuKQorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlV0aWw6IFNldCBSWCBoYW5kc2hha2UgYml0XG4iKTsKKwkJV1dPUkQoUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSwgUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCk7CisJfQorCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiBSSU9VblVzZSggaVBvcnRQLCBDbWRCbGtQICk7Cit9CisKK2ludAorUklPVW5Vc2UoaW50IGlQb3J0UCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK3sKKwlzdHJ1Y3QgUG9ydCAqCVBvcnRQID0gKHN0cnVjdCBQb3J0ICopaVBvcnRQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisjZW5kaWYKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkRlY3JlbWVudCBpbiB1c2UgY291bnQgZm9yIHBvcnRcbiIpOworCisJaWYgKFBvcnRQLT5JblVzZSkgeworCQlpZiAoIC0tUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSApIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkqKiBXaGlsZSBQb3J0UC0+SW5Vc2UgaXMgc2V0IChpLmUuIGEgcHJlZW1wdGl2ZSBjb21tYW5kIGhhcyBiZWVuIHNlbnQgdG8KKwkqKiB0aGUgUlRBIGFuZCBpcyBhd2FpdGluZyBjb21wbGV0aW9uKSwgYW55IHRyYW5zbWl0IGRhdGEgaXMgcHJldmVudGVkIGZyb20KKwkqKiBiZWluZyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB3cml0ZSBxdWV1ZSBpbnRvIHRoZSB0cmFuc21pdCBwYWNrZXRzCisJKiogKGFkZF90cmFuc21pdCkgYW5kIG5vIGZ1cnRodXIgdHJhbnNtaXQgaW50ZXJydXB0IHdpbGwgYmUgc2VudCBmb3IgdGhhdAorCSoqIGRhdGEuIFRoZSBuZXh0IGludGVycnVwdCB3aWxsIG9jY3VyIHVwIHRvIDUwMG1zIGxhdGVyIChSSU9JbnRyIGlzIGNhbGxlZAorCSoqIHR3aWNlIGEgc2Vjb25kIGFzIGEgc2FmdGV5IG1lYXN1cmUpLiBUaGlzIHdhcyB0aGUgY2FzZSB3aGVuIGtlcm1pdCB3YXMKKwkqKiB1c2VkIHRvIHNlbmQgZGF0YSBpbnRvIGEgUklPIHBvcnQuIEFmdGVyIGVhY2ggcGFja2V0IHdhcyBzZW50LCBUQ0ZMU0gKKwkqKiB3YXMgY2FsbGVkIHRvIGZsdXNoIHRoZSByZWFkIHF1ZXVlIHByZWVtcHRpdmVseS4gUG9ydFAtPkluVXNlIHdhcworCSoqIGluY3JlbWVudGVkLCB0aGVyZWJ5IGJsb2NraW5nIHRoZSA2IGJ5dGUgYWNrbm93bGVkZ2VtZW50IHBhY2tldAorCSoqIHRyYW5zbWl0dGVkIGJhY2suIFRoaXMgYWNrbm93bGVkZ21lbnQgaHVuZyBhcm91bmQgZm9yIDUwMG1zIGJlZm9yZQorCSoqIGJlaW5nIHNlbnQsIHRodXMgcmVkdWNpbmcgaW5wdXQgcGVyZm9ybWFuY2Ugc3Vic3RhbnRpYWxseSEuCisJKiogV2hlbiBQb3J0UC0+SW5Vc2UgYmVjb21lcyBOT1RfSU5VU0UsIHdlIG11c3QgZW5zdXJlIHRoYXQgYW55IGRhdGEKKwkqKiBoYW5naW5nIGFyb3VuZCBpbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIHNlbnQgaW1tZWRpYXRlbHkuCisJKi8KKwlXV09SRChQb3J0UC0+SG9zdFAtPlBhcm1NYXBQLT50eF9pbnRyLCAxKTsKKwkvKiBXaGF0IHRvIGRvIGhlcmUgLi4KKwl3YWtldXAoIChjYWRkcl90KSYoUG9ydFAtPkluVXNlKSApOworCSovCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK1Nob3dQYWNrZXQodWludCBGbGFncywgc3RydWN0IFBLVCAqUGFja2V0UCkKK3sKK30KKworLyoKKyoqIAorKiogSG93IHRvIHVzZSB0aGlzIGZpbGU6CisqKiAKKyoqIFRvIHNlbmQgYSBjb21tYW5kIGRvd24gYSBydXAsIHlvdSBuZWVkIHRvIGFsbG9jYXRlIGEgY29tbWFuZCBibG9jaywgZmlsbAorKiogaW4gdGhlIHBhY2tldCBpbmZvcm1hdGlvbiwgZmlsbCBpbiB0aGUgY29tbWFuZCBudW1iZXIsIGZpbGwgaW4gdGhlIHByZS0KKyoqIGFuZCBwb3N0LSBmdW5jdGlvbnMgYW5kIGFyZ3VtZW50cywgYW5kIHRoZW4gYWRkIHRoZSBjb21tYW5kIGJsb2NrIHRvIHRoZQorKiogcXVldWUgb2YgY29tbWFuZCBibG9ja3MgZm9yIHRoZSBwb3J0IGluIHF1ZXN0aW9uLiBXaGVuIHRoZSBwb3J0IGlzIGlkbGUsCisqKiB0aGVuIHRoZSBwcmUtZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQuIElmIHRoaXMgcmV0dXJucyBSSU9fRkFJTCB0aGVuIHRoZQorKiogY29tbWFuZCB3aWxsIGJlIHJlLXF1ZXVlZCBhbmQgdHJpZWQgYWdhaW4gYXQgYSBsYXRlciBkYXRlIChwcm9iYWJseSBpbiBvbmUKKyoqIGNsb2NrIHRpY2spLiBJZiB0aGUgcHJlLWZ1bmN0aW9uIHJldHVybnMgTk9UIFJJT19GQUlMLCB0aGVuIHRoZSBjb21tYW5kCisqKiBwYWNrZXQgd2lsbCBiZSBxdWV1ZWQgb24gdGhlIFJVUCwgYW5kIHRoZSB0eGNvbnRyb2wgZmllbGQgc2V0IHRvIHRoZQorKiogY29tbWFuZCBudW1iZXIuIFdoZW4gdGhlIHR4Y29udHJvbCBmaWVsZCBoYXMgY2hhbmdlZCBmcm9tIGJlaW5nIHRoZQorKiogY29tbWFuZCBudW1iZXIsIHRoZW4gdGhlIHBvc3QtZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQsIHdpdGggdGhlIGFyZ3VtZW50CisqKiBzcGVjaWZpZWQgZWFybGllciwgYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGJsb2NrLCBhbmQgdGhlIHZhbHVlIG9mCisqKiB0eGNvbnRyb2wuCisqKiAKKyoqIFRvIGFsbG9jYXRlIGEgY29tbWFuZCBibG9jaywgY2FsbCBSSU9HZXRDbWRCbGsoKS4gVGhpcyByZXR1cm5zIGEgcG9pbnRlcgorKiogdG8gdGhlIGNvbW1hbmQgYmxvY2sgc3RydWN0dXJlIGFsbG9jYXRlZCwgb3IgTlVMTCBpZiB0aGVyZSBhcmVuJ3QgYW55LgorKiogVGhlIGJsb2NrIHdpbGwgaGF2ZSBiZWVuIHplcm9lZCBmb3IgeW91LgorKiogCisqKiBUaGUgc3RydWN0dXJlIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyoqIAorKiogc3RydWN0IENtZEJsaworKiogeworKioJIHN0cnVjdCBDbWRCbGsgKk5leHRQOwkJICAqKiBQb2ludGVyIHRvIG5leHQgY29tbWFuZCBibG9jayAgICoqCisqKgkgc3RydWN0IFBLVAkgUGFja2V0OwkJKiogQSBwYWNrZXQsIHRvIGNvcHkgdG8gdGhlIHJ1cAkqKgorKioJCQlpbnQJICgqUHJlRnVuY1ApKCk7ICAqKiBUaGUgZnVuYyB0byBjYWxsIHRvIGNoZWNrIGlmIE9LICoqCisqKgkJCWludAkgUHJlQXJnOwkJKiogVGhlIGFyZyBmb3IgdGhlIGZ1bmMJCQkqKgorKioJCQlpbnQJICgqUG9zdEZ1bmNQKSgpOyAqKiBUaGUgZnVuYyB0byBjYWxsIHdoZW4gY29tcGxldGVkICoqCisqKgkJCWludAkgUG9zdEFyZzsJICAgKiogVGhlIGFyZyBmb3IgdGhlIGZ1bmMJCQkqKgorKiogfTsKKyoqIAorKiogWW91IG5lZWQgdG8gZmlsbCBpbiBBTEwgZmllbGRzIEVYQ0VQVCBOZXh0UCwgd2hpY2ggaXMgdXNlZCB0byBsaW5rIHRoZQorKiogYmxvY2tzIHRvZ2V0aGVyIGVpdGhlciBvbiB0aGUgZnJlZSBsaXN0IG9yIG9uIHRoZSBSdXAgbGlzdC4KKyoqIAorKiogUGFja2V0IGlzIGFuIGFjdHVhbCBwYWNrZXQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBwYWNrZXQKKyoqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4gWW91IG5lZWQgdG8gZmlsbCBpbiBldmVyeXRoaW5nLAorKiogYXMgdGhlIGNvbW1hbmQgcHJvY2Vzc29yZSBkb2Vzbid0IHByb2Nlc3MgdGhlIGNvbW1hbmQgcGFja2V0IGluIGFueSB3YXkuCisqKiAKKyoqIFRoZSBQcmVGdW5jUCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYWNrZXQgaXMgZW5xdWV1ZWQgb24gdGhlIGhvc3QgcnVwLgorKiogUHJlRnVuY1AgaXMgY2FsbGVkIGFzICgqUHJlRnVuY1ApKFByZUFyZywgQ21kQmxrUCk7LiBQcmVGdW5jUCBtdXN0CisqKiByZXR1cm4gIVJJT19GQUlMIHRvIGhhdmUgdGhlIHBhY2tldCBxdWV1ZWQgb24gdGhlIHJ1cCwgYW5kIFJJT19GQUlMCisqKiBpZiB0aGUgcGFja2V0IGlzIE5PVCB0byBiZSBxdWV1ZWQuCisqKiAKKyoqIFRoZSBQb3N0RnVuY1AgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4gSXQgaXMgY2FsbGVkCisqKiBhcyAoKlBvc3RGdW5jUCkoUG9zdEFyZywgQ21kQmxrUCwgdHhjb250cm9sKTsuIFBvc3RGdW5jUCBpcyBub3QgZXhwZWN0ZWQKKyoqIHRvIHJldHVybiBhIHZhbHVlLiBQb3N0RnVuY1AgZG9lcyBOT1QgbmVlZCB0byBmcmVlIHRoZSBjb21tYW5kIGJsb2NrLAorKiogYXMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgUG9zdEZ1bmNQIHJldHVybnMuCisqKiAKKyoqIE9uY2UgdGhlIGNvbW1hbmQgYmxvY2sgaGFzIGJlZW4gZmlsbGVkIGluLCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgY29ycmVjdAorKiogcXVldWUgYnkgY2FsbGluZyBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJ1cCwgQ21kQmxrUCApIHdoZXJlIEhvc3RQIGlzCisqKiBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBIb3N0LCBSdXAgaXMgdGhlIE5VTUJFUiBvZiB0aGUgcnVwIChOT1QgYSBwb2ludGVyCisqKiB0byBpdCEpLCBhbmQgQ21kQmxrUCBpcyB0aGUgcG9pbnRlciB0byB0aGUgY29tbWFuZCBibG9jayBhbGxvY2F0ZWQgdXNpbmcKKyoqIFJJT0dldENtZEJsaygpLgorKiogCisqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQxYTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMKQEAgLTAsMCArMSwxODY5IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9jdHJsLmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjQyCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjQ5CisqKgorKiogIGlkZW50IEAoIylyaW9jdHJsLmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvY3RybF9jX3NjY3NfID0gIkAoIylyaW9jdHJsLmMJMS4zIjsKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKworCitzdGF0aWMgc3RydWN0IExwYlJlcQkgTHBiUmVxOworc3RhdGljIHN0cnVjdCBSdXBSZXEJIFJ1cFJlcTsKK3N0YXRpYyBzdHJ1Y3QgUG9ydFJlcQlQb3J0UmVxOworc3RhdGljIHN0cnVjdCBIb3N0UmVxCUhvc3RSZXE7CitzdGF0aWMgc3RydWN0IEhvc3REcFJhbSBIb3N0RHBSYW07CitzdGF0aWMgc3RydWN0IERlYnVnQ3RybCBEZWJ1Z0N0cmw7CitzdGF0aWMgc3RydWN0IE1hcAkJIE1hcEVudDsKK3N0YXRpYyBzdHJ1Y3QgUG9ydFNldHVwIFBvcnRTZXR1cDsKK3N0YXRpYyBzdHJ1Y3QgRG93bkxvYWQJRG93bkxvYWQ7CitzdGF0aWMgc3RydWN0IFNlbmRQYWNrICBTZW5kUGFjazsKKy8qIHN0YXRpYyBzdHJ1Y3QgU3RyZWFtSW5mbwlTdHJlYW1JbmZvOyAqLworLyogc3RhdGljIGNoYXIgbW9kZW10YWJsZVtSSU9fUE9SVFNdOyAqLworc3RhdGljIHN0cnVjdCBTcGVjaWFsUnVwQ21kIFNwZWNpYWxSdXBDbWQ7CitzdGF0aWMgc3RydWN0IFBvcnRQYXJhbXMgUG9ydFBhcmFtczsKK3N0YXRpYyBzdHJ1Y3QgcG9ydFN0YXRzIHBvcnRTdGF0czsKKworc3RhdGljIHN0cnVjdCBTdWJDbWRTdHJ1Y3QgeworCXVzaG9ydAlIb3N0OworCXVzaG9ydAlSdXA7CisJdXNob3J0CVBvcnQ7CisJdXNob3J0CUFkZHI7Cit9IFN1YkNtZDsKKworc3RydWN0IFBvcnRUdHkgeworCXVpbnQJCXBvcnQ7CisJc3RydWN0IHR0eXN0YXRpY3MJVHR5OworfTsKKworc3RhdGljIHN0cnVjdCBQb3J0VHR5CVBvcnRUdHk7Cit0eXBlZGVmIHN0cnVjdCB0dHlzdGF0aWNzIFRFUk1JTzsKKworLyoKKyoqIFRoaXMgdGFibGUgaXMgdXNlZCB3aGVuIHRoZSBjb25maWcucmlvIGRvd25sb2FkcyBiaW4gY29kZSB0byB0aGUKKyoqIGRyaXZlci4gV2UgaW5kZXggdGhlIHRhYmxlIHVzaW5nIHRoZSBwcm9kdWN0IGNvZGUsIDAtRiwgYW5kIGNhbGwKKyoqIHRoZSBmdW5jdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBlbnRyeSwgcGFzc2luZyB0aGUgaW5mb3JtYXRpb24KKyoqIGFib3V0IHRoZSBib290LgorKiogVGhlIFJJT0Jvb3RDb2RlVU5LTk9XTiBlbnRyeSBpcyB0aGVyZSB0byBwb2xpdGVseSB0ZWxsIHRoZSBjYWxsaW5nCisqKiBwcm9jZXNzIHRvIGJvZyBvZmYuCisqLworc3RhdGljIGludCAKKygqUklPQm9vdFRhYmxlW01BWF9QUk9EVUNUXSkoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKSA9Cit7CisvKiAwICovCVJJT0Jvb3RDb2RlSE9TVCwJLyogSG9zdCBDYXJkICovCisvKiAxICovCVJJT0Jvb3RDb2RlUlRBLAkJLyogUlRBICovCit9OworCisjZGVmaW5lIGRydl9tYWtlZGV2KG1haiwgbWluKSAoKCgodWludCkgbWFqICYgMHhmZikgPDwgOCkgfCAoKHVpbnQpIG1pbiAmIDB4ZmYpKQorCitpbnQgY29weWluIChpbnQgYXJnLCBjYWRkcl90IGRwLCBpbnQgc2l6KQoreworICBpbnQgcnY7CisKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weWluZyAlZCBieXRlcyBmcm9tIHVzZXIgJXAgdG8gJXAuXG4iLCBzaXosICh2b2lkICopYXJnLCBkcCk7CisgIHJ2ID0gY29weV9mcm9tX3VzZXIgKGRwLCAodm9pZCAqKWFyZywgc2l6KTsKKyAgaWYgKHJ2KSByZXR1cm4gQ09QWUZBSUw7CisgIGVsc2UgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGNvcHlvdXQgKGNhZGRyX3QgZHAsIGludCBhcmcsIGludCBzaXopCit7CisgIGludCBydjsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3B5aW5nICVkIGJ5dGVzIHRvIHVzZXIgJXAgZnJvbSAlcC5cbiIsIHNpeiwgKHZvaWQgKilhcmcsIGRwKTsKKyAgcnYgPSBjb3B5X3RvX3VzZXIgKCh2b2lkICopYXJnLCBkcCwgc2l6KTsKKyAgaWYgKHJ2KSByZXR1cm4gQ09QWUZBSUw7CisgIGVsc2UgcmV0dXJuIHJ2OworfQorCitpbnQKK3Jpb2NvbnRyb2wocCwgZGV2LCBjbWQsIGFyZywgc3UpCitzdHJ1Y3QgcmlvX2luZm8JKiBwOworZGV2X3QJCWRldjsKK2ludAkJY21kOworY2FkZHJfdAkJYXJnOworaW50CQlzdTsKK3sKKwl1aW50CUhvc3Q7CS8qIGxlYXZlIG1lIHVuc2lnbmVkISAqLworCXVpbnQJcG9ydDsJLyogYW5kIG1lISAqLworCXN0cnVjdCBIb3N0CSpIb3N0UDsKKwl1c2hvcnQJbG9vcDsKKwlpbnQJCUVudHJ5OworCXN0cnVjdCBQb3J0CSpQb3J0UDsKKwlQS1QJKlBhY2tldFA7CisJaW50CQlyZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZnVuY19lbnRlciAoKTsKKwkKKwkvKiBDb25mdXNlIHRoZSBjb21waWxlciB0byB0aGluayB0aGF0IHdlJ3ZlIGluaXRpYWxpemVkIHRoZXNlICovCisJSG9zdD0wOworCVBvcnRQID0gTlVMTDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImNvbnRyb2wgaW9jdGwgY21kOiAweCV4IGFyZzogMHgleFxuIiwgY21kLCAoaW50KWFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCQkvKgorCQkqKiBSSU9fU0VUX1RJTUVSCisJCSoqCisJCSoqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGhvc3QgY2FyZCBpbnRlcnJ1cHQgdGltZXIuCisJCSoqIElmIHRoZSBob3N0IGNhcmQgbnVtYmVyIGlzIC0xIHRoZW4gYWxsIGhvc3QgY2FyZHMgYXJlIGNoYW5nZWQKKwkJKiogb3RoZXJ3aXNlIGp1c3QgdGhlIHNwZWNpZmllZCBob3N0IGNhcmQgd2lsbCBiZSBjaGFuZ2VkLgorCQkqLworCQljYXNlIFJJT19TRVRfVElNRVI6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUX1RJTUVSIHRvICVkbXNcbiIsICh1aW50KWFyZyk7CisJCQl7CisJCQkJaW50IGhvc3QsIHZhbHVlOworCQkJCWhvc3QgPSAodWludClhcmcgPj4gMTY7CisJCQkJdmFsdWUgPSAodWludClhcmcgJiAweDAwMDBmZmZmOworCQkJCWlmIChob3N0ID09IC0xKSB7CisJCQkJCWZvciAoaG9zdCA9IDA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrKSB7CisJCQkJCQlpZiAocC0+UklPSG9zdHNbaG9zdF0uRmxhZ3MgPT0gUkNfUlVOTklORykgeworCQkJCQkJCVdXT1JEKHAtPlJJT0hvc3RzW2hvc3RdLlBhcm1NYXBQLT50aW1lciAsIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoaG9zdCA+PSBwLT5SSU9OdW1Ib3N0cykgeworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzID09IFJDX1JVTk5JTkcgKSB7CisJCQkJCQlXV09SRChwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUC0+dGltZXIgLCB2YWx1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFJJT19JREVOVElGWV9EUklWRVI6CisJCQkvKgorCQkJKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjAgcGFydCBmaXgKKwkJCSoqIEFkZGVkIGRyaXZlciBpZGVudCBzdHJpbmcgb3V0cHV0LgorCQkJKioKKyNpZm5kZWYgX19USElTX1JFTEVBU0VfXworI3dhcm5pbmcgRHJpdmVyIFZlcnNpb24gc3RyaW5nIG5vdCBkZWZpbmVkICEKKyNlbmRpZgorCQkJY3ByaW50ZigiJXMgJXMgJXMgJXNcbiIsCisJCQkJUklPX0RSVl9TVFIsCisJCQkJX19USElTX1JFTEVBU0VfXywKKwkJCQlfX0RBVEVfXywgX19USU1FX18gKTsKKworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBSSU9fRElTUExBWV9IT1NUX0NGRzoKKwkJCSoqCisJCQkqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MCBwYXJ0IGZpeAorCQkJKiogQWRkZWQgZHJpdmVyIGhvc3QgY2FyZCBpZGVudCBzdHJpbmcgb3V0cHV0LgorCQkJKioKKwkJCSoqIE5vdGUgdGhhdCB0aGUgb25seSB0eXBlcyBjdXJyZW50bHkgc3VwcG9ydGVkCisJCQkqKiBhcmUgSVNBIGFuZCBQQ0kuIEFsc28gdGhpcyBkcml2ZXIgZG9lcyBub3QKKwkJCSoqICh5ZXQpIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIE9sZCBQQ0kgY2FyZAorCQkJKiogYW5kIHRoZSBKZXQgUENJIGNhcmQuIEluIGZhY3QgSSB0aGluayB0aGlzCisJCQkqKiBkcml2ZXIgb25seSBzdXBwb3J0cyBKRVQgUENJICEKKwkJCSoqCisKKwkJCWZvciAoSG9zdCA9IDA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrKQorCQkJeworCQkJCUhvc3RQID0gJihwLT5SSU9Ib3N0c1tIb3N0XSk7CisKKwkJCQlzd2l0Y2ggKCBIb3N0UC0+VHlwZSApCisJCQkJeworCQkJCSAgICBjYXNlIFJJT19BVCA6CisJCQkJCXN0cmNweSggaG9zdF90eXBlLCBSSU9fQVRfSE9TVF9TVFIgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkgICAgY2FzZSBSSU9fUENJIDoKKwkJCQkJc3RyY3B5KCBob3N0X3R5cGUsIFJJT19QQ0lfSE9TVF9TVFIgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkgICAgZGVmYXVsdCA6CisJCQkJCXN0cmNweSggaG9zdF90eXBlLCAiVW5rbm93biIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY3ByaW50ZigKKwkJCQkgICJSSU8gSG9zdCAlZCAtIFR5cGU6JXMgQWRkcjolWCBJUlE6JWRcbiIsCisJCQkJCUhvc3QsIGhvc3RfdHlwZSwKKwkJCQkJKHVpbnQpSG9zdFAtPlBhZGRyUCwKKwkJCQkJKGludClIb3N0UC0+SXZlYyAtIDMyICApOworCQkJfQorCQkJcmV0dXJuIDA7CisJCQkqKgorCQkJKi8KKworCQljYXNlIFJJT19GT0FEX1JUQToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19GT0FEX1JUQVxuIik7CisJCQlyZXR1cm4gUklPQ29tbWFuZFJ0YShwLCAodWludClhcmcsIFJJT0ZvYWRSdGEpOworCisJCWNhc2UgUklPX1pPTUJJRV9SVEE6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fWk9NQklFX1JUQVxuIik7CisJCQlyZXR1cm4gUklPQ29tbWFuZFJ0YShwLCAodWludClhcmcsIFJJT1pvbWJpZVJ0YSk7CisKKwkJY2FzZSBSSU9fSURFTlRJRllfUlRBOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0lERU5USUZZX1JUQVxuIik7CisJCQlyZXR1cm4gUklPSWRlbnRpZnlSdGEocCwgYXJnKTsKKworCQljYXNlIFJJT19LSUxMX05FSUdIQk9VUjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19LSUxMX05FSUdIQk9VUlxuIik7CisJCQlyZXR1cm4gUklPS2lsbE5laWdoYm91cihwLCBhcmcpOworCisJCWNhc2UgU1BFQ0lBTF9SVVBfQ01EOgorCQkJeworCQkJCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTUEVDSUFMX1JVUF9DTURcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZTcGVjaWFsUnVwQ21kLCAKKwkJCQkJCQlzaXplb2YoU3BlY2lhbFJ1cENtZCkpID09IENPUFlGQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTUEVDSUFMX1JVUF9DTUQgY29weSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCQkJCWlmICggIUNtZEJsa1AgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNQRUNJQUxfUlVQX0NNRCBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJQ21kQmxrUC0+UGFja2V0ID0gU3BlY2lhbFJ1cENtZC5QYWNrZXQ7CisJCQkJaWYgKCBTcGVjaWFsUnVwQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKQorCQkJCQlTcGVjaWFsUnVwQ21kLkhvc3QgPSAwOworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBzcGVjaWFsIHJ1cCBjb21tYW5kIGZvciBob3N0ICVkIHJ1cCAlZFxuIiwKKwkJCQkJCVNwZWNpYWxSdXBDbWQuSG9zdCwgU3BlY2lhbFJ1cENtZC5SdXBOdW0pOworCQkJCQlpZiAoUklPUXVldWVDbWRCbGsoJnAtPlJJT0hvc3RzW1NwZWNpYWxSdXBDbWQuSG9zdF0sIAorCQkJCQkJCVNwZWNpYWxSdXBDbWQuUnVwTnVtLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCkgeworCQkJCQkJY3ByaW50ZigiRkFJTEVEIFRPIFFVRVVFIFNQRUNJQUwgUlVQIENPTU1BTkRcbiIpOworCQkJCQl9CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJY2FzZSBSSU9fREVCVUdfTUVNOgorI2lmZGVmIERFQlVHX01FTV9TVVBQT1JUCitSSU9fREVCVUdfQ1RSTCwgCQkJCWlmIChzdSkKKwkJCQkJcmV0dXJuIHJpb19SSU9EZWJ1Z01lbW9yeShSSU9fREVCVUdfQ1RSTCwgYXJnKTsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJY2FzZSBSSU9fQUxMX01PREVNOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19BTExfTU9ERU1cbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSU9DVExfQ09NTUFORF9VTktOT1dOOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIFJJT19HRVRfVEFCTEU6CisJCQkJLyoKKwkJCQkqKiBSZWFkIHRoZSByb3V0aW5nIHRhYmxlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgdG8gdXNlciBzcGFjZQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9UQUJMRVxuIik7CisKKwkJCQlpZiAoKHJldHZhbCA9IFJJT0FwZWwocCkpICE9IDApCisJCSAJCQlyZXR1cm4gcmV0dmFsOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpcC0+UklPQ29ubmVjdFRhYmxlLCAoaW50KWFyZywKKwkJCQkJCVRPVEFMX01BUF9FTlRSSUVTKnNpemVvZihzdHJ1Y3QgTWFwKSkgPT0gQ09QWUZBSUwpIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfVEFCTEUgY29weSBmYWlsZWRcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXsKKwkJCQkJaW50IGVudHJ5OworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICAiKioqKipcbk1BUCBFTlRSSUVTXG4iKTsKKwkJCQkJZm9yICggZW50cnk9MDsgZW50cnk8VE9UQUxfTUFQX0VOVFJJRVM7IGVudHJ5KysgKQorCQkJCQl7CisJCQkJCSAgaWYgKChwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEID09IDApICYmCisJCQkJCSAgICAgIChwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkhvc3RVbmlxdWVOdW0gPT0gMCkgJiYKKwkJCQkJICAgICAgKHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IDApKSBjb250aW51ZTsKKwkJCQkJICAgICAgCisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSG9zdFVuaXF1ZU51bSA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkhvc3RVbmlxdWVOdW0gKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5SdGFVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5JRCA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSUQyID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQyICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuRmxhZ3MgPSAweCV4XG4iLCBlbnRyeSwgKGludClwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkZsYWdzICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuU3lzUG9ydCA9IDB4JXhcbiIsIGVudHJ5LCAoaW50KXAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uU3lzUG9ydCApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFswXS5Vbml0ID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLlVuaXQgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMF0uTGluayA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVswXS5MaW5rICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzFdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMV0uVW5pdCApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFsxXS5MaW5rID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLkxpbmsgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMl0uVW5pdCA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsyXS5Vbml0ICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzJdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMl0uTGluayApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFszXS5Vbml0ID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLlVuaXQgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbNF0uTGluayA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVszXS5MaW5rICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuTmFtZSA9ICVzXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5OYW1lICk7CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAgIioqKioqXG5FTkQgTUFQIEVOVFJJRVNcbiIpOworCQkJCX0KKwkJCQlwLT5SSU9RdWlja0NoZWNrID0gTk9UX0NIQU5HRUQ7CS8qIGEgdGFibGUgaGFzIGJlZW4gZ290dGVuICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1BVVF9UQUJMRToKKwkJCQkvKgorCQkJCSoqIFdyaXRlIHRoZSByb3V0aW5nIHRhYmxlIHRvIHRoZSBkZXZpY2UgZHJpdmVyIGZyb20gdXNlciBzcGFjZQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9UQUJMRVxuIik7CisKKwkJCQlpZiAoICFzdSApIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEUgIVJvb3RcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcC0+UklPQ29ubmVjdFRhYmxlWzBdLCAKKwkJCQkJVE9UQUxfTUFQX0VOVFJJRVMqc2l6ZW9mKHN0cnVjdCBNYXApICkgPT0gQ09QWUZBSUwgKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUFVUX1RBQkxFIGNvcHkgZmFpbGVkXG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJCXsKKwkJCQkJaW50IGVudHJ5OworCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCIqKioqKlxuTUFQIEVOVFJJRVNcbiIpICk7CisJCQkJCWZvciAoIGVudHJ5PTA7IGVudHJ5PFRPVEFMX01BUF9FTlRSSUVTOyBlbnRyeSsrICkKKwkJCQkJeworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLkhvc3RVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ib3N0VW5pcXVlTnVtICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5SdGFVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLklEID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLklEMiA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEMiApICk7CisJCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCJNYXAgZW50cnkgJWQuRmxhZ3MgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5GbGFncyApICk7CisJCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCJNYXAgZW50cnkgJWQuU3lzUG9ydCA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlN5c1BvcnQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFswXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFswXS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsxXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsxXS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsyXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzJdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsyXS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzJdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFszXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFs0XS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLk5hbWUgPSAlc1xuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uTmFtZSApICk7CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiKioqKipcbkVORCBNQVAgRU5UUklFU1xuIikgKTsKKwkJCQl9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKwkJCQlyZXR1cm4gUklPTmV3VGFibGUocCk7CisKKwkgCQljYXNlIFJJT19HRVRfQklORElOR1MgOgorCQkJCS8qCisJCQkJKiogU2VuZCBiaW5kaW5ncyB0YWJsZSwgY29udGFpbmluZyB1bmlxdWUgbnVtYmVycyBvZiBSVEFzIG93bmVkCisJCQkJKiogYnkgdGhpcyBzeXN0ZW0gdG8gdXNlciBzcGFjZQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HU1xuIik7CisKKwkJCQlpZiAoICFzdSApCisJCQkJeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HUyAhUm9vdFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkgCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpIHAtPlJJT0JpbmRUYWIsIChpbnQpYXJnLCAKKwkJCQkJCShzaXplb2YodWxvbmcpICogTUFYX1JUQV9CSU5ESU5HUykpID09IENPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HUyBjb3B5IGZhaWxlZFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJIAkJY2FzZSBSSU9fUFVUX0JJTkRJTkdTIDoKKwkJCS8qCisJCQkqKiBSZWNlaXZlIGEgYmluZGluZ3MgdGFibGUsIGNvbnRhaW5pbmcgdW5pcXVlIG51bWJlcnMgb2YgUlRBcyBvd25lZAorCQkJKiogYnkgdGhpcyBzeXN0ZW0KKwkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HU1xuIik7CisKKwkJCQlpZiAoICFzdSApCisJCQkJeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HUyAhUm9vdFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkgCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJnAtPlJJT0JpbmRUYWJbMF0sIAorCQkJCQkJKHNpemVvZih1bG9uZykgKiBNQVhfUlRBX0JJTkRJTkdTKSk9PUNPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HUyBjb3B5IGZhaWxlZFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX0JJTkRfUlRBIDoKKwkJCQl7CisJCQkJCWludAlFbXB0eVNsb3QgPSAtMTsKKwkJCQkJLyoKKwkJCQkJKiogQmluZCB0aGlzIFJUQSB0byBob3N0LCBzbyB0aGF0IGl0IHdpbGwgYmUgYm9vdGVkIGJ5IAorCQkJCQkqKiBob3N0IGluICdib290IG93bmVkIFJUQXMnIG1vZGUuCisJCQkJCSovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19CSU5EX1JUQVxuIik7CisKKwkJCQkJaWYgKCAhc3UgKSB7CisJCSAJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0JJTkRfUlRBICFSb290XG4iKTsKKwkJIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkgCQkJCXJldHVybiAtRVBFUk07CisJCQkJCX0KKwkJCQkJZm9yIChFbnRyeSA9IDA7IEVudHJ5IDwgTUFYX1JUQV9CSU5ESU5HUzsgRW50cnkrKykgeworCQkgCQkJCWlmICgoRW1wdHlTbG90ID09IC0xKSAmJiAocC0+UklPQmluZFRhYltFbnRyeV0gPT0gMEwpKQorCQkJCQkJCUVtcHR5U2xvdCA9IEVudHJ5OworCQkgCQkJCWVsc2UgaWYgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IChpbnQpIGFyZykgeworCQkJCQkJCS8qCisJCQkJCQkJKiogQWxyZWFkeSBleGlzdHMgLSBkZWxldGUKKwkJCQkJCQkqLworCQkJCQkJCXAtPlJJT0JpbmRUYWJbRW50cnldID0gMEw7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVtb3ZpbmcgUnRhICV4IGZyb20gcC0+UklPQmluZFRhYlxuIiwKKwkJIAkJCQkJCQkJCQkJCShpbnQpIGFyZyk7CisJCQkJCQkJcmV0dXJuIDA7CisJCSAJCQkJfQorCQkJCQl9CisJCQkJCS8qCisJCQkJCSoqIERvc2VuJ3QgZXhpc3QgLSBhZGQKKwkJCQkJKi8KKwkJCQkJaWYgKEVtcHR5U2xvdCAhPSAtMSkgeworCQkgCQkJCXAtPlJJT0JpbmRUYWJbRW1wdHlTbG90XSA9IChpbnQpIGFyZzsKKwkJIAkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJBZGRpbmcgUnRhICV4IHRvIHAtPlJJT0JpbmRUYWJcbiIsCisJCSAgCQkJCQkoaW50KSBhcmcpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkgCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgInAtPlJJT0JpbmRUYWIgZnVsbCEgLSBSdGEgJXggbm90IGFkZGVkXG4iLAorCQkgIAkJCQkJKGludCkgYXJnKTsKKwkJIAkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCWNhc2UgUklPX1JFU1VNRSA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRVxuIik7CisJCQkJcG9ydCA9ICh1aW50KSBhcmc7CisJCQkJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiA1MTEpKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsIHBvcnQpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCSAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKwkJCQlpZiAoIVBvcnRQLT5NYXBwZWQpIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUU6IFBvcnQgJWQgbm90IG1hcHBlZFxuIiwgcG9ydCk7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTk9UX01BUFBFRF9JTlRPX1NZU1RFTTsKKwkJIAkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlpZiAoIShQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogUG9ydCAlZCBub3Qgb3BlblxuIiwgcG9ydCk7CisJCSAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgKHAtPlJJT1BvcnRwW3BvcnRdKSwgUkVTVU1FKSA9PSAKKwkJCQkJCQkJCQlSSU9fRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FIGZhaWxlZFxuIik7CisJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogUG9ydCAlZCByZXN1bWVkXG4iLCBwb3J0KTsKKwkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCQkJCX0KKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19BU1NJR05fUlRBOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19BU1NJR05fUlRBXG4iKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0FTU0lHTl9SVEEgIVJvb3RcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTWFwRW50LCBzaXplb2YoTWFwRW50KSkKKwkJCQkJCQkJCT09IENPUFlGQUlMKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcHkgZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiBSSU9Bc3NpZ25SdGEocCwgJk1hcEVudCk7CisKKwkJCWNhc2UgUklPX0NIQU5HRV9OQU1FOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRVxuIik7CisJCQkJaWYgKCAhc3UgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRSAhUm9vdFxuIik7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZNYXBFbnQsIHNpemVvZihNYXBFbnQpKQorCQkJCQkJPT0gQ09QWUZBSUwpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIFJJT0NoYW5nZU5hbWUocCwgJk1hcEVudCk7CisKKwkJCWNhc2UgUklPX0RFTEVURV9SVEE6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEFcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEEgIVJvb3RcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZNYXBFbnQsIHNpemVvZihNYXBFbnQpKQorCQkJCQkJCT09IENPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIGRhdGEgc3BhY2UgZmFpbGVkXG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gUklPRGVsZXRlUnRhKHAsICZNYXBFbnQpOworCisJCQljYXNlIFJJT19RVUlDS19DSEVDSzoKKwkJCQkvKgorCQkJCSoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IHBhcnQgZml4CisJCQkJKiogQSBjdXN0b21lciB3YXMgdXNpbmcgdGhpcyB0byBnZXQgdGhlIFJUQXMKKwkJCQkqKiBjb25uZWN0L2Rpc2Nvbm5lY3Qgc3RhdHVzLgorCQkJCSoqIFJJT0NvbkNvbigpIGhhZCBiZWVuIGJvdGNoZWQgdXNlIFJJT0hhbHRlZAorCQkJCSoqIHRvIGtlZXAgdHJhY2sgb2YgUlRBIGNvbm5lY3Rpb25zIGFuZAorCQkJCSoqIGRpc2Nvbm5lY3Rpb25zLiBUaGF0IGhhcyBiZWVuIGNoYW5nZWQgYW5kCisJCQkJKiogUklPUnRhRGlzQ29ucyBpbiB0aGUgcmlvX2luZm8gc3RydWN0IG5vdworCQkJCSoqIGRvZXMgdGhlIGpvYi4gU28gd2UgbmVlZCB0byByZXR1cm4gdGhlIHZhbHVlCisJCQkJKiogb2YgUklPUnRhQ29ucyBpbnN0ZWFkIG9mIFJJT0hhbHRlZC4KKwkJCQkqKgorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9IYWx0ZWQsKGludClhcmcsCisJCQkJCQkJc2l6ZW9mKHVpbnQpKT09Q09QWUZBSUwpIHsKKwkJCQkqKgorCQkJCSovCisKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPUnRhRGlzQ29ucywoaW50KWFyZywKKwkJCQkJCQlzaXplb2YodWludCkpPT1DT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX0xBU1RfRVJST1I6CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0Vycm9yLCAoaW50KWFyZywgCisJCQkJCQlzaXplb2Yoc3RydWN0IEVycm9yKSkgPT1DT1BZRkFJTCApCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19HRVRfTE9HOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTE9HXG4iKTsKKyNpZmRlZiBMT0dHSU5HCisJCQkJUklPR2V0TG9nKGFyZyk7CisJCQkJcmV0dXJuIDA7CisjZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisKKwkJCWNhc2UgUklPX0dFVF9NT0RUWVBFOgorCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJnBvcnQsIAorCQkJCQkJCQkJc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCApCisJCQkJeworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBtb2R1bGUgdHlwZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CisJCQkJaWYgKCBwb3J0IDwgMCB8fCBwb3J0ID4gNTExICkKKwkJCQl7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX01PRFRZUEU6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJIAkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0XSk7CisJCQkJaWYgKCFQb3J0UC0+TWFwcGVkKQorCQkJCXsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTU9EVFlQRTogUG9ydCAlZCBub3QgbWFwcGVkXG4iLCBwb3J0KTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OT1RfTUFQUEVEX0lOVE9fU1lTVEVNOworCQkgCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qCisJCQkJKiogUmV0dXJuIG1vZHVsZSB0eXBlIG9mIHBvcnQKKwkJCQkqLworCQkJCXBvcnQgPSBQb3J0UC0+SG9zdFAtPlVuaXhSdXBzW1BvcnRQLT5SdXBOdW1dLk1vZFR5cGVzOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwb3J0LCAoaW50KWFyZywgCisJCQkJCQkJc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCkgeworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4oMCk7CisJCQkvKgorCQkJKiogMDIuMDMuMTk5OSBBUkcgLSBFU0lMIDA4MjAgZml4CisJCQkqKiBXZSBhcmUgbm8gbG9uZ2VyIHVzaW5nICJCb290IE1vZGUiLCBzbyB0aGVzZSBpb2N0bHMKKwkJCSoqIGFyZSBub3QgcmVxdWlyZWQgOgorCQkJKioKKwkgCQljYXNlIFJJT19HRVRfQk9PVF9NT0RFIDoKKwkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAoIkdldCBib290IG1vZGUgLSAleFxuIiwgcC0+UklPQm9vdE1vZGUpKTsKKwkJCQkqKgorCQkJCSoqIFJldHVybiBib290IHN0YXRlIG9mIHN5c3RlbSAtIEJPT1RfQUxMLCBCT09UX09XTiBvciBCT09UX05PTkUKKwkJCQkqKgorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9Cb290TW9kZSwgKGludClhcmcsIAorCQkJCQkJc2l6ZW9mKHAtPlJJT0Jvb3RNb2RlKSkgPT0gQ09QWUZBSUwpIHsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuKDApOworCQkJCisgCQkJY2FzZSBSSU9fU0VUX0JPT1RfTU9ERSA6CisJCQkJcC0+UklPQm9vdE1vZGUgPSAodWludCkgYXJnOworCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiU2V0IGJvb3QgbW9kZSB0byAweCV4XG4iLCBwLT5SSU9Cb290TW9kZSkpOworCQkJCXJldHVybigwKTsKKwkJCSoqCisJCQkqKiBFbmQgRVNJTCAwODIwIGZpeAorCQkJKi8KKworCSAJCWNhc2UgUklPX0JMT0NLX09QRU5TOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk9wZW5zIGJsb2NrIHVudGlsIGJvb3RlZFxuIik7CisJCQkJZm9yICggRW50cnk9MDsgRW50cnkgPCBSSU9fUE9SVFM7IEVudHJ5KysgKSB7CisJCSAJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCSAJCQlwLT5SSU9Qb3J0cFtFbnRyeV0tPldhaXRVbnRpbEJvb3RlZCA9IDE7CisJCSAJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQkKKwkgCQljYXNlIFJJT19TRVRVUF9QT1JUUzoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXR1cCBwb3J0c1xuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRTZXR1cCwgc2l6ZW9mKFBvcnRTZXR1cCkpIAorCQkJCQkJPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJFRkFVTFQiKTsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFBvcnRTZXR1cC5Gcm9tID4gUG9ydFNldHVwLlRvIHx8IAorCQkJCQkJCQlQb3J0U2V0dXAuVG8gPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJFTlhJTyIpOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJaWYgKCBQb3J0U2V0dXAuWHBDcHMgPiBwLT5SSU9Db25mLk1heFhwQ3BzIHx8CisJCQkJCSBQb3J0U2V0dXAuWHBDcHMgPCBwLT5SSU9Db25mLk1pblhwQ3BzICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBYUFJJTlRfQ1BTX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkVJTlZBTCIpOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWlmICggIXAtPlJJT1BvcnRwICkgeworCQkJCQkgY3ByaW50ZigiTm8gcC0+UklPUG9ydHAgYXJyYXkhXG4iKTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk5vIHAtPlJJT1BvcnRwIGFycmF5IVxuIik7CisJCQkJCSByZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiZW50ZXJpbmcgbG9vcCAoJWQgJWQpIVxuIiwgUG9ydFNldHVwLkZyb20sIFBvcnRTZXR1cC5Ubyk7CisJCQkJZm9yIChsb29wPVBvcnRTZXR1cC5Gcm9tOyBsb29wPD1Qb3J0U2V0dXAuVG87IGxvb3ArKykgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImluIGxvb3AgKCVkKSFcbiIsIGxvb3ApOworI2lmIDAKKwkJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtsb29wXTsKKwkJCQkJaWYgKCAhUG9ydFAtPlR0eVAgKQorCQkJCQkJUG9ydFAtPlR0eVAgPSAmcC0+Y2hhbm5lbFtsb29wXTsKKworCQkgCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJCWlmICggUG9ydFNldHVwLkl4QW55ICkKKwkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWEFOWTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fSVhBTlk7CisJCQkJCQlpZiAoIFBvcnRTZXR1cC5JeE9uICkKKwkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWE9OOworCQkJCQkJZWxzZQorCQkJCQkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWE9OOworCQkJCQkgCisJCQkJCSAvKgorCQkJCQkgKiogSWYgdGhlIHBvcnQgbmVlZHMgdG8gd2FpdCBmb3IgYWxsIGEgcHJvY2Vzc2VzIG91dHB1dAorCQkJCQkgKiogdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcgdGhlbiB0aGlzIGZsYWcgd2lsbCBiZSBzZXQuCisJCQkJCSAqLworCQkJCQkgCWlmIChQb3J0U2V0dXAuRHJhaW4pIHsKKwkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19XQUlURFJBSU47CisJCQkJCSAJfSBlbHNlIHsKKwkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fV0FJVERSQUlOOworCQkJCQkgCX0KKwkJCQkJIC8qCisJCQkJCSAqKiBTdG9yZSBzZXR0aW5ncyBpZiBsb2NraW5nIG9yIHVubG9ja2luZyBwb3J0IG9yIGlmIHRoZQorCQkJCQkgKiogcG9ydCBpcyBub3QgbG9ja2VkLCB3aGVuIHNldHRpbmcgdGhlIHN0b3JlIG9wdGlvbi4KKwkJCQkJICovCisJCQkJCSBpZiAoUG9ydFAtPk1hcHBlZCAmJgorCQkJCQkJICgoUG9ydFNldHVwLkxvY2sgJiYgIVBvcnRQLT5Mb2NrKSB8fAorCQkJCQkJCSghUG9ydFAtPkxvY2sgJiYKKwkJCQkJCQkoUG9ydFNldHVwLlN0b3JlICYmICFQb3J0UC0+U3RvcmUpKSkpIHsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkuaWZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19pZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkub2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19vZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkuY2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19jZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkubGZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19sZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkubGluZSA9IFBvcnRQLT5UdHlQLT50bS5jX2xpbmU7CisJCQkJCQliY29weShQb3J0UC0+VHR5UC0+dG0uY19jYywgUG9ydFAtPlN0b3JlZFR0eS5jYywKKwkJCQkJIAkJTkNDICsgNSk7CisJCQkJCSB9CisJCQkJCSBQb3J0UC0+TG9jayA9IFBvcnRTZXR1cC5Mb2NrOworCQkJCQkgUG9ydFAtPlN0b3JlID0gUG9ydFNldHVwLlN0b3JlOworCQkJCQkgUG9ydFAtPlhwcmludC5YcENwcyA9IFBvcnRTZXR1cC5YcENwczsKKwkJCQkJIGJjb3B5KFBvcnRTZXR1cC5YcE9uLFBvcnRQLT5YcHJpbnQuWHBPbixNQVhfWFBfQ1RSTF9MRU4pOworCQkJCQkgYmNvcHkoUG9ydFNldHVwLlhwT2ZmLFBvcnRQLT5YcHJpbnQuWHBPZmYsTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQkJIFBvcnRQLT5YcHJpbnQuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJCQkgUG9ydFAtPlhwcmludC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJCQkgUG9ydFAtPlhwcmludC5YcExlbiA9IFJJT1N0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKworCQkJCQkJCQlSSU9TdHJsZW4oUG9ydFAtPlhwcmludC5YcE9mZik7CisJCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworI2VuZGlmCisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImFmdGVyIGxvb3AgKCVkKSFcbiIsIGxvb3ApOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJldHZhbDoleFxuIiwgcmV0dmFsKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HRVRfUE9SVF9TRVRVUCA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgc2V0dXBcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0U2V0dXAsIHNpemVvZihQb3J0U2V0dXApKSAKKwkJCQkJCQk9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFBvcnRTZXR1cC5Gcm9tID49IFJJT19QT1JUUyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisKKwkJCQlwb3J0ID0gUG9ydFNldHVwLlRvID0gUG9ydFNldHVwLkZyb207CisJCQkJUG9ydFNldHVwLkl4QW55ID0gKHAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJiBSSU9fSVhBTlkpID8gCisJCQkJCQkJCQkJCQkJMSA6IDA7CisJCQkJUG9ydFNldHVwLkl4T24gPSAocC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmIFJJT19JWE9OKSA/IAorCQkJCQkJCQkJCQkJCTEgOiAwOworCQkJCVBvcnRTZXR1cC5EcmFpbiA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX1dBSVREUkFJTikgPworCQkJCQkJCQkJCQkJIAkxIDogMDsKKwkJCQlQb3J0U2V0dXAuU3RvcmUgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+U3RvcmU7CisJCQkJUG9ydFNldHVwLkxvY2sgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+TG9jazsKKwkJCQlQb3J0U2V0dXAuWHBDcHMgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwQ3BzOworCQkJCWJjb3B5KHAtPlJJT1BvcnRwW3BvcnRdLT5YcHJpbnQuWHBPbiwgUG9ydFNldHVwLlhwT24sCisJCQkJCQkJCQkJCQkJTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQliY29weShwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwT2ZmLCBQb3J0U2V0dXAuWHBPZmYsCisJCQkJCQkJCQkJCQkJTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQlQb3J0U2V0dXAuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJCVBvcnRTZXR1cC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCisJCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZQb3J0U2V0dXAsKGludClhcmcsc2l6ZW9mKFBvcnRTZXR1cCkpCisJCQkJCQkJCQkJCQkJCT09Q09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0dFVF9QT1JUX1BBUkFNUyA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgcGFyYW1zXG4iKTsKKwkJCQlpZiAoY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRQYXJhbXMsCisJCQkJCXNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmIChQb3J0UGFyYW1zLlBvcnQgPj0gUklPX1BPUlRTKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0UGFyYW1zLlBvcnRdKTsKKwkJCQlQb3J0UGFyYW1zLkNvbmZpZyA9IFBvcnRQLT5Db25maWc7CisJCQkJUG9ydFBhcmFtcy5TdGF0ZSA9IFBvcnRQLT5TdGF0ZTsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJQb3J0ICVkXG4iLCBQb3J0UGFyYW1zLlBvcnQpOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRQYXJhbXMsIChpbnQpYXJnLCAKKwkJCQkJCXNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HRVRfUE9SVF9UVFkgOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBwb3J0IHR0eVxuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRUdHksIHNpemVvZihzdHJ1Y3QgUG9ydFR0eSkpIAorCQkJCQkJPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFBvcnRUdHkucG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUG9ydCAlZFxuIiwgUG9ydFR0eS5wb3J0KTsKKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKKyNpZiAwCisJCQkJUG9ydFR0eS5UdHkudG0uY19pZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2lmbGFnOworCQkJCVBvcnRUdHkuVHR5LnRtLmNfb2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19vZmxhZzsKKwkJCQlQb3J0VHR5LlR0eS50bS5jX2NmbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfY2ZsYWc7CisJCQkJUG9ydFR0eS5UdHkudG0uY19sZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2xmbGFnOworI2VuZGlmCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRUdHksIChpbnQpYXJnLCAKKwkJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX1BPUlRfVFRZIDoKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFR0eSwgCisJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldCBwb3J0ICVkIHR0eVxuIiwgUG9ydFR0eS5wb3J0KTsKKwkJCQlpZiAoUG9ydFR0eS5wb3J0ID49ICh1c2hvcnQpIFJJT19QT1JUUykgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKKyNpZiAwCisJCSAJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlQb3J0UC0+VHR5UC0+dG0uY19pZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfaWZsYWc7CisJCQkJUG9ydFAtPlR0eVAtPnRtLmNfb2ZsYWcgPSBQb3J0VHR5LlR0eS50bS5jX29mbGFnOworCQkJCVBvcnRQLT5UdHlQLT50bS5jX2NmbGFnID0gUG9ydFR0eS5UdHkudG0uY19jZmxhZzsKKwkJCQlQb3J0UC0+VHR5UC0+dG0uY19sZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfbGZsYWc7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKyNlbmRpZgorCisJCQkJUklPUGFyYW0oUG9ydFAsIENPTkZJRywgUG9ydFAtPlN0YXRlICYgUklPX01PREVNLCBPS19UT19TTEVFUCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX1BPUlRfUEFSQU1TIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXQgcG9ydCBwYXJhbXNcbiIpOworCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFBhcmFtcywgc2l6ZW9mKFBvcnRQYXJhbXMpKQorCQkJCQk9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoUG9ydFBhcmFtcy5Qb3J0ID49ICh1c2hvcnQpIFJJT19QT1JUUykgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0UGFyYW1zLlBvcnRdKTsKKwkJIAkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCVBvcnRQLT5Db25maWcgPSBQb3J0UGFyYW1zLkNvbmZpZzsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0dFVF9QT1JUX1NUQVRTIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX1BPUlRfU1RBVFNcbiIpOworCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcG9ydFN0YXRzLCAKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG9ydFN0YXRzKSkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRTdGF0cy5wb3J0XSk7CisJCQkJcG9ydFN0YXRzLmdhdGhlciA9IFBvcnRQLT5zdGF0c0dhdGhlcjsKKwkJCQlwb3J0U3RhdHMudHhjaGFycyA9IFBvcnRQLT50eGNoYXJzOworCQkJCXBvcnRTdGF0cy5yeGNoYXJzID0gUG9ydFAtPnJ4Y2hhcnM7CisJCQkJcG9ydFN0YXRzLm9wZW5zID0gUG9ydFAtPm9wZW5zOworCQkJCXBvcnRTdGF0cy5jbG9zZXMgPSBQb3J0UC0+Y2xvc2VzOworCQkJCXBvcnRTdGF0cy5pb2N0bHMgPSBQb3J0UC0+aW9jdGxzOworCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmcG9ydFN0YXRzLCAoaW50KWFyZywgCisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwb3J0U3RhdHMpKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fUkVTRVRfUE9SVF9TVEFUUyA6CisJCQkJcG9ydCA9ICh1aW50KSBhcmc7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU0VUX1BPUlRfU1RBVFNcbiIpOworCQkJCWlmICggcG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRdKTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJUG9ydFAtPnR4Y2hhcnMJPSAwOworCQkJCVBvcnRQLT5yeGNoYXJzCT0gMDsKKwkJCQlQb3J0UC0+b3BlbnMJPSAwOworCQkJCVBvcnRQLT5jbG9zZXMJPSAwOworCQkJCVBvcnRQLT5pb2N0bHMJPSAwOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0dBVEhFUl9QT1JUX1NUQVRTIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0FUSEVSX1BPUlRfU1RBVFNcbiIpOworCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJnBvcnRTdGF0cywgCisJCQkJCQlzaXplb2Yoc3RydWN0IHBvcnRTdGF0cykpID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmICggcG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0U3RhdHMucG9ydF0pOworCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlQb3J0UC0+c3RhdHNHYXRoZXIgPSBwb3J0U3RhdHMuZ2F0aGVyOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworI2lmZGVmIERFQlVHX1NVUFBPUlRFRAorCQkJY2FzZSBSSU9fUkVBRF9MRVZFTFM6CisJCQkJeworCQkJCQkgaW50IG51bTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX0xFVkVMU1xuIik7CisJCQkJCSBmb3IgKCBudW09MDsgUklPRGJJbmZbbnVtXS5GbGFnOyBudW0rKyApIDsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIiVkIGxldmVscyB0byBjb3B5XG4iLG51bSk7CisJCQkJCSBpZiAoY29weW91dCgoY2FkZHJfdClSSU9EYkluZiwoaW50KWFyZywKKwkJCQkJCXNpemVvZihzdHJ1Y3QgRGJJbmYpKihudW0rMSkpPT1DT1BZRkFJTCkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVhZExldmVscyBDb3B5IGZhaWxlZFxuIik7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCSB9CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICIlZCBsZXZlbHMgdG8gY29waWVkXG4iLG51bSk7CisJCQkJCSByZXR1cm4gcmV0dmFsOworCQkJCX0KKyNlbmRpZgorCisJCQkgY2FzZSBSSU9fUkVBRF9DT05GSUc6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFQURfQ09ORklHXG4iKTsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPQ29uZiwgKGludClhcmcsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgQ29uZikpID09Q09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NFVF9DT05GSUc6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9DT05GSUdcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJIHJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcC0+UklPQ29uZiwgc2l6ZW9mKHN0cnVjdCBDb25mKSApCisJCQkJCQk9PUNPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCS8qCisJCQkJKiogbW92ZSBhIGZldyB2YWx1ZSBhcm91bmQKKwkJCQkqLworCQkJCWZvciAoSG9zdD0wOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJCQkJIGlmICggKHAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSA9PSBSQ19SVU5OSU5HICkKKwkJCQkJIAlXV09SRChwLT5SSU9Ib3N0c1tIb3N0XS5QYXJtTWFwUC0+dGltZXIgLCAKKwkJCQkJCQkJcC0+UklPQ29uZi5UaW1lcik7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU1RBUlRfUE9MTEVSOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TVEFSVF9QT0xMRVJcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIFJJT19TVE9QX1BPTExFUjoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RPUF9QT0xMRVJcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJIHJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCXAtPlJJT1BvbGxpbmcgPSBOT1RfUE9MTElORzsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRERUJVRzoKKwkJCWNhc2UgUklPX0dFVERFQlVHOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRERUJVRy9SSU9fR0VUREVCVUdcbiIpOworCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJkRlYnVnQ3RybCwgc2l6ZW9mKERlYnVnQ3RybCkgKQorCQkJCQkJCT09Q09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBEZWJ1Z0N0cmwuU3lzUG9ydCA9PSBOT19QT1JUICkgeworCQkJCQlpZiAoIGNtZCA9PSBSSU9fU0VUREVCVUcgKSB7CisJCQkJCQlpZiAoICFzdSApIHsKKwkJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQkJCXJldHVybiAtRVBFUk07CisJCQkJCQl9CisJCQkJCQlwLT5yaW9fZGVidWcgPSBEZWJ1Z0N0cmwuRGVidWc7CisJCQkJCQlwLT5SSU9EZWJ1Z1dhaXQgPSBEZWJ1Z0N0cmwuV2FpdDsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldCBnbG9iYWwgZGVidWcgdG8gMHgleCBzZXQgd2FpdCB0byAweCV4XG4iLAorCQkJCQkJCXAtPnJpb19kZWJ1ZyxwLT5SSU9EZWJ1Z1dhaXQpOworCQkJCQl9CisJCQkJIAllbHNlIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBnbG9iYWwgZGVidWcgMHgleCB3YWl0IDB4JXhcbiIsCisJCQkJCQkJCQkJcC0+cmlvX2RlYnVnLHAtPlJJT0RlYnVnV2FpdCk7CisJCQkJCQlEZWJ1Z0N0cmwuRGVidWcgPSBwLT5yaW9fZGVidWc7CisJCQkJCQlEZWJ1Z0N0cmwuV2FpdCAgPSBwLT5SSU9EZWJ1Z1dhaXQ7CisJCQkJCQlpZiAoIGNvcHlvdXQoKGNhZGRyX3QpJkRlYnVnQ3RybCwoaW50KWFyZywKKwkJCQkJCQkJc2l6ZW9mKERlYnVnQ3RybCkpID09IENPUFlGQUlMICkgeworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVQvR0VUIERFQlVHOiBiYWQgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQlEZWJ1Z0N0cmwuU3lzUG9ydCk7CisJCQkJCQkgCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCQkgCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKCBEZWJ1Z0N0cmwuU3lzUG9ydCA+PSBSSU9fUE9SVFMgJiYgCisJCQkJCQkJRGVidWdDdHJsLlN5c1BvcnQgIT0gTk9fUE9SVCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVQvR0VUIERFQlVHOiBiYWQgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQlEZWJ1Z0N0cmwuU3lzUG9ydCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWVsc2UgaWYgKCBjbWQgPT0gUklPX1NFVERFQlVHICkgeworCQkJCQlpZiAoICFzdSApIHsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQl9CisJCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1ZyA9IERlYnVnQ3RybC5EZWJ1ZzsKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVERFQlVHIDB4JXhcbiIsCisJCQkJCQkJCXAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWcpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVERFQlVHIDB4JXhcbiIsCisJCQkJCQkJCQkgcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1Zyk7CisJCQkJCURlYnVnQ3RybC5EZWJ1ZyA9IHAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWc7CisJCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmRGVidWdDdHJsLChpbnQpYXJnLAorCQkJCQkJCQlzaXplb2YoRGVidWdDdHJsKSk9PUNPUFlGQUlMICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVERFQlVHOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19WRVJTSUQ6CisJCQkJLyoKKwkJCQkqKiBFbnF1aXJlIGFib3V0IHRoZSByZWxlYXNlIGFuZCB2ZXJzaW9uLgorCQkJCSoqIFdlIHJldHVybiBNQVhfVkVSU0lPTl9MRU4gYnl0ZXMsIGJlaW5nIGEKKwkJCQkqKiB0ZXh0dWFsIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCisJCQkJKi8KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fVkVSU0lEXG4iKTsKKwkJCQlpZiAoIGNvcHlvdXQoCShjYWRkcl90KVJJT1ZlcnNpZCgpLAorCQkJCQkJKGludClhcmcsCisJCQkJCQlzaXplb2Yoc3RydWN0IHJpb1ZlcnNpb24pICkgPT0gQ09QWUZBSUwgKQorCQkJCXsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgICJSSU9fVkVSU0lEOiBCYWQgY29weSB0byB1c2VyIHNwYWNlIChob3N0PSVkKVxuIiwgSG9zdCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCS8qCisJCQkqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCQkqKiAhISBjb21tZW50ZWQgb3V0IHByZXZpb3VzICdSSU9fVkVSU0lEJyBmdW5jdGlvbmFsaXR5ICEhCisJCQkqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCQkqKgorCQkJY2FzZSBSSU9fVkVSU0lEOgorCQkJCSoqCisJCQkJKiogRW5xdWlyZSBhYm91dCB0aGUgcmVsZWFzZSBhbmQgdmVyc2lvbi4KKwkJCQkqKiBXZSByZXR1cm4gTUFYX1ZFUlNJT05fTEVOIGJ5dGVzLCBiZWluZyBhIHRleHR1YWwgbnVsbAorCQkJCSoqIHRlcm1pbmF0ZWQgc3RyaW5nLgorCQkJCSoqCisJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJSSU9fVkVSU0lEXG4iKSk7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpUklPVmVyc2lkKCksIAorCQkJCQkJKGludClhcmcsIE1BWF9WRVJTSU9OX0xFTiApID09IENPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJSSU9fVkVSU0lEOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iLEhvc3QpKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCSoqCisJCQkqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCQkqLworCisJCQljYXNlIFJJT19OVU1fSE9TVFM6CisJCQkJLyoKKwkJCQkqKiBFbnF1aXJlIGFzIHRvIHRoZSBudW1iZXIgb2YgaG9zdHMgbG9jYXRlZAorCQkJCSoqIGF0IGluaXQgdGltZS4KKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19OVU1fSE9TVFNcbiIpOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9OdW1Ib3N0cywgKGludClhcmcsIAorCQkJCQkJCXNpemVvZihwLT5SSU9OdW1Ib3N0cykgKT09Q09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTlVNX0hPU1RTOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fSE9TVF9GT0FEOgorCQkJCS8qCisJCQkJKiogS2lsbCBob3N0LiBUaGlzIG1heSBub3QgYmUgaW4gdGhlIGZpbmFsIHZlcnNpb24uLi4KKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0ZPQUQgJWRcbiIsIChpbnQpYXJnKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0ZPQUQ6IE5vdCBzdXBlciB1c2VyXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCSByZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlwLT5SSU9IYWx0ZWQgPSAxOworCQkJCXAtPlJJT1N5c3RlbVVwID0gMDsKKworCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQkJCQkgKHZvaWQpUklPQm9hcmRUZXN0KCBwLT5SSU9Ib3N0c1tIb3N0XS5QYWRkclAsIAorCQkJCQkJcC0+UklPSG9zdHNbSG9zdF0uQ2FkZHIsIHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUsIAorCQkJCQkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5TbG90ICk7CisJCQkJCSBiemVybyggKGNhZGRyX3QpJnAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzLCAKKwkJCQkJCQkoKGludCkmcC0+UklPSG9zdHNbSG9zdF0uX19fX2VuZF9tYXJrZXJfX19fKSAtCisJCQkJCQkJCSAoKGludCkmcC0+UklPSG9zdHNbSG9zdF0uRmxhZ3MpICk7CisJCQkJCSBwLT5SSU9Ib3N0c1tIb3N0XS5GbGFncyAgPSBSQ19XQUlUSU5HOworI2lmIDAKKwkJCQkJIFJJT1NldHVwRGF0YVN0cnVjdHMocCk7CisjZW5kaWYKKwkJCQl9CisJCQkJUklPRm9hZFdha2V1cChwKTsKKwkJCQlwLT5SSU9OdW1Cb290UGt0cyA9IDA7CisJCQkJcC0+UklPQm9vdGluZyA9IDA7CisKKyNpZmRlZiBSSU5HQlVGRkVSX1NVUFBPUlQKKwkJCQlmb3IoIGxvb3A9MDsgbG9vcDxSSU9fUE9SVFM7IGxvb3ArKyApCisJCQkJCWlmICggcC0+UklPUG9ydHBbbG9vcF0tPlR4UmluZ0J1ZmZlciApCisJCQkJCQlzeXNmcmVlKCh2b2lkICopcC0+UklPUG9ydHBbbG9vcF0tPlR4UmluZ0J1ZmZlciwgCisJCQkJCQkJUklPQnVmZmVyU2l6ZSApOworI2VuZGlmCisjaWYgMAorCQkJCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Qb3J0cFswXSxSSU9fUE9SVFMqc2l6ZW9mKHN0cnVjdCBQb3J0KSk7CisjZWxzZQorCQkJCXByaW50ayAoIkhFRUVFRUxQIVxuIik7CisjZW5kaWYKKworCQkJCWZvciggbG9vcD0wOyBsb29wPFJJT19QT1JUUzsgbG9vcCsrICkgeworI2lmIDAKKwkJCQkJcC0+UklPUG9ydHBbbG9vcF0tPlR0eVAgPSAmcC0+Y2hhbm5lbFtsb29wXTsKKyNlbmRpZgorCQkJCQkKKwkJCQkJc3Bpbl9sb2NrX2luaXQoJnAtPlJJT1BvcnRwW2xvb3BdLT5wb3J0U2VtKTsKKwkJCQkJcC0+UklPUG9ydHBbbG9vcF0tPkluVXNlID0gTk9UX0lOVVNFOworCQkJCX0KKworCQkJCXAtPlJJT1N5c3RlbVVwID0gMDsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19ET1dOTE9BRDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRE9XTkxPQURcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEOiBOb3Qgc3VwZXIgdXNlclxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQkgcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKCBjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZEb3duTG9hZCwgCisJCQkJCQkJc2l6ZW9mKERvd25Mb2FkKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRDogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3BpZWQgaW4gZG93bmxvYWQgY29kZSBmb3IgcHJvZHVjdCBjb2RlIDB4JXhcbiIsCisJCQkJICAgIERvd25Mb2FkLlByb2R1Y3RDb2RlKTsKKworCQkJCS8qCisJCQkJKiogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHByb2R1Y3QgY29kZSBpcyBhbiB1bnNpZ25lZCBvYmplY3QhCisJCQkJKi8KKwkJCQlpZiAoIERvd25Mb2FkLlByb2R1Y3RDb2RlID4gTUFYX1BST0RVQ1QgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRE9XTkxPQUQ6IEJhZCBwcm9kdWN0IGNvZGUgJWQgcGFzc2VkXG4iLAorCQkJCQkJCURvd25Mb2FkLlByb2R1Y3RDb2RlKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9fU1VDSF9QUk9EVUNUOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJLyoKKwkJCQkqKiBkbyBzb21ldGhpbmchCisJCQkJKi8KKwkJCQlyZXR2YWwgPSAoKihSSU9Cb290VGFibGVbRG93bkxvYWQuUHJvZHVjdENvZGVdKSkocCwgJkRvd25Mb2FkKTsKKwkJCQkJCQkJCQkvKiA8LS0gUGFuaWMgKi8KKwkJCQlwLT5SSU9IYWx0ZWQgPSAwOworCQkJCS8qCisJCQkJKiogYW5kIGdvIGJhY2ssIGNvbnRlbnQgd2l0aCBhIGpvYiB3ZWxsIGNvbXBsZXRlZC4KKwkJCQkqLworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1BBUk1TOgorCQkJCXsKKwkJCQkJdWludCBob3N0OworCisJCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZob3N0LCAKKwkJCQkJCQlzaXplb2YoaG9zdCkgKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgCisJCQkJCQkJIlJJT19IT1NUX1JFUTogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJCS8qCisJCQkJCSoqIEZldGNoIHRoZSBwYXJtbWFwCisJCQkJCSovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QQVJNU1xuIik7CisJCQkJCWlmICggY29weW91dCggKGNhZGRyX3QpcC0+UklPSG9zdHNbaG9zdF0uUGFybU1hcFAsIAorCQkJCQkJCQkoaW50KWFyZywgc2l6ZW9mKFBBUk1fTUFQKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUEFSTVM6IENvcHkgb3V0IHRvIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0hPU1RfUkVROgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUVxuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJkhvc3RSZXEsIAorCQkJCQkJCXNpemVvZihIb3N0UmVxKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUTogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIEhvc3RSZXEuSG9zdE51bSA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVROiBJbGxlZ2FsIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCQkJCUhvc3RSZXEuSG9zdE51bSk7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBob3N0ICVkXG4iLCBIb3N0UmVxLkhvc3ROdW0pOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0hvc3RzW0hvc3RSZXEuSG9zdE51bV0sIAorCQkJCQkoaW50KUhvc3RSZXEuSG9zdFAsc2l6ZW9mKHN0cnVjdCBIb3N0KSApID09IENPUFlGQUlMKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUTogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkgY2FzZSBSSU9fSE9TVF9EUFJBTToKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBEUFJBTVxuIik7CisJCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmSG9zdERwUmFtLCAKKwkJCQkJCQkJc2l6ZW9mKEhvc3REcFJhbSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIEhvc3REcFJhbS5Ib3N0TnVtID49IHAtPlJJT051bUhvc3RzICkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQkJSG9zdERwUmFtLkhvc3ROdW0pOworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBob3N0ICVkXG4iLCBIb3N0RHBSYW0uSG9zdE51bSk7CisKKwkJCQlpZiAocC0+UklPSG9zdHNbSG9zdERwUmFtLkhvc3ROdW1dLlR5cGUgPT0gUklPX1BDSSkgeworCQkJCQkgaW50IG9mZjsKKwkJCQkJIC8qIEl0J3MgaGFyZHdhcmUgbGlrZSB0aGlzIHRoYXQgcmVhbGx5IGdldHMgb24gbXkgdGl0cy4gKi8KKwkJCQkJIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvcHlbc2l6ZW9mKHN0cnVjdCBEcFJhbSldOworCQkJCQlmb3IgKCBvZmY9MDsgb2ZmPHNpemVvZihzdHJ1Y3QgRHBSYW0pOyBvZmYrKyApCisJCQkJCQljb3B5W29mZl0gPSBwLT5SSU9Ib3N0c1tIb3N0RHBSYW0uSG9zdE51bV0uQ2FkZHJbb2ZmXTsKKwkJCQkJaWYgKCBjb3B5b3V0KCAoY2FkZHJfdCljb3B5LCAoaW50KUhvc3REcFJhbS5EcFJhbVAsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgRHBSYW0pICkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoY29weW91dCgoY2FkZHJfdClwLT5SSU9Ib3N0c1tIb3N0RHBSYW0uSG9zdE51bV0uQ2FkZHIsCisJCQkJCShpbnQpSG9zdERwUmFtLkRwUmFtUCwgCisJCQkJCQlzaXplb2Yoc3RydWN0IERwUmFtKSApID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkgY2FzZSBSSU9fU0VUX0JVU1k6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9CVVNZXG4iKTsKKwkJCQlpZiAoIChpbnQpYXJnIDwgMCB8fCAoaW50KWFyZyA+IDUxMSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRfQlVTWTogQmFkIHBvcnQgbnVtYmVyICVkXG4iLChpbnQpYXJnKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlwLT5SSU9Qb3J0cFsoaW50KWFyZ10tPlN0YXRlIHw9IFJJT19CVVNZOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJIGNhc2UgUklPX0hPU1RfUE9SVDoKKwkJCQkvKgorCQkJCSoqIFRoZSBkYWVtb24gd2FudCBwb3J0IGluZm9ybWF0aW9uCisJCQkJKiogKHByb2JhYmx5IGZvciBkZWJ1ZyByZWFzb25zKQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUE9SVFxuIik7CisJCQkJaWYgKCBjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0UmVxLCAKKwkJCQkJc2l6ZW9mKFBvcnRSZXEpICk9PUNPUFlGQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCWlmIChQb3J0UmVxLlN5c1BvcnQgPj0gUklPX1BPUlRTKSB7IC8qIFN5c1BvcnQgaXMgdW5zaWduZWQgKi8KKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1BPUlQ6IElsbGVnYWwgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQkJCVBvcnRSZXEuU3lzUG9ydCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIHBvcnQgJWRcbiIsIFBvcnRSZXEuU3lzUG9ydCk7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpcC0+UklPUG9ydHBbUG9ydFJlcS5TeXNQb3J0XSwgCisJCQkJCQkJIChpbnQpUG9ydFJlcS5Qb3J0UCwKKwkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBQb3J0KSApID09IENPUFlGQUlMKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUE9SVDogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fSE9TVF9SVVA6CisJCQkJLyoKKwkJCQkqKiBUaGUgZGFlbW9uIHdhbnQgcnVwIGluZm9ybWF0aW9uCisJCQkJKiogKHByb2JhYmx5IGZvciBkZWJ1ZyByZWFzb25zKQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQXG4iKTsKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUnVwUmVxLCAKKwkJCQkJCXNpemVvZihSdXBSZXEpICk9PUNPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmIChSdXBSZXEuSG9zdE51bSA+PSBwLT5SSU9OdW1Ib3N0cykgeyAvKiBob3N0IGlzIHVuc2lnbmVkICovCisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCVJ1cFJlcS5Ib3N0TnVtKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJaWYgKCBSdXBSZXEuUnVwTnVtID49IE1BWF9SVVArTElOS1NfUEVSX1VOSVQgKSB7IC8qIGVlayEgKi8KKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUDogSWxsZWdhbCBydXAgbnVtYmVyICVkXG4iLAorCQkJCQkJCVJ1cFJlcS5SdXBOdW0pOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBSVVBfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tSdXBSZXEuSG9zdE51bV07CisKKwkJCQlpZiAoKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORykgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBIb3N0ICVkIG5vdCBydW5uaW5nXG4iLAorCQkJCQkJCVJ1cFJlcS5Ib3N0TnVtKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKKwkJCQkJIHJldHVybiAtRUlPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBydXAgJWQgZnJvbSBob3N0ICVkXG4iLAorCQkJCQkJUnVwUmVxLlJ1cE51bSxSdXBSZXEuSG9zdE51bSk7CisKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdClIb3N0UC0+VW5peFJ1cHNbUnVwUmVxLlJ1cE51bV0uUnVwUCwKKwkJCQkJKGludClSdXBSZXEuUnVwUCxzaXplb2Yoc3RydWN0IFJVUCkgKSA9PSBDT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fSE9TVF9MUEI6CisJCQkJLyoKKwkJCQkqKiBUaGUgZGFlbW9uIHdhbnQgbHBiIGluZm9ybWF0aW9uCisJCQkJKiogKHByb2JhYmx5IGZvciBkZWJ1ZyByZWFzb25zKQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCXG4iKTsKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTHBiUmVxLCAKKwkJCQkJc2l6ZW9mKExwYlJlcSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEJhZCBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKExwYlJlcS5Ib3N0ID49IHAtPlJJT051bUhvc3RzKSB7IC8qIGhvc3QgaXMgdW5zaWduZWQgKi8KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBJbGxlZ2FsIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCQkJCUxwYlJlcS5Ib3N0KTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWlmICggTHBiUmVxLkxpbmsgPj0gTElOS1NfUEVSX1VOSVQgKSB7IC8qIGVlayEgKi8KKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQjogSWxsZWdhbCBsaW5rIG51bWJlciAlZFxuIiwKKwkJCQkJCQlMcGJSZXEuTGluayk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IExJTktfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tMcGJSZXEuSG9zdF07CisKKwkJCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEhvc3QgJWQgbm90IHJ1bm5pbmdcbiIsCisJCQkJCQlMcGJSZXEuSG9zdCApOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOworCQkJCQkgcmV0dXJuIC1FSU87CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIGxwYiAlZCBmcm9tIGhvc3QgJWRcbiIsCisJCQkJCUxwYlJlcS5MaW5rLCBMcGJSZXEuSG9zdCk7CisKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmSG9zdFAtPkxpbmtTdHJQW0xwYlJlcS5MaW5rXSwKKwkJCQkJKGludClMcGJSZXEuTHBiUCxzaXplb2Yoc3RydWN0IExQQikgKSA9PSBDT1BZRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJCS8qCisJCQkJKiogSGVyZSAzIElPQ1RMJ3MgdGhhdCBhbGxvdyB1cyB0byBjaGFuZ2UgdGhlIHdheSBpbiB3aGljaAorCQkJCSoqIHJpbyBsb2dzIGVycm9ycy4gc2VuZCB0aGVtIGp1c3QgdG8gc3lzbG9nIG9yIHNlbmQgdGhlbQorCQkJCSoqIHRvIGJvdGggc3lzbG9nIGFuZCBjb25zb2xlIG9yIHNlbmQgdGhlbSB0byBqdXN0IHRoZSBjb25zb2xlLgorCQkJCSoqCisJCQkJKiogU2VlIFJpb1N0ckJ1ZigpIGluIHV0aWwuYyBmb3IgdGhlIG90aGVyIGhhbGYuCisJCQkJKi8KKwkJCWNhc2UgUklPX1NZU0xPR19PTkxZOgorCQkJCXAtPlJJT1ByaW50TG9nU3RhdGUgPSBQUklOVF9UT19MT0c7CS8qIEp1c3Qgc3lzbG9nICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1NZU0xPR19DT05TOgorCQkJCXAtPlJJT1ByaW50TG9nU3RhdGUgPSBQUklOVF9UT19MT0dfQ09OUzsvKiBzeXNsb2cgYW5kIGNvbnNvbGUgKi8KKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fQ09OU19PTkxZOgorCQkJCXAtPlJJT1ByaW50TG9nU3RhdGUgPSBQUklOVF9UT19DT05TOwkvKiBKdXN0IGNvbnNvbGUgKi8KKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fU0lHTkFMU19PTjoKKwkJCQlpZiAoIHAtPlJJT1NpZ25hbFByb2Nlc3MgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFNJR05BTFNfQUxSRUFEWV9TRVQ7CisJCQkJCSByZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCQlwLT5SSU9TaWduYWxQcm9jZXNzID0gZ2V0cGlkKCk7CisJCQkJcC0+UklPUHJpbnREaXNhYmxlZCA9IERPTlRfUFJJTlQ7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0lHTkFMU19PRkY6CisJCQkJaWYgKCBwLT5SSU9TaWduYWxQcm9jZXNzICE9IGdldHBpZCgpICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfUkVDRUlWSU5HX1BST0NFU1M7CisJCQkJCSByZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDbGVhciBzaWduYWwgcHJvY2VzcyB0byB6ZXJvXG4iKTsKKwkJCQlwLT5SSU9TaWduYWxQcm9jZXNzID0gMDsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfQllURV9NT0RFOgorCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkKKwkJCQkJIGlmICggcC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQgKQorCQkJCQkJIHAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgJj0gfldPUkRfT1BFUkFUSU9OOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NFVF9XT1JEX01PREU6CisJCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQorCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCisJCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSB8PSBXT1JEX09QRVJBVElPTjsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfRkFTVF9CVVM6CisJCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQorCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCisJCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSB8PSBGQVNUX0FUX0JVUzsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfU0xPV19CVVM6CisJCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQorCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCisJCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSAmPSB+RkFTVF9BVF9CVVM7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fTUFQX0I1MF9UT181MDoKKwkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTc2MDA6CisJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTA6CisJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTUyMDA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmdcbiIpOworCQkJCXBvcnQgPSAodWludCkgYXJnOworCQkJCWlmICggcG9ydCA8IDAgfHwgcG9ydCA+IDUxMSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkJhdWQgcmF0ZSBtYXBwaW5nOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsIHBvcnQpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXN3aXRjaCggY21kICkKKwkJCQl7CisJCQkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTAgOgorCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyB8PSBSSU9fTUFQXzUwX1RPXzUwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTc2MDAgOgorCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmPSB+UklPX01BUF81MF9UT181MDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTAgOgorCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyB8PSBSSU9fTUFQXzExMF9UT18xMTA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBSSU9fTUFQX0IxMTBfVE9fMTE1MjAwIDoKKwkJCQkJCXAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJj0gflJJT19NQVBfMTEwX1RPXzExMDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NUUkVBTV9JTkZPOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TVFJFQU1fSU5GT1xuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWNhc2UgUklPX1NFTkRfUEFDS0VUOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRU5EX1BBQ0tFVFxuIik7CisJCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmU2VuZFBhY2ssCisJCQkJCQkJCQlzaXplb2YoU2VuZFBhY2spICk9PUNPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFTkRfUEFDS0VUOiBCYWQgY29weSBmcm9tIHVzZXIgc3BhY2VcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmICggU2VuZFBhY2suUG9ydE51bSA+PSAxMjggKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCisJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTZW5kUGFjay5Qb3J0TnVtXTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlpZiAoICFjYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLFBvcnRQKSApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gVU5JVF9JU19JTl9VU0U7CisJCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCQkgcmV0dXJuIC1FTk9TUEM7CisJCQkJfQorCisJCQkJZm9yICggbG9vcD0wOyBsb29wPCh1c2hvcnQpKFNlbmRQYWNrLkxlbiAmIDEyNyk7IGxvb3ArKyApCisJCQkJCSBXQllURShQYWNrZXRQLT5kYXRhW2xvb3BdLCBTZW5kUGFjay5EYXRhW2xvb3BdICk7CisKKwkJCQlXQllURShQYWNrZXRQLT5sZW4sIFNlbmRQYWNrLkxlbik7CisKKwkJCQlhZGRfdHJhbnNtaXQoIFBvcnRQICk7CisJCQkJLyoKKwkJCQkqKiBDb3VudCBjaGFyYWN0ZXJzIHRyYW5zbWl0dGVkIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJCQkJKi8KKwkJCQlpZiAoUG9ydFAtPnN0YXRzR2F0aGVyKQorCQkJCQkgUG9ydFAtPnR4Y2hhcnMgKz0gKFNlbmRQYWNrLkxlbiAmIDEyNyk7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19OT19NRVNHOgorCQkJCWlmICggc3UgKQorCQkJCQkgcC0+UklPTm9NZXNzYWdlID0gMTsKKwkJCQlyZXR1cm4gc3UgPyAwIDogLUVQRVJNOworCisJCQljYXNlIFJJT19NRVNHOgorCQkJCWlmICggc3UgKQorCQkJCQlwLT5SSU9Ob01lc3NhZ2UgPSAwOworCQkJCXJldHVybiBzdSA/IDAgOiAtRVBFUk07CisKKwkJCWNhc2UgUklPX1dIQVRfTUVTRzoKKwkJCQlpZiAoIGNvcHlvdXQoIChjYWRkcl90KSZwLT5SSU9Ob01lc3NhZ2UsIChpbnQpYXJnLCAKKwkJCQkJc2l6ZW9mKHAtPlJJT05vTWVzc2FnZSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19XSEFUX01FU0c6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX01FTV9EVU1QIDoKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmU3ViQ21kLCAKKwkJCQkJCXNpemVvZihzdHJ1Y3QgU3ViQ21kU3RydWN0KSkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgaG9zdCAlZCBydXAgJWQgYWRkciAleFxuIiwgCisJCQkJCQlTdWJDbWQuSG9zdCwgU3ViQ21kLlJ1cCwgU3ViQ21kLkFkZHIpOworCisJCQkJaWYgKFN1YkNtZC5SdXAgPj0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUlVQX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpZiAoU3ViQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uCisJCQkJCQkJCVVuaXhSdXBzW1N1YkNtZC5SdXBdLkJhc2VTeXNQb3J0OworCisJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKworCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCQkJCWlmICggUklPUHJlZW1wdGl2ZUNtZChwLCAgUG9ydFAsIE1FTURVTVAgKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19NRU1fRFVNUCBmYWlsZWRcbiIpOworCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQkJIHJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJIFBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJaWYgKCBjb3B5b3V0KCAoY2FkZHJfdClwLT5SSU9NZW1EdW1wLCAoaW50KWFyZywgCisJCQkJCQkJTUVNRFVNUF9TSVpFKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19NRU1fRFVNUCBjb3B5IGZhaWxlZFxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19USUNLOgorCQkJCWlmICgoaW50KWFyZyA8IDAgfHwgKGludClhcmcgPj0gcC0+UklPTnVtSG9zdHMpCisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXQgaW50ZXJydXB0IGZvciBob3N0ICVkXG4iLCAoaW50KWFyZyk7CisJCQkJV0JZVEUocC0+UklPSG9zdHNbKGludClhcmddLlNldEludCAsIDB4ZmYpOworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19UT0NLOgorCQkJCWlmICgoaW50KWFyZyA8IDAgfHwgKGludClhcmcgPj0gcC0+UklPTnVtSG9zdHMpCisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDbGVhciBpbnRlcnJ1cHQgZm9yIGhvc3QgJWRcbiIsIChpbnQpYXJnKTsKKwkJCQlXQllURSgocC0+UklPSG9zdHNbKGludClhcmddLlJlc2V0SW50KSAsIDB4ZmYpOworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19SRUFEX0NIRUNLOgorCQkJCS8qIENoZWNrIHJlYWRzIGZvciBwa3RzIHdpdGggZGF0YVswXSB0aGUgc2FtZSAqLworCQkJCXAtPlJJT1JlYWRDaGVjayA9ICFwLT5SSU9SZWFkQ2hlY2s7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT1JlYWRDaGVjaywoaW50KWFyZywKKwkJCQkJCQlzaXplb2YodWludCkpPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1JFQURfUkVHSVNURVIgOgorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZTdWJDbWQsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgU3ViQ21kU3RydWN0KSkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBob3N0ICVkIHJ1cCAlZCBwb3J0ICVkIHJlZyAleFxuIiwgCisJCQkJCQlTdWJDbWQuSG9zdCwgU3ViQ21kLlJ1cCwgU3ViQ21kLlBvcnQsIFN1YkNtZC5BZGRyKTsKKworCQkJCWlmIChTdWJDbWQuUG9ydCA+IDUxMSkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmc6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgCisJCQkJCQkJCVN1YkNtZC5Qb3J0KTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJaWYgKFN1YkNtZC5SdXAgPj0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUlVQX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpZiAoU3ViQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uCisJCQkJCQlVbml4UnVwc1tTdWJDbWQuUnVwXS5CYXNlU3lzUG9ydCArIFN1YkNtZC5Qb3J0OworCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgUkVBRF9SRUdJU1RFUikgPT0gUklPX0ZBSUwpIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX1JFR0lTVEVSIGZhaWxlZFxuIik7CisJCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCQkgcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQkgUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+Q2RSZWdpc3RlciwgKGludClhcmcsIAorCQkJCQkJCXNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBjb3B5IGZhaWxlZFxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJCS8qCisJCQkJKiogcmlvX21ha2VfZGV2OiBnaXZlbiBwb3J0IG51bWJlciAoMC01MTEpIE9SZWQgd2l0aCBwb3J0IHR5cGUKKwkJCQkqKiAoUklPX0RFVl9ESVJFQ1QsIFJJT19ERVZfTU9ERU0sIFJJT19ERVZfWFBSSU5UKSByZXR1cm4gZGV2X3QKKwkJCQkqKiB2YWx1ZSB0byBwYXNzIHRvIG1rbm9kIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBkZXZpY2Ugbm9kZS4KKwkJCQkqLworCQkJY2FzZSBSSU9fTUFLRV9ERVY6CisJCQkJeworCQkJCQl1aW50IHBvcnQgPSAodWludClhcmcgJiBSSU9fTU9ERU1fTUFTSzsKKworCQkJCQlzd2l0Y2ggKCAodWludClhcmcgJiBSSU9fREVWX01BU0sgKSB7CisJCQkJCQljYXNlIFJJT19ERVZfRElSRUNUOgorCQkJCQkJCWFyZyA9IChjYWRkcl90KWRydl9tYWtlZGV2KE1BSk9SKGRldiksIHBvcnQpOworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1ha2VkZXYgZGlyZWN0IDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7CisJCQkJCQkJcmV0dXJuIChpbnQpYXJnOworCQkJCQkgCWNhc2UgUklPX0RFVl9NT0RFTToKKwkJCQkJCQlhcmcgPSAgKGNhZGRyX3QpZHJ2X21ha2VkZXYoTUFKT1IoZGV2KSwgKHBvcnR8UklPX01PREVNX0JJVCkgKTsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IG1vZGVtIDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7CisJCQkJCQkJcmV0dXJuIChpbnQpYXJnOworCQkJCQkJY2FzZSBSSU9fREVWX1hQUklOVDoKKwkJCQkJCQlhcmcgPSAoY2FkZHJfdClkcnZfbWFrZWRldihNQUpPUihkZXYpLCBwb3J0KTsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IHByaW50ZXIgMHgleCBpcyAweCV4XG4iLHBvcnQsIChpbnQpYXJnKTsKKwkJCQkJCQlyZXR1cm4gKGludClhcmc7CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTUFLRSBEZXZpY2UgaXMgY2FsbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qCisJCQkJKiogcmlvX21pbm9yOiBnaXZlbiBhIGRldl90IGZyb20gYSBzdGF0KCkgY2FsbCwgcmV0dXJuCisJCQkJKiogdGhlIHBvcnQgbnVtYmVyICgwLTUxMSkgT1JlZCB3aXRoIHRoZSBwb3J0IHR5cGUKKwkJCQkqKiAoIFJJT19ERVZfRElSRUNULCBSSU9fREVWX01PREVNLCBSSU9fREVWX1hQUklOVCApCisJCQkJKi8KKwkJCWNhc2UgUklPX01JTk9SOgorCQkJCXsKKwkJCQkJZGV2X3QgZHY7CisJCQkJCWludCBtaW5vOworCisJCQkJCWR2ID0gKGRldl90KSgoaW50KWFyZyk7CisJCQkJCW1pbm8gPSBSSU9fVU5NT0RFTShkdik7CisKKwkJCQkJaWYgKCBSSU9fSVNNT0RFTShkdikgKSB7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNaW5vciBmb3IgZGV2aWNlIDB4JXg6IG1vZGVtICVkXG4iLCBkdiwgbWlubyk7CisJCQkJCQlhcmcgPSAoY2FkZHJfdCkobWlubyB8IFJJT19ERVZfTU9ERU0pOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWlub3IgZm9yIGRldmljZSAweCV4OiBkaXJlY3QgJWRcbiIsIGR2LCBtaW5vKTsKKwkJCQkJCWFyZyA9IChjYWRkcl90KShtaW5vIHwgUklPX0RFVl9ESVJFQ1QpOworCQkJCQl9CisJCQkJCXJldHVybiAoaW50KWFyZzsKKwkJCQl9CisJfQorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIklOVkFMSUQgREFFTU9OIElPQ1RMIDB4JXhcbiIsY21kKTsKKwlwLT5SSU9FcnJvci5FcnJvciA9IElPQ1RMX0NPTU1BTkRfVU5LTk9XTjsKKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyoqIFByZS1lbXB0aXZlIGNvbW1hbmRzIGdvIG9uIFJVUHMgYW5kIGFyZSBvbmx5IG9uZSBieXRlIGxvbmcuCisqLworaW50CitSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBDbWQpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IFBvcnQgKlBvcnRQOwordWNoYXIgQ21kOworeworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisJc3RydWN0IFBrdENtZF9NICpQa3RDbWRQOworCWludCBSZXQ7CisJdXNob3J0IHJ1cDsKKwlpbnQgcG9ydDsKKworI2lmZGVmIENIRUNLCisJQ2hlY2tQb3J0UCggUG9ydFAgKTsKKyNlbmRpZgorCisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUHJlZW1wdGl2ZSBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJaWYgKCgoaW50KSgoY2hhcilQb3J0UC0+SW5Vc2UpID09IC0xKSB8fCAhIChDbWRCbGtQID0gUklPR2V0Q21kQmxrKCkpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDYW5ub3QgYWxsb2NhdGUgY29tbWFuZCBibG9jayBmb3IgY29tbWFuZCAlZCBvbiBwb3J0ICVkXG4iLAorCQkgICAgICAgQ21kLCBQb3J0UC0+UG9ydE51bSk7CisJCXJldHVybiBSSU9fRkFJTDsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb21tYW5kIGJsayAweCV4IC0gSW5Vc2Ugbm93ICVkXG4iLCAKKwkgICAgICAgKGludClDbWRCbGtQLFBvcnRQLT5JblVzZSk7CisKKwlQa3RDbWRQID0gKHN0cnVjdCBQa3RDbWRfTSAqKSZDbWRCbGtQLT5QYWNrZXQuZGF0YVswXTsKKworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCWlmIChQb3J0UC0+U2Vjb25kQmxvY2spCisJCXJ1cCA9IFBvcnRQLT5JRDI7CisJZWxzZQorCQlydXAgPSBQb3J0UC0+UnVwTnVtOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBydXA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IENPTU1BTkRfUlVQOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBDT01NQU5EX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuCSAgPSBQS1RfQ01EX0JJVCB8IDI7CisJQ21kQmxrUC0+UG9zdEZ1bmNQCT0gUklPVW5Vc2U7CisJQ21kQmxrUC0+UG9zdEFyZwk9IChpbnQpUG9ydFA7CisJUGt0Q21kUC0+Q29tbWFuZAk9IENtZDsKKwlwb3J0CQkJCT0gUG9ydFAtPkhvc3RQb3J0ICUgKHVzaG9ydClQT1JUU19QRVJfUlRBOworCS8qCisJKiogSW5kZXggcG9ydHMgOC0xNSBmb3IgMm5kIGJsb2NrIG9mIDE2IHBvcnQgUlRBLgorCSovCisJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykKKwkJcG9ydCArPSAodXNob3J0KSBQT1JUU19QRVJfUlRBOworCVBrdENtZFAtPlBoYk51bQkgICA9IHBvcnQ7CisKKwlzd2l0Y2ggKCBDbWQgKSB7CisJCWNhc2UgTUVNRFVNUDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIE1FTURVTVAgY29tbWFuZCBibGsgMHgleCAoYWRkciAweCV4KVxuIiwKKwkJCSAgICAgICAoaW50KUNtZEJsa1AsIChpbnQpU3ViQ21kLkFkZHIpOworCQkJUGt0Q21kUC0+U3ViQ29tbWFuZAkJPSBNRU1EVU1QOworCQkJUGt0Q21kUC0+U3ViQWRkcgkJPSBTdWJDbWQuQWRkcjsKKwkJCWJyZWFrOworCQljYXNlIEZDTE9TRToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIEZDTE9TRSBjb21tYW5kIGJsayAweCV4XG4iLChpbnQpQ21kQmxrUCk7CisJCQlicmVhazsKKwkJY2FzZSBSRUFEX1JFR0lTVEVSOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgUkVBRF9SRUdJU1RFUiAoMHgleCkgY29tbWFuZCBibGsgMHgleFxuIiwKKwkJIAkJKGludClTdWJDbWQuQWRkciwgKGludClDbWRCbGtQKTsKKwkJCVBrdENtZFAtPlN1YkNvbW1hbmQJCT0gUkVBRF9SRUdJU1RFUjsKKwkJCVBrdENtZFAtPlN1YkFkZHIJCT0gU3ViQ21kLkFkZHI7CisJCQlicmVhazsKKwkJY2FzZSBSRVNVTUU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBSRVNVTUUgY29tbWFuZCBibGsgMHgleFxuIiwoaW50KUNtZEJsa1ApOworCQkJYnJlYWs7CisJCWNhc2UgUkZMVVNIOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgUkZMVVNIIGNvbW1hbmQgYmxrIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCUNtZEJsa1AtPlBvc3RGdW5jUCA9IFJJT1JGbHVzaEVuYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIFNVU1BFTkQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBTVVNQRU5EIGNvbW1hbmQgYmxrIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUdFVCA6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNR0VUIGNvbW1hbmQgYmxrIDB4JXhcbiIsIChpbnQpQ21kQmxrUCk7CisJCQlicmVhazsKKworCQljYXNlIE1TRVQgOgorCQljYXNlIE1CSUMgOgorCQljYXNlIE1CSVMgOgorCQkJQ21kQmxrUC0+UGFja2V0LmRhdGFbNF0gPSAoY2hhcikgUG9ydFAtPk1vZGVtTGluZXM7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNU0VUL01CSUMvTUJJUyBjb21tYW5kIGJsayAweCV4XG4iLCAoaW50KUNtZEJsa1ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRkxVU0g6CisJCQkvKgorCQkJKiogSWYgd2UgaGF2ZSBxdWV1ZWQgdXAgdGhlIG1heGltdW0gbnVtYmVyIG9mIFdyaXRlIGZsdXNoZXMKKwkJCSoqIGFsbG93ZWQgdGhlbiB3ZSBzaG91bGQgbm90IGJvdGhlciBzZW5kaW5nIGFueSBtb3JlIHRvIHRoZQorCQkJKiogUlRBLgorCQkJKi8KKwkJCWlmICgoaW50KSgoY2hhcilQb3J0UC0+V2ZsdXNoRmxhZykgPT0gKGludCktMSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlRyYXNoZWQgV0ZMVVNILCBXZmx1c2hGbGFnIGFib3V0IHRvIHdyYXAhIik7CisJCQkJUklPRnJlZUNtZEJsayhDbWRCbGtQKTsKKwkJCQlyZXR1cm4oUklPX0ZBSUwpOworCQkJfSBlbHNlIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBXRkxVU0ggY29tbWFuZCBibGsgMHgleFxuIiwKKwkJCQkgICAgICAgKGludClDbWRCbGtQKTsKKwkJCQlDbWRCbGtQLT5Qb3N0RnVuY1AgPSBSSU9XRmx1c2hNYXJrOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJUG9ydFAtPkluVXNlKys7CisKKwlSZXQgPSBSSU9RdWV1ZUNtZEJsayggUG9ydFAtPkhvc3RQLCBydXAsIENtZEJsa1AgKTsKKworCXJldHVybiBSZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2RydnIuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvZHJ2ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzhhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2RydnIuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvZHJ2ci5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAwOToyMjo0NgorKioJUmV0cmlldmVkCTogMTEvNi85OCAwOToyMjo0NgorKioKKyoqICBpZGVudCBAKCMpcmlvZHJ2ci5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvZHJ2cl9oCisjZGVmaW5lIF9fcmlvZHJ2cl9oCisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4JLyogZm9yIEhaICovCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9kcnZyX2hfc2Njc18gPSAiQCgjKXJpb2RydnIuaAkxLjMiOworI2VuZGlmCisKKyNkZWZpbmUgTUVNRFVNUF9TSVpFCTMyCisjZGVmaW5lCU1PRF9ESVNBQkxFCShSSU9fTk9SRUFEfFJJT19OT1dSSVRFfFJJT19OT1hQUklOVCkKKworCitzdHJ1Y3QgcmlvX2luZm8geworCWludAkJCW1vZGU7CQkJLyogSW50ciBvciBwb2xsZWQsIHdvcmQvYnl0ZSAqLworCXNwaW5sb2NrX3QJCVJJT0ludHJTZW07CQkvKiBJbnRlcnJ1cHQgdGhyZWFkIHNlbSAqLworCWludAkJCWN1cnJlbnRfY2hhbjsJCS8qIGN1cnJlbnQgY2hhbm5lbCAqLworCWludAkJCVJJT0ZhaWxlZDsJCS8qIE5vdCBpbml0aWFsaXNlZCA/ICovCisJaW50CQkJUklPSW5zdGFsbEF0dGVtcHRzOwkvKiBuby4gb2YgcmlvLWluc3RhbGwoKSBjYWxscyAqLworCWludAkJCVJJT0xhc3RQQ0lTZWFyY2g7CS8qIHN0YXR1cyBvZiBsYXN0IHNlYXJjaCAqLworCWludAkJCVJJT051bUhvc3RzOwkJLyogTnVtYmVyIG9mIFJJTyBIb3N0cyAqLworCXN0cnVjdCBIb3N0CQkqIFJJT0hvc3RzOwkJLyogUklPIEhvc3QgdmFsdWVzICovCisJc3RydWN0IFBvcnQJCSoqUklPUG9ydHA7CQkvKiBSSU8gcG9ydCB2YWx1ZXMgKi8KKy8qCisqKiAwMi4wMy4xOTk5IEFSRyAtIEVTSUwgMDgyMCBmaXgKKyoqIFdlIG5vIGxvbmdlciB1c2UgUklPQm9vdE1vZGUKKyoqCisJaW50CQkJUklPQm9vdE1vZGU7CQkqIFJJTyBib290IG1vZGUgKgorKioKKyovCisJaW50CQkJUklPUHJpbnREaXNhYmxlZDsJLyogUklPIHByaW50aW5nIGRpc2FibGVkID8gKi8KKwlpbnQJCQlSSU9QcmludExvZ1N0YXRlOwkvKiBSSU8gcHJpbnRpbmcgc3RhdGUgPyAqLworCWludAkJCVJJT1BvbGxpbmc7CQkvKiBQb2xsaW5nID8gKi8KKy8qCisqKiAwOS4xMi4xOTk4IEFSRyAtIEVTSUwgMDc3NiBwYXJ0IGZpeAorKiogVGhlICdSSU9fUVVJQ0tfQ0hFQ0snIGlvY3RsIHdhcyB1c2luZyBSSU9IYWx0ZWQuCisqKiBUaGUgZml4IGZvciB0aGlzIEVTSUwgaW50cm9kdWNlcyBhbm90aGVyIG1lbWJlciAoUklPUnRhRGlzQ29ucykgaGVyZSB0byBiZQorKiogdXBkYXRlZCBpbiBSSU9Db25Db24oKSAtIHRvIGtlZXAgdHJhY2sgb2YgUlRBIGNvbm5lY3Rpb25zL2Rpc2Nvbm5lY3Rpb25zLgorKiogJ1JJT19RVUlDS19DSEVDSycgbm93IHJldHVybnMgdGhlIHZhbHVlIG9mIFJJT1J0YURpc0NvbnMuCisqLworCWludAkJCVJJT0hhbHRlZDsJCS8qIGhhbHRlZCA/ICovCisJaW50CQkJUklPUnRhRGlzQ29uczsJCS8qIFJUQSBjb25uZWN0aW9ucy9kaXNjb25uZWN0aW9ucyAqLworCXVpbnQJCQlSSU9SZWFkQ2hlY2s7CQkvKiBSaW8gcmVhZCBjaGVjayAqLworCXVpbnQJCQlSSU9Ob01lc3NhZ2U7CQkvKiBUbyBkaXNwbGF5IG1lc3NhZ2Ugb3Igbm90ICovCisJdWludAkJCVJJT051bUJvb3RQa3RzOwkJLyogaG93IG1hbnkgcGFja2V0cyBmb3IgYW4gUlRBICovCisJdWludAkJCVJJT0Jvb3RDb3VudDsgCQkvKiBzaXplIG9mIFJUQSBjb2RlICovCisJdWludAkJCVJJT0Jvb3Rpbmc7CQkvKiBjb3VudCBvZiBvdXRzdGFuZGluZyBib290cyAqLworCXVpbnQJCQlSSU9TeXN0ZW1VcDsJCS8qIEJvb3RlZCA/PyAqLworCXVpbnQJCQlSSU9Db3VudGluZzsJCS8qIGZvciBjb3VudGluZyBpbnRlcnJ1cHRzICovCisJdWludAkJCVJJT0ludENvdW50OwkJLyogIyBvZiBpbnRyIHNpbmNlIGxhc3QgY2hlY2sgKi8KKwl1aW50CQkJUklPVHhDb3VudDsJCS8qIG51bWJlciBvZiB4bWl0IGludHJzICAqLworCXVpbnQJCQlSSU9SeENvdW50OwkJLyogbnVtYmVyIG9mIHJ4IGludHJzICovCisJdWludAkJCVJJT1J1cENvdW50OwkJLyogbnVtYmVyIG9mIHJ1cCBpbnRycyAqLworCWludAkJCVJJWFRpbWVyOyAKKwlpbnQJCQlSSU9CdWZmZXJTaXplOwkJLyogQnVmZmVyc2l6ZSAqLworCWludAkJCVJJT0J1ZmZlck1hc2s7CQkvKiBCdWZmZXJzaXplICovCisKKwlpbnQJCQlSSU9GaXJzdE1ham9yOwkJLyogRmlyc3QgaG9zdCBjYXJkJ3MgbWFqb3Igbm8gKi8KKworCXVpbnQJCQlSSU9MYXN0UG9ydHNNYXBwZWQ7CS8qIGhpZ2hlc3QgcG9ydCBudW1iZXIga25vd24gKi8KKwl1aW50CQkJUklPRmlyc3RQb3J0c01hcHBlZDsJLyogbG93ZXN0IHBvcnQgbnVtYmVyIGtub3duICovCisKKwl1aW50CQkJUklPTGFzdFBvcnRzQm9vdGVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKwl1aW50CQkJUklPRmlyc3RQb3J0c0Jvb3RlZDsJLyogbG93ZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKworCXVpbnQJCQlSSU9MYXN0UG9ydHNPcGVuZWQ7CS8qIGhpZ2hlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLworCXVpbnQJCQlSSU9GaXJzdFBvcnRzT3BlbmVkOwkvKiBsb3dlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLworCisJLyogRmxhZyB0byBzYXkgdGhhdCB0aGUgdG9wb2xvZ3kgaW5mb3JtYXRpb24gaGFzIGJlZW4gY2hhbmdlZC4gKi8KKwl1aW50CQkJUklPUXVpY2tDaGVjazsgCisJdWludAkJCUNkUmVnaXN0ZXI7CQkvKiA/Pz8gKi8KKwlpbnQJCQlSSU9TaWduYWxQcm9jZXNzOwkvKiBTaWduYWxsaW5nIHByb2Nlc3MgKi8KKwlpbnQJCQlyaW9fZGVidWc7CQkvKiBUbyBkZWJ1ZyAuLi4gKi8KKwlpbnQJCQlSSU9EZWJ1Z1dhaXQ7CQkvKiBGb3Igd2hhdCA/Pz8gKi8KKwlpbnQJCQl0cHJpOwkJCS8qIFRocmVhZCBwcmlvICovCisJaW50CQkJdGlkOwkJCS8qIFRocmVhZCBpZCAqLworCXVpbnQJCQlfUklPX1BvbGxlZDsJCS8qIENvdW50ZXIgZm9yIHBvbGxpbmcgKi8KKwl1aW50CQkJX1JJT19JbnRlcnJ1cHRlZDsJLyogQ291bnRlciBmb3IgaW50ZXJydXB0ICovCisJaW50CQkJaW50cl90aWQ7CQkvKiBpb2ludHNldCByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlUeEVuU2VtOwkJLyogVHhFbmFibGUgU2VtYXBob3JlICovCisKKworCXN0cnVjdCBFcnJvcgkJUklPRXJyb3I7CQkvKiB0byBJZGVudGlmeSB3aGF0IHdlbnQgd3JvbmcgKi8gCisJc3RydWN0IENvbmYJCVJJT0NvbmY7CQkvKiBDb25maWd1cmF0aW9uID8/PyAqLworCXN0cnVjdCB0dHlzdGF0aWNzCWNoYW5uZWxbUklPX1BPUlRTXTsJLyogY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworCWNoYXIJCQlSSU9Cb290UGFja2V0c1sxKyhTSVhUWV9GT1VSX0svUlRBX0JPT1RfREFUQV9TSVpFKV0KKwkJCQkJCQkJW1JUQV9CT09UX0RBVEFfU0laRV07CisJc3RydWN0IE1hcAkJUklPQ29ubmVjdFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKKwlzdHJ1Y3QgTWFwCQlSSU9TYXZlZFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKKworCS8qIFJUQSB0byBob3N0IGJpbmRpbmcgdGFibGUgZm9yIG1hc3Rlci9zbGF2ZSBvcGVyYXRpb24gKi8KKwl1bG9uZwkJCVJJT0JpbmRUYWJbTUFYX1JUQV9CSU5ESU5HU107CisJLyogUlRBIG1lbW9yeSBkdW1wIHZhcmlhYmxlICovCisJdWNoYXIJCQlSSU9NZW1EdW1wW01FTURVTVBfU0laRV07IAorCXN0cnVjdCBNb2R1bGVJbmZvIAlSSU9Nb2R1bGVUeXBlc1tNQVhfTU9EVUxFX1RZUEVTXTsKKworfTsKKworCisjaWZkZWYgbGludXgKKyNkZWZpbmUgZGVidWcoeCkgICAgICAgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkZWJ1Zyh4KQlra3ByaW50ZiB4CisjZW5kaWYKKworCisKKyNkZWZpbmUgUklPX1JFU0VUX0lOVAkweDdkODAKKyNkZWZpbmUgV1JCWVRFKHgseSkJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgoeCkpID0gXAorCQkJCQkodW5zaWduZWQgY2hhcikoeSkKKworI2VuZGlmCS8qIF9fcmlvZHJ2ci5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luZm8uaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODQyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luZm8uaApAQCAtMCwwICsxLDk2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9pbmZvLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDE0OjA3OjQ5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDE0OjA3OjUwCisqKgorKiogIGlkZW50IEAoIylyaW9pbmZvLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9pbmZvX2gKKyNkZWZpbmUgX19yaW9pbmZvX2gKKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2luZm9faF9zY2NzXyA9ICJAKCMpcmlvaW5mby5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIEhvc3QgY2FyZCBkYXRhIHN0cnVjdHVyZQorKi8KK3N0cnVjdCBSaW9Ib3N0SW5mbyB7CisJbG9uZwlsb2NhdGlvbjsJLyogUklPIENhcmQgQmFzZSBJL08gYWRkcmVzcyAqLworCWxvbmcJdmVjdG9yOwkJLyogUklPIENhcmQgSVJRIHZlY3RvciAqLworCWludAlidXM7CQkvKiBJU0EvRUlTQS9NQ0EvUENJICovCisJaW50CW1vZGU7CQkvKiBwb2ludGVyIHRvIGhvc3QgbW9kZSAtIElOVEVSUlVQVCAvIFBPTExFRCAqLworCXN0cnVjdCBvbGRfc2d0dHliCisJCSogU2c7CQkvKiBwb2ludGVyIHRvIGRlZmF1bHQgdGVybSBjaGFyYWN0ZXJpc3RpY3MgKi8KK307CisKKworLyogTW9kZSBpbiByaW8gZGV2aWNlIGluZm8gKi8KKyNkZWZpbmUgSU5URVJSVVBURURfTU9ERQkweDAxCQkvKiBJbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkICovCisjZGVmaW5lIFBPTExFRF9NT0RFCQkweDAyCQkvKiBObyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQVVUT19NT0RFCQkweDAzCQkvKiBBdXRvIG1vZGUgKi8KKworI2RlZmluZSBXT1JEX0FDQ0VTU19NT0RFCTB4MTAJCS8qIFdvcmQgQWNjZXNzIE1vZGUgKi8KKyNkZWZpbmUgQllURV9BQ0NFU1NfTU9ERQkweDIwCQkvKiBCeXRlIEFjY2VzcyBNb2RlICovCisKKworLyogQnVzIHR5cGUgdGhhdCBSSU8gc3VwcG9ydHMgKi8KKyNkZWZpbmUgSVNBX0JVUwkJCTB4MDEJCS8qIFRoZSBjYXJkIGlzIElTQSAqLworI2RlZmluZSBFSVNBX0JVUwkJMHgwMgkJLyogVGhlIGNhcmQgaXMgRUlTQSAqLworI2RlZmluZSBNQ0FfQlVTCQkJMHgwNAkJLyogVGhlIGNhcmQgaXMgTUNBICovCisjZGVmaW5lIFBDSV9CVVMJCQkweDA4CQkvKiBUaGUgY2FyZCBpcyBQQ0kgKi8KKworLyoKKyoqIDExLjExLjE5OTggQVJHIC0gRVNJTCA/Pz8/IHBhcnQgZml4CisqKiBNb3ZlZCBkZWZpbml0aW9uIGZvciAnQ0hBTicgaGVyZSBmcm9tIHJpb2luZm8uYyAoaXQgaXMgbm93CisqKiBjYWxsZWQgJ0RFRl9URVJNX0NIQVJBQ1RFUklTVElDUycpLgorKi8KKworI2RlZmluZSBERUZfVEVSTV9DSEFSQUNURVJJU1RJQ1MgXAoreyBcCisJQjE5MjAwLCBCMTkyMDAsCQkJCS8qIGlucHV0IGFuZCBvdXRwdXQgc3BlZWQgKi8gXAorCSdIJyAtICdAJywJCQkJLyogZXJhc2UgY2hhciAqLyBcCisJLTEsCQkJCQkvKiAybmQgZXJhc2UgY2hhciAqLyBcCisJJ1UnIC0gJ0AnLAkJCQkvKiBraWxsIGNoYXIgKi8gXAorCUVDSE8gfCBDUk1PRCwJCQkJLyogbW9kZSAqLyBcCisJJ0MnIC0gJ0AnLAkJCQkvKiBpbnRlcnJ1cHQgY2hhcmFjdGVyICovIFwKKwknXFwnIC0gJ0AnLAkJCQkvKiBxdWl0IGNoYXIgKi8gXAorCSdRJyAtICdAJywJCQkJLyogc3RhcnQgY2hhciAqLyBcCisJJ1MnIC0gJ0AnLAkJCQkvKiBzdG9wIGNoYXIgKi8gXAorCSdEJyAtICdAJywJCQkJLyogRU9GICovIFwKKwktMSwJCQkJCS8qIGJyayAqLyBcCisJKExDUlRCUyB8IExDUlRFUkEgfCBMQ1JUS0lMIHwgTENUTEVDSCksCS8qIGxvY2FsIG1vZGUgd29yZCAqLyBcCisJJ1onIC0gJ0AnLAkJCQkvKiBwcm9jZXNzIHN0b3AgKi8gXAorCSdZJyAtICdAJywJCQkJLyogZGVsYXllZCBzdG9wICovIFwKKwknUicgLSAnQCcsCQkJCS8qIHJlcHJpbnQgbGluZSAqLyBcCisJJ08nIC0gJ0AnLAkJCQkvKiBmbHVzaCBvdXRwdXQgKi8gXAorCSdXJyAtICdAJywJCQkJLyogd29yZCBlcmFzZSAqLyBcCisJJ1YnIC0gJ0AnCQkJCS8qIGxpdGVyYWwgbmV4dCBjaGFyICovIFwKK30KKworI2VuZGlmIC8qIF9fcmlvaW5mb19oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTk0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYwpAQCAtMCwwICsxLDE2MTcgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2luaXQuYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NDkKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2luaXQuYwkxLjMKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9pbml0X2Nfc2Njc18gPSAiQCgjKXJpb2luaXQuYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKworI3VuZGVmIGJjb3B5CisjZGVmaW5lIGJjb3B5IHJpb19wY2ljb3B5CisKK2ludCBSSU9QQ0lpbml0KHN0cnVjdCByaW9faW5mbyAqcCwgaW50IE1vZGUpOworCisjaWYgMAorc3RhdGljIHZvaWQgUklPQWxsb2NhdGVJbnRlcnJ1cHRzKHN0cnVjdCByaW9faW5mbyAqKTsKK3N0YXRpYyBpbnQgUklPUmVwb3J0KHN0cnVjdCByaW9faW5mbyAqKTsKK3N0YXRpYyB2b2lkIFJJT1N0b3BJbnRlcnJ1cHRzKHN0cnVjdCByaW9faW5mbyAqLCBpbnQsIGludCk7CisjZW5kaWYKKworc3RhdGljIGludCBSSU9TY3J1YihpbnQsIEJZVEUgKiwgaW50KTsKKworI2lmIDAKK2V4dGVybiBpbnQJcmlvX2ludHIoKTsKKworLyoKKyoqCUluaXQgdGltZSBjb2RlLgorKi8KK3ZvaWQKK3Jpb2luaXQoIHAsIGluZm8gKQorc3RydWN0IHJpb19pbmZvCQkqIHA7CitzdHJ1Y3QgUmlvSG9zdEluZm8JKiBpbmZvOworeworCS8qCisJKiogTXVsdGktSG9zdCBjYXJkIHN1cHBvcnQgLSB0YWtpbmcgdGhlIGVhc3kgd2F5IG91dCAtIHNvcnJ5ICEKKwkqKiBXZSBhbGxvY2F0ZSBhbmQgc2V0IHVwIHRoZSBIb3N0IGFuZCBQb3J0IHN0cnVjdHMgd2hlbiB0aGUKKwkqKiBkcml2ZXIgaXMgY2FsbGVkIHRvICdpbnN0YWxsJyB0aGUgZmlyc3QgaG9zdC4KKwkqKiBXZSBjaGVjayBmb3IgdGhpcyBmaXJzdCAnY2FsbCcgYnkgdGVzdGluZyB0aGUgUklPUG9ydHAgcG9pbnRlci4KKwkqLworCWlmICggIXAtPlJJT1BvcnRwICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJBbGxvY2F0aW5nIGFuZCBzZXR0aW5nIHVwIGRyaXZlciBkYXRhIHN0cnVjdHVyZXNcbiIpOworCisJCVJJT0FsbG9jRGF0YVN0cnVjdHMocCk7CQkvKiBhbGxvY2F0ZSBob3N0L3BvcnQgc3RydWN0cyAqLworCQlSSU9TZXR1cERhdGFTdHJ1Y3RzKHApOwkJLyogc2V0dXAgdG9wb2xvZ3kgc3RydWN0cyAqLworCX0KKworCVJJT0luaXRIb3N0cyggcCwgaW5mbyApOwkvKiBodW50IGRvd24gdGhlIGhhcmR3YXJlICovCisKKwlSSU9BbGxvY2F0ZUludGVycnVwdHMocCk7CS8qIGFsbG9jYXRlIGludGVycnVwdHMgKi8KKwlSSU9SZXBvcnQocCk7CQkJLyogc2hvdyB3aGF0IHdlIGZvdW5kICovCit9CisKKy8qCisqKiBJbml0aWFsaXNlIHRoZSBDYXJkcyAKKyovIAordm9pZAorUklPSW5pdEhvc3RzKHAsIGluZm8pCitzdHJ1Y3QgcmlvX2luZm8JCSogcDsKK3N0cnVjdCBSaW9Ib3N0SW5mbwkqIGluZm87Cit7CisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjIgcGFydCBmaXgKKyoqIElmIHRoZXJlIGlzIG5vIElTQSBjYXJkIGRlZmluaXRpb24gLSB3ZSBhbHdheXMgbG9vayBmb3IgUENJIGNhcmRzLgorKiogQXMgd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBvbmUgaG9zdCBjYXJkIHRoaXMgbGV0cyBhbiBJU0EgY2FyZAorKiogZGVmaW5pdGlvbiB0YWtlIHByZWNlZGVuY2Ugb3ZlciBQTFVHIGFuZCBQTEFZLgorKiogTm8gSVNBIGNhcmQgLSB3ZSBhcmUgUExVRyBhbmQgUExBWSB3aXRoIFBDSS4KKyovCisKKwkvKgorCSoqIE5vdGUgLSBmb3IgUENJIGJvdGggdGhlc2Ugd2lsbCBiZSB6ZXJvLCB0aGF0J3Mgb2theSBiZWNhdXNlCisJKiogUklPUENJSW5pdCgpIGZpbGxzIHRoZW0gaW4gaWYgYSBjYXJkIGlzIGZvdW5kLgorCSovCisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMJPSBpbmZvLT52ZWN0b3I7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUAk9IGluZm8tPmxvY2F0aW9uOworCisJLyoKKwkqKiBDaGVjayB0aGF0IHdlIGFyZSBhYmxlIHRvIGFjY29tbW9kYXRlIGFub3RoZXIgaG9zdAorCSovCisJaWYgKCBwLT5SSU9OdW1Ib3N0cyA+PSBSSU9fSE9TVFMgKQorCXsKKwkJcC0+UklPRmFpbGVkKys7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIGluZm8tPmJ1cyAmIElTQV9CVVMgKQorCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgImluaXRpYWxpc2luZyBjYXJkICVkIChJU0EpXG4iLCBwLT5SSU9OdW1Ib3N0cyk7CisJCVJJT0lTQWluaXQocCwgcC0+bW9kZSk7CisJfQorCWVsc2UKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJpbml0aWFsaXNpbmcgY2FyZCAlZCAoUENJKVxuIiwgcC0+UklPTnVtSG9zdHMpOworCQlSSU9QQ0lpbml0KHAsIFJJT19QQ0lfREVGQVVMVF9NT0RFKTsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiVG90YWwgaG9zdHMgaW5pdGlhbGlzZWQgc28gZmFyIDogJWRcbiIsIHAtPlJJT051bUhvc3RzKTsKKworCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwlpZiAocC0+YnVzICYgRUlTQV9CVVMpCisJCS8qIEVJU0EgY2FyZCAqLworCQlSSU9FSVNBaW5pdChwLCBSSU9fRUlTQV9ERUZBVUxUX01PREUpOworCisJaWYgKHAtPmJ1cyAmIE1DQV9CVVMpCisJCS8qIE1DQSBjYXJkICovCisJCVJJT01DQWluaXQocCwgUklPX01DQV9ERUZBVUxUX01PREUpOworI2VuZGlmCit9CisKKy8qCisqKiBnbyB0aHJvdWdoIG1lbW9yeSBmb3IgYW4gQVQgaG9zdCB0aGF0IHdlIHBhc3MgaW4gdGhlIGRldmljZSBpbmZvCisqKiBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpc2UKKyovCit2b2lkCitSSU9JU0Fpbml0KHAsIG1vZGUpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworaW50CQkJCQltb2RlOworeworCisgIC8qIFhYWCBOZWVkIHRvIGltcGxlbWVudCB0aGlzLiAqLworI2lmIDAKKwlwLT5pbnRyX3RpZCA9IGlvaW50c2V0KHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjLAorCQkJCQkoaW50ICgqKSgpKXJpb19pbnRyLCAoY2hhciopcC0+UklPTnVtSG9zdHMpOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlNldCBpbnRlcnJ1cHQgaGFuZGxlciwgaW50cl90aWQgPSAweCV4XG4iLCBwLT5pbnRyX3RpZCApOworCisJaWYgKFJJT0RvQVQocCwgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgbW9kZSkpIHsKKwkJcmV0dXJuOworCX0KKwllbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPRG9BVCBmYWlsZWRcbiIpOworCQlwLT5SSU9GYWlsZWQrKzsKKwl9CisjZW5kaWYKKworfQorCisvKgorKiogUklPRG9BVCA6CisqKgorKiogTWFwIGluIGEgYm9hcmRzIHBoeXNpY2FsIGFkZHJlc3MsIGNoZWNrIHRoYXQgdGhlIGJvYXJkIGlzIHRoZXJlLAorKiogdGVzdCB0aGUgYm9hcmQgYW5kIGlmIGV2ZXJ5dGhpbmcgaXMgb2theSBhc3NpZ24gdGhlIGJvYXJkIGFuIGVudHJ5CisqKiBpbiB0aGUgUmlvIEhvc3RzIHN0cnVjdHVyZS4KKyovCitpbnQKK1JJT0RvQVQocCwgQmFzZSwgbW9kZSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitpbnQJCUJhc2U7CitpbnQJCW1vZGU7Cit7CisjZGVmaW5lCUZPVU5ECQkxCisjZGVmaW5lIE5PVF9GT1VORAkwCisKKwljYWRkcl90CQljYXJkQWRkcjsKKworCS8qCisJKiogQ2hlY2sgdG8gc2VlIGlmIHdlIGFjdHVhbGx5IGhhdmUgYSBib2FyZCBhdCB0aGlzIHBoeXNpY2FsIGFkZHJlc3MuCisJKi8KKwlpZiAoKGNhcmRBZGRyID0gUklPQ2hlY2tGb3JBVENhcmQoQmFzZSkpICE9IDApIHsKKwkJLyoKKwkJKiogTm93IHRlc3QgdGhlIGJvYXJkIHRvIHNlZSBpZiBpdCBpcyB3b3JraW5nLgorCQkqLworCQlpZiAoUklPQm9hcmRUZXN0KEJhc2UsIGNhcmRBZGRyLCBSSU9fQVQsIDApID09IFJJT19TVUNDRVNTKSB7CisJCQkvKgorCQkJKiogRmlsbCBvdXQgYSBzbG90IGluIHRoZSBSaW8gaG9zdCBzdHJ1Y3R1cmUuCisJCQkqLworCQkJaWYgKFJJT0Fzc2lnbkFUKHAsIEJhc2UsIGNhcmRBZGRyLCBtb2RlKSkgeworCQkJCXJldHVybihGT1VORCk7CisJCQl9CisJCX0KKwkJUklPTWFwb3V0KEJhc2UsIFJJT19BVF9NRU1fU0laRSwgY2FyZEFkZHIpOworCX0KKwlyZXR1cm4oTk9UX0ZPVU5EKTsKK30KKworY2FkZHJfdAorUklPQ2hlY2tGb3JBVENhcmQoQmFzZSkKK2ludAkJQmFzZTsKK3sKKwlpbnQJCQkJb2ZmOworCXN0cnVjdCBEcFJhbQkqY2FyZHA7CQkvKiAoUG9pbnRzIGF0IHRoZSBob3N0KSAqLworCWNhZGRyX3QJCQl2aXJ0QWRkcjsKKwl1bnNpZ25lZCBjaGFyCQkJUklPU2lnVGFiWzI0XTsKKy8qCisqKiBUYWJsZSBvZiB2YWx1ZXMgdG8gc2VhcmNoIGZvciBhcyBwcm9tIHNpZ25hdHVyZSBvZiBhIGhvc3QgY2FyZAorKi8KKwlzdHJjcHkoUklPU2lnVGFiLCAiSkJKR1BHR0hJTlNNSlBKUiIpOworCisJLyoKKwkqKiBIZXkhIFllcywgWW91IHJlYWRpbmcgdGhpcyBjb2RlISBZbywgZ3JhYiBhIGxvYWQgYSB0aGlzOgorCSoqCisJKiogSUYgdGhlIGNhcmQgaXMgdXNpbmcgV09SRCBNT0RFIHJhdGhlciB0aGFuIEJZVEUgTU9ERQorCSoqIHRoZW4gaXQgd2lsbCBvY2N1cHkgMTI4SyBvZiBQSFlTSUNBTCBtZW1vcnkgYXJlYS4gU28sCisJKiogeW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGZvbGxvd2luZyBNYXBpbiBpcyB3cm9uZy4gV2VsbCwKKwkqKiBpdCBpc24ndCwgYmVjYXVzZSB0aGUgU0VDT05EIDY0SyBvZiBvY2N1cGllZCBzcGFjZSBpcyBhbgorCSoqIEVYQUNUIENPUFkgb2YgdGhlIEZJUlNUIDY0Sy4gKGdvb2Q/KSwgc28sIHdlIG5lZWQgb25seQorCSoqIG1hcCBpdCBpbiBpbiBvbmUgNjRLIGJsb2NrLgorCSovCisJaWYgKFJJT01hcGluKEJhc2UsIFJJT19BVF9NRU1fU0laRSwgJnZpcnRBZGRyKSA9PSAtMSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogQ291bGRuJ3QgbWFwIHRoZSBib2FyZCBpbiFcbiIpOworCQlyZXR1cm4oKGNhZGRyX3QpMCk7CisJfQorCisJLyoKKwkqKiB2aXJ0QWRkciBwb2ludHMgdG8gdGhlIERQIHJhbSBvZiB0aGUgc3lzdGVtLgorCSoqIFdlIG5vdyBjYXN0IHRoaXMgdG8gYSBwb2ludGVyIHRvIGEgUklPIEhvc3QsCisJKiogYW5kIGhhdmUgYSBydW1tYWdlIGFib3V0IGluIHRoZSBQUk9NLgorCSovCisJY2FyZHAgPSAoc3RydWN0IERwUmFtICopdmlydEFkZHI7CisKKwlmb3IgKG9mZj0wOyBSSU9TaWdUYWJbb2ZmXTsgb2ZmKyspIHsKKwkJaWYgKChSQllURShjYXJkcC0+RHBTaWduYXR1cmVbb2ZmXSkgJiAweEZGKSAhPSBSSU9TaWdUYWJbb2ZmXSkgeworCQkJLyoKKwkJCSoqIFNpZ25hdHVyZSBtaXNtYXRjaCAtIGNhcmQgbm90IGF0IHRoaXMgYWRkcmVzcworCQkJKi8KKwkJCVJJT01hcG91dChCYXNlLCBSSU9fQVRfTUVNX1NJWkUsIHZpcnRBZGRyKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBDb3VsZG4ndCBtYXRjaCB0aGUgc2lnbmF0dXJlIDB4JXggMHgleCFcbiIsCisJCQkJCQkoaW50KWNhcmRwLCBvZmYpOworCQkJcmV0dXJuKChjYWRkcl90KTApOworCQl9CisJfQorCisJLyoKKwkqKiBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIG11c3QgaGF2ZSBmb3VuZCBhIHZhbGlkIGJvYXJkIHNvIHJldHVybgorCSoqIGl0cyB2aXJ0dWFsIGFkZHJlc3MuCisJKi8KKwlyZXR1cm4odmlydEFkZHIpOworfQorI2VuZGlmCisKKy8qKgorKiogUklPQXNzaWduQVQgOgorKioKKyoqIEZpbGwgb3V0IHRoZSBmaWVsZHMgaW4gdGhlIHAtPlJJT0hvc3RzIHN0cnVjdHVyZSBub3cgd2Uga25vdyB3ZSBrbm93CisqKiB3ZSBoYXZlIGEgYm9hcmQgcHJlc2VudC4KKyoqCisqKiBiaXRzIDwgMCBpbmRpY2F0ZXMgOCBiaXQgb3BlcmF0aW9uIHJlcXVlc3RlZCwKKyoqIGJpdHMgPiAwIGluZGljYXRlcyAxNiBiaXQgb3BlcmF0aW9uLgorKi8KK2ludAorUklPQXNzaWduQVQocCwgQmFzZSwgdmlydEFkZHIsIG1vZGUpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworaW50CQlCYXNlOworY2FkZHJfdAl2aXJ0QWRkcjsKK2ludAkJbW9kZTsKK3sKKwlpbnQJCWJpdHM7CisJc3RydWN0IERwUmFtICpjYXJkcCA9IChzdHJ1Y3QgRHBSYW0gKil2aXJ0QWRkcjsKKworCWlmICgoQmFzZSA8IE9ORV9NRUcpIHx8IChtb2RlICYgQllURV9BQ0NFU1NfTU9ERSkpCisJCWJpdHMgPSBCWVRFX09QRVJBVElPTjsKKwllbHNlCisJCWJpdHMgPSBXT1JEX09QRVJBVElPTjsKKworCS8qCisJKiogQm9hcmQgaGFzIHBhc3NlZCBpdHMgc2NydWIgdGVzdC4gRmlsbCBpbiBhbGwgdGhlCisJKiogdHJhbnNpZW50IHN0dWZmLgorCSovCisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyCT0gdmlydEFkZHI7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKXZpcnRBZGRyOworCisJLyoKKwkqKiBSZXZpc2lvbiAwMSBBVCBob3N0IGNhcmRzIGRvbid0IHN1cHBvcnQgV09SRCBvcGVyYXRpb25zLAorCSovCisJaWYgKCBSQllURShjYXJkcC0+RHBSZXZpc2lvbikgPT0gMDEgKQorCQliaXRzID0gQllURV9PUEVSQVRJT047CisKKwlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVHlwZSA9IFJJT19BVDsKKwlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29weSA9IGJjb3B5OworCQkJCQkJCQkJCQkvKiBzZXQgdGhpcyBsYXRlciAqLworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5TbG90ID0gLTE7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgPSBTTE9XX0xJTktTIHwgU0xPV19BVF9CVVMgfCBiaXRzOworCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Db250cm9sLCAKKwkJCUJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwgCisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZSB8IAorCQkJSU5URVJSVVBUX0RJU0FCTEUgKTsKKwlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsMHhmZik7CisJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvbnRyb2wsCisJCQlCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09GRiB8IAorCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgfAorCQkJSU5URVJSVVBUX0RJU0FCTEUgKTsKKwlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsMHhmZik7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSA9CisJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkmMHhGRik8PDApfAorCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pJjB4RkYpPDw4KXwKKwkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSYweEZGKTw8MTYpfAorCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbM10pJjB4RkYpPDwyNCk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFVuaXF1ZW51bSAweCV4XG4iLHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworCisJcC0+UklPTnVtSG9zdHMrKzsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogVGVzdHMgUGFzc2VkIGF0IDB4JXhcbiIsIEJhc2UpOworCXJldHVybigxKTsKK30KKyNpZiAwCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKK2ludCBSSU9NQ0Fpbml0KGludCBNb2RlKQoreworCXVjaGFyIFNsb3ROdW1iZXI7CisJY2FkZHJfdCBDYWRkcjsKKwl1aW50CVBhZGRyOworCXVpbnQJSXZlYzsKKwlpbnQJIEhhbmRsZTsKKwlpbnQJIHJldCA9IDA7CisKKwkvKgorCSoqIFZhbGlkIG1vZGUgaW5mb3JtYXRpb24gZm9yIE1DQSBjYXJkcworCSoqIGlzIG9ubHkgRkFTVCBMSU5LUworCSovCisJTW9kZSA9IChNb2RlICYgRkFTVF9MSU5LUykgPyBNY2FUcEZhc3RMaW5rcyA6IE1jYVRwU2xvd0xpbmtzOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJT01DQWluaXQoJWQpXG4iLE1vZGUpOworCisKKwkvKgorCSoqIENoZWNrIG91dCBlYWNoIG9mIHRoZSBzbG90cworCSovCisJZm9yIChTbG90TnVtYmVyID0gMDsgU2xvdE51bWJlciA8IE1jYU1heFNsb3RzOyBTbG90TnVtYmVyKyspIHsKKwkvKgorCSoqIEVuYWJsZSB0aGUgc2xvdCB3ZSB3YW50IHRvIHRhbGsgdG8KKwkqLworCW91dGIoIE1jYVNsb3RTZWxlY3QsIFNsb3ROdW1iZXIgfCBNY2FTbG90RW5hYmxlICk7CisKKwkvKgorCSoqIFJlYWQgdGhlIElEIHdvcmQgZnJvbSB0aGUgc2xvdAorCSovCisJaWYgKCgoaW5iKE1jYUlkSGlnaCk8PCA4KXxpbmIoTWNhSWRMb3cpKSA9PSBNY2FSSU9JZCkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlBvdGVudGlhbCBNQ0EgY2FyZCBpbiBzbG90ICVkXG4iLCBTbG90TnVtYmVyKTsKKworCQkvKgorCQkqKiBDYXJkIGFwcGVhcnMgdG8gYmUgYSBSSU8gTUNBIGNhcmQhCisJCSovCisJCVJJT01hY2hpbmVUeXBlIHw9ICgxPDxSSU9fTUNBKTsKKworCQkvKgorCQkqKiBKdXN0IGNoZWNrIHdlIGhhdmVuJ3QgZm91bmQgdG9vIG1hbnkgd29uZGVyZnVsIG9iamVjdHMKKwkJKi8KKwkJaWYgKCBSSU9OdW1Ib3N0cyA+PSBSSU9fSE9TVFMgKQorCQl7CisJCVJwcmludGYoUklPTWVzZ1Rvb01hbnlDYXJkcyk7CisJCXJldHVybihyZXQpOworCQl9CisKKwkJLyoKKwkJKiogTWNhSXJxRW5hYmxlIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgdmVjdG9yLCBhbmQgYSBjYXJkCisJCSoqIGVuYWJsZSBiaXQuCisJCSovCisJCUl2ZWMgPSBpbmIoTWNhSXJxRW5hYmxlKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJdmVjIGlzICV4XG4iLCBJdmVjKTsKKworCQlzd2l0Y2ggKCBJdmVjICYgTWNhSXJxTWFzayApCisJCXsKKwkJY2FzZSBNY2FJcnE5OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlE5XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMzoKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRM1xuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTQ6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTRcbiIpOworCQlicmVhazsKKwkJY2FzZSBNY2FJcnE3OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlE3XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTA6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTEwXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTE6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTExXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTI6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTEyXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTU6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTE1XG4iKTsKKwkJYnJlYWs7CisJCX0KKworCQkvKgorCQkqKiBJZiB0aGUgY2FyZCBlbmFibGUgYml0IGlzbid0IHNldCwgdGhlbiBzZXQgaXQhCisJCSovCisJCWlmICgoSXZlYyAmIE1jYUNhcmRFbmFibGUpICE9IE1jYUNhcmRFbmFibGUpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk1jYUNhcmRFbmFibGUgbm90IHNldCAtIHNldHRpbmchXG4iKTsKKwkJCW91dGIoTWNhSXJxRW5hYmxlLEl2ZWN8TWNhQ2FyZEVuYWJsZSk7CisJCX0gZWxzZQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTWNhQ2FyZEVuYWJsZSBhbHJlYWR5IHNldFxuIik7CisKKwkJLyoKKwkJKiogQ29udmVydCB0aGUgSVJRIGVuYWJsZSBtYXNrIGludG8gc29tZXRoaW5nIHVzZWZ1bAorCQkqLworCQlJdmVjID0gUklPTWNhVG9JdmVjW0l2ZWMgJiBNY2FJcnFNYXNrXTsKKworCQkvKgorCQkqKiBGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgImluYihNY2FNZW1vcnkpIGlzICV4XG4iLCBpbmIoTWNhTWVtb3J5KSk7CisJCVBhZGRyID0gTWNhQWRkcmVzcyhpbmIoTWNhTWVtb3J5KSk7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTUNBIGNhcmQgaGFzIEl2ZWMgJWQgQWRkciAleFxuIiwgSXZlYywgUGFkZHIpOworCisJCWlmICggUGFkZHIgIT0gMCApCisJCXsKKworCQkvKgorCQkqKiBUZWxsIHRoZSBtZW1vcnkgbWFwcGVyIHRoYXQgd2Ugd2FudCB0byB0YWxrIHRvIGl0CisJCSovCisJCUhhbmRsZSA9IFJJT01hcGluKCBQYWRkciwgUklPX01DQV9NRU1fU0laRSwgJkNhZGRyICk7CisKKwkJaWYgKCBIYW5kbGUgPT0gLTEgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJDb3VsZG4ndCBtYXAgJWQgYnl0ZXMgYXQgJXhcbiIsIFJJT19NQ0FfTUVNX1NJWkUsIFBhZGRyOworCQkJY29udGludWU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBtYXBwZWQgdG8gdmFkZHIgMHgleFxuIiwgQ2FkZHIpOworCisJCS8qCisJCSoqIEFuZCBjaGVjayB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZXJlIQorCQkqLworCQlpZiAoIFJJT0JvYXJkVGVzdCggUGFkZHIsQ2FkZHIsUklPX01DQSxTbG90TnVtYmVyICkgPT0gUklPX1NVQ0NFU1MgKQorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBoYXMgcGFzc2VkIHRlc3RcbiIpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU2xvdCAlZC4gVHlwZSAlZC4gUGFkZHIgMHgleC4gQ2FkZHIgMHgleC4gTW9kZSAweCV4LlxuIiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90TnVtYmVyLCBSSU9fTUNBLCBQYWRkciwgQ2FkZHIsIE1vZGUpOworCisJCQkvKgorCQkJKiogQm9hcmQgaGFzIHBhc3NlZCBpdHMgc2NydWIgdGVzdC4gRmlsbCBpbiBhbGwgdGhlCisJCQkqKiB0cmFuc2llbnQgc3R1ZmYuCisJCQkqLworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlNsb3QJID0gU2xvdE51bWJlcjsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5JdmVjCSA9IEl2ZWM7CisJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVHlwZQkgPSBSSU9fTUNBOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNvcHkJID0gYmNvcHk7CisJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uUGFkZHJQICAgPSBQYWRkcjsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5DYWRkcgk9IENhZGRyOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKUNhZGRyOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLk1vZGUJID0gTW9kZTsKKwkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCAsIDB4ZmYpOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZU51bSA9CisJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMF0pJjB4RkYpPDwwKXwKKwkJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkmMHhGRik8PDgpfAorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSYweEZGKTw8MTYpfAorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSYweEZGKTw8MjQpOworCQkJUklPTnVtSG9zdHMrKzsKKwkJCXJldCsrOworCQl9CisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSoqIEl0IGZhaWxlZCB0aGUgdGVzdCwgc28gaWdub3JlIGl0LgorCQkJKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlRFU1QgRkFJTEVEXG4iKTsKKwkJCVJJT01hcG91dChQYWRkciwgUklPX01DQV9NRU1fU0laRSwgQ2FkZHIgKTsKKwkJfQorCQl9CisJCWVsc2UKKwkJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTbG90ICVkIC0gUGFkZHIgemVybyFcbiIsIFNsb3ROdW1iZXIpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlNsb3QgJWQgTk9UIFJJT1xuIiwgU2xvdE51bWJlcik7CisJfQorCX0KKwkvKgorCSoqIE5vdyB3ZSBoYXZlIGNoZWNrZWQgYWxsIHRoZSBzbG90cywgdHVybiBvZmYgdGhlIE1DQSBzbG90IHNlbGVjdG9yCisJKi8KKwlvdXRiKE1jYVNsb3RTZWxlY3QsMCk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU2xvdCAlZCBOT1QgUklPXG4iLCBTbG90TnVtYmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgUklPRUlTQWluaXQoIGludCBNb2RlICkKK3sKKwlzdGF0aWMgaW50IEVJU0FEb25lID0gMDsKKwl1aW50IFBhZGRyOworCWludCBQb2xsSW50TWl4TXNnRG9uZSA9IDA7CisJY2FkZHJfdCBDYWRkcjsKKwl1c2hvcnQgSWRlbnQ7CisJdWNoYXIgRWlzYVNsb3Q7CisJdWNoYXIgSXZlYzsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJKiogVGhlIG9ubHkgdmFsaWQgbW9kZSBpbmZvcm1hdGlvbiBmb3IgRUlTQSBob3N0cyBpcyBmYXN0IG9yIHNsb3cKKwkqKiBsaW5rcy4KKwkqLworCU1vZGUgPSAoTW9kZSAmIEZBU1RfTElOS1MpID8gRUlTQV9UUF9GQVNUX0xJTktTIDogRUlTQV9UUF9TTE9XX0xJTktTOworCisJaWYgKCBFSVNBRG9uZSApCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU9FSVNBaW5pdCgpIC0gYWxyZWFkeSBkb25lLCByZXR1cm4uXG4iKTsKKwkJcmV0dXJuKDApOworCX0KKworCUVJU0FEb25lKys7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU9FSVNBaW5pdCgpXG4iKTsKKworCisJLyoKKwkqKiBGaXJzdCBjaGVjayBhbGwgY2FyZHMgdG8gc2VlIGlmIEFOWSBhcmUgc2V0IGZvciBwb2xsZWQgbW9kZSBvcGVyYXRpb24uCisJKiogSWYgc28sIHNldCBBTEwgdG8gcG9sbGVkLgorCSovCisKKwlmb3IgKCBFaXNhU2xvdD0xOyBFaXNhU2xvdDw9UklPX01BWF9FSVNBX1NMT1RTOyBFaXNhU2xvdCsrICkKKwl7CisJSWRlbnQgPSAoSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfSURFTlRfSEkpPDw4KSB8CisJCSBJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9JREVOVF9MTyk7CisKKwlpZiAoIElkZW50ID09IFJJT19FSVNBX0lERU5UICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkZvdW5kIFNwZWNpYWxpeCBwcm9kdWN0XG4iKTsKKworCQlpZiAoIElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX05VTUJFUikgIT0gUklPX0VJU0FfUFJPRFVDVF9DT0RFICkKKwkJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOb3QgU3BlY2lhbGl4IFJJTyAtIFByb2R1Y3QgbnVtYmVyICV4XG4iLAorCQkJCQkJSU5CWihFaXNhU2xvdCwgRUlTQV9QUk9EVUNUX05VTUJFUikpOworCQljb250aW51ZTsgIC8qIG5leHQgc2xvdCAqLworCQl9CisJCS8qCisJCSoqIEl0cyBhIFNwZWNpYWxpeCBSSU8hCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTyBSZXZpc2lvbiAlZFxuIiwKKwkJCQkJSU5CWihFaXNhU2xvdCwgRUlTQV9SRVZJU0lPTl9OVU1CRVIpKTsKKwkJCisJCVJJT01hY2hpbmVUeXBlIHw9ICgxPDxSSU9fRUlTQSk7CisKKwkJLyoKKwkJKiogSnVzdCBjaGVjayB3ZSBoYXZlbid0IGZvdW5kIHRvbyBtYW55IHdvbmRlcmZ1bCBvYmplY3RzCisJCSovCisJCWlmICggUklPTnVtSG9zdHMgPj0gUklPX0hPU1RTICkKKwkJeworCQlScHJpbnRmKFJJT01lc2dUb29NYW55Q2FyZHMpOworCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSoqIEVuc3VyZSB0aGF0IHRoZSBlbmFibGUgYml0IGlzIHNldCEKKwkJKi8KKwkJT1VUQlooIEVpc2FTbG90LCBFSVNBX0VOQUJMRSwgUklPX0VJU0FfRU5BQkxFX0JJVCApOworCisJCS8qCisJCSoqIEVJU0FfSU5URVJSVVBUX1ZFQyBjb250YWlucyB0aGUgaW50ZXJydXB0IHZlY3Rvci4KKwkJKi8KKwkJSXZlYyA9IElOQlooRWlzYVNsb3QsRUlTQV9JTlRFUlJVUFRfVkVDKTsKKworI2lmZGVmIFJJT0RFQlVHCisJCXN3aXRjaCAoIEl2ZWMgJiBFSVNBX0lOVEVSUlVQVF9NQVNLICkKKwkJeworCQljYXNlIEVJU0FfSVJRXzM6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAzXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfNDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDRcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV81OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgNVxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzY6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSA2XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfNzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDdcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV85OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgOVxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzEwOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTBcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV8xMToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDExXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfMTI6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAxMlxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzE0OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTRcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV8xNToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDE1XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9QT0xMRUQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIFBPTExFRFxuIik7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCBOVUxMLERCR19JTklUfERCR19GQUlMLCJTaGFnZ2VkIGludGVycnVwdCBudW1iZXIhXG4iKTsKKwkJSXZlYyAmPSBFSVNBX0NPTlRST0xfTUFTSzsKKwkJfQorI2VuZGlmCisKKwkJaWYgKCAoSXZlYyAmIEVJU0FfSU5URVJSVVBUX01BU0spID09CisJCSBFSVNBX1BPTExFRCApCisJCXsKKwkJUklPV2lsbFBvbGwgPSAxOworCQlicmVhazsJCS8qIEZyb20gRWlzYVNsb3QgbG9vcCAqLworCQl9CisJfQorCX0KKworCS8qCisJKiogRG8gaXQgYWxsIGFnYWluIG5vdyB3ZSBrbm93IHdoZXRoZXIgdG8gY2hhbmdlIGFsbCBjYXJkcyB0byBwb2xsZWQKKwkqKiBtb2RlIG9yIG5vdAorCSovCisKKwlmb3IgKCBFaXNhU2xvdD0xOyBFaXNhU2xvdDw9UklPX01BWF9FSVNBX1NMT1RTOyBFaXNhU2xvdCsrICkKKwl7CisJSWRlbnQgPSAoSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfSURFTlRfSEkpPDw4KSB8CisJCSBJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9JREVOVF9MTyk7CisKKwlpZiAoIElkZW50ID09IFJJT19FSVNBX0lERU5UICkKKwl7CisJCWlmICggSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfTlVNQkVSKSAhPSBSSU9fRUlTQV9QUk9EVUNUX0NPREUgKQorCQljb250aW51ZTsgIC8qIG5leHQgc2xvdCAqLworCisJCS8qCisJCSoqIEl0cyBhIFNwZWNpYWxpeCBSSU8hCisJCSovCisJCQorCQkvKgorCQkqKiBFbnN1cmUgdGhhdCB0aGUgZW5hYmxlIGJpdCBpcyBzZXQhCisJCSovCisJCU9VVEJaKCBFaXNhU2xvdCwgRUlTQV9FTkFCTEUsIFJJT19FSVNBX0VOQUJMRV9CSVQgKTsKKworCQkvKgorCQkqKiBFSVNBX0lOVEVSUlVQVF9WRUMgY29udGFpbnMgdGhlIGludGVycnVwdCB2ZWN0b3IuCisJCSovCisJCUl2ZWMgPSBJTkJaKEVpc2FTbG90LEVJU0FfSU5URVJSVVBUX1ZFQyk7CisKKwkJaWYgKCBSSU9XaWxsUG9sbCApCisJCXsKKwkJCS8qCisJCQkqKiBJZiB3ZSBhcmUgZ29pbmcgdG8gb3BlcmF0ZSBpbiBwb2xsZWQgbW9kZSwgYnV0IHRoaXMKKwkJCSoqIGJvYXJkIGlzIGNvbmZpZ3VyZWQgdG8gYmUgaW50ZXJydXB0IGRyaXZlbiwgZGlzcGxheQorCQkJKiogdGhlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uIHRvIHRoZSBwdW50ZXIsCisJCQkqKiBhc3N1bWluZyB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4KKwkJCSovCisKKwkJCWlmICggIVBvbGxJbnRNaXhNc2dEb25lICYmCisJCQkgKEl2ZWMgJiBFSVNBX0lOVEVSUlVQVF9NQVNLKSAhPSBFSVNBX1BPTExFRCApCisJCQl7CisJCQlScHJpbnRmKFJJT01lc2dBbGxQb2xsZWQpOworCQkJUG9sbEludE1peE1zZ0RvbmUgPSAxOworCQkJfQorCisJCQkvKgorCQkJKiogVW5ncmFjaW91c2x5IGlnbm9yZSB3aGF0ZXZlciB0aGUgYm9hcmQgcmVwb3J0cyBhcyBpdHMKKwkJCSoqIGludGVycnVwdCB2ZWN0b3IuLi4KKwkJCSovCisKKwkJCUl2ZWMgJj0gfkVJU0FfSU5URVJSVVBUX01BU0s7CisKKwkJCS8qCisJCQkqKiAuLi5hbmQgZm9yY2UgaXQgdG8gZGFuY2UgdG8gdGhlIHBvbGwgdHVuZS4KKwkJCSovCisKKwkJCUl2ZWMgfD0gRUlTQV9QT0xMRUQ7CisJCX0KKworCQkvKgorCQkqKiBDb252ZXJ0IHRoZSBJUlEgZW5hYmxlIG1hc2sgaW50byBzb21ldGhpbmcgdXNlZnVsICgwLTE1KQorCQkqLworCQlJdmVjID0gUklPRWlzYVRvSXZlYyhJdmVjKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIGhvc3QgaW4gc2xvdCAlZCBoYXMgSXZlYyAweCV4XG4iLAorCQkgRWlzYVNsb3QsIEl2ZWMpOworCisJCS8qCisJCSoqIEZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwkJKi8KKwkJUGFkZHIgPSAoSU5CWihFaXNhU2xvdCxFSVNBX01FTU9SWV9CQVNFX0hJKTw8MjQpIHwKKwkJCQkoSU5CWihFaXNhU2xvdCxFSVNBX01FTU9SWV9CQVNFX0xPKTw8MTYpOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgY2FyZCBoYXMgSXZlYyAlZCBBZGRyICV4XG4iLCBJdmVjLCBQYWRkcik7CisKKwkJaWYgKCBQYWRkciA9PSAwICkKKwkJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsCisJCSAiQm9hcmQgaW4gc2xvdCAlZCBjb25maWd1cmVkIGZvciBhZGRyZXNzIHplcm8hXG4iLCBFaXNhU2xvdCk7CisJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJKiogVGVsbCB0aGUgbWVtb3J5IG1hcHBlciB0aGF0IHdlIHdhbnQgdG8gdGFsayB0byBpdAorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJBYm91dCB0byBtYXAgRUlTQSBjYXJkIFxuIik7CisKKwkJaWYgKFJJT01hcGluKCBQYWRkciwgUklPX0VJU0FfTUVNX1NJWkUsICZDYWRkcikgPT0gLTEpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQ291bGRuJ3QgbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAorCQkJCQkJCVJJT19FSVNBX01FTV9TSVpFLFBhZGRyKTsKKwkJY29udGludWU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBtYXBwZWQgdG8gdmFkZHIgMHgleFxuIiwgQ2FkZHIpOworCisJCS8qCisJCSoqIEFuZCBjaGVjayB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZXJlIQorCQkqLworCQlpZiAoIFJJT0JvYXJkVGVzdCggUGFkZHIsQ2FkZHIsUklPX0VJU0EsRWlzYVNsb3QpID09IFJJT19TVUNDRVNTICkKKwkJCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQm9hcmQgaGFzIHBhc3NlZCB0ZXN0XG4iKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAKKwkJIlNsb3QgJWQuIEl2ZWMgJWQuIFR5cGUgJWQuIFBhZGRyIDB4JXguIENhZGRyIDB4JXguIE1vZGUgMHgleC5cbiIsCisJCQlFaXNhU2xvdCxJdmVjLFJJT19FSVNBLFBhZGRyLENhZGRyLE1vZGUpOworCisJCS8qCisJCSoqIEJvYXJkIGhhcyBwYXNzZWQgaXRzIHNjcnViIHRlc3QuIEZpbGwgaW4gYWxsIHRoZQorCQkqKiB0cmFuc2llbnQgc3R1ZmYuCisJCSovCisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5TbG90CSA9IEVpc2FTbG90OworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uSXZlYwkgPSBJdmVjOworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVHlwZQkgPSBSSU9fRUlTQTsKKwkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNvcHkJID0gYmNvcHk7CisJCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlBhZGRyUCAgID0gUGFkZHI7CisJCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNhZGRyCT0gQ2FkZHI7CisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKilDYWRkcjsKKwkJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uTW9kZQkgPSBNb2RlOworCQkvKgorCQkqKiBiZWNhdXNlIHRoZSBFSVNBIHByb20gaXMgbWFwcGVkIGludG8gSU8gc3BhY2UsIHdlCisJCSoqIG5lZWQgdG8gY29weSB0aGUgdW5xaXVlIG51bWJlciBpbnRvIHRoZSBtZW1vcnkgYXJlYQorCQkqKiB0aGF0IGl0IHdvdWxkIGhhdmUgb2NjdXBpZWQsIHNvIHRoYXQgdGhlIGRvd25sb2FkCisJCSoqIGNvZGUgY2FuIGRldGVybWluZSBpdHMgSUQgYW5kIGNhcmQgdHlwZS4KKwkJKi8KKwkgV0JZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVswXSxJTkJaKEVpc2FTbG90LEVJU0FfVU5JUVVFX05VTV8wKSk7CisJIFdCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMV0sSU5CWihFaXNhU2xvdCxFSVNBX1VOSVFVRV9OVU1fMSkpOworCSBXQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzJdLElOQlooRWlzYVNsb3QsRUlTQV9VTklRVUVfTlVNXzIpKTsKKwkgV0JZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVszXSxJTkJaKEVpc2FTbG90LEVJU0FfVU5JUVVFX05VTV8zKSk7CisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVOdW0gPQorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSYweEZGKTw8MCl8CisJCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMV0pJjB4RkYpPDw4KXwKKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkmMHhGRik8PDE2KXwKKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVszXSkmMHhGRik8PDI0KTsKKwkJSU5CWihFaXNhU2xvdCxFSVNBX0lOVEVSUlVQVF9SRVNFVCk7CisJCQkJUklPTnVtSG9zdHMrKzsKKwkJcmV0Kys7CisJCQl9CisJCWVsc2UKKwkJeworCQkvKgorCQkqKiBJdCBmYWlsZWQgdGhlIHRlc3QsIHNvIGlnbm9yZSBpdC4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiVEVTVCBGQUlMRURcbiIpOworCisJCVJJT01hcG91dChQYWRkciwgUklPX0VJU0FfTUVNX1NJWkUsIENhZGRyICk7CisJCX0KKwl9CisJfQorCWlmIChSSU9NYWNoaW5lVHlwZSAmIFJJT19FSVNBKQorCXJldHVybiByZXQrMTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworI2lmbmRlZiBsaW51eAorCisjZGVmaW5lIENPTkZJR19BRERSRVNTCTB4Y2Y4CisjZGVmaW5lIENPTkZJR19EQVRBCQkweGNmYworI2RlZmluZSBGT1JXQVJEX1JFRwkJMHhjZmEKKworCitzdGF0aWMgaW50CityZWFkX2NvbmZpZyhpbnQgYnVzX251bWJlciwgaW50IGRldmljZV9udW0sIGludCByX251bWJlcikgCit7CisJdW5zaWduZWQgaW50IGNhdjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisvKgorICAgQnVpbGQgY29uZmlnX2FkZHJlc3NfdmFsdWU6CisKKyAgICAgIDMxICAgICAgICAyNCAyMyAgICAgICAgMTYgMTUgICAgICAxMSAxMCAgOCA3ICAgICAgICAwIAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB8MXwgMDAwMDAwMCB8IGJ1c19udW1iZXIgfCBkZXZpY2UgIyB8IDAwMCB8IHJlZ2lzdGVyIHwKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCWNhdiA9IHJfbnVtYmVyICYgMHhmZjsKKwljYXYgfD0gKChkZXZpY2VfbnVtICYgMHgxZikgPDwgMTEpOworCWNhdiB8PSAoKGJ1c19udW1iZXIgJiAweGZmKSA8PCAxNik7CisJY2F2IHw9IDB4ODAwMDAwMDA7IC8qIEVuYWJsZSBiaXQgKi8KKwlvdXRwZChDT05GSUdfQUREUkVTUyxjYXYpOworCXZhbCA9IGlucGQoQ09ORklHX0RBVEEpOworCW91dHBkKENPTkZJR19BRERSRVNTLDApOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYword3JpdGVfY29uZmlnKGJ1c19udW1iZXIsZGV2aWNlX251bSxyX251bWJlcix2YWwpIAoreworCXVuc2lnbmVkIGludCBjYXY7CisKKy8qCisgICBCdWlsZCBjb25maWdfYWRkcmVzc192YWx1ZToKKworICAgICAgMzEgICAgICAgIDI0IDIzICAgICAgICAxNiAxNSAgICAgIDExIDEwICA4IDcgICAgICAgIDAgCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIHwxfCAwMDAwMDAwIHwgYnVzX251bWJlciB8IGRldmljZSAjIHwgMDAwIHwgcmVnaXN0ZXIgfAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisJY2F2ID0gcl9udW1iZXIgJiAweGZmOworCWNhdiB8PSAoKGRldmljZV9udW0gJiAweDFmKSA8PCAxMSk7CisJY2F2IHw9ICgoYnVzX251bWJlciAmIDB4ZmYpIDw8IDE2KTsKKwljYXYgfD0gMHg4MDAwMDAwMDsgLyogRW5hYmxlIGJpdCAqLworCW91dHBkKENPTkZJR19BRERSRVNTLCBjYXYpOworCW91dHBkKENPTkZJR19EQVRBLCB2YWwpOworCW91dHBkKENPTkZJR19BRERSRVNTLCAwKTsKKwlyZXR1cm4gdmFsOworfQorI2Vsc2UKKy8qIFhYWCBJbXBsZW1lbnQgdGhlc2UuLi4gKi8KK3N0YXRpYyBpbnQKK3JlYWRfY29uZmlnKGludCBidXNfbnVtYmVyLCBpbnQgZGV2aWNlX251bSwgaW50IHJfbnVtYmVyKSAKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX2NvbmZpZyhpbnQgYnVzX251bWJlciwgaW50IGRldmljZV9udW0sIGludCByX251bWJlcikgCit7CisgIHJldHVybiAwOworfQorCisjZW5kaWYKKworaW50CitSSU9QQ0lpbml0KHAsIE1vZGUpCitzdHJ1Y3QgcmlvX2luZm8JKnA7CitpbnQgCQlNb2RlOworeworCSNkZWZpbmUgTUFYX1BDSV9TTE9UCQkzMgorCSNkZWZpbmUgUklPX1BDSV9KRVRfQ0FSRAkweDIwMDAxMUNCCisKKwlzdGF0aWMgaW50CXNsb3Q7CS8qIGNvdW50IG9mIG1hY2hpbmUncyBQQ0kgc2xvdHMgc2VhcmNoZWQgc28gZmFyICovCisJY2FkZHJfdAkJQ2FkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBQQ0kgaG9zdCBjYXJkLiAqLworCXVuc2lnbmVkIGNoYXIJSXZlYzsJLyogaW50ZXJydXB0IHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgUENJIGhvc3QgKi8KKwl1bnNpZ25lZCBsb25nCVBhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY3VycmVudCBQQ0kgaG9zdCAqLworCWludAkJSGFuZGxlOwkvKiBIYW5kbGUgdG8gVmlydHVhbCBtZW1vcnkgYWxsb2NhdGVkIGZvciBjdXJyZW50IFBDSSBob3N0ICovCisKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJTZWFyY2ggZm9yIGEgUklPIFBDSSBjYXJkIC0gc3RhcnQgYXQgc2xvdCAlZFxuIiwgc2xvdCk7CisKKwkvKgorCSoqIEluaXRpYWxpc2UgdGhlIHNlYXJjaCBzdGF0dXMKKwkqLworCXAtPlJJT0xhc3RQQ0lTZWFyY2gJPSBSSU9fRkFJTDsKKworCXdoaWxlICggKHNsb3QgPCBNQVhfUENJX1NMT1QpICYgKHAtPlJJT0xhc3RQQ0lTZWFyY2ggIT0gUklPX1NVQ0NFU1MpICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJDdXJyZW50bHkgdGVzdGluZyBzbG90ICVkXG4iLCBzbG90KTsKKworCQlpZiAocmVhZF9jb25maWcoMCxzbG90LDApID09IFJJT19QQ0lfSkVUX0NBUkQpIHsKKwkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjID0gMDsKKwkJCVBhZGRyID0gcmVhZF9jb25maWcoMCxzbG90LDB4MTgpOworCQkJUGFkZHIgPSBQYWRkciAtIChQYWRkciAmIDB4MSk7IC8qIE1hc2sgb2ZmIHRoZSBpbyBiaXQgKi8KKworCQkJaWYgKCAoUGFkZHIgPT0gMCkgfHwgKChQYWRkciAmIDB4ZmZmZjAwMDApID09IDB4ZmZmZjAwMDApICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJHb29mZWQgdXAgc2xvdFxuIik7CS8qIHdoYXQhICovCisJCQkJc2xvdCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQID0gUGFkZHI7CisJCQlJdmVjID0gKHJlYWRfY29uZmlnKDAsc2xvdCwweDNjKSAmIDB4ZmYpOworCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUENJIEhvc3QgYXQgMHgleCwgSW50ciAlZFxuIiwgKGludClQYWRkciwgSXZlYyk7CisKKwkJCUhhbmRsZSA9IFJJT01hcGluKCBQYWRkciwgUklPX1BDSV9NRU1fU0laRSwgJkNhZGRyICk7CisJCQlpZiAoSGFuZGxlID09IC0xKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkNvdWxkbid0IG1hcCAlZCBieXRlcyBhdCAweCV4XG4iLCBSSU9fUENJX01FTV9TSVpFLCAoaW50KVBhZGRyKTsKKwkJCQlzbG90Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYyA9IEl2ZWMgKyAzMjsKKwkJCXAtPmludHJfdGlkID0gaW9pbnRzZXQocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMsCisJCQkJCQkoaW50ICgqKSgpKXJpb19pbnRyLCAoY2hhciAqKXAtPlJJT051bUhvc3RzKTsKKwkJCWlmIChSSU9Cb2FyZFRlc3QoIFBhZGRyLCBDYWRkciwgUklPX1BDSSwgMCApID09IFJJT19TVUNDRVNTKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAoIkJvYXJkIGhhcyBwYXNzZWQgdGVzdFxuIik7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAoIlBhZGRyIDB4JXguIENhZGRyIDB4JXguIE1vZGUgMHgleC5cbiIsIFBhZGRyLCBDYWRkciwgTW9kZSk7CisKKwkJCQkvKgorCQkJCSoqIEJvYXJkIGhhcyBwYXNzZWQgaXRzIHNjcnViIHRlc3QuIEZpbGwgaW4gYWxsIHRoZQorCQkJCSoqIHRyYW5zaWVudCBzdHVmZi4KKwkJCQkqLworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5TbG90CSAgID0gMDsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYwkgICA9IEl2ZWMgKyAzMjsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVHlwZQkgICA9IFJJT19QQ0k7CisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvcHkJICAgPSByaW9fcGNpY29weTsgCisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUAkgICA9IFBhZGRyOworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcgkgICA9IENhZGRyOworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYXJkUAkgICA9IChzdHJ1Y3QgRHBSYW0gKilDYWRkcjsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZQkgICA9IE1vZGU7CisKKyNpZiAwCisJCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvbnRyb2wsIAorCQkJCQkJQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfCAKKwkJCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Nb2RlIHwgCisJCQkJCQlJTlRFUlJVUFRfRElTQUJMRSApOworCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwweGZmKTsKKwkJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29udHJvbCwKKwkJCQkJCUJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwgCisJCQkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZSB8CisJCQkJCQlJTlRFUlJVUFRfRElTQUJMRSApOworCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwweGZmKTsKKyNlbHNlCisJCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LCAweGZmKTsKKyNlbmRpZgorCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0gID0KKwkJCQkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSYweEZGKTw8MCl8CisJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkmMHhGRik8PDgpfAorCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMl0pJjB4RkYpPDwxNil8CisJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkmMHhGRik8PDI0KTsKKworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlVuaXF1ZSBubyAweCV4LlxuIiwgCisJCQkJICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworCisJCQkJcC0+UklPTGFzdFBDSVNlYXJjaCA9IFJJT19TVUNDRVNTOworCQkJCXAtPlJJT051bUhvc3RzKys7CisJCQl9CisJCX0KKwkJc2xvdCsrOworCX0KKworCWlmICggc2xvdCA+PSBNQVhfUENJX1NMT1QgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJBbGwgJWQgUENJIHNsb3RzIGhhdmUgdGVzdGVkIGZvciBSSU8gY2FyZHMgISEhXG4iLAorCQkJICAgICBNQVhfUENJX1NMT1QpOworCX0KKworCisJLyoKKwkqKiBJIGRvbid0IHRoaW5rIHdlIHdhbnQgdG8gZG8gdGhpcyBhbnltb3JlCisJKioKKworCWlmICghcC0+UklPTGFzdFBDSVNlYXJjaCA9PSBSSU9fRkFJTCApIHsKKwkJcC0+UklPRmFpbGVkKys7CisJfQorCisJKioKKwkqLworfQorCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKK3ZvaWQgcmlvaGFsdCggdm9pZCApCit7CisJaW50IGhvc3Q7CisJZm9yICggaG9zdD0wOyBob3N0PHAtPlJJT051bUhvc3RzOyBob3N0KysgKQorCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU3RvcCBob3N0ICVkXG4iLCBob3N0KTsKKwkJKHZvaWQpUklPQm9hcmRUZXN0KCBwLT5SSU9Ib3N0c1tob3N0XS5QYWRkclAsIHAtPlJJT0hvc3RzW2hvc3RdLkNhZGRyLCBwLT5SSU9Ib3N0c1tob3N0XS5UeXBlLHAtPlJJT0hvc3RzW2hvc3RdLlNsb3QgKTsKKwl9Cit9CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMJdWNoYXIJdmFsW10gPSB7CisjaWZkZWYgVkVSWV9MT05HX1RFU1QKKwkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCisJICAweGE1LCAweGZmLCAweDVhLCAweDAwLCAweGZmLCAweGM5LCAweDM2LCAKKyNlbmRpZgorCSAgMHhmZiwgMHgwMCwgMHgwMCB9OworCisjZGVmaW5lCVRFU1RfRU5EIHNpemVvZih2YWwpCisKKy8qCisqKiBSQU0gdGVzdCBhIGJvYXJkLiAKKyoqIE5vdGhpbmcgdG9vIGNvbXBsaWNhdGVkLCBqdXN0IGVub3VnaCB0byBjaGVjayBpdCBvdXQuCisqLworaW50CitSSU9Cb2FyZFRlc3QocGFkZHIsIGNhZGRyLCB0eXBlLCBzbG90KQorcGFkZHJfdAlwYWRkcjsKK2NhZGRyX3QJY2FkZHI7Cit1Y2hhcgl0eXBlOworaW50CQlzbG90OworeworCXN0cnVjdCBEcFJhbSAqRHBSYW0gPSAoc3RydWN0IERwUmFtICopY2FkZHI7CisJY2hhciAqcmFtWzRdOworCWludCAgc2l6ZVs0XTsKKwlpbnQgIG9wLCBiYW5rOworCWludCAgbmJhbmtzOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFJlc2V0IGhvc3QgdHlwZT0lZCwgRHBSYW09MHgleCwgc2xvdD0lZFxuIiwKKwkJCXR5cGUsKGludClEcFJhbSwgc2xvdCk7CisKKwlSSU9Ib3N0UmVzZXQodHlwZSwgRHBSYW0sIHNsb3QpOworCisJLyoKKwkqKiBTY3J1YiB0aGUgbWVtb3J5LiBUaGlzIGNvbWVzIGluIHNldmVyYWwgYmFua3M6CisJKiogRFBzcmFtMQktIDcwMDBoIGJ5dGVzCisJKiogRFBzcmFtMgktIDIwMGggIGJ5dGVzCisJKiogRFBzcmFtMwktIDcwMDBoIGJ5dGVzCisJKiogc2NyYXRjaAktIDEwMDBoIGJ5dGVzCisJKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBTZXR1cCByYW0vc2l6ZSBhcnJheXNcbiIpOworCisJc2l6ZVswXSA9IERQX1NSQU0xX1NJWkU7CisJc2l6ZVsxXSA9IERQX1NSQU0yX1NJWkU7CisJc2l6ZVsyXSA9IERQX1NSQU0zX1NJWkU7CisJc2l6ZVszXSA9IERQX1NDUkFUQ0hfU0laRTsKKworCXJhbVswXSA9IChjaGFyICopJkRwUmFtLT5EcFNyYW0xWzBdOworCXJhbVsxXSA9IChjaGFyICopJkRwUmFtLT5EcFNyYW0yWzBdOworCXJhbVsyXSA9IChjaGFyICopJkRwUmFtLT5EcFNyYW0zWzBdOworCW5iYW5rcyA9ICh0eXBlID09IFJJT19QQ0kpID8gMyA6IDQ7CisJaWYgKG5iYW5rcyA9PSA0KQorCQlyYW1bM10gPSAoY2hhciAqKSZEcFJhbS0+RHBTY3JhdGNoWzBdOworCisKKwlpZiAobmJhbmtzID09IDMpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IE1lbW9yeTogMHgleCgweCV4KSwgMHgleCgweCV4KSwgMHgleCgweCV4KVxuIiwKKwkJCQkoaW50KXJhbVswXSwgc2l6ZVswXSwgKGludClyYW1bMV0sIHNpemVbMV0sIChpbnQpcmFtWzJdLCBzaXplWzJdKTsKKwl9IGVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogMHgleCgweCV4KSwgMHgleCgweCV4KSwgMHgleCgweCV4KSwgMHgleCgweCV4KVxuIiwKKwkJCShpbnQpcmFtWzBdLCBzaXplWzBdLCAoaW50KXJhbVsxXSwgc2l6ZVsxXSwgKGludClyYW1bMl0sIHNpemVbMl0sIChpbnQpcmFtWzNdLCAKKwkJCQkJc2l6ZVszXSk7CisJfQorCisJLyoKKwkqKiBUaGlzIHNjcnViIG9wZXJhdGlvbiB3aWxsIHRlc3QgZm9yIGNyb3NzdGFsayBiZXR3ZWVuCisJKiogYmFua3MuIFRFU1RfRU5EIGlzIGEgbWFnaWMgbnVtYmVyLCBhbmQgcmVsYXRlcyB0byB0aGUgb2Zmc2V0CisJKiogd2l0aGluIHRoZSAndmFsJyBhcnJheSB1c2VkIGJ5IFNjcnViLgorCSovCisJZm9yIChvcD0wOyBvcDxURVNUX0VORDsgb3ArKykgeworCQlmb3IgKGJhbms9MDsgYmFuazxuYmFua3M7IGJhbmsrKykgeworCQkJaWYgKFJJT1NjcnViKG9wLCAoQllURSAqKXJhbVtiYW5rXSwgc2l6ZVtiYW5rXSkgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUklPU2NydWIgYmFuZCAlZCwgb3AgJWQgZmFpbGVkXG4iLCAKKwkJCQkJCQliYW5rLCBvcCk7CisJCQkJcmV0dXJuIFJJT19GQUlMOworCQkJfQorCQl9CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiVGVzdCBjb21wbGV0ZWRcbiIpOworCXJldHVybiBSSU9fU1VDQ0VTUzsKK30KKworCisvKgorKiogU2NydWIgYW4gYXJlYSBvZiBSQU0uCisqKiBEZWZpbmUgUFJFVEVTVCBhbmQgUE9TVFRFU1QgZm9yIGEgbW9yZSB0aG9yb3VnaCBjaGVja2luZyBvZiB0aGUKKyoqIHN0YXRlIG9mIHRoZSBtZW1vcnkuCisqKiBDYWxsIHdpdGggb3Agc2V0IHRvIGFuIGluZGV4IGludG8gdGhlIGFib3ZlICd2YWwnIGFycmF5IHRvIGRldGVybWluZQorKiogd2hpY2ggdmFsdWUgd2lsbCBiZSB3cml0dGVuIGludG8gbWVtb3J5LgorKiogQ2FsbCB3aXRoIG9wIHNldCB0byB6ZXJvIG1lYW5zIHRoYXQgdGhlIFJBTSB3aWxsIG5vdCBiZSByZWFkIGFuZCBjaGVja2VkCisqKiBiZWZvcmUgaXQgaXMgd3JpdHRlbi4KKyoqIENhbGwgd2l0aCBvcCBub3QgemVybywgYW5kIHRoZSBSQU0gd2lsbCBiZSByZWFkIGFuZCBjb21wYXRlZCB3aXRoIHZhbFtvcC0xXQorKiogdG8gY2hlY2sgdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBwaGFzZSB3YXMgcmV0YWluZWQuCisqLworc3RhdGljIGludAorUklPU2NydWIob3AsIHJhbSwgc2l6ZSkKK2ludAkJb3A7CitCWVRFICoJcmFtOworaW50CQlzaXplOyAKK3sKKwlpbnQJCQkJb2ZmOworCXVuc2lnbmVkIGNoYXIJb2xkYnl0ZTsKKwl1bnNpZ25lZCBjaGFyCW5ld2J5dGU7CisJdW5zaWduZWQgY2hhcglpbnZieXRlOworCXVuc2lnbmVkIHNob3J0CW9sZHdvcmQ7CisJdW5zaWduZWQgc2hvcnQJbmV3d29yZDsKKwl1bnNpZ25lZCBzaG9ydAlpbnZ3b3JkOworCXVuc2lnbmVkIHNob3J0CXN3YXB3b3JkOworCisJaWYgKG9wKSB7CisJCW9sZGJ5dGUgPSB2YWxbb3AtMV07CisJCW9sZHdvcmQgPSBvbGRieXRlIHwgKG9sZGJ5dGU8PDgpOworCX0gZWxzZQorCSAgb2xkYnl0ZSA9IG9sZHdvcmQgPSAwOyAvKiBUZWxsIHRoZSBjb21waWxlciB3ZSd2ZSBpbml0aWxhbGl6ZWQgdGhlbS4gKi8KKwluZXdieXRlID0gdmFsW29wXTsKKwluZXd3b3JkID0gbmV3Ynl0ZSB8IChuZXdieXRlPDw4KTsKKwlpbnZieXRlID0gfm5ld2J5dGU7CisJaW52d29yZCA9IGludmJ5dGUgfCAoaW52Ynl0ZTw8OCk7CisKKwkvKgorCSoqIENoZWNrIHRoYXQgdGhlIFJBTSBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGxlZnQgdGhlcmUKKwkqKiBieSB0aGUgcHJldmlvdXMgdGVzdCAobm90IGFwcGxpY2FibGUgZm9yIHBhc3MgemVybykKKwkqLworCWlmIChvcCkgeworCQlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKyspIHsKKwkJCWlmIChSQllURShyYW1bb2ZmXSkgIT0gb2xkYnl0ZSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBCeXRlIFByZSBDaGVjayAxOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBvbGRieXRlLCBSQllURShyYW1bb2ZmXSkpOworCQkJCXJldHVybiBSSU9fRkFJTDsKKwkJCX0KKwkJfQorCQlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCQlpZiAoKih1c2hvcnQgKikmcmFtW29mZl0gIT0gb2xkd29yZCkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBXb3JkIFByZSBDaGVjazogV09SRCBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsb2ZmLG9sZHdvcmQsKih1c2hvcnQgKikmcmFtW29mZl0pOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBXb3JkIFByZSBDaGVjazogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCQlyZXR1cm4gUklPX0ZBSUw7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSoqIE5vdyB3cml0ZSB0aGUgSU5WRVJTRSBvZiB0aGUgdGVzdCBkYXRhIGludG8gZXZlcnkgbG9jYXRpb24sIHVzaW5nCisJKiogQllURSB3cml0ZSBvcGVyYXRpb25zLCBmaXJzdCBjaGVja2luZyBiZWZvcmUgZWFjaCBieXRlIGlzIHdyaXR0ZW4KKwkqKiB0aGF0IHRoZSBsb2NhdGlvbiBjb250YWlucyB0aGUgb2xkIHZhbHVlIHN0aWxsLCBhbmQgY2hlY2tpbmcgYWZ0ZXIKKwkqKiB0aGUgd3JpdGUgdGhhdCB0aGUgbG9jYXRpb24gY29udGFpbnMgdGhlIGRhdGEgc3BlY2lmaWVkIC0gdGhpcyBpcworCSoqIHRoZSBCWVRFIHJlYWQvd3JpdGUgdGVzdC4KKwkqLworCWZvciAob2ZmPTA7IG9mZjxzaXplOyBvZmYrKykgeworCQlpZiAob3AgJiYgKFJCWVRFKHJhbVtvZmZdKSAhPSBvbGRieXRlKSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IEJ5dGUgUHJlIENoZWNrIDI6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG9sZGJ5dGUsIFJCWVRFKHJhbVtvZmZdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJV0JZVEUocmFtW29mZl0saW52Ynl0ZSk7CisJCWlmIChSQllURShyYW1bb2ZmXSkgIT0gaW52Ynl0ZSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IEJ5dGUgSW52IENoZWNrOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBpbnZieXRlLCBSQllURShyYW1bb2ZmXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJfQorCisJLyoKKwkqKiBub3csIHVzZSBXT1JEIG9wZXJhdGlvbnMgdG8gd3JpdGUgdGhlIHRlc3QgdmFsdWUgaW50byBldmVyeSBsb2NhdGlvbiwKKwkqKiBjaGVjayBhcyBiZWZvcmUgdGhhdCB0aGUgbG9jYXRpb24gY29udGFpbnMgdGhlIHByZXZpb3VzIHRlc3QgdmFsdWUKKwkqKiBiZWZvcmUgb3ZlcndyaXRpbmcsIGFuZCB0aGF0IGl0IGNvbnRhaW5zIHRoZSBkYXRhIHZhbHVlIHdyaXR0ZW4KKwkqKiBhZnRlcndhcmRzLgorCSoqIFRoaXMgaXMgdGhlIFdPUkQgb3BlcmF0aW9uIHRlc3QuCisJKi8KKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCWlmICgqKHVzaG9ydCAqKSZyYW1bb2ZmXSAhPSBpbnZ3b3JkKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogV29yZCBJbnYgQ2hlY2s6IFdPUkQgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIGludndvcmQsICoodXNob3J0ICopJnJhbVtvZmZdKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFdvcmQgSW52IENoZWNrOiBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXhcbiIsIG9mZiwgUkJZVEUocmFtW29mZl0pLCBvZmYrMSwgUkJZVEUocmFtW29mZisxXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisKKwkJKih1c2hvcnQgKikmcmFtW29mZl0gPSBuZXd3b3JkOworCQlpZiAoICoodXNob3J0ICopJnJhbVtvZmZdICE9IG5ld3dvcmQgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUG9zdCBXb3JkIENoZWNrIDE6IFdPUkQgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG5ld3dvcmQsICoodXNob3J0ICopJnJhbVtvZmZdKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IFdvcmQgQ2hlY2sgMTogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCX0KKworCS8qCisJKiogbm93IHJ1biB0aHJvdWdoIHRoZSBibG9jayBvZiBtZW1vcnkgYWdhaW4sIGZpcnN0IGluIGJ5dGUgbW9kZQorCSoqIHRoZW4gaW4gd29yZCBtb2RlLCBhbmQgY2hlY2sgdGhhdCBhbGwgdGhlIGxvY2F0aW9ucyBjb250YWluIHRoZQorCSoqIHJlcXVpcmVkIHRlc3QgZGF0YS4KKwkqLworCWZvciAob2ZmPTA7IG9mZjxzaXplOyBvZmYrKykgeworCQlpZiAoUkJZVEUocmFtW29mZl0pICE9IG5ld2J5dGUpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IEJ5dGUgQ2hlY2s6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG5ld2J5dGUsIFJCWVRFKHJhbVtvZmZdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwl9CisKKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCWlmICggKih1c2hvcnQgKikmcmFtW29mZl0gIT0gbmV3d29yZCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IFdvcmQgQ2hlY2sgMjogV09SRCBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgbmV3d29yZCwgKih1c2hvcnQgKikmcmFtW29mZl0pOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFBvc3QgV29yZCBDaGVjayAyOiBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXhcbiIsIG9mZiwgUkJZVEUocmFtW29mZl0pLCBvZmYrMSwgUkJZVEUocmFtW29mZisxXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJfQorCisJLyoKKwkqKiB0aW1lIHRvIGNoZWNrIG91dCBieXRlIHN3YXBwaW5nIGVycm9ycworCSovCisJc3dhcHdvcmQgPSBpbnZieXRlIHwgKG5ld2J5dGUgPDwgOCk7CisKKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCVdCWVRFKHJhbVtvZmZdLGludmJ5dGUpOworCQlXQllURShyYW1bb2ZmKzFdLG5ld2J5dGUpOworCX0KKworCWZvciAoIG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yICkgeworCQlpZiAoKih1c2hvcnQgKikmcmFtW29mZl0gIT0gc3dhcHdvcmQpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBTd2FwV29yZCBDaGVjayAxOiBXT1JEIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBzd2Fwd29yZCwgKigodXNob3J0ICopJnJhbVtvZmZdKSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogU3dhcFdvcmQgQ2hlY2sgMTogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQkqKCh1c2hvcnQgKikmcmFtW29mZl0pID0gfnN3YXB3b3JkOworCX0KKworCWZvciAob2ZmPTA7IG9mZjxzaXplOyBvZmYrPTIpIHsKKwkJaWYgKFJCWVRFKHJhbVtvZmZdKSAhPSBuZXdieXRlKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogU3dhcFdvcmQgQ2hlY2sgMjogQllURSBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgbmV3Ynl0ZSwgUkJZVEUocmFtW29mZl0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoUkJZVEUocmFtW29mZisxXSkgIT0gaW52Ynl0ZSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFN3YXBXb3JkIENoZWNrIDI6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYrMSwgaW52Ynl0ZSwgUkJZVEUocmFtW29mZisxXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJCSooKHVzaG9ydCAqKSZyYW1bb2ZmXSkgPSBuZXd3b3JkOworCX0KKwlyZXR1cm4gUklPX1NVQ0NFU1M7Cit9CisKKy8qCisqKiB0cnkgdG8gZW5zdXJlIHRoYXQgZXZlcnkgaG9zdCBpcyBlaXRoZXIgaW4gcG9sbGVkIG1vZGUKKyoqIG9yIGlzIGluIGludGVycnVwdCBtb2RlLiBPbmx5IGFsbG93IGludGVycnVwdCBtb2RlIGlmCisqKiBhbGwgaG9zdHMgY2FuIGludGVycnVwdCAod2h5PykKKyoqIGFuZCBmb3JjZSBpbnRvIHBvbGxlZCBtb2RlIGlmIHRvbGQgdG8uIFBhdGNoIHVwIHRoZQorKiogaW50ZXJydXB0IHZlY3RvciAmIHNhbHV0ZSBUaGUgUXVlZW4gd2hlbiB5b3UndmUgZG9uZS4KKyovCisjaWYgMAorc3RhdGljIHZvaWQKK1JJT0FsbG9jYXRlSW50ZXJydXB0cyhwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3sKKwlpbnQgSG9zdDsKKworCS8qCisJKiogRWFzeSBjYXNlIC0gaWYgd2UgaGF2ZSBiZWVuIHRvbGQgdG8gcG9sbCwgdGhlbiB3ZSBwb2xsLgorCSovCisJaWYgKHAtPm1vZGUgJiBQT0xMRURfTU9ERSkgeworCQlSSU9TdG9wSW50ZXJydXB0cyhwLCAwLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJKiogY2hlY2sgLSBpZiBhbnkgaG9zdCBoYXMgYmVlbiBzZXQgdG8gcG9sbGVkIG1vZGUsIHRoZW4gYWxsIG11c3QgYmUuCisJKi8KKwlmb3IgKEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrKSB7CisJCWlmICggKHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgIT0gUklPX0FUKSAmJgorCQkJCShwLT5SSU9Ib3N0c1tIb3N0XS5JdmVjID09IFBPTExFRCkgKSB7CisJCQlSSU9TdG9wSW50ZXJydXB0cyhwLCAxLCBIb3N0ICk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZm9yIChIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKykgeworCQlpZiAocC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQpIHsKKwkJCWlmICggKHAtPlJJT0hvc3RzW0hvc3RdLkl2ZWMgLSAzMikgPT0gMCkgeworCQkJCVJJT1N0b3BJbnRlcnJ1cHRzKHAsIDIsIEhvc3QgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisqKiBzb21ldGhpbmcgaGFzIGRlY2lkZWQgdGhhdCB3ZSBjYW4ndCBiZSBkb2luZyB3aXRoIHRoZXNlCisqKiBuZXctZmFuZ2xlZCBpbnRlcnJ1cHQgdGhpbmdpZXMuIFNldCBldmVyeXRoaW5nIHVwIHRvIGp1c3QKKyoqIHBvbGwuCisqLworc3RhdGljIHZvaWQKK1JJT1N0b3BJbnRlcnJ1cHRzKHAsIFJlYXNvbiwgSG9zdCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitpbnQJUmVhc29uOworaW50CUhvc3Q7IAoreworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJc3dpdGNoIChSZWFzb24pIHsKKwkJY2FzZSAwOgkvKiBmb3JjZWQgaW50byBwb2xsaW5nIGJ5IHJpb19wb2xsZWQgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIFNDVSBoYXMgc2V0ICdIb3N0JyBpbnRvIHBvbGxlZCBtb2RlICovCisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGludGVycnVwdCB2ZWN0b3JzIGZvciAnSG9zdCcgKi8KKwkJCWJyZWFrOworCX0KKyNlbmRpZgorCisJZm9yIChIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCisJCXN3aXRjaCAoSG9zdFAtPlR5cGUpIHsKKwkJCWNhc2UgUklPX0FUOgorCQkJCS8qCisJCQkJKiogVGhlIEFUIGhvc3QgaGFzIGl0J3MgaW50ZXJydXB0cyBkaXNhYmxlZCBieSBjbGVhcmluZyB0aGUKKwkJCQkqKiBpbnRfZW5hYmxlIGJpdC4KKwkJCQkqLworCQkJCUhvc3RQLT5Nb2RlICY9IH5JTlRFUlJVUFRfRU5BQkxFOworCQkJCUhvc3RQLT5JdmVjID0gUE9MTEVEOworCQkJCWJyZWFrOworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJCQljYXNlIFJJT19FSVNBOgorCQkJCS8qCisJCQkJKiogVGhlIEVJU0EgaG9zdCBoYXMgaXQncyBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlCisJCQkJKiogSXZlYyB0byB6ZXJvCisJCQkJKi8KKwkJCQlIb3N0UC0+SXZlYyA9IFBPTExFRDsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSBSSU9fUENJOgorCQkJCS8qCisJCQkJKiogVGhlIFBDSSBob3N0IGhhcyBpdCdzIGludGVycnVwdHMgZGlzYWJsZWQgYnkgY2xlYXJpbmcgdGhlCisJCQkJKiogaW50X2VuYWJsZSBiaXQsIGxpa2UgYSByZWd1bGFyIGhvc3QgY2FyZC4KKwkJCQkqLworCQkJCUhvc3RQLT5Nb2RlICY9IH5SSU9fUENJX0lOVF9FTkFCTEU7CisJCQkJSG9zdFAtPkl2ZWMgPSBQT0xMRUQ7CisJCQkJYnJlYWs7CisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwkJCWNhc2UgUklPX01DQToKKwkJCQkvKgorCQkJCSoqIFRoZXJlJ3MgYWx3YXlzIG9uZSwgaXNuJ3QgdGhlcmU/CisJCQkJKiogVGhlIE1DQSBob3N0IGNhcmQgY2Fubm90IGhhdmUgaXQncyBpbnRlcnJ1cHRzIGRpc2FibGVkLgorCQkJCSovCisJCQkJUklPUGF0Y2hWZWMoSG9zdFApOworCQkJCWJyZWFrOworI2VuZGlmCisJCX0KKwl9Cit9CisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBpbml0IHRpbWUgdG8gc2V0dXAgdGhlIGRhdGEgc3RydWN0dXJlcy4KKyovCit2b2lkCitSSU9BbGxvY0RhdGFTdHJ1Y3RzKHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWludAlwb3J0LAorCQlob3N0LAorCQl0bTsKKworCXAtPlJJT1BvcnRwID0gKHN0cnVjdCBQb3J0ICopc3lzYnJrKFJJT19QT1JUUyAqIHNpemVvZihzdHJ1Y3QgUG9ydCkpOworCWlmICghcC0+UklPUG9ydHApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IE5vIG1lbW9yeSBmb3IgcG9ydCBzdHJ1Y3R1cmVzXG4iKTsKKwkJcC0+UklPRmFpbGVkKys7CisJCXJldHVybjsKKwl9IAorCWJ6ZXJvKCBwLT5SSU9Qb3J0cCwgc2l6ZW9mKHN0cnVjdCBQb3J0KSAqIFJJT19QT1JUUyApOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJSSU8taW5pdDogYWxsb2NhdGVkIGFuZCBjbGVhcmVkIG1lbW9yeSBmb3IgcG9ydCBzdHJ1Y3RzXG4iKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiRmlyc3QgUklPIHBvcnQgc3RydWN0IEAweCV4LCBzaXplPTB4JXggYnl0ZXNcbiIsCisJICAgIChpbnQpcC0+UklPUG9ydHAsIHNpemVvZihzdHJ1Y3QgUG9ydCkpOworCisJZm9yKCBwb3J0PTA7IHBvcnQ8UklPX1BPUlRTOyBwb3J0KysgKSB7CisJCXAtPlJJT1BvcnRwW3BvcnRdLlBvcnROdW0gPSBwb3J0OworCQlwLT5SSU9Qb3J0cFtwb3J0XS5UdHlQID0gJnAtPmNoYW5uZWxbcG9ydF07CisJCXNyZXNldCAocC0+UklPUG9ydHBbcG9ydF0uSW5Vc2UpOwkvKiBMZXQgdGhlIGZpcnN0IGd1eSB1c2VzIGl0ICovCisJCXAtPlJJT1BvcnRwW3BvcnRdLnBvcnRTZW0gPSAtMTsJLyogTGV0IHRoZSBmaXJzdCBndXkgdGFrZXMgaXQgKi8KKwkJcC0+UklPUG9ydHBbcG9ydF0uUGFyYW1TZW0gPSAtMTsJLyogTGV0IHRoZSBmaXJzdCBndXkgdGFrZXMgaXQgKi8KKwkJcC0+UklPUG9ydHBbcG9ydF0udGltZW91dF9pZCA9IDA7CS8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCisJfQorCisJcC0+UklPSG9zdHMgPSAoc3RydWN0IEhvc3QgKilzeXNicmsoUklPX0hPU1RTICogc2l6ZW9mKHN0cnVjdCBIb3N0KSk7CisJaWYgKCFwLT5SSU9Ib3N0cykgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogTm8gbWVtb3J5IGZvciBob3N0IHN0cnVjdHVyZXNcbiIpOworCQlwLT5SSU9GYWlsZWQrKzsKKwkJcmV0dXJuOworCX0KKwliemVybyhwLT5SSU9Ib3N0cywgc2l6ZW9mKHN0cnVjdCBIb3N0KSpSSU9fSE9TVFMpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJSSU8taW5pdDogYWxsb2NhdGVkIGFuZCBjbGVhcmVkIG1lbW9yeSBmb3IgaG9zdCBzdHJ1Y3RzXG4iKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiRmlyc3QgUklPIGhvc3Qgc3RydWN0IEAweCV4LCBzaXplPTB4JXggYnl0ZXNcbiIsCisJICAgIChpbnQpcC0+UklPSG9zdHMsIHNpemVvZihzdHJ1Y3QgSG9zdCkpOworCisJZm9yKCBob3N0PTA7IGhvc3Q8UklPX0hPU1RTOyBob3N0KysgKSB7CisJCXNwaW5fbG9ja19pbml0ICgmcC0+UklPSG9zdHNbaG9zdF0uSG9zdExvY2spOworCQlwLT5SSU9Ib3N0c1tob3N0XS50aW1lb3V0X2lkID0gMDsgLyogTGV0IHRoZSBmaXJzdCBndXkgdGFrZXMgaXQgKi8KKwl9CisJLyoKKwkqKiBjaGVjayB0aGF0IHRoZSBidWZmZXIgc2l6ZSBpcyB2YWxpZCwgcm91bmQgZG93biB0byB0aGUgbmV4dCBwb3dlciBvZgorCSoqIHR3byBpZiBuZWNlc3Nhcnk7IGlmIHRoZSByZXN1bHQgaXMgemVybywgdGhlbiwgaGV5LCBubyBkb3VibGUgYnVmZmVycy4KKwkqLworCWZvciAoIHRtID0gMTsgdG0gJiYgdG0gPD0gcC0+UklPQ29uZi5CdWZmZXJTaXplOyB0bSA8PD0gMSApCisJCTsKKwl0bSA+Pj0gMTsKKwlwLT5SSU9CdWZmZXJTaXplID0gdG07CisJcC0+UklPQnVmZmVyTWFzayA9IHRtID8gdG0gLSAxIDogMDsKK30KKworLyoKKyoqIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGRhdGEgc3RydWN0dXJlcyBuZWVkIHRvIGJlCisqKiByZS1zZXR1cCwgZm9yIGV4YW1wbGUsIGFmdGVyIGEgcmlvaGFsdCAod2h5IGRpZCBJIGV2ZXIgaW52ZW50IGl0PykKKyovCit2b2lkCitSSU9TZXR1cERhdGFTdHJ1Y3RzKHApCitzdHJ1Y3QgcmlvX2luZm8JKiBwOworeworCWludCBob3N0LCBlbnRyeSwgcnVwOworCisJZm9yICggaG9zdD0wOyBob3N0PFJJT19IT1NUUzsgaG9zdCsrICkgeworCQlzdHJ1Y3QgSG9zdCAqSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisJCWZvciAoIGVudHJ5PTA7IGVudHJ5PExJTktTX1BFUl9VTklUOyBlbnRyeSsrICkgeworCQkJSG9zdFAtPlRvcG9sb2d5W2VudHJ5XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCUhvc3RQLT5Ub3BvbG9neVtlbnRyeV0uTGluayA9IE5PX0xJTks7CisJCX0KKwkJYmNvcHkoIkhPU1QgWCIsIEhvc3RQLT5OYW1lLCA3KTsKKwkJSG9zdFAtPk5hbWVbNV0gPSAnMScraG9zdDsKKwkJZm9yIChydXA9MDsgcnVwPChNQVhfUlVQICsgTElOS1NfUEVSX1VOSVQpOyBydXArKykgeworCQkJaWYgKHJ1cCA8IE1BWF9SVVApIHsKKwkJCQlmb3IgKGVudHJ5PTA7IGVudHJ5PExJTktTX1BFUl9VTklUOyBlbnRyeSsrICkgeworCQkJCQlIb3N0UC0+TWFwcGluZ1tydXBdLlRvcG9sb2d5W2VudHJ5XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCQkJSG9zdFAtPk1hcHBpbmdbcnVwXS5Ub3BvbG9neVtlbnRyeV0uTGluayA9IE5PX0xJTks7CisJCQkJfQorCQkJCVJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBydXApOworCQkJfQorCQkJc3Bpbl9sb2NrX2luaXQoJkhvc3RQLT5Vbml4UnVwc1tydXBdLlJ1cExvY2spOworCQl9CisJfQorfQorI2VuZGlmCisKK2ludAorUklPRGVmYXVsdE5hbWUocCwgSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqCUhvc3RQOwordWludAkJCVVuaXRJZDsKK3sKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdCggSG9zdCApOworCUNoZWNrVW5pdElkKCBVbml0SWQgKTsKKyNlbmRpZgorCWJjb3B5KCJVTktOT1dOIFJUQSBYLVhYIixIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWUsMTcpOworCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZVsxMl09JzEnKyhIb3N0UC1wLT5SSU9Ib3N0cyk7CisJaWYgKChVbml0SWQrMSkgPiA5KSB7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZVsxNF09JzAnKygoVW5pdElkKzEpLzEwKTsKKwkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lWzE1XT0nMCcrKChVbml0SWQrMSklMTApOworCX0KKwllbHNlIHsKKwkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lWzE0XT0nMScrVW5pdElkOworCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWVbMTVdPTA7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIFJJT19SRUxFQVNFCSJMaW51eCIKKyNkZWZpbmUgUkVMRUFTRV9JRAkiMS4wIgorCisjaWYgMAorc3RhdGljIGludAorUklPUmVwb3J0KHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWNoYXIgKglSSU9SZWxlYXNlID0gUklPX1JFTEVBU0U7CisJY2hhciAqCVJJT1JlbElEID0gUkVMRUFTRV9JRDsKKwlpbnQJCWhvc3Q7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8gOiBSZWxlYXNlOiAlcyBJRDogJXNcbiIsIFJJT1JlbGVhc2UsIFJJT1JlbElEKTsKKworCWlmICggcC0+UklPTnVtSG9zdHM9PTAgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlxuTm8gSG9zdHMgY29uZmlndXJlZFxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwlmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkgeworCQlzdHJ1Y3QgSG9zdCAqSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisJCXN3aXRjaCAoIEhvc3RQLT5UeXBlICkgeworCQkJY2FzZSBSSU9fQVQ6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQVQgQlVTIDogZm91bmQgdGhlIGNhcmQgYXQgMHgleFxuIiwgSG9zdFAtPlBhZGRyUCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByaW9WZXJzaW9uCXN0VmVyc2lvbjsKKworc3RydWN0IHJpb1ZlcnNpb24gKgorUklPVmVyc2lkKHZvaWQpCit7CisgICAgc3RybGNweShzdFZlcnNpb24udmVyc2lvbiwgIlJJTyBkcml2ZXIgZm9yIGxpbnV4IFYxLjAiLAorCSAgICBzaXplb2Yoc3RWZXJzaW9uLnZlcnNpb24pKTsKKyAgICBzdHJsY3B5KHN0VmVyc2lvbi5idWlsZERhdGUsIF9fREFURV9fLAorCSAgICBzaXplb2Yoc3RWZXJzaW9uLmJ1aWxkRGF0ZSkpOworCisgICAgcmV0dXJuICZzdFZlcnNpb247Cit9CisKKyNpZiAwCitpbnQKK1JJT01hcGluKHBhZGRyLCBzaXplLCB2YWRkcikKK3BhZGRyX3QJCXBhZGRyOworaW50CQkJc2l6ZTsKK2NhZGRyX3QgKgl2YWRkcjsKK3sKKwkqdmFkZHIgPSAoY2FkZHJfdClwZXJtYXAoIChsb25nKXBhZGRyLCBzaXplKTsKKwlyZXR1cm4gKChpbnQpKnZhZGRyKTsKK30KKwordm9pZAorUklPTWFwb3V0KHBhZGRyLCBzaXplLCB2YWRkcikKK3BhZGRyX3QJCXBhZGRyOworbG9uZwkJc2l6ZTsKK2NhZGRyX3QgCXZhZGRyOworeworfQorI2VuZGlmCisKKwordm9pZAorUklPSG9zdFJlc2V0KFR5cGUsIERwUmFtUCwgU2xvdCkKK3VpbnQgVHlwZTsKK3ZvbGF0aWxlIHN0cnVjdCBEcFJhbSAqRHBSYW1QOwordWludCBTbG90OyAKK3sKKwkvKgorCSoqIFJlc2V0IHRoZSBUcHUKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJSSU9Ib3N0UmVzZXQ6IHR5cGUgMHgleCIsIFR5cGUpOworCXN3aXRjaCAoIFR5cGUgKSB7CisJCWNhc2UgUklPX0FUOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiIChSSU9fQVQpXG4iKTsKKwkJCVdCWVRFKERwUmFtUC0+RHBDb250cm9sLCAgQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfCAKKwkJCQkJICBJTlRFUlJVUFRfRElTQUJMRSB8IEJZVEVfT1BFUkFUSU9OIHwKKwkJCQkJICBTTE9XX0xJTktTIHwgU0xPV19BVF9CVVMpOworCQkJV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1LCAweEZGKTsKKwkJCXJpb191ZGVsYXkgKDMpOworCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPSG9zdFJlc2V0OiBEb24ndCBrbm93IGlmIGl0IHdvcmtlZC4gVHJ5IHJlc2V0IGFnYWluXG4iKTsKKwkJCVdCWVRFKERwUmFtUC0+RHBDb250cm9sLCAgQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfAorCQkJCQkgIElOVEVSUlVQVF9ESVNBQkxFIHwgQllURV9PUEVSQVRJT04gfAorCQkJCQkgIFNMT1dfTElOS1MgfCBTTE9XX0FUX0JVUyk7CisJCQlXQllURShEcFJhbVAtPkRwUmVzZXRUcHUsIDB4RkYpOworCQkJcmlvX3VkZWxheSAoMyk7CisJCQlicmVhazsKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorCWNhc2UgUklPX0VJU0E6CisJLyoKKwkqKiBCZXQgdGhpcyBkb2Vzbid0IHdvcmshCisJKi8KKwlPVVRCWiggU2xvdCwgRUlTQV9DT05UUk9MX1BPUlQsCisJCUVJU0FfVFBfUlVOCQl8IEVJU0FfVFBfQlVTX0RJU0FCTEUgICB8CisJCUVJU0FfVFBfU0xPV19MSU5LUyB8IEVJU0FfVFBfQk9PVF9GUk9NX1JBTSApOworCU9VVEJaKCBTbG90LCBFSVNBX0NPTlRST0xfUE9SVCwKKwkJRUlTQV9UUF9SRVNFVAkgIHwgRUlTQV9UUF9CVVNfRElTQUJMRSAgIHwgCisJCUVJU0FfVFBfU0xPV19MSU5LUyB8IEVJU0FfVFBfQk9PVF9GUk9NX1JBTSApOworCXN1c3BlbmQoIDMgKTsKKwlPVVRCWiggU2xvdCwgRUlTQV9DT05UUk9MX1BPUlQsCisJCUVJU0FfVFBfUlVOCQl8IEVJU0FfVFBfQlVTX0RJU0FCTEUgICB8IAorCQlFSVNBX1RQX1NMT1dfTElOS1MgfCBFSVNBX1RQX0JPT1RfRlJPTV9SQU0gKTsKKwlicmVhazsKKwljYXNlIFJJT19NQ0E6CisJV0JZVEUoRHBSYW1QLT5EcENvbnRyb2wgICwgTWNhVHBCb290RnJvbVJhbSB8IE1jYVRwQnVzRGlzYWJsZSApOworCVdCWVRFKERwUmFtUC0+RHBSZXNldFRwdSAsIDB4RkYgKTsKKwlzdXNwZW5kKCAzICk7CisJV0JZVEUoRHBSYW1QLT5EcENvbnRyb2wgICwgTWNhVHBCb290RnJvbVJhbSB8IE1jYVRwQnVzRGlzYWJsZSApOworCVdCWVRFKERwUmFtUC0+RHBSZXNldFRwdSAsIDB4RkYgKTsKKwlzdXNwZW5kKCAzICk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBSSU9fUENJOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICIgKFJJT19QQ0kpXG4iKTsKKwkJRHBSYW1QLT5EcENvbnRyb2wgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOworCQlEcFJhbVAtPkRwUmVzZXRJbnQgPSAweEZGOworCQlEcFJhbVAtPkRwUmVzZXRUcHUgPSAweEZGOworCQlyaW9fdWRlbGF5ICgxMDApOworCQkvKiBmb3IgKGk9MDsgaTw2MDAwOyBpKyspOyAgKi8KKwkJLyogc3VzcGVuZCggMyApOyAqLworCQlicmVhazsKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorCWRlZmF1bHQ6CisJUnByaW50ZihSSU9NZXNnTm9TdXBwb3J0LFR5cGUsRHBSYW1QLFNsb3QpOworCXJldHVybjsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiIChVTktOT1dOKVxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW50ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmU3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvaW50ci5jCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzo0NAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo0OQorKioKKyoqICBpZGVudCBAKCMpcmlvaW50ci5jCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2ludHJfY19zY2NzXyA9ICJAKCMpcmlvaW50ci5jCTEuMiI7CisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKworCitzdGF0aWMgdm9pZCBSSU9SZWNlaXZlKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgUG9ydCAqKTsKKworCitzdGF0aWMgY2hhciAqZmlyc3RjaGFycyAoY2hhciAqcCwgaW50IG5jaCkKK3sKKyAgc3RhdGljIGNoYXIgYnVmWzJdWzEyOF07CisgIHN0YXRpYyBpbnQgdD0wOworICB0ID0gISB0OworICBtZW1jcHkgKGJ1Zlt0XSwgcCwgbmNoKTsKKyAgYnVmW3RdW25jaF0gPSAwOworICByZXR1cm4gYnVmW3RdOworfQorCisKKyNkZWZpbmUJSU5DUiggUCwgSSApCSgoUCkgPSAoKChQKSsoSSkpICYgcC0+UklPQnVmZmVyTWFzaykpCisvKiBFbmFibGUgYW5kIHN0YXJ0IHRoZSB0cmFuc21pc3Npb24gb2YgcGFja2V0cyAqLwordm9pZAorUklPVHhFbmFibGUoZW4pCitjaGFyICoJCWVuOworeworICBzdHJ1Y3QgUG9ydCAqCVBvcnRQOworICBzdHJ1Y3QgcmlvX2luZm8gKnA7CisgIHN0cnVjdCB0dHlfc3RydWN0KiB0dHk7CisgIGludCBjOworICBzdHJ1Y3QgUEtUICoJUGFja2V0UDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKWVuOyAKKyAgcCA9IChzdHJ1Y3QgcmlvX2luZm8gKilQb3J0UC0+cDsKKyAgdHR5ID0gUG9ydFAtPmdzLnR0eTsKKworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgInR4IHBvcnQgJWQ6ICVkIGNoYXJzIHF1ZXVlZC5cbiIsIAorCSAgICAgIFBvcnRQLT5Qb3J0TnVtLCBQb3J0UC0+Z3MueG1pdF9jbnQpOworCisgIGlmICghUG9ydFAtPmdzLnhtaXRfY250KSByZXR1cm47CisgIAorCisgIC8qIFRoaXMgcm91dGluZSBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2ltcGxlciB0aGFuIHRoZSBzcGVjaWFsaXgKKyAgICAgdmVyc2lvbi4gT25lIG9mIHRoZSBkaXNhZHZhbnRhZ2VzIGlzIHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgc2VuZAorICAgICBhbiBpbmNvbXBsZXRlIHBhY2tldCAodXN1YWxseSA2NCBieXRlcyBpbnN0ZWFkIG9mIDcyKSBvbmNlIGZvcgorICAgICBldmVyeSA0ayB3b3J0aCBvZiBkYXRhLiBMZXQncyBqdXN0IHNheSB0aGF0IHRoaXMgd29uJ3QgaW5mbHVlbmNlCisgICAgIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuLi4uLiAqLworCisgIHJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworICB3aGlsZSAoY2FuX2FkZF90cmFuc21pdCggJlBhY2tldFAsIFBvcnRQICkpIHsKKyAgICBjID0gUG9ydFAtPmdzLnhtaXRfY250OworICAgIGlmIChjID4gUEtUX01BWF9EQVRBX0xFTikgYyA9IFBLVF9NQVhfREFUQV9MRU47CisKKyAgICAvKiBEb24ndCBjb3B5IHBhc3QgdGhlIGVuZCBvZiB0aGUgc291cmNlIGJ1ZmZlciAqLworICAgIGlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIFBvcnRQLT5ncy54bWl0X3RhaWwpIAorICAgICAgYyA9IFNFUklBTF9YTUlUX1NJWkUgLSBQb3J0UC0+Z3MueG1pdF90YWlsOworCisgICAgeyBpbnQgdDsKKyAgICB0ID0gKGMgPiAxMCk/MTA6YzsKKyAgICAKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IHR4IHBvcnQgJWQ6IGNvcHlpbmcgJWQgY2hhcnM6ICVzIC0gJXNcbiIsIAorCQkgUG9ydFAtPlBvcnROdW0sIGMsIAorCQkgZmlyc3RjaGFycyAoUG9ydFAtPmdzLnhtaXRfYnVmICsgUG9ydFAtPmdzLnhtaXRfdGFpbCAgICAgICwgdCksCisJCSBmaXJzdGNoYXJzIChQb3J0UC0+Z3MueG1pdF9idWYgKyBQb3J0UC0+Z3MueG1pdF90YWlsICsgYy10LCB0KSk7CisgICAgfQorICAgIC8qIElmIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIsIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCAKKyAgICAgICB3ZSdyZSBkb25lISAqLworICAgIGlmIChjID09IDApIGJyZWFrOworCisgICAgcmlvX21lbWNweV90b2lvIChQb3J0UC0+SG9zdFAtPkNhZGRyLCAoY2FkZHJfdClQYWNrZXRQLT5kYXRhLCAKKwkJIFBvcnRQLT5ncy54bWl0X2J1ZiArIFBvcnRQLT5ncy54bWl0X3RhaWwsIGMpOworICAgIC8qICAgIHVkZWxheSAoMSk7ICovCisKKyAgICB3cml0ZWIgKGMsICYoUGFja2V0UC0+bGVuKSk7CisgICAgaWYgKCEoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgKSB7CisgICAgICBhZGRfdHJhbnNtaXQgKCBQb3J0UCApOworICAgICAgLyoKKyAgICAgICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKyAgICAgICovCisgICAgICBpZiAoIFBvcnRQLT5zdGF0c0dhdGhlciApCisJUG9ydFAtPnR4Y2hhcnMgKz0gYzsKKyAgICB9CisgICAgUG9ydFAtPmdzLnhtaXRfdGFpbCA9IChQb3J0UC0+Z3MueG1pdF90YWlsICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKyAgICBQb3J0UC0+Z3MueG1pdF9jbnQgLT0gYzsKKyAgfQorCisgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisgIGlmIChQb3J0UC0+Z3MueG1pdF9jbnQgPD0gKFBvcnRQLT5ncy53YWtldXBfY2hhcnMgKyAyKlBLVF9NQVhfREFUQV9MRU4pKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiV2FraW5nIHVwLi4uLiBsZGlzYzolZCAoJWQvJWQpLi4uLiIsCisJCSAoaW50KShQb3J0UC0+Z3MudHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSwKKwkJIFBvcnRQLT5ncy53YWtldXBfY2hhcnMsIFBvcnRQLT5ncy54bWl0X2NudCk7IAorICAgIGlmICgoUG9ydFAtPmdzLnR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKKwlQb3J0UC0+Z3MudHR5LT5sZGlzYy53cml0ZV93YWtldXApCisgICAgICAoUG9ydFAtPmdzLnR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKShQb3J0UC0+Z3MudHR5KTsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIoJWQvJWQpXG4iLAorCQlQb3J0UC0+Z3Mud2FrZXVwX2NoYXJzLCBQb3J0UC0+Z3MueG1pdF9jbnQpOyAKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJlBvcnRQLT5ncy50dHktPndyaXRlX3dhaXQpOworICB9CisKK30KKworCisvKgorKiogUklPIEhvc3QgU2VydmljZSByb3V0aW5lLiBEb2VzIGFsbCB0aGUgd29yayB0cmFkaXRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbgorKiogaW50ZXJydXB0LgorKi8KK3N0YXRpYyBpbnQJUnVwSW50cjsKK3N0YXRpYyBpbnQJUnhJbnRyOworc3RhdGljIGludAlUeEludHI7Cit2b2lkCitSSU9TZXJ2aWNlSG9zdChwLCBIb3N0UCwgRnJvbSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7CitpbnQgRnJvbTsgCit7CisgIHJpb19zcGluX2xvY2sgKCZIb3N0UC0+SG9zdExvY2spOworICBpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7IAorICAgIHN0YXRpYyBpbnQgdCA9MDsKKyAgICByaW9fc3Bpbl91bmxvY2sgKCZIb3N0UC0+SG9zdExvY2spOyAKKyAgICBpZiAoKHQrKyAlIDIwMCkgPT0gMCkKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkludGVycnVwdCBidXQgaG9zdCBub3QgcnVubmluZy4gZmxhZ3M9JXguXG4iLCAoaW50KUhvc3RQLT5GbGFncyk7CisgICAgcmV0dXJuOworICB9CisgIHJpb19zcGluX3VubG9jayAoJkhvc3RQLT5Ib3N0TG9jayk7IAorCisgIGlmICggUldPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnVwX2ludHIgKSApIHsKKyAgICBXV09SRCggSG9zdFAtPlBhcm1NYXBQLT5ydXBfaW50ciAsIDAgKTsKKyAgICBwLT5SSU9SdXBDb3VudCsrOworICAgIFJ1cEludHIrKzsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFJVUCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAtcC0+UklPSG9zdHMpOworICAgIFJJT1BvbGxIb3N0Q29tbWFuZHMocCwgSG9zdFAgKTsKKyAgfQorCisgIGlmICggUldPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciApICkgeworICAgIGludCBwb3J0OworCisgICAgV1dPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciAsIDAgKTsKKyAgICBwLT5SSU9SeENvdW50Kys7CisgICAgUnhJbnRyKys7CisKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFJYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UC1wLT5SSU9Ib3N0cyk7CisgICAgLyoKKyAgICAqKiBMb29wIHRocm91Z2ggZXZlcnkgcG9ydC4gSWYgdGhlIHBvcnQgaXMgbWFwcGVkIGludG8KKyAgICAqKiB0aGUgc3lzdGVtICggaS5lLiBoYXMgL2Rldi90dHlYWFhYIGFzc29jaWF0ZWQgKSB0aGVuIGl0IGlzCisgICAgKiogd29ydGggY2hlY2tpbmcuIElmIHRoZSBwb3J0IGlzbid0IG9wZW4sIGdyYWIgYW55IHBhY2tldHMKKyAgICAqKiBoYW5naW5nIG9uIGl0cyByZWNlaXZlIHF1ZXVlIGFuZCBzdHVmZiB0aGVtIG9uIHRoZSBmcmVlCisgICAgKiogbGlzdDsgY2hlY2sgZm9yIGNvbW1hbmRzIG9uIHRoZSB3YXkuCisgICAgKi8KKyAgICBmb3IgKCBwb3J0PXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQ7IAorCSAgcG9ydDxwLT5SSU9MYXN0UG9ydHNCb290ZWQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrICkgeworICAgICAgc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5UDsKKyAgICAgIHN0cnVjdCBQS1QgKlBhY2tldFA7CisJCQorICAgICAgLyoKKyAgICAgICoqIG5vdCBtYXBwZWQgaW4gLSBtb3N0IG9mIHRoZSBSSU9Qb3J0cFtdIGluZm9ybWF0aW9uCisgICAgICAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQorICAgICAgKiogT3B0aW1pc2U6IHBvcnRzIGNvbWUgaW4gYnVuZGxlcyBvZiBlaWdodC4KKyAgICAgICovCisgICAgICBpZiAoICFQb3J0UC0+TWFwcGVkICkgeworCXBvcnQgKz0gNzsKKwljb250aW51ZTsgLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBJZiB0aGUgaG9zdCBib2FyZCBpc24ndCBUSElTIGhvc3QgYm9hcmQsIGNoZWNrIHRoZSBuZXh0IG9uZS4KKyAgICAgICoqIG9wdGltaXNlOiBwb3J0cyBjb21lIGluIGJ1bmRsZXMgb2YgZWlnaHQuCisgICAgICAqLworICAgICAgaWYgKCBQb3J0UC0+SG9zdFAgIT0gSG9zdFAgKSB7CisJcG9ydCArPSA3OworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogTGV0IHVzIHNlZSAtIGlzIHRoZSBwb3J0IG9wZW4/IElmIG5vdCwgdGhlbiBkb24ndCBzZXJ2aWNlIGl0LgorICAgICAgKi8KKyAgICAgIGlmICggISggUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOICkgKSB7CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBmaW5kIGNvcnJlc3BvbmRpbmcgdHR5IHN0cnVjdHVyZS4gVGhlIHByb2Nlc3Mgb2YgbWFwcGluZworICAgICAgKiogdGhlIHBvcnRzIHB1dHMgdGhlc2UgaGVyZS4KKyAgICAgICovCisgICAgICB0dHlQID0gUG9ydFAtPmdzLnR0eTsKKworICAgICAgLyoKKyAgICAgICoqIExvY2sgdGhlIHBvcnQgYmVmb3JlIHdlIGJlZ2luIHdvcmtpbmcgb24gaXQuCisgICAgICAqLworICAgICAgcmlvX3NwaW5fbG9jaygmUG9ydFAtPnBvcnRTZW0pOworCisgICAgICAvKgorICAgICAgKiogUHJvY2VzcyByZWNlaXZlZCBkYXRhIGlmIHRoZXJlIGlzIGFueS4KKyAgICAgICovCisgICAgICBpZiAoIGNhbl9yZW1vdmVfcmVjZWl2ZSggJlBhY2tldFAsIFBvcnRQICkgKQorCVJJT1JlY2VpdmUocCwgUG9ydFApOworCisgICAgICAvKgorICAgICAgKiogSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IHRvIGJlIHJlYWQgZnJvbSB0aGUgcG9ydCwgYW5kCisgICAgICAqKiBpdCdzIGhhbmRzaGFrZSBiaXQgaXMgc2V0LCB0aGVuIHdlIG11c3QgY2xlYXIgdGhlIGhhbmRzaGFrZSwKKyAgICAgICoqIHNvIHRoYXQgdGhhdCBkb3duc3RyZWFtIFJUQSBpcyByZS1lbmFibGVkLgorICAgICAgKi8KKyAgICAgIGlmICggIWNhbl9yZW1vdmVfcmVjZWl2ZSggJlBhY2tldFAsIFBvcnRQICkgJiYgCisJICAgKCBSV09SRCggUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSApPT1QSEJfSEFORFNIQUtFX1NFVCApICkgeworCQkJCS8qCisJCQkJKiogTUFHSUMhICggQmFzaWNhbGx5LCBoYW5kc2hha2UgdGhlIFJYIGJ1ZmZlciwgc28gdGhhdAorCQkJCSoqIHRoZSBSVEFzIHVwc3RyZWFtIGNhbiBiZSByZS1lbmFibGVkLiApCisJCQkJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTZXQgUlggaGFuZHNoYWtlIGJpdFxuIik7CisJV1dPUkQoIFBvcnRQLT5QaGJQLT5oYW5kc2hha2UsIAorCSAgICAgICBQSEJfSEFORFNIQUtFX1NFVHxQSEJfSEFORFNIQUtFX1JFU0VUICk7CisgICAgICB9CisgICAgICByaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKyAgICB9CisgIH0KKworICBpZiAoIFJXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIgKSApIHsKKyAgICBpbnQgcG9ydDsKKworICAgIFdXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIgLCAwKTsKKworICAgIHAtPlJJT1R4Q291bnQrKzsKKyAgICBUeEludHIrKzsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFRYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UC1wLT5SSU9Ib3N0cyk7CisKKyAgICAvKgorICAgICoqIExvb3AgdGhyb3VnaCBldmVyeSBwb3J0LgorICAgICoqIElmIHRoZSBwb3J0IGlzIG1hcHBlZCBpbnRvIHRoZSBzeXN0ZW0gKCBpLmUuIGhhcyAvZGV2L3R0eVhYWFgKKyAgICAqKiBhc3NvY2lhdGVkICkgdGhlbiBpdCBpcyB3b3J0aCBjaGVja2luZy4KKyAgICAqLworICAgIGZvciAoIHBvcnQ9cC0+UklPRmlyc3RQb3J0c0Jvb3RlZDsgCisJICBwb3J0PHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCtQT1JUU19QRVJfUlRBOyBwb3J0KysgKSB7CisgICAgICBzdHJ1Y3QgUG9ydCAqUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKyAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlQOworICAgICAgc3RydWN0IFBLVCAqUGFja2V0UDsKKworICAgICAgLyoKKyAgICAgICoqIG5vdCBtYXBwZWQgaW4gLSBtb3N0IG9mIHRoZSBSSU9Qb3J0cFtdIGluZm9ybWF0aW9uCisgICAgICAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQorICAgICAgKi8KKyAgICAgIGlmICggIVBvcnRQLT5NYXBwZWQgKSB7CisJcG9ydCArPSA3OworCWNvbnRpbnVlOyAvKiB3aXRoIHRoZSBuZXh0IHBvcnQgKi8KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIElmIHRoZSBob3N0IGJvYXJkIGlzbid0IHJ1bm5pbmcsIHRoZW4gaXRzIGRhdGEgc3RydWN0dXJlcworICAgICAgKiogYXJlIG5vIHVzZSB0byB1cyAtIGNvbnRpbnVlIHF1aWV0bHkuCisgICAgICAqLworICAgICAgaWYgKCBQb3J0UC0+SG9zdFAgIT0gSG9zdFAgKSB7CisJcG9ydCArPSA3OworCWNvbnRpbnVlOyAvKiB3aXRoIHRoZSBuZXh0IHBvcnQgKi8KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIExldCB1cyBzZWUgLSBpcyB0aGUgcG9ydCBvcGVuPyBJZiBub3QsIHRoZW4gZG9uJ3Qgc2VydmljZSBpdC4KKyAgICAgICovCisgICAgICBpZiAoICEoIFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTiApICkgeworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IExvb2tpbmcgaW50byBwb3J0ICVkLlxuIiwgcG9ydCk7CisgICAgICAvKgorICAgICAgKiogTG9jayB0aGUgcG9ydCBiZWZvcmUgd2UgYmVnaW4gd29ya2luZyBvbiBpdC4KKyAgICAgICovCisgICAgICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisKKyAgICAgIC8qCisgICAgICAqKiBJZiB3ZSBjYW4ndCBhZGQgYW55dGhpbmcgdG8gdGhlIHRyYW5zbWl0IHF1ZXVlLCB0aGVuCisgICAgICAqKiB3ZSBuZWVkIGRvIG5vbmUgb2YgdGhpcyBwcm9jZXNzaW5nLgorICAgICAgKi8KKyAgICAgIGlmICggIWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICkgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkNhbid0IGFkZCB0byBwb3J0LCBzbyBza2lwcGluZy5cbiIpOworCXJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogZmluZCBjb3JyZXNwb25kaW5nIHR0eSBzdHJ1Y3R1cmUuIFRoZSBwcm9jZXNzIG9mIG1hcHBpbmcKKyAgICAgICoqIHRoZSBwb3J0cyBwdXRzIHRoZXNlIGhlcmUuCisgICAgICAqLworICAgICAgdHR5UCA9IFBvcnRQLT5ncy50dHk7CisgICAgICAvKiBJZiB0dHlQIGlzIE5VTEwsIHRoZSBwb3J0IGlzIGdldHRpbmcgY2xvc2VkLiBGb3JnZXQgYWJvdXQgaXQuICovCisgICAgICBpZiAoIXR0eVApIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJubyB0dHksIHNvIHNraXBwaW5nLlxuIik7CisJcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICAvKgorICAgICAgKiogSWYgdGhlcmUgaXMgbW9yZSByb29tIGF2YWlsYWJsZSB3ZSBzdGFydCB1cCB0aGUgdHJhbnNtaXQKKyAgICAgICoqIGRhdGEgcHJvY2VzcyBhZ2Fpbi4gVGhpcyBjYW4gYmUgZGlyZWN0IEkvTywgaWYgdGhlIGNvb2ttb2RlCisgICAgICAqKiBpcyBzZXQgdG8gQ09PS19SQVcgb3IgQ09PS19NRURJVU0sIG9yIHdpbGwgYmUgYSBjYWxsIHRvIHRoZQorICAgICAgKiogcmlvdHByb2MoIFRfT1VUUFVUICkgaWYgd2UgYXJlIGluIENPT0tfV0VMTCBtb2RlLCB0byBmZXRjaAorICAgICAgKiogY2hhcmFjdGVycyB2aWEgdGhlIGxpbmUgZGlzY2lwbGluZS4gV2UgbXVzdCBhbHdheXMgY2FsbAorICAgICAgKiogdGhlIGxpbmUgZGlzY2lwbGluZSwKKyAgICAgICoqIHNvIHRoYXQgdXNlciBpbnB1dCBjaGFyYWN0ZXJzIGNhbiBiZSBlY2hvZWQgY29ycmVjdGx5LgorICAgICAgKioKKyAgICAgICoqICsrKysgVXBkYXRlICsrKysrCisgICAgICAqKiBXaXRoIHRoZSBhZHZlbnQgb2YgZG91YmxlIGJ1ZmZlcmluZywgd2Ugbm93IHNlZSBpZgorICAgICAgKiogVHhCdWZmZXJPdXQtSW4gaXMgbm9uLXplcm8uIElmIHNvLCB0aGVuIHdlIGNvcHkgYSBwYWNrZXQKKyAgICAgICoqIHRvIHRoZSBvdXRwdXQgcGxhY2UsIGFuZCBzZXQgaXQgZ29pbmcuIElmIHRoaXMgZW1wdGllcworICAgICAgKiogdGhlIGJ1ZmZlciwgdGhlbiB3ZSBtdXN0IGlzc3VlIGEgd2FrZXVwKCApIG9uIE9VVC4KKyAgICAgICoqIElmIGl0IGZyZWVzIHNwYWNlIGluIHRoZSBidWZmZXIgdGhlbiB3ZSBtdXN0IGlzc3VlCisgICAgICAqKiBhIHdha2V1cCggKSBvbiBJTi4KKyAgICAgICoqCisgICAgICAqKiArKysrIEV4dHJhISBFeHRyYSEgSWYgUG9ydFAtPldmbHVzaEZsYWcgaXMgc2V0LCB0aGVuIHdlCisgICAgICAqKiBoYXZlIHRvIHNlbmQgYSBXRkxVU0ggY29tbWFuZCBkb3duIHRoZSBQSEIsIHRvIG1hcmsgdGhlCisgICAgICAqKiBlbmQgcG9pbnQgb2YgYSBXRkxVU0guIFdlIGFsc28gbmVlZCB0byBjbGVhciBvdXQgYW55CisgICAgICAqKiBkYXRhIGZyb20gdGhlIGRvdWJsZSBidWZmZXIhICggbm90ZSB0aGF0IFdmbHVzaEZsYWcgaXMgYQorICAgICAgKiogKmNvdW50KiBvZiB0aGUgbnVtYmVyIG9mIFdGTFVTSCBjb21tYW5kcyBvdXRzdGFuZGluZyEgKQorICAgICAgKioKKyAgICAgICoqICsrKysgQW5kIHRoZXJlJ3MgbW9yZSEKKyAgICAgICoqIElmIGFuIFJUQSBpcyBwb3dlcmVkIG9mZiwgdGhlbiBvbiBhZ2FpbiwgYW5kIHJlYm9vdGVkLAorICAgICAgKiogd2hpbHN0IGl0IGhhcyBwb3J0cyBvcGVuLCB0aGVuIHdlIG5lZWQgdG8gcmUtb3BlbiB0aGUgcG9ydHMuCisgICAgICAqKiAoIHJlYXNvbmFibGUgZW5vdWdoICkuIFdlIGNhbid0IGRvIHRoaXMgd2hlbiB3ZSBzcG90IHRoZQorICAgICAgKiogcmUtYm9vdCwgaW4gaW50ZXJydXB0IHRpbWUsIGJlY2F1c2UgdGhlIHF1ZXVlIGlzIHByb2JhYmx5CisgICAgICAqKiBmdWxsLiBTbywgd2hlbiB3ZSBjb21lIGluIGhlcmUsIHdlIG5lZWQgdG8gdGVzdCBpZiBhbnkKKyAgICAgICoqIHBvcnRzIGFyZSBpbiB0aGlzIGNvbmRpdGlvbiwgYW5kIHJlLW9wZW4gdGhlIHBvcnQgYmVmb3JlCisgICAgICAqKiB3ZSB0cnkgdG8gc2VuZCBhbnkgbW9yZSBkYXRhIHRvIGl0LiBOb3csIHRoZSByZS1ib290ZWQKKyAgICAgICoqIFJUQSB3aWxsIGJlIGRpc2NhcmRpbmcgcGFja2V0cyBmcm9tIHRoZSBQSEIgdW50aWwgaXQKKyAgICAgICoqIHJlY2VpdmVzIHRoaXMgb3BlbiBwYWNrZXQsIGJ1dCBkb24ndCB3b3JyeSB0b29vIG11Y2gKKyAgICAgICoqIGFib3V0IHRoYXQuIFRoZSBvbmUgdGhpbmcgdGhhdCBpcyBpbnRlcmVzdGluZyBpcyB0aGUKKyAgICAgICoqIGNvbWJpbmF0aW9uIG9mIHRoaXMgZWZmZWN0IGFuZCB0aGUgV0ZMVVNIIGVmZmVjdCEKKyAgICAgICovCisgICAgICAvKiBGb3Igbm93IGRvbid0IGhhbmRsZSBSVEEgcmVib290cy4gLS0gUkVXLiAKKwkgUmVlbmFibGVkLiBPdGhlcndpc2UgUlRBIHJlYm9vdHMgZGlkbid0IHdvcmsuIER1aC4gLS0gUkVXICovCisgICAgICBpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICkgeworI2lmIDEKKwlpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfUkVCT09UICkgeworCSAgLyoKKwkgICoqIHdlbGwsIHRoZSBSVEEgaGFzIGJlZW4gcmVib290ZWQsIGFuZCB0aGVyZSBpcyByb29tCisJICAqKiBvbiBpdHMgcXVldWUgdG8gYWRkIHRoZSBvcGVuIHBhY2tldCB0aGF0IGlzIHJlcXVpcmVkLgorCSAgKioKKwkgICoqIFRoZSBtZXNzeSBwYXJ0IG9mIHRoaXMgbGluZSBpcyB0cnlpbmcgdG8gZGVjaWRlIGlmCisJICAqKiB3ZSBuZWVkIHRvIGNhbGwgdGhlIFBhcmFtIGZ1bmN0aW9uIGFzIGEgdHR5IG9yIGFzCisJICAqKiBhIG1vZGVtLgorCSAgKiogRE9OVCBVU0UgQ0xPQ0FMIEFTIEEgVEVTVCBGT1IgVEhJUyEKKwkgICoqCisJICAqKiBJZiB3ZSBjYW4ndCBwYXJhbSB0aGUgcG9ydCwgdGhlbiBtb3ZlIG9uIHRvIHRoZQorCSAgKiogbmV4dCBwb3J0LgorCSAgKi8KKwkgIFBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKworCSAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICBpZiAoIFJJT1BhcmFtKFBvcnRQLCBPUEVOLCAoKFBvcnRQLT5Db3IyQ29weSAmIAorCQkJCSAgICAgICAoQ09SMl9SVFNGTE9XfENPUjJfQ1RTRkxPVyApICk9PSAKKwkJCQkgICAgICAoQ09SMl9SVFNGTE9XfENPUjJfQ1RTRkxPVyApICkgPyAKKwkJCVRSVUUgOiBGQUxTRSwgRE9OVF9TTEVFUCApID09IFJJT19GQUlMICkgeworCSAgICBjb250aW51ZTsgLyogd2l0aCBuZXh0IHBvcnQgKi8KKwkgIH0KKwkgIHJpb19zcGluX2xvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwkgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NQUdJQ19SRUJPT1Q7CisJfQorI2VuZGlmCisKKwkvKgorCSoqIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhpcyBpcyBhIHRhY2t5IGhhY2sgdG8gY29wZQorCSoqIHdpdGggV0ZMVVNICisJKi8KKwlpZiAoIFBvcnRQLT5XZmx1c2hGbGFnICkgeworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiV2FudCB0byBXRkxVU0ggbWFyayB0aGlzIHBvcnRcbiIpOworCisJICBpZiAoIFBvcnRQLT5JblVzZSApCisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkZBSUxTIC0gUE9SVCBJUyBJTiBVU0VcbiIpOworCX0KKwkJCQkKKwl3aGlsZSAoIFBvcnRQLT5XZmx1c2hGbGFnICYmCisJCWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICYmIAorCQkoIFBvcnRQLT5JblVzZSA9PSBOT1RfSU5VU0UgKSApIHsKKwkgIGludCBwOworCSAgc3RydWN0IFBrdENtZCAqUGt0Q21kUDsKKworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiQWRkIFdGTFVTSCBtYXJrZXIgdG8gZGF0YSBxdWV1ZVxuIik7CisJICAvKgorCSAgKiogbWFrZSBpdCBsb29rIGp1c3QgbGlrZSBhIFdGTFVTSCBjb21tYW5kCisJICAqLworCSAgUGt0Q21kUCA9ICggc3RydWN0IFBrdENtZCAqICkmUGFja2V0UC0+ZGF0YVswXTsKKworCSAgV0JZVEUoIFBrdENtZFAtPkNvbW1hbmQgLCBXRkxVU0ggKTsKKworCSAgcCA9ICBQb3J0UC0+SG9zdFBvcnQgJSAoIHVzaG9ydCApUE9SVFNfUEVSX1JUQTsKKworCSAgLyoKKwkgICoqIElmIHNlY29uZCBibG9jayBvZiBwb3J0cyBmb3IgMTYgcG9ydCBSVEEsIGFkZCA4CisJICAqKiB0byBpbmRleCA4LTE1LgorCSAgKi8KKwkgIGlmICggUG9ydFAtPlNlY29uZEJsb2NrICkKKwkgICAgcCArPSBQT1JUU19QRVJfUlRBOworCisJICBXQllURSggUGt0Q21kUC0+UGhiTnVtLCBwICk7CisKKwkgIC8qCisJICAqKiB0byBtYWtlIGRlYnVnZ2VyeSBlYXNpZXIKKwkgICovCisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgMl0sICdXJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyAzXSwgJ0YnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDRdLCAnTCcgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgNV0sICdVJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA2XSwgJ1MnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDddLCAnSCcgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgOF0sICcgJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA5XSwgJzAnK1BvcnRQLT5XZmx1c2hGbGFnICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsxMF0sICcgJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWzExXSwgJyAnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbMTJdLCAnXDAnICk7CisKKwkgIC8qCisJICAqKiBpdHMgdHdvIGJ5dGVzIGxvbmchCisJICAqLworCSAgV0JZVEUoIFBhY2tldFAtPmxlbiAsIFBLVF9DTURfQklUIHwgMiApOworCisJICAvKgorCSAgKiogcXVldWUgaXQhCisJICAqLworCSAgaWYgKCAhKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApICkgeworCSAgICBhZGRfdHJhbnNtaXQoIFBvcnRQICk7CisJICAgIC8qCisJICAgICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkgICAgKi8KKwkgICAgaWYgKCBQb3J0UC0+c3RhdHNHYXRoZXIgKQorCSAgICAgIFBvcnRQLT50eGNoYXJzICs9IDI7CisJICB9CisKKwkgIGlmICggLS0oIFBvcnRQLT5XZmx1c2hGbGFnICkgPT0gMCApIHsKKwkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1BR0lDX0ZMVVNIOworCSAgfQorCisJICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJXZmx1c2ggY291bnQgbm93IHN0YW5kcyBhdCAlZFxuIiwgCisJCSBQb3J0UC0+V2ZsdXNoRmxhZyk7CisJfQorCWlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNT1JFX09VVFBVVF9FWUdPUiApIHsKKwkgIGlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNQUdJQ19GTFVTSCApIHsKKwkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTU9SRV9PVVRQVVRfRVlHT1I7CisJICB9CisJICBlbHNlIHsKKwkgICAgaWYgKCAhY2FuX2FkZF90cmFuc21pdCggJlBhY2tldFAsIFBvcnRQICkgKSB7CisJICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICAgIFJJT1R4RW5hYmxlKChjaGFyICopUG9ydFApOworCSAgICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICAgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NT1JFX09VVFBVVF9FWUdPUjsKKwkgIH0KKwl9CisgICAgICB9CisKKworICAgICAgLyoKKyAgICAgICoqIElmIHdlIGNhbid0IGFkZCBhbnl0aGluZyB0byB0aGUgdHJhbnNtaXQgcXVldWUsIHRoZW4KKyAgICAgICoqIHdlIG5lZWQgZG8gbm9uZSBvZiB0aGUgcmVtYWluaW5nIHByb2Nlc3NpbmcuCisgICAgICAqLworICAgICAgaWYgKCFjYW5fYWRkX3RyYW5zbWl0KCAmUGFja2V0UCwgUG9ydFAgKSApIHsKKwlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisgICAgICBSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKKyAgICB9CisgIH0KK30KKworLyoKKyoqIFJvdXRpbmUgZm9yIGhhbmRsaW5nIHJlY2VpdmVkIGRhdGEgZm9yIGNsaXN0IGRyaXZlcnMuCisqKiBOQjogQ2FsbGVkIHdpdGggdGhlIHR0eSBsb2NrZWQuIFRoZSBzcGwgZnJvbSB0aGUgbG9ja2IoICkgaXMgcGFzc2VkLgorKiogd2UgcmV0dXJuIHRoZSB0dHlTcGwgbGV2ZWwgdGhhdCB3ZSByZS1sb2NrZWQgYXQuCisqLworc3RhdGljIHZvaWQKK1JJT1JlY2VpdmUocCwgUG9ydFApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IFBvcnQgKgkJUG9ydFA7Cit7CisgIHN0cnVjdCB0dHlfc3RydWN0ICpUdHlQOworICByZWdpc3RlciB1c2hvcnQgdHJhbnNDb3VudDsKKyAgc3RydWN0IFBLVCAqUGFja2V0UDsKKyAgcmVnaXN0ZXIgdWludAlEYXRhQ250OworICB1Y2hhciAqCXB0cjsKKyAgaW50IGNvcGllZCA9MDsKKworICBzdGF0aWMgaW50IGludENvdW50LCBSeEludENudDsKKworICAvKgorICAqKiBUaGUgcmVjZWl2ZSBkYXRhIHByb2Nlc3MgaXMgdG8gcmVtb3ZlIHBhY2tldHMgZnJvbSB0aGUKKyAgKiogUEhCIHVudGlsIHRoZXJlIGFyZW4ndCBhbnkgbW9yZSBvciB0aGUgY3VycmVudCBjYmxvY2sKKyAgKiogaXMgZnVsbC4gV2hlbiB0aGlzIG9jY3VycywgdGhlcmUgd2lsbCBiZSBzb21lIGxlZnQgb3ZlcgorICAqKiBkYXRhIGluIHRoZSBwYWNrZXQsIHRoYXQgd2UgbXVzdCBkbyBzb21ldGhpbmcgd2l0aC4KKyAgKiogQXMgd2UgaGF2ZW4ndCB1bmhvb2tlZCB0aGUgcGFja2V0IGZyb20gdGhlIHJlYWQgbGlzdAorICAqKiB5ZXQsIHdlIGNhbiBqdXN0IGxlYXZlIHRoZSBwYWNrZXQgdGhlcmUsIGhhdmluZyBmaXJzdAorICAqKiBtYWRlIGEgbm90ZSBvZiBob3cgZmFyIHdlIGdvdC4gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQKKyAgKiogYSBwb2ludGVyIHBlciBwb3J0IHNheWluZyB3aGVyZSB3ZSBzdGFydCB0YWtpbmcgdGhlCisgICoqIGRhdGEgZnJvbSAtIHRoaXMgd2lsbCBub3JtYWxseSBiZSB6ZXJvLCBidXQgd2hlbiB3ZQorICAqKiBydW4gb3V0IG9mIHNwYWNlIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlCisgICoqIG5leHQgYnl0ZSB0byBjb3B5IGZyb20gdGhlIHBhY2tldCBkYXRhIGFyZWEuIFRoZSBwYWNrZXQKKyAgKiogbGVuZ3RoIGZpZWxkIGlzIGRlY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAqKiB3ZSBzdWNjZXNmdWxseSByZW1vdmVkIGZyb20gdGhlIHBhY2tldC4gV2hlbiB0aGlzIHJlYWNoZXMKKyAgKiogemVybywgd2UgcmVzZXQgdGhlIG9mZnNldCBwb2ludGVyIHRvIGJlIHplcm8sIGFuZCBmcmVlCisgICoqIHRoZSBwYWNrZXQgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgorICAqLworCisgIGludENvdW50Kys7CisKKyAgVHR5UCA9IFBvcnRQLT5ncy50dHk7CisgIGlmICghVHR5UCkgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJJT1JlY2VpdmU6IHR0eSBpcyBudWxsLiBcbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChQb3J0UC0+U3RhdGUgJiBSSU9fVEhST1RUTEVfUlgpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSSU9SZWNlaXZlOiBUaHJvdHRsZWQuIENhbid0IGhhbmRsZSBtb3JlIGlucHV0LlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApCisgICAgeworICAgICAgd2hpbGUgKCBjYW5fcmVtb3ZlX3JlY2VpdmUoICZQYWNrZXRQLCBQb3J0UCApICkKKwl7CisJICByZW1vdmVfcmVjZWl2ZSggUG9ydFAgKTsKKwkgIHB1dF9mcmVlX2VuZCggUG9ydFAtPkhvc3RQLCBQYWNrZXRQICk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qCisgICAgICAqKiBsb29wLCBqdXN0IHNvIGxvbmcgYXM6CisgICAgICAqKiAgIGkgKSB0aGVyZSdzIHNvbWUgZGF0YSAoIGkuZS4gY2FuX3JlbW92ZV9yZWNlaXZlICkKKyAgICAgICoqICBpaSApIHdlIGhhdmVuJ3QgYmVlbiBibG9ja2VkCisgICAgICAqKiBpaWkgKSB0aGVyZSdzIHNvbWV3aGVyZSB0byBwdXQgdGhlIGRhdGEKKyAgICAgICoqICBpdiApIHdlIGhhdmVuJ3Qgb3V0c3RheWVkIG91ciB3ZWxjb21lCisgICAgICAqLworICAgICAgdHJhbnNDb3VudCA9IDE7CisgICAgICB3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApCisJICAgICAgJiYgdHJhbnNDb3VudCkKKwl7CisjaWZkZWYgU1RBVFMKKwkgIFBvcnRQLT5TdGF0LlJ4SW50Q250Kys7CisjZW5kaWYgLyogU1RBVFMgKi8KKwkgIFJ4SW50Q250Kys7CisKKwkgIC8qCisJICAqKiBjaGVjayB0aGF0IGl0IGlzIG5vdCBhIGNvbW1hbmQhCisJICAqLworCSAgaWYgKCBQYWNrZXRQLT5sZW4gJiBQS1RfQ01EX0JJVCApIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPOiB1bmV4cGVjdGVkIGNvbW1hbmQgcGFja2V0IHJlY2VpdmVkIG9uIFBIQlxuIik7CisJICAgIC8qCSAgICByaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCAoIiBzeXNwb3J0ICAgPSAlZFxuIiwgcC0+UklPUG9ydHAtPlBvcnROdW0pKTsgKi8KKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGRlc3RfdW5pdCA9ICVkXG4iLCBQYWNrZXRQLT5kZXN0X3VuaXQpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgZGVzdF9wb3J0ID0gJWRcbiIsIFBhY2tldFAtPmRlc3RfcG9ydCk7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBzcmNfdW5pdCAgPSAlZFxuIiwgUGFja2V0UC0+c3JjX3VuaXQpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgc3JjX3BvcnQgID0gJWRcbiIsIFBhY2tldFAtPnNyY19wb3J0KTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGxlbgkgICA9ICVkXG4iLCBQYWNrZXRQLT5sZW4pOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgY29udHJvbCAgID0gJWRcbiIsIFBhY2tldFAtPmNvbnRyb2wpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgY3N1bQkgICA9ICVkXG4iLCBQYWNrZXRQLT5jc3VtKTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiCSBkYXRhIGJ5dGVzOiAiKTsKKwkgICAgZm9yICggRGF0YUNudD0wOyBEYXRhQ250PFBLVF9NQVhfREFUQV9MRU47IERhdGFDbnQrKyApCisJICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiJWRcbiIsIFBhY2tldFAtPmRhdGFbRGF0YUNudF0pOworCSAgICByZW1vdmVfcmVjZWl2ZSggUG9ydFAgKTsKKwkgICAgcHV0X2ZyZWVfZW5kKCBQb3J0UC0+SG9zdFAsIFBhY2tldFAgKTsKKwkgICAgY29udGludWU7IC8qIHdpdGggbmV4dCBwYWNrZXQgKi8KKwkgIH0KKworCSAgLyoKKwkgICoqIEhvdyBtYW55IGNoYXJhY3RlcnMgY2FuIHdlIG1vdmUgJ3Vwc3RyZWFtJyA/CisJICAqKgorCSAgKiogRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG9mIHRoZSBhbW91bnQgb2YgZGF0YQorCSAgKiogYXZhaWxhYmxlIGFuZCB0aGUgYW1vdW50IG9mIHNwYWNlIGluIHdoaWNoIHRvCisJICAqKiBwdXQgaXQuCisJICAqKgorCSAgKiogMS4JR2V0IHRoZSBwYWNrZXQgbGVuZ3RoIGJ5IG1hc2tpbmcgJ2xlbicKKwkgICoqCWZvciBvbmx5IHRoZSBsZW5ndGggYml0cy4KKwkgICoqIDIuCUF2YWlsYWJsZSBzcGFjZSBpcyBbYnVmZmVyIHNpemVdIC0gW3NwYWNlIHVzZWRdCisJICAqKgorCSAgKiogVHJhbnNmZXIgY291bnQgaXMgdGhlIG1pbmltdW0gb2YgcGFja2V0IGxlbmd0aAorCSAgKiogYW5kIGF2YWlsYWJsZSBzcGFjZS4KKwkgICovCisJCQkKKwkgIHRyYW5zQ291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIFBhY2tldFAtPmxlbiAmIFBLVF9MRU5fTUFTSywKKwkJCSAgIFRUWV9GTElQQlVGX1NJWkUgLSBUdHlQLT5mbGlwLmNvdW50KTsKKwkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUkVDLCAgInBvcnQgJWQ6IENvcHkgJWQgYnl0ZXNcbiIsIAorCQkJCSAgICAgIFBvcnRQLT5Qb3J0TnVtLCB0cmFuc0NvdW50KTsKKwkgIC8qCisJICAqKiBUbyB1c2UgdGhlIGZvbGxvd2luZyAna2twcmludGZzJyBmb3IgZGVidWdnaW5nIC0gY2hhbmdlIHRoZSAnI3VuZGVmJworCSAgKiogdG8gJyNkZWZpbmUnLCAodGhpcyBpcyB0aGUgb25seSBwbGFjZSBfX19ERUJVR19JVF9fXyBvY2N1cnMgaW4gdGhlCisJICAqKiBkcml2ZXIpLgorCSAgKi8KKyN1bmRlZiBfX19ERUJVR19JVF9fXworI2lmZGVmIF9fX0RFQlVHX0lUX19fCisJICBra3ByaW50ZigiSTolZCBSOiVkIFA6JWQgUTolZCBDOiVkIEY6JXggIiwKKwkJICAgaW50Q291bnQsCisJCSAgIFJ4SW50Q250LAorCQkgICBQb3J0UC0+UG9ydE51bSwKKwkJICAgVHR5UC0+cnhxdWV1ZS5jb3VudCwKKwkJICAgdHJhbnNDb3VudCwKKwkJICAgVHR5UC0+ZmxhZ3MgKTsKKyNlbmRpZgorCSAgcHRyID0gKHVjaGFyICopIFBhY2tldFAtPmRhdGEgKyBQb3J0UC0+UnhEYXRhU3RhcnQ7CisKKwkgIHJpb19tZW1jcHlfZnJvbWlvIChUdHlQLT5mbGlwLmNoYXJfYnVmX3B0ciwgcHRyLCB0cmFuc0NvdW50KTsKKwkgIG1lbXNldChUdHlQLT5mbGlwLmZsYWdfYnVmX3B0ciwgVFRZX05PUk1BTCwgdHJhbnNDb3VudCk7CisKKyNpZmRlZiBTVEFUUworCSAgLyoKKwkgICoqIGtlZXAgYSBjb3VudCBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMKKwkgICovCisJICBQb3J0UC0+U3RhdC5SeENoYXJDbnQJKz0gdHJhbnNDb3VudDsKKyNlbmRpZgorCSAgUG9ydFAtPlJ4RGF0YVN0YXJ0CSs9IHRyYW5zQ291bnQ7CisJICBQYWNrZXRQLT5sZW4JCS09IHRyYW5zQ291bnQ7CisJICBjb3BpZWQgKz0gdHJhbnNDb3VudDsKKwkgIFR0eVAtPmZsaXAuY291bnQgKz0gdHJhbnNDb3VudDsKKwkgIFR0eVAtPmZsaXAuY2hhcl9idWZfcHRyICs9IHRyYW5zQ291bnQ7CisJICBUdHlQLT5mbGlwLmZsYWdfYnVmX3B0ciArPSB0cmFuc0NvdW50OworCisKKyNpZmRlZiBfX19ERUJVR19JVF9fXworCSAga2twcmludGYoIlQ6JWQgTDolZFxuIiwgRGF0YUNudCwgUGFja2V0UC0+bGVuICk7CisjZW5kaWYKKworCSAgaWYgKCBQYWNrZXRQLT5sZW4gPT0gMCApCisJICAgIHsKKwkJCQkvKgorCQkJCSoqIElmIHdlIGhhdmUgZW1wdGllZCB0aGUgcGFja2V0LCB0aGVuIHdlIGNhbgorCQkJCSoqIGZyZWUgaXQsIGFuZCByZXNldCB0aGUgc3RhcnQgcG9pbnRlciBmb3IKKwkJCQkqKiB0aGUgbmV4dCBwYWNrZXQuCisJCQkJKi8KKwkgICAgICByZW1vdmVfcmVjZWl2ZSggUG9ydFAgKTsKKwkgICAgICBwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCSAgICAgIFBvcnRQLT5SeERhdGFTdGFydCA9IDA7CisjaWZkZWYgU1RBVFMKKwkJCQkvKgorCQkJCSoqIG1vcmUgbGllcyAoIG9vcHMsIEkgbWVhbiBzdGF0aXN0aWNzICkKKwkJCQkqLworCSAgICAgIFBvcnRQLT5TdGF0LlJ4UGt0Q250Kys7CisjZW5kaWYgLyogU1RBVFMgKi8KKwkgICAgfQorCX0KKyAgICB9CisgIGlmIChjb3BpZWQpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JFQywgInBvcnQgJWQ6IHB1c2hpbmcgdHR5IGZsaXAgYnVmZmVyOiAlZCB0b3RhbCBieXRlcyBjb3BpZWQuXG4iLCBQb3J0UC0+UG9ydE51bSwgY29waWVkKTsKKyAgICB0dHlfZmxpcF9idWZmZXJfcHVzaCAoVHR5UCk7CisgIH0KKworICByZXR1cm47Cit9CisKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorLyoKKyoqIFRoZSBwcm9jIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gZG8gdGhlIHdvcmsgZm9yIGl0LgorKiogVGhlIHByb2Mgcm91dGluZSB3b3JrcyBoYW5kIGluIGhhbmQgd2l0aCB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCisqLworaW50CityaW90cHJvYyhwLCB0cCwgY21kLCBwb3J0KQorc3RydWN0IHJpb19pbmZvICoJcDsKK3JlZ2lzdGVyIHN0cnVjdCB0dHlzdGF0aWNzICp0cDsKK2ludCBjbWQ7CitpbnQJcG9ydDsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJaW50IFN5c1BvcnQ7CisJc3RydWN0IFBLVCAqUGFja2V0UDsKKworCVN5c1BvcnQgPSBwb3J0OwkvKiBCZWxpZXZlIG1lLCBpdCB3b3Jrcy4gKi8KKworCWlmICggU3lzUG9ydCA8IDAgfHwgU3lzUG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIklsbGVnYWwgcG9ydCAlZCBkZXJpdmVkIGZyb20gVFRZIGluIHJpb3Rwcm9jKClcbiIsU3lzUG9ydCk7CisJCXJldHVybiAwOworCX0KKwlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOworCisJaWYgKCh1aW50KVBvcnRQLT5QaGJQIDwgKHVpbnQpUG9ydFAtPkNhZGRyIHx8IAorCQkJKHVpbnQpUG9ydFAtPlBoYlAgPj0gKHVpbnQpUG9ydFAtPkNhZGRyK1NJWFRZX0ZPVVJfSyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPOiBOVUxMIG9yIEJBRCBQaGJQIG9uIHN5cyBwb3J0ICVkIGluIHByb2Mgcm91dGluZVxuIiwKKwkJCQkJCQlTeXNQb3J0KTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiCSBQb3J0UCA9IDB4JXhcbiIsUG9ydFApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIJIFBvcnRQLT5QaGJQID0gMHgleFxuIixQb3J0UC0+UGhiUCk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkNhZGRyID0gMHgleFxuIixQb3J0UC0+UGhiUCk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkhvc3RQb3J0ID0gMHgleFxuIixQb3J0UC0+SG9zdFBvcnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgVF9XRkxVU0g6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSFxuIik7CisJCQkvKgorCQkJKiogQmVjYXVzZSBvZiB0aGUgc3Bvb2t5IHdheSB0aGUgUklPIHdvcmtzLCB3ZSBkb24ndCBuZWVkCisJCQkqKiB0byBpc3N1ZSBhIGZsdXNoIGNvbW1hbmQgb24gYW55IG9mIHRoZSBTRVQqRiBjb21tYW5kcywKKwkJCSoqIGFzIHRoYXQgY2F1c2VzIHRyb3VibGUgd2l0aCBnZXR0eSBhbmQgbG9naW4sIHdoaWNoIGlzc3VlCisJCQkqKiB0aGVzZSBjb21tYW5kcyB0byBpbmN1ciBhIFJFQUQgZmx1c2gsIGFuZCByZWx5IG9uIHRoZSBmYWN0CisJCQkqKiB0aGF0IHRoZSBsaW5lIGRpc2NpcGxpbmUgZG9lcyBhIHdhaXQgZm9yIGRyYWluIGZvciB0aGVtLgorCQkJKiogQXMgdGhlIHJpbyBkb2Vzbid0IHdhaXQgZm9yIGRyYWluLCB0aGUgd3JpdGUgZmx1c2ggd291bGQKKwkJCSoqIGRlc3Ryb3kgdGhlIFBhc3N3b3JkOiBwcm9tcHQuIFRoaXMgaXNuJ3QgdmVyeSBmcmllbmRseSwgc28KKwkJCSoqIGhlcmUgd2Ugb25seSBpc3N1ZSBhIFdGTFVTSCBjb21tYW5kIGlmIHdlIGFyZSBpbiB0aGUgaW50ZXJydXB0CisJCQkqKiByb3V0aW5lLCBvciB3ZSBhcmVuJ3QgZXhlY3V0aW5nIGEgU0VUKkYgY29tbWFuZC4KKwkJCSovCisJCQlpZiAoIFBvcnRQLT5Ib3N0UC0+SW5JbnRyIHx8ICFQb3J0UC0+Rmx1c2hDbWRCb2RnZSApIHsKKwkJCQkvKgorCQkJCSoqIGZvcm0gYSB3Zmx1c2ggcGFja2V0IC0gMSBieXRlIGxvbmcsIG5vIGRhdGEKKwkJCQkqLworCQkJCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIldGTFVTSCBvbiBkZWxldGVkIFJUQVxuIik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFdGTFVTSCApID09IFJJT19GQUlMICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9XRkxVU0ggQ29tbWFuZCBmYWlsZWRcbiIpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmRcbiIpOworCQkJCX0KKwkJCQkvKgorCQkJCSoqIFdGTFVTSCBvcGVyYXRpb24gLSBmbHVzaCB0aGUgZGF0YSEKKwkJCQkqLworCQkJCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmQgaWdub3JlZFxuIik7CisJCQl9CisJCQkvKgorCQkJKiogc29ydCBvdXQgdGhlIGxpbmUgZGlzY2lwbGluZQorCQkJKi8KKwkJCWlmIChQb3J0UC0+Q29va01vZGUgPT0gQ09PS19XRUxMKQorCQkJCWdvdG8gc3RhcnQ7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1JFU1VNRToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfUkVTVU1FXG4iKTsKKwkJCS8qCisJCQkqKiBzZW5kIHByZS1lbXB0aXZlIHJlc3VtZSBwYWNrZXQKKwkJCSovCisJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJFU1VNRSBvbiBkZWxldGVkIFJUQVxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJFU1VNRSApID09IFJJT19GQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JFU1VNRSBDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSoqIGFuZCByZS1zdGFydCB0aGUgc2VuZGVyIHNvZnR3YXJlIQorCQkJKi8KKwkJCWlmIChQb3J0UC0+Q29va01vZGUgPT0gQ09PS19XRUxMKQorCQkJCWdvdG8gc3RhcnQ7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1RJTUU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1RJTUVcbiIpOworCQkJLyoKKwkJCSoqIFRfVElNRSBpcyBjYWxsZWQgd2hlbiB4RExZIGlzIHNldCBpbiBvZmxhZ3MgYW5kCisJCQkqKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRpbWVvdXQgaGFzIGV4cGlyZWQuIEl0J3MKKwkJCSoqIGZ1bmN0aW9uIGluIGxpZmUgaXMgdG8gY2xlYXIgdGhlIFRJTUVPVVQgZmxhZworCQkJKiogYW5kIHRvIHJlLXN0YXJ0IG91dHB1dCB0byB0aGUgcG9ydC4KKwkJCSovCisJCQkvKgorCQkJKiogRmFsbCB0aHJvdWdoIGFuZCByZS1zdGFydCBvdXRwdXQKKwkJCSovCisJCWNhc2UgVF9PVVRQVVQ6CitzdGFydDoKKwkJCWlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNQUdJQ19GTFVTSCApIHsKKwkJCQlQb3J0UC0+TWFnaWNGbGFncyB8PSBNT1JFX09VVFBVVF9FWUdPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCVJJT1R4RW5hYmxlKChjaGFyICopUG9ydFApOworCQkJUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1PUkVfT1VUUFVUX0VZR09SOworCQkJLypyaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCBQb3J0UCxEQkdfUFJPQywiVF9PVVRQVVQgZmluaXNoZWRcbiIpOyovCisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1NVU1BFTkQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1NVU1BFTkRcbiIpOworCQkJLyoKKwkJCSoqIHNlbmQgYSBzdXNwZW5kIHByZS1lbXB0aXZlIHBhY2tldC4KKwkJCSovCisJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlNVU1BFTkQgZGVsZXRlZCBSVEFcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKCBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBTVVNQRU5EICkgPT0gUklPX0ZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfU1VTUEVORCBDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSoqIGRvbmUhCisJCQkqLworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9CTE9DSzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfQkxPQ0tcbiIpOworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9SRkxVU0g6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JGTFVTSFxuIik7CisJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJGTFVTSCBvbiBkZWxldGVkIFJUQVxuIik7CisJCQkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmICggUklPUHJlZW1wdGl2ZUNtZCggcCwgUG9ydFAsIFJGTFVTSCApID09IFJJT19GQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JGTFVTSCBDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworCQkJCXdoaWxlICggY2FuX3JlbW92ZV9yZWNlaXZlKCZQYWNrZXRQLCBQb3J0UCkgKSB7CisJCQkJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJCQkJU2hvd1BhY2tldChEQkdfUFJPQywgUGFja2V0UCApOworCQkJCQlwdXRfZnJlZV9lbmQoUG9ydFAtPkhvc3RQLCBQYWNrZXRQICk7CisJCQkJfQorCQkJCWlmICggUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSA9PSBQSEJfSEFORFNIQUtFX1NFVCApIHsKKwkJCQkJLyoKKwkJCQkJKiogTUFHSUMhCisJCQkJCSovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlNldCByZWNlaXZlIGhhbmRzaGFrZSBiaXRcbiIpOworCQkJCQlQb3J0UC0+UGhiUC0+aGFuZHNoYWtlIHw9IFBIQl9IQU5EU0hBS0VfUkVTRVQ7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIFRfVU5CTE9DSzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfVU5CTE9DS1xuIik7CisJCQkvKgorCQkJKiogSWYgdGhlcmUgaXMgYW55IGRhdGEgdG8gcmVjZWl2ZSBzZXQgYSB0aW1lb3V0IHRvIHNlcnZpY2UgaXQuCisJCQkqLworCQkJUklPUmVjZWl2ZShwLCBQb3J0UCk7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX0JSRUFLOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9CUkVBS1xuIik7CisJCQkvKgorCQkJKiogU2VuZCBhIGJyZWFrIGNvbW1hbmQuIEZvciBTeXMgVgorCQkJKiogdGhpcyBpcyBhIHRpbWVkIGJyZWFrLCBzbyB3ZQorCQkJKiogc2VuZCBhIFNCUkVBS1t0aW1lXSBwYWNrZXQKKwkJCSovCisJCQkvKgorCQkJKiogQnVpbGQgYSBCUkVBSyBjb21tYW5kCisJCQkqLworCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoUklPU2hvcnRDb21tYW5kKFBvcnRQLFNCUkVBSywyLAorCQkJCQkJCQlwLT5SSU9Db25mLkJyZWFrSW50ZXJ2YWwpPT1SSU9fRkFJTCkgeworCQkJICAgCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQorCQkJLyoKKwkJCSoqIGRvbmUhCisJCQkqLworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9JTlBVVDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlByb2MgVF9JTlBVVCBjYWxsZWQgLSBJIGRvbid0IGtub3cgd2hhdCB0byBkbyFcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVF9QQVJNOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUHJvYyBUX1BBUk0gY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKKwkJCWJyZWFrOworCQorCQljYXNlIFRfU1dUQ0g6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJQcm9jIFRfU1dUQ0ggY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKKwkJCWJyZWFrOworCQorCQlkZWZhdWx0OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUHJvYyBVTktOT1dOIGNvbW1hbmQgJWRcbiIsY21kKTsKKwl9CisJLyoKKwkqKiBUX09VVFBVVCByZXR1cm5zIHdpdGhvdXQgcGFzc2luZyB0aHJvdWdoIHRoaXMgcG9pbnQhCisJKi8KKwkvKnJpb19kcHJpbnQoUklPX0RFQlVHX0lOVFIsIFBvcnRQLERCR19QUk9DLCJyaW90cHJvYyBkb25lXG4iKTsqLworCXJldHVybigwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDY3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2lvY3RsLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2lvY3RsLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEzCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaW9pb2N0bC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvaW9jdGxfaF9fCisjZGVmaW5lCV9fcmlvaW9jdGxfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9pb2N0bF9oX3NjY3NfID0gIkAoIylyaW9pb2N0bC5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIFJJTyBkZXZpY2UgZHJpdmVyIC0gdXNlciBpb2N0bHMgYW5kIGFzc29jaWF0ZWQgc3RydWN0dXJlcy4KKyovCisKK3N0cnVjdCBwb3J0U3RhdHMgeworCWludAlwb3J0OworCWludAlnYXRoZXI7CisJdWxvbmcJdHhjaGFyczsKKwl1bG9uZwlyeGNoYXJzOworCXVsb25nCW9wZW5zOworCXVsb25nCWNsb3NlczsKKwl1bG9uZwlpb2N0bHM7Cit9OyAKKworCisjZGVmaW5lIHJJT0MJKCdyJzw8OCkKKyNkZWZpbmUJVENSSU9TVEFURQkocklPQyB8IDEpCisjZGVmaW5lCVRDUklPWFBPTgkocklPQyB8IDIpCisjZGVmaW5lCVRDUklPWFBPRkYJKHJJT0MgfCAzKQorI2RlZmluZQlUQ1JJT1hQQ1BTCShySU9DIHwgNCkKKyNkZWZpbmUJVENSSU9YUFJJTlQJKHJJT0MgfCA1KQorI2RlZmluZSBUQ1JJT0lYQU5ZT04JKHJJT0MgfCA2KQorI2RlZmluZQlUQ1JJT0lYQU5ZT0ZGCShySU9DIHwgNykKKyNkZWZpbmUgVENSSU9JWE9OT04JKHJJT0MgfCA4KQorI2RlZmluZQlUQ1JJT0lYT05PRkYJKHJJT0MgfCA5KQorI2RlZmluZQlUQ1JJT01CSVMJKHJJT0MgfCAxMCkKKyNkZWZpbmUJVENSSU9NQklDCShySU9DIHwgMTEpCisjZGVmaW5lCVRDUklPVFJJQUQJKHJJT0MgfCAxMikKKyNkZWZpbmUgVENSSU9UU1RBVEUJKHJJT0MgfCAxMykKKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBBZGQgUklPIGlvY3RscyBmb3IgbWFuaXB1bGF0aW5nIFJUUyBhbmQgQ1RTIGZsb3cgY29udHJvbCwgKGFzIEx5bnhPUworKiogYXBwZWFycyB0byBub3Qgc3VwcG9ydCBoYXJkd2FyZSBmbG93IGNvbnRyb2wpLgorKi8KKyNkZWZpbmUgVENSSU9DVFNGTE9XRU4JKHJJT0MgfCAxNCkJLyogZW5hYmxlIENUUyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVENSSU9DVFNGTE9XRElTCShySU9DIHwgMTUpCS8qIGRpc2FibGUgQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBUQ1JJT1JUU0ZMT1dFTgkocklPQyB8IDE2KQkvKiBlbmFibGUgUlRTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBUQ1JJT1JUU0ZMT1dESVMJKHJJT0MgfCAxNykJLyogZGlzYWJsZSBSVFMgZmxvdyBjb250cm9sICovCisKKy8qCisqKiAwOS4xMi4xOTk4IEFSRyAtIEVTSUwgMDc3NiBwYXJ0IGZpeAorKiogRGVmaW5pdGlvbiBmb3IgJ1JJT0MnIGFsc28gYXBwZWFycyBpbiBkYWVtb24uaCwgc28gd2UnZCBiZXR0ZXIgZG8gYQorKiogI2lmbmRlZiBoZXJlIGZpcnN0LgorKiogJ1JJT19RVUlDS19DSEVDSycgYWxzbyAjZGVmaW5lJ2QgaGVyZSBhcyB0aGlzIGlvY3RsIGlzIG5vdworKiogYWxsb3dlZCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KKyoqCisqKiAwNS4wMi4xOTk5IEFSRyAtCisqKiBUaGlzIGlzIHdoYXQgSSd2ZSBkZWNpZWQgdG8gZG8gd2l0aCBpb2N0bHMgZXRjLiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlCisqKiBpbnZva2VkIGZyb20gdXNlcnMgYXBwbGljYXRpb25zIDoKKyoqIEFueXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZGVmaW5lZCBoZXJlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGRhZW1vbi5oLCB0aGF0CisqKiB3YXkgaXQgd29uJ3QgZW5kIHVwIGhhdmluZyB0byBiZSBkZWZpbmVkL21haW50YWluZWQgaW4gdHdvIHBsYWNlcy4gVGhlIG9ubHkKKyoqIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCB0aGlzIGZpbGUgc2hvdWxkIG5vdyBiZSAjaW5jbHVkZSdkIGJ5IGRhZW1vbi5oCisqKgorKiogJ3N0YXRzJyBpb2N0bHMgbm93ICNkZWZpbmUnZCBoZXJlIGFzIHRoZXkgYXJlIHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgorKi8KKyNkZWZpbmUJUklPQwkoJ1InPDw4KXwoJ2knPDwxNil8KCdvJzw8MjQpCisKKyNkZWZpbmUJUklPX1FVSUNLX0NIRUNLCSAgCShSSU9DIHwgMTA1KQorI2RlZmluZSBSSU9fR0FUSEVSX1BPUlRfU1RBVFMJKFJJT0MgfCAxOTMpCisjZGVmaW5lIFJJT19SRVNFVF9QT1JUX1NUQVRTCShSSU9DIHwgMTk0KQorI2RlZmluZSBSSU9fR0VUX1BPUlRfU1RBVFMJKFJJT0MgfCAxOTUpCisKKyNlbmRpZgkvKiBfX3Jpb2lvY3RsX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9sb2Nrcy5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9sb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGNkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2xvY2tzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvbG9ja3MuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2xvY2tzLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJX19yaW9fcmlvbG9ja3NfaF9fCisjZGVmaW5lCV9fcmlvX3Jpb2xvY2tzX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvbG9ja3NfaF9zY2NzXyA9ICJAKCMpcmlvbG9ja3MuaAkxLjIiOworI2VuZGlmCisKKyNkZWZpbmUgTE9DS0IobGspCQlsb2NrYihsayk7CisjZGVmaW5lIFVOTE9DS0IobGssIG9sZHNwbCkJdW5sb2NrYihsaywgb2xkc3BsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwOTE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGFyYW0uYwpAQCAtMCwwICsxLDc0NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvcGFyYW0uYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDUKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3BhcmFtLmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9wYXJhbV9jX3NjY3NfID0gIkAoIylyaW9wYXJhbS5jCTEuMyI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKyNpbmNsdWRlICJyaW9pb2N0bC5oIgorI2luY2x1ZGUgInBhcmFtLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInNhbS5oIgorCisKKworLyoKKyoqIFRoZSBTY2FtLCBiYXNlZCBvbiBlbWFpbCBmcm9tIGplcmVteXJAYnVncy5zcGVjaWFsaXguY28udWsuLi4uCisqKgorKiogVG8gc2VuZCBhIGNvbW1hbmQgb24gYSBwYXJ0aWN1bGFyIHBvcnQsIHlvdSBwdXQgYSBwYWNrZXQgd2l0aCB0aGUKKyoqIGNvbW1hbmQgYml0IHNldCBvbnRvIHRoZSBwb3J0LiBUaGUgY29tbWFuZCBiaXQgaXMgaW4gdGhlIGxlbiBmaWVsZCwKKyoqIGFuZCBnZXRzIE9SZWQgaW4gd2l0aCB0aGUgYWN0dWFsIGJ5dGUgY291bnQuCisqKgorKiogV2hlbiB5b3Ugc2VuZCBhIHBhY2tldCB3aXRoIHRoZSBjb21tYW5kIGJpdCBzZXQsIHRoZW4gdGhlIGZpcnN0CisqKiBkYXRhIGJ5dGUgKCBkYXRhWzBdICkgaXMgaW50ZXJwcmV0dGVkIGFzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisqKiBJdCBhbHNvIGdvdmVybnMgd2hhdCBkYXRhIHN0cnVjdHVyZSBvdmVybGF5IHNob3VsZCBhY2NvbXBhbnkgdGhlIHBhY2tldC4KKyoqIENvbW1hbmRzIGFyZSBkZWZpbmVkIGluIGNpcnJ1cy9jaXJydXMuaAorKioKKyoqIElmIHlvdSB3YW50IHRoZSBjb21tYW5kIHRvIHByZS1lbXQgZGF0YSBhbHJlYWR5IG9uIHRoZSBxdWV1ZSBmb3IgdGhlCisqKiBwb3J0LCBzZXQgdGhlIHByZS1lbXB0aXZlIGJpdCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb21tYW5kIGJpdC4KKyoqIEl0IGlzIG5vdCBkZWZpbmVkIHdoYXQgd2lsbCBoYXBwZW4gaWYgeW91IHNldCB0aGUgcHJlZW1wdGl2ZSBiaXQKKyoqIG9uIGEgcGFja2V0IHRoYXQgaXMgTk9UIGEgY29tbWFuZC4KKyoqCisqKiBQcmUtZW1wdGl2ZSBjb21tYW5kcyBzaG91bGQgYmUgcXVldWVkIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSB1c2luZworKiogYWRkX3N0YXJ0KCksIHdoZXJlYXMgbm9ybWFsIGNvbW1hbmRzIGFuZCBkYXRhIGFyZSBlbnF1ZXVlZCB1c2luZworKiogYWRkX2VuZCgpLgorKioKKyoqIE1vc3QgY29tbWFuZHMgZG8gbm90IHVzZSB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBkYXRhIGFycmF5LiBUaGUKKyoqIGV4Y2VwdGlvbnMgYXJlIE9QRU4gTU9QRU4gYW5kIENPTkZJRy4gKE5CLiBBcyB3aXRoIHRoZSBTSSBDT05GSUcgYW5kCisqKiBPUEVOIGFyZSBjdXJyZW50bHkgYW5hbGFnb3VzKS4gV2l0aCB0aGVzZSB0aHJlZSBjb21tYW5kcyB0aGUgZm9sbG93aW5nCisqKiAxMSBkYXRhIGJ5dGVzIGFyZSBhbGwgdXNlZCB0byBwYXNzIGNvbmZpZyBpbmZvcm1hdGlvbiBzdWNoIGFzIGJhdWQgcmF0ZSBldGMuCisqKiBUaGUgZmllbGRzIGFyZSBhbHNvIGRlZmluZWQgaW4gY2lycnVzLmguIFNvbWUgY29udGFpbiBzdHJhaWdodGZvcndhcmQKKyoqIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHRyYW5zbWl0IFhPTiBjaGFyYWN0ZXIuIFR3byBjb250YWluIHRoZSB0cmFuc21pdCBhbmQKKyoqIHJlY2VpdmUgYmF1ZCByYXRlcyByZXNwZWN0aXZlbHkuIEZvciBtb3N0IGJhdWQgcmF0ZXMgdGhlcmUgaXMgYSBkaXJlY3QKKyoqIG1hcHBpbmcgYmV0d2VlbiB0aGUgcmF0ZXMgZGVmaW5lZCBpbiA8c3lzL3Rlcm1pby5oPiBhbmQgdGhlIGJ5dGUgaW4gdGhlCisqKiBwYWNrZXQuIFRoZXJlIGFyZSBhZGRpdGlvbmFsIChub24gVU5JWC1zdGFuZGFyZCkgcmF0ZXMgZGVmaW5lZCBpbgorKiogL3UvZG9zL3Jpby9jaXJydXMvaC9icmF0ZXMuaC4KKyoqCisqKiBUaGUgcmVzdCBvZiB0aGUgZGF0YSBmaWVsZHMgY29udGFpbiBhcHByb3hpbWF0aW9ucyB0byB0aGUgQ2lycnVzIHJlZ2lzdGVycworKiogdGhhdCBhcmUgdXNlZCB0byBwcm9ncmFtIG51bWJlciBvZiBiaXRzIGV0Yy4gRWFjaCByZWdpc3RlcnMgYml0IGZpZWxkcyBpcworKiogZGVmaW5lZCBpbiBjaXJydXMuaC4KKyoqIAorKiogTkIuIE9ubHkgdXNlIHRob3NlIGJpdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBiZWluZyBkcml2ZXIgc3BlY2lmaWMKKyoqIG9yIGNvbW1vbiB0byB0aGUgUlRBIGFuZCB0aGUgZHJpdmVyLgorKiogCisqKiBBbGwgY29tbWFuZHMgZ29pbmcgZnJvbSBSVEEtPkhvc3Qgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBIb3N0IGNvZGUgLSB5b3UKKyoqIHdpbGwgbmV2ZXIgc2VlIHRoZW0uIEFzIHdpdGggdGhlIFNJIHRoZXJlIHdpbGwgYmUgdGhyZWUgZmllbGRzIHRvIGxvb2sgb3V0CisqKiBmb3IgaW4gZWFjaCBwaGIgKG5vdCB5ZXQgZGVmaW5lZCAtIG5lZWRzIGRlZmluaW5nIGEucy5hLnApLgorKiogCisqKiBtb2RlbV9zdGF0dXMJLSBjdXJyZW50IHN0YXRlIG9mIGhhbmRzaGFrZSBwaW5zLgorKioKKyoqIHBvcnRfc3RhdHVzCSAtIGN1cnJlbnQgcG9ydCBzdGF0dXMgLSBlcXVpdmFsZW50IHRvIGhpX3N0YXQgZm9yIFNJLCBpbmRpY2F0ZXMKKyoqIGlmIHBvcnQgaXMgSURMRV9PUEVOLCBJRExFX0NMT1NFRCBldGMuCisqKgorKiogYnJlYWtfc3RhdHVzCS0gYml0IFggc2V0IGlmIGJyZWFrIGhhcyBiZWVuIHJlY2VpdmVkLgorKiogCisqKiBIYXBweSBoYWNraW5nLgorKiogCisqLworCisvKiAKKyoqIFJJT1BhcmFtIGlzIHVzZWQgdG8gb3BlbiBvciBjb25maWd1cmUgYSBwb3J0LiBZb3UgcGFzcyBpdCBhIFBvcnRQLAorKiogd2hpY2ggd2lsbCBoYXZlIGEgdHR5IHN0cnVjdCBhdHRhY2hlZCB0byBpdC4gWW91IGFsc28gcGFzcyBhIGNvbW1hbmQsCisqKiBlaXRoZXIgT1BFTiBvciBDT05GSUcuIFRoZSBwb3J0J3Mgc2V0dXAgaXMgdGFrZW4gZnJvbSB0aGUgdF8gZmllbGRzCisqKiBvZiB0aGUgdHR5IHN0cnVjdCBpbnNpZGUgdGhlIFBvcnRQLCBhbmQgdGhlIHBvcnQgaXMgZWl0aGVyIG9wZW5lZAorKiogb3IgcmUtY29uZmlndXJlZC4gWW91IG11c3QgYWxzbyB0ZWxsIFJJT1BhcmFtIGlmIHRoZSBkZXZpY2UgaXMgYSBtb2RlbQorKiogZGV2aWNlIG9yIG5vdCAoaS5lLiB0b3AgYml0IG9mIG1pbm9yIG51bWJlciBzZXQgb3IgY2xlYXIgLSB0YWtlIHNwZWNpYWwKKyoqIGNhcmUgd2hlbiBkZWNpZGluZyBvbiB0aGlzISkuCisqKiBSSU9QYXJhbSBuZWl0aGVyIGZsdXNoZXMgbm9yIHdhaXRzIGZvciBkcmFpbiwgYW5kIGlzIE5PVCBwcmVlbXB0aXZlLgorKioKKyoqIFJJT1BhcmFtIGFzc3VtZXMgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc3BscmlvKCksIGFuZCBhbHNvIGFzc3VtZXMKKyoqIHRoYXQgQ29va01vZGUgaXMgc2V0IGNvcnJlY3RseSBpbiB0aGUgcG9ydCBzdHJ1Y3R1cmUuCisqKgorKiogTkIuIGZvciBNUFgKKyoqCXR0eSBsb2NrIG11c3QgTk9UIGhhdmUgYmVlbiBwcmV2aW91c2x5IGFjcXVpcmVkLgorKi8KK2ludAorUklPUGFyYW0oUG9ydFAsIGNtZCwgTW9kZW0sIFNsZWVwRmxhZykKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK2ludCBjbWQ7CitpbnQgTW9kZW07CitpbnQgU2xlZXBGbGFnOyAKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqVHR5UDsKKwlpbnQJcmV0dmFsOworCXJlZ2lzdGVyIHN0cnVjdCBwaGJfcGFyYW0gKnBoYl9wYXJhbV9wdHI7CisJUEtUICpQYWNrZXRQOworCWludCByZXM7CisJdWNoYXIgQ29yMT0wLCBDb3IyPTAsIENvcjQ9MCwgQ29yNT0wOworCXVjaGFyIFR4WG9uPTAsIFR4WG9mZj0wLCBSeFhvbj0wLCBSeFhvZmY9MDsKKwl1Y2hhciBMTmV4dD0wLCBUeEJhdWQ9MCwgUnhCYXVkPTA7CisJaW50CQlyZXRyaWVzID0gMHhmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlciAoKTsKKworCVR0eVAgPSBQb3J0UC0+Z3MudHR5OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlJJT1BhcmFtOiBQb3J0OiVkIGNtZDolZCBNb2RlbTolZCBTbGVlcEZsYWc6JWQgTWFwcGVkOiAlZCwgdHR5PSVwXG4iLAorCSAgICBQb3J0UC0+UG9ydE51bSwgY21kLCBNb2RlbSwgU2xlZXBGbGFnLCBQb3J0UC0+TWFwcGVkLCBUdHlQKTsKKworCWlmICghVHR5UCkgeworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhbid0IGNhbGwgcmlvcGFyYW0gd2l0aCBudWxsIHR0eS5cbiIpOworCisJICBmdW5jX2V4aXQgKCk7CisKKwkgIHJldHVybiBSSU9fRkFJTDsKKwl9CisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MgKTsKKworCWlmIChjbWQgPT0gT1BFTikgeworCQkvKgorCQkqKiBJZiB0aGUgcG9ydCBpcyBzZXQgdG8gc3RvcmUgb3IgbG9jayB0aGUgcGFyYW1ldGVycywgYW5kIGl0IGlzCisJCSoqIHBhcmFtZWQgd2l0aCBPUEVOLCB3ZSB3YW50IHRvIHJlc3RvcmUgdGhlIHNhdmVkIHBvcnQgdGVybWlvLCBidXQKKwkJKiogb25seSBpZiBTdG9yZWRUZXJtaW8gaGFzIGJlZW4gc2F2ZWQsIGkuZS4gTk9UIDFzdCBvcGVuIGFmdGVyIHJlYm9vdC4KKwkJKi8KKyNpZiAwCisJCWlmIChQb3J0UC0+Rmlyc3RPcGVuKSB7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmlmbGFnID0gVHR5UC0+dG0uY19pZmxhZzsKKwkJCVBvcnRQLT5TdG9yZWRUdHkub2ZsYWcgPSBUdHlQLT50bS5jX29mbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5jZmxhZyA9IFR0eVAtPnRtLmNfY2ZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmxmbGFnID0gVHR5UC0+dG0uY19sZmxhZzsKKwkJCVBvcnRQLT5TdG9yZWRUdHkubGluZSA9IFR0eVAtPnRtLmNfbGluZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyA1OyBpKyspCisJCQkJUG9ydFAtPlN0b3JlZFR0eS5jY1tpXSA9IFR0eVAtPnRtLmNfY2NbaV07CisJCQlQb3J0UC0+Rmlyc3RPcGVuID0gMDsKKwkJfQorCQllbHNlIGlmIChQb3J0UC0+U3RvcmUgfHwgUG9ydFAtPkxvY2spIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJPUEVOOiBSZXN0b3Jpbmcgc3RvcmVkL2xvY2tlZCBwYXJhbXNcbiIpOworCQkJVHR5UC0+dG0uY19pZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkuaWZsYWc7CisJCQlUdHlQLT50bS5jX29mbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5vZmxhZzsKKwkJCVR0eVAtPnRtLmNfY2ZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmNmbGFnOworCQkJVHR5UC0+dG0uY19sZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkubGZsYWc7CisJCQlUdHlQLT50bS5jX2xpbmUgPSBQb3J0UC0+U3RvcmVkVHR5LmxpbmU7CisJCQlmb3IgKGkgPSAwOyBpIDwgTkNDICsgNTsgaSsrKQorCQkJCVR0eVAtPnRtLmNfY2NbaV0gPSBQb3J0UC0+U3RvcmVkVHR5LmNjW2ldOworCQl9CisjZW5kaWYKKwl9CisKKwkvKgorCSoqIHdhaXQgZm9yIHNwYWNlCisJKi8KKwl3aGlsZSAoICEocmVzPWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsUG9ydFApKSB8fCAKKwkJCShQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSApIHsKKwkJaWYgKHJldHJpZXMgLS0gPD0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBvcnQgSU5fVVNFIGZvciBwcmUtZW1wdGl2ZSBjb21tYW5kXG4iKTsKKwkJfQorCisJCWlmICggIXJlcyApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJQb3J0IGhhcyBubyBzcGFjZSBvbiB0cmFuc21pdCBxdWV1ZVxuIik7CisJCX0KKworCQlpZiAoIFNsZWVwRmxhZyAhPSBPS19UT19TTEVFUCApIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWZ1bmNfZXhpdCgpOworCQkJCisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAid2FpdCBmb3IgY2FuX2FkZF90cmFuc21pdFxuIik7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dmFsID0gUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpOworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlpZiAocmV0dmFsID09IFJJT19GQUlMKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAid2FpdCBmb3IgY2FuX2FkZF90cmFuc21pdCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXBzZXRlcnIoRUlOVFIpOworCQkJZnVuY19leGl0KCk7CisKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJZnVuY19leGl0ICgpOworCisJCQlyZXR1cm4gUklPX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlpZiAoIXJlcykgeworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWZ1bmNfZXhpdCAoKTsKKworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgImNhbl9hZGRfdHJhbnNtaXQoKSByZXR1cm5zICV4XG4iLHJlcyk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBhY2tldCBpcyAweCV4XG4iLChpbnQpIFBhY2tldFApOworCisJcGhiX3BhcmFtX3B0ciA9IChzdHJ1Y3QgcGhiX3BhcmFtICopUGFja2V0UC0+ZGF0YTsKKworCisjaWYgMAorCS8qCisJKiogQ09SIDEKKwkqLworCWlmICggVHR5UC0+dG0uY19pZmxhZyAmIElOUENLICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUGFyaXR5IGNoZWNraW5nIG9uIGlucHV0IGVuYWJsZWRcbiIpOworCQlDb3IxIHw9IENPUjFfSU5QQ0s7CisJfQorI2VuZGlmCisKKwlzd2l0Y2ggKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUgKSB7CisJCWNhc2UgQ1M1OgorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiNSBiaXQgZGF0YVxuIik7CisJCQlDb3IxIHw9IENPUjFfNUJJVFM7CisJCQlicmVhazsKKwkJfQorCQljYXNlIENTNjoKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjYgYml0IGRhdGFcbiIpOworCQkJQ29yMSB8PSBDT1IxXzZCSVRTOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDUzc6CisJCXsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICI3IGJpdCBkYXRhXG4iKTsKKwkJCUNvcjEgfD0gQ09SMV83QklUUzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ1M4OgorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiOCBiaXQgZGF0YVxuIik7CisJCQlDb3IxIHw9IENPUjFfOEJJVFM7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjIgc3RvcCBiaXRzXG4iKTsKKwkJQ29yMSB8PSBDT1IxXzJTVE9QOworCX0KKwllbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjEgc3RvcCBiaXRcbiIpOworCQlDb3IxIHw9IENPUjFfMVNUT1A7CisJfQorCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHBhcml0eVxuIik7CisJCUNvcjEgfD0gQ09SMV9OT1JNQUw7CisJfQorCWVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRGlzYWJsZSBwYXJpdHlcbiIpOworCQlDb3IxIHw9IENPUjFfTk9QOworCX0KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJPZGQgcGFyaXR5XG4iKTsKKwkJQ29yMSB8PSBDT1IxX09ERDsKKwl9CisJZWxzZSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFdmVuIHBhcml0eVxuIik7CisJCUNvcjEgfD0gQ09SMV9FVkVOOyAKKwl9CisKKwkvKgorCSoqIENPUiAyCisJKi8KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHN0YXJ0L3N0b3Agb3V0cHV0IGNvbnRyb2xcbiIpOworCQlDb3IyIHw9IENPUjJfSVhPTjsKKwl9CisJZWxzZSB7CisJCWlmICggUG9ydFAtPkNvbmZpZyAmIFJJT19JWE9OICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkZvcmNlIGVuYWJsZSBzdGFydC9zdG9wIG91dHB1dCBjb250cm9sXG4iKTsKKwkJCUNvcjIgfD0gQ09SMl9JWE9OOworCQl9CisJCWVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJWE9OIGhhcyBiZWVuIGRpc2FibGVkLlxuIik7CisJfQorCisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWEFOWSkgeworCQlpZiAoIFBvcnRQLT5Db25maWcgJiBSSU9fSVhBTlkgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGFueSBrZXkgdG8gcmVzdGFydCBvdXRwdXRcbiIpOworCQkJQ29yMiB8PSBDT1IyX0lYQU5ZOworCQl9CisJCWVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJWEFOWSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gc2FuaXR5IHJlYXNvbnMuXG4iKTsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9GRiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBzdGFydC9zdG9wIGlucHV0IGNvbnRyb2wgMlxuIik7CisJCUNvcjIgfD0gQ09SMl9JWE9GRjsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkhhbmd1cCBvbiBsYXN0IGNsb3NlXG4iKTsKKwkJQ29yMiB8PSBDT1IyX0hVUENMOworCX0KKworCWlmICggQ19DUlRTQ1RTIChUdHlQKSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUnggaGFyZHdhcmUgZmxvdyBjb250cm9sIGVuYWJsZWRcbiIpOworCQlDb3IyIHw9IENPUjJfQ1RTRkxPVzsKKwkJQ29yMiB8PSBDT1IyX1JUU0ZMT1c7CisJfSBlbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlJ4IGhhcmR3YXJlIGZsb3cgY29udHJvbCBkaXNhYmxlZFxuIik7CisJCUNvcjIgJj0gfkNPUjJfQ1RTRkxPVzsKKwkJQ29yMiAmPSB+Q09SMl9SVFNGTE9XOworCX0KKworCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTG9jYWwgbGluZVxuIik7CisJfQorCWVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUG9zc2libGUgTW9kZW0gbGluZVxuIik7CisJfQorCisJLyoKKwkqKiBDT1IgNCAodGhlcmUgaXMgbm8gQ09SIDMpCisJKi8KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUksgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJZ25vcmUgYnJlYWsgY29uZGl0aW9uXG4iKTsKKwkJQ29yNCB8PSBDT1I0X0lHTkJSSzsKKwl9CisJaWYgKCAhKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBCUktJTlQpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQnJlYWsgZ2VuZXJhdGVzIE5VTEwgY29uZGl0aW9uXG4iKTsKKwkJQ29yNCB8PSBDT1I0X05CUktJTlQ7CisJfSBlbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkludGVycnVwdCBvbglicmVhayBjb25kaXRpb25cbiIpOworCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElOTENSICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIG5ld2xpbmUgdG8gY2FycmlhZ2UgcmV0dXJuIG9uIGlucHV0XG4iKTsKKwkJQ29yNCB8PSBDT1I0X0lOTENSOworCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElHTkNSICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSWdub3JlIGNhcnJpYWdlIHJldHVybiBvbiBpbnB1dFxuIik7CisJCUNvcjQgfD0gQ09SNF9JR05DUjsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJQ1JOTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBjYXJyaWFnZSByZXR1cm4gdG8gbmV3bGluZSBvbiBpbnB1dFxuIik7CisJCUNvcjQgfD0gQ09SNF9JQ1JOTDsKKwl9CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSWdub3JlIGNoYXJhY3RlcnMgd2l0aCBwYXJpdHkgZXJyb3JzXG4iKTsKKwkJQ29yNCB8PSBDT1I0X0lHTlBBUjsKKwl9CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgUEFSTVJLICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFyayBwYXJpdHkgZXJyb3JzXG4iKTsKKwkJQ29yNCB8PSBDT1I0X1BBUk1SSzsKKwl9CisKKwkvKgorCSoqIFNldCB0aGUgUkFJU0VNT0QgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgbW9kZW0gbGluZXMgYXJlIHJhaXNlZAorCSoqIG9uIHJlY2VwdGlvbiBvZiBhIGNvbmZpZyBwYWNrZXQuCisJKiogVGhlIGRvd25sb2FkIGNvZGUgaGFuZGxlcyB0aGUgemVybyBiYXVkIGNvbmRpdGlvbi4KKwkqLworCUNvcjQgfD0gQ09SNF9SQUlTRU1PRDsKKworCS8qCisJKiogQ09SIDUKKwkqLworCisJQ29yNSA9IENPUjVfQ01PRTsKKworCS8qCisJKiogU2V0IHRvIG1vbml0b3IgdGJ1c3kvdHN0b3AgKG9yIG5vdCkuCisJKi8KKworCWlmIChQb3J0UC0+TW9uaXRvclRzdGF0ZSkKKwkJQ29yNSB8PSBDT1I1X1RTVEFURV9PTjsKKwllbHNlCisJCUNvcjUgfD0gQ09SNV9UU1RBVEVfT0ZGOworCisJLyoKKwkqKiBDb3VsZCBzZXQgTE5FIGhlcmUgaWYgeW91IHdhbnRlZCBMTmV4dCBwcm9jZXNzaW5nLiBTVlI0IHdpbGwgdXNlIGl0LgorCSovCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVNUUklQICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiU3RyaXAgaW5wdXQgY2hhcmFjdGVyc1xuIik7CisJCWlmICghIChQb3J0UC0+U3RhdGUgJiBSSU9fVFJJQURfTU9ERSkpIHsKKwkJCUNvcjUgfD0gQ09SNV9JU1RSSVA7CisJCX0KKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTkxDUiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBuZXdsaW5lIHRvIGNhcnJpYWdlLXJldHVybiwgbmV3bGluZSBvbiBvdXRwdXRcbiIpOworCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJCQlDb3I1IHw9IENPUjVfT05MQ1I7CisJfQorCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9DUk5MICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIGNhcnJpYWdlIHJldHVybiB0byBuZXdsaW5lIG9uIG91dHB1dFxuIik7CisJCWlmICggUG9ydFAtPkNvb2tNb2RlID09IENPT0tfTUVESVVNICkKKwkJCUNvcjUgfD0gQ09SNV9PQ1JOTDsKKwl9CisJaWYgKCAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBUQUJETFkpID09IFRBQjMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJUYWIgZGVsYXkgMyBzZXRcbiIpOworCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJCQlDb3I1IHw9IENPUjVfVEFCMzsKKwl9CisKKwkvKgorCSoqIEZsb3cgY29udHJvbCBieXRlcy4KKwkqLworCVR4WG9uID0gVHR5UC0+dGVybWlvcy0+Y19jY1tWU1RBUlRdOworCVR4WG9mZiA9IFR0eVAtPnRlcm1pb3MtPmNfY2NbVlNUT1BdOworCVJ4WG9uID0gVHR5UC0+dGVybWlvcy0+Y19jY1tWU1RBUlRdOworCVJ4WG9mZiA9IFR0eVAtPnRlcm1pb3MtPmNfY2NbVlNUT1BdOworCS8qCisJKiogTE5FWFQgYnl0ZQorCSovCisJTE5leHQgPSAwOworCisJLyoKKwkqKiBCYXVkIHJhdGUgYnl0ZXMKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXBwaW5nIG9mIHJ4L3R4IGJhdWQgJXggKCV4KVxuIiwgCisJCQkJICAgICBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnLCBDQkFVRCk7CisKKwlzd2l0Y2ggKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworI2RlZmluZSBlKGIpIGNhc2UgQiAjIyBiIDogUnhCYXVkID0gVHhCYXVkID0gUklPX0IgIyMgYiA7YnJlYWsKKwkgIGUoNTApO2UoNzUpO2UoMTEwKTtlKDEzNCk7ZSgxNTApO2UoMjAwKTtlKDMwMCk7ZSg2MDApO2UoMTIwMCk7CisJICBlKDE4MDApO2UoMjQwMCk7ZSg0ODAwKTtlKDk2MDApO2UoMTkyMDApO2UoMzg0MDApO2UoNTc2MDApOworCSAgZSgxMTUyMDApOyAvKiBlKDIzMDQwMCk7ZSg0NjA4MDApOyBlKDkyMTYwMCk7ICAqLworCX0KKworCS8qIFhYWCBNSXNzaW5nIGNvbnZlcnNpb24gdGFibGUuIFhYWCAqLworCS8qIAkgKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBWX0NCQVVEKTsgKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJ0eCBiYXVkIDB4JXgsIHJ4IGJhdWQgMHgleFxuIiwgVHhCYXVkLCBSeEJhdWQpOworCisKKwkvKgorCSoqIExlZnRvdmVycworCSovCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHJlY2VpdmVyXG4iKTsKKyNpZmRlZiBSQ1YxRU4KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBSQ1YxRU4gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUkNWMUVOICg/KVxuIik7CisjZW5kaWYKKyNpZmRlZiBYTVQxRU4KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBYTVQxRU4gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiWE1UMUVOICg/KVxuIik7CisjZW5kaWYKKyNpZiAwCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgTE9CTEsgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTE9CTEsgLSBKQ0wgb3V0cHV0IGJsb2NrcyB3aGVuIG5vdCBjdXJyZW50XG4iKTsKKyNlbmRpZgorCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIElTSUcgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSW5wdXQgY2hhcmFjdGVyIHNpZ25hbCBnZW5lcmF0aW5nIGVuYWJsZWRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIElDQU5PTiApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJDYW5vbmljYWwgaW5wdXQ6IGVyYXNlIGFuZCBraWxsIGVuYWJsZWRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFhDQVNFICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhbm9uaWNhbCB1cHBlci9sb3dlciBwcmVzZW50YXRpb25cbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE8gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGlucHV0IGVjaG9cbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE9FICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBlY2hvIGVyYXNlXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPSyApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgZWNobyBraWxsXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPTkwgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGVjaG8gbmV3bGluZVxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgTk9GTFNIICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkRpc2FibGUgZmx1c2ggYWZ0ZXIgaW50ZXJydXB0IG9yIHF1aXRcbiIpOworI2lmZGVmIFRPU1RPUAorCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFRPU1RPUCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJTZW5kIFNJR1RUT1UgZm9yIGJhY2tncm91bmQgb3V0cHV0XG4iKTsKKyNlbmRpZgorI2lmZGVmIFhDTFVERQorCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFhDTFVERSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFeGNsdXNpdmUgdXNlIG9mIHRoaXMgbGluZVxuIik7CisjZW5kaWYKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJVUNMQyApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXAgdXBwZXJjYXNlIHRvIGxvd2VyY2FzZSBvbiBpbnB1dFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT1BPU1QgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIG91dHB1dCBwb3N0LXByb2Nlc3NpbmdcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9MQ1VDICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBsb3dlcmNhc2UgdG8gdXBwZXJjYXNlIG9uIG91dHB1dFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT05PQ1IgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTm8gY2FycmlhZ2UgcmV0dXJuIG91dHB1dCBhdCBjb2x1bW4gMFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT05MUkVUICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk5ld2xpbmUgcGVyZm9ybXMgY2FycmlhZ2UgcmV0dXJuIGZ1bmN0aW9uXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPRklMTCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJVc2UgZmlsbCBjaGFyYWN0ZXJzIGZvciBkZWxheVxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT0ZERUwgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRmlsbCBjaGFyYWN0ZXIgaXMgREVMXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBOTERMWSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJOZXdsaW5lIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgQ1JETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQ2FycmlhZ2UgcmV0dXJuIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgVEFCRExZICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlRhYiBkZWxheSBzZXRcbiIpOworI2lmIDAKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBCU0RMWSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJCYWNrLXNwYWNlIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgVlRETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiVmVydGljYWwgdGFiIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgRkZETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRm9ybS1mZWVkIGRlbGF5IHNldFxuIik7CisjZW5kaWYKKwkvKgorCSoqIFRoZXNlIHRoaW5ncyBhcmUga2luZCBvZiB1c2VmdWwgaW4gYSBsYXRlciBsaWZlIQorCSovCisJUG9ydFAtPkNvcjJDb3B5ID0gQ29yMjsKKworCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJZnVuY19leGl0ICgpOworCisJCXJldHVybiBSSU9fRkFJTDsKKwl9CisKKwkvKgorCSoqIEFjdHVhbGx5IHdyaXRlIHRoZSBpbmZvIGludG8gdGhlIHBhY2tldCB0byBiZSBzZW50CisJKi8KKwlXQllURShwaGJfcGFyYW1fcHRyLT5DbWQsCWNtZCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q29yMSwJIENvcjEpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjIsCSBDb3IyKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5Db3I0LAkgQ29yNCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q29yNSwJIENvcjUpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlR4WG9uLAlUeFhvbik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhYb24sCVJ4WG9uKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5UeFhvZmYsIFR4WG9mZik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhYb2ZmLCBSeFhvZmYpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkxOZXh0LAlMTmV4dCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+VHhCYXVkLCBUeEJhdWQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlJ4QmF1ZCwgUnhCYXVkKTsKKworCS8qCisJKiogU2V0IHRoZSBsZW5ndGgvY29tbWFuZCBmaWVsZAorCSovCisJV0JZVEUoUGFja2V0UC0+bGVuICwgMTIgfCBQS1RfQ01EX0JJVCk7CisKKwkvKgorCSoqIFRoZSBwYWNrZXQgaXMgZm9ybWVkIC0gbm93LCB3aGFjayBpdCBvZmYKKwkqKiB0byBpdHMgZmluYWwgZGVzdGluYXRpb246CisJKi8KKwlhZGRfdHJhbnNtaXQoUG9ydFApOworCS8qCisJKiogQ291bnQgY2hhcmFjdGVycyB0cmFuc21pdHRlZCBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSovCisJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJUG9ydFAtPnR4Y2hhcnMgKz0gMTI7CisKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiYWRkX3RyYW5zbWl0IHJldHVybmVkLlxuIik7CisJLyoKKwkqKiBqb2IgZG9uZS4KKwkqLworCWZ1bmNfZXhpdCAoKTsKKworCXJldHVybiBSSU9fU1VDQ0VTUzsKK30KKworCisvKgorKiogV2UgY2FuIGFkZCBhbm90aGVyIHBhY2tldCB0byBhIHRyYW5zbWl0IHF1ZXVlIGlmIHRoZSBwYWNrZXQgcG9pbnRlciBwb2ludGVkCisqKiB0byBieSB0aGUgVHhBZGQgcG9pbnRlciBoYXMgUEtUX0lOX1VTRSBjbGVhciBpbiBpdHMgYWRkcmVzcy4KKyovCitpbnQKK2Nhbl9hZGRfdHJhbnNtaXQoUGt0UCwgUG9ydFApCitQS1QgKipQa3RQOworc3RydWN0IFBvcnQgKlBvcnRQOyAKK3sKKwlyZWdpc3RlciBQS1QgKnRwOworCisJKlBrdFAgPSB0cCA9IChQS1QgKilSSU9fUFRSKFBvcnRQLT5DYWRkcixSV09SRCgqUG9ydFAtPlR4QWRkKSk7CisKKwlyZXR1cm4gISgodWludCl0cCAmIFBLVF9JTl9VU0UpOworfQorCisvKgorKiogVG8gYWRkIGEgcGFja2V0IHRvIHRoZSBxdWV1ZSwgeW91IHNldCB0aGUgUEtUX0lOX1VTRSBiaXQgaW4gdGhlIGFkZHJlc3MsCisqKiBhbmQgdGhlbiBtb3ZlIHRoZSBUeEFkZCBwb2ludGVyIGFsb25nIG9uZSBwb3NpdGlvbiB0byBwb2ludCB0byB0aGUgbmV4dAorKiogcGFja2V0IHBvaW50ZXIuIFlvdSBtdXN0IHdyYXAgdGhlIHBvaW50ZXIgZnJvbSB0aGUgZW5kIGJhY2sgdG8gdGhlIHN0YXJ0LgorKi8KK3ZvaWQKK2FkZF90cmFuc21pdChQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsgCit7CisgIGlmIChSV09SRCgqUG9ydFAtPlR4QWRkKSAmIFBLVF9JTl9VU0UpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiYWRkX3RyYW5zbWl0OiBQYWNrZXQgaGFzIGJlZW4gc3RvbGVuISIpOworICB9CisJV1dPUkQoICoodXNob3J0ICopUG9ydFAtPlR4QWRkLCBSV09SRCgqUG9ydFAtPlR4QWRkKSB8IFBLVF9JTl9VU0UpOworCVBvcnRQLT5UeEFkZCA9IChQb3J0UC0+VHhBZGQgPT0gUG9ydFAtPlR4RW5kKSA/IFBvcnRQLT5UeFN0YXJ0IDogCisJCQkJCVBvcnRQLT5UeEFkZCArIDE7CisJV1dPUkQoIFBvcnRQLT5QaGJQLT50eF9hZGQgLCBSSU9fT0ZGKFBvcnRQLT5DYWRkcixQb3J0UC0+VHhBZGQpICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdXQgYSBwYWNrZXQgb250byB0aGUgZW5kIG9mIHRoZQorICogZnJlZSBsaXN0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3B1dF9mcmVlX2VuZChIb3N0UCwgUGt0UCkKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK1BLVCAqUGt0UDsKK3sKKwlGUkVFX0xJU1QgKnRtcF9wb2ludGVyOworCXVzaG9ydCBvbGRfZW5kLCBuZXdfZW5kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJkhvc3RQLT5Ib3N0TG9jaywgZmxhZ3MpOworCisJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiBQdXQgYSBwYWNrZXQgYmFjayBvbnRvIHRoZSBiYWNrIG9mIHRoZSBmcmVlIGxpc3QKKwkqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QRkUsICAicHV0X2ZyZWVfZW5kKFBrdFA9JXgpXG4iLChpbnQpUGt0UCk7CisKKwlpZiAoKG9sZF9lbmQ9UldPUkQoSG9zdFAtPlBhcm1NYXBQLT5mcmVlX2xpc3RfZW5kKSkgIT0gVFBOVUxMKSB7CisJCW5ld19lbmQgPSBSSU9fT0ZGKEhvc3RQLT5DYWRkcixQa3RQKTsKKwkJdG1wX3BvaW50ZXIgPSAoRlJFRV9MSVNUICopUklPX1BUUihIb3N0UC0+Q2FkZHIsb2xkX2VuZCk7CisJCVdXT1JEKHRtcF9wb2ludGVyLT5uZXh0ICwgbmV3X2VuZCApOworCQlXV09SRCgoKEZSRUVfTElTVCAqKVBrdFApLT5wcmV2ICwgb2xkX2VuZCk7CisJCVdXT1JEKCgoRlJFRV9MSVNUICopUGt0UCktPm5leHQgLCBUUE5VTEwpOworCQlXV09SRChIb3N0UC0+UGFybU1hcFAtPmZyZWVfbGlzdF9lbmQsIG5ld19lbmQpOworCX0KKwllbHNlIHsJLyogRmlyc3QgcGFja2V0IG9uIHRoZSBmcmVlIGxpc3QgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuISAqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BGRSwgInB1dF9mcmVlX2VuZCgpOiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpOworCQlXV09SRChIb3N0UC0+UGFybU1hcFAtPmZyZWVfbGlzdF9lbmQgLCBSSU9fT0ZGKEhvc3RQLT5DYWRkcixQa3RQKSk7CisJCXRtcF9wb2ludGVyID0gKEZSRUVfTElTVCAqKVBrdFA7CisJCVdXT1JEKHRtcF9wb2ludGVyLT5wcmV2ICwgVFBOVUxMKTsKKwkJV1dPUkQodG1wX3BvaW50ZXItPm5leHQgLCBUUE5VTEwpOworCX0KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkJlZm9yZSB1bmxvY2s6ICVwXG4iLCAmSG9zdFAtPkhvc3RMb2NrKTsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7Cit9CisKKy8qCisqKiBjYW5fcmVtb3ZlX3JlY2VpdmUoUGt0UCxQKSByZXR1cm5zIG5vbi16ZXJvIGlmIFBLVF9JTl9VU0UgaXMgc2V0CisqKiBmb3IgdGhlIG5leHQgcGFja2V0IG9uIHRoZSBxdWV1ZS4gSXQgd2lsbCBhbHNvIHNldCBQa3RQIHRvIHBvaW50IHRvIHRoZQorKiogcmVsZXZhbnQgcGFja2V0LCBbaGF2aW5nIGNsZWFyZWQgdGhlIFBLVF9JTl9VU0UgYml0XS4gSWYgUEtUX0lOX1VTRSBpcyBjbGVhciwKKyoqIHRoZW4gY2FuX3JlbW92ZV9yZWNlaXZlKCkgcmV0dXJucyAwLgorKi8KK2ludAorY2FuX3JlbW92ZV9yZWNlaXZlKFBrdFAsIFBvcnRQKQorUEtUICoqUGt0UDsKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK3sKKwlpZiAoIFJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgUEtUX0lOX1VTRSkgeworCQkqUGt0UCA9IChQS1QgKilSSU9fUFRSKFBvcnRQLT5DYWRkciwKKwkJCQkJUldPUkQoKlBvcnRQLT5SeFJlbW92ZSkgJiB+UEtUX0lOX1VTRSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIFRvIHJlbW92ZSBhIHBhY2tldCBmcm9tIHRoZSByZWNlaXZlIHF1ZXVlIHlvdSBjbGVhciBpdHMgUEtUX0lOX1VTRSBiaXQsCisqKiBhbmQgdGhlbiBidW1wIHRoZSBwb2ludGVycy4gT25jZSB0aGUgcG9pbnRlcnMgZ2V0IHRvIHRoZSBlbmQsIHRoZXkgbXVzdAorKiogYmUgd3JhcHBlZCBiYWNrIHRvIHRoZSBzdGFydC4KKyovCit2b2lkCityZW1vdmVfcmVjZWl2ZShQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsgCit7CisJV1dPUkQoICpQb3J0UC0+UnhSZW1vdmUsIFJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgflBLVF9JTl9VU0UgKTsKKwlQb3J0UC0+UnhSZW1vdmUgPSAoUG9ydFAtPlJ4UmVtb3ZlID09IFBvcnRQLT5SeEVuZCkgPyBQb3J0UC0+UnhTdGFydCA6IAorCQkJCQkJCQlQb3J0UC0+UnhSZW1vdmUgKyAxOworCVdXT1JEKCBQb3J0UC0+UGhiUC0+cnhfcmVtb3ZlICwgUklPX09GRihQb3J0UC0+Q2FkZHIsIFBvcnRQLT5SeFJlbW92ZSkgKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvcGNpY29weS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9wY2ljb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhOTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGNpY29weS5jCkBAIC0wLDAgKzEsOCBAQAorCisvKiBZZWFoLiBXZSBoYXZlIGNvcHlyaWdodCBvbiB0aGlzIG9uZS4gU3VyZS4gKi8KKwordm9pZCByaW9fcGNpY29weSggY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBhbW91bnQpCit7CisgIHdoaWxlICggYW1vdW50LS0gKQorICAgICp0bysrID0gKmZyb20rKzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvcm91dGUuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZiMzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9yb3V0ZS5jCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvcm91dGUuYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDYKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3JvdXRlLmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvcm91dGVfY19zY2NzXyA9ICJAKCMpcmlvcm91dGUuYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJwYXJhbS5oIgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJzYW0uaCIKKworc3RhdGljIGludCBSSU9DaGVja0lzb2xhdGVkKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50KTsKK3N0YXRpYyBpbnQgUklPSXNvbGF0ZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7CitzdGF0aWMgaW50IFJJT0NoZWNrKHN0cnVjdCBIb3N0ICosIHVpbnQpOworc3RhdGljIHZvaWQgUklPQ29uQ29uKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50LCB1aW50LCB1aW50LCB1aW50LCBpbnQpOworCisKKy8qCisqKiBJbmNvbWluZyBvbiB0aGUgUk9VVEVfUlVQCisqKiBJIHdyb3RlIHRoaXMgd2hpbGUgSSB3YXMgdGlyZWQuIEZvcmdpdmUgbWUuCisqLworaW50IFJJT1JvdXRlUnVwKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHVpbnQgUnVwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIFBLVCAqUGFja2V0UCApCit7CisgIHN0cnVjdCBQa3RDbWQgKlBrdENtZFAgPSAoc3RydWN0IFBrdENtZCAqKVBhY2tldFAtPmRhdGE7CisgIHN0cnVjdCBQa3RDbWRfTSAqUGt0UmVwbHlQOworICBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisgIHN0cnVjdCBNYXAgKk1hcFA7CisgIHN0cnVjdCBUb3AgKlRvcFA7CisgIGludCBUaGlzTGluaywgVGhpc0xpbmtNaW4sIFRoaXNMaW5rTWF4OworICBpbnQgcG9ydDsKKyAgaW50IE1vZCwgTW9kMSwgTW9kMjsKKyAgdXNob3J0IFJ0YVR5cGU7CisgIHVpbnQgUnRhVW5pcTsKKyAgdWludCBUaGlzVW5pdCwgVGhpc1VuaXQyOwkvKiAyIGlkcyB0byBhY2NvbW1vZGF0ZSAxNiBwb3J0IFJUQSAqLworICB1aW50IE9sZFVuaXQsIE5ld1VuaXQsIE9sZExpbmssIE5ld0xpbms7CisgIGNoYXIgKk15VHlwZSwgKk15TmFtZTsKKyAgaW50IExpZXM7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBTVEFDSworICAgIFJJT1N0YWNrQ2hlY2soIlJJT1JvdXRlUnVwIik7CisjZW5kaWYKKyNpZmRlZiBDSEVDSworICAgIENoZWNrUGFja2V0UChQYWNrZXRQKTsKKyAgICBDaGVja0hvc3RQKEhvc3RQKTsKKyAgICBDaGVja1J1cChSdXApOworICAgIENoZWNrSG9zdChIb3N0KTsKKyNlbmRpZgorICAvKgorICAqKiBJcyB0aGlzIHVuaXQgdGVsbGluZyB1cyBpdCdzIGN1cnJlbnQgbGluayB0b3BvbG9neT8KKyAgKi8KKyAgaWYgKCBSQllURShQa3RDbWRQLT5Db21tYW5kKSA9PSBST1VURV9UT1BPTE9HWSApCisgIHsKKyAgICBNYXBQID0gSG9zdFAtPk1hcHBpbmc7CisKKyAgICAvKgorICAgICoqIFRoZSBwYWNrZXQgY2FuIGJlIHNlbnQgZWl0aGVyIGJ5IHRoZSBob3N0IG9yIGJ5IGFuIFJUQS4KKyAgICAqKiBJZiBpdCBjb21lcyBmcm9tIHRoZSBob3N0LCB0aGVuIHdlIG5lZWQgdG8gZmlsbCBpbiB0aGUKKyAgICAqKiBUb3BvbG9neSBhcnJheSBpbiB0aGUgaG9zdCBzdHJ1Y3R1cmUuIElmIGl0IGNhbWUgaW4KKyAgICAqKiBmcm9tIGFuIFJUQSB0aGVuIHdlIG5lZWQgdG8gZmlsbCBpbiB0aGUgTWFwcGluZyBzdHJ1Y3R1cmUncworICAgICoqIFRvcG9sb2d5IGFycmF5IGZvciB0aGUgdW5pdC4KKyAgICAqLworICAgIGlmICggUnVwID49ICh1c2hvcnQpTUFYX1JVUCApCisgICAgeworICAgICAgVGhpc1VuaXQgPSBIT1NUX0lEOworICAgICAgVG9wUCA9IEhvc3RQLT5Ub3BvbG9neTsKKyAgICAgIE15VHlwZSA9ICJIb3N0IjsKKyAgICAgIE15TmFtZSA9IEhvc3RQLT5OYW1lOworICAgICAgVGhpc0xpbmtNaW4gPSBUaGlzTGlua01heCA9IFJ1cCAtIE1BWF9SVVA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBUaGlzVW5pdCA9IFJ1cCsxOworICAgICAgVG9wUCA9IEhvc3RQLT5NYXBwaW5nW1J1cF0uVG9wb2xvZ3k7CisgICAgICBNeVR5cGUgPSAiUlRBIjsKKyAgICAgIE15TmFtZSA9IEhvc3RQLT5NYXBwaW5nW1J1cF0uTmFtZTsKKyAgICAgIFRoaXNMaW5rTWluID0gMDsKKyAgICAgIFRoaXNMaW5rTWF4ID0gTElOS1NfUEVSX1VOSVQgLSAxOworICAgIH0KKworICAgIC8qCisgICAgKiogTGllcyB3aWxsIG5vdCBiZSB0b2xlcmF0ZWQuCisgICAgKiogSWYgYW55IHBhaXIgb2YgbGlua3MgY2xhaW0gdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzYW1lCisgICAgKiogcGxhY2UsIHRoZW4gaWdub3JlIHRoaXMgcGFja2V0IGNvbXBsZXRlbHkuCisgICAgKi8KKyAgICBMaWVzID0gMDsKKyAgICBmb3IgKCBUaGlzTGluaz1UaGlzTGlua01pbiArIDE7IFRoaXNMaW5rIDw9IFRoaXNMaW5rTWF4OyBUaGlzTGluaysrKQorICAgIHsKKyAgICAgIC8qCisgICAgICAqKiBpdCB3b24ndCBsaWUgYWJvdXQgbmV0d29yayBpbnRlcmNvbm5lY3QsIHRvdGFsIGRpc2Nvbm5lY3RzCisgICAgICAqKiBhbmQgbm8tSURzLiAob3IgYXQgbGVhc3QsIGl0IGRvZXNuJ3QgKm1hdHRlciogaWYgaXQgZG9lcykKKyAgICAgICovCisgICAgICBpZiAoIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpID4gKHVzaG9ydClNQVhfUlVQICkKKwkgIGNvbnRpbnVlOworCisgICAgICBmb3IgKCBOZXdMaW5rPVRoaXNMaW5rTWluOyBOZXdMaW5rIDwgVGhpc0xpbms7IE5ld0xpbmsrKyApCisgICAgICB7CisgICAgICAgIGlmICggKFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpID09CisgICAgICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbTmV3TGlua10uVW5pdCkpICYmCisJICAgICAoUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVtUaGlzTGlua10uTGluaykgPT0KKyAgICAgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVtOZXdMaW5rXS5MaW5rKSkgKQorCXsKKyAgICAgICAgICBMaWVzKys7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmICggTGllcyApCisgICAgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkxJRVMhIERBTU4gTElFUyEgJWQgTElFUyFcbiIsTGllcyk7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiJWQ6JWMgJWQ6JWMgJWQ6JWMgJWQ6JWNcbiIsCisgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVswXS5Vbml0KSwgCisJICAnQScrUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVswXS5MaW5rKSwKKyAgICAgICAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzFdLlVuaXQpLAorCSAgJ0EnK1JCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMV0uTGluayksCisgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVsyXS5Vbml0KSwKKwkgICdBJytSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzJdLkxpbmspLAorICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbM10uVW5pdCksCisJICAnQScrUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVszXS5MaW5rKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKgorICAgICoqIG5vdywgcHJvY2VzcyBlYWNoIGxpbmsuCisgICAgKi8KKyAgICBmb3IgKCBUaGlzTGluaz1UaGlzTGlua01pbjsgVGhpc0xpbmsgPD0gVGhpc0xpbmtNYXg7IFRoaXNMaW5rKyspCisgICAgeworICAgICAgLyoKKyAgICAgICoqIHRoaXMgaXMgd2hhdCBpdCB3YXMgY29ubmVjdGVkIHRvCisgICAgICAqLworICAgICAgT2xkVW5pdCA9IFRvcFBbVGhpc0xpbmtdLlVuaXQ7CisgICAgICBPbGRMaW5rID0gVG9wUFtUaGlzTGlua10uTGluazsKKworICAgICAgLyoKKyAgICAgICoqIHRoaXMgaXMgd2hhdCBpdCBpcyBub3cgY29ubmVjdGVkIHRvCisgICAgICAqLworICAgICAgTmV3VW5pdCA9IFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpOworICAgICAgTmV3TGluayA9IFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLkxpbmspOworCisgICAgICBpZiAoIE9sZFVuaXQgIT0gTmV3VW5pdCB8fCBPbGRMaW5rICE9IE5ld0xpbmsgKQorICAgICAgeworCS8qCisJKiogc29tZXRoaW5nIGhhcyBjaGFuZ2VkIQorCSovCisKKyAgICAgICAgaWYgKCBOZXdVbml0ID4gTUFYX1JVUCAmJgorCSAgICAgTmV3VW5pdCAhPSBST1VURV9ESVNDT05ORUNUICYmCisJICAgICBOZXdVbml0ICE9IFJPVVRFX05PX0lEICYmCisJICAgICBOZXdVbml0ICE9IFJPVVRFX0lOVEVSQ09OTkVDVCApCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiSSBoYXZlIGEgbGluayBmcm9tICVzICVzIHRvIHVuaXQgJWQ6JWQgLSBJIGRvbid0IGxpa2UgaXQuXG4iLAorCQkgIE15VHlwZSwKKwkJICBNeU5hbWUsCisJCSAgTmV3VW5pdCwKKwkJICBOZXdMaW5rKTsKKwl9CisJZWxzZQorCXsKKwkgIC8qCisJICAqKiBwdXQgdGhlIG5ldyB2YWx1ZXMgaW4KKwkgICovCisJICBUb3BQW1RoaXNMaW5rXS5Vbml0ID0gTmV3VW5pdDsKKwkgIFRvcFBbVGhpc0xpbmtdLkxpbmsgPSBOZXdMaW5rOworCisJICBSSU9TZXRDaGFuZ2UocCk7CisKKwkgIGlmICggT2xkVW5pdCA8PSBNQVhfUlVQICkKKwkgIHsKKwkgICAgLyoKKwkgICAgKiogSWYgc29tZXRoaW5nIGhhcyBiZWNvbWUgYnVzdCwgdGhlbiByZS1lbmFibGUgdGhlbSBtZXNzYWdlcworCSAgICAqLworCSAgICBpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJCVJJT0NvbkNvbihwLEhvc3RQLFRoaXNVbml0LFRoaXNMaW5rLE9sZFVuaXQsT2xkTGluayxESVNDT05ORUNUKTsKKwkgIH0KKworCSAgaWYgKCAoIE5ld1VuaXQgPD0gTUFYX1JVUCApICYmICFwLT5SSU9Ob01lc3NhZ2UgKQorCSAgICBSSU9Db25Db24ocCxIb3N0UCxUaGlzVW5pdCxUaGlzTGluayxOZXdVbml0LE5ld0xpbmssQ09OTkVDVCk7CisKKwkgIGlmICggTmV3VW5pdCA9PSBST1VURV9OT19JRCApCisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICIlcyAlcyAoJWMpIGlzIGNvbm5lY3RlZCB0byBhbiB1bmNvbmZpZ3VyZWQgdW5pdC5cbiIsCisJCSAgICBNeVR5cGUsTXlOYW1lLCdBJytUaGlzTGluayk7CisKKwkgIGlmICggTmV3VW5pdCA9PSBST1VURV9JTlRFUkNPTk5FQ1QgKQorCSAgeworCSAgICBpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJCWNwcmludGYoIiVzICclcycgKCVjKSBpcyBjb25uZWN0ZWQgdG8gYW5vdGhlciBuZXR3b3JrLlxuIiwgTXlUeXBlLE15TmFtZSwnQScrVGhpc0xpbmspOworCSAgfQorCisJICAvKgorCSAgKiogcGVyZm9ybSBhbiB1cGRhdGUgZm9yICd0aGUgb3RoZXIgZW5kJywgc28gdGhhdCB0aGVzZSBtZXNzYWdlcworCSAgKiogb25seSBhcHBlYXJzIG9uY2UuIE9ubHkgZGlzY29ubmVjdCB0aGUgb3RoZXIgZW5kIGlmIGl0IGlzIHBvaW50aW5nCisJICAqKiBhdCB1cyEKKwkgICovCisJICBpZiAoIE9sZFVuaXQgPT0gSE9TVF9JRCApCisJICB7CisJICAgIGlmICggSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPT0gVGhpc1VuaXQgJiYKKwkJIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID09IFRoaXNMaW5rICkKKwkgICAgeworCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTRVRUSU5HIEhPU1QgKCVjKSBUTyBESVNDT05ORUNURUQhXG4iLCBPbGRMaW5rKydBJyk7CisJICAgICAgSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCSAgICAgIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID0gTk9fTElOSzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiSE9TVCglYykgV0FTIE5PVCBDT05ORUNURUQgVE8gJXMgKCVjKSFcbiIsCisJCSAgICBPbGRMaW5rKydBJyxIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdC0xXS5OYW1lLFRoaXNMaW5rKydBJyk7CisJICAgIH0KKwkgIH0KKwkgIGVsc2UgaWYgKCBPbGRVbml0IDw9IE1BWF9SVVAgKQorCSAgeworCSAgICBpZiAoIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uVG9wb2xvZ3lbT2xkTGlua10uVW5pdCA9PSBUaGlzVW5pdCAmJgorCSAgICAgICAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uVG9wb2xvZ3lbT2xkTGlua10uTGluayA9PSBUaGlzTGluayApCisJICAgIHsKKwkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU0VUVElORyBSVEEgJXMgKCVjKSBUTyBESVNDT05ORUNURUQhXG4iLAorCQkJCSAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uTmFtZSxPbGRMaW5rKydBJyk7CisJICAgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0PVJPVVRFX0RJU0NPTk5FQ1Q7CisJICAgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rPU5PX0xJTks7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJUQSAlcyAoJWMpIFdBUyBOT1QgQ09OTkVDVEVEIFRPICVzICglYylcbiIsCisJCQkgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5OYW1lLE9sZExpbmsrJ0EnLAorCQkJICAgIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0LTFdLk5hbWUsVGhpc0xpbmsrJ0EnKTsKKwkgICAgfQorCSAgfQorCSAgaWYgKCBOZXdVbml0ID09IEhPU1RfSUQgKQorCSAgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTUFSS0lORyBIT1NUICglYykgQ09OTkVDVEVEIFRPICVzICglYylcbiIsCisJCQkJTmV3TGluaysnQScsTXlOYW1lLFRoaXNMaW5rKydBJyk7CisJICAgIEhvc3RQLT5Ub3BvbG9neVtOZXdMaW5rXS5Vbml0ID0gVGhpc1VuaXQ7CisJICAgIEhvc3RQLT5Ub3BvbG9neVtOZXdMaW5rXS5MaW5rID0gVGhpc0xpbms7CisJICB9CisJICBlbHNlIGlmICggTmV3VW5pdCA8PSBNQVhfUlVQICkKKwkgIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1BUktJTkcgUlRBICVzICglYykgQ09OTkVDVEVEIFRPICVzICglYylcbiIsCisJICAgICAgSG9zdFAtPk1hcHBpbmdbTmV3VW5pdC0xXS5OYW1lLE5ld0xpbmsrJ0EnLE15TmFtZSxUaGlzTGluaysnQScpOworCSAgICBIb3N0UC0+TWFwcGluZ1tOZXdVbml0LTFdLlRvcG9sb2d5W05ld0xpbmtdLlVuaXQ9VGhpc1VuaXQ7CisJICAgIEhvc3RQLT5NYXBwaW5nW05ld1VuaXQtMV0uVG9wb2xvZ3lbTmV3TGlua10uTGluaz1UaGlzTGluazsKKwkgIH0KKwl9CisJUklPU2V0Q2hhbmdlKHApOworCVJJT0NoZWNrSXNvbGF0ZWQocCwgSG9zdFAsIE9sZFVuaXQgKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKgorICAqKiBUaGUgb25seSBvdGhlciBjb21tYW5kIHdlIHJlY29nbmlzZSBpcyBhIHJvdXRlX3JlcXVlc3QgY29tbWFuZAorICAqLworICBpZiAoIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICE9IFJPVVRFX1JFUVVFU1QgKQorICB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVua25vd24gY29tbWFuZCAlZCByZWNlaXZlZCBvbiBydXAgJWQgaG9zdCAlZCBST1VURV9SVVBcbiIsIAorCSAgIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpLFJ1cCwoaW50KUhvc3RQKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAgICAgCisgIFJ0YVVuaXEgPSAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVswXSkpICsKKwkgICAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMV0pIDw8IDgpICsKKwkgICAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMl0pIDw8IDE2KSArCisJICAgIChSQllURShQa3RDbWRQLT5VbmlxTnVtWzNdKSA8PCAyNCk7CisKKyAgLyoKKyAgKiogRGV0ZXJtaW5lIGlmIDggb3IgMTYgcG9ydCBSVEEKKyAgKi8KKyAgUnRhVHlwZSA9IEdldFVuaXRUeXBlKFJ0YVVuaXEpOworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSZWNlaXZlZCBhIHJlcXVlc3QgZm9yIGFuIElEIGZvciBzZXJpYWwgbnVtYmVyICV4XG4iLCBSdGFVbmlxKTsKKworICBNb2QgPSBSQllURShQa3RDbWRQLT5Nb2R1bGVUeXBlcyk7CisgIE1vZDEgPSBMT05ZQkxFKE1vZCk7CisgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisgIHsKKyAgICAvKgorICAgICoqIE9ubHkgb25lIGlkZW50IGlzIHNldCBmb3IgYSAxNiBwb3J0IFJUQS4gVG8gbWFrZSBjb21wYXRpYmxlCisgICAgKiogd2l0aCA4IHBvcnQsIHNldCAybmQgaWRlbnQgaW4gTW9kMiB0byB0aGUgc2FtZSBhcyBNb2QxLgorICAgICovCisgICAgTW9kMiA9IE1vZDE7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkJhY2twbGFuZSB0eXBlIGlzICVzIChhbGwgcG9ydHMpXG4iLAorICAgICBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5OYW1lKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBNb2QyID0gSElOWUJMRShNb2QpOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNb2R1bGUgdHlwZXMgYXJlICVzIChwb3J0cyAwLTMpIGFuZCAlcyAocG9ydHMgNC03KVxuIiwKKyAgICAgcC0+UklPTW9kdWxlVHlwZXNbTW9kMV0uTmFtZSwgcC0+UklPTW9kdWxlVHlwZXNbTW9kMl0uTmFtZSk7CisgIH0KKworICBpZiAoIFJ0YVVuaXEgPT0gMHhmZmZmZmZmZiApCisgIHsKKyAgICAgIFNob3dQYWNrZXQoIERCR19TUEVDSUFMLCBQYWNrZXRQICk7CisgIH0KKworICAvKgorICAqKiB0cnkgdG8gdW5ob29rIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZSBjb21tYW5kIGZyZWUgbGlzdC4KKyAgKi8KKyAgaWYgKCAhKENtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKSkgKQorICB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk5vIGNvbW1hbmQgYmxvY2tzIHRvIHJvdXRlIFJUQSEgY29tZSBiYWNrIGxhdGVyLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKgorICAqKiBGaWxsIGluIHRoZSBkZWZhdWx0IGluZm8gb24gdGhlIGNvbW1hbmQgYmxvY2sKKyAgKi8KKyAgQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IFJ1cDsKKyAgQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IFJPVVRFX1JVUDsKKyAgQ21kQmxrUC0+UGFja2V0LnNyY191bml0ID0gSE9TVF9JRDsKKyAgQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ID0gUk9VVEVfUlVQOworICBDbWRCbGtQLT5QYWNrZXQubGVuID0gUEtUX0NNRF9CSVQgfCAxOworICBDbWRCbGtQLT5QcmVGdW5jUCA9IENtZEJsa1AtPlBvc3RGdW5jUCA9IE5VTEw7CisgIFBrdFJlcGx5UCA9IChzdHJ1Y3QgUGt0Q21kX00gKilDbWRCbGtQLT5QYWNrZXQuZGF0YTsKKworICBpZiAoISBSSU9Cb290T2socCwgSG9zdFAsIFJ0YVVuaXEpKQorICB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJUQSAleCB0cmllZCB0byBnZXQgYW4gSUQsIGJ1dCBkb2VzIG5vdCBiZWxvbmcgLSBGT0FEIGl0IVxuIiwKKwkgIFJ0YVVuaXEpOworICAgIFBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7CisgICAgSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLCBQa3RSZXBseVAtPkNvbW1hbmRUZXh0LCA3KTsKKyAgICBSSU9RdWV1ZUNtZEJsayhIb3N0UCwgUnVwLCBDbWRCbGtQKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qCisgICoqIENoZWNrIHRvIHNlZSBpZiB0aGUgUlRBIGlzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaG9zdAorICAqLworICBmb3IgKCBUaGlzVW5pdD0wOyBUaGlzVW5pdDxNQVhfUlVQOyBUaGlzVW5pdCsrICkKKyAgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJFbnRyeSAlZCBGbGFncz0lcyAlcyBVbmlxdWVOdW09MHgleFxuIiwKKwkJCVRoaXNVbml0LAorCQkJSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UgPworCQkJCQkgICAgIlNsb3QtSW4tVXNlIjoiTm90IEluIFVzZSIsCisJCQlIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSA/IAorCQkJCQkgICAgIlNsb3QtVGVudGF0aXZlIjoiTm90IFRlbnRhdGl2ZSIsCisJCQlIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uUnRhVW5pcXVlTnVtKTsKKworICAgIC8qCisgICAgKiogV2UgaGF2ZSBhbiBlbnRyeSBmb3IgaXQuCisgICAgKi8KKyAgICBpZiAoIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiAoU0xPVF9JTl9VU0UgfCBTTE9UX1RFTlRBVElWRSkpICYmCisgICAgICAgICAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKSApCisgICAgeworICAgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKyAgICAgIHsKKwkgIFRoaXNVbml0MiA9IEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5JRDIgLSAxOworICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJGb3VuZCB1bml0IDB4JXggYXQgc2xvdHMgJWQrJWRcbiIsCisJCQkJCSAgICBSdGFVbmlxLFRoaXNVbml0LFRoaXNVbml0Mik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkZvdW5kIHVuaXQgMHgleCBhdCBzbG90ICVkXG4iLAorCQkJCQkgICAgUnRhVW5pcSxUaGlzVW5pdCk7CisgICAgICAvKgorICAgICAgKiogSWYgd2UgaGF2ZSBubyBrbm93bGVkZ2Ugb2YgYm9vdGluZyBpdCwgdGhlbiB0aGUgaG9zdCBoYXMKKyAgICAgICoqIGJlZW4gcmUtYm9vdGVkLCBhbmQgc28gd2UgbXVzdCBraWxsIHRoZSBSVEEsIHNvIHRoYXQgaXQKKyAgICAgICoqIHdpbGwgYmUgYm9vdGVkIGFnYWluIChwb3RlbnRpYWxseSB3aXRoIG5ldyBiaW5zKQorICAgICAgKiogYW5kIGl0IHdpbGwgdGhlbiByZS1hc2sgZm9yIGFuIElELCB3aGljaCB3ZSB3aWxsIHNlcnZpY2UuCisgICAgICAqLworICAgICAgaWYgKCAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmIAorCSAgIShIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBSVEFfQk9PVEVEKSApCisgICAgICB7CisJaWYgKCAhKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIE1TR19ET05FKSApCisJeworCSAgICBpZiAoICFwLT5SSU9Ob01lc3NhZ2UgKQorCSAgICAgICAgY3ByaW50ZigiUlRBICclcycgaXMgYmVpbmcgdXBkYXRlZC5cbiIsSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLk5hbWUpOworCSAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgfD0gTVNHX0RPTkU7CisJfQorCVBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7CisJSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsNyk7CisJUklPUXVldWVDbWRCbGsoSG9zdFAsIFJ1cCwgQ21kQmxrUCk7CisJcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBTZW5kIHRoZSBJRCAoZW50cnkpIHRvIHRoaXMgUlRBLiBUaGUgSUQgbnVtYmVyIGlzIGltcGxpY2l0IGFzCisgICAgICAqKiB0aGUgb2Zmc2V0IGludG8gdGhlIHRhYmxlLiBJdCBpcyB3b3J0aCBub3RpbmcgYXQgdGhpcyBzdGFnZQorICAgICAgKiogdGhhdCBvZmZzZXQgemVybyBpbiB0aGUgdGFibGUgY29udGFpbnMgdGhlIGVudHJpZXMgZm9yIHRoZQorICAgICAgKiogUlRBIHdpdGggSUQgMSEhISEKKyAgICAgICovCisgICAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9BTExPQ0FURTsKKyAgICAgIFBrdFJlcGx5UC0+SUROdW0gICA9IFRoaXNVbml0KzE7CisgICAgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorICAgICAgeworICAgICAgICBpZiAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UpCisJICAgIC8qCisJICAgICoqIEFkanVzdCB0aGUgcGhiIGFuZCB0eCBwa3QgZGVzdF91bml0cyBmb3IgMm5kIGJsb2NrIG9mIDgKKwkgICAgKiogb25seSBpZiB0aGUgUlRBIGhhcyBwb3J0cyBhc3NvY2lhdGVkIChTTE9UX0lOX1VTRSkKKwkgICAgKi8KKwkgICAgUklPRml4UGhicyhwLCBIb3N0UCwgVGhpc1VuaXQyKTsKKwkgICAgUGt0UmVwbHlQLT5JRE51bTIgID0gVGhpc1VuaXQyKzE7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSVEEgJyVzJyBoYXMgYmVlbiBhbGxvY2F0ZWQgSURzICVkKyVkXG4iLAorCSAgICAgICAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uTmFtZSwgUGt0UmVwbHlQLT5JRE51bSwgUGt0UmVwbHlQLT5JRE51bTIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCSAgICBQa3RSZXBseVAtPklETnVtMiA9IFJPVVRFX05PX0lEOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUlRBICclcycgaGFzIGJlZW4gYWxsb2NhdGVkIElEICVkXG4iLAorCSAgICAgICAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uTmFtZSxQa3RSZXBseVAtPklETnVtKTsKKyAgICAgIH0KKyAgICAgIEhvc3RQLT5Db3B5KCJSVF9BTExPQ0FUIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDEwKTsKKworICAgICAgUklPUXVldWVDbWRCbGsoIEhvc3RQLCBSdXAsIENtZEJsa1ApOworCisgICAgICAvKgorICAgICAgKiogSWYgdGhpcyBpcyBhIGZyZXNobHkgYm9vdGVkIFJUQSwgdGhlbiB3ZSBuZWVkIHRvIHJlLW9wZW4KKyAgICAgICoqIHRoZSBwb3J0cywgaWYgYW55IHdoZXJlIG9wZW4sIHNvIHRoYXQgZGF0YSBtYXkgb25jZSBtb3JlCisgICAgICAqKiBmbG93IGFyb3VuZCB0aGUgc3lzdGVtIQorICAgICAgKi8KKyAgICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFJUQV9ORVdCT09UKSAmJgorCSAgIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydCAhPSBOT19QT1JUKSApCisgICAgICB7CisJLyoKKwkqKiBsb29rIGF0IHRoZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBiZWFzdCBhbmQKKwkqKiBzZWUgaWYgYW55IHdoZXJlIG9wZW4uIElmIHRoZXkgd2FzLCB0aGVuIHJlLW9wZW4KKwkqKiB0aGVtLCB1c2luZyB0aGUgaW5mbyBmcm9tIHRoZSB0dHkgZmxhZ3MuCisJKi8KKwlmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX1JUQTsgcG9ydCsrICkKKwl7CisJICBQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdOworCSAgaWYgKCBQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19MT1BFTikgKQorCSAgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUmUtb3BlbmVkIHRoaXMgcG9ydFxuIik7CisJICAgIHJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTUFHSUNfUkVCT09UOworCSAgICByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkgIH0KKwl9CisJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwl7CisJICBmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX1JUQTsgcG9ydCsrICkKKwkgIHsKKwkgICAgUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF07CisJICAgIGlmICggUG9ydFAtPlN0YXRlICYgKFJJT19NT1BFTnxSSU9fTE9QRU4pICkKKwkgICAgeworCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSZS1vcGVuZWQgdGhpcyBwb3J0XG4iKTsKKwkgICAgICByaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJICAgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTUFHSUNfUkVCT09UOworCSAgICAgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorCisgICAgICAvKgorICAgICAgKioga2VlcCBhIGNvcHkgb2YgdGhlIG1vZHVsZSB0eXBlcyEKKyAgICAgICovCisgICAgICBIb3N0UC0+VW5peFJ1cHNbVGhpc1VuaXRdLk1vZFR5cGVzID0gTW9kOworICAgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwkgICAgICBIb3N0UC0+VW5peFJ1cHNbVGhpc1VuaXQyXS5Nb2RUeXBlcyA9IE1vZDsKKworICAgICAgLyoKKyAgICAgICoqIElmIGVpdGhlciBvZiB0aGUgbW9kdWxlcyBvbiB0aGlzIHVuaXQgaXMgcmVhZC1vbmx5IG9yIHdyaXRlLW9ubHkKKyAgICAgICoqIG9yIG5vbmUteHByaW50LCB0aGVuIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhhdCBpbmZvIG92ZXIgdG8gdGhlCisgICAgICAqKiByZWxldmFudCBwb3J0cy4KKyAgICAgICovCisgICAgICBpZiAoIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0ICE9IE5PX1BPUlQgKQorICAgICAgeworICAgICAgICBmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX01PRFVMRTsgcG9ydCsrICkKKwl7CisJICBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyB8PQorCSAgIHAtPlJJT01vZHVsZVR5cGVzW01vZDFdLkZsYWdzW3BvcnRdOworCSAgcC0+UklPUG9ydHBbcG9ydCtQT1JUU19QRVJfTU9EVUxFK0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgcC0+UklPUG9ydHBbcG9ydCtQT1JUU19QRVJfTU9EVUxFK0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW01vZDJdLkZsYWdzW3BvcnRdOworCX0KKwlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCXsKKyAgICAgICAgICBmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX01PRFVMRTsgcG9ydCsrICkKKwkgIHsKKwkgICAgcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdLT5Db25maWcgJj0gflJJT19OT01BU0s7CisJICAgIHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW01vZDFdLkZsYWdzW3BvcnRdOworCSAgICBwLT5SSU9Qb3J0cFtwb3J0K1BPUlRTX1BFUl9NT0RVTEUrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgICBwLT5SSU9Qb3J0cFtwb3J0K1BPUlRTX1BFUl9NT0RVTEUrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW01vZDJdLkZsYWdzW3BvcnRdOworICAgICAgICAgIH0KKwl9CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBKb2IgZG9uZSwgZ2V0IG9uIHdpdGggdGhlIGludGVycnVwdHMhCisgICAgICAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIC8qCisgICoqIFRoZXJlIGlzIG5vIHRhYmxlIGVudHJ5IGZvciB0aGlzIFJUQSBhdCBhbGwuCisgICoqCisgICoqIExldHMgY2hlY2sgdG8gc2VlIGlmIHdlIGFjdHVhbGx5IGJvb3RlZCB0aGlzIHVuaXQgLSBpZiBub3QsCisgICoqIHRoZW4gd2UgcmVzZXQgaXQgYW5kIGl0IHdpbGwgZ28gcm91bmQgdGhlIGxvb3Agb2YgYmVpbmcgYm9vdGVkCisgICoqIHdlIGNhbiB0aGVuIHdvcnJ5IGFib3V0IHRyeWluZyB0byBmaXQgaXQgaW50byB0aGUgdGFibGUuCisgICovCisgIGZvciAoIFRoaXNVbml0PTA7IFRoaXNVbml0PEhvc3RQLT5OdW1FeHRyYUJvb3RlZDsgVGhpc1VuaXQrKyApCisgICAgaWYgKCBIb3N0UC0+RXh0cmFVbml0c1tUaGlzVW5pdF0gPT0gUnRhVW5pcSApCisgICAgICBicmVhazsKKyAgaWYgKCBUaGlzVW5pdCA9PSBIb3N0UC0+TnVtRXh0cmFCb290ZWQgJiYgVGhpc1VuaXQgIT0gTUFYX0VYVFJBX1VOSVRTICkKKyAgeworICAgIC8qCisgICAgKiogaWYgdGhlIHVuaXQgd2Fzbid0IGluIHRoZSB0YWJsZSwgYW5kIHRoZSB0YWJsZSB3YXNuJ3QgZnVsbCwgdGhlbgorICAgICoqIHdlIHJlc2V0IHRoZSB1bml0LCBiZWNhdXNlIHdlIGRpZG4ndCBib290IGl0LgorICAgICoqIEhvd2V2ZXIsIGlmIHRoZSB0YWJsZSBpcyBmdWxsLCBpdCBjb3VsZCBiZSB0aGF0IHdlIGRpZCBib290CisgICAgKiogdGhpcyB1bml0LCBhbmQgc28gd2Ugd29uJ3QgcmVib290IGl0LCBiZWNhdXNlIGl0IGlzbid0IHJlYWxseQorICAgICoqIGFsbCB0aGF0IGRpc2FzdGVyb3VzIHRvIGtlZXAgdGhlIG9sZCBiaW5zIGluIG1vc3QgY2FzZXMuIFRoaXMKKyAgICAqKiBpcyBhIHJhdGhlciB0YWNreSBmZWF0dXJlLCBidXQgd2UgYXJlIG9uIHRoZSBlZGdlIG9mIHJlYWxsaXR5CisgICAgKiogaGVyZSwgYmVjYXVzZSB0aGUgaW1wbGljYXRpb24gaXMgdGhhdCBzb21lb25lIGhhcyBjb25uZWN0ZWQKKyAgICAqKiAxNitNQVhfRVhUUkFfVU5JVFMgb250byBvbmUgaG9zdC4KKyAgICAqLworICAgIHN0YXRpYyBpbnQgVW5rbm93bk1lc2dEb25lID0gMDsKKworICAgIGlmICggIVVua25vd25NZXNnRG9uZSApCisgICAgeworCWlmICghIHAtPlJJT05vTWVzc2FnZSkKKwkgICAgY3ByaW50ZigiT25lIG9yIG1vcmUgdW5rbm93biBSVEFzIGFyZSBiZWluZyB1cGRhdGVkLlxuIik7CisJVW5rbm93bk1lc2dEb25lID0gMTsKKyAgICB9CisKKyAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9GT0FEOworICAgIEhvc3RQLT5Db3B5KCJSVF9GT0FEIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDcpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qCisgICAgKiogd2UgZGlkIGJvb3QgaXQgKGFzIGFuIGV4dHJhKSwgYW5kIHRoZXJlIG1heSBub3cgYmUgYSB0YWJsZQorICAgICoqIHNsb3QgZnJlZSAoYmVjYXVzZSBvZiBhIGRlbGV0ZSksIHNvIHdlIHdpbGwgdHJ5IHRvIG1ha2UKKyAgICAqKiBhIHRlbnRhdGl2ZSBlbnRyeSBmb3IgaXQsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyYXRvciBjYW4gc2VlIGl0CisgICAgKiogYW5kIGZpbGwgaW4gdGhlIGRldGFpbHMgZm9yIHVzLgorICAgICovCisgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKyAgICB7CisJaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZUaGlzVW5pdCwgJlRoaXNVbml0MikgPT0gMCkKKwl7CisJICAgIFJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBUaGlzVW5pdCk7CisJICAgIEZpbGxTbG90KFRoaXNVbml0LCBUaGlzVW5pdDIsIFJ0YVVuaXEsIEhvc3RQKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZUaGlzVW5pdCwgTlVMTCkgPT0gMCkKKwl7CisJICAgIFJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBUaGlzVW5pdCk7CisJICAgIEZpbGxTbG90KFRoaXNVbml0LCAwLCBSdGFVbmlxLCBIb3N0UCk7CisJfQorICAgIH0KKyAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9VU0VEOworICAgIEhvc3RQLT5Db3B5KCJSVF9VU0VEIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDcpOworICB9CisgIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKwordm9pZAorUklPRml4UGhicyhwLCBIb3N0UCwgdW5pdCkKK3N0cnVjdCByaW9faW5mbyAqcDsKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK3VpbnQgdW5pdDsKK3sKKwl1c2hvcnQJCQlsaW5rLCBwb3J0OworCXN0cnVjdCBQb3J0CQkqUG9ydFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgUG9ydE4gPSBIb3N0UC0+TWFwcGluZ1t1bml0XS5TeXNQb3J0OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0ZpeFBoYnMgdW5pdCAlZCBzeXNwb3J0ICVkXG4iLCB1bml0LCBQb3J0Tik7CisKKwlpZiAoUG9ydE4gIT0gLTEpIHsKKwkJdXNob3J0CQlkZXN0X3VuaXQgPSBIb3N0UC0+TWFwcGluZ1t1bml0XS5JRDI7CisKKwkJLyoKKwkJKiogR2V0IHRoZSBsaW5rIG51bWJlciB1c2VkIGZvciB0aGUgMXN0IDggcGhicyBvbiB0aGlzIHVuaXQuCisJCSovCisJCVBvcnRQID0gcC0+UklPUG9ydHBbSG9zdFAtPk1hcHBpbmdbZGVzdF91bml0IC0gMV0uU3lzUG9ydF07CisKKwkJbGluayA9IFJXT1JEKFBvcnRQLT5QaGJQLT5saW5rKTsKKworCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUE9SVFNfUEVSX1JUQTsgcG9ydCsrLCBQb3J0TisrKSB7CisJCQl1c2hvcnQJCWRlc3RfcG9ydCA9IHBvcnQgKyA4OworI2lmIDAKKwkJCXVpbnQJCVBrdEludDsKKyNlbmRpZgorCQkJV09SRAkJKlR4UGt0UDsKKwkJCVBLVAkJKlBrdDsKKworCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtQb3J0Tl07CisKKwkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCS8qCisJCQkqKiBJZiBSVEEgaXMgbm90IHBvd2VyZWQgb24sIHRoZSB0eCBwYWNrZXRzIHdpbGwgYmUKKwkJCSoqIHVuc2V0LCBzbyBnbyBubyBmdXJ0aGVyLgorCQkJKi8KKwkJCWlmIChQb3J0UC0+VHhTdGFydCA9PSAwKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJUeCBwa3RzIG5vdCBzZXQgdXAgeWV0XG4iKTsKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJKiogRm9yIHRoZSBzZWNvbmQgc2xvdCBvZiBhIDE2IHBvcnQgUlRBLCB0aGUgZHJpdmVyIG5lZWRzIHRvCisJCQkqKiBzb3J0IG91dCB0aGUgcGhiIHRvIHBvcnQgbWFwcGluZ3MuIFRoZSBkZXN0X3VuaXQgZm9yIHRoaXMKKwkJCSoqIGdyb3VwIG9mIDggcGhicyBpcyBzZXQgdG8gdGhlIGRlc3RfdW5pdCBvZiB0aGUgYWNjb21wYW55aW5nCisJCQkqKiA4IHBvcnQgYmxvY2suIFRoZSBkZXN0X3BvcnQgb2YgdGhlIHNlY29uZCB1bml0IGlzIHNldCB0bworCQkJKiogYmUgaW4gdGhlIHJhbmdlIDgtMTUgKGkuZS4gOCBpcyBhZGRlZCkuIFRodXMsIGZvciBhIDE2IHBvcnQKKwkJCSoqIFJUQSB3aXRoIElEcyA1IGFuZCA2LCB0cmFmZmljIGJvdW5kIGZvciBwb3J0IDYgb2YgdW5pdCA2CisJCQkqKiAoYmVpbmcgdGhlIHNlY29uZCBtYXAgSUQpIHdpbGwgYmUgc2VudCB0byBkZXN0X3VuaXQgNSwgcG9ydAorCQkJKiogMTQuIFdoZW4gdGhpcyBSVEEgaXMgZGVsZXRlZCwgZGVzdF91bml0IGZvciBJRCA2IHdpbGwgYmUKKwkJCSoqIHJlc3RvcmVkLCBhbmQgdGhlIGRlc3RfcG9ydCB3aWxsIGJlIHJlZHVjZWQgYnkgOC4KKwkJCSoqIFRyYW5zbWl0IHBhY2tldHMgYWxzbyBoYXZlIGEgZGVzdGluYXRpb24gZmllbGQgd2hpY2ggbmVlZHMKKwkJCSoqIGFkanVzdGluZyBpbiB0aGUgc2FtZSBtYW5uZXIuCisJCQkqKiBOb3RlIHRoYXQgdGhlIHVuaXQvcG9ydCBieXRlcyBpbiAnZGVzdCcgYXJlIHN3YXBwZWQuCisJCQkqKiBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSBwaGIgYW5kIHJ1cCBsaW5rIG51bWJlcnMgZm9yIHRoZQorCQkJKiogc2Vjb25kIGJsb2NrIG9mIDggdHR5cy4KKwkJCSovCisJCQlmb3IgKFR4UGt0UCA9IFBvcnRQLT5UeFN0YXJ0OyBUeFBrdFAgPD0gUG9ydFAtPlR4RW5kOyBUeFBrdFArKykgeworCQkJCS8qCisJCQkJKiogKlR4UGt0UCBpcyB0aGUgcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgcGFja2V0IG9uIHRoZSBob3N0CisJCQkJKiogY2FyZC4gVGhpcyBuZWVkcyB0byBiZSB0cmFuc2xhdGVkIGludG8gYSAzMiBiaXQgcG9pbnRlcgorCQkJCSoqIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBkcml2ZXIuCisJCQkJKi8KKwkJCQlQa3QgPSAoUEtUICopIFJJT19QVFIoSG9zdFAtPkNhZGRyLFJJTkRXKFR4UGt0UCkpOworCisJCQkJLyoKKwkJCQkqKiBJZiB0aGUgcGFja2V0IGlzIHVzZWQsIHJlc2V0IGl0LgorCQkJCSovCisJCQkJUGt0ID0gKFBLVCAqKSgodWludClQa3QgJiB+UEtUX0lOX1VTRSk7CisJCQkJV0JZVEUoUGt0LT5kZXN0X3VuaXQsIGRlc3RfdW5pdCk7CisJCQkJV0JZVEUoUGt0LT5kZXN0X3BvcnQsIGRlc3RfcG9ydCk7CisJCQl9CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAicGhiIGRlc3Q6IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsCisJCQkJCVJXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbikgJiAweGZmLAorCQkJCQkoUldPUkQoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uKSA+PiA4KSAmIDB4ZmYsCisJCQkJCWRlc3RfdW5pdCwgZGVzdF9wb3J0KTsKKwkJCVdXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiwgZGVzdF91bml0ICsgKGRlc3RfcG9ydCA8PCA4KSk7CisJCQlXV09SRChQb3J0UC0+UGhiUC0+bGluaywgbGluayk7CisKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQl9CisJCS8qCisJCSoqIE5vdyBtYWtlIHN1cmUgdGhlIHJhbmdlIG9mIHBvcnRzIHRvIGJlIHNlcnZpY2VkIGluY2x1ZGVzCisJCSoqIHRoZSAybmQgOCBvbiB0aGlzIDE2IHBvcnQgUlRBLgorCQkqLworCQlpZiAobGluayA+IDMpIHJldHVybjsKKwkJaWYgKCgodW5pdCAqIDgpICsgNykgPiBSV09SRChIb3N0UC0+TGlua1N0clBbbGlua10ubGFzdF9wb3J0KSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgImxhc3QgcG9ydCBvbiBob3N0IGxpbmsgJWQ6ICVkXG4iLCBsaW5rLCAodW5pdCAqIDgpICsgNyk7CisJCQlXV09SRChIb3N0UC0+TGlua1N0clBbbGlua10ubGFzdF9wb3J0LCAodW5pdCAqIDgpICsgNyk7CisJCX0KKwl9Cit9CisKKy8qCisqKiBDaGVjayB0byBzZWUgaWYgdGhlIG5ldyBkaXNjb25uZWN0aW9uIGhhcyBpc29sYXRlZCB0aGlzIHVuaXQuCisqKiBJZiBpdCBoYXMsIHRoZW4gaW52YWxpZGF0ZSBhbGwgaXRzIGxpbmsgaW5mb3JtYXRpb24sIGFuZCB0ZWxsCisqKiB0aGUgd29ybGQgYWJvdXQgaXQuIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdG9yCisqKiBvbmx5IGdldHMgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGdvaW5nIG9uLgorKi8KK3N0YXRpYyBpbnQKK1JJT0NoZWNrSXNvbGF0ZWQocCwgSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7Cit1aW50IFVuaXRJZDsKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tVbml0SWQoIFVuaXRJZCApOworI2VuZGlmCisJaWYgKCBSSU9DaGVjayggSG9zdFAsIFVuaXRJZCApICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCAlZCBpcyBOT1QgaXNvbGF0ZWRcbiIsIFVuaXRJZCk7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZIb3N0UC0+SG9zdExvY2ssIGZsYWdzKTsKKwkJcmV0dXJuKDApOworCX0KKworCVJJT0lzb2xhdGUocCwgSG9zdFAsIFVuaXRJZCApOworCVJJT1NldENoYW5nZShwKTsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisqKiBJbnZhbGlkYXRlIGFsbCB0aGUgbGluayBpbnRlcmNvbm5lY3Rpdml0eSBvZiB0aGlzIHVuaXQsIGFuZCBvZgorKiogYWxsIHRoZSB1bml0cyBhdHRhY2hlZCB0byBpdC4gVGhpcyB3aWxsIG1lYW4gdGhhdCB0aGUgZW50aXJlCisqKiBzdWJuZXQgd2lsbCByZS1pbnRyb2R1Y2UgaXRzZWxmLgorKi8KK3N0YXRpYyBpbnQKK1JJT0lzb2xhdGUocCwgSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqCQlIb3N0UDsKK3VpbnQgVW5pdElkOyAKK3sKKwl1aW50IGxpbmssIHVuaXQ7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tVbml0SWQoIFVuaXRJZCApOworI2VuZGlmCisJVW5pdElkLS07CQkvKiB0aGlzIHRyaWNrIHJlbGllcyBvbiB0aGUgVW5pdCBJZCBiZWluZyBVTlNJR05FRCEgKi8KKworCWlmICggVW5pdElkID49IE1BWF9SVVAgKQkvKiBkb250Y2hhIGp1c3QgbHVydiB1bnNpZ25lZCBtYXRocyEgKi8KKwkJcmV0dXJuKDApOworCisJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFICkKKwkJcmV0dXJuKDApOworCisJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyB8PSBCRUVOX0hFUkU7CisKKwlpZiAoIHAtPlJJT1ByaW50RGlzYWJsZWQgPT0gRE9fUFJJTlQgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUklPTWVzZ0lzb2xhdGVkICVzIiwgSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lKTsKKworCWZvciAoIGxpbms9MDsgbGluazxMSU5LU19QRVJfVU5JVDsgbGluaysrKSB7CisJCXVuaXQgPSBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQ7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uTGluayA9IE5PX0xJTks7CisJCVJJT0lzb2xhdGUocCwgSG9zdFAsIHVuaXQgKTsKKwl9CisJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmPSB+QkVFTl9IRVJFOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitSSU9DaGVjayhIb3N0UCwgVW5pdElkKQorc3RydWN0IEhvc3QgKkhvc3RQOwordWludCBVbml0SWQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgbGluazsKKworI2lmZGVmIENIRUNLCisJQ2hlY2tIb3N0UCggSG9zdFAgKTsKKwlDaGVja1VuaXRJZCggVW5pdElkICk7CisjZW5kaWYKKy8qIAlyaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJDaGVjayB0byBzZWUgaWYgdW5pdCAlZCBoYXMgYSByb3V0ZSB0byB0aGUgaG9zdFxuIixVbml0SWQpKTsgKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUklPQ2hlY2sgOiBVbml0SUQgPSAlZFxuIiwgVW5pdElkKTsKKworCWlmICggVW5pdElkID09IEhPU1RfSUQgKSB7CisJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgaXMgTk9UIGlzb2xhdGVkIC0gaXQgSVMgdGhlIGhvc3QhXG4iLCBVbml0SWQpKTsgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJVW5pdElkLS07CisKKwlpZiAoIFVuaXRJZCA+PSBNQVhfUlVQICkgeworCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIC0gaWdub3JlZC5cbiIsIFVuaXRJZCkpOyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKCBsaW5rPTA7IGxpbms8TElOS1NfUEVSX1VOSVQ7IGxpbmsrKyApIHsKKwkJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQ9PUhPU1RfSUQgKSB7CisJCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGlzIGNvbm5lY3RlZCBkaXJlY3RseSB0byBob3N0IHZpYSBsaW5rICglYykuXG4iLCAKKwkJCQkJCVVuaXRJZCwgJ0EnK2xpbmspKTsgKi8KKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFICkgeworCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJCZWVuIHRvIFVuaXQgJWQgYmVmb3JlIC0gaWdub3JpbmdcbiIsIFVuaXRJZCkpOyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzIHw9IEJFRU5fSEVSRTsKKworCWZvciAoIGxpbms9MDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgY2hlY2sgbGluayAoJWMpXG4iLCBVbml0SWQsJ0EnK2xpbmspKTsgKi8KKwkJaWYgKCBSSU9DaGVjayggSG9zdFAsIEhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uVW5pdCApICkgeworCQkJLyogcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiVW5pdCAlZCBpcyBjb25uZWN0ZWQgdG8gc29tZXRoaW5nIHRoYXQga25vd3MgdGhlIGhvc3QgdmlhIGxpbmsgKCVjKVxuIiwgVW5pdElkLGxpbmsrJ0EnKSk7ICovCisJCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICY9IH5CRUVOX0hFUkU7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uRmxhZ3MgJj0gfkJFRU5fSEVSRTsKKworCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgRE9FU05UIEtOT1cgVEhFIEhPU1QhXG4iLCBVbml0SWQpKTsgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIFJldHVybnMgdGhlIHR5cGUgb2YgdW5pdCAoaG9zdCwgMTYvOCBwb3J0IFJUQSkKKyovCisKK3VpbnQKK0dldFVuaXRUeXBlKFVuaXEpCit1aW50IFVuaXE7Cit7CisJc3dpdGNoICggKFVuaXEgPj4gMjgpICYgMHhmKQorCXsKKwkJY2FzZSBSSU9fQVQ6CisJCWNhc2UgUklPX01DQToKKwkJY2FzZSBSSU9fRUlTQToKKwkJY2FzZSBSSU9fUENJOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgdHlwZTogSG9zdFxuIik7CisJCQlyZXR1cm4oVFlQRV9IT1NUKTsKKwkJY2FzZSBSSU9fUlRBXzE2OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgdHlwZTogMTYgcG9ydCBSVEFcbiIpOworCQkJcmV0dXJuKFRZUEVfUlRBMTYpOworCQljYXNlIFJJT19SVEE6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiA4IHBvcnQgUlRBXG4iKTsKKwkJCXJldHVybihUWVBFX1JUQTgpOworCQlkZWZhdWx0IDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IFVucmVjb2duaXNlZFxuIik7CisJCQlyZXR1cm4oOTkpOworCX0KK30KKworaW50CitSSU9TZXRDaGFuZ2UocCkKK3N0cnVjdCByaW9faW5mbyAqCXA7Cit7CisJaWYgKCBwLT5SSU9RdWlja0NoZWNrICE9IE5PVF9DSEFOR0VEICkKKwkJcmV0dXJuKDApOworCXAtPlJJT1F1aWNrQ2hlY2sgPSBDSEFOR0VEOworCWlmICggcC0+UklPU2lnbmFsUHJvY2VzcyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNlbmQgU0lHLUhVUCIpOworCQkvKgorCQlwc2lnbmFsKCBSSU9TaWduYWxQcm9jZXNzLCBTSUdIVVAgKTsKKwkJKi8KKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZAorUklPQ29uQ29uKHAsIEhvc3RQLCBGcm9tSWQsIEZyb21MaW5rLCBUb0lkLCBUb0xpbmssIENoYW5nZSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7Cit1aW50IEZyb21JZDsKK3VpbnQgRnJvbUxpbms7Cit1aW50IFRvSWQ7Cit1aW50IFRvTGluazsKK2ludCBDaGFuZ2U7IAoreworICAgIGNoYXIgKkZyb21OYW1lOworICAgIGNoYXIgKkZyb21UeXBlOworICAgIGNoYXIgKlRvTmFtZTsKKyAgICBjaGFyICpUb1R5cGU7CisgICAgdW5zaWduZWQgaW50IHRwOworCisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NTkKKyoqIChQYXJ0KSBmaXggZm9yIHBvcnQgYmVpbmcgdHJhc2hlZCB3aGVuIG9wZW5lZCB3aGlsc3QgUlRBICJkaXNjb25uZWN0ZWQiCisqKgorKiogV2hhdCdzIHRoaXMgZG9pbmcgaW4gaGVyZSBhbnl3YXkgPworKiogSXQgd2FzIGNhdXNpbmcgdGhlIHBvcnQgdG8gYmUgJ3VubWFwcGVkJyBpZiBvcGVuZWQgd2hpbHN0IFJUQSAiZGlzY29ubmVjdGVkIgorKioKKyoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IC0gcGFydCBmaXgKKyoqIE9rYXksIFdlJ3ZlIGZvdW5kIG91dCB3aGF0IHRoaXMgd2FzIGFsbCBhYm91dCBub3cgIQorKiogU29tZW9uZSBoYWQgYm90Y2hlZCB0aGlzIHRvIHVzZSBSSU9IYWx0ZWQgdG8gaW5kaWNhdGVkIHRoZSBudW1iZXIgb2YgUlRBcworKiogJ2Rpc2Nvbm5lY3RlZCcuIFRoZSB2YWx1ZSBpbiBSSU9IYWx0ZWQgd2FzIHRoZW4gYmVpbmcgdXNlZCBpbiB0aGUKKyoqICdSSU9fUVVJQ0tfQ0hFQ0snIGlvY3RsLiBBIG5vbmUgemVybyB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgYSBsZWFzdCBvbmUgUlRBCisqKiBpcyAnZGlzY29ubmVjdGVkJy4gVGhlIGNoYW5nZSB3YXMgcHV0IGluIHRvIHNhdGlzZnkgYSBjdXN0b21lcidzIG5lZWRzLgorKiogSGF2aW5nIHRha2VuIHRoaXMgYml0IG9mIGNvZGUgb3V0ICdSSU9fUVVJQ0tfQ0hFQ0snIG5vdyBubyBsb25nZXIgd29ya3MgZm9yCisqKiB0aGUgY3VzdG9tZXIuCisqKgorICAgIGlmIChDaGFuZ2UgPT0gQ09OTkVDVCkgeworCQlpZiAocC0+UklPSGFsdGVkKSBwLT5SSU9IYWx0ZWQgLS07CisJIH0KKwkgZWxzZSB7CisJCXAtPlJJT0hhbHRlZCArKzsKKwkgfQorKioKKyoqIFNvIC0gd2UgbmVlZCB0byBpbXBsZW1lbnQgaXQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgLSBhIG5ldyBtZW1iZXIgb2YgdGhlCisqKiByaW9faW5mbyBzdHJ1Y3QgLSBSSU9SdGFEaXNDb25zIChSSU8gUlRBIGNvbm5lY3Rpb25zKSBrZWVwcyB0cmFjayBvZiBSVEEKKyoqIGNvbm5lY3Rpb25zIGFuZCBkaXNjb25uZWN0aW9ucy4gCisqLworICAgIGlmIChDaGFuZ2UgPT0gQ09OTkVDVCkgeworCQlpZiAocC0+UklPUnRhRGlzQ29ucykgcC0+UklPUnRhRGlzQ29ucy0tOworCSB9CisJIGVsc2UgeworCQlwLT5SSU9SdGFEaXNDb25zKys7CisJIH0KKworICAgIGlmICggcC0+UklPUHJpbnREaXNhYmxlZCA9PSBET05UX1BSSU5UICkKKwkJcmV0dXJuOworCisgICAgaWYgKCBGcm9tSWQgPiBUb0lkICkgeworCQl0cCA9IEZyb21JZDsKKwkJRnJvbUlkID0gVG9JZDsKKwkJVG9JZCA9IHRwOworCQl0cCA9IEZyb21MaW5rOworCQlGcm9tTGluayA9IFRvTGluazsKKwkJVG9MaW5rID0gdHA7CisgICAgfQorCisgICAgRnJvbU5hbWUgPSBGcm9tSWQgPyBIb3N0UC0+TWFwcGluZ1tGcm9tSWQtMV0uTmFtZSA6IEhvc3RQLT5OYW1lOworICAgIEZyb21UeXBlID0gRnJvbUlkID8gIlJUQSIgOiAiSE9TVCI7CisgICAgVG9OYW1lID0gVG9JZCA/IEhvc3RQLT5NYXBwaW5nW1RvSWQtMV0uTmFtZSA6IEhvc3RQLT5OYW1lOworICAgIFRvVHlwZSA9IFRvSWQgPyAiUlRBIiA6ICJIT1NUIjsKKworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJMaW5rIGJldHdlZW4gJXMgJyVzJyAoJWMpIGFuZCAlcyAnJXMnICglYykgJXMuXG4iLAorCQkJICAgIEZyb21UeXBlLCBGcm9tTmFtZSwgJ0EnK0Zyb21MaW5rLAorCQkJICAgIFRvVHlwZSwgICBUb05hbWUsICAgJ0EnK1RvTGluaywKKwkJCSAgICAoQ2hhbmdlPT1DT05ORUNUKSA/ICJlc3RhYmxpc2hlZCIgOiAiZGlzY29ubmVjdGVkIik7CisgICAgY3ByaW50ZigiTGluayBiZXR3ZWVuICVzICclcycgKCVjKSBhbmQgJXMgJyVzJyAoJWMpICVzLlxuIiwKKwkJCSAgICBGcm9tVHlwZSwgRnJvbU5hbWUsICdBJytGcm9tTGluaywKKwkJCSAgICBUb1R5cGUsICAgVG9OYW1lLCAgICdBJytUb0xpbmssCisJCQkgICAgKENoYW5nZT09Q09OTkVDVCkgPyAiZXN0YWJsaXNoZWQiIDogImRpc2Nvbm5lY3RlZCIpOworfQorCisvKgorKiogUklPUmVtb3ZlRnJvbVNhdmVkVGFibGUgOgorKioKKyoqIERlbGV0ZSBhbmQgUlRBIGVudHJ5IGZyb20gdGhlIHNhdmVkIHRhYmxlIGdpdmVuIHRvIHVzCisqKiBieSB0aGUgY29uZmlndXJhdGlvbiBwcm9ncmFtLgorKi8KK3N0YXRpYyBpbnQKK1JJT1JlbW92ZUZyb21TYXZlZFRhYmxlKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IE1hcCAqcE1hcCkKK3sKKyAgICBpbnQJCWVudHJ5OworCisgICAgLyoKKyAgICAqKiBXZSBsb29wIGZvciBhbGwgZW50cmllcyBldmVuIGFmdGVyIGZpbmRpbmcgYW4gZW50cnkgYW5kCisgICAgKiogemVyb2luZyBpdCBiZWNhdXNlIHdlIG1heSBoYXZlIHR3byBlbnRyaWVzIHRvIGRlbGV0ZSBpZgorICAgICoqIGl0J3MgYSAxNiBwb3J0IFJUQS4KKyAgICAqLworICAgIGZvciAoZW50cnkgPSAwOyBlbnRyeSA8IFRPVEFMX01BUF9FTlRSSUVTOyBlbnRyeSsrKQorICAgIHsKKwlpZiAocC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IHBNYXAtPlJ0YVVuaXF1ZU51bSkKKwl7CisJICAgIGJ6ZXJvKChjYWRkcl90KSZwLT5SSU9TYXZlZFRhYmxlW2VudHJ5XSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qCisqKiBSSU9DaGVja0Rpc2Nvbm5lY3RlZCA6CisqKgorKiogU2NhbiB0aGUgdW5pdCBsaW5rcyB0byBhbmQgcmV0dXJuIHplcm8gaWYgdGhlIHVuaXQgaXMgY29tcGxldGVseQorKiogZGlzY29ubmVjdGVkLgorKi8KK3N0YXRpYyBpbnQKK1JJT0ZyZWVEaXNjb25uZWN0ZWQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIGludCB1bml0KQoreworICAgIGludAkJbGluazsKKworCisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0ZyZWVEaXNjb25uZWN0IHVuaXQgJWRcbiIsIHVuaXQpOworICAgIC8qCisgICAgKiogSWYgdGhlIHNsb3QgaXMgdGVudGF0aXZlIGFuZCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlCisgICAgKiogc2Vjb25kIGhhbGYgb2YgYSAxNiBwb3J0IFJUQSB0aGVuIHNjYW4gdG8gc2VlIGlmCisgICAgKiogaXMgZGlzY29ubmVjdGVkLgorICAgICovCisgICAgZm9yIChsaW5rID0gMDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKyspCisgICAgeworCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5Ub3BvbG9neVtsaW5rXS5Vbml0ICE9IFJPVVRFX0RJU0NPTk5FQ1QpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIC8qCisgICAgKiogSWYgbm90IGFsbCBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIHRoZW4gd2UgY2FuIGZvcmdldCBhYm91dCBpdC4KKyAgICAqLworICAgIGlmIChsaW5rIDwgTElOS1NfUEVSX1VOSVQpCisJICAgIHJldHVybiAxOworCisjaWYgTkVFRF9UT19GSVhfVEhJUworICAgIC8qIE9rIHNvIGFsbCB0aGUgbGlua3MgYXJlIGRpc2Nvbm5lY3RlZC4gQnV0IHdlIG1heSBoYXZlIG9ubHkganVzdAorICAgICoqIG1hZGUgdGhpcyBzbG90IHRlbnRhdGl2ZSBhbmQgbm90IHlldCByZWNlaXZlZCBhIHRvcG9sb2d5IHVwZGF0ZS4KKyAgICAqKiBMZXRzIGNoZWNrIGhvdyBsb25nIGFnbyB3ZSBtYWRlIGl0IHRlbnRhdGl2ZS4KKyAgICAqLworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJKdXN0IGFib3V0IHRvIGNoZWNrIExCT0xUIG9uIGVudHJ5ICVkXG4iLCB1bml0KTsKKyAgICBpZiAoZHJ2X2dldHBhcm0oTEJPTFQsICh1bG9uZ190ICopICZjdXJyZW50X3RpbWUpKQorICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiZHJ2X2dldHBhcm0oTEJPTFQsLi4uLikgRmFpbGVkLlxuIik7CisKKyAgICBlbGFwc2VfdGltZSA9IGN1cnJlbnRfdGltZSAtIFRlbnRUaW1lW3VuaXRdOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJlbGFwc2UgJWQgPSBjdXJyZW50ICVkIC0gdGVudCAlZCAoJWQgdXNlYylcbiIsCisgICAgICAgIGVsYXBzZV90aW1lLCBjdXJyZW50X3RpbWUsIFRlbnRUaW1lW3VuaXRdLCBkcnZfaHp0b3VzZWMoZWxhcHNlX3RpbWUpKTsKKyAgICBpZiAoZHJ2X2h6dG91c2VjKGVsYXBzZV90aW1lKSA8IFdBSVRfVE9fRklOSVNIKQorICAgIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTa2lwcGluZyBzbG90ICVkLCBub3QgdGltZWQgb3V0IHlldCAlZFxuIiwKKyAgICAgICAgICAgIHVuaXQsIGRydl9oenRvdXNlYyhlbGFwc2VfdGltZSkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgKiogV2UgaGF2ZSBmb3VuZCBhbiB1c2FibGUgc2xvdC4KKyAgICAqKiBJZiBpdCBpcyBoYWxmIG9mIGEgMTYgcG9ydCBSVEEgdGhlbiBkZWxldGUgdGhlIG90aGVyIGhhbGYuCisgICAgKi8KKyAgICBpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyICE9IDApCisgICAgeworCWludCBuT3RoZXIgPSAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyKSAtMTsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSaW9GcmVlZGlzIHNlY29uZCBzbG90ICVkLlxuIiwgbk90aGVyKTsKKwliemVybygoY2FkZHJfdCkmSG9zdFAtPk1hcHBpbmdbbk90aGVyXSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKKyAgICB9CisgICAgUklPUmVtb3ZlRnJvbVNhdmVkVGFibGUocCwgJkhvc3RQLT5NYXBwaW5nW3VuaXRdKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisqKiBSSU9GaW5kRnJlZUlEIDoKKyoqCisqKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIHRoZSBnaXZlbiBob3N0IHRhYmxlIGZvciBlaXRoZXIgb25lCisqKiBvciB0d28gZnJlZSB1bml0IElEJ3MuCisqLworaW50CitSSU9GaW5kRnJlZUlEKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IEhvc3QgKkhvc3RQLCB1aW50ICpwSUQxLCB1aW50ICpwSUQyKQoreworICAgIGludCB1bml0LHRlbXBJRDsKKworICAgIC8qCisgICAgKiogSW5pdGlhbGlzZSB0aGUgSUQncyB0byBNQVhfUlVQLgorICAgICoqIFdlIGRvIHRoaXMgdG8gbWFrZSB0aGUgbG9vcCBmb3Igc2V0dGluZyB0aGUgSUQncyBhcyBzaW1wbGUgYXMKKyAgICAqKiBwb3NzaWJsZS4KKyAgICAqLworICAgICpwSUQxID0gTUFYX1JVUDsKKyAgICBpZiAocElEMiAhPSBOVUxMKQorCSpwSUQyID0gTUFYX1JVUDsKKworICAgIC8qCisgICAgKiogU2NhbiBhbGwgZW50cmllcyBvZiB0aGUgaG9zdCBtYXBwaW5nIHRhYmxlIGZvciBmcmVlIHNsb3RzLgorICAgICoqIFdlIHNjYW4gZm9yIGZyZWUgc2xvdHMgZmlyc3QgYW5kIHRoZW4gaWYgdGhhdCBpcyBub3Qgc3VjY2Vzc2Z1bAorICAgICoqIHdlIHN0YXJ0IGFsbCBvdmVyIGFnYWluIGxvb2tpbmcgZm9yIHRlbnRhdGl2ZSBzbG90cyB3ZSBjYW4gcmUtdXNlLgorICAgICovCisgICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9SVVA7IHVuaXQrKykKKyAgICB7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNjYW5uaW5nIHVuaXQgJWRcbiIsdW5pdCk7CisJLyoKKwkqKiBJZiB0aGUgZmxhZ3MgYXJlIHplcm8gdGhlbiB0aGUgc2xvdCBpcyBlbXB0eS4KKwkqLworCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyA9PSAwKQorCXsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiAgICAgIFRoaXMgc2xvdCBpcyBlbXB0eS5cbiIpOworCSAgICAvKgorCSAgICAqKiBJZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgZmlyc3QgSUQgdGhlbiBkbyBpdCBub3cuCisJICAgICovCisJICAgIGlmICgqcElEMSA9PSBNQVhfUlVQKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNYWtlIHRlbnRhdGl2ZSBlbnRyeSBmb3IgZmlyc3QgdW5pdCAlZFxuIiwgdW5pdCk7CisJCSpwSUQxID0gdW5pdDsKKworCQkvKgorCQkqKiBJZiB0aGUgc2Vjb25kIElEIGlzIG5vdCBuZWVkZWQgdGhlbiB3ZSBjYW4gcmV0dXJuCisJCSoqIG5vdy4KKwkJKi8KKwkJaWYgKHBJRDIgPT0gTlVMTCkKKwkJICAgIHJldHVybiAwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkqKiBBbGxvY2F0ZSB0aGUgc2Vjb25kIHNsb3QgYW5kIHJldHVybi4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1ha2UgdGVudGF0aXZlIGVudHJ5IGZvciBzZWNvbmQgdW5pdCAlZFxuIiwgdW5pdCk7CisJCSpwSUQyID0gdW5pdDsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSBtYW5hZ2UgdG8gY29tZSBvdXQgb2YgdGhlIGZyZWUgc2xvdCBsb29wIHRoZW4gd2UKKyAgICAqKiBuZWVkIHRvIHN0YXJ0IGFsbCBvdmVyIGFnYWluIGxvb2tpbmcgZm9yIHRlbnRhdGl2ZSBzbG90cworICAgICoqIHRoYXQgd2UgY2FuIHJlLXVzZS4KKyAgICAqLworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTdGFydGluZyB0byBzY2FuIGZvciB0ZW50YXRpdmUgc2xvdHNcbiIpOworICAgIGZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfUlVQOyB1bml0KyspCisgICAgeworCWlmICgoKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzICYgU0xPVF9URU5UQVRJVkUpIHx8CisJICAgICAgICAgICAgICAgICAgICAgICAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uRmxhZ3MgPT0gMCkpICAmJiAhIAorCSAgIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UICkpCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiICAgIFNsb3QgJWQgbG9va3MgcHJvbWlzaW5nLlxuIix1bml0KTsKKworCSAgICBpZih1bml0ID09ICpwSUQxKQorCSAgICB7CisJICAgIAlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiICAgIE5vIGl0IGlzbid0LCBpdHMgdGhlIDFzdCBoYWxmXG4iKTsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICAvKgorCSAgICAqKiBTbG90IGlzIFRlbnRhdGl2ZSBvciBFbXB0eSwgYnV0IG5vdCBhIHRlbnRhdGl2ZSBzZWNvbmQgCisJICAgICoqIHNsb3Qgb2YgYSAxNiBwb3J0ZXIuCisJICAgICoqIEF0dGVtcHQgdG8gZnJlZSB1cCB0aGlzIHNsb3QgKGFuZCBpdHMgcGFybnRlciBpZgorCSAgICAqKiBpdCBpcyBhIDE2IHBvcnQgc2xvdC4gVGhlIHNlY29uZCBzbG90IHdpbGwgYmVjb21lCisJICAgICoqIGVtcHR5IGFmdGVyIGEgY2FsbCB0byBSSU9GcmVlRGlzY29ubmVjdGVkIHNvIHRoYXRzIHdoeQorCSAgICAqKiB3ZSBsb29rIGZvciBlbXB0eSBzbG90cyBhYm92ZSAgYXMgd2VsbCkuCisJICAgICovCisJICAgIGlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAhPSAwKSAKKwkgICAgCWlmIChSSU9GcmVlRGlzY29ubmVjdGVkKHAsIEhvc3RQLCB1bml0KSAhPSAwKQorCQkJICAgIGNvbnRpbnVlOworCSAgICAvKgorCSAgICAqKiBJZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgZmlyc3QgSUQgdGhlbiBkbyBpdCBub3cuCisJICAgICovCisJICAgIGlmICgqcElEMSA9PSBNQVhfUlVQKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJHcmFiIHRlbnRhdGl2ZSBlbnRyeSBmb3IgZmlyc3QgdW5pdCAlZFxuIiwgdW5pdCk7CisJCSpwSUQxID0gdW5pdDsKKworCQkvKgorCQkqKiBDbGVhciBvdXQgdGhpcyBzbG90IG5vdyB0aGF0IHdlIGludGVuZCB0byB1c2UgaXQuCisJCSovCisJCWJ6ZXJvKCZIb3N0UC0+TWFwcGluZ1t1bml0XSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKKworCQkvKgorCQkqKiBJZiB0aGUgc2Vjb25kIElEIGlzIG5vdCBuZWVkZWQgdGhlbiB3ZSBjYW4gcmV0dXJuCisJCSoqIG5vdy4KKwkJKi8KKwkJaWYgKHBJRDIgPT0gTlVMTCkKKwkJICAgIHJldHVybiAwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkqKiBBbGxvY2F0ZSB0aGUgc2Vjb25kIHNsb3QgYW5kIHJldHVybi4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkdyYWIgdGVudGF0aXZlL2VtcHR5ICBlbnRyeSBmb3Igc2Vjb25kIHVuaXQgJWRcbiIsCisJCSAgICAgIHVuaXQpOworCQkqcElEMiA9IHVuaXQ7CisKKwkJLyoKKwkJKiogQ2xlYXIgb3V0IHRoaXMgc2xvdCBub3cgdGhhdCB3ZSBpbnRlbmQgdG8gdXNlIGl0LgorCQkqLworCQliemVybygmSG9zdFAtPk1hcHBpbmdbdW5pdF0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisKKwkJLyogQXQgdGhpcyBwb2ludCB1bmRlciB0aGUgcmlnaHQod3Jvbmc/KSBjb25kaXRpb25zCisJCSoqIHdlIG1heSBoYXZlIGEgZmlyc3QgdW5pdCBJRCBiZWluZyBoaWdoZXIgdGhhbiB0aGUKKwkJKiogc2Vjb25kIHVuaXQgSUQuIFRoaXMgaXMgYSBiYWQgaWRlYSBpZiB3ZSBhcmUgYWJvdXQKKwkJKiogdG8gZmlsbCB0aGUgc2xvdHMgd2l0aCBhIDE2IHBvcnQgUlRBLgorCQkqKiBCZXR0ZXIgY2hlY2sgYW5kIHN3YXAgdGhlbSBvdmVyLgorCQkqLworCisJCWlmICgqcElEMSA+ICpwSUQyKQorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU3dhcHBpbmcgSURTICVkICVkXG4iLCAqcElEMSwgKnBJRDIpOworCQkJdGVtcElEID0gKnBJRDE7CisJCQkqcElEMSA9ICpwSUQyOworCQkJKnBJRDIgPSB0ZW1wSUQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSBtYW5hZ2UgdG8gZ2V0IHRvIHRoZSBlbmQgb2YgdGhlIHNlY29uZCBsb29wIHRoZW4gd2UKKyAgICAqKiBjYW4gZ2l2ZSB1cCBhbmQgcmV0dXJuIGEgZmFpbHVyZS4KKyAgICAqLworICAgIHJldHVybiAxOworfQorCisKKy8qCisqKiBUaGUgbGluayBzd2l0Y2ggc2NlbmFyaW8uCisqKgorKiogUnRhIFd1biAoQSkgaXMgY29ubmVjdGVkIHRvIFR1dyAoQSkuCisqKiBUaGUgdGFibGVzIGFyZSBhbGwgdXAgdG8gZGF0ZSwgYW5kIHRoZSBzeXN0ZW0gaXMgT0suCisqKgorKiogSWYgV3VuIChBKSBpcyBub3cgbW92ZWQgdG8gV3VuIChCKSBiZWZvcmUgV3VuIChBKSBjYW4KKyoqIGJlY29tZSBkaXNjb25uZWN0ZWQsIHRoZW4gdGhlIGZvbGxvdyBoYXBwZW5zOgorKioKKyoqIFR1dyAoQSkgc3BvdHMgdGhlIGNoYW5nZSBvZiB1bml0OmxpbmsgYXQgdGhlIG90aGVyIGVuZAorKiogb2YgaXRzIGxpbmsgYW5kIFR1dyBzZW5kcyBhIHRvcG9sb2d5IHBhY2tldCByZWZsZWN0aW5nCisqKiB0aGUgY2hhbmdlOiBUdXcgKEEpIG5vdyBkaXNjb25uZWN0ZWQgZnJvbSBXdW4gKEEpLCBhbmQKKyoqIHRoaXMgaXMgY2xvc2VseSBmb2xsb3dlZCBieSBhIHBhY2tldCBpbmRpY2F0aW5nIHRoYXQgCisqKiBUdXcgKEEpIGlzIG5vdyBjb25uZWN0ZWQgdG8gV3VuIChCKS4KKyoqCisqKiBXdW4gKEIpIHdpbGwgc3BvdCB0aGF0IGl0IGhhcyBub3cgYmVjb21lIGNvbm5lY3RlZCwgYW5kCisqKiBXdW4gd2lsbCBzZW5kIGEgdG9wb2xvZ3kgcGFja2V0LCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorKiogYm90aCBXdW4gKEEpIGFuZCBXdW4gKEIpIGlzIGNvbm5lY3RlZCB0byBUdXcgKEEpLgorKioKKyoqIEV2ZW50dWFsbHkgV3VuIChBKSByZWFsaXNlcyB0aGF0IGl0IGlzIG5vdyBkaXNjb25uZWN0ZWQKKyoqIGFuZCBXdW4gd2lsbCBzZW5kIG91dCBhIHRvcG9sb2d5IHBhY2tldCBpbmRpY2F0aW5nIHRoYXQKKyoqIFd1biAoQSkgaXMgbm93IGRpc2Nvbm5lY3RlZC4KKyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3NwYWNlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMDliMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvc3BhY2UuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvc3BhY2UuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3NwYWNlLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fcmlvc3BhY2VfaF9fCisjZGVmaW5lIF9fcmlvX3Jpb3NwYWNlX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvc3BhY2VfaF9zY2NzXyA9ICJAKCMpcmlvc3BhY2UuaAkxLjIiOworI2VuZGlmCisKKyNkZWZpbmUJUklPX0xPQ0FUT1JfTEVOCTE2CisjZGVmaW5lCU1BWF9SSU9fQk9BUkRTCTQKKworLyoKKyoqIERPTlQgY2hhbmdlIHRoaXMgZmlsZS4gQXQgYWxsLiBVbmxlc3MgeW91IGNhbiByZWJ1aWxkIHRoZSBlbnRpcmUKKyoqIGRldmljZSBkcml2ZXIsIHdoaWNoIHlvdSBwcm9iYWJseSBjYW4ndCwgdGhlbiB0aGUgcmVzdCBvZiB0aGUKKyoqIGRyaXZlciB3b24ndCBzZWUgYW55IGNoYW5nZXMgeW91IG1ha2UgaGVyZS4gU28gZG9uJ3QgbWFrZSBhbnkuCisqKiBJbiBwYXJ0aWN1bGFyLCBpdCB3b24ndCBiZSBhYmxlIHRvIHNlZSBjaGFuZ2VzIHRvIFJJT19TTE9UUworKi8KKworc3RydWN0IENvbmYKK3sKKwljaGFyICAgICAgICAgTG9jYXRvclsyNF07CisJdW5zaWduZWQgaW50IFN0YXJ0dXBUaW1lOworCXVuc2lnbmVkIGludCBTbG93Q29vazsKKwl1bnNpZ25lZCBpbnQgSW50clBvbGxUaW1lOworCXVuc2lnbmVkIGludCBCcmVha0ludGVydmFsOworCXVuc2lnbmVkIGludCBUaW1lcjsKKwl1bnNpZ25lZCBpbnQgUnRhTG9hZEJhc2U7CisJdW5zaWduZWQgaW50IEhvc3RMb2FkQmFzZTsKKwl1bnNpZ25lZCBpbnQgWHBIejsKKwl1bnNpZ25lZCBpbnQgWHBDcHM7CisJY2hhciAgICAgICAgICpYcE9uOworCWNoYXIgICAgICAgICAqWHBPZmY7CisJdW5zaWduZWQgaW50IE1heFhwQ3BzOworCXVuc2lnbmVkIGludCBNaW5YcENwczsKKwl1bnNpZ25lZCBpbnQgU3BpbkNtZHM7CisJdW5zaWduZWQgaW50IEZpcnN0QWRkcjsKKwl1bnNpZ25lZCBpbnQgTGFzdEFkZHI7CisJdW5zaWduZWQgaW50IEJ1ZmZlclNpemU7CisJdW5zaWduZWQgaW50IExvd1dhdGVyOworCXVuc2lnbmVkIGludCBMaW5lTGVuZ3RoOworCXVuc2lnbmVkIGludCBDbWRUaW1lOworfTsKKworLyoKKyoqCUJvYXJkIHR5cGVzIC0gdGhlc2UgTVVTVCBjb3JyZXNwb25kIHRvIHByb2R1Y3QgY29kZXMhCisqLyAKKyNkZWZpbmUJUklPX0VNUFRZCTB4MAorI2RlZmluZQlSSU9fRUlTQQkweDMKKyNkZWZpbmUJUklPX1JUQV8xNgkweDkKKyNkZWZpbmUJUklPX0FUCQkweEEKKyNkZWZpbmUJUklPX01DQQkJMHhCCisjZGVmaW5lCVJJT19QQ0kJCTB4RAorI2RlZmluZQlSSU9fUlRBCQkweEUKKworLyoKKyoqCUJvYXJkIGRhdGEgc3RydWN0dXJlLiBUaGlzIGlzIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gaW5mbworKi8KK3N0cnVjdAlCcmQKK3sKKyAgICB1bnNpZ25lZCBjaGFyIFR5cGU7CS8qIFJJT19FSVNBLCBSSU9fTUNBLCBSSU9fQVQsIFJJT19FTVBUWS4uLiAqLworICAgIHVuc2lnbmVkIGNoYXIgSXZlYzsJLyogUE9MTEVEIG9yIGl2ZWMgbnVtYmVyICovCisgICAgdW5zaWduZWQgY2hhciBNb2RlOwkvKiBDb250cm9sIHN0dWZmLCBzZWUgYmVsb3cgKi8KK307CisKK3N0cnVjdAlCb2FyZAoreworICAgIGNoYXIgICAgICAgTG9jYXRvcltSSU9fTE9DQVRPUl9MRU5dOworICAgIGludCAgICAgICAgTnVtU2xvdHM7CisgICAgc3RydWN0IEJyZCBCb2FyZHNbTUFYX1JJT19CT0FSRFNdOworfTsKKworI2RlZmluZQlCT09UX0ZST01fTElOSwkJMHgwMAorI2RlZmluZQlCT09UX0ZST01fUkFNCQkweDAxCisjZGVmaW5lCUVYVEVSTkFMX0JVU19PRkYJMHgwMAorI2RlZmluZQlFWFRFUk5BTF9CVVNfT04JCTB4MDIKKyNkZWZpbmUJSU5URVJSVVBUX0RJU0FCTEUJMHgwMAorI2RlZmluZQlJTlRFUlJVUFRfRU5BQkxFCTB4MDQKKyNkZWZpbmUJQllURV9PUEVSQVRJT04JCTB4MDAKKyNkZWZpbmUJV09SRF9PUEVSQVRJT04JCTB4MDgKKyNkZWZpbmUJUE9MTEVECQkJSU5URVJSVVBUX0RJU0FCTEUKKyNkZWZpbmUJSVJRXzE1CQkJKDB4MDAgfCBJTlRFUlJVUFRfRU5BQkxFKQorI2RlZmluZQlJUlFfMTIJCQkoMHgxMCB8IElOVEVSUlVQVF9FTkFCTEUpCisjZGVmaW5lCUlSUV8xMQkJCSgweDIwIHwgSU5URVJSVVBUX0VOQUJMRSkKKyNkZWZpbmUJSVJRXzkJCQkoMHgzMCB8IElOVEVSUlVQVF9FTkFCTEUpCisjZGVmaW5lCVNMT1dfTElOS1MJCTB4MDAKKyNkZWZpbmUJRkFTVF9MSU5LUwkJMHg0MAorI2RlZmluZQlTTE9XX0FUX0JVUwkJMHgwMAorI2RlZmluZQlGQVNUX0FUX0JVUwkJMHg4MAorI2RlZmluZQlTTE9XX1BDSV9UUAkJMHgwMAorI2RlZmluZQlGQVNUX1BDSV9UUAkJMHg4MAorLyoKKyoqCURlYnVnIGxldmVscworKi8KKyNkZWZpbmUJREJHX05PTkUJMHgwMDAwMDAwMAorCisjZGVmaW5lCURCR19JTklUCTB4MDAwMDAwMDEKKyNkZWZpbmUJREJHX09QRU4JMHgwMDAwMDAwMgorI2RlZmluZQlEQkdfQ0xPU0UJMHgwMDAwMDAwNAorI2RlZmluZQlEQkdfSU9DVEwJMHgwMDAwMDAwOAorCisjZGVmaW5lCURCR19SRUFECTB4MDAwMDAwMTAKKyNkZWZpbmUJREJHX1dSSVRFCTB4MDAwMDAwMjAKKyNkZWZpbmUJREJHX0lOVFIJMHgwMDAwMDA0MAorI2RlZmluZQlEQkdfUFJPQwkweDAwMDAwMDgwCisKKyNkZWZpbmUJREJHX1BBUkFNCTB4MDAwMDAxMDAKKyNkZWZpbmUJREJHX0NNRAkJMHgwMDAwMDIwMAorI2RlZmluZQlEQkdfWFBSSU5UCTB4MDAwMDA0MDAKKyNkZWZpbmUJREJHX1BPTEwJMHgwMDAwMDgwMAorCisjZGVmaW5lCURCR19EQUVNT04JMHgwMDAwMTAwMAorI2RlZmluZQlEQkdfRkFJTAkweDAwMDAyMDAwCisjZGVmaW5lIERCR19NT0RFTQkweDAwMDA0MDAwCisjZGVmaW5lCURCR19MSVNUCTB4MDAwMDgwMDAKKworI2RlZmluZQlEQkdfUk9VVEUJMHgwMDAxMDAwMAorI2RlZmluZSBEQkdfVVRJTCAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBEQkdfQk9PVAkweDAwMDQwMDAwCisjZGVmaW5lIERCR19CVUZGRVIJMHgwMDA4MDAwMAorCisjZGVmaW5lCURCR19NT04JCTB4MDAxMDAwMDAKKyNkZWZpbmUgREJHX1NQRUNJQUwgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUJREJHX1ZQSVgJMHgwMDQwMDAwMAorI2RlZmluZQlEQkdfRkxVU0gJMHgwMDgwMDAwMAorCisjZGVmaW5lCURCR19RRU5BQkxFCTB4MDEwMDAwMDAKKworI2RlZmluZQlEQkdfQUxXQVlTCTB4ODAwMDAwMDAKKworI2VuZGlmIC8qIF9fcmlvX3Jpb3NwYWNlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjI2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RhYmxlLmMKQEAgLTAsMCArMSwxMDQ0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW90YWJsZS5jCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzo0NworKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo1MAorKioKKyoqICBpZGVudCBAKCMpcmlvdGFibGUuYwkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW90YWJsZV9jX3NjY3NfID0gIkAoIylyaW90YWJsZS5jCTEuMiI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisjaW5jbHVkZSAicGFyYW0uaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAic2FtLmgiCisjaW5jbHVkZSAicHJvdHN0cy5oIgorCisvKgorKiogQSBjb25maWd1cmF0aW9uIHRhYmxlIGhhcyBiZWVuIGxvYWRlZC4gSXQgaXMgbm93IHVwIHRvIHVzCisqKiB0byBzb3J0IGl0IG91dCBhbmQgdXNlIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgdGhlcmVpbi4KKyovCitpbnQKK1JJT05ld1RhYmxlKHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWludCBIb3N0LCBIb3N0MSwgSG9zdDIsIE5hbWVJc1VuaXF1ZSwgRW50cnksIFN1YkVudDsKKwlzdHJ1Y3QgTWFwICpNYXBQOworCXN0cnVjdCBNYXAgKkhvc3RNYXBQOworCXN0cnVjdCBIb3N0ICpIb3N0UDsKKworCWNoYXIgKmNwdHI7CisKKwkvKgorCSoqIFdlIGhhdmUgYmVlbiBzZW50IGEgbmV3IHRhYmxlIHRvIGluc3RhbGwuIFdlIG5lZWQgdG8gYnJlYWsKKwkqKiBpdCBkb3duIGludG8gbGl0dGxlIGJpdHMgYW5kIHNwcmVhZCBpdCBhcm91bmQgYSBiaXQgdG8gc2VlCisJKiogd2hhdCB3ZSBoYXZlIGdvdC4KKwkqLworCS8qCisJKiogVGhpbmdzIHRvIGNoZWNrOgorCSoqICh0aGluZ3MgbWFya2VkICd4eCcgYXJlbid0IGNoZWNrZWQgYW55IG1vcmUhKQorCSoqICgxKQlUaGF0IHRoZXJlIGFyZSBubyBib290ZWQgSG9zdHMvUlRBcyBvdXQgdGhlcmUuCisJKiogKDIpCVRoYXQgdGhlIG5hbWVzIGFyZSBwcm9wZXJseSBmb3JtZWQKKwkqKiAoMykJVGhhdCBibGFuayBlbnRyaWVzIHJlYWxseSBhcmUuCisJKiogeHggKDQpCVRoYXQgaG9zdHMgbWVudGlvbmVkIGluIHRoZSB0YWJsZSBhY3R1YWxseSBleGlzdC4geHgKKwkqKiAoNSkJVGhhdCB0aGUgSURzIGFyZSB1bmlxdWUgKHBlciBob3N0KS4KKwkqKiAoNikJVGhhdCBob3N0IElEcyBhcmUgemVybworCSoqICg3KQlUaGF0IHBvcnQgbnVtYmVycyBhcmUgdmFsaWQKKwkqKiAoOCkJVGhhdCBwb3J0IG51bWJlcnMgYXJlbid0IGR1cGxpY2F0ZWQKKwkqKiAoOSkJVGhhdCBuYW1lcyBhcmVuJ3QgZHVwbGljYXRlZAorCSoqIHh4ICgxMCkgVGhhdCBob3N0cyB0aGF0IGFjdHVhbGx5IGV4aXN0IGFyZSBtZW50aW9uZWQgaW4gdGhlIHRhYmxlLiB4eAorCSovCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygxKVxuIik7IAorCWlmICggcC0+UklPU3lzdGVtVXAgKSB7CQkvKiAoMSkgKi8KKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX0hBU19BTFJFQURZX0JFRU5fQk9PVEVEOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXAtPlJJT0Vycm9yLkVycm9yID0gTk9USElOR19XUk9OR19BVF9BTEw7CisJcC0+UklPRXJyb3IuRW50cnkgPSAtMTsKKwlwLT5SSU9FcnJvci5PdGhlciA9IC0xOworCisJZm9yICggRW50cnk9MDsgRW50cnk8VE9UQUxfTUFQX0VOVFJJRVM7IEVudHJ5KysgKSB7CisJCU1hcFAgPSAmcC0+UklPQ29ubmVjdFRhYmxlW0VudHJ5XTsKKwkJaWYgKChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSA9PSAwKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDIpXG4iKTsKKwkJCWNwdHIgPSBNYXBQLT5OYW1lOwkJLyogKDIpICovCisJCQljcHRyW01BWF9OQU1FX0xFTi0xXT0nXDAnOworCQkJaWYgKCBjcHRyWzBdPT0nXDAnICkgeworCQkJCWJjb3B5KE1hcFAtPlJ0YVVuaXF1ZU51bT8iUlRBCU5OIjoiSE9TVCBOTiIsTWFwUC0+TmFtZSw4KTsKKwkJCQlNYXBQLT5OYW1lWzVdID0gJzAnK0VudHJ5LzEwOworCQkJCU1hcFAtPk5hbWVbNl0gPSAnMCcrRW50cnklMTA7CisJCQl9CisJCQl3aGlsZSAoICpjcHRyICkgeworCQkJCWlmICggKmNwdHI8JyAnIHx8ICpjcHRyPid+JyApIHsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWNwdHIrKzsKKwkJCX0KKwkJfQorCisJCS8qCisJCSoqIElmIHRoZSBlbnRyeSBzYXZlZCB3YXMgYSB0ZW50YXRpdmUgZW50cnkgdGhlbiBqdXN0IGZvcmdldAorCQkqKiBhYm91dCBpdC4KKwkJKi8KKwkJaWYgKCBNYXBQLT5GbGFncyAmIFNMT1RfVEVOVEFUSVZFICkgeworCQkJTWFwUC0+SG9zdFVuaXF1ZU51bSA9IDA7CisJCQlNYXBQLT5SdGFVbmlxdWVOdW0gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDMpXG4iKTsKKwkJaWYgKCAhTWFwUC0+UnRhVW5pcXVlTnVtICYmICFNYXBQLT5Ib3N0VW5pcXVlTnVtICkgeyAvKiAoMykgKi8KKwkJCWlmICggTWFwUC0+SUQgfHwgTWFwUC0+U3lzUG9ydCB8fCBNYXBQLT5GbGFncyApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiJXMgcHJldGVuZGluZyB0byBiZSBlbXB0eSBidXQgaXNuJ3RcbiIsTWFwUC0+TmFtZSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUQUJMRV9FTlRSWV9JU05UX1BST1BFUkxZX05VTEw7CisJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIiFSSU86IERhZW1vbjogdGVzdCAoMykgcGFzc2VzXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg0KVxuIik7CisJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeyAvKiAoNCkgKi8KKwkJCWlmICggcC0+UklPSG9zdHNbSG9zdF0uVW5pcXVlTnVtPT1NYXBQLT5Ib3N0VW5pcXVlTnVtICkgeworCQkJCUhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCQkJCS8qCisJCQkJKiogaGF2aW5nIGRvbmUgdGhlIGxvb2t1cCwgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gZG8KKwkJCQkqKiBpdCBhZ2Fpbiwgc28gaGFuZyB0aGUgaG9zdCBudW1iZXIgaW4gYSBzYWZlIHBsYWNlCisJCQkJKi8KKwkJCQlNYXBQLT5Ub3BvbG9neVswXS5Vbml0ID0gSG9zdDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICggSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIHVua25vd24gaG9zdCB1bmlxdWUgbnVtYmVyIDB4JXhcbiIsCisJCQkJCQkJCQlNYXBQLT5OYW1lLCBNYXBQLT5Ib3N0VW5pcXVlTnVtKTsKKwkJCU1hcFAtPkhvc3RVbmlxdWVOdW0gPSAwOworCQkJLyogTWFwUC0+UnRhVW5pcXVlTnVtCT0gMDsgKi8KKwkJCS8qIE1hcFAtPklECQkJPSAwOyAqLworCQkJLyogTWFwUC0+RmxhZ3MJCSA9IDA7ICovCisJCQkvKiBNYXBQLT5TeXNQb3J0CQkgPSAwOyAqLworCQkJLyogTWFwUC0+TmFtZVswXQkJID0gMDsgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg1KVxuIik7IAorCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSApIHsgLyogKDUpICovCisJCQlpZiAoICFNYXBQLT5JRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBSVEEgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIGFuIElEIG9mIHplcm8hXG4iLAorCQkJCQkJCU1hcFAtPk5hbWUpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yCQkgPSBaRVJPX1JUQV9JRDsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlpZiAoIE1hcFAtPklEID4gTUFYX1JVUCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBSVEEgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIGFuIGludmFsaWQgSUQgJWRcbiIsCisJCQkJCQkJTWFwUC0+TmFtZSwgTWFwUC0+SUQpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSURfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlmb3IgKCBTdWJFbnQ9MDsgU3ViRW50PEVudHJ5OyBTdWJFbnQrKyApIHsKKwkJCQlpZiAoIE1hcFAtPkhvc3RVbmlxdWVOdW0gPT0gCisJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5Ib3N0VW5pcXVlTnVtICYmIAorCQkJCQkJTWFwUC0+SUQgPT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSUQgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJEdXBsLiBJRCBudW1iZXIgYWxsb2NhdGVkIHRvIFJUQSAlcyBhbmQgUlRBICVzXG4iLAorCQkJCQkJCU1hcFAtPk5hbWUsIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IERVUExJQ0FURURfUlRBX0lEOworCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJLyoKKwkJCQkqKiBJZiB0aGUgUnRhVW5pcXVlTnVtIGlzIHRoZSBzYW1lLCBpdCBtYXkgYmUgbG9va2luZyBhdCBib3RoCisJCQkJKiogZW50cmllcyBmb3IgYSAxNiBwb3J0IFJUQSwgc28gY2hlY2sgdGhlIGlkcworCQkJCSovCisJCQkJaWYgKChNYXBQLT5SdGFVbmlxdWVOdW0gPT0gCisJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5SdGFVbmlxdWVOdW0pCisJCQkJIAkJJiYgKE1hcFAtPklEMiAhPSBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5JRCkpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlcyBoYXMgZHVwbGljYXRlIHVuaXF1ZSBudW1iZXJcbiIsTWFwUC0+TmFtZSk7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIGR1cGxpY2F0ZSB1bmlxdWUgbnVtYmVyXG4iLAorCQkJCQkJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IERVUExJQ0FURV9VTklRVUVfTlVNQkVSOworCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQl9CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDdhKVxuIik7IAorCQkJLyogKDdhKSAqLworCQkJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpJiYoTWFwUC0+U3lzUG9ydCAlIFBPUlRTX1BFUl9SVEEpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRUWSBQb3J0IG51bWJlciAlZC1SVEEgJXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgJWQhXG4iLAorCQkJCQkoaW50KU1hcFAtPlN5c1BvcnQsTWFwUC0+TmFtZSwgUE9SVFNfUEVSX1JUQSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDdiKVxuIik7IAorCQkJLyogKDdiKSAqLworCQkJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpJiYoTWFwUC0+U3lzUG9ydCA+PSBSSU9fUE9SVFMpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRUWSBQb3J0IG51bWJlciAlZCBmb3IgUlRBICVzIGlzIHRvbyBiaWdcbiIsCisJCQkJCQkJKGludClNYXBQLT5TeXNQb3J0LCBNYXBQLT5OYW1lKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFRUWV9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8RW50cnk7IFN1YkVudCsrICkgeworCQkJCWlmICggcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uRmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCApCisJCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlJ0YVVuaXF1ZU51bSApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg4KVxuIik7IAorCQkJCQkvKiAoOCkgKi8KKwkJCQkJaWYgKCAoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSAmJiAoTWFwUC0+U3lzUG9ydCA9PSAKKwkJCQkJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlN5c1BvcnQpICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlczpzYW1lIFRUWSBwb3J0ICMgYXMgUlRBICVzICglZClcbiIsCisJCQkJCQkJTWFwUC0+TmFtZSwgcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSwKKwkJCQkJCQkoaW50KU1hcFAtPlN5c1BvcnQpOworCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX0lOX1VTRTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJCXJldHVybiAtRU5YSU87CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg5KVxuIik7IAorCQkJCQlpZiAoc3RyY21wKE1hcFAtPk5hbWUsCisJCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSk9PTAgJiYgIShNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSkgeyAvKiAoOSkgKi8KKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgbmFtZSAlcyB1c2VkIHR3aWNlXG4iLCBNYXBQLT5OYW1lKTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTkFNRV9VU0VEX1RXSUNFOworCQkJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQkJCXAtPlJJT0Vycm9yLk90aGVyID0gU3ViRW50OworCQkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsgLyogKDYpICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDYpXG4iKTsgCisJCQlpZiAoIE1hcFAtPklEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU86SE9TVCAlcyBoYXMgYmVlbiBhbGxvY2F0ZWQgSUQgdGhhdCBpc24ndCB6ZXJvIVxuIiwKKwkJCQkJTWFwUC0+TmFtZSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX0lEX05PVF9aRVJPOworCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJCWlmICggTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU86IEhPU1QgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIHBvcnQgbnVtYmVycyFcbiIsCisJCQkJCU1hcFAtPk5hbWUpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9TWVNQT1JUX0JBRDsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSoqIHdvdyEgaWYgd2UgZ2V0IGhlcmUgdGhlbiBpdCdzIGEgZ29vZHkhCisJKi8KKworCS8qCisJKiogWmVybyB0aGUgKG9sZCkgZW50cmllcyBmb3IgZWFjaCBob3N0Li4uCisJKi8KKwlmb3IgKCBIb3N0PTA7IEhvc3Q8UklPX0hPU1RTOyBIb3N0KysgKSB7CisJCWZvciAoIEVudHJ5PTA7IEVudHJ5PE1BWF9SVVA7IEVudHJ5KysgKSB7CisJCQliemVybygoY2FkZHJfdCkmcC0+UklPSG9zdHNbSG9zdF0uTWFwcGluZ1tFbnRyeV0sIAorCQkJCQkJCQkJCQlzaXplb2Yoc3RydWN0IE1hcCkpOworCQl9CisJCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzBdLAorCQkJCQkJCQlzaXplb2YocC0+UklPSG9zdHNbSG9zdF0uTmFtZSkgKTsKKwl9CisKKwkvKgorCSoqIENvcHkgaW4gdGhlIG5ldyB0YWJsZSBlbnRyaWVzCisJKi8KKwlmb3IgKCBFbnRyeT0wOyBFbnRyeTwgVE9UQUxfTUFQX0VOVFJJRVM7IEVudHJ5KysgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogQ29weSB0YWJsZSBmb3IgSG9zdCBlbnRyeSAlZFxuIiwgRW50cnkpOworCQlNYXBQID0gJnAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CisKKwkJLyoKKwkJKiogTm93LCBpZiBpdCBpcyBhbiBlbXB0eSBzbG90IGlnbm9yZSBpdCEKKwkJKi8KKwkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtPT0wICkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSoqIHdlIHNhdmVkIHRoZSBob3N0IG51bWJlciBlYXJsaWVyLCBzbyBncmFiIGl0IGJhY2sKKwkJKi8KKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbTWFwUC0+VG9wb2xvZ3lbMF0uVW5pdF07CisKKwkJLyoKKwkJKiogSWYgaXQgaXMgYSBob3N0LCB0aGVuIHdlIG9ubHkgbmVlZCB0byBmaWxsIGluIHRoZSBuYW1lIGZpZWxkLgorCQkqLworCQlpZiAoIE1hcFAtPklEPT0wICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkhvc3QgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQkJYmNvcHkoTWFwUC0+TmFtZSxIb3N0UC0+TmFtZSxNQVhfTkFNRV9MRU4pOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkqKiBJdHMgYW4gUlRBIGVudHJ5LCBzbyBmaWxsIGluIHRoZSBob3N0IG1hcHBpbmcgZW50cmllcyBmb3IgaXQKKwkJKiogYW5kIHRoZSBwb3J0IG1hcHBpbmcgZW50cmllcy4gTm90aWNlIHRoYXQgZW50cnkgemVybyBpcyBmb3IKKwkJKiogSUQgb25lLgorCQkqLworCQlIb3N0TWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tNYXBQLT5JRC0xXTsKKworCQlpZiAoTWFwUC0+RmxhZ3MgJiBTTE9UX0lOX1VTRSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJ0YSBlbnRyeSBmb3VuZC4gTmFtZSAlc1xuIiwgTWFwUC0+TmFtZSk7CisJCQkvKgorCQkJKiogc3RydWN0dXJlIGFzc2lnbiwgdGhlbiBzb3J0IG91dCB0aGUgYml0cyB3ZSBzaG91bGRuJ3QgaGF2ZSBkb25lCisJCQkqLworCQkJKkhvc3RNYXBQID0gKk1hcFA7CisKKwkJCUhvc3RNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFOworCQkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJCQkJSG9zdE1hcFAtPkZsYWdzIHw9IFJUQTE2X1NFQ09ORF9TTE9UOworCisJCQlSSU9SZU1hcFBvcnRzKHAsIEhvc3RQLCBIb3N0TWFwUCApOworCQl9CisJCWVsc2UgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRFTlRBVElWRSBSdGEgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQl9CisJfQorCisJZm9yICggRW50cnk9MDsgRW50cnk8IFRPVEFMX01BUF9FTlRSSUVTOyBFbnRyeSsrICkgeworCQlwLT5SSU9TYXZlZFRhYmxlW0VudHJ5XSA9IHAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CisJfQorCisJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7CisJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8TElOS1NfUEVSX1VOSVQ7IFN1YkVudCsrICkgeworCQkJcC0+UklPSG9zdHNbSG9zdF0uVG9wb2xvZ3lbU3ViRW50XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCXAtPlJJT0hvc3RzW0hvc3RdLlRvcG9sb2d5W1N1YkVudF0uTGluayA9IE5PX0xJTks7CisJCX0KKwkJZm9yICggRW50cnk9MDsgRW50cnk8TUFYX1JVUDsgRW50cnkrKyApIHsKKwkJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8TElOS1NfUEVSX1VOSVQ7IFN1YkVudCsrICkgeworCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uVW5pdCA9IAorCQkJCQkJCQlST1VURV9ESVNDT05ORUNUOworCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uTGluayA9IAorCQkJCQkJCQlOT19MSU5LOworCQkJfQorCQl9CisJCWlmICggIXAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbMF0gKSB7CisJCQliY29weSgiSE9TVCAxIixwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lLDcpOworCQkJcC0+UklPSG9zdHNbSG9zdF0uTmFtZVs1XSArPSBIb3N0OworCQl9CisJCS8qCisJCSoqIENoZWNrIHRoYXQgZGVmYXVsdCBuYW1lIGFzc2lnbmVkIGlzIHVuaXF1ZS4KKwkJKi8KKwkJSG9zdDEgPSBIb3N0OworCQlOYW1lSXNVbmlxdWUgPSAwOworCQl3aGlsZSAoIU5hbWVJc1VuaXF1ZSkgeworCQkJTmFtZUlzVW5pcXVlID0gMTsKKwkJCWZvciAoIEhvc3QyPTA7IEhvc3QyPHAtPlJJT051bUhvc3RzOyBIb3N0MisrICkgeworCQkJCWlmIChIb3N0MiA9PSBIb3N0KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoc3RyY21wKHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUsIHAtPlJJT0hvc3RzW0hvc3QyXS5OYW1lKQorCQkJCQkJCQkJID09IDApIHsKKwkJCQkJTmFtZUlzVW5pcXVlID0gMDsKKwkJCQkJSG9zdDErKzsKKwkJCQkJaWYgKEhvc3QxID49IHAtPlJJT051bUhvc3RzKQorCQkJCQkJSG9zdDEgPSAwOworCQkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzVdID0gJzEnICsgSG9zdDE7CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSoqIFJlbmFtZSBob3N0IGlmIG5hbWUgYWxyZWFkeSB1c2VkLgorCQkqLworCQlpZiAoSG9zdDEgIT0gSG9zdCkKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkRlZmF1bHQgbmFtZSAlcyBhbHJlYWR5IHVzZWRcbiIsIHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpOworCQkJYmNvcHkoIkhPU1QgMSIscC0+UklPSG9zdHNbSG9zdF0uTmFtZSw3KTsKKwkJCXAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbNV0gKz0gSG9zdDE7CisJCX0KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFzc2lnbmluZyBkZWZhdWx0IG5hbWUgJXNcbiIsIHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIFVzZXIgcHJvY2VzcyBuZWVkcyB0aGUgY29uZmlnIHRhYmxlIC0gYnVpbGQgaXQgZnJvbSBmaXJzdAorKiogcHJpbmNpcGxlcy4KKyovCitpbnQKK1JJT0FwZWwocCkKK3N0cnVjdCByaW9faW5mbyAqCXA7Cit7CisJaW50IEhvc3Q7CisJaW50IGxpbms7CisJaW50IFJ1cDsKKwlpbnQgTmV4dCA9IDA7CisJc3RydWN0IE1hcCAqTWFwUDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJbG9uZyBvbGRzcGw7CisKKwlkaXNhYmxlKG9sZHNwbCk7CQkvKiBzdHJhbmdlIGJ1dCB0cnVlISAqLworIAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJHZW5lcmF0aW5nIGEgdGFibGUgdG8gcmV0dXJuIHRvIGNvbmZpZy5yaW9cbiIpOworCisJYnplcm8oKGNhZGRyX3QpJnAtPlJJT0Nvbm5lY3RUYWJsZVswXSwgCisJCQkJCXNpemVvZihzdHJ1Y3QgTWFwKSAqIFRPVEFMX01BUF9FTlRSSUVTICk7CisKKwlmb3IgKCBIb3N0PTA7IEhvc3Q8UklPX0hPU1RTOyBIb3N0KysgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJQcm9jZXNzaW5nIGhvc3QgJWRcbiIsIEhvc3QpOworCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKwkJTWFwUCA9ICZwLT5SSU9Db25uZWN0VGFibGVbTmV4dCsrXTsKKwkJTWFwUC0+SG9zdFVuaXF1ZU51bSA9IEhvc3RQLT5VbmlxdWVOdW07CisJCWlmICggKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApCisJCQljb250aW51ZTsKKwkJTWFwUC0+UnRhVW5pcXVlTnVtID0gMDsKKwkJTWFwUC0+SUQgPSAwOworCQlNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFOworCQlNYXBQLT5TeXNQb3J0ID0gTk9fUE9SVDsKKwkJZm9yICggbGluaz0wOyBsaW5rPExJTktTX1BFUl9VTklUOyBsaW5rKysgKQorCQkJTWFwUC0+VG9wb2xvZ3lbbGlua10gPSBIb3N0UC0+VG9wb2xvZ3lbbGlua107CisJCWJjb3B5KEhvc3RQLT5OYW1lLE1hcFAtPk5hbWUsTUFYX05BTUVfTEVOKTsKKwkJZm9yICggUnVwPTA7IFJ1cDxNQVhfUlVQOyBSdXArKyApIHsKKwkJCWlmICggSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIChTTE9UX0lOX1VTRXxTTE9UX1RFTlRBVElWRSkgKSB7CisJCQkJcC0+UklPQ29ubmVjdFRhYmxlW05leHRdID0gSG9zdFAtPk1hcHBpbmdbUnVwXTsKKwkJCQlpZiAoIEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiBTTE9UX0lOX1VTRSkKKwkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW05leHRdLkZsYWdzIHw9IFNMT1RfSU5fVVNFOworCQkJCWlmICggSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKQorCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbTmV4dF0uRmxhZ3MgfD0gU0xPVF9URU5UQVRJVkU7CisJCQkJaWYgKCBIb3N0UC0+TWFwcGluZ1tSdXBdLkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QgKQorCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbTmV4dF0uRmxhZ3MgfD0gUlRBMTZfU0VDT05EX1NMT1Q7CisJCQkJTmV4dCsrOworCQkJfQorCQl9CisJfQorCXJlc3RvcmUob2xkc3BsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIGNvbmZpZy5yaW8gaGFzIHRha2VuIGEgZGlzbGlrZSB0byBvbmUgb2YgdGhlIGdyb3NzIG1hcHMgZW50cmllcy4KKyoqIGlmIHRoZSBlbnRyeSBpcyBzdWl0YWJseSBpbmFjdGl2ZSwgdGhlbiB3ZSBjYW4gZ29iIG9uIGl0IGFuZCByZW1vdmUKKyoqIGl0IGZyb20gdGhlIHRhYmxlLgorKi8KK2ludAorUklPRGVsZXRlUnRhKHAsIE1hcFApCitzdHJ1Y3QgcmlvX2luZm8gKnA7CitzdHJ1Y3QgTWFwICpNYXBQOworeworCWludCBob3N0LCBlbnRyeSwgcG9ydCwgbGluazsKKwlpbnQgU3lzUG9ydDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJc3RydWN0IE1hcCAqSG9zdE1hcFA7CisJc3RydWN0IFBvcnQgKlBvcnRQOworCWludCB3b3JrX2RvbmUgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncywgc2VtX2ZsYWdzOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkRlbGV0ZSBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXhcbiIsCisJCQkJCQkJCU1hcFAtPkhvc3RVbmlxdWVOdW0sIE1hcFAtPlJ0YVVuaXF1ZU51bSk7CisKKwlmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkgeworCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tob3N0XTsKKworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MgKTsKKworCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yICggZW50cnk9MDsgZW50cnk8TUFYX1JVUDsgZW50cnkrKyApIHsKKwkJCWlmICggTWFwUC0+UnRhVW5pcXVlTnVtID09IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW0gKSB7CisJCQkJSG9zdE1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbZW50cnldOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJGb3VuZCBlbnRyeSBvZmZzZXQgJWQgb24gaG9zdCAlc1xuIiwgCisJCQkJCQllbnRyeSwgSG9zdFAtPk5hbWUpOworCisJCQkJLyoKKwkJCQkqKiBDaGVjayBhbGwgZm91ciBsaW5rcyBvZiB0aGUgdW5pdCBhcmUgZGlzY29ubmVjdGVkCisJCQkJKi8KKwkJCQlmb3IgKCBsaW5rPTA7IGxpbms8IExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCQkJCWlmICggSG9zdE1hcFAtPlRvcG9sb2d5W2xpbmtdLlVuaXQgIT0gUk9VVEVfRElTQ09OTkVDVCApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJFbnRyeSBpcyBpbiB1c2UgYW5kIGNhbm5vdCBiZSBkZWxldGVkIVxuIik7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFVOSVRfSVNfSU5fVVNFOworCQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MpOworCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKgorCQkJCSoqIFNsb3QgaGFzIGJlZW4gYWxsb2NhdGVkLCBCVVQgbm90IGJvb3RlZC9yb3V0ZWQvCisJCQkJKiogY29ubmVjdGVkL3NlbGVjdGVkIG9yIGFueXRoaW5nIGVsc2UtZWQKKwkJCQkqLworCQkJCVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKworCQkJCWlmICggU3lzUG9ydCAhPSBOT19QT1JUICkgeworCQkJCQlmb3IgKHBvcnQ9U3lzUG9ydDsgcG9ydCA8IFN5c1BvcnQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrKSB7CisJCQkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlVubWFwIHBvcnRcbiIpOworCisJCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZQb3J0UC0+cG9ydFNlbSwgc2VtX2ZsYWdzICk7CisKKwkJCQkJCVBvcnRQLT5NYXBwZWQgPSAwOworCisJCQkJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU58UklPX0xPUEVOKSApIHsKKworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJHb2Igb24gcG9ydFxuIik7CisJCQkJCQkJUG9ydFAtPlR4QnVmZmVySW4gPSBQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOworCQkJCQkJCS8qIFdoYXQgc2hvdWxkIEkgZG8gCisJCQkJCQkJd2FrZXVwKCAmUG9ydFAtPlR4QnVmZmVySW4gKTsKKwkJCQkJCQl3YWtldXAoICZQb3J0UC0+VHhCdWZmZXJPdXQpOworCQkJCQkJCSovCisJCQkJCQkJUG9ydFAtPkluVXNlID0gTk9UX0lOVVNFOworCQkJCQkJCS8qIFdoYXQgc2hvdWxkIEkgZG8gCisJCQkJCQkJd2FrZXVwKCAmUG9ydFAtPkluVXNlICk7CisJCQkJCQkJc2lnbmFsKFBvcnRQLT5UdHlQLT50X3BncnAsU0lHS0lMTCk7CisJCQkJCQkJdHR5Zmx1c2goUG9ydFAtPlR0eVAsKEZSRUFEfEZXUklURSkpOworCQkJCQkJCSovCisJCQkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19DTE9TSU5HIHwgUklPX0RFTEVURUQ7CisJCQkJCQl9CisKKwkJCQkJCS8qCisJCQkJCQkqKiBGb3IgdGhlIHNlY29uZCBzbG90IG9mIGEgMTYgcG9ydCBSVEEsIHRoZQorCQkJCQkJKiogZHJpdmVyIG5lZWRzIHRvIHJlc2V0IHRoZSBjaGFuZ2VzIG1hZGUgdG8KKwkJCQkJCSoqIHRoZSBwaGIgdG8gcG9ydCBtYXBwaW5ncyBpbiBSSU9Sb3V0ZVJ1cC4KKwkJCQkJCSovCisJCQkJCQlpZiAoUG9ydFAtPlNlY29uZEJsb2NrKSB7CisJCQkJCQkJdXNob3J0IGRlc3RfdW5pdCA9IEhvc3RNYXBQLT5JRDsKKwkJCQkJCQl1c2hvcnQgZGVzdF9wb3J0ID0gcG9ydCAtIFN5c1BvcnQ7CisJCQkJCQkJV09SRAkgKlR4UGt0UDsKKwkJCQkJCQlQS1QJKlBrdDsKKworCQkJCQkJCWZvciAoVHhQa3RQID0gUG9ydFAtPlR4U3RhcnQ7CisJCQkJCQkJCVR4UGt0UCA8PSBQb3J0UC0+VHhFbmQ7IFR4UGt0UCsrKSB7CisJCQkJCQkJCS8qCisJCQkJCQkJCSoqICpUeFBrdFAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlCisJCQkJCQkJCSoqIHRyYW5zbWl0IHBhY2tldCBvbiB0aGUgaG9zdCBjYXJkLgorCQkJCQkJCQkqKiBUaGlzIG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgaW50bworCQkJCQkJCQkqKiBhIDMyIGJpdCBwb2ludGVyIHNvIGl0IGNhbiBiZQorCQkJCQkJCQkqKiBhY2Nlc3NlZCBmcm9tIHRoZSBkcml2ZXIuCisJCQkJCQkJCSovCisJCQkJCQkJCVBrdCA9IChQS1QgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsCisJCQkJCQkJCSAJUldPUkQoKlR4UGt0UCkpOworCQkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAKKwkJCQkJCSJUeCBwYWNrZXQgKCV4KSBkZXN0aW5hdGlvbjogT2xkICV4OiV4IE5ldyAleDoleFxuIiwKKwkJCQkJCQkJICpUeFBrdFAsIFBrdC0+ZGVzdF91bml0LAorCQkJCQkJCQkgUGt0LT5kZXN0X3BvcnQsIGRlc3RfdW5pdCwgZGVzdF9wb3J0KTsKKwkJCQkJCQkJV1dPUkQoUGt0LT5kZXN0X3VuaXQsIGRlc3RfdW5pdCk7CisJCQkJCQkJCVdXT1JEKFBrdC0+ZGVzdF9wb3J0LCBkZXN0X3BvcnQpOworCQkJCQkJCX0KKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAKKwkJCQkJCSJQb3J0ICVkIHBoYiBkZXN0aW5hdGlvbjogT2xkICV4OiV4IE5ldyAleDoleFxuIiwKKwkJCQkJCQkgcG9ydCwgUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uICYgMHhmZiwKKwkJCQkJCQkgKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiA+PiA4KSAmIDB4ZmYsCisJCQkJCQkJIGRlc3RfdW5pdCwgZGVzdF9wb3J0KTsKKwkJCQkJCQlXV09SRChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24sCisJCQkJCQkJIGRlc3RfdW5pdCArIChkZXN0X3BvcnQgPDwgOCkpOworCQkJCQkJfQorCQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBzZW1fZmxhZ3MpOworCQkJCQl9CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJFbnRyeSBudWxsZWQuXG4iKTsKKwkJCQliemVybygoY2hhciAqKUhvc3RNYXBQLHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJCQkJd29ya19kb25lKys7CisJCQl9CisJCX0KKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkhvc3RQLT5Ib3N0TG9jaywgbG9ja19mbGFncyk7CisJfQorCisJLyogWFhYWFggbG9jayBtZSB1cCAqLworCWZvciAoIGVudHJ5PTA7IGVudHJ5PCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKyApIHsKKwkJaWYgKCBwLT5SSU9TYXZlZFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gTWFwUC0+UnRhVW5pcXVlTnVtICkgeworCQkJYnplcm8oKGNoYXIgKikmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0sc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwkJCXdvcmtfZG9uZSsrOworCQl9CisJCWlmICggcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gTWFwUC0+UnRhVW5pcXVlTnVtICkgeworCQkJYnplcm8oKGNoYXIgKikmcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XSxzaXplb2Yoc3RydWN0IE1hcCkpOworCQkJd29ya19kb25lKys7CisJCX0KKwl9CisJaWYgKCB3b3JrX2RvbmUgKQorCQlyZXR1cm4gMDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDb3VsZG4ndCBmaW5kIGVudHJ5IHRvIGJlIGRlbGV0ZWRcbiIpOworCXAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCXJldHVybiAtRU5YSU87Cit9CisKK2ludCBSSU9Bc3NpZ25SdGEoIHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IE1hcCAqTWFwUCApCit7CisgICAgaW50IGhvc3Q7CisgICAgc3RydWN0IE1hcCAqSG9zdE1hcFA7CisgICAgY2hhciAqc3B0cjsKKyAgICBpbnQJbGluazsKKworCisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFzc2lnbiBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXgsIElEICVkLCBTeXNwb3J0ICVkXG4iLAorCQkJCU1hcFAtPkhvc3RVbmlxdWVOdW0sTWFwUC0+UnRhVW5pcXVlTnVtLAorCQkJCU1hcFAtPklELCAoaW50KU1hcFAtPlN5c1BvcnQpOworCisgICAgaWYgKChNYXBQLT5JRCAhPSAodXNob3J0KS0xKSAmJgorCSgoaW50KU1hcFAtPklEIDwgKGludCkxIHx8IChpbnQpTWFwUC0+SUQgPiBNQVhfUlVQICkpCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJCYWQgSUQgaW4gbWFwIGVudHJ5IVxuIik7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBJRF9OVU1CRVJfT1VUX09GX1JBTkdFOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoTWFwUC0+UnRhVW5pcXVlTnVtID09IDApCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSdGEgVW5pcXVlIG51bWJlciB6ZXJvIVxuIik7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBSVEFfVU5JUVVFX05VTUJFUl9aRVJPOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoIChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ICUgUE9SVFNfUEVSX1JUQSkgKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgbXVsdGlwbGUgb2YgJWQhXG4iLChpbnQpTWFwUC0+U3lzUG9ydCxQT1JUU19QRVJfUlRBKTsKKwlwLT5SSU9FcnJvci5FcnJvciA9IFRUWV9OVU1CRVJfT1VUX09GX1JBTkdFOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoIChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ID49IFJJT19QT1JUUykgKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgdmFsaWQhXG4iLChpbnQpTWFwUC0+U3lzUG9ydCk7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKgorICAgICoqIENvcHkgdGhlIG5hbWUgYWNyb3NzIHRvIHRoZSBtYXAgZW50cnkuCisgICAgKi8KKyAgICBNYXBQLT5OYW1lW01BWF9OQU1FX0xFTi0xXSA9ICdcMCc7CisgICAgc3B0ciA9IE1hcFAtPk5hbWU7CisgICAgd2hpbGUgKCAqc3B0ciApCisgICAgeworICAgIGlmICggKnNwdHI8JyAnIHx8ICpzcHRyPid+JyApCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJOYW1lIGVudHJ5IGNvbnRhaW5zIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIVxuIik7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHNwdHIrKzsKKyAgICB9CisKKyAgICBmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkKKyAgICB7CisJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSApCisJeworCSAgICBpZiAoIChwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApCisJICAgIHsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOworCQlyZXR1cm4gLUVOWElPOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgKiogTm93IHdlIGhhdmUgYSBob3N0IHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gSUQKKwkgICAgKiogaWYgdGhlIGVudHJ5IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmUuCisJICAgICovCisJICAgIGlmIChNYXBQLT5JRCA9PSAodXNob3J0KS0xKQorCSAgICB7CisJCWludCBuTmV3SUQ7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkF0dGVtcHRpbmcgdG8gZ2V0IGEgbmV3IElEIGZvciBydGEgXCIlc1wiXG4iLAorCQkgICAgICBNYXBQLT5OYW1lKTsKKwkJLyoKKwkJKiogVGhlIGlkZWEgaGVyZSBpcyB0byBhbGxvdyBSVEEncyB0byBiZSBhc3NpZ25lZAorCQkqKiBiZWZvcmUgdGhleSBhY3R1YWxseSBhcHBlYXIgb24gdGhlIG5ldHdvcmsuCisJCSoqIFRoaXMgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBSVEEncyB3aXRob3V0IGhhdmluZworCQkqKiB0byBwbHVnIHRoZW0gaW4uCisJCSoqIFdoYXQgd2UgZG8gaXM6CisJCSoqICAtIEZpbmQgYSBmcmVlIElEIGFuZCBhbGxvY2F0ZSBpdCB0byB0aGUgUlRBLgorCQkqKiAgLSBJZiB0aGlzIG1hcCBlbnRyeSBpcyB0aGUgc2Vjb25kIGhhbGYgb2YgYQorCQkqKiAgICAxNiBwb3J0IGVudHJ5IHRoZW4gZmluZCB0aGUgb3RoZXIgaGFsZiBhbmQKKwkJKiogICAgbWFrZSBzdXJlIHRoZSAyIGNyb3NzIHJlZmVyZW5jZSBlYWNoIG90aGVyLgorCQkqLworCQlpZiAoUklPRmluZEZyZWVJRChwLCAmcC0+UklPSG9zdHNbaG9zdF0sICZuTmV3SUQsIE5VTEwpICE9IDApCisJCXsKKwkJICAgIHAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCQkgICAgcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlNYXBQLT5JRCA9ICh1c2hvcnQpbk5ld0lEICsgMTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFsbG9jYXRlZCBJRCAlZCBmb3IgdGhpcyBuZXcgUlRBLlxuIiwgTWFwUC0+SUQpOworCQlIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW25OZXdJRF07CisJCUhvc3RNYXBQLT5SdGFVbmlxdWVOdW0gPSBNYXBQLT5SdGFVbmlxdWVOdW07CisJCUhvc3RNYXBQLT5Ib3N0VW5pcXVlTnVtID0gTWFwUC0+SG9zdFVuaXF1ZU51bTsKKwkJSG9zdE1hcFAtPklEID0gTWFwUC0+SUQ7CisJCWZvciAobGluayA9IDA7IGxpbmsgPCBMSU5LU19QRVJfVU5JVDsgbGluaysrKQorCQl7CisJCSAgICBIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCSAgICBIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uTGluayA9IE5PX0xJTks7CisJCX0KKwkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJCXsKKwkJICAgIGludCB1bml0OworCisJCSAgICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX1JVUDsgdW5pdCsrKQorCQkJaWYgKHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uUnRhVW5pcXVlTnVtID09CisJCQkgICAgTWFwUC0+UnRhVW5pcXVlTnVtKQorCQkJICAgIGJyZWFrOworCQkgICAgaWYgKHVuaXQgPT0gTUFYX1JVUCkKKwkJICAgIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJICAgIH0KKwkJICAgIEhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKKwkJICAgIEhvc3RNYXBQLT5JRDIgPSBNYXBQLT5JRDIgPSBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLklEOworCQkgICAgcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1t1bml0XS5JRDIgPSBNYXBQLT5JRDsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDcm9zcyByZWZlcmVuY2VkIGlkICVkIHRvIElEICVkLlxuIiwKKwkJCSAgTWFwUC0+SUQsCisJCQkgIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uSUQpOworCQl9CisJICAgIH0KKworCSAgICBIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklELTFdOworCisJICAgIGlmICggSG9zdE1hcFAtPkZsYWdzICYgU0xPVF9JTl9VU0UgKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXAgdGFibGUgc2xvdCBmb3IgSUQgJWQgaXMgYWxyZWFkeSBpbiB1c2UuXG4iLCBNYXBQLT5JRCk7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gSURfQUxSRUFEWV9JTl9VU0U7CisJCXJldHVybiAtRUJVU1k7CisJICAgIH0KKworCSAgICAvKgorCSAgICAqKiBBc3NpZ24gdGhlIHN5cyBwb3J0cyBhbmQgdGhlIG5hbWUsIGFuZCBtYXJrIHRoZSBzbG90IGFzCisJICAgICoqIGJlaW5nIGluIHVzZS4KKwkgICAgKi8KKwkgICAgSG9zdE1hcFAtPlN5c1BvcnQgPSBNYXBQLT5TeXNQb3J0OworCSAgICBpZiAoKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpID09IDApCisJICAgICAgQ0NPUFkoIE1hcFAtPk5hbWUsIEhvc3RNYXBQLT5OYW1lLCBNQVhfTkFNRV9MRU4gKTsKKwkgICAgSG9zdE1hcFAtPkZsYWdzID0gU0xPVF9JTl9VU0UgfCBSVEFfQk9PVEVEOworI2lmIE5FRURfVE9fRklYCisJICAgIFJJT19TVl9CUk9BRENBU1QocC0+UklPSG9zdHNbaG9zdF0uc3ZGbGFnc1tNYXBQLT5JRC0xXSk7CisjZW5kaWYKKwkgICAgaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJCUhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKKworCSAgICBSSU9SZU1hcFBvcnRzKCBwLCAmcC0+UklPSG9zdHNbaG9zdF0sIEhvc3RNYXBQICk7CisJICAgIC8qCisJICAgICoqIEFkanVzdCAybmQgYmxvY2sgb2YgOCBwaGJzCisJICAgICovCisJICAgIGlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQlSSU9GaXhQaGJzKHAsICZwLT5SSU9Ib3N0c1tob3N0XSwgSG9zdE1hcFAtPklEIC0gMSk7CisKKwkgICAgaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUICkKKwkgICAgeworCQlpZiAoIEhvc3RNYXBQLT5TeXNQb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCisJCSAgICBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkgICAgcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJICAgIH0KKwkgICAgaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiU2Vjb25kIG1hcCBvZiBSVEEgJXMgYWRkZWQgdG8gY29uZmlndXJhdGlvblxuIiwKKwkJIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQyIC0gMV0uTmFtZSk7CisJICAgIGVsc2UKKwkgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgYWRkZWQgdG8gY29uZmlndXJhdGlvblxuIiwgTWFwUC0+TmFtZSk7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgcC0+UklPRXJyb3IuRXJyb3IgPSBVTktOT1dOX0hPU1RfTlVNQkVSOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbmtub3duIGhvc3QgJXhcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0pOworICAgIHJldHVybiAtRU5YSU87Cit9CisKKworaW50CitSSU9SZU1hcFBvcnRzKHAsIEhvc3RQLCBIb3N0TWFwUCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7CitzdHJ1Y3QgTWFwICpIb3N0TWFwUDsgCit7CisJcmVnaXN0ZXIgc3RydWN0IFBvcnQgKlBvcnRQOworCXVpbnQgU3ViRW50OworCXVpbnQgSG9zdFBvcnQ7CisJdWludCBTeXNQb3J0OworCXVzaG9ydCBSdGFUeXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tIb3N0TWFwUCggSG9zdE1hcFAgKTsKKyNlbmRpZgorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIk1hcHBpbmcgc3lzcG9ydCAlZCB0byBpZCAlZFxuIiwgKGludClIb3N0TWFwUC0+U3lzUG9ydCwgSG9zdE1hcFAtPklEKTsKKworCS8qCisJKiogV2UgbmVlZCB0byB0ZWxsIHRoZSBVbml4UnVwcyB3aGljaCBzeXNwb3J0IHRoZSBydXAgY29ycmVzcG9uZHMgdG8KKwkqLworCUhvc3RQLT5Vbml4UnVwc1tIb3N0TWFwUC0+SUQtMV0uQmFzZVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKworCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPT0gTk9fUE9SVCApCisJCXJldHVybigwKTsKKworCVJ0YVR5cGUgPSBHZXRVbml0VHlwZShIb3N0TWFwUC0+UnRhVW5pcXVlTnVtKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTWFwcGluZyBzeXNwb3J0ICVkLSVkXG4iLAorCQkJCShpbnQpSG9zdE1hcFAtPlN5c1BvcnQsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQrUE9SVFNfUEVSX1JUQS0xKTsKKworCS8qCisJKiogbm93IG1hcCBlYWNoIG9mIGl0cyBlaWdodCBwb3J0cworCSovCisJZm9yICggU3ViRW50PTA7IFN1YkVudDxQT1JUU19QRVJfUlRBOyBTdWJFbnQrKykgeworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgInN1YmVudCA9ICVkLCBIb3N0TWFwUC0+U3lzUG9ydCA9ICVkXG4iLCAKKwkJICBTdWJFbnQsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQpOworCQlTeXNQb3J0ID0gSG9zdE1hcFAtPlN5c1BvcnQrU3ViRW50OwkJLyogcG9ydG51bWJlciB3aXRoaW4gc3lzdGVtICovCisJCQkJCS8qIHBvcnRudW1iZXIgb24gaG9zdCAqLworCQkKKwkJSG9zdFBvcnQgPSAoSG9zdE1hcFAtPklELTEpKlBPUlRTX1BFUl9SVEErU3ViRW50OyAKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiYzEgcCA9ICVwLCBwLT5yaW9Qb3J0cCA9ICVwXG4iLCBwLCBwLT5SSU9Qb3J0cCk7CisJCVBvcnRQID0gcC0+UklPUG9ydHBbU3lzUG9ydF07CisjaWYgMAorCQlQb3J0UC0+VHR5UAk9ICZwLT5jaGFubmVsW1N5c1BvcnRdOworI2VuZGlmCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXAgcG9ydFxuIik7CisKKwkJLyoKKwkJKiogUG9pbnQgYXQgYWxsIHRoZSByZWFsIG5lYXQgZGF0YSBzdHJ1Y3R1cmVzCisJCSovCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJUG9ydFAtPkhvc3RQID0gSG9zdFA7CisJCVBvcnRQLT5DYWRkciA9IEhvc3RQLT5DYWRkcjsKKworCQkvKgorCQkqKiBUaGUgUGhiUCBjYW5ub3QgYmUgZmlsbGVkIGluIHlldAorCQkqKiB1bmxlc3MgdGhlIGhvc3QgaGFzIGJlZW4gYm9vdGVkCisJCSovCisJCWlmICgoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSA9PSBSQ19SVU5OSU5HKSB7CisJCQlzdHJ1Y3QgUEhCICpQaGJQID0gUG9ydFAtPlBoYlAgPSAmSG9zdFAtPlBoYlBbSG9zdFBvcnRdOworCQkJUG9ydFAtPlR4QWRkID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnR4X2FkZCkpOworCQkJUG9ydFAtPlR4U3RhcnQgPShXT1JEICopUklPX1BUUihIb3N0UC0+Q2FkZHIsUldPUkQoUGhiUC0+dHhfc3RhcnQpKTsKKwkJCVBvcnRQLT5UeEVuZCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT50eF9lbmQpKTsKKwkJCVBvcnRQLT5SeFJlbW92ZT0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLAorCQkJCQkJCQkJUldPUkQoUGhiUC0+cnhfcmVtb3ZlKSk7CisJCQlQb3J0UC0+UnhTdGFydCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT5yeF9zdGFydCkpOworCQkJUG9ydFAtPlJ4RW5kID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnJ4X2VuZCkpOworCQl9CisJCWVsc2UKKwkJCVBvcnRQLT5QaGJQID0gTlVMTDsKKworCQkvKgorCQkqKiBwb3J0IHJlbGF0ZWQgZmxhZ3MKKwkJKi8KKwkJUG9ydFAtPkhvc3RQb3J0CT0gSG9zdFBvcnQ7CisJCS8qCisJCSoqIEZvciBlYWNoIHBhcnQgb2YgYSAxNiBwb3J0IFJUQSwgUnVwTnVtIGlzIElEIC0gMS4KKwkJKi8KKwkJUG9ydFAtPlJ1cE51bSA9IEhvc3RNYXBQLT5JRCAtIDE7CisJCWlmIChIb3N0TWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkgeworCQkJUG9ydFAtPklEMgkJCSA9IEhvc3RNYXBQLT5JRDIgLSAxOworCQkJUG9ydFAtPlNlY29uZEJsb2NrCSA9IFRSVUU7CisJCX0KKwkJZWxzZSB7CisJCQlQb3J0UC0+SUQyCQkJID0gMDsKKwkJCVBvcnRQLT5TZWNvbmRCbG9jawkgPSBGQUxTRTsKKwkJfQorCQlQb3J0UC0+UnRhVW5pcXVlTnVtCT0gSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bTsKKworCQkvKgorCQkqKiBJZiB0aGUgcG9ydCB3YXMgYWxyZWFkeSBtYXBwZWQgdGhlbiB0aGF0cyBhbGwgd2UgbmVlZCB0byBkby4KKwkJKi8KKwkJaWYgKFBvcnRQLT5NYXBwZWQpIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgSG9zdE1hcFAtPkZsYWdzICY9IH5SVEFfTkVXQk9PVDsKKworCQlQb3J0UC0+U3RhdGUJCSA9IDA7CisJCVBvcnRQLT5Db25maWcJCT0gMDsKKwkJLyoKKwkJKiogQ2hlY2sgb3V0IHRoZSBtb2R1bGUgdHlwZSAtIGlmIGl0IGlzIHNwZWNpYWwgKHJlYWQgb25seSBldGMuKQorCQkqKiB0aGVuIHdlIG5lZWQgdG8gc2V0IGZsYWdzIGluIHRoZSBQb3J0UC0+Q29uZmlnLgorCQkqKiBOb3RlOiBGb3IgMTYgcG9ydCBSVEEsIGFsbCBwb3J0cyBhcmUgb2YgdGhlIHNhbWUgdHlwZS4KKwkJKi8KKwkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikgeworCQkJUG9ydFAtPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tIb3N0UC0+VW5peFJ1cHMKKwkJCQlbSG9zdE1hcFAtPklELTFdLk1vZFR5cGVzXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJfSBlbHNlIHsKKwkJCWlmICggU3ViRW50IDwgUE9SVFNfUEVSX01PRFVMRSApCisJCQkJUG9ydFAtPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tMT05ZQkxFKEhvc3RQLT5Vbml4UnVwcworCQkJCVtIb3N0TWFwUC0+SUQtMV0uTW9kVHlwZXMpXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJCWVsc2UKKwkJCQlQb3J0UC0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW0hJTllCTEUoSG9zdFAtPlVuaXhSdXBzCisJCQkJW0hvc3RNYXBQLT5JRC0xXS5Nb2RUeXBlcyldLkZsYWdzW1N1YkVudCAlIFBPUlRTX1BFUl9NT0RVTEVdOworCQl9CisKKwkJLyoKKwkJKiogbW9yZSBwb3J0IHJlbGF0ZWQgZmxhZ3MKKwkJKi8KKwkJUG9ydFAtPlBvcnRTdGF0ZQk9IDA7CisJCVBvcnRQLT5Nb2RlbUxpbmVzCT0gMDsKKwkJUG9ydFAtPk1vZGVtU3RhdGUJPSAwOworCQlQb3J0UC0+Q29va01vZGUJCT0gQ09PS19XRUxMOworCQlQb3J0UC0+UGFyYW1TZW0JCT0gMDsKKwkJUG9ydFAtPkZsdXNoQ21kQm9kZ2U9IDA7CisJCVBvcnRQLT5XZmx1c2hGbGFnCT0gMDsKKwkJUG9ydFAtPk1hZ2ljRmxhZ3MJPSAwOworCQlQb3J0UC0+TG9jawkJCT0gMDsKKwkJUG9ydFAtPlN0b3JlCQk9IDA7CisJCVBvcnRQLT5GaXJzdE9wZW4JPSAxOworCisJCS8qCisJCSoqIEJ1ZmZlcnMgJ24gdGhpbmdzCisJCSovCisJCVBvcnRQLT5SeERhdGFTdGFydAk9IDA7CisJCVBvcnRQLT5Db3IyQ29weQkgPSAwOworCQlQb3J0UC0+TmFtZQkJID0gJkhvc3RNYXBQLT5OYW1lWzBdOworI2lmZGVmIFNUQVRTCisJCWJ6ZXJvKCAoY2FkZHJfdCkmUG9ydFAtPlN0YXQsIHNpemVvZihzdHJ1Y3QgUklPU3RhdHMpICk7CisjZW5kaWYKKwkJUG9ydFAtPnN0YXRzR2F0aGVyID0gMDsKKwkJUG9ydFAtPnR4Y2hhcnMgPSAwOworCQlQb3J0UC0+cnhjaGFycyA9IDA7CisJCVBvcnRQLT5vcGVucyA9IDA7CisJCVBvcnRQLT5jbG9zZXMgPSAwOworCQlQb3J0UC0+aW9jdGxzID0gMDsKKwkJaWYgKCBQb3J0UC0+VHhSaW5nQnVmZmVyICkKKwkJCWJ6ZXJvKCBQb3J0UC0+VHhSaW5nQnVmZmVyLCBwLT5SSU9CdWZmZXJTaXplICk7CisJCWVsc2UgaWYgKCBwLT5SSU9CdWZmZXJTaXplICkgeworCQkJUG9ydFAtPlR4UmluZ0J1ZmZlciA9IHN5c2JyayhwLT5SSU9CdWZmZXJTaXplKTsKKwkJCWJ6ZXJvKCBQb3J0UC0+VHhSaW5nQnVmZmVyLCBwLT5SSU9CdWZmZXJTaXplICk7CisJCX0KKwkJUG9ydFAtPlR4QnVmZmVyT3V0CT0gMDsKKwkJUG9ydFAtPlR4QnVmZmVySW4JID0gMDsKKwkJUG9ydFAtPkRlYnVnCQk9IDA7CisJCS8qCisJCSoqIExhc3RSeFRnbCBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSByeCB0b2dnbGUgYml0IGZvciB0aGlzCisJCSoqIHBvcnQsIHRvIGJlIGNvbXBhcmVkIHdpdGggdGhlIHN0YXRlIG9mIHRoZSBuZXh0IHBrdCByZWNlaXZlZC4KKwkJKiogSWYgdGhlIHNhbWUsIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNhbWUgcnggcGt0IGZyb20gdGhlIFJUQQorCQkqKiB0d2ljZS4gSW5pdGlhbGlzZSB0byBhIHZhbHVlIG5vdCBlcXVhbCB0byBQSEJfUlhfVEdMIG9yIDAuCisJCSovCisJCVBvcnRQLT5MYXN0UnhUZ2wJPSB+KHVjaGFyKVBIQl9SWF9UR0w7CisKKwkJLyoKKwkJKiogYW5kIG1hcmsgdGhlIHBvcnQgYXMgdXNhYmxlCisJCSovCisJCVBvcnRQLT5NYXBwZWQgPSAxOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisJaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNNYXBwZWQgKQorCQlwLT5SSU9GaXJzdFBvcnRzTWFwcGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCA+IHAtPlJJT0xhc3RQb3J0c01hcHBlZCApCisJCXAtPlJJT0xhc3RQb3J0c01hcHBlZCA9IEhvc3RNYXBQLT5TeXNQb3J0OworCisJcmV0dXJuIDA7Cit9CisKK2ludAorUklPQ2hhbmdlTmFtZShwLCBNYXBQKQorc3RydWN0IHJpb19pbmZvICpwOworc3RydWN0IE1hcCogTWFwUDsgCit7CisJaW50IGhvc3Q7CisJc3RydWN0IE1hcCAqSG9zdE1hcFA7CisJY2hhciAqc3B0cjsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDaGFuZ2UgbmFtZSBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXgsIElEICVkLCBTeXNwb3J0ICVkXG4iLAorCQkJCQkJCQlNYXBQLT5Ib3N0VW5pcXVlTnVtLE1hcFAtPlJ0YVVuaXF1ZU51bSwKKwkJCQkJCQkJTWFwUC0+SUQsIChpbnQpTWFwUC0+U3lzUG9ydCk7CisKKwlpZiAoIE1hcFAtPklEID4gTUFYX1JVUCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkJhZCBJRCBpbiBtYXAgZW50cnkhXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBJRF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNYXBQLT5OYW1lW01BWF9OQU1FX0xFTi0xXSA9ICdcMCc7CisJc3B0ciA9IE1hcFAtPk5hbWU7CisKKwl3aGlsZSAoICpzcHRyICkgeworCQlpZiAoICpzcHRyPCcgJyB8fCAqc3B0cj4nficgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTmFtZSBlbnRyeSBjb250YWlucyBub24tcHJpbnRpbmcgY2hhcmFjdGVycyFcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzcHRyKys7CisJfQorCisJZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKKwkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSApIHsKKwkJCWlmICggKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkgeworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJaWYgKCBNYXBQLT5JRD09MCApIHsKKwkJCQlDQ09QWSggTWFwUC0+TmFtZSwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSwgTUFYX05BTUVfTEVOICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCUhvc3RNYXBQID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQtMV07CisKKwkJCWlmICggSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bSAhPSBNYXBQLT5SdGFVbmlxdWVOdW0gKSB7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBSVEFfTlVNQkVSX1dST05HOworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlDQ09QWSggTWFwUC0+TmFtZSwgSG9zdE1hcFAtPk5hbWUsIE1BWF9OQU1FX0xFTiApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcC0+UklPRXJyb3IuRXJyb3IgPSBVTktOT1dOX0hPU1RfTlVNQkVSOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbmtub3duIGhvc3QgJXhcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0pOworCXJldHVybiAtRU5YSU87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RpbWUuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDUyYmMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90aW1lLmgKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgIFQgSSBNIEUKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKworICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3Jpb3RpbWVfaAorI2RlZmluZSBfcmlvdGltZV9oIDEKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDUworc3RhdGljIGNoYXIgKl9yaW9fcmlvdGltZV9oX3NjY3MgPSAiQCgjKXJpb3RpbWUuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVFdPX1BPV0VSX0ZJRlRFRU4gKHVzaG9ydCkzMjc2OAorI2RlZmluZSBSaW9UaW1lKCkgICAgcmlvdGltZQorI2RlZmluZSBSaW9UaW1lQWZ0ZXIodGltZTEsdGltZTIpICgodXNob3J0KXRpbWUxIC0gKHVzaG9ydCl0aW1lMikgPCBUV09fUE9XRVJfRklGVEVFTgorI2RlZmluZSBSaW9UaW1lUGx1cyh0aW1lMSx0aW1lMikgKCh1c2hvcnQpdGltZTEgKyAodXNob3J0KXRpbWUyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbnZlcnQgYSBSSU8gdGljayAoMS8xMHRoIHNlY29uZCkKKyAqIGludG8gdHJhbnNwdXRlciBsb3cgcHJpb3JpdHkgdGlja3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKyNkZWZpbmUgUmlvVGltZVRvTG93KHRpbWUpICh0aW1lKigxMDAwMDAgLyA2NCkpCisjZGVmaW5lIFJpb0xvd1RvVGltZSh0aW1lKSAoKHRpbWUqNjQpLzEwMDAwMCkKKworI2RlZmluZSBSSU9URU5USFNFQ09ORCAodXNob3J0KTEKKyNkZWZpbmUgUklPU0VDT05EICh1c2hvcnQpKFJJT1RFTlRIU0VDT05EICogMTApCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2NTUwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKQEAgLTAsMCArMSwxMzc2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW90dHkuYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDcKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3R0eS5jCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb3R0eV9jX3NjY3NfID0gIkAoIylyaW90dHkuYwkxLjMiOworI2VuZGlmCisKKworI2RlZmluZSBfX0VYUExJQ0lUX0RFRl9IX18KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisjaW5jbHVkZSAicGFyYW0uaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAic2FtLmgiCisKKyNpZiAwCitzdGF0aWMgdm9pZCB0dHlzZXRoX3B2KHN0cnVjdCBQb3J0ICosIHN0cnVjdCB0dHlzdGF0aWNzICosIAorCQkJCXN0cnVjdCB0ZXJtaW9zICpzZywgaW50KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBSSU9DbGVhclVwKHN0cnVjdCBQb3J0ICpQb3J0UCk7CitpbnQgUklPU2hvcnRDb21tYW5kKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IFBvcnQgKlBvcnRQLCAKKwkJCSAgIGludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKTsKKworI2lmIDAKK3N0YXRpYyBpbnQgUklPQ29va01vZGUoc3RydWN0IHR0eXN0YXRpY3MgKik7CisjZW5kaWYKKworZXh0ZXJuIGludAljb252X3ZiW107CS8qIG5vdyBkZWZpbmVkIGluIHR0eW1nci5jICovCitleHRlcm4gaW50CWNvbnZfYnZbXTsJLyogbm93IGRlZmluZWQgaW4gdHR5bWdyLmMgKi8KKyAKKy8qCisqKiAxNi4wOS4xOTk4IEFSRyAtIEZpeCB0byBidWlsZCByaW90dHkuay5vIGZvciBNb2R1bGFyIEtlcm5lbCBTdXBwb3J0CisqKgorKiogZXAuZGVmLmggaXMgbmVjZXNzYXJ5IGZvciBNb2R1bGFyIEtlcm5lbCBTdXBwb3J0CisqKiBETyBOT1QgcGxhY2UgYW55IGtlcm5lbCAnZXh0ZXJuJ3MgYWZ0ZXIgdGhpcyBsaW5lCisqKiBvciB0aGlzIHNvdXJjZSBmaWxlIHdpbGwgbm90IGJ1aWxkIHJpb3R0eS5rLm8KKyovCisjaWZkZWYgdUxZTlgKKyNpbmNsdWRlIDxlcC5kZWYuaD4KKyNlbmRpZgorCisjaWZkZWYgTkVFRF9USElTMgorc3RhdGljIHN0cnVjdCBvbGRfc2d0dHliIAorZGVmYXVsdF9zZyA9IAoreyAKKwlCMTkyMDAsIEIxOTIwMCwJCQkJLyogaW5wdXQgYW5kIG91dHB1dCBzcGVlZCAqLyAKKwknSCcgLSAnQCcsCQkJCQkvKiBlcmFzZSBjaGFyICovIAorCS0xLAkJCQkJCQkvKiAybmQgZXJhc2UgY2hhciAqLyAKKwknVScgLSAnQCcsCQkJCQkvKiBraWxsIGNoYXIgKi8gCisJRUNITyB8IENSTU9ELAkJCQkvKiBtb2RlICovIAorCSdDJyAtICdAJywJCQkJCS8qIGludGVycnVwdCBjaGFyYWN0ZXIgKi8gCisJJ1xcJyAtICdAJywJCQkJCS8qIHF1aXQgY2hhciAqLyAKKwknUScgLSAnQCcsCQkJCQkvKiBzdGFydCBjaGFyICovCisJJ1MnIC0gJ0AnLAkJCQkJLyogc3RvcCBjaGFyICovIAorCSdEJyAtICdAJywJCQkJCS8qIEVPRiAqLworCS0xLAkJCQkJCQkvKiBicmsgKi8KKwkoTENSVEJTIHwgTENSVEVSQSB8IExDUlRLSUwgfCBMQ1RMRUNIKSwJLyogbG9jYWwgbW9kZSB3b3JkICovIAorCSdaJyAtICdAJywJCQkJCS8qIHByb2Nlc3Mgc3RvcCAqLworCSdZJyAtICdAJywJCQkJCS8qIGRlbGF5ZWQgc3RvcCAqLworCSdSJyAtICdAJywJCQkJCS8qIHJlcHJpbnQgbGluZSAqLyAKKwknTycgLSAnQCcsCQkJCQkvKiBmbHVzaCBvdXRwdXQgKi8KKwknVycgLSAnQCcsCQkJCQkvKiB3b3JkIGVyYXNlICovCisJJ1YnIC0gJ0AnCQkJCQkvKiBsaXRlcmFsIG5leHQgY2hhciAqLworfTsKKyNlbmRpZgorCisKK2V4dGVybiBzdHJ1Y3QgcmlvX2luZm8gKnA7CisKKworaW50CityaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJlZ2lzdGVyIHVpbnQgU3lzUG9ydDsKKwlpbnQgTW9kZW07CisJaW50IHJlcGVhdF90aGlzID0gMjUwOworCXN0cnVjdCBQb3J0ICpQb3J0UDsJCSAvKiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbCA9IDA7CisKKwlmdW5jX2VudGVyICgpOworCisJLyogTWFrZSBzdXJlIGRyaXZlcl9kYXRhIGlzIE5VTEwgaW4gY2FzZSB0aGUgcmlvIGlzbid0IGJvb3RlZCBqZXQuIEVsc2UgZ3NfY2xvc2UKKwkgICBpcyBnb2luZyB0byBvb3BzLgorCSovCisJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisgICAgICAgIAorCVN5c1BvcnQgPSByaW9fbWlub3IodHR5KTsKKwlNb2RlbSAgID0gcmlvX2lzbW9kZW0odHR5KTsKKworCWlmICggcC0+UklPRmFpbGVkICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlN5c3RlbSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlwc2V0ZXJyKEVOWElPKTsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBvcGVuIFN5c1BvcnQgJWQgKCVzKSAobWFwcGVkOiVkKVxuIiwKKwkgICAgICAgU3lzUG9ydCwgIE1vZGVtID8gIk1vZGVtIiA6ICJ0dHkiLAorCQkJCSAgIHAtPlJJT1BvcnRwW1N5c1BvcnRdLT5NYXBwZWQpOworCisJLyoKKwkqKiBWYWxpZGF0ZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSBsZWdpdGltYXRlIHJlcXVlc3QuCisJKiogQ3VycmVudGx5LCBqdXN0IGNoZWNrIHRoYXQgd2UgYXJlIG9wZW5pbmcgYSBwb3J0IG9uCisJKiogYSBob3N0IGNhcmQgdGhhdCBhY3R1YWxseSBleGlzdHMsIGFuZCB0aGF0IHRoZSBwb3J0CisJKiogaGFzIGJlZW4gbWFwcGVkIG9udG8gYSBob3N0LgorCSovCisJaWYgKFN5c1BvcnQgPj0gUklPX1BPUlRTKSB7CS8qIG91dCBvZiByYW5nZSA/ICovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiSWxsZWdhbCBwb3J0IG51bWJlciAlZFxuIixTeXNQb3J0KTsKKwkJcHNldGVycihFTlhJTyk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJKiogR3JhYiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0dWN0dXJlCisJKi8KKwlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOwkvKiBHZXQgY29udHJvbCBzdHJ1YyAqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUG9ydFA6ICVwXG4iLCBQb3J0UCk7CisJaWYgKCAhUG9ydFAtPk1hcHBlZCApIHsJLyogd2UgYXJlbid0IG1hcHBlZCB5ZXQhICovCisJCS8qCisJCSoqIFRoZSBzeXN0ZW0gZG9lc24ndCBrbm93IHdoaWNoIFJUQSB0aGlzIHBvcnQKKwkJKiogY29ycmVzcG9uZHMgdG8uCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBub3QgbWFwcGVkIGludG8gc3lzdGVtXG4iKTsKKwkJZnVuY19leGl0ICgpOworCQlwc2V0ZXJyKEVOWElPKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl0dHktPmRyaXZlcl9kYXRhID0gUG9ydFA7CisKKwlQb3J0UC0+Z3MudHR5ID0gdHR5OworCVBvcnRQLT5ncy5jb3VudCsrOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICIlZCBieXRlcyBpbiB0eCBidWZmZXJcbiIsCisJCQkJICAgUG9ydFAtPmdzLnhtaXRfY250KTsKKworCXJldHZhbCA9IGdzX2luaXRfcG9ydCAoJlBvcnRQLT5ncyk7CisJaWYgKHJldHZhbCkgeworCQlQb3J0UC0+Z3MuY291bnQtLTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJLyoKKwkqKiBJZiB0aGUgaG9zdCBoYXNuJ3QgYmVlbiBib290ZWQgeWV0LCB0aGVuIAorCSoqIGZhaWwKKwkqLworCWlmICggKFBvcnRQLT5Ib3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiSG9zdCBub3QgcnVubmluZ1xuIik7CisJCXBzZXRlcnIoRU5YSU8pOworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkqKiBJZiB0aGUgUlRBIGhhcyBub3QgYm9vdGVkIHlldCBhbmQgdGhlIHVzZXIgaGFzIGNob29zZW4gdG8gYmxvY2sKKwkqKiB1bnRpbCB0aGUgUlRBIGlzIHByZXNlbnQgdGhlbiB3ZSBtdXN0IHNwaW4gaGVyZSB3YWl0aW5nIGZvcgorCSoqIHRoZSBSVEEgdG8gYm9vdC4KKwkqLworI2lmIDAKKwlpZiAoIShQb3J0UC0+SG9zdFAtPk1hcHBpbmdbUG9ydFAtPlJ1cE51bV0uRmxhZ3MgJiBSVEFfQk9PVEVEKSkgeworCQlpZiAoUG9ydFAtPldhaXRVbnRpbEJvb3RlZCkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSVEEgdG8gYm9vdFxuIik7CisJCQlkbyB7CisJCQkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBFSU5UUiBpbiBkZWxheSBcbiIpOworCQkJCQlmdW5jX2V4aXQgKCk7CisJCQkJCXJldHVybiAtRUlOVFI7CisJCQkJfQorCQkJCWlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUlRBIHRvIGJvb3QgdGltZW91dFxuIik7CisJCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCQkJcHNldGVycihFSU5UUik7CisJCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJfSB3aGlsZSghKFBvcnRQLT5Ib3N0UC0+TWFwcGluZ1tQb3J0UC0+UnVwTnVtXS5GbGFncyAmIFJUQV9CT09URUQpKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIGhhcyBiZWVuIGJvb3RlZFxuIik7CisJCX0gZWxzZSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBuZXZlciBib290ZWRcbiIpOworCQkJcHNldGVycihFTlhJTyk7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbHNlCisJLyogSSBmaW5kIHRoZSBhYm92ZSBjb2RlIGEgYml0IGhhaXJ5LiBJIGZpbmQgdGhlIGJlbG93IGNvZGUKKyAgICAgICAgICAgZWFzaWVyIHRvIHJlYWQgYW5kIHNob3J0ZXIuIE5vdywgaWYgaXQgd29ya3MgdG9vIHRoYXQgd291bGQKKwkgICBiZSBncmVhdC4uLiAtLSBSRVcgCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNoZWNraW5nIGlmIFJUQSBoYXMgYm9vdGVkLi4uIFxuIik7CisJd2hpbGUgKCEoUG9ydFAtPkhvc3RQLT5NYXBwaW5nW1BvcnRQLT5SdXBOdW1dLkZsYWdzICYgUlRBX0JPT1RFRCkpIHsKKwkgIGlmICghUG9ydFAtPldhaXRVbnRpbEJvb3RlZCkgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBuZXZlciBib290ZWRcbiIpOworCSAgICBmdW5jX2V4aXQgKCk7CisJICAgIHJldHVybiAtRU5YSU87CisJICB9CisKKwkgIC8qIFVuZGVyIExpbnV4IHlvdSdkIG5vcm1hbGx5IHVzZSBhIHdhaXQgaW5zdGVhZCBvZiB0aGlzCisJICAgICBidXN5LXdhaXRpbmcuIEknbGwgc3RpY2sgd2l0aCB0aGUgb2xkIGltcGxlbWVudGF0aW9uIGZvcgorCSAgICAgbm93LiAtLVJFVyAKKwkgICovCisJICBpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBX3dhaXRfZm9yX2Jvb3Q6IEVJTlRSIGluIGRlbGF5IFxuIik7CisJICAgIGZ1bmNfZXhpdCAoKTsKKwkgICAgcmV0dXJuIC1FSU5UUjsKKwkgIH0KKwkgIGlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUlRBIHRvIGJvb3QgdGltZW91dFxuIik7CisJICAgIGZ1bmNfZXhpdCAoKTsKKwkgICAgcmV0dXJuIC1FSU87CisJICB9CisJfQorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIGhhcyBiZWVuIGJvb3RlZFxuIik7CisjZW5kaWYKKyNpZiAwCisJdHAgPSAgUG9ydFAtPlR0eVA7CQkvKiBnZXQgdHR5IHN0cnVjdCAqLworI2VuZGlmCisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlnb3RvIGJvbWJvdXQ7CisJfQorI2lmIDAKKwlyZXR2YWwgPSBnc19pbml0X3BvcnQoJlBvcnRQLT5ncyk7CisJaWYgKHJldHZhbCl7CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisjZW5kaWYKKworCS8qCisJKiogSWYgdGhlIHBvcnQgaXMgaW4gdGhlIGZpbmFsIHRocm93cyBvZiBiZWluZyBjbG9zZWQsCisJKiogd2Ugc2hvdWxkIHdhaXQgaGVyZSAocG9saXRlbHkpLCB3YWl0aW5nCisJKiogZm9yIGl0IHRvIGZpbmlzaCwgc28gdGhhdCBpdCBkb2Vzbid0IGNsb3NlIHVzIQorCSovCisJd2hpbGUgKCAoUG9ydFAtPlN0YXRlICYgUklPX0NMT1NJTkcpICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUklPX0NMT1NJTkcgdG8gZ28gYXdheVxuIik7CisJCWlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpZGxlIGNsb3NlZCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKKwkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCXJldHZhbCA9IC1FSU5UUjsKKwkJCWdvdG8gYm9tYm91dDsKKwkJfQorCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOyAKKwkJCXJldHZhbCA9IC1FSU5UUjsKKwkJCWdvdG8gYm9tYm91dDsKKwkJfQorCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7IAorCX0KKworCWlmICggIVBvcnRQLT5NYXBwZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUG9ydCB1bm1hcHBlZCB3aGlsZSBjbG9zaW5nIVxuIik7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR2YWwgPSAtRU5YSU87CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJZ290byBib21ib3V0OworCX0KKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBSSU8gaGFzIGl0J3Mgb3duIENUU0ZMT1cgYW5kIFJUU0ZMT1cgZmxhZ3MgaW4gJ0NvbmZpZycgaW4gdGhlIHBvcnQgc3RydWN0dXJlLAorKiogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmxhZ3MgYXJlIGNsZWFyIHdoZW4gdGhlIHBvcnQgaXMgb3BlbmVkLgorKi8KKwkvKiBVaD8gU3VwcG9zZSBJIHR1cm4gdGhlc2Ugb24gYW5kIHRoZW4gYW5vdGhlciBwcm9jZXNzIG9wZW5zCisJICAgdGhlIHBvcnQgYWdhaW4/IFRoZSBmbGFncyBnZXQgY2xlYXJlZCEgTm90IGdvb2QuIC0tIFJFVyAqLworCWlmICggIShQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkgKSB7CisJCVBvcnRQLT5Db25maWcgJj0gfihSSU9fQ1RTRkxPV3xSSU9fUlRTRkxPVyk7CisJfQorCisJaWYgKCEoUG9ydFAtPmZpcnN0T3BlbikpIHsJLyogRmlyc3QgdGltZSA/ICovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiRmlyc3Qgb3BlbiBmb3IgdGhpcyBwb3J0XG4iKTsKKwkKKworCQlQb3J0UC0+Zmlyc3RPcGVuKys7CisJCVBvcnRQLT5Db29rTW9kZSA9IDA7IC8qIFhYWCBSSU9Db29rTW9kZSh0cCk7ICovCisJCVBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKworCQkvKiBUZW50YXRpdmUgZml4IGZvciBidWcgUFIyNy4gRGlkbid0IHdvcmsuICovCisJCS8qIFBvcnRQLT5ncy54bWl0X2NudCA9IDA7ICovCisKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisjaWZkZWYgTkVFRF9USElTCisJCXR0eXNldGgoUG9ydFAsIHRwLCAoc3RydWN0IG9sZF9zZ3R0eWIgKikmZGVmYXVsdF9zZyk7CisjZW5kaWYKKworCQkvKiBTb21lb25lIGV4cGxhaW4gdG8gbWUgd2h5IHRoaXMgZGVsYXkvY29uZmlnIGlzCisgICAgICAgICAgICAgICAgICAgaGVyZS4gSWYgSSByZWFkIHRoZSBkb2NzIGNvcnJlY3RseSB0aGUgIm9wZW4iCisgICAgICAgICAgICAgICAgICAgY29tbWFuZCBwaWdneWJhY2tzIHRoZSBwYXJhbWV0ZXJzIGltbWVkaWF0ZWx5LiAKKwkJICAgLS0gUkVXICovCisJCVJJT1BhcmFtKFBvcnRQLE9QRU4sTW9kZW0sT0tfVE9fU0xFRVApOwkJLyogT3BlbiB0aGUgcG9ydCAqLworI2lmIDAKKwkJLyogVGhpcyBkZWxheSBvZiAxIHNlY29uZCB3YXMgYW5ub3lpbmcuIEkgcmVtb3ZlZCBpdC4gLS0gUkVXICovCisJCVJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKjEwKTsKKwkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJLyogQ29uZmlnIHRoZSBwb3J0ICovCisjZW5kaWYKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJCS8qCisJCSoqIHdhaXQgZm9yIHRoZSBwb3J0IHRvIGJlIG5vdCBjbG9zZWQuCisJCSovCisJCXdoaWxlICggIShQb3J0UC0+UG9ydFN0YXRlICYgUE9SVF9JU09QRU4pICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIFBPUlRfSVNPUEVOLWN1cnJlbnRseSAleFxuIixQb3J0UC0+UG9ydFN0YXRlKTsKKy8qCisqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc1OQorKiogKFBhcnQpIGZpeCBmb3IgcG9ydCBiZWluZyB0cmFzaGVkIHdoZW4gb3BlbmVkIHdoaWxzdCBSVEEgImRpc2Nvbm5lY3RlZCIKKyoqIFRha2Ugb3V0IHRoZSBsaW1pdGVkIHdhaXQgLSBub3cgd2FpdCBmb3IgZXZlciBvciB1bnRpbCB1c2VyCisqKiBiYW5ncyB1cyBvdXQuCisqKgorCQkJaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkJCQlyaW9fZHByaW50KFJJT19ERUJVR19UVFksICgiV2FpdGluZyBmb3Igb3BlbiB0byBmaW5pc2ggdGltZWQgb3V0LlxuIikpOworCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorKioKKyovCisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWlmIChSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG9wZW4gdG8gZmluaXNoIGJyb2tlbiBieSBzaWduYWxcbiIpOworCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOworCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQl9CisKKwkJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCSAgcmV0dmFsID0gLUVJTzsKK2JvbWJvdXQ6CisJCSAgLyogCQkJUklPQ2xlYXJVcCggUG9ydFAgKTsgKi8KKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlBPUlRfSVNPUEVOIGZvdW5kXG4iKTsKKwl9CisKKyNpZmRlZiBNT0RFTV9TVVBQT1JUIAorCWlmIChNb2RlbSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIk1vZGVtIC0gdGVzdCBmb3IgY2FycmllclxuIik7CisJCS8qCisJCSoqIEFDVElPTgorCQkqKiBpbnNlcnQgdGVzdCBmb3IgY2FycmllciBoZXJlLiAtLSA/Pz8KKwkJKiogSSBhbHJlYWR5IHNlZSB0aGF0IHRlc3QgaGVyZS4gV2hhdCdzIHRoZSBkZWFsPyAtLSBSRVcKKwkJKi8KKwkJaWYgKChQb3J0UC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSB8fCAoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9DRCkpCisJCXsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAib3BlbiglZCkgTW9kZW0gY2FyciBvblxuIiwgU3lzUG9ydCk7CisJCQkvKgorCQkJdHAtPnRtLmNfc3RhdGUgfD0gQ0FSUl9PTjsKKwkJCXdha2V1cCgoY2FkZHJfdCkgJnRwLT50bS5jX2NhbnEpOworCQkJKi8KKwkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0FSUl9PTjsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJlBvcnRQLT5ncy5vcGVuX3dhaXQpOworCQl9CisJCWVsc2UgLyogbm8gY2FycmllciAtIHdhaXQgZm9yIERDRCAqLworCQl7CisJCSAgLyoKKwkJCXdoaWxlICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfc3RhdGUgJiBDQVJSX09OKSAmJiAKKwkJCSAgICAgICAhKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiAhcC0+UklPSGFsdGVkICkKKwkJICAqLworCQkJd2hpbGUgKCEoUG9ydFAtPlN0YXRlICYgUklPX0NBUlJfT04pICYmIAorCQkJICAgICAgICEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICFwLT5SSU9IYWx0ZWQgKSB7CisKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIHNsZWVwaW5nIGZvciBjYXJyIG9uXG4iLFN5c1BvcnQpOworCQkJCS8qCisJCQkJUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19zdGF0ZSB8PSBXT1BFTjsKKwkJCQkqLworCQkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fV09QRU47CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJaWYgKFJJT0RlbGF5IChQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpCisjaWYgMAorCQkJCWlmICggc2xlZXAoKGNhZGRyX3QpJnRwLT50bS5jX2NhbnFvLCBUVElQUkl8UENBVENIKSkKKyNlbmRpZgorCQkJCXsKKwkJCQkJLyoKKwkJCQkJKiogQUNUSU9OOiB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgZ29vZCB0aGluZworCQkJCQkqKiB0byBkbyBoZXJlLiAtLSA/Pz8KKwkJCQkJKiogSSB0aGluayBpdCdzIE9LLiAtLSBSRVcKKwkJCQkJKi8KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJvcGVuKCVkKSBzbGVlcGluZyBmb3IgY2FyciBicm9rZW4gYnkgc2lnbmFsXG4iLAorCQkJCQkgICAgICAgU3lzUG9ydCk7CisJCQkJCVJJT1ByZWVtcHRpdmVDbWQoIHAsIFBvcnRQLCBGQ0xPU0UgKTsKKwkJCQkJLyoKKwkJCQkJdHAtPnRtLmNfc3RhdGUgJj0gfldPUEVOOworCQkJCQkqLworCQkJCQlQb3J0UC0+U3RhdGUgJj0gflJJT19XT1BFTjsKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCQl9CisJCQl9CisJCQlQb3J0UC0+U3RhdGUgJj0gflJJT19XT1BFTjsKKwkJfQorCQlpZiAoIHAtPlJJT0hhbHRlZCApCisJCQlnb3RvIGJvbWJvdXQ7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiU2V0dGluZyBSSU9fTU9QRU5cbiIpOworCQlQb3J0UC0+U3RhdGUgfD0gUklPX01PUEVOOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJCS8qCisJCSoqIEFDVElPTgorCQkqKiBEaXJlY3QgbGluZSBvcGVuIC0gZm9yY2UgY2FycmllciAod2lsbCBwcm9iYWJseSBtZWFuCisJCSoqIHRoYXQgc2xlZXBpbmcgTW9kZW0gbGluZSBmdWJhcikKKwkJKi8KKwkJUG9ydFAtPlN0YXRlIHw9IFJJT19MT1BFTjsKKwl9CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJZ290byBib21ib3V0OworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiaGlnaCBsZXZlbCBvcGVuIGRvbmVcbiIpOworCisjaWZkZWYgU1RBVFMKKwlQb3J0UC0+U3RhdC5PcGVuQ250Kys7CisjZW5kaWYKKwkvKgorCSoqIENvdW50IG9wZW5zIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJKi8KKwlpZiAoUG9ydFAtPnN0YXRzR2F0aGVyKQorCQlQb3J0UC0+b3BlbnMrKzsKKworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUmV0dXJuaW5nIGZyb20gb3BlblxuIik7CisJZnVuY19leGl0ICgpOworCXJldHVybiAwOworfQorCisvKgorKiogUklPQ2xvc2UgdGhlIHBvcnQuCisqKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGlua3MgdGhhdCB0aGlzIGlzIGxhc3QgY2xvc2UgZm9yIHRoZSBkZXZpY2UuCisqKiBBcyB0aGVyZSBhcmUgdHdvIGludGVyZmFjZXMgdG8gdGhlIHBvcnQgKE1vZGVtIGFuZCB0dHkpLCB3ZSBuZWVkIHRvCisqKiBjaGVjayB0aGF0IGJvdGggYXJlIGNsb3NlZCBiZWZvcmUgd2UgY2xvc2UgdGhlIGRldmljZS4KKyovIAoraW50CityaW90Y2xvc2Uodm9pZCAgKnB0cikKK3sKKyNpZiAwCisJcmVnaXN0ZXIgdWludCBTeXNQb3J0ID0gZGV2OworCXN0cnVjdCB0dHlzdGF0aWNzICp0cDsJCS8qIHBvaW50ZXIgdG8gb3VyIHR0eXN0cnVjdCAqLworI2VuZGlmCisJc3RydWN0IFBvcnQgKlBvcnRQID1wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIHBvcnQgc3RydWN0dXJlICovCisJaW50IGRlbGV0ZWQgPSAwOworCWludAl0cnkgPSAtMTsgLyogRGlzYWJsZSB0aGUgdGltZW91dHMgYnkgc2V0dGluZyB0aGVtIHRvIC0xICovCisJaW50CXJlcGVhdF90aGlzID0gLTE7IC8qIENvbmdyYXRzIHRvIHRob3NlIGhhdmluZyAxNSB5ZWFycyBvZiAKKwkJCQkgICAgIHVwdGltZSEgKFlvdSBnZXQgdG8gYnJlYWsgdGhlIGRyaXZlci4pICovCisJbG9uZyBlbmRfdGltZTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBNb2RlbTsKKwlpbnQgcnYgPTA7CisJCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IGNsb3NlIFN5c1BvcnQgJWRcbiIsUG9ydFAtPlBvcnROdW0pOworCisJLyogUG9ydFAgPSBwLT5SSU9Qb3J0cFtTeXNQb3J0XTsgKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlBvcnQgaXMgYXQgYWRkcmVzcyAweCV4XG4iLChpbnQpUG9ydFApOworCS8qIHRwID0gUG9ydFAtPlR0eVA7Ki8JCQkvKiBHZXQgdHR5ICovCisJdHR5ID0gUG9ydFAtPmdzLnR0eTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRUWSBpcyBhdCBhZGRyZXNzIDB4JXhcbiIsKGludCl0dHkpOworCisJaWYgKFBvcnRQLT5ncy5jbG9zaW5nX3dhaXQpIAorCQllbmRfdGltZSA9IGppZmZpZXMgKyBQb3J0UC0+Z3MuY2xvc2luZ193YWl0OworCWVsc2UgCisJCWVuZF90aW1lID0gamlmZmllcyArIE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCisJTW9kZW0gPSByaW9faXNtb2RlbSh0dHkpOworI2lmIDAKKwkvKiBXaGF0IEYuQ0tJTkcgY2FjaGU/IEV2ZW4gdGhlbiwgYSBoaWdseSBpZGxlIG11bHRpcHJvY2Vzc29yLAorCSAgIHN5c3RlbSB3aXRoIGxhcmdlIGNhY2hlcyB0aGlzIHdvbid0IHdvcmsgLiBCZXR0ZXIgZmluZCBvdXQgd2hlbiAKKwkgICB0aGlzIGRvZXNuJ3Qgd29yayBhc2FwLCBhbmQgZml4IHRoZSBjYXVzZS4gIC0tIFJFVyAqLworCQorCVJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKjEwKTsJLyogVG8gZmx1c2ggdGhlIGNhY2hlICovCisjZW5kaWYKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkvKgorCSoqIFNldHRpbmcgdGhpcyBmbGFnIHdpbGwgbWFrZSBhbnkgcHJvY2VzcyB0cnlpbmcgdG8gb3BlbgorCSoqIHRoaXMgcG9ydCBibG9jayB1bnRpbCB3ZSBhcmUgY29tcGxldGUgY2xvc2luZyBpdC4KKwkqLworCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0xPU0lORzsKKworCWlmICggKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDbG9zZSBvbiBkZWxldGVkIFJUQVxuIik7CisJCWRlbGV0ZWQgPSAxOworCX0KKwkKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJUklPQ2xlYXJVcCggUG9ydFAgKTsKKwkJcnYgPSAtRUlPOworCQlnb3RvIGNsb3NlX2VuZDsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsZWFyIGJpdHNcbiIpOworCS8qCisJKiogY2xlYXIgdGhlIG9wZW4gYml0cyBmb3IgdGhpcyBkZXZpY2UKKwkqLworCVBvcnRQLT5TdGF0ZSAmPSAoTW9kZW0gPyB+UklPX01PUEVOIDogflJJT19MT1BFTik7CisJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0FSUl9PTjsKKwlQb3J0UC0+TW9kZW1TdGF0ZSAmPSB+TVNWUjFfQ0Q7CisJLyoKKwkqKiBJZiB0aGUgZGV2aWNlIHdhcyBvcGVuIGFzIGJvdGggYSBNb2RlbSBhbmQgYSB0dHkgbGluZQorCSoqIHRoZW4gd2UgbmVlZCB0byB3aW1wIG91dCBoZXJlLCBhcyB0aGUgcG9ydCBoYXMgbm90IHJlYWxseQorCSoqIGJlZW4gZmluYWxseSBjbG9zZWQgKGdlZSwgd2hpenohKSBUaGUgdGVzdCBoZXJlIHVzZXMgdGhlCisJKiogYml0IGZvciB0aGUgT1RIRVIgbW9kZSBvZiBvcGVyYXRpb24sIHRvIHNlZSBpZiBUSEFUIGlzCisJKiogc3RpbGwgYWN0aXZlIQorCSovCisJaWYgKCAoUG9ydFAtPlN0YXRlICYgKFJJT19MT1BFTnxSSU9fTU9QRU4pKSApIHsKKwkJLyoKKwkJKiogVGhlIHBvcnQgaXMgc3RpbGwgb3BlbiBmb3IgdGhlIG90aGVyIHRhc2sgLQorCQkqKiByZXR1cm4sIHByZXRlbmRpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgYWN0aXZlLgorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNoYW5uZWwgJWQgc3RpbGwgb3BlbiAhXG4iLFBvcnRQLT5Qb3J0TnVtKTsKKwkJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0xPU0lORzsKKwkJaWYgKFBvcnRQLT5maXJzdE9wZW4pCisJCQlQb3J0UC0+Zmlyc3RPcGVuLS07CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NpbmcgZG93biAtIGV2ZXJ5dGhpbmcgbXVzdCBnbyFcbiIpOworCisJUG9ydFAtPlN0YXRlICY9IH5SSU9fRFlOT1JPRDsKKworCS8qCisJKiogVGhpcyBpcyB3aGVyZSB3ZSB3YWl0IGZvciB0aGUgcG9ydAorCSoqIHRvIGRyYWluIGRvd24gYmVmb3JlIGNsb3NpbmcuIEJ5ZS1ieWUuLi4uCisJKiogKFdlIG5ldmVyIG1lYW50IHRvIGRvIHRoaXMpCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRpbWVvdXQgMSBzdGFydHNcbiIpOworCisJaWYgKCFkZWxldGVkKQorCXdoaWxlICggKFBvcnRQLT5JblVzZSAhPSBOT1RfSU5VU0UpICYmICFwLT5SSU9IYWx0ZWQgJiYgCisJCShQb3J0UC0+VHhCdWZmZXJJbiAhPSBQb3J0UC0+VHhCdWZmZXJPdXQpICkgeworCQljcHJpbnRmKCJOZWVkIHRvIGZsdXNoIHRoZSB0dHlwb3J0XG4iKTsKKwkJaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkJCXJ2ID0gLUVJTlRSOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBub3QgaWRsZSBjbG9zZWQgYnJva2VuIGJ5IHNpZ25hbFxuIik7CisJCQlSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UgKTsgCisJCQlnb3RvIGNsb3NlX2VuZDsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNhbGxpbmcgdGltZW91dCB0byBmbHVzaCBpbiBjbG9zaW5nXG4iKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChSSU9EZWxheV9uaShQb3J0UCwgSFVORFJFRF9NUyoxMCkgPT0gUklPX0ZBSUwpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7CisJCQlydiA9IC1FSU5UUjsKKwkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWdvdG8gY2xvc2VfZW5kOworCQl9CisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisKKwlQb3J0UC0+VHhCdWZmZXJJbiA9IFBvcnRQLT5UeEJ1ZmZlck91dCA9IDA7CisJcmVwZWF0X3RoaXMgPSAweGZmOworCisJUG9ydFAtPkluVXNlID0gMDsKKwlpZiAoIChQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOfFJJT19NT1BFTikpICkgeworCQkvKgorCQkqKiBUaGUgcG9ydCBoYXMgYmVlbiByZS1vcGVuZWQgZm9yIHRoZSBvdGhlciB0YXNrIC0KKwkJKiogcmV0dXJuLCBwcmV0ZW5kaW5nIHRoYXQgd2UgYXJlIHN0aWxsIGFjdGl2ZS4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDaGFubmVsICVkIHJlLW9wZW4hXG4iLCBQb3J0UC0+UG9ydE51bSk7CisJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX0NMT1NJTkc7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlpZiAoUG9ydFAtPmZpcnN0T3BlbikKKwkJCVBvcnRQLT5maXJzdE9wZW4tLTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCWdvdG8gY2xvc2VfZW5kOworCX0KKworCQorCisJLyogQ2FuJ3QgY2FsbCBSSU9TaG9ydENvbW1hbmQgd2l0aCB0aGUgcG9ydCBsb2NrZWQuICovCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwlpZiAoUklPU2hvcnRDb21tYW5kKHAsIFBvcnRQLCBDTE9TRSwgMSwgMCkgPT0gUklPX0ZBSUwpIHsKKwkgIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsRkNMT1NFKTsKKwkgIGdvdG8gY2xvc2VfZW5kOworCX0KKworCWlmICghZGVsZXRlZCkKKwkgIHdoaWxlICh0cnkgJiYgKFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTikpIHsKKwkgICAgICAgIHRyeS0tOworCQlpZiAodGltZV9hZnRlciAoamlmZmllcywgZW5kX3RpbWUpKSB7CisJCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSdW4gb3V0IG9mIHRyaWVzIC0gZm9yY2UgdGhlIGJ1Z2dlciBzaHV0IVxuIiApOworCQkgIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsRkNMT1NFKTsKKwkJICBicmVhazsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NlOiBQb3J0U3RhdGU6SVNPUEVOIGlzICVkXG4iLCAKKwkJCQkJICAgUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKTsKKworCQlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCQlnb3RvIGNsb3NlX2VuZDsKKwkJfQorCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBFSU5UUiBpbiBkZWxheSBcbiIpOworCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCxGQ0xPU0UpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xvc2U6IHRyeSB3YXMgJWQgb24gY29tcGxldGlvblxuIiwgdHJ5ICk7CisgCisJLyogUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFKTsgKi8KKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBSSU8gaGFzIGl0J3Mgb3duIENUU0ZMT1cgYW5kIFJUU0ZMT1cgZmxhZ3MgaW4gJ0NvbmZpZycgaW4gdGhlIHBvcnQgc3RydWN0dXJlLCoqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZsYWdzIGFyZSBjbGVhciB3aGVuIHRoZSBwb3J0IGlzIG9wZW5lZC4KKyovCisJUG9ydFAtPkNvbmZpZyAmPSB+KFJJT19DVFNGTE9XfFJJT19SVFNGTE9XKTsKKworCisjaWZkZWYgU1RBVFMKKwlQb3J0UC0+U3RhdC5DbG9zZUNudCsrOworI2VuZGlmCisJLyoKKwkqKiBDb3VudCBvcGVucyBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSovCisJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJUG9ydFAtPmNsb3NlcysrOworCitjbG9zZV9lbmQ6CisJLyogWFhYOiBXaHkgd291bGQgYSAiREVMRVRFRCIgZmxhZyBiZSByZXNldCBoZXJlPyBJJ2QgaGF2ZQorCSAgIHRob3VnaHQgdGhhdCBhICJkZWxldGVkIiBmbGFnIG1lYW5zIHRoYXQgdGhlIHBvcnQgd2FzCisJICAgcGVybWFuZW50bHkgZ29uZSwgYnV0IGhlcmUgd2UgY2FuIG1ha2UgaXQgcmVhcHBlYXIgYnkgaXQKKwkgICBiZWluZyBpbiBjbG9zZSBkdXJpbmcgdGhlICJkZWxldGlvbiIuCisJKi8KKwlQb3J0UC0+U3RhdGUgJj0gfihSSU9fQ0xPU0lOR3xSSU9fREVMRVRFRCk7CisJaWYgKFBvcnRQLT5maXJzdE9wZW4pCisJCVBvcnRQLT5maXJzdE9wZW4tLTsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJldHVybiBmcm9tIGNsb3NlXG4iKTsKKwlyZXR1cm4gcnY7Cit9CisKKworLyoKKyoqIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgbGluZSBkaXNjaXBsaW5lLgorKiogVGhpcyByb3V0aW5lIGNhbiByZXR1cm4gb25lIG9mIHRocmVlIHZhbHVlczoKKyoqIENPT0tfUkFXIGlmIG5vIHByb2Nlc3NpbmcgaGFzIHRvIGJlIGRvbmUgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSBvciB0aGUgY2FyZAorKiogQ09PS19XRUxMIGlmIHRoZSBsaW5lIGRpc2NpcGxpbmUgbXVzdCBiZSB1c2VkIHRvIGRvIHRoZSBwcm9jZXNzaW5nCisqKiBDT09LX01FRElVTSBpZiB0aGUgY2FyZCBjYW4gZG8gYWxsIHRoZSBwcm9jZXNzaW5nIG5lY2Vzc2FyeS4KKyovCisjaWYgMAorc3RhdGljIGludAorUklPQ29va01vZGUoc3RydWN0IHR0eXN0YXRpY3MgKnRwKQoreworCS8qCisJKiogV2UgY2FuJ3QgaGFuZGxlIHRtLmNfbXN0YXRlICE9IDAgb24gU0NPCisJKiogV2UgY2FuJ3QgaGFuZGxlIG1hcHBpbmcKKwkqKiBXZSBjYW4ndCBoYW5kbGUgbm9uLXR0d3JpdGUgbGluZSBkaXNjLgorCSoqIFdlIGNhbid0IGhhbmRsZSBsZmxhZyBYQ0FTRQorCSoqIFdlIGNhbiBoYW5kbGUgb2ZsYWcgT1BPU1QgJiAoT0NSTkwsIE9OTENSLCBUQUIzKQorCSovCisKKyNpZmRlZiBDSEVDSworCUNoZWNrVHR5UCggdHAgKTsKKyNlbmRpZgorCWlmICghKHRwLT50bS5jX29mbGFnICYgT1BPU1QpKQkvKiBObyBwb3N0IHByb2Nlc3NpbmcgKi8KKwkJcmV0dXJuIENPT0tfUkFXOwkvKiBSYXcgbW9kZSBvL3AgKi8KKworCWlmICggdHAtPnRtLmNfbGZsYWcgJiBYQ0FTRSApCisJCXJldHVybiBDT09LX1dFTEw7CS8qIFVzZSBsaW5lIGRpc2MgKi8KKworCWlmICh0cC0+dG0uY19vZmxhZyAmIH4oT1BPU1QgfCBPTkxDUiB8IE9DUk5MIHwgVEFCMyApICkKKwkJcmV0dXJuIENPT0tfV0VMTDsJLyogVXNlIGxpbmUgZGlzYyBmb3Igc3RyYW5nZSBtb2RlcyAqLworCisJaWYgKCB0cC0+dG0uY19vZmxhZyA9PSBPUE9TVCApCS8qIElmIG9ubHkgT1BPU1QgaXMgc2V0LCBkbyBSQVcgKi8KKwkJcmV0dXJuIENPT0tfUkFXOworCisJLyoKKwkqKiBTbywgd2UgbmVlZCB0byBvdXRwdXQgcHJvY2VzcyEKKwkqLworCXJldHVybiBDT09LX01FRElVTTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorUklPQ2xlYXJVcChQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK3sKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJJT0hhbHRlZCBzZXRcbiIpOworCVBvcnRQLT5Db25maWcgPSAwOwkgIC8qIERpcmVjdCBzZW1hcGhvcmUgKi8KKwlQb3J0UC0+UG9ydFN0YXRlID0gMDsKKwlQb3J0UC0+Zmlyc3RPcGVuID0gMDsKKwlQb3J0UC0+Rmx1c2hDbWRCb2RnZSA9IDA7CisJUG9ydFAtPk1vZGVtU3RhdGUgPSBQb3J0UC0+Q29va01vZGUgPSAwOworCVBvcnRQLT5NYXBwZWQgPSAwOworCVBvcnRQLT5XZmx1c2hGbGFnID0gMDsKKwlQb3J0UC0+TWFnaWNGbGFncwk9IDA7CisJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwlQb3J0UC0+VHhCdWZmZXJJbiA9IDA7CisJUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKK30KKworLyoKKyoqIFB1dCBhIGNvbW1hbmQgb250byBhIHBvcnQuCisqKiBUaGUgUG9ydFBvaW50ZXIsIGNvbW1hbmQsIGxlbmd0aCBhbmQgYXJnIGFyZSBwYXNzZWQuCisqKiBUaGUgbGVuIGlzIHRoZSBsZW5ndGggKmluY2x1c2l2ZSogb2YgdGhlIGNvbW1hbmQgYnl0ZSwKKyoqIGFuZCBzbyBmb3IgYSBjb21tYW5kIHRoYXQgdGFrZXMgbm8gZGF0YSwgbGVuPT0xLgorKiogVGhlIGFyZyBpcyBhIHNpbmdsZSBieXRlLCBhbmQgaXMgb25seSB1c2VkIGlmIGxlbj09Mi4KKyoqIE90aGVyIHZhbHVlcyBvZiBsZW4gYXJlbid0IGFsbG93ZWQsIGFuZCB3aWxsIGNhdXNlCisqKiBhIHBhbmljLgorKi8KK2ludCBSSU9TaG9ydENvbW1hbmQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgUG9ydCAqUG9ydFAsCisJCWludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKQoreworCVBLVCAqUGFja2V0UDsKKwlpbnQJCXJldHJpZXMgPSAyMDsgLyogYXQgMTAgcGVyIHNlY29uZCAtPiAyIHNlY29uZHMgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJlbnRlcmluZyBzaG9ydGNvbW1hbmQuXG4iKTsKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisJaWYgKCBsZW4gPCAxIHx8IGxlbiA+IDIgKQorCQljcHJpbnRmKCgiU1RVUElEIExFTkdUSCAlZFxuIixsZW4pKTsKKyNlbmRpZgorCisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJTaG9ydCBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCS8qCisJKiogSWYgdGhlIHBvcnQgaXMgaW4gdXNlIGZvciBwcmUtZW1wdGl2ZSBjb21tYW5kLCB0aGVuIHdhaXQgZm9yIGl0IHRvIAorCSoqIGJlIGZyZWUgYWdhaW4uCisJKi8KKwl3aGlsZSAoIChQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSAmJiAhcC0+UklPSGFsdGVkICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpbiB1c2UgKCVkKVxuIiwgCisJCQkJCSAgIHJldHJpZXMpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKHJldHJpZXMtLSA8PSAwKSB7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJaWYgKFJJT0RlbGF5X25pKFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJTaG9ydCBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCXdoaWxlICggIWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsUG9ydFApICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyB0byBhZGQgc2hvcnQgY29tbWFuZCB0byBxdWV1ZSAoJWQpXG4iLCByZXRyaWVzKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChyZXRyaWVzLS0gPD0gMCkgeworCQkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAib3V0IG9mIHRyaWVzLiBGYWlsaW5nXG4iKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoIFJJT0RlbGF5X25pKFBvcnRQLCBIVU5EUkVEX01TKT09UklPX0ZBSUwgKSB7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCX0KKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCS8qCisJKiogc2V0IHRoZSBjb21tYW5kIGJ5dGUgYW5kIHRoZSBhcmd1bWVudCBieXRlCisJKi8KKwlXQllURShQYWNrZXRQLT5kYXRhWzBdICwgY29tbWFuZCk7CisKKwlpZiAoIGxlbj09MiApCisJCVdCWVRFKFBhY2tldFAtPmRhdGFbMV0gLCBhcmcpOworCisJLyoKKwkqKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGFuZCBzZXQgdGhlIGNvbW1hbmQgYml0LgorCSovCisJV0JZVEUoUGFja2V0UC0+bGVuICwgUEtUX0NNRF9CSVQgfCBsZW4pOworCisJYWRkX3RyYW5zbWl0KFBvcnRQKTsKKwkvKgorCSoqIENvdW50IGNoYXJhY3RlcnMgdHJhbnNtaXR0ZWQgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkqLworCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCVBvcnRQLT50eGNoYXJzICs9IGxlbjsKKworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiBwLT5SSU9IYWx0ZWQgPyBSSU9fRkFJTCA6IH5SSU9fRkFJTDsKK30KKworCisjaWYgMAorLyoKKyoqIFRoaXMgaXMgYW4gaW9jdGwgaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSB0d2VudGlldGggY2VudHVyeS4gWW91IGtub3cgd2hhdAorKiogaXRzIGFsbCBhYm91dC4KKyovCitpbnQKK3Jpb3Rpb2N0bChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBjbWQsIGNhZGRyX3QgYXJnKQoreworCXJlZ2lzdGVyIHN0cnVjdAkJUG9ydCAqUG9ydFA7CisJcmVnaXN0ZXIgc3RydWN0CQl0dHlzdGF0aWNzICp0cDsKKwlpbnQJCQkJCWN1cnJlbnQ7CisJaW50CQkJCQlQYXJhbVNlbUluY3JlbWVudGVkID0gMDsKKwlpbnQJCQkJCW9sZF9vZmxhZywgb2xkX2NmbGFnLCBvbGRfaWZsYWcsIGNoYW5nZWQsIG9sZGNvb2s7CisJaW50CQkJCQlpOworCXVuc2lnbmVkIGNoYXIJCXNpb19yZWdzWzVdOwkJLyogSGVyZSBiZSBtYWdpYyAqLworCXNob3J0CQkJCXZwaXhfY2ZsYWc7CisJc2hvcnQJCQkJZGl2aXNvcjsKKwlpbnQJCQkJCWJhdWQ7CisJdWludAkJCQlTeXNQb3J0ID0gcmlvX21pbm9yKHR0eSk7CisJaW50CQkJCU1vZGVtID0gcmlvX2lzbW9kZW0odHR5KTsKKwlpbnQJCQkJCWlvY3RsX3Byb2Nlc3NlZDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBpb2N0bCBTeXNQb3J0ICVkIGNvbW1hbmQgMHgleCBhcmd1bWVudCAweCV4ICVzXG4iLAorCQkJU3lzUG9ydCwgY21kLCBhcmcsIE1vZGVtPyJNb2RlbSI6InR0eSIpIDsKKworCWlmICggU3lzUG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQmFkIHBvcnQgbnVtYmVyICVkXG4iLCBTeXNQb3J0KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOworCXRwID0gUG9ydFAtPlR0eVA7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKyNpZmRlZiBTVEFUUworCVBvcnRQLT5TdGF0LklvY3RsQ250Kys7CisjZW5kaWYKKworCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkqKiBDb3VudCBpb2N0bHMgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkqLworCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCVBvcnRQLT5pb2N0bHMrKzsKKworCS8qCisJKiogU3BlY2lhbGl4IFJJTyBJb2N0bCBjYWxscworCSovCisJc3dpdGNoIChjbWQpIHsKKworCQljYXNlIFRDUklPVFJJQUQ6CisJCQlpZiAoIGFyZyApCisJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19UUklBRF9NT0RFOworCQkJZWxzZQorCQkJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX1RSSUFEX01PREU7CisJCQkvKgorCQkJKiogTm9ybWFsbHksIHdoZW4gaXN0cmlwIGlzIHNldCBvbiBhIHBvcnQsIGEgY29uZmlnIGlzCisJCQkqKiBzZW50IHRvIHRoZSBSVEEgaW5zdHJ1Y3RpbmcgdGhlIENEMTQwMCB0byBkbyB0aGUKKwkJCSoqIHN0cmlwcGluZy4gSW4gVFJJQUQgbW9kZSwgdGhlIGludGVycnVwdCByZWNlaXZlIHJvdXRpbmUKKwkJCSoqIG11c3QgZG8gdGhlIHN0cmlwcGluZyBpbnN0ZWFkLCBzaW5jZSBpdCBoYXMgdG8gZGV0ZWN0CisJCQkqKiBhbiA4IGJpdCBmdW5jdGlvbiBrZXkgc2VxdWVuY2UuIElmIGlzdHJpcCBpcyBzZXQgd2l0aAorCQkJKiogVFJJQUQgbW9kZSBvbihvZmYpLCBhbmQgOCBiaXQgZGF0YSBpcyBiZWluZyByZWFkIGJ5CisJCQkqKiB0aGUgcG9ydCwgdGhlIHVzZXIgdGhlbiB0dXJucyBUUklBRCBtb2RlIG9mZihvbiksIHRoZSBSVEEKKwkJCSoqIG11c3QgYmUgcmVjb25maWd1cmVkIChub3QpIHRvIGRvIHRoZSBzdHJpcHBpbmcuCisJCQkqKiBIZW5jZSB3ZSBjYWxsIFJJT1BhcmFtIGhlcmUuCisJCQkqLworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9UU1RBVEU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgInRidXN5L3RzdG9wIG1vbml0b3JpbmcgJXNhYmxlZFxuIiwKKwkJIAkJYXJnID8gImVuIiA6ICJkaXMiKTsKKwkJCS8qIE1vbml0b3JUc3RhdGUgPSAwIDsqLworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCwgQ09ORklHLCBNb2RlbSwgT0tfVE9fU0xFRVApOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1NUQVRFOiAvKiBjdXJyZW50IHN0YXRlIG9mIE1vZGVtIGlucHV0IHBpbnMgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9TVEFURVxuIik7CisJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgTUdFVCkgPT0gUklPX0ZBSUwpCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1NUQVRFIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJCWN1cnJlbnQgPSBQb3J0UC0+TW9kZW1TdGF0ZTsKKwkJCWlmICggY29weW91dCgoY2FkZHJfdCkmY3VycmVudCwgKGludClhcmcsCisJCQkJCQkJc2l6ZW9mKGN1cnJlbnQpKT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDb3B5b3V0IGZhaWxlZFxuIik7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFRkFVTFQpOworCQkJfQorCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPTUJJUzoJCS8qIFNldCBtb2RlbSBsaW5lcyAqLworCQljYXNlIFRDUklPTUJJQzoJCS8qIENsZWFyIG1vZGVtIGxpbmVzICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPTUJJUy9UQ1JJT01CSUNcbiIpOworCQkJaWYgKGNtZCA9PSBUQ1JJT01CSVMpIHsKKwkJCQl1aW50CQlzdGF0ZTsKKwkJCQlzdGF0ZSA9ICh1aW50KWFyZzsKKwkJCQlQb3J0UC0+TW9kZW1TdGF0ZSB8PSAodXNob3J0KXN0YXRlOworCQkJCVBvcnRQLT5Nb2RlbUxpbmVzID0gKHVsb25nKSBhcmc7CisJCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIE1CSVMpID09IFJJT19GQUlMKQorCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgCisJCQkJCSAiVENSSU9NQklTIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXVpbnQJCXN0YXRlOworCisJCQkJc3RhdGUgPSAodWludClhcmc7CisJCQkJUG9ydFAtPk1vZGVtU3RhdGUgJj0gfih1c2hvcnQpc3RhdGU7CisJCQkJUG9ydFAtPk1vZGVtTGluZXMgPSAodWxvbmcpIGFyZzsKKwkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgTUJJQykgPT0gUklPX0ZBSUwpCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9NQklDIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1hQT046IC8qIHNldCBYcHJpbnQgT04gc3RyaW5nICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPWFBPTlxuIik7CisJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpUG9ydFAtPlhwcmludC5YcE9uLAorCQkJCQkJTUFYX1hQX0NUUkxfTEVOKT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDb3B5aW4gZmFpbGVkXG4iKTsKKwkJCQlQb3J0UC0+WHByaW50LlhwT25bMF0gPSAnXDAnOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXBzZXRlcnIoRUZBVUxUKTsKKwkJCX0KKwkJCVBvcnRQLT5YcHJpbnQuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJUG9ydFAtPlhwcmludC5YcExlbiA9IHN0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKworCQkJCQkJCQkJCQkJc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPZmYpOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPWFBPRkY6IC8qIHNldCBYcHJpbnQgT0ZGIHN0cmluZyAqLworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1hQT0ZGXG4iKTsKKwkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpUG9ydFAtPlhwcmludC5YcE9mZiwKKwkJCQkJCU1BWF9YUF9DVFJMX0xFTik9PUNPUFlGQUlMICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ29weWluIGZhaWxlZFxuIik7CisJCQkJUG9ydFAtPlhwcmludC5YcE9mZlswXSA9ICdcMCc7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFRkFVTFQpOworCQkJfQorCQkJUG9ydFAtPlhwcmludC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJUG9ydFAtPlhwcmludC5YcExlbiA9IHN0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKworCQkJCQkJCQkJCXN0cmxlbihQb3J0UC0+WHByaW50LlhwT2ZmKTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1hQQ1BTOiAvKiBzZXQgWHByaW50IENQUyBzdHJpbmcgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9YUENQU1xuIik7CisJCQlpZiAoICh1aW50KWFyZyA+IHAtPlJJT0NvbmYuTWF4WHBDcHMgfHwgCisJCQkJCSh1aW50KWFyZyA8IHAtPlJJT0NvbmYuTWluWHBDcHMgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICIlZCBDUFMgb3V0IG9mIHJhbmdlXG4iLGFyZyk7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFSU5WQUwpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJUG9ydFAtPlhwcmludC5YcENwcyA9ICh1aW50KWFyZzsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1hQUklOVDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9YUFJJTlRcbiIpOworCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZQb3J0UC0+WHByaW50LCAoaW50KWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBYcHJpbnQpKT09Q09QWUZBSUwgKSB7CisJCQkgICAgICAgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXBzZXRlcnIoRUZBVUxUKTsKKwkJCX0KKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYQU5ZT046CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPSVhBTllPTlxuIik7CisJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWEFOWTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYQU5ZT0ZGOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0lYQU5ZT0ZGXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWEFOWTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYT05PTjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9JWE9OT05cbiIpOworCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fSVhPTjsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYT05PRkY6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPSVhPTk9GRlxuIik7CisJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fSVhPTjsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKy8qCisqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MSBwYXJ0IGZpeAorKiogQWRkZWQgc3VwcG9ydCBmb3IgQ1RTIGFuZCBSVFMgZmxvdyBjb250cm9sIGlvY3RscyA6CisqLworCQljYXNlIFRDUklPQ1RTRkxPV0VOOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0NUU0ZMT1dFTlxuIik7CisJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19DVFNGTE9XOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9DVFNGTE9XRElTOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0NUU0ZMT1dESVNcbiIpOworCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX0NUU0ZMT1c7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1JUU0ZMT1dFTjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9SVFNGTE9XRU5cbiIpOworCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fUlRTRkxPVzsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPUlRTRkxPV0RJUzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9SVFNGTE9XRElTXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgJj0gflJJT19SVFNGTE9XOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisvKiBlbmQgRVNJTCAwNzYxIHBhcnQgZml4ICovCisKKwl9CisKKworCS8qIEx5bnggSU9DVExTICovCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBUSU9DU0VUUDoKKwkJY2FzZSBUSU9DU0VUTjoKKwkJY2FzZSBPVElPQ1NFVFA6CisJCWNhc2UgT1RJT0NTRVROOgorCQkJaW9jdGxfcHJvY2Vzc2VkKys7CisJCQl0dHlzZXRoKFBvcnRQLCB0cCwgKHN0cnVjdCBvbGRfc2d0dHliICopYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIFRDU0VUQToKKwkJY2FzZSBUQ1NFVEFXOgorCQljYXNlIFRDU0VUQUY6CisJCQlpb2N0bF9wcm9jZXNzZWQrKzsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiTk9OIFBPU0lYIGlvY3RsXG4iKTsKKwkJCXR0eXNldGhfcHYoUG9ydFAsIHRwLCAoc3RydWN0IHRlcm1pb3MgKilhcmcsIDApOworCQkJYnJlYWs7CisJCWNhc2UgVENTRVRBUDoJLyogcG9zaXggdGNzZXRhdHRyKCkgKi8KKwkJY2FzZSBUQ1NFVEFXUDoJLyogcG9zaXggdGNzZXRhdHRyKCkgKi8KKwkJY2FzZSBUQ1NFVEFGUDoJLyogcG9zaXggdGNzZXRhdHRyKCkgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiTk9OIFBPU0lYIFNZU1YgaW9jdGxcbiIpOworCQkJdHR5c2V0aF9wdihQb3J0UCwgdHAsIChzdHJ1Y3QgdGVybWlvcyAqKWFyZywgMSk7CisJCQlpb2N0bF9wcm9jZXNzZWQrKzsKKwkJCWJyZWFrOworCX0KKworCS8qCisJKiogSWYgaXRzIGFueSBvZiB0aGUgY29tbWFuZHMgdGhhdCByZXF1aXJlIHRoZSBwb3J0IHRvIGJlIGluIHRoZQorCSoqIG5vbi1idXN5IHN0YXRlIHdhaXQgdW50aWwgYWxsIG91dHB1dCBoYXMgZHJhaW5lZCAKKwkqLworCWlmICghaW9jdGxfcHJvY2Vzc2VkKQorCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBUQ1NFVEFXOgorCQljYXNlIFRDU0VUQUY6CisJCWNhc2UgVENTRVRBOgorCQljYXNlIFRDU0JSSzoKKyNkZWZpbmUgT0xEX1BPU0lYICgneCcgPDwgOCkKKyNkZWZpbmUgT0xEX1BPU0lYX1NFVEEgKE9MRF9QT1NJWCB8IDIpCisjZGVmaW5lIE9MRF9QT1NJWF9TRVRBVyAoT0xEX1BPU0lYIHwgMykKKyNkZWZpbmUgT0xEX1BPU0lYX1NFVEFGIChPTERfUE9TSVggfCA0KQorI2RlZmluZSBORVdfUE9TSVggKCgnaScgPDwgMjQpIHwgKCdYJyA8PCAxNikpCisjZGVmaW5lIE5FV19QT1NJWF9TRVRBIChORVdfUE9TSVggfCAyKQorI2RlZmluZSBORVdfUE9TSVhfU0VUQVcgKE5FV19QT1NJWCB8IDMpCisjZGVmaW5lIE5FV19QT1NJWF9TRVRBRiAoTkVXX1BPU0lYIHwgNCkKKwkJY2FzZSBPTERfUE9TSVhfU0VUQToKKwkJY2FzZSBPTERfUE9TSVhfU0VUQVc6CisJCWNhc2UgT0xEX1BPU0lYX1NFVEFGOgorCQljYXNlIE5FV19QT1NJWF9TRVRBOgorCQljYXNlIE5FV19QT1NJWF9TRVRBVzoKKwkJY2FzZSBORVdfUE9TSVhfU0VUQUY6CisjaWZkZWYgVElPQ1NFVFAKKwkJY2FzZSBUSU9DU0VUUDoKKyNlbmRpZgorCQljYXNlIFRJT0NTRVREOgorCQljYXNlIFRJT0NTRVROOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJ3YWl0IGZvciBub24tQlVTWSwgc2VtYXBob3JlIHNldFxuIik7CisJCQkvKgorCQkJKiogV2FpdCBmb3IgZHJhaW4gaGVyZSwgYXQgbGVhc3QgYXMgZmFyIGFzIHRoZSBkb3VibGUgYnVmZmVyCisJCQkqKiBiZWluZyBlbXB0eS4KKwkJCSovCisJCQkvKiBYWFggRG9lcyB0aGUgYWJvdmUgY29tbWVudCBtZWFuIHRoYXQgdGhpcyBoYXMKKwkJCSAgIHN0aWxsIHRvIGJlIGltcGxlbWVudGVkPyAtLSBSRVcgKi8KKwkJCS8qIFhYWCBJcyB0aGUgbG9ja2luZyBPSyB0b2dldGhlciB3aXRoIGxvY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHR4ZW5hYmxlPyAoRGVhZGxvY2s/KSAtLSBSRVcgKi8KKwkJCQorCQkJUklPVHhFbmFibGUoKGNoYXIgKilQb3J0UCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCW9sZF9jZmxhZyA9IHRwLT50bS5jX2NmbGFnOworCW9sZF9pZmxhZyA9IHRwLT50bS5jX2lmbGFnOworCW9sZF9vZmxhZyA9IHRwLT50bS5jX29mbGFnOworCW9sZGNvb2sgPSBQb3J0UC0+Q29va01vZGU7CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJUklPQ2xlYXJVcCggUG9ydFAgKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXBzZXRlcnIoRUlPKTsKKwkJcmV0dXJuIDA7CisJfQorCisJUG9ydFAtPkZsdXNoQ21kQm9kZ2UgPSAwOworCisJLyoKKwkqKiBJZiB0aGUgcG9ydCBpcyBsb2NrZWQsIGFuZCBpdCBpcyByZWNvbmZpZ3VyZWQsIHdlIHdhbnQKKwkqKiB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgdHR5IHN0cnVjdHVyZSBzbyB0aGUgY2hhbmdlIGlzIE5PVAorCSoqIG1hZGUuCisJKi8KKwlpZiAoUG9ydFAtPkxvY2spIHsKKwkJdHAtPnRtLmNfaWZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmlmbGFnOworCQl0cC0+dG0uY19vZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkub2ZsYWc7CisJCXRwLT50bS5jX2NmbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5jZmxhZzsKKwkJdHAtPnRtLmNfbGZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmxmbGFnOworCQl0cC0+dG0uY19saW5lID0gUG9ydFAtPlN0b3JlZFR0eS5saW5lOworCQlmb3IgKGkgPSAwOyBpIDwgTkNDICsgMTsgaSsrKQorCQkJdHAtPnRtLmNfY2NbaV0gPSBQb3J0UC0+U3RvcmVkVHR5LmNjW2ldOworCX0KKwllbHNlIHsKKwkJLyoKKwkJKiogSWYgdGhlIHBvcnQgaXMgc2V0IHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXJzLCBhbmQgaXQgaXMKKwkJKiogcmVjb25maWd1cmVkLCB3ZSB3YW50IHRvIHNhdmUgdGhlIGN1cnJlbnQgdHR5IHN0cnVjdCBzbyBpdAorCQkqKiBtYXkgYmUgcmVzdG9yZWQgb24gdGhlIG5leHQgb3Blbi4KKwkJKi8KKwkJaWYgKFBvcnRQLT5TdG9yZSkgeworCQkJUG9ydFAtPlN0b3JlZFR0eS5pZmxhZyA9IHRwLT50bS5jX2lmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5vZmxhZyA9IHRwLT50bS5jX29mbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5jZmxhZyA9IHRwLT50bS5jX2NmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5sZmxhZyA9IHRwLT50bS5jX2xmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5saW5lID0gdHAtPnRtLmNfbGluZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyAxOyBpKyspCisJCQkJUG9ydFAtPlN0b3JlZFR0eS5jY1tpXSA9IHRwLT50bS5jX2NjW2ldOworCQl9CisJfQorCisJY2hhbmdlZCA9ICh0cC0+dG0uY19jZmxhZyAhPSBvbGRfY2ZsYWcpIHx8CisJCQkJKHRwLT50bS5jX2lmbGFnICE9IG9sZF9pZmxhZykgfHwKKwkJCQkodHAtPnRtLmNfb2ZsYWcgIT0gb2xkX29mbGFnKTsKKworCVBvcnRQLT5Db29rTW9kZSA9IFJJT0Nvb2tNb2RlKHRwKTsJLyogU2V0IG5ldyBjb29raW5nIG1vZGUgKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUklPSW9jdGwgY2hhbmdlZCAlZCBuZXdjb29rICVkIG9sZGNvb2sgJWRcbiIsCisJCQljaGFuZ2VkLFBvcnRQLT5Db29rTW9kZSxvbGRjb29rKTsKKworI2lmZGVmIE1PREVNX1NVUFBPUlQKKwkvKgorCSoqIGtsdWRnZSB0byBmb3JjZSBDQVJSX09OIGlmIENMT0NBTCBzZXQKKwkqLworCWlmICgodHAtPnRtLmNfY2ZsYWcgJiBDTE9DQUwpIHx8IChQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEKSkJeworCQl0cC0+dG0uY19zdGF0ZSB8PSBDQVJSX09OOworCQl3YWtldXAgKChjYWRkcl90KSZ0cC0+dG0uY19jYW5xKTsKKwl9CisjZW5kaWYKKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcHNldGVycihFSU8pOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkqKiBSZS1jb25maWd1cmUgaWYgbW9kZXMgb3IgY29va2luZyBoYXZlIGNoYW5nZWQKKwkqLworCWlmIChjaGFuZ2VkIHx8IG9sZGNvb2sgIT0gUG9ydFAtPkNvb2tNb2RlIHx8IChpb2N0bF9wcm9jZXNzZWQpKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIklvY3RsIGNoYW5naW5nIHRoZSBQT1JUIHNldHRpbmdzXG4iKTsKKwkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisKKwlpZiAocC0+UklPSGFsdGVkKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlwc2V0ZXJyKEVJTyk7CisJCXJldHVybiAwOworCX0KKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKwl0dHlzZXRoIC0tIHNldCBoYXJkd2FyZSBkZXBlbmRlbnQgdHR5IHNldHRpbmdzCisqLwordm9pZAordHR5c2V0aChQb3J0UCwgcywgc2cpCitzdHJ1Y3QgUG9ydCAqCQlQb3J0UDsKK3N0cnVjdCB0dHlzdGF0aWNzICoJCXM7CitzdHJ1Y3Qgb2xkX3NndHR5YiAqc2c7Cit7CisJc3RydWN0IG9sZF9zZ3R0eWIgKgl0c2c7CisJc3RydWN0IHRlcm1pb3MgKnRwID0gJnMtPnRtOworCisJdHNnID0gJnMtPnNnOworCisJaWYgKHNnLT5zZ19mbGFncyAmIChFVkVOUHxPRERQKSkgIHsKKwkJdHAtPmNfY2ZsYWcgJj0gUEFSRU5COworCQlpZiAoc2ctPnNnX2ZsYWdzICYgRVZFTlApIHsKKwkJCWlmIChzZy0+c2dfZmxhZ3MgJiBPRERQKSB7CisJCQkJdHAtPmNfY2ZsYWcgJj0gVl9DUzc7CisJCQkJdHAtPmNfY2ZsYWcgJj0gflBBUkVOQjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRwLT5jX2NmbGFnICY9IFZfQ1M3OworCQkJCXRwLT5jX2NmbGFnICY9IFBBUkVOQjsKKwkJCQl0cC0+Y19jZmxhZyAmPSBQQVJPREQ7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoc2ctPnNnX2ZsYWdzICYgT0REUCkgeworCQkJdHAtPmNfY2ZsYWcgJj0gVl9DUzc7CisJCQl0cC0+Y19jZmxhZyAmPSBQQVJFTkI7CisJCQl0cC0+Y19jZmxhZyAmPSBQQVJPREQ7CisJCX0KKwkJZWxzZSB7CisJCQl0cC0+Y19jZmxhZyAmPSBWX0NTNzsKKwkJCXRwLT5jX2NmbGFnICY9IFBBUkVOQjsKKwkJfQorCX0KKy8qCisgKiBVc2UgaXNwZWVkIGFzIHRoZSBkZXNpcmVkIHNwZWVkLiAgTW9zdCBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgaGFuZGxlIAorICogc2VwYXJhdGUgaW5wdXQgYW5kIG91dHB1dCBzcGVlZHMgdmVyeSB3ZWxsLiBJZiB0aGUgUklPIGhhbmRsZXMgdGhpcywgCisgKiBJIHdpbGwgaGF2ZSB0byB1c2Ugc2VwYXJhdGUgc2V0cyBvZiBmbGFncyB0byBzdG9yZSB0aGVtIGluIHRoZSAKKyAqIFBvcnQgc3RydWN0dXJlLgorICovCisJaWYgKCAhc2ctPnNnX29zcGVlZCApCisJCXNnLT5zZ19vc3BlZWQgPSBzZy0+c2dfaXNwZWVkOworCWVsc2UKKwkJc2ctPnNnX2lzcGVlZCA9IHNnLT5zZ19vc3BlZWQ7CisJaWYgKHNnLT5zZ19pc3BlZWQgPiBWX0VYVEIgKSAKKwkJc2ctPnNnX2lzcGVlZCA9IFZfRVhUQjsKKwlpZiAoc2ctPnNnX2lzcGVlZCA8IFZfQjApCisJCXNnLT5zZ19pc3BlZWQgPSBWX0IwOworCSp0c2cgPSAqc2c7CisgICB0cC0+Y19jZmxhZyA9ICh0cC0+Y19jZmxhZyAmIH5WX0NCQVVEKSB8IGNvbnZfYnZbKGludClzZy0+c2dfaXNwZWVkXTsKK30KKworLyoKKwl0dHlzZXRoX3B2IC0tIHNldCBoYXJkd2FyZSBkZXBlbmRlbnQgdHR5IHNldHRpbmdzIHVzaW5nIGVpdGhlciB0aGUKKwkJCVBPU0lYIHRlcm1pb3Mgc3RydWN0dXJlIG9yIHRoZSBTeXN0ZW0gViB0ZXJtaW8gc3RydWN0dXJlLgorCQkJCXN5c3YgPSAwID0+IChQT1NJWCk6CSBzdHJ1Y3QgdGVybWlvcyAqc2cKKwkJCQlzeXN2ICE9IDAgPT4gKFN5c3RlbSBWKTogc3RydWN0IHRlcm1pbyAqc2cKKyovCitzdGF0aWMgdm9pZAordHR5c2V0aF9wdihQb3J0UCwgcywgc2csIHN5c3YpCitzdHJ1Y3QgUG9ydCAqUG9ydFA7CitzdHJ1Y3QgdHR5c3RhdGljcyAqczsKK3N0cnVjdCB0ZXJtaW9zICpzZzsKK2ludCBzeXN2OworeworICAgIGludCBzcGVlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGNzaXplOworICAgIHVuc2lnbmVkIGNoYXIgY3JlYWQ7CisgICAgdW5zaWduZWQgaW50IGxjcl9mbGFnczsKKyAgICBpbnQgcHM7CisgCisgICAgaWYgKHN5c3YpIHsKKyAgICAgICAgLyogc2cgcG9pbnRzIHRvIGEgU3lzdGVtIFYgdGVybWlvIHN0cnVjdHVyZSAqLworICAgICAgICBjc2l6ZSA9ICgoc3RydWN0IHRlcm1pbyAqKXNnKS0+Y19jZmxhZyAmIENTSVpFOworICAgICAgICBjcmVhZCA9ICgoc3RydWN0IHRlcm1pbyAqKXNnKS0+Y19jZmxhZyAmIENSRUFEOworICAgICAgICBzcGVlZCA9IGNvbnZfdmJbKChzdHJ1Y3QgdGVybWlvICopc2cpLT5jX2NmbGFnICYgVl9DQkFVRF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBzZyBwb2ludHMgdG8gYSBQT1NJWCB0ZXJtaW9zIHN0cnVjdHVyZSAqLworICAgICAgICBjc2l6ZSA9IHNnLT5jX2NmbGFnICYgQ1NJWkU7CisgICAgICAgIGNyZWFkID0gc2ctPmNfY2ZsYWcgJiBDUkVBRDsKKyAgICAgICAgc3BlZWQgPSBjb252X3ZiW3NnLT5jX2NmbGFnICYgVl9DQkFVRF07CisgICAgfQorICAgIGlmIChzLT5zZy5zZ19pc3BlZWQgIT0gc3BlZWQgfHwgcy0+c2cuc2dfb3NwZWVkICE9IHNwZWVkKSB7CisgICAgICAgIHMtPnNnLnNnX2lzcGVlZCA9IHNwZWVkOworICAgICAgICBzLT5zZy5zZ19vc3BlZWQgPSBzcGVlZDsKKyAgICAgICAgcy0+dG0uY19jZmxhZyA9IChzLT50bS5jX2NmbGFnICYgflZfQ0JBVUQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2J2WyhpbnQpcy0+c2cuc2dfaXNwZWVkXTsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdHlwZXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzdjNDJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90eXBlcy5oCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIFIgSSBPIFQgWSBQIEUgUworICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSm9uIEJyYXduCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3Jpb3R5cGVzX2gKKyNkZWZpbmUgX3Jpb3R5cGVzX2ggMQorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcmlvdHlwZXNfaF9zY2NzID0gIkAoIylyaW90eXBlcy5oCTEuMTAiOyAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIElOS0VSTkVMCisKKyNpZiAhZGVmaW5lZChNSVBTQVQpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IE5VTUJFUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdPUkRfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBCWVRFX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgY2hhcl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IENoYW5uZWxfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBGUkVFX0xJU1RfcHRyX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgRlJFRV9MSVNUX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgTFBCX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUHJvY2Vzc19wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBIQl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBLVF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBLVF9wdHJfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBRX0JVRl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFJPVVRFX1NUUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFJVUF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHNob3J0X3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9zaG9ydF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydF9wdHI7CisjZWxzZQorLyogTUlQU0FUIHR5cGVzICovCit0eXBlZGVmIGNoYXIgUklPX1BPSU5URVJbOF07Cit0eXBlZGVmIFJJT19QT0lOVEVSIE5VTUJFUl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFdPUkRfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBCWVRFX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgY2hhcl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIENoYW5uZWxfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBGUkVFX0xJU1RfcHRyX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgRlJFRV9MSVNUX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgTFBCX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUHJvY2Vzc19wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFBIQl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFBLVF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFBLVF9wdHJfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBRX0JVRl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFJPVVRFX1NUUl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFJVUF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIHNob3J0X3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgdV9zaG9ydF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIHVzaG9ydF9wdHI7CisjZW5kaWYKKworI2Vsc2UgLyogbm90IElOS0VSTkVMICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCWVRFOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgV09SRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIERXT1JEOwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgTlVNQkVSOwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgKk5VTUJFUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAqV09SRF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAqQllURV9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2hhciA7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2hvcnQgOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludCA7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bG9uZyA7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1X2NoYXIgOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdV9zaG9ydCA7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1X2ludCA7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1X2xvbmcgOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRVJST1IgOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIElEIDsKK3R5cGVkZWYgY2hhciAgICAgICAgICAgICAqY2hhcl9wdHI7Cit0eXBlZGVmIENoYW5uZWwgICAgICAgICAgKkNoYW5uZWxfcHRyOwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUICpGUkVFX0xJU1RfcHRyOwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUICoqRlJFRV9MSVNUX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBMUEIgICAgICAgKkxQQl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQcm9jZXNzICAgKlByb2Nlc3NfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUEhCICAgICAgICpQSEJfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUEtUICAgICAgICpQS1RfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUEtUICAgICAgICoqUEtUX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBRX0JVRiAgICAgKlFfQlVGX3B0cjsKK3R5cGVkZWYgc3RydWN0IFFfQlVGICAgICAqKlFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBST1VURV9TVFIgKlJPVVRFX1NUUl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBSVVAgICAgICAgKlJVUF9wdHI7Cit0eXBlZGVmIHNob3J0ICAgICAgICAgICAgKnNob3J0X3B0cjsKK3R5cGVkZWYgdV9zaG9ydCAgICAgICAgICAqdV9zaG9ydF9wdHI7Cit0eXBlZGVmIHVzaG9ydCAgICAgICAgICAgKnVzaG9ydF9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQS1QJIFBLVDsKK3R5cGVkZWYgc3RydWN0IExQQgkgTFBCOwordHlwZWRlZiBzdHJ1Y3QgUlVQCSBSVVA7CisjZW5kaWYKKworCisjZW5kaWYgLyogX19yaW90eXBlc19fICovCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW93aW5pZi5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW93aW5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTRmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3dpbmlmLmgKQEAgLTAsMCArMSwxMzM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGl0bGUJCToJUklPIFNoYXJlZCBNZW1vcnkgV2luZG93IEludGVmYWNlCSovCisvKgkJCQkJCQkJCSovCisvKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDcmVhdGlvbgk6CTd0aCBKdW5lIDE5OTkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVZlcnNpb24JCToJMS4wLjAJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDb3B5cmlnaHQJOgkoYykgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiAxOTk5CSoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCQkJCQkJCQkJKi8KKy8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KKy8qCQkJCWRlc2NyaWJpbmcgUklPIGhvc3QgY2FyZCBzaGFyZWQJbWVtb3J5CSovCisvKgkJCQl3aW5kb3cgaW50ZXJmYWNlIHN0cnVjdHVyZXM6CQkqLworLyoJCQkJCVBBUk1NQVAJCQkJKi8KKy8qCQkJCQlSVVAJCQkJKi8KKy8qCQkJCQlQSEIJCQkJKi8KKy8qCQkJCQlMUEIJCQkJKi8KKy8qCQkJCQlQS1QJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhpc3RvcnkuLi4KKworMS4wLjAJMDcvMDYvOTkgTlBWCUNyZWF0aW9uLiAoYmFzZWQgb24gUEFSTU1BUC5IKQorCisqLworCisjaWZuZGVmCV9yaW93aW5pZl9oCQkJCS8qIElmIFJJT1dJTkRJRi5IIG5vdCBhbHJlYWR5IGRlZmluZWQgKi8KKyNkZWZpbmUJX3Jpb3dpbmlmX2ggICAgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBHZW5lcmFsICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCVRQTlVMTAkJKChfdTE2KSgweDgwMDApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQQVJNX01BUCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgUEFSTV9NQVAgc3RydWN0dXJlIGRlZmluZXMgZ2xvYmFsIHZhbHVlcyByZWxhdGluZyB0byB0aGUgSG9zdCBDYXJkIC8gUlRBCisgICBhbmQgaXMgdGhlIG1haW4gc3RydWN0dXJlIGZyb20gd2hpY2ggYWxsIG90aGVyIHN0cnVjdHVyZXMgYXJlIHJlZmVyZW5jZWQuICovCisKK3R5cGVkZWYJc3RydWN0CV9QQVJNX01BUAoreworCV91MTYJcGhiX3B0cjsJCS8qIDB4MDAgUG9pbnRlciB0byB0aGUgUEhCIGFycmF5ICovCisJX3UxNglwaGJfbnVtX3B0cjsJCS8qIDB4MDIgUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLworCV91MTYJZnJlZV9saXN0OwkJLyogMHgwNCBGcmVlIExpc3QgcG9pbnRlciAqLworCV91MTYJZnJlZV9saXN0X2VuZDsJCS8qIDB4MDYgRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCisJX3UxNglxX2ZyZWVfbGlzdF9wdHI7CS8qIDB4MDggUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCisJX3UxNgl1bml0X2lkX3B0cjsJCS8qIDB4MEEgVW5pdCBJZCAqLworCV91MTYJbGlua19zdHJfcHRyOwkJLyogMHgwQyBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLworCV91MTYJYm9vdGxvYWRlcl8xOwkJLyogMHgwRSAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKwlfdTE2CWJvb3Rsb2FkZXJfMjsJCS8qIDB4MTAgMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCisJX3UxNglwb3J0X3JvdXRlX21hcF9wdHI7CS8qIDB4MTIgUG9ydCBSb3V0ZSBNYXAgKi8KKwlfdTE2CXJvdXRlX3B0cjsJCS8qIDB4MTQgUm91dGUgTWFwICovCisJX3UxNgltYXBfcHJlc2VudDsJCS8qIDB4MTYgUm91dGUgTWFwIHByZXNlbnQgKi8KKwlfdTE2CXBrdF9udW07CQkvKiAweDE4IFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCisJX3UxNglxX251bTsJCQkvKiAweDFBIFRvdGFsIG51bWJlciBvZiBRIHBhY2tldHMgKi8KKwlfdTE2CWJ1ZmZlcnNfcGVyX3BvcnQ7CS8qIDB4MUMgTnVtYmVyIG9mIGJ1ZmZlcnMgcGVyIHBvcnQgKi8KKwlfdTE2CWhlYXBfc2l6ZTsJCS8qIDB4MUUgSW5pdGlhbCBzaXplIG9mIGhlYXAgKi8KKwlfdTE2CWhlYXBfbGVmdDsJCS8qIDB4MjAgQ3VycmVudCBIZWFwIGxlZnQgKi8KKwlfdTE2CWVycm9yOwkJCS8qIDB4MjIgRXJyb3IgY29kZSAqLworCV91MTYJdHhfbWF4OwkJCS8qIDB4MjQgTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KKwlfdTE2CXJ4X21heDsJCQkvKiAweDI2IE1heCBudW1iZXIgb2YgcnggcGt0cyBwZXIgcGhiICovCisJX3UxNglyeF9saW1pdDsJCS8qIDB4MjggRm9yIGhpZ2ggLyBsb3cgd2F0ZXJtYXJrcyAqLworCV91MTYJbGlua3M7CQkJLyogMHgyQSBMaW5rcyB0byB1c2UgKi8KKwlfdTE2CXRpbWVyOwkJCS8qIDB4MkMgSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCisJX3UxNglydXBzOwkJCS8qIDB4MkUgUG9pbnRlciB0byB0aGUgUlVQcyAqLworCV91MTYJbWF4X3BoYjsJCS8qIDB4MzAgTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KKwlfdTE2CWxpdmluZzsJCQkvKiAweDMyIEp1c3QgaW5jcmVtZW50cyEhICovCisJX3UxNglpbml0X2RvbmU7CQkvKiAweDM0IEluaXRpYWxpc2F0aW9uIG92ZXIgKi8KKwlfdTE2CWJvb3RpbmdfbGluazsJCS8qIDB4MzYgKi8KKwlfdTE2CWlkbGVfY291bnQ7CQkvKiAweDM4IElkbGUgdGltZSBjb3VudGVyICovCisJX3UxNglidXN5X2NvdW50OwkJLyogMHgzQSBCdXN5IGNvdW50ZXIgKi8KKwlfdTE2CWlkbGVfY29udHJvbDsJCS8qIDB4M0MgQ29udHJvbCBJZGxlIFByb2Nlc3MgKi8KKwlfdTE2CXR4X2ludHI7CQkvKiAweDNFIFRYIGludGVycnVwdCBwZW5kaW5nICovCisJX3UxNglyeF9pbnRyOwkJLyogMHg0MCBSWCBpbnRlcnJ1cHQgcGVuZGluZyAqLworCV91MTYJcnVwX2ludHI7CQkvKiAweDQyIFJVUCBpbnRlcnJ1cHQgcGVuZGluZyAqLworCit9IFBBUk1fTUFQOworCisvKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCisKKyNkZWZpbmUJUE1fcGhiX3B0cgkJMHgwMAkvKiAweDAwIFBvaW50ZXIgdG8gdGhlIFBIQiBhcnJheSAqLworI2RlZmluZQlQTV9waGJfbnVtX3B0cgkJMHgwMgkvKiAweDAyIFB0ciB0byBOdW1iZXIgb2YgUEhCJ3MgKi8KKyNkZWZpbmUJUE1fZnJlZV9saXN0CQkweDA0CS8qIDB4MDQgRnJlZSBMaXN0IHBvaW50ZXIgKi8KKyNkZWZpbmUJUE1fZnJlZV9saXN0X2VuZAkweDA2CS8qIDB4MDYgRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCisjZGVmaW5lCVBNX3FfZnJlZV9saXN0X3B0cgkweDA4CS8qIDB4MDggUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCisjZGVmaW5lCVBNX3VuaXRfaWRfcHRyCQkweDBBCS8qIDB4MEEgVW5pdCBJZCAqLworI2RlZmluZQlQTV9saW5rX3N0cl9wdHIJCTB4MEMJLyogMHgwQyBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLworI2RlZmluZQlQTV9ib290bG9hZGVyXzEJCTB4MEUJLyogMHgwRSAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKyNkZWZpbmUJUE1fYm9vdGxvYWRlcl8yCQkweDEwCS8qIDB4MTAgMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCisjZGVmaW5lCVBNX3BvcnRfcm91dGVfbWFwX3B0cgkweDEyCS8qIDB4MTIgUG9ydCBSb3V0ZSBNYXAgKi8KKyNkZWZpbmUJUE1fcm91dGVfcHRyCQkweDE0CS8qIDB4MTQgUm91dGUgTWFwICovCisjZGVmaW5lCVBNX21hcF9wcmVzZW50CQkweDE2CS8qIDB4MTYgUm91dGUgTWFwIHByZXNlbnQgKi8KKyNkZWZpbmUJUE1fcGt0X251bQkJMHgxOAkvKiAweDE4IFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCisjZGVmaW5lCVBNX3FfbnVtCQkweDFBCS8qIDB4MUEgVG90YWwgbnVtYmVyIG9mIFEgcGFja2V0cyAqLworI2RlZmluZQlQTV9idWZmZXJzX3Blcl9wb3J0CTB4MUMJLyogMHgxQyBOdW1iZXIgb2YgYnVmZmVycyBwZXIgcG9ydCAqLworI2RlZmluZQlQTV9oZWFwX3NpemUJCTB4MUUJLyogMHgxRSBJbml0aWFsIHNpemUgb2YgaGVhcCAqLworI2RlZmluZQlQTV9oZWFwX2xlZnQJCTB4MjAJLyogMHgyMCBDdXJyZW50IEhlYXAgbGVmdCAqLworI2RlZmluZQlQTV9lcnJvcgkJMHgyMgkvKiAweDIyIEVycm9yIGNvZGUgKi8KKyNkZWZpbmUJUE1fdHhfbWF4CQkweDI0CS8qIDB4MjQgTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KKyNkZWZpbmUJUE1fcnhfbWF4CQkweDI2CS8qIDB4MjYgTWF4IG51bWJlciBvZiByeCBwa3RzIHBlciBwaGIgKi8KKyNkZWZpbmUJUE1fcnhfbGltaXQJCTB4MjgJLyogMHgyOCBGb3IgaGlnaCAvIGxvdyB3YXRlcm1hcmtzICovCisjZGVmaW5lCVBNX2xpbmtzCQkweDJBCS8qIDB4MkEgTGlua3MgdG8gdXNlICovCisjZGVmaW5lCVBNX3RpbWVyCQkweDJDCS8qIDB4MkMgSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCisjZGVmaW5lCVBNX3J1cHMJCQkweDJFCS8qIDB4MkUgUG9pbnRlciB0byB0aGUgUlVQcyAqLworI2RlZmluZQlQTV9tYXhfcGhiCQkweDMwCS8qIDB4MzAgTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUJUE1fbGl2aW5nCQkweDMyCS8qIDB4MzIgSnVzdCBpbmNyZW1lbnRzISEgKi8KKyNkZWZpbmUJUE1faW5pdF9kb25lCQkweDM0CS8qIDB4MzQgSW5pdGlhbGlzYXRpb24gb3ZlciAqLworI2RlZmluZQlQTV9ib290aW5nX2xpbmsJCTB4MzYJLyogMHgzNiAqLworI2RlZmluZQlQTV9pZGxlX2NvdW50CQkweDM4CS8qIDB4MzggSWRsZSB0aW1lIGNvdW50ZXIgKi8KKyNkZWZpbmUJUE1fYnVzeV9jb3VudAkJMHgzQQkvKiAweDNBIEJ1c3kgY291bnRlciAqLworI2RlZmluZQlQTV9pZGxlX2NvbnRyb2wJCTB4M0MJLyogMHgzQyBDb250cm9sIElkbGUgUHJvY2VzcyAqLworI2RlZmluZQlQTV90eF9pbnRyCQkweDNFCS8qIDB4NEUgVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJUE1fcnhfaW50cgkJMHg0MAkvKiAweDQwIFJYIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lCVBNX3J1cF9pbnRyCQkweDQyCS8qIDB4NDIgUlVQIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lCXNpemVvZl9QQVJNX01BUAkJMHg0NAkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NDQgKi8KKworLyogUEFSTV9NQVAuZXJyb3IgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJRV9OT19FUlJPUgkJMHgwMAorI2RlZmluZQlFX1BST0NFU1NfTk9UX0lOSVQJMHgwMQorI2RlZmluZQlFX0xJTktfVElNRU9VVAkJMHgwMgorI2RlZmluZQlFX05PX1JPVVRFCQkweDAzCisjZGVmaW5lCUVfQ09ORlVTRUQJCTB4MDQKKyNkZWZpbmUJRV9IT01FCQkJMHgwNQorI2RlZmluZQlFX0NTVU1fRkFJTAkJMHgwNgorI2RlZmluZQlFX0RJU0NPTk5FQ1RFRAkJMHgwNworI2RlZmluZQlFX0JBRF9SVVAJCTB4MDgKKyNkZWZpbmUJRV9OT19WSVJHSU4JCTB4MDkKKyNkZWZpbmUJRV9CT09UX1JVUF9CVVNZCQkweDEwCisjZGVmaW5lCUVfQ0hBTkFMTE9DCQkweDgwCisjZGVmaW5lCUVfUE9MTF9BTExPQwkJMHg4MQorI2RlZmluZQlFX0xUVFdBS0UJCTB4ODIKKyNkZWZpbmUJRV9MVFRfQUxMT0MJCTB4ODMKKyNkZWZpbmUJRV9MUlRfQUxMT0MJCTB4ODQKKyNkZWZpbmUJRV9DSVJSVVMJCTB4ODUKKyNkZWZpbmUJRV9NT05JVE9SCQkweDg2CisjZGVmaW5lCUVfUEhCX0FMTE9DCQkweDg3CisjZGVmaW5lCUVfQVJSQVlfQUxMT0MJCTB4ODgKKyNkZWZpbmUJRV9RQlVGX0FMTE9DCQkweDg5CisjZGVmaW5lCUVfUEtUX0FMTE9DCQkweDhhCisjZGVmaW5lCUVfR0VUX1RYX1FfQlVGCQkweDhiCisjZGVmaW5lCUVfR0VUX1JYX1FfQlVGCQkweDhjCisjZGVmaW5lCUVfTUVNX09VVAkJMHg4ZAorI2RlZmluZQlFX01NVV9JTklUCQkweDhlCisjZGVmaW5lCUVfTFRUX0lOSVQJCTB4OGYKKyNkZWZpbmUJRV9MUlRfSU5JVAkJMHg5MAorI2RlZmluZQlFX0xJTktfUlVOCQkweDkxCisjZGVmaW5lCUVfTU9OSVRPUl9BTExPQwkJMHg5MgorI2RlZmluZQlFX01PTklUT1JfSU5JVAkJMHg5MworI2RlZmluZQlFX1BPTExfSU5JVAkJMHg5NAorCisvKiBQQVJNX01BUC5saW5rcyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fTElOS19FTkFCTEUJMHg4MEZGCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUlVQICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBSVVAgKFJlbW90ZSBVbml0IFBvcnQpIHN0cnVjdHVyZSByZWxhdGVzIHRvIHRoZSBSZW1vdGUgVGVybWluYWwgQWRhcHRlcnMKKyAgIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0gYW5kIHRoZXJlIGlzIG5vcm1hbGx5IGFuIGFycmF5IG9mIE1BWF9SVVBTICg9MTYpIHN0cnVjdHVyZXMKKyAgIGluIGEgaG9zdCBjYXJkLCBkZWZpbmVkIGJ5IFBBUk1fTUFQLT5ydXAuICovCisKK3R5cGVkZWYJc3RydWN0CV9SVVAKK3sKKwlfdTE2CQl0eHBrdDsJCQkvKiAweDAwIE91dGdvaW5nIHBhY2tldCAqLworCV91MTYJCXJ4cGt0OwkJCS8qIDB4MDIgbmNvbWluZyBwYWNrZXQgKi8KKwlfdTE2CQlsaW5rOwkJCS8qIDB4MDQgV2hpY2ggbGluayB0byBzZW5kIHBhY2tldCBkb3duID8gKi8KKwlfdTgJCXJ1cF9kZXN0X3VuaXRbMl07CS8qIDB4MDYgRGVzdGluYXRpb24gVW5pdCAqLworCV91MTYJCWhhbmRzaGFrZTsJCS8qIDB4MDggSGFuZHNoYWtpbmcgKi8KKwlfdTE2CQl0aW1lb3V0OwkJLyogMHgwQSBUaW1lb3V0ICovCisJX3UxNgkJc3RhdHVzOwkJCS8qIDB4MEMgU3RhdHVzICovCisJX3UxNgkJdHhjb250cm9sOwkJLyogMHgwRSBUcmFuc21pdCBjb250cm9sICovCisJX3UxNgkJcnhjb250cm9sOwkJLyogMHgxMCBSZWNlaXZlIGNvbnRyb2wgKi8KKworfSBSVVA7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlSVVBfdHhwa3QJCTB4MDAJCS8qIDB4MDAgT3V0Z29pbmcgcGFja2V0ICovCisjZGVmaW5lCVJVUF9yeHBrdAkJMHgwMgkJLyogMHgwMiBJbmNvbWluZyBwYWNrZXQgKi8KKyNkZWZpbmUJUlVQX2xpbmsJCTB4MDQJCS8qIDB4MDQgV2hpY2ggbGluayB0byBzZW5kIHBhY2tldCBkb3duID8gKi8KKyNkZWZpbmUJUlVQX3J1cF9kZXN0X3VuaXQJMHgwNgkJLyogMHgwNiBEZXN0aW5hdGlvbiBVbml0ICovCisjZGVmaW5lCVJVUF9oYW5kc2hha2UJCTB4MDgJCS8qIDB4MDggSGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUJUlVQX3RpbWVvdXQJCTB4MEEJCS8qIDB4MEEgVGltZW91dCAqLworI2RlZmluZQlSVVBfc3RhdHVzCQkweDBDCQkvKiAweDBDIFN0YXR1cyAqLworI2RlZmluZQlSVVBfdHhjb250cm9sCQkweDBFCQkvKiAweDBFIFRyYW5zbWl0IGNvbnRyb2wgKi8KKyNkZWZpbmUJUlVQX3J4Y29udHJvbAkJMHgxMAkJLyogMHgxMCBSZWNlaXZlIGNvbnRyb2wgKi8KKyNkZWZpbmUJc2l6ZW9mX1JVUAkJMHgxMgkJLyogc3RydWN0dXJlIHNpemUgPSAweDEyICovCisKKyNkZWZpbmUgTUFYX1JVUAkJCTE2CisKKy8qIFJVUC50eGNvbnRyb2wgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJVFhfUlVQX0lOQUNUSVZFCQkwCQkvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCisjZGVmaW5lCVRYX1BBQ0tFVF9SRUFEWQkJMQkJLyogVHJhbnNtaXQgcGFja2V0IHJlYWR5ICovCisjZGVmaW5lCVRYX0xPQ0tfUlVQCQkyCQkvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLworCisvKiBSVVAudHhjb250cm9sIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJYX1JVUF9JTkFDVElWRQkJMAkJLyogTm90aGluZyByZWNlaXZlZCAqLworI2RlZmluZQlSWF9QQUNLRVRfUkVBRFkJCTEJCS8qIFBhY2tldCByZWNlaXZlZCAqLworCisjZGVmaW5lCVJVUF9OT19PV05FUgkJMHhGRgkJLyogUlVQIG5vdCBvd25lZCBieSBhbnkgcHJvY2VzcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBIQiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgUEhCIChQb3J0IEhlYWRlciBCbG9jaykgc3RydWN0dXJlIHJlbGF0ZXMgdG8gdGhlIHNlcmlhbCBwb3J0cyBhdHRhY2hlZAorICAgdG8gdGhlIHN5c3RlbSBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX1BIQlMgKD0xMjgpIHN0cnVjdHVyZXMKKyAgIGluIGEgaG9zdCBjYXJkLCBkZWZpbmVkIGJ5IFBBUk1fTUFQLT5waGJfcHRyIGFuZCBQQVJNX01BUC0+cGhiX251bV9wdHIuICovCisKK3R5cGVkZWYJc3RydWN0CV9QSEIKK3sKKwlfdTE2CQlzb3VyY2U7CQkJLyogMHgwMCBMb2NhdGlvbiBvZiB0aGUgUEhCIGluIHRoZSBob3N0IGNhcmQgKi8KKwlfdTE2CQloYW5kc2hha2U7CQkvKiAweDAyIFVzZWQgdG8gbWFuYWdlIHJlY2VpdmUgcGFja2V0IGZsb3cgY29udHJvbCAqLworCV91MTYJCXN0YXR1czsJCQkvKiAweDA0IEludGVybmFsIHBvcnQgdHJhbnNtaXQvcmVjZWl2ZSBzdGF0dXMgKi8KKwlfdTE2CQl0aW1lb3V0OwkJLyogMHgwNiBUaW1lIHBlcmlvZCB0byB3YWl0IGZvciBhbiBBQ0sgKi8KKwlfdTE2CQlsaW5rOwkJCS8qIDB4MDggVGhlIGhvc3QgbGluayBhc3NvY2lhdGVkIHdpdGggdGhlIFBIQiAqLworCV91MTYJCWRlc3RpbmF0aW9uOwkJLyogMHgwQSBMb2NhdGlvbiBvZiB0aGUgcmVtb3RlIHBvcnQgb24gdGhlIG5ldHdvcmsgKi8KKworCV91MTYJCXR4X3N0YXJ0OwkJLyogMHgwQyBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisJX3UxNgkJdHhfZW5kOwkJCS8qIDB4MEUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisJX3UxNgkJdHhfYWRkOwkJCS8qIDB4MTAgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgbmV3IHRyYW5zbWl0IHBhY2tldHMgKi8KKwlfdTE2CQl0eF9yZW1vdmU7CQkvKiAweDEyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBwb2ludGVyIGFycmF5ICovCisKKwlfdTE2CQlyeF9zdGFydDsJCS8qIDB4MTQgZmlyc3QgZW50cnkgaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgcmVjZWl2ZSBwYWNrZXRzICovCisJX3UxNgkJcnhfZW5kOwkJCS8qIDB4MTYgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KKwlfdTE2CQlyeF9hZGQ7CQkJLyogMHgxOCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgcmVjZWl2ZSBwYWNrZXRzICovCisJX3UxNgkJcnhfcmVtb3ZlOwkJLyogMHgxQSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLworCit9IFBIQjsKKworLyogU2FtZSB0aGluZyBhZ2FpbiwgYnV0IGRlZmluZWQgYXMgb2Zmc2V0cy4uLiAqLworCisjZGVmaW5lCVBIQl9zb3VyY2UJCTB4MDAJCS8qIDB4MDAgTG9jYXRpb24gb2YgdGhlIFBIQiBpbiB0aGUgaG9zdCBjYXJkICovCisjZGVmaW5lCVBIQl9oYW5kc2hha2UJCTB4MDIJCS8qIDB4MDIgVXNlZCB0byBtYW5hZ2UgcmVjZWl2ZSBwYWNrZXQgZmxvdyBjb250cm9sICovCisjZGVmaW5lCVBIQl9zdGF0dXMJCTB4MDQJCS8qIDB4MDQgSW50ZXJuYWwgcG9ydCB0cmFuc21pdC9yZWNlaXZlIHN0YXR1cyAqLworI2RlZmluZQlQSEJfdGltZW91dAkJMHgwNgkJLyogMHgwNiBUaW1lIHBlcmlvZCB0byB3YWl0IGZvciBhbiBBQ0sgKi8KKyNkZWZpbmUJUEhCX2xpbmsJCTB4MDgJCS8qIDB4MDggVGhlIGhvc3QgbGluayBhc3NvY2lhdGVkIHdpdGggdGhlIFBIQiAqLworI2RlZmluZQlQSEJfZGVzdGluYXRpb24JCTB4MEEJCS8qIDB4MEEgTG9jYXRpb24gb2YgdGhlIHJlbW90ZSBwb3J0IG9uIHRoZSBuZXR3b3JrICovCisjZGVmaW5lCVBIQl90eF9zdGFydAkJMHgwQwkJLyogMHgwQyBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisjZGVmaW5lCVBIQl90eF9lbmQJCTB4MEUJCS8qIDB4MEUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisjZGVmaW5lCVBIQl90eF9hZGQJCTB4MTAJCS8qIDB4MTAgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgbmV3IHRyYW5zbWl0IHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3R4X3JlbW92ZQkJMHgxMgkJLyogMHgxMiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLworI2RlZmluZQlQSEJfcnhfc3RhcnQJCTB4MTQJCS8qIDB4MTQgZmlyc3QgZW50cnkgaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgcmVjZWl2ZSBwYWNrZXRzICovCisjZGVmaW5lCVBIQl9yeF9lbmQJCTB4MTYJCS8qIDB4MTYgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3J4X2FkZAkJMHgxOAkJLyogMHgxOCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgcmVjZWl2ZSBwYWNrZXRzICovCisjZGVmaW5lCVBIQl9yeF9yZW1vdmUJCTB4MUEJCS8qIDB4MUEgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IHBvaW50ZXIgYXJyYXkgKi8KKyNkZWZpbmUJc2l6ZW9mX1BIQgkJMHgxQwkJLyogc3RydWN0dXJlIHNpemUgPSAweDFDICovCisKKy8qIFBIQi5oYW5kc2hha2UgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUEhCX0hBTkRTSEFLRV9TRVQJMHgwMDAxCQkvKiBTZXQgYnkgTFJUICovCisjZGVmaW5lCVBIQl9IQU5EU0hBS0VfUkVTRVQJMHgwMDAyCQkvKiBTZXQgYnkgSVNSIC8gZHJpdmVyICovCisjZGVmaW5lCVBIQl9IQU5EU0hBS0VfRkxBR1MJKFBIQl9IQU5EU0hBS0VfUkVTRVR8UEhCX0hBTkRTSEFLRV9TRVQpCisJCQkJCQkvKiBSZXNldCBieSBsdHQgKi8KKworI2RlZmluZQlNQVhfUEhCCQkJMTI4CQkvKiByYW5nZSAwLTEyNyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIExQQiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgTFBCIChMaW5rIFBhcmFtZXRlciBCbG9jaykgc3RydWN0dXJlIHJlbGF0ZXMgdG8gYSBSSU8gTmV0d29yayBMaW5rCisgICBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX0xJTktTICg9NCkgc3RydWN0dXJlcyBpbiBhIGhvc3QgY2FyZCwKKyAgIGRlZmluZWQgYnkgUEFSTV9NQVAtPmxpbmtfc3RyX3B0ci4gKi8KKwordHlwZWRlZglzdHJ1Y3QJX0xQQgoreworCV91MTYJCWxpbmtfbnVtYmVyOwkJLyogMHgwMCBMaW5rIE51bWJlciAqLworCV91MTYJCWluX2NoOwkJCS8qIDB4MDIgTGluayBJbiBDaGFubmVsICovCisJX3UxNgkJb3V0X2NoOwkJCS8qIDB4MDQgTGluayBPdXQgQ2hhbm5lbCAqLworCV91OAkJYXR0YWNoZWRfc2VyaWFsWzRdOwkvKiAweDA2IEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KKwlfdTgJCWF0dGFjaGVkX2hvc3Rfc2VyaWFsWzRdOy8qIDB4MEEgU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobyBib290ZWQgb3RoZXIgZW5kICovCisJX3UxNgkJZGVzY2hlZHVsZWQ7CQkvKiAweDBFIEN1cnJlbnRseSBEZXNjaGVkdWxlZCAqLworCV91MTYJCXN0YXRlOwkJCS8qIDB4MTAgQ3VycmVudCBzdGF0ZSAqLworCV91MTYJCXNlbmRfcG9sbDsJCS8qIDB4MTIgU2VuZCBhIFBvbGwgUGFja2V0ICovCisJX3UxNgkJbHR0X3A7CQkJLyogMHgxNCBQcm9jZXNzIERlc2NyaXB0b3IgKi8KKwlfdTE2CQlscnRfcDsJCQkvKiAweDE2IFByb2Nlc3MgRGVzY3JpcHRvciAqLworCV91MTYJCWxydF9zdGF0dXM7CQkvKiAweDE4IEN1cnJlbnQgbHJ0IHN0YXR1cyAqLworCV91MTYJCWx0dF9zdGF0dXM7CQkvKiAweDFBIEN1cnJlbnQgbHR0IHN0YXR1cyAqLworCV91MTYJCXRpbWVvdXQ7CQkvKiAweDFDIFRpbWVvdXQgdmFsdWUgKi8KKwlfdTE2CQl0b3BvbG9neTsJCS8qIDB4MUUgVG9wb2xvZ3kgYml0cyAqLworCV91MTYJCW1vbl9sdHQ7CQkvKiAweDIwICovCisJX3UxNgkJbW9uX2xydDsJCS8qIDB4MjIgKi8KKwlfdTE2CQludW1fcGt0czsJCS8qIDB4MjQgKi8KKwlfdTE2CQlhZGRfcGFja2V0X2xpc3Q7CS8qIDB4MjYgQWRkIHBhY2tldHMgdG8gaGVyZSAqLworCV91MTYJCXJlbW92ZV9wYWNrZXRfbGlzdDsJLyogMHgyOCBTZW5kIHBhY2tldHMgZnJvbSBoZXJlICovCisKKwlfdTE2CQlscnRfZmFpbF9jaGFuOwkJLyogMHgyQSBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKwlfdTE2CQlsdHRfZmFpbF9jaGFuOwkJLyogMHgyQyBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKworCVJVUAkJcnVwOwkJCS8qIDB4MkUgUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXMgKi8KKwlSVVAJCWxpbmtfcnVwOwkJLyogMHg0MCBSVVAgZm9yIHRoZSBsaW5rIChQT0xMLCB0b3BvbG9neSBldGMuKSAqLworCV91MTYJCWF0dGFjaGVkX2xpbms7CQkvKiAweDUyIE51bWJlciBvZiBhdHRhY2hlZCBsaW5rICovCisJX3UxNgkJY3N1bV9lcnJvcnM7CQkvKiAweDU0IGNzdW0gZXJyb3JzICovCisJX3UxNgkJbnVtX2Rpc2Nvbm5lY3RzOwkvKiAweDU2IG51bWJlciBvZiBkaXNjb25uZWN0cyAqLworCV91MTYJCW51bV9zeW5jX3JjdmQ7CQkvKiAweDU4ICMgc3luYydzIHJlY2VpdmVkICovCisJX3UxNgkJbnVtX3N5bmNfcnFzdDsJCS8qIDB4NUEgIyBzeW5jIHJlcXVlc3RzICovCisJX3UxNgkJbnVtX3R4OwkJCS8qIDB4NUMgTnVtIHBrdHMgc2VudCAqLworCV91MTYJCW51bV9yeDsJCQkvKiAweDVFIE51bSBwa3RzIHJlY2VpdmVkICovCisJX3UxNgkJbW9kdWxlX2F0dGFjaGVkOwkvKiAweDYwIE1vZHVsZSB0cHllcyBvZiBhdHRhY2hlZCAqLworCV91MTYJCWxlZF90aW1lb3V0OwkJLyogMHg2MiBMRUQgdGltZW91dCAqLworCV91MTYJCWZpcnN0X3BvcnQ7CQkvKiAweDY0IEZpcnN0IHBvcnQgdG8gc2VydmljZSAqLworCV91MTYJCWxhc3RfcG9ydDsJCS8qIDB4NjYgTGFzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKworfSBMUEI7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlMUEJfbGlua19udW1iZXIJCTB4MDAJCS8qIDB4MDAgTGluayBOdW1iZXIgKi8KKyNkZWZpbmUJTFBCX2luX2NoCQkweDAyCQkvKiAweDAyIExpbmsgSW4gQ2hhbm5lbCAqLworI2RlZmluZQlMUEJfb3V0X2NoCQkweDA0CQkvKiAweDA0IExpbmsgT3V0IENoYW5uZWwgKi8KKyNkZWZpbmUJTFBCX2F0dGFjaGVkX3NlcmlhbAkweDA2CQkvKiAweDA2IEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUJTFBCX2F0dGFjaGVkX2hvc3Rfc2VyaWFsIDB4MEEJCS8qIDB4MEEgU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobyBib290ZWQgb3RoZXIgZW5kICovCisjZGVmaW5lCUxQQl9kZXNjaGVkdWxlZAkJMHgwRQkJLyogMHgwRSBDdXJyZW50bHkgRGVzY2hlZHVsZWQgKi8KKyNkZWZpbmUJTFBCX3N0YXRlCQkweDEwCQkvKiAweDEwIEN1cnJlbnQgc3RhdGUgKi8KKyNkZWZpbmUJTFBCX3NlbmRfcG9sbAkJMHgxMgkJLyogMHgxMiBTZW5kIGEgUG9sbCBQYWNrZXQgKi8KKyNkZWZpbmUJTFBCX2x0dF9wCQkweDE0CQkvKiAweDE0IFByb2Nlc3MgRGVzY3JpcHRvciAqLworI2RlZmluZQlMUEJfbHJ0X3AJCTB4MTYJCS8qIDB4MTYgUHJvY2VzcyBEZXNjcmlwdG9yICovCisjZGVmaW5lCUxQQl9scnRfc3RhdHVzCQkweDE4CQkvKiAweDE4IEN1cnJlbnQgbHJ0IHN0YXR1cyAqLworI2RlZmluZQlMUEJfbHR0X3N0YXR1cwkJMHgxQQkJLyogMHgxQSBDdXJyZW50IGx0dCBzdGF0dXMgKi8KKyNkZWZpbmUJTFBCX3RpbWVvdXQJCTB4MUMJCS8qIDB4MUMgVGltZW91dCB2YWx1ZSAqLworI2RlZmluZQlMUEJfdG9wb2xvZ3kJCTB4MUUJCS8qIDB4MUUgVG9wb2xvZ3kgYml0cyAqLworI2RlZmluZQlMUEJfbW9uX2x0dAkJMHgyMAkJLyogMHgyMCAqLworI2RlZmluZQlMUEJfbW9uX2xydAkJMHgyMgkJLyogMHgyMiAqLworI2RlZmluZQlMUEJfbnVtX3BrdHMJCTB4MjQJCS8qIDB4MjQgKi8KKyNkZWZpbmUJTFBCX2FkZF9wYWNrZXRfbGlzdAkweDI2CQkvKiAweDI2IEFkZCBwYWNrZXRzIHRvIGhlcmUgKi8KKyNkZWZpbmUJTFBCX3JlbW92ZV9wYWNrZXRfbGlzdAkweDI4CQkvKiAweDI4IFNlbmQgcGFja2V0cyBmcm9tIGhlcmUgKi8KKyNkZWZpbmUJTFBCX2xydF9mYWlsX2NoYW4JMHgyQQkJLyogMHgyQSBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKyNkZWZpbmUJTFBCX2x0dF9mYWlsX2NoYW4JMHgyQwkJLyogMHgyQyBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKyNkZWZpbmUJTFBCX3J1cAkJCTB4MkUJCS8qIDB4MkUgUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXMgKi8KKyNkZWZpbmUJTFBCX2xpbmtfcnVwCQkweDQwCQkvKiAweDQwIFJVUCBmb3IgdGhlIGxpbmsgKFBPTEwsIHRvcG9sb2d5IGV0Yy4pICovCisjZGVmaW5lCUxQQl9hdHRhY2hlZF9saW5rCTB4NTIJCS8qIDB4NTIgTnVtYmVyIG9mIGF0dGFjaGVkIGxpbmsgKi8KKyNkZWZpbmUJTFBCX2NzdW1fZXJyb3JzCQkweDU0CQkvKiAweDU0IGNzdW0gZXJyb3JzICovCisjZGVmaW5lCUxQQl9udW1fZGlzY29ubmVjdHMJMHg1NgkJLyogMHg1NiBudW1iZXIgb2YgZGlzY29ubmVjdHMgKi8KKyNkZWZpbmUJTFBCX251bV9zeW5jX3JjdmQJMHg1OAkJLyogMHg1OCAjIHN5bmMncyByZWNlaXZlZCAqLworI2RlZmluZQlMUEJfbnVtX3N5bmNfcnFzdAkweDVBCQkvKiAweDVBICMgc3luYyByZXF1ZXN0cyAqLworI2RlZmluZQlMUEJfbnVtX3R4CQkweDVDCQkvKiAweDVDIE51bSBwa3RzIHNlbnQgKi8KKyNkZWZpbmUJTFBCX251bV9yeAkJMHg1RQkJLyogMHg1RSBOdW0gcGt0cyByZWNlaXZlZCAqLworI2RlZmluZQlMUEJfbW9kdWxlX2F0dGFjaGVkCTB4NjAJCS8qIDB4NjAgTW9kdWxlIHRweWVzIG9mIGF0dGFjaGVkICovCisjZGVmaW5lCUxQQl9sZWRfdGltZW91dAkJMHg2MgkJLyogMHg2MiBMRUQgdGltZW91dCAqLworI2RlZmluZQlMUEJfZmlyc3RfcG9ydAkJMHg2NAkJLyogMHg2NCBGaXJzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKyNkZWZpbmUJTFBCX2xhc3RfcG9ydAkJMHg2NgkJLyogMHg2NiBMYXN0IHBvcnQgdG8gc2VydmljZSAqLworI2RlZmluZQlzaXplb2ZfTFBCCQkweDY4CQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NjggKi8KKworI2RlZmluZQlMSU5LU19QRVJfVU5JVAkJNAkJLyogbnVtYmVyIG9mIGxpbmtzIGZyb20gYSBob3N0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEZSRUVfTElTVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFVzZWQgdG8gb3ZlcmxheSBwYWNrZXQgaGVhZGVycyB3aGVuIGFsbG9jYXRpbmcvZnJlZWluZyBwYWNrZXRzIGZyb20gdGhlIGZyZWUgbGlzdCAqLworCit0eXBlZGVmCXN0cnVjdAlfRlJFRV9MSVNUCit7CisJX3UxNgkJbmV4dDsJCQkvKiAweDAwIG9mZnNldCBvZiBuZXh0IGxpc3QgaXRlbSAqLworCV91MTYJCXByZXY7CQkJLyogMHgwMiBvZmZzZXQgb2YgcHJldmlvdXMgbGlzdCBpdGVtICovCisKK30gRlJFRV9MSVNUOworCisvKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCisKKyNkZWZpbmUJRkxfbmV4dAkJCTB4MDAJCS8qIDB4MDAgb2Zmc2V0IG9mIG5leHQgbGlzdCBpdGVtICovCisjZGVmaW5lCUZMX3ByZXYJCQkweDAyCQkvKiAweDAyIG9mZnNldCBvZiBwcmV2aW91cyBsaXN0IGl0ZW0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQS1QgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIFBLVCBpcyB0aGUgbWFpbiB1bml0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBIb3N0IENhcmRzIGFuZCBSVEFzIGFjcm9zcworICAgdGhlIFJJTyBuZXR3b3JrLiAgKi8KKworI2RlZmluZSBQS1RfTUFYX0RBVEFfTEVOICAgNzIJCQkvKiBTaXplIG9mIHBhY2tldCBkYXRhICovCisKK3R5cGVkZWYJc3RydWN0CV9QS1QKK3sKKwlfdTgJCWRlc3RfdW5pdDsJCS8qIDB4MDAgRGVzdGluYXRpb24gVW5pdCBJZCAqLworCV91OAkJZGVzdF9wb3J0OwkJLyogMHgwMSBEZXN0aW5hdGlvbiBQb3J0ICovCisJX3U4CQlzcmNfdW5pdDsJCS8qIDB4MDIgU291cmNlIFVuaXQgSWQgKi8KKwlfdTgJCXNyY19wb3J0OwkJLyogMHgwMyBTb3VyY2UgUG9ydCAqLworCV91OAkJbGVuOwkJCS8qIDB4MDQgTGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSBmaWVsZCAqLworCV91OAkJY29udHJvbDsJCS8qIDB4MDUgKi8KKwlfdTgJCWRhdGFbUEtUX01BWF9EQVRBX0xFTl07CS8qIDB4MDYgQWN0dWFsIGRhdGEgKi8KKwlfdTE2CQljc3VtOwkJCS8qIDB4NEUgQy1TVU0gKi8KKworfSBQS1Q7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlQS1RfZGVzdF91bml0CQkweDAwCQkvKiAweDAwIERlc3RpbmF0aW9uIFVuaXQgSWQgKi8KKyNkZWZpbmUJUEtUX2Rlc3RfcG9ydAkJMHgwMQkJLyogMHgwMSBEZXN0aW5hdGlvbiBQb3J0ICovCisjZGVmaW5lCVBLVF9zcmNfdW5pdAkJMHgwMgkJLyogMHgwMiBTb3VyY2UgVW5pdCBJZCAqLworI2RlZmluZQlQS1Rfc3JjX3BvcnQJCTB4MDMJCS8qIDB4MDMgU291cmNlIFBvcnQgKi8KKyNkZWZpbmUJUEtUX2xlbgkJCTB4MDQJCS8qIDB4MDQgTGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSBmaWVsZCAqLworI2RlZmluZQlQS1RfY29udHJvbAkJMHgwNQkJLyogMHgwNSAqLworI2RlZmluZQlQS1RfZGF0YQkJMHgwNgkJLyogMHgwNiBBY3R1YWwgZGF0YSAqLworI2RlZmluZQlQS1RfY3N1bQkJMHg0RQkJLyogMHg0RSBDLVNVTSAqLworI2RlZmluZQlzaXplb2ZfUEtUCQkweDUwCQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NTAgKi8KKworLyogUEtULmxlbiBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlQS1RfQ01EX0JJVAkJMHg4MAorI2RlZmluZQlQS1RfQ01EX0RBVEEJCTB4ODAKKyNkZWZpbmUJUEtUX0xFTl9NQVNLCQkweDdGCisKKy8qIFBLVC5jb250cm9sIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVBLVF9BQ0sJCQkweDQwCisjZGVmaW5lCVBLVF9UR0wJCQkweDIwCisjZGVmaW5lCURBVEFfV05EVwkJMHgxMAorI2RlZmluZQlQS1RfVFRMX01BU0sJCTB4MEYKKyNkZWZpbmUJTUFYX1RUTAkJCTB4MEYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQ29udHJvbCBQYWNrZXRzICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBkZWZpbmUgdGhlIGNvbnRyb2wgcGFja2V0cyBzZW50CisgICBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIFJJTyBQb3J0cywgUlRBcyBhbmQgSG9zdCBDYXJkcy4gKi8KKworI2RlZmluZQlQUkVfRU1QVElWRQkJMHg4MAkJCS8qIFByZS1lbXB0aXZlIGNvbW1hbmQgKHNlbnQgdmlhIHBvcnQncyBSVVApICovCisKKy8qICJpbi1iYW5kIiBhbmQgInByZS1lbXB0aXZlIiBwb3J0IGNvbW1hbmRzLi4uICovCisjZGVmaW5lCU9QRU4JCQkweDAwCQkJLyogRHJpdmVyLT5SSU8gT3BlbiBhIHBvcnQgKi8KKyNkZWZpbmUJQ09ORklHCQkJMHgwMQkJCS8qIERyaXZlci0+UklPIENvbmZpZ3VyZSBhIHBvcnQgKi8KKyNkZWZpbmUJTU9QRU4JCQkweDAyCQkJLyogRHJpdmVyLT5SSU8gTW9kZW0gb3BlbiAod2FpdCBmb3IgRENEKSAqLworI2RlZmluZQlDTE9TRQkJCTB4MDMJCQkvKiBEcml2ZXItPlJJTyBDbG9zZSBhIHBvcnQgKi8KKyNkZWZpbmUJV0ZMVVNICQkJKDB4MDR8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIFdyaXRlIGZsdXNoICovCisjZGVmaW5lCVJGTFVTSAkJCSgweDA1fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBSZWFkIGZsdXNoICovCisjZGVmaW5lCVJFU1VNRQkJCSgweDA2fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBCZWhhdmUgYXMgaWYgWE9OIHJlY2VpdmVkICovCisjZGVmaW5lCVNCUkVBSwkJCTB4MDcJCQkvKiBEcml2ZXItPlJJTyBTdGFydCBicmVhayAqLworI2RlZmluZQlFQlJFQUsJCQkweDA4CQkJLyogRHJpdmVyLT5SSU8gRW5kIGJyZWFrICovCisjZGVmaW5lCVNVU1BFTkQJCQkoMHgwOXxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gQmVoYXZlIGFzIGlmIFhPRkYgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJRkNMT1NFCQkJKDB4MEF8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEZvcmNlIGNsb3NlICovCisjZGVmaW5lCVhQUklOVAkJCTB4MEIJCQkvKiBEcml2ZXItPlJJTyBYcHJpbnQgcGFja2V0ICovCisjZGVmaW5lCU1CSVMJCQkoMHgwQ3xQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gU2V0IG1vZGVtIGxpbmVzICovCisjZGVmaW5lCU1CSUMJCQkoMHgwRHxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gQ2xlYXIgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUJTVNFVAkJCSgweDBFfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBTZXQgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUJUENMT1NFCQkJMHgwRgkJCS8qIERyaXZlci0+UklPIFBzZXVkbyBjbG9zZSAqLworI2RlZmluZQlNR0VUCQkJKDB4MTB8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEZvcmNlIHVwZGF0ZSBvZiBtb2RlbSBzdGF0dXMgKi8KKyNkZWZpbmUJTUVNRFVNUAkJCSgweDExfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBERUJVRyByZXF1ZXN0IGZvciBSVEEgbWVtb3J5ICovCisjZGVmaW5lCVJFQURfUkVHSVNURVIJCSgweDEyfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBERUJVRyByZWFkIENEMTQwMCByZWdpc3RlciAqLworCisvKiBSZW1vdGUgVW5pdCBQb3J0IChSVVApIHBhY2tldCBkZWZpbml0aW9ucy4uLiAoc3BlY2lmaWVkIGluIFBLVC5kZXN0X3VuaXQgYW5kIFBLVC5zcmNfdW5pdCkgKi8KKyNkZWZpbmUJU1lOQ19SVVAJCTB4RkYJCQkvKiBEb3dubG9hZCBpbnRlcm5hbCAqLworI2RlZmluZQlDT01NQU5EX1JVUAkJMHhGRQkJCS8qIENvbW1hbmQgYWNrL3N0YXR1cyAqLworI2RlZmluZQlFUlJPUl9SVVAJCTB4RkQJCQkvKiBEb3dubG9hZCBpbnRlcm5hbCAqLworI2RlZmluZQlQT0xMX1JVUAkJMHhGQwkJCS8qIERvd25sb2FkIGludGVybmFsICovCisjZGVmaW5lCUJPT1RfUlVQCQkweEZCCQkJLyogVXNlZCB0byBib290IFJUQXMgKi8KKyNkZWZpbmUJUk9VVEVfUlVQCQkweEZBCQkJLyogVXNlZCB0byBzcGVjaWZ5IHJvdXRpbmcvdG9wb2xvZ3kgKi8KKyNkZWZpbmUJU1RBVFVTX1JVUAkJMHhGOQkJCS8qIE5vdCB1c2VkICovCisjZGVmaW5lCVBPV0VSX1JVUAkJMHhGOAkJCS8qIERvd25sb2FkIGludGVybmFsICovCisKKy8qIENPTU1BTkRfUlVQIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPTVBMRVRFCQkoMHgyMHxQUkVfRU1QVElWRSkJLyogUklPLT5Ecml2ZXIgQ29tbWFuZCBjb21wbGV0ZSAqLworI2RlZmluZQlCUkVBS19SRUNFSVZFRAkJKDB4MjF8UFJFX0VNUFRJVkUpCS8qIFJJTy0+RHJpdmVyIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lCU1PREVNX1NUQVRVUwkJKDB4MjJ8UFJFX0VNUFRJVkUpCS8qIFJJTy0+RHJpdmVyIE1vZGVtIHN0YXR1cyBjaGFuZ2UgKi8KKworLyogQk9PVF9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJQk9PVF9SRVFVRVNUCQkweDAwCQkJLyogUklPLT5Ecml2ZXIgUmVxdWVzdCBmb3IgYm9vdCAqLworI2RlZmluZQlCT09UX0FCT1JUCQkweDAxCQkJLyogRHJpdmVyLT5SSU8gQWJvcnQgYSBib290ICovCisjZGVmaW5lCUJPT1RfU0VRVUVOQ0UJCTB4MDIJCQkvKiBEcml2ZXItPlJJTyBQYWNrZXQgd2l0aCBmaXJtd2FyZSBkZXRhaWxzICovCisjZGVmaW5lCUJPT1RfQ09NUExFVEVECQkweDAzCQkJLyogUklPLT5Ecml2ZXIgQm9vdCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgSUZPQUQJCQkweDJGCQkJLyogRHJpdmVyLT5SSU8gU2h1dGRvd24vUmVib290IFJUQSAoRmFsbCBPdmVyIEFuZCBEaWUpICovCisjZGVmaW5lCUlERU5USUZZCQkweDMwCQkJLyogRHJpdmVyLT5SSU8gSWRlbnRpZnkgUlRBICovCisjZGVmaW5lCVpPTUJJRQkJCTB4MzEJCQkvKiBEcml2ZXItPlJJTyBTaHV0ZG93bi9GbGFzaCBMRURzICovCisjZGVmaW5lCVVGT0FECQkJMHgzMgkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL1JlYm9vdCBuZWlnaGJvdXJpbmcgUlRBICovCisjZGVmaW5lIElXQUlUCQkJMHgzMwkJCS8qIERyaXZlci0+UklPIFBhdXNlIGJvb3RpbmcgcHJvY2VzcyAqLworCisvKiBST1VURV9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUk9VVEVfUkVRVUVTVAkJMHgwMAkJCS8qIFJJTy0+RHJpdmVyIFJlcXVlc3QgYW4gSUQgKi8KKyNkZWZpbmUJUk9VVEVfRk9BRAkJMHgwMQkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL3JlYm9vdCBSVEEgKi8KKyNkZWZpbmUJUk9VVEVfQUxSRUFEWQkJMHgwMgkJCS8qIERyaXZlci0+UklPIE5vdCB1c2VkICovCisjZGVmaW5lCVJPVVRFX1VTRUQJCTB4MDMJCQkvKiBEcml2ZXItPlJJTyBOb3QgdXNlZCAqLworI2RlZmluZQlST1VURV9BTExPQ0FURQkJMHgwNAkJCS8qIERyaXZlci0+UklPIEFsbG9jYXRlIFJUQSBSVVAgbnVtYmVycyAqLworI2RlZmluZQlST1VURV9SRVFfVE9QCQkweDA1CQkJLyogRHJpdmVyLT5SSU8gTm90IHVzZWQgKi8KKyNkZWZpbmUgUk9VVEVfVE9QT0xPR1kJCTB4MDYJCQkvKiBSSU8tPkRyaXZlciBSb3V0ZS9Ub3BvbG9neSBzdGF0dXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBPUEVOICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIFNlbnQgdG8gb3BlbiBhIHBvcnQuIAorICAgU3RydWN0dXJlIG9mIGNvbmZpZ3VyYXRpb24gaW5mbyB1c2VkIHdpdGggT1BFTiwgQ09ORklHIGFuZCBNT1BFTiBwYWNrZXRzLi4uICovCisKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9Db3IxCQkoUEtUX0RhdGErMSkJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJUEtUX0NvcjIJCShQS1RfRGF0YSsyKQkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlQS1RfQ29yNAkJKFBLVF9EYXRhKzMpCQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciA0ICovCisjZGVmaW5lCVBLVF9Db3I1CQkoUEtUX0RhdGErNCkJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJUEtUX1R4WG9uCQkoUEtUX0RhdGErNSkJCS8qIFRyYW5zbWl0IFhPTiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUEtUX1R4WG9mZgkJKFBLVF9EYXRhKzYpCQkvKiBUcmFuc21pdCBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZQlQS1RfUnhYb24JCShQS1RfRGF0YSs3KQkJLyogUmVjZWl2ZSBYT04gY2hhcmFjdGVyICovCisjZGVmaW5lCVBLVF9SeFhvZmYJCShQS1RfRGF0YSs4KQkJLyogUmVjZWl2ZSBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZQlQS1RfTG5leHQJCShQS1RfRGF0YSs5KQkJLyogTG5leHQgY2hhcmFjdGVyICovCisjZGVmaW5lCVBLVF9UeEJhdWQJCShQS1RfRGF0YSsxMCkJCS8qIFRyYW5zbWl0IGJhdWQgcmF0ZSAqLworI2RlZmluZQlQS1RfUnhCYXVkCQkoUEtUX0RhdGErMTEpCQkvKiBSZWNlaXZlIGJhdWQgcmF0ZSAqLworCisvKiBDT1IxIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPUjFfUEFSSVRZCQkweEUwCQkJLyogUGFyaXR5IG1hc2sgKi8KKyNkZWZpbmUJQ09SMV9OT05FCQkweDAwCQkJLyogTm8gcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfU1BBQ0UJCTB4MjAJCQkvKiBTcGFjZSBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9FVkVOCQkweDQwCQkJLyogRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9NQVJLCQkweEEwCQkJLyogTWFyayBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9PREQJCTB4QzAJCQkvKiBPZGQgcGFyaXR5ICovCisKKyNkZWZpbmUJQ09SMV9TVE9QQklUUwkJMHgwQwkJCS8qIFN0b3AgYml0cyBtYXNrICovCisjZGVmaW5lCUNPUjFfU1RPUDEJCTB4MDAJCQkvKiAxIHN0b3AgYml0ICovCisjZGVmaW5lCUNPUjFfU1RPUDFfNQkJMHgwNAkJCS8qIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV9TVE9QMgkJMHgwOAkJCS8qIDIgc3RvcCBiaXRzICovCisKKyNkZWZpbmUJQ09SMV9EQVRBQklUUwkJMHgwMwkJCS8qIERhdGEgYml0cyBtYXNrICovCisjZGVmaW5lCUNPUjFfREFUQTUJCTB4MDAJCQkvKiA1IGRhdGEgYml0cyAqLworI2RlZmluZQlDT1IxX0RBVEE2CQkweDAxCQkJLyogNiBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV9EQVRBNwkJMHgwMgkJCS8qIDcgZGF0YSBiaXRzICovCisjZGVmaW5lCUNPUjFfREFUQTgJCTB4MDMJCQkvKiA4IGRhdGEgYml0cyAqLworCisvKiBDT1IyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPUjJfWE9OX1RYRkxPVwkJMHg0MAkJCS8qIFhPTi9YT0ZGIFRyYW5zbWl0IEZsb3cgKi8KKyNkZWZpbmUJQ09SMl9YQU5ZX1RYRkxPVwkweEMwCQkJLyogWE9OL1hBTlkgVHJhbnNtaXQgRmxvdyAqLworI2RlZmluZQlDT1IyX0hVUENMCQkweDIwCQkJLyogSGFuZyBVcCBPbiBDbG9zZSAqLworI2RlZmluZQlDT1IyX0RTUl9UWEZMT1cJCTB4MDgJCQkvKiBEU1IgVHJhbnNtaXQgRmxvdyBDb250cm9sICovCisjZGVmaW5lCUNPUjJfUlRTX1JYRkxPVwkJMHgwNAkJCS8qIFJUUyBSZWNlaXZlIEZsb3cgQ29udHJvbCAqLworI2RlZmluZQlDT1IyX0NUU19UWEZMT1cJCTB4MDIJCQkvKiBDVFMgVHJhbnNtaXQgRmxvdyBDb250cm9sICovCisjZGVmaW5lCUNPUjJfWE9OX1JYRkxPVwkJMHgwMQkJCS8qIFhPTi9YT0ZGIFJlY2VpdmUgRmxvdyAqLworCisvKiBDT1I0IGRlZmluaXRpb24uLi4gKi8KKyNkZWZpbmUJQ09SNF9JR05DUgkJMHg4MAkJCS8qIERpc2NhcmQgcmVjZWl2ZWQgQ1IgKi8KKyNkZWZpbmUJQ09SNF9JQ1JOTAkJMHg0MAkJCS8qIE1hcCByZWNlaXZlZCBDUiAtPiBOTCAqLworI2RlZmluZQlDT1I0X0lOTENSCQkweDIwCQkJLyogTWFwIHJlY2VpdmVkIE5MIC0+IENSICovCisjZGVmaW5lCUNPUjRfSUdOQlJLCQkweDEwCQkJLyogSWdub3JlIFJlY2VpdmVkIEJyZWFrICovCisjZGVmaW5lCUNPUjRfTkJSS0lOVAkJMHgwOAkJCS8qIE5vIGludGVycnVwdCBvbiByeCBCcmVhayAqLworI2RlZmluZQlDT1I0X0lHTlBBUgkJMHgwNAkJCS8qIGlnbm9yZSByeCBwYXJpdHkgZXJyb3IgY2hhcnMgKi8KKyNkZWZpbmUJQ09SNF9QQVJNUksJCTB4MDIJCQkvKiBNYXJrIHJ4IHBhcml0eSBlcnJvciBjaGFycyAqLworI2RlZmluZQlDT1I0X1JBSVNFTU9ECQkweDAxCQkJLyogUmFpc2UgbW9kZW0gbGluZXMgb24gITAgYmF1ZCAqLworCisvKiBDT1I1IGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPUjVfSVNUUklQCQkweDgwCQkJLyogU3RyaXAgaW5wdXQgY2hhcnMgdG8gNyBiaXRzICovCisjZGVmaW5lCUNPUjVfTE5FCQkweDQwCQkJLyogRW5hYmxlIExORVhUIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUJQ09SNV9DTU9FCQkweDIwCQkJLyogTWF0Y2ggZ29vZCAmIGVycm9yIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUJQ09SNV9UQUIzCQkweDEwCQkJLyogVEFCMyBtb2RlICovCisjZGVmaW5lCUNPUjVfVFNUQVRFX09OCQkweDA4CQkJLyogRW5hYmxlIHRidXN5L3RzdG9wIG1vbml0b3JpbmcgKi8KKyNkZWZpbmUJQ09SNV9UU1RBVEVfT0ZGCQkweDA0CQkJLyogRGlzYWJsZSB0YnVzeS90c3RvcCBtb25pdG9yaW5nICovCisjZGVmaW5lCUNPUjVfT05MQ1IJCTB4MDIJCQkvKiBOTCAtPiBDUiBOTCBvbiBvdXRwdXQgKi8KKyNkZWZpbmUJQ09SNV9PQ1JOTAkJMHgwMQkJCS8qIENSIC0+IE5MIG9uIG91dHB1dCAqLworCisvKiBSeEJhdWQgYW5kIFR4QmF1ZCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fQjAJCQkweDAwCQkJLyogUlRTIC8gRFRSIHNpZ25hbHMgZHJvcHBlZCAqLworI2RlZmluZQlSSU9fQjUwCQkJMHgwMQkJCS8qIDUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I3NQkJCTB4MDIJCQkvKiA3NSBiYXVkICovCisjZGVmaW5lCVJJT19CMTEwCQkweDAzCQkJLyogMTEwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMzQJCTB4MDQJCQkvKiAxMzQuNSBiYXVkICovCisjZGVmaW5lCVJJT19CMTUwCQkweDA1CQkJLyogMTUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyMDAJCTB4MDYJCQkvKiAyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjMwMAkJMHgwNwkJCS8qIDMwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNjAwCQkweDA4CQkJLyogNjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMjAwCQkweDA5CQkJLyogMTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTgwMAkJMHgwQQkJCS8qIDE4MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjI0MDAJCTB4MEIJCQkvKiAyNDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I0ODAwCQkweDBDCQkJLyogNDgwMCBiYXVkICovCisjZGVmaW5lCVJJT19COTYwMAkJMHgwRAkJCS8qIDk2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjE5MjAwCQkweDBFCQkJLyogMTkyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjM4NDAwCQkweDBGCQkJLyogMzg0MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjU2MDAwCQkweDEwCQkJLyogNTYwMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjU3NjAwCQkweDExCQkJLyogNTc2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjY0MDAwCQkweDEyCQkJLyogNjQwMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjExNTIwMAkJMHgxMwkJCS8qIDExNTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMjAwMAkJMHgxNAkJCS8qIDIwMDAgYmF1ZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09ORklHICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgQ09ORklHIGlzIHNlbnQgZnJvbSB0aGUgZHJpdmVyIHRvIGNvbmZpZ3VyZSBhbiBhbHJlYWR5IG9wZW5lZCBwb3J0LgorICAgUGFja2V0IHN0cnVjdHVyZSBpcyBzYW1lIGFzIE9QRU4uICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTU9QRU4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgTU9QRU4gaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gb3BlbiBhIHBvcnQgYXR0YWNoZWQgdG8gYSBtb2RlbS4gKGluLWJhbmQpCisgICBQYWNrZXQgc3RydWN0dXJlIGlzIHNhbWUgYXMgT1BFTi4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBDTE9TRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBDTE9TRSBpcyBzZW50IGZyb20gdGhlIGRyaXZlciB0byBjbG9zZSBhIHByZXZpb3VzbHkgb3BlbmVkIHBvcnQuCisgICBObyBwYXJhbWV0ZXJzLgorICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFdGTFVTSCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBXRkxVU0ggaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBmbHVzaCB0aGUgd3JpdGUgYnVmZmVycyBhbmQKKyAgIHBhY2tldHMgb2YgYSBwb3J0LiAgKHByZS1lbXB0aXZlKQorICAgCisgICBXRkxVU0ggaXMgYWxzbyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCBhcyBhIG1hcmtlciB0byBlbmQKKyAgIHdyaXRlIGZsdXNoaW5nIHByZXZpb3VzbHkgc3RhcnRlZCBieSBhIHByZS1lbXB0aXZlIFdGTFVTSCBwYWNrZXQuIChpbi1iYW5kKQorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUkZMVVNIICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFJGTFVTSCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIGZsdXNoIHRoZSByZWFkIGJ1ZmZlcnMgYW5kCisgICBwYWNrZXRzIG9mIGEgcG9ydC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJFU1VNRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBSRVNVTUUgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjYXVzZSBhIHBvcnQgdG8gcmVzdW1lIAorICAgdHJhbnNtaXNzaW9uIG9mIGRhdGEgaWYgYmxvY2tlZCBieSBYT0ZGLiAgKGFzIGlmIFhPTiBoYWQgYmVlbiByZWNlaXZlZCkKKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNCUkVBSyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIFNCUkVBSyBpcyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCB0byBzdXNwZW5kIGRhdGEgYW5kIHN0YXJ0CisgICBicmVhayBzaWduYWwgdHJhbnNtaXNzaW9uLgorCisgICBJZiB0aGUgYnJlYWsgZGVsYXkgaXMgMCwgdGhlIGJyZWFrIHNpZ25hbCB3aWxsIGJlIGFja25vd2xlZGdlZCB3aXRoIGEKKyAgIFJVUF9DT01NQU5ELCBDT01QTEVURSBwYWNrZXQgYW5kIGNvbnRpbnVlIHVudGlsIGFuIEVCUkVBSyBwYWNrZXQgaXMgcmVjZWl2ZWQuCisKKyAgIE90aGVyd2lzZSwgdGhlcmUgaXMgbm8gYWNrbm93bGVkZ2VtZW50IGFuZCB0aGUgYnJlYWsgc2lnbmFsIHdpbGwgbGFzdCBmb3IgdGhlCisgICBzcGVjaWZpZWQgbnVtYmVyIG9mIG1TLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9CcmVha0RlbGF5CQkoUEtUX0RhdGErMSkJCS8qIEJyZWFrIGRlbGF5IGluIG1TICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBFQlJFQUsgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBFQlJFQUsgaXMgc2VudCBpbi1iYW5kIGZyb20gdGhlIGRyaXZlciB0byBhIHBvcnQgdG8gc3RvcCB0cmFuc21pc3Npb24gb2YgYQorICAgYnJlYWsgc2lnbmFsLgorCisgICBObyBwYXJhbWV0ZXJzLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNVU1BFTkQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBTVVNQRU5EIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gY2F1c2UgYSBwb3J0IHRvIHN1c3BlbmQKKyAgIHRyYW5zbWlzc2lvbiBvZiBkYXRhLiAgKGFzIGlmIFhPRkYgaGFkIGJlZW4gcmVjZWl2ZWQpCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBGQ0xPU0UgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgRkNMT1NFIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gZm9yY2UgY2xvc2UgYSBwb3J0LgorICAgQSBmb3JjZSBjbG9zZSBmbHVzaGVzIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHF1ZXVlcywgYW5kIGFsc28gbG93ZXJzIGFsbCBvdXRwdXQKKyAgIG1vZGVtIHNpZ25hbHMgaWYgdGhlIENPUjVfSFVQQ0wgKEhhbmcgVXAgT24gQ2xvc2UpIGZsYWcgaXMgc2V0LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgWFBSSU5UICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgWFBSSU5UIGlzIHNlbnQgYXMgYSBub3JtYWwgSS9PIGRhdGEgcGFja2V0IGV4Y2VwdCB0aGF0IHRoZSBQS1RfQ01EX0JJVCBvZgorICAgdGhlICJsZW4iIGZpZWxkIGlzIHNldCwgYW5kIHRoZSBmaXJzdCAiZGF0YSIgYnl0ZSBpcyBYUFJJTlQuCisKKyAgIFRoZSBJL08gZGF0YSBpbiB0aGUgWFBSSU5UIHBhY2tldCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKKyAgIC0JVHJhbnNwYXJlbnQgUHJpbnQgU3RhcnQgU2VxdWVuY2UKKyAgIC0JVHJhbnNwYXJlbnQgUHJpbnQgRGF0YQorICAgLQlUcmFuc3BhcmVudCBQcmludCBTdG9wIFNlcXVlbmNlLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1CSVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1CSVMgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBzZXQgYSBwb3J0J3MgbW9kZW0gc2lnbmFscy4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX01vZGVtU2V0CQkoUEtUX0RhdGErNCkJCS8qIE1vZGVtIHNldCBzaWduYWxzIG1hc2sgKi8KKworLyogTW9kZW1TZXQgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJTUJJU19SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gc2lnbmFsICovCisjZGVmaW5lCU1CSVNfRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIHNpZ25hbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1CSUMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1CSUMgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjbGVhciBhIHBvcnQncyBtb2RlbSBzaWduYWxzLgorICAgKi8KKyNpZiAwICAgCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisjZGVmaW5lCVBLVF9Nb2RlbUNsZWFyCQkoUEtUX0RhdGErNCkJCS8qIE1vZGVtIGNsZWFyIHNpZ25hbHMgbWFzayAqLworCisvKiBNb2RlbUNsZWFyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCU1CSUNfUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIHNpZ25hbCAqLworI2RlZmluZQlNQklDX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBzaWduYWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBNU0VUICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBNU0VUIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gc2V0L2NsZWFyIGEgcG9ydCdzIG1vZGVtIHNpZ25hbHMuICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworI2RlZmluZQlQS1RfTW9kZW1TZXQJCShQS1RfRGF0YSs0KQkJLyogTW9kZW0gc2V0IHNpZ25hbHMgbWFzayAqLworCisvKiBNb2RlbVNldCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlNU0VUX1JUUwkJMHgwMQkJCS8qIFJUUyBtb2RlbSBzaWduYWwgKi8KKyNkZWZpbmUJTVNFVF9EVFIJCTB4MDIJCQkvKiBEVFIgbW9kZW0gc2lnbmFsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQQ0xPU0UgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBQQ0xPU0UgaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gcHNldWRvIGNsb3NlIGEgcHJldmlvdXNseSBvcGVuZWQgcG9ydC4KKyAgIAorICAgVGhlIHBvcnQgd2lsbCBjbG9zZSB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQvcmVjZWl2ZWQsIGhvd2V2ZXIsIHRoZQorICAgcG9ydCdzIHRyYW5zbWl0IC8gcmVjZWl2ZSBhbmQgbW9kZW0gc2lnbmFscyB3aWxsIGJlIGxlZnQgZW5hYmxlZCBhbmQgdGhlCisgICBwb3J0IG1hcmtlZCBpbnRlcm5hbGx5IGFzIFBzZXVkbyBDbG9zZWQuICovCisKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUdFVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgTUdFVCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIHJlcXVlc3QgdGhlIHBvcnQncyBjdXJyZW50IG1vZGVtIHNpZ25hbHMuICovCisKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUVNRFVNUCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1FTURVTVAgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byByZXF1ZXN0IGEgZHVtcCBvZiAzMiBieXRlcworICAgb2YgdGhlIHNwZWNpZmllZCBwb3J0J3MgUlRBIGFkZHJlc3Mgc3BhY2UuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJFQURfUkVHSVNURVIgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBSRUFEX1JFR0lTVEVSIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gcmVxdWVzdCB0aGUgY29udGVudHMKKyAgIG9mIHRoZSBDRDE0MDAgcmVnaXN0ZXIgc3BlY2lmaWVkIGluIGFkZHJlc3MuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBDT01NQU5EX1JVUCAtIENPTVBMRVRFIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYWxsIHBvcnQgSS9PIGNvbnRyb2wgY29tbWFuZAorICAgcGFja2V0cywgZXhjZXB0IE1FTURVTVAgYW5kIFJFQURfUkVHSVNURVIuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9Qb3J0U3RhdHVzCQkoUEtUX0RhdGErNCkJCS8qIFBvcnQgc2lnbmFsIHN0YXR1cyAqLworI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCisKKy8qIE1vZGVtU3RhdHVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCU1PREVNX0RTUgkJMHg4MAkJCS8qIERhdGEgU2V0IFJlYWR5IG1vZGVtIHN0YXRlICovCisjZGVmaW5lCU1PREVNX0NUUwkJMHg0MAkJCS8qIENsZWFyIFRvIFNlbmQgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fUkkJCTB4MjAJCQkvKiBSaW5nIEluZGljYXRlIG1vZGVtIHN0YXRlICovCisjZGVmaW5lCU1PREVNX0NECQkweDEwCQkJLyogQ2FycmllciBEZXRlY3QgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fVFNUT1AJCTB4MDgJCQkvKiBUcmFuc21pdCBTdG9wcGVkIHN0YXRlICovCisjZGVmaW5lCU1PREVNX1RFTVBUWQkJMHgwNAkJCS8qIFRyYW5zbWl0IEVtcHR5IHN0YXRlICovCisjZGVmaW5lCU1PREVNX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBvdXRwdXQgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIG91dHB1dCBzdGF0ZSAqLworCisvKiBQb3J0U3RhdHVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVBPUlRfSVNPUEVOCQkweDAxCQkJLyogUG9ydCBvcGVuID8gKi8KKyNkZWZpbmUJUE9SVF9IVVBDTAkJMHgwMgkJCS8qIEhhbmd1cCBvbiBjbG9zZT8gKi8KKyNkZWZpbmUJUE9SVF9NT1BFTlBFTkQJCTB4MDQJCQkvKiBNb2RlbSBvcGVuIHBlbmRpbmcgKi8KKyNkZWZpbmUJUE9SVF9JU1BBUkFMTEVMCQkweDA4CQkJLyogUGFyYWxsZWwgcG9ydCAqLworI2RlZmluZQlQT1JUX0JSRUFLCQkweDEwCQkJLyogUG9ydCBvbiBicmVhayAqLworI2RlZmluZQlQT1JUX1NUQVRVU1BFTkQJCTAwMjAJCQkvKiBTdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUJUE9SVF9CUkVBS1BFTkQJCTB4NDAJCQkvKiBCcmVhayBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZQlQT1JUX01PREVNUEVORAkJMHg4MAkJCS8qIE1vZGVtIHN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgaXMgc2VudCBpbiByZXNwb25zZSB0byBhbGwgcG9ydCBJL08gY29udHJvbCBjb21tYW5kCisgICBwYWNrZXRzLCBleGNlcHQgTUVNRFVNUCBhbmQgUkVBRF9SRUdJU1RFUi4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX01vZGVtU3RhdHVzCQkoUEtUX0RhdGErMykJCS8qIE1vZGVtIHNpZ25hbCBzdGF0dXMgKi8KKyNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCisjaWYgMAorI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCisjZW5kaWYKKworLyogTW9kZW1TdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJTU9ERU1fRFNSCQkweDgwCQkJLyogRGF0YSBTZXQgUmVhZHkgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fQ1RTCQkweDQwCQkJLyogQ2xlYXIgVG8gU2VuZCBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9SSQkJMHgyMAkJCS8qIFJpbmcgSW5kaWNhdGUgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fQ0QJCTB4MTAJCQkvKiBDYXJyaWVyIERldGVjdCBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9UU1RPUAkJMHgwOAkJCS8qIFRyYW5zbWl0IFN0b3BwZWQgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fVEVNUFRZCQkweDA0CQkJLyogVHJhbnNtaXQgRW1wdHkgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIG91dHB1dCBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gb3V0cHV0IHN0YXRlICovCisKKy8qIFBvcnRTdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUE9SVF9JU09QRU4JCTB4MDEJCQkvKiBQb3J0IG9wZW4gPyAqLworI2RlZmluZQlQT1JUX0hVUENMCQkweDAyCQkJLyogSGFuZ3VwIG9uIGNsb3NlPyAqLworI2RlZmluZQlQT1JUX01PUEVOUEVORAkJMHgwNAkJCS8qIE1vZGVtIG9wZW4gcGVuZGluZyAqLworI2RlZmluZQlQT1JUX0lTUEFSQUxMRUwJCTB4MDgJCQkvKiBQYXJhbGxlbCBwb3J0ICovCisjZGVmaW5lCVBPUlRfQlJFQUsJCTB4MTAJCQkvKiBQb3J0IG9uIGJyZWFrICovCisjZGVmaW5lCVBPUlRfU1RBVFVTUEVORAkJMDAyMAkJCS8qIFN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZQlQT1JUX0JSRUFLUEVORAkJMHg0MAkJCS8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lCVBPUlRfTU9ERU1QRU5ECQkweDgwCQkJLyogTW9kZW0gc3RhdHVzIHBhY2tldCBwZW5kaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgLSBNRU1EVU1QICAgKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIE1FTURVTVAgaXMgc2VudCBhcyBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIGEgTUVNRFVNUAorICAgcG9ydCBJL08gY29udHJvbCBjb21tYW5kIHBhY2tldC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9Qb3J0U3RhdHVzCQkoUEtUX0RhdGErNCkJCS8qIFBvcnQgc2lnbmFsIHN0YXR1cyAqLworI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCisjZGVmaW5lCVBLVF9BZGRyZXNzCQkoUEtUX0RhdGErNikJCS8qIFJlcXVlc3RlZCBhZGRyZXNzICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0R1bXAJCShQS1RfRGF0YSs4KQkJLyogMzJieXRlcyBvZiByZXF1ZXN0ZWQgZHVtcCBkYXRhICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgLSBSRUFEX1JFR0lTVEVSICAgKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIFJFQURfUkVHSVNURVIgaXMgc2VudCBhcyBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIGEKKyAgIFJFQURfUkVHSVNURVIgcG9ydCBJL08gY29udHJvbCBjb21tYW5kIHBhY2tldC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKkNvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2RlZmluZQlQS1RfQ21kMgkJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIGNvZGUgY29weSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9SZWdpc3RlclZhbHVlCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLworI2lmIDAKKyNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBCUkVBS19SRUNFSVZFRCAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIENPTU1BTkRfUlVQIC0gQlJFQUtfUkVDRUlWRUQgcGFja2V0cyBhcmUgc2VudCB3aGVuIHRoZSBwb3J0IGRldGVjdHMgYSByZWNlaXZlIEJSRUFLIHNpZ25hbC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gTU9ERU1fU1RBVFVTICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBDT01NQU5EX1JVUCAtIE1PREVNX1NUQVRVUyBwYWNrZXRzIGFyZSBzZW50IHdoZW5ldmVyIHRoZSBwb3J0IGRldGVjdHMgYQorICAgY2hhbmdlIGluIHRoZSBpbnB1dCBtb2RlbSBzaWduYWwgc3RhdGVzLgorCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2RlZmluZQlQS1RfQ21kMgkJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIGNvZGUgY29weSAqLworI2RlZmluZQlQS1RfTW9kZW1TdGF0dXMJCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIEJPT1RfUkVRVUVTVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBCT09UX1JFUVVFU1QgcGFja2V0cyBhcmUgc2VudCB0byB0aGUgRHJpdmVyIGZyb20gUklPIHRvIHJlcXVlc3QKKyAgIGZpcm13YXJlIGNvZGUgdG8gbG9hZCBvbnRvIGF0dGFjaGVkIFJUQXMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gQk9PVF9TRVFVRU5DRSAgICoqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIEJPT1RfU0VRVUVOQ0UgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gUklPIGluIHJlc3BvbnNlCisgICB0byBhIEJPT1RfUlVQIC0gQk9PVF9SRVFVRVNUIHBhY2tldC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfTnVtUGFja2V0cwkJKFBLVF9EYXRhKzIpCQkvKiBQYWNrZXRzIHJlcXVpcmVkIHRvIGxvYWQgZmlybXdhcmUgKi8KKyNkZWZpbmUJUEtUX0xvYWRCYXNlCQkoUEtUX0RhdGErNCkJCS8qIFJUQSBmaXJtd2FyZSBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUJUEtUX0NvZGVTaXplCQkoUEtUX0RhdGErNikJCS8qIFNpemUgb2YgZmlybXdhcmUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJUEtUX0NtZFN0cmluZwkJKFBLVF9EYXRhKzgpCQkvKiBDb21tYW5kIHN0cmluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBCT09UX0NPTVBMRVRFRCAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIEJPT1RfUlVQIC0gQk9PVF9DT01QTEVURSBpcyBzZW50IHRvIHRoZSBEcml2ZXIgZnJvbSBSSU8gd2hlbiBkb3dubG9hZGluZyBvZgorICAgUlRBIGZpcm13YXJlIGhhcyBjb21wbGV0ZWQuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0xpbmtOdW1iZXIJCShQS1RfRGF0YSsxKQkJLyogTGluayBudW1iZXIgUlRBIGJvb3RlZCBvbiAqLworI2RlZmluZQlQS1RfU2VyaWFsTnVtYmVyCShQS1RfRGF0YSsyKQkJLyogNCBieXRlIHNlcmlhbCBudW1iZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gUGFja2V0IFJlcXVlc3QgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCBwYWNrZXQgd2l0aG91dCB0aGUgUEtUX0NNRF9CSVQgc2V0IGluIHRoZSBQS1QtPmxlbiBmaWVsZCBpcyBzZW50CisgICBmcm9tIFJJTyB0byB0aGUgRHJpdmVyIGFzIGEgcmVxdWVzdCBmb3IgYSBmaXJtd2FyZSBib290IHBhY2tldC4gKi8KKworI2RlZmluZQlQS1RfU2VxdWVuY2VOdW1iZXIJKFBLVF9EYXRhKzApCQkvKiBQYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gUGFja2V0IFJlc3BvbnNlICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgSW4gcmVzcG9uc2UgdG8gYSBCT09UX1JVUCBib290IHBhY2tldCByZXF1ZXN0LCB0aGUgZHJpdmVyIGZpbGxzIG91dCB0aGUgcmVzcG9uc2UKKyAgIHBhY2tldCB3aXRoIHRoZSA3MCBieXRlcyBvZiB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9TZXF1ZW5jZU51bWJlcgkoUEtUX0RhdGErMCkJCS8qIFBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfRmlybXdhcmVQYWNrZXQJKFBLVF9EYXRhKzIpCQkvKiBGaXJtd2FyZSBwYWNrZXQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIElGT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIElGT0FEIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUKKyAgIFJUQSB0byBzaHV0IGRvd24gYW5kIHJlYm9vdC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWZvYWRJZDEJCShQS1RfRGF0YSsyKQkJLyogSUZPQUQgSWQgMSAqLworI2RlZmluZQlQS1RfSWZvYWRJZDIJCShQS1RfRGF0YSszKQkJLyogSUZPQUQgSWQgMiAqLworCisjZGVmaW5lCUlGT0FESUQxCQkweEFECisjZGVmaW5lCUlGT0FESUQyCQkweEYwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gSURFTlRJRlkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBJREVOVElGWSBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlCisgICBSVEEgdG8gZmxhc2ggaXRzIExFRHMgZm9yIGEgcGVyaW9kIG9mIHRpbWUuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0lkZW50aWZ5SWQJCShQS1RfRGF0YSsyKQkJLyogZGVmaW5lcyBwYXR0ZXJuIHRvIGZsYXNoICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBaT01CSUUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBaT01CSUUgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gYW4gUlRBIHRvIGNhdXNlIHRoZQorICAgUlRBIHRvIHNodXQgZG93biBhbmQgZmxhc2ggaXQncyBMRURzLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9ab21iaWVJZDEJCShQS1RfRGF0YSsyKQkJLyogWk9NQklFIElkIDEgKi8KKyNkZWZpbmUJUEtUX1pvbWJpZUlkMgkJKFBLVF9EYXRhKzMpCQkvKiBaT01CSUUgSWQgMiAqLworCisjZGVmaW5lCVpPTUJJRUlEMQkJMHg1MgorI2RlZmluZQlaT01CSUVJRDIJCTB4MjEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIFVGT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIFVGT0FEIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUgUlRBCisgICB0byBhc2sgaXQncyBuZWlnaGJvdXJpbmcgUlRBIHRvIHNodXQgZG93biBhbmQgcmVib290LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfTGlua051bWJlcgkJKFBLVF9EYXRhKzEpCQkvKiBMaW5rIG51bWJlciBvZiBSVEEgdG8gVUZPQUQgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfVWZvYWRJZDEJCShQS1RfRGF0YSsyKQkJLyogVUZPQUQgSWQgMSAqLworI2RlZmluZQlQS1RfVWZvYWRJZDIJCShQS1RfRGF0YSszKQkJLyogVUZPQUQgSWQgMiAqLworCisjZGVmaW5lCVVGT0FESUQxCQkweDFFCisjZGVmaW5lCVVGT0FESUQyCQkweDBECisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBJV0FJVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBJV0FJVCBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlIFJUQQorICAgdG8gcGF1c2UgYm9vdGluZyBvbiB0aGUgc3BlY2lmaWVkIGxpbmsgZm9yIDMwIHNlY29uZHMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9MaW5rTnVtYmVyCQkoUEtUX0RhdGErMSkJCS8qIExpbmsgbnVtYmVyIG9mIFJUQSB0byBVRk9BRCAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9Jd2FpdElkMQkJKFBLVF9EYXRhKzIpCQkvKiBJV0FJVCBJZCAxICovCisjZGVmaW5lCVBLVF9Jd2FpdElkMgkJKFBLVF9EYXRhKzMpCQkvKiBJV0FJVCBJZCAyICovCisKKyNkZWZpbmUJSVdBSVRJRDEJCTB4REUKKyNkZWZpbmUJSVdBSVRJRDIJCTB4QjEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX1JFUVVFU1QgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUIHBhY2tldHMgYXJlIHNlbnQgZnJvbSBhIG5ld2x5IGJvb3RlZCBvciBjb25uZWN0ZWQKKyAgIFJUQSB0byBhIERyaXZlciB0byByZXF1ZXN0IGFuIElEIChSVVAgb3IgdW5pdCBudW1iZXIpLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9TZXJpYWxOdW1iZXIJKFBLVF9EYXRhKzIpCQkvKiA0IGJ5dGUgc2VyaWFsIG51bWJlciAqLworI2RlZmluZQlQS1RfTW9kdWxlVHlwZXMJCShQS1RfRGF0YSs2KQkJLyogUlRBIE1vZHVsZSB0eXBlcyAqLworCisvKiBNb2R1bGVUeXBlcyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlNT0RfQkxBTksJCTB4MEYJCQkvKiBCbGFuayBwbGF0ZSBhdHRhY2hlZCAqLworI2RlZmluZQlNT0RfUlMyMzJEQjI1CQkweDAwCQkJLyogUlMyMzIgREIyNSBjb25uZWN0b3IgKi8KKyNkZWZpbmUJTU9EX1JTMjMyUko0NQkJMHgwMQkJCS8qIFJTMjMyIFJKNDUgY29ubmVjdG9yICovCisjZGVmaW5lCU1PRF9SUzQyMkRCMjUJCTB4MDIJCQkvKiBSUzQyMiBEQjI1IGNvbm5lY3RvciAqLworI2RlZmluZQlNT0RfUlM0ODVEQjI1CQkweDAzCQkJLyogUlM0ODUgREIyNSBjb25uZWN0b3IgKi8KKyNkZWZpbmUJTU9EX1BBUkFMTEVMCQkweDA0CQkJLyogQ2VudHJvbmljcyBwYXJhbGxlbCAqLworCisjZGVmaW5lCU1PRDIJCQkweDA4CQkJLyogU2V0IHRvIGluZGljYXRlIFJldjIgbW9kdWxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqICAgUk9VVEVfUlVQIC0gUk9VVEVfRk9BRCAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgUk9VVEVfUlVQIC0gUk9VVEVfRk9BRCBwYWNrZXQgaXMgc2VudCBhcyBhIHJlc3BvbnNlIHRvIGEgUk9VVEVfUlVQIC0gUk9VVEVfUkVRVUVTVAorICAgcGFja2V0IHRvIGNhdXNlIHRoZSBSVEEgdG8gIkZhbGwgT3ZlciBBbmQgRGllIi4sIGkuZS4gc2h1dGRvd24gYW5kIHJlYm9vdC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfUm91dGVDbWRTdHJpbmcJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIHN0cmluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICBST1VURV9SVVAgLSBST1VURV9BTExPQ0FURSAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFJPVVRFX1JVUCAtIFJPVVRFX0FMTE9DQVRFIHBhY2tldCBpcyBzZW50IGFzIGEgcmVzcG9uc2UgdG8gYSBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUCisgICBwYWNrZXQgdG8gYWxsb2NhdGUgdGhlIFJUQSdzIElkIG51bWJlciAoUlVQIG51bWJlciAxLi4xNikKKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWROdW0JCShQS1RfRGF0YSsxKQkJLyogUlVQIG51bWJlciBmb3IgcG9ydHMgMS4uOCAqLworI2lmIDAKKyNkZWZpbmUJUEtUX1JvdXRlQ21kU3RyaW5nCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBzdHJpbmcgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWROdW0yCQkoUEtUX0RhdGErMHgxNykJCS8qIFJVUCBudW1iZXIgZm9yIHBvcnRzIDkuLjE2ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX1RPUE9MT0dZICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgUk9VVEVfUlVQIC0gUk9VVEVfVE9QT0xPR1kgcGFja2V0IGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBkcml2ZXIgb2YgYW4gUlRBJ3MKKyAgIGN1cnJlbnQgbGluayBzdGF0dXMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0xpbmsxUnVwCQkoUEtUX0RhdGErMikJCS8qIExpbmsgMSBSVVAgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rMUxpbmsJCShQS1RfRGF0YSszKQkJLyogTGluayAxIGxpbmsgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rMlJ1cAkJKFBLVF9EYXRhKzQpCQkvKiBMaW5rIDIgUlVQIG51bWJlciAqLworI2RlZmluZQlQS1RfTGluazJMaW5rCQkoUEtUX0RhdGErNSkJCS8qIExpbmsgMiBsaW5rIG51bWJlciAqLworI2RlZmluZQlQS1RfTGluazNSdXAJCShQS1RfRGF0YSs2KQkJLyogTGluayAzIFJVUCBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbmszTGluawkJKFBLVF9EYXRhKzcpCQkvKiBMaW5rIDMgbGluayBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbms0UnVwCQkoUEtUX0RhdGErOCkJCS8qIExpbmsgNCBSVVAgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rNExpbmsJCShQS1RfRGF0YSs5KQkJLyogTGluayA0IGxpbmsgbnVtYmVyICovCisjZGVmaW5lCVBLVF9SdGFWcGRQcm9tCQkoUEtUX0RhdGErMTApCQkvKiAzMiBieXRlcyBvZiBSVEEgVlBEIFBST00gQ29udGVudHMgKi8KKworI2VuZGlmCQkJCQkJLyogX3N4d2luaWZfaCAqLworCisvKiBFbmQgb2YgUklPV0lOSUYuSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaXNjb3MuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlzY29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlzY29zLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlzY29zLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjE5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaXNjb3MuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19yaXNjb3NfaF9fCisjZGVmaW5lIF9fcmlvX3Jpc2Nvc19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpc2Nvc19oX3NjY3NfID0gIkAoIylyaXNjb3MuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBUaGlzIG1vZHVsZSB1c2VkIHRvIGRlZmluZSBhbGwgdGhvc2UgbGl0dGxlIGl0c3kgYml0cyByZXF1aXJlZCBmb3IgUklTQy9PUworKiogbm93IGl0J3MgZnVsbCBvZiBudWxsIG1hY3Jvcy4KKyovCisKKy8qCisqKglSQllURSByZWFkcyBhIGJ5dGUgZnJvbSBhIGxvY2F0aW9uLgorKioJUldPUkQgcmVhZHMgYSB3b3JkIGZyb20gYSBsb2NhdGlvbi4KKyoqCVdCWVRFIHdyaXRlcyBhIGJ5dGUgdG8gYSBsb2NhdGlvbi4KKyoqCVdXT1JEIHdyaXRlcyBhIHdvcmQgdG8gYSBsb2NhdGlvbi4KKyoqCVJJTkRXIHJlYWRzIGEgd29yZCB0aHJvdWdoIGEgcG9pbnRlci4KKyoqCVdJTkRXIHdyaXRlcyBhIHdvcmQgdGhyb3VnaCBhIHBvaW50ZXIuCisqKglSSU9TV0FCIHN3YXBzIHRoZSB0d28gYnl0ZXMgb2YgYSB3b3JkLCBpZiBuZWVkZWQuCisqLworCisjZGVmaW5lCVJJT1NXQUIoTikgICAgICAoTikKKyNkZWZpbmUJV0JZVEUoQSxWKQkoQSk9KHVjaGFyKShWKQorI2RlZmluZSBXV09SRChBLFYpCShBKT0odXNob3J0KShWKQorI2RlZmluZSBSQllURShBKQkodWNoYXIpKEEpCisjZGVmaW5lIFJXT1JEKEEpCSh1c2hvcnQpKEEpCisjZGVmaW5lIFJJTkRXKEEpCSgqKHVzaG9ydCAqKShBKSkKKyNkZWZpbmUgV0lORFcoQSxWKQkoKih1c2hvcnQgKikoQSk9KHVzaG9ydCkoVikpCisKKyNlbmRpZiAvKiBfX3Jpb19yaXNjb3NfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3JvbS5oIGIvZHJpdmVycy9jaGFyL3Jpby9yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc5YjhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yb20uaApAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIFIgTyBNCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9yb21faAorI2RlZmluZSBfcm9tX2ggMQorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19yb21faF9zY2NzID0gIkAoIylyb20uaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0ICBST00gIFJPTSA7CitzdHJ1Y3QgIFJPTSAgeworICAgICAgICAgICAgICAgICB1X3Nob3J0ICAgIHNseCA7CisgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgcGNiX2xldHRlcl9yZXYgOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHBjYl9udW1iZXJfcmV2IDsKKyAgICAgICAgICAgICAgICAgY2hhciAgICAgICBzZXJpYWxbNF0gOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHllYXIgOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHdlZWsgOworICAgICAgICAgICAgIH0gOworCisjZW5kaWYKKworI2RlZmluZSBIT1NUX1JPTSAgICAoUk9NICopIDB4N2MwMAorI2RlZmluZSBSVEFfUk9NCSAgICAoUk9NICopIDB4NzgwMQorI2RlZmluZSBST01fTEVOR1RIICAweDIwCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyZGJiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgUiBPIFUgVCBFICAgICBIIEUgQSBEIEUgUgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcm91dGVfaAorI2RlZmluZSBfcm91dGVfaAorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcm91dGVfaF9zY2NzID0gIkAoIylyb3V0ZS5oCTEuMyI7ICovCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9MSU5LUyA0CisjZGVmaW5lIE1BWF9OT0RFUyAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBub2RlcyBpbiBhIHN1Ym5ldCAqLworI2RlZmluZSBOT0RFX0JZVEVTICgoTUFYX05PREVTIC8gOCkgKyAxKSAgICAgIC8qIE51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXQgcGVyIG5vZGUgKi8KKyNkZWZpbmUgUk9VVEVfREFUQV9TSVpFICAoTk9ERV9CWVRFUyArIDIpICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgZm9yIGNvbXBsZXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gYWJvdXQgY29zdCBldGMuICovCisjZGVmaW5lIFJPVVRFU19QRVJfUEFDS0VUICgoUEtUX01BWF9EQVRBX0xFTiAtMikvIFJPVVRFX0RBVEFfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygbm9kZXMgd2UgY2FuIHNxdWVlemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIG9uZSBwYWNrZXQgKi8KKyNkZWZpbmUgTUFYX1RPUE9MT0dZX1BBQ0tFVFMgKE1BWF9OT0RFUyAvIFJPVVRFU19QRVJfUEFDS0VUICsgMSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZSB0aGUgdHlwZXMgb2YgY29tbWFuZCBmb3IgdGhlIFJPVVRFIFJVUC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJPVVRFX1JFUVVFU1QgICAgMCAgICAgICAgICAgICAgICAgICAgLyogUmVxdWVzdCBhbiBJRCAqLworI2RlZmluZSBST1VURV9GT0FEICAgICAgIDEgICAgICAgICAgICAgICAgICAgIC8qIEtpbGwgdGhlIFJUQSAqLworI2RlZmluZSBST1VURV9BTFJFQURZICAgIDIgICAgICAgICAgICAgICAgICAgIC8qIElEIGdpdmVuIGFscmVhZHkgKi8KKyNkZWZpbmUgUk9VVEVfVVNFRCAgICAgICAzICAgICAgICAgICAgICAgICAgICAvKiBBbGwgSUQncyB1c2VkICovCisjZGVmaW5lIFJPVVRFX0FMTE9DQVRFICAgNCAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBpdCBpcyAqLworI2RlZmluZSBST1VURV9SRVFfVE9QICAgIDUgICAgICAgICAgICAgICAgICAgIC8qIEkgYmV0IHlvdSBkaWRuJ3QgZXhwZWN0Li4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUb3BvbG9naWNhbCBJbnF1aXNpdGlvbiAqLworI2RlZmluZSBST1VURV9UT1BPTE9HWSAgIDYgICAgICAgICAgICAgICAgICAgIC8qIFRvcG9sb2d5IHJlcXVlc3QgYW5zd2VyZWQgRkQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmUgdGhlIFJvdXRlIE1hcCBTdHJ1Y3R1cmUKKyAqCisgKiBUaGUgcm91dGUgbWFwIGdpdmVzIGEgcG9pbnRlciB0byBhIExpbmsgU3RydWN0dXJlIHRvIHVzZS4KKyAqIFRoaXMgYWxsb3dzIERpc2Nvbm5lY3RlZCBMaW5rcyB0byBiZSBjaGVja2VkIHF1aWNrbHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBDT1NUX1JPVVRFIENPU1RfUk9VVEU7CitzdHJ1Y3QgQ09TVF9ST1VURSB7CisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjb3N0OyAgICAgICAgLyogQ29zdCBkb3duIHRoaXMgbGluayAqLworICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcm91dGVbTk9ERV9CWVRFU107IC8qIE5vZGVzIHRob3JvdWdoIHRoaXMgcm91dGUgKi8KKyAgICAgICAgICAgICAgICAgIH0gOworCit0eXBlZGVmIHN0cnVjdCBST1VURV9TVFIgUk9VVEVfU1RSIDsKK3N0cnVjdCAgUk9VVEVfU1RSIHsKKyAgICAgICAgICAgICAgICAgICAgICBDT1NUX1JPVVRFIGNvc3Rfcm91dGVbTUFYX0xJTktTXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvc3QgLyByb3V0ZSBmb3IgdGhpcyBsaW5rICovCisgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGZhdm91cmVkOyAgICAgICAgICAvKiBmYXZvdXJlZCBsaW5rICovCisgICAgICAgICAgICAgICAgICB9IDsKKworCisjZGVmaW5lIE5PX0xJTksgICAgICAgICAgICAoc2hvcnQpIDUgICAgICAvKiBMaW5rIHVuYXR0YWNoZWQgKi8KKyNkZWZpbmUgUk9VVEVfTk9fSUQgICAgICAgIChzaG9ydCkgMTAwICAgIC8qIE5vIElkICovCisjZGVmaW5lIFJPVVRFX0RJU0NPTk5FQ1QgICAodXNob3J0KSAweGZmICAvKiBOb3QgY29ubmVjdGVkICovCisjZGVmaW5lIFJPVVRFX0lOVEVSQ09OTkVDVCAodXNob3J0KSAweDQwICAvKiBTdWItbmV0IGludGVyY29ubmVjdCAqLworCisKKyNkZWZpbmUgU1lOQ19SVVAgICAgICAgICAodXNob3J0KSAyNTUKKyNkZWZpbmUgQ09NTUFORF9SVVAgICAgICAodXNob3J0KSAyNTQKKyNkZWZpbmUgRVJST1JfUlVQICAgICAgICAodXNob3J0KSAyNTMKKyNkZWZpbmUgUE9MTF9SVVAgICAgICAgICAodXNob3J0KSAyNTIKKyNkZWZpbmUgQk9PVF9SVVAgICAgICAgICAodXNob3J0KSAyNTEKKyNkZWZpbmUgUk9VVEVfUlVQICAgICAgICAodXNob3J0KSAyNTAKKyNkZWZpbmUgU1RBVFVTX1JVUCAgICAgICAodXNob3J0KSAyNDkKKyNkZWZpbmUgUE9XRVJfUlVQICAgICAgICAodXNob3J0KSAyNDgKKworI2RlZmluZSBISUdIRVNUX1JVUCAgICAgICh1c2hvcnQpIDI1NSAgIC8qIFNldCB0byBUb3Agb25lICovCisjZGVmaW5lIExPV0VTVF9SVVAgICAgICAgKHVzaG9ydCkgMjQ4ICAgLyogU2V0IHRvIGJvdHRvbSBvbmUgKi8KKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ydGFody5oIGIvZHJpdmVycy9jaGFyL3Jpby9ydGFody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3J0YWh3LmgKQEAgLTAsMCArMSw3NSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgIFIgVCBBICAgIEggQSBSIEQgVyBBIFIgRQorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX3J0YWh3X2hfc2NjcyA9ICJAKCMpcnRhaHcuaAkxLjUiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJV0FUQ0hET0dfQUREUgkoKHVuc2lnbmVkIHNob3J0ICopMHg3YTAwKQorI2RlZmluZSBSVEFfTEVEX0FERFIJKCh1bnNpZ25lZCBzaG9ydCAqKTB4N2MwMCkKKyNkZWZpbmUgU0VSSUFMTlVNX0FERFIJKCh1bnNpZ25lZCBjaGFyICopMHg3ODA5KQorI2RlZmluZSBMQVRDSF9BRERSICAgICAgKCh1bnNpZ25lZCBjaGFyICopMHg3ODAwKQorCisvKgorKiogSGVyZSB3ZSBkZWZpbmUgd2hlcmUgdGhlIGNkMTQwMCBjaGlwcyBhcmUgaW4gbWVtb3J5LgorKi8KKyNkZWZpbmUgQ0QxNDAwX09ORV9BRERSCQkoMHg3MzAwKQorI2RlZmluZSBDRDE0MDBfVFdPX0FERFIJCSgweDcyMDApCisjZGVmaW5lIENEMTQwMF9USFJFRV9BRERSCSgweDcxMDApCisjZGVmaW5lIENEMTQwMF9GT1VSX0FERFIJKDB4NzAwMCkKKworLyoKKyoqIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG1vZHVsZXMgd2UgY2FuIGhhdmUKKyovCitlbnVtIG1vZHVsZSB7CisgICAgTU9EX0JMQU5LCQk9IDB4MGYsCQkvKiBCbGFuayBwbGF0ZSBhdHRhY2hlZCAqLworICAgIE1PRF9SUzIzMkRCMjUJPSAweDAwLAkJLyogUlMyMzIgREIyNSBjb25uZWN0b3IgKi8KKyAgICBNT0RfUlMyMzJSSjQ1CT0gMHgwMSwJCS8qIFJTMjMyIFJKNDUgY29ubmVjdG9yICovCisgICAgTU9EX1JTNDIyREIyNQk9IDB4MDIsCQkvKiBSUzQyMiBEQjI1IGNvbm5lY3RvciAqLworICAgIE1PRF9SUzQ4NURCMjUJPSAweDAzLAkJLyogUlM0ODUgREIyNSBjb25uZWN0b3IgKi8KKyAgICBNT0RfUEFSQUxMRUwJPSAweDA0CQkvKiBDZW50cm9uaWNzIHBhcmFsbGVsICovCit9OworCisjZGVmaW5lIFRZUEVfSE9TVAkwCisjZGVmaW5lIFRZUEVfUlRBOAkxCisjZGVmaW5lIFRZUEVfUlRBMTYJMgorCisjZGVmaW5lCVdBVENIX0RPRwlXQVRDSERPR19BRERSCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcnVwLmggYi9kcml2ZXJzL2NoYXIvcmlvL3J1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDJiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3J1cC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICBSIFUgUCAgIFMgVCBSIFUgQyBUIFUgUiBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9ydXBfaAorI2RlZmluZSBfcnVwX2ggMQorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcnVwX2hfc2NjcyA9ICJAKCMpcnVwLmgJMS41IjsgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBIT1NUICkgfHwgZGVmaW5lZCggSU5LRVJORUwgKQorI2RlZmluZSBNQVhfUlVQICAgICAgICAgICgoc2hvcnQpIDE2KSAKKyNlbmRpZgorI2lmZGVmIFJUQQorI2RlZmluZSBNQVhfUlVQICAgICAgICAgICgoc2hvcnQpIDEpCisjZW5kaWYKKworI2RlZmluZSBQS1RTX1BFUl9SVVAgICAgICgoc2hvcnQpIDIpICAgICAvKiBUaGV5IGFyZSBhbHdheXMgdXNlZCBpbiBwYWlycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lIGFsbCB0aGUgIHBhY2tldCByZXF1ZXN0IHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUWF9SVVBfSU5BQ1RJVkUgICAgICAgICAgMCAgICAgICAgLyogTm90aGluZyB0byB0cmFuc21pdCAqLworI2RlZmluZSBUWF9QQUNLRVRfUkVBRFkgICAgICAgICAgMSAgICAgICAgLyogVHJhbnNtaXQgcGFja2V0IHJlYWR5ICovCisjZGVmaW5lIFRYX0xPQ0tfUlVQICAgICAgICAgICAgICAyICAgICAgICAvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLworCisjZGVmaW5lIFJYX1JVUF9JTkFDVElWRSAgICAgICAgICAwICAgICAgICAvKiBOb3RoaW5nIHJlY2VpdmVkICovCisjZGVmaW5lIFJYX1BBQ0tFVF9SRUFEWSAgICAgICAgICAxICAgICAgICAvKiBQYWNrZXQgcmVjZWl2ZWQgKi8KKworI2RlZmluZSBSVVBfTk9fT1dORVIgICAgICAgICAgICAgMHhmZiAgICAgLyogUlVQIG5vdCBvd25lZCBieSBhbnkgcHJvY2VzcyAqLworCitzdHJ1Y3QgUlVQIHsKKyAgICAgICAgICAgICBQS1RfcHRyICAgIHR4cGt0OyAgICAgICAgICAgIC8qIE91dGdvaW5nIHBhY2tldCAqLworICAgICAgICAgICAgIFBLVF9wdHIgICAgcnhwa3Q7ICAgICAgICAgICAgLyogSW5jb21pbmcgcGFja2V0ICovCisgICAgICAgICAgICAgV09SRCAgICAgICBsaW5rOyAgICAgICAgICAgICAvKiBXaGljaCBsaW5rIHRvIHNlbmQgZG93bj8gKi8KKyAgICAgICAgICAgICBCWVRFICAgICAgIHJ1cF9kZXN0X3VuaXRbMl07IC8qIERlc3RpbmF0aW9uIHVuaXQgKi8KKyAgICAgICAgICAgICBXT1JEICAgICAgIGhhbmRzaGFrZTsgICAgICAgIC8qIEZvciBoYW5kc2hha2luZyAqLworICAgICAgICAgICAgIFdPUkQgICAgICAgdGltZW91dDsgICAgICAgICAgLyogVGltZW91dCAqLworICAgICAgICAgICAgIFdPUkQgICAgICAgc3RhdHVzOyAgICAgICAgICAgLyogU3RhdHVzICovCisgICAgICAgICAgICAgV09SRCAgICAgICB0eGNvbnRyb2w7ICAgICAgICAvKiBUcmFuc21pdCBjb250cm9sICovCisgICAgICAgICAgICAgV09SRCAgICAgICByeGNvbnRyb2w7ICAgICAgICAvKiBSZWNlaXZlIGNvbnRyb2wgKi8KKyAgICAgICAgICAgfTsKKyAKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcnVwc3RhdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ydXBzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcnVwc3RhdC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgUlVQU1RBVAorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3J1cHN0YXRfaAorI2RlZmluZSBfcnVwc3RhdF9oCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19ydXBzdGF0X2hfc2NjcyA9ICJAKCMpcnVwc3RhdC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSAgICBTVEFUVVNfU1lOQyAgICAwCisjZGVmaW5lICAgIFNUQVRVU19SRVFfVE9QIDEKKyNkZWZpbmUgICAgU1RBVFVTX1RPUE9MT0dZICAgIDIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vc2FtLmggYi9kcml2ZXJzL2NoYXIvcmlvL3NhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3NhbS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgIFMgQSBNIC4gSAorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX3NhbV9oCisjZGVmaW5lIF9zYW1faCAxCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19zYW1faF9zY2NzID0gIkAoIylzYW0uaAkxLjMiOyAqLworI2VuZGlmCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoIEhPU1QgKSAmJiAhZGVmaW5lZCggSU5LRVJORUwgKQorI2RlZmluZSBSVEEgMQorI2VuZGlmCisKKyNkZWZpbmUgTlVNX0ZSRUVfTElTVF9VTklUUyAgICAgNTAwCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKHNob3J0KSAgMHgwMAorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgKHNob3J0KSAgIUZBTFNFCisjZW5kaWYKKworI2RlZmluZSBUWCAgICBUUlVFCisjZGVmaW5lIFJYICAgIEZBTFNFCisKKwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUIEZSRUVfTElTVCA7CitzdHJ1Y3QgRlJFRV9MSVNUICAgeworICAgICAgICAgICAgICAgICAgICAgICBGUkVFX0xJU1RfcHRyIG5leHQgOworICAgICAgICAgICAgICAgICAgICAgICBGUkVFX0xJU1RfcHRyIHByZXYgOworICAgICAgICAgICAgICAgICAgIH0gOworCisKKyNlbmRpZgorLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9zZWxmdGVzdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9zZWxmdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWU0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3NlbGZ0ZXN0LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyoqIEZpbGU6CQlzZWxmdGVzdC5oCisqKgorKiogQXV0aG9yOgkJRGF2aWQgRGl4CisqKgorKiogQ3JlYXRlZDoJCTE1dGggTWFyY2ggMTk5MworKioKKyoqIExhc3QgbW9kaWZpZWQ6CTk0LzA2LzE0CisqKgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmCV9zZWxmdGVzdHNfaF8KKyNkZWZpbmUgX3NlbGZ0ZXN0c19oXworCisvKgorKiogU2VsZnRlc3QgaWRlbnRpZmllci4uLgorKi8KKyNkZWZpbmUgU0VMRlRFU1RfTUFHSUMJMHg1YTVhCisKKy8qCisqKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhY2tldCB0aGF0IGlzIHNlbnQgYmFjayBhZnRlciBlYWNoCisqKiBzZWxmdGVzdCBvbiBhIGJvb3RpbmcgUlRBLgorKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydAkJbWFnaWM7CQkJLyogSWRlbnRpZmllcyBwYWNrZXQgdHlwZSAqLworICAgIGludAkJCXRlc3Q7CQkJLyogVGVzdCBudW1iZXIsIHNlZSBiZWxvdyAqLworICAgIHVuc2lnbmVkIGludAlyZXN1bHQ7CQkJLyogUmVzdWx0IHZhbHVlICovCisgICAgdW5zaWduZWQgaW50CWRhdGFJbjsKKyAgICB1bnNpZ25lZCBpbnQJZGF0YU91dDsKK31zZWxmdGVzdFN0cnVjdDsKKworLyoKKyoqIFRoZSBkaWZmZXJlbnQgdGVzdHMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIGZvbGxvd2luZyBkYXRhIHZhbHVlcy4KKyovCitlbnVtIHRlc3QgeworICAgIFRFU1RTX0NPTVBMRVRFCT0gMHgwMCwKKyAgICBNRU1URVNUX0FERFIJPSAweDAxLAorICAgIE1FTVRFU1RfQklUCQk9IDB4MDIsCisgICAgTUVNVEVTVF9GSUxMCT0gMHgwMywKKyAgICBNRU1URVNUX0RBVEFCVVMJPSAweDA0LAorICAgIE1FTVRFU1RfQUREUkJVUwk9IDB4MDUsCisgICAgQ0QxNDAwX0lOSVQJCT0gMHgxMCwKKyAgICBDRDE0MDBfTE9PUAkJPSAweDExLAorICAgIENEMTQwMF9JTlRFUlJVUFQgICAgPSAweDEyCit9OworCitlbnVtIHJlc3VsdCB7CisgICAgRV9QT1JUCQk9IDB4MTAsCisgICAgRV9UWAkJPSAweDExLAorICAgIEVfUlgJCT0gMHgxMiwKKyAgICBFX0VYQ0VQVAkJPSAweDEzLAorICAgIEVfQ09NUEFSRQkJPSAweDE0LAorICAgIEVfTU9ERU0JCT0gMHgxNSwKKyAgICBFX1RJTUVPVVQJCT0gMHgxNiwKKyAgICBFX0lOVEVSUlVQVCAgICAgICAgID0gMHgxNworfTsKKyNlbmRpZgkvKiBfc2VsZnRlc3RzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3NwYWNlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzOThkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vc3BhY2UuaApAQCAtMCwwICsxLDQ1IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBzcGFjZS5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxOQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpc3BhY2UuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19zcGFjZV9oX18KKyNkZWZpbmUgX19yaW9fc3BhY2VfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9zcGFjZV9oX3NjY3NfID0gIkAoIylzcGFjZS5oCTEuMiI7CisjZW5kaWYKKworZXh0ZXJuIGludCByaW9fY250bHM7CitleHRlcm4gaW50IHJpb19iYXNlc1tdOworZXh0ZXJuIGludCByaW9fbGltaXRzW107CitleHRlcm4gaW50IHJpb192ZWN0c1tdOworCisjZW5kaWYgLyogX19yaW9fc3BhY2VfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3N5c21hcC5oIGIvZHJpdmVycy9jaGFyL3Jpby9zeXNtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM3MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9zeXNtYXAuaApAQCAtMCwwICsxLDYzIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgUyBZIFMgVCBFIE0gICBNIEEgUCAgIEggRSBBIEQgRSBSCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fc3lzbWFwX2hfc2NjcyA9ICJAKCMpc3lzbWFwLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFNZU1RFTV9NQVBfTEVOICAgICA2NCAgICAgICAgICAgLyogTGVuIG9mIFN5c3RlbSBNYXAgYXJyYXkgKi8KKworCit0eXBlZGVmIHN0cnVjdCBTWVNfTUFQICAgICAgICBTWVNfTUFQIDsKK3R5cGVkZWYgc3RydWN0IFNZU19NQVBfTElOSyAgIFNZU19NQVBfTElOSyA7CisKK3N0cnVjdCBTWVNfTUFQX0xJTksgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgaWQgOyAgICAgICAgICAvKiBVbml0IElkICovCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBsaW5rIDsgICAgICAgIC8qIElkJ3MgTGluayAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgYmVlbl9oZXJlIDsgICAvKiBVc2VkIGJ5IG1hcF9nZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgfSA7CisKK3N0cnVjdCBTWVNfTUFQIHsKKyAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgc2VyaWFsX251bVs0XSA7CisgICAgICAgICAgICAgICAgICAgU1lTX01BUF9MSU5LIGxpbmtbNF0gOworICAgICAgICAgICAgICAgfSA7CisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3RpbWVvdXRzLmggYi9kcml2ZXJzL2NoYXIvcmlvL3RpbWVvdXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMzEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vdGltZW91dHMuaApAQCAtMCwwICsxLDUxIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICBUIEkgTSBFIE8gVSBUIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19kZWZhdWx0c19oX3NjY3MgPSAiQCgjKXRpbWVvdXRzLmgJMS4zIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1JTExJU0VDT05EICAgICAgICAgICAoaW50KSAoMTAwMC82NCkgICAvKiAxNS42MjUgbG93IHRpY2tzICovCisjZGVmaW5lIFNFQ09ORCAgICAgICAgICAgICAgICAoaW50KSAxNTYyNSAgICAgICAvKiBMb3cgcHJpb3JpdHkgdGlja3MgKi8KKworI2RlZmluZSBUWF9USU1FT1VUICAgICAgICAgIChpbnQpICgyMDAgKiBNSUxMSVNFQ09ORCkKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdG9wLmggYi9kcml2ZXJzL2NoYXIvcmlvL3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NWM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3RvcC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHRvcC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxOQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpdG9wLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fdG9wX2hfXworI2RlZmluZSBfX3Jpb190b3BfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl90b3BfaF9zY2NzXyA9ICJAKCMpdG9wLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogVG9wb2xvZ3kgaW5mb3JtYXRpb24KKyovCitzdHJ1Y3QgVG9wCit7CisgICAgdWNoYXIgVW5pdDsKKyAgICB1Y2hhciBMaW5rOworfTsKKworI2VuZGlmIC8qIF9fcmlvX3RvcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdHlwZGVmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3R5cGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjlkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3R5cGRlZi5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHR5cGRlZi5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoyMAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpdHlwZGVmLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fdHlwZGVmX2hfXworI2RlZmluZSBfX3Jpb190eXBkZWZfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl90eXBkZWZfaF9zY2NzXyA9ICJAKCMpdHlwZGVmLmgJMS4yIjsKKyNlbmRpZgorCisjdW5kZWYgVlBJWAorCisvKgorKiogSVQgSVMgUkVBTExZLCBSRUFMTFksIElNUE9SVEFOVCBUSEFUIEJZVEVTIEFSRSBVTlNJR05FRCEKKyoqCisqKiBUaGVzZSB0eXBlcyBhcmUgT05MWSB0byBiZSB1c2VkIGZvciByZWZlcmluZyB0byBkYXRhIHN0cnVjdHVyZXMKKyoqIG9uIHRoZSBSSU8gSG9zdCBjYXJkIQorKi8KK3R5cGVkZWYJdm9sYXRpbGUgdW5zaWduZWQgY2hhcglCWVRFOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAlXT1JEOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBpbnQJRFdPUkQ7Cit0eXBlZGVmCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFJJT1A7Cit0eXBlZGVmCXZvbGF0aWxlIHNob3J0ICAgICAgICAgIE5VTUJFUjsKKworCisvKgorKiogMjcuMDEuMTk5IEFSRyAtIG1vZHMgdG8gY29tcGlsZSAnbmV3dXRpbHMnIG9uIEx5eG5PUyAtCisqKiBUaGVzZSAjZGVmaW5lcyBhcmUgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSAnbGliZnVuY3MnIGxpYnJhcnkKKyoqIG9ubHkuIFRoZXkgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0IHR5cGUgbWFwcGluZ3MgYW5kCisqKiBhcmUgaGVyZSBvbmx5IHRvIG1ha2UgdGhlIHNvdXJjZSBjb21waWxlLgorKi8KKy8qIHR5cGVkZWYgdW5zaWduZWQgaW50CXVpbnQ7ICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJdWxvbmdfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJdXNob3J0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJdWNoYXJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcglxdWV1ZV90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCW1ibGtfdDsKK3R5cGVkZWYJdW5zaWduZWQgaW50IAlwYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoYXI7CisKKyNkZWZpbmUJVFBOVUxMCSgodXNob3J0KSgweDgwMDApKQorCisKKy8qCisqKiBSSU8gc3RydWN0dXJlcyBkZWZpbmVkIGluIG90aGVyIGluY2x1ZGUgZmlsZXMuCisqLwordHlwZWRlZiBzdHJ1Y3QgUEtUCSAJUEtUOwordHlwZWRlZiBzdHJ1Y3QgTFBCCSAJTFBCOwordHlwZWRlZiBzdHJ1Y3QgUlVQCSAJUlVQOwordHlwZWRlZiBzdHJ1Y3QgUG9ydAkJUG9ydDsKK3R5cGVkZWYgc3RydWN0IERwUmFtCQlEcFJhbTsKKworI2VuZGlmIC8qIF9fcmlvX3R5cGRlZl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdW5peHJ1cC5oIGIvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkZjg2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vdW5peHJ1cC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHVuaXhydXAuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXVuaXhydXAuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb191bml4cnVwX2hfXworI2RlZmluZSBfX3Jpb191bml4cnVwX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfdW5peHJ1cF9oX3NjY3NfID0gIkAoIyl1bml4cnVwLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogICAgVW5peFJ1cCBkYXRhIHN0cnVjdHVyZS4gVGhpcyBjb250YWlucyBwb2ludGVycyB0byBhY3R1YWwgUlVQcyBvbiB0aGUKKyoqICAgIGhvc3QgY2FyZCwgYW5kIGFsbCB0aGUgY29tbWFuZC9ib290IGNvbnRyb2wgc3R1ZmYuCisqLworc3RydWN0ICAgIFVuaXhSdXAKK3sKKyAgICBzdHJ1Y3QgQ21kQmxrICAgICpDbWRzV2FpdGluZ1A7CS8qIENvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZG9uZSAqLworICAgIHN0cnVjdCBDbWRCbGsgICAgKkNtZFBlbmRpbmdQOwkvKiBUaGUgY29tbWFuZCBjdXJyZW50bHkgYmVpbmcgc2VudCAqLworICAgIHN0cnVjdCBSVVAgICAgICAgKlJ1cFA7CQkvKiB0aGUgUnVwIHRvIHNlbmQgaXQgdG8gKi8KKyAgICB1aW50ICAgICAgICAgICAgIElkOwkJLyogSWQgbnVtYmVyICovCisgICAgdWludCAgICAgICAgICAgICBCYXNlU3lzUG9ydDsJLyogU3lzUG9ydCBvZiBmaXJzdCB0dHkgb24gdGhpcyBSVEEgKi8KKyAgICB1aW50ICAgICAgICAgICAgIE1vZFR5cGVzOwkJLyogTW9kdWxlcyBvbiB0aGlzIFJUQSAqLworICAgIHNwaW5sb2NrX3QJICAgICBSdXBMb2NrOwkJLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworLyogICAgc3RydWN0IGxvY2tiICAgICBSdXBMb2NrOwkqLwkvKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCit9OworCisjZW5kaWYgLyogX19yaW9fdW5peHJ1cF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaXNjb204LmMgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YTNhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC0wLDAgKzEsMTgwOSBAQAorLyoKKyAqICAgICAgbGludXgvZHJpdmVycy9jaGFyL3Jpc2NvbS5jICAtLSBSSVNDb20vOCBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBEbWl0cnkgR29yb2RjaGFuaW4gKHBnbWRzZ0BpYmkuY29tKQorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIExpbnV4IHNlcmlhbCBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqICAgICAgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4gVGhlIFJJU0NvbS84IGNhcmQgCisgKiAgICAgIHByb2dyYW1taW5nIGluZm8gd2FzIG9idGFpbmVkIGZyb20gdmFyaW91cyBkcml2ZXJzIGZvciBvdGhlciBPU2VzIAorICoJKEZyZWVCU0QsIElTQywgZXRjKSwgYnV0IG5vIHNvdXJjZSBjb2RlIGZyb20gdGhvc2UgZHJpdmVycyB3ZXJlIAorICoJZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhpcyBkcml2ZXIuCisgKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKglSZXZpc2lvbiAxLjEKKyAqCisgKglDaGFuZ2VMb2c6CisgKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAyNy1KdW4tMjAwMQorICoJLSBnZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiBhbmQgc2V2ZXJhbCBjbGVhbnVwcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJyaXNjb204LmgiCisjaW5jbHVkZSAicmlzY29tOF9yZWcuaCIKKworLyogQW0gSSBwYXJhbm9pZCBvciBub3QgPyA7LSkgKi8KKyNkZWZpbmUgUklTQ09NX1BBUkFOT0lBX0NIRUNLCisKKy8qIAorICogQ3JhenkgSW50ZWxpQ29tLzggYm9hcmRzIHNvbWV0aW1lcyBoYXMgc3dhcHBlZCBDVFMgJiBEU1Igc2lnbmFscy4KKyAqIFlvdSBjYW4gc2xpZ2h0bHkgc3BlZWQgdXAgdGhpbmdzIGJ5ICN1bmRlZmluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiwKKyAqIGlmIHlvdSBhcmUgUkVBTExZIHN1cmUgdGhhdCB5b3VyIGJvYXJkIGlzIGNvcnJlY3Qgb25lLiAKKyAqLworCisjZGVmaW5lIFJJU0NPTV9CUkFJTl9EQU1BR0VEX0NUUworCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBCdXQgaWYgeW91IG5lZWQKKyAqIHNvbWUgbmljZSByZXBvcnRpbmcgaW4geW91ciBzeXNsb2csIHlvdSBjYW4gZGVmaW5lIHRoZW0gYWxzby4KKyAqLworI3VuZGVmIFJDX1JFUE9SVF9GSUZPCisjdW5kZWYgUkNfUkVQT1JUX09WRVJSVU4KKworCisjZGVmaW5lIFJJU0NPTV9MRUdBTF9GTEFHUyBcCisJKEFTWU5DX0hVUF9OT1RJRlkgICB8IEFTWU5DX1NBSyAgICAgICAgICB8IEFTWU5DX1NQTElUX1RFUk1JT1MgICB8IFwKKwkgQVNZTkNfU1BEX0hJICAgICAgIHwgQVNZTkNfU1BFRURfVkhJICAgIHwgQVNZTkNfU0VTU0lPTl9MT0NLT1VUIHwgXAorCSBBU1lOQ19QR1JQX0xPQ0tPVVQgfCBBU1lOQ19DQUxMT1VUX05PSFVQKQorCisjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkwCisKK3N0YXRpYyBzdHJ1Y3QgcmlzY29tX2JvYXJkICogSVJRX3RvX2JvYXJkWzE2XTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcmlzY29tX2RyaXZlcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogdG1wX2J1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmF1ZF90YWJsZVtdID0gIHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgNzY4MDAsIDAsIAorfTsKKworc3RhdGljIHN0cnVjdCByaXNjb21fYm9hcmQgcmNfYm9hcmRbUkNfTkJPQVJEXSA9ICB7CisJeworCQkuYmFzZQk9IFJDX0lPQkFTRTEsCisJfSwKKwl7CisJCS5iYXNlCT0gUkNfSU9CQVNFMiwKKwl9LAorCXsKKwkJLmJhc2UJPSBSQ19JT0JBU0UzLAorCX0sCisJeworCQkuYmFzZQk9IFJDX0lPQkFTRTQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmlzY29tX3BvcnQgcmNfcG9ydFtSQ19OQk9BUkQgKiBSQ19OUE9SVF07CisKKy8qIFJJU0NvbS84IEkvTyBwb3J0cyBhZGRyZXNzZXMgKHdpdGhvdXQgYWRkcmVzcyB0cmFuc2xhdGlvbikgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByY19pb3BvcnRbXSA9ICB7CisjaWYgMQkKKwkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA5LCAweDBhLCAweDBiLCAweDBjLAorI2Vsc2UJCisJMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgxMCwKKwkweDExLCAweDEyLCAweDE4LCAweDI4LCAweDMxLCAweDMyLCAweDM5LCAweDNhLCAweDQwLCAweDQxLCAweDYxLCAweDYyLAorCTB4NjMsIDB4NjQsIDB4NmIsIDB4NzAsIDB4NzEsIDB4NzgsIDB4N2EsIDB4N2IsIDB4N2YsIDB4MTAwLCAweDEwMQorI2VuZGlmCQorfTsKKyNkZWZpbmUgUkNfTklPUE9SVAkoc2l6ZW9mKHJjX2lvcG9ydCkgLyBzaXplb2YocmNfaW9wb3J0WzBdKSkKKworCitzdGF0aWMgaW5saW5lIGludCByY19wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgcmlzY29tX3BvcnQgY29uc3QgKiBwb3J0LAorCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFJJU0NPTV9QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyIGJhZG1hZ2ljW10gPSBLRVJOX0lORk8KKwkJInJjOiBXYXJuaW5nOiBiYWQgcmlzY29tIHBvcnQgbWFnaWMgbnVtYmVyIGZvciBkZXZpY2UgJXMgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgYmFkaW5mb1tdID0gS0VSTl9JTkZPCisJCSJyYzogV2FybmluZzogbnVsbCByaXNjb20gcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOworCisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwb3J0LT5tYWdpYyAhPSBSSVNDT004X01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogCisgKiAgU2VydmljZSBmdW5jdGlvbnMgZm9yIFJJU0NvbS84IGRyaXZlci4KKyAqIAorICovCisKKy8qIEdldCBib2FyZCBudW1iZXIgZnJvbSBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIGludCBib2FyZF9ObyAoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXJldHVybiBicCAtIHJjX2JvYXJkOworfQorCisvKiBHZXQgcG9ydCBudW1iZXIgZnJvbSBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIGludCBwb3J0X05vIChzdHJ1Y3QgcmlzY29tX3BvcnQgY29uc3QgKiBwb3J0KQoreworCXJldHVybiBSQ19QT1JUKHBvcnQgLSByY19wb3J0KTsgCit9CisKKy8qIEdldCBwb2ludGVyIHRvIGJvYXJkIGZyb20gcG9pbnRlciB0byBwb3J0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaXNjb21fYm9hcmQgKiBwb3J0X0JvYXJkKHN0cnVjdCByaXNjb21fcG9ydCBjb25zdCAqIHBvcnQpCit7CisJcmV0dXJuICZyY19ib2FyZFtSQ19CT0FSRChwb3J0IC0gcmNfcG9ydCldOworfQorCisvKiBJbnB1dCBCeXRlIGZyb20gQ0wgQ0QxODAgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByY19pbihzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlyZXR1cm4gaW5iKGJwLT5iYXNlICsgUkNfVE9fSVNBKHJlZykpOworfQorCisvKiBPdXRwdXQgQnl0ZSB0byBDTCBDRDE4MCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX291dChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCSAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJb3V0Yih2YWwsIGJwLT5iYXNlICsgUkNfVE9fSVNBKHJlZykpOworfQorCisvKiBXYWl0IGZvciBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgcmVhZHkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY193YWl0X0NDUihzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCS8qIEZJWE1FOiBuZWVkIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlIHRoZW4gMTAwMDAwIDopICovCisJZm9yIChkZWxheSA9IDEwMDAwMDsgZGVsYXk7IGRlbGF5LS0pIAorCQlpZiAoIXJjX2luKGJwLCBDRDE4MF9DQ1IpKQorCQkJcmV0dXJuOworCQorCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IFRpbWVvdXQgd2FpdGluZyBmb3IgQ0NSLlxuIiwgYm9hcmRfTm8oYnApKTsKK30KKworLyoKKyAqICBSSVNDb20vOCBwcm9iZSBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcmNfcmVxdWVzdF9pb19yYW5nZShzdHJ1Y3QgcmlzY29tX2JvYXJkICogY29uc3QgYnApCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IFJDX05JT1BPUlQ7IGkrKykgIAorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKFJDX1RPX0lTQShyY19pb3BvcnRbaV0pICsgYnAtPmJhc2UsIDEsCisJCQkJICAgIlJJU0NvbS84IikpICB7CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisJcmV0dXJuIDA7CitvdXRfcmVsZWFzZToKKwlwcmludGsoS0VSTl9JTkZPICJyYyVkOiBTa2lwcGluZyBwcm9iZSBhdCAweCUwM3guIElPIGFkZHJlc3MgaW4gdXNlLlxuIiwKKwkJCSBib2FyZF9ObyhicCksIGJwLT5iYXNlKTsKKwl3aGlsZSgtLWkgPj0gMCkKKwkJcmVsZWFzZV9yZWdpb24oUkNfVE9fSVNBKHJjX2lvcG9ydFtpXSkgKyBicC0+YmFzZSwgMSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19yZWxlYXNlX2lvX3JhbmdlKHN0cnVjdCByaXNjb21fYm9hcmQgKiBjb25zdCBicCkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgUkNfTklPUE9SVDsgaSsrKSAgCisJCXJlbGVhc2VfcmVnaW9uKFJDX1RPX0lTQShyY19pb3BvcnRbaV0pICsgYnAtPmJhc2UsIDEpOworfQorCQorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBlbmFibGVkIGludGVycnVwdHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY19sb25nX2RlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJdW5zaWduZWQgbG9uZyBpOworCQorCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLGppZmZpZXMpOyApIDsKK30KKworLyogUmVzZXQgYW5kIHNldHVwIENEMTgwIGNoaXAgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByY19pbml0X0NEMTgwKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlyY19vdXQoYnAsIFJDX0NUT1VULCAwKTsgICAgIAkgICAgICAgICAgIC8qIENsZWFyIHRpbWVvdXQgICAgICAgICAgICAgKi8KKwlyY193YWl0X0NDUihicCk7CQkJICAgLyogV2FpdCBmb3IgQ0NSIHJlYWR5ICAgICAgICAqLworCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfSEFSRFJFU0VUKTsgICAgICAvKiBSZXNldCBDRDE4MCBjaGlwICAgICAgICAgICovCisJc3RpKCk7CisJcmNfbG9uZ19kZWxheShIWi8yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KKwljbGkoKTsKKwlyY19vdXQoYnAsIENEMTgwX0dJVlIsIFJDX0lEKTsgICAgICAgICAgICAgLyogU2V0IElEIGZvciB0aGlzIGNoaXAgICAgICAqLworCXJjX291dChicCwgQ0QxODBfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCisJcmNfb3V0KGJwLCBDRDE4MF9QSUxSMSwgUkNfQUNLX01JTlQpOyAgICAgIC8qIFByaW8gZm9yIG1vZGVtIGludHIgICAgICAgKi8KKwlyY19vdXQoYnAsIENEMTgwX1BJTFIyLCBSQ19BQ0tfVElOVCk7ICAgICAgLyogUHJpbyBmb3IgdHJhbnNtaXR0ZXIgaW50ciAqLworCXJjX291dChicCwgQ0QxODBfUElMUjMsIFJDX0FDS19SSU5UKTsgICAgICAvKiBQcmlvIGZvciByZWNlaXZlciBpbnRyICAgICovCisJCisJLyogU2V0dGluZyB1cCBwcmVzY2FsZXIuIFdlIG5lZWQgNCB0aWNrcyBwZXIgMSBtcyAqLworCXJjX291dChicCwgQ0QxODBfUFBSSCwgKFJDX09TQ0ZSRVEvKDEwMDAwMDAvUklTQ09NX1RQUykpID4+IDgpOworCXJjX291dChicCwgQ0QxODBfUFBSTCwgKFJDX09TQ0ZSRVEvKDEwMDAwMDAvUklTQ09NX1RQUykpICYgMHhmZik7CisJCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qIE1haW4gcHJvYmluZyByb3V0aW5lLCBhbHNvIHNldHMgaXJxLiAqLworc3RhdGljIGludCBfX2luaXQgcmNfcHJvYmUoc3RydWN0IHJpc2NvbV9ib2FyZCAqYnApCit7CisJdW5zaWduZWQgY2hhciB2YWwxLCB2YWwyOworCWludCBpcnFzID0gMDsKKwlpbnQgcmV0cmllczsKKwkKKwlicC0+aXJxID0gMDsKKworCWlmIChyY19yZXF1ZXN0X2lvX3JhbmdlKGJwKSkKKwkJcmV0dXJuIDE7CisJCisJLyogQXJlIHRoZSBJL08gcG9ydHMgaGVyZSA/ICovCisJcmNfb3V0KGJwLCBDRDE4MF9QUFJMLCAweDVhKTsKKwlvdXRiKDB4ZmYsIDB4ODApOworCXZhbDEgPSByY19pbihicCwgQ0QxODBfUFBSTCk7CisJcmNfb3V0KGJwLCBDRDE4MF9QUFJMLCAweGE1KTsKKwlvdXRiKDB4MDAsIDB4ODApOworCXZhbDIgPSByY19pbihicCwgQ0QxODBfUFBSTCk7CisJCisJaWYgKCh2YWwxICE9IDB4NWEpIHx8ICh2YWwyICE9IDB4YTUpKSAgeworCQlwcmludGsoS0VSTl9FUlIgInJjJWQ6IFJJU0NvbS84IEJvYXJkIGF0IDB4JTAzeCBub3QgZm91bmQuXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCQorCS8qIEl0J3MgdGltZSB0byBmaW5kIElSUSBmb3IgdGhpcyBib2FyZCAqLworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCA1ICYmIGlycXMgPD0gMDsgcmV0cmllcysrKSAgeworCQlpcnFzID0gcHJvYmVfaXJxX29uKCk7CisJCXJjX2luaXRfQ0QxODAoYnApOwkgICAgICAgCQkvKiBSZXNldCBDRDE4MCBjaGlwICAgICAgICovCisJCXJjX291dChicCwgQ0QxODBfQ0FSLCAyKTsgICAgICAgICAgICAgICAvKiBTZWxlY3QgcG9ydCAyICAgICAgICAgICovCisJCXJjX3dhaXRfQ0NSKGJwKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9UWEVOKTsgICAgICAgIC8qIEVuYWJsZSB0cmFuc21pdHRlciAgICAgKi8KKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIElFUl9UWFJEWSk7ICAgICAgIC8qIEVuYWJsZSB0eCBlbXB0eSBpbnRyICAgKi8KKwkJcmNfbG9uZ19kZWxheShIWi8yMCk7CSAgICAgICAJCQorCQlpcnFzID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKwkJdmFsMSA9IHJjX2luKGJwLCBSQ19CU1IpOwkJLyogR2V0IEJvYXJkIFN0YXR1cyByZWcgICAqLworCQl2YWwyID0gcmNfaW4oYnAsIFJDX0FDS19USU5UKTsgICAgICAgICAgLyogQUNLIGludGVycnVwdCAgICAgICAgICAqLworCQlyY19pbml0X0NEMTgwKGJwKTsJICAgICAgIAkJLyogUmVzZXQgQ0QxODAgYWdhaW4gICAgICAqLworCQorCQlpZiAoKHZhbDEgJiBSQ19CU1JfVElOVCkgfHwgKHZhbDIgIT0gKFJDX0lEIHwgR0lWUl9JVF9UWCkpKSAgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyYyVkOiBSSVNDb20vOCBCb2FyZCBhdCAweCUwM3ggbm90ICIKKwkJCQkJImZvdW5kLlxuIiwgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisJfQorCQorCWlmIChpcnFzIDw9IDApICB7CisJCXByaW50ayhLRVJOX0VSUiAicmMlZDogQ2FuJ3QgZmluZCBJUlEgZm9yIFJJU0NvbS84IGJvYXJkICIKKwkJCQkiYXQgMHglMDN4LlxuIiwgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCWJwLT5pcnEgPSBpcnFzOworCWJwLT5mbGFncyB8PSBSQ19CT0FSRF9QUkVTRU5UOworCQorCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IFJJU0NvbS84IFJldi4gJWMgYm9hcmQgZGV0ZWN0ZWQgYXQgIgorCQkJICIweCUwM3gsIElSUSAlZC5cbiIsCisJICAgICAgIGJvYXJkX05vKGJwKSwKKwkgICAgICAgKHJjX2luKGJwLCBDRDE4MF9HRlJDUikgJiAweDBmKSArICdBJywgICAvKiBCb2FyZCByZXZpc2lvbiAqLworCSAgICAgICBicC0+YmFzZSwgYnAtPmlycSk7CisJCisJcmV0dXJuIDA7CitvdXRfcmVsZWFzZToKKwlyY19yZWxlYXNlX2lvX3JhbmdlKGJwKTsKKwlyZXR1cm4gMTsKK30KKworLyogCisgKiAKKyAqICBJbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lcy4KKyAqIAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19tYXJrX2V2ZW50KHN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQsIGludCBldmVudCkKK3sKKwlzZXRfYml0KGV2ZW50LCAmcG9ydC0+ZXZlbnQpOworCXNjaGVkdWxlX3dvcmsoJnBvcnQtPnRxdWV1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpc2NvbV9wb3J0ICogcmNfZ2V0X3BvcnQoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqIHdoYXQpCit7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCXN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQ7CisJCisJY2hhbm5lbCA9IHJjX2luKGJwLCBDRDE4MF9HSUNSKSA+PiBHSUNSX0NIQU5fT0ZGOworCWlmIChjaGFubmVsIDwgQ0QxODBfTkNIKSAgeworCQlwb3J0ID0gJnJjX3BvcnRbYm9hcmRfTm8oYnApICogUkNfTlBPUlQgKyBjaGFubmVsXTsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICB7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKwlwcmludGsoS0VSTl9FUlIgInJjJWQ6ICVzIGludGVycnVwdCBmcm9tIGludmFsaWQgcG9ydCAlZFxuIiwgCisJICAgICAgIGJvYXJkX05vKGJwKSwgd2hhdCwgY2hhbm5lbCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19yZWNlaXZlX2V4YyhzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBjaDsKKwkKKwlpZiAoIShwb3J0ID0gcmNfZ2V0X3BvcnQoYnAsICJSZWNlaXZlIikpKQorCQlyZXR1cm47CisKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSAgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBwb3J0ICVkOiBXb3JraW5nIGFyb3VuZCBmbGlwICIKKwkJCQkgICAgImJ1ZmZlciBvdmVyZmxvdy5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQlyZXR1cm47CisJfQorCQorI2lmZGVmIFJDX1JFUE9SVF9PVkVSUlVOCQorCXN0YXR1cyA9IHJjX2luKGJwLCBDRDE4MF9SQ1NSKTsKKwlpZiAoc3RhdHVzICYgUkNTUl9PRSkgIHsKKwkJcG9ydC0+b3ZlcnJ1bisrOworI2lmIDAJCQorCQlwcmludGsoS0VSTl9FUlIgInJjJWQ6IHBvcnQgJWQ6IE92ZXJydW4uIFRvdGFsICVsZCBvdmVycnVuc1xuIiwgCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCksIHBvcnQtPm92ZXJydW4pOworI2VuZGlmCQkKKwl9CisJc3RhdHVzICY9IHBvcnQtPm1hcmtfbWFzazsKKyNlbHNlCQorCXN0YXR1cyA9IHJjX2luKGJwLCBDRDE4MF9SQ1NSKSAmIHBvcnQtPm1hcmtfbWFzazsKKyNlbmRpZgkKKwljaCA9IHJjX2luKGJwLCBDRDE4MF9SRFIpOworCWlmICghc3RhdHVzKSAgeworCQlyZXR1cm47CisJfQorCWlmIChzdGF0dXMgJiBSQ1NSX1RPVVQpICB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IHBvcnQgJWQ6IFJlY2VpdmVyIHRpbWVvdXQuICIKKwkJCQkgICAgIkhhcmR3YXJlIHByb2JsZW1zID9cbiIsIAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJcmV0dXJuOworCQkKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfQlJFQUspICB7CisJCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHBvcnQgJWQ6IEhhbmRsaW5nIGJyZWFrLi4uXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJZG9fU0FLKHR0eSk7CisJCQorCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9QRSkgCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQorCWVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfRkUpIAorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0ZSQU1FOworCQorICAgICAgICBlbHNlIGlmIChzdGF0dXMgJiBSQ1NSX09FKQorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47CisJCisJZWxzZQorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkKKwkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7CisJdHR5LT5mbGlwLmNvdW50Kys7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19yZWNlaXZlKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNvdW50OworCQorCWlmICghKHBvcnQgPSByY19nZXRfcG9ydChicCwgIlJlY2VpdmUiKSkpCisJCXJldHVybjsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJCisJY291bnQgPSByY19pbihicCwgQ0QxODBfUkRDUik7CisJCisjaWZkZWYgUkNfUkVQT1JUX0ZJRk8KKwlwb3J0LT5oaXRzW2NvdW50ID4gOCA/IDkgOiBjb3VudF0rKzsKKyNlbmRpZgkKKwkKKwl3aGlsZSAoY291bnQtLSkgIHsKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSAgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmMlZDogcG9ydCAlZDogV29ya2luZyBhcm91bmQgIgorCQkJCQkgICAgImZsaXAgYnVmZmVyIG92ZXJmbG93LlxuIiwKKwkJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQkJYnJlYWs7CisJCX0KKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IHJjX2luKGJwLCBDRDE4MF9SRFIpOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJdHR5LT5mbGlwLmNvdW50Kys7CisJfQorCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfdHJhbnNtaXQoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgY291bnQ7CisJCisJCisJaWYgKCEocG9ydCA9IHJjX2dldF9wb3J0KGJwLCAiVHJhbnNtaXQiKSkpCisJCXJldHVybjsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJCisJaWYgKHBvcnQtPklFUiAmIElFUl9UWEVNUFRZKSAgeworCQkvKiBGSUZPIGRyYWluZWQgKi8KKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlwb3J0LT5JRVIgJj0gfklFUl9UWEVNUFRZOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoKHBvcnQtPnhtaXRfY250IDw9IDAgJiYgIXBvcnQtPmJyZWFrX2xlbmd0aCkKKwkgICAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkgIHsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHBvcnQtPmJyZWFrX2xlbmd0aCkgIHsKKwkJaWYgKHBvcnQtPmJyZWFrX2xlbmd0aCA+IDApICB7CisJCQlpZiAocG9ydC0+Q09SMiAmIENPUjJfRVRDKSAgeworCQkJCXJjX291dChicCwgQ0QxODBfVERSLCBDRDE4MF9DX0VTQyk7CisJCQkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIENEMTgwX0NfU0JSSyk7CisJCQkJcG9ydC0+Q09SMiAmPSB+Q09SMl9FVEM7CisJCQl9CisJCQljb3VudCA9IG1pbl90KGludCwgcG9ydC0+YnJlYWtfbGVuZ3RoLCAweGZmKTsKKwkJCXJjX291dChicCwgQ0QxODBfVERSLCBDRDE4MF9DX0VTQyk7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgQ0QxODBfQ19ERUxBWSk7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgY291bnQpOworCQkJaWYgKCEocG9ydC0+YnJlYWtfbGVuZ3RoIC09IGNvdW50KSkKKwkJCQlwb3J0LT5icmVha19sZW5ndGgtLTsKKwkJfSBlbHNlICB7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgQ0QxODBfQ19FU0MpOworCQkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIENEMTgwX0NfRUJSSyk7CisJCQlyY19vdXQoYnAsIENEMTgwX0NPUjIsIHBvcnQtPkNPUjIpOworCQkJcmNfd2FpdF9DQ1IoYnApOworCQkJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9DT1JDSEcyKTsKKwkJCXBvcnQtPmJyZWFrX2xlbmd0aCA9IDA7CisJCX0KKwkJcmV0dXJuOworCX0KKwkKKwljb3VudCA9IENEMTgwX05GSUZPOworCWRvIHsKKwkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIHBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfdGFpbCsrXSk7CisJCXBvcnQtPnhtaXRfdGFpbCA9IHBvcnQtPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQlpZiAoLS1wb3J0LT54bWl0X2NudCA8PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCA+IDApOworCQorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwKSAgeworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwl9CisJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKKwkJcmNfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfY2hlY2tfbW9kZW0oc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgbWNyOworCQorCWlmICghKHBvcnQgPSByY19nZXRfcG9ydChicCwgIk1vZGVtIikpKQorCQlyZXR1cm47CisJCisJdHR5ID0gcG9ydC0+dHR5OworCQorCW1jciA9IHJjX2luKGJwLCBDRDE4MF9NQ1IpOworCWlmIChtY3IgJiBNQ1JfQ0RDSEcpICB7CisJCWlmIChyY19pbihicCwgQ0QxODBfTVNWUikgJiBNU1ZSX0NEKSAKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+dHF1ZXVlX2hhbmd1cCk7CisJfQorCQorI2lmZGVmIFJJU0NPTV9CUkFJTl9EQU1BR0VEX0NUUworCWlmIChtY3IgJiBNQ1JfQ1RTQ0hHKSAgeworCQlpZiAocmNfaW4oYnAsIENEMTgwX01TVlIpICYgTVNWUl9DVFMpICB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJCWlmIChwb3J0LT54bWl0X2NudCA8PSBwb3J0LT53YWtldXBfY2hhcnMpCisJCQkJcmNfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQl9IGVsc2UgIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJfQorCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwl9CisJaWYgKG1jciAmIE1DUl9EU1JDSEcpICB7CisJCWlmIChyY19pbihicCwgQ0QxODBfTVNWUikgJiBNU1ZSX0RTUikgIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQkJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKKwkJCQlyY19tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCX0gZWxzZSAgeworCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQl9CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCX0KKyNlbmRpZiAvKiBSSVNDT01fQlJBSU5fREFNQUdFRF9DVFMgKi8KKwkKKwkvKiBDbGVhciBjaGFuZ2UgYml0cyAqLworCXJjX291dChicCwgQ0QxODBfTUNSLCAwKTsKK30KKworLyogVGhlIG1haW4gaW50ZXJydXB0IHByb2Nlc3Npbmcgcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IHJjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBhY2s7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBsb29wID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlicCA9IElSUV90b19ib2FyZFtpcnFdOworCQorCWlmICghYnAgfHwgIShicC0+ZmxhZ3MgJiBSQ19CT0FSRF9BQ1RJVkUpKSAgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCQorCXdoaWxlICgoKytsb29wIDwgMTYpICYmICgoc3RhdHVzID0gfihyY19pbihicCwgUkNfQlNSKSkpICYKKwkJCQkgKFJDX0JTUl9UT1VUIHwgUkNfQlNSX1RJTlQgfAorCQkJCSAgUkNfQlNSX01JTlQgfCBSQ19CU1JfUklOVCkpKSB7CisJCWhhbmRsZWQgPSAxOworCQlpZiAoc3RhdHVzICYgUkNfQlNSX1RPVVQpIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmMlZDogR290IHRpbWVvdXQuIEhhcmR3YXJlICIKKwkJCQkJICAgICJlcnJvcj9cbiIsIGJvYXJkX05vKGJwKSk7CisJCQorCQllbHNlIGlmIChzdGF0dXMgJiBSQ19CU1JfUklOVCkgeworCQkJYWNrID0gcmNfaW4oYnAsIFJDX0FDS19SSU5UKTsKKwkJCisJCQlpZiAoYWNrID09IChSQ19JRCB8IEdJVlJfSVRfUkNWKSkKKwkJCQlyY19yZWNlaXZlKGJwKTsKKwkJCWVsc2UgaWYgKGFjayA9PSAoUkNfSUQgfCBHSVZSX0lUX1JFWEMpKQorCQkJCXJjX3JlY2VpdmVfZXhjKGJwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBCYWQgcmVjZWl2ZSBhY2sgIgorCQkJCQkJICAgICIweCUwMnguXG4iLAorCQkJCSAgICAgICBib2FyZF9ObyhicCksIGFjayk7CisJCQorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDX0JTUl9USU5UKSB7CisJCQlhY2sgPSByY19pbihicCwgUkNfQUNLX1RJTlQpOworCQkKKwkJCWlmIChhY2sgPT0gKFJDX0lEIHwgR0lWUl9JVF9UWCkpCisJCQkJcmNfdHJhbnNtaXQoYnApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IEJhZCB0cmFuc21pdCBhY2sgIgorCQkJCQkJICAgICIweCUwMnguXG4iLAorCQkJCSAgICAgICBib2FyZF9ObyhicCksIGFjayk7CisJCQorCQl9IGVsc2UgLyogaWYgKHN0YXR1cyAmIFJDX0JTUl9NSU5UKSAqLyB7CisJCQlhY2sgPSByY19pbihicCwgUkNfQUNLX01JTlQpOworCQkKKwkJCWlmIChhY2sgPT0gKFJDX0lEIHwgR0lWUl9JVF9NT0RFTSkpIAorCQkJCXJjX2NoZWNrX21vZGVtKGJwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBCYWQgbW9kZW0gYWNrICIKKwkJCQkJCSAgICAiMHglMDJ4LlxuIiwKKwkJCQkgICAgICAgYm9hcmRfTm8oYnApLCBhY2spOworCQkKKwkJfSAKKworCQlyY19vdXQoYnAsIENEMTgwX0VPSVIsIDApOyAgIC8qIE1hcmsgZW5kIG9mIGludGVycnVwdCAqLworCQlyY19vdXQoYnAsIFJDX0NUT1VULCAwKTsgICAgIC8qIENsZWFyIHRpbWVvdXQgZmxhZyAgICAqLworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqICBSb3V0aW5lcyBmb3Igb3BlbiAmIGNsb3NlIHByb2Nlc3NpbmcuCisgKi8KKworLyogQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSBpbnQgcmNfc2V0dXBfYm9hcmQoc3RydWN0IHJpc2NvbV9ib2FyZCAqIGJwKQoreworCWludCBlcnJvcjsKKworCWlmIChicC0+ZmxhZ3MgJiBSQ19CT0FSRF9BQ1RJVkUpIAorCQlyZXR1cm4gMDsKKwkKKwllcnJvciA9IHJlcXVlc3RfaXJxKGJwLT5pcnEsIHJjX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJICAgICJSSVNDb20vOCIsIE5VTEwpOworCWlmIChlcnJvcikgCisJCXJldHVybiBlcnJvcjsKKwkKKwlyY19vdXQoYnAsIFJDX0NUT1VULCAwKTsgICAgICAgCQkvKiBKdXN0IGluIGNhc2UgICAgICAgICAqLworCWJwLT5EVFIgPSB+MDsKKwlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CSAgICAgICAgLyogRHJvcCBEVFIgb24gYWxsIHBvcnRzICovCisJCisJSVJRX3RvX2JvYXJkW2JwLT5pcnFdID0gYnA7CisJYnAtPmZsYWdzIHw9IFJDX0JPQVJEX0FDVElWRTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX3NodXRkb3duX2JvYXJkKHN0cnVjdCByaXNjb21fYm9hcmQgKmJwKQoreworCWlmICghKGJwLT5mbGFncyAmIFJDX0JPQVJEX0FDVElWRSkpCisJCXJldHVybjsKKwkKKwlicC0+ZmxhZ3MgJj0gflJDX0JPQVJEX0FDVElWRTsKKwkKKwlmcmVlX2lycShicC0+aXJxLCBOVUxMKTsKKwlJUlFfdG9fYm9hcmRbYnAtPmlycV0gPSBOVUxMOworCQorCWJwLT5EVFIgPSB+MDsKKwlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CSAgICAgICAvKiBEcm9wIERUUiBvbiBhbGwgcG9ydHMgKi8KKwkKK30KKworLyoKKyAqIFNldHRpbmcgdXAgcG9ydCBjaGFyYWN0ZXJpc3RpY3MuIAorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIHJjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBiYXVkOworCWxvbmcgdG1wOworCXVuc2lnbmVkIGNoYXIgY29yMSA9IDAsIGNvcjMgPSAwOworCXVuc2lnbmVkIGNoYXIgbWNvcjEgPSAwLCBtY29yMiA9IDA7CisJCisJaWYgKCEodHR5ID0gcG9ydC0+dHR5KSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisKKwlwb3J0LT5JRVIgID0gMDsKKwlwb3J0LT5DT1IyID0gMDsKKwlwb3J0LT5NU1ZSID0gTVNWUl9SVFM7CisJCisJYmF1ZCA9IENfQkFVRCh0dHkpOworCQorCWlmIChiYXVkICYgQ0JBVURFWCkgeworCQliYXVkICY9IH5DQkFVREVYOworCQlpZiAoYmF1ZCA8IDEgfHwgYmF1ZCA+IDIpIAorCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQliYXVkICs9IDE1OworCX0KKwlpZiAoYmF1ZCA9PSAxNSkgIHsKKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQliYXVkICsrOworCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkICs9IDI7CisJfQorCQorCS8qIFNlbGVjdCBwb3J0IG9uIHRoZSBib2FyZCAqLworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkKKwlpZiAoIWJhdWRfdGFibGVbYmF1ZF0pICB7CisJCS8qIERyb3AgRFRSICYgZXhpdCAqLworCQlicC0+RFRSIHw9ICgxdSA8PCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBSQ19EVFIsIGJwLT5EVFIpOworCQlyZXR1cm47CisJfSBlbHNlICB7CisJCS8qIFNldCBEVFIgb24gKi8KKwkJYnAtPkRUUiAmPSB+KDF1IDw8IHBvcnRfTm8ocG9ydCkpOworCQlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CisJfQorCQorCS8qCisJICogTm93IHdlIG11c3QgY2FsY3VsYXRlIHNvbWUgc3BlZWQgZGVwZW5kZWQgdGhpbmdzIAorCSAqLworCQorCS8qIFNldCBiYXVkIHJhdGUgZm9yIHBvcnQgKi8KKwl0bXAgPSAoKChSQ19PU0NGUkVRICsgYmF1ZF90YWJsZVtiYXVkXS8yKSAvIGJhdWRfdGFibGVbYmF1ZF0gKworCQlDRDE4MF9UUEMvMikgLyBDRDE4MF9UUEMpOworCisJcmNfb3V0KGJwLCBDRDE4MF9SQlBSSCwgKHRtcCA+PiA4KSAmIDB4ZmYpOyAKKwlyY19vdXQoYnAsIENEMTgwX1RCUFJILCAodG1wID4+IDgpICYgMHhmZik7IAorCXJjX291dChicCwgQ0QxODBfUkJQUkwsIHRtcCAmIDB4ZmYpOyAKKwlyY19vdXQoYnAsIENEMTgwX1RCUFJMLCB0bXAgJiAweGZmKTsKKwkKKwliYXVkID0gKGJhdWRfdGFibGVbYmF1ZF0gKyA1KSAvIDEwOyAgIC8qIEVzdGltYXRlZCBDUFMgKi8KKwkKKwkvKiBUd28gdGltZXIgdGlja3Mgc2VlbXMgZW5vdWdoIHRvIHdha2V1cCBzb21ldGhpbmcgbGlrZSBTTElQIGRyaXZlciAqLworCXRtcCA9ICgoYmF1ZCArIEhaLzIpIC8gSFopICogMiAtIENEMTgwX05GSUZPOwkJCisJcG9ydC0+d2FrZXVwX2NoYXJzID0gKHRtcCA8IDApID8gMCA6ICgodG1wID49IFNFUklBTF9YTUlUX1NJWkUpID8KKwkJCQkJICAgICAgU0VSSUFMX1hNSVRfU0laRSAtIDEgOiB0bXApOworCQorCS8qIFJlY2VpdmVyIHRpbWVvdXQgd2lsbCBiZSB0cmFuc21pc3Npb24gdGltZSBmb3IgMS41IGNoYXJzICovCisJdG1wID0gKFJJU0NPTV9UUFMgKyBSSVNDT01fVFBTLzIgKyBiYXVkLzIpIC8gYmF1ZDsKKwl0bXAgPSAodG1wID4gMHhmZikgPyAweGZmIDogdG1wOworCXJjX291dChicCwgQ0QxODBfUlRQUiwgdG1wKTsKKwkKKwlzd2l0Y2ggKENfQ1NJWkUodHR5KSkgIHsKKwkgY2FzZSBDUzU6CisJCWNvcjEgfD0gQ09SMV81QklUUzsKKwkJYnJlYWs7CisJIGNhc2UgQ1M2OgorCQljb3IxIHw9IENPUjFfNkJJVFM7CisJCWJyZWFrOworCSBjYXNlIENTNzoKKwkJY29yMSB8PSBDT1IxXzdCSVRTOworCQlicmVhazsKKwkgY2FzZSBDUzg6CisJCWNvcjEgfD0gQ09SMV84QklUUzsKKwkJYnJlYWs7CisJfQorCQorCWlmIChDX0NTVE9QQih0dHkpKSAKKwkJY29yMSB8PSBDT1IxXzJTQjsKKwkKKwljb3IxIHw9IENPUjFfSUdOT1JFOworCWlmIChDX1BBUkVOQih0dHkpKSAgeworCQljb3IxIHw9IENPUjFfTk9STVBBUjsKKwkJaWYgKENfUEFST0REKHR0eSkpIAorCQkJY29yMSB8PSBDT1IxX09ERFA7CisJCWlmIChJX0lOUENLKHR0eSkpIAorCQkJY29yMSAmPSB+Q09SMV9JR05PUkU7CisJfQorCS8qIFNldCBtYXJraW5nIG9mIHNvbWUgZXJyb3JzICovCisJcG9ydC0+bWFya19tYXNrID0gUkNTUl9PRSB8IFJDU1JfVE9VVDsKKwlpZiAoSV9JTlBDSyh0dHkpKSAKKwkJcG9ydC0+bWFya19tYXNrIHw9IFJDU1JfRkUgfCBSQ1NSX1BFOworCWlmIChJX0JSS0lOVCh0dHkpIHx8IElfUEFSTVJLKHR0eSkpIAorCQlwb3J0LT5tYXJrX21hc2sgfD0gUkNTUl9CUkVBSzsKKwlpZiAoSV9JR05QQVIodHR5KSkgCisJCXBvcnQtPm1hcmtfbWFzayAmPSB+KFJDU1JfRkUgfCBSQ1NSX1BFKTsKKwlpZiAoSV9JR05CUksodHR5KSkgIHsKKwkJcG9ydC0+bWFya19tYXNrICY9IH5SQ1NSX0JSRUFLOworCQlpZiAoSV9JR05QQVIodHR5KSkgCisJCQkvKiBSZWFsIHJhdyBtb2RlLiBJZ25vcmUgYWxsICovCisJCQlwb3J0LT5tYXJrX21hc2sgJj0gflJDU1JfT0U7CisJfQorCS8qIEVuYWJsZSBIYXJkd2FyZSBGbG93IENvbnRyb2wgKi8KKwlpZiAoQ19DUlRTQ1RTKHR0eSkpICB7CisjaWZkZWYgUklTQ09NX0JSQUlOX0RBTUFHRURfQ1RTCisJCXBvcnQtPklFUiB8PSBJRVJfRFNSIHwgSUVSX0NUUzsKKwkJbWNvcjEgfD0gTUNPUjFfRFNSWkQgfCBNQ09SMV9DVFNaRDsKKwkJbWNvcjIgfD0gTUNPUjJfRFNST0QgfCBNQ09SMl9DVFNPRDsKKwkJdHR5LT5od19zdG9wcGVkID0gIShyY19pbihicCwgQ0QxODBfTVNWUikgJiAoTVNWUl9DVFN8TVNWUl9EU1IpKTsKKyNlbHNlCisJCXBvcnQtPkNPUjIgfD0gQ09SMl9DVFNBRTsKKyNlbmRpZgorCX0KKwkvKiBFbmFibGUgU29mdHdhcmUgRmxvdyBDb250cm9sLiBGSVhNRTogSSdtIG5vdCBzdXJlIGFib3V0IHRoaXMgKi8KKwkvKiBTb21lIHBlb3BsZSByZXBvcnRlZCB0aGF0IGl0IHdvcmtzLCBidXQgSSBzdGlsbCBkb3VidCAqLworCWlmIChJX0lYT04odHR5KSkgIHsKKwkJcG9ydC0+Q09SMiB8PSBDT1IyX1RYSUJFOworCQljb3IzIHw9IChDT1IzX0ZDVCB8IENPUjNfU0NERSk7CisJCWlmIChJX0lYQU5ZKHR0eSkpCisJCQlwb3J0LT5DT1IyIHw9IENPUjJfSVhNOworCQlyY19vdXQoYnAsIENEMTgwX1NDSFIxLCBTVEFSVF9DSEFSKHR0eSkpOworCQlyY19vdXQoYnAsIENEMTgwX1NDSFIyLCBTVE9QX0NIQVIodHR5KSk7CisJCXJjX291dChicCwgQ0QxODBfU0NIUjMsIFNUQVJUX0NIQVIodHR5KSk7CisJCXJjX291dChicCwgQ0QxODBfU0NIUjQsIFNUT1BfQ0hBUih0dHkpKTsKKwl9CisJaWYgKCFDX0NMT0NBTCh0dHkpKSAgeworCQkvKiBFbmFibGUgQ0QgY2hlY2sgKi8KKwkJcG9ydC0+SUVSIHw9IElFUl9DRDsKKwkJbWNvcjEgfD0gTUNPUjFfQ0RaRDsKKwkJbWNvcjIgfD0gTUNPUjJfQ0RPRDsKKwl9CisJCisJaWYgKENfQ1JFQUQodHR5KSkgCisJCS8qIEVuYWJsZSByZWNlaXZlciAqLworCQlwb3J0LT5JRVIgfD0gSUVSX1JYRDsKKwkKKwkvKiBTZXQgaW5wdXQgRklGTyBzaXplICgxLTggYnl0ZXMpICovCisJY29yMyB8PSBSSVNDT01fUlhGSUZPOyAKKwkvKiBTZXR0aW5nIHVwIENEMTgwIGNoYW5uZWwgcmVnaXN0ZXJzICovCisJcmNfb3V0KGJwLCBDRDE4MF9DT1IxLCBjb3IxKTsKKwlyY19vdXQoYnAsIENEMTgwX0NPUjIsIHBvcnQtPkNPUjIpOworCXJjX291dChicCwgQ0QxODBfQ09SMywgY29yMyk7CisJLyogTWFrZSBDRDE4MCBrbm93IGFib3V0IHJlZ2lzdGVycyBjaGFuZ2UgKi8KKwlyY193YWl0X0NDUihicCk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9DT1JDSEcxIHwgQ0NSX0NPUkNIRzIgfCBDQ1JfQ09SQ0hHMyk7CisJLyogU2V0dGluZyB1cCBtb2RlbSBvcHRpb24gcmVnaXN0ZXJzICovCisJcmNfb3V0KGJwLCBDRDE4MF9NQ09SMSwgbWNvcjEpOworCXJjX291dChicCwgQ0QxODBfTUNPUjIsIG1jb3IyKTsKKwkvKiBFbmFibGUgQ0QxODAgdHJhbnNtaXR0ZXIgJiByZWNlaXZlciAqLworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1RYRU4gfCBDQ1JfUlhFTik7CisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkvKiBBbmQgZmluYWxseSBzZXQgUlRTIG9uICovCisJcmNfb3V0KGJwLCBDRDE4MF9NU1ZSLCBwb3J0LT5NU1ZSKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgcmNfc2V0dXBfcG9ydChzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisJCXJldHVybiAwOworCQorCWlmICghcG9ydC0+eG1pdF9idWYpIHsKKwkJLyogV2UgbWF5IHNsZWVwIGluIGdldF96ZXJvZWRfcGFnZSgpICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkKKwkJaWYgKCEodG1wID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkgICAgCisJCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKHRtcCk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJCXBvcnQtPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgdG1wOworCX0KKwkJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCQkKKwlpZiAocG9ydC0+dHR5KSAKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCQkKKwlpZiAocG9ydC0+Y291bnQgPT0gMSkgCisJCWJwLT5jb3VudCsrOworCQkKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJcmNfY2hhbmdlX3NwZWVkKGJwLCBwb3J0KTsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwkJCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworc3RhdGljIHZvaWQgcmNfc2h1dGRvd25fcG9ydChzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJCisJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIAorCQlyZXR1cm47CisJCisjaWZkZWYgUkNfUkVQT1JUX09WRVJSVU4KKwlwcmludGsoS0VSTl9JTkZPICJyYyVkOiBwb3J0ICVkOiBUb3RhbCAlbGQgb3ZlcnJ1bnMgd2VyZSBkZXRlY3RlZC5cbiIsCisJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+b3ZlcnJ1bik7CisjZW5kaWYJCisjaWZkZWYgUkNfUkVQT1JUX0ZJRk8KKwl7CisJCWludCBpOworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcG9ydCAlZDogRklGTyBoaXRzIFsgIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSAgeworCQkJcHJpbnRrKCIlbGQgIiwgcG9ydC0+aGl0c1tpXSk7CisJCX0KKwkJcHJpbnRrKCJdLlxuIik7CisJfQorI2VuZGlmCQorCWlmIChwb3J0LT54bWl0X2J1ZikgIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwb3J0LT54bWl0X2J1Zik7CisJCXBvcnQtPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpZiAoISh0dHkgPSBwb3J0LT50dHkpIHx8IENfSFVQQ0wodHR5KSkgIHsKKwkJLyogRHJvcCBEVFIgKi8KKwkJYnAtPkRUUiB8PSAoMXUgPDwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwl9CisJCisgICAgICAgIC8qIFNlbGVjdCBwb3J0ICovCisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCS8qIFJlc2V0IHBvcnQgKi8KKwlyY193YWl0X0NDUihicCk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9TT0ZUUkVTRVQpOworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQgKi8KKwlwb3J0LT5JRVIgPSAwOworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCQorCWlmICh0dHkpICAKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJCisJaWYgKC0tYnAtPmNvdW50IDwgMCkgIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcmNfc2h1dGRvd25fcG9ydDogIgorCQkJCSAiYmFkIGJvYXJkIGNvdW50OiAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgYnAtPmNvdW50KTsKKwkJYnAtPmNvdW50ID0gMDsKKwl9CisJCisJLyoKKwkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IG9wZW5lZCBwb3J0IG9uIHRoZSBib2FyZAorCSAqIHNodXRkb3duIHdob2xlIGJvYXJkCisJICovCisJaWYgKCFicC0+Y291bnQpIAorCQlyY19zaHV0ZG93bl9ib2FyZChicCk7Cit9CisKKwkKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaW50ICAgIHJldHZhbDsKKwlpbnQgICAgZG9fY2xvY2FsID0gMDsKKwlpbnQgICAgQ0Q7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCisJICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgorCSAqLworCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJICAgICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKENfQ0xPQ0FMKHR0eSkpICAKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCWNsaSgpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydC0+Y291bnQtLTsKKwlzdGkoKTsKKwlwb3J0LT5ibG9ja2VkX29wZW4rKzsKKwl3aGlsZSAoMSkgeworCQljbGkoKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlDRCA9IHJjX2luKGJwLCBDRDE4MF9NU1ZSKSAmIE1TVlJfQ0Q7CisJCXJjX291dChicCwgQ0QxODBfTVNWUiwgTVNWUl9SVFMpOworCQlicC0+RFRSICY9IH4oMXUgPDwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwkJc3RpKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwkKKwkJCWJyZWFrOworCQl9CisJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwgfHwgQ0QpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydC0+Y291bnQrKzsKKwlwb3J0LT5ibG9ja2VkX29wZW4tLTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCQorCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuIDA7Cit9CQorCitzdGF0aWMgaW50IHJjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQgYm9hcmQ7CisJaW50IGVycm9yOworCXN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQ7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqIGJwOworCQorCWJvYXJkID0gUkNfQk9BUkQodHR5LT5pbmRleCk7CisJaWYgKGJvYXJkID49IFJDX05CT0FSRCB8fCAhKHJjX2JvYXJkW2JvYXJkXS5mbGFncyAmIFJDX0JPQVJEX1BSRVNFTlQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlicCA9ICZyY19ib2FyZFtib2FyZF07CisJcG9ydCA9IHJjX3BvcnQgKyBib2FyZCAqIFJDX05QT1JUICsgUkNfUE9SVCh0dHktPmluZGV4KTsKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfb3BlbiIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlpZiAoKGVycm9yID0gcmNfc2V0dXBfYm9hcmQoYnApKSkgCisJCXJldHVybiBlcnJvcjsKKwkJCisJcG9ydC0+Y291bnQrKzsKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKKwlwb3J0LT50dHkgPSB0dHk7CisJCisJaWYgKChlcnJvciA9IHJjX3NldHVwX3BvcnQoYnAsIHBvcnQpKSkgCisJCXJldHVybiBlcnJvcjsKKwkKKwlpZiAoKGVycm9yID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgcG9ydCkpKQorCQlyZXR1cm4gZXJyb3I7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCQorCWlmICghcG9ydCB8fCByY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJjbG9zZSIpKQorCQlyZXR1cm47CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlnb3RvIG91dDsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChwb3J0LT5jb3VudCAhPSAxKSkgIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcmNfY2xvc2U6IGJhZCBwb3J0IGNvdW50OyIKKwkJICAgICAgICIgdHR5LT5jb3VudCBpcyAxLCBwb3J0IGNvdW50IGlzICVkXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMTsKKwl9CisJaWYgKC0tcG9ydC0+Y291bnQgPCAwKSAgeworCQlwcmludGsoS0VSTl9JTkZPICJyYyVkOiByY19jbG9zZTogYmFkIHBvcnQgY291bnQgIgorCQkJCSAiZm9yIHR0eSVkOiAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDA7CisJfQorCWlmIChwb3J0LT5jb3VudCkKKwkJZ290byBvdXQ7CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5IAorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwlpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQorCSAqIGRpc2FibGUgdGhlIHJlY2VpdmUgbGluZSBzdGF0dXMgaW50ZXJydXB0cywgYW5kIHRlbGwgdGhlCisJICogaW50ZXJydXB0IGRyaXZlciB0byBzdG9wIGNoZWNraW5nIHRoZSBkYXRhIHJlYWR5IGJpdCBpbiB0aGUKKwkgKiBsaW5lIHN0YXR1cyByZWdpc3Rlci4KKwkgKi8KKwlwb3J0LT5JRVIgJj0gfklFUl9SWEQ7CisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJCXBvcnQtPklFUiB8PSBJRVJfVFhFTVBUWTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkJLyoKKwkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcytIWjsKKwkJd2hpbGUocG9ydC0+SUVSICYgSUVSX1RYRU1QVFkpICB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPnRpbWVvdXQpKTsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfQorCXJjX3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwl0dHktPmNsb3NpbmcgPSAwOworCXBvcnQtPmV2ZW50ID0gMDsKKwlwb3J0LT50dHkgPSBOVUxMOworCWlmIChwb3J0LT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCX0KKwlwb3J0LT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5jbG9zZV93YWl0KTsKK291dDoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcmNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJaW50IGMsIHRvdGFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY193cml0ZSIpKQorCQlyZXR1cm4gMDsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAwOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJY2xpKCk7CQkKKwkJYyA9IG1pbl90KGludCwgY291bnQsIG1pbihTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxLAorCQkJCQkgIFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQpKTsKKwkJaWYgKGMgPD0gMCkgeworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlicmVhazsKKwkJfQorCisJCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJcG9ydC0+eG1pdF9oZWFkID0gKHBvcnQtPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCXBvcnQtPnhtaXRfY250ICs9IGM7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQl0b3RhbCArPSBjOworCX0KKworCWNsaSgpOworCWlmIChwb3J0LT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYKKwkgICAgIShwb3J0LT5JRVIgJiBJRVJfVFhSRFkpKSB7CisJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZCByY19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCQorCWlmIChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkKKwkJZ290byBvdXQ7CisKKwlwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X2hlYWQrK10gPSBjaDsKKwlwb3J0LT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRSAtIDE7CisJcG9ydC0+eG1pdF9jbnQrKzsKK291dDoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2ZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKwkKKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8CisJICAgICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJcmNfb3V0KHBvcnRfQm9hcmQocG9ydCksIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJcmNfb3V0KHBvcnRfQm9hcmQocG9ydCksIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIGludCByY193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlyZXQ7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwkKKwlyZXR1cm4gcG9ydC0+eG1pdF9jbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHJjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyBpbnQgcmNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqIGJwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJCXJldHVybiAtRU5PREVWOworCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJc3RhdHVzID0gcmNfaW4oYnAsIENEMTgwX01TVlIpOworCXJlc3VsdCA9IHJjX2luKGJwLCBSQ19SSSkgJiAoMXUgPDwgcG9ydF9Obyhwb3J0KSkgPyAwIDogVElPQ01fUk5HOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJlc3VsdCB8PSAoKHN0YXR1cyAmIE1TVlJfUlRTKSA/IFRJT0NNX1JUUyA6IDApCisJCXwgKChzdGF0dXMgJiBNU1ZSX0RUUikgPyBUSU9DTV9EVFIgOiAwKQorCQl8ICgoc3RhdHVzICYgTVNWUl9DRCkgID8gVElPQ01fQ0FSIDogMCkKKwkJfCAoKHN0YXR1cyAmIE1TVlJfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCXwgKChzdGF0dXMgJiBNU1ZSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJjX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwb3J0LT5NU1ZSIHw9IE1TVlJfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWJwLT5EVFIgJj0gfigxdSA8PCBwb3J0X05vKHBvcnQpKTsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcG9ydC0+TVNWUiAmPSB+TVNWUl9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlicC0+RFRSIHw9ICgxdSA8PCBwb3J0X05vKHBvcnQpKTsKKworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJjX3NlbmRfYnJlYWsoc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXBvcnQtPmJyZWFrX2xlbmd0aCA9IFJJU0NPTV9UUFMgLyBIWiAqIGxlbmd0aDsKKwlwb3J0LT5DT1IyIHw9IENPUjJfRVRDOworCXBvcnQtPklFUiAgfD0gSUVSX1RYUkRZOworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlyY19vdXQoYnAsIENEMTgwX0NPUjIsIHBvcnQtPkNPUjIpOworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX0NPUkNIRzIpOworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmNfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQsCisJCQkJICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaW50IGNoYW5nZV9zcGVlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCBuZXdpbmZvLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCQorI2lmIDAJCisJaWYgKCh0bXAuaXJxICE9IGJwLT5pcnEpIHx8CisJICAgICh0bXAucG9ydCAhPSBicC0+YmFzZSkgfHwKKwkgICAgKHRtcC50eXBlICE9IFBPUlRfQ0lSUlVTKSB8fAorCSAgICAodG1wLmJhdWRfYmFzZSAhPSAoUkNfT1NDRlJFUSArIENEMTgwX1RQQy8yKSAvIENEMTgwX1RQQykgfHwKKwkgICAgKHRtcC5jdXN0b21fZGl2aXNvciAhPSAwKSB8fAorCSAgICAodG1wLnhtaXRfZmlmb19zaXplICE9IENEMTgwX05GSUZPKSB8fAorCSAgICAodG1wLmZsYWdzICYgflJJU0NPTV9MRUdBTF9GTEFHUykpCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCQorCQorCWNoYW5nZV9zcGVlZCA9ICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KKwkJCSh0bXAuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpOworCQorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHRtcC5jbG9zZV9kZWxheSAhPSBwb3J0LT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICh0bXAuY2xvc2luZ193YWl0ICE9IHBvcnQtPmNsb3Npbmdfd2FpdCkgfHwKKwkJICAgICgodG1wLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKSAgCisJCQlyZXR1cm4gLUVQRVJNOworCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCSAgICAgICAodG1wLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwl9IGVsc2UgIHsKKwkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkgICAgICAgKHRtcC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCXBvcnQtPmNsb3NlX2RlbGF5ID0gdG1wLmNsb3NlX2RlbGF5OworCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSB0bXAuY2xvc2luZ193YWl0OworCX0KKwlpZiAoY2hhbmdlX3NwZWVkKSAgeworCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCXJjX2NoYW5nZV9zcGVlZChicCwgcG9ydCk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmNfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQsCisJCQkJICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC50eXBlID0gUE9SVF9DSVJSVVM7CisJdG1wLmxpbmUgPSBwb3J0IC0gcmNfcG9ydDsKKwl0bXAucG9ydCA9IGJwLT5iYXNlOworCXRtcC5pcnEgID0gYnAtPmlycTsKKwl0bXAuZmxhZ3MgPSBwb3J0LT5mbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gKFJDX09TQ0ZSRVEgKyBDRDE4MF9UUEMvMikgLyBDRDE4MF9UUEM7CisJdG1wLmNsb3NlX2RlbGF5ID0gcG9ydC0+Y2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJdG1wLmNsb3Npbmdfd2FpdCA9IHBvcnQtPmNsb3Npbmdfd2FpdCAqIEhaLzEwMDsKKwl0bXAueG1pdF9maWZvX3NpemUgPSBDRDE4MF9ORklGTzsKKwlyZXR1cm4gY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHJjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisJCSAgICAKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0dmFsOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY19pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCSBjYXNlIFRDU0JSSzoJLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJaWYgKCFhcmcpCisJCQlyY19zZW5kX2JyZWFrKHBvcnQsIEhaLzQpOwkvKiAxLzQgc2Vjb25kICovCisJCWJyZWFrOworCSBjYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlyY19zZW5kX2JyZWFrKHBvcnQsIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisJCWJyZWFrOworCSBjYXNlIFRJT0NHU09GVENBUjoKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApOworCSBjYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKGdldF91c2VyKGFyZywodW5zaWduZWQgX191c2VyICopIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCShhcmcgPyBDTE9DQUwgOiAwKSk7CisJCWJyZWFrOworCSBjYXNlIFRJT0NHU0VSSUFMOgkKKwkJcmV0dXJuIHJjX2dldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKKwkgY2FzZSBUSU9DU1NFUklBTDoJCisJCXJldHVybiByY19zZXRfc2VyaWFsX2luZm8ocG9ydCwgYXJncCk7CisJIGRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByY190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY190aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlwb3J0LT5NU1ZSICY9IH5NU1ZSX1JUUzsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJaWYgKElfSVhPRkYodHR5KSkgIHsKKwkJcmNfd2FpdF9DQ1IoYnApOworCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1NTQ0gyKTsKKwkJcmNfd2FpdF9DQ1IoYnApOworCX0KKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByY191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+TVNWUiB8PSBNU1ZSX1JUUzsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJaWYgKElfSVhPRkYodHR5KSkgIHsKKwkJcmNfd2FpdF9DQ1IoYnApOworCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1NTQ0gxKTsKKwkJcmNfd2FpdF9DQ1IoYnApOworCX0KKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByY19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3N0b3AiKSkKKwkJcmV0dXJuOworCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByY19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY19zdGFydCIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlpZiAocG9ydC0+eG1pdF9jbnQgJiYgcG9ydC0+eG1pdF9idWYgJiYgIShwb3J0LT5JRVIgJiBJRVJfVFhSRFkpKSAgeworCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgd29yayBxdWV1ZSB3aGVuIHRoZSBpbnRlcnJ1cHQKKyAqIHJvdXRpbmUgaGFzIHNpZ25hbGxlZCB0aGF0IGEgaGFuZ3VwIGhhcyBvY2N1cnJlZC4gIFRoZSBwYXRoIG9mCisgKiBoYW5ndXAgcHJvY2Vzc2luZyBpczoKKyAqCisgKiAJc2VyaWFsIGludGVycnVwdCByb3V0aW5lIC0+ICh3b3JrcXVldWUpIC0+CisgKiAJZG9fcmNfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiByY19oYW5ndXAoKQorICogCisgKi8KK3N0YXRpYyB2b2lkIGRvX3JjX2hhbmd1cCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQJKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkpCisJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2Ugc3RpbGwgaGVyZSAqLworfQorCitzdGF0aWMgdm9pZCByY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2hhbmd1cCIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXJjX3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOworCXBvcnQtPmV2ZW50ID0gMDsKKwlwb3J0LT5jb3VudCA9IDA7CisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcG9ydC0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3NldF90ZXJtaW9zIikpCisJCXJldHVybjsKKwkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXJjX2NoYW5nZV9zcGVlZChwb3J0X0JvYXJkKHBvcnQpLCBwb3J0KTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCXJjX3N0YXJ0KHR0eSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCByaXNjb21fcG9ydAkqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwkKKwlpZighKHR0eSA9IHBvcnQtPnR0eSkpIAorCQlyZXR1cm47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJTX0VWRU5UX1dSSVRFX1dBS0VVUCwgJnBvcnQtPmV2ZW50KSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcmlzY29tX29wcyA9IHsKKwkub3BlbiAgPSByY19vcGVuLAorCS5jbG9zZSA9IHJjX2Nsb3NlLAorCS53cml0ZSA9IHJjX3dyaXRlLAorCS5wdXRfY2hhciA9IHJjX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IHJjX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gcmNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcmNfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSByY19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gcmNfaW9jdGwsCisJLnRocm90dGxlID0gcmNfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSByY191bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHJjX3NldF90ZXJtaW9zLAorCS5zdG9wID0gcmNfc3RvcCwKKwkuc3RhcnQgPSByY19zdGFydCwKKwkuaGFuZ3VwID0gcmNfaGFuZ3VwLAorCS50aW9jbWdldCA9IHJjX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHJjX3Rpb2Ntc2V0LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgcmNfaW5pdF9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yOworCWludCBpOworCisJcmlzY29tX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoUkNfTkJPQVJEICogUkNfTlBPUlQpOworCWlmICghcmlzY29tX2RyaXZlcikJCisJCXJldHVybiAtRU5PTUVNOworCQorCWlmICghKHRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmM6IENvdWxkbid0IGdldCBmcmVlIHBhZ2UuXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIocmlzY29tX2RyaXZlcik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoSVJRX3RvX2JvYXJkLCAwLCBzaXplb2YoSVJRX3RvX2JvYXJkKSk7CisJcmlzY29tX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlyaXNjb21fZHJpdmVyLT5uYW1lID0gInR0eUwiOworCXJpc2NvbV9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0wiOworCXJpc2NvbV9kcml2ZXItPm1ham9yID0gUklTQ09NOF9OT1JNQUxfTUFKT1I7CisJcmlzY29tX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcmlzY29tX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlyaXNjb21fZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcmlzY29tX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJcmlzY29tX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhyaXNjb21fZHJpdmVyLCAmcmlzY29tX29wcyk7CisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocmlzY29tX2RyaXZlcikpKSAgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXB1dF90dHlfZHJpdmVyKHJpc2NvbV9kcml2ZXIpOworCQlwcmludGsoS0VSTl9FUlIgInJjOiBDb3VsZG4ndCByZWdpc3RlciBSSVNDb20vOCBkcml2ZXIsICIKKwkJCQkiZXJyb3IgPSAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtc2V0KHJjX3BvcnQsIDAsIHNpemVvZihyY19wb3J0KSk7CisJZm9yIChpID0gMDsgaSA8IFJDX05QT1JUICogUkNfTkJPQVJEOyBpKyspICB7CisJCXJjX3BvcnRbaV0ubWFnaWMgPSBSSVNDT004X01BR0lDOworCQlJTklUX1dPUksoJnJjX3BvcnRbaV0udHF1ZXVlLCBkb19zb2Z0aW50LCAmcmNfcG9ydFtpXSk7CisJCUlOSVRfV09SSygmcmNfcG9ydFtpXS50cXVldWVfaGFuZ3VwLCBkb19yY19oYW5ndXAsICZyY19wb3J0W2ldKTsKKwkJcmNfcG9ydFtpXS5jbG9zZV9kZWxheSA9IDUwICogSFovMTAwOworCQlyY19wb3J0W2ldLmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJjX3BvcnRbaV0ub3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcmNfcG9ydFtpXS5jbG9zZV93YWl0KTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3JlbGVhc2VfZHJpdmVycyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpc2NvbV9kcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKHJpc2NvbV9kcml2ZXIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisjaWZuZGVmIE1PRFVMRQorLyoKKyAqIENhbGxlZCBhdCBib290IHRpbWUuCisgKiAKKyAqIFlvdSBjYW4gc3BlY2lmeSBJTyBiYXNlIGZvciB1cCB0byBSQ19OQk9BUkQgY2FyZHMsCisgKiB1c2luZyBsaW5lICJyaXNjb204PTB4aW9iYXNlMSwweGlvYmFzZTIsLi4iIGF0IExJTE8gcHJvbXB0LgorICogTm90ZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gcHJvYmluZyBhdCBkZWZhdWx0CisgKiBhZGRyZXNzZXMgaW4gdGhpcyBjYXNlLgorICoKKyAqLyAKK3N0YXRpYyBpbnQgX19pbml0IHJpc2NvbThfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzW1JDX05CT0FSRF07CisJaW50IGk7CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJZm9yIChpID0gMDsgaSA8IFJDX05CT0FSRDsgaSsrKSB7CisJCWlmIChpIDwgaW50c1swXSkKKwkJCXJjX2JvYXJkW2ldLmJhc2UgPSBpbnRzW2krMV07CisJCWVsc2UgCisJCQlyY19ib2FyZFtpXS5iYXNlID0gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJpc2NvbTg9IiwgcmlzY29tOF9zZXR1cCk7CisjZW5kaWYKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9CisJS0VSTl9JTkZPICJyYzogU0RMIFJJU0NvbS84IGNhcmQgZHJpdmVyIHYxLjEsIChjKSBELkdvcm9kY2hhbmluICIKKwkJICAiMTk5NC0xOTk2LlxuIjsKK3N0YXRpYyBjaGFyIG5vX2JvYXJkc19tc2dbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gInJjOiBObyBSSVNDb20vOCBib2FyZHMgZGV0ZWN0ZWQuXG4iOworCisvKiAKKyAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBieSBrZXJuZWwgYXQgYm9vdCB0aW1lIAorICovCitzdGF0aWMgaW50IF9faW5pdCByaXNjb204X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgZm91bmQgPSAwOworCisJcHJpbnRrKGJhbm5lcik7CisKKwlpZiAocmNfaW5pdF9kcml2ZXJzKCkpIAorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBSQ19OQk9BUkQ7IGkrKykgCisJCWlmIChyY19ib2FyZFtpXS5iYXNlICYmICFyY19wcm9iZSgmcmNfYm9hcmRbaV0pKSAgCisJCQlmb3VuZCsrOworCQorCWlmICghZm91bmQpICB7CisJCXJjX3JlbGVhc2VfZHJpdmVycygpOworCQlwcmludGsobm9fYm9hcmRzX21zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGludCBpb2Jhc2U7CitzdGF0aWMgaW50IGlvYmFzZTE7CitzdGF0aWMgaW50IGlvYmFzZTI7CitzdGF0aWMgaW50IGlvYmFzZTM7CitNT0RVTEVfUEFSTShpb2Jhc2UsICJpIik7CitNT0RVTEVfUEFSTShpb2Jhc2UxLCAiaSIpOworTU9EVUxFX1BBUk0oaW9iYXNlMiwgImkiKTsKK01PRFVMRV9QQVJNKGlvYmFzZTMsICJpIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyoKKyAqIFlvdSBjYW4gc2V0dXAgdXAgdG8gNCBib2FyZHMgKGN1cnJlbnQgdmFsdWUgb2YgUkNfTkJPQVJEKQorICogYnkgc3BlY2lmeWluZyAiaW9iYXNlPTB4WFhYIGlvYmFzZTE9MHhYWFggLi4uIiBhcyBpbnNtb2QgcGFyYW1ldGVyLgorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgcmlzY29tOF9pbml0X21vZHVsZSAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlpbnQgaTsKKworCWlmIChpb2Jhc2UgfHwgaW9iYXNlMSB8fCBpb2Jhc2UyIHx8IGlvYmFzZTMpIHsKKwkJZm9yKGkgPSAwOyBpIDwgUkNfTkJPQVJEOyBpKyspCisJCQlyY19ib2FyZFswXS5iYXNlID0gMDsKKwl9CisKKwlpZiAoaW9iYXNlKQorCQlyY19ib2FyZFswXS5iYXNlID0gaW9iYXNlOworCWlmIChpb2Jhc2UxKQorCQlyY19ib2FyZFsxXS5iYXNlID0gaW9iYXNlMTsKKwlpZiAoaW9iYXNlMikKKwkJcmNfYm9hcmRbMl0uYmFzZSA9IGlvYmFzZTI7CisJaWYgKGlvYmFzZTMpCisJCXJjX2JvYXJkWzNdLmJhc2UgPSBpb2Jhc2UzOworI2VuZGlmIC8qIE1PRFVMRSAqLworCisJcmV0dXJuIHJpc2NvbThfaW5pdCgpOworfQorCQorc3RhdGljIHZvaWQgX19leGl0IHJpc2NvbThfZXhpdF9tb2R1bGUgKHZvaWQpCit7CisJaW50IGk7CisJCisJcmNfcmVsZWFzZV9kcml2ZXJzKCk7CisJZm9yIChpID0gMDsgaSA8IFJDX05CT0FSRDsgaSsrKSAgCisJCWlmIChyY19ib2FyZFtpXS5mbGFncyAmIFJDX0JPQVJEX1BSRVNFTlQpIAorCQkJcmNfcmVsZWFzZV9pb19yYW5nZSgmcmNfYm9hcmRbaV0pOworCQorfQorCittb2R1bGVfaW5pdChyaXNjb204X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJpc2NvbThfZXhpdF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlzY29tOC5oIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE3YWFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqICAgICAgbGludXgvZHJpdmVycy9jaGFyL3Jpc2NvbTguaCAgLS0gUklTQ29tLzggbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgRG1pdHJ5IEdvcm9kY2hhbmluIChwZ21kc2dAaWJpLmNvbSkKKyAqCisgKiAgICAgIFRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5CisgKiAgICAgIExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUJ3NvIGFuZCBvdGhlcnMuIFRoZSBSSVNDb20vOCBjYXJkIAorICogICAgICBwcm9ncmFtbWluZyBpbmZvIHdhcyBvYnRhaW5lZCBmcm9tIHZhcmlvdXMgZHJpdmVycyBmb3Igb3RoZXIgT1NlcyAKKyAqCShGcmVlQlNELCBJU0MsIGV0YyksIGJ1dCBubyBzb3VyY2UgY29kZSBmcm9tIHRob3NlIGRyaXZlcnMgd2VyZSAKKyAqCWRpcmVjdGx5IGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyLgorICoKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1JJU0NPTThfSAorI2RlZmluZSBfX0xJTlVYX1JJU0NPTThfSAorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUkNfTkJPQVJECQk0CisvKiBOT1RFOiBSSVNDb20gZGVjb2RlciByZWNvZ25pemVzIDE2IGFkZHJlc3Nlcy4uLiAqLworI2RlZmluZSBSQ19OUE9SVCAgICAgICAgCTggIAorI2RlZmluZSBSQ19CT0FSRChsaW5lKQkJKCgobGluZSkgPj4gMykgJiAweDA3KQorI2RlZmluZSBSQ19QT1JUKGxpbmUpCQkoKGxpbmUpICYgKFJDX05QT1JUIC0gMSkpCisKKy8qIFRpY2tzIHBlciBzZWMuIFVzZWQgZm9yIHNldHRpbmcgcmVjZWl2ZXIgdGltZW91dCBhbmQgYnJlYWsgbGVuZ3RoICovCisjZGVmaW5lIFJJU0NPTV9UUFMJCTQwMDAKKworLyogWWVhaCwgYWZ0ZXIgaGVhdnkgdGVzdGluZyBJIGRlY2lkZWQgaXQgbXVzdCBiZSA2LgorICogU3VyZSwgWW91IGNhbiBjaGFuZ2UgaXQgaWYgbmVlZGVkLgorICovCisjZGVmaW5lIFJJU0NPTV9SWEZJRk8JCTYJLyogTWF4LiByZWNlaXZlciBGSUZPIHNpemUgKDEtOCkgKi8KKworI2RlZmluZSBSSVNDT004X01BR0lDCQkweDA5MDcKKworI2RlZmluZSBSQ19JT0JBU0UxCTB4MjIwCisjZGVmaW5lIFJDX0lPQkFTRTIJMHgyNDAKKyNkZWZpbmUgUkNfSU9CQVNFMwkweDI1MAorI2RlZmluZSBSQ19JT0JBU0U0CTB4MjYwCisKK3N0cnVjdCByaXNjb21fYm9hcmQgeworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydAliYXNlOworCXVuc2lnbmVkIGNoYXIgCWlycTsKKwlzaWduZWQgICBjaGFyCWNvdW50OworCXVuc2lnbmVkIGNoYXIJRFRSOworfTsKKworI2RlZmluZSBSQ19CT0FSRF9QUkVTRU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkNfQk9BUkRfQUNUSVZFCQkweDAwMDAwMDAyCisJCitzdHJ1Y3QgcmlzY29tX3BvcnQgeworCWludAkJCW1hZ2ljOworCWludAkJCWJhdWRfYmFzZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAJKiB0dHk7CisJaW50CQkJY291bnQ7CisJaW50CQkJYmxvY2tlZF9vcGVuOworCWxvbmcJCQlldmVudDsgLyogbG9uZyByZXEnZCBmb3Igc2V0X2JpdCAtLVJSICovCisJaW50CQkJdGltZW91dDsKKwlpbnQJCQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBjaGFyIAkJKiB4bWl0X2J1ZjsKKwlpbnQJCQljdXN0b21fZGl2aXNvcjsKKwlpbnQJCQl4bWl0X2hlYWQ7CisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZV9oYW5ndXA7CisJc2hvcnQJCQl3YWtldXBfY2hhcnM7CisJc2hvcnQJCQlicmVha19sZW5ndGg7CisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsKKwl1bnNpZ25lZCBjaGFyCQltYXJrX21hc2s7CisJdW5zaWduZWQgY2hhcgkJSUVSOworCXVuc2lnbmVkIGNoYXIJCU1TVlI7CisJdW5zaWduZWQgY2hhcgkJQ09SMjsKKyNpZmRlZiBSQ19SRVBPUlRfT1ZFUlJVTgorCXVuc2lnbmVkIGxvbmcJCW92ZXJydW47CisjZW5kaWYJCisjaWZkZWYgUkNfUkVQT1JUX0ZJRk8KKwl1bnNpZ25lZCBsb25nCQloaXRzWzEwXTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0xJTlVYX1JJU0NPTThfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbThfcmVnLmggYi9kcml2ZXJzL2NoYXIvcmlzY29tOF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzI0NzVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpc2NvbThfcmVnLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiAgICAgIGxpbnV4L2RyaXZlcnMvY2hhci9yaXNjb204X3JlZy5oICAtLSBSSVNDb20vOCBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIFJJU0NvbS84IEFzeW5jIE11eCBjYXJkIGJ5IFNETCBDb21tdW5pY2F0aW9ucywgSW5jLgorICovCisKKy8qCisgKiBBZGRyZXNzIG1hcHBpbmcgYmV0d2VlbiBDaXJydXMgTG9naWMgQ0QxODAgY2hpcCBpbnRlcm5hbCByZWdpc3RlcnMKKyAqIGFuZCBJU0EgcG9ydCBhZGRyZXNzZXM6CisgKgorICogICAgICBDTC1DRDE4MCAgICAgICAgICAgICAgICBBNiAgQTUgICBBNCAgQTMgICAgICAgICAgICAgICAgICAgICAgQTIgQTEgQTAKKyAqICAgICAgSVNBICAgICAgICAgICAgIEExNSBBMTQgQTEzIEExMiAgQTExIEExMCBBOSBBOCAgQTcgQTYgQTUgQTQgIEEzIEEyIEExIEEwCisgKi8KKyNkZWZpbmUgUkNfVE9fSVNBKHIpICAgICgoKChyKSYweDA3KTw8MSkgfCAoKChyKSZ+MHgwNyk8PDcpKQorCisKKy8qIFJJU0NvbS84IE9uLUJvYXJkIFJlZ2lzdGVycyAoYXNzdW1pbmcgYWRkcmVzcyB0cmFuc2xhdGlvbikgKi8KKworI2RlZmluZSBSQ19SSSAgICAgICAgICAgMHgxMDAgICAvKiBSaW5nIEluZGljYXRvciBSZWdpc3RlciAoUi9PKSAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfRFRSICAgICAgICAgIDB4MTAwICAgLyogRFRSIFJlZ2lzdGVyIChXL08pICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0JTUiAgICAgICAgICAweDEwMSAgIC8qIEJvYXJkIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19DVE9VVCAgICAgICAgMHgxMDEgICAvKiBDbGVhciBUaW1lb3V0IChXL08pICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBCb2FyZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBSQ19CU1JfVE9VVCAgICAgMHgwOCAgICAgLyogSGFyZHdhcmUgVGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfQlNSX1JJTlQgICAgIDB4MDQgICAgIC8qIFJlY2VpdmVyIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0JTUl9USU5UICAgICAweDAyICAgICAvKiBUcmFuc21pdHRlciBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19CU1JfTUlOVCAgICAgMHgwMSAgICAgLyogTW9kZW0gQ3RsIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBPbi1ib2FyZCBvc2NpbGxhdG9yIGZyZXF1ZW5jeSAoaW4gSHopICovCisjZGVmaW5lIFJDX09TQ0ZSRVEgICAgICA5ODMwNDAwCisKKy8qIFZhbHVlcyBvZiBjaG9pY2UgZm9yIEludGVycnVwdCBBQ0tzICovCisjZGVmaW5lIFJDX0FDS19NSU5UICAgICAweDgxICAgIC8qIGdvZXMgdG8gUElMUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19BQ0tfUklOVCAgICAgMHg4MiAgICAvKiBnb2VzIHRvIFBJTFIzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfQUNLX1RJTlQgICAgIDB4ODQgICAgLyogZ29lcyB0byBQSUxSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIENoaXAgSUQgKHNvcnJ5LCBvbmx5IG9uZSBjaGlwIG5vdykgKi8KKyNkZWZpbmUgUkNfSUQgICAgICAgICAgIDB4MTAKKworLyogRGVmaW5pdGlvbnMgZm9yIENpcnJ1cyBMb2dpYyBDTC1DRDE4MCA4LXBvcnQgYXN5bmMgbXV4IGNoaXAgKi8KKyAKKyNkZWZpbmUgQ0QxODBfTkNIICAgICAgIDggICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1RQQyAgICAgICAxNiAgICAgIC8qIFRpY2tzIHBlciBjaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9ORklGTwk4CS8qIFRYIEZJRk8gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBDRDE4MF9HSVZSICAgICAgMHg0MCAgICAvKiBHbG9iYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfR0lDUiAgICAgIDB4NDEgICAgLyogR2xvYmFsIEludGVycnVwdGluZyBDaGFubmVsIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIENEMTgwX1BJTFIxICAgICAweDYxICAgIC8qIFByaW9yaXR5IEludGVycnVwdCBMZXZlbCBSZWdpc3RlciAxICAgICAqLworI2RlZmluZSBDRDE4MF9QSUxSMiAgICAgMHg2MiAgICAvKiBQcmlvcml0eSBJbnRlcnJ1cHQgTGV2ZWwgUmVnaXN0ZXIgMiAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUElMUjMgICAgIDB4NjMgICAgLyogUHJpb3JpdHkgSW50ZXJydXB0IExldmVsIFJlZ2lzdGVyIDMgICAgICovCisjZGVmaW5lIENEMTgwX0NBUiAgICAgICAweDY0ICAgIC8qIENoYW5uZWwgQWNjZXNzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9HRlJDUiAgICAgMHg2YiAgICAvKiBHbG9iYWwgRmlybXdhcmUgUmV2aXNpb24gQ29kZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQ0QxODBfUFBSSCAgICAgIDB4NzAgICAgLyogUHJlc2NhbGVyIFBlcmlvZCBSZWdpc3RlciBIaWdoICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1BQUkwgICAgICAweDcxICAgIC8qIFByZXNjYWxlciBQZXJpb2QgUmVnaXN0ZXIgTG93ICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9SRFIgICAgICAgMHg3OCAgICAvKiBSZWNlaXZlciBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUkNTUiAgICAgIDB4N2EgICAgLyogUmVjZWl2ZXIgQ2hhcmFjdGVyIFN0YXR1cyBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIENEMTgwX1REUiAgICAgICAweDdiICAgIC8qIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9FT0lSICAgICAgMHg3ZiAgICAvKiBFbmQgb2YgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIENEMTgwX0NDUiAgICAgICAweDAxICAgIC8qIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9JRVIgICAgICAgMHgwMiAgICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ09SMSAgICAgIDB4MDMgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0NPUjIgICAgICAweDA0ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DT1IzICAgICAgMHgwNSAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ0NTUiAgICAgIDB4MDYgICAgLyogQ2hhbm5lbCBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1JEQ1IgICAgICAweDA3ICAgIC8qIFJlY2VpdmUgRGF0YSBDb3VudCBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9TQ0hSMSAgICAgMHgwOSAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAxICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfU0NIUjIgICAgIDB4MGEgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1NDSFIzICAgICAweDBiICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDMgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9TQ0hSNCAgICAgMHgwYyAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciA0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfTUNPUjEgICAgIDB4MTAgICAgLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiAxIFJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX01DT1IyICAgICAweDExICAgIC8qIE1vZGVtIENoYW5nZSBPcHRpb24gMiBSZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9NQ1IgICAgICAgMHgxMiAgICAvKiBNb2RlbSBDaGFuZ2UgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUlRQUiAgICAgIDB4MTggICAgLyogUmVjZWl2ZSBUaW1lb3V0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTgwX01TVlIgICAgICAweDI4ICAgIC8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9SQlBSSCAgICAgMHgzMSAgICAvKiBSZWNlaXZlIEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAgKi8KKyNkZWZpbmUgQ0QxODBfUkJQUkwgICAgIDB4MzIgICAgLyogUmVjZWl2ZSBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyIExvdyAgICovCisjZGVmaW5lIENEMTgwX1RCUFJIICAgICAweDM5ICAgIC8qIFRyYW5zbWl0IEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAqLworI2RlZmluZSBDRDE4MF9UQlBSTCAgICAgMHgzYSAgICAvKiBUcmFuc21pdCBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyIExvdyAgKi8KKworCisvKiBHbG9iYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIEdJVlJfSVRNQVNLICAgICAweDA3ICAgICAvKiBJbnRlcnJ1cHQgdHlwZSBtYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfTU9ERU0gICAweDAxICAgIC8qIE1vZGVtIFNpZ25hbCBDaGFuZ2UgSW50ZXJydXB0ICAgICAgICAgICAqLworI2RlZmluZSAgR0lWUl9JVF9UWCAgICAgIDB4MDIgICAgLyogVHJhbnNtaXQgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBHSVZSX0lUX1JDViAgICAgMHgwMyAgICAvKiBSZWNlaXZlIEdvb2QgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfUkVYQyAgICAweDA3ICAgIC8qIFJlY2VpdmUgRXhjZXB0aW9uIEludGVycnVwdCAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3RlciAoUi9XKSAqLworIAorI2RlZmluZSBHSUNSX0NIQU4gICAgICAgMHgxYyAgICAvKiBDaGFubmVsIE51bWJlciBNYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0lDUl9DSEFOX09GRiAgIDIgICAgICAgLyogQ2hhbm5lbCBOdW1iZXIgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgQ0FSX0NIQU4gICAgICAgIDB4MDcgICAgLyogQ2hhbm5lbCBOdW1iZXIgTWFzayAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUl9BNyAgICAgICAgICAweDA4ICAgIC8qIEE3IEFkZHJlc3MgRXh0ZW5zaW9uICh1bnVzZWQpICAgICAgICAgICAqLworCisKKy8qIFJlY2VpdmUgQ2hhcmFjdGVyIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAqLworCisjZGVmaW5lIFJDU1JfVE9VVCAgICAgICAweDgwICAgIC8qIFJ4IFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX1NDREVUICAgICAgMHg3MCAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBEZXRlY3RlZCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfTk9fU0MgICAgICAweDAwICAgLyogTm8gU3BlY2lhbCBDaGFyYWN0ZXJzIERldGVjdGVkICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzEgICAgICAgMHgxMCAgIC8qIFNwZWNpYWwgQ2hhciAxIChvciAxICYgMykgRGV0ZWN0ZWQgICAgICAqLworI2RlZmluZSAgUkNTUl9TQ18yICAgICAgIDB4MjAgICAvKiBTcGVjaWFsIENoYXIgMiAob3IgMiAmIDQpIERldGVjdGVkICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfU0NfMyAgICAgICAweDMwICAgLyogU3BlY2lhbCBDaGFyIDMgRGV0ZWN0ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzQgICAgICAgMHg0MCAgIC8qIFNwZWNpYWwgQ2hhciA0IERldGVjdGVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX0JSRUFLICAgICAgMHgwOCAgICAvKiBCcmVhayBoYXMgYmVlbiBkZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNTUl9QRSAgICAgICAgIDB4MDQgICAgLyogUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfRkUgICAgICAgICAweDAyICAgIC8qIEZyYW1lIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX09FICAgICAgICAgMHgwMSAgICAvKiBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgKFIvVykgKGNvbW1hbmRzIGluIGdyb3VwcyBjYW4gYmUgT1ItZWQpICovCisKKyNkZWZpbmUgQ0NSX0hBUkRSRVNFVCAgIDB4ODEgICAgLyogUmVzZXQgdGhlIGNoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1NPRlRSRVNFVCAgIDB4ODAgICAgLyogU29mdCBDaGFubmVsIFJlc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX0NPUkNIRzEgICAgIDB4NDIgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSBDaGFuZ2VkICAgICAgICovCisjZGVmaW5lIENDUl9DT1JDSEcyICAgICAweDQ0ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgQ2hhbmdlZCAgICAgICAqLworI2RlZmluZSBDQ1JfQ09SQ0hHMyAgICAgMHg0OCAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIENoYW5nZWQgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDEgICAgICAgMHgyMSAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDEgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDIgICAgICAgMHgyMiAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDIgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDMgICAgICAgMHgyMyAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDMgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDQgICAgICAgMHgyNCAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDQgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfVFhFTiAgICAgICAgMHgxOCAgICAvKiBFbmFibGUgVHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NSX1JYRU4gICAgICAgIDB4MTIgICAgLyogRW5hYmxlIFJlY2VpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1RYRElTICAgICAgIDB4MTQgICAgLyogRGlzYWJsZSBUcmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDUl9SWERJUyAgICAgICAweDExICAgIC8qIERpc2FibGUgUmVjZWl2ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBJRVJfRFNSICAgICAgICAgMHg4MCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIERTUiBjaGFuZ2UgICAgICAgICAgKi8KKyNkZWZpbmUgSUVSX0NEICAgICAgICAgIDB4NDAgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBDRCBjaGFuZ2UgICAgICAgICAgICovCisjZGVmaW5lIElFUl9DVFMgICAgICAgICAweDIwICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gQ1RTIGNoYW5nZSAgICAgICAgICAqLworI2RlZmluZSBJRVJfUlhEICAgICAgICAgMHgxMCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFJlY2VpdmUgRGF0YSAgICAgICAgKi8KKyNkZWZpbmUgSUVSX1JYU0MgICAgICAgIDB4MDggICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSZWNlaXZlIFNwZWMuIENoYXIgICovCisjZGVmaW5lIElFUl9UWFJEWSAgICAgICAweDA0ICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gVFggRklGTyBlbXB0eSAgICAgICAqLworI2RlZmluZSBJRVJfVFhFTVBUWSAgICAgMHgwMiAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFRYIGNvbXBsZXRlbHkgZW1wdHkgKi8KKyNkZWZpbmUgSUVSX1JFVCAgICAgICAgIDB4MDEgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSWCBFeGMuIFRpbWVvdXQgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIENPUjFfT0REUCAgICAgICAweDgwICAgIC8qIE9kZCBQYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX1BBUk1PREUgICAgMHg2MCAgICAvKiBQYXJpdHkgTW9kZSBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfTk9QQVIgICAgICAweDAwICAgLyogTm8gUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxX0ZPUkNFUEFSICAgMHgyMCAgIC8qIEZvcmNlIFBhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV9OT1JNUEFSICAgIDB4NDAgICAvKiBOb3JtYWwgUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMV9JR05PUkUgICAgIDB4MTAgICAgLyogSWdub3JlIFBhcml0eSBvbiBSWCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjFfU1RPUEJJVFMgICAweDBjICAgIC8qIE51bWJlciBvZiBTdG9wIEJpdHMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV8xU0IgICAgICAgIDB4MDAgICAvKiAxIFN0b3AgQml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfMTVTQiAgICAgICAweDA0ICAgLyogMS41IFN0b3AgQml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzJTQiAgICAgICAgMHgwOCAgIC8qIDIgU3RvcCBCaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX0NIQVJMRU4gICAgMHgwMyAgICAvKiBDaGFyYWN0ZXIgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfNUJJVFMgICAgICAweDAwICAgLyogNSBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzZCSVRTICAgICAgMHgwMSAgIC8qIDYgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV83QklUUyAgICAgIDB4MDIgICAvKiA3IGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfOEJJVFMgICAgICAweDAzICAgLyogOCBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAoUi9XKSAqLworCisjZGVmaW5lIENPUjJfSVhNICAgICAgICAweDgwICAgIC8qIEltcGxpZWQgWE9OIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1RYSUJFICAgICAgMHg0MCAgICAvKiBFbmFibGUgSW4tQmFuZCAoWE9OL1hPRkYpIEZsb3cgQ29udHJvbCAgKi8KKyNkZWZpbmUgQ09SMl9FVEMgICAgICAgIDB4MjAgICAgLyogRW1iZWRkZWQgVHggQ29tbWFuZHMgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfTExNICAgICAgICAweDEwICAgIC8qIExvY2FsIExvb3BiYWNrIE1vZGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1JMTSAgICAgICAgMHgwOCAgICAvKiBSZW1vdGUgTG9vcGJhY2sgTW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMl9SVFNBTyAgICAgIDB4MDQgICAgLyogUlRTIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfQ1RTQUUgICAgICAweDAyICAgIC8qIENUUyBBdXRvbWF0aWMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX0RTUkFFICAgICAgMHgwMSAgICAvKiBEU1IgQXV0b21hdGljIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIChSL1cpICovCisKKyNkZWZpbmUgQ09SM19YT05DSCAgICAgIDB4ODAgICAgLyogWE9OIGlzIGEgcGFpciBvZiBjaGFyYWN0ZXJzICgxICYgMykgICAgICovCisjZGVmaW5lIENPUjNfWE9GRkNIICAgICAweDQwICAgIC8qIFhPRkYgaXMgYSBwYWlyIG9mIGNoYXJhY3RlcnMgKDIgJiA0KSAgICAqLworI2RlZmluZSBDT1IzX0ZDVCAgICAgICAgMHgyMCAgICAvKiBGbG93LUNvbnRyb2wgVHJhbnNwYXJlbmN5IE1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SM19TQ0RFICAgICAgIDB4MTAgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgRGV0ZWN0aW9uIEVuYWJsZSAgICAgICovCisjZGVmaW5lIENPUjNfUlhUSCAgICAgICAweDBmICAgIC8qIFJYIEZJRk8gVGhyZXNob2xkIHZhbHVlICgxLTgpICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIgKFIvTykgKi8KKworI2RlZmluZSBDQ1NSX1JYRU4gICAgICAgMHg4MCAgICAvKiBSZWNlaXZlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9SWEZMT0ZGICAgIDB4NDAgICAgLyogUmVjZWl2ZSBGbG93IE9mZiAoWE9GRiB3YXMgc2VudCkgICAgICAgICovCisjZGVmaW5lIENDU1JfUlhGTE9OICAgICAweDIwICAgIC8qIFJlY2VpdmUgRmxvdyBPbiAoWE9OIHdhcyBzZW50KSAgICAgICAgICAqLworI2RlZmluZSBDQ1NSX1RYRU4gICAgICAgMHgwOCAgICAvKiBUcmFuc21pdHRlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT0ZGICAgIDB4MDQgICAgLyogVHJhbnNtaXQgRmxvdyBPZmYgKGdvdCBYT0ZGKSAgICAgICAgICAgICovCisjZGVmaW5lIENDU1JfVFhGTE9OICAgICAweDAyICAgIC8qIFRyYW5zbWl0IEZsb3cgT24gKGdvdCBYT04pICAgICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIENoYW5nZSBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIE1DT1IxX0RTUlpEICAgICAweDgwICAgIC8qIERldGVjdCAwLT4xIHRyYW5zaXRpb24gb2YgRFNSICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMV9DRFpEICAgICAgMHg0MCAgICAvKiBEZXRlY3QgMC0+MSB0cmFuc2l0aW9uIG9mIENEICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNPUjFfQ1RTWkQgICAgIDB4MjAgICAgLyogRGV0ZWN0IDAtPjEgdHJhbnNpdGlvbiBvZiBDVFMgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IxX0RUUlRIICAgICAweDBmICAgIC8qIEF1dG8gRFRSIGZsb3cgY29udHJvbCBUaHJlc2hvbGQgKDEtOCkgICAqLworI2RlZmluZSAgTUNPUjFfTk9EVFJGQyAgIDB4MCAgICAgLyogQXV0b21hdGljIERUUiBmbG93IGNvbnRyb2wgZGlzYWJsZWQgICAgICovCisKKworLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAyIChSL1cpICovCisKKyNkZWZpbmUgTUNPUjJfRFNST0QgICAgIDB4ODAgICAgLyogRGV0ZWN0IDEtPjAgdHJhbnNpdGlvbiBvZiBEU1IgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IyX0NET0QgICAgICAweDQwICAgIC8qIERldGVjdCAxLT4wIHRyYW5zaXRpb24gb2YgQ0QgICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMl9DVFNPRCAgICAgMHgyMCAgICAvKiBEZXRlY3QgMS0+MCB0cmFuc2l0aW9uIG9mIENUUyAgICAgICAgICAgKi8KKworCisvKiBNb2RlbSBDaGFuZ2UgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBNQ1JfRFNSQ0hHICAgICAgMHg4MCAgICAvKiBEU1IgQ2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNSX0NEQ0hHICAgICAgIDB4NDAgICAgLyogQ0QgQ2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1DUl9DVFNDSEcgICAgICAweDIwICAgIC8qIENUUyBDaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIE1TVlJfRFNSICAgICAgICAweDgwICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgRFNSIGlucHV0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX0NEICAgICAgICAgMHg0MCAgICAvKiBDdXJyZW50IHN0YXRlIG9mIENEIGlucHV0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9DVFMgICAgICAgIDB4MjAgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBDVFMgaW5wdXQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TVlJfRFRSICAgICAgICAweDAyICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgRFRSIG91dHB1dCAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX1JUUyAgICAgICAgMHgwMSAgICAvKiBDdXJyZW50IHN0YXRlIG9mIFJUUyBvdXRwdXQgICAgICAgICAgICAgKi8KKworCisvKiBFc2NhcGUgY2hhcmFjdGVycyAqLworCisjZGVmaW5lIENEMTgwX0NfRVNDICAgICAweDAwICAgIC8qIEVzY2FwZSBjaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DX1NCUksgICAgMHg4MSAgICAvKiBTdGFydCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ19ERUxBWSAgIDB4ODIgICAgLyogRGVsYXkgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0NfRUJSSyAgICAweDgzICAgIC8qIFN0b3Agc2VuZGluZyBCUkVBSyAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JvY2tldC5jIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2JlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKQEAgLTAsMCArMSwzMjk5IEBACisvKgorICogUm9ja2V0UG9ydCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMC4KKyAqIAorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAzIGJ5IENvbXRyb2wsIEluYy4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogS2VybmVsIFN5bmNocm9uaXphdGlvbjoKKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgMiBrZXJuZWwgY29udHJvbCBwYXRocyAtIGV4Y2VwdGlvbiBoYW5kbGVycyAoY2FsbHMgaW50byB0aGUgZHJpdmVyCisgKiBmcm9tIHVzZXIgbW9kZSkgYW5kIHRoZSB0aW1lciBib3R0b20gaGFsZiAodGFza2xldCkuICBUaGlzIGlzIGEgcG9sbGVkIGRyaXZlciwgaW50ZXJydXB0cworICogYXJlIG5vdCB1c2VkLgorICoKKyAqIENyaXRpY2FsIGRhdGE6IAorICogLSAgcnBfdGFibGVbXSwgYWNjZXNzZWQgdGhyb3VnaCBwYXNzZWQgImluZm8iIHBvaW50ZXJzLCBpcyBhIGdsb2JhbCAoc3RhdGljKSBhcnJheSBvZiAKKyAqICAgIHNlcmlhbCBwb3J0IHN0YXRlIGluZm9ybWF0aW9uIGFuZCB0aGUgeG1pdF9idWYgY2lyY3VsYXIgYnVmZmVyLiAgUHJvdGVjdGVkIGJ5IAorICogICAgYSBwZXIgcG9ydCBzcGlubG9jay4KKyAqIC0gIHhtaXRfZmxhZ3NbXSwgYW4gYXJyYXkgb2YgaW50cyBpbmRleGVkIGJ5IGxpbmUgKHBvcnQpIG51bWJlciwgaW5kaWNhdGluZyB0aGF0IHRoZXJlCisgKiAgICBpcyBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLiAgUHJvdGVjdGVkIGJ5IGF0b21pYyBiaXQgb3BlcmF0aW9ucy4KKyAqIC0gIHJwX251bV9wb3J0cywgaW50IGluZGljYXRpbmcgbnVtYmVyIG9mIG9wZW4gcG9ydHMsIHByb3RlY3RlZCBieSBhdG9taWMgb3BlcmF0aW9ucy4KKyAqIAorICogcnBfd3JpdGUoKSBhbmQgcnBfd3JpdGVfY2hhcigpIGZ1bmN0aW9ucyB1c2UgYSBwZXIgcG9ydCBzZW1hcGhvcmUgdG8gcHJvdGVjdCBhZ2FpbnN0CisgKiBzaW11bHRhbmVvdXMgYWNjZXNzIHRvIHRoZSBzYW1lIHBvcnQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLgorICovCisKKy8qKioqKiogRGVmaW5lcyAqKioqKiovCisjaWZkZWYgUENJX05VTV9SRVNPVVJDRVMKKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTUyhkZXYsIHIpICgoZGV2KS0+cmVzb3VyY2Vbcl0uc3RhcnQpCisjZWxzZQorI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTKGRldiwgcikgKChkZXYpLT5iYXNlX2FkZHJlc3Nbcl0pCisjZW5kaWYKKworI2RlZmluZSBST0NLRVRfUEFSQU5PSUFfQ0hFQ0sKKyNkZWZpbmUgUk9DS0VUX0RJU0FCTEVfU0lNVVNBR0UKKworI3VuZGVmIFJPQ0tFVF9TT0ZUX0ZMT1cKKyN1bmRlZiBST0NLRVRfREVCVUdfT1BFTgorI3VuZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisjdW5kZWYgUk9DS0VUX0RFQlVHX1dSSVRFCisjdW5kZWYgUk9DS0VUX0RFQlVHX0ZMT1cKKyN1bmRlZiBST0NLRVRfREVCVUdfVEhST1RUTEUKKyN1bmRlZiBST0NLRVRfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisjdW5kZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKyN1bmRlZiBST0NLRVRfREVCVUdfSEFOR1VQCisjdW5kZWYgUkVWX1BDSV9PUkRFUgorI3VuZGVmIFJPQ0tFVF9ERUJVR19JTworCisjZGVmaW5lIFBPTExfUEVSSU9EIEhaLzEwMAkvKiAgUG9sbGluZyBwZXJpb2QgLjAxIHNlY29uZHMgKDEwbXMpICovCisKKy8qKioqKiogS2VybmVsIGluY2x1ZGVzICoqKioqKi8KKworI2lmZGVmIE1PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYJCQkJCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisvKioqKioqIFJvY2tldFBvcnQgaW5jbHVkZXMgKioqKioqLworCisjaW5jbHVkZSAicm9ja2V0X2ludC5oIgorI2luY2x1ZGUgInJvY2tldC5oIgorCisjZGVmaW5lIFJPQ0tFVF9WRVJTSU9OICIyLjA5IgorI2RlZmluZSBST0NLRVRfREFURSAiMTItSnVuZS0yMDAzIgorCisvKioqKioqIFJvY2tldFBvcnQgTG9jYWwgVmFyaWFibGVzICoqKioqKi8KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpyb2NrZXRfZHJpdmVyOworCitzdGF0aWMgc3RydWN0IHJvY2tldF92ZXJzaW9uIGRyaXZlcl92ZXJzaW9uID0gewkKKwlST0NLRVRfVkVSU0lPTiwgUk9DS0VUX0RBVEUKK307CisKK3N0YXRpYyBzdHJ1Y3Qgcl9wb3J0ICpycF90YWJsZVtNQVhfUlBfUE9SVFNdOwkgICAgICAgLyogIFRoZSBtYWluIHJlcG9zaXRvcnkgb2Ygc2VyaWFsIHBvcnQgc3RhdGUgaW5mb3JtYXRpb24uICovCitzdGF0aWMgdW5zaWduZWQgaW50IHhtaXRfZmxhZ3NbTlVNX0JPQVJEU107CSAgICAgICAvKiAgQml0IHNpZ25pZmljYW50LCBpbmRpY2F0ZXMgcG9ydCBoYWQgZGF0YSB0byB0cmFuc21pdC4gKi8KKwkJCQkJCSAgICAgICAvKiAgZWcuICBCaXQgMCBpbmRpY2F0ZXMgcG9ydCAwIGhhcyB4bWl0IGRhdGEsIC4uLiAgICAgICAgKi8KK3N0YXRpYyBhdG9taWNfdCBycF9udW1fcG9ydHNfb3BlbjsJICAgICAgICAgICAgICAgLyogIE51bWJlciBvZiBzZXJpYWwgcG9ydHMgb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgcm9ja2V0X3RpbWVyOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDE7CSAgICAgICAgICAgICAgICAgICAgICAgLyogSVNBIGFkZHJlc3NlcywgcmV0cmlldmVkIGZyb20gcm9ja2V0cG9ydC5jb25mICAgICAgICAgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb250cm9sbGVyOworc3RhdGljIGludCBzdXBwb3J0X2xvd19zcGVlZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtMjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtMzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtNDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjMTA0XzFbOF07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYzEwNF8yWzhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGMxMDRfM1s4XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjMTA0XzRbOF07CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqcGMxMDRbNF0gPSB7IHBjMTA0XzEsIHBjMTA0XzIsIHBjMTA0XzMsIHBjMTA0XzQgfTsKKworc3RhdGljIGludCBycF9iYXVkX2Jhc2VbTlVNX0JPQVJEU107CSAgICAgICAgICAgICAgIC8qICBCb2FyZCBjb25maWcgaW5mbyAoU29tZWRheSBtYWtlIGEgcGVyLWJvYXJkIHN0cnVjdHVyZSkgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyByY2t0cHRfaW9fYWRkcltOVU1fQk9BUkRTXTsKK3N0YXRpYyBpbnQgcmNrdHB0X3R5cGVbTlVNX0JPQVJEU107CitzdGF0aWMgaW50IGlzX1BDSVtOVU1fQk9BUkRTXTsKK3N0YXRpYyByb2NrZXRNb2RlbF90IHJvY2tldE1vZGVsW05VTV9CT0FSRFNdOworc3RhdGljIGludCBtYXhfYm9hcmQ7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFycmF5cyBkZWZpbmUgdGhlIGludGVycnVwdCBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBBSU9QLgorICogVGhlc2UgYml0cyBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIElTQSBhbmQgcmVndWxhciBQQ0kgYm9hcmRzIGFuZCB0aGUKKyAqIFVuaXZlcnNhbCBQQ0kgYm9hcmRzLgorICovCisKK3N0YXRpYyBXb3JkX3QgYWlvcF9pbnRyX2JpdHNbQUlPUF9DVExfU0laRV0gPSB7CisJQUlPUF9JTlRSX0JJVF8wLAorCUFJT1BfSU5UUl9CSVRfMSwKKwlBSU9QX0lOVFJfQklUXzIsCisJQUlPUF9JTlRSX0JJVF8zCit9OworCitzdGF0aWMgV29yZF90IHVwY2lfYWlvcF9pbnRyX2JpdHNbQUlPUF9DVExfU0laRV0gPSB7CisJVVBDSV9BSU9QX0lOVFJfQklUXzAsCisJVVBDSV9BSU9QX0lOVFJfQklUXzEsCisJVVBDSV9BSU9QX0lOVFJfQklUXzIsCisJVVBDSV9BSU9QX0lOVFJfQklUXzMKK307CisKKy8qCisgKiAgTGluZSBudW1iZXIgaXMgdGhlIHR0eVNJeCBudW1iZXIgKHgpLCB0aGUgTWlub3IgbnVtYmVyLiAgV2UgCisgKiAgYXNzaWduIHRoZW0gc2VxdWVudGlhbGx5LCBzdGFydGluZyBhdCB6ZXJvLiAgVGhlIGZvbGxvd2luZyAKKyAqICBhcnJheSBrZWVwcyB0cmFjayBvZiB0aGUgbGluZSBudW1iZXIgYXNzaWduZWQgdG8gYSBnaXZlbiBib2FyZC9haW9wL2NoYW5uZWwuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxpbmVOdW1iZXJzW01BWF9SUF9QT1JUU107CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0TGluZU51bWJlcjsKKworLyoqKioqICBSb2NrZXRQb3J0IFN0YXRpYyBQcm90b3R5cGVzICAgKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9JU0EoaW50IGkpOworc3RhdGljIHZvaWQgcnBfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkIHJwX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHJtU3BlYWtlclJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIHVuc2lnbmVkIGxvbmcgbW9kZWwpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgR2V0TGluZU51bWJlcihpbnQgY3RybCwgaW50IGFpb3AsIGludCBjaCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBTZXRMaW5lTnVtYmVyKGludCBjdHJsLCBpbnQgYWlvcCwgaW50IGNoKTsKK3N0YXRpYyB2b2lkIHJwX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfQVVUSE9SKCJUaGVvZG9yZSBUcydvIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbXRyb2wgUm9ja2V0UG9ydCBkcml2ZXIiKTsKK21vZHVsZV9wYXJhbShib2FyZDEsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQxLCAiSS9PIHBvcnQgZm9yIChJU0EpIGJvYXJkICMxIik7Cittb2R1bGVfcGFyYW0oYm9hcmQyLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMiwgIkkvTyBwb3J0IGZvciAoSVNBKSBib2FyZCAjMiIpOworbW9kdWxlX3BhcmFtKGJvYXJkMywgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDMsICJJL08gcG9ydCBmb3IgKElTQSkgYm9hcmQgIzMiKTsKK21vZHVsZV9wYXJhbShib2FyZDQsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQ0LCAiSS9PIHBvcnQgZm9yIChJU0EpIGJvYXJkICM0Iik7Cittb2R1bGVfcGFyYW0oY29udHJvbGxlciwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb250cm9sbGVyLCAiSS9PIHBvcnQgZm9yIChJU0EpIHJvY2tldHBvcnQgY29udHJvbGxlciIpOworbW9kdWxlX3BhcmFtKHN1cHBvcnRfbG93X3NwZWVkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3VwcG9ydF9sb3dfc3BlZWQsICIxIG1lYW5zIHN1cHBvcnQgNTAgYmF1ZCwgMCBtZWFucyBzdXBwb3J0IDQ2MDQwMCBiYXVkIik7Cittb2R1bGVfcGFyYW0obW9kZW0xLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVtMSwgIjEgbWVhbnMgKElTQSkgYm9hcmQgIzEgaXMgYSBSb2NrZXRNb2RlbSIpOworbW9kdWxlX3BhcmFtKG1vZGVtMiwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlbTIsICIxIG1lYW5zIChJU0EpIGJvYXJkICMyIGlzIGEgUm9ja2V0TW9kZW0iKTsKK21vZHVsZV9wYXJhbShtb2RlbTMsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZW0zLCAiMSBtZWFucyAoSVNBKSBib2FyZCAjMyBpcyBhIFJvY2tldE1vZGVtIik7Cittb2R1bGVfcGFyYW0obW9kZW00LCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVtNCwgIjEgbWVhbnMgKElTQSkgYm9hcmQgIzQgaXMgYSBSb2NrZXRNb2RlbSIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBjMTA0XzEsIHVsb25nLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGMxMDRfMSwgInNldCBpbnRlcmZhY2UgdHlwZXMgZm9yIElTQShQQzEwNCkgYm9hcmQgIzEgKGUuZy4gcGMxMDRfMT0yMzIsMjMyLDQ4NSw0ODUsLi4uIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocGMxMDRfMiwgdWxvbmcsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYzEwNF8yLCAic2V0IGludGVyZmFjZSB0eXBlcyBmb3IgSVNBKFBDMTA0KSBib2FyZCAjMiAoZS5nLiBwYzEwNF8yPTIzMiwyMzIsNDg1LDQ4NSwuLi4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwYzEwNF8zLCB1bG9uZywgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjMTA0XzMsICJzZXQgaW50ZXJmYWNlIHR5cGVzIGZvciBJU0EoUEMxMDQpIGJvYXJkICMzIChlLmcuIHBjMTA0XzM9MjMyLDIzMiw0ODUsNDg1LC4uLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBjMTA0XzQsIHVsb25nLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGMxMDRfNCwgInNldCBpbnRlcmZhY2UgdHlwZXMgZm9yIElTQShQQzEwNCkgYm9hcmQgIzQgKGUuZy4gcGMxMDRfND0yMzIsMjMyLDQ4NSw0ODUsLi4uIik7CisKK2ludCBycF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcnBfY2xlYW51cF9tb2R1bGUodm9pZCk7CisKK21vZHVsZV9pbml0KHJwX2luaXQpOworbW9kdWxlX2V4aXQocnBfY2xlYW51cF9tb2R1bGUpOworCisjZW5kaWYKKworI2lmZGVmIE1PRFVMRV9MSUNFTlNFCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGlubGluZSBpbnQgcm9ja2V0X3BhcmFub2lhX2NoZWNrKHN0cnVjdCByX3BvcnQgKmluZm8sCisJCQkJCWNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgUk9DS0VUX1BBUkFOT0lBX0NIRUNLCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMTsKKwlpZiAoaW5mby0+bWFnaWMgIT0gUlBPUlRfTUFHSUMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2FybmluZzogYmFkIG1hZ2ljIG51bWJlciBmb3Igcm9ja2V0cG9ydCBzdHJ1Y3QgaW4gJXNcbiIsCisJCSAgICAgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisKKy8qICBTZXJpYWwgcG9ydCByZWNlaXZlIGRhdGEgZnVuY3Rpb24uICBDYWxsZWQgKGZyb20gdGltZXIgcG9sbCkgd2hlbiBhbiBBSU9QSUMgc2lnbmFscyAKKyAqICB0aGF0IHJlY2VpdmUgZGF0YSBpcyBwcmVzZW50IG9uIGEgc2VyaWFsIHBvcnQuICBQdWxscyBkYXRhIGZyb20gRklGTywgbW92ZXMgaXQgaW50byB0aGUgCisgKiAgdHR5IGxheWVyLiAgCisgKi8KK3N0YXRpYyB2b2lkIHJwX2RvX3JlY2VpdmUoc3RydWN0IHJfcG9ydCAqaW5mbywKKwkJCSAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgQ0hBTk5FTF90ICogY3AsIHVuc2lnbmVkIGludCBDaGFuU3RhdHVzKQoreworCXVuc2lnbmVkIGludCBDaGFyTlN0YXQ7CisJaW50IFRvUmVjdiwgd1JlY3YsIHNwYWNlID0gMCwgY291bnQ7CisJdW5zaWduZWQgY2hhciAqY2J1ZjsKKwljaGFyICpmYnVmOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisKKwlUb1JlY3YgPSBzR2V0UnhDbnQoY3ApOworCWlmIChsZCkKKwkJc3BhY2UgPSBsZC0+cmVjZWl2ZV9yb29tKHR0eSk7CisJaWYgKHNwYWNlID4gMiAqIFRUWV9GTElQQlVGX1NJWkUpCisJCXNwYWNlID0gMiAqIFRUWV9GTElQQlVGX1NJWkU7CisJY2J1ZiA9IHR0eS0+ZmxpcC5jaGFyX2J1ZjsKKwlmYnVmID0gdHR5LT5mbGlwLmZsYWdfYnVmOworCWNvdW50ID0gMDsKKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3JlY2VpdmUoJWQsICVkKS4uLiIsIFRvUmVjdiwgc3BhY2UpOworI2VuZGlmCisKKwkvKgorCSAqIGRldGVybWluZSBob3cgbWFueSB3ZSBjYW4gYWN0dWFsbHkgcmVhZCBpbi4gIElmIHdlIGNhbid0CisJICogcmVhZCBhbnkgaW4gdGhlbiB3ZSBoYXZlIGEgc29mdHdhcmUgb3ZlcnJ1biBjb25kaXRpb24uCisJICovCisJaWYgKFRvUmVjdiA+IHNwYWNlKQorCQlUb1JlY3YgPSBzcGFjZTsKKworCWlmIChUb1JlY3YgPD0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBpZiBzdGF0dXMgaW5kaWNhdGVzIHRoZXJlIGFyZSBlcnJvcmVkIGNoYXJhY3RlcnMgaW4gdGhlCisJICogRklGTywgdGhlbiBlbnRlciBzdGF0dXMgbW9kZSAoYSB3b3JkIGluIEZJRk8gaG9sZHMKKwkgKiBjaGFyYWN0ZXIgYW5kIHN0YXR1cykuCisJICovCisJaWYgKENoYW5TdGF0dXMgJiAoUlhGT1ZFUkZMIHwgUlhCUkVBSyB8IFJYRlJBTUUgfCBSWFBBUklUWSkpIHsKKwkJaWYgKCEoQ2hhblN0YXR1cyAmIFNUQVRNT0RFKSkgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCisJCQlwcmludGsoS0VSTl9JTkZPICJFbnRlcmluZyBTVEFUTU9ERS4uLiIpOworI2VuZGlmCisJCQlDaGFuU3RhdHVzIHw9IFNUQVRNT0RFOworCQkJc0VuUnhTdGF0dXNNb2RlKGNwKTsKKwkJfQorCX0KKworCS8qIAorCSAqIGlmIHdlIHByZXZpb3VzbHkgZW50ZXJlZCBzdGF0dXMgbW9kZSwgdGhlbiByZWFkIGRvd24gdGhlCisJICogRklGTyBvbmUgd29yZCBhdCBhIHRpbWUsIHB1bGxpbmcgYXBhcnQgdGhlIGNoYXJhY3RlciBhbmQKKwkgKiB0aGUgc3RhdHVzLiAgVXBkYXRlIGVycm9yIGNvdW50ZXJzIGRlcGVuZGluZyBvbiBzdGF0dXMKKwkgKi8KKwlpZiAoQ2hhblN0YXR1cyAmIFNUQVRNT0RFKSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSWdub3JlICV4LCByZWFkICV4Li4uIiwgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrLAorCQkgICAgICAgaW5mby0+cmVhZF9zdGF0dXNfbWFzayk7CisjZW5kaWYKKwkJd2hpbGUgKFRvUmVjdikgeworCQkJQ2hhck5TdGF0ID0gc0luVyhzR2V0VHhSeERhdGFJTyhjcCkpOworI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCisJCQlwcmludGsoS0VSTl9JTkZPICIleC4uLiIsIENoYXJOU3RhdCk7CisjZW5kaWYKKwkJCWlmIChDaGFyTlN0YXQgJiBTVE1CUkVBS0gpCisJCQkJQ2hhck5TdGF0ICY9IH4oU1RNRlJBTUVIIHwgU1RNUEFSSVRZSCk7CisJCQlpZiAoQ2hhck5TdGF0ICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKSB7CisJCQkJVG9SZWN2LS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlDaGFyTlN0YXQgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCWlmIChDaGFyTlN0YXQgJiBTVE1CUkVBS0gpCisJCQkJKmZidWYrKyA9IFRUWV9CUkVBSzsKKwkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTVBBUklUWUgpCisJCQkJKmZidWYrKyA9IFRUWV9QQVJJVFk7CisJCQllbHNlIGlmIChDaGFyTlN0YXQgJiBTVE1GUkFNRUgpCisJCQkJKmZidWYrKyA9IFRUWV9GUkFNRTsKKwkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTVJDVlJPVlJIKQorCQkJCSpmYnVmKysgPSBUVFlfT1ZFUlJVTjsKKwkJCWVsc2UKKwkJCQkqZmJ1ZisrID0gMDsKKwkJCSpjYnVmKysgPSBDaGFyTlN0YXQgJiAweGZmOworCQkJY291bnQrKzsKKwkJCVRvUmVjdi0tOworCQl9CisKKwkJLyoKKwkJICogYWZ0ZXIgd2UndmUgZW1wdGllZCB0aGUgRklGTyBpbiBzdGF0dXMgbW9kZSwgdHVybgorCQkgKiBzdGF0dXMgbW9kZSBiYWNrIG9mZgorCQkgKi8KKwkJaWYgKHNHZXRSeENudChjcCkgPT0gMCkgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCisJCQlwcmludGsoS0VSTl9JTkZPICJTdGF0dXMgbW9kZSBvZmYuXG4iKTsKKyNlbmRpZgorCQkJc0Rpc1J4U3RhdHVzTW9kZShjcCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSBhcmVuJ3QgaW4gc3RhdHVzIG1vZGUsIHNvIHJlYWQgZG93biB0aGUgRklGTyB0d28KKwkJICogY2hhcmFjdGVycyBhdCB0aW1lIGJ5IGRvaW5nIHJlcGVhdGVkIHdvcmQgSU8KKwkJICogdHJhbnNmZXIuCisJCSAqLworCQl3UmVjdiA9IFRvUmVjdiA+PiAxOworCQlpZiAod1JlY3YpCisJCQlzSW5TdHJXKHNHZXRUeFJ4RGF0YUlPKGNwKSwgKHVuc2lnbmVkIHNob3J0ICopIGNidWYsIHdSZWN2KTsKKwkJaWYgKFRvUmVjdiAmIDEpCisJCQljYnVmW1RvUmVjdiAtIDFdID0gc0luQihzR2V0VHhSeERhdGFJTyhjcCkpOworCQltZW1zZXQoZmJ1ZiwgMCwgVG9SZWN2KTsKKwkJY2J1ZiArPSBUb1JlY3Y7CisJCWZidWYgKz0gVG9SZWN2OworCQljb3VudCArPSBUb1JlY3Y7CisJfQorCS8qICBQdXNoIHRoZSBkYXRhIHVwIHRvIHRoZSB0dHkgbGF5ZXIgKi8KKwlsZC0+cmVjZWl2ZV9idWYodHR5LCB0dHktPmZsaXAuY2hhcl9idWYsIHR0eS0+ZmxpcC5mbGFnX2J1ZiwgY291bnQpOworCXR0eV9sZGlzY19kZXJlZihsZCk7Cit9CisKKy8qCisgKiAgU2VyaWFsIHBvcnQgdHJhbnNtaXQgZGF0YSBmdW5jdGlvbi4gIENhbGxlZCBmcm9tIHRoZSB0aW1lciBwb2xsaW5nIGxvb3AgYXMgYSAKKyAqICByZXN1bHQgb2YgYSBiaXQgc2V0IGluIHhtaXRfZmxhZ3NbXSwgaW5kaWNhdGluZyBkYXRhIChmcm9tIHRoZSB0dHkgbGF5ZXIpIGlzIHJlYWR5CisgKiAgdG8gYmUgc2VudCBvdXQgdGhlIHNlcmlhbCBwb3J0LiAgRGF0YSBpcyBidWZmZXJlZCBpbiBycF90YWJsZVtsaW5lXS54bWl0X2J1ZiwgaXQgaXMgCisgKiAgbW92ZWQgdG8gdGhlIHBvcnQncyB4bWl0IEZJRk8uICAqaW5mbyBpcyBjcml0aWNhbCBkYXRhLCBwcm90ZWN0ZWQgYnkgc3BpbmxvY2tzLgorICovCitzdGF0aWMgdm9pZCBycF9kb190cmFuc21pdChzdHJ1Y3Qgcl9wb3J0ICppbmZvKQoreworCWludCBjOworCUNIQU5ORUxfdCAqY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3RyYW5zbWl0ICIpOworI2VuZGlmCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisJaWYgKCFpbmZvLT50dHkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgInJwOiBXQVJOSU5HIHJwX2RvX3RyYW5zbWl0IGNhbGxlZCB3aXRoIGluZm8tPnR0eT09TlVMTFxuIik7CisJCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXR0eSA9IGluZm8tPnR0eTsKKwlpbmZvLT54bWl0X2ZpZm9fcm9vbSA9IFRYRklGT19TSVpFIC0gc0dldFR4Q250KGNwKTsKKworCS8qICBMb29wIHNlbmRpbmcgZGF0YSB0byBGSUZPIHVudGlsIGRvbmUgb3IgRklGTyBmdWxsICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpCisJCQlicmVhazsKKwkJYyA9IG1pbihpbmZvLT54bWl0X2ZpZm9fcm9vbSwgbWluKGluZm8tPnhtaXRfY250LCBYTUlUX0JVRl9TSVpFIC0gaW5mby0+eG1pdF90YWlsKSk7CisJCWlmIChjIDw9IDAgfHwgaW5mby0+eG1pdF9maWZvX3Jvb20gPD0gMCkKKwkJCWJyZWFrOworCQlzT3V0U3RyVyhzR2V0VHhSeERhdGFJTyhjcCksICh1bnNpZ25lZCBzaG9ydCAqKSAoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X3RhaWwpLCBjIC8gMik7CisJCWlmIChjICYgMSkKKwkJCXNPdXRCKHNHZXRUeFJ4RGF0YUlPKGNwKSwgaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsICsgYyAtIDFdKTsKKwkJaW5mby0+eG1pdF90YWlsICs9IGM7CisJCWluZm8tPnhtaXRfdGFpbCAmPSBYTUlUX0JVRl9TSVpFIC0gMTsKKwkJaW5mby0+eG1pdF9jbnQgLT0gYzsKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gLT0gYzsKKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCQlwcmludGsoS0VSTl9JTkZPICJ0eCAlZCBjaGFycy4uLiIsIGMpOworI2VuZGlmCisJfQorCisJaWYgKGluZm8tPnhtaXRfY250ID09IDApCisJCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKyNpZmRlZiBST0NLRVRQT1JUX0hBVkVfUE9MTF9XQUlUCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5wb2xsX3dhaXQpOworI2VuZGlmCisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJcHJpbnRrKEtFUk5fSU5GTyAiKCVkLCVkLCVkLCVkKS4uLiIsIGluZm8tPnhtaXRfY250LCBpbmZvLT54bWl0X2hlYWQsCisJICAgICAgIGluZm8tPnhtaXRfdGFpbCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworI2VuZGlmCit9CisKKy8qCisgKiAgQ2FsbGVkIHdoZW4gYSBzZXJpYWwgcG9ydCBzaWduYWxzIGl0IGhhcyByZWFkIGRhdGEgaW4gaXQncyBSWCBGSUZPLgorICogIEl0IGNoZWNrcyB3aGF0IGludGVycnVwdHMgYXJlIHBlbmRpbmcgYW5kIHNlcnZpY2VzIHRoZW0sIGluY2x1ZGluZworICogIHJlY2VpdmluZyBzZXJpYWwgZGF0YS4gIAorICovCitzdGF0aWMgdm9pZCBycF9oYW5kbGVfcG9ydChzdHJ1Y3Qgcl9wb3J0ICppbmZvKQoreworCUNIQU5ORUxfdCAqY3A7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQgSW50TWFzaywgQ2hhblN0YXR1czsKKworCWlmICghaW5mbykKKwkJcmV0dXJuOworCisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9JTklUSUFMSVpFRCkgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJycDogV0FSTklORzogcnBfaGFuZGxlX3BvcnQgY2FsbGVkIHdpdGggaW5mby0+ZmxhZ3MgJiBOT1RfSU5JVFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCFpbmZvLT50dHkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnA6IFdBUk5JTkc6IHJwX2hhbmRsZV9wb3J0IGNhbGxlZCB3aXRoIGluZm8tPnR0eT09TlVMTFxuIik7CisJCXJldHVybjsKKwl9CisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwl0dHkgPSBpbmZvLT50dHk7CisKKwlJbnRNYXNrID0gc0dldENoYW5JbnRJRChjcCkgJiBpbmZvLT5pbnRtYXNrOworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfaW50ZXJydXB0ICUwMnguLi4iLCBJbnRNYXNrKTsKKyNlbmRpZgorCUNoYW5TdGF0dXMgPSBzR2V0Q2hhblN0YXR1cyhjcCk7CisJaWYgKEludE1hc2sgJiBSWEZfVFJJRykgewkvKiBSeCBGSUZPIHRyaWdnZXIgbGV2ZWwgKi8KKwkJcnBfZG9fcmVjZWl2ZShpbmZvLCB0dHksIGNwLCBDaGFuU3RhdHVzKTsKKwl9CisJaWYgKEludE1hc2sgJiBERUxUQV9DRCkgewkvKiBDRCBjaGFuZ2UgICovCisjaWYgKGRlZmluZWQoUk9DS0VUX0RFQlVHX09QRU4pIHx8IGRlZmluZWQoUk9DS0VUX0RFQlVHX0lOVFIpIHx8IGRlZmluZWQoUk9DS0VUX0RFQlVHX0hBTkdVUCkpCisJCXByaW50ayhLRVJOX0lORk8gInR0eVIlZCBDRCBub3cgJXMuLi4iLCBpbmZvLT5saW5lLAorCQkgICAgICAgKENoYW5TdGF0dXMgJiBDRF9BQ1QpID8gIm9uIiA6ICJvZmYiKTsKKyNlbmRpZgorCQlpZiAoIShDaGFuU3RhdHVzICYgQ0RfQUNUKSAmJiBpbmZvLT5jZF9zdGF0dXMpIHsKKyNpZmRlZiBST0NLRVRfREVCVUdfSEFOR1VQCisJCQlwcmludGsoS0VSTl9JTkZPICJDRCBkcm9wLCBjYWxsaW5nIGhhbmd1cC5cbiIpOworI2VuZGlmCisJCQl0dHlfaGFuZ3VwKHR0eSk7CisJCX0KKwkJaW5mby0+Y2Rfc3RhdHVzID0gKENoYW5TdGF0dXMgJiBDRF9BQ1QpID8gMSA6IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwl9CisjaWZkZWYgUk9DS0VUX0RFQlVHX0lOVFIKKwlpZiAoSW50TWFzayAmIERFTFRBX0NUUykgewkvKiBDVFMgY2hhbmdlICovCisJCXByaW50ayhLRVJOX0lORk8gIkNUUyBjaGFuZ2UuLi5cbiIpOworCX0KKwlpZiAoSW50TWFzayAmIERFTFRBX0RTUikgewkvKiBEU1IgY2hhbmdlICovCisJCXByaW50ayhLRVJOX0lORk8gIkRTUiBjaGFuZ2UuLi5cbiIpOworCX0KKyNlbmRpZgorfQorCisvKgorICogIFRoZSB0b3AgbGV2ZWwgcG9sbGluZyByb3V0aW5lLiAgUmVwZWF0cyBldmVyeSAxLzEwMCBIWiAoMTBtcykuCisgKi8KK3N0YXRpYyB2b2lkIHJwX2RvX3BvbGwodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlDT05UUk9MTEVSX3QgKmN0bHA7CisJaW50IGN0cmwsIGFpb3AsIGNoLCBsaW5lLCBpOworCXVuc2lnbmVkIGludCB4bWl0bWFzazsKKwl1bnNpZ25lZCBpbnQgQ3RsTWFzazsKKwl1bnNpZ25lZCBjaGFyIEFpb3BNYXNrOworCVdvcmRfdCBiaXQ7CisKKwkvKiAgV2FsayB0aHJvdWdoIGFsbCB0aGUgYm9hcmRzIChjdHJsJ3MpICovCisJZm9yIChjdHJsID0gMDsgY3RybCA8IG1heF9ib2FyZDsgY3RybCsrKSB7CisJCWlmIChyY2t0cHRfaW9fYWRkcltjdHJsXSA8PSAwKQorCQkJY29udGludWU7CisKKwkJLyogIEdldCBhIHB0ciB0byB0aGUgYm9hcmQncyBjb250cm9sIHN0cnVjdCAqLworCQljdGxwID0gc0N0bE51bVRvQ3RsUHRyKGN0cmwpOworCisJCS8qICBHZXQgdGhlIGludGVydXB0IHN0YXR1cyBmcm9tIHRoZSBib2FyZCAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJaWYgKGN0bHAtPkJ1c1R5cGUgPT0gaXNQQ0kpCisJCQlDdGxNYXNrID0gc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMoY3RscCk7CisJCWVsc2UKKyNlbmRpZgorCQkJQ3RsTWFzayA9IHNHZXRDb250cm9sbGVySW50U3RhdHVzKGN0bHApOworCisJCS8qICBDaGVjayBpZiBhbnkgQUlPUCByZWFkIGJpdHMgYXJlIHNldCAqLworCQlmb3IgKGFpb3AgPSAwOyBDdGxNYXNrOyBhaW9wKyspIHsKKwkJCWJpdCA9IGN0bHAtPkFpb3BJbnRyQml0c1thaW9wXTsKKwkJCWlmIChDdGxNYXNrICYgYml0KSB7CisJCQkJQ3RsTWFzayAmPSB+Yml0OworCQkJCUFpb3BNYXNrID0gc0dldEFpb3BJbnRTdGF0dXMoY3RscCwgYWlvcCk7CisKKwkJCQkvKiAgQ2hlY2sgaWYgYW55IHBvcnQgcmVhZCBiaXRzIGFyZSBzZXQgKi8KKwkJCQlmb3IgKGNoID0gMDsgQWlvcE1hc2s7ICBBaW9wTWFzayA+Pj0gMSwgY2grKykgeworCQkJCQlpZiAoQWlvcE1hc2sgJiAxKSB7CisKKwkJCQkJCS8qICBHZXQgdGhlIGxpbmUgbnVtYmVyICgvZGV2L3R0eVJ4IG51bWJlcikuICovCisJCQkJCQkvKiAgUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBwb3J0LiAqLworCQkJCQkJbGluZSA9IEdldExpbmVOdW1iZXIoY3RybCwgYWlvcCwgY2gpOworCQkJCQkJcnBfaGFuZGxlX3BvcnQocnBfdGFibGVbbGluZV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJeG1pdG1hc2sgPSB4bWl0X2ZsYWdzW2N0cmxdOworCisJCS8qCisJCSAqICB4bWl0X2ZsYWdzIGNvbnRhaW5zIGJpdC1zaWduaWZpY2FudCBmbGFncywgaW5kaWNhdGluZyB0aGVyZSBpcyBkYXRhCisJCSAqICB0byB4bWl0IG9uIHRoZSBwb3J0LiBCaXQgMCBpcyBwb3J0IDAgb24gdGhpcyBib2FyZCwgYml0IDEgaXMgcG9ydCAKKwkJICogIDEsIC4uLiAoMzIgdG90YWwgcG9zc2libGUpLiAgVGhlIHZhcmlhYmxlIGkgaGFzIHRoZSBhaW9wIGFuZCBjaCAKKwkJICogIG51bWJlcnMgZW5jb2RlZCBpbiBpdCAocG9ydCAwLTcgYXJlIGFpb3AwLCA4LTE1IGFyZSBhaW9wMSwgZXRjKS4KKwkJICovCisJCWlmICh4bWl0bWFzaykgeworCQkJZm9yIChpID0gMDsgaSA8IHJvY2tldE1vZGVsW2N0cmxdLm51bVBvcnRzOyBpKyspIHsKKwkJCQlpZiAoeG1pdG1hc2sgJiAoMSA8PCBpKSkgeworCQkJCQlhaW9wID0gKGkgJiAweDE4KSA+PiAzOworCQkJCQljaCA9IGkgJiAweDA3OworCQkJCQlsaW5lID0gR2V0TGluZU51bWJlcihjdHJsLCBhaW9wLCBjaCk7CisJCQkJCXJwX2RvX3RyYW5zbWl0KHJwX3RhYmxlW2xpbmVdKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFJlc2V0IHRoZSB0aW1lciBzbyB3ZSBnZXQgY2FsbGVkIGF0IHRoZSBuZXh0IGNsb2NrIHRpY2sgKDEwbXMpLgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmcnBfbnVtX3BvcnRzX29wZW4pKQorCQltb2RfdGltZXIoJnJvY2tldF90aW1lciwgamlmZmllcyArIFBPTExfUEVSSU9EKTsKK30KKworLyoKKyAqICBJbml0aWFsaXplcyB0aGUgcl9wb3J0IHN0cnVjdHVyZSBmb3IgYSBwb3J0LCBhcyB3ZWxsIGFzIGVuYWJsaW5nIHRoZSBwb3J0IG9uIAorICogIHRoZSBib2FyZC4gIAorICogIElucHV0czogIGJvYXJkLCBhaW9wLCBjaGFuIG51bWJlcnMKKyAqLworc3RhdGljIHZvaWQgaW5pdF9yX3BvcnQoaW50IGJvYXJkLCBpbnQgYWlvcCwgaW50IGNoYW4sIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXVuc2lnbmVkIHJvY2tldE1vZGU7CisJc3RydWN0IHJfcG9ydCAqaW5mbzsKKwlpbnQgbGluZTsKKwlDT05UUk9MTEVSX1QgKmN0bHA7CisKKwkvKiAgR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBsaW5lIG51bWJlciAqLworCWxpbmUgPSBTZXRMaW5lTnVtYmVyKGJvYXJkLCBhaW9wLCBjaGFuKTsKKworCWN0bHAgPSBzQ3RsTnVtVG9DdGxQdHIoYm9hcmQpOworCisJLyogIEdldCBhIHJfcG9ydCBzdHJ1Y3QgZm9yIHRoZSBwb3J0LCBmaWxsIGl0IGluIGFuZCBzYXZlIGl0IGdsb2JhbGx5LCBpbmRleGVkIGJ5IGxpbmUgbnVtYmVyICovCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgcl9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkbid0IGFsbG9jYXRlIGluZm8gc3RydWN0IGZvciBsaW5lICMlZFxuIiwgbGluZSk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZiAoc3RydWN0IHJfcG9ydCkpOworCisJaW5mby0+bWFnaWMgPSBSUE9SVF9NQUdJQzsKKwlpbmZvLT5saW5lID0gbGluZTsKKwlpbmZvLT5jdGxwID0gY3RscDsKKwlpbmZvLT5ib2FyZCA9IGJvYXJkOworCWluZm8tPmFpb3AgPSBhaW9wOworCWluZm8tPmNoYW4gPSBjaGFuOworCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwMDA7CisJaW5mby0+Y2xvc2VfZGVsYXkgPSA1MDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCWluZm8tPmZsYWdzICY9IH5ST0NLRVRfTU9ERV9NQVNLOworCXN3aXRjaCAocGMxMDRbYm9hcmRdW2xpbmVdKSB7CisJY2FzZSA0MjI6CisJCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9NT0RFX1JTNDIyOworCQlicmVhazsKKwljYXNlIDQ4NToKKwkJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX01PREVfUlM0ODU7CisJCWJyZWFrOworCWNhc2UgMjMyOgorCWRlZmF1bHQ6CisJCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9NT0RFX1JTMjMyOworCQlicmVhazsKKwl9CisKKwlpbmZvLT5pbnRtYXNrID0gUlhGX1RSSUcgfCBUWEZJRk9fTVQgfCBTUkNfSU5UIHwgREVMVEFfQ0QgfCBERUxUQV9DVFMgfCBERUxUQV9EU1I7CisJaWYgKHNJbml0Q2hhbihjdGxwLCAmaW5mby0+Y2hhbm5lbCwgYWlvcCwgY2hhbikgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJSb2NrZXRQb3J0IHNJbml0Q2hhbiglZCwgJWQsICVkKSBmYWlsZWQhXG4iLCBib2FyZCwgYWlvcCwgY2hhbik7CisJCWtmcmVlKGluZm8pOworCQlyZXR1cm47CisJfQorCisJcm9ja2V0TW9kZSA9IGluZm8tPmZsYWdzICYgUk9DS0VUX01PREVfTUFTSzsKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfUlRTX1RPR0dMRSkgfHwgKHJvY2tldE1vZGUgPT0gUk9DS0VUX01PREVfUlM0ODUpKQorCQlzRW5SVFNUb2dnbGUoJmluZm8tPmNoYW5uZWwpOworCWVsc2UKKwkJc0Rpc1JUU1RvZ2dsZSgmaW5mby0+Y2hhbm5lbCk7CisKKwlpZiAoY3RscC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSB7CisJCXN3aXRjaCAocm9ja2V0TW9kZSkgeworCQljYXNlIFJPQ0tFVF9NT0RFX1JTNDg1OgorCQkJc1NldEludGVyZmFjZU1vZGUoJmluZm8tPmNoYW5uZWwsIEludGVyZmFjZU1vZGVSUzQ4NSk7CisJCQlicmVhazsKKwkJY2FzZSBST0NLRVRfTU9ERV9SUzQyMjoKKwkJCXNTZXRJbnRlcmZhY2VNb2RlKCZpbmZvLT5jaGFubmVsLCBJbnRlcmZhY2VNb2RlUlM0MjIpOworCQkJYnJlYWs7CisJCWNhc2UgUk9DS0VUX01PREVfUlMyMzI6CisJCWRlZmF1bHQ6CisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfUlRTX1RPR0dMRSkKKwkJCQlzU2V0SW50ZXJmYWNlTW9kZSgmaW5mby0+Y2hhbm5lbCwgSW50ZXJmYWNlTW9kZVJTMjMyVCk7CisJCQllbHNlCisJCQkJc1NldEludGVyZmFjZU1vZGUoJmluZm8tPmNoYW5uZWwsIEludGVyZmFjZU1vZGVSUzIzMik7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+c2xvY2spOworCXNlbWFfaW5pdCgmaW5mby0+d3JpdGVfc2VtLCAxKTsKKwlycF90YWJsZVtsaW5lXSA9IGluZm87CisJaWYgKHBjaV9kZXYpCisJCXR0eV9yZWdpc3Rlcl9kZXZpY2Uocm9ja2V0X2RyaXZlciwgbGluZSwgJnBjaV9kZXYtPmRldik7Cit9CisKKy8qCisgKiAgQ29uZmlndXJlcyBhIHJvY2tldHBvcnQgcG9ydCBhY2NvcmRpbmcgdG8gaXRzIHRlcm1pbyBzZXR0aW5ncy4gIENhbGxlZCBmcm9tIAorICogIHVzZXIgbW9kZSBpbnRvIHRoZSBkcml2ZXIgKGV4Y2VwdGlvbiBoYW5kbGVyKS4gICppbmZvIENEIG1hbmlwdWxhdGlvbiBpcyBzcGlubG9jayBwcm90ZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV9yX3BvcnQoc3RydWN0IHJfcG9ydCAqaW5mbywKKwkJCSAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXVuc2lnbmVkIGNmbGFnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcm9ja2V0TW9kZTsKKwlpbnQgYml0cywgYmF1ZCwgZGl2aXNvcjsKKwlDSEFOTkVMX3QgKmNwOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuOworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBCeXRlIHNpemUgYW5kIHBhcml0eSAqLworCWlmICgoY2ZsYWcgJiBDU0laRSkgPT0gQ1M4KSB7CisJCXNTZXREYXRhOChjcCk7CisJCWJpdHMgPSAxMDsKKwl9IGVsc2UgeworCQlzU2V0RGF0YTcoY3ApOworCQliaXRzID0gOTsKKwl9CisJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCXNTZXRTdG9wMihjcCk7CisJCWJpdHMrKzsKKwl9IGVsc2UgeworCQlzU2V0U3RvcDEoY3ApOworCX0KKworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlzRW5QYXJpdHkoY3ApOworCQliaXRzKys7CisJCWlmIChjZmxhZyAmIFBBUk9ERCkgeworCQkJc1NldE9kZFBhcml0eShjcCk7CisJCX0gZWxzZSB7CisJCQlzU2V0RXZlblBhcml0eShjcCk7CisJCX0KKwl9IGVsc2UgeworCQlzRGlzUGFyaXR5KGNwKTsKKwl9CisKKwkvKiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwlpZiAoIWJhdWQpCisJCWJhdWQgPSA5NjAwOworCWRpdmlzb3IgPSAoKHJwX2JhdWRfYmFzZVtpbmZvLT5ib2FyZF0gKyAoYmF1ZCA+PiAxKSkgLyBiYXVkKSAtIDE7CisJaWYgKChkaXZpc29yID49IDgxOTIgfHwgZGl2aXNvciA8IDApICYmIG9sZF90ZXJtaW9zKSB7CisJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CisJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PQorCQkgICAgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOworCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwkJaWYgKCFiYXVkKQorCQkJYmF1ZCA9IDk2MDA7CisJCWRpdmlzb3IgPSAocnBfYmF1ZF9iYXNlW2luZm8tPmJvYXJkXSAvIGJhdWQpIC0gMTsKKwl9CisJaWYgKGRpdmlzb3IgPj0gODE5MiB8fCBkaXZpc29yIDwgMCkgeworCQliYXVkID0gOTYwMDsKKwkJZGl2aXNvciA9IChycF9iYXVkX2Jhc2VbaW5mby0+Ym9hcmRdIC8gYmF1ZCkgLSAxOworCX0KKwlpbmZvLT5jcHMgPSBiYXVkIC8gYml0czsKKwlzU2V0QmF1ZChjcCwgZGl2aXNvcik7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmludG1hc2sgfD0gREVMVEFfQ1RTOworCQlzRW5DVFNGbG93Q3RsKGNwKTsKKwl9IGVsc2UgeworCQlpbmZvLT5pbnRtYXNrICY9IH5ERUxUQV9DVFM7CisJCXNEaXNDVFNGbG93Q3RsKGNwKTsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKSB7CisJCWluZm8tPmludG1hc2sgJj0gfkRFTFRBX0NEOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpZiAoc0dldENoYW5TdGF0dXMoY3ApICYgQ0RfQUNUKQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMTsKKwkJZWxzZQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMDsKKwkJaW5mby0+aW50bWFzayB8PSBERUxUQV9DRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGJvYXJkCisJICovCisjaWZkZWYgUk9DS0VUX1NPRlRfRkxPVworCWlmIChJX0lYT04oaW5mby0+dHR5KSkgeworCQlzRW5UeFNvZnRGbG93Q3RsKGNwKTsKKwkJaWYgKElfSVhBTlkoaW5mby0+dHR5KSkgeworCQkJc0VuSVhBTlkoY3ApOworCQl9IGVsc2UgeworCQkJc0Rpc0lYQU5ZKGNwKTsKKwkJfQorCQlzU2V0VHhYT05DaGFyKGNwLCBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOworCQlzU2V0VHhYT0ZGQ2hhcihjcCwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCX0gZWxzZSB7CisJCXNEaXNUeFNvZnRGbG93Q3RsKGNwKTsKKwkJc0Rpc0lYQU5ZKGNwKTsKKwkJc0NsclR4WE9GRihjcCk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFNldCB1cCBpZ25vcmUvcmVhZCBtYXNrIHdvcmRzCisJICovCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFNUTVJDVlJPVlJIIHwgMHhGRjsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFNUTUZSQU1FSCB8IFNUTVBBUklUWUg7CisJaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBTVE1CUkVBS0g7CisKKwkvKgorCSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCisJICovCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUTUZSQU1FSCB8IFNUTVBBUklUWUg7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUTUJSRUFLSDsKKwkJLyoKKwkJICogSWYgd2UncmUgaWdub3JpbmcgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLAorCQkgKiBpZ25vcmUgb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUTVJDVlJPVlJIOworCX0KKworCXJvY2tldE1vZGUgPSBpbmZvLT5mbGFncyAmIFJPQ0tFVF9NT0RFX01BU0s7CisKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1JUU19UT0dHTEUpCisJICAgIHx8IChyb2NrZXRNb2RlID09IFJPQ0tFVF9NT0RFX1JTNDg1KSkKKwkJc0VuUlRTVG9nZ2xlKGNwKTsKKwllbHNlCisJCXNEaXNSVFNUb2dnbGUoY3ApOworCisJc1NldFJUUygmaW5mby0+Y2hhbm5lbCk7CisKKwlpZiAoY3AtPkN0bFAtPmJvYXJkVHlwZSA9PSBST0NLRVRfVFlQRV9QQzEwNCkgeworCQlzd2l0Y2ggKHJvY2tldE1vZGUpIHsKKwkJY2FzZSBST0NLRVRfTU9ERV9SUzQ4NToKKwkJCXNTZXRJbnRlcmZhY2VNb2RlKGNwLCBJbnRlcmZhY2VNb2RlUlM0ODUpOworCQkJYnJlYWs7CisJCWNhc2UgUk9DS0VUX01PREVfUlM0MjI6CisJCQlzU2V0SW50ZXJmYWNlTW9kZShjcCwgSW50ZXJmYWNlTW9kZVJTNDIyKTsKKwkJCWJyZWFrOworCQljYXNlIFJPQ0tFVF9NT0RFX1JTMjMyOgorCQlkZWZhdWx0OgorCQkJaWYgKGluZm8tPmZsYWdzICYgUk9DS0VUX1JUU19UT0dHTEUpCisJCQkJc1NldEludGVyZmFjZU1vZGUoY3AsIEludGVyZmFjZU1vZGVSUzIzMlQpOworCQkJZWxzZQorCQkJCXNTZXRJbnRlcmZhY2VNb2RlKGNwLCBJbnRlcmZhY2VNb2RlUlMyMzIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qICBpbmZvLT5jb3VudCBpcyBjb25zaWRlcmVkIGNyaXRpY2FsLCBwcm90ZWN0ZWQgYnkgc3BpbmxvY2tzLiAgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgc3RydWN0IHJfcG9ydCAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgcmV0dmFsOworCWludCBkb19jbG9jYWwgPSAwLCBleHRyYV9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworCSAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9IVVBfTk9USUZZKSA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCWlmIChpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9IVVBfTk9USUZZKSA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBST0NLRVRfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKgorCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lIGZyZWUuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0IHJwX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIAorICAgICAgICAgKiBXZSByZXN0b3JlIGl0IHVwb24gZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0lORk8gImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eVIlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKyNpZmRlZiBST0NLRVRfRElTQUJMRV9TSU1VU0FHRQorCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9OT1JNQUxfQUNUSVZFOworI2Vsc2UKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJZXh0cmFfY291bnQgPSAxOworCQlpbmZvLT5jb3VudC0tOworCX0KKyNlbmRpZgorCWluZm8tPmJsb2NrZWRfb3BlbisrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICgxKSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworCQkJc1NldERUUigmaW5mby0+Y2hhbm5lbCk7CisJCQlzU2V0UlRTKCZpbmZvLT5jaGFubmVsKTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKGluZm8tPmZsYWdzICYgUk9DS0VUX0lOSVRJQUxJWkVEKSkgeworCQkJaWYgKGluZm8tPmZsYWdzICYgUk9DS0VUX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKSAmJiAoZG9fY2xvY2FsIHx8IChzR2V0Q2hhblN0YXR1c0xvKCZpbmZvLT5jaGFubmVsKSAmIENEX0FDVCkpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCQlwcmludGsoS0VSTl9JTkZPICJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eVIlZCwgY291bnQgPSAlZCwgZmxhZ3M9MHglMHhcbiIsCisJCSAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQsIGluZm8tPmZsYWdzKTsKKyNlbmRpZgorCQlzY2hlZHVsZSgpOwkvKiAgRG9uJ3QgaG9sZCBzcGlubG9jayBoZXJlLCB3aWxsIGhhbmcgUEMgKi8KKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoZXh0cmFfY291bnQpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eVIlZCwgY291bnQgPSAlZFxuIiwKKwkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpbmZvLT5mbGFncyB8PSBST0NLRVRfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBFeGNlcHRpb24gaGFuZGxlciB0aGF0IG9wZW5zIGEgc2VyaWFsIHBvcnQuICBDcmVhdGVzIHhtaXRfYnVmIHN0b3JhZ2UsIGZpbGxzIGluIAorICogIHBvcnQncyByX3BvcnQgc3RydWN0LiAgSW5pdGlhbGl6ZXMgdGhlIHBvcnQgaGFyZHdhcmUuICAKKyAqLworc3RhdGljIGludCBycF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCByX3BvcnQgKmluZm87CisJaW50IGxpbmUgPSAwLCByZXR2YWw7CisJQ0hBTk5FTF90ICpjcDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlsaW5lID0gVFRZX0dFVF9MSU5FKHR0eSk7CisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTUFYX1JQX1BPUlRTKSB8fCAoKGluZm8gPSBycF90YWJsZVtsaW5lXSkgPT0gTlVMTCkpCisJCXJldHVybiAtRU5YSU87CisKKwlwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9IVVBfTk9USUZZKSA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCX0KKworCS8qCisJICogV2UgbXVzdCBub3Qgc2xlZXAgZnJvbSBoZXJlIHVudGlsIHRoZSBwb3J0IGlzIG1hcmtlZCBmdWxseSBpbiB1c2UuCisJICovCisJaWYgKGluZm8tPnhtaXRfYnVmKQorCQlmcmVlX3BhZ2UocGFnZSk7CisJZWxzZQorCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisKKwlpZiAoaW5mby0+Y291bnQrKyA9PSAwKSB7CisJCWF0b21pY19pbmMoJnJwX251bV9wb3J0c19vcGVuKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJCXByaW50ayhLRVJOX0lORk8gInJvY2tldCBtb2QrKyA9ICVkLi4uIiwgYXRvbWljX3JlYWQoJnJwX251bV9wb3J0c19vcGVuKSk7CisjZW5kaWYKKwl9CisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJycF9vcGVuIHR0eVIlZCwgY291bnQ9JWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCisJLyoKKwkgKiBJbmZvLT5jb3VudCBpcyBub3cgMTsgc28gaXQncyBzYWZlIHRvIHNsZWVwIG5vdy4KKwkgKi8KKwlpbmZvLT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOworCWluZm8tPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOworCisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9JTklUSUFMSVpFRCkgPT0gMCkgeworCQljcCA9ICZpbmZvLT5jaGFubmVsOworCQlzU2V0UnhUcmlnZ2VyKGNwLCBUUklHXzEpOworCQlpZiAoc0dldENoYW5TdGF0dXMoY3ApICYgQ0RfQUNUKQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMTsKKwkJZWxzZQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMDsKKwkJc0Rpc1J4U3RhdHVzTW9kZShjcCk7CisJCXNGbHVzaFJ4RklGTyhjcCk7CisJCXNGbHVzaFR4RklGTyhjcCk7CisKKwkJc0VuSW50ZXJydXB0cyhjcCwgKFRYSU5UX0VOIHwgTUNJTlRfRU4gfCBSWElOVF9FTiB8IFNSQ0lOVF9FTiB8IENIQU5JTlRfRU4pKTsKKwkJc1NldFJ4VHJpZ2dlcihjcCwgVFJJR18xKTsKKworCQlzR2V0Q2hhblN0YXR1cyhjcCk7CisJCXNEaXNSeFN0YXR1c01vZGUoY3ApOworCQlzQ2xyVHhYT0ZGKGNwKTsKKworCQlzRGlzQ1RTRmxvd0N0bChjcCk7CisJCXNEaXNUeFNvZnRGbG93Q3RsKGNwKTsKKworCQlzRW5SeEZJRk8oY3ApOworCQlzRW5UcmFuc21pdChjcCk7CisKKwkJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX0lOSVRJQUxJWkVEOworCisJCS8qCisJCSAqIFNldCB1cCB0aGUgdHR5LT5hbHRfc3BlZWQga2x1ZGdlCisJCSAqLworCQlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9WSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9TSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9XQVJQKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisKKwkJY29uZmlndXJlX3JfcG9ydChpbmZvLCBOVUxMKTsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSB7CisJCQlzU2V0RFRSKGNwKTsKKwkJCXNTZXRSVFMoY3ApOworCQl9CisJfQorCS8qICBTdGFydHMgKG9yIHJlc2V0cykgdGhlIG1haW50IHBvbGxpbmcgbG9vcCAqLworCW1vZF90aW1lcigmcm9ja2V0X3RpbWVyLCBqaWZmaWVzICsgUE9MTF9QRVJJT0QpOworCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJCXByaW50ayhLRVJOX0lORk8gInJwX29wZW4gcmV0dXJuaW5nIGFmdGVyIGJsb2NrX3RpbF9yZWFkeSB3aXRoICVkXG4iLCByZXR2YWwpOworI2VuZGlmCisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIEV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgY2xvc2VzIGEgc2VyaWFsIHBvcnQuIGluZm8tPmNvdW50IGlzIGNvbnNpZGVyZWQgY3JpdGljYWwuIAorICovCitzdGF0aWMgdm9pZCBycF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0aW1lb3V0OworCUNIQU5ORUxfdCAqY3A7CisJCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfY2xvc2UiKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJycF9jbG9zZSB0dHlSJWQsIGNvdW50ID0gJWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCisJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCisJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5UiVkOiAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAwOworCX0KKwlpZiAoaW5mby0+Y291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvLT5mbGFncyB8PSBST0NLRVRfQ0xPU0lORzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCS8qCisJICogTm90aWZ5IHRoZSBsaW5lIGRpc2NwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycworCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisKKwkvKgorCSAqIElmIHRyYW5zbWlzc2lvbiB3YXMgdGhyb3R0bGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0LAorCSAqIGp1c3QgZmx1c2ggdGhlIHhtaXQgYnVmZmVyLgorCSAqLworCWlmICh0dHktPmZsb3dfc3RvcHBlZCkKKwkJcnBfZmx1c2hfYnVmZmVyKHR0eSk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXIKKwkgKi8KKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IFJPQ0tFVF9DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQorCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJICovCisJdGltZW91dCA9IChzR2V0VHhDbnQoY3ApICsgMSkgKiBIWiAvIGluZm8tPmNwczsKKwlpZiAodGltZW91dCA9PSAwKQorCQl0aW1lb3V0ID0gMTsKKwlycF93YWl0X3VudGlsX3NlbnQodHR5LCB0aW1lb3V0KTsKKwljbGVhcl9iaXQoKGluZm8tPmFpb3AgKiA4KSArIGluZm8tPmNoYW4sICh2b2lkICopICZ4bWl0X2ZsYWdzW2luZm8tPmJvYXJkXSk7CisKKwlzRGlzVHJhbnNtaXQoY3ApOworCXNEaXNJbnRlcnJ1cHRzKGNwLCAoVFhJTlRfRU4gfCBNQ0lOVF9FTiB8IFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgQ0hBTklOVF9FTikpOworCXNEaXNDVFNGbG93Q3RsKGNwKTsKKwlzRGlzVHhTb2Z0Rmxvd0N0bChjcCk7CisJc0NsclR4WE9GRihjcCk7CisJc0ZsdXNoUnhGSUZPKGNwKTsKKwlzRmx1c2hUeEZJRk8oY3ApOworCXNDbHJSVFMoY3ApOworCWlmIChDX0hVUENMKHR0eSkpCisJCXNDbHJEVFIoY3ApOworCisJaWYgKFRUWV9EUklWRVJfRkxVU0hfQlVGRkVSX0VYSVNUUyh0dHkpKQorCQlUVFlfRFJJVkVSX0ZMVVNIX0JVRkZFUih0dHkpOworCQkKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJCX0KKwl9CisJaW5mby0+ZmxhZ3MgJj0gfihST0NLRVRfSU5JVElBTElaRUQgfCBST0NLRVRfQ0xPU0lORyB8IFJPQ0tFVF9OT1JNQUxfQUNUSVZFKTsKKwl0dHktPmNsb3NpbmcgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJYXRvbWljX2RlYygmcnBfbnVtX3BvcnRzX29wZW4pOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJyb2NrZXQgbW9kLS0gPSAlZC4uLiIsIGF0b21pY19yZWFkKCZycF9udW1fcG9ydHNfb3BlbikpOworCXByaW50ayhLRVJOX0lORk8gInJwX2Nsb3NlIHR0eVIlZCBjb21wbGV0ZSBzaHV0ZG93blxuIiwgaW5mby0+bGluZSk7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBycF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgY2ZsYWc7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9zZXRfdGVybWlvcyIpKQorCQlyZXR1cm47CisKKwljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCWlmIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlzIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgQ1M1IG9yIENTNgorCSAqLworCWlmICgoKGNmbGFnICYgQ1NJWkUpID09IENTNSkgfHwgKChjZmxhZyAmIENTSVpFKSA9PSBDUzYpKQorCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkgICAgKChjZmxhZyAmIH5DU0laRSkgfCAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkpOworCisJY29uZmlndXJlX3JfcG9ydChpbmZvLCBvbGRfdGVybWlvcyk7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlzQ2xyRFRSKGNwKTsKKwkJc0NsclJUUyhjcCk7CisJfQorCisJLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkKKwkJCXNTZXRSVFMoY3ApOworCQlzU2V0RFRSKGNwKTsKKwl9CisKKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlycF9zdGFydCh0dHkpOworCX0KK30KKworc3RhdGljIHZvaWQgcnBfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9icmVhayIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCXNTZW5kQnJlYWsoJmluZm8tPmNoYW5uZWwpOworCWVsc2UKKwkJc0NsckJyZWFrKCZpbmZvLT5jaGFubmVsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvKgorICogc0dldENoYW5SSSB1c2VkIHRvIGJlIGEgbWFjcm8gaW4gcm9ja2V0X2ludC5oLiBXaGVuIHRoZSBmdW5jdGlvbmFsaXR5IGZvcgorICogdGhlIFVQQ0kgYm9hcmRzIHdhcyBhZGRlZCwgaXQgd2FzIGRlY2lkZWQgdG8gbWFrZSB0aGlzIGEgZnVuY3Rpb24gYmVjYXVzZQorICogdGhlIG1hY3JvIHdhcyBnZXR0aW5nIHRvbyBjb21wbGljYXRlZC4gQWxsIGNhc2VzIGV4Y2VwdCB0aGUgZmlyc3Qgb25lCisgKiAoVVBDSVJpbmdJbmQpIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBvcmlnaW5hbCBtYWNyby4KKyAqLworc3RhdGljIGludCBzR2V0Q2hhblJJKENIQU5ORUxfVCAqIENoUCkKK3sKKwlDT05UUk9MTEVSX3QgKkN0bFAgPSBDaFAtPkN0bFA7CisJaW50IENoYW5OdW0gPSBDaFAtPkNoYW5OdW07CisJaW50IFJpbmdJbmQgPSAwOworCisJaWYgKEN0bFAtPlVQQ0lSaW5nSW5kKQorCQlSaW5nSW5kID0gIShzSW5CKEN0bFAtPlVQQ0lSaW5nSW5kKSAmIHNCaXRNYXBTZXRUYmxbQ2hhbk51bV0pOworCWVsc2UgaWYgKEN0bFAtPkFsdENoYW5SaW5nSW5kaWNhdG9yKQorCQlSaW5nSW5kID0gc0luQigoQnl0ZUlPX3QpIChDaFAtPkNoYW5TdGF0ICsgOCkpICYgRFNSX0FDVDsKKwllbHNlIGlmIChDdGxQLT5ib2FyZFR5cGUgPT0gUk9DS0VUX1RZUEVfUEMxMDQpCisJCVJpbmdJbmQgPSAhKHNJbkIoQ3RsUC0+QWlvcElPWzNdKSAmIHNCaXRNYXBTZXRUYmxbQ2hhbk51bV0pOworCisJcmV0dXJuIFJpbmdJbmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBIZXJlIGFyZSB0aGUgcm91dGluZXMgdXNlZCBieSBycF9pb2N0bC4gIFRoZXNlIGFyZSBhbGwgY2FsbGVkIGZyb20gZXhjZXB0aW9uIGhhbmRsZXJzLiAgKi8KKworLyoKKyAqICBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgc2VyaWFsIG1vZGVtIGNvbnRyb2wgbGluZXMuICBUaGVzZSBuZXh0IDIgZnVuY3Rpb25zIAorICogIGFyZSB0aGUgd2F5IGtlcm5lbCB2ZXJzaW9ucyA+IDIuNSBoYW5kbGUgbW9kZW0gY29udHJvbCBsaW5lcyByYXRoZXIgdGhhbiBJT0NUTHMuCisgKi8KK3N0YXRpYyBpbnQgcnBfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY29udHJvbCwgcmVzdWx0LCBDaGFuU3RhdHVzOworCisJQ2hhblN0YXR1cyA9IHNHZXRDaGFuU3RhdHVzTG8oJmluZm8tPmNoYW5uZWwpOworCWNvbnRyb2wgPSBpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXTsKKwlyZXN1bHQgPSAoKGNvbnRyb2wgJiBTRVRfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwgCisJCSgoY29udHJvbCAmIFNFVF9EVFIpID8gIFRJT0NNX0RUUiA6IDApIHwKKwkJKChDaGFuU3RhdHVzICYgQ0RfQUNUKSA/IFRJT0NNX0NBUiA6IDApIHwKKwkJKHNHZXRDaGFuUkkoJmluZm8tPmNoYW5uZWwpID8gVElPQ01fUk5HIDogMCkgfAorCQkoKENoYW5TdGF0dXMgJiBEU1JfQUNUKSA/IFRJT0NNX0RTUiA6IDApIHwKKwkJKChDaGFuU3RhdHVzICYgQ1RTX0FDVCkgPyBUSU9DTV9DVFMgOiAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIAorICogIFNldHMgdGhlIG1vZGVtIGNvbnRyb2wgbGluZXMKKyAqLworc3RhdGljIGludCBycF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJaW5mby0+Y2hhbm5lbC5UeENvbnRyb2xbM10gfD0gU0VUX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXSB8PSBTRVRfRFRSOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJaW5mby0+Y2hhbm5lbC5UeENvbnRyb2xbM10gJj0gflNFVF9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXSAmPSB+U0VUX0RUUjsKKworCXNPdXREVyhpbmZvLT5jaGFubmVsLkluZGV4QWRkciwgKihEV29yZF90ICopICYgKGluZm8tPmNoYW5uZWwuVHhDb250cm9sWzBdKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbmZpZyhzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X2NvbmZpZyBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHJvY2tldF9jb25maWcgdG1wOworCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mICh0bXApKTsKKwl0bXAubGluZSA9IGluZm8tPmxpbmU7CisJdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisJdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisJdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKKwl0bXAucG9ydCA9IHJja3RwdF9pb19hZGRyWyhpbmZvLT5saW5lID4+IDUpICYgM107CisKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZiAoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbmZpZyhzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X2NvbmZpZyBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCByb2NrZXRfY29uZmlnIG5ld19zZXJpYWw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YgKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJeworCQlpZiAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+Uk9DS0VUX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+Uk9DS0VUX1VTUl9NQVNLKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5ST0NLRVRfVVNSX01BU0spIHwgKG5ld19zZXJpYWwuZmxhZ3MgJiBST0NLRVRfVVNSX01BU0spKTsKKwkJY29uZmlndXJlX3JfcG9ydChpbmZvLCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgflJPQ0tFVF9GTEFHUykgfCAobmV3X3NlcmlhbC5mbGFncyAmIFJPQ0tFVF9GTEFHUykpOworCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheTsKKwlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdDsKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfU1BEX01BU0spID09IFJPQ0tFVF9TUERfSEkpCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9WSEkpCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfU1BEX01BU0spID09IFJPQ0tFVF9TUERfU0hJKQorCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX1dBUlApCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworCisJY29uZmlndXJlX3JfcG9ydChpbmZvLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIGEgcm9ja2V0X3BvcnRzIHN0cnVjdCB3aXRoIGluZm9ybWF0aW9uCisgKiAgYWJvdXQgd2hhdCBib2FyZHMvcG9ydHMgYXJlIGluIHRoZSBzeXN0ZW0uICBUaGlzIGluZm8gaXMgcGFzc2VkCisgKiAgdG8gdXNlciBzcGFjZS4gIFNlZSBzZXRyb2NrZXQuYyB3aGVyZSB0aGUgaW5mbyBpcyB1c2VkIHRvIGNyZWF0ZQorICogIHRoZSAvZGV2L3R0eVJ4IHBvcnRzLgorICovCitzdGF0aWMgaW50IGdldF9wb3J0cyhzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X3BvcnRzIF9fdXNlciAqcmV0cG9ydHMpCit7CisJc3RydWN0IHJvY2tldF9wb3J0cyB0bXA7CisJaW50IGJvYXJkOworCisJaWYgKCFyZXRwb3J0cykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZiAodG1wKSk7CisJdG1wLnR0eV9tYWpvciA9IHJvY2tldF9kcml2ZXItPm1ham9yOworCisJZm9yIChib2FyZCA9IDA7IGJvYXJkIDwgNDsgYm9hcmQrKykgeworCQl0bXAucm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsID0gcm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsOworCQlzdHJjcHkodG1wLnJvY2tldE1vZGVsW2JvYXJkXS5tb2RlbFN0cmluZywgcm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsU3RyaW5nKTsKKwkJdG1wLnJvY2tldE1vZGVsW2JvYXJkXS5udW1Qb3J0cyA9IHJvY2tldE1vZGVsW2JvYXJkXS5udW1Qb3J0czsKKwkJdG1wLnJvY2tldE1vZGVsW2JvYXJkXS5sb2Fkcm0yID0gcm9ja2V0TW9kZWxbYm9hcmRdLmxvYWRybTI7CisJCXRtcC5yb2NrZXRNb2RlbFtib2FyZF0uc3RhcnRpbmdQb3J0TnVtYmVyID0gcm9ja2V0TW9kZWxbYm9hcmRdLnN0YXJ0aW5nUG9ydE51bWJlcjsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihyZXRwb3J0cywgJnRtcCwgc2l6ZW9mICgqcmV0cG9ydHMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzZXRfcm0yKHN0cnVjdCByX3BvcnQgKmluZm8sIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJlc2V0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXNldCwgYXJnLCBzaXplb2YgKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocmVzZXQpCisJCXJlc2V0ID0gMTsKKworCWlmIChyY2t0cHRfdHlwZVtpbmZvLT5ib2FyZF0gIT0gUk9DS0VUX1RZUEVfTU9ERU1JSSAmJgorICAgICAgICAgICAgcmNrdHB0X3R5cGVbaW5mby0+Ym9hcmRdICE9IFJPQ0tFVF9UWVBFX01PREVNSUlJKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbmZvLT5jdGxwLT5CdXNUeXBlID09IGlzSVNBKQorCQlzTW9kZW1SZXNldChpbmZvLT5jdGxwLCBpbmZvLT5jaGFuLCByZXNldCk7CisJZWxzZQorCQlzUENJTW9kZW1SZXNldChpbmZvLT5jdGxwLCBpbmZvLT5jaGFuLCByZXNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdmVyc2lvbihzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X3ZlcnNpb24gX191c2VyICpyZXR2ZXJzKQoreworCWlmIChjb3B5X3RvX3VzZXIocmV0dmVycywgJmRyaXZlcl92ZXJzaW9uLCBzaXplb2YgKCpyZXR2ZXJzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiAgSU9DVEwgY2FsbCBoYW5kbGVyIGludG8gdGhlIGRyaXZlciAqLworc3RhdGljIGludCBycF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNtZCAhPSBSQ0tQX0dFVF9QT1JUUyAmJiByb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX2lvY3RsIikpCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkNLUF9HRVRfU1RSVUNUOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGluZm8sIHNpemVvZiAoc3RydWN0IHJfcG9ydCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgUkNLUF9HRVRfQ09ORklHOgorCQlyZXR1cm4gZ2V0X2NvbmZpZyhpbmZvLCBhcmdwKTsKKwljYXNlIFJDS1BfU0VUX0NPTkZJRzoKKwkJcmV0dXJuIHNldF9jb25maWcoaW5mbywgYXJncCk7CisJY2FzZSBSQ0tQX0dFVF9QT1JUUzoKKwkJcmV0dXJuIGdldF9wb3J0cyhpbmZvLCBhcmdwKTsKKwljYXNlIFJDS1BfUkVTRVRfUk0yOgorCQlyZXR1cm4gcmVzZXRfcm0yKGluZm8sIGFyZ3ApOworCWNhc2UgUkNLUF9HRVRfVkVSU0lPTjoKKwkJcmV0dXJuIGdldF92ZXJzaW9uKGluZm8sIGFyZ3ApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBycF9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3NlbmRfeGNoYXIiKSkKKwkJcmV0dXJuOworCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwlpZiAoc0dldFR4Q250KGNwKSkKKwkJc1dyaXRlVHhQcmlvQnl0ZShjcCwgY2gpOworCWVsc2UKKwkJc1dyaXRlVHhCeXRlKHNHZXRUeFJ4RGF0YUlPKGNwKSwgY2gpOworfQorCitzdGF0aWMgdm9pZCBycF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfVEhST1RUTEUKKwlwcmludGsoS0VSTl9JTkZPICJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHktPm5hbWUsCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF90aHJvdHRsZSIpKQorCQlyZXR1cm47CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXJwX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisKKwlzQ2xyUlRTKCZpbmZvLT5jaGFubmVsKTsKK30KKworc3RhdGljIHZvaWQgcnBfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1RIUk9UVExFCisJcHJpbnRrKEtFUk5fSU5GTyAidW50aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHktPm5hbWUsCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF90aHJvdHRsZSIpKQorCQlyZXR1cm47CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXJwX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCisJc1NldFJUUygmaW5mby0+Y2hhbm5lbCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJwX3N0b3AoKSBhbmQgcnBfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnBfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX0ZMT1cKKwlwcmludGsoS0VSTl9JTkZPICJzdG9wICVzOiAlZCAlZC4uLi5cbiIsIHR0eS0+bmFtZSwKKwkgICAgICAgaW5mby0+eG1pdF9jbnQsIGluZm8tPnhtaXRfZmlmb19yb29tKTsKKyNlbmRpZgorCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfc3RvcCIpKQorCQlyZXR1cm47CisKKwlpZiAoc0dldFR4Q250KCZpbmZvLT5jaGFubmVsKSkKKwkJc0Rpc1RyYW5zbWl0KCZpbmZvLT5jaGFubmVsKTsKK30KKworc3RhdGljIHZvaWQgcnBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19GTE9XCisJcHJpbnRrKEtFUk5fSU5GTyAic3RhcnQgJXM6ICVkICVkLi4uLlxuIiwgdHR5LT5uYW1lLAorCSAgICAgICBpbmZvLT54bWl0X2NudCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9zdG9wIikpCisJCXJldHVybjsKKworCXNFblRyYW5zbWl0KCZpbmZvLT5jaGFubmVsKTsKKwlzZXRfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLAorCQkodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworfQorCisvKgorICogcnBfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CisgKi8KK3N0YXRpYyB2b2lkIHJwX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlDSEFOTkVMX3QgKmNwOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzOworCWludCBjaGVja190aW1lLCBleGl0X3RpbWU7CisJaW50IHR4Y250OworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworI2lmZGVmIFJPQ0tFVF9ERUJVR19XQUlUX1VOVElMX1NFTlQKKwlwcmludGsoS0VSTl9JTkZPICJJbiBSUF93YWl0X3VudGlsX3NlbnQoJWQpIChqaWZmPSVsdSkuLi4iLCB0aW1lb3V0LAorCSAgICAgICBqaWZmaWVzKTsKKwlwcmludGsoS0VSTl9JTkZPICJjcHM9JWQuLi4iLCBpbmZvLT5jcHMpOworI2VuZGlmCisJd2hpbGUgKDEpIHsKKwkJdHhjbnQgPSBzR2V0VHhDbnQoY3ApOworCQlpZiAoIXR4Y250KSB7CisJCQlpZiAoc0dldENoYW5TdGF0dXNMbyhjcCkgJiBUWFNIUk1UKQorCQkJCWJyZWFrOworCQkJY2hlY2tfdGltZSA9IChIWiAvIGluZm8tPmNwcykgLyA1OworCQl9IGVsc2UgeworCQkJY2hlY2tfdGltZSA9IEhaICogdHhjbnQgLyBpbmZvLT5jcHM7CisJCX0KKwkJaWYgKHRpbWVvdXQpIHsKKwkJCWV4aXRfdGltZSA9IG9yaWdfamlmZmllcyArIHRpbWVvdXQgLSBqaWZmaWVzOworCQkJaWYgKGV4aXRfdGltZSA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGV4aXRfdGltZSA8IGNoZWNrX3RpbWUpCisJCQkJY2hlY2tfdGltZSA9IGV4aXRfdGltZTsKKwkJfQorCQlpZiAoY2hlY2tfdGltZSA9PSAwKQorCQkJY2hlY2tfdGltZSA9IDE7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCQlwcmludGsoS0VSTl9JTkZPICJ0eGNudCA9ICVkIChqaWZmPSVsdSxjaGVjaz0lZCkuLi4iLCB0eGNudCwgamlmZmllcywgY2hlY2tfdGltZSk7CisjZW5kaWYKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGVja190aW1lKSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKyNpZmRlZiBST0NLRVRfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisJcHJpbnRrKEtFUk5fSU5GTyAidHhjbnQgPSAlZCAoamlmZj0lbHUpLi4uZG9uZVxuIiwgdHhjbnQsIGppZmZpZXMpOworI2VuZGlmCit9CisKKy8qCisgKiBycF9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCitzdGF0aWMgdm9pZCBycF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlDSEFOTkVMX3QgKmNwOworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfaGFuZ3VwIikpCisJCXJldHVybjsKKworI2lmIChkZWZpbmVkKFJPQ0tFVF9ERUJVR19PUEVOKSB8fCBkZWZpbmVkKFJPQ0tFVF9ERUJVR19IQU5HVVApKQorCXByaW50ayhLRVJOX0lORk8gInJwX2hhbmd1cCBvZiB0dHlSJWQuLi4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCXJwX2ZsdXNoX2J1ZmZlcih0dHkpOworCWlmIChpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKQorCQlyZXR1cm47CisJaWYgKGluZm8tPmNvdW50KSAKKwkJYXRvbWljX2RlYygmcnBfbnVtX3BvcnRzX29wZW4pOworCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCWluZm8tPmNvdW50ID0gMDsKKwlpbmZvLT5mbGFncyAmPSB+Uk9DS0VUX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJc0Rpc1J4RklGTyhjcCk7CisJc0Rpc1RyYW5zbWl0KGNwKTsKKwlzRGlzSW50ZXJydXB0cyhjcCwgKFRYSU5UX0VOIHwgTUNJTlRfRU4gfCBSWElOVF9FTiB8IFNSQ0lOVF9FTiB8IENIQU5JTlRfRU4pKTsKKwlzRGlzQ1RTRmxvd0N0bChjcCk7CisJc0Rpc1R4U29mdEZsb3dDdGwoY3ApOworCXNDbHJUeFhPRkYoY3ApOworCWluZm8tPmZsYWdzICY9IH5ST0NLRVRfSU5JVElBTElaRUQ7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiAgRXhjZXB0aW9uIGhhbmRsZXIgLSB3cml0ZSBjaGFyIHJvdXRpbmUuICBUaGUgUm9ja2V0UG9ydCBkcml2ZXIgdXNlcyBhCisgKiAgZG91YmxlLWJ1ZmZlcmluZyBzdHJhdGVneSwgd2l0aCB0aGUgdHdpc3QgdGhhdCBpZiB0aGUgaW4tbWVtb3J5IENQVQorICogIGJ1ZmZlciBpcyBlbXB0eSwgYW5kIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIHRyYW5zbWl0IEZJRk8sIHRoZQorICogIHdyaXRpbmcgcm91dGluZXMgd2lsbCB3cml0ZSBkaXJlY3RseSB0byB0cmFuc21pdCBGSUZPLgorICogIFdyaXRlIGJ1ZmZlciBhbmQgY291bnRlcnMgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrcworICovCitzdGF0aWMgdm9pZCBycF9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCS8qICBHcmFiIHRoZSBwb3J0IHdyaXRlIHNlbWFwaG9yZSwgbG9ja2luZyBvdXQgb3RoZXIgcHJvY2Vzc2VzIHRoYXQgdHJ5IHRvIHdyaXRlIHRvIHRoaXMgcG9ydCAqLworCWRvd24oJmluZm8tPndyaXRlX3NlbSk7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKKwlwcmludGsoS0VSTl9JTkZPICJycF9wdXRfY2hhciAlYy4uLiIsIGNoKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCWlmICghdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYgaW5mby0+eG1pdF9maWZvX3Jvb20gPT0gMCkKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gPSBUWEZJRk9fU0laRSAtIHNHZXRUeENudChjcCk7CisKKwlpZiAodHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fCBpbmZvLT54bWl0X2ZpZm9fcm9vbSA9PSAwIHx8IGluZm8tPnhtaXRfY250ICE9IDApIHsKKwkJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisJCWluZm8tPnhtaXRfaGVhZCAmPSBYTUlUX0JVRl9TSVpFIC0gMTsKKwkJaW5mby0+eG1pdF9jbnQrKzsKKwkJc2V0X2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKwl9IGVsc2UgeworCQlzT3V0QihzR2V0VHhSeERhdGFJTyhjcCksIGNoKTsKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20tLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl1cCgmaW5mby0+d3JpdGVfc2VtKTsKK30KKworLyoKKyAqICBFeGNlcHRpb24gaGFuZGxlciAtIHdyaXRlIHJvdXRpbmUsIGNhbGxlZCB3aGVuIHVzZXIgYXBwIHdyaXRlcyB0byB0aGUgZGV2aWNlLgorICogIEEgcGVyIHBvcnQgd3JpdGUgc2VtYXBob3JlIGlzIHVzZWQgdG8gcHJvdGVjdCBmcm9tIGFub3RoZXIgcHJvY2VzcyB3cml0aW5nIHRvCisgKiAgdGhpcyBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIG90aGVyIHByb2Nlc3MgY291bGQgYmUgcnVubmluZyBvbiB0aGUgb3RoZXIgQ1BVCisgKiAgb3IgZ2V0IGNvbnRyb2wgb2YgdGhlIENQVSBpZiB0aGUgY29weV9mcm9tX3VzZXIoKSBibG9ja3MgZHVlIHRvIGEgcGFnZSBmYXVsdCAoc3dhcHBlZCBvdXQpLiAKKyAqICBTcGlubG9ja3MgcHJvdGVjdCB0aGUgaW5mbyB4bWl0IG1lbWJlcnMuCisgKi8KK3N0YXRpYyBpbnQgcnBfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYjsKKwlpbnQgYywgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNvdW50IDw9IDAgfHwgcm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF93cml0ZSIpKQorCQlyZXR1cm4gMDsKKworCWRvd25faW50ZXJydXB0aWJsZSgmaW5mby0+d3JpdGVfc2VtKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQorCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlICVkIGNoYXJzLi4uIiwgY291bnQpOworI2VuZGlmCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCWlmICghdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYgaW5mby0+eG1pdF9maWZvX3Jvb20gPCBjb3VudCkKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gPSBUWEZJRk9fU0laRSAtIHNHZXRUeENudChjcCk7CisKKyAgICAgICAgLyoKKwkgKiAgSWYgdGhlIHdyaXRlIHF1ZXVlIGZvciB0aGUgcG9ydCBpcyBlbXB0eSwgYW5kIHRoZXJlIGlzIEZJRk8gc3BhY2UsIHN0dWZmIGJ5dGVzIAorCSAqICBpbnRvIEZJRk8uICBVc2UgdGhlIHdyaXRlIHF1ZXVlIGZvciB0ZW1wIHN0b3JhZ2UuCisgICAgICAgICAqLworCWlmICghdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYgaW5mby0+eG1pdF9jbnQgPT0gMCAmJiBpbmZvLT54bWl0X2ZpZm9fcm9vbSA+IDApIHsKKwkJYyA9IG1pbihjb3VudCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworCQliID0gYnVmOworCisJCS8qICBQdXNoIGRhdGEgaW50byBGSUZPLCAyIGJ5dGVzIGF0IGEgdGltZSAqLworCQlzT3V0U3RyVyhzR2V0VHhSeERhdGFJTyhjcCksICh1bnNpZ25lZCBzaG9ydCAqKSBiLCBjIC8gMik7CisKKwkJLyogIElmIHRoZXJlIGlzIGEgYnl0ZSByZW1haW5pbmcsIHdyaXRlIGl0ICovCisJCWlmIChjICYgMSkKKwkJCXNPdXRCKHNHZXRUeFJ4RGF0YUlPKGNwKSwgYltjIC0gMV0pOworCisJCXJldHZhbCArPSBjOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gLT0gYzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBJZiBjb3VudCBpcyB6ZXJvLCB3ZSB3cm90ZSBpdCBhbGwgYW5kIGFyZSBkb25lICovCisJaWYgKCFjb3VudCkKKwkJZ290byBlbmQ7CisKKwkvKiAgV3JpdGUgcmVtYWluaW5nIGRhdGEgaW50byB0aGUgcG9ydCdzIHhtaXRfYnVmICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKGluZm8tPnR0eSA9PSAwKQkvKiAgIFNlZW1pbmdseSBvYmxpZ2F0b3J5IGNoZWNrLi4uICovCisJCQlnb3RvIGVuZDsKKworCQljID0gbWluKGNvdW50LCBtaW4oWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwgWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisKKwkJYiA9IGJ1ZjsKKwkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBiLCBjKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+eG1pdF9oZWFkID0KKwkJICAgIChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChYTUlUX0JVRl9TSVpFIC0gMSk7CisJCWluZm8tPnhtaXRfY250ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXJldHZhbCArPSBjOworCX0KKworCWlmICgocmV0dmFsID4gMCkgJiYgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKQorCQlzZXRfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCQorZW5kOgorIAlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKyAJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworI2lmZGVmIFJPQ0tFVFBPUlRfSEFWRV9QT0xMX1dBSVQKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl9CisJdXAoJmluZm8tPndyaXRlX3NlbSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgc2VudC4gIFdlIGVzdGltYXRlCisgKiBvbmx5IHVzaW5nIHRoZSBpbi1tZW1vcnkgdHJhbnNtaXQgYnVmZmVyIG9ubHksIGFuZCBpZ25vcmUgdGhlCisgKiBwb3RlbnRpYWwgc3BhY2UgaW4gdGhlIHRyYW5zbWl0IEZJRk8uCisgKi8KK3N0YXRpYyBpbnQgcnBfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF93cml0ZV9yb29tIikpCisJCXJldHVybiAwOworCisJcmV0ID0gWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKyNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKKwlwcmludGsoS0VSTl9JTkZPICJycF93cml0ZV9yb29tIHJldHVybnMgJWQuLi4iLCByZXQpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlci4gIEFnYWluLCB0aGlzIG9ubHkKKyAqIGNvdW50cyB0aG9zZSBjaGFyYWN0ZXJzIGluIHRoZSBpbi1tZW1vcnkgdHJhbnNtaXQgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHJwX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX1dSSVRFCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2hhcnNfaW5fYnVmZmVyIHJldHVybnMgJWQuLi4iLCBpbmZvLT54bWl0X2NudCk7CisjZW5kaWYKKwlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Cit9CisKKy8qCisgKiAgRmx1c2hlcyB0aGUgVFggZmlmbyBmb3IgYSBwb3J0LCBkZWxldGVzIGRhdGEgaW4gdGhlIHhtaXRfYnVmIHN0b3JlZCBpbiB0aGUKKyAqICByX3BvcnQgc3RydWN0IGZvciB0aGUgcG9ydC4gIE5vdGUgdGhhdCBzcGlubG9jayBhcmUgdXNlZCB0byBwcm90ZWN0IGluZm8gbWVtYmVycywKKyAqICBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHRoZSBzcGlubG9jayBpcyBhbHJlYWR5IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIHJwX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKyNpZmRlZiBST0NLRVRQT1JUX0hBVkVfUE9MTF9XQUlUCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl0dHlfd2FrZXVwKHR0eSk7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCXNGbHVzaFR4RklGTyhjcCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisKKy8qCisgKiAgQ2FsbGVkIHdoZW4gYSBQQ0kgY2FyZCBpcyBmb3VuZC4gIFJldHJpZXZlcyBhbmQgc3RvcmVzIG1vZGVsIGluZm9ybWF0aW9uLAorICogIGluaXQncyBhaW9waWMgYW5kIHNlcmlhbCBwb3J0IGhhcmR3YXJlLgorICogIElucHV0czogIGkgaXMgdGhlIGJvYXJkIG51bWJlciAoMC1uKQorICovCitfX2luaXQgaW50IHJlZ2lzdGVyX1BDSShpbnQgaSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgbnVtX2Fpb3BzLCBhaW9wLCBtYXhfbnVtX2Fpb3BzLCBudW1fY2hhbiwgY2hhbjsKKwl1bnNpZ25lZCBpbnQgYWlvcGlvW01BWF9BSU9QU19QRVJfQk9BUkRdOworCWNoYXIgKnN0ciwgKmJvYXJkX3R5cGU7CisJQ09OVFJPTExFUl90ICpjdGxwOworCisJaW50IGZhc3RfY2xvY2sgPSAwOworCWludCBhbHRDaGFuUmluZ0luZGljYXRvciA9IDA7CisJaW50IHBvcnRzX3Blcl9haW9wID0gODsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjbGFzc19yZXY7CisJV29yZElPX3QgQ29uZmlnSU8gPSAwOworCUJ5dGVJT190IFVQQ0lSaW5nSW5kID0gMDsKKworCWlmICghZGV2IHx8IHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJcmNrdHB0X2lvX2FkZHJbaV0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlyZXQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOworCisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9JTkZPICIgIEVycm9yIGR1cmluZyByZWdpc3Rlcl9QQ0koKSwgdW5hYmxlIHRvIHJlYWQgY29uZmlnIGR3b3JkIFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTk9STUFMOworCXJvY2tldE1vZGVsW2ldLmxvYWRybTIgPSAwOworCXJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciA9IG5leHRMaW5lTnVtYmVyOworCisJLyogIERlcGVuZGluZyBvbiB0aGUgbW9kZWwsIHNldCB1cCBzb21lIGNvbmZpZyB2YXJpYWJsZXMgKi8KKwlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQNFFVQUQ6CisJCXN0ciA9ICJRdWFkY2FibGUiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA0OworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQNFFVQUQ7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgNCBwb3J0IHcvcXVhZCBjYWJsZSIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDQ7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDhPQ1RBOgorCQlzdHIgPSAiT2N0YWNhYmxlIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlA4T0NUQTsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA4IHBvcnQgdy9vY3RhIGNhYmxlIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDhPQ1RBOgorCQlzdHIgPSAiT2N0YWNhYmxlIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfVVBDSV9SUDhPQ1RBOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFVQQ0kgOCBwb3J0IHcvb2N0YSBjYWJsZSIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDhJTlRGOgorCQlzdHIgPSAiOCI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQOElOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDhJTlRGOgorCQlzdHIgPSAiOCI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1VQQ0lfUlA4SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBVUENJIDggcG9ydCB3L2V4dGVybmFsIEkvRiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDhKOgorCQlzdHIgPSAiOEoiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDhKOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDggcG9ydCB3L1JKMTEgY29ubmVjdG9ycyIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDRKOgorCQlzdHIgPSAiNEoiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA0OworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQNEo7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgNCBwb3J0IHcvUko0NSBjb25uZWN0b3JzIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQOFNOSToKKwkJc3RyID0gIjggKERCNzggQ3VzdG9tKSI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQOFNOSTsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA4IHBvcnQgdy8gY3VzdG9tIERCNzgiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA4OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlAxNlNOSToKKwkJc3RyID0gIjE2IChEQjc4IEN1c3RvbSkiOworCQltYXhfbnVtX2Fpb3BzID0gMjsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDE2U05JOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDE2IHBvcnQgdy8gY3VzdG9tIERCNzgiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQMTZJTlRGOgorCQlzdHIgPSAiMTYiOworCQltYXhfbnVtX2Fpb3BzID0gMjsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDE2SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gMTY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9VUlAxNklOVEY6CisJCXN0ciA9ICIxNiI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1VQQ0lfUlAxNklOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgVVBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gMTY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9DUlAxNklOVEY6CisJCXN0ciA9ICIxNiI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX0NQQ0lfUlAxNklOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgQ29tcGFjdCBQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDE2OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlAzMklOVEY6CisJCXN0ciA9ICIzMiI7CisJCW1heF9udW1fYWlvcHMgPSA0OworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQMzJJTlRGOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDMyIHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDMySU5URjoKKwkJc3RyID0gIjMyIjsKKwkJbWF4X251bV9haW9wcyA9IDQ7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfVVBDSV9SUDMySU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBVUENJIDMyIHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQUDQ6CisJCXN0ciA9ICJQbHVzIFF1YWRjYWJsZSI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCWFsdENoYW5SaW5nSW5kaWNhdG9yKys7CisJCWZhc3RfY2xvY2srKzsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUFA0OworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFBsdXMgNCBwb3J0Iik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQUDg6CisJCXN0ciA9ICJQbHVzIE9jdGFjYWJsZSI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCWFsdENoYW5SaW5nSW5kaWNhdG9yKys7CisJCWZhc3RfY2xvY2srKzsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUFA4OworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFBsdXMgOCBwb3J0Iik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQMl8yMzI6CisJCXN0ciA9ICJQbHVzIDIgKFJTLTIzMikiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSAyOworCQlhbHRDaGFuUmluZ0luZGljYXRvcisrOworCQlmYXN0X2Nsb2NrKys7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlAyXzIzMjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBQbHVzIDIgcG9ydCBSUzIzMiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDJfNDIyOgorCQlzdHIgPSAiUGx1cyAyIChSUy00MjIpIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXBvcnRzX3Blcl9haW9wID0gMjsKKwkJYWx0Q2hhblJpbmdJbmRpY2F0b3IrKzsKKwkJZmFzdF9jbG9jaysrOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQMl80MjI7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgUGx1cyAyIHBvcnQgUlM0MjIiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlA2TToKKworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA2OworCQlzdHIgPSAiNi1wb3J0IjsKKworCQkvKiAgSWYgY2xhc3NfcmV2IGlzIDEsIHRoZSByb2NrZXRtb2RlbSBmbGFzaCBtdXN0IGJlIGxvYWRlZC4gIElmIGl0IGlzIDIgaXQgaXMgYSAic29ja2V0ZWQiIHZlcnNpb24uICovCisJCWlmICgoY2xhc3NfcmV2ICYgMHhGRikgPT0gMSkgeworCQkJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9NT0RFTUlJOworCQkJcm9ja2V0TW9kZWxbaV0ubG9hZHJtMiA9IDE7CisJCX0gZWxzZSB7CisJCQlyY2t0cHRfdHlwZVtpXSA9IFJPQ0tFVF9UWVBFX01PREVNOworCQl9CisKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDZNOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSA2IHBvcnQiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA2OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlA0TToKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXBvcnRzX3Blcl9haW9wID0gNDsKKwkJc3RyID0gIjQtcG9ydCI7CisJCWlmICgoY2xhc3NfcmV2ICYgMHhGRikgPT0gMSkgeworCQkJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9NT0RFTUlJOworCQkJcm9ja2V0TW9kZWxbaV0ubG9hZHJtMiA9IDE7CisJCX0gZWxzZSB7CisJCQlyY2t0cHRfdHlwZVtpXSA9IFJPQ0tFVF9UWVBFX01PREVNOworCQl9CisKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDRNOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSA0IHBvcnQiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHIgPSAiKHVua25vd24vdW5zdXBwb3J0ZWQpIjsKKwkJbWF4X251bV9haW9wcyA9IDA7CisJCWJyZWFrOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIFVQQ0kgYm9hcmRzLgorCSAqLworCisJc3dpdGNoIChkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9VUlAzMklOVEY6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDhJTlRGOgorCWNhc2UgUENJX0RFVklDRV9JRF9VUlAxNklOVEY6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NSUDE2SU5URjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfVVJQOE9DVEE6CisJCXJja3RwdF9pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMik7CisJCUNvbmZpZ0lPID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCWlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1VSUDhPQ1RBKSB7CisJCQlVUENJUmluZ0luZCA9IHJja3RwdF9pb19hZGRyW2ldICsgX1BDSV85MDMwX1JJTkdfSU5EOworCisJCQkvKgorCQkJICogQ2hlY2sgZm9yIG9jdGEgb3IgcXVhZCBjYWJsZS4KKwkJCSAqLworCQkJaWYgKCEKKwkJCSAgICAoc0luVyhDb25maWdJTyArIF9QQ0lfOTAzMF9HUElPX0NUUkwpICYKKwkJCSAgICAgUENJX0dQSU9fQ1RSTF84UE9SVCkpIHsKKwkJCQlzdHIgPSAiUXVhZGNhYmxlIjsKKwkJCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCQkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA0OworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9VUENJX1JNM184UE9SVDoKKwkJc3RyID0gIjggcG9ydHMiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9VUENJX1JNM184UE9SVDsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0TW9kZW0gSUlJIDggcG9ydCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCXJja3RwdF9pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMik7CisJCVVQQ0lSaW5nSW5kID0gcmNrdHB0X2lvX2FkZHJbaV0gKyBfUENJXzkwMzBfUklOR19JTkQ7CisJCUNvbmZpZ0lPID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTU9ERU1JSUk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9VUENJX1JNM180UE9SVDoKKwkJc3RyID0gIjQgcG9ydHMiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9VUENJX1JNM180UE9SVDsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0TW9kZW0gSUlJIDQgcG9ydCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDQ7CisJCXJja3RwdF9pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMik7CisJCVVQQ0lSaW5nSW5kID0gcmNrdHB0X2lvX2FkZHJbaV0gKyBfUENJXzkwMzBfUklOR19JTkQ7CisJCUNvbmZpZ0lPID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTU9ERU1JSUk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmNrdHB0X3R5cGVbaV0pIHsKKwljYXNlIFJPQ0tFVF9UWVBFX01PREVNOgorCQlib2FyZF90eXBlID0gIlJvY2tldE1vZGVtIjsKKwkJYnJlYWs7CisJY2FzZSBST0NLRVRfVFlQRV9NT0RFTUlJOgorCQlib2FyZF90eXBlID0gIlJvY2tldE1vZGVtIElJIjsKKwkJYnJlYWs7CisJY2FzZSBST0NLRVRfVFlQRV9NT0RFTUlJSToKKwkJYm9hcmRfdHlwZSA9ICJSb2NrZXRNb2RlbSBJSUkiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlib2FyZF90eXBlID0gIlJvY2tldFBvcnQiOworCQlicmVhazsKKwl9CisKKwlpZiAoZmFzdF9jbG9jaykgeworCQlzQ2xvY2tQcmVzY2FsZSA9IDB4MTI7CS8qIG1vZCAyIChkaXZpZGUgYnkgMykgKi8KKwkJcnBfYmF1ZF9iYXNlW2ldID0gOTIxNjAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHN1cHBvcnRfbG93X3NwZWVkIGlzIHNldCwgdXNlIHRoZSBzbG93IGNsb2NrCisJCSAqIHByZXNjYWxlLCB3aGljaCBzdXBwb3J0cyA1MCBicHMKKwkJICovCisJCWlmIChzdXBwb3J0X2xvd19zcGVlZCkgeworCQkJLyogbW9kIDkgKGRpdmlkZSBieSAxMCkgcHJlc2NhbGUgKi8KKwkJCXNDbG9ja1ByZXNjYWxlID0gMHgxOTsKKwkJCXJwX2JhdWRfYmFzZVtpXSA9IDIzMDQwMDsKKwkJfSBlbHNlIHsKKwkJCS8qIG1vZCA0IChkZXZpZGUgYnkgNSkgcHJlc2NhbGUgKi8KKwkJCXNDbG9ja1ByZXNjYWxlID0gMHgxNDsKKwkJCXJwX2JhdWRfYmFzZVtpXSA9IDQ2MDgwMDsKKwkJfQorCX0KKworCWZvciAoYWlvcCA9IDA7IGFpb3AgPCBtYXhfbnVtX2Fpb3BzOyBhaW9wKyspCisJCWFpb3Bpb1thaW9wXSA9IHJja3RwdF9pb19hZGRyW2ldICsgKGFpb3AgKiAweDQwKTsKKwljdGxwID0gc0N0bE51bVRvQ3RsUHRyKGkpOworCW51bV9haW9wcyA9IHNQQ0lJbml0Q29udHJvbGxlcihjdGxwLCBpLCBhaW9waW8sIG1heF9udW1fYWlvcHMsIENvbmZpZ0lPLCAwLCBGUkVRX0RJUywgMCwgYWx0Q2hhblJpbmdJbmRpY2F0b3IsIFVQQ0lSaW5nSW5kKTsKKwlmb3IgKGFpb3AgPSAwOyBhaW9wIDwgbWF4X251bV9haW9wczsgYWlvcCsrKQorCQljdGxwLT5BaW9wTnVtQ2hhblthaW9wXSA9IHBvcnRzX3Blcl9haW9wOworCisJcHJpbnRrKCJDb210cm9sIFBDSSBjb250cm9sbGVyICMlZCBJRCAweCV4IGZvdW5kIGluIGJ1czpzbG90OmZuICVzIGF0IGFkZHJlc3MgJTA0bHgsICIKKwkgICAgICIlZCBBSU9QKHMpICglcylcbiIsIGksIGRldi0+ZGV2aWNlLCBwY2lfbmFtZShkZXYpLAorCSAgICAgcmNrdHB0X2lvX2FkZHJbaV0sIG51bV9haW9wcywgcm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcpOworCXByaW50ayhLRVJOX0lORk8gIkluc3RhbGxpbmcgJXMsIGNyZWF0aW5nIC9kZXYvdHR5UiVkIC0gJWxkXG4iLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywKKwkgICAgICAgcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5zdGFydGluZ1BvcnROdW1iZXIgKworCSAgICAgICByb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyAtIDEpOworCisJaWYgKG51bV9haW9wcyA8PSAwKSB7CisJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisJaXNfUENJW2ldID0gMTsKKworCS8qICBSZXNldCB0aGUgQUlPUElDLCBpbml0IHRoZSBzZXJpYWwgcG9ydHMgKi8KKwlmb3IgKGFpb3AgPSAwOyBhaW9wIDwgbnVtX2Fpb3BzOyBhaW9wKyspIHsKKwkJc1Jlc2V0QWlvcEJ5TnVtKGN0bHAsIGFpb3ApOworCQludW1fY2hhbiA9IHBvcnRzX3Blcl9haW9wOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCWluaXRfcl9wb3J0KGksIGFpb3AsIGNoYW4sIGRldik7CisJfQorCisJLyogIFJvY2tldCBtb2RlbXMgbXVzdCBiZSByZXNldCAqLworCWlmICgocmNrdHB0X3R5cGVbaV0gPT0gUk9DS0VUX1RZUEVfTU9ERU0pIHx8CisJICAgIChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTUlJKSB8fAorCSAgICAocmNrdHB0X3R5cGVbaV0gPT0gUk9DS0VUX1RZUEVfTU9ERU1JSUkpKSB7CisJCW51bV9jaGFuID0gcG9ydHNfcGVyX2Fpb3A7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJc1BDSU1vZGVtUmVzZXQoY3RscCwgY2hhbiwgMSk7CisJCW1kZWxheSg1MDApOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCXNQQ0lNb2RlbVJlc2V0KGN0bHAsIGNoYW4sIDApOworCQltZGVsYXkoNTAwKTsKKwkJcm1TcGVha2VyUmVzZXQoY3RscCwgcm9ja2V0TW9kZWxbaV0ubW9kZWwpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogIFByb2JlcyBmb3IgUENJIGNhcmRzLCBpbml0cyB0aGVtIGlmIGZvdW5kCisgKiAgSW5wdXQ6ICAgYm9hcmRfZm91bmQgPSBudW1iZXIgb2YgSVNBIGJvYXJkcyBhbHJlYWR5IGZvdW5kLCBvciB0aGUKKyAqICAgICAgICAgICBzdGFydGluZyBib2FyZCBudW1iZXIKKyAqICBSZXR1cm5zOiBOdW1iZXIgb2YgUENJIGJvYXJkcyBmb3VuZAorICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X1BDSShpbnQgYm9hcmRzX2ZvdW5kKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCBjb3VudCA9IDA7CisKKwkvKiAgV29yayB0aHJvdWdoIHRoZSBQQ0kgZGV2aWNlIGxpc3QsIHB1bGxpbmcgb3V0IG91cnMgKi8KKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1JQLCBQQ0lfQU5ZX0lELCBkZXYpKSkgeworCQlpZiAocmVnaXN0ZXJfUENJKGNvdW50ICsgYm9hcmRzX2ZvdW5kLCBkZXYpKQorCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIChjb3VudCk7Cit9CisKKyNlbmRpZgkJCQkvKiBDT05GSUdfUENJICovCisKKy8qCisgKiAgUHJvYmVzIGZvciBJU0EgY2FyZHMKKyAqICBJbnB1dDogICBpID0gdGhlIGJvYXJkIG51bWJlciB0byBsb29rIGZvcgorICogIFJldHVybnM6IDEgaWYgYm9hcmQgZm91bmQsIDAgZWxzZQorICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X0lTQShpbnQgaSkKK3sKKwlpbnQgbnVtX2Fpb3BzLCBudW1fY2hhbiA9IDAsIHRvdGFsX251bV9jaGFuID0gMDsKKwlpbnQgYWlvcCwgY2hhbjsKKwl1bnNpZ25lZCBpbnQgYWlvcGlvW01BWF9BSU9QU19QRVJfQk9BUkRdOworCUNPTlRST0xMRVJfdCAqY3RscDsKKwljaGFyICp0eXBlX3N0cmluZzsKKworCS8qICBJZiBpb19hZGRyIGlzIHplcm8sIG5vIGJvYXJkIGNvbmZpZ3VyZWQgKi8KKwlpZiAocmNrdHB0X2lvX2FkZHJbaV0gPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCS8qICBSZXNlcnZlIHRoZSBJTyByZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCwgIkNvbXRyb2wgUm9ja2V0UG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byByZXNlcnZlIElPIHJlZ2lvbiBmb3IgY29uZmlndXJlZCBJU0EgUm9ja2V0UG9ydCBhdCBhZGRyZXNzIDB4JWx4LCBib2FyZCBub3QgaW5zdGFsbGVkLi4uXG4iLCByY2t0cHRfaW9fYWRkcltpXSk7CisJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwljdGxwID0gc0N0bE51bVRvQ3RsUHRyKGkpOworCisJY3RscC0+Ym9hcmRUeXBlID0gcmNrdHB0X3R5cGVbaV07CisKKwlzd2l0Y2ggKHJja3RwdF90eXBlW2ldKSB7CisJY2FzZSBST0NLRVRfVFlQRV9QQzEwNDoKKwkJdHlwZV9zdHJpbmcgPSAiKFBDMTA0KSI7CisJCWJyZWFrOworCWNhc2UgUk9DS0VUX1RZUEVfTU9ERU06CisJCXR5cGVfc3RyaW5nID0gIihSb2NrZXRNb2RlbSkiOworCQlicmVhazsKKwljYXNlIFJPQ0tFVF9UWVBFX01PREVNSUk6CisJCXR5cGVfc3RyaW5nID0gIihSb2NrZXRNb2RlbSBJSSkiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eXBlX3N0cmluZyA9ICIiOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHN1cHBvcnRfbG93X3NwZWVkIGlzIHNldCwgdXNlIHRoZSBzbG93IGNsb2NrIHByZXNjYWxlLAorCSAqIHdoaWNoIHN1cHBvcnRzIDUwIGJwcworCSAqLworCWlmIChzdXBwb3J0X2xvd19zcGVlZCkgeworCQlzQ2xvY2tQcmVzY2FsZSA9IDB4MTk7CS8qIG1vZCA5IChkaXZpZGUgYnkgMTApIHByZXNjYWxlICovCisJCXJwX2JhdWRfYmFzZVtpXSA9IDIzMDQwMDsKKwl9IGVsc2UgeworCQlzQ2xvY2tQcmVzY2FsZSA9IDB4MTQ7CS8qIG1vZCA0IChkZXZpZGUgYnkgNSkgcHJlc2NhbGUgKi8KKwkJcnBfYmF1ZF9iYXNlW2ldID0gNDYwODAwOworCX0KKworCWZvciAoYWlvcCA9IDA7IGFpb3AgPCBNQVhfQUlPUFNfUEVSX0JPQVJEOyBhaW9wKyspCisJCWFpb3Bpb1thaW9wXSA9IHJja3RwdF9pb19hZGRyW2ldICsgKGFpb3AgKiAweDQwMCk7CisKKwludW1fYWlvcHMgPSBzSW5pdENvbnRyb2xsZXIoY3RscCwgaSwgY29udHJvbGxlciArIChpICogMHg0MDApLCBhaW9waW8sICBNQVhfQUlPUFNfUEVSX0JPQVJELCAwLCBGUkVRX0RJUywgMCk7CisKKwlpZiAoY3RscC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSB7CisJCXNFbkFpb3AoY3RscCwgMik7CS8qIG9ubHkgb25lIEFJT1BJQywgYnV0IHRoZXNlICovCisJCXNFbkFpb3AoY3RscCwgMyk7CS8qIENTZWxzIHVzZWQgZm9yIG90aGVyIHN0dWZmICovCisJfQorCisJLyogIElmIHNvbWV0aGluZyB3ZW50IHdyb25nIGluaXRpbmcgdGhlIEFJT1AncyByZWxlYXNlIHRoZSBJU0EgSU8gbWVtb3J5ICovCisJaWYgKG51bV9haW9wcyA8PSAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCk7CisJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisgIAorCXJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciA9IG5leHRMaW5lTnVtYmVyOworCisJZm9yIChhaW9wID0gMDsgYWlvcCA8IG51bV9haW9wczsgYWlvcCsrKSB7CisJCXNSZXNldEFpb3BCeU51bShjdGxwLCBhaW9wKTsKKwkJc0VuQWlvcChjdGxwLCBhaW9wKTsKKwkJbnVtX2NoYW4gPSBzR2V0QWlvcE51bUNoYW4oY3RscCwgYWlvcCk7CisJCXRvdGFsX251bV9jaGFuICs9IG51bV9jaGFuOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCWluaXRfcl9wb3J0KGksIGFpb3AsIGNoYW4sIE5VTEwpOworCX0KKwlpc19QQ0lbaV0gPSAwOworCWlmICgocmNrdHB0X3R5cGVbaV0gPT0gUk9DS0VUX1RZUEVfTU9ERU0pIHx8IChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTUlJKSkgeworCQludW1fY2hhbiA9IHNHZXRBaW9wTnVtQ2hhbihjdGxwLCAwKTsKKwkJdG90YWxfbnVtX2NoYW4gPSBudW1fY2hhbjsKKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG51bV9jaGFuOyBjaGFuKyspCisJCQlzTW9kZW1SZXNldChjdGxwLCBjaGFuLCAxKTsKKwkJbWRlbGF5KDUwMCk7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJc01vZGVtUmVzZXQoY3RscCwgY2hhbiwgMCk7CisJCW1kZWxheSg1MDApOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSBJU0EiKTsKKwl9IGVsc2UgeworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IElTQSIpOworCX0KKwlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IHRvdGFsX251bV9jaGFuOworCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfSVNBOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUm9ja2V0UG9ydCBJU0EgY2FyZCAjJWQgZm91bmQgYXQgMHglbHggLSAlZCBBSU9QcyAlc1xuIiwgCisJICAgICAgIGksIHJja3RwdF9pb19hZGRyW2ldLCBudW1fYWlvcHMsIHR5cGVfc3RyaW5nKTsKKworCXByaW50ayhLRVJOX0lORk8gIkluc3RhbGxpbmcgJXMsIGNyZWF0aW5nIC9kZXYvdHR5UiVkIC0gJWxkXG4iLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywKKwkgICAgICAgcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5zdGFydGluZ1BvcnROdW1iZXIgKworCSAgICAgICByb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyAtIDEpOworCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByb2NrZXRfb3BzID0geworCS5vcGVuID0gcnBfb3BlbiwKKwkuY2xvc2UgPSBycF9jbG9zZSwKKwkud3JpdGUgPSBycF93cml0ZSwKKwkucHV0X2NoYXIgPSBycF9wdXRfY2hhciwKKwkud3JpdGVfcm9vbSA9IHJwX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHJwX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gcnBfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IHJwX2lvY3RsLAorCS50aHJvdHRsZSA9IHJwX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcnBfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBycF9zZXRfdGVybWlvcywKKwkuc3RvcCA9IHJwX3N0b3AsCisJLnN0YXJ0ID0gcnBfc3RhcnQsCisJLmhhbmd1cCA9IHJwX2hhbmd1cCwKKwkuYnJlYWtfY3RsID0gcnBfYnJlYWssCisJLnNlbmRfeGNoYXIgPSBycF9zZW5kX3hjaGFyLAorCS53YWl0X3VudGlsX3NlbnQgPSBycF93YWl0X3VudGlsX3NlbnQsCisJLnRpb2NtZ2V0ID0gcnBfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gcnBfdGlvY21zZXQsCit9OworCisvKgorICogVGhlIG1vZHVsZSAic3RhcnR1cCIgcm91dGluZTsgaXQncyBydW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZC4KKyAqLworaW50IF9faW5pdCBycF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCwgcGNpX2JvYXJkc19mb3VuZCwgaXNhX2JvYXJkc19mb3VuZCwgaTsKKworCXByaW50ayhLRVJOX0lORk8gIlJvY2tldFBvcnQgZGV2aWNlIGRyaXZlciBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iLAorCSAgICAgICBST0NLRVRfVkVSU0lPTiwgUk9DS0VUX0RBVEUpOworCisJcm9ja2V0X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX1JQX1BPUlRTKTsKKwlpZiAoIXJvY2tldF9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHRpbWVyIGNoYW5uZWwuCisJICovCisJaW5pdF90aW1lcigmcm9ja2V0X3RpbWVyKTsKKwlyb2NrZXRfdGltZXIuZnVuY3Rpb24gPSBycF9kb19wb2xsOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhcnJheSBvZiBwb2ludGVycyB0byBvdXIgb3duIGludGVybmFsIHN0YXRlCisJICogc3RydWN0dXJlcy4KKwkgKi8KKwltZW1zZXQocnBfdGFibGUsIDAsIHNpemVvZiAocnBfdGFibGUpKTsKKwltZW1zZXQoeG1pdF9mbGFncywgMCwgc2l6ZW9mICh4bWl0X2ZsYWdzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JQX1BPUlRTOyBpKyspCisJCWxpbmVOdW1iZXJzW2ldID0gMDsKKwluZXh0TGluZU51bWJlciA9IDA7CisJbWVtc2V0KHJvY2tldE1vZGVsLCAwLCBzaXplb2YgKHJvY2tldE1vZGVsKSk7CisKKwkvKgorCSAqICBJZiBib2FyZCAxIGlzIG5vbi16ZXJvLCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgSVNBIGNvbmZpZ3VyZWQuICBJZiBjb250cm9sbGVyIGlzIAorCSAqICB6ZXJvLCB1c2UgdGhlIGRlZmF1bHQgY29udHJvbGxlciBJTyBhZGRyZXNzIG9mIGJvYXJkMSArIDB4NDAuCisJICovCisJaWYgKGJvYXJkMSkgeworCQlpZiAoY29udHJvbGxlciA9PSAwKQorCQkJY29udHJvbGxlciA9IGJvYXJkMSArIDB4NDA7CisJfSBlbHNlIHsKKwkJY29udHJvbGxlciA9IDA7ICAvKiAgVXNlZCBhcyBhIGZsYWcsIG1lYW5pbmcgbm8gSVNBIGJvYXJkcyAqLworCX0KKworCS8qICBJZiBhbiBJU0EgY2FyZCBpcyBjb25maWd1cmVkLCByZXNlcnZlIHRoZSA0IGJ5dGUgSU8gc3BhY2UgZm9yIHRoZSBNdWRiYWMgY29udHJvbGxlciAqLworCWlmIChjb250cm9sbGVyICYmICghcmVxdWVzdF9yZWdpb24oY29udHJvbGxlciwgNCwgIkNvbXRyb2wgUm9ja2V0UG9ydCIpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gcmVzZXJ2ZSBJTyByZWdpb24gZm9yIGZpcnN0IGNvbmZpZ3VyZWQgSVNBIFJvY2tldFBvcnQgY29udHJvbGxlciAweCVseC4gIERyaXZlciBleGl0aW5nIFxuIiwgY29udHJvbGxlcik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogIFN0b3JlIElTQSB2YXJpYWJsZSByZXRyaWV2ZWQgZnJvbSBjb21tYW5kIGxpbmUgb3IgLmNvbmYgZmlsZS4gKi8KKwlyY2t0cHRfaW9fYWRkclswXSA9IGJvYXJkMTsKKwlyY2t0cHRfaW9fYWRkclsxXSA9IGJvYXJkMjsKKwlyY2t0cHRfaW9fYWRkclsyXSA9IGJvYXJkMzsKKwlyY2t0cHRfaW9fYWRkclszXSA9IGJvYXJkNDsKKworCXJja3RwdF90eXBlWzBdID0gbW9kZW0xID8gUk9DS0VUX1RZUEVfTU9ERU0gOiBST0NLRVRfVFlQRV9OT1JNQUw7CisJcmNrdHB0X3R5cGVbMF0gPSBwYzEwNF8xWzBdID8gUk9DS0VUX1RZUEVfUEMxMDQgOiByY2t0cHRfdHlwZVswXTsKKwlyY2t0cHRfdHlwZVsxXSA9IG1vZGVtMiA/IFJPQ0tFVF9UWVBFX01PREVNIDogUk9DS0VUX1RZUEVfTk9STUFMOworCXJja3RwdF90eXBlWzFdID0gcGMxMDRfMlswXSA/IFJPQ0tFVF9UWVBFX1BDMTA0IDogcmNrdHB0X3R5cGVbMV07CisJcmNrdHB0X3R5cGVbMl0gPSBtb2RlbTMgPyBST0NLRVRfVFlQRV9NT0RFTSA6IFJPQ0tFVF9UWVBFX05PUk1BTDsKKwlyY2t0cHRfdHlwZVsyXSA9IHBjMTA0XzNbMF0gPyBST0NLRVRfVFlQRV9QQzEwNCA6IHJja3RwdF90eXBlWzJdOworCXJja3RwdF90eXBlWzNdID0gbW9kZW00ID8gUk9DS0VUX1RZUEVfTU9ERU0gOiBST0NLRVRfVFlQRV9OT1JNQUw7CisJcmNrdHB0X3R5cGVbM10gPSBwYzEwNF80WzBdID8gUk9DS0VUX1RZUEVfUEMxMDQgOiByY2t0cHRfdHlwZVszXTsKKworCS8qCisJICogU2V0IHVwIHRoZSB0dHkgZHJpdmVyIHN0cnVjdHVyZSBhbmQgdGhlbiByZWdpc3RlciB0aGlzCisJICogZHJpdmVyIHdpdGggdGhlIHR0eSBsYXllci4KKwkgKi8KKworCXJvY2tldF9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcm9ja2V0X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX05PX0RFVkZTOworCXJvY2tldF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL1IiOworCXJvY2tldF9kcml2ZXItPm5hbWUgPSAidHR5UiI7CisJcm9ja2V0X2RyaXZlci0+ZHJpdmVyX25hbWUgPSAiQ29tdHJvbCBSb2NrZXRQb3J0IjsKKwlyb2NrZXRfZHJpdmVyLT5tYWpvciA9IFRUWV9ST0NLRVRfTUFKT1I7CisJcm9ja2V0X2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXJvY2tldF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXJvY2tldF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJcm9ja2V0X2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXJvY2tldF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgICAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworI2lmZGVmIFJPQ0tFVF9TT0ZUX0ZMT1cKKwlyb2NrZXRfZHJpdmVyLT5mbGFncyB8PSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9OT19ERVZGUzsKKyNlbmRpZgorCXR0eV9zZXRfb3BlcmF0aW9ucyhyb2NrZXRfZHJpdmVyLCAmcm9ja2V0X29wcyk7CisKKwlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkbid0IGluc3RhbGwgdHR5IFJvY2tldFBvcnQgZHJpdmVyIChlcnJvciAlZClcbiIsIC1yZXR2YWwpOworCQlwdXRfdHR5X2RyaXZlcihyb2NrZXRfZHJpdmVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJcHJpbnRrKEtFUk5fSU5GTyAiUm9ja2V0UG9ydCBkcml2ZXIgaXMgbWFqb3IgJWRcbiIsIHJvY2tldF9kcml2ZXIubWFqb3IpOworI2VuZGlmCisKKwkvKgorCSAqICBPSywgbGV0J3MgcHJvYmUgZWFjaCBvZiB0aGUgY29udHJvbGxlcnMgbG9va2luZyBmb3IgYm9hcmRzLiAgQW55IGJvYXJkcyBmb3VuZAorICAgICAgICAgKiAgd2lsbCBiZSBpbml0aWFsaXplZCBoZXJlLgorCSAqLworCWlzYV9ib2FyZHNfZm91bmQgPSAwOworCXBjaV9ib2FyZHNfZm91bmQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9CT0FSRFM7IGkrKykgeworCQlpZiAoaW5pdF9JU0EoaSkpCisJCQlpc2FfYm9hcmRzX2ZvdW5kKys7CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChpc2FfYm9hcmRzX2ZvdW5kIDwgTlVNX0JPQVJEUykKKwkJcGNpX2JvYXJkc19mb3VuZCA9IGluaXRfUENJKGlzYV9ib2FyZHNfZm91bmQpOworI2VuZGlmCisKKwltYXhfYm9hcmQgPSBwY2lfYm9hcmRzX2ZvdW5kICsgaXNhX2JvYXJkc19mb3VuZDsKKworCWlmIChtYXhfYm9hcmQgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJObyByb2NrZXRwb3J0IHBvcnRzIGZvdW5kOyB1bmxvYWRpbmcgZHJpdmVyLlxuIik7CisJCWRlbF90aW1lcl9zeW5jKCZyb2NrZXRfdGltZXIpOworCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisJCXB1dF90dHlfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyB2b2lkIHJwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKworCWRlbF90aW1lcl9zeW5jKCZyb2NrZXRfdGltZXIpOworCisJcmV0dmFsID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXByaW50ayhLRVJOX0lORk8gIkVycm9yICVkIHdoaWxlIHRyeWluZyB0byB1bnJlZ2lzdGVyICIKKwkJICAgICAgICJyb2NrZXRwb3J0IGRyaXZlclxuIiwgLXJldHZhbCk7CisJcHV0X3R0eV9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JQX1BPUlRTOyBpKyspIHsKKwkJaWYgKHJwX3RhYmxlW2ldKQorCQkJa2ZyZWUocnBfdGFibGVbaV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQk9BUkRTOyBpKyspIHsKKwkJaWYgKHJja3RwdF9pb19hZGRyW2ldIDw9IDAgfHwgaXNfUENJW2ldKQorCQkJY29udGludWU7CisJCXJlbGVhc2VfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCk7CisJfQorCWlmIChjb250cm9sbGVyKQorCQlyZWxlYXNlX3JlZ2lvbihjb250cm9sbGVyLCA0KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworc3RhdGljIEJ5dGVfdCBSRGF0YVtSREFUQVNJWkVdID0geworCTB4MDAsIDB4MDksIDB4ZjYsIDB4ODIsCisJMHgwMiwgMHgwOSwgMHg4NiwgMHhmYiwKKwkweDA0LCAweDA5LCAweDAwLCAweDBhLAorCTB4MDYsIDB4MDksIDB4MDEsIDB4MGEsCisJMHgwOCwgMHgwOSwgMHg4YSwgMHgxMywKKwkweDBhLCAweDA5LCAweGM1LCAweDExLAorCTB4MGMsIDB4MDksIDB4ODYsIDB4ODUsCisJMHgwZSwgMHgwOSwgMHgyMCwgMHgwYSwKKwkweDEwLCAweDA5LCAweDIxLCAweDBhLAorCTB4MTIsIDB4MDksIDB4NDEsIDB4ZmYsCisJMHgxNCwgMHgwOSwgMHg4MiwgMHgwMCwKKwkweDE2LCAweDA5LCAweDgyLCAweDdiLAorCTB4MTgsIDB4MDksIDB4OGEsIDB4N2QsCisJMHgxYSwgMHgwOSwgMHg4OCwgMHg4MSwKKwkweDFjLCAweDA5LCAweDg2LCAweDdhLAorCTB4MWUsIDB4MDksIDB4ODQsIDB4ODEsCisJMHgyMCwgMHgwOSwgMHg4MiwgMHg3YywKKwkweDIyLCAweDA5LCAweDBhLCAweDBhCit9OworCitzdGF0aWMgQnl0ZV90IFJSZWdEYXRhW1JSRUdEQVRBU0laRV0gPSB7CisJMHgwMCwgMHgwOSwgMHhmNiwgMHg4MiwJLyogMDA6IFN0b3AgUnggcHJvY2Vzc29yICovCisJMHgwOCwgMHgwOSwgMHg4YSwgMHgxMywJLyogMDQ6IFR4IHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworCTB4MGEsIDB4MDksIDB4YzUsIDB4MTEsCS8qIDA4OiBYT04gY2hhciAqLworCTB4MGMsIDB4MDksIDB4ODYsIDB4ODUsCS8qIDBjOiBYQU5ZICovCisJMHgxMiwgMHgwOSwgMHg0MSwgMHhmZiwJLyogMTA6IFJ4IG1hc2sgY2hhciAqLworCTB4MTQsIDB4MDksIDB4ODIsIDB4MDAsCS8qIDE0OiBDb21wYXJlL0lnbm9yZSAjMCAqLworCTB4MTYsIDB4MDksIDB4ODIsIDB4N2IsCS8qIDE4OiBDb21wYXJlICMxICovCisJMHgxOCwgMHgwOSwgMHg4YSwgMHg3ZCwJLyogMWM6IENvbXBhcmUgIzIgKi8KKwkweDFhLCAweDA5LCAweDg4LCAweDgxLAkvKiAyMDogSW50ZXJydXB0ICMxICovCisJMHgxYywgMHgwOSwgMHg4NiwgMHg3YSwJLyogMjQ6IElnbm9yZS9SZXBsYWNlICMxICovCisJMHgxZSwgMHgwOSwgMHg4NCwgMHg4MSwJLyogMjg6IEludGVycnVwdCAjMiAqLworCTB4MjAsIDB4MDksIDB4ODIsIDB4N2MsCS8qIDJjOiBJZ25vcmUvUmVwbGFjZSAjMiAqLworCTB4MjIsIDB4MDksIDB4MGEsIDB4MGEJLyogMzA6IFJ4IEZJRk8gRW5hYmxlICovCit9OworCitDT05UUk9MTEVSX1Qgc0NvbnRyb2xsZXJbQ1RMX1NJWkVdID0geworCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19Cit9OworCitCeXRlX3Qgc0JpdE1hcENsclRibFs4XSA9IHsKKwkweGZlLCAweGZkLCAweGZiLCAweGY3LCAweGVmLCAweGRmLCAweGJmLCAweDdmCit9OworCitCeXRlX3Qgc0JpdE1hcFNldFRibFs4XSA9IHsKKwkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwCit9OworCitpbnQgc0Nsb2NrUHJlc2NhbGUgPSAweDE0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0luaXRDb250cm9sbGVyCitQdXJwb3NlOiAgSW5pdGlhbGl6YXRpb24gb2YgY29udHJvbGxlciBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBjb250cm9sbGVyCisgICAgICAgICAgc3RydWN0dXJlLgorQ2FsbDogICAgIHNJbml0Q29udHJvbGxlcihDdGxQLEN0bE51bSxNdWRiYWNJTyxBaW9wSU9MaXN0LEFpb3BJT0xpc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFOdW0sRnJlcXVlbmN5LFBlcmlvZGljT25seSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBDdGxOdW07IENvbnRyb2xsZXIgbnVtYmVyCisgICAgICAgICAgQnl0ZUlPX3QgTXVkYmFjSU87IE11ZGJhYyBiYXNlIEkvTyBhZGRyZXNzLgorICAgICAgICAgIEJ5dGVJT190ICpBaW9wSU9MaXN0OyBMaXN0IG9mIEkvTyBhZGRyZXNzZXMgZm9yIGVhY2ggQUlPUC4KKyAgICAgICAgICAgICBUaGlzIGxpc3QgbXVzdCBiZSBpbiB0aGUgb3JkZXIgdGhlIEFJT1BzIHdpbGwgYmUgZm91bmQgb24gdGhlCisgICAgICAgICAgICAgY29udHJvbGxlci4gIE9uY2UgYW4gQUlPUCBpbiB0aGUgbGlzdCBpcyBub3QgZm91bmQsIGl0IGlzCisgICAgICAgICAgICAgYXNzdW1lZCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIEFJT1BzIG9uIHRoZSBjb250cm9sbGVyLgorICAgICAgICAgIGludCBBaW9wSU9MaXN0U2l6ZTsgTnVtYmVyIG9mIGFkZHJlc3NlcyBpbiBBaW9wSU9MaXN0CisgICAgICAgICAgaW50IElSUU51bTsgSW50ZXJydXB0IFJlcXVlc3QgbnVtYmVyLiAgQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgIDA6IERpc2FibGUgZ2xvYmFsIGludGVycnVwdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAzOiBJUlEgMworICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IElSUSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgNTogSVJRIDUKKyAgICAgICAgICAgICAgICAgICAgICAgICA5OiBJUlEgOQorICAgICAgICAgICAgICAgICAgICAgICAgIDEwOiBJUlEgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMTogSVJRIDExCisgICAgICAgICAgICAgICAgICAgICAgICAgMTI6IElSUSAxMgorICAgICAgICAgICAgICAgICAgICAgICAgIDE1OiBJUlEgMTUKKyAgICAgICAgICBCeXRlX3QgRnJlcXVlbmN5OiBBIGZsYWcgaWRlbnRpZnlpbmcgdGhlIGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIGNhbiBiZSBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV9ESVMgLSBwZXJpb2RpYyBpbnRlcnJ1cHQgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzEzN0haIC0gMTM3IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV82OUhaIC0gNjkgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzM0SFogLSAzNCBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMTdIWiAtIDE3IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV85SFogLSA5IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV80SFogLSA0IEhlcnR6CisgICAgICAgICAgICAgICAgICAgSWYgSVJRTnVtIGlzIHNldCB0byAwIHRoZSBGcmVxdWVuY3kgcGFyYW1ldGVyIGlzCisgICAgICAgICAgICAgICAgICAgb3ZlcmlkZGVuLCBpdCBpcyBmb3JjZWQgdG8gYSB2YWx1ZSBvZiBGUkVRX0RJUy4KKyAgICAgICAgICBpbnQgUGVyaW9kaWNPbmx5OiBUUlVFIGlmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCB0aGUgcGVyaW9kaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgYXJlIHRvIGJlIGJsb2NrZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgaXMgYm90aCB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGNoYW5uZWwgaW50ZXJydXB0cyBhcmUgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIFBlcmlvZGljT25seSBwYXJhbWV0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZBTFNFLgorUmV0dXJuOiAgIGludDogTnVtYmVyIG9mIEFJT1BzIG9uIHRoZSBjb250cm9sbGVyLCBvciBDVExJRF9OVUxMIGlmIGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIGZhaWxlZC4KKworQ29tbWVudHM6CisgICAgICAgICAgSWYgcGVyaW9kaWMgaW50ZXJydXB0cyBhcmUgdG8gYmUgZGlzYWJsZWQgYnV0IEFJT1AgaW50ZXJydXB0cworICAgICAgICAgIGFyZSBhbGxvd2VkLCBzZXQgRnJlcXVlbmN5IHRvIEZSRVFfRElTIGFuZCBQZXJpb2RpY09ubHkgdG8gRkFMU0UuCisKKyAgICAgICAgICBJZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBjb21wbGV0ZWx5IGRpc2FibGVkIHNldCBJUlFOdW0gdG8gMC4KKworICAgICAgICAgIFNldHRpbmcgRnJlcXVlbmN5IHRvIEZSRVFfRElTIGFuZCBQZXJpb2RpY09ubHkgdG8gVFJVRSBpcyBhbgorICAgICAgICAgIGludmFsaWQgY29tYmluYXRpb24uCisKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIGdsb2JhbCBpbnRlcnJ1cHQgbW9kZXMsCisgICAgICAgICAgYnV0IGl0IGRvZXMgbm90IGFjdHVhbGx5IGVuYWJsZSBnbG9iYWwgaW50ZXJydXB0cy4gIFRvIGVuYWJsZQorICAgICAgICAgIGFuZCBkaXNhYmxlIGdsb2JhbCBpbnRlcnJ1cHRzIHVzZSBmdW5jdGlvbnMgc0VuR2xvYmFsSW50KCkgYW5kCisgICAgICAgICAgc0Rpc0dsb2JhbEludCgpLiAgRW5hYmxpbmcgb2YgZ2xvYmFsIGludGVycnVwdHMgaXMgbm9ybWFsbHkgbm90CisgICAgICAgICAgZG9uZSB1bnRpbCBhbGwgb3RoZXIgaW5pdGlhbGl6YXRpb25zIGFyZSBjb21wbGV0ZS4KKworICAgICAgICAgIEV2ZW4gaWYgaW50ZXJydXB0cyBhcmUgZ2xvYmFsbHkgZW5hYmxlZCwgdGhleSBtdXN0IGFsc28gYmUKKyAgICAgICAgICBpbmRpdmlkdWFsbHkgZW5hYmxlZCBmb3IgZWFjaCBjaGFubmVsIHRoYXQgaXMgdG8gZ2VuZXJhdGUKKyAgICAgICAgICBpbnRlcnJ1cHRzLgorCitXYXJuaW5nczogTm8gcmFuZ2UgY2hlY2tpbmcgb24gYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGRvbmUuCisKKyAgICAgICAgICBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorCisgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiBhbGwgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIgYXJlIGRpc2FibGVkLAorICAgICAgICAgIHRoZXkgY2FuIGJlIGVuYWJsZWQgd2l0aCBzRW5BaW9wKCkuCisqLworaW50IHNJbml0Q29udHJvbGxlcihDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgQ3RsTnVtLCBCeXRlSU9fdCBNdWRiYWNJTywKKwkJICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwgaW50IEFpb3BJT0xpc3RTaXplLCBpbnQgSVJRTnVtLAorCQkgICAgQnl0ZV90IEZyZXF1ZW5jeSwgaW50IFBlcmlvZGljT25seSkKK3sKKwlpbnQgaTsKKwlCeXRlSU9fdCBpbzsKKwlpbnQgZG9uZTsKKworCUN0bFAtPkFpb3BJbnRyQml0cyA9IGFpb3BfaW50cl9iaXRzOworCUN0bFAtPkFsdENoYW5SaW5nSW5kaWNhdG9yID0gMDsKKwlDdGxQLT5DdGxOdW0gPSBDdGxOdW07CisJQ3RsUC0+Q3RsSUQgPSBDVExJRF8wMDAxOwkvKiBjb250cm9sbGVyIHJlbGVhc2UgMSAqLworCUN0bFAtPkJ1c1R5cGUgPSBpc0lTQTsKKwlDdGxQLT5NQmFzZUlPID0gTXVkYmFjSU87CisJQ3RsUC0+TVJlZzFJTyA9IE11ZGJhY0lPICsgMTsKKwlDdGxQLT5NUmVnMklPID0gTXVkYmFjSU8gKyAyOworCUN0bFAtPk1SZWczSU8gPSBNdWRiYWNJTyArIDM7CisjaWYgMQorCUN0bFAtPk1SZWcyID0gMDsJLyogaW50ZXJydXB0IGRpc2FibGUgKi8KKwlDdGxQLT5NUmVnMyA9IDA7CS8qIG5vIHBlcmlvZGljIGludGVycnVwdHMgKi8KKyNlbHNlCisJaWYgKHNJUlFNYXBbSVJRTnVtXSA9PSAwKSB7CS8qIGludGVycnVwdHMgZ2xvYmFsbHkgZGlzYWJsZWQgKi8KKwkJQ3RsUC0+TVJlZzIgPSAwOwkvKiBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCQlDdGxQLT5NUmVnMyA9IDA7CS8qIG5vIHBlcmlvZGljIGludGVycnVwdHMgKi8KKwl9IGVsc2UgeworCQlDdGxQLT5NUmVnMiA9IHNJUlFNYXBbSVJRTnVtXTsJLyogc2V0IElSUSBudW1iZXIgKi8KKwkJQ3RsUC0+TVJlZzMgPSBGcmVxdWVuY3k7CS8qIHNldCBmcmVxdWVuY3kgKi8KKwkJaWYgKFBlcmlvZGljT25seSkgewkvKiBwZXJpb2RpYyBpbnRlcnJ1cHQgb25seSAqLworCQkJQ3RsUC0+TVJlZzMgfD0gUEVSSU9ESUNfT05MWTsKKwkJfQorCX0KKyNlbmRpZgorCXNPdXRCKEN0bFAtPk1SZWcySU8sIEN0bFAtPk1SZWcyKTsKKwlzT3V0QihDdGxQLT5NUmVnM0lPLCBDdGxQLT5NUmVnMyk7CisJc0NvbnRyb2xsZXJFT0koQ3RsUCk7CS8qIGNsZWFyIEVPSSBpZiB3YXJtIGluaXQgKi8KKwkvKiBJbml0IEFJT1BzICovCisJQ3RsUC0+TnVtQWlvcCA9IDA7CisJZm9yIChpID0gZG9uZSA9IDA7IGkgPCBBaW9wSU9MaXN0U2l6ZTsgaSsrKSB7CisJCWlvID0gQWlvcElPTGlzdFtpXTsKKwkJQ3RsUC0+QWlvcElPW2ldID0gKFdvcmRJT190KSBpbzsKKwkJQ3RsUC0+QWlvcEludENoYW5JT1tpXSA9IGlvICsgX0lOVF9DSEFOOworCQlzT3V0QihDdGxQLT5NUmVnMklPLCBDdGxQLT5NUmVnMiB8IChpICYgMHgwMykpOwkvKiBBSU9QIGluZGV4ICovCisJCXNPdXRCKE11ZGJhY0lPLCAoQnl0ZV90KSAoaW8gPj4gNikpOwkvKiBzZXQgdXAgQUlPUCBJL08gaW4gTVVEQkFDICovCisJCWlmIChkb25lKQorCQkJY29udGludWU7CisJCXNFbkFpb3AoQ3RsUCwgaSk7CS8qIGVuYWJsZSB0aGUgQUlPUCAqLworCQlDdGxQLT5BaW9wSURbaV0gPSBzUmVhZEFpb3BJRChpbyk7CS8qIHJlYWQgQUlPUCBJRCAqLworCQlpZiAoQ3RsUC0+QWlvcElEW2ldID09IEFJT1BJRF9OVUxMKQkvKiBpZiBBSU9QIGRvZXMgbm90IGV4aXN0ICovCisJCQlkb25lID0gMTsJLyogZG9uZSBsb29raW5nIGZvciBBSU9QcyAqLworCQllbHNlIHsKKwkJCUN0bFAtPkFpb3BOdW1DaGFuW2ldID0gc1JlYWRBaW9wTnVtQ2hhbigoV29yZElPX3QpIGlvKTsJLyogbnVtIGNoYW5uZWxzIGluIEFJT1AgKi8KKwkJCXNPdXRXKChXb3JkSU9fdCkgaW8gKyBfSU5EWF9BRERSLCBfQ0xLX1BSRSk7CS8qIGNsb2NrIHByZXNjYWxlciAqLworCQkJc091dEIoaW8gKyBfSU5EWF9EQVRBLCBzQ2xvY2tQcmVzY2FsZSk7CisJCQlDdGxQLT5OdW1BaW9wKys7CS8qIGJ1bXAgY291bnQgb2YgQUlPUHMgKi8KKwkJfQorCQlzRGlzQWlvcChDdGxQLCBpKTsJLyogZGlzYWJsZSBBSU9QICovCisJfQorCisJaWYgKEN0bFAtPk51bUFpb3AgPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJZWxzZQorCQlyZXR1cm4gKEN0bFAtPk51bUFpb3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1BDSUluaXRDb250cm9sbGVyCitQdXJwb3NlOiAgSW5pdGlhbGl6YXRpb24gb2YgY29udHJvbGxlciBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBjb250cm9sbGVyCisgICAgICAgICAgc3RydWN0dXJlLgorQ2FsbDogICAgIHNQQ0lJbml0Q29udHJvbGxlcihDdGxQLEN0bE51bSxBaW9wSU9MaXN0LEFpb3BJT0xpc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFOdW0sRnJlcXVlbmN5LFBlcmlvZGljT25seSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBDdGxOdW07IENvbnRyb2xsZXIgbnVtYmVyCisgICAgICAgICAgQnl0ZUlPX3QgKkFpb3BJT0xpc3Q7IExpc3Qgb2YgSS9PIGFkZHJlc3NlcyBmb3IgZWFjaCBBSU9QLgorICAgICAgICAgICAgIFRoaXMgbGlzdCBtdXN0IGJlIGluIHRoZSBvcmRlciB0aGUgQUlPUHMgd2lsbCBiZSBmb3VuZCBvbiB0aGUKKyAgICAgICAgICAgICBjb250cm9sbGVyLiAgT25jZSBhbiBBSU9QIGluIHRoZSBsaXN0IGlzIG5vdCBmb3VuZCwgaXQgaXMKKyAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIuCisgICAgICAgICAgaW50IEFpb3BJT0xpc3RTaXplOyBOdW1iZXIgb2YgYWRkcmVzc2VzIGluIEFpb3BJT0xpc3QKKyAgICAgICAgICBpbnQgSVJRTnVtOyBJbnRlcnJ1cHQgUmVxdWVzdCBudW1iZXIuICBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICAgICAgIDM6IElSUSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgNDogSVJRIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICA1OiBJUlEgNQorICAgICAgICAgICAgICAgICAgICAgICAgIDk6IElSUSA5CisgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IElSUSAxMAorICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBJUlEgMTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMjogSVJRIDEyCisgICAgICAgICAgICAgICAgICAgICAgICAgMTU6IElSUSAxNQorICAgICAgICAgIEJ5dGVfdCBGcmVxdWVuY3k6IEEgZmxhZyBpZGVudGlmeWluZyB0aGUgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBlcmlvZGljIGludGVycnVwdCwgY2FuIGJlIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRX0RJUyAtIHBlcmlvZGljIGludGVycnVwdCBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMTM3SFogLSAxMzcgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzY5SFogLSA2OSBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMzRIWiAtIDM0IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV8xN0haIC0gMTcgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzlIWiAtIDkgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzRIWiAtIDQgSGVydHoKKyAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIEZyZXF1ZW5jeSBwYXJhbWV0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZSRVFfRElTLgorICAgICAgICAgIGludCBQZXJpb2RpY09ubHk6IFRSVUUgaWYgYWxsIGludGVycnVwdHMgZXhjZXB0IHRoZSBwZXJpb2RpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBhcmUgdG8gYmUgYmxvY2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpcyBib3RoIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhbm5lbCBpbnRlcnJ1cHRzIGFyZSBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIElSUU51bSBpcyBzZXQgdG8gMCB0aGUgUGVyaW9kaWNPbmx5IHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJpZGRlbiwgaXQgaXMgZm9yY2VkIHRvIGEgdmFsdWUgb2YgRkFMU0UuCitSZXR1cm46ICAgaW50OiBOdW1iZXIgb2YgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIsIG9yIENUTElEX05VTEwgaWYgY29udHJvbGxlcgorICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgorCitDb21tZW50czoKKyAgICAgICAgICBJZiBwZXJpb2RpYyBpbnRlcnJ1cHRzIGFyZSB0byBiZSBkaXNhYmxlZCBidXQgQUlPUCBpbnRlcnJ1cHRzCisgICAgICAgICAgYXJlIGFsbG93ZWQsIHNldCBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBGQUxTRS4KKworICAgICAgICAgIElmIGludGVycnVwdHMgYXJlIHRvIGJlIGNvbXBsZXRlbHkgZGlzYWJsZWQgc2V0IElSUU51bSB0byAwLgorCisgICAgICAgICAgU2V0dGluZyBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBUUlVFIGlzIGFuCisgICAgICAgICAgaW52YWxpZCBjb21iaW5hdGlvbi4KKworICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgZ2xvYmFsIGludGVycnVwdCBtb2RlcywKKyAgICAgICAgICBidXQgaXQgZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIGdsb2JhbCBpbnRlcnJ1cHRzLiAgVG8gZW5hYmxlCisgICAgICAgICAgYW5kIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdHMgdXNlIGZ1bmN0aW9ucyBzRW5HbG9iYWxJbnQoKSBhbmQKKyAgICAgICAgICBzRGlzR2xvYmFsSW50KCkuICBFbmFibGluZyBvZiBnbG9iYWwgaW50ZXJydXB0cyBpcyBub3JtYWxseSBub3QKKyAgICAgICAgICBkb25lIHVudGlsIGFsbCBvdGhlciBpbml0aWFsaXphdGlvbnMgYXJlIGNvbXBsZXRlLgorCisgICAgICAgICAgRXZlbiBpZiBpbnRlcnJ1cHRzIGFyZSBnbG9iYWxseSBlbmFibGVkLCB0aGV5IG11c3QgYWxzbyBiZQorICAgICAgICAgIGluZGl2aWR1YWxseSBlbmFibGVkIGZvciBlYWNoIGNoYW5uZWwgdGhhdCBpcyB0byBnZW5lcmF0ZQorICAgICAgICAgIGludGVycnVwdHMuCisKK1dhcm5pbmdzOiBObyByYW5nZSBjaGVja2luZyBvbiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaXMgZG9uZS4KKworICAgICAgICAgIE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGFsbCBBSU9QcyBvbiB0aGUgY29udHJvbGxlciBhcmUgZGlzYWJsZWQsCisgICAgICAgICAgdGhleSBjYW4gYmUgZW5hYmxlZCB3aXRoIHNFbkFpb3AoKS4KKyovCitpbnQgc1BDSUluaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sCisJCSAgICAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJICAgICAgIFdvcmRJT190IENvbmZpZ0lPLCBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LAorCQkgICAgICAgaW50IFBlcmlvZGljT25seSwgaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yLAorCQkgICAgICAgaW50IFVQQ0lSaW5nSW5kKQoreworCWludCBpOworCUJ5dGVJT190IGlvOworCisJQ3RsUC0+QWx0Q2hhblJpbmdJbmRpY2F0b3IgPSBhbHRDaGFuUmluZ0luZGljYXRvcjsKKwlDdGxQLT5VUENJUmluZ0luZCA9IFVQQ0lSaW5nSW5kOworCUN0bFAtPkN0bE51bSA9IEN0bE51bTsKKwlDdGxQLT5DdGxJRCA9IENUTElEXzAwMDE7CS8qIGNvbnRyb2xsZXIgcmVsZWFzZSAxICovCisJQ3RsUC0+QnVzVHlwZSA9IGlzUENJOwkvKiBjb250cm9sbGVyIHJlbGVhc2UgMSAqLworCisJaWYgKENvbmZpZ0lPKSB7CisJCUN0bFAtPmlzVVBDSSA9IDE7CisJCUN0bFAtPlBDSUlPID0gQ29uZmlnSU8gKyBfUENJXzkwMzBfSU5UX0NUUkw7CisJCUN0bFAtPlBDSUlPMiA9IENvbmZpZ0lPICsgX1BDSV85MDMwX0dQSU9fQ1RSTDsKKwkJQ3RsUC0+QWlvcEludHJCaXRzID0gdXBjaV9haW9wX2ludHJfYml0czsKKwl9IGVsc2UgeworCQlDdGxQLT5pc1VQQ0kgPSAwOworCQlDdGxQLT5QQ0lJTyA9CisJCSAgICAoV29yZElPX3QpICgoQnl0ZUlPX3QpIEFpb3BJT0xpc3RbMF0gKyBfUENJX0lOVF9GVU5DKTsKKwkJQ3RsUC0+QWlvcEludHJCaXRzID0gYWlvcF9pbnRyX2JpdHM7CisJfQorCisJc1BDSUNvbnRyb2xsZXJFT0koQ3RsUCk7CS8qIGNsZWFyIEVPSSBpZiB3YXJtIGluaXQgKi8KKwkvKiBJbml0IEFJT1BzICovCisJQ3RsUC0+TnVtQWlvcCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFpb3BJT0xpc3RTaXplOyBpKyspIHsKKwkJaW8gPSBBaW9wSU9MaXN0W2ldOworCQlDdGxQLT5BaW9wSU9baV0gPSAoV29yZElPX3QpIGlvOworCQlDdGxQLT5BaW9wSW50Q2hhbklPW2ldID0gaW8gKyBfSU5UX0NIQU47CisKKwkJQ3RsUC0+QWlvcElEW2ldID0gc1JlYWRBaW9wSUQoaW8pOwkvKiByZWFkIEFJT1AgSUQgKi8KKwkJaWYgKEN0bFAtPkFpb3BJRFtpXSA9PSBBSU9QSURfTlVMTCkJLyogaWYgQUlPUCBkb2VzIG5vdCBleGlzdCAqLworCQkJYnJlYWs7CS8qIGRvbmUgbG9va2luZyBmb3IgQUlPUHMgKi8KKworCQlDdGxQLT5BaW9wTnVtQ2hhbltpXSA9IHNSZWFkQWlvcE51bUNoYW4oKFdvcmRJT190KSBpbyk7CS8qIG51bSBjaGFubmVscyBpbiBBSU9QICovCisJCXNPdXRXKChXb3JkSU9fdCkgaW8gKyBfSU5EWF9BRERSLCBfQ0xLX1BSRSk7CS8qIGNsb2NrIHByZXNjYWxlciAqLworCQlzT3V0QihpbyArIF9JTkRYX0RBVEEsIHNDbG9ja1ByZXNjYWxlKTsKKwkJQ3RsUC0+TnVtQWlvcCsrOwkvKiBidW1wIGNvdW50IG9mIEFJT1BzICovCisJfQorCisJaWYgKEN0bFAtPk51bUFpb3AgPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJZWxzZQorCQlyZXR1cm4gKEN0bFAtPk51bUFpb3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1JlYWRBaW9wSUQKK1B1cnBvc2U6ICBSZWFkIHRoZSBBSU9QIGlkZW5maWNhdGlvbiBudW1iZXIgZGlyZWN0bHkgZnJvbSBhbiBBSU9QLgorQ2FsbDogICAgIHNSZWFkQWlvcElEKGlvKQorICAgICAgICAgIEJ5dGVJT190IGlvOiBBSU9QIGJhc2UgSS9PIGFkZHJlc3MKK1JldHVybjogICBpbnQ6IEZsYWcgQUlPUElEX1hYWFggaWYgYSB2YWxpZCBBSU9QIGlzIGZvdW5kLCB3aGVyZSBYCisgICAgICAgICAgICAgICAgIGlzIHJlcGxhY2UgYnkgYW4gaWRlbnRpZnlpbmcgbnVtYmVyLgorICAgICAgICAgIEZsYWcgQUlPUElEX05VTEwgaWYgbm8gdmFsaWQgQUlPUCBpcyBmb3VuZAorV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyovCitpbnQgc1JlYWRBaW9wSUQoQnl0ZUlPX3QgaW8pCit7CisJQnl0ZV90IEFpb3BJRDsJCS8qIElEIGJ5dGUgZnJvbSBBSU9QICovCisKKwlzT3V0QihpbyArIF9DTURfUkVHLCBSRVNFVF9BTEwpOwkvKiByZXNldCBBSU9QICovCisJc091dEIoaW8gKyBfQ01EX1JFRywgMHgwKTsKKwlBaW9wSUQgPSBzSW5XKGlvICsgX0NITl9TVEFUMCkgJiAweDA3OworCWlmIChBaW9wSUQgPT0gMHgwNikKKwkJcmV0dXJuICgxKTsKKwllbHNlCQkJLyogQUlPUCBkb2VzIG5vdCBleGlzdCAqLworCQlyZXR1cm4gKC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNSZWFkQWlvcE51bUNoYW4KK1B1cnBvc2U6ICBSZWFkIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIGluIGFuIEFJT1AgZGlyZWN0bHkgZnJvbQorICAgICAgICAgIGFuIEFJT1AuCitDYWxsOiAgICAgc1JlYWRBaW9wTnVtQ2hhbihpbykKKyAgICAgICAgICBXb3JkSU9fdCBpbzogQUlPUCBiYXNlIEkvTyBhZGRyZXNzCitSZXR1cm46ICAgaW50OiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZQorQ29tbWVudHM6IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgZGV0ZXJtaW5lZCBieSB3cml0ZS9yZWFkcyBmcm9tIGlkZW50aWNhbAorICAgICAgICAgIG9mZnNldHMgd2l0aGluIHRoZSBTUkFNIGFkZHJlc3Mgc3BhY2VzIGZvciBjaGFubmVscyAwIGFuZCA0LgorICAgICAgICAgIElmIHRoZSBjaGFubmVsIDQgc3BhY2UgaXMgbWlycm9yZWQgdG8gY2hhbm5lbCAwIGl0IGlzIGEgNCBjaGFubmVsCisgICAgICAgICAgQUlPUCwgb3RoZXJ3aXNlIGl0IGlzIGFuIDggY2hhbm5lbC4KK1dhcm5pbmdzOiBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorKi8KK2ludCBzUmVhZEFpb3BOdW1DaGFuKFdvcmRJT190IGlvKQoreworCVdvcmRfdCB4OworCXN0YXRpYyBCeXRlX3QgUls0XSA9IHsgMHgwMCwgMHgwMCwgMHgzNCwgMHgxMiB9OworCisJLyogd3JpdGUgdG8gY2hhbiAwIFNSQU0gKi8KKwlzT3V0RFcoKERXb3JkSU9fdCkgaW8gKyBfSU5EWF9BRERSLCAqKChEV29yZF90ICopICYgUlswXSkpOworCXNPdXRXKGlvICsgX0lORFhfQUREUiwgMCk7CS8qIHJlYWQgZnJvbSBTUkFNLCBjaGFuIDAgKi8KKwl4ID0gc0luVyhpbyArIF9JTkRYX0RBVEEpOworCXNPdXRXKGlvICsgX0lORFhfQUREUiwgMHg0MDAwKTsJLyogcmVhZCBmcm9tIFNSQU0sIGNoYW4gNCAqLworCWlmICh4ICE9IHNJblcoaW8gKyBfSU5EWF9EQVRBKSkJLyogaWYgZGlmZmVyZW50IG11c3QgYmUgOCBjaGFuICovCisJCXJldHVybiAoOCk7CisJZWxzZQorCQlyZXR1cm4gKDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0luaXRDaGFuCitQdXJwb3NlOiAgSW5pdGlhbGl6YXRpb24gb2YgYSBjaGFubmVsIGFuZCBjaGFubmVsIHN0cnVjdHVyZQorQ2FsbDogICAgIHNJbml0Q2hhbihDdGxQLENoUCxBaW9wTnVtLENoYW5OdW0pCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IEFJT1AgbnVtYmVyIHdpdGhpbiBjb250cm9sbGVyCisgICAgICAgICAgaW50IENoYW5OdW07IENoYW5uZWwgbnVtYmVyIHdpdGhpbiBBSU9QCitSZXR1cm46ICAgaW50OiBUUlVFIGlmIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgRkFMU0UgaWYgaXQgZmFpbHMgYmVjYXVzZSBjaGFubmVsCisgICAgICAgICAgICAgICBudW1iZXIgZXhjZWVkcyBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIGluIEFJT1AuCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYSBjaGFubmVsIGNhbiBiZSB1c2VkLgorV2FybmluZ3M6IE5vIHJhbmdlIGNoZWNraW5nIG9uIGFueSBvZiB0aGUgcGFyYW1ldGVycyBpcyBkb25lLgorCisgICAgICAgICAgTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKyovCitpbnQgc0luaXRDaGFuKENPTlRST0xMRVJfVCAqIEN0bFAsIENIQU5ORUxfVCAqIENoUCwgaW50IEFpb3BOdW0sCisJICAgICAgaW50IENoYW5OdW0pCit7CisJaW50IGk7CisJV29yZElPX3QgQWlvcElPOworCVdvcmRJT190IENoSU9PZmY7CisJQnl0ZV90ICpDaFI7CisJV29yZF90IENoT2ZmOworCXN0YXRpYyBCeXRlX3QgUls0XTsKKwlpbnQgYnJkOTYwMDsKKworCWlmIChDaGFuTnVtID49IEN0bFAtPkFpb3BOdW1DaGFuW0Fpb3BOdW1dKQorCQlyZXR1cm4gKEZBTFNFKTsJLyogZXhjZWVkcyBudW0gY2hhbnMgaW4gQUlPUCAqLworCisJLyogQ2hhbm5lbCwgQUlPUCwgYW5kIGNvbnRyb2xsZXIgaWRlbnRpZmllcnMgKi8KKwlDaFAtPkN0bFAgPSBDdGxQOworCUNoUC0+Q2hhbklEID0gQ3RsUC0+QWlvcElEW0Fpb3BOdW1dOworCUNoUC0+QWlvcE51bSA9IEFpb3BOdW07CisJQ2hQLT5DaGFuTnVtID0gQ2hhbk51bTsKKworCS8qIEdsb2JhbCBkaXJlY3QgYWRkcmVzc2VzICovCisJQWlvcElPID0gQ3RsUC0+QWlvcElPW0Fpb3BOdW1dOworCUNoUC0+Q21kID0gKEJ5dGVJT190KSBBaW9wSU8gKyBfQ01EX1JFRzsKKwlDaFAtPkludENoYW4gPSAoQnl0ZUlPX3QpIEFpb3BJTyArIF9JTlRfQ0hBTjsKKwlDaFAtPkludE1hc2sgPSAoQnl0ZUlPX3QpIEFpb3BJTyArIF9JTlRfTUFTSzsKKwlDaFAtPkluZGV4QWRkciA9IChEV29yZElPX3QpIEFpb3BJTyArIF9JTkRYX0FERFI7CisJQ2hQLT5JbmRleERhdGEgPSBBaW9wSU8gKyBfSU5EWF9EQVRBOworCisJLyogQ2hhbm5lbCBkaXJlY3QgYWRkcmVzc2VzICovCisJQ2hJT09mZiA9IEFpb3BJTyArIENoUC0+Q2hhbk51bSAqIDI7CisJQ2hQLT5UeFJ4RGF0YSA9IENoSU9PZmYgKyBfVEQwOworCUNoUC0+Q2hhblN0YXQgPSBDaElPT2ZmICsgX0NITl9TVEFUMDsKKwlDaFAtPlR4UnhDb3VudCA9IENoSU9PZmYgKyBfRklGT19DTlQwOworCUNoUC0+SW50SUQgPSAoQnl0ZUlPX3QpIEFpb3BJTyArIENoUC0+Q2hhbk51bSArIF9JTlRfSUQwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBmcm9tIHRoZSBSRGF0YSBhcnJheSAqLworCWZvciAoaSA9IDA7IGkgPCBSREFUQVNJWkU7IGkgKz0gNCkgeworCQlSWzBdID0gUkRhdGFbaV07CisJCVJbMV0gPSBSRGF0YVtpICsgMV0gKyAweDEwICogQ2hhbk51bTsKKwkJUlsyXSA9IFJEYXRhW2kgKyAyXTsKKwkJUlszXSA9IFJEYXRhW2kgKyAzXTsKKwkJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKChEV29yZF90ICopICYgUlswXSkpOworCX0KKworCUNoUiA9IENoUC0+UjsKKwlmb3IgKGkgPSAwOyBpIDwgUlJFR0RBVEFTSVpFOyBpICs9IDQpIHsKKwkJQ2hSW2ldID0gUlJlZ0RhdGFbaV07CisJCUNoUltpICsgMV0gPSBSUmVnRGF0YVtpICsgMV0gKyAweDEwICogQ2hhbk51bTsKKwkJQ2hSW2kgKyAyXSA9IFJSZWdEYXRhW2kgKyAyXTsKKwkJQ2hSW2kgKyAzXSA9IFJSZWdEYXRhW2kgKyAzXTsKKwl9CisKKwkvKiBJbmRleGVkIHJlZ2lzdGVycyAqLworCUNoT2ZmID0gKFdvcmRfdCkgQ2hhbk51bSAqMHgxMDAwOworCisJaWYgKHNDbG9ja1ByZXNjYWxlID09IDB4MTQpCisJCWJyZDk2MDAgPSA0NzsKKwllbHNlCisJCWJyZDk2MDAgPSAyMzsKKworCUNoUC0+QmF1ZERpdlswXSA9IChCeXRlX3QpIChDaE9mZiArIF9CQVVEKTsKKwlDaFAtPkJhdWREaXZbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX0JBVUQpID4+IDgpOworCUNoUC0+QmF1ZERpdlsyXSA9IChCeXRlX3QpIGJyZDk2MDA7CisJQ2hQLT5CYXVkRGl2WzNdID0gKEJ5dGVfdCkgKGJyZDk2MDAgPj4gOCk7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPkJhdWREaXZbMF0pOworCisJQ2hQLT5UeENvbnRyb2xbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhfQ1RSTCk7CisJQ2hQLT5UeENvbnRyb2xbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX1RYX0NUUkwpID4+IDgpOworCUNoUC0+VHhDb250cm9sWzJdID0gMDsKKwlDaFAtPlR4Q29udHJvbFszXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4Q29udHJvbFswXSk7CisKKwlDaFAtPlJ4Q29udHJvbFswXSA9IChCeXRlX3QpIChDaE9mZiArIF9SWF9DVFJMKTsKKwlDaFAtPlJ4Q29udHJvbFsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfUlhfQ1RSTCkgPj4gOCk7CisJQ2hQLT5SeENvbnRyb2xbMl0gPSAwOworCUNoUC0+UnhDb250cm9sWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+UnhDb250cm9sWzBdKTsKKworCUNoUC0+VHhFbmFibGVzWzBdID0gKEJ5dGVfdCkgKENoT2ZmICsgX1RYX0VOQkxTKTsKKwlDaFAtPlR4RW5hYmxlc1sxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfVFhfRU5CTFMpID4+IDgpOworCUNoUC0+VHhFbmFibGVzWzJdID0gMDsKKwlDaFAtPlR4RW5hYmxlc1szXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4RW5hYmxlc1swXSk7CisKKwlDaFAtPlR4Q29tcGFyZVswXSA9IChCeXRlX3QpIChDaE9mZiArIF9UWENNUDEpOworCUNoUC0+VHhDb21wYXJlWzFdID0gKEJ5dGVfdCkgKChDaE9mZiArIF9UWENNUDEpID4+IDgpOworCUNoUC0+VHhDb21wYXJlWzJdID0gMDsKKwlDaFAtPlR4Q29tcGFyZVszXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4Q29tcGFyZVswXSk7CisKKwlDaFAtPlR4UmVwbGFjZTFbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhSRVAxQjEpOworCUNoUC0+VHhSZXBsYWNlMVsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfVFhSRVAxQjEpID4+IDgpOworCUNoUC0+VHhSZXBsYWNlMVsyXSA9IDA7CisJQ2hQLT5UeFJlcGxhY2UxWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhSZXBsYWNlMVswXSk7CisKKwlDaFAtPlR4UmVwbGFjZTJbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhSRVAyKTsKKwlDaFAtPlR4UmVwbGFjZTJbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX1RYUkVQMikgPj4gOCk7CisJQ2hQLT5UeFJlcGxhY2UyWzJdID0gMDsKKwlDaFAtPlR4UmVwbGFjZTJbM10gPSAwOworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5UeFJlcGxhY2UyWzBdKTsKKworCUNoUC0+VHhGSUZPUHRycyA9IENoT2ZmICsgX1RYRl9PVVRQOworCUNoUC0+VHhGSUZPID0gQ2hPZmYgKyBfVFhfRklGTzsKKworCXNPdXRCKENoUC0+Q21kLCAoQnl0ZV90KSBDaGFuTnVtIHwgUkVTVFhGQ05UKTsJLyogYXBwbHkgcmVzZXQgVHggRklGTyBjb3VudCAqLworCXNPdXRCKENoUC0+Q21kLCAoQnl0ZV90KSBDaGFuTnVtKTsJLyogcmVtb3ZlIHJlc2V0IFR4IEZJRk8gY291bnQgKi8KKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4RklGT1B0cnMpOwkvKiBjbGVhciBUeCBpbi9vdXQgcHRycyAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlDaFAtPlJ4RklGT1B0cnMgPSBDaE9mZiArIF9SWEZfT1VUUDsKKwlDaFAtPlJ4RklGTyA9IENoT2ZmICsgX1JYX0ZJRk87CisKKwlzT3V0QihDaFAtPkNtZCwgKEJ5dGVfdCkgQ2hhbk51bSB8IFJFU1JYRkNOVCk7CS8qIGFwcGx5IHJlc2V0IFJ4IEZJRk8gY291bnQgKi8KKwlzT3V0QihDaFAtPkNtZCwgKEJ5dGVfdCkgQ2hhbk51bSk7CS8qIHJlbW92ZSByZXNldCBSeCBGSUZPIGNvdW50ICovCisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5SeEZJRk9QdHJzKTsJLyogY2xlYXIgUnggb3V0IHB0ciAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlJ4RklGT1B0cnMgKyAyKTsJLyogY2xlYXIgUnggaW4gcHRyICovCisJc091dFcoQ2hQLT5JbmRleERhdGEsIDApOworCUNoUC0+VHhQcmlvQ250ID0gQ2hPZmYgKyBfVFhQX0NOVDsKKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4UHJpb0NudCk7CisJc091dEIoQ2hQLT5JbmRleERhdGEsIDApOworCUNoUC0+VHhQcmlvUHRyID0gQ2hPZmYgKyBfVFhQX1BOVFI7CisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5UeFByaW9QdHIpOworCXNPdXRCKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlDaFAtPlR4UHJpb0J1ZiA9IENoT2ZmICsgX1RYUF9CVUY7CisJc0VuUnhQcm9jZXNzb3IoQ2hQKTsJLyogc3RhcnQgdGhlIFJ4IHByb2Nlc3NvciAqLworCisJcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTdG9wUnhQcm9jZXNzb3IKK1B1cnBvc2U6ICBTdG9wIHRoZSByZWNlaXZlIHByb2Nlc3NvciBmcm9tIHByb2Nlc3NpbmcgYSBjaGFubmVsLgorQ2FsbDogICAgIHNTdG9wUnhQcm9jZXNzb3IoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKworQ29tbWVudHM6IFRoZSByZWNlaXZlIHByb2Nlc3NvciBjYW4gYmUgc3RhcnRlZCBhZ2FpbiB3aXRoIHNTdGFydFJ4UHJvY2Vzc29yKCkuCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYXVzZXMgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIHRvIHNraXAgb3ZlciB0aGUKKyAgICAgICAgICBzdG9wcGVkIGNoYW5uZWwuICBJdCBkb2VzIG5vdCBzdG9wIGl0IGZyb20gcHJvY2Vzc2luZyBvdGhlciBjaGFubmVscy4KKworV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgICBEbyBub3QgbGVhdmUgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIHN0b3BwZWQgZm9yIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgICBjaGFyYWN0ZXIgdGltZS4KKworICAgICAgICAgIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhIGRlbGF5IG9mIDQgdVMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlCisgICAgICAgICAgdGhhdCB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgaXMgbm8gbG9uZ2VyIHByb2Nlc3NpbmcgdGhpcyBjaGFubmVsLgorKi8KK3ZvaWQgc1N0b3BSeFByb2Nlc3NvcihDSEFOTkVMX1QgKiBDaFApCit7CisJQnl0ZV90IFJbNF07CisKKwlSWzBdID0gQ2hQLT5SWzBdOworCVJbMV0gPSBDaFAtPlJbMV07CisJUlsyXSA9IDB4MGE7CisJUlszXSA9IENoUC0+UlszXTsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIFJbMF0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0ZsdXNoUnhGSUZPCitQdXJwb3NlOiAgRmx1c2ggdGhlIFJ4IEZJRk8KK0NhbGw6ICAgICBzRmx1c2hSeEZJRk8oQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK1JldHVybjogICB2b2lkCitDb21tZW50czogVG8gcHJldmVudCBkYXRhIGZyb20gYmVpbmcgZW5xdWV1ZWQgb3IgZGVxdWV1ZWQgaW4gdGhlIFR4IEZJRk8KKyAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyBmbHVzaGVkIHRoZSByZWNlaXZlIHByb2Nlc3NvciBpcyBzdG9wcGVkCisgICAgICAgICAgYW5kIHRoZSB0cmFuc21pdHRlciBpcyBkaXNhYmxlZC4gIEFmdGVyIHRoZXNlIG9wZXJhdGlvbnMgYQorICAgICAgICAgIDQgdVMgZGVsYXkgaXMgZG9uZSBiZWZvcmUgY2xlYXJpbmcgdGhlIHBvaW50ZXJzIHRvIGFsbG93CisgICAgICAgICAgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIHRvIHN0b3AuICBUaGVzZSBpdGVtcyBhcmUgaGFuZGxlZCBpbnNpZGUKKyAgICAgICAgICB0aGlzIGZ1bmN0aW9uLgorV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisqLwordm9pZCBzRmx1c2hSeEZJRk8oQ0hBTk5FTF9UICogQ2hQKQoreworCWludCBpOworCUJ5dGVfdCBDaDsJCS8qIGNoYW5uZWwgbnVtYmVyIHdpdGhpbiBBSU9QICovCisJaW50IFJ4RklGT0VuYWJsZWQ7CS8qIFRSVUUgaWYgUnggRklGTyBlbmFibGVkICovCisKKwlpZiAoc0dldFJ4Q250KENoUCkgPT0gMCkJLyogUnggRklGTyBlbXB0eSAqLworCQlyZXR1cm47CQkvKiBkb24ndCBuZWVkIHRvIGZsdXNoICovCisKKwlSeEZJRk9FbmFibGVkID0gRkFMU0U7CisJaWYgKENoUC0+UlsweDMyXSA9PSAweDA4KSB7CS8qIFJ4IEZJRk8gaXMgZW5hYmxlZCAqLworCQlSeEZJRk9FbmFibGVkID0gVFJVRTsKKwkJc0Rpc1J4RklGTyhDaFApOwkvKiBkaXNhYmxlIGl0ICovCisJCWZvciAoaSA9IDA7IGkgPCAyMDAwIC8gMjAwOyBpKyspCS8qIGRlbGF5IDIgdVMgdG8gYWxsb3cgcHJvYyB0byBkaXNhYmxlIEZJRk8gKi8KKwkJCXNJbkIoQ2hQLT5JbnRDaGFuKTsJLyogZGVwZW5kcyBvbiBidXMgaS9vIHRpbWluZyAqLworCX0KKwlzR2V0Q2hhblN0YXR1cyhDaFApOwkvKiBjbGVhciBhbnkgcGVuZGluZyBSeCBlcnJvcnMgaW4gY2hhbiBzdGF0ICovCisJQ2ggPSAoQnl0ZV90KSBzR2V0Q2hhbk51bShDaFApOworCXNPdXRCKENoUC0+Q21kLCBDaCB8IFJFU1JYRkNOVCk7CS8qIGFwcGx5IHJlc2V0IFJ4IEZJRk8gY291bnQgKi8KKwlzT3V0QihDaFAtPkNtZCwgQ2gpOwkvKiByZW1vdmUgcmVzZXQgUnggRklGTyBjb3VudCAqLworCXNPdXRXKChXb3JkSU9fdCkgQ2hQLT5JbmRleEFkZHIsIENoUC0+UnhGSUZPUHRycyk7CS8qIGNsZWFyIFJ4IG91dCBwdHIgKi8KKwlzT3V0VyhDaFAtPkluZGV4RGF0YSwgMCk7CisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5SeEZJRk9QdHJzICsgMik7CS8qIGNsZWFyIFJ4IGluIHB0ciAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlpZiAoUnhGSUZPRW5hYmxlZCkKKwkJc0VuUnhGSUZPKENoUCk7CS8qIGVuYWJsZSBSeCBGSUZPICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRmx1c2hUeEZJRk8KK1B1cnBvc2U6ICBGbHVzaCB0aGUgVHggRklGTworQ2FsbDogICAgIHNGbHVzaFR4RklGTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIHZvaWQKK0NvbW1lbnRzOiBUbyBwcmV2ZW50IGRhdGEgZnJvbSBiZWluZyBlbnF1ZXVlZCBvciBkZXF1ZXVlZCBpbiB0aGUgVHggRklGTworICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIGZsdXNoZWQgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGlzIHN0b3BwZWQKKyAgICAgICAgICBhbmQgdGhlIHRyYW5zbWl0dGVyIGlzIGRpc2FibGVkLiAgQWZ0ZXIgdGhlc2Ugb3BlcmF0aW9ucyBhCisgICAgICAgICAgNCB1UyBkZWxheSBpcyBkb25lIGJlZm9yZSBjbGVhcmluZyB0aGUgcG9pbnRlcnMgdG8gYWxsb3cKKyAgICAgICAgICB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgdG8gc3RvcC4gIFRoZXNlIGl0ZW1zIGFyZSBoYW5kbGVkIGluc2lkZQorICAgICAgICAgIHRoaXMgZnVuY3Rpb24uCitXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKyovCit2b2lkIHNGbHVzaFR4RklGTyhDSEFOTkVMX1QgKiBDaFApCit7CisJaW50IGk7CisJQnl0ZV90IENoOwkJLyogY2hhbm5lbCBudW1iZXIgd2l0aGluIEFJT1AgKi8KKwlpbnQgVHhFbmFibGVkOwkJLyogVFJVRSBpZiB0cmFuc21pdHRlciBlbmFibGVkICovCisKKwlpZiAoc0dldFR4Q250KENoUCkgPT0gMCkJLyogVHggRklGTyBlbXB0eSAqLworCQlyZXR1cm47CQkvKiBkb24ndCBuZWVkIHRvIGZsdXNoICovCisKKwlUeEVuYWJsZWQgPSBGQUxTRTsKKwlpZiAoQ2hQLT5UeENvbnRyb2xbM10gJiBUWF9FTkFCTEUpIHsKKwkJVHhFbmFibGVkID0gVFJVRTsKKwkJc0Rpc1RyYW5zbWl0KENoUCk7CS8qIGRpc2FibGUgdHJhbnNtaXR0ZXIgKi8KKwl9CisJc1N0b3BSeFByb2Nlc3NvcihDaFApOwkvKiBzdG9wIFJ4IHByb2Nlc3NvciAqLworCWZvciAoaSA9IDA7IGkgPCA0MDAwIC8gMjAwOyBpKyspCS8qIGRlbGF5IDQgdVMgdG8gYWxsb3cgcHJvYyB0byBzdG9wICovCisJCXNJbkIoQ2hQLT5JbnRDaGFuKTsJLyogZGVwZW5kcyBvbiBidXMgaS9vIHRpbWluZyAqLworCUNoID0gKEJ5dGVfdCkgc0dldENoYW5OdW0oQ2hQKTsKKwlzT3V0QihDaFAtPkNtZCwgQ2ggfCBSRVNUWEZDTlQpOwkvKiBhcHBseSByZXNldCBUeCBGSUZPIGNvdW50ICovCisJc091dEIoQ2hQLT5DbWQsIENoKTsJLyogcmVtb3ZlIHJlc2V0IFR4IEZJRk8gY291bnQgKi8KKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4RklGT1B0cnMpOwkvKiBjbGVhciBUeCBpbi9vdXQgcHRycyAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlpZiAoVHhFbmFibGVkKQorCQlzRW5UcmFuc21pdChDaFApOwkvKiBlbmFibGUgdHJhbnNtaXR0ZXIgKi8KKwlzU3RhcnRSeFByb2Nlc3NvcihDaFApOwkvKiByZXN0YXJ0IFJ4IHByb2Nlc3NvciAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1dyaXRlVHhQcmlvQnl0ZQorUHVycG9zZTogIFdyaXRlIGEgYnl0ZSBvZiBwcmlvcml0eSB0cmFuc21pdCBkYXRhIHRvIGEgY2hhbm5lbAorQ2FsbDogICAgIHNXcml0ZVR4UHJpb0J5dGUoQ2hQLERhdGEpCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIEJ5dGVfdCBEYXRhOyBUaGUgdHJhbnNtaXQgZGF0YSBieXRlCisKK1JldHVybjogICBpbnQ6IDEgaWYgdGhlIGJ5dGVzIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLCBvdGhlcndpc2UgMC4KKworQ29tbWVudHM6IFRoZSBwcmlvcml0eSBieXRlIGlzIHRyYW5zbWl0dGVkIGJlZm9yZSBhbnkgZGF0YSBpbiB0aGUgVHggRklGTy4KKworV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisqLworaW50IHNXcml0ZVR4UHJpb0J5dGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgRGF0YSkKK3sKKwlCeXRlX3QgRFdCdWZbNF07CS8qIGJ1ZmZlciBmb3IgZG91YmxlIHdvcmQgd3JpdGVzICovCisJV29yZF90ICpXb3JkUHRyOwkvKiBtdXN0IGJlIGZhciBiZWNhdXNlIFdpbiBTUyAhPSBEUyAqLworCXJlZ2lzdGVyIERXb3JkSU9fdCBJbmRleEFkZHI7CisKKwlpZiAoc0dldFR4Q250KENoUCkgPiAxKSB7CS8qIHdyaXRlIGl0IHRvIFR4IHByaW9yaXR5IGJ1ZmZlciAqLworCQlJbmRleEFkZHIgPSBDaFAtPkluZGV4QWRkcjsKKwkJc091dFcoKFdvcmRJT190KSBJbmRleEFkZHIsIENoUC0+VHhQcmlvQ250KTsJLyogZ2V0IHByaW9yaXR5IGJ1ZmZlciBzdGF0dXMgKi8KKwkJaWYgKHNJbkIoKEJ5dGVJT190KSBDaFAtPkluZGV4RGF0YSkgJiBQUklfUEVORCkJLyogcHJpb3JpdHkgYnVmZmVyIGJ1c3kgKi8KKwkJCXJldHVybiAoMCk7CS8qIG5vdGhpbmcgc2VudCAqLworCisJCVdvcmRQdHIgPSAoV29yZF90ICopICgmRFdCdWZbMF0pOworCQkqV29yZFB0ciA9IENoUC0+VHhQcmlvQnVmOwkvKiBkYXRhIGJ5dGUgYWRkcmVzcyAqLworCisJCURXQnVmWzJdID0gRGF0YTsJLyogZGF0YSBieXRlIHZhbHVlICovCisJCXNPdXREVyhJbmRleEFkZHIsICooKERXb3JkX3QgKikgKCZEV0J1ZlswXSkpKTsJLyogd3JpdGUgaXQgb3V0ICovCisKKwkJKldvcmRQdHIgPSBDaFAtPlR4UHJpb0NudDsJLyogVHggcHJpb3JpdHkgY291bnQgYWRkcmVzcyAqLworCisJCURXQnVmWzJdID0gUFJJX1BFTkQgKyAxOwkvKiBpbmRpY2F0ZSAxIGJ5dGUgcGVuZGluZyAqLworCQlEV0J1ZlszXSA9IDA7CS8qIHByaW9yaXR5IGJ1ZmZlciBwb2ludGVyICovCisJCXNPdXREVyhJbmRleEFkZHIsICooKERXb3JkX3QgKikgKCZEV0J1ZlswXSkpKTsJLyogd3JpdGUgaXQgb3V0ICovCisJfSBlbHNlIHsJCS8qIHdyaXRlIGl0IHRvIFR4IEZJRk8gKi8KKworCQlzV3JpdGVUeEJ5dGUoc0dldFR4UnhEYXRhSU8oQ2hQKSwgRGF0YSk7CisJfQorCXJldHVybiAoMSk7CQkvKiAxIGJ5dGUgc2VudCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuSW50ZXJydXB0cworUHVycG9zZTogIEVuYWJsZSBvbmUgb3IgbW9yZSBpbnRlcnJ1cHRzIGZvciBhIGNoYW5uZWwKK0NhbGw6ICAgICBzRW5JbnRlcnJ1cHRzKENoUCxGbGFncykKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgV29yZF90IEZsYWdzOiBJbnRlcnJ1cHQgZW5hYmxlIGZsYWdzLCBjYW4gYmUgYW55IGNvbWJpbmF0aW9uCisgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICAgICAgICBUWElOVF9FTjogICBJbnRlcnJ1cHQgb24gVHggRklGTyBlbXB0eQorICAgICAgICAgICAgICAgIFJYSU5UX0VOOiAgIEludGVycnVwdCBvbiBSeCBGSUZPIGF0IHRyaWdnZXIgbGV2ZWwgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTZXRSeFRyaWdnZXIoKSkKKyAgICAgICAgICAgICAgICBTUkNJTlRfRU46ICBJbnRlcnJ1cHQgb24gU1JDIChTcGVjaWFsIFJ4IENvbmRpdGlvbikKKyAgICAgICAgICAgICAgICBNQ0lOVF9FTjogICBJbnRlcnJ1cHQgb24gbW9kZW0gaW5wdXQgY2hhbmdlCisgICAgICAgICAgICAgICAgQ0hBTklOVF9FTjogQWxsb3cgY2hhbm5lbCBpbnRlcnJ1cHQgc2lnbmFsIHRvIHRoZSBBSU9QJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3Rlci4KK1JldHVybjogICB2b2lkCitDb21tZW50czogSWYgYW4gaW50ZXJydXB0IGVuYWJsZSBmbGFnIGlzIHNldCBpbiBGbGFncywgdGhhdCBpbnRlcnJ1cHQgd2lsbCBiZQorICAgICAgICAgIGVuYWJsZWQuICBJZiBhbiBpbnRlcnJ1cHQgZW5hYmxlIGZsYWcgaXMgbm90IHNldCBpbiBGbGFncywgdGhhdAorICAgICAgICAgIGludGVycnVwdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgSW50ZXJydXB0cyBjYW4gYmUgZGlzYWJsZWQgd2l0aAorICAgICAgICAgIGZ1bmN0aW9uIHNEaXNJbnRlcnJ1cHRzKCkuCisKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlIGJpdCBmb3IgdGhlIGNoYW5uZWwgaW4gdGhlIEFJT1AncworICAgICAgICAgIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIGlmIHRoZSBDSEFOSU5UX0VOIGZsYWcgaXMgc2V0LiAgVGhpcyBhbGxvd3MKKyAgICAgICAgICB0aGlzIGNoYW5uZWwncyBiaXQgdG8gYmUgc2V0IGluIHRoZSBBSU9QJ3MgSW50ZXJydXB0IENoYW5uZWwgUmVnaXN0ZXIuCisKKyAgICAgICAgICBJbnRlcnJ1cHRzIG11c3QgYWxzbyBiZSBnbG9iYWxseSBlbmFibGVkIGJlZm9yZSBjaGFubmVsIGludGVycnVwdHMKKyAgICAgICAgICB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgaG9zdC4gIFRoaXMgaXMgZG9uZSB3aXRoIGZ1bmN0aW9uCisgICAgICAgICAgc0VuR2xvYmFsSW50KCkuCisKKyAgICAgICAgICBJbiBzb21lIGNhc2VzIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGdsb2JhbGx5IGJ1dAorICAgICAgICAgIGVuYWJsZSBjaGFubmVsIGludGVycnVwdHMuICBUaGlzIHdvdWxkIGFsbG93IHRoZSBnbG9iYWwgaW50ZXJydXB0CisgICAgICAgICAgc3RhdHVzIHJlZ2lzdGVyIHRvIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEFJT1BzIG5lZWQgc2VydmljZS4KKyovCit2b2lkIHNFbkludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpCit7CisJQnl0ZV90IE1hc2s7CQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisJQ2hQLT5SeENvbnRyb2xbMl0gfD0KKwkgICAgKChCeXRlX3QpIEZsYWdzICYgKFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgTUNJTlRfRU4pKTsKKworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5SeENvbnRyb2xbMF0pOworCisJQ2hQLT5UeENvbnRyb2xbMl0gfD0gKChCeXRlX3QpIEZsYWdzICYgVFhJTlRfRU4pOworCisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4Q29udHJvbFswXSk7CisKKwlpZiAoRmxhZ3MgJiBDSEFOSU5UX0VOKSB7CisJCU1hc2sgPSBzSW5CKENoUC0+SW50TWFzaykgfCBzQml0TWFwU2V0VGJsW0NoUC0+Q2hhbk51bV07CisJCXNPdXRCKENoUC0+SW50TWFzaywgTWFzayk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0Rpc0ludGVycnVwdHMKK1B1cnBvc2U6ICBEaXNhYmxlIG9uZSBvciBtb3JlIGludGVycnVwdHMgZm9yIGEgY2hhbm5lbAorQ2FsbDogICAgIHNEaXNJbnRlcnJ1cHRzKENoUCxGbGFncykKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgV29yZF90IEZsYWdzOiBJbnRlcnJ1cHQgZmxhZ3MsIGNhbiBiZSBhbnkgY29tYmluYXRpb24KKyAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgICAgICAgIFRYSU5UX0VOOiAgIEludGVycnVwdCBvbiBUeCBGSUZPIGVtcHR5CisgICAgICAgICAgICAgICAgUlhJTlRfRU46ICAgSW50ZXJydXB0IG9uIFJ4IEZJRk8gYXQgdHJpZ2dlciBsZXZlbCAoc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NldFJ4VHJpZ2dlcigpKQorICAgICAgICAgICAgICAgIFNSQ0lOVF9FTjogIEludGVycnVwdCBvbiBTUkMgKFNwZWNpYWwgUnggQ29uZGl0aW9uKQorICAgICAgICAgICAgICAgIE1DSU5UX0VOOiAgIEludGVycnVwdCBvbiBtb2RlbSBpbnB1dCBjaGFuZ2UKKyAgICAgICAgICAgICAgICBDSEFOSU5UX0VOOiBEaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0IHNpZ25hbCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSU9QJ3MgSW50ZXJydXB0IENoYW5uZWwgUmVnaXN0ZXIuCitSZXR1cm46ICAgdm9pZAorQ29tbWVudHM6IElmIGFuIGludGVycnVwdCBmbGFnIGlzIHNldCBpbiBGbGFncywgdGhhdCBpbnRlcnJ1cHQgd2lsbCBiZQorICAgICAgICAgIGRpc2FibGVkLiAgSWYgYW4gaW50ZXJydXB0IGZsYWcgaXMgbm90IHNldCBpbiBGbGFncywgdGhhdAorICAgICAgICAgIGludGVycnVwdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgSW50ZXJydXB0cyBjYW4gYmUgZW5hYmxlZCB3aXRoCisgICAgICAgICAgZnVuY3Rpb24gc0VuSW50ZXJydXB0cygpLgorCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGFwcHJvcHJpYXRlIGJpdCBmb3IgdGhlIGNoYW5uZWwgaW4gdGhlIEFJT1AncworICAgICAgICAgIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIGlmIHRoZSBDSEFOSU5UX0VOIGZsYWcgaXMgc2V0LiAgVGhpcyBibG9ja3MKKyAgICAgICAgICB0aGlzIGNoYW5uZWwncyBiaXQgZnJvbSBiZWluZyBzZXQgaW4gdGhlIEFJT1AncyBJbnRlcnJ1cHQgQ2hhbm5lbAorICAgICAgICAgIFJlZ2lzdGVyLgorKi8KK3ZvaWQgc0Rpc0ludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpCit7CisJQnl0ZV90IE1hc2s7CQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisJQ2hQLT5SeENvbnRyb2xbMl0gJj0KKwkgICAgfigoQnl0ZV90KSBGbGFncyAmIChSWElOVF9FTiB8IFNSQ0lOVF9FTiB8IE1DSU5UX0VOKSk7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlJ4Q29udHJvbFswXSk7CisJQ2hQLT5UeENvbnRyb2xbMl0gJj0gfigoQnl0ZV90KSBGbGFncyAmIFRYSU5UX0VOKTsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhDb250cm9sWzBdKTsKKworCWlmIChGbGFncyAmIENIQU5JTlRfRU4pIHsKKwkJTWFzayA9IHNJbkIoQ2hQLT5JbnRNYXNrKSAmIHNCaXRNYXBDbHJUYmxbQ2hQLT5DaGFuTnVtXTsKKwkJc091dEIoQ2hQLT5JbnRNYXNrLCBNYXNrKTsKKwl9Cit9CisKK3ZvaWQgc1NldEludGVyZmFjZU1vZGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgbW9kZSkKK3sKKwlzT3V0QihDaFAtPkN0bFAtPkFpb3BJT1syXSwgKG1vZGUgJiAweDE4KSB8IENoUC0+Q2hhbk51bSk7Cit9CisKKy8qCisgKiAgTm90IGFuIG9mZmljaWFsIFNTQ0kgZnVuY3Rpb24sIGJ1dCBob3cgdG8gcmVzZXQgUm9ja2V0TW9kZW1zLgorICogIElTQSBidXMgdmVyc2lvbgorICovCit2b2lkIHNNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pCit7CisJQnl0ZUlPX3QgYWRkcjsKKwlCeXRlX3QgdmFsOworCisJYWRkciA9IEN0bFAtPkFpb3BJT1swXSArIDB4NDAwOworCXZhbCA9IHNJbkIoQ3RsUC0+TVJlZzNJTyk7CisJLyogaWYgQUlPUFsxXSBpcyBub3QgZW5hYmxlZCwgZW5hYmxlIGl0ICovCisJaWYgKCh2YWwgJiAyKSA9PSAwKSB7CisJCXZhbCA9IHNJbkIoQ3RsUC0+TVJlZzJJTyk7CisJCXNPdXRCKEN0bFAtPk1SZWcySU8sICh2YWwgJiAweGZjKSB8ICgxICYgMHgwMykpOworCQlzT3V0QihDdGxQLT5NQmFzZUlPLCAodW5zaWduZWQgY2hhcikgKGFkZHIgPj4gNikpOworCX0KKworCXNFbkFpb3AoQ3RsUCwgMSk7CisJaWYgKCFvbikKKwkJYWRkciArPSA4OworCXNPdXRCKGFkZHIgKyBjaGFuLCAwKTsJLyogYXBwbHkgb3IgcmVtb3ZlIHJlc2V0ICovCisJc0Rpc0Fpb3AoQ3RsUCwgMSk7Cit9CisKKy8qCisgKiAgTm90IGFuIG9mZmljaWFsIFNTQ0kgZnVuY3Rpb24sIGJ1dCBob3cgdG8gcmVzZXQgUm9ja2V0TW9kZW1zLgorICogIFBDSSBidXMgdmVyc2lvbgorICovCit2b2lkIHNQQ0lNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pCit7CisJQnl0ZUlPX3QgYWRkcjsKKworCWFkZHIgPSBDdGxQLT5BaW9wSU9bMF0gKyAweDQwOwkvKiAybmQgQUlPUCAqLworCWlmICghb24pCisJCWFkZHIgKz0gODsKKwlzT3V0QihhZGRyICsgY2hhbiwgMCk7CS8qIGFwcGx5IG9yIHJlbW92ZSByZXNldCAqLworfQorCisvKiAgUmVzZXRzIHRoZSBzcGVha2VyIGNvbnRyb2xsZXIgb24gUm9ja2V0TW9kZW0gSUkgYW5kIElJSSBkZXZpY2VzICovCitzdGF0aWMgdm9pZCBybVNwZWFrZXJSZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCB1bnNpZ25lZCBsb25nIG1vZGVsKQoreworCUJ5dGVJT190IGFkZHI7CisKKwkvKiBSb2NrZXRNb2RlbSBJSSBzcGVha2VyIGNvbnRyb2wgaXMgYXQgdGhlIDh0aCBwb3J0IGxvY2F0aW9uIG9mIG9mZnNldCAweDQwICovCisJaWYgKChtb2RlbCA9PSBNT0RFTF9SUDRNKSB8fCAobW9kZWwgPT0gTU9ERUxfUlA2TSkpIHsKKwkJYWRkciA9IEN0bFAtPkFpb3BJT1swXSArIDB4NEY7CisJCXNPdXRCKGFkZHIsIDApOworCX0KKworCS8qIFJvY2tldE1vZGVtIElJSSBzcGVha2VyIGNvbnRyb2wgaXMgYXQgdGhlIDFzdCBwb3J0IGxvY2F0aW9uIG9mIG9mZnNldCAweDgwICovCisJaWYgKChtb2RlbCA9PSBNT0RFTF9VUENJX1JNM184UE9SVCkKKwkgICAgfHwgKG1vZGVsID09IE1PREVMX1VQQ0lfUk0zXzRQT1JUKSkgeworCQlhZGRyID0gQ3RsUC0+QWlvcElPWzBdICsgMHg4ODsKKwkJc091dEIoYWRkciwgMCk7CisJfQorfQorCisvKiAgUmV0dXJucyB0aGUgbGluZSBudW1iZXIgZ2l2ZW4gdGhlIGNvbnRyb2xsZXIgKGJvYXJkKSwgYWlvcCBhbmQgY2hhbm5lbCBudW1iZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEdldExpbmVOdW1iZXIoaW50IGN0cmwsIGludCBhaW9wLCBpbnQgY2gpCit7CisJcmV0dXJuIGxpbmVOdW1iZXJzWyhjdHJsIDw8IDUpIHwgKGFpb3AgPDwgMykgfCBjaF07Cit9CisKKy8qCisgKiAgU3RvcmVzIHRoZSBsaW5lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBjb250cm9sbGVyIChib2FyZCksIGFpb3AKKyAqICBhbmQgY2hhbm5lbCBudW1iZXIuICAKKyAqICBSZXR1cm5zOiAgVGhlIGxpbmUgbnVtYmVyIGFzc2lnbmVkIAorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBTZXRMaW5lTnVtYmVyKGludCBjdHJsLCBpbnQgYWlvcCwgaW50IGNoKQoreworCWxpbmVOdW1iZXJzWyhjdHJsIDw8IDUpIHwgKGFpb3AgPDwgMykgfCBjaF0gPSBuZXh0TGluZU51bWJlcisrOworCXJldHVybiAobmV4dExpbmVOdW1iZXIgLSAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuaCBiL2RyaXZlcnMvY2hhci9yb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTZiMDRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogcm9ja2V0LmggLS0tIHRoZSBleHBvcnRlZCBpbnRlcmZhY2Ugb2YgdGhlIHJvY2tldCBkcml2ZXIgdG8gaXRzIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbS4KKyAqCisgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIENvcHlyaWdodCAxOTk3LgorICogQ29weXJpZ2h0IDE5OTcgQ29tdHJvbCBDb3Jwb3JhdGlvbi4gCisgKgorICovCisKKy8qICBNb2RlbCBJbmZvcm1hdGlvbiBTdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1vZGVsOworCWNoYXIgbW9kZWxTdHJpbmdbODBdOworCXVuc2lnbmVkIGxvbmcgbnVtUG9ydHM7CisJaW50IGxvYWRybTI7CisJaW50IHN0YXJ0aW5nUG9ydE51bWJlcjsKK30gcm9ja2V0TW9kZWxfdDsKKworc3RydWN0IHJvY2tldF9jb25maWcgeworCWludCBsaW5lOworCWludCBmbGFnczsKKwlpbnQgY2xvc2luZ193YWl0OworCWludCBjbG9zZV9kZWxheTsKKwlpbnQgcG9ydDsKKwlpbnQgcmVzZXJ2ZWRbMzJdOworfTsKKworc3RydWN0IHJvY2tldF9wb3J0cyB7CisJaW50IHR0eV9tYWpvcjsKKwlpbnQgY2FsbG91dF9tYWpvcjsKKwlyb2NrZXRNb2RlbF90IHJvY2tldE1vZGVsWzhdOworfTsKKworc3RydWN0IHJvY2tldF92ZXJzaW9uIHsKKwljaGFyIHJvY2tldF92ZXJzaW9uWzMyXTsKKwljaGFyIHJvY2tldF9kYXRlWzMyXTsKKwljaGFyIHJlc2VydmVkWzY0XTsKK307CisKKy8qCisgKiBSb2NrZXRwb3J0IGZsYWdzCisgKi8KKyNkZWZpbmUgUk9DS0VUX0NBTExPVVRfTk9IVVAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBST0NLRVRfRk9SQ0VfQ0QJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUk9DS0VUX0hVUF9OT1RJRlkJMHgwMDAwMDAwNAorI2RlZmluZSBST0NLRVRfU1BMSVRfVEVSTUlPUwkweDAwMDAwMDA4CisjZGVmaW5lIFJPQ0tFVF9TUERfTUFTSwkJMHgwMDAwMDA3MAorI2RlZmluZSBST0NLRVRfU1BEX0hJCQkweDAwMDAwMDEwCS8qIFVzZSA1NjAwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBST0NLRVRfU1BEX1ZISQkJMHgwMDAwMDAyMAkvKiBVc2UgMTE1MjAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCisjZGVmaW5lIFJPQ0tFVF9TUERfU0hJCQkweDAwMDAwMDMwCS8qIFVzZSAyMzA0MDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgUk9DS0VUX1NQRF9XQVJQCSAgICAgICAgMHgwMDAwMDA0MAkvKiBVc2UgNDYwODAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCisjZGVmaW5lIFJPQ0tFVF9TQUsJCTB4MDAwMDAwODAKKyNkZWZpbmUgUk9DS0VUX1NFU1NJT05fTE9DS09VVAkweDAwMDAwMTAwCisjZGVmaW5lIFJPQ0tFVF9QR1JQX0xPQ0tPVVQJMHgwMDAwMDIwMAorI2RlZmluZSBST0NLRVRfUlRTX1RPR0dMRQkweDAwMDAwNDAwCisjZGVmaW5lIFJPQ0tFVF9NT0RFX01BU0sgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgUk9DS0VUX01PREVfUlMyMzIgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBST0NLRVRfTU9ERV9SUzQ4NSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFJPQ0tFVF9NT0RFX1JTNDIyICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUk9DS0VUX0ZMQUdTCQkweDAwMDAzRkZGCisKKyNkZWZpbmUgUk9DS0VUX1VTUl9NQVNLIDB4MDA3MQkvKiBMZWdhbCBmbGFncyB0aGF0IG5vbi1wcml2aWxlZ2VkCisJCQkJICogdXNlcnMgY2FuIHNldCBvciByZXNldCAqLworCisvKgorICogRm9yIGNsb3Npbmdfd2FpdCBhbmQgY2xvc2luZ193YWl0MgorICovCisjZGVmaW5lIFJPQ0tFVF9DTE9TSU5HX1dBSVRfTk9ORQk2NTUzNQorI2RlZmluZSBST0NLRVRfQ0xPU0lOR19XQUlUX0lORgkJMAorCisvKgorICogUm9ja2V0cG9ydCBpb2N0bHMgLS0gIlJQIgorICovCisjZGVmaW5lIFJDS1BfR0VUX1NUUlVDVAkJMHgwMDUyNTAwMQorI2RlZmluZSBSQ0tQX0dFVF9DT05GSUcJCTB4MDA1MjUwMDIKKyNkZWZpbmUgUkNLUF9TRVRfQ09ORklHCQkweDAwNTI1MDAzCisjZGVmaW5lIFJDS1BfR0VUX1BPUlRTCQkweDAwNTI1MDA0CisjZGVmaW5lIFJDS1BfUkVTRVRfUk0yCQkweDAwNTI1MDA1CisjZGVmaW5lIFJDS1BfR0VUX1ZFUlNJT04JMHgwMDUyNTAwNgorCisvKiAgUm9ja2V0cG9ydCBNb2RlbHMgKi8KKyNkZWZpbmUgTU9ERUxfUlAzMklOVEYgICAgICAgIDB4MDAwMQkvKiBSUCAzMiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA4SU5URiAgICAgICAgIDB4MDAwMgkvKiBSUCA4IHBvcnQgdy9leHRlcm5hbCBJL0YgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlAxNklOVEYgICAgICAgIDB4MDAwMwkvKiBSUCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA4T0NUQSAgICAgICAgIDB4MDAwNQkvKiBSUCA4IHBvcnQgdy9vY3RhIGNhYmxlICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA0UVVBRCAgICAgICAgIDB4MDAwNAkvKiBSUCA0IHBvcnQgdy9xdWFkIGNhYmxlICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA4SiAgICAgICAgICAgIDB4MDAwNgkvKiBSUCA4IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMgKi8KKyNkZWZpbmUgTU9ERUxfUlA0SiAgICAgICAgICAgIDB4MDAwNwkvKiBSUCA0IHBvcnQgdy9SSjQ1IGNvbm5lY3RvcnMgKi8KKyNkZWZpbmUgTU9ERUxfUlA4U05JICAgICAgICAgIDB4MDAwOAkvKiBSUCA4IHBvcnQgdy8gREI3OCBTTkkgY29ubmVjdG9yICovCisjZGVmaW5lIE1PREVMX1JQMTZTTkkgICAgICAgICAweDAwMDkJLyogUlAgMTYgcG9ydCB3LyBEQjc4IFNOSSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgTU9ERUxfUlBQNCAgICAgICAgICAgIDB4MDAwQQkvKiBSUCBQbHVzIDQgcG9ydCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlBQOCAgICAgICAgICAgIDB4MDAwQgkvKiBSUCBQbHVzIDggcG9ydCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlAyXzIzMiAgICAgICAgIDB4MDAwRQkvKiBSUCBQbHVzIDIgcG9ydCBSUzIzMiAgICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlAyXzQyMiAgICAgICAgIDB4MDAwRgkvKiBSUCBQbHVzIDIgcG9ydCBSUzIzMiAgICAgICAgKi8KKworLyogIFJvY2tldG1vZGVtIElJIE1vZGVscyAqLworI2RlZmluZSBNT0RFTF9SUDZNICAgICAgICAgICAgMHgwMDBDCS8qIFJNIDYgcG9ydCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNT0RFTF9SUDRNICAgICAgICAgICAgMHgwMDBECS8qIFJNIDQgcG9ydCAgICAgICAgICAgICAgICAgICAqLworCisvKiBVbml2ZXJzYWwgUENJIGJvYXJkcyAqLworI2RlZmluZSBNT0RFTF9VUENJX1JQMzJJTlRGICAgMHgwODAxCS8qIFJQIFVQQ0kgMzIgcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgKi8KKyNkZWZpbmUgTU9ERUxfVVBDSV9SUDhJTlRGICAgIDB4MDgwMgkvKiBSUCBVUENJIDggcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgICovCisjZGVmaW5lIE1PREVMX1VQQ0lfUlAxNklOVEYgICAweDA4MDMJLyogUlAgVVBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAqLworI2RlZmluZSBNT0RFTF9VUENJX1JQOE9DVEEgICAgMHgwODA1CS8qIFJQIFVQQ0kgOCBwb3J0IHcvb2N0YSBjYWJsZSAgICAgICAgKi8gCisjZGVmaW5lIE1PREVMX1VQQ0lfUk0zXzhQT1JUICAweDA4MEMJLyogUlAgVVBDSSBSb2NrZXRtb2RlbSBJSUkgOCBwb3J0ICAgICAqLworI2RlZmluZSBNT0RFTF9VUENJX1JNM180UE9SVCAgMHgwODBDCS8qIFJQIFVQQ0kgUm9ja2V0bW9kZW0gSUlJIDQgcG9ydCAgICAgKi8KKworLyogIENvbXBhY3QgUENJIDE2IHBvcnQgICovCisjZGVmaW5lIE1PREVMX0NQQ0lfUlAxNklOVEYgICAweDA5MDMJLyogUlAgQ29tcGFjdCBQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiAqLworCisvKiBBbGwgSVNBIGJvYXJkcyAqLworI2RlZmluZSBNT0RFTF9JU0EgICAgICAgICAgICAgMHgxMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI2ODcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApAQCAtMCwwICsxLDEyOTYgQEAKKy8qCisgKiByb2NrZXRfaW50LmggLS0tIGludGVybmFsIGhlYWRlciBmaWxlIGZvciByb2NrZXQuYworICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgQ29weXJpZ2h0IDE5OTcuCisgKiBDb3B5cmlnaHQgMTk5NyBDb210cm9sIENvcnBvcmF0aW9uLiAgCisgKiAKKyAqLworCisvKgorICogRGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgaW4gcmNrdHB0X3R5cGUKKyAqLworI2RlZmluZSBST0NLRVRfVFlQRV9OT1JNQUwJMAorI2RlZmluZSBST0NLRVRfVFlQRV9NT0RFTQkxCisjZGVmaW5lIFJPQ0tFVF9UWVBFX01PREVNSUkJMgorI2RlZmluZSBST0NLRVRfVFlQRV9NT0RFTUlJSQkzCisjZGVmaW5lIFJPQ0tFVF9UWVBFX1BDMTA0ICAgICAgIDQKKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJ5dGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJ5dGVJT190OworCit0eXBlZGVmIHVuc2lnbmVkIGludCBXb3JkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBXb3JkSU9fdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIERXb3JkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBEV29yZElPX3Q7CisKKy8qCisgKiBOb3RlISAgTm9ybWFsbHkgdGhlIExpbnV4IEkvTyBtYWNyb3MgYWxyZWFkeSB0YWtlIGNhcmUgb2YKKyAqIGJ5dGUtc3dhcHBpbmcgdGhlIEkvTyBpbnN0cnVjdGlvbnMuICBIb3dldmVyLCBhbGwgYWNjZXNzZXMgdXNpbmcKKyAqIHNPdXREVyBhcmVuJ3QgcmVhbGx5IDMyLWJpdCBhY2Nlc3NlcywgYnV0IHNob3VsZCBiZSBoYW5kbGVkIGluIGJ5dGUKKyAqIG9yZGVyLiAgSGVuY2UgdGhlIHVzZSBvZiB0aGUgY3B1X3RvX2xlMzIoKSBtYWNybyB0byBieXRlLXN3YXAKKyAqIHRoaW5ncyB0byBuby1vcCB0aGUgYnl0ZSBzd2FwcGluZyBkb25lIGJ5IHRoZSBiaWctZW5kaWFuIG91dGwoKQorICogaW5zdHJ1Y3Rpb24uCisgKi8KKworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTworc3RhdGljIGlubGluZSB2b2lkIHNPdXRCKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisjaWZkZWYgUk9DS0VUX0RFQlVHX0lPCisJcHJpbnRrKCJzT3V0QigleCwgJXgpLi4uIiwgcG9ydCwgdmFsdWUpOworI2VuZGlmCisJb3V0Yl9wKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNPdXRXKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTworCXByaW50aygic091dFcoJXgsICV4KS4uLiIsIHBvcnQsIHZhbHVlKTsKKyNlbmRpZgorCW91dHdfcCh2YWx1ZSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzT3V0RFcodW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyNpZmRlZiBST0NLRVRfREVCVUdfSU8KKwlwcmludGsoInNPdXREVygleCwgJWx4KS4uLiIsIHBvcnQsIHZhbHVlKTsKKyNlbmRpZgorCW91dGxfcChjcHVfdG9fbGUzMih2YWx1ZSksIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc0luQih1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXJldHVybiBpbmJfcChwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzSW5XKHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJcmV0dXJuIGlud19wKHBvcnQpOworfQorCisjZWxzZQkJCQkvKiAhUk9DS0VUX0RFQlVHX0lPICovCisjZGVmaW5lIHNPdXRCKGEsIGIpIG91dGJfcChiLCBhKQorI2RlZmluZSBzT3V0VyhhLCBiKSBvdXR3X3AoYiwgYSkKKyNkZWZpbmUgc091dERXKHBvcnQsIHZhbHVlKSBvdXRsX3AoY3B1X3RvX2xlMzIodmFsdWUpLCBwb3J0KQorI2RlZmluZSBzSW5CKGEpIChpbmJfcChhKSkKKyNkZWZpbmUgc0luVyhhKSAoaW53X3AoYSkpCisjZW5kaWYJCQkJLyogUk9DS0VUX0RFQlVHX0lPICovCisKKy8qIFRoaXMgaXMgdXNlZCB0byBtb3ZlIGFycmF5cyBvZiBieXRlcyBzbyBieXRlIHN3YXBwaW5nIGlzbid0IGFwcHJvcHJpYXRlLiAqLworI2RlZmluZSBzT3V0U3RyVyhwb3J0LCBhZGRyLCBjb3VudCkgaWYgKGNvdW50KSBvdXRzdyhwb3J0LCBhZGRyLCBjb3VudCkKKyNkZWZpbmUgc0luU3RyVyhwb3J0LCBhZGRyLCBjb3VudCkgaWYgKGNvdW50KSBpbnN3KHBvcnQsIGFkZHIsIGNvdW50KQorCisjZGVmaW5lIENUTF9TSVpFIDgKKyNkZWZpbmUgQUlPUF9DVExfU0laRSA0CisjZGVmaW5lIENIQU5fQUlPUF9TSVpFIDgKKyNkZWZpbmUgTUFYX1BPUlRTX1BFUl9BSU9QIDgKKyNkZWZpbmUgTUFYX0FJT1BTX1BFUl9CT0FSRCA0CisjZGVmaW5lIE1BWF9QT1JUU19QRVJfQk9BUkQgMzIKKworLyogQnVzIHR5cGUgSUQgKi8KKyNkZWZpbmUJaXNJU0EJMAorI2RlZmluZQlpc1BDSQkxCisjZGVmaW5lCWlzTUMJMgorCisvKiBDb250cm9sbGVyIElEIG51bWJlcnMgKi8KKyNkZWZpbmUgQ1RMSURfTlVMTCAgLTEJCS8qIG5vIGNvbnRyb2xsZXIgZXhpc3RzICovCisjZGVmaW5lIENUTElEXzAwMDEgIDB4MDAwMQkvKiBjb250cm9sbGVyIHJlbGVhc2UgMSAqLworCisvKiBBSU9QIElEIG51bWJlcnMsIGlkZW50aWZpZXMgQUlPUCB0eXBlIGltcGxlbWVudGluZyBjaGFubmVsICovCisjZGVmaW5lIEFJT1BJRF9OVUxMIC0xCQkvKiBubyBBSU9QIG9yIGNoYW5uZWwgZXhpc3RzICovCisjZGVmaW5lIEFJT1BJRF8wMDAxIDB4MDAwMQkvKiBBSU9QIHJlbGVhc2UgMSAqLworCisjZGVmaW5lIE5VTExERVYgLTEJCS8qIGlkZW50aWZpZXMgbm9uLWV4aXN0YW50IGRldmljZSAqLworI2RlZmluZSBOVUxMQ1RMIC0xCQkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBjb250cm9sbGVyICovCisjZGVmaW5lIE5VTExDVExQVFIgKENPTlRST0xMRVJfVCAqKTAJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgY29udHJvbGxlciAqLworI2RlZmluZSBOVUxMQUlPUCAtMQkJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgQUlPUCAqLworI2RlZmluZSBOVUxMQ0hBTiAtMQkJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgY2hhbm5lbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIFJlZ2lzdGVyIE9mZnNldHMgLSBEaXJlY3QgQWNjZXNzIC0gRml4ZWQgdmFsdWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NNRF9SRUcgICAweDM4CQkvKiBDb21tYW5kIFJlZ2lzdGVyICAgICAgICAgICAgOCAgICBXcml0ZSAqLworI2RlZmluZSBfSU5UX0NIQU4gIDB4MzkJCS8qIEludGVycnVwdCBDaGFubmVsIFJlZ2lzdGVyICA4ICAgIFJlYWQgKi8KKyNkZWZpbmUgX0lOVF9NQVNLICAweDNBCQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAgICAgOCAgICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1VOVVNFRCAgICAweDNCCQkvKiBVbnVzZWQgICAgICAgICAgICAgICAgICAgICAgOCAqLworI2RlZmluZSBfSU5EWF9BRERSIDB4M0MJCS8qIEluZGV4IFJlZ2lzdGVyIEFkZHJlc3MgICAgICAxNiAgIFdyaXRlICovCisjZGVmaW5lIF9JTkRYX0RBVEEgMHgzRQkJLyogSW5kZXggUmVnaXN0ZXIgRGF0YSAgICAgICAgIDgvMTYgUmVhZCAvIFdyaXRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDaGFubmVsIFJlZ2lzdGVyIE9mZnNldHMgZm9yIDFzdCBjaGFubmVsIGluIEFJT1AgLSBEaXJlY3QgQWNjZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9URDAgICAgICAgMHgwMAkJLyogVHJhbnNtaXQgRGF0YSAgICAgICAgICAgICAgIDE2ICAgV3JpdGUgKi8KKyNkZWZpbmUgX1JEMCAgICAgICAweDAwCQkvKiBSZWNlaXZlIERhdGEgICAgICAgICAgICAgICAgMTYgICBSZWFkICovCisjZGVmaW5lIF9DSE5fU1RBVDAgMHgyMAkJLyogQ2hhbm5lbCBTdGF0dXMgICAgICAgICAgICAgIDgvMTYgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9GSUZPX0NOVDAgMHgxMAkJLyogVHJhbnNtaXQvUmVjZWl2ZSBGSUZPIENvdW50IDE2ICAgUmVhZCAqLworI2RlZmluZSBfSU5UX0lEMCAgIDB4MzAJCS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiAgICA4ICAgIFJlYWQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFR4IENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0cyAtIEluZGV4ZWQgLSBFeHRlcm5hbCAtIEZpeGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9UWF9FTkJMUyAgMHg5ODAJLyogVHggUHJvY2Vzc29yIEVuYWJsZXMgUmVnaXN0ZXIgOCBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYQ01QMSAgICAweDk4OAkvKiBUcmFuc21pdCBDb21wYXJlIFZhbHVlICMxICAgICA4IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhDTVAyICAgIDB4OTg5CS8qIFRyYW5zbWl0IENvbXBhcmUgVmFsdWUgIzIgICAgIDggUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWFJFUDFCMSAgMHg5OEEJLyogVHggUmVwbGFjZSBWYWx1ZSAjMSAtIEJ5dGUgMSAgOCBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYUkVQMUIyICAweDk4QgkvKiBUeCBSZXBsYWNlIFZhbHVlICMxIC0gQnl0ZSAyICA4IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhSRVAyICAgIDB4OThDCS8qIFRyYW5zbWl0IFJlcGxhY2UgVmFsdWUgIzIgICAgIDggUmVhZCAvIFdyaXRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01lbW9yeSBDb250cm9sbGVyIFJlZ2lzdGVyIE9mZnNldHMgLSBJbmRleGVkIC0gRXh0ZXJuYWwgLSBGaXhlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfUlhfRklGTyAgICAweDAwMAkvKiBSeCBGSUZPICovCisjZGVmaW5lIF9UWF9GSUZPICAgIDB4ODAwCS8qIFR4IEZJRk8gKi8KKyNkZWZpbmUgX1JYRl9PVVRQICAgMHg5OTAJLyogUnggRklGTyBPVVQgcG9pbnRlciAgICAgICAgMTYgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9SWEZfSU5QICAgIDB4OTkyCS8qIFJ4IEZJRk8gSU4gcG9pbnRlciAgICAgICAgIDE2IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhGX09VVFAgICAweDk5NAkvKiBUeCBGSUZPIE9VVCBwb2ludGVyICAgICAgICA4ICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYRl9JTlAgICAgMHg5OTUJLyogVHggRklGTyBJTiBwb2ludGVyICAgICAgICAgOCAgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWFBfQ05UICAgIDB4OTk2CS8qIFR4IFByaW9yaXR5IENvdW50ICAgICAgICAgIDggIFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhQX1BOVFIgICAweDk5NwkvKiBUeCBQcmlvcml0eSBQb2ludGVyICAgICAgICA4ICBSZWFkIC8gV3JpdGUgKi8KKworI2RlZmluZSBQUklfUEVORCAgICAweDgwCS8qIFByaW9yaXR5IGRhdGEgcGVuZGluZyAoYml0NywgVHggcHJpIGNudCkgKi8KKyNkZWZpbmUgVFhGSUZPX1NJWkUgMjU1CQkvKiBzaXplIG9mIFR4IEZJRk8gKi8KKyNkZWZpbmUgUlhGSUZPX1NJWkUgMTAyMwkvKiBzaXplIG9mIFJ4IEZJRk8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVHggUHJpb3JpdHkgQnVmZmVyIC0gSW5kZXhlZCAtIEV4dGVybmFsIC0gRml4ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX1RYUF9CVUYgICAgMHg5QzAJLyogVHggUHJpb3JpdHkgQnVmZmVyICAzMiAgQnl0ZXMgICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgVFhQX1NJWkUgICAgMHgyMAkvKiAzMiBieXRlcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDaGFubmVsIFJlZ2lzdGVyIE9mZnNldHMgLSBJbmRleGVkIC0gSW50ZXJuYWwgLSBGaXhlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9UWF9DVFJMICAgIDB4RkYwCS8qIFRyYW5zbWl0IENvbnRyb2wgICAgICAgICAgICAgICAxNiAgV3JpdGUgKi8KKyNkZWZpbmUgX1JYX0NUUkwgICAgMHhGRjIJLyogUmVjZWl2ZSBDb250cm9sICAgICAgICAgICAgICAgICA4ICBXcml0ZSAqLworI2RlZmluZSBfQkFVRCAgICAgICAweEZGNAkvKiBCYXVkIFJhdGUgICAgICAgICAgICAgICAgICAgICAgMTYgIFdyaXRlICovCisjZGVmaW5lIF9DTEtfUFJFICAgIDB4RkY2CS8qIENsb2NrIFByZXNjYWxlciAgICAgICAgICAgICAgICAgOCAgV3JpdGUgKi8KKworI2RlZmluZSBTVE1CUkVBSyAgIDB4MDgJCS8qIEJSRUFLICovCisjZGVmaW5lIFNUTUZSQU1FICAgMHgwNAkJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTVE1SQ1ZST1ZSIDB4MDIJCS8qIHJlY2VpdmVyIG92ZXIgcnVuIGVycm9yICovCisjZGVmaW5lIFNUTVBBUklUWSAgMHgwMQkJLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFNUTUVSUk9SICAgKFNUTUJSRUFLIHwgU1RNRlJBTUUgfCBTVE1QQVJJVFkpCisjZGVmaW5lIFNUTUJSRUFLSCAgIDB4ODAwCS8qIEJSRUFLICovCisjZGVmaW5lIFNUTUZSQU1FSCAgIDB4NDAwCS8qIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgU1RNUkNWUk9WUkggMHgyMDAJLyogcmVjZWl2ZXIgb3ZlciBydW4gZXJyb3IgKi8KKyNkZWZpbmUgU1RNUEFSSVRZSCAgMHgxMDAJLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFNUTUVSUk9SSCAgIChTVE1CUkVBS0ggfCBTVE1GUkFNRUggfCBTVE1QQVJJVFlIKQorCisjZGVmaW5lIENUU19BQ1QgICAweDIwCQkvKiBDVFMgaW5wdXQgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUgRFNSX0FDVCAgIDB4MTAJCS8qIERTUiBpbnB1dCBhc3NlcnRlZCAqLworI2RlZmluZSBDRF9BQ1QgICAgMHgwOAkJLyogQ0QgaW5wdXQgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUgVFhGSUZPTVQgIDB4MDQJCS8qIFR4IEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgVFhTSFJNVCAgIDB4MDIJCS8qIFR4IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5ICovCisjZGVmaW5lIFJEQSAgICAgICAweDAxCQkvKiBSeCBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBEUkFJTkVEIChUWEZJRk9NVCB8IFRYU0hSTVQpCS8qIGluZGljYXRlcyBUeCBpcyBkcmFpbmVkICovCisKKyNkZWZpbmUgU1RBVE1PREUgIDB4ODAwMAkvKiBzdGF0dXMgbW9kZSBlbmFibGUgYml0ICovCisjZGVmaW5lIFJYRk9WRVJGTCAweDIwMDAJLyogcmVjZWl2ZSBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lIFJYMk1BVENIICAweDEwMDAJLyogcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMiBtYXRjaCAqLworI2RlZmluZSBSWDFNQVRDSCAgMHgwODAwCS8qIHJlY2VpdmUgY29tcGFyZSBieXRlIDEgbWF0Y2ggKi8KKyNkZWZpbmUgUlhCUkVBSyAgIDB4MDQwMAkvKiByZWNlaXZlZCBCUkVBSyAqLworI2RlZmluZSBSWEZSQU1FICAgMHgwMjAwCS8qIHJlY2VpdmVkIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgUlhQQVJJVFkgIDB4MDEwMAkvKiByZWNlaXZlZCBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVEVSUk9SIChSWEJSRUFLIHwgUlhGUkFNRSB8IFJYUEFSSVRZKQorCisjZGVmaW5lIENUU0ZDX0VOICAweDgwCQkvKiBDVFMgZmxvdyBjb250cm9sIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgUlRTVE9HX0VOIDB4NDAJCS8qIFJUUyB0b2dnbGUgZW5hYmxlIGJpdCAqLworI2RlZmluZSBUWElOVF9FTiAgMHgxMAkJLyogdHJhbnNtaXQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBTVE9QMiAgICAgMHgwOAkJLyogZW5hYmxlIDIgc3RvcCBiaXRzICgwID0gMSBzdG9wKSAqLworI2RlZmluZSBQQVJJVFlfRU4gMHgwNAkJLyogZW5hYmxlIHBhcml0eSAoMCA9IG5vIHBhcml0eSkgKi8KKyNkZWZpbmUgRVZFTl9QQVIgIDB4MDIJCS8qIGV2ZW4gcGFyaXR5ICgwID0gb2RkIHBhcml0eSkgKi8KKyNkZWZpbmUgREFUQThCSVQgIDB4MDEJCS8qIDggYml0IGRhdGEgKDAgPSA3IGJpdCBkYXRhKSAqLworCisjZGVmaW5lIFNFVEJSRUFLICAweDEwCQkvKiBzZW5kIGJyZWFrIGNvbmRpdGlvbiAobXVzdCBjbGVhcikgKi8KKyNkZWZpbmUgTE9DQUxMT09QIDB4MDgJCS8qIGxvY2FsIGxvb3BiYWNrIHNldCBmb3IgdGVzdCAqLworI2RlZmluZSBTRVRfRFRSICAgMHgwNAkJLyogYXNzZXJ0IERUUiAqLworI2RlZmluZSBTRVRfUlRTICAgMHgwMgkJLyogYXNzZXJ0IFJUUyAqLworI2RlZmluZSBUWF9FTkFCTEUgMHgwMQkJLyogZW5hYmxlIHRyYW5zbWl0dGVyICovCisKKyNkZWZpbmUgUlRTRkNfRU4gIDB4NDAJCS8qIFJUUyBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIFJYUFJPQ19FTiAweDIwCQkvKiByZWNlaXZlIHByb2Nlc3NvciBlbmFibGUgKi8KKyNkZWZpbmUgVFJJR19OTyAgIDB4MDAJCS8qIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCAwIChubyB0cmlnZ2VyKSAqLworI2RlZmluZSBUUklHXzEgICAgMHgwOAkJLyogdHJpZ2dlciBsZXZlbCAxIGNoYXIgKi8KKyNkZWZpbmUgVFJJR18xXzIgIDB4MTAJCS8qIHRyaWdnZXIgbGV2ZWwgMS8yICovCisjZGVmaW5lIFRSSUdfN184ICAweDE4CQkvKiB0cmlnZ2VyIGxldmVsIDcvOCAqLworI2RlZmluZSBUUklHX01BU0sgMHgxOAkJLyogdHJpZ2dlciBsZXZlbCBtYXNrICovCisjZGVmaW5lIFNSQ0lOVF9FTiAweDA0CQkvKiBzcGVjaWFsIFJ4IGNvbmRpdGlvbiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFJYSU5UX0VOICAweDAyCQkvKiBSeCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIE1DSU5UX0VOICAweDAxCQkvKiBtb2RlbSBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworCisjZGVmaW5lIFJYRl9UUklHICAweDIwCQkvKiBSeCBGSUZPIHRyaWdnZXIgbGV2ZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIFRYRklGT19NVCAweDEwCQkvKiBUeCBGSUZPIGVtcHR5IGludGVycnVwdCAqLworI2RlZmluZSBTUkNfSU5UICAgMHgwOAkJLyogc3BlY2lhbCByZWNlaXZlIGNvbmRpdGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgREVMVEFfQ0QgIDB4MDQJCS8qIENEIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgREVMVEFfQ1RTIDB4MDIJCS8qIENUUyBjaGFuZ2UgaW50ZXJydXB0ICovCisjZGVmaW5lIERFTFRBX0RTUiAweDAxCQkvKiBEU1IgY2hhbmdlIGludGVycnVwdCAqLworCisjZGVmaW5lIFJFUDFXMl9FTiAweDEwCQkvKiByZXBsYWNlIGJ5dGUgMSB3aXRoIDIgYnl0ZXMgZW5hYmxlICovCisjZGVmaW5lIElHTjJfRU4gICAweDA4CQkvKiBpZ25vcmUgYnl0ZSAyIGVuYWJsZSAqLworI2RlZmluZSBJR04xX0VOICAgMHgwNAkJLyogaWdub3JlIGJ5dGUgMSBlbmFibGUgKi8KKyNkZWZpbmUgQ09NUDJfRU4gIDB4MDIJCS8qIGNvbXBhcmUgYnl0ZSAyIGVuYWJsZSAqLworI2RlZmluZSBDT01QMV9FTiAgMHgwMQkJLyogY29tcGFyZSBieXRlIDEgZW5hYmxlICovCisKKyNkZWZpbmUgUkVTRVRfQUxMIDB4ODAJCS8qIHJlc2V0IEFJT1AgKGFsbCBjaGFubmVscykgKi8KKyNkZWZpbmUgVFhPVkVSSURFIDB4NDAJCS8qIFRyYW5zbWl0IHNvZnR3YXJlIG9mZiBvdmVycmlkZSAqLworI2RlZmluZSBSRVNFVFVBUlQgMHgyMAkJLyogcmVzZXQgY2hhbm5lbCdzIFVBUlQgKi8KKyNkZWZpbmUgUkVTVFhGQ05UIDB4MTAJCS8qIHJlc2V0IGNoYW5uZWwncyBUeCBGSUZPIGNvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIFJFU1JYRkNOVCAweDA4CQkvKiByZXNldCBjaGFubmVsJ3MgUnggRklGTyBjb3VudCByZWdpc3RlciAqLworCisjZGVmaW5lIElOVFNUQVQwICAweDAxCQkvKiBBSU9QIDAgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJTlRTVEFUMSAgMHgwMgkJLyogQUlPUCAxIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgSU5UU1RBVDIgIDB4MDQJCS8qIEFJT1AgMiBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIElOVFNUQVQzICAweDA4CQkvKiBBSU9QIDMgaW50ZXJydXB0IHN0YXR1cyAqLworCisjZGVmaW5lIElOVFJfRU4gICAweDA4CQkvKiBhbGxvdyBpbnRlcnJ1cHRzIHRvIGhvc3QgKi8KKyNkZWZpbmUgSU5UX1NUUk9CIDB4MDQJCS8qIHN0cm9iZSBhbmQgY2xlYXIgaW50ZXJydXB0IGxpbmUgKEVPSSkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgTVVEQkFDIHJlbWFwcGVkIGZvciBQQ0kKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9DRkdfSU5UX1BDSSAgMHg0MAorI2RlZmluZSBfUENJX0lOVF9GVU5DIDB4M0EKKworI2RlZmluZSBQQ0lfU1RST0IgMHgyMDAwCS8qIGJpdCAxMyBvZiBpbnQgYWlvcCByZWdpc3RlciAqLworI2RlZmluZSBJTlRSX0VOX1BDSSAgIDB4MDAxMAkvKiBhbGxvdyBpbnRlcnJ1cHRzIHRvIGhvc3QgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBVbml2ZXJzYWwgUENJIGJvYXJkIHJlZ2lzdGVycworICovCisjZGVmaW5lIF9QQ0lfOTAzMF9JTlRfQ1RSTAkweDRjICAgICAgICAgIC8qIE9mZnNldHMgZnJvbSBCQVIxICovCisjZGVmaW5lIF9QQ0lfOTAzMF9HUElPX0NUUkwJMHg1NAorI2RlZmluZSBQQ0lfSU5UX0NUUkxfQUlPUAkweDAwMDEKKyNkZWZpbmUgUENJX0dQSU9fQ1RSTF84UE9SVAkweDQwMDAKKyNkZWZpbmUgX1BDSV85MDMwX1JJTkdfSU5ECTB4YzAgICAgICAgICAgLyogT2Zmc2V0cyBmcm9tIEJBUjEgKi8KKworI2RlZmluZSBDSEFOM19FTiAgMHgwOAkJLyogZW5hYmxlIEFJT1AgMyAqLworI2RlZmluZSBDSEFOMl9FTiAgMHgwNAkJLyogZW5hYmxlIEFJT1AgMiAqLworI2RlZmluZSBDSEFOMV9FTiAgMHgwMgkJLyogZW5hYmxlIEFJT1AgMSAqLworI2RlZmluZSBDSEFOMF9FTiAgMHgwMQkJLyogZW5hYmxlIEFJT1AgMCAqLworI2RlZmluZSBGUkVRX0RJUyAgMHgwMAorI2RlZmluZSBGUkVRXzI3NEhaIDB4NjAKKyNkZWZpbmUgRlJFUV8xMzdIWiAweDUwCisjZGVmaW5lIEZSRVFfNjlIWiAgMHg0MAorI2RlZmluZSBGUkVRXzM0SFogIDB4MzAKKyNkZWZpbmUgRlJFUV8xN0haICAweDIwCisjZGVmaW5lIEZSRVFfOUhaICAgMHgxMAorI2RlZmluZSBQRVJJT0RJQ19PTkxZIDB4ODAJLyogb25seSBQRVJJT0RJQyBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBDSEFOSU5UX0VOIDB4MDEwMAkvKiBmbGFncyB0byBlbmFibGUvZGlzYWJsZSBjaGFubmVsIGludHMgKi8KKworI2RlZmluZSBSREFUQVNJWkUgNzIKKyNkZWZpbmUgUlJFR0RBVEFTSVpFIDUyCisKKy8qCisgKiBBSU9QIGludGVycnVwdCBiaXRzIGZvciBJU0EvUENJIGJvYXJkcyBhbmQgVVBDSSBib2FyZHMuCisgKi8KKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8wCQkweDAwMDEKKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8xCQkweDAwMDIKKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8yCQkweDAwMDQKKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8zCQkweDAwMDgKKworI2RlZmluZSBBSU9QX0lOVFJfQklUUyAoIFwKKwlBSU9QX0lOVFJfQklUXzAgXAorCXwgQUlPUF9JTlRSX0JJVF8xIFwKKwl8IEFJT1BfSU5UUl9CSVRfMiBcCisJfCBBSU9QX0lOVFJfQklUXzMpCisKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUXzAJMHgwMDA0CisjZGVmaW5lIFVQQ0lfQUlPUF9JTlRSX0JJVF8xCTB4MDAyMAorI2RlZmluZSBVUENJX0FJT1BfSU5UUl9CSVRfMgkweDAxMDAKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUXzMJMHgwODAwCisKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUUyAoIFwKKwlVUENJX0FJT1BfSU5UUl9CSVRfMCBcCisJfCBVUENJX0FJT1BfSU5UUl9CSVRfMSBcCisJfCBVUENJX0FJT1BfSU5UUl9CSVRfMiBcCisJfCBVUENJX0FJT1BfSU5UUl9CSVRfMykKKworLyogQ29udHJvbGxlciBsZXZlbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgQ3RsSUQ7CisJaW50IEN0bE51bTsKKwlpbnQgQnVzVHlwZTsKKwlpbnQgYm9hcmRUeXBlOworCWludCBpc1VQQ0k7CisJV29yZElPX3QgUENJSU87CisJV29yZElPX3QgUENJSU8yOworCUJ5dGVJT190IE1CYXNlSU87CisJQnl0ZUlPX3QgTVJlZzFJTzsKKwlCeXRlSU9fdCBNUmVnMklPOworCUJ5dGVJT190IE1SZWczSU87CisJQnl0ZV90IE1SZWcyOworCUJ5dGVfdCBNUmVnMzsKKwlpbnQgTnVtQWlvcDsKKwlpbnQgQWx0Q2hhblJpbmdJbmRpY2F0b3I7CisJQnl0ZUlPX3QgVVBDSVJpbmdJbmQ7CisJV29yZElPX3QgQWlvcElPW0FJT1BfQ1RMX1NJWkVdOworCUJ5dGVJT190IEFpb3BJbnRDaGFuSU9bQUlPUF9DVExfU0laRV07CisJaW50IEFpb3BJRFtBSU9QX0NUTF9TSVpFXTsKKwlpbnQgQWlvcE51bUNoYW5bQUlPUF9DVExfU0laRV07CisJV29yZF90ICpBaW9wSW50ckJpdHM7Cit9IENPTlRST0xMRVJfVDsKKwordHlwZWRlZiBDT05UUk9MTEVSX1QgQ09OVFJPTExFUl90OworCisvKiBDaGFubmVsIGxldmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUNPTlRST0xMRVJfVCAqQ3RsUDsKKwlpbnQgQWlvcE51bTsKKwlpbnQgQ2hhbklEOworCWludCBDaGFuTnVtOworCWludCBydHNUb2dnbGU7CisKKwlCeXRlSU9fdCBDbWQ7CisJQnl0ZUlPX3QgSW50Q2hhbjsKKwlCeXRlSU9fdCBJbnRNYXNrOworCURXb3JkSU9fdCBJbmRleEFkZHI7CisJV29yZElPX3QgSW5kZXhEYXRhOworCisJV29yZElPX3QgVHhSeERhdGE7CisJV29yZElPX3QgQ2hhblN0YXQ7CisJV29yZElPX3QgVHhSeENvdW50OworCUJ5dGVJT190IEludElEOworCisJV29yZF90IFR4RklGTzsKKwlXb3JkX3QgVHhGSUZPUHRyczsKKwlXb3JkX3QgUnhGSUZPOworCVdvcmRfdCBSeEZJRk9QdHJzOworCVdvcmRfdCBUeFByaW9DbnQ7CisJV29yZF90IFR4UHJpb1B0cjsKKwlXb3JkX3QgVHhQcmlvQnVmOworCisJQnl0ZV90IFJbUlJFR0RBVEFTSVpFXTsKKworCUJ5dGVfdCBCYXVkRGl2WzRdOworCUJ5dGVfdCBUeENvbnRyb2xbNF07CisJQnl0ZV90IFJ4Q29udHJvbFs0XTsKKwlCeXRlX3QgVHhFbmFibGVzWzRdOworCUJ5dGVfdCBUeENvbXBhcmVbNF07CisJQnl0ZV90IFR4UmVwbGFjZTFbNF07CisJQnl0ZV90IFR4UmVwbGFjZTJbNF07Cit9IENIQU5ORUxfVDsKKwordHlwZWRlZiBDSEFOTkVMX1QgQ0hBTk5FTF90OwordHlwZWRlZiBDSEFOTkVMX1QgKkNIQU5QVFJfVDsKKworI2RlZmluZSBJbnRlcmZhY2VNb2RlUlMyMzIgIDB4MDAKKyNkZWZpbmUgSW50ZXJmYWNlTW9kZVJTNDIyICAweDA4CisjZGVmaW5lIEludGVyZmFjZU1vZGVSUzQ4NSAgMHgxMAorI2RlZmluZSBJbnRlcmZhY2VNb2RlUlMyMzJUIDB4MTgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDbHJCcmVhaworUHVycG9zZTogIFN0b3Agc2VuZGluZyBhIHRyYW5zbWl0IEJSRUFLIHNpZ25hbAorQ2FsbDogICAgIHNDbHJCcmVhayhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0NsckJyZWFrKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdICY9IH5TRVRCUkVBSzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0NsckRUUgorUHVycG9zZTogIENsciB0aGUgRFRSIG91dHB1dAorQ2FsbDogICAgIHNDbHJEVFIoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNDbHJEVFIoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVF9EVFI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDbHJSVFMKK1B1cnBvc2U6ICBDbHIgdGhlIFJUUyBvdXRwdXQKK0NhbGw6ICAgICBzQ2xyUlRTKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ2xyUlRTKENoUCkgXAorZG8geyBcCisgICBpZiAoKENoUCktPnJ0c1RvZ2dsZSkgYnJlYWs7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVF9SVFM7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDbHJUeFhPRkYKK1B1cnBvc2U6ICBDbGVhciBhbnkgZXhpc3RpbmcgdHJhbnNtaXQgc29mdHdhcmUgZmxvdyBjb250cm9sIG9mZiBjb25kaXRpb24KK0NhbGw6ICAgICBzQ2xyVHhYT0ZGKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ2xyVHhYT0ZGKENoUCkgXAorZG8geyBcCisgICBzT3V0QigoQ2hQKS0+Q21kLFRYT1ZFUklERSB8IChCeXRlX3QpKENoUCktPkNoYW5OdW0pOyBcCisgICBzT3V0QigoQ2hQKS0+Q21kLChCeXRlX3QpKENoUCktPkNoYW5OdW0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0N0bE51bVRvQ3RsUHRyCitQdXJwb3NlOiAgQ29udmVydCBhIGNvbnRyb2xsZXIgbnVtYmVyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlIHBvaW50ZXIKK0NhbGw6ICAgICBzQ3RsTnVtVG9DdGxQdHIoQ3RsTnVtKQorICAgICAgICAgIGludCBDdGxOdW07IENvbnRyb2xsZXIgbnVtYmVyCitSZXR1cm46ICAgQ09OVFJPTExFUl9UICo6IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0N0bE51bVRvQ3RsUHRyKENUTE5VTSkgJnNDb250cm9sbGVyW0NUTE5VTV0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDb250cm9sbGVyRU9JCitQdXJwb3NlOiAgU3Ryb2JlIHRoZSBNVURCQUMncyBFbmQgT2YgSW50ZXJydXB0IGJpdC4KK0NhbGw6ICAgICBzQ29udHJvbGxlckVPSShDdGxQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ29udHJvbGxlckVPSShDVExQKSBzT3V0QigoQ1RMUCktPk1SZWcySU8sKENUTFApLT5NUmVnMiB8IElOVF9TVFJPQikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNQQ0lDb250cm9sbGVyRU9JCitQdXJwb3NlOiAgU3Ryb2JlIHRoZSBQQ0kgRW5kIE9mIEludGVycnVwdCBiaXQuCisgICAgICAgICAgRm9yIHRoZSBVUENJIGJvYXJkcywgdG9nZ2xlIHRoZSBBSU9QIGludGVycnVwdCBlbmFibGUgYml0CisJICAodGhpcyB3YXMgdGFrZW4gZnJvbSB0aGUgV2luZG93cyBkcml2ZXIpLgorQ2FsbDogICAgIHNQQ0lDb250cm9sbGVyRU9JKEN0bFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNQQ0lDb250cm9sbGVyRU9JKENUTFApIFwKK2RvIHsgXAorICAgIGlmICgoQ1RMUCktPmlzVVBDSSkgeyBcCisJV29yZF90IHcgPSBzSW5XKChDVExQKS0+UENJSU8pOyBcCisJc091dFcoKENUTFApLT5QQ0lJTywgKHcgXiBQQ0lfSU5UX0NUUkxfQUlPUCkpOyBcCisJc091dFcoKENUTFApLT5QQ0lJTywgdyk7IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorCXNPdXRXKChDVExQKS0+UENJSU8sIFBDSV9TVFJPQik7IFwKKyAgICB9IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzQWlvcAorUHVycG9zZTogIERpc2FibGUgSS9PIGFjY2VzcyB0byBhbiBBSU9QCitDYWxsOiAgICAgc0Rpc0Fpb3AoQ2x0UCkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBBaW9wTnVtOyBOdW1iZXIgb2YgQUlPUCBvbiBjb250cm9sbGVyCisqLworI2RlZmluZSBzRGlzQWlvcChDVExQLEFJT1BOVU0pIFwKK2RvIHsgXAorICAgKENUTFApLT5NUmVnMyAmPSBzQml0TWFwQ2xyVGJsW0FJT1BOVU1dOyBcCisgICBzT3V0QigoQ1RMUCktPk1SZWczSU8sKENUTFApLT5NUmVnMyk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzQ1RTRmxvd0N0bAorUHVycG9zZTogIERpc2FibGUgb3V0cHV0IGZsb3cgY29udHJvbCB1c2luZyBDVFMKK0NhbGw6ICAgICBzRGlzQ1RTRmxvd0N0bChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc0NUU0Zsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gfkNUU0ZDX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzSVhBTlkKK1B1cnBvc2U6ICBEaXNhYmxlIElYQU5ZIFNvZnR3YXJlIEZsb3cgQ29udHJvbAorQ2FsbDogICAgIHNEaXNJWEFOWShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc0lYQU5ZKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDBlXSA9IDB4ODY7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDBjXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBEaXNQYXJpdHkKK1B1cnBvc2U6ICBEaXNhYmxlIHBhcml0eQorQ2FsbDogICAgIHNEaXNQYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKyovCisjZGVmaW5lIHNEaXNQYXJpdHkoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gflBBUklUWV9FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0Rpc1JUU1RvZ2dsZQorUHVycG9zZTogIERpc2FibGUgUlRTIHRvZ2dsZQorQ2FsbDogICAgIHNEaXNSVFNUb2dnbGUoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNEaXNSVFNUb2dnbGUoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gflJUU1RPR19FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCisgICAoQ2hQKS0+cnRzVG9nZ2xlID0gMDsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNSeEZJRk8KK1B1cnBvc2U6ICBEaXNhYmxlIFJ4IEZJRk8KK0NhbGw6ICAgICBzRGlzUnhGSUZPKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRGlzUnhGSUZPKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDMyXSA9IDB4MGE7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDMwXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzUnhTdGF0dXNNb2RlCitQdXJwb3NlOiAgRGlzYWJsZSB0aGUgUnggc3RhdHVzIG1vZGUKK0NhbGw6ICAgICBzRGlzUnhTdGF0dXNNb2RlKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyB0YWtlcyB0aGUgY2hhbm5lbCBvdXQgb2YgdGhlIHJlY2VpdmUgc3RhdHVzIG1vZGUuICBBbGwKKyAgICAgICAgICBzdWJzZXF1ZW50IHJlYWRzIG9mIHJlY2VpdmUgZGF0YSB1c2luZyBzUmVhZFJ4V29yZCgpIHdpbGwgcmV0dXJuCisgICAgICAgICAgdHdvIGRhdGEgYnl0ZXMuCisqLworI2RlZmluZSBzRGlzUnhTdGF0dXNNb2RlKENoUCkgc091dFcoKENoUCktPkNoYW5TdGF0LDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzVHJhbnNtaXQKK1B1cnBvc2U6ICBEaXNhYmxlIHRyYW5zbWl0CitDYWxsOiAgICAgc0Rpc1RyYW5zbWl0KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgVGhpcyBkaXNhYmxlcyBtb3ZlbWVudCBvZiBUeCBkYXRhIGZyb20gdGhlIFR4IEZJRk8gaW50byB0aGUgMSBieXRlCisgICAgICAgICAgVHggYnVmZmVyLiAgVGhlcmVmb3JlIHRoZXJlIGNvdWxkIGJlIHVwIHRvIGEgMiBieXRlIGxhdGVuY3kKKyAgICAgICAgICBiZXR3ZWVuIHRoZSB0aW1lIHNEaXNUcmFuc21pdCgpIGlzIGNhbGxlZCBhbmQgdGhlIHRyYW5zbWl0IGJ1ZmZlcgorICAgICAgICAgIGFuZCB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBnb2luZyBjb21wbGV0ZWx5IGVtcHR5LgorKi8KKyNkZWZpbmUgc0Rpc1RyYW5zbWl0KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdICY9IH5UWF9FTkFCTEU7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNUeFNvZnRGbG93Q3RsCitQdXJwb3NlOiAgRGlzYWJsZSBUeCBTb2Z0d2FyZSBGbG93IENvbnRyb2wKK0NhbGw6ICAgICBzRGlzVHhTb2Z0Rmxvd0N0bChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc1R4U29mdEZsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MDZdID0gMHg4YTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MDRdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFbkFpb3AKK1B1cnBvc2U6ICBFbmFibGUgSS9PIGFjY2VzcyB0byBhbiBBSU9QCitDYWxsOiAgICAgc0VuQWlvcChDbHRQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IE51bWJlciBvZiBBSU9QIG9uIGNvbnRyb2xsZXIKKyovCisjZGVmaW5lIHNFbkFpb3AoQ1RMUCxBSU9QTlVNKSBcCitkbyB7IFwKKyAgIChDVExQKS0+TVJlZzMgfD0gc0JpdE1hcFNldFRibFtBSU9QTlVNXTsgXAorICAgc091dEIoKENUTFApLT5NUmVnM0lPLChDVExQKS0+TVJlZzMpOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuQ1RTRmxvd0N0bAorUHVycG9zZTogIEVuYWJsZSBvdXRwdXQgZmxvdyBjb250cm9sIHVzaW5nIENUUworQ2FsbDogICAgIHNFbkNUU0Zsb3dDdGwoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNFbkNUU0Zsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gQ1RTRkNfRU47IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFbklYQU5ZCitQdXJwb3NlOiAgRW5hYmxlIElYQU5ZIFNvZnR3YXJlIEZsb3cgQ29udHJvbAorQ2FsbDogICAgIHNFbklYQU5ZKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRW5JWEFOWShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlJbMHgwZV0gPSAweDIxOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMHgwY10pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogRW5QYXJpdHkKK1B1cnBvc2U6ICBFbmFibGUgcGFyaXR5CitDYWxsOiAgICAgc0VuUGFyaXR5KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogRnVuY3Rpb24gc1NldFBhcml0eSgpIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGZ1bmN0aW9ucyBzRW5QYXJpdHkoKSwKKyAgICAgICAgICBzRGlzUGFyaXR5KCksIHNTZXRPZGRQYXJpdHkoKSwgYW5kIHNTZXRFdmVuUGFyaXR5KCkuCisKK1dhcm5pbmdzOiBCZWZvcmUgZW5hYmxpbmcgcGFyaXR5IG9kZCBvciBldmVuIHBhcml0eSBzaG91bGQgYmUgY2hvc2VuIHVzaW5nCisgICAgICAgICAgZnVuY3Rpb25zIHNTZXRPZGRQYXJpdHkoKSBvciBzU2V0RXZlblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc0VuUGFyaXR5KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdIHw9IFBBUklUWV9FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuUlRTVG9nZ2xlCitQdXJwb3NlOiAgRW5hYmxlIFJUUyB0b2dnbGUKK0NhbGw6ICAgICBzRW5SVFNUb2dnbGUoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGlzYWJsZSBSVFMgZmxvdyBjb250cm9sIGFuZCBjbGVhciB0aGUgUlRTCisgICAgICAgICAgbGluZSB0byBhbGxvdyBvcGVyYXRpb24gb2YgUlRTIHRvZ2dsZS4KKyovCisjZGVmaW5lIHNFblJUU1RvZ2dsZShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlJ4Q29udHJvbFsyXSAmPSB+UlRTRkNfRU47IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UnhDb250cm9sWzBdKTsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBSVFNUT0dfRU47IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVF9SVFM7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorICAgKENoUCktPnJ0c1RvZ2dsZSA9IDE7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SeEZJRk8KK1B1cnBvc2U6ICBFbmFibGUgUnggRklGTworQ2FsbDogICAgIHNFblJ4RklGTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0VuUnhGSUZPKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDMyXSA9IDB4MDg7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDMwXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SeFByb2Nlc3NvcgorUHVycG9zZTogIEVuYWJsZSB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IKK0NhbGw6ICAgICBzRW5SeFByb2Nlc3NvcihDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorQ29tbWVudHM6IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IuICBXaGVuCisgICAgICAgICAgdGhlIGNoYW5uZWwgaXMgaW4gdGhlIHJlc2V0IHN0YXRlIHRoZSByZWNlaXZlIHByb2Nlc3NvciBpcyBub3QKKyAgICAgICAgICBydW5uaW5nLiAgVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGZyb20KKyAgICAgICAgICBleGVjdXRpbmcgaW52YWxpZCBtaWNyb2NvZGUgaW5zdHJ1Y3Rpb25zIHByaW9yIHRvIHRoZQorICAgICAgICAgIGRvd25sb2FkaW5nIG9mIHRoZSBtaWNyb2NvZGUuCisKK1dhcm5pbmdzOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIHZhbGlkIG1pY3JvY29kZSBoYXMgYmVlbgorICAgICAgICAgIGRvd25sb2FkZWQgdG8gdGhlIEFJT1AsIGFuZCBpdCBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRoZQorICAgICAgICAgIG1pY3JvY29kZSBoYXMgYmVlbiBkb3dubG9hZGVkLgorKi8KKyNkZWZpbmUgc0VuUnhQcm9jZXNzb3IoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SeENvbnRyb2xbMl0gfD0gUlhQUk9DX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJ4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SeFN0YXR1c01vZGUKK1B1cnBvc2U6ICBFbmFibGUgdGhlIFJ4IHN0YXR1cyBtb2RlCitDYWxsOiAgICAgc0VuUnhTdGF0dXNNb2RlKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBwbGFjZXMgdGhlIGNoYW5uZWwgaW4gdGhlIHJlY2VpdmUgc3RhdHVzIG1vZGUuICBBbGwgc3Vic2VxdWVudAorICAgICAgICAgIHJlYWRzIG9mIHJlY2VpdmUgZGF0YSB1c2luZyBzUmVhZFJ4V29yZCgpIHdpbGwgcmV0dXJuIGEgZGF0YSBieXRlCisgICAgICAgICAgaW4gdGhlIGxvdyB3b3JkIGFuZCBhIHN0YXR1cyBieXRlIGluIHRoZSBoaWdoIHdvcmQuCisKKyovCisjZGVmaW5lIHNFblJ4U3RhdHVzTW9kZShDaFApIHNPdXRXKChDaFApLT5DaGFuU3RhdCxTVEFUTU9ERSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFblRyYW5zbWl0CitQdXJwb3NlOiAgRW5hYmxlIHRyYW5zbWl0CitDYWxsOiAgICAgc0VuVHJhbnNtaXQoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNFblRyYW5zbWl0KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdIHw9IFRYX0VOQUJMRTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuVHhTb2Z0Rmxvd0N0bAorUHVycG9zZTogIEVuYWJsZSBUeCBTb2Z0d2FyZSBGbG93IENvbnRyb2wKK0NhbGw6ICAgICBzRW5UeFNvZnRGbG93Q3RsKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRW5UeFNvZnRGbG93Q3RsKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDA2XSA9IDB4YzU7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDA0XSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0QWlvcEludFN0YXR1cworUHVycG9zZTogIEdldCB0aGUgQUlPUCBpbnRlcnJ1cHQgc3RhdHVzCitDYWxsOiAgICAgc0dldEFpb3BJbnRTdGF0dXMoQ3RsUCxBaW9wTnVtKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IEFJT1AgbnVtYmVyCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgQUlPUCBpbnRlcnJ1cHQgc3RhdHVzLiAgQml0cyAwIHRocm91Z2ggNworICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudCBjaGFubmVscyAwIHRocm91Z2ggNyByZXNwZWN0aXZlbHkuICBJZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0IGlzIHNldCB0aGF0IGNoYW5uZWwgaXMgaW50ZXJydXB0aW5nLgorKi8KKyNkZWZpbmUgc0dldEFpb3BJbnRTdGF0dXMoQ1RMUCxBSU9QTlVNKSBzSW5CKChDVExQKS0+QWlvcEludENoYW5JT1tBSU9QTlVNXSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRBaW9wTnVtQ2hhbgorUHVycG9zZTogIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSBhbiBBSU9QCitDYWxsOiAgICAgc0dldEFpb3BOdW1DaGFuKEN0bFAsQWlvcE51bSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBBaW9wTnVtOyBBSU9QIG51bWJlcgorUmV0dXJuOiAgIGludDogVGhlIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgdGhlIEFJT1AKKyovCisjZGVmaW5lIHNHZXRBaW9wTnVtQ2hhbihDVExQLEFJT1BOVU0pIChDVExQKS0+QWlvcE51bUNoYW5bQUlPUE5VTV0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDaGFuSW50SUQKK1B1cnBvc2U6ICBHZXQgYSBjaGFubmVsJ3MgaW50ZXJydXB0IGlkZW50aWZpY2F0aW9uIGJ5dGUKK0NhbGw6ICAgICBzR2V0Q2hhbkludElEKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgY2hhbm5lbCBpbnRlcnJ1cHQgSUQuICBDYW4gYmUgYW55CisgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICAgICAgICBSWEZfVFJJRzogICAgIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBUWEZJRk9fTVQ6ICAgIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0CisgICAgICAgICAgICAgICAgU1JDX0lOVDogICAgICBTcGVjaWFsIHJlY2VpdmUgY29uZGl0aW9uIGludGVycnVwdAorICAgICAgICAgICAgICAgIERFTFRBX0NEOiAgICAgQ0QgY2hhbmdlIGludGVycnVwdAorICAgICAgICAgICAgICAgIERFTFRBX0NUUzogICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBERUxUQV9EU1I6ICAgIERTUiBjaGFuZ2UgaW50ZXJydXB0CisqLworI2RlZmluZSBzR2V0Q2hhbkludElEKENoUCkgKHNJbkIoKENoUCktPkludElEKSAmIChSWEZfVFJJRyB8IFRYRklGT19NVCB8IFNSQ19JTlQgfCBERUxUQV9DRCB8IERFTFRBX0NUUyB8IERFTFRBX0RTUikpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0Q2hhbk51bQorUHVycG9zZTogIEdldCB0aGUgbnVtYmVyIG9mIGEgY2hhbm5lbCB3aXRoaW4gYW4gQUlPUAorQ2FsbDogICAgIHNHZXRDaGFuTnVtKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgaW50OiBDaGFubmVsIG51bWJlciB3aXRoaW4gQUlPUCwgb3IgTlVMTENIQU4gaWYgY2hhbm5lbCBkb2VzCisgICAgICAgICAgICAgICBub3QgZXhpc3QuCisqLworI2RlZmluZSBzR2V0Q2hhbk51bShDaFApIChDaFApLT5DaGFuTnVtCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0Q2hhblN0YXR1cworUHVycG9zZTogIEdldCB0aGUgY2hhbm5lbCBzdGF0dXMKK0NhbGw6ICAgICBzR2V0Q2hhblN0YXR1cyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIFdvcmRfdDogVGhlIGNoYW5uZWwgc3RhdHVzLiAgQ2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZgorICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgICAgICAgTE9XIEJZVEUgRkxBR1MKKyAgICAgICAgICAgICAgICBDVFNfQUNUOiAgICAgIENUUyBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIERTUl9BQ1Q6ICAgICAgRFNSIGlucHV0IGFzc2VydGVkCisgICAgICAgICAgICAgICAgQ0RfQUNUOiAgICAgICBDRCBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIFRYRklGT01UOiAgICAgVHggRklGTyBpcyBlbXB0eQorICAgICAgICAgICAgICAgIFRYU0hSTVQ6ICAgICAgVHggc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkKKyAgICAgICAgICAgICAgICBSREE6ICAgICAgICAgIFJ4IGRhdGEgYXZhaWxhYmxlCisKKyAgICAgICAgICAgICAgICBISUdIIEJZVEUgRkxBR1MKKyAgICAgICAgICAgICAgICBTVEFUTU9ERTogICAgIHN0YXR1cyBtb2RlIGVuYWJsZSBiaXQKKyAgICAgICAgICAgICAgICBSWEZPVkVSRkw6ICAgIHJlY2VpdmUgRklGTyBvdmVyZmxvdworICAgICAgICAgICAgICAgIFJYMk1BVENIOiAgICAgcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMiBtYXRjaAorICAgICAgICAgICAgICAgIFJYMU1BVENIOiAgICAgcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMSBtYXRjaAorICAgICAgICAgICAgICAgIFJYQlJFQUs6ICAgICAgcmVjZWl2ZWQgQlJFQUsKKyAgICAgICAgICAgICAgICBSWEZSQU1FOiAgICAgIHJlY2VpdmVkIGZyYW1pbmcgZXJyb3IKKyAgICAgICAgICAgICAgICBSWFBBUklUWTogICAgIHJlY2VpdmVkIHBhcml0eSBlcnJvcgorV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhciB0aGUgaGlnaCBieXRlIGZsYWdzIGluIHRoZSBDaGFubmVsCisgICAgICAgICAgU3RhdHVzIFJlZ2lzdGVyLgorKi8KKyNkZWZpbmUgc0dldENoYW5TdGF0dXMoQ2hQKSBzSW5XKChDaFApLT5DaGFuU3RhdCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDaGFuU3RhdHVzTG8KK1B1cnBvc2U6ICBHZXQgdGhlIGxvdyBieXRlIG9ubHkgb2YgdGhlIGNoYW5uZWwgc3RhdHVzCitDYWxsOiAgICAgc0dldENoYW5TdGF0dXNMbyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIEJ5dGVfdDogVGhlIGNoYW5uZWwgc3RhdHVzIGxvdyBieXRlLiAgQ2FuIGJlIGFueSBjb21iaW5hdGlvbgorICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgICAgICAgQ1RTX0FDVDogICAgICBDVFMgaW5wdXQgYXNzZXJ0ZWQKKyAgICAgICAgICAgICAgICBEU1JfQUNUOiAgICAgIERTUiBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIENEX0FDVDogICAgICAgQ0QgaW5wdXQgYXNzZXJ0ZWQKKyAgICAgICAgICAgICAgICBUWEZJRk9NVDogICAgIFR4IEZJRk8gaXMgZW1wdHkKKyAgICAgICAgICAgICAgICBUWFNIUk1UOiAgICAgIFR4IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5CisgICAgICAgICAgICAgICAgUkRBOiAgICAgICAgICBSeCBkYXRhIGF2YWlsYWJsZQorKi8KKyNkZWZpbmUgc0dldENoYW5TdGF0dXNMbyhDaFApIHNJbkIoKEJ5dGVJT190KShDaFApLT5DaGFuU3RhdCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldCBSSSBzdGF0dXMgb2YgY2hhbm5lbAorICogRGVmaW5lZCBhcyBhIGZ1bmN0aW9uIGluIHJvY2tldC5jICAgLWFlcworICovCisjaWYgMAorI2RlZmluZSBzR2V0Q2hhblJJKENoUCkgKChDaFApLT5DdGxQLT5BbHRDaGFuUmluZ0luZGljYXRvciA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNJbkIoKEJ5dGVJT190KSgoQ2hQKS0+Q2hhblN0YXQrOCkpICYgRFNSX0FDVCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ2hQKS0+Q3RsUC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShzSW5CKChDaFApLT5DdGxQLT5BaW9wSU9bM10pICYgc0JpdE1hcFNldFRibFsoQ2hQKS0+Q2hhbk51bV0pKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDb250cm9sbGVySW50U3RhdHVzCitQdXJwb3NlOiAgR2V0IHRoZSBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMKK0NhbGw6ICAgICBzR2V0Q29udHJvbGxlckludFN0YXR1cyhDdGxQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3dlciA0CisgICAgICAgICAgICAgICAgICAgICAgICAgYml0cy4gIEJpdHMgMCB0aHJvdWdoIDMgcmVwcmVzZW50IEFJT1AncyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCAzIHJlc3BlY3RpdmVseS4gIElmIGEgYml0IGlzIHNldCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgQUlPUCBpcyBpbnRlcnJ1cHRpbmcuICBCaXRzIDQgdGhyb3VnaCA3IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgYmUgY2xlYXJlZC4KKyovCisjZGVmaW5lIHNHZXRDb250cm9sbGVySW50U3RhdHVzKENUTFApIChzSW5CKChDVExQKS0+TVJlZzFJTykgJiAweDBmKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMKK1B1cnBvc2U6ICBHZXQgdGhlIGNvbnRyb2xsZXIgaW50ZXJydXB0IHN0YXR1cworQ2FsbDogICAgIHNQQ0lHZXRDb250cm9sbGVySW50U3RhdHVzKEN0bFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKK1JldHVybjogICB1bnNpZ25lZCBjaGFyOiBUaGUgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3dlciA0CisgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyBhbmQgYml0IDQuICBCaXRzIDAgdGhyb3VnaCAzIHJlcHJlc2VudCBBSU9QJ3MgMAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggMyByZXNwZWN0aXZlbHkuIEJpdCA0IGlzIHNldCBpZiB0aGUgaW50IAorCQkJIHdhcyBnZW5lcmF0ZWQgZnJvbSBwZXJpb2RpYy4gSWYgYSBiaXQgaXMgc2V0IHRoZQorCQkJIEFJT1AgaXMgaW50ZXJydXB0aW5nLgorKi8KKyNkZWZpbmUgc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMoQ1RMUCkgXAorCSgoQ1RMUCktPmlzVVBDSSA/IFwKKwkgIChzSW5XKChDVExQKS0+UENJSU8yKSAmIFVQQ0lfQUlPUF9JTlRSX0JJVFMpIDogXAorCSAgKChzSW5XKChDVExQKS0+UENJSU8pID4+IDgpICYgQUlPUF9JTlRSX0JJVFMpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0Z1bmN0aW9uOiBzR2V0UnhDbnQKK1B1cnBvc2U6ICBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBSeCBGSUZPCitDYWxsOiAgICAgc0dldFJ4Q250KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgaW50OiBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhlIFJ4IEZJRk8uCitDb21tZW50czogQnl0ZSByZWFkIG9mIGNvdW50IHJlZ2lzdGVyIGlzIHJlcXVpcmVkIHRvIG9idGFpbiBSeCBjb3VudC4KKworKi8KKyNkZWZpbmUgc0dldFJ4Q250KENoUCkgc0luVygoQ2hQKS0+VHhSeENvdW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldFR4Q250CitQdXJwb3NlOiAgR2V0IHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgVHggRklGTworQ2FsbDogICAgIHNHZXRUeENudChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIEJ5dGVfdDogVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBUeCBGSUZPLgorQ29tbWVudHM6IEJ5dGUgcmVhZCBvZiBjb3VudCByZWdpc3RlciBpcyByZXF1aXJlZCB0byBvYnRhaW4gVHggY291bnQuCisKKyovCisjZGVmaW5lIHNHZXRUeENudChDaFApIHNJbkIoKEJ5dGVJT190KShDaFApLT5UeFJ4Q291bnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRUeFJ4RGF0YUlPCitQdXJwb3NlOiAgR2V0IHRoZSBJL08gYWRkcmVzcyBvZiBhIGNoYW5uZWwncyBUeFJ4IERhdGEgcmVnaXN0ZXIKK0NhbGw6ICAgICBzR2V0VHhSeERhdGFJTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIFdvcmRJT190OiBJL08gYWRkcmVzcyBvZiBhIGNoYW5uZWwncyBUeFJ4IERhdGEgcmVnaXN0ZXIKKyovCisjZGVmaW5lIHNHZXRUeFJ4RGF0YUlPKENoUCkgKENoUCktPlR4UnhEYXRhCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzSW5pdENoYW5EZWZhdWx0cworUHVycG9zZTogIEluaXRpYWxpemUgYSBjaGFubmVsIHN0cnVjdHVyZSB0byBpdCdzIGRlZmF1bHQgc3RhdGUuCitDYWxsOiAgICAgc0luaXRDaGFuRGVmYXVsdHMoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gdGhlIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBldmVyeSBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIHRoYXQgZXhpc3RzIGJlZm9yZSBhbnkgb3RoZXIgU1NDSSBjYWxscyBjYW4gYmUgbWFkZS4KKworKi8KKyNkZWZpbmUgc0luaXRDaGFuRGVmYXVsdHMoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5DdGxQID0gTlVMTENUTFBUUjsgXAorICAgKENoUCktPkFpb3BOdW0gPSBOVUxMQUlPUDsgXAorICAgKENoUCktPkNoYW5JRCA9IEFJT1BJRF9OVUxMOyBcCisgICAoQ2hQKS0+Q2hhbk51bSA9IE5VTExDSEFOOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1Jlc2V0QWlvcEJ5TnVtCitQdXJwb3NlOiAgUmVzZXQgdGhlIEFJT1AgYnkgbnVtYmVyCitDYWxsOiAgICAgc1Jlc2V0QWlvcEJ5TnVtKENUTFAsQUlPUE5VTSkKKwlDT05UUk9MTEVSX1QgQ1RMUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisJQUlPUE5VTTsgQUlPUCBpbmRleCAKKyovCisjZGVmaW5lIHNSZXNldEFpb3BCeU51bShDVExQLEFJT1BOVU0pIFwKK2RvIHsgXAorICAgc091dEIoKENUTFApLT5BaW9wSU9bKEFJT1BOVU0pXStfQ01EX1JFRyxSRVNFVF9BTEwpOyBcCisgICBzT3V0QigoQ1RMUCktPkFpb3BJT1soQUlPUE5VTSldK19DTURfUkVHLDB4MCk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2VuZEJyZWFrCitQdXJwb3NlOiAgU2VuZCBhIHRyYW5zbWl0IEJSRUFLIHNpZ25hbAorQ2FsbDogICAgIHNTZW5kQnJlYWsoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZW5kQnJlYWsoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gfD0gU0VUQlJFQUs7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRCYXVkCitQdXJwb3NlOiAgU2V0IGJhdWQgcmF0ZQorQ2FsbDogICAgIHNTZXRCYXVkKENoUCxEaXZpc29yKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBXb3JkX3QgRGl2aXNvcjsgMTYgYml0IGJhdWQgcmF0ZSBkaXZpc29yIGZvciBjaGFubmVsCisqLworI2RlZmluZSBzU2V0QmF1ZChDaFAsRElWSVNPUikgXAorZG8geyBcCisgICAoQ2hQKS0+QmF1ZERpdlsyXSA9IChCeXRlX3QpKERJVklTT1IpOyBcCisgICAoQ2hQKS0+QmF1ZERpdlszXSA9IChCeXRlX3QpKChESVZJU09SKSA+PiA4KTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5CYXVkRGl2WzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXREYXRhNworUHVycG9zZTogIFNldCBkYXRhIGJpdHMgdG8gNworQ2FsbDogICAgIHNTZXREYXRhNyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc1NldERhdGE3KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdICY9IH5EQVRBOEJJVDsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldERhdGE4CitQdXJwb3NlOiAgU2V0IGRhdGEgYml0cyB0byA4CitDYWxsOiAgICAgc1NldERhdGE4KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0RGF0YTgoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gREFUQThCSVQ7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXREVFIKK1B1cnBvc2U6ICBTZXQgdGhlIERUUiBvdXRwdXQKK0NhbGw6ICAgICBzU2V0RFRSKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0RFRSKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdIHw9IFNFVF9EVFI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRFdmVuUGFyaXR5CitQdXJwb3NlOiAgU2V0IGV2ZW4gcGFyaXR5CitDYWxsOiAgICAgc1NldEV2ZW5QYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKworV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCB1bmxlc3MgcGFyaXR5IGlzIGVuYWJsZWQgd2l0aCBmdW5jdGlvbgorICAgICAgICAgIHNFblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc1NldEV2ZW5QYXJpdHkoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gRVZFTl9QQVI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRPZGRQYXJpdHkKK1B1cnBvc2U6ICBTZXQgb2RkIHBhcml0eQorQ2FsbDogICAgIHNTZXRPZGRQYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKworV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCB1bmxlc3MgcGFyaXR5IGlzIGVuYWJsZWQgd2l0aCBmdW5jdGlvbgorICAgICAgICAgIHNFblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc1NldE9kZFBhcml0eShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSAmPSB+RVZFTl9QQVI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRSVFMKK1B1cnBvc2U6ICBTZXQgdGhlIFJUUyBvdXRwdXQKK0NhbGw6ICAgICBzU2V0UlRTKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0UlRTKENoUCkgXAorZG8geyBcCisgICBpZiAoKENoUCktPnJ0c1RvZ2dsZSkgYnJlYWs7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gfD0gU0VUX1JUUzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFJ4VHJpZ2dlcgorUHVycG9zZTogIFNldCB0aGUgUnggRklGTyB0cmlnZ2VyIGxldmVsCitDYWxsOiAgICAgc1NldFJ4UHJvY2Vzc29yKENoUCxMZXZlbCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgQnl0ZV90IExldmVsOyBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBSeCBGSUZPIGF0IHdoaWNoIHRoZQorICAgICAgICAgICAgIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZC4gIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKworICAgICAgICAgICAgIFRSSUdfTk86ICAgbm8gdHJpZ2dlcgorICAgICAgICAgICAgIFRSSUdfMTogICAgMSBjaGFyYWN0ZXIgaW4gRklGTworICAgICAgICAgICAgIFRSSUdfMV8yOiAgRklGTyAxLzIgZnVsbAorICAgICAgICAgICAgIFRSSUdfN184OiAgRklGTyA3LzggZnVsbAorQ29tbWVudHM6IEFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIHRoZSB0cmlnZ2VyIGxldmVsIGlzIHJlYWNoZWQKKyAgICAgICAgICBvbmx5IGlmIGZ1bmN0aW9uIHNFbkludGVycnVwdCgpIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGZsYWcKKyAgICAgICAgICBSWElOVF9FTiBzZXQuICBUaGUgUlhGX1RSSUcgZmxhZyBpbiB0aGUgSW50ZXJydXB0IElkZW5maWZpY2F0aW9uCisgICAgICAgICAgcmVnaXN0ZXIgd2lsbCBiZSBzZXQgd2hlbmV2ZXIgdGhlIHRyaWdnZXIgbGV2ZWwgaXMgcmVhY2hlZAorICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgUlhJTlRfRU4uCisKKyovCisjZGVmaW5lIHNTZXRSeFRyaWdnZXIoQ2hQLExFVkVMKSBcCitkbyB7IFwKKyAgIChDaFApLT5SeENvbnRyb2xbMl0gJj0gflRSSUdfTUFTSzsgXAorICAgKENoUCktPlJ4Q29udHJvbFsyXSB8PSBMRVZFTDsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFN0b3AxCitQdXJwb3NlOiAgU2V0IHN0b3AgYml0cyB0byAxCitDYWxsOiAgICAgc1NldFN0b3AxKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0U3RvcDEoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gflNUT1AyOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2V0U3RvcDIKK1B1cnBvc2U6ICBTZXQgc3RvcCBiaXRzIHRvIDIKK0NhbGw6ICAgICBzU2V0U3RvcDIoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZXRTdG9wMihDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBTVE9QMjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFR4WE9GRkNoYXIKK1B1cnBvc2U6ICBTZXQgdGhlIFR4IFhPRkYgZmxvdyBjb250cm9sIGNoYXJhY3RlcgorQ2FsbDogICAgIHNTZXRUeFhPRkZDaGFyKENoUCxDaCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgQnl0ZV90IENoOyBUaGUgdmFsdWUgdG8gc2V0IHRoZSBUeCBYT0ZGIGNoYXJhY3RlciB0bworKi8KKyNkZWZpbmUgc1NldFR4WE9GRkNoYXIoQ2hQLENIKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MDddID0gKENIKTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MDRdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRUeFhPTkNoYXIKK1B1cnBvc2U6ICBTZXQgdGhlIFR4IFhPTiBmbG93IGNvbnRyb2wgY2hhcmFjdGVyCitDYWxsOiAgICAgc1NldFR4WE9OQ2hhcihDaFAsQ2gpCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIEJ5dGVfdCBDaDsgVGhlIHZhbHVlIHRvIHNldCB0aGUgVHggWE9OIGNoYXJhY3RlciB0bworKi8KKyNkZWZpbmUgc1NldFR4WE9OQ2hhcihDaFAsQ0gpIFwKK2RvIHsgXAorICAgKENoUCktPlJbMHgwYl0gPSAoQ0gpOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMHgwOF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1N0YXJ0UnhQcm9jZXNzb3IKK1B1cnBvc2U6ICBTdGFydCBhIGNoYW5uZWwncyByZWNlaXZlIHByb2Nlc3NvcgorQ2FsbDogICAgIHNTdGFydFJ4UHJvY2Vzc29yKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGEgUnggcHJvY2Vzc29yIGFmdGVyIGl0IHdhcworICAgICAgICAgIHN0b3BwZWQgd2l0aCBzU3RvcFJ4UHJvY2Vzc29yKCkgb3Igc1N0b3BTV0luRmxvd0N0bCgpLiAgSXQKKyAgICAgICAgICB3aWxsIHJlc3RhcnQgYm90aCB0aGUgUnggcHJvY2Vzc29yIGFuZCBzb2Z0d2FyZSBpbnB1dCBmbG93IGNvbnRyb2wuCisKKyovCisjZGVmaW5lIHNTdGFydFJ4UHJvY2Vzc29yKENoUCkgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzBdKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1dyaXRlVHhCeXRlCitQdXJwb3NlOiAgV3JpdGUgYSB0cmFuc21pdCBkYXRhIGJ5dGUgdG8gYSBjaGFubmVsLgorICAgICAgICAgIEJ5dGVJT190IGlvOiBDaGFubmVsIHRyYW5zbWl0IHJlZ2lzdGVyIEkvTyBhZGRyZXNzLiAgVGhpcyBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG9idGFpbmVkIHdpdGggc0dldFR4UnhEYXRhSU8oKS4KKyAgICAgICAgICBCeXRlX3QgRGF0YTsgVGhlIHRyYW5zbWl0IGRhdGEgYnl0ZS4KK1dhcm5pbmdzOiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgZGF0YSBieXRlIHdpdGhvdXQgY2hlY2tpbmcgdG8gc2VlIGlmCisgICAgICAgICAgc01heFR4U2l6ZSBpcyBleGNlZWRlZCBpbiB0aGUgVHggRklGTy4KKyovCisjZGVmaW5lIHNXcml0ZVR4Qnl0ZShJTyxEQVRBKSBzT3V0QihJTyxEQVRBKQorCitpbnQgc0luaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsCisJCSAgICBpbnQgQ3RsTnVtLAorCQkgICAgQnl0ZUlPX3QgTXVkYmFjSU8sCisJCSAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsCisJCSAgICBpbnQgQWlvcElPTGlzdFNpemUsCisJCSAgICBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LCBpbnQgUGVyaW9kaWNPbmx5KTsKKworaW50IHNQQ0lJbml0Q29udHJvbGxlcihDT05UUk9MTEVSX1QgKiBDdGxQLAorCQkgICAgICAgaW50IEN0bE51bSwKKwkJICAgICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwKKwkJICAgICAgIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJICAgICAgIFdvcmRJT190IENvbmZpZ0lPLAorCQkgICAgICAgaW50IElSUU51bSwKKwkJICAgICAgIEJ5dGVfdCBGcmVxdWVuY3ksCisJCSAgICAgICBpbnQgUGVyaW9kaWNPbmx5LAorCQkgICAgICAgaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yLCBpbnQgVVBDSVJpbmdJbmQpOworCitpbnQgc1JlYWRBaW9wSUQoQnl0ZUlPX3QgaW8pOworaW50IHNSZWFkQWlvcE51bUNoYW4oV29yZElPX3QgaW8pOworaW50IHNJbml0Q2hhbihDT05UUk9MTEVSX1QgKiBDdGxQLAorCSAgICAgIENIQU5ORUxfVCAqIENoUCwgaW50IEFpb3BOdW0sIGludCBDaGFuTnVtKTsKK0J5dGVfdCBzR2V0UnhFcnJTdGF0dXMoQ0hBTk5FTF9UICogQ2hQKTsKK3ZvaWQgc1N0b3BSeFByb2Nlc3NvcihDSEFOTkVMX1QgKiBDaFApOwordm9pZCBzU3RvcFNXSW5GbG93Q3RsKENIQU5ORUxfVCAqIENoUCk7Cit2b2lkIHNGbHVzaFJ4RklGTyhDSEFOTkVMX1QgKiBDaFApOwordm9pZCBzRmx1c2hUeEZJRk8oQ0hBTk5FTF9UICogQ2hQKTsKK2ludCBzV3JpdGVUeFByaW9CeXRlKENIQU5ORUxfVCAqIENoUCwgQnl0ZV90IERhdGEpOwordm9pZCBzRW5JbnRlcnJ1cHRzKENIQU5ORUxfVCAqIENoUCwgV29yZF90IEZsYWdzKTsKK3ZvaWQgc0Rpc0ludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpOwordm9pZCBzTW9kZW1SZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgY2hhbiwgaW50IG9uKTsKK3ZvaWQgc1BDSU1vZGVtUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IGNoYW4sIGludCBvbik7Cit2b2lkIHNTZXRJbnRlcmZhY2VNb2RlKENIQU5ORUxfVCAqIENoUCwgQnl0ZV90IG1vZGUpOworCitleHRlcm4gQnl0ZV90IFJbUkRBVEFTSVpFXTsKK2V4dGVybiBDT05UUk9MTEVSX1Qgc0NvbnRyb2xsZXJbQ1RMX1NJWkVdOworZXh0ZXJuIEJ5dGVfdCBzSVJRTWFwWzE2XTsKK2V4dGVybiBCeXRlX3Qgc0JpdE1hcENsclRibFs4XTsKK2V4dGVybiBCeXRlX3Qgc0JpdE1hcFNldFRibFs4XTsKK2V4dGVybiBpbnQgc0Nsb2NrUHJlc2NhbGU7CisKKy8qCisgKiBCZWdpbiBMaW51eCBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgdGhlIFJvY2tldHBvcnQgZHJpdmVyCisgKgorICogVGhpcyBjb2RlIGlzIENvcHlyaWdodCBUaGVvZG9yZSBUcydvLCAxOTk1LTE5OTcKKyAqLworCitzdHJ1Y3Qgcl9wb3J0IHsKKwlpbnQgbWFnaWM7CisJaW50IGxpbmU7CisJaW50IGZsYWdzOworCWludCBjb3VudDsKKwlpbnQgYmxvY2tlZF9vcGVuOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IGJvYXJkOjM7CisJdW5zaWduZWQgaW50IGFpb3A6MjsKKwl1bnNpZ25lZCBpbnQgY2hhbjozOworCUNPTlRST0xMRVJfdCAqY3RscDsKKwlDSEFOTkVMX3QgY2hhbm5lbDsKKwlpbnQgY2xvc2luZ193YWl0OworCWludCBjbG9zZV9kZWxheTsKKwlpbnQgaW50bWFzazsKKwlpbnQgeG1pdF9maWZvX3Jvb207CS8qIHJvb20gaW4geG1pdCBmaWZvICovCisJdW5zaWduZWQgY2hhciAqeG1pdF9idWY7CisJaW50IHhtaXRfaGVhZDsKKwlpbnQgeG1pdF90YWlsOworCWludCB4bWl0X2NudDsKKwlpbnQgc2Vzc2lvbjsKKwlpbnQgcGdycDsKKwlpbnQgY2Rfc3RhdHVzOworCWludCBpZ25vcmVfc3RhdHVzX21hc2s7CisJaW50IHJlYWRfc3RhdHVzX21hc2s7CisJaW50IGNwczsKKworI2lmZGVmIERFQ0xBUkVfV0FJVFFVRVVFCisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGNsb3NlX3dhaXQ7CisjZWxzZQorCXN0cnVjdCB3YWl0X3F1ZXVlICpvcGVuX3dhaXQ7CisJc3RydWN0IHdhaXRfcXVldWUgKmNsb3NlX3dhaXQ7CisjZW5kaWYKKwlzcGlubG9ja190IHNsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgd3JpdGVfc2VtOworfTsKKworI2RlZmluZSBSUE9SVF9NQUdJQyAweDUyNTAwMQorCisjZGVmaW5lIE5VTV9CT0FSRFMgOAorI2RlZmluZSBNQVhfUlBfUE9SVFMgKDMyKk5VTV9CT0FSRFMpCisKKy8qCisgKiBUaGUgc2l6ZSBvZiB0aGUgeG1pdCBidWZmZXIgaXMgMSBwYWdlLCBvciA0MDk2IGJ5dGVzCisgKi8KKyNkZWZpbmUgWE1JVF9CVUZfU0laRSA0MDk2CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKKy8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSB0aGUgcm9ja2V0cG9ydCBkcml2ZXIgKi8KKyNkZWZpbmUgUk9DS0VUX0lOSVRJQUxJWkVECTB4ODAwMDAwMDAJLyogUG9ydCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgUk9DS0VUX0NMT1NJTkcJCTB4NDAwMDAwMDAJLyogU2VyaWFsIHBvcnQgaXMgY2xvc2luZyAqLworI2RlZmluZSBST0NLRVRfTk9STUFMX0FDVElWRQkweDIwMDAwMDAwCS8qIE5vcm1hbCBwb3J0IGlzIGFjdGl2ZSAqLworCisvKiB0dHkgc3VidHlwZXMgKi8KKyNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMIDEKKworLyoKKyAqIEFzc2lnbmVkIG1ham9yIG51bWJlcnMgZm9yIHRoZSBDb210cm9sIFJvY2tldHBvcnQKKyAqLworI2RlZmluZSBUVFlfUk9DS0VUX01BSk9SCTQ2CisjZGVmaW5lIENVQV9ST0NLRVRfTUFKT1IJNDcKKworI2lmZGVmIFBDSV9WRU5ET1JfSURfUlAKKyN1bmRlZiBQQ0lfVkVORE9SX0lEX1JQCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDhPQ1RBCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDhJTlRGCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDE2SU5URgorI3VuZGVmIFBDSV9ERVZJQ0VfSURfUlAzMklOVEYKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1VSUDhPQ1RBCisjdW5kZWYgUENJX0RFVklDRV9JRF9VUlA4SU5URgorI3VuZGVmIFBDSV9ERVZJQ0VfSURfVVJQMTZJTlRGCisjdW5kZWYgUENJX0RFVklDRV9JRF9DUlAxNklOVEYKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1VSUDMySU5URgorI2VuZGlmCisKKy8qICBDb210cm9sIFBDSSBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SUAkJMHgxMWZlCisKKy8qICBDb210cm9sIERldmljZSBJRCdzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlAzMklOVEYJCTB4MDAwMQkvKiBSb2NrZXRwb3J0IDMyIHBvcnQgdy9leHRlcm5hbCBJL0YgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4SU5URgkJMHgwMDAyCS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDE2SU5URgkJMHgwMDAzCS8qIFJvY2tldHBvcnQgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDRRVUFECQkweDAwMDQJLyogUm9ja2V0cG9ydCA0IHBvcnQgdy9xdWFkIGNhYmxlICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQOE9DVEEJCTB4MDAwNQkvKiBSb2NrZXRwb3J0IDggcG9ydCB3L29jdGEgY2FibGUgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4SgkJMHgwMDA2CS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvUkoxMSBjb25uZWN0b3JzICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDRKCQkweDAwMDcJLyogUm9ja2V0cG9ydCA0IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQOFNOSQkJMHgwMDA4CS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvIERCNzggU05JIChTaWVtZW5zKSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDE2U05JCQkweDAwMDkJLyogUm9ja2V0cG9ydCAxNiBwb3J0IHcvIERCNzggU05JIChTaWVtZW5zKSBjb25uZWN0b3IgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQUDQJCTB4MDAwQQkvKiBSb2NrZXRwb3J0IFBsdXMgNCBwb3J0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlBQOAkJMHgwMDBCCS8qIFJvY2tldHBvcnQgUGx1cyA4IHBvcnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDZNCQkweDAwMEMJLyogUm9ja2V0TW9kZW0gNiBwb3J0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQNE0JCTB4MDAwRAkvKiBSb2NrZXRNb2RlbSA0IHBvcnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlAyXzIzMiAgICAgICAgICAgMHgwMDBFCS8qIFJvY2tldHBvcnQgUGx1cyAyIHBvcnQgUlMyMzIgICAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDJfNDIyICAgICAgICAgICAweDAwMEYJLyogUm9ja2V0cG9ydCBQbHVzIDIgcG9ydCBSUzQyMiAgICAgICAgICAqLyAKKworLyogVW5pdmVyc2FsIFBDSSBib2FyZHMgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQMzJJTlRGCQkweDA4MDEJLyogUm9ja2V0cG9ydCBVUENJIDMyIHBvcnQgdy9leHRlcm5hbCBJL0YgKi8gCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQOElOVEYJCTB4MDgwMgkvKiBSb2NrZXRwb3J0IFVQQ0kgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VSUDE2SU5URgkJMHgwODAzCS8qIFJvY2tldHBvcnQgVVBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQOE9DVEEJCTB4MDgwNQkvKiBSb2NrZXRwb3J0IFVQQ0kgOCBwb3J0IHcvb2N0YSBjYWJsZSAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VQQ0lfUk0zXzhQT1JUICAgIDB4MDgwQwkvKiBSb2NrZXRtb2RlbSBJSUkgOCBwb3J0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VQQ0lfUk0zXzRQT1JUICAgIDB4MDgwRAkvKiBSb2NrZXRtb2RlbSBJSUkgNCBwb3J0ICAgICAgICAgICAgICAgICAqLworCisvKiBDb21wYWN0IFBDSSBkZXZpY2UgKi8gCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1JQMTZJTlRGCQkweDA5MDMJLyogUm9ja2V0cG9ydCBDb21wYWN0IFBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICovCisKKyNkZWZpbmUgVFRZX0dFVF9MSU5FKHQpIHQtPmluZGV4CisjZGVmaW5lIFRUWV9EUklWRVJfTUlOT1JfU1RBUlQodCkgdC0+ZHJpdmVyLT5taW5vcl9zdGFydAorI2RlZmluZSBUVFlfRFJJVkVSX1NVQlRZUEUodCkgdC0+ZHJpdmVyLT5zdWJ0eXBlCisjZGVmaW5lIFRUWV9EUklWRVJfTkFNRSh0KSB0LT5kcml2ZXItPm5hbWUKKyNkZWZpbmUgVFRZX0RSSVZFUl9OQU1FX0JBU0UodCkgdC0+ZHJpdmVyLT5uYW1lX2Jhc2UKKyNkZWZpbmUgVFRZX0RSSVZFUl9GTFVTSF9CVUZGRVJfRVhJU1RTKHQpIHQtPmRyaXZlci0+Zmx1c2hfYnVmZmVyCisjZGVmaW5lIFRUWV9EUklWRVJfRkxVU0hfQlVGRkVSKHQpIHQtPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHQpCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3J0Yy5jIGIvZHJpdmVycy9jaGFyL3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGYwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcnRjLmMKQEAgLTAsMCArMSwxMzU0IEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXgJCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgR29ydG1ha2VyCisgKgorICoJVGhpcyBkcml2ZXIgYWxsb3dzIHVzZSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIChidWlsdCBpbnRvCisgKgluZWFybHkgYWxsIGNvbXB1dGVycykgZnJvbSB1c2VyIHNwYWNlLiBJdCBleHBvcnRzIHRoZSAvZGV2L3J0YworICoJaW50ZXJmYWNlIHN1cHBvcnRpbmcgdmFyaW91cyBpb2N0bCgpIGFuZCBhbHNvIHRoZQorICoJL3Byb2MvZHJpdmVyL3J0YyBwc2V1ZG8tZmlsZSBmb3Igc3RhdHVzIGluZm9ybWF0aW9uLgorICoKKyAqCVRoZSBpb2N0bHMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbnRlcnJ1cHQgYmVoYXZpb3VyIGFuZAorICoJZ2VuZXJhdGlvbiByYXRlIGZyb20gdGhlIFJUQyB2aWEgSVJRIDguIFRoZW4gdGhlIC9kZXYvcnRjCisgKglpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgdGhlc2UgdGltZXIgaW50ZXJydXB0cywKKyAqCWJlIHRoZXkgaW50ZXJ2YWwgb3IgYWxhcm0gYmFzZWQuCisgKgorICoJVGhlIC9kZXYvcnRjIGludGVyZmFjZSB3aWxsIGJsb2NrIG9uIHJlYWRzIHVudGlsIGFuIGludGVycnVwdAorICoJaGFzIGJlZW4gcmVjZWl2ZWQuIElmIGEgUlRDIGludGVycnVwdCBoYXMgYWxyZWFkeSBoYXBwZW5lZCwKKyAqCWl0IHdpbGwgb3V0cHV0IGFuIHVuc2lnbmVkIGxvbmcgYW5kIHRoZW4gYmxvY2suIFRoZSBvdXRwdXQgdmFsdWUKKyAqCWNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZgorICoJaW50ZXJydXB0cyBzaW5jZSB0aGUgbGFzdCByZWFkIGluIHRoZSByZW1haW5pbmcgaGlnaCBieXRlcy4gVGhlIAorICoJL2Rldi9ydGMgaW50ZXJmYWNlIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgc2VsZWN0KDIpIGNhbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglCYXNlZCBvbiBvdGhlciBtaW5pbWFsIGNoYXIgZGV2aWNlIGRyaXZlcnMsIGxpa2UgQWxhbidzCisgKgl3YXRjaGRvZywgVGVkJ3MgcmFuZG9tLCBldGMuIGV0Yy4KKyAqCisgKgkxLjA3CVBhdWwgR29ydG1ha2VyLgorICoJMS4wOAlNaXF1ZWwgdmFuIFNtb29yZW5idXJnOiBkaXNhbGxvdyBjZXJ0YWluIHRoaW5ncyBvbiB0aGUKKyAqCQlERUMgQWxwaGEgYXMgdGhlIENNT1MgY2xvY2sgaXMgYWxzbyB1c2VkIGZvciBvdGhlciB0aGluZ3MuCisgKgkxLjA5CU5pa2l0YSBTY2htaWR0OiBlcG9jaCBzdXBwb3J0IGFuZCBzb21lIEFscGhhIGNsZWFudXAuCisgKgkxLjA5YQlQZXRlIFphaXRjZXY6IFN1biBTUEFSQworICoJMS4wOWIJSmVmZiBHYXJ6aWs6IE1vZHVsYXJpemUsIGluaXQgY2xlYW51cAorICoJMS4wOWMJSmVmZiBHYXJ6aWs6IFNNUCBjbGVhbnVwCisgKgkxLjEwICAgIFBhdWwgQmFydG9uLURhdmlzOiBhZGQgc3VwcG9ydCBmb3IgYXN5bmMgSS9PCisgKgkxLjEwYQlBbmRyZWEgQXJjYW5nZWxpOiBBbHBoYSB1cGRhdGVzCisgKgkxLjEwYglBbmRyZXcgTW9ydG9uOiBTTVAgbG9jayBmaXgKKyAqCTEuMTBjCUNlc2FyIEJhcnJvczogU01QIGxvY2tpbmcgZml4ZXMgYW5kIGNsZWFudXAKKyAqCTEuMTBkCVBhdWwgR29ydG1ha2VyOiBkZWxldGUgcGFyYW5vaWEgY2hlY2sgaW4gcnRjX2V4aXQKKyAqCTEuMTBlCU1hY2llaiBXLiBSb3p5Y2tpOiBIYW5kbGUgREVDc3RhdGlvbidzIHllYXIgd2VpcmRuZXNzLgorICogICAgICAxLjExICAgIFRha2FzaGkgSXdhaTogS2VybmVsIGFjY2VzcyBmdW5jdGlvbnMKKyAqCQkJICAgICAgcnRjX3JlZ2lzdGVyL3J0Y191bnJlZ2lzdGVyL3J0Y19jb250cm9sCisgKiAgICAgIDEuMTFhICAgRGFuaWVsZSBCZWxsdWNjaTogQXVkaXQgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSBpbiBydGNfaW5pdAorICoJMS4xMglWZW5rYXRlc2ggUGFsbGlwYWRpOiBIb29rcyBmb3IgZW11bGF0aW5nIHJ0YyBvbiBIUEVUIGJhc2UtdGltZXIKKyAqCQlDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworICoKKyAqLworCisjZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4xMiIKKworI2RlZmluZSBSVENfSU9fRVhURU5UCTB4OAorCisvKgorICoJTm90ZSB0aGF0ICphbGwqIGNhbGxzIHRvIENNT1NfUkVBRCBhbmQgQ01PU19XUklURSBhcmUgZG9uZSB3aXRoCisgKglpbnRlcnJ1cHRzIGRpc2FibGVkLiBEdWUgdG8gdGhlIGluZGV4LXBvcnQvZGF0YS1wb3J0ICgweDcwLzB4NzEpCisgKglkZXNpZ24gb2YgdGhlIFJUQywgd2UgZG9uJ3Qgd2FudCB0d28gZGlmZmVyZW50IHRoaW5ncyB0cnlpbmcgdG8KKyAqCWdldCB0byBpdCBhdCBvbmNlLiAoZS5nLiB0aGUgcGVyaW9kaWMgMTEgbWluIHN5bmMgZnJvbSB0aW1lLmMgdnMuCisgKgl0aGlzIGRyaXZlci4pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmIGRlZmluZWQoX19pMzg2X18pCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNlbmRpZgorCisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2VidXMuaD4KKyNpZmRlZiBfX3NwYXJjX3Y5X18KKyNpbmNsdWRlIDxhc20vaXNhLmg+CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3BvcnQ7CitzdGF0aWMgaW50IHJ0Y19pcnEgPSBQQ0lfSVJRX05PTkU7CisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19IUEVUX1JUQ19JUlEKKyN1bmRlZglSVENfSVJRCisjZW5kaWYKKworI2lmZGVmIFJUQ19JUlEKK3N0YXRpYyBpbnQgcnRjX2hhc19pcnEgPSAxOworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKyNkZWZpbmUgaXNfaHBldF9lbmFibGVkKCkJCQkwCisjZGVmaW5lIGhwZXRfc2V0X2FsYXJtX3RpbWUoaHJzLCBtaW4sIHNlYykgCTAKKyNkZWZpbmUgaHBldF9zZXRfcGVyaW9kaWNfZnJlcShhcmcpIAkJMAorI2RlZmluZSBocGV0X21hc2tfcnRjX2lycV9iaXQoYXJnKSAJCTAKKyNkZWZpbmUgaHBldF9zZXRfcnRjX2lycV9iaXQoYXJnKSAJCTAKKyNkZWZpbmUgaHBldF9ydGNfdGltZXJfaW5pdCgpIAkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaHBldF9ydGNfZHJvcHBlZF9pcnEoKSAJCQkwCitzdGF0aWMgaW5saW5lIGlycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSB7cmV0dXJuIDA7fQorI2Vsc2UKK2V4dGVybiBpcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKworLyoKKyAqCVdlIHNwb25nZSBhIG1pbm9yIG9mZiBvZiB0aGUgbWlzYyBtYWpvci4gTm8gbmVlZCBzbHVycGluZworICoJdXAgYW5vdGhlciB2YWx1YWJsZSBtYWpvciBkZXYgbnVtYmVyIGZvciB0aGlzLiBJZiB5b3UgYWRkCisgKglhbiBpb2N0bCwgbWFrZSBzdXJlIHlvdSBkb24ndCBjb25mbGljdCB3aXRoIFNQQVJDJ3MgUlRDCisgKglpb2N0bHMuCisgKi8KKworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpydGNfYXN5bmNfcXVldWU7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChydGNfd2FpdCk7CisKKyNpZmRlZiBSVENfSVJRCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcnRjX2lycV90aW1lcjsKKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCBydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworc3RhdGljIGludCBydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgUlRDX0lSUQorc3RhdGljIHVuc2lnbmVkIGludCBydGNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3J0Y19hbG1fdGltZSAoc3RydWN0IHJ0Y190aW1lICphbG1fdG0pOworI2lmZGVmIFJUQ19JUlEKK3N0YXRpYyB2b2lkIHJ0Y19kcm9wcGVkX2lycSh1bnNpZ25lZCBsb25nIGRhdGEpOworCitzdGF0aWMgdm9pZCBzZXRfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpOworc3RhdGljIHZvaWQgbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCk7CisjZW5kaWYKKworc3RhdGljIGludCBydGNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKworLyoKKyAqCUJpdHMgaW4gcnRjX3N0YXR1cy4gKDYgYml0cyBvZiByb29tIGZvciBmdXR1cmUgZXhwYW5zaW9uKQorICovCisKKyNkZWZpbmUgUlRDX0lTX09QRU4JCTB4MDEJLyogbWVhbnMgL2Rldi9ydGMgaXMgaW4gdXNlCSovCisjZGVmaW5lIFJUQ19USU1FUl9PTgkJMHgwMgkvKiBtaXNzZWQgaXJxIHRpbWVyIGFjdGl2ZQkqLworCisvKgorICogcnRjX3N0YXR1cyBpcyBuZXZlciBjaGFuZ2VkIGJ5IHJ0Y19pbnRlcnJ1cHQsIGFuZCBpb2N0bC9vcGVuL2Nsb3NlIGlzCisgKiBwcm90ZWN0ZWQgYnkgdGhlIGJpZyBrZXJuZWwgbG9jay4gSG93ZXZlciwgaW9jdGwgY2FuIHN0aWxsIGRpc2FibGUgdGhlIHRpbWVyCisgKiBpbiBydGNfc3RhdHVzIGFuZCB0aGVuIHdpdGggZGVsX3RpbWVyIGFmdGVyIHRoZSBpbnRlcnJ1cHQgaGFzIHJlYWQKKyAqIHJ0Y19zdGF0dXMgYnV0IGJlZm9yZSBtb2RfdGltZXIgaXMgY2FsbGVkLCB3aGljaCB3b3VsZCB0aGVuIHJlZW5hYmxlIHRoZQorICogdGltZXIgKGJ1dCB5b3Ugd291bGQgbmVlZCB0byBoYXZlIGFuIGF3ZnVsIHRpbWluZyBiZWZvcmUgeW91J2QgdHJpcCBvbiBpdCkKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3N0YXR1cyA9IDA7CS8qIGJpdG1hcHBlZCBzdGF0dXMgYnl0ZS4JKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19mcmVxID0gMDsJLyogQ3VycmVudCBwZXJpb2RpYyBJUlEgcmF0ZQkqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX2lycV9kYXRhID0gMDsJLyogb3VyIG91dHB1dCB0byB0aGUgd29ybGQJKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19tYXhfdXNlcl9mcmVxID0gNjQ7IC8qID4gdGhpcywgbmVlZCBDQVBfU1lTX1JFU09VUkNFICovCisKKyNpZmRlZiBSVENfSVJRCisvKgorICogcnRjX3Rhc2tfbG9jayBuZXN0cyBpbnNpZGUgcnRjX2xvY2suCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRjX3Rhc2tfbG9jayk7CitzdGF0aWMgcnRjX3Rhc2tfdCAqcnRjX2NhbGxiYWNrID0gTlVMTDsKKyNlbmRpZgorCisvKgorICoJSWYgdGhpcyBkcml2ZXIgZXZlciBiZWNvbWVzIG1vZHVsYXJpc2VkLCBpdCB3aWxsIGJlIHJlYWxseSBuaWNlCisgKgl0byBtYWtlIHRoZSBlcG9jaCByZXRhaW4gaXRzIHZhbHVlIGFjcm9zcyBtb2R1bGUgcmVsb2FkLi4uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXBvY2ggPSAxOTAwOwkvKiB5ZWFyIGNvcnJlc3BvbmRpbmcgdG8gMHgwMAkqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXlzX2luX21vW10gPSAKK3swLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIGNsb2NrIHVwZGF0ZSBpcyBpbiBwcm9ncmVzcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnRjX2lzX3VwZGF0aW5nKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB1aXA7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJdWlwID0gKENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpICYgUlRDX1VJUCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIHVpcDsKK30KKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKglBIHZlcnkgdGlueSBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgcnVucyB3aXRoIFNBX0lOVEVSUlVQVCBzZXQsCisgKglidXQgdGhlcmUgaXMgcG9zc2liaWxpdHkgb2YgY29uZmxpY3Rpbmcgd2l0aCB0aGUgc2V0X3J0Y19tbXNzKCkKKyAqCWNhbGwgKHRoZSBydGMgaXJxIGFuZCB0aGUgdGltZXIgaXJxIGNhbiBlYXNpbHkgcnVuIGF0IHRoZSBzYW1lCisgKgl0aW1lIGluIHR3byBkaWZmZXJlbnQgQ1BVcykuIFNvIHdlIG5lZWQgdG8gc2VyaWFsaXplCisgKglhY2Nlc3NlcyB0byB0aGUgY2hpcCB3aXRoIHRoZSBydGNfbG9jayBzcGlubG9jayB0aGF0IGVhY2gKKyAqCWFyY2hpdGVjdHVyZSBzaG91bGQgaW1wbGVtZW50IGluIHRoZSB0aW1lciBjb2RlLgorICoJKFNlZSAuL2FyY2gvWFhYWC9rZXJuZWwvdGltZS5jIGZvciB0aGUgc2V0X3J0Y19tbXNzKCkgZnVuY3Rpb24uKQorICovCisKK2lycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqCUNhbiBiZSBhbiBhbGFybSBpbnRlcnJ1cHQsIHVwZGF0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQsCisJICoJb3IgYSBwZXJpb2RpYyBpbnRlcnJ1cHQuIFdlIHN0b3JlIHRoZSBzdGF0dXMgaW4gdGhlCisJICoJbG93IGJ5dGUgYW5kIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyByZWNlaXZlZCBzaW5jZQorCSAqCXRoZSBsYXN0IHJlYWQgaW4gdGhlIHJlbWFpbmRlciBvZiBydGNfaXJxX2RhdGEuCisJICovCisKKwlzcGluX2xvY2sgKCZydGNfbG9jayk7CisJcnRjX2lycV9kYXRhICs9IDB4MTAwOworCXJ0Y19pcnFfZGF0YSAmPSB+MHhmZjsKKwlpZiAoaXNfaHBldF9lbmFibGVkKCkpIHsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlIGl0IGlzIEhQRVQgUlRDIGludGVycnVwdCBoYW5kbGVyCisJCSAqIGNhbGxpbmcgdXMsIHdpdGggdGhlIGludGVycnVwdCBpbmZvcm1hdGlvbgorCQkgKiBwYXNzZWQgYXMgYXJnMSwgaW5zdGVhZCBvZiBpcnEuCisJCSAqLworCQlydGNfaXJxX2RhdGEgfD0gKHVuc2lnbmVkIGxvbmcpaXJxICYgMHhGMDsKKwl9IGVsc2UgeworCQlydGNfaXJxX2RhdGEgfD0gKENNT1NfUkVBRChSVENfSU5UUl9GTEFHUykgJiAweEYwKTsKKwl9CisKKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikKKwkJbW9kX3RpbWVyKCZydGNfaXJxX3RpbWVyLCBqaWZmaWVzICsgSFovcnRjX2ZyZXEgKyAyKkhaLzEwMCk7CisKKwlzcGluX3VubG9jayAoJnJ0Y19sb2NrKTsKKworCS8qIE5vdyBkbyB0aGUgcmVzdCBvZiB0aGUgYWN0aW9ucyAqLworCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjaykKKwkJcnRjX2NhbGxiYWNrLT5mdW5jKHJ0Y19jYWxsYmFjay0+cHJpdmF0ZV9kYXRhKTsKKwlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CQorCisJa2lsbF9mYXN5bmMgKCZydGNfYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgorCisvKgorICogc3lzY3RsLXR1bmluZyBpbmZyYXN0cnVjdHVyZS4KKyAqLworc3RhdGljIGN0bF90YWJsZSBydGNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IDEsCisJCS5wcm9jbmFtZQk9ICJtYXgtdXNlci1mcmVxIiwKKwkJLmRhdGEJCT0gJnJ0Y19tYXhfdXNlcl9mcmVxLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBydGNfcm9vdFtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gMSwKKwkJLnByb2NuYW1lCT0gInJ0YyIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHJ0Y190YWJsZSwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGRldl9yb290W10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfREVWLAorCQkucHJvY25hbWUJPSAiZGV2IiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gcnRjX3Jvb3QsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxfaGVhZGVyOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5c2N0bCh2b2lkKQoreworICAgIHN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoZGV2X3Jvb3QsIDApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zeXNjdGwodm9pZCkKK3sKKyAgICB1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKK30KKworLyoKKyAqCU5vdyBhbGwgdGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHRoYXQgd2UgZXhwb3J0LgorICovCisKK3N0YXRpYyBzc2l6ZV90IHJ0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisjaWZuZGVmIFJUQ19JUlEKKwlyZXR1cm4gLUVJTzsKKyNlbHNlCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXNzaXplX3QgcmV0dmFsOworCQorCWlmIChydGNfaGFzX2lycSA9PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjb3VudCA8IHNpemVvZih1bnNpZ25lZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkX3dhaXRfcXVldWUoJnJ0Y193YWl0LCAmd2FpdCk7CisKKwlkbyB7CisJCS8qIEZpcnN0IG1ha2UgaXQgcmlnaHQuIFRoZW4gbWFrZSBpdCBmYXN0LiBQdXR0aW5nIHRoaXMgd2hvbGUKKwkJICogYmxvY2sgd2l0aGluIHRoZSBwYXJlbnRoZXNlcyBvZiBhIHdoaWxlIHdvdWxkIGJlIHRvbworCQkgKiBjb25mdXNpbmcuIEFuZCBubywgeGNoZygpIGlzIG5vdCB0aGUgYW5zd2VyLiAqLworCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCisJCXNwaW5fbG9ja19pcnEgKCZydGNfbG9jayk7CisJCWRhdGEgPSBydGNfaXJxX2RhdGE7CisJCXJ0Y19pcnFfZGF0YSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKworCQlpZiAoZGF0YSAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0gd2hpbGUgKDEpOworCisJaWYgKGNvdW50IDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWJ1ZikgPzogc2l6ZW9mKGludCk7IAorCWVsc2UKKwkJcmV0dmFsID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKSA/OiBzaXplb2YobG9uZyk7Cisgb3V0OgorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZydGNfd2FpdCwgJndhaXQpOworCisJcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHJ0Y19kb19pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGtlcm5lbCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7IAorCisjaWZkZWYgUlRDX0lSUQorCWlmIChydGNfaGFzX2lycSA9PSAwKSB7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgUlRDX0FJRV9PRkY6CisJCWNhc2UgUlRDX0FJRV9PTjoKKwkJY2FzZSBSVENfUElFX09GRjoKKwkJY2FzZSBSVENfUElFX09OOgorCQljYXNlIFJUQ19VSUVfT0ZGOgorCQljYXNlIFJUQ19VSUVfT046CisJCWNhc2UgUlRDX0lSUVBfUkVBRDoKKwkJY2FzZSBSVENfSVJRUF9TRVQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfTsKKwl9CisjZW5kaWYKKworCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgUlRDX0lSUQorCWNhc2UgUlRDX0FJRV9PRkY6CS8qIE1hc2sgYWxhcm0gaW50LiBlbmFiLiBiaXQJKi8KKwl7CisJCW1hc2tfcnRjX2lycV9iaXQoUlRDX0FJRSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19BSUVfT046CS8qIEFsbG93IGFsYXJtIGludGVycnVwdHMuCSovCisJeworCQlzZXRfcnRjX2lycV9iaXQoUlRDX0FJRSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19QSUVfT0ZGOgkvKiBNYXNrIHBlcmlvZGljIGludC4gZW5hYi4gYml0CSovCisJeworCQltYXNrX3J0Y19pcnFfYml0KFJUQ19QSUUpOworCQlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikgeworCQkJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwkJCXJ0Y19zdGF0dXMgJj0gflJUQ19USU1FUl9PTjsKKwkJCWRlbF90aW1lcigmcnRjX2lycV90aW1lcik7CisJCQlzcGluX3VubG9ja19pcnEgKCZydGNfbG9jayk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1BJRV9PTjoJLyogQWxsb3cgcGVyaW9kaWMgaW50cwkJKi8KKwl7CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgcmVhbGx5IHdhbnQgSm9lIFVzZXIgZW5hYmxpbmcgbW9yZQorCQkgKiB0aGFuIDY0SHogb2YgaW50ZXJydXB0cyBvbiBhIG11bHRpLXVzZXIgbWFjaGluZS4KKwkJICovCisJCWlmICgha2VybmVsICYmIChydGNfZnJlcSA+IHJ0Y19tYXhfdXNlcl9mcmVxKSAmJgorCQkJKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmICghKHJ0Y19zdGF0dXMgJiBSVENfVElNRVJfT04pKSB7CisJCQlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCQkJcnRjX2lycV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaL3J0Y19mcmVxICsgMipIWi8xMDA7CisJCQlhZGRfdGltZXIoJnJ0Y19pcnFfdGltZXIpOworCQkJcnRjX3N0YXR1cyB8PSBSVENfVElNRVJfT047CisJCQlzcGluX3VubG9ja19pcnEgKCZydGNfbG9jayk7CisJCX0KKwkJc2V0X3J0Y19pcnFfYml0KFJUQ19QSUUpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfVUlFX09GRjoJLyogTWFzayBpbnRzIGZyb20gUlRDIHVwZGF0ZXMuCSovCisJeworCQltYXNrX3J0Y19pcnFfYml0KFJUQ19VSUUpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfVUlFX09OOgkvKiBBbGxvdyBpbnRzIGZvciBSVEMgdXBkYXRlcy4JKi8KKwl7CisJCXNldF9ydGNfaXJxX2JpdChSVENfVUlFKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJY2FzZSBSVENfQUxNX1JFQUQ6CS8qIFJlYWQgdGhlIHByZXNlbnQgYWxhcm0gdGltZSAqLworCXsKKwkJLyoKKwkJICogVGhpcyByZXR1cm5zIGEgc3RydWN0IHJ0Y190aW1lLiBSZWFkaW5nID49IDB4YzAKKwkJICogbWVhbnMgImRvbid0IGNhcmUiIG9yICJtYXRjaCBhbGwiLiBPbmx5IHRoZSB0bV9ob3VyLAorCQkgKiB0bV9taW4sIGFuZCB0bV9zZWMgdmFsdWVzIGFyZSBmaWxsZWQgaW4uCisJCSAqLworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJCWdldF9ydGNfYWxtX3RpbWUoJnd0aW1lKTsKKwkJYnJlYWs7IAorCX0KKwljYXNlIFJUQ19BTE1fU0VUOgkvKiBTdG9yZSBhIHRpbWUgaW50byB0aGUgYWxhcm0gKi8KKwl7CisJCS8qCisJCSAqIFRoaXMgZXhwZWN0cyBhIHN0cnVjdCBydGNfdGltZS4gV3JpdGluZyAweGZmIG1lYW5zCisJCSAqICJkb24ndCBjYXJlIiBvciAibWF0Y2ggYWxsIi4gT25seSB0aGUgdG1faG91ciwKKwkJICogdG1fbWluIGFuZCB0bV9zZWMgYXJlIHVzZWQuCisJCSAqLworCQl1bnNpZ25lZCBjaGFyIGhycywgbWluLCBzZWM7CisJCXN0cnVjdCBydGNfdGltZSBhbG1fdG07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbG1fdG0sIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWhycyA9IGFsbV90bS50bV9ob3VyOworCQltaW4gPSBhbG1fdG0udG1fbWluOworCQlzZWMgPSBhbG1fdG0udG1fc2VjOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJaWYgKGhwZXRfc2V0X2FsYXJtX3RpbWUoaHJzLCBtaW4sIHNlYykpIHsKKwkJCS8qCisJCQkgKiBGYWxsdGhydSBhbmQgc2V0IGFsYXJtIHRpbWUgaW4gQ01PUyB0b28sCisJCQkgKiBzbyB0aGF0IHdlIHdpbGwgZ2V0IHByb3BlciB2YWx1ZSBpbiBSVENfQUxNX1JFQUQKKwkJCSAqLworCQl9CisJCWlmICghKENNT1NfUkVBRChSVENfQ09OVFJPTCkgJiBSVENfRE1fQklOQVJZKSB8fAorCQkgICAgUlRDX0FMV0FZU19CQ0QpCisJCXsKKwkJCWlmIChzZWMgPCA2MCkgQklOX1RPX0JDRChzZWMpOworCQkJZWxzZSBzZWMgPSAweGZmOworCisJCQlpZiAobWluIDwgNjApIEJJTl9UT19CQ0QobWluKTsKKwkJCWVsc2UgbWluID0gMHhmZjsKKworCQkJaWYgKGhycyA8IDI0KSBCSU5fVE9fQkNEKGhycyk7CisJCQllbHNlIGhycyA9IDB4ZmY7CisJCX0KKwkJQ01PU19XUklURShocnMsIFJUQ19IT1VSU19BTEFSTSk7CisJCUNNT1NfV1JJVEUobWluLCBSVENfTUlOVVRFU19BTEFSTSk7CisJCUNNT1NfV1JJVEUoc2VjLCBSVENfU0VDT05EU19BTEFSTSk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19SRF9USU1FOgkvKiBSZWFkIHRoZSB0aW1lL2RhdGUgZnJvbSBSVEMJKi8KKwl7CisJCW1lbXNldCgmd3RpbWUsIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwkJcnRjX2dldF9ydGNfdGltZSgmd3RpbWUpOworCQlicmVhazsKKwl9CisJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCisJeworCQlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCQl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjLCBsZWFwX3lyOworCQl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbCwgc2F2ZV9mcmVxX3NlbGVjdDsKKwkJdW5zaWduZWQgaW50IHlyczsKKyNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCisJCXVuc2lnbmVkIGludCByZWFsX3lyczsKKyNlbmRpZgorCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXlycyA9IHJ0Y190bS50bV95ZWFyICsgMTkwMDsKKwkJbW9uID0gcnRjX3RtLnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJCWRheSA9IHJ0Y190bS50bV9tZGF5OworCQlocnMgPSBydGNfdG0udG1faG91cjsKKwkJbWluID0gcnRjX3RtLnRtX21pbjsKKwkJc2VjID0gcnRjX3RtLnRtX3NlYzsKKworCQlpZiAoeXJzIDwgMTk3MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxlYXBfeXIgPSAoKCEoeXJzICUgNCkgJiYgKHlycyAlIDEwMCkpIHx8ICEoeXJzICUgNDAwKSk7CisKKwkJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChkYXkgPiAoZGF5c19pbl9tb1ttb25dICsgKChtb24gPT0gMikgJiYgbGVhcF95cikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJaWYgKChocnMgPj0gMjQpIHx8IChtaW4gPj0gNjApIHx8IChzZWMgPj0gNjApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCh5cnMgLT0gZXBvY2gpID4gMjU1KSAgICAvKiBUaGV5IGFyZSB1bnNpZ25lZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KKwkJcmVhbF95cnMgPSB5cnM7CisJCXlycyA9IDcyOworCisJCS8qCisJCSAqIFdlIHdhbnQgdG8ga2VlcCB0aGUgeWVhciBzZXQgdG8gNzMgdW50aWwgTWFyY2gKKwkJICogZm9yIG5vbi1sZWFwIHllYXJzLCBzbyB0aGF0IEZlYiwgMjl0aCBpcyBoYW5kbGVkCisJCSAqIGNvcnJlY3RseS4KKwkJICovCisJCWlmICghbGVhcF95ciAmJiBtb24gPCAzKSB7CisJCQlyZWFsX3lycy0tOworCQkJeXJzID0gNzM7CisJCX0KKyNlbmRpZgorCQkvKiBUaGVzZSBsaW1pdHMgYW5kIGFkanVzdG1lbnRzIGFyZSBpbmRlcGVuZGVudCBvZgorCQkgKiB3aGV0aGVyIHRoZSBjaGlwIGlzIGluIGJpbmFyeSBtb2RlIG9yIG5vdC4KKwkJICovCisJCWlmICh5cnMgPiAxNjkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHlycyA+PSAxMDApCisJCQl5cnMgLT0gMTAwOworCisJCWlmICghKENNT1NfUkVBRChSVENfQ09OVFJPTCkgJiBSVENfRE1fQklOQVJZKQorCQkgICAgfHwgUlRDX0FMV0FZU19CQ0QpIHsKKwkJCUJJTl9UT19CQ0Qoc2VjKTsKKwkJCUJJTl9UT19CQ0QobWluKTsKKwkJCUJJTl9UT19CQ0QoaHJzKTsKKwkJCUJJTl9UT19CQ0QoZGF5KTsKKwkJCUJJTl9UT19CQ0QobW9uKTsKKwkJCUJJTl9UT19CQ0QoeXJzKTsKKwkJfQorCisJCXNhdmVfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJCUNNT1NfV1JJVEUoKHNhdmVfY29udHJvbHxSVENfU0VUKSwgUlRDX0NPTlRST0wpOworCQlzYXZlX2ZyZXFfc2VsZWN0ID0gQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCk7CisJCUNNT1NfV1JJVEUoKHNhdmVfZnJlcV9zZWxlY3R8UlRDX0RJVl9SRVNFVDIpLCBSVENfRlJFUV9TRUxFQ1QpOworCisjaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgorCQlDTU9TX1dSSVRFKHJlYWxfeXJzLCBSVENfREVDX1lFQVIpOworI2VuZGlmCisJCUNNT1NfV1JJVEUoeXJzLCBSVENfWUVBUik7CisJCUNNT1NfV1JJVEUobW9uLCBSVENfTU9OVEgpOworCQlDTU9TX1dSSVRFKGRheSwgUlRDX0RBWV9PRl9NT05USCk7CisJCUNNT1NfV1JJVEUoaHJzLCBSVENfSE9VUlMpOworCQlDTU9TX1dSSVRFKG1pbiwgUlRDX01JTlVURVMpOworCQlDTU9TX1dSSVRFKHNlYywgUlRDX1NFQ09ORFMpOworCisJCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sLCBSVENfQ09OVFJPTCk7CisJCUNNT1NfV1JJVEUoc2F2ZV9mcmVxX3NlbGVjdCwgUlRDX0ZSRVFfU0VMRUNUKTsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIFJUQ19JUlEKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CS8qIFJlYWQgdGhlIHBlcmlvZGljIElSUSByYXRlLgkqLworCXsKKwkJcmV0dXJuIHB1dF91c2VyKHJ0Y19mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOworCX0KKwljYXNlIFJUQ19JUlFQX1NFVDoJLyogU2V0IHBlcmlvZGljIElSUSByYXRlLgkqLworCXsKKwkJaW50IHRtcCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgdmFsOworCisJCS8qIAorCQkgKiBUaGUgbWF4IHdlIGNhbiBkbyBpcyA4MTkySHouCisJCSAqLworCQlpZiAoKGFyZyA8IDIpIHx8IChhcmcgPiA4MTkyKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBXZSBkb24ndCByZWFsbHkgd2FudCBKb2UgVXNlciBnZW5lcmF0aW5nIG1vcmUKKwkJICogdGhhbiA2NEh6IG9mIGludGVycnVwdHMgb24gYSBtdWx0aS11c2VyIG1hY2hpbmUuCisJCSAqLworCQlpZiAoIWtlcm5lbCAmJiAoYXJnID4gcnRjX21heF91c2VyX2ZyZXEpICYmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQl3aGlsZSAoYXJnID4gKDE8PHRtcCkpCisJCQl0bXArKzsKKworCQkvKgorCQkgKiBDaGVjayB0aGF0IHRoZSBpbnB1dCB3YXMgcmVhbGx5IGEgcG93ZXIgb2YgMi4KKwkJICovCisJCWlmIChhcmcgIT0gKDE8PHRtcCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCWlmIChocGV0X3NldF9wZXJpb2RpY19mcmVxKGFyZykpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcnRjX2ZyZXEgPSBhcmc7CisKKwkJdmFsID0gQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiAweGYwOworCQl2YWwgfD0gKDE2IC0gdG1wKTsKKwkJQ01PU19XUklURSh2YWwsIFJUQ19GUkVRX1NFTEVDVCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwljYXNlIFJUQ19FUE9DSF9SRUFEOgkvKiBSZWFkIHRoZSBlcG9jaC4JKi8KKwl7CisJCXJldHVybiBwdXRfdXNlciAoZXBvY2gsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CisJfQorCWNhc2UgUlRDX0VQT0NIX1NFVDoJLyogU2V0IHRoZSBlcG9jaC4JKi8KKwl7CisJCS8qIAorCQkgKiBUaGVyZSB3ZXJlIG5vIFJUQyBjbG9ja3MgYmVmb3JlIDE5MDAuCisJCSAqLworCQlpZiAoYXJnIDwgMTkwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJZXBvY2ggPSBhcmc7CisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ3dGltZSwgc2l6ZW9mIHd0aW1lKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gcnRjX2RvX2lvY3RsKGNtZCwgYXJnLCAwKTsKK30KKworLyoKKyAqCVdlIGVuZm9yY2Ugb25seSBvbmUgdXNlciBhdCBhIHRpbWUgaGVyZSB3aXRoIHRoZSBvcGVuL2Nsb3NlLgorICoJQWxzbyBjbGVhciB0aGUgcHJldmlvdXMgaW50ZXJydXB0IGRhdGEgb24gYW4gb3BlbiwgYW5kIGNsZWFuCisgKgl1cCB0aGluZ3Mgb24gYSBjbG9zZS4KKyAqLworCisvKiBXZSB1c2UgcnRjX2xvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgb3BlbnMuIFNvIHRoZSBCS0wgaXMgbm90CisgKiBuZWVkZWQgaGVyZS4gT3IgYW55d2hlcmUgZWxzZSBpbiB0aGlzIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKworCWlmKHJ0Y19zdGF0dXMgJiBSVENfSVNfT1BFTikKKwkJZ290byBvdXRfYnVzeTsKKworCXJ0Y19zdGF0dXMgfD0gUlRDX0lTX09QRU47CisKKwlydGNfaXJxX2RhdGEgPSAwOworCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gMDsKKworb3V0X2J1c3k6CisJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgcnRjX2Zhc3luYyAoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQorCit7CisJcmV0dXJuIGZhc3luY19oZWxwZXIgKGZkLCBmaWxwLCBvbiwgJnJ0Y19hc3luY19xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgcnRjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisjaWZkZWYgUlRDX0lSUQorCXVuc2lnbmVkIGNoYXIgdG1wOworCisJaWYgKHJ0Y19oYXNfaXJxID09IDApCisJCWdvdG8gbm9faXJxOworCisJLyoKKwkgKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyBvbmNlIHRoZSBkZXZpY2UgaXMgbm8gbG9uZ2VyCisJICogaW4gdXNlLCBhbmQgY2xlYXIgdGhlIGRhdGEuCisJICovCisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKCFocGV0X21hc2tfcnRjX2lycV9iaXQoUlRDX1BJRSB8IFJUQ19BSUUgfCBSVENfVUlFKSkgeworCQl0bXAgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCQl0bXAgJj0gIH5SVENfUElFOworCQl0bXAgJj0gIH5SVENfQUlFOworCQl0bXAgJj0gIH5SVENfVUlFOworCQlDTU9TX1dSSVRFKHRtcCwgUlRDX0NPTlRST0wpOworCQlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCX0KKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikgeworCQlydGNfc3RhdHVzICY9IH5SVENfVElNRVJfT047CisJCWRlbF90aW1lcigmcnRjX2lycV90aW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGQVNZTkMpIHsKKwkJcnRjX2Zhc3luYyAoLTEsIGZpbGUsIDApOworCX0KK25vX2lycToKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwlydGNfaXJxX2RhdGEgPSAwOworCXJ0Y19zdGF0dXMgJj0gflJUQ19JU19PUEVOOworCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFJUQ19JUlEKKy8qIENhbGxlZCB3aXRob3V0IHRoZSBrZXJuZWwgbG9jayAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgbG9uZyBsOworCisJaWYgKHJ0Y19oYXNfaXJxID09IDApCisJCXJldHVybiAwOworCisJcG9sbF93YWl0KGZpbGUsICZydGNfd2FpdCwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCWwgPSBydGNfaXJxX2RhdGE7CisJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCisJaWYgKGwgIT0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIGV4cG9ydGVkIHN0dWZmcworICovCisKK0VYUE9SVF9TWU1CT0wocnRjX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wocnRjX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChydGNfY29udHJvbCk7CisKK2ludCBydGNfcmVnaXN0ZXIocnRjX3Rhc2tfdCAqdGFzaykKK3sKKyNpZm5kZWYgUlRDX0lSUQorCXJldHVybiAtRUlPOworI2Vsc2UKKwlpZiAodGFzayA9PSBOVUxMIHx8IHRhc2stPmZ1bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWlmIChydGNfc3RhdHVzICYgUlRDX0lTX09QRU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjaykgeworCQlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlydGNfc3RhdHVzIHw9IFJUQ19JU19PUEVOOworCXJ0Y19jYWxsYmFjayA9IHRhc2s7CisJc3Bpbl91bmxvY2soJnJ0Y190YXNrX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCXJldHVybiAwOworI2VuZGlmCit9CisKK2ludCBydGNfdW5yZWdpc3RlcihydGNfdGFza190ICp0YXNrKQoreworI2lmbmRlZiBSVENfSVJRCisJcmV0dXJuIC1FSU87CisjZWxzZQorCXVuc2lnbmVkIGNoYXIgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjayAhPSB0YXNrKSB7CisJCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXJ0Y19jYWxsYmFjayA9IE5VTEw7CisJCisJLyogZGlzYWJsZSBjb250cm9scyAqLworCWlmICghaHBldF9tYXNrX3J0Y19pcnFfYml0KFJUQ19QSUUgfCBSVENfQUlFIHwgUlRDX1VJRSkpIHsKKwkJdG1wID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwkJdG1wICY9IH5SVENfUElFOworCQl0bXAgJj0gflJUQ19BSUU7CisJCXRtcCAmPSB+UlRDX1VJRTsKKwkJQ01PU19XUklURSh0bXAsIFJUQ19DT05UUk9MKTsKKwkJQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKwl9CisJaWYgKHJ0Y19zdGF0dXMgJiBSVENfVElNRVJfT04pIHsKKwkJcnRjX3N0YXR1cyAmPSB+UlRDX1RJTUVSX09OOworCQlkZWxfdGltZXIoJnJ0Y19pcnFfdGltZXIpOworCX0KKwlydGNfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKwlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IHJ0Y19jb250cm9sKHJ0Y190YXNrX3QgKnRhc2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworI2lmbmRlZiBSVENfSVJRCisJcmV0dXJuIC1FSU87CisjZWxzZQorCXNwaW5fbG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCWlmIChydGNfY2FsbGJhY2sgIT0gdGFzaykgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCXJldHVybiBydGNfZG9faW9jdGwoY21kLCBhcmcsIDEpOworI2VuZGlmCit9CisKKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBydGNfcmVhZCwKKyNpZmRlZiBSVENfSVJRCisJLnBvbGwJCT0gcnRjX3BvbGwsCisjZW5kaWYKKwkuaW9jdGwJCT0gcnRjX2lvY3RsLAorCS5vcGVuCQk9IHJ0Y19vcGVuLAorCS5yZWxlYXNlCT0gcnRjX3JlbGVhc2UsCisJLmZhc3luYwkJPSBydGNfZmFzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJ0Y19kZXYgPSB7CisJLm1pbm9yCQk9IFJUQ19NSU5PUiwKKwkubmFtZQkJPSAicnRjIiwKKwkuZm9wcwkJPSAmcnRjX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfcHJvY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcnRjX3Byb2Nfb3BlbiwKKwkucmVhZCAgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisjaWYgZGVmaW5lZChSVENfSVJRKSAmJiAhZGVmaW5lZChfX3NwYXJjX18pCitzdGF0aWMgaXJxcmV0dXJuX3QgKCpydGNfaW50X2hhbmRsZXJfcHRyKShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBydGNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCXVuc2lnbmVkIGludCB5ZWFyLCBjdHJsOworCXVuc2lnbmVkIGxvbmcgdWlwX3dhdGNoZG9nOworCWNoYXIgKmd1ZXNzID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIF9fc3BhcmNfXworCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOworCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldjsKKyNpZmRlZiBfX3NwYXJjX3Y5X18KKwlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZSAqaXNhX2JyOworCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fc3BhcmNfXworCWZvcl9lYWNoX2VidXMoZWJ1cykgeworCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKKwkJCWlmKHN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJydGMiKSA9PSAwKSB7CisJCQkJcnRjX3BvcnQgPSBlZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwkJCQlydGNfaXJxID0gZWRldi0+aXJxc1swXTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJfQorI2lmZGVmIF9fc3BhcmNfdjlfXworCWZvcl9lYWNoX2lzYShpc2FfYnIpIHsKKwkJZm9yX2VhY2hfaXNhZGV2KGlzYV9kZXYsIGlzYV9icikgeworCQkJaWYgKHN0cmNtcChpc2FfZGV2LT5wcm9tX25hbWUsICJydGMiKSA9PSAwKSB7CisJCQkJcnRjX3BvcnQgPSBpc2FfZGV2LT5yZXNvdXJjZS5zdGFydDsKKwkJCQlydGNfaXJxID0gaXNhX2Rldi0+aXJxOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlwcmludGsoS0VSTl9FUlIgInJ0Y19pbml0OiBubyBQQyBydGMgZm91bmRcbiIpOworCXJldHVybiAtRUlPOworCitmb3VuZDoKKwlpZiAocnRjX2lycSA9PSBQQ0lfSVJRX05PTkUpIHsKKwkJcnRjX2hhc19pcnEgPSAwOworCQlnb3RvIG5vX2lycTsKKwl9CisKKwkvKgorCSAqIFhYWCBJbnRlcnJ1cHQgcGluICM3IGluIEVzcHJlc3NvIGlzIHNoYXJlZCBiZXR3ZWVuIFJUQyBhbmQKKwkgKiBQQ0kgU2xvdCAyIElOVEEjIChhbmQgc29tZSBJTlR4IyBpbiBTbG90IDEpLiBTQV9JTlRFUlJVUFQgaGVyZQorCSAqIGlzIGFza2luZyBmb3IgdHJvdWJsZSB3aXRoIGFkZC1vbiBib2FyZHMuIENoYW5nZSB0byBTQV9TSElSUS4KKwkgKi8KKwlpZiAocmVxdWVzdF9pcnEocnRjX2lycSwgcnRjX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCAicnRjIiwgKHZvaWQgKikmcnRjX3BvcnQpKSB7CisJCS8qCisJCSAqIFN0YW5kYXJkIHdheSBmb3Igc3BhcmMgdG8gcHJpbnQgaXJxJ3MgaXMgdG8gdXNlCisJCSAqIF9faXJxX2l0b2EoKS4gSSB0aGluayBmb3IgRUJ1cyBpdCdzIG9rIHRvIHVzZSAlZC4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAicnRjOiBjYW5ub3QgcmVnaXN0ZXIgSVJRICVkXG4iLCBydGNfaXJxKTsKKwkJcmV0dXJuIC1FSU87CisJfQorbm9faXJxOgorI2Vsc2UKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5ULCAicnRjIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGM6IEkvTyBwb3J0ICVkIGlzIG5vdCBmcmVlLlxuIiwgUlRDX1BPUlQgKDApKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisjaWZkZWYgUlRDX0lSUQorCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgeworCQlydGNfaW50X2hhbmRsZXJfcHRyID0gaHBldF9ydGNfaW50ZXJydXB0OworCX0gZWxzZSB7CisJCXJ0Y19pbnRfaGFuZGxlcl9wdHIgPSBydGNfaW50ZXJydXB0OworCX0KKworCWlmKHJlcXVlc3RfaXJxKFJUQ19JUlEsIHJ0Y19pbnRfaGFuZGxlcl9wdHIsIFNBX0lOVEVSUlVQVCwgInJ0YyIsIE5VTEwpKSB7CisJCS8qIFllYWggcmlnaHQsIHNlZWluZyBhcyBpcnEgOCBkb2Vzbid0IGV2ZW4gaGl0IHRoZSBidXMuICovCisJCXByaW50ayhLRVJOX0VSUiAicnRjOiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBSVENfSVJRKTsKKwkJcmVsZWFzZV9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaHBldF9ydGNfdGltZXJfaW5pdCgpOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fc3BhcmNfXyB2cy4gb3RoZXJzICovCisKKwlpZiAobWlzY19yZWdpc3RlcigmcnRjX2RldikpIHsKKyNpZmRlZiBSVENfSVJRCisJCWZyZWVfaXJxKFJUQ19JUlEsIE5VTEwpOworI2VuZGlmCisJCXJlbGVhc2VfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5UKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoImRyaXZlci9ydGMiLCAwLCBOVUxMKTsKKwlpZiAoIWVudCkgeworI2lmZGVmIFJUQ19JUlEKKwkJZnJlZV9pcnEoUlRDX0lSUSwgTlVMTCk7CisjZW5kaWYKKwkJcmVsZWFzZV9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQpOworCQltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19kZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZW50LT5wcm9jX2ZvcHMgPSAmcnRjX3Byb2NfZm9wczsKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCXJ0Y19mcmVxID0gSFo7CisJCisJLyogRWFjaCBvcGVyYXRpbmcgc3lzdGVtIG9uIGFuIEFscGhhIHVzZXMgaXRzIG93biBlcG9jaC4KKwkgICBMZXQncyB0cnkgdG8gZ3Vlc3Mgd2hpY2ggb25lIHdlIGFyZSB1c2luZyBub3cuICovCisJCisJdWlwX3dhdGNoZG9nID0gamlmZmllczsKKwlpZiAocnRjX2lzX3VwZGF0aW5nKCkgIT0gMCkKKwkJd2hpbGUgKGppZmZpZXMgLSB1aXBfd2F0Y2hkb2cgPCAyKkhaLzEwMCkgeyAKKwkJCWJhcnJpZXIoKTsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXllYXIgPSBDTU9TX1JFQUQoUlRDX1lFQVIpOworCWN0cmwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQorCWlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkKKwkJQkNEX1RPX0JJTih5ZWFyKTsgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCisJaWYgKHllYXIgPCAyMCkgeworCQllcG9jaCA9IDIwMDA7CisJCWd1ZXNzID0gIlNSTSAocG9zdC0yMDAwKSI7CisJfSBlbHNlIGlmICh5ZWFyID49IDIwICYmIHllYXIgPCA0OCkgeworCQllcG9jaCA9IDE5ODA7CisJCWd1ZXNzID0gIkFSQyBjb25zb2xlIjsKKwl9IGVsc2UgaWYgKHllYXIgPj0gNDggJiYgeWVhciA8IDcyKSB7CisJCWVwb2NoID0gMTk1MjsKKwkJZ3Vlc3MgPSAiRGlnaXRhbCBVTklYIjsKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCX0gZWxzZSBpZiAoeWVhciA+PSA3MiAmJiB5ZWFyIDwgNzQpIHsKKwkJZXBvY2ggPSAyMDAwOworCQlndWVzcyA9ICJEaWdpdGFsIERFQ3N0YXRpb24iOworI2Vsc2UKKwl9IGVsc2UgaWYgKHllYXIgPj0gNzApIHsKKwkJZXBvY2ggPSAxOTAwOworCQlndWVzcyA9ICJTdGFuZGFyZCBQQyAoMTkwMCkiOworI2VuZGlmCisJfQorCWlmIChndWVzcykKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRjOiAlcyBlcG9jaCAoJWx1KSBkZXRlY3RlZFxuIiwgZ3Vlc3MsIGVwb2NoKTsKKyNlbmRpZgorI2lmZGVmIFJUQ19JUlEKKwlpZiAocnRjX2hhc19pcnEgPT0gMCkKKwkJZ290byBub19pcnEyOworCisJaW5pdF90aW1lcigmcnRjX2lycV90aW1lcik7CisJcnRjX2lycV90aW1lci5mdW5jdGlvbiA9IHJ0Y19kcm9wcGVkX2lycTsKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJcnRjX2ZyZXEgPSAxMDI0OworCWlmICghaHBldF9zZXRfcGVyaW9kaWNfZnJlcShydGNfZnJlcSkpIHsKKwkJLyogSW5pdGlhbGl6ZSBwZXJpb2RpYyBmcmVxLiB0byBDTU9TIHJlc2V0IGRlZmF1bHQsIHdoaWNoIGlzIDEwMjRIeiAqLworCQlDTU9TX1dSSVRFKCgoQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiAweEYwKSB8IDB4MDYpLCBSVENfRlJFUV9TRUxFQ1QpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK25vX2lycTI6CisjZW5kaWYKKworCSh2b2lkKSBpbml0X3N5c2N0bCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhbCBUaW1lIENsb2NrIERyaXZlciB2IiBSVENfVkVSU0lPTiAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRjX2V4aXQgKHZvaWQpCit7CisJY2xlYW51cF9zeXNjdGwoKTsKKwlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9ydGMiLCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19kZXYpOworCisjaWZkZWYgX19zcGFyY19fCisJaWYgKHJ0Y19oYXNfaXJxKQorCQlmcmVlX2lycSAocnRjX2lycSwgJnJ0Y19wb3J0KTsKKyNlbHNlCisJcmVsZWFzZV9yZWdpb24gKFJUQ19QT1JUICgwKSwgUlRDX0lPX0VYVEVOVCk7CisjaWZkZWYgUlRDX0lSUQorCWlmIChydGNfaGFzX2lycSkKKwkJZnJlZV9pcnEgKFJUQ19JUlEsIE5VTEwpOworI2VuZGlmCisjZW5kaWYgLyogX19zcGFyY19fICovCit9CisKK21vZHVsZV9pbml0KHJ0Y19pbml0KTsKK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKiAJQXQgSVJRIHJhdGVzID49IDQwOTZIeiwgYW4gaW50ZXJydXB0IG1heSBnZXQgbG9zdCBhbHRvZ2V0aGVyLgorICoJKHVzdWFsbHkgZHVyaW5nIGFuIElERSBkaXNrIGludGVycnVwdCwgd2l0aCBJUlEgdW5tYXNraW5nIG9mZikKKyAqCVNpbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2Vzbid0IGdldCBjYWxsZWQsIHRoZSBJUlEgc3RhdHVzCisgKglieXRlIGRvZXNuJ3QgZ2V0IHJlYWQsIGFuZCB0aGUgUlRDIHN0b3BzIGdlbmVyYXRpbmcgaW50ZXJydXB0cy4KKyAqCUEgdGltZXIgaXMgc2V0LCBhbmQgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYvd2hlbiB0aGF0IGhhcHBlbnMuCisgKglUbyBnZXQgaXQgb3V0IG9mIHRoaXMgc3RhbGxlZCBzdGF0ZSwgd2UganVzdCByZWFkIHRoZSBzdGF0dXMuCisgKglBdCBsZWFzdCBhIGppZmZ5IG9mIGludGVycnVwdHMgKHJ0Y19mcmVxL0haKSB3aWxsIGhhdmUgYmVlbiBsb3N0LgorICoJKFlvdSAqcmVhbGx5KiBzaG91bGRuJ3QgYmUgdHJ5aW5nIHRvIHVzZSBhIG5vbi1yZWFsdGltZSBzeXN0ZW0gCisgKglmb3Igc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgYSBzdGVhZHkgPiAxS0h6IHNpZ25hbCBhbnl3YXlzLikKKyAqLworCitzdGF0aWMgdm9pZCBydGNfZHJvcHBlZF9pcnEodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKworCXNwaW5fbG9ja19pcnEgKCZydGNfbG9jayk7CisKKwlpZiAoaHBldF9ydGNfZHJvcHBlZF9pcnEoKSkgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEp1c3QgaW4gY2FzZSBzb21lb25lIGRpc2FibGVkIHRoZSB0aW1lciBmcm9tIGJlaGluZCBvdXIgYmFjay4uLiAqLworCWlmIChydGNfc3RhdHVzICYgUlRDX1RJTUVSX09OKQorCQltb2RfdGltZXIoJnJ0Y19pcnFfdGltZXIsIGppZmZpZXMgKyBIWi9ydGNfZnJlcSArIDIqSFovMTAwKTsKKworCXJ0Y19pcnFfZGF0YSArPSAoKHJ0Y19mcmVxL0haKTw8OCk7CisJcnRjX2lycV9kYXRhICY9IH4weGZmOworCXJ0Y19pcnFfZGF0YSB8PSAoQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKSAmIDB4RjApOwkvKiByZXN0YXJ0ICovCisKKwlmcmVxID0gcnRjX2ZyZXE7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgInJ0YzogbG9zdCBzb21lIGludGVycnVwdHMgYXQgJWxkSHouXG4iLCBmcmVxKTsKKworCS8qIE5vdyB3ZSBoYXZlIG5ldyBkYXRhICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CisKKwlraWxsX2Zhc3luYyAoJnJ0Y19hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworfQorI2VuZGlmCisKKy8qCisgKglJbmZvIGV4cG9ydGVkIHZpYSAiL3Byb2MvZHJpdmVyL3J0YyIuCisgKi8KKworc3RhdGljIGludCBydGNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworI2RlZmluZSBZTihiaXQpICgoY3RybCAmIGJpdCkgPyAieWVzIiA6ICJubyIpCisjZGVmaW5lIE5ZKGJpdCkgKChjdHJsICYgYml0KSA/ICJubyIgOiAieWVzIikKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdW5zaWduZWQgY2hhciBiYXR0LCBjdHJsOworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwliYXR0ID0gQ01PU19SRUFEKFJUQ19WQUxJRCkgJiBSVENfVlJUOworCWN0cmwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCWZyZXEgPSBydGNfZnJlcTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCisJcnRjX2dldF9ydGNfdGltZSgmdG0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgbHVzZXIgaGFzIHRoZSBSVEMgc2V0IGZvciBsb2NhbAorCSAqIHRpbWUgb3IgZm9yIFVuaXZlcnNhbCBTdGFuZGFyZCBUaW1lIChHTVQpLiBQcm9iYWJseSBsb2NhbCB0aG91Z2guCisJICovCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICJydGNfdGltZVx0OiAlMDJkOiUwMmQ6JTAyZFxuIgorCQkgICAicnRjX2RhdGVcdDogJTA0ZC0lMDJkLSUwMmRcbiIKKwkJICAgInJ0Y19lcG9jaFx0OiAlMDRsdVxuIiwKKwkJICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCSAgIHRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5LCBlcG9jaCk7CisKKwlnZXRfcnRjX2FsbV90aW1lKCZ0bSk7CisKKwkvKgorCSAqIFdlIGltcGxpY2l0bHkgYXNzdW1lIDI0aHIgbW9kZSBoZXJlLiBBbGFybSB2YWx1ZXMgPj0gMHhjMCB3aWxsCisJICogbWF0Y2ggYW55IHZhbHVlIGZvciB0aGF0IHBhcnRpY3VsYXIgZmllbGQuIFZhbHVlcyB0aGF0IGFyZQorCSAqIGdyZWF0ZXIgdGhhbiBhIHZhbGlkIHRpbWUsIGJ1dCBsZXNzIHRoYW4gMHhjMCBzaG91bGRuJ3QgYXBwZWFyLgorCSAqLworCXNlcV9wdXRzKHNlcSwgImFsYXJtXHRcdDogIik7CisJaWYgKHRtLnRtX2hvdXIgPD0gMjQpCisJCXNlcV9wcmludGYoc2VxLCAiJTAyZDoiLCB0bS50bV9ob3VyKTsKKwllbHNlCisJCXNlcV9wdXRzKHNlcSwgIioqOiIpOworCisJaWYgKHRtLnRtX21pbiA8PSA1OSkKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJkOiIsIHRtLnRtX21pbik7CisJZWxzZQorCQlzZXFfcHV0cyhzZXEsICIqKjoiKTsKKworCWlmICh0bS50bV9zZWMgPD0gNTkpCisJCXNlcV9wcmludGYoc2VxLCAiJTAyZFxuIiwgdG0udG1fc2VjKTsKKwllbHNlCisJCXNlcV9wdXRzKHNlcSwgIioqXG4iKTsKKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiRFNUX2VuYWJsZVx0OiAlc1xuIgorCQkgICAiQkNEXHRcdDogJXNcbiIKKwkJICAgIjI0aHJcdFx0OiAlc1xuIgorCQkgICAic3F1YXJlX3dhdmVcdDogJXNcbiIKKwkJICAgImFsYXJtX0lSUVx0OiAlc1xuIgorCQkgICAidXBkYXRlX0lSUVx0OiAlc1xuIgorCQkgICAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iCisJCSAgICJwZXJpb2RpY19mcmVxXHQ6ICVsZFxuIgorCQkgICAiYmF0dF9zdGF0dXNcdDogJXNcbiIsCisJCSAgIFlOKFJUQ19EU1RfRU4pLAorCQkgICBOWShSVENfRE1fQklOQVJZKSwKKwkJICAgWU4oUlRDXzI0SCksCisJCSAgIFlOKFJUQ19TUVdFKSwKKwkJICAgWU4oUlRDX0FJRSksCisJCSAgIFlOKFJUQ19VSUUpLAorCQkgICBZTihSVENfUElFKSwKKwkJICAgZnJlcSwKKwkJICAgYmF0dCA/ICJva2F5IiA6ICJkZWFkIik7CisKKwlyZXR1cm4gIDA7CisjdW5kZWYgWU4KKyN1bmRlZiBOWQorfQorCitzdGF0aWMgaW50IHJ0Y19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0Y19wcm9jX3Nob3csIE5VTEwpOworfQorCit2b2lkIHJ0Y19nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOworCXVuc2lnbmVkIGNoYXIgY3RybDsKKyNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCisJdW5zaWduZWQgaW50IHJlYWxfeWVhcjsKKyNlbmRpZgorCisJLyoKKwkgKiByZWFkIFJUQyBvbmNlIGFueSB1cGRhdGUgaW4gcHJvZ3Jlc3MgaXMgZG9uZS4gVGhlIHVwZGF0ZQorCSAqIGNhbiB0YWtlIGp1c3Qgb3ZlciAybXMuIFdlIHdhaXQgMTAgdG8gMjBtcy4gVGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIHRvIHBvbGwtd2FpdCAodXAgdG8gMXMgLSBlZWNjY2gpIGZvciB0aGUgZmFsbGluZyBlZGdlIG9mIFJUQ19VSVAuCisJICogSWYgeW91IG5lZWQgdG8ga25vdyAqZXhhY3RseSogd2hlbiBhIHNlY29uZCBoYXMgc3RhcnRlZCwgZW5hYmxlCisJICogcGVyaW9kaWMgdXBkYXRlIGNvbXBsZXRlIGludGVycnVwdHMsICh2aWEgaW9jdGwpIGFuZCB0aGVuIAorCSAqIGltbWVkaWF0ZWx5IHJlYWQgL2Rldi9ydGMgd2hpY2ggd2lsbCBibG9jayB1bnRpbCB5b3UgZ2V0IHRoZSBJUlEuCisJICogT25jZSB0aGUgcmVhZCBjbGVhcnMsIHJlYWQgdGhlIFJUQyB0aW1lIChhZ2FpbiB2aWEgaW9jdGwpLiBFYXN5LgorCSAqLworCisJaWYgKHJ0Y19pc191cGRhdGluZygpICE9IDApCisJCXdoaWxlIChqaWZmaWVzIC0gdWlwX3dhdGNoZG9nIDwgMipIWi8xMDApIHsKKwkJCWJhcnJpZXIoKTsKKwkJCWNwdV9yZWxheCgpOworCQl9CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCisJICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKKwkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlydGNfdG0tPnRtX3NlYyA9IENNT1NfUkVBRChSVENfU0VDT05EUyk7CisJcnRjX3RtLT50bV9taW4gPSBDTU9TX1JFQUQoUlRDX01JTlVURVMpOworCXJ0Y190bS0+dG1faG91ciA9IENNT1NfUkVBRChSVENfSE9VUlMpOworCXJ0Y190bS0+dG1fbWRheSA9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKKwlydGNfdG0tPnRtX21vbiA9IENNT1NfUkVBRChSVENfTU9OVEgpOworCXJ0Y190bS0+dG1feWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7CisjaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgorCXJlYWxfeWVhciA9IENNT1NfUkVBRChSVENfREVDX1lFQVIpOworI2VuZGlmCisJY3RybCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoIShjdHJsICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCisJeworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fc2VjKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21pbik7CisJCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21kYXkpOworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbW9uKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCX0KKworI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KKwlydGNfdG0tPnRtX3llYXIgKz0gcmVhbF95ZWFyIC0gNzI7CisjZW5kaWYKKworCS8qCisJICogQWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBob3cgdGhlIFJUQyB1c2VzIHRoZSB2YWx1ZXMKKwkgKiBhbmQgaG93IHRoZXkgYXJlIGRlZmluZWQgaW4gYSBzdHJ1Y3QgcnRjX3RpbWU7CisJICovCisJaWYgKChydGNfdG0tPnRtX3llYXIgKz0gKGVwb2NoIC0gMTkwMCkpIDw9IDY5KQorCQlydGNfdG0tPnRtX3llYXIgKz0gMTAwOworCisJcnRjX3RtLT50bV9tb24tLTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3J0Y19hbG1fdGltZShzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSkKK3sKKwl1bnNpZ25lZCBjaGFyIGN0cmw7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFRoYXQKKwkgKiBtZWFucyBvbmx5IHRtX2hvdXIsIHRtX21pbiwgYW5kIHRtX3NlYy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJYWxtX3RtLT50bV9zZWMgPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFNfQUxBUk0pOworCWFsbV90bS0+dG1fbWluID0gQ01PU19SRUFEKFJUQ19NSU5VVEVTX0FMQVJNKTsKKwlhbG1fdG0tPnRtX2hvdXIgPSBDTU9TX1JFQUQoUlRDX0hPVVJTX0FMQVJNKTsKKwljdHJsID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkKKwl7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9zZWMpOworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWluKTsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX2hvdXIpOworCX0KK30KKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKiBVc2VkIHRvIGRpc2FibGUvZW5hYmxlIGludGVycnVwdHMgZm9yIGFueSBvbmUgb2YgVUlFLCBBSUUsIFBJRS4KKyAqIFJ1bW91ciBoYXMgaXQgdGhhdCBpZiB5b3UgZnJvYiB0aGUgaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlCisgKiBiaXRzIGluIFJUQ19DT05UUk9MLCB5b3Ugc2hvdWxkIHJlYWQgUlRDX0lOVFJfRkxBR1MsIHRvCisgKiBlbnN1cmUgeW91IGFjdHVhbGx5IHN0YXJ0IGdldHRpbmcgaW50ZXJydXB0cy4gUHJvYmFibHkgZm9yCisgKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIvYnJva2VuIGNoaXBzZXQgUlRDIGltcGxlbWVudGF0aW9ucy4KKyAqIFdlIGFsc28gY2xlYXIgb3V0IGFueSBvbGQgaXJxIGRhdGEgYWZ0ZXIgYW4gaW9jdGwoKSB0aGF0CisgKiBtZWRkbGVzIHdpdGggdGhlIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBiaXRzLgorICovCisKK3N0YXRpYyB2b2lkIG1hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKGhwZXRfbWFza19ydGNfaXJxX2JpdChiaXQpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm47CisJfQorCXZhbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJdmFsICY9ICB+Yml0OworCUNNT1NfV1JJVEUodmFsLCBSVENfQ09OVFJPTCk7CisJQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKworCXJ0Y19pcnFfZGF0YSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlpZiAoaHBldF9zZXRfcnRjX2lycV9iaXQoYml0KSkgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuOworCX0KKwl2YWwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCXZhbCB8PSBiaXQ7CisJQ01PU19XUklURSh2YWwsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCisJcnRjX2lycV9kYXRhID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK30KKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJQYXVsIEdvcnRtYWtlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoUlRDX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zM2MyNDEwLXJ0Yy5jIGIvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NjYzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zM2MyNDEwLXJ0Yy5jCkBAIC0wLDAgKzEsNTg4IEBACisvKiBkcml2ZXJzL2NoYXIvczNjMjQxMF9ydGMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4KKyAqCQkgICAgICBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogUzNDMjQxMCBJbnRlcm5hbCBSVEMgRHJpdmVyCisgKgorICogIENoYW5nZWxvZzoKKyAqCTA4LU5vdi0yMDA0CUJKRAlJbml0aWFsIGNyZWF0aW9uCisgKgkxMi1Ob3YtMjAwNAlCSkQJQWRkZWQgcGVyaW9kaWMgSVJRIGFuZCBQTSBjb2RlCisgKgkyMi1Ob3YtMjAwNAlCSkQJU2lnbi10ZXN0IG9uIGFsYXJtIGNvZGUgdG8gY2hlY2sgZm9yIDwwCisgKgkxMC1NYXItMjAwNQlMQ1ZSCUNoYW5nZWQgUzNDMjQxMF9WQV9SVEMgdG8gUzNDMjRYWF9WQV9SVEMKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtcnRjLmg+CisKKy8qIG5lZWQgdGhpcyBmb3IgdGhlIFJUQ19BRiBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKyN1bmRlZiBTM0MyNFhYX1ZBX1JUQworI2RlZmluZSBTM0MyNFhYX1ZBX1JUQyBzM2MyNDEwX3J0Y19iYXNlCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKnMzYzI0MTBfcnRjX21lbTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqczNjMjQxMF9ydGNfYmFzZTsKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfYWxhcm1ubyA9IE5PX0lSUTsKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfdGlja25vICA9IE5PX0lSUTsKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfZnJlcSAgICA9IDE7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soczNjMjQxMF9ydGNfcGllX2xvY2spOworCisvKiBJUlEgSGFuZGxlcnMgKi8KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBfcnRjX2FsYXJtaXJxKGludCBpcnEsIHZvaWQgKmlkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlydGNfdXBkYXRlKDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzM2MyNDEwX3J0Y190aWNraXJxKGludCBpcnEsIHZvaWQgKmlkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlydGNfdXBkYXRlKDEsIFJUQ19QRiB8IFJUQ19JUlFGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFVwZGF0ZSBjb250cm9sIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfc2V0YWllKGludCB0bykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJcHJfZGVidWcoIiVzOiBhaWU9JWRcbiIsIF9fRlVOQ1RJT05fXywgdG8pOworCisJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENBTE0pOworCisJaWYgKHRvKQorCQl0bXAgfD0gUzNDMjQxMF9SVENBTE1fQUxNRU47CisJZWxzZQorCQl0bXAgJj0gflMzQzI0MTBfUlRDQUxNX0FMTUVOOworCisKKwl3cml0ZWIodG1wLCBTM0MyNDEwX1JUQ0FMTSk7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX3NldHBpZShpbnQgdG8pCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXByX2RlYnVnKCIlczogcGllPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHRvKTsKKworCXNwaW5fbG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKKwl0bXAgPSByZWFkYihTM0MyNDEwX1RJQ05UKSAmIH5TM0MyNDEwX1RJQ05UX0VOQUJMRTsKKworCWlmICh0bykKKwkJdG1wIHw9IFMzQzI0MTBfVElDTlRfRU5BQkxFOworCisJd3JpdGViKHRtcCwgUzNDMjQxMF9USUNOVCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzM2MyNDEwX3J0Y19waWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX3NldGZyZXEoaW50IGZyZXEpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNwaW5fbG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKKwl0bXAgPSByZWFkYihTM0MyNDEwX1RJQ05UKSAmIFMzQzI0MTBfVElDTlRfRU5BQkxFOworCisJczNjMjQxMF9ydGNfZnJlcSA9IGZyZXE7CisKKwl0bXAgfD0gKDEyOCAvIGZyZXEpLTE7CisKKwl3cml0ZWIodG1wLCBTM0MyNDEwX1RJQ05UKTsKKwlzcGluX3VubG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKK30KKworLyogVGltZSByZWFkL3dyaXRlICovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX2dldHRpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgaW50IGhhdmVfcmV0cmllZCA9IDA7CisKKyByZXRyeV9nZXRfdGltZToKKwlydGNfdG0tPnRtX21pbiAgPSByZWFkYihTM0MyNDEwX1JUQ01JTik7CisJcnRjX3RtLT50bV9ob3VyID0gcmVhZGIoUzNDMjQxMF9SVENIT1VSKTsKKwlydGNfdG0tPnRtX21kYXkgPSByZWFkYihTM0MyNDEwX1JUQ0RBVEUpOworCXJ0Y190bS0+dG1fbW9uICA9IHJlYWRiKFMzQzI0MTBfUlRDTU9OKTsKKwlydGNfdG0tPnRtX3llYXIgPSByZWFkYihTM0MyNDEwX1JUQ1lFQVIpOworCXJ0Y190bS0+dG1fc2VjICA9IHJlYWRiKFMzQzI0MTBfUlRDU0VDKTsKKworCS8qIHRoZSBvbmx5IHdheSB0byB3b3JrIG91dCB3ZXRoZXIgdGhlIHN5c3RlbSB3YXMgbWlkLXVwZGF0ZQorCSAqIHdoZW4gd2UgcmVhZCBpdCBpcyB0byBjaGVjayB0aGUgc2Vjb25kIGNvdW50ZXIsIGFuZCBpZiBpdAorCSAqIGlzIHplcm8sIHRoZW4gd2UgcmUtdHJ5IHRoZSBlbnRpcmUgcmVhZAorCSAqLworCisJaWYgKHJ0Y190bS0+dG1fc2VjID09IDAgJiYgIWhhdmVfcmV0cmllZCkgeworCQloYXZlX3JldHJpZWQgPSAxOworCQlnb3RvIHJldHJ5X2dldF90aW1lOworCX0KKworCXByX2RlYnVnKCJyZWFkIHRpbWUgJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCisJCSBydGNfdG0tPnRtX3llYXIsIHJ0Y190bS0+dG1fbW9uLCBydGNfdG0tPnRtX21kYXksCisJCSBydGNfdG0tPnRtX2hvdXIsIHJ0Y190bS0+dG1fbWluLCBydGNfdG0tPnRtX3NlYyk7CisKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fc2VjKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWluKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1faG91cik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21kYXkpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9tb24pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV95ZWFyKTsKKworCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisJcnRjX3RtLT50bV9tb24gLT0gMTsKK30KKworCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3NldHRpbWUoc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwkvKiB0aGUgcnRjIGdldHMgcm91bmQgdGhlIHkyayBwcm9ibGVtIGJ5IGp1c3Qgbm90IHN1cHBvcnRpbmcgaXQgKi8KKworCWlmICh0bS0+dG1feWVhciA8IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fc2VjKSwgIFMzQzI0MTBfUlRDU0VDKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWluKSwgIFMzQzI0MTBfUlRDTUlOKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1faG91ciksIFMzQzI0MTBfUlRDSE9VUik7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21kYXkpLCBTM0MyNDEwX1JUQ0RBVEUpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9tb24gKyAxKSwgUzNDMjQxMF9SVENNT04pOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV95ZWFyIC0gMTAwKSwgUzNDMjQxMF9SVENZRUFSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzM2MyNDEwX3J0Y19nZXRhbGFybShzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSA9ICZhbHJtLT50aW1lOworCXVuc2lnbmVkIGludCBhbG1fZW47CisKKwlhbG1fdG0tPnRtX3NlYyAgPSByZWFkYihTM0MyNDEwX0FMTVNFQyk7CisJYWxtX3RtLT50bV9taW4gID0gcmVhZGIoUzNDMjQxMF9BTE1NSU4pOworCWFsbV90bS0+dG1faG91ciA9IHJlYWRiKFMzQzI0MTBfQUxNSE9VUik7CisJYWxtX3RtLT50bV9tb24gID0gcmVhZGIoUzNDMjQxMF9BTE1NT04pOworCWFsbV90bS0+dG1fbWRheSA9IHJlYWRiKFMzQzI0MTBfQUxNREFURSk7CisJYWxtX3RtLT50bV95ZWFyID0gcmVhZGIoUzNDMjQxMF9BTE1ZRUFSKTsKKworCWFsbV9lbiA9IHJlYWRiKFMzQzI0MTBfUlRDQUxNKTsKKworCXByX2RlYnVnKCJyZWFkIGFsYXJtICUwMnggJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCisJCSBhbG1fZW4sCisJCSBhbG1fdG0tPnRtX3llYXIsIGFsbV90bS0+dG1fbW9uLCBhbG1fdG0tPnRtX21kYXksCisJCSBhbG1fdG0tPnRtX2hvdXIsIGFsbV90bS0+dG1fbWluLCBhbG1fdG0tPnRtX3NlYyk7CisKKworCS8qIGRlY29kZSB0aGUgYWxhcm0gZW5hYmxlIGZpZWxkICovCisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fU0VDRU4pIHsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX3NlYyk7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9zZWMgPSAweGZmOworCX0KKworCWlmIChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9NSU5FTikgeworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWluKTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX21pbiA9IDB4ZmY7CisJfQorCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX0hPVVJFTikgeworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1faG91cik7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9ob3VyID0gMHhmZjsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fREFZRU4pIHsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX21kYXkpOworCX0gZWxzZSB7CisJCWFsbV90bS0+dG1fbWRheSA9IDB4ZmY7CisJfQorCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX01PTkVOKSB7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9tb24pOworCQlhbG1fdG0tPnRtX21vbiAtPSAxOworCX0gZWxzZSB7CisJCWFsbV90bS0+dG1fbW9uID0gMHhmZjsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fWUVBUkVOKSB7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV95ZWFyKTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX3llYXIgPSAweGZmZmY7CisJfQorCisJLyogdG9kbyAtIHNldCBhbHJtLT5lbmFibGVkID8gKi8KK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19zZXRhbGFybShzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgaW50IGFscm1fZW47CisKKwlwcl9kZWJ1ZygiczNjMjQxMF9ydGNfc2V0YWxhcm06ICVkLCAlMDJ4LyUwMngvJTAyeCAlMDJ4LiUwMnguJTAyeFxuIiwKKwkJIGFscm0tPmVuYWJsZWQsCisJCSB0bS0+dG1fbWRheSAmIDB4ZmYsIHRtLT50bV9tb24gJiAweGZmLCB0bS0+dG1feWVhciAmIDB4ZmYsCisJCSB0bS0+dG1faG91ciAmIDB4ZmYsIHRtLT50bV9taW4gJiAweGZmLCB0bS0+dG1fc2VjKTsKKworCWlmIChhbHJtLT5lbmFibGVkIHx8IDEpIHsKKwkJYWxybV9lbiA9IHJlYWRiKFMzQzI0MTBfUlRDQUxNKSAmIFMzQzI0MTBfUlRDQUxNX0FMTUVOOworCQl3cml0ZWIoMHgwMCwgUzNDMjQxMF9SVENBTE0pOworCisJCWlmICh0bS0+dG1fc2VjIDwgNjAgJiYgdG0tPnRtX3NlYyA+PSAwKSB7CisJCQlhbHJtX2VuIHw9IFMzQzI0MTBfUlRDQUxNX1NFQ0VOOworCQkJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3NlYyksIFMzQzI0MTBfQUxNU0VDKTsKKwkJfQorCisJCWlmICh0bS0+dG1fbWluIDwgNjAgJiYgdG0tPnRtX21pbiA+PSAwKSB7CisJCQlhbHJtX2VuIHw9IFMzQzI0MTBfUlRDQUxNX01JTkVOOworCQkJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21pbiksIFMzQzI0MTBfQUxNTUlOKTsKKwkJfQorCisJCWlmICh0bS0+dG1faG91ciA8IDI0ICYmIHRtLT50bV9ob3VyID49IDApIHsKKwkJCWFscm1fZW4gfD0gUzNDMjQxMF9SVENBTE1fSE9VUkVOOworCQkJd3JpdGViKEJJTjJCQ0QodG0tPnRtX2hvdXIpLCBTM0MyNDEwX0FMTUhPVVIpOworCQl9CisKKwkJcHJfZGVidWcoInNldHRpbmcgUzNDMjQxMF9SVENBTE0gdG8gJTA4eFxuIiwgYWxybV9lbik7CisKKwkJd3JpdGViKGFscm1fZW4sIFMzQzI0MTBfUlRDQUxNKTsKKwkJZW5hYmxlX2lycV93YWtlKHMzYzI0MTBfcnRjX2FsYXJtbm8pOworCX0gZWxzZSB7CisJCWFscm1fZW4gPSByZWFkYihTM0MyNDEwX1JUQ0FMTSk7CisJCWFscm1fZW4gJj0gflMzQzI0MTBfUlRDQUxNX0FMTUVOOworCQl3cml0ZWIoYWxybV9lbiwgUzNDMjQxMF9SVENBTE0pOworCQlkaXNhYmxlX2lycV93YWtlKHMzYzI0MTBfcnRjX2FsYXJtbm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwljYXNlIFJUQ19BSUVfT046CisJCXMzYzI0MTBfcnRjX3NldGFpZSgoY21kID09IFJUQ19BSUVfT04pID8gMSA6IDApOworCQlyZXR1cm4gMDsKKworCWNhc2UgUlRDX1BJRV9PRkY6CisJY2FzZSBSVENfUElFX09OOgorCQlzM2MyNDEwX3J0Y19zZXRwaWUoKGNtZCA9PSBSVENfUElFX09OKSA/IDEgOiAwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CisJCXJldHVybiBwdXRfdXNlcihzM2MyNDEwX3J0Y19mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOworCisJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWlmIChhcmcgPCAxIHx8IGFyZyA+IDY0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJLyogY2hlY2sgZm9yIHBvd2VyIG9mIDIgKi8KKworCQlpZiAoKGFyZyAmIChhcmctMSkpICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IHNldHRpbmcgZnJlcXVlbmN5ICVsZFxuIiwgYXJnKTsKKworCQlzM2MyNDEwX3J0Y19zZXRmcmVxKGFyZyk7CisJCXJldHVybiAwOworCisJY2FzZSBSVENfVUlFX09OOgorCWNhc2UgUlRDX1VJRV9PRkY6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3Byb2MoY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBydGNhbG0gPSByZWFkYihTM0MyNDEwX1JUQ0FMTSk7CisJdW5zaWduZWQgaW50IHRpY250ID0gcmVhZGIgKFMzQzI0MTBfVElDTlQpOworCWNoYXIgKnAgPSBidWY7CisKKwlwICs9IHNwcmludGYocCwgImFsYXJtX0lSUVx0OiAlc1xuIiwKKwkJICAgICAocnRjYWxtICYgUzNDMjQxMF9SVENBTE1fQUxNRU4pID8gInllcyIgOiAibm8iICk7CisJcCArPSBzcHJpbnRmKHAsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCSAgICAgKHRpY250ICYgUzNDMjQxMF9USUNOVF9FTkFCTEUpID8gInllcyIgOiAibm8iICk7CisJcCArPSBzcHJpbnRmKHAsICJwZXJpb2RpY19mcmVxXHQ6ICVkXG4iLCBzM2MyNDEwX3J0Y19mcmVxKTsKKworCXJldHVybiBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX29wZW4odm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoczNjMjQxMF9ydGNfYWxhcm1ubywgczNjMjQxMF9ydGNfYWxhcm1pcnEsCisJCQkgIFNBX0lOVEVSUlVQVCwgICJzM2MyNDEwLXJ0YyBhbGFybSIsIE5VTEwpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJJUlElZCBhbHJlYWR5IGluIHVzZVxuIiwgczNjMjQxMF9ydGNfYWxhcm1ubyk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShzM2MyNDEwX3J0Y190aWNrbm8sIHMzYzI0MTBfcnRjX3RpY2tpcnEsCisJCQkgIFNBX0lOVEVSUlVQVCwgICJzM2MyNDEwLXJ0YyB0aWNrIiwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVJRJWQgYWxyZWFkeSBpbiB1c2VcbiIsIHMzYzI0MTBfcnRjX3RpY2tubyk7CisJCWdvdG8gdGlja19lcnI7CisJfQorCisJcmV0dXJuIHJldDsKKworIHRpY2tfZXJyOgorCWZyZWVfaXJxKHMzYzI0MTBfcnRjX2FsYXJtbm8sIE5VTEwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX3JlbGVhc2Uodm9pZCkKK3sKKwkvKiBkbyBub3QgY2xlYXIgQUlFIGhlcmUsIGl0IG1heSBiZSBuZWVkZWQgZm9yIHdha2UgKi8KKworCXMzYzI0MTBfcnRjX3NldHBpZSgwKTsKKwlmcmVlX2lycShzM2MyNDEwX3J0Y19hbGFybW5vLCBOVUxMKTsKKwlmcmVlX2lycShzM2MyNDEwX3J0Y190aWNrbm8sIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19vcHMgczNjMjQxMF9ydGNvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHMzYzI0MTBfcnRjX29wZW4sCisJLnJlbGVhc2UJPSBzM2MyNDEwX3J0Y19yZWxlYXNlLAorCS5pb2N0bAkJPSBzM2MyNDEwX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gczNjMjQxMF9ydGNfZ2V0dGltZSwKKwkuc2V0X3RpbWUJPSBzM2MyNDEwX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtCT0gczNjMjQxMF9ydGNfZ2V0YWxhcm0sCisJLnNldF9hbGFybQk9IHMzYzI0MTBfcnRjX3NldGFsYXJtLAorCS5wcm9jCSAgICAgICAgPSBzM2MyNDEwX3J0Y19wcm9jLAorfTsKKworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGVuKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlpZiAoczNjMjQxMF9ydGNfYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoIWVuKSB7CisJCXRtcCA9IHJlYWRiKFMzQzI0MTBfUlRDQ09OKTsKKwkJd3JpdGViKHRtcCAmIH5TM0MyNDEwX1JUQ0NPTl9SVENFTiwgUzNDMjQxMF9SVENDT04pOworCisJCXRtcCA9IHJlYWRiKFMzQzI0MTBfVElDTlQpOworCQl3cml0ZWIodG1wICYgflMzQzI0MTBfVElDTlRfRU5BQkxFLCBTM0MyNDEwX1RJQ05UKTsKKwl9IGVsc2UgeworCQkvKiByZS1lbmFibGUgdGhlIGRldmljZSwgYW5kIGNoZWNrIGl0IGlzIG9rICovCisKKwkJaWYgKChyZWFkYihTM0MyNDEwX1JUQ0NPTikgJiBTM0MyNDEwX1JUQ0NPTl9SVENFTikgPT0gMCl7CisJCQlkZXZfaW5mbyhkZXYsICJydGMgZGlzYWJsZWQsIHJlLWVuYWJsaW5nXG4iKTsKKworCQkJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGViKHRtcCB8IFMzQzI0MTBfUlRDQ09OX1JUQ0VOICwgUzNDMjQxMF9SVENDT04pOworCQl9CisKKwkJaWYgKChyZWFkYihTM0MyNDEwX1JUQ0NPTikgJiBTM0MyNDEwX1JUQ0NPTl9DTlRTRUwpKXsKKwkJCWRldl9pbmZvKGRldiwgInJlbW92aW5nIFMzQzI0MTBfUlRDQ09OX0NOVFNFTFxuIik7CisKKwkJCXRtcCA9IHJlYWRiKFMzQzI0MTBfUlRDQ09OKTsKKwkJCXdyaXRlYih0bXAmIH5TM0MyNDEwX1JUQ0NPTl9DTlRTRUwgLCBTM0MyNDEwX1JUQ0NPTik7CisJCX0KKworCQlpZiAoKHJlYWRiKFMzQzI0MTBfUlRDQ09OKSAmIFMzQzI0MTBfUlRDQ09OX0NMS1JTVCkpeworCQkJZGV2X2luZm8oZGV2LCAicmVtb3ZpbmcgUzNDMjQxMF9SVENDT05fQ0xLUlNUXG4iKTsKKworCQkJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGViKHRtcCAmIH5TM0MyNDEwX1JUQ0NPTl9DTEtSU1QsIFMzQzI0MTBfUlRDQ09OKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVucmVnaXN0ZXJfcnRjKCZzM2MyNDEwX3J0Y29wcyk7CisKKwlzM2MyNDEwX3J0Y19zZXRwaWUoMCk7CisJczNjMjQxMF9ydGNfc2V0YWllKDApOworCisJaWYgKHMzYzI0MTBfcnRjX21lbSAhPSBOVUxMKSB7CisJCXByX2RlYnVnKCJzM2MyNDEwX3J0YzogcmVsZWFzaW5nIHMzYzI0MTBfcnRjX21lbVxuIik7CisJCWlvdW5tYXAoczNjMjQxMF9ydGNfYmFzZSk7CisJCXJlbGVhc2VfcmVzb3VyY2UoczNjMjQxMF9ydGNfbWVtKTsKKwkJa2ZyZWUoczNjMjQxMF9ydGNfbWVtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IHByb2JlPSVwLCBkZXZpY2U9JXBcbiIsIF9fRlVOQ1RJT05fXywgcGRldiwgZGV2KTsKKworCS8qIGZpbmQgdGhlIElSUXMgKi8KKworCXMzYzI0MTBfcnRjX3RpY2tubyA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJaWYgKHMzYzI0MTBfcnRjX3RpY2tubyA8PSAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gaXJxIGZvciBydGMgdGlja1xuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXMzYzI0MTBfcnRjX2FsYXJtbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChzM2MyNDEwX3J0Y19hbGFybW5vIDw9IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIGFsYXJtXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcHJfZGVidWcoInMzYzI0MTBfcnRjOiB0aWNrIGlycSAlZCwgYWxhcm0gaXJxICVkXG4iLAorCQkgczNjMjQxMF9ydGNfdGlja25vLCBzM2MyNDEwX3J0Y19hbGFybW5vKTsKKworCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiAqLworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb24gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzM2MyNDEwX3J0Y19tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQtcmVzLT5zdGFydCsxLAorCQkJCSAgICAgcGRldi0+bmFtZSk7CisKKwlpZiAoczNjMjQxMF9ydGNfbWVtID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBleGl0X2VycjsKKwl9CisKKwlzM2MyNDEwX3J0Y19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAoczNjMjQxMF9ydGNfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIGlvcmVtYXAoKVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdF9lcnI7CisJfQorCisJczNjMjQxMF9ydGNfbWVtID0gcmVzOworCXByX2RlYnVnKCJzM2MyNDEwX3J0Y19iYXNlPSVwXG4iLCBzM2MyNDEwX3J0Y19iYXNlKTsKKworIAlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IFJUQ0NPTj0lMDJ4XG4iLCByZWFkYihTM0MyNDEwX1JUQ0NPTikpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIGV2ZXJ5dGhpbmcgaXMgc2V0dXAgY29ycmVjdGx5ICovCisKKwlzM2MyNDEwX3J0Y19lbmFibGUoZGV2LCAxKTsKKworIAlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IFJUQ0NPTj0lMDJ4XG4iLCByZWFkYihTM0MyNDEwX1JUQ0NPTikpOworCisJczNjMjQxMF9ydGNfc2V0ZnJlcShzM2MyNDEwX3J0Y19mcmVxKTsKKworCS8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLworCisJcmVnaXN0ZXJfcnRjKCZzM2MyNDEwX3J0Y29wcyk7CisJcmV0dXJuIDA7CisKKyBleGl0X2VycjoKKwlkZXZfZXJyKGRldiwgImVycm9yICVkIGR1cmluZyBpbml0aWFsaXNhdGlvblxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyogUzNDMjQxMCBSVEMgUG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgczNjMjQxMF9ydGNfZGVsdGE7CisKK3N0YXRpYyBpbnQgdGljbnRfc2F2ZTsKKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKworCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKKwkJLyogc2F2ZSBUSUNOVCBmb3IgYW55b25lIHVzaW5nIHBlcmlvZGljIGludGVycnVwdHMgKi8KKworCQl0aWNudF9zYXZlID0gcmVhZGIoUzNDMjQxMF9USUNOVCk7CisKKwkJLyogY2FsY3VsYXRlIHRpbWUgZGVsdGEgZm9yIHN1c3BlbmQgKi8KKworCQlzM2MyNDEwX3J0Y19nZXR0aW1lKCZ0bSk7CisJCXJ0Y190bV90b190aW1lKCZ0bSwgJnRpbWUudHZfc2VjKTsKKwkJc2F2ZV90aW1lX2RlbHRhKCZzM2MyNDEwX3J0Y19kZWx0YSwgJnRpbWUpOworCQlzM2MyNDEwX3J0Y19lbmFibGUoZGV2LCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKworCXMzYzI0MTBfcnRjX2VuYWJsZShkZXYsIDEpOworCXMzYzI0MTBfcnRjX2dldHRpbWUoJnRtKTsKKwlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lLnR2X3NlYyk7CisJcmVzdG9yZV90aW1lX2RlbHRhKCZzM2MyNDEwX3J0Y19kZWx0YSwgJnRpbWUpOworCisJd3JpdGViKHRpY250X3NhdmUsIFMzQzI0MTBfVElDTlQpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgczNjMjQxMF9ydGNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0MTBfcnRjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzM2MyNDEwX3J0Y2RydiA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1ydGMiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzM2MyNDEwX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0MTBfcnRjX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHMzYzI0MTBfcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNDEwX3J0Y19yZXN1bWUsCit9OworCitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGJhbm5lcltdID0gIlMzQzI0MTAgUlRDLCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzI0MTBfcnRjX2luaXQodm9pZCkKK3sKKwlwcmludGsoYmFubmVyKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDEwX3J0Y2Rydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNDEwX3J0Y19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTBfcnRjZHJ2KTsKK30KKworbW9kdWxlX2luaXQoczNjMjQxMF9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChzM2MyNDEwX3J0Y19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2Nhbl9rZXliLmMgYi9kcml2ZXJzL2NoYXIvc2Nhbl9rZXliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1YmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqCSRJZDogc2Nhbl9rZXliLmMsdiAxLjIgMjAwMC8wNy8wNCAwNjoyNDo0MiB5YWVnYXNoaSBFeHAgJCAKKyAqCUNvcHlyaWdodCAoQykgMjAwMCBZQUVHQVNISSBUYWtlc2hpCisgKglHZW5lcmljIHNjYW4ga2V5Ym9hcmQgZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2RlZmluZSBTQ0FOSFoJKEhaLzIwKQorCitzdHJ1Y3Qgc2Nhbl9rZXlib2FyZCB7CisJc3RydWN0IHNjYW5fa2V5Ym9hcmQgKm5leHQ7CisJaW50ICgqc2NhbikodW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZTsKKwl1bnNpZ25lZCBjaGFyICpzMCwgKnMxOworCWludCBsZW5ndGg7Cit9OworCitzdGF0aWMgaW50IHNjYW5famlmZmllcz0wOworc3RhdGljIHN0cnVjdCBzY2FuX2tleWJvYXJkICprZXlib2FyZHM9TlVMTDsKK3N0cnVjdCB0aW1lcl9saXN0IHNjYW5fdGltZXI7CisKK3N0YXRpYyB2b2lkIGNoZWNrX2tiZChjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbmV3LCB1bnNpZ25lZCBjaGFyICpvbGQsIGludCBsZW5ndGgpCit7CisJaW50IG5lZWRfdGFza2xldF9zY2hlZHVsZT0wOworCXVuc2lnbmVkIGludCB4b3IsIGJpdDsKKwkKKwl3aGlsZShsZW5ndGgtLT4wKSB7CisJCWlmKCh4b3I9Km5ld14qb2xkKT09MCkgeworCQkJdGFibGUrPTg7CisJCX0KKwkJZWxzZSB7CisJCQlmb3IoYml0PTB4MDE7IGJpdDwweDEwMDsgYml0PDw9MSkgeworCQkJCWlmKHhvciZiaXQpIHsKKwkJCQkJaGFuZGxlX3NjYW5jb2RlKCp0YWJsZSwgISgqbmV3JmJpdCkpOworCQkJCQluZWVkX3Rhc2tsZXRfc2NoZWR1bGU9MTsKKyNpZiAwCisJCQkJCXByaW50aygiMHgleCAlc1xuIiwgKnRhYmxlLCAoKm5ldyZiaXQpPyJyZWxlYXNlZCI6InByZXNzZWQiKTsKKyNlbmRpZgorCQkJCX0KKwkJCQl0YWJsZSsrOworCQkJfQorCQl9CisJCW5ldysrOyBvbGQrKzsKKwl9CisKKwlpZihuZWVkX3Rhc2tsZXRfc2NoZWR1bGUpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmtleWJvYXJkX3Rhc2tsZXQpOworfQorCisKK3N0YXRpYyB2b2lkIHNjYW5fa2JkKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJc3RydWN0IHNjYW5fa2V5Ym9hcmQgKmtiZDsKKworCXNjYW5famlmZmllcysrOworCisJZm9yKGtiZD1rZXlib2FyZHM7IGtiZCE9TlVMTDsga2JkPWtiZC0+bmV4dCkgeworCQlpZihzY2FuX2ppZmZpZXMmMSkgeworCQkJaWYoIWtiZC0+c2NhbihrYmQtPnMwKSkKKwkJCQljaGVja19rYmQoa2JkLT50YWJsZSwKKwkJCQkJICBrYmQtPnMwLCBrYmQtPnMxLCBrYmQtPmxlbmd0aCk7CisJCQllbHNlCisJCQkJbWVtY3B5KGtiZC0+czAsIGtiZC0+czEsIGtiZC0+bGVuZ3RoKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmKCFrYmQtPnNjYW4oa2JkLT5zMSkpCisJCQkJY2hlY2tfa2JkKGtiZC0+dGFibGUsCisJCQkJCSAga2JkLT5zMSwga2JkLT5zMCwga2JkLT5sZW5ndGgpOworCQkJZWxzZQorCQkJCW1lbWNweShrYmQtPnMxLCBrYmQtPnMwLCBrYmQtPmxlbmd0aCk7CisJCX0KKwkJCisJfQorCisJaW5pdF90aW1lcigmc2Nhbl90aW1lcik7CisJc2Nhbl90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNDQU5IWjsKKwlzY2FuX3RpbWVyLmRhdGEgPSAwOworCXNjYW5fdGltZXIuZnVuY3Rpb24gPSBzY2FuX2tiZDsKKwlhZGRfdGltZXIoJnNjYW5fdGltZXIpOworfQorCisKK2ludCByZWdpc3Rlcl9zY2FuX2tleWJvYXJkKGludCAoKnNjYW4pKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciksCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSwKKwkJCSAgIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNjYW5fa2V5Ym9hcmQgKmtiZDsKKworCWtiZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2FuX2tleWJvYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGtiZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX291dDsKKworCWtiZC0+c2Nhbj1zY2FuOworCWtiZC0+dGFibGU9dGFibGU7CisJa2JkLT5sZW5ndGg9bGVuZ3RoOworCisJa2JkLT5zMCA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2JkLT5zMCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2ZyZWVfa2JkOworCisJa2JkLT5zMSA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2JkLT5zMSA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2ZyZWVfczA7CisKKwltZW1zZXQoa2JkLT5zMCwgLTEsIGtiZC0+bGVuZ3RoKTsKKwltZW1zZXQoa2JkLT5zMSwgLTEsIGtiZC0+bGVuZ3RoKTsKKwkKKwlrYmQtPm5leHQ9a2V5Ym9hcmRzOworCWtleWJvYXJkcz1rYmQ7CisKKwlyZXR1cm4gMDsKKworIGVycm9yX2ZyZWVfczA6CisJa2ZyZWUoa2JkLT5zMCk7CisKKyBlcnJvcl9mcmVlX2tiZDoKKwlrZnJlZShrYmQpOworCisgZXJyb3Jfb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCQkJICAgICAgCisJCQkgICAgICAKK3ZvaWQgX19pbml0IHNjYW5fa2JkX2luaXQodm9pZCkKK3sKKwlpbml0X3RpbWVyKCZzY2FuX3RpbWVyKTsKKwlzY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0NBTkhaOworCXNjYW5fdGltZXIuZGF0YSA9IDA7CisJc2Nhbl90aW1lci5mdW5jdGlvbiA9IHNjYW5fa2JkOworCWFkZF90aW1lcigmc2Nhbl90aW1lcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJHZW5lcmljIHNjYW4ga2V5Ym9hcmQgZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuaCBiL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjYW5fa2V5Yi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYJX19EUklWRVJfQ0hBUl9TQ0FOX0tFWUJfSAorI2RlZmluZQlfX0RSSVZFUl9DSEFSX1NDQU5fS0VZQl9ICisvKgorICoJJElkOiBzY2FuX2tleWIuaCx2IDEuMSAyMDAwLzA2LzEwIDIxOjQ1OjMwIHlhZWdhc2hpIEV4cCAkCisgKglDb3B5cmlnaHQgKEMpIDIwMDAgWUFFR0FTSEkgVGFrZXNoaQorICoJR2VuZXJpYyBzY2FuIGtleWJvYXJkIGRyaXZlcgorICovCisKK2ludCByZWdpc3Rlcl9zY2FuX2tleWJvYXJkKGludCAoKnNjYW4pKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciksCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSwKKwkJCSAgIGludCBsZW5ndGgpOworCit2b2lkIF9faW5pdCBzY2FuX2tiZF9pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY2MuaCBiL2RyaXZlcnMvY2hhci9zY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgxMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjYy5oCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogYXRhcmlfU0NDLmg6IERlZmluaXRpb25zIGZvciB0aGUgQW04NTMwIFNlcmlhbCBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IDE5OTQgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworCisjaWZuZGVmIF9TQ0NfSAorI2RlZmluZSBfU0NDX0gKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKy8qIFNwZWNpYWwgY29uZmlndXJhdGlvbiBpb2N0bHMgZm9yIHRoZSBBdGFyaSBTQ0M1MzgwIFNlcmlhbAorICogQ29tbXVuaWNhdGlvbnMgQ29udHJvbGxlcgorICovCisKKy8qIGlvY3RsIGNvbW1hbmQgY29kZXMgKi8KKworI2RlZmluZSBUSU9DR0FUU0NDCTB4NTRjMAkvKiBnZXQgU0NDIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVElPQ1NBVFNDQwkweDU0YzEJLyogc2V0IFNDQyBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFRJT0NEQVRTQ0MJMHg1NGMyCS8qIHJlc2V0IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdHMgKi8KKworLyogQ2xvY2sgc291cmNlcyAqLworCisjZGVmaW5lIENMS19SVHhDCTAKKyNkZWZpbmUgQ0xLX1RSeEMJMQorI2RlZmluZSBDTEtfUENMSwkyCisKKy8qIGJhdWRfYmFzZXMgZm9yIHRoZSBjb21tb24gY2xvY2tzIGluIHRoZSBBdGFyaS4gVGhlc2UgYXJlIHRoZSByZWFsCisgKiBmcmVxdWVuY2llcyBkaXZpZGVkIGJ5IDE2LgorICovCisgICAKKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9USU1DCTE5MjAwCS8qIDAuMzA3MiBNSHogZnJvbSBUVC1NRlAsIFRpbWVyIEMgKi8KKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9CQ0xLCTE1MzYwMAkvKiAyLjQ1NzYgTUh6ICovCisjZGVmaW5lIFNDQ19CQVVEX0JBU0VfUENMSzQJMjI5NTAwCS8qIDMuNjcyMCBNSHogKi8KKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9QQ0xLCTUwMzM3NAkvKiA4LjA1Mzk3NjMgTUh6ICovCisjZGVmaW5lIFNDQ19CQVVEX0JBU0VfTk9ORQkwCS8qIGZvciBub3QgY29ubmVjdGVkIG9yIHVudXNlZAorCQkJCQkgKiBjbG9jayBzb3VyY2VzICovCisKKy8qIFRoZSBTQ0MgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IHNjY19jbG9ja19jb25maWcgeworCXVuc2lnbmVkCVJUeENfYmFzZTsJLyogYmFzZV9iYXVkIG9mIFJUeEMgKi8KKwl1bnNpZ25lZAlUUnhDX2Jhc2U7CS8qIGJhc2VfYmF1ZCBvZiBUUnhDICovCisJdW5zaWduZWQJUENMS19iYXNlOwkvKiBiYXNlX2JhdWQgb2YgUENMSywgYm90aCBjaGFubmVscyEgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjbGtzcmM7CS8qIENMS19SVHhDLCBDTEtfVFJ4QyBvciBDTEtfUENMSyAqLworCQl1bnNpZ25lZCBkaXZpc29yOwkvKiBkaXZpc29yIGZvciBiYXNlIGJhdWQsIHZhbGlkIHZhbHVlczoKKwkJCQkJICogc2VlIGJlbG93ICovCisJfSBiYXVkX3RhYmxlWzE3XTsJCS8qIEZvciA1MCwgNzUsIDExMCwgMTM1LCAxNTAsIDIwMCwgMzAwLAorCQkJCQkgKiA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsIDk2MDAsCisJCQkJCSAqIDE5MjAwLCAzODQwMCwgNTc2MDAgYW5kIDExNTIwMCBicHMuCisJCQkJCSAqIFRoZSBsYXN0IHR3byBjb3VsZCBiZSByZXBsYWNlZCBieQorCQkJCQkgKiBvdGhlciByYXRlcyA+IDM4NDAwIGlmIHRoZXkncmUgbm90CisJCQkJCSAqIHBvc3NpYmxlLgorCQkJCQkgKi8KK307CisKKy8qIFRoZSBmb2xsb3dpbmcgZGl2aXNvcnMgYXJlIHZhbGlkOgorICoKKyAqICAgLSBDTEtfUlR4QzogMSBvciBldmVuICgxLCAyIGFuZCA0IGFyZSB0aGUgZGlyZWN0IG1vZGVzLCA+IDQgdXNlCisgKiAgICAgICAgICAgICAgIHRoZSBCUkcpCisgKgorICogICAtIENMS19UUnhDOiAxLCAyIG9yIDQgKG5vIEJSRywgb25seSBkaXJlY3QgbW9kZXMgcG9zc2libGUpCisgKgorICogICAtIENMS19QQ0xLOiA+PSA0IGFuZCBldmVuIChubyBkaXJlY3QgbW9kZXMsIG9ubHkgQlJHKQorICoKKyAqLworCitzdHJ1Y3Qgc2NjX3BvcnQgeworCXN0cnVjdCBnc19wb3J0CQlnczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpjdHJscDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpkYXRhcDsKKwlpbnQJCQl4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQJCQljX2RjZDsKKwlpbnQJCQljaGFubmVsOworCXN0cnVjdCBzY2NfcG9ydAkJKnBvcnRfYTsJLyogUmVmZXJlbmNlIHRvIHBvcnQgQSBhbmQgQiAqLworCXN0cnVjdCBzY2NfcG9ydAkJKnBvcnRfYjsJLyogICBzdHJ1Y3RzIGZvciByZWcgYWNjZXNzICAqLworfTsKKworI2RlZmluZSBTQ0NfTUFHSUMJMHg1MjY5NjM2OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBTQ0MgZG9jdW1lbnRhdGlvbiBnaXZlcyBubyBleHBsaWNpdCBuYW1lcyB0byB0aGUgcmVnaXN0ZXJzLAorICogdGhleSdyZSBqdXN0IGNhbGxlZCBXUjAuLjE1IGFuZCBSUjAuLjE1LiBUbyBtYWtlIHRoZSBzb3VyY2UgY29kZQorICogYmV0dGVyIHJlYWRhYmxlIGFuZCBtYWtlIHRoZSB0cmFuc3BhcmVudCB3cml0ZSByZWcgcmVhZCBhY2Nlc3MgKHNlZQorICogYmVsb3cpIHBvc3NpYmxlLCBJIGNocmlzdGVuIHRoZW0gaGVyZSB3aXRoIHNlbGYtaW52ZW50ZWQgbmFtZXMuCisgKiBOb3RlIHRoYXQgKHJlYWwpIHJlYWQgcmVnaXN0ZXJzIGFyZSBhc3NpZ25lZCBudW1iZXJzIDE2Li4zMS4gV1I3JworICogaGFzIG51bWJlciAzMy4KKyAqLworCisjZGVmaW5lCUNPTU1BTkRfUkVHCQkwCS8qIHdvICovCisjZGVmaW5lCUlOVF9BTkRfRE1BX1JFRwkJMQkvKiB3byAqLworI2RlZmluZQlJTlRfVkVDVE9SX1JFRwkJMgkvKiBydywgY29tbW9uIHRvIGJvdGggY2hhbm5lbHMgKi8KKyNkZWZpbmUJUlhfQ1RSTF9SRUcJCTMJLyogcncgKi8KKyNkZWZpbmUJQVVYMV9DVFJMX1JFRwkJNAkvKiBydyAqLworI2RlZmluZQlUWF9DVFJMX1JFRwkJNQkvKiBydyAqLworI2RlZmluZQlTWU5DX0FEUl9SRUcJCTYJLyogd28gKi8KKyNkZWZpbmUJU1lOQ19DSEFSX1JFRwkJNwkvKiB3byAqLworI2RlZmluZQlTRExDX09QVElPTl9SRUcJCTMzCS8qIHdvICovCisjZGVmaW5lCVRYX0RBVEFfUkVHCQk4CS8qIHdvICovCisjZGVmaW5lCU1BU1RFUl9JTlRfQ1RSTAkJOQkvKiB3bywgY29tbW9uIHRvIGJvdGggY2hhbm5lbHMgKi8KKyNkZWZpbmUJQVVYMl9DVFJMX1JFRwkJMTAJLyogcncgKi8KKyNkZWZpbmUJQ0xLX0NUUkxfUkVHCQkxMQkvKiB3byAqLworI2RlZmluZQlUSU1FUl9MT1dfUkVHCQkxMgkvKiBydyAqLworI2RlZmluZQlUSU1FUl9ISUdIX1JFRwkJMTMJLyogcncgKi8KKyNkZWZpbmUJRFBMTF9DVFJMX1JFRwkJMTQJLyogd28gKi8KKyNkZWZpbmUJSU5UX0NUUkxfUkVHCQkxNQkvKiBydyAqLworCisjZGVmaW5lCVNUQVRVU19SRUcJCTE2CS8qIHJvICovCisjZGVmaW5lCVNQQ09ORF9TVEFUVVNfUkVHCTE3CS8qIHdvICovCisvKiBSUjIgaXMgV1IyIGZvciBDaGFubmVsIEEsIENoYW5uZWwgQiBnaXZlcyB2ZWN0b3IgKyBjdXJyZW50IHN0YXR1czogKi8KKyNkZWZpbmUJQ1VSUl9WRUNUT1JfUkVHCQkxOAkvKiBDaC4gQiBvbmx5LCBDaC4gQSBmb3IgcncgKi8KKyNkZWZpbmUJSU5UX1BFTkRJTkdfUkVHCQkxOQkvKiBDaGFubmVsIEEgb25seSEgKi8KKy8qIFJSNCBpcyBXUjQsIGlmIGI2KE1SNycpID09IDEgKi8KKy8qIFJSNSBpcyBXUjUsIGlmIGI2KE1SNycpID09IDEgKi8KKyNkZWZpbmUJRlNfRklGT19MT1dfUkVHCQkyMgkvKiBybyAqLworI2RlZmluZQlGU19GSUZPX0hJR0hfUkVHCTIzCS8qIHJvICovCisjZGVmaW5lCVJYX0RBVEFfUkVHCQkyNAkvKiBybyAqLworLyogUlI5IGlzIFdSMywgaWYgYjYoTVI3JykgPT0gMSAqLworI2RlZmluZQlEUExMX1NUQVRVU19SRUcJCTI2CS8qIHJvICovCisvKiBSUjExIGlzIFdSMTAsIGlmIGI2KE1SNycpID09IDEgKi8KKy8qIFJSMTIgaXMgV1IxMiAqLworLyogUlIxMyBpcyBXUjEzICovCisvKiBSUjE0IG5vdCBwcmVzZW50ICovCisvKiBSUjE1IGlzIFdSMTUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgVmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogV1IwOiBDT01NQU5EX1JFRyAiQ1IiICovCisKKyNkZWZpbmUJQ1JfUlhfQ1JDX1JFU0VUCQkweDQwCisjZGVmaW5lCUNSX1RYX0NSQ19SRVNFVAkJMHg4MAorI2RlZmluZQlDUl9UWF9VTkRFUlJVTl9SRVNFVAkweGMwCisKKyNkZWZpbmUJQ1JfRVhUU1RBVF9SRVNFVAkweDEwCisjZGVmaW5lCUNSX1NFTkRfQUJPUlQJCTB4MTgKKyNkZWZpbmUJQ1JfRU5BQl9JTlRfTkVYVF9SWAkweDIwCisjZGVmaW5lCUNSX1RYX1BFTkRJTkdfUkVTRVQJMHgyOAorI2RlZmluZQlDUl9FUlJPUl9SRVNFVAkJMHgzMAorI2RlZmluZQlDUl9ISUdIRVNUX0lVU19SRVNFVAkweDM4CisKKworLyogV1IxOiBJTlRfQU5EX0RNQV9SRUcgIklEUiIgKi8KKworI2RlZmluZQlJRFJfRVhUU1RBVF9JTlRfRU5BQgkweDAxCisjZGVmaW5lCUlEUl9UWF9JTlRfRU5BQgkJMHgwMgorI2RlZmluZQlJRFJfUEFSRVJSX0FTX1NQQ09ORAkweDA0CisKKyNkZWZpbmUJSURSX1JYX0lOVF9ESVNBQgkweDAwCisjZGVmaW5lCUlEUl9SWF9JTlRfRklSU1QJMHgwOAorI2RlZmluZQlJRFJfUlhfSU5UX0FMTAkJMHgxMAorI2RlZmluZQlJRFJfUlhfSU5UX1NQQ09ORAkweDE4CisjZGVmaW5lCUlEUl9SWF9JTlRfTUFTSwkJMHgxOAorCisjZGVmaW5lCUlEUl9XQUlUUkVRX1JYCQkweDIwCisjZGVmaW5lCUlEUl9XQUlUUkVRX0lTX1JFUQkweDQwCisjZGVmaW5lCUlEUl9XQUlUUkVRX0VOQUIJMHg4MAorCisKKy8qIFdSMzogUlhfQ1RSTF9SRUcgIlJDUiIgKi8KKworI2RlZmluZQlSQ1JfUlhfRU5BQgkJMHgwMQorI2RlZmluZQlSQ1JfRElTQ0FSRF9TWU5DX0NIQVJTCTB4MDIKKyNkZWZpbmUJUkNSX0FERFJfU0VBUkNICQkweDA0CisjZGVmaW5lCVJDUl9DUkNfRU5BQgkJMHgwOAorI2RlZmluZQlSQ1JfU0VBUkNIX01PREUJCTB4MTAKKyNkZWZpbmUJUkNSX0FVVE9fRU5BQl9NT0RFCTB4MjAKKworI2RlZmluZQlSQ1JfQ0hTSVpFX01BU0sJCTB4YzAKKyNkZWZpbmUJUkNSX0NIU0laRV81CQkweDAwCisjZGVmaW5lCVJDUl9DSFNJWkVfNgkJMHg0MAorI2RlZmluZQlSQ1JfQ0hTSVpFXzcJCTB4ODAKKyNkZWZpbmUJUkNSX0NIU0laRV84CQkweGMwCisKKworLyogV1I0OiBBVVgxX0NUUkxfUkVHICJBMUNSIiAqLworCisjZGVmaW5lCUExQ1JfUEFSSVRZX01BU0sJMHgwMworI2RlZmluZQlBMUNSX1BBUklUWV9OT05FCTB4MDAKKyNkZWZpbmUJQTFDUl9QQVJJVFlfT0RECQkweDAxCisjZGVmaW5lCUExQ1JfUEFSSVRZX0VWRU4JMHgwMworCisjZGVmaW5lCUExQ1JfTU9ERV9NQVNLCQkweDBjCisjZGVmaW5lCUExQ1JfTU9ERV9TWU5DUgkJMHgwMAorI2RlZmluZQlBMUNSX01PREVfQVNZTkNfMQkweDA0CisjZGVmaW5lCUExQ1JfTU9ERV9BU1lOQ18xNQkweDA4CisjZGVmaW5lCUExQ1JfTU9ERV9BU1lOQ18yCTB4MGMKKworI2RlZmluZQlBMUNSX1NZTkNSX01PREVfTUFTSwkweDMwCisjZGVmaW5lCUExQ1JfU1lOQ1JfTU9OT1NZTkMJMHgwMAorI2RlZmluZQlBMUNSX1NZTkNSX0JJU1lOQwkweDEwCisjZGVmaW5lCUExQ1JfU1lOQ1JfU0RMQwkJMHgyMAorI2RlZmluZQlBMUNSX1NZTkNSX0VYVENTWU5DCTB4MzAKKworI2RlZmluZQlBMUNSX0NMS01PREVfTUFTSwkweGMwCisjZGVmaW5lCUExQ1JfQ0xLTU9ERV94MQkJMHgwMAorI2RlZmluZQlBMUNSX0NMS01PREVfeDE2CTB4NDAKKyNkZWZpbmUJQTFDUl9DTEtNT0RFX3gzMgkweDgwCisjZGVmaW5lCUExQ1JfQ0xLTU9ERV94NjQJMHhjMAorCisKKy8qIFdSNTogVFhfQ1RSTF9SRUcgIlRDUiIgKi8KKworI2RlZmluZQlUQ1JfVFhfQ1JDX0VOQUIJCTB4MDEKKyNkZWZpbmUJVENSX1JUUwkJCTB4MDIKKyNkZWZpbmUJVENSX1VTRV9DUkNfQ0NJVFQJMHgwMAorI2RlZmluZQlUQ1JfVVNFX0NSQ18xNgkJMHgwNAorI2RlZmluZQlUQ1JfVFhfRU5BQgkJMHgwOAorI2RlZmluZQlUQ1JfU0VORF9CUkVBSwkJMHgxMAorCisjZGVmaW5lCVRDUl9DSFNJWkVfTUFTSwkJMHg2MAorI2RlZmluZQlUQ1JfQ0hTSVpFXzUJCTB4MDAKKyNkZWZpbmUJVENSX0NIU0laRV82CQkweDIwCisjZGVmaW5lCVRDUl9DSFNJWkVfNwkJMHg0MAorI2RlZmluZQlUQ1JfQ0hTSVpFXzgJCTB4NjAKKworI2RlZmluZQlUQ1JfRFRSCQkJMHg4MAorCisKKy8qIFdSNyc6IFNMRENfT1BUSU9OX1JFRyAiU09SIiAqLworCisjZGVmaW5lCVNPUl9BVVRPX1RYX0VOQUIJMHgwMQorI2RlZmluZQlTT1JfQVVUT19FT01fUkVTRVQJMHgwMgorI2RlZmluZQlTT1JfQVVUT19SVFNfTU9ERQkweDA0CisjZGVmaW5lCVNPUl9OUlpJX0RJU0FCX0hJR0gJMHgwOAorI2RlZmluZQlTT1JfQUxUX0RUUlJFUV9USU1JTkcJMHgxMAorI2RlZmluZQlTT1JfUkVBRF9DUkNfQ0hBUlMJMHgyMAorI2RlZmluZQlTT1JfRVhURU5ERURfUkVHX0FDQ0VTUwkweDQwCisKKworLyogV1I5OiBNQVNURVJfSU5UX0NUUkwgIk1JQyIgKi8KKworI2RlZmluZQlNSUNfVkVDX0lOQ0xfU1RBVAkweDAxCisjZGVmaW5lCU1JQ19OT19WRUNUT1IJCTB4MDIKKyNkZWZpbmUJTUlDX0RJU0FCX0xPV0VSX0NIQUlOCTB4MDQKKyNkZWZpbmUJTUlDX01BU1RFUl9JTlRfRU5BQgkweDA4CisjZGVmaW5lCU1JQ19TVEFUVVNfSElHSAkJMHgxMAorI2RlZmluZQlNSUNfSUdOX0lOVEFDSwkJMHgyMAorCisjZGVmaW5lCU1JQ19OT19SRVNFVAkJMHgwMAorI2RlZmluZQlNSUNfQ0hfQV9SRVNFVAkJMHg0MAorI2RlZmluZQlNSUNfQ0hfQl9SRVNFVAkJMHg4MAorI2RlZmluZQlNSUNfSEFSRF9SRVNFVAkJMHhjMAorCisKKy8qIFdSMTA6IEFVWDJfQ1RSTF9SRUcgIkEyQ1IiICovCisKKyNkZWZpbmUJQTJDUl9TWU5DXzYJCTB4MDEKKyNkZWZpbmUJQTJDUl9MT09QX01PREUJCTB4MDIKKyNkZWZpbmUJQTJDUl9BQk9SVF9PTl9VTkRFUlJVTgkweDA0CisjZGVmaW5lCUEyQ1JfTUFSS19JRExFCQkweDA4CisjZGVmaW5lCUEyQ1JfR09fQUNUSVZFX09OX1BPTEwJMHgxMAorCisjZGVmaW5lCUEyQ1JfQ09ESU5HX01BU0sJMHg2MAorI2RlZmluZQlBMkNSX0NPRElOR19OUloJCTB4MDAKKyNkZWZpbmUJQTJDUl9DT0RJTkdfTlJaSQkweDIwCisjZGVmaW5lCUEyQ1JfQ09ESU5HX0ZNMQkJMHg0MAorI2RlZmluZQlBMkNSX0NPRElOR19GTTAJCTB4NjAKKworI2RlZmluZQlBMkNSX1BSRVNFVF9DUkNfMQkweDgwCisKKworLyogV1IxMTogQ0xLX0NUUkxfUkVHICJDQ1IiICovCisKKyNkZWZpbmUJQ0NSX1RSeENPVVRfTUFTSwkweDAzCisjZGVmaW5lCUNDUl9UUnhDT1VUX1hUQUwJMHgwMAorI2RlZmluZQlDQ1JfVFJ4Q09VVF9UWENMSwkweDAxCisjZGVmaW5lCUNDUl9UUnhDT1VUX0JSRwkJMHgwMgorI2RlZmluZQlDQ1JfVFJ4Q09VVF9EUExMCTB4MDMKKworI2RlZmluZQlDQ1JfVFJ4Q19PVVRQVVQJCTB4MDQKKworI2RlZmluZQlDQ1JfVFhDTEtfTUFTSwkJMHgxOAorI2RlZmluZQlDQ1JfVFhDTEtfUlR4QwkJMHgwMAorI2RlZmluZQlDQ1JfVFhDTEtfVFJ4QwkJMHgwOAorI2RlZmluZQlDQ1JfVFhDTEtfQlJHCQkweDEwCisjZGVmaW5lCUNDUl9UWENMS19EUExMCQkweDE4CisKKyNkZWZpbmUJQ0NSX1JYQ0xLX01BU0sJCTB4NjAKKyNkZWZpbmUJQ0NSX1JYQ0xLX1JUeEMJCTB4MDAKKyNkZWZpbmUJQ0NSX1JYQ0xLX1RSeEMJCTB4MjAKKyNkZWZpbmUJQ0NSX1JYQ0xLX0JSRwkJMHg0MAorI2RlZmluZQlDQ1JfUlhDTEtfRFBMTAkJMHg2MAorCisjZGVmaW5lCUNDUl9SVHhDX1hUQUwJCTB4ODAKKworCisvKiBXUjE0OiBEUExMX0NUUkxfUkVHICJEQ1IiICovCisKKyNkZWZpbmUJRENSX0JSR19FTkFCCQkweDAxCisjZGVmaW5lCURDUl9CUkdfVVNFX1BDTEsJMHgwMgorI2RlZmluZQlEQ1JfRFRSUkVRX0lTX1JFUQkweDA0CisjZGVmaW5lCURDUl9BVVRPX0VDSE8JCTB4MDgKKyNkZWZpbmUJRENSX0xPQ0FMX0xPT1BCQUNLCTB4MTAKKworI2RlZmluZQlEQ1JfRFBMTF9FREdFX1NFQVJDSAkweDIwCisjZGVmaW5lCURDUl9EUExMX0VSUl9SRVNFVAkweDQwCisjZGVmaW5lCURDUl9EUExMX0RJU0FCCQkweDYwCisjZGVmaW5lCURDUl9EUExMX0NMS19CUkcJMHg4MAorI2RlZmluZQlEQ1JfRFBMTF9DTEtfUlR4QwkweGEwCisjZGVmaW5lCURDUl9EUExMX0ZNCQkweGMwCisjZGVmaW5lCURDUl9EUExMX05SWkkJCTB4ZTAKKworCisvKiBXUjE1OiBJTlRfQ1RSTF9SRUcgIklDUiIgKi8KKworI2RlZmluZQlJQ1JfT1BUSU9OUkVHX1NFTEVDVAkweDAxCisjZGVmaW5lCUlDUl9FTkFCX0JSR19aRVJPX0lOVAkweDAyCisjZGVmaW5lCUlDUl9VU0VfRlNfRklGTwkJMHgwNAorI2RlZmluZQlJQ1JfRU5BQl9EQ0RfSU5UCTB4MDgKKyNkZWZpbmUJSUNSX0VOQUJfU1lOQ19JTlQJMHgxMAorI2RlZmluZQlJQ1JfRU5BQl9DVFNfSU5UCTB4MjAKKyNkZWZpbmUJSUNSX0VOQUJfVU5ERVJSVU5fSU5UCTB4NDAKKyNkZWZpbmUJSUNSX0VOQUJfQlJFQUtfSU5UCTB4ODAKKworCisvKiBSUjA6IFNUQVRVU19SRUcgIlNSIiAqLworCisjZGVmaW5lCVNSX0NIQVJfQVZBSUwJCTB4MDEKKyNkZWZpbmUJU1JfQlJHX1pFUk8JCTB4MDIKKyNkZWZpbmUJU1JfVFhfQlVGX0VNUFRZCQkweDA0CisjZGVmaW5lCVNSX0RDRAkJCTB4MDgKKyNkZWZpbmUJU1JfU1lOQ19BQk9SVAkJMHgxMAorI2RlZmluZQlTUl9DVFMJCQkweDIwCisjZGVmaW5lCVNSX1RYX1VOREVSUlVOCQkweDQwCisjZGVmaW5lCVNSX0JSRUFLCQkweDgwCisKKworLyogUlIxOiBTUENPTkRfU1RBVFVTX1JFRyAiU0NTUiIgKi8KKworI2RlZmluZQlTQ1NSX0FMTF9TRU5UCQkweDAxCisjZGVmaW5lCVNDU1JfUkVTSURVQUxfTUFTSwkweDBlCisjZGVmaW5lCVNDU1JfUEFSSVRZX0VSUgkJMHgxMAorI2RlZmluZQlTQ1NSX1JYX09WRVJSVU4JCTB4MjAKKyNkZWZpbmUJU0NTUl9DUkNfRlJBTUVfRVJSCTB4NDAKKyNkZWZpbmUJU0NTUl9FTkRfT0ZfRlJBTUUJMHg4MAorCisKKy8qIFJSMzogSU5UX1BFTkRJTkdfUkVHICJJUFIiICovCisKKyNkZWZpbmUJSVBSX0JfRVhUU1RBVAkJMHgwMQorI2RlZmluZQlJUFJfQl9UWAkJMHgwMgorI2RlZmluZQlJUFJfQl9SWAkJMHgwNAorI2RlZmluZQlJUFJfQV9FWFRTVEFUCQkweDA4CisjZGVmaW5lCUlQUl9BX1RYCQkweDEwCisjZGVmaW5lCUlQUl9BX1JYCQkweDIwCisKKworLyogUlI3OiBGU19GSUZPX0hJR0hfUkVHICJGRkhSIiAqLworCisjZGVmaW5lCUZGSFJfQ05UX01BU0sJCTB4M2YKKyNkZWZpbmUJRkZIUl9JU19GUk9NX0ZJRk8JMHg0MAorI2RlZmluZQlGRkhSX0ZJRk9fT1ZFUlJVTgkweDgwCisKKworLyogUlIxMDogRFBMTF9TVEFUVVNfUkVHICJEU1IiICovCisKKyNkZWZpbmUJRFNSX09OX0xPT1AJCTB4MDIKKyNkZWZpbmUJRFNSX09OX0xPT1BfU0VORElORwkweDEwCisjZGVmaW5lCURTUl9UV09fQ0xLX01JU1NJTkcJMHg0MAorI2RlZmluZQlEU1JfT05FX0NMS19NSVNTSU5HCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIEFjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBTQ0MgbmVlZHMgMy41IFBDTEsgY3ljbGVzIHJlY292ZXJ5IHRpbWUgYmV0d2VlbiB0byByZWdpc3RlcgorICogYWNjZXNzZXMuIFBDTEsgcnVucyB3aXRoIDggTUh6IG9uIGFuIEF0YXJpLCBzbyB0aGlzIGRlbGF5IGlzIDMuNSAqCisgKiAxMjUgbnMgPSA0MzcuNSBucy4gVGhpcyBpcyB0b28gc2hvcnQgZm9yIHVkZWxheSgpLgorICogMTAvMTYvOTU6IEEgdHN0YiBtZnAucGFyX2R0X3JlZyB0YWtlcyA2MDBucyAoc3VyZT8pIGFuZCB0aHVzIHNob3VsZCBiZQorICogcXVpdGUgcmlnaHQKKyAqLworCisjZGVmaW5lIHNjY19yZWdfZGVsYXkoKSBcCisgICAgZG8gewkJCVwKKwlpZiAoTUFDSF9JU19NVk1FMTZ4IHx8IE1BQ0hfSVNfQlZNRTYwMDAgfHwgTUFDSF9JU19NVk1FMTQ3KQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICggIiBub3A7IG5vcCIpOwkJCVwKKwllbHNlIGlmIChNQUNIX0lTX0FUQVJJKQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAidHN0YiAlMCIgOiA6ICJnIiAoKl9zY2NfZGVsKSA6ICJjYyIgKTtcCisgICAgfSB3aGlsZSAoMCkKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2NjX3NoYWRvd1syXVsxNl07CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCByZWxheCB0aGUgc29tZWhvdyBjb21wbGljYXRlZAorICogcmVnaXN0ZXIgYWNjZXNzIG9mIHRoZSBTQ0MuIF9TQ0N3cml0ZSgpIHN0b3JlcyBhbGwgd3JpdHRlbiB2YWx1ZXMKKyAqIChleGNlcHQgZm9yIFdSMCBhbmQgV1I4KSBpbiBzaGFkb3cgcmVnaXN0ZXJzIGZvciBsYXRlciByZWNhbGwuIFRoaXMKKyAqIHJlbW92ZXMgdGhlIGJ1cmRlbiBvZiByZW1lbWJlcmluZyB3cml0dGVuIHZhbHVlcyBhcyBuZWVkZWQuIFRoZQorICogZXh0cmEgd29yayBvZiBzdG9yaW5nIHRoZSB2YWx1ZSBkb2Vzbid0IGNvdW50LCBzaW5jZSBhIGRlbGF5IGlzCisgKiBuZWVkZWQgYWZ0ZXIgYSBTQ0MgYWNjZXNzIGFueXdheS4gQWRkaXRpb25hbGx5LCBfU0NDd3JpdGUoKSBtYW5hZ2VzCisgKiB3cml0ZXMgdG8gV1IwIGFuZCBXUjggZGlmZmVyZW50bHksIGJlY2F1c2UgdGhlc2UgY2FuIGJlIGFjY2Vzc2VkCisgKiBkaXJlY3RseSB3aXRoIGxlc3Mgb3ZlcmhlYWQuIEFub3RoZXIgc3BlY2lhbCBjYXNlIGFyZSBXUjcgYW5kIFdSNycuCisgKiBfU0NDd3JpdGUgYXV0b21hdGljYWxseSBjaGVja3Mgd2hhdCBvZiB0aGlzIHJlZ2lzdGVycyBpcyBzZWxlY3RlZAorICogYW5kIGNoYW5nZXMgYjAgb2YgV1IxNSBpZiBuZWVkZWQuCisgKiAKKyAqIF9TQ0NyZWFkKCkgZm9yIHN0YW5kYXJkIHJlYWQgcmVnaXN0ZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgZXhjZXB0CisgKiBmb3IgUlIyIChzcGxpdCBpbnRvIHR3byAidmlydHVhbCIgcmVnaXN0ZXJzOiBvbmUgZm9yIHRoZSB2YWx1ZQorICogd3JpdHRlbiB0byBXUjIgKGZyb20gdGhlIHNoYWRvdykgYW5kIG9uZSBmb3IgdGhlIHZlY3RvciBpbmNsdWRpbmcKKyAqIHN0YXR1cyBmcm9tIFJSMiwgQ2guIEIpIGFuZCBSUjMuIFRoZSBsYXR0ZXIgbXVzdCBiZSByZWFkIGZyb20KKyAqIENoYW5uZWwgQSwgYmVjYXVzZSBpdCByZWFkcyBhcyBhbGwgemVyb3Mgb24gQ2guIEIuIFJSMCBhbmQgUlI4IGNhbgorICogYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgYmVmb3JlLgorICogCisgKiBUaGUgdHdvIGlubGluZSBmdW5jdGlvbiBjb250YWluIGNvbXBsaWNhdGVkIHN3aXRjaCBzdGF0ZW1lbnRzLiBCdXQKKyAqIEkgcmVseSBvbiByZWdubyBhbmQgZmluYWxfZGVsYXkgYmVpbmcgY29uc3RhbnRzLCBzbyBnY2MgY2FuIHJlZHVjZQorICogdGhlIHdob2xlIHN0dWZmIHRvIGp1c3Qgc29tZSBhc3NlbWJsZXIgc3RhdGVtZW50cy4KKyAqIAorICogX1NDQ3dyaXRlIGFuZCBfU0NDcmVhZCBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSB1bmRlcgorICogbm9ybWFsIGNpcmN1bXN0YW5jZXMuIFRoZSBtYWNyb3MgU0NDcmVhZFtfTkRdIGFuZCBTQ0N3cml0ZVtfTkRdIGFyZQorICogZm9yIHRoYXQgcHVycG9zZS4gVGhleSBhc3N1bWUgdGhhdCBhIGxvY2FsIHZhcmlhYmxlICdwb3J0JyBpcworICogZGVjbGFyZWQgYW5kIHBvaW50aW5nIHRvIHRoZSBwb3J0J3Mgc2NjX3N0cnVjdCBlbnRyeS4gVGhlCisgKiB2YXJpYW50cyB3aXRoICJfTkIiIGFwcGVuZGVkIHNob3VsZCBiZSB1c2VkIGlmIG5vIG90aGVyIFNDQworICogYWNjZXNzZXMgZm9sbG93IGltbWVkaWF0ZWx5ICh3aXRoaW4gMC41IHVzZWNzKS4gVGhleSBqdXN0IHNraXAgdGhlCisgKiBmaW5hbCBkZWxheSBub3BzLgorICogCisgKiBQbGVhc2Ugbm90ZSB0aGF0IGFjY2Vzc2VzIHRvIFNDQyByZWdpc3RlcnMgc2hvdWxkIG9ubHkgdGFrZSBwbGFjZQorICogd2hlbiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb2ZmIChhdCBsZWFzdCBpZiBTQ0MgaW50ZXJydXB0cyBhcmUKKyAqIGVuYWJsZWQpLiBPdGhlcndpc2UsIGFuIGludGVycnVwdCBjb3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUKKyAqIHR3by1zdGFnZSBhY2Nlc3NpbmcgcHJvY2Vzcy4KKyAqCisgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9TQ0N3cml0ZSgKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgY2hhciAqc2hhZG93LAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKl9zY2NfZGVsLAorCWludCByZWdubywKKwl1bnNpZ25lZCBjaGFyIHZhbCwgaW50IGZpbmFsX2RlbGF5ICkKK3sKKwlzd2l0Y2goIHJlZ25vICkgeworCisJICBjYXNlIENPTU1BTkRfUkVHOgorCQkvKiBXUjAgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkgd2l0aG91dCBwb2ludGluZyAqLworCQkqcG9ydC0+Y3RybHAgPSB2YWw7CisJCWJyZWFrOworCisJICBjYXNlIFNZTkNfQ0hBUl9SRUc6CisJCS8qIEZvciBXUjcsIGZpcnN0IHNldCBiMCBvZiBXUjE1IHRvIDAsIGlmIG5lZWRlZCAqLworCQlpZiAoc2hhZG93W0lOVF9DVFJMX1JFR10gJiBJQ1JfT1BUSU9OUkVHX1NFTEVDVCkgeworCQkJKnBvcnQtPmN0cmxwID0gMTU7CisJCQlzaGFkb3dbSU5UX0NUUkxfUkVHXSAmPSB+SUNSX09QVElPTlJFR19TRUxFQ1Q7CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCQkqcG9ydC0+Y3RybHAgPSBzaGFkb3dbSU5UX0NUUkxfUkVHXTsKKwkJCXNjY19yZWdfZGVsYXkoKTsKKwkJfQorCQlnb3RvIG5vcm1hbF9jYXNlOworCQkKKwkgIGNhc2UgU0RMQ19PUFRJT05fUkVHOgorCQkvKiBGb3IgV1I3JywgZmlyc3Qgc2V0IGIwIG9mIFdSMTUgdG8gMSwgaWYgbmVlZGVkICovCisJCWlmICghKHNoYWRvd1tJTlRfQ1RSTF9SRUddICYgSUNSX09QVElPTlJFR19TRUxFQ1QpKSB7CisJCQkqcG9ydC0+Y3RybHAgPSAxNTsKKwkJCXNoYWRvd1tJTlRfQ1RSTF9SRUddIHw9IElDUl9PUFRJT05SRUdfU0VMRUNUOworCQkJc2NjX3JlZ19kZWxheSgpOworCQkJKnBvcnQtPmN0cmxwID0gc2hhZG93W0lOVF9DVFJMX1JFR107CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCX0KKwkJKnBvcnQtPmN0cmxwID0gNzsKKwkJc2hhZG93WzhdID0gdmFsOwkvKiBXUjcnIHNoYWRvd2VkIGF0IFdSOCAqLworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgVFhfREFUQV9SRUc6CQkvKiBXUjggKi8KKwkJLyogVFhfREFUQV9SRUcgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IG9uIHNvbWUgaC93ICovCisJCWlmIChNQUNIX0lTX01WTUUxNnggfHwgTUFDSF9JU19CVk1FNjAwMCB8fCBNQUNIX0lTX01WTUUxNDcpCisJCXsKKwkJCSpwb3J0LT5jdHJscCA9IHJlZ25vOworCQkJc2NjX3JlZ19kZWxheSgpOworCQkJKnBvcnQtPmN0cmxwID0gdmFsOworCQl9CisJCWVsc2UKKwkJCSpwb3J0LT5kYXRhcCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgTUFTVEVSX0lOVF9DVFJMOgorCQkqcG9ydC0+Y3RybHAgPSByZWdubzsKKwkJdmFsICY9IDB4M2Y7CS8qIGJpdHMgNi4uNyBhcmUgdGhlIHJlc2V0IGNvbW1hbmRzICovCisJCXNjY19zaGFkb3dbMF1bcmVnbm9dID0gdmFsOworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgRFBMTF9DVFJMX1JFRzoKKwkJKnBvcnQtPmN0cmxwID0gcmVnbm87CisJCXZhbCAmPSAweDFmOwkJCS8qIGJpdHMgNS4uNyBhcmUgdGhlIERQTEwgY29tbWFuZHMgKi8KKwkJc2hhZG93W3JlZ25vXSA9IHZhbDsKKwkJc2NjX3JlZ19kZWxheSgpOworCQkqcG9ydC0+Y3RybHAgPSB2YWw7CisJCWJyZWFrOworCisJICBjYXNlIDEgLi4uIDY6CQorCSAgY2FzZSAxMCAuLi4gMTM6CisJICBjYXNlIDE1OgorCSAgbm9ybWFsX2Nhc2U6CisJCSpwb3J0LT5jdHJscCA9IHJlZ25vOworCQlzaGFkb3dbcmVnbm9dID0gdmFsOworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisJCQorCSAgZGVmYXVsdDoKKwkJcHJpbnRrKCAiQmFkIFNDQyB3cml0ZSBhY2Nlc3MgdG8gV1IlZFxuIiwgcmVnbm8gKTsKKwkJYnJlYWs7CisJCQorCX0KKworCWlmIChmaW5hbF9kZWxheSkKKwkJc2NjX3JlZ19kZWxheSgpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX1NDQ3JlYWQoCisJc3RydWN0IHNjY19wb3J0ICpwb3J0LAorCXVuc2lnbmVkIGNoYXIgKnNoYWRvdywKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpfc2NjX2RlbCwKKwlpbnQgcmVnbm8sIGludCBmaW5hbF9kZWxheSApCit7CisJdW5zaWduZWQgY2hhciBydjsKKworCXN3aXRjaCggcmVnbm8gKSB7CisKKwkJLyogLS0tIHJlYWwgcmVhZCByZWdpc3RlcnMgLS0tICovCisJICBjYXNlIFNUQVRVU19SRUc6CisJCXJ2ID0gKnBvcnQtPmN0cmxwOworCQlicmVhazsKKworCSAgY2FzZSBJTlRfUEVORElOR19SRUc6CisJCS8qIFJSMzogcmVhZCBvbmx5IGZyb20gQ2hhbm5lbCBBISAqLworCQlwb3J0ID0gcG9ydC0+cG9ydF9hOworCQlnb3RvIG5vcm1hbF9jYXNlOworCisJICBjYXNlIFJYX0RBVEFfUkVHOgorCQkvKiBSUjggY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IG9uIHNvbWUgaC93ICovCisJCWlmIChNQUNIX0lTX01WTUUxNnggfHwgTUFDSF9JU19CVk1FNjAwMCB8fCBNQUNIX0lTX01WTUUxNDcpCisJCXsKKwkJCSpwb3J0LT5jdHJscCA9IDg7CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCQlydiA9ICpwb3J0LT5jdHJscDsKKwkJfQorCQllbHNlCisJCQlydiA9ICpwb3J0LT5kYXRhcDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ1VSUl9WRUNUT1JfUkVHOgorCQkvKiBSUjIgKHZlY3RvciBpbmNsdWRpbmcgc3RhdHVzKSBmcm9tIENoLiBCICovCisJCXBvcnQgPSBwb3J0LT5wb3J0X2I7CisJCWdvdG8gbm9ybWFsX2Nhc2U7CisJCQorCQkvKiAtLS0gcmVhZGluZyB3cml0ZSByZWdpc3RlcnM6IGFjY2VzcyB0aGUgc2hhZG93IC0tLSAqLworCSAgY2FzZSAxIC4uLiA3OgorCSAgY2FzZSAxMCAuLi4gMTU6CisJCXJldHVybiBzaGFkb3dbcmVnbm9dOyAvKiBubyBmaW5hbCBkZWxheSEgKi8KKworCQkvKiBXUjcnIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgaXMgc2hhZG93ZWQgYXQgdGhlIHBsYWNlIG9mIFdSOCAqLworCSAgY2FzZSBTRExDX09QVElPTl9SRUc6CisJCXJldHVybiBzaGFkb3dbOF07IC8qIG5vIGZpbmFsIGRlbGF5ISAqLworCisJCS8qIFdSOSBpcyBzcGVjaWFsIHRvbywgYmVjYXVzZSBpdCBpcyBjb21tb24gZm9yIGJvdGggY2hhbm5lbHMgKi8KKwkgIGNhc2UgTUFTVEVSX0lOVF9DVFJMOgorCQlyZXR1cm4gc2NjX3NoYWRvd1swXVs5XTsgLyogbm8gZmluYWwgZGVsYXkhICovCisKKwkgIGRlZmF1bHQ6CisJCXByaW50ayggIkJhZCBTQ0MgcmVhZCBhY2Nlc3MgdG8gJWNSJWRcbiIsIChyZWdubyAmIDE2KSA/ICdSJyA6ICdXJywKKwkJCQlyZWdubyAmIH4xNiApOworCQlicmVhazsKKwkJCisJICBjYXNlIFNQQ09ORF9TVEFUVVNfUkVHOgorCSAgY2FzZSBGU19GSUZPX0xPV19SRUc6CisJICBjYXNlIEZTX0ZJRk9fSElHSF9SRUc6CisJICBjYXNlIERQTExfU1RBVFVTX1JFRzoKKwkgIG5vcm1hbF9jYXNlOgorCQkqcG9ydC0+Y3RybHAgPSByZWdubyAmIDB4MGY7CisJCXNjY19yZWdfZGVsYXkoKTsKKwkJcnYgPSAqcG9ydC0+Y3RybHA7CisJCWJyZWFrOworCQkKKwl9CisKKwlpZiAoZmluYWxfZGVsYXkpCisJCXNjY19yZWdfZGVsYXkoKTsKKwlyZXR1cm4gcnY7Cit9CisKKyNkZWZpbmUgU0NDX0FDQ0VTU19JTklUKHBvcnQpCQkJCQkJXAorCXVuc2lnbmVkIGNoYXIgKl9zY2Nfc2hhZG93ID0gJnNjY19zaGFkb3dbcG9ydC0+Y2hhbm5lbF1bMF0KKworI2RlZmluZQlTQ0N3cml0ZShyZWcsdmFsKQlfU0NDd3JpdGUocG9ydCxfc2NjX3NoYWRvdyxzY2NfZGVsLChyZWcpLCh2YWwpLDEpCisjZGVmaW5lCVNDQ3dyaXRlX05CKHJlZyx2YWwpCV9TQ0N3cml0ZShwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksKHZhbCksMCkKKyNkZWZpbmUJU0NDcmVhZChyZWcpCQlfU0NDcmVhZChwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksMSkKKyNkZWZpbmUJU0NDcmVhZF9OQihyZWcpCQlfU0NDcmVhZChwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksMCkKKworI2RlZmluZSBTQ0Ntb2QocmVnLGFuZCxvcikJU0NDd3JpdGUoKHJlZyksKFNDQ3JlYWQocmVnKSYoYW5kKSl8KG9yKSkKKworI2VuZGlmIC8qIF9TQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMgYi9kcml2ZXJzL2NoYXIvc2N4MjAwX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRhNmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qIGxpbnV4L2RyaXZlcnMvY2hhci9zY3gyMDBfZ3Bpby5jIAorCisgICBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFNDeDIwMCBHUElPIGRyaXZlci4gIEFsbG93cyBhIHVzZXIgc3BhY2UKKyAgIHByb2Nlc3MgdG8gcGxheSB3aXRoIHRoZSBHUElPIHBpbnMuCisKKyAgIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvc2N4MjAwX2dwaW8uaD4KKworI2RlZmluZSBOQU1FICJzY3gyMDBfZ3BpbyIKKworTU9EVUxFX0FVVEhPUigiQ2hyaXN0ZXIgV2VpbmlnZWwgPHdpbmdlbEBuYW5vLXN5c3RlbS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5hdFNlbWkgU0N4MjAwIEdQSU8gUGluIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IG1ham9yID0gMDsJCS8qIGRlZmF1bHQgdG8gZHluYW1pYyBtYWpvciAqLworbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYWpvciwgIk1ham9yIGRldmljZSBudW1iZXIiKTsKKworc3RhdGljIHNzaXplX3Qgc2N4MjAwX2dwaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCAKKwkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIG0gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWNoYXIgYzsKKwkJaWYgKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3dpdGNoIChjKQorCQl7CisJCWNhc2UgJzAnOiAKKwkJCXNjeDIwMF9ncGlvX3NldChtLCAwKTsgCisJCQlicmVhazsKKwkJY2FzZSAnMSc6IAorCQkJc2N4MjAwX2dwaW9fc2V0KG0sIDEpOyAKKwkJCWJyZWFrOworCQljYXNlICdPJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGVuYWJsZWRcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4xLCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGRpc2FibGVkXG4iLCBtKTsKKwkJCXNjeDIwMF9ncGlvX2NvbmZpZ3VyZShtLCB+MSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogR1BJTyVkIG91dHB1dCBpcyBwdXNoIHB1bGxcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4yLCAyKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGlzIG9wZW4gZHJhaW5cbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4yLCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgcHVsbCB1cCBlbmFibGVkXG4iLCBtKTsKKwkJCXNjeDIwMF9ncGlvX2NvbmZpZ3VyZShtLCB+NCwgNCk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogR1BJTyVkIHB1bGwgdXAgZGlzYWJsZWRcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH40LCAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3Qgc2N4MjAwX2dwaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSBzY3gyMDBfZ3Bpb19nZXQobSk7CisJaWYgKHB1dF91c2VyKHZhbHVlID8gJzEnIDogJzAnLCBidWYpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzY3gyMDBfZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIG0gPSBpbWlub3IoaW5vZGUpOworCWlmIChtID4gNjMpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzY3gyMDBfZ3Bpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjeDIwMF9ncGlvX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkud3JpdGUgICA9IHNjeDIwMF9ncGlvX3dyaXRlLAorCS5yZWFkICAgID0gc2N4MjAwX2dwaW9fcmVhZCwKKwkub3BlbiAgICA9IHNjeDIwMF9ncGlvX29wZW4sCisJLnJlbGVhc2UgPSBzY3gyMDBfZ3Bpb19yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2dwaW9faW5pdCh2b2lkKQoreworCWludCByOworCisJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBOYXRTZW1pIFNDeDIwMCBHUElPIERyaXZlclxuIik7CisKKwlpZiAoIXNjeDIwMF9ncGlvX3ByZXNlbnQoKSkgeworCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiBubyBTQ3gyMDAgZ3BpbyBwaW5zIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXIgPSByZWdpc3Rlcl9jaHJkZXYobWFqb3IsIE5BTUUsICZzY3gyMDBfZ3Bpb19mb3BzKTsKKwlpZiAociA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2VcbiIpOworCQlyZXR1cm4gcjsKKwl9CisJaWYgKCFtYWpvcikgeworCQltYWpvciA9IHI7CisJCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZ290IGR5bmFtaWMgbWFqb3IgJWRcbiIsIG1ham9yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF9ncGlvX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgTkFNRSk7Cit9CisKK21vZHVsZV9pbml0KHNjeDIwMF9ncGlvX2luaXQpOworbW9kdWxlX2V4aXQoc2N4MjAwX2dwaW9fY2xlYW51cCk7CisKKy8qCisgICAgTG9jYWwgdmFyaWFibGVzOgorICAgICAgICBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIC1rIC1DIC4uLy4uIFNVQkRJUlM9ZHJpdmVycy9jaGFyIG1vZHVsZXMiCisgICAgICAgIGMtYmFzaWMtb2Zmc2V0OiA4CisgICAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYyBiL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQ2MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCisgKgorICogVGhpcyBtb2R1bGUgZXhwb3J0cyB0aGUgZnVuY3Rpb25zOgorICoKKyAqICAgICAnaW50IHNldF9zZWxlY3Rpb24oc3RydWN0IHRpb2NsX3NlbGVjdGlvbiBfX3VzZXIgKiwgc3RydWN0IHR0eV9zdHJ1Y3QgKiknCisgKiAgICAgJ3ZvaWQgY2xlYXJfc2VsZWN0aW9uKHZvaWQpJworICogICAgICdpbnQgcGFzdGVfc2VsZWN0aW9uKHN0cnVjdCB0dHlfc3RydWN0ICopJworICogICAgICdpbnQgc2VsX2xvYWRsdXQoY2hhciBfX3VzZXIgKiknCisgKgorICogTm93IHRoYXQgL2Rldi92Y3MgZXhpc3RzLCBtb3N0IG9mIHRoaXMgY2FuIGRpc2FwcGVhciBhZ2Fpbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGlvY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisKKy8qIERvbid0IHRha2UgdGhpcyBmcm9tIDxjdHlwZS5oPjogMDExLTAxNSBvbiB0aGUgc2NyZWVuIGFyZW4ndCBzcGFjZXMgKi8KKyNkZWZpbmUgaXNzcGFjZShjKQkoKGMpID09ICcgJykKKworZXh0ZXJuIHZvaWQgcG9rZV9ibGFua2VkX2NvbnNvbGUodm9pZCk7CisKKy8qIFZhcmlhYmxlcyBmb3Igc2VsZWN0aW9uIGNvbnRyb2wuICovCisvKiBVc2UgYSBkeW5hbWljIGJ1ZmZlciwgaW5zdGVhZCBvZiBzdGF0aWMgKERlYyAxOTk0KSAqLworc3RydWN0IHZjX2RhdGEgKnNlbF9jb25zOwkJLyogbXVzdCBub3QgYmUgZGlzYWxsb2NhdGVkICovCitzdGF0aWMgdm9sYXRpbGUgaW50IHNlbF9zdGFydCA9IC0xOyAJLyogY2xlYXJlZCBieSBjbGVhcl9zZWxlY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2VsX2VuZDsKK3N0YXRpYyBpbnQgc2VsX2J1ZmZlcl9sdGg7CitzdGF0aWMgY2hhciAqc2VsX2J1ZmZlcjsKKworLyogY2xlYXJfc2VsZWN0aW9uLCBoaWdobGlnaHQgYW5kIGhpZ2hsaWdodF9wb2ludGVyIGNhbiBiZSBjYWxsZWQKKyAgIGZyb20gaW50ZXJydXB0ICh2aWEgc2Nyb2xsYmFjay9mcm9udCkgKi8KKworLyogc2V0IHJldmVyc2UgdmlkZW8gb24gY2hhcmFjdGVycyBzLWUgb2YgY29uc29sZSB3aXRoIHNlbGVjdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdobGlnaHQoY29uc3QgaW50IHMsIGNvbnN0IGludCBlKQoreworCWludmVydF9zY3JlZW4oc2VsX2NvbnMsIHMsIGUtcysyLCAxKTsKK30KKworLyogdXNlIGNvbXBsZW1lbnRhcnkgY29sb3IgdG8gc2hvdyB0aGUgcG9pbnRlciAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZ2hsaWdodF9wb2ludGVyKGNvbnN0IGludCB3aGVyZSkKK3sKKwljb21wbGVtZW50X3BvcyhzZWxfY29ucywgd2hlcmUpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorc2VsX3BvcyhpbnQgbikKK3sKKwlyZXR1cm4gaW52ZXJzZV90cmFuc2xhdGUoc2VsX2NvbnMsIHNjcmVlbl9nbHlwaChzZWxfY29ucywgbikpOworfQorCisvKiByZW1vdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhpZ2hsaWdodCwgaWYgYW55LAorICAgZnJvbSB0aGUgY29uc29sZSBob2xkaW5nIHRoZSBzZWxlY3Rpb24uICovCit2b2lkCitjbGVhcl9zZWxlY3Rpb24odm9pZCkgeworCWhpZ2hsaWdodF9wb2ludGVyKC0xKTsgLyogaGlkZSB0aGUgcG9pbnRlciAqLworCWlmIChzZWxfc3RhcnQgIT0gLTEpIHsKKwkJaGlnaGxpZ2h0KHNlbF9zdGFydCwgc2VsX2VuZCk7CisJCXNlbF9zdGFydCA9IC0xOworCX0KK30KKworLyoKKyAqIFVzZXIgc2V0dGFibGUgdGFibGU6IHdoYXQgY2hhcmFjdGVycyBhcmUgdG8gYmUgY29uc2lkZXJlZCBhbHBoYWJldGljPworICogMjU2IGJpdHMKKyAqLworc3RhdGljIHUzMiBpbndvcmRMdXRbOF09eworICAweDAwMDAwMDAwLCAvKiBjb250cm9sIGNoYXJzICAgICAqLworICAweDAzRkYwMDAwLCAvKiBkaWdpdHMgICAgICAgICAgICAqLworICAweDg3RkZGRkZFLCAvKiB1cHBlcmNhc2UgYW5kICdfJyAqLworICAweDA3RkZGRkZFLCAvKiBsb3dlcmNhc2UgICAgICAgICAqLworICAweDAwMDAwMDAwLAorICAweDAwMDAwMDAwLAorICAweEZGN0ZGRkZGLCAvKiBsYXRpbi0xIGFjY2VudGVkIGxldHRlcnMsIG5vdCBtdWx0aXBsaWNhdGlvbiBzaWduICovCisgIDB4RkY3RkZGRkYgIC8qIGxhdGluLTEgYWNjZW50ZWQgbGV0dGVycywgbm90IGRpdmlzaW9uIHNpZ24gKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlud29yZChjb25zdCB1bnNpZ25lZCBjaGFyIGMpIHsKKwlyZXR1cm4gKCBpbndvcmRMdXRbYz4+NV0gPj4gKGMgJiAweDFGKSApICYgMTsKK30KKworLyogc2V0IGlud29yZEx1dCBjb250ZW50cy4gSW52b2tlZCBieSBpb2N0bCgpLiAqLworaW50IHNlbF9sb2FkbHV0KGNoYXIgX191c2VyICpwKQoreworCXJldHVybiBjb3B5X2Zyb21fdXNlcihpbndvcmRMdXQsICh1MzIgX191c2VyICopKHArNCksIDMyKSA/IC1FRkFVTFQgOiAwOworfQorCisvKiBkb2VzIHNjcmVlbiBhZGRyZXNzIHAgY29ycmVzcG9uZCB0byBjaGFyYWN0ZXIgYXQgTEgvUkggZWRnZSBvZiBzY3JlZW4/ICovCitzdGF0aWMgaW5saW5lIGludCBhdGVkZ2UoY29uc3QgaW50IHAsIGludCBzaXplX3JvdykKK3sKKwlyZXR1cm4gKCEocCAlIHNpemVfcm93KQl8fCAhKChwICsgMikgJSBzaXplX3JvdykpOworfQorCisvKiBjb25zdHJhaW4gdiBzdWNoIHRoYXQgdiA8PSB1ICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGxpbWl0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHYsIGNvbnN0IHVuc2lnbmVkIHNob3J0IHUpCit7CisJcmV0dXJuICh2ID4gdSkgPyB1IDogdjsKK30KKworLyogc2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gSW52b2tlZCBieSBpb2N0bCgpIG9yIGJ5IGtlcm5lbCBjb2RlLiAqLworaW50IHNldF9zZWxlY3Rpb24oY29uc3Qgc3RydWN0IHRpb2NsX3NlbGVjdGlvbiBfX3VzZXIgKnNlbCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJaW50IHNlbF9tb2RlLCBuZXdfc2VsX3N0YXJ0LCBuZXdfc2VsX2VuZCwgc3BjOworCWNoYXIgKmJwLCAqb2JwOworCWludCBpLCBwcywgcGU7CisKKwlwb2tlX2JsYW5rZWRfY29uc29sZSgpOworCisJeyB1bnNpZ25lZCBzaG9ydCB4cywgeXMsIHhlLCB5ZTsKKworCSAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNlbCwgc2l6ZW9mKCpzZWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJICBfX2dldF91c2VyKHhzLCAmc2VsLT54cyk7CisJICBfX2dldF91c2VyKHlzLCAmc2VsLT55cyk7CisJICBfX2dldF91c2VyKHhlLCAmc2VsLT54ZSk7CisJICBfX2dldF91c2VyKHllLCAmc2VsLT55ZSk7CisJICBfX2dldF91c2VyKHNlbF9tb2RlLCAmc2VsLT5zZWxfbW9kZSk7CisJICB4cy0tOyB5cy0tOyB4ZS0tOyB5ZS0tOworCSAgeHMgPSBsaW1pdCh4cywgdmMtPnZjX2NvbHMgLSAxKTsKKwkgIHlzID0gbGltaXQoeXMsIHZjLT52Y19yb3dzIC0gMSk7CisJICB4ZSA9IGxpbWl0KHhlLCB2Yy0+dmNfY29scyAtIDEpOworCSAgeWUgPSBsaW1pdCh5ZSwgdmMtPnZjX3Jvd3MgLSAxKTsKKwkgIHBzID0geXMgKiB2Yy0+dmNfc2l6ZV9yb3cgKyAoeHMgPDwgMSk7CisJICBwZSA9IHllICogdmMtPnZjX3NpemVfcm93ICsgKHhlIDw8IDEpOworCisJICBpZiAoc2VsX21vZGUgPT0gVElPQ0xfU0VMQ0xFQVIpIHsKKwkgICAgICAvKiB1c2VmdWwgZm9yIHNjcmVlbmR1bXAgd2l0aG91dCBzZWxlY3Rpb24gaGlnaGxpZ2h0cyAqLworCSAgICAgIGNsZWFyX3NlbGVjdGlvbigpOworCSAgICAgIHJldHVybiAwOworCSAgfQorCisJICBpZiAobW91c2VfcmVwb3J0aW5nKCkgJiYgKHNlbF9tb2RlICYgVElPQ0xfU0VMTU9VU0VSRVBPUlQpKSB7CisJICAgICAgbW91c2VfcmVwb3J0KHR0eSwgc2VsX21vZGUgJiBUSU9DTF9TRUxCVVRUT05NQVNLLCB4cywgeXMpOworCSAgICAgIHJldHVybiAwOworCSAgfQorICAgICAgICB9CisKKwlpZiAocHMgPiBwZSkJLyogbWFrZSBzZWxfc3RhcnQgPD0gc2VsX2VuZCAqLworCXsKKwkJaW50IHRtcCA9IHBzOworCQlwcyA9IHBlOworCQlwZSA9IHRtcDsKKwl9CisKKwlpZiAoc2VsX2NvbnMgIT0gdmNfY29uc1tmZ19jb25zb2xlXS5kKSB7CisJCWNsZWFyX3NlbGVjdGlvbigpOworCQlzZWxfY29ucyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwl9CisKKwlzd2l0Y2ggKHNlbF9tb2RlKQorCXsKKwkJY2FzZSBUSU9DTF9TRUxDSEFSOgkvKiBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHNlbGVjdGlvbiAqLworCQkJbmV3X3NlbF9zdGFydCA9IHBzOworCQkJbmV3X3NlbF9lbmQgPSBwZTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1NFTFdPUkQ6CS8qIHdvcmQtYnktd29yZCBzZWxlY3Rpb24gKi8KKwkJCXNwYyA9IGlzc3BhY2Uoc2VsX3BvcyhwcykpOworCQkJZm9yIChuZXdfc2VsX3N0YXJ0ID0gcHM7IDsgcHMgLT0gMikKKwkJCXsKKwkJCQlpZiAoKHNwYyAmJiAhaXNzcGFjZShzZWxfcG9zKHBzKSkpIHx8CisJCQkJICAgICghc3BjICYmICFpbndvcmQoc2VsX3BvcyhwcykpKSkKKwkJCQkJYnJlYWs7CisJCQkJbmV3X3NlbF9zdGFydCA9IHBzOworCQkJCWlmICghKHBzICUgdmMtPnZjX3NpemVfcm93KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzcGMgPSBpc3NwYWNlKHNlbF9wb3MocGUpKTsKKwkJCWZvciAobmV3X3NlbF9lbmQgPSBwZTsgOyBwZSArPSAyKQorCQkJeworCQkJCWlmICgoc3BjICYmICFpc3NwYWNlKHNlbF9wb3MocGUpKSkgfHwKKwkJCQkgICAgKCFzcGMgJiYgIWlud29yZChzZWxfcG9zKHBlKSkpKQorCQkJCQlicmVhazsKKwkJCQluZXdfc2VsX2VuZCA9IHBlOworCQkJCWlmICghKChwZSArIDIpICUgdmMtPnZjX3NpemVfcm93KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9TRUxMSU5FOgkvKiBsaW5lLWJ5LWxpbmUgc2VsZWN0aW9uICovCisJCQluZXdfc2VsX3N0YXJ0ID0gcHMgLSBwcyAlIHZjLT52Y19zaXplX3JvdzsKKwkJCW5ld19zZWxfZW5kID0gcGUgKyB2Yy0+dmNfc2l6ZV9yb3cKKwkJCQkgICAgLSBwZSAlIHZjLT52Y19zaXplX3JvdyAtIDI7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9TRUxQT0lOVEVSOgorCQkJaGlnaGxpZ2h0X3BvaW50ZXIocGUpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZW1vdmUgdGhlIHBvaW50ZXIgKi8KKwloaWdobGlnaHRfcG9pbnRlcigtMSk7CisKKwkvKiBzZWxlY3QgdG8gZW5kIG9mIGxpbmUgaWYgb24gdHJhaWxpbmcgc3BhY2UgKi8KKwlpZiAobmV3X3NlbF9lbmQgPiBuZXdfc2VsX3N0YXJ0ICYmCisJCSFhdGVkZ2UobmV3X3NlbF9lbmQsIHZjLT52Y19zaXplX3JvdykgJiYKKwkJaXNzcGFjZShzZWxfcG9zKG5ld19zZWxfZW5kKSkpIHsKKwkJZm9yIChwZSA9IG5ld19zZWxfZW5kICsgMjsgOyBwZSArPSAyKQorCQkJaWYgKCFpc3NwYWNlKHNlbF9wb3MocGUpKSB8fAorCQkJICAgIGF0ZWRnZShwZSwgdmMtPnZjX3NpemVfcm93KSkKKwkJCQlicmVhazsKKwkJaWYgKGlzc3BhY2Uoc2VsX3BvcyhwZSkpKQorCQkJbmV3X3NlbF9lbmQgPSBwZTsKKwl9CisJaWYgKHNlbF9zdGFydCA9PSAtMSkJLyogbm8gY3VycmVudCBzZWxlY3Rpb24gKi8KKwkJaGlnaGxpZ2h0KG5ld19zZWxfc3RhcnQsIG5ld19zZWxfZW5kKTsKKwllbHNlIGlmIChuZXdfc2VsX3N0YXJ0ID09IHNlbF9zdGFydCkKKwl7CisJCWlmIChuZXdfc2VsX2VuZCA9PSBzZWxfZW5kKQkvKiBubyBhY3Rpb24gcmVxdWlyZWQgKi8KKwkJCXJldHVybiAwOworCQllbHNlIGlmIChuZXdfc2VsX2VuZCA+IHNlbF9lbmQpCS8qIGV4dGVuZCB0byByaWdodCAqLworCQkJaGlnaGxpZ2h0KHNlbF9lbmQgKyAyLCBuZXdfc2VsX2VuZCk7CisJCWVsc2UJCQkJLyogY29udHJhY3QgZnJvbSByaWdodCAqLworCQkJaGlnaGxpZ2h0KG5ld19zZWxfZW5kICsgMiwgc2VsX2VuZCk7CisJfQorCWVsc2UgaWYgKG5ld19zZWxfZW5kID09IHNlbF9lbmQpCisJeworCQlpZiAobmV3X3NlbF9zdGFydCA8IHNlbF9zdGFydCkJLyogZXh0ZW5kIHRvIGxlZnQgKi8KKwkJCWhpZ2hsaWdodChuZXdfc2VsX3N0YXJ0LCBzZWxfc3RhcnQgLSAyKTsKKwkJZWxzZQkJCQkvKiBjb250cmFjdCBmcm9tIGxlZnQgKi8KKwkJCWhpZ2hsaWdodChzZWxfc3RhcnQsIG5ld19zZWxfc3RhcnQgLSAyKTsKKwl9CisJZWxzZQkvKiBzb21lIG90aGVyIGNhc2U7IHN0YXJ0IHNlbGVjdGlvbiBmcm9tIHNjcmF0Y2ggKi8KKwl7CisJCWNsZWFyX3NlbGVjdGlvbigpOworCQloaWdobGlnaHQobmV3X3NlbF9zdGFydCwgbmV3X3NlbF9lbmQpOworCX0KKwlzZWxfc3RhcnQgPSBuZXdfc2VsX3N0YXJ0OworCXNlbF9lbmQgPSBuZXdfc2VsX2VuZDsKKworCS8qIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBiZWZvcmUgZnJlZWluZyB0aGUgb2xkIG9uZSAuLi4gKi8KKwlicCA9IGttYWxsb2MoKHNlbF9lbmQtc2VsX3N0YXJ0KS8yKzEsIEdGUF9LRVJORUwpOworCWlmICghYnApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VsZWN0aW9uOiBrbWFsbG9jKCkgZmFpbGVkXG4iKTsKKwkJY2xlYXJfc2VsZWN0aW9uKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoc2VsX2J1ZmZlcikKKwkJa2ZyZWUoc2VsX2J1ZmZlcik7CisJc2VsX2J1ZmZlciA9IGJwOworCisJb2JwID0gYnA7CisJZm9yIChpID0gc2VsX3N0YXJ0OyBpIDw9IHNlbF9lbmQ7IGkgKz0gMikgeworCQkqYnAgPSBzZWxfcG9zKGkpOworCQlpZiAoIWlzc3BhY2UoKmJwKyspKQorCQkJb2JwID0gYnA7CisJCWlmICghICgoaSArIDIpICUgdmMtPnZjX3NpemVfcm93KSkgeworCQkJLyogc3RyaXAgdHJhaWxpbmcgYmxhbmtzIGZyb20gbGluZSBhbmQgYWRkIG5ld2xpbmUsCisJCQkgICB1bmxlc3Mgbm9uLXNwYWNlIGF0IGVuZCBvZiBsaW5lLiAqLworCQkJaWYgKG9icCAhPSBicCkgeworCQkJCWJwID0gb2JwOworCQkJCSpicCsrID0gJ1xyJzsKKwkJCX0KKwkJCW9icCA9IGJwOworCQl9CisJfQorCXNlbF9idWZmZXJfbHRoID0gYnAgLSBzZWxfYnVmZmVyOworCXJldHVybiAwOworfQorCisvKiBJbnNlcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24gYnVmZmVyIGludG8gdGhlCisgKiBxdWV1ZSBvZiB0aGUgdHR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBjb25zb2xlLgorICogSW52b2tlZCBieSBpb2N0bCgpLgorICovCitpbnQgcGFzdGVfc2VsZWN0aW9uKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gKHN0cnVjdCB2Y19kYXRhICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQJcGFzdGVkID0gMCwgY291bnQ7CisJc3RydWN0ICB0dHlfbGRpc2MgKmxkOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCXBva2VfYmxhbmtlZF9jb25zb2xlKCk7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwkKKwlhZGRfd2FpdF9xdWV1ZSgmdmMtPnBhc3RlX3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoc2VsX2J1ZmZlciAmJiBzZWxfYnVmZmVyX2x0aCA+IHBhc3RlZCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKSB7CisJCQlzY2hlZHVsZSgpOworCQkJY29udGludWU7CisJCX0KKwkJY291bnQgPSBzZWxfYnVmZmVyX2x0aCAtIHBhc3RlZDsKKwkJY291bnQgPSBtaW4oY291bnQsIHR0eS0+bGRpc2MucmVjZWl2ZV9yb29tKHR0eSkpOworCQl0dHktPmxkaXNjLnJlY2VpdmVfYnVmKHR0eSwgc2VsX2J1ZmZlciArIHBhc3RlZCwgTlVMTCwgY291bnQpOworCQlwYXN0ZWQgKz0gY291bnQ7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZ2Yy0+cGFzdGVfd2FpdCwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCisJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRlOWQxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYwpAQCAtMCwwICsxLDgyNSBAQAorLyogZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jICovCisKKy8qICRJZDogc2VyX2EyMjMyLmMsdiAwLjQgMjAwMC8wMS8yNSAxMjowMDowMCBlaGFhc2UgRXhwICQgKi8KKworLyogTGludXggc2VyaWFsIGRyaXZlciBmb3IgdGhlIEFtaWdhIEEyMjMyIGJvYXJkICovCisKKy8qIFRoaXMgZHJpdmVyIGlzIE1BSU5UQUlORUQuIEJlZm9yZSBhcHBseWluZyBhbnkgY2hhbmdlcywgcGxlYXNlIGNvbnRhY3QKKyAqIHRoZSBhdXRob3IuCisgKi8KKworLyogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgRW52ZXIgSGFhc2UgICAgPGVoYWFzZUBpbmYuZnUtYmVybGluLmRlPgorICogICAgICAgICAgICAgICAgICAgYWxpYXMgVGhlIEEyMjMyIGRyaXZlciBwcm9qZWN0IDxBMjIzMkBnbXgubmV0PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRG9jdW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBkcml2ZXIgaXMgaW4gRVhQRVJJTUVOVEFMIHN0YXRlLiBUaGF0IG1lYW5zIEkgY291bGQgbm90IGZpbmQKKyAqIHNvbWVvbmUgd2l0aCBmaXZlIEEyMjMyIGJvYXJkcyB3aXRoIDM1IHBvcnRzIHJ1bm5pbmcgYXQgMTkyMDAgYnBzCisgKiBhdCB0aGUgc2FtZSB0aW1lIGFuZCB0ZXN0IHRoZSBtYWNoaW5lJ3MgYmVoYXZpb3VyLgorICogSG93ZXZlciwgSSBrbm93IHRoYXQgeW91IGNhbiBwZXJmb3JtYW5jZS10d2VhayB0aGlzIGRyaXZlciAoc2VlCisgKiB0aGUgc291cmNlIGNvZGUpLgorICogT25lIHRoaW5nIHRvIGNvbnNpZGVyIGlzIHRoZSB0aW1lIHRoaXMgZHJpdmVyIGNvbnN1bWVzIGR1cmluZyB0aGUKKyAqIEFtaWdhJ3MgdmVydGljYWwgYmxhbmsgaW50ZXJydXB0LiBFdmVyeXRoaW5nIHRoYXQgaXMgdG8gYmUgZG9uZQorICogX0lTIERPTkVfIHdoZW4gZW50ZXJpbmcgdGhlIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdCBoYW5kbGVyIG9mCisgKiB0aGlzIGRyaXZlci4KKyAqIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIG1vcmUgc2FuZSB0byBvbmx5IGRvIHRoZSBqb2IgZm9yIG9ubHkgT05FIGNhcmQKKyAqIGluc3RlYWQgb2YgQUxMIGNhcmRzIGF0IGEgdGltZTsgb3IsIG1vcmUgZ2VuZXJhbGx5LCB0byBoYW5kbGUgb25seQorICogU09NRSBwb3J0cyBpbnN0ZWFkIG9mIEFMTCBwb3J0cyBhdCBhIHRpbWUuCisgKiBIb3dldmVyLCBhcyBsb25nIGFzIG5vLW9uZSBydW5zIGludG8gcHJvYmxlbXMgSSBndWVzcyBJIHNob3VsZG4ndAorICogY2hhbmdlIHRoZSBkcml2ZXIgYXMgaXQgcnVucyBmaW5lIGZvciBtZSA6KSAuCisgKgorICogVmVyc2lvbiBoaXN0b3J5IG9mIHRoaXMgZmlsZToKKyAqIDAuNAlSZXNvbHZlZCBsaWNlbnNpbmcgaXNzdWVzLgorICogMC4zCUluY2x1c2lvbiBpbiB0aGUgTGludXgvbTY4ayB0cmVlLCBzbWFsbCBmaXhlcy4KKyAqIDAuMglBZGRlZCBkb2N1bWVudGF0aW9uLCBtaW5vciB0eXBvIGZpeGVzLgorICogMC4xCUluaXRpYWwgcmVsZWFzZS4KKyAqCisgKiBUTyBETzoKKyAqIC0JSGFuZGxlIGluY29taW5nIEJSRUFLIGV2ZW50cy4gSSBndWVzcyAiU3RldmVuczogQWR2YW5jZWQKKyAqCVByb2dyYW1taW5nIGluIHRoZSBVTklYKFIpIEVudmlyb25tZW50IiBpcyBhIGdvb2QgcmVmZXJlbmNlCisgKglvbiB3aGF0IGlzIHRvIGJlIGRvbmUuCisgKiAtCVdoZW4gaW5zdGFsbGluZyBhcyBhIG1vZHVsZSwgZG9uJ3Qgc2ltcGx5ICdwcmludGsnIHRleHQsIGJ1dAorICoJc2VuZCBpdCB0byB0aGUgVFRZIHVzZWQgYnkgdGhlIHVzZXIuCisgKgorICogVEhBTktTIFRPOgorICogLQlKdWtrYSBNYXJpbiAoNjVFQzAyIGNvZGUpLgorICogLQlUaGUgb3RoZXIgTmV0QlNEIGRldmVsb3BlcnMgb24gd2hvc2UgQTIyMzIgZHJpdmVyIEkgaGFkIGEKKyAqCXByZXR0eSBjbG9zZSBsb29rLiBIb3dldmVyLCBJIGRpZG4ndCBjb3B5IGFueSBjb2RlIHNvIGl0CisgKglpcyBva2F5IHRvIHB1dCBteSBjb2RlIHVuZGVyIHRoZSBHUEwgYW5kIGluY2x1ZGUgaXQgaW50bworICoJTGludXguCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgRG9jdW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEVuYWJsZXMgZXhwZXJpbWVudGFsIDExNTIwMCAobm9ybWFsKSAyMzA0MDAgKHR1cmJvKSBiYXVkIHJhdGUuCisgKiBUaGUgQTIyMzIgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgaXQgY2FuIG9ubHkgb3BlcmF0ZSBhdCBzcGVlZHMgdXAgdG8KKyAqIDE5MjAwIGJpdHMgcGVyIHNlY29uZCwgYW5kIEkgd2FzIG5vdCBhYmxlIHRvIHNlbmQgYSBmaWxlIHZpYQorICogInN6Ii8icnoiIGFuZCBhIG51bGwtbW9kZW0gY2FibGUgZnJvbSBvbmUgQTIyMzIgcG9ydCB0byBhbm90aGVyCisgKiBhdCAxMTUyMDAgYml0cyBwZXIgc2Vjb25kLgorICogSG93ZXZlciwgdGhpcyBtaWdodCB3b3JrIGZvciB5b3UuCisgKi8KKyN1bmRlZiBBMjIzMl9TUEVFREhBQ0sKKy8qCisgKiBEZWZhdWx0IGlzIG5vdCB0byB1c2UgUlRTL0NUUyBzbyB5b3UgY291bGQgYmUgdGFsa2VkIHRvIGRlYXRoLgorICovCisjZGVmaW5lIEEyMjMyX1NVUFBSRVNTX1JUU0NUU19XQVJOSU5HCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKyNpbmNsdWRlICJzZXJfYTIyMzIuaCIKKyNpbmNsdWRlICJzZXJfYTIyMzJmdy5oIgorLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IGEyMjMyX3ZibF9pbnRlcihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworLyogSW5pdGlhbGl6ZSB0aGUgcG9ydCBzdHJ1Y3R1cmVzICovCitzdGF0aWMgdm9pZCBhMjIzMl9pbml0X3BvcnRzdHJ1Y3RzKHZvaWQpOworLyogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgVFRZIGRyaXZlcnMuICovCisvKiByZXR1cm5zIDAgSUZGIHN1Y2Nlc3NmdWwgKi8KK3N0YXRpYyBpbnQgYTIyMzJfaW5pdF9kcml2ZXJzKHZvaWQpOyAKKworLyogQkVHSU4gR0VORVJJQ19TRVJJQUwgUFJPVE9UWVBFUyAqLworc3RhdGljIHZvaWQgYTIyMzJfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBhMjIzMl9lbmFibGVfdHhfaW50ZXJydXB0cyh2b2lkICpwdHIpOworc3RhdGljIHZvaWQgYTIyMzJfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBhMjIzMl9lbmFibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpOworc3RhdGljIGludCAgYTIyMzJfZ2V0X0NEKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBhMjIzMl9zaHV0ZG93bl9wb3J0KHZvaWQgKnB0cik7CitzdGF0aWMgaW50ICBhMjIzMl9zZXRfcmVhbF90ZXJtaW9zKHZvaWQgKnB0cik7CitzdGF0aWMgaW50ICBhMjIzMl9jaGFyc19pbl9idWZmZXIodm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIGEyMjMyX2Nsb3NlKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBhMjIzMl9odW5ndXAodm9pZCAqcHRyKTsKKy8qIHN0YXRpYyB2b2lkIGEyMjMyX2dldHNlcmlhbCAodm9pZCAqcHRyLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc3ApOyAqLworLyogRU5EIEdFTkVSSUNfU0VSSUFMIFBST1RPVFlQRVMgKi8KKworLyogRnVuY3Rpb25zIHRoYXQgdGhlIFRUWSBkcml2ZXIgc3RydWN0IGV4cGVjdHMgKi8KK3N0YXRpYyBpbnQgIGEyMjMyX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGEyMjMyX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgYTIyMzJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgIGEyMjMyX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcmZhY2UgZnJvbSBnZW5lcmljX3NlcmlhbC5jIGJhY2sgaGVyZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IHJlYWxfZHJpdmVyIGEyMjMyX3JlYWxfZHJpdmVyID0geworICAgICAgICBhMjIzMl9kaXNhYmxlX3R4X2ludGVycnVwdHMsCisgICAgICAgIGEyMjMyX2VuYWJsZV90eF9pbnRlcnJ1cHRzLAorICAgICAgICBhMjIzMl9kaXNhYmxlX3J4X2ludGVycnVwdHMsCisgICAgICAgIGEyMjMyX2VuYWJsZV9yeF9pbnRlcnJ1cHRzLAorICAgICAgICBhMjIzMl9nZXRfQ0QsCisgICAgICAgIGEyMjMyX3NodXRkb3duX3BvcnQsCisgICAgICAgIGEyMjMyX3NldF9yZWFsX3Rlcm1pb3MsCisgICAgICAgIGEyMjMyX2NoYXJzX2luX2J1ZmZlciwKKyAgICAgICAgYTIyMzJfY2xvc2UsCisgICAgICAgIGEyMjMyX2h1bmd1cCwKKwlOVUxMCS8qIGEyMjMyX2dldHNlcmlhbCAqLworfTsKKworc3RhdGljIHZvaWQgKmEyMjMyX2RyaXZlcl9JRCA9ICZhMjIzMl9kcml2ZXJfSUQ7IC8vIFNvbWUgbWVtb3J5IGFkZHJlc3MgV0Ugb3duLgorCisvKiBQb3J0cyBzdHJ1Y3RzICovCitzdGF0aWMgc3RydWN0IGEyMjMyX3BvcnQgYTIyMzJfcG9ydHNbTUFYX0EyMjMyX0JPQVJEUypOVU1MSU5FU107CisKKy8qIFRUWSBkcml2ZXIgc3RydWN0cyAqLworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICphMjIzMl9kcml2ZXI7CisKKy8qIG5yIG9mIGNhcmRzIGNvbXBsZXRlbHkgKGFsbCBwb3J0cykgYW5kIGNvcnJlY3RseSBjb25maWd1cmVkICovCitzdGF0aWMgaW50IG5yX2EyMjMyOyAKKworLyogem9ycm9fZGV2IHN0cnVjdHMgZm9yIHRoZSBBMjIzMidzICovCitzdGF0aWMgc3RydWN0IHpvcnJvX2RldiAqemRfYTIyMzJbTUFYX0EyMjMyX0JPQVJEU107IAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBHbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqLworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbmxpbmUgdm9sYXRpbGUgc3RydWN0IGEyMjMybWVtb3J5ICphMjIzMm1lbSh1bnNpZ25lZCBpbnQgYm9hcmQpCit7CisJcmV0dXJuICh2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKilaVFdPX1ZBRERSKHpkX2EyMjMyW2JvYXJkXS0+cmVzb3VyY2Uuc3RhcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvbGF0aWxlIHN0cnVjdCBhMjIzMnN0YXR1cyAqYTIyMzJzdGF0KHVuc2lnbmVkIGludCBib2FyZCwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IHBvcnRvbmJvYXJkKQoreworCXZvbGF0aWxlIHN0cnVjdCBhMjIzMm1lbW9yeSAqbWVtID0gYTIyMzJtZW0oYm9hcmQpOworCXJldHVybiAmKG1lbS0+U3RhdHVzW3BvcnRvbmJvYXJkXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhMjIzMl9yZWNlaXZlX2NoYXIoc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQsIGludCBjaCwgaW50IGVycikKK3sKKy8qIAlNb3N0bHkgc3RvbGVuIGZyb20gb3RoZXIgZHJpdmVycy4KKwlNYXliZSBvbmUgY291bGQgaW1wbGVtZW50IGEgbW9yZSBlZmZpY2llbnQgdmVyc2lvbiBieSBub3Qgb25seQorCXRyYW5zZmVycmluZyBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4KKyovCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmdzLnR0eTsKKworCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkJcmV0dXJuOworCisJdHR5LT5mbGlwLmNvdW50Kys7CisKKyNpZiAwCisJc3dpdGNoKGVycikgeworCWNhc2UgVFRZX0JSRUFLOgorCQlicmVhazsKKwljYXNlIFRUWV9QQVJJVFk6CisJCWJyZWFrOworCWNhc2UgVFRZX09WRVJSVU46CisJCWJyZWFrOworCWNhc2UgVFRZX0ZSQU1FOgorCQlicmVhazsKKwl9CisjZW5kaWYKKworCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBlcnI7CisJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogQkVHSU4gT0YgUkVBTF9EUklWRVIgRlVOQ1RJT05TICoqKi8KKworc3RhdGljIHZvaWQgYTIyMzJfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydDsKKwl2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJzdGF0dXMgKnN0YXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgCisJcG9ydCA9IHB0cjsKKwlzdGF0ID0gYTIyMzJzdGF0KHBvcnQtPndoaWNoX2EyMjMyLCBwb3J0LT53aGljaF9wb3J0X29uX2EyMjMyKTsKKwlzdGF0LT5PdXREaXNhYmxlID0gLTE7CisKKwkvKiBEb2VzIHRoaXMgaGVyZSByZWFsbHkgaGF2ZSB0byBiZT8gKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfZW5hYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0OworCXZvbGF0aWxlIHN0cnVjdCBhMjIzMnN0YXR1cyAqc3RhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcG9ydCA9IHB0cjsKKwlzdGF0ID0gYTIyMzJzdGF0KHBvcnQtPndoaWNoX2EyMjMyLCBwb3J0LT53aGljaF9wb3J0X29uX2EyMjMyKTsKKwlzdGF0LT5PdXREaXNhYmxlID0gMDsKKworCS8qIERvZXMgdGhpcyBoZXJlIHJlYWxseSBoYXZlIHRvIGJlPyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwb3J0LT5ncy5mbGFncyB8PSBHU19UWF9JTlRFTjsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGEyMjMyX2Rpc2FibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpCit7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7CisJcG9ydCA9IHB0cjsKKwlwb3J0LT5kaXNhYmxlX3J4ID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGEyMjMyX2VuYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydDsKKwlwb3J0ID0gcHRyOworCXBvcnQtPmRpc2FibGVfcnggPSAwOworfQorCitzdGF0aWMgaW50ICBhMjIzMl9nZXRfQ0Qodm9pZCAqcHRyKQoreworCXJldHVybiAoKHN0cnVjdCBhMjIzMl9wb3J0ICopIHB0ciktPmNkX3N0YXR1czsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfc2h1dGRvd25fcG9ydCh2b2lkICpwdHIpCit7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7CisJdm9sYXRpbGUgc3RydWN0IGEyMjMyc3RhdHVzICpzdGF0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwb3J0ID0gcHRyOworCXN0YXQgPSBhMjIzMnN0YXQocG9ydC0+d2hpY2hfYTIyMzIsIHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX0FDVElWRTsKKwkKKwlpZiAocG9ydC0+Z3MudHR5ICYmIHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisJCS8qIFNldCBEVFIgYW5kIFJUUyB0byBMb3csIGZsdXNoIG91dHB1dC4KKwkJICAgVGhlIE5ldEJTRCBkcml2ZXIgIm1zYy5jIiBkb2VzIGl0IHRoaXMgd2F5LiAqLworCQlzdGF0LT5Db21tYW5kID0gKAkoc3RhdC0+Q29tbWFuZCAmIH5BMjIzMkNNRF9DTWFzaykgfCAKKwkJCQkJQTIyMzJDTURfQ2xvc2UgKTsKKwkJc3RhdC0+T3V0Rmx1c2ggPSAtMTsKKwkJc3RhdC0+U2V0dXAgPSAtMTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCisJLyogQWZ0ZXIgYW5hbHl6aW5nIGNvbnRyb2wgZmxvdywgSSB0aGluayBhMjIzMl9zaHV0ZG93bl9wb3J0CisJCWlzIGFjdHVhbGx5IHRoZSBsYXN0IGNhbGwgZnJvbSB0aGUgc3lzdGVtIHdoZW4gYXQgYXBwbGljYXRpb24KKwkJbGV2ZWwgc29tZW9uZSBpc3N1ZXMgYSAiZWNobyBIZWxsbyA+Pi9kZXYvdHR5WTAiLgorCQlUaGVyZWZvcmUgSSB0aGluayB0aGUgTU9EX0RFQ19VU0VfQ09VTlQgc2hvdWxkIGJlIGhlcmUgYW5kCisJCW5vdCBpbiAiYTIyMzJfY2xvc2UoKSIuIFNlZSB0aGUgY29tbWVudCBpbiAic3guYyIsIHRvby4KKwkJSWYgeW91IHJ1biBpbnRvIHByb2JsZW1zLCBjb21waWxlIHRoaXMgZHJpdmVyIGludG8gdGhlCisJCWtlcm5lbCBpbnN0ZWFkIG9mIGNvbXBpbGluZyBpdCBhcyBhIG1vZHVsZS4gKi8KK30KKworc3RhdGljIGludCAgYTIyMzJfc2V0X3JlYWxfdGVybWlvcyh2b2lkICpwdHIpCit7CisJdW5zaWduZWQgaW50IGNmbGFnLCBiYXVkLCBjaHNpemUsIHN0b3BiLCBwYXJpdHksIHNvZnRmbG93OworCWludCByYXRlOworCWludCBhMjIzMl9wYXJhbSwgYTIyMzJfY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQgPSBwdHI7CisJdm9sYXRpbGUgc3RydWN0IGEyMjMyc3RhdHVzICpzdGF0dXM7CisJdm9sYXRpbGUgc3RydWN0IGEyMjMybWVtb3J5ICptZW07CisKKwlpZiAoIXBvcnQtPmdzLnR0eSB8fCAhcG9ydC0+Z3MudHR5LT50ZXJtaW9zKSByZXR1cm4gMDsKKworCXN0YXR1cyA9IGEyMjMyc3RhdChwb3J0LT53aGljaF9hMjIzMiwgcG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMik7CisJbWVtID0gYTIyMzJtZW0ocG9ydC0+d2hpY2hfYTIyMzIpOworCQorCWEyMjMyX3BhcmFtID0gYTIyMzJfY21kID0gMDsKKworCS8vIGdldCBiYXVkIHJhdGUKKwliYXVkID0gcG9ydC0+Z3MuYmF1ZDsKKwlpZiAoYmF1ZCA9PSAwKSB7CisJCS8qIHNwZWVkID09IDAgLT4gZHJvcCBEVFIsIGRvIG5vdGhpbmcgZWxzZSAqLworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCS8vIENsZWFyIERUUiAoYW5kIFJUUy4uLiBtaGhoKS4KKwkJc3RhdHVzLT5Db21tYW5kID0gKAkoc3RhdHVzLT5Db21tYW5kICYgfkEyMjMyQ01EX0NNYXNrKSB8CisJCQkJCUEyMjMyQ01EX0Nsb3NlICk7CisJCXN0YXR1cy0+T3V0Rmx1c2ggPSAtMTsKKwkJc3RhdHVzLT5TZXR1cCA9IC0xOworCQkKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJCisJcmF0ZSA9IEEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTDsKKwlmb3IgKGk9MDsgaSA8IEEyMjMyX0JBVURfVEFCTEVfTlVNX1JBVEVTICogMzsgaSArPSAzKXsKKwkJaWYgKGEyMjMyX2JhdWRfdGFibGVbaV0gPT0gYmF1ZCl7CisJCQlpZiAobWVtLT5Db21tb24uQ3J5c3RhbCA9PSBBMjIzMl9UVVJCTykgcmF0ZSA9IGEyMjMyX2JhdWRfdGFibGVbaSsyXTsKKwkJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlID0gYTIyMzJfYmF1ZF90YWJsZVtpKzFdOworCQl9CisJfQorCWlmIChyYXRlID09IEEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCl7CisJCXByaW50aygiYTIyMzI6IEJvYXJkICVkIFBvcnQgJWQgdW5zdXBwb3J0ZWQgYmF1ZCByYXRlOiAlZCBiYXVkLiBVc2luZyBhbm90aGVyLlxuIixwb3J0LT53aGljaF9hMjIzMixwb3J0LT53aGljaF9wb3J0X29uX2EyMjMyLGJhdWQpOworCQkvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgYm90aCAodHVyYm8gb3Igbm9ybWFsKSBDcnlzdGFsIHZlcnNpb25zLgorCQlyYXRlID0gQTIyMzJQQVJBTV9COTYwMDsKKwl9CisJYTIyMzJfcGFyYW0gfD0gcmF0ZTsKKworCWNmbGFnICA9IHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8vIGdldCBjaGFyYWN0ZXIgc2l6ZQorCWNoc2l6ZSA9IGNmbGFnICYgQ1NJWkU7CisJc3dpdGNoIChjaHNpemUpeworCQljYXNlIENTODogCWEyMjMyX3BhcmFtIHw9IEEyMjMyUEFSQU1fOEJpdDsgYnJlYWs7CisJCWNhc2UgQ1M3OiAJYTIyMzJfcGFyYW0gfD0gQTIyMzJQQVJBTV83Qml0OyBicmVhazsKKwkJY2FzZSBDUzY6IAlhMjIzMl9wYXJhbSB8PSBBMjIzMlBBUkFNXzZCaXQ7IGJyZWFrOworCQljYXNlIENTNTogCWEyMjMyX3BhcmFtIHw9IEEyMjMyUEFSQU1fNUJpdDsgYnJlYWs7CisJCWRlZmF1bHQ6CXByaW50aygiYTIyMzI6IEJvYXJkICVkIFBvcnQgJWQgdW5zdXBwb3J0ZWQgY2hhcmFjdGVyIHNpemU6ICVkLiBVc2luZyA4IGRhdGEgYml0cy5cbiIsCisJCQkJCXBvcnQtPndoaWNoX2EyMjMyLHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIsY2hzaXplKTsKKwkJCQlhMjIzMl9wYXJhbSB8PSBBMjIzMlBBUkFNXzhCaXQ7IGJyZWFrOworCX0KKworCS8vIGdldCBudW1iZXIgb2Ygc3RvcCBiaXRzCisJc3RvcGIgID0gY2ZsYWcgJiBDU1RPUEI7CisJaWYgKHN0b3BiKXsgLy8gdHdvIHN0b3AgYml0cyBpbnN0ZWFkIG9mIG9uZQorCQlwcmludGsoImEyMjMyOiBCb2FyZCAlZCBQb3J0ICVkIDIgc3RvcCBiaXRzIHVuc3VwcG9ydGVkLiBVc2luZyAxIHN0b3AgYml0LlxuIiwKKwkJCXBvcnQtPndoaWNoX2EyMjMyLHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIpOworCX0KKworCS8vIFdhcm4gaWYgUlRTL0NUUyBub3Qgd2FudGVkCisJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSl7CisjaWZuZGVmIEEyMjMyX1NVUFBSRVNTX1JUU0NUU19XQVJOSU5HCisJCXByaW50aygiYTIyMzI6IEJvYXJkICVkIFBvcnQgJWQgY2Fubm90IHN3aXRjaCBvZmYgZmlybXdhcmUtaW1wbGVtZW50ZWQgUlRTL0NUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wuXG4iLAorCQkJcG9ydC0+d2hpY2hfYTIyMzIscG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMik7CisjZW5kaWYKKwl9CisKKwkvKglJIHRoaW5rIHRoaXMgaXMgY29ycmVjdC4KKwkJSG93ZXZlciwgSVhPRkYgbWVhbnMgX2lucHV0XyBmbG93IGNvbnRyb2wgYW5kIEkgd29uZGVyCisJCWlmIG9uZSBzaG91bGQgY2FyZSBhYm91dCBJWE9OIF9vdXRwdXRfIGZsb3cgY29udHJvbCwKKwkJdG9vLiBJZiB0aGlzIG1ha2VzIHByb2JsZW1zLCBvbmUgc2hvdWxkIHR1cm4gdGhlIEEyMjMyCisJCWZpcm13YXJlIFhPTi9YT0ZGICJTb2Z0RmxvdyIgZmxvdyBjb250cm9sIG9mZiBhbmQgdXNlCisJCXRoZSBjb252ZW50aW9uYWwgd2F5IG9mIGluc2VydGluZyBTVEFSVC9TVE9QIGNoYXJhY3RlcnMKKwkJYnkgaGFuZCBpbiB0aHJvdHRsZSgpL3VudGhyb3R0bGUoKS4KKwkqLworCXNvZnRmbG93ID0gISEoIHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYT0ZGICk7CisKKwkvLyBnZXQgUGFyaXR5IChFbmFibGVkL0Rpc2FibGVkPyBJZiBFbmFibGVkLCBPZGQgb3IgRXZlbj8pCisJcGFyaXR5ID0gY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKTsKKwlpZiAocGFyaXR5ICYgUEFSRU5CKXsKKwkJaWYgKHBhcml0eSAmIFBBUk9ERCl7CisJCQlhMjIzMl9jbWQgfD0gQTIyMzJDTURfT2RkUGFyaXR5OworCQl9CisJCWVsc2V7CisJCQlhMjIzMl9jbWQgfD0gQTIyMzJDTURfRXZlblBhcml0eTsKKwkJfQorCX0KKwllbHNlIGEyMjMyX2NtZCB8PSBBMjIzMkNNRF9Ob1Bhcml0eTsKKworCisJLyoJSG1tLiBNYXliZSBhbiBvd24gYTIyMzJfcG9ydCBzdHJ1Y3R1cmUKKwkJbWVtYmVyIHdvdWxkIGJlIGNsZWFuZXI/CSovCisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlwb3J0LT5ncy5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlwb3J0LT5ncy5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworCisJLyogTm93IHdlIGhhdmUgYWxsIHBhcmFtZXRlcnMgYW5kIGNhbiBnbyB0byBzZXQgdGhlbTogKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdGF0dXMtPlBhcmFtID0gYTIyMzJfcGFyYW0gfCBBMjIzMlBBUkFNX1JjdkJhdWQ7CisJc3RhdHVzLT5Db21tYW5kID0gYTIyMzJfY21kIHwgQTIyMzJDTURfT3BlbiB8ICBBMjIzMkNNRF9FbmFibGU7CisJc3RhdHVzLT5Tb2Z0RmxvdyA9IHNvZnRmbG93OworCXN0YXR1cy0+T3V0RGlzYWJsZSA9IDA7CisJc3RhdHVzLT5TZXR1cCA9IC0xOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50ICBhMjIzMl9jaGFyc19pbl9idWZmZXIodm9pZCAqcHRyKQoreworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0OworCXZvbGF0aWxlIHN0cnVjdCBhMjIzMnN0YXR1cyAqc3RhdHVzOyAKKwl1bnNpZ25lZCBjaGFyIHJldDsgLyogd2UgbmVlZCBtb2R1bG8tMjU2IGFyaXRobWV0aWNzICovCisJcG9ydCA9IHB0cjsKKwlzdGF0dXMgPSBhMjIzMnN0YXQocG9ydC0+d2hpY2hfYTIyMzIsIHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIpOworI2lmIEEyMjMyX0lPQlVGTEVOICE9IDI1NgorI2Vycm9yICJSZS1JbXBsZW1lbnQgYTIyMzJfY2hhcnNfaW5fYnVmZmVyKCkhIgorI2VuZGlmCisJcmV0ID0gKHN0YXR1cy0+T3V0SGVhZCAtIHN0YXR1cy0+T3V0VGFpbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfY2xvc2Uodm9pZCAqcHRyKQoreworCWEyMjMyX2Rpc2FibGVfdHhfaW50ZXJydXB0cyhwdHIpOworCWEyMjMyX2Rpc2FibGVfcnhfaW50ZXJydXB0cyhwdHIpOworCS8qIHNlZSB0aGUgY29tbWVudCBpbiBhMjIzMl9zaHV0ZG93bl9wb3J0IGFib3ZlLiAqLworfQorCitzdGF0aWMgdm9pZCBhMjIzMl9odW5ndXAodm9pZCAqcHRyKQoreworCWEyMjMyX2Nsb3NlKHB0cik7Cit9CisvKioqIEVORCAgIE9GIFJFQUxfRFJJVkVSIEZVTkNUSU9OUyAqKiovCisKKy8qKiogQkVHSU4gIEZVTkNUSU9OUyBFWFBFQ1RFRCBCWSBUVFkgRFJJVkVSIFNUUlVDVFMgKioqLworc3RhdGljIGludCBhMjIzMl9pb2N0bCgJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgdm9pZCBhMjIzMl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworLyogVGhyb3R0bGU6IFN5c3RlbSBjYW5ub3QgdGFrZSBhbm90aGVyIGNoYXJzOiBEcm9wIFJUUyBvcgorICAgICAgICAgICAgIHNlbmQgdGhlIFNUT1AgY2hhciBvciB3aGF0ZXZlci4KKyAgIFRoZSBBMjIzMiBmaXJtd2FyZSBkb2VzIFJUUy9DVFMgYW55d2F5LCBhbmQgWE9OL1hPRkYKKyAgIGlmIHN3aXRjaGVkIG9uLiBTbyB0aGUgb25seSB0aGluZyB3ZSBjYW4gZG8gYXQgdGhpcworICAgbGF5ZXIgaGVyZSBpcyBub3QgdGFraW5nIGFueSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUKKyAgIEEyMjMyIGJ1ZmZlciBhbnkgbW9yZS4gKi8KKwlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgYTIyMzJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXBvcnQtPnRocm90dGxlX2lucHV0ID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGEyMjMyX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKy8qIFVudGhyb3R0bGU6IGR1YWwgdG8gInRocm90dGxlKCkiIGFib3ZlLiAqLworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0ID0gKHN0cnVjdCBhMjIzMl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcG9ydC0+dGhyb3R0bGVfaW5wdXQgPSAwOworfQorCitzdGF0aWMgaW50ICBhMjIzMl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisvKiBNb3JlIG9yIGxlc3Mgc3RvbGVuIGZyb20gb3RoZXIgZHJpdmVycy4gKi8KKwlpbnQgbGluZTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0OworCisJbGluZSA9IHR0eS0+aW5kZXg7CisJcG9ydCA9ICZhMjIzMl9wb3J0c1tsaW5lXTsKKwkKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKKwlwb3J0LT5ncy50dHkgPSB0dHk7CisJcG9ydC0+Z3MuY291bnQrKzsKKwlyZXR2YWwgPSBnc19pbml0X3BvcnQoJnBvcnQtPmdzKTsKKwlpZiAocmV0dmFsKSB7CisJCXBvcnQtPmdzLmNvdW50LS07CisJCXJldHVybiByZXR2YWw7CisJfQorCXBvcnQtPmdzLmZsYWdzIHw9IEdTX0FDVElWRTsKKwlyZXR2YWwgPSBnc19ibG9ja190aWxfcmVhZHkocG9ydCwgZmlscCk7CisKKwlpZiAocmV0dmFsKSB7CisJCXBvcnQtPmdzLmNvdW50LS07CisJCXJldHVybiByZXR2YWw7CisJfQorCisJYTIyMzJfZW5hYmxlX3J4X2ludGVycnVwdHMocG9ydCk7CisJCisJcmV0dXJuIDA7Cit9CisvKioqIEVORCBPRiBGVU5DVElPTlMgRVhQRUNURUQgQlkgVFRZIERSSVZFUiBTVFJVQ1RTICoqKi8KKworc3RhdGljIGlycXJldHVybl90IGEyMjMyX3ZibF9pbnRlcihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisjaWYgQTIyMzJfSU9CVUZMRU4gIT0gMjU2CisjZXJyb3IgIlJlLUltcGxlbWVudCBhMjIzMl92YmxfaW50ZXIoKSEiCisjZW5kaWYKKworc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7Cit2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKm1lbTsKK3ZvbGF0aWxlIHN0cnVjdCBhMjIzMnN0YXR1cyAqc3RhdHVzOwordW5zaWduZWQgY2hhciBuZXdoZWFkOwordW5zaWduZWQgY2hhciBidWZwb3M7IC8qIE11c3QgYmUgdW5zaWduZWQgY2hhci4gV2UgbmVlZCB0aGUgbW9kdWxvLTI1NiBhcml0aG1ldGljcyAqLwordW5zaWduZWQgY2hhciBuY2QsIG9jZCwgY2NkOyAvKiBuYW1lcyBjb25zaXN0ZW50IHdpdGggdGhlIE5ldEJTRCBkcml2ZXIgKi8KK3ZvbGF0aWxlIHVfY2hhciAqaWJ1ZiwgKmNidWYsICpvYnVmOworaW50IGNoLCBlcnIsIG4sIHA7CisJZm9yIChuID0gMDsgbiA8IG5yX2EyMjMyOyBuKyspewkJLyogZm9yIGV2ZXJ5IGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgQTIyMzIgYm9hcmQgKi8KKwkJbWVtID0gYTIyMzJtZW0obik7CisJCWZvciAocCA9IDA7IHAgPCBOVU1MSU5FUzsgcCsrKXsJLyogZm9yIGV2ZXJ5IHBvcnQgb24gdGhpcyBib2FyZCAqLworCQkJZXJyID0gMDsKKwkJCXBvcnQgPSAmYTIyMzJfcG9ydHNbbipOVU1MSU5FUytwXTsKKwkJCWlmICggcG9ydC0+Z3MuZmxhZ3MgJiBHU19BQ1RJVkUgKXsgLyogaWYgdGhlIHBvcnQgaXMgdXNlZCAqLworCisJCQkJc3RhdHVzID0gYTIyMzJzdGF0KG4scCk7CisKKwkJCQlpZiAoIXBvcnQtPmRpc2FibGVfcnggJiYgIXBvcnQtPnRocm90dGxlX2lucHV0KXsgLyogSWYgaW5wdXQgaXMgbm90IGRpc2FibGVkICovCisJCQkJCW5ld2hlYWQgPSBzdGF0dXMtPkluSGVhZDsgICAgICAgICAgICAgICAvKiA2NUVDMDIgd3JpdGUgcG9pbnRlciAqLworCQkJCQlidWZwb3MgPSBzdGF0dXMtPkluVGFpbDsKKworCQkJCQkvKiBjaGVjayBmb3IgaW5wdXQgZm9yIHRoaXMgcG9ydCAqLworCQkJCQlpZiAobmV3aGVhZCAhPSBidWZwb3MpIHsKKwkJCQkJCS8qIGJ1ZmZlciBmb3IgaW5wdXQgY2hhcnMvZXZlbnRzICovCisJCQkJCQlpYnVmID0gbWVtLT5JbkJ1ZltwXTsKKyAKKwkJCQkJCS8qIGRhdGEgdHlwZXMgb2YgYnl0ZXMgaW4gaWJ1ZiAqLworCQkJCQkJY2J1ZiA9IG1lbS0+SW5DdGxbcF07CisgCisJCQkJCQkvKiBkbyBmb3IgYWxsIGNoYXJzICovCisJCQkJCQl3aGlsZSAoYnVmcG9zICE9IG5ld2hlYWQpIHsKKwkJCQkJCQkvKiB3aGljaCB0eXBlIG9mIGlucHV0IGRhdGE/ICovCisJCQkJCQkJc3dpdGNoIChjYnVmW2J1ZnBvc10pIHsKKwkJCQkJCQkJLyogc3dpdGNoIG9uIGlucHV0IGV2ZW50IChDRCwgQlJFQUssIGV0Yy4pICovCisJCQkJCQkJY2FzZSBBMjIzMklOQ1RMX0VWRU5UOgorCQkJCQkJCQlzd2l0Y2ggKGlidWZbYnVmcG9zKytdKSB7CisJCQkJCQkJCWNhc2UgQTIyMzJFVkVOVF9CcmVhazoKKwkJCQkJCQkJCS8qIFRPRE86IEhhbmRsZSBCUkVBSyBzaWduYWwgKi8KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJLyoJQTIyMzJFVkVOVF9DYXJyaWVyT24gYW5kIEEyMjMyRVZFTlRfQ2Fycmllck9mZiBhcmUKKwkJCQkJCQkJCQloYW5kbGVkIGluIGEgc2VwYXJhdGUgcXVldWUgYW5kIHNob3VsZCBub3Qgb2NjdXIgaGVyZS4gKi8KKwkJCQkJCQkJY2FzZSBBMjIzMkVWRU5UX1N5bmM6CisJCQkJCQkJCQlwcmludGsoIkEyMjMyOiA2NUVDMDIgc29mdHdhcmUgc2VudCBTWU5DIGV2ZW50LCBkb24ndCBrbm93IHdoYXQgdG8gZG8uIElnbm9yaW5nLiIpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQlwcmludGsoIkEyMjMyOiA2NUVDMDIgc29mdHdhcmUgYnJva2VuLCB1bmtub3duIGV2ZW50IHR5cGUgJWQgb2NjdXJyZWQuXG4iLGlidWZbYnVmcG9zLTFdKTsKKwkJCQkJCQkJfSAvKiBldmVudCB0eXBlIHN3aXRjaCAqLworCQkJCQkJCQlicmVhazsKKyAJCQkJCQkJY2FzZSBBMjIzMklOQ1RMX0NIQVI6CisJCQkJCQkJCS8qIFJlY2VpdmUgaW5jb21pbmcgY2hhciAqLworCQkJCQkJCQlhMjIzMl9yZWNlaXZlX2NoYXIocG9ydCwgaWJ1ZltidWZwb3NdLCBlcnIpOworCQkJCQkJCQlidWZwb3MrKzsKKwkJCQkJCQkJYnJlYWs7CisgCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXByaW50aygiQTIyMzI6IDY1RUMwMiBzb2Z0d2FyZSBicm9rZW4sIHVua25vd24gZGF0YSB0eXBlICVkIG9jY3VycmVkLlxuIixjYnVmW2J1ZnBvc10pOworCQkJCQkJCQlidWZwb3MrKzsKKwkJCQkJCQl9IC8qIHN3aXRjaCBvbiBpbnB1dCBkYXRhIHR5cGUgKi8KKwkJCQkJCX0gLyogd2hpbGUgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciAqLworCisJCQkJCQlzdGF0dXMtPkluVGFpbCA9IGJ1ZnBvczsgICAgICAgICAgICAvKiB0ZWxsIDY1RUMwMiB3aGF0IHdlJ3ZlIHJlYWQgKi8KKwkJCQkJCQorCQkJCQl9IC8qIGlmIHRoZXJlIHdhcyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJfSAvKiBJZiBpbnB1dCBpcyBub3QgZGlzYWJsZWQgKi8KKworCQkJCS8qIE5vdyBjaGVjayBpZiB0aGVyZSdzIHNvbWV0aGluZyB0byBvdXRwdXQgKi8KKwkJCQlvYnVmID0gbWVtLT5PdXRCdWZbcF07CisJCQkJYnVmcG9zID0gc3RhdHVzLT5PdXRIZWFkOworCQkJCXdoaWxlICggKHBvcnQtPmdzLnhtaXRfY250ID4gMCkJCSYmCisJCQkJCSghcG9ydC0+Z3MudHR5LT5zdG9wcGVkKQkmJgorCQkJCQkoIXBvcnQtPmdzLnR0eS0+aHdfc3RvcHBlZCkgKXsJLyogV2hpbGUgdGhlcmUgYXJlIGNoYXJzIHRvIHRyYW5zbWl0ICovCisJCQkJCWlmICgoKGJ1ZnBvcysxKSAmIEEyMjMyX0lPQlVGTEVOTUFTSykgIT0gc3RhdHVzLT5PdXRUYWlsKSB7IC8qIElmIHRoZSBBMjIzMiBidWZmZXIgaXMgbm90IGZ1bGwgKi8KKwkJCQkJCWNoID0gcG9ydC0+Z3MueG1pdF9idWZbcG9ydC0+Z3MueG1pdF90YWlsXTsJCQkJCS8qIGdldCB0aGUgbmV4dCBjaGFyIHRvIHRyYW5zbWl0ICovCisJCQkJCQlwb3J0LT5ncy54bWl0X3RhaWwgPSAocG9ydC0+Z3MueG1pdF90YWlsKzEpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7IC8qIG1vZHVsby1hZGRpdGlvbiBmb3IgdGhlIGdzLnhtaXRfYnVmIHJpbmctYnVmZmVyICovCisJCQkJCQlvYnVmW2J1ZnBvcysrXSA9IGNoOwkJCQkJCQkJCQkJCQkJCQkvKiBwdXQgaXQgaW50byB0aGUgQTIyMzIgYnVmZmVyICovCisJCQkJCQlwb3J0LT5ncy54bWl0X2NudC0tOworCQkJCQl9CisJCQkJCWVsc2V7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIElmIEEyMjMyIHRoZSBidWZmZXIgaXMgZnVsbCAqLworCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiBzaW1wbHkgc3RvcCBmaWxsaW5nIGl0LiAqLworCQkJCQl9CQkJCQkJCQkJCQkJCQorCQkJCX0JCQkJCQorCQkJCXN0YXR1cy0+T3V0SGVhZCA9IGJ1ZnBvczsKKwkJCQkJCisJCQkJLyogV2FrZVVwIGlmIG91dHB1dCBidWZmZXIgcnVucyBsb3cgKi8KKwkJCQlpZiAoKHBvcnQtPmdzLnhtaXRfY250IDw9IHBvcnQtPmdzLndha2V1cF9jaGFycykgJiYgcG9ydC0+Z3MudHR5KSB7CisJCQkJCXR0eV93YWtldXAocG9ydC0+Z3MudHR5KTsKKwkJCQl9CisJCQl9IC8vIGlmIHRoZSBwb3J0IGlzIHVzZWQKKwkJfSAvLyBmb3IgZXZlcnkgcG9ydCBvbiB0aGUgYm9hcmQKKwkJCQorCQkvKiBOb3cgY2hlY2sgdGhlIENEIG1lc3NhZ2UgcXVldWUgKi8KKwkJbmV3aGVhZCA9IG1lbS0+Q29tbW9uLkNESGVhZDsKKwkJYnVmcG9zID0gbWVtLT5Db21tb24uQ0RUYWlsOworCQlpZiAobmV3aGVhZCAhPSBidWZwb3MpewkJCQkvKiBUaGVyZSBhcmUgQ0QgZXZlbnRzIGluIHF1ZXVlICovCisJCQlvY2QgPSBtZW0tPkNvbW1vbi5DRFN0YXR1czsgCQkvKiBnZXQgb2xkIHN0YXR1cyBiaXRzICovCisJCQl3aGlsZSAobmV3aGVhZCAhPSBidWZwb3MpewkJLyogcmVhZCBhbGwgZXZlbnRzICovCisJCQkJbmNkID0gbWVtLT5DREJ1ZltidWZwb3MrK107IAkvKiBnZXQgb25lIGV2ZW50ICovCisJCQkJY2NkID0gbmNkIF4gb2NkOyAJCS8qIG1hc2sgb2YgY2hhbmdlZCBsaW5lcyAqLworCQkJCW9jZCA9IG5jZDsgCQkJLyogc2F2ZSBuZXcgc3RhdHVzIGJpdHMgKi8KKwkJCQlmb3IocD0wOyBwIDwgTlVNTElORVM7IHArKyl7CS8qIGZvciBhbGwgcG9ydHMgKi8KKwkJCQkJaWYgKGNjZCAmIDEpewkJLyogdGhpcyBvbmUgY2hhbmdlZCAqLworCisJCQkJCQlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydCA9ICZhMjIzMl9wb3J0c1tuKjcrcF07CisJCQkJCQlwb3J0LT5jZF9zdGF0dXMgPSAhKG5jZCAmIDEpOyAvKiBuY2QmMSA8PT4gQ0QgaXMgbm93IG9mZiAqLworCisJCQkJCQlpZiAoIShwb3J0LT5ncy5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSkKKwkJCQkJCQk7CS8qIERvbid0IHJlcG9ydCBEQ0QgY2hhbmdlcyAqLworCQkJCQkJZWxzZSBpZiAocG9ydC0+Y2Rfc3RhdHVzKSB7IC8vIGlmIERDRCBvbjogRENEIHdlbnQgVVAhCisJCQkJCQkJCisJCQkJCQkJLyogQXJlIHdlIGJsb2NraW5nIGluIG9wZW4/Ki8KKwkJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmdzLm9wZW5fd2FpdCk7CisJCQkJCQl9CisJCQkJCQllbHNlIHsgLy8gaWYgRENEIG9mZjogRENEIHdlbnQgRE9XTiEKKwkJCQkJCQlpZiAocG9ydC0+Z3MudHR5KQorCQkJCQkJCQl0dHlfaGFuZ3VwIChwb3J0LT5ncy50dHkpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCX0gLy8gaWYgQ0QgY2hhbmdlZCBmb3IgdGhpcyBwb3J0CisJCQkJCWNjZCA+Pj0gMTsKKwkJCQkJbmNkID4+PSAxOwkJCQkJCQkJCS8qIFNoaWZ0IGJpdHMgZm9yIG5leHQgbGluZSAqLworCQkJCX0gLy8gZm9yIGV2ZXJ5IHBvcnQKKwkJCX0gLy8gd2hpbGUgQ0QgZXZlbnRzIGluIHF1ZXVlCisJCQltZW0tPkNvbW1vbi5DRFN0YXR1cyA9IG9jZDsgLyogc2F2ZSBuZXcgc3RhdHVzICovCisJCQltZW0tPkNvbW1vbi5DRFRhaWwgPSBidWZwb3M7IC8qIHJlbW92ZSBldmVudHMgKi8KKwkJfSAvLyBpZiBldmVudHMgaW4gQ0QgcXVldWUKKwkJCisJfSAvLyBmb3IgZXZlcnkgY29tcGxldGVseSBpbml0aWFsaXplZCBBMjIzMiBib2FyZAorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfaW5pdF9wb3J0c3RydWN0cyh2b2lkKQoreworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BMjIzMl9CT0FSRFMqTlVNTElORVM7IGkrKykgeworCQlwb3J0ID0gYTIyMzJfcG9ydHMgKyBpOworCQlwb3J0LT53aGljaF9hMjIzMiA9IGkvTlVNTElORVM7CisJCXBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIgPSBpJU5VTUxJTkVTOworCQlwb3J0LT5kaXNhYmxlX3J4ID0gcG9ydC0+dGhyb3R0bGVfaW5wdXQgPSBwb3J0LT5jZF9zdGF0dXMgPSAwOworCQlwb3J0LT5ncy5tYWdpYyA9IEEyMjMyX01BR0lDOworCQlwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaLzI7CisJCXBvcnQtPmdzLmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisJCXBvcnQtPmdzLnJkID0gJmEyMjMyX3JlYWxfZHJpdmVyOworI2lmZGVmIE5FV19XUklURV9MT0NLSU5HCisJCWluaXRfTVVURVgoJihwb3J0LT5ncy5wb3J0X3dyaXRlX3NlbSkpOworI2VuZGlmCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLmNsb3NlX3dhaXQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBhMjIzMl9vcHMgPSB7CisJLm9wZW4gPSBhMjIzMl9vcGVuLAorCS5jbG9zZSA9IGdzX2Nsb3NlLAorCS53cml0ZSA9IGdzX3dyaXRlLAorCS5wdXRfY2hhciA9IGdzX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGdzX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gZ3Nfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gZ3NfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBnc19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gYTIyMzJfaW9jdGwsCisJLnRocm90dGxlID0gYTIyMzJfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBhMjIzMl91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IGdzX3NldF90ZXJtaW9zLAorCS5zdG9wID0gZ3Nfc3RvcCwKKwkuc3RhcnQgPSBnc19zdGFydCwKKwkuaGFuZ3VwID0gZ3NfaGFuZ3VwLAorfTsKKworc3RhdGljIGludCBhMjIzMl9pbml0X2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlhMjIzMl9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE5VTUxJTkVTICogbnJfYTIyMzIpOworCWlmICghYTIyMzJfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhMjIzMl9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJYTIyMzJfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJjb21tb2RvcmVfYTIyMzIiOworCWEyMjMyX2RyaXZlci0+bmFtZSA9ICJ0dHlZIjsKKwlhMjIzMl9kcml2ZXItPm1ham9yID0gQTIyMzJfTk9STUFMX01BSk9SOworCWEyMjMyX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJYTIyMzJfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCWEyMjMyX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCWEyMjMyX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJYTIyMzJfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGEyMjMyX2RyaXZlciwgJmEyMjMyX29wcyk7CisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYTIyMzJfZHJpdmVyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBMjIzMjogQ291bGRuJ3QgcmVnaXN0ZXIgQTIyMzIgZHJpdmVyLCBlcnJvciA9ICVkXG4iLAorCQkgICAgICAgZXJyb3IpOworCQlwdXRfdHR5X2RyaXZlcihhMjIzMl9kcml2ZXIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGEyMjMyYm9hcmRfaW5pdCh2b2lkKQoreworCXN0cnVjdCB6b3Jyb19kZXYgKno7CisKKwl1bnNpZ25lZCBpbnQgYm9hcmRhZGRyOworCWludCBiY291bnQ7CisJc2hvcnQgc3RhcnQ7CisJdV9jaGFyICpmcm9tOworCXZvbGF0aWxlIHVfY2hhciAqdG87CisJdm9sYXRpbGUgc3RydWN0IGEyMjMybWVtb3J5ICptZW07CisKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIC1FTk9ERVY7CS8qIFRoaXMgZHJpdmVyIGlzIG5vdCBTTVAgYXdhcmUuIElzIHRoZXJlIGFuIFNNUCBab3Jyb0lJLWJ1cy1tYWNoaW5lPyAqLworI2VuZGlmCisKKwlpZiAoIU1BQ0hfSVNfQU1JR0EpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcmludGsoIkNvbW1vZG9yZSBBMjIzMiBkcml2ZXIgaW5pdGlhbGl6aW5nLlxuIik7IC8qIFNheSB0aGF0IHdlJ3JlIGFsaXZlLiAqLworCisJeiA9IE5VTEw7CisJbnJfYTIyMzIgPSAwOworCXdoaWxlICggKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19XSUxEQ0FSRCwgeikpICl7CisJCWlmICgJKHotPmlkICE9IFpPUlJPX1BST0RfQ0JNX0EyMjMyX1BST1RPVFlQRSkgJiYgCisJCQkoei0+aWQgIT0gWk9SUk9fUFJPRF9DQk1fQTIyMzIpCSl7CisJCQljb250aW51ZTsJLy8gVGhlIGJvYXJkIGZvdW5kIHdhcyBubyBBMjIzMgorCQl9CisJCWlmICghem9ycm9fcmVxdWVzdF9kZXZpY2UoeiwiQTIyMzIgZHJpdmVyIikpCisJCQljb250aW51ZTsKKworCQlwcmludGsoIkNvbW1vZG9yZSBBMjIzMiBmb3VuZCAoIyVkKS5cbiIsbnJfYTIyMzIpOworCisJCXpkX2EyMjMyW25yX2EyMjMyXSA9IHo7CisKKwkJYm9hcmRhZGRyID0gWlRXT19WQUREUiggei0+cmVzb3VyY2Uuc3RhcnQgKTsKKwkJcHJpbnRrKCJCb2FyZCBpcyBsb2NhdGVkIGF0IGFkZHJlc3MgMHgleCwgc2l6ZSBpcyAweCV4LlxuIiwgYm9hcmRhZGRyLCAodW5zaWduZWQgaW50KSAoKHotPnJlc291cmNlLmVuZCsxKSAtICh6LT5yZXNvdXJjZS5zdGFydCkpKTsKKworCQltZW0gPSAodm9sYXRpbGUgc3RydWN0IGEyMjMybWVtb3J5ICopIGJvYXJkYWRkcjsKKworCQkodm9pZCkgbWVtLT5FbmFibGU2NTAyUmVzZXQ7ICAgLyogY29weSB0aGUgY29kZSBhY3Jvc3MgdG8gdGhlIGJvYXJkICovCisJCXRvID0gKHVfY2hhciAqKW1lbTsgIGZyb20gPSBhMjIzMl82NUVDMDJjb2RlOyBiY291bnQgPSBzaXplb2YoYTIyMzJfNjVFQzAyY29kZSkgLSAyOworCQlzdGFydCA9ICooc2hvcnQgKilmcm9tOworCQlmcm9tICs9IHNpemVvZihzdGFydCk7CisJCXRvICs9IHN0YXJ0OworCQl3aGlsZShiY291bnQtLSkgKnRvKysgPSAqZnJvbSsrOworCQlwcmludGsoIjY1RUMwMiBzb2Z0d2FyZSB1cGxvYWRlZCB0byB0aGUgQTIyMzIgbWVtb3J5LlxuIik7CisgIAorCQltZW0tPkNvbW1vbi5DcnlzdGFsID0gQTIyMzJfVU5LTk9XTjsgIC8qIHVzZSBhdXRvbWF0aWMgc3BlZWQgY2hlY2sgKi8KKyAgCisJCS8qIHN0YXJ0IDY1MDIgcnVubmluZyAqLworCQkodm9pZCkgbWVtLT5SZXNldEJvYXJkOworCQlwcmludGsoIkEyMjMyJ3MgNjVFQzAyIENQVSB1cCBhbmQgcnVubmluZy5cbiIpOworICAKKwkJLyogd2FpdCB1bnRpbCBzcGVlZCBkZXRlY3RvciBoYXMgZmluaXNoZWQgKi8KKwkJZm9yIChiY291bnQgPSAwOyBiY291bnQgPCAyMDAwOyBiY291bnQrKykgeworCQkJdWRlbGF5KDEwMDApOworCQkJaWYgKG1lbS0+Q29tbW9uLkNyeXN0YWwpCisJCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKChtZW0tPkNvbW1vbi5DcnlzdGFsPyJBMjIzMiBvc2NpbGxhdG9yIGNyeXN0YWwgZGV0ZWN0ZWQgYnkgNjVFQzAyIHNvZnR3YXJlOiAiOiI2NUVDMDIgc29mdHdhcmUgY291bGQgbm90IGRldGVybWluZSBBMjIzMiBvc2NpbGxhdG9yIGNyeXN0YWw6ICIpKTsKKwkJc3dpdGNoIChtZW0tPkNvbW1vbi5DcnlzdGFsKXsKKwkJY2FzZSBBMjIzMl9VTktOT1dOOgorCQkJcHJpbnRrKCJVbmtub3duIGNyeXN0YWwuXG4iKTsKKwkJCWJyZWFrOworIAkJY2FzZSBBMjIzMl9OT1JNQUw6CisJCQlwcmludGsgKCJOb3JtYWwgY3J5c3RhbC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQTIyMzJfVFVSQk86CisJCQlwcmludGsgKCJUdXJibyBjcnlzdGFsLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoIjB4JXguIEh1aD9cbiIsbWVtLT5Db21tb24uQ3J5c3RhbCk7CisJCX0KKworCQlucl9hMjIzMisrOworCisJfQkKKworCXByaW50aygiVG90YWw6ICVkIEEyMjMyIGJvYXJkcyBpbml0aWFsaXplZC5cbi4iLCBucl9hMjIzMik7IC8qIFNvbWUgc3RhdHVzIHJlcG9ydCBpZiBubyBjYXJkIHdhcyBmb3VuZCAqLworCisJYTIyMzJfaW5pdF9wb3J0c3RydWN0cygpOworCisJLyoKKwkJYTIyMzJfaW5pdF9kcml2ZXJzIGFsc28gcmVnaXN0ZXJzIHRoZSBkcml2ZXJzLiBNdXN0IGJlIGhlcmUgYmVjYXVzZSBhbGwgYm9hcmRzCisJCWhhdmUgdG8gYmUgZGV0ZWN0ZWQgZmlyc3QuCisJKi8KKwlpZiAoYTIyMzJfaW5pdF9kcml2ZXJzKCkpIHJldHVybiAtRU5PREVWOyAvLyBtYXliZSB3ZSBzaG91bGQgdXNlIGEgZGlmZmVyZW50IC1FeHh4PworCisJcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhMjIzMl92YmxfaW50ZXIsIDAsICJBMjIzMiBzZXJpYWwgVkJMIiwgYTIyMzJfZHJpdmVyX0lEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGEyMjMyYm9hcmRfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2EyMjMyOyBpKyspIHsKKwkJem9ycm9fcmVsZWFzZV9kZXZpY2UoemRfYTIyMzJbaV0pOworCX0KKworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihhMjIzMl9kcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKGEyMjMyX2RyaXZlcik7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhMjIzMl9kcml2ZXJfSUQpOworfQorCittb2R1bGVfaW5pdChhMjIzMmJvYXJkX2luaXQpOworbW9kdWxlX2V4aXQoYTIyMzJib2FyZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRW52ZXIgSGFhc2UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW1pZ2EgQTIyMzIgbXVsdGktc2VyaWFsIGJvYXJkIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5oIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDllYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qIGRyaXZlcnMvY2hhci9zZXJfYTIyMzIuaCAqLworCisvKiAkSWQ6IHNlcl9hMjIzMi5oLHYgMC40IDIwMDAvMDEvMjUgMTI6MDA6MDAgZWhhYXNlIEV4cCAkICovCisKKy8qIExpbnV4IHNlcmlhbCBkcml2ZXIgZm9yIHRoZSBBbWlnYSBBMjIzMiBib2FyZCAqLworCisvKiBUaGlzIGRyaXZlciBpcyBNQUlOVEFJTkVELiBCZWZvcmUgYXBwbHlpbmcgYW55IGNoYW5nZXMsIHBsZWFzZSBjb250YWN0CisgKiB0aGUgYXV0aG9yLgorICovCisgICAKKy8qIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIEVudmVyIEhhYXNlICAgIDxlaGFhc2VAaW5mLmZ1LWJlcmxpbi5kZT4KKyAqICAgICAgICAgICAgICAgICAgIGFsaWFzIFRoZSBBMjIzMiBkcml2ZXIgcHJvamVjdCA8QTIyMzJAZ214Lm5ldD4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogIAorICovCisKKyNpZm5kZWYgX1NFUl9BMjIzMl9IXworI2RlZmluZSBfU0VSX0EyMjMyX0hfCisKKy8qCisJSG93IG1hbnkgYm9hcmRzIGFyZSB0byBiZSBzdXBwb3J0ZWQgYXQgbWF4aW11bTsKKwkidXAgdG8gZml2ZSBBMjIzMiBNdWx0aXBvcnQgU2VyaWFsIENhcmRzIG1heSBiZSBpbnN0YWxsZWQgaW4gYQorCXNpbmdsZSBBbWlnYSAyMDAwIiBzdGF0ZXMgdGhlIEEyMjMyIFVzZXIncyBHdWlkZS4gSWYgeW91IGhhdmUKKwltb3JlIHNsb3RzIGF2YWlsYWJsZSwgeW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBiZWxvdy4KKyovCisjZGVmaW5lIE1BWF9BMjIzMl9CT0FSRFMgNQorCisjaWZuZGVmIEEyMjMyX05PUk1BTF9NQUpPUgorLyogVGhpcyBhbGxvd3Mgb3ZlcnJpZGluZyBvbiB0aGUgY29tcGlsZXIgY29tbWFuZGxpbmUsIG9yIGluIGEgIm1ham9yLmgiIAorICAgaW5jbHVkZSBvciBzb21ldGhpbmcgbGlrZSB0aGF0ICovCisjZGVmaW5lIEEyMjMyX05PUk1BTF9NQUpPUiAgMjI0CS8qIC9kZXYvdHR5WSogKi8KKyNkZWZpbmUgQTIyMzJfQ0FMTE9VVF9NQUpPUiAyMjUJLyogL2Rldi9jdXkqICAqLworI2VuZGlmCisKKy8qIFNvbWUgbWFnaWMgaXMgYWx3YXlzIGdvb2QgLSBXaG8ga25vd3MgOikgKi8KKyNkZWZpbmUgQTIyMzJfTUFHSUMgMHgwMDBhMjIzMgorCisvKiBBMjIzMiBwb3J0IHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHRoZQorICAgc3RhdHVzIG9mIGV2ZXJ5IHNpbmdsZSBsaW5lIHVzZWQgKi8KK3N0cnVjdCBhMjIzMl9wb3J0eworCXN0cnVjdCBnc19wb3J0IGdzOworCXVuc2lnbmVkIGludCB3aGljaF9hMjIzMjsKKwl1bnNpZ25lZCBpbnQgd2hpY2hfcG9ydF9vbl9hMjIzMjsKKwlzaG9ydCBkaXNhYmxlX3J4OworCXNob3J0IHRocm90dGxlX2lucHV0OworCXNob3J0IGNkX3N0YXR1czsKK307CisKKyNkZWZpbmUJTlVNTElORVMJCTcJLyogbnVtYmVyIG9mIGxpbmVzIHBlciBib2FyZCAqLworI2RlZmluZQlBMjIzMl9JT0JVRkxFTgkJMjU2CS8qIG51bWJlciBvZiBieXRlcyBwZXIgYnVmZmVyICovCisjZGVmaW5lCUEyMjMyX0lPQlVGTEVOTUFTSwkweGZmCS8qIG1hc2sgZm9yIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzICovCisKKworI2RlZmluZQlBMjIzMl9VTktOT1dOCTAJLyogY3J5c3RhbCBub3Qga25vd24gKi8KKyNkZWZpbmUJQTIyMzJfTk9STUFMCTEJLyogbm9ybWFsIEEyMjMyICgxLjg0MzIgTUh6IG9zY2lsbGF0b3IpICovCisjZGVmaW5lCUEyMjMyX1RVUkJPCTIJLyogdHVyYm8gQTIyMzIgKDMuNjg2NCBNSHogb3NjaWxsYXRvcikgKi8KKworCitzdHJ1Y3QgYTIyMzJjb21tb24geworCWNoYXIgICBDcnlzdGFsOwkvKiBub3JtYWwgKDEpIG9yIHR1cmJvICgyKSBib2FyZD8gKi8KKwl1X2NoYXIgUGFkX2E7CisJdV9jaGFyIFRpbWVySDsJLyogdGltZXIgdmFsdWUgYWZ0ZXIgc3BlZWQgY2hlY2sgKi8KKwl1X2NoYXIgVGltZXJMOworCXVfY2hhciBDREhlYWQ7CS8qIGhlYWQgcG9pbnRlciBmb3IgQ0QgbWVzc2FnZSBxdWV1ZSAqLworCXVfY2hhciBDRFRhaWw7CS8qIHRhaWwgcG9pbnRlciBmb3IgQ0QgbWVzc2FnZSBxdWV1ZSAqLworCXVfY2hhciBDRFN0YXR1czsKKwl1X2NoYXIgUGFkX2I7Cit9OworCitzdHJ1Y3QgYTIyMzJzdGF0dXMgeworCXVfY2hhciBJbkhlYWQ7CQkvKiBpbnB1dCBxdWV1ZSBoZWFkICovCisJdV9jaGFyIEluVGFpbDsJCS8qIGlucHV0IHF1ZXVlIHRhaWwgKi8KKwl1X2NoYXIgT3V0RGlzYWJsZTsJLyogZGlzYWJsZXMgb3V0cHV0ICovCisJdV9jaGFyIE91dEhlYWQ7CQkvKiBvdXRwdXQgcXVldWUgaGVhZCAqLworCXVfY2hhciBPdXRUYWlsOwkJLyogb3V0cHV0IHF1ZXVlIHRhaWwgKi8KKwl1X2NoYXIgT3V0Q3RybDsJCS8qIHNvZnQgZmxvdyBjb250cm9sIGNoYXJhY3RlciB0byBzZW5kICovCisJdV9jaGFyIE91dEZsdXNoOwkvKiBmbHVzaGVzIG91dHB1dCBidWZmZXIgKi8KKwl1X2NoYXIgU2V0dXA7CQkvKiBjYXVzZXMgcmVjb25maWd1cmF0aW9uICovCisJdV9jaGFyIFBhcmFtOwkJLyogcGFyYW1ldGVyIGJ5dGUgLSBzZWUgQTIyMzJQQVJBTSAqLworCXVfY2hhciBDb21tYW5kOwkJLyogY29tbWFuZCBieXRlIC0gc2VlIEEyMjMyQ01EICovCisJdV9jaGFyIFNvZnRGbG93OwkvKiBlbmFibGVzIHhvbi94b2ZmIGZsb3cgY29udHJvbCAqLworCS8qIHByaXZhdGUgNjVFQzAyIGZpZWxkczogKi8KKwl1X2NoYXIgWG9uT2ZmOwkJLyogc3RvcmVzIFhPTi9YT0ZGIGVuYWJsZS9kaXNhYmxlICovCit9OworCisjZGVmaW5lCUEyMjMyX01FTVBBRDEJXAorCSgweDAyMDAgLSBOVU1MSU5FUyAqIHNpemVvZihzdHJ1Y3QgYTIyMzJzdGF0dXMpCS0JXAorCXNpemVvZihzdHJ1Y3QgYTIyMzJjb21tb24pKQorI2RlZmluZQlBMjIzMl9NRU1QQUQyCSgweDIwMDAgLSBOVU1MSU5FUyAqIEEyMjMyX0lPQlVGTEVOIC0gQTIyMzJfSU9CVUZMRU4pCisKK3N0cnVjdCBhMjIzMm1lbW9yeSB7CisJc3RydWN0IGEyMjMyc3RhdHVzIFN0YXR1c1tOVU1MSU5FU107CS8qIDB4MDAwMC0weDAwNmYgc3RhdHVzIGFyZWFzICovCisJc3RydWN0IGEyMjMyY29tbW9uIENvbW1vbjsJCS8qIDB4MDA3MC0weDAwNzcgY29tbW9uIGZsYWdzICovCisJdV9jaGFyIER1bW15MVtBMjIzMl9NRU1QQUQxXTsJCS8qIDB4MDBYWC0weDAxZmYgKi8KKwl1X2NoYXIgT3V0QnVmW05VTUxJTkVTXVtBMjIzMl9JT0JVRkxFTl07LyogMHgwMjAwLTB4MDhmZiBvdXRwdXQgYnVmcyAqLworCXVfY2hhciBJbkJ1ZltOVU1MSU5FU11bQTIyMzJfSU9CVUZMRU5dOwkvKiAweDA5MDAtMHgwZmZmIGlucHV0IGJ1ZnMgKi8KKwl1X2NoYXIgSW5DdGxbTlVNTElORVNdW0EyMjMyX0lPQlVGTEVOXTsJLyogMHgxMDAwLTB4MTZmZiBjb250cm9sIGRhdGEgKi8KKwl1X2NoYXIgQ0RCdWZbQTIyMzJfSU9CVUZMRU5dOwkJLyogMHgxNzAwLTB4MTdmZiBDRCBldmVudCBidWZmZXIgKi8KKwl1X2NoYXIgRHVtbXkyW0EyMjMyX01FTVBBRDJdOwkJLyogMHgxODAwLTB4MmZmZiAqLworCXVfY2hhciBDb2RlWzB4MTAwMF07CQkJLyogMHgzMDAwLTB4M2ZmZiBjb2RlIGFyZWEgKi8KKwl1X3Nob3J0IEludGVycnVwdEFjazsJCQkvKiAweDQwMDAgICAgICAgIGludHIgYWNrICovCisJdV9jaGFyIER1bW15M1sweDNmZmVdOwkJCS8qIDB4NDAwMi0weDdmZmYgKi8KKwl1X3Nob3J0IEVuYWJsZTY1MDJSZXNldDsJCS8qIDB4ODAwMCBTdG9wIGJvYXJkLCAqLworCQkJCQkJLyogIDY1MDIgUkVTRVQgbGluZSBoZWxkIGxvdyAqLworCXVfY2hhciBEdW1teTRbMHgzZmZlXTsJCQkvKiAweDgwMDItMHhiZmZmICovCisJdV9zaG9ydCBSZXNldEJvYXJkOwkJCS8qIDB4YzAwMCByZXNldCBib2FyZCAmIHJ1biwgKi8KKwkJCQkJCS8qICA2NTAyIFJFU0VUIGxpbmUgaGVsZCBoaWdoICovCit9OworCisjdW5kZWYgQTIyMzJfTUVNUEFEMQorI3VuZGVmIEEyMjMyX01FTVBBRDIKKworI2RlZmluZQlBMjIzMklOQ1RMX0NIQVIJCTAJLyogY29ycmVzcG9uZGluZyBieXRlIGluIEluQnVmIGlzIGEgY2hhcmFjdGVyICovCisjZGVmaW5lCUEyMjMySU5DVExfRVZFTlQJMQkvKiBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gSW5CdWYgaXMgYW4gZXZlbnQgKi8KKworI2RlZmluZQlBMjIzMkVWRU5UX0JyZWFrCTEJLyogYnJlYWsgc2V0ICovCisjZGVmaW5lCUEyMjMyRVZFTlRfQ2Fycmllck9uCTIJLyogY2FycmllciByYWlzZWQgKi8KKyNkZWZpbmUJQTIyMzJFVkVOVF9DYXJyaWVyT2ZmCTMJLyogY2FycmllciBkcm9wcGVkICovCisjZGVmaW5lIEEyMjMyRVZFTlRfU3luYwkJNAkvKiBkb24ndCBrbm93LCBkZWZpbmVkIGluIDIyMzIuYXggKi8KKworI2RlZmluZQlBMjIzMkNNRF9FbmFibGUJCTB4MQkvKiBlbmFibGUvRFRSIGJpdCAqLworI2RlZmluZQlBMjIzMkNNRF9DbG9zZQkJMHgyCS8qIGNsb3NlIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUJQTIyMzJDTURfT3BlbgkJMHhiCS8qIG9wZW4gdGhlIGRldmljZSAqLworI2RlZmluZQlBMjIzMkNNRF9DTWFzawkJMHhmCS8qIGNvbW1hbmQgbWFzayAqLworI2RlZmluZQlBMjIzMkNNRF9SVFNPZmYJCTB4MCAgCS8qIHR1cm4gb2ZmIFJUUyAqLworI2RlZmluZQlBMjIzMkNNRF9SVFNPbgkJMHg4CS8qIHR1cm4gb24gUlRTICovCisjZGVmaW5lCUEyMjMyQ01EX0JyZWFrCQkweGQJLyogdHJhbnNtaXQgYSBicmVhayAqLworI2RlZmluZQlBMjIzMkNNRF9SVFNNYXNrCTB4YwkvKiBtYXNrIGZvciBSVFMgc3R1ZmYgKi8KKyNkZWZpbmUJQTIyMzJDTURfTm9QYXJpdHkJMHgwMAkvKiBkb24ndCB1c2UgcGFyaXR5ICovCisjZGVmaW5lCUEyMjMyQ01EX09kZFBhcml0eQkweDIwCS8qIG9kZCBwYXJpdHkgKi8KKyNkZWZpbmUJQTIyMzJDTURfRXZlblBhcml0eQkweDYwCS8qIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lCUEyMjMyQ01EX1Bhcml0eU1hc2sJMHhlMAkvKiBwYXJpdHkgbWFzayAqLworCisjZGVmaW5lCUEyMjMyUEFSQU1fQjExNTIwMAkweDAJLyogYmF1ZCByYXRlcyAqLworI2RlZmluZQlBMjIzMlBBUkFNX0I1MAkJMHgxCisjZGVmaW5lCUEyMjMyUEFSQU1fQjc1CQkweDIKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTEwCQkweDMKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTM0CQkweDQKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTUwCQkweDUKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMzAwCQkweDYKKyNkZWZpbmUJQTIyMzJQQVJBTV9CNjAwCQkweDcKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTIwMAkweDgKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTgwMAkweDkKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMjQwMAkweGEKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMzYwMAkweGIKKyNkZWZpbmUJQTIyMzJQQVJBTV9CNDgwMAkweGMKKyNkZWZpbmUJQTIyMzJQQVJBTV9CNzIwMAkweGQKKyNkZWZpbmUJQTIyMzJQQVJBTV9COTYwMAkweGUKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTkyMDAJMHhmCisjZGVmaW5lCUEyMjMyUEFSQU1fQmF1ZE1hc2sJMHhmCS8qIGJhdWQgcmF0ZSBtYXNrICovCisjZGVmaW5lCUEyMjMyUEFSQU1fUmN2QmF1ZAkweDEwCS8qIGVuYWJsZSByZWNlaXZlIGJhdWQgcmF0ZSAqLworI2RlZmluZQlBMjIzMlBBUkFNXzhCaXQJCTB4MDAJLyogbnVtYmVycyBvZiBiaXRzICovCisjZGVmaW5lCUEyMjMyUEFSQU1fN0JpdAkJMHgyMAorI2RlZmluZQlBMjIzMlBBUkFNXzZCaXQJCTB4NDAKKyNkZWZpbmUJQTIyMzJQQVJBTV81Qml0CQkweDYwCisjZGVmaW5lCUEyMjMyUEFSQU1fQml0TWFzawkweDYwCS8qIG51bWJlcnMgb2YgYml0cyBtYXNrICovCisKKworLyogU3RhbmRhcmQgc3BlZWRzIHRhYmxlcywgLTEgbWVhbnMgdW5hdmFpbGFibGUsIC0yIG1lYW5zIDAgYmF1ZDogc3dpdGNoIG9mZiBsaW5lICovCisjZGVmaW5lIEEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCAtMQorI2RlZmluZSBBMjIzMl9CQVVEX1RBQkxFX05VTV9SQVRFUyAoMTgpCitzdGF0aWMgaW50IGEyMjMyX2JhdWRfdGFibGVbQTIyMzJfQkFVRF9UQUJMRV9OVU1fUkFURVMqM10gPSB7CisJLy9CYXVkCS8vTm9ybWFsCQkJLy9UdXJibworCTUwLAlBMjIzMlBBUkFNX0I1MCwJCQlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCisJNzUsCUEyMjMyUEFSQU1fQjc1LAkJCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwKKwkxMTAsCUEyMjMyUEFSQU1fQjExMCwJCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwKKwkxMzQsCUEyMjMyUEFSQU1fQjEzNCwJCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwKKwkxNTAsCUEyMjMyUEFSQU1fQjE1MCwJCUEyMjMyUEFSQU1fQjc1LAorCTIwMCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCisJMzAwLAlBMjIzMlBBUkFNX0IzMDAsCQlBMjIzMlBBUkFNX0IxNTAsCisJNjAwLAlBMjIzMlBBUkFNX0I2MDAsCQlBMjIzMlBBUkFNX0IzMDAsCisJMTIwMCwJQTIyMzJQQVJBTV9CMTIwMCwJCUEyMjMyUEFSQU1fQjYwMCwKKwkxODAwLAlBMjIzMlBBUkFNX0IxODAwLAkJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorCTI0MDAsCUEyMjMyUEFSQU1fQjI0MDAsCQlBMjIzMlBBUkFNX0IxMjAwLAorCTQ4MDAsCUEyMjMyUEFSQU1fQjQ4MDAsCQlBMjIzMlBBUkFNX0IyNDAwLAorCTk2MDAsCUEyMjMyUEFSQU1fQjk2MDAsCQlBMjIzMlBBUkFNX0I0ODAwLAorCTE5MjAwLAlBMjIzMlBBUkFNX0IxOTIwMCwJCUEyMjMyUEFSQU1fQjk2MDAsCisJMzg0MDAsCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwJQTIyMzJQQVJBTV9CMTkyMDAsCisJNTc2MDAsCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorI2lmZGVmIEEyMjMyX1NQRUVESEFDSworCTExNTIwMCwJQTIyMzJQQVJBTV9CMTE1MjAwLAkJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorCTIzMDQwMCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAlBMjIzMlBBUkFNX0IxMTUyMDAKKyNlbHNlCisJMTE1MjAwLAlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwKKwkyMzA0MDAsCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMCisjZW5kaWYKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzJmdy5heCBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzJmdy5heApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzY0MzgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMmZ3LmF4CkBAIC0wLDAgKzEsNTI5IEBACis7LmxpYiAiYXhtIgorOworO2JlZ2luCis7dGl0bGUgIkEyMjMyIHNlcmlhbCBib2FyZCBkcml2ZXIiCis7Cis7c2V0IG1vZHVsZXMgIjIyMzIiCis7c2V0IGV4ZWN1dGFibGUgIjIyMzIuYmluIgorOworOzs7O3NldCBub2xpbmsKKzsKKztzZXQgdGVtcG9yYXJ5IGRpcmVjdG9yeSAidDoiCis7Cis7c2V0IGFzc2VtYmx5IG9wdGlvbnMgIi1tNjUwMiAtbDYwOnQ6bGlzdCIKKztzZXQgbGluayBvcHRpb25zICJiaW4iOyBsb2FkYWRyIgorOzs7YmluMmMgMjIzMi5iaW4gbXNjNjUwMi5oIG1zYzY1MDJjb2RlCis7ZW5kCis7Cis7Cis7ICMjIyBDb21tb2RvcmUgQTIyMzIgc2VyaWFsIGJvYXJkIGRyaXZlciBmb3IgTmV0QlNEIGJ5IEpNIHYxLjMgIyMjCis7Cis7IC0gQ3JlYXRlZCA5NTA1MDEgYnkgSk0gLQorOworOworOyBTZXJpYWwgYm9hcmQgZHJpdmVyIHNvZnR3YXJlLgorOworOworJSBDb3B5cmlnaHQgKGMpIDE5OTUgSnVra2EgTWFyaW4gPGptYXJpbkBqbXAuZmk+LgorJSBBbGwgcmlnaHRzIHJlc2VydmVkLgorJQorJSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyUgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCislIGFyZSBtZXQ6CislIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CislICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorJSAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyUgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyUgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorJSAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorJSAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyUgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorJSAgICB3cml0dGVuIHBlcm1pc3Npb24uCislCislIEFMVEVSTkFUSVZFTFksIHRoaXMgcHJvZHVjdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCislIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUKKyUgR1BMIGFyZSByZXF1aXJlZCBJTlNURUFEIE9GIHRoZSBhYm92ZSByZXN0cmljdGlvbnMuICAoVGhpcyBjbGF1c2UgaXMKKyUgbmVjZXNzYXJ5IGR1ZSB0byBhIHBvdGVudGlhbCBiYWQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgR1BMIGFuZAorJSB0aGUgcmVzdHJpY3Rpb25zIGNvbnRhaW5lZCBpbiBhIEJTRC1zdHlsZSBjb3B5cmlnaHQuKQorJQorJSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECislIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCislIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCislIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyUgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCislIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorJSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyUgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorJSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCislIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyUgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorOworOworOyBCdWdzOgorOworOyAtIENhbid0IHNlbmQgYSBicmVhayB5ZXQKKzsKKzsKKzsKKzsgRWRpdGVkOgorOworOyAtIDk1MDUwMSBieSBKTSAtPiB2MC4xCS0gQ3JlYXRlZCB0aGlzIGZpbGUuCis7IC0gOTUxMDI5IGJ5IEpNIC0+IHYxLjMJLSBDYXJyaWVyIERldGVjdCBldmVudHMgbm93IHF1ZXVlZCBpbiBhIHNlcGFyYXRlCis7CQkJCSAgcXVldWUuCis7Cis7CisKKworQ09ERQkJZXF1CSQzODAwCQk7IHN0YXJ0IGFkZHJlc3MgZm9yIHByb2dyYW0gY29kZQorCisKK0NUTF9DSEFSCWVxdQkkMDAJCTsgYnl0ZSBpbiBpYnVmIGlzIGEgY2hhcmFjdGVyCitDVExfRVZFTlQJZXF1CSQwMQkJOyBieXRlIGluIGlidWYgaXMgYW4gZXZlbnQKKworRVZFTlRfQlJFQUsJZXF1CSQwMQorRVZFTlRfQ0RPTgllcXUJJDAyCitFVkVOVF9DRE9GRgllcXUJJDAzCitFVkVOVF9TWU5DCWVxdQkkMDQKKworWE9OCQllcXUJJDExCitYT0ZGCQllcXUJJDEzCisKKworVkFSQkFTRQkJbWFjcm8JKnN0YXJ0aW5nX2FkZHJlc3MJOyB3YXMgVkFSSU5JVAorX3ZhcmJhc2UJc2V0CVwxCisJCWVuZG0KKworVkFSREVGCQltYWNybwkqbmFtZSBzcGFjZV9uZWVkcworXDEJCWVxdQlfdmFyYmFzZQorX3ZhcmJhc2UJc2V0CV92YXJiYXNlK1wyCisJCWVuZG0KKworCitzdHoJCW1hY3JvCSogYWRkcmVzcworCQkgZGIJJDY0LFwxCisJCWVuZG0KKworc3R6YXgJCW1hY3JvCSogYWRkcmVzcworCQkgZGIJJDllLDxcMSw+XDEKKwkJZW5kbQorCisKK2JpdGkJCW1hY3JvCSogaW1tZWRpYXRlIHZhbHVlCisJCWRiCSQ4OSxcMQorCQllbmRtCisKK3NtYjAJCW1hY3JvCSogYWRkcmVzcworCQlkYgkkODcsXDEKKwkJZW5kbQorc21iMQkJbWFjcm8JKiBhZGRyZXNzCisJCWRiCSQ5NyxcMQorCQllbmRtCitzbWIyCQltYWNybwkqIGFkZHJlc3MKKwkJZGIJJGE3LFwxCisJCWVuZG0KK3NtYjMJCW1hY3JvCSogYWRkcmVzcworCQlkYgkkYjcsXDEKKwkJZW5kbQorc21iNAkJbWFjcm8JKiBhZGRyZXNzCisJCWRiCSRjNyxcMQorCQllbmRtCitzbWI1CQltYWNybwkqIGFkZHJlc3MKKwkJZGIJJGQ3LFwxCisJCWVuZG0KK3NtYjYJCW1hY3JvCSogYWRkcmVzcworCQlkYgkkZTcsXDEKKwkJZW5kbQorc21iNwkJbWFjcm8JKiBhZGRyZXNzCisJCWRiCSRmNyxcMQorCQllbmRtCisKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07Cis7CQkJCQkJCQkJOworOyBzdHVmZiBjb21tb24gZm9yIGFsbCBwb3J0cywgbm9uLWNyaXRpY2FsIChydW4gb25jZSAvIGxvb3ApCQk7Cis7CQkJCQkJCQkJOworRE9fU0xPVwkJbWFjcm8JKiBwb3J0X251bWJlcgkJCQkJOworCQkubG9jYWwJCQk7CQkJCTsKKwkJbGRhCUNJQStDX1BBCTsgY2hlY2sgYWxsIENEIGlucHV0cwkJOworCQljbXAJQ29tbW9uQ0RvCTsgY2hhbmdlZCBmcm9tIHByZXZpb3VzIGFjY3B0ZD8JOworCQliZXEJPW92ZXIJCTsgbm9wZSwgZG8gbm90aGluZyBlbHNlIGhlcmUJOworCQkJCQk7CQkJCTsKKwkJY21wCUNvbW1vbkNEYgk7IGJvdW5jaW5nPwkJCTsKKwkJYmVxCT1ub2JvdW5jZQk7IG5vcGUgLT4JCQk7CisJCQkJCTsJCQkJOworCQlzdGEJQ29tbW9uQ0RiCTsgc2F2ZSBjdXJyZW50IHN0YXRlCQk7CisJCWxkYQkjNjQJCTsgcmVpbml0aWFsaXplIGNvdW50ZXIJCTsKKwkJc3RhCUNvbW1vbkNEYwk7CQkJCTsKKwkJam1wCT1vdmVyCQk7IHNraXAgQ0Qgc2F2ZQkJCTsKKwkJCQkJOwkJCQk7Cis9bm9ib3VuY2UJZGVjCUNvbW1vbkNEYwk7IG5vLCBkZWNyZW1lbnQgYm91bmNlIGNvdW50ZXIJOworCQlicGwJPW92ZXIJCTsgbm90IGRvbmUgeWV0LCBzbyBza2lwIENEIHNhdmUJOworCQkJCQk7CQkJCTsKKz1zYXZlQ0QJCWxkeAlDREhlYWQJCTsgZ2V0IHdyaXRlIGluZGV4CQk7CisJCXN0YQljZGJ1Zix4CQk7IHNhdmUgc3RhdHVzIGluIGJ1ZmZlcgkJOworCQlpbngJCQk7CQkJCTsKKwkJY3B4CUNEVGFpbAkJOyBidWZmZXIgZnVsbD8JCQk7CisJCS5pZgluZQkJOyBubzogcHJlc2VydmUgc3RhdHVzOgkJOworCQkgc3R4CUNESGVhZAkJOyB1cGRhdGUgaW5kZXggaW4gUkFNCQk7CisJCSBzdGEJQ29tbW9uQ0RvCTsgc2F2ZSBzdGF0ZSBmb3IgdGhlIG5leHQgY2hlY2sJOworCQkuZW5kCQkJOwkJCQk7Cis9b3ZlcgkJLmVuZAlsb2NhbAkJCQkJCTsKKwkJZW5kbQkJCQkJCQk7CisJCQkJCQkJCQk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07CisKKworOyBwb3J0IHNwZWNpZmljIHN0dWZmIChubyBkYXRhIHRyYW5zZmVyKQorCitET19QT1JUCQltYWNybwkqIHBvcnRfbnVtYmVyCisJCS5sb2NhbAkJCTsJCQkJOworCQlsZGEJU2V0VXBcMQkJOyByZWNvbmZpZ3VyYXRpb24gcmVxdWVzdD8JOworCQkuaWYJbmUJCTsgeWVzOgkJCQk7CisJCSBsZGEJU29mdEZsb3dcMQk7IGdldCBYT04vWE9GRiBmbGFnCQk7CisJCSBzdGEJWG9uT2ZmXDEJOyBzYXZlIGl0CQkJOworCQkgbGRhCVBhcmFtXDEJCTsgZ2V0IHBhcmFtZXRlcgkJCTsKKwkJIG9yYQkjJTAwMDEwMDAwCTsgdXNlIGJhdWQgZ2VuZXJhdG9yIGZvciBSeAk7CisJCSBzdGEJQUNJQVwxK0FfQ1RSTAk7IHN0b3JlIGluIGNvbnRyb2wgcmVnaXN0ZXIJOworCQkgc3R6CU91dERpc2FibGVcMQk7IGVuYWJsZSB0cmFuc21pdCBvdXRwdXQJOworCQkgc3R6CVNldFVwXDEJCTsgbm8gcmVjb25maWd1cmF0aW9uIG5vIG1vcmUJOworCQkuZW5kCQkJOwkJCQk7CisJCQkJCTsJCQkJOworCQlsZGEJSW5IZWFkXDEJOyBnZXQgd3JpdGUgaW5kZXgJCTsKKwkJc2JjCUluVGFpbFwxCTsgYnVmZmVyIGZ1bGwgc29vbj8JCTsKKwkJY21wCSMyMDAJCTsgMjAwIGNoYXJzIG9yIG1vcmUgaW4gYnVmZmVyPwk7CisJCWxkYQlDb21tYW5kXDEJOyBnZXQgQ29tbWFuZCByZWcgdmFsdWUJCTsKKwkJYW5kCSMlMTExMTAwMTEJOyB0dXJuIFJUUyBPRkYgYnkgZGVmYXVsdAk7CisJCS5pZgljYwkJOyBzdGlsbCByb29tIGluIGJ1ZmZlcjoJCTsKKwkJIG9yYQkjJTAwMDAxMDAwCTsgdHVybiBSVFMgT04JCQk7CisJCS5lbmQJCQk7CQkJCTsKKwkJc3RhCUFDSUFcMStBX0NNRAk7IHNldC9jbGVhciBSVFMJCQk7CisJCQkJCTsJCQkJOworCQlsZGEJT3V0Rmx1c2hcMQk7IHJlcXVlc3QgdG8gZmx1c2ggb3V0cHV0IGJ1ZmZlcjsKKwkJLmlmCW5lCQk7IHllc3NoIQkJCTsKKwkJIGxkYQlPdXRIZWFkXDEJOyBnZXQgaGVhZAkJCTsKKwkJIHN0YQlPdXRUYWlsXDEJOyBzYXZlIGFzIHRhaWwJCQk7CisJCSBzdHoJT3V0RGlzYWJsZVwxCTsgZW5hYmxlIHRyYW5zbWl0IG91dHB1dAk7CisJCSBzdHoJT3V0Rmx1c2hcMQk7IGNsZWFyIHJlcXVlc3QJCQk7CisJCS5lbmQKKwkJLmVuZAlsb2NhbAorCQllbmRtCisKKworRE9fREFUQQkJbWFjcm8JKiBwb3J0IG51bWJlcgorCQkubG9jYWwKKwkJbGRhCUFDSUFcMStBX1NSCTsgcmVhZCBBQ0lBIHN0YXR1cyByZWdpc3Rlcgk7CisJCWJpdGkJWzE8PDNdCQk7IHNvbWV0aGluZyByZWNlaXZlZD8JCTsKKwkJLmlmCW5lCQk7IHllczoJCQkJOworCQkgYml0aQlbMTw8MV0JCTsgZnJhbWluZyBlcnJvcj8JCTsKKwkJIC5pZgluZQkJOyB5ZXM6CQkJCTsKKwkJICBsZGEJQUNJQVwxK0FfREFUQQk7IHJlYWQgcmVjZWl2ZWQgY2hhcmFjdGVyCTsKKwkJICBibmUJPVNFTkQJCTsgbm90IGJyZWFrIC0+IGlnbm9yZSBpdAk7CisJCSAgbGR4CUluSGVhZFwxCTsgZ2V0IHdyaXRlIHBvaW50ZXIJCTsKKwkJICBsZGEJI0NUTF9FVkVOVAk7IGdldCB0eXBlIG9mIGJ5dGUJCTsKKwkJICBzdGEJaWN0bFwxLHgJOyBzYXZlIGl0IGluIEluQ3RsIGJ1ZmZlcgk7CisJCSAgbGRhCSNFVkVOVF9CUkVBSwk7IGV2ZW50IGNvZGUJCQk7CisJCSAgc3RhCWlidWZcMSx4CTsgc2F2ZSBpdCBhcyB3ZWxsCQk7CisJCSAgaW54CQkJOwkJCQk7CisJCSAgY3B4CUluVGFpbFwxCTsgc3RpbGwgcm9vbSBpbiBidWZmZXI/CQk7CisJCSAgLmlmCW5lCQk7IGFic29sdXRlbHk6CQkJOworCQkgICBzdHgJSW5IZWFkXDEJOyB1cGRhdGUgaW5kZXggaW4gbWVtb3J5CTsKKwkJICAuZW5kCQkJOwkJCQk7CisJCSAgam1wCT1TRU5ECQk7IGdvIGNoZWNrIGlmIGFueXRoaW5nIHRvIHNlbmQJOworCQkgLmVuZAkJCTsJCQkJOworCQkgCQkJOyBub3JtYWwgY2hhciByZWNlaXZlZDoJCTsKKwkJIGxkeAlJbkhlYWRcMQk7IGdldCB3cml0ZSBpbmRleAkJOworCQkgbGRhCUFDSUFcMStBX0RBVEEJOyByZWFkIHJlY2VpdmVkIGNoYXJhY3Rlcgk7CisJCSBzdGEJaWJ1ZlwxLHgJOyBzYXZlIGNoYXIgaW4gYnVmZmVyCQk7CisJCSBzdHpheAlpY3RsXDEJCTsgc2V0IHR5cGUgdG8gQ1RMX0NIQVIJCTsKKwkJIGlueAkJCTsJCQkJOworCQkgY3B4CUluVGFpbFwxCTsgYnVmZmVyIGZ1bGw/CQkJOworCQkgLmlmCW5lCQk7IG5vOiBwcmVzZXJ2ZSBjaGFyYWN0ZXI6CTsKKwkJICBzdHgJSW5IZWFkXDEJOyB1cGRhdGUgaW5kZXggaW4gUkFNCQk7CisJCSAuZW5kCQkJOwkJCQk7CisJCSBhbmQJIyQ3ZgkJOyBtYXNrIG9mZiBwYXJpdHkgaWYgYW55CTsKKwkJIGNtcAkjWE9GRgkJOyBYT0ZGIGZyb20gcmVtb3RlIGhvc3Q/CTsKKwkJIC5pZgllcQkJOyB5ZXM6CQkJCTsKKwkJICBsZGEJWG9uT2ZmXDEJOyBpZiBYT04vWE9GRiBoYW5kc2hha2luZy4uCTsKKwkJICBzdGEJT3V0RGlzYWJsZVwxCTsgLi5kaXNhYmxlIHRyYW5zbWl0dGVyCQk7CisJCSAuZW5kCQkJOwkJCQk7CisJCS5lbmQJCQk7CQkJCTsKKwkJCQkJOwkJCQk7CisJCQkJCTsgQlVGRkVSIEZVTEwgQ0hFQ0sgV0FTIEhFUkUJOworCQkJCQk7CQkJCTsKKz1TRU5ECQlsZGEJQUNJQVwxK0FfU1IJOyB0cmFuc21pdCByZWdpc3RlciBlbXB0eT8JOworCQlhbmQJI1sxPDw0XQkJOwkJCQk7CisJCS5pZgluZQkJOyB5ZXM6CQkJCTsKKwkJIGxkeAlPdXRDdHJsXDEJOyBzZW5kaW5nIG91dCBYT04vWE9GRj8JCTsKKwkJIC5pZgluZQkJOyB5ZXM6CQkJCTsKKwkJICBsZGEJQ0lBK0NfUEIJOyBjaGVjayBDVFMgc2lnbmFsCQk7CisJCSAgYW5kCSNbMTw8XDFdCTsgKGZvciB0aGlzIHBvcnQgb25seSkJCTsKKwkJICBibmUJPURPTkUJCTsgbm90IGFsbG93ZWQgdG8gc2VuZCAtPiBkb25lCTsKKwkJICBzdHgJQUNJQVwxK0FfREFUQQk7IHRyYW5zbWl0IGNvbnRyb2wgY2hhcgkJOworCQkgIHN0eglPdXRDdHJsXDEJOyBjbGVhciBmbGFnCQkJOworCQkgIGptcAk9RE9ORQkJOyBhbmQgd2UncmUgZG9uZQkJOworCQkgLmVuZAkJCTsJCQkJOworCQkJCQk7CQkJCTsKKwkJIGxkeAlPdXRUYWlsXDEJOyBhbnl0aGluZyB0byB0cmFuc21pdD8JCTsKKwkJIGNweAlPdXRIZWFkXDEJOwkJCQk7CisJCSAuaWYJbmUJCTsgeWVzOgkJCQk7CisJCSAgbGRhCU91dERpc2FibGVcMQk7IGFsbG93ZWQgdG8gdHJhbnNtaXQ/CQk7CisJCSAgLmlmCWVxCQk7IHllczoJCQkJOworCQkgICBsZGEJQ0lBK0NfUEIJOyBjaGVjayBDVFMgc2lnbmFsCQk7CisJCSAgIGFuZAkjWzE8PFwxXQk7IChmb3IgdGhpcyBwb3J0IG9ubHkpCQk7CisJCSAgIGJuZQk9RE9ORQkJOyBub3QgYWxsb3dlZCB0byBzZW5kIC0+IGRvbmUJOworCQkgICBsZGEJb2J1ZlwxLHgJOyBnZXQgYSBjaGFyIGZyb20gYnVmZmVyCTsKKwkJICAgc3RhCUFDSUFcMStBX0RBVEEJOyBzZW5kIGl0IGF3YXkJCQk7CisJCSAgIGluYwlPdXRUYWlsXDEJOyB1cGRhdGUgcmVhZCBpbmRleAkJOworCQkgIC5lbmQJCQk7CQkJCTsKKwkJIC5lbmQJCQk7CQkJCTsKKwkJLmVuZAkJCTsJCQkJOworPURPTkUJCS5lbmQJbG9jYWwKKwkJZW5kbQorCisKKworUE9SVFZBUgkJbWFjcm8JKiBwb3J0IG51bWJlcgorCQlWQVJERUYJSW5IZWFkXDEgMQorCQlWQVJERUYJSW5UYWlsXDEgMQorCQlWQVJERUYJT3V0RGlzYWJsZVwxIDEKKwkJVkFSREVGCU91dEhlYWRcMSAxCisJCVZBUkRFRglPdXRUYWlsXDEgMQorCQlWQVJERUYJT3V0Q3RybFwxIDEKKwkJVkFSREVGCU91dEZsdXNoXDEgMQorCQlWQVJERUYJU2V0VXBcMSAxCisJCVZBUkRFRglQYXJhbVwxIDEKKwkJVkFSREVGCUNvbW1hbmRcMSAxCisJCVZBUkRFRglTb2Z0Rmxvd1wxIDEKKwkJOyBwcml2YXRlOgorCQlWQVJERUYJWG9uT2ZmXDEgMQorCQllbmRtCisKKworIFZBUkJBU0UgMAk7IHN0YXJ0IHZhcmlhYmxlcyBhdCBhZGRyZXNzICQwMDAwCisgUE9SVFZBUiAwCTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCAwCisgUE9SVFZBUiAxCTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCAxCisgUE9SVFZBUiAyCTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCAyCisgUE9SVFZBUiAzCTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCAzCisgUE9SVFZBUiA0CTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCA0CisgUE9SVFZBUiA1CTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCA1CisgUE9SVFZBUiA2CTsgZGVmaW5lIHZhcmlhYmxlcyBmb3IgcG9ydCA2CisKKworCisgVkFSREVGCUNyeXN0YWwJMQk7IDAgPSB1bmtub3duLCAxID0gbm9ybWFsLCAyID0gdHVyYm8KKyBWQVJERUYJUGFkX2EJMQorIFZBUkRFRglUaW1lckgJMQorIFZBUkRFRglUaW1lckwJMQorIFZBUkRFRglDREhlYWQJMQorIFZBUkRFRglDRFRhaWwJMQorIFZBUkRFRglDRFN0YXR1cyAxCisgVkFSREVGCVBhZF9iCTEKKworIFZBUkRFRglDb21tb25DRG8gMQk7IGZvciBjYXJyaWVyIGRldGVjdCBvcHRpbWl6YXRpb24KKyBWQVJERUYJQ29tbW9uQ0RjIDEJOyBmb3IgY2FycmllciBkZXRlY3QgZGVib3VuY2luZworIFZBUkRFRglDb21tb25DRGIgMQk7IGZvciBjYXJyaWVyIGRldGVjdCBkZWJvdW5jaW5nCisKKworIFZBUkJBU0UgJDAyMDAKKyBWQVJERUYJb2J1ZjAgMjU2CTsgb3V0cHV0IGRhdGEgKGNoYXJhY3RlcnMgb25seSkKKyBWQVJERUYJb2J1ZjEgMjU2CisgVkFSREVGCW9idWYyIDI1NgorIFZBUkRFRglvYnVmMyAyNTYKKyBWQVJERUYJb2J1ZjQgMjU2CisgVkFSREVGCW9idWY1IDI1NgorIFZBUkRFRglvYnVmNiAyNTYKKworIFZBUkRFRglpYnVmMCAyNTYJOyBpbnB1dCBkYXRhIChjaGFyYWN0ZXJzLCBldmVudHMgZXRjIC0gc2VlIGljdGwpCisgVkFSREVGCWlidWYxIDI1NgorIFZBUkRFRglpYnVmMiAyNTYKKyBWQVJERUYJaWJ1ZjMgMjU2CisgVkFSREVGCWlidWY0IDI1NgorIFZBUkRFRglpYnVmNSAyNTYKKyBWQVJERUYJaWJ1ZjYgMjU2CisKKyBWQVJERUYJaWN0bDAgMjU2CTsgaW5wdXQgY29udHJvbCBpbmZvcm1hdGlvbiAodHlwZSBvZiBkYXRhIGluIGlidWYpCisgVkFSREVGCWljdGwxIDI1NgorIFZBUkRFRglpY3RsMiAyNTYKKyBWQVJERUYJaWN0bDMgMjU2CisgVkFSREVGCWljdGw0IDI1NgorIFZBUkRFRglpY3RsNSAyNTYKKyBWQVJERUYJaWN0bDYgMjU2CisKKyBWQVJERUYJY2RidWYgMjU2CTsgQ0QgZXZlbnQgcXVldWUKKworCitBQ0lBMAkJZXF1CSQ0NDAwCitBQ0lBMQkJZXF1CSQ0YzAwCitBQ0lBMgkJZXF1CSQ1NDAwCitBQ0lBMwkJZXF1CSQ1YzAwCitBQ0lBNAkJZXF1CSQ2NDAwCitBQ0lBNQkJZXF1CSQ2YzAwCitBQ0lBNgkJZXF1CSQ3NDAwCisKK0FfREFUQQkJZXF1CSQwMAorQV9TUgkJZXF1CSQwMgorQV9DTUQJCWVxdQkkMDQKK0FfQ1RSTAkJZXF1CSQwNgorOyAgMDAJd3JpdGUgdHJhbnNtaXQgZGF0YQlyZWFkIHJlY2VpdmVkIGRhdGEKKzsgIDAyCXJlc2V0IEFDSUEJCXJlYWQgc3RhdHVzIHJlZ2lzdGVyCis7ICAwNAl3cml0ZSBjb21tYW5kIHJlZ2lzdGVyCXJlYWQgY29tbWFuZCByZWdpc3RlcgorOyAgMDYJd3JpdGUgY29udHJvbCByZWdpc3RlcglyZWFkIGNvbnRyb2wgcmVnaXN0ZXIKKworQ0lBCQllcXUJJDdjMDAJCTsgODUyMCBDSUEKK0NfUEEJCWVxdQkkMDAJCTsgcG9ydCBBIGRhdGEgcmVnaXN0ZXIKK0NfUEIJCWVxdQkkMDIJCTsgcG9ydCBCIGRhdGEgcmVnaXN0ZXIKK0NfRERSQQkJZXF1CSQwNAkJOyBkYXRhIGRpcmVjdGlvbiByZWdpc3RlciBmb3IgcG9ydCBBCitDX0REUkIJCWVxdQkkMDYJCTsgZGF0YSBkaXJlY3Rpb24gcmVnaXN0ZXIgZm9yIHBvcnQgQgorQ19UQUwJCWVxdQkkMDgJCTsgdGltZXIgQQorQ19UQUgJCWVxdQkkMGEKK0NfVEJMCQllcXUJJDBjCQk7IHRpbWVyIEIKK0NfVEJICQllcXUJJDBlCitDX1RPREwJCWVxdQkkMTAJCTsgVE9EIExTQgorQ19UT0RNCQllcXUJJDEyCQk7IFRPRCBtaWRkbGUgYnl0ZQorQ19UT0RICQllcXUJJDE0CQk7IFRPRCBNU0IKK0NfREFUQQkJZXF1CSQxOAkJOyBzZXJpYWwgZGF0YSByZWdpc3RlcgorQ19JTlRDVFJMCWVxdQkkMWEJCTsgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIKK0NfQ1RSTEEJCWVxdQkkMWMJCTsgY29udHJvbCByZWdpc3RlciBBCitDX0NUUkxCCQllcXUJJDFlCQk7IGNvbnRyb2wgcmVnaXN0ZXIgQgorCisKKworCisKKwkJc2VjdGlvbgltYWluLGNvZGUsQ09ERS0yCisKKwkJZGIJPkNPREUsPENPREUKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOworOyBoZXJlJ3MgdGhlIGluaXRpYWxpemF0aW9uIGNvZGU6CQkJCQk7Cis7CQkJCQkJCQkJOworUl9SRVNFVAkJbGR4CSMkZmYJCQkJCQk7CisJCXR4cwkJCTsgaW5pdGlhbGl6ZSBzdGFjayBwb2ludGVyCTsKKwkJY2xkCQkJOyBpbiBjYXNlIGEgNjUwMiBpcyB1c2VkLi4uCTsKKwkJbGR4CSMwCQk7CQkJCTsKKwkJbGRhCSMwCQk7CQkJCTsKKwkJbGR5CSNDcnlzdGFsCTsgdGhpcyBtYW55IGJ5dGVzIHRvIGNsZWFyCTsKK2Nscl9sb29wCXN0YQkwLHgJCTsgY2xlYXIgemVybyBwYWdlIHZhcmlhYmxlcwk7CisJCWlueAkJCTsJCQkJOworCQlkZXkJCQk7CQkJCTsKKwkJYm5lCWNscl9sb29wCTsJCQkJOworCQkJCQk7CQkJCTsKKwkJc3R6CUNvbW1vbkNEbwk7IGZvcmNlIENEIHRlc3QgYXQgYm9vdAkJOworCQlzdHoJQ29tbW9uQ0RiCTsJCQkJOworCQlzdHoJQ0RIZWFkCQk7IGNsZWFyIHF1ZXVlCQkJOworCQlzdHoJQ0RUYWlsCQk7CQkJCTsKKwkJCQkJOwkJCQk7CisJCWxkYQkjMAkJOwkJCQk7CisJCXN0YQlQYWRfYQkJOwkJCQk7CisJCWxkYQkjMTcwCQk7IHRlc3QgY21wCQkJOworCQljbXAJIzEwMAkJOwkJCQk7CisJCS5pZgljcwkJOwkJCQk7CisJCSBpbmMJUGFkX2EJCTsgQyB3YXMgc2V0CQkJOworCQkuZW5kCQkJOwkJCQk7CisJCQkJCQkJCQk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07Cis7IFNwZWVkIGNoZWNrCQkJCQkJCQk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07CisJCQkJCQkJCQk7CisJCWxkYQlDcnlzdGFsCQk7IHNwZWVkIGFscmVhZHkgc2V0PwkJOworCQliZXEJRG9TcGVlZHkJOwkJCQk7CisJCWptcAlMT09QCQk7IHllcywgc2tpcCBzcGVlZCB0ZXN0CQk7CisJCQkJCTsJCQkJOworRG9TcGVlZHkJbGRhCSMlMTAwMTEwMDAJOyA4TjEsIDEyMDAvMjQwMCBicHMJCTsKKwkJc3RhCUFDSUEwK0FfQ1RSTAk7CQkJCTsKKwkJbGRhCSMlMDAwMDEwMTEJOyBlbmFibGUgRFRSCQkJOworCQlzdGEJQUNJQTArQV9DTUQJOwkJCQk7CisJCWxkYQlBQ0lBMCtBX1NSCTsgcmVhZCBzdGF0dXMgcmVnaXN0ZXIJCTsKKwkJCQkJOwkJCQk7CisJCWxkYQkjJTEwMDAwMDAwCTsgZGlzYWJsZSBhbGwgaW50cyAodW5uZWNlc3NhcnkpOworCQlzdGEJQ0lBK0NfSU5UQ1RSTAk7CQkJCTsKKwkJbGRhCSMyNTUJCTsgcHJvZ3JhbSB0aGUgdGltZXIJCTsKKwkJc3RhCUNJQStDX1RBTAk7CQkJCTsKKwkJc3RhCUNJQStDX1RBSAk7CQkJCTsKKwkJCQkJOwkJCQk7CisJCWxkeAkjMAkJOwkJCQk7CisJCXN0eAlBQ0lBMCtBX0RBVEEJOyB0cmFuc21pdCBhIHplcm8JCTsKKwkJbm9wCQkJOwkJCQk7CisJCW5vcAkJCTsJCQkJOworCQlsZGEJQUNJQTArQV9TUgk7IHJlYWQgc3RhdHVzCQkJOworCQlub3AJCQk7CQkJCTsKKwkJbm9wCQkJOwkJCQk7CisJCXN0eAlBQ0lBMCtBX0RBVEEJOyB0cmFuc21pdCBhIHplcm8JCTsKK1NwZWVkeTEJCWxkYQlBQ0lBMCtBX1NSCTsgcmVhZCBzdGF0dXMJCQk7CisJCWFuZAkjWzE8PDRdCQk7IHRyYW5zbWl0IGRhdGEgcmVnIGVtcHR5Pwk7CisJCWJlcQlTcGVlZHkxCQk7IG5vdCB5ZXQsIHdhaXQgbW9yZQkJOworCQkJCQk7CQkJCTsKKwkJbGRhCSMlMDAwMTAwMDEJOyBsb2FkICYgc3RhcnQgdGhlIHRpbWVyCTsKKwkJc3R4CUFDSUEwK0FfREFUQQk7IHRyYW5zbWl0IG9uZSBtb3JlIHplcm8JOworCQlzdGEJQ0lBK0NfQ1RSTEEJOwkJCQk7CitTcGVlZHkyCQlsZGEJQUNJQTArQV9TUgk7IHJlYWQgc3RhdHVzCQkJOworCQlhbmQJI1sxPDw0XQkJOyB0cmFuc21pdCBkYXRhIHJlZyBlbXB0eT8JOworCQliZXEJU3BlZWR5MgkJOyBub3QgeWV0LCB3YWl0IG1vcmUJCTsKKwkJc3R4CUNJQStDX0NUUkxBCTsgc3RvcCB0aGUgdGltZXIJCTsKKwkJCQkJOwkJCQk7CisJCWxkYQlDSUErQ19UQUwJOyBjb3B5IHRpbWVyIHZhbHVlIGZvciA2OGsJOworCQlzdGEJVGltZXJMCQk7CQkJCTsKKwkJbGRhCUNJQStDX1RBSAk7CQkJCTsKKwkJc3RhCVRpbWVySAkJOwkJCQk7CisJCWNtcAkjJGQwCQk7IHR1cmJvIG9yIG5vcm1hbD8JCTsKKwkJLmlmCWNzCQk7CQkJCTsKKwkJIGxkYQkjMgkJOyB0dXJibyEgOi0pCQkJOworCQkuZWxzZQkJCTsJCQkJOworCQkgbGRhCSMxCQk7IG5vcm1hbCA6LSgJCQk7CisJCS5lbmQJCQk7CQkJCTsKKwkJc3RhCUNyeXN0YWwJCTsJCQkJOworCQlsZGEJIzAJCTsJCQkJOworCQlzdGEJQUNJQTArQV9TUgk7CQkJCTsKKwkJc3RhCUFDSUEwK0FfQ1RSTAk7IHJlc2V0IFVBUlQJCQk7CisJCXN0YQlBQ0lBMCtBX0NNRAk7CQkJCTsKKwkJCQkJCQkJCTsKKwkJam1wCUxPT1AJCQkJCQk7CisJCQkJCQkJCQk7Cis7CQkJCQkJCQkJOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOworOwkJCQkJCQkJCTsKKzsgVGhlIFJlYWwgVGhpbmc6CQkJCQkJCTsKKzsJCQkJCQkJCQk7CitMT09QCQlET19TTE9XCQkJOyBkbyBub24tY3JpdGljYWwgdGhpbmdzCTsKKwkJanNyCWRvX2lucHV0CTsgY2hlY2sgZm9yIHJlY2VpdmVkIGRhdGEKKwkJRE9fUE9SVAkwCisJCWpzcglkb19pbnB1dAorCQlET19QT1JUCTEKKwkJanNyCWRvX2lucHV0CisJCURPX1BPUlQJMgorCQlqc3IJZG9faW5wdXQKKwkJRE9fUE9SVAkzCisJCWpzcglkb19pbnB1dAorCQlET19QT1JUCTQKKwkJanNyCWRvX2lucHV0CisJCURPX1BPUlQJNQorCQlqc3IJZG9faW5wdXQKKwkJRE9fUE9SVAk2CisJCWpzcglkb19pbnB1dAorCQlqbXAJTE9PUAorCisKK2RvX2lucHV0CURPX0RBVEEJMAorCQlET19EQVRBCTEKKwkJRE9fREFUQQkyCisJCURPX0RBVEEJMworCQlET19EQVRBCTQKKwkJRE9fREFUQQk1CisJCURPX0RBVEEJNgorCQlydHMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07CisJCXNlY3Rpb24JdmVjdG9ycyxkYXRhLCQzZmZhCisJCWR3CSRkMGQwCisJCWR3CVJfUkVTRVQKKwkJZHcJJGMwY2UKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTsKKworCisKKwkJZW5kCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyZncuaCBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzJmdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOWEzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyZncuaApAQCAtMCwwICsxLDMwNiBAQAorLyogZHJpdmVycy9jaGFyL3Nlcl9hMjIzMmZ3LmggKi8KKworLyogJElkOiBzZXJfYTIyMzJmdy5oLHYgMC40IDIwMDAvMDEvMjUgMTI6MDA6MDAgZWhhYXNlIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgSnVra2EgTWFyaW4gPGptYXJpbkBqbXAuZmk+LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHByb2R1Y3QgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZQorICogcmVxdWlyZWQgSU5TVEVBRCBPRiB0aGUgYWJvdmUgcmVzdHJpY3Rpb25zLiAgKFRoaXMgY2xhdXNlIGlzCisgKiBuZWNlc3NhcnkgZHVlIHRvIGEgcG90ZW50aWFsIGJhZCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBHUEwgYW5kCisgKiB0aGUgcmVzdHJpY3Rpb25zIGNvbnRhaW5lZCBpbiBhIEJTRC1zdHlsZSBjb3B5cmlnaHQuKQorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIFRoaXMgaXMgdGhlIDY1RUMwMiBjb2RlIGJ5IEp1a2thIE1hcmluIHRoYXQgaXMgZXhlY3V0ZWQgYnkKKyAgIHRoZSBBMjIzMidzIDY1RUMwMiBwcm9jZXNzb3IgKGJhc2UgYWRkcmVzczogMHgzODAwKQorICAgU291cmNlIGZpbGU6CXNlcl9hMjIzMmZ3LmF4CisgICBWZXJzaW9uOgkxLjMgKDk1MTAyOSkKKyAgIEtub3duIEJ1Z3M6CUNhbm5vdCBzZW5kIGEgYnJlYWsgeWV0CisqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYTIyMzJfNjVFQzAyY29kZVtdID0geworCTB4MzgsIDB4MDAsIDB4QTIsIDB4RkYsIDB4OUEsIDB4RDgsIDB4QTIsIDB4MDAsIAorCTB4QTksIDB4MDAsIDB4QTAsIDB4NTQsIDB4OTUsIDB4MDAsIDB4RTgsIDB4ODgsIAorCTB4RDAsIDB4RkEsIDB4NjQsIDB4NUMsIDB4NjQsIDB4NUUsIDB4NjQsIDB4NTgsIAorCTB4NjQsIDB4NTksIDB4QTksIDB4MDAsIDB4ODUsIDB4NTUsIDB4QTksIDB4QUEsIAorCTB4QzksIDB4NjQsIDB4OTAsIDB4MDIsIDB4RTYsIDB4NTUsIDB4QTUsIDB4NTQsIAorCTB4RjAsIDB4MDMsIDB4NEMsIDB4OTIsIDB4MzgsIDB4QTksIDB4OTgsIDB4OEQsIAorCTB4MDYsIDB4NDQsIDB4QTksIDB4MEIsIDB4OEQsIDB4MDQsIDB4NDQsIDB4QUQsIAorCTB4MDIsIDB4NDQsIDB4QTksIDB4ODAsIDB4OEQsIDB4MUEsIDB4N0MsIDB4QTksIAorCTB4RkYsIDB4OEQsIDB4MDgsIDB4N0MsIDB4OEQsIDB4MEEsIDB4N0MsIDB4QTIsIAorCTB4MDAsIDB4OEUsIDB4MDAsIDB4NDQsIDB4RUEsIDB4RUEsIDB4QUQsIDB4MDIsIAorCTB4NDQsIDB4RUEsIDB4RUEsIDB4OEUsIDB4MDAsIDB4NDQsIDB4QUQsIDB4MDIsIAorCTB4NDQsIDB4MjksIDB4MTAsIDB4RjAsIDB4RjksIDB4QTksIDB4MTEsIDB4OEUsIAorCTB4MDAsIDB4NDQsIDB4OEQsIDB4MUMsIDB4N0MsIDB4QUQsIDB4MDIsIDB4NDQsIAorCTB4MjksIDB4MTAsIDB4RjAsIDB4RjksIDB4OEUsIDB4MUMsIDB4N0MsIDB4QUQsIAorCTB4MDgsIDB4N0MsIDB4ODUsIDB4NTcsIDB4QUQsIDB4MEEsIDB4N0MsIDB4ODUsIAorCTB4NTYsIDB4QzksIDB4RDAsIDB4OTAsIDB4MDUsIDB4QTksIDB4MDIsIDB4NEMsIAorCTB4ODIsIDB4MzgsIDB4QTksIDB4MDEsIDB4ODUsIDB4NTQsIDB4QTksIDB4MDAsIAorCTB4OEQsIDB4MDIsIDB4NDQsIDB4OEQsIDB4MDYsIDB4NDQsIDB4OEQsIDB4MDQsIAorCTB4NDQsIDB4NEMsIDB4OTIsIDB4MzgsIDB4QUQsIDB4MDAsIDB4N0MsIDB4QzUsIAorCTB4NUMsIDB4RjAsIDB4MUYsIDB4QzUsIDB4NUUsIDB4RjAsIDB4MDksIDB4ODUsIAorCTB4NUUsIDB4QTksIDB4NDAsIDB4ODUsIDB4NUQsIDB4NEMsIDB4QjgsIDB4MzgsIAorCTB4QzYsIDB4NUQsIDB4MTAsIDB4MEUsIDB4QTYsIDB4NTgsIDB4OUQsIDB4MDAsIAorCTB4MTcsIDB4RTgsIDB4RTQsIDB4NTksIDB4RjAsIDB4MDQsIDB4ODYsIDB4NTgsIAorCTB4ODUsIDB4NUMsIDB4MjAsIDB4MjMsIDB4M0EsIDB4QTUsIDB4MDcsIDB4RjAsIAorCTB4MEYsIDB4QTUsIDB4MEEsIDB4ODUsIDB4MEIsIDB4QTUsIDB4MDgsIDB4MDksIAorCTB4MTAsIDB4OEQsIDB4MDYsIDB4NDQsIDB4NjQsIDB4MDIsIDB4NjQsIDB4MDcsIAorCTB4QTUsIDB4MDAsIDB4RTUsIDB4MDEsIDB4QzksIDB4QzgsIDB4QTUsIDB4MDksIAorCTB4MjksIDB4RjMsIDB4QjAsIDB4MDIsIDB4MDksIDB4MDgsIDB4OEQsIDB4MDQsIAorCTB4NDQsIDB4QTUsIDB4MDYsIDB4RjAsIDB4MDgsIDB4QTUsIDB4MDMsIDB4ODUsIAorCTB4MDQsIDB4NjQsIDB4MDIsIDB4NjQsIDB4MDYsIDB4MjAsIDB4MjMsIDB4M0EsIAorCTB4QTUsIDB4MTMsIDB4RjAsIDB4MEYsIDB4QTUsIDB4MTYsIDB4ODUsIDB4MTcsIAorCTB4QTUsIDB4MTQsIDB4MDksIDB4MTAsIDB4OEQsIDB4MDYsIDB4NEMsIDB4NjQsIAorCTB4MEUsIDB4NjQsIDB4MTMsIDB4QTUsIDB4MEMsIDB4RTUsIDB4MEQsIDB4QzksIAorCTB4QzgsIDB4QTUsIDB4MTUsIDB4MjksIDB4RjMsIDB4QjAsIDB4MDIsIDB4MDksIAorCTB4MDgsIDB4OEQsIDB4MDQsIDB4NEMsIDB4QTUsIDB4MTIsIDB4RjAsIDB4MDgsIAorCTB4QTUsIDB4MEYsIDB4ODUsIDB4MTAsIDB4NjQsIDB4MEUsIDB4NjQsIDB4MTIsIAorCTB4MjAsIDB4MjMsIDB4M0EsIDB4QTUsIDB4MUYsIDB4RjAsIDB4MEYsIDB4QTUsIAorCTB4MjIsIDB4ODUsIDB4MjMsIDB4QTUsIDB4MjAsIDB4MDksIDB4MTAsIDB4OEQsIAorCTB4MDYsIDB4NTQsIDB4NjQsIDB4MUEsIDB4NjQsIDB4MUYsIDB4QTUsIDB4MTgsIAorCTB4RTUsIDB4MTksIDB4QzksIDB4QzgsIDB4QTUsIDB4MjEsIDB4MjksIDB4RjMsIAorCTB4QjAsIDB4MDIsIDB4MDksIDB4MDgsIDB4OEQsIDB4MDQsIDB4NTQsIDB4QTUsIAorCTB4MUUsIDB4RjAsIDB4MDgsIDB4QTUsIDB4MUIsIDB4ODUsIDB4MUMsIDB4NjQsIAorCTB4MUEsIDB4NjQsIDB4MUUsIDB4MjAsIDB4MjMsIDB4M0EsIDB4QTUsIDB4MkIsIAorCTB4RjAsIDB4MEYsIDB4QTUsIDB4MkUsIDB4ODUsIDB4MkYsIDB4QTUsIDB4MkMsIAorCTB4MDksIDB4MTAsIDB4OEQsIDB4MDYsIDB4NUMsIDB4NjQsIDB4MjYsIDB4NjQsIAorCTB4MkIsIDB4QTUsIDB4MjQsIDB4RTUsIDB4MjUsIDB4QzksIDB4QzgsIDB4QTUsIAorCTB4MkQsIDB4MjksIDB4RjMsIDB4QjAsIDB4MDIsIDB4MDksIDB4MDgsIDB4OEQsIAorCTB4MDQsIDB4NUMsIDB4QTUsIDB4MkEsIDB4RjAsIDB4MDgsIDB4QTUsIDB4MjcsIAorCTB4ODUsIDB4MjgsIDB4NjQsIDB4MjYsIDB4NjQsIDB4MkEsIDB4MjAsIDB4MjMsIAorCTB4M0EsIDB4QTUsIDB4MzcsIDB4RjAsIDB4MEYsIDB4QTUsIDB4M0EsIDB4ODUsIAorCTB4M0IsIDB4QTUsIDB4MzgsIDB4MDksIDB4MTAsIDB4OEQsIDB4MDYsIDB4NjQsIAorCTB4NjQsIDB4MzIsIDB4NjQsIDB4MzcsIDB4QTUsIDB4MzAsIDB4RTUsIDB4MzEsIAorCTB4QzksIDB4QzgsIDB4QTUsIDB4MzksIDB4MjksIDB4RjMsIDB4QjAsIDB4MDIsIAorCTB4MDksIDB4MDgsIDB4OEQsIDB4MDQsIDB4NjQsIDB4QTUsIDB4MzYsIDB4RjAsIAorCTB4MDgsIDB4QTUsIDB4MzMsIDB4ODUsIDB4MzQsIDB4NjQsIDB4MzIsIDB4NjQsIAorCTB4MzYsIDB4MjAsIDB4MjMsIDB4M0EsIDB4QTUsIDB4NDMsIDB4RjAsIDB4MEYsIAorCTB4QTUsIDB4NDYsIDB4ODUsIDB4NDcsIDB4QTUsIDB4NDQsIDB4MDksIDB4MTAsIAorCTB4OEQsIDB4MDYsIDB4NkMsIDB4NjQsIDB4M0UsIDB4NjQsIDB4NDMsIDB4QTUsIAorCTB4M0MsIDB4RTUsIDB4M0QsIDB4QzksIDB4QzgsIDB4QTUsIDB4NDUsIDB4MjksIAorCTB4RjMsIDB4QjAsIDB4MDIsIDB4MDksIDB4MDgsIDB4OEQsIDB4MDQsIDB4NkMsIAorCTB4QTUsIDB4NDIsIDB4RjAsIDB4MDgsIDB4QTUsIDB4M0YsIDB4ODUsIDB4NDAsIAorCTB4NjQsIDB4M0UsIDB4NjQsIDB4NDIsIDB4MjAsIDB4MjMsIDB4M0EsIDB4QTUsIAorCTB4NEYsIDB4RjAsIDB4MEYsIDB4QTUsIDB4NTIsIDB4ODUsIDB4NTMsIDB4QTUsIAorCTB4NTAsIDB4MDksIDB4MTAsIDB4OEQsIDB4MDYsIDB4NzQsIDB4NjQsIDB4NEEsIAorCTB4NjQsIDB4NEYsIDB4QTUsIDB4NDgsIDB4RTUsIDB4NDksIDB4QzksIDB4QzgsIAorCTB4QTUsIDB4NTEsIDB4MjksIDB4RjMsIDB4QjAsIDB4MDIsIDB4MDksIDB4MDgsIAorCTB4OEQsIDB4MDQsIDB4NzQsIDB4QTUsIDB4NEUsIDB4RjAsIDB4MDgsIDB4QTUsIAorCTB4NEIsIDB4ODUsIDB4NEMsIDB4NjQsIDB4NEEsIDB4NjQsIDB4NEUsIDB4MjAsIAorCTB4MjMsIDB4M0EsIDB4NEMsIDB4OTIsIDB4MzgsIDB4QUQsIDB4MDIsIDB4NDQsIAorCTB4ODksIDB4MDgsIDB4RjAsIDB4M0IsIDB4ODksIDB4MDIsIDB4RjAsIDB4MUIsIAorCTB4QUQsIDB4MDAsIDB4NDQsIDB4RDAsIDB4MzIsIDB4QTYsIDB4MDAsIDB4QTksIAorCTB4MDEsIDB4OUQsIDB4MDAsIDB4MTAsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIAorCTB4MDksIDB4RTgsIDB4RTQsIDB4MDEsIDB4RjAsIDB4MDIsIDB4ODYsIDB4MDAsIAorCTB4NEMsIDB4NjUsIDB4M0EsIDB4QTYsIDB4MDAsIDB4QUQsIDB4MDAsIDB4NDQsIAorCTB4OUQsIDB4MDAsIDB4MDksIDB4OUUsIDB4MDAsIDB4MTAsIDB4RTgsIDB4RTQsIAorCTB4MDEsIDB4RjAsIDB4MDIsIDB4ODYsIDB4MDAsIDB4MjksIDB4N0YsIDB4QzksIAorCTB4MTMsIDB4RDAsIDB4MDQsIDB4QTUsIDB4MEIsIDB4ODUsIDB4MDIsIDB4QUQsIAorCTB4MDIsIDB4NDQsIDB4MjksIDB4MTAsIDB4RjAsIDB4MkMsIDB4QTYsIDB4MDUsIAorCTB4RjAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4MDEsIDB4RDAsIAorCTB4MjEsIDB4OEUsIDB4MDAsIDB4NDQsIDB4NjQsIDB4MDUsIDB4NEMsIDB4OTgsIAorCTB4M0EsIDB4QTYsIDB4MDQsIDB4RTQsIDB4MDMsIDB4RjAsIDB4MTMsIDB4QTUsIAorCTB4MDIsIDB4RDAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4MDEsIAorCTB4RDAsIDB4MDgsIDB4QkQsIDB4MDAsIDB4MDIsIDB4OEQsIDB4MDAsIDB4NDQsIAorCTB4RTYsIDB4MDQsIDB4QUQsIDB4MDIsIDB4NEMsIDB4ODksIDB4MDgsIDB4RjAsIAorCTB4M0IsIDB4ODksIDB4MDIsIDB4RjAsIDB4MUIsIDB4QUQsIDB4MDAsIDB4NEMsIAorCTB4RDAsIDB4MzIsIDB4QTYsIDB4MEMsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIAorCTB4MTEsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MEEsIDB4RTgsIDB4RTQsIAorCTB4MEQsIDB4RjAsIDB4MDIsIDB4ODYsIDB4MEMsIDB4NEMsIDB4REEsIDB4M0EsIAorCTB4QTYsIDB4MEMsIDB4QUQsIDB4MDAsIDB4NEMsIDB4OUQsIDB4MDAsIDB4MEEsIAorCTB4OUUsIDB4MDAsIDB4MTEsIDB4RTgsIDB4RTQsIDB4MEQsIDB4RjAsIDB4MDIsIAorCTB4ODYsIDB4MEMsIDB4MjksIDB4N0YsIDB4QzksIDB4MTMsIDB4RDAsIDB4MDQsIAorCTB4QTUsIDB4MTcsIDB4ODUsIDB4MEUsIDB4QUQsIDB4MDIsIDB4NEMsIDB4MjksIAorCTB4MTAsIDB4RjAsIDB4MkMsIDB4QTYsIDB4MTEsIDB4RjAsIDB4MEYsIDB4QUQsIAorCTB4MDIsIDB4N0MsIDB4MjksIDB4MDIsIDB4RDAsIDB4MjEsIDB4OEUsIDB4MDAsIAorCTB4NEMsIDB4NjQsIDB4MTEsIDB4NEMsIDB4MEQsIDB4M0IsIDB4QTYsIDB4MTAsIAorCTB4RTQsIDB4MEYsIDB4RjAsIDB4MTMsIDB4QTUsIDB4MEUsIDB4RDAsIDB4MEYsIAorCTB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4MDIsIDB4RDAsIDB4MDgsIDB4QkQsIAorCTB4MDAsIDB4MDMsIDB4OEQsIDB4MDAsIDB4NEMsIDB4RTYsIDB4MTAsIDB4QUQsIAorCTB4MDIsIDB4NTQsIDB4ODksIDB4MDgsIDB4RjAsIDB4M0IsIDB4ODksIDB4MDIsIAorCTB4RjAsIDB4MUIsIDB4QUQsIDB4MDAsIDB4NTQsIDB4RDAsIDB4MzIsIDB4QTYsIAorCTB4MTgsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MTIsIDB4QTksIDB4MDEsIAorCTB4OUQsIDB4MDAsIDB4MEIsIDB4RTgsIDB4RTQsIDB4MTksIDB4RjAsIDB4MDIsIAorCTB4ODYsIDB4MTgsIDB4NEMsIDB4NEYsIDB4M0IsIDB4QTYsIDB4MTgsIDB4QUQsIAorCTB4MDAsIDB4NTQsIDB4OUQsIDB4MDAsIDB4MEIsIDB4OUUsIDB4MDAsIDB4MTIsIAorCTB4RTgsIDB4RTQsIDB4MTksIDB4RjAsIDB4MDIsIDB4ODYsIDB4MTgsIDB4MjksIAorCTB4N0YsIDB4QzksIDB4MTMsIDB4RDAsIDB4MDQsIDB4QTUsIDB4MjMsIDB4ODUsIAorCTB4MUEsIDB4QUQsIDB4MDIsIDB4NTQsIDB4MjksIDB4MTAsIDB4RjAsIDB4MkMsIAorCTB4QTYsIDB4MUQsIDB4RjAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIAorCTB4MDQsIDB4RDAsIDB4MjEsIDB4OEUsIDB4MDAsIDB4NTQsIDB4NjQsIDB4MUQsIAorCTB4NEMsIDB4ODIsIDB4M0IsIDB4QTYsIDB4MUMsIDB4RTQsIDB4MUIsIDB4RjAsIAorCTB4MTMsIDB4QTUsIDB4MUEsIDB4RDAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIAorCTB4MjksIDB4MDQsIDB4RDAsIDB4MDgsIDB4QkQsIDB4MDAsIDB4MDQsIDB4OEQsIAorCTB4MDAsIDB4NTQsIDB4RTYsIDB4MUMsIDB4QUQsIDB4MDIsIDB4NUMsIDB4ODksIAorCTB4MDgsIDB4RjAsIDB4M0IsIDB4ODksIDB4MDIsIDB4RjAsIDB4MUIsIDB4QUQsIAorCTB4MDAsIDB4NUMsIDB4RDAsIDB4MzIsIDB4QTYsIDB4MjQsIDB4QTksIDB4MDEsIAorCTB4OUQsIDB4MDAsIDB4MTMsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MEMsIAorCTB4RTgsIDB4RTQsIDB4MjUsIDB4RjAsIDB4MDIsIDB4ODYsIDB4MjQsIDB4NEMsIAorCTB4QzQsIDB4M0IsIDB4QTYsIDB4MjQsIDB4QUQsIDB4MDAsIDB4NUMsIDB4OUQsIAorCTB4MDAsIDB4MEMsIDB4OUUsIDB4MDAsIDB4MTMsIDB4RTgsIDB4RTQsIDB4MjUsIAorCTB4RjAsIDB4MDIsIDB4ODYsIDB4MjQsIDB4MjksIDB4N0YsIDB4QzksIDB4MTMsIAorCTB4RDAsIDB4MDQsIDB4QTUsIDB4MkYsIDB4ODUsIDB4MjYsIDB4QUQsIDB4MDIsIAorCTB4NUMsIDB4MjksIDB4MTAsIDB4RjAsIDB4MkMsIDB4QTYsIDB4MjksIDB4RjAsIAorCTB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4MDgsIDB4RDAsIDB4MjEsIAorCTB4OEUsIDB4MDAsIDB4NUMsIDB4NjQsIDB4MjksIDB4NEMsIDB4RjcsIDB4M0IsIAorCTB4QTYsIDB4MjgsIDB4RTQsIDB4MjcsIDB4RjAsIDB4MTMsIDB4QTUsIDB4MjYsIAorCTB4RDAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4MDgsIDB4RDAsIAorCTB4MDgsIDB4QkQsIDB4MDAsIDB4MDUsIDB4OEQsIDB4MDAsIDB4NUMsIDB4RTYsIAorCTB4MjgsIDB4QUQsIDB4MDIsIDB4NjQsIDB4ODksIDB4MDgsIDB4RjAsIDB4M0IsIAorCTB4ODksIDB4MDIsIDB4RjAsIDB4MUIsIDB4QUQsIDB4MDAsIDB4NjQsIDB4RDAsIAorCTB4MzIsIDB4QTYsIDB4MzAsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MTQsIAorCTB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MEQsIDB4RTgsIDB4RTQsIDB4MzEsIAorCTB4RjAsIDB4MDIsIDB4ODYsIDB4MzAsIDB4NEMsIDB4MzksIDB4M0MsIDB4QTYsIAorCTB4MzAsIDB4QUQsIDB4MDAsIDB4NjQsIDB4OUQsIDB4MDAsIDB4MEQsIDB4OUUsIAorCTB4MDAsIDB4MTQsIDB4RTgsIDB4RTQsIDB4MzEsIDB4RjAsIDB4MDIsIDB4ODYsIAorCTB4MzAsIDB4MjksIDB4N0YsIDB4QzksIDB4MTMsIDB4RDAsIDB4MDQsIDB4QTUsIAorCTB4M0IsIDB4ODUsIDB4MzIsIDB4QUQsIDB4MDIsIDB4NjQsIDB4MjksIDB4MTAsIAorCTB4RjAsIDB4MkMsIDB4QTYsIDB4MzUsIDB4RjAsIDB4MEYsIDB4QUQsIDB4MDIsIAorCTB4N0MsIDB4MjksIDB4MTAsIDB4RDAsIDB4MjEsIDB4OEUsIDB4MDAsIDB4NjQsIAorCTB4NjQsIDB4MzUsIDB4NEMsIDB4NkMsIDB4M0MsIDB4QTYsIDB4MzQsIDB4RTQsIAorCTB4MzMsIDB4RjAsIDB4MTMsIDB4QTUsIDB4MzIsIDB4RDAsIDB4MEYsIDB4QUQsIAorCTB4MDIsIDB4N0MsIDB4MjksIDB4MTAsIDB4RDAsIDB4MDgsIDB4QkQsIDB4MDAsIAorCTB4MDYsIDB4OEQsIDB4MDAsIDB4NjQsIDB4RTYsIDB4MzQsIDB4QUQsIDB4MDIsIAorCTB4NkMsIDB4ODksIDB4MDgsIDB4RjAsIDB4M0IsIDB4ODksIDB4MDIsIDB4RjAsIAorCTB4MUIsIDB4QUQsIDB4MDAsIDB4NkMsIDB4RDAsIDB4MzIsIDB4QTYsIDB4M0MsIAorCTB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MTUsIDB4QTksIDB4MDEsIDB4OUQsIAorCTB4MDAsIDB4MEUsIDB4RTgsIDB4RTQsIDB4M0QsIDB4RjAsIDB4MDIsIDB4ODYsIAorCTB4M0MsIDB4NEMsIDB4QUUsIDB4M0MsIDB4QTYsIDB4M0MsIDB4QUQsIDB4MDAsIAorCTB4NkMsIDB4OUQsIDB4MDAsIDB4MEUsIDB4OUUsIDB4MDAsIDB4MTUsIDB4RTgsIAorCTB4RTQsIDB4M0QsIDB4RjAsIDB4MDIsIDB4ODYsIDB4M0MsIDB4MjksIDB4N0YsIAorCTB4QzksIDB4MTMsIDB4RDAsIDB4MDQsIDB4QTUsIDB4NDcsIDB4ODUsIDB4M0UsIAorCTB4QUQsIDB4MDIsIDB4NkMsIDB4MjksIDB4MTAsIDB4RjAsIDB4MkMsIDB4QTYsIAorCTB4NDEsIDB4RjAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4MjAsIAorCTB4RDAsIDB4MjEsIDB4OEUsIDB4MDAsIDB4NkMsIDB4NjQsIDB4NDEsIDB4NEMsIAorCTB4RTEsIDB4M0MsIDB4QTYsIDB4NDAsIDB4RTQsIDB4M0YsIDB4RjAsIDB4MTMsIAorCTB4QTUsIDB4M0UsIDB4RDAsIDB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIAorCTB4MjAsIDB4RDAsIDB4MDgsIDB4QkQsIDB4MDAsIDB4MDcsIDB4OEQsIDB4MDAsIAorCTB4NkMsIDB4RTYsIDB4NDAsIDB4QUQsIDB4MDIsIDB4NzQsIDB4ODksIDB4MDgsIAorCTB4RjAsIDB4M0IsIDB4ODksIDB4MDIsIDB4RjAsIDB4MUIsIDB4QUQsIDB4MDAsIAorCTB4NzQsIDB4RDAsIDB4MzIsIDB4QTYsIDB4NDgsIDB4QTksIDB4MDEsIDB4OUQsIAorCTB4MDAsIDB4MTYsIDB4QTksIDB4MDEsIDB4OUQsIDB4MDAsIDB4MEYsIDB4RTgsIAorCTB4RTQsIDB4NDksIDB4RjAsIDB4MDIsIDB4ODYsIDB4NDgsIDB4NEMsIDB4MjMsIAorCTB4M0QsIDB4QTYsIDB4NDgsIDB4QUQsIDB4MDAsIDB4NzQsIDB4OUQsIDB4MDAsIAorCTB4MEYsIDB4OUUsIDB4MDAsIDB4MTYsIDB4RTgsIDB4RTQsIDB4NDksIDB4RjAsIAorCTB4MDIsIDB4ODYsIDB4NDgsIDB4MjksIDB4N0YsIDB4QzksIDB4MTMsIDB4RDAsIAorCTB4MDQsIDB4QTUsIDB4NTMsIDB4ODUsIDB4NEEsIDB4QUQsIDB4MDIsIDB4NzQsIAorCTB4MjksIDB4MTAsIDB4RjAsIDB4MkMsIDB4QTYsIDB4NEQsIDB4RjAsIDB4MEYsIAorCTB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4NDAsIDB4RDAsIDB4MjEsIDB4OEUsIAorCTB4MDAsIDB4NzQsIDB4NjQsIDB4NEQsIDB4NEMsIDB4NTYsIDB4M0QsIDB4QTYsIAorCTB4NEMsIDB4RTQsIDB4NEIsIDB4RjAsIDB4MTMsIDB4QTUsIDB4NEEsIDB4RDAsIAorCTB4MEYsIDB4QUQsIDB4MDIsIDB4N0MsIDB4MjksIDB4NDAsIDB4RDAsIDB4MDgsIAorCTB4QkQsIDB4MDAsIDB4MDgsIDB4OEQsIDB4MDAsIDB4NzQsIDB4RTYsIDB4NEMsIAorCTB4NjAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4RDAsIDB4MDAsIDB4MzgsIAorCTB4Q0UsIDB4QzAsIAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYyBiL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmRlYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCkBAIC0wLDAgKzEsMjg1OCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYworICoKKyAqIERyaXZlciBmb3IgTVZNRTE2Ni83IGJvYXJkIHNlcmlhbCBwb3J0cywgd2hpY2ggYXJlIHZpYSBhIENEMjQwMS4KKyAqIEJhc2VkIHZlcnkgbXVjaCBvbiBjeWNsYWRlcy5jLgorICoKKyAqIE1WTUUxNjYvNyB3b3JrIGJ5IFJpY2hhcmQgSGlyc3QgW3JpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51a10KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIHN0YXRpYyBjaGFyIHJjc2lkW10gPQorICogIiRSZXZpc2lvbjogMS4zNi4xLjQgJCREYXRlOiAxOTk1LzAzLzI5IDA2OjE0OjE0ICQiOworICoKKyAqICBsaW51eC9rZXJuZWwvY3ljbGFkZXMuYworICoKKyAqIE1haW50YWluZWQgYnkgTWFyY2lvIFNhaXRvIChjeWNsYWRlc0BuZXRjb20uY29tKSBhbmQKKyAqIFJhbmRvbHBoIEJlbnRzb24gKGJlbnRzb25AZ3JpZWcuc2Vhc2x1Zy5vcmcpCisgKgorICogTXVjaCBvZiB0aGUgZGVzaWduIGFuZCBzb21lIG9mIHRoZSBjb2RlIGNhbWUgZnJvbSBzZXJpYWwuYworICogd2hpY2ggd2FzIGNvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMuICBJdCB3YXMKKyAqIGV4dGVuc2l2ZWx5IHJld3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCA4LzE2LzkyIC0tIDkvMTQvOTIsCisgKiBhbmQgdGhlbiBmaXhlZCBhcyBzdWdnZXN0ZWQgYnkgTWljaGFlbCBLLiBKb2huc29uIDEyLzEyLzkyLgorICoKKyAqIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBpcnEncy4KKyAqCisgKiAkTG9nOiBjeWNsYWRlcy5jLHYgJAorICogUmV2aXNpb24gMS4zNi4xLjQgIDE5OTUvMDMvMjkgIDA2OjE0OjE0ICBiZW50c29uCisgKiBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBDeWNsb20tMTZZIGFuZCBDeWNsb20tMzJZZTsKKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIDIwMCBsaW5lcyBvZiBjaGFuZ2VzIHJlY29yZCByZW1vdmVkIC0gUkdIIDExLTEwLTk1LCBzdGFydGluZyB3b3JrIG9uCisgKiBjb252ZXJ0aW5nIHRoaXMgdG8gZHJpdmUgc2VyaWFsIHBvcnRzIG9uIG12bWUxNjYgKGNkMjQwMSkuCisgKgorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0gMjAwMC8wOC8yNQorICogLSBnZXQgcmlkIG9mIHZlcmlmeV9hcmVhCisgKiAtIHVzZSBnZXRfdXNlciB0byBhY2Nlc3MgbWVtb3J5IGZyb20gdXNlcnNwYWNlIGluIHNldF90aHJlc2hvbGQsCisgKiAgIHNldF9kZWZhdWx0X3RocmVzaG9sZCBhbmQgc2V0X3RpbWVvdXQKKyAqIC0gZG9uJ3QgdXNlIHRoZSBwYW5pYyBmdW5jdGlvbiBpbiBzZXJpYWwxNjdfaW5pdAorICogLSBkbyByZXNvdXJjZSByZWxlYXNlIG9uIGZhaWx1cmUgb24gc2VyaWFsMTY3X2luaXQKKyAqIC0gaW5jbHVkZSBtaXNzaW5nIHJlc3RvcmVfZmxhZ3MgaW4gbXZtZTE2N19zZXJpYWxfY29uc29sZV9zZXR1cAorICoKKyAqIEthcnMgZGUgSm9uZyA8am9uZ2tAbGludXgtbTY4ay5vcmc+IC0gMjAwNC8wOS8wNgorICogLSByZXBsYWNlIGJvdHRvbSBoYWxmIGhhbmRsZXIgd2l0aCB0YXNrIHF1ZXVlIGhhbmRsZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsUC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsMTY3Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tdm1lMTZ4aHcuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyN1bmRlZiAgU0VSSUFMX0RFQlVHX09QRU4KKyN1bmRlZiAgU0VSSUFMX0RFQlVHX1RIUk9UVExFCisjdW5kZWYgIFNFUklBTF9ERUJVR19PVEhFUgorI3VuZGVmICBTRVJJQUxfREVCVUdfSU8KKyN1bmRlZiAgU0VSSUFMX0RFQlVHX0NPVU5UCisjdW5kZWYgIFNFUklBTF9ERUJVR19EVFIKKyN1bmRlZiAgQ1lDTE9NXzE2WV9IQUNLCisjZGVmaW5lICBDWUNMT01fRU5BQkxFX01PTklUT1JJTkcKKworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKKyNkZWZpbmUgU1REX0NPTV9GTEFHUyAoMCkKKworI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwgIDEKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpjeV9zZXJpYWxfZHJpdmVyOworZXh0ZXJuIGludCBzZXJpYWxfY29uc29sZTsKK3N0YXRpYyBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqc2VyaWFsX2NvbnNvbGVfaW5mbyA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgaW50IHNlcmlhbF9jb25zb2xlX2NmbGFnID0gMDsKK3VfY2hhciBpbml0aWFsX2NvbnNvbGVfc3BlZWQ7CisKKy8qIEJhc2UgYWRkcmVzcyBvZiBjZDI0MDEgY2hpcCBvbiBtdm1lMTY2LzcgKi8KKworI2RlZmluZSBCQVNFX0FERFIgKDB4ZmZmNDUwMDApCisjZGVmaW5lIHBjYzJjaGlwCSgodm9sYXRpbGUgdV9jaGFyICopMHhmZmY0MjAwMCkKKyNkZWZpbmUgUGNjU0NDTUlDUgkweDFkCisjZGVmaW5lIFBjY1NDQ1RJQ1IJMHgxZQorI2RlZmluZSBQY2NTQ0NSSUNSCTB4MWYKKyNkZWZpbmUgUGNjVFBJQUNLUgkweDI1CisjZGVmaW5lIFBjY1JQSUFDS1IJMHgyNworI2RlZmluZSBQY2NJTUxSCQkweDNmCisKKy8qIFRoaXMgaXMgdGhlIHBlci1wb3J0IGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgY3ljbGFkZXNfcG9ydCBjeV9wb3J0W10gPSB7CisgICAgICAvKiBDQVJEIyAgKi8KKyAgICAgICAgey0xIH0sICAgICAgLyogdHR5UzAgKi8KKyAgICAgICAgey0xIH0sICAgICAgLyogdHR5UzEgKi8KKyAgICAgICAgey0xIH0sICAgICAgLyogdHR5UzIgKi8KKyAgICAgICAgey0xIH0sICAgICAgLyogdHR5UzMgKi8KK307CisjZGVmaW5lIE5SX1BPUlRTICAgICAgICAoc2l6ZW9mKGN5X3BvcnQpL3NpemVvZihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCkpCisKKy8qCisgKiB0bXBfYnVmIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGJ5IHNlcmlhbF93cml0ZS4gIFdlIG5lZWQgdG8KKyAqIGxvY2sgaXQgaW4gY2FzZSB0aGUgY29weV9mcm9tX3VzZXIgYmxvY2tzIHdoaWxlIHN3YXBwaW5nIGluIGEgcGFnZSwKKyAqIGFuZCBzb21lIG90aGVyIHByb2dyYW0gdHJpZXMgdG8gZG8gYSBzZXJpYWwgd3JpdGUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNpbmNlIHRoZSBsb2NrIHdpbGwgb25seSBjb21lIHVuZGVyIGNvbnRlbnRpb24gd2hlbiB0aGUgc3lzdGVtIGlzCisgKiBzd2FwcGluZyBhbmQgYXZhaWxhYmxlIG1lbW9yeSBpcyBsb3csIGl0IG1ha2VzIHNlbnNlIHRvIHNoYXJlIG9uZQorICogYnVmZmVyIGFjcm9zcyBhbGwgdGhlIHNlcmlhbCBwb3J0cywgc2luY2UgaXQgc2lnbmlmaWNhbnRseSBzYXZlcworICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZiA9IDA7CitERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBsb29rIHVwIHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzCisgKiBXZSdyZSBub3JtYWxseSBsaW1pdGVkIHRvIDE1IGRpc3RpbmN0IGJhdWQgcmF0ZXMuICBUaGUgZXh0cmEKKyAqIGFyZSBhY2Nlc3NlZCB2aWEgc2V0dGluZ3MgaW4gaW5mby0+ZmxhZ3MuCisgKiAgICAgICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksCisgKiAgICAgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEkgICAgICAgICAgICBWSEkKKyAqLworc3RhdGljIGludCBiYXVkX3RhYmxlW10gPSB7CisgICAgICAgICAgIDAsICAgIDUwLCAgICA3NSwgICAxMTAsICAgMTM0LCAgIDE1MCwgICAyMDAsICAgMzAwLCAgIDYwMCwgIDEyMDAsCisgICAgICAgIDE4MDAsICAyNDAwLCAgNDgwMCwgIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDc2ODAwLDExNTIwMCwxNTAwMDAsCisgICAgICAgIDB9OworCisjaWYgMAorc3RhdGljIGNoYXIgYmF1ZF9jb1tdID0geyAgLyogMjUgTUh6IGNsb2NrIG9wdGlvbiB0YWJsZSAqLworICAgICAgICAvKiB2YWx1ZSA9PiAgICAwMCAgICAwMSAgIDAyICAgIDAzICAgIDA0ICovCisgICAgICAgIC8qIGRpdmlkZSBieSAgICA4ICAgIDMyICAgMTI4ICAgNTEyICAyMDQ4ICovCisgICAgICAgIDB4MDAsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDMsICAweDAzLCAgMHgwMywgIDB4MDIsCisgICAgICAgIDB4MDIsICAweDAyLCAgMHgwMSwgIDB4MDEsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDB9OworCitzdGF0aWMgY2hhciBiYXVkX2JwcltdID0geyAgLyogMjUgTUh6IGJhdWQgcmF0ZSBwZXJpb2QgdGFibGUgKi8KKyAgICAgICAgMHgwMCwgIDB4ZjUsICAweGEzLCAgMHg2ZiwgIDB4NWMsICAweDUxLCAgMHhmNSwgIDB4YTMsICAweDUxLCAgMHhhMywKKyAgICAgICAgMHg2ZCwgIDB4NTEsICAweGEzLCAgMHg1MSwgIDB4YTMsICAweDUxLCAgMHgzNiwgIDB4MjksICAweDFiLCAgMHgxNX07CisjZW5kaWYKKworLyogSSB0aGluayAxNjYgYnJkIGNsb2NrcyAyNDAxIGF0IDIwTUh6Li4uLiAqLworCisvKiBUaGVzZSB2YWx1ZXMgYXJlIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGNvciwgYW5kID4+IDUgZm9yIHdyaXRpbmcgdG8gcmNvciAqLworc3RhdGljIHVfY2hhciBiYXVkX2NvW10gPSB7ICAvKiAyMCBNSHogY2xvY2sgb3B0aW9uIHRhYmxlICovCisgICAgICAgIDB4MDAsICAweDgwLCAgMHg4MCwgIDB4ODAsICAweDgwLCAgMHg4MCwgIDB4ODAsICAweDYwLCAgMHg2MCwgIDB4NDAsCisgICAgICAgIDB4NDAsICAweDQwLCAgMHgyMCwgIDB4MjAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDB9OworCisvKiBUaGVzZSB2YWx1ZXMgd3JpdHRlbiBkaXJlY3RseSB0byB0YnByL3JicHIgKi8KK3N0YXRpYyB1X2NoYXIgYmF1ZF9icHJbXSA9IHsgIC8qIDIwIE1IeiBiYXVkIHJhdGUgcGVyaW9kIHRhYmxlICovCisgICAgICAgIDB4MDAsICAweGMwLCAgMHg4MCwgIDB4NTgsICAweDZjLCAgMHg0MCwgIDB4YzAsICAweDgxLCAgMHg0MCwgIDB4ODEsCisgICAgICAgIDB4NTcsICAweDQwLCAgMHg4MSwgIDB4NDAsICAweDgxLCAgMHg0MCwgIDB4MmIsICAweDIwLCAgMHgxNSwgIDB4MTB9OworCitzdGF0aWMgdV9jaGFyIGJhdWRfY29yNFtdID0geyAgLyogcmVjZWl2ZSB0aHJlc2hvbGQgKi8KKyAgICAgICAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwKKyAgICAgICAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwOSwgIDB4MDksICAweDA4LCAgMHgwOCwgIDB4MDgsICAweDA4LCAgMHgwN307CisKKworCitzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKTsKK3N0YXRpYyBpbnQgc3RhcnR1cCAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKik7CitzdGF0aWMgdm9pZCBjeV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGN5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBjb25maWdfc2V0dXAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKik7CitleHRlcm4gdm9pZCBjb25zb2xlX3ByaW50KGNvbnN0IGNoYXIgKik7CisjaWZkZWYgQ1lDTE9NX1NIT1dfU1RBVFVTCitzdGF0aWMgdm9pZCBzaG93X3N0YXR1cyhpbnQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUkVNT1RFX0RFQlVHCitzdGF0aWMgdm9pZCBkZWJ1Z19zZXR1cCh2b2lkKTsKK3ZvaWQgcXVldWVEZWJ1Z0NoYXIgKGludCBjKTsKK2ludCBnZXREZWJ1Z0NoYXIodm9pZCk7CisKKyNkZWZpbmUgREVCVUdfUE9SVAkxCisjZGVmaW5lIERFQlVHX0xFTgkyNTYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAlpbjsKKwlpbnQJb3V0OworCXVuc2lnbmVkIGNoYXIJYnVmW0RFQlVHX0xFTl07Cit9IGRlYnVncTsKKworZGVidWdxIGRlYnVnaXE7CisjZW5kaWYKKworLyoKKyAqIEkgaGF2ZSBteSBvd24gdmVyc2lvbiBvZiB1ZGVsYXkoKSwgYXMgaXQgaXMgbmVlZGVkIHdoZW4gaW5pdGlhbGlzaW5nCisgKiB0aGUgY2hpcCwgYmVmb3JlIHRoZSBkZWxheSBsb29wIGhhcyBiZWVuIGNhbGlicmF0ZWQuICBTaG91bGQgcHJvYmFibHkKKyAqIHJlZmVyZW5jZSBvbmUgb2YgdGhlIHZtZWNoaXAyIG9yIHBjY2NoaXAyIGNvdW50ZXIgZm9yIGFuIGFjY3VyYXRlCisgKiBkZWxheSwgYnV0IHRoaXMgd2lsZCBndWVzcyB3aWxsIGRvIGZvciBub3cuCisgKi8KKwordm9pZCBteV91ZGVsYXkgKGxvbmcgdXMpCit7CisJdV9jaGFyIHg7CisJdm9sYXRpbGUgdV9jaGFyICpwID0gJng7CisJaW50IGk7CisKKwl3aGlsZSAodXMtLSkKKwkJZm9yIChpID0gMTAwOyBpOyBpLS0pCisJCQl4IHw9ICpwOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCBjaGFyICpuYW1lLAorCQkgICAgICBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSworICAgIHN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHNlcmlhbCBzdHJ1Y3QgKCVzKSBpbiAlc1xuIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9CisJIldhcm5pbmc6IG51bGwgY3ljbGFkZXNfcG9ydCBmb3IgKCVzKSBpbiAlc1xuIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYmFkcmFuZ2UgPQorCSJXYXJuaW5nOiBjeWNsYWRlc19wb3J0IG91dCBvZiByYW5nZSBmb3IgKCVzKSBpbiAlc1xuIjsKKworICAgIGlmICghaW5mbykgeworCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiggKGxvbmcpaW5mbyA8IChsb25nKSgmY3lfcG9ydFswXSkKKyAgICB8fCAobG9uZykoJmN5X3BvcnRbTlJfUE9SVFNdKSA8IChsb25nKWluZm8gKXsKKwlwcmludGsoYmFkcmFuZ2UsIG5hbWUsIHJvdXRpbmUpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmIChpbmZvLT5tYWdpYyAhPSBDWUNMQURFU19NQUdJQykgeworCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9IC8qIHNlcmlhbF9wYXJhbm9pYV9jaGVjayAqLworCisjaWYgMAorLyogVGhlIGZvbGxvd2luZyBkaWFnbm9zdGljIHJvdXRpbmVzIGFsbG93IHRoZSBkcml2ZXIgdG8gc3BldworICAgaW5mb3JtYXRpb24gb24gdGhlIHNjcmVlbiwgZXZlbiAoZXNwZWNpYWxseSEpIGR1cmluZyBpbnRlcnJ1cHRzLgorICovCit2b2lkCitTUChjaGFyICpkYXRhKXsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIGNvbnNvbGVfcHJpbnQoZGF0YSk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorY2hhciBzY3JuWzJdOwordm9pZAorQ1AoY2hhciBkYXRhKXsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIHNjcm5bMF0gPSBkYXRhOworICAgICAgICBjb25zb2xlX3ByaW50KHNjcm4pOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30vKiBDUCAqLworCit2b2lkIENQMShpbnQgZGF0YSkgeyAoZGF0YTwxMCk/ICBDUChkYXRhKycwJyk6IENQKGRhdGErJ0EnLTEwKTsgfS8qIENQMSAqLwordm9pZCBDUDIoaW50IGRhdGEpIHsgQ1AxKChkYXRhPj40KSAmIDB4MGYpOyBDUDEoIGRhdGEgJiAweDBmKTsgfS8qIENQMiAqLwordm9pZCBDUDQoaW50IGRhdGEpIHsgQ1AyKChkYXRhPj44KSAmIDB4ZmYpOyBDUDIoZGF0YSAmIDB4ZmYpOyB9LyogQ1A0ICovCit2b2lkIENQOChsb25nIGRhdGEpIHsgQ1A0KChkYXRhPj4xNikgJiAweGZmZmYpOyBDUDQoZGF0YSAmIDB4ZmZmZik7IH0vKiBDUDggKi8KKyNlbmRpZgorCisvKiBUaGlzIHJvdXRpbmUgd2FpdHMgdXAgdG8gMTAwMCBtaWNyby1zZWNvbmRzIGZvciB0aGUgcHJldmlvdXMKKyAgIGNvbW1hbmQgdG8gdGhlIENpcnJ1cyBjaGlwIHRvIGNvbXBsZXRlIGFuZCB0aGVuIGlzc3VlcyB0aGUKKyAgIG5ldyBjb21tYW5kLiAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHByZXZpb3VzIGNvbW1hbmQKKyAgIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZSB0aW1lIGxpbWl0LgorICovCit1X3Nob3J0Cit3cml0ZV9jeV9jbWQodm9sYXRpbGUgdV9jaGFyICpiYXNlX2FkZHIsIHVfY2hhciBjbWQpCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIGludCAgaTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgcHJldmlvdXMgY29tbWFuZCBoYXMgY29tcGxldGVkICovCisJZm9yKGkgPSAwIDsgaSA8IDEwMCA7IGkrKyl7CisJICAgIGlmIChiYXNlX2FkZHJbQ3lDQ1JdID09IDApeworCQlicmVhazsKKwkgICAgfQorCSAgICBteV91ZGVsYXkoMTBMKTsKKwl9CisJLyogaWYgdGhlIENDUiBuZXZlciBjbGVhcmVkLCB0aGUgcHJldmlvdXMgY29tbWFuZAorCSAgICBkaWRuJ3QgZmluaXNoIHdpdGhpbiB0aGUgInJlYXNvbmFibGUgdGltZSIgKi8KKwlpZiAoIGkgPT0gMTAgKSB7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgcmV0dXJuICgtMSk7CisJfQorCisJLyogSXNzdWUgdGhlIG5ldyBjb21tYW5kICovCisJYmFzZV9hZGRyW0N5Q0NSXSA9IGNtZDsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgcmV0dXJuKDApOworfSAvKiB3cml0ZV9jeV9jbWQgKi8KKworCisvKiBjeV9zdGFydCBhbmQgY3lfc3RvcCBwcm92aWRlIHNvZnR3YXJlIG91dHB1dCBmbG93IGNvbnRyb2wgYXMgYQorICAgZnVuY3Rpb24gb2YgWE9OL1hPRkYsIHNvZnR3YXJlIENUUywgYW5kIG90aGVyIHN1Y2ggc3R1ZmYuICovCisKK3N0YXRpYyB2b2lkCitjeV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeV9zdG9wICVzXG4iLCB0dHktPm5hbWUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3N0b3AiKSkKKwlyZXR1cm47CisJCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIGJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKShjaGFubmVsKTsgLyogaW5kZXggY2hhbm5lbCAqLworICAgICAgICBiYXNlX2FkZHJbQ3lJRVJdICY9IH4oQ3lUeE1wdHl8Q3lUeFJkeSk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuOworfSAvKiBjeV9zdG9wICovCisKK3N0YXRpYyB2b2lkCitjeV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopQkFTRV9BRERSOworICBpbnQgY2hhbm5lbDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3lfc3RhcnQgJXNcbiIsIHR0eS0+bmFtZSk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfc3RhcnQiKSkKKwlyZXR1cm47CisJCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIGJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKShjaGFubmVsKTsKKyAgICAgICAgYmFzZV9hZGRyW0N5SUVSXSB8PSBDeVR4TXB0eTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3N0YXJ0ICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBzY2hlZHVsZQorICogcHJvY2Vzc2luZyBpbiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHBvcnRpb24gb2YgdGhlIGRyaXZlcgorICogKGFsc28ga25vd24gYXMgdGhlICJib3R0b20gaGFsZiIpLiAgVGhpcyBjYW4gYmUgY2FsbGVkIGFueQorICogbnVtYmVyIG9mIHRpbWVzIGZvciBhbnkgY2hhbm5lbCB3aXRob3V0IGhhcm0uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY3lfc2NoZWRfZXZlbnQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sIGludCBldmVudCkKK3sKKyAgICBpbmZvLT5ldmVudCB8PSAxIDw8IGV2ZW50OyAvKiByZW1lbWJlciB3aGF0IGtpbmQgb2YgZXZlbnQgYW5kIHdobyAqLworICAgIHNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7Cit9IC8qIGN5X3NjaGVkX2V2ZW50ICovCisKKworLyogVGhlIHJlYWwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgYXJlIGNhbGxlZAorICAgd2hlbmV2ZXIgdGhlIGNhcmQgd2FudHMgaXRzIGhhbmQgaGVsZC0tY2hhcnMKKyAgIHJlY2VpdmVkLCBvdXQgYnVmZmVyIGVtcHR5LCBtb2RlbSBjaGFuZ2UsIGV0Yy4KKyAqLworc3RhdGljIGlycXJldHVybl90CitjZDI0MDFfcnhlcnJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgICAgdW5zaWduZWQgY2hhciBlcnIsIHJmb2M7CisgICAgaW50IGNoYW5uZWw7CisgICAgY2hhciBkYXRhOworCisgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsIGFuZCBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCisgICAgY2hhbm5lbCA9ICh1X3Nob3J0ICkgKGJhc2VfYWRkcltDeUxJQ1JdID4+IDIpOworICAgIGluZm8gPSAmY3lfcG9ydFtjaGFubmVsXTsKKyAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisKKyAgICBpZiAoKGVyciA9IGJhc2VfYWRkcltDeVJJU1JdKSAmIEN5VElNRU9VVCkgeworCS8qIFRoaXMgaXMgYSByZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0LCBpZ25vcmUgaXQgKi8KKwliYXNlX2FkZHJbQ3lSRU9JUl0gPSBDeU5PVFJBTlM7CisJcmV0dXJuIElSUV9IQU5ETEVEOworICAgIH0KKworICAgIC8qIFJlYWQgYSBieXRlIG9mIGRhdGEgaWYgdGhlcmUgaXMgYW55IC0gYXNzdW1lIHRoZSBlcnJvcgorICAgICAqIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNoYXJhY3RlciAqLworCisgICAgaWYgKChyZm9jID0gYmFzZV9hZGRyW0N5UkZPQ10pICE9IDApCisJZGF0YSA9IGJhc2VfYWRkcltDeVJEUl07CisgICAgZWxzZQorCWRhdGEgPSAwOworCisgICAgLyogaWYgdGhlcmUgaXMgbm93aGVyZSB0byBwdXQgdGhlIGRhdGEsIGRpc2NhcmQgaXQgKi8KKyAgICBpZihpbmZvLT50dHkgPT0gMCkgeworCWJhc2VfYWRkcltDeVJFT0lSXSA9IHJmb2MgPyAwIDogQ3lOT1RSQU5TOworCXJldHVybiBJUlFfSEFORExFRDsKKyAgICB9CisgICAgZWxzZSB7IC8qIHRoZXJlIGlzIGFuIG9wZW4gcG9ydCBmb3IgdGhpcyBkYXRhICovCisJdHR5ID0gaW5mby0+dHR5OworCWlmKGVyciAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayl7CisJICAgIGJhc2VfYWRkcltDeVJFT0lSXSA9IHJmb2MgPyAwIDogQ3lOT1RSQU5TOworCSAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKXsKKwkgICAgdHR5LT5mbGlwLmNvdW50Kys7CisJICAgIGlmIChlcnIgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrKXsKKwkJaWYoZXJyICYgQ3lCUkVBSyl7CisJCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQkgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGRhdGE7CisJCSAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspeworCQkJZG9fU0FLKHR0eSk7CisJCSAgICB9CisJCX1lbHNlIGlmKGVyciAmIEN5RlJBTUUpeworCQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9GUkFNRTsKKwkJICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQl9ZWxzZSBpZihlcnIgJiBDeVBBUklUWSl7CisJCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX1BBUklUWTsKKwkJICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQl9ZWxzZSBpZihlcnIgJiBDeU9WRVJSVU4peworCQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9PVkVSUlVOOworCQkgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCSAgICAvKgorCQkgICAgICAgSWYgdGhlIGZsaXAgYnVmZmVyIGl0c2VsZiBpcworCQkgICAgICAgb3ZlcmZsb3dpbmcsIHdlIHN0aWxsIGxvb3NlCisJCSAgICAgICB0aGUgbmV4dCBpbmNvbWluZyBjaGFyYWN0ZXIuCisJCSAgICAgKi8KKwkJICAgIGlmKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpeworCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX05PUk1BTDsKKwkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQkgICAgfQorCQkvKiBUaGVzZSB0d28gY29uZGl0aW9ucyBtYXkgaW1wbHkgKi8KKwkJLyogYSBub3JtYWwgcmVhZCBzaG91bGQgYmUgZG9uZS4gKi8KKwkJLyogZWxzZSBpZihkYXRhICYgQ3lUSU1FT1VUKSAqLworCQkvKiBlbHNlIGlmKGRhdGEgJiBDeVNQRUNIQVIpICovCisJCX1lbHNleworCQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7CisJCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJfQorCSAgICB9ZWxzZXsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCSAgICB9CisJfWVsc2V7CisJICAgIC8qIHRoZXJlIHdhcyBhIHNvZnR3YXJlIGJ1ZmZlciBvdmVycnVuCisJICAgICAgIGFuZCBub3RoaW5nIGNvdWxkIGJlIGRvbmUgYWJvdXQgaXQhISEgKi8KKwl9CisgICAgfQorICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworICAgIC8qIGVuZCBvZiBzZXJ2aWNlICovCisgICAgYmFzZV9hZGRyW0N5UkVPSVJdID0gcmZvYyA/IDAgOiBDeU5PVFJBTlM7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiBjeV9yeGVycl9pbnRlcnJ1cHQgKi8KKworc3RhdGljIGlycXJldHVybl90CitjZDI0MDFfbW9kZW1faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopQkFTRV9BRERSOworICAgIGludCBjaGFubmVsOworICAgIGludCBtZG1fY2hhbmdlOworICAgIGludCBtZG1fc3RhdHVzOworCisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgYW5kIGNoYW5nZSB0byB0aGF0IGNvbnRleHQgKi8KKyAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoYmFzZV9hZGRyW0N5TElDUl0gPj4gMik7CisgICAgaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWxdOworICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKworICAgIG1kbV9jaGFuZ2UgPSBiYXNlX2FkZHJbQ3lNSVNSXTsKKyAgICBtZG1fc3RhdHVzID0gYmFzZV9hZGRyW0N5TVNWUjFdOworCisgICAgaWYoaW5mby0+dHR5ID09IDApeyAvKiBub3doZXJlIHRvIHB1dCB0aGUgZGF0YSwgaWdub3JlIGl0ICovCisJOworICAgIH1lbHNleworCWlmKChtZG1fY2hhbmdlICYgQ3lEQ0QpCisJJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpKXsKKwkgICAgaWYobWRtX3N0YXR1cyAmIEN5RENEKXsKKy8qIENQKCchJyk7ICovCisJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX09QRU5fV0FLRVVQKTsKKwkgICAgfSBlbHNlIHsKKy8qIENQKCdAJyk7ICovCisJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX0hBTkdVUCk7CisJICAgIH0KKwl9CisJaWYoKG1kbV9jaGFuZ2UgJiBDeUNUUykKKwkmJiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykpeworCSAgICBpZihpbmZvLT50dHktPnN0b3BwZWQpeworCQlpZihtZG1fc3RhdHVzICYgQ3lDVFMpeworCQkgICAgLyogISEhIGN5X3N0YXJ0IGlzbid0IHVzZWQgYmVjYXVzZS4uLiAqLworCQkgICAgaW5mby0+dHR5LT5zdG9wcGVkID0gMDsKKyAgICAgICAgCSAgICBiYXNlX2FkZHJbQ3lJRVJdIHw9IEN5VHhNcHR5OworCQkgICAgY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKwkJfQorCSAgICB9ZWxzZXsKKwkJaWYoIShtZG1fc3RhdHVzICYgQ3lDVFMpKXsKKwkJICAgIC8qICEhISBjeV9zdG9wIGlzbid0IHVzZWQgYmVjYXVzZS4uLiAqLworCQkgICAgaW5mby0+dHR5LT5zdG9wcGVkID0gMTsKKyAgICAgICAgCSAgICBiYXNlX2FkZHJbQ3lJRVJdICY9IH4oQ3lUeE1wdHl8Q3lUeFJkeSk7CisJCX0KKwkgICAgfQorCX0KKwlpZihtZG1fc3RhdHVzICYgQ3lEU1IpeworCX0KKyAgICB9CisgICAgYmFzZV9hZGRyW0N5TUVPSVJdID0gMDsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIGN5X21vZGVtX2ludGVycnVwdCAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2NkMjQwMV90eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgICAgaW50IGNoYW5uZWw7CisgICAgaW50IGNoYXJfY291bnQsIHNhdmVkX2NudDsKKyAgICBpbnQgb3V0Y2g7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgYW5kIGNoYW5nZSB0byB0aGF0IGNvbnRleHQgKi8KKyAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoYmFzZV9hZGRyW0N5TElDUl0gPj4gMik7CisKKyNpZmRlZiBDT05GSUdfUkVNT1RFX0RFQlVHCisgICAgaWYgKGNoYW5uZWwgPT0gREVCVUdfUE9SVCkgeworCXBhbmljICgiVHhJbnQgb24gZGVidWcgcG9ydCEhISIpOworICAgIH0KKyNlbmRpZgorCisgICAgaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWxdOworCisgICAgLyogdmFsaWRhdGUgdGhlIHBvcnQgbnVtYmVyIChhcyBjb25maWd1cmVkIGFuZCBvcGVuKSAqLworICAgIGlmKCAoY2hhbm5lbCA8IDApIHx8IChOUl9QT1JUUyA8PSBjaGFubmVsKSApeworCWJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eXxDeVR4UmR5KTsKKwliYXNlX2FkZHJbQ3lURU9JUl0gPSBDeU5PVFJBTlM7CisJcmV0dXJuIElSUV9IQU5ETEVEOworICAgIH0KKyAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisgICAgaWYoaW5mby0+dHR5ID09IDApeworCWJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eXxDeVR4UmR5KTsKKyAgICAgICAgaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1dSSVRFX1dBS0VVUCk7CisgICAgICAgIH0KKwliYXNlX2FkZHJbQ3lURU9JUl0gPSBDeU5PVFJBTlM7CisJcmV0dXJuIElSUV9IQU5ETEVEOworICAgIH0KKworICAgIC8qIGxvYWQgdGhlIG9uLWNoaXAgc3BhY2UgYXZhaWxhYmxlIGZvciBvdXRib3VuZCBkYXRhICovCisgICAgc2F2ZWRfY250ID0gY2hhcl9jb3VudCA9IGJhc2VfYWRkcltDeVRGVENdOworCisgICAgaWYoaW5mby0+eF9jaGFyKSB7IC8qIHNlbmQgc3BlY2lhbCBjaGFyICovCisJb3V0Y2ggPSBpbmZvLT54X2NoYXI7CisJYmFzZV9hZGRyW0N5VERSXSA9IG91dGNoOworCWNoYXJfY291bnQtLTsKKwlpbmZvLT54X2NoYXIgPSAwOworICAgIH0KKworICAgIGlmIChpbmZvLT54X2JyZWFrKXsKKwkvKiAgVGhlIENpcnJ1cyBjaGlwIHJlcXVpcmVzIHRoZSAiRW1iZWRkZWQgVHJhbnNtaXQKKwkgICAgQ29tbWFuZHMiIG9mIHN0YXJ0IGJyZWFrLCBkZWxheSwgYW5kIGVuZCBicmVhaworCSAgICBzZXF1ZW5jZXMgdG8gYmUgc2VudC4gIFRoZSBkdXJhdGlvbiBvZiB0aGUKKwkgICAgYnJlYWsgaXMgZ2l2ZW4gaW4gVElDcywgd2hpY2ggcnVucyBhdCBIWgorCSAgICAodHlwaWNhbGx5IDEwMCkgYW5kIHRoZSBQUFIgcnVucyBhdCAyMDAgSHosCisJICAgIHNvIHRoZSBkZWxheSBpcyBkdXJhdGlvbiAqIDIwMC9IWiwgYW5kIHRodXMgYQorCSAgICBicmVhayBjYW4gcnVuIGZyb20gMS8xMDAgc2VjIHRvIGFib3V0IDUvNCBzZWMuCisJICAgIE5lZWQgdG8gY2hlY2sgdGhlc2UgdmFsdWVzIC0gUkdIIDE0MTA5NS4KKwkgKi8KKwliYXNlX2FkZHJbQ3lURFJdID0gMDsgLyogc3RhcnQgYnJlYWsgKi8KKwliYXNlX2FkZHJbQ3lURFJdID0gMHg4MTsKKwliYXNlX2FkZHJbQ3lURFJdID0gMDsgLyogZGVsYXkgYSBiaXQgKi8KKwliYXNlX2FkZHJbQ3lURFJdID0gMHg4MjsKKwliYXNlX2FkZHJbQ3lURFJdID0gaW5mby0+eF9icmVhayoyMDAvSFo7CisJYmFzZV9hZGRyW0N5VERSXSA9IDA7IC8qIHRlcm1pbmF0ZSBicmVhayAqLworCWJhc2VfYWRkcltDeVREUl0gPSAweDgzOworCWNoYXJfY291bnQgLT0gNzsKKwlpbmZvLT54X2JyZWFrID0gMDsKKyAgICB9CisKKyAgICB3aGlsZSAoY2hhcl9jb3VudCA+IDApeworCWlmICghaW5mby0+eG1pdF9jbnQpeworCSAgICBiYXNlX2FkZHJbQ3lJRVJdICY9IH4oQ3lUeE1wdHl8Q3lUeFJkeSk7CisJICAgIGJyZWFrOworCX0KKwlpZiAoaW5mby0+eG1pdF9idWYgPT0gMCl7CisJICAgIGJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eXxDeVR4UmR5KTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKXsKKwkgICAgYmFzZV9hZGRyW0N5SUVSXSAmPSB+KEN5VHhNcHR5fEN5VHhSZHkpOworCSAgICBicmVhazsKKwl9CisJLyogQmVjYXVzZSB0aGUgRW1iZWRkZWQgVHJhbnNtaXQgQ29tbWFuZHMgaGF2ZSBiZWVuCisJICAgZW5hYmxlZCwgd2UgbXVzdCBjaGVjayB0byBzZWUgaWYgdGhlIGVzY2FwZQorCSAgIGNoYXJhY3RlciwgTlVMTCwgaXMgYmVpbmcgc2VudC4gIElmIGl0IGlzLCB3ZQorCSAgIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgcm9vbSBmb3IgaXQgdG8gYmUKKwkgICBkb3VibGVkIGluIHRoZSBvdXRwdXQgc3RyZWFtLiAgVGhlcmVmb3JlIHdlCisJICAgbm8gbG9uZ2VyIGFkdmFuY2UgdGhlIHBvaW50ZXIgd2hlbiB0aGUgY2hhcmFjdGVyCisJICAgaXMgZmV0Y2hlZCwgYnV0IHJhdGhlciB3YWl0IHVudGlsIGFmdGVyIHRoZSBjaGVjaworCSAgIGZvciBhIE5VTEwgb3V0cHV0IGNoYXJhY3Rlci4gKFRoaXMgaXMgbmVjZXNzYXJ5CisJICAgYmVjYXVzZSB0aGVyZSBtYXkgbm90IGJlIHJvb20gZm9yIHRoZSB0d28gY2hhcnMKKwkgICBuZWVkZWQgdG8gc2VuZCBhIE5VTEwuCisJICovCisJb3V0Y2ggPSBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdOworCWlmKCBvdXRjaCApeworCSAgICBpbmZvLT54bWl0X2NudC0tOworCSAgICBpbmZvLT54bWl0X3RhaWwgPSAoaW5mby0+eG1pdF90YWlsICsgMSkKKwkJCQkgICAgICAmIChQQUdFX1NJWkUgLSAxKTsKKwkgICAgYmFzZV9hZGRyW0N5VERSXSA9IG91dGNoOworCSAgICBjaGFyX2NvdW50LS07CisJfWVsc2V7CisJICAgIGlmKGNoYXJfY291bnQgPiAxKXsKKwkJaW5mby0+eG1pdF9jbnQtLTsKKwkJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIDEpCisJCQkJCSAgJiAoUEFHRV9TSVpFIC0gMSk7CisJCWJhc2VfYWRkcltDeVREUl0gPSBvdXRjaDsKKwkJYmFzZV9hZGRyW0N5VERSXSA9IDA7CisJCWNoYXJfY291bnQtLTsKKwkJY2hhcl9jb3VudC0tOworCSAgICB9ZWxzZXsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKyAgICB9CisgICAgYmFzZV9hZGRyW0N5VEVPSVJdID0gKGNoYXJfY291bnQgIT0gc2F2ZWRfY250KSA/IDAgOiBDeU5PVFJBTlM7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiBjeV90eF9pbnRlcnJ1cHQgKi8KKworc3RhdGljIGlycXJldHVybl90CitjZDI0MDFfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgICAgaW50IGNoYW5uZWw7CisgICAgY2hhciBkYXRhOworICAgIGludCBjaGFyX2NvdW50OworICAgIGludCBzYXZlX2NudDsKKworICAgIC8qIGRldGVybWluZSB0aGUgY2hhbm5lbCBhbmQgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChiYXNlX2FkZHJbQ3lMSUNSXSA+PiAyKTsKKyAgICBpbmZvID0gJmN5X3BvcnRbY2hhbm5lbF07CisgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworICAgIHNhdmVfY250ID0gY2hhcl9jb3VudCA9IGJhc2VfYWRkcltDeVJGT0NdOworCisjaWZkZWYgQ09ORklHX1JFTU9URV9ERUJVRworICAgIGlmIChjaGFubmVsID09IERFQlVHX1BPUlQpIHsKKwl3aGlsZSAoY2hhcl9jb3VudC0tKSB7CisgICAgICAgICAgICBkYXRhID0gYmFzZV9hZGRyW0N5UkRSXTsKKwkgICAgcXVldWVEZWJ1Z0NoYXIoZGF0YSk7CisJfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAvKiBpZiB0aGVyZSBpcyBub3doZXJlIHRvIHB1dCB0aGUgZGF0YSwgZGlzY2FyZCBpdCAqLworICAgIGlmKGluZm8tPnR0eSA9PSAwKXsKKwl3aGlsZShjaGFyX2NvdW50LS0peworCSAgICBkYXRhID0gYmFzZV9hZGRyW0N5UkRSXTsKKwl9CisgICAgfWVsc2V7IC8qIHRoZXJlIGlzIGFuIG9wZW4gcG9ydCBmb3IgdGhpcyBkYXRhICovCisJdHR5ID0gaW5mby0+dHR5OworCS8qIGxvYWQgIyBjaGFyYWN0ZXJzIGF2YWlsYWJsZSBmcm9tIHRoZSBjaGlwICovCisKKyNpZmRlZiBDWUNMT01fRU5BQkxFX01PTklUT1JJTkcKKwkrK2luZm8tPm1vbi5pbnRfY291bnQ7CisJaW5mby0+bW9uLmNoYXJfY291bnQgKz0gY2hhcl9jb3VudDsKKwlpZiAoY2hhcl9jb3VudCA+IGluZm8tPm1vbi5jaGFyX21heCkKKwkgICAgaW5mby0+bW9uLmNoYXJfbWF4ID0gY2hhcl9jb3VudDsKKwlpbmZvLT5tb24uY2hhcl9sYXN0ID0gY2hhcl9jb3VudDsKKyNlbmRpZgorCXdoaWxlKGNoYXJfY291bnQtLSl7CisJICAgIGRhdGEgPSBiYXNlX2FkZHJbQ3lSRFJdOworCSAgICBpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpeworCQljb250aW51ZTsKKwkgICAgfQorCSAgICB0dHktPmZsaXAuY291bnQrKzsKKwkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7CisJICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworI2lmZGVmIENZQ0xPTV8xNllfSEFDSworCSAgICB1ZGVsYXkoMTBMKTsKKyNlbmRpZgorICAgICAgICB9CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisgICAgfQorICAgIC8qIGVuZCBvZiBzZXJ2aWNlICovCisgICAgYmFzZV9hZGRyW0N5UkVPSVJdID0gc2F2ZV9jbnQgPyAwIDogQ3lOT1RSQU5TOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogY3lfcnhfaW50ZXJydXB0ICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBoYW5kbGUgdGhlICJib3R0b20gaGFsZiIgcHJvY2Vzc2luZyBmb3IgdGhlCisgKiBzZXJpYWwgZHJpdmVyLCBrbm93biBhbHNvIHRoZSAic29mdHdhcmUgaW50ZXJydXB0IiBwcm9jZXNzaW5nLgorICogVGhpcyBwcm9jZXNzaW5nIGlzIGRvbmUgYXQgdGhlIGtlcm5lbCBpbnRlcnJ1cHQgbGV2ZWwsIGFmdGVyIHRoZQorICogY3kjL19pbnRlcnJ1cHQoKSBoYXMgcmV0dXJuZWQsIEJVVCBXSVRIIElOVEVSUlVQVFMgVFVSTkVEIE9OLiAgVGhpcworICogaXMgd2hlcmUgdGltZS1jb25zdW1pbmcgYWN0aXZpdGllcyB3aGljaCBjYW4gbm90IGJlIGRvbmUgaW4gdGhlCisgKiBpbnRlcnJ1cHQgZHJpdmVyIHByb3BlciBhcmUgZG9uZTsgdGhlIGludGVycnVwdCBkcml2ZXIgc2NoZWR1bGVzCisgKiB0aGVtIHVzaW5nIGN5X3NjaGVkX2V2ZW50KCksIGFuZCB0aGV5IGdldCBkb25lIGhlcmUuCisgKgorICogVGhpcyBpcyBkb25lIHRocm91Z2ggb25lIGxldmVsIG9mIGluZGlyZWN0aW9uLS10aGUgdGFzayBxdWV1ZS4KKyAqIFdoZW4gYSBoYXJkd2FyZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIHdhbnRzIHNlcnZpY2UgYnkgdGhlCisgKiBkcml2ZXIncyBib3R0b20gaGFsZiwgaXQgZW5xdWV1ZXMgdGhlIGFwcHJvcHJpYXRlIHRxX3N0cnVjdCAob25lCisgKiBwZXIgcG9ydCkgdG8gdGhlIGtldmVudGQgd29yayBxdWV1ZSBhbmQgc2V0cyBhIHJlcXVlc3QgZmxhZworICogdGhhdCB0aGUgd29yayBxdWV1ZSBiZSBwcm9jZXNzZWQuCisgKgorICogQWx0aG91Z2ggdGhpcyBtYXkgc2VlbSB1bndpZWxkeSwgaXQgZ2l2ZXMgdGhlIHN5c3RlbSBhIHdheSB0bworICogcGFzcyBhbiBhcmd1bWVudCAoaW4gdGhpcyBjYXNlIHRoZSBwb2ludGVyIHRvIHRoZSBjeWNsYWRlc19wb3J0CisgKiBzdHJ1Y3R1cmUpIHRvIHRoZSBib3R0b20gaGFsZiBvZiB0aGUgZHJpdmVyLiAgUHJldmlvdXMga2VybmVscworICogaGFkIHRvIHBvbGwgZXZlcnkgcG9ydCB0byBzZWUgaWYgdGhhdCBwb3J0IG5lZWRlZCBzZXJ2aWNpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitkb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKSBwcml2YXRlXzsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgICAgKnR0eTsKKworICAgIHR0eSA9IGluZm8tPnR0eTsKKyAgICBpZiAoIXR0eSkKKwlyZXR1cm47CisKKyAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX0hBTkdVUCwgJmluZm8tPmV2ZW50KSkgeworCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisgICAgfQorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfT1BFTl9XQUtFVVAsICZpbmZvLT5ldmVudCkpIHsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisgICAgfQorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfV1JJVEVfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisgICAgCXR0eV93YWtldXAodHR5KTsKKyAgICB9Cit9IC8qIGRvX3NvZnRpbnQgKi8KKworCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIHBvcnQgYmVjb21lcyBhY3RpdmU7CisgICBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGFuZCBEVFIgJiBSVFMgYXJlIHR1cm5lZCBvbi4KKyAqLworc3RhdGljIGludAorc3RhcnR1cChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopQkFTRV9BRERSOworICBpbnQgY2hhbm5lbDsKKworICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKXsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWluZm8tPnR5cGUpeworCWlmIChpbmZvLT50dHkpeworCSAgICBzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFpbmZvLT54bWl0X2J1Zil7CisJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UgKEdGUF9LRVJORUwpOworCWlmICghaW5mby0+eG1pdF9idWYpeworCSAgICByZXR1cm4gLUVOT01FTTsKKwl9CisgICAgfQorCisgICAgY29uZmlnX3NldHVwKGluZm8pOworCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorICAgIHByaW50aygic3RhcnR1cCBjaGFubmVsICVkXG4iLCBjaGFubmVsKTsKKyNlbmRpZgorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisJd3JpdGVfY3lfY21kKGJhc2VfYWRkcixDeUVOQl9SQ1ZSfEN5RU5CX1hNVFIpOworCisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsgLyogISEhIElzIHRoaXMgbmVlZGVkPyAqLworCWJhc2VfYWRkcltDeU1TVlIxXSA9IEN5UlRTOworLyogQ1AoJ1MnKTtDUCgnMScpOyAqLworCWJhc2VfYWRkcltDeU1TVlIyXSA9IEN5RFRSOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0RUUgorICAgICAgICBwcmludGsoImN5YzogJWQ6IHJhaXNpbmcgRFRSXG4iLCBfX0xJTkVfXyk7CisgICAgICAgIHByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsIGJhc2VfYWRkcltDeU1TVlIxXSwgYmFzZV9hZGRyW0N5TVNWUjJdKTsKKyNlbmRpZgorCisJYmFzZV9hZGRyW0N5SUVSXSB8PSBDeVJ4RGF0YTsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKworCWlmIChpbmZvLT50dHkpeworCSAgICBjbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJfQorCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCIgZG9uZVxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30gLyogc3RhcnR1cCAqLworCit2b2lkCitzdGFydF94bWl0KCBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyApCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJhc2VfYWRkcltDeUNBUl0gPSBjaGFubmVsOworCWJhc2VfYWRkcltDeUlFUl0gfD0gQ3lUeE1wdHk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfSAvKiBzdGFydF94bWl0ICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgc2h1dHMgZG93biBhIHNlcmlhbCBwb3J0OyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwKKyAqIGFuZCBEVFIgaXMgZHJvcHBlZCBpZiB0aGUgaGFuZ3VwIG9uIGNsb3NlIHRlcm1pbyBmbGFnIGlzIG9uLgorICovCitzdGF0aWMgdm9pZAorc2h1dGRvd24oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvKQoreworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICBpbnQgY2hhbm5lbDsKKworICAgIGlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKXsKKy8qIENQKCckJyk7ICovCisJcmV0dXJuOworICAgIH0KKworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKyAgICBwcmludGsoInNodXRkb3duIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworI2VuZGlmCisKKyAgICAvKiAhISEgUkVBTExZIE1VU1QgV0FJVCBGT1IgTEFTVCBDSEFSQUNURVIgVE8gQkUKKyAgICAgICBTRU5UIEJFRk9SRSBEUk9QUElORyBUSEUgTElORSAhISEgIChQZXJoYXBzCisgICAgICAgc2V0IHNvbWUgZmxhZyB0aGF0IGlzIHJlYWQgd2hlbiBYTVRZIGhhcHBlbnMuKQorICAgICAgIE90aGVyIGNob2ljZXMgYXJlIHRvIGRlbGF5IHNvbWUgZml4ZWQgaW50ZXJ2YWwKKyAgICAgICBvciBzY2hlZHVsZSBzb21lIGxhdGVyIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2J1Zil7CisJICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mby0+eG1pdF9idWYpOworCSAgICBpbmZvLT54bWl0X2J1ZiA9IDA7CisJfQorCisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKwlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKSB7CisJICAgIGJhc2VfYWRkcltDeU1TVlIxXSA9IDA7CisvKiBDUCgnQycpO0NQKCcxJyk7ICovCisJICAgIGJhc2VfYWRkcltDeU1TVlIyXSA9IDA7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0RUUgorICAgICAgICAgICAgcHJpbnRrKCJjeWM6ICVkOiBkcm9wcGluZyBEVFJcbiIsIF9fTElORV9fKTsKKyAgICAgICAgICAgIHByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsIGJhc2VfYWRkcltDeU1TVlIxXSwgYmFzZV9hZGRyW0N5TVNWUjJdKTsKKyNlbmRpZgorICAgICAgICB9CisJd3JpdGVfY3lfY21kKGJhc2VfYWRkcixDeURJU19SQ1ZSKTsKKyAgICAgICAgIC8qIGl0IG1heSBiZSBhcHByb3ByaWF0ZSB0byBjbGVhciBfWE1JVCBhdAorICAgICAgICAgICBzb21lIGxhdGVyIGRhdGUgKGFmdGVyIHRlc3RpbmcpISEhICovCisKKwlpZiAoaW5mby0+dHR5KXsKKwkgICAgc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwl9CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCIgZG9uZVxuIik7CisjZW5kaWYKKyAgICByZXR1cm47Cit9IC8qIHNodXRkb3duICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZmluZHMgb3IgY29tcHV0ZXMgdGhlIHZhcmlvdXMgbGluZSBjaGFyYWN0ZXJpc3RpY3MuCisgKi8KK3N0YXRpYyB2b2lkCitjb25maWdfc2V0dXAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvKQoreworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICBpbnQgY2hhbm5lbDsKKyAgdW5zaWduZWQgY2ZsYWc7CisgIGludCAgIGk7CisgIHVuc2lnbmVkIGNoYXIgdGksIG5lZWRfaW5pdF9jaGFuID0gMDsKKworICAgIGlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpbmZvLT5saW5lID09IC0xKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworICAgIC8qIGJhdWQgcmF0ZSAqLworICAgIGkgPSBjZmxhZyAmIENCQVVEOworI2lmZGVmIENCQVVERVgKKy8qIFN0YXJ0aW5nIHdpdGgga2VybmVsIDEuMS42NSwgdGhlcmUgaXMgZGlyZWN0IHN1cHBvcnQgZm9yCisgICBoaWdoZXIgYmF1ZCByYXRlcy4gIFRoZSBmb2xsb3dpbmcgY29kZSBzdXBwb3J0cyB0aG9zZQorICAgY2hhbmdlcy4gIFRoZSBjb25kaXRpb25hbCBhc3BlY3QgYWxsb3dzIHRoaXMgZHJpdmVyIHRvIGJlCisgICB1c2VkIGZvciBlYXJsaWVyIGFzIHdlbGwgYXMgbGF0ZXIga2VybmVsIHZlcnNpb25zLiAgKFRoZQorICAgbWFwcGluZyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBzZXJpYWwuYyBiZWNhdXNlIHRoZXJlCisgICBpcyBzdGlsbCB0aGUgcG9zc2liaWxpdHkgb2Ygc3VwcG9ydGluZyA3NSBrYml0L3NlYyB3aXRoCisgICB0aGUgQ3ljbGFkZXMgYm9hcmQuKQorICovCisgICAgaWYgKGkgJiBDQkFVREVYKSB7CisJaWYgKGkgPT0gQjU3NjAwKQorCSAgICBpID0gMTY7CisJZWxzZSBpZihpID09IEIxMTUyMDApIAorCSAgICBpID0gMTg7CisjaWZkZWYgQjc4NjAwCisJZWxzZSBpZihpID09IEI3ODYwMCkgCisJICAgIGkgPSAxNzsKKyNlbmRpZgorCWVsc2UKKwkgICAgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOworICAgIH0KKyNlbmRpZgorICAgIGlmIChpID09IDE1KSB7CisJICAgIGlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkgICAgaSArPSAxOworCSAgICBpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCSAgICBpICs9IDM7CisgICAgfQorICAgIC8qIERvbid0IGV2ZXIgY2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgY29uc29sZSBwb3J0LiAgSXQgd2lsbAorICAgICAqIHJ1biBhdCB0aGUgc3BlZWQgc3BlY2lmaWVkIGluIGJvb3RpbmZvLCBvciBhdCAxOS4ySyAqLworICAgIC8qIEFjdHVhbGx5LCBpdCBzaG91bGQgcnVuIGF0IHdoYXRldmVyIHNwZWVkIDE2NkJ1ZyB3YXMgdXNpbmcgKi8KKyAgICAvKiBOb3RlIGluZm8tPnRpbWVvdXQgaXNuJ3QgdXNlZCBhdCBwcmVzZW50ICovCisgICAgaWYgKGluZm8gIT0gc2VyaWFsX2NvbnNvbGVfaW5mbykgeworCWluZm8tPnRicHIgPSBiYXVkX2JwcltpXTsgLyogVHggQlBSICovCisJaW5mby0+dGNvID0gYmF1ZF9jb1tpXTsgLyogVHggQ08gKi8KKwlpbmZvLT5yYnByID0gYmF1ZF9icHJbaV07IC8qIFJ4IEJQUiAqLworCWluZm8tPnJjbyA9IGJhdWRfY29baV0gPj4gNTsgLyogUnggQ08gKi8KKwlpZiAoYmF1ZF90YWJsZVtpXSA9PSAxMzQpIHsKKyAgICAgICAgICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMzAvMjY5KSArIDI7CisgICAgICAgICAgICAvKiBnZXQgaXQgcmlnaHQgZm9yIDEzNC41IGJhdWQgKi8KKwl9IGVsc2UgaWYgKGJhdWRfdGFibGVbaV0pIHsKKyAgICAgICAgICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMTUvYmF1ZF90YWJsZVtpXSkgKyAyOworICAgICAgICAvKiB0aGlzIG5lZWRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUgY2FyZCBpbmZvICovCisJfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8tPnRpbWVvdXQgPSAwOworCX0KKyAgICB9CisgICAgLyogQnkgdHJhZGl0aW9uIChpcyBpdCBhIHN0YW5kYXJkPykgYSBiYXVkIHJhdGUgb2YgemVybworICAgICAgIGltcGxpZXMgdGhlIGxpbmUgc2hvdWxkIGJlL2hhcyBiZWVuIGNsb3NlZC4gIEEgYml0CisgICAgICAgbGF0ZXIgaW4gdGhpcyByb3V0aW5lIHN1Y2ggYSB0ZXN0IGlzIHBlcmZvcm1lZC4gKi8KKworICAgIC8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisgICAgaW5mby0+Y29yNyA9IDA7CisgICAgaW5mby0+Y29yNiA9IDA7CisgICAgaW5mby0+Y29yNSA9IDA7CisgICAgaW5mby0+Y29yNCA9IChpbmZvLT5kZWZhdWx0X3RocmVzaG9sZAorCQkgID8gaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQKKwkJICA6IGJhdWRfY29yNFtpXSk7IC8qIHJlY2VpdmUgdGhyZXNob2xkICovCisgICAgLyogRm9sbG93aW5nIHR3byBsaW5lcyBhZGRlZCAxMDEyOTUsIFJHSC4gKi8KKyAgICAvKiBJdCBpcyBvYnZpb3VzbHkgd3JvbmcgdG8gYWNjZXNzIEN5Q09SeCwgYW5kIG5vdCBpbmZvLT5jb3J4IGhlcmUsCisgICAgICogdHJ5IGFuZCByZW1lbWJlciB0byBmaXggaXQgbGF0ZXIhICovCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKyAgICBpZiAoQ19DTE9DQUwoaW5mby0+dHR5KSkgeworCWlmIChiYXNlX2FkZHJbQ3lJRVJdICYgQ3lNZG1DaCkKKwkgICAgYmFzZV9hZGRyW0N5SUVSXSAmPSB+Q3lNZG1DaDsgLyogd2l0aG91dCBtb2RlbSBpbnRyICovCisJCQkgICAgICAgLyogaWdub3JlIDEtPjAgbW9kZW0gdHJhbnNpdGlvbnMgKi8KKwlpZiAoYmFzZV9hZGRyW0N5Q09SNF0gJiAoQ3lEU1J8Q3lDVFN8Q3lEQ0QpKQorCSAgICBiYXNlX2FkZHJbQ3lDT1I0XSAmPSB+KEN5RFNSfEN5Q1RTfEN5RENEKTsKKwkJCSAgICAgICAvKiBpZ25vcmUgMC0+MSBtb2RlbSB0cmFuc2l0aW9ucyAqLworCWlmIChiYXNlX2FkZHJbQ3lDT1I1XSAmIChDeURTUnxDeUNUU3xDeURDRCkpCisJICAgIGJhc2VfYWRkcltDeUNPUjVdICY9IH4oQ3lEU1J8Q3lDVFN8Q3lEQ0QpOworICAgIH0gZWxzZSB7CisJaWYgKChiYXNlX2FkZHJbQ3lJRVJdICYgQ3lNZG1DaCkgIT0gQ3lNZG1DaCkKKwkgICAgYmFzZV9hZGRyW0N5SUVSXSB8PSBDeU1kbUNoOyAvKiB3aXRoIG1vZGVtIGludHIgKi8KKwkJCSAgICAgICAvKiBhY3Qgb24gMS0+MCBtb2RlbSB0cmFuc2l0aW9ucyAqLworCWlmICgoYmFzZV9hZGRyW0N5Q09SNF0gJiAoQ3lEU1J8Q3lDVFN8Q3lEQ0QpKSAhPSAoQ3lEU1J8Q3lDVFN8Q3lEQ0QpKQorCSAgICBiYXNlX2FkZHJbQ3lDT1I0XSB8PSBDeURTUnxDeUNUU3xDeURDRDsKKwkJCSAgICAgICAvKiBhY3Qgb24gMC0+MSBtb2RlbSB0cmFuc2l0aW9ucyAqLworCWlmICgoYmFzZV9hZGRyW0N5Q09SNV0gJiAoQ3lEU1J8Q3lDVFN8Q3lEQ0QpKSAhPSAoQ3lEU1J8Q3lDVFN8Q3lEQ0QpKQorCSAgICBiYXNlX2FkZHJbQ3lDT1I1XSB8PSBDeURTUnxDeUNUU3xDeURDRDsKKyAgICB9CisgICAgaW5mby0+Y29yMyA9IChjZmxhZyAmIENTVE9QQikgPyBDeV8yX1NUT1AgOiBDeV8xX1NUT1A7CisgICAgaW5mby0+Y29yMiA9IEN5RVRDOworICAgIHN3aXRjaChjZmxhZyAmIENTSVpFKXsKKyAgICBjYXNlIENTNToKKyAgICAgICAgaW5mby0+Y29yMSA9IEN5XzVfQklUUzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUzY6CisgICAgICAgIGluZm8tPmNvcjEgPSBDeV82X0JJVFM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1M3OgorICAgICAgICBpbmZvLT5jb3IxID0gQ3lfN19CSVRTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTODoKKyAgICAgICAgaW5mby0+Y29yMSA9IEN5XzhfQklUUzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjZmxhZyAmIFBBUkVOQil7CisgICAgICAgIGlmIChjZmxhZyAmIFBBUk9ERCl7CisgICAgICAgICAgICBpbmZvLT5jb3IxIHw9IEN5UEFSSVRZX087CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaW5mby0+Y29yMSB8PSBDeVBBUklUWV9FOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGluZm8tPmNvcjEgfD0gQ3lQQVJJVFlfTk9ORTsKKyAgICB9CisJCisgICAgLyogQ1RTIGZsb3cgY29udHJvbCBmbGFnICovCisjaWYgMAorICAgIC8qIERvbid0IGNvbXBsY2F0ZSBtYXR0ZXJzIGZvciBub3chIFJHSCAxNDEwOTUgKi8KKyAgICBpZiAoY2ZsYWcgJiBDUlRTQ1RTKXsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwlpbmZvLT5jb3IyIHw9IEN5Q3RzQUU7CisgICAgfWVsc2V7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCWluZm8tPmNvcjIgJj0gfkN5Q3RzQUU7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGNmbGFnICYgQ0xPQ0FMKQorCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKyAgICBlbHNlCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisKKyAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJVGhlIGhhcmR3YXJlIG9wdGlvbiwgQ3lSdHNBTywgcHJlc2VudHMgUlRTIHdoZW4KKwl0aGUgY2hpcCBoYXMgY2hhcmFjdGVycyB0byBzZW5kLiAgU2luY2UgbW9zdCBtb2RlbXMKKwl1c2UgUlRTIGFzIHJldmVyc2UgKGluYm91bmQpIGZsb3cgY29udHJvbCwgdGhpcworCW9wdGlvbiBpcyBub3QgdXNlZC4gIElmIGluYm91bmQgZmxvdyBjb250cm9sIGlzCisJbmVjZXNzYXJ5LCBEVFIgY2FuIGJlIHByb2dyYW1tZWQgdG8gcHJvdmlkZSB0aGUKKwlhcHByb3ByaWF0ZSBzaWduYWxzIGZvciB1c2Ugd2l0aCBhIG5vbi1zdGFuZGFyZAorCWNhYmxlLiAgQ29udGFjdCBNYXJjaW8gU2FpdG8gZm9yIGRldGFpbHMuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKworCS8qIEN5Q01SIHNldCBvbmNlIG9ubHkgaW4gbXZtZTE2N19pbml0X3NlcmlhbCgpICovCisJaWYgKGJhc2VfYWRkcltDeUxJQ1JdICE9IGNoYW5uZWwgPDwgMikKKwkgICAgYmFzZV9hZGRyW0N5TElDUl0gPSBjaGFubmVsIDw8IDI7CisJaWYgKGJhc2VfYWRkcltDeUxJVlJdICE9IDB4NWMpCisJICAgIGJhc2VfYWRkcltDeUxJVlJdID0gMHg1YzsKKworICAgICAgIC8qIHR4IGFuZCByeCBiYXVkIHJhdGUgKi8KKworCWlmIChiYXNlX2FkZHJbQ3lDT1IxXSAhPSBpbmZvLT5jb3IxKQorCSAgICBuZWVkX2luaXRfY2hhbiA9IDE7CisJaWYgKGJhc2VfYWRkcltDeVRDT1JdICE9IGluZm8tPnRjbykKKwkgICAgYmFzZV9hZGRyW0N5VENPUl0gPSBpbmZvLT50Y287CisJaWYgKGJhc2VfYWRkcltDeVRCUFJdICE9IGluZm8tPnRicHIpCisJICAgIGJhc2VfYWRkcltDeVRCUFJdID0gaW5mby0+dGJwcjsKKwlpZiAoYmFzZV9hZGRyW0N5UkNPUl0gIT0gaW5mby0+cmNvKQorCSAgICBiYXNlX2FkZHJbQ3lSQ09SXSA9IGluZm8tPnJjbzsKKwlpZiAoYmFzZV9hZGRyW0N5UkJQUl0gIT0gaW5mby0+cmJwcikKKwkgICAgYmFzZV9hZGRyW0N5UkJQUl0gPSBpbmZvLT5yYnByOworCisJLyogc2V0IGxpbmUgY2hhcmFjdGVyaXN0aWNzICBhY2NvcmRpbmcgY29uZmlndXJhdGlvbiAqLworCisJaWYgKGJhc2VfYWRkcltDeVNDSFIxXSAhPSBTVEFSVF9DSEFSKGluZm8tPnR0eSkpCisJICAgIGJhc2VfYWRkcltDeVNDSFIxXSA9IFNUQVJUX0NIQVIoaW5mby0+dHR5KTsKKwlpZiAoYmFzZV9hZGRyW0N5U0NIUjJdICE9IFNUT1BfQ0hBUihpbmZvLT50dHkpKQorCSAgICBiYXNlX2FkZHJbQ3lTQ0hSMl0gPSBTVE9QX0NIQVIoaW5mby0+dHR5KTsKKwlpZiAoYmFzZV9hZGRyW0N5U0NSTF0gIT0gU1RBUlRfQ0hBUihpbmZvLT50dHkpKQorCSAgICBiYXNlX2FkZHJbQ3lTQ1JMXSA9IFNUQVJUX0NIQVIoaW5mby0+dHR5KTsKKwlpZiAoYmFzZV9hZGRyW0N5U0NSSF0gIT0gU1RBUlRfQ0hBUihpbmZvLT50dHkpKQorCSAgICBiYXNlX2FkZHJbQ3lTQ1JIXSA9IFNUQVJUX0NIQVIoaW5mby0+dHR5KTsKKwlpZiAoYmFzZV9hZGRyW0N5Q09SMV0gIT0gaW5mby0+Y29yMSkKKwkgICAgYmFzZV9hZGRyW0N5Q09SMV0gPSBpbmZvLT5jb3IxOworCWlmIChiYXNlX2FkZHJbQ3lDT1IyXSAhPSBpbmZvLT5jb3IyKQorCSAgICBiYXNlX2FkZHJbQ3lDT1IyXSA9IGluZm8tPmNvcjI7CisJaWYgKGJhc2VfYWRkcltDeUNPUjNdICE9IGluZm8tPmNvcjMpCisJICAgIGJhc2VfYWRkcltDeUNPUjNdID0gaW5mby0+Y29yMzsKKwlpZiAoYmFzZV9hZGRyW0N5Q09SNF0gIT0gaW5mby0+Y29yNCkKKwkgICAgYmFzZV9hZGRyW0N5Q09SNF0gPSBpbmZvLT5jb3I0OworCWlmIChiYXNlX2FkZHJbQ3lDT1I1XSAhPSBpbmZvLT5jb3I1KQorCSAgICBiYXNlX2FkZHJbQ3lDT1I1XSA9IGluZm8tPmNvcjU7CisJaWYgKGJhc2VfYWRkcltDeUNPUjZdICE9IGluZm8tPmNvcjYpCisJICAgIGJhc2VfYWRkcltDeUNPUjZdID0gaW5mby0+Y29yNjsKKwlpZiAoYmFzZV9hZGRyW0N5Q09SN10gIT0gaW5mby0+Y29yNykKKwkgICAgYmFzZV9hZGRyW0N5Q09SN10gPSBpbmZvLT5jb3I3OworCisJaWYgKG5lZWRfaW5pdF9jaGFuKQorCSAgICB3cml0ZV9jeV9jbWQoYmFzZV9hZGRyLEN5SU5JVF9DSEFOKTsKKworCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7IC8qICEhISBJcyB0aGlzIG5lZWRlZD8gKi8KKworCS8qIDJtcyBkZWZhdWx0IHJ4IHRpbWVvdXQgKi8KKwl0aSA9IGluZm8tPmRlZmF1bHRfdGltZW91dCA/IGluZm8tPmRlZmF1bHRfdGltZW91dCA6IDB4MDI7CisJaWYgKGJhc2VfYWRkcltDeVJUUFJMXSAhPSB0aSkKKwkgICAgYmFzZV9hZGRyW0N5UlRQUkxdID0gdGk7CisJaWYgKGJhc2VfYWRkcltDeVJUUFJIXSAhPSAwKQorCSAgICBiYXNlX2FkZHJbQ3lSVFBSSF0gPSAwOworCisJLyogU2V0IHVwIFJUUyBoZXJlIGFsc28gPz8/Pz8gUkdIIDE0MTA5NSAqLworCWlmKGkgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCisJICAgIGlmICgoYmFzZV9hZGRyW0N5TVNWUjJdICYgQ3lEVFIpID09IEN5RFRSKQorCSAgICAgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gMDsKKyNpZmRlZiBTRVJJQUxfREVCVUdfRFRSCisgICAgICAgICAgICBwcmludGsoImN5YzogJWQ6IGRyb3BwaW5nIERUUlxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworI2VuZGlmCisJfWVsc2V7CisJICAgIGlmICgoYmFzZV9hZGRyW0N5TVNWUjJdICYgQ3lEVFIpICE9IEN5RFRSKQorCSAgICAgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gQ3lEVFI7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0RUUgorICAgICAgICAgICAgcHJpbnRrKCJjeWM6ICVkOiByYWlzaW5nIERUUlxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworI2VuZGlmCisJfQorCisJaWYgKGluZm8tPnR0eSl7CisJICAgIGNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwl9CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKK30gLyogY29uZmlnX3NldHVwICovCisKKworc3RhdGljIHZvaWQKK2N5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIFNFUklBTF9ERUJVR19JTworICAgIHByaW50aygiY3lfcHV0X2NoYXIgJXMoMHglMDJ4KVxuIiwgdHR5LT5uYW1lLCBjaCk7CisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfcHV0X2NoYXIiKSkKKwlyZXR1cm47CisKKyAgICBpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisJcmV0dXJuOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCA+PSBQQUdFX1NJWkUgLSAxKSB7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgcmV0dXJuOworCX0KKworCWluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfaGVhZCsrXSA9IGNoOworCWluZm8tPnhtaXRfaGVhZCAmPSBQQUdFX1NJWkUgLSAxOworCWluZm8tPnhtaXRfY250Kys7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfSAvKiBjeV9wdXRfY2hhciAqLworCisKK3N0YXRpYyB2b2lkCitjeV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworCQkJCQorI2lmZGVmIFNFUklBTF9ERUJVR19JTworICAgIHByaW50aygiY3lfZmx1c2hfY2hhcnMgJXNcbiIsIHR0eS0+bmFtZSk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfZmx1c2hfY2hhcnMiKSkKKwlyZXR1cm47CisKKyAgICBpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQKKyAgICB8fCB0dHktPmh3X3N0b3BwZWQgfHwgIWluZm8tPnhtaXRfYnVmKQorCXJldHVybjsKKworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJhc2VfYWRkcltDeUNBUl0gPSBjaGFubmVsOworCWJhc2VfYWRkcltDeUlFUl0gfD0gQ3lUeE1wdHk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfSAvKiBjeV9mbHVzaF9jaGFycyAqLworCisKKy8qIFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCB3aGVuIHR0eV93cml0ZSBoYXMgcHV0IHNvbWV0aGluZyBpbnRvCisgICAgdGhlIHdyaXRlX3F1ZXVlLiAgSWYgdGhlIHBvcnQgaXMgbm90IGFscmVhZHkgdHJhbnNtaXR0aW5nIHN0dWZmLAorICAgIHN0YXJ0IGl0IG9mZiBieSBlbmFibGluZyBpbnRlcnJ1cHRzLiAgVGhlIGludGVycnVwdCBzZXJ2aWNlCisgICAgcm91dGluZSB3aWxsIHRoZW4gZW5zdXJlIHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHNlbnQuICBJZiB0aGUKKyAgICBwb3J0IGlzIGFscmVhZHkgYWN0aXZlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGtpY2sgaXQuCisgKi8KK3N0YXRpYyBpbnQKK2N5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgYywgdG90YWwgPSAwOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeV93cml0ZSAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV93cml0ZSIpKXsKKwlyZXR1cm4gMDsKKyAgICB9CisJCisgICAgaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmIHx8ICF0bXBfYnVmKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2hpbGUgKDEpIHsKKwkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSAgICBjID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEsCisJCQkJICAgICAgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOworCSAgICBpZiAoYyA8PSAwKSB7CisJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICBicmVhazsKKwkgICAgfQorCisJICAgIG1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkgICAgaW5mby0+eG1pdF9oZWFkID0gKGluZm8tPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJICAgIGluZm8tPnhtaXRfY250ICs9IGM7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCSAgICBidWYgKz0gYzsKKwkgICAgY291bnQgLT0gYzsKKwkgICAgdG90YWwgKz0gYzsKKyAgICB9CisKKyAgICBpZiAoaW5mby0+eG1pdF9jbnQKKyAgICAmJiAhdHR5LT5zdG9wcGVkCisgICAgJiYgIXR0eS0+aHdfc3RvcHBlZCApIHsKKyAgICAgICAgc3RhcnRfeG1pdChpbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfSAvKiBjeV93cml0ZSAqLworCisKK3N0YXRpYyBpbnQKK2N5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICBpbnQJcmV0OworCQkJCQorI2lmZGVmIFNFUklBTF9ERUJVR19JTworICAgIHByaW50aygiY3lfd3JpdGVfcm9vbSAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV93cml0ZV9yb29tIikpCisJcmV0dXJuIDA7CisgICAgcmV0ID0gUEFHRV9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworICAgIGlmIChyZXQgPCAwKQorCXJldCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30gLyogY3lfd3JpdGVfcm9vbSAqLworCisKK3N0YXRpYyBpbnQKK2N5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkJCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeV9jaGFyc19pbl9idWZmZXIgJXMgJWRcbiIsIHR0eS0+bmFtZSwgaW5mby0+eG1pdF9jbnQpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2NoYXJzX2luX2J1ZmZlciIpKQorCXJldHVybiAwOworCisgICAgcmV0dXJuIGluZm8tPnhtaXRfY250OworfSAvKiBjeV9jaGFyc19pbl9idWZmZXIgKi8KKworCitzdGF0aWMgdm9pZAorY3lfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU8KKyAgICBwcmludGsoImN5X2ZsdXNoX2J1ZmZlciAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9idWZmZXIiKSkKKwlyZXR1cm47CisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgdHR5X3dha2V1cCh0dHkpOworfSAvKiBjeV9mbHVzaF9idWZmZXIgKi8KKworCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsCisgICB0aGF0IGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZCBvciB0aGF0IHRoZQorICAgdGhyb3R0bGUgc2hvdWxkIGJlIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZAorY3lfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgaW50IGNoYW5uZWw7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfVEhST1RUTEUKKyAgY2hhciBidWZbNjRdOworCQorICAgIHByaW50aygidGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCSAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworICAgIHByaW50aygiY3lfdGhyb3R0bGUgJXNcbiIsIHR0eS0+bmFtZSk7CisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfbnRocm90dGxlIikpeworCSAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKElfSVhPRkYodHR5KSkgeworCWluZm8tPnhfY2hhciA9IFNUT1BfQ0hBUih0dHkpOworCSAgICAvKiBTaG91bGQgdXNlIHRoZSAiU2VuZCBTcGVjaWFsIENoYXJhY3RlciIgZmVhdHVyZSEhISAqLworICAgIH0KKworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisJYmFzZV9hZGRyW0N5TVNWUjFdID0gMDsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3Rocm90dGxlICovCisKKworc3RhdGljIHZvaWQKK2N5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgaW50IGNoYW5uZWw7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfVEhST1RUTEUKKyAgY2hhciBidWZbNjRdOworCQorICAgIHByaW50aygidGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCSAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworICAgIHByaW50aygiY3lfdW50aHJvdHRsZSAlc1xuIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9udGhyb3R0bGUiKSl7CisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoSV9JWE9GRih0dHkpKSB7CisJaW5mby0+eF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOworCS8qIFNob3VsZCB1c2UgdGhlICJTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIiBmZWF0dXJlISEhICovCisgICAgfQorCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKwliYXNlX2FkZHJbQ3lNU1ZSMV0gPSBDeVJUUzsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3VudGhyb3R0bGUgKi8KKworc3RhdGljIGludAorZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogcmV0aW5mbykKK3sKKyAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCisvKiBDUCgnZycpOyAqLworICAgIGlmICghcmV0aW5mbykKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIG1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisgICAgdG1wLnR5cGUgPSBpbmZvLT50eXBlOworICAgIHRtcC5saW5lID0gaW5mby0+bGluZTsKKyAgICB0bXAucG9ydCA9IGluZm8tPmxpbmU7CisgICAgdG1wLmlycSA9IDA7CisgICAgdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisgICAgdG1wLmJhdWRfYmFzZSA9IDA7ICAgICAgICAgIC8qISEhKi8KKyAgICB0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKKyAgICB0bXAuY3VzdG9tX2Rpdmlzb3IgPSAwOyAgICAgLyohISEqLworICAgIHRtcC5odWI2ID0gMDsgICAgICAgICAgICAgICAvKiEhISovCisgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkgPyAtRUZBVUxUIDogMDsKK30gLyogZ2V0X3NlcmlhbF9pbmZvICovCisKK3N0YXRpYyBpbnQKK3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqIG5ld19pbmZvKQoreworICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCBvbGRfaW5mbzsKKworLyogQ1AoJ3MnKTsgKi8KKyAgICBpZiAoIW5ld19pbmZvKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgb2xkX2luZm8gPSAqaW5mbzsKKworICAgIGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCSAgICBpZiAoKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCSgobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgKGluZm8tPmZsYWdzICYgQVNZTkNfRkxBR1MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJICAgIHJldHVybiAtRVBFUk07CisJICAgIGluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCSAgICBnb3RvIGNoZWNrX2FuZF9leGl0OworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisgICAgICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorICAgICAqLworCisgICAgaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCSAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisgICAgaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5OworCisKK2NoZWNrX2FuZF9leGl0OgorICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKXsKKwljb25maWdfc2V0dXAoaW5mbyk7CisJcmV0dXJuIDA7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBzdGFydHVwKGluZm8pOworICAgIH0KK30gLyogc2V0X3NlcmlhbF9pbmZvICovCisKK3N0YXRpYyBpbnQKK2N5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICBpbnQgY2hhbm5lbDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgIHVuc2lnbmVkIGludCByZXN1bHQ7CisKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKyAgICAgICAgc3RhdHVzID0gYmFzZV9hZGRyW0N5TVNWUjFdIHwgYmFzZV9hZGRyW0N5TVNWUjJdOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiAgICAoKHN0YXR1cyAgJiBDeVJUUykgPyBUSU9DTV9SVFMgOiAwKQorICAgICAgICAgICAgfCAoKHN0YXR1cyAgJiBDeURUUikgPyBUSU9DTV9EVFIgOiAwKQorICAgICAgICAgICAgfCAoKHN0YXR1cyAgJiBDeURDRCkgPyBUSU9DTV9DQVIgOiAwKQorICAgICAgICAgICAgfCAoKHN0YXR1cyAgJiBDeURTUikgPyBUSU9DTV9EU1IgOiAwKQorICAgICAgICAgICAgfCAoKHN0YXR1cyAgJiBDeUNUUykgPyBUSU9DTV9DVFMgOiAwKTsKK30gLyogY3lfdGlvY21nZXQgKi8KKworc3RhdGljIGludAorY3lfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNoYW5uZWw7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHVuc2lnbmVkIGludCBhcmc7CisJICAKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpeworCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisJCWJhc2VfYWRkcltDeU1TVlIxXSA9IEN5UlRTOworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCWlmIChzZXQgJiBUSU9DTV9EVFIpeworCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJICAgIGJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisvKiBDUCgnUycpO0NQKCcyJyk7ICovCisJICAgIGJhc2VfYWRkcltDeU1TVlIyXSA9IEN5RFRSOworI2lmZGVmIFNFUklBTF9ERUJVR19EVFIKKyAgICAgICAgICAgIHByaW50aygiY3ljOiAlZDogcmFpc2luZyBEVFJcbiIsIF9fTElORV9fKTsKKyAgICAgICAgICAgIHByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsIGJhc2VfYWRkcltDeU1TVlIxXSwgYmFzZV9hZGRyW0N5TVNWUjJdKTsKKyNlbmRpZgorCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKXsKKwkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworCQliYXNlX2FkZHJbQ3lNU1ZSMV0gPSAwOworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCWlmIChjbGVhciAmIFRJT0NNX0RUUil7CisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKy8qIENQKCdDJyk7Q1AoJzInKTsgKi8KKwkgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gMDsKKyNpZmRlZiBTRVJJQUxfREVCVUdfRFRSCisgICAgICAgICAgICBwcmludGsoImN5YzogJWQ6IGRyb3BwaW5nIERUUlxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworI2VuZGlmCisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisKKyAgICByZXR1cm4gMDsKK30gLyogc2V0X21vZGVtX2luZm8gKi8KKworc3RhdGljIHZvaWQKK3NlbmRfYnJlYWsoIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgaW50IGR1cmF0aW9uKQoreyAvKiBMZXQgdGhlIHRyYW5zbWl0IElTUiB0YWtlIGNhcmUgb2YgdGhpcyAoc2luY2UgaXQKKyAgICAgcmVxdWlyZXMgc3R1ZmZpbmcgY2hhcmFjdGVycyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtKS4KKyAgICovCisgICAgaW5mby0+eF9icmVhayA9IGR1cmF0aW9uOworICAgIGlmICghaW5mby0+eG1pdF9jbnQgKSB7CisJc3RhcnRfeG1pdChpbmZvKTsKKyAgICB9Cit9IC8qIHNlbmRfYnJlYWsgKi8KKworc3RhdGljIGludAorZ2V0X21vbl9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgc3RydWN0IGN5Y2xhZGVzX21vbml0b3IgKiBtb24pCit7CisKKyAgIGlmIChjb3B5X3RvX3VzZXIobW9uLCAmaW5mby0+bW9uLCBzaXplb2Yoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IpKSkKKwkgICByZXR1cm4gLUVGQVVMVDsKKyAgIGluZm8tPm1vbi5pbnRfY291bnQgID0gMDsKKyAgIGluZm8tPm1vbi5jaGFyX2NvdW50ID0gMDsKKyAgIGluZm8tPm1vbi5jaGFyX21heCAgID0gMDsKKyAgIGluZm8tPm1vbi5jaGFyX2xhc3QgID0gMDsKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqYXJnKQoreworICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICBpbnQgY2hhbm5lbDsKKyAgIAorICAgaWYgKGdldF91c2VyKHZhbHVlLCBhcmcpKQorCSAgIHJldHVybiAtRUZBVUxUOworCisgICBjaGFubmVsID0gaW5mby0+bGluZTsKKyAgIGluZm8tPmNvcjQgJj0gfkN5UkVDX0ZJRk87CisgICBpbmZvLT5jb3I0IHw9IHZhbHVlICYgQ3lSRUNfRklGTzsKKyAgIGJhc2VfYWRkcltDeUNPUjRdID0gaW5mby0+Y29yNDsKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICAgaW50IGNoYW5uZWw7CisgICB1bnNpZ25lZCBsb25nIHRtcDsKKyAgIAorICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgIHRtcCA9IGJhc2VfYWRkcltDeUNPUjRdICYgQ3lSRUNfRklGTzsKKyAgIHJldHVybiBwdXRfdXNlcih0bXAsdmFsdWUpOworfQorCitzdGF0aWMgaW50CitzZXRfZGVmYXVsdF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisgICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisgICBpZiAoZ2V0X3VzZXIodmFsdWUsIGFyZykpCisJcmV0dXJuIC1FRkFVTFQ7CisKKyAgIGluZm8tPmRlZmF1bHRfdGhyZXNob2xkID0gdmFsdWUgJiAweDBmOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkLHZhbHVlKTsKK30KKworc3RhdGljIGludAorc2V0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICAgaW50IGNoYW5uZWw7CisgICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisgICBpZiAoZ2V0X3VzZXIodmFsdWUsIGFyZykpCisJICAgcmV0dXJuIC1FRkFVTFQ7CisgICAKKyAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisgICBiYXNlX2FkZHJbQ3lSVFBSTF0gPSB2YWx1ZSAmIDB4ZmY7CisgICBiYXNlX2FkZHJbQ3lSVFBSSF0gPSAodmFsdWUgPj4gOCkgJiAweGZmOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICAgaW50IGNoYW5uZWw7CisgICB1bnNpZ25lZCBsb25nIHRtcDsKKyAgIAorICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgIHRtcCA9IGJhc2VfYWRkcltDeVJUUFJMXTsKKyAgIHJldHVybiBwdXRfdXNlcih0bXAsdmFsdWUpOworfQorCitzdGF0aWMgaW50CitzZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IHZhbHVlICYgMHhmZjsKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisgICByZXR1cm4gcHV0X3VzZXIoaW5mby0+ZGVmYXVsdF90aW1lb3V0LHZhbHVlKTsKK30KKworc3RhdGljIGludAorY3lfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICBpbnQgcmV0X3ZhbCA9IDA7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5X2lvY3RsICVzLCBjbWQgPSAleCBhcmcgPSAlbHhcbiIsIHR0eS0+bmFtZSwgY21kLCBhcmcpOyAvKiAqLworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIENZR0VUTU9OOgorICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9tb25faW5mbyhpbmZvLCAoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IgKilhcmcpOworCSAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWUdFVFRIUkVTSDoKKwkgICAgcmV0X3ZhbCA9IGdldF90aHJlc2hvbGQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworIAkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X3RocmVzaG9sZChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIENZR0VUREVGVEhSRVNIOgorCSAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKyAJICAgIGJyZWFrOworICAgICAgICBjYXNlIENZU0VUREVGVEhSRVNIOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIENZR0VUVElNRU9VVDoKKwkgICAgcmV0X3ZhbCA9IGdldF90aW1lb3V0KGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKyAJICAgIGJyZWFrOworICAgICAgICBjYXNlIENZU0VUVElNRU9VVDoKKyAgICAgICAgICAgIHJldF92YWwgPSBzZXRfdGltZW91dChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIENZR0VUREVGVElNRU9VVDoKKwkgICAgcmV0X3ZhbCA9IGdldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworIAkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRERUZUSU1FT1VUOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgKHVuc2lnbmVkIGxvbmcpYXJnKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVENTQlJLOiAgICAvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKwkgICAgcmV0X3ZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkgICAgaWYgKHJldF92YWwpCisJCSAgICBicmVhazsKKyAgICAgICAgICAgIHR0eV93YWl0X3VudGlsX3NlbnQodHR5LDApOworICAgICAgICAgICAgaWYgKCFhcmcpCisgICAgICAgICAgICAgICAgc2VuZF9icmVhayhpbmZvLCBIWi80KTsgLyogMS80IHNlY29uZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVENTQlJLUDogICAvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisJICAgIHJldF92YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJICAgIGlmIChyZXRfdmFsKQorCQlicmVhazsKKyAgICAgICAgICAgIHR0eV93YWl0X3VudGlsX3NlbnQodHR5LDApOworICAgICAgICAgICAgc2VuZF9icmVhayhpbmZvLCBhcmcgPyBhcmcqKEhaLzEwKSA6IEhaLzQpOworICAgICAgICAgICAgYnJlYWs7CisKKy8qIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGluY29tcGxldGVseSBpbXBsZW1lbnRlZCEhISAqLworICAgICAgICBjYXNlIFRJT0NHU09GVENBUjoKKyAgICAgICAgICAgIHJldF92YWwgPSBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSU9DU1NPRlRDQVI6CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCSAgICBpZiAocmV0X3ZhbCkKKwkJICAgIGJyZWFrOworICAgICAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKyAgICAgICAgICAgICAgICAgICAgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8ICh2YWwgPyBDTE9DQUwgOiAwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSU9DR1NFUklBTDoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfc2VyaWFsX2luZm8oaW5mbywgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopIGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSU9DU1NFUklBTDoKKyAgICAgICAgICAgIHJldF92YWwgPSBzZXRfc2VyaWFsX2luZm8oaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopIGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgICAgcmV0X3ZhbCA9IC1FTk9JT0NUTENNRDsKKyAgICB9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5X2lvY3RsIGRvbmVcbiIpOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30gLyogY3lfaW9jdGwgKi8KKworCisKKworc3RhdGljIHZvaWQKK2N5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkX3Rlcm1pb3MpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3lfc2V0X3Rlcm1pb3MgJXNcbiIsIHR0eS0+bmFtZSk7CisjZW5kaWYKKworICAgIGlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCisgICAgICAgIHJldHVybjsKKyAgICBjb25maWdfc2V0dXAoaW5mbyk7CisKKyAgICBpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKyAgICAgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworICAgICAgICAgICAgdHR5LT5zdG9wcGVkID0gMDsKKyAgICAgICAgICAgIGN5X3N0YXJ0KHR0eSk7CisgICAgfQorI2lmZGVmIHR5dHNvX3BhdGNoXzk0Tm92MjVfMTcyNgorICAgIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorICAgICAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKyAgICAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuOworfSAvKiBjeV9zZXRfdGVybWlvcyAqLworCisKK3N0YXRpYyB2b2lkCitjeV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisvKiBDUCgnQycpOyAqLworI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3lfY2xvc2UgJXNcbiIsIHR0eS0+bmFtZSk7CisjZW5kaWYKKworICAgIGlmICghaW5mbworICAgIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9jbG9zZSIpKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorICAgIHByaW50aygiY3lfY2xvc2UgJXMsIGNvdW50ID0gJWRcbiIsIHR0eS0+bmFtZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisKKyAgICBpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJLyoKKwkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cworCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKwkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkgKi8KKwlwcmludGsoImN5X2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIgorCSAgICJpbmZvLT5jb3VudCBpcyAlZFxuIiwgaW5mby0+Y291bnQpOworCWluZm8tPmNvdW50ID0gMTsKKyAgICB9CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6ICVkOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsIF9fTElORV9fLCBpbmZvLT5jb3VudCAtIDEpOworI2VuZGlmCisgICAgaWYgKC0taW5mby0+Y291bnQgPCAwKSB7CisJcHJpbnRrKCJjeV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6ICVkOiBzZXR0aW5nIGNvdW50IHRvIDBcbiIsIF9fTElORV9fKTsKKyNlbmRpZgorCWluZm8tPmNvdW50ID0gMDsKKyAgICB9CisgICAgaWYgKGluZm8tPmNvdW50KQorCXJldHVybjsKKyAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAzMDAwKTsgLyogMzAgc2Vjb25kcyB0aW1lb3V0ICovCisgICAgc2h1dGRvd24oaW5mbyk7CisgICAgaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworICAgIHR0eV9sZGlzY19mbHVzaCh0dHkpOworICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICBpbmZvLT50dHkgPSAwOworICAgIGlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkgICAgbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOworCX0KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisgICAgfQorICAgIGluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeV9jbG9zZSBkb25lXG4iKTsKKyNlbmRpZgorCisgICAgcmV0dXJuOworfSAvKiBjeV9jbG9zZSAqLworCisvKgorICogY3lfaGFuZ3VwKCkgLS0tIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KKyAqLwordm9pZAorY3lfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCisjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeV9oYW5ndXAgJXNcbiIsIHR0eS0+bmFtZSk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaGFuZ3VwIikpCisJcmV0dXJuOworICAgIAorICAgIHNodXRkb3duKGluZm8pOworI2lmIDAKKyAgICBpbmZvLT5ldmVudCA9IDA7CisgICAgaW5mby0+Y291bnQgPSAwOworI2lmZGVmIFNFUklBTF9ERUJVR19DT1VOVAorICAgIHByaW50aygiY3ljOiAlZDogc2V0dGluZyBjb3VudCB0byAwXG4iLCBfX0xJTkVfXyk7CisjZW5kaWYKKyAgICBpbmZvLT50dHkgPSAwOworI2VuZGlmCisgICAgaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworfSAvKiBjeV9oYW5ndXAgKi8KKworCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X29wZW4oKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludAorYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvKQoreworICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgaW50IGNoYW5uZWw7CisgIGludCByZXR2YWw7CisgIHZvbGF0aWxlIHVfY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKworICAgIC8qCisgICAgICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworICAgICAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorICAgICAqLworICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKXsKKwkgICAgcmV0dXJuIC1FQUdBSU47CisJfWVsc2V7CisJICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250CisgICAgICogYW5kIHRoZW4gZXhpdC4KKyAgICAgKi8KKyAgICBpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qCisgICAgICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKyAgICAgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorICAgICAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKyAgICAgKiBjeV9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKyAgICAgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorICAgICAqLworICAgIHJldHZhbCA9IDA7CisgICAgYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrOiAlcywgY291bnQgPSAlZFxuIiwKKwkgICB0dHktPm5hbWUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKyAgICBpbmZvLT5jb3VudC0tOworI2lmZGVmIFNFUklBTF9ERUJVR19DT1VOVAorICAgIHByaW50aygiY3ljOiAlZDogZGVjcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLCBfX0xJTkVfXywgaW5mby0+Y291bnQpOworI2VuZGlmCisgICAgaW5mby0+YmxvY2tlZF9vcGVuKys7CisKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgIHdoaWxlICgxKSB7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisJYmFzZV9hZGRyW0N5TVNWUjFdID0gQ3lSVFM7CisvKiBDUCgnUycpO0NQKCc0Jyk7ICovCisJYmFzZV9hZGRyW0N5TVNWUjJdID0gQ3lEVFI7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0RUUgorCXByaW50aygiY3ljOiAlZDogcmFpc2luZyBEVFJcbiIsIF9fTElORV9fKTsKKwlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLCBiYXNlX2FkZHJbQ3lNU1ZSMV0sIGJhc2VfYWRkcltDeU1TVlIyXSk7CisjZW5kaWYKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKQorCXx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgKXsKKwkgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgeworCQlyZXR2YWwgPSAtRUFHQUlOOworCSAgICB9ZWxzZXsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJICAgIGJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisvKiBDUCgnTCcpO0NQMSgxICYmIENfQ0xPQ0FMKHR0eSkpOyBDUDEoMSAmJiAoYmFzZV9hZGRyW0N5TVNWUjFdICYgQ3lEQ0QpICk7ICovCisJICAgIGlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkgICAgJiYgKENfQ0xPQ0FMKHR0eSkKKwkgICAgICAgIHx8IChiYXNlX2FkZHJbQ3lNU1ZSMV0gJiBDeURDRCkpKSB7CisJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICBicmVhazsKKwkgICAgfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkgICAgcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCSAgICBicmVhazsKKwl9CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBibG9ja2luZzogJXMsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIHR0eS0+bmFtZSwgaW5mby0+Y291bnQpOy8qKi8KKyNlbmRpZgorCXNjaGVkdWxlKCk7CisgICAgfQorICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyAgICBpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpeworCWluZm8tPmNvdW50Kys7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6ICVkOiBpbmNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsIF9fTElORV9fLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKyAgICB9CisgICAgaW5mby0+YmxvY2tlZF9vcGVuLS07CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKyAgICBwcmludGsoImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogJXMsIGNvdW50ID0gJWRcbiIsCisJICAgdHR5LT5uYW1lLCBpbmZvLT5jb3VudCk7LyoqLworI2VuZGlmCisgICAgaWYgKHJldHZhbCkKKwkgICAgcmV0dXJuIHJldHZhbDsKKyAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworICAgIHJldHVybiAwOworfSAvKiBibG9ja190aWxfcmVhZHkgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAorICogcGVyZm9ybXMgdGhlIHNlcmlhbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCisgKi8KK2ludAorY3lfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICAqaW5mbzsKKyAgaW50IHJldHZhbCwgbGluZTsKKworLyogQ1AoJ08nKTsgKi8KKyAgICBsaW5lID0gdHR5LT5pbmRleDsKKyAgICBpZiAoKGxpbmUgPCAwKSB8fCAoTlJfUE9SVFMgPD0gbGluZSkpeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgaW5mbyA9ICZjeV9wb3J0W2xpbmVdOworICAgIGlmIChpbmZvLT5saW5lIDwgMCl7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyNpZmRlZiBTRVJJQUxfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5X29wZW4gJXNcbiIsIHR0eS0+bmFtZSk7IC8qICovCisjZW5kaWYKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X29wZW4iKSl7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorICAgIHByaW50aygiY3lfb3BlbiAlcywgY291bnQgPSAlZFxuIiwgdHR5LT5uYW1lLCBpbmZvLT5jb3VudCk7LyoqLworI2VuZGlmCisgICAgaW5mby0+Y291bnQrKzsKKyNpZmRlZiBTRVJJQUxfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzogJWQ6IGluY3JlbWVudGluZyBjb3VudCB0byAlZFxuIiwgX19MSU5FX18sIGluZm8tPmNvdW50KTsKKyNlbmRpZgorICAgIHR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworICAgIGluZm8tPnR0eSA9IHR0eTsKKworICAgIGlmICghdG1wX2J1ZikgeworCXRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXBfYnVmKXsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0YXJ0IHVwIHNlcmlhbCBwb3J0CisgICAgICovCisgICAgcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKyAgICBpZiAocmV0dmFsKXsKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIHJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOworICAgIGlmIChyZXR2YWwpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiY3lfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCisJICAgICAgIHJldHZhbCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeV9vcGVuIGRvbmVcbiIpOy8qKi8KKyNlbmRpZgorICAgIHJldHVybiAwOworfSAvKiBjeV9vcGVuICovCisKKworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXJpYWwxNjdfaW5pdCgpIGFuZCBmcmllbmRzCisgKgorICogc2VyaWFsMTY3X2luaXQoKSBpcyBjYWxsZWQgYXQgYm9vdC10aW1lIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBkcml2ZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIHByaW50cyBvdXQgdGhlIGFwcHJvcHJpYXRlIHNlcmlhbCBkcml2ZXIgdmVyc2lvbgorICogbnVtYmVyLCBhbmQgaWRlbnRpZmllcyB3aGljaCBvcHRpb25zIHdlcmUgY29uZmlndXJlZCBpbnRvIHRoaXMKKyAqIGRyaXZlci4KKyAqLworc3RhdGljIHZvaWQKK3Nob3dfdmVyc2lvbih2b2lkKQoreworICAgIHByaW50aygiTVZNRTE2Ni8xNjcgY2QyNDAxIGRyaXZlclxuIik7Cit9IC8qIHNob3dfdmVyc2lvbiAqLworCisvKiBpbml0aWFsaXplIGNoaXBzIG9uIGNhcmQgLS0gcmV0dXJuIG51bWJlciBvZiB2YWxpZAorICAgY2hpcHMgKHdoaWNoIGlzIG51bWJlciBvZiBwb3J0cy80KSAqLworCisvKgorICogVGhpcyBpbml0aWFsaXNlcyB0aGUgaGFyZHdhcmUgdG8gYSByZWFzb25hYmxlIHN0YXRlLiAgSXQgc2hvdWxkCisgKiBwcm9iZSB0aGUgY2hpcCBmaXJzdCBzbyBhcyB0byBjb3B5IDE2Ni1CdWcgc2V0dXAgYXMgYSBkZWZhdWx0IGZvcgorICogcG9ydCAwLiAgSXQgaW5pdGlhbGlzZXMgQ01SIHRvIEN5QVNZTkM7IHRoYXQgaXMgbmV2ZXIgZG9uZSBhZ2Fpbiwgc28KKyAqIGFzIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgQ3lJTklUX0NIQU4gY29tbWFuZHMgaW4gbm9ybWFsIHJ1bm5pbmcuCisgKgorICogLi4uIEkgd29uZGVyIHdoYXQgSSBzaG91bGQgZG8gaWYgdGhpcyBmYWlscyAuLi4KKyAqLworCit2b2lkCittdm1lMTY3X3NlcmlhbF9jb25zb2xlX3NldHVwKGludCBjZmxhZykKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworCWludCBjaDsKKwl1X2NoYXIgc3BkOworCXVfY2hhciByY29yLCByYnByLCBiYWRzcGVlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qCisJICogRmlyc3QgcHJvYmUgY2hhbm5lbCB6ZXJvIG9mIHRoZSBjaGlwLCB0byBzZWUgd2hhdCBzcGVlZCBoYXMKKwkgKiBiZWVuIHNlbGVjdGVkLgorCSAqLworCisJYmFzZV9hZGRyW0N5Q0FSXSA9IDA7CisKKwlyY29yID0gYmFzZV9hZGRyW0N5UkNPUl0gPDwgNTsKKwlyYnByID0gYmFzZV9hZGRyW0N5UkJQUl07CisKKwlmb3IgKHNwZCA9IDA7IHNwZCA8IHNpemVvZihiYXVkX2Jwcik7IHNwZCsrKQorCQlpZiAocmJwciA9PSBiYXVkX2JwcltzcGRdICYmIHJjb3IgPT0gYmF1ZF9jb1tzcGRdKQorCQkJYnJlYWs7CisJaWYgKHNwZCA+PSBzaXplb2YoYmF1ZF9icHIpKSB7CisJCXNwZCA9IDE0OwkvKiAxOTIwMCAqLworCQliYWRzcGVlZCA9IDE7CS8qIEZhaWxlZCB0byBpZGVudGlmeSBzcGVlZCAqLworCX0KKwlpbml0aWFsX2NvbnNvbGVfc3BlZWQgPSBzcGQ7CisKKwkvKiBPSywgd2UgaGF2ZSBjaG9zZW4gYSBzcGVlZCwgbm93IHJlc2V0IGFuZCByZWluaXRpYWxpc2UgKi8KKworICAgICAgICBteV91ZGVsYXkoMjAwMDBMKTsJLyogQWxsb3cgdGltZSBmb3IgYW55IGFjdGl2ZSBvL3AgdG8gY29tcGxldGUgKi8KKyAgICAgICAgaWYoYmFzZV9hZGRyW0N5Q0NSXSAhPSAweDAwKXsKKyAgICAgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAgICAgICAgIC8qIHByaW50aygiIGNoaXAgaXMgbmV2ZXIgaWRsZSAoQ0NSICE9IDApXG4iKTsgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2VfYWRkcltDeUNDUl0gPSBDeUNISVBfUkVTRVQ7CS8qIFJlc2V0IHRoZSBjaGlwICovCisgICAgICAgIG15X3VkZWxheSgxMDAwTCk7CisKKyAgICAgICAgaWYoYmFzZV9hZGRyW0N5R0ZSQ1JdID09IDB4MDApeworICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgICAgICAgICAgLyogcHJpbnRrKCIgY2hpcCBpcyBub3QgcmVzcG9uZGluZyAoR0ZSQ1Igc3RheWVkIDApXG4iKTsgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisJLyoKKwkgKiBTeXN0ZW0gY2xvY2sgaXMgMjBNaHosIGRpdmlkZWQgYnkgMjA0OCwgc28gZGl2aWRlIGJ5IDEwIGZvciBhIDEuMG1zCisJICogdGljaworCSAqLworCisJYmFzZV9hZGRyW0N5VFBSXSA9IDEwOworCisJYmFzZV9hZGRyW0N5UElMUjFdID0gMHgwMTsgICAgLyogSW50ZXJydXB0IGxldmVsIGZvciBtb2RlbSBjaGFuZ2UgKi8KKwliYXNlX2FkZHJbQ3lQSUxSMl0gPSAweDAyOyAgICAvKiBJbnRlcnJ1cHQgbGV2ZWwgZm9yIHR4IGludHMgKi8KKwliYXNlX2FkZHJbQ3lQSUxSM10gPSAweDAzOyAgICAvKiBJbnRlcnJ1cHQgbGV2ZWwgZm9yIHJ4IGludHMgKi8KKworCS8qCisJICogQXR0ZW1wdCB0byBzZXQgdXAgYWxsIGNoYW5uZWxzIHRvIHNvbWV0aGluZyByZWFzb25hYmxlLCBhbmQKKwkgKiBiYW5nIG91dCBhIElOSVRfQ0hBTiBjb21tYW5kLiAgV2Ugc2hvdWxkIHRoZW4gYmUgYWJsZSB0byBsaW1pdAorCSAqIHRoZSBhbW1vdW50IG9mIGZpZGRsaW5nIHdlIGhhdmUgdG8gZG8gaW4gbm9ybWFsIHJ1bm5pbmcuCisJICovCisKKwlmb3IgKGNoID0gMzsgY2ggPj0gMCA7IGNoLS0pIHsKKwkJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2g7CisJCWJhc2VfYWRkcltDeUlFUl0gPSAwOworCQliYXNlX2FkZHJbQ3lDTVJdID0gQ3lBU1lOQzsKKwkJYmFzZV9hZGRyW0N5TElDUl0gPSAodV9jaGFyKWNoIDw8IDI7CisJCWJhc2VfYWRkcltDeUxJVlJdID0gMHg1YzsKKwkJYmFzZV9hZGRyW0N5VENPUl0gPSBiYXVkX2NvW3NwZF07CisJCWJhc2VfYWRkcltDeVRCUFJdID0gYmF1ZF9icHJbc3BkXTsKKwkJYmFzZV9hZGRyW0N5UkNPUl0gPSBiYXVkX2NvW3NwZF0gPj4gNTsKKwkJYmFzZV9hZGRyW0N5UkJQUl0gPSBiYXVkX2JwcltzcGRdOworCQliYXNlX2FkZHJbQ3lTQ0hSMV0gPSAnUScgJiAweDFmOworCQliYXNlX2FkZHJbQ3lTQ0hSMl0gPSAnWCcgJiAweDFmOworCQliYXNlX2FkZHJbQ3lTQ1JMXSA9IDA7CisJCWJhc2VfYWRkcltDeVNDUkhdID0gMDsKKwkJYmFzZV9hZGRyW0N5Q09SMV0gPSBDeV84X0JJVFMgfCBDeVBBUklUWV9OT05FOworCQliYXNlX2FkZHJbQ3lDT1IyXSA9IDA7CisJCWJhc2VfYWRkcltDeUNPUjNdID0gQ3lfMV9TVE9QOworCQliYXNlX2FkZHJbQ3lDT1I0XSA9IGJhdWRfY29yNFtzcGRdOworCQliYXNlX2FkZHJbQ3lDT1I1XSA9IDA7CisJCWJhc2VfYWRkcltDeUNPUjZdID0gMDsKKwkJYmFzZV9hZGRyW0N5Q09SN10gPSAwOworCQliYXNlX2FkZHJbQ3lSVFBSTF0gPSAyOworCQliYXNlX2FkZHJbQ3lSVFBSSF0gPSAwOworCSAgICAgICAgYmFzZV9hZGRyW0N5TVNWUjFdID0gMDsKKwkgICAgICAgIGJhc2VfYWRkcltDeU1TVlIyXSA9IDA7CisJCXdyaXRlX2N5X2NtZChiYXNlX2FkZHIsQ3lJTklUX0NIQU58Q3lESVNfUkNWUnxDeURJU19YTVRSKTsKKwl9CisKKwkvKgorCSAqIE5vdyBkbyBzcGVjaWFscyBmb3IgY2hhbm5lbCB6ZXJvLi4uLgorCSAqLworCisgICAgICAgIGJhc2VfYWRkcltDeU1TVlIxXSA9IEN5UlRTOworICAgICAgICBiYXNlX2FkZHJbQ3lNU1ZSMl0gPSBDeURUUjsKKwliYXNlX2FkZHJbQ3lJRVJdID0gQ3lSeERhdGE7CisJd3JpdGVfY3lfY21kKGJhc2VfYWRkcixDeUVOQl9SQ1ZSfEN5RU5CX1hNVFIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJbXlfdWRlbGF5KDIwMDAwTCk7CS8qIExldCBpdCBhbGwgc2V0dGxlIGRvd24gKi8KKworICAgICAgICBwcmludGsoIkNEMjQwMSBpbml0aWFsaXNlZCwgIGNoaXAgaXMgcmV2IDB4JTAyeFxuIiwgYmFzZV9hZGRyW0N5R0ZSQ1JdKTsKKwlpZiAoYmFkc3BlZWQpCisgICAgICAgIAlwcmludGsoIiAgV0FSTklORzogIEZhaWxlZCB0byBpZGVudGlmeSBsaW5lIHNwZWVkLCByY29yPSUwMngscmJwcj0lMDJ4XG4iLAorCQkJCQlyY29yID4+IDUsIHJicHIpOworfSAvKiBzZXJpYWxfY29uc29sZV9pbml0ICovCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgY3lfb3BzID0geworCS5vcGVuID0gY3lfb3BlbiwKKwkuY2xvc2UgPSBjeV9jbG9zZSwKKwkud3JpdGUgPSBjeV93cml0ZSwKKwkucHV0X2NoYXIgPSBjeV9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBjeV9mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IGN5X3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IGN5X2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gY3lfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IGN5X2lvY3RsLAorCS50aHJvdHRsZSA9IGN5X3Rocm90dGxlLAorCS51bnRocm90dGxlID0gY3lfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBjeV9zZXRfdGVybWlvcywKKwkuc3RvcCA9IGN5X3N0b3AsCisJLnN0YXJ0ID0gY3lfc3RhcnQsCisJLmhhbmd1cCA9IGN5X2hhbmd1cCwKKwkudGlvY21nZXQgPSBjeV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBjeV90aW9jbXNldCwKK307CisvKiBUaGUgc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKKyAgICBIYXJkd2FyZSBJL08gcG9ydHMgYXJlIG1hcHBlZCB0byBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2VzIG9uIGEKKyAgICBmaXJzdCBmb3VuZCwgZmlyc3QgYWxsb2NhdGVkIG1hbm5lci4gIFRoYXQgaXMsIHRoaXMgY29kZSBzZWFyY2hlcworICAgIGZvciBDeWNsb20gY2FyZHMgaW4gdGhlIHN5c3RlbS4gIEFzIGVhY2ggaXMgZm91bmQsIGl0IGlzIHByb2JlZAorICAgIHRvIGRpc2NvdmVyIGhvdyBtYW55IGNoaXBzIChhbmQgdGh1cyBob3cgbWFueSBwb3J0cykgYXJlIHByZXNlbnQuCisgICAgVGhlc2UgcG9ydHMgYXJlIG1hcHBlZCB0byB0aGUgdHR5IHBvcnRzIDY0IGFuZCB1cHdhcmQgaW4gbW9ub3RvbmljCisgICAgZmFzaGlvbi4gIElmIGFuIDgtcG9ydCBjYXJkIGlzIHJlcGxhY2VkIHdpdGggYSAxNi1wb3J0IGNhcmQsIHRoZQorICAgIHBvcnQgbWFwcGluZyBvbiBhIGZvbGxvd2luZyBjYXJkIHdpbGwgc2hpZnQuCisKKyAgICBUaGlzIGFwcHJvYWNoIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgaXMgdXNlZCBpbiB0aGUgb3RoZXIgc2VyaWFsCisgICAgZGV2aWNlIGRyaXZlciBiZWNhdXNlIHRoZSBDeWNsb20gaXMgbW9yZSBwcm9wZXJseSBhIG11bHRpcGxleGVyLAorICAgIG5vdCBqdXN0IGFuIGFnZ3JlZ2F0aW9uIG9mIHNlcmlhbCBwb3J0cyBvbiBvbmUgY2FyZC4KKworICAgIElmIHRoZXJlIGFyZSBtb3JlIGNhcmRzIHdpdGggbW9yZSBwb3J0cyB0aGFuIGhhdmUgYmVlbiBzdGF0aWNhbGx5CisgICAgYWxsb2NhdGVkIGFib3ZlLCBhIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgdGhlIGV4dHJhIHBvcnRzIGFyZSBpZ25vcmVkLgorICovCitzdGF0aWMgaW50IF9faW5pdAorc2VyaWFsMTY3X2luaXQodm9pZCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgIGludCByZXQgPSAwOworICBpbnQgZ29vZF9wb3J0cyA9IDA7CisgIGludCBwb3J0X251bSA9IDA7CisgIGludCBpbmRleDsKKyAgaW50IERlZlNwZWVkOworI2lmZGVmIG5vdHlldAorICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworI2VuZGlmCisKKyAgICBpZiAoIShtdm1lMTZ4X2NvbmZpZyAmTVZNRTE2eF9DT05GSUdfR09UX0NEMjQwMSkpCisJcmV0dXJuIDA7CisKKyAgICBjeV9zZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7CisgICAgaWYgKCFjeV9zZXJpYWxfZHJpdmVyKQorCXJldHVybiAtRU5PTUVNOworCisjaWYgMAorc2NyblsxXSA9ICdcMCc7CisjZW5kaWYKKworICAgIHNob3dfdmVyc2lvbigpOworCisgICAgLyogSGFzICJjb25zb2xlPTAsOTYwMG44IiBiZWVuIHVzZWQgaW4gYm9vdGluZm8gdG8gY2hhbmdlIHNwZWVkPyAqLworICAgIGlmIChzZXJpYWxfY29uc29sZV9jZmxhZykKKwlEZWZTcGVlZCA9IHNlcmlhbF9jb25zb2xlX2NmbGFnICYgMDAxNzsKKyAgICBlbHNlIHsKKwlEZWZTcGVlZCA9IGluaXRpYWxfY29uc29sZV9zcGVlZDsKKwlzZXJpYWxfY29uc29sZV9pbmZvID0gJmN5X3BvcnRbMF07CisJc2VyaWFsX2NvbnNvbGVfY2ZsYWcgPSBEZWZTcGVlZCB8IENTODsKKyNpZiAwCisJc2VyaWFsX2NvbnNvbGUgPSA2NDsgLypjYWxsb3V0X2RyaXZlci5taW5vcl9zdGFydCovCisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLworICAgIAorICAgIGN5X3NlcmlhbF9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvIjsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eVMiOworICAgIGN5X3NlcmlhbF9kcml2ZXItPm1ham9yID0gVFRZX01BSk9SOworICAgIGN5X3NlcmlhbF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gNjQ7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCSAgICBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworICAgIHR0eV9zZXRfb3BlcmF0aW9ucyhjeV9zZXJpYWxfZHJpdmVyLCAmY3lfb3BzKTsKKworICAgIHJldCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcik7CisgICAgaWYgKHJldCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IHJlZ2lzdGVyIE1WTUUxNjYvNyBzZXJpYWwgZHJpdmVyXG4iKTsKKwkgICAgcHV0X3R0eV9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcik7CisJICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcG9ydF9udW0gPSAwOworICAgIGluZm8gPSBjeV9wb3J0OworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDE7IGluZGV4KyspIHsKKworCWdvb2RfcG9ydHMgPSA0OworCisJaWYocG9ydF9udW0gPCBOUl9QT1JUUyl7CisJICAgIHdoaWxlKCBnb29kX3BvcnRzLS0gJiYgcG9ydF9udW0gPCBOUl9QT1JUUyl7CisJCS8qKiogaW5pdGlhbGl6ZSBwb3J0ICoqKi8KKwkJaW5mby0+bWFnaWMgPSBDWUNMQURFU19NQUdJQzsKKwkJaW5mby0+dHlwZSA9IFBPUlRfQ0lSUlVTOworCQlpbmZvLT5jYXJkID0gaW5kZXg7CisJCWluZm8tPmxpbmUgPSBwb3J0X251bTsKKwkJaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOworCQlpbmZvLT50dHkgPSAwOworCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDEyOworCQlpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORXxDeV84X0JJVFM7CisJCWluZm8tPmNvcjIgPSBDeUVUQzsKKwkJaW5mby0+Y29yMyA9IEN5XzFfU1RPUDsKKwkJaW5mby0+Y29yNCA9IDB4MDg7IC8qIF92ZXJ5XyBzbWFsbCByZWNlaXZlIHRocmVzaG9sZCAqLworCQlpbmZvLT5jb3I1ID0gMDsKKwkJaW5mby0+Y29yNiA9IDA7CisJCWluZm8tPmNvcjcgPSAwOworCQlpbmZvLT50YnByID0gYmF1ZF9icHJbRGVmU3BlZWRdOyAvKiBUeCBCUFIgKi8KKwkJaW5mby0+dGNvID0gYmF1ZF9jb1tEZWZTcGVlZF07IC8qIFR4IENPICovCisJCWluZm8tPnJicHIgPSBiYXVkX2JwcltEZWZTcGVlZF07IC8qIFJ4IEJQUiAqLworCQlpbmZvLT5yY28gPSBiYXVkX2NvW0RlZlNwZWVkXSA+PiA1OyAvKiBSeCBDTyAqLworCQlpbmZvLT5jbG9zZV9kZWxheSA9IDA7CisJCWluZm8tPnhfY2hhciA9IDA7CisJCWluZm8tPmV2ZW50ID0gMDsKKwkJaW5mby0+Y291bnQgPSAwOworI2lmZGVmIFNFUklBTF9ERUJVR19DT1VOVAorICAgIHByaW50aygiY3ljOiAlZDogc2V0dGluZyBjb3VudCB0byAwXG4iLCBfX0xJTkVfXyk7CisjZW5kaWYKKwkJaW5mby0+YmxvY2tlZF9vcGVuID0gMDsKKwkJaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQgPSAwOworCQlpbmZvLT5kZWZhdWx0X3RpbWVvdXQgPSAwOworCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCQkvKiBpbmZvLT5zZXNzaW9uICovCisJCS8qIGluZm8tPnBncnAgKi8KKy8qKiogISEhISEhISEgdGhpcyBtYXkgZXhwb3NlIG5ldyBidWdzICEhISEhISEhISAqKioqKioqKiovCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBDeVRJTUVPVVR8IEN5U1BFQ0hBUnwgQ3lCUkVBSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDeVBBUklUWXwgQ3lGUkFNRXwgQ3lPVkVSUlVOOworCQkvKiBpbmZvLT50aW1lb3V0ICovCisKKwkJcHJpbnRrKCJ0dHlTJWQgIiwgaW5mby0+bGluZSk7CisJCXBvcnRfbnVtKys7aW5mbysrOworCQlpZighKHBvcnRfbnVtICYgNykpeworCQkgICAgcHJpbnRrKCJcbiAgICAgICAgICAgICAgICIpOworCQl9CisJICAgIH0KKwl9CisJcHJpbnRrKCJcbiIpOworICAgIH0KKyAgICB3aGlsZSggcG9ydF9udW0gPCBOUl9QT1JUUyl7CisJaW5mby0+bGluZSA9IC0xOworCXBvcnRfbnVtKys7aW5mbysrOworICAgIH0KKyNpZmRlZiBDT05GSUdfUkVNT1RFX0RFQlVHCisgICAgZGVidWdfc2V0dXAoKTsKKyNlbmRpZgorICAgIHJldCA9IHJlcXVlc3RfaXJxKE1WTUUxNjdfSVJRX1NFUl9FUlIsIGNkMjQwMV9yeGVycl9pbnRlcnJ1cHQsIDAsCisJCQkJImNkMjQwMV9lcnJvcnMiLCBjZDI0MDFfcnhlcnJfaW50ZXJydXB0KTsKKyAgICBpZiAocmV0KSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAiQ291bGQndCBnZXQgY2QyNDAxX2Vycm9ycyBJUlEiKTsKKwkgICAgZ290byBjbGVhbnVwX3NlcmlhbF9kcml2ZXI7CisgICAgfQorCisgICAgcmV0ID0gcmVxdWVzdF9pcnEoTVZNRTE2N19JUlFfU0VSX01PREVNLCBjZDI0MDFfbW9kZW1faW50ZXJydXB0LCAwLAorCQkJCSJjZDI0MDFfbW9kZW0iLCBjZDI0MDFfbW9kZW1faW50ZXJydXB0KTsKKyAgICBpZiAocmV0KSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAiQ291bGQndCBnZXQgY2QyNDAxX21vZGVtIElSUSIpOworCSAgICBnb3RvIGNsZWFudXBfaXJxX2NkMjQwMV9lcnJvcnM7CisgICAgfQorCisgICAgcmV0ID0gcmVxdWVzdF9pcnEoTVZNRTE2N19JUlFfU0VSX1RYLCBjZDI0MDFfdHhfaW50ZXJydXB0LCAwLAorCQkJCSJjZDI0MDFfdHhpbnRzIiwgY2QyNDAxX3R4X2ludGVycnVwdCk7CisgICAgaWYgKHJldCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgIkNvdWxkJ3QgZ2V0IGNkMjQwMV90eGludHMgSVJRIik7CisJICAgIGdvdG8gY2xlYW51cF9pcnFfY2QyNDAxX21vZGVtOworICAgIH0KKworICAgIHJldCA9IHJlcXVlc3RfaXJxKE1WTUUxNjdfSVJRX1NFUl9SWCwgY2QyNDAxX3J4X2ludGVycnVwdCwgMCwKKwkJCQkiY2QyNDAxX3J4aW50cyIsIGNkMjQwMV9yeF9pbnRlcnJ1cHQpOworICAgIGlmIChyZXQpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZCd0IGdldCBjZDI0MDFfcnhpbnRzIElSUSIpOworCSAgICBnb3RvIGNsZWFudXBfaXJxX2NkMjQwMV90eGludHM7CisgICAgfQorCisgICAgLyogTm93IHdlIGhhdmUgcmVnaXN0ZXJlZCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzLCBhbGxvdyB0aGUgaW50ZXJydXB0cyAqLworCisgICAgcGNjMmNoaXBbUGNjU0NDTUlDUl0gPSAweDE1OwkJLyogU2VyaWFsIGludHMgYXJlIGxldmVsIDUgKi8KKyAgICBwY2MyY2hpcFtQY2NTQ0NUSUNSXSA9IDB4MTU7CisgICAgcGNjMmNoaXBbUGNjU0NDUklDUl0gPSAweDE1OworCisgICAgcGNjMmNoaXBbUGNjSU1MUl0gPSAzOwkJCS8qIEFsbG93IFBDQzIgaW50cyBhYm92ZSAzIT8gKi8KKworICAgIHJldHVybiAwOworY2xlYW51cF9pcnFfY2QyNDAxX3R4aW50czoKKyAgICBmcmVlX2lycShNVk1FMTY3X0lSUV9TRVJfVFgsIGNkMjQwMV90eF9pbnRlcnJ1cHQpOworY2xlYW51cF9pcnFfY2QyNDAxX21vZGVtOgorICAgIGZyZWVfaXJxKE1WTUUxNjdfSVJRX1NFUl9NT0RFTSwgY2QyNDAxX21vZGVtX2ludGVycnVwdCk7CitjbGVhbnVwX2lycV9jZDI0MDFfZXJyb3JzOgorICAgIGZyZWVfaXJxKE1WTUUxNjdfSVJRX1NFUl9FUlIsIGNkMjQwMV9yeGVycl9pbnRlcnJ1cHQpOworY2xlYW51cF9zZXJpYWxfZHJpdmVyOgorICAgIGlmICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcikpCisJICAgIHByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgdW5yZWdpc3RlciBNVk1FMTY2Lzcgc2VyaWFsIGRyaXZlclxuIik7CisgICAgcHV0X3R0eV9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcik7CisgICAgcmV0dXJuIHJldDsKK30gLyogc2VyaWFsMTY3X2luaXQgKi8KKworbW9kdWxlX2luaXQoc2VyaWFsMTY3X2luaXQpOworCisKKyNpZmRlZiBDWUNMT01fU0hPV19TVEFUVVMKK3N0YXRpYyB2b2lkCitzaG93X3N0YXR1cyhpbnQgbGluZV9udW0pCit7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm87CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBpbmZvID0gJmN5X3BvcnRbbGluZV9udW1dOworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworICAgIHByaW50aygiICBjaGFubmVsICVkXG4iLCBjaGFubmVsKTsvKiovCisKKyAgICBwcmludGsoIiBjeV9wb3J0XG4iKTsKKyAgICBwcmludGsoIiAgY2FyZCBsaW5lIGZsYWdzID0gJWQgJWQgJXhcbiIsCisgICAgICAgICAgICAgICAgIGluZm8tPmNhcmQsIGluZm8tPmxpbmUsIGluZm8tPmZsYWdzKTsKKyAgICBwcmludGsoIiAgKnR0eSByZWFkX3N0YXR1c19tYXNrIHRpbWVvdXQgeG1pdF9maWZvX3NpemUgPSAlbHggJXggJXggJXhcbiIsCisgICAgICAgICAgICAgICAgIChsb25nKWluZm8tPnR0eSwgaW5mby0+cmVhZF9zdGF0dXNfbWFzaywKKyAgICAgICAgICAgICAgICAgaW5mby0+dGltZW91dCwgaW5mby0+eG1pdF9maWZvX3NpemUpOworICAgIHByaW50aygiICBjb3IxLGNvcjIsY29yMyxjb3I0LGNvcjUsY29yNixjb3I3ID0gJXggJXggJXggJXggJXggJXggJXhcbiIsCisgICAgICAgICAgICAgaW5mby0+Y29yMSwgaW5mby0+Y29yMiwgaW5mby0+Y29yMywgaW5mby0+Y29yNCwgaW5mby0+Y29yNSwKKwkJCWluZm8tPmNvcjYsIGluZm8tPmNvcjcpOworICAgIHByaW50aygiICB0YnByLHRjbyxyYnByLHJjbyA9ICVkICVkICVkICVkXG4iLAorICAgICAgICAgICAgIGluZm8tPnRicHIsIGluZm8tPnRjbywgaW5mby0+cmJwciwgaW5mby0+cmNvKTsKKyAgICBwcmludGsoIiAgY2xvc2VfZGVsYXkgZXZlbnQgY291bnQgPSAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICBpbmZvLT5jbG9zZV9kZWxheSwgaW5mby0+ZXZlbnQsIGluZm8tPmNvdW50KTsKKyAgICBwcmludGsoIiAgeF9jaGFyIGJsb2NrZWRfb3BlbiA9ICV4ICV4XG4iLAorICAgICAgICAgICAgIGluZm8tPnhfY2hhciwgaW5mby0+YmxvY2tlZF9vcGVuKTsKKyAgICBwcmludGsoIiAgb3Blbl93YWl0ID0gJWx4ICVseCAlbHhcbiIsCisgICAgICAgICAgICAgKGxvbmcpaW5mby0+b3Blbl93YWl0KTsKKworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisvKiBHbG9iYWwgUmVnaXN0ZXJzICovCisKKwlwcmludGsoIiBDeUdGUkNSICV4XG4iLCBiYXNlX2FkZHJbQ3lHRlJDUl0pOworCXByaW50aygiIEN5Q0FSICV4XG4iLCBiYXNlX2FkZHJbQ3lDQVJdKTsKKwlwcmludGsoIiBDeVJJU1IgJXhcbiIsIGJhc2VfYWRkcltDeVJJU1JdKTsKKwlwcmludGsoIiBDeVRJU1IgJXhcbiIsIGJhc2VfYWRkcltDeVRJU1JdKTsKKwlwcmludGsoIiBDeU1JU1IgJXhcbiIsIGJhc2VfYWRkcltDeU1JU1JdKTsKKwlwcmludGsoIiBDeVJJUiAleFxuIiwgYmFzZV9hZGRyW0N5UklSXSk7CisJcHJpbnRrKCIgQ3lUSVIgJXhcbiIsIGJhc2VfYWRkcltDeVRJUl0pOworCXByaW50aygiIEN5TUlSICV4XG4iLCBiYXNlX2FkZHJbQ3lNSVJdKTsKKwlwcmludGsoIiBDeVRQUiAleFxuIiwgYmFzZV9hZGRyW0N5VFBSXSk7CisKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworCisvKiBWaXJ0dWFsIFJlZ2lzdGVycyAqLworCisjaWYgMAorCXByaW50aygiIEN5UklWUiAleFxuIiwgYmFzZV9hZGRyW0N5UklWUl0pOworCXByaW50aygiIEN5VElWUiAleFxuIiwgYmFzZV9hZGRyW0N5VElWUl0pOworCXByaW50aygiIEN5TUlWUiAleFxuIiwgYmFzZV9hZGRyW0N5TUlWUl0pOworCXByaW50aygiIEN5TUlTUiAleFxuIiwgYmFzZV9hZGRyW0N5TUlTUl0pOworI2VuZGlmCisKKy8qIENoYW5uZWwgUmVnaXN0ZXJzICovCisKKwlwcmludGsoIiBDeUNDUiAleFxuIiwgYmFzZV9hZGRyW0N5Q0NSXSk7CisJcHJpbnRrKCIgQ3lJRVIgJXhcbiIsIGJhc2VfYWRkcltDeUlFUl0pOworCXByaW50aygiIEN5Q09SMSAleFxuIiwgYmFzZV9hZGRyW0N5Q09SMV0pOworCXByaW50aygiIEN5Q09SMiAleFxuIiwgYmFzZV9hZGRyW0N5Q09SMl0pOworCXByaW50aygiIEN5Q09SMyAleFxuIiwgYmFzZV9hZGRyW0N5Q09SM10pOworCXByaW50aygiIEN5Q09SNCAleFxuIiwgYmFzZV9hZGRyW0N5Q09SNF0pOworCXByaW50aygiIEN5Q09SNSAleFxuIiwgYmFzZV9hZGRyW0N5Q09SNV0pOworI2lmIDAKKwlwcmludGsoIiBDeUNDU1IgJXhcbiIsIGJhc2VfYWRkcltDeUNDU1JdKTsKKwlwcmludGsoIiBDeVJEQ1IgJXhcbiIsIGJhc2VfYWRkcltDeVJEQ1JdKTsKKyNlbmRpZgorCXByaW50aygiIEN5U0NIUjEgJXhcbiIsIGJhc2VfYWRkcltDeVNDSFIxXSk7CisJcHJpbnRrKCIgQ3lTQ0hSMiAleFxuIiwgYmFzZV9hZGRyW0N5U0NIUjJdKTsKKyNpZiAwCisJcHJpbnRrKCIgQ3lTQ0hSMyAleFxuIiwgYmFzZV9hZGRyW0N5U0NIUjNdKTsKKwlwcmludGsoIiBDeVNDSFI0ICV4XG4iLCBiYXNlX2FkZHJbQ3lTQ0hSNF0pOworCXByaW50aygiIEN5U0NSTCAleFxuIiwgYmFzZV9hZGRyW0N5U0NSTF0pOworCXByaW50aygiIEN5U0NSSCAleFxuIiwgYmFzZV9hZGRyW0N5U0NSSF0pOworCXByaW50aygiIEN5TE5DICV4XG4iLCBiYXNlX2FkZHJbQ3lMTkNdKTsKKwlwcmludGsoIiBDeU1DT1IxICV4XG4iLCBiYXNlX2FkZHJbQ3lNQ09SMV0pOworCXByaW50aygiIEN5TUNPUjIgJXhcbiIsIGJhc2VfYWRkcltDeU1DT1IyXSk7CisjZW5kaWYKKwlwcmludGsoIiBDeVJUUFJMICV4XG4iLCBiYXNlX2FkZHJbQ3lSVFBSTF0pOworCXByaW50aygiIEN5UlRQUkggJXhcbiIsIGJhc2VfYWRkcltDeVJUUFJIXSk7CisJcHJpbnRrKCIgQ3lNU1ZSMSAleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdKTsKKwlwcmludGsoIiBDeU1TVlIyICV4XG4iLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworCXByaW50aygiIEN5UkJQUiAleFxuIiwgYmFzZV9hZGRyW0N5UkJQUl0pOworCXByaW50aygiIEN5UkNPUiAleFxuIiwgYmFzZV9hZGRyW0N5UkNPUl0pOworCXByaW50aygiIEN5VEJQUiAleFxuIiwgYmFzZV9hZGRyW0N5VEJQUl0pOworCXByaW50aygiIEN5VENPUiAleFxuIiwgYmFzZV9hZGRyW0N5VENPUl0pOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfSAvKiBzaG93X3N0YXR1cyAqLworI2VuZGlmCisKKworI2lmIDAKKy8qIER1bW15IHJvdXRpbmUgaW4gbXZtZTE2eC9jb25maWcuYyBmb3Igbm93ICovCisKKy8qIFNlcmlhbCBjb25zb2xlIHNldHVwLiBDYWxsZWQgZnJvbSBsaW51eC9pbml0L21haW4uYyAqLworCit2b2lkIGNvbnNvbGVfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisJY2hhciAqczsKKwlpbnQgYmF1ZCwgYml0cywgcGFyaXR5OworCWludCBjZmxhZyA9IDA7CisKKwkvKiBTYW5pdHkgY2hlY2suICovCisJaWYgKGludHNbMF0gPiAzIHx8IGludHNbMV0gPiAzKSByZXR1cm47CisKKwkvKiBHZXQgYmF1ZCwgYml0cyBhbmQgcGFyaXR5ICovCisJYmF1ZCA9IDI0MDA7CisJYml0cyA9IDg7CisJcGFyaXR5ID0gJ24nOworCWlmIChpbnRzWzJdKSBiYXVkID0gaW50c1syXTsKKwlpZiAoKHMgPSBzdHJjaHIoc3RyLCAnLCcpKSkgeworCQlkbyB7CisJCQlzKys7CisJCX0gd2hpbGUoKnMgPj0gJzAnICYmICpzIDw9ICc5Jyk7CisJCWlmICgqcykgcGFyaXR5ID0gKnMrKzsKKwkJaWYgKCpzKSBiaXRzICAgPSAqcyAtICcwJzsKKwl9CisKKwkvKiBOb3cgY29uc3RydWN0IGEgY2ZsYWcgc2V0dGluZy4gKi8KKwlzd2l0Y2goYmF1ZCkgeworCQljYXNlIDEyMDA6CisJCQljZmxhZyB8PSBCMTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDk2MDA6CisJCQljZmxhZyB8PSBCOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY2ZsYWcgfD0gQjE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgMzg0MDA6CisJCQljZmxhZyB8PSBCMzg0MDA7CisJCQlicmVhazsKKwkJY2FzZSAyNDAwOgorCQlkZWZhdWx0OgorCQkJY2ZsYWcgfD0gQjI0MDA7CisJCQlicmVhazsKKwl9CisJc3dpdGNoKGJpdHMpIHsKKwkJY2FzZSA3OgorCQkJY2ZsYWcgfD0gQ1M3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgODoKKwkJCWNmbGFnIHw9IENTODsKKwkJCWJyZWFrOworCX0KKwlzd2l0Y2gocGFyaXR5KSB7CisJCWNhc2UgJ28nOiBjYXNlICdPJzoKKwkJCWNmbGFnIHw9IFBBUk9ERDsKKwkJCWJyZWFrOworCQljYXNlICdlJzogY2FzZSAnRSc6CisJCQljZmxhZyB8PSBQQVJFTkI7CisJCQlicmVhazsKKwl9CisKKwlzZXJpYWxfY29uc29sZV9pbmZvID0gJmN5X3BvcnRbaW50c1sxXV07CisJc2VyaWFsX2NvbnNvbGVfY2ZsYWcgPSBjZmxhZzsKKwlzZXJpYWxfY29uc29sZSA9IGludHNbMV0gKyA2NDsgLypjYWxsb3V0X2RyaXZlci5taW5vcl9zdGFydCovCit9CisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgcHJvYmFibHkgb3V0IG9mIGRhdGUgZm9yIDIuMS54IHNlcmlhbCBjb25zb2xlIHN0dWZmLgorICoKKyAqIFRoZSBjb25zb2xlIGlzIHJlZ2lzdGVyZWQgZWFybHkgb24gZnJvbSBhcmNoL202OGsva2VybmVsL3NldHVwLmMsIGFuZAorICogaXQgdGhlcmVmb3JlIHJlbGllcyBvbiB0aGUgY2hpcCBiZWluZyBzZXR1cCBjb3JyZWN0bHkgYnkgMTY2LUJ1Zy4gIFRoaXMKKyAqIHNlZW1zIHJlYXNvbmFibGUsIGFzIHRoZSBzZXJpYWwgcG9ydCBoYXMgYmVlbiB1c2VkIHRvIGludm9rZSB0aGUgc3lzdGVtCisgKiBib290LiAgSXQgYWxzbyBtZWFucyB0aGF0IHRoaXMgZnVuY3Rpb24gbXVzdCBub3QgcmVseSBvbiBhbnkgZGF0YQorICogaW5pdGlhbGlzYXRpb24gcGVyZm9ybWVkIGJ5IHNlcmlhbDE2N19pbml0KCkgZXRjLgorICoKKyAqIE9mIGNvdXJzZSwgb25jZSB0aGUgY29uc29sZSBoYXMgYmVlbiByZWdpc3RlcmVkLCB3ZSBoYWQgYmV0dGVyIGVuc3VyZQorICogdGhhdCBzZXJpYWwxNjdfaW5pdCgpIGRvZXNuJ3QgbGVhdmUgdGhlIGNoaXAgbm9uLWZ1bmN0aW9uYWwuCisgKgorICogVGhlIGNvbnNvbGUgbXVzdCBiZSBsb2NrZWQgd2hlbiB3ZSBnZXQgaGVyZS4KKyAqLworCit2b2lkIHNlcmlhbDE2N19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBjb3VudCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9sYXRpbGUgdV9jaGFyIHNpbms7CisJdV9jaGFyIGllcjsKKwlpbnQgcG9ydDsKKwl1X2NoYXIgZG9fbGYgPSAwOworCWludCBpID0gMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIEVuc3VyZSB0cmFuc21pdHRlciBpcyBlbmFibGVkISAqLworCisJcG9ydCA9IDA7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpcG9ydDsKKwl3aGlsZSAoYmFzZV9hZGRyW0N5Q0NSXSkKKwkJOworCWJhc2VfYWRkcltDeUNDUl0gPSBDeUVOQl9YTVRSOworCisJaWVyID0gYmFzZV9hZGRyW0N5SUVSXTsKKwliYXNlX2FkZHJbQ3lJRVJdID0gQ3lUeE1wdHk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocGNjMmNoaXBbUGNjU0NDVElDUl0gJiAweDIwKQorCQl7CisJCQkvKiBXZSBoYXZlIGEgVHggaW50LiBBY2tub3dsZWRnZSBpdCAqLworCQkJc2luayA9IHBjYzJjaGlwW1BjY1RQSUFDS1JdOworCQkJaWYgKChiYXNlX2FkZHJbQ3lMSUNSXSA+PiAyKSA9PSBwb3J0KSB7CisJCQkJaWYgKGkgPT0gY291bnQpIHsKKwkJCQkJLyogTGFzdCBjaGFyIG9mIHN0cmluZyBpcyBub3cgb3V0cHV0ICovCisJCQkJCWJhc2VfYWRkcltDeVRFT0lSXSA9IEN5Tk9UUkFOUzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChkb19sZikgeworCQkJCQliYXNlX2FkZHJbQ3lURFJdID0gJ1xuJzsKKwkJCQkJc3RyKys7CisJCQkJCWkrKzsKKwkJCQkJZG9fbGYgPSAwOworCQkJCX0KKwkJCQllbHNlIGlmICgqc3RyID09ICdcbicpIHsKKwkJCQkJYmFzZV9hZGRyW0N5VERSXSA9ICdccic7CisJCQkJCWRvX2xmID0gMTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJhc2VfYWRkcltDeVREUl0gPSAqc3RyKys7CisJCQkJCWkrKzsKKwkJCQl9CisJCQkJYmFzZV9hZGRyW0N5VEVPSVJdID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCQliYXNlX2FkZHJbQ3lURU9JUl0gPSBDeU5PVFJBTlM7CisJCX0KKwl9CisKKwliYXNlX2FkZHJbQ3lJRVJdID0gaWVyOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbDE2N19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwkqaW5kZXggPSBjLT5pbmRleDsKKwlyZXR1cm4gY3lfc2VyaWFsX2RyaXZlcjsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzZXJpYWwxNjdfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPSB7CisJLm5hbWUJCT0gInR0eVMiLAorCS53cml0ZQkJPSBzZXJpYWwxNjdfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlCQk9IHNlcmlhbDE2N19jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gc2VyaWFsMTY3X2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHNlcmlhbDE2N19jb25zb2xlX2luaXQodm9pZCkKK3sKKwlpZiAodm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfTVZNRTE2NiB8fAorCQkJdm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfTVZNRTE2NyB8fAorCQkJdm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfTVZNRTE3NykgeworCQltdm1lMTY3X3NlcmlhbF9jb25zb2xlX3NldHVwKDApOworCQlyZWdpc3Rlcl9jb25zb2xlKCZzZXJjb25zKTsKKwl9CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKHNlcmlhbDE2N19jb25zb2xlX2luaXQpOworCisjaWZkZWYgQ09ORklHX1JFTU9URV9ERUJVRwordm9pZCBwdXREZWJ1Z0NoYXIgKGludCBjKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2xhdGlsZSB1X2NoYXIgc2luazsKKwl1X2NoYXIgaWVyOworCWludCBwb3J0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogRW5zdXJlIHRyYW5zbWl0dGVyIGlzIGVuYWJsZWQhICovCisKKwlwb3J0ID0gREVCVUdfUE9SVDsKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhcilwb3J0OworCXdoaWxlIChiYXNlX2FkZHJbQ3lDQ1JdKQorCQk7CisJYmFzZV9hZGRyW0N5Q0NSXSA9IEN5RU5CX1hNVFI7CisKKwlpZXIgPSBiYXNlX2FkZHJbQ3lJRVJdOworCWJhc2VfYWRkcltDeUlFUl0gPSBDeVR4TXB0eTsKKworCXdoaWxlICgxKSB7CisJCWlmIChwY2MyY2hpcFtQY2NTQ0NUSUNSXSAmIDB4MjApCisJCXsKKwkJCS8qIFdlIGhhdmUgYSBUeCBpbnQuIEFja25vd2xlZGdlIGl0ICovCisJCQlzaW5rID0gcGNjMmNoaXBbUGNjVFBJQUNLUl07CisJCQlpZiAoKGJhc2VfYWRkcltDeUxJQ1JdID4+IDIpID09IHBvcnQpIHsKKwkJCQliYXNlX2FkZHJbQ3lURFJdID0gYzsKKwkJCQliYXNlX2FkZHJbQ3lURU9JUl0gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJCWJhc2VfYWRkcltDeVRFT0lSXSA9IEN5Tk9UUkFOUzsKKwkJfQorCX0KKworCWJhc2VfYWRkcltDeUlFUl0gPSBpZXI7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK2ludCBnZXREZWJ1Z0NoYXIoKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2xhdGlsZSB1X2NoYXIgc2luazsKKwl1X2NoYXIgaWVyOworCWludCBwb3J0OworCWludCBpLCBjOworCisJaSA9IGRlYnVnaXEub3V0OworCWlmIChpICE9IGRlYnVnaXEuaW4pIHsKKwkJYyA9IGRlYnVnaXEuYnVmW2ldOworCQlpZiAoKytpID09IERFQlVHX0xFTikKKwkJCWkgPSAwOworCQlkZWJ1Z2lxLm91dCA9IGk7CisJCXJldHVybiBjOworCX0KKwkvKiBPSywgbm90aGluZyBpbiBxdWV1ZSwgd2FpdCBpbiBwb2xsIGxvb3AgKi8KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIEVuc3VyZSByZWNlaXZlciBpcyBlbmFibGVkISAqLworCisJcG9ydCA9IERFQlVHX1BPUlQ7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpcG9ydDsKKyNpZiAwCisJd2hpbGUgKGJhc2VfYWRkcltDeUNDUl0pCisJCTsKKwliYXNlX2FkZHJbQ3lDQ1JdID0gQ3lFTkJfUkNWUjsKKyNlbmRpZgorCWllciA9IGJhc2VfYWRkcltDeUlFUl07CisJYmFzZV9hZGRyW0N5SUVSXSA9IEN5UnhEYXRhOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHBjYzJjaGlwW1BjY1NDQ1JJQ1JdICYgMHgyMCkKKwkJeworCQkJLyogV2UgaGF2ZSBhIFJ4IGludC4gQWNrbm93bGVkZ2UgaXQgKi8KKwkJCXNpbmsgPSBwY2MyY2hpcFtQY2NSUElBQ0tSXTsKKwkJCWlmICgoYmFzZV9hZGRyW0N5TElDUl0gPj4gMikgPT0gcG9ydCkgeworCQkJCWludCBjbnQgPSBiYXNlX2FkZHJbQ3lSRk9DXTsKKwkJCQl3aGlsZSAoY250LS0gPiAwKQorCQkJCXsKKwkJCQkJYyA9IGJhc2VfYWRkcltDeVJEUl07CisJCQkJCWlmIChjID09IDApCisJCQkJCQlwcmludGsgKCIhISBkZWJ1ZyBjaGFyIGlzIG51bGwgKGNudD0lZCkgISEiLCBjbnQpOworCQkJCQllbHNlCisJCQkJCQlxdWV1ZURlYnVnQ2hhciAoYyk7CisJCQkJfQorCQkJCWJhc2VfYWRkcltDeVJFT0lSXSA9IDA7CisJCQkJaSA9IGRlYnVnaXEub3V0OworCQkJCWlmIChpID09IGRlYnVnaXEuaW4pCisJCQkJCXBhbmljICgiRGVidWcgaW5wdXQgcXVldWUgZW1wdHkhIik7CisJCQkJYyA9IGRlYnVnaXEuYnVmW2ldOworCQkJCWlmICgrK2kgPT0gREVCVUdfTEVOKQorCQkJCQlpID0gMDsKKwkJCQlkZWJ1Z2lxLm91dCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQkJYmFzZV9hZGRyW0N5UkVPSVJdID0gQ3lOT1RSQU5TOworCQl9CisJfQorCisJYmFzZV9hZGRyW0N5SUVSXSA9IGllcjsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAoYyk7Cit9CisKK3ZvaWQgcXVldWVEZWJ1Z0NoYXIgKGludCBjKQoreworCWludCBpOworCisJaSA9IGRlYnVnaXEuaW47CisJZGVidWdpcS5idWZbaV0gPSBjOworCWlmICgrK2kgPT0gREVCVUdfTEVOKQorCQlpID0gMDsKKwlpZiAoaSAhPSBkZWJ1Z2lxLm91dCkKKwkJZGVidWdpcS5pbiA9IGk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z19zZXR1cCgpCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIGludCAgIGksIGNmbGFnOworCisgICAgY2ZsYWcgPSBCMTkyMDA7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKwliYXNlX2FkZHJbQ3lDQVJdID0gaTsKKwliYXNlX2FkZHJbQ3lMSUNSXSA9IGkgPDwgMjsKKyAgICB9CisKKyAgICBkZWJ1Z2lxLmluID0gZGVidWdpcS5vdXQgPSAwOworCisgICAgYmFzZV9hZGRyW0N5Q0FSXSA9IERFQlVHX1BPUlQ7CisKKyAgICAvKiBiYXVkIHJhdGUgKi8KKyAgICBpID0gY2ZsYWcgJiBDQkFVRDsKKworICAgIGJhc2VfYWRkcltDeUlFUl0gPSAwOworCisgICAgYmFzZV9hZGRyW0N5Q01SXSA9IEN5QVNZTkM7CisgICAgYmFzZV9hZGRyW0N5TElDUl0gPSBERUJVR19QT1JUIDw8IDI7CisgICAgYmFzZV9hZGRyW0N5TElWUl0gPSAweDVjOworCisgICAgLyogdHggYW5kIHJ4IGJhdWQgcmF0ZSAqLworCisgICAgYmFzZV9hZGRyW0N5VENPUl0gPSBiYXVkX2NvW2ldOworICAgIGJhc2VfYWRkcltDeVRCUFJdID0gYmF1ZF9icHJbaV07CisgICAgYmFzZV9hZGRyW0N5UkNPUl0gPSBiYXVkX2NvW2ldID4+IDU7CisgICAgYmFzZV9hZGRyW0N5UkJQUl0gPSBiYXVkX2JwcltpXTsKKworICAgIC8qIHNldCBsaW5lIGNoYXJhY3RlcmlzdGljcyAgYWNjb3JkaW5nIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIGJhc2VfYWRkcltDeVNDSFIxXSA9IDA7CisgICAgYmFzZV9hZGRyW0N5U0NIUjJdID0gMDsKKyAgICBiYXNlX2FkZHJbQ3lTQ1JMXSA9IDA7CisgICAgYmFzZV9hZGRyW0N5U0NSSF0gPSAwOworICAgIGJhc2VfYWRkcltDeUNPUjFdID0gQ3lfOF9CSVRTIHwgQ3lQQVJJVFlfTk9ORTsKKyAgICBiYXNlX2FkZHJbQ3lDT1IyXSA9IDA7CisgICAgYmFzZV9hZGRyW0N5Q09SM10gPSBDeV8xX1NUT1A7CisgICAgYmFzZV9hZGRyW0N5Q09SNF0gPSBiYXVkX2NvcjRbaV07CisgICAgYmFzZV9hZGRyW0N5Q09SNV0gPSAwOworICAgIGJhc2VfYWRkcltDeUNPUjZdID0gMDsKKyAgICBiYXNlX2FkZHJbQ3lDT1I3XSA9IDA7CisKKyAgICB3cml0ZV9jeV9jbWQoYmFzZV9hZGRyLEN5SU5JVF9DSEFOKTsKKyAgICB3cml0ZV9jeV9jbWQoYmFzZV9hZGRyLEN5RU5CX1JDVlIpOworCisgICAgYmFzZV9hZGRyW0N5Q0FSXSA9IERFQlVHX1BPUlQ7IC8qICEhISBJcyB0aGlzIG5lZWRlZD8gKi8KKworICAgIGJhc2VfYWRkcltDeVJUUFJMXSA9IDI7CisgICAgYmFzZV9hZGRyW0N5UlRQUkhdID0gMDsKKworICAgIGJhc2VfYWRkcltDeU1TVlIxXSA9IEN5UlRTOworICAgIGJhc2VfYWRkcltDeU1TVlIyXSA9IEN5RFRSOworCisgICAgYmFzZV9hZGRyW0N5SUVSXSA9IEN5UnhEYXRhOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCit9IC8qIGRlYnVnX3NldHVwICovCisKKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zYy5jIGIvZHJpdmVycy9jaGFyL3Nuc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI5MTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Nuc2MuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIFNOIFBsYXRmb3JtIHN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24gc3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworLyoKKyAqIFN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24gZHJpdmVyCisgKgorICogVGhpcyBkcml2ZXIgYWxsb3dzIGEgdXNlciBwcm9jZXNzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHN5c3RlbQorICogY29udHJvbGxlciAoYS5rLmEuICJJUm91dGVyIikgbmV0d29yayBpbiBhbiBTR0kgU04gc3lzdGVtLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc24vZ2VvLmg+CisjaW5jbHVkZSA8YXNtL3NuL25vZGVwZGEuaD4KKyNpbmNsdWRlICJzbnNjLmgiCisKKyNkZWZpbmUgU1lTQ1RMX0JBU0VOQU1FCSJzbnNjIgorCisjZGVmaW5lIFNDRFJWX0JVRlNaCTIwNDgKKyNkZWZpbmUgU0NEUlZfVElNRU9VVAkxMDAwCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorc2NkcnZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnN1YmNoX2RhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzdWJjaF9kYXRhX3MgKnNkID0gc3ViY2hfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZzZC0+c2Rfd2xvY2spOworCXN0YXR1cyA9IGlhNjRfc25faXJ0cl9pbnRyKHNkLT5zZF9uYXNpZCwgc2QtPnNkX3N1YmNoKTsKKworCWlmIChzdGF0dXMgPiAwKSB7CisJCWlmIChzdGF0dXMgJiBTQUxfSVJPVVRFUl9JTlRSX1JFQ1YpIHsKKwkJCXdha2VfdXAoJnNkLT5zZF9ycSk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFNBTF9JUk9VVEVSX0lOVFJfWE1JVCkgeworCQkJaWE2NF9zbl9pcnRyX2ludHJfZGlzYWJsZQorCQkJICAgIChzZC0+c2RfbmFzaWQsIHNkLT5zZF9zdWJjaCwKKwkJCSAgICAgU0FMX0lST1VURVJfSU5UUl9YTUlUKTsKKwkJCXdha2VfdXAoJnNkLT5zZF93cSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnNkLT5zZF93bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogc2NkcnZfb3BlbgorICoKKyAqIFJlc2VydmUgYSBzdWJjaGFubmVsIGZvciBzeXN0ZW0gY29udHJvbGxlciBjb21tdW5pY2F0aW9uLgorICovCisKK3N0YXRpYyBpbnQKK3NjZHJ2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN5c2N0bF9kYXRhX3MgKnNjZDsKKwlzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpzZDsKKwlpbnQgcnY7CisKKwkvKiBsb29rIHVwIGRldmljZSBpbmZvIGZvciB0aGlzIGRldmljZSBmaWxlICovCisJc2NkID0gY29udGFpbmVyX29mKGlub2RlLT5pX2NkZXYsIHN0cnVjdCBzeXNjdGxfZGF0YV9zLCBzY2RfY2Rldik7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmNoYW5uZWwgZGF0YSAqLworCXNkID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBzdWJjaF9kYXRhX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2QgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBzdWJjaGFubmVsIGRhdGFcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBpbml0aWFsaXplIHN1YmNoX2RhdGFfcyBmaWVsZHMgKi8KKwltZW1zZXQoc2QsIDAsIHNpemVvZiAoc3RydWN0IHN1YmNoX2RhdGFfcykpOworCXNkLT5zZF9uYXNpZCA9IHNjZC0+c2NkX25hc2lkOworCXNkLT5zZF9zdWJjaCA9IGlhNjRfc25faXJ0cl9vcGVuKHNjZC0+c2NkX25hc2lkKTsKKworCWlmIChzZC0+c2Rfc3ViY2ggPCAwKSB7CisJCWtmcmVlKHNkKTsKKwkJcHJpbnRrKCIlczogY291bGRuJ3QgYWxsb2NhdGUgc3ViY2hhbm5lbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmc2QtPnNkX3Jsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmc2QtPnNkX3dsb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZC0+c2RfcnEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkLT5zZF93cSk7CisJc2VtYV9pbml0KCZzZC0+c2RfcmJzLCAxKTsKKwlzZW1hX2luaXQoJnNkLT5zZF93YnMsIDEpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc2Q7CisKKwkvKiBob29rIHRoaXMgc3ViY2hhbm5lbCB1cCB0byB0aGUgc3lzdGVtIGNvbnRyb2xsZXIgaW50ZXJydXB0ICovCisJcnYgPSByZXF1ZXN0X2lycShTR0lfVUFSVF9WRUNUT1IsIHNjZHJ2X2ludGVycnVwdCwKKwkJCSBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwKKwkJCSBTWVNDVExfQkFTRU5BTUUsIHNkKTsKKwlpZiAocnYpIHsKKwkJaWE2NF9zbl9pcnRyX2Nsb3NlKHNkLT5zZF9uYXNpZCwgc2QtPnNkX3N1YmNoKTsKKwkJa2ZyZWUoc2QpOworCQlwcmludGsoIiVzOiBpcnEgcmVxdWVzdCBmYWlsZWQgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBydik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzY2Rydl9yZWxlYXNlCisgKgorICogUmVsZWFzZSBhIHByZXZpb3VzbHktcmVzZXJ2ZWQgc3ViY2hhbm5lbC4KKyAqLworCitzdGF0aWMgaW50CitzY2Rydl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdWJjaF9kYXRhX3MgKnNkID0gKHN0cnVjdCBzdWJjaF9kYXRhX3MgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBydjsKKworCS8qIGZyZWUgdGhlIGludGVycnVwdCAqLworCWZyZWVfaXJxKFNHSV9VQVJUX1ZFQ1RPUiwgc2QpOworCisJLyogYXNrIFNBTCB0byBjbG9zZSB0aGUgc3ViY2hhbm5lbCAqLworCXJ2ID0gaWE2NF9zbl9pcnRyX2Nsb3NlKHNkLT5zZF9uYXNpZCwgc2QtPnNkX3N1YmNoKTsKKworCWtmcmVlKHNkKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBzY2Rydl9yZWFkCisgKgorICogQ2FsbGVkIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgb3BlbiBJUm91dGVyIHBpcGUuCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50CityZWFkX3N0YXR1c19jaGVjayhzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpzZCwgaW50ICpsZW4pCit7CisJcmV0dXJuIGlhNjRfc25faXJ0cl9yZWN2KHNkLT5zZF9uYXNpZCwgc2QtPnNkX3N1YmNoLCBzZC0+c2RfcmIsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzY2Rydl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCit7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHN1YmNoX2RhdGFfcyAqc2QgPSAoc3RydWN0IHN1YmNoX2RhdGFfcyAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB0cnkgdG8gZ2V0IGNvbnRyb2wgb2YgdGhlIHJlYWQgYnVmZmVyICovCisJaWYgKGRvd25fdHJ5bG9jaygmc2QtPnNkX3JicykpIHsKKwkJLyogc29tZWJvZHkgZWxzZSBoYXMgaXQgbm93OworCQkgKiBpZiB3ZSdyZSBub24tYmxvY2tpbmcsIHRoZW4gZXhpdC4uLgorCQkgKi8KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQkvKiAuLi5vciBpZiB3ZSB3YW50IHRvIGJsb2NrLCB0aGVuIGRvIHNvIGhlcmUgKi8KKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2QtPnNkX3JicykpIHsKKwkJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggd2FpdCAqLworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKworCS8qIGFueXRoaW5nIHRvIHJlYWQ/ICovCisJbGVuID0gQ0hVTktTSVpFOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkX3N0YXR1c19jaGVjayhzZCwgJmxlbik7CisKKwkvKiBpZiBub3QsIGFuZCB3ZSdyZSBibG9ja2luZyBJL08sIGxvb3AgKi8KKwl3aGlsZSAoc3RhdHVzIDwgMCkgeworCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkLT5zZF9ybG9jaywgZmxhZ3MpOworCQkJdXAoJnNkLT5zZF9yYnMpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKworCQlsZW4gPSBDSFVOS1NJWkU7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKCZzZC0+c2RfcnEsICZ3YWl0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisKKwkJc2NoZWR1bGVfdGltZW91dChTQ0RSVl9USU1FT1VUKTsKKworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmc2QtPnNkX3JxLCAmd2FpdCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJLyogd2FpdCB3YXMgaW50ZXJydXB0ZWQgKi8KKwkJCXVwKCZzZC0+c2RfcmJzKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisJCXN0YXR1cyA9IHJlYWRfc3RhdHVzX2NoZWNrKHNkLCAmbGVuKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisKKwlpZiAobGVuID4gMCkgeworCQkvKiB3ZSByZWFkIHNvbWV0aGluZyBpbiB0aGUgbGFzdCByZWFkX3N0YXR1c19jaGVjaygpOyBjb3B5CisJCSAqIGl0IG91dCB0byB1c2VyIHNwYWNlCisJCSAqLworCQlpZiAoY291bnQgPCBsZW4pIHsKKwkJCXByX2RlYnVnKCIlczogb25seSBhY2NlcHRpbmcgJWQgb2YgJWQgYnl0ZXNcbiIsCisJCQkJIF9fRlVOQ1RJT05fXywgKGludCkgY291bnQsIGxlbik7CisJCX0KKwkJbGVuID0gbWluKChpbnQpIGNvdW50LCBsZW4pOworCQlpZiAoY29weV90b191c2VyKGJ1Ziwgc2QtPnNkX3JiLCBsZW4pKQorCQkJbGVuID0gLUVGQVVMVDsKKwl9CisKKwkvKiByZWxlYXNlIHRoZSByZWFkIGJ1ZmZlciBhbmQgd2FrZSBhbnlvbmUgd2hvIG1pZ2h0IGJlCisJICogd2FpdGluZyBmb3IgaXQKKwkgKi8KKwl1cCgmc2QtPnNkX3Jicyk7CisKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW4gKi8KKwlyZXR1cm4gbGVuOworfQorCisvKgorICogc2NkcnZfd3JpdGUKKyAqCisgKiBXcml0ZXMgYSBjaHVuayBvZiBhbiBJUm91dGVyIHBhY2tldCAob3Igb3RoZXIgc3lzdGVtIGNvbnRyb2xsZXIgZGF0YSkKKyAqIHRvIHRoZSBzeXN0ZW0gY29udHJvbGxlci4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3cml0ZV9zdGF0dXNfY2hlY2soc3RydWN0IHN1YmNoX2RhdGFfcyAqc2QsIGludCBjb3VudCkKK3sKKwlyZXR1cm4gaWE2NF9zbl9pcnRyX3NlbmQoc2QtPnNkX25hc2lkLCBzZC0+c2Rfc3ViY2gsIHNkLT5zZF93YiwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdAorc2NkcnZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXM7CisJc3RydWN0IHN1YmNoX2RhdGFfcyAqc2QgPSAoc3RydWN0IHN1YmNoX2RhdGFfcyAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB0cnkgdG8gZ2V0IGNvbnRyb2wgb2YgdGhlIHdyaXRlIGJ1ZmZlciAqLworCWlmIChkb3duX3RyeWxvY2soJnNkLT5zZF93YnMpKSB7CisJCS8qIHNvbWVib2R5IGVsc2UgaGFzIGl0IG5vdzsKKwkJICogaWYgd2UncmUgbm9uLWJsb2NraW5nLCB0aGVuIGV4aXQuLi4KKwkJICovCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJLyogLi4ub3IgaWYgd2Ugd2FudCB0byBibG9jaywgdGhlbiBkbyBzbyBoZXJlICovCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNkLT5zZF93YnMpKSB7CisJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHdhaXQgKi8KKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwl9CisKKwljb3VudCA9IG1pbigoaW50KSBjb3VudCwgQ0hVTktTSVpFKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoc2QtPnNkX3diLCBidWYsIGNvdW50KSkgeworCQl1cCgmc2QtPnNkX3dicyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIHRyeSB0byBzZW5kIHRoZSBidWZmZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2QtPnNkX3dsb2NrLCBmbGFncyk7CisJc3RhdHVzID0gd3JpdGVfc3RhdHVzX2NoZWNrKHNkLCBjb3VudCk7CisKKwkvKiBpZiB3ZSBmYWlsZWQsIGFuZCB3ZSB3YW50IHRvIGJsb2NrLCB0aGVuIGxvb3AgKi8KKwl3aGlsZSAoc3RhdHVzIDw9IDApIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlzcGluX3VubG9jaygmc2QtPnNkX3dsb2NrKTsKKwkJCXVwKCZzZC0+c2Rfd2JzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnNkLT5zZF93cSwgJndhaXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZC0+c2Rfd2xvY2ssIGZsYWdzKTsKKworCQlzY2hlZHVsZV90aW1lb3V0KFNDRFJWX1RJTUVPVVQpOworCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzZC0+c2Rfd3EsICZ3YWl0KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkvKiB3YWl0IHdhcyBpbnRlcnJ1cHRlZCAqLworCQkJdXAoJnNkLT5zZF93YnMpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZC0+c2Rfd2xvY2ssIGZsYWdzKTsKKwkJc3RhdHVzID0gd3JpdGVfc3RhdHVzX2NoZWNrKHNkLCBjb3VudCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkLT5zZF93bG9jaywgZmxhZ3MpOworCisJLyogcmVsZWFzZSB0aGUgd3JpdGUgYnVmZmVyIGFuZCB3YWtlIGFueW9uZSB3aG8ncyB3YWl0aW5nIGZvciBpdCAqLworCXVwKCZzZC0+c2Rfd2JzKTsKKworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWNjZXB0ZWQgKHNob3VsZCBiZSB0aGUgY29tcGxldGUKKwkgKiAiY2h1bmsiIGFzIHJlcXVlc3RlZCkKKwkgKi8KKwlpZiAoKHN0YXR1cyA+PSAwKSAmJiAoc3RhdHVzIDwgY291bnQpKSB7CisJCXByX2RlYnVnKCJEaWRuJ3QgYWNjZXB0IHRoZSBmdWxsIGNodW5rOyAlZCBvZiAlZFxuIiwKKwkJCSBzdGF0dXMsIChpbnQpIGNvdW50KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc2NkcnZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpzZCA9IChzdHJ1Y3Qgc3ViY2hfZGF0YV9zICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcG9sbF93YWl0KGZpbGUsICZzZC0+c2RfcnEsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmc2QtPnNkX3dxLCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnNkLT5zZF93bG9jayk7CisJc3RhdHVzID0gaWE2NF9zbl9pcnRyX2ludHIoc2QtPnNkX25hc2lkLCBzZC0+c2Rfc3ViY2gpOworCXNwaW5fdW5sb2NrKCZzZC0+c2Rfd2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkLT5zZF9ybG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXR1cyA+IDApIHsKKwkJaWYgKHN0YXR1cyAmIFNBTF9JUk9VVEVSX0lOVFJfUkVDVikgeworCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9CisJCWlmIChzdGF0dXMgJiBTQUxfSVJPVVRFUl9JTlRSX1hNSVQpIHsKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2NkcnZfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVhZCA9CQlzY2Rydl9yZWFkLAorCS53cml0ZSA9CXNjZHJ2X3dyaXRlLAorCS5wb2xsID0JCXNjZHJ2X3BvbGwsCisJLm9wZW4gPQkJc2NkcnZfb3BlbiwKKwkucmVsZWFzZSA9CXNjZHJ2X3JlbGVhc2UsCit9OworCisvKgorICogc2NkcnZfaW5pdAorICoKKyAqIENhbGxlZCBhdCBib290IHRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgc3lzdGVtIGNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbgorICogZmFjaWxpdHkuCisgKi8KK2ludCBfX2luaXQKK3NjZHJ2X2luaXQodm9pZCkKK3sKKwlnZW9pZF90IGdlb2lkOworCWNub2RlaWRfdCBjbm9kZTsKKwljaGFyIGRldm5hbWVbMzJdOworCWNoYXIgKmRldm5hbWVwOworCXN0cnVjdCBzeXNjdGxfZGF0YV9zICpzY2Q7CisJdm9pZCAqc2FsYnVmOworCXN0cnVjdCBjbGFzc19zaW1wbGUgKnNuc2NfY2xhc3M7CisJZGV2X3QgZmlyc3RfZGV2LCBkZXY7CisKKwlpZiAoYWxsb2NfY2hyZGV2X3JlZ2lvbigmZmlyc3RfZGV2LCAwLCBudW1pb25vZGVzLAorCQkJCVNZU0NUTF9CQVNFTkFNRSkgPCAwKSB7CisJCXByaW50aygiJXM6IGZhaWxlZCB0byByZWdpc3RlciBTTiBzeXN0ZW0gY29udHJvbGxlciBkZXZpY2VcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc25zY19jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsIFNZU0NUTF9CQVNFTkFNRSk7CisKKwlmb3IgKGNub2RlID0gMDsgY25vZGUgPCBudW1pb25vZGVzOyBjbm9kZSsrKSB7CisJCQlnZW9pZCA9IGNub2RlaWRfZ2V0X2dlb2lkKGNub2RlKTsKKwkJCWRldm5hbWVwID0gZGV2bmFtZTsKKwkJCWZvcm1hdF9tb2R1bGVfaWQoZGV2bmFtZXAsIGdlb19tb2R1bGUoZ2VvaWQpLAorCQkJCQkgTU9EVUxFX0ZPUk1BVF9CUklFRik7CisJCQlkZXZuYW1lcCA9IGRldm5hbWUgKyBzdHJsZW4oZGV2bmFtZSk7CisJCQlzcHJpbnRmKGRldm5hbWVwLCAiIyVkIiwgZ2VvX3NsYWIoZ2VvaWQpKTsKKworCQkJLyogYWxsb2NhdGUgc3lzY3RsIGRldmljZSBkYXRhICovCisJCQlzY2QgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IHN5c2N0bF9kYXRhX3MpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFzY2QpIHsKKwkJCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIGluZm8iCisJCQkJICAgICAgICJmb3IgJXMvJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgU1lTQ1RMX0JBU0VOQU1FLCBkZXZuYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1lbXNldChzY2QsIDAsIHNpemVvZiAoc3RydWN0IHN5c2N0bF9kYXRhX3MpKTsKKworCQkJLyogaW5pdGlhbGl6ZSBzeXNjdGwgZGV2aWNlIGRhdGEgZmllbGRzICovCisJCQlzY2QtPnNjZF9uYXNpZCA9IGNub2RlaWRfdG9fbmFzaWQoY25vZGUpOworCQkJaWYgKCEoc2FsYnVmID0ga21hbGxvYyhTQ0RSVl9CVUZTWiwgR0ZQX0tFUk5FTCkpKSB7CisJCQkJcHJpbnRrKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGRyaXZlciBidWZmZXIiCisJCQkJICAgICAgICIoJXMlcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgU1lTQ1RMX0JBU0VOQU1FLCBkZXZuYW1lKTsKKwkJCQlrZnJlZShzY2QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoaWE2NF9zbl9pcnRyX2luaXQoc2NkLT5zY2RfbmFzaWQsIHNhbGJ1ZiwKKwkJCQkJICAgICAgU0NEUlZfQlVGU1opIDwgMCkgeworCQkJCXByaW50aworCQkJCSAgICAoIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBTQUwgZm9yIgorCQkJCSAgICAgIiBzeXN0ZW0gY29udHJvbGxlciBjb21tdW5pY2F0aW9uIgorCQkJCSAgICAgIiAoJXMvJXMpOiBvdXRkYXRlZCBQUk9NP1xuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgU1lTQ1RMX0JBU0VOQU1FLCBkZXZuYW1lKTsKKwkJCQlrZnJlZShzY2QpOworCQkJCWtmcmVlKHNhbGJ1Zik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRldiA9IGZpcnN0X2RldiArIGNub2RlOworCQkJY2Rldl9pbml0KCZzY2QtPnNjZF9jZGV2LCAmc2NkcnZfZm9wcyk7CisJCQlpZiAoY2Rldl9hZGQoJnNjZC0+c2NkX2NkZXYsIGRldiwgMSkpIHsKKwkJCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc3lzdGVtIgorCQkJCSAgICAgICAiIGNvbnRyb2xsZXIgZGV2aWNlICglcyVzKVxuIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fLCBTWVNDVExfQkFTRU5BTUUsIGRldm5hbWUpOworCQkJCWtmcmVlKHNjZCk7CisJCQkJa2ZyZWUoc2FsYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoc25zY19jbGFzcywgZGV2LCBOVUxMLAorCQkJCQkJIiVzIiwgZGV2bmFtZSk7CisKKwkJCWlhNjRfc25faXJ0cl9pbnRyX2VuYWJsZShzY2QtPnNjZF9uYXNpZCwKKwkJCQkJCSAwIC8qaWdub3JlZCAqLyAsCisJCQkJCQkgU0FMX0lST1VURVJfSU5UUl9SRUNWKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KHNjZHJ2X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Nuc2MuaCBiL2RyaXZlcnMvY2hhci9zbnNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyYzZjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zbnNjLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFNOIFBsYXRmb3JtIHN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24gc3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgYW5kIGRhdGEgdHlwZXMgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUKKyAqIHN5c3RlbSBjb250cm9sbGVycyBpbiBTR0kgU04gc3lzdGVtcy4KKyAqLworCisjaWZuZGVmIF9TTl9TWVNDVExfSF8KKyNkZWZpbmUgX1NOX1NZU0NUTF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjZGVmaW5lIENIVU5LU0laRSAxMjcKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byB0cmFjayBhbiBvcGVuIHN1YmNoYW5uZWwuICovCitzdHJ1Y3Qgc3ViY2hfZGF0YV9zIHsKKwluYXNpZF90IHNkX25hc2lkOwkvKiBub2RlIG9uIHdoaWNoIHRoZSBzdWJjaGFubmVsIHdhcyBvcGVuZWQgKi8KKwlpbnQgc2Rfc3ViY2g7CQkvKiBzdWJjaGFubmVsIG51bWJlciAqLworCXNwaW5sb2NrX3Qgc2RfcmxvY2s7CS8qIG1vbml0b3IgbG9jayBmb3IgcnN2ICovCisJc3BpbmxvY2tfdCBzZF93bG9jazsJLyogbW9uaXRvciBsb2NrIGZvciB3c3YgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzZF9ycTsJLyogd2FpdCBxdWV1ZSBmb3IgcmVhZGVycyAqLworCXdhaXRfcXVldWVfaGVhZF90IHNkX3dxOwkvKiB3YWl0IHF1ZXVlIGZvciB3cml0ZXJzICovCisJc3RydWN0IHNlbWFwaG9yZSBzZF9yYnM7CS8qIHNlbWFwaG9yZSBmb3IgcmVhZCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHNkX3diczsJLyogc2VtYXBob3JlIGZvciB3cml0ZSBidWZmZXIgKi8KKworCWNoYXIgc2RfcmJbQ0hVTktTSVpFXTsJLyogcmVhZCBidWZmZXIgKi8KKwljaGFyIHNkX3diW0NIVU5LU0laRV07CS8qIHdyaXRlIGJ1ZmZlciAqLworfTsKKworc3RydWN0IHN5c2N0bF9kYXRhX3MgeworCXN0cnVjdCBjZGV2IHNjZF9jZGV2OwkvKiBDaGFyYWN0ZXIgZGV2aWNlIGluZm8gKi8KKwluYXNpZF90IHNjZF9uYXNpZDsJLyogTm9kZSBvbiB3aGljaCBzdWJjaGFubmVscyBhcmUgb3BlbmVkLiAqLworfTsKKworI2VuZGlmIC8qIF9TTl9TWVNDVExfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zb255cGkuYyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTdhOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCkBAIC0wLDAgKzEsMTQwMyBAQAorLyoKKyAqIFNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sIERldmljZSBkcml2ZXIgZm9yIFZBSU8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOYXJheWFuYW4gUiBTIDxuYXJzQGthZGFtYmEub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEFsY/R2ZSA8d3d3LmFsY292ZS5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSnVuaWNoaSBNb3JpdGEgPGp1bjFtQG1hcnMuZHRpLm5lLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUYWtheWEgS2luam8gPHQta2luam9AdGM0LnNvLW5ldC5uZS5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CisgKgorICogRWFybGllciB3b3JrIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgUGF1bCBgUnVzdHknIFJ1c3NlbGwgYW5kIFBhdWwgTWFja2VycmFzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zb255cGkuaD4KKworI2RlZmluZSBTT05ZUElfRFJJVkVSX1ZFUlNJT04JICIxLjI2IgorCitNT0RVTEVfQVVUSE9SKCJTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihTT05ZUElfRFJJVkVSX1ZFUlNJT04pOworCitzdGF0aWMgaW50IG1pbm9yID0gLTE7Cittb2R1bGVfcGFyYW0obWlub3IsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAorCQkgIm1pbm9yIG51bWJlciBvZiB0aGUgbWlzYyBkZXZpY2UsIGRlZmF1bHQgaXMgLTEgKGF1dG9tYXRpYykiKTsKKworc3RhdGljIGludCB2ZXJib3NlOwkJLyogPSAwICovCittb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgImJlIHZlcmJvc2UsIGRlZmF1bHQgaXMgMCAobm8pIik7CisKK3N0YXRpYyBpbnQgZm5rZXlpbml0OwkJLyogPSAwICovCittb2R1bGVfcGFyYW0oZm5rZXlpbml0LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmbmtleWluaXQsCisJCSAic2V0IHRoaXMgaWYgeW91ciBGbiBrZXlzIGRvIG5vdCBnZW5lcmF0ZSBhbnkgZXZlbnQiKTsKKworc3RhdGljIGludCBjYW1lcmE7CQkvKiA9IDAgKi8KK21vZHVsZV9wYXJhbShjYW1lcmEsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhbWVyYSwKKwkJICJzZXQgdGhpcyBpZiB5b3UgaGF2ZSBhIE1vdGlvbkV5ZSBjYW1lcmEgKFBpY3R1cmVCb29rIHNlcmllcykiKTsKKworc3RhdGljIGludCBjb21wYXQ7CQkvKiA9IDAgKi8KK21vZHVsZV9wYXJhbShjb21wYXQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbXBhdCwKKwkJICJzZXQgdGhpcyBpZiB5b3Ugd2FudCB0byBlbmFibGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1hc2sgPSAweGZmZmZmZmZmOworbW9kdWxlX3BhcmFtKG1hc2ssIHVsb25nLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWFzaywKKwkJICJzZXQgdGhpcyB0byB0aGUgbWFzayBvZiBldmVudCB5b3Ugd2FudCB0byBlbmFibGUgKHNlZSBkb2MpIik7CisKK3N0YXRpYyBpbnQgdXNlaW5wdXQgPSAxOworbW9kdWxlX3BhcmFtKHVzZWlucHV0LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh1c2VpbnB1dCwKKwkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOworCisjZGVmaW5lIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEJMQorI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKKworLyogdHlwZTEgbW9kZWxzIHVzZSB0aG9zZSAqLworI2RlZmluZSBTT05ZUElfSVJRX1BPUlQJCQkweDgwMzQKKyNkZWZpbmUgU09OWVBJX0lSUV9TSElGVAkJMjIKKyNkZWZpbmUgU09OWVBJX0JBU0UJCQkweDUwCisjZGVmaW5lIFNPTllQSV9HMTBBCQkJKFNPTllQSV9CQVNFKzB4MTQpCisjZGVmaW5lIFNPTllQSV9UWVBFMV9SRUdJT05fU0laRQkweDA4CisjZGVmaW5lIFNPTllQSV9UWVBFMV9FVlRZUEVfT0ZGU0VUCTB4MDQKKworLyogdHlwZTIgc2VyaWVzIHNwZWNpZmljcyAqLworI2RlZmluZSBTT05ZUElfU0lSUQkJCTB4OWIKKyNkZWZpbmUgU09OWVBJX1NMT0IJCQkweDljCisjZGVmaW5lIFNPTllQSV9TSElCCQkJMHg5ZAorI2RlZmluZSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkUJMHgyMAorI2RlZmluZSBTT05ZUElfVFlQRTJfRVZUWVBFX09GRlNFVAkweDEyCisKKy8qIGJhdHRlcnkgLyBicmlnaHRuZXNzIGFkZHJlc3NlcyAqLworI2RlZmluZSBTT05ZUElfQkFUX0ZMQUdTCTB4ODEKKyNkZWZpbmUgU09OWVBJX0xDRF9MSUdIVAkweDk2CisjZGVmaW5lIFNPTllQSV9CQVQxX1BDVFJNCTB4YTAKKyNkZWZpbmUgU09OWVBJX0JBVDFfTEVGVAkweGEyCisjZGVmaW5lIFNPTllQSV9CQVQxX01BWFJUCTB4YTQKKyNkZWZpbmUgU09OWVBJX0JBVDJfUENUUk0JMHhhOAorI2RlZmluZSBTT05ZUElfQkFUMl9MRUZUCTB4YWEKKyNkZWZpbmUgU09OWVBJX0JBVDJfTUFYUlQJMHhhYworI2RlZmluZSBTT05ZUElfQkFUMV9NQVhUSwkweGIwCisjZGVmaW5lIFNPTllQSV9CQVQxX0ZVTEwJMHhiMgorI2RlZmluZSBTT05ZUElfQkFUMl9NQVhUSwkweGI4CisjZGVmaW5lIFNPTllQSV9CQVQyX0ZVTEwJMHhiYQorCisvKiBGQU4wIGluZm9ybWF0aW9uIChyZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBBQ1BJIHRhYmxlcykgKi8KKyNkZWZpbmUgU09OWVBJX0ZBTjBfU1RBVFVTCTB4OTMKKyNkZWZpbmUgU09OWVBJX1RFTVBfU1RBVFVTCTB4QzEKKworLyogaW9wb3J0cyB1c2VkIGZvciBicmlnaHRuZXNzIGFuZCB0eXBlMiBldmVudHMgKi8KKyNkZWZpbmUgU09OWVBJX0RBVEFfSU9QT1JUCTB4NjIKKyNkZWZpbmUgU09OWVBJX0NTVF9JT1BPUlQJMHg2NgorCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGlvcG9ydHMgKi8KK3N0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgeworCXUxNglwb3J0MTsKKwl1MTYJcG9ydDI7Cit9OworCitzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCBzb255cGlfdHlwZTFfaW9wb3J0X2xpc3RbXSA9IHsKKwl7IDB4MTBjMCwgMHgxMGM0IH0sCS8qIGxvb2tzIGxpa2UgdGhlIGRlZmF1bHQgb24gQzFWeCAqLworCXsgMHgxMDgwLCAweDEwODQgfSwKKwl7IDB4MTA5MCwgMHgxMDk0IH0sCisJeyAweDEwYTAsIDB4MTBhNCB9LAorCXsgMHgxMGIwLCAweDEwYjQgfSwKKwl7IDB4MCwgMHgwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0IHNvbnlwaV90eXBlMl9pb3BvcnRfbGlzdFtdID0geworCXsgMHgxMDgwLCAweDEwODQgfSwKKwl7IDB4MTBhMCwgMHgxMGE0IH0sCisJeyAweDEwYzAsIDB4MTBjNCB9LAorCXsgMHgxMGUwLCAweDEwZTQgfSwKKwl7IDB4MCwgMHgwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgaW50ZXJydXB0cyAqLworc3RydWN0IHNvbnlwaV9pcnFfbGlzdCB7CisJdTE2CWlycTsKKwl1MTYJYml0czsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lycV9saXN0IHNvbnlwaV90eXBlMV9pcnFfbGlzdFtdID0geworCXsgMTEsIDB4MiB9LAkvKiBJUlEgMTEsIEdPMjI9MCxHTzIzPTEgaW4gQU1MICovCisJeyAxMCwgMHgxIH0sCS8qIElSUSAxMCwgR08yMj0xLEdPMjM9MCBpbiBBTUwgKi8KKwl7ICA1LCAweDAgfSwJLyogSVJRICA1LCBHTzIyPTAsR08yMz0wIGluIEFNTCAqLworCXsgIDAsIDB4MyB9CS8qIG5vIElSUSwgR08yMj0xLEdPMjM9MSBpbiBBTUwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lycV9saXN0IHNvbnlwaV90eXBlMl9pcnFfbGlzdFtdID0geworCXsgMTEsIDB4ODAgfSwJLyogSVJRIDExLCAweDgwIGluIFNJUlEgaW4gQU1MICovCisJeyAxMCwgMHg0MCB9LAkvKiBJUlEgMTAsIDB4NDAgaW4gU0lSUSBpbiBBTUwgKi8KKwl7ICA5LCAweDIwIH0sCS8qIElSUSAgOSwgMHgyMCBpbiBTSVJRIGluIEFNTCAqLworCXsgIDYsIDB4MTAgfSwJLyogSVJRICA2LCAweDEwIGluIFNJUlEgaW4gQU1MICovCisJeyAgMCwgMHgwMCB9CS8qIG5vIElSUSwgMHgwMCBpbiBTSVJRIGluIEFNTCAqLworfTsKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MJCTAKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUkFTVAkJCTEKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9IVUUJCQkyCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09MT1IJCQkzCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hBUlBORVNTCQkJNAorCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJCTUKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9FWFBPU1VSRV9NQVNLCQkweEMKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9XSElURV9CQUxBTkNFX01BU0sJMHgzCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRV9NT0RFX01BU0sJCTB4MzAKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9NVVRFX01BU0sJCQkweDQwCisKKy8qIHRoZSByZXN0IGRvbid0IG5lZWQgYSBsb29wIHVudGlsIG5vdCAweGZmICovCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDCQkJNgorI2RlZmluZSBTT05ZUElfQ0FNRVJBX0FHQ19NQVNLCQkJMHgzMAorI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRURVJfTUFTSyAJCTB4NworCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hVVERPV05fUkVRVUVTVAkJNworI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCQkweDEwCisKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TVEFUVVMgCQkJNworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSAJCTB4MgorI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19QT1NJVElPTgkJMHg0CisKKyNkZWZpbmUgU09OWVBJX0RJUkVDVElPTl9CQUNLV0FSRFMgCQkweDQKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1JFVklTSU9OIAkJCTgKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9ST01WRVJTSU9OIAkJOQorCisvKiBFdmVudCBtYXNrcyAqLworI2RlZmluZSBTT05ZUElfSk9HR0VSX01BU0sJCQkweDAwMDAwMDAxCisjZGVmaW5lIFNPTllQSV9DQVBUVVJFX01BU0sJCQkweDAwMDAwMDAyCisjZGVmaW5lIFNPTllQSV9GTktFWV9NQVNLCQkJMHgwMDAwMDAwNAorI2RlZmluZSBTT05ZUElfQkxVRVRPT1RIX01BU0sJCQkweDAwMDAwMDA4CisjZGVmaW5lIFNPTllQSV9QS0VZX01BU0sJCQkweDAwMDAwMDEwCisjZGVmaW5lIFNPTllQSV9CQUNLX01BU0sJCQkweDAwMDAwMDIwCisjZGVmaW5lIFNPTllQSV9IRUxQX01BU0sJCQkweDAwMDAwMDQwCisjZGVmaW5lIFNPTllQSV9MSURfTUFTSwkJCQkweDAwMDAwMDgwCisjZGVmaW5lIFNPTllQSV9aT09NX01BU0sJCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLCQkJMHgwMDAwMDIwMAorI2RlZmluZSBTT05ZUElfTUVZRV9NQVNLCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSwkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKKworc3RydWN0IHNvbnlwaV9ldmVudCB7CisJdTgJZGF0YTsKKwl1OAlldmVudDsKK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgYnV0dG9uIHJlbGVhc2UgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfcmVsZWFzZWV2W10gPSB7CisJeyAweDAwLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgam9nZ2VyIGV2ZW50cyAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9qb2dnZXJldltdID0geworCXsgMHgxZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgfSwKKwl7IDB4MDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV04gfSwKKwl7IDB4NWYsIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQgfSwKKwl7IDB4NDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCB9LAorCXsgMHgxZSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCB9LAorCXsgMHgwMiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOIH0sCisJeyAweDVlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgfSwKKwl7IDB4NDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTl9QUkVTU0VEIH0sCisJeyAweDFkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUCB9LAorCXsgMHgwMywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiB9LAorCXsgMHg1ZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCB9LAorCXsgMHg0MywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTl9QUkVTU0VEIH0sCisJeyAweDQwLCBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgY2FwdHVyZSBidXR0b24gZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfY2FwdHVyZWV2W10gPSB7CisJeyAweDA1LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCB9LAorCXsgMHgwNywgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCB9LAorCXsgMHgwMSwgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFJFTEVBU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgZm5rZXlzIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2Zua2V5ZXZbXSA9IHsKKwl7IDB4MTAsIFNPTllQSV9FVkVOVF9GTktFWV9FU0MgfSwKKwl7IDB4MTEsIFNPTllQSV9FVkVOVF9GTktFWV9GMSB9LAorCXsgMHgxMiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YyIH0sCisJeyAweDEzLCBTT05ZUElfRVZFTlRfRk5LRVlfRjMgfSwKKwl7IDB4MTQsIFNPTllQSV9FVkVOVF9GTktFWV9GNCB9LAorCXsgMHgxNSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y1IH0sCisJeyAweDE2LCBTT05ZUElfRVZFTlRfRk5LRVlfRjYgfSwKKwl7IDB4MTcsIFNPTllQSV9FVkVOVF9GTktFWV9GNyB9LAorCXsgMHgxOCwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y4IH0sCisJeyAweDE5LCBTT05ZUElfRVZFTlRfRk5LRVlfRjkgfSwKKwl7IDB4MWEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKKwl7IDB4MWIsIFNPTllQSV9FVkVOVF9GTktFWV9GMTEgfSwKKwl7IDB4MWMsIFNPTllQSV9FVkVOVF9GTktFWV9GMTIgfSwKKwl7IDB4MWYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAorCXsgMHgyMSwgU09OWVBJX0VWRU5UX0ZOS0VZXzEgfSwKKwl7IDB4MjIsIFNPTllQSV9FVkVOVF9GTktFWV8yIH0sCisJeyAweDMxLCBTT05ZUElfRVZFTlRfRk5LRVlfRCB9LAorCXsgMHgzMiwgU09OWVBJX0VWRU5UX0ZOS0VZX0UgfSwKKwl7IDB4MzMsIFNPTllQSV9FVkVOVF9GTktFWV9GIH0sCisJeyAweDM0LCBTT05ZUElfRVZFTlRfRk5LRVlfUyB9LAorCXsgMHgzNSwgU09OWVBJX0VWRU5UX0ZOS0VZX0IgfSwKKwl7IDB4MzYsIFNPTllQSV9FVkVOVF9GTktFWV9PTkxZIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgcHJvZ3JhbSBrZXkgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfcGtleWV2W10gPSB7CisJeyAweDAxLCBTT05ZUElfRVZFTlRfUEtFWV9QMSB9LAorCXsgMHgwMiwgU09OWVBJX0VWRU5UX1BLRVlfUDIgfSwKKwl7IDB4MDQsIFNPTllQSV9FVkVOVF9QS0VZX1AzIH0sCisJeyAweDVjLCBTT05ZUElfRVZFTlRfUEtFWV9QMSB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9ibHVlZXZbXSA9IHsKKwl7IDB4NTUsIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCB9LAorCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAorCXsgMHg1YSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9iYWNrZXZbXSA9IHsKKwl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9oZWxwZXZbXSA9IHsKKwl7IDB4M2IsIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGxpZCBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9saWRldltdID0geworCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKKwl7IDB4NTAsIFNPTllQSV9FVkVOVF9MSURfT1BFTkVEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgem9vbSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKKwl7IDB4MzksIFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSB0aHVtYnBocmFzZSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV90aHVtYnBocmFzZWV2W10gPSB7CisJeyAweDNhLCBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1vdGlvbmV5ZSBjYW1lcmEgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWV5ZWV2W10gPSB7CisJeyAweDAwLCBTT05ZUElfRVZFTlRfTUVZRV9GQUNFIH0sCisJeyAweDAxLCBTT05ZUElfRVZFTlRfTUVZRV9PUFBPU0lURSB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1lbW9yeXN0aWNrIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX21lbW9yeXN0aWNrZXZbXSA9IHsKKwl7IDB4NTMsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgfSwKKwl7IDB4NTQsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJhdHRlcnkgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmF0dGVyeWV2W10gPSB7CisJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgfSwKKwl7IDB4MzAsIFNPTllQSV9FVkVOVF9CQVRURVJZX1JFTU9WRSB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHsKKwlpbnQJCQltb2RlbDsKKwl1OAkJCWRhdGE7CisJdW5zaWduZWQgbG9uZwkJbWFzazsKKwlzdHJ1Y3Qgc29ueXBpX2V2ZW50ICoJZXZlbnRzOworfSBzb255cGlfZXZlbnR0eXBlc1tdID0geworCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg3MCwgU09OWVBJX01FWUVfTUFTSywgc29ueXBpX21leWVldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHgzMCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4NjAsIFNPTllQSV9DQVBUVVJFX01BU0ssIHNvbnlwaV9jYXB0dXJlZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MTAsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDIwLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MzAsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHgzMCwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDQwLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCisKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzgsIFNPTllQSV9MSURfTUFTSywgc29ueXBpX2xpZGV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHg2MSwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MDgsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MTEsIFNPTllQSV9CQUNLX01BU0ssIHNvbnlwaV9iYWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MDgsIFNPTllQSV9IRUxQX01BU0ssIHNvbnlwaV9oZWxwZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9IRUxQX01BU0ssIHNvbnlwaV9oZWxwZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9aT09NX01BU0ssIHNvbnlwaV96b29tZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjAsIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLLCBzb255cGlfdGh1bWJwaHJhc2VldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisKKwl7IDAgfQorfTsKKworI2RlZmluZSBTT05ZUElfQlVGX1NJWkUJMTI4CisKKy8qIFRoZSBuYW1lIG9mIHRoZSBkZXZpY2VzIGZvciB0aGUgaW5wdXQgZGV2aWNlIGRyaXZlcnMgKi8KKyNkZWZpbmUgU09OWVBJX0pPR19JTlBVVE5BTUUJIlNvbnkgVmFpbyBKb2dkaWFsIgorI2RlZmluZSBTT05ZUElfS0VZX0lOUFVUTkFNRQkiU29ueSBWYWlvIEtleXMiCisKKy8qIENvcnJlc3BvbmRhbmNlIHRhYmxlIGJldHdlZW4gc29ueXBpIGV2ZW50cyBhbmQgaW5wdXQgbGF5ZXIgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgc29ueXBpZXY7CisJaW50IGlucHV0ZXY7Cit9IHNvbnlwaV9pbnB1dGtleXNbXSA9IHsKKwl7IFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQsCSAJS0VZX0NBTUVSQSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFksIAkJS0VZX0ZOIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRVNDLCAJCUtFWV9GTl9FU0MgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GMSwgCQlLRVlfRk5fRjEgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GMiwgCQlLRVlfRk5fRjIgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GMywgCQlLRVlfRk5fRjMgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GNCwgCQlLRVlfRk5fRjQgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GNSwgCQlLRVlfRk5fRjUgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GNiwgCQlLRVlfRk5fRjYgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GNywgCQlLRVlfRk5fRjcgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GOCwgCQlLRVlfRk5fRjggfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GOSwJCUtFWV9GTl9GOSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCwJCUtFWV9GTl9GMTAgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTEsIAkJS0VZX0ZOX0YxMSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiwJCUtFWV9GTl9GMTIgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV8xLCAJCUtFWV9GTl8xIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfMiwgCQlLRVlfRk5fMiB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0QsCQkJS0VZX0ZOX0QgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9FLAkJCUtFWV9GTl9FIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRiwJCQlLRVlfRk5fRiB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX1MsCQkJS0VZX0ZOX1MgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9CLAkJCUtFWV9GTl9CIH0sCisJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQsIAlLRVlfQkxVRSB9LAorCXsgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiwgCQlLRVlfQkxVRSB9LAorCXsgU09OWVBJX0VWRU5UX1BLRVlfUDEsIAkJS0VZX1BST0cxIH0sCisJeyBTT05ZUElfRVZFTlRfUEtFWV9QMiwgCQlLRVlfUFJPRzIgfSwKKwl7IFNPTllQSV9FVkVOVF9QS0VZX1AzLCAJCUtFWV9QUk9HMyB9LAorCXsgU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRCwgCQlLRVlfQkFDSyB9LAorCXsgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCwgCQlLRVlfSEVMUCB9LAorCXsgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCwgCQlLRVlfWk9PTSB9LAorCXsgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQsIAlCVE5fVEhVTUIgfSwKKwl7IDAsIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2RldmljZSB7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXUxNiBpcnE7CisJdTE2IGJpdHM7CisJdTE2IGlvcG9ydDE7CisJdTE2IGlvcG9ydDI7CisJdTE2IHJlZ2lvbl9zaXplOworCXUxNiBldnR5cGVfb2Zmc2V0OworCWludCBjYW1lcmFfcG93ZXI7CisJaW50IGJsdWV0b290aF9wb3dlcjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IGtmaWZvICpmaWZvOworCXNwaW5sb2NrX3QgZmlmb19sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IGZpZm9fcHJvY19saXN0OworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmaWZvX2FzeW5jOworCWludCBvcGVuX2NvdW50OworCWludCBtb2RlbDsKKwlzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0X2pvZ19kZXY7CisJc3RydWN0IGlucHV0X2RldiBpbnB1dF9rZXlfZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCBpbnB1dF93b3JrOworCXN0cnVjdCBrZmlmbyAqaW5wdXRfZmlmbzsKKwlzcGlubG9ja190IGlucHV0X2ZpZm9fbG9jazsKK30gc29ueXBpX2RldmljZTsKKworI2RlZmluZSBJVEVSQVRJT05TX0xPTkcJCTEwMDAwCisjZGVmaW5lIElURVJBVElPTlNfU0hPUlQJMTAKKworI2RlZmluZSB3YWl0X29uX2NvbW1hbmQocXVpZXQsIGNvbW1hbmQsIGl0ZXJhdGlvbnMpIHsgXAorCXVuc2lnbmVkIGludCBuID0gaXRlcmF0aW9uczsgXAorCXdoaWxlICgtLW4gJiYgKGNvbW1hbmQpKSBcCisJCXVkZWxheSgxKTsgXAorCWlmICghbiAmJiAodmVyYm9zZSB8fCAhcXVpZXQpKSBcCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbnlwaSBjb21tYW5kIGZhaWxlZCBhdCAlcyA6ICVzIChsaW5lICVkKVxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCit9CisKKyNpZmRlZiBDT05GSUdfQUNQSQorI2RlZmluZSBTT05ZUElfQUNQSV9BQ1RJVkUgKCFhY3BpX2Rpc2FibGVkKQorI2Vsc2UKKyNkZWZpbmUgU09OWVBJX0FDUElfQUNUSVZFIDAKKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLworCitzdGF0aWMgaW50IHNvbnlwaV9lY193cml0ZSh1OCBhZGRyLCB1OCB2YWx1ZSkKK3sKKyNpZmRlZiBDT05GSUdfQUNQSV9FQworCWlmIChTT05ZUElfQUNQSV9BQ1RJVkUpCisJCXJldHVybiBlY193cml0ZShhZGRyLCB2YWx1ZSk7CisjZW5kaWYKKwl3YWl0X29uX2NvbW1hbmQoMSwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMywgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiX3AoMHg4MSwgU09OWVBJX0NTVF9JT1BPUlQpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGJfcChhZGRyLCBTT05ZUElfREFUQV9JT1BPUlQpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGJfcCh2YWx1ZSwgU09OWVBJX0RBVEFfSU9QT1JUKTsKKwl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255cGlfZWNfcmVhZCh1OCBhZGRyLCB1OCAqdmFsdWUpCit7CisjaWZkZWYgQ09ORklHX0FDUElfRUMKKwlpZiAoU09OWVBJX0FDUElfQUNUSVZFKQorCQlyZXR1cm4gZWNfcmVhZChhZGRyLCB2YWx1ZSk7CisjZW5kaWYKKwl3YWl0X29uX2NvbW1hbmQoMSwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMywgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiX3AoMHg4MCwgU09OWVBJX0NTVF9JT1BPUlQpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGJfcChhZGRyLCBTT05ZUElfREFUQV9JT1BPUlQpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCSp2YWx1ZSA9IGluYl9wKFNPTllQSV9EQVRBX0lPUE9SVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWNfcmVhZDE2KHU4IGFkZHIsIHUxNiAqdmFsdWUpCit7CisJdTggdmFsX2xiLCB2YWxfaGI7CisJaWYgKHNvbnlwaV9lY19yZWFkKGFkZHIsICZ2YWxfbGIpKQorCQlyZXR1cm4gLTE7CisJaWYgKHNvbnlwaV9lY19yZWFkKGFkZHIgKyAxLCAmdmFsX2hiKSkKKwkJcmV0dXJuIC0xOworCSp2YWx1ZSA9IHZhbF9sYiB8ICh2YWxfaGIgPDwgOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemVzIHRoZSBkZXZpY2UgLSB0aGlzIGNvbWVzIGZyb20gdGhlIEFNTCBjb2RlIGluIHRoZSBBQ1BJIGJpb3MgKi8KK3N0YXRpYyB2b2lkIHNvbnlwaV90eXBlMV9zcnModm9pZCkKK3sKKwl1MzIgdjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKKwl2ID0gKHYgJiAweEZGRkYwMDAwKSB8ICgodTMyKSBzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKKwl2ID0gKHYgJiAweEZGRjBGRkZGKSB8CisJICAgICgoKHUzMikgc29ueXBpX2RldmljZS5pb3BvcnQxIF4gc29ueXBpX2RldmljZS5pb3BvcnQyKSA8PCAxNik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOworCisJdiA9IGlubChTT05ZUElfSVJRX1BPUlQpOworCXYgJj0gfigoKHUzMikgMHgzKSA8PCBTT05ZUElfSVJRX1NISUZUKTsKKwl2IHw9ICgoKHUzMikgc29ueXBpX2RldmljZS5iaXRzKSA8PCBTT05ZUElfSVJRX1NISUZUKTsKKwlvdXRsKHYsIFNPTllQSV9JUlFfUE9SVCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCAmdik7CisJdiA9ICh2ICYgMHhGRjFGRkZGRikgfCAweDAwQzAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKK30KKworc3RhdGljIHZvaWQgc29ueXBpX3R5cGUyX3Nycyh2b2lkKQoreworCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NISUIsIChzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweEZGMDApID4+IDgpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOworCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NMT0IsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4MDBGRikpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CisJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0lSUSwgc29ueXBpX2RldmljZS5iaXRzKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKKwl1ZGVsYXkoMTApOworfQorCisvKiBEaXNhYmxlcyB0aGUgZGV2aWNlIC0gdGhpcyBjb21lcyBmcm9tIHRoZSBBTUwgY29kZSBpbiB0aGUgQUNQSSBiaW9zICovCitzdGF0aWMgdm9pZCBzb255cGlfdHlwZTFfZGlzKHZvaWQpCit7CisJdTMyIHY7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCAmdik7CisJdiA9IHYgJiAweEZGM0ZGRkZGOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKKworCXYgPSBpbmwoU09OWVBJX0lSUV9QT1JUKTsKKwl2IHw9ICgweDMgPDwgU09OWVBJX0lSUV9TSElGVCk7CisJb3V0bCh2LCBTT05ZUElfSVJRX1BPUlQpOworfQorCitzdGF0aWMgdm9pZCBzb255cGlfdHlwZTJfZGlzKHZvaWQpCit7CisJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0hJQiwgMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CisJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0xPQiwgMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CisJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0lSUSwgMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cit9CisKK3N0YXRpYyB1OCBzb255cGlfY2FsbDEodTggZGV2KQoreworCXU4IHYxLCB2MjsKKworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiKGRldiwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKKwl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7CisJdjIgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXJldHVybiB2MjsKK30KKworc3RhdGljIHU4IHNvbnlwaV9jYWxsMih1OCBkZXYsIHU4IGZuKQoreworCXU4IHYxOworCisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiKGZuLCBzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKKwlyZXR1cm4gdjE7Cit9CisKK3N0YXRpYyB1OCBzb255cGlfY2FsbDModTggZGV2LCB1OCBmbiwgdTggdikKK3sKKwl1OCB2MTsKKworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiKGRldiwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKKwl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yihmbiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKKwl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yih2LCBzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKKwlyZXR1cm4gdjE7Cit9CisKKyNpZiAwCisvKiBHZXQgYnJpZ2h0bmVzcywgaHVlIGV0Yy4gVW5yZWxpYWJsZS4uLiAqLworc3RhdGljIHU4IHNvbnlwaV9yZWFkKHU4IGZuKQoreworCXU4IHYxLCB2MjsKKwlpbnQgbiA9IDEwMDsKKworCXdoaWxlIChuLS0pIHsKKwkJdjEgPSBzb255cGlfY2FsbDIoMHg4ZiwgZm4pOworCQl2MiA9IHNvbnlwaV9jYWxsMigweDhmLCBmbik7CisJCWlmICh2MSA9PSB2MiAmJiB2MSAhPSAweGZmKQorCQkJcmV0dXJuIHYxOworCX0KKwlyZXR1cm4gMHhmZjsKK30KKyNlbmRpZgorCisvKiBTZXQgYnJpZ2h0bmVzcywgaHVlIGV0YyAqLworc3RhdGljIHZvaWQgc29ueXBpX3NldCh1OCBmbiwgdTggdikKK3sKKwl3YWl0X29uX2NvbW1hbmQoMCwgc29ueXBpX2NhbGwzKDB4OTAsIGZuLCB2KSwgSVRFUkFUSU9OU19TSE9SVCk7Cit9CisKKy8qIFRlc3RzIGlmIHRoZSBjYW1lcmEgaXMgcmVhZHkgKi8KK3N0YXRpYyBpbnQgc29ueXBpX2NhbWVyYV9yZWFkeSh2b2lkKQoreworCXU4IHY7CisKKwl2ID0gc29ueXBpX2NhbGwyKDB4OGYsIFNPTllQSV9DQU1FUkFfU1RBVFVTKTsKKwlyZXR1cm4gKHYgIT0gMHhmZiAmJiAodiAmIFNPTllQSV9DQU1FUkFfU1RBVFVTX1JFQURZKSk7Cit9CisKKy8qIFR1cm5zIHRoZSBjYW1lcmEgb2ZmICovCitzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29mZih2b2lkKQoreworCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9QSUNUVVJFLCBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSyk7CisKKwlpZiAoIXNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyKQorCQlyZXR1cm47CisKKwlzb255cGlfY2FsbDIoMHg5MSwgMCk7CisJc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIgPSAwOworfQorCisvKiBUdXJucyB0aGUgY2FtZXJhIG9uICovCitzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29uKHZvaWQpCit7CisJaW50IGksIGo7CisKKwlpZiAoc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIpCisJCXJldHVybjsKKworCWZvciAoaiA9IDU7IGogPiAwOyBqLS0pIHsKKworCQl3aGlsZSAoc29ueXBpX2NhbGwyKDB4OTEsIDB4MSkpCisJCQltc2xlZXAoMTApOworCQlzb255cGlfY2FsbDEoMHg5Myk7CisKKwkJZm9yIChpID0gNDAwOyBpID4gMDsgaS0tKSB7CisJCQlpZiAoc29ueXBpX2NhbWVyYV9yZWFkeSgpKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDEwKTsKKwkJfQorCQlpZiAoaSkKKwkJCWJyZWFrOworCX0KKworCWlmIChqID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic29ueXBpOiBmYWlsZWQgdG8gcG93ZXIgb24gY2FtZXJhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNvbnlwaV9zZXQoMHgxMCwgMHg1YSk7CisJc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIgPSAxOworfQorCisvKiBzZXRzIHRoZSBibHVldG9vdGggc3Vic3lzdGVtIHBvd2VyIHN0YXRlICovCitzdGF0aWMgdm9pZCBzb255cGlfc2V0Ymx1ZXRvb3RocG93ZXIodTggc3RhdGUpCit7CisJc3RhdGUgPSAhIXN0YXRlOworCisJaWYgKHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID09IHN0YXRlKQorCQlyZXR1cm47CisKKwlzb255cGlfY2FsbDIoMHg5Niwgc3RhdGUpOworCXNvbnlwaV9jYWxsMSgweDgyKTsKKwlzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlciA9IHN0YXRlOworfQorCitzdGF0aWMgdm9pZCBpbnB1dF9rZXlyZWxlYXNlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBrZXk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoa2ZpZm9fZ2V0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKKwkJCSAgICAgICh1bnNpZ25lZCBjaGFyICopJmlucHV0X2RldiwKKwkJCSAgICAgIHNpemVvZihpbnB1dF9kZXYpKSAhPSBzaXplb2YoaW5wdXRfZGV2KSkKKwkJCXJldHVybjsKKwkJaWYgKGtmaWZvX2dldChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCisJCQkgICAgICAodW5zaWduZWQgY2hhciAqKSZrZXksCisJCQkgICAgICBzaXplb2Yoa2V5KSkgIT0gc2l6ZW9mKGtleSkpCisJCQlyZXR1cm47CisKKwkJbXNsZWVwKDEwKTsKKwkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIGtleSwgMCk7CisJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKKwl9Cit9CisKKy8qIEludGVycnVwdCBoYW5kbGVyOiBzb21lIGV2ZW50IGlzIGF2YWlsYWJsZSAqLworc3RhdGljIGlycXJldHVybl90IHNvbnlwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1OCB2MSwgdjIsIGV2ZW50ID0gMDsKKwlpbnQgaSwgajsKKworCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKKwl2MiA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSArIHNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBzb255cGlfZXZlbnR0eXBlc1tpXS5tb2RlbDsgaSsrKSB7CisJCWlmIChzb255cGlfZGV2aWNlLm1vZGVsICE9IHNvbnlwaV9ldmVudHR5cGVzW2ldLm1vZGVsKQorCQkJY29udGludWU7CisJCWlmICgodjIgJiBzb255cGlfZXZlbnR0eXBlc1tpXS5kYXRhKSAhPQorCQkgICAgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShtYXNrICYgc29ueXBpX2V2ZW50dHlwZXNbaV0ubWFzaykpCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OyBqKyspIHsKKwkJCWlmICh2MSA9PSBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZGF0YSkgeworCQkJCWV2ZW50ID0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInNvbnlwaTogdW5rbm93biBldmVudCBwb3J0MT0weCUwMngscG9ydDI9MHglMDJ4XG4iLAorCQkgICAgICAgdjEsIHYyKTsKKwkvKiBXZSBuZWVkIHRvIHJldHVybiBJUlFfSEFORExFRCBoZXJlIGJlY2F1c2UgdGhlcmUgKmFyZSoKKwkgKiBldmVudHMgYmVsb25naW5nIHRvIHRoZSBzb255cGkgZGV2aWNlIHdlIGRvbid0IGtub3cgYWJvdXQsCisJICogYnV0IHdlIHN0aWxsIGRvbid0IHdhbnQgdGhvc2UgdG8gcG9sbHV0ZSB0aGUgbG9ncy4uLiAqLworCXJldHVybiBJUlFfSEFORExFRDsKKworZm91bmQ6CisJaWYgKHZlcmJvc2UgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAic29ueXBpOiBldmVudCBwb3J0MT0weCUwMngscG9ydDI9MHglMDJ4XG4iLCB2MSwgdjIpOworCisJaWYgKHVzZWlucHV0KSB7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2pvZ19kZXYgPSAmc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2OworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9rZXlfZGV2ID0gJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2RldjsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQOgorCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQ6CisJCQlpbnB1dF9yZXBvcnRfcmVsKGlucHV0X2pvZ19kZXYsIFJFTF9XSEVFTCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOOgorCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRDoKKwkJCWlucHV0X3JlcG9ydF9yZWwoaW5wdXRfam9nX2RldiwgUkVMX1dIRUVMLCAtMSk7CisJCQlicmVhazsKKwkJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEOiB7CisJCQlpbnQga2V5ID0gQlROX01JRERMRTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfam9nX2Rldiwga2V5LCAxKTsKKwkJCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCisJCQkJICAodW5zaWduZWQgY2hhciAqKSZpbnB1dF9qb2dfZGV2LAorCQkJCSAgc2l6ZW9mKGlucHV0X2pvZ19kZXYpKTsKKwkJCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCisJCQkJICAodW5zaWduZWQgY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEOgorCQkJLyogTm90aGluZywgbm90IGFsbCBWQUlPcyBnZW5lcmF0ZSB0aGlzIGV2ZW50ICovCisJCQlicmVhazsKKwkJfQorCQlpbnB1dF9zeW5jKGlucHV0X2pvZ19kZXYpOworCisJCWZvciAoaSA9IDA7IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykgeworCQkJaW50IGtleTsKKworCQkJaWYgKGV2ZW50ICE9IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXYpCisJCQkJY29udGludWU7CisKKwkJCWtleSA9IHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldjsKKwkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfa2V5X2Rldiwga2V5LCAxKTsKKwkJCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCisJCQkJICAodW5zaWduZWQgY2hhciAqKSZpbnB1dF9rZXlfZGV2LAorCQkJCSAgc2l6ZW9mKGlucHV0X2tleV9kZXYpKTsKKwkJCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCisJCQkJICAodW5zaWduZWQgY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKKwkJfQorCQlpbnB1dF9zeW5jKGlucHV0X2tleV9kZXYpOworCQlzY2hlZHVsZV93b3JrKCZzb255cGlfZGV2aWNlLmlucHV0X3dvcmspOworCX0KKworCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKKwlraWxsX2Zhc3luYygmc29ueXBpX2RldmljZS5maWZvX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogRXh0ZXJuYWwgY2FtZXJhIGNvbW1hbmQgKGV4cG9ydGVkIHRvIHRoZSBtb3Rpb24gZXllIHY0bCBkcml2ZXIpICovCitpbnQgc29ueXBpX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSkKK3sKKwlpZiAoIWNhbWVyYSkKKwkJcmV0dXJuIC1FSU87CisKKwlkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkE6CisJCWlmICh2YWx1ZSkKKwkJCXNvbnlwaV9jYW1lcmFfb24oKTsKKwkJZWxzZQorCQkJc29ueXBpX2NhbWVyYV9vZmYoKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTOgorCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUywgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNUOgorCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09OVFJBU1QsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUU6CisJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9IVUUsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT0xPUjoKKwkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTE9SLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTOgorCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfU0hBUlBORVNTLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRToKKwkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFBR0M6CisJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9BR0MsIHZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHNvbnlwaV9jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKKwkJICAgICAgIGNvbW1hbmQpOworCQlicmVhazsKKwl9CisJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc29ueXBpX2NhbWVyYV9jb21tYW5kKTsKKworc3RhdGljIGludCBzb255cGlfbWlzY19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJnNvbnlwaV9kZXZpY2UuZmlmb19hc3luYyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX21pc2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzb255cGlfbWlzY19mYXN5bmMoLTEsIGZpbGUsIDApOworCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CisJc29ueXBpX2RldmljZS5vcGVuX2NvdW50LS07CisJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX21pc2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOworCS8qIEZsdXNoIGlucHV0IHF1ZXVlIG9uIGZpcnN0IG9wZW4gKi8KKwlpZiAoIXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudCkKKwkJa2ZpZm9fcmVzZXQoc29ueXBpX2RldmljZS5maWZvKTsKKwlzb255cGlfZGV2aWNlLm9wZW5fY291bnQrKzsKKwl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc29ueXBpX21pc2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlmICgoa2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykgPT0gMCkgJiYKKwkgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCwKKwkJCQkgICAgICAga2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykgIT0gMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdoaWxlIChyZXQgPCBjb3VudCAmJgorCSAgICAgICAoa2ZpZm9fZ2V0KHNvbnlwaV9kZXZpY2UuZmlmbywgJmMsIHNpemVvZihjKSkgPT0gc2l6ZW9mKGMpKSkgeworCQlpZiAocHV0X3VzZXIoYywgYnVmKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCsrOworCX0KKworCWlmIChyZXQgPiAwKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29ueXBpX21pc2NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlwb2xsX3dhaXQoZmlsZSwgJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QsIHdhaXQpOworCWlmIChrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX21pc2NfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl1OCB2YWw4OworCXUxNiB2YWwxNjsKKworCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNPTllQSV9JT0NHQlJUOgorCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX0xDRF9MSUdIVCwgJnZhbDgpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ1NCUlQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX0xDRF9MSUdIVCwgdmFsOCkpCisJCQlyZXQgPSAtRUlPOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFUMUNBUDoKKwkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9GVUxMLCAmdmFsMTYpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JBVDFSRU06CisJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfTEVGVCwgJnZhbDE2KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVQyQ0FQOgorCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0ZVTEwsICZ2YWwxNikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFUMlJFTToKKwkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9MRUZULCAmdmFsMTYpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JBVEZMQUdTOgorCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX0JBVF9GTEFHUywgJnZhbDgpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJdmFsOCAmPSAweDA3OworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JMVUU6CisJCXZhbDggPSBzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlcjsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ1NCTFVFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbDgsIGFyZ3AsIHNpemVvZih2YWw4KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlzb255cGlfc2V0Ymx1ZXRvb3RocG93ZXIodmFsOCk7CisJCWJyZWFrOworCS8qIEZBTiBDb250cm9scyAqLworCWNhc2UgU09OWVBJX0lPQ0dGQU46CisJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfRkFOMF9TVEFUVVMsICZ2YWw4KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoKHU4ICopYXJnLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ1NGQU46CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgKHU4ICopYXJnLCBzaXplb2YodmFsOCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfRkFOMF9TVEFUVVMsIHZhbDgpKQorCQkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisJLyogR0VUIFRlbXBlcmF0dXJlICh1c2VmdWwgdW5kZXIgQVBNKSAqLworCWNhc2UgU09OWVBJX0lPQ0dURU1QOgorCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX1RFTVBfU1RBVFVTLCAmdmFsOCkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKCh1OCAqKWFyZywgJnZhbDgsIHNpemVvZih2YWw4KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb255cGlfbWlzY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBzb255cGlfbWlzY19yZWFkLAorCS5wb2xsCQk9IHNvbnlwaV9taXNjX3BvbGwsCisJLm9wZW4JCT0gc29ueXBpX21pc2Nfb3BlbiwKKwkucmVsZWFzZQk9IHNvbnlwaV9taXNjX3JlbGVhc2UsCisJLmZhc3luYwkJPSBzb255cGlfbWlzY19mYXN5bmMsCisJLmlvY3RsCQk9IHNvbnlwaV9taXNjX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNvbnlwaV9taXNjX2RldmljZSA9IHsKKwkubWlub3IJCT0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lCQk9ICJzb255cGkiLAorCS5mb3BzCQk9ICZzb255cGlfbWlzY19mb3BzLAorfTsKKworc3RhdGljIHZvaWQgc29ueXBpX2VuYWJsZSh1bnNpZ25lZCBpbnQgY2FtZXJhX29uKQoreworCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpCisJCXNvbnlwaV90eXBlMl9zcnMoKTsKKwllbHNlCisJCXNvbnlwaV90eXBlMV9zcnMoKTsKKworCXNvbnlwaV9jYWxsMSgweDgyKTsKKwlzb255cGlfY2FsbDIoMHg4MSwgMHhmZik7CisJc29ueXBpX2NhbGwxKGNvbXBhdCA/IDB4OTIgOiAweDgyKTsKKworCS8qIEVuYWJsZSBBQ1BJIG1vZGUgdG8gZ2V0IEZuIGtleSBldmVudHMgKi8KKwlpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCisJCW91dGIoMHhmMCwgMHhiMik7CisKKwlpZiAoY2FtZXJhICYmIGNhbWVyYV9vbikKKwkJc29ueXBpX2NhbWVyYV9vbigpOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9kaXNhYmxlKHZvaWQpCit7CisJc29ueXBpX2NhbGwyKDB4ODEsIDApOwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBtb3JlIGV2ZW50cyAqLworCWlmIChjYW1lcmEpCisJCXNvbnlwaV9jYW1lcmFfb2ZmKCk7CisKKwkvKiBkaXNhYmxlIEFDUEkgbW9kZSAqLworCWlmICghU09OWVBJX0FDUElfQUNUSVZFICYmIGZua2V5aW5pdCkKKwkJb3V0YigweGYxLCAweGIyKTsKKworCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpCisJCXNvbnlwaV90eXBlMl9kaXMoKTsKKwllbHNlCisJCXNvbnlwaV90eXBlMV9kaXMoKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBvbGRfY2FtZXJhX3Bvd2VyOworCitzdGF0aWMgaW50IHNvbnlwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFNVU1BFTkRfRElTQUJMRSkgeworCQlvbGRfY2FtZXJhX3Bvd2VyID0gc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXI7CisJCXNvbnlwaV9kaXNhYmxlKCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFJFU1VNRV9FTkFCTEUpCisJCXNvbnlwaV9lbmFibGUob2xkX2NhbWVyYV9wb3dlcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc29ueXBpX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzb255cGlfZGlzYWJsZSgpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc29ueXBpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic29ueXBpIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHNvbnlwaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc29ueXBpX3Jlc3VtZSwKKyNlbmRpZgorCS5zaHV0ZG93bgk9IHNvbnlwaV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNvbnlwaV9wcm9iZSh2b2lkKQoreworCWludCBpLCByZXQ7CisJc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCAqaW9wb3J0X2xpc3Q7CisJc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqaXJxX2xpc3Q7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKworCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOworCisJc29ueXBpX2RldmljZS5kZXYgPSBwY2lkZXY7CisJc29ueXBpX2RldmljZS5tb2RlbCA9IHBjaWRldiA/CisJCVNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEgOiBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyOworCisJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuZmlmb19sb2NrKTsKKwlzb255cGlfZGV2aWNlLmZpZm8gPSBrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCisJCQkJCSAmc29ueXBpX2RldmljZS5maWZvX2xvY2spOworCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5maWZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmZpZm8pOworCQlnb3RvIG91dF9maWZvOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QpOworCWluaXRfTVVURVgoJnNvbnlwaV9kZXZpY2UubG9jayk7CisJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSAtMTsKKworCWlmIChwY2lkZXYgJiYgcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfcGNpZW5hYmxlOworCX0KKworCWlmIChtaW5vciAhPSAtMSkKKwkJc29ueXBpX21pc2NfZGV2aWNlLm1pbm9yID0gbWlub3I7CisJaWYgKChyZXQgPSBtaXNjX3JlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogbWlzY19yZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9taXNjcmVnOworCX0KKworCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpIHsKKwkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CisJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkU7CisJCXNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCA9IFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUOworCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKKwl9IGVsc2UgeworCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlMV9pb3BvcnRfbGlzdDsKKwkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMV9SRUdJT05fU0laRTsKKwkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUxX0VWVFlQRV9PRkZTRVQ7CisJCWlycV9saXN0ID0gc29ueXBpX3R5cGUxX2lycV9saXN0OworCX0KKworCWZvciAoaSA9IDA7IGlvcG9ydF9saXN0W2ldLnBvcnQxOyBpKyspIHsKKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvcG9ydF9saXN0W2ldLnBvcnQxLAorCQkJCSAgIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUsCisJCQkJICAgIlNvbnkgUHJvZ3JhbWFibGUgSS9PIERldmljZSIpKSB7CisJCQkvKiBnZXQgdGhlIGlvcG9ydCAqLworCQkJc29ueXBpX2RldmljZS5pb3BvcnQxID0gaW9wb3J0X2xpc3RbaV0ucG9ydDE7CisJCQlzb255cGlfZGV2aWNlLmlvcG9ydDIgPSBpb3BvcnRfbGlzdFtpXS5wb3J0MjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghc29ueXBpX2RldmljZS5pb3BvcnQxKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiByZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9yZXFyZWc7CisJfQorCisJZm9yIChpID0gMDsgaXJxX2xpc3RbaV0uaXJxOyBpKyspIHsKKworCQlzb255cGlfZGV2aWNlLmlycSA9IGlycV9saXN0W2ldLmlycTsKKwkJc29ueXBpX2RldmljZS5iaXRzID0gaXJxX2xpc3RbaV0uYml0czsKKworCQlpZiAoIXJlcXVlc3RfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxLAorCQkJCSBTQV9TSElSUSwgInNvbnlwaSIsIHNvbnlwaV9pcnEpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpcnFfbGlzdFtpXS5pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHJlcXVlc3RfaXJxIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3JlcWlycTsKKwl9CisKKwlpZiAodXNlaW5wdXQpIHsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgSW5wdXQgRHJpdmVyczogam9nZGlhbCAqLworCQlpbnQgaTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmV2Yml0WzBdID0KKwkJCUJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9CisJCQlCSVQoQlROX01JRERMRSk7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5yZWxiaXRbMF0gPSBCSVQoUkVMX1dIRUVMKTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2Lm5hbWUgPQorCQkJa21hbGxvYyhzaXplb2YoU09OWVBJX0pPR19JTlBVVE5BTUUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGttYWxsb2MgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9pbmttYWxsb2NpbnB1dDE7CisJCX0KKwkJc3ByaW50Zihzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSwgU09OWVBJX0pPR19JTlBVVE5BTUUpOworCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYuaWQuYnVzdHlwZSA9IEJVU19JU0E7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7CisKKwkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBpbnB1dCBtZXRob2QgaW5zdGFsbGVkLlxuIiwKKwkJICAgICAgIHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKTsKKworCQkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KKwkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJCWZvciAoaSA9IDA7IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykKKwkJCWlmIChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYpCisJCQkJc2V0X2JpdChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYsCisJCQkJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5rZXliaXQpOworCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYubmFtZSA9CisJCQlrbWFsbG9jKHNpemVvZihTT05ZUElfS0VZX0lOUFVUTkFNRSksIEdGUF9LRVJORUwpOworCQlpZiAoIXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga21hbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2lua21hbGxvY2lucHV0MjsKKwkJfQorCQlzcHJpbnRmKHNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lLCBTT05ZUElfS0VZX0lOUFVUTkFNRSk7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5pZC5idXN0eXBlID0gQlVTX0lTQTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKKworCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIGlucHV0IG1ldGhvZCBpbnN0YWxsZWQuXG4iLAorCQkgICAgICAgc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpOworCisJCXNwaW5fbG9ja19pbml0KCZzb255cGlfZGV2aWNlLmlucHV0X2ZpZm9fbG9jayk7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyA9CisJCQlrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCisJCQkJICAgICZzb255cGlfZGV2aWNlLmlucHV0X2ZpZm9fbG9jayk7CisJCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CisJCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyk7CisJCQlnb3RvIG91dF9pbmZpZm87CisJCX0KKworCQlJTklUX1dPUksoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yaywgaW5wdXRfa2V5cmVsZWFzZSwgTlVMTCk7CisJfQorCisJc29ueXBpX2RldmljZS5wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgic29ueXBpIiwgLTEsCisJCQkJCQkJICAgICBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHNvbnlwaV9kZXZpY2UucGRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLnBkZXYpOworCQlnb3RvIG91dF9wbGF0Zm9ybWRldjsKKwl9CisKKwlzb255cGlfZW5hYmxlKDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbGxlciBEcml2ZXIiCisJICAgICAgICJ2JXMuXG4iLCBTT05ZUElfRFJJVkVSX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZGV0ZWN0ZWQgJXMgbW9kZWwsICIKKwkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCisJICAgICAgICJjb21wYXQgPSAlcywgbWFzayA9IDB4JTA4bHgsIHVzZWlucHV0ID0gJXMsIGFjcGkgPSAlc1xuIiwKKwkgICAgICAgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSkgPworCQkJInR5cGUxIiA6ICJ0eXBlMiIsCisJICAgICAgIHZlcmJvc2UsCisJICAgICAgIGZua2V5aW5pdCA/ICJvbiIgOiAib2ZmIiwKKwkgICAgICAgY2FtZXJhID8gIm9uIiA6ICJvZmYiLAorCSAgICAgICBjb21wYXQgPyAib24iIDogIm9mZiIsCisJICAgICAgIG1hc2ssCisJICAgICAgIHVzZWlucHV0ID8gIm9uIiA6ICJvZmYiLAorCSAgICAgICBTT05ZUElfQUNQSV9BQ1RJVkUgPyAib24iIDogIm9mZiIpOworCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZW5hYmxlZCBhdCBpcnE9JWQsIHBvcnQxPTB4JXgsIHBvcnQyPTB4JXhcbiIsCisJICAgICAgIHNvbnlwaV9kZXZpY2UuaXJxLAorCSAgICAgICBzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7CisKKwlpZiAobWlub3IgPT0gLTEpCisJCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZGV2aWNlIGFsbG9jYXRlZCBtaW5vciBpcyAlZFxuIiwKKwkJICAgICAgIHNvbnlwaV9taXNjX2RldmljZS5taW5vcik7CisKKwlyZXR1cm4gMDsKKworb3V0X3BsYXRmb3JtZGV2OgorCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKTsKK291dF9pbmZpZm86CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CisJa2ZyZWUoc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpOworb3V0X2lua21hbGxvY2lucHV0MjoKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2KTsKKwlrZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSk7CitvdXRfaW5rbWFsbG9jaW5wdXQxOgorCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKK291dF9yZXFpcnE6CisJcmVsZWFzZV9yZWdpb24oc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplKTsKK291dF9yZXFyZWc6CisJbWlzY19kZXJlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpOworb3V0X21pc2NyZWc6CisJaWYgKHBjaWRldikKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7CitvdXRfcGNpZW5hYmxlOgorCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKK291dF9maWZvOgorCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc29ueXBpX3JlbW92ZSh2b2lkKQoreworCXNvbnlwaV9kaXNhYmxlKCk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzb255cGlfZGV2aWNlLnBkZXYpOworCisJaWYgKHVzZWlucHV0KSB7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYpOworCQlrZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYubmFtZSk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOworCQlrZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSk7CisJCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKTsKKwl9CisKKwlmcmVlX2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSk7CisJcmVsZWFzZV9yZWdpb24oc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CisJaWYgKHNvbnlwaV9kZXZpY2UuZGV2KQorCQlwY2lfZGlzYWJsZV9kZXZpY2Uoc29ueXBpX2RldmljZS5kZXYpOworCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKKwlwY2lfZGV2X3B1dChzb255cGlfZGV2aWNlLmRldik7CisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiByZW1vdmVkLlxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNvbnlwaV9kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJTb255IFZhaW8iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUENHLSIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi0iKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgc29ueXBpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKHNvbnlwaV9kbWlfdGFibGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGRyaXZlcl9yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNvbnlwaV9wcm9iZSgpOworCWlmIChyZXQpCisJCWRyaXZlcl91bnJlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzb255cGlfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKKwlzb255cGlfcmVtb3ZlKCk7Cit9CisKK21vZHVsZV9pbml0KHNvbnlwaV9pbml0KTsKK21vZHVsZV9leGl0KHNvbnlwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzg5ZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCkBAIC0wLDAgKzEsMjYxMCBAQAorLyoKKyAqICAgICAgc3BlY2lhbGl4LmMgIC0tIHNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBzZXJpYWwgZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3ICBSb2dlciBXb2xmZiAoUi5FLldvbGZmQEJpdFdpemFyZC5ubCkKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIERtaXRyeSBHb3JvZGNoYW5pbiAocGdtZHNnQGliaS5jb20pCisgKgorICogICAgICBTcGVjaWFsaXggcGF5cyBmb3IgdGhlIGRldmVsb3BtZW50IGFuZCBzdXBwb3J0IG9mIHRoaXMgZHJpdmVyLgorICogICAgICBQbGVhc2UgRE8gY29udGFjdCBpbzgtbGludXhAc3BlY2lhbGl4LmNvLnVrIGlmIHlvdSByZXF1aXJlCisgKiAgICAgIHN1cHBvcnQuIEJ1dCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiAoc3BlY2lhbGl4LnR4dCkKKyAqICAgICAgZmlyc3QuCisgKgorICogICAgICBUaGlzIGRyaXZlciB3YXMgZGV2ZWxvcHBlZCBpbiB0aGUgQml0V2l6YXJkIGxpbnV4IGRldmljZQorICogICAgICBkcml2ZXIgc2VydmljZS4gSWYgeW91IHJlcXVpcmUgYSBsaW51eCBkZXZpY2UgZHJpdmVyIGZvciB5b3VyCisgKiAgICAgIHByb2R1Y3QsIHBsZWFzZSBjb250YWN0IGRldmljZXNAQml0V2l6YXJkLm5sIGZvciBhIHF1b3RlLgorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGZpcm1seSBiYXNlZCBvbiB0aGUgcmlzY29tLzggc2VyaWFsIGRyaXZlciwKKyAqICAgICAgd3JpdHRlbiBieSBEbWl0cnkgR29yb2RjaGFuaW4uIFRoZSBzcGVjaWFsaXggSU84KyBjYXJkCisgKiAgICAgIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBDTC1DRDE4NjUgRGF0YQorICogICAgICBCb29rLCBhbmQgU3BlY2lhbGl4IGRvY3VtZW50IG51bWJlciA2MjAwMDU5OiBJTzgrIEhhcmR3YXJlCisgKiAgICAgIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiAgICAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogICAgICBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgICBVU0EuCisgKgorICogUmV2aXNpb24gaGlzdG9yeToKKyAqCisgKiBSZXZpc2lvbiAxLjA6ICBBcHJpbCAxc3QgMTk5Ny4KKyAqICAgICAgICAgICAgICAgIEluaXRpYWwgcmVsZWFzZSBmb3IgYWxwaGEgdGVzdGluZy4KKyAqIFJldmlzaW9uIDEuMTogIEFwcmlsIDE0dGggMTk5Ny4gCisgKiAgICAgICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUmljaGFyZCBIdWRzb25zIHN1Z2dlc3Rpb25zLCAKKyAqICAgICAgICAgICAgICAgIHJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRrJ3MuCisgKiBSZXZpc2lvbiAxLjI6ICBBcHJpbCAxNXRoIDE5OTcuCisgKiAgICAgICAgICAgICAgICBQb3J0ZWQgdG8gMi4xLngga2VybmVscy4KKyAqIFJldmlzaW9uIDEuMzogIEFwcmlsIDE3dGggMTk5NyAKKyAqICAgICAgICAgICAgICAgIEJhY2twb3J0ZWQgdG8gMi4wLiAoQ29tcGF0aWJpbGl0eSBtYWNyb3MpLiAKKyAqIFJldmlzaW9uIDEuNDogIEFwcmlsIDE4dGggMTk5NworICogICAgICAgICAgICAgICAgRml4ZWQgRFRSL1JUUyBidWcgdGhhdCBjYXVzZWQgdGhlIGNhcmQgdG8gaW5kaWNhdGUgCisgKiAgICAgICAgICAgICAgICAiZG9uJ3Qgc2VuZCBkYXRhIiB0byBhIG1vZGVtIGFmdGVyIHRoZSBwYXNzd29yZCBwcm9tcHQuICAKKyAqICAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBmb3IgcHJlbWF0dXJlIChmYWtlKSBpbnRlcnJ1cHRzLgorICogUmV2aXNpb24gMS41OiAgQXByaWwgMTl0aCAxOTk3CisgKiAgICAgICAgICAgICAgICBmaXhlZCBhIG1pbm9yIHR5cG8gaW4gdGhlIGhlYWRlciBmaWxlLCBjbGVhbnVwIGEgbGl0dGxlLiAKKyAqICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIHdhcm5pbmdzIGFyZSBub3cgTUFYZWQgYXQgb25jZSBwZXIgbWludXRlLgorICogUmV2aXNpb24gMS42OiAgTWF5IDIzIDE5OTcKKyAqICAgICAgICAgICAgICAgIENoYW5nZWQgdGhlIHNwZWNpYWxpeD0uLi4gZm9ybWF0IHRvIGluY2x1ZGUgaW50ZXJydXB0LgorICogUmV2aXNpb24gMS43OiAgTWF5IDI3IDE5OTcKKyAqICAgICAgICAgICAgICAgIE1hZGUgbWFueSBtb3JlIGRlYnVnIHByaW50aydzIGEgY29tcGlsZSB0aW1lIG9wdGlvbi4KKyAqIFJldmlzaW9uIDEuODogIEp1bCAxICAxOTk3CisgKiAgICAgICAgICAgICAgICBwb3J0IHRvIGxpbnV4LTIuMS40MyBrZXJuZWwuCisgKiBSZXZpc2lvbiAxLjk6ICBPY3QgOSAgMTk5OAorICogICAgICAgICAgICAgICAgQWRkZWQgc3R1ZmYgZm9yIHRoZSBJTzgrL1BDSSB2ZXJzaW9uLgorICogUmV2aXNpb24gMS4xMDogT2N0IDIyICAxOTk5IC8gSmFuIDIxIDIwMDAuIAorICogICAgICAgICAgICAgICAgQWRkZWQgc3R1ZmYgZm9yIHNldHNlcmlhbC4gCisgKiAgICAgICAgICAgICAgICBOaWNvbGFzIE1haWxob3QgKE5pY29sYXMuTWFpbGhvdEBlbWFpbC5lbnN0LmZyKQorICogCisgKi8KKworI2RlZmluZSBWRVJTSU9OICIxLjExIgorCisKKy8qCisgKiBUaGVyZSBpcyBhIGJ1bmNoIG9mIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGNhcmQsIGp1bXBlcnMsIGNvbmZpZworICogc2V0dGluZ3MsIHJlc3RyaWN0aW9ucywgY2FibGVzLCBkZXZpY2UgbmFtZXMgYW5kIG51bWJlcnMgaW4KKyAqIERvY3VtZW50YXRpb24vc3BlY2lhbGl4LnR4dAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInNwZWNpYWxpeF9pbzguaCIKKyNpbmNsdWRlICJjZDE4NjUuaCIKKworCisvKgorICAgVGhpcyBkcml2ZXIgY2FuIHNwZXcgYSB3aG9sZSBsb3Qgb2YgZGVidWdnaW5nIG91dHB1dCBhdCB5b3UuIElmIHlvdQorICAgbmVlZCBtYXhpbXVtIHBlcmZvcm1hbmNlLCB5b3Ugc2hvdWxkIGRpc2FibGUgdGhlIERFQlVHIGRlZmluZS4gVG8KKyAgIGFpZCBpbiBkZWJ1Z2dpbmcgaW4gdGhlIGZpZWxkLCBJJ20gbGVhdmluZyB0aGUgY29tcGlsZS10aW1lIGRlYnVnCisgICBmZWF0dXJlcyBlbmFibGVkLCBhbmQgZGlzYWJsZSB0aGVtICJydW50aW1lIi4gVGhhdCBhbGxvd3MgbWUgdG8KKyAgIGluc3RydWN0IHBlb3BsZSB3aXRoIHByb2JsZW1zIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgd2l0aG91dCByZXF1aXJpbmcKKyAgIHRoZW0gdG8gcmVjb21waWxlLi4uCisqLworI2RlZmluZSBERUJVRworCitzdGF0aWMgaW50IHN4X2RlYnVnOworc3RhdGljIGludCBzeF9yeGZpZm8gPSBTUEVDSUFMSVhfUlhGSUZPOworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50ayhmLCBzdHIuLi4pIGlmIChzeF9kZWJ1ZyAmIGYpIHByaW50ayAoc3RyKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhmLCBzdHIuLi4pIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjZGVmaW5lIFNYX0RFQlVHX0ZMT1cgICAgMHgwMDAxCisjZGVmaW5lIFNYX0RFQlVHX0RBVEEgICAgMHgwMDAyCisjZGVmaW5lIFNYX0RFQlVHX1BST0JFICAgMHgwMDA0CisjZGVmaW5lIFNYX0RFQlVHX0NIQU4gICAgMHgwMDA4CisjZGVmaW5lIFNYX0RFQlVHX0lOSVQgICAgMHgwMDEwCisjZGVmaW5lIFNYX0RFQlVHX1JYICAgICAgMHgwMDIwCisjZGVmaW5lIFNYX0RFQlVHX1RYICAgICAgMHgwMDQwCisjZGVmaW5lIFNYX0RFQlVHX0lSUSAgICAgMHgwMDgwCisjZGVmaW5lIFNYX0RFQlVHX09QRU4gICAgMHgwMTAwCisjZGVmaW5lIFNYX0RFQlVHX1RFUk1JT1MgMHgwMjAwCisjZGVmaW5lIFNYX0RFQlVHX1NJR05BTFMgMHgwNDAwCisjZGVmaW5lIFNYX0RFQlVHX0ZJRk8gICAgMHgwODAwCisKKworI2RlZmluZSBmdW5jX2VudGVyKCkgZHByaW50ayAoU1hfREVCVUdfRkxPVywgImlvODogZW50ZXIgJXNcbiIsX19GVU5DVElPTl9fKQorI2RlZmluZSBmdW5jX2V4aXQoKSAgZHByaW50ayAoU1hfREVCVUdfRkxPVywgImlvODogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKKworI2RlZmluZSBqaWZmaWVzX2Zyb21fbXMoYSkgKCgoKGEpICogSFopLzEwMDApKzEpCisKKworLyogQ29uZmlndXJhYmxlIG9wdGlvbnM6ICovCisKKy8qIEFtIEkgcGFyYW5vaWQgb3Igbm90ID8gOy0pICovCisjZGVmaW5lIFNQRUNJQUxJWF9QQVJBTk9JQV9DSEVDSworCisvKiBEbyBJIHRydXN0IHRoZSBJUlEgZnJvbSB0aGUgY2FyZD8gKGVuYWJlbGluZyBpdCBkb2Vzbid0IHNlZW0gdG8gaGVscCkKKyAgIFdoZW4gdGhlIElSUSByb3V0aW5lIGxlYXZlcyB0aGUgY2hpcCBpbiBhIHN0YXRlIHRoYXQgaXMga2VlcHMgb24KKyAgIHJlcXVpcmluZyBhdHRlbnRpb24sIHRoZSB0aW1lciBkb2Vzbid0IGhlbHAgZWl0aGVyLiAqLworI3VuZGVmIFNQRUNJQUxJWF9USU1FUgorCisjaWZkZWYgU1BFQ0lBTElYX1RJTUVSCitzdGF0aWMgaW50IHN4X3BvbGwgPSBIWjsKKyNlbmRpZgorCisKKworLyogCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gQnV0IGlmIHlvdSBuZWVkCisgKiBzb21lIG5pY2UgcmVwb3J0aW5nIGluIHlvdXIgc3lzbG9nLCB5b3UgY2FuIGRlZmluZSB0aGVtIGFsc28uCisgKi8KKyN1bmRlZiBTWF9SRVBPUlRfRklGTworI3VuZGVmIFNYX1JFUE9SVF9PVkVSUlVOCisKKworCisjaWZkZWYgQ09ORklHX1NQRUNJQUxJWF9SVFNDVFMKKyNkZWZpbmUgU1hfQ1JUU0NUUyhibGEpIDEKKyNlbHNlCisjZGVmaW5lIFNYX0NSVFNDVFModHR5KSBDX0NSVFNDVFModHR5KQorI2VuZGlmCisKKworLyogVXNlZCB0byBiZSBvdXRiICgweGZmLCAweDgwKTsgKi8KKyNkZWZpbmUgc2hvcnRfcGF1c2UoKSB1ZGVsYXkgKDEpCisKKworI2RlZmluZSBTUEVDSUFMSVhfTEVHQUxfRkxBR1MgXAorCShBU1lOQ19IVVBfTk9USUZZICAgfCBBU1lOQ19TQUsgICAgICAgICAgfCBBU1lOQ19TUExJVF9URVJNSU9TICAgfCBcCisJIEFTWU5DX1NQRF9ISSAgICAgICB8IEFTWU5DX1NQRUVEX1ZISSAgICB8IEFTWU5DX1NFU1NJT05fTE9DS09VVCB8IFwKKwkgQVNZTkNfUEdSUF9MT0NLT1VUIHwgQVNZTkNfQ0FMTE9VVF9OT0hVUCkKKworI3VuZGVmIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAorI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNwZWNpYWxpeF9kcml2ZXI7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqIHRtcF9idWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJhdWRfdGFibGVbXSA9ICB7CisJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLAorCTk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMCwgCit9OworCitzdGF0aWMgc3RydWN0IHNwZWNpYWxpeF9ib2FyZCBzeF9ib2FyZFtTWF9OQk9BUkRdID0gIHsKKwl7IDAsIFNYX0lPQkFTRTEsICA5LCB9LAorCXsgMCwgU1hfSU9CQVNFMiwgMTEsIH0sCisJeyAwLCBTWF9JT0JBU0UzLCAxMiwgfSwKKwl7IDAsIFNYX0lPQkFTRTQsIDE1LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzcGVjaWFsaXhfcG9ydCBzeF9wb3J0W1NYX05CT0FSRCAqIFNYX05QT1JUXTsKKworCisjaWZkZWYgU1BFQ0lBTElYX1RJTUVSCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbWlzc2VkX2lycV90aW1lcjsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKKyNlbmRpZgorCisKKworc3RhdGljIGlubGluZSBpbnQgc3hfcGFyYW5vaWFfY2hlY2soc3RydWN0IHNwZWNpYWxpeF9wb3J0IGNvbnN0ICogcG9ydCwKKwkJCQkgICAgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBTUEVDSUFMSVhfUEFSQU5PSUFfQ0hFQ0sKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkbWFnaWMgPQorCQlLRVJOX0VSUiAic3g6IFdhcm5pbmc6IGJhZCBzcGVjaWFsaXggcG9ydCBtYWdpYyBudW1iZXIgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9CisJCUtFUk5fRVJSICJzeDogV2FybmluZzogbnVsbCBzcGVjaWFsaXggcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOworIAorCWlmICghcG9ydCkgeworCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocG9ydC0+bWFnaWMgIT0gU1BFQ0lBTElYX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisKKy8qCisgKiAKKyAqICBTZXJ2aWNlIGZ1bmN0aW9ucyBmb3Igc3BlY2lhbGl4IElPOCsgZHJpdmVyLgorICogCisgKi8KKworLyogR2V0IGJvYXJkIG51bWJlciBmcm9tIHBvaW50ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJvYXJkX05vIChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnApCit7CisJcmV0dXJuIGJwIC0gc3hfYm9hcmQ7Cit9CisKKworLyogR2V0IHBvcnQgbnVtYmVyIGZyb20gcG9pbnRlciAqLworc3RhdGljIGlubGluZSBpbnQgcG9ydF9ObyAoc3RydWN0IHNwZWNpYWxpeF9wb3J0IGNvbnN0ICogcG9ydCkKK3sKKwlyZXR1cm4gU1hfUE9SVChwb3J0IC0gc3hfcG9ydCk7IAorfQorCisKKy8qIEdldCBwb2ludGVyIHRvIGJvYXJkIGZyb20gcG9pbnRlciB0byBwb3J0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBwb3J0X0JvYXJkKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCBjb25zdCAqIHBvcnQpCit7CisJcmV0dXJuICZzeF9ib2FyZFtTWF9CT0FSRChwb3J0IC0gc3hfcG9ydCldOworfQorCisKKy8qIElucHV0IEJ5dGUgZnJvbSBDTCBDRDE4NnggcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzeF9pbihzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJYnAtPnJlZyA9IHJlZyB8IDB4ODA7CisJb3V0YiAocmVnIHwgMHg4MCwgYnAtPmJhc2UgKyBTWF9BRERSX1JFRyk7CisJcmV0dXJuIGluYiAgKGJwLT5iYXNlICsgU1hfREFUQV9SRUcpOworfQorCisKKy8qIE91dHB1dCBCeXRlIHRvIENMIENEMTg2eCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHN4X291dChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwLCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkgIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWJwLT5yZWcgPSByZWcgfCAweDgwOworCW91dGIgKHJlZyB8IDB4ODAsIGJwLT5iYXNlICsgU1hfQUREUl9SRUcpOworCW91dGIgKHZhbCwgYnAtPmJhc2UgKyBTWF9EQVRBX1JFRyk7Cit9CisKKworLyogSW5wdXQgQnl0ZSBmcm9tIENMIENEMTg2eCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN4X2luX29mZihzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJYnAtPnJlZyA9IHJlZzsKKwlvdXRiIChyZWcsIGJwLT5iYXNlICsgU1hfQUREUl9SRUcpOworCXJldHVybiBpbmIgIChicC0+YmFzZSArIFNYX0RBVEFfUkVHKTsKK30KKworCisvKiBPdXRwdXQgQnl0ZSB0byBDTCBDRDE4NnggcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9vdXRfb2ZmKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCSAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJYnAtPnJlZyA9IHJlZzsKKwlvdXRiIChyZWcsIGJwLT5iYXNlICsgU1hfQUREUl9SRUcpOworCW91dGIgKHZhbCwgYnAtPmJhc2UgKyBTWF9EQVRBX1JFRyk7Cit9CisKKworLyogV2FpdCBmb3IgQ2hhbm5lbCBDb21tYW5kIFJlZ2lzdGVyIHJlYWR5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfd2FpdF9DQ1Ioc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGRlbGF5LCBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGNjcjsKKworCWZvciAoZGVsYXkgPSBTWF9DQ1JfVElNRU9VVDsgZGVsYXk7IGRlbGF5LS0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCWNjciA9IHN4X2luKGJwLCBDRDE4NnhfQ0NSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCFjY3IpCisJCQlyZXR1cm47CisJCXVkZWxheSAoMSk7CisJfQorCQorCXByaW50ayhLRVJOX0VSUiAic3glZDogVGltZW91dCB3YWl0aW5nIGZvciBDQ1IuXG4iLCBib2FyZF9ObyhicCkpOworfQorCisKKy8qIFdhaXQgZm9yIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciByZWFkeSAqLworc3RhdGljIGlubGluZSB2b2lkIHN4X3dhaXRfQ0NSX29mZihzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwKQoreworCXVuc2lnbmVkIGxvbmcgZGVsYXk7CisJdW5zaWduZWQgY2hhciBjcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoZGVsYXkgPSBTWF9DQ1JfVElNRU9VVDsgZGVsYXk7IGRlbGF5LS0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCWNyciA9IHN4X2luX29mZihicCwgQ0QxODZ4X0NDUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCWlmICghY3JyKQorCQkJcmV0dXJuOworCQl1ZGVsYXkgKDEpOworCX0KKwkKKwlwcmludGsoS0VSTl9FUlIgInN4JWQ6IFRpbWVvdXQgd2FpdGluZyBmb3IgQ0NSLlxuIiwgYm9hcmRfTm8oYnApKTsKK30KKworCisvKgorICogIHNwZWNpYWxpeCBJTzgrIElPIHJhbmdlIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzeF9jaGVja19pb19yYW5nZShzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnApCit7CisJcmV0dXJuIGNoZWNrX3JlZ2lvbiAoYnAtPmJhc2UsIFNYX0lPX1NQQUNFKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfcmVxdWVzdF9pb19yYW5nZShzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnApCit7CisJcmVxdWVzdF9yZWdpb24oYnAtPmJhc2UsIAorCSAgICAgICAgICAgICAgIGJwLT5mbGFncyZTWF9CT0FSRF9JU19QQ0k/U1hfUENJX0lPX1NQQUNFOlNYX0lPX1NQQUNFLAorCSAgICAgICAgICAgICAgICJzcGVjaWFsaXggSU84KyIgKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfcmVsZWFzZV9pb19yYW5nZShzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnApCit7CisJcmVsZWFzZV9yZWdpb24oYnAtPmJhc2UsIAorCSAgICAgICAgICAgICAgIGJwLT5mbGFncyZTWF9CT0FSRF9JU19QQ0k/U1hfUENJX0lPX1NQQUNFOlNYX0lPX1NQQUNFKTsKK30KKworCQorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBlbmFibGVkIGludGVycnVwdHMgKi8KKy8qIFVnbHkuIFZlcnkgdWdseS4gRG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nIGVsc2UgdGhhbiBpbml0aWFsaXphdGlvbiAKKyAgIGNvZGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9sb25nX2RlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJdW5zaWduZWQgbG9uZyBpOworCQorCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLCBqaWZmaWVzKTsgKSA7Cit9CisKKworCisvKiBTZXQgdGhlIElSUSB1c2luZyB0aGUgUlRTIGxpbmVzIHRoYXQgcnVuIHRvIHRoZSBQQUwgb24gdGhlIGJvYXJkLi4uLiAqLworc3RhdGljIGludCBzeF9zZXRfaXJxICggc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnApCit7CisJaW50IHZpcnE7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChicC0+ZmxhZ3MgJiBTWF9CT0FSRF9JU19QQ0kpIAorCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKGJwLT5pcnEpIHsKKwkvKiBJbiB0aGUgc2FtZSBvcmRlciBhcyBpbiB0aGUgZG9jcy4uLiAqLworCWNhc2UgMTU6IHZpcnEgPSAwO2JyZWFrOworCWNhc2UgMTI6IHZpcnEgPSAxO2JyZWFrOworCWNhc2UgMTE6IHZpcnEgPSAyO2JyZWFrOworCWNhc2UgOTogIHZpcnEgPSAzO2JyZWFrOworCWRlZmF1bHQ6IHByaW50ayAoS0VSTl9FUlIgIlNwZWNsaWFsaXg6IGNhbm5vdCBzZXQgaXJxIHRvICVkLlxuIiwgYnAtPmlycSk7CisJICAgICAgICAgcmV0dXJuIDA7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCWZvciAoaT0wO2k8MjtpKyspIHsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBpKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfTVNWUlRTLCAoKHZpcnEgPj4gaSkgJiAweDEpPyBNU1ZSX1JUUzowKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworCisvKiBSZXNldCBhbmQgc2V0dXAgQ0QxODZ4IGNoaXAgKi8KK3N0YXRpYyBpbnQgc3hfaW5pdF9DRDE4Nngoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzY2FsZXI7CisJaW50IHJ2ID0gMTsKKworCWZ1bmNfZW50ZXIoKTsKKwlzeF93YWl0X0NDUl9vZmYoYnApOwkJCSAgIC8qIFdhaXQgZm9yIENDUiByZWFkeSAgICAgICAgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfQ0NSLCBDQ1JfSEFSRFJFU0VUKTsgICAgICAvKiBSZXNldCBDRDE4NnggY2hpcCAgICAgICAgICAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfbG9uZ19kZWxheShIWi8yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfR0lWUiwgU1hfSUQpOyAgICAgICAgICAgICAvKiBTZXQgSUQgZm9yIHRoaXMgY2hpcCAgICAgICovCisJc3hfb3V0X29mZihicCwgQ0QxODZ4X0dJQ1IsIDApOyAgICAgICAgICAgICAgICAgLyogQ2xlYXIgYWxsIGJpdHMgICAgICAgICAgICAqLworCXN4X291dF9vZmYoYnAsIENEMTg2eF9QSUxSMSwgU1hfQUNLX01JTlQpOyAgICAgIC8qIFByaW8gZm9yIG1vZGVtIGludHIgICAgICAgKi8KKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfUElMUjIsIFNYX0FDS19USU5UKTsgICAgICAvKiBQcmlvIGZvciB0cmFuc21pdHRlciBpbnRyICovCisJc3hfb3V0X29mZihicCwgQ0QxODZ4X1BJTFIzLCBTWF9BQ0tfUklOVCk7ICAgICAgLyogUHJpbyBmb3IgcmVjZWl2ZXIgaW50ciAgICAqLworCS8qIFNldCBSZWdBY2tFbiAqLworCXN4X291dF9vZmYoYnAsIENEMTg2eF9TUkNSLCBzeF9pbiAoYnAsIENEMTg2eF9TUkNSKSB8IFNSQ1JfUkVHQUNLRU4pOworCQorCS8qIFNldHRpbmcgdXAgcHJlc2NhbGVyLiBXZSBuZWVkIDQgdGlja3MgcGVyIDEgbXMgKi8KKwlzY2FsZXIgPSAgU1hfT1NDRlJFUS9TUEVDSUFMSVhfVFBTOworCisJc3hfb3V0X29mZihicCwgQ0QxODZ4X1BQUkgsIHNjYWxlciA+PiA4KTsKKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfUFBSTCwgc2NhbGVyICYgMHhmZik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlmICghc3hfc2V0X2lycSAoYnApKSB7CisJCS8qIEZpZ3VyZSBvdXQgaG93IHRvIHBhc3MgdGhpcyBhbG9uZy4uLiAqLworCQlwcmludGsgKEtFUk5fRVJSICJDYW5ub3Qgc2V0IGlycSB0byAlZC5cbiIsIGJwLT5pcnEpOworCQlydiA9IDA7CisJfQorCisJZnVuY19leGl0KCk7CisJcmV0dXJuIHJ2OworfQorCisKK3N0YXRpYyBpbnQgcmVhZF9jcm9zc19ieXRlIChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCwgaW50IHJlZywgaW50IGJpdCkKK3sKKwlpbnQgaTsKKwlpbnQgdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJZm9yIChpPTAsIHQ9MDtpPDg7aSsrKSB7CisJCXN4X291dF9vZmYgKGJwLCBDRDE4NnhfQ0FSLCBpKTsKKwkJaWYgKHN4X2luX29mZiAoYnAsIHJlZykgJiBiaXQpIAorCQkJdCB8PSAxIDw8IGk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdDsKK30KKworCisjaWZkZWYgU1BFQ0lBTElYX1RJTUVSCit2b2lkIG1pc3NlZF9pcnEgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICpicCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICopZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCWlycSA9IHN4X2luICgoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqKWRhdGEsIENEMTg2eF9TUlNSKSAmCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1JTUl9SUkVRaW50IHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUlNSX1RSRVFpbnQgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSU1JfTVJFUWludCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaXJxKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJNaXNzZWQgaW50ZXJydXB0Li4uIENhbGxpbmcgaW50IGZyb20gdGltZXIuIFxuIik7CisJCXN4X2ludGVycnVwdCAoKChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICopZGF0YSktPmlycSwgCisJCSAgICAgICAgICAgICAgKHZvaWQqKWRhdGEsIE5VTEwpOworCX0KKwltaXNzZWRfaXJxX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgc3hfcG9sbDsKKwlhZGRfdGltZXIgKCZtaXNzZWRfaXJxX3RpbWVyKTsKK30KKyNlbmRpZgorCisKKworLyogTWFpbiBwcm9iaW5nIHJvdXRpbmUsIGFsc28gc2V0cyBpcnEuICovCitzdGF0aWMgaW50IHN4X3Byb2JlKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwKQoreworCXVuc2lnbmVkIGNoYXIgdmFsMSwgdmFsMjsKKyNpZiAwCisJaW50IGlycXMgPSAwOworCWludCByZXRyaWVzOworI2VuZGlmCisJaW50IHJldjsKKwlpbnQgY2hpcDsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9jaGVja19pb19yYW5nZShicCkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAxOworCX0KKworCS8qIEFyZSB0aGUgSS9PIHBvcnRzIGhlcmUgPyAqLworCXN4X291dF9vZmYoYnAsIENEMTg2eF9QUFJMLCAweDVhKTsKKwlzaG9ydF9wYXVzZSAoKTsKKwl2YWwxID0gc3hfaW5fb2ZmKGJwLCBDRDE4NnhfUFBSTCk7CisKKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfUFBSTCwgMHhhNSk7CisJc2hvcnRfcGF1c2UgKCk7CisJdmFsMiA9IHN4X2luX29mZihicCwgQ0QxODZ4X1BQUkwpOworCisJCisJaWYgKCh2YWwxICE9IDB4NWEpIHx8ICh2YWwyICE9IDB4YTUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInN4JWQ6IHNwZWNpYWxpeCBJTzgrIEJvYXJkIGF0IDB4JTAzeCBub3QgZm91bmQuXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBDaGVjayB0aGUgRFNSIGxpbmVzIHRoYXQgU3BlY2lhbGl4IHVzZXMgYXMgYm9hcmQgCisJICAgaWRlbnRpZmljYXRpb24gKi8KKwl2YWwxID0gcmVhZF9jcm9zc19ieXRlIChicCwgQ0QxODZ4X01TVlIsIE1TVlJfRFNSKTsKKwl2YWwyID0gcmVhZF9jcm9zc19ieXRlIChicCwgQ0QxODZ4X01TVlIsIE1TVlJfUlRTKTsKKwlkcHJpbnRrIChTWF9ERUJVR19JTklULCAic3glZDogRFNSIGxpbmVzIGFyZTogJTAyeCwgcnRzIGxpbmVzIGFyZTogJTAyeFxuIiwKKwkgICAgICAgIGJvYXJkX05vKGJwKSwgIHZhbDEsIHZhbDIpOworCisJLyogVGhleSBtYW5hZ2VkIHRvIHN3aXRjaCB0aGUgYml0IG9yZGVyIGJldHdlZW4gdGhlIGRvY3MgYW5kCisJICAgdGhlIElPOCsgY2FyZC4gVGhlIG5ldyBQQ0kgY2FyZCBub3cgY29uZm9ybXMgdG8gb2xkIGRvY3MuCisJICAgVGhleSBjaGFuZ2VkIHRoZSBQQ0kgZG9jcyB0byByZWZsZWN0IHRoZSBzaXR1YXRpb24gb24gdGhlCisJICAgb2xkIGNhcmQuICovCisJdmFsMiA9IChicC0+ZmxhZ3MgJiBTWF9CT0FSRF9JU19QQ0kpPzB4NGQgOiAweGIyOworCWlmICh2YWwxICE9IHZhbDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3glZDogc3BlY2lhbGl4IElPOCsgSUQgJTAyeCBhdCAweCUwM3ggbm90IGZvdW5kICglMDJ4KS5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHZhbDIsIGJwLT5iYXNlLCB2YWwxKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAxOworCX0KKworCisjaWYgMAorCS8qIEl0J3MgdGltZSB0byBmaW5kIElSUSBmb3IgdGhpcyBib2FyZCAqLworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCA1ICYmIGlycXMgPD0gMDsgcmV0cmllcysrKSB7CisJCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKKwkJc3hfaW5pdF9DRDE4NngoYnApOwkgICAgICAgCQkvKiBSZXNldCBDRDE4NnggY2hpcCAgICAgICAqLworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIDIpOyAgICAgICAgICAgICAgIC8qIFNlbGVjdCBwb3J0IDIgICAgICAgICAgKi8KKwkJc3hfd2FpdF9DQ1IoYnApOworCQlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9UWEVOKTsgICAgICAgIC8qIEVuYWJsZSB0cmFuc21pdHRlciAgICAgKi8KKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBJRVJfVFhSRFkpOyAgICAgICAvKiBFbmFibGUgdHggZW1wdHkgaW50ciAgICovCisJCXN4X2xvbmdfZGVsYXkoSFovMjApOwkgICAgICAgCQkKKwkJaXJxcyA9IHByb2JlX2lycV9vZmYoaXJxcyk7CisKKwkJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlNSU1IgPSAlMDJ4LCAiLCBzeF9pbihicCwgQ0QxODZ4X1NSU1IpKTsKKwkJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlRSQVIgPSAlMDJ4LCAiLCBzeF9pbihicCwgQ0QxODZ4X1RSQVIpKTsKKwkJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIkdJVlIgPSAlMDJ4LCAiLCBzeF9pbihicCwgQ0QxODZ4X0dJVlIpKTsKKwkJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIkdJQ1IgPSAlMDJ4LCAiLCBzeF9pbihicCwgQ0QxODZ4X0dJQ1IpKTsKKwkJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlxuIik7CisKKwkJLyogUmVzZXQgQ0QxODZ4IGFnYWluICAgICAgKi8KKwkJaWYgKCFzeF9pbml0X0NEMTg2eChicCkpIHsKKwkJCS8qIEhtbW0uIFRoaXMgaXMgZGVhZCBjb2RlIGFueXdheS4gKi8KKwkJfQorCisJCWRwcmludGsgKFNYX0RFQlVHX0lOSVQgInZhbDEgPSAlMDJ4LCB2YWwyID0gJTAyeCwgdmFsMyA9ICUwMnguXG4iLAorCQkgICAgICAgIHZhbDEsIHZhbDIsIHZhbDMpOyAKKwkKKwl9CisJCisjaWYgMAorCWlmIChpcnFzIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBDYW4ndCBmaW5kIElSUSBmb3Igc3BlY2lhbGl4IElPOCsgYm9hcmQgYXQgMHglMDN4LlxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgYnAtPmJhc2UpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcHJpbnRrIChLRVJOX0lORk8gIlN0YXJ0ZWQgd2l0aCBpcnE9JWQsIGJ1dCBub3cgaGF2ZSBpcnE9JWQuXG4iLCBicC0+aXJxLCBpcnFzKTsKKwlpZiAoaXJxcyA+IDApCisJCWJwLT5pcnEgPSBpcnFzOworI2VuZGlmCisJLyogUmVzZXQgQ0QxODZ4IGFnYWluICAqLworCWlmICghc3hfaW5pdF9DRDE4NngoYnApKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzeF9yZXF1ZXN0X2lvX3JhbmdlKGJwKTsKKwlicC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsKKwkKKwkvKiBDaGlwICAgICAgICAgICByZXZjb2RlICAgcGtndHlwZQorCSAgICAgICAgICAgICAgICAgIEdGUkNSICAgICBTUkNSIGJpdCA3CisJICAgQ0QxODAgcmV2IEIgICAgMHg4MSAgICAgIDAKKwkgICBDRDE4MCByZXYgQyAgICAweDgyICAgICAgMAorCSAgIENEMTg2NCByZXYgQSAgIDB4ODIgICAgICAxCisJICAgQ0QxODY1IHJldiBBICAgMHg4MyAgICAgIDEgIC0tIERvIG5vdCB1c2UhISEgRG9lcyBub3Qgd29yay4gCisJICAgQ0QxODY1IHJldiBCICAgMHg4NCAgICAgIDEKKwkgLS0gVGhhbmtzIHRvIEd3ZW4gV2FuZywgQ2lycnVzIExvZ2ljLgorCSAqLworCisJc3dpdGNoIChzeF9pbl9vZmYoYnAsIENEMTg2eF9HRlJDUikpIHsKKwljYXNlIDB4ODI6Y2hpcCA9IDE4NjQ7cmV2PSdBJzticmVhazsKKwljYXNlIDB4ODM6Y2hpcCA9IDE4NjU7cmV2PSdBJzticmVhazsKKwljYXNlIDB4ODQ6Y2hpcCA9IDE4NjU7cmV2PSdCJzticmVhazsKKwljYXNlIDB4ODU6Y2hpcCA9IDE4NjU7cmV2PSdDJzticmVhazsgLyogRG9lcyBub3QgZXhpc3QgYXQgdGhpcyB0aW1lICovCisJZGVmYXVsdDpjaGlwPS0xO3Jldj0neCc7CisJfQorCisJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIiBHRkNSID0gMHglMDJ4XG4iLCBzeF9pbl9vZmYoYnAsIENEMTg2eF9HRlJDUikgKTsKKworI2lmZGVmIFNQRUNJQUxJWF9USU1FUgorCWluaXRfdGltZXIgKCZtaXNzZWRfaXJxX3RpbWVyKTsKKwltaXNzZWRfaXJxX3RpbWVyLmZ1bmN0aW9uID0gbWlzc2VkX2lycTsKKwltaXNzZWRfaXJxX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYnA7CisJbWlzc2VkX2lycV90aW1lci5leHBpcmVzID0gamlmZmllcyArIHN4X3BvbGw7CisJYWRkX3RpbWVyICgmbWlzc2VkX2lycV90aW1lcik7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8ic3glZDogc3BlY2lhbGl4IElPOCsgYm9hcmQgZGV0ZWN0ZWQgYXQgMHglMDN4LCBJUlEgJWQsIENEJWQgUmV2LiAlYy5cbiIsCisJICAgICAgIGJvYXJkX05vKGJwKSwKKwkgICAgICAgYnAtPmJhc2UsIGJwLT5pcnEsCisJICAgICAgIGNoaXAsIHJldik7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworLyogCisgKiAKKyAqICBJbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lcy4KKyAqICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9tYXJrX2V2ZW50KHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqIHBvcnQsIGludCBldmVudCkKK3sKKwlmdW5jX2VudGVyKCk7CisKKwlzZXRfYml0KGV2ZW50LCAmcG9ydC0+ZXZlbnQpOworCXNjaGVkdWxlX3dvcmsoJnBvcnQtPnRxdWV1ZSk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqIHN4X2dldF9wb3J0KHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKiB3aGF0KQoreworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKiBwb3J0ID0gTlVMTDsKKworCWNoYW5uZWwgPSBzeF9pbihicCwgQ0QxODZ4X0dJQ1IpID4+IEdJQ1JfQ0hBTl9PRkY7CisJZHByaW50ayAoU1hfREVCVUdfQ0hBTiwgImNoYW5uZWw6ICVkXG4iLCBjaGFubmVsKTsKKwlpZiAoY2hhbm5lbCA8IENEMTg2eF9OQ0gpIHsKKwkJcG9ydCA9ICZzeF9wb3J0W2JvYXJkX05vKGJwKSAqIFNYX05QT1JUICsgY2hhbm5lbF07CisJCWRwcmludGsgKFNYX0RFQlVHX0NIQU4sICJwb3J0OiAlZCAlcCBmbGFnczogMHgleFxuIixib2FyZF9ObyhicCkgKiBTWF9OUE9SVCArIGNoYW5uZWwsICBwb3J0LCBwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKTsKKworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQkJZHByaW50ayAoU1hfREVCVUdfQ0hBTiwgInBvcnQ6ICVkICVwXG4iLCBjaGFubmVsLCBwb3J0KTsKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIHBvcnQ7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAic3glZDogJXMgaW50ZXJydXB0IGZyb20gaW52YWxpZCBwb3J0ICVkXG4iLCAKKwkgICAgICAgYm9hcmRfTm8oYnApLCB3aGF0LCBjaGFubmVsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfcmVjZWl2ZV9leGMoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgY2g7CisKKwlmdW5jX2VudGVyKCk7CisKKwlwb3J0ID0gc3hfZ2V0X3BvcnQoYnAsICJSZWNlaXZlIik7CisJaWYgKCFwb3J0KSB7CisJCWRwcmludGsgKFNYX0RFQlVHX1JYLCAiSG1tLCBjb3VsZG4ndCBmaW5kIHBvcnQuXG4iKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJdHR5ID0gcG9ydC0+dHR5OworCWRwcmludGsgKFNYX0RFQlVHX1JYLCAicG9ydDogJXAgY291bnQ6ICVkIEJVRkZfU0laRTogJWRcbiIsCisJCSBwb3J0LCAgdHR5LT5mbGlwLmNvdW50LCBUVFlfRkxJUEJVRl9TSVpFKTsKKwkKKwlzdGF0dXMgPSBzeF9pbihicCwgQ0QxODZ4X1JDU1IpOworCisJZHByaW50ayAoU1hfREVCVUdfUlgsICJzdGF0dXM6IDB4JXhcbiIsIHN0YXR1cyk7CisJaWYgKHN0YXR1cyAmIFJDU1JfT0UpIHsKKwkJcG9ydC0+b3ZlcnJ1bisrOworCQlkcHJpbnRrKFNYX0RFQlVHX0ZJRk8sICJzeCVkOiBwb3J0ICVkOiBPdmVycnVuLiBUb3RhbCAlbGQgb3ZlcnJ1bnMuXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpLCBwb3J0LT5vdmVycnVuKTsKKwl9CisJc3RhdHVzICY9IHBvcnQtPm1hcmtfbWFzazsKKworCS8qIFRoaXMgZmxpcCBidWZmZXIgY2hlY2sgbmVlZHMgdG8gYmUgYmVsb3cgdGhlIHJlYWRpbmcgb2YgdGhlCisJICAgc3RhdHVzIHJlZ2lzdGVyIHRvIHJlc2V0IHRoZSBjaGlwJ3MgSVJRLi4uLiAqLworCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgeworCQlkcHJpbnRrKFNYX0RFQlVHX0ZJRk8sICJzeCVkOiBwb3J0ICVkOiBXb3JraW5nIGFyb3VuZCBmbGlwIGJ1ZmZlciBvdmVyZmxvdy5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKworCWNoID0gc3hfaW4oYnAsIENEMTg2eF9SRFIpOworCWlmICghc3RhdHVzKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCWlmIChzdGF0dXMgJiBSQ1NSX1RPVVQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3glZDogcG9ydCAlZDogUmVjZWl2ZXIgdGltZW91dC4gSGFyZHdhcmUgcHJvYmxlbXMgP1xuIiwgCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCQkKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfQlJFQUspIHsKKwkJZHByaW50ayhTWF9ERUJVR19SWCwgInN4JWQ6IHBvcnQgJWQ6IEhhbmRsaW5nIGJyZWFrLi4uXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJZG9fU0FLKHR0eSk7CisJCQorCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9QRSkgCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQorCWVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfRkUpIAorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0ZSQU1FOworCQorCWVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfT0UpCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfT1ZFUlJVTjsKKwkKKwllbHNlCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOworCQorCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBjaDsKKwl0dHktPmZsaXAuY291bnQrKzsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9yZWNlaXZlKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNvdW50OworCisJZnVuY19lbnRlcigpOworCQorCWlmICghKHBvcnQgPSBzeF9nZXRfcG9ydChicCwgIlJlY2VpdmUiKSkpIHsKKwkJZHByaW50ayAoU1hfREVCVUdfUlgsICJIbW0sIGNvdWxkbid0IGZpbmQgcG9ydC5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwl0dHkgPSBwb3J0LT50dHk7CisJCisJY291bnQgPSBzeF9pbihicCwgQ0QxODZ4X1JEQ1IpOworCWRwcmludGsgKFNYX0RFQlVHX1JYLCAicG9ydDogJXA6IGNvdW50OiAlZFxuIiwgcG9ydCwgY291bnQpOworCXBvcnQtPmhpdHNbY291bnQgPiA4ID8gOSA6IGNvdW50XSsrOworCQorCXdoaWxlIChjb3VudC0tKSB7CisJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic3glZDogcG9ydCAlZDogV29ya2luZyBhcm91bmQgZmxpcCBidWZmZXIgb3ZlcmZsb3cuXG4iLAorCQkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCQlicmVhazsKKwkJfQorCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gc3hfaW4oYnAsIENEMTg2eF9SRFIpOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJdHR5LT5mbGlwLmNvdW50Kys7CisJfQorCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHN4X3RyYW5zbWl0KHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNvdW50OworCisJZnVuY19lbnRlcigpOworCWlmICghKHBvcnQgPSBzeF9nZXRfcG9ydChicCwgIlRyYW5zbWl0IikpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCWRwcmludGsgKFNYX0RFQlVHX1RYLCAicG9ydDogJXBcbiIsIHBvcnQpOworCXR0eSA9IHBvcnQtPnR0eTsKKwkKKwlpZiAocG9ydC0+SUVSICYgSUVSX1RYRU1QVFkpIHsKKwkJLyogRklGTyBkcmFpbmVkICovCisJCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYRU1QVFk7CisJCXN4X291dChicCwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKChwb3J0LT54bWl0X2NudCA8PSAwICYmICFwb3J0LT5icmVha19sZW5ndGgpCisJICAgIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpIHsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJCXN4X291dChicCwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHBvcnQtPmJyZWFrX2xlbmd0aCkgeworCQlpZiAocG9ydC0+YnJlYWtfbGVuZ3RoID4gMCkgeworCQkJaWYgKHBvcnQtPkNPUjIgJiBDT1IyX0VUQykgeworCQkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgQ0QxODZ4X0NfRVNDKTsKKwkJCQlzeF9vdXQoYnAsIENEMTg2eF9URFIsIENEMTg2eF9DX1NCUkspOworCQkJCXBvcnQtPkNPUjIgJj0gfkNPUjJfRVRDOworCQkJfQorCQkJY291bnQgPSBtaW5fdChpbnQsIHBvcnQtPmJyZWFrX2xlbmd0aCwgMHhmZik7CisJCQlzeF9vdXQoYnAsIENEMTg2eF9URFIsIENEMTg2eF9DX0VTQyk7CisJCQlzeF9vdXQoYnAsIENEMTg2eF9URFIsIENEMTg2eF9DX0RFTEFZKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgY291bnQpOworCQkJaWYgKCEocG9ydC0+YnJlYWtfbGVuZ3RoIC09IGNvdW50KSkKKwkJCQlwb3J0LT5icmVha19sZW5ndGgtLTsKKwkJfSBlbHNlIHsKKwkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgQ0QxODZ4X0NfRVNDKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgQ0QxODZ4X0NfRUJSSyk7CisJCQlzeF9vdXQoYnAsIENEMTg2eF9DT1IyLCBwb3J0LT5DT1IyKTsKKwkJCXN4X3dhaXRfQ0NSKGJwKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX0NPUkNIRzIpOworCQkJcG9ydC0+YnJlYWtfbGVuZ3RoID0gMDsKKwkJfQorCisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWNvdW50ID0gQ0QxODZ4X05GSUZPOworCWRvIHsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfVERSLCBwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X3RhaWwrK10pOworCQlwb3J0LT54bWl0X3RhaWwgPSBwb3J0LT54bWl0X3RhaWwgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwkJaWYgKC0tcG9ydC0+eG1pdF9jbnQgPD0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwkKKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCkgeworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQorCQlzeF9tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfY2hlY2tfbW9kZW0oc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgbWNyOworCWludCBtc3ZyX2NkOworCisJZHByaW50ayAoU1hfREVCVUdfU0lHTkFMUywgIk1vZGVtIGludHIuICIpOworCWlmICghKHBvcnQgPSBzeF9nZXRfcG9ydChicCwgIk1vZGVtIikpKQorCQlyZXR1cm47CisJCisJdHR5ID0gcG9ydC0+dHR5OworCQorCW1jciA9IHN4X2luKGJwLCBDRDE4NnhfTUNSKTsKKwlwcmludGsgKCJtY3IgPSAlMDJ4LlxuIiwgbWNyKTsKKworCWlmICgobWNyICYgTUNSX0NEQ0hHKSkgeworCQlkcHJpbnRrIChTWF9ERUJVR19TSUdOQUxTLCAiQ0QganVzdCBjaGFuZ2VkLi4uICIpOworCQltc3ZyX2NkID0gc3hfaW4oYnAsIENEMTg2eF9NU1ZSKSAmIE1TVlJfQ0Q7CisJCWlmIChtc3ZyX2NkKSB7CisJCQlkcHJpbnRrIChTWF9ERUJVR19TSUdOQUxTLCAiV2FraW5nIHVwIGd1eXMgaW4gb3Blbi5cbiIpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCQl9IGVsc2UgeworCQkJZHByaW50ayAoU1hfREVCVUdfU0lHTkFMUywgIlNlbmRpbmcgSFVQLlxuIik7CisJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50cXVldWVfaGFuZ3VwKTsKKwkJfQorCX0KKwkKKyNpZmRlZiBTUEVDSUFMSVhfQlJBSU5fREFNQUdFRF9DVFMKKwlpZiAobWNyICYgTUNSX0NUU0NIRykgeworCQlpZiAoc3hfaW4oYnAsIENEMTg2eF9NU1ZSKSAmIE1TVlJfQ1RTKSB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJCWlmIChwb3J0LT54bWl0X2NudCA8PSBwb3J0LT53YWtldXBfY2hhcnMpCisJCQkJc3hfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQl9IGVsc2UgeworCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQl9CisJCXN4X291dChicCwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwl9CisJaWYgKG1jciAmIE1DUl9EU1NYSEcpIHsKKwkJaWYgKHN4X2luKGJwLCBDRDE4NnhfTVNWUikgJiBNU1ZSX0RTUikgeworCQkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQorCQkJCXN4X21hcmtfZXZlbnQocG9ydCwgUlNfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKwkJfSBlbHNlIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJfQorCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJfQorI2VuZGlmIC8qIFNQRUNJQUxJWF9CUkFJTl9EQU1BR0VEX0NUUyAqLworCQorCS8qIENsZWFyIGNoYW5nZSBiaXRzICovCisJc3hfb3V0KGJwLCBDRDE4NnhfTUNSLCAwKTsKK30KKworCisvKiBUaGUgbWFpbiBpbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBhY2s7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBsb29wID0gMDsKKwlpbnQgc2F2ZWRfcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisKKwlicCA9IGRldl9pZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWRwcmludGsgKFNYX0RFQlVHX0ZMT1csICJlbnRlciAlcyBwb3J0ICVkIHJvb206ICVsZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X05vKHN4X2dldF9wb3J0KGJwLCAiSU5UIikpLCBTRVJJQUxfWE1JVF9TSVpFIC0gc3hfZ2V0X3BvcnQoYnAsICJJVE4iKS0+eG1pdF9jbnQgLSAxKTsKKwlpZiAoIWJwIHx8ICEoYnAtPmZsYWdzICYgU1hfQk9BUkRfQUNUSVZFKSkgeworCQlkcHJpbnRrIChTWF9ERUJVR19JUlEsICJzeDogRmFsc2UgaW50ZXJydXB0LiBpcnEgJWQuXG4iLCBpcnEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXNhdmVkX3JlZyA9IGJwLT5yZWc7CisKKwl3aGlsZSAoKCsrbG9vcCA8IDE2KSAmJiAoc3RhdHVzID0gKHN4X2luKGJwLCBDRDE4NnhfU1JTUikgJgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNSU1JfUlJFUWludCB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUlNSX1RSRVFpbnQgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSU1JfTVJFUWludCkpKSkgewkKKwkJaWYgKHN0YXR1cyAmIFNSU1JfUlJFUWludCkgeworCQkJYWNrID0gc3hfaW4oYnAsIENEMTg2eF9SUkFSKTsKKworCQkJaWYgKGFjayA9PSAoU1hfSUQgfCBHSVZSX0lUX1JDVikpCisJCQkJc3hfcmVjZWl2ZShicCk7CisJCQllbHNlIGlmIChhY2sgPT0gKFNYX0lEIHwgR0lWUl9JVF9SRVhDKSkKKwkJCQlzeF9yZWNlaXZlX2V4YyhicCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBzdGF0dXM6IDB4JXggQmFkIHJlY2VpdmUgYWNrIDB4JTAyeC5cbiIsCisJCQkJICAgICAgIGJvYXJkX05vKGJwKSwgc3RhdHVzLCBhY2spOworCQkKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBTUlNSX1RSRVFpbnQpIHsKKwkJCWFjayA9IHN4X2luKGJwLCBDRDE4NnhfVFJBUik7CisKKwkJCWlmIChhY2sgPT0gKFNYX0lEIHwgR0lWUl9JVF9UWCkpCisJCQkJc3hfdHJhbnNtaXQoYnApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0VSUiAic3glZDogc3RhdHVzOiAweCV4IEJhZCB0cmFuc21pdCBhY2sgMHglMDJ4LiBwb3J0OiAlZFxuIiwKKwkJCQkgICAgICAgYm9hcmRfTm8oYnApLCBzdGF0dXMsIGFjaywgcG9ydF9ObyAoc3hfZ2V0X3BvcnQgKGJwLCAiSW50IikpKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBTUlNSX01SRVFpbnQpIHsKKwkJCWFjayA9IHN4X2luKGJwLCBDRDE4NnhfTVJBUik7CisKKwkJCWlmIChhY2sgPT0gKFNYX0lEIHwgR0lWUl9JVF9NT0RFTSkpIAorCQkJCXN4X2NoZWNrX21vZGVtKGJwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgInN4JWQ6IHN0YXR1czogMHgleCBCYWQgbW9kZW0gYWNrIDB4JTAyeC5cbiIsCisJCQkJICAgICAgIGJvYXJkX05vKGJwKSwgc3RhdHVzLCBhY2spOworCQkKKwkJfSAKKworCQlzeF9vdXQoYnAsIENEMTg2eF9FT0lSLCAwKTsgICAvKiBNYXJrIGVuZCBvZiBpbnRlcnJ1cHQgKi8KKwl9CisJYnAtPnJlZyA9IHNhdmVkX3JlZzsKKwlvdXRiIChicC0+cmVnLCBicC0+YmFzZSArIFNYX0FERFJfUkVHKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWZ1bmNfZXhpdCgpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKgorICogIFJvdXRpbmVzIGZvciBvcGVuICYgY2xvc2UgcHJvY2Vzc2luZy4KKyAqLworCitzdGF0aWMgdm9pZCB0dXJuX2ludHNfb2ZmIChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCWlmIChicC0+ZmxhZ3MgJiBTWF9CT0FSRF9JU19QQ0kpIHsKKwkJLyogVGhpcyB3YXMgaW50ZW5kZWQgZm9yIGVuYWJlbGluZyB0aGUgaW50ZXJydXB0IG9uIHRoZQorCQkgKiBQQ0kgY2FyZC4gSG93ZXZlciBpdCBzZWVtcyB0aGF0IGl0J3MgYWxyZWFkeSBlbmFibGVkCisJCSAqIGFuZCBhcyBQQ0kgaW50ZXJydXB0cyBjYW4gYmUgc2hhcmVkLCB0aGVyZSBpcyBubyByZWFsCisJCSAqIHJlYXNvbiB0byBoYXZlIHRvIHR1cm4gaXQgb2ZmLiAqLworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCSh2b2lkKSBzeF9pbl9vZmYgKGJwLCAwKTsgLyogVHVybiBvZmYgaW50ZXJydXB0cy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHR1cm5faW50c19vbiAoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChicC0+ZmxhZ3MgJiBTWF9CT0FSRF9JU19QQ0kpIHsKKwkJLyogcGxheSB3aXRoIHRoZSBQQ0kgY2hpcC4gU2VlIGNvbW1lbnQgYWJvdmUuICovCisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCSh2b2lkKSBzeF9pbiAoYnAsIDApOyAvKiBUdXJuIE9OIGludGVycnVwdHMuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKKy8qIENhbGxlZCB3aXRoIGRpc2FibGVkIGludGVycnVwdHMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHN4X3NldHVwX2JvYXJkKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoYnAtPmZsYWdzICYgU1hfQk9BUkRfQUNUSVZFKSAKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnAtPmZsYWdzICYgU1hfQk9BUkRfSVNfUENJKQorCQllcnJvciA9IHJlcXVlc3RfaXJxKGJwLT5pcnEsIHN4X2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJzcGVjaWFsaXggSU84KyIsIGJwKTsKKwllbHNlCisJCWVycm9yID0gcmVxdWVzdF9pcnEoYnAtPmlycSwgc3hfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJzcGVjaWFsaXggSU84KyIsIGJwKTsKKworCWlmIChlcnJvcikgCisJCXJldHVybiBlcnJvcjsKKworCXR1cm5faW50c19vbiAoYnApOworCWJwLT5mbGFncyB8PSBTWF9CT0FSRF9BQ1RJVkU7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBDYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfc2h1dGRvd25fYm9hcmQoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnApCit7CisJZnVuY19lbnRlcigpOworCisJaWYgKCEoYnAtPmZsYWdzICYgU1hfQk9BUkRfQUNUSVZFKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKworCWJwLT5mbGFncyAmPSB+U1hfQk9BUkRfQUNUSVZFOworCQorCWRwcmludGsgKFNYX0RFQlVHX0lSUSwgIkZyZWVpbmcgSVJRJWQgZm9yIGJvYXJkICVkLlxuIiwKKwkJIGJwLT5pcnEsIGJvYXJkX05vIChicCkpOworCWZyZWVfaXJxKGJwLT5pcnEsIGJwKTsKKworCXR1cm5faW50c19vZmYgKGJwKTsKKworCisJZnVuY19leGl0KCk7Cit9CisKKworLyoKKyAqIFNldHRpbmcgdXAgcG9ydCBjaGFyYWN0ZXJpc3RpY3MuIAorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIHN4X2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCwgc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBiYXVkOworCWxvbmcgdG1wOworCXVuc2lnbmVkIGNoYXIgY29yMSA9IDAsIGNvcjMgPSAwOworCXVuc2lnbmVkIGNoYXIgbWNvcjEgPSAwLCBtY29yMiA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgYWdhaW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmICghKHR0eSA9IHBvcnQtPnR0eSkgfHwgIXR0eS0+dGVybWlvcykgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnQtPklFUiAgPSAwOworCXBvcnQtPkNPUjIgPSAwOworCS8qIFNlbGVjdCBwb3J0IG9uIHRoZSBib2FyZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisKKwkvKiBUaGUgU3BlY2lhbGl4IGJvYXJkIGRvZW5zJ3QgaW1wbGVtZW50IHRoZSBSVFMgbGluZXMuCisJICAgVGhleSBhcmUgdXNlZCB0byBzZXQgdGhlIElSUSBsZXZlbC4gRG9uJ3QgdG91Y2ggdGhlbS4gKi8KKwlpZiAoU1hfQ1JUU0NUUyh0dHkpKQorCQlwb3J0LT5NU1ZSID0gTVNWUl9EVFIgfCAoc3hfaW4oYnAsIENEMTg2eF9NU1ZSKSAmIE1TVlJfUlRTKTsKKwllbHNlCisJCXBvcnQtPk1TVlIgPSAgKHN4X2luKGJwLCBDRDE4NnhfTVNWUikgJiBNU1ZSX1JUUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlkcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAic3g6IGdvdCBNU1ZSPSUwMnguXG4iLCBwb3J0LT5NU1ZSKTsKKwliYXVkID0gQ19CQVVEKHR0eSk7CisJCisJaWYgKGJhdWQgJiBDQkFVREVYKSB7CisJCWJhdWQgJj0gfkNCQVVERVg7CisJCWlmIChiYXVkIDwgMSB8fCBiYXVkID4gMikgCisJCQlwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWQgKz0gMTU7CisJfQorCWlmIChiYXVkID09IDE1KSB7CisJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJYmF1ZCArKzsKKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJYmF1ZCArPSAyOworCX0KKwkKKwkKKwlpZiAoIWJhdWRfdGFibGVbYmF1ZF0pIHsKKwkJLyogRHJvcCBEVFIgJiBleGl0ICovCisJCWRwcmludGsgKFNYX0RFQlVHX1RFUk1JT1MsICJEcm9wcGluZyBEVFIuLi4gIEhtbS4uLi5cbiIpOworCQlpZiAoIVNYX0NSVFNDVFMgKHR0eSkpIHsKKwkJCXBvcnQgLT4gTVNWUiAmPSB+IE1TVlJfRFRSOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCQlzeF9vdXQoYnAsIENEMTg2eF9NU1ZSLCBwb3J0LT5NU1ZSICk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQl9IAorCQllbHNlCisJCQlkcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAiQ2FuJ3QgZHJvcCBEVFI6IG5vIERUUi5cbiIpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJLyogU2V0IERUUiBvbiAqLworCQlpZiAoIVNYX0NSVFNDVFMgKHR0eSkpIHsKKwkJCXBvcnQgLT5NU1ZSIHw9IE1TVlJfRFRSOworCQl9CisJfQorCQorCS8qCisJICogTm93IHdlIG11c3QgY2FsY3VsYXRlIHNvbWUgc3BlZWQgZGVwZW5kZWQgdGhpbmdzIAorCSAqLworCisJLyogU2V0IGJhdWQgcmF0ZSBmb3IgcG9ydCAqLworCXRtcCA9IHBvcnQtPmN1c3RvbV9kaXZpc29yIDsKKwlpZiAoIHRtcCApCisJCXByaW50ayAoS0VSTl9JTkZPICJzeCVkOiBVc2luZyBjdXN0b20gYmF1ZCByYXRlIGRpdmlzb3IgJWxkLiBcbiIKKwkJICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYW4gdW50ZXN0ZWQgb3B0aW9uLCBwbGVhc2UgYmUgY2FyZWZ1bGwuXG4iLAorCQkgICAgICAgICAgICAgICAgICBwb3J0X05vIChwb3J0KSwgdG1wKTsKKwllbHNlCisJCXRtcCA9ICgoKFNYX09TQ0ZSRVEgKyBiYXVkX3RhYmxlW2JhdWRdLzIpIC8gYmF1ZF90YWJsZVtiYXVkXSArCisJCSAgICAgICAgIENEMTg2eF9UUEMvMikgLyBDRDE4NnhfVFBDKTsKKworCWlmICgodG1wIDwgMHgxMCkgJiYgdGltZV9iZWZvcmUoYWdhaW4sIGppZmZpZXMpKSB7IAorCQlhZ2FpbiA9IGppZmZpZXMgKyBIWiAqIDYwOworCQkvKiBQYWdlIDQ4IG9mIHZlcnNpb24gMi4wIG9mIHRoZSBDTC1DRDE4NjUgZGF0YWJvb2sgKi8KKwkJaWYgKHRtcCA+PSAxMikgeworCQkJcHJpbnRrIChLRVJOX0lORk8gInN4JWQ6IEJhdWQgcmF0ZSBkaXZpc29yIGlzICVsZC4gXG4iCisJCQkgICAgICAgICJQZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpcyBwb3NzaWJsZS5cbiIKKwkJCSAgICAgICAgIlJlYWQgc3BlY2lhbGl4LnR4dCBmb3IgbW9yZSBpbmZvLlxuIiwKKwkJCSAgICAgICAgcG9ydF9ObyAocG9ydCksIHRtcCk7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAic3glZDogQmF1ZCByYXRlIGRpdmlzb3IgaXMgJWxkLiBcbiIKKwkJCSAgICAgICAgIldhcm5pbmc6IG92ZXJzdHJlc3NpbmcgQ2lycnVzIGNoaXAuICIKKwkJCSAgICAgICAgIlRoaXMgbWlnaHQgbm90IHdvcmsuXG4iCisJCQkgICAgICAgICJSZWFkIHNwZWNpYWxpeC50eHQgZm9yIG1vcmUgaW5mby5cbiIsIAorCQkJICAgICAgICBwb3J0X05vIChwb3J0KSwgdG1wKTsKKwkJfQorCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9SQlBSSCwgKHRtcCA+PiA4KSAmIDB4ZmYpOyAKKwlzeF9vdXQoYnAsIENEMTg2eF9UQlBSSCwgKHRtcCA+PiA4KSAmIDB4ZmYpOyAKKwlzeF9vdXQoYnAsIENEMTg2eF9SQlBSTCwgdG1wICYgMHhmZik7IAorCXN4X291dChicCwgQ0QxODZ4X1RCUFJMLCB0bXAgJiAweGZmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT5jdXN0b21fZGl2aXNvcikgeworCQliYXVkID0gKFNYX09TQ0ZSRVEgKyBwb3J0LT5jdXN0b21fZGl2aXNvci8yKSAvIHBvcnQtPmN1c3RvbV9kaXZpc29yOworCQliYXVkID0gKCBiYXVkICsgNSApIC8gMTA7CisJfSBlbHNlIAorCQliYXVkID0gKGJhdWRfdGFibGVbYmF1ZF0gKyA1KSAvIDEwOyAgIC8qIEVzdGltYXRlZCBDUFMgKi8KKworCS8qIFR3byB0aW1lciB0aWNrcyBzZWVtcyBlbm91Z2ggdG8gd2FrZXVwIHNvbWV0aGluZyBsaWtlIFNMSVAgZHJpdmVyICovCisJdG1wID0gKChiYXVkICsgSFovMikgLyBIWikgKiAyIC0gQ0QxODZ4X05GSUZPOwkJCisJcG9ydC0+d2FrZXVwX2NoYXJzID0gKHRtcCA8IDApID8gMCA6ICgodG1wID49IFNFUklBTF9YTUlUX1NJWkUpID8KKwkJCQkJICAgICAgU0VSSUFMX1hNSVRfU0laRSAtIDEgOiB0bXApOworCQorCS8qIFJlY2VpdmVyIHRpbWVvdXQgd2lsbCBiZSB0cmFuc21pc3Npb24gdGltZSBmb3IgMS41IGNoYXJzICovCisJdG1wID0gKFNQRUNJQUxJWF9UUFMgKyBTUEVDSUFMSVhfVFBTLzIgKyBiYXVkLzIpIC8gYmF1ZDsKKwl0bXAgPSAodG1wID4gMHhmZikgPyAweGZmIDogdG1wOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X1JUUFIsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKENfQ1NJWkUodHR5KSkgeworCSBjYXNlIENTNToKKwkJY29yMSB8PSBDT1IxXzVCSVRTOworCQlicmVhazsKKwkgY2FzZSBDUzY6CisJCWNvcjEgfD0gQ09SMV82QklUUzsKKwkJYnJlYWs7CisJIGNhc2UgQ1M3OgorCQljb3IxIHw9IENPUjFfN0JJVFM7CisJCWJyZWFrOworCSBjYXNlIENTODoKKwkJY29yMSB8PSBDT1IxXzhCSVRTOworCQlicmVhazsKKwl9CisJCisJaWYgKENfQ1NUT1BCKHR0eSkpIAorCQljb3IxIHw9IENPUjFfMlNCOworCQorCWNvcjEgfD0gQ09SMV9JR05PUkU7CisJaWYgKENfUEFSRU5CKHR0eSkpIHsKKwkJY29yMSB8PSBDT1IxX05PUk1QQVI7CisJCWlmIChDX1BBUk9ERCh0dHkpKSAKKwkJCWNvcjEgfD0gQ09SMV9PRERQOworCQlpZiAoSV9JTlBDSyh0dHkpKSAKKwkJCWNvcjEgJj0gfkNPUjFfSUdOT1JFOworCX0KKwkvKiBTZXQgbWFya2luZyBvZiBzb21lIGVycm9ycyAqLworCXBvcnQtPm1hcmtfbWFzayA9IFJDU1JfT0UgfCBSQ1NSX1RPVVQ7CisJaWYgKElfSU5QQ0sodHR5KSkgCisJCXBvcnQtPm1hcmtfbWFzayB8PSBSQ1NSX0ZFIHwgUkNTUl9QRTsKKwlpZiAoSV9CUktJTlQodHR5KSB8fCBJX1BBUk1SSyh0dHkpKSAKKwkJcG9ydC0+bWFya19tYXNrIHw9IFJDU1JfQlJFQUs7CisJaWYgKElfSUdOUEFSKHR0eSkpIAorCQlwb3J0LT5tYXJrX21hc2sgJj0gfihSQ1NSX0ZFIHwgUkNTUl9QRSk7CisJaWYgKElfSUdOQlJLKHR0eSkpIHsKKwkJcG9ydC0+bWFya19tYXNrICY9IH5SQ1NSX0JSRUFLOworCQlpZiAoSV9JR05QQVIodHR5KSkgCisJCQkvKiBSZWFsIHJhdyBtb2RlLiBJZ25vcmUgYWxsICovCisJCQlwb3J0LT5tYXJrX21hc2sgJj0gflJDU1JfT0U7CisJfQorCS8qIEVuYWJsZSBIYXJkd2FyZSBGbG93IENvbnRyb2wgKi8KKwlpZiAoQ19DUlRTQ1RTKHR0eSkpIHsKKyNpZmRlZiBTUEVDSUFMSVhfQlJBSU5fREFNQUdFRF9DVFMKKwkJcG9ydC0+SUVSIHw9IElFUl9EU1IgfCBJRVJfQ1RTOworCQltY29yMSB8PSBNQ09SMV9EU1JaRCB8IE1DT1IxX0NUU1pEOworCQltY29yMiB8PSBNQ09SMl9EU1JPRCB8IE1DT1IyX0NUU09EOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJdHR5LT5od19zdG9wcGVkID0gIShzeF9pbihicCwgQ0QxODZ4X01TVlIpICYgKE1TVlJfQ1RTfE1TVlJfRFNSKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisjZWxzZQorCQlwb3J0LT5DT1IyIHw9IENPUjJfQ1RTQUU7IAorI2VuZGlmCisJfQorCS8qIEVuYWJsZSBTb2Z0d2FyZSBGbG93IENvbnRyb2wuIEZJWE1FOiBJJ20gbm90IHN1cmUgYWJvdXQgdGhpcyAqLworCS8qIFNvbWUgcGVvcGxlIHJlcG9ydGVkIHRoYXQgaXQgd29ya3MsIGJ1dCBJIHN0aWxsIGRvdWJ0IGl0ICovCisJaWYgKElfSVhPTih0dHkpKSB7CisJCXBvcnQtPkNPUjIgfD0gQ09SMl9UWElCRTsKKwkJY29yMyB8PSAoQ09SM19GQ1QgfCBDT1IzX1NDREUpOworCQlpZiAoSV9JWEFOWSh0dHkpKQorCQkJcG9ydC0+Q09SMiB8PSBDT1IyX0lYTTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXN4X291dChicCwgQ0QxODZ4X1NDSFIxLCBTVEFSVF9DSEFSKHR0eSkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9TQ0hSMiwgU1RPUF9DSEFSKHR0eSkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9TQ0hSMywgU1RBUlRfQ0hBUih0dHkpKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfU0NIUjQsIFNUT1BfQ0hBUih0dHkpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwl9CisJaWYgKCFDX0NMT0NBTCh0dHkpKSB7CisJCS8qIEVuYWJsZSBDRCBjaGVjayAqLworCQlwb3J0LT5JRVIgfD0gSUVSX0NEOworCQltY29yMSB8PSBNQ09SMV9DRFpEOworCQltY29yMiB8PSBNQ09SMl9DRE9EOworCX0KKwkKKwlpZiAoQ19DUkVBRCh0dHkpKSAKKwkJLyogRW5hYmxlIHJlY2VpdmVyICovCisJCXBvcnQtPklFUiB8PSBJRVJfUlhEOworCQorCS8qIFNldCBpbnB1dCBGSUZPIHNpemUgKDEtOCBieXRlcykgKi8KKwljb3IzIHw9IHN4X3J4ZmlmbzsKKwkvKiBTZXR0aW5nIHVwIENEMTg2eCBjaGFubmVsIHJlZ2lzdGVycyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NPUjEsIGNvcjEpOworCXN4X291dChicCwgQ0QxODZ4X0NPUjIsIHBvcnQtPkNPUjIpOworCXN4X291dChicCwgQ0QxODZ4X0NPUjMsIGNvcjMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJLyogTWFrZSBDRDE4Nngga25vdyBhYm91dCByZWdpc3RlcnMgY2hhbmdlICovCisJc3hfd2FpdF9DQ1IoYnApOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX0NPUkNIRzEgfCBDQ1JfQ09SQ0hHMiB8IENDUl9DT1JDSEczKTsKKwkvKiBTZXR0aW5nIHVwIG1vZGVtIG9wdGlvbiByZWdpc3RlcnMgKi8KKwlkcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAiTWNvcjEgPSAlMDJ4LCBtY29yMiA9ICUwMnguXG4iLCBtY29yMSwgbWNvcjIpOworCXN4X291dChicCwgQ0QxODZ4X01DT1IxLCBtY29yMSk7CisJc3hfb3V0KGJwLCBDRDE4NnhfTUNPUjIsIG1jb3IyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCS8qIEVuYWJsZSBDRDE4NnggdHJhbnNtaXR0ZXIgJiByZWNlaXZlciAqLworCXN4X3dhaXRfQ0NSKGJwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9UWEVOIHwgQ0NSX1JYRU4pOworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCS8qIEFuZCBmaW5hbGx5IHNldCB0aGUgbW9kZW0gbGluZXMuLi4gKi8KKwlzeF9vdXQoYnAsIENEMTg2eF9NU1ZSLCBwb3J0LT5NU1ZSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgc3hfc2V0dXBfcG9ydChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCwgc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCWlmICghcG9ydC0+eG1pdF9idWYpIHsKKwkJLyogV2UgbWF5IHNsZWVwIGluIGdldF96ZXJvZWRfcGFnZSgpICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkKKwkJaWYgKCEodG1wID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSkgeworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKHRtcCk7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwkJcG9ydC0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSB0bXA7CisJfQorCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHBvcnQtPnR0eSkgCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZwb3J0LT50dHktPmZsYWdzKTsKKworCXBvcnQtPnhtaXRfY250ID0gcG9ydC0+eG1pdF9oZWFkID0gcG9ydC0+eG1pdF90YWlsID0gMDsKKwlzeF9jaGFuZ2Vfc3BlZWQoYnAsIHBvcnQpOworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJCQorCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworc3RhdGljIHZvaWQgc3hfc2h1dGRvd25fcG9ydChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCwgc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19GSUZPKSB7CisJCWRwcmludGsoU1hfREVCVUdfRklGTywgInN4JWQ6IHBvcnQgJWQ6ICVsZCBvdmVycnVucywgRklGTyBoaXRzIFsgIiwKKwkJCWJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+b3ZlcnJ1bik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlkcHJpbnRrKFNYX0RFQlVHX0ZJRk8sICIlbGQgIiwgcG9ydC0+aGl0c1tpXSk7CisJCX0KKwkJZHByaW50ayhTWF9ERUJVR19GSUZPLCAiXS5cbiIpOworCX0KKworCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCS8qIFNlbGVjdCBwb3J0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKworCWlmICghKHR0eSA9IHBvcnQtPnR0eSkgfHwgQ19IVVBDTCh0dHkpKSB7CisJCS8qIERyb3AgRFRSICovCisJCXN4X291dChicCwgQ0QxODZ4X01TVkRUUiwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJLyogUmVzZXQgcG9ydCAqLworCXN4X3dhaXRfQ0NSKGJwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9TT0ZUUkVTRVQpOworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQgKi8KKwlwb3J0LT5JRVIgPSAwOworCXN4X291dChicCwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmICh0dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCQorCWlmICghYnAtPmNvdW50KSAKKwkJc3hfc2h1dGRvd25fYm9hcmQoYnApOworCWZ1bmNfZXhpdCgpOworfQorCisJCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgIGN1cnJlbnQpOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlpbnQgICAgcmV0dmFsOworCWludCAgICBkb19jbG9jYWwgPSAwOworCWludCAgICBDRDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgcG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnQtPmNsb3NlX3dhaXQpOworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCQorCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKENfQ0xPQ0FMKHR0eSkpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKgorCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisJICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlwb3J0LT5jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcG9ydC0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCUNEID0gc3hfaW4oYnAsIENEMTg2eF9NU1ZSKSAmIE1TVlJfQ0Q7CisJCWlmIChTWF9DUlRTQ1RTICh0dHkpKSB7CisJCQkvKiBBY3RpdmF0ZSBSVFMgKi8KKwkJCXBvcnQtPk1TVlIgfD0gTVNWUl9EVFI7CQkvKiBXVEY/ICovCisJCQlzeF9vdXQgKGJwLCBDRDE4NnhfTVNWUiwgcG9ydC0+TVNWUik7CisJCX0gZWxzZSB7CisJCQkvKiBBY3RpdmF0ZSBEVFIgKi8KKwkJCXBvcnQtPk1TVlIgfD0gTVNWUl9EVFI7CisJCQlzeF9vdXQgKGJwLCBDRDE4NnhfTVNWUiwgcG9ydC0+TVNWUik7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgorCQkgICAgKGRvX2Nsb2NhbCB8fCBDRCkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXBvcnQtPmNvdW50Kys7CisJfQorCXBvcnQtPmJsb2NrZWRfb3Blbi0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmV0dmFsKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CQorCisKK3N0YXRpYyBpbnQgc3hfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWludCBib2FyZDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogcG9ydDsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWJvYXJkID0gU1hfQk9BUkQodHR5LT5pbmRleCk7CisKKwlpZiAoYm9hcmQgPj0gU1hfTkJPQVJEIHx8ICEoc3hfYm9hcmRbYm9hcmRdLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwlicCA9ICZzeF9ib2FyZFtib2FyZF07CisJcG9ydCA9IHN4X3BvcnQgKyBib2FyZCAqIFNYX05QT1JUICsgU1hfUE9SVCh0dHktPmluZGV4KTsKKwlwb3J0LT5vdmVycnVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJcG9ydC0+aGl0c1tpXT0wOworCisJZHByaW50ayAoU1hfREVCVUdfT1BFTiwgIkJvYXJkID0gJWQsIGJwID0gJXAsIHBvcnQgPSAlcCwgcG9ydG5vID0gJWQuXG4iLAorCSAgICAgICAgYm9hcmQsIGJwLCBwb3J0LCBTWF9QT1JUKHR0eS0+aW5kZXgpKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9vcGVuIikpIHsKKwkJZnVuY19lbnRlcigpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGVycm9yID0gc3hfc2V0dXBfYm9hcmQoYnApKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPmNvdW50Kys7CisJYnAtPmNvdW50Kys7CisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7CisJcG9ydC0+dHR5ID0gdHR5OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoKGVycm9yID0gc3hfc2V0dXBfcG9ydChicCwgcG9ydCkpKSB7CisJCWZ1bmNfZW50ZXIoKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkKKwlpZiAoKGVycm9yID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgcG9ydCkpKSB7CisJCWZ1bmNfZW50ZXIoKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHN4X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCQorCWZ1bmNfZW50ZXIoKTsKKwlpZiAoIXBvcnQgfHwgc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiY2xvc2UiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChwb3J0LT5jb3VudCAhPSAxKSkgeworCQlwcmludGsoS0VSTl9FUlIgInN4JWQ6IHN4X2Nsb3NlOiBiYWQgcG9ydCBjb3VudDsiCisJCSAgICAgICAiIHR0eS0+Y291bnQgaXMgMSwgcG9ydCBjb3VudCBpcyAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDE7CisJfQorCisJaWYgKHBvcnQtPmNvdW50ID4gMSkgeworCQlwb3J0LT5jb3VudC0tOworCQlicC0+Y291bnQtLTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5IAorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJZHByaW50ayAoU1hfREVCVUdfT1BFTiwgIkNsb3NpbmdcbiIpOworCWlmIChwb3J0LT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpIHsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHBvcnQtPmNsb3Npbmdfd2FpdCk7CisJfQorCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCisJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKKwkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQorCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCWRwcmludGsgKFNYX0RFQlVHX09QRU4sICJDbG9zZWRcbiIpOworCXBvcnQtPklFUiAmPSB+SUVSX1JYRDsKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJcG9ydC0+SUVSIHw9IElFUl9UWEVNUFRZOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkJICovCisJCXRpbWVvdXQgPSBqaWZmaWVzK0haOworCQl3aGlsZShwb3J0LT5JRVIgJiBJRVJfVFhFTVBUWSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPnRpbWVvdXQpKTsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gIlRpbWVvdXQgd2FpdGluZyBmb3IgY2xvc2VcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAoLS1icC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3glZDogc3hfc2h1dGRvd25fcG9ydDogYmFkIGJvYXJkIGNvdW50OiAlZCBwb3J0OiAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgYnAtPmNvdW50LCB0dHktPmluZGV4KTsKKwkJYnAtPmNvdW50ID0gMDsKKwl9CisJaWYgKC0tcG9ydC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3glZDogc3hfY2xvc2U6IGJhZCBwb3J0IGNvdW50IGZvciB0dHklZDogJWRcbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCksIHBvcnQtPmNvdW50KTsKKwkJcG9ydC0+Y291bnQgPSAwOworCX0KKworCXN4X3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl0dHktPmNsb3NpbmcgPSAwOworCXBvcnQtPmV2ZW50ID0gMDsKKwlwb3J0LT50dHkgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChwb3J0LT5jbG9zZV9kZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2Vjcyhwb3J0LT5jbG9zZV9kZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwl9CisJcG9ydC0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Y2xvc2Vfd2FpdCk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaW50IHN4X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJaW50IGMsIHRvdGFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF93cml0ZSIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwl9CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCisJaWYgKCF0dHkgfHwgIXBvcnQtPnhtaXRfYnVmIHx8ICF0bXBfYnVmKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDEsCisJCQkJICAgU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfaGVhZCkpOworCQlpZiAoYyA8PSAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkocG9ydC0+eG1pdF9idWYgKyBwb3J0LT54bWl0X2hlYWQsIGJ1ZiwgYyk7CisJCXBvcnQtPnhtaXRfaGVhZCA9IChwb3J0LT54bWl0X2hlYWQgKyBjKSAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQlwb3J0LT54bWl0X2NudCArPSBjOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXRvdGFsICs9IGM7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCAmJgorCSAgICAhKHBvcnQtPklFUiAmIElFUl9UWFJEWSkpIHsKKwkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWZ1bmNfZXhpdCgpOworCisJcmV0dXJuIHRvdGFsOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicDsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9wdXRfY2hhciIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCWRwcmludGsgKFNYX0RFQlVHX1RYLCAiY2hlY2sgdHR5OiAlcCAlcFxuIiwgdHR5LCBwb3J0LT54bWl0X2J1Zik7CisJaWYgKCF0dHkgfHwgIXBvcnQtPnhtaXRfYnVmKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJZHByaW50ayAoU1hfREVCVUdfVFgsICJ4bWl0X2NudDogJWQgeG1pdF9idWY6ICVwXG4iLCBwb3J0LT54bWl0X2NudCwgcG9ydC0+eG1pdF9idWYpOworCWlmICgocG9ydC0+eG1pdF9jbnQgPj0gU0VSSUFMX1hNSVRfU0laRSAtIDEpIHx8ICghcG9ydC0+eG1pdF9idWYpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJZHByaW50ayAoU1hfREVCVUdfVFgsICJFeGl0IHNpemVcbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwlkcHJpbnRrIChTWF9ERUJVR19UWCwgIkhhbmRsZSB4bWl0OiAlcCAlcFxuIiwgcG9ydCwgcG9ydC0+eG1pdF9idWYpOworCXBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfaGVhZCsrXSA9IGNoOworCXBvcnQtPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKwlwb3J0LT54bWl0X2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicCA9IHBvcnRfQm9hcmQocG9ydCk7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfZmx1c2hfY2hhcnMiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8CisJICAgICFwb3J0LT54bWl0X2J1ZikgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCXN4X291dChwb3J0X0JvYXJkKHBvcnQpLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzeF9vdXQocG9ydF9Cb2FyZChwb3J0KSwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIGludCBzeF93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlyZXQ7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfd3JpdGVfcm9vbSIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCisJZnVuY19leGl0KCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHN4X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisJZnVuY19lbnRlcigpOworCQorCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9jaGFyc19pbl9idWZmZXIiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDA7CisJfQorCWZ1bmNfZXhpdCgpOworCXJldHVybiBwb3J0LT54bWl0X2NudDsKK30KKworCitzdGF0aWMgdm9pZCBzeF9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnA7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfZmx1c2hfYnVmZmVyIikpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXR0eV93YWtldXAodHR5KTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyBpbnQgc3hfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzdGF0dXMgPSBzeF9pbihicCwgQ0QxODZ4X01TVlIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIkdvdCBtc3ZyWyVkXSA9ICUwMngsIGNhciA9ICVkLlxuIiwKKwkJcG9ydF9Obyhwb3J0KSwgc3RhdHVzLCBzeF9pbiAoYnAsIENEMTg2eF9DQVIpKTsKKwlkcHJpbnRrIChTWF9ERUJVR19JTklULCAic3hfcG9ydCA9ICVwLCBwb3J0ID0gJXBcbiIsIHN4X3BvcnQsIHBvcnQpOworCWlmIChTWF9DUlRTQ1RTKHBvcnQtPnR0eSkpIHsKKwkJcmVzdWx0ICA9IC8qICAgKHN0YXR1cyAmIE1TVlJfUlRTKSA/ICovIFRJT0NNX0RUUiAvKiA6IDApICovIAorCQkgICAgICAgICAgfCAgICgoc3RhdHVzICYgTVNWUl9EVFIpID8gVElPQ01fUlRTIDogMCkKKwkJICAgICAgICAgIHwgICAoKHN0YXR1cyAmIE1TVlJfQ0QpICA/IFRJT0NNX0NBUiA6IDApCisJCSAgICAgICAgICB8LyogKChzdGF0dXMgJiBNU1ZSX0RTUikgPyAqLyBUSU9DTV9EU1IgLyogOiAwKSAqLworCQkgICAgICAgICAgfCAgICgoc3RhdHVzICYgTVNWUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ICA9IC8qICAgKHN0YXR1cyAmIE1TVlJfUlRTKSA/ICovIFRJT0NNX1JUUyAvKiA6IDApICovIAorCQkgICAgICAgICAgfCAgICgoc3RhdHVzICYgTVNWUl9EVFIpID8gVElPQ01fRFRSIDogMCkKKwkJICAgICAgICAgIHwgICAoKHN0YXR1cyAmIE1TVlJfQ0QpICA/IFRJT0NNX0NBUiA6IDApCisJCSAgICAgICAgICB8LyogKChzdGF0dXMgJiBNU1ZSX0RTUikgPyAqLyBUSU9DTV9EU1IgLyogOiAwKSAqLworCQkgICAgICAgICAgfCAgICgoc3RhdHVzICYgTVNWUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7CisJfQorCisJZnVuY19leGl0KCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgc3hfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicDsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisgICAvKglpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwb3J0LT5NU1ZSIHw9IE1TVlJfUlRTOyAqLworICAgLyogICBpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlwb3J0LT5NU1ZSIHw9IE1TVlJfRFRSOyAqLworCisJaWYgKFNYX0NSVFNDVFMocG9ydC0+dHR5KSkgeworCQlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQkJcG9ydC0+TVNWUiB8PSBNU1ZSX0RUUjsKKwl9IGVsc2UgeworCQlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQkJcG9ydC0+TVNWUiB8PSBNU1ZSX0RUUjsKKwl9CisKKyAgLyoJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlwb3J0LT5NU1ZSICY9IH5NU1ZSX1JUUzsgKi8KKyAgLyogICAgaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlwb3J0LT5NU1ZSICY9IH5NU1ZSX0RUUjsgKi8KKwlpZiAoU1hfQ1JUU0NUUyhwb3J0LT50dHkpKSB7CisJCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJCXBvcnQtPk1TVlIgJj0gfk1TVlJfRFRSOworCX0gZWxzZSB7CisJCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJCXBvcnQtPk1TVlIgJj0gfk1TVlJfRFRSOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXN4X291dChicCwgQ0QxODZ4X01TVlIsIHBvcnQtPk1TVlIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9zZW5kX2JyZWFrKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqIHBvcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWZ1bmNfZW50ZXIoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPmJyZWFrX2xlbmd0aCA9IFNQRUNJQUxJWF9UUFMgLyBIWiAqIGxlbmd0aDsKKwlwb3J0LT5DT1IyIHw9IENPUjJfRVRDOworCXBvcnQtPklFUiAgfD0gSUVSX1RYUkRZOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ09SMiwgcG9ydC0+Q09SMik7CisJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlzeF93YWl0X0NDUihicCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0NSLCBDQ1JfQ09SQ0hHMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF93YWl0X0NDUihicCk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBzeF9zZXRfc2VyaWFsX2luZm8oc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaW50IGNoYW5nZV9zcGVlZDsKKworCWZ1bmNfZW50ZXIoKTsKKwkvKgorCWVycm9yID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1JFQUQsICh2b2lkICopIG5ld2luZm8sIHNpemVvZih0bXApKTsKKwlpZiAoZXJyb3IpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgbmV3aW5mbywgc2l6ZW9mKHRtcCkpKSB7CisJCWZ1bmNfZW50ZXIoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorI2lmIDAJCisJaWYgKCh0bXAuaXJxICE9IGJwLT5pcnEpIHx8CisJICAgICh0bXAucG9ydCAhPSBicC0+YmFzZSkgfHwKKwkgICAgKHRtcC50eXBlICE9IFBPUlRfQ0lSUlVTKSB8fAorCSAgICAodG1wLmJhdWRfYmFzZSAhPSAoU1hfT1NDRlJFUSArIENEMTg2eF9UUEMvMikgLyBDRDE4NnhfVFBDKSB8fAorCSAgICAodG1wLmN1c3RvbV9kaXZpc29yICE9IDApIHx8CisJICAgICh0bXAueG1pdF9maWZvX3NpemUgIT0gQ0QxODZ4X05GSUZPKSB8fAorCSAgICAodG1wLmZsYWdzICYgflNQRUNJQUxJWF9MRUdBTF9GTEFHUykpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbmRpZgkKKworCWNoYW5nZV9zcGVlZCA9ICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KKwkJCSh0bXAuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpOworCWNoYW5nZV9zcGVlZCB8PSAodG1wLmN1c3RvbV9kaXZpc29yICE9IHBvcnQtPmN1c3RvbV9kaXZpc29yKTsKKwkKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKCh0bXAuY2xvc2VfZGVsYXkgIT0gcG9ydC0+Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAodG1wLmNsb3Npbmdfd2FpdCAhPSBwb3J0LT5jbG9zaW5nX3dhaXQpIHx8CisJCSAgICAoKHRtcC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkgeworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkgICAgICAgICAgICAgICAgICAodG1wLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwkJcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgPSB0bXAuY3VzdG9tX2Rpdmlzb3I7CisJfSBlbHNlIHsKKwkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCSAgICAgICAgICAgICAgICAgICh0bXAuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOworCQlwb3J0LT5jbG9zZV9kZWxheSA9IHRtcC5jbG9zZV9kZWxheTsKKwkJcG9ydC0+Y2xvc2luZ193YWl0ID0gdG1wLmNsb3Npbmdfd2FpdDsKKwkJcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgPSB0bXAuY3VzdG9tX2Rpdmlzb3I7CisJfQorCWlmIChjaGFuZ2Vfc3BlZWQpIHsKKwkJc3hfY2hhbmdlX3NwZWVkKGJwLCBwb3J0KTsKKwl9CisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgc3hfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqIHBvcnQsCisJCQkJICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkvLwlpbnQgZXJyb3I7CisJCisJZnVuY19lbnRlcigpOworCisJLyoKKwllcnJvciA9IHZlcmlmeV9hcmVhKFZFUklGWV9XUklURSwgKHZvaWQgKikgcmV0aW5mbywgc2l6ZW9mKHRtcCkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCSovCisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC50eXBlID0gUE9SVF9DSVJSVVM7CisJdG1wLmxpbmUgPSBwb3J0IC0gc3hfcG9ydDsKKwl0bXAucG9ydCA9IGJwLT5iYXNlOworCXRtcC5pcnEgID0gYnAtPmlycTsKKwl0bXAuZmxhZ3MgPSBwb3J0LT5mbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gKFNYX09TQ0ZSRVEgKyBDRDE4NnhfVFBDLzIpIC8gQ0QxODZ4X1RQQzsKKwl0bXAuY2xvc2VfZGVsYXkgPSBwb3J0LT5jbG9zZV9kZWxheSAqIEhaLzEwMDsKKwl0bXAuY2xvc2luZ193YWl0ID0gcG9ydC0+Y2xvc2luZ193YWl0ICogSFovMTAwOworCXRtcC5jdXN0b21fZGl2aXNvciA9ICBwb3J0LT5jdXN0b21fZGl2aXNvcjsKKwl0bXAueG1pdF9maWZvX3NpemUgPSBDRDE4NnhfTkZJRk87CisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YodG1wKSkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3hfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwgCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCWludCByZXR2YWw7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfaW9jdGwiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCXN3aXRjaCAoY21kKSB7CisJIGNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlpZiAoIWFyZykKKwkJCXN4X3NlbmRfYnJlYWsocG9ydCwgSFovNCk7CS8qIDEvNCBzZWNvbmQgKi8KKwkJcmV0dXJuIDA7CisJIGNhc2UgVENTQlJLUDoJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCXN4X3NlbmRfYnJlYWsocG9ydCwgYXJnID8gYXJnKihIWi8xMCkgOiBIWi80KTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAwOworCSBjYXNlIFRJT0NHU09GVENBUjoKKwkJIGlmIChwdXRfdXNlcihDX0NMT0NBTCh0dHkpPzE6MCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCkpIHsKKwkJCSBmdW5jX2V4aXQoKTsKKwkJCSByZXR1cm4gLUVGQVVMVDsKKwkJIH0KKwkJIGZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwkgY2FzZSBUSU9DU1NPRlRDQVI6CisJCSBpZiAoZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpIHsKKwkJCSBmdW5jX2V4aXQoKTsKKwkJCSByZXR1cm4gLUVGQVVMVDsKKwkJIH0KKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKwkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAwOworCSBjYXNlIFRJT0NHU0VSSUFMOgorCQkgZnVuY19leGl0KCk7CisJCXJldHVybiBzeF9nZXRfc2VyaWFsX2luZm8ocG9ydCwgYXJncCk7CisJIGNhc2UgVElPQ1NTRVJJQUw6CQorCQkgZnVuY19leGl0KCk7CisJCXJldHVybiBzeF9zZXRfc2VyaWFsX2luZm8ocG9ydCwgYXJncCk7CisJIGRlZmF1bHQ6CisJCSBmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc3hfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF90aHJvdHRsZSIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwkvKiBVc2UgRFRSIGluc3RlYWQgb2YgUlRTICEgKi8KKwlpZiAoU1hfQ1JUU0NUUyAodHR5KSkgCisJCXBvcnQtPk1TVlIgJj0gfk1TVlJfRFRSOworCWVsc2UgeworCQkvKiBBdWNoISEhIEkgdGhpbmsgdGhlIHN5c3RlbSBzaG91bGRuJ3QgY2FsbCB0aGlzIHRoZW4uICovCisJCS8qIE9yIG1heWJlIHdlJ3JlIHN1cHBvc2VkIChhbGxvd2VkPykgdG8gZG8gb3VyIHNpZGUgb2YgaHcKKwkJICAgaGFuZHNoYWtlIGFueXdheSwgZXZlbiB3aGVuIGhhcmR3YXJlIGhhbmRzaGFrZSBpcyBvZmYuIAorCQkgICBXaGVuIHlvdSBzZWUgdGhpcyBpbiB5b3VyIGxvZ3MsIHBsZWFzZSByZXBvcnQuLi4uICovCisJCXByaW50ayAoS0VSTl9FUlIgInN4JWQ6IE5lZWQgdG8gdGhyb3R0bGUsIGJ1dCBjYW4ndCAoaGFyZHdhcmUgaHMgaXMgb2ZmKVxuIiwKKwkgICAgICAgICAgICAgICAgIHBvcnRfTm8gKHBvcnQpKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc3hfd2FpdF9DQ1IoYnApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0NSLCBDQ1JfU1NDSDIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzeF93YWl0X0NDUihicCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X01TVlIsIHBvcnQtPk1TVlIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBzeF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisJCQkJCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X3VudGhyb3R0bGUiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkvKiBYWFhYIFVzZSBEVFIgSU5TVEVBRD8/Pz8gKi8KKwlpZiAoU1hfQ1JUU0NUUyh0dHkpKSB7CisJCXBvcnQtPk1TVlIgfD0gTVNWUl9EVFI7CisJfSAvKiBFbHNlIGNsYXVzZTogc2VlIHJlbWFyayBpbiAic3hfdGhyb3R0bGUiLi4uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCQlzeF93YWl0X0NDUihicCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9TU0NIMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXN4X3dhaXRfQ0NSKGJwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfTVNWUiwgcG9ydC0+TVNWUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBzeF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisJCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X3N0b3AiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKworCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKwkJCQkKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfc3RhcnQiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+eG1pdF9jbnQgJiYgcG9ydC0+eG1pdF9idWYgJiYgIShwb3J0LT5JRVIgJiBJRVJfVFhSRFkpKSB7CisJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIHdvcmstcXVldWUgd2hlbiB0aGUgaW50ZXJydXB0CisgKiByb3V0aW5lIGhhcyBzaWduYWxsZWQgdGhhdCBhIGhhbmd1cCBoYXMgb2NjdXJyZWQuICBUaGUgcGF0aCBvZgorICogaGFuZ3VwIHByb2Nlc3NpbmcgaXM6CisgKgorICogCXNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZSAtPiAod29ya3F1ZXVlKSAtPgorICogCWRvX3N4X2hhbmd1cCgpIC0+IHR0eS0+aGFuZ3VwKCkgLT4gc3hfaGFuZ3VwKCkKKyAqIAorICovCitzdGF0aWMgdm9pZCBkb19zeF9oYW5ndXAodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0CSpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCQorCWZ1bmNfZW50ZXIoKTsKKworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7CS8qIEZJWE1FOiBtb2R1bGUgcmVtb3ZhbCByYWNlIGhlcmUgKi8KKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X2hhbmd1cCIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzeF9zaHV0ZG93bl9wb3J0KGJwLCBwb3J0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPmV2ZW50ID0gMDsKKwlicC0+Y291bnQgLT0gcG9ydC0+Y291bnQ7CisJaWYgKGJwLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBzeF9oYW5ndXA6IGJhZCBib2FyZCBjb3VudDogJWQgcG9ydDogJWRcbiIsCisJCQlib2FyZF9ObyhicCksIGJwLT5jb3VudCwgdHR5LT5pbmRleCk7CisJCWJwLT5jb3VudCA9IDA7CisJfQorCXBvcnQtPmNvdW50ID0gMDsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlwb3J0LT50dHkgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBzeF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnA7CisJCQkJCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X3NldF90ZXJtaW9zIikpCisJCXJldHVybjsKKwkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKKwkJcmV0dXJuOworCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJc3hfY2hhbmdlX3NwZWVkKHBvcnRfQm9hcmQocG9ydCksIHBvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCXN4X3N0YXJ0KHR0eSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0CSpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCisJZnVuY19lbnRlcigpOworCisJaWYoISh0dHkgPSBwb3J0LT50dHkpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSU19FVkVOVF9XUklURV9XQUtFVVAsICZwb3J0LT5ldmVudCkpIHsKKyAJCXR0eV93YWtldXAodHR5KTsKKwkJLy93YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJfQorCisJZnVuY19leGl0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc3hfb3BzID0geworCS5vcGVuICA9IHN4X29wZW4sCisJLmNsb3NlID0gc3hfY2xvc2UsCisJLndyaXRlID0gc3hfd3JpdGUsCisJLnB1dF9jaGFyID0gc3hfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gc3hfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBzeF93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBzeF9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IHN4X2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBzeF9pb2N0bCwKKwkudGhyb3R0bGUgPSBzeF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHN4X3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gc3hfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBzeF9zdG9wLAorCS5zdGFydCA9IHN4X3N0YXJ0LAorCS5oYW5ndXAgPSBzeF9oYW5ndXAsCisJLnRpb2NtZ2V0ID0gc3hfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gc3hfdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IHN4X2luaXRfZHJpdmVycyh2b2lkKQoreworCWludCBlcnJvcjsKKwlpbnQgaTsKKworCWZ1bmNfZW50ZXIoKTsKKworCXNwZWNpYWxpeF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKFNYX05CT0FSRCAqIFNYX05QT1JUKTsKKwlpZiAoIXNwZWNpYWxpeF9kcml2ZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeDogQ291bGRuJ3QgYWxsb2NhdGUgdHR5X2RyaXZlci5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWlmICghKHRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3g6IENvdWxkbid0IGdldCBmcmVlIHBhZ2UuXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIoc3BlY2lhbGl4X2RyaXZlcik7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMTsKKwl9CisJc3BlY2lhbGl4X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzcGVjaWFsaXhfZHJpdmVyLT5uYW1lID0gInR0eVciOworCXNwZWNpYWxpeF9kcml2ZXItPm1ham9yID0gU1BFQ0lBTElYX05PUk1BTF9NQUpPUjsKKwlzcGVjaWFsaXhfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlzcGVjaWFsaXhfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXNwZWNpYWxpeF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlzcGVjaWFsaXhfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzcGVjaWFsaXhfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHNwZWNpYWxpeF9kcml2ZXIsICZzeF9vcHMpOworCisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3BlY2lhbGl4X2RyaXZlcikpKSB7CisJCXB1dF90dHlfZHJpdmVyKHNwZWNpYWxpeF9kcml2ZXIpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXByaW50ayhLRVJOX0VSUiAic3g6IENvdWxkbid0IHJlZ2lzdGVyIHNwZWNpYWxpeCBJTzgrIGRyaXZlciwgZXJyb3IgPSAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoc3hfcG9ydCwgMCwgc2l6ZW9mKHN4X3BvcnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1hfTlBPUlQgKiBTWF9OQk9BUkQ7IGkrKykgeworCQlzeF9wb3J0W2ldLm1hZ2ljID0gU1BFQ0lBTElYX01BR0lDOworCQlJTklUX1dPUksoJnN4X3BvcnRbaV0udHF1ZXVlLCBkb19zb2Z0aW50LCAmc3hfcG9ydFtpXSk7CisJCUlOSVRfV09SSygmc3hfcG9ydFtpXS50cXVldWVfaGFuZ3VwLCBkb19zeF9oYW5ndXAsICZzeF9wb3J0W2ldKTsKKwkJc3hfcG9ydFtpXS5jbG9zZV9kZWxheSA9IDUwICogSFovMTAwOworCQlzeF9wb3J0W2ldLmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN4X3BvcnRbaV0ub3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3hfcG9ydFtpXS5jbG9zZV93YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnN4X3BvcnRbaV0ubG9jayk7CisJfQorCQorCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeF9yZWxlYXNlX2RyaXZlcnModm9pZCkKK3sKKwlmdW5jX2VudGVyKCk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNwZWNpYWxpeF9kcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKHNwZWNpYWxpeF9kcml2ZXIpOworCWZ1bmNfZXhpdCgpOworfQorCisvKiAKKyAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBieSBrZXJuZWwgYXQgYm9vdCB0aW1lIAorICovCitzdGF0aWMgaW50IF9faW5pdCBzcGVjaWFsaXhfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCBmb3VuZCA9IDA7CisKKwlmdW5jX2VudGVyKCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzeDogU3BlY2lhbGl4IElPOCsgZHJpdmVyIHYiIFZFUlNJT04gIiwgKGMpIFIuRS5Xb2xmZiAxOTk3LzE5OTguXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJzeDogZGVyaXZlZCBmcm9tIHdvcmsgKGMpIEQuR29yb2RjaGFuaW4gMTk5NC0xOTk2LlxuIik7CisjaWZkZWYgQ09ORklHX1NQRUNJQUxJWF9SVFNDVFMKKwlwcmludGsgKEtFUk5fSU5GTyAic3g6IERUUi9SVFMgcGluIGlzIGFsd2F5cyBSVFMuXG4iKTsKKyNlbHNlCisJcHJpbnRrIChLRVJOX0lORk8gInN4OiBEVFIvUlRTIHBpbiBpcyBSVFMgd2hlbiBDUlRTQ1RTIGlzIG9uLlxuIik7CisjZW5kaWYKKwkKKwlmb3IgKGkgPSAwOyBpIDwgU1hfTkJPQVJEOyBpKyspCisJCXN4X2JvYXJkW2ldLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKKwlpZiAoc3hfaW5pdF9kcml2ZXJzKCkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkQ7IGkrKykgCisJCWlmIChzeF9ib2FyZFtpXS5iYXNlICYmICFzeF9wcm9iZSgmc3hfYm9hcmRbaV0pKQorCQkJZm91bmQrKzsKKworI2lmZGVmIENPTkZJR19QQ0kKKwl7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworCQlpPTA7CisJCXdoaWxlIChpIDwgU1hfTkJPQVJEKSB7CisJCQlpZiAoc3hfYm9hcmRbaV0uZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSB7CisJCQkJaSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGRldiA9IHBjaV9maW5kX2RldmljZSAoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfSU84LCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYpOworCQkJaWYgKCFwZGV2KSBicmVhazsKKworCQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQkJCWNvbnRpbnVlOworCisJCQlzeF9ib2FyZFtpXS5pcnEgPSBwZGV2LT5pcnE7CisKKwkJCXN4X2JvYXJkW2ldLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpOworCisJCQlzeF9ib2FyZFtpXS5mbGFncyB8PSBTWF9CT0FSRF9JU19QQ0k7CisJCQlpZiAoIXN4X3Byb2JlKCZzeF9ib2FyZFtpXSkpCisJCQkJZm91bmQgKys7CisJCX0KKwl9CisjZW5kaWYKKworCWlmICghZm91bmQpIHsKKwkJc3hfcmVsZWFzZV9kcml2ZXJzKCk7CisJCXByaW50ayhLRVJOX0lORk8gInN4OiBObyBzcGVjaWFsaXggSU84KyBib2FyZHMgZGV0ZWN0ZWQuXG4iKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvYmFzZVtTWF9OQk9BUkRdICA9IHswLH07CisKK3N0YXRpYyBpbnQgaXJxIFtTWF9OQk9BUkRdID0gezAsfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvYmFzZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oc3hfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3hfcnhmaWZvLCBpbnQsIDApOworI2lmZGVmIFNQRUNJQUxJWF9USU1FUgorbW9kdWxlX3BhcmFtKHN4X3BvbGwsIGludCwgMCk7CisjZW5kaWYKKworLyoKKyAqIFlvdSBjYW4gc2V0dXAgdXAgdG8gNCBib2FyZHMuCisgKiBieSBzcGVjaWZ5aW5nICJpb2Jhc2U9MHhYWFgsMHhYWFggLi4uIiBhcyBpbnNtb2QgcGFyYW1ldGVyLgorICogWW91IHNob3VsZCBzcGVjaWZ5IHRoZSBJUlFzIHRvbyBpbiB0aGF0IGNhc2UgImlycT0uLi4uLC4uLiIuIAorICogCisgKiBNb3JlIHRoYW4gNCBib2FyZHMgaW4gb25lIGNvbXB1dGVyIGlzIG5vdCBwb3NzaWJsZSwgYXMgdGhlIGNhcmQgY2FuCisgKiBvbmx5IHVzZSA0IGRpZmZlcmVudCBpbnRlcnJ1cHRzLiAKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNwZWNpYWxpeF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCBpOworCisJZnVuY19lbnRlcigpOworCisJaW5pdF9NVVRFWCgmdG1wX2J1Zl9zZW0pOyAvKiBJbml0IGRlIHRoZSBzZW1hcGhvcmUgLSBwdmRsICovCisKKwlpZiAoaW9iYXNlWzBdIHx8IGlvYmFzZVsxXSB8fCBpb2Jhc2VbMl0gfHwgaW9iYXNlWzNdKSB7CisJCWZvcihpID0gMDsgaSA8IFNYX05CT0FSRDsgaSsrKSB7CisJCQlzeF9ib2FyZFtpXS5iYXNlID0gaW9iYXNlW2ldOworCQkJc3hfYm9hcmRbaV0uaXJxID0gaXJxW2ldOworCQkJc3hfYm9hcmRbaV0uY291bnQ9IDA7CisJCX0KKwl9CisKKwlmdW5jX2V4aXQoKTsKKworCXJldHVybiBzcGVjaWFsaXhfaW5pdCgpOworfQorCQorc3RhdGljIHZvaWQgX19leGl0IHNwZWNpYWxpeF9leGl0X21vZHVsZSh2b2lkKQoreworCWludCBpOworCQorCWZ1bmNfZW50ZXIoKTsKKworCXN4X3JlbGVhc2VfZHJpdmVycygpOworCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkQ7IGkrKykKKwkJaWYgKHN4X2JvYXJkW2ldLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkgCisJCQlzeF9yZWxlYXNlX2lvX3JhbmdlKCZzeF9ib2FyZFtpXSk7CisjaWZkZWYgU1BFQ0lBTElYX1RJTUVSCisJZGVsX3RpbWVyICgmbWlzc2VkX2lycV90aW1lcik7CisjZW5kaWYKKworCWZ1bmNfZXhpdCgpOworfQorCittb2R1bGVfaW5pdChzcGVjaWFsaXhfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc3BlY2lhbGl4X2V4aXRfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeF9pbzguaCBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXhfaW84LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1YmQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXhfaW84LmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAgICAgIGxpbnV4L2RyaXZlcnMvY2hhci9zcGVjaWFsaXhfaW84LmggIC0tIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBzZXJpYWwgZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IFJvZ2VyIFdvbGZmIChSLkUuV29sZmZAQml0V2l6YXJkLm5sKQorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgRG1pdHJ5IEdvcm9kY2hhbmluIChwZ21kc2dAaWJpLmNvbSkKKyAqCisgKgorICogICAgICBTcGVjaWFsaXggcGF5cyBmb3IgdGhlIGRldmVsb3BtZW50IGFuZCBzdXBwb3J0IG9mIHRoaXMgZHJpdmVyLgorICogICAgICBQbGVhc2UgRE8gY29udGFjdCBpbzgtbGludXhAc3BlY2lhbGl4LmNvLnVrIGlmIHlvdSByZXF1aXJlCisgKiAgICAgIHN1cHBvcnQuCisgKgorICogICAgICBUaGlzIGRyaXZlciB3YXMgZGV2ZWxvcHBlZCBpbiB0aGUgQml0V2l6YXJkIGxpbnV4IGRldmljZQorICogICAgICBkcml2ZXIgc2VydmljZS4gSWYgeW91IHJlcXVpcmUgYSBsaW51eCBkZXZpY2UgZHJpdmVyIGZvciB5b3VyCisgKiAgICAgIHByb2R1Y3QsIHBsZWFzZSBjb250YWN0IGRldmljZXNAQml0V2l6YXJkLm5sIGZvciBhIHF1b3RlLgorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGZpcm1seSBiYXNlZCBvbiB0aGUgcmlzY29tLzggc2VyaWFsIGRyaXZlciwKKyAqICAgICAgd3JpdHRlbiBieSBEbWl0cnkgR29yb2RjaGFuaW4uIFRoZSBzcGVjaWFsaXggSU84KyBjYXJkCisgKiAgICAgIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBDTC1DRDE4NjUgRGF0YQorICogICAgICBCb29rLCBhbmQgU3BlY2lhbGl4IGRvY3VtZW50IG51bWJlciA2MjAwMDU5OiBJTzgrIEhhcmR3YXJlCisgKiAgICAgIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiAgICAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogICAgICBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgICBVU0EuCisgKiAqLworCisjaWZuZGVmIF9fTElOVVhfU1BFQ0lBTElYX0gKKyNkZWZpbmUgX19MSU5VWF9TUEVDSUFMSVhfSAorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIFlvdSBjYW4gaGF2ZSBtYXggNCBJU0EgY2FyZHMgaW4gb25lIFBDLCBhbmQgSSByZWNvbW1lbmQgbm90IG11Y2ggCittb3JlIHRoYW4gYSBmZXcgIFBDSSB2ZXJzaW9ucyBvZiB0aGUgY2FyZC4gKi8KKworI2RlZmluZSBTWF9OQk9BUkQJCTgKKworLyogTk9URTogU3BlY2lhbGl4IGRlY29kZXIgcmVjb2duaXplcyA0IGFkZHJlc3NlcywgYnV0IG9ubHkgdHdvIGFyZSB1c2VkLi4uLiAqLworI2RlZmluZSBTWF9JT19TUEFDRSAgICAgICAgICAgICA0CisvKiBUaGUgUENJIHZlcnNpb24gZGVjb2RlcyA4IGFkZHJlc3NlcywgYnV0IHN0aWxsIG9ubHkgMiBhcmUgdXNlZC4gKi8KKyNkZWZpbmUgU1hfUENJX0lPX1NQQUNFICAgICAgICAgOAorCisvKiBlaWdodCBwb3J0cyBwZXIgYm9hcmQuICovCisjZGVmaW5lIFNYX05QT1JUICAgICAgICAJOAorI2RlZmluZSBTWF9CT0FSRChsaW5lKQkJKChsaW5lKSAvIFNYX05QT1JUKQorI2RlZmluZSBTWF9QT1JUKGxpbmUpCQkoKGxpbmUpICYgKFNYX05QT1JUIC0gMSkpCisKKworI2RlZmluZSBTWF9EQVRBX1JFRyAwICAgICAvKiBCYXNlKzAgOiBEYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIFNYX0FERFJfUkVHIDEgICAgIC8qIGJhc2UrMSA6IEFkZHJlc3MgcmVnaXN0ZXIuICovCisKKyNkZWZpbmUgTUh6ICoxMDAwMDAwCS8qIEknbSBhc2hhbWVkIG9mIG15c2VsZi4gKi8KKworLyogT24tYm9hcmQgb3NjaWxsYXRvciBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgU1hfT1NDRlJFUSAgICAgICgyNSBNSHovMikKKy8qIFRoZXJlIGlzIGEgMjVNSHogY3J5c3RhbCBvbiB0aGUgYm9hcmQsIGJ1dCB0aGUgY2hpcCBpcyBpbiAvMiBtb2RlICovCisKKworLyogVGlja3MgcGVyIHNlYy4gVXNlZCBmb3Igc2V0dGluZyByZWNlaXZlciB0aW1lb3V0IGFuZCBicmVhayBsZW5ndGggKi8KKyNkZWZpbmUgU1BFQ0lBTElYX1RQUwkJNDAwMAorCisvKiBZZWFoLCBhZnRlciBoZWF2eSB0ZXN0aW5nIEkgZGVjaWRlZCBpdCBtdXN0IGJlIDYuCisgKiBTdXJlLCBZb3UgY2FuIGNoYW5nZSBpdCBpZiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgU1BFQ0lBTElYX1JYRklGTwk2CS8qIE1heC4gcmVjZWl2ZXIgRklGTyBzaXplICgxLTgpICovCisKKyNkZWZpbmUgU1BFQ0lBTElYX01BR0lDCQkweDA5MDcKKworI2RlZmluZSBTWF9DQ1JfVElNRU9VVCAxMDAwMCAgIC8qIENDUiB0aW1lb3V0LiBZb3UgbWF5IG5lZWQgdG8gd2FpdCB1cHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgaXMgYXZhaWxhYmxlIGFnYWluIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IGdpdmUgaXQgYSBjb21tYW5kICovCisKKyNkZWZpbmUgU1hfSU9CQVNFMQkweDEwMAorI2RlZmluZSBTWF9JT0JBU0UyCTB4MTgwCisjZGVmaW5lIFNYX0lPQkFTRTMJMHgyNTAKKyNkZWZpbmUgU1hfSU9CQVNFNAkweDI2MAorCitzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkIHsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQJYmFzZTsKKwl1bnNpZ25lZCBjaGFyIAlpcnE7CisJLy9zaWduZWQgICBjaGFyCWNvdW50OworCWludCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyCURUUjsKKyAgICAgICAgaW50IHJlZzsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisjZGVmaW5lIFNYX0JPQVJEX1BSRVNFTlQJMHgwMDAwMDAwMQorI2RlZmluZSBTWF9CT0FSRF9BQ1RJVkUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1hfQk9BUkRfSVNfUENJCQkweDAwMDAwMDA0CisKKworc3RydWN0IHNwZWNpYWxpeF9wb3J0IHsKKwlpbnQJCQltYWdpYzsKKwlpbnQJCQliYXVkX2Jhc2U7CisJaW50CQkJZmxhZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgCSogdHR5OworCWludAkJCWNvdW50OworCWludAkJCWJsb2NrZWRfb3BlbjsKKwl1bG9uZwkJCWV2ZW50OworCWludAkJCXRpbWVvdXQ7CisJaW50CQkJY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgY2hhciAJCSogeG1pdF9idWY7CisJaW50CQkJY3VzdG9tX2Rpdmlzb3I7CisJaW50CQkJeG1pdF9oZWFkOworCWludAkJCXhtaXRfdGFpbDsKKwlpbnQJCQl4bWl0X2NudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaGFuZ3VwOworCXNob3J0CQkJd2FrZXVwX2NoYXJzOworCXNob3J0CQkJYnJlYWtfbGVuZ3RoOworCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7CisJdW5zaWduZWQgY2hhcgkJbWFya19tYXNrOworCXVuc2lnbmVkIGNoYXIJCUlFUjsKKwl1bnNpZ25lZCBjaGFyCQlNU1ZSOworCXVuc2lnbmVkIGNoYXIJCUNPUjI7CisJdW5zaWduZWQgbG9uZwkJb3ZlcnJ1bjsKKwl1bnNpZ25lZCBsb25nCQloaXRzWzEwXTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fTElOVVhfU1BFQ0lBTElYX0ggKi8KKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxNjY2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCkBAIC0wLDAgKzEsNTE5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJc3RhbGxpb24uYyAgLS0gc3RhbGxpb24gbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgIFN0YWxsaW9uIFRlY2hub2xvZ2llcworICoJQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIEdyZWcgVW5nZXJlci4KKyAqCisgKglUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICoJTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZDE0MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9zYzI2MTk4Lmg+CisjaW5jbHVkZSA8bGludXgvY29tc3RhdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFsbGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBkaWZmZXJlbnQgYm9hcmQgdHlwZXMuIFVzZSB0aGUgc3RhbmRhcmQgU3RhbGxpb24gImFzc2lnbmVkIgorICoJYm9hcmQgbnVtYmVycy4gQm9hcmRzIHN1cHBvcnRlZCBpbiB0aGlzIGRyaXZlciBhcmUgYWJicmV2aWF0ZWQgYXMKKyAqCUVJTyA9IEVhc3lJTyBhbmQgRUNIID0gRWFzeUNvbm5lY3Rpb24gOC8zMi4KKyAqLworI2RlZmluZQlCUkRfRUFTWUlPCTIwCisjZGVmaW5lCUJSRF9FQ0gJCTIxCisjZGVmaW5lCUJSRF9FQ0hNQwkyMgorI2RlZmluZQlCUkRfRUNIUENJCTI2CisjZGVmaW5lCUJSRF9FQ0g2NFBDSQkyNworI2RlZmluZQlCUkRfRUFTWUlPUENJCTI4CisKKy8qCisgKglEZWZpbmUgYSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byBob2xkIHRoZSBib2FyZCBjb25maWd1cmF0aW9uLgorICoJTmVlZCB0byBzZXQgdGhpcyB1cCBpbiB0aGUgY29kZSAoZm9yIG5vdykgd2l0aCB0aGUgYm9hcmRzIHRoYXQgYXJlCisgKgl0byBiZSBjb25maWd1cmVkIGludG8gdGhlIHN5c3RlbS4gVGhpcyBpcyB3aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkCisgKgl3aGVuIGFkZGluZy9yZW1vdmluZy9tb2RpZnlpbmcgYm9hcmRzLiBFYWNoIGxpbmUgZW50cnkgaW4gdGhlCisgKglzdGxfYnJkY29uZltdIGFycmF5IGlzIGEgYm9hcmQuIEVhY2ggbGluZSBjb250YWlucyBpby9pcnEvbWVtb3J5CisgKglyYW5nZXMgZm9yIHRoYXQgYm9hcmQgKGFzIHdlbGwgYXMgd2hhdCB0eXBlIG9mIGJvYXJkIGl0IGlzKS4KKyAqCVNvbWUgZXhhbXBsZXM6CisgKgkJeyBCUkRfRUFTWUlPLCAweDJhMCwgMCwgMCwgMTAsIDAgfSwKKyAqCVRoaXMgbGluZSB3b3VsZCBjb25maWd1cmUgYW4gRWFzeUlPIGJvYXJkICg0IG9yIDgsIG5vIGRpZmZlcmVuY2UpLAorICoJYXQgaW8gYWRkcmVzcyAyYTAgYW5kIGlycSAxMC4KKyAqCUFub3RoZXIgZXhhbXBsZToKKyAqCQl7IEJSRF9FQ0gsIDB4MmE4LCAweDI4MCwgMCwgMTIsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBFYXN5Q29ubmVjdGlvbiA4LzMyIGJvYXJkIGF0IHByaW1hcnkgaW8KKyAqCWFkZHJlc3MgMmE4LCBzZWNvbmRhcnkgaW8gYWRkcmVzcyAyODAgYW5kIGlycSAxMi4KKyAqCUVudGVyIGFzIG1hbnkgbGluZXMgaW50byB0aGlzIGFycmF5IGFzIHlvdSB3YW50IChvbmx5IHRoZSBmaXJzdCA0CisgKgl3aWxsIGFjdHVhbGx5IGJlIHVzZWQhKS4gQW55IGNvbWJpbmF0aW9uIG9mIEVhc3lJTyBhbmQgRWFzeUNvbm5lY3Rpb24KKyAqCWJvYXJkcyBjYW4gYmUgc3BlY2lmaWVkLiBFYXN5Q29ubmVjdGlvbiA4LzMyIGJvYXJkcyBjYW4gc2hhcmUgdGhlaXIKKyAqCXNlY29uZGFyeSBpbyBhZGRyZXNzZXMgYmV0d2VlbiBlYWNoIG90aGVyLgorICoKKyAqCU5PVEU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gcHV0IGFueSBlbnRyaWVzIGluIHRoaXMgdGFibGUgZm9yIFBDSQorICoJYm9hcmRzLiBUaGV5IHdpbGwgYmUgZm91bmQgYXV0b21hdGljYWxseSBieSB0aGUgZHJpdmVyIC0gcHJvdmlkZWQKKyAqCVBDSSBCSU9TMzIgc3VwcG9ydCBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAkJYnJkdHlwZTsKKwlpbnQJCWlvYWRkcjE7CisJaW50CQlpb2FkZHIyOworCXVuc2lnbmVkIGxvbmcJbWVtYWRkcjsKKwlpbnQJCWlycTsKKwlpbnQJCWlycXR5cGU7Cit9IHN0bGNvbmZfdDsKKworc3RhdGljIHN0bGNvbmZfdAlzdGxfYnJkY29uZltdID0geworCS8qeyBCUkRfRUFTWUlPLCAweDJhMCwgMCwgMCwgMTAsIDAgfSwqLworfTsKKworc3RhdGljIGludAlzdGxfbnJicmRzID0gc2l6ZW9mKHN0bF9icmRjb25mKSAvIHNpemVvZihzdGxjb25mX3QpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgc29tZSBpbXBvcnRhbnQgZHJpdmVyIGNoYXJhY3RlcmlzdGljcy4gRGV2aWNlIG1ham9yIG51bWJlcnMKKyAqCWFsbG9jYXRlZCBhcyBwZXIgTGludXggRGV2aWNlIFJlZ2lzdHJ5LgorICovCisjaWZuZGVmCVNUTF9TSU9NRU1NQUpPUgorI2RlZmluZQlTVExfU0lPTUVNTUFKT1IJCTI4CisjZW5kaWYKKyNpZm5kZWYJU1RMX1NFUklBTE1BSk9SCisjZGVmaW5lCVNUTF9TRVJJQUxNQUpPUgkJMjQKKyNlbmRpZgorI2lmbmRlZglTVExfQ0FMTE9VVE1BSk9SCisjZGVmaW5lCVNUTF9DQUxMT1VUTUFKT1IJMjUKKyNlbmRpZgorCisvKgorICoJU2V0IHRoZSBUWCBidWZmZXIgc2l6ZS4gQmlnZ2VyIGlzIGJldHRlciwgYnV0IHdlIGRvbid0IHdhbnQKKyAqCXRvIGNoZXcgdG9vIG11Y2ggbWVtb3J5IHdpdGggYnVmZmVycyEKKyAqLworI2RlZmluZQlTVExfVFhCVUZMT1cJCTUxMgorI2RlZmluZQlTVExfVFhCVUZTSVpFCQk0MDk2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBvdXIgbG9jYWwgZHJpdmVyIGlkZW50aXR5IGZpcnN0LiBTZXQgdXAgc3R1ZmYgdG8gZGVhbCB3aXRoCisgKglhbGwgdGhlIGxvY2FsIHN0cnVjdHVyZXMgcmVxdWlyZWQgYnkgYSBzZXJpYWwgdHR5IGRyaXZlci4KKyAqLworc3RhdGljIGNoYXIJKnN0bF9kcnZ0aXRsZSA9ICJTdGFsbGlvbiBNdWx0aXBvcnQgU2VyaWFsIERyaXZlciI7CitzdGF0aWMgY2hhcgkqc3RsX2Rydm5hbWUgPSAic3RhbGxpb24iOworc3RhdGljIGNoYXIJKnN0bF9kcnZ2ZXJzaW9uID0gIjUuNi4wIjsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyCSpzdGxfc2VyaWFsOworCisvKgorICoJV2Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlciBmb3IgY2hhcnMgdGhhdAorICoJY29tZSBkaXJlY3QgZnJvbSB1c2VyIHNwYWNlLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGEgY29weSBmcm9tIHVzZXIKKyAqCXNwYWNlIG1pZ2h0IGNhdXNlIGEgcGFnZSBmYXVsdCAodHlwaWNhbGx5IG9uIGEgc3lzdGVtIHRoYXQgaXMKKyAqCXN3YXBwaW5nISkuIEFsbCBwb3J0cyB3aWxsIHNoYXJlIG9uZSBidWZmZXIgLSBzaW5jZSBpZiB0aGUgc3lzdGVtCisgKglpcyBhbHJlYWR5IHN3YXBwaW5nIGEgc2hhcmVkIGJ1ZmZlciB3b24ndCBtYWtlIHRoaW5ncyBhbnkgd29yc2UuCisgKi8KK3N0YXRpYyBjaGFyCQkJKnN0bF90bXB3cml0ZWJ1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHN0bF90bXB3cml0ZXNlbSk7CisKKy8qCisgKglEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCisgKgl3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuIEJhc2ljYWxseSBhbGwgaXQgZGVmaW5lcyBpcyBhIHJhdyBwb3J0CisgKglhdCA5NjAwLCA4IGRhdGEgYml0cywgMSBzdG9wIGJpdC4KKyAqLworc3RhdGljIHN0cnVjdCB0ZXJtaW9zCQlzdGxfZGVmdGVybWlvcyA9IHsKKwkuY19jZmxhZwk9IChCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUwpLAorCS5jX2NjCQk9IElOSVRfQ19DQywKK307CisKKy8qCisgKglEZWZpbmUgZ2xvYmFsIHN0YXRzIHN0cnVjdHVyZXMuIE5vdCB1c2VkIG9mdGVuLCBhbmQgY2FuIGJlCisgKglyZS11c2VkIGZvciBlYWNoIHN0YXRzIGNhbGwuCisgKi8KK3N0YXRpYyBjb21zdGF0c190CXN0bF9jb21zdGF0czsKK3N0YXRpYyBjb21icmRfdAkJc3RsX2JyZHN0YXRzOworc3RhdGljIHN0bGJyZF90CQlzdGxfZHVtbXlicmQ7CitzdGF0aWMgc3RscG9ydF90CXN0bF9kdW1teXBvcnQ7CisKKy8qCisgKglEZWZpbmUgZ2xvYmFsIHBsYWNlIHRvIHB1dCBidWZmZXIgb3ZlcmZsb3cgY2hhcmFjdGVycy4KKyAqLworc3RhdGljIGNoYXIJCXN0bF91bndhbnRlZFtTQzI2MTk4X1JYRklGT1NJWkVdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdGxicmRfdAkJKnN0bF9icmRzW1NUTF9NQVhCUkRTXTsKKworLyoKKyAqCVBlciBib2FyZCBzdGF0ZSBmbGFncy4gVXNlZCB3aXRoIHRoZSBzdGF0ZSBmaWVsZCBvZiB0aGUgYm9hcmQgc3RydWN0LgorICoJTm90IHJlYWxseSBtdWNoIGhlcmUhCisgKi8KKyNkZWZpbmUJQlJEX0ZPVU5ECTB4MQorCisvKgorICoJRGVmaW5lIHRoZSBwb3J0IHN0cnVjdHVyZSBpc3RhdGUgZmxhZ3MuIFRoZXNlIHNldCBvZiBmbGFncyBhcmUKKyAqCW1vZGlmaWVkIGF0IGludGVycnVwdCB0aW1lIC0gc28gc2V0dGluZyBhbmQgcmVzZXRpbmcgdGhlbSBuZWVkcworICoJdG8gYmUgYXRvbWljLiBVc2UgdGhlIGJpdCBjbGVhci9zZXR0aW5nIHJvdXRpbmVzIGZvciB0aGlzLgorICovCisjZGVmaW5lCUFTWUlfVFhCVVNZCTEKKyNkZWZpbmUJQVNZSV9UWExPVwkyCisjZGVmaW5lCUFTWUlfRENEQ0hBTkdFCTMKKyNkZWZpbmUJQVNZSV9UWEZMT1dFRAk0CisKKy8qCisgKglEZWZpbmUgYW4gYXJyYXkgb2YgYm9hcmQgbmFtZXMgYXMgcHJpbnRhYmxlIHN0cmluZ3MuIEhhbmR5IGZvcgorICoJcmVmZXJlbmNpbmcgYm9hcmRzIHdoZW4gcHJpbnRpbmcgdHJhY2UgYW5kIHN0dWZmLgorICovCitzdGF0aWMgY2hhcgkqc3RsX2JyZG5hbWVzW10gPSB7CisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCSJFYXN5SU8iLAorCSJFQzgvMzItQVQiLAorCSJFQzgvMzItTUMiLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCSJFQzgvMzItUENJIiwKKwkiRUM4LzY0LVBDSSIsCisJIkVhc3lJTy1QQ0kiLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHNvbWUgc3RyaW5nIGxhYmVscyBmb3IgYXJndW1lbnRzIHBhc3NlZCBmcm9tIHRoZSBtb2R1bGUKKyAqCWxvYWQgbGluZS4gVGhlc2UgYWxsb3cgZm9yIGVhc3kgYm9hcmQgZGVmaW5pdGlvbnMsIGFuZCBlYXN5CisgKgltb2RpZmljYXRpb24gb2YgdGhlIGlvLCBtZW1vcnkgYW5kIGlycSByZXNvdWNyZXMuCisgKi8KK3N0YXRpYyBpbnQJc3RsX25hcmdzID0gMDsKK3N0YXRpYyBjaGFyCSpib2FyZDBbNF07CitzdGF0aWMgY2hhcgkqYm9hcmQxWzRdOworc3RhdGljIGNoYXIJKmJvYXJkMls0XTsKK3N0YXRpYyBjaGFyCSpib2FyZDNbNF07CisKK3N0YXRpYyBjaGFyCSoqc3RsX2JyZHNwW10gPSB7CisJKGNoYXIgKiopICZib2FyZDAsCisJKGNoYXIgKiopICZib2FyZDEsCisJKGNoYXIgKiopICZib2FyZDIsCisJKGNoYXIgKiopICZib2FyZDMKK307CisKKy8qCisgKglEZWZpbmUgYSBzZXQgb2YgY29tbW9uIGJvYXJkIG5hbWVzLCBhbmQgdHlwZXMuIFRoaXMgaXMgdXNlZCB0bworICoJcGFyc2UgYW55IG1vZHVsZSBhcmd1bWVudHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3RsYnJkdHlwZSB7CisJY2hhcgkqbmFtZTsKKwlpbnQJdHlwZTsKK30gc3RsYnJkdHlwZV90OworCitzdGF0aWMgc3RsYnJkdHlwZV90CXN0bF9icmRzdHJbXSA9IHsKKwl7ICJlYXN5aW8iLCBCUkRfRUFTWUlPIH0sCisJeyAiZWlvIiwgQlJEX0VBU1lJTyB9LAorCXsgIjIwIiwgQlJEX0VBU1lJTyB9LAorCXsgImVjOC8zMiIsIEJSRF9FQ0ggfSwKKwl7ICJlYzgvMzItYXQiLCBCUkRfRUNIIH0sCisJeyAiZWM4LzMyLWlzYSIsIEJSRF9FQ0ggfSwKKwl7ICJlY2giLCBCUkRfRUNIIH0sCisJeyAiZWNoYXQiLCBCUkRfRUNIIH0sCisJeyAiMjEiLCBCUkRfRUNIIH0sCisJeyAiZWM4LzMyLW1jIiwgQlJEX0VDSE1DIH0sCisJeyAiZWM4LzMyLW1jYSIsIEJSRF9FQ0hNQyB9LAorCXsgImVjaG1jIiwgQlJEX0VDSE1DIH0sCisJeyAiZWNobWNhIiwgQlJEX0VDSE1DIH0sCisJeyAiMjIiLCBCUkRfRUNITUMgfSwKKwl7ICJlYzgvMzItcGMiLCBCUkRfRUNIUENJIH0sCisJeyAiZWM4LzMyLXBjaSIsIEJSRF9FQ0hQQ0kgfSwKKwl7ICIyNiIsIEJSRF9FQ0hQQ0kgfSwKKwl7ICJlYzgvNjQtcGMiLCBCUkRfRUNINjRQQ0kgfSwKKwl7ICJlYzgvNjQtcGNpIiwgQlJEX0VDSDY0UENJIH0sCisJeyAiZWNoLXBjaSIsIEJSRF9FQ0g2NFBDSSB9LAorCXsgImVjaHBjaSIsIEJSRF9FQ0g2NFBDSSB9LAorCXsgImVjaHBjIiwgQlJEX0VDSDY0UENJIH0sCisJeyAiMjciLCBCUkRfRUNINjRQQ0kgfSwKKwl7ICJlYXN5aW8tcGMiLCBCUkRfRUFTWUlPUENJIH0sCisJeyAiZWFzeWlvLXBjaSIsIEJSRF9FQVNZSU9QQ0kgfSwKKwl7ICJlaW8tcGNpIiwgQlJEX0VBU1lJT1BDSSB9LAorCXsgImVpb3BjaSIsIEJSRF9FQVNZSU9QQ0kgfSwKKwl7ICIyOCIsIEJSRF9FQVNZSU9QQ0kgfSwKK307CisKKy8qCisgKglEZWZpbmUgdGhlIG1vZHVsZSBhZ3J1bWVudHMuCisgKi8KK01PRFVMRV9BVVRIT1IoIkdyZWcgVW5nZXJlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdGFsbGlvbiBNdWx0aXBvcnQgU2VyaWFsIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoYm9hcmQwLCBjaGFycCwgJnN0bF9uYXJncywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMCwgIkJvYXJkIDAgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssaW9hZGRyMl1bLGlycV1dIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYm9hcmQxLCBjaGFycCwgJnN0bF9uYXJncywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMSwgIkJvYXJkIDEgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssaW9hZGRyMl1bLGlycV1dIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYm9hcmQyLCBjaGFycCwgJnN0bF9uYXJncywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMiwgIkJvYXJkIDIgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssaW9hZGRyMl1bLGlycV1dIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYm9hcmQzLCBjaGFycCwgJnN0bF9uYXJncywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMywgIkJvYXJkIDMgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssaW9hZGRyMl1bLGlycV1dIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUhhcmR3YXJlIElEIGJpdHMgZm9yIHRoZSBFYXN5SU8gYW5kIEVDSCBib2FyZHMuIFRoZXNlIGRlZmluZXMgYXBwbHkKKyAqCXRvIHRoZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGlvIHBvcnRzIG9mIHRoZXNlIGJvYXJkcyAobm90IHRoZSB1YXJ0cyAtCisgKgl0aGV5IGFyZSBpbiBjZDE0MDAuaCBhbmQgc2MyNjE5OC5oKS4KKyAqLworI2RlZmluZQlFSU9fOFBPUlRSUwkweDA0CisjZGVmaW5lCUVJT180UE9SVFJTCTB4MDUKKyNkZWZpbmUJRUlPXzhQT1JUREkJMHgwMAorI2RlZmluZQlFSU9fOFBPUlRNCTB4MDYKKyNkZWZpbmUJRUlPX01LMwkJMHgwMworI2RlZmluZQlFSU9fSURCSVRNQVNLCTB4MDcKKworI2RlZmluZQlFSU9fQlJETUFTSwkweGYwCisjZGVmaW5lCUlEX0JSRDQJCTB4MTAKKyNkZWZpbmUJSURfQlJEOAkJMHgyMAorI2RlZmluZQlJRF9CUkQxNgkweDMwCisKKyNkZWZpbmUJRUlPX0lOVFJQRU5ECTB4MDgKKyNkZWZpbmUJRUlPX0lOVEVER0UJMHgwMAorI2RlZmluZQlFSU9fSU5UTEVWRUwJMHgwOAorI2RlZmluZQlFSU9fMFdTCQkweDEwCisKKyNkZWZpbmUJRUNIX0lECQkweGEwCisjZGVmaW5lCUVDSF9JREJJVE1BU0sJMHhlMAorI2RlZmluZQlFQ0hfQlJERU5BQkxFCTB4MDgKKyNkZWZpbmUJRUNIX0JSRERJU0FCTEUJMHgwMAorI2RlZmluZQlFQ0hfSU5URU5BQkxFCTB4MDEKKyNkZWZpbmUJRUNIX0lOVERJU0FCTEUJMHgwMAorI2RlZmluZQlFQ0hfSU5UTEVWRUwJMHgwMgorI2RlZmluZQlFQ0hfSU5URURHRQkweDAwCisjZGVmaW5lCUVDSF9JTlRSUEVORAkweDAxCisjZGVmaW5lCUVDSF9CUkRSRVNFVAkweDAxCisKKyNkZWZpbmUJRUNITUNfSU5URU5BQkxFCTB4MDEKKyNkZWZpbmUJRUNITUNfQlJEUkVTRVQJMHgwMgorCisjZGVmaW5lCUVDSF9QTkxTVEFUVVMJMgorI2RlZmluZQlFQ0hfUE5MMTZQT1JUCTB4MjAKKyNkZWZpbmUJRUNIX1BOTElETUFTSwkweDA3CisjZGVmaW5lCUVDSF9QTkxYUElECTB4NDAKKyNkZWZpbmUJRUNIX1BOTElOVFJQRU5ECTB4ODAKKworI2RlZmluZQlFQ0hfQUREUjJNQVNLCTB4MWUwCisKKy8qCisgKglEZWZpbmUgdGhlIHZlY3RvciBtYXBwaW5nIGJpdHMgZm9yIHRoZSBwcm9ncmFtbWFibGUgaW50ZXJydXB0IGJvYXJkCisgKgloYXJkd2FyZS4gVGhlc2UgYml0cyBlbmNvZGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGJvYXJkIHRvIHVzZSAtIGl0CisgKglpcyBzb2Z0d2FyZSBzZWxlY3RhYmxlIChleGNlcHQgdGhlIEVJTy04TSkuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXN0bF92ZWNtYXBbXSA9IHsKKwkweGZmLCAweGZmLCAweGZmLCAweDA0LCAweDA2LCAweDA1LCAweGZmLCAweDA3LAorCTB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDIsIDB4MDEsIDB4ZmYsIDB4ZmYsIDB4MDMKK307CisKKy8qCisgKglTZXQgdXAgZW5hYmxlIGFuZCBkaXNhYmxlIG1hY3JvcyBmb3IgdGhlIEVDSCBib2FyZHMuIFRoZXkgcmVxdWlyZQorICoJdGhlIHNlY29uZGFyeSBpbyBhZGRyZXNzIHNwYWNlIHRvIGJlIGFjdGl2YXRlZCBhbmQgZGVhY3RpdmF0ZWQuCisgKglUaGlzIHdheSBhbGwgRUNIIGJvYXJkcyBjYW4gc2hhcmUgdGhlaXIgc2Vjb25kYXJ5IGlvIHJlZ2lvbi4KKyAqCUlmIHRoaXMgaXMgYW4gRUNILVBDSSBib2FyZCB0aGVuIGFsc28gbmVlZCB0byBzZXQgdGhlIHBhZ2UgcG9pbnRlcgorICoJdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgcGFnZS4KKyAqLworI2RlZmluZQlCUkRFTkFCTEUoYnJkbnIscGFnZW5yKQkJCQkJCVwKKwlpZiAoc3RsX2JyZHNbKGJyZG5yKV0tPmJyZHR5cGUgPT0gQlJEX0VDSCkJCQlcCisJCW91dGIoKHN0bF9icmRzWyhicmRucildLT5pb2N0cmx2YWwgfCBFQ0hfQlJERU5BQkxFKSwJXAorCQkJc3RsX2JyZHNbKGJyZG5yKV0tPmlvY3RybCk7CQkJXAorCWVsc2UgaWYgKHN0bF9icmRzWyhicmRucildLT5icmR0eXBlID09IEJSRF9FQ0hQQ0kpCQlcCisJCW91dGIoKHBhZ2VuciksIHN0bF9icmRzWyhicmRucildLT5pb2N0cmwpOworCisjZGVmaW5lCUJSRERJU0FCTEUoYnJkbnIpCQkJCQkJXAorCWlmIChzdGxfYnJkc1soYnJkbnIpXS0+YnJkdHlwZSA9PSBCUkRfRUNIKQkJCVwKKwkJb3V0Yigoc3RsX2JyZHNbKGJyZG5yKV0tPmlvY3RybHZhbCB8IEVDSF9CUkRESVNBQkxFKSwJXAorCQkJc3RsX2JyZHNbKGJyZG5yKV0tPmlvY3RybCk7CisKKyNkZWZpbmUJU1RMX0NEMTQwME1BWEJBVUQJMjMwNDAwCisjZGVmaW5lCVNUTF9TQzI2MTk4TUFYQkFVRAk0NjA4MDAKKworI2RlZmluZQlTVExfQkFVREJBU0UJCTExNTIwMAorI2RlZmluZQlTVExfQ0xPU0VERUxBWQkJKDUgKiBIWiAvIDEwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfUENJCisKKy8qCisgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCisgKi8KKyNpZm5kZWYJUENJX1ZFTkRPUl9JRF9TVEFMTElPTgorI2RlZmluZQlQQ0lfVkVORE9SX0lEX1NUQUxMSU9OCQkweDEyNGQKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VDSFBDSTgzMgorI2RlZmluZQlQQ0lfREVWSUNFX0lEX0VDSFBDSTgzMgkJMHgwMDAwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FQ0hQQ0k4NjQKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9FQ0hQQ0k4NjQJCTB4MDAwMgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRUlPUENJCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRUlPUENJCQkweDAwMDMKKyNlbmRpZgorCisvKgorICoJRGVmaW5lIHN0cnVjdHVyZSB0byBob2xkIGFsbCBTdGFsbGlvbiBQQ0kgYm9hcmRzLgorICovCit0eXBlZGVmIHN0cnVjdCBzdGxwY2licmQgeworCXVuc2lnbmVkIHNob3J0CQl2ZW5kaWQ7CisJdW5zaWduZWQgc2hvcnQJCWRldmlkOworCWludAkJCWJyZHR5cGU7Cit9IHN0bHBjaWJyZF90OworCitzdGF0aWMgc3RscGNpYnJkX3QJc3RsX3BjaWJyZHNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUNIUENJODY0LCBCUkRfRUNINjRQQ0kgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUlPUENJLCBCUkRfRUFTWUlPUENJIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NUQUxMSU9OLCBQQ0lfREVWSUNFX0lEX0VDSFBDSTgzMiwgQlJEX0VDSFBDSSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU184NzQxMCwgQlJEX0VDSFBDSSB9LAorfTsKKworc3RhdGljIGludAlzdGxfbnJwY2licmRzID0gc2l6ZW9mKHN0bF9wY2licmRzKSAvIHNpemVvZihzdGxwY2licmRfdCk7CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgbWFjcm9zIHRvIGV4dHJhY3QgYSBicmQvcG9ydCBudW1iZXIgZnJvbSBhIG1pbm9yIG51bWJlci4KKyAqLworI2RlZmluZQlNSU5PUjJCUkQobWluKQkJKCgobWluKSAmIDB4YzApID4+IDYpCisjZGVmaW5lCU1JTk9SMlBPUlQobWluKQkJKChtaW4pICYgMHgzZikKKworLyoKKyAqCURlZmluZSBhIGJhdWQgcmF0ZSB0YWJsZSB0aGF0IGNvbnZlcnRzIHRlcm1pb3MgYmF1ZCByYXRlIHNlbGVjdG9yCisgKglpbnRvIHRoZSBhY3R1YWwgYmF1ZCByYXRlIHZhbHVlLiBBbGwgYmF1ZCByYXRlIGNhbGN1bGF0aW9ucyBhcmUKKyAqCWJhc2VkIG9uIHRoZSBhY3R1YWwgYmF1ZCByYXRlIHJlcXVpcmVkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CXN0bF9iYXVkcmF0ZXNbXSA9IHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwCit9OworCisvKgorICoJRGVmaW5lIHNvbWUgaGFuZHkgbG9jYWwgbWFjcm9zLi4uCisgKi8KKyN1bmRlZglNSU4KKyNkZWZpbmUJTUlOKGEsYikJKCgoYSkgPD0gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCVRPTE9XRVIKKyNkZWZpbmUJVE9MT1dFUih4KQkoKCgoeCkgPj0gJ0EnKSAmJiAoKHgpIDw9ICdaJykpID8gKCh4KSArIDB4MjApIDogKHgpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWNsYXJlIGFsbCB0aG9zZSBmdW5jdGlvbnMgaW4gdGhpcyBkcml2ZXIhCisgKi8KKworc3RhdGljIHZvaWQJc3RsX2FyZ2JyZHModm9pZCk7CitzdGF0aWMgaW50CXN0bF9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0bF9hdG9sKGNoYXIgKnN0cik7CisKK2ludAkJc3RsX2luaXQodm9pZCk7CitzdGF0aWMgaW50CXN0bF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkCXN0bF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50CXN0bF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZAlzdGxfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkCXN0bF9mbHVzaGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludAlzdGxfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludAlzdGxfY2hhcnNpbmJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZAlzdGxfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKK3N0YXRpYyB2b2lkCXN0bF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxfYnJlYWtjdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkCXN0bF93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkCXN0bF9zZW5keGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CitzdGF0aWMgdm9pZAlzdGxfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludAlzdGxfbWVtaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50CXN0bF9wb3J0aW5mbyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcG9ydG5yLCBjaGFyICpwb3MpOworc3RhdGljIGludAlzdGxfcmVhZHByb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW50CXN0bF9icmRpbml0KHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsX2luaXRwb3J0cyhzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwKTsKK3N0YXRpYyBpbnQJc3RsX2dldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKK3N0YXRpYyBpbnQJc3RsX3NldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKK3N0YXRpYyBpbnQJc3RsX2dldGJyZHN0YXRzKGNvbWJyZF90IF9fdXNlciAqYnApOworc3RhdGljIGludAlzdGxfZ2V0cG9ydHN0YXRzKHN0bHBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bF9jbHJwb3J0c3RhdHMoc3RscG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKK3N0YXRpYyBpbnQJc3RsX2dldHBvcnRzdHJ1Y3Qoc3RscG9ydF90IF9fdXNlciAqYXJnKTsKK3N0YXRpYyBpbnQJc3RsX2dldGJyZHN0cnVjdChzdGxicmRfdCBfX3VzZXIgKmFyZyk7CitzdGF0aWMgaW50CXN0bF93YWl0Y2FycmllcihzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50CXN0bF9laW9pbnRyKHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsX2VjaGF0aW50cihzdGxicmRfdCAqYnJkcCk7CitzdGF0aWMgaW50CXN0bF9lY2htY2FpbnRyKHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsX2VjaHBjaWludHIoc3RsYnJkX3QgKmJyZHApOworc3RhdGljIGludAlzdGxfZWNocGNpNjRpbnRyKHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bF9vZmZpbnRyKHZvaWQgKnByaXZhdGUpOworc3RhdGljIHZvaWQJKnN0bF9tZW1hbGxvYyhpbnQgbGVuKTsKK3N0YXRpYyBzdGxicmRfdCAqc3RsX2FsbG9jYnJkKHZvaWQpOworc3RhdGljIHN0bHBvcnRfdCAqc3RsX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucik7CisKK3N0YXRpYyBpbmxpbmUgaW50CXN0bF9pbml0YnJkcyh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgaW50CXN0bF9pbml0ZWlvKHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyBpbmxpbmUgaW50CXN0bF9pbml0ZWNoKHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyBpbmxpbmUgaW50CXN0bF9nZXRicmRucih2b2lkKTsKKworI2lmZGVmCUNPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgaW50CXN0bF9maW5kcGNpYnJkcyh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgaW50CXN0bF9pbml0cGNpYnJkKGludCBicmR0eXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2cCk7CisjZW5kaWYKKworLyoKKyAqCUNEMTQwMCB1YXJ0IHNwZWNpZmljIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50CXN0bF9jZDE0MDBnZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKTsKK3N0YXRpYyBpbnQJc3RsX2NkMTQwMHVwZGF0ZXJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50CXN0bF9jZDE0MDBwYW5lbGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwcG9ydGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCwgc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2V0cG9ydChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApOworc3RhdGljIGludAlzdGxfY2QxNDAwZ2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBzZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMGNjcndhaXQoc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZW5hYmxlcnh0eChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc3RhcnRyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBkaXNhYmxlaW50cnMoc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2VuZGJyZWFrKHN0bHBvcnRfdCAqcG9ydHAsIGludCBsZW4pOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMGZsb3djdHJsKHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2VuZGZsb3coc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBmbHVzaChzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsX2NkMTQwMGRhdGFzdGF0ZShzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBlaW9pbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZWNoaW50cihzdGxwYW5lbF90ICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMHR4aXNyKHN0bHBhbmVsX3QgKnBhbmVscCwgaW50IGlvYWRkcik7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwcnhpc3Ioc3RscGFuZWxfdCAqcGFuZWxwLCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBtZG1pc3Ioc3RscGFuZWxfdCAqcGFuZWxwLCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGlubGluZSBpbnQJc3RsX2NkMTQwMGJyZWFraXNyKHN0bHBvcnRfdCAqcG9ydHAsIGludCBpb2FkZHIpOworCisvKgorICoJU0MyNjE5OCB1YXJ0IHNwZWNpZmljIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpOworc3RhdGljIGludAlzdGxfc2MyNjE5OGdldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIpOworc3RhdGljIGludAlzdGxfc2MyNjE5OHVwZGF0ZXJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50CXN0bF9zYzI2MTk4Z2V0Z2xvYnJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIpOworc3RhdGljIGludAlzdGxfc2MyNjE5OHBhbmVsaW5pdChzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cG9ydGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCwgc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHNldHBvcnQoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKK3N0YXRpYyBpbnQJc3RsX3NjMjYxOThnZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThlbmFibGVyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c3RhcnRyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4ZGlzYWJsZWludHJzKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZW5kYnJlYWsoc3RscG9ydF90ICpwb3J0cCwgaW50IGxlbik7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGZsb3djdHJsKHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHNlbmRmbG93KHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGZsdXNoKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxfc2MyNjE5OGRhdGFzdGF0ZShzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4d2FpdChzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4dHh1bmZsb3coc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGludHIoc3RscGFuZWxfdCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4dHhpc3Ioc3RscG9ydF90ICpwb3J0KTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cnhpc3Ioc3RscG9ydF90ICpwb3J0LCB1bnNpZ25lZCBpbnQgaWFjayk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHJ4YmFkY2goc3RscG9ydF90ICpwb3J0cCwgdW5zaWduZWQgY2hhciBzdGF0dXMsIGNoYXIgY2gpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThyeGJhZGNoYXJzKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThvdGhlcmlzcihzdGxwb3J0X3QgKnBvcnQsIHVuc2lnbmVkIGludCBpYWNrKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJR2VuZXJpYyBVQVJUIHN1cHBvcnQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB1YXJ0IHsKKwlpbnQJKCpwYW5lbGluaXQpKHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHApOworCXZvaWQJKCpwb3J0aW5pdCkoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCwgc3RscG9ydF90ICpwb3J0cCk7CisJdm9pZAkoKnNldHBvcnQpKHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0ZXJtaW9zICp0aW9zcCk7CisJaW50CSgqZ2V0c2lnbmFscykoc3RscG9ydF90ICpwb3J0cCk7CisJdm9pZAkoKnNldHNpZ25hbHMpKHN0bHBvcnRfdCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpOworCXZvaWQJKCplbmFibGVyeHR4KShzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7CisJdm9pZAkoKnN0YXJ0cnh0eCkoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpOworCXZvaWQJKCpkaXNhYmxlaW50cnMpKHN0bHBvcnRfdCAqcG9ydHApOworCXZvaWQJKCpzZW5kYnJlYWspKHN0bHBvcnRfdCAqcG9ydHAsIGludCBsZW4pOworCXZvaWQJKCpmbG93Y3RybCkoc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKKwl2b2lkCSgqc2VuZGZsb3cpKHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSk7CisJdm9pZAkoKmZsdXNoKShzdGxwb3J0X3QgKnBvcnRwKTsKKwlpbnQJKCpkYXRhc3RhdGUpKHN0bHBvcnRfdCAqcG9ydHApOworCXZvaWQJKCppbnRyKShzdGxwYW5lbF90ICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpOworfSB1YXJ0X3Q7CisKKy8qCisgKglEZWZpbmUgc29tZSBtYWNyb3MgdG8gbWFrZSBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBuaWNlIGFuZCBjbGVhbi4KKyAqLworI2RlZmluZQlzdGxfcGFuZWxpbml0CQkoKiAoKHVhcnRfdCAqKSBwYW5lbHAtPnVhcnRwKS0+cGFuZWxpbml0KQorI2RlZmluZQlzdGxfcG9ydGluaXQJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPnBvcnRpbml0KQorI2RlZmluZQlzdGxfc2V0cG9ydAkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+c2V0cG9ydCkKKyNkZWZpbmUJc3RsX2dldHNpZ25hbHMJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPmdldHNpZ25hbHMpCisjZGVmaW5lCXN0bF9zZXRzaWduYWxzCQkoKiAoKHVhcnRfdCAqKSBwb3J0cC0+dWFydHApLT5zZXRzaWduYWxzKQorI2RlZmluZQlzdGxfZW5hYmxlcnh0eAkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+ZW5hYmxlcnh0eCkKKyNkZWZpbmUJc3RsX3N0YXJ0cnh0eAkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+c3RhcnRyeHR4KQorI2RlZmluZQlzdGxfZGlzYWJsZWludHJzCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPmRpc2FibGVpbnRycykKKyNkZWZpbmUJc3RsX3NlbmRicmVhawkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+c2VuZGJyZWFrKQorI2RlZmluZQlzdGxfZmxvd2N0cmwJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPmZsb3djdHJsKQorI2RlZmluZQlzdGxfc2VuZGZsb3cJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPnNlbmRmbG93KQorI2RlZmluZQlzdGxfZmx1c2gJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPmZsdXNoKQorI2RlZmluZQlzdGxfZGF0YXN0YXRlCQkoKiAoKHVhcnRfdCAqKSBwb3J0cC0+dWFydHApLT5kYXRhc3RhdGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNEMTQwMCBVQVJUIHNwZWNpZmljIGRhdGEgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0YXRpYyB1YXJ0X3Qgc3RsX2NkMTQwMHVhcnQgPSB7CisJc3RsX2NkMTQwMHBhbmVsaW5pdCwKKwlzdGxfY2QxNDAwcG9ydGluaXQsCisJc3RsX2NkMTQwMHNldHBvcnQsCisJc3RsX2NkMTQwMGdldHNpZ25hbHMsCisJc3RsX2NkMTQwMHNldHNpZ25hbHMsCisJc3RsX2NkMTQwMGVuYWJsZXJ4dHgsCisJc3RsX2NkMTQwMHN0YXJ0cnh0eCwKKwlzdGxfY2QxNDAwZGlzYWJsZWludHJzLAorCXN0bF9jZDE0MDBzZW5kYnJlYWssCisJc3RsX2NkMTQwMGZsb3djdHJsLAorCXN0bF9jZDE0MDBzZW5kZmxvdywKKwlzdGxfY2QxNDAwZmx1c2gsCisJc3RsX2NkMTQwMGRhdGFzdGF0ZSwKKwlzdGxfY2QxNDAwZWlvaW50cgorfTsKKworLyoKKyAqCURlZmluZSB0aGUgb2Zmc2V0cyB3aXRoaW4gdGhlIHJlZ2lzdGVyIGJhbmsgb2YgYSBjZDE0MDAgYmFzZWQgcGFuZWwuCisgKglUaGVzZSBpbyBhZGRyZXNzIG9mZnNldHMgYXJlIGNvbW1vbiB0byB0aGUgRWFzeUlPIGJvYXJkIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUJRVJFR19BRERSCTAKKyNkZWZpbmUJRVJFR19EQVRBCTQKKyNkZWZpbmUJRVJFR19SWEFDSwk1CisjZGVmaW5lCUVSRUdfVFhBQ0sJNgorI2RlZmluZQlFUkVHX01EQUNLCTcKKworI2RlZmluZQlFUkVHX0JBTktTSVpFCTgKKworI2RlZmluZQlDRDE0MDBfQ0xLCTI1MDAwMDAwCisjZGVmaW5lCUNEMTQwMF9DTEs4TQkyMDAwMDAwMAorCisvKgorICoJRGVmaW5lIHRoZSBjZDE0MDAgYmF1ZCByYXRlIGNsb2Nrcy4gVGhlc2UgYXJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZworICoJd2hhdCBjbG9jayBhbmQgZGl2aXNvciB0byB1c2UgZm9yIHRoZSByZXF1aXJlZCBiYXVkIHJhdGUuIEFsc28KKyAqCWRlZmluZSB0aGUgbWF4aW11bSBiYXVkIHJhdGUgYWxsb3dlZCwgYW5kIHRoZSBkZWZhdWx0IGJhc2UgYmF1ZC4KKyAqLworc3RhdGljIGludAlzdGxfY2QxNDAwY2xrZGl2c1tdID0geworCUNEMTQwMF9DTEswLCBDRDE0MDBfQ0xLMSwgQ0QxNDAwX0NMSzIsIENEMTQwMF9DTEszLCBDRDE0MDBfQ0xLNAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU0MyNjE5OCBVQVJUIHNwZWNpZmljIGRhdGEgaW5pdGl6YXRpb24uCisgKi8KK3N0YXRpYyB1YXJ0X3Qgc3RsX3NjMjYxOTh1YXJ0ID0geworCXN0bF9zYzI2MTk4cGFuZWxpbml0LAorCXN0bF9zYzI2MTk4cG9ydGluaXQsCisJc3RsX3NjMjYxOThzZXRwb3J0LAorCXN0bF9zYzI2MTk4Z2V0c2lnbmFscywKKwlzdGxfc2MyNjE5OHNldHNpZ25hbHMsCisJc3RsX3NjMjYxOThlbmFibGVyeHR4LAorCXN0bF9zYzI2MTk4c3RhcnRyeHR4LAorCXN0bF9zYzI2MTk4ZGlzYWJsZWludHJzLAorCXN0bF9zYzI2MTk4c2VuZGJyZWFrLAorCXN0bF9zYzI2MTk4Zmxvd2N0cmwsCisJc3RsX3NjMjYxOThzZW5kZmxvdywKKwlzdGxfc2MyNjE5OGZsdXNoLAorCXN0bF9zYzI2MTk4ZGF0YXN0YXRlLAorCXN0bF9zYzI2MTk4aW50cgorfTsKKworLyoKKyAqCURlZmluZSB0aGUgb2Zmc2V0cyB3aXRoaW4gdGhlIHJlZ2lzdGVyIGJhbmsgb2YgYSBzYzI2MTk4IGJhc2VkIHBhbmVsLgorICovCisjZGVmaW5lCVhQX0RBVEEJCTAKKyNkZWZpbmUJWFBfQUREUgkJMQorI2RlZmluZQlYUF9NT0RJRAkyCisjZGVmaW5lCVhQX1NUQVRVUwkyCisjZGVmaW5lCVhQX0lBQ0sJCTMKKworI2RlZmluZQlYUF9CQU5LU0laRQk0CisKKy8qCisgKglEZWZpbmUgdGhlIHNjMjYxOTggYmF1ZCByYXRlIHRhYmxlLiBPZmZzZXRzIHdpdGhpbiB0aGUgdGFibGUKKyAqCXJlcHJlc2VudCB0aGUgYWN0dWFsIGJhdWQgcmF0ZSBzZWxlY3RvciBvZiBzYzI2MTk4IHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAlzYzI2MTk4X2JhdWR0YWJsZVtdID0geworCTUwLCA3NSwgMTUwLCAyMDAsIDMwMCwgNDUwLCA2MDAsIDkwMCwgMTIwMCwgMTgwMCwgMjQwMCwgMzYwMCwKKwk0ODAwLCA3MjAwLCA5NjAwLCAxNDQwMCwgMTkyMDAsIDI4ODAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwKKwkyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwCit9OworCisjZGVmaW5lCVNDMjYxOThfTlJCQVVEUwkJKHNpemVvZihzYzI2MTk4X2JhdWR0YWJsZSkgLyBzaXplb2YodW5zaWduZWQgaW50KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHRoZSBkcml2ZXIgaW5mbyBmb3IgYSB1c2VyIGxldmVsIGNvbnRyb2wgZGV2aWNlLiBVc2VkIG1haW5seQorICoJdG8gZ2V0IGF0IHBvcnQgc3RhdHMgLSBvbmx5IG5vdCB1c2luZyB0aGUgcG9ydCBkZXZpY2UgaXRzZWxmLgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwlzdGxfZnNpb21lbSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHN0bF9tZW1pb2N0bCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnN0YWxsaW9uX2NsYXNzOworCisvKgorICoJTG9hZGFibGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIHN0dWZmLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHN0YWxsaW9uX21vZHVsZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJpbml0X21vZHVsZSgpXG4iKTsKKyNlbmRpZgorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJc3RsX2luaXQoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RhbGxpb25fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlzdGxicmRfdAkqYnJkcDsKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJc3RscG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJaSwgaiwgazsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJjbGVhbnVwX21vZHVsZSgpXG4iKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAiVW5sb2FkaW5nICVzOiB2ZXJzaW9uICVzXG4iLCBzdGxfZHJ2dGl0bGUsCisJCXN0bF9kcnZ2ZXJzaW9uKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisvKgorICoJRnJlZSB1cCBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBwb3J0cy4gVGhpcyBpbmNsdWRlcworICoJbWVtb3J5IGFuZCBpbnRlcnJ1cHRzLiBBcyBwYXJ0IG9mIHRoaXMgcHJvY2VzcyB3ZSB3aWxsIGFsc28gZG8KKyAqCWEgaGFuZ3VwIG9uIGV2ZXJ5IG9wZW4gcG9ydCAtIHRvIHRyeSB0byBmbHVzaCBvdXQgYW55IHByb2Nlc3NlcworICoJaGFuZ2luZyBvbnRvIHBvcnRzLgorICovCisJaSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdGxfc2VyaWFsKTsKKwlwdXRfdHR5X2RyaXZlcihzdGxfc2VyaWFsKTsKKwlpZiAoaSkgeworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlciwgIgorCQkJImVycm5vPSVkXG4iLCAtaSk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZGV2ZnNfcmVtb3ZlKCJzdGFsaW9tZW0vJWQiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSk7CisJfQorCWRldmZzX3JlbW92ZSgic3RhbGlvbWVtIik7CisJaWYgKChpID0gdW5yZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIikpKQorCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgc2VyaWFsIG1lbW9yeSBkZXZpY2UsICIKKwkJCSJlcnJubz0lZFxuIiwgLWkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KHN0YWxsaW9uX2NsYXNzKTsKKworCWlmIChzdGxfdG1wd3JpdGVidWYgIT0gKGNoYXIgKikgTlVMTCkKKwkJa2ZyZWUoc3RsX3RtcHdyaXRlYnVmKTsKKworCWZvciAoaSA9IDA7IChpIDwgc3RsX25yYnJkcyk7IGkrKykgeworCQlpZiAoKGJyZHAgPSBzdGxfYnJkc1tpXSkgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCQljb250aW51ZTsKKworCQlmcmVlX2lycShicmRwLT5pcnEsIGJyZHApOworCisJCWZvciAoaiA9IDA7IChqIDwgU1RMX01BWFBBTkVMUyk7IGorKykgeworCQkJcGFuZWxwID0gYnJkcC0+cGFuZWxzW2pdOworCQkJaWYgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChrID0gMDsgKGsgPCBTVExfUE9SVFNQRVJQQU5FTCk7IGsrKykgeworCQkJCXBvcnRwID0gcGFuZWxwLT5wb3J0c1trXTsKKwkJCQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJCQkJc3RsX2hhbmd1cChwb3J0cC0+dHR5KTsKKwkJCQlpZiAocG9ydHAtPnR4LmJ1ZiAhPSAoY2hhciAqKSBOVUxMKQorCQkJCQlrZnJlZShwb3J0cC0+dHguYnVmKTsKKwkJCQlrZnJlZShwb3J0cCk7CisJCQl9CisJCQlrZnJlZShwYW5lbHApOworCQl9CisKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSk7CisJCWlmIChicmRwLT5pb3NpemUyID4gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjIsIGJyZHAtPmlvc2l6ZTIpOworCisJCWtmcmVlKGJyZHApOworCQlzdGxfYnJkc1tpXSA9IChzdGxicmRfdCAqKSBOVUxMOworCX0KKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCittb2R1bGVfaW5pdChzdGFsbGlvbl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChzdGFsbGlvbl9tb2R1bGVfZXhpdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNoZWNrIGZvciBhbnkgYXJndW1lbnRzIHBhc3NlZCBpbiBvbiB0aGUgbW9kdWxlIGxvYWQgY29tbWFuZCBsaW5lLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9hcmdicmRzKHZvaWQpCit7CisJc3RsY29uZl90CWNvbmY7CisJc3RsYnJkX3QJKmJyZHA7CisJaW50CQlpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9hcmdicmRzKClcbiIpOworI2VuZGlmCisKKwlmb3IgKGkgPSBzdGxfbnJicmRzOyAoaSA8IHN0bF9uYXJncyk7IGkrKykgeworCQltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihjb25mKSk7CisJCWlmIChzdGxfcGFyc2VicmQoJmNvbmYsIHN0bF9icmRzcFtpXSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGJyZHAgPSBzdGxfYWxsb2NicmQoKSkgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCQljb250aW51ZTsKKwkJc3RsX25yYnJkcyA9IGkgKyAxOworCQlicmRwLT5icmRuciA9IGk7CisJCWJyZHAtPmJyZHR5cGUgPSBjb25mLmJyZHR5cGU7CisJCWJyZHAtPmlvYWRkcjEgPSBjb25mLmlvYWRkcjE7CisJCWJyZHAtPmlvYWRkcjIgPSBjb25mLmlvYWRkcjI7CisJCWJyZHAtPmlycSA9IGNvbmYuaXJxOworCQlicmRwLT5pcnF0eXBlID0gY29uZi5pcnF0eXBlOworCQlzdGxfYnJkaW5pdChicmRwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNvbnZlcnQgYW4gYXNjaWkgc3RyaW5nIG51bWJlciBpbnRvIGFuIHVuc2lnbmVkIGxvbmcuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RsX2F0b2woY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcJdmFsOworCWludAkJYmFzZSwgYzsKKwljaGFyCQkqc3A7CisKKwl2YWwgPSAwOworCXNwID0gc3RyOworCWlmICgoKnNwID09ICcwJykgJiYgKCooc3ArMSkgPT0gJ3gnKSkgeworCQliYXNlID0gMTY7CisJCXNwICs9IDI7CisJfSBlbHNlIGlmICgqc3AgPT0gJzAnKSB7CisJCWJhc2UgPSA4OworCQlzcCsrOworCX0gZWxzZSB7CisJCWJhc2UgPSAxMDsKKwl9CisKKwlmb3IgKDsgKCpzcCAhPSAwKTsgc3ArKykgeworCQljID0gKCpzcCA+ICc5JykgPyAoVE9MT1dFUigqc3ApIC0gJ2EnICsgMTApIDogKCpzcCAtICcwJyk7CisJCWlmICgoYyA8IDApIHx8IChjID49IGJhc2UpKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGFyZ3VtZW50ICVzXG4iLCBzdHIpOworCQkJdmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXZhbCA9ICh2YWwgKiBiYXNlKSArIGM7CisJfQorCXJldHVybih2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQYXJzZSB0aGUgc3VwcGxpZWQgYXJndW1lbnQgc3RyaW5nLCBpbnRvIHRoZSBib2FyZCBjb25mIHN0cnVjdC4KKyAqLworCitzdGF0aWMgaW50IHN0bF9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCkKK3sKKwljaGFyCSpzcDsKKwlpbnQJbnJicmRuYW1lcywgaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfcGFyc2VicmQoY29uZnA9JXgsYXJncD0leClcbiIsIChpbnQpIGNvbmZwLCAoaW50KSBhcmdwKTsKKyNlbmRpZgorCisJaWYgKChhcmdwWzBdID09IChjaGFyICopIE5VTEwpIHx8ICgqYXJncFswXSA9PSAwKSkKKwkJcmV0dXJuKDApOworCisJZm9yIChzcCA9IGFyZ3BbMF0sIGkgPSAwOyAoKCpzcCAhPSAwKSAmJiAoaSA8IDI1KSk7IHNwKyssIGkrKykKKwkJKnNwID0gVE9MT1dFUigqc3ApOworCisJbnJicmRuYW1lcyA9IHNpemVvZihzdGxfYnJkc3RyKSAvIHNpemVvZihzdGxicmR0eXBlX3QpOworCWZvciAoaSA9IDA7IChpIDwgbnJicmRuYW1lcyk7IGkrKykgeworCQlpZiAoc3RyY21wKHN0bF9icmRzdHJbaV0ubmFtZSwgYXJncFswXSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBucmJyZG5hbWVzKSB7CisJCXByaW50aygiU1RBTExJT046IHVua25vd24gYm9hcmQgbmFtZSwgJXM/XG4iLCBhcmdwWzBdKTsKKwkJcmV0dXJuKDApOworCX0KKworCWNvbmZwLT5icmR0eXBlID0gc3RsX2JyZHN0cltpXS50eXBlOworCisJaSA9IDE7CisJaWYgKChhcmdwW2ldICE9IChjaGFyICopIE5VTEwpICYmICgqYXJncFtpXSAhPSAwKSkKKwkJY29uZnAtPmlvYWRkcjEgPSBzdGxfYXRvbChhcmdwW2ldKTsKKwlpKys7CisJaWYgKGNvbmZwLT5icmR0eXBlID09IEJSRF9FQ0gpIHsKKwkJaWYgKChhcmdwW2ldICE9IChjaGFyICopIE5VTEwpICYmICgqYXJncFtpXSAhPSAwKSkKKwkJCWNvbmZwLT5pb2FkZHIyID0gc3RsX2F0b2woYXJncFtpXSk7CisJCWkrKzsKKwl9CisJaWYgKChhcmdwW2ldICE9IChjaGFyICopIE5VTEwpICYmICgqYXJncFtpXSAhPSAwKSkKKwkJY29uZnAtPmlycSA9IHN0bF9hdG9sKGFyZ3BbaV0pOworCXJldHVybigxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJTG9jYWwgZHJpdmVyIGtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lLgorICovCisKK3N0YXRpYyB2b2lkICpzdGxfbWVtYWxsb2MoaW50IGxlbikKK3sKKwlyZXR1cm4oKHZvaWQgKikga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQWxsb2NhdGUgYSBuZXcgYm9hcmQgc3RydWN0dXJlLiBGaWxsIG91dCB0aGUgYmFzaWMgaW5mbyBpbiBpdC4KKyAqLworCitzdGF0aWMgc3RsYnJkX3QgKnN0bF9hbGxvY2JyZCh2b2lkKQoreworCXN0bGJyZF90CSpicmRwOworCisJYnJkcCA9IChzdGxicmRfdCAqKSBzdGxfbWVtYWxsb2Moc2l6ZW9mKHN0bGJyZF90KSk7CisJaWYgKGJyZHAgPT0gKHN0bGJyZF90ICopIE5VTEwpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAoc2l6ZT0lZClcbiIsCisJCQlzaXplb2Yoc3RsYnJkX3QpKTsKKwkJcmV0dXJuKChzdGxicmRfdCAqKSBOVUxMKTsKKwl9CisKKwltZW1zZXQoYnJkcCwgMCwgc2l6ZW9mKHN0bGJyZF90KSk7CisJYnJkcC0+bWFnaWMgPSBTVExfQk9BUkRNQUdJQzsKKwlyZXR1cm4oYnJkcCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdGxfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCXN0bGJyZF90CSpicmRwOworCXVuc2lnbmVkIGludAltaW5vcmRldjsKKwlpbnQJCWJyZG5yLCBwYW5lbG5yLCBwb3J0bnIsIHJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9vcGVuKHR0eT0leCxmaWxwPSV4KTogZGV2aWNlPSVzXG4iLCAoaW50KSB0dHksCisJCShpbnQpIGZpbHAsIHR0eS0+bmFtZSk7CisjZW5kaWYKKworCW1pbm9yZGV2ID0gdHR5LT5pbmRleDsKKwlicmRuciA9IE1JTk9SMkJSRChtaW5vcmRldik7CisJaWYgKGJyZG5yID49IHN0bF9ucmJyZHMpCisJCXJldHVybigtRU5PREVWKTsKKwlicmRwID0gc3RsX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJbWlub3JkZXYgPSBNSU5PUjJQT1JUKG1pbm9yZGV2KTsKKwlmb3IgKHBvcnRuciA9IC0xLCBwYW5lbG5yID0gMDsgKHBhbmVsbnIgPCBTVExfTUFYUEFORUxTKTsgcGFuZWxucisrKSB7CisJCWlmIChicmRwLT5wYW5lbHNbcGFuZWxucl0gPT0gKHN0bHBhbmVsX3QgKikgTlVMTCkKKwkJCWJyZWFrOworCQlpZiAobWlub3JkZXYgPCBicmRwLT5wYW5lbHNbcGFuZWxucl0tPm5ycG9ydHMpIHsKKwkJCXBvcnRuciA9IG1pbm9yZGV2OworCQkJYnJlYWs7CisJCX0KKwkJbWlub3JkZXYgLT0gYnJkcC0+cGFuZWxzW3BhbmVsbnJdLT5ucnBvcnRzOworCX0KKwlpZiAocG9ydG5yIDwgMCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJcG9ydHAgPSBicmRwLT5wYW5lbHNbcGFuZWxucl0tPnBvcnRzW3BvcnRucl07CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisvKgorICoJT24gdGhlIGZpcnN0IG9wZW4gb2YgdGhlIGRldmljZSBzZXR1cCB0aGUgcG9ydCBoYXJkd2FyZSwgYW5kCisgKglpbml0aWFsaXplIHRoZSBwZXIgcG9ydCBkYXRhIHN0cnVjdHVyZS4KKyAqLworCXBvcnRwLT50dHkgPSB0dHk7CisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnRwOworCXBvcnRwLT5yZWZjb3VudCsrOworCisJaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkgeworCQlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKSB7CisJCQlwb3J0cC0+dHguYnVmID0gKGNoYXIgKikgc3RsX21lbWFsbG9jKFNUTF9UWEJVRlNJWkUpOworCQkJaWYgKHBvcnRwLT50eC5idWYgPT0gKGNoYXIgKikgTlVMTCkKKwkJCQlyZXR1cm4oLUVOT01FTSk7CisJCQlwb3J0cC0+dHguaGVhZCA9IHBvcnRwLT50eC5idWY7CisJCQlwb3J0cC0+dHgudGFpbCA9IHBvcnRwLT50eC5idWY7CisJCX0KKwkJc3RsX3NldHBvcnQocG9ydHAsIHR0eS0+dGVybWlvcyk7CisJCXBvcnRwLT5zaWdzID0gc3RsX2dldHNpZ25hbHMocG9ydHApOworCQlzdGxfc2V0c2lnbmFscyhwb3J0cCwgMSwgMSk7CisJCXN0bF9lbmFibGVyeHR4KHBvcnRwLCAxLCAxKTsKKwkJc3RsX3N0YXJ0cnh0eChwb3J0cCwgMSwgMCk7CisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwkJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCX0KKworLyoKKyAqCUNoZWNrIGlmIHRoaXMgcG9ydCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNsb3NpbmcuIElmIHNvIHRoZW4gd2FpdAorICoJdW50aWwgaXQgaXMgY2xvc2VkIHRoZW4gcmV0dXJuIGVycm9yIHN0YXR1cywgYmFzZWQgb24gZmxhZyBzZXR0aW5ncy4KKyAqCVRoZSBzbGVlcCBoZXJlIGRvZXMgbm90IG5lZWQgaW50ZXJydXB0IHByb3RlY3Rpb24gc2luY2UgdGhlIHdha2V1cAorICoJZm9yIGl0IGlzIGRvbmUgd2l0aCB0aGUgc2FtZSBjb250ZXh0LgorICovCisJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydHAtPmNsb3NlX3dhaXQpOworCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybigtRUFHQUlOKTsKKwkJcmV0dXJuKC1FUkVTVEFSVFNZUyk7CisJfQorCisvKgorICoJQmFzZWQgb24gdHlwZSBvZiBvcGVuIGJlaW5nIGRvbmUgY2hlY2sgaWYgaXQgY2FuIG92ZXJsYXAgd2l0aCBhbnkKKyAqCXByZXZpb3VzIG9wZW5zIHN0aWxsIGluIGVmZmVjdC4gSWYgd2UgYXJlIGEgbm9ybWFsIHNlcmlhbCBkZXZpY2UKKyAqCXRoZW4gYWxzbyB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgZm9yIGNhcnJpZXIuCisgKi8KKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJaWYgKChyYyA9IHN0bF93YWl0Y2Fycmllcihwb3J0cCwgZmlscCkpICE9IDApCisJCQlyZXR1cm4ocmMpOworCX0KKwlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUG9zc2libHkgbmVlZCB0byB3YWl0IGZvciBjYXJyaWVyIChEQ0Qgc2lnbmFsKSB0byBjb21lIGhpZ2guIFNheQorICoJbWF5YmUgYmVjYXVzZSBpZiB3ZSBhcmUgY2xvY2FsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byB3YWl0Li4uCisgKi8KKworc3RhdGljIGludCBzdGxfd2FpdGNhcnJpZXIoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXJjLCBkb2Nsb2NhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfd2FpdGNhcnJpZXIocG9ydHA9JXgsZmlscD0leClcbiIsIChpbnQpIHBvcnRwLCAoaW50KSBmaWxwKTsKKyNlbmRpZgorCisJcmMgPSAwOworCWRvY2xvY2FsID0gMDsKKworCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb2Nsb2NhbCsrOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJcG9ydHAtPm9wZW53YWl0Y250Kys7CisJaWYgKCEgdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydHAtPnJlZmNvdW50LS07CisKKwlmb3IgKDs7KSB7CisJCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAxLCAxKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICgocG9ydHAtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApKSB7CisJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyYyA9IC1FQlVTWTsKKwkJCWVsc2UKKwkJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpID09IDApICYmCisJCSAgICAoZG9jbG9jYWwgfHwgKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnRwLT5vcGVuX3dhaXQpOworCX0KKworCWlmICghIHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXBvcnRwLT5yZWZjb3VudCsrOworCXBvcnRwLT5vcGVud2FpdGNudC0tOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jbG9zZSh0dHk9JXgsZmlscD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgZmlscCk7CisjZW5kaWYKKworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHBvcnRwLT5yZWZjb3VudCAhPSAxKSkKKwkJcG9ydHAtPnJlZmNvdW50ID0gMTsKKwlpZiAocG9ydHAtPnJlZmNvdW50LS0gPiAxKSB7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcG9ydHAtPnJlZmNvdW50ID0gMDsKKwlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKworLyoKKyAqCU1heSB3YW50IHRvIHdhaXQgZm9yIGFueSBkYXRhIHRvIGRyYWluIGJlZm9yZSBjbG9zaW5nLiBUaGUgQlVTWQorICoJZmxhZyBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIGFyZSBzdGlsbCBzZW5kaW5nIG9yIG5vdCAtIGl0IGlzCisgKgl2ZXJ5IGFjY3VyYXRlIGZvciB0aGUgY2QxNDAwLCBub3QgcXVpdGUgc28gZm9yIHRoZSBzYzI2MTk4LgorICoJKFRoZSBzYzI2MTk4IGhhcyBubyAiZW5kLW9mLWRhdGEiIGludGVycnVwdCBvbmx5IGVtcHR5IEZJRk8pCisgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCWlmIChwb3J0cC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydHAtPmNsb3Npbmdfd2FpdCk7CisJc3RsX3dhaXR1bnRpbHNlbnQodHR5LCAoSFogLyAyKSk7CisKKwlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXN0bF9kaXNhYmxlaW50cnMocG9ydHApOworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKKwkJc3RsX3NldHNpZ25hbHMocG9ydHAsIDAsIDApOworCXN0bF9lbmFibGVyeHR4KHBvcnRwLCAwLCAwKTsKKwlzdGxfZmx1c2hidWZmZXIodHR5KTsKKwlwb3J0cC0+aXN0YXRlID0gMDsKKwlpZiAocG9ydHAtPnR4LmJ1ZiAhPSAoY2hhciAqKSBOVUxMKSB7CisJCWtmcmVlKHBvcnRwLT50eC5idWYpOworCQlwb3J0cC0+dHguYnVmID0gKGNoYXIgKikgTlVMTDsKKwkJcG9ydHAtPnR4LmhlYWQgPSAoY2hhciAqKSBOVUxMOworCQlwb3J0cC0+dHgudGFpbCA9IChjaGFyICopIE5VTEw7CisJfQorCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwl0dHktPmNsb3NpbmcgPSAwOworCXBvcnRwLT50dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTDsKKworCWlmIChwb3J0cC0+b3BlbndhaXRjbnQpIHsKKwkJaWYgKHBvcnRwLT5jbG9zZV9kZWxheSkKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydHAtPmNsb3NlX2RlbGF5KSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7CisJfQorCisJcG9ydHAtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5jbG9zZV93YWl0KTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJV3JpdGUgcm91dGluZS4gVGFrZSBkYXRhIGFuZCBzdHVmZiBpdCBpbiB0byB0aGUgVFggcmluZyBxdWV1ZS4KKyAqCUlmIHRyYW5zbWl0IGludGVycnVwdHMgYXJlIG5vdCBydW5uaW5nIHRoZW4gc3RhcnQgdGhlbS4KKyAqLworCitzdGF0aWMgaW50IHN0bF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGludAlsZW4sIHN0bGVuOworCXVuc2lnbmVkIGNoYXIJKmNoYnVmOworCWNoYXIJCSpoZWFkLCAqdGFpbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfd3JpdGUodHR5PSV4LGJ1Zj0leCxjb3VudD0lZClcbiIsCisJCShpbnQpIHR0eSwgKGludCkgYnVmLCBjb3VudCk7CisjZW5kaWYKKworCWlmICgodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB8fAorCSAgICAoc3RsX3RtcHdyaXRlYnVmID09IChjaGFyICopIE5VTEwpKQorCQlyZXR1cm4oMCk7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKy8qCisgKglJZiBjb3B5aW5nIGRpcmVjdCBmcm9tIHVzZXIgc3BhY2Ugd2UgbXVzdCBjYXRlciBmb3IgcGFnZSBmYXVsdHMsCisgKgljYXVzaW5nIHVzIHRvICJzbGVlcCIgaGVyZSBmb3IgYSB3aGlsZS4gVG8gaGFuZGxlIHRoaXMgY29weSBpbiBhbGwKKyAqCXRoZSBkYXRhIHdlIG5lZWQgbm93LCBpbnRvIGEgbG9jYWwgYnVmZmVyLiBUaGVuIHdoZW4gd2UgZ290IGl0IGFsbAorICoJY29weSBpdCBpbnRvIHRoZSBUWCBidWZmZXIuCisgKi8KKwljaGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKworCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKKwl0YWlsID0gcG9ydHAtPnR4LnRhaWw7CisJaWYgKGhlYWQgPj0gdGFpbCkgeworCQlsZW4gPSBTVExfVFhCVUZTSVpFIC0gKGhlYWQgLSB0YWlsKSAtIDE7CisJCXN0bGVuID0gU1RMX1RYQlVGU0laRSAtIChoZWFkIC0gcG9ydHAtPnR4LmJ1Zik7CisJfSBlbHNlIHsKKwkJbGVuID0gdGFpbCAtIGhlYWQgLSAxOworCQlzdGxlbiA9IGxlbjsKKwl9CisKKwlsZW4gPSBNSU4obGVuLCBjb3VudCk7CisJY291bnQgPSAwOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXN0bGVuID0gTUlOKGxlbiwgc3RsZW4pOworCQltZW1jcHkoaGVhZCwgY2hidWYsIHN0bGVuKTsKKwkJbGVuIC09IHN0bGVuOworCQljaGJ1ZiArPSBzdGxlbjsKKwkJY291bnQgKz0gc3RsZW47CisJCWhlYWQgKz0gc3RsZW47CisJCWlmIChoZWFkID49IChwb3J0cC0+dHguYnVmICsgU1RMX1RYQlVGU0laRSkpIHsKKwkJCWhlYWQgPSBwb3J0cC0+dHguYnVmOworCQkJc3RsZW4gPSB0YWlsIC0gaGVhZDsKKwkJfQorCX0KKwlwb3J0cC0+dHguaGVhZCA9IGhlYWQ7CisKKwljbGVhcl9iaXQoQVNZSV9UWExPVywgJnBvcnRwLT5pc3RhdGUpOworCXN0bF9zdGFydHJ4dHgocG9ydHAsIC0xLCAxKTsKKworCXJldHVybihjb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsX3B1dGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGludAlsZW47CisJY2hhcgkJKmhlYWQsICp0YWlsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9wdXRjaGFyKHR0eT0leCxjaD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgY2gpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlyZXR1cm47CisKKwloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CisJdGFpbCA9IHBvcnRwLT50eC50YWlsOworCisJbGVuID0gKGhlYWQgPj0gdGFpbCkgPyAoU1RMX1RYQlVGU0laRSAtIChoZWFkIC0gdGFpbCkpIDogKHRhaWwgLSBoZWFkKTsKKwlsZW4tLTsKKworCWlmIChsZW4gPiAwKSB7CisJCSpoZWFkKysgPSBjaDsKKwkJaWYgKGhlYWQgPj0gKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSkKKwkJCWhlYWQgPSBwb3J0cC0+dHguYnVmOworCX0JCisJcG9ydHAtPnR4LmhlYWQgPSBoZWFkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJZiB0aGVyZSBhcmUgYW55IGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciB0aGVuIG1ha2Ugc3VyZSB0aGF0IFRYCisgKglpbnRlcnJ1cHRzIGFyZSBvbiBhbmQgZ2V0J2VtIG91dC4gTm9ybWFsbHkgdXNlZCBhZnRlciB0aGUgcHV0Y2hhcgorICoJcm91dGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2ZsdXNoY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9mbHVzaGNoYXJzKHR0eT0leClcbiIsIChpbnQpIHR0eSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJCXJldHVybjsKKworI2lmIDAKKwlpZiAodHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCSAgICAocG9ydHAtPnR4LmhlYWQgPT0gcG9ydHAtPnR4LnRhaWwpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzdGxfc3RhcnRyeHR4KHBvcnRwLCAtMSwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdGxfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwljaGFyCQkqaGVhZCwgKnRhaWw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3dyaXRlcm9vbSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CisJdGFpbCA9IHBvcnRwLT50eC50YWlsOworCXJldHVybigoaGVhZCA+PSB0YWlsKSA/IChTVExfVFhCVUZTSVpFIC0gKGhlYWQgLSB0YWlsKSAtIDEpIDogKHRhaWwgLSBoZWFkIC0gMSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBUWCBidWZmZXIuIE5vcm1hbGx5IHdlIHdvdWxkIGp1c3QKKyAqCWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBidWZmZXIgYW5kIHJldHVybiB0aGF0LCBidXQgaWYKKyAqCXRoZSBidWZmZXIgaXMgZW1wdHkgYW5kIFRYIGludGVycnVwdHMgYXJlIHN0aWxsIG9uIHRoZW4gd2UgcmV0dXJuCisgKgl0aGF0IHRoZSBidWZmZXIgc3RpbGwgaGFzIDEgY2hhciBpbiBpdC4gVGhpcyB3YXkgd2hvZXZlciBjYWxsZWQgdXMKKyAqCXdpbGwgbm90IHRoaW5rIHRoYXQgQUxMIGNoYXJzIGhhdmUgZHJhaW5lZCAtIHNpbmNlIHRoZSBVQVJUIHN0aWxsCisgKgltdXN0IGhhdmUgc29tZSBjaGFycyBpbiBpdCAod2UgYXJlIGJ1c3kgYWZ0ZXIgYWxsKS4KKyAqLworCitzdGF0aWMgaW50IHN0bF9jaGFyc2luYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBpbnQJc2l6ZTsKKwljaGFyCQkqaGVhZCwgKnRhaWw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NoYXJzaW5idWZmZXIodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHBvcnRwLT50eC5idWYgPT0gKGNoYXIgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCisJaGVhZCA9IHBvcnRwLT50eC5oZWFkOworCXRhaWwgPSBwb3J0cC0+dHgudGFpbDsKKwlzaXplID0gKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDogKFNUTF9UWEJVRlNJWkUgLSAodGFpbCAtIGhlYWQpKTsKKwlpZiAoKHNpemUgPT0gMCkgJiYgdGVzdF9iaXQoQVNZSV9UWEJVU1ksICZwb3J0cC0+aXN0YXRlKSkKKwkJc2l6ZSA9IDE7CisJcmV0dXJuKHNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglHZW5lcmF0ZSB0aGUgc2VyaWFsIHN0cnVjdCBpbmZvLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2dldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0CXNpbzsKKwlzdGxicmRfdAkJKmJyZHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2dldHNlcmlhbChwb3J0cD0leCxzcD0leClcbiIsIChpbnQpIHBvcnRwLCAoaW50KSBzcCk7CisjZW5kaWYKKworCW1lbXNldCgmc2lvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKTsKKwlzaW8ubGluZSA9IHBvcnRwLT5wb3J0bnI7CisJc2lvLnBvcnQgPSBwb3J0cC0+aW9hZGRyOworCXNpby5mbGFncyA9IHBvcnRwLT5mbGFnczsKKwlzaW8uYmF1ZF9iYXNlID0gcG9ydHAtPmJhdWRfYmFzZTsKKwlzaW8uY2xvc2VfZGVsYXkgPSBwb3J0cC0+Y2xvc2VfZGVsYXk7CisJc2lvLmNsb3Npbmdfd2FpdCA9IHBvcnRwLT5jbG9zaW5nX3dhaXQ7CisJc2lvLmN1c3RvbV9kaXZpc29yID0gcG9ydHAtPmN1c3RvbV9kaXZpc29yOworCXNpby5odWI2ID0gMDsKKwlpZiAocG9ydHAtPnVhcnRwID09ICZzdGxfY2QxNDAwdWFydCkgeworCQlzaW8udHlwZSA9IFBPUlRfQ0lSUlVTOworCQlzaW8ueG1pdF9maWZvX3NpemUgPSBDRDE0MDBfVFhGSUZPU0laRTsKKwl9IGVsc2UgeworCQlzaW8udHlwZSA9IFBPUlRfVU5LTk9XTjsKKwkJc2lvLnhtaXRfZmlmb19zaXplID0gU0MyNjE5OF9UWEZJRk9TSVpFOworCX0KKworCWJyZHAgPSBzdGxfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwICE9IChzdGxicmRfdCAqKSBOVUxMKQorCQlzaW8uaXJxID0gYnJkcC0+aXJxOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihzcCwgJnNpbywgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2V0IHBvcnQgYWNjb3JkaW5nIHRvIHRoZSBzZXJpYWwgc3RydWN0IGluZm8uCisgKglBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCBkbyBhbnkgYXV0by1jb25maWd1cmUgc3R1ZmYsIHNvIHdlIHdpbGwKKyAqCWp1c3QgcXVpZXRseSBpZ25vcmUgYW55IHJlcXVlc3RzIHRvIGNoYW5nZSBpcnEsIGV0Yy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9zZXRzZXJpYWwoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdAlzaW87CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NldHNlcmlhbChwb3J0cD0leCxzcD0leClcbiIsIChpbnQpIHBvcnRwLCAoaW50KSBzcCk7CisjZW5kaWYKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2lvLCBzcCwgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHNpby5iYXVkX2Jhc2UgIT0gcG9ydHAtPmJhdWRfYmFzZSkgfHwKKwkJICAgIChzaW8uY2xvc2VfZGVsYXkgIT0gcG9ydHAtPmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKChzaW8uZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CisJCSAgICAocG9ydHAtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4oLUVQRVJNKTsKKwl9IAorCisJcG9ydHAtPmZsYWdzID0gKHBvcnRwLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkoc2lvLmZsYWdzICYgQVNZTkNfVVNSX01BU0spOworCXBvcnRwLT5iYXVkX2Jhc2UgPSBzaW8uYmF1ZF9iYXNlOworCXBvcnRwLT5jbG9zZV9kZWxheSA9IHNpby5jbG9zZV9kZWxheTsKKwlwb3J0cC0+Y2xvc2luZ193YWl0ID0gc2lvLmNsb3Npbmdfd2FpdDsKKwlwb3J0cC0+Y3VzdG9tX2Rpdmlzb3IgPSBzaW8uY3VzdG9tX2Rpdmlzb3I7CisJc3RsX3NldHBvcnQocG9ydHAsIHBvcnRwLT50dHktPnRlcm1pb3MpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4oLUVJTyk7CisKKwlyZXR1cm4gc3RsX2dldHNpZ25hbHMocG9ydHApOworfQorCitzdGF0aWMgaW50IHN0bF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCWludCBydHMgPSAtMSwgZHRyID0gLTE7CisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybigtRUlPKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCXJ0cyA9IDE7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJZHRyID0gMTsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXJ0cyA9IDA7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlkdHIgPSAwOworCisJc3RsX3NldHNpZ25hbHMocG9ydHAsIGR0ciwgcnRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGxfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CWl2YWw7CisJaW50CQlyYzsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfaW9jdGwodHR5PSV4LGZpbGU9JXgsY21kPSV4LGFyZz0leClcbiIsCisJCShpbnQpIHR0eSwgKGludCkgZmlsZSwgY21kLCAoaW50KSBhcmcpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorIAkgICAgKGNtZCAhPSBDT01fR0VUUE9SVFNUQVRTKSAmJiAoY21kICE9IENPTV9DTFJQT1JUU1RBVFMpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJCXJldHVybigtRUlPKTsKKwl9CisKKwlyYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyYyA9IHB1dF91c2VyKCgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSA/IDEgOiAwKSwKKwkJCSh1bnNpZ25lZCBfX3VzZXIgKikgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJKGl2YWwgPyBDTE9DQUwgOiAwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmMgPSBzdGxfZ2V0c2VyaWFsKHBvcnRwLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmMgPSBzdGxfc2V0c2VyaWFsKHBvcnRwLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgorCQlyYyA9IHN0bF9nZXRwb3J0c3RhdHMocG9ydHAsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIENPTV9DTFJQT1JUU1RBVFM6CisJCXJjID0gc3RsX2NscnBvcnRzdGF0cyhwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NFUkNPTkZJRzoKKwljYXNlIFRJT0NTRVJHV0lMRDoKKwljYXNlIFRJT0NTRVJTV0lMRDoKKwljYXNlIFRJT0NTRVJHRVRMU1I6CisJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwljYXNlIFRJT0NTRVJHRVRNVUxUSToKKwljYXNlIFRJT0NTRVJTRVRNVUxUSToKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHRlcm1pb3MJKnRpb3NwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zZXR0ZXJtaW9zKHR0eT0leCxvbGQ9JXgpXG4iLCAoaW50KSB0dHksIChpbnQpIG9sZCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJdGlvc3AgPSB0dHktPnRlcm1pb3M7CisJaWYgKCh0aW9zcC0+Y19jZmxhZyA9PSBvbGQtPmNfY2ZsYWcpICYmCisJICAgICh0aW9zcC0+Y19pZmxhZyA9PSBvbGQtPmNfaWZsYWcpKQorCQlyZXR1cm47CisKKwlzdGxfc2V0cG9ydChwb3J0cCwgdGlvc3ApOworCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAoKHRpb3NwLT5jX2NmbGFnICYgKENCQVVEICYgfkNCQVVERVgpKSA/IDEgOiAwKSwKKwkJLTEpOworCWlmICgob2xkLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgKCh0aW9zcC0+Y19jZmxhZyAmIENSVFNDVFMpID09IDApKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCXN0bF9zdGFydCh0dHkpOworCX0KKwlpZiAoKChvbGQtPmNfY2ZsYWcgJiBDTE9DQUwpID09IDApICYmICh0aW9zcC0+Y19jZmxhZyAmIENMT0NBTCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUF0dGVtcHQgdG8gZmxvdyBjb250cm9sIHdobyBldmVyIGlzIHNlbmRpbmcgdXMgZGF0YS4gQmFzZWQgb24gdGVybWlvcworICoJc2V0dGluZ3MgdXNlIHNvZnR3YXJlIG9yL2FuZCBoYXJkd2FyZSBmbG93IGNvbnRyb2wuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfdGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJc3RsX2Zsb3djdHJsKHBvcnRwLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVW5mbG93IGNvbnRyb2wgdGhlIGRldmljZSBzZW5kaW5nIHVzIGRhdGEuLi4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3VudGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJc3RsX2Zsb3djdHJsKHBvcnRwLCAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RvcCB0aGUgdHJhbnNtaXR0ZXIuIEJhc2ljYWxseSB0byBkbyB0aGlzIHdlIHdpbGwganVzdCB0dXJuIFRYCisgKglpbnRlcnJ1cHRzIG9mZi4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3N0b3AodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJc3RsX3N0YXJ0cnh0eChwb3J0cCwgLTEsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTdGFydCB0aGUgdHJhbnNtaXR0ZXIgYWdhaW4uIEp1c3QgdHVybiBUWCBpbnRlcnJ1cHRzIGJhY2sgb24uCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc3RhcnQodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJc3RsX3N0YXJ0cnh0eChwb3J0cCwgLTEsIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglIYW5ndXAgdGhpcyBwb3J0LiBUaGlzIGlzIHByZXR0eSBtdWNoIGxpa2UgY2xvc2luZyB0aGUgcG9ydCwgb25seQorICoJYSBsaXR0bGUgbW9yZSBicnV0YWwuIE5vIHdhaXRpbmcgZm9yIGRhdGEgdG8gZHJhaW4uIFNodXRkb3duIHRoZQorICoJcG9ydCBhbmQgbWF5YmUgZHJvcCBzaWduYWxzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9oYW5ndXAodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXN0bF9kaXNhYmxlaW50cnMocG9ydHApOworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKKwkJc3RsX3NldHNpZ25hbHMocG9ydHAsIDAsIDApOworCXN0bF9lbmFibGVyeHR4KHBvcnRwLCAwLCAwKTsKKwlzdGxfZmx1c2hidWZmZXIodHR5KTsKKwlwb3J0cC0+aXN0YXRlID0gMDsKKwlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOworCWlmIChwb3J0cC0+dHguYnVmICE9IChjaGFyICopIE5VTEwpIHsKKwkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7CisJCXBvcnRwLT50eC5idWYgPSAoY2hhciAqKSBOVUxMOworCQlwb3J0cC0+dHguaGVhZCA9IChjaGFyICopIE5VTEw7CisJCXBvcnRwLT50eC50YWlsID0gKGNoYXIgKikgTlVMTDsKKwl9CisJcG9ydHAtPnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCXBvcnRwLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlwb3J0cC0+cmVmY291bnQgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsX2ZsdXNoYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfZmx1c2hidWZmZXIodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzdGxfZmx1c2gocG9ydHApOworCXR0eV93YWtldXAodHR5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfYnJlYWtjdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2JyZWFrY3RsKHR0eT0leCxzdGF0ZT0lZClcbiIsIChpbnQpIHR0eSwgc3RhdGUpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXN0bF9zZW5kYnJlYWsocG9ydHAsICgoc3RhdGUgPT0gLTEpID8gMSA6IDIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfd2FpdHVudGlsc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJdGVuZDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfd2FpdHVudGlsc2VudCh0dHk9JXgsdGltZW91dD0lZClcbiIsIChpbnQpIHR0eSwgdGltZW91dCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJdGltZW91dCA9IEhaOworCXRlbmQgPSBqaWZmaWVzICsgdGltZW91dDsKKworCXdoaWxlIChzdGxfZGF0YXN0YXRlKHBvcnRwKSkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0ZW5kKSkKKwkJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfc2VuZHhjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2VuZHhjaGFyKHR0eT0leCxjaD0leClcbiIsIChpbnQpIHR0eSwgY2gpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCWlmIChjaCA9PSBTVE9QX0NIQVIodHR5KSkKKwkJc3RsX3NlbmRmbG93KHBvcnRwLCAwKTsKKwllbHNlIGlmIChjaCA9PSBTVEFSVF9DSEFSKHR0eSkpCisJCXN0bF9zZW5kZmxvdyhwb3J0cCwgMSk7CisJZWxzZQorCQlzdGxfcHV0Y2hhcih0dHksIGNoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCU1BWExJTkUJCTgwCisKKy8qCisgKglGb3JtYXQgaW5mbyBmb3IgYSBzcGVjaWZpZWQgcG9ydC4gVGhlIGxpbmUgaXMgZGVsaWJlcmF0ZWx5IGxpbWl0ZWQKKyAqCXRvIDgwIGNoYXJhY3RlcnMuIChJZiBpdCBpcyB0b28gbG9uZyBpdCB3aWxsIGJlIHRydW5jYXRlZCwgaWYgdG9vCisgKglzaG9ydCB0aGVuIHBhZGRlZCB3aXRoIHNwYWNlcykuCisgKi8KKworc3RhdGljIGludCBzdGxfcG9ydGluZm8oc3RscG9ydF90ICpwb3J0cCwgaW50IHBvcnRuciwgY2hhciAqcG9zKQoreworCWNoYXIJKnNwOworCWludAlzaWdzLCBjbnQ7CisKKwlzcCA9IHBvczsKKwlzcCArPSBzcHJpbnRmKHNwLCAiJWQ6IHVhcnQ6JXMgdHg6JWQgcng6JWQiLAorCQlwb3J0bnIsIChwb3J0cC0+aHdpZCA9PSAxKSA/ICJTQzI2MTk4IiA6ICJDRDE0MDAiLAorCQkoaW50KSBwb3J0cC0+c3RhdHMudHh0b3RhbCwgKGludCkgcG9ydHAtPnN0YXRzLnJ4dG90YWwpOworCisJaWYgKHBvcnRwLT5zdGF0cy5yeGZyYW1pbmcpCisJCXNwICs9IHNwcmludGYoc3AsICIgZmU6JWQiLCAoaW50KSBwb3J0cC0+c3RhdHMucnhmcmFtaW5nKTsKKwlpZiAocG9ydHAtPnN0YXRzLnJ4cGFyaXR5KQorCQlzcCArPSBzcHJpbnRmKHNwLCAiIHBlOiVkIiwgKGludCkgcG9ydHAtPnN0YXRzLnJ4cGFyaXR5KTsKKwlpZiAocG9ydHAtPnN0YXRzLnJ4YnJlYWtzKQorCQlzcCArPSBzcHJpbnRmKHNwLCAiIGJyazolZCIsIChpbnQpIHBvcnRwLT5zdGF0cy5yeGJyZWFrcyk7CisJaWYgKHBvcnRwLT5zdGF0cy5yeG92ZXJydW4pCisJCXNwICs9IHNwcmludGYoc3AsICIgb2U6JWQiLCAoaW50KSBwb3J0cC0+c3RhdHMucnhvdmVycnVuKTsKKworCXNpZ3MgPSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7CisJY250ID0gc3ByaW50ZihzcCwgIiVzJXMlcyVzJXMgIiwKKwkJKHNpZ3MgJiBUSU9DTV9SVFMpID8gInxSVFMiIDogIiIsCisJCShzaWdzICYgVElPQ01fQ1RTKSA/ICJ8Q1RTIiA6ICIiLAorCQkoc2lncyAmIFRJT0NNX0RUUikgPyAifERUUiIgOiAiIiwKKwkJKHNpZ3MgJiBUSU9DTV9DRCkgPyAifERDRCIgOiAiIiwKKwkJKHNpZ3MgJiBUSU9DTV9EU1IpID8gInxEU1IiIDogIiIpOworCSpzcCA9ICcgJzsKKwlzcCArPSBjbnQ7CisKKwlmb3IgKGNudCA9IChzcCAtIHBvcyk7IChjbnQgPCAoTUFYTElORSAtIDEpKTsgY250KyspCisJCSpzcCsrID0gJyAnOworCWlmIChjbnQgPj0gTUFYTElORSkKKwkJcG9zWyhNQVhMSU5FIC0gMildID0gJysnOworCXBvc1soTUFYTElORSAtIDEpXSA9ICdcbic7CisKKwlyZXR1cm4oTUFYTElORSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVBvcnQgaW5mbywgcmVhZCBmcm9tIHRoZSAvcHJvYyBmaWxlIHN5c3RlbS4KKyAqLworCitzdGF0aWMgaW50IHN0bF9yZWFkcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdGxicmRfdAkqYnJkcDsKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJc3RscG9ydF90CSpwb3J0cDsKKwlpbnQJCWJyZG5yLCBwYW5lbG5yLCBwb3J0bnIsIHRvdGFscG9ydDsKKwlpbnQJCWN1cm9mZiwgbWF4b2ZmOworCWNoYXIJCSpwb3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3JlYWRwcm9jKHBhZ2U9JXgsc3RhcnQ9JXgsb2ZmPSV4LGNvdW50PSVkLGVvZj0leCwiCisJCSJkYXRhPSV4XG4iLCAoaW50KSBwYWdlLCAoaW50KSBzdGFydCwgKGludCkgb2ZmLCBjb3VudCwKKwkJKGludCkgZW9mLCAoaW50KSBkYXRhKTsKKyNlbmRpZgorCisJcG9zID0gcGFnZTsKKwl0b3RhbHBvcnQgPSAwOworCWN1cm9mZiA9IDA7CisKKwlpZiAob2ZmID09IDApIHsKKwkJcG9zICs9IHNwcmludGYocG9zLCAiJXM6IHZlcnNpb24gJXMiLCBzdGxfZHJ2dGl0bGUsCisJCQlzdGxfZHJ2dmVyc2lvbik7CisJCXdoaWxlIChwb3MgPCAocGFnZSArIE1BWExJTkUgLSAxKSkKKwkJCSpwb3MrKyA9ICcgJzsKKwkJKnBvcysrID0gJ1xuJzsKKwl9CisJY3Vyb2ZmID0gIE1BWExJTkU7CisKKy8qCisgKglXZSBzY2FuIHRocm91Z2ggZm9yIGVhY2ggYm9hcmQsIHBhbmVsIGFuZCBwb3J0LiBUaGUgb2Zmc2V0IGlzCisgKgljYWxjdWxhdGVkIG9uIHRoZSBmbHksIGFuZCBpcnJlbGV2YW50IHBvcnRzIGFyZSBza2lwcGVkLgorICovCisJZm9yIChicmRuciA9IDA7IChicmRuciA8IHN0bF9ucmJyZHMpOyBicmRucisrKSB7CisJCWJyZHAgPSBzdGxfYnJkc1ticmRucl07CisJCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQkJY29udGludWU7CisJCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQkJY29udGludWU7CisKKwkJbWF4b2ZmID0gY3Vyb2ZmICsgKGJyZHAtPm5ycG9ydHMgKiBNQVhMSU5FKTsKKwkJaWYgKG9mZiA+PSBtYXhvZmYpIHsKKwkJCWN1cm9mZiA9IG1heG9mZjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdG90YWxwb3J0ID0gYnJkbnIgKiBTVExfTUFYUE9SVFM7CisJCWZvciAocGFuZWxuciA9IDA7IChwYW5lbG5yIDwgYnJkcC0+bnJwYW5lbHMpOyBwYW5lbG5yKyspIHsKKwkJCXBhbmVscCA9IGJyZHAtPnBhbmVsc1twYW5lbG5yXTsKKwkJCWlmIChwYW5lbHAgPT0gKHN0bHBhbmVsX3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJbWF4b2ZmID0gY3Vyb2ZmICsgKHBhbmVscC0+bnJwb3J0cyAqIE1BWExJTkUpOworCQkJaWYgKG9mZiA+PSBtYXhvZmYpIHsKKwkJCQljdXJvZmYgPSBtYXhvZmY7CisJCQkJdG90YWxwb3J0ICs9IHBhbmVscC0+bnJwb3J0czsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9yIChwb3J0bnIgPSAwOyAocG9ydG5yIDwgcGFuZWxwLT5ucnBvcnRzKTsgcG9ydG5yKyssCisJCQkgICAgdG90YWxwb3J0KyspIHsKKwkJCQlwb3J0cCA9IHBhbmVscC0+cG9ydHNbcG9ydG5yXTsKKwkJCQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAob2ZmID49IChjdXJvZmYgKz0gTUFYTElORSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgocG9zIC0gcGFnZSArIE1BWExJTkUpID4gY291bnQpCisJCQkJCWdvdG8gc3RsX3JlYWRkb25lOworCQkJCXBvcyArPSBzdGxfcG9ydGluZm8ocG9ydHAsIHRvdGFscG9ydCwgcG9zKTsKKwkJCX0KKwkJfQorCX0KKworCSplb2YgPSAxOworCitzdGxfcmVhZGRvbmU6CisJKnN0YXJ0ID0gcGFnZTsKKwlyZXR1cm4ocG9zIC0gcGFnZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUFsbCBib2FyZCBpbnRlcnJ1cHRzIGFyZSB2ZWN0b3JlZCB0aHJvdWdoIGhlcmUgZmlyc3QuIFRoaXMgY29kZSB0aGVuCisgKgljYWxscyBvZmYgdG8gdGhlIGFwcHJvcnByaWF0ZSBib2FyZCBpbnRlcnJ1cHQgaGFuZGxlcnMuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHN0bF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RsYnJkX3QJKmJyZHAgPSAoc3RsYnJkX3QgKikgZGV2X2lkOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9pbnRyKGJyZHA9JXgsaXJxPSVkLHJlZ3M9JXgpXG4iLCAoaW50KSBicmRwLCBpcnEsCisJICAgIChpbnQpIHJlZ3MpOworI2VuZGlmCisKKwlyZXR1cm4gSVJRX1JFVFZBTCgoKiBicmRwLT5pc3IpKGJyZHApKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgRWFzeUlPIGJvYXJkIHR5cGVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2Vpb2ludHIoc3RsYnJkX3QgKmJyZHApCit7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlpb2Jhc2U7CisJaW50CQloYW5kbGVkID0gMDsKKworCXBhbmVscCA9IGJyZHAtPnBhbmVsc1swXTsKKwlpb2Jhc2UgPSBwYW5lbHAtPmlvYmFzZTsKKwl3aGlsZSAoaW5iKGJyZHAtPmlvc3RhdHVzKSAmIEVJT19JTlRSUEVORCkgeworCQloYW5kbGVkID0gMTsKKwkJKCogcGFuZWxwLT5pc3IpKHBhbmVscCwgaW9iYXNlKTsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIEVDSC1BVCBib2FyZCB0eXBlcy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9lY2hhdGludHIoc3RsYnJkX3QgKmJyZHApCit7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlpb2FkZHI7CisJaW50CQlibmtucjsKKwlpbnQJCWhhbmRsZWQgPSAwOworCisJb3V0YigoYnJkcC0+aW9jdHJsdmFsIHwgRUNIX0JSREVOQUJMRSksIGJyZHAtPmlvY3RybCk7CisKKwl3aGlsZSAoaW5iKGJyZHAtPmlvc3RhdHVzKSAmIEVDSF9JTlRSUEVORCkgeworCQloYW5kbGVkID0gMTsKKwkJZm9yIChibmtuciA9IDA7IChibmtuciA8IGJyZHAtPm5yYm5rcyk7IGJua25yKyspIHsKKwkJCWlvYWRkciA9IGJyZHAtPmJua3N0YXRhZGRyW2Jua25yXTsKKwkJCWlmIChpbmIoaW9hZGRyKSAmIEVDSF9QTkxJTlRSUEVORCkgeworCQkJCXBhbmVscCA9IGJyZHAtPmJuazJwYW5lbFtibmtucl07CisJCQkJKCogcGFuZWxwLT5pc3IpKHBhbmVscCwgKGlvYWRkciAmIDB4ZmZmYykpOworCQkJfQorCQl9CisJfQorCisJb3V0YigoYnJkcC0+aW9jdHJsdmFsIHwgRUNIX0JSRERJU0FCTEUpLCBicmRwLT5pb2N0cmwpOworCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIEVDSC1NQ0EgYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxfZWNobWNhaW50cihzdGxicmRfdCAqYnJkcCkKK3sKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJdW5zaWduZWQgaW50CWlvYWRkcjsKKwlpbnQJCWJua25yOworCWludAkJaGFuZGxlZCA9IDA7CisKKwl3aGlsZSAoaW5iKGJyZHAtPmlvc3RhdHVzKSAmIEVDSF9JTlRSUEVORCkgeworCQloYW5kbGVkID0gMTsKKwkJZm9yIChibmtuciA9IDA7IChibmtuciA8IGJyZHAtPm5yYm5rcyk7IGJua25yKyspIHsKKwkJCWlvYWRkciA9IGJyZHAtPmJua3N0YXRhZGRyW2Jua25yXTsKKwkJCWlmIChpbmIoaW9hZGRyKSAmIEVDSF9QTkxJTlRSUEVORCkgeworCQkJCXBhbmVscCA9IGJyZHAtPmJuazJwYW5lbFtibmtucl07CisJCQkJKCogcGFuZWxwLT5pc3IpKHBhbmVscCwgKGlvYWRkciAmIDB4ZmZmYykpOworCQkJfQorCQl9CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBFQ0gtUENJIGJvYXJkIHR5cGVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2VjaHBjaWludHIoc3RsYnJkX3QgKmJyZHApCit7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlpb2FkZHI7CisJaW50CQlibmtuciwgcmVjaGVjazsKKwlpbnQJCWhhbmRsZWQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJcmVjaGVjayA9IDA7CisJCWZvciAoYm5rbnIgPSAwOyAoYm5rbnIgPCBicmRwLT5ucmJua3MpOyBibmtucisrKSB7CisJCQlvdXRiKGJyZHAtPmJua3BhZ2VhZGRyW2Jua25yXSwgYnJkcC0+aW9jdHJsKTsKKwkJCWlvYWRkciA9IGJyZHAtPmJua3N0YXRhZGRyW2Jua25yXTsKKwkJCWlmIChpbmIoaW9hZGRyKSAmIEVDSF9QTkxJTlRSUEVORCkgeworCQkJCXBhbmVscCA9IGJyZHAtPmJuazJwYW5lbFtibmtucl07CisJCQkJKCogcGFuZWxwLT5pc3IpKHBhbmVscCwgKGlvYWRkciAmIDB4ZmZmYykpOworCQkJCXJlY2hlY2srKzsKKwkJCQloYW5kbGVkID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoISByZWNoZWNrKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBFQ0gtOC82NC1QQ0kgYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxfZWNocGNpNjRpbnRyKHN0bGJyZF90ICpicmRwKQoreworCXN0bHBhbmVsX3QJKnBhbmVscDsKKwl1bnNpZ25lZCBpbnQJaW9hZGRyOworCWludAkJYm5rbnI7CisJaW50CQloYW5kbGVkID0gMDsKKworCXdoaWxlIChpbmIoYnJkcC0+aW9jdHJsKSAmIDB4MSkgeworCQloYW5kbGVkID0gMTsKKwkJZm9yIChibmtuciA9IDA7IChibmtuciA8IGJyZHAtPm5yYm5rcyk7IGJua25yKyspIHsKKwkJCWlvYWRkciA9IGJyZHAtPmJua3N0YXRhZGRyW2Jua25yXTsKKwkJCWlmIChpbmIoaW9hZGRyKSAmIEVDSF9QTkxJTlRSUEVORCkgeworCQkJCXBhbmVscCA9IGJyZHAtPmJuazJwYW5lbFtibmtucl07CisJCQkJKCogcGFuZWxwLT5pc3IpKHBhbmVscCwgKGlvYWRkciAmIDB4ZmZmYykpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNlcnZpY2UgYW4gb2ZmLWxldmVsIHJlcXVlc3QgZm9yIHNvbWUgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgc3RsX29mZmludHIodm9pZCAqcHJpdmF0ZSkKK3sKKwlzdGxwb3J0X3QJCSpwb3J0cDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCXVuc2lnbmVkIGludAkJb2xkc2lnczsKKworCXBvcnRwID0gcHJpdmF0ZTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfb2ZmaW50cihwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICh0ZXN0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSkpIHsKKwkJdHR5X3dha2V1cCh0dHkpOworCX0KKwlpZiAodGVzdF9iaXQoQVNZSV9EQ0RDSEFOR0UsICZwb3J0cC0+aXN0YXRlKSkgeworCQljbGVhcl9iaXQoQVNZSV9EQ0RDSEFOR0UsICZwb3J0cC0+aXN0YXRlKTsKKwkJb2xkc2lncyA9IHBvcnRwLT5zaWdzOworCQlwb3J0cC0+c2lncyA9IHN0bF9nZXRzaWduYWxzKHBvcnRwKTsKKwkJaWYgKChwb3J0cC0+c2lncyAmIFRJT0NNX0NEKSAmJiAoKG9sZHNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5vcGVuX3dhaXQpOworCQlpZiAoKG9sZHNpZ3MgJiBUSU9DTV9DRCkgJiYgKChwb3J0cC0+c2lncyAmIFRJT0NNX0NEKSA9PSAwKSkgeworCQkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKQorCQkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUluaXRpYWxpemUgYWxsIHRoZSBwb3J0cyBvbiBhIHBhbmVsLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHN0bF9pbml0cG9ydHMoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCWludAkJY2hpcG1hc2ssIGk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2luaXRwb3J0cyhicmRwPSV4LHBhbmVscD0leClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBhbmVscCk7CisjZW5kaWYKKworCWNoaXBtYXNrID0gc3RsX3BhbmVsaW5pdChicmRwLCBwYW5lbHApOworCisvKgorICoJQWxsIFVBUlQncyBhcmUgaW5pdGlhbGl6ZWQgKGlmIGZvdW5kISkuIE5vdyBnbyB0aHJvdWdoIGFuZCBzZXR1cAorICoJZWFjaCBwb3J0cyBkYXRhIHN0cnVjdHVyZXMuCisgKi8KKwlmb3IgKGkgPSAwOyAoaSA8IHBhbmVscC0+bnJwb3J0cyk7IGkrKykgeworCQlwb3J0cCA9IChzdGxwb3J0X3QgKikgc3RsX21lbWFsbG9jKHNpemVvZihzdGxwb3J0X3QpKTsKKwkJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkgeworCQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJIihzaXplPSVkKVxuIiwgc2l6ZW9mKHN0bHBvcnRfdCkpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KHBvcnRwLCAwLCBzaXplb2Yoc3RscG9ydF90KSk7CisKKwkJcG9ydHAtPm1hZ2ljID0gU1RMX1BPUlRNQUdJQzsKKwkJcG9ydHAtPnBvcnRuciA9IGk7CisJCXBvcnRwLT5icmRuciA9IHBhbmVscC0+YnJkbnI7CisJCXBvcnRwLT5wYW5lbG5yID0gcGFuZWxwLT5wYW5lbG5yOworCQlwb3J0cC0+dWFydHAgPSBwYW5lbHAtPnVhcnRwOworCQlwb3J0cC0+Y2xrID0gYnJkcC0+Y2xrOworCQlwb3J0cC0+YmF1ZF9iYXNlID0gU1RMX0JBVURCQVNFOworCQlwb3J0cC0+Y2xvc2VfZGVsYXkgPSBTVExfQ0xPU0VERUxBWTsKKwkJcG9ydHAtPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisJCUlOSVRfV09SSygmcG9ydHAtPnRxdWV1ZSwgc3RsX29mZmludHIsIHBvcnRwKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnRwLT5jbG9zZV93YWl0KTsKKwkJcG9ydHAtPnN0YXRzLmJyZCA9IHBvcnRwLT5icmRucjsKKwkJcG9ydHAtPnN0YXRzLnBhbmVsID0gcG9ydHAtPnBhbmVsbnI7CisJCXBvcnRwLT5zdGF0cy5wb3J0ID0gcG9ydHAtPnBvcnRucjsKKwkJcGFuZWxwLT5wb3J0c1tpXSA9IHBvcnRwOworCQlzdGxfcG9ydGluaXQoYnJkcCwgcGFuZWxwLCBwb3J0cCk7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcnkgdG8gZmluZCBhbmQgaW5pdGlhbGl6ZSBhbiBFYXN5SU8gYm9hcmQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc3RsX2luaXRlaW8oc3RsYnJkX3QgKmJyZHApCit7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlzdGF0dXM7CisJY2hhcgkJKm5hbWU7CisJaW50CQlyYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfaW5pdGVpbyhicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCWJyZHAtPmlvY3RybCA9IGJyZHAtPmlvYWRkcjEgKyAxOworCWJyZHAtPmlvc3RhdHVzID0gYnJkcC0+aW9hZGRyMSArIDI7CisKKwlzdGF0dXMgPSBpbmIoYnJkcC0+aW9zdGF0dXMpOworCWlmICgoc3RhdHVzICYgRUlPX0lEQklUTUFTSykgPT0gRUlPX01LMykKKwkJYnJkcC0+aW9jdHJsKys7CisKKy8qCisgKglIYW5kbGUgYm9hcmQgc3BlY2lmaWMgc3R1ZmYgbm93LiBUaGUgcmVhbCBkaWZmZXJlbmNlIGlzIFBDSQorICoJb3Igbm90IFBDSS4KKyAqLworCWlmIChicmRwLT5icmR0eXBlID09IEJSRF9FQVNZSU9QQ0kpIHsKKwkJYnJkcC0+aW9zaXplMSA9IDB4ODA7CisJCWJyZHAtPmlvc2l6ZTIgPSAweDgwOworCQluYW1lID0gInNlcmlhbChFSU8tUENJKSI7CisJCW91dGIoMHg0MSwgKGJyZHAtPmlvYWRkcjIgKyAweDRjKSk7CisJfSBlbHNlIHsKKwkJYnJkcC0+aW9zaXplMSA9IDg7CisJCW5hbWUgPSAic2VyaWFsKEVJTykiOworCQlpZiAoKGJyZHAtPmlycSA8IDApIHx8IChicmRwLT5pcnEgPiAxNSkgfHwKKwkJICAgIChzdGxfdmVjbWFwW2JyZHAtPmlycV0gPT0gKHVuc2lnbmVkIGNoYXIpIDB4ZmYpKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGlycT0lZCBmb3IgYnJkPSVkXG4iLAorCQkJCWJyZHAtPmlycSwgYnJkcC0+YnJkbnIpOworCQkJcmV0dXJuKC1FSU5WQUwpOworCQl9CisJCW91dGIoKHN0bF92ZWNtYXBbYnJkcC0+aXJxXSB8IEVJT18wV1MgfAorCQkJKChicmRwLT5pcnF0eXBlKSA/IEVJT19JTlRMRVZFTCA6IEVJT19JTlRFREdFKSksCisJCQlicmRwLT5pb2N0cmwpOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSwgbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1RBTExJT046IFdhcm5pbmcsIGJvYXJkICVkIEkvTyBhZGRyZXNzICIKKwkJCSIleCBjb25mbGljdHMgd2l0aCBhbm90aGVyIGRldmljZVxuIiwgYnJkcC0+YnJkbnIsIAorCQkJYnJkcC0+aW9hZGRyMSk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwkKKwlpZiAoYnJkcC0+aW9zaXplMiA+IDApCisJCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9hZGRyMiwgYnJkcC0+aW9zaXplMiwgbmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBXYXJuaW5nLCBib2FyZCAlZCBJL08gIgorCQkJCSJhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZGV2aWNlXG4iLAorCQkJCWJyZHAtPmJyZG5yLCBicmRwLT5pb2FkZHIyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBXYXJuaW5nLCBhbHNvICIKKwkJCQkicmVsZWFzaW5nIGJvYXJkICVkIEkvTyBhZGRyZXNzICV4IFxuIiwgCisJCQkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYWRkcjEpOworCQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSk7CisgICAgICAgIAkJcmV0dXJuKC1FQlVTWSk7CisJCX0KKworLyoKKyAqCUV2ZXJ5dGhpbmcgbG9va3MgT0ssIHNvIGxldCdzIGdvIGFoZWFkIGFuZCBwcm9iZSBmb3IgdGhlIGhhcmR3YXJlLgorICovCisJYnJkcC0+Y2xrID0gQ0QxNDAwX0NMSzsKKwlicmRwLT5pc3IgPSBzdGxfZWlvaW50cjsKKworCXN3aXRjaCAoc3RhdHVzICYgRUlPX0lEQklUTUFTSykgeworCWNhc2UgRUlPXzhQT1JUTToKKwkJYnJkcC0+Y2xrID0gQ0QxNDAwX0NMSzhNOworCQkvKiBmYWxsIHRocnUgKi8KKwljYXNlIEVJT184UE9SVFJTOgorCWNhc2UgRUlPXzhQT1JUREk6CisJCWJyZHAtPm5ycG9ydHMgPSA4OworCQlicmVhazsKKwljYXNlIEVJT180UE9SVFJTOgorCQlicmRwLT5ucnBvcnRzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBFSU9fTUszOgorCQlzd2l0Y2ggKHN0YXR1cyAmIEVJT19CUkRNQVNLKSB7CisJCWNhc2UgSURfQlJENDoKKwkJCWJyZHAtPm5ycG9ydHMgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgSURfQlJEODoKKwkJCWJyZHAtPm5ycG9ydHMgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgSURfQlJEMTY6CisJCQlicmRwLT5ucnBvcnRzID0gMTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybigtRU5PREVWKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisvKgorICoJV2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHRoZSBib2FyZCBpcyBhY3R1YWxseSBwcmVzZW50LCBzbyBub3cgd2UKKyAqCWNhbiBjb21wbGV0ZSB0aGUgc2V0dXAuCisgKi8KKworCXBhbmVscCA9IChzdGxwYW5lbF90ICopIHN0bF9tZW1hbGxvYyhzaXplb2Yoc3RscGFuZWxfdCkpOworCWlmIChwYW5lbHAgPT0gKHN0bHBhbmVsX3QgKikgTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkiKHNpemU9JWQpXG4iLCBzaXplb2Yoc3RscGFuZWxfdCkpOworCQlyZXR1cm4oLUVOT01FTSk7CisJfQorCW1lbXNldChwYW5lbHAsIDAsIHNpemVvZihzdGxwYW5lbF90KSk7CisKKwlwYW5lbHAtPm1hZ2ljID0gU1RMX1BBTkVMTUFHSUM7CisJcGFuZWxwLT5icmRuciA9IGJyZHAtPmJyZG5yOworCXBhbmVscC0+cGFuZWxuciA9IDA7CisJcGFuZWxwLT5ucnBvcnRzID0gYnJkcC0+bnJwb3J0czsKKwlwYW5lbHAtPmlvYmFzZSA9IGJyZHAtPmlvYWRkcjE7CisJcGFuZWxwLT5od2lkID0gc3RhdHVzOworCWlmICgoc3RhdHVzICYgRUlPX0lEQklUTUFTSykgPT0gRUlPX01LMykgeworCQlwYW5lbHAtPnVhcnRwID0gKHZvaWQgKikgJnN0bF9zYzI2MTk4dWFydDsKKwkJcGFuZWxwLT5pc3IgPSBzdGxfc2MyNjE5OGludHI7CisJfSBlbHNlIHsKKwkJcGFuZWxwLT51YXJ0cCA9ICh2b2lkICopICZzdGxfY2QxNDAwdWFydDsKKwkJcGFuZWxwLT5pc3IgPSBzdGxfY2QxNDAwZWlvaW50cjsKKwl9CisKKwlicmRwLT5wYW5lbHNbMF0gPSBwYW5lbHA7CisJYnJkcC0+bnJwYW5lbHMgPSAxOworCWJyZHAtPnN0YXRlIHw9IEJSRF9GT1VORDsKKwlicmRwLT5od2lkID0gc3RhdHVzOworCWlmIChyZXF1ZXN0X2lycShicmRwLT5pcnEsIHN0bF9pbnRyLCBTQV9TSElSUSwgbmFtZSwgYnJkcCkgIT0gMCkgeworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaW50ZXJydXB0ICIKKwkJICAgICJyb3V0aW5lIGZvciAlcyBpcnE9JWRcbiIsIG5hbWUsIGJyZHAtPmlycSk7CisJCXJjID0gLUVOT0RFVjsKKwl9IGVsc2UgeworCQlyYyA9IDA7CisJfQorCXJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRyeSB0byBmaW5kIGFuIEVDSCBib2FyZCBhbmQgaW5pdGlhbGl6ZSBpdC4gVGhpcyBjb2RlIGlzIGNhcGFibGUgb2YKKyAqCWRlYWxpbmcgd2l0aCBhbGwgdHlwZXMgb2YgRUNIIGJvYXJkLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHN0bF9pbml0ZWNoKHN0bGJyZF90ICpicmRwKQoreworCXN0bHBhbmVsX3QJKnBhbmVscDsKKwl1bnNpZ25lZCBpbnQJc3RhdHVzLCBueHRpZCwgaW9hZGRyLCBjb25mbGljdDsKKwlpbnQJCXBhbmVsbnIsIGJhbmtuciwgaTsKKwljaGFyCQkqbmFtZTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfaW5pdGVjaChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCXN0YXR1cyA9IDA7CisJY29uZmxpY3QgPSAwOworCisvKgorICoJU2V0IHVwIHRoZSBpbml0aWFsIGJvYXJkIHJlZ2lzdGVyIGNvbnRlbnRzIGZvciBib2FyZHMuIFRoaXMgdmFyaWVzIGEKKyAqCWJpdCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYm9hcmQgdHlwZXMuIFNvIHdlIG5lZWQgdG8gaGFuZGxlIGVhY2gKKyAqCXNlcGFyYXRlbHkuIEFsc28gZG8gYSBjaGVjayB0aGF0IHRoZSBzdXBwbGllZCBJUlEgaXMgZ29vZC4KKyAqLworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCisJY2FzZSBCUkRfRUNIOgorCQlicmRwLT5pc3IgPSBzdGxfZWNoYXRpbnRyOworCQlicmRwLT5pb2N0cmwgPSBicmRwLT5pb2FkZHIxICsgMTsKKwkJYnJkcC0+aW9zdGF0dXMgPSBicmRwLT5pb2FkZHIxICsgMTsKKwkJc3RhdHVzID0gaW5iKGJyZHAtPmlvc3RhdHVzKTsKKwkJaWYgKChzdGF0dXMgJiBFQ0hfSURCSVRNQVNLKSAhPSBFQ0hfSUQpCisJCQlyZXR1cm4oLUVOT0RFVik7CisJCWlmICgoYnJkcC0+aXJxIDwgMCkgfHwgKGJyZHAtPmlycSA+IDE1KSB8fAorCQkgICAgKHN0bF92ZWNtYXBbYnJkcC0+aXJxXSA9PSAodW5zaWduZWQgY2hhcikgMHhmZikpIHsKKwkJCXByaW50aygiU1RBTExJT046IGludmFsaWQgaXJxPSVkIGZvciBicmQ9JWRcbiIsCisJCQkJYnJkcC0+aXJxLCBicmRwLT5icmRucik7CisJCQlyZXR1cm4oLUVJTlZBTCk7CisJCX0KKwkJc3RhdHVzID0gKChicmRwLT5pb2FkZHIyICYgRUNIX0FERFIyTUFTSykgPj4gMSk7CisJCXN0YXR1cyB8PSAoc3RsX3ZlY21hcFticmRwLT5pcnFdIDw8IDEpOworCQlvdXRiKChzdGF0dXMgfCBFQ0hfQlJEUkVTRVQpLCBicmRwLT5pb2FkZHIxKTsKKwkJYnJkcC0+aW9jdHJsdmFsID0gRUNIX0lOVEVOQUJMRSB8CisJCQkoKGJyZHAtPmlycXR5cGUpID8gRUNIX0lOVExFVkVMIDogRUNIX0lOVEVER0UpOworCQlmb3IgKGkgPSAwOyAoaSA8IDEwKTsgaSsrKQorCQkJb3V0YigoYnJkcC0+aW9jdHJsdmFsIHwgRUNIX0JSREVOQUJMRSksIGJyZHAtPmlvY3RybCk7CisJCWJyZHAtPmlvc2l6ZTEgPSAyOworCQlicmRwLT5pb3NpemUyID0gMzI7CisJCW5hbWUgPSAic2VyaWFsKEVDOC8zMikiOworCQlvdXRiKHN0YXR1cywgYnJkcC0+aW9hZGRyMSk7CisJCWJyZWFrOworCisJY2FzZSBCUkRfRUNITUM6CisJCWJyZHAtPmlzciA9IHN0bF9lY2htY2FpbnRyOworCQlicmRwLT5pb2N0cmwgPSBicmRwLT5pb2FkZHIxICsgMHgyMDsKKwkJYnJkcC0+aW9zdGF0dXMgPSBicmRwLT5pb2N0cmw7CisJCXN0YXR1cyA9IGluYihicmRwLT5pb3N0YXR1cyk7CisJCWlmICgoc3RhdHVzICYgRUNIX0lEQklUTUFTSykgIT0gRUNIX0lEKQorCQkJcmV0dXJuKC1FTk9ERVYpOworCQlpZiAoKGJyZHAtPmlycSA8IDApIHx8IChicmRwLT5pcnEgPiAxNSkgfHwKKwkJICAgIChzdGxfdmVjbWFwW2JyZHAtPmlycV0gPT0gKHVuc2lnbmVkIGNoYXIpIDB4ZmYpKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGlycT0lZCBmb3IgYnJkPSVkXG4iLAorCQkJCWJyZHAtPmlycSwgYnJkcC0+YnJkbnIpOworCQkJcmV0dXJuKC1FSU5WQUwpOworCQl9CisJCW91dGIoRUNITUNfQlJEUkVTRVQsIGJyZHAtPmlvY3RybCk7CisJCW91dGIoRUNITUNfSU5URU5BQkxFLCBicmRwLT5pb2N0cmwpOworCQlicmRwLT5pb3NpemUxID0gNjQ7CisJCW5hbWUgPSAic2VyaWFsKEVDOC8zMi1NQykiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDSFBDSToKKwkJYnJkcC0+aXNyID0gc3RsX2VjaHBjaWludHI7CisJCWJyZHAtPmlvY3RybCA9IGJyZHAtPmlvYWRkcjEgKyAyOworCQlicmRwLT5pb3NpemUxID0gNDsKKwkJYnJkcC0+aW9zaXplMiA9IDg7CisJCW5hbWUgPSAic2VyaWFsKEVDOC8zMi1QQ0kpIjsKKwkJYnJlYWs7CisKKwljYXNlIEJSRF9FQ0g2NFBDSToKKwkJYnJkcC0+aXNyID0gc3RsX2VjaHBjaTY0aW50cjsKKwkJYnJkcC0+aW9jdHJsID0gYnJkcC0+aW9hZGRyMiArIDB4NDA7CisJCW91dGIoMHg0MywgKGJyZHAtPmlvYWRkcjEgKyAweDRjKSk7CisJCWJyZHAtPmlvc2l6ZTEgPSAweDgwOworCQlicmRwLT5pb3NpemUyID0gMHg4MDsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzY0LVBDSSkiOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiU1RBTExJT046IHVua25vd24gYm9hcmQgdHlwZT0lZFxuIiwgYnJkcC0+YnJkdHlwZSk7CisJCXJldHVybigtRUlOVkFMKTsKKwkJYnJlYWs7CisJfQorCisvKgorICoJQ2hlY2sgYm9hcmRzIGZvciBwb3NzaWJsZSBJTyBhZGRyZXNzIGNvbmZsaWN0cyBhbmQgcmV0dXJuIGZhaWwgc3RhdHVzIAorICogCWlmIGFuIElPIGNvbmZsaWN0IGZvdW5kLgorICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxLCBuYW1lKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFMTElPTjogV2FybmluZywgYm9hcmQgJWQgSS9PIGFkZHJlc3MgIgorCQkJIiV4IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZGV2aWNlXG4iLCBicmRwLT5icmRuciwgCisJCQlicmRwLT5pb2FkZHIxKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCQorCWlmIChicmRwLT5pb3NpemUyID4gMCkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2FkZHIyLCBicmRwLT5pb3NpemUyLCBuYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1RBTExJT046IFdhcm5pbmcsIGJvYXJkICVkIEkvTyAiCisJCQkJImFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggYW5vdGhlciBkZXZpY2VcbiIsCisJCQkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYWRkcjIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1RBTExJT046IFdhcm5pbmcsIGFsc28gIgorCQkJCSJyZWxlYXNpbmcgYm9hcmQgJWQgSS9PIGFkZHJlc3MgJXggXG4iLCAKKwkJCQlicmRwLT5icmRuciwgYnJkcC0+aW9hZGRyMSk7CisJCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxKTsKKwkJCXJldHVybigtRUJVU1kpOworCQl9CisKKy8qCisgKglTY2FuIHRocm91Z2ggdGhlIHNlY29uZGFyeSBpbyBhZGRyZXNzIHNwYWNlIGxvb2tpbmcgZm9yIHBhbmVscy4KKyAqCUFzIHdlIGZpbmQnZW0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcGFuZWwgc3RydWN0dXJlcyBmb3IgZWFjaC4KKyAqLworCWJyZHAtPmNsayA9IENEMTQwMF9DTEs7CisJYnJkcC0+aHdpZCA9IHN0YXR1czsKKworCWlvYWRkciA9IGJyZHAtPmlvYWRkcjI7CisJYmFua25yID0gMDsKKwlwYW5lbG5yID0gMDsKKwlueHRpZCA9IDA7CisKKwlmb3IgKGkgPSAwOyAoaSA8IFNUTF9NQVhQQU5FTFMpOyBpKyspIHsKKwkJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDSFBDSSkgeworCQkJb3V0YihueHRpZCwgYnJkcC0+aW9jdHJsKTsKKwkJCWlvYWRkciA9IGJyZHAtPmlvYWRkcjI7CisJCX0KKwkJc3RhdHVzID0gaW5iKGlvYWRkciArIEVDSF9QTkxTVEFUVVMpOworCQlpZiAoKHN0YXR1cyAmIEVDSF9QTkxJRE1BU0spICE9IG54dGlkKQorCQkJYnJlYWs7CisJCXBhbmVscCA9IChzdGxwYW5lbF90ICopIHN0bF9tZW1hbGxvYyhzaXplb2Yoc3RscGFuZWxfdCkpOworCQlpZiAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpIHsKKwkJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJCSIoc2l6ZT0lZClcbiIsIHNpemVvZihzdGxwYW5lbF90KSk7CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQocGFuZWxwLCAwLCBzaXplb2Yoc3RscGFuZWxfdCkpOworCQlwYW5lbHAtPm1hZ2ljID0gU1RMX1BBTkVMTUFHSUM7CisJCXBhbmVscC0+YnJkbnIgPSBicmRwLT5icmRucjsKKwkJcGFuZWxwLT5wYW5lbG5yID0gcGFuZWxucjsKKwkJcGFuZWxwLT5pb2Jhc2UgPSBpb2FkZHI7CisJCXBhbmVscC0+cGFnZW5yID0gbnh0aWQ7CisJCXBhbmVscC0+aHdpZCA9IHN0YXR1czsKKwkJYnJkcC0+Ym5rMnBhbmVsW2Jhbmtucl0gPSBwYW5lbHA7CisJCWJyZHAtPmJua3BhZ2VhZGRyW2Jhbmtucl0gPSBueHRpZDsKKwkJYnJkcC0+Ym5rc3RhdGFkZHJbYmFua25yKytdID0gaW9hZGRyICsgRUNIX1BOTFNUQVRVUzsKKworCQlpZiAoc3RhdHVzICYgRUNIX1BOTFhQSUQpIHsKKwkJCXBhbmVscC0+dWFydHAgPSAodm9pZCAqKSAmc3RsX3NjMjYxOTh1YXJ0OworCQkJcGFuZWxwLT5pc3IgPSBzdGxfc2MyNjE5OGludHI7CisJCQlpZiAoc3RhdHVzICYgRUNIX1BOTDE2UE9SVCkgeworCQkJCXBhbmVscC0+bnJwb3J0cyA9IDE2OworCQkJCWJyZHAtPmJuazJwYW5lbFtiYW5rbnJdID0gcGFuZWxwOworCQkJCWJyZHAtPmJua3BhZ2VhZGRyW2Jhbmtucl0gPSBueHRpZDsKKwkJCQlicmRwLT5ibmtzdGF0YWRkcltiYW5rbnIrK10gPSBpb2FkZHIgKyA0ICsKKwkJCQkJRUNIX1BOTFNUQVRVUzsKKwkJCX0gZWxzZSB7CisJCQkJcGFuZWxwLT5ucnBvcnRzID0gODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBhbmVscC0+dWFydHAgPSAodm9pZCAqKSAmc3RsX2NkMTQwMHVhcnQ7CisJCQlwYW5lbHAtPmlzciA9IHN0bF9jZDE0MDBlY2hpbnRyOworCQkJaWYgKHN0YXR1cyAmIEVDSF9QTkwxNlBPUlQpIHsKKwkJCQlwYW5lbHAtPm5ycG9ydHMgPSAxNjsKKwkJCQlwYW5lbHAtPmFja21hc2sgPSAweDgwOworCQkJCWlmIChicmRwLT5icmR0eXBlICE9IEJSRF9FQ0hQQ0kpCisJCQkJCWlvYWRkciArPSBFUkVHX0JBTktTSVpFOworCQkJCWJyZHAtPmJuazJwYW5lbFtiYW5rbnJdID0gcGFuZWxwOworCQkJCWJyZHAtPmJua3BhZ2VhZGRyW2Jhbmtucl0gPSArK254dGlkOworCQkJCWJyZHAtPmJua3N0YXRhZGRyW2JhbmtucisrXSA9IGlvYWRkciArCisJCQkJCUVDSF9QTkxTVEFUVVM7CisJCQl9IGVsc2UgeworCQkJCXBhbmVscC0+bnJwb3J0cyA9IDg7CisJCQkJcGFuZWxwLT5hY2ttYXNrID0gMHhjMDsKKwkJCX0KKwkJfQorCisJCW54dGlkKys7CisJCWlvYWRkciArPSBFUkVHX0JBTktTSVpFOworCQlicmRwLT5ucnBvcnRzICs9IHBhbmVscC0+bnJwb3J0czsKKwkJYnJkcC0+cGFuZWxzW3BhbmVsbnIrK10gPSBwYW5lbHA7CisJCWlmICgoYnJkcC0+YnJkdHlwZSAhPSBCUkRfRUNIUENJKSAmJgorCQkgICAgKGlvYWRkciA+PSAoYnJkcC0+aW9hZGRyMiArIGJyZHAtPmlvc2l6ZTIpKSkKKwkJCWJyZWFrOworCX0KKworCWJyZHAtPm5ycGFuZWxzID0gcGFuZWxucjsKKwlicmRwLT5ucmJua3MgPSBiYW5rbnI7CisJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDSCkKKwkJb3V0YigoYnJkcC0+aW9jdHJsdmFsIHwgRUNIX0JSRERJU0FCTEUpLCBicmRwLT5pb2N0cmwpOworCisJYnJkcC0+c3RhdGUgfD0gQlJEX0ZPVU5EOworCWlmIChyZXF1ZXN0X2lycShicmRwLT5pcnEsIHN0bF9pbnRyLCBTQV9TSElSUSwgbmFtZSwgYnJkcCkgIT0gMCkgeworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaW50ZXJydXB0ICIKKwkJICAgICJyb3V0aW5lIGZvciAlcyBpcnE9JWRcbiIsIG5hbWUsIGJyZHAtPmlycSk7CisJCWkgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCWkgPSAwOworCX0KKworCXJldHVybihpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBzcGVjaWZpZWQgYm9hcmQuCisgKglTY2FuIHRocm91Z2ggYWxsIHRoZSBib2FyZHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNlZSB3aGF0IHdlCisgKgljYW4gZmluZC4gSGFuZGxlIEVJTyBhbmQgdGhlIEVDSCBib2FyZHMgYSBsaXR0bGUgZGlmZmVyZW50bHkgaGVyZQorICoJc2luY2UgdGhlIGluaXRpYWwgc2VhcmNoIGFuZCBzZXR1cCBpcyB2ZXJ5IGRpZmZlcmVudC4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzdGxfYnJkaW5pdChzdGxicmRfdCAqYnJkcCkKK3sKKwlpbnQJaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfYnJkaW5pdChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCWNhc2UgQlJEX0VBU1lJTzoKKwljYXNlIEJSRF9FQVNZSU9QQ0k6CisJCXN0bF9pbml0ZWlvKGJyZHApOworCQlicmVhazsKKwljYXNlIEJSRF9FQ0g6CisJY2FzZSBCUkRfRUNITUM6CisJY2FzZSBCUkRfRUNIUENJOgorCWNhc2UgQlJEX0VDSDY0UENJOgorCQlzdGxfaW5pdGVjaChicmRwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJTVEFMTElPTjogYm9hcmQ9JWQgaXMgdW5rbm93biBib2FyZCB0eXBlPSVkXG4iLAorCQkJYnJkcC0+YnJkbnIsIGJyZHAtPmJyZHR5cGUpOworCQlyZXR1cm4oRU5PREVWKTsKKwl9CisKKwlzdGxfYnJkc1ticmRwLT5icmRucl0gPSBicmRwOworCWlmICgoYnJkcC0+c3RhdGUgJiBCUkRfRk9VTkQpID09IDApIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogJXMgYm9hcmQgbm90IGZvdW5kLCBib2FyZD0lZCBpbz0leCBpcnE9JWRcbiIsCisJCQlzdGxfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sIGJyZHAtPmJyZG5yLAorCQkJYnJkcC0+aW9hZGRyMSwgYnJkcC0+aXJxKTsKKwkJcmV0dXJuKEVOT0RFVik7CisJfQorCisJZm9yIChpID0gMDsgKGkgPCBTVExfTUFYUEFORUxTKTsgaSsrKQorCQlpZiAoYnJkcC0+cGFuZWxzW2ldICE9IChzdGxwYW5lbF90ICopIE5VTEwpCisJCQlzdGxfaW5pdHBvcnRzKGJyZHAsIGJyZHAtPnBhbmVsc1tpXSk7CisKKwlwcmludGsoIlNUQUxMSU9OOiAlcyBmb3VuZCwgYm9hcmQ9JWQgaW89JXggaXJxPSVkICIKKwkJIm5ycGFuZWxzPSVkIG5ycG9ydHM9JWRcbiIsIHN0bF9icmRuYW1lc1ticmRwLT5icmR0eXBlXSwKKwkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYWRkcjEsIGJyZHAtPmlycSwgYnJkcC0+bnJwYW5lbHMsCisJCWJyZHAtPm5ycG9ydHMpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmluZCB0aGUgbmV4dCBhdmFpbGFibGUgYm9hcmQgbnVtYmVyIHRoYXQgaXMgZnJlZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzdGxfZ2V0YnJkbnIodm9pZCkKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IChpIDwgU1RMX01BWEJSRFMpOyBpKyspIHsKKwkJaWYgKHN0bF9icmRzW2ldID09IChzdGxicmRfdCAqKSBOVUxMKSB7CisJCQlpZiAoaSA+PSBzdGxfbnJicmRzKQorCQkJCXN0bF9ucmJyZHMgPSBpICsgMTsKKwkJCXJldHVybihpKTsKKwkJfQorCX0KKwlyZXR1cm4oLTEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglDT05GSUdfUENJCisKKy8qCisgKglXZSBoYXZlIGEgU3RhbGxpb24gYm9hcmQuIEFsbG9jYXRlIGEgYm9hcmQgc3RydWN0dXJlIGFuZAorICoJaW5pdGlhbGl6ZSBpdC4gUmVhZCBpdHMgSU8gYW5kIElSUSByZXNvdXJjZXMgZnJvbSBQQ0kKKyAqCWNvbmZpZ3VyYXRpb24gc3BhY2UuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc3RsX2luaXRwY2licmQoaW50IGJyZHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpkZXZwKQoreworCXN0bGJyZF90CSpicmRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9pbml0cGNpYnJkKGJyZHR5cGU9JWQsYnVzbnI9JXgsZGV2bnI9JXgpXG4iLCBicmR0eXBlLAorCQlkZXZwLT5idXMtPm51bWJlciwgZGV2cC0+ZGV2Zm4pOworI2VuZGlmCisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2cCkpCisJCXJldHVybigtRUlPKTsKKwlpZiAoKGJyZHAgPSBzdGxfYWxsb2NicmQoKSkgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCXJldHVybigtRU5PTUVNKTsKKwlpZiAoKGJyZHAtPmJyZG5yID0gc3RsX2dldGJyZG5yKCkpIDwgMCkgeworCQlwcmludGsoIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgZm91bmQsICIKKwkJCSJtYXhpbXVtIHN1cHBvcnRlZCAlZFxuIiwgU1RMX01BWEJSRFMpOworCQlyZXR1cm4oMCk7CisJfQorCWJyZHAtPmJyZHR5cGUgPSBicmR0eXBlOworCisvKgorICoJRGlmZmVyZW50IFN0YWxsaW9uIGJvYXJkcyB1c2UgdGhlIEJBUiByZWdpc3RlcnMgaW4gZGlmZmVyZW50IHdheXMsCisgKglzbyBzZXQgdXAgaW8gYWRkcmVzc2VzIGJhc2VkIG9uIGJvYXJkIHR5cGUuCisgKi8KKyNpZmRlZiBERUJVRworCXByaW50aygiJXMoJWQpOiBCQVJbXT0leCwleCwleCwleCBJUlE9JXhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDApLCBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMSksCisJCXBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKSwgcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDMpLCBkZXZwLT5pcnEpOworI2VuZGlmCisKKy8qCisgKglXZSBoYXZlIGFsbCByZXNvdXJjZXMgZnJvbSB0aGUgYm9hcmQsIHNvIGxldCdzIHNldHVwIHRoZSBhY3R1YWwKKyAqCWJvYXJkIHN0cnVjdHVyZSBub3cuCisgKi8KKwlzd2l0Y2ggKGJyZHR5cGUpIHsKKwljYXNlIEJSRF9FQ0hQQ0k6CisJCWJyZHAtPmlvYWRkcjIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMCk7CisJCWJyZHAtPmlvYWRkcjEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMSk7CisJCWJyZWFrOworCWNhc2UgQlJEX0VDSDY0UENJOgorCQlicmRwLT5pb2FkZHIyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDIpOworCQlicmRwLT5pb2FkZHIxID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDEpOworCQlicmVhazsKKwljYXNlIEJSRF9FQVNZSU9QQ0k6CisJCWJyZHAtPmlvYWRkcjEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMik7CisJCWJyZHAtPmlvYWRkcjIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiU1RBTExJT046IHVua25vd24gUENJIGJvYXJkIHR5cGU9JWRcbiIsIGJyZHR5cGUpOworCQlicmVhazsKKwl9CisKKwlicmRwLT5pcnEgPSBkZXZwLT5pcnE7CisJc3RsX2JyZGluaXQoYnJkcCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpbmQgYWxsIFN0YWxsaW9uIFBDSSBib2FyZHMgdGhhdCBtaWdodCBiZSBpbnN0YWxsZWQuIEluaXRpYWxpemUgZWFjaAorICoJb25lIGFzIGl0IGlzIGZvdW5kLgorICovCisKKworc3RhdGljIGlubGluZSBpbnQgc3RsX2ZpbmRwY2licmRzKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYJKmRldiA9IE5VTEw7CisJaW50CQlpLCByYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfZmluZHBjaWJyZHMoKVxuIik7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IChpIDwgc3RsX25ycGNpYnJkcyk7IGkrKykKKwkJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2Uoc3RsX3BjaWJyZHNbaV0udmVuZGlkLAorCQkgICAgc3RsX3BjaWJyZHNbaV0uZGV2aWQsIGRldikpKSB7CisKKy8qCisgKgkJCUZvdW5kIGEgZGV2aWNlIG9uIHRoZSBQQ0kgYnVzIHRoYXQgaGFzIG91ciB2ZW5kb3IgYW5kCisgKgkJCWRldmljZSBJRC4gTmVlZCB0byBjaGVjayBub3cgdGhhdCBpdCBpcyByZWFsbHkgdXMuCisgKi8KKwkJCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCisJCQkJY29udGludWU7CisKKwkJCXJjID0gc3RsX2luaXRwY2licmQoc3RsX3BjaWJyZHNbaV0uYnJkdHlwZSwgZGV2KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4ocmMpOworCQl9CisKKwlyZXR1cm4oMCk7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTY2FuIHRocm91Z2ggYWxsIHRoZSBib2FyZHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNlZSB3aGF0IHdlCisgKgljYW4gZmluZC4gSGFuZGxlIEVJTyBhbmQgdGhlIEVDSCBib2FyZHMgYSBsaXR0bGUgZGlmZmVyZW50bHkgaGVyZQorICoJc2luY2UgdGhlIGluaXRpYWwgc2VhcmNoIGFuZCBzZXR1cCBpcyB0b28gZGlmZmVyZW50LgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHN0bF9pbml0YnJkcyh2b2lkKQoreworCXN0bGJyZF90CSpicmRwOworCXN0bGNvbmZfdAkqY29uZnA7CisJaW50CQlpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9pbml0YnJkcygpXG4iKTsKKyNlbmRpZgorCisJaWYgKHN0bF9ucmJyZHMgPiBTVExfTUFYQlJEUykgeworCQlwcmludGsoIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgaW4gY29uZmlndXJhdGlvbiB0YWJsZSwgIgorCQkJInRydW5jYXRpbmcgdG8gJWRcbiIsIFNUTF9NQVhCUkRTKTsKKwkJc3RsX25yYnJkcyA9IFNUTF9NQVhCUkRTOworCX0KKworLyoKKyAqCUZpcnN0bHkgc2NhbiB0aGUgbGlzdCBvZiBzdGF0aWMgYm9hcmRzIGNvbmZpZ3VyZWQuIEFsbG9jYXRlCisgKglyZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgdGhlIGJvYXJkcyBhcyBmb3VuZC4KKyAqLworCWZvciAoaSA9IDA7IChpIDwgc3RsX25yYnJkcyk7IGkrKykgeworCQljb25mcCA9ICZzdGxfYnJkY29uZltpXTsKKwkJc3RsX3BhcnNlYnJkKGNvbmZwLCBzdGxfYnJkc3BbaV0pOworCQlpZiAoKGJyZHAgPSBzdGxfYWxsb2NicmQoKSkgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCQlyZXR1cm4oLUVOT01FTSk7CisJCWJyZHAtPmJyZG5yID0gaTsKKwkJYnJkcC0+YnJkdHlwZSA9IGNvbmZwLT5icmR0eXBlOworCQlicmRwLT5pb2FkZHIxID0gY29uZnAtPmlvYWRkcjE7CisJCWJyZHAtPmlvYWRkcjIgPSBjb25mcC0+aW9hZGRyMjsKKwkJYnJkcC0+aXJxID0gY29uZnAtPmlycTsKKwkJYnJkcC0+aXJxdHlwZSA9IGNvbmZwLT5pcnF0eXBlOworCQlzdGxfYnJkaW5pdChicmRwKTsKKwl9CisKKy8qCisgKglGaW5kIGFueSBkeW5hbWljYWxseSBzdXBwb3J0ZWQgYm9hcmRzLiBUaGF0IGlzIHZpYSBtb2R1bGUgbG9hZAorICoJbGluZSBvcHRpb25zIG9yIGF1dG8tZGV0ZWN0ZWQgb24gdGhlIFBDSSBidXMuCisgKi8KKwlzdGxfYXJnYnJkcygpOworI2lmZGVmIENPTkZJR19QQ0kKKwlzdGxfZmluZHBjaWJyZHMoKTsKKyNlbmRpZgorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGJvYXJkIHN0YXRzIHN0cnVjdHVyZSB0byB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bF9nZXRicmRzdGF0cyhjb21icmRfdCBfX3VzZXIgKmJwKQoreworCXN0bGJyZF90CSpicmRwOworCXN0bHBhbmVsX3QJKnBhbmVscDsKKwlpbnQJCWk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bF9icmRzdGF0cywgYnAsIHNpemVvZihjb21icmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3RsX2JyZHN0YXRzLmJyZCA+PSBTVExfTUFYQlJEUykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxfYnJkc1tzdGxfYnJkc3RhdHMuYnJkXTsKKwlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJbWVtc2V0KCZzdGxfYnJkc3RhdHMsIDAsIHNpemVvZihjb21icmRfdCkpOworCXN0bF9icmRzdGF0cy5icmQgPSBicmRwLT5icmRucjsKKwlzdGxfYnJkc3RhdHMudHlwZSA9IGJyZHAtPmJyZHR5cGU7CisJc3RsX2JyZHN0YXRzLmh3aWQgPSBicmRwLT5od2lkOworCXN0bF9icmRzdGF0cy5zdGF0ZSA9IGJyZHAtPnN0YXRlOworCXN0bF9icmRzdGF0cy5pb2FkZHIgPSBicmRwLT5pb2FkZHIxOworCXN0bF9icmRzdGF0cy5pb2FkZHIyID0gYnJkcC0+aW9hZGRyMjsKKwlzdGxfYnJkc3RhdHMuaXJxID0gYnJkcC0+aXJxOworCXN0bF9icmRzdGF0cy5ucnBhbmVscyA9IGJyZHAtPm5ycGFuZWxzOworCXN0bF9icmRzdGF0cy5ucnBvcnRzID0gYnJkcC0+bnJwb3J0czsKKwlmb3IgKGkgPSAwOyAoaSA8IGJyZHAtPm5ycGFuZWxzKTsgaSsrKSB7CisJCXBhbmVscCA9IGJyZHAtPnBhbmVsc1tpXTsKKwkJc3RsX2JyZHN0YXRzLnBhbmVsc1tpXS5wYW5lbCA9IGk7CisJCXN0bF9icmRzdGF0cy5wYW5lbHNbaV0uaHdpZCA9IHBhbmVscC0+aHdpZDsKKwkJc3RsX2JyZHN0YXRzLnBhbmVsc1tpXS5ucnBvcnRzID0gcGFuZWxwLT5ucnBvcnRzOworCX0KKworCXJldHVybiBjb3B5X3RvX3VzZXIoYnAsICZzdGxfYnJkc3RhdHMsIHNpemVvZihjb21icmRfdCkpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJlc29sdmUgdGhlIHJlZmVyZW5jZWQgcG9ydCBudW1iZXIgaW50byBhIHBvcnQgc3RydWN0IHBvaW50ZXIuCisgKi8KKworc3RhdGljIHN0bHBvcnRfdCAqc3RsX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucikKK3sKKwlzdGxicmRfdAkqYnJkcDsKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisKKwlpZiAoKGJyZG5yIDwgMCkgfHwgKGJyZG5yID49IFNUTF9NQVhCUkRTKSkKKwkJcmV0dXJuKChzdGxwb3J0X3QgKikgTlVMTCk7CisJYnJkcCA9IHN0bF9icmRzW2JyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKChzdGxwb3J0X3QgKikgTlVMTCk7CisJaWYgKChwYW5lbG5yIDwgMCkgfHwgKHBhbmVsbnIgPj0gYnJkcC0+bnJwYW5lbHMpKQorCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKKwlwYW5lbHAgPSBicmRwLT5wYW5lbHNbcGFuZWxucl07CisJaWYgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQorCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKKwlpZiAoKHBvcnRuciA8IDApIHx8IChwb3J0bnIgPj0gcGFuZWxwLT5ucnBvcnRzKSkKKwkJcmV0dXJuKChzdGxwb3J0X3QgKikgTlVMTCk7CisJcmV0dXJuKHBhbmVscC0+cG9ydHNbcG9ydG5yXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgcG9ydCBzdGF0cyBzdHJ1Y3R1cmUgdG8gdXNlciBhcHAuIEEgTlVMTCBwb3J0IHN0cnVjdAorICoJcG9pbnRlciBwYXNzZWQgaW4gbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGZyb20gdGhlIGFwcAorICoJd2hhdCBwb3J0IHRvIGdldCBzdGF0cyBmb3IgKHVzZWQgdGhyb3VnaCBib2FyZCBjb250cm9sIGRldmljZSkuCisgKi8KKworc3RhdGljIGludCBzdGxfZ2V0cG9ydHN0YXRzKHN0bHBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKK3sKKwl1bnNpZ25lZCBjaGFyCSpoZWFkLCAqdGFpbDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKCFwb3J0cCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJnN0bF9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9ydHAgPSBzdGxfZ2V0cG9ydChzdGxfY29tc3RhdHMuYnJkLCBzdGxfY29tc3RhdHMucGFuZWwsCisJCQlzdGxfY29tc3RhdHMucG9ydCk7CisJCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJcG9ydHAtPnN0YXRzLnN0YXRlID0gcG9ydHAtPmlzdGF0ZTsKKwlwb3J0cC0+c3RhdHMuZmxhZ3MgPSBwb3J0cC0+ZmxhZ3M7CisJcG9ydHAtPnN0YXRzLmh3aWQgPSBwb3J0cC0+aHdpZDsKKworCXBvcnRwLT5zdGF0cy50dHlzdGF0ZSA9IDA7CisJcG9ydHAtPnN0YXRzLmNmbGFncyA9IDA7CisJcG9ydHAtPnN0YXRzLmlmbGFncyA9IDA7CisJcG9ydHAtPnN0YXRzLm9mbGFncyA9IDA7CisJcG9ydHAtPnN0YXRzLmxmbGFncyA9IDA7CisJcG9ydHAtPnN0YXRzLnJ4YnVmZmVyZWQgPSAwOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKHBvcnRwLT50dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJaWYgKHBvcnRwLT50dHktPmRyaXZlcl9kYXRhID09IHBvcnRwKSB7CisJCQlwb3J0cC0+c3RhdHMudHR5c3RhdGUgPSBwb3J0cC0+dHR5LT5mbGFnczsKKwkJCXBvcnRwLT5zdGF0cy5yeGJ1ZmZlcmVkID0gcG9ydHAtPnR0eS0+ZmxpcC5jb3VudDsKKwkJCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zICE9IChzdHJ1Y3QgdGVybWlvcyAqKSBOVUxMKSB7CisJCQkJcG9ydHAtPnN0YXRzLmNmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJCQkJcG9ydHAtPnN0YXRzLmlmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CisJCQkJcG9ydHAtPnN0YXRzLm9mbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfb2ZsYWc7CisJCQkJcG9ydHAtPnN0YXRzLmxmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfbGZsYWc7CisJCQl9CisJCX0KKwl9CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CisJdGFpbCA9IHBvcnRwLT50eC50YWlsOworCXBvcnRwLT5zdGF0cy50eGJ1ZmZlcmVkID0gKChoZWFkID49IHRhaWwpID8gKGhlYWQgLSB0YWlsKSA6CisJCShTVExfVFhCVUZTSVpFIC0gKHRhaWwgLSBoZWFkKSkpOworCisJcG9ydHAtPnN0YXRzLnNpZ25hbHMgPSAodW5zaWduZWQgbG9uZykgc3RsX2dldHNpZ25hbHMocG9ydHApOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihjcCwgJnBvcnRwLT5zdGF0cywKKwkJCSAgICBzaXplb2YoY29tc3RhdHNfdCkpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNsZWFyIHRoZSBwb3J0IHN0YXRzIHN0cnVjdHVyZS4gV2UgYWxzbyByZXR1cm4gaXQgemVyb2VkIG91dC4uLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2NscnBvcnRzdGF0cyhzdGxwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCit7CisJaWYgKCFwb3J0cCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJnN0bF9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9ydHAgPSBzdGxfZ2V0cG9ydChzdGxfY29tc3RhdHMuYnJkLCBzdGxfY29tc3RhdHMucGFuZWwsCisJCQlzdGxfY29tc3RhdHMucG9ydCk7CisJCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJbWVtc2V0KCZwb3J0cC0+c3RhdHMsIDAsIHNpemVvZihjb21zdGF0c190KSk7CisJcG9ydHAtPnN0YXRzLmJyZCA9IHBvcnRwLT5icmRucjsKKwlwb3J0cC0+c3RhdHMucGFuZWwgPSBwb3J0cC0+cGFuZWxucjsKKwlwb3J0cC0+c3RhdHMucG9ydCA9IHBvcnRwLT5wb3J0bnI7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihjcCwgJnBvcnRwLT5zdGF0cywKKwkJCSAgICBzaXplb2YoY29tc3RhdHNfdCkpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgZW50aXJlIGRyaXZlciBwb3J0cyBzdHJ1Y3R1cmUgdG8gYSB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bF9nZXRwb3J0c3RydWN0KHN0bHBvcnRfdCBfX3VzZXIgKmFyZykKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxfZHVtbXlwb3J0LCBhcmcsIHNpemVvZihzdGxwb3J0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcG9ydHAgPSBzdGxfZ2V0cG9ydChzdGxfZHVtbXlwb3J0LmJyZG5yLCBzdGxfZHVtbXlwb3J0LnBhbmVsbnIsCisJCSBzdGxfZHVtbXlwb3J0LnBvcnRucik7CisJaWYgKCFwb3J0cCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsIHBvcnRwLCBzaXplb2Yoc3RscG9ydF90KSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBlbnRpcmUgZHJpdmVyIGJvYXJkIHN0cnVjdHVyZSB0byBhIHVzZXIgYXBwLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2dldGJyZHN0cnVjdChzdGxicmRfdCBfX3VzZXIgKmFyZykKK3sKKwlzdGxicmRfdAkqYnJkcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsX2R1bW15YnJkLCBhcmcsIHNpemVvZihzdGxicmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKHN0bF9kdW1teWJyZC5icmRuciA8IDApIHx8IChzdGxfZHVtbXlicmQuYnJkbnIgPj0gU1RMX01BWEJSRFMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlicmRwID0gc3RsX2JyZHNbc3RsX2R1bW15YnJkLmJyZG5yXTsKKwlpZiAoIWJyZHApCisJCXJldHVybigtRU5PREVWKTsKKwlyZXR1cm4gY29weV90b191c2VyKGFyZywgYnJkcCwgc2l6ZW9mKHN0bGJyZF90KSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlICJzdGFsaW9tZW0iIGRldmljZSBpcyBhbHNvIHJlcXVpcmVkIHRvIGRvIHNvbWUgc3BlY2lhbCBvcGVyYXRpb25zCisgKglvbiB0aGUgYm9hcmQgYW5kL29yIHBvcnRzLiBJbiB0aGlzIGRyaXZlciBpdCBpcyBtb3N0bHkgdXNlZCBmb3Igc3RhdHMKKyAqCWNvbGxlY3Rpb24uCisgKi8KKworc3RhdGljIGludCBzdGxfbWVtaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQJYnJkbnIsIHJjOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9tZW1pb2N0bChpcD0leCxmcD0leCxjbWQ9JXgsYXJnPSV4KVxuIiwgKGludCkgaXAsCisJCShpbnQpIGZwLCBjbWQsIChpbnQpIGFyZyk7CisjZW5kaWYKKworCWJyZG5yID0gaW1pbm9yKGlwKTsKKwlpZiAoYnJkbnIgPj0gU1RMX01BWEJSRFMpCisJCXJldHVybigtRU5PREVWKTsKKwlyYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ09NX0dFVFBPUlRTVEFUUzoKKwkJcmMgPSBzdGxfZ2V0cG9ydHN0YXRzKE5VTEwsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIENPTV9DTFJQT1JUU1RBVFM6CisJCXJjID0gc3RsX2NscnBvcnRzdGF0cyhOVUxMLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDT01fR0VUQlJEU1RBVFM6CisJCXJjID0gc3RsX2dldGJyZHN0YXRzKGFyZ3ApOworCQlicmVhazsKKwljYXNlIENPTV9SRUFEUE9SVDoKKwkJcmMgPSBzdGxfZ2V0cG9ydHN0cnVjdChhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDT01fUkVBREJPQVJEOgorCQlyYyA9IHN0bF9nZXRicmRzdHJ1Y3QoYXJncCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4ocmMpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHN0bF9vcHMgPSB7CisJLm9wZW4gPSBzdGxfb3BlbiwKKwkuY2xvc2UgPSBzdGxfY2xvc2UsCisJLndyaXRlID0gc3RsX3dyaXRlLAorCS5wdXRfY2hhciA9IHN0bF9wdXRjaGFyLAorCS5mbHVzaF9jaGFycyA9IHN0bF9mbHVzaGNoYXJzLAorCS53cml0ZV9yb29tID0gc3RsX3dyaXRlcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gc3RsX2NoYXJzaW5idWZmZXIsCisJLmlvY3RsID0gc3RsX2lvY3RsLAorCS5zZXRfdGVybWlvcyA9IHN0bF9zZXR0ZXJtaW9zLAorCS50aHJvdHRsZSA9IHN0bF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHN0bF91bnRocm90dGxlLAorCS5zdG9wID0gc3RsX3N0b3AsCisJLnN0YXJ0ID0gc3RsX3N0YXJ0LAorCS5oYW5ndXAgPSBzdGxfaGFuZ3VwLAorCS5mbHVzaF9idWZmZXIgPSBzdGxfZmx1c2hidWZmZXIsCisJLmJyZWFrX2N0bCA9IHN0bF9icmVha2N0bCwKKwkud2FpdF91bnRpbF9zZW50ID0gc3RsX3dhaXR1bnRpbHNlbnQsCisJLnNlbmRfeGNoYXIgPSBzdGxfc2VuZHhjaGFyLAorCS5yZWFkX3Byb2MgPSBzdGxfcmVhZHByb2MsCisJLnRpb2NtZ2V0ID0gc3RsX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHN0bF90aW9jbXNldCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IF9faW5pdCBzdGxfaW5pdCh2b2lkKQoreworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBzdGxfZHJ2dGl0bGUsIHN0bF9kcnZ2ZXJzaW9uKTsKKworCXN0bF9pbml0YnJkcygpOworCisJc3RsX3NlcmlhbCA9IGFsbG9jX3R0eV9kcml2ZXIoU1RMX01BWEJSRFMgKiBTVExfTUFYUE9SVFMpOworCWlmICghc3RsX3NlcmlhbCkKKwkJcmV0dXJuIC0xOworCisvKgorICoJQWxsb2NhdGUgYSB0ZW1wb3Jhcnkgd3JpdGUgYnVmZmVyLgorICovCisJc3RsX3RtcHdyaXRlYnVmID0gKGNoYXIgKikgc3RsX21lbWFsbG9jKFNUTF9UWEJVRlNJWkUpOworCWlmIChzdGxfdG1wd3JpdGVidWYgPT0gKGNoYXIgKikgTlVMTCkKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAoc2l6ZT0lZClcbiIsCisJCQlTVExfVFhCVUZTSVpFKTsKKworLyoKKyAqCVNldCB1cCBhIGNoYXJhY3RlciBkcml2ZXIgZm9yIHBlciBib2FyZCBzdHVmZi4gVGhpcyBpcyBtYWlubHkgdXNlZAorICoJdG8gZG8gc3RhdHMgaW9jdGxzIG9uIHRoZSBwb3J0cy4KKyAqLworCWlmIChyZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIiwgJnN0bF9mc2lvbWVtKSkKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBib2FyZCBkZXZpY2VcbiIpOworCWRldmZzX21rX2Rpcigic3RhbGlvbWVtIik7CisKKwlzdGFsbGlvbl9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJzdGFsaW9tZW0iKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWRldmZzX21rX2NkZXYoTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSwKKwkJCQlTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwKKwkJCQkic3RhbGlvbWVtLyVkIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHN0YWxsaW9uX2NsYXNzLCBNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLCBOVUxMLCAic3RhbGlvbWVtJWQiLCBpKTsKKwl9CisKKwlzdGxfc2VyaWFsLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0bF9zZXJpYWwtPmRyaXZlcl9uYW1lID0gc3RsX2Rydm5hbWU7CisJc3RsX3NlcmlhbC0+bmFtZSA9ICJ0dHlFIjsKKwlzdGxfc2VyaWFsLT5kZXZmc19uYW1lID0gInR0cy9FIjsKKwlzdGxfc2VyaWFsLT5tYWpvciA9IFNUTF9TRVJJQUxNQUpPUjsKKwlzdGxfc2VyaWFsLT5taW5vcl9zdGFydCA9IDA7CisJc3RsX3NlcmlhbC0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJc3RsX3NlcmlhbC0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlzdGxfc2VyaWFsLT5pbml0X3Rlcm1pb3MgPSBzdGxfZGVmdGVybWlvczsKKwlzdGxfc2VyaWFsLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHN0bF9zZXJpYWwsICZzdGxfb3BzKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHN0bF9zZXJpYWwpKSB7CisJCXB1dF90dHlfZHJpdmVyKHN0bF9zZXJpYWwpOworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBDRDE0MDAgSEFSRFdBUkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRoZXNlIGZ1bmN0aW9ucyBnZXQvc2V0L3VwZGF0ZSB0aGUgcmVnaXN0ZXJzIG9mIHRoZSBjZDE0MDAgVUFSVHMuCisgKglBY2Nlc3MgdG8gdGhlIGNkMTQwMCByZWdpc3RlcnMgaXMgdmlhIGFuIGFkZHJlc3MvZGF0YSBpbyBwb3J0IHBhaXIuCisgKgkoTWF5YmUgc2hvdWxkIG1ha2UgdGhpcyBpbmxpbmUuLi4pCisgKi8KKworc3RhdGljIGludCBzdGxfY2QxNDAwZ2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducikKK3sKKwlvdXRiKChyZWduciArIHBvcnRwLT51YXJ0YWRkciksIHBvcnRwLT5pb2FkZHIpOworCXJldHVybihpbmIocG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSkpOworfQorCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKQoreworCW91dGIoKHJlZ25yICsgcG9ydHAtPnVhcnRhZGRyKSwgcG9ydHAtPmlvYWRkcik7CisJb3V0Yih2YWx1ZSwgcG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSk7Cit9CisKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMHVwZGF0ZXJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3sKKwlvdXRiKChyZWduciArIHBvcnRwLT51YXJ0YWRkciksIHBvcnRwLT5pb2FkZHIpOworCWlmIChpbmIocG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSkgIT0gdmFsdWUpIHsKKwkJb3V0Yih2YWx1ZSwgcG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSk7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbmJpdGlhbGl6ZSB0aGUgVUFSVHMgaW4gYSBwYW5lbC4gV2UgZG9uJ3QgY2FyZSB3aGF0IHNvcnQgb2YgYm9hcmQKKyAqCXRoZXNlIHBvcnRzIGFyZSBvbiAtIHNpbmNlIHRoZSBwb3J0IGlvIHJlZ2lzdGVycyBhcmUgYWxtb3N0CisgKglpZGVudGljYWwgd2hlbiBkZWFsaW5nIHdpdGggcG9ydHMuCisgKi8KKworc3RhdGljIGludCBzdGxfY2QxNDAwcGFuZWxpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHApCit7CisJdW5zaWduZWQgaW50CWdmcmNyOworCWludAkJY2hpcG1hc2ssIGksIGo7CisJaW50CQlucmNoaXBzLCB1YXJ0YWRkciwgaW9hZGRyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9wYW5lbGluaXQoYnJkcD0leCxwYW5lbHA9JXgpXG4iLCAoaW50KSBicmRwLCAoaW50KSBwYW5lbHApOworI2VuZGlmCisKKwlCUkRFTkFCTEUocGFuZWxwLT5icmRuciwgcGFuZWxwLT5wYWdlbnIpOworCisvKgorICoJQ2hlY2sgdGhhdCBlYWNoIGNoaXAgaXMgcHJlc2VudCBhbmQgc3RhcnRlZCB1cCBPSy4KKyAqLworCWNoaXBtYXNrID0gMDsKKwlucmNoaXBzID0gcGFuZWxwLT5ucnBvcnRzIC8gQ0QxNDAwX1BPUlRTOworCWZvciAoaSA9IDA7IChpIDwgbnJjaGlwcyk7IGkrKykgeworCQlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNIUENJKSB7CisJCQlvdXRiKChwYW5lbHAtPnBhZ2VuciArIChpID4+IDEpKSwgYnJkcC0+aW9jdHJsKTsKKwkJCWlvYWRkciA9IHBhbmVscC0+aW9iYXNlOworCQl9IGVsc2UgeworCQkJaW9hZGRyID0gcGFuZWxwLT5pb2Jhc2UgKyAoRVJFR19CQU5LU0laRSAqIChpID4+IDEpKTsKKwkJfQorCQl1YXJ0YWRkciA9IChpICYgMHgwMSkgPyAweDA4MCA6IDA7CisJCW91dGIoKEdGUkNSICsgdWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRiKDAsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJb3V0YigoQ0NSICsgdWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRiKENDUl9SRVNFVEZVTEwsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJb3V0YihDQ1JfUkVTRVRGVUxMLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCW91dGIoKEdGUkNSICsgdWFydGFkZHIpLCBpb2FkZHIpOworCQlmb3IgKGogPSAwOyAoaiA8IENDUl9NQVhXQUlUKTsgaisrKSB7CisJCQlpZiAoKGdmcmNyID0gaW5iKGlvYWRkciArIEVSRUdfREFUQSkpICE9IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChqID49IENDUl9NQVhXQUlUKSB8fCAoZ2ZyY3IgPCAweDQwKSB8fCAoZ2ZyY3IgPiAweDYwKSkgeworCQkJcHJpbnRrKCJTVEFMTElPTjogY2QxNDAwIG5vdCByZXNwb25kaW5nLCAiCisJCQkJImJyZD0lZCBwYW5lbD0lZCBjaGlwPSVkXG4iLAorCQkJCXBhbmVscC0+YnJkbnIsIHBhbmVscC0+cGFuZWxuciwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCQljaGlwbWFzayB8PSAoMHgxIDw8IGkpOworCQlvdXRiKChQUFIgKyB1YXJ0YWRkciksIGlvYWRkcik7CisJCW91dGIoUFBSX1NDQUxBUiwgKGlvYWRkciArIEVSRUdfREFUQSkpOworCX0KKworCUJSRERJU0FCTEUocGFuZWxwLT5icmRucik7CisJcmV0dXJuKGNoaXBtYXNrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSBzcGVjaWZpYyBwb3J0IHJlZ2lzdGVycy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwcG9ydGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCwgc3RscG9ydF90ICpwb3J0cCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMHBvcnRpbml0KGJyZHA9JXgscGFuZWxwPSV4LHBvcnRwPSV4KVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgcGFuZWxwLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmICgoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkgfHwgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKSB8fAorCSAgICAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKSkKKwkJcmV0dXJuOworCisJcG9ydHAtPmlvYWRkciA9IHBhbmVscC0+aW9iYXNlICsgKCgoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNIUENJKSB8fAorCQkocG9ydHAtPnBvcnRuciA8IDgpKSA/IDAgOiBFUkVHX0JBTktTSVpFKTsKKwlwb3J0cC0+dWFydGFkZHIgPSAocG9ydHAtPnBvcnRuciAmIDB4MDQpIDw8IDU7CisJcG9ydHAtPnBhZ2VuciA9IHBhbmVscC0+cGFnZW5yICsgKHBvcnRwLT5wb3J0bnIgPj4gMyk7CisKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIExJVlIsIChwb3J0cC0+cG9ydG5yIDw8IDMpKTsKKwlwb3J0cC0+aHdpZCA9IHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIEdGUkNSKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVdhaXQgZm9yIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHRvIGJlIHJlYWR5LiBXZSB3aWxsIHBvbGwgdGhpcywKKyAqCXNpbmNlIGl0IHdvbid0IHVzdWFsbHkgdGFrZSB0b28gbG9uZyB0byBiZSByZWFkeS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwY2Nyd2FpdChzdGxwb3J0X3QgKnBvcnRwKQoreworCWludAlpOworCisJZm9yIChpID0gMDsgKGkgPCBDQ1JfTUFYV0FJVCk7IGkrKykgeworCQlpZiAoc3RsX2NkMTQwMGdldHJlZyhwb3J0cCwgQ0NSKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlwcmludGsoIlNUQUxMSU9OOiBjZDE0MDAgbm90IHJlc3BvbmRpbmcsIHBvcnQ9JWQgcGFuZWw9JWQgYnJkPSVkXG4iLAorCQlwb3J0cC0+cG9ydG5yLCBwb3J0cC0+cGFuZWxuciwgcG9ydHAtPmJyZG5yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2V0IHVwIHRoZSBjZDE0MDAgcmVnaXN0ZXJzIGZvciBhIHBvcnQgYmFzZWQgb24gdGhlIHRlcm1pb3MgcG9ydAorICoJc2V0dGluZ3MuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMHNldHBvcnQoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKQoreworCXN0bGJyZF90CSpicmRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWNsa2RpdiwgYmF1ZHJhdGU7CisJdW5zaWduZWQgY2hhcgljb3IxLCBjb3IyLCBjb3IzOworCXVuc2lnbmVkIGNoYXIJY29yNCwgY29yNSwgY2NyOworCXVuc2lnbmVkIGNoYXIJc3Jlciwgc3Jlcm9uLCBzcmVyb2ZmOworCXVuc2lnbmVkIGNoYXIJbWNvcjEsIG1jb3IyLCBydHByOworCXVuc2lnbmVkIGNoYXIJY2xrLCBkaXY7CisKKwljb3IxID0gMDsKKwljb3IyID0gMDsKKwljb3IzID0gMDsKKwljb3I0ID0gMDsKKwljb3I1ID0gMDsKKwljY3IgPSAwOworCXJ0cHIgPSAwOworCWNsayA9IDA7CisJZGl2ID0gMDsKKwltY29yMSA9IDA7CisJbWNvcjIgPSAwOworCXNyZXJvbiA9IDA7CisJc3Jlcm9mZiA9IDA7CisKKwlicmRwID0gc3RsX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisvKgorICoJU2V0IHVwIHRoZSBSWCBjaGFyIGlnbm9yZSBtYXNrIHdpdGggdGhvc2UgUlggZXJyb3IgdHlwZXMgd2UKKyAqCWNhbiBpZ25vcmUuIFdlIGNhbiBnZXQgdGhlIGNkMTQwMCB0byBoZWxwIHVzIG91dCBhIGxpdHRsZSBoZXJlLAorICoJaXQgd2lsbCBpZ25vcmUgcGFyaXR5IGVycm9ycyBhbmQgYnJlYWtzIGZvciB1cy4KKyAqLworCXBvcnRwLT5yeGlnbm9yZW1zayA9IDA7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSUdOUEFSKSB7CisJCXBvcnRwLT5yeGlnbm9yZW1zayB8PSAoU1RfUEFSSVRZIHwgU1RfRlJBTUlORyB8IFNUX09WRVJSVU4pOworCQljb3IxIHw9IENPUjFfUEFSSUdOT1JFOworCX0KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05CUkspIHsKKwkJcG9ydHAtPnJ4aWdub3JlbXNrIHw9IFNUX0JSRUFLOworCQljb3I0IHw9IENPUjRfSUdOQlJLOworCX0KKworCXBvcnRwLT5yeG1hcmttc2sgPSBTVF9PVkVSUlVOOworCWlmICh0aW9zcC0+Y19pZmxhZyAmIChJTlBDSyB8IFBBUk1SSykpCisJCXBvcnRwLT5yeG1hcmttc2sgfD0gKFNUX1BBUklUWSB8IFNUX0ZSQU1JTkcpOworCWlmICh0aW9zcC0+Y19pZmxhZyAmIEJSS0lOVCkKKwkJcG9ydHAtPnJ4bWFya21zayB8PSBTVF9CUkVBSzsKKworLyoKKyAqCUdvIHRocm91Z2ggdGhlIGNoYXIgc2l6ZSwgcGFyaXR5IGFuZCBzdG9wIGJpdHMgYW5kIHNldCBhbGwgdGhlCisgKglvcHRpb24gcmVnaXN0ZXIgYXBwcm9wcmlhdGVseS4KKyAqLworCXN3aXRjaCAodGlvc3AtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQljb3IxIHw9IENPUjFfQ0hMNTsKKwkJYnJlYWs7CisJY2FzZSBDUzY6CisJCWNvcjEgfD0gQ09SMV9DSEw2OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJY29yMSB8PSBDT1IxX0NITDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvcjEgfD0gQ09SMV9DSEw4OworCQlicmVhazsKKwl9CisKKwlpZiAodGlvc3AtPmNfY2ZsYWcgJiBDU1RPUEIpCisJCWNvcjEgfD0gQ09SMV9TVE9QMjsKKwllbHNlCisJCWNvcjEgfD0gQ09SMV9TVE9QMTsKKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIFBBUkVOQikgeworCQlpZiAodGlvc3AtPmNfY2ZsYWcgJiBQQVJPREQpCisJCQljb3IxIHw9IChDT1IxX1BBUkVOQiB8IENPUjFfUEFST0REKTsKKwkJZWxzZQorCQkJY29yMSB8PSAoQ09SMV9QQVJFTkIgfCBDT1IxX1BBUkVWRU4pOworCX0gZWxzZSB7CisJCWNvcjEgfD0gQ09SMV9QQVJOT05FOworCX0KKworLyoKKyAqCVNldCB0aGUgUlggRklGTyB0aHJlc2hvbGQgYXQgNiBjaGFycy4gVGhpcyBnaXZlcyBhIGJpdCBvZiBicmVhdGhpbmcKKyAqCXNwYWNlIGZvciBoYXJkd2FyZSBmbG93IGNvbnRyb2wgYW5kIHRoZSBsaWtlLiBUaGlzIHNob3VsZCBiZSBzZXQgdG8KKyAqCVZNSU4uIEFsc28gaGVyZSB3ZSB3aWxsIHNldCB0aGUgUlggZGF0YSB0aW1lb3V0IHRvIDEwbXMgLSB0aGlzIHNob3VsZAorICoJcmVhbGx5IGJlIGJhc2VkIG9uIFZUSU1FLgorICovCisJY29yMyB8PSBGSUZPX1JYVEhSRVNIT0xEOworCXJ0cHIgPSAyOworCisvKgorICoJQ2FsY3VsYXRlIHRoZSBiYXVkIHJhdGUgdGltZXJzLiBGb3Igbm93IHdlIHdpbGwganVzdCBhc3N1bWUgdGhhdAorICoJdGhlIGlucHV0IGFuZCBvdXRwdXQgYmF1ZCBhcmUgdGhlIHNhbWUuIENvdWxkIGhhdmUgdXNlZCBhIGJhdWQKKyAqCXRhYmxlIGhlcmUsIGJ1dCB0aGlzIHdheSB3ZSBjYW4gZ2VuZXJhdGUgdmlydHVhbGx5IGFueSBiYXVkIHJhdGUKKyAqCXdlIGxpa2UhCisgKi8KKwliYXVkcmF0ZSA9IHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQ7CisJaWYgKGJhdWRyYXRlICYgQ0JBVURFWCkgeworCQliYXVkcmF0ZSAmPSB+Q0JBVURFWDsKKwkJaWYgKChiYXVkcmF0ZSA8IDEpIHx8IChiYXVkcmF0ZSA+IDQpKQorCQkJdGlvc3AtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWRyYXRlICs9IDE1OworCX0KKwliYXVkcmF0ZSA9IHN0bF9iYXVkcmF0ZXNbYmF1ZHJhdGVdOworCWlmICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjM4NDAwKSB7CisJCWlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWJhdWRyYXRlID0gNTc2MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCWJhdWRyYXRlID0gMTE1MjAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQliYXVkcmF0ZSA9IDIzMDQwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCWJhdWRyYXRlID0gNDYwODAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKQorCQkJYmF1ZHJhdGUgPSAocG9ydHAtPmJhdWRfYmFzZSAvIHBvcnRwLT5jdXN0b21fZGl2aXNvcik7CisJfQorCWlmIChiYXVkcmF0ZSA+IFNUTF9DRDE0MDBNQVhCQVVEKQorCQliYXVkcmF0ZSA9IFNUTF9DRDE0MDBNQVhCQVVEOworCisJaWYgKGJhdWRyYXRlID4gMCkgeworCQlmb3IgKGNsayA9IDA7IChjbGsgPCBDRDE0MDBfTlVNQ0xLUyk7IGNsaysrKSB7CisJCQljbGtkaXYgPSAoKHBvcnRwLT5jbGsgLyBzdGxfY2QxNDAwY2xrZGl2c1tjbGtdKSAvIGJhdWRyYXRlKTsKKwkJCWlmIChjbGtkaXYgPCAweDEwMCkKKwkJCQlicmVhazsKKwkJfQorCQlkaXYgPSAodW5zaWduZWQgY2hhcikgY2xrZGl2OworCX0KKworLyoKKyAqCUNoZWNrIHdoYXQgZm9ybSBvZiBtb2RlbSBzaWduYWxpbmcgaXMgcmVxdWlyZWQgYW5kIHNldCBpdCB1cC4KKyAqLworCWlmICgodGlvc3AtPmNfY2ZsYWcgJiBDTE9DQUwpID09IDApIHsKKwkJbWNvcjEgfD0gTUNPUjFfRENEOworCQltY29yMiB8PSBNQ09SMl9EQ0Q7CisJCXNyZXJvbiB8PSBTUkVSX01PREVNOworCQlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJfSBlbHNlIHsKKwkJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwl9CisKKy8qCisgKglTZXR1cCBjZDE0MDAgZW5oYW5jZWQgbW9kZXMgaWYgd2UgY2FuLiBJbiBwYXJ0aWN1bGFyIHdlIHdhbnQgdG8KKyAqCWhhbmRsZSBhcyBtdWNoIG9mIHRoZSBmbG93IGNvbnRyb2wgYXMgcG9zc2libGUgYXV0b21hdGljYWxseS4gQXMKKyAqCXdlbGwgYXMgc2F2aW5nIGEgZmV3IENQVSBjeWNsZXMgaXQgd2lsbCBhbHNvIGdyZWF0bHkgaW1wcm92ZSBmbG93CisgKgljb250cm9sIHJlbGlhYmlsaXR5LgorICovCisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhPTikgeworCQljb3IyIHw9IENPUjJfVFhJQkU7CisJCWNvcjMgfD0gQ09SM19TQ0QxMjsKKwkJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhBTlkpCisJCQljb3IyIHw9IENPUjJfSVhNOworCX0KKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJY29yMiB8PSBDT1IyX0NUU0FFOworCQltY29yMSB8PSBGSUZPX1JUU1RIUkVTSE9MRDsKKwl9CisKKy8qCisgKglBbGwgY2QxNDAwIHJlZ2lzdGVyIHZhbHVlcyBjYWxjdWxhdGVkIHNvIGdvIHRocm91Z2ggYW5kIHNldAorICoJdGhlbSBhbGwgdXAuCisgKi8KKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJTRVRQT1JUOiBwb3J0bnI9JWQgcGFuZWxucj0lZCBicmRucj0lZFxuIiwKKwkJcG9ydHAtPnBvcnRuciwgcG9ydHAtPnBhbmVsbnIsIHBvcnRwLT5icmRucik7CisJcHJpbnRrKCIgICAgY29yMT0leCBjb3IyPSV4IGNvcjM9JXggY29yND0leCBjb3I1PSV4XG4iLAorCQljb3IxLCBjb3IyLCBjb3IzLCBjb3I0LCBjb3I1KTsKKwlwcmludGsoIiAgICBtY29yMT0leCBtY29yMj0leCBydHByPSV4IHNyZXJvbj0leCBzcmVyb2ZmPSV4XG4iLAorCQltY29yMSwgbWNvcjIsIHJ0cHIsIHNyZXJvbiwgc3Jlcm9mZik7CisJcHJpbnRrKCIgICAgdGNvcj0leCB0YnByPSV4IHJjb3I9JXggcmJwcj0leFxuIiwgY2xrLCBkaXYsIGNsaywgZGl2KTsKKwlwcmludGsoIiAgICBzY2hyMT0leCBzY2hyMj0leCBzY2hyMz0leCBzY2hyND0leFxuIiwKKwkJdGlvc3AtPmNfY2NbVlNUQVJUXSwgdGlvc3AtPmNfY2NbVlNUT1BdLAorCQl0aW9zcC0+Y19jY1tWU1RBUlRdLCB0aW9zcC0+Y19jY1tWU1RPUF0pOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgzKSk7CisJc3JlciA9IHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIFNSRVIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFNSRVIsIDApOworCWlmIChzdGxfY2QxNDAwdXBkYXRlcmVnKHBvcnRwLCBDT1IxLCBjb3IxKSkKKwkJY2NyID0gMTsKKwlpZiAoc3RsX2NkMTQwMHVwZGF0ZXJlZyhwb3J0cCwgQ09SMiwgY29yMikpCisJCWNjciA9IDE7CisJaWYgKHN0bF9jZDE0MDB1cGRhdGVyZWcocG9ydHAsIENPUjMsIGNvcjMpKQorCQljY3IgPSAxOworCWlmIChjY3IpIHsKKwkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQ1IsIENDUl9DT1JDSEFOR0UpOworCX0KKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDT1I0LCBjb3I0KTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDT1I1LCBjb3I1KTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBNQ09SMSwgbWNvcjEpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1DT1IyLCBtY29yMik7CisJaWYgKGJhdWRyYXRlID4gMCkgeworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBUQ09SLCBjbGspOworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBUQlBSLCBkaXYpOworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBSQ09SLCBjbGspOworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBSQlBSLCBkaXYpOworCX0KKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBTQ0hSMSwgdGlvc3AtPmNfY2NbVlNUQVJUXSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU0NIUjIsIHRpb3NwLT5jX2NjW1ZTVE9QXSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU0NIUjMsIHRpb3NwLT5jX2NjW1ZTVEFSVF0pOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFNDSFI0LCB0aW9zcC0+Y19jY1tWU1RPUF0pOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFJUUFIsIHJ0cHIpOworCW1jb3IxID0gc3RsX2NkMTQwMGdldHJlZyhwb3J0cCwgTVNWUjEpOworCWlmIChtY29yMSAmIE1TVlIxX0RDRCkKKwkJcG9ydHAtPnNpZ3MgfD0gVElPQ01fQ0Q7CisJZWxzZQorCQlwb3J0cC0+c2lncyAmPSB+VElPQ01fQ0Q7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU1JFUiwgKChzcmVyICYgfnNyZXJvZmYpIHwgc3Jlcm9uKSk7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXQgdGhlIHN0YXRlIG9mIHRoZSBEVFIgYW5kIFJUUyBzaWduYWxzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpCit7CisJdW5zaWduZWQgY2hhcgltc3ZyMSwgbXN2cjI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwc2V0c2lnbmFscyhwb3J0cD0leCxkdHI9JWQscnRzPSVkKVxuIiwKKwkJKGludCkgcG9ydHAsIGR0ciwgcnRzKTsKKyNlbmRpZgorCisJbXN2cjEgPSAwOworCW1zdnIyID0gMDsKKwlpZiAoZHRyID4gMCkKKwkJbXN2cjEgPSBNU1ZSMV9EVFI7CisJaWYgKHJ0cyA+IDApCisJCW1zdnIyID0gTVNWUjJfUlRTOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0FSLCAocG9ydHAtPnBvcnRuciAmIDB4MDMpKTsKKwlpZiAocnRzID49IDApCisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1TVlIyLCBtc3ZyMik7CisJaWYgKGR0ciA+PSAwKQorCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBNU1ZSMSwgbXN2cjEpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgc2lnbmFscy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9jZDE0MDBnZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHApCit7CisJdW5zaWduZWQgY2hhcgltc3ZyMSwgbXN2cjI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXNpZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGdldHNpZ25hbHMocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDAzKSk7CisJbXN2cjEgPSBzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBNU1ZSMSk7CisJbXN2cjIgPSBzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBNU1ZSMik7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJc2lncyA9IDA7CisJc2lncyB8PSAobXN2cjEgJiBNU1ZSMV9EQ0QpID8gVElPQ01fQ0QgOiAwOworCXNpZ3MgfD0gKG1zdnIxICYgTVNWUjFfQ1RTKSA/IFRJT0NNX0NUUyA6IDA7CisJc2lncyB8PSAobXN2cjEgJiBNU1ZSMV9EVFIpID8gVElPQ01fRFRSIDogMDsKKwlzaWdzIHw9IChtc3ZyMiAmIE1TVlIyX1JUUykgPyBUSU9DTV9SVFMgOiAwOworI2lmIDAKKwlzaWdzIHw9IChtc3ZyMSAmIE1TVlIxX1JJKSA/IFRJT0NNX1JJIDogMDsKKwlzaWdzIHw9IChtc3ZyMSAmIE1TVlIxX0RTUikgPyBUSU9DTV9EU1IgOiAwOworI2Vsc2UKKwlzaWdzIHw9IFRJT0NNX0RTUjsKKyNlbmRpZgorCXJldHVybihzaWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRW5hYmxlL0Rpc2FibGUgdGhlIFRyYW5zbWl0dGVyIGFuZC9vciBSZWNlaXZlci4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwZW5hYmxlcnh0eChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCkKK3sKKwl1bnNpZ25lZCBjaGFyCWNjcjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBlbmFibGVyeHR4KHBvcnRwPSV4LHJ4PSVkLHR4PSVkKVxuIiwKKwkJKGludCkgcG9ydHAsIHJ4LCB0eCk7CisjZW5kaWYKKwljY3IgPSAwOworCisJaWYgKHR4ID09IDApCisJCWNjciB8PSBDQ1JfVFhESVNBQkxFOworCWVsc2UgaWYgKHR4ID4gMCkKKwkJY2NyIHw9IENDUl9UWEVOQUJMRTsKKwlpZiAocnggPT0gMCkKKwkJY2NyIHw9IENDUl9SWERJU0FCTEU7CisJZWxzZSBpZiAocnggPiAwKQorCQljY3IgfD0gQ0NSX1JYRU5BQkxFOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0FSLCAocG9ydHAtPnBvcnRuciAmIDB4MDMpKTsKKwlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0NSLCBjY3IpOworCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVN0YXJ0L3N0b3AgdGhlIFRyYW5zbWl0dGVyIGFuZC9vciBSZWNlaXZlci4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc3RhcnRyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQoreworCXVuc2lnbmVkIGNoYXIJc3Jlcm9uLCBzcmVyb2ZmOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMHN0YXJ0cnh0eChwb3J0cD0leCxyeD0lZCx0eD0lZClcbiIsCisJCShpbnQpIHBvcnRwLCByeCwgdHgpOworI2VuZGlmCisKKwlzcmVyb24gPSAwOworCXNyZXJvZmYgPSAwOworCWlmICh0eCA9PSAwKQorCQlzcmVyb2ZmIHw9IChTUkVSX1RYREFUQSB8IFNSRVJfVFhFTVBUWSk7CisJZWxzZSBpZiAodHggPT0gMSkKKwkJc3Jlcm9uIHw9IFNSRVJfVFhEQVRBOworCWVsc2UgaWYgKHR4ID49IDIpCisJCXNyZXJvbiB8PSBTUkVSX1RYRU1QVFk7CisJaWYgKHJ4ID09IDApCisJCXNyZXJvZmYgfD0gU1JFUl9SWERBVEE7CisJZWxzZSBpZiAocnggPiAwKQorCQlzcmVyb24gfD0gU1JFUl9SWERBVEE7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFNSRVIsCisJCSgoc3RsX2NkMTQwMGdldHJlZyhwb3J0cCwgU1JFUikgJiB+c3Jlcm9mZikgfCBzcmVyb24pKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJaWYgKHR4ID4gMCkKKwkJc2V0X2JpdChBU1lJX1RYQlVTWSwgJnBvcnRwLT5pc3RhdGUpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhpcyBwb3J0LgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBkaXNhYmxlaW50cnMoc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBkaXNhYmxlaW50cnMocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFNSRVIsIDApOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2VuZGJyZWFrKHN0bHBvcnRfdCAqcG9ydHAsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwc2VuZGJyZWFrKHBvcnRwPSV4LGxlbj0lZClcbiIsIChpbnQpIHBvcnRwLCBsZW4pOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFNSRVIsCisJCSgoc3RsX2NkMTQwMGdldHJlZyhwb3J0cCwgU1JFUikgJiB+U1JFUl9UWERBVEEpIHwKKwkJU1JFUl9UWEVNUFRZKSk7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXBvcnRwLT5icmtsZW4gPSBsZW47CisJaWYgKGxlbiA9PSAxKQorCQlwb3J0cC0+c3RhdHMudHhicmVha3MrKzsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGFrZSBmbG93IGNvbnRyb2wgYWN0aW9ucy4uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBmbG93Y3RybChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwZmxvd2N0cmwocG9ydHA9JXgsc3RhdGU9JXgpXG4iLCAoaW50KSBwb3J0cCwgc3RhdGUpOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCisJaWYgKHN0YXRlKSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9GRikgeworCQkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCQkJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0NSLCBDQ1JfU0VORFNDSFIxKTsKKwkJCXBvcnRwLT5zdGF0cy5yeHhvbisrOworCQkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCQl9CisvKgorICoJCVF1ZXN0aW9uOiBzaG91bGQgd2UgcmV0dXJuIFJUUyB0byB3aGF0IGl0IHdhcyBiZWZvcmU/IEl0IG1heQorICoJCWhhdmUgYmVlbiBzZXQgYnkgYW4gaW9jdGwuLi4gU3VwcG9zZSBub3QsIHNpbmNlIGlmIHlvdSBoYXZlCisgKgkJaGFyZHdhcmUgZmxvdyBjb250cm9sIHNldCB0aGVuIGl0IGlzIHByZXR0eSBzaWxseSB0byBnbyBhbmQKKyAqCQlzZXQgdGhlIFJUUyBsaW5lIGJ5IGhhbmQuCisgKi8KKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1DT1IxLAorCQkJCShzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBNQ09SMSkgfAorCQkJCUZJRk9fUlRTVEhSRVNIT0xEKSk7CisJCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBNU1ZSMiwgTVNWUjJfUlRTKTsKKwkJCXBvcnRwLT5zdGF0cy5yeHJ0c29uKys7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYpIHsKKwkJCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwkJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENDUiwgQ0NSX1NFTkRTQ0hSMik7CisJCQlwb3J0cC0+c3RhdHMucnh4b2ZmKys7CisJCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJCX0KKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1DT1IxLAorCQkJCShzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBNQ09SMSkgJiAweGYwKSk7CisJCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBNU1ZSMiwgMCk7CisJCQlwb3J0cC0+c3RhdHMucnhydHNvZmYrKzsKKwkJfQorCX0KKworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhIGZsb3cgY29udHJvbCBjaGFyYWN0ZXIuLi4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2VuZGZsb3coc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKQoreworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMHNlbmRmbG93KHBvcnRwPSV4LHN0YXRlPSV4KVxuIiwgKGludCkgcG9ydHAsIHN0YXRlKTsKKyNlbmRpZgorCisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXR0eSA9IHBvcnRwLT50dHk7CisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0FSLCAocG9ydHAtPnBvcnRuciAmIDB4MDMpKTsKKwlpZiAoc3RhdGUpIHsKKwkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQ1IsIENDUl9TRU5EU0NIUjEpOworCQlwb3J0cC0+c3RhdHMucnh4b24rKzsKKwkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCX0gZWxzZSB7CisJCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwkJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0NSLCBDQ1JfU0VORFNDSFIyKTsKKwkJcG9ydHAtPnN0YXRzLnJ4eG9mZisrOworCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJfQorCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwZmx1c2goc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBmbHVzaChwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0FSLCAocG9ydHAtPnBvcnRuciAmIDB4MDMpKTsKKwlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0NSLCBDQ1JfVFhGTFVTSEZJRk8pOworCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwlwb3J0cC0+dHgudGFpbCA9IHBvcnRwLT50eC5oZWFkOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIGRhdGEgZmxvdyBvbiB0aGlzIHBvcnQuIFRoaXMgaXMgb25seQorICoJcmVhbGx5IGludGVycmVzdGluZyB3aGVuIGRldGVybWluaW5nIGlmIGRhdGEgaGFzIGZ1bGx5IGNvbXBsZXRlZAorICoJdHJhbnNtaXNzaW9uIG9yIG5vdC4uLiBUaGlzIGlzIGVhc3kgZm9yIHRoZSBjZDE0MDAsIGl0IGFjY3VyYXRlbHkKKyAqCW1haW50YWlucyB0aGUgYnVzeSBwb3J0IGZsYWcuCisgKi8KKworc3RhdGljIGludCBzdGxfY2QxNDAwZGF0YXN0YXRlKHN0bHBvcnRfdCAqcG9ydHApCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBkYXRhc3RhdGUocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKworCXJldHVybih0ZXN0X2JpdChBU1lJX1RYQlVTWSwgJnBvcnRwLT5pc3RhdGUpID8gMSA6IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBjZDE0MDAgRWFzeUlPIGJvYXJkcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwZWlvaW50cihzdGxwYW5lbF90ICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisJdW5zaWduZWQgY2hhcglzdnJ0eXBlOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBlaW9pbnRyKHBhbmVscD0leCxpb2Jhc2U9JXgpXG4iLAorCQkoaW50KSBwYW5lbHAsIGlvYmFzZSk7CisjZW5kaWYKKworCW91dGIoU1ZSUiwgaW9iYXNlKTsKKwlzdnJ0eXBlID0gaW5iKGlvYmFzZSArIEVSRUdfREFUQSk7CisJaWYgKHBhbmVscC0+bnJwb3J0cyA+IDQpIHsKKwkJb3V0YigoU1ZSUiArIDB4ODApLCBpb2Jhc2UpOworCQlzdnJ0eXBlIHw9IGluYihpb2Jhc2UgKyBFUkVHX0RBVEEpOworCX0KKworCWlmIChzdnJ0eXBlICYgU1ZSUl9SWCkKKwkJc3RsX2NkMTQwMHJ4aXNyKHBhbmVscCwgaW9iYXNlKTsKKwllbHNlIGlmIChzdnJ0eXBlICYgU1ZSUl9UWCkKKwkJc3RsX2NkMTQwMHR4aXNyKHBhbmVscCwgaW9iYXNlKTsKKwllbHNlIGlmIChzdnJ0eXBlICYgU1ZSUl9NRE0pCisJCXN0bF9jZDE0MDBtZG1pc3IocGFuZWxwLCBpb2Jhc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBjZDE0MDAgcGFuZWxzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBlY2hpbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyCXN2cnR5cGU7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGVjaGludHIocGFuZWxwPSV4LGlvYmFzZT0leClcbiIsIChpbnQpIHBhbmVscCwKKwkJaW9iYXNlKTsKKyNlbmRpZgorCisJb3V0YihTVlJSLCBpb2Jhc2UpOworCXN2cnR5cGUgPSBpbmIoaW9iYXNlICsgRVJFR19EQVRBKTsKKwlvdXRiKChTVlJSICsgMHg4MCksIGlvYmFzZSk7CisJc3ZydHlwZSB8PSBpbmIoaW9iYXNlICsgRVJFR19EQVRBKTsKKwlpZiAoc3ZydHlwZSAmIFNWUlJfUlgpCisJCXN0bF9jZDE0MDByeGlzcihwYW5lbHAsIGlvYmFzZSk7CisJZWxzZSBpZiAoc3ZydHlwZSAmIFNWUlJfVFgpCisJCXN0bF9jZDE0MDB0eGlzcihwYW5lbHAsIGlvYmFzZSk7CisJZWxzZSBpZiAoc3ZydHlwZSAmIFNWUlJfTURNKQorCQlzdGxfY2QxNDAwbWRtaXNyKHBhbmVscCwgaW9iYXNlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglVbmZvcnR1bmF0ZWx5IHdlIG5lZWQgdG8gaGFuZGxlIGJyZWFrcyBpbiB0aGUgVFggZGF0YSBzdHJlYW0sIHNpbmNlCisgKgl0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBnZW5lcmF0ZSB0aGVtIG9uIHRoZSBjZDE0MDAuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc3RsX2NkMTQwMGJyZWFraXNyKHN0bHBvcnRfdCAqcG9ydHAsIGludCBpb2FkZHIpCit7CisJaWYgKHBvcnRwLT5icmtsZW4gPT0gMSkgeworCQlvdXRiKChDT1IyICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJb3V0YigoaW5iKGlvYWRkciArIEVSRUdfREFUQSkgfCBDT1IyX0VUQyksCisJCQkoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCW91dGIoKFREUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJCW91dGIoRVRDX0NNRCwgKGlvYWRkciArIEVSRUdfREFUQSkpOworCQlvdXRiKEVUQ19TVEFSVEJSRUFLLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCW91dGIoKFNSRVIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRiKChpbmIoaW9hZGRyICsgRVJFR19EQVRBKSAmIH4oU1JFUl9UWERBVEEgfCBTUkVSX1RYRU1QVFkpKSwKKwkJCShpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJcmV0dXJuKDEpOworCX0gZWxzZSBpZiAocG9ydHAtPmJya2xlbiA+IDEpIHsKKwkJb3V0YigoVERSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJb3V0YihFVENfQ01ELCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCW91dGIoRVRDX1NUT1BCUkVBSywgKGlvYWRkciArIEVSRUdfREFUQSkpOworCQlwb3J0cC0+YnJrbGVuID0gLTE7CisJCXJldHVybigxKTsKKwl9IGVsc2UgeworCQlvdXRiKChDT1IyICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJb3V0YigoaW5iKGlvYWRkciArIEVSRUdfREFUQSkgJiB+Q09SMl9FVEMpLAorCQkJKGlvYWRkciArIEVSRUdfREFUQSkpOworCQlwb3J0cC0+YnJrbGVuID0gMDsKKwl9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcyBoYXMgZ290dGEgYmUgZmFzdCEgIEhhbmRsaW5nIFRYCisgKgljaGFycyBpcyBwcmV0dHkgc2ltcGxlLCBzdHVmZiBhcyBtYW55IGFzIHBvc3NpYmxlIGZyb20gdGhlIFRYIGJ1ZmZlcgorICoJaW50byB0aGUgY2QxNDAwIEZJRk8uIE11c3QgYWxzbyBoYW5kbGUgVFggYnJlYWtzIGhlcmUsIHNpbmNlIHRoZXkKKyAqCWFyZSBlbWJlZGRlZCBhcyBjb21tYW5kcyBpbiB0aGUgZGF0YSBzdHJlYW0uIE9oIG5vLCBoYWQgdG8gdXNlIGEgZ290byEKKyAqCVRoaXMgY291bGQgYmUgb3B0aW1pemVkIG1vcmUsIHdpbGwgZG8gd2hlbiBJIGdldCB0aW1lLi4uCisgKglJbiBwcmFjdGljZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGludGVycnVwdHMgYXJlIGVuYWJsZWQgYnV0IHRoYXQgdGhlCisgKglwb3J0IGhhcyBiZWVuIGh1bmcgdXAuIE5lZWQgdG8gaGFuZGxlIG5vdCBoYXZpbmcgYW55IFRYIGJ1ZmZlciBoZXJlLAorICoJdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGhlYWQgYW5kIHRhaWwgd2lsbCBhbHNvCisgKgliZSBOVUxMIGlmIHRoZSBidWZmZXIgaGFzIGJlZW4gZnJlZWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMHR4aXNyKHN0bHBhbmVsX3QgKnBhbmVscCwgaW50IGlvYWRkcikKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCWludAkJbGVuLCBzdGxlbjsKKwljaGFyCQkqaGVhZCwgKnRhaWw7CisJdW5zaWduZWQgY2hhcglpb2Fjaywgc3JlcjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwdHhpc3IocGFuZWxwPSV4LGlvYWRkcj0leClcbiIsIChpbnQpIHBhbmVscCwgaW9hZGRyKTsKKyNlbmRpZgorCisJaW9hY2sgPSBpbmIoaW9hZGRyICsgRVJFR19UWEFDSyk7CisJaWYgKCgoaW9hY2sgJiBwYW5lbHAtPmFja21hc2spICE9IDApIHx8CisJICAgICgoaW9hY2sgJiBBQ0tfVFlQTUFTSykgIT0gQUNLX1RZUFRYKSkgeworCQlwcmludGsoIlNUQUxMSU9OOiBiYWQgVFggaW50ZXJydXB0IGFjayB2YWx1ZT0leFxuIiwgaW9hY2spOworCQlyZXR1cm47CisJfQorCXBvcnRwID0gcGFuZWxwLT5wb3J0c1soaW9hY2sgPj4gMyldOworCisvKgorICoJVW5mb3J0dW5hdGVseSB3ZSBuZWVkIHRvIGhhbmRsZSBicmVha3MgaW4gdGhlIGRhdGEgc3RyZWFtLCBzaW5jZQorICoJdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBvbiB0aGUgY2QxNDAwLiBEbyBpdCBub3cgaWYKKyAqCWEgYnJlYWsgaXMgdG8gYmUgc2VudC4KKyAqLworCWlmIChwb3J0cC0+YnJrbGVuICE9IDApCisJCWlmIChzdGxfY2QxNDAwYnJlYWtpc3IocG9ydHAsIGlvYWRkcikpCisJCQlnb3RvIHN0bF90eGFsbGRvbmU7CisKKwloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CisJdGFpbCA9IHBvcnRwLT50eC50YWlsOworCWxlbiA9IChoZWFkID49IHRhaWwpID8gKGhlYWQgLSB0YWlsKSA6IChTVExfVFhCVUZTSVpFIC0gKHRhaWwgLSBoZWFkKSk7CisJaWYgKChsZW4gPT0gMCkgfHwgKChsZW4gPCBTVExfVFhCVUZMT1cpICYmCisJICAgICh0ZXN0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSkgPT0gMCkpKSB7CisJCXNldF9iaXQoQVNZSV9UWExPVywgJnBvcnRwLT5pc3RhdGUpOworCQlzY2hlZHVsZV93b3JrKCZwb3J0cC0+dHF1ZXVlKTsKKwl9CisKKwlpZiAobGVuID09IDApIHsKKwkJb3V0YigoU1JFUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJCXNyZXIgPSBpbmIoaW9hZGRyICsgRVJFR19EQVRBKTsKKwkJaWYgKHNyZXIgJiBTUkVSX1RYREFUQSkgeworCQkJc3JlciA9IChzcmVyICYgflNSRVJfVFhEQVRBKSB8IFNSRVJfVFhFTVBUWTsKKwkJfSBlbHNlIHsKKwkJCXNyZXIgJj0gfihTUkVSX1RYREFUQSB8IFNSRVJfVFhFTVBUWSk7CisJCQljbGVhcl9iaXQoQVNZSV9UWEJVU1ksICZwb3J0cC0+aXN0YXRlKTsKKwkJfQorCQlvdXRiKHNyZXIsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwl9IGVsc2UgeworCQlsZW4gPSBNSU4obGVuLCBDRDE0MDBfVFhGSUZPU0laRSk7CisJCXBvcnRwLT5zdGF0cy50eHRvdGFsICs9IGxlbjsKKwkJc3RsZW4gPSBNSU4obGVuLCAoKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSAtIHRhaWwpKTsKKwkJb3V0YigoVERSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJb3V0c2IoKGlvYWRkciArIEVSRUdfREFUQSksIHRhaWwsIHN0bGVuKTsKKwkJbGVuIC09IHN0bGVuOworCQl0YWlsICs9IHN0bGVuOworCQlpZiAodGFpbCA+PSAocG9ydHAtPnR4LmJ1ZiArIFNUTF9UWEJVRlNJWkUpKQorCQkJdGFpbCA9IHBvcnRwLT50eC5idWY7CisJCWlmIChsZW4gPiAwKSB7CisJCQlvdXRzYigoaW9hZGRyICsgRVJFR19EQVRBKSwgdGFpbCwgbGVuKTsKKwkJCXRhaWwgKz0gbGVuOworCQl9CisJCXBvcnRwLT50eC50YWlsID0gdGFpbDsKKwl9CisKK3N0bF90eGFsbGRvbmU6CisJb3V0YigoRU9TUlIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCW91dGIoMCwgKGlvYWRkciArIEVSRUdfREFUQSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZWNlaXZlIGNoYXJhY3RlciBpbnRlcnJ1cHQgaGFuZGxlci4gRGV0ZXJtaW5lIGlmIHdlIGhhdmUgZ29vZCBjaGFycworICoJb3IgYmFkIGNoYXJzIGFuZCB0aGVuIHByb2Nlc3MgYXBwcm9wcmlhdGVseS4gR29vZCBjaGFycyBhcmUgZWFzeQorICoJanVzdCBzaG92ZSB0aGUgbG90IGludG8gdGhlIFJYIGJ1ZmZlciBhbmQgc2V0IGFsbCBzdGF0dXMgYnl0ZSB0byAwLgorICoJSWYgYSBiYWQgUlggY2hhciB0aGVuIHByb2Nlc3MgYXMgcmVxdWlyZWQuIFRoaXMgcm91dGluZSBuZWVkcyB0byBiZQorICoJZmFzdCEgIEluIHByYWN0aWNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgZ2V0IGFuIGludGVycnVwdCBvbiBhIHBvcnQKKyAqCXRoYXQgaXMgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gb24gaGFuZ3VwcyAtIHNpbmNlIHRoZXkgY29tcGxldGVseQorICoJc2h1dGRvd24gYSBwb3J0IG5vdCBpbiB1c2VyIGNvbnRleHQuIE5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwcnhpc3Ioc3RscGFuZWxfdCAqcGFuZWxwLCBpbnQgaW9hZGRyKQoreworCXN0bHBvcnRfdAkJKnBvcnRwOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgaW50CQlpb2FjaywgbGVuLCBidWZsZW47CisJdW5zaWduZWQgY2hhcgkJc3RhdHVzOworCWNoYXIJCQljaDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwcnhpc3IocGFuZWxwPSV4LGlvYWRkcj0leClcbiIsIChpbnQpIHBhbmVscCwgaW9hZGRyKTsKKyNlbmRpZgorCisJaW9hY2sgPSBpbmIoaW9hZGRyICsgRVJFR19SWEFDSyk7CisJaWYgKChpb2FjayAmIHBhbmVscC0+YWNrbWFzaykgIT0gMCkgeworCQlwcmludGsoIlNUQUxMSU9OOiBiYWQgUlggaW50ZXJydXB0IGFjayB2YWx1ZT0leFxuIiwgaW9hY2spOworCQlyZXR1cm47CisJfQorCXBvcnRwID0gcGFuZWxwLT5wb3J0c1soaW9hY2sgPj4gMyldOworCXR0eSA9IHBvcnRwLT50dHk7CisKKwlpZiAoKGlvYWNrICYgQUNLX1RZUE1BU0spID09IEFDS19UWVBSWEdPT0QpIHsKKwkJb3V0YigoUkRDUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJCWxlbiA9IGluYihpb2FkZHIgKyBFUkVHX0RBVEEpOworCQlpZiAoKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgfHwKKwkJICAgICh0dHktPmZsaXAuY2hhcl9idWZfcHRyID09IChjaGFyICopIE5VTEwpIHx8CisJCSAgICAoKGJ1ZmxlbiA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpID09IDApKSB7CisJCQlsZW4gPSBNSU4obGVuLCBzaXplb2Yoc3RsX3Vud2FudGVkKSk7CisJCQlvdXRiKChSRFNSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJCWluc2IoKGlvYWRkciArIEVSRUdfREFUQSksICZzdGxfdW53YW50ZWRbMF0sIGxlbik7CisJCQlwb3J0cC0+c3RhdHMucnhsb3N0ICs9IGxlbjsKKwkJCXBvcnRwLT5zdGF0cy5yeHRvdGFsICs9IGxlbjsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IE1JTihsZW4sIGJ1Zmxlbik7CisJCQlpZiAobGVuID4gMCkgeworCQkJCW91dGIoKFJEU1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQkJCWluc2IoKGlvYWRkciArIEVSRUdfREFUQSksIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIGxlbik7CisJCQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIGxlbik7CisJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBsZW47CisJCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBsZW47CisJCQkJdHR5LT5mbGlwLmNvdW50ICs9IGxlbjsKKwkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQkJCXBvcnRwLT5zdGF0cy5yeHRvdGFsICs9IGxlbjsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoKGlvYWNrICYgQUNLX1RZUE1BU0spID09IEFDS19UWVBSWEJBRCkgeworCQlvdXRiKChSRFNSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJc3RhdHVzID0gaW5iKGlvYWRkciArIEVSRUdfREFUQSk7CisJCWNoID0gaW5iKGlvYWRkciArIEVSRUdfREFUQSk7CisJCWlmIChzdGF0dXMgJiBTVF9QQVJJVFkpCisJCQlwb3J0cC0+c3RhdHMucnhwYXJpdHkrKzsKKwkJaWYgKHN0YXR1cyAmIFNUX0ZSQU1JTkcpCisJCQlwb3J0cC0+c3RhdHMucnhmcmFtaW5nKys7CisJCWlmIChzdGF0dXMgJiBTVF9PVkVSUlVOKQorCQkJcG9ydHAtPnN0YXRzLnJ4b3ZlcnJ1bisrOworCQlpZiAoc3RhdHVzICYgU1RfQlJFQUspCisJCQlwb3J0cC0+c3RhdHMucnhicmVha3MrKzsKKwkJaWYgKHN0YXR1cyAmIFNUX1NDSEFSTUFTSykgeworCQkJaWYgKChzdGF0dXMgJiBTVF9TQ0hBUk1BU0spID09IFNUX1NDSEFSMSkKKwkJCQlwb3J0cC0+c3RhdHMudHh4b24rKzsKKwkJCWlmICgoc3RhdHVzICYgU1RfU0NIQVJNQVNLKSA9PSBTVF9TQ0hBUjIpCisJCQkJcG9ydHAtPnN0YXRzLnR4eG9mZisrOworCQkJZ290byBzdGxfcnhhbGxkb25lOworCQl9CisJCWlmICgodHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSAmJgorCQkgICAgKChwb3J0cC0+cnhpZ25vcmVtc2sgJiBzdGF0dXMpID09IDApKSB7CisJCQlpZiAocG9ydHAtPnJ4bWFya21zayAmIHN0YXR1cykgeworCQkJCWlmIChzdGF0dXMgJiBTVF9CUkVBSykgeworCQkJCQlzdGF0dXMgPSBUVFlfQlJFQUs7CisJCQkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TQUspIHsKKwkJCQkJCWRvX1NBSyh0dHkpOworCQkJCQkJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNUX1BBUklUWSkgeworCQkJCQlzdGF0dXMgPSBUVFlfUEFSSVRZOworCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1RfRlJBTUlORykgeworCQkJCQlzdGF0dXMgPSBUVFlfRlJBTUU7CisJCQkJfSBlbHNlIGlmKHN0YXR1cyAmIFNUX09WRVJSVU4pIHsKKwkJCQkJc3RhdHVzID0gVFRZX09WRVJSVU47CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RhdHVzID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IDA7CisJCQl9CisJCQlpZiAodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciAhPSAoY2hhciAqKSBOVUxMKSB7CisJCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IHN0YXR1czsKKwkJCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOworCQkJCQl0dHktPmZsaXAuY291bnQrKzsKKwkJCQl9CisJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXByaW50aygiU1RBTExJT046IGJhZCBSWCBpbnRlcnJ1cHQgYWNrIHZhbHVlPSV4XG4iLCBpb2Fjayk7CisJCXJldHVybjsKKwl9CisKK3N0bF9yeGFsbGRvbmU6CisJb3V0YigoRU9TUlIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCW91dGIoMCwgKGlvYWRkciArIEVSRUdfREFUQSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglNb2RlbSBpbnRlcnJ1cHQgaGFuZGxlci4gVGhlIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2RlbSBzaWduYWwgbGluZQorICoJKERDRCkgaGFzIGNoYW5nZWQgc3RhdGUuIExlYXZlIG1vc3Qgb2YgdGhlIHdvcmsgdG8gdGhlIG9mZi1sZXZlbAorICoJcHJvY2Vzc2luZyByb3V0aW5lLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBtZG1pc3Ioc3RscGFuZWxfdCAqcGFuZWxwLCBpbnQgaW9hZGRyKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CWlvYWNrOworCXVuc2lnbmVkIGNoYXIJbWlzcjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwbWRtaXNyKHBhbmVscD0leClcbiIsIChpbnQpIHBhbmVscCk7CisjZW5kaWYKKworCWlvYWNrID0gaW5iKGlvYWRkciArIEVSRUdfTURBQ0spOworCWlmICgoKGlvYWNrICYgcGFuZWxwLT5hY2ttYXNrKSAhPSAwKSB8fAorCSAgICAoKGlvYWNrICYgQUNLX1RZUE1BU0spICE9IEFDS19UWVBNRE0pKSB7CisJCXByaW50aygiU1RBTExJT046IGJhZCBNT0RFTSBpbnRlcnJ1cHQgYWNrIHZhbHVlPSV4XG4iLCBpb2Fjayk7CisJCXJldHVybjsKKwl9CisJcG9ydHAgPSBwYW5lbHAtPnBvcnRzWyhpb2FjayA+PiAzKV07CisKKwlvdXRiKChNSVNSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwltaXNyID0gaW5iKGlvYWRkciArIEVSRUdfREFUQSk7CisJaWYgKG1pc3IgJiBNSVNSX0RDRCkgeworCQlzZXRfYml0KEFTWUlfRENEQ0hBTkdFLCAmcG9ydHAtPmlzdGF0ZSk7CisJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cXVldWUpOworCQlwb3J0cC0+c3RhdHMubW9kZW0rKzsKKwl9CisKKwlvdXRiKChFT1NSUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJb3V0YigwLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIFNDMjYxOTggSEFSRFdBUkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRoZXNlIGZ1bmN0aW9ucyBnZXQvc2V0L3VwZGF0ZSB0aGUgcmVnaXN0ZXJzIG9mIHRoZSBzYzI2MTk4IFVBUlRzLgorICoJQWNjZXNzIHRvIHRoZSBzYzI2MTk4IHJlZ2lzdGVycyBpcyB2aWEgYW4gYWRkcmVzcy9kYXRhIGlvIHBvcnQgcGFpci4KKyAqCShNYXliZSBzaG91bGQgbWFrZSB0aGlzIGlubGluZS4uLikKKyAqLworCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4Z2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducikKK3sKKwlvdXRiKChyZWduciB8IHBvcnRwLT51YXJ0YWRkciksIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOworCXJldHVybihpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKK30KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCit7CisJb3V0YigocmVnbnIgfCBwb3J0cC0+dWFydGFkZHIpLCAocG9ydHAtPmlvYWRkciArIFhQX0FERFIpKTsKKwlvdXRiKHZhbHVlLCAocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKK30KKworc3RhdGljIGludCBzdGxfc2MyNjE5OHVwZGF0ZXJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3sKKwlvdXRiKChyZWduciB8IHBvcnRwLT51YXJ0YWRkciksIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOworCWlmIChpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpICE9IHZhbHVlKSB7CisJCW91dGIodmFsdWUsIChwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRnVuY3Rpb25zIHRvIGdldCBhbmQgc2V0IHRoZSBzYzI2MTk4IGdsb2JhbCByZWdpc3RlcnMuCisgKi8KKworc3RhdGljIGludCBzdGxfc2MyNjE5OGdldGdsb2JyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKQoreworCW91dGIocmVnbnIsIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOworCXJldHVybihpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0Z2xvYnJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3sKKwlvdXRiKHJlZ25yLCAocG9ydHAtPmlvYWRkciArIFhQX0FERFIpKTsKKwlvdXRiKHZhbHVlLCAocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbmJpdGlhbGl6ZSB0aGUgVUFSVHMgaW4gYSBwYW5lbC4gV2UgZG9uJ3QgY2FyZSB3aGF0IHNvcnQgb2YgYm9hcmQKKyAqCXRoZXNlIHBvcnRzIGFyZSBvbiAtIHNpbmNlIHRoZSBwb3J0IGlvIHJlZ2lzdGVycyBhcmUgYWxtb3N0CisgKglpZGVudGljYWwgd2hlbiBkZWFsaW5nIHdpdGggcG9ydHMuCisgKi8KKworc3RhdGljIGludCBzdGxfc2MyNjE5OHBhbmVsaW5pdChzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwKQoreworCWludAljaGlwbWFzaywgaTsKKwlpbnQJbnJjaGlwcywgaW9hZGRyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4cGFuZWxpbml0KGJyZHA9JXgscGFuZWxwPSV4KVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgcGFuZWxwKTsKKyNlbmRpZgorCisJQlJERU5BQkxFKHBhbmVscC0+YnJkbnIsIHBhbmVscC0+cGFnZW5yKTsKKworLyoKKyAqCUNoZWNrIHRoYXQgZWFjaCBjaGlwIGlzIHByZXNlbnQgYW5kIHN0YXJ0ZWQgdXAgT0suCisgKi8KKwljaGlwbWFzayA9IDA7CisJbnJjaGlwcyA9IChwYW5lbHAtPm5ycG9ydHMgKyA0KSAvIFNDMjYxOThfUE9SVFM7CisJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDSFBDSSkKKwkJb3V0YihwYW5lbHAtPnBhZ2VuciwgYnJkcC0+aW9jdHJsKTsKKworCWZvciAoaSA9IDA7IChpIDwgbnJjaGlwcyk7IGkrKykgeworCQlpb2FkZHIgPSBwYW5lbHAtPmlvYmFzZSArIChpICogNCk7IAorCQlvdXRiKFNDQ1IsIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCW91dGIoQ1JfUkVTRVRBTEwsIChpb2FkZHIgKyBYUF9EQVRBKSk7CisJCW91dGIoVFNUUiwgKGlvYWRkciArIFhQX0FERFIpKTsKKwkJaWYgKGluYihpb2FkZHIgKyBYUF9EQVRBKSAhPSAwKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBzYzI2MTk4IG5vdCByZXNwb25kaW5nLCAiCisJCQkJImJyZD0lZCBwYW5lbD0lZCBjaGlwPSVkXG4iLAorCQkJCXBhbmVscC0+YnJkbnIsIHBhbmVscC0+cGFuZWxuciwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCQljaGlwbWFzayB8PSAoMHgxIDw8IGkpOworCQlvdXRiKEdDQ1IsIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCW91dGIoR0NDUl9JVlJUWVBDSEFOQUNLLCAoaW9hZGRyICsgWFBfREFUQSkpOworCQlvdXRiKFdEVFJDUiwgKGlvYWRkciArIFhQX0FERFIpKTsKKwkJb3V0YigweGZmLCAoaW9hZGRyICsgWFBfREFUQSkpOworCX0KKworCUJSRERJU0FCTEUocGFuZWxwLT5icmRucik7CisJcmV0dXJuKGNoaXBtYXNrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSBzcGVjaWZpYyBwb3J0IHJlZ2lzdGVycy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHBvcnRpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHAsIHN0bHBvcnRfdCAqcG9ydHApCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4cG9ydGluaXQoYnJkcD0leCxwYW5lbHA9JXgscG9ydHA9JXgpXG4iLAorCQkoaW50KSBicmRwLCAoaW50KSBwYW5lbHAsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKSB8fCAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpIHx8CisJICAgIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpKQorCQlyZXR1cm47CisKKwlwb3J0cC0+aW9hZGRyID0gcGFuZWxwLT5pb2Jhc2UgKyAoKHBvcnRwLT5wb3J0bnIgPCA4KSA/IDAgOiA0KTsKKwlwb3J0cC0+dWFydGFkZHIgPSAocG9ydHAtPnBvcnRuciAmIDB4MDcpIDw8IDQ7CisJcG9ydHAtPnBhZ2VuciA9IHBhbmVscC0+cGFnZW5yOworCXBvcnRwLT5od2lkID0gMHgxOworCisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIElPUENSLCBJT1BDUl9TRVRTSUdTKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNldCB1cCB0aGUgc2MyNjE5OCByZWdpc3RlcnMgZm9yIGEgcG9ydCBiYXNlZCBvbiB0aGUgdGVybWlvcyBwb3J0CisgKglzZXR0aW5ncy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNldHBvcnQoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKQoreworCXN0bGJyZF90CSpicmRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWJhdWRyYXRlOworCXVuc2lnbmVkIGNoYXIJbXIwLCBtcjEsIG1yMiwgY2xrOworCXVuc2lnbmVkIGNoYXIJaW1yb24sIGltcm9mZiwgaW9wciwgaXByOworCisJbXIwID0gMDsKKwltcjEgPSAwOworCW1yMiA9IDA7CisJY2xrID0gMDsKKwlpb3ByID0gMDsKKwlpbXJvbiA9IDA7CisJaW1yb2ZmID0gMDsKKworCWJyZHAgPSBzdGxfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKy8qCisgKglTZXQgdXAgdGhlIFJYIGNoYXIgaWdub3JlIG1hc2sgd2l0aCB0aG9zZSBSWCBlcnJvciB0eXBlcyB3ZQorICoJY2FuIGlnbm9yZS4KKyAqLworCXBvcnRwLT5yeGlnbm9yZW1zayA9IDA7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSUdOUEFSKQorCQlwb3J0cC0+cnhpZ25vcmVtc2sgfD0gKFNSX1JYUEFSSVRZIHwgU1JfUlhGUkFNSU5HIHwKKwkJCVNSX1JYT1ZFUlJVTik7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSUdOQlJLKQorCQlwb3J0cC0+cnhpZ25vcmVtc2sgfD0gU1JfUlhCUkVBSzsKKworCXBvcnRwLT5yeG1hcmttc2sgPSBTUl9SWE9WRVJSVU47CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgKElOUENLIHwgUEFSTVJLKSkKKwkJcG9ydHAtPnJ4bWFya21zayB8PSAoU1JfUlhQQVJJVFkgfCBTUl9SWEZSQU1JTkcpOworCWlmICh0aW9zcC0+Y19pZmxhZyAmIEJSS0lOVCkKKwkJcG9ydHAtPnJ4bWFya21zayB8PSBTUl9SWEJSRUFLOworCisvKgorICoJR28gdGhyb3VnaCB0aGUgY2hhciBzaXplLCBwYXJpdHkgYW5kIHN0b3AgYml0cyBhbmQgc2V0IGFsbCB0aGUKKyAqCW9wdGlvbiByZWdpc3RlciBhcHByb3ByaWF0ZWx5LgorICovCisJc3dpdGNoICh0aW9zcC0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCW1yMSB8PSBNUjFfQ1M1OworCQlicmVhazsKKwljYXNlIENTNjoKKwkJbXIxIHw9IE1SMV9DUzY7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQltcjEgfD0gTVIxX0NTNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXIxIHw9IE1SMV9DUzg7CisJCWJyZWFrOworCX0KKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENTVE9QQikKKwkJbXIyIHw9IE1SMl9TVE9QMjsKKwllbHNlCisJCW1yMiB8PSBNUjJfU1RPUDE7CisKKwlpZiAodGlvc3AtPmNfY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKHRpb3NwLT5jX2NmbGFnICYgUEFST0REKQorCQkJbXIxIHw9IChNUjFfUEFSRU5CIHwgTVIxX1BBUk9ERCk7CisJCWVsc2UKKwkJCW1yMSB8PSAoTVIxX1BBUkVOQiB8IE1SMV9QQVJFVkVOKTsKKwl9IGVsc2UgeworCQltcjEgfD0gTVIxX1BBUk5PTkU7CisJfQorCisJbXIxIHw9IE1SMV9FUlJCTE9DSzsKKworLyoKKyAqCVNldCB0aGUgUlggRklGTyB0aHJlc2hvbGQgYXQgOCBjaGFycy4gVGhpcyBnaXZlcyBhIGJpdCBvZiBicmVhdGhpbmcKKyAqCXNwYWNlIGZvciBoYXJkd2FyZSBmbG93IGNvbnRyb2wgYW5kIHRoZSBsaWtlLiBUaGlzIHNob3VsZCBiZSBzZXQgdG8KKyAqCVZNSU4uCisgKi8KKwltcjIgfD0gTVIyX1JYRklGT0hBTEY7CisKKy8qCisgKglDYWxjdWxhdGUgdGhlIGJhdWQgcmF0ZSB0aW1lcnMuIEZvciBub3cgd2Ugd2lsbCBqdXN0IGFzc3VtZSB0aGF0CisgKgl0aGUgaW5wdXQgYW5kIG91dHB1dCBiYXVkIGFyZSB0aGUgc2FtZS4gVGhlIHNjMjYxOTggaGFzIGEgZml4ZWQKKyAqCWJhdWQgcmF0ZSB0YWJsZSwgc28gb25seSBkaXNjcmV0ZSBiYXVkIHJhdGVzIHBvc3NpYmxlLgorICovCisJYmF1ZHJhdGUgPSB0aW9zcC0+Y19jZmxhZyAmIENCQVVEOworCWlmIChiYXVkcmF0ZSAmIENCQVVERVgpIHsKKwkJYmF1ZHJhdGUgJj0gfkNCQVVERVg7CisJCWlmICgoYmF1ZHJhdGUgPCAxKSB8fCAoYmF1ZHJhdGUgPiA0KSkKKwkJCXRpb3NwLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQliYXVkcmF0ZSArPSAxNTsKKwl9CisJYmF1ZHJhdGUgPSBzdGxfYmF1ZHJhdGVzW2JhdWRyYXRlXTsKKwlpZiAoKHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCkgeworCQlpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQliYXVkcmF0ZSA9IDU3NjAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkcmF0ZSA9IDExNTIwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQorCQkJYmF1ZHJhdGUgPSAyMzA0MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJCQliYXVkcmF0ZSA9IDQ2MDgwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkKKwkJCWJhdWRyYXRlID0gKHBvcnRwLT5iYXVkX2Jhc2UgLyBwb3J0cC0+Y3VzdG9tX2Rpdmlzb3IpOworCX0KKwlpZiAoYmF1ZHJhdGUgPiBTVExfU0MyNjE5OE1BWEJBVUQpCisJCWJhdWRyYXRlID0gU1RMX1NDMjYxOThNQVhCQVVEOworCisJaWYgKGJhdWRyYXRlID4gMCkgeworCQlmb3IgKGNsayA9IDA7IChjbGsgPCBTQzI2MTk4X05SQkFVRFMpOyBjbGsrKykgeworCQkJaWYgKGJhdWRyYXRlIDw9IHNjMjYxOThfYmF1ZHRhYmxlW2Nsa10pCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKy8qCisgKglDaGVjayB3aGF0IGZvcm0gb2YgbW9kZW0gc2lnbmFsaW5nIGlzIHJlcXVpcmVkIGFuZCBzZXQgaXQgdXAuCisgKi8KKwlpZiAodGlvc3AtPmNfY2ZsYWcgJiBDTE9DQUwpIHsKKwkJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwl9IGVsc2UgeworCQlpb3ByIHw9IElPUFJfRENEQ09TOworCQlpbXJvbiB8PSBJUl9JT1BPUlQ7CisJCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwl9CisKKy8qCisgKglTZXR1cCBzYzI2MTk4IGVuaGFuY2VkIG1vZGVzIGlmIHdlIGNhbi4gSW4gcGFydGljdWxhciB3ZSB3YW50IHRvCisgKgloYW5kbGUgYXMgbXVjaCBvZiB0aGUgZmxvdyBjb250cm9sIGFzIHBvc3NpYmxlIGF1dG9tYXRpY2FsbHkuIEFzCisgKgl3ZWxsIGFzIHNhdmluZyBhIGZldyBDUFUgY3ljbGVzIGl0IHdpbGwgYWxzbyBncmVhdGx5IGltcHJvdmUgZmxvdworICoJY29udHJvbCByZWxpYWJpbGl0eS4KKyAqLworCWlmICh0aW9zcC0+Y19pZmxhZyAmIElYT04pIHsKKwkJbXIwIHw9IE1SMF9TV0ZUWCB8IE1SMF9TV0ZUOworCQlpbXJvbiB8PSBJUl9YT05YT0ZGOworCX0gZWxzZSB7CisJCWltcm9mZiB8PSBJUl9YT05YT0ZGOworCX0KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJWE9GRikKKwkJbXIwIHw9IE1SMF9TV0ZSWDsKKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJbXIyIHw9IE1SMl9BVVRPQ1RTOworCQltcjEgfD0gTVIxX0FVVE9SVFM7CisJfQorCisvKgorICoJQWxsIHNjMjYxOTggcmVnaXN0ZXIgdmFsdWVzIGNhbGN1bGF0ZWQgc28gZ28gdGhyb3VnaCBhbmQgc2V0CisgKgl0aGVtIGFsbCB1cC4KKyAqLworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlNFVFBPUlQ6IHBvcnRucj0lZCBwYW5lbG5yPSVkIGJyZG5yPSVkXG4iLAorCQlwb3J0cC0+cG9ydG5yLCBwb3J0cC0+cGFuZWxuciwgcG9ydHAtPmJyZG5yKTsKKwlwcmludGsoIiAgICBtcjA9JXggbXIxPSV4IG1yMj0leCBjbGs9JXhcbiIsIG1yMCwgbXIxLCBtcjIsIGNsayk7CisJcHJpbnRrKCIgICAgaW9wcj0leCBpbXJvbj0leCBpbXJvZmY9JXhcbiIsIGlvcHIsIGltcm9uLCBpbXJvZmYpOworCXByaW50aygiICAgIHNjaHIxPSV4IHNjaHIyPSV4IHNjaHIzPSV4IHNjaHI0PSV4XG4iLAorCQl0aW9zcC0+Y19jY1tWU1RBUlRdLCB0aW9zcC0+Y19jY1tWU1RPUF0sCisJCXRpb3NwLT5jX2NjW1ZTVEFSVF0sIHRpb3NwLT5jX2NjW1ZTVE9QXSk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBJTVIsIDApOworCXN0bF9zYzI2MTk4dXBkYXRlcmVnKHBvcnRwLCBNUjAsIG1yMCk7CisJc3RsX3NjMjYxOTh1cGRhdGVyZWcocG9ydHAsIE1SMSwgbXIxKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfUlhFUlJCTE9DSyk7CisJc3RsX3NjMjYxOTh1cGRhdGVyZWcocG9ydHAsIE1SMiwgbXIyKTsKKwlzdGxfc2MyNjE5OHVwZGF0ZXJlZyhwb3J0cCwgSU9QSU9SLAorCQkoKHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBJT1BJT1IpICYgfklQUl9DSEFOR0VNQVNLKSB8IGlvcHIpKTsKKworCWlmIChiYXVkcmF0ZSA+IDApIHsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFRYQ1NSLCBjbGspOworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgUlhDU1IsIGNsayk7CisJfQorCisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFhPTkNSLCB0aW9zcC0+Y19jY1tWU1RBUlRdKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgWE9GRkNSLCB0aW9zcC0+Y19jY1tWU1RPUF0pOworCisJaXByID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIElQUik7CisJaWYgKGlwciAmIElQUl9EQ0QpCisJCXBvcnRwLT5zaWdzICY9IH5USU9DTV9DRDsKKwllbHNlCisJCXBvcnRwLT5zaWdzIHw9IFRJT0NNX0NEOworCisJcG9ydHAtPmltciA9IChwb3J0cC0+aW1yICYgfmltcm9mZikgfCBpbXJvbjsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU1SLCBwb3J0cC0+aW1yKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNldCB0aGUgc3RhdGUgb2YgdGhlIERUUiBhbmQgUlRTIHNpZ25hbHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpCit7CisJdW5zaWduZWQgY2hhcglpb3Bpb3JvbiwgaW9waW9yb2ZmOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThzZXRzaWduYWxzKHBvcnRwPSV4LGR0cj0lZCxydHM9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgZHRyLCBydHMpOworI2VuZGlmCisKKwlpb3Bpb3JvbiA9IDA7CisJaW9waW9yb2ZmID0gMDsKKwlpZiAoZHRyID09IDApCisJCWlvcGlvcm9mZiB8PSBJUFJfRFRSOworCWVsc2UgaWYgKGR0ciA+IDApCisJCWlvcGlvcm9uIHw9IElQUl9EVFI7CisJaWYgKHJ0cyA9PSAwKQorCQlpb3Bpb3JvZmYgfD0gSVBSX1JUUzsKKwllbHNlIGlmIChydHMgPiAwKQorCQlpb3Bpb3JvbiB8PSBJUFJfUlRTOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIElPUElPUiwKKwkJKChzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgSU9QSU9SKSAmIH5pb3Bpb3JvZmYpIHwgaW9waW9yb24pKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHNpZ25hbHMuCisgKi8KKworc3RhdGljIGludCBzdGxfc2MyNjE5OGdldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBjaGFyCWlwcjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJc2lnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2MyNjE5OGdldHNpZ25hbHMocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCWlwciA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBJUFIpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXNpZ3MgPSAwOworCXNpZ3MgfD0gKGlwciAmIElQUl9EQ0QpID8gMCA6IFRJT0NNX0NEOworCXNpZ3MgfD0gKGlwciAmIElQUl9DVFMpID8gMCA6IFRJT0NNX0NUUzsKKwlzaWdzIHw9IChpcHIgJiBJUFJfRFRSKSA/IDA6IFRJT0NNX0RUUjsKKwlzaWdzIHw9IChpcHIgJiBJUFJfUlRTKSA/IDA6IFRJT0NNX1JUUzsKKwlzaWdzIHw9IFRJT0NNX0RTUjsKKwlyZXR1cm4oc2lncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUVuYWJsZS9EaXNhYmxlIHRoZSBUcmFuc21pdHRlciBhbmQvb3IgUmVjZWl2ZXIuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThlbmFibGVyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQoreworCXVuc2lnbmVkIGNoYXIJY2NyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThlbmFibGVyeHR4KHBvcnRwPSV4LHJ4PSVkLHR4PSVkKVxuIiwKKwkJKGludCkgcG9ydHAsIHJ4LCB0eCk7CisjZW5kaWYKKworCWNjciA9IHBvcnRwLT5jcmVuYWJsZTsKKwlpZiAodHggPT0gMCkKKwkJY2NyICY9IH5DUl9UWEVOQUJMRTsKKwllbHNlIGlmICh0eCA+IDApCisJCWNjciB8PSBDUl9UWEVOQUJMRTsKKwlpZiAocnggPT0gMCkKKwkJY2NyICY9IH5DUl9SWEVOQUJMRTsKKwllbHNlIGlmIChyeCA+IDApCisJCWNjciB8PSBDUl9SWEVOQUJMRTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBjY3IpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlwb3J0cC0+Y3JlbmFibGUgPSBjY3I7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVN0YXJ0L3N0b3AgdGhlIFRyYW5zbWl0dGVyIGFuZC9vciBSZWNlaXZlci4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHN0YXJ0cnh0eChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCkKK3sKKwl1bnNpZ25lZCBjaGFyCWltcjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4c3RhcnRyeHR4KHBvcnRwPSV4LHJ4PSVkLHR4PSVkKVxuIiwKKwkJKGludCkgcG9ydHAsIHJ4LCB0eCk7CisjZW5kaWYKKworCWltciA9IHBvcnRwLT5pbXI7CisJaWYgKHR4ID09IDApCisJCWltciAmPSB+SVJfVFhSRFk7CisJZWxzZSBpZiAodHggPT0gMSkKKwkJaW1yIHw9IElSX1RYUkRZOworCWlmIChyeCA9PSAwKQorCQlpbXIgJj0gfihJUl9SWFJEWSB8IElSX1JYQlJFQUsgfCBJUl9SWFdBVENIRE9HKTsKKwllbHNlIGlmIChyeCA+IDApCisJCWltciB8PSBJUl9SWFJEWSB8IElSX1JYQlJFQUsgfCBJUl9SWFdBVENIRE9HOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIElNUiwgaW1yKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcG9ydHAtPmltciA9IGltcjsKKwlpZiAodHggPiAwKQorCQlzZXRfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURpc2FibGUgYWxsIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThkaXNhYmxlaW50cnMoc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4ZGlzYWJsZWludHJzKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlwb3J0cC0+aW1yID0gMDsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU1SLCAwKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZW5kYnJlYWsoc3RscG9ydF90ICpwb3J0cCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4c2VuZGJyZWFrKHBvcnRwPSV4LGxlbj0lZClcbiIsIChpbnQpIHBvcnRwLCBsZW4pOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlpZiAobGVuID09IDEpIHsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU1RBUlRCUkVBSyk7CisJCXBvcnRwLT5zdGF0cy50eGJyZWFrcysrOworCX0gZWxzZSB7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9UWFNUT1BCUkVBSyk7CisJfQorCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGFrZSBmbG93IGNvbnRyb2wgYWN0aW9ucy4uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4Zmxvd2N0cmwoc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKQoreworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkJbXIwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4Zmxvd2N0cmwocG9ydHA9JXgsc3RhdGU9JXgpXG4iLCAoaW50KSBwb3J0cCwgc3RhdGUpOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKworCWlmIChzdGF0ZSkgeworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYpIHsKKwkJCW1yMCA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBNUjApOworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgKG1yMCAmIH5NUjBfU1dGUlhUWCkpOworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU0VORFhPTik7CisJCQltcjAgfD0gTVIwX1NXRlJYOworCQkJcG9ydHAtPnN0YXRzLnJ4eG9uKys7CisJCQlzdGxfc2MyNjE5OHdhaXQocG9ydHApOworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgbXIwKTsKKwkJfQorLyoKKyAqCQlRdWVzdGlvbjogc2hvdWxkIHdlIHJldHVybiBSVFMgdG8gd2hhdCBpdCB3YXMgYmVmb3JlPyBJdCBtYXkKKyAqCQloYXZlIGJlZW4gc2V0IGJ5IGFuIGlvY3RsLi4uIFN1cHBvc2Ugbm90LCBzaW5jZSBpZiB5b3UgaGF2ZQorICoJCWhhcmR3YXJlIGZsb3cgY29udHJvbCBzZXQgdGhlbiBpdCBpcyBwcmV0dHkgc2lsbHkgdG8gZ28gYW5kCisgKgkJc2V0IHRoZSBSVFMgbGluZSBieSBoYW5kLgorICovCisJCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIxLAorCQkJCShzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgTVIxKSB8IE1SMV9BVVRPUlRTKSk7CisJCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU9QSU9SLAorCQkJCShzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgSU9QSU9SKSB8IElPUFJfUlRTKSk7CisJCQlwb3J0cC0+c3RhdHMucnhydHNvbisrOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYT0ZGKSB7CisJCQltcjAgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgTVIwKTsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjAsIChtcjAgJiB+TVIwX1NXRlJYVFgpKTsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9UWFNFTkRYT0ZGKTsKKwkJCW1yMCAmPSB+TVIwX1NXRlJYOworCQkJcG9ydHAtPnN0YXRzLnJ4eG9mZisrOworCQkJc3RsX3NjMjYxOTh3YWl0KHBvcnRwKTsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjAsIG1yMCk7CisJCX0KKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjEsCisJCQkJKHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBNUjEpICYgfk1SMV9BVVRPUlRTKSk7CisJCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU9QSU9SLAorCQkJCShzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgSU9QSU9SKSAmIH5JT1BSX1JUUykpOworCQkJcG9ydHAtPnN0YXRzLnJ4cnRzb2ZmKys7CisJCX0KKwl9CisKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNlbmQgYSBmbG93IGNvbnRyb2wgY2hhcmFjdGVyLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2VuZGZsb3coc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKQoreworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkJbXIwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4c2VuZGZsb3cocG9ydHA9JXgsc3RhdGU9JXgpXG4iLCAoaW50KSBwb3J0cCwgc3RhdGUpOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlpZiAoc3RhdGUpIHsKKwkJbXIwID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIE1SMCk7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjAsIChtcjAgJiB+TVIwX1NXRlJYVFgpKTsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU0VORFhPTik7CisJCW1yMCB8PSBNUjBfU1dGUlg7CisJCXBvcnRwLT5zdGF0cy5yeHhvbisrOworCQlzdGxfc2MyNjE5OHdhaXQocG9ydHApOworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCBtcjApOworCX0gZWxzZSB7CisJCW1yMCA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBNUjApOworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCAobXIwICYgfk1SMF9TV0ZSWFRYKSk7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9UWFNFTkRYT0ZGKTsKKwkJbXIwICY9IH5NUjBfU1dGUlg7CisJCXBvcnRwLT5zdGF0cy5yeHhvZmYrKzsKKwkJc3RsX3NjMjYxOTh3YWl0KHBvcnRwKTsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgbXIwKTsKKwl9CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4Zmx1c2goc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4Zmx1c2gocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9UWFJFU0VUKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgcG9ydHAtPmNyZW5hYmxlKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcG9ydHAtPnR4LnRhaWwgPSBwb3J0cC0+dHguaGVhZDsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIGRhdGEgZmxvdyBvbiB0aGlzIHBvcnQuIFRoaXMgaXMgb25seQorICoJcmVhbGx5IGludGVycmVzdGluZyB3aGVuIGRldGVybWluaW5nIGlmIGRhdGEgaGFzIGZ1bGx5IGNvbXBsZXRlZAorICoJdHJhbnNtaXNzaW9uIG9yIG5vdC4uLiBUaGUgc2MyNjE5OCBpbnRlcnJ1cHQgc2NoZW1lIGNhbm5vdAorICoJZGV0ZXJtaW5lIHdoZW4gYWxsIGRhdGEgaGFzIGFjdHVhbGx5IGRyYWluZWQsIHNvIHdlIG5lZWQgdG8KKyAqCWNoZWNrIHRoZSBwb3J0IHN0YXR1c3kgcmVnaXN0ZXIgdG8gYmUgc3VyZS4KKyAqLworCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4ZGF0YXN0YXRlKHN0bHBvcnRfdCAqcG9ydHApCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBjaGFyCXNyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4ZGF0YXN0YXRlKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHRlc3RfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSkpCisJCXJldHVybigxKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXNyID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIFNSKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4oKHNyICYgU1JfVFhFTVBUWSkgPyAwIDogMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlbGF5IGZvciBhIHNtYWxsIGFtb3VudCBvZiB0aW1lLCB0byBnaXZlIHRoZSBzYzI2MTk4IGEgY2hhbmNlCisgKgl0byBwcm9jZXNzIGEgY29tbWFuZC4uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4d2FpdChzdGxwb3J0X3QgKnBvcnRwKQoreworCWludAlpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4d2FpdChwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgKGkgPCAyMCk7IGkrKykKKwkJc3RsX3NjMjYxOThnZXRnbG9icmVnKHBvcnRwLCBUU1RSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSWYgd2UgYXJlIFRYIGZsb3cgY29udHJvbGxlZCBhbmQgaW4gSVhBTlkgbW9kZSB0aGVuIHdlIG1heQorICoJbmVlZCB0byB1bmZsb3cgY29udHJvbCBoZXJlLiBXZSBnb3R0YSBkbyB0aGlzIGJlY2F1c2Ugb2YgdGhlCisgKglhdXRvbWF0aWMgZmxvdyBjb250cm9sIG1vZGVzIG9mIHRoZSBzYzI2MTk4LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGxfc2MyNjE5OHR4dW5mbG93KHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgY2hhcgltcjA7CisKKwltcjAgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgTVIwKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCAobXIwICYgfk1SMF9TV0ZSWFRYKSk7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX0hPU1RYT04pOworCXN0bF9zYzI2MTk4d2FpdChwb3J0cCk7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgbXIwKTsKKwljbGVhcl9iaXQoQVNZSV9UWEZMT1dFRCwgJnBvcnRwLT5pc3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBzYzI2MTk4IHBhbmVscy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OGludHIoc3RscGFuZWxfdCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CWlhY2s7CisKKy8qIAorICoJV29yayBhcm91bmQgYnVnIGluIHNjMjYxOTggY2hpcC4uLiBDYW5ub3QgaGF2ZSBBNiBhZGRyZXNzCisgKglsaW5lIG9mIFVBUlQgaGlnaCwgZWxzZSBpYWNrIHdpbGwgYmUgcmV0dXJuZWQgYXMgMC4KKyAqLworCW91dGIoMCwgKGlvYmFzZSArIDEpKTsKKworCWlhY2sgPSBpbmIoaW9iYXNlICsgWFBfSUFDSyk7CisJcG9ydHAgPSBwYW5lbHAtPnBvcnRzWyhpYWNrICYgSVZSX0NIQU5NQVNLKSArICgoaW9iYXNlICYgMHg0KSA8PCAxKV07CisKKwlpZiAoaWFjayAmIElWUl9SWERBVEEpCisJCXN0bF9zYzI2MTk4cnhpc3IocG9ydHAsIGlhY2spOworCWVsc2UgaWYgKGlhY2sgJiBJVlJfVFhEQVRBKQorCQlzdGxfc2MyNjE5OHR4aXNyKHBvcnRwKTsKKwllbHNlCisJCXN0bF9zYzI2MTk4b3RoZXJpc3IocG9ydHAsIGlhY2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcyBoYXMgZ290dGEgYmUgZmFzdCEgIEhhbmRsaW5nIFRYCisgKgljaGFycyBpcyBwcmV0dHkgc2ltcGxlLCBzdHVmZiBhcyBtYW55IGFzIHBvc3NpYmxlIGZyb20gdGhlIFRYIGJ1ZmZlcgorICoJaW50byB0aGUgc2MyNjE5OCBGSUZPLgorICoJSW4gcHJhY3RpY2UgaXQgaXMgcG9zc2libGUgdGhhdCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGJ1dCB0aGF0IHRoZQorICoJcG9ydCBoYXMgYmVlbiBodW5nIHVwLiBOZWVkIHRvIGhhbmRsZSBub3QgaGF2aW5nIGFueSBUWCBidWZmZXIgaGVyZSwKKyAqCXRoaXMgaXMgZG9uZSBieSB1c2luZyB0aGUgc2lkZSBlZmZlY3QgdGhhdCBoZWFkIGFuZCB0YWlsIHdpbGwgYWxzbworICoJYmUgTlVMTCBpZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4dHhpc3Ioc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBpbnQJaW9hZGRyOworCXVuc2lnbmVkIGNoYXIJbXIwOworCWludAkJbGVuLCBzdGxlbjsKKwljaGFyCQkqaGVhZCwgKnRhaWw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOTh0eGlzcihwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaW9hZGRyID0gcG9ydHAtPmlvYWRkcjsKKwloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CisJdGFpbCA9IHBvcnRwLT50eC50YWlsOworCWxlbiA9IChoZWFkID49IHRhaWwpID8gKGhlYWQgLSB0YWlsKSA6IChTVExfVFhCVUZTSVpFIC0gKHRhaWwgLSBoZWFkKSk7CisJaWYgKChsZW4gPT0gMCkgfHwgKChsZW4gPCBTVExfVFhCVUZMT1cpICYmCisJICAgICh0ZXN0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSkgPT0gMCkpKSB7CisJCXNldF9iaXQoQVNZSV9UWExPVywgJnBvcnRwLT5pc3RhdGUpOworCQlzY2hlZHVsZV93b3JrKCZwb3J0cC0+dHF1ZXVlKTsgCisJfQorCisJaWYgKGxlbiA9PSAwKSB7CisJCW91dGIoKE1SMCB8IHBvcnRwLT51YXJ0YWRkciksIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCW1yMCA9IGluYihpb2FkZHIgKyBYUF9EQVRBKTsKKwkJaWYgKChtcjAgJiBNUjBfVFhNQVNLKSA9PSBNUjBfVFhFTVBUWSkgeworCQkJcG9ydHAtPmltciAmPSB+SVJfVFhSRFk7CisJCQlvdXRiKChJTVIgfCBwb3J0cC0+dWFydGFkZHIpLCAoaW9hZGRyICsgWFBfQUREUikpOworCQkJb3V0Yihwb3J0cC0+aW1yLCAoaW9hZGRyICsgWFBfREFUQSkpOworCQkJY2xlYXJfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQltcjAgfD0gKChtcjAgJiB+TVIwX1RYTUFTSykgfCBNUjBfVFhFTVBUWSk7CisJCQlvdXRiKG1yMCwgKGlvYWRkciArIFhQX0RBVEEpKTsKKwkJfQorCX0gZWxzZSB7CisJCWxlbiA9IE1JTihsZW4sIFNDMjYxOThfVFhGSUZPU0laRSk7CisJCXBvcnRwLT5zdGF0cy50eHRvdGFsICs9IGxlbjsKKwkJc3RsZW4gPSBNSU4obGVuLCAoKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSAtIHRhaWwpKTsKKwkJb3V0YihHVFhGSUZPLCAoaW9hZGRyICsgWFBfQUREUikpOworCQlvdXRzYigoaW9hZGRyICsgWFBfREFUQSksIHRhaWwsIHN0bGVuKTsKKwkJbGVuIC09IHN0bGVuOworCQl0YWlsICs9IHN0bGVuOworCQlpZiAodGFpbCA+PSAocG9ydHAtPnR4LmJ1ZiArIFNUTF9UWEJVRlNJWkUpKQorCQkJdGFpbCA9IHBvcnRwLT50eC5idWY7CisJCWlmIChsZW4gPiAwKSB7CisJCQlvdXRzYigoaW9hZGRyICsgWFBfREFUQSksIHRhaWwsIGxlbik7CisJCQl0YWlsICs9IGxlbjsKKwkJfQorCQlwb3J0cC0+dHgudGFpbCA9IHRhaWw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZWNlaXZlIGNoYXJhY3RlciBpbnRlcnJ1cHQgaGFuZGxlci4gRGV0ZXJtaW5lIGlmIHdlIGhhdmUgZ29vZCBjaGFycworICoJb3IgYmFkIGNoYXJzIGFuZCB0aGVuIHByb2Nlc3MgYXBwcm9wcmlhdGVseS4gR29vZCBjaGFycyBhcmUgZWFzeQorICoJanVzdCBzaG92ZSB0aGUgbG90IGludG8gdGhlIFJYIGJ1ZmZlciBhbmQgc2V0IGFsbCBzdGF0dXMgYnl0ZSB0byAwLgorICoJSWYgYSBiYWQgUlggY2hhciB0aGVuIHByb2Nlc3MgYXMgcmVxdWlyZWQuIFRoaXMgcm91dGluZSBuZWVkcyB0byBiZQorICoJZmFzdCEgIEluIHByYWN0aWNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgZ2V0IGFuIGludGVycnVwdCBvbiBhIHBvcnQKKyAqCXRoYXQgaXMgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gb24gaGFuZ3VwcyAtIHNpbmNlIHRoZXkgY29tcGxldGVseQorICoJc2h1dGRvd24gYSBwb3J0IG5vdCBpbiB1c2VyIGNvbnRleHQuIE5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHJ4aXNyKHN0bHBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGludCBpYWNrKQoreworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgaW50CQlsZW4sIGJ1ZmxlbiwgaW9hZGRyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4cnhpc3IocG9ydHA9JXgsaWFjaz0leClcbiIsIChpbnQpIHBvcnRwLCBpYWNrKTsKKyNlbmRpZgorCisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpb2FkZHIgPSBwb3J0cC0+aW9hZGRyOworCW91dGIoR0lCQ1IsIChpb2FkZHIgKyBYUF9BRERSKSk7CisJbGVuID0gaW5iKGlvYWRkciArIFhQX0RBVEEpICsgMTsKKworCWlmICgoaWFjayAmIElWUl9UWVBFTUFTSykgPT0gSVZSX1JYREFUQSkgeworCQlpZiAoKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgfHwKKwkJICAgICh0dHktPmZsaXAuY2hhcl9idWZfcHRyID09IChjaGFyICopIE5VTEwpIHx8CisJCSAgICAoKGJ1ZmxlbiA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpID09IDApKSB7CisJCQlsZW4gPSBNSU4obGVuLCBzaXplb2Yoc3RsX3Vud2FudGVkKSk7CisJCQlvdXRiKEdSWEZJRk8sIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCQlpbnNiKChpb2FkZHIgKyBYUF9EQVRBKSwgJnN0bF91bndhbnRlZFswXSwgbGVuKTsKKwkJCXBvcnRwLT5zdGF0cy5yeGxvc3QgKz0gbGVuOworCQkJcG9ydHAtPnN0YXRzLnJ4dG90YWwgKz0gbGVuOworCQl9IGVsc2UgeworCQkJbGVuID0gTUlOKGxlbiwgYnVmbGVuKTsKKwkJCWlmIChsZW4gPiAwKSB7CisJCQkJb3V0YihHUlhGSUZPLCAoaW9hZGRyICsgWFBfQUREUikpOworCQkJCWluc2IoKGlvYWRkciArIFhQX0RBVEEpLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBsZW4pOworCQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBsZW4pOworCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gbGVuOworCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gbGVuOworCQkJCXR0eS0+ZmxpcC5jb3VudCArPSBsZW47CisJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKKwkJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCArPSBsZW47CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzdGxfc2MyNjE5OHJ4YmFkY2hhcnMocG9ydHApOworCX0KKworLyoKKyAqCUlmIHdlIGFyZSBUWCBmbG93IGNvbnRyb2xsZWQgYW5kIGluIElYQU5ZIG1vZGUgdGhlbiB3ZSBtYXkgbmVlZAorICoJdG8gdW5mbG93IGNvbnRyb2wgaGVyZS4gV2UgZ290dGEgZG8gdGhpcyBiZWNhdXNlIG9mIHRoZSBhdXRvbWF0aWMKKyAqCWZsb3cgY29udHJvbCBtb2RlcyBvZiB0aGUgc2MyNjE5OC4KKyAqLworCWlmICh0ZXN0X2JpdChBU1lJX1RYRkxPV0VELCAmcG9ydHAtPmlzdGF0ZSkpIHsKKwkJaWYgKCh0dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpICYmCisJCSAgICAodHR5LT50ZXJtaW9zICE9IChzdHJ1Y3QgdGVybWlvcyAqKSBOVUxMKSAmJgorCQkgICAgKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYQU5ZKSkgeworCQkJc3RsX3NjMjYxOTh0eHVuZmxvdyhwb3J0cCwgdHR5KTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUHJvY2VzcyBhbiBSWCBiYWQgY2hhcmFjdGVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGxfc2MyNjE5OHJ4YmFkY2goc3RscG9ydF90ICpwb3J0cCwgdW5zaWduZWQgY2hhciBzdGF0dXMsIGNoYXIgY2gpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBpbnQJCWlvYWRkcjsKKworCXR0eSA9IHBvcnRwLT50dHk7CisJaW9hZGRyID0gcG9ydHAtPmlvYWRkcjsKKworCWlmIChzdGF0dXMgJiBTUl9SWFBBUklUWSkKKwkJcG9ydHAtPnN0YXRzLnJ4cGFyaXR5Kys7CisJaWYgKHN0YXR1cyAmIFNSX1JYRlJBTUlORykKKwkJcG9ydHAtPnN0YXRzLnJ4ZnJhbWluZysrOworCWlmIChzdGF0dXMgJiBTUl9SWE9WRVJSVU4pCisJCXBvcnRwLT5zdGF0cy5yeG92ZXJydW4rKzsKKwlpZiAoc3RhdHVzICYgU1JfUlhCUkVBSykKKwkJcG9ydHAtPnN0YXRzLnJ4YnJlYWtzKys7CisKKwlpZiAoKHR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgJiYKKwkgICAgKChwb3J0cC0+cnhpZ25vcmVtc2sgJiBzdGF0dXMpID09IDApKSB7CisJCWlmIChwb3J0cC0+cnhtYXJrbXNrICYgc3RhdHVzKSB7CisJCQlpZiAoc3RhdHVzICYgU1JfUlhCUkVBSykgeworCQkJCXN0YXR1cyA9IFRUWV9CUkVBSzsKKwkJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfU0FLKSB7CisJCQkJCWRvX1NBSyh0dHkpOworCQkJCQlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNSX1JYUEFSSVRZKSB7CisJCQkJc3RhdHVzID0gVFRZX1BBUklUWTsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1JfUlhGUkFNSU5HKSB7CisJCQkJc3RhdHVzID0gVFRZX0ZSQU1FOworCQkJfSBlbHNlIGlmKHN0YXR1cyAmIFNSX1JYT1ZFUlJVTikgeworCQkJCXN0YXR1cyA9IFRUWV9PVkVSUlVOOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gMDsKKwkJfQorCisJCWlmICh0dHktPmZsaXAuY2hhcl9idWZfcHRyICE9IChjaGFyICopIE5VTEwpIHsKKwkJCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IHN0YXR1czsKKwkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7CisJCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQl9CisJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQl9CisKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJcG9ydHAtPnN0YXRzLnJ4dG90YWwrKzsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVByb2Nlc3MgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIFJYIEZJRk8gb2YgdGhlIFVBUlQuIENoZWNrIGFsbCBjaGFyCisgKglzdGF0dXMgYnl0ZXMgYXMgd2VsbCwgYW5kIHByb2Nlc3MgYXMgcmVxdWlyZWQuIFdlIG5lZWQgdG8gY2hlY2sKKyAqCWFsbCBieXRlcyBpbiB0aGUgRklGTywgaW4gY2FzZSBzb21lIG1vcmUgZW50ZXIgdGhlIEZJRk8gd2hpbGUgd2UKKyAqCWFyZSBoZXJlLiBUbyBnZXQgdGhlIGV4YWN0IGNoYXJhY3RlciBlcnJvciB0eXBlIHdlIG5lZWQgdG8gc3dpdGNoCisgKglpbnRvIENIQVIgZXJyb3IgbW9kZSAodGhhdCBpcyB3aHkgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZW1wdHkKKyAqCXRoZSBGSUZPKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHJ4YmFkY2hhcnMoc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBjaGFyCXN0YXR1cywgbXIxOworCWNoYXIJCWNoOworCisvKgorICoJVG8gZ2V0IHRoZSBwcmVjaXNlIGVycm9yIHR5cGUgZm9yIGVhY2ggY2hhcmFjdGVyIHdlIG11c3Qgc3dpdGNoCisgKgliYWNrIGludG8gQ0hBUiBlcnJvciBtb2RlLgorICovCisJbXIxID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIE1SMSk7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMSwgKG1yMSAmIH5NUjFfRVJSQkxPQ0spKTsKKworCXdoaWxlICgoc3RhdHVzID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIFNSKSkgJiBTUl9SWFJEWSkgeworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfQ0xFQVJSWEVSUik7CisJCWNoID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIFJYRklGTyk7CisJCXN0bF9zYzI2MTk4cnhiYWRjaChwb3J0cCwgc3RhdHVzLCBjaCk7CisJfQorCisvKgorICoJVG8gZ2V0IGNvcnJlY3QgaW50ZXJydXB0IGNsYXNzIHdlIG11c3Qgc3dpdGNoIGJhY2sgaW50byBCTE9DSworICoJZXJyb3IgbW9kZS4KKyAqLworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjEsIG1yMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCU90aGVyIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGluY2x1ZGVzIG1vZGVtIHNpZ25hbHMsIGZsb3cKKyAqCWNvbnRyb2wgYWN0aW9ucywgZXRjLiBNb3N0IHN0dWZmIGlzIGxlZnQgdG8gb2ZmLWxldmVsIGludGVycnVwdAorICoJcHJvY2Vzc2luZyB0aW1lLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4b3RoZXJpc3Ioc3RscG9ydF90ICpwb3J0cCwgdW5zaWduZWQgaW50IGlhY2spCit7CisJdW5zaWduZWQgY2hhcgljaXIsIGlwciwgeGlzcjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2MyNjE5OG90aGVyaXNyKHBvcnRwPSV4LGlhY2s9JXgpXG4iLCAoaW50KSBwb3J0cCwgaWFjayk7CisjZW5kaWYKKworCWNpciA9IHN0bF9zYzI2MTk4Z2V0Z2xvYnJlZyhwb3J0cCwgQ0lSKTsKKworCXN3aXRjaCAoY2lyICYgQ0lSX1NVQlRZUEVNQVNLKSB7CisJY2FzZSBDSVJfU1VCQ09TOgorCQlpcHIgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgSVBSKTsKKwkJaWYgKGlwciAmIElQUl9EQ0RDSEFOR0UpIHsKKwkJCXNldF9iaXQoQVNZSV9EQ0RDSEFOR0UsICZwb3J0cC0+aXN0YXRlKTsKKwkJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cXVldWUpOyAKKwkJCXBvcnRwLT5zdGF0cy5tb2RlbSsrOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0lSX1NVQlhPTlhPRkY6CisJCXhpc3IgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgWElTUik7CisJCWlmICh4aXNyICYgWElTUl9SWFhPTkdPVCkgeworCQkJc2V0X2JpdChBU1lJX1RYRkxPV0VELCAmcG9ydHAtPmlzdGF0ZSk7CisJCQlwb3J0cC0+c3RhdHMudHh4b2ZmKys7CisJCX0KKwkJaWYgKHhpc3IgJiBYSVNSX1JYWE9GRkdPVCkgeworCQkJY2xlYXJfYml0KEFTWUlfVFhGTE9XRUQsICZwb3J0cC0+aXN0YXRlKTsKKwkJCXBvcnRwLT5zdGF0cy50eHhvbisrOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0lSX1NVQkJSRUFLOgorCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfQlJFQUtSRVNFVCk7CisJCXN0bF9zYzI2MTk4cnhiYWRjaGFycyhwb3J0cCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N4LmMgYi9kcml2ZXJzL2NoYXIvc3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ3NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3N4LmMKQEAgLTAsMCArMSwyNjIxIEBACisKKy8qIHN4LmMgLS0gZHJpdmVyIGZvciB0aGUgU3BlY2lhbGl4IFNYIHNlcmllcyBjYXJkcy4gCisgKgorICogIFRoaXMgZHJpdmVyIHdpbGwgYWxzbyBzdXBwb3J0IHRoZSBvbGRlciBTSSwgYW5kIFhJTyBjYXJkcy4KKyAqCisgKgorICogICAoQykgMTk5OCAtIDIwMDQgIFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKiAgU2ltb24gQWxsZW4gKHNpbW9uYWxsZW5AY2l4LmNvbXB1bGluay5jby51aykgd3JvdGUgYSBwcmV2aW91cworICogIHZlcnNpb24gb2YgdGhpcyBkcml2ZXIuIFNvbWUgZnJhZ21lbnRzIG1heSBoYXZlIGJlZW4gY29waWVkLiAobm9uZQorICogIHlldCA6LSkKKyAqCisgKiBTcGVjaWFsaXggcGF5cyBmb3IgdGhlIGRldmVsb3BtZW50IGFuZCBzdXBwb3J0IG9mIHRoaXMgZHJpdmVyLgorICogUGxlYXNlIERPIGNvbnRhY3Qgc3VwcG9ydEBzcGVjaWFsaXguY28udWsgaWYgeW91IHJlcXVpcmUKKyAqIHN1cHBvcnQuIEJ1dCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiAoc3gudHh0KSBmaXJzdC4KKyAqCisgKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiAgICAgIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgIFVTQS4KKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICogJExvZzogc3guYyx2ICQKKyAqIFJldmlzaW9uIDEuMzMgIDIwMDAvMDMvMDkgMTA6MDA6MDAgIHB2ZGwsd29sZmYKKyAqIC0gRml4ZWQgbW9kdWxlIGFuZCBwb3J0IGNvdW50aW5nCisgKiAtIEZpeGVkIHNpZ25hbCBoYW5kbGluZworICogLSBGaXhlZCBhbiBPb29wcworICogCisgKiBSZXZpc2lvbiAxLjMyICAyMDAwLzAzLzA3IDA5OjAwOjAwICB3b2xmZixwdmRsCisgKiAtIEZpeGVkIHNvbWUgc3hfZHByaW50ayB0eXBvcworICogLSBhZGRlZCBkZXRlY3Rpb24gZm9yIGFuIGludmFsaWQgYm9hcmQvbW9kdWxlIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSZXZpc2lvbiAxLjMxICAyMDAwLzAzLzA2IDEyOjAwOjAwICB3b2xmZixwdmRsCisgKiAtIEFkZGVkIHN1cHBvcnQgZm9yIEVJU0EKKyAqCisgKiBSZXZpc2lvbiAxLjMwICAyMDAwLzAxLzIxIDE3OjQzOjA2ICB3b2xmZgorICogLSBBZGRlZCBzdXBwb3J0IGZvciBTWCsKKyAqCisgKiBSZXZpc2lvbiAxLjI2ICAxOTk5LzA4LzA1IDE1OjIyOjE0ICB3b2xmZgorICogLSBQb3J0IHRvIDIuMy54CisgKiAtIFJlZm9ybWF0dGVkIHRvIExpbnVzJyBsaWtpbmcuCisgKgorICogUmV2aXNpb24gMS4yNSAgMTk5OS8wNy8zMCAxNDoyNDowOCAgd29sZmYKKyAqIEhhZCBhY2NpZGVudGFsbHkgbGVmdCAiZ3NfZGVidWciIHNldCB0byAiLTEiIGluc3RlYWQgb2YgIm9mZiIgKD0wKS4KKyAqCisgKiBSZXZpc2lvbiAxLjI0ICAxOTk5LzA3LzI4IDA5OjQxOjUyICB3b2xmZgorICogLSBJIG5vdGljZWQgdGhlIHJlbWFyayBhYm91dCB1c2UtY291bnQgc3RyYXlpbmcgaW4gc3gudHh0LiBJIGNoZWNrZWQKKyAqICAgc3hfb3BlbiwgYW5kIGZvdW5kIGEgZmV3IHBsYWNlcyB3aGVyZSB0aGF0IGNvdWxkIGhhcHBlbi4gSSBob3BlIGl0J3MKKyAqICAgZml4ZWQgbm93LgorICoKKyAqIFJldmlzaW9uIDEuMjMgIDE5OTkvMDcvMjggMDg6NTY6MDYgIHdvbGZmCisgKiAtIEZpeGVkIGNyYXNoIHdoZW4gc3hfZmlybXdhcmUgcnVuIHR3aWNlLgorICogLSBBZGRlZCBzeF9zbG93cG9sbCBhcyBhIG1vZHVsZSBwYXJhbWV0ZXIgKEkgZ3Vlc3Mgbm9ib2R5IHJlYWxseSB3YW50ZWQKKyAqICAgdG8gY2hhbmdlIGl0IGZyb20gdGhlIGRlZmF1bHQuLi4gKQorICogLSBGaXhlZCBhIHN0dXBpZCBlZGl0aW5nIHByb2JsZW0gSSBpbnRyb2R1Y2VkIGluIDEuMjIuCisgKiAtIEZpeGVkIGRyb3BwaW5nIGNoYXJhY3RlcnMgb24gYSB0ZXJtaW9zIGNoYW5nZS4KKyAqCisgKiBSZXZpc2lvbiAxLjIyICAxOTk5LzA3LzI2IDIxOjAxOjQzICB3b2xmZgorICogUnVzc2VsbCBCcm93biBub3RpY2VkIHRoYXQgSSBoYWQgb3Zlcmxvb2tlZCA0IG91dCBvZiBzaXggbW9kZW0gY29udHJvbAorICogc2lnbmFscyBpbiBzeF9nZXRzaWduYWxzLiBPb29wcy4KKyAqCisgKiBSZXZpc2lvbiAxLjIxICAxOTk5LzA3LzIzIDA5OjExOjMzICB3b2xmZgorICogSSBmb3Jnb3QgdG8gZnJlZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5IHdoZW4gdGhlIGRyaXZlciBpcyB1bmxvYWRlZC4KKyAqCisgKiBSZXZpc2lvbiAxLjIwICAxOTk5LzA3LzIwIDA2OjI1OjI2ICB3b2xmZgorICogVGhlICJjbG9zaW5nIHdhaXQiIHdhc24ndCBob25vdXJlZC4gVGhhbmtzIHRvIEphbWVzIEdyaWZmaXRocyBmb3IKKyAqIHJlcG9ydGluZyB0aGlzLgorICoKKyAqIFJldmlzaW9uIDEuMTkgIDE5OTkvMDcvMTEgMDg6NTk6NTkgIHdvbGZmCisgKiBGaXhlZCBhbiBvb3BzIGluIGNsb3NlLCB3aGVuIGFuIG9wZW4gd2FzIHBlbmRpbmcuIENoYW5nZWQgdGhlIG1lbXRlc3QKKyAqIGEgYml0LiBTaG91bGQgYWxzbyB0ZXN0IHRoZSBib2FyZCBpbiB3b3JkLW1vZGUsIGhvd2V2ZXIgbXkgY2FyZCBmYWlscyB0aGUKKyAqIG1lbXRlc3QgdGhlbi4gSSBzdGlsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcyB3cm9uZy4uLgorICoKKyAqIFJldmlzaW9uIDEuMTggIDE5OTkvMDYvMTAgMDk6Mzg6NDIgIHdvbGZmCisgKiBDaGFuZ2VkIHRoZSBmb3JtYXQgb2YgdGhlIGZpcm13YXJlIHJldmlzaW9uIGZyb20gJTA0eCB0byAleC4lMDJ4IC4KKyAqCisgKiBSZXZpc2lvbiAxLjE3ICAxOTk5LzA2LzA0IDA5OjQ0OjM1ICB3b2xmZgorICogZml4ZWQgcHJvYmxlbTogcmVmZXJlbmNlIHRvIHBjaSBzdHVmZiB3aGVuIGNvbmZpZ19wY2kgd2FzIG9mZi4uLgorICogVGhhbmtzIHRvIEpvcmdlIE5vdm8gZm9yIG5vdGljaW5nIHRoaXMuCisgKgorICogUmV2aXNpb24gMS4xNiAgMTk5OS8wNi8wMiAwODozMDoxNSAgd29sZmYKKyAqIGFkZGVkL3JlbW92ZWQgdGhlIHdvcmthcm91bmQgZm9yIHRoZSBEQ0QgYnVnIGluIHRoZSBGaXJtd2FyZS4KKyAqIEEgYml0IG1vcmUgZGVidWdnaW5nIGNvZGUgdG8gbG9jYXRlIHRoYXQuLi4KKyAqCisgKiBSZXZpc2lvbiAxLjE1ICAxOTk5LzA2LzAxIDExOjM1OjMwICB3b2xmZgorICogd2hlbiBEQ0QgaXMgbGVmdCBsb3cgKGZsb2F0aW5nPyksIG9uIFRBJ3MgdGhlIGZpcm13YXJlIGZpcnN0IHRlbGxzIHVzCisgKiB0aGF0IERDRCBpcyBoaWdoLCBidXQgYWZ0ZXIgYSBzaG9ydCB3aGlsZSBzdWRkZW5seSBjb21lcyB0byB0aGUKKyAqIGNvbmNsdXNpb24gdGhhdCBpdCBpcyBsb3cuIEFsbCB0aGlzIHdvdWxkIGJlIGZpbmUsIGlmIGl0IHdlcmVuJ3QgdGhhdAorICogVW5peCByZXF1aXJlcyB1cyB0byBzZW5kIGEgImhhbmd1cCIgc2lnbmFsIGluIHRoYXQgY2FzZS4gVGhpcyB1c3VhbGx5CisgKiBhbGwgaGFwcGVucyBCRUZPUkUgdGhlIHByb2dyYW0gaGFzIGhhZCBhIGNoYW5jZSB0byBpb2N0bCB0aGUgZGV2aWNlCisgKiBpbnRvIGNsb2NhbCBtb2RlLi4KKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk5LzA1LzI1IDExOjE4OjU5ICB3b2xmZgorICogQWRkZWQgUENJLWZpeC4KKyAqIEFkZGVkIGNoZWNrcyBmb3IgcmV0dXJuIGNvZGUgb2Ygc3hfc2VuZGNvbW1hbmQuCisgKiBEb24ndCBpc3N1ZSAicmVjb25maWciIGlmIHBvcnQgaXNuJ3Qgb3BlbiB5ZXQuIChiaXQgdXMgb24gVEEgbW9kdWxlcy4uLikKKyAqCisgKiBSZXZpc2lvbiAxLjEzICAxOTk5LzA0LzI5IDE1OjE4OjAxICB3b2xmZgorICogRml4ZWQgYW4gIm9vcHMiIHRoYXQgc2hvd2VkIG9uIFN1U0UgNi4wIHN5c3RlbXMuCisgKiBBY3RpdmF0ZSBEVFIgYWdhaW4gYWZ0ZXIgc3R0eSAwLgorICoKKyAqIFJldmlzaW9uIDEuMTIgIDE5OTkvMDQvMjkgMDc6NDk6NTIgIHdvbGZmCisgKiBJbXByb3ZlZCAic3R0eSAwIiBoYW5kbGluZyBhIGJpdC4gKHVzZWQgdG8gY2hhbmdlIGJhdWQgdG8gOTYwMCBhc3N1bWluZworICogICAgIHRoZSBjb25uZWN0aW9uIHdvdWxkIGJlIGRyb3BwZWQgYW55d2F5LiBUaGF0IGlzIG5vdCBhbHdheXMgdGhlIGNhc2UsCisgKiAgICAgYW5kIGNvbmZ1c2VzIHBlb3BsZSkuCisgKiBUb2xkIHRoZSBjYXJkIHRvIGFsd2F5cyBtb25pdG9yIHRoZSBtb2RlbSBzaWduYWxzLgorICogQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyAgZ3NfZGVidWcgYWRqdXN0bWVudHMuCisgKiBOb3cgdGVsbHMgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSB0aGUgbnVtYmVyIG9mIHBvcnRzLgorICoKKyAqIFJldmlzaW9uIDEuMTEgIDE5OTkvMDQvMjQgMTE6MTE6MzAgIHdvbGZmCisgKiBGaXhlZCB0d28gc3R1cGlkIHR5cG9zIGluIHRoZSBtZW1vcnkgdGVzdC4KKyAqCisgKiBSZXZpc2lvbiAxLjEwICAxOTk5LzA0LzI0IDEwOjUzOjM5ICB3b2xmZgorICogQWRkZWQgc29tZSBvZiBDaHJpc3RpYW4ncyBzdWdnZXN0aW9ucy4KKyAqIEZpeGVkIGFuIEhXX0NPT0tfSU4gYnVnIChJU0lHIHdhcyBub3QgaW4gSV9PVEhFUi4gV2UgdXNlZCB0byB0cnVzdCB0aGUKKyAqIGNhcmQgdG8gc2VuZCB0aGUgc2lnbmFsIHRvIHRoZSBwcm9jZXNzLi4uLi4pCisgKgorICogUmV2aXNpb24gMS45ICAxOTk5LzA0LzIzIDA3OjI2OjM4ICB3b2xmZgorICogSW5jbHVkZWQgQ2hyaXN0aWFuIExhZGVtYW5uJ3MgMi4wIGNvbXBpbGUtd2FybmluZyBmaXhlcyBhbmQgaW50ZXJydXB0CisgKiAgICBhc3NpZ25tZW50IHJlZGVzaWduLgorICogQ2xlYW51cCBvZiBzb21lIG90aGVyIHN0dWZmLgorICoKKyAqIFJldmlzaW9uIDEuOCAgMTk5OS8wNC8xNiAxMzowNTozMCAgd29sZmYKKyAqIGZpeGVkIGEgRENEIGNoYW5nZSB1bm5vdGljZWQgYnVnLgorICoKKyAqIFJldmlzaW9uIDEuNyAgMTk5OS8wNC8xNCAyMjoxOTo1MSAgd29sZmYKKyAqIEZpeGVkIHR5cG8gdGhhdCBzaG93ZWQgdXAgaW4gMi4wLnggYnVpbGRzIChnZXRfdXNlciBpbnN0ZWFkIG9mIEdldF91c2VyISkKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDE5OTkvMDQvMTMgMTg6NDA6MjAgIHdvbGZmCisgKiBjaGFuZ2VkIG1pc2MtbWlub3IgdG8gMTYxLCBhcyBhc3NpZ25lZCBieSBIUEEuCisgKgorICogUmV2aXNpb24gMS41ICAxOTk5LzA0LzEzIDE1OjEyOjI1ICB3b2xmZgorICogRml4ZWQgdXNlLWNvdW50IGxlYWsgd2hlbiAiaGFuZ3VwIiBvY2N1cnJlZC4KKyAqIEFkZGVkIHdvcmthcm91bmQgZm9yIGEgc3R1cGlkLVBDSUJJT1MgYnVnLgorICoKKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTkvMDQvMDEgMjI6NDc6NDAgIHdvbGZmCisgKiBGaXhlZCA8IDFNIGxpbnV4LTIuMCBwcm9ibGVtLgorICogKHZyZW1hcCBpc24ndCBjb21wYXRpYmxlIHdpdGggaW9yZW1hcCBpbiB0aGF0IGNhc2UpCisgKgorICogUmV2aXNpb24gMS4zICAxOTk5LzAzLzMxIDEzOjQ1OjQ1ICB3b2xmZgorICogRmlybXdhcmUgbG9hZGluZyBpcyBub3cgZG9uZSB0aHJvdWdoIGEgc2VwYXJhdGUgSU9DVEwuCisgKgorICogUmV2aXNpb24gMS4yICAxOTk5LzAzLzI4IDEyOjIyOjI5ICB3b2xmZgorICogcmNzIGNsZWFudXAKKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTkvMDMvMjggMTI6MTA6MzQgIHdvbGZmCisgKiBSZWFkeWluZyBmb3IgcmVsZWFzZSBvbiAyLjAueCAoc29ycnkgRGF2aWQsIDEuMDEgYmVjb21lcyAxLjEgZm9yIFJDUykuIAorICoKKyAqIFJldmlzaW9uIDAuMTIgIDE5OTkvMDMvMjggMDk6MjA6MTAgIHdvbGZmCisgKiBGaXhlZCBwcm9ibGVtIGluIDAuMTEsIGNvbnRpbnVlaW5nIGNsZWFudXAuCisgKgorICogUmV2aXNpb24gMC4xMSAgMTk5OS8wMy8yOCAwODo0Njo0NCAgd29sZmYKKyAqIGNsZWFudXAuIE5vdCBnb29kLgorICoKKyAqIFJldmlzaW9uIDAuMTAgIDE5OTkvMDMvMjggMDg6MDk6NDMgIHdvbGZmCisgKiBGaXhlZCBsb29zaW5nIGNoYXJhY3RlcnMgb24gY2xvc2UuCisgKgorICogUmV2aXNpb24gMC45ICAxOTk5LzAzLzIxIDIyOjUyOjAxICB3b2xmZgorICogUG9ydGVkIGJhY2sgdG8gMi4yLi4uLiAobWlub3IgdGhpbmdzKQorICoKKyAqIFJldmlzaW9uIDAuOCAgMTk5OS8wMy8yMSAyMjo0MDozMyAgd29sZmYKKyAqIFBvcnQgdG8gMi4wCisgKgorICogUmV2aXNpb24gMC43ICAxOTk5LzAzLzIxIDE5OjA2OjM0ICB3b2xmZgorICogRml4ZWQgaGFuZ3VwIHByb2Nlc3NpbmcuCisgKgorICogUmV2aXNpb24gMC42ICAxOTk5LzAyLzA1IDA4OjQ1OjE0ICB3b2xmZgorICogZml4ZWQgcmVhbF9yYXcgcHJvYmxlbXMuIEluY2x1c2lvbiBpbnRvIGtlcm5lbCBpbW1pbmVudC4KKyAqCisgKiBSZXZpc2lvbiAwLjUgIDE5OTgvMTIvMjEgMjM6NTE6MDYgIHdvbGZmCisgKiBTbmF0Y2hlZCBhIG5hc3R5IGJ1Zzogc3hfdHJhbnNtaXRfY2hhcnMgd2FzIGdldHRpbmcgcmUtZW50ZXJlZCwgYW5kIGl0CisgKiBzaG91bGRuJ3QgaGF2ZS4gVEhBVHMgd2h5IEkgd2FudCB0byBoYXZlIHRyYW5zbWl0IGludGVycnVwdHMgZXZlbiB3aGVuCisgKiB0aGUgYnVmZmVyIGlzIGVtcHR5LgorICoKKyAqIFJldmlzaW9uIDAuNCAgMTk5OC8xMi8xNyAwOTozNDo0NiAgd29sZmYKKyAqIFBQUCB3b3Jrcy4gaW9jdGwgd29ya3MuIEJhc2ljYWxseSB3b3JrcyEKKyAqCisgKiBSZXZpc2lvbiAwLjMgIDE5OTgvMTIvMTUgMTM6MDU6MTggIHdvbGZmCisgKiBJdCB3b3JrcyEgV293ISBHb3R0YSBzdGFydCBpbXBsZW1lbnRpbmcgSU9DVEwgYW5kIHN0dWZmLi4uLgorICoKKyAqIFJldmlzaW9uIDAuMiAgMTk5OC8xMi8wMSAwODozMzo1MyAgd29sZmYKKyAqIG1vdmVkIG92ZXIgdG8gMi4xLjEzMAorICoKKyAqIFJldmlzaW9uIDAuMSAgMTk5OC8xMS8wMyAyMToyMzo1MSAgd29sZmYKKyAqIEluaXRpYWwgcmV2aXNpb24uIERldGVjdHMgU1ggY2FyZC4KKyAqCisgKiAqLworCisKKyNkZWZpbmUgUkNTX0lEICIkSWQ6IHN4LmMsdiAxLjMzIDIwMDAvMDMvMDggMTA6MDE6MDIgd29sZmYsIHB2ZGwgRXhwICQiCisjZGVmaW5lIFJDU19SRVYgIiRSZXZpc2lvbjogMS4zMyAkIgorCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gCisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFRoZSAzLjAuMCB2ZXJzaW9uIG9mIHN4Ym9hcmRzL3N4d2luZG93LmggIHVzZXMgQllURSBhbmQgV09SRC4uLi4gKi8KKyNkZWZpbmUgQllURSB1OAorI2RlZmluZSBXT1JEIHUxNgorCisvKiAuLi4uIGJ1dCB0aGUgMy4wLjQgdmVyc2lvbiB1c2VzIF91OCBhbmQgX3UxNi4gKi8KKyNkZWZpbmUgX3U4IHU4CisjZGVmaW5lIF91MTYgdTE2CisKKyNpbmNsdWRlICJzeGJvYXJkcy5oIgorI2luY2x1ZGUgInN4d2luZG93LmgiCisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorI2luY2x1ZGUgInN4LmgiCisKKworLyogSSBkb24ndCB0aGluayB0aGF0IHRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgbW9yZSB0aGFuIDI1NiBwb3J0cyBvbgorICAgb25lIG1hY2hpbmUuIFlvdSdsbCBoYXZlIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYm9hcmRzIGluIHN4LmgKKyAgIGlmIHlvdSB3YW50IG1vcmUgdGhhbiA0IGJvYXJkcy4gICovCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84IDB4MjAwMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3hfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzeF9wY2lfdGJsKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKy8qIENvbmZpZ3VyYWJsZSBvcHRpb25zOiAKKyAgIChEb24ndCBiZSB0b28gc3VyZSB0aGF0IGl0J2xsIHdvcmsgaWYgeW91IHRvZ2dsZSB0aGVtKSAqLworCisvKiBBbSBJIHBhcmFub2lkIG9yIG5vdCA/IDstKSAqLworI3VuZGVmIFNYX1BBUkFOT0lBX0NIRUNLCisKKworLyogMjAgLT4gMjAwMCBwZXIgc2Vjb25kLiBUaGUgY2FyZCBzaG91bGQgcmF0ZS1saW1pdCBpbnRlcnJ1cHRzIGF0IDEwMAorICAgSHosIGJ1dCBpdCBpcyB1c2VyIGNvbmZpZ3VyYWJsZS4gSSBkb24ndCByZWNvbW1lbmQgZ29pbmcgYWJvdmUgMTAwMAorICAgSHouIFRoZSBpbnRlcnJ1cHQgcmF0ZWxpbWl0IG1pZ2h0IHRyaWdnZXIgaWYgdGhlIGludGVycnVwdCBpcworICAgc2hhcmVkIHdpdGggYSB2ZXJ5IGFjdGl2ZSBvdGhlciBkZXZpY2UuICovCisjZGVmaW5lIElSUV9SQVRFX0xJTUlUIDIwCisKKy8qIFNoYXJpbmcgaW50ZXJydXB0cyBpcyBwb3NzaWJsZSBub3cuIElmIHRoZSBvdGhlciBkZXZpY2Ugd2FudHMgbW9yZQorICAgdGhhbiAyMDAwIGludGVycnVwdHMgcGVyIHNlY29uZCwgd2UnZCBncmFjZWZ1bGx5IGRlY2xpbmUgZnVydGhlcgorICAgaW50ZXJydXB0cy4gVGhhdCdzIG5vdCB3aGF0IHdlIHdhbnQuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgIG90aGVyIGRldmljZSBpbnRlcnJ1cHRzIDIwMDAgdGltZXMgYSBzZWNvbmQsIGRvbid0IHVzZSB0aGUgU1gKKyAgIGludGVycnVwdC4gVXNlIHBvbGxpbmcuICovCisjdW5kZWYgSVJRX1JBVEVfTElNSVQKKworCisjaWYgMAorLyogTm90IGltcGxlbWVudGVkICovCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBCdXQgaWYgeW91IG5lZWQKKyAqIHNvbWUgbmljZSByZXBvcnRpbmcgaW4geW91ciBzeXNsb2csIHlvdSBjYW4gZGVmaW5lIHRoZW0gYWxzby4KKyAqLworI2RlZmluZSBTWF9SRVBPUlRfRklGTworI2RlZmluZSBTWF9SRVBPUlRfT1ZFUlJVTgorI2VuZGlmIAorCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIHN4X2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgc3hfZW5hYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyB2b2lkIHN4X2Rpc2FibGVfcnhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgc3hfZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyBpbnQgIHN4X2dldF9DRCAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgc3hfc2h1dGRvd25fcG9ydCAodm9pZCAqIHB0cik7CitzdGF0aWMgaW50ICBzeF9zZXRfcmVhbF90ZXJtaW9zICh2b2lkICAqcHRyKTsKK3N0YXRpYyB2b2lkIHN4X2Nsb3NlICh2b2lkICAqcHRyKTsKK3N0YXRpYyBpbnQgc3hfY2hhcnNfaW5fYnVmZmVyICh2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgc3hfaW5pdF9ib2FyZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCk7CitzdGF0aWMgaW50IHN4X2luaXRfcG9ydHN0cnVjdHMgKGludCBuYm9hcmRzLCBpbnQgbnBvcnRzKTsKK3N0YXRpYyBpbnQgc3hfZndfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBzeF9pbml0X2RyaXZlcnModm9pZCk7CisKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzeF9kcml2ZXI7CisKK3N0YXRpYyBzdHJ1Y3Qgc3hfYm9hcmQgYm9hcmRzW1NYX05CT0FSRFNdOworc3RhdGljIHN0cnVjdCBzeF9wb3J0ICpzeF9wb3J0czsKK3N0YXRpYyBpbnQgc3hfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgaW50IHN4X25wb3J0czsKK3N0YXRpYyBpbnQgc3hfZGVidWc7CisKKworLyogWW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgcG9sbCB5b3VyIGNhcmQuIAorICAgIC0gU2V0IHN4X3BvbGwgdG8gMSB0byBwb2xsIGV2ZXJ5IHRpbWVyIHRpY2sgKDEwbXMgb24gSW50ZWwpLiAKKyAgICAgIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjYXJkIGNhbm5vdCB1c2UgYW4gaW50ZXJydXB0IGZvciBzb21lIHJlYXNvbi4KKworICAgIC0gc2V0IHN4X3Nsb3dwb2xsIHRvIDEwMCB0byBkbyBhbiBleHRyYSBwb2xsIG9uY2UgYSBzZWNvbmQgKG9uIEludGVsKS4gSWYgCisgICAgICB0aGUgZHJpdmVyIG1pc3NlcyBhbiBpbnRlcnJ1cHQgKHJlcG9ydCB0aGlzIGlmIGl0IERPRVMgaGFwcGVuIHRvIHlvdSEpCisgICAgICBldmVyeXRoaW5nIHdpbGwgY29udGludWUgdG8gd29yay4uLi4gCisgKi8KK3N0YXRpYyBpbnQgc3hfcG9sbCA9IDE7CitzdGF0aWMgaW50IHN4X3Nsb3dwb2xsOworCisvKiBUaGUgY2FyZCBsaW1pdHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBzZWNvbmQuIAorICAgQXQgMTE1azIgIjEwMCIgc2hvdWxkIGJlIHN1ZmZpY2llbnQuIAorICAgSWYgeW91J3JlIHVzaW5nIGhpZ2hlciBiYXVkcmF0ZXMsIHlvdSBjYW4gaW5jcmVhc2UgdGhpcy4uLgorICovCisKK3N0YXRpYyBpbnQgc3hfbWF4aW50cyA9IDEwMDsKKworLyogVGhlc2UgYXJlIHRoZSBvbmx5IG9wZW4gc3BhY2VzIGluIG15IGNvbXB1dGVyLiBZb3VycyBtYXkgaGF2ZSBtb3JlCisgICBvciBsZXNzLi4uLiAtLSBSRVcgCisgICBkdWg6IENhcmQgYXQgMHhhMDAwMCBpcyBwb3NzaWJsZSBvbiBIUCBOZXRzZXJ2ZXI/PyAtLSBwdmRsCisqLworc3RhdGljIGludCBzeF9wcm9iZV9hZGRyc1tdPSB7MHhjMDAwMCwgMHhkMDAwMCwgMHhlMDAwMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGM4MDAwLCAweGQ4MDAwLCAweGU4MDAwfTsKK3N0YXRpYyBpbnQgc2lfcHJvYmVfYWRkcnNbXT0gezB4YzAwMDAsIDB4ZDAwMDAsIDB4ZTAwMDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjODAwMCwgMHhkODAwMCwgMHhlODAwMCwgMHhhMDAwMH07CitzdGF0aWMgaW50IHNpMV9wcm9iZV9hZGRyc1tdPSB7IDB4ZDAwMDB9OworCisjZGVmaW5lIE5SX1NYX0FERFJTIChzaXplb2Yoc3hfcHJvYmVfYWRkcnMpL3NpemVvZiAoaW50KSkKKyNkZWZpbmUgTlJfU0lfQUREUlMgKHNpemVvZihzaV9wcm9iZV9hZGRycykvc2l6ZW9mIChpbnQpKQorI2RlZmluZSBOUl9TSTFfQUREUlMgKHNpemVvZihzaTFfcHJvYmVfYWRkcnMpL3NpemVvZiAoaW50KSkKKworCisvKiBTZXQgdGhlIG1hc2sgdG8gYWxsLW9uZXMuIFRoaXMgYWxhcywgb25seSBzdXBwb3J0cyAzMiBpbnRlcnJ1cHRzLiAKKyAgIFNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgbmVlZCBtb3JlLiAqLworc3RhdGljIGludCBzeF9pcnFtYXNrID0gLTE7CisKK21vZHVsZV9wYXJhbV9hcnJheShzeF9wcm9iZV9hZGRycywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShzaV9wcm9iZV9hZGRycywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShzeF9wb2xsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHN4X3Nsb3dwb2xsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHN4X21heGludHMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3hfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3hfaXJxbWFzaywgaW50LCAwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHJlYWxfZHJpdmVyIHN4X3JlYWxfZHJpdmVyID0geworCXN4X2Rpc2FibGVfdHhfaW50ZXJydXB0cywKKwlzeF9lbmFibGVfdHhfaW50ZXJydXB0cywKKwlzeF9kaXNhYmxlX3J4X2ludGVycnVwdHMsCisJc3hfZW5hYmxlX3J4X2ludGVycnVwdHMsCisJc3hfZ2V0X0NELAorCXN4X3NodXRkb3duX3BvcnQsIAorCXN4X3NldF9yZWFsX3Rlcm1pb3MsIAorCXN4X2NoYXJzX2luX2J1ZmZlciwKKwlzeF9jbG9zZSwKK307CisKKworLyogCisgICBUaGlzIGRyaXZlciBjYW4gc3BldyBhIHdob2xlIGxvdCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IGF0IHlvdS4gSWYgeW91CisgICBuZWVkIG1heGltdW0gcGVyZm9ybWFuY2UsIHlvdSBzaG91bGQgZGlzYWJsZSB0aGUgREVCVUcgZGVmaW5lLiBUbworICAgYWlkIGluIGRlYnVnZ2luZyBpbiB0aGUgZmllbGQsIEknbSBsZWF2aW5nIHRoZSBjb21waWxlLXRpbWUgZGVidWcKKyAgIGZlYXR1cmVzIGVuYWJsZWQsIGFuZCBkaXNhYmxlIHRoZW0gInJ1bnRpbWUiLiBUaGF0IGFsbG93cyBtZSB0bworICAgaW5zdHJ1Y3QgcGVvcGxlIHdpdGggcHJvYmxlbXMgdG8gZW5hYmxlIGRlYnVnZ2luZyB3aXRob3V0IHJlcXVpcmluZworICAgdGhlbSB0byByZWNvbXBpbGUuLi4gCisqLworI2RlZmluZSBERUJVRworCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBzeF9kcHJpbnRrKGYsIHN0ci4uLikgaWYgKHN4X2RlYnVnICYgZikgcHJpbnRrIChzdHIpCisjZWxzZQorI2RlZmluZSBzeF9kcHJpbnRrKGYsIHN0ci4uLikgLyogbm90aGluZyAqLworI2VuZGlmCisKKworCisjZGVmaW5lIGZ1bmNfZW50ZXIoKSBzeF9kcHJpbnRrIChTWF9ERUJVR19GTE9XLCAic3g6IGVudGVyICVzXG4iLF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgZnVuY19leGl0KCkgIHN4X2RwcmludGsgKFNYX0RFQlVHX0ZMT1csICJzeDogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKKworI2RlZmluZSBmdW5jX2VudGVyMigpIHN4X2RwcmludGsgKFNYX0RFQlVHX0ZMT1csICJzeDogZW50ZXIgJXMgKHBvcnQgJWQpXG4iLCBcCisJCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bGluZSkKKworCisKKworLyogCisgKiAgRmlybXdhcmUgbG9hZGVyIGRyaXZlciBzcGVjaWZpYyByb3V0aW5lcworICoKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeF9md19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gc3hfZndfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc3hfZndfZGV2aWNlID0geworCVNYQ1RMX01JU0NfTUlOT1IsICJzeGN0bCIsICZzeF9md19mb3BzCit9OworCisKKworCisKKyNpZmRlZiBTWF9QQVJBTk9JQV9DSEVDSworCisvKiBUaGlzIGRvZXNuJ3Qgd29yay4gV2hvJ3MgcGFyYW5vaWQgYXJvdW5kIGhlcmU/IE5vdCBtZSEgKi8KKworc3RhdGljIGlubGluZSBpbnQgc3hfcGFyYW5vaWFfY2hlY2soc3RydWN0IHN4X3BvcnQgY29uc3QgKiBwb3J0LAorCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworCisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKwkgIEtFUk5fRVJSICJzeDogV2FybmluZzogYmFkIHN4IHBvcnQgbWFnaWMgbnVtYmVyIGZvciBkZXZpY2UgJXMgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorCSAgS0VSTl9FUlIgInN4OiBXYXJuaW5nOiBudWxsIHN4IHBvcnQgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKyAKKwlpZiAoIXBvcnQpIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBvcnQtPm1hZ2ljICE9IFNYX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgc3hfcGFyYW5vaWFfY2hlY2soYSxiLGMpIDAKKyNlbmRpZgorCisvKiBUaGUgdGltZW91dHMuIEZpcnN0IHRyeSAzMCB0aW1lcyBhcyBmYXN0IGFzIHBvc3NpYmxlLiBUaGVuIGdpdmUKKyAgIHRoZSBjYXJkIHNvbWUgdGltZSB0byBicmVhdGhlIGJldHdlZW4gYWNjZXNzZXMuIChPdGhlcndpc2UgdGhlCisgICBwcm9jZXNzb3Igb24gdGhlIGNhcmQgbWlnaHQgbm90IGJlIGFibGUgdG8gYWNjZXNzIGl0cyBPV04gYnVzLi4uICovCisKKyNkZWZpbmUgVElNRU9VVF8xIDMwCisjZGVmaW5lIFRJTUVPVVRfMiAxMDAwMDAwCisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBteV9oZF9pbyh2b2lkIF9faW9tZW0gKnAsIGludCBsZW4pCit7CisJaW50IGksIGosIGNoOworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkciA9IHA7CisKKwlmb3IgKGk9MDtpPGxlbjtpKz0xNikgeworCQlwcmludGsgKCIlcCAiLCBhZGRyK2kpOworCQlmb3IgKGo9MDtqPDE2O2orKykgeworCQkJcHJpbnRrICgiJTAyeCAlcyIsIHJlYWRiKGFkZHIraitpKSwgKGo9PTcpPyIgIjoiIik7CisJCX0KKwkJZm9yIChqPTA7ajwxNjtqKyspIHsKKwkJCWNoID0gcmVhZGIoYWRkcitqK2kpOworCQkJcHJpbnRrICgiJWMiLCAoY2ggPCAweDIwKT8nLic6KChjaCA+IDB4N2YpPycuJzpjaCkpOworCQl9CisJCXByaW50ayAoIlxuIik7CisJfQorfQorc3RhdGljIHZvaWQgbXlfaGQodm9pZCAqcCwgaW50IGxlbikKK3sKKwlpbnQgaSwgaiwgY2g7CisJdW5zaWduZWQgY2hhciAqYWRkciA9IHA7CisKKwlmb3IgKGk9MDtpPGxlbjtpKz0xNikgeworCQlwcmludGsgKCIlcCAiLCBhZGRyK2kpOworCQlmb3IgKGo9MDtqPDE2O2orKykgeworCQkJcHJpbnRrICgiJTAyeCAlcyIsIGFkZHJbaitpXSwgKGo9PTcpPyIgIjoiIik7CisJCX0KKwkJZm9yIChqPTA7ajwxNjtqKyspIHsKKwkJCWNoID0gYWRkcltqK2ldOworCQkJcHJpbnRrICgiJWMiLCAoY2ggPCAweDIwKT8nLic6KChjaCA+IDB4N2YpPycuJzpjaCkpOworCQl9CisJCXByaW50ayAoIlxuIik7CisJfQorfQorI2VuZGlmCisKKworCisvKiBUaGlzIG5lZWRzIHJlZG9pbmcgZm9yIEFscGhhIC0tIFJFVyAtLSBEb25lLiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc3hfYnl0ZSAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG9mZnNldCwgdTggYnl0ZSkKK3sKKwl3cml0ZWIgKGJ5dGUsIGJvYXJkLT5iYXNlK29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcmVhZF9zeF9ieXRlIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiByZWFkYiAoYm9hcmQtPmJhc2Urb2Zmc2V0KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc3hfd29yZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG9mZnNldCwgdTE2IHdvcmQpCit7CisJd3JpdGV3ICh3b3JkLCBib2FyZC0+YmFzZStvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiByZWFkX3N4X3dvcmQgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWR3IChib2FyZC0+YmFzZSArIG9mZnNldCk7Cit9CisKKworc3RhdGljIGludCBzeF9idXN5X3dhaXRfZXEgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIAorICAgICAgICAgICAgICAgICAgICAgCSAgICBpbnQgb2Zmc2V0LCBpbnQgbWFzaywgaW50IGNvcnJlY3R2YWwpCit7CisJaW50IGk7CisKKwlmdW5jX2VudGVyICgpOworCisJZm9yIChpPTA7IGkgPCBUSU1FT1VUXzEgO2krKykKKwkJaWYgKChyZWFkX3N4X2J5dGUgKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgPT0gY29ycmVjdHZhbCkgeworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDE7CisJCX0KKworCWZvciAoaT0wOyBpIDwgVElNRU9VVF8yIDtpKyspIHsKKwkJaWYgKChyZWFkX3N4X2J5dGUgKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgPT0gY29ycmVjdHZhbCkgeworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5ICgxKTsKKwl9CisKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzeF9idXN5X3dhaXRfbmVxIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICBpbnQgb2Zmc2V0LCBpbnQgbWFzaywgaW50IGJhZHZhbCkKK3sKKwlpbnQgaTsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlmb3IgKGk9MDsgaSA8IFRJTUVPVVRfMSA7aSsrKQorCQlpZiAoKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIG9mZnNldCkgJiBtYXNrKSAhPSBiYWR2YWwpIHsKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAxOworCQl9CisKKwlmb3IgKGk9MDsgaSA8IFRJTUVPVVRfMiA7aSsrKSB7CisJCWlmICgocmVhZF9zeF9ieXRlIChib2FyZCwgb2Zmc2V0KSAmIG1hc2spICE9IGJhZHZhbCkgeworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5ICgxKTsKKwl9CisKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiA1LjYuNCBvZiA2MjEwMDI4IHIyLjMgKi8KK3N0YXRpYyBpbnQgc3hfcmVzZXQgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCit7CisJZnVuY19lbnRlciAoKTsKKworCWlmIChJU19TWF9CT0FSRCAoYm9hcmQpKSB7CisKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNYX0NPTkZJRywgMCk7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTWF9SRVNFVCwgMSk7IC8qIFZhbHVlIGRvZXNuJ3QgbWF0dGVyICovCisKKwkJaWYgKCFzeF9idXN5X3dhaXRfZXEgKGJvYXJkLCBTWF9SRVNFVF9TVEFUVVMsIDEsIDApKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IENhcmQgZG9lc24ndCByZXNwb25kIHRvIHJlc2V0Li4uLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAoSVNfRUlTQV9CT0FSRChib2FyZCkpIHsKKwkJb3V0Yihib2FyZC0+aXJxPDw0LCBib2FyZC0+ZWlzYV9iYXNlKzB4YzAyKTsKKwl9IGVsc2UgaWYgKElTX1NJMV9CT0FSRChib2FyZCkpIHsKKwkgICAgICAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTFfSVNBX1JFU0VULCAgIDApOyAvLyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIKKwl9IGVsc2UgeworCQkvKiBHb3J5IGRldGFpbHMgb2YgdGhlIFNJL0lTQSBib2FyZCAqLworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9SRVNFVCwgICAgU0kyX0lTQV9SRVNFVF9TRVQpOworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JUlExMSwgICAgU0kyX0lTQV9JUlExMV9DTEVBUik7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUTEyLCAgICBTSTJfSVNBX0lSUTEyX0NMRUFSKTsKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRMTUsICAgIFNJMl9JU0FfSVJRMTVfQ0xFQVIpOworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JTlRDTEVBUiwgU0kyX0lTQV9JTlRDTEVBUl9DTEVBUik7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUVNFVCwgICBTSTJfSVNBX0lSUVNFVF9DTEVBUik7CisJfQorCisJZnVuY19leGl0ICgpOworCXJldHVybiAxOworfQorCisKKy8qIFRoaXMgZG9lc24ndCB3b3JrIG9uIG1hY2hpbmVzIHdoZXJlICJOVUxMIiBpc24ndCAwICovCisvKiBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UsIHNvbWVvbmUgd2lsbCBuZWVkIHRvIHdyaXRlIAorICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhpcywgd2hpY2ggd2lsbCBhbW91bnQgdG8gYWJvdXQgMyBsaW5lcy4gSSBkb24ndAorICAgd2FudCB0byBjb21wbGljYXRlIHRoaXMgcmlnaHQgbm93LiAtLSBSRVcKKyAgIChTZWUsIEkgZG8gd3JpdGUgY29tbWVudHMgZXZlcnkgbm93IGFuZCB0aGVuIDotKSAqLworI2RlZmluZSBPRkZTRVRPRihzdHJjdCwgZWxlbSkgKChsb25nKSYoKChzdHJ1Y3Qgc3RyY3QgKilOVUxMKS0+ZWxlbSkpCisKKworI2RlZmluZSBDSEFOX09GRlNFVChwb3J0LGVsZW0pIChwb3J0LT5jaF9iYXNlICsgT0ZGU0VUT0YgKF9TWENIQU5ORUwsIGVsZW0pKQorI2RlZmluZSBNT0RVX09GRlNFVChib2FyZCxhZGRyLGVsZW0pICAgIChhZGRyICsgT0ZGU0VUT0YgKF9TWE1PRFVMRSwgZWxlbSkpCisjZGVmaW5lICBCUkRfT0ZGU0VUKGJvYXJkLGVsZW0pICAgICAgICAgICAgICAgIChPRkZTRVRPRiAoX1NYQ0FSRCwgZWxlbSkpCisKKworI2RlZmluZSBzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgZWxlbSwgdmFsKSBcCisgICB3cml0ZV9zeF9ieXRlIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQgKHBvcnQsIGVsZW0pLCB2YWwpCisKKyNkZWZpbmUgc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgZWxlbSkgXAorICAgcmVhZF9zeF9ieXRlIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQgKHBvcnQsIGVsZW0pKQorCisjZGVmaW5lIHN4X3dyaXRlX2NoYW5uZWxfd29yZChwb3J0LCBlbGVtLCB2YWwpIFwKKyAgIHdyaXRlX3N4X3dvcmQgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSksIHZhbCkKKworI2RlZmluZSBzeF9yZWFkX2NoYW5uZWxfd29yZChwb3J0LCBlbGVtKSBcCisgICByZWFkX3N4X3dvcmQgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSkpCisKKworI2RlZmluZSBzeF93cml0ZV9tb2R1bGVfYnl0ZShib2FyZCwgYWRkciwgZWxlbSwgdmFsKSBcCisgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSwgdmFsKQorCisjZGVmaW5lIHN4X3JlYWRfbW9kdWxlX2J5dGUoYm9hcmQsIGFkZHIsIGVsZW0pIFwKKyAgIHJlYWRfc3hfYnl0ZSAoYm9hcmQsIE1PRFVfT0ZGU0VUIChib2FyZCwgYWRkciwgZWxlbSkpCisKKyNkZWZpbmUgc3hfd3JpdGVfbW9kdWxlX3dvcmQoYm9hcmQsIGFkZHIsIGVsZW0sIHZhbCkgXAorICAgd3JpdGVfc3hfd29yZCAoYm9hcmQsIE1PRFVfT0ZGU0VUIChib2FyZCwgYWRkciwgZWxlbSksIHZhbCkKKworI2RlZmluZSBzeF9yZWFkX21vZHVsZV93b3JkKGJvYXJkLCBhZGRyLCBlbGVtKSBcCisgICByZWFkX3N4X3dvcmQgKGJvYXJkLCBNT0RVX09GRlNFVCAoYm9hcmQsIGFkZHIsIGVsZW0pKQorCisKKyNkZWZpbmUgc3hfd3JpdGVfYm9hcmRfYnl0ZShib2FyZCwgZWxlbSwgdmFsKSBcCisgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgQlJEX09GRlNFVCAoYm9hcmQsIGVsZW0pLCB2YWwpCisKKyNkZWZpbmUgc3hfcmVhZF9ib2FyZF9ieXRlKGJvYXJkLCBlbGVtKSBcCisgICByZWFkX3N4X2J5dGUgKGJvYXJkLCBCUkRfT0ZGU0VUIChib2FyZCwgZWxlbSkpCisKKyNkZWZpbmUgc3hfd3JpdGVfYm9hcmRfd29yZChib2FyZCwgZWxlbSwgdmFsKSBcCisgICB3cml0ZV9zeF93b3JkIChib2FyZCwgQlJEX09GRlNFVCAoYm9hcmQsIGVsZW0pLCB2YWwpCisKKyNkZWZpbmUgc3hfcmVhZF9ib2FyZF93b3JkKGJvYXJkLCBlbGVtKSBcCisgICByZWFkX3N4X3dvcmQgKGJvYXJkLCBCUkRfT0ZGU0VUIChib2FyZCwgZWxlbSkpCisKKworc3RhdGljIGludCBzeF9zdGFydF9ib2FyZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKwlpZiAoSVNfU1hfQk9BUkQgKGJvYXJkKSkgeworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU1hfQ09ORklHLCBTWF9DT05GX0JVU0VOKTsKKwl9IGVsc2UgaWYgKElTX0VJU0FfQk9BUkQoYm9hcmQpKSB7CisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9FSVNBX09GRiwgU0kyX0VJU0FfVkFMKTsKKwkJb3V0YigoYm9hcmQtPmlycTw8NCl8NCwgYm9hcmQtPmVpc2FfYmFzZSsweGMwMik7CisJfSBlbHNlIGlmIChJU19TSTFfQk9BUkQoYm9hcmQpKSB7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTFfSVNBX1JFU0VUX0NMRUFSLCAwKTsKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMV9JU0FfSU5UQ0wsIDApOworCX0gZWxzZSB7CisJCS8qIERvbid0IGJ1ZyBtZSBhYm91dCB0aGUgY2xlYXJfc2V0LiAKKwkJICAgSSBoYXZlbid0IHRoZSBmb2dnaWVzdCBpZGVhIHdoYXQgaXQncyBhYm91dCAtLSBSRVcgKi8KKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfUkVTRVQsICAgIFNJMl9JU0FfUkVTRVRfQ0xFQVIpOworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JTlRDTEVBUiwgU0kyX0lTQV9JTlRDTEVBUl9TRVQpOworCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBTWF9JUlFfUkVHX1ZBTChib2FyZCkgXAorICAgICAgICAoKGJvYXJkLT5mbGFncyAmIFNYX0lTQV9CT0FSRCk/KGJvYXJkLT5pcnEgPDwgNCk6MCkKKworLyogTm90ZS4gVGhlIFNYIHJlZ2lzdGVyIGlzIHdyaXRlLW9ubHkuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byBlbmFibGUgdGhlCisgICBidXMgdG9vLiBUaGlzIGlzIGEgbm8tb3AsIGlmIHlvdSBkb24ndCBtZXNzIHdpdGggdGhpcyBkcml2ZXIuLi4gKi8KK3N0YXRpYyBpbnQgc3hfc3RhcnRfaW50ZXJydXB0cyAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKworCS8qIERvbid0IGNhbGwgdGhpcyB3aXRoIGJvYXJkLT5pcnEgPT0gMCAqLworCisJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkgeworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU1hfQ09ORklHLCBTWF9JUlFfUkVHX1ZBTCAoYm9hcmQpIHwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNYX0NPTkZfQlVTRU4gfCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1hfQ09ORl9IT1NUSVJRKTsKKwl9IGVsc2UgaWYgKElTX0VJU0FfQk9BUkQoYm9hcmQpKSB7CisJCWluYihib2FyZC0+ZWlzYV9iYXNlKzB4YzAzKTsgIAorCX0gZWxzZSBpZiAoSVNfU0kxX0JPQVJEKGJvYXJkKSkgeworCSAgICAgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kxX0lTQV9JTlRDTCwwKTsKKwkgICAgICAgd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMV9JU0FfSU5UQ0xfQ0xFQVIsMCk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChib2FyZC0+aXJxKSB7CisJCWNhc2UgMTE6d3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRMTEsIFNJMl9JU0FfSVJRMTFfU0VUKTticmVhazsKKwkJY2FzZSAxMjp3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JUlExMiwgU0kyX0lTQV9JUlExMl9TRVQpO2JyZWFrOworCQljYXNlIDE1OndyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUTE1LCBTSTJfSVNBX0lSUTE1X1NFVCk7YnJlYWs7CisJCWRlZmF1bHQ6cHJpbnRrIChLRVJOX0lORk8gInN4OiBTSS9YSU8gY2FyZCBkb2Vzbid0IHN1cHBvcnQgaW50ZXJydXB0ICVkLlxuIiwgCisJCSAgICAgICAgICAgICAgICBib2FyZC0+aXJxKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSU5UQ0xFQVIsIFNJMl9JU0FfSU5UQ0xFQVJfU0VUKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHN4X3NlbmRfY29tbWFuZCAoc3RydWN0IHN4X3BvcnQgKnBvcnQsIAorICAgICAgICAgICAgICAgICAgICAgCSAgICBpbnQgY29tbWFuZCwgaW50IG1hc2ssIGludCBuZXdzdGF0KQoreworCWZ1bmNfZW50ZXIyICgpOworCXdyaXRlX3N4X2J5dGUgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgaGlfaHN0YXQpLCBjb21tYW5kKTsKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIHN4X2J1c3lfd2FpdF9lcSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBoaV9oc3RhdCksIG1hc2ssIG5ld3N0YXQpOworfQorCisKK3N0YXRpYyBjaGFyICptb2RfdHlwZV9zIChpbnQgbW9kdWxlX3R5cGUpCit7CisJc3dpdGNoIChtb2R1bGVfdHlwZSkgeworCWNhc2UgVEE0OiAgICAgICByZXR1cm4gIlRBNCI7CisJY2FzZSBUQTg6ICAgICAgIHJldHVybiAiVEE4IjsKKwljYXNlIFRBNF9BU0lDOiAgcmV0dXJuICJUQTRfQVNJQyI7CisJY2FzZSBUQThfQVNJQzogIHJldHVybiAiVEE4X0FTSUMiOworCWNhc2UgTVRBX0NEMTQwMDpyZXR1cm4gIk1UQV9DRDE0MDAiOworCWNhc2UgU1hEQzogICAgICByZXR1cm4gIlNYREMiOworCWRlZmF1bHQ6cmV0dXJuICJVbmtub3duL2ludmFsaWQiOworCX0KK30KKworCitzdGF0aWMgY2hhciAqcGFuX3R5cGVfcyAoaW50IHBhbl90eXBlKQoreworCXN3aXRjaCAocGFuX3R5cGUpIHsKKwljYXNlIE1PRF9SUzIzMkRCMjU6ICAgICByZXR1cm4gIk1PRF9SUzIzMkRCMjUiOworCWNhc2UgTU9EX1JTMjMyUko0NTogICAgIHJldHVybiAiTU9EX1JTMjMyUko0NSI7CisJY2FzZSBNT0RfUlM0MjJEQjI1OiAgICAgcmV0dXJuICJNT0RfUlM0MjJEQjI1IjsKKwljYXNlIE1PRF9QQVJBTExFTDogICAgICByZXR1cm4gIk1PRF9QQVJBTExFTCI7CisJY2FzZSBNT0RfMl9SUzIzMkRCMjU6ICAgcmV0dXJuICJNT0RfMl9SUzIzMkRCMjUiOworCWNhc2UgTU9EXzJfUlMyMzJSSjQ1OiAgIHJldHVybiAiTU9EXzJfUlMyMzJSSjQ1IjsKKwljYXNlIE1PRF8yX1JTNDIyREIyNTogICByZXR1cm4gIk1PRF8yX1JTNDIyREIyNSI7CisJY2FzZSBNT0RfUlMyMzJEQjI1TUFMRTogcmV0dXJuICJNT0RfUlMyMzJEQjI1TUFMRSI7CisJY2FzZSBNT0RfMl9QQVJBTExFTDogICAgcmV0dXJuICJNT0RfMl9QQVJBTExFTCI7CisJY2FzZSBNT0RfQkxBTks6ICAgICAgICAgcmV0dXJuICJlbXB0eSI7CisJZGVmYXVsdDpyZXR1cm4gImludmFsaWQiOworCX0KK30KKworCitzdGF0aWMgaW50IG1vZF9jb21wYXRfdHlwZSAoaW50IG1vZHVsZV90eXBlKQoreworCXJldHVybiBtb2R1bGVfdHlwZSA+PiA0OworfQorCitzdGF0aWMgdm9pZCBzeF9yZWNvbmZpZ3VyZV9wb3J0KHN0cnVjdCBzeF9wb3J0ICpwb3J0KQoreworCWlmIChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaHN0YXQpID09IEhTX0lETEVfT1BFTikgeworCQlpZiAoc3hfc2VuZF9jb21tYW5kIChwb3J0LCBIU19DT05GSUcsIC0xLCBIU19JRExFX09QRU4pICE9IDEpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzeDogU2VudCByZWNvbmZpZ3VyZSBjb21tYW5kLCBidXQgY2FyZCBkaWRuJ3QgcmVhY3QuXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1RFUk1JT1MsIAorCQkgICAgICAgICAgICAic3g6IE5vdCBzZW5kaW5nIHJlY29uZmlndXJlOiBwb3J0IGlzbid0IG9wZW4gKCUwMngpLlxuIiwgCisJCSAgICAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9oc3RhdCkpOworCX0JCit9CisKK3N0YXRpYyB2b2lkIHN4X3NldHNpZ25hbHMgKHN0cnVjdCBzeF9wb3J0ICpwb3J0LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCWludCB0OworCWZ1bmNfZW50ZXIyICgpOworCisJdCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9vcCk7CisJaWYgKGR0ciA+PSAwKSB0ID0gZHRyPyAodCB8IE9QX0RUUik6ICh0ICYgfk9QX0RUUik7CisJaWYgKHJ0cyA+PSAwKSB0ID0gcnRzPyAodCB8IE9QX1JUUyk6ICh0ICYgfk9QX1JUUyk7CisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9vcCwgdCk7CisJc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAic2V0c2lnbmFsczogJWQvJWRcbiIsIGR0ciwgcnRzKTsKKworCWZ1bmNfZXhpdCAoKTsKK30KKworCisKK3N0YXRpYyBpbnQgc3hfZ2V0c2lnbmFscyAoc3RydWN0IHN4X3BvcnQgKnBvcnQpCit7CisJaW50IGlfc3RhdCxvX3N0YXQ7CisKKwlvX3N0YXQgPSBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfb3ApOworCWlfc3RhdCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9pcCk7CisKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJnZXRzaWduYWxzOiAlZC8lZCAgKCVkLyVkKSAlMDJ4LyUwMnhcbiIsCisJICAgICAgICAgICAgKG9fc3RhdCAmIE9QX0RUUikgIT0gMCwgKG9fc3RhdCAmIE9QX1JUUykgIT0gMCwKKwkgICAgICAgICAgICBwb3J0LT5jX2RjZCwgc3hfZ2V0X0NEIChwb3J0KSwKKwkgICAgICAgICAgICBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaXApLAorCSAgICAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9zdGF0ZSkpOworCisJcmV0dXJuICgoKG9fc3RhdCAmIE9QX0RUUik/VElPQ01fRFRSOjApIHwKKwkgICAgICAgICgob19zdGF0ICYgT1BfUlRTKT9USU9DTV9SVFM6MCkgfAorCSAgICAgICAgKChpX3N0YXQgJiBJUF9DVFMpP1RJT0NNX0NUUzowKSB8CisJICAgICAgICAoKGlfc3RhdCAmIElQX0RDRCk/VElPQ01fQ0FSOjApIHwKKwkgICAgICAgICgoaV9zdGF0ICYgSVBfRFNSKT9USU9DTV9EU1I6MCkgfAorCSAgICAgICAgKChpX3N0YXQgJiBJUF9SSSk/VElPQ01fUk5HOjApCisJICAgICAgICApOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3NldF9iYXVkIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKK3sKKwlpbnQgdDsKKworCWlmIChwb3J0LT5ib2FyZC0+dGFfdHlwZSA9PSBNT0RfU1hEQykgeworCQlzd2l0Y2ggKHBvcnQtPmdzLmJhdWQpIHsKKwkJICAvKiBTYXZlIHNvbWUgdHlwaW5nIHdvcmsuLi4gKi8KKyNkZWZpbmUgZSh4KSBjYXNlIHg6dD0gQkFVRF8gIyMgeCA7IGJyZWFrCisJCQllKDUwKTtlKDc1KTtlKDExMCk7ZSgxNTApO2UoMjAwKTtlKDMwMCk7ZSg2MDApOworICAgICAgICAgICAgICAgICAgICAgICAgZSgxMjAwKTtlKDE4MDApO2UoMjAwMCk7ZSgyNDAwKTtlKDQ4MDApO2UoNzIwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlKDk2MDApO2UoMTQ0MDApO2UoMTkyMDApO2UoMjg4MDApO2UoMzg0MDApOworICAgICAgICAgICAgICAgICAgICAgICAgZSg1NjAwMCk7ZSg1NzYwMCk7ZSg2NDAwMCk7ZSg3NjgwMCk7ZSgxMTUyMDApOworCQkJZSgxMjgwMDApO2UoMTUwMDAwKTtlKDIzMDQwMCk7ZSgyNTYwMDApO2UoNDYwODAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUoOTIxNjAwKTsKKwkJY2FzZSAxMzQgICAgOnQgPSBCQVVEXzEzNF81OyAgIGJyZWFrOworCQljYXNlIDAgICAgICA6dCA9IC0xOworCQkJCQkJCQkgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBDYW4gSSByZXR1cm4gImludmFsaWQiPyAqLworCQkJdCA9IEJBVURfOTYwMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJzeDogdW5zdXBwb3J0ZWQgYmF1ZCByYXRlOiAlZC5cbiIsIHBvcnQtPmdzLmJhdWQpOworCQkJYnJlYWs7CisJCX0KKyN1bmRlZiBlCisJCWlmICh0ID4gMCkgeworCQkJLyogVGhlIGJhdWQgcmF0ZSBpcyBub3Qgc2V0IHRvIDAsIHNvIHdlJ3JlIGVuYWJlbGluZyBEVFIuLi4gLS0gUkVXICovCisJCQlzeF9zZXRzaWduYWxzIChwb3J0LCAxLCAtMSk7IAorCQkJLyogWFhYIFRoaXMgaXMgbm90IFRBICYgTVRBIGNvbXBhdGlibGUgKi8KKwkJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfY3NyLCAweGZmKTsKKworCQkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eGJhdWQsIHQpOworCQkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9yeGJhdWQsIHQpOworCQl9IGVsc2UgeworCQkJc3hfc2V0c2lnbmFscyAocG9ydCwgMCwgLTEpOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChwb3J0LT5ncy5iYXVkKSB7CisjZGVmaW5lIGUoeCkgY2FzZSB4OnQ9IENTUl8gIyMgeCA7IGJyZWFrCisJCQllKDc1KTtlKDE1MCk7ZSgzMDApO2UoNjAwKTtlKDEyMDApO2UoMjQwMCk7ZSg0ODAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUoMTgwMCk7ZSg5NjAwKTsKKwkJCWUoMTkyMDApO2UoNTc2MDApO2UoMzg0MDApOworCQkJLyogVEEgc3VwcG9ydHMgMTEwLCBidXQgbm90IDExNTIwMCwgTVRBIHN1cHBvcnRzIDExNTIwMCwgYnV0IG5vdCAxMTAgKi8KKwkJY2FzZSAxMTA6IAorCQkJaWYgKHBvcnQtPmJvYXJkLT50YV90eXBlID09IE1PRF9UQSkgeworCQkJCXQgPSBDU1JfMTEwOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQl0ID0gQ1NSXzk2MDA7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBVbnN1cHBvcnRlZCBiYXVkIHJhdGU6ICVkLlxuIiwgcG9ydC0+Z3MuYmF1ZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgMTE1MjAwOiAKKwkJCWlmIChwb3J0LT5ib2FyZC0+dGFfdHlwZSA9PSBNT0RfVEEpIHsKKwkJCQl0ID0gQ1NSXzk2MDA7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBVbnN1cHBvcnRlZCBiYXVkIHJhdGU6ICVkLlxuIiwgcG9ydC0+Z3MuYmF1ZCk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXQgPSBDU1JfMTEwOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIDAgICAgICA6dCA9IC0xOworCQkJCQkJCQkgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0ID0gQ1NSXzk2MDA7CisJCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IFVuc3VwcG9ydGVkIGJhdWQgcmF0ZTogJWQuXG4iLCBwb3J0LT5ncy5iYXVkKTsKKwkJCWJyZWFrOworCQl9CisjdW5kZWYgZQorCQlpZiAodCA+PSAwKSB7CisJCQlzeF9zZXRzaWduYWxzIChwb3J0LCAxLCAtMSk7CisJCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2NzciwgdCAqIDB4MTEpOworCQl9IGVsc2UgeworCQkJc3hfc2V0c2lnbmFscyAocG9ydCwgMCwgLTEpOworCQl9CisJfQorfQorCisKKy8qIFNpbW9uIEFsbGVuJ3MgdmVyc2lvbiBvZiB0aGlzIHJvdXRpbmUgd2FzIDIyNSBsaW5lcyBsb25nLiA4NSBpcyBhIGxvdAorICAgYmV0dGVyLiAtLSBSRVcgKi8KKworc3RhdGljIGludCBzeF9zZXRfcmVhbF90ZXJtaW9zICh2b2lkICpwdHIpCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7CisKKwlmdW5jX2VudGVyMigpOworCisJaWYgKCFwb3J0LT5ncy50dHkpCisJCXJldHVybiAwOworCisJLyogV2hhdCBpcyB0aGlzIGRvaW5nIGhlcmU/IC0tIFJFVworCSAgIEhhISBmaWd1cmVkIGl0IG91dC4gSXQgaXMgdG8gYWxsb3cgeW91IHRvIGdldCBEVFIgYWN0aXZlIGFnYWluCisJICAgaWYgeW91J3ZlIGRyb3BwZWQgaXQgd2l0aCBzdHR5IDAuIE1vdmVkIHRvIHNldF9iYXVkLCB3aGVyZSBpdAorCSAgIGJlbG9uZ3MgKG5leHQgdG8gdGhlIGRyb3AgZHRyIGlmIGJhdWQgPT0gMCkgLS0gUkVXICovCisJLyogc3hfc2V0c2lnbmFscyAocG9ydCwgMSwgLTEpOyAqLworCisJc3hfc2V0X2JhdWQgKHBvcnQpOworCisjZGVmaW5lIENGTEFHIHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZworCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfbXIxLAorCSAgICAgICAgICAgICAgICAgICAgICAgKENfUEFSRU5CIChwb3J0LT5ncy50dHkpPyBNUjFfV0lUSDpNUjFfTk9ORSkgfAorCSAgICAgICAgICAgICAgICAgICAgICAgKENfUEFST0REIChwb3J0LT5ncy50dHkpPyBNUjFfT0REOk1SMV9FVkVOKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoQ19DUlRTQ1RTKHBvcnQtPmdzLnR0eSk/IE1SMV9SVFNfUlhGTE9XOjApIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICgoKENGTEFHICYgQ1NJWkUpPT1DUzgpID8gTVIxXzhfQklUUzowKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoKChDRkxBRyAmIENTSVpFKT09Q1M3KSA/IE1SMV83X0JJVFM6MCkgfAorCSAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0ZMQUcgJiBDU0laRSk9PUNTNikgPyBNUjFfNl9CSVRTOjApIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICgoKENGTEFHICYgQ1NJWkUpPT1DUzUpID8gTVIxXzVfQklUUzowKSApOworCisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tcjIsCisJICAgICAgICAgICAgICAgICAgICAgICAoQ19DUlRTQ1RTKHBvcnQtPmdzLnR0eSk/TVIyX0NUU19UWEZMT1c6MCkgfAorCSAgICAgICAgICAgICAgICAgICAgICAgKENfQ1NUT1BCIChwb3J0LT5ncy50dHkpP01SMl8yX1NUT1A6TVIyXzFfU1RPUCkpOworCisJc3dpdGNoIChDRkxBRyAmIENTSVpFKSB7CisJY2FzZSBDUzg6c3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tYXNrLCAweGZmKTticmVhazsKKwljYXNlIENTNzpzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX21hc2ssIDB4N2YpO2JyZWFrOworCWNhc2UgQ1M2OnN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfbWFzaywgMHgzZik7YnJlYWs7CisJY2FzZSBDUzU6c3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tYXNrLCAweDFmKTticmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IEludmFsaWQgd29yZHNpemU6ICVkXG4iLCBDRkxBRyAmIENTSVpFKTsKKwkJYnJlYWs7CisJfQorCisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9wcnRjbCwgCisJICAgICAgICAgICAgICAgICAgICAgICAoSV9JWE9OICAgKHBvcnQtPmdzLnR0eSk/U1BfVFhFTjowKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoSV9JWE9GRiAgKHBvcnQtPmdzLnR0eSk/U1BfUlhFTjowKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoSV9JWEFOWSAgKHBvcnQtPmdzLnR0eSk/U1BfVEFOWTowKSB8CisJICAgICAgICAgICAgICAgICAgICAgICBTUF9EQ0VOKTsKKworCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfYnJlYWssIAorCSAgICAgICAgICAgICAgICAgICAgICAgKElfSUdOQlJLKHBvcnQtPmdzLnR0eSk/QlJfSUdOOjAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgIElfQlJLSU5UKHBvcnQtPmdzLnR0eSk/QlJfSU5UOjApKTsKKworCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhvbiwgIFNUQVJUX0NIQVIgKHBvcnQtPmdzLnR0eSkpOworCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfcnhvbiwgIFNUQVJUX0NIQVIgKHBvcnQtPmdzLnR0eSkpOworCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhvZmYsIFNUT1BfQ0hBUiAgKHBvcnQtPmdzLnR0eSkpOworCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfcnhvZmYsIFNUT1BfQ0hBUiAgKHBvcnQtPmdzLnR0eSkpOworCisJc3hfcmVjb25maWd1cmVfcG9ydChwb3J0KTsKKworCS8qIFRlbGwgbGluZSBkaXNjaXBsaW5lIHdoZXRoZXIgd2Ugd2lsbCBkbyBpbnB1dCBjb29raW5nICovCisJaWYoSV9PVEhFUihwb3J0LT5ncy50dHkpKSB7CisJCWNsZWFyX2JpdChUVFlfSFdfQ09PS19JTiwgJnBvcnQtPmdzLnR0eS0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCXNldF9iaXQoVFRZX0hXX0NPT0tfSU4sICZwb3J0LT5ncy50dHktPmZsYWdzKTsKKwl9CisJc3hfZHByaW50ayAoU1hfREVCVUdfVEVSTUlPUywgImlmbGFnczogJXgoJWQpICIsIAorCSAgICAgICAgICAgIHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19pZmxhZywgCisJICAgICAgICAgICAgSV9PVEhFUihwb3J0LT5ncy50dHkpKTsKKworCisvKiBUZWxsIGxpbmUgZGlzY2lwbGluZSB3aGV0aGVyIHdlIHdpbGwgZG8gb3V0cHV0IGNvb2tpbmcuCisgKiBJZiBPUE9TVCBpcyBzZXQgYW5kIG5vIG90aGVyIG91dHB1dCBmbGFncyBhcmUgc2V0IHRoZW4gd2UgY2FuIGRvIG91dHB1dAorICogcHJvY2Vzc2luZy4gIEV2ZW4gaWYgb25seSAqb25lKiBvdGhlciBmbGFnIGluIHRoZSBPX09USEVSIGdyb3VwIGlzIHNldAorICogd2UgZG8gY29va2luZyBpbiBzb2Z0d2FyZS4KKyAqLworCWlmKE9fT1BPU1QocG9ydC0+Z3MudHR5KSAmJiAhT19PVEhFUihwb3J0LT5ncy50dHkpKSB7CisJCXNldF9iaXQoVFRZX0hXX0NPT0tfT1VULCAmcG9ydC0+Z3MudHR5LT5mbGFncyk7CisJfSBlbHNlIHsKKwkJY2xlYXJfYml0KFRUWV9IV19DT09LX09VVCwgJnBvcnQtPmdzLnR0eS0+ZmxhZ3MpOworCX0KKwlzeF9kcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAib2ZsYWdzOiAleCglZClcbiIsIAorCSAgICAgICAgICAgIHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19vZmxhZywgCisJICAgICAgICAgICAgT19PVEhFUihwb3J0LT5ncy50dHkpKTsKKwkvKiBwb3J0LT5jX2RjZCA9IHN4X2dldF9DRCAocG9ydCk7ICovCisJZnVuY19leGl0ICgpOworCXJldHVybiAwOworfQorCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJydXB0IHJlbGF0ZWQgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogTm90ZToKKyAgIE90aGVyIGRyaXZlcnMgdXNlIHRoZSBtYWNybyAiTUlOIiB0byBjYWxjdWxhdGUgaG93IG11Y2ggdG8gY29weS4KKyAgIFRoaXMgaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCBpdCB3aWxsIGV2YWx1YXRlIHBhcnRzIHR3aWNlLiBUaGF0J3MKKyAgIGV4cGVuc2l2ZSB3aGVuIGl0J3MgSU8gKGFuZCB0aGUgY29tcGlsZXIgY2Fubm90IG9wdGltaXplIHRob3NlIGF3YXkhKS4KKyAgIE1vcmVvdmVyLCBJJ20gbm90IHN1cmUgdGhhdCB5b3UncmUgcmFjZS1mcmVlLiAKKworICAgSSBhc3NpZ24gYSB2YWx1ZSwgYW5kIHRoZW4gb25seSBhbGxvdyB0aGUgdmFsdWUgdG8gZGVjcmVhc2UuIFRoaXMKKyAgIGlzIGFsd2F5cyBzYWZlLiBUaGlzIG1ha2VzIHRoZSBjb2RlIGEgZmV3IGxpbmVzIGxvbmdlciwgYW5kIHlvdQorICAga25vdyBJJ20gZGVhZCBhZ2FpbnN0IHRoYXQsIGJ1dCBJIHRoaW5rIGl0IGlzIHJlcXVpcmVkIGluIHRoaXMKKyAgIGNhc2UuICAqLworCisKK3N0YXRpYyB2b2lkIHN4X3RyYW5zbWl0X2NoYXJzIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKK3sKKwlpbnQgYzsKKwlpbnQgdHhfaXA7CisJaW50IHR4cm9vbTsKKworCWZ1bmNfZW50ZXIyICgpOworCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiUG9ydCAlcDogdHJhbnNtaXQgJWQgY2hhcnNcbiIsIAorCSAgICAgICAgICAgIHBvcnQsIHBvcnQtPmdzLnhtaXRfY250KTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0IChTWF9QT1JUX1RSQU5TTUlUX0xPQ0ssICZwb3J0LT5sb2NrcykpIHsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICgxKSB7CisJCWMgPSBwb3J0LT5ncy54bWl0X2NudDsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIkNvcHlpbmcgJWQgIiwgYyk7CisJCXR4X2lwICA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eGlwb3MpOworCisJCS8qIFRvb2sgbWUgNSBtaW51dGVzIHRvIGRlZHVjZSB0aGlzIGZvcm11bGEuIAorCQkgICBMdWNraWx5IGl0IGlzIGxpdGVyYWxseSBpbiB0aGUgbWFudWFsIGluIHNlY3Rpb24gNi41LjQuMy41ICovCisJCXR4cm9vbSA9IChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhvcG9zKSAtIHR4X2lwIC0gMSkgJiAweGZmOworCisJCS8qIERvbid0IGNvcHkgbW9yZSBieXRlcyB0aGFuIHRoZXJlIGlzIHJvb20gZm9yIGluIHRoZSBidWZmZXIgKi8KKwkJaWYgKGMgPiB0eHJvb20pCisJCQljID0gdHhyb29tOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIiAlZCglZCkgIiwgYywgdHhyb29tICk7CisKKwkJLyogRG9uJ3QgY29weSBwYXN0IHRoZSBlbmQgb2YgdGhlIGhhcmR3YXJlIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlpZiAoYyA+IDB4MTAwIC0gdHhfaXApIAorCQkJYyA9IDB4MTAwIC0gdHhfaXA7CisKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfVFJBTlNNSVQsICIgJWQoJWQpICIsIGMsIDB4MTAwLXR4X2lwICk7CisKKwkJLyogRG9uJ3QgY29weSBwYXMgdGhlIGVuZCBvZiB0aGUgc291cmNlIGJ1ZmZlciAqLworCQlpZiAoYyA+IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT5ncy54bWl0X3RhaWwpIAorCQkJYyA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT5ncy54bWl0X3RhaWw7CisKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfVFJBTlNNSVQsICIgJWQoJWxkKSBcbiIsIAorCQkgICAgICAgICAgICBjLCBTRVJJQUxfWE1JVF9TSVpFLSBwb3J0LT5ncy54bWl0X3RhaWwpOworCisJCS8qIElmIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIsIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCB3ZSdyZSBkb25lISAqLworCQlpZiAoYyA9PSAwKSBicmVhazsKKworCisJCW1lbWNweV90b2lvIChwb3J0LT5ib2FyZC0+YmFzZSArIENIQU5fT0ZGU0VUKHBvcnQsaGlfdHhidWYpICsgdHhfaXAsIAorCQkgICAgICAgICAgICAgcG9ydC0+Z3MueG1pdF9idWYgKyBwb3J0LT5ncy54bWl0X3RhaWwsIGMpOworCisJCS8qIFVwZGF0ZSB0aGUgcG9pbnRlciBpbiB0aGUgY2FyZCAqLworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4aXBvcywgKHR4X2lwK2MpICYgMHhmZik7CisKKwkJLyogVXBkYXRlIHRoZSBrZXJuZWwgYnVmZmVyIGVuZCAqLworCQlwb3J0LT5ncy54bWl0X3RhaWwgPSAocG9ydC0+Z3MueG1pdF90YWlsICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKworCQkvKiBUaGlzIG9uZSBsYXN0LiAodGhpcyBpcyBlc3NlbnRpYWwpCisJCSAgIEl0IHdvdWxkIGFsbG93IG90aGVycyB0byBzdGFydCBwdXR0aW5nIG1vcmUgZGF0YSBpbnRvIHRoZSBidWZmZXIhICovCisJCXBvcnQtPmdzLnhtaXRfY250IC09IGM7CisJfQorCisJaWYgKHBvcnQtPmdzLnhtaXRfY250ID09IDApIHsKKwkJc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKKwl9CisKKwlpZiAoKHBvcnQtPmdzLnhtaXRfY250IDw9IHBvcnQtPmdzLndha2V1cF9jaGFycykgJiYgcG9ydC0+Z3MudHR5KSB7CisJCXR0eV93YWtldXAocG9ydC0+Z3MudHR5KTsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfVFJBTlNNSVQsICJXYWtpbmcgdXAuLi4uIGxkaXNjICglZCkuLi4uXG4iLAorCQkgICAgICAgICAgICBwb3J0LT5ncy53YWtldXBfY2hhcnMpOyAKKwl9CisKKwljbGVhcl9iaXQgKFNYX1BPUlRfVFJBTlNNSVRfTE9DSywgJnBvcnQtPmxvY2tzKTsKKwlmdW5jX2V4aXQgKCk7Cit9CisKKworLyogTm90ZSB0aGUgc3ltbWV0cnkgYmV0d2VlbiByZWNlaXZpbmcgY2hhcnMgYW5kIHRyYW5zbWl0dGluZyB0aGVtIQorICAgTm90ZTogVGhlIGtlcm5lbCBzaG91bGQgaGF2ZSBpbXBsZW1lbnRlZCBib3RoIGEgcmVjZWl2ZSBidWZmZXIgYW5kCisgICBhIHRyYW5zbWl0IGJ1ZmZlci4gKi8KKworLyogSW5saW5lZDogQ2FsbGVkIG9ubHkgb25jZS4gUmVtb3ZlIHRoZSBpbmxpbmUgd2hlbiB5b3UgYWRkIGFub3RoZXIgY2FsbCAqLworc3RhdGljIGlubGluZSB2b2lkIHN4X3JlY2VpdmVfY2hhcnMgKHN0cnVjdCBzeF9wb3J0ICpwb3J0KQoreworCWludCBjOworCWludCByeF9vcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBjb3BpZWQ9MDsKKworCWZ1bmNfZW50ZXIyICgpOworCXR0eSA9IHBvcnQtPmdzLnR0eTsKKwl3aGlsZSAoMSkgeworCQlyeF9vcCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9yeG9wb3MpOworCQljID0gKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9yeGlwb3MpIC0gcnhfb3ApICYgMHhmZjsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFLCAicnhvcD0lZCwgYyA9ICVkLlxuIiwgcnhfb3AsIGMpOyAKKworCQkvKiBEb24ndCBjb3B5IG1vcmUgYnl0ZXMgdGhhbiB0aGVyZSBpcyByb29tIGZvciBpbiB0aGUgYnVmZmVyICovCisJCWlmICh0dHktPmZsaXAuY291bnQgKyBjID4gVFRZX0ZMSVBCVUZfU0laRSkgCisJCQljID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudDsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFLCAiYyA9ICVkLlxuIiwgYyk7IAorCisJCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgZW5kIG9mIHRoZSBoYXJkd2FyZSByZWNlaXZlIGJ1ZmZlciAqLworCQlpZiAocnhfb3AgKyBjID4gMHgxMDApIGMgPSAweDEwMCAtIHJ4X29wOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1JFQ0VJVkUsICJjID0gJWQuXG4iLCBjKTsKKworCQkvKiBJZiBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLCB3ZSBjYW4ndCBjb3B5IG1vcmUgZGF0YSwgd2UncmUgZG9uZSEgKi8KKwkJaWYgKGMgPT0gMCkgYnJlYWs7CisKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSAsICJDb3B5aW5nIG92ZXIgJWQgY2hhcnMuIEZpcnN0IGlzICVkIGF0ICVseFxuIiwgYywgCisJCSAgICAgICAgICAgIHJlYWRfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUKHBvcnQsaGlfcnhidWYpICsgcnhfb3ApLAorCQkgICAgICAgICAgICBDSEFOX09GRlNFVChwb3J0LCBoaV9yeGJ1ZikpOyAKKwkJbWVtY3B5X2Zyb21pbyAodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgCisJCSAgICAgICAgICAgICAgIHBvcnQtPmJvYXJkLT5iYXNlICsgQ0hBTl9PRkZTRVQocG9ydCxoaV9yeGJ1ZikgKyByeF9vcCwgYyk7CisJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCBUVFlfTk9STUFMLCBjKTsKKworCQkvKiBVcGRhdGUgdGhlIGtlcm5lbCBidWZmZXIgZW5kICovCisJCXR0eS0+ZmxpcC5jb3VudCArPSBjOworCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGM7CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gYzsKKworCQkvKiBUaGlzIG9uZSBsYXN0LiAoIE5vdCBlc3NlbnRpYWwuKQorCQkgICBJdCBhbGxvd3MgdGhlIGNhcmQgdG8gc3RhcnQgcHV0dGluZyBtb3JlIGRhdGEgaW50byB0aGUgYnVmZmVyISAKKwkJICAgVXBkYXRlIHRoZSBwb2ludGVyIGluIHRoZSBjYXJkICovCisJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfcnhvcG9zLCAocnhfb3AgKyBjKSAmIDB4ZmYpOworCisJCWNvcGllZCArPSBjOworCX0KKwlpZiAoY29waWVkKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCWRvX2dldHRpbWVvZmRheSAoJnR2KTsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSwgCisJCSAgICAgICAgICAgICJwdXNoaW5nIGZsaXBxIHBvcnQgJWQgKCUzZCBjaGFycyk6ICVkLiUwNmQgICglZC8lZClcbiIsIAorCQkgICAgICAgICAgICBwb3J0LT5saW5lLCBjb3BpZWQsIAorCQkgICAgICAgICAgICAoaW50KSAodHYudHZfc2VjICUgNjApLCAoaW50KXR2LnR2X3VzZWMsIHR0eS0+cmF3LCB0dHktPnJlYWxfcmF3KTsKKworCQkvKiBUZWxsIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gdGhlIG5ld3MuIEdyZWF0IG5ld3MuIE5ldyBjaGFyYWN0ZXJzISAqLworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCAodHR5KTsKKwkJLyogICAgdHR5X3NjaGVkdWxlX2ZsaXAgKHR0eSk7ICovCisJfQorCisJZnVuY19leGl0ICgpOworfQorCisvKiBJbmxpbmVkOiBpdCBpcyBjYWxsZWQgb25seSBvbmNlLiBSZW1vdmUgdGhlIGlubGluZSBpZiB5b3UgYWRkIGFub3RoZXIgCisgICBjYWxsICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfY2hlY2tfbW9kZW1fc2lnbmFscyAoc3RydWN0IHN4X3BvcnQgKnBvcnQpCit7CisJaW50IGhpX3N0YXRlOworCWludCBjX2RjZDsKKworCWhpX3N0YXRlID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3N0YXRlKTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJDaGVja2luZyBtb2RlbSBzaWduYWxzICglZC8lZClcbiIsCisJICAgICAgICAgICAgcG9ydC0+Y19kY2QsIHN4X2dldF9DRCAocG9ydCkpOworCisJaWYgKGhpX3N0YXRlICYgU1RfQlJFQUspIHsKKwkJaGlfc3RhdGUgJj0gflNUX0JSRUFLOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJnb3QgYSBicmVhay5cbiIpOworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3N0YXRlLCBoaV9zdGF0ZSk7CisJCWdzX2dvdF9icmVhayAoJnBvcnQtPmdzKTsKKwl9CisJaWYgKGhpX3N0YXRlICYgU1RfRENEKSB7CisJCWhpX3N0YXRlICY9IH5TVF9EQ0Q7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgImdvdCBhIERDRCBjaGFuZ2UuXG4iKTsKKwkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9zdGF0ZSwgaGlfc3RhdGUpOworCQljX2RjZCA9IHN4X2dldF9DRCAocG9ydCk7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkRDRCBpcyBub3cgJWRcbiIsIGNfZGNkKTsKKwkJaWYgKGNfZGNkICE9IHBvcnQtPmNfZGNkKSB7CisJCQlwb3J0LT5jX2RjZCA9IGNfZGNkOworCQkJaWYgKHN4X2dldF9DRCAocG9ydCkpIHsKKwkJCQkvKiBEQ0Qgd2VudCBVUCAqLworCQkJCWlmICgoc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfaHN0YXQpICE9IEhTX0lETEVfQ0xPU0VEKSAmJgorCQkJCQkJIShwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICkgeworCQkJCQkvKiBBcmUgd2UgYmxvY2tpbmcgaW4gb3Blbj8qLworCQkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgYWN0aXZlLCB1bmJsb2NraW5nIG9wZW5cbiIpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmdzLm9wZW5fd2FpdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEIHJhaXNlZC4gSWdub3JpbmcuXG4iKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIERDRCB3ZW50IGRvd24hICovCisJCQkJaWYgKCEocG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSApIHsKKwkJCQkJc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEIGRyb3BwZWQuIGhhbmdpbmcgdXAuLi4uXG4iKTsKKwkJCQkJdHR5X2hhbmd1cCAocG9ydC0+Z3MudHR5KTsKKwkJCQl9IGVsc2UgeworCQkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgZHJvcHBlZC4gaWdub3JpbmcuXG4iKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJIbW1tLiBjYXJkIHRvbGQgdXMgRENEIGNoYW5nZWQsIGJ1dCBpdCBkaWRuJ3QuXG4iKTsKKwkJfQorCX0KK30KKworCisvKiBUaGlzIGlzIHdoYXQgYW4gaW50ZXJydXB0IHJvdXRpbmUgc2hvdWxkIGxvb2sgbGlrZS4gCisgKiBTbWFsbCwgZWxlZ2FudCwgY2xlYXIuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHN4X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqcHRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkID0gcHRyOworCXN0cnVjdCBzeF9wb3J0ICpwb3J0OworCWludCBpOworCisJZnVuY19lbnRlciAoKTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19GTE9XLCAic3g6IGVudGVyIHN4X2ludGVycnVwdCAoJWQvJWQpXG4iLCBpcnEsIGJvYXJkLT5pcnEpOyAKKworCS8qIEFBYXJnaCEgVGhlIG9yZGVyIGluIHdoaWNoIHRvIGRvIHRoZXNlIHRoaW5ncyBpcyBlc3NlbnRpYWwgYW5kCisJICAgbm90IHRyaXZpYWwuIAorCisJICAgLSBSYXRlIGxpbWl0IGdvZXMgYmVmb3JlICJyZWN1cnNpdmUiLiBPdGhlcndpc2UgYSBzZXJpZXMgb2YKKwkgICAgIHJlY3Vyc2l2ZSBjYWxscyB3aWxsIGhhbmcgdGhlIG1hY2hpbmUgaW4gdGhlIGludGVycnVwdCByb3V0aW5lLiAKKworCSAgIC0gaGFyZHdhcmUgdHdpZGRsaW5nIGdvZXMgYmVmb3JlICJyZWN1cnNpdmUiLiBPdGhlcndpc2Ugd2hlbiB3ZQorCSAgICAgcG9sbCB0aGUgY2FyZCwgYW5kIGEgcmVjdXJzaXZlIGludGVycnVwdCBoYXBwZW5zLCB3ZSB3b24ndAorCSAgICAgYWNrIHRoZSBjYXJkLCBzbyBpdCBtaWdodCBrZWVwIG9uIGludGVycnVwdGluZyB1cy4gKGVzcGVjaWFsbHkKKwkgICAgIGxldmVsIHNlbnNpdGl2ZSBpbnRlcnJ1cHQgc3lzdGVtcyBsaWtlIFBDSSkuCisKKwkgICAtIFJhdGUgbGltaXQgZ29lcyBiZWZvcmUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2Ugd2Ugd29uJ3QKKwkgICAgIGNhdGNoIGEgY2FyZCB0aGF0IGhhcyBnb25lIGJvbmtlcnMuCisKKwkgICAtIFRoZSAiaW5pdGlhbGl6ZWQiIHRlc3QgZ29lcyBhZnRlciB0aGUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2UKKwkgICAgIHRoZSBjYXJkIHdpbGwgc3RpY2sgdXMgaW4gdGhlIGludGVycnVwdCByb3V0aW5lIGFnYWluLgorCisJICAgLSBUaGUgaW5pdGlhbGl6ZWQgdGVzdCBnb2VzIGJlZm9yZSByZWN1cnNpdmUuIAorCSovCisKKworCisjaWZkZWYgSVJRX1JBVEVfTElNSVQKKwkvKiBBYWFyZ2ghIEknbSBhc2hhbWVkLiBUaGlzIGNvc3RzIG1vcmUgbGluZXMtb2YtY29kZSB0aGFuIHRoZQorCSAgIGFjdHVhbCBpbnRlcnJ1cHQgcm91dGluZSEuIChXZWxsLCB1c2VkIHRvIHdoZW4gSSB3cm90ZSB0aGF0IGNvbW1lbnQpICovCisJeworCQlzdGF0aWMgaW50IGxhc3RqaWY7CisJCXN0YXRpYyBpbnQgbmludHI9MDsKKworCQlpZiAobGFzdGppZiA9PSBqaWZmaWVzKSB7CisJCQlpZiAoKytuaW50ciA+IElSUV9SQVRFX0xJTUlUKSB7CisJCQkJZnJlZV9pcnEgKGJvYXJkLT5pcnEsIGJvYXJkKTsKKwkJCQlwcmludGsgKEtFUk5fRVJSICJzeDogVG9vIG1hbnkgaW50ZXJydXB0cy4gVHVybmluZyBvZmYgaW50ZXJydXB0ICVkLlxuIiwgCisJCQkJCSAgICAgIGJvYXJkLT5pcnEpOworCQkJfQorCQl9IGVsc2UgeworCQkJbGFzdGppZiA9IGppZmZpZXM7CisJCQluaW50ciA9IDA7CisJCX0KKwl9CisjZW5kaWYKKworCisJaWYgKGJvYXJkLT5pcnEgPT0gaXJxKSB7CisJCS8qIFRlbGwgdGhlIGNhcmQgd2UndmUgbm90aWNlZCB0aGUgaW50ZXJydXB0LiAqLworCisJCXN4X3dyaXRlX2JvYXJkX3dvcmQgKGJvYXJkLCBjY19pbnRfcGVuZGluZywgMCk7CisJCWlmIChJU19TWF9CT0FSRCAoYm9hcmQpKSB7CisJCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU1hfUkVTRVRfSVJRLCAxKTsKKwkJfSBlbHNlIGlmIChJU19FSVNBX0JPQVJEKGJvYXJkKSkgeworCQkJaW5iKGJvYXJkLT5laXNhX2Jhc2UrMHhjMDMpOworCQkJd3JpdGVfc3hfd29yZChib2FyZCwgOCwgMCk7IAorCQl9IGVsc2UgeworCQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSU5UQ0xFQVIsIFNJMl9JU0FfSU5UQ0xFQVJfQ0xFQVIpOworCQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSU5UQ0xFQVIsIFNJMl9JU0FfSU5UQ0xFQVJfU0VUKTsKKwkJfQorCX0KKworCWlmICghc3hfaW5pdGlhbGl6ZWQpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlpZiAoIShib2FyZC0+ZmxhZ3MgJiBTWF9CT0FSRF9JTklUSUFMSVpFRCkpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0IChTWF9CT0FSRF9JTlRSX0xPQ0ssICZib2FyZC0+bG9ja3MpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIlJlY3Vyc2l2ZSBpbnRlcnJ1cHQhICglZClcbiIsIGJvYXJkLT5pcnEpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJIGZvciAoaT0wO2k8Ym9hcmQtPm5wb3J0cztpKyspIHsKKwkJcG9ydCA9ICZib2FyZC0+cG9ydHNbaV07CisJCWlmIChwb3J0LT5ncy5mbGFncyAmIEdTX0FDVElWRSkgeworCQkJaWYgKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9zdGF0ZSkpIHsKKwkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTlRFUlJVUFRTLCAKKwkJCQkgICAgICAgICAgICAiUG9ydCAlZDogbW9kZW0gc2lnbmFsIGNoYW5nZT8uLi4gXG4iLCBpKTsKKwkJCQlzeF9jaGVja19tb2RlbV9zaWduYWxzIChwb3J0KTsgCisJCQl9CisJCQlpZiAocG9ydC0+Z3MueG1pdF9jbnQpIHsKKwkJCQlzeF90cmFuc21pdF9jaGFycyAocG9ydCk7CisJCQl9CisJCQlpZiAoIShwb3J0LT5ncy5mbGFncyAmIFNYX1JYX1RIUk9UVExFKSkgeworCQkJCXN4X3JlY2VpdmVfY2hhcnMgKHBvcnQpOworCQkJfQorCQl9CisJfQorCisJY2xlYXJfYml0IChTWF9CT0FSRF9JTlRSX0xPQ0ssICZib2FyZC0+bG9ja3MpOworCisJc3hfZHByaW50ayAoU1hfREVCVUdfRkxPVywgInN4OiBleGl0IHN4X2ludGVycnVwdCAoJWQvJWQpXG4iLCBpcnEsIGJvYXJkLT5pcnEpOyAKKyAgICAgICAgZnVuY19leGl0ICgpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgdm9pZCBzeF9wb2xsZnVuYyAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQgPSAoc3RydWN0IHN4X2JvYXJkICopIGRhdGE7CisKKwlmdW5jX2VudGVyICgpOworCisJc3hfaW50ZXJydXB0ICgwLCBib2FyZCwgTlVMTCk7CisKKwlpbml0X3RpbWVyKCZib2FyZC0+dGltZXIpOworCisJYm9hcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgc3hfcG9sbDsKKwlhZGRfdGltZXIgKCZib2FyZC0+dGltZXIpOworCWZ1bmNfZXhpdCAoKTsKK30KKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgSGVyZSBhcmUgdGhlIHJvdXRpbmVzIHRoYXQgYWN0dWFsbHkgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgaW50ZXJmYWNlIHdpdGggdGhlIGdlbmVyaWNfc2VyaWFsIGRyaXZlciAgICAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogRWhobS4gSSBkb24ndCBrbm93IGhvdyB0byBmaWRkbGUgd2l0aCBpbnRlcnJ1cHRzIG9uIHRoZSBTWCBjYXJkLiAtLVJFVyAqLworLyogSG1tLiBPayBJIGZpZ3VyZWQgaXQgb3V0LiBZb3UgZG9uJ3QuICAqLworCitzdGF0aWMgdm9pZCBzeF9kaXNhYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAKKwlmdW5jX2VudGVyMigpOworCisJcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfZW5hYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAKKwlpbnQgZGF0YV9pbl9idWZmZXI7CisJZnVuY19lbnRlcjIoKTsKKworCS8qIEZpcnN0IHRyYW5zbWl0IHRoZSBjaGFyYWN0ZXJzIHRoYXQgd2UncmUgc3VwcG9zZWQgdG8gKi8KKwlzeF90cmFuc21pdF9jaGFycyAocG9ydCk7CisKKwkvKiBUaGUgc3ggY2FyZCB3aWxsIG5ldmVyIGludGVycnVwdCB1cyBpZiB3ZSBkb24ndCBmaWxsIHRoZSBidWZmZXIKKwkgICBwYXN0IDI1JS4gU28gd2Uga2VlcCBjb25zaWRlcmluZyBpbnRlcnJ1cHRzIG9mZiBpZiB0aGF0J3MgdGhlIGNhc2UuICovCisJZGF0YV9pbl9idWZmZXIgPSAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4aXBvcykgLSAKKwkgICAgICAgICAgICAgICAgICBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhvcG9zKSkgJiAweGZmOworCisJLyogWFhYIE11c3QgYmUgIkhJR0hfV0FURVIiIGZvciBTSSBjYXJkIGFjY29yZGluZyB0byBkb2MuICovCisJaWYgKGRhdGFfaW5fYnVmZmVyIDwgTE9XX1dBVEVSKSAKKwkJcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3sKKwkvKiAgc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7ICovCisJZnVuY19lbnRlcigpOworCisJZnVuY19leGl0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHN4X2VuYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3sKKwkvKiAgc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7ICovCisJZnVuY19lbnRlcigpOworCisJZnVuY19leGl0KCk7Cit9CisKKworLyogSmVlei4gSXNuJ3QgdGhpcyBzaW1wbGU/ICovCitzdGF0aWMgaW50IHN4X2dldF9DRCAodm9pZCAqIHB0cikgCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7CisJZnVuY19lbnRlcjIoKTsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAoKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9pcCkgJiBJUF9EQ0QpICE9IDApOworfQorCisKKy8qIEplZXouIElzbid0IHRoaXMgc2ltcGxlPyAqLworc3RhdGljIGludCBzeF9jaGFyc19pbl9idWZmZXIgKHZvaWQgKiBwdHIpIAoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOworCWZ1bmNfZW50ZXIyKCk7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gKChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhpcG9zKSAtIAorCSAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eG9wb3MpKSAmIDB4ZmYpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3NodXRkb3duX3BvcnQgKHZvaWQgKiBwdHIpIAoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAKKworCWZ1bmNfZW50ZXIoKTsKKworCXBvcnQtPmdzLmZsYWdzICY9IH4gR1NfQUNUSVZFOworCWlmIChwb3J0LT5ncy50dHkgJiYgKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkgeworCQlzeF9zZXRzaWduYWxzIChwb3J0LCAwLCAwKTsKKwkJc3hfcmVjb25maWd1cmVfcG9ydChwb3J0KTsKKwl9CisKKwlmdW5jX2V4aXQoKTsKK30KKworCisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyAqICAgICAgICAgICAgICAgIEhlcmUgYXJlIHRoZSByb3V0aW5lcyB0aGF0IGFjdHVhbGx5ICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICBpbnRlcmZhY2Ugd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtICAgICAgICAgICAgICAgICAgICAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc3hfb3BlbiAgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQ7CisJaW50IHJldHZhbCwgbGluZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJaWYgKCFzeF9pbml0aWFsaXplZCkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19PUEVOLCAiJWQ6IG9wZW5pbmcgbGluZSAlZC4gdHR5PSVwIGN0dHk9JXAsIG5wPSVkKVxuIiwgCisJICAgICAgICAgICAgY3VycmVudC0+cGlkLCBsaW5lLCB0dHksIGN1cnJlbnQtPnNpZ25hbC0+dHR5LCBzeF9ucG9ydHMpOworCisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gU1hfTlBPUlRTKSB8fCAobGluZSA+PSBzeF9ucG9ydHMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBvcnQgPSAmIHN4X3BvcnRzW2xpbmVdOworCXBvcnQtPmNfZGNkID0gMDsgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGludGVycnVwdCBkb2Vzbid0IGRldGVjdCBhCisJICAgICAgICAgICAgICAgICAgICAxIC0+IDAgdHJhbnNpdGlvbi4gKi8KKworCisJc3hfZHByaW50ayAoU1hfREVCVUdfT1BFTiwgInBvcnQgPSAlcCBjX2RjZCA9ICVkXG4iLCBwb3J0LCBwb3J0LT5jX2RjZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+Z3MuZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OworCXBvcnQtPmdzLnR0eSA9IHR0eTsKKwlwb3J0LT5ncy5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmdzLmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19PUEVOLCAic3RhcnRpbmcgcG9ydFxuIik7CisKKwkvKgorCSAqIFN0YXJ0IHVwIHNlcmlhbCBwb3J0CisJICovCisJcmV0dmFsID0gZ3NfaW5pdF9wb3J0KCZwb3J0LT5ncyk7CisJc3hfZHByaW50ayAoU1hfREVCVUdfT1BFTiwgImRvbmUgZ3NfaW5pdFxuIik7CisJaWYgKHJldHZhbCkgeworCQlwb3J0LT5ncy5jb3VudC0tOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXBvcnQtPmdzLmZsYWdzIHw9IEdTX0FDVElWRTsKKwlpZiAocG9ydC0+Z3MuY291bnQgPD0gMSkKKwkJc3hfc2V0c2lnbmFscyAocG9ydCwgMSwxKTsKKworI2lmIDAKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19PUEVOKQorCQlteV9oZCAocG9ydCwgc2l6ZW9mICgqcG9ydCkpOworI2Vsc2UKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19PUEVOKQorCQlteV9oZF9pbyAocG9ydC0+Ym9hcmQtPmJhc2UgKyBwb3J0LT5jaF9iYXNlLCBzaXplb2YgKCpwb3J0KSk7CisjZW5kaWYKKworCWlmIChwb3J0LT5ncy5jb3VudCA8PSAxKSB7CisJCWlmIChzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX0xPUEVOLCAtMSwgSFNfSURMRV9PUEVOKSAhPSAxKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJzeDogQ2FyZCBkaWRuJ3QgcmVzcG9uZCB0byBMT1BFTiBjb21tYW5kLlxuIik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+Z3MuZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJCXBvcnQtPmdzLmNvdW50LS07CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5ncy5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlyZXR2YWwgPSBnc19ibG9ja190aWxfcmVhZHkocG9ydCwgZmlscCk7CisJc3hfZHByaW50ayAoU1hfREVCVUdfT1BFTiwgIkJsb2NrIHRpbCByZWFkeSByZXR1cm5lZCAlZC4gQ291bnQ9JWRcbiIsIAorCSAgICAgICAgICAgIHJldHZhbCwgcG9ydC0+Z3MuY291bnQpOworCisJaWYgKHJldHZhbCkgeworCQkvKiAKKwkJICogRG9uJ3QgbG93ZXIgZ3MuY291bnQgaGVyZSBiZWNhdXNlIHN4X2Nsb3NlKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIKKwkJICovIAorCisJCXJldHVybiByZXR2YWw7CisJfQorCS8qIHR0eS0+bG93X2xhdGVuY3kgPSAxOyAqLworCisJcG9ydC0+Y19kY2QgPSBzeF9nZXRfQ0QgKHBvcnQpOworCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICJhdCBvcGVuOiBjZD0lZFxuIiwgcG9ydC0+Y19kY2QpOworCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7CisKK30KKworCitzdGF0aWMgdm9pZCBzeF9jbG9zZSAodm9pZCAqcHRyKQoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAKKwkvKiBHaXZlIHRoZSBwb3J0IDUgc2Vjb25kcyB0byBjbG9zZSBkb3duLiAqLworCWludCB0byA9IDUgKiBIWjsgCisKKwlmdW5jX2VudGVyICgpOworCisJc3hfc2V0c2lnbmFscyAocG9ydCwgMCwgMCk7CisJc3hfcmVjb25maWd1cmVfcG9ydChwb3J0KTsJCisJc3hfc2VuZF9jb21tYW5kIChwb3J0LCBIU19DTE9TRSwgMCwgMCk7CisKKwl3aGlsZSAodG8tLSAmJiAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2hzdGF0KSAhPSBIU19JRExFX0NMT1NFRCkpCisJCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMCkpCisJCQlicmVhazsKKwlpZiAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2hzdGF0KSAhPSBIU19JRExFX0NMT1NFRCkgeworCQlpZiAoc3hfc2VuZF9jb21tYW5kIChwb3J0LCBIU19GT1JDRV9DTE9TRUQsIC0xLCBIU19JRExFX0NMT1NFRCkgIT0gMSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAKKwkJCSAgICAgICAgInN4OiBzZW50IHRoZSBmb3JjZV9jbG9zZSBjb21tYW5kLCBidXQgY2FyZCBkaWRuJ3QgcmVhY3RcbiIpOworCQl9IGVsc2UKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX0NMT1NFLCAic2VudCB0aGUgZm9yY2VfY2xvc2UgY29tbWFuZC5cbiIpOworCX0KKworCXN4X2RwcmludGsgKFNYX0RFQlVHX0NMT1NFLCAid2FpdGVkICVkIGppZmZpZXMgZm9yIGNsb3NlLiBjb3VudD0lZFxuIiwgCisJICAgICAgICAgICAgNSAqIEhaIC0gdG8gLSAxLCBwb3J0LT5ncy5jb3VudCk7CisKKwlpZihwb3J0LT5ncy5jb3VudCkgeworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0NMT1NFLCAiV0FSTklORyBwb3J0IGNvdW50OiVkXG4iLCBwb3J0LT5ncy5jb3VudCk7CisJCS8vcHJpbnRrICgiJXMgU0VUVElORyBwb3J0IGNvdW50IHRvIHplcm86ICVwIGNvdW50OiAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0LCBwb3J0LT5ncy5jb3VudCk7CisJCS8vcG9ydC0+Z3MuY291bnQgPSAwOworCX0KKworCWZ1bmNfZXhpdCAoKTsKK30KKworCisKKy8qIFRoaXMgaXMgcmVsYXRpdmVseSB0aG9yb3VnaC4gQnV0IHRoZW4gYWdhaW4gaXQgaXMgb25seSAyMCBsaW5lcy4gKi8KKyNkZWZpbmUgTUFSQ0hVUCAgICBmb3IgKGk9bWluO2k8bWF4O2krKykgCisjZGVmaW5lIE1BUkNIRE9XTiAgZm9yIChpPW1heC0xO2k+PW1pbjtpLS0pCisjZGVmaW5lIFcwICAgICAgICAgd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIGksIDB4NTUpCisjZGVmaW5lIFcxICAgICAgICAgd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIGksIDB4YWEpCisjZGVmaW5lIFIwICAgICAgICAgaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIGkpICE9IDB4NTUpIHJldHVybiAxCisjZGVmaW5lIFIxICAgICAgICAgaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIGkpICE9IDB4YWEpIHJldHVybiAxCisKKy8qIFRoaXMgbWVtdGVzdCB0YWtlcyBhIGh1bWFuLW5vdGljYWJsZSB0aW1lLiBZb3Ugbm9ybWFsbHkgb25seSBkbyBpdAorICAgb25jZSBhIGJvb3QsIHNvIEkgZ3Vlc3MgdGhhdCBpdCBpcyB3b3J0aCBpdC4gKi8KK3N0YXRpYyBpbnQgZG9fbWVtdGVzdCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG1pbiwgaW50IG1heCkKK3sKKwlpbnQgaTsKKworCS8qIFRoaXMgaXMgYSBtYXJjaGIuIFRoZW9yZXRpY2FsbHksIG1hcmNoYiBjYXRjaGVzIG11Y2ggbW9yZSB0aGFuCisJICAgc2ltcGxlciB0ZXN0cy4gSW4gcHJhY3Rpc2UsIHRoZSBsb25nZXIgdGVzdCBqdXN0IGNhdGNoZXMgbW9yZQorCSAgIGludGVybWl0dGVudCBlcnJvcnMuIC0tIFJFVworCSAgIChGb3IgdGhlIHRoZW9yeSBiZWhpbmQgbWVtb3J5IHRlc3Rpbmcgc2VlOiAKKwkgICBUZXN0aW5nIFNlbWljb25kdWN0b3IgTWVtb3JpZXMgYnkgQS5KLiB2YW4gZGUgR29vci4pICovCisJTUFSQ0hVUAkge1cwO30KKwlNQVJDSFVQICAge1IwO1cxO1IxO1cwO1IwO1cxO30KKwlNQVJDSFVQICAge1IxO1cwO1cxO30KKwlNQVJDSERPV04ge1IxO1cwO1cxO1cwO30KKwlNQVJDSERPV04ge1IwO1cxO1cwO30KKworCXJldHVybiAwOworfQorCisKKyN1bmRlZiBNQVJDSFVQCisjdW5kZWYgTUFSQ0hET1dOCisjdW5kZWYgVzAKKyN1bmRlZiBXMQorI3VuZGVmIFIwCisjdW5kZWYgUjEKKworI2RlZmluZSBNQVJDSFVQICAgIGZvciAoaT1taW47aTxtYXg7aSs9MikgCisjZGVmaW5lIE1BUkNIRE9XTiAgZm9yIChpPW1heC0xO2k+PW1pbjtpLT0yKQorI2RlZmluZSBXMCAgICAgICAgIHdyaXRlX3N4X3dvcmQgKGJvYXJkLCBpLCAweDU1YWEpCisjZGVmaW5lIFcxICAgICAgICAgd3JpdGVfc3hfd29yZCAoYm9hcmQsIGksIDB4YWE1NSkKKyNkZWZpbmUgUjAgICAgICAgICBpZiAocmVhZF9zeF93b3JkIChib2FyZCwgaSkgIT0gMHg1NWFhKSByZXR1cm4gMQorI2RlZmluZSBSMSAgICAgICAgIGlmIChyZWFkX3N4X3dvcmQgKGJvYXJkLCBpKSAhPSAweGFhNTUpIHJldHVybiAxCisKKyNpZiAwCisvKiBUaGlzIG1lbXRlc3QgdGFrZXMgYSBodW1hbi1ub3RpY2FibGUgdGltZS4gWW91IG5vcm1hbGx5IG9ubHkgZG8gaXQKKyAgIG9uY2UgYSBib290LCBzbyBJIGd1ZXNzIHRoYXQgaXQgaXMgd29ydGggaXQuICovCitzdGF0aWMgaW50IGRvX21lbXRlc3RfdyAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG1pbiwgaW50IG1heCkKK3sKKwlpbnQgaTsKKworCU1BUkNIVVAgICB7VzA7fQorCU1BUkNIVVAgICB7UjA7VzE7UjE7VzA7UjA7VzE7fQorCU1BUkNIVVAgICB7UjE7VzA7VzE7fQorCU1BUkNIRE9XTiB7UjE7VzA7VzE7VzA7fQorCU1BUkNIRE9XTiB7UjA7VzE7VzA7fQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IHN4X2Z3X2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYyA9IDA7CisJaW50IF9fdXNlciAqZGVzY3IgPSAoaW50IF9fdXNlciAqKWFyZzsKKwlpbnQgaTsKKwlzdGF0aWMgc3RydWN0IHN4X2JvYXJkICpib2FyZCA9IE5VTEw7CisJaW50IG5ieXRlcywgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwljaGFyICp0bXA7CisKKwlmdW5jX2VudGVyKCk7CisKKyNpZiAwIAorCS8qIFJlbW92ZWQgc3VwZXJ1c2VyIGNoZWNrOiBTeXNvcHMgY2FuIHVzZSB0aGUgcGVybWlzc2lvbnMgb24gdGhlIGRldmljZQorCSAgIGZpbGUgdG8gcmVzdHJpY3QgYWNjZXNzLiBSZWNvbW1lbmRhdGlvbjogUm9vdCBvbmx5LiAocm9vdC5yb290IDYwMCkgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisjZW5kaWYKKworCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiSU9DVEwgJXg6ICVseFxuIiwgY21kLCBhcmcpOworCisJaWYgKCFib2FyZCkgYm9hcmQgPSAmYm9hcmRzWzBdOworCWlmIChib2FyZC0+ZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSB7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiQm9hcmQgcHJlc2VudCEgKCV4KVxuIiwgCisJCSAgICAgICAgICAgIGJvYXJkLT5mbGFncyk7CisJfSBlbHNlIHsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJCb2FyZCBub3QgcHJlc2VudCEgKCV4KSBhbGw6IiwgCisJCSAgICAgICAgICAgIGJvYXJkLT5mbGFncyk7CisJCWZvciAoaT0wO2k8IFNYX05CT0FSRFM7aSsrKQorCQkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICI8JXg+ICIsIGJvYXJkc1tpXS5mbGFncyk7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNYSU9fU0VUX0JPQVJEOgorCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgInNldCBib2FyZCB0byAlbGRcbiIsIGFyZyk7CisJCWlmIChhcmcgPj0gU1hfTkJPQVJEUykgcmV0dXJuIC1FSU87CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAibm90IG91dCBvZiByYW5nZVxuIik7CisJCWlmICghKGJvYXJkc1thcmddLmZsYWdzCSYgU1hfQk9BUkRfUFJFU0VOVCkpIHJldHVybiAtRUlPOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIi4uIGFuZCBwcmVzZW50IVxuIik7CisJCWJvYXJkID0gJmJvYXJkc1thcmddOworCQlicmVhazsKKwljYXNlIFNYSU9fR0VUX1RZUEU6CisJCXJjID0gLUVOT0VOVDsgLyogSWYgd2UgbWFuYWdlIHRvIG1pc3Mgb25lLCByZXR1cm4gZXJyb3IuICovCisJCWlmIChJU19TWF9CT0FSRCAoYm9hcmQpKSByYyA9IFNYX1RZUEVfU1g7CisJCWlmIChJU19DRl9CT0FSRCAoYm9hcmQpKSByYyA9IFNYX1RZUEVfQ0Y7CisJCWlmIChJU19TSV9CT0FSRCAoYm9hcmQpKSByYyA9IFNYX1RZUEVfU0k7CisJCWlmIChJU19TSTFfQk9BUkQgKGJvYXJkKSkgcmMgPSBTWF9UWVBFX1NJOworCQlpZiAoSVNfRUlTQV9CT0FSRCAoYm9hcmQpKSByYyA9IFNYX1RZUEVfU0k7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAicmV0dXJuaW5nIHR5cGU9ICVkXG4iLCByYyk7CisJCWJyZWFrOworCWNhc2UgU1hJT19ET19SQU1URVNUOgorCQlpZiAoc3hfaW5pdGlhbGl6ZWQpIC8qIEFscmVhZHkgaW5pdGlhbGl6ZWQ6IGJldHRlciBub3QgcmFtdGVzdCB0aGUgYm9hcmQuICAqLworCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKElTX1NYX0JPQVJEIChib2FyZCkpIHsKKwkJCXJjICAgICAgICAgID0gZG9fbWVtdGVzdCAgIChib2FyZCwgMCwgMHg3MDAwKTsKKwkJCWlmICghcmMpIHJjID0gZG9fbWVtdGVzdCAgIChib2FyZCwgMCwgMHg3MDAwKTsKKwkJCS8qaWYgKCFyYykgcmMgPSBkb19tZW10ZXN0X3cgKGJvYXJkLCAwLCAweDcwMDApOyovCisJCX0gZWxzZSB7CisJCQlyYyAgICAgICAgICAgICA9IGRvX21lbXRlc3QgICAoYm9hcmQsIDAsIDB4N2ZmOCk7CisJCQkvKiBpZiAoIXJjKSByYyA9IGRvX21lbXRlc3RfdyAoYm9hcmQsIDAsIDB4N2ZmOCk7ICovCisJCX0KKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJyZXR1cm5pbmcgbWVtdGVzdCByZXN1bHQ9ICVkXG4iLCByYyk7CisJCWJyZWFrOworCWNhc2UgU1hJT19ET1dOTE9BRDoKKwkJaWYgKHN4X2luaXRpYWxpemVkKSAvKiBBbHJlYWR5IGluaXRpYWxpemVkICovCisJCQlyZXR1cm4gLUVFWElTVDsKKwkJaWYgKCFzeF9yZXNldCAoYm9hcmQpKSAKKwkJCXJldHVybiAtRUlPOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAicmVzZXQgdGhlIGJvYXJkLi4uXG4iKTsKKworCQl0bXAgPSBrbWFsbG9jIChTWF9DSFVOS19TSVpFLCBHRlBfVVNFUik7CisJCWlmICghdG1wKSByZXR1cm4gLUVOT01FTTsKKwkJZ2V0X3VzZXIgKG5ieXRlcywgZGVzY3IrKyk7CisJCWdldF91c2VyIChvZmZzZXQsIGRlc2NyKyspOyAKKwkJZ2V0X3VzZXIgKGRhdGEsCSBkZXNjcisrKTsKKwkJd2hpbGUgKG5ieXRlcyAmJiBkYXRhKSB7CisJCQlmb3IgKGk9MDtpPG5ieXRlcztpICs9IFNYX0NIVU5LX1NJWkUpIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLCAoY2hhciBfX3VzZXIgKilkYXRhK2ksIAorCQkJCQkJICAgKGkgKyBTWF9DSFVOS19TSVpFID4KKwkJCQkJCSAgICBuYnl0ZXMpID8gbmJ5dGVzIC0gaSA6CisJCQkJCQkgICAJICAgICAgU1hfQ0hVTktfU0laRSkpIHsKKwkJCQkJa2ZyZWUgKHRtcCk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQltZW1jcHlfdG9pbyhib2FyZC0+YmFzZTIgKyBvZmZzZXQgKyBpLCB0bXAsIAorCQkJCSAgICAgICAgICAgICAgICAoaStTWF9DSFVOS19TSVpFPm5ieXRlcyk/bmJ5dGVzLWk6U1hfQ0hVTktfU0laRSk7CisJCQl9CisKKwkJCWdldF91c2VyIChuYnl0ZXMsIGRlc2NyKyspOworCQkJZ2V0X3VzZXIgKG9mZnNldCwgZGVzY3IrKyk7IAorCQkJZ2V0X3VzZXIgKGRhdGEsICAgZGVzY3IrKyk7CisJCX0KKwkJa2ZyZWUgKHRtcCk7CisJCXN4X25wb3J0cyArPSBzeF9pbml0X2JvYXJkIChib2FyZCk7CisJCXJjID0gc3hfbnBvcnRzOworCQlicmVhazsKKwljYXNlIFNYSU9fSU5JVDoKKwkJaWYgKHN4X2luaXRpYWxpemVkKSAvKiBBbHJlYWR5IGluaXRpYWxpemVkICovCisJCQlyZXR1cm4gLUVFWElTVDsKKwkJLyogVGhpcyBpcyBub3QgYWxsb3dlZCB1bnRpbCBhbGwgYm9hcmRzIGFyZSBpbml0aWFsaXplZC4uLiAqLworCQlmb3IgKGk9MDtpPFNYX05CT0FSRFM7aSsrKSB7CisJCQlpZiAoIChib2FyZHNbaV0uZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSAmJgorCQkJICAgICAhKGJvYXJkc1tpXS5mbGFncyAmIFNYX0JPQVJEX0lOSVRJQUxJWkVEKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlmb3IgKGk9MDtpPFNYX05CT0FSRFM7aSsrKQorCQkJaWYgKCEoYm9hcmRzW2ldLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkpIGJyZWFrOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiaW5pdGluZyBwb3J0c3RydWN0cywgJWQgYm9hcmRzLCAiCisJCSAgICAgICAgICAgICIlZCBjaGFubmVscywgZmlyc3QgYm9hcmQ6ICVkIHBvcnRzXG4iLCAKKwkJICAgICAgICAgICAgaSwgc3hfbnBvcnRzLCBib2FyZHNbMF0ubnBvcnRzKTsKKwkJcmMgPSBzeF9pbml0X3BvcnRzdHJ1Y3RzIChpLCBzeF9ucG9ydHMpOworCQlzeF9pbml0X2RyaXZlcnMgKCk7CisJCWlmIChyYyA+PSAwKSAKKwkJCXN4X2luaXRpYWxpemVkKys7CisJCWJyZWFrOworCWNhc2UgU1hJT19TRVRERUJVRzoKKwkJc3hfZGVidWcgPSBhcmc7CisJCWJyZWFrOworCWNhc2UgU1hJT19HRVRERUJVRzoKKwkJcmMgPSBzeF9kZWJ1ZzsKKwkJYnJlYWs7CisJY2FzZSBTWElPX0dFVEdTREVCVUc6CisJY2FzZSBTWElPX1NFVEdTREVCVUc6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBTWElPX0dFVE5QT1JUUzoKKwkJcmMgPSBzeF9ucG9ydHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJVbmtub3duIGlvY3RsIG9uIGZpcm13YXJlIGRldmljZSAoJXgpLlxuIiwgY21kKTsKKwkJYnJlYWs7CisJfQorCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgc3hfYnJlYWsgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJ2OworCisJZnVuY19lbnRlciAoKTsKKworCWlmIChmbGFnKSAKKwkJcnYgPSBzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX1NUQVJULCAtMSwgSFNfSURMRV9CUkVBSyk7CisJZWxzZSAKKwkJcnYgPSBzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX1NUT1AsIC0xLCBIU19JRExFX09QRU4pOworCWlmIChydiAhPSAxKSBwcmludGsgKEtFUk5fRVJSICJzeDogY291bGRuJ3Qgc2VuZCBicmVhayAoJXgpLlxuIiwKKwkJCXJlYWRfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBoaV9oc3RhdCkpKTsKKworCWZ1bmNfZXhpdCAoKTsKK30KKworCitzdGF0aWMgaW50IHN4X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gc3hfZ2V0c2lnbmFscyhwb3J0KTsKK30KKworc3RhdGljIGludCBzeF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJ0cyA9IC0xLCBkdHIgPSAtMTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCXJ0cyA9IDE7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJZHRyID0gMTsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXJ0cyA9IDA7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlkdHIgPSAwOworCisJc3hfc2V0c2lnbmFscyhwb3J0LCBkdHIsIHJ0cyk7CisJc3hfcmVjb25maWd1cmVfcG9ydChwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeF9pb2N0bCAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwgCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBpdmFsOworCisJLyogZnVuY19lbnRlcjIoKTsgKi8KKworCXJjID0gMDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyYyA9IHB1dF91c2VyKCgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSA/IDEgOiAwKSwKKwkJICAgICAgICAgICAgICAodW5zaWduZWQgX191c2VyICopIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJncCkpID09IDApIHsKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkJKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCQkoaXZhbCA/IENMT0NBTCA6IDApOworCQl9CisJCWJyZWFrOworCWNhc2UgVElPQ0dTRVJJQUw6CisJCXJjID0gZ3NfZ2V0c2VyaWFsKCZwb3J0LT5ncywgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJjID0gZ3Nfc2V0c2VyaWFsKCZwb3J0LT5ncywgYXJncCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwkvKiBmdW5jX2V4aXQoKTsgKi8KKwlyZXR1cm4gcmM7Cit9CisKKworLyogVGhlIHRocm90dGxlL3VudGhyb3R0bGUgc2NoZW1lIGZvciB0aGUgU3BlY2lhbGl4IGNhcmQgaXMgZGlmZmVyZW50CisgKiBmcm9tIG90aGVyIGRyaXZlcnMgYW5kIGRlc2VydmVzIHNvbWUgZXhwbGFuYXRpb24uIAorICogVGhlIFNwZWNpYWxpeCBoYXJkd2FyZSB0YWtlcyBjYXJlIG9mIFhPTi9YT0ZGCisgKiBhbmQgQ1RTL1JUUyBmbG93IGNvbnRyb2wgaXRzZWxmLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB3ZSBoYXZlIHRvCisgKiBkbyB3aGVuIHNpZ25hbGxlZCBieSB0aGUgdXBwZXIgdHR5IGxheWVyIHRvIHRocm90dGxlL3VudGhyb3R0bGUgaXMKKyAqIHRvIG1ha2UgYSBub3RlIG9mIGl0IGhlcmUuICBXaGVuIHdlIGNvbWUgdG8gcmVhZCBjaGFyYWN0ZXJzIGZyb20gdGhlCisgKiByeCBidWZmZXJzIG9uIHRoZSBjYXJkIChzeF9yZWNlaXZlX2NoYXJzKCkpIHdlIGxvb2sgdG8gc2VlIGlmIHRoZQorICogdXBwZXIgbGF5ZXIgY2FuIGFjY2VwdCBtb3JlIChhcyBub3RlZCBoZXJlIGluIHN4X3J4X3Rocm90W10pLiAKKyAqIElmIGl0IGNhbid0IHdlIHNpbXBseSBkb24ndCByZW1vdmUgY2hhcnMgZnJvbSB0aGUgY2FyZHMgYnVmZmVyLiAKKyAqIFdoZW4gdGhlIHR0eSBsYXllciBjYW4gYWNjZXB0IGNoYXJzLCB3ZSBhZ2FpbiBub3RlIHRoYXQgaGVyZSBhbmQgd2hlbgorICogc3hfcmVjZWl2ZV9jaGFycygpIGlzIGNhbGxlZCBpdCB3aWxsIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNhcmRzIGJ1ZmZlci4KKyAqIFRoZSBjYXJkIHdpbGwgbm90aWNlIHRoYXQgYSBwb3J0cyBidWZmZXIgaGFzIGRyYWluZWQgYmVsb3cgc29tZSBsb3cKKyAqIHdhdGVyIG1hcmsgYW5kIHdpbGwgdW5mbG93IGNvbnRyb2wgdGhlIGxpbmUgaXRzZWxmLCB1c2luZyB3aGF0ZXZlcgorICogZmxvdyBjb250cm9sIHNjaGVtZSBpcyBpbiB1c2UgZm9yIHRoYXQgcG9ydC4gLS0gU2ltb24gQWxsZW4KKyAqLworCitzdGF0aWMgdm9pZCBzeF90aHJvdHRsZSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHN4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisJZnVuY19lbnRlcjIoKTsKKwkvKiBJZiB0aGUgcG9ydCBpcyB1c2luZyBhbnkgdHlwZSBvZiBpbnB1dCBmbG93CisJICogY29udHJvbCB0aGVuIHRocm90dGxlIHRoZSBwb3J0LgorCSAqLworCWlmKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fCAoSV9JWE9GRih0dHkpKSApIHsKKwkJcG9ydC0+Z3MuZmxhZ3MgfD0gU1hfUlhfVEhST1RUTEU7CisJfQorCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3VudGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCWZ1bmNfZW50ZXIyKCk7CisJLyogQWx3YXlzIHVudGhyb3R0bGUgZXZlbiBpZiBmbG93IGNvbnRyb2wgaXMgbm90IGVuYWJsZWQgb24KKwkgKiB0aGlzIHBvcnQgaW4gY2FzZSB3ZSBkaXNhYmxlZCBmbG93IGNvbnRyb2wgd2hpbGUgdGhlIHBvcnQKKwkgKiB3YXMgdGhyb3R0bGVkCisJICovCisJcG9ydC0+Z3MuZmxhZ3MgJj0gflNYX1JYX1RIUk9UVExFOworCWZ1bmNfZXhpdCgpOworCXJldHVybjsKK30KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyAqICAgICAgICAgICAgICAgICAgICBIZXJlIGFyZSB0aGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMuICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKworCitzdGF0aWMgaW50IHN4X2luaXRfYm9hcmQgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCit7CisJaW50IGFkZHI7CisJaW50IGNoYW5zOworCWludCB0eXBlOworCisJZnVuY19lbnRlcigpOworCisJLyogVGhpcyBpcyBwcmVjZWRlZCBieSBkb3dubG9hZGluZyB0aGUgZG93bmxvYWQgY29kZS4gKi8KKworCWJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9JTklUSUFMSVpFRDsKKworCWlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCAwKSkKKwkJLyogQ0YgYm9hcmRzIG1heSBuZWVkIHRoaXMuICovCisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsMCwgMCk7CisKKwkvKiBUaGlzIHJlc2V0cyB0aGUgcHJvY2Vzc29yIGFnYWluLCB0byBtYWtlIHN1cmUgaXQgZGlkbid0IGRvIGFueQorCSAgIGZvb2xpc2ggdGhpbmdzIHdoaWxlIHdlIHdlcmUgZG93bmxvYWRpbmcgdGhlIGltYWdlICovCisJaWYgKCFzeF9yZXNldCAoYm9hcmQpKQorCQlyZXR1cm4gMDsKKworCXN4X3N0YXJ0X2JvYXJkIChib2FyZCk7CisJdWRlbGF5ICgxMCk7CisJaWYgKCFzeF9idXN5X3dhaXRfbmVxIChib2FyZCwgMCwgMHhmZiwgMCkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAic3g6IE9vb3BzLiBCb2FyZCB3b24ndCBpbml0aWFsaXplLlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIE9rLiBTbyBub3cgdGhlIHByb2Nlc3NvciBvbiB0aGUgY2FyZCBpcyBydW5uaW5nLiBJdCBnYXRoZXJlZAorCSAgIHNvbWUgaW5mbyBmb3IgdXMuLi4gKi8KKwlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiVGhlIHN4Y2FyZCBzdHJ1Y3R1cmU6XG4iKTsKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19JTklUKSBteV9oZF9pbyAoYm9hcmQtPmJhc2UsIDB4MTApOworCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJ0aGUgZmlyc3Qgc3hfbW9kdWxlIHN0cnVjdHVyZTpcbiIpOworCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX0lOSVQpIG15X2hkX2lvIChib2FyZC0+YmFzZSArIDB4ODAsIDB4MzApOworCisJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgCisJICAgICAgICAgICAgImluaXRfc3RhdHVzOiAleCwgJWRrIG1lbW9yeSwgZmlybXdhcmUgViV4LiUwMngsXG4iLCAKKwkgICAgICAgICAgICByZWFkX3N4X2J5dGUgKGJvYXJkLCAwKSwgcmVhZF9zeF9ieXRlKGJvYXJkLCAxKSwgCisJICAgICAgICAgICAgcmVhZF9zeF9ieXRlIChib2FyZCwgNSksIHJlYWRfc3hfYnl0ZShib2FyZCwgNCkpOworCisJaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIDApID09IDB4ZmYpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBObyBtb2R1bGVzIGZvdW5kLiBTb3JyeS5cbiIpOworCQlib2FyZC0+bnBvcnRzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJY2hhbnMgPSAwOworCisJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkgeworCQlzeF93cml0ZV9ib2FyZF93b3JkIChib2FyZCwgY2NfaW50X2NvdW50LCBzeF9tYXhpbnRzKTsKKwl9IGVsc2UgeworCQlpZiAoc3hfbWF4aW50cykKKwkJCXN4X3dyaXRlX2JvYXJkX3dvcmQgKGJvYXJkLCBjY19pbnRfY291bnQsIFNJX1BST0NFU1NPUl9DTE9DSy84L3N4X21heGludHMpOworCX0KKworCS8qIGdyYWIgdGhlIGZpcnN0IG1vZHVsZSB0eXBlLi4uICovCisJLyogIGJvYXJkLT50YV90eXBlID0gbW9kX2NvbXBhdF90eXBlIChyZWFkX3N4X2J5dGUgKGJvYXJkLCAweDgwICsgMHgwOCkpOyAqLworCWJvYXJkLT50YV90eXBlID0gbW9kX2NvbXBhdF90eXBlIChzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgMHg4MCwgbWNfY2hpcCkpOworCisJLyogWFhYIGJ5dGVvcmRlciAqLworCWZvciAoYWRkciA9IDB4ODA7YWRkciAhPSAwO2FkZHIgPSByZWFkX3N4X3dvcmQgKGJvYXJkLCBhZGRyKSAmIDB4N2ZmZikgeworCQl0eXBlID0gc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX2NoaXApOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiTW9kdWxlIGF0ICV4OiAlZCBjaGFubmVsc1xuIiwgCisJCSAgICAgICAgICAgIGFkZHIsIHJlYWRfc3hfYnl0ZSAoYm9hcmQsIGFkZHIgKyAyKSk7CisKKwkJY2hhbnMgKz0gc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX3R5cGUpOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJtb2R1bGUgaXMgYW4gJXMsIHdoaWNoIGhhcyAlcy8lcyBwYW5lbHNcbiIsIAorCQkgICAgICAgICAgICBtb2RfdHlwZV9zICh0eXBlKSwKKwkJICAgICAgICAgICAgcGFuX3R5cGVfcyAoc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX21vZHMpICYgMHhmKSwKKwkJICAgICAgICAgICAgcGFuX3R5cGVfcyAoc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX21vZHMpID4+IDQpKTsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiQ0QxNDAwIHZlcnNpb25zOiAleC8leCwgQVNJQyB2ZXJzaW9uOiAleFxuIiwgCisJCSAgICAgICAgICAgIHN4X3JlYWRfbW9kdWxlX2J5dGUgKGJvYXJkLCBhZGRyLCBtY19yZXYxKSwKKwkJICAgICAgICAgICAgc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX3JldjIpLAorCQkgICAgICAgICAgICBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfbXRhYXNpY19yZXYpKTsKKworCQkvKiBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBhcmUgaWxsZWdhbDogSXQgc2hvdWxkIHRoZW9yZXRpY2FsbHkKKwkJICAgd29yaywgYnV0IHRpbWluZyBwcm9ibGVtcyBtYWtlIHRoZSBidXMgSEFORy4gKi8KKworCQlpZiAobW9kX2NvbXBhdF90eXBlICh0eXBlKSAhPSBib2FyZC0+dGFfdHlwZSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAic3g6IFRoaXMgaXMgYW4gaW52YWxpZCBjb25maWd1cmF0aW9uLlxuIgorCQkJICAgICAgICAiRG9uJ3QgbWl4IFRBL01UQS9TWERDIG9uIHRoZSBzYW1lIGhvc3RhZGFwdGVyLlxuIik7CisJCQljaGFucz0wOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChJU19FSVNBX0JPQVJEKGJvYXJkKSB8fCAKKwkJICAgICBJU19TSV9CT0FSRChib2FyZCkpICYmIChtb2RfY29tcGF0X3R5cGUodHlwZSkgPT0gNCkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgInN4OiBUaGlzIGlzIGFuIGludmFsaWQgY29uZmlndXJhdGlvbi5cbiIKKwkJCSAgICAgICAgIkRvbid0IHVzZSBTWERDcyBvbiBhbiBTSS9YSU8gYWRhcHRlci5cbiIpOworCQkJY2hhbnM9MDsKKwkJCWJyZWFrOworCQl9CisjaWYgMCAvKiBQcm9ibGVtIGZpeGVkOiBmaXJtd2FyZSAzLjA1ICovCisJCWlmIChJU19TWF9CT0FSRChib2FyZCkgJiYgKHR5cGUgPT0gVEE4KSkgeworCQkJLyogVGhlcmUgYXJlIHNvbWUgaXNzdWVzIHdpdGggdGhlIGZpcm13YXJlIGFuZCB0aGUgRENEL1JUUworCQkJICAgbGluZXMuIEl0IG1pZ2h0IHdvcmsgaWYgeW91IHRpZSB0aGVtIHRvZ2V0aGVyIG9yIHNvbWV0aGluZy4KKwkJCSAgIEl0IG1pZ2h0IGFsc28gd29yayBpZiB5b3UgZ2V0IGEgbmV3ZXIgc3hfZmlybXdhcmUuCVRoZXJlZm9yZQorCQkJICAgdGhpcyBpcyBqdXN0IGEgd2FybmluZy4gKi8KKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzeDogVGhlIFNYIGhvc3QgZG9lc24ndCB3b3JrIHRvbyB3ZWxsICIKKwkJCSAgICAgICAgIndpdGggdGhlIFRBOCBhZGFwdGVycy5cblNwZWNpYWxpeCBpcyB3b3JraW5nIG9uIGl0LlxuIik7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChjaGFucykgeworCQkvKiBib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsgKi8KKwkJaWYoYm9hcmQtPmlycSA+IDApIHsKKwkJCS8qIGZpeGVkIGlycSwgcHJvYmFibHkgUENJICovCisJCQlpZihzeF9pcnFtYXNrICYgKDEgPDwgYm9hcmQtPmlycSkpIHsgLyogbWF5IHdlIHVzZSB0aGlzIGlycT8gKi8KKwkJCQlpZihyZXF1ZXN0X2lycShib2FyZC0+aXJxLCBzeF9pbnRlcnJ1cHQsIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULCAic3giLCBib2FyZCkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJzeDogQ2Fubm90IGFsbG9jYXRlIGlycSAlZC5cbiIsIGJvYXJkLT5pcnEpOworCQkJCQlib2FyZC0+aXJxID0gMDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlib2FyZC0+aXJxID0gMDsKKwkJfSBlbHNlIGlmKGJvYXJkLT5pcnEgPCAwICYmIHN4X2lycW1hc2spIHsKKwkJCS8qIGF1dG8tYWxsb2NhdGUgaXJxICovCisJCQlpbnQgaXJxbnI7CisJCQlpbnQgaXJxbWFzayA9IHN4X2lycW1hc2sgJiAoSVNfU1hfQk9BUkQoYm9hcmQpID8gU1hfSVNBX0lSUV9NQVNLIDogU0kyX0lTQV9JUlFfTUFTSyk7CisJCQlmb3IoaXJxbnIgPSAxNTsgaXJxbnIgPiAwOyBpcnFuci0tKQorCQkJCWlmKGlycW1hc2sgJiAoMSA8PCBpcnFucikpCisJCQkJCWlmKCEgcmVxdWVzdF9pcnEoaXJxbnIsIHN4X2ludGVycnVwdCwgU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQsICJzeCIsIGJvYXJkKSkKKwkJCQkJCWJyZWFrOworCQkJaWYoISBpcnFucikKKwkJCQlwcmludGsoS0VSTl9FUlIgInN4OiBDYW5ub3QgYWxsb2NhdGUgSVJRLlxuIik7CisJCQlib2FyZC0+aXJxID0gaXJxbnI7CisJCX0gZWxzZQorCQkJYm9hcmQtPmlycSA9IDA7CisKKwkJaWYgKGJvYXJkLT5pcnEpIHsKKwkJCS8qIEZvdW5kIGEgdmFsaWQgaW50ZXJydXB0LCBzdGFydCB1cCBpbnRlcnJ1cHRzISAqLworCQkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlVzaW5nIGlycSAlZC5cbiIsIGJvYXJkLT5pcnEpOworCQkJc3hfc3RhcnRfaW50ZXJydXB0cyAoYm9hcmQpOworCQkJYm9hcmQtPnBvbGwgPSBzeF9zbG93cG9sbDsKKwkJCWJvYXJkLT5mbGFncyB8PSBTWF9JUlFfQUxMT0NBVEVEOworCQl9IGVsc2UgeworCQkJLyogbm8gaXJxOiBzZXR1cCBib2FyZCBmb3IgcG9sbGVkIG9wZXJhdGlvbiAqLworCQkJYm9hcmQtPnBvbGwgPSBzeF9wb2xsOworCQkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlVzaW5nIHBvbGwtaW50ZXJ2YWwgJWQuXG4iLCBib2FyZC0+cG9sbCk7CisJCX0KKworCQkvKiBUaGUgdGltZXIgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFueXdheTogVGhhdCB3YXkgd2UgY2FuIHNhZmVseQorCQkJIGRlbF90aW1lciBpdCB3aGVuIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQuICovCisJCWluaXRfdGltZXIgKCZib2FyZC0+dGltZXIpOworCisJCWlmIChib2FyZC0+cG9sbCkgeworCQkJYm9hcmQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYm9hcmQ7CisJCQlib2FyZC0+dGltZXIuZnVuY3Rpb24gPSBzeF9wb2xsZnVuYzsKKwkJCWJvYXJkLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGJvYXJkLT5wb2xsOworCQkJYWRkX3RpbWVyICgmYm9hcmQtPnRpbWVyKTsKKwkJfQorCX0gZWxzZSB7CisJCWJvYXJkLT5pcnEgPSAwOworCX0KKworCWJvYXJkLT5ucG9ydHMgPSBjaGFuczsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAicmV0dXJuaW5nICVkIHBvcnRzLiIsIGJvYXJkLT5ucG9ydHMpOworCisJZnVuY19leGl0KCk7CisJcmV0dXJuIGNoYW5zOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50aGVhZGVyKHZvaWQpCit7CisJc3RhdGljIGludCBoZWFkZXJfcHJpbnRlZDsKKworCWlmICghaGVhZGVyX3ByaW50ZWQpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIlNwZWNpYWxpeCBTWCBkcml2ZXIgIgorCQkgICAgICAgICIoQykgMTk5OC8xOTk5IFIuRS5Xb2xmZkBCaXRXaXphcmQubmwgXG4iKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gInN4OiB2ZXJzaW9uICVzXG4iLCBSQ1NfSUQpOworCQloZWFkZXJfcHJpbnRlZCA9IDE7CisJfQorfQorCisKK3N0YXRpYyBpbnQgcHJvYmVfc3ggKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCit7CisJc3RydWN0IHZwZF9wcm9tIHZwZHA7CisJY2hhciAqcDsKKwlpbnQgaTsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmICghSVNfQ0ZfQk9BUkQgKGJvYXJkKSkgeyAgICAKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJHb2luZyB0byB2ZXJpZnkgdnBkIHByb20gYXQgJXAuXG4iLCAKKwkJICAgICAgICAgICAgYm9hcmQtPmJhc2UgKyBTWF9WUERfUk9NKTsKKworCQlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19QUk9CRSkKKwkJCW15X2hkX2lvKGJvYXJkLT5iYXNlICsgU1hfVlBEX1JPTSwgMHg0MCk7CisKKwkJcCA9IChjaGFyICopICZ2cGRwOworCQlmb3IgKGk9MDtpPCBzaXplb2YgKHN0cnVjdCB2cGRfcHJvbSk7aSsrKQorCQkJKnArKyA9IHJlYWRfc3hfYnl0ZSAoYm9hcmQsIFNYX1ZQRF9ST00gKyBpKjIpOworCisJCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX1BST0JFKQorCQkJbXlfaGQgKCZ2cGRwLCAweDIwKTsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgImNoZWNraW5nIGlkZW50aWZpZXIuLi5cbiIpOworCisJCWlmIChzdHJuY21wICh2cGRwLmlkZW50aWZpZXIsIFNYX1ZQRF9JREVOVF9TVFJJTkcsIDE2KSAhPSAwKSB7CisJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIkdvdCBub24tU1ggaWRlbnRpZmllcjogJyVzJ1xuIiwgCisJCQkgICAgICAgICAgICB2cGRwLmlkZW50aWZpZXIpOyAKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcHJpbnRoZWFkZXIgKCk7CisKKwlpZiAoIUlTX0NGX0JPQVJEIChib2FyZCkpIHsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJzeDogRm91bmQgYW4gU1ggYm9hcmQgYXQgJWx4XG4iLCBib2FyZC0+aHdfYmFzZSk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAic3g6IGh3X3JldjogJWQsIGFzc2VtYmx5IGxldmVsOiAlZCwgdW5pcSBJRDolMDh4LCAiLCAKKwkJICAgICAgICB2cGRwLmh3cmV2LCB2cGRwLmh3YXNzLCB2cGRwLnVuaXFpZCk7CisJCXByaW50ayAoICAgICAgICAgICAiTWFudWZhY3R1cmVkOiAlZC8lZFxuIiwgCisJCSAgICAgICAgMTk3MCArIHZwZHAubXllYXIsIHZwZHAubXdlZWspOworCisKKwkJaWYgKCgoKHZwZHAudW5pcWlkID4+IDI0KSAmIFNYX1VOSVFVRUlEX01BU0spICE9IFNYX1BDSV9VTklRVUVJRDEpICYmCisJCSAgICAoKCh2cGRwLnVuaXFpZCA+PiAyNCkgJiBTWF9VTklRVUVJRF9NQVNLKSAhPSBTWF9JU0FfVU5JUVVFSUQxKSkgeworCQkJLyogVGhpcyBtaWdodCBiZSBhIGJpdCBoYXJzaC4gVGhpcyB3YXMgdGhlIHByaW1hcnkgcmVhc29uIHRoZQorCQkJICAgU1gvSVNBIGNhcmQgZGlkbid0IHdvcmsgYXQgZmlyc3QuLi4gKi8KKwkJCXByaW50ayAoS0VSTl9FUlIgInN4OiBIbW0uIE5vdCBhbiBTWC9QQ0kgb3IgU1gvSVNBIGNhcmQuIFNvcnJ5OiBnaXZpbmcgdXAuXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQlpZiAoKCh2cGRwLnVuaXFpZCA+PiAyNCkgJiBTWF9VTklRVUVJRF9NQVNLKSA9PSBTWF9JU0FfVU5JUVVFSUQxKSB7CisJCQlpZiAoKCh1bnNpZ25lZCBsb25nKWJvYXJkLT5od19iYXNlKSAmIDB4ODAwMCkgeworCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzeDogV2FybmluZzogVGhlcmUgbWF5IGJlIGhhcmR3YXJlIHByb2JsZW1zIHdpdGggdGhlIGNhcmQgYXQgJWx4LlxuIiwgYm9hcmQtPmh3X2Jhc2UpOworCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzeDogUmVhZCBzeC50eHQgZm9yIG1vcmUgaW5mby5cbiIpOworCQkJfQorCQl9CisJfQorCisJYm9hcmQtPm5wb3J0cyA9IC0xOworCisJLyogVGhpcyByZXNldHMgdGhlIHByb2Nlc3NvciwgYW5kIGtlZXBzIGl0IG9mZiB0aGUgYnVzLiAqLworCWlmICghc3hfcmVzZXQgKGJvYXJkKSkgCisJCXJldHVybiAwOworCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJyZXNldCB0aGUgYm9hcmQuLi5cbiIpOworCisJYm9hcmQtPmZsYWdzIHw9IFNYX0JPQVJEX1BSRVNFTlQ7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMTsKK30KKworCisKKy8qIFNwZWNpYWxpeCBwcm9iZXMgZm9yIHRoaXMgY2FyZCBhdCAzMmsgaW5jcmVtZW50cyBmcm9tIDY0MGsgdG8gMTZNLgorICAgSSBjb25zaWRlciBtYWNoaW5lcyB3aXRoIGxlc3MgdGhhbiAxNk0gdW5saWtlbHkgbm93YWRheXMsIHNvIEknbQorICAgbm90IHByb2JpbmcgYWJvdmUgMU1iLiBBbHNvLCAweGEwMDAwLCAweGIwMDAwLCBhcmUgdGFrZW4gYnkgdGhlIFZHQQorICAgY2FyZC4gMHhlMDAwMCBhbmQgMHhmMDAwMCBhcmUgdGFrZW4gYnkgdGhlIEJJT1MuIFRoYXQgb25seSBsZWF2ZXMgCisgICAweGMwMDAwLCAweGM4MDAwLCAweGQwMDAwIGFuZCAweGQ4MDAwIC4gKi8KKworc3RhdGljIGludCBwcm9iZV9zaSAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKwlpbnQgaTsKKworCWZ1bmNfZW50ZXIoKTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIkdvaW5nIHRvIHZlcmlmeSBTSSBzaWduYXR1cmUgaHcgJWx4IGF0ICVwLlxuIiwgYm9hcmQtPmh3X2Jhc2UsCisJICAgICAgICAgICAgYm9hcmQtPmJhc2UgKyBTSTJfSVNBX0lEX0JBU0UpOworCisJaWYgKHN4X2RlYnVnICYgU1hfREVCVUdfUFJPQkUpCisJCW15X2hkX2lvKGJvYXJkLT5iYXNlICsgU0kyX0lTQV9JRF9CQVNFLCAweDgpOworCisJaWYgKCFJU19FSVNBX0JPQVJEKGJvYXJkKSkgeworCSAgaWYoIElTX1NJMV9CT0FSRChib2FyZCkgKSAKKwkgICAgeworCQlmb3IgKGk9MDtpPDg7aSsrKSB7CisJCSAgd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSs3LWksaSk7IAorCisJCX0KKwkgICAgfQorCQlmb3IgKGk9MDtpPDg7aSsrKSB7CisJCQlpZiAoKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSs3LWkpICYgNykgIT0gaSkgeworCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qIE5vdyB3ZSdyZSBwcmV0dHkgbXVjaCBjb252aW5jZWQgdGhhdCB0aGVyZSBpcyBhbiBTSSBib2FyZCBoZXJlLCAKKwkgICBidXQgdG8gcHJldmVudCB0cm91YmxlLCB3ZSdkIGJldHRlciBkb3VibGUgY2hlY2sgdGhhdCB3ZSBkb24ndAorCSAgIGhhdmUgYW4gU0kxIGJvYXJkIHdoZW4gd2UncmUgcHJvYmluZyBmb3IgYW4gU0kyIGJvYXJkLi4uLiAqLworCisJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSwweDEwKTsgCisJaWYgKCBJU19TSTFfQk9BUkQoYm9hcmQpKSB7CisJCS8qIFRoaXMgc2hvdWxkIGJlIGFuIFNJMSBib2FyZCwgd2hpY2ggaGFzIHRoaXMKKwkJICAgbG9jYXRpb24gd3JpdGFibGUuLi4gKi8KKwkJaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSkgIT0gMHgxMCkKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAwOyAKKwl9IGVsc2UgeworCQkvKiBUaGlzIHNob3VsZCBiZSBhbiBTSTIgYm9hcmQsIHdoaWNoIGhhcyB0aGUgYm90dG9tCisJCSAgIDMgYml0cyBub24td3JpdGFibGUuLi4gKi8KKwkJaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSkgPT0gMHgxMCkKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAwOyAKKwl9CisKKwkvKiBOb3cgd2UncmUgcHJldHR5IG11Y2ggY29udmluY2VkIHRoYXQgdGhlcmUgaXMgYW4gU0kgYm9hcmQgaGVyZSwgCisJICAgYnV0IHRvIHByZXZlbnQgdHJvdWJsZSwgd2UnZCBiZXR0ZXIgZG91YmxlIGNoZWNrIHRoYXQgd2UgZG9uJ3QKKwkgICBoYXZlIGFuIFNJMSBib2FyZCB3aGVuIHdlJ3JlIHByb2JpbmcgZm9yIGFuIFNJMiBib2FyZC4uLi4gKi8KKworCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UsMHgxMCk7IAorCWlmICggSVNfU0kxX0JPQVJEKGJvYXJkKSkgeworCQkvKiBUaGlzIHNob3VsZCBiZSBhbiBTSTEgYm9hcmQsIHdoaWNoIGhhcyB0aGlzCisJCSAgIGxvY2F0aW9uIHdyaXRhYmxlLi4uICovCisJCWlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UpICE9IDB4MTApCisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAwOyAKKwl9IGVsc2UgeworCQkvKiBUaGlzIHNob3VsZCBiZSBhbiBTSTIgYm9hcmQsIHdoaWNoIGhhcyB0aGUgYm90dG9tCisJCSAgIDMgYml0cyBub24td3JpdGFibGUuLi4gKi8KKwkJaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSkgPT0gMHgxMCkKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAwOyAKKwl9CisKKwlwcmludGhlYWRlciAoKTsKKworCXByaW50ayAoS0VSTl9ERUJVRyAic3g6IEZvdW5kIGFuIFNJIGJvYXJkIGF0ICVseFxuIiwgYm9hcmQtPmh3X2Jhc2UpOworCS8qIENvbXBhcmVkIHRvIHRoZSBTWCBib2FyZHMsIGl0IGlzIGEgY29tcGxldGUgZ3Vlc3MgYXMgdG8gd2hhdAorCQkgdGhpcyBjYXJkIGlzIHVwIHRvLi4uICovCisKKwlib2FyZC0+bnBvcnRzID0gLTE7CisKKwkvKiBUaGlzIHJlc2V0cyB0aGUgcHJvY2Vzc29yLCBhbmQga2VlcHMgaXQgb2ZmIHRoZSBidXMuICovCisJaWYgKCFzeF9yZXNldCAoYm9hcmQpKSAKKwkJcmV0dXJuIDA7CisJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgInJlc2V0IHRoZSBib2FyZC4uLlxuIik7CisKKwlib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHN4X29wcyA9IHsKKwkuYnJlYWtfY3RsID0gc3hfYnJlYWssCisJLm9wZW4JPSBzeF9vcGVuLAorCS5jbG9zZSA9IGdzX2Nsb3NlLAorCS53cml0ZSA9IGdzX3dyaXRlLAorCS5wdXRfY2hhciA9IGdzX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGdzX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gZ3Nfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gZ3NfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBnc19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gc3hfaW9jdGwsCisJLnRocm90dGxlID0gc3hfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBzeF91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IGdzX3NldF90ZXJtaW9zLAorCS5zdG9wID0gZ3Nfc3RvcCwKKwkuc3RhcnQgPSBnc19zdGFydCwKKwkuaGFuZ3VwID0gZ3NfaGFuZ3VwLAorCS50aW9jbWdldCA9IHN4X3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHN4X3Rpb2Ntc2V0LAorfTsKKworc3RhdGljIGludCBzeF9pbml0X2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlmdW5jX2VudGVyKCk7CisKKwlzeF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKHN4X25wb3J0cyk7CisJaWYgKCFzeF9kcml2ZXIpCisJCXJldHVybiAxOworCXN4X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzeF9kcml2ZXItPmRyaXZlcl9uYW1lID0gInNwZWNpYWxpeF9zeCI7CisJc3hfZHJpdmVyLT5uYW1lID0gInR0eVgiOworCXN4X2RyaXZlci0+bWFqb3IgPSBTWF9OT1JNQUxfTUFKT1I7CisJc3hfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlzeF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc3hfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJc3hfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJICBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJc3hfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHN4X2RyaXZlciwgJnN4X29wcyk7CisKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzeF9kcml2ZXIpKSkgeworCQlwdXRfdHR5X2RyaXZlcihzeF9kcml2ZXIpOworCQlwcmludGsoS0VSTl9FUlIgInN4OiBDb3VsZG4ndCByZWdpc3RlciBzeCBkcml2ZXIsIGVycm9yID0gJWRcbiIsCisJCSAgICAgICBlcnJvcik7CisJCXJldHVybiAxOworCX0KKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCAqIGNrbWFsbG9jIChpbnQgc2l6ZSkKK3sKKwl2b2lkICpwOworCisJcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHApIAorCQltZW1zZXQocCwgMCwgc2l6ZSk7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGludCBzeF9pbml0X3BvcnRzdHJ1Y3RzIChpbnQgbmJvYXJkcywgaW50IG5wb3J0cykKK3sKKwlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkOworCXN0cnVjdCBzeF9wb3J0ICpwb3J0OworCWludCBpLCBqOworCWludCBhZGRyLCBjaGFuczsKKwlpbnQgcG9ydG5vOworCisJZnVuY19lbnRlcigpOworCisJLyogTWFueSBkcml2ZXJzIHN0YXRpY2FsbHkgYWxsb2NhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvcnRzCisJICAgVGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0byBhbGxvY2F0ZSB0aGVtIGR5bmFtaWNhbGx5LiBJcyB0aGVyZT8gLS0gUkVXICovCisJc3hfcG9ydHMgICAgICAgICAgPSBja21hbGxvYyhucG9ydHMgKiBzaXplb2YgKHN0cnVjdCBzeF9wb3J0KSk7CisJaWYgKCFzeF9wb3J0cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3J0ID0gc3hfcG9ydHM7CisJZm9yIChpID0gMDsgaSA8IG5ib2FyZHM7IGkrKykgeworCQlib2FyZCA9ICZib2FyZHNbaV07CisJCWJvYXJkLT5wb3J0cyA9IHBvcnQ7CisJCWZvciAoaj0wOyBqIDwgYm9hcmRzW2ldLm5wb3J0cztqKyspIHsKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJpbml0aW5nIHBvcnQgJWRcbiIsIGopOworCQkJcG9ydC0+Z3MubWFnaWMgPSBTWF9NQUdJQzsKKwkJCXBvcnQtPmdzLmNsb3NlX2RlbGF5ID0gSFovMjsKKwkJCXBvcnQtPmdzLmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisJCQlwb3J0LT5ib2FyZCA9IGJvYXJkOworCQkJcG9ydC0+Z3MucmQgPSAmc3hfcmVhbF9kcml2ZXI7CisjaWZkZWYgTkVXX1dSSVRFX0xPQ0tJTkcKKwkJCXBvcnQtPmdzLnBvcnRfd3JpdGVfc2VtID0gTVVURVg7CisjZW5kaWYKKwkJCXBvcnQtPmdzLmRyaXZlcl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCQkJLyoKKwkJCSAqIEluaXRpYWxpemluZyB3YWl0IHF1ZXVlCisJCQkgKi8KKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLm9wZW5fd2FpdCk7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5jbG9zZV93YWl0KTsgCQkKKwkJCQorCQkJcG9ydCsrOworCQl9CisJfQorCisJcG9ydCA9IHN4X3BvcnRzOworCXBvcnRubyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5ib2FyZHM7IGkrKykgeworCQlib2FyZCA9ICZib2FyZHNbaV07CisJCWJvYXJkLT5wb3J0X2Jhc2UgPSBwb3J0bm87CisJCS8qIFBvc3NpYmx5IHRoZSBjb25maWd1cmF0aW9uIHdhcyByZWplY3RlZC4gKi8KKwkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJCb2FyZCBoYXMgJWQgY2hhbm5lbHNcbiIsIGJvYXJkLT5ucG9ydHMpOworCQlpZiAoYm9hcmQtPm5wb3J0cyA8PSAwKSBjb250aW51ZTsKKwkJLyogWFhYIGJ5dGVvcmRlciA/PyAqLworCQlmb3IgKGFkZHIgPSAweDgwO2FkZHIgIT0gMDthZGRyID0gcmVhZF9zeF93b3JkIChib2FyZCwgYWRkcikgJiAweDdmZmYpIHsKKwkJCWNoYW5zID0gc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX3R5cGUpOyAKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiTW9kdWxlIGF0ICV4OiAlZCBjaGFubmVsc1xuIiwgYWRkciwgY2hhbnMpOworCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJQb3J0IGF0Iik7CisJCQlmb3IgKGo9MDtqPGNoYW5zO2orKykgeworCQkJCS8qIFRoZSAic3gtd2F5IiBpcyB0aGUgd2F5IGl0IFNIT1VMRCBiZSBkb25lLiBUaGF0IHdheSBpbiB0aGUgCisJCQkJICAgZnV0dXJlLCB0aGUgZmlybXdhcmUgbWF5IGZvciBleGFtcGxlIHBhY2sgdGhlIHN0cnVjdHVyZXMgYSBiaXQKKwkJCQkgICBtb3JlIGVmZmljaWVudC4gTmVpbCB0ZWxscyBtZSBpdCBpc24ndCBnb2luZyB0byBoYXBwZW4gYW55dGltZQorCQkJCSAgIHNvb24gdGhvdWdoLiAqLworCQkJCWlmIChJU19TWF9CT0FSRChib2FyZCkpCisJCQkJCXBvcnQtPmNoX2Jhc2UgPSBzeF9yZWFkX21vZHVsZV93b3JkIChib2FyZCwgYWRkcitqKjIsIG1jX2NoYW5fcG9pbnRlcik7CisJCQkJZWxzZQorCQkJCQlwb3J0LT5jaF9iYXNlID0gYWRkciArIDB4MTAwICsgMHgzMDAqajsKKworCQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiICV4IiwgcG9ydC0+Y2hfYmFzZSk7CisJCQkJcG9ydC0+bGluZSA9IHBvcnRubysrOworCQkJCXBvcnQrKzsKKwkJCX0KKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiXG4iKTsKKwkJfQorCQkvKiBUaGlzIGhhcyB0byBiZSBkb25lIGVhcmxpZXIuICovCisJCS8qIGJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9JTklUSUFMSVpFRDsgKi8KKwl9CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN4X3JlbGVhc2VfZHJpdmVycyh2b2lkKQoreworCWZ1bmNfZW50ZXIoKTsKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc3hfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihzeF9kcml2ZXIpOworCWZ1bmNfZXhpdCgpOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIFNldHRpbmcgYml0IDE3IGluIHRoZSBDTlRSTCByZWdpc3RlciBvZiB0aGUgUExYIDkwNTAgICogCisgKiBjaGlwIGZvcmNlcyBhIHJldHJ5IG9uIHdyaXRlcyB3aGlsZSBhIHJlYWQgaXMgcGVuZGluZy4qCisgKiBUaGlzIGlzIHRvIHByZXZlbnQgdGhlIGNhcmQgbG9ja2luZyB1cCBvbiBJbnRlbCBYZW9uICAqCisgKiBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zIHdpdGggdGhlIE5YIGNoaXBzZXQuICAgIC0tIE5WICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5ld2VyIGNhcmRzIGFyZSBwcm9kdWNlZCB3aXRoIHRoaXMgYml0IHNldCBmcm9tIHRoZSBjb25maWd1cmF0aW9uCisgICBFRXByb20uICBBcyB0aGUgYml0IGlzIHJlYWQvd3JpdGUgZm9yIHRoZSBDUFUsIHdlIGNhbiBmaXggaXQgaGVyZSwKKyAgIGlmIHdlIGRldGVjdCB0aGF0IGl0IGlzbid0IHNldCBjb3JyZWN0bHkuIC0tIFJFVyAqLworCitzdGF0aWMgdm9pZCBmaXhfc3hfcGNpIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgaHdiYXNlOworCXZvaWQgX19pb21lbSAqcmViYXNlOworCXVuc2lnbmVkIGludCB0OworCisjZGVmaW5lIENOVFJMX1JFR19PRkZTRVQgICAgICAgIDB4NTAKKyNkZWZpbmUgQ05UUkxfUkVHX0dPT0RWQUxVRSAgICAgMHgxODI2MDAwMAorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmh3YmFzZSk7CisJaHdiYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJcmViYXNlID0gaW9yZW1hcChod2Jhc2UsIDB4ODApOworCXQgPSByZWFkbCAocmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7CisJaWYgKHQgIT0gQ05UUkxfUkVHX0dPT0RWQUxVRSkgeworCQlwcmludGsgKEtFUk5fREVCVUcgInN4OiBwZXJmb3JtaW5nIGNudHJsIHJlZyBmaXg6ICUwOHggLT4gJTA4eFxuIiwgdCwgQ05UUkxfUkVHX0dPT0RWQUxVRSk7IAorCQl3cml0ZWwgKENOVFJMX1JFR19HT09EVkFMVUUsIHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOworCX0KKwlpb3VubWFwKHJlYmFzZSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IF9faW5pdCBzeF9pbml0KHZvaWQpIAoreworCWludCBpOworCWludCBmb3VuZCA9IDA7CisJaW50IGVpc2Ffc2xvdDsKKwlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkOworCisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgdGludDsKKwl1bnNpZ25lZCBzaG9ydCB0c2hvcnQ7CisjZW5kaWYKKworCWZ1bmNfZW50ZXIoKTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiSW5pdGluZyBzeCBtb2R1bGUuLi4gKHN4X2RlYnVnPSVkKVxuIiwgc3hfZGVidWcpOworCWlmIChhYnMgKChsb25nKSAoJnN4X2RlYnVnKSAtIHN4X2RlYnVnKSA8IDB4MTAwMDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInN4OiBzeF9kZWJ1ZyBpcyBhbiBhZGRyZXNzLCBpbnN0ZWFkIG9mIGEgdmFsdWUuICIKKwkJICAgICAgICAiQXNzdW1pbmcgLTEuXG4iKTsKKwkJcHJpbnRrICgiKCVwKVxuIiwgJnN4X2RlYnVnKTsKKwkJc3hfZGVidWc9LTE7CisJfQorCisJaWYgKG1pc2NfcmVnaXN0ZXIoJnN4X2Z3X2RldmljZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1g6IFVuYWJsZSB0byByZWdpc3RlciBmaXJtd2FyZSBsb2FkZXIgZHJpdmVyLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCAKKwkJCQkJUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCwgCisJCQkJCSAgICAgIHBkZXYpKSkgeworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQljb250aW51ZTsKKworCQkvKiBTcGVjaWFsaXggaGFzIGEgd2hvbGUgYnVuY2ggb2YgY2FyZHMgd2l0aAorCQkgICAweDIwMDAgYXMgdGhlIGRldmljZSBJRC4gVGhleSBzYXkgaXRzIGJlY2F1c2UKKwkJICAgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIGl0LiBTdHVwaWQgc3RhbmRhcmQuICovCisJCS8qIEl0IHNlZW1zIHRoYXQgcmVhZGluZyBhIHdvcmQgZG9lc24ndCB3b3JrIHJlbGlhYmx5IG9uIDIuMC4KKwkJICAgQWxzbywgcmVhZGluZyBhIG5vbi1hbGlnbmVkIGR3b3JkIGRvZXNuJ3Qgd29yay4gU28gd2UgcmVhZCB0aGUKKwkJICAgd2hvbGUgZHdvcmQgYXQgMHgyYyBhbmQgZXh0cmFjdCB0aGUgd29yZCBhdCAweDJlIChTVUJTWVNURU1fSUQpCisJCSAgIG91cnNlbHZlcyAqLworCQkvKiBJIGRvbid0IGtub3cgd2h5IHRoZSBkZWZpbmUgZG9lc24ndCB3b3JrLCBjb25zdGFudCAweDJjIGRvZXMgLS1SRVcgKi8gCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgMHgyYywgJnRpbnQpOworCQl0c2hvcnQgPSAodGludCA+PiAxNikgJiAweGZmZmY7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiR290IGEgc3BlY2lhbGl4IGNhcmQ6ICV4LlxuIiwgdGludCk7CisJCS8qIHN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAicGRldiA9ICVkLyVkCSgleClcbiIsIHBkZXYsIHRpbnQpOyAqLyAKKwkJaWYgKCh0c2hvcnQgIT0gMHgwMjAwKSAmJiAodHNob3J0ICE9IDB4MDMwMCkpIHsKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiQnV0IGl0J3Mgbm90IGFuIFNYIGNhcmQgKCVkKS4uLlxuIiwgCisJCQkJICAgIHRzaG9ydCk7CisJCQljb250aW51ZTsKKwkJfQorCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOworCisJCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKKwkJYm9hcmQtPmZsYWdzIHw9ICh0c2hvcnQgPT0gMHgyMDApP1NYX1BDSV9CT0FSRDoKKwkJCQkJCSAgU1hfQ0ZQQ0lfQk9BUkQ7CisKKwkJLyogQ0YgYm9hcmRzIHVzZSBiYXNlIGFkZHJlc3MgMy4uLi4gKi8KKwkJaWYgKElTX0NGX0JPQVJEIChib2FyZCkpCisJCQlib2FyZC0+aHdfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMyk7CisJCWVsc2UKKwkJCWJvYXJkLT5od19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAyKTsKKwkJYm9hcmQtPmJhc2UyID0gCisJCWJvYXJkLT5iYXNlID0gaW9yZW1hcChib2FyZC0+aHdfYmFzZSwgV0lORE9XX0xFTiAoYm9hcmQpKTsKKwkJaWYgKCFib2FyZC0+YmFzZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCQkvKiBYWFggaGFuZGxlIGVycm9yICovCisJCX0KKworCQkvKiBNb3N0IG9mIHRoZSBzdHVmZiBvbiB0aGUgQ0YgYm9hcmQgaXMgb2Zmc2V0IGJ5CisJCSAgIDB4MTgwMDAgLi4uLiAgKi8KKwkJaWYgKElTX0NGX0JPQVJEIChib2FyZCkpIGJvYXJkLT5iYXNlICs9IDB4MTgwMDA7CisKKwkJYm9hcmQtPmlycSA9IHBkZXYtPmlycTsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIkdvdCBhIHNwZWNpYWxpeCBjYXJkOiAleC8lcCglZCkgJXguXG4iLCAKKwkJCSAgICB0aW50LCBib2FyZHNbZm91bmRdLmJhc2UsIGJvYXJkLT5pcnEsIGJvYXJkLT5mbGFncyk7CisKKwkJaWYgKHByb2JlX3N4IChib2FyZCkpIHsKKwkJCWZvdW5kKys7CisJCQlmaXhfc3hfcGNpIChwZGV2LCBib2FyZCk7CisJCX0gZWxzZSAKKwkJCWlvdW5tYXAoYm9hcmQtPmJhc2UyKTsKKwl9CisjZW5kaWYKKworCWZvciAoaT0wO2k8TlJfU1hfQUREUlM7aSsrKSB7CisJCWJvYXJkID0gJmJvYXJkc1tmb3VuZF07CisJCWJvYXJkLT5od19iYXNlID0gc3hfcHJvYmVfYWRkcnNbaV07CisJCWJvYXJkLT5iYXNlMiA9CisJCWJvYXJkLT5iYXNlID0gaW9yZW1hcChib2FyZC0+aHdfYmFzZSwgU1hfV0lORE9XX0xFTik7CisJCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKKwkJYm9hcmQtPmZsYWdzIHw9CVNYX0lTQV9CT0FSRDsKKwkJYm9hcmQtPmlycSA9IHN4X2lycW1hc2s/LTE6MDsKKworCQlpZiAocHJvYmVfc3ggKGJvYXJkKSkgeworCQkJZm91bmQrKzsKKwkJfSBlbHNlIHsKKwkJCWlvdW5tYXAoYm9hcmQtPmJhc2UpOworCQl9CisJfQorCisJZm9yIChpPTA7aTxOUl9TSV9BRERSUztpKyspIHsKKwkJYm9hcmQgPSAmYm9hcmRzW2ZvdW5kXTsKKwkJYm9hcmQtPmh3X2Jhc2UgPSBzaV9wcm9iZV9hZGRyc1tpXTsKKwkJYm9hcmQtPmJhc2UyID0KKwkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTSTJfSVNBX1dJTkRPV19MRU4pOworCQlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1RZUEU7CisJCWJvYXJkLT5mbGFncyB8PSAgU0lfSVNBX0JPQVJEOworCQlib2FyZC0+aXJxID0gc3hfaXJxbWFzayA/LTE6MDsKKworCQlpZiAocHJvYmVfc2kgKGJvYXJkKSkgeworCQkJZm91bmQrKzsKKwkJfSBlbHNlIHsKKwkJCWlvdW5tYXAgKGJvYXJkLT5iYXNlKTsKKwkJfQorCX0KKwlmb3IgKGk9MDtpPE5SX1NJMV9BRERSUztpKyspIHsKKwkJYm9hcmQgPSAmYm9hcmRzW2ZvdW5kXTsKKwkJYm9hcmQtPmh3X2Jhc2UgPSBzaTFfcHJvYmVfYWRkcnNbaV07CisJCWJvYXJkLT5iYXNlMiA9CisJCWJvYXJkLT5iYXNlID0gaW9yZW1hcChib2FyZC0+aHdfYmFzZSwgU0kxX0lTQV9XSU5ET1dfTEVOKTsKKwkJYm9hcmQtPmZsYWdzICY9IH5TWF9CT0FSRF9UWVBFOworCQlib2FyZC0+ZmxhZ3MgfD0gIFNJMV9JU0FfQk9BUkQ7CisJCWJvYXJkLT5pcnEgPSBzeF9pcnFtYXNrID8tMTowOworCisJCWlmIChwcm9iZV9zaSAoYm9hcmQpKSB7CisJCQlmb3VuZCsrOworCQl9IGVsc2UgeworCQkJaW91bm1hcCAoYm9hcmQtPmJhc2UpOworCQl9CisJfQorCisgICAgICAgIHN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJQcm9iaW5nIGZvciBFSVNBIGNhcmRzXG4iKTsKKyAgICAgICAgZm9yKGVpc2Ffc2xvdD0weDEwMDA7IGVpc2Ffc2xvdDwweDEwMDAwOyBlaXNhX3Nsb3QrPTB4MTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKChpbmIoZWlzYV9zbG90KzB4YzgwKT09MHg0ZCkgJiYKKyAgICAgICAgICAgICAgICAgICAoaW5iKGVpc2Ffc2xvdCsweGM4MSk9PTB4OTgpKQorICAgICAgICAgICAgICAgIHsKKwkJCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICIlcyA6IFNpZ25hdHVyZSBmb3VuZCBpbiBFSVNBIHNsb3QgJWQsIFByb2R1Y3QgJWQgUmV2ICVkXG4iLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgIlhJTyIsIChlaXNhX3Nsb3Q+PjEyKSwgaW5iKGVpc2Ffc2xvdCsweGM4MiksIGluYihlaXNhX3Nsb3QrMHhjODMpKTsKKworCQkJYm9hcmQgPSAmYm9hcmRzW2ZvdW5kXTsKKwkJCWJvYXJkLT5laXNhX2Jhc2UgPSBlaXNhX3Nsb3Q7CisJCQlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1RZUEU7CisJCQlib2FyZC0+ZmxhZ3MgfD0gU0lfRUlTQV9CT0FSRDsKKworCQkJYm9hcmQtPmh3X2Jhc2UgPSAoKChpbmIoMHhjMDErZWlzYV9zbG90KSA8PCA4KSArIGluYigweGMwMCtlaXNhX3Nsb3QpKSA8PCAxNik7CisJCQlib2FyZC0+YmFzZTIgPQorCQkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTSTJfRUlTQV9XSU5ET1dfTEVOKTsKKworCQkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIklPIGh3X2Jhc2UgYWRkcmVzczogJWx4XG4iLCBib2FyZC0+aHdfYmFzZSk7CisJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiYmFzZTogJXBcbiIsIGJvYXJkLT5iYXNlKTsKKwkJCWJvYXJkLT5pcnEgPSBpbmIoYm9hcmQtPmVpc2FfYmFzZSsweGMwMik+PjQ7IAorCQkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIklSUTogJWRcbiIsIGJvYXJkLT5pcnEpOworCQkJCisJCQlwcm9iZV9zaShib2FyZCk7CisKKwkJCWZvdW5kKys7CisJCX0KKwl9CisJaWYgKGZvdW5kKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJzeDogdG90YWwgb2YgJWQgYm9hcmRzIGRldGVjdGVkLlxuIiwgZm91bmQpOworCX0gZWxzZSB7CisJCW1pc2NfZGVyZWdpc3Rlcigmc3hfZndfZGV2aWNlKTsKKwl9CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gZm91bmQ/MDotRUlPOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzeF9leGl0ICh2b2lkKQoreworCWludCBpOyAKKwlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkOworCisJZnVuY19lbnRlcigpOworCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkRTOyBpKyspIHsKKwkJYm9hcmQgPSAmYm9hcmRzW2ldOworCQlpZiAoYm9hcmQtPmZsYWdzICYgU1hfQk9BUkRfSU5JVElBTElaRUQpIHsKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBib2FyZCBhdCAlcFxuIiwgYm9hcmQtPmJhc2UpOworCQkJLyogVGhlIGJvYXJkIHNob3VsZCBzdG9wIG1lc3Npbmcgd2l0aCB1cy4KKwkJCSAgIChhY3R1YWxseSBJIG1lYW4gdGhlIGludGVycnVwdCkgKi8KKwkJCXN4X3Jlc2V0IChib2FyZCk7CisJCQlpZiAoKGJvYXJkLT5pcnEpICYmIChib2FyZC0+ZmxhZ3MgJiBTWF9JUlFfQUxMT0NBVEVEKSkKKwkJCQlmcmVlX2lycSAoYm9hcmQtPmlycSwgYm9hcmQpOworCisJCQkvKiBJdCBpcyBzYWZlL2FsbG93ZWQgdG8gZGVsX3RpbWVyIGEgbm9uLWFjdGl2ZSB0aW1lciAqLworCQkJZGVsX3RpbWVyICgmIGJvYXJkLT50aW1lcik7CisJCQlpb3VubWFwKGJvYXJkLT5iYXNlKTsKKwkJfQorCX0KKwlpZiAobWlzY19kZXJlZ2lzdGVyKCZzeF9md19kZXZpY2UpIDwgMCkgeworCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IGNvdWxkbid0IGRlcmVnaXN0ZXIgZmlybXdhcmUgbG9hZGVyIGRldmljXG4iKTsKKwl9CisJc3hfZHByaW50ayAoU1hfREVCVUdfQ0xFQU5VUCwgIkNsZWFuaW5nIHVwIGRyaXZlcnMgKCVkKVxuIiwgc3hfaW5pdGlhbGl6ZWQpOworCWlmIChzeF9pbml0aWFsaXplZCkKKwkJc3hfcmVsZWFzZV9kcml2ZXJzICgpOworCisJa2ZyZWUgKHN4X3BvcnRzKTsKKwlmdW5jX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoc3hfaW5pdCk7Cittb2R1bGVfZXhpdChzeF9leGl0KTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3guaCBiL2RyaXZlcnMvY2hhci9zeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWY4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3guaApAQCAtMCwwICsxLDIwMiBAQAorCisvKgorICogIHN4LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LzE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqICBTWCBzZXJpYWwgZHJpdmVyLgorICogIC0tIFN1cHBvcnRzIFNJLCBYSU8gYW5kIFNYIGhvc3QgY2FyZHMuIAorICogIC0tIFN1cHBvcnRzIFRBcywgTVRBcyBhbmQgU1hEQ3MuCisgKgorICogIFZlcnNpb24gMS4zIC0tIE1hcmNoLCAxOTk5LiAKKyAqIAorICovCisKKyNkZWZpbmUgU1hfTkJPQVJEUyAgICAgICAgNAorI2RlZmluZSBTWF9QT1JUU1BFUkJPQVJEIDMyCisjZGVmaW5lIFNYX05QT1JUUyAgICAgICAgKFNYX05CT0FSRFMgKiBTWF9QT1JUU1BFUkJPQVJEKQorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFNYX01BR0lDIDB4MTIzNDU2NzgKKworc3RydWN0IHN4X3BvcnQgeworICBzdHJ1Y3QgZ3NfcG9ydCAgICAgICAgICBnczsKKyAgc3RydWN0IHdhaXRfcXVldWUgICAgICAgKnNodXRkb3duX3dhaXQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgIGNoX2Jhc2U7CisgIGludCAgICAgICAgICAgICAgICAgICAgIGNfZGNkOworICBzdHJ1Y3Qgc3hfYm9hcmQgICAgICAgICAqYm9hcmQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgIGxpbmU7CisgIGxvbmcgICAgICAgICAgICAgICAgICAgIGxvY2tzOworfTsKKworc3RydWN0IHN4X2JvYXJkIHsKKyAgaW50IG1hZ2ljOworICB2b2lkIF9faW9tZW0gKmJhc2U7CisgIHZvaWQgX19pb21lbSAqYmFzZTI7CisgIHVuc2lnbmVkIGxvbmcgaHdfYmFzZTsKKyAgaW50IGVpc2FfYmFzZTsKKyAgaW50IHBvcnRfYmFzZTsgLyogTnVtYmVyIG9mIHRoZSBmaXJzdCBwb3J0ICovCisgIHN0cnVjdCBzeF9wb3J0ICpwb3J0czsKKyAgaW50IG5wb3J0czsKKyAgaW50IGZsYWdzOworICBpbnQgaXJxOworICBpbnQgcG9sbDsKKyAgaW50IHRhX3R5cGU7CisgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHRpbWVyOworICBsb25nICAgICAgICAgICAgICAgICAgICBsb2NrczsKK307CisKK3N0cnVjdCB2cGRfcHJvbSB7CisgIHVuc2lnbmVkIHNob3J0IGlkOworICBjaGFyIGh3cmV2OworICBjaGFyIGh3YXNzOworICBpbnQgdW5pcWlkOworICBjaGFyIG15ZWFyOworICBjaGFyIG13ZWVrOworICBjaGFyIGh3X2ZlYXR1cmVbNV07CisgIGNoYXIgb2VtX2lkOworICBjaGFyIGlkZW50aWZpZXJbMTZdOworfTsKKworI2lmbmRlZiBNT0RfUlMyMzJEQjI1TUFMRQorI2RlZmluZSBNT0RfUlMyMzJEQjI1TUFMRSAweDBhCisjZW5kaWYKKworI2RlZmluZSBTSV9JU0FfQk9BUkQgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNYX0lTQV9CT0FSRCAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1hfUENJX0JPQVJEICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTWF9DRlBDSV9CT0FSRCAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNYX0NGSVNBX0JPQVJEICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU0lfRUlTQV9CT0FSRCAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTSTFfSVNBX0JPQVJEICAgICAgICAweDAwMDAwMDQwCisKKyNkZWZpbmUgU1hfQk9BUkRfUFJFU0VOVCAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBTWF9CT0FSRF9JTklUSUFMSVpFRCAweDAwMDAyMDAwCisjZGVmaW5lIFNYX0lSUV9BTExPQ0FURUQgICAgIDB4MDAwMDQwMDAKKworI2RlZmluZSBTWF9CT0FSRF9UWVBFICAgICAgICAweDAwMDAwMGZmCisKKyNkZWZpbmUgSVNfU1hfQk9BUkQoYm9hcmQpIChib2FyZC0+ZmxhZ3MgJiAoU1hfUENJX0JPQVJEIHwgU1hfQ0ZQQ0lfQk9BUkQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNYX0lTQV9CT0FSRCB8IFNYX0NGSVNBX0JPQVJEKSkKKworI2RlZmluZSBJU19TSV9CT0FSRChib2FyZCkgKGJvYXJkLT5mbGFncyAmIFNJX0lTQV9CT0FSRCkKKyNkZWZpbmUgSVNfU0kxX0JPQVJEKGJvYXJkKSAoYm9hcmQtPmZsYWdzICYgU0kxX0lTQV9CT0FSRCkKKworI2RlZmluZSBJU19FSVNBX0JPQVJEKGJvYXJkKSAoYm9hcmQtPmZsYWdzICYgU0lfRUlTQV9CT0FSRCkKKworI2RlZmluZSBJU19DRl9CT0FSRChib2FyZCkgKGJvYXJkLT5mbGFncyAmIChTWF9DRklTQV9CT0FSRCB8IFNYX0NGUENJX0JPQVJEKSkKKworI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwgMQorCisvKiBUaGUgU0kgcHJvY2Vzc29yIGNsb2NrIGlzIHJlcXVpcmVkIHRvIGNhbGN1bGF0ZSB0aGUgY2NfaW50X2NvdW50IHJlZ2lzdGVyCisgICB2YWx1ZSBmb3IgdGhlIFNJIGNhcmRzLiAqLworI2RlZmluZSBTSV9QUk9DRVNTT1JfQ0xPQ0sgMjUwMDAwMDAKKworCisvKiBwb3J0IGZsYWdzICovCisvKiBNYWtlIHN1cmUgdGhlc2UgZG9uJ3QgY2xhc2ggd2l0aCBncyBmbGFncyBvciBhc3luYyBmbGFncyAqLworI2RlZmluZSBTWF9SWF9USFJPVFRMRSAgICAgICAgMHgwMDAwMDAxCisKKworCisjZGVmaW5lIFNYX1BPUlRfVFJBTlNNSVRfTE9DSyAgMAorI2RlZmluZSBTWF9CT0FSRF9JTlRSX0xPQ0sgICAgIDAKKworCisKKy8qIERlYnVnIGZsYWdzLiBBZGQgdGhlc2UgdG9nZXRoZXIgdG8gZ2V0IG1vcmUgZGVidWcgaW5mby4gKi8KKworI2RlZmluZSBTWF9ERUJVR19PUEVOICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1hfREVCVUdfU0VUVElORyAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNYX0RFQlVHX0ZMT1cgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTWF9ERUJVR19NT0RFTVNJR05BTFMgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU1hfREVCVUdfVEVSTUlPUyAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNYX0RFQlVHX1RSQU5TTUlUICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTWF9ERUJVR19SRUNFSVZFICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU1hfREVCVUdfSU5URVJSVVBUUyAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNYX0RFQlVHX1BST0JFICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTWF9ERUJVR19JTklUICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU1hfREVCVUdfQ0xFQU5VUCAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFNYX0RFQlVHX0NMT1NFICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBTWF9ERUJVR19GSVJNV0FSRSAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgU1hfREVCVUdfTUVNVEVTVCAgICAgICAweDAwMDAyMDAwCisKKyNkZWZpbmUgU1hfREVCVUdfQUxMICAgICAgICAgICAweGZmZmZmZmZmCisKKworI2RlZmluZSBPX09USEVSKHR0eSkgICAgXAorICAgICAgKChPX09MQ1VDKHR0eSkpICB8fFwKKyAgICAgIChPX09OTENSKHR0eSkpICAgfHxcCisgICAgICAoT19PQ1JOTCh0dHkpKSAgIHx8XAorICAgICAgKE9fT05PQ1IodHR5KSkgICB8fFwKKyAgICAgIChPX09OTFJFVCh0dHkpKSAgfHxcCisgICAgICAoT19PRklMTCh0dHkpKSAgIHx8XAorICAgICAgKE9fT0ZERUwodHR5KSkgICB8fFwKKyAgICAgIChPX05MRExZKHR0eSkpICAgfHxcCisgICAgICAoT19DUkRMWSh0dHkpKSAgIHx8XAorICAgICAgKE9fVEFCRExZKHR0eSkpICB8fFwKKyAgICAgIChPX0JTRExZKHR0eSkpICAgfHxcCisgICAgICAoT19WVERMWSh0dHkpKSAgIHx8XAorICAgICAgKE9fRkZETFkodHR5KSkpCisKKy8qIFNhbWUgZm9yIGlucHV0LiAqLworI2RlZmluZSBJX09USEVSKHR0eSkgICAgXAorICAgICAgKChJX0lOTENSKHR0eSkpICB8fFwKKyAgICAgIChJX0lHTkNSKHR0eSkpICAgfHxcCisgICAgICAoSV9JQ1JOTCh0dHkpKSAgIHx8XAorICAgICAgKElfSVVDTEModHR5KSkgICB8fFwKKyAgICAgIChMX0lTSUcodHR5KSkpCisKKyNkZWZpbmUgTU9EX1RBICAgKCAgICAgICAgVEE+PjQpCisjZGVmaW5lIE1PRF9NVEEgIChNVEFfQ0QxNDAwPj40KQorI2RlZmluZSBNT0RfU1hEQyAoICAgICAgU1hEQz4+NCkKKworCisvKiBXZSBjb3B5IHRoZSBkb3dubG9hZCBjb2RlIG92ZXIgdG8gdGhlIGNhcmQgaW4gY2h1bmtzIG9mIC4uLiBieXRlcyAqLworI2RlZmluZSBTWF9DSFVOS19TSVpFIDEyOAorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisKKworLyogU3BlY2lhbGl4IGRvY3VtZW50IDYyMTAwNDYtMTEgcGFnZSAzICovCisjZGVmaW5lIFNQWChYKSAoKCdTJzw8MjQpIHwgKCdQJyA8PCAxNikgfCAoWCkpCisKKy8qIFNwZWNpYWxpeC1MaW51eCBzcGVjaWZpYyBJT0NUTFMuICovCisjZGVmaW5lIFNQWEwoWCkgKFNQWCgoJ0wnIDw8IDgpIHwgKFgpKSkKKworCisjZGVmaW5lIFNYSU9fU0VUX0JPQVJEICAgICAgU1BYTCgweDAxKQorI2RlZmluZSBTWElPX0dFVF9UWVBFICAgICAgIFNQWEwoMHgwMikKKyNkZWZpbmUgU1hJT19ET1dOTE9BRCAgICAgICBTUFhMKDB4MDMpCisjZGVmaW5lIFNYSU9fSU5JVCAgICAgICAgICAgU1BYTCgweDA0KQorI2RlZmluZSBTWElPX1NFVERFQlVHICAgICAgIFNQWEwoMHgwNSkKKyNkZWZpbmUgU1hJT19HRVRERUJVRyAgICAgICBTUFhMKDB4MDYpCisjZGVmaW5lIFNYSU9fRE9fUkFNVEVTVCAgICAgU1BYTCgweDA3KQorI2RlZmluZSBTWElPX1NFVEdTREVCVUcgICAgIFNQWEwoMHgwOCkKKyNkZWZpbmUgU1hJT19HRVRHU0RFQlVHICAgICBTUFhMKDB4MDkpCisjZGVmaW5lIFNYSU9fR0VUTlBPUlRTICAgICAgU1BYTCgweDBhKQorCisKKyNpZm5kZWYgU1hDVExfTUlTQ19NSU5PUiAKKy8qIEFsbG93IG90aGVycyB0byBnYXRoZXIgdGhpcyBpbnRvICJtYWpvci5oIiBvciBzb21ldGhpbmcgbGlrZSB0aGF0ICovCisjZGVmaW5lIFNYQ1RMX01JU0NfTUlOT1IgICAgMTY3CisjZW5kaWYKKworI2lmbmRlZiBTWF9OT1JNQUxfTUFKT1IKKy8qIFRoaXMgYWxsb3dzIG92ZXJyaWRpbmcgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmRsaW5lLCBvciBpbiBhICJtYWpvci5oIiAKKyAgIGluY2x1ZGUgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCAqLworI2RlZmluZSBTWF9OT1JNQUxfTUFKT1IgIDMyCisjZGVmaW5lIFNYX0NBTExPVVRfTUFKT1IgMzMKKyNlbmRpZgorCisKKyNkZWZpbmUgU1hfVFlQRV9TWCAgICAgICAgICAweDAxCisjZGVmaW5lIFNYX1RZUEVfU0kgICAgICAgICAgMHgwMgorI2RlZmluZSBTWF9UWVBFX0NGICAgICAgICAgIDB4MDMKKworCisjZGVmaW5lIFdJTkRPV19MRU4oYm9hcmQpIChJU19DRl9CT0FSRChib2FyZCk/MHgyMDAwMDpTWF9XSU5ET1dfTEVOKQorLyogICAgICAgICAgICAgICAgICAgICAgICAgTmVlZCBhICNkZWZpbmUgZm9yIF5eXl5eXl4gISEhICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeGJvYXJkcy5oIGIvZHJpdmVycy9jaGFyL3N4Ym9hcmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3OTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zeGJvYXJkcy5oCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGl0bGUJCToJU1gvU0kvWElPIEJvYXJkIEhhcmR3YXJlIERlZmluaXRpb25zCSovCisvKgkJCQkJCQkJCSovCisvKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDcmVhdGlvbgk6CTE2dGggTWFyY2ggMTk5OAkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJVmVyc2lvbgkJOgkzLjAuMAkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNvcHlyaWdodAk6CShjKSBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuIDE5OTgJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KKy8qCQkJCWRlc2NyaWJpbmcgdGhlIFNYL1NJL1hJTyBib2FyZCBoYXJkd2FyZQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGlzdG9yeS4uLgorCiszLjAuMAkxNi8wMy85OCBOUFYJQ3JlYXRpb24uCisKKyovCisKKyNpZm5kZWYJX3N4Ym9hcmRzX2gJCQkJLyogSWYgU1hCT0FSRFMuSCBub3QgYWxyZWFkeSBkZWZpbmVkICovCisjZGVmaW5lCV9zeGJvYXJkc19oICAgIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCb2FyZCBUeXBlcyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQlVTIHR5cGVzLi4uICovCisjZGVmaW5lCQlCVVNfSVNBCQkwCisjZGVmaW5lCQlCVVNfTUNBCQkxCisjZGVmaW5lCQlCVVNfRUlTQQkyCisjZGVmaW5lCQlCVVNfUENJCQkzCisKKy8qIEJvYXJkIHBoYXNlcy4uLiAqLworI2RlZmluZQkJU0kxX1oyODAJMQorI2RlZmluZQkJU0kyX1oyODAJMgorI2RlZmluZQkJU0kzX1QyMjUJMworCisvKiBCb2FyZCB0eXBlcy4uLiAqLworI2RlZmluZQkJQ0FSRF9UWVBFKGJ1cyxwaGFzZSkJKGJ1czw8NHxwaGFzZSkKKyNkZWZpbmUJCUNBUkRfQlVTKHR5cGUpCQkoKHR5cGU+PjQpJjB4RikKKyNkZWZpbmUJCUNBUkRfUEhBU0UodHlwZSkJKHR5cGUmMHhGKQorCisjZGVmaW5lCQlUWVBFX1NJMV9JU0EJCUNBUkRfVFlQRShCVVNfSVNBLFNJMV9aMjgwKQorI2RlZmluZQkJVFlQRV9TSTJfSVNBCQlDQVJEX1RZUEUoQlVTX0lTQSxTSTJfWjI4MCkKKyNkZWZpbmUJCVRZUEVfU0kyX0VJU0EJCUNBUkRfVFlQRShCVVNfRUlTQSxTSTJfWjI4MCkKKyNkZWZpbmUJCVRZUEVfU0kyX1BDSQkJQ0FSRF9UWVBFKEJVU19QQ0ksU0kyX1oyODApCisKKyNkZWZpbmUJCVRZUEVfU1hfSVNBCQlDQVJEX1RZUEUoQlVTX0lTQSxTSTNfVDIyNSkKKyNkZWZpbmUJCVRZUEVfU1hfUENJCQlDQVJEX1RZUEUoQlVTX1BDSSxTSTNfVDIyNSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQaGFzZSAxIFoyODAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIElTQSBib2FyZCBkZXRhaWxzLi4uICovCisjZGVmaW5lCQlTSTFfSVNBX1dJTkRPV19MRU4JMHgxMDAwMAkJLyogNjQgS2J5dGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgKi8KKy8vI2RlZmluZSAJU0kxX0lTQV9NRU1PUllfTEVOCTB4ODAwMAkJLyogVXNhYmxlIG1lbW9yeSAgLSB1bnVzZWQgZGVmaW5lKi8KKy8vI2RlZmluZQkJU0kxX0lTQV9BRERSX0xPVwkweDBBMDAwMAkvKiBMb3dlc3QgYWRkcmVzcyA9IDY0MCBLYnl0ZSAqLworLy8jZGVmaW5lCQlTSTFfSVNBX0FERFJfSElHSAkweEZGODAwMAkvKiBIaWdoZXN0IGFkZHJlc3MgPSAxNk1ieXRlIC0gMzJLYnl0ZSAqLworLy8jZGVmaW5lCQlTSTJfSVNBX0FERFJfU1RFUAlTSTJfSVNBX1dJTkRPV19MRU4vKiBJU0EgYm9hcmQgYWRkcmVzcyBzdGVwICovCisvLyNkZWZpbmUJCVNJMl9JU0FfSVJRX01BU0sJMHg5ODAwCQkvKiBJUlFzIDE1LDEyLDExICovCisKKy8qIElTQSBib2FyZCwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuLi4gKi8KKy8vI2RlZmluZQkJU0kyX0lTQV9JRF9CQVNFCQkweDdGRjgJCQkvKiBSRUFEOiAgQm9hcmQgSUQgc3RyaW5nICovCisjZGVmaW5lCQlTSTFfSVNBX1JFU0VUCQkweDgwMDAJCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisjZGVmaW5lCQlTSTFfSVNBX1JFU0VUX0NMRUFSCTB4YzAwMAkJLyogV1JJVEU6IEhvc3QgUmVzZXQgY2xlYXIqLworI2RlZmluZQkJU0kxX0lTQV9XQUlUCSAgICAgICAgMHg5MDAwCQkvKiBXUklURTogSG9zdCB3YWl0ICovCisjZGVmaW5lCQlTSTFfSVNBX1dBSVRfQ0xFQVIJMHhkMDAwCQkvKiBXUklURTogSG9zdCB3YWl0IGNsZWFyICovCisjZGVmaW5lCQlTSTFfSVNBX0lOVENMICAgICAgICAJMHhhMDAwCQkvKiBXUklURTogSG9zdCBSZXNldCAqLworI2RlZmluZQkJU0kxX0lTQV9JTlRDTF9DTEVBUgkweGUwMDAJCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBoYXNlIDIgWjI4MCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSVNBIGJvYXJkIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUJCVNJMl9JU0FfV0lORE9XX0xFTgkweDgwMDAJCS8qIDMyIEtieXRlIHNoYXJlZCBtZW1vcnkgd2luZG93ICovCisjZGVmaW5lIAlTSTJfSVNBX01FTU9SWV9MRU4JMHg3RkY4CQkvKiBVc2FibGUgbWVtb3J5ICovCisjZGVmaW5lCQlTSTJfSVNBX0FERFJfTE9XCTB4MEEwMDAwCS8qIExvd2VzdCBhZGRyZXNzID0gNjQwIEtieXRlICovCisjZGVmaW5lCQlTSTJfSVNBX0FERFJfSElHSAkweEZGODAwMAkvKiBIaWdoZXN0IGFkZHJlc3MgPSAxNk1ieXRlIC0gMzJLYnl0ZSAqLworI2RlZmluZQkJU0kyX0lTQV9BRERSX1NURVAJU0kyX0lTQV9XSU5ET1dfTEVOLyogSVNBIGJvYXJkIGFkZHJlc3Mgc3RlcCAqLworI2RlZmluZQkJU0kyX0lTQV9JUlFfTUFTSwkweDk4MDAJCS8qIElSUXMgMTUsMTIsMTEgKi8KKworLyogSVNBIGJvYXJkLCByZWdpc3RlciBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJU0kyX0lTQV9JRF9CQVNFCQkweDdGRjgJCQkvKiBSRUFEOiAgQm9hcmQgSUQgc3RyaW5nICovCisjZGVmaW5lCQlTSTJfSVNBX1JFU0VUCQlTSTJfSVNBX0lEX0JBU0UJCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisjZGVmaW5lCQlTSTJfSVNBX0lSUTExCQkoU0kyX0lTQV9JRF9CQVNFKzEpCS8qIFdSSVRFOiBTZXQgSVJRMTEgKi8KKyNkZWZpbmUJCVNJMl9JU0FfSVJRMTIJCShTSTJfSVNBX0lEX0JBU0UrMikJLyogV1JJVEU6IFNldCBJUlExMiAqLworI2RlZmluZQkJU0kyX0lTQV9JUlExNQkJKFNJMl9JU0FfSURfQkFTRSszKQkvKiBXUklURTogU2V0IElSUTE1ICovCisjZGVmaW5lCQlTSTJfSVNBX0lSUVNFVAkJKFNJMl9JU0FfSURfQkFTRSs0KQkvKiBXUklURTogU2V0IEhvc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCQlTSTJfSVNBX0lOVENMRUFSCShTSTJfSVNBX0lEX0JBU0UrNSkJLyogV1JJVEU6IEVuYWJsZSBIb3N0IEludGVycnVwdCAqLworCisjZGVmaW5lCQlTSTJfSVNBX0lSUTExX1NFVAkweDEwCisjZGVmaW5lCQlTSTJfSVNBX0lSUTExX0NMRUFSCTB4MDAKKyNkZWZpbmUJCVNJMl9JU0FfSVJRMTJfU0VUCTB4MTAKKyNkZWZpbmUJCVNJMl9JU0FfSVJRMTJfQ0xFQVIJMHgwMAorI2RlZmluZQkJU0kyX0lTQV9JUlExNV9TRVQJMHgxMAorI2RlZmluZQkJU0kyX0lTQV9JUlExNV9DTEVBUgkweDAwCisjZGVmaW5lCQlTSTJfSVNBX0lOVENMRUFSX1NFVAkweDEwCisjZGVmaW5lCQlTSTJfSVNBX0lOVENMRUFSX0NMRUFSCTB4MDAKKyNkZWZpbmUJCVNJMl9JU0FfSVJRU0VUX0NMRUFSCTB4MTAKKyNkZWZpbmUJCVNJMl9JU0FfSVJRU0VUX1NFVAkweDAwCisjZGVmaW5lCQlTSTJfSVNBX1JFU0VUX1NFVAkweDAwCisjZGVmaW5lCQlTSTJfSVNBX1JFU0VUX0NMRUFSCTB4MTAKKworLyogUENJIGJvYXJkIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUJCVNJMl9QQ0lfV0lORE9XX0xFTgkweDEwMDAwMAkvKiAxIE1ieXRlIG1lbW9yeSB3aW5kb3cgKi8KKworLyogUENJIGJvYXJkIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTSTJfUENJX1NFVF9JUlEJCTB4NDAwMDEJCS8qIFNldCBIb3N0IEludGVycnVwdCAgKi8KKyNkZWZpbmUJCVNJMl9QQ0lfUkVTRVQJCTB4QzAwMDEJCS8qIEhvc3QgUmVzZXQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBoYXNlIDMgVDIyNSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCBib2FyZCBkZXRhaWxzLi4uICovCisjZGVmaW5lCQlTWF9XSU5ET1dfTEVOCQk2NCoxMDI0CQkvKiA2NCBLYnl0ZSBtZW1vcnkgd2luZG93ICovCisKKy8qIElTQSBib2FyZCBkZXRhaWxzLi4uICovCisjZGVmaW5lCQlTWF9JU0FfQUREUl9MT1cJCTB4MEEwMDAwCS8qIExvd2VzdCBhZGRyZXNzID0gNjQwIEtieXRlICovCisjZGVmaW5lCQlTWF9JU0FfQUREUl9ISUdICTB4RkY4MDAwCS8qIEhpZ2hlc3QgYWRkcmVzcyA9IDE2TWJ5dGUgLSAzMktieXRlICovCisjZGVmaW5lCQlTWF9JU0FfQUREUl9TVEVQCVNYX1dJTkRPV19MRU4JLyogSVNBIGJvYXJkIGFkZHJlc3Mgc3RlcCAqLworI2RlZmluZQkJU1hfSVNBX0lSUV9NQVNLCQkweDlFMDAJCS8qIElSUXMgMTUsMTIsMTEsMTAsOSAqLworCisvKiBIYXJkd2FyZSByZWdpc3RlciBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJU1hfRVZFTlRfU1RBVFVTCQkweDc4MDAJCS8qIFJFQUQ6ICBUMjI1IEV2ZW50IFN0YXR1cyAqLworI2RlZmluZQkJU1hfRVZFTlRfU1RST0JFCQkweDc4MDAJCS8qIFdSSVRFOiBUMjI1IEV2ZW50IFN0cm9iZSAqLworI2RlZmluZQkJU1hfRVZFTlRfRU5BQkxFCQkweDc4ODAJCS8qIFdSSVRFOiBUMjI1IEV2ZW50IEVuYWJsZSAqLworI2RlZmluZQkJU1hfVlBEX1JPTQkJMHg3QzAwCQkvKiBSRUFEOiAgVml0YWwgUHJvZHVjdCBEYXRhIFJPTSAqLworI2RlZmluZQkJU1hfQ09ORklHCQkweDdDMDAJCS8qIFdSSVRFOiBIb3N0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCVNYX0lSUV9TVEFUVVMJCTB4N0M4MAkJLyogUkVBRDogIEhvc3QgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZQkJU1hfU0VUX0lSUQkJMHg3QzgwCQkvKiBXUklURTogU2V0IEhvc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCQlTWF9SRVNFVF9TVEFUVVMJCTB4N0QwMAkJLyogUkVBRDogIEhvc3QgUmVzZXQgU3RhdHVzICovCisjZGVmaW5lCQlTWF9SRVNFVAkJMHg3RDAwCQkvKiBXUklURTogSG9zdCBSZXNldCAqLworI2RlZmluZQkJU1hfUkVTRVRfSVJRCQkweDdEODAJCS8qIFdSSVRFOiBSZXNldCBIb3N0IEludGVycnVwdCAqLworCisvKiBTWF9WUERfUk9NIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTWF9WUERfU0xYX0lEMQkJMHgwMAorI2RlZmluZQkJU1hfVlBEX1NMWF9JRDIJCTB4MDEKKyNkZWZpbmUJCVNYX1ZQRF9IV19SRVYJCTB4MDIKKyNkZWZpbmUJCVNYX1ZQRF9IV19BU1NFTQkJMHgwMworI2RlZmluZQkJU1hfVlBEX1VOSVFVRUlENAkweDA0CisjZGVmaW5lCQlTWF9WUERfVU5JUVVFSUQzCTB4MDUKKyNkZWZpbmUJCVNYX1ZQRF9VTklRVUVJRDIJMHgwNgorI2RlZmluZQkJU1hfVlBEX1VOSVFVRUlEMQkweDA3CisjZGVmaW5lCQlTWF9WUERfTUFOVV9ZRUFSCTB4MDgKKyNkZWZpbmUJCVNYX1ZQRF9NQU5VX1dFRUsJMHgwOQorI2RlZmluZQkJU1hfVlBEX0lERU5UCQkweDEwCisjZGVmaW5lCQlTWF9WUERfSURFTlRfU1RSSU5HCSJKRVQgSE9TVCBCWSBLRVYjIgorCisvKiBTWCB1bmlxdWUgaWRlbnRpZmllcnMuLi4gKi8KKyNkZWZpbmUJCVNYX1VOSVFVRUlEX01BU0sJMHhGMAorI2RlZmluZQkJU1hfSVNBX1VOSVFVRUlEMQkweDIwCisjZGVmaW5lCQlTWF9QQ0lfVU5JUVVFSUQxCTB4NTAKKworLyogU1hfQ09ORklHIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTWF9DT05GX0JVU0VOCQkweDAyCQkvKiBFbmFibGUgVDIyNSBtZW1vcnkgYW5kIEkvTyAqLworI2RlZmluZQkJU1hfQ09ORl9IT1NUSVJRCQkweDA0CQkvKiBFbmFibGUgYm9hcmQgdG8gaG9zdCBpbnRlcnJ1cHQgKi8KKworLyogU1ggYm9vdHN0cmFwLi4uICovCisjZGVmaW5lCQlTWF9CT09UU1RSQVAJCSJceDI4XHgyMFx4MjFceDAyXHg2MFx4MGEiCisjZGVmaW5lCQlTWF9CT09UU1RSQVBfU0laRQk2CisjZGVmaW5lCQlTWF9CT09UU1RSQVBfQUREUgkoMHg4MDAwLVNYX0JPT1RTVFJBUF9TSVpFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEVJU0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCQlTSTJfRUlTQV9PRkYJIAkweDQyCisjZGVmaW5lCQlTSTJfRUlTQV9WQUwJIAkweDAxCisjZGVmaW5lCQlTSTJfRUlTQV9XSU5ET1dfTEVOICAgICAweDEwMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBDSSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYWwgZGVmaW5pdGlvbnMuLi4gKi8KKworI2RlZmluZQkJU1BYX1ZFTkRPUl9JRAkJMHgxMUNCCQkvKiBBc3NpZ25lZCBieSB0aGUgUENJIFNJRyAqLworI2RlZmluZQkJU1BYX0RFVklDRV9JRAkJMHg0MDAwCQkvKiBTSS9YSU8gYm9hcmRzICovCisjZGVmaW5lCQlTUFhfUExYREVWSUNFX0lECTB4MjAwMAkJLyogU1ggYm9hcmRzICovCisKKyNkZWZpbmUJCVNQWF9TVUJfVkVORE9SX0lECVNQWF9WRU5ET1JfSUQJLyogU2FtZSBhcyB2ZW5kb3IgaWQgKi8KKyNkZWZpbmUJCVNJMl9TVUJfU1lTX0lECQkweDQwMAkJLyogUGhhc2UgMiAoWjI4MCkgYm9hcmQgKi8KKyNkZWZpbmUJCVNYX1NVQl9TWVNfSUQJCTB4MjAwCQkvKiBQaGFzZSAzICh0MjI1KSBib2FyZCAqLworCisjZW5kaWYJCQkJCQkvKl9zeGJvYXJkc19oICovCisKKy8qIEVuZCBvZiBTWEJPQVJEUy5IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3h3aW5kb3cuaCBiL2RyaXZlcnMvY2hhci9zeHdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDFiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3h3aW5kb3cuaApAQCAtMCwwICsxLDM5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVRpdGxlCQk6CVNYIFNoYXJlZCBNZW1vcnkgV2luZG93IFN0cnVjdHVyZQkqLworLyoJCQkJCQkJCQkqLworLyoJQXV0aG9yCQk6CU4uUC5WYXNzYWxsbwkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJQ3JlYXRpb24JOgkxNnRoIE1hcmNoIDE5OTgJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVZlcnNpb24JCToJMy4wLjAJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDb3B5cmlnaHQJOgkoYykgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiAxOTk4CSovCisvKgkJCQkJCQkJCSovCisvKglEZXNjcmlwdGlvbgk6CVByb3RvdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCSovCisvKgkJCQlkZXNjcmliaW5nIHRoZSBTWC9TSS9YSU8gY2FyZHMgc2hhcmVkCSovCisvKgkJCQltZW1vcnkgd2luZG93IHN0cnVjdHVyZToJCSovCisvKgkJCQkJU1hDQVJECQkJCSovCisvKgkJCQkJU1hNT0RVTEUJCQkqLworLyoJCQkJCVNYQ0hBTk5FTAkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIaXN0b3J5Li4uCisKKzMuMC4wCTE2LzAzLzk4IE5QVglDcmVhdGlvbi4gKGJhc2VkIG9uIFNUUlVDVC5IKQorCisqLworCisjaWZuZGVmCV9zeHdpbmRvd19oCQkJCS8qIElmIFNYV0lORE9XLkggbm90IGFscmVhZHkgZGVmaW5lZCAqLworI2RlZmluZQlfc3h3aW5kb3dfaCAgICAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBDb21tb24gRGVmaW5pdGlvbnMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYJc3RydWN0CV9TWENBUkQJCSpQU1hDQVJEOwkvKiBTWENBUkQgc3RydWN0dXJlIHBvaW50ZXIgKi8KK3R5cGVkZWYJc3RydWN0CV9TWE1PRFVMRQkqUE1PRDsJCS8qIFNYTU9EVUxFIHN0cnVjdHVyZSBwb2ludGVyICovCit0eXBlZGVmCXN0cnVjdAlfU1hDSEFOTkVMCSpQQ0hBTjsJCS8qIFNYQ0hBTk5FTCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgU1hDQVJEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmCXN0cnVjdAlfU1hDQVJECit7CisJQllURQljY19pbml0X3N0YXR1czsJCQkvKiAweDAwIEluaXRpYWxpc2F0aW9uIHN0YXR1cyAqLworCUJZVEUJY2NfbWVtX3NpemU7CQkJLyogMHgwMSBTaXplIG9mIG1lbW9yeSBvbiBjYXJkICovCisJV09SRAljY19pbnRfY291bnQ7CQkJLyogMHgwMiBJbnRlcnJ1cHQgY291bnQgKi8KKwlXT1JECWNjX3JldmlzaW9uOwkJCS8qIDB4MDQgRG93bmxvYWQgY29kZSByZXZpc2lvbiAqLworCUJZVEUJY2NfaXNyX2NvdW50OwkJCS8qIDB4MDYgQ291bnQgd2hlbiBJU1IgaXMgcnVuICovCisJQllURQljY19tYWluX2NvdW50OwkJCS8qIDB4MDcgQ291bnQgd2hlbiBtYWluIGxvb3AgaXMgcnVuICovCisJV09SRAljY19pbnRfcGVuZGluZzsJCQkvKiAweDA4IEludGVycnVwdCBwZW5kaW5nICovCisJV09SRAljY19wb2xsX2NvdW50OwkJCS8qIDB4MEEgQ291bnQgd2hlbiBwb2xsIGlzIHJ1biAqLworCUJZVEUJY2NfaW50X3NldF9jb3VudDsJCS8qIDB4MEMgQ291bnQgd2hlbiBob3N0IGludGVycnVwdCBpcyBzZXQgKi8KKwlCWVRFCWNjX3JmdVsweDgwIC0gMHgwRF07CQkvKiAweDBEIFBhZCBzdHJ1Y3R1cmUgdG8gMTI4IGJ5dGVzICgweDgwKSAqLworCit9IFNYQ0FSRDsKKworLyogU1hDQVJELmNjX2luaXRfc3RhdHVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lIAlBREFQVEVSU19GT1VORAkJKEJZVEUpMHgwMQorI2RlZmluZSAJTk9fQURBUFRFUlNfRk9VTkQJKEJZVEUpMHhGRgorCisvKiBTWENBUkQuY2NfbWVtX3NpemUgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUgCVNYX01FTU9SWV9TSVpFCQkoQllURSkweDQwCisKKy8qIFNYQ0FSRC5jY19pbnRfY291bnQgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUgCUlOVF9DT1VOVF9ERUZBVUxUCTEwMAkvKiBIeiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBTWE1PRFVMRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCVRPUF9QT0lOVEVSKGEpCQkoKGEpfDB4ODAwMCkJLyogU2V0cyB0b3AgYml0IG9mIHdvcmQgKi8KKyNkZWZpbmUgVU5UT1BfUE9JTlRFUihhKQkoKGEpJn4weDgwMDApCS8qIENsZWFycyB0b3AgYml0IG9mIHdvcmQgKi8KKwordHlwZWRlZglzdHJ1Y3QJX1NYTU9EVUxFCit7CisJV09SRAltY19uZXh0OwkJCS8qIDB4MDAgTmV4dCBtb2R1bGUgInBvaW50ZXIiIChPUmVkIHdpdGggMHg4MDAwKSAqLworCUJZVEUJbWNfdHlwZTsJCQkvKiAweDAyIFR5cGUgb2YgVEEgaW4gdGVybXMgb2YgbnVtYmVyIG9mIGNoYW5uZWxzICovCisJQllURQltY19tb2Rfbm87CQkJLyogMHgwMyBNb2R1bGUgbnVtYmVyIG9uIFNJIGJ1cyBjYWJsZSAoMCBjbG9zZXN0IHRvIGNhcmQpICovCisJQllURQltY19kdHI7CQkJCS8qIDB4MDQgUHJpdmF0ZSBEVFIgY29weSAoVEEgb25seSkgKi8KKwlCWVRFCW1jX3JmdTE7CQkJLyogMHgwNSBSZXNlcnZlZCAqLworCVdPUkQJbWNfdWFydDsJCQkvKiAweDA2IFVBUlQgYmFzZSBhZGRyZXNzIGZvciB0aGlzIG1vZHVsZSAqLworCUJZVEUJbWNfY2hpcDsJCQkvKiAweDA4IENoaXAgdHlwZSAvIG51bWJlciBvZiBwb3J0cyAqLworCUJZVEUJbWNfY3VycmVudF91YXJ0OwkJLyogMHgwOSBDdXJyZW50IHVhcnQgc2VsZWN0ZWQgZm9yIHRoaXMgbW9kdWxlICovCisjaWZkZWYJRE9XTkxPQUQKKwlQQ0hBTgltY19jaGFuX3BvaW50ZXJbOF07CQkvKiAweDBBIFBvaW50ZXIgdG8gZWFjaCBjaGFubmVsIHN0cnVjdHVyZSAqLworI2Vsc2UKKwlXT1JECW1jX2NoYW5fcG9pbnRlcls4XTsJCS8qIDB4MEEgRGVmaW5lIGFzIFdPUkQgaWYgbm90IGNvbXBpbGluZyBpbnRvIGRvd25sb2FkICovCisjZW5kaWYKKwlXT1JECW1jX3JmdTI7CQkJLyogMHgxQSBSZXNlcnZlZCAqLworCUJZVEUJbWNfb3BlbnMxOwkJCS8qIDB4MUMgTnVtYmVyIG9mIG9wZW4gcG9ydHMgb24gZmlyc3QgZm91ciBwb3J0cyBvbiBNVEEvU1hEQyAqLworCUJZVEUJbWNfb3BlbnMyOwkJCS8qIDB4MUQgTnVtYmVyIG9mIG9wZW4gcG9ydHMgb24gc2Vjb25kIGZvdXIgcG9ydHMgb24gTVRBL1NYREMgKi8KKwlCWVRFCW1jX21vZHM7CQkJLyogMHgxRSBUeXBlcyBvZiBjb25uZWN0b3IgbW9kdWxlIGF0dGFjaGVkIHRvIE1UQS9TWERDICovCisJQllURQltY19yZXYxOwkJCS8qIDB4MUYgUmV2aXNpb24gb2YgZmlyc3QgQ0QxNDAwIG9uIE1UQS9TWERDICovCisJQllURQltY19yZXYyOwkJCS8qIDB4MjAgUmV2aXNpb24gb2Ygc2Vjb25kIENEMTQwMCBvbiBNVEEvU1hEQyAqLworCUJZVEUJbWNfbXRhYXNpY19yZXY7CQkJLyogMHgyMSBSZXZpc2lvbiBvZiBNVEEgQVNJQyAxLi40IC0+IEEsIEIsIEMsIEQgKi8KKwlCWVRFCW1jX3JmdTNbMHgxMDAgLSAweDIyXTsJCS8qIDB4MjIgUGFkIHN0cnVjdHVyZSB0byAyNTYgYnl0ZXMgKDB4MTAwKSAqLworCit9IFNYTU9EVUxFOworCisvKiBTWE1PRFVMRS5tY190eXBlIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlGT1VSX1BPUlRTCShCWVRFKTQKKyNkZWZpbmUgCUVJR0hUX1BPUlRTCShCWVRFKTgKKworLyogU1hNT0RVTEUubWNfY2hpcCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZSAJQ0hJUF9NQVNLCTB4RjAKKyNkZWZpbmUJCVRBCQkoQllURSkwCisjZGVmaW5lIAlUQTQJCShUQSB8IEZPVVJfUE9SVFMpCisjZGVmaW5lIAlUQTgJCShUQSB8IEVJR0hUX1BPUlRTKQorI2RlZmluZQkJVEE0X0FTSUMJKEJZVEUpMHgwQQorI2RlZmluZQkJVEE4X0FTSUMJKEJZVEUpMHgwQgorI2RlZmluZSAJTVRBX0NEMTQwMAkoQllURSkweDI4CisjZGVmaW5lIAlTWERDCQkoQllURSkweDQ4CisKKy8qIFNYTU9EVUxFLm1jX21vZHMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCU1PRF9SUzIzMkRCMjUJMHgwMAkJLyogUlMyMzIgREIyNSAoc29ja2V0L3BsdWcpICovCisjZGVmaW5lCQlNT0RfUlMyMzJSSjQ1CTB4MDEJCS8qIFJTMjMyIFJKNDUgKHNoaWVsZGVkL29wdG8taXNvbGF0ZWQpICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfMgkweDAyCQkvKiBSZXNlcnZlZCAoUlM0ODUpICovCisjZGVmaW5lCQlNT0RfUlM0MjJEQjI1CTB4MDMJCS8qIFJTNDIyIERCMjUgU29ja2V0ICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfNAkweDA0CQkvKiBSZXNlcnZlZCAqLworI2RlZmluZQkJTU9EX1BBUkFMTEVMCTB4MDUJCS8qIFBhcmFsbGVsICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfNgkweDA2CQkvKiBSZXNlcnZlZCAoUlM0MjMpICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfNwkweDA3CQkvKiBSZXNlcnZlZCAqLworI2RlZmluZQkJTU9EXzJfUlMyMzJEQjI1CTB4MDgJCS8qIFJldiAyLjAgUlMyMzIgREIyNSAoc29ja2V0L3BsdWcpICovCisjZGVmaW5lCQlNT0RfMl9SUzIzMlJKNDUJMHgwOQkJLyogUmV2IDIuMCBSUzIzMiBSSjQ1ICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfQQkweDBBCQkvKiBSZXYgMi4wIFJlc2VydmVkICovCisjZGVmaW5lCQlNT0RfMl9SUzQyMkRCMjUJMHgwQgkJLyogUmV2IDIuMCBSUzQyMiBEQjI1ICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfQwkweDBDCQkvKiBSZXYgMi4wIFJlc2VydmVkICovCisjZGVmaW5lCQlNT0RfMl9QQVJBTExFTAkweDBECQkvKiBSZXYgMi4wIFBhcmFsbGVsICovCisjZGVmaW5lCQlNT0RfUkVTRVJWRURfRQkweDBFCQkvKiBSZXYgMi4wIFJlc2VydmVkICovCisjZGVmaW5lCQlNT0RfQkxBTksJMHgwRgkJLyogQmxhbmsgUGFuZWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgU1hDSEFOTkVMICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQkJVFhfQlVGRl9PRkZTRVQJCTB4NjAJLyogVHJhbnNtaXQgYnVmZmVyIG9mZnNldCBpbiBjaGFubmVsIHN0cnVjdHVyZSAqLworI2RlZmluZQkJQlVGRl9QT0lOVEVSKGEpCQkoKChhKStUWF9CVUZGX09GRlNFVCl8MHg4MDAwKQorI2RlZmluZQkJVU5CVUZGX1BPSU5URVIoYSkJKGpldF9jaGFubmVsKikoKChhKSZ+MHg4MDAwKS1UWF9CVUZGX09GRlNFVCkgCisjZGVmaW5lIAlCVUZGRVJfU0laRQkJMjU2CisjZGVmaW5lIAlISUdIX1dBVEVSCQkoKEJVRkZFUl9TSVpFIC8gNCkgKiAzKQorI2RlZmluZSAJTE9XX1dBVEVSCQkoQlVGRkVSX1NJWkUgLyA0KQorCit0eXBlZGVmCXN0cnVjdAlfU1hDSEFOTkVMCit7CisJV09SRAluZXh0X2l0ZW07CQkJLyogMHgwMCBPZmZzZXQgZnJvbSB3aW5kb3cgYmFzZSBvZiBuZXh0IGNoYW5uZWxzIGhpX3R4YnVmIChPUnJlZCB3aXRoIDB4ODAwMCkgKi8KKwlXT1JEIAlhZGRyX3VhcnQ7CQkJLyogMHgwMiBJTlRFUk5BTCBwb2ludGVyIHRvIHVhcnQgYWRkcmVzcy4gSW5jbHVkZXMgRkFTVFBBVEggYml0ICovCisJV09SRAltb2R1bGU7CQkJCS8qIDB4MDQgT2Zmc2V0IGZyb20gd2luZG93IGJhc2Ugb2YgcGFyZW50IFNYTU9EVUxFIHN0cnVjdHVyZSAqLworCUJZVEUgCXR5cGU7CQkJCS8qIDB4MDYgQ2hpcCB0eXBlIC8gbnVtYmVyIG9mIHBvcnRzIChjb3B5IG9mIG1jX2NoaXApICovCisJQllURQljaGFuX251bWJlcjsJCQkvKiAweDA3IENoYW5uZWwgbnVtYmVyIG9uIHRoZSBUQS9NVEEvU1hEQyAqLworCVdPUkQJeGNfc3RhdHVzOwkJCS8qIDB4MDggRmxvdyBjb250cm9sIGFuZCBJL08gc3RhdHVzICovCisJQllURQloaV9yeGlwb3M7CQkJLyogMHgwQSBSZWNlaXZlIGJ1ZmZlciBpbnB1dCBpbmRleCAqLworCUJZVEUJaGlfcnhvcG9zOwkJCS8qIDB4MEIgUmVjZWl2ZSBidWZmZXIgb3V0cHV0IGluZGV4ICovCisJQllURQloaV90eG9wb3M7CQkJLyogMHgwQyBUcmFuc21pdCBidWZmZXIgb3V0cHV0IGluZGV4ICovCisJQllURQloaV90eGlwb3M7CQkJLyogMHgwRCBUcmFuc21pdCBidWZmZXIgaW5wdXQgaW5kZXggKi8KKwlCWVRFCWhpX2hzdGF0OwkJCS8qIDB4MEUgQ29tbWFuZCByZWdpc3RlciAqLworCUJZVEUJZHRyX2JpdDsJCQkvKiAweDBGIElOVEVSTkFMIERUUiBjb250cm9sIGJ5dGUgKFRBIG9ubHkpICovCisJQllURQl0eG9uOwkJCQkvKiAweDEwIElOVEVSTkFMIGNvcHkgb2YgaGlfdHhvbiAqLworCUJZVEUJdHhvZmY7CQkJCS8qIDB4MTEgSU5URVJOQUwgY29weSBvZiBoaV90eG9mZiAqLworCUJZVEUJcnhvbjsJCQkJLyogMHgxMiBJTlRFUk5BTCBjb3B5IG9mIGhpX3J4b24gKi8KKwlCWVRFCXJ4b2ZmOwkJCQkvKiAweDEzIElOVEVSTkFMIGNvcHkgb2YgaGlfcnhvZmYgKi8KKwlCWVRFCWhpX21yMTsJCQkJLyogMHgxNCBNb2RlIFJlZ2lzdGVyIDEgKGRhdGFiaXRzLHBhcml0eSxSVFMgcnggZmxvdykqLworCUJZVEUJaGlfbXIyOwkJCQkvKiAweDE1IE1vZGUgUmVnaXN0ZXIgMiAoc3RvcGJpdHMsbG9jYWwsQ1RTIHR4IGZsb3cpKi8KKwlCWVRFCWhpX2NzcjsJCQkJLyogMHgxNiBDbG9jayBTZWxlY3QgUmVnaXN0ZXIgKGJhdWQgcmF0ZSkgKi8KKwlCWVRFCWhpX29wOwkJCQkvKiAweDE3IE1vZGVtIE91dHB1dCBTaWduYWwgKi8KKwlCWVRFCWhpX2lwOwkJCQkvKiAweDE4IE1vZGVtIElucHV0IFNpZ25hbCAqLworCUJZVEUJaGlfc3RhdGU7CQkJLyogMHgxOSBDaGFubmVsIHN0YXR1cyAqLworCUJZVEUJaGlfcHJ0Y2w7CQkJLyogMHgxQSBDaGFubmVsIHByb3RvY29sIChmbG93IGNvbnRyb2wpICovCisJQllURQloaV90eG9uOwkJCS8qIDB4MUIgVHJhbnNtaXQgWE9OIGNoYXJhY3RlciAqLworCUJZVEUJaGlfdHhvZmY7CQkJLyogMHgxQyBUcmFuc21pdCBYT0ZGIGNoYXJhY3RlciAqLworCUJZVEUJaGlfcnhvbjsJCQkvKiAweDFEIFJlY2VpdmUgWE9OIGNoYXJhY3RlciAqLworCUJZVEUJaGlfcnhvZmY7CQkJLyogMHgxRSBSZWNlaXZlIFhPRkYgY2hhcmFjdGVyICovCisJQllURQljbG9zZV9wcmV2OwkJCS8qIDB4MUYgSU5URVJOQUwgY2hhbm5lbCBwcmV2aW91c2x5IGNsb3NlZCBmbGFnICovCisJQllURQloaV9icmVhazsJCQkvKiAweDIwIEJyZWFrIGFuZCBlcnJvciBjb250cm9sICovCisJQllURQlicmVha19zdGF0ZTsJCQkvKiAweDIxIElOVEVSTkFMIGNvcHkgb2YgaGlfYnJlYWsgKi8KKwlCWVRFCWhpX21hc2s7CQkJLyogMHgyMiBNYXNrIGZvciByZWNlaXZlZCBkYXRhICovCisJQllURQltYXNrOwkJCQkvKiAweDIzIElOVEVSTkFMIGNvcHkgb2YgaGlfbWFzayAqLworCUJZVEUJbW9kX3R5cGU7CQkJLyogMHgyNCBNVEEvU1hEQyBoYXJkd2FyZSBtb2R1bGUgdHlwZSAqLworCUJZVEUJY2NyX3N0YXRlOwkJCS8qIDB4MjUgSU5URVJOQUwgTVRBL1NYREMgc3RhdGUgb2YgQ0NSIHJlZ2lzdGVyICovCisJQllURQlpcF9tYXNrOwkJCS8qIDB4MjYgSW5wdXQgaGFuZHNoYWtlIG1hc2sgKi8KKwlCWVRFCWhpX3BhcmFsbGVsOwkJCS8qIDB4MjcgUGFyYWxsZWwgcG9ydCBmbGFnICovCisJQllURQlwYXJfZXJyb3I7CQkJLyogMHgyOCBFcnJvciBjb2RlIGZvciBwYXJhbGxlbCBsb29wYmFjayB0ZXN0ICovCisJQllURQlhbnlfc2VudDsJCQkvKiAweDI5IElOVEVSTkFMIGRhdGEgc2VudCBmbGFnICovCisJQllURQlhc2ljX3R4Zmlmb19zaXplOwkJLyogMHgyQSBJTlRFUk5BTCBTWERDIHRyYW5zbWl0IEZJRk8gc2l6ZSAqLworCUJZVEUJcmZ1MVsyXTsJCQkvKiAweDJCIFJlc2VydmVkICovCisJQllURQljc3I7CQkJCS8qIDB4MkQgSU5URVJOQUwgY29weSBvZiBoaV9jc3IgKi8KKyNpZmRlZglET1dOTE9BRAorCVBDSEFOCW5leHRwOwkJCQkvKiAweDJFIE9mZnNldCBmcm9tIHdpbmRvdyBiYXNlIG9mIG5leHQgY2hhbm5lbCBzdHJ1Y3R1cmUgKi8KKyNlbHNlCisJV09SRAluZXh0cDsJCQkJLyogMHgyRSBEZWZpbmUgYXMgV09SRCBpZiBub3QgY29tcGlsaW5nIGludG8gZG93bmxvYWQgKi8KKyNlbmRpZgorCUJZVEUJcHJ0Y2w7CQkJCS8qIDB4MzAgSU5URVJOQUwgY29weSBvZiBoaV9wcnRjbCAqLworCUJZVEUJbXIxOwkJCQkvKiAweDMxIElOVEVSTkFMIGNvcHkgb2YgaGlfbXIxICovCisJQllURQltcjI7CQkJCS8qIDB4MzIgSU5URVJOQUwgY29weSBvZiBoaV9tcjIgKi8KKwlCWVRFCWhpX3R4YmF1ZDsJCQkvKiAweDMzIEV4dGVuZGVkIHRyYW5zbWl0IGJhdWQgcmF0ZSAoU1hEQyBvbmx5IGlmKChoaV9jc3ImMHgwRik9PTB4MEYpICovCisJQllURQloaV9yeGJhdWQ7CQkJLyogMHgzNCBFeHRlbmRlZCByZWNlaXZlIGJhdWQgcmF0ZSAgKFNYREMgb25seSBpZigoaGlfY3NyJjB4RjApPT0weEYwKSAqLworCUJZVEUJdHhicmVha19zdGF0ZTsJCQkvKiAweDM1IElOVEVSTkFMIE1UQS9TWERDIHRyYW5zbWl0IGJyZWFrIHN0YXRlICovCisJQllURQl0eGJhdWQ7CQkJCS8qIDB4MzYgSU5URVJOQUwgY29weSBvZiBoaV90eGJhdWQgKi8KKwlCWVRFCXJ4YmF1ZDsJCQkJLyogMHgzNyBJTlRFUk5BTCBjb3B5IG9mIGhpX3J4YmF1ZCAqLworCVdPUkQJZXJyX2ZyYW1pbmc7CQkJLyogMHgzOCBDb3VudCBvZiByZWNlaXZlIGZyYW1pbmcgZXJyb3JzICovCisJV09SRAllcnJfcGFyaXR5OwkJCS8qIDB4M0EgQ291bnQgb2YgcmVjZWl2ZSBwYXJpdHkgZXJyb3JzICovCisJV09SRAllcnJfb3ZlcnJ1bjsJCQkvKiAweDNDIENvdW50IG9mIHJlY2VpdmUgb3ZlcnJ1biBlcnJvcnMgKi8KKwlXT1JECWVycl9vdmVyZmxvdzsJCQkvKiAweDNFIENvdW50IG9mIHJlY2VpdmUgYnVmZmVyIG92ZXJmbG93IGVycm9ycyAqLworCUJZVEUJcmZ1MltUWF9CVUZGX09GRlNFVCAtIDB4NDBdOwkvKiAweDQwIFJlc2VydmVkIHVudGlsIGhpX3R4YnVmICovCisJQllURQloaV90eGJ1ZltCVUZGRVJfU0laRV07CQkvKiAweDA2MCBUcmFuc21pdCBidWZmZXIgKi8KKwlCWVRFCWhpX3J4YnVmW0JVRkZFUl9TSVpFXTsJCS8qIDB4MTYwIFJlY2VpdmUgYnVmZmVyICovCisJQllURQlyZnUzWzB4MzAwIC0gMHgyNjBdOwkJLyogMHgyNjAgUmVzZXJ2ZWQgdW50aWwgNzY4IGJ5dGVzICgweDMwMCkgKi8KKworfSBTWENIQU5ORUw7CisKKy8qIFNYQ0hBTk5FTC5hZGRyX3VhcnQgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCUZBU1RQQVRICTB4MTAwMAkJLyogU2V0IHRvIGluZGljYXRlIGZhc3QgcngvdHggcHJvY2Vzc2luZyAoVEEgb25seSkgKi8KKworLyogU1hDSEFOTkVMLnhjX3N0YXR1cyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJWF9UQU5ZCQkweDAwMDEJCS8qIFhPTiBpcyBhbnkgY2hhcmFjdGVyIChUQSBvbmx5KSAqLworI2RlZmluZQkJWF9USU9OCQkweDAwMDEJCS8qIFR4IGludGVycnVwdHMgb24gKE1UQSBvbmx5KSAqLworI2RlZmluZQkJWF9UWEVOCQkweDAwMDIJCS8qIFR4IFhPTi9YT0ZGIGVuYWJsZWQgKFRBIG9ubHkpICovCisjZGVmaW5lCQlYX1JUU0VOCQkweDAwMDIJCS8qIFJUUyBGTE9XIGVuYWJsZWQgKE1UQSBvbmx5KSAqLworI2RlZmluZQkJWF9UWFJDCQkweDAwMDQJCS8qIFhPRkYgcmVjZWl2ZWQgKFRBIG9ubHkpICovCisjZGVmaW5lCQlYX1JUU0xPVwkweDAwMDQJCS8qIFJUUyBkcm9wcGVkIChNVEEgb25seSkgKi8KKyNkZWZpbmUJCVhfUlhFTgkJMHgwMDA4CQkvKiBSeCBYT04vWE9GRiBlbmFibGVkICovCisjZGVmaW5lCQlYX0FOWVhPCQkweDAwMTAJCS8qIFhPRkYgcGVuZGluZy9zZW50IG9yIFJUUyBkcm9wcGVkICovCisjZGVmaW5lCQlYX1JYU0UJCTB4MDAyMAkJLyogUnggWE9GRiBzZW50ICovCisjZGVmaW5lCQlYX05QRU5ECQkweDAwNDAJCS8qIFJ4IFhPTiBwZW5kaW5nIG9yIFhPRkYgcGVuZGluZyAqLworI2RlZmluZQkJWF9GUEVORAkJMHgwMDgwCQkvKiBSeCBYT0ZGIHBlbmRpbmcgKi8KKyNkZWZpbmUJCUNfQ1JTRQkJMHgwMTAwCQkvKiBDYXJyaWFnZSByZXR1cm4gc2VudCAoVEEgb25seSkgKi8KKyNkZWZpbmUJCUNfVEVNUgkJMHgwMTAwCQkvKiBUeCBlbXB0eSByZXF1ZXN0ZWQgKE1UQSBvbmx5KSAqLworI2RlZmluZQkJQ19URU1BCQkweDAyMDAJCS8qIFR4IGVtcHR5IGFja2VkIChNVEEgb25seSkgKi8KKyNkZWZpbmUJCUNfQU5ZUAkJMHgwMjAwCQkvKiBBbnkgcHJvdG9jb2wgYmFyIHR4IFhPTi9YT0ZGIChUQSBvbmx5KSAqLworI2RlZmluZQkJQ19FTgkJMHgwNDAwCQkvKiBDb29raW5nIGVuYWJsZWQgKG9uIE1UQSBtZWFucyBwb3J0IGlzIGFsc28gfHwgKi8KKyNkZWZpbmUJCUNfSElHSAkJMHgwODAwCQkvKiBCdWZmZXIgcHJldmlvdXNseSBoaXQgaGlnaCB3YXRlciAqLworI2RlZmluZQkJQ19DVFNFTgkJMHgxMDAwCQkvKiBDVFMgYXV0b21hdGljIGZsb3ctY29udHJvbCBlbmFibGVkICovCisjZGVmaW5lCQlDX0RDREVOCQkweDIwMDAJCS8qIERDRC9EVFIgY2hlY2tpbmcgZW5hYmxlZCAqLworI2RlZmluZQkJQ19CUkVBSwkJMHg0MDAwCQkvKiBCcmVhayBkZXRlY3RlZCAqLworI2RlZmluZQkJQ19SVFNFTgkJMHg4MDAwCQkvKiBSVFMgYXV0b21hdGljIGZsb3cgY29udHJvbCBlbmFibGVkIChNVEEgb25seSkgKi8KKyNkZWZpbmUJCUNfUEFSSVRZCTB4ODAwMAkJLyogUGFyaXR5IGNoZWNraW5nIGVuYWJsZWQgKFRBIG9ubHkpICovCisKKy8qIFNYQ0hBTk5FTC5oaV9oc3RhdCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJSFNfSURMRV9PUEVOCTB4MDAJCS8qIENoYW5uZWwgb3BlbiBzdGF0ZSAqLworI2RlZmluZQkJSFNfTE9QRU4JMHgwMgkJLyogTG9jYWwgb3BlbiBjb21tYW5kIChubyBtb2RlbSBtb25pdG9yaW5nKSAqLworI2RlZmluZQkJSFNfTU9QRU4JMHgwNAkJLyogTW9kZW0gb3BlbiBjb21tYW5kICh3YWl0IGZvciBEQ0Qgc2lnbmFsKSAqLworI2RlZmluZQkJSFNfSURMRV9NUEVORAkweDA2CQkvKiBXYWl0aW5nIGZvciBEQ0Qgc2lnbmFsIHN0YXRlICovCisjZGVmaW5lCQlIU19DT05GSUcJMHgwOAkJLyogQ29uZmlndXJhdGlvbiBjb21tYW5kICovCisjZGVmaW5lCQlIU19DTE9TRQkweDBBCQkvKiBDbG9zZSBjb21tYW5kICovCisjZGVmaW5lCQlIU19TVEFSVAkweDBDCQkvKiBTdGFydCB0cmFuc21pdCBicmVhayBjb21tYW5kICovCisjZGVmaW5lCQlIU19TVE9QCQkweDBFCQkvKiBTdG9wIHRyYW5zbWl0IGJyZWFrIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX0lETEVfQ0xPU0VECTB4MTAJCS8qIENsb3NlZCBjaGFubmVsIHN0YXRlICovCisjZGVmaW5lCQlIU19JRExFX0JSRUFLCTB4MTIJCS8qIFRyYW5zbWl0IGJyZWFrIHN0YXRlICovCisjZGVmaW5lCQlIU19GT1JDRV9DTE9TRUQJMHgxNAkJLyogRm9yY2UgY2xvc2UgY29tbWFuZCAqLworI2RlZmluZQkJSFNfUkVTVU1FCTB4MTYJCS8qIENsZWFyIHBlbmRpbmcgWE9GRiBjb21tYW5kICovCisjZGVmaW5lCQlIU19XRkxVU0gJMHgxOAkJLyogRmx1c2ggdHJhbnNtaXQgYnVmZmVyIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX1JGTFVTSAkweDFBCQkvKiBGbHVzaCByZWNlaXZlIGJ1ZmZlciBjb21tYW5kICovCisjZGVmaW5lCQlIU19TVVNQRU5ECTB4MUMJCS8qIFN1c3BlbmQgb3V0cHV0IGNvbW1hbmQgKGxpa2UgWE9GRiByZWNlaXZlZCkgKi8KKyNkZWZpbmUJCVBBUkFMTEVMCTB4MUUJCS8qIFBhcmFsbGVsIHBvcnQgbG9vcGJhY2sgdGVzdCBjb21tYW5kIChEaWFnbm9zdGljcyBPbmx5KSAqLworI2RlZmluZQkJRU5BQkxFX1JYX0lOVFMJMHgyMAkJLyogRW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0cyBjb21tYW5kIChEaWFnbm9zdGljcyBPbmx5KSAqLworI2RlZmluZQkJRU5BQkxFX1RYX0lOVFMJMHgyMgkJLyogRW5hYmxlIHRyYW5zbWl0IGludGVycnVwdHMgY29tbWFuZCAoRGlhZ25vc3RpY3MgT25seSkgKi8KKyNkZWZpbmUJCUVOQUJMRV9NRE1fSU5UUwkweDI0CQkvKiBFbmFibGUgbW9kZW0gaW50ZXJydXB0cyBjb21tYW5kIChEaWFnbm9zdGljcyBPbmx5KSAqLworI2RlZmluZQkJRElTQUJMRV9JTlRTCTB4MjYJCS8qIERpc2FibGUgaW50ZXJydXB0cyBjb21tYW5kIChEaWFnbm9zdGljcyBPbmx5KSAqLworCisvKiBTWENIQU5ORUwuaGlfbXIxIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlNUjFfQklUUwkweDAzCQkvKiBEYXRhIGJpdHMgbWFzayAqLworI2RlZmluZQkJTVIxXzVfQklUUwkweDAwCQkvKiA1IGRhdGEgYml0cyAqLworI2RlZmluZQkJTVIxXzZfQklUUwkweDAxCQkvKiA2IGRhdGEgYml0cyAqLworI2RlZmluZQkJTVIxXzdfQklUUwkweDAyCQkvKiA3IGRhdGEgYml0cyAqLworI2RlZmluZQkJTVIxXzhfQklUUwkweDAzCQkvKiA4IGRhdGEgYml0cyAqLworI2RlZmluZQkJTVIxX1BBUklUWQkweDFDCQkvKiBQYXJpdHkgbWFzayAqLworI2RlZmluZQkJTVIxX09ERAkJMHgwNAkJLyogT2RkIHBhcml0eSAqLworI2RlZmluZQkJTVIxX0VWRU4JMHgwMAkJLyogRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9XSVRICTB4MDAJCS8qIFBhcml0eSBlbmFibGVkICovCisjZGVmaW5lCQlNUjFfRk9SQ0UJMHgwOAkJLyogRm9yY2UgcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfTk9ORQkweDEwCQkvKiBObyBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9OT1BBUklUWQlNUjFfTk9ORQkJLyogTm8gcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfT0REUEFSSVRZCShNUjFfV0lUSHxNUjFfT0REKQkvKiBPZGQgcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfRVZFTlBBUklUWQkoTVIxX1dJVEh8TVIxX0VWRU4pCS8qIEV2ZW4gcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfTUFSS1BBUklUWQkoTVIxX0ZPUkNFfE1SMV9PREQpCS8qIE1hcmsgcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfU1BBQ0VQQVJJVFkJKE1SMV9GT1JDRXxNUjFfRVZFTikJLyogU3BhY2UgcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfUlRTX1JYRkxPVwkweDgwCQkvKiBSVFMgcmVjZWl2ZSBmbG93IGNvbnRyb2wgKi8KKworLyogU1hDSEFOTkVMLmhpX21yMiBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJTVIyX1NUT1AJMHgwRgkJLyogU3RvcCBiaXRzIG1hc2sgKi8KKyNkZWZpbmUJCU1SMl8xX1NUT1AJMHgwNwkJLyogMSBzdG9wIGJpdCAqLworI2RlZmluZQkJTVIyXzJfU1RPUAkweDBGCQkvKiAyIHN0b3AgYml0cyAqLworI2RlZmluZQkJTVIyX0NUU19UWEZMT1cJMHgxMAkJLyogQ1RTIHRyYW5zbWl0IGZsb3cgY29udHJvbCAqLworI2RlZmluZQkJTVIyX1JUU19UT0dHTEUJMHgyMAkJLyogUlRTIHRvZ2dsZSBvbiB0cmFuc21pdCAqLworI2RlZmluZQkJTVIyX05PUk1BTAkweDAwCQkvKiBOb3JtYWwgbW9kZSAqLworI2RlZmluZQkJTVIyX0FVVE8JMHg0MAkJLyogQXV0by1lY2hvIG1vZGUgKFRBIG9ubHkpICovCisjZGVmaW5lCQlNUjJfTE9DQUwJMHg4MAkJLyogTG9jYWwgZWNobyBtb2RlICovCisjZGVmaW5lCQlNUjJfUkVNT1RFCTB4QzAJCS8qIFJlbW90ZSBlY2hvIG1vZGUgKFRBIG9ubHkpICovCisKKy8qIFNYQ0hBTk5FTC5oaV9jc3IgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCUNTUl83NQkJMHgwCQkvKiAgICA3NSBiYXVkICovCisjZGVmaW5lCQlDU1JfMTEwCQkweDEJCS8qICAgMTEwIGJhdWQgKFRBKSwgMTE1MjAwIChNVEEvU1hEQykgKi8KKyNkZWZpbmUJCUNTUl8zODQwMAkweDIJCS8qIDM4NDAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl8xNTAJCTB4MwkJLyogICAxNTAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzMwMAkJMHg0CQkvKiAgIDMwMCBiYXVkICovCisjZGVmaW5lCQlDU1JfNjAwCQkweDUJCS8qICAgNjAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl8xMjAwCTB4NgkJLyogIDEyMDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzIwMDAJMHg3CQkvKiAgMjAwMCBiYXVkICovCisjZGVmaW5lCQlDU1JfMjQwMAkweDgJCS8qICAyNDAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl80ODAwCTB4OQkJLyogIDQ4MDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzE4MDAJMHhBCQkvKiAgMTgwMCBiYXVkICovCisjZGVmaW5lCQlDU1JfOTYwMAkweEIJCS8qICA5NjAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl8xOTIwMAkweEMJCS8qIDE5MjAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl81NzYwMAkweEQJCS8qIDU3NjAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl9FWFRCQVVECTB4RgkJLyogRXh0ZW5kZWQgYmF1ZCByYXRlIChoaV90eGJhdWQvaGlfcnhiYXVkKSAqLworCisvKiBTWENIQU5ORUwuaGlfb3AgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCU9QX1JUUwkJMHgwMQkJLyogUlRTIG1vZGVtIG91dHB1dCBzaWduYWwgKi8KKyNkZWZpbmUJCU9QX0RUUgkJMHgwMgkJLyogRFRSIG1vZGVtIG91dHB1dCBzaWduYWwgKi8KKworLyogU1hDSEFOTkVMLmhpX2lwIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlJUF9DVFMJCTB4MDIJCS8qIENUUyBtb2RlbSBpbnB1dCBzaWduYWwgKi8KKyNkZWZpbmUJCUlQX0RDRAkJMHgwNAkJLyogRENEIG1vZGVtIGlucHV0IHNpZ25hbCAqLworI2RlZmluZQkJSVBfRFNSCQkweDIwCQkvKiBEVFIgbW9kZW0gaW5wdXQgc2lnbmFsICovCisjZGVmaW5lCQlJUF9SSQkJMHg0MAkJLyogUkkgbW9kZW0gaW5wdXQgc2lnbmFsICovCisKKy8qIFNYQ0hBTk5FTC5oaV9zdGF0ZSBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJU1RfQlJFQUsJMHgwMQkJLyogQnJlYWsgcmVjZWl2ZWQgKGNsZWFyIHdpdGggY29uZmlnKSAqLworI2RlZmluZQkJU1RfRENECQkweDAyCQkvKiBEQ0Qgc2lnbmFsIGNoYW5nZWQgc3RhdGUgKi8KKworLyogU1hDSEFOTkVMLmhpX3BydGNsIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTUF9UQU5ZCQkweDAxCQkvKiBUcmFuc21pdCBYT04vWEFOWSAoaWYgU1BfVFhFTiBlbmFibGVkKSAqLworI2RlZmluZQkJU1BfVFhFTgkJMHgwMgkJLyogVHJhbnNtaXQgWE9OL1hPRkYgZmxvdyBjb250cm9sICovCisjZGVmaW5lCQlTUF9DRU4JCTB4MDQJCS8qIENvb2tpbmcgZW5hYmxlZCAqLworI2RlZmluZQkJU1BfUlhFTgkJMHgwOAkJLyogUnggWE9OL1hPRkYgZW5hYmxlZCAqLworI2RlZmluZQkJU1BfRENFTgkJMHgyMAkJLyogRENEIC8gRFRSIGNoZWNrICovCisjZGVmaW5lCQlTUF9EVFJfUlhGTE9XCTB4NDAJCS8qIERUUiByZWNlaXZlIGZsb3cgY29udHJvbCAqLworI2RlZmluZQkJU1BfUEFFTgkJMHg4MAkJLyogUGFyaXR5IGNoZWNraW5nIGVuYWJsZWQgKi8KKworLyogU1hDSEFOTkVMLmhpX2JyZWFrIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlCUl9JR04JCTB4MDEJCS8qIElnbm9yZSBhbnkgcmVjZWl2ZWQgYnJlYWtzICovCisjZGVmaW5lCQlCUl9JTlQJCTB4MDIJCS8qIEludGVycnVwdCBvbiByZWNlaXZlZCBicmVhayAqLworI2RlZmluZQkJQlJfUEFSTVJLCTB4MDQJCS8qIEVuYWJsZSBwYXJtcmsgcGFyaXR5IGVycm9yIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUJCUJSX1BBUklHTgkweDA4CQkvKiBJZ25vcmUgY2hhcnMgd2l0aCBwYXJpdHkgZXJyb3JzICovCisjZGVmaW5lIAlCUl9FUlJJTlQJMHg4MAkJLyogVHJlYXQgcGFyaXR5L2ZyYW1pbmcvb3ZlcnJ1biBlcnJvcnMgYXMgZXhjZXB0aW9ucyAqLworCisvKiBTWENIQU5ORUwucGFyX2Vycm9yIGRlZmluaXRpb25zLi4gKi8KKyNkZWZpbmUJCURJQUdfSVJRX1JYCTB4MDEJCS8qIEluZGljYXRlIHNlcmlhbCByZWNlaXZlIGludGVycnVwdCAoZGlhZ3Mgb25seSkgKi8KKyNkZWZpbmUJCURJQUdfSVJRX1RYCTB4MDIJCS8qIEluZGljYXRlIHNlcmlhbCB0cmFuc21pdCBpbnRlcnJ1cHQgKGRpYWdzIG9ubHkpICovCisjZGVmaW5lCQlESUFHX0lSUV9NRAkweDA0CQkvKiBJbmRpY2F0ZSBzZXJpYWwgbW9kZW0gaW50ZXJydXB0IChkaWFncyBvbmx5KSAqLworCisvKiBTWENIQU5ORUwuaGlfdHhiYXVkL2hpX3J4YmF1ZCBkZWZpbml0aW9ucy4uLiAoU1hEQyBvbmx5KSAqLworI2RlZmluZQkJQkFVRF83NQkJMHgwMAkJLyogICAgIDc1IGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTE1MjAwCTB4MDEJCS8qIDExNTIwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzM4NDAwCTB4MDIJCS8qICAzODQwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzE1MAkweDAzCQkvKiAgICAxNTAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8zMDAJMHgwNAkJLyogICAgMzAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNjAwCTB4MDUJCS8qICAgIDYwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzEyMDAJMHgwNgkJLyogICAxMjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMjAwMAkweDA3CQkvKiAgIDIwMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8yNDAwCTB4MDgJCS8qICAgMjQwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzQ4MDAJMHgwOQkJLyogICA0ODAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTgwMAkweDBBCQkvKiAgIDE4MDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF85NjAwCTB4MEIJCS8qICAgOTYwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzE5MjAwCTB4MEMJCS8qICAxOTIwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzU3NjAwCTB4MEQJCS8qICA1NzYwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzIzMDQwMAkweDBFCQkvKiAyMzA0MDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF80NjA4MDAJMHgwRgkJLyogNDYwODAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfOTIxNjAwCTB4MTAJCS8qIDkyMTYwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzUwCQkweDExICAgIAkvKiAgICAgNTAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8xMTAJMHgxMgkJLyogICAgMTEwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTM0XzUJMHgxMwkJLyogIDEzNC41IGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMjAwCTB4MTQJCS8qICAgIDIwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzcyMDAJMHgxNQkJLyogICA3MjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNTYwMDAJMHgxNgkJLyogIDU2MDAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNjQwMDAJMHgxNwkJLyogIDY0MDAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNzY4MDAJMHgxOAkJLyogIDc2ODAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTI4MDAwCTB4MTkJCS8qIDEyODAwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzE1MDAwMAkweDFBCQkvKiAxNTAwMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8xNDQwMAkweDFCCQkvKiAgMTQ0MDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8yNTYwMDAJMHgxQwkJLyogMjU2MDAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMjg4MDAJMHgxRAkJLyogIDI4ODAwIGJhdWQgKi8KKworLyogU1hDSEFOTkVMLnR4YnJlYWtfc3RhdGUgZGVmaW5paW9ucy4uLiAqLworI2RlZmluZQkJVFhCUkVBS19PRkYJMAkJLyogTm90IHNlbmRpbmcgYnJlYWsgKi8KKyNkZWZpbmUJCVRYQlJFQUtfU1RBUlQJMQkJLyogQmVnaW4gc2VuZGluZyBicmVhayAqLworI2RlZmluZQkJVFhCUkVBS19TVEFSVDEJMgkJLyogQmVnaW4gc2VuZGluZyBicmVhaywgcGFydCAxICovCisjZGVmaW5lCQlUWEJSRUFLX09OCTMJCS8qIFNlbmRpbmcgYnJlYWsgKi8KKyNkZWZpbmUJCVRYQlJFQUtfU1RPUAk0CQkvKiBTdG9wIHNlbmRpbmcgYnJlYWsgKi8KKyNkZWZpbmUJCVRYQlJFQUtfU1RPUDEJNQkJLyogU3RvcCBzZW5kaW5nIGJyZWFrLCBwYXJ0IDEgKi8KKworI2VuZGlmCQkJCQkJLyogX3N4d2luZG93X2ggKi8KKworLyogRW5kIG9mIFNYV0lORE9XLkggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M4YmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKQEAgLTAsMCArMSw4MjE0IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKKyAqCisgKiAkSWQ6IHN5bmNsaW5rLmMsdiA0LjI4IDIwMDQvMDgvMTEgMTk6MzA6MDEgcGF1bGtmIEV4cCAkCisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgTWljcm9nYXRlIFN5bmNMaW5rIElTQSBhbmQgUENJCisgKiBoaWdoIHNwZWVkIG11bHRpcHJvdG9jb2wgc2VyaWFsIGFkYXB0ZXJzLgorICoKKyAqIHdyaXR0ZW4gYnkgUGF1bCBGdWxnaHVtIGZvciBNaWNyb2dhdGUgQ29ycG9yYXRpb24KKyAqIHBhdWxrZkBtaWNyb2dhdGUuY29tCisgKgorICogTWljcm9nYXRlIGFuZCBTeW5jTGluayBhcmUgdHJhZGVtYXJrcyBvZiBNaWNyb2dhdGUgQ29ycG9yYXRpb24KKyAqCisgKiBEZXJpdmVkIGZyb20gc2VyaWFsLmMgd3JpdHRlbiBieSBUaGVvZG9yZSBUcydvIGFuZCBMaW51cyBUb3J2YWxkcworICoKKyAqIE9yaWdpbmFsIHJlbGVhc2UgMDEvMTEvOTkKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKgorICogVGhpcyBkcml2ZXIgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2UgaW4gc3luY2hyb25vdXMKKyAqIEhETEMgbW9kZS4gQXN5bmNocm9ub3VzIG1vZGUgaXMgYWxzbyBwcm92aWRlZC4KKyAqCisgKiBXaGVuIG9wZXJhdGluZyBpbiBzeW5jaHJvbm91cyBtb2RlLCBlYWNoIGNhbGwgdG8gbWdzbF93cml0ZSgpCisgKiBjb250YWlucyBleGFjdGx5IG9uZSBjb21wbGV0ZSBIRExDIGZyYW1lLiBDYWxsaW5nIG1nc2xfcHV0X2NoYXIKKyAqIHdpbGwgc3RhcnQgYXNzZW1ibGluZyBhbiBIRExDIGZyYW1lIHRoYXQgd2lsbCBub3QgYmUgc2VudCB1bnRpbAorICogbWdzbF9mbHVzaF9jaGFycyBvciBtZ3NsX3dyaXRlIGlzIGNhbGxlZC4KKyAqIAorICogU3luY2hyb25vdXMgcmVjZWl2ZSBkYXRhIGlzIHJlcG9ydGVkIGFzIGNvbXBsZXRlIGZyYW1lcy4gVG8gYWNjb21wbGlzaAorICogdGhpcywgdGhlIFRUWSBmbGlwIGJ1ZmZlciBpcyBieXBhc3NlZCAodG9vIHNtYWxsIHRvIGhvbGQgbGFyZ2VzdAorICogZnJhbWUgYW5kIG1heSBmcmFnbWVudCBmcmFtZXMpIGFuZCB0aGUgbGluZSBkaXNjaXBsaW5lCisgKiByZWNlaXZlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCBkaXJlY3RseS4KKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBhIHNsaWdodGx5IG1vZGlmaWVkIHBwcC5jIGRyaXZlcgorICogZm9yIHN5bmNocm9ub3VzIFBQUC4KKyAqCisgKiAyMDAwLzAyLzE2CisgKiBBZGRlZCBpbnRlcmZhY2UgZm9yIHN5bmNwcHAuYyBkcml2ZXIgKGFuIGFsdGVybmF0ZSBzeW5jaHJvbm91cyBQUFAKKyAqIGltcGxlbWVudGF0aW9uIHRoYXQgYWxzbyBzdXBwb3J0cyBDaXNjbyBIRExDKS4gRWFjaCBkZXZpY2UgaW5zdGFuY2UKKyAqIHJlZ2lzdGVycyBhcyBhIHR0eSBkZXZpY2UgQU5EIGEgbmV0d29yayBkZXZpY2UgKGlmIGRvc3luY3BwcCBvcHRpb24KKyAqIGlzIHNldCBmb3IgdGhlIGRldmljZSkuIFRoZSBmdW5jdGlvbmFsaXR5IGlzIGRldGVybWluZWQgYnkgd2hpY2gKKyAqIGRldmljZSBpbnRlcmZhY2UgaXMgb3BlbmVkLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyMgIGRlZmluZSBCUkVBS1BPSU5UKCkgYXNtKCIgICBpbnQgJDMiKTsKKyNlbHNlCisjICBkZWZpbmUgQlJFQUtQT0lOVCgpIHsgfQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0lTQV9ERVZJQ0VTIDEwCisjZGVmaW5lIE1BWF9QQ0lfREVWSUNFUyAxMAorI2RlZmluZSBNQVhfVE9UQUxfREVWSUNFUyAyMAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworI2lmZGVmIENPTkZJR19IRExDX01PRFVMRQorI2RlZmluZSBDT05GSUdfSERMQyAxCisjZW5kaWYKKworI2RlZmluZSBHRVRfVVNFUihlcnJvcix2YWx1ZSxhZGRyKSBlcnJvciA9IGdldF91c2VyKHZhbHVlLGFkZHIpCisjZGVmaW5lIENPUFlfRlJPTV9VU0VSKGVycm9yLGRlc3Qsc3JjLHNpemUpIGVycm9yID0gY29weV9mcm9tX3VzZXIoZGVzdCxzcmMsc2l6ZSkgPyAtRUZBVUxUIDogMAorI2RlZmluZSBQVVRfVVNFUihlcnJvcix2YWx1ZSxhZGRyKSBlcnJvciA9IHB1dF91c2VyKHZhbHVlLGFkZHIpCisjZGVmaW5lIENPUFlfVE9fVVNFUihlcnJvcixkZXN0LHNyYyxzaXplKSBlcnJvciA9IGNvcHlfdG9fdXNlcihkZXN0LHNyYyxzaXplKSA/IC1FRkFVTFQgOiAwCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibGludXgvc3luY2xpbmsuaCIKKworI2RlZmluZSBSQ0xSVkFMVUUgMHhmZmZmCisKK3N0YXRpYyBNR1NMX1BBUkFNUyBkZWZhdWx0X3BhcmFtcyA9IHsKKwlNR1NMX01PREVfSERMQywJCQkvKiB1bnNpZ25lZCBsb25nIG1vZGUgKi8KKwkwLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGxvb3BiYWNrOyAqLworCUhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1LAkvKiB1bnNpZ25lZCBzaG9ydCBmbGFnczsgKi8KKwlIRExDX0VOQ09ESU5HX05SWklfU1BBQ0UsCS8qIHVuc2lnbmVkIGNoYXIgZW5jb2Rpbmc7ICovCisJMCwJCQkJLyogdW5zaWduZWQgbG9uZyBjbG9ja19zcGVlZDsgKi8KKwkweGZmLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGFkZHJfZmlsdGVyOyAqLworCUhETENfQ1JDXzE2X0NDSVRULAkJLyogdW5zaWduZWQgc2hvcnQgY3JjX3R5cGU7ICovCisJSERMQ19QUkVBTUJMRV9MRU5HVEhfOEJJVFMsCS8qIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVfbGVuZ3RoOyAqLworCUhETENfUFJFQU1CTEVfUEFUVEVSTl9OT05FLAkvKiB1bnNpZ25lZCBjaGFyIHByZWFtYmxlOyAqLworCTk2MDAsCQkJCS8qIHVuc2lnbmVkIGxvbmcgZGF0YV9yYXRlOyAqLworCTgsCQkJCS8qIHVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOyAqLworCTEsCQkJCS8qIHVuc2lnbmVkIGNoYXIgc3RvcF9iaXRzOyAqLworCUFTWU5DX1BBUklUWV9OT05FCQkvKiB1bnNpZ25lZCBjaGFyIHBhcml0eTsgKi8KK307CisKKyNkZWZpbmUgU0hBUkVEX01FTV9BRERSRVNTX1NJWkUgMHg0MDAwMAorI2RlZmluZSBCVUZGRVJMSVNUU0laRSAoUEFHRV9TSVpFKQorI2RlZmluZSBETUFCVUZGRVJTSVpFIChQQUdFX1NJWkUpCisjZGVmaW5lIE1BWFJYRlJBTUVTIDcKKwordHlwZWRlZiBzdHJ1Y3QgX0RNQUJVRkZFUkVOVFJZCit7CisJdTMyIHBoeXNfYWRkcjsJLyogMzItYml0IGZsYXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAqLworCXUxNiBjb3VudDsJLyogYnVmZmVyIHNpemUvZGF0YSBjb3VudCAqLworCXUxNiBzdGF0dXM7CS8qIENvbnRyb2wvc3RhdHVzIGZpZWxkICovCisJdTE2IHJjYzsJLyogY2hhcmFjdGVyIGNvdW50IGZpZWxkICovCisJdTE2IHJlc2VydmVkOwkvKiBwYWRkaW5nIHJlcXVpcmVkIGJ5IDE2QzMyICovCisJdTMyIGxpbms7CS8qIDMyLWJpdCBmbGF0IGxpbmsgdG8gbmV4dCBidWZmZXIgZW50cnkgKi8KKwljaGFyICp2aXJ0X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAqLworCXUzMiBwaHlzX2VudHJ5OwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgYnVmZmVyIGVudHJ5ICovCit9IERNQUJVRkZFUkVOVFJZLCAqRE1BUEJVRkZFUkVOVFJZOworCisvKiBUaGUgcXVldWUgb2YgQkggYWN0aW9ucyB0byBiZSBwZXJmb3JtZWQgKi8KKworI2RlZmluZSBCSF9SRUNFSVZFICAxCisjZGVmaW5lIEJIX1RSQU5TTUlUIDIKKyNkZWZpbmUgQkhfU1RBVFVTICAgNAorCisjZGVmaW5lIElPX1BJTl9TSFVURE9XTl9MSU1JVCAxMDAKKworI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCisKK3N0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyB7CisJaW50CXJpX3VwOwkKKwlpbnQJcmlfZG93bjsKKwlpbnQJZHNyX3VwOworCWludAlkc3JfZG93bjsKKwlpbnQJZGNkX3VwOworCWludAlkY2RfZG93bjsKKwlpbnQJY3RzX3VwOworCWludAljdHNfZG93bjsKK307CisKKy8qIHRyYW5zbWl0IGhvbGRpbmcgYnVmZmVyIGRlZmluaXRpb25zKi8KKyNkZWZpbmUgTUFYX1RYX0hPTERJTkdfQlVGRkVSUyA1CitzdHJ1Y3QgdHhfaG9sZGluZ19idWZmZXIgeworCWludAlidWZmZXJfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICoJYnVmZmVyOworfTsKKworCisvKgorICogRGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKi8KKyAKK3N0cnVjdCBtZ3NsX3N0cnVjdCB7CisJaW50CQkJbWFnaWM7CisJaW50CQkJZmxhZ3M7CisJaW50CQkJY291bnQ7CQkvKiBjb3VudCBvZiBvcGVucyAqLworCWludAkJCWxpbmU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaHdfdmVyc2lvbjsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsJLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisJCisJc3RydWN0IG1nc2xfaWNvdW50CWljb3VudDsKKwkKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAJKnR0eTsKKwlpbnQJCQl0aW1lb3V0OworCWludAkJCXhfY2hhcjsJCS8qIHhvbi94b2ZmIGNoYXJhY3RlciAqLworCWludAkJCWJsb2NrZWRfb3BlbjsJLyogIyBvZiBibG9ja2VkIG9wZW5zICovCisJdTE2CQkJcmVhZF9zdGF0dXNfbWFzazsKKwl1MTYJCQlpZ25vcmVfc3RhdHVzX21hc2s7CQorCXVuc2lnbmVkIGNoYXIgCQkqeG1pdF9idWY7CisJaW50CQkJeG1pdF9oZWFkOworCWludAkJCXhtaXRfdGFpbDsKKwlpbnQJCQl4bWl0X2NudDsKKwkKKwl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsKKwkKKwl3YWl0X3F1ZXVlX2hlYWRfdAlzdGF0dXNfZXZlbnRfd2FpdF9xOworCXdhaXRfcXVldWVfaGVhZF90CWV2ZW50X3dhaXRfcTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0eF90aW1lcjsJLyogSERMQyB0cmFuc21pdCB0aW1lb3V0IHRpbWVyICovCisJc3RydWN0IG1nc2xfc3RydWN0CSpuZXh0X2RldmljZTsJLyogZGV2aWNlIGxpc3QgbGluayAqLworCQorCXNwaW5sb2NrX3QgaXJxX3NwaW5sb2NrOwkJLyogc3BpbmxvY2sgZm9yIHN5bmNocm9uaXppbmcgd2l0aCBJU1IgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsJCS8qIHRhc2sgc3RydWN0dXJlIGZvciBzY2hlZHVsaW5nIGJoICovCisKKwl1MzIgRXZlbnRNYXNrOwkJCS8qIGV2ZW50IHRyaWdnZXIgbWFzayAqLworCXUzMiBSZWNvcmRlZEV2ZW50czsJCS8qIHBlbmRpbmcgZXZlbnRzICovCisKKwl1MzIgbWF4X2ZyYW1lX3NpemU7CQkvKiBhcyBzZXQgYnkgZGV2aWNlIGNvbmZpZyAqLworCisJdTMyIHBlbmRpbmdfYmg7CisKKwlpbnQgYmhfcnVubmluZzsJCS8qIFByb3RlY3Rpb24gZnJvbSBtdWx0aXBsZSAqLworCWludCBpc3Jfb3ZlcmZsb3c7CisJaW50IGJoX3JlcXVlc3RlZDsKKwkKKwlpbnQgZGNkX2Noa2NvdW50OwkJLyogY2hlY2sgY291bnRzIHRvIHByZXZlbnQgKi8KKwlpbnQgY3RzX2Noa2NvdW50OwkJLyogdG9vIG1hbnkgSVJRcyBpZiBhIHNpZ25hbCAqLworCWludCBkc3JfY2hrY291bnQ7CQkvKiBpcyBmbG9hdGluZyAqLworCWludCByaV9jaGtjb3VudDsKKworCWNoYXIgKmJ1ZmZlcl9saXN0OwkJLyogdmlydHVhbCBhZGRyZXNzIG9mIFJ4ICYgVHggYnVmZmVyIGxpc3RzICovCisJdW5zaWduZWQgbG9uZyBidWZmZXJfbGlzdF9waHlzOworCisJdW5zaWduZWQgaW50IHJ4X2J1ZmZlcl9jb3VudDsJLyogY291bnQgb2YgdG90YWwgYWxsb2NhdGVkIFJ4IGJ1ZmZlcnMgKi8KKwlETUFCVUZGRVJFTlRSWSAqcnhfYnVmZmVyX2xpc3Q7CS8qIGxpc3Qgb2YgcmVjZWl2ZSBidWZmZXIgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBjdXJyZW50X3J4X2J1ZmZlcjsKKworCWludCBudW1fdHhfZG1hX2J1ZmZlcnM7CQkvKiBudW1iZXIgb2YgdHggZG1hIGZyYW1lcyByZXF1aXJlZCAqLworIAlpbnQgdHhfZG1hX2J1ZmZlcnNfdXNlZDsKKwl1bnNpZ25lZCBpbnQgdHhfYnVmZmVyX2NvdW50OwkvKiBjb3VudCBvZiB0b3RhbCBhbGxvY2F0ZWQgVHggYnVmZmVycyAqLworCURNQUJVRkZFUkVOVFJZICp0eF9idWZmZXJfbGlzdDsJLyogbGlzdCBvZiB0cmFuc21pdCBidWZmZXIgZW50cmllcyAqLworCWludCBzdGFydF90eF9kbWFfYnVmZmVyOwkvKiB0eCBkbWEgYnVmZmVyIHRvIHN0YXJ0IHR4IGRtYSBvcGVyYXRpb24gKi8KKwlpbnQgY3VycmVudF90eF9idWZmZXI7ICAgICAgICAgIC8qIG5leHQgdHggZG1hIGJ1ZmZlciB0byBiZSBsb2FkZWQgKi8KKwkKKwl1bnNpZ25lZCBjaGFyICppbnRlcm1lZGlhdGVfcnhidWZmZXI7CisKKwlpbnQgbnVtX3R4X2hvbGRpbmdfYnVmZmVyczsJLyogbnVtYmVyIG9mIHR4IGhvbGRpbmcgYnVmZmVyIGFsbG9jYXRlZCAqLworCWludCBnZXRfdHhfaG9sZGluZ19pbmRleDsgIAkvKiBuZXh0IHR4IGhvbGRpbmcgYnVmZmVyIGZvciBhZGFwdGVyIHRvIGxvYWQgKi8KKwlpbnQgcHV0X3R4X2hvbGRpbmdfaW5kZXg7ICAJLyogbmV4dCB0eCBob2xkaW5nIGJ1ZmZlciB0byBzdG9yZSB1c2VyIHJlcXVlc3QgKi8KKwlpbnQgdHhfaG9sZGluZ19jb3VudDsJCS8qIG51bWJlciBvZiB0eCBob2xkaW5nIGJ1ZmZlcnMgd2FpdGluZyAqLworCXN0cnVjdCB0eF9ob2xkaW5nX2J1ZmZlciB0eF9ob2xkaW5nX2J1ZmZlcnNbTUFYX1RYX0hPTERJTkdfQlVGRkVSU107CisKKwlpbnQgcnhfZW5hYmxlZDsKKwlpbnQgcnhfb3ZlcmZsb3c7CisJaW50IHJ4X3JjY191bmRlcnJ1bjsKKworCWludCB0eF9lbmFibGVkOworCWludCB0eF9hY3RpdmU7CisJdTMyIGlkbGVfbW9kZTsKKworCXUxNiBjbXJfdmFsdWU7CisJdTE2IHRjc3JfdmFsdWU7CisKKwljaGFyIGRldmljZV9uYW1lWzI1XTsJCS8qIGRldmljZSBpbnN0YW5jZSBuYW1lICovCisKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CS8qIGV4cGFuc2lvbiBidXMgdHlwZSAoSVNBLEVJU0EsUENJKSAqLworCXVuc2lnbmVkIGNoYXIgYnVzOwkJLyogZXhwYW5zaW9uIGJ1cyBudW1iZXIgKHplcm8gYmFzZWQpICovCisJdW5zaWduZWQgY2hhciBmdW5jdGlvbjsJCS8qIFBDSSBkZXZpY2UgbnVtYmVyICovCisKKwl1bnNpZ25lZCBpbnQgaW9fYmFzZTsJCS8qIGJhc2UgSS9PIGFkZHJlc3Mgb2YgYWRhcHRlciAqLworCXVuc2lnbmVkIGludCBpb19hZGRyX3NpemU7CS8qIHNpemUgb2YgdGhlIEkvTyBhZGRyZXNzIHJhbmdlICovCisJaW50IGlvX2FkZHJfcmVxdWVzdGVkOwkJLyogbm9uemVybyBpZiBJL08gYWRkcmVzcyByZXF1ZXN0ZWQgKi8KKwkKKwl1bnNpZ25lZCBpbnQgaXJxX2xldmVsOwkJLyogaW50ZXJydXB0IGxldmVsICovCisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJaW50IGlycV9yZXF1ZXN0ZWQ7CQkvKiBub256ZXJvIGlmIElSUSByZXF1ZXN0ZWQgKi8KKwkKKwl1bnNpZ25lZCBpbnQgZG1hX2xldmVsOwkJLyogRE1BIGNoYW5uZWwgKi8KKwlpbnQgZG1hX3JlcXVlc3RlZDsJCS8qIG5vbnplcm8gaWYgZG1hIGNoYW5uZWwgcmVxdWVzdGVkICovCisKKwl1MTYgbWJyZV9iaXQ7CisJdTE2IGxvb3BiYWNrX2JpdHM7CisJdTE2IHVzY19pZGxlX21vZGU7CisKKwlNR1NMX1BBUkFNUyBwYXJhbXM7CQkvKiBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCisKKwl1bnNpZ25lZCBjaGFyIHNlcmlhbF9zaWduYWxzOwkvKiBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisKKwlpbnQgaXJxX29jY3VycmVkOwkJLyogZm9yIGRpYWdub3N0aWNzIHVzZSAqLworCXVuc2lnbmVkIGludCBpbml0X2Vycm9yOwkvKiBJbml0aWFsaXphdGlvbiBzdGFydHVwIGVycm9yIAkJKERJQUdTKQkqLworCWludAlmRGlhZ25vc3RpY3Ntb2RlOwkvKiBEcml2ZXIgaW4gRGlhZ25vc3RpYyBtb2RlPwkJCShESUFHUykJKi8KKworCXUzMiBsYXN0X21lbV9hbGxvYzsKKwl1bnNpZ25lZCBjaGFyKiBtZW1vcnlfYmFzZTsJLyogc2hhcmVkIG1lbW9yeSBhZGRyZXNzIChQQ0kgb25seSkgKi8KKwl1MzIgcGh5c19tZW1vcnlfYmFzZTsKKwlpbnQgc2hhcmVkX21lbV9yZXF1ZXN0ZWQ7CisKKwl1bnNpZ25lZCBjaGFyKiBsY3JfYmFzZTsJLyogbG9jYWwgY29uZmlnIHJlZ2lzdGVycyAoUENJIG9ubHkpICovCisJdTMyIHBoeXNfbGNyX2Jhc2U7CisJdTMyIGxjcl9vZmZzZXQ7CisJaW50IGxjcl9tZW1fcmVxdWVzdGVkOworCisJdTMyIG1pc2NfY3RybF92YWx1ZTsKKwljaGFyIGZsYWdfYnVmW01BWF9BU1lOQ19CVUZGRVJfU0laRV07CisJY2hhciBjaGFyX2J1ZltNQVhfQVNZTkNfQlVGRkVSX1NJWkVdOwkKKwlCT09MRUFOIGRyb3BfcnRzX29uX3R4X2RvbmU7CisKKwlCT09MRUFOIGxvb3Btb2RlX2luc2VydF9yZXF1ZXN0ZWQ7CisJQk9PTEVBTglsb29wbW9kZV9zZW5kX2RvbmVfcmVxdWVzdGVkOworCQorCXN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cwlpbnB1dF9zaWduYWxfZXZlbnRzOworCisJLyogZ2VuZXJpYyBIRExDIGRldmljZSBwYXJ0cyAqLworCWludCBuZXRjb3VudDsKKwlpbnQgZG9zeW5jcHBwOworCXNwaW5sb2NrX3QgbmV0bG9jazsKKworI2lmZGVmIENPTkZJR19IRExDCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyNlbmRpZgorfTsKKworI2RlZmluZSBNR1NMX01BR0lDIDB4NTQwMQorCisvKgorICogVGhlIHNpemUgb2YgdGhlIHNlcmlhbCB4bWl0IGJ1ZmZlciBpcyAxIHBhZ2UsIG9yIDQwOTYgYnl0ZXMKKyAqLworI2lmbmRlZiBTRVJJQUxfWE1JVF9TSVpFCisjZGVmaW5lIFNFUklBTF9YTUlUX1NJWkUgNDA5NgorI2VuZGlmCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgZGVmaW5lIHRoZSBvZmZzZXRzIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlCisgKiBJL08gYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIFVTQyByZWdpc3RlcnMuCisgKi8KKworCisjZGVmaW5lIERDUElOIDIJCS8qIEJpdCAxIG9mIEkvTyBhZGRyZXNzICovCisjZGVmaW5lIFNEUElOIDQJCS8qIEJpdCAyIG9mIEkvTyBhZGRyZXNzICovCisKKyNkZWZpbmUgRENBUiAwCQkvKiBETUEgY29tbWFuZC9hZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIENDQVIgU0RQSU4JCS8qIGNoYW5uZWwgY29tbWFuZC9hZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIERBVEFSRUcgRENQSU4gKyBTRFBJTgkvKiBzZXJpYWwgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBNU0JPTkxZIDB4NDEKKyNkZWZpbmUgTFNCT05MWSAweDQwCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgZGVmaW5lIHRoZSByZWdpc3RlciBhZGRyZXNzIChvcmRpbmFsIG51bWJlcikKKyAqIHVzZWQgZm9yIHdyaXRpbmcgYWRkcmVzcy92YWx1ZSBwYWlycyB0byB0aGUgVVNDLgorICovCisKKyNkZWZpbmUgQ01SCTB4MDIJLyogQ2hhbm5lbCBtb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIENDU1IJMHgwNAkvKiBDaGFubmVsIENvbW1hbmQvc3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIENDUgkweDA2CS8qIENoYW5uZWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQU1IJMHgwOAkvKiBQb3J0IHN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQQ1IJMHgwYQkvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVE1EUgkweDBjCS8qIFRlc3QgbW9kZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIFRNQ1IJMHgwZQkvKiBUZXN0IG1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBDTUNSCTB4MTAJLyogQ2xvY2sgbW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEhDUgkweDEyCS8qIEhhcmR3YXJlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVZSCTB4MTQJLyogSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBJT0NSCTB4MTYJLyogSW5wdXQvT3V0cHV0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNSCTB4MTgJLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRENDUgkweDFhCS8qIERhaXN5IENoYWluIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlTUgkweDFjCS8qIE1pc2MgSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTSUNSCTB4MWUJLyogc3RhdHVzIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJEUgkweDIwCS8qIFJlY2VpdmUgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBSTVIJMHgyMgkvKiBSZWNlaXZlIG1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNTUgkweDI0CS8qIFJlY2VpdmUgQ29tbWFuZC9zdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUklDUgkweDI2CS8qIFJlY2VpdmUgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNSCTB4MjgJLyogUmVjZWl2ZSBTeW5jIFJlZ2lzdGVyICovCisjZGVmaW5lIFJDTFIJMHgyYQkvKiBSZWNlaXZlIGNvdW50IExpbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFJDQ1IJMHgyYwkvKiBSZWNlaXZlIENoYXJhY3RlciBjb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBUQzBSCTB4MmUJLyogVGltZSBDb25zdGFudCAwIFJlZ2lzdGVyICovCisjZGVmaW5lIFREUgkweDMwCS8qIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVE1SCTB4MzIJLyogVHJhbnNtaXQgbW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBUQ1NSCTB4MzQJLyogVHJhbnNtaXQgQ29tbWFuZC9zdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVElDUgkweDM2CS8qIFRyYW5zbWl0IEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFRTUgkweDM4CS8qIFRyYW5zbWl0IFN5bmMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENMUgkweDNhCS8qIFRyYW5zbWl0IGNvdW50IExpbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFRDQ1IJMHgzYwkvKiBUcmFuc21pdCBDaGFyYWN0ZXIgY291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEMxUgkweDNlCS8qIFRpbWUgQ29uc3RhbnQgMSBSZWdpc3RlciAqLworCisKKy8qCisgKiBNQUNSTyBERUZJTklUSU9OUyBGT1IgRE1BIFJFR0lTVEVSUworICovCisKKyNkZWZpbmUgRENSCTB4MDYJLyogRE1BIENvbnRyb2wgUmVnaXN0ZXIgKHNoYXJlZCkgKi8KKyNkZWZpbmUgREFDUgkweDA4CS8qIERNQSBBcnJheSBjb3VudCBSZWdpc3RlciAoc2hhcmVkKSAqLworI2RlZmluZSBCRENSCTB4MTIJLyogQnVyc3QvRHdlbGwgQ29udHJvbCBSZWdpc3RlciAoc2hhcmVkKSAqLworI2RlZmluZSBESVZSCTB4MTQJLyogRE1BIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgKHNoYXJlZCkgKi8JCisjZGVmaW5lIERJQ1IJMHgxOAkvKiBETUEgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKHNoYXJlZCkgKi8KKyNkZWZpbmUgQ0RJUgkweDFhCS8qIENsZWFyIERNQSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKHNoYXJlZCkgKi8KKyNkZWZpbmUgU0RJUgkweDFjCS8qIFNldCBETUEgSW50ZXJydXB0IFJlZ2lzdGVyIChzaGFyZWQpICovCisKKyNkZWZpbmUgVERNUgkweDAyCS8qIFRyYW5zbWl0IERNQSBtb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFRESUFSCTB4MWUJLyogVHJhbnNtaXQgRE1BIEludGVycnVwdCBBcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEJDUgkweDJhCS8qIFRyYW5zbWl0IEJ5dGUgY291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEFSTAkweDJjCS8qIFRyYW5zbWl0IEFkZHJlc3MgUmVnaXN0ZXIgKGxvdykgKi8KKyNkZWZpbmUgVEFSVQkweDJlCS8qIFRyYW5zbWl0IEFkZHJlc3MgUmVnaXN0ZXIgKGhpZ2gpICovCisjZGVmaW5lIE5UQkNSCTB4M2EJLyogTmV4dCBUcmFuc21pdCBCeXRlIGNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE5UQVJMCTB4M2MJLyogTmV4dCBUcmFuc21pdCBBZGRyZXNzIFJlZ2lzdGVyIChsb3cpICovCisjZGVmaW5lIE5UQVJVCTB4M2UJLyogTmV4dCBUcmFuc21pdCBBZGRyZXNzIFJlZ2lzdGVyIChoaWdoKSAqLworCisjZGVmaW5lIFJETVIJMHg4MgkvKiBSZWNlaXZlIERNQSBtb2RlIFJlZ2lzdGVyIChub24tc2hhcmVkKSAqLworI2RlZmluZSBSRElBUgkweDllCS8qIFJlY2VpdmUgRE1BIEludGVycnVwdCBBcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkJDUgkweGFhCS8qIFJlY2VpdmUgQnl0ZSBjb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBSQVJMCTB4YWMJLyogUmVjZWl2ZSBBZGRyZXNzIFJlZ2lzdGVyIChsb3cpICovCisjZGVmaW5lIFJBUlUJMHhhZQkvKiBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXIgKGhpZ2gpICovCisjZGVmaW5lIE5SQkNSCTB4YmEJLyogTmV4dCBSZWNlaXZlIEJ5dGUgY291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTlJBUkwJMHhiYwkvKiBOZXh0IFJlY2VpdmUgQWRkcmVzcyBSZWdpc3RlciAobG93KSAqLworI2RlZmluZSBOUkFSVQkweGJlCS8qIE5leHQgUmVjZWl2ZSBBZGRyZXNzIFJlZ2lzdGVyIChoaWdoKSAqLworCisKKy8qCisgKiBNQUNSTyBERUZJTklUSU9OUyBGT1IgTU9ERU0gU1RBVFVTIEJJVFMKKyAqLworCisjZGVmaW5lIE1PREVNU1RBVFVTX0RUUiAweDgwCisjZGVmaW5lIE1PREVNU1RBVFVTX0RTUiAweDQwCisjZGVmaW5lIE1PREVNU1RBVFVTX1JUUyAweDIwCisjZGVmaW5lIE1PREVNU1RBVFVTX0NUUyAweDEwCisjZGVmaW5lIE1PREVNU1RBVFVTX1JJICAweDA0CisjZGVmaW5lIE1PREVNU1RBVFVTX0RDRCAweDAxCisKKworLyoKKyAqIENoYW5uZWwgQ29tbWFuZC9BZGRyZXNzIFJlZ2lzdGVyIChDQ0FSKSBDb21tYW5kIENvZGVzCisgKi8KKworI2RlZmluZSBSVENtZF9OdWxsCQkJMHgwMDAwCisjZGVmaW5lIFJUQ21kX1Jlc2V0SGlnaGVzdEl1cwkJMHgxMDAwCisjZGVmaW5lIFJUQ21kX1RyaWdnZXJDaGFubmVsTG9hZERtYQkweDIwMDAKKyNkZWZpbmUgUlRDbWRfVHJpZ2dlclJ4RG1hCQkweDI4MDAKKyNkZWZpbmUgUlRDbWRfVHJpZ2dlclR4RG1hCQkweDMwMDAKKyNkZWZpbmUgUlRDbWRfVHJpZ2dlclJ4QW5kVHhEbWEJCTB4MzgwMAorI2RlZmluZSBSVENtZF9QdXJnZVJ4RmlmbwkJMHg0ODAwCisjZGVmaW5lIFJUQ21kX1B1cmdlVHhGaWZvCQkweDUwMDAKKyNkZWZpbmUgUlRDbWRfUHVyZ2VSeEFuZFR4RmlmbwkJMHg1ODAwCisjZGVmaW5lIFJUQ21kX0xvYWRSY2MJCQkweDY4MDAKKyNkZWZpbmUgUlRDbWRfTG9hZFRjYwkJCTB4NzAwMAorI2RlZmluZSBSVENtZF9Mb2FkUmNjQW5kVGNjCQkweDc4MDAKKyNkZWZpbmUgUlRDbWRfTG9hZFRDMAkJCTB4ODgwMAorI2RlZmluZSBSVENtZF9Mb2FkVEMxCQkJMHg5MDAwCisjZGVmaW5lIFJUQ21kX0xvYWRUQzBBbmRUQzEJCTB4OTgwMAorI2RlZmluZSBSVENtZF9TZXJpYWxEYXRhTFNCRmlyc3QJMHhhMDAwCisjZGVmaW5lIFJUQ21kX1NlcmlhbERhdGFNU0JGaXJzdAkweGE4MDAKKyNkZWZpbmUgUlRDbWRfU2VsZWN0QmlnRW5kaWFuCQkweGIwMDAKKyNkZWZpbmUgUlRDbWRfU2VsZWN0TGl0dGxlRW5kaWFuCTB4YjgwMAorCisKKy8qCisgKiBETUEgQ29tbWFuZC9BZGRyZXNzIFJlZ2lzdGVyIChEQ0FSKSBDb21tYW5kIENvZGVzCisgKi8KKworI2RlZmluZSBEbWFDbWRfTnVsbAkJCTB4MDAwMAorI2RlZmluZSBEbWFDbWRfUmVzZXRUeENoYW5uZWwJCTB4MTAwMAorI2RlZmluZSBEbWFDbWRfUmVzZXRSeENoYW5uZWwJCTB4MTIwMAorI2RlZmluZSBEbWFDbWRfU3RhcnRUeENoYW5uZWwJCTB4MjAwMAorI2RlZmluZSBEbWFDbWRfU3RhcnRSeENoYW5uZWwJCTB4MjIwMAorI2RlZmluZSBEbWFDbWRfQ29udGludWVUeENoYW5uZWwJMHgzMDAwCisjZGVmaW5lIERtYUNtZF9Db250aW51ZVJ4Q2hhbm5lbAkweDMyMDAKKyNkZWZpbmUgRG1hQ21kX1BhdXNlVHhDaGFubmVsCQkweDQwMDAKKyNkZWZpbmUgRG1hQ21kX1BhdXNlUnhDaGFubmVsCQkweDQyMDAKKyNkZWZpbmUgRG1hQ21kX0Fib3J0VHhDaGFubmVsCQkweDUwMDAKKyNkZWZpbmUgRG1hQ21kX0Fib3J0UnhDaGFubmVsCQkweDUyMDAKKyNkZWZpbmUgRG1hQ21kX0luaXRUeENoYW5uZWwJCTB4NzAwMAorI2RlZmluZSBEbWFDbWRfSW5pdFJ4Q2hhbm5lbAkJMHg3MjAwCisjZGVmaW5lIERtYUNtZF9SZXNldEhpZ2hlc3REbWFJdXMJMHg4MDAwCisjZGVmaW5lIERtYUNtZF9SZXNldEFsbENoYW5uZWxzCQkweDkwMDAKKyNkZWZpbmUgRG1hQ21kX1N0YXJ0QWxsQ2hhbm5lbHMJCTB4YTAwMAorI2RlZmluZSBEbWFDbWRfQ29udGludWVBbGxDaGFubmVscwkweGIwMDAKKyNkZWZpbmUgRG1hQ21kX1BhdXNlQWxsQ2hhbm5lbHMJCTB4YzAwMAorI2RlZmluZSBEbWFDbWRfQWJvcnRBbGxDaGFubmVscwkJMHhkMDAwCisjZGVmaW5lIERtYUNtZF9Jbml0QWxsQ2hhbm5lbHMJCTB4ZjAwMAorCisjZGVmaW5lIFRDbWRfTnVsbAkJCTB4MDAwMAorI2RlZmluZSBUQ21kX0NsZWFyVHhDUkMJCQkweDIwMDAKKyNkZWZpbmUgVENtZF9TZWxlY3RUaWNyVHRzYURhdGEJCTB4NDAwMAorI2RlZmluZSBUQ21kX1NlbGVjdFRpY3JUeEZpZm9zdGF0dXMJMHg1MDAwCisjZGVmaW5lIFRDbWRfU2VsZWN0VGljckludExldmVsCQkweDYwMDAKKyNkZWZpbmUgVENtZF9TZWxlY3RUaWNyZG1hX2xldmVsCQkweDcwMDAKKyNkZWZpbmUgVENtZF9TZW5kRnJhbWUJCQkweDgwMDAKKyNkZWZpbmUgVENtZF9TZW5kQWJvcnQJCQkweDkwMDAKKyNkZWZpbmUgVENtZF9FbmFibGVEbGVJbnNlcnRpb24JCTB4YzAwMAorI2RlZmluZSBUQ21kX0Rpc2FibGVEbGVJbnNlcnRpb24JMHhkMDAwCisjZGVmaW5lIFRDbWRfQ2xlYXJFb2ZFb20JCTB4ZTAwMAorI2RlZmluZSBUQ21kX1NldEVvZkVvbQkJCTB4ZjAwMAorCisjZGVmaW5lIFJDbWRfTnVsbAkJCTB4MDAwMAorI2RlZmluZSBSQ21kX0NsZWFyUnhDUkMJCQkweDIwMDAKKyNkZWZpbmUgUkNtZF9FbnRlckh1bnRtb2RlCQkweDMwMDAKKyNkZWZpbmUgUkNtZF9TZWxlY3RSaWNyUnRzYURhdGEJCTB4NDAwMAorI2RlZmluZSBSQ21kX1NlbGVjdFJpY3JSeEZpZm9zdGF0dXMJMHg1MDAwCisjZGVmaW5lIFJDbWRfU2VsZWN0UmljckludExldmVsCQkweDYwMDAKKyNkZWZpbmUgUkNtZF9TZWxlY3RSaWNyZG1hX2xldmVsCQkweDcwMDAKKworLyoKKyAqIEJpdHMgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgSVJRcyBpbiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAoSUNSKQorICovCisgCisjZGVmaW5lIFJFQ0VJVkVfU1RBVFVTCQlCSVQ1CisjZGVmaW5lIFJFQ0VJVkVfREFUQQkJQklUNAorI2RlZmluZSBUUkFOU01JVF9TVEFUVVMJCUJJVDMKKyNkZWZpbmUgVFJBTlNNSVRfREFUQQkJQklUMgorI2RlZmluZSBJT19QSU4JCQlCSVQxCisjZGVmaW5lIE1JU0MJCQlCSVQwCisKKworLyoKKyAqIFJlY2VpdmUgc3RhdHVzIEJpdHMgaW4gUmVjZWl2ZSBDb21tYW5kL3N0YXR1cyBSZWdpc3RlciBSQ1NSCisgKi8KKworI2RlZmluZSBSWFNUQVRVU19TSE9SVF9GUkFNRQkJQklUOAorI2RlZmluZSBSWFNUQVRVU19DT0RFX1ZJT0xBVElPTgkJQklUOAorI2RlZmluZSBSWFNUQVRVU19FWElURURfSFVOVAkJQklUNworI2RlZmluZSBSWFNUQVRVU19JRExFX1JFQ0VJVkVECQlCSVQ2CisjZGVmaW5lIFJYU1RBVFVTX0JSRUFLX1JFQ0VJVkVECQlCSVQ1CisjZGVmaW5lIFJYU1RBVFVTX0FCT1JUX1JFQ0VJVkVECQlCSVQ1CisjZGVmaW5lIFJYU1RBVFVTX1JYQk9VTkQJCUJJVDQKKyNkZWZpbmUgUlhTVEFUVVNfQ1JDX0VSUk9SCQlCSVQzCisjZGVmaW5lIFJYU1RBVFVTX0ZSQU1JTkdfRVJST1IJCUJJVDMKKyNkZWZpbmUgUlhTVEFUVVNfQUJPUlQJCQlCSVQyCisjZGVmaW5lIFJYU1RBVFVTX1BBUklUWV9FUlJPUgkJQklUMgorI2RlZmluZSBSWFNUQVRVU19PVkVSUlVOCQlCSVQxCisjZGVmaW5lIFJYU1RBVFVTX0RBVEFfQVZBSUxBQkxFCQlCSVQwCisjZGVmaW5lIFJYU1RBVFVTX0FMTAkJCTB4MDFmNgorI2RlZmluZSB1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyhhLGIpIHVzY19PdXRSZWcoIChhKSwgUkNTUiwgKHUxNikoKGIpICYgUlhTVEFUVVNfQUxMKSApCisKKy8qCisgKiBWYWx1ZXMgZm9yIHNldHRpbmcgdHJhbnNtaXQgaWRsZSBtb2RlIGluIAorICogVHJhbnNtaXQgQ29udHJvbC9zdGF0dXMgUmVnaXN0ZXIgKFRDU1IpCisgKi8KKyNkZWZpbmUgSURMRU1PREVfRkxBR1MJCQkweDAwMDAKKyNkZWZpbmUgSURMRU1PREVfQUxUX09ORV9aRVJPCQkweDAxMDAKKyNkZWZpbmUgSURMRU1PREVfWkVSTwkJCTB4MDIwMAorI2RlZmluZSBJRExFTU9ERV9PTkUJCQkweDAzMDAKKyNkZWZpbmUgSURMRU1PREVfQUxUX01BUktfU1BBQ0UJCTB4MDUwMAorI2RlZmluZSBJRExFTU9ERV9TUEFDRQkJCTB4MDYwMAorI2RlZmluZSBJRExFTU9ERV9NQVJLCQkJMHgwNzAwCisjZGVmaW5lIElETEVNT0RFX01BU0sJCQkweDA3MDAKKworLyoKKyAqIElVU0MgcmV2aXNpb24gaWRlbnRpZmllcnMKKyAqLworI2RlZmluZQlJVVNDX1NMMTY2MAkJCTB4NGQ0NAorI2RlZmluZSBJVVNDX1BSRV9TTDE2NjAJCQkweDQ1NTMKKworLyoKKyAqIFRyYW5zbWl0IHN0YXR1cyBCaXRzIGluIFRyYW5zbWl0IENvbW1hbmQvc3RhdHVzIFJlZ2lzdGVyIChUQ1NSKQorICovCisKKyNkZWZpbmUgVENTUl9QUkVTRVJWRQkJCTB4MEYwMAorCisjZGVmaW5lIFRDU1JfVU5ERVJXQUlUCQkJQklUMTEKKyNkZWZpbmUgVFhTVEFUVVNfUFJFQU1CTEVfU0VOVAkJQklUNworI2RlZmluZSBUWFNUQVRVU19JRExFX1NFTlQJCUJJVDYKKyNkZWZpbmUgVFhTVEFUVVNfQUJPUlRfU0VOVAkJQklUNQorI2RlZmluZSBUWFNUQVRVU19FT0ZfU0VOVAkJQklUNAorI2RlZmluZSBUWFNUQVRVU19FT01fU0VOVAkJQklUNAorI2RlZmluZSBUWFNUQVRVU19DUkNfU0VOVAkJQklUMworI2RlZmluZSBUWFNUQVRVU19BTExfU0VOVAkJQklUMgorI2RlZmluZSBUWFNUQVRVU19VTkRFUlJVTgkJQklUMQorI2RlZmluZSBUWFNUQVRVU19GSUZPX0VNUFRZCQlCSVQwCisjZGVmaW5lIFRYU1RBVFVTX0FMTAkJCTB4MDBmYQorI2RlZmluZSB1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyhhLGIpIHVzY19PdXRSZWcoIChhKSwgVENTUiwgKHUxNikoKGEpLT50Y3NyX3ZhbHVlICsgKChiKSAmIDB4MDBGRikpICkKKwkJCQkKKworI2RlZmluZSBNSVNDU1RBVFVTX1JYQ19MQVRDSEVECQlCSVQxNQorI2RlZmluZSBNSVNDU1RBVFVTX1JYQwkJCUJJVDE0CisjZGVmaW5lIE1JU0NTVEFUVVNfVFhDX0xBVENIRUQJCUJJVDEzCisjZGVmaW5lIE1JU0NTVEFUVVNfVFhDCQkJQklUMTIKKyNkZWZpbmUgTUlTQ1NUQVRVU19SSV9MQVRDSEVECQlCSVQxMQorI2RlZmluZSBNSVNDU1RBVFVTX1JJCQkJQklUMTAKKyNkZWZpbmUgTUlTQ1NUQVRVU19EU1JfTEFUQ0hFRAkJQklUOQorI2RlZmluZSBNSVNDU1RBVFVTX0RTUgkJCUJJVDgKKyNkZWZpbmUgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRAkJQklUNworI2RlZmluZSBNSVNDU1RBVFVTX0RDRAkJCUJJVDYKKyNkZWZpbmUgTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRAkJQklUNQorI2RlZmluZSBNSVNDU1RBVFVTX0NUUwkJCUJJVDQKKyNkZWZpbmUgTUlTQ1NUQVRVU19SQ0NfVU5ERVJSVU4JCUJJVDMKKyNkZWZpbmUgTUlTQ1NUQVRVU19EUExMX05PX1NZTkMJCUJJVDIKKyNkZWZpbmUgTUlTQ1NUQVRVU19CUkcxX1pFUk8JCUJJVDEKKyNkZWZpbmUgTUlTQ1NUQVRVU19CUkcwX1pFUk8JCUJJVDAKKworI2RlZmluZSB1c2NfVW5sYXRjaElvc3RhdHVzQml0cyhhLGIpIHVzY19PdXRSZWcoKGEpLE1JU1IsKHUxNikoKGIpICYgMHhhYWEwKSkKKyNkZWZpbmUgdXNjX1VubGF0Y2hNaXNjc3RhdHVzQml0cyhhLGIpIHVzY19PdXRSZWcoKGEpLE1JU1IsKHUxNikoKGIpICYgMHgwMDBmKSkKKworI2RlZmluZSBTSUNSX1JYQ19BQ1RJVkUJCQlCSVQxNQorI2RlZmluZSBTSUNSX1JYQ19JTkFDVElWRQkJQklUMTQKKyNkZWZpbmUgU0lDUl9SWEMJCQkoQklUMTUrQklUMTQpCisjZGVmaW5lIFNJQ1JfVFhDX0FDVElWRQkJCUJJVDEzCisjZGVmaW5lIFNJQ1JfVFhDX0lOQUNUSVZFCQlCSVQxMgorI2RlZmluZSBTSUNSX1RYQwkJCShCSVQxMytCSVQxMikKKyNkZWZpbmUgU0lDUl9SSV9BQ1RJVkUJCQlCSVQxMQorI2RlZmluZSBTSUNSX1JJX0lOQUNUSVZFCQlCSVQxMAorI2RlZmluZSBTSUNSX1JJCQkJCShCSVQxMStCSVQxMCkKKyNkZWZpbmUgU0lDUl9EU1JfQUNUSVZFCQkJQklUOQorI2RlZmluZSBTSUNSX0RTUl9JTkFDVElWRQkJQklUOAorI2RlZmluZSBTSUNSX0RTUgkJCShCSVQ5K0JJVDgpCisjZGVmaW5lIFNJQ1JfRENEX0FDVElWRQkJCUJJVDcKKyNkZWZpbmUgU0lDUl9EQ0RfSU5BQ1RJVkUJCUJJVDYKKyNkZWZpbmUgU0lDUl9EQ0QJCQkoQklUNytCSVQ2KQorI2RlZmluZSBTSUNSX0NUU19BQ1RJVkUJCQlCSVQ1CisjZGVmaW5lIFNJQ1JfQ1RTX0lOQUNUSVZFCQlCSVQ0CisjZGVmaW5lIFNJQ1JfQ1RTCQkJKEJJVDUrQklUNCkKKyNkZWZpbmUgU0lDUl9SQ0NfVU5ERVJGTE9XCQlCSVQzCisjZGVmaW5lIFNJQ1JfRFBMTF9OT19TWU5DCQlCSVQyCisjZGVmaW5lIFNJQ1JfQlJHMV9aRVJPCQkJQklUMQorI2RlZmluZSBTSUNSX0JSRzBfWkVSTwkJCUJJVDAKKwordm9pZCB1c2NfRGlzYWJsZU1hc3RlcklycUJpdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7Cit2b2lkIHVzY19FbmFibGVNYXN0ZXJJcnFCaXQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOwordm9pZCB1c2NfRW5hYmxlSW50ZXJydXB0cyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgSXJxTWFzayApOwordm9pZCB1c2NfRGlzYWJsZUludGVycnVwdHMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IElycU1hc2sgKTsKK3ZvaWQgdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IElycU1hc2sgKTsKKworI2RlZmluZSB1c2NfRW5hYmxlSW50ZXJydXB0cyggYSwgYiApIFwKKwl1c2NfT3V0UmVnKCAoYSksIElDUiwgKHUxNikoKHVzY19JblJlZygoYSksSUNSKSAmIDB4ZmYwMCkgKyAweGMwICsgKGIpKSApCisKKyNkZWZpbmUgdXNjX0Rpc2FibGVJbnRlcnJ1cHRzKCBhLCBiICkgXAorCXVzY19PdXRSZWcoIChhKSwgSUNSLCAodTE2KSgodXNjX0luUmVnKChhKSxJQ1IpICYgMHhmZjAwKSArIDB4ODAgKyAoYikpICkKKworI2RlZmluZSB1c2NfRW5hYmxlTWFzdGVySXJxQml0KGEpIFwKKwl1c2NfT3V0UmVnKCAoYSksIElDUiwgKHUxNikoKHVzY19JblJlZygoYSksSUNSKSAmIDB4MGYwMCkgKyAweGIwMDApICkKKworI2RlZmluZSB1c2NfRGlzYWJsZU1hc3RlcklycUJpdChhKSBcCisJdXNjX091dFJlZyggKGEpLCBJQ1IsICh1MTYpKHVzY19JblJlZygoYSksSUNSKSAmIDB4N2YwMCkgKQorCisjZGVmaW5lIHVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBhLCBiICkgdXNjX091dFJlZyggKGEpLCBEQ0NSLCAweDQwICsgKGIpICkKKworLyoKKyAqIFRyYW5zbWl0IHN0YXR1cyBCaXRzIGluIFRyYW5zbWl0IENvbnRyb2wgc3RhdHVzIFJlZ2lzdGVyIChUQ1NSKQorICogYW5kIFRyYW5zbWl0IEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChUSUNSKSAoZXhjZXB0IEJJVDIsIEJJVDApCisgKi8KKworI2RlZmluZSBUWFNUQVRVU19QUkVBTUJMRV9TRU5UCUJJVDcKKyNkZWZpbmUgVFhTVEFUVVNfSURMRV9TRU5UCUJJVDYKKyNkZWZpbmUgVFhTVEFUVVNfQUJPUlRfU0VOVAlCSVQ1CisjZGVmaW5lIFRYU1RBVFVTX0VPRgkJQklUNAorI2RlZmluZSBUWFNUQVRVU19DUkNfU0VOVAlCSVQzCisjZGVmaW5lIFRYU1RBVFVTX0FMTF9TRU5UCUJJVDIKKyNkZWZpbmUgVFhTVEFUVVNfVU5ERVJSVU4JQklUMQorI2RlZmluZSBUWFNUQVRVU19GSUZPX0VNUFRZCUJJVDAKKworI2RlZmluZSBESUNSX01BU1RFUgkJQklUMTUKKyNkZWZpbmUgRElDUl9UUkFOU01JVAkJQklUMAorI2RlZmluZSBESUNSX1JFQ0VJVkUJCUJJVDEKKworI2RlZmluZSB1c2NfRW5hYmxlRG1hSW50ZXJydXB0cyhhLGIpIFwKKwl1c2NfT3V0RG1hUmVnKCAoYSksIERJQ1IsICh1MTYpKHVzY19JbkRtYVJlZygoYSksRElDUikgfCAoYikpICkKKworI2RlZmluZSB1c2NfRGlzYWJsZURtYUludGVycnVwdHMoYSxiKSBcCisJdXNjX091dERtYVJlZyggKGEpLCBESUNSLCAodTE2KSh1c2NfSW5EbWFSZWcoKGEpLERJQ1IpICYgfihiKSkgKQorCisjZGVmaW5lIHVzY19FbmFibGVTdGF0dXNJcnFzKGEsYikgXAorCXVzY19PdXRSZWcoIChhKSwgU0lDUiwgKHUxNikodXNjX0luUmVnKChhKSxTSUNSKSB8IChiKSkgKQorCisjZGVmaW5lIHVzY19EaXNhYmxlc3RhdHVzSXJxcyhhLGIpIFwKKwl1c2NfT3V0UmVnKCAoYSksIFNJQ1IsICh1MTYpKHVzY19JblJlZygoYSksU0lDUikgJiB+KGIpKSApCisKKy8qIFRyYW5zbWl0IHN0YXR1cyBCaXRzIGluIFRyYW5zbWl0IENvbnRyb2wgc3RhdHVzIFJlZ2lzdGVyIChUQ1NSKSAqLworLyogYW5kIFRyYW5zbWl0IEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChUSUNSKSAoZXhjZXB0IEJJVDIsIEJJVDApICovCisKKworI2RlZmluZSBESVNBQkxFX1VOQ09ORElUSU9OQUwgICAgMAorI2RlZmluZSBESVNBQkxFX0VORF9PRl9GUkFNRSAgICAgMQorI2RlZmluZSBFTkFCTEVfVU5DT05ESVRJT05BTCAgICAgMgorI2RlZmluZSBFTkFCTEVfQVVUT19DVFMgICAgICAgICAgMworI2RlZmluZSBFTkFCTEVfQVVUT19EQ0QgICAgICAgICAgMworI2RlZmluZSB1c2NfRW5hYmxlVHJhbnNtaXR0ZXIoYSxiKSBcCisJdXNjX091dFJlZyggKGEpLCBUTVIsICh1MTYpKCh1c2NfSW5SZWcoKGEpLFRNUikgJiAweGZmZmMpIHwgKGIpKSApCisjZGVmaW5lIHVzY19FbmFibGVSZWNlaXZlcihhLGIpIFwKKwl1c2NfT3V0UmVnKCAoYSksIFJNUiwgKHUxNikoKHVzY19JblJlZygoYSksUk1SKSAmIDB4ZmZmYykgfCAoYikpICkKKworc3RhdGljIHUxNiAgdXNjX0luRG1hUmVnKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBQb3J0ICk7CitzdGF0aWMgdm9pZCB1c2NfT3V0RG1hUmVnKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBQb3J0LCB1MTYgVmFsdWUgKTsKK3N0YXRpYyB2b2lkIHVzY19EbWFDbWQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IENtZCApOworCitzdGF0aWMgdTE2ICB1c2NfSW5SZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFBvcnQgKTsKK3N0YXRpYyB2b2lkIHVzY19PdXRSZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFBvcnQsIHUxNiBWYWx1ZSApOworc3RhdGljIHZvaWQgdXNjX1JUQ21kKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBDbWQgKTsKK3ZvaWQgdXNjX1JDbWQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IENtZCApOwordm9pZCB1c2NfVENtZCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgQ21kICk7CisKKyNkZWZpbmUgdXNjX1RDbWQoYSxiKSB1c2NfT3V0UmVnKChhKSwgVENTUiwgKHUxNikoKGEpLT50Y3NyX3ZhbHVlICsgKGIpKSkKKyNkZWZpbmUgdXNjX1JDbWQoYSxiKSB1c2NfT3V0UmVnKChhKSwgUkNTUiwgKGIpKQorCisjZGVmaW5lIHVzY19TZXRUcmFuc21pdFN5bmNDaGFycyhhLHMwLHMxKSB1c2NfT3V0UmVnKChhKSwgVFNSLCAodTE2KSgoKHUxNilzMDw8OCl8KHUxNilzMSkpCisKK3N0YXRpYyB2b2lkIHVzY19wcm9jZXNzX3J4b3ZlcnJ1bl9zeW5jKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zdGFydF9yZWNlaXZlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2Nfc3RvcF9yZWNlaXZlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CisKK3N0YXRpYyB2b2lkIHVzY19zdGFydF90cmFuc21pdHRlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2Nfc3RvcF90cmFuc21pdHRlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2Nfc2V0X3R4aWRsZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2NfbG9hZF90eGZpZm8oIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworCitzdGF0aWMgdm9pZCB1c2NfZW5hYmxlX2F1eF9jbG9jayggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MzIgRGF0YVJhdGUgKTsKK3N0YXRpYyB2b2lkIHVzY19lbmFibGVfbG9vcGJhY2soIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgaW50IGVuYWJsZSApOworCitzdGF0aWMgdm9pZCB1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zZXRfc2VyaWFsX3NpZ25hbHMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworCitzdGF0aWMgdm9pZCB1c2NfcmVzZXQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworCitzdGF0aWMgdm9pZCB1c2Nfc2V0X3N5bmNfbW9kZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2Nfc2V0X3NkbGNfbW9kZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2Nfc2V0X2FzeW5jX21vZGUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgdXNjX2VuYWJsZV9hc3luY19jbG9jayggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MzIgRGF0YVJhdGUgKTsKKworc3RhdGljIHZvaWQgdXNjX2xvb3BiYWNrX2ZyYW1lKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKKworc3RhdGljIHZvaWQgbWdzbF90eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKKworc3RhdGljIHZvaWQgdXNjX2xvb3Btb2RlX2NhbmNlbF90cmFuc21pdCggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyApOworc3RhdGljIHZvaWQgdXNjX2xvb3Btb2RlX2luc2VydF9yZXF1ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICk7CitzdGF0aWMgaW50IHVzY19sb29wbW9kZV9hY3RpdmUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8pOworc3RhdGljIHZvaWQgdXNjX2xvb3Btb2RlX3NlbmRfZG9uZSggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyApOworCitzdGF0aWMgaW50IG1nc2xfaW9jdGxfY29tbW9uKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgQ09ORklHX0hETEMKKyNkZWZpbmUgZGV2X3RvX3BvcnQoRCkgKGRldl90b19oZGxjKEQpLT5wcml2KQorc3RhdGljIHZvaWQgaGRsY2Rldl90eF9kb25lKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBoZGxjZGV2X3J4KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50ICBoZGxjZGV2X2luaXQoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfZXhpdChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworI2VuZGlmCisKKy8qCisgKiBEZWZpbmVzIGEgQlVTIGRlc2NyaXB0b3IgdmFsdWUgZm9yIHRoZSBQQ0kgYWRhcHRlcgorICogbG9jYWwgYnVzIGFkZHJlc3MgcmFuZ2VzLgorICovCisKKyNkZWZpbmUgQlVTX0RFU0NSSVBUT1IoIFdySG9sZCwgV3JEbHksIFJkRGx5LCBOd2RkLCBOd2FkLCBOeGRhLCBOcmRkLCBOcmFkICkgXAorKDB4MDA0MDAwMjAgKyBcCisoKFdySG9sZCkgPDwgMzApICsgXAorKChXckRseSkgIDw8IDI4KSArIFwKKygoUmREbHkpICA8PCAyNikgKyBcCisoKE53ZGQpICAgPDwgMjApICsgXAorKChOd2FkKSAgIDw8IDE1KSArIFwKKygoTnhkYSkgICA8PCAxMykgKyBcCisoKE5yZGQpICAgPDwgMTEpICsgXAorKChOcmFkKSAgIDw8ICA2KSApCisKK3N0YXRpYyB2b2lkIG1nc2xfdHJhY2VfYmxvY2soc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLGNvbnN0IGNoYXIqIGRhdGEsIGludCBjb3VudCwgaW50IHhtaXQpOworCisvKgorICogQWRhcHRlciBkaWFnbm9zdGljIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBCT09MRUFOIG1nc2xfcmVnaXN0ZXJfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgQk9PTEVBTiBtZ3NsX2lycV90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyBCT09MRUFOIG1nc2xfZG1hX3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIEJPT0xFQU4gbWdzbF9tZW1vcnlfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgaW50IG1nc2xfYWRhcHRlcl90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKKworLyoKKyAqIGRldmljZSBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCByb3V0aW5lcworICovCitzdGF0aWMgaW50IG1nc2xfY2xhaW1fcmVzb3VyY2VzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NsX2FkZF9kZXZpY2Uoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyBzdHJ1Y3QgbWdzbF9zdHJ1Y3QqIG1nc2xfYWxsb2NhdGVfZGV2aWNlKHZvaWQpOworCisvKgorICogRE1BIGJ1ZmZlciBtYW51cHVsYXRpb24gZnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfcnhfZnJhbWVfYnVmZmVycyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IEVuZEluZGV4ICk7CitzdGF0aWMgaW50ICBtZ3NsX2dldF9yeF9mcmFtZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgaW50ICBtZ3NsX2dldF9yYXdfcnhfZnJhbWUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9yZXNldF9yeF9kbWFfYnVmZmVycyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX3Jlc2V0X3R4X2RtYV9idWZmZXJzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyBpbnQgbnVtX2ZyZWVfdHhfZG1hX2J1ZmZlcnMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfbG9hZF90eF9kbWFfYnVmZmVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIGNvbnN0IGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgaW50IEJ1ZmZlclNpemUpOworc3RhdGljIHZvaWQgbWdzbF9sb2FkX3BjaV9tZW1vcnkoY2hhciogVGFyZ2V0UHRyLCBjb25zdCBjaGFyKiBTb3VyY2VQdHIsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKKworLyoKKyAqIERNQSBhbmQgU2hhcmVkIE1lbW9yeSBidWZmZXIgYWxsb2NhdGlvbiBhbmQgZm9ybWF0dGluZworICovCitzdGF0aWMgaW50ICBtZ3NsX2FsbG9jYXRlX2RtYV9idWZmZXJzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyBpbnQgIG1nc2xfYWxsb2NfZnJhbWVfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgRE1BQlVGRkVSRU5UUlkgKkJ1ZmZlckxpc3QsaW50IEJ1ZmZlcmNvdW50KTsKK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9mcmFtZV9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCBETUFCVUZGRVJFTlRSWSAqQnVmZmVyTGlzdCxpbnQgQnVmZmVyY291bnQpOworc3RhdGljIGludCAgbWdzbF9hbGxvY19idWZmZXJfbGlzdF9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9idWZmZXJfbGlzdF9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyBpbnQgbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfcnhidWZmZXJfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIGludCBtZ3NsX2FsbG9jX2ludGVybWVkaWF0ZV90eGJ1ZmZlcl9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgaW50IGxvYWRfbmV4dF90eF9ob2xkaW5nX2J1ZmZlcihzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIGludCBzYXZlX3R4X2J1ZmZlcl9yZXF1ZXN0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyxjb25zdCBjaGFyICpCdWZmZXIsIHVuc2lnbmVkIGludCBCdWZmZXJTaXplKTsKKworLyoKKyAqIEJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVycworICovCitzdGF0aWMgdm9pZCBtZ3NsX2JoX2hhbmRsZXIodm9pZCogQ29udGV4dCk7CitzdGF0aWMgdm9pZCBtZ3NsX2JoX3JlY2VpdmUoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfYmhfdHJhbnNtaXQoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfYmhfc3RhdHVzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CisKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lcyBhbmQgZGlzcGF0Y2ggdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX251bGwoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9pc3JfdHJhbnNtaXRfZGF0YSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9yZWNlaXZlX2RhdGEoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9pc3JfcmVjZWl2ZV9zdGF0dXMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9pc3JfdHJhbnNtaXRfc3RhdHVzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIG1nc2xfaXNyX2lvX3Bpbiggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9taXNjKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3JlY2VpdmVfZG1hKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3RyYW5zbWl0X2RtYSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CisKK3R5cGVkZWYgdm9pZCAoKmlzcl9kaXNwYXRjaF9mdW5jKShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKik7CisKK3N0YXRpYyBpc3JfZGlzcGF0Y2hfZnVuYyBVc2NJc3JUYWJsZVs3XSA9Cit7CisJbWdzbF9pc3JfbnVsbCwKKwltZ3NsX2lzcl9taXNjLAorCW1nc2xfaXNyX2lvX3BpbiwKKwltZ3NsX2lzcl90cmFuc21pdF9kYXRhLAorCW1nc2xfaXNyX3RyYW5zbWl0X3N0YXR1cywKKwltZ3NsX2lzcl9yZWNlaXZlX2RhdGEsCisJbWdzbF9pc3JfcmVjZWl2ZV9zdGF0dXMKK307CisKKy8qCisgKiBpb2N0bCBjYWxsIGhhbmRsZXJzCisgKi8KK3N0YXRpYyBpbnQgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCB0aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CitzdGF0aWMgaW50IG1nc2xfZ2V0X3N0YXRzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIHN0cnVjdCBtZ3NsX2ljb3VudAorCV9fdXNlciAqdXNlcl9pY291bnQpOworc3RhdGljIGludCBtZ3NsX2dldF9wYXJhbXMoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgTUdTTF9QQVJBTVMgIF9fdXNlciAqdXNlcl9wYXJhbXMpOworc3RhdGljIGludCBtZ3NsX3NldF9wYXJhbXMoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgTUdTTF9QQVJBTVMgIF9fdXNlciAqbmV3X3BhcmFtcyk7CitzdGF0aWMgaW50IG1nc2xfZ2V0X3R4aWRsZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBpbnQgX191c2VyICppZGxlX21vZGUpOworc3RhdGljIGludCBtZ3NsX3NldF90eGlkbGUoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IGlkbGVfbW9kZSk7CitzdGF0aWMgaW50IG1nc2xfdHhlbmFibGUoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IGVuYWJsZSk7CitzdGF0aWMgaW50IG1nc2xfdHhhYm9ydChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvKTsKK3N0YXRpYyBpbnQgbWdzbF9yeGVuYWJsZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyBpbnQgbWdzbF93YWl0X2V2ZW50KHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBfX3VzZXIgKm1hc2spOworc3RhdGljIGludCBtZ3NsX2xvb3Btb2RlX3NlbmRfZG9uZSggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyApOworCisvKiBzZXQgbm9uLXplcm8gb24gc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24gd2l0aCBQQ0kgc3Vic3lzdGVtICovCitzdGF0aWMgaW50IHBjaV9yZWdpc3RlcmVkOworCisvKgorICogR2xvYmFsIGxpbmtlZCBsaXN0IG9mIFN5bmNMaW5rIGRldmljZXMKKyAqLworc3RhdGljIHN0cnVjdCBtZ3NsX3N0cnVjdCAqbWdzbF9kZXZpY2VfbGlzdDsKK3N0YXRpYyBpbnQgbWdzbF9kZXZpY2VfY291bnQ7CisKKy8qCisgKiBTZXQgdGhpcyBwYXJhbSB0byBub24temVybyB0byBsb2FkIGVheCB3aXRoIHRoZQorICogLnRleHQgc2VjdGlvbiBhZGRyZXNzIGFuZCBicmVha3BvaW50IG9uIG1vZHVsZSBsb2FkLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHVzZSB3aXRoIGdkYiBhbmQgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgYnJlYWtfb25fbG9hZDsKKworLyoKKyAqIERyaXZlciBtYWpvciBudW1iZXIsIGRlZmF1bHRzIHRvIHplcm8gdG8gZ2V0IGF1dG8KKyAqIGFzc2lnbmVkIG1ham9yIG51bWJlci4gTWF5IGJlIGZvcmNlZCBhcyBtb2R1bGUgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50IHR0eW1ham9yOworCisvKgorICogQXJyYXkgb2YgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyBmb3IgSVNBIGFkYXB0ZXJzLgorICovCitzdGF0aWMgaW50IGlvW01BWF9JU0FfREVWSUNFU107CitzdGF0aWMgaW50IGlycVtNQVhfSVNBX0RFVklDRVNdOworc3RhdGljIGludCBkbWFbTUFYX0lTQV9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgZGVidWdfbGV2ZWw7CitzdGF0aWMgaW50IG1heGZyYW1lW01BWF9UT1RBTF9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgZG9zeW5jcHBwW01BWF9UT1RBTF9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgdHhkbWFidWZzW01BWF9UT1RBTF9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgdHhob2xkYnVmc1tNQVhfVE9UQUxfREVWSUNFU107CisJCittb2R1bGVfcGFyYW0oYnJlYWtfb25fbG9hZCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGRtYSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1Z19sZXZlbCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtYXhmcmFtZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkb3N5bmNwcHAsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHhkbWFidWZzLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHR4aG9sZGJ1ZnMsIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBzZXJpYWwgZHJpdmVyIjsKK3N0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMjggJCI7CisKK3N0YXRpYyBpbnQgc3luY2xpbmtfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIHN5bmNsaW5rX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3luY2xpbmtfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9NSUNST0dBVEUsIFBDSV9ERVZJQ0VfSURfTUlDUk9HQVRFX1VTQywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTUlDUk9HQVRFLCAweDAyMTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLCB9LCAvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzeW5jbGlua19wY2lfdGJsKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3luY2xpbmtfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic3luY2xpbmsiLAorCS5pZF90YWJsZQk9IHN5bmNsaW5rX3BjaV90YmwsCisJLnByb2JlCQk9IHN5bmNsaW5rX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3luY2xpbmtfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKKworc3RhdGljIHZvaWQgbWdzbF9jaGFuZ2VfcGFyYW1zKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NsX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CisKKy8qCisgKiAxc3QgZnVuY3Rpb24gZGVmaW5lZCBpbiAudGV4dCBzZWN0aW9uLiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4KKyAqIGluaXRfbW9kdWxlKCkgZm9sbG93ZWQgYnkgYSBicmVha3BvaW50IGFsbG93cyBhIHJlbW90ZSBkZWJ1Z2dlcgorICogKGdkYikgdG8gZ2V0IHRoZSAudGV4dCBhZGRyZXNzIGZvciB0aGUgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisgKiBUaGlzIGFsbG93cyByZW1vdGUgZGVidWdnaW5nIG9mIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMuCisgKi8KK3N0YXRpYyB2b2lkKiBtZ3NsX2dldF90ZXh0X3B0cih2b2lkKQoreworCXJldHVybiBtZ3NsX2dldF90ZXh0X3B0cjsKK30KKworLyoKKyAqIHRtcF9idWYgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgYnkgbWdzbF93cml0ZS4gIFdlIG5lZWQgdG8KKyAqIGxvY2sgaXQgaW4gY2FzZSB0aGUgQ09QWV9GUk9NX1VTRVIgYmxvY2tzIHdoaWxlIHN3YXBwaW5nIGluIGEgcGFnZSwKKyAqIGFuZCBzb21lIG90aGVyIHByb2dyYW0gdHJpZXMgdG8gZG8gYSBzZXJpYWwgd3JpdGUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNpbmNlIHRoZSBsb2NrIHdpbGwgb25seSBjb21lIHVuZGVyIGNvbnRlbnRpb24gd2hlbiB0aGUgc3lzdGVtIGlzCisgKiBzd2FwcGluZyBhbmQgYXZhaWxhYmxlIG1lbW9yeSBpcyBsb3csIGl0IG1ha2VzIHNlbnNlIHRvIHNoYXJlIG9uZQorICogYnVmZmVyIGFjcm9zcyBhbGwgdGhlIHNlcmlhbCBpb3BvcnRzLCBzaW5jZSBpdCBzaWduaWZpY2FudGx5IHNhdmVzCisgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOworc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOworCitzdGF0aWMgaW5saW5lIGludCBtZ3NsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywKKwkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBNR1NMX1BBUkFOT0lBX0NIRUNLCisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKwkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIG1nc2wgc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorCQkiV2FybmluZzogbnVsbCBtZ3NsX3N0cnVjdCBmb3IgKCVzKSBpbiAlc1xuIjsKKworCWlmICghaW5mbykgeworCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaW5mby0+bWFnaWMgIT0gTUdTTF9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmICghaW5mbykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBsaW5lIGRpc2NpcGxpbmUgY2FsbGJhY2sgd3JhcHBlcnMKKyAqCisgKiBUaGUgd3JhcHBlcnMgbWFpbnRhaW4gbGluZSBkaXNjaXBsaW5lIHJlZmVyZW5jZXMKKyAqIHdoaWxlIGNhbGxpbmcgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIGxkaXNjX3JlY2VpdmVfYnVmICAtIHBhc3MgcmVjZWl2ZSBkYXRhIHRvIGxpbmUgZGlzY2lwbGluZQorICovCisKK3N0YXRpYyB2b2lkIGxkaXNjX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICAgICBjb25zdCBfX3U4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWlmICghdHR5KQorCQlyZXR1cm47CisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmIChsZC0+cmVjZWl2ZV9idWYpCisJCQlsZC0+cmVjZWl2ZV9idWYodHR5LCBkYXRhLCBmbGFncywgY291bnQpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KK30KKworLyogbWdzbF9zdG9wKCkJCXRocm90dGxlIChzdG9wKSB0cmFuc21pdHRlcgorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3N0b3AiKSkKKwkJcmV0dXJuOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygibWdzbF9zdG9wKCVzKVxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CQorCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlpZiAoaW5mby0+dHhfZW5hYmxlZCkKKwkgCXVzY19zdG9wX3RyYW5zbWl0dGVyKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3N0b3AoKSAqLworCisvKiBtZ3NsX3N0YXJ0KCkJCXJlbGVhc2UgKHN0YXJ0KSB0cmFuc21pdHRlcgorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9zdGFydCIpKQorCQlyZXR1cm47CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCJtZ3NsX3N0YXJ0KCVzKVxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CQorCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJIAl1c2Nfc3RhcnRfdHJhbnNtaXR0ZXIoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKK30JLyogZW5kIG9mIG1nc2xfc3RhcnQoKSAqLworCisvKgorICogQm90dG9tIGhhbGYgd29yayBxdWV1ZSBhY2Nlc3MgZnVuY3Rpb25zCisgKi8KKworLyogbWdzbF9iaF9hY3Rpb24oKQlSZXR1cm4gbmV4dCBib3R0b20gaGFsZiBhY3Rpb24gdG8gcGVyZm9ybS4KKyAqIFJldHVybiBWYWx1ZToJQkggYWN0aW9uIGNvZGUgb3IgMCBpZiBub3RoaW5nIHRvIGRvLgorICovCitzdGF0aWMgaW50IG1nc2xfYmhfYWN0aW9uKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwlpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1JFQ0VJVkUpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfUkVDRUlWRTsKKwkJcmMgPSBCSF9SRUNFSVZFOworCX0gZWxzZSBpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1RSQU5TTUlUKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1RSQU5TTUlUOworCQlyYyA9IEJIX1RSQU5TTUlUOworCX0gZWxzZSBpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1NUQVRVUykgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9TVEFUVVM7CisJCXJjID0gQkhfU1RBVFVTOworCX0KKworCWlmICghcmMpIHsKKwkJLyogTWFyayBCSCByb3V0aW5lIGFzIGNvbXBsZXRlICovCisJCWluZm8tPmJoX3J1bm5pbmcgICA9IDA7CisJCWluZm8tPmJoX3JlcXVlc3RlZCA9IDA7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJcmV0dXJuIHJjOworfQorCisvKgorICogCVBlcmZvcm0gYm90dG9tIGhhbGYgcHJvY2Vzc2luZyBvZiB3b3JrIGl0ZW1zIHF1ZXVlZCBieSBJU1IuCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfYmhfaGFuZGxlcih2b2lkKiBDb250ZXh0KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QqKUNvbnRleHQ7CisJaW50IGFjdGlvbjsKKworCWlmICghaW5mbykKKwkJcmV0dXJuOworCQkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfYmhfaGFuZGxlciglcykgZW50cnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCisJaW5mby0+YmhfcnVubmluZyA9IDE7CisKKwl3aGlsZSgoYWN0aW9uID0gbWdzbF9iaF9hY3Rpb24oaW5mbykpICE9IDApIHsKKwkKKwkJLyogUHJvY2VzcyB3b3JrIGl0ZW0gKi8KKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCQlwcmludGsoICIlcyglZCk6bWdzbF9iaF9oYW5kbGVyKCkgd29yayBpdGVtIGFjdGlvbj0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxhY3Rpb24pOworCisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCQorCQljYXNlIEJIX1JFQ0VJVkU6CisJCQltZ3NsX2JoX3JlY2VpdmUoaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBCSF9UUkFOU01JVDoKKwkJCW1nc2xfYmhfdHJhbnNtaXQoaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBCSF9TVEFUVVM6CisJCQltZ3NsX2JoX3N0YXR1cyhpbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW5rbm93biB3b3JrIGl0ZW0gSUQgKi8KKwkJCXByaW50aygiVW5rbm93biB3b3JrIGl0ZW0gSUQ9JTA4WCFcbiIsIGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9iaF9oYW5kbGVyKCVzKSBleGl0XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBtZ3NsX2JoX3JlY2VpdmUoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWludCAoKmdldF9yeF9mcmFtZSkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKSA9CisJCShpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyA/IG1nc2xfZ2V0X3J4X2ZyYW1lIDogbWdzbF9nZXRfcmF3X3J4X2ZyYW1lKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9iaF9yZWNlaXZlKCVzKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkKKwlkbworCXsKKwkJaWYgKGluZm8tPnJ4X3JjY191bmRlcnJ1bikgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJdXNjX3N0YXJ0X3JlY2VpdmVyKGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0gd2hpbGUoZ2V0X3J4X2ZyYW1lKGluZm8pKTsKK30KKworc3RhdGljIHZvaWQgbWdzbF9iaF90cmFuc21pdChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9iaF90cmFuc21pdCgpIGVudHJ5IG9uICVzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJaWYgKHR0eSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9CisKKwkvKiBpZiB0cmFuc21pdHRlciBpZGxlIGFuZCBsb29wbW9kZV9zZW5kX2RvbmVfcmVxdWVzdGVkCisJICogdGhlbiBzdGFydCBlY2hvaW5nIFJ4RCB0byBUeEQKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKyAJaWYgKCAhaW5mby0+dHhfYWN0aXZlICYmIGluZm8tPmxvb3Btb2RlX3NlbmRfZG9uZV9yZXF1ZXN0ZWQgKQorIAkJdXNjX2xvb3Btb2RlX3NlbmRfZG9uZSggaW5mbyApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1nc2xfYmhfc3RhdHVzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfYmhfc3RhdHVzKCkgZW50cnkgb24gJXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlpbmZvLT5yaV9jaGtjb3VudCA9IDA7CisJaW5mby0+ZHNyX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kY2RfY2hrY291bnQgPSAwOworCWluZm8tPmN0c19jaGtjb3VudCA9IDA7Cit9CisKKy8qIG1nc2xfaXNyX3JlY2VpdmVfc3RhdHVzKCkKKyAqIAorICoJU2VydmljZSBhIHJlY2VpdmUgc3RhdHVzIGludGVycnVwdC4gVGhlIHR5cGUgb2Ygc3RhdHVzCisgKglpbnRlcnJ1cHQgaXMgaW5kaWNhdGVkIGJ5IHRoZSBzdGF0ZSBvZiB0aGUgUkNTUi4KKyAqCVRoaXMgaXMgb25seSB1c2VkIGZvciBIRExDIG1vZGUuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9pc3JfcmVjZWl2ZV9zdGF0dXMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IHN0YXR1cyA9IHVzY19JblJlZyggaW5mbywgUkNTUiApOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfcmVjZWl2ZV9zdGF0dXMgc3RhdHVzPSUwNFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxzdGF0dXMpOworCQkJCisgCWlmICggKHN0YXR1cyAmIFJYU1RBVFVTX0FCT1JUX1JFQ0VJVkVEKSAmJiAKKwkJaW5mby0+bG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3RlZCAmJgorIAkJdXNjX2xvb3Btb2RlX2FjdGl2ZShpbmZvKSApCisgCXsKKwkJKytpbmZvLT5pY291bnQucnhhYm9ydDsKKwkgCWluZm8tPmxvb3Btb2RlX2luc2VydF9yZXF1ZXN0ZWQgPSBGQUxTRTsKKyAKKyAJCS8qIGNsZWFyIENNUjoxMyB0byBzdGFydCBlY2hvaW5nIFJ4RCB0byBUeEQgKi8KKwkJaW5mby0+Y21yX3ZhbHVlICY9IH5CSVQxMzsKKyAJCXVzY19PdXRSZWcoaW5mbywgQ01SLCBpbmZvLT5jbXJfdmFsdWUpOworIAorCQkvKiBkaXNhYmxlIHJlY2VpdmVkIGFib3J0IGlycSAobm8gbG9uZ2VyIHJlcXVpcmVkKSAqLworCSAJdXNjX091dFJlZyhpbmZvLCBSSUNSLAorIAkJCSh1c2NfSW5SZWcoaW5mbywgUklDUikgJiB+UlhTVEFUVVNfQUJPUlRfUkVDRUlWRUQpKTsKKyAJfQorCisJaWYgKHN0YXR1cyAmIChSWFNUQVRVU19FWElURURfSFVOVCArIFJYU1RBVFVTX0lETEVfUkVDRUlWRUQpKSB7CisJCWlmIChzdGF0dXMgJiBSWFNUQVRVU19FWElURURfSFVOVCkKKwkJCWluZm8tPmljb3VudC5leGl0aHVudCsrOworCQlpZiAoc3RhdHVzICYgUlhTVEFUVVNfSURMRV9SRUNFSVZFRCkKKwkJCWluZm8tPmljb3VudC5yeGlkbGUrKzsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCX0KKworCWlmIChzdGF0dXMgJiBSWFNUQVRVU19PVkVSUlVOKXsKKwkJaW5mby0+aWNvdW50LnJ4b3ZlcisrOworCQl1c2NfcHJvY2Vzc19yeG92ZXJydW5fc3luYyggaW5mbyApOworCX0KKworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBSRUNFSVZFX1NUQVRVUyApOworCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKCBpbmZvLCBzdGF0dXMgKTsKKworfQkvKiBlbmQgb2YgbWdzbF9pc3JfcmVjZWl2ZV9zdGF0dXMoKSAqLworCisvKiBtZ3NsX2lzcl90cmFuc21pdF9zdGF0dXMoKQorICogCisgKiAJU2VydmljZSBhIHRyYW5zbWl0IHN0YXR1cyBpbnRlcnJ1cHQKKyAqCUhETEMgbW9kZSA6ZW5kIG9mIHRyYW5zbWl0IGZyYW1lCisgKglBc3luYyBtb2RlOmFsbCBkYXRhIGlzIHNlbnQKKyAqIAl0cmFuc21pdCBzdGF0dXMgaXMgaW5kaWNhdGVkIGJ5IGJpdHMgaW4gdGhlIFRDU1IuCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JICAgICAgIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl90cmFuc21pdF9zdGF0dXMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IHN0YXR1cyA9IHVzY19JblJlZyggaW5mbywgVENTUiApOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfdHJhbnNtaXRfc3RhdHVzIHN0YXR1cz0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sc3RhdHVzKTsKKwkKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgVFJBTlNNSVRfU1RBVFVTICk7CisJdXNjX1VubGF0Y2hUeHN0YXR1c0JpdHMoIGluZm8sIHN0YXR1cyApOworCQorCWlmICggc3RhdHVzICYgKFRYU1RBVFVTX1VOREVSUlVOIHwgVFhTVEFUVVNfQUJPUlRfU0VOVCkgKQorCXsKKwkJLyogZmluaXNoZWQgc2VuZGluZyBIRExDIGFib3J0LiBUaGlzIG1heSBsZWF2ZQkqLworCQkvKiB0aGUgVHhGaWZvIHdpdGggZGF0YSBmcm9tIHRoZSBhYm9ydGVkIGZyYW1lCSovCisJCS8qIHNvIHB1cmdlIHRoZSBUeEZpZm8uIEFsc28gc2h1dGRvd24gdGhlIERNQQkqLworCQkvKiBjaGFubmVsIGluIGNhc2UgdGhlcmUgaXMgZGF0YSByZW1haW5pbmcgaW4gCSovCisJCS8qIHRoZSBETUEgYnVmZmVyCQkJCSovCisgCQl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfUmVzZXRUeENoYW5uZWwgKTsKKyAJCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VUeEZpZm8gKTsKKwl9CisgCisJaWYgKCBzdGF0dXMgJiBUWFNUQVRVU19FT0ZfU0VOVCApCisJCWluZm8tPmljb3VudC50eG9rKys7CisJZWxzZSBpZiAoIHN0YXR1cyAmIFRYU1RBVFVTX1VOREVSUlVOICkKKwkJaW5mby0+aWNvdW50LnR4dW5kZXIrKzsKKwllbHNlIGlmICggc3RhdHVzICYgVFhTVEFUVVNfQUJPUlRfU0VOVCApCisJCWluZm8tPmljb3VudC50eGFib3J0Kys7CisJZWxzZQorCQlpbmZvLT5pY291bnQudHh1bmRlcisrOworCQkJCisJaW5mby0+dHhfYWN0aXZlID0gMDsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJZGVsX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CQorCQorCWlmICggaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSApIHsKKwkJdXNjX2dldF9zZXJpYWxfc2lnbmFscyggaW5mbyApOworCQlpZiAoIGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUyApIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCQkJdXNjX3NldF9zZXJpYWxfc2lnbmFscyggaW5mbyApOworCQl9CisJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAwOworCX0KKworI2lmZGVmIENPTkZJR19IRExDCisJaWYgKGluZm8tPm5ldGNvdW50KQorCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CisJZWxzZSAKKyNlbmRpZgorCXsKKwkJaWYgKGluZm8tPnR0eS0+c3RvcHBlZCB8fCBpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCXVzY19zdG9wX3RyYW5zbWl0dGVyKGluZm8pOworCQkJcmV0dXJuOworCQl9CisJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJfQorCit9CS8qIGVuZCBvZiBtZ3NsX2lzcl90cmFuc21pdF9zdGF0dXMoKSAqLworCisvKiBtZ3NsX2lzcl9pb19waW4oKQorICogCisgKiAJU2VydmljZSBhbiBJbnB1dC9PdXRwdXQgcGluIGludGVycnVwdC4gVGhlIHR5cGUgb2YKKyAqIAlpbnRlcnJ1cHQgaXMgaW5kaWNhdGVkIGJ5IGJpdHMgaW4gdGhlIE1JU1IKKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JICAgICAgIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9pb19waW4oIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisgCXN0cnVjdAltZ3NsX2ljb3VudCAqaWNvdW50OworCXUxNiBzdGF0dXMgPSB1c2NfSW5SZWcoIGluZm8sIE1JU1IgKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCXByaW50aygiJXMoJWQpOm1nc2xfaXNyX2lvX3BpbiBzdGF0dXM9JTA0WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLHN0YXR1cyk7CisJCQkKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgSU9fUElOICk7CisJdXNjX1VubGF0Y2hJb3N0YXR1c0JpdHMoIGluZm8sIHN0YXR1cyApOworCisJaWYgKHN0YXR1cyAmIChNSVNDU1RBVFVTX0NUU19MQVRDSEVEIHwgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRCB8CisJICAgICAgICAgICAgICBNSVNDU1RBVFVTX0RTUl9MQVRDSEVEIHwgTUlTQ1NUQVRVU19SSV9MQVRDSEVEKSApIHsKKwkJaWNvdW50ID0gJmluZm8tPmljb3VudDsKKwkJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KKwkJaWYgKHN0YXR1cyAmIE1JU0NTVEFUVVNfUklfTEFUQ0hFRCkgeworCQkJaWYgKChpbmZvLT5yaV9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCQkJdXNjX0Rpc2FibGVzdGF0dXNJcnFzKGluZm8sU0lDUl9SSSk7CisJCQlpY291bnQtPnJuZysrOworCQkJaWYgKCBzdGF0dXMgJiBNSVNDU1RBVFVTX1JJICkKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLnJpX3VwKys7CQorCQkJZWxzZQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfZG93bisrOwkKKwkJfQorCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19EU1JfTEFUQ0hFRCkgeworCQkJaWYgKChpbmZvLT5kc3JfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKQorCQkJCXVzY19EaXNhYmxlc3RhdHVzSXJxcyhpbmZvLFNJQ1JfRFNSKTsKKwkJCWljb3VudC0+ZHNyKys7CisJCQlpZiAoIHN0YXR1cyAmIE1JU0NTVEFUVVNfRFNSICkKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRzcl91cCsrOworCQkJZWxzZQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX2Rvd24rKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRCkgeworCQkJaWYgKChpbmZvLT5kY2RfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKQorCQkJCXVzY19EaXNhYmxlc3RhdHVzSXJxcyhpbmZvLFNJQ1JfRENEKTsKKwkJCWljb3VudC0+ZGNkKys7CisJCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0QpIHsKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF91cCsrOworCQkJfSBlbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOworI2lmZGVmIENPTkZJR19IRExDCisJCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQkJaGRsY19zZXRfY2FycmllcihzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRCwgaW5mby0+bmV0ZGV2KTsKKyNlbmRpZgorCQl9CisJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0NUU19MQVRDSEVEKQorCQl7CisJCQlpZiAoKGluZm8tPmN0c19jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCQkJdXNjX0Rpc2FibGVzdGF0dXNJcnFzKGluZm8sU0lDUl9DVFMpOworCQkJaWNvdW50LT5jdHMrKzsKKwkJCWlmICggc3RhdHVzICYgTUlTQ1NUQVRVU19DVFMgKQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuY3RzX3VwKys7CisJCQllbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5jdHNfZG93bisrOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKworCQlpZiAoIChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAKKwkJICAgICAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRCkgKSB7CisJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJcHJpbnRrKCIlcyBDRCBub3cgJXMuLi4iLCBpbmZvLT5kZXZpY2VfbmFtZSwKKwkJCQkgICAgICAgKHN0YXR1cyAmIE1JU0NTVEFUVVNfRENEKSA/ICJvbiIgOiAib2ZmIik7CisJCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0QpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQkJZWxzZSB7CisJCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJCQlwcmludGsoImRvaW5nIHNlcmlhbCBoYW5ndXAuLi4iKTsKKwkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7CisJCQl9CisJCX0KKwkKKwkJaWYgKCAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgJiYgCisJCSAgICAgKHN0YXR1cyAmIE1JU0NTVEFUVVNfQ1RTX0xBVENIRUQpICkgeworCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0NUUykgeworCQkJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJCQlwcmludGsoIkNUUyB0eCBzdGFydC4uLiIpOworCQkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQkJdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKGluZm8pOworCQkJCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1RSQU5TTUlUOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIShzdGF0dXMgJiBNSVNDU1RBVFVTX0NUUykpIHsKKwkJCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJCQkJcHJpbnRrKCJDVFMgdHggc3RvcC4uLiIpOworCQkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQkJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7CisJCisJLyogZm9yIGRpYWdub3N0aWNzIHNldCBJUlEgZmxhZyAqLworCWlmICggc3RhdHVzICYgTUlTQ1NUQVRVU19UWENfTEFUQ0hFRCApeworCQl1c2NfT3V0UmVnKCBpbmZvLCBTSUNSLAorCQkJKHVuc2lnbmVkIHNob3J0KSh1c2NfSW5SZWcoaW5mbyxTSUNSKSAmIH4oU0lDUl9UWENfQUNUSVZFK1NJQ1JfVFhDX0lOQUNUSVZFKSkgKTsKKwkJdXNjX1VubGF0Y2hJb3N0YXR1c0JpdHMoIGluZm8sIE1JU0NTVEFUVVNfVFhDX0xBVENIRUQgKTsKKwkJaW5mby0+aXJxX29jY3VycmVkID0gMTsKKwl9CisKK30JLyogZW5kIG9mIG1nc2xfaXNyX2lvX3BpbigpICovCisKKy8qIG1nc2xfaXNyX3RyYW5zbWl0X2RhdGEoKQorICogCisgKiAJU2VydmljZSBhIHRyYW5zbWl0IGRhdGEgaW50ZXJydXB0IChhc3luYyBtb2RlIG9ubHkpLgorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl90cmFuc21pdF9kYXRhKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCXByaW50aygiJXMoJWQpOm1nc2xfaXNyX3RyYW5zbWl0X2RhdGEgeG1pdF9jbnQ9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT54bWl0X2NudCk7CisJCQkKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgVFJBTlNNSVRfREFUQSApOworCQorCWlmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCXVzY19zdG9wX3RyYW5zbWl0dGVyKGluZm8pOworCQlyZXR1cm47CisJfQorCQorCWlmICggaW5mby0+eG1pdF9jbnQgKQorCQl1c2NfbG9hZF90eGZpZm8oIGluZm8gKTsKKwllbHNlCisJCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJCQorCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykKKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKworfQkvKiBlbmQgb2YgbWdzbF9pc3JfdHJhbnNtaXRfZGF0YSgpICovCisKKy8qIG1nc2xfaXNyX3JlY2VpdmVfZGF0YSgpCisgKiAKKyAqIAlTZXJ2aWNlIGEgcmVjZWl2ZSBkYXRhIGludGVycnVwdC4gVGhpcyBvY2N1cnMKKyAqIAl3aGVuIG9wZXJhdGluZyBpbiBhc3luY2hyb25vdXMgaW50ZXJydXB0IHRyYW5zZmVyIG1vZGUuCisgKglUaGUgcmVjZWl2ZSBkYXRhIEZJRk8gaXMgZmx1c2hlZCB0byB0aGUgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuIAorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9pc3JfcmVjZWl2ZV9kYXRhKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWludCBGaWZvY291bnQ7CisJdTE2IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIERhdGFCeXRlOworIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworIAlzdHJ1Y3QJbWdzbF9pY291bnQgKmljb3VudCA9ICZpbmZvLT5pY291bnQ7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfcmVjZWl2ZV9kYXRhXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18pOworCisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFJFQ0VJVkVfREFUQSApOworCQorCS8qIHNlbGVjdCBGSUZPIHN0YXR1cyBmb3IgUklDUiByZWFkYmFjayAqLworCXVzY19SQ21kKCBpbmZvLCBSQ21kX1NlbGVjdFJpY3JSeEZpZm9zdGF0dXMgKTsKKworCS8qIGNsZWFyIHRoZSBXb3Jkc3RhdHVzIGJpdCBzbyB0aGF0IHN0YXR1cyByZWFkYmFjayAqLworCS8qIG9ubHkgcmVmbGVjdHMgdGhlIHN0YXR1cyBvZiB0aGlzIGJ5dGUgKi8KKwl1c2NfT3V0UmVnKCBpbmZvLCBSSUNSK0xTQk9OTFksICh1MTYpKHVzY19JblJlZyhpbmZvLCBSSUNSK0xTQk9OTFkpICYgfkJJVDMgKSk7CisKKwkvKiBmbHVzaCB0aGUgcmVjZWl2ZSBGSUZPICovCisKKwl3aGlsZSggKEZpZm9jb3VudCA9ICh1c2NfSW5SZWcoaW5mbyxSSUNSKSA+PiA4KSkgKSB7CisJCS8qIHJlYWQgb25lIGJ5dGUgZnJvbSBSeEZJRk8gKi8KKwkJb3V0dyggKGludyhpbmZvLT5pb19iYXNlICsgQ0NBUikgJiAweDA3ODApIHwgKFJEUitMU0JPTkxZKSwKKwkJICAgICAgaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKwkJRGF0YUJ5dGUgPSBpbmIoIGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisKKwkJLyogZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIHJlY2VpdmVkIGJ5dGUgKi8KKwkJc3RhdHVzID0gdXNjX0luUmVnKGluZm8sIFJDU1IpOworCQlpZiAoIHN0YXR1cyAmIChSWFNUQVRVU19GUkFNSU5HX0VSUk9SICsgUlhTVEFUVVNfUEFSSVRZX0VSUk9SICsKKwkJCQlSWFNUQVRVU19PVkVSUlVOICsgUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQpICkKKwkJCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKGluZm8sUlhTVEFUVVNfQUxMKTsKKwkJCisJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkJCWNvbnRpbnVlOworCQkJCisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gRGF0YUJ5dGU7CisJCWljb3VudC0+cngrKzsKKwkJCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKKwkJaWYgKCBzdGF0dXMgJiAoUlhTVEFUVVNfRlJBTUlOR19FUlJPUiArIFJYU1RBVFVTX1BBUklUWV9FUlJPUiArCisJCQkJUlhTVEFUVVNfT1ZFUlJVTiArIFJYU1RBVFVTX0JSRUFLX1JFQ0VJVkVEKSApIHsKKwkJCXByaW50aygicnhlcnI9JTA0WFxuIixzdGF0dXMpOwkJCQkJCisJCQkvKiB1cGRhdGUgZXJyb3Igc3RhdGlzdGljcyAqLworCQkJaWYgKCBzdGF0dXMgJiBSWFNUQVRVU19CUkVBS19SRUNFSVZFRCApIHsKKwkJCQlzdGF0dXMgJj0gfihSWFNUQVRVU19GUkFNSU5HX0VSUk9SICsgUlhTVEFUVVNfUEFSSVRZX0VSUk9SKTsKKwkJCQlpY291bnQtPmJyaysrOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSWFNUQVRVU19QQVJJVFlfRVJST1IpIAorCQkJCWljb3VudC0+cGFyaXR5Kys7CisJCQllbHNlIGlmIChzdGF0dXMgJiBSWFNUQVRVU19GUkFNSU5HX0VSUk9SKQorCQkJCWljb3VudC0+ZnJhbWUrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIFJYU1RBVFVTX09WRVJSVU4pIHsKKwkJCQkvKiBtdXN0IGlzc3VlIHB1cmdlIGZpZm8gY21kIGJlZm9yZSAqLworCQkJCS8qIDE2QzMyIGFjY2VwdHMgbW9yZSByZWNlaXZlIGNoYXJzICovCisJCQkJdXNjX1JUQ21kKGluZm8sUlRDbWRfUHVyZ2VSeEZpZm8pOworCQkJCWljb3VudC0+b3ZlcnJ1bisrOworCQkJfQorCisJCQkvKiBkaXNjYXJkIGNoYXIgaWYgdHR5IGNvbnRyb2wgZmxhZ3Mgc2F5IHNvICovCQkJCQkKKwkJCWlmIChzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spCisJCQkJY29udGludWU7CisJCQkJCisJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCisJCQlpZiAoc3RhdHVzICYgUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQpIHsKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9CUkVBSzsKKwkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCWRvX1NBSyh0dHkpOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSWFNUQVRVU19QQVJJVFlfRVJST1IpCisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOworCQkJZWxzZSBpZiAoc3RhdHVzICYgUlhTVEFUVVNfRlJBTUlOR19FUlJPUikKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKKwkJCWlmIChzdGF0dXMgJiBSWFNUQVRVU19PVkVSUlVOKSB7CisJCQkJLyogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCisJCQkJICogcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0CisJCQkJICogYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3RlcgorCQkJCSAqLworCQkJCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKKwkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKKwkJCQl9CisJCQl9CisJCX0JLyogZW5kIG9mIGlmIChlcnJvcikgKi8KKwkJCisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQl0dHktPmZsaXAuY291bnQrKzsKKwl9CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApIHsKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfcmVjZWl2ZV9kYXRhIGZsaXAgY291bnQ9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyx0dHktPmZsaXAuY291bnQpOworCQlwcmludGsoIiVzKCVkKTpyeD0lZCBicms9JWQgcGFyaXR5PSVkIGZyYW1lPSVkIG92ZXJydW49JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpY291bnQtPnJ4LGljb3VudC0+YnJrLAorCQkJaWNvdW50LT5wYXJpdHksaWNvdW50LT5mcmFtZSxpY291bnQtPm92ZXJydW4pOworCX0KKwkJCQorCWlmICggdHR5LT5mbGlwLmNvdW50ICkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworLyogbWdzbF9pc3JfbWlzYygpCisgKiAKKyAqIAlTZXJ2aWNlIGEgbWlzY2VsbGFuZW9zIGludGVycnVwdCBzb3VyY2UuCisgKiAJCisgKiBBcmd1bWVudHM6CQlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBleHRlbnNpb24gKGluc3RhbmNlIGRhdGEpCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9pc3JfbWlzYyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MTYgc3RhdHVzID0gdXNjX0luUmVnKCBpbmZvLCBNSVNSICk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2lzcl9taXNjIHN0YXR1cz0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sc3RhdHVzKTsKKwkJCQorCWlmICgoc3RhdHVzICYgTUlTQ1NUQVRVU19SQ0NfVU5ERVJSVU4pICYmCisJICAgIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykpIHsKKworCQkvKiB0dXJuIG9mZiByZWNlaXZlciBhbmQgcnggRE1BICovCisJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLERJU0FCTEVfVU5DT05ESVRJT05BTCk7CisJCXVzY19EbWFDbWQoaW5mbywgRG1hQ21kX1Jlc2V0UnhDaGFubmVsKTsKKwkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoaW5mbywgUlhTVEFUVVNfQUxMKTsKKwkJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoaW5mbywgUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMpOworCQl1c2NfRGlzYWJsZUludGVycnVwdHMoaW5mbywgUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMpOworCisJCS8qIHNjaGVkdWxlIEJIIGhhbmRsZXIgdG8gcmVzdGFydCByZWNlaXZlciAqLworCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1JFQ0VJVkU7CisJCWluZm8tPnJ4X3JjY191bmRlcnJ1biA9IDE7CisJfQorCisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIE1JU0MgKTsKKwl1c2NfVW5sYXRjaE1pc2NzdGF0dXNCaXRzKCBpbmZvLCBzdGF0dXMgKTsKKworfQkvKiBlbmQgb2YgbWdzbF9pc3JfbWlzYygpICovCisKKy8qIG1nc2xfaXNyX251bGwoKQorICoKKyAqIAlTZXJ2aWNlcyB1bmRlZmluZWQgaW50ZXJydXB0IHZlY3RvcnMgZnJvbSB0aGUKKyAqIAlVU0MuIChoZW5jZSB0aGlzIGZ1bmN0aW9uIFNIT1VMRCBuZXZlciBiZSBjYWxsZWQpCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbiAoaW5zdGFuY2UgZGF0YSkKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9udWxsKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCit9CS8qIGVuZCBvZiBtZ3NsX2lzcl9udWxsKCkgKi8KKworLyogbWdzbF9pc3JfcmVjZWl2ZV9kbWEoKQorICogCisgKiAJU2VydmljZSBhIHJlY2VpdmUgRE1BIGNoYW5uZWwgaW50ZXJydXB0LgorICogCUZvciB0aGlzIGRyaXZlciB0aGVyZSBhcmUgdHdvIHNvdXJjZXMgb2YgcmVjZWl2ZSBETUEgaW50ZXJydXB0cworICogCWFzIGlkZW50aWZpZWQgaW4gdGhlIFJlY2VpdmUgRE1BIG1vZGUgUmVnaXN0ZXIgKFJETVIpOgorICogCisgKiAJQklUMwlFT0EvRU9MCQlFbmQgb2YgTGlzdCwgYWxsIHJlY2VpdmUgYnVmZmVycyBpbiByZWNlaXZlCisgKiAJCQkJYnVmZmVyIGxpc3QgaGF2ZSBiZWVuIGZpbGxlZCAobm8gbW9yZSBmcmVlIGJ1ZmZlcnMKKyAqIAkJCQlhdmFpbGFibGUpLiBUaGUgRE1BIGNvbnRyb2xsZXIgaGFzIHNodXQgZG93bi4KKyAqIAorICogCUJJVDIJRU9CCQlFbmQgb2YgQnVmZmVyLiBUaGlzIGludGVycnVwdCBvY2N1cnMgd2hlbiBhIHJlY2VpdmUKKyAqIAkJCQlETUEgYnVmZmVyIGlzIHRlcm1pbmF0ZWQgaW4gcmVzcG9uc2UgdG8gY29tcGxldGlvbgorICogCQkJCW9mIGEgZ29vZCBmcmFtZSBvciBhIGZyYW1lIHdpdGggZXJyb3JzLiBUaGUgc3RhdHVzCisgKiAJCQkJb2YgdGhlIGZyYW1lIGlzIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGVudHJ5IGluIHRoZQorICogCQkJCWxpc3Qgb2YgcmVjZWl2ZSBidWZmZXIgZW50cmllcy4KKyAqIAorICogQXJndW1lbnRzOgkJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3JlY2VpdmVfZG1hKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXUxNiBzdGF0dXM7CisJCisJLyogY2xlYXIgaW50ZXJydXB0IHBlbmRpbmcgYW5kIElVUyBiaXQgZm9yIFJ4IERNQSBJUlEgKi8KKwl1c2NfT3V0RG1hUmVnKCBpbmZvLCBDRElSLCBCSVQ5K0JJVDEgKTsKKworCS8qIFJlYWQgdGhlIHJlY2VpdmUgRE1BIHN0YXR1cyB0byBpZGVudGlmeSBpbnRlcnJ1cHQgdHlwZS4gKi8KKwkvKiBUaGlzIGFsc28gY2xlYXJzIHRoZSBzdGF0dXMgYml0cy4gKi8KKwlzdGF0dXMgPSB1c2NfSW5EbWFSZWcoIGluZm8sIFJETVIgKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCXByaW50aygiJXMoJWQpOm1nc2xfaXNyX3JlY2VpdmVfZG1hKCVzKSBzdGF0dXM9JTA0WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisJCQkKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1JFQ0VJVkU7CisJCisJaWYgKCBzdGF0dXMgJiBCSVQzICkgeworCQlpbmZvLT5yeF9vdmVyZmxvdyA9IDE7CisJCWluZm8tPmljb3VudC5idWZfb3ZlcnJ1bisrOworCX0KKworfQkvKiBlbmQgb2YgbWdzbF9pc3JfcmVjZWl2ZV9kbWEoKSAqLworCisvKiBtZ3NsX2lzcl90cmFuc21pdF9kbWEoKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2VydmljZXMgYSB0cmFuc21pdCBETUEgY2hhbm5lbCBpbnRlcnJ1cHQuCisgKgorICoJRm9yIHRoaXMgZHJpdmVyIHRoZXJlIGlzIG9uZSBzb3VyY2Ugb2YgdHJhbnNtaXQgRE1BIGludGVycnVwdHMKKyAqCWFzIGlkZW50aWZpZWQgaW4gdGhlIFRyYW5zbWl0IERNQSBNb2RlIFJlZ2lzdGVyIChURE1SKToKKyAqCisgKiAgICAgCUJJVDIgIEVPQiAgICAgICBFbmQgb2YgQnVmZmVyLiBUaGlzIGludGVycnVwdCBvY2N1cnMgd2hlbiBhCisgKiAgICAgCQkJdHJhbnNtaXQgRE1BIGJ1ZmZlciBoYXMgYmVlbiBlbXB0aWVkLgorICoKKyAqICAgICAJVGhlIGRyaXZlciBtYWludGFpbnMgZW5vdWdoIHRyYW5zbWl0IERNQSBidWZmZXJzIHRvIGhvbGQgYXQgbGVhc3QKKyAqICAgICAJb25lIG1heCBmcmFtZSBzaXplIHRyYW5zbWl0IGZyYW1lLiBXaGVuIG9wZXJhdGluZyBpbiBhIGJ1ZmZlcmVkCisgKiAgICAgCXRyYW5zbWl0IG1vZGUsIHRoZXJlIG1heSBiZSBlbm91Z2ggdHJhbnNtaXQgRE1BIGJ1ZmZlcnMgdG8gaG9sZCBhdAorICogICAgIAlsZWFzdCB0d28gb3IgbW9yZSBtYXggZnJhbWUgc2l6ZSBmcmFtZXMuIE9uIGFuIEVPQiBjb25kaXRpb24sCisgKiAgICAgCWRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IHF1ZXVlZCB0cmFuc21pdCBidWZmZXJzIGFuZCBjb3B5IGludG8KKyAqICAgICAJdHJhbnNtaXQgRE1BIGJ1ZmZlcnMgaWYgd2UgaGF2ZSByb29tLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl90cmFuc21pdF9kbWEoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IHN0YXR1czsKKworCS8qIGNsZWFyIGludGVycnVwdCBwZW5kaW5nIGFuZCBJVVMgYml0IGZvciBUeCBETUEgSVJRICovCisJdXNjX091dERtYVJlZyhpbmZvLCBDRElSLCBCSVQ4K0JJVDAgKTsKKworCS8qIFJlYWQgdGhlIHRyYW5zbWl0IERNQSBzdGF0dXMgdG8gaWRlbnRpZnkgaW50ZXJydXB0IHR5cGUuICovCisJLyogVGhpcyBhbHNvIGNsZWFycyB0aGUgc3RhdHVzIGJpdHMuICovCisKKwlzdGF0dXMgPSB1c2NfSW5EbWFSZWcoIGluZm8sIFRETVIgKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfdHJhbnNtaXRfZG1hKCVzKSBzdGF0dXM9JTA0WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisKKwlpZiAoIHN0YXR1cyAmIEJJVDIgKSB7CisJCS0taW5mby0+dHhfZG1hX2J1ZmZlcnNfdXNlZDsKKworCQkvKiBpZiB0aGVyZSBhcmUgdHJhbnNtaXQgZnJhbWVzIHF1ZXVlZCwKKwkJICogIHRyeSB0byBsb2FkIHRoZSBuZXh0IG9uZQorCQkgKi8KKwkJaWYgKCBsb2FkX25leHRfdHhfaG9sZGluZ19idWZmZXIoaW5mbykgKSB7CisJCQkvKiBpZiBjYWxsIHJldHVybnMgbm9uLXplcm8gdmFsdWUsIHdlIGhhdmUKKwkJCSAqIGF0IGxlYXN0IG9uZSBmcmVlIHR4IGhvbGRpbmcgYnVmZmVyCisJCQkgKi8KKwkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJCX0KKwl9CisKK30JLyogZW5kIG9mIG1nc2xfaXNyX3RyYW5zbWl0X2RtYSgpICovCisKKy8qIG1nc2xfaW50ZXJydXB0KCkKKyAqIAorICogCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZW50cnkgcG9pbnQuCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlpcnEJCWludGVycnVwdCBudW1iZXIgdGhhdCBjYXVzZWQgaW50ZXJydXB0CisgKiAJZGV2X2lkCQlkZXZpY2UgSUQgc3VwcGxpZWQgZHVyaW5nIGludGVycnVwdCByZWdpc3RyYXRpb24KKyAqIAlyZWdzCQlpbnRlcnJ1cHRlZCBwcm9jZXNzb3IgY29udGV4dAorICogCQorICogUmV0dXJuIFZhbHVlOiBOb25lCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtZ3NsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvOworCXUxNiBVc2NWZWN0b3I7CisJdTE2IERtYVZlY3RvcjsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCXByaW50aygiJXMoJWQpOm1nc2xfaW50ZXJydXB0KCVkKWVudHJ5LlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGlycSk7CisKKwlpbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKWRldl9pZDsJCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCQorCXNwaW5fbG9jaygmaW5mby0+aXJxX3NwaW5sb2NrKTsKKworCWZvcig7OykgeworCQkvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgdmVjdG9ycyBmcm9tIGhhcmR3YXJlLiAqLworCQlVc2NWZWN0b3IgPSB1c2NfSW5SZWcoaW5mbywgSVZSKSA+PiA5OworCQlEbWFWZWN0b3IgPSB1c2NfSW5EbWFSZWcoaW5mbywgRElWUik7CisJCQorCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQkJcHJpbnRrKCIlcyglZCk6JXMgVXNjVmVjdG9yPSUwOFggRG1hVmVjdG9yPSUwOFhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsVXNjVmVjdG9yLERtYVZlY3Rvcik7CisJCQkKKwkJaWYgKCAhVXNjVmVjdG9yICYmICFEbWFWZWN0b3IgKQorCQkJYnJlYWs7CisJCQkKKwkJLyogRGlzcGF0Y2ggaW50ZXJydXB0IHZlY3RvciAqLworCQlpZiAoIFVzY1ZlY3RvciApCisJCQkoKlVzY0lzclRhYmxlW1VzY1ZlY3Rvcl0pKGluZm8pOworCQllbHNlIGlmICggKERtYVZlY3RvciYoQklUMTB8QklUOSkpID09IEJJVDEwKQorCQkJbWdzbF9pc3JfdHJhbnNtaXRfZG1hKGluZm8pOworCQllbHNlCisJCQltZ3NsX2lzcl9yZWNlaXZlX2RtYShpbmZvKTsKKworCQlpZiAoIGluZm8tPmlzcl9vdmVyZmxvdyApIHsKKwkJCXByaW50ayhLRVJOX0VSUiIlcyglZCk6JXMgaXNyIG92ZXJmbG93IGlycT0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaXJxKTsKKwkJCXVzY19EaXNhYmxlTWFzdGVySXJxQml0KGluZm8pOworCQkJdXNjX0Rpc2FibGVEbWFJbnRlcnJ1cHRzKGluZm8sRElDUl9NQVNURVIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJLyogUmVxdWVzdCBib3R0b20gaGFsZiBwcm9jZXNzaW5nIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIAorCSAqIGZvciBpdCB0byBkbyBhbmQgdGhlIGJoIGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcKKwkgKi8KKworCWlmICggaW5mby0+cGVuZGluZ19iaCAmJiAhaW5mby0+YmhfcnVubmluZyAmJiAhaW5mby0+YmhfcmVxdWVzdGVkICkgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQkJcHJpbnRrKCIlcyglZCk6JXMgcXVldWVpbmcgYmggdGFzay5cbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50YXNrKTsKKwkJaW5mby0+YmhfcmVxdWVzdGVkID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmaW5mby0+aXJxX3NwaW5sb2NrKTsKKwkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2ludGVycnVwdCglZClleGl0LlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGlycSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkvKiBlbmQgb2YgbWdzbF9pbnRlcnJ1cHQoKSAqLworCisvKiBzdGFydHVwKCkKKyAqIAorICogCUluaXRpYWxpemUgYW5kIHN0YXJ0IGRldmljZS4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvKQoreworCWludCByZXR2YWwgPSAwOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMoJWQpOm1nc2xfc3RhcnR1cCglcylcbiIsX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQkKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJcmV0dXJuIDA7CisJCisJaWYgKCFpbmZvLT54bWl0X2J1ZikgeworCQkvKiBhbGxvY2F0ZSBhIHBhZ2Ugb2YgbWVtb3J5IGZvciBhIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWluZm8tPnhtaXRfYnVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIiJXMoJWQpOiVzIGNhbid0IGFsbG9jYXRlIHRyYW5zbWl0IGJ1ZmZlclxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWluZm8tPnBlbmRpbmdfYmggPSAwOworCQorCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwlpbmZvLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwlpbmZvLT50eF90aW1lci5mdW5jdGlvbiA9IG1nc2xfdHhfdGltZW91dDsKKwkKKwkvKiBBbGxvY2F0ZSBhbmQgY2xhaW0gYWRhcHRlciByZXNvdXJjZXMgKi8KKwlyZXR2YWwgPSBtZ3NsX2NsYWltX3Jlc291cmNlcyhpbmZvKTsKKwkKKwkvKiBwZXJmb3JtIGV4aXN0ZW5jZSBjaGVjayBhbmQgZGlhZ25vc3RpY3MgKi8KKwlpZiAoICFyZXR2YWwgKQorCQlyZXR2YWwgPSBtZ3NsX2FkYXB0ZXJfdGVzdChpbmZvKTsKKwkJCisJaWYgKCByZXR2YWwgKSB7CisgIAkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgJiYgaW5mby0+dHR5KQorCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkJbWdzbF9yZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKyAgCQlyZXR1cm4gcmV0dmFsOworICAJfQorCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCisJbWdzbF9jaGFuZ2VfcGFyYW1zKGluZm8pOworCQorCWlmIChpbmZvLT50dHkpCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCQorCXJldHVybiAwOworCQorfQkvKiBlbmQgb2Ygc3RhcnR1cCgpICovCisKKy8qIHNodXRkb3duKCkKKyAqCisgKiBDYWxsZWQgYnkgbWdzbF9jbG9zZSgpIGFuZCBtZ3NsX2hhbmd1cCgpIHRvIHNodXRkb3duIGhhcmR3YXJlCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9zaHV0ZG93biglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwkvKiBjbGVhciBzdGF0dXMgd2FpdCBxdWV1ZSBiZWNhdXNlIHN0YXR1cyBjaGFuZ2VzICovCisJLyogY2FuJ3QgaGFwcGVuIGFmdGVyIHNodXR0aW5nIGRvd24gdGhlIGhhcmR3YXJlICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisKKwlpZiAoaW5mby0+eG1pdF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl1c2NfRGlzYWJsZU1hc3RlcklycUJpdChpbmZvKTsKKwl1c2Nfc3RvcF9yZWNlaXZlcihpbmZvKTsKKwl1c2Nfc3RvcF90cmFuc21pdHRlcihpbmZvKTsKKwl1c2NfRGlzYWJsZUludGVycnVwdHMoaW5mbyxSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyArCisJCVRSQU5TTUlUX0RBVEEgKyBUUkFOU01JVF9TVEFUVVMgKyBJT19QSU4gKyBNSVNDICk7CisJdXNjX0Rpc2FibGVEbWFJbnRlcnJ1cHRzKGluZm8sRElDUl9NQVNURVIgKyBESUNSX1RSQU5TTUlUICsgRElDUl9SRUNFSVZFKTsKKwkKKwkvKiBEaXNhYmxlIERNQUVOIChQb3J0IDcsIEJpdCAxNCkgKi8KKwkvKiBUaGlzIGRpc2Nvbm5lY3RzIHRoZSBETUEgcmVxdWVzdCBzaWduYWwgZnJvbSB0aGUgSVNBIGJ1cyAqLworCS8qIG9uIHRoZSBJU0EgYWRhcHRlci4gVGhpcyBoYXMgbm8gZWZmZWN0IGZvciB0aGUgUENJIGFkYXB0ZXIgKi8KKwl1c2NfT3V0UmVnKGluZm8sIFBDUiwgKHUxNikoKHVzY19JblJlZyhpbmZvLCBQQ1IpIHwgQklUMTUpIHwgQklUMTQpKTsKKwkKKwkvKiBEaXNhYmxlIElOVEVOIChQb3J0IDYsIEJpdDEyKSAqLworCS8qIFRoaXMgZGlzY29ubmVjdHMgdGhlIElSUSByZXF1ZXN0IHNpZ25hbCB0byB0aGUgSVNBIGJ1cyAqLworCS8qIG9uIHRoZSBJU0EgYWRhcHRlci4gVGhpcyBoYXMgbm8gZWZmZWN0IGZvciB0aGUgUENJIGFkYXB0ZXIgKi8KKwl1c2NfT3V0UmVnKGluZm8sIFBDUiwgKHUxNikoKHVzY19JblJlZyhpbmZvLCBQQ1IpIHwgQklUMTMpIHwgQklUMTIpKTsKKwkKKyAJaWYgKCFpbmZvLT50dHkgfHwgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKyAJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFMpOworCQl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJbWdzbF9yZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsJCisJCisJaWYgKGluZm8tPnR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKwkKK30JLyogZW5kIG9mIHNodXRkb3duKCkgKi8KKworc3RhdGljIHZvaWQgbWdzbF9wcm9ncmFtX2h3KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJdXNjX3N0b3BfcmVjZWl2ZXIoaW5mbyk7CisJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCSAgICBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXIHx8CisJICAgIGluZm8tPm5ldGNvdW50KQorCQl1c2Nfc2V0X3N5bmNfbW9kZShpbmZvKTsKKwllbHNlCisJCXVzY19zZXRfYXN5bmNfbW9kZShpbmZvKTsKKwkJCisJdXNjX3NldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwkKKwlpbmZvLT5kY2RfY2hrY291bnQgPSAwOworCWluZm8tPmN0c19jaGtjb3VudCA9IDA7CisJaW5mby0+cmlfY2hrY291bnQgPSAwOworCWluZm8tPmRzcl9jaGtjb3VudCA9IDA7CisKKwl1c2NfRW5hYmxlU3RhdHVzSXJxcyhpbmZvLFNJQ1JfQ1RTK1NJQ1JfRFNSK1NJQ1JfRENEK1NJQ1JfUkkpOwkJCisJdXNjX0VuYWJsZUludGVycnVwdHMoaW5mbywgSU9fUElOKTsKKwl1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQkKKwlpZiAoaW5mby0+bmV0Y291bnQgfHwgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpCisJCXVzY19zdGFydF9yZWNlaXZlcihpbmZvKTsKKwkJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKK30KKworLyogUmVjb25maWd1cmUgYWRhcHRlciBiYXNlZCBvbiBuZXcgcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBtZ3NsX2NoYW5nZV9wYXJhbXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGNmbGFnOworCWludCBiaXRzX3Blcl9jaGFyOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuOworCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9jaGFuZ2VfcGFyYW1zKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8qIGlmIEIwIHJhdGUgKGhhbmd1cCkgc3BlY2lmaWVkIHRoZW4gbmVnYXRlIERUUiBhbmQgUlRTICovCisJLyogb3RoZXJ3aXNlIGFzc2VydCBEVFIgYW5kIFJUUyAqLworIAlpZiAoY2ZsYWcgJiBDQkFVRCkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJZWxzZQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkKKwkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLworCQorCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCSAgICAgIGNhc2UgQ1M1OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNTsgYnJlYWs7CisJICAgICAgY2FzZSBDUzY6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA2OyBicmVhazsKKwkgICAgICBjYXNlIENTNzogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDc7IGJyZWFrOworCSAgICAgIGNhc2UgQ1M4OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gODsgYnJlYWs7CisJICAgICAgLyogTmV2ZXIgaGFwcGVucywgYnV0IEdDQyBpcyB0b28gZHVtYiB0byBmaWd1cmUgaXQgb3V0ICovCisJICAgICAgZGVmYXVsdDogIGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA3OyBicmVhazsKKwkgICAgICB9CisJICAgICAgCisJaWYgKGNmbGFnICYgQ1NUT1BCKQorCQlpbmZvLT5wYXJhbXMuc3RvcF9iaXRzID0gMjsKKwllbHNlCisJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgPSAxOworCisJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9OT05FOworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlpZiAoY2ZsYWcgJiBQQVJPREQpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX09ERDsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9FVkVOOworI2lmZGVmIENNU1BBUgorCQlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX1NQQUNFOworI2VuZGlmCisJfQorCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBqaWZmaWVzIHRvIHRyYW5zbWl0IGEgZnVsbAorCSAqIEZJRk8gKDMyIGJ5dGVzKSBhdCBzcGVjaWZpZWQgZGF0YSByYXRlCisJICovCisJYml0c19wZXJfY2hhciA9IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgKyAKKwkJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgKyAxOworCisJLyogaWYgcG9ydCBkYXRhIHJhdGUgaXMgc2V0IHRvIDQ2MDgwMCBvciBsZXNzIHRoZW4KKwkgKiBhbGxvdyB0dHkgc2V0dGluZ3MgdG8gb3ZlcnJpZGUsIG90aGVyd2lzZSBrZWVwIHRoZQorCSAqIGN1cnJlbnQgZGF0YSByYXRlLgorCSAqLworCWlmIChpbmZvLT5wYXJhbXMuZGF0YV9yYXRlIDw9IDQ2MDgwMCkKKwkJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CisJCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICkgeworCQlpbmZvLT50aW1lb3V0ID0gKDMyKkhaKmJpdHNfcGVyX2NoYXIpIC8gCisJCQkJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZTsKKwl9CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwllbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkJCisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworCS8qIHByb2Nlc3MgdHR5IGlucHV0IGNvbnRyb2wgZmxhZ3MgKi8KKwkKKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gUlhTVEFUVVNfT1ZFUlJVTjsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFJYU1RBVFVTX1BBUklUWV9FUlJPUiB8IFJYU1RBVFVTX0ZSQU1JTkdfRVJST1I7CisgCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCisgCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFJYU1RBVFVTX0JSRUFLX1JFQ0VJVkVEOworCQorCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gUlhTVEFUVVNfUEFSSVRZX0VSUk9SIHwgUlhTVEFUVVNfRlJBTUlOR19FUlJPUjsKKwlpZiAoSV9JR05CUksoaW5mby0+dHR5KSkgeworCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQ7CisJCS8qIElmIGlnbm9yaW5nIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywgaWdub3JlIAorCQkgKiBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gUlhTVEFUVVNfT1ZFUlJVTjsKKwl9CisKKwltZ3NsX3Byb2dyYW1faHcoaW5mbyk7CisKK30JLyogZW5kIG9mIG1nc2xfY2hhbmdlX3BhcmFtcygpICovCisKKy8qIG1nc2xfcHV0X2NoYXIoKQorICogCisgKiAJQWRkIGEgY2hhcmFjdGVyIHRvIHRoZSB0cmFuc21pdCBidWZmZXIuCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiAJCQljaAljaGFyYWN0ZXIgdG8gYWRkIHRvIHRyYW5zbWl0IGJ1ZmZlcgorICogCQkKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApIHsKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfcHV0X2NoYXIoJWQpIG9uICVzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sY2gsaW5mby0+ZGV2aWNlX25hbWUpOworCX0JCQorCQorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCisJaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwlpZiAoIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMgKSB8fCAhaW5mby0+dHhfYWN0aXZlICkgeworCQorCQlpZiAoaW5mby0+eG1pdF9jbnQgPCBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgeworCQkJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisJCQlpbmZvLT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRS0xOworCQkJaW5mby0+eG1pdF9jbnQrKzsKKwkJfQorCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorfQkvKiBlbmQgb2YgbWdzbF9wdXRfY2hhcigpICovCisKKy8qIG1nc2xfZmx1c2hfY2hhcnMoKQorICogCisgKiAJRW5hYmxlIHRyYW5zbWl0dGVyIHNvIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZQorICogCXRyYW5zbWl0IGJ1ZmZlciBhcmUgc2VudC4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9mbHVzaF9jaGFycygpIGVudHJ5IG9uICVzIHhtaXRfY250PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsaW5mby0+eG1pdF9jbnQpOworCQorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfZmx1c2hfY2hhcnMiKSkKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCSAgICAhaW5mby0+eG1pdF9idWYpCisJCXJldHVybjsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX2ZsdXNoX2NoYXJzKCkgZW50cnkgb24gJXMgc3RhcnRpbmcgdHJhbnNtaXR0ZXJcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJaWYgKCFpbmZvLT50eF9hY3RpdmUpIHsKKwkJaWYgKCAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgfHwKKwkJCWluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcpICYmIGluZm8tPnhtaXRfY250ICkgeworCQkJLyogb3BlcmF0aW5nIGluIHN5bmNocm9ub3VzIChmcmFtZSBvcmllbnRlZCkgbW9kZSAqLworCQkJLyogY29weSBkYXRhIGZyb20gY2lyY3VsYXIgeG1pdF9idWYgdG8gKi8KKwkJCS8qIHRyYW5zbWl0IERNQSBidWZmZXIuICovCisJCQltZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcihpbmZvLAorCQkJCSBpbmZvLT54bWl0X2J1ZixpbmZvLT54bWl0X2NudCk7CisJCX0KKwkgCXVzY19zdGFydF90cmFuc21pdHRlcihpbmZvKTsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKK30JLyogZW5kIG9mIG1nc2xfZmx1c2hfY2hhcnMoKSAqLworCisvKiBtZ3NsX3dyaXRlKCkKKyAqIAorICogCVNlbmQgYSBibG9jayBvZiBkYXRhCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAl0dHkJCXBvaW50ZXIgdG8gdHR5IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogCWJ1ZgkJcG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBzZW5kIGRhdGEKKyAqIAljb3VudAkJc2l6ZSBvZiBzZW5kIGRhdGEgaW4gYnl0ZXMKKyAqIAkKKyAqIFJldHVybiBWYWx1ZToJbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IG1nc2xfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQJYywgcmV0ID0gMDsKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX3dyaXRlKCVzKSBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGNvdW50KTsKKwkKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3dyaXRlIikpCisJCWdvdG8gY2xlYW51cDsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCQkJaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVyApIHsKKwkJLyogb3BlcmF0aW5nIGluIHN5bmNocm9ub3VzIChmcmFtZSBvcmllbnRlZCkgbW9kZSAqLworCQkvKiBvcGVyYXRpbmcgaW4gc3luY2hyb25vdXMgKGZyYW1lIG9yaWVudGVkKSBtb2RlICovCisJCWlmIChpbmZvLT50eF9hY3RpdmUpIHsKKworCQkJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyApIHsKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCS8qIHRyYW5zbWl0dGVyIGlzIGFjdGl2ZWx5IHNlbmRpbmcgZGF0YSAtCisJCQkgKiBpZiB3ZSBoYXZlIG11bHRpcGxlIHRyYW5zbWl0IGRtYSBhbmQKKwkJCSAqIGhvbGRpbmcgYnVmZmVycywgYXR0ZW1wdCB0byBxdWV1ZSB0aGlzCisJCQkgKiBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uIGF0IGEgbGF0ZXIgdGltZS4KKwkJCSAqLworCQkJaWYgKGluZm8tPnR4X2hvbGRpbmdfY291bnQgPj0gaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyApIHsKKwkJCQkvKiBubyB0eCBob2xkaW5nIGJ1ZmZlcnMgYXZhaWxhYmxlICovCisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisKKwkJCS8qIHF1ZXVlIHRyYW5zbWl0IGZyYW1lIHJlcXVlc3QgKi8KKwkJCXJldCA9IGNvdW50OworCQkJc2F2ZV90eF9idWZmZXJfcmVxdWVzdChpbmZvLGJ1Zixjb3VudCk7CisKKwkJCS8qIGlmIHdlIGhhdmUgc3VmZmljaWVudCB0eCBkbWEgYnVmZmVycywKKwkJCSAqIGxvYWQgdGhlIG5leHQgYnVmZmVyZWQgdHggcmVxdWVzdAorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCWxvYWRfbmV4dF90eF9ob2xkaW5nX2J1ZmZlcihpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkKKwkJLyogaWYgb3BlcmF0aW5nIGluIEhETEMgTG9vcE1vZGUgYW5kIHRoZSBhZGFwdGVyICAqLworCQkvKiBoYXMgeWV0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxvb3AsIHdlIGNhbid0ICovCisJCS8qIHRyYW5zbWl0CQkJCQkgICovCisKKwkJaWYgKCAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0hETENfTE9PUE1PREUpICYmCisJCQkhdXNjX2xvb3Btb2RlX2FjdGl2ZShpbmZvKSApCisJCXsKKwkJCXJldCA9IDA7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpZiAoIGluZm8tPnhtaXRfY250ICkgeworCQkJLyogU2VuZCBhY2N1bXVsYXRlZCBmcm9tIHNlbmRfY2hhcigpIGNhbGxzICovCisJCQkvKiBhcyBmcmFtZSBhbmQgd2FpdCBiZWZvcmUgYWNjZXB0aW5nIG1vcmUgZGF0YS4gKi8KKwkJCXJldCA9IDA7CisJCQkKKwkJCS8qIGNvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIHhtaXRfYnVmIHRvICovCisJCQkvKiB0cmFuc21pdCBETUEgYnVmZmVyLiAqLworCQkJbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoaW5mbywKKwkJCQlpbmZvLT54bWl0X2J1ZixpbmZvLT54bWl0X2NudCk7CisJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJCXByaW50ayggIiVzKCVkKTptZ3NsX3dyaXRlKCVzKSBzeW5jIHhtaXRfY250IGZsdXNoaW5nXG4iLAorCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJCXByaW50ayggIiVzKCVkKTptZ3NsX3dyaXRlKCVzKSBzeW5jIHRyYW5zbWl0IGFjY2VwdGVkXG4iLAorCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQlyZXQgPSBjb3VudDsKKwkJCWluZm8tPnhtaXRfY250ID0gY291bnQ7CisJCQltZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcihpbmZvLGJ1Zixjb3VudCk7CisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAoMSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQljID0gbWluX3QoaW50LCBjb3VudCwKKwkJCQltaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwKKwkJCQkgICAgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOworCQkJaWYgKGMgPD0gMCkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7CisJCQlpbmZvLT54bWl0X2hlYWQgPSAoKGluZm8tPnhtaXRfaGVhZCArIGMpICYKKwkJCQkJICAgKFNFUklBTF9YTUlUX1NJWkUtMSkpOworCQkJaW5mby0+eG1pdF9jbnQgKz0gYzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQlidWYgKz0gYzsKKwkJCWNvdW50IC09IGM7CisJCQlyZXQgKz0gYzsKKwkJfQorCX0JCisJCisgCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWlmICghaW5mby0+dHhfYWN0aXZlKQorCQkgCXVzY19zdGFydF90cmFuc21pdHRlcihpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKyAJfQorY2xlYW51cDoJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfd3JpdGUoJXMpIHJldHVybmluZz0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHJldCk7CisJCQkKKwlyZXR1cm4gcmV0OworCQorfQkvKiBlbmQgb2YgbWdzbF93cml0ZSgpICovCisKKy8qIG1nc2xfd3JpdGVfcm9vbSgpCisgKgorICoJUmV0dXJuIHRoZSBjb3VudCBvZiBmcmVlIGJ5dGVzIGluIHRyYW5zbWl0IGJ1ZmZlcgorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIGludCBtZ3NsX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQJcmV0OworCQkJCQorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfd3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF93cml0ZV9yb29tKCVzKT0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUscmV0ICk7CisJCQkgCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCQlpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkgeworCQkvKiBvcGVyYXRpbmcgaW4gc3luY2hyb25vdXMgKGZyYW1lIG9yaWVudGVkKSBtb2RlICovCisJCWlmICggaW5mby0+dHhfYWN0aXZlICkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gSERMQ19NQVhfRlJBTUVfU0laRTsKKwl9CisJCisJcmV0dXJuIHJldDsKKwkKK30JLyogZW5kIG9mIG1nc2xfd3JpdGVfcm9vbSgpICovCisKKy8qIG1nc2xfY2hhcnNfaW5fYnVmZmVyKCkKKyAqCisgKglSZXR1cm4gdGhlIGNvdW50IG9mIGJ5dGVzIGluIHRyYW5zbWl0IGJ1ZmZlcgorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIGludCBtZ3NsX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCQkJIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2NoYXJzX2luX2J1ZmZlciglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisJCQkgCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2NoYXJzX2luX2J1ZmZlciglcyk9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLGluZm8tPnhtaXRfY250ICk7CisJCQkgCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCQlpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkgeworCQkvKiBvcGVyYXRpbmcgaW4gc3luY2hyb25vdXMgKGZyYW1lIG9yaWVudGVkKSBtb2RlICovCisJCWlmICggaW5mby0+dHhfYWN0aXZlICkKKwkJCXJldHVybiBpbmZvLT5tYXhfZnJhbWVfc2l6ZTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCQkJIAorCXJldHVybiBpbmZvLT54bWl0X2NudDsKK30JLyogZW5kIG9mIG1nc2xfY2hhcnNfaW5fYnVmZmVyKCkgKi8KKworLyogbWdzbF9mbHVzaF9idWZmZXIoKQorICoKKyAqCURpc2NhcmQgYWxsIGRhdGEgaW4gdGhlIHNlbmQgYnVmZmVyCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfZmx1c2hfYnVmZmVyKCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOyAKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJZGVsX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKK30KKworLyogbWdzbF9zZW5kX3hjaGFyKCkKKyAqCisgKglTZW5kIGEgaGlnaC1wcmlvcml0eSBYT04vWE9GRiBjaGFyYWN0ZXIKKyAqIAkKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvIHN0cnVjdHVyZQorICoJCQljaAljaGFyYWN0ZXIgdG8gc2VuZAorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9zZW5kX3hjaGFyKCVzLCVkKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGNoICk7CisJCQkgCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9zZW5kX3hjaGFyIikpCisJCXJldHVybjsKKworCWluZm8tPnhfY2hhciA9IGNoOworCWlmIChjaCkgeworCQkvKiBNYWtlIHN1cmUgdHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgb24gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkJIAl1c2Nfc3RhcnRfdHJhbnNtaXR0ZXIoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJfQorfQkvKiBlbmQgb2YgbWdzbF9zZW5kX3hjaGFyKCkgKi8KKworLyogbWdzbF90aHJvdHRsZSgpCisgKiAKKyAqIAlTaWduYWwgcmVtb3RlIGRldmljZSB0byB0aHJvdHRsZSBzZW5kIGRhdGEgKG91ciByZWNlaXZlIGRhdGEpCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfdGhyb3R0bGUoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF90aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJaWYgKElfSVhPRkYodHR5KSkKKwkJbWdzbF9zZW5kX3hjaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOworIAorIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJIAl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCX0KK30JLyogZW5kIG9mIG1nc2xfdGhyb3R0bGUoKSAqLworCisvKiBtZ3NsX3VudGhyb3R0bGUoKQorICogCisgKiAJU2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gc3RvcCB0aHJvdHRsaW5nIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqIAkKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3VudGhyb3R0bGUoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF91bnRocm90dGxlIikpCisJCXJldHVybjsKKwkKKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlmIChpbmZvLT54X2NoYXIpCisJCQlpbmZvLT54X2NoYXIgPSAwOworCQllbHNlCisJCQltZ3NsX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCX0KKwkKKyAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisJIAl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCX0KKwkKK30JLyogZW5kIG9mIG1nc2xfdW50aHJvdHRsZSgpICovCisKKy8qIG1nc2xfZ2V0X3N0YXRzKCkKKyAqIAorICogCWdldCB0aGUgY3VycmVudCBzZXJpYWwgcGFyYW1ldGVycyBpbmZvcm1hdGlvbgorICoKKyAqIEFyZ3VtZW50czoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCQl1c2VyX2ljb3VudAlwb2ludGVyIHRvIGJ1ZmZlciB0byBob2xkIHJldHVybmVkIHN0YXRzCisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX2dldF9zdGF0cyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBzdHJ1Y3QgbWdzbF9pY291bnQgX191c2VyICp1c2VyX2ljb3VudCkKK3sKKwlpbnQgZXJyOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF9wYXJhbXMoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQkKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfaWNvdW50LCAmaW5mby0+aWNvdW50LCBzaXplb2Yoc3RydWN0IG1nc2xfaWNvdW50KSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfZ2V0X3N0YXRzKCVzKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfZ2V0X3N0YXRzKCkgKi8KKworLyogbWdzbF9nZXRfcGFyYW1zKCkKKyAqIAorICogCWdldCB0aGUgY3VycmVudCBzZXJpYWwgcGFyYW1ldGVycyBpbmZvcm1hdGlvbgorICoKKyAqIEFyZ3VtZW50czoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCQl1c2VyX3BhcmFtcwlwb2ludGVyIHRvIGJ1ZmZlciB0byBob2xkIHJldHVybmVkIHBhcmFtcworICogCQorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9nZXRfcGFyYW1zKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqdXNlcl9wYXJhbXMpCit7CisJaW50IGVycjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9nZXRfcGFyYW1zKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUpOworCQkJCisJQ09QWV9UT19VU0VSKGVycix1c2VyX3BhcmFtcywgJmluZm8tPnBhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfZ2V0X3BhcmFtcyglcykgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBtZ3NsX2dldF9wYXJhbXMoKSAqLworCisvKiBtZ3NsX3NldF9wYXJhbXMoKQorICogCisgKiAJc2V0IHRoZSBzZXJpYWwgcGFyYW1ldGVycworICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCW5ld19wYXJhbXMJdXNlciBidWZmZXIgY29udGFpbmluZyBuZXcgc2VyaWFsIHBhcmFtcworICoKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfc2V0X3BhcmFtcyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKm5ld19wYXJhbXMpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTUdTTF9QQVJBTVMgdG1wX3BhcmFtczsKKwlpbnQgZXJyOworIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3NldF9wYXJhbXMgJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUgKTsKKwlDT1BZX0ZST01fVVNFUihlcnIsJnRtcF9wYXJhbXMsIG5ld19wYXJhbXMsIHNpemVvZihNR1NMX1BBUkFNUykpOworCWlmIChlcnIpIHsKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJCXByaW50ayggIiVzKCVkKTptZ3NsX3NldF9wYXJhbXMoJXMpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCW1lbWNweSgmaW5mby0+cGFyYW1zLCZ0bXBfcGFyYW1zLHNpemVvZihNR1NMX1BBUkFNUykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisgCW1nc2xfY2hhbmdlX3BhcmFtcyhpbmZvKTsKKwkKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfc2V0X3BhcmFtcygpICovCisKKy8qIG1nc2xfZ2V0X3R4aWRsZSgpCisgKiAKKyAqIAlnZXQgdGhlIGN1cnJlbnQgdHJhbnNtaXQgaWRsZSBtb2RlCisgKgorICogQXJndW1lbnRzOglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCWlkbGVfbW9kZQlwb2ludGVyIHRvIGJ1ZmZlciB0byBob2xkIHJldHVybmVkIGlkbGUgbW9kZQorICogCQorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9nZXRfdHhpZGxlKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBfX3VzZXIgKmlkbGVfbW9kZSkKK3sKKwlpbnQgZXJyOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF90eGlkbGUoJXMpPSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aWRsZV9tb2RlKTsKKwkJCQorCUNPUFlfVE9fVVNFUihlcnIsaWRsZV9tb2RlLCAmaW5mby0+aWRsZV9tb2RlLCBzaXplb2YoaW50KSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfZ2V0X3R4aWRsZSglcykgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBtZ3NsX2dldF90eGlkbGUoKSAqLworCisvKiBtZ3NsX3NldF90eGlkbGUoKQlzZXJ2aWNlIGlvY3RsIHRvIHNldCB0cmFuc21pdCBpZGxlIG1vZGUKKyAqIAkKKyAqIEFyZ3VtZW50czoJIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCQlpZGxlX21vZGUJbmV3IGlkbGUgbW9kZQorICoKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfc2V0X3R4aWRsZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBpbnQgaWRsZV9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3NldF90eGlkbGUoJXMsJWQpXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lLCBpZGxlX21vZGUgKTsKKwkJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWluZm8tPmlkbGVfbW9kZSA9IGlkbGVfbW9kZTsKKwl1c2Nfc2V0X3R4aWRsZSggaW5mbyApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3NldF90eGlkbGUoKSAqLworCisvKiBtZ3NsX3R4ZW5hYmxlKCkKKyAqIAorICogCWVuYWJsZSBvciBkaXNhYmxlIHRoZSB0cmFuc21pdHRlcgorICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCWVuYWJsZQkJMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX3R4ZW5hYmxlKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfdHhlbmFibGUoJXMsJWQpXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lLCBlbmFibGUpOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJaWYgKCBlbmFibGUgKSB7CisJCWlmICggIWluZm8tPnR4X2VuYWJsZWQgKSB7CisKKwkJCXVzY19zdGFydF90cmFuc21pdHRlcihpbmZvKTsKKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqIGlmIEhETEMvU0RMQyBMb29wIG1vZGUsIGF0dGVtcHQgdG8gaW5zZXJ0IHRoZQorCQkJICogc3RhdGlvbiBpbiB0aGUgJ2xvb3AnIGJ5IHNldHRpbmcgQ01SOjEzLiBVcG9uCisJCQkgKiByZWNlaXB0IG9mIHRoZSBuZXh0IEdvQWhlYWQgKFJ4QWJvcnQpIHNlcXVlbmNlLAorCQkJICogdGhlIE9uTG9vcCBpbmRpY2F0b3IgKENDU1I6Nykgc2hvdWxkIGdvIGFjdGl2ZQorCQkJICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgb24gdGhlIGxvb3AKKwkJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfSERMQ19MT09QTU9ERSApCisJCQkJdXNjX2xvb3Btb2RlX2luc2VydF9yZXF1ZXN0KCBpbmZvICk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIGluZm8tPnR4X2VuYWJsZWQgKQorCQkJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3R4ZW5hYmxlKCkgKi8KKworLyogbWdzbF90eGFib3J0KCkJYWJvcnQgc2VuZCBIRExDIGZyYW1lCisgKiAJCisgKiBBcmd1bWVudHM6CSAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF90eGFib3J0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8pCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfdHhhYm9ydCglcylcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUpOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJaWYgKCBpbmZvLT50eF9hY3RpdmUgJiYgaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgKQorCXsKKwkJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfSERMQ19MT09QTU9ERSApCisJCQl1c2NfbG9vcG1vZGVfY2FuY2VsX3RyYW5zbWl0KCBpbmZvICk7CisJCWVsc2UKKwkJCXVzY19UQ21kKGluZm8sVENtZF9TZW5kQWJvcnQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworCQorfQkvKiBlbmQgb2YgbWdzbF90eGFib3J0KCkgKi8KKworLyogbWdzbF9yeGVuYWJsZSgpIAllbmFibGUgb3IgZGlzYWJsZSB0aGUgcmVjZWl2ZXIKKyAqIAkKKyAqIEFyZ3VtZW50czoJIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCQllbmFibGUJCTEgPSBlbmFibGUsIDAgPSBkaXNhYmxlCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX3J4ZW5hYmxlKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfcnhlbmFibGUoJXMsJWQpXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lLCBlbmFibGUpOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJaWYgKCBlbmFibGUgKSB7CisJCWlmICggIWluZm8tPnJ4X2VuYWJsZWQgKQorCQkJdXNjX3N0YXJ0X3JlY2VpdmVyKGluZm8pOworCX0gZWxzZSB7CisJCWlmICggaW5mby0+cnhfZW5hYmxlZCApCisJCQl1c2Nfc3RvcF9yZWNlaXZlcihpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfcnhlbmFibGUoKSAqLworCisvKiBtZ3NsX3dhaXRfZXZlbnQoKSAJd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCisgKiAJCisgKiBBcmd1bWVudHM6CSAJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCQltYXNrCXBvaW50ZXIgdG8gYml0bWFzayBvZiBldmVudHMgdG8gd2FpdCBmb3IKKyAqIFJldHVybiBWYWx1ZToJMCAJaWYgc3VjY2Vzc2Z1bCBhbmQgYml0IG1hc2sgdXBkYXRlZCB3aXRoCisgKgkJCQlvZiBldmVudHMgdHJpZ2dlcnJlZCwKKyAqIAkJCW90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF93YWl0X2V2ZW50KHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBfX3VzZXIgKiBtYXNrX3B0cikKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgczsKKwlpbnQgcmM9MDsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJaW50IGV2ZW50czsKKwlpbnQgbWFzazsKKwlzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgb2xkc2lncywgbmV3c2lnczsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCUNPUFlfRlJPTV9VU0VSKHJjLCZtYXNrLCBtYXNrX3B0ciwgc2l6ZW9mKGludCkpOworCWlmIChyYykgeworCQlyZXR1cm4gIC1FRkFVTFQ7CisJfQorCQkgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfd2FpdF9ldmVudCglcywlZClcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIG1hc2spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgc3RhdGUgbWF0Y2hlcyByZXF1ZXN0ZWQgZXZlbnRzICovCisJdXNjX2dldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwlzID0gaW5mby0+c2VyaWFsX3NpZ25hbHM7CisJZXZlbnRzID0gbWFzayAmCisJCSggKChzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOk1nc2xFdmVudF9Ec3JJbmFjdGl2ZSkgKworIAkJICAoKHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IE1nc2xFdmVudF9EY2RBY3RpdmU6TWdzbEV2ZW50X0RjZEluYWN0aXZlKSArCisJCSAgKChzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlOk1nc2xFdmVudF9DdHNJbmFjdGl2ZSkgKworCQkgICgocyAmIFNlcmlhbFNpZ25hbF9SSSkgID8gTWdzbEV2ZW50X1JpQWN0aXZlIDpNZ3NsRXZlbnRfUmlJbmFjdGl2ZSkgKTsKKwlpZiAoZXZlbnRzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBzYXZlIGN1cnJlbnQgaXJxIGNvdW50cyAqLworCWNwcmV2ID0gaW5mby0+aWNvdW50OworCW9sZHNpZ3MgPSBpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzOworCQorCS8qIGVuYWJsZSBodW50IGFuZCBpZGxlIGlycXMgaWYgbmVlZGVkICovCisJaWYgKG1hc2sgJiAoTWdzbEV2ZW50X0V4aXRIdW50TW9kZSArIE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQpKSB7CisJCXUxNiBvbGRyZWcgPSB1c2NfSW5SZWcoaW5mbyxSSUNSKTsKKwkJdTE2IG5ld3JlZyA9IG9sZHJlZyArCisJCQkgKG1hc2sgJiBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlID8gUlhTVEFUVVNfRVhJVEVEX0hVTlQ6MCkgKworCQkJIChtYXNrICYgTWdzbEV2ZW50X0lkbGVSZWNlaXZlZCA/IFJYU1RBVFVTX0lETEVfUkVDRUlWRUQ6MCk7CisJCWlmIChvbGRyZWcgIT0gbmV3cmVnKQorCQkJdXNjX091dFJlZyhpbmZvLCBSSUNSLCBuZXdyZWcpOworCX0KKwkKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5ldmVudF93YWl0X3EsICZ3YWl0KTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkJCisJCS8qIGdldCBjdXJyZW50IGlycSBjb3VudHMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCW5ld3NpZ3MgPSBpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJCS8qIGlmIG5vIGNoYW5nZSwgd2FpdCBhYm9ydGVkIGZvciBzb21lIHJlYXNvbiAqLworCQlpZiAobmV3c2lncy5kc3JfdXAgICA9PSBvbGRzaWdzLmRzcl91cCAgICYmCisJCSAgICBuZXdzaWdzLmRzcl9kb3duID09IG9sZHNpZ3MuZHNyX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MuZGNkX3VwICAgPT0gb2xkc2lncy5kY2RfdXAgICAmJgorCQkgICAgbmV3c2lncy5kY2RfZG93biA9PSBvbGRzaWdzLmRjZF9kb3duICYmCisJCSAgICBuZXdzaWdzLmN0c191cCAgID09IG9sZHNpZ3MuY3RzX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuY3RzX2Rvd24gPT0gb2xkc2lncy5jdHNfZG93biAmJgorCQkgICAgbmV3c2lncy5yaV91cCAgICA9PSBvbGRzaWdzLnJpX3VwICAgICYmCisJCSAgICBuZXdzaWdzLnJpX2Rvd24gID09IG9sZHNpZ3MucmlfZG93biAgJiYKKwkJICAgIGNub3cuZXhpdGh1bnQgICAgPT0gY3ByZXYuZXhpdGh1bnQgICAmJgorCQkgICAgY25vdy5yeGlkbGUgICAgICA9PSBjcHJldi5yeGlkbGUpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZlbnRzID0gbWFzayAmCisJCQkoIChuZXdzaWdzLmRzcl91cCAgICE9IG9sZHNpZ3MuZHNyX3VwICAgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOjApICAgKworCQkJKG5ld3NpZ3MuZHNyX2Rvd24gIT0gb2xkc2lncy5kc3JfZG93biA/IE1nc2xFdmVudF9Ec3JJbmFjdGl2ZTowKSArCisJCQkobmV3c2lncy5kY2RfdXAgICAhPSBvbGRzaWdzLmRjZF91cCAgID8gTWdzbEV2ZW50X0RjZEFjdGl2ZTowKSAgICsKKwkJCShuZXdzaWdzLmRjZF9kb3duICE9IG9sZHNpZ3MuZGNkX2Rvd24gPyBNZ3NsRXZlbnRfRGNkSW5hY3RpdmU6MCkgKworCQkJKG5ld3NpZ3MuY3RzX3VwICAgIT0gb2xkc2lncy5jdHNfdXAgICA/IE1nc2xFdmVudF9DdHNBY3RpdmU6MCkgICArCisJCQkobmV3c2lncy5jdHNfZG93biAhPSBvbGRzaWdzLmN0c19kb3duID8gTWdzbEV2ZW50X0N0c0luYWN0aXZlOjApICsKKwkJCShuZXdzaWdzLnJpX3VwICAgICE9IG9sZHNpZ3MucmlfdXAgICAgPyBNZ3NsRXZlbnRfUmlBY3RpdmU6MCkgICAgKworCQkJKG5ld3NpZ3MucmlfZG93biAgIT0gb2xkc2lncy5yaV9kb3duICA/IE1nc2xFdmVudF9SaUluYWN0aXZlOjApICArCisJCQkoY25vdy5leGl0aHVudCAgICAhPSBjcHJldi5leGl0aHVudCAgID8gTWdzbEV2ZW50X0V4aXRIdW50TW9kZTowKSArCisJCQkgIChjbm93LnJ4aWRsZSAgICAgICE9IGNwcmV2LnJ4aWRsZSAgICAgPyBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkOjApICk7CisJCWlmIChldmVudHMpCisJCQlicmVhazsKKwkJCisJCWNwcmV2ID0gY25vdzsKKwkJb2xkc2lncyA9IG5ld3NpZ3M7CisJfQorCQorCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJaWYgKG1hc2sgJiAoTWdzbEV2ZW50X0V4aXRIdW50TW9kZSArIE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJmluZm8tPmV2ZW50X3dhaXRfcSkpIHsKKwkJCS8qIGRpc2FibGUgZW5hYmxlIGV4aXQgaHVudCBtb2RlL2lkbGUgcmN2ZCBJUlFzICovCisJCQl1c2NfT3V0UmVnKGluZm8sIFJJQ1IsIHVzY19JblJlZyhpbmZvLFJJQ1IpICYKKwkJCQl+KFJYU1RBVFVTX0VYSVRFRF9IVU5UICsgUlhTVEFUVVNfSURMRV9SRUNFSVZFRCkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJfQorZXhpdDoKKwlpZiAoIHJjID09IDAgKQorCQlQVVRfVVNFUihyYywgZXZlbnRzLCBtYXNrX3B0cik7CisJCQorCXJldHVybiByYzsKKwkKK30JLyogZW5kIG9mIG1nc2xfd2FpdF9ldmVudCgpICovCisKK3N0YXRpYyBpbnQgbW9kZW1faW5wdXRfd2FpdChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8saW50IGFyZykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisJc3RydWN0IG1nc2xfaWNvdW50IGNwcmV2LCBjbm93OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyogc2F2ZSBjdXJyZW50IGlycSBjb3VudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwljcHJldiA9IGluZm8tPmljb3VudDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCWZvcig7OykgeworCQlzY2hlZHVsZSgpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBnZXQgbmV3IGlycSBjb3VudHMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkJLyogaWYgbm8gY2hhbmdlLCB3YWl0IGFib3J0ZWQgZm9yIHNvbWUgcmVhc29uICovCisJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCSAgICBjbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKSB7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCisJCS8qIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2FsbGVyIHNwZWNpZmllZCBtb2RlbSBpbnB1dCAqLworCQlpZiAoKGFyZyAmIFRJT0NNX1JORyAmJiBjbm93LnJuZyAhPSBjcHJldi5ybmcpIHx8CisJCSAgICAoYXJnICYgVElPQ01fRFNSICYmIGNub3cuZHNyICE9IGNwcmV2LmRzcikgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9DRCAgJiYgY25vdy5kY2QgIT0gY3ByZXYuZGNkKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0NUUyAmJiBjbm93LmN0cyAhPSBjcHJldi5jdHMpKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWNwcmV2ID0gY25vdzsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByYzsKK30KKworLyogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgc2VyaWFsIGNvbnRyb2wgYW5kIHN0YXR1cyBzaWduYWxzCisgKi8KK3N0YXRpYyBpbnQgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworIAl1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwlyZXN1bHQgPSAoKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykgPyBUSU9DTV9SVFM6MCkgKworCQkoKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikgPyBUSU9DTV9EVFI6MCkgKworCQkoKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyBUSU9DTV9DQVI6MCkgKworCQkoKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JJKSAgPyBUSU9DTV9STkc6MCkgKworCQkoKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBUSU9DTV9EU1I6MCkgKworCQkoKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBUSU9DTV9DVFM6MCk7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgdGlvY21nZXQoKSB2YWx1ZT0lMDhYXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmVzdWx0ICk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogc2V0IG1vZGVtIGNvbnRyb2wgc2lnbmFscyAoRFRSL1JUUykKKyAqLworc3RhdGljIGludCB0aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbXNldCgleCwleClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgc2V0LCBjbGVhcik7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EVFI7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfRFRSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisgCXVzY19zZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBtZ3NsX2JyZWFrKCkJCVNldCBvciBjbGVhciB0cmFuc21pdCBicmVhayBjb25kaXRpb24KKyAqCisgKiBBcmd1bWVudHM6CQl0dHkJCXBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqCQkJYnJlYWtfc3RhdGUJLTE9c2V0IGJyZWFrIGNvbmRpdGlvbiwgMD1jbGVhcgorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2JyZWFrKCVzLCVkKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGJyZWFrX3N0YXRlKTsKKwkJCSAKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX2JyZWFrIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworIAlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCXVzY19PdXRSZWcoaW5mbyxJT0NSLCh1MTYpKHVzY19JblJlZyhpbmZvLElPQ1IpIHwgQklUNykpOworCWVsc2UgCisJCXVzY19PdXRSZWcoaW5mbyxJT0NSLCh1MTYpKHVzY19JblJlZyhpbmZvLElPQ1IpICYgfkJJVDcpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorfQkvKiBlbmQgb2YgbWdzbF9icmVhaygpICovCisKKy8qIG1nc2xfaW9jdGwoKQlTZXJ2aWNlIGFuIElPQ1RMIHJlcXVlc3QKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQlwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiAJZmlsZQlwb2ludGVyIHRvIGFzc29jaWF0ZWQgZmlsZSBvYmplY3QgZm9yIGRldmljZQorICogCWNtZAlJT0NUTCBjb21tYW5kIGNvZGUKKyAqIAlhcmcJY29tbWFuZCBhcmd1bWVudC9jb250ZXh0CisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pb2N0bCAlcyBjbWQ9JTA4WFxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSwgY21kICk7CisJCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXJldHVybiBtZ3NsX2lvY3RsX2NvbW1vbihpbmZvLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgbWdzbF9pb2N0bF9jb21tb24oc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IG1nc2xfaWNvdW50IGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOwkvKiB1c2VyIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIE1HU0xfSU9DR1BBUkFNUzoKKwkJCXJldHVybiBtZ3NsX2dldF9wYXJhbXMoaW5mbywgYXJncCk7CisJCWNhc2UgTUdTTF9JT0NTUEFSQU1TOgorCQkJcmV0dXJuIG1nc2xfc2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwkJY2FzZSBNR1NMX0lPQ0dUWElETEU6CisJCQlyZXR1cm4gbWdzbF9nZXRfdHhpZGxlKGluZm8sIGFyZ3ApOworCQljYXNlIE1HU0xfSU9DU1RYSURMRToKKwkJCXJldHVybiBtZ3NsX3NldF90eGlkbGUoaW5mbywoaW50KWFyZyk7CisJCWNhc2UgTUdTTF9JT0NUWEVOQUJMRToKKwkJCXJldHVybiBtZ3NsX3R4ZW5hYmxlKGluZm8sKGludClhcmcpOworCQljYXNlIE1HU0xfSU9DUlhFTkFCTEU6CisJCQlyZXR1cm4gbWdzbF9yeGVuYWJsZShpbmZvLChpbnQpYXJnKTsKKwkJY2FzZSBNR1NMX0lPQ1RYQUJPUlQ6CisJCQlyZXR1cm4gbWdzbF90eGFib3J0KGluZm8pOworCQljYXNlIE1HU0xfSU9DR1NUQVRTOgorCQkJcmV0dXJuIG1nc2xfZ2V0X3N0YXRzKGluZm8sIGFyZ3ApOworCQljYXNlIE1HU0xfSU9DV0FJVEVWRU5UOgorCQkJcmV0dXJuIG1nc2xfd2FpdF9ldmVudChpbmZvLCBhcmdwKTsKKwkJY2FzZSBNR1NMX0lPQ0xPT1BUWERPTkU6CisJCQlyZXR1cm4gbWdzbF9sb29wbW9kZV9zZW5kX2RvbmUoaW5mbyk7CisJCS8qIFdhaXQgZm9yIG1vZGVtIGlucHV0IChEQ0QsUkksRFNSLENUUykgY2hhbmdlCisJCSAqIGFzIHNwZWNpZmllZCBieSBtYXNrIGluIGFyZyAoVElPQ01fUk5HL0RTUi9DRC9DVFMpCisJCSAqLworCQljYXNlIFRJT0NNSVdBSVQ6CisJCQlyZXR1cm4gbW9kZW1faW5wdXRfd2FpdChpbmZvLChpbnQpYXJnKTsKKworCQkvKiAKKwkJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJCSAqIE5COiBib3RoIDEtPjAgYW5kIDAtPjEgdHJhbnNpdGlvbnMgYXJlIGNvdW50ZWQgZXhjZXB0IGZvcgorCQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJCSAqLworCQljYXNlIFRJT0NHSUNPVU5UOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQljbm93ID0gaW5mby0+aWNvdW50OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXBfY3VzZXIgPSBhcmdwOworCQkJUFVUX1VTRVIoZXJyb3IsY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LmRzciwgJnBfY3VzZXItPmRzcik7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cucm5nLCAmcF9jdXNlci0+cm5nKTsKKwkJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQkJUFVUX1VTRVIoZXJyb3IsY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LnJ4LCAmcF9jdXNlci0+cngpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LnR4LCAmcF9jdXNlci0+dHgpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKTsKKwkJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQkJUFVUX1VTRVIoZXJyb3IsY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LmJyaywgJnBfY3VzZXItPmJyayk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bik7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG1nc2xfc2V0X3Rlcm1pb3MoKQorICogCisgKiAJU2V0IG5ldyB0ZXJtaW9zIHNldHRpbmdzCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAl0dHkJCXBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZQorICogCXRlcm1pb3MJCXBvaW50ZXIgdG8gYnVmZmVyIHRvIGhvbGQgcmV0dXJuZWQgb2xkIHRlcm1pb3MKKyAqIAkKKyAqIFJldHVybiBWYWx1ZToJCU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9zZXRfdGVybWlvcyAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQl0dHktPmRyaXZlci0+bmFtZSApOworCQorCS8qIGp1c3QgcmV0dXJuIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KKwlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkgICAgJiYgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCisJCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCisJICByZXR1cm47CisKKwltZ3NsX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJIAl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCX0KKwkKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gQjAgc3RhdHVzICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKyAJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IAorIAkJICAgICF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisgCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCSAJdXNjX3NldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl9CisJCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJbWdzbF9zdGFydCh0dHkpOworCX0KKworfQkvKiBlbmQgb2YgbWdzbF9zZXRfdGVybWlvcygpICovCisKKy8qIG1nc2xfY2xvc2UoKQorICogCisgKiAJQ2FsbGVkIHdoZW4gcG9ydCBpcyBjbG9zZWQuIFdhaXQgZm9yIHJlbWFpbmluZyBkYXRhIHRvIGJlCisgKiAJc2VudC4gRGlzYWJsZSBwb3J0IGFuZCBmcmVlIHJlc291cmNlcy4KKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQlwb2ludGVyIHRvIG9wZW4gdHR5IHN0cnVjdHVyZQorICogCWZpbHAJcG9pbnRlciB0byBvcGVuIGZpbGUgb2JqZWN0CisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9jbG9zZSIpKQorCQlyZXR1cm47CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfY2xvc2UoJXMpIGVudHJ5LCBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmNvdW50KTsKKwkJCSAKKwlpZiAoIWluZm8tPmNvdW50KQorCQlyZXR1cm47CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJZ290byBjbGVhbnVwOworCQkJCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiB0dHktPmNvdW50IGlzIDEgYW5kIHRoZSB0dHkgc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuCisJCSAqIGluZm8tPmNvdW50IHNob3VsZCBiZSBvbmUgaW4gdGhpcyBjYXNlLgorCQkgKiBpZiBpdCdzIG5vdCwgY29ycmVjdCBpdCBzbyB0aGF0IHRoZSBwb3J0IGlzIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKCJtZ3NsX2Nsb3NlOiBiYWQgcmVmY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIgorCQkgICAgICAgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisJCWluZm8tPmNvdW50ID0gMTsKKwl9CisJCisJaW5mby0+Y291bnQtLTsKKwkKKwkvKiBpZiBhdCBsZWFzdCBvbmUgb3BlbiByZW1haW5pbmcsIGxlYXZlIGhhcmR3YXJlIGFjdGl2ZSAqLworCWlmIChpbmZvLT5jb3VudCkKKwkJZ290byBjbGVhbnVwOworCQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJCisJLyogc2V0IHR0eS0+Y2xvc2luZyB0byBub3RpZnkgbGluZSBkaXNjaXBsaW5lIHRvIAorCSAqIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLiBPbmx5IHRoZSBOX1RUWQorCSAqIGRpc2NpcGxpbmUgYXBwZWFycyB0byB1c2UgdGhpcyAocHBwIGRvZXMgbm90KS4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCQorCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGRhdGEgdG8gY2xlYXIgYWxsIGxheWVycyAqLworCQorCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCQlwcmludGsoIiVzKCVkKTptZ3NsX2Nsb3NlKCVzKSBjYWxsaW5nIHR0eV93YWl0X3VudGlsX3NlbnRcbiIsCisJCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwl9CisJCQorIAlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKyAJCW1nc2xfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisJCQorCXNodXRkb3duKGluZm8pOworCQorCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKwkKKwlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwl9CisJCisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCQkJIAorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCitjbGVhbnVwOgkJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2Nsb3NlKCVzKSBleGl0LCBjb3VudD0lZFxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQl0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQpOworCQkJCit9CS8qIGVuZCBvZiBtZ3NsX2Nsb3NlKCkgKi8KKworLyogbWdzbF93YWl0X3VudGlsX3NlbnQoKQorICoKKyAqCVdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5LgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKgl0dHkJCXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKgl0aW1lb3V0CQl0aW1lIHRvIHdhaXQgZm9yIHNlbmQgY29tcGxldGlvbgorICoKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKworCWlmICghaW5mbyApCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3dhaXRfdW50aWxfc2VudCglcykgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisgICAgICAKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3dhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJZ290byBleGl0OworCSAKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworICAgICAgCisJLyogU2V0IGNoZWNrIGludGVydmFsIHRvIDEvNSBvZiBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuIFRoZSBjaGVjaworCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KKwkgKiBOb3RlOiB1c2UgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkgdGhlIE5JU1QtUENUUy4KKwkgKi8gCisgICAgICAgCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICkgeworCSAgICAgICAJY2hhcl90aW1lID0gaW5mby0+dGltZW91dC8oMzIgKiA1KTsKKwkJaWYgKCFjaGFyX3RpbWUpCisJCQljaGFyX3RpbWUrKzsKKwl9IGVsc2UKKwkJY2hhcl90aW1lID0gMTsKKwkJCisJaWYgKHRpbWVvdXQpCisJCWNoYXJfdGltZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNoYXJfdGltZSwgdGltZW91dCk7CisJCQorCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgfHwKKwkJaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVyApIHsKKwkJd2hpbGUgKGluZm8tPnR4X2FjdGl2ZSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAoISh1c2NfSW5SZWcoaW5mbyxUQ1NSKSAmIFRYU1RBVFVTX0FMTF9TRU5UKSAmJgorCQkJaW5mby0+dHhfZW5hYmxlZCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisgICAgICAKK2V4aXQ6CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfd2FpdF91bnRpbF9zZW50KCVzKSBleGl0XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorfQkvKiBlbmQgb2YgbWdzbF93YWl0X3VudGlsX3NlbnQoKSAqLworCisvKiBtZ3NsX2hhbmd1cCgpCisgKgorICoJQ2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICoJVGhpcyBpcyB0aGUgc2FtZSBhcyB0byBjbG9zaW5nIGFsbCBvcGVuIGZpbGVzIGZvciB0aGUgcG9ydC4KKyAqCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byBhc3NvY2lhdGVkIHR0eSBvYmplY3QKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9oYW5ndXAoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfaGFuZ3VwIikpCisJCXJldHVybjsKKworCW1nc2xfZmx1c2hfYnVmZmVyKHR0eSk7CisJc2h1dGRvd24oaW5mbyk7CisJCisJaW5mby0+Y291bnQgPSAwOwkKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQorfQkvKiBlbmQgb2YgbWdzbF9oYW5ndXAoKSAqLworCisvKiBibG9ja190aWxfcmVhZHkoKQorICogCisgKiAJQmxvY2sgdGhlIGN1cnJlbnQgcHJvY2VzcyB1bnRpbCB0aGUgc3BlY2lmaWVkIHBvcnQKKyAqIAlpcyByZWFkeSB0byBiZSBvcGVuZWQuCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAl0dHkJCXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKiAJZmlscAkJcG9pbnRlciB0byBvcGVuIGZpbGUgb2JqZWN0CisgKiAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCQorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgb24gJXNcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lICk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgfHwgdHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpeworCQkvKiBub25ibG9jayBtb2RlIGlzIHNldCBvciBwb3J0IGlzIG5vdCBlbmFibGVkICovCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKiBXYWl0IGZvciBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogbWdzbF9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCSAKKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jayBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCWV4dHJhX2NvdW50ID0gMTsKKwkJaW5mby0+Y291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLCBmbGFncyk7CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisJCisJd2hpbGUgKDEpIHsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCQkgCXVzY19zZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQl9CisJCQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSl7CisJCQlyZXR2YWwgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQkJCS1FQUdBSU4gOiAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJIAl1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkKKyAJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKyAJCSAgICAoZG9fY2xvY2FsIHx8IChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpKSApIHsKKyAJCQlicmVhazsKKwkJfQorCQkJCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nIG9uICVzIGNvdW50PSVkXG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisJCQkJIAorCQlzY2hlZHVsZSgpOworCX0KKwkKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlpZiAoZXh0cmFfY291bnQpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZyBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisJCQkgCisJaWYgKCFyZXR2YWwpCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCQorCXJldHVybiByZXR2YWw7CisJCit9CS8qIGVuZCBvZiBibG9ja190aWxfcmVhZHkoKSAqLworCisvKiBtZ3NsX29wZW4oKQorICoKKyAqCUNhbGxlZCB3aGVuIGEgcG9ydCBpcyBvcGVuZWQuICBJbml0IGFuZCBlbmFibGUgcG9ydC4KKyAqCVBlcmZvcm0gc2VyaWFsLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqCQkJZmlscAlhc3NvY2lhdGVkIGZpbGUgcG9pbnRlcgorICoKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IG1nc2xfc3RydWN0CSppbmZvOworCWludCAJCQlyZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZwkJcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogdmVyaWZ5IHJhbmdlIG9mIHNwZWNpZmllZCBsaW5lIG51bWJlciAqLwkKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSBtZ3NsX2RldmljZV9jb3VudCkpIHsKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9vcGVuIHdpdGggaW52YWxpZCBsaW5lICMlZC5cbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxsaW5lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZmluZCB0aGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgbGluZSAqLworCWluZm8gPSBtZ3NsX2RldmljZV9saXN0OworCXdoaWxlKGluZm8gJiYgaW5mby0+bGluZSAhPSBsaW5lKQorCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9vcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCQorCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnR0eSA9IHR0eTsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfb3BlbiglcyksIG9sZCByZWYgY291bnQgPSAlZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXyx0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQpOworCisJLyogSWYgcG9ydCBpcyBjbG9zaW5nLCBzaWduYWwgY2FsbGVyIHRvIHRyeSBhZ2FpbiAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8IGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORyl7CisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJcmV0dmFsID0gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KKwkJCS1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCQlnb3RvIGNsZWFudXA7CisJfQorCQorCWlmICghdG1wX2J1ZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKHRtcF9idWYpCisJCQlmcmVlX3BhZ2UocGFnZSk7CisJCWVsc2UKKwkJCXRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCX0KKwkKKwlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5uZXRjb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlpbmZvLT5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT5jb3VudCA9PSAxKSB7CisJCS8qIDFzdCBvcGVuIG9uIHRoaXMgZGV2aWNlLCBpbml0IGhhcmR3YXJlICovCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBjbGVhbnVwOworCX0KKworCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkoJXMpIHJldHVybmVkICVkXG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJldHZhbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9vcGVuKCVzKSBzdWNjZXNzXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJcmV0dmFsID0gMDsKKwkKK2NsZWFudXA6CQkJCisJaWYgKHJldHZhbCkgeworCQlpZiAodHR5LT5jb3VudCA9PSAxKQorCQkJaW5mby0+dHR5ID0gTlVMTDsgLyogdHR5IGxheWVyIHdpbGwgcmVsZWFzZSB0dHkgc3RydWN0ICovCisJCWlmKGluZm8tPmNvdW50KQorCQkJaW5mby0+Y291bnQtLTsKKwl9CisJCisJcmV0dXJuIHJldHZhbDsKKwkKK30JLyogZW5kIG9mIG1nc2xfb3BlbigpICovCisKKy8qCisgKiAvcHJvYyBmcyByb3V0aW5lcy4uLi4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBsaW5lX2luZm8oY2hhciAqYnVmLCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJY2hhcglzdGF0X2J1ZlszMF07CisJaW50CXJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJKSB7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJXM6UENJIGlvOiUwNFggaXJxOiVkIG1lbTolMDhYIGxjcjolMDhYIiwKKwkJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwsCisJCQlpbmZvLT5waHlzX21lbW9yeV9iYXNlLCBpbmZvLT5waHlzX2xjcl9iYXNlKTsKKwl9IGVsc2UgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzOihFKUlTQSBpbzolMDRYIGlycTolZCBkbWE6JWQiLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmlvX2Jhc2UsIAorCQkJaW5mby0+aXJxX2xldmVsLCBpbmZvLT5kbWFfbGV2ZWwpOworCX0KKworCS8qIG91dHB1dCBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisgCXVzY19nZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwlzdGF0X2J1ZlswXSA9IDA7CisJc3RhdF9idWZbMV0gPSAwOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSVFMiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8Q1RTIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERUUiIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxEU1IiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8Q0QiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSSSIpOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJICAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgKSB7CisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgSERMQyB0eG9rOiVkIHJ4b2s6JWQiLAorCQkJICAgICAgaW5mby0+aWNvdW50LnR4b2ssIGluZm8tPmljb3VudC5yeG9rKTsKKwkJaWYgKGluZm8tPmljb3VudC50eHVuZGVyKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eHVuZGVyOiVkIiwgaW5mby0+aWNvdW50LnR4dW5kZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnR4YWJvcnQpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4YWJvcnQ6JWQiLCBpbmZvLT5pY291bnQudHhhYm9ydCk7CisJCWlmIChpbmZvLT5pY291bnQucnhzaG9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhzaG9ydDolZCIsIGluZm8tPmljb3VudC5yeHNob3J0KTsJCisJCWlmIChpbmZvLT5pY291bnQucnhsb25nKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeGxvbmc6JWQiLCBpbmZvLT5pY291bnQucnhsb25nKTsKKwkJaWYgKGluZm8tPmljb3VudC5yeG92ZXIpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4b3ZlcjolZCIsIGluZm8tPmljb3VudC5yeG92ZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4Y3JjKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeGNyYzolZCIsIGluZm8tPmljb3VudC5yeGNyYyk7CisJfSBlbHNlIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBBU1lOQyB0eDolZCByeDolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHgsIGluZm8tPmljb3VudC5yeCk7CisJCWlmIChpbmZvLT5pY291bnQuZnJhbWUpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIGZlOiVkIiwgaW5mby0+aWNvdW50LmZyYW1lKTsKKwkJaWYgKGluZm8tPmljb3VudC5wYXJpdHkpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHBlOiVkIiwgaW5mby0+aWNvdW50LnBhcml0eSk7CisJCWlmIChpbmZvLT5pY291bnQuYnJrKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBicms6JWQiLCBpbmZvLT5pY291bnQuYnJrKTsJCisJCWlmIChpbmZvLT5pY291bnQub3ZlcnJ1bikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgb2U6JWQiLCBpbmZvLT5pY291bnQub3ZlcnJ1bik7CisJfQorCQorCS8qIEFwcGVuZCBzZXJpYWwgc2lnbmFsIHN0YXR1cyB0byBlbmQgKi8KKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiICVzXG4iLCBzdGF0X2J1ZisxKTsKKwkKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAidHhhY3RpdmU9JWQgYmhfcmVxPSVkIGJoX3J1bj0lZCBwZW5kaW5nX2JoPSV4XG4iLAorCSBpbmZvLT50eF9hY3RpdmUsaW5mby0+YmhfcmVxdWVzdGVkLGluZm8tPmJoX3J1bm5pbmcsCisJIGluZm8tPnBlbmRpbmdfYmgpOworCSAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl7CQorCXUxNiBUY3NyID0gdXNjX0luUmVnKCBpbmZvLCBUQ1NSICk7CisJdTE2IFRkbXIgPSB1c2NfSW5EbWFSZWcoIGluZm8sIFRETVIgKTsKKwl1MTYgVGljciA9IHVzY19JblJlZyggaW5mbywgVElDUiApOworCXUxNiBSc2NyID0gdXNjX0luUmVnKCBpbmZvLCBSQ1NSICk7CisJdTE2IFJkbXIgPSB1c2NfSW5EbWFSZWcoIGluZm8sIFJETVIgKTsKKwl1MTYgUmljciA9IHVzY19JblJlZyggaW5mbywgUklDUiApOworCXUxNiBJY3IgPSB1c2NfSW5SZWcoIGluZm8sIElDUiApOworCXUxNiBEY2NyID0gdXNjX0luUmVnKCBpbmZvLCBEQ0NSICk7CisJdTE2IFRtciA9IHVzY19JblJlZyggaW5mbywgVE1SICk7CisJdTE2IFRjY3IgPSB1c2NfSW5SZWcoIGluZm8sIFRDQ1IgKTsKKwl1MTYgQ2NhciA9IGludyggaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAidGNzcj0lMDRYIHRkbXI9JTA0WCB0aWNyPSUwNFggcmNzcj0lMDRYIHJkbXI9JTA0WFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgInJpY3I9JTA0WCBpY3IgPSUwNFggZGNjcj0lMDRYIHRtcj0lMDRYIHRjY3I9JTA0WCBjY2FyPSUwNFhcbiIsCisJIAkJVGNzcixUZG1yLFRpY3IsUnNjcixSZG1yLFJpY3IsSWNyLERjY3IsVG1yLFRjY3IsQ2NhciApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorCXJldHVybiByZXQ7CisJCit9CS8qIGVuZCBvZiBsaW5lX2luZm8oKSAqLworCisvKiBtZ3NsX3JlYWRfcHJvYygpCisgKiAKKyAqIENhbGxlZCB0byBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBkZXZpY2VzCisgKiAKKyAqIEFyZ3VtZW50czoKKyAqIAlwYWdlCXBhZ2Ugb2YgbWVtb3J5IHRvIGhvbGQgcmV0dXJuZWQgaW5mbworICogCXN0YXJ0CQorICogCW9mZgorICogCWNvdW50CisgKiAJZW9mCisgKiAJZGF0YQorICogCQorICogUmV0dXJuIFZhbHVlOgorICovCitzdGF0aWMgaW50IG1nc2xfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgbDsKKwlvZmZfdAliZWdpbiA9IDA7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvOworCQorCWxlbiArPSBzcHJpbnRmKHBhZ2UsICJzeW5jbGluayBkcml2ZXI6JXNcbiIsIGRyaXZlcl92ZXJzaW9uKTsKKwkKKwlpbmZvID0gbWdzbF9kZXZpY2VfbGlzdDsKKwl3aGlsZSggaW5mbyApIHsKKwkJbCA9IGxpbmVfaW5mbyhwYWdlICsgbGVuLCBpbmZvKTsKKwkJbGVuICs9IGw7CisJCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCisJCQlnb3RvIGRvbmU7CisJCWlmIChsZW4rYmVnaW4gPCBvZmYpIHsKKwkJCWJlZ2luICs9IGxlbjsKKwkJCWxlbiA9IDA7CisJCX0KKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCX0KKworCSplb2YgPSAxOworZG9uZToKKwlpZiAob2ZmID49IGxlbitiZWdpbikKKwkJcmV0dXJuIDA7CisJKnN0YXJ0ID0gcGFnZSArIChvZmYtYmVnaW4pOworCXJldHVybiAoKGNvdW50IDwgYmVnaW4rbGVuLW9mZikgPyBjb3VudCA6IGJlZ2luK2xlbi1vZmYpOworCQorfQkvKiBlbmQgb2YgbWdzbF9yZWFkX3Byb2MoKSAqLworCisvKiBtZ3NsX2FsbG9jYXRlX2RtYV9idWZmZXJzKCkKKyAqIAorICogCUFsbG9jYXRlIGFuZCBmb3JtYXQgRE1BIGJ1ZmZlcnMgKElTQSBhZGFwdGVyKQorICogCW9yIGZvcm1hdCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgKFBDSSBhZGFwdGVyKS4KKyAqIAorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9hbGxvY2F0ZV9kbWFfYnVmZmVycyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJdW5zaWduZWQgc2hvcnQgQnVmZmVyc1BlckZyYW1lOworCisJaW5mby0+bGFzdF9tZW1fYWxsb2MgPSAwOworCisJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgRE1BIGJ1ZmZlcnMgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlICovCisJLyogbGFyZ2VzdCBhbGxvd2FibGUgZnJhbWUgc2l6ZS4gTm90ZTogSWYgdGhlIG1heCBmcmFtZSBzaXplIGlzICovCisJLyogbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgdGhlIERNQSBidWZmZXIgc2l6ZSB0aGVuIHdlIG5lZWQgdG8gKi8KKwkvKiByb3VuZCB0aGUgYnVmZmVyIGNvdW50IHBlciBmcmFtZSB1cCBvbmUuICovCisKKwlCdWZmZXJzUGVyRnJhbWUgPSAodW5zaWduZWQgc2hvcnQpKGluZm8tPm1heF9mcmFtZV9zaXplL0RNQUJVRkZFUlNJWkUpOworCWlmICggaW5mby0+bWF4X2ZyYW1lX3NpemUgJSBETUFCVUZGRVJTSVpFICkKKwkJQnVmZmVyc1BlckZyYW1lKys7CisKKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkgeworCQkvKgorCQkgKiBUaGUgUENJIGFkYXB0ZXIgaGFzIDI1NktCeXRlcyBvZiBzaGFyZWQgbWVtb3J5IHRvIHVzZS4KKwkJICogVGhpcyBpcyA2NCBQQUdFX1NJWkUgYnVmZmVycy4KKwkJICoKKwkJICogVGhlIGZpcnN0IHBhZ2UgaXMgdXNlZCBmb3IgcGFkZGluZyBhdCB0aGlzIHRpbWUgc28gdGhlCisJCSAqIGJ1ZmZlciBsaXN0IGRvZXMgbm90IGJlZ2luIGF0IG9mZnNldCAwIG9mIHRoZSBQQ0kKKwkJICogYWRhcHRlcidzIHNoYXJlZCBtZW1vcnkuCisJCSAqCisJCSAqIFRoZSAybmQgcGFnZSBpcyB1c2VkIGZvciB0aGUgYnVmZmVyIGxpc3QuIEEgNEsgYnVmZmVyCisJCSAqIGxpc3QgY2FuIGhvbGQgMTI4IERNQV9CVUZGRVIgc3RydWN0dXJlcyBhdCAzMiBieXRlcworCQkgKiBlYWNoLgorCQkgKgorCQkgKiBUaGlzIGxlYXZlcyA2MiA0SyBwYWdlcy4KKwkJICoKKwkJICogVGhlIG5leHQgTiBwYWdlcyBhcmUgdXNlZCBmb3IgdHJhbnNtaXQgZnJhbWUocykuIFdlCisJCSAqIHJlc2VydmUgZW5vdWdoIDRLIHBhZ2UgYmxvY2tzIHRvIGhvbGQgdGhlIHJlcXVpcmVkCisJCSAqIG51bWJlciBvZiB0cmFuc21pdCBkbWEgYnVmZmVycyAobnVtX3R4X2RtYV9idWZmZXJzKSwKKwkJICogZWFjaCBvZiBNYXhGcmFtZVNpemUgc2l6ZS4KKwkJICoKKwkJICogT2YgdGhlIHJlbWFpbmluZyBwYWdlcyAoNjItTiksIGRldGVybWluZSBob3cgbWFueSBjYW4KKwkJICogYmUgdXNlZCB0byByZWNlaXZlIGZ1bGwgTWF4RnJhbWVTaXplIGluYm91bmQgZnJhbWVzCisJCSAqLworCQlpbmZvLT50eF9idWZmZXJfY291bnQgPSBpbmZvLT5udW1fdHhfZG1hX2J1ZmZlcnMgKiBCdWZmZXJzUGVyRnJhbWU7CisJCWluZm8tPnJ4X2J1ZmZlcl9jb3VudCA9IDYyIC0gaW5mby0+dHhfYnVmZmVyX2NvdW50OworCX0gZWxzZSB7CisJCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIFBBR0VfU0laRSBidWZmZXJzIG5lZWRlZCBmb3IgKi8KKwkJLyogcmVjZWl2ZSBhbmQgdHJhbnNtaXQgRE1BIGJ1ZmZlcnMuICovCisKKworCQkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBETUEgYnVmZmVycyBuZWNlc3NhcnkgdG8gKi8KKwkJLyogaG9sZCA3IG1heCBzaXplIHJlY2VpdmUgZnJhbWVzIGFuZCBvbmUgbWF4IHNpemUgdHJhbnNtaXQgZnJhbWUuICovCisJCS8qIFRoZSByZWNlaXZlIGJ1ZmZlciBjb3VudCBpcyBidW1wZWQgYnkgb25lIHNvIHdlIGF2b2lkIGFuICovCisJCS8qIEVuZCBvZiBMaXN0IGNvbmRpdGlvbiBpZiBhbGwgcmVjZWl2ZSBidWZmZXJzIGFyZSB1c2VkIHdoZW4gKi8KKwkJLyogdXNpbmcgbGlua2VkIGxpc3QgRE1BIGJ1ZmZlcnMuICovCisKKwkJaW5mby0+dHhfYnVmZmVyX2NvdW50ID0gaW5mby0+bnVtX3R4X2RtYV9idWZmZXJzICogQnVmZmVyc1BlckZyYW1lOworCQlpbmZvLT5yeF9idWZmZXJfY291bnQgPSAoQnVmZmVyc1BlckZyYW1lICogTUFYUlhGUkFNRVMpICsgNjsKKwkJCisJCS8qIAorCQkgKiBsaW1pdCB0b3RhbCBUeEJ1ZmZlcnMgJiBSeEJ1ZmZlcnMgdG8gNjIgNEsgdG90YWwgCisJCSAqIChhbGEgUENJIEFsbG9jYXRpb24pIAorCQkgKi8KKwkJCisJCWlmICggKGluZm8tPnR4X2J1ZmZlcl9jb3VudCArIGluZm8tPnJ4X2J1ZmZlcl9jb3VudCkgPiA2MiApCisJCQlpbmZvLT5yeF9idWZmZXJfY291bnQgPSA2MiAtIGluZm8tPnR4X2J1ZmZlcl9jb3VudDsKKworCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMoJWQpOkFsbG9jYXRpbmcgJWQgVFggYW5kICVkIFJYIERNQSBidWZmZXJzLlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLCBpbmZvLT50eF9idWZmZXJfY291bnQsaW5mby0+cnhfYnVmZmVyX2NvdW50KTsKKwkKKwlpZiAoIG1nc2xfYWxsb2NfYnVmZmVyX2xpc3RfbWVtb3J5KCBpbmZvICkgPCAwIHx8CisJCSAgbWdzbF9hbGxvY19mcmFtZV9tZW1vcnkoaW5mbywgaW5mby0+cnhfYnVmZmVyX2xpc3QsIGluZm8tPnJ4X2J1ZmZlcl9jb3VudCkgPCAwIHx8IAorCQkgIG1nc2xfYWxsb2NfZnJhbWVfbWVtb3J5KGluZm8sIGluZm8tPnR4X2J1ZmZlcl9saXN0LCBpbmZvLT50eF9idWZmZXJfY291bnQpIDwgMCB8fCAKKwkJICBtZ3NsX2FsbG9jX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoaW5mbykgPCAwICB8fAorCQkgIG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeShpbmZvKSA8IDAgKSB7CisJCXByaW50aygiJXMoJWQpOkNhbid0IGFsbG9jYXRlIERNQSBidWZmZXIgbWVtb3J5XG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCW1nc2xfcmVzZXRfcnhfZG1hX2J1ZmZlcnMoIGluZm8gKTsKKyAgCW1nc2xfcmVzZXRfdHhfZG1hX2J1ZmZlcnMoIGluZm8gKTsKKworCXJldHVybiAwOworCit9CS8qIGVuZCBvZiBtZ3NsX2FsbG9jYXRlX2RtYV9idWZmZXJzKCkgKi8KKworLyoKKyAqIG1nc2xfYWxsb2NfYnVmZmVyX2xpc3RfbWVtb3J5KCkKKyAqIAorICogQWxsb2NhdGUgYSBjb21tb24gRE1BIGJ1ZmZlciBmb3IgdXNlIGFzIHRoZQorICogcmVjZWl2ZSBhbmQgdHJhbnNtaXQgYnVmZmVyIGxpc3RzLgorICogCisgKiBBIGJ1ZmZlciBsaXN0IGlzIGEgc2V0IG9mIGJ1ZmZlciBlbnRyaWVzIHdoZXJlIGVhY2ggZW50cnkgY29udGFpbnMKKyAqIGEgcG9pbnRlciB0byBhbiBhY3R1YWwgYnVmZmVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQgYnVmZmVyIGVudHJ5CisgKiAocGx1cyBzb21lIG90aGVyIGluZm8gYWJvdXQgdGhlIGJ1ZmZlcikuCisgKiAKKyAqIFRoZSBidWZmZXIgZW50cmllcyBmb3IgYSBsaXN0IGFyZSBidWlsdCB0byBmb3JtIGEgY2lyY3VsYXIgbGlzdCBzbworICogdGhhdCB3aGVuIHRoZSBlbnRpcmUgbGlzdCBoYXMgYmVlbiB0cmF2ZXJzZWQgeW91IHN0YXJ0IGJhY2sgYXQgdGhlCisgKiBiZWdpbm5pbmcuCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IganVzdCB0aGUgYnVmZmVyIGVudHJpZXMuCisgKiBUaGUgbGlua3MgKHBvaW50ZXIgdG8gbmV4dCBlbnRyeSkgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBwaHlzaWNhbAorICogYWRkcmVzcyBvZiB0aGUgbmV4dCBlbnRyeSBzbyB0aGUgYWRhcHRlciBjYW4gbmF2aWdhdGUgdGhlIGxpc3QKKyAqIHVzaW5nIGJ1cyBtYXN0ZXIgRE1BLiBUaGUgcG9pbnRlcnMgdG8gdGhlIGFjdHVhbCBidWZmZXJzIGFyZSBmaWxsZWQKKyAqIG91dCBsYXRlciB3aGVuIHRoZSBhY3R1YWwgYnVmZmVycyBhcmUgYWxsb2NhdGVkLgorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IKKyAqLworc3RhdGljIGludCBtZ3NsX2FsbG9jX2J1ZmZlcl9saXN0X21lbW9yeSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKSB7CisJCS8qIFBDSSBhZGFwdGVyIHVzZXMgc2hhcmVkIG1lbW9yeS4gKi8KKwkJaW5mby0+YnVmZmVyX2xpc3QgPSBpbmZvLT5tZW1vcnlfYmFzZSArIGluZm8tPmxhc3RfbWVtX2FsbG9jOworCQlpbmZvLT5idWZmZXJfbGlzdF9waHlzID0gaW5mby0+bGFzdF9tZW1fYWxsb2M7CisJCWluZm8tPmxhc3RfbWVtX2FsbG9jICs9IEJVRkZFUkxJU1RTSVpFOworCX0gZWxzZSB7CisJCS8qIElTQSBhZGFwdGVyIHVzZXMgc3lzdGVtIG1lbW9yeS4gKi8KKwkJLyogVGhlIGJ1ZmZlciBsaXN0cyBhcmUgYWxsb2NhdGVkIGFzIGEgY29tbW9uIGJ1ZmZlciB0aGF0IGJvdGggKi8KKwkJLyogdGhlIHByb2Nlc3NvciBhbmQgYWRhcHRlciBjYW4gYWNjZXNzLiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvICovCisJCS8qIGluc3BlY3QgcG9ydGlvbnMgb2YgdGhlIGJ1ZmZlciB3aGlsZSBvdGhlciBwb3J0aW9ucyBhcmUgYmVpbmcgKi8KKwkJLyogdXBkYXRlZCBieSB0aGUgYWRhcHRlciB1c2luZyBCdXMgTWFzdGVyIERNQS4gKi8KKworCQlpbmZvLT5idWZmZXJfbGlzdCA9IGttYWxsb2MoQlVGRkVSTElTVFNJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJaWYgKCBpbmZvLT5idWZmZXJfbGlzdCA9PSBOVUxMICkKKwkJCXJldHVybiAtRU5PTUVNOworCQkJCisJCWluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgPSBpc2FfdmlydF90b19idXMoaW5mby0+YnVmZmVyX2xpc3QpOworCX0KKworCS8qIFdlIGdvdCB0aGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGVudHJ5IGxpc3RzLiAqLworCS8qIEluaXRpYWxpemUgdGhlIG1lbW9yeSBibG9jayB0byBhbGwgemVyb3MuICovCisJbWVtc2V0KCBpbmZvLT5idWZmZXJfbGlzdCwgMCwgQlVGRkVSTElTVFNJWkUgKTsKKworCS8qIFNhdmUgdmlydHVhbCBhZGRyZXNzIHBvaW50ZXJzIHRvIHRoZSByZWNlaXZlIGFuZCAqLworCS8qIHRyYW5zbWl0IGJ1ZmZlciBsaXN0cy4gKFJlY2VpdmUgMXN0KS4gVGhlc2UgcG9pbnRlcnMgd2lsbCAqLworCS8qIGJlIHVzZWQgYnkgdGhlIHByb2Nlc3NvciB0byBhY2Nlc3MgdGhlIGxpc3RzLiAqLworCWluZm8tPnJ4X2J1ZmZlcl9saXN0ID0gKERNQUJVRkZFUkVOVFJZICopaW5mby0+YnVmZmVyX2xpc3Q7CisJaW5mby0+dHhfYnVmZmVyX2xpc3QgPSAoRE1BQlVGRkVSRU5UUlkgKilpbmZvLT5idWZmZXJfbGlzdDsKKwlpbmZvLT50eF9idWZmZXJfbGlzdCArPSBpbmZvLT5yeF9idWZmZXJfY291bnQ7CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBsaW5rcyBmb3IgdGhlIGJ1ZmZlciBlbnRyeSBsaXN0cyBzdWNoIHRoYXQKKwkgKiB0d28gY2lyY3VsYXIgbGlzdHMgYXJlIGJ1aWx0LiAoVHJhbnNtaXQgYW5kIFJlY2VpdmUpLgorCSAqCisJICogTm90ZTogdGhlIGxpbmtzIGFyZSBwaHlzaWNhbCBhZGRyZXNzZXMKKwkgKiB3aGljaCBhcmUgcmVhZCBieSB0aGUgYWRhcHRlciB0byBkZXRlcm1pbmUgdGhlIG5leHQKKwkgKiBidWZmZXIgZW50cnkgdG8gdXNlLgorCSAqLworCisJZm9yICggaSA9IDA7IGkgPCBpbmZvLT5yeF9idWZmZXJfY291bnQ7IGkrKyApIHsKKwkJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgYnVmZmVyIGVudHJ5ICovCisJCWluZm8tPnJ4X2J1ZmZlcl9saXN0W2ldLnBoeXNfZW50cnkgPQorCQkJaW5mby0+YnVmZmVyX2xpc3RfcGh5cyArIChpICogc2l6ZW9mKERNQUJVRkZFUkVOVFJZKSk7CisKKwkJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSBwaHlzaWNhbCBhZGRyZXNzIG9mICovCisJCS8qIG5leHQgZW50cnkgaW4gY2lydWxhciBsaXN0IG9mIGVudHJpZXMgKi8KKworCQlpbmZvLT5yeF9idWZmZXJfbGlzdFtpXS5saW5rID0gaW5mby0+YnVmZmVyX2xpc3RfcGh5czsKKworCQlpZiAoIGkgPCBpbmZvLT5yeF9idWZmZXJfY291bnQgLSAxICkKKwkJCWluZm8tPnJ4X2J1ZmZlcl9saXN0W2ldLmxpbmsgKz0gKGkgKyAxKSAqIHNpemVvZihETUFCVUZGRVJFTlRSWSk7CisJfQorCisJZm9yICggaSA9IDA7IGkgPCBpbmZvLT50eF9idWZmZXJfY291bnQ7IGkrKyApIHsKKwkJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgYnVmZmVyIGVudHJ5ICovCisJCWluZm8tPnR4X2J1ZmZlcl9saXN0W2ldLnBoeXNfZW50cnkgPSBpbmZvLT5idWZmZXJfbGlzdF9waHlzICsKKwkJCSgoaW5mby0+cnhfYnVmZmVyX2NvdW50ICsgaSkgKiBzaXplb2YoRE1BQlVGRkVSRU5UUlkpKTsKKworCQkvKiBjYWxjdWxhdGUgYW5kIHN0b3JlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgKi8KKwkJLyogbmV4dCBlbnRyeSBpbiBjaXJ1bGFyIGxpc3Qgb2YgZW50cmllcyAqLworCisJCWluZm8tPnR4X2J1ZmZlcl9saXN0W2ldLmxpbmsgPSBpbmZvLT5idWZmZXJfbGlzdF9waHlzICsKKwkJCWluZm8tPnJ4X2J1ZmZlcl9jb3VudCAqIHNpemVvZihETUFCVUZGRVJFTlRSWSk7CisKKwkJaWYgKCBpIDwgaW5mby0+dHhfYnVmZmVyX2NvdW50IC0gMSApCisJCQlpbmZvLT50eF9idWZmZXJfbGlzdFtpXS5saW5rICs9IChpICsgMSkgKiBzaXplb2YoRE1BQlVGRkVSRU5UUlkpOworCX0KKworCXJldHVybiAwOworCit9CS8qIGVuZCBvZiBtZ3NsX2FsbG9jX2J1ZmZlcl9saXN0X21lbW9yeSgpICovCisKKy8qIEZyZWUgRE1BIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciB1c2UgYXMgdGhlCisgKiByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXIgbGlzdHMuCisgKiBXYXJuaW5nOgorICogCisgKiAJVGhlIGRhdGEgdHJhbnNmZXIgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlciBsaXN0CisgKiAJTVVTVCBiZSBmcmVlZCBiZWZvcmUgZnJlZWluZyB0aGUgYnVmZmVyIGxpc3QgaXRzZWxmIGJlY2F1c2UKKyAqIAl0aGUgYnVmZmVyIGxpc3QgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBmcmVlCisgKiAJdGhlIGluZGl2aWR1YWwgYnVmZmVycyEKKyAqLworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2J1ZmZlcl9saXN0X21lbW9yeSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpZiAoIGluZm8tPmJ1ZmZlcl9saXN0ICYmIGluZm8tPmJ1c190eXBlICE9IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJa2ZyZWUoaW5mby0+YnVmZmVyX2xpc3QpOworCQkKKwlpbmZvLT5idWZmZXJfbGlzdCA9IE5VTEw7CisJaW5mby0+cnhfYnVmZmVyX2xpc3QgPSBOVUxMOworCWluZm8tPnR4X2J1ZmZlcl9saXN0ID0gTlVMTDsKKworfQkvKiBlbmQgb2YgbWdzbF9mcmVlX2J1ZmZlcl9saXN0X21lbW9yeSgpICovCisKKy8qCisgKiBtZ3NsX2FsbG9jX2ZyYW1lX21lbW9yeSgpCisgKiAKKyAqIAlBbGxvY2F0ZSB0aGUgZnJhbWUgRE1BIGJ1ZmZlcnMgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBsaXN0LgorICogCUVhY2ggRE1BIGJ1ZmZlciB3aWxsIGJlIG9uZSBtZW1vcnkgcGFnZSBpbiBzaXplLiBUaGlzIGlzIG5lY2Vzc2FyeQorICogCWJlY2F1c2UgbWVtb3J5IGNhbiBmcmFnbWVudCBlbm91Z2ggdGhhdCBpdCBtYXkgYmUgaW1wb3NzaWJsZQorICogCWNvbnRpZ3VvdXMgcGFnZXMuCisgKiAKKyAqIEFyZ3VtZW50czoKKyAqIAorICoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCUJ1ZmZlckxpc3QJcG9pbnRlciB0byBsaXN0IG9mIGJ1ZmZlciBlbnRyaWVzCisgKiAJQnVmZmVyY291bnQJY291bnQgb2YgYnVmZmVyIGVudHJpZXMgaW4gYnVmZmVyIGxpc3QKKyAqIAorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSAtRU5PTUVNCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9hbGxvY19mcmFtZV9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLERNQUJVRkZFUkVOVFJZICpCdWZmZXJMaXN0LGludCBCdWZmZXJjb3VudCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKKworCS8qIEFsbG9jYXRlIHBhZ2Ugc2l6ZWQgYnVmZmVycyBmb3IgdGhlIHJlY2VpdmUgYnVmZmVyIGxpc3QgKi8KKworCWZvciAoIGkgPSAwOyBpIDwgQnVmZmVyY291bnQ7IGkrKyApIHsKKwkJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApIHsKKwkJCS8qIFBDSSBhZGFwdGVyIHVzZXMgc2hhcmVkIG1lbW9yeSBidWZmZXJzLiAqLworCQkJQnVmZmVyTGlzdFtpXS52aXJ0X2FkZHIgPSBpbmZvLT5tZW1vcnlfYmFzZSArIGluZm8tPmxhc3RfbWVtX2FsbG9jOworCQkJcGh5c19hZGRyID0gaW5mby0+bGFzdF9tZW1fYWxsb2M7CisJCQlpbmZvLT5sYXN0X21lbV9hbGxvYyArPSBETUFCVUZGRVJTSVpFOworCQl9IGVsc2UgeworCQkJLyogSVNBIGFkYXB0ZXIgdXNlcyBzeXN0ZW0gbWVtb3J5LiAqLworCQkJQnVmZmVyTGlzdFtpXS52aXJ0X2FkZHIgPSAKKwkJCQlrbWFsbG9jKERNQUJVRkZFUlNJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmICggQnVmZmVyTGlzdFtpXS52aXJ0X2FkZHIgPT0gTlVMTCApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlwaHlzX2FkZHIgPSBpc2FfdmlydF90b19idXMoQnVmZmVyTGlzdFtpXS52aXJ0X2FkZHIpOworCQl9CisJCUJ1ZmZlckxpc3RbaV0ucGh5c19hZGRyID0gcGh5c19hZGRyOworCX0KKworCXJldHVybiAwOworCit9CS8qIGVuZCBvZiBtZ3NsX2FsbG9jX2ZyYW1lX21lbW9yeSgpICovCisKKy8qCisgKiBtZ3NsX2ZyZWVfZnJhbWVfbWVtb3J5KCkKKyAqIAorICogCUZyZWUgdGhlIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoCisgKiAJZWFjaCBidWZmZXIgZW50cnkgb2YgYSBidWZmZXIgbGlzdC4KKyAqIAorICogQXJndW1lbnRzOgorICogCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJQnVmZmVyTGlzdAlwb2ludGVyIHRvIGxpc3Qgb2YgYnVmZmVyIGVudHJpZXMKKyAqIAlCdWZmZXJjb3VudAljb3VudCBvZiBidWZmZXIgZW50cmllcyBpbiBidWZmZXIgbGlzdAorICogCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2ZyYW1lX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIERNQUJVRkZFUkVOVFJZICpCdWZmZXJMaXN0LCBpbnQgQnVmZmVyY291bnQpCit7CisJaW50IGk7CisKKwlpZiAoIEJ1ZmZlckxpc3QgKSB7CisJCWZvciAoIGkgPSAwIDsgaSA8IEJ1ZmZlcmNvdW50IDsgaSsrICkgeworCQkJaWYgKCBCdWZmZXJMaXN0W2ldLnZpcnRfYWRkciApIHsKKwkJCQlpZiAoIGluZm8tPmJ1c190eXBlICE9IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJCQkJa2ZyZWUoQnVmZmVyTGlzdFtpXS52aXJ0X2FkZHIpOworCQkJCUJ1ZmZlckxpc3RbaV0udmlydF9hZGRyID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworfQkvKiBlbmQgb2YgbWdzbF9mcmVlX2ZyYW1lX21lbW9yeSgpICovCisKKy8qIG1nc2xfZnJlZV9kbWFfYnVmZmVycygpCisgKiAKKyAqIAlGcmVlIERNQSBidWZmZXJzCisgKiAJCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfZG1hX2J1ZmZlcnMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJbWdzbF9mcmVlX2ZyYW1lX21lbW9yeSggaW5mbywgaW5mby0+cnhfYnVmZmVyX2xpc3QsIGluZm8tPnJ4X2J1ZmZlcl9jb3VudCApOworCW1nc2xfZnJlZV9mcmFtZV9tZW1vcnkoIGluZm8sIGluZm8tPnR4X2J1ZmZlcl9saXN0LCBpbmZvLT50eF9idWZmZXJfY291bnQgKTsKKwltZ3NsX2ZyZWVfYnVmZmVyX2xpc3RfbWVtb3J5KCBpbmZvICk7CisKK30JLyogZW5kIG9mIG1nc2xfZnJlZV9kbWFfYnVmZmVycygpICovCisKKworLyoKKyAqIG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeSgpCisgKiAKKyAqIAlBbGxvY2F0ZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBtYXhfZnJhbWVfc2l6ZS4gVGhpcyBidWZmZXIKKyAqCWlzIHVzZWQgdG8gcGFzcyBhbiBhc3NlbWJsZWQgZnJhbWUgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4KKyAqIAorICogQXJndW1lbnRzOgorICogCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgLUVOT01FTQorICovCitzdGF0aWMgaW50IG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyID0ga21hbGxvYyhpbmZvLT5tYXhfZnJhbWVfc2l6ZSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICggaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyID09IE5VTEwgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworCit9CS8qIGVuZCBvZiBtZ3NsX2FsbG9jX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoKSAqLworCisvKgorICogbWdzbF9mcmVlX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoKQorICogCisgKiAKKyAqIEFyZ3VtZW50czoKKyAqIAorICoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWlmICggaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyICkKKwkJa2ZyZWUoaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyKTsKKworCWluZm8tPmludGVybWVkaWF0ZV9yeGJ1ZmZlciA9IE5VTEw7CisKK30JLyogZW5kIG9mIG1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfcnhidWZmZXJfbWVtb3J5KCkgKi8KKworLyoKKyAqIG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeSgpCisgKgorICogCUFsbG9jYXRlIGludGVybWRpYXRlIHRyYW5zbWl0IGJ1ZmZlcihzKSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBtYXhfZnJhbWVfc2l6ZS4KKyAqIAlUaGlzIGJ1ZmZlciBpcyB1c2VkIHRvIGxvYWQgdHJhbnNtaXQgZnJhbWVzIGludG8gdGhlIGFkYXB0ZXIncyBkbWEgdHJhbnNmZXIKKyAqIAlidWZmZXJzIHdoZW4gdGhlcmUgaXMgc3VmZmljaWVudCBzcGFjZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKgorICoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICoKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgLUVOT01FTQorICovCitzdGF0aWMgaW50IG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJaW50IGk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoIiVzICVzKCVkKSAgYWxsb2NhdGluZyAlZCB0eCBob2xkaW5nIGJ1ZmZlcnNcbiIsCisJCQkJaW5mby0+ZGV2aWNlX25hbWUsIF9fRklMRV9fLF9fTElORV9fLGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMpOworCisJbWVtc2V0KGluZm8tPnR4X2hvbGRpbmdfYnVmZmVycywwLHNpemVvZihpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnMpKTsKKworCWZvciAoIGk9MDsgaTxpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzOyArK2kpIHsKKwkJaW5mby0+dHhfaG9sZGluZ19idWZmZXJzW2ldLmJ1ZmZlciA9CisJCQlrbWFsbG9jKGluZm8tPm1heF9mcmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCBpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnNbaV0uYnVmZmVyID09IE5VTEwgKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7CisKK30JLyogZW5kIG9mIG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeSgpICovCisKKy8qCisgKiBtZ3NsX2ZyZWVfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeSgpCisgKgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgaTxpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzOyArK2kgKSB7CisJCWlmICggaW5mby0+dHhfaG9sZGluZ19idWZmZXJzW2ldLmJ1ZmZlciApIHsKKwkJCQlrZnJlZShpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnNbaV0uYnVmZmVyKTsKKwkJCQlpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnNbaV0uYnVmZmVyPU5VTEw7CisJCX0KKwl9CisKKwlpbmZvLT5nZXRfdHhfaG9sZGluZ19pbmRleCA9IDA7CisJaW5mby0+cHV0X3R4X2hvbGRpbmdfaW5kZXggPSAwOworCWluZm8tPnR4X2hvbGRpbmdfY291bnQgPSAwOworCit9CS8qIGVuZCBvZiBtZ3NsX2ZyZWVfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeSgpICovCisKKworLyoKKyAqIGxvYWRfbmV4dF90eF9ob2xkaW5nX2J1ZmZlcigpCisgKgorICogYXR0ZW1wdHMgdG8gbG9hZCB0aGUgbmV4dCBidWZmZXJlZCB0eCByZXF1ZXN0IGludG8gdGhlCisgKiB0eCBkbWEgYnVmZmVycworICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgkxIGlmIG5leHQgYnVmZmVyZWQgdHggcmVxdWVzdCBsb2FkZWQKKyAqIAkJCWludG8gYWRhcHRlcidzIHR4IGRtYSBidWZmZXIsCisgKiAJCQkwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGxvYWRfbmV4dF90eF9ob2xkaW5nX2J1ZmZlcihzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIGluZm8tPnR4X2hvbGRpbmdfY291bnQgKSB7CisJCS8qIGRldGVybWluZSBpZiB3ZSBoYXZlIGVub3VnaCB0eCBkbWEgYnVmZmVycworCQkgKiB0byBhY2NvbW1vZGF0ZSB0aGUgbmV4dCB0eCBmcmFtZQorCQkgKi8KKwkJc3RydWN0IHR4X2hvbGRpbmdfYnVmZmVyICpwdHggPQorCQkJJmluZm8tPnR4X2hvbGRpbmdfYnVmZmVyc1tpbmZvLT5nZXRfdHhfaG9sZGluZ19pbmRleF07CisJCWludCBudW1fZnJlZSA9IG51bV9mcmVlX3R4X2RtYV9idWZmZXJzKGluZm8pOworCQlpbnQgbnVtX25lZWRlZCA9IHB0eC0+YnVmZmVyX3NpemUgLyBETUFCVUZGRVJTSVpFOworCQlpZiAoIHB0eC0+YnVmZmVyX3NpemUgJSBETUFCVUZGRVJTSVpFICkKKwkJCSsrbnVtX25lZWRlZDsKKworCQlpZiAobnVtX25lZWRlZCA8PSBudW1fZnJlZSkgeworCQkJaW5mby0+eG1pdF9jbnQgPSBwdHgtPmJ1ZmZlcl9zaXplOworCQkJbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoaW5mbyxwdHgtPmJ1ZmZlcixwdHgtPmJ1ZmZlcl9zaXplKTsKKworCQkJLS1pbmZvLT50eF9ob2xkaW5nX2NvdW50OworCQkJaWYgKCArK2luZm8tPmdldF90eF9ob2xkaW5nX2luZGV4ID49IGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMpCisJCQkJaW5mby0+Z2V0X3R4X2hvbGRpbmdfaW5kZXg9MDsKKworCQkJLyogcmVzdGFydCB0cmFuc21pdCB0aW1lciAqLworCQkJbW9kX3RpbWVyKCZpbmZvLT50eF90aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpOworCisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNhdmVfdHhfYnVmZmVyX3JlcXVlc3QoKQorICoKKyAqIGF0dGVtcHQgdG8gc3RvcmUgdHJhbnNtaXQgZnJhbWUgcmVxdWVzdCBmb3IgbGF0ZXIgdHJhbnNtaXNzaW9uCisgKgorICogQXJndW1lbnRzOgorICoKKyAqCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAlCdWZmZXIJCXBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgZnJhbWUgdG8gbG9hZAorICogCUJ1ZmZlclNpemUJc2l6ZSBpbiBieXRlcyBvZiBmcmFtZSBpbiBCdWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CTEgaWYgYWJsZSB0byBzdG9yZSwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBzYXZlX3R4X2J1ZmZlcl9yZXF1ZXN0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyxjb25zdCBjaGFyICpCdWZmZXIsIHVuc2lnbmVkIGludCBCdWZmZXJTaXplKQoreworCXN0cnVjdCB0eF9ob2xkaW5nX2J1ZmZlciAqcHR4OworCisJaWYgKCBpbmZvLT50eF9ob2xkaW5nX2NvdW50ID49IGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMgKSB7CisJCXJldHVybiAwOwkgICAgICAgIC8qIGFsbCBidWZmZXJzIGluIHVzZSAqLworCX0KKworCXB0eCA9ICZpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnNbaW5mby0+cHV0X3R4X2hvbGRpbmdfaW5kZXhdOworCXB0eC0+YnVmZmVyX3NpemUgPSBCdWZmZXJTaXplOworCW1lbWNweSggcHR4LT5idWZmZXIsIEJ1ZmZlciwgQnVmZmVyU2l6ZSk7CisKKwkrK2luZm8tPnR4X2hvbGRpbmdfY291bnQ7CisJaWYgKCArK2luZm8tPnB1dF90eF9ob2xkaW5nX2luZGV4ID49IGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMpCisJCWluZm8tPnB1dF90eF9ob2xkaW5nX2luZGV4PTA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtZ3NsX2NsYWltX3Jlc291cmNlcyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJaWYgKHJlcXVlc3RfcmVnaW9uKGluZm8tPmlvX2Jhc2UsaW5mby0+aW9fYWRkcl9zaXplLCJzeW5jbGluayIpID09IE5VTEwpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOkkvTyBhZGRyZXNzIGNvbmZsaWN0IG9uIGRldmljZSAlcyBBZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW9fYmFzZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpbmZvLT5pb19hZGRyX3JlcXVlc3RlZCA9IDE7CisJCisJaWYgKCByZXF1ZXN0X2lycShpbmZvLT5pcnFfbGV2ZWwsbWdzbF9pbnRlcnJ1cHQsaW5mby0+aXJxX2ZsYWdzLAorCQlpbmZvLT5kZXZpY2VfbmFtZSwgaW5mbyApIDwgMCApIHsKKwkJcHJpbnRrKCAiJXMoJWQpOkNhbnQgcmVxdWVzdCBpbnRlcnJ1cHQgb24gZGV2aWNlICVzIElSUT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pcnFfbGV2ZWwgKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCWluZm8tPmlycV9yZXF1ZXN0ZWQgPSAxOworCQorCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKSB7CisJCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+cGh5c19tZW1vcnlfYmFzZSwweDQwMDAwLCJzeW5jbGluayIpID09IE5VTEwpIHsKKwkJCXByaW50ayggIiVzKCVkKTptZW0gYWRkciBjb25mbGljdCBkZXZpY2UgJXMgQWRkcj0lMDhYXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX21lbW9yeV9iYXNlKTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCWluZm8tPnNoYXJlZF9tZW1fcmVxdWVzdGVkID0gMTsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5waHlzX2xjcl9iYXNlICsgaW5mby0+bGNyX29mZnNldCwxMjgsInN5bmNsaW5rIikgPT0gTlVMTCkgeworCQkJcHJpbnRrKCAiJXMoJWQpOmxjciBtZW0gYWRkciBjb25mbGljdCBkZXZpY2UgJXMgQWRkcj0lMDhYXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX2xjcl9iYXNlICsgaW5mby0+bGNyX29mZnNldCk7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQlpbmZvLT5sY3JfbWVtX3JlcXVlc3RlZCA9IDE7CisKKwkJaW5mby0+bWVtb3J5X2Jhc2UgPSBpb3JlbWFwKGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsMHg0MDAwMCk7CisJCWlmICghaW5mby0+bWVtb3J5X2Jhc2UpIHsKKwkJCXByaW50ayggIiVzKCVkKTpDYW50IG1hcCBzaGFyZWQgbWVtb3J5IG9uIGRldmljZSAlcyBNZW1BZGRyPSUwOFhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UgKTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCQorCQlpZiAoICFtZ3NsX21lbW9yeV90ZXN0KGluZm8pICkgeworCQkJcHJpbnRrKCAiJXMoJWQpOkZhaWxlZCBzaGFyZWQgbWVtb3J5IHRlc3QgJXMgTWVtQWRkcj0lMDhYXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX21lbW9yeV9iYXNlICk7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQkKKwkJaW5mby0+bGNyX2Jhc2UgPSBpb3JlbWFwKGluZm8tPnBoeXNfbGNyX2Jhc2UsUEFHRV9TSVpFKSArIGluZm8tPmxjcl9vZmZzZXQ7CisJCWlmICghaW5mby0+bGNyX2Jhc2UpIHsKKwkJCXByaW50ayggIiVzKCVkKTpDYW50IG1hcCBMQ1IgbWVtb3J5IG9uIGRldmljZSAlcyBNZW1BZGRyPSUwOFhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbGNyX2Jhc2UgKTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCQorCX0gZWxzZSB7CisJCS8qIGNsYWltIERNQSBjaGFubmVsICovCisJCQorCQlpZiAocmVxdWVzdF9kbWEoaW5mby0+ZG1hX2xldmVsLGluZm8tPmRldmljZV9uYW1lKSA8IDApeworCQkJcHJpbnRrKCAiJXMoJWQpOkNhbnQgcmVxdWVzdCBETUEgY2hhbm5lbCBvbiBkZXZpY2UgJXMgRE1BPSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5kbWFfbGV2ZWwgKTsKKwkJCW1nc2xfcmVsZWFzZV9yZXNvdXJjZXMoIGluZm8gKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWluZm8tPmRtYV9yZXF1ZXN0ZWQgPSAxOworCisJCS8qIElTQSBhZGFwdGVyIHVzZXMgYnVzIG1hc3RlciBETUEgKi8JCQorCQlzZXRfZG1hX21vZGUoaW5mby0+ZG1hX2xldmVsLERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKGluZm8tPmRtYV9sZXZlbCk7CisJfQorCQorCWlmICggbWdzbF9hbGxvY2F0ZV9kbWFfYnVmZmVycyhpbmZvKSA8IDAgKSB7CisJCXByaW50ayggIiVzKCVkKTpDYW50IGFsbG9jYXRlIERNQSBidWZmZXJzIG9uIGRldmljZSAlcyBETUE9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+ZG1hX2xldmVsICk7CisJCWdvdG8gZXJyb3V0OworCX0JCisJCisJcmV0dXJuIDA7CitlcnJvdXQ6CisJbWdzbF9yZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworfQkvKiBlbmQgb2YgbWdzbF9jbGFpbV9yZXNvdXJjZXMoKSAqLworCitzdGF0aWMgdm9pZCBtZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9yZWxlYXNlX3Jlc291cmNlcyglcykgZW50cnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJCisJaWYgKCBpbmZvLT5pcnFfcmVxdWVzdGVkICkgeworCQlmcmVlX2lycShpbmZvLT5pcnFfbGV2ZWwsIGluZm8pOworCQlpbmZvLT5pcnFfcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKCBpbmZvLT5kbWFfcmVxdWVzdGVkICkgeworCQlkaXNhYmxlX2RtYShpbmZvLT5kbWFfbGV2ZWwpOworCQlmcmVlX2RtYShpbmZvLT5kbWFfbGV2ZWwpOworCQlpbmZvLT5kbWFfcmVxdWVzdGVkID0gMDsKKwl9CisJbWdzbF9mcmVlX2RtYV9idWZmZXJzKGluZm8pOworCW1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfcnhidWZmZXJfbWVtb3J5KGluZm8pOworICAgICAJbWdzbF9mcmVlX2ludGVybWVkaWF0ZV90eGJ1ZmZlcl9tZW1vcnkoaW5mbyk7CisJCisJaWYgKCBpbmZvLT5pb19hZGRyX3JlcXVlc3RlZCApIHsKKwkJcmVsZWFzZV9yZWdpb24oaW5mby0+aW9fYmFzZSxpbmZvLT5pb19hZGRyX3NpemUpOworCQlpbmZvLT5pb19hZGRyX3JlcXVlc3RlZCA9IDA7CisJfQorCWlmICggaW5mby0+c2hhcmVkX21lbV9yZXF1ZXN0ZWQgKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5waHlzX21lbW9yeV9iYXNlLDB4NDAwMDApOworCQlpbmZvLT5zaGFyZWRfbWVtX3JlcXVlc3RlZCA9IDA7CisJfQorCWlmICggaW5mby0+bGNyX21lbV9yZXF1ZXN0ZWQgKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5waHlzX2xjcl9iYXNlICsgaW5mby0+bGNyX29mZnNldCwxMjgpOworCQlpbmZvLT5sY3JfbWVtX3JlcXVlc3RlZCA9IDA7CisJfQorCWlmIChpbmZvLT5tZW1vcnlfYmFzZSl7CisJCWlvdW5tYXAoaW5mby0+bWVtb3J5X2Jhc2UpOworCQlpbmZvLT5tZW1vcnlfYmFzZSA9IE5VTEw7CisJfQorCWlmIChpbmZvLT5sY3JfYmFzZSl7CisJCWlvdW5tYXAoaW5mby0+bGNyX2Jhc2UgLSBpbmZvLT5sY3Jfb2Zmc2V0KTsKKwkJaW5mby0+bGNyX2Jhc2UgPSBOVUxMOworCX0KKwkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9yZWxlYXNlX3Jlc291cmNlcyglcykgZXhpdFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7CisJCQkKK30JLyogZW5kIG9mIG1nc2xfcmVsZWFzZV9yZXNvdXJjZXMoKSAqLworCisvKiBtZ3NsX2FkZF9kZXZpY2UoKQorICogCisgKiAJQWRkIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlIHRvIHRoZQorICogCWdsb2JhbCBsaW5rZWQgbGlzdCBvZiBkZXZpY2VzIGFuZCBpbmNyZW1lbnQgdGhlIGRldmljZSBjb3VudC4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfYWRkX2RldmljZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpbmZvLT5uZXh0X2RldmljZSA9IE5VTEw7CisJaW5mby0+bGluZSA9IG1nc2xfZGV2aWNlX2NvdW50OworCXNwcmludGYoaW5mby0+ZGV2aWNlX25hbWUsInR0eVNMJWQiLGluZm8tPmxpbmUpOworCQorCWlmIChpbmZvLT5saW5lIDwgTUFYX1RPVEFMX0RFVklDRVMpIHsKKwkJaWYgKG1heGZyYW1lW2luZm8tPmxpbmVdKQorCQkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSBtYXhmcmFtZVtpbmZvLT5saW5lXTsKKwkJaW5mby0+ZG9zeW5jcHBwID0gZG9zeW5jcHBwW2luZm8tPmxpbmVdOworCisJCWlmICh0eGRtYWJ1ZnNbaW5mby0+bGluZV0pIHsKKwkJCWluZm8tPm51bV90eF9kbWFfYnVmZmVycyA9IHR4ZG1hYnVmc1tpbmZvLT5saW5lXTsKKwkJCWlmIChpbmZvLT5udW1fdHhfZG1hX2J1ZmZlcnMgPCAxKQorCQkJCWluZm8tPm51bV90eF9kbWFfYnVmZmVycyA9IDE7CisJCX0KKworCQlpZiAodHhob2xkYnVmc1tpbmZvLT5saW5lXSkgeworCQkJaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyA9IHR4aG9sZGJ1ZnNbaW5mby0+bGluZV07CisJCQlpZiAoaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyA8IDEpCisJCQkJaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyA9IDE7CisJCQllbHNlIGlmIChpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzID4gTUFYX1RYX0hPTERJTkdfQlVGRkVSUykKKwkJCQlpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzID0gTUFYX1RYX0hPTERJTkdfQlVGRkVSUzsKKwkJfQorCX0KKworCW1nc2xfZGV2aWNlX2NvdW50Kys7CisJCisJaWYgKCAhbWdzbF9kZXZpY2VfbGlzdCApCisJCW1nc2xfZGV2aWNlX2xpc3QgPSBpbmZvOworCWVsc2UgewkKKwkJc3RydWN0IG1nc2xfc3RydWN0ICpjdXJyZW50X2RldiA9IG1nc2xfZGV2aWNlX2xpc3Q7CisJCXdoaWxlKCBjdXJyZW50X2Rldi0+bmV4dF9kZXZpY2UgKQorCQkJY3VycmVudF9kZXYgPSBjdXJyZW50X2Rldi0+bmV4dF9kZXZpY2U7CisJCWN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSA9IGluZm87CisJfQorCQorCWlmICggaW5mby0+bWF4X2ZyYW1lX3NpemUgPCA0MDk2ICkKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA0MDk2OworCWVsc2UgaWYgKCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA+IDY1NTM1ICkKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA2NTUzNTsKKwkKKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkgeworCQlwcmludGsoICJTeW5jTGluayBQQ0kgdiVkICVzOiBJTz0lMDRYIElSUT0lZCBNZW09JTA4WCwlMDhYIE1heEZyYW1lU2l6ZT0ldVxuIiwKKwkJCWluZm8tPmh3X3ZlcnNpb24gKyAxLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW9fYmFzZSwgaW5mby0+aXJxX2xldmVsLAorCQkJaW5mby0+cGh5c19tZW1vcnlfYmFzZSwgaW5mby0+cGh5c19sY3JfYmFzZSwKKwkJICAgICAJaW5mby0+bWF4X2ZyYW1lX3NpemUgKTsKKwl9IGVsc2UgeworCQlwcmludGsoICJTeW5jTGluayBJU0EgJXM6IElPPSUwNFggSVJRPSVkIERNQT0lZCBNYXhGcmFtZVNpemU9JXVcbiIsCisJCQlpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW9fYmFzZSwgaW5mby0+aXJxX2xldmVsLCBpbmZvLT5kbWFfbGV2ZWwsCisJCSAgICAgCWluZm8tPm1heF9mcmFtZV9zaXplICk7CisJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwloZGxjZGV2X2luaXQoaW5mbyk7CisjZW5kaWYKKworfQkvKiBlbmQgb2YgbWdzbF9hZGRfZGV2aWNlKCkgKi8KKworLyogbWdzbF9hbGxvY2F0ZV9kZXZpY2UoKQorICogCisgKiAJQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBkZXZpY2UgaW5zdGFuY2Ugc3RydWN0dXJlCisgKiAJCisgKiBBcmd1bWVudHM6CQlub25lCisgKiBSZXR1cm4gVmFsdWU6CXBvaW50ZXIgdG8gbWdzbF9zdHJ1Y3QgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBtZ3NsX3N0cnVjdCogbWdzbF9hbGxvY2F0ZV9kZXZpY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm87CisJCisJaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWdzbF9zdHJ1Y3QpLAorCQkgR0ZQX0tFUk5FTCk7CisJCSAKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKCJFcnJvciBjYW4ndCBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2UgZGF0YVxuIik7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgbWdzbF9zdHJ1Y3QpKTsKKwkJaW5mby0+bWFnaWMgPSBNR1NMX01BR0lDOworCQlJTklUX1dPUksoJmluZm8tPnRhc2ssIG1nc2xfYmhfaGFuZGxlciwgaW5mbyk7CisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5ldmVudF93YWl0X3EpOworCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+aXJxX3NwaW5sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPm5ldGxvY2spOworCQltZW1jcHkoJmluZm8tPnBhcmFtcywmZGVmYXVsdF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJCWluZm8tPmlkbGVfbW9kZSA9IEhETENfVFhJRExFX0ZMQUdTOwkJCisJCWluZm8tPm51bV90eF9kbWFfYnVmZmVycyA9IDE7CisJCWluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMgPSAwOworCX0KKwkKKwlyZXR1cm4gaW5mbzsKKworfQkvKiBlbmQgb2YgbWdzbF9hbGxvY2F0ZV9kZXZpY2UoKSovCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbWdzbF9vcHMgPSB7CisJLm9wZW4gPSBtZ3NsX29wZW4sCisJLmNsb3NlID0gbWdzbF9jbG9zZSwKKwkud3JpdGUgPSBtZ3NsX3dyaXRlLAorCS5wdXRfY2hhciA9IG1nc2xfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gbWdzbF9mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IG1nc2xfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbWdzbF9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IG1nc2xfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IG1nc2xfaW9jdGwsCisJLnRocm90dGxlID0gbWdzbF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IG1nc2xfdW50aHJvdHRsZSwKKwkuc2VuZF94Y2hhciA9IG1nc2xfc2VuZF94Y2hhciwKKwkuYnJlYWtfY3RsID0gbWdzbF9icmVhaywKKwkud2FpdF91bnRpbF9zZW50ID0gbWdzbF93YWl0X3VudGlsX3NlbnQsCisgCS5yZWFkX3Byb2MgPSBtZ3NsX3JlYWRfcHJvYywKKwkuc2V0X3Rlcm1pb3MgPSBtZ3NsX3NldF90ZXJtaW9zLAorCS5zdG9wID0gbWdzbF9zdG9wLAorCS5zdGFydCA9IG1nc2xfc3RhcnQsCisJLmhhbmd1cCA9IG1nc2xfaGFuZ3VwLAorCS50aW9jbWdldCA9IHRpb2NtZ2V0LAorCS50aW9jbXNldCA9IHRpb2Ntc2V0LAorfTsKKworLyoKKyAqIHBlcmZvcm0gdHR5IGRldmljZSBpbml0aWFsaXphdGlvbgorICovCitzdGF0aWMgaW50IG1nc2xfaW5pdF90dHkodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcigxMjgpOworCWlmICghc2VyaWFsX2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJCisJc2VyaWFsX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzZXJpYWxfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJzeW5jbGluayI7CisJc2VyaWFsX2RyaXZlci0+bmFtZSA9ICJ0dHlTTCI7CisJc2VyaWFsX2RyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKKwlzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OworCXNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJm1nc2xfb3BzKTsKKwlpZiAoKHJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkgPCAwKSB7CisJCXByaW50aygiJXMoJWQpOkNvdWxkbid0IHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCQlzZXJpYWxfZHJpdmVyID0gTlVMTDsKKwkJcmV0dXJuIHJjOworCX0KKwkJCQorIAlwcmludGsoIiVzICVzLCB0dHkgbWFqb3IjJWRcbiIsCisJCWRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbiwKKwkJc2VyaWFsX2RyaXZlci0+bWFqb3IpOworCXJldHVybiAwOworfQorCisvKiBlbnVtZXJhdGUgdXNlciBzcGVjaWZpZWQgSVNBIGFkYXB0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZW51bV9pc2FfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbzsKKwlpbnQgaTsKKwkJCisJLyogQ2hlY2sgZm9yIHVzZXIgc3BlY2lmaWVkIElTQSBkZXZpY2VzICovCisJCisJZm9yIChpPTAgOyhpIDwgTUFYX0lTQV9ERVZJQ0VTKSAmJiBpb1tpXSAmJiBpcnFbaV07IGkrKyl7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoIklTQSBkZXZpY2Ugc3BlY2lmaWVkIGlvPSUwNFgsaXJxPSVkLGRtYT0lZFxuIiwKKwkJCQlpb1tpXSwgaXJxW2ldLCBkbWFbaV0gKTsKKwkJCisJCWluZm8gPSBtZ3NsX2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoICFpbmZvICkgeworCQkJLyogZXJyb3IgYWxsb2NhdGluZyBkZXZpY2UgaW5zdGFuY2UgZGF0YSAqLworCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9FUlJPUiApCisJCQkJcHJpbnRrKCAiY2FuJ3QgYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlIGRhdGEuXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQkvKiBDb3B5IHVzZXIgY29uZmlndXJhdGlvbiBpbmZvIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhICovCisJCWluZm8tPmlvX2Jhc2UgPSAodW5zaWduZWQgaW50KWlvW2ldOworCQlpbmZvLT5pcnFfbGV2ZWwgPSAodW5zaWduZWQgaW50KWlycVtpXTsKKwkJaW5mby0+aXJxX2xldmVsID0gaXJxX2Nhbm9uaWNhbGl6ZShpbmZvLT5pcnFfbGV2ZWwpOworCQlpbmZvLT5kbWFfbGV2ZWwgPSAodW5zaWduZWQgaW50KWRtYVtpXTsKKwkJaW5mby0+YnVzX3R5cGUgPSBNR1NMX0JVU19UWVBFX0lTQTsKKwkJaW5mby0+aW9fYWRkcl9zaXplID0gMTY7CisJCWluZm8tPmlycV9mbGFncyA9IDA7CisJCQorCQltZ3NsX2FkZF9kZXZpY2UoIGluZm8gKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNsaW5rX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvOworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqdG1wOworCisJcHJpbnRrKCJVbmxvYWRpbmcgJXM6ICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCisJaWYgKHNlcmlhbF9kcml2ZXIpIHsKKwkJaWYgKChyYyA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkpCisJCQlwcmludGsoIiVzKCVkKSBmYWlsZWQgdG8gdW5yZWdpc3RlciB0dHkgZHJpdmVyIGVycj0lZFxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXyxfX0xJTkVfXyxyYyk7CisJCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCX0KKworCWluZm8gPSBtZ3NsX2RldmljZV9saXN0OworCXdoaWxlKGluZm8pIHsKKyNpZmRlZiBDT05GSUdfSERMQworCQloZGxjZGV2X2V4aXQoaW5mbyk7CisjZW5kaWYKKwkJbWdzbF9yZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwkJdG1wID0gaW5mbzsKKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCQlrZnJlZSh0bXApOworCX0KKwkKKwlpZiAodG1wX2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHRtcF9idWYpOworCQl0bXBfYnVmID0gTlVMTDsKKwl9CisJCisJaWYgKHBjaV9yZWdpc3RlcmVkKQorCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN5bmNsaW5rX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzeW5jbGlua19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKGJyZWFrX29uX2xvYWQpIHsKKwkgCW1nc2xfZ2V0X3RleHRfcHRyKCk7CisgIAkJQlJFQUtQT0lOVCgpOworCX0KKworIAlwcmludGsoIiVzICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCisJbWdzbF9lbnVtX2lzYV9kZXZpY2VzKCk7CisJaWYgKChyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN5bmNsaW5rX3BjaV9kcml2ZXIpKSA8IDApCisJCXByaW50aygiJXM6ZmFpbGVkIHRvIHJlZ2lzdGVyIFBDSSBkcml2ZXIsIGVycm9yPSVkXG4iLF9fRklMRV9fLHJjKTsKKwllbHNlCisJCXBjaV9yZWdpc3RlcmVkID0gMTsKKworCWlmICgocmMgPSBtZ3NsX2luaXRfdHR5KCkpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlzeW5jbGlua19jbGVhbnVwKCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3luY2xpbmtfZXhpdCh2b2lkKQoreworCXN5bmNsaW5rX2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoc3luY2xpbmtfaW5pdCk7Cittb2R1bGVfZXhpdChzeW5jbGlua19leGl0KTsKKworLyoKKyAqIHVzY19SVENtZCgpCisgKgorICogSXNzdWUgYSBVU0MgUmVjZWl2ZS9UcmFuc21pdCBjb21tYW5kIHRvIHRoZQorICogQ2hhbm5lbCBDb21tYW5kL0FkZHJlc3MgUmVnaXN0ZXIgKENDQVIpLgorICoKKyAqIE5vdGVzOgorICoKKyAqICAgIFRoZSBjb21tYW5kIGlzIGVuY29kZWQgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgNSBiaXRzIDwxNS4uMTE+CisgKiAgICBvZiB0aGUgQ0NBUiB2YWx1ZS4gQml0cyA8MTAuLjc+IG9mIHRoZSBDQ0FSIG11c3QgYmUgcHJlc2VydmVkCisgKiAgICBhbmQgQml0cyA8Ni4uMD4gbXVzdCBiZSB3cml0dGVuIGFzIHplcm9zLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAgICBpbmZvICAgcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiAgICBDbWQgICAgY29tbWFuZCBtYXNrICh1c2Ugc3ltYm9saWMgbWFjcm9zKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19SVENtZCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgQ21kICkKK3sKKwkvKiBvdXRwdXQgY29tbWFuZCB0byBDQ0FSIGluIGJpdHMgPDE1Li4xMT4gKi8KKwkvKiBwcmVzZXJ2ZSBiaXRzIDwxMC4uNz4sIGJpdHMgPDYuLjA+IG11c3QgYmUgemVybyAqLworCisJb3V0dyggQ21kICsgaW5mby0+bG9vcGJhY2tfYml0cywgaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKworCS8qIFJlYWQgdG8gZmx1c2ggd3JpdGUgdG8gQ0NBUiAqLworCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQlpbncoIGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisKK30JLyogZW5kIG9mIHVzY19SVENtZCgpICovCisKKy8qCisgKiB1c2NfRG1hQ21kKCkKKyAqCisgKiAgICBJc3N1ZSBhIERNQSBjb21tYW5kIHRvIHRoZSBETUEgQ29tbWFuZC9BZGRyZXNzIFJlZ2lzdGVyIChEQ0FSKS4KKyAqCisgKiBBcmd1bWVudHM6CisgKgorICogICAgaW5mbyAgIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogICAgQ21kICAgIERNQSBjb21tYW5kIG1hc2sgKHVzY19EbWFDbWRfWFggTWFjcm9zKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICAgICBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19EbWFDbWQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IENtZCApCit7CisJLyogd3JpdGUgY29tbWFuZCBtYXNrIHRvIERDQVIgKi8KKwlvdXR3KCBDbWQgKyBpbmZvLT5tYnJlX2JpdCwgaW5mby0+aW9fYmFzZSApOworCisJLyogUmVhZCB0byBmbHVzaCB3cml0ZSB0byBEQ0FSICovCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCWludyggaW5mby0+aW9fYmFzZSApOworCit9CS8qIGVuZCBvZiB1c2NfRG1hQ21kKCkgKi8KKworLyoKKyAqIHVzY19PdXREbWFSZWcoKQorICoKKyAqICAgIFdyaXRlIGEgMTYtYml0IHZhbHVlIHRvIGEgVVNDIERNQSByZWdpc3RlcgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAgICBpbmZvICAgICAgcG9pbnRlciB0byBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUKKyAqICAgIFJlZ0FkZHIgICByZWdpc3RlciBhZGRyZXNzIChudW1iZXIpIGZvciB3cml0ZQorICogICAgUmVnVmFsdWUgIDE2LWJpdCB2YWx1ZSB0byB3cml0ZSB0byByZWdpc3RlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBOb25lCisgKgorICovCitzdGF0aWMgdm9pZCB1c2NfT3V0RG1hUmVnKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBSZWdBZGRyLCB1MTYgUmVnVmFsdWUgKQoreworCS8qIE5vdGU6IFRoZSBEQ0FSIGlzIGxvY2F0ZWQgYXQgdGhlIGFkYXB0ZXIgYmFzZSBhZGRyZXNzICovCisJLyogTm90ZTogbXVzdCBwcmVzZXJ2ZSBzdGF0ZSBvZiBCSVQ4IGluIERDQVIgKi8KKworCW91dHcoIFJlZ0FkZHIgKyBpbmZvLT5tYnJlX2JpdCwgaW5mby0+aW9fYmFzZSApOworCW91dHcoIFJlZ1ZhbHVlLCBpbmZvLT5pb19iYXNlICk7CisKKwkvKiBSZWFkIHRvIGZsdXNoIHdyaXRlIHRvIERDQVIgKi8KKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJaW53KCBpbmZvLT5pb19iYXNlICk7CisKK30JLyogZW5kIG9mIHVzY19PdXREbWFSZWcoKSAqLworIAorLyoKKyAqIHVzY19JbkRtYVJlZygpCisgKgorICogICAgUmVhZCBhIDE2LWJpdCB2YWx1ZSBmcm9tIGEgRE1BIHJlZ2lzdGVyCisgKgorICogQXJndW1lbnRzOgorICoKKyAqICAgIGluZm8gICAgIHBvaW50ZXIgdG8gZGV2aWNlIGluZm8gc3RydWN0dXJlCisgKiAgICBSZWdBZGRyICByZWdpc3RlciBhZGRyZXNzIChudW1iZXIpIHRvIHJlYWQgZnJvbQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBUaGUgMTYtYml0IHZhbHVlIHJlYWQgZnJvbSByZWdpc3RlcgorICoKKyAqLworc3RhdGljIHUxNiB1c2NfSW5EbWFSZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFJlZ0FkZHIgKQoreworCS8qIE5vdGU6IFRoZSBEQ0FSIGlzIGxvY2F0ZWQgYXQgdGhlIGFkYXB0ZXIgYmFzZSBhZGRyZXNzICovCisJLyogTm90ZTogbXVzdCBwcmVzZXJ2ZSBzdGF0ZSBvZiBCSVQ4IGluIERDQVIgKi8KKworCW91dHcoIFJlZ0FkZHIgKyBpbmZvLT5tYnJlX2JpdCwgaW5mby0+aW9fYmFzZSApOworCXJldHVybiBpbncoIGluZm8tPmlvX2Jhc2UgKTsKKworfQkvKiBlbmQgb2YgdXNjX0luRG1hUmVnKCkgKi8KKworLyoKKyAqCisgKiB1c2NfT3V0UmVnKCkKKyAqCisgKiAgICBXcml0ZSBhIDE2LWJpdCB2YWx1ZSB0byBhIFVTQyBzZXJpYWwgY2hhbm5lbCByZWdpc3RlciAKKyAqCisgKiBBcmd1bWVudHM6CisgKgorICogICAgaW5mbyAgICAgIHBvaW50ZXIgdG8gZGV2aWNlIGluZm8gc3RydWN0dXJlCisgKiAgICBSZWdBZGRyICAgcmVnaXN0ZXIgYWRkcmVzcyAobnVtYmVyKSB0byB3cml0ZSB0bworICogICAgUmVnVmFsdWUgIDE2LWJpdCB2YWx1ZSB0byB3cml0ZSB0byByZWdpc3RlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBOb25lCisgKgorICovCitzdGF0aWMgdm9pZCB1c2NfT3V0UmVnKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBSZWdBZGRyLCB1MTYgUmVnVmFsdWUgKQoreworCW91dHcoIFJlZ0FkZHIgKyBpbmZvLT5sb29wYmFja19iaXRzLCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCW91dHcoIFJlZ1ZhbHVlLCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCisJLyogUmVhZCB0byBmbHVzaCB3cml0ZSB0byBDQ0FSICovCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCWludyggaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKworfQkvKiBlbmQgb2YgdXNjX091dFJlZygpICovCisKKy8qCisgKiB1c2NfSW5SZWcoKQorICoKKyAqICAgIFJlYWRzIGEgMTYtYml0IHZhbHVlIGZyb20gYSBVU0Mgc2VyaWFsIGNoYW5uZWwgcmVnaXN0ZXIKKyAqCisgKiBBcmd1bWVudHM6CisgKgorICogICAgaW5mbyAgICAgICBwb2ludGVyIHRvIGRldmljZSBleHRlbnNpb24KKyAqICAgIFJlZ0FkZHIgICAgcmVnaXN0ZXIgYWRkcmVzcyAobnVtYmVyKSB0byByZWFkIGZyb20KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgMTYtYml0IHZhbHVlIHJlYWQgZnJvbSByZWdpc3RlcgorICovCitzdGF0aWMgdTE2IHVzY19JblJlZyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgUmVnQWRkciApCit7CisJb3V0dyggUmVnQWRkciArIGluZm8tPmxvb3BiYWNrX2JpdHMsIGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisJcmV0dXJuIGludyggaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKworfQkvKiBlbmQgb2YgdXNjX0luUmVnKCkgKi8KKworLyogdXNjX3NldF9zZGxjX21vZGUoKQorICoKKyAqICAgIFNldCB1cCB0aGUgYWRhcHRlciBmb3IgU0RMQyBETUEgY29tbXVuaWNhdGlvbnMuCisgKgorICogQXJndW1lbnRzOgkJaW5mbyAgICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6IAlOT05FCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zZXRfc2RsY19tb2RlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXUxNiBSZWdWYWx1ZTsKKwlpbnQgUHJlU0wxNjYwOworCQorCS8qCisJICogZGV0ZXJtaW5lIGlmIHRoZSBJVVNDIG9uIHRoZSBhZGFwdGVyIGlzIHByZS1TTDE2NjAuIElmCisJICogbm90LCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgVW5kZXJXYWl0IGZlYXR1cmUgb2YgbW9yZQorCSAqIG1vZGVybiBjaGlwcy4gSWYgYW4gdW5kZXJydW4gb2NjdXJzIGFuZCB0aGlzIGJpdCBpcyBzZXQsCisJICogdGhlIHRyYW5zbWl0dGVyIHdpbGwgaWRsZSB0aGUgcHJvZ3JhbW1lZCBpZGxlIHBhdHRlcm4KKwkgKiB1bnRpbCB0aGUgZHJpdmVyIGhhcyB0aW1lIHRvIHNlcnZpY2UgdGhlIHVuZGVycnVuLiBPdGhlcndpc2UsCisJICogdGhlIGRtYSBjb250cm9sbGVyIG1heSBnZXQgdGhlIGN5Y2xlcyBwcmV2aW91c2x5IHJlcXVlc3RlZAorCSAqIGFuZCBiZWdpbiB0cmFuc21pdHRpbmcgcXVldWVkIHR4IGRhdGEuCisJICovCisJdXNjX091dFJlZyhpbmZvLFRNQ1IsMHgxZik7CisJUmVnVmFsdWU9dXNjX0luUmVnKGluZm8sVE1EUik7CisJaWYgKCBSZWdWYWx1ZSA9PSBJVVNDX1BSRV9TTDE2NjAgKQorCQlQcmVTTDE2NjAgPSAxOworCWVsc2UKKwkJUHJlU0wxNjYwID0gMDsKKwkKKworIAlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19IRExDX0xPT1BNT0RFICkKKyAJeworIAkgICAvKgorIAkgICAqKiBDaGFubmVsIE1vZGUgUmVnaXN0ZXIgKENNUikKKyAJICAgKioKKyAJICAgKiogPDE1Li4xND4gICAgMTAgICAgVHggU3ViIE1vZGVzLCBTZW5kIEZsYWcgb24gVW5kZXJydW4KKyAJICAgKiogPDEzPiAgICAgICAgMCAgICAgMCA9IFRyYW5zbWl0IERpc2FibGVkIChpbml0aWFsbHkpCisgCSAgICoqIDwxMj4gICAgICAgIDAgICAgIDEgPSBDb25zZWN1dGl2ZSBJZGxlcyBzaGFyZSBjb21tb24gMAorIAkgICAqKiA8MTEuLjg+ICAgICAxMTEwICBUcmFuc21pdHRlciBNb2RlID0gSERMQy9TRExDIExvb3AKKyAJICAgKiogPDcuLjQ+ICAgICAgMDAwMCAgUnggU3ViIE1vZGVzLCBhZGRyL2N0cmwgZmllbGQgaGFuZGxpbmcKKyAJICAgKiogPDMuLjA+ICAgICAgMDExMCAgUmVjZWl2ZXIgTW9kZSA9IEhETEMvU0RMQworIAkgICAqKgorIAkgICAqKiAxMDAwIDExMTAgMDAwMCAwMTEwID0gMHg4ZTA2CisgCSAgICovCisgCSAgIFJlZ1ZhbHVlID0gMHg4ZTA2OworIAorIAkgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCSAgICAqIGlnbm9yZSB1c2VyIG9wdGlvbnMgZm9yIFVuZGVyUnVuIEFjdGlvbnMgYW5kCisgCSAgICAqIHByZWFtYmxlcworIAkgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAJfQorIAllbHNlCisgCXsJCisJCS8qIENoYW5uZWwgbW9kZSBSZWdpc3RlciAoQ01SKQorCQkgKgorCQkgKiA8MTUuLjE0PiAgMDAgICAgVHggU3ViIG1vZGVzLCBVbmRlcnJ1biBBY3Rpb24KKwkJICogPDEzPiAgICAgIDAgICAgIDEgPSBTZW5kIFByZWFtYmxlIGJlZm9yZSBvcGVuaW5nIGZsYWcKKwkJICogPDEyPiAgICAgIDAgICAgIDEgPSBDb25zZWN1dGl2ZSBJZGxlcyBzaGFyZSBjb21tb24gMAorCQkgKiA8MTEuLjg+ICAgMDExMCAgVHJhbnNtaXR0ZXIgbW9kZSA9IEhETEMvU0RMQworCQkgKiA8Ny4uND4gICAgMDAwMCAgUnggU3ViIG1vZGVzLCBhZGRyL2N0cmwgZmllbGQgaGFuZGxpbmcKKwkJICogPDMuLjA+ICAgIDAxMTAgIFJlY2VpdmVyIG1vZGUgPSBIRExDL1NETEMKKwkJICoKKwkJICogMDAwMCAwMTEwIDAwMDAgMDExMCA9IDB4MDYwNgorCQkgKi8KKwkJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcpIHsKKwkJCVJlZ1ZhbHVlID0gMHgwMDAxOwkJLyogU2V0IFJlY2VpdmUgbW9kZSA9IGV4dGVybmFsIHN5bmMgKi8KKworCQkJdXNjX091dFJlZyggaW5mbywgSU9DUiwJCS8qIFNldCBJT0NSIERDRCBpcyBSeFN5bmMgRGV0ZWN0IElucHV0ICovCisJCQkJKHVuc2lnbmVkIHNob3J0KSgodXNjX0luUmVnKGluZm8sIElPQ1IpICYgfihCSVQxM3xCSVQxMikpIHwgQklUMTIpKTsKKworCQkJLyoKKwkJCSAqIFR4U3ViTW9kZToKKwkJCSAqIAlDTVIgPDE1PgkJMAlEb24ndCBzZW5kIENSQyBvbiBUeCBVbmRlcnJ1bgorCQkJICogCUNNUiA8MTQ+CQl4CXVuZGVmaW5lZAorCQkJICogCUNNUiA8MTM+CQkwCVNlbmQgcHJlYW1ibGUgYmVmb3JlIG9wZW5uaW5nIHN5bmMKKwkJCSAqIAlDTVIgPDEyPgkJMAlTZW5kIDgtYml0IHN5bmNzLCAxPXNlbmQgU3luY3MgcGVyIFR4TGVuZ3RoCisJCQkgKgorCQkJICogVHhNb2RlOgorCQkJICogCUNNUiA8MTEtOCkJMDEwMAlNb25vU3luYworCQkJICoKKwkJCSAqIAkweDAwIDAxMDAgeHh4eCB4eHh4ICAwNHh4CisJCQkgKi8KKwkJCVJlZ1ZhbHVlIHw9IDB4MDQwMDsKKwkJfQorCQllbHNlIHsKKworCQlSZWdWYWx1ZSA9IDB4MDYwNjsKKworCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1ICkKKwkJCVJlZ1ZhbHVlIHw9IEJJVDE0OworCQllbHNlIGlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1VOREVSUlVOX0ZMQUcgKQorCQkJUmVnVmFsdWUgfD0gQklUMTU7CisJCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVU5ERVJSVU5fQ1JDICkKKwkJCVJlZ1ZhbHVlIHw9IEJJVDE1ICsgQklUMTQ7CisJCX0KKworCQlpZiAoIGluZm8tPnBhcmFtcy5wcmVhbWJsZSAhPSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fTk9ORSApCisJCQlSZWdWYWx1ZSB8PSBCSVQxMzsKKwl9CisKKwlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDICYmCisJCShpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfU0hBUkVfWkVSTykgKQorCQlSZWdWYWx1ZSB8PSBCSVQxMjsKKworCWlmICggaW5mby0+cGFyYW1zLmFkZHJfZmlsdGVyICE9IDB4ZmYgKQorCXsKKwkJLyogc2V0IHVwIHJlY2VpdmUgYWRkcmVzcyBmaWx0ZXJpbmcgKi8KKwkJdXNjX091dFJlZyggaW5mbywgUlNSLCBpbmZvLT5wYXJhbXMuYWRkcl9maWx0ZXIgKTsKKwkJUmVnVmFsdWUgfD0gQklUNDsKKwl9CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBDTVIsIFJlZ1ZhbHVlICk7CisJaW5mby0+Y21yX3ZhbHVlID0gUmVnVmFsdWU7CisKKwkvKiBSZWNlaXZlciBtb2RlIFJlZ2lzdGVyIChSTVIpCisJICoKKwkgKiA8MTUuLjEzPiAgMDAwICAgIGVuY29kaW5nCisJICogPDEyLi4xMT4gIDAwICAgICBGQ1MgPSAxNmJpdCBDUkMgQ0NJVFQgKHgxNSArIHgxMiArIHg1ICsgMSkKKwkgKiA8MTA+ICAgICAgMSAgICAgIDEgPSBTZXQgQ1JDIHRvIGFsbCAxcyAodXNlIGZvciBTRExDL0hETEMpCisJICogPDk+ICAgICAgIDAgICAgICAxID0gSW5jbHVkZSBSZWNlaXZlIGNoYXJzIGluIENSQworCSAqIDw4PiAgICAgICAxICAgICAgMSA9IFVzZSBBYm9ydC9QRSBiaXQgYXMgYWJvcnQgaW5kaWNhdG9yCisJICogPDcuLjY+ICAgIDAwICAgICBFdmVuIHBhcml0eQorCSAqIDw1PiAgICAgICAwICAgICAgcGFyaXR5IGRpc2FibGVkCisJICogPDQuLjI+ICAgIDAwMCAgICBSZWNlaXZlIENoYXIgTGVuZ3RoID0gOCBiaXRzCisJICogPDEuLjA+ICAgIDAwICAgICBEaXNhYmxlIFJlY2VpdmVyCisJICoKKwkgKiAwMDAwIDAxMDEgMDAwMCAwMDAwID0gMHgwNTAwCisJICovCisKKwlSZWdWYWx1ZSA9IDB4MDUwMDsKKworCXN3aXRjaCAoIGluZm8tPnBhcmFtcy5lbmNvZGluZyApIHsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaQjogICAgICAgICAgICAgICBSZWdWYWx1ZSB8PSBCSVQxMzsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX05SWklfTUFSSzogICAgICAgICAgUmVnVmFsdWUgfD0gQklUMTQ7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19OUlpJX1NQQUNFOgkgICAgICAgUmVnVmFsdWUgfD0gQklUMTQgKyBCSVQxMzsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSzogICAgICAgUmVnVmFsdWUgfD0gQklUMTU7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOiAgICAgIFJlZ1ZhbHVlIHw9IEJJVDE1ICsgQklUMTM7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMOiAgICAgIFJlZ1ZhbHVlIHw9IEJJVDE1ICsgQklUMTQ7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19ESUZGX0JJUEhBU0VfTEVWRUw6IFJlZ1ZhbHVlIHw9IEJJVDE1ICsgQklUMTQgKyBCSVQxMzsgYnJlYWs7CisJfQorCisJaWYgKCAoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfTUFTSykgPT0gSERMQ19DUkNfMTZfQ0NJVFQgKQorCQlSZWdWYWx1ZSB8PSBCSVQ5OworCWVsc2UgaWYgKCAoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfTUFTSykgPT0gSERMQ19DUkNfMzJfQ0NJVFQgKQorCQlSZWdWYWx1ZSB8PSAoIEJJVDEyIHwgQklUMTAgfCBCSVQ5ICk7CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBSTVIsIFJlZ1ZhbHVlICk7CisKKwkvKiBTZXQgdGhlIFJlY2VpdmUgY291bnQgTGltaXQgUmVnaXN0ZXIgKFJDTFIpIHRvIDB4ZmZmZi4gKi8KKwkvKiBXaGVuIGFuIG9wZW5pbmcgZmxhZyBvZiBhbiBTRExDIGZyYW1lIGlzIHJlY29nbml6ZWQgdGhlICovCisJLyogUmVjZWl2ZSBDaGFyYWN0ZXIgY291bnQgKFJDQykgaXMgbG9hZGVkIHdpdGggdGhlIHZhbHVlIGluICovCisJLyogUkNMUi4gVGhlIFJDQyBpcyBkZWNyZW1lbnRlZCBmb3IgZWFjaCByZWNlaXZlZCBieXRlLiAgVGhlICovCisJLyogdmFsdWUgb2YgUkNDIGlzIHN0b3JlZCBhZnRlciB0aGUgY2xvc2luZyBmbGFnIG9mIHRoZSBmcmFtZSAqLworCS8qIGFsbG93aW5nIHRoZSBmcmFtZSBzaXplIHRvIGJlIGNvbXB1dGVkLiAqLworCisJdXNjX091dFJlZyggaW5mbywgUkNMUiwgUkNMUlZBTFVFICk7CisKKwl1c2NfUkNtZCggaW5mbywgUkNtZF9TZWxlY3RSaWNyZG1hX2xldmVsICk7CisKKwkvKiBSZWNlaXZlIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChSSUNSKQorCSAqCisJICogPDE1Li44Pgk/CVJ4RklGTyBETUEgUmVxdWVzdCBMZXZlbAorCSAqIDw3PgkJMAlFeGl0ZWQgSHVudCBJQSAoSW50ZXJydXB0IEFybSkKKwkgKiA8Nj4JCTAJSWRsZSBSZWNlaXZlZCBJQQorCSAqIDw1PgkJMAlCcmVhay9BYm9ydCBJQQorCSAqIDw0PgkJMAlSeCBCb3VuZCBJQQorCSAqIDwzPgkJMQlRdWV1ZWQgc3RhdHVzIHJlZmxlY3RzIG9sZGVzdCAyIGJ5dGVzIGluIEZJRk8KKwkgKiA8Mj4JCTAJQWJvcnQvUEUgSUEKKwkgKiA8MT4JCTEJUnggT3ZlcnJ1biBJQQorCSAqIDwwPgkJMAlTZWxlY3QgVEMwIHZhbHVlIGZvciByZWFkYmFjaworCSAqCisJICoJMDAwMCAwMDAwIDAwMDAgMTAwMCA9IDB4MDAwYQorCSAqLworCisJLyogQ2Fycnkgb3ZlciB0aGUgRXhpdCBIdW50IGFuZCBJZGxlIFJlY2VpdmVkIGJpdHMgKi8KKwkvKiBpbiBjYXNlIHRoZXkgaGF2ZSBiZWVuIGFybWVkIGJ5IHVzY19Bcm1FdmVudHMuICAgKi8KKworCVJlZ1ZhbHVlID0gdXNjX0luUmVnKCBpbmZvLCBSSUNSICkgJiAweGMwOworCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCXVzY19PdXRSZWcoIGluZm8sIFJJQ1IsICh1MTYpKDB4MDMwYSB8IFJlZ1ZhbHVlKSApOworCWVsc2UKKwkJdXNjX091dFJlZyggaW5mbywgUklDUiwgKHUxNikoMHgxNDBhIHwgUmVnVmFsdWUpICk7CisKKwkvKiBVbmxhdGNoIGFsbCBSeCBzdGF0dXMgYml0cyBhbmQgY2xlYXIgUnggc3RhdHVzIElSUSBQZW5kaW5nICovCisKKwl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyggaW5mbywgUlhTVEFUVVNfQUxMICk7CisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFJFQ0VJVkVfU1RBVFVTICk7CisKKwkvKiBUcmFuc21pdCBtb2RlIFJlZ2lzdGVyIChUTVIpCisJICoJCisJICogPDE1Li4xMz4JMDAwCWVuY29kaW5nCisJICogPDEyLi4xMT4JMDAJRkNTID0gMTZiaXQgQ1JDIENDSVRUICh4MTUgKyB4MTIgKyB4NSArIDEpCisJICogPDEwPgkJMQkxID0gU3RhcnQgQ1JDIGFzIGFsbCAxcyAodXNlIGZvciBTRExDL0hETEMpCisJICogPDk+CQkwCTEgPSBUeCBDUkMgRW5hYmxlZAorCSAqIDw4PgkJMAkxID0gQXBwZW5kIENSQyB0byBlbmQgb2YgdHJhbnNtaXQgZnJhbWUKKwkgKiA8Ny4uNj4JMDAJVHJhbnNtaXQgcGFyaXR5IEV2ZW4KKwkgKiA8NT4JCTAJVHJhbnNtaXQgcGFyaXR5IERpc2FibGVkCisJICogPDQuLjI+CTAwMAlUeCBDaGFyIExlbmd0aCA9IDggYml0cworCSAqIDwxLi4wPgkwMAlEaXNhYmxlIFRyYW5zbWl0dGVyCisJICoKKwkgKiAJMDAwMCAwMTAwIDAwMDAgMDAwMCA9IDB4MDQwMAorCSAqLworCisJUmVnVmFsdWUgPSAweDA0MDA7CisKKwlzd2l0Y2ggKCBpbmZvLT5wYXJhbXMuZW5jb2RpbmcgKSB7CisJY2FzZSBIRExDX0VOQ09ESU5HX05SWkI6ICAgICAgICAgICAgICAgUmVnVmFsdWUgfD0gQklUMTM7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19OUlpJX01BUks6ICAgICAgICAgIFJlZ1ZhbHVlIHw9IEJJVDE0OyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSV9TUEFDRTogICAgICAgICBSZWdWYWx1ZSB8PSBCSVQxNCArIEJJVDEzOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOiAgICAgICBSZWdWYWx1ZSB8PSBCSVQxNTsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U6ICAgICAgUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxMzsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6ICAgICAgUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxNDsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxNCArIEJJVDEzOyBicmVhazsKKwl9CisKKwlpZiAoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKSA9PSBIRExDX0NSQ18xNl9DQ0lUVCApCisJCVJlZ1ZhbHVlIHw9IEJJVDkgKyBCSVQ4OworCWVsc2UgaWYgKCAoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfTUFTSykgPT0gSERMQ19DUkNfMzJfQ0NJVFQgKQorCQlSZWdWYWx1ZSB8PSAoIEJJVDEyIHwgQklUMTAgfCBCSVQ5IHwgQklUOCk7CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBUTVIsIFJlZ1ZhbHVlICk7CisKKwl1c2Nfc2V0X3R4aWRsZSggaW5mbyApOworCisKKwl1c2NfVENtZCggaW5mbywgVENtZF9TZWxlY3RUaWNyZG1hX2xldmVsICk7CisKKwkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAoVElDUikKKwkgKgorCSAqIDwxNS4uOD4JPwlUcmFuc21pdCBGSUZPIERNQSBMZXZlbAorCSAqIDw3PgkJMAlQcmVzZW50IElBIChJbnRlcnJ1cHQgQXJtKQorCSAqIDw2PgkJMAlJZGxlIFNlbnQgSUEKKwkgKiA8NT4JCTEJQWJvcnQgU2VudCBJQQorCSAqIDw0PgkJMQlFT0YvRU9NIFNlbnQgSUEKKwkgKiA8Mz4JCTAJQ1JDIFNlbnQgSUEKKwkgKiA8Mj4JCTEJMSA9IFdhaXQgZm9yIFNXIFRyaWdnZXIgdG8gU3RhcnQgRnJhbWUKKwkgKiA8MT4JCTEJVHggVW5kZXJydW4gSUEKKwkgKiA8MD4JCTAJVEMwIGNvbnN0YW50IG9uIHJlYWQgYmFjaworCSAqCisJICoJMDAwMCAwMDAwIDAwMTEgMDExMCA9IDB4MDAzNgorCSAqLworCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCXVzY19PdXRSZWcoIGluZm8sIFRJQ1IsIDB4MDczNiApOworCWVsc2UJCQkJCQkJCQorCQl1c2NfT3V0UmVnKCBpbmZvLCBUSUNSLCAweDE0MzYgKTsKKworCXVzY19VbmxhdGNoVHhzdGF0dXNCaXRzKCBpbmZvLCBUWFNUQVRVU19BTEwgKTsKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgVFJBTlNNSVRfU1RBVFVTICk7CisKKwkvKgorCSoqIFRyYW5zbWl0IENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIChUQ1NSKQorCSoqCisJKiogPDE1Li4xMj4JMDAwMAlUQ21kCisJKiogPDExPiAJMC8xCVVuZGVyV2FpdAorCSoqIDwxMC4uMDg+CTAwMAlUeElkbGUKKwkqKiA8Nz4JCXgJUHJlU2VudAorCSoqIDw2PiAgICAgICAgIAl4CUlkbGVTZW50CisJKiogPDU+ICAgICAgICAgCXgJQWJvcnRTZW50CisJKiogPDQ+ICAgICAgICAgCXgJRU9GL0VPTSBTZW50CisJKiogPDM+ICAgICAgICAgCXgJQ1JDIFNlbnQKKwkqKiA8Mj4gICAgICAgICAJeAlBbGwgU2VudAorCSoqIDwxPiAgICAgICAgIAl4CVR4VW5kZXIKKwkqKiA8MD4gICAgICAgICAJeAlUeEVtcHR5CisJKiogCisJKiogMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MDAwMAorCSovCisJaW5mby0+dGNzcl92YWx1ZSA9IDA7CisKKwlpZiAoICFQcmVTTDE2NjAgKQorCQlpbmZvLT50Y3NyX3ZhbHVlIHw9IFRDU1JfVU5ERVJXQUlUOworCQkKKwl1c2NfT3V0UmVnKCBpbmZvLCBUQ1NSLCBpbmZvLT50Y3NyX3ZhbHVlICk7CisKKwkvKiBDbG9jayBtb2RlIENvbnRyb2wgUmVnaXN0ZXIgKENNQ1IpCisJICoKKwkgKiA8MTUuLjE0PgkwMAljb3VudGVyIDEgU291cmNlID0gRGlzYWJsZWQKKwkgKiA8MTMuLjEyPiAJMDAJY291bnRlciAwIFNvdXJjZSA9IERpc2FibGVkCisJICogPDExLi4xMD4gCTExCUJSRzEgSW5wdXQgaXMgVHhDIFBpbgorCSAqIDw5Li44PgkxMQlCUkcwIElucHV0IGlzIFR4QyBQaW4KKwkgKiA8Ny4uNj4JMDEJRFBMTCBJbnB1dCBpcyBCUkcxIE91dHB1dAorCSAqIDw1Li4zPglYWFgJVHhDTEsgY29tZXMgZnJvbSBQb3J0IDAKKwkgKiA8Mi4uMD4gICAJWFhYCVJ4Q0xLIGNvbWVzIGZyb20gUG9ydCAxCisJICoKKwkgKgkwMDAwIDExMTEgMDExMSAwMTExID0gMHgwZjc3CisJICovCisKKwlSZWdWYWx1ZSA9IDB4MGY0MDsKKworCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19EUExMICkKKwkJUmVnVmFsdWUgfD0gMHgwMDAzOwkvKiBSeENMSyBmcm9tIERQTEwgKi8KKwllbHNlIGlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19CUkcgKQorCQlSZWdWYWx1ZSB8PSAweDAwMDQ7CS8qIFJ4Q0xLIGZyb20gQlJHMCAqLworIAllbHNlIGlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19UWENQSU4pCisgCQlSZWdWYWx1ZSB8PSAweDAwMDY7CS8qIFJ4Q0xLIGZyb20gVFhDIElucHV0ICovCisJZWxzZQorCQlSZWdWYWx1ZSB8PSAweDAwMDc7CS8qIFJ4Q0xLIGZyb20gUG9ydDEgKi8KKworCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19EUExMICkKKwkJUmVnVmFsdWUgfD0gMHgwMDE4OwkvKiBUeENMSyBmcm9tIERQTEwgKi8KKwllbHNlIGlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19CUkcgKQorCQlSZWdWYWx1ZSB8PSAweDAwMjA7CS8qIFR4Q0xLIGZyb20gQlJHMCAqLworIAllbHNlIGlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19SWENQSU4pCisgCQlSZWdWYWx1ZSB8PSAweDAwMzg7CS8qIFJ4Q0xLIGZyb20gVFhDIElucHV0ICovCisJZWxzZQorCQlSZWdWYWx1ZSB8PSAweDAwMzA7CS8qIFR4Q0xLIGZyb20gUG9ydDAgKi8KKworCXVzY19PdXRSZWcoIGluZm8sIENNQ1IsIFJlZ1ZhbHVlICk7CisKKworCS8qIEhhcmR3YXJlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEhDUikKKwkgKgorCSAqIDwxNS4uMTQ+CTAwCUNUUjAgRGl2aXNvcjowMD0zMiwwMT0xNiwxMD04LDExPTQKKwkgKiA8MTM+CQkwCUNUUjFEU2VsOjA9Q1RSMERpdiBkZXRlcm1pbmVzIENUUjBEaXYKKwkgKiA8MTI+CQkwCUNWT0s6MD1yZXBvcnQgY29kZSB2aW9sYXRpb24gaW4gYmlwaGFzZQorCSAqIDwxMS4uMTA+CTAwCURQTEwgRGl2aXNvcjowMD0zMiwwMT0xNiwxMD04LDExPTQKKwkgKiA8OS4uOD4JWFgJRFBMTCBtb2RlOjAwPWRpc2FibGUsMDE9TlJaLDEwPUJpcGhhc2UsMTE9QmlwaGFzZSBMZXZlbAorCSAqIDw3Li42PgkwMAlyZXNlcnZlZAorCSAqIDw1PgkJMAlCUkcxIG1vZGU6MD1jb250aW51b3VzLDE9c2luZ2xlIGN5Y2xlCisJICogPDQ+CQlYCUJSRzEgRW5hYmxlCisJICogPDMuLjI+CTAwCXJlc2VydmVkCisJICogPDE+CQkwCUJSRzAgbW9kZTowPWNvbnRpbnVvdXMsMT1zaW5nbGUgY3ljbGUKKwkgKiA8MD4JCTAJQlJHMCBFbmFibGUKKwkgKi8KKworCVJlZ1ZhbHVlID0gMHgwMDAwOworCisJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiAoSERMQ19GTEFHX1JYQ19EUExMICsgSERMQ19GTEFHX1RYQ19EUExMKSApIHsKKwkJdTMyIFh0YWxTcGVlZDsKKwkJdTMyIERwbGxEaXZpc29yOworCQl1MTYgVGM7CisKKwkJLyogIERQTEwgaXMgZW5hYmxlZC4gVXNlIEJSRzEgdG8gcHJvdmlkZSBjb250aW51b3VzIHJlZmVyZW5jZSBjbG9jayAgKi8KKwkJLyogIGZvciBEUExMLiBEUExMIG1vZGUgaW4gSENSIGlzIGRlcGVuZGVudCBvbiB0aGUgZW5jb2RpbmcgdXNlZC4gKi8KKworCQlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJCVh0YWxTcGVlZCA9IDExMDU5MjAwOworCQllbHNlCisJCQlYdGFsU3BlZWQgPSAxNDc0NTYwMDsKKworCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19EUExMX0RJVjE2ICkgeworCQkJRHBsbERpdmlzb3IgPSAxNjsKKwkJCVJlZ1ZhbHVlIHw9IEJJVDEwOworCQl9CisJCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfRFBMTF9ESVY4ICkgeworCQkJRHBsbERpdmlzb3IgPSA4OworCQkJUmVnVmFsdWUgfD0gQklUMTE7CisJCX0KKwkJZWxzZQorCQkJRHBsbERpdmlzb3IgPSAzMjsKKworCQkvKiAgVGMgPSAoWHRhbC9TcGVlZCkgLSAxICovCisJCS8qICBJZiB0d2ljZSB0aGUgcmVtYWluZGVyIG9mIChYdGFsL1NwZWVkKSBpcyBncmVhdGVyIHRoYW4gU3BlZWQgKi8KKwkJLyogIHRoZW4gcm91bmRpbmcgdXAgZ2l2ZXMgYSBtb3JlIHByZWNpc2UgdGltZSBjb25zdGFudC4gSW5zdGVhZCAqLworCQkvKiAgb2Ygcm91bmRpbmcgdXAgYW5kIHRoZW4gc3VidHJhY3RpbmcgMSB3ZSBqdXN0IGRvbid0IHN1YnRyYWN0ICovCisJCS8qICB0aGUgb25lIGluIHRoaXMgY2FzZS4gKi8KKworIAkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIAkJICogZWp6OiBmb3IgRFBMTCBtb2RlLCBhcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoZQorIAkJICogc2FtZSBjbG9jayBzcGVlZCBhcyB0aGUgcGFydG5lciBzeXN0ZW0sIGV2ZW4gCisgCQkgKiB0aG91Z2ggY2xvY2tpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBpbnB1dCBSeERhdGEuCisgCQkgKiBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgYSAwIGZvciB0aGUgY2xvY2sgc3BlZWQsCisgCQkgKiBkZWZhdWx0IHRvIDB4ZmZmZmZmZmYgYW5kIGRvbid0IHRyeSB0byBkaXZpZGUgYnkKKyAJCSAqIHplcm8KKyAJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIAkJaWYgKCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgKQorIAkJeworCQkJVGMgPSAodTE2KSgoWHRhbFNwZWVkL0RwbGxEaXZpc29yKS9pbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpOworCQkJaWYgKCAhKCgoKFh0YWxTcGVlZC9EcGxsRGl2aXNvcikgJSBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpICogMikKKwkJCSAgICAgICAvIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCkgKQorCQkJCVRjLS07CisgCQl9CisgCQllbHNlCisgCQkJVGMgPSAtMTsKKyAJCQkJICAKKworCQkvKiBXcml0ZSAxNi1iaXQgVGltZSBDb25zdGFudCBmb3IgQlJHMSAqLworCQl1c2NfT3V0UmVnKCBpbmZvLCBUQzFSLCBUYyApOworCisJCVJlZ1ZhbHVlIHw9IEJJVDQ7CQkvKiBlbmFibGUgQlJHMSAqLworCisJCXN3aXRjaCAoIGluZm8tPnBhcmFtcy5lbmNvZGluZyApIHsKKwkJY2FzZSBIRExDX0VOQ09ESU5HX05SWjoKKwkJY2FzZSBIRExDX0VOQ09ESU5HX05SWkI6CisJCWNhc2UgSERMQ19FTkNPRElOR19OUlpJX01BUks6CisJCWNhc2UgSERMQ19FTkNPRElOR19OUlpJX1NQQUNFOiBSZWdWYWx1ZSB8PSBCSVQ4OyBicmVhazsKKwkJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSzoKKwkJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U6IFJlZ1ZhbHVlIHw9IEJJVDk7IGJyZWFrOworCQljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDoKKwkJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogUmVnVmFsdWUgfD0gQklUOSArIEJJVDg7IGJyZWFrOworCQl9CisJfQorCisJdXNjX091dFJlZyggaW5mbywgSENSLCBSZWdWYWx1ZSApOworCisKKwkvKiBDaGFubmVsIENvbnRyb2wvc3RhdHVzIFJlZ2lzdGVyIChDQ1NSKQorCSAqCisJICogPDE1PgkJWAlSQ0MgRklGTyBPdmVyZmxvdyBzdGF0dXMgKFJPKQorCSAqIDwxND4JCVgJUkNDIEZJRk8gTm90IEVtcHR5IHN0YXR1cyAoUk8pCisJICogPDEzPgkJMAkxID0gQ2xlYXIgUkNDIEZJRk8gKFdPKQorCSAqIDwxMj4JCVgJRFBMTCBTeW5jIChSVykKKwkgKiA8MTE+CQlYCURQTEwgMiBNaXNzZWQgQ2xvY2tzIHN0YXR1cyAoUk8pCisJICogPDEwPgkJWAlEUExMIDEgTWlzc2VkIENsb2NrIHN0YXR1cyAoUk8pCisJICogPDkuLjg+CTAwCURQTEwgUmVzeW5jIG9uIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAoUlcpCisJICogPDc+CQlYCVNETEMgTG9vcCBPbiBzdGF0dXMgKFJPKQorCSAqIDw2PgkJWAlTRExDIExvb3AgU2VuZCBzdGF0dXMgKFJPKQorCSAqIDw1PgkJMQlCeXBhc3MgY291bnRlcnMgZm9yIFR4Q2xrIGFuZCBSeENsayAoUlcpCisJICogPDQuLjI+ICAgCTAwMAlMYXN0IENoYXIgb2YgU0RMQyBmcmFtZSBoYXMgOCBiaXRzIChSVykKKwkgKiA8MS4uMD4gICAJMDAJcmVzZXJ2ZWQKKwkgKgorCSAqCTAwMDAgMDAwMCAwMDEwIDAwMDAgPSAweDAwMjAKKwkgKi8KKworCXVzY19PdXRSZWcoIGluZm8sIENDU1IsIDB4MTAyMCApOworCisKKwlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0NUUyApIHsKKwkJdXNjX091dFJlZyggaW5mbywgU0lDUiwKKwkJCSAgICAodTE2KSh1c2NfSW5SZWcoaW5mbyxTSUNSKSB8IFNJQ1JfQ1RTX0lOQUNUSVZFKSApOworCX0KKwkKKworCS8qIGVuYWJsZSBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSBiaXQgKE1JRSkgKi8KKwl1c2NfRW5hYmxlTWFzdGVySXJxQml0KCBpbmZvICk7CisKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgUkVDRUlWRV9TVEFUVVMgKyBSRUNFSVZFX0RBVEEgKworCQkJCVRSQU5TTUlUX1NUQVRVUyArIFRSQU5TTUlUX0RBVEEgKyBNSVNDKTsKKworCS8qIGFybSBSQ0MgdW5kZXJmbG93IGludGVycnVwdCAqLworCXVzY19PdXRSZWcoaW5mbywgU0lDUiwgKHUxNikodXNjX0luUmVnKGluZm8sU0lDUikgfCBCSVQzKSk7CisJdXNjX0VuYWJsZUludGVycnVwdHMoaW5mbywgTUlTQyk7CisKKwlpbmZvLT5tYnJlX2JpdCA9IDA7CisJb3V0dyggMCwgaW5mby0+aW9fYmFzZSApOyAJCQkvKiBjbGVhciBNYXN0ZXIgQnVzIEVuYWJsZSAoRENBUikgKi8KKwl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfUmVzZXRBbGxDaGFubmVscyApOwkvKiBkaXNhYmxlIGJvdGggRE1BIGNoYW5uZWxzICovCisJaW5mby0+bWJyZV9iaXQgPSBCSVQ4OworCW91dHcoIEJJVDgsIGluZm8tPmlvX2Jhc2UgKTsJCQkvKiBzZXQgTWFzdGVyIEJ1cyBFbmFibGUgKERDQVIpICovCisKKwlpZiAoaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9JU0EpIHsKKwkJLyogRW5hYmxlIERNQUVOIChQb3J0IDcsIEJpdCAxNCkgKi8KKwkJLyogVGhpcyBjb25uZWN0cyB0aGUgRE1BIHJlcXVlc3Qgc2lnbmFsIHRvIHRoZSBJU0EgYnVzICovCisJCXVzY19PdXRSZWcoaW5mbywgUENSLCAodTE2KSgodXNjX0luUmVnKGluZm8sIFBDUikgfCBCSVQxNSkgJiB+QklUMTQpKTsKKwl9CisKKwkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAoRENSKQorCSAqCisJICogPDE1Li4xND4JMTAJUHJpb3JpdHkgbW9kZSA9IEFsdGVybmF0aW5nIFR4L1J4CisJICoJCTAxCVJ4IGhhcyBwcmlvcml0eQorCSAqCQkwMAlUeCBoYXMgcHJpb3JpdHkKKwkgKgorCSAqIDwxMz4JCTEJRW5hYmxlIFByaW9yaXR5IFByZWVtcHQgcGVyIERDUjwxNS4uMTQ+CisJICoJCQkoV0FSTklORyBEQ1I8MTEuLjEwPiBtdXN0IGJlIDAwIHdoZW4gdGhpcyBpcyAxKQorCSAqCQkwCUNob29zZSBhY3RpdmF0ZSBjaGFubmVsIHBlciBEQ1I8MTEuLjEwPgorCSAqCisJICogPDEyPgkJMAlMaXR0bGUgRW5kaWFuIGZvciBBcnJheS9MaXN0CisJICogPDExLi4xMD4JMDAJQm90aCBDaGFubmVscyBjYW4gdXNlIGVhY2ggYnVzIGdyYW50CisJICogPDkuLjY+CTAwMDAJcmVzZXJ2ZWQKKwkgKiA8NT4JCTAJNyBDTEsgLSBNaW5pbXVtIEJ1cyBSZS1yZXF1ZXN0IEludGVydmFsCisJICogPDQ+CQkwCTEgPSBkcml2ZSBEL0MgYW5kIFMvRCBwaW5zCisJICogPDM+CQkxCTEgPSBBZGQgb25lIHdhaXQgc3RhdGUgdG8gYWxsIERNQSBjeWNsZXMuCisJICogPDI+CQkwCTEgPSBTdHJvYmUgL1VBUyBvbiBldmVyeSB0cmFuc2Zlci4KKwkgKiA8MS4uMD4JMTEJQWRkciBpbmNyZW1lbnRpbmcgb25seSBhZmZlY3RzIExTMjQgYml0cworCSAqCisJICoJMDExMCAwMDAwIDAwMDAgMTAxMSA9IDB4NjAwYgorCSAqLworCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApIHsKKwkJLyogUENJIGFkYXB0ZXIgZG9lcyBub3QgbmVlZCBETUEgd2FpdCBzdGF0ZSAqLworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBEQ1IsIDB4YTAwYiApOworCX0KKwllbHNlCisJCXVzY19PdXREbWFSZWcoIGluZm8sIERDUiwgMHg4MDBiICk7CisKKworCS8qIFJlY2VpdmUgRE1BIG1vZGUgUmVnaXN0ZXIgKFJETVIpCisJICoKKwkgKiA8MTUuLjE0PgkxMQlETUEgbW9kZSA9IExpbmtlZCBMaXN0IEJ1ZmZlciBtb2RlCisJICogPDEzPgkJMQlSU0JpbkEvTCA9IHN0b3JlIFJ4IHN0YXR1cyBCbG9jayBpbiBBcnJhcnkvTGlzdCBlbnRyeQorCSAqIDwxMj4JCTEJQ2xlYXIgY291bnQgb2YgTGlzdCBFbnRyeSBhZnRlciBmZXRjaGluZworCSAqIDwxMS4uMTA+CTAwCUFkZHJlc3MgbW9kZSA9IEluY3JlbWVudAorCSAqIDw5PgkJMQlUZXJtaW5hdGUgQnVmZmVyIG9uIFJ4Qm91bmQKKwkgKiA8OD4JCTAJQnVzIFdpZHRoID0gMTZiaXRzCisJICogPDcuLjA+CT8Jc3RhdHVzIEJpdHMgKHdyaXRlIGFzIDBzKQorCSAqCisJICogMTExMSAwMDEwIDAwMDAgMDAwMCA9IDB4ZjIwMAorCSAqLworCisJdXNjX091dERtYVJlZyggaW5mbywgUkRNUiwgMHhmMjAwICk7CisKKworCS8qIFRyYW5zbWl0IERNQSBtb2RlIFJlZ2lzdGVyIChURE1SKQorCSAqCisJICogPDE1Li4xND4JMTEJRE1BIG1vZGUgPSBMaW5rZWQgTGlzdCBCdWZmZXIgbW9kZQorCSAqIDwxMz4JCTEJVENCaW5BL0wgPSBmZXRjaCBUeCBDb250cm9sIEJsb2NrIGZyb20gTGlzdCBlbnRyeQorCSAqIDwxMj4JCTEJQ2xlYXIgY291bnQgb2YgTGlzdCBFbnRyeSBhZnRlciBmZXRjaGluZworCSAqIDwxMS4uMTA+CTAwCUFkZHJlc3MgbW9kZSA9IEluY3JlbWVudAorCSAqIDw5PgkJMQlUZXJtaW5hdGUgQnVmZmVyIG9uIGVuZCBvZiBmcmFtZQorCSAqIDw4PgkJMAlCdXMgV2lkdGggPSAxNmJpdHMKKwkgKiA8Ny4uMD4JPwlzdGF0dXMgQml0cyAoUmVhZCBPbmx5IHNvIHdyaXRlIGFzIDApCisJICoKKwkgKgkxMTExIDAwMTAgMDAwMCAwMDAwID0gMHhmMjAwCisJICovCisKKwl1c2NfT3V0RG1hUmVnKCBpbmZvLCBURE1SLCAweGYyMDAgKTsKKworCisJLyogRE1BIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChESUNSKQorCSAqCisJICogPDE1PgkJMQlETUEgSW50ZXJydXB0IEVuYWJsZQorCSAqIDwxND4JCTAJMSA9IERpc2FibGUgSUVPIGZyb20gVVNDCisJICogPDEzPgkJMAkxID0gRG9uJ3QgcHJvdmlkZSB2ZWN0b3IgZHVyaW5nIEludEFjaworCSAqIDwxMj4JCTEJMSA9IEluY2x1ZGUgc3RhdHVzIGluIFZlY3RvcgorCSAqIDwxMC4uMj4JMAlyZXNlcnZlZCwgTXVzdCBiZSAwcworCSAqIDwxPgkJMAkxID0gUnggRE1BIEludGVycnVwdCBFbmFibGVkCisJICogPDA+CQkwCTEgPSBUeCBETUEgSW50ZXJydXB0IEVuYWJsZWQKKwkgKgorCSAqCTEwMDEgMDAwMCAwMDAwIDAwMDAgPSAweDkwMDAKKwkgKi8KKworCXVzY19PdXREbWFSZWcoIGluZm8sIERJQ1IsIDB4OTAwMCApOworCisJdXNjX0luRG1hUmVnKCBpbmZvLCBSRE1SICk7CQkvKiBjbGVhciBwZW5kaW5nIHJlY2VpdmUgRE1BIElSUSBiaXRzICovCisJdXNjX0luRG1hUmVnKCBpbmZvLCBURE1SICk7CQkvKiBjbGVhciBwZW5kaW5nIHRyYW5zbWl0IERNQSBJUlEgYml0cyAqLworCXVzY19PdXREbWFSZWcoIGluZm8sIENESVIsIDB4MDMwMyApOwkvKiBjbGVhciBJVVMgYW5kIFBlbmRpbmcgZm9yIFR4IGFuZCBSeCAqLworCisJLyogQ2hhbm5lbCBDb250cm9sIFJlZ2lzdGVyIChDQ1IpCisJICoKKwkgKiA8MTUuLjE0PgkxMAlVc2UgMzItYml0IFR4IENvbnRyb2wgQmxvY2tzIChUQ0JzKQorCSAqIDwxMz4JCTAJVHJpZ2dlciBUeCBvbiBTVyBDb21tYW5kIERpc2FibGVkCisJICogPDEyPgkJMAlGbGFnIFByZWFtYmxlIERpc2FibGVkCisJICogPDExLi4xMD4JMDAJUHJlYW1ibGUgTGVuZ3RoCisJICogPDkuLjg+CTAwCVByZWFtYmxlIFBhdHRlcm4KKwkgKiA8Ny4uNj4JMTAJVXNlIDMyLWJpdCBSeCBzdGF0dXMgQmxvY2tzIChSU0JzKQorCSAqIDw1PgkJMAlUcmlnZ2VyIFJ4IG9uIFNXIENvbW1hbmQgRGlzYWJsZWQKKwkgKiA8NC4uMD4JMAlyZXNlcnZlZAorCSAqCisJICoJMTAwMCAwMDAwIDEwMDAgMDAwMCA9IDB4ODA4MAorCSAqLworCisJUmVnVmFsdWUgPSAweDgwODA7CisKKwlzd2l0Y2ggKCBpbmZvLT5wYXJhbXMucHJlYW1ibGVfbGVuZ3RoICkgeworCWNhc2UgSERMQ19QUkVBTUJMRV9MRU5HVEhfMTZCSVRTOiBSZWdWYWx1ZSB8PSBCSVQxMDsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX0xFTkdUSF8zMkJJVFM6IFJlZ1ZhbHVlIHw9IEJJVDExOyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfTEVOR1RIXzY0QklUUzogUmVnVmFsdWUgfD0gQklUMTEgKyBCSVQxMDsgYnJlYWs7CisJfQorCisJc3dpdGNoICggaW5mby0+cGFyYW1zLnByZWFtYmxlICkgeworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX0ZMQUdTOiBSZWdWYWx1ZSB8PSBCSVQ4ICsgQklUMTI7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX09ORVM6ICBSZWdWYWx1ZSB8PSBCSVQ4OyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfUEFUVEVSTl8xMDogICAgUmVnVmFsdWUgfD0gQklUOTsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMDE6ICAgIFJlZ1ZhbHVlIHw9IEJJVDkgKyBCSVQ4OyBicmVhazsKKwl9CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBDQ1IsIFJlZ1ZhbHVlICk7CisKKworCS8qCisJICogQnVyc3QvRHdlbGwgQ29udHJvbCBSZWdpc3RlcgorCSAqCisJICogPDE1Li44PgkweDIwCU1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVycyBwZXIgYnVzIGdyYW50CisJICogPDcuLjA+CTB4MDAJTWF4aW11bSBudW1iZXIgb2YgY2xvY2sgY3ljbGVzIHBlciBidXMgZ3JhbnQKKwkgKi8KKworCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKSB7CisJCS8qIGRvbid0IGxpbWl0IGJ1cyBvY2N1cGFuY3kgb24gUENJIGFkYXB0ZXIgKi8KKwkJdXNjX091dERtYVJlZyggaW5mbywgQkRDUiwgMHgwMDAwICk7CisJfQorCWVsc2UKKwkJdXNjX091dERtYVJlZyggaW5mbywgQkRDUiwgMHgyMDAwICk7CisKKwl1c2Nfc3RvcF90cmFuc21pdHRlcihpbmZvKTsKKwl1c2Nfc3RvcF9yZWNlaXZlcihpbmZvKTsKKwkKK30JLyogZW5kIG9mIHVzY19zZXRfc2RsY19tb2RlKCkgKi8KKworLyogdXNjX2VuYWJsZV9sb29wYmFjaygpCisgKgorICogU2V0IHRoZSAxNkMzMiBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZS4KKyAqIFRoZSBUeENMSyBhbmQgUnhDTEsgc2lnbmFscyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIEJSRzAgYW5kCisgKiB0aGUgVHhEIGlzIGxvb3BlZCBiYWNrIHRvIHRoZSBSeEQgaW50ZXJuYWxseS4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqCQkJZW5hYmxlCTEgPSBlbmFibGUgbG9vcGJhY2ssIDAgPSBkaXNhYmxlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX2VuYWJsZV9sb29wYmFjayhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQkvKiBibGFuayBleHRlcm5hbCBUWEQgb3V0cHV0ICovCisJCXVzY19PdXRSZWcoaW5mbyxJT0NSLHVzY19JblJlZyhpbmZvLElPQ1IpIHwgKEJJVDcrQklUNikpOworCQorCQkvKiBDbG9jayBtb2RlIENvbnRyb2wgUmVnaXN0ZXIgKENNQ1IpCisJCSAqCisJCSAqIDwxNS4uMTQ+CTAwCWNvdW50ZXIgMSBEaXNhYmxlZAorCQkgKiA8MTMuLjEyPiAJMDAJY291bnRlciAwIERpc2FibGVkCisJCSAqIDwxMS4uMTA+IAkxMQlCUkcxIElucHV0IGlzIFR4QyBQaW4KKwkJICogPDkuLjg+CTExCUJSRzAgSW5wdXQgaXMgVHhDIFBpbgorCQkgKiA8Ny4uNj4JMDEJRFBMTCBJbnB1dCBpcyBCUkcxIE91dHB1dAorCQkgKiA8NS4uMz4JMTAwCVR4Q0xLIGNvbWVzIGZyb20gQlJHMAorCQkgKiA8Mi4uMD4gICAJMTAwCVJ4Q0xLIGNvbWVzIGZyb20gQlJHMAorCQkgKgorCQkgKiAwMDAwIDExMTEgMDExMCAwMTAwID0gMHgwZjY0CisJCSAqLworCisJCXVzY19PdXRSZWcoIGluZm8sIENNQ1IsIDB4MGY2NCApOworCisJCS8qIFdyaXRlIDE2LWJpdCBUaW1lIENvbnN0YW50IGZvciBCUkcwICovCisJCS8qIHVzZSBjbG9jayBzcGVlZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgOCBmb3IgZGlhZ25vc3RpY3MgKi8KKwkJaWYgKGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCkgeworCQkJaWYgKGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJKQorCQkJCXVzY19PdXRSZWcoaW5mbywgVEMwUiwgKHUxNikoKDExMDU5MjAwL2luZm8tPnBhcmFtcy5jbG9ja19zcGVlZCktMSkpOworCQkJZWxzZQorCQkJCXVzY19PdXRSZWcoaW5mbywgVEMwUiwgKHUxNikoKDE0NzQ1NjAwL2luZm8tPnBhcmFtcy5jbG9ja19zcGVlZCktMSkpOworCQl9IGVsc2UKKwkJCXVzY19PdXRSZWcoaW5mbywgVEMwUiwgKHUxNik4KTsKKworCQkvKiBIYXJkd2FyZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChIQ1IpIENsZWFyIEJpdCAxLCBCUkcwCisJCSAgIG1vZGUgPSBDb250aW51b3VzIFNldCBCaXQgMCB0byBlbmFibGUgQlJHMC4gICovCisJCXVzY19PdXRSZWcoIGluZm8sIEhDUiwgKHUxNikoKHVzY19JblJlZyggaW5mbywgSENSICkgJiB+QklUMSkgfCBCSVQwKSApOworCisJCS8qIElucHV0L091dHB1dCBDb250cm9sIFJlZywgPDIuLjA+ID0gMTAwLCBEcml2ZSBSeEMgcGluIHdpdGggQlJHMCAqLworCQl1c2NfT3V0UmVnKGluZm8sIElPQ1IsICh1MTYpKCh1c2NfSW5SZWcoaW5mbywgSU9DUikgJiAweGZmZjgpIHwgMHgwMDA0KSk7CisKKwkJLyogc2V0IEludGVybmFsIERhdGEgbG9vcGJhY2sgbW9kZSAqLworCQlpbmZvLT5sb29wYmFja19iaXRzID0gMHgzMDA7CisJCW91dHcoIDB4MDMwMCwgaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKwl9IGVsc2UgeworCQkvKiBlbmFibGUgZXh0ZXJuYWwgVFhEIG91dHB1dCAqLworCQl1c2NfT3V0UmVnKGluZm8sSU9DUix1c2NfSW5SZWcoaW5mbyxJT0NSKSAmIH4oQklUNytCSVQ2KSk7CisJCisJCS8qIGNsZWFyIEludGVybmFsIERhdGEgbG9vcGJhY2sgbW9kZSAqLworCQlpbmZvLT5sb29wYmFja19iaXRzID0gMDsKKwkJb3V0dyggMCxpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCX0KKwkKK30JLyogZW5kIG9mIHVzY19lbmFibGVfbG9vcGJhY2soKSAqLworCisvKiB1c2NfZW5hYmxlX2F1eF9jbG9jaygpCisgKgorICogRW5hYmxlZCB0aGUgQVVYIGNsb2NrIG91dHB1dCBhdCB0aGUgc3BlY2lmaWVkIGZyZXF1ZW5jeS4KKyAqCisgKiBBcmd1bWVudHM6CisgKgorICoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgZXh0ZW5zaW9uCisgKglkYXRhX3JhdGUJZGF0YSByYXRlIG9mIGNsb2NrIGluIGJpdHMgcGVyIHNlY29uZAorICoJCQlBIGRhdGEgcmF0ZSBvZiAwIGRpc2FibGVzIHRoZSBBVVggY2xvY2suCisgKgorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19lbmFibGVfYXV4X2Nsb2NrKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUzMiBkYXRhX3JhdGUgKQoreworCXUzMiBYdGFsU3BlZWQ7CisJdTE2IFRjOworCisJaWYgKCBkYXRhX3JhdGUgKSB7CisJCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQkJWHRhbFNwZWVkID0gMTEwNTkyMDA7CisJCWVsc2UKKwkJCVh0YWxTcGVlZCA9IDE0NzQ1NjAwOworCisKKwkJLyogVGMgPSAoWHRhbC9TcGVlZCkgLSAxICovCisJCS8qIElmIHR3aWNlIHRoZSByZW1haW5kZXIgb2YgKFh0YWwvU3BlZWQpIGlzIGdyZWF0ZXIgdGhhbiBTcGVlZCAqLworCQkvKiB0aGVuIHJvdW5kaW5nIHVwIGdpdmVzIGEgbW9yZSBwcmVjaXNlIHRpbWUgY29uc3RhbnQuIEluc3RlYWQgKi8KKwkJLyogb2Ygcm91bmRpbmcgdXAgYW5kIHRoZW4gc3VidHJhY3RpbmcgMSB3ZSBqdXN0IGRvbid0IHN1YnRyYWN0ICovCisJCS8qIHRoZSBvbmUgaW4gdGhpcyBjYXNlLiAqLworCisKKwkJVGMgPSAodTE2KShYdGFsU3BlZWQvZGF0YV9yYXRlKTsKKwkJaWYgKCAhKCgoWHRhbFNwZWVkICUgZGF0YV9yYXRlKSAqIDIpIC8gZGF0YV9yYXRlKSApCisJCQlUYy0tOworCisJCS8qIFdyaXRlIDE2LWJpdCBUaW1lIENvbnN0YW50IGZvciBCUkcwICovCisJCXVzY19PdXRSZWcoIGluZm8sIFRDMFIsIFRjICk7CisKKwkJLyoKKwkJICogSGFyZHdhcmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSENSKQorCQkgKiBDbGVhciBCaXQgMSwgQlJHMCBtb2RlID0gQ29udGludW91cworCQkgKiBTZXQgQml0IDAgdG8gZW5hYmxlIEJSRzAuCisJCSAqLworCisJCXVzY19PdXRSZWcoIGluZm8sIEhDUiwgKHUxNikoKHVzY19JblJlZyggaW5mbywgSENSICkgJiB+QklUMSkgfCBCSVQwKSApOworCisJCS8qIElucHV0L091dHB1dCBDb250cm9sIFJlZywgPDIuLjA+ID0gMTAwLCBEcml2ZSBSeEMgcGluIHdpdGggQlJHMCAqLworCQl1c2NfT3V0UmVnKCBpbmZvLCBJT0NSLCAodTE2KSgodXNjX0luUmVnKGluZm8sIElPQ1IpICYgMHhmZmY4KSB8IDB4MDAwNCkgKTsKKwl9IGVsc2UgeworCQkvKiBkYXRhIHJhdGUgPT0gMCBzbyB0dXJuIG9mZiBCUkcwICovCisJCXVzY19PdXRSZWcoIGluZm8sIEhDUiwgKHUxNikodXNjX0luUmVnKCBpbmZvLCBIQ1IgKSAmIH5CSVQwKSApOworCX0KKworfQkvKiBlbmQgb2YgdXNjX2VuYWJsZV9hdXhfY2xvY2soKSAqLworCisvKgorICoKKyAqIHVzY19wcm9jZXNzX3J4b3ZlcnJ1bl9zeW5jKCkKKyAqCisgKgkJVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSByZWNlaXZlIG92ZXJydW4gYnkgcmVzZXR0aW5nIHRoZQorICoJCXJlY2VpdmUgRE1BIGJ1ZmZlcnMgYW5kIGlzc3VpbmcgYSBQdXJnZSBSeCBGSUZPIGNvbW1hbmQKKyAqCQl0byBhbGxvdyB0aGUgcmVjZWl2ZXIgdG8gY29udGludWUgcmVjZWl2aW5nLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBleHRlbnNpb24KKyAqCisgKiBSZXR1cm4gVmFsdWU6IE5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3Byb2Nlc3NfcnhvdmVycnVuX3N5bmMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaW50IHN0YXJ0X2luZGV4OworCWludCBlbmRfaW5kZXg7CisJaW50IGZyYW1lX3N0YXJ0X2luZGV4OworCWludCBzdGFydF9vZl9mcmFtZV9mb3VuZCA9IEZBTFNFOworCWludCBlbmRfb2ZfZnJhbWVfZm91bmQgPSBGQUxTRTsKKwlpbnQgcmVwcm9ncmFtX2RtYSA9IEZBTFNFOworCisJRE1BQlVGRkVSRU5UUlkgKmJ1ZmZlcl9saXN0ID0gaW5mby0+cnhfYnVmZmVyX2xpc3Q7CisJdTMyIHBoeXNfYWRkcjsKKworCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9QYXVzZVJ4Q2hhbm5lbCApOworCXVzY19SQ21kKCBpbmZvLCBSQ21kX0VudGVySHVudG1vZGUgKTsKKwl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlUnhGaWZvICk7CisKKwkvKiBDdXJyZW50UnhCdWZmZXIgcG9pbnRzIHRvIHRoZSAxc3QgYnVmZmVyIG9mIHRoZSBuZXh0ICovCisJLyogcG9zc2libHkgYXZhaWxhYmxlIHJlY2VpdmUgZnJhbWUuICovCisJCisJZnJhbWVfc3RhcnRfaW5kZXggPSBzdGFydF9pbmRleCA9IGVuZF9pbmRleCA9IGluZm8tPmN1cnJlbnRfcnhfYnVmZmVyOworCisJLyogU2VhcmNoIGZvciBhbiB1bmZpbmlzaGVkIHN0cmluZyBvZiBidWZmZXJzLiBUaGlzIG1lYW5zICovCisJLyogdGhhdCBhIHJlY2VpdmUgZnJhbWUgc3RhcnRlZCAoYXQgbGVhc3Qgb25lIGJ1ZmZlciB3aXRoICovCisJLyogY291bnQgc2V0IHRvIHplcm8pIGJ1dCB0aGVyZSBpcyBubyB0ZXJtaW5pdGluZyBidWZmZXIgKi8KKwkvKiAoc3RhdHVzIHNldCB0byBub24temVybykuICovCisKKwl3aGlsZSggIWJ1ZmZlcl9saXN0W2VuZF9pbmRleF0uY291bnQgKQorCXsKKwkJLyogQ291bnQgZmllbGQgaGFzIGJlZW4gcmVzZXQgdG8gemVybyBieSAxNkMzMi4gKi8KKwkJLyogVGhpcyBidWZmZXIgaXMgY3VycmVudGx5IGluIHVzZS4gKi8KKworCQlpZiAoICFzdGFydF9vZl9mcmFtZV9mb3VuZCApCisJCXsKKwkJCXN0YXJ0X29mX2ZyYW1lX2ZvdW5kID0gVFJVRTsKKwkJCWZyYW1lX3N0YXJ0X2luZGV4ID0gZW5kX2luZGV4OworCQkJZW5kX29mX2ZyYW1lX2ZvdW5kID0gRkFMU0U7CisJCX0KKworCQlpZiAoIGJ1ZmZlcl9saXN0W2VuZF9pbmRleF0uc3RhdHVzICkKKwkJeworCQkJLyogU3RhdHVzIGZpZWxkIGhhcyBiZWVuIHNldCBieSAxNkMzMi4gKi8KKwkJCS8qIFRoaXMgaXMgdGhlIGxhc3QgYnVmZmVyIG9mIGEgcmVjZWl2ZWQgZnJhbWUuICovCisKKwkJCS8qIFdlIHdhbnQgdG8gbGVhdmUgdGhlIGJ1ZmZlcnMgZm9yIHRoaXMgZnJhbWUgaW50YWN0LiAqLworCQkJLyogTW92ZSBvbiB0byBuZXh0IHBvc3NpYmxlIGZyYW1lLiAqLworCisJCQlzdGFydF9vZl9mcmFtZV9mb3VuZCA9IEZBTFNFOworCQkJZW5kX29mX2ZyYW1lX2ZvdW5kID0gVFJVRTsKKwkJfQorCisgIAkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciBlbnRyeSBpbiBsaW5rZWQgbGlzdCAqLworICAJCWVuZF9pbmRleCsrOworICAJCWlmICggZW5kX2luZGV4ID09IGluZm8tPnJ4X2J1ZmZlcl9jb3VudCApCisgIAkJCWVuZF9pbmRleCA9IDA7CisKKwkJaWYgKCBzdGFydF9pbmRleCA9PSBlbmRfaW5kZXggKQorCQl7CisJCQkvKiBUaGUgZW50aXJlIGxpc3QgaGFzIGJlZW4gc2VhcmNoZWQgd2l0aCBhbGwgQ291bnRzID09IDAgYW5kICovCisJCQkvKiBhbGwgU3RhdHVzID09IDAuIFRoZSByZWNlaXZlIGJ1ZmZlcnMgYXJlICovCisJCQkvKiBjb21wbGV0ZWx5IHNjcmV3ZWQsIHJlc2V0IGFsbCByZWNlaXZlIGJ1ZmZlcnMhICovCisJCQltZ3NsX3Jlc2V0X3J4X2RtYV9idWZmZXJzKCBpbmZvICk7CisJCQlmcmFtZV9zdGFydF9pbmRleCA9IDA7CisJCQlzdGFydF9vZl9mcmFtZV9mb3VuZCA9IEZBTFNFOworCQkJcmVwcm9ncmFtX2RtYSA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggc3RhcnRfb2ZfZnJhbWVfZm91bmQgJiYgIWVuZF9vZl9mcmFtZV9mb3VuZCApCisJeworCQkvKiBUaGVyZSBpcyBhbiB1bmZpbmlzaGVkIHN0cmluZyBvZiByZWNlaXZlIERNQSBidWZmZXJzICovCisJCS8qIGFzIGEgcmVzdWx0IG9mIHRoZSByZWNlaXZlciBvdmVycnVuLiAqLworCisJCS8qIFJlc2V0IHRoZSBidWZmZXJzIGZvciB0aGUgdW5maW5pc2hlZCBmcmFtZSAqLworCQkvKiBhbmQgcmVwcm9ncmFtIHRoZSByZWNlaXZlIERNQSBjb250cm9sbGVyIHRvIHN0YXJ0ICovCisJCS8qIGF0IHRoZSAxc3QgYnVmZmVyIG9mIHVuZmluaXNoZWQgZnJhbWUuICovCisKKwkJc3RhcnRfaW5kZXggPSBmcmFtZV9zdGFydF9pbmRleDsKKworCQlkbworCQl7CisJCQkqKCh1bnNpZ25lZCBsb25nICopJihpbmZvLT5yeF9idWZmZXJfbGlzdFtzdGFydF9pbmRleCsrXS5jb3VudCkpID0gRE1BQlVGRkVSU0laRTsKKworICAJCQkvKiBBZGp1c3QgaW5kZXggZm9yIHdyYXAgYXJvdW5kLiAqLworICAJCQlpZiAoIHN0YXJ0X2luZGV4ID09IGluZm8tPnJ4X2J1ZmZlcl9jb3VudCApCisgIAkJCQlzdGFydF9pbmRleCA9IDA7CisKKwkJfSB3aGlsZSggc3RhcnRfaW5kZXggIT0gZW5kX2luZGV4ICk7CisKKwkJcmVwcm9ncmFtX2RtYSA9IFRSVUU7CisJfQorCisJaWYgKCByZXByb2dyYW1fZG1hICkKKwl7CisJCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKGluZm8sUlhTVEFUVVNfQUxMKTsKKwkJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoaW5mbywgUkVDRUlWRV9EQVRBfFJFQ0VJVkVfU1RBVFVTKTsKKwkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoaW5mbywgUkVDRUlWRV9EQVRBfFJFQ0VJVkVfU1RBVFVTKTsKKwkJCisJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLERJU0FCTEVfVU5DT05ESVRJT05BTCk7CisJCQorCQkvKiBUaGlzIGVtcHRpZXMgdGhlIHJlY2VpdmUgRklGTyBhbmQgbG9hZHMgdGhlIFJDQyB3aXRoIFJDTFIgKi8KKwkJdXNjX091dFJlZyggaW5mbywgQ0NTUiwgKHUxNikodXNjX0luUmVnKGluZm8sQ0NTUikgfCBCSVQxMykgKTsKKworCQkvKiBwcm9ncmFtIDE2QzMyIHdpdGggcGh5c2ljYWwgYWRkcmVzcyBvZiAxc3QgRE1BIGJ1ZmZlciBlbnRyeSAqLworCQlwaHlzX2FkZHIgPSBpbmZvLT5yeF9idWZmZXJfbGlzdFtmcmFtZV9zdGFydF9pbmRleF0ucGh5c19lbnRyeTsKKwkJdXNjX091dERtYVJlZyggaW5mbywgTlJBUkwsICh1MTYpcGh5c19hZGRyICk7CisJCXVzY19PdXREbWFSZWcoIGluZm8sIE5SQVJVLCAodTE2KShwaHlzX2FkZHIgPj4gMTYpICk7CisKKwkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoIGluZm8sIFJYU1RBVFVTX0FMTCApOworCQl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMgKTsKKwkJdXNjX0VuYWJsZUludGVycnVwdHMoIGluZm8sIFJFQ0VJVkVfU1RBVFVTICk7CisKKwkJLyogMS4gQXJtIEVuZCBvZiBCdWZmZXIgKEVPQikgUmVjZWl2ZSBETUEgSW50ZXJydXB0IChCSVQyIG9mIFJESUFSKSAqLworCQkvKiAyLiBFbmFibGUgUmVjZWl2ZSBETUEgSW50ZXJydXB0cyAoQklUMSBvZiBESUNSKSAqLworCisJCXVzY19PdXREbWFSZWcoIGluZm8sIFJESUFSLCBCSVQzICsgQklUMiApOworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBESUNSLCAodTE2KSh1c2NfSW5EbWFSZWcoaW5mbyxESUNSKSB8IEJJVDEpICk7CisJCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9Jbml0UnhDaGFubmVsICk7CisJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fRENEICkKKwkJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLEVOQUJMRV9BVVRPX0RDRCk7CisJCWVsc2UKKwkJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLEVOQUJMRV9VTkNPTkRJVElPTkFMKTsKKwl9CisJZWxzZQorCXsKKwkJLyogVGhpcyBlbXB0aWVzIHRoZSByZWNlaXZlIEZJRk8gYW5kIGxvYWRzIHRoZSBSQ0Mgd2l0aCBSQ0xSICovCisJCXVzY19PdXRSZWcoIGluZm8sIENDU1IsICh1MTYpKHVzY19JblJlZyhpbmZvLENDU1IpIHwgQklUMTMpICk7CisJCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VSeEZpZm8gKTsKKwl9CisKK30JLyogZW5kIG9mIHVzY19wcm9jZXNzX3J4b3ZlcnJ1bl9zeW5jKCkgKi8KKworLyogdXNjX3N0b3BfcmVjZWl2ZXIoKQorICoKKyAqCURpc2FibGUgVVNDIHJlY2VpdmVyCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3N0b3BfcmVjZWl2ZXIoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6dXNjX3N0b3BfcmVjZWl2ZXIoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCS8qIERpc2FibGUgcmVjZWl2ZSBETUEgY2hhbm5lbC4gKi8KKwkvKiBUaGlzIGFsc28gZGlzYWJsZXMgcmVjZWl2ZSBETUEgY2hhbm5lbCBpbnRlcnJ1cHRzICovCisJdXNjX0RtYUNtZCggaW5mbywgRG1hQ21kX1Jlc2V0UnhDaGFubmVsICk7CisKKwl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyggaW5mbywgUlhTVEFUVVNfQUxMICk7CisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFJFQ0VJVkVfREFUQSArIFJFQ0VJVkVfU1RBVFVTICk7CisJdXNjX0Rpc2FibGVJbnRlcnJ1cHRzKCBpbmZvLCBSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyApOworCisJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRElTQUJMRV9VTkNPTkRJVElPTkFMKTsKKworCS8qIFRoaXMgZW1wdGllcyB0aGUgcmVjZWl2ZSBGSUZPIGFuZCBsb2FkcyB0aGUgUkNDIHdpdGggUkNMUiAqLworCXVzY19PdXRSZWcoIGluZm8sIENDU1IsICh1MTYpKHVzY19JblJlZyhpbmZvLENDU1IpIHwgQklUMTMpICk7CisJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVJ4RmlmbyApOworCisJaW5mby0+cnhfZW5hYmxlZCA9IDA7CisJaW5mby0+cnhfb3ZlcmZsb3cgPSAwOworCWluZm8tPnJ4X3JjY191bmRlcnJ1biA9IDA7CisJCit9CS8qIGVuZCBvZiBzdG9wX3JlY2VpdmVyKCkgKi8KKworLyogdXNjX3N0YXJ0X3JlY2VpdmVyKCkKKyAqCisgKglFbmFibGUgdGhlIFVTQyByZWNlaXZlciAKKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2Nfc3RhcnRfcmVjZWl2ZXIoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTMyIHBoeXNfYWRkcjsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp1c2Nfc3RhcnRfcmVjZWl2ZXIoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJbWdzbF9yZXNldF9yeF9kbWFfYnVmZmVycyggaW5mbyApOworCXVzY19zdG9wX3JlY2VpdmVyKCBpbmZvICk7CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBDQ1NSLCAodTE2KSh1c2NfSW5SZWcoaW5mbyxDQ1NSKSB8IEJJVDEzKSApOworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VSeEZpZm8gKTsKKworCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgfHwKKwkJaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVyApIHsKKwkJLyogRE1BIG1vZGUgVHJhbnNmZXJzICovCisJCS8qIFByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyLiAqLworCQkvKiBFbmFibGUgdGhlIERNQSBjb250cm9sbGVyIGVuZCBvZiBidWZmZXIgaW50ZXJydXB0LiAqLworCisJCS8qIHByb2dyYW0gMTZDMzIgd2l0aCBwaHlzaWNhbCBhZGRyZXNzIG9mIDFzdCBETUEgYnVmZmVyIGVudHJ5ICovCisJCXBoeXNfYWRkciA9IGluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLnBoeXNfZW50cnk7CisJCXVzY19PdXREbWFSZWcoIGluZm8sIE5SQVJMLCAodTE2KXBoeXNfYWRkciApOworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBOUkFSVSwgKHUxNikocGh5c19hZGRyID4+IDE2KSApOworCisJCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKCBpbmZvLCBSWFNUQVRVU19BTEwgKTsKKwkJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFJFQ0VJVkVfREFUQSArIFJFQ0VJVkVfU1RBVFVTICk7CisJCXVzY19FbmFibGVJbnRlcnJ1cHRzKCBpbmZvLCBSRUNFSVZFX1NUQVRVUyApOworCisJCS8qIDEuIEFybSBFbmQgb2YgQnVmZmVyIChFT0IpIFJlY2VpdmUgRE1BIEludGVycnVwdCAoQklUMiBvZiBSRElBUikgKi8KKwkJLyogMi4gRW5hYmxlIFJlY2VpdmUgRE1BIEludGVycnVwdHMgKEJJVDEgb2YgRElDUikgKi8KKworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBSRElBUiwgQklUMyArIEJJVDIgKTsKKwkJdXNjX091dERtYVJlZyggaW5mbywgRElDUiwgKHUxNikodXNjX0luRG1hUmVnKGluZm8sRElDUikgfCBCSVQxKSApOworCQl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfSW5pdFJ4Q2hhbm5lbCApOworCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0RDRCApCisJCQl1c2NfRW5hYmxlUmVjZWl2ZXIoaW5mbyxFTkFCTEVfQVVUT19EQ0QpOworCQllbHNlCisJCQl1c2NfRW5hYmxlUmVjZWl2ZXIoaW5mbyxFTkFCTEVfVU5DT05ESVRJT05BTCk7CisJfSBlbHNlIHsKKwkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoaW5mbywgUlhTVEFUVVNfQUxMKTsKKwkJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoaW5mbywgUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMpOworCQl1c2NfRW5hYmxlSW50ZXJydXB0cyhpbmZvLCBSRUNFSVZFX0RBVEEpOworCisJCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VSeEZpZm8gKTsKKwkJdXNjX1JDbWQoIGluZm8sIFJDbWRfRW50ZXJIdW50bW9kZSApOworCisJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLEVOQUJMRV9VTkNPTkRJVElPTkFMKTsKKwl9CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBDQ1NSLCAweDEwMjAgKTsKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworCit9CS8qIGVuZCBvZiB1c2Nfc3RhcnRfcmVjZWl2ZXIoKSAqLworCisvKiB1c2Nfc3RhcnRfdHJhbnNtaXR0ZXIoKQorICoKKyAqCUVuYWJsZSB0aGUgVVNDIHRyYW5zbWl0dGVyIGFuZCBzZW5kIGEgdHJhbnNtaXQgZnJhbWUgaWYKKyAqCW9uZSBpcyBsb2FkZWQgaW4gdGhlIERNQSBidWZmZXJzLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zdGFydF90cmFuc21pdHRlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MzIgcGh5c19hZGRyOworCXVuc2lnbmVkIGludCBGcmFtZVNpemU7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp1c2Nfc3RhcnRfdHJhbnNtaXR0ZXIoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWlmICggaW5mby0+eG1pdF9jbnQgKSB7CisKKwkJLyogSWYgYXV0byBSVFMgZW5hYmxlZCBhbmQgUlRTIGlzIGluYWN0aXZlLCB0aGVuIGFzc2VydCAqLworCQkvKiBSVFMgYW5kIHNldCBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkICovCisJCS8qIG5lZ2F0ZSBSVFMgd2hlbiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlcy4gKi8KKworCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMDsKKworCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX1JUUyApIHsKKwkJCXVzY19nZXRfc2VyaWFsX3NpZ25hbHMoIGluZm8gKTsKKwkJCWlmICggIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpICkgeworCQkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisJCQkJdXNjX3NldF9zZXJpYWxfc2lnbmFscyggaW5mbyApOworCQkJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAxOworCQkJfQorCQl9CisKKworCQlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQyApIHsKKwkJCWlmICggIWluZm8tPnR4X2FjdGl2ZSApIHsKKwkJCQl1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyhpbmZvLCBUWFNUQVRVU19BTEwpOworCQkJCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKGluZm8sIFRSQU5TTUlUX1NUQVRVUyArIFRSQU5TTUlUX0RBVEEpOworCQkJCXVzY19FbmFibGVJbnRlcnJ1cHRzKGluZm8sIFRSQU5TTUlUX0RBVEEpOworCQkJCXVzY19sb2FkX3R4ZmlmbyhpbmZvKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERpc2FibGUgdHJhbnNtaXQgRE1BIGNvbnRyb2xsZXIgd2hpbGUgcHJvZ3JhbW1pbmcuICovCisJCQl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfUmVzZXRUeENoYW5uZWwgKTsKKwkJCQorCQkJLyogVHJhbnNtaXQgRE1BIGJ1ZmZlciBpcyBsb2FkZWQsIHNvIHByb2dyYW0gVVNDICovCisJCQkvKiB0byBzZW5kIHRoZSBmcmFtZSBjb250YWluZWQgaW4gdGhlIGJ1ZmZlcnMuCSAqLworCisJCQlGcmFtZVNpemUgPSBpbmZvLT50eF9idWZmZXJfbGlzdFtpbmZvLT5zdGFydF90eF9kbWFfYnVmZmVyXS5yY2M7CisKKwkJCS8qIGlmIG9wZXJhdGluZyBpbiBSYXcgc3luYyBtb2RlLCByZXNldCB0aGUgcmNjIGNvbXBvbmVudAorCQkJICogb2YgdGhlIHR4IGRtYSBidWZmZXIgZW50cnksIG90aGVyd2lzZSwgdGhlIHNlcmlhbCBjb250cm9sbGVyCisJCQkgKiB3aWxsIHNlbmQgYSBjbG9zaW5nIHN5bmMgY2hhciBhZnRlciB0aGlzIGNvdW50LgorCQkJICovCisJICAgIAkJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkKKwkJCQlpbmZvLT50eF9idWZmZXJfbGlzdFtpbmZvLT5zdGFydF90eF9kbWFfYnVmZmVyXS5yY2MgPSAwOworCisJCQkvKiBQcm9ncmFtIHRoZSBUcmFuc21pdCBDaGFyYWN0ZXIgTGVuZ3RoIFJlZ2lzdGVyIChUQ0xSKSAqLworCQkJLyogYW5kIGNsZWFyIEZJRk8gKFRDQyBpcyBsb2FkZWQgd2l0aCBUQ0xSIG9uIEZJRk8gY2xlYXIpICovCisJCQl1c2NfT3V0UmVnKCBpbmZvLCBUQ0xSLCAodTE2KUZyYW1lU2l6ZSApOworCisJCQl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlVHhGaWZvICk7CisKKwkJCS8qIFByb2dyYW0gdGhlIGFkZHJlc3Mgb2YgdGhlIDFzdCBETUEgQnVmZmVyIEVudHJ5IGluIGxpbmtlZCBsaXN0ICovCisJCQlwaHlzX2FkZHIgPSBpbmZvLT50eF9idWZmZXJfbGlzdFtpbmZvLT5zdGFydF90eF9kbWFfYnVmZmVyXS5waHlzX2VudHJ5OworCQkJdXNjX091dERtYVJlZyggaW5mbywgTlRBUkwsICh1MTYpcGh5c19hZGRyICk7CisJCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBOVEFSVSwgKHUxNikocGh5c19hZGRyID4+IDE2KSApOworCisJCQl1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyggaW5mbywgVFhTVEFUVVNfQUxMICk7CisJCQl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgVFJBTlNNSVRfU1RBVFVTICk7CisJCQl1c2NfRW5hYmxlSW50ZXJydXB0cyggaW5mbywgVFJBTlNNSVRfU1RBVFVTICk7CisKKwkJCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVyAmJgorCQkJCQlpbmZvLT5udW1fdHhfZG1hX2J1ZmZlcnMgPiAxICkgeworCQkJICAgLyogV2hlbiBydW5uaW5nIGV4dGVybmFsIHN5bmMgbW9kZSwgYXR0ZW1wdCB0byAnc3RyZWFtJyB0cmFuc21pdCAgKi8KKwkJCSAgIC8qIGJ5IGZpbGxpbmcgdHggZG1hIGJ1ZmZlcnMgYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLiBUbyBkbyB0aGlzICovCisJCQkgICAvKiB3ZSBuZWVkIHRvIGVuYWJsZSBUeCBETUEgRU9CIFN0YXR1cyBpbnRlcnJ1cHRzIDogICAgICAgICAgICAgICAqLworCQkJICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgIC8qIDEuIEFybSBFbmQgb2YgQnVmZmVyIChFT0IpIFRyYW5zbWl0IERNQSBJbnRlcnJ1cHQgKEJJVDIgb2YgVERJQVIpICovCisJCQkgICAvKiAyLiBFbmFibGUgVHJhbnNtaXQgRE1BIEludGVycnVwdHMgKEJJVDAgb2YgRElDUikgKi8KKworCQkJICAgdXNjX091dERtYVJlZyggaW5mbywgVERJQVIsIEJJVDJ8QklUMyApOworCQkJICAgdXNjX091dERtYVJlZyggaW5mbywgRElDUiwgKHUxNikodXNjX0luRG1hUmVnKGluZm8sRElDUikgfCBCSVQwKSApOworCQkJfQorCisJCQkvKiBJbml0aWFsaXplIFRyYW5zbWl0IERNQSBDaGFubmVsICovCisJCQl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfSW5pdFR4Q2hhbm5lbCApOworCQkJCisJCQl1c2NfVENtZCggaW5mbywgVENtZF9TZW5kRnJhbWUgKTsKKwkJCQorCQkJaW5mby0+dHhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMDApOworCQkJYWRkX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CQorCQl9CisJCWluZm8tPnR4X2FjdGl2ZSA9IDE7CisJfQorCisJaWYgKCAhaW5mby0+dHhfZW5hYmxlZCApIHsKKwkJaW5mby0+dHhfZW5hYmxlZCA9IDE7CisJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fQ1RTICkKKwkJCXVzY19FbmFibGVUcmFuc21pdHRlcihpbmZvLEVOQUJMRV9BVVRPX0NUUyk7CisJCWVsc2UKKwkJCXVzY19FbmFibGVUcmFuc21pdHRlcihpbmZvLEVOQUJMRV9VTkNPTkRJVElPTkFMKTsKKwl9CisKK30JLyogZW5kIG9mIHVzY19zdGFydF90cmFuc21pdHRlcigpICovCisKKy8qIHVzY19zdG9wX3RyYW5zbWl0dGVyKCkKKyAqCisgKglTdG9wcyB0aGUgdHJhbnNtaXR0ZXIgYW5kIERNQQorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaXNudGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zdG9wX3RyYW5zbWl0dGVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnVzY19zdG9wX3RyYW5zbWl0dGVyKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJCQkgCisJdXNjX1VubGF0Y2hUeHN0YXR1c0JpdHMoIGluZm8sIFRYU1RBVFVTX0FMTCApOworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKyBUUkFOU01JVF9EQVRBICk7CisJdXNjX0Rpc2FibGVJbnRlcnJ1cHRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKyBUUkFOU01JVF9EQVRBICk7CisKKwl1c2NfRW5hYmxlVHJhbnNtaXR0ZXIoaW5mbyxESVNBQkxFX1VOQ09ORElUSU9OQUwpOworCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9SZXNldFR4Q2hhbm5lbCApOworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VUeEZpZm8gKTsKKworCWluZm8tPnR4X2VuYWJsZWQgPSAwOworCWluZm8tPnR4X2FjdGl2ZSAgPSAwOworCit9CS8qIGVuZCBvZiB1c2Nfc3RvcF90cmFuc21pdHRlcigpICovCisKKy8qIHVzY19sb2FkX3R4ZmlmbygpCisgKgorICoJRmlsbCB0aGUgdHJhbnNtaXQgRklGTyB1bnRpbCB0aGUgRklGTyBpcyBmdWxsIG9yCisgKgl0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gbG9hZC4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbiAoaW5zdGFuY2UgZGF0YSkKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2NfbG9hZF90eGZpZm8oIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaW50IEZpZm9jb3VudDsKKwl1OCBUd29CeXRlc1syXTsKKwkKKwlpZiAoICFpbmZvLT54bWl0X2NudCAmJiAhaW5mby0+eF9jaGFyICkKKwkJcmV0dXJuOyAKKwkJCisJLyogU2VsZWN0IHRyYW5zbWl0IEZJRk8gc3RhdHVzIHJlYWRiYWNrIGluIFRJQ1IgKi8KKwl1c2NfVENtZCggaW5mbywgVENtZF9TZWxlY3RUaWNyVHhGaWZvc3RhdHVzICk7CisKKwkvKiBsb2FkIHRoZSBUcmFuc21pdCBGSUZPIHVudGlsIEZJRk9zIGZ1bGwgb3IgYWxsIGRhdGEgc2VudCAqLworCisJd2hpbGUoIChGaWZvY291bnQgPSB1c2NfSW5SZWcoaW5mbywgVElDUikgPj4gOCkgJiYgaW5mby0+eG1pdF9jbnQgKSB7CisJCS8qIHRoZXJlIGlzIG1vcmUgc3BhY2UgaW4gdGhlIHRyYW5zbWl0IEZJRk8gYW5kICovCisJCS8qIHRoZXJlIGlzIG1vcmUgZGF0YSBpbiB0cmFuc21pdCBidWZmZXIgKi8KKworCQlpZiAoIChpbmZvLT54bWl0X2NudCA+IDEpICYmIChGaWZvY291bnQgPiAxKSAmJiAhaW5mby0+eF9jaGFyICkgeworIAkJCS8qIHdyaXRlIGEgMTYtYml0IHdvcmQgZnJvbSB0cmFuc21pdCBidWZmZXIgdG8gMTZDMzIgKi8KKwkJCQkKKwkJCVR3b0J5dGVzWzBdID0gaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsKytdOworCQkJaW5mby0+eG1pdF90YWlsID0gaW5mby0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCQlUd29CeXRlc1sxXSA9IGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbCsrXTsKKwkJCWluZm8tPnhtaXRfdGFpbCA9IGluZm8tPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQkJCisJCQlvdXR3KCAqKCh1MTYgKilUd29CeXRlcyksIGluZm8tPmlvX2Jhc2UgKyBEQVRBUkVHKTsKKwkJCQkKKwkJCWluZm8tPnhtaXRfY250IC09IDI7CisJCQlpbmZvLT5pY291bnQudHggKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIG9ubHkgMSBieXRlIGxlZnQgdG8gdHJhbnNtaXQgb3IgMSBGSUZPIHNsb3QgbGVmdCAqLworCQkJCisJCQlvdXR3KCAoaW53KCBpbmZvLT5pb19iYXNlICsgQ0NBUikgJiAweDA3ODApIHwgKFREUitMU0JPTkxZKSwKKwkJCQlpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCQkJCisJCQlpZiAoaW5mby0+eF9jaGFyKSB7CisJCQkJLyogdHJhbnNtaXQgcGVuZGluZyBoaWdoIHByaW9yaXR5IGNoYXIgKi8KKwkJCQlvdXR3KCBpbmZvLT54X2NoYXIsaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKwkJCQlpbmZvLT54X2NoYXIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlvdXR3KCBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK10saW5mby0+aW9fYmFzZSArIENDQVIgKTsKKwkJCQlpbmZvLT54bWl0X3RhaWwgPSBpbmZvLT54bWl0X3RhaWwgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwkJCQlpbmZvLT54bWl0X2NudC0tOworCQkJfQorCQkJaW5mby0+aWNvdW50LnR4Kys7CisJCX0KKwl9CisKK30JLyogZW5kIG9mIHVzY19sb2FkX3R4ZmlmbygpICovCisKKy8qIHVzY19yZXNldCgpCisgKgorICoJUmVzZXQgdGhlIGFkYXB0ZXIgdG8gYSBrbm93biBzdGF0ZSBhbmQgcHJlcGFyZSBpdCBmb3IgZnVydGhlciB1c2UuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3Jlc2V0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKSB7CisJCWludCBpOworCQl1MzIgcmVhZHZhbDsKKworCQkvKiBTZXQgQklUMzAgb2YgTWlzYyBDb250cm9sIFJlZ2lzdGVyICovCisJCS8qIChMb2NhbCBDb250cm9sIFJlZ2lzdGVyIDB4NTApIHRvIGZvcmNlIHJlc2V0IG9mIFVTQy4gKi8KKworCQl2b2xhdGlsZSB1MzIgKk1pc2NDdHJsID0gKHUzMiAqKShpbmZvLT5sY3JfYmFzZSArIDB4NTApOworCQl1MzIgKkxDUjBCUkRSID0gKHUzMiAqKShpbmZvLT5sY3JfYmFzZSArIDB4MjgpOworCisJCWluZm8tPm1pc2NfY3RybF92YWx1ZSB8PSBCSVQzMDsKKwkJKk1pc2NDdHJsID0gaW5mby0+bWlzY19jdHJsX3ZhbHVlOworCisJCS8qCisJCSAqIEZvcmNlIGF0IGxlYXN0IDE3MG5zIGRlbGF5IGJlZm9yZSBjbGVhcmluZyAKKwkJICogcmVzZXQgYml0LiBFYWNoIHJlYWQgZnJvbSBMQ1IgdGFrZXMgYXQgbGVhc3QgCisJCSAqIDMwbnMgc28gMTAgdGltZXMgZm9yIDMwMG5zIHRvIGJlIHNhZmUuCisJCSAqLworCQlmb3IoaT0wO2k8MTA7aSsrKQorCQkJcmVhZHZhbCA9ICpNaXNjQ3RybDsKKworCQlpbmZvLT5taXNjX2N0cmxfdmFsdWUgJj0gfkJJVDMwOworCQkqTWlzY0N0cmwgPSBpbmZvLT5taXNjX2N0cmxfdmFsdWU7CisKKwkJKkxDUjBCUkRSID0gQlVTX0RFU0NSSVBUT1IoCisJCQkxLAkJLy8gV3JpdGUgU3Ryb2JlIEhvbGQgKDAtMykKKwkJCTIsCQkvLyBXcml0ZSBTdHJvYmUgRGVsYXkgKDAtMykKKwkJCTIsCQkvLyBSZWFkIFN0cm9iZSBEZWxheSAgKDAtMykKKwkJCTAsCQkvLyBOV0REIChXcml0ZSBkYXRhLWRhdGEpICgwLTMpCisJCQk0LAkJLy8gTldBRCAoV3JpdGUgQWRkci1kYXRhKSAoMC0zMSkKKwkJCTAsCQkvLyBOWERBIChSZWFkL1dyaXRlIERhdGEtQWRkcikgKDAtMykKKwkJCTAsCQkvLyBOUkREIChSZWFkIERhdGEtRGF0YSkgKDAtMykKKwkJCTUJCS8vIE5SQUQgKFJlYWQgQWRkci1EYXRhKSAoMC0zMSkKKwkJCSk7CisJfSBlbHNlIHsKKwkJLyogZG8gSFcgcmVzZXQgKi8KKwkJb3V0YiggMCxpbmZvLT5pb19iYXNlICsgOCApOworCX0KKworCWluZm8tPm1icmVfYml0ID0gMDsKKwlpbmZvLT5sb29wYmFja19iaXRzID0gMDsKKwlpbmZvLT51c2NfaWRsZV9tb2RlID0gMDsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgQnVzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEJDUikKKwkgKgorCSAqIDwxNT4JCTAJRG9uJ3QgdXNlIHNlcGFyYXRlIGFkZHJlc3MKKwkgKiA8MTQuLjY+CTAJcmVzZXJ2ZWQKKwkgKiA8NS4uND4JMDAJSUFja21vZGUgPSBEZWZhdWx0LCBkb24ndCBjYXJlCisJICogPDM+CQkxCUJ1cyBSZXF1ZXN0IFRvdGVtIFBvbGUgb3V0cHV0CisJICogPDI+CQkxCVVzZSAxNiBCaXQgZGF0YSBidXMKKwkgKiA8MT4JCTAJSVJRIFRvdGVtIFBvbGUgb3V0cHV0CisJICogPDA+CQkwCURvbid0IFNoaWZ0IFJpZ2h0IEFkZHIKKwkgKgorCSAqIDAwMDAgMDAwMCAwMDAwIDExMDAgPSAweDAwMGMKKwkgKgorCSAqIEJ5IHdyaXRpbmcgdG8gaW9fYmFzZSArIFNEUElOIHRoZSBXYWl0L0FjayBwaW4gaXMKKwkgKiBwcm9ncmFtbWVkIHRvIHdvcmsgYXMgYSBXYWl0IHBpbi4KKwkgKi8KKwkKKwlvdXR3KCAweDAwMGMsaW5mby0+aW9fYmFzZSArIFNEUElOICk7CisKKworCW91dHcoIDAsaW5mby0+aW9fYmFzZSApOworCW91dHcoIDAsaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKworCS8qIHNlbGVjdCBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXJpbmcgKi8KKwl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1NlbGVjdExpdHRsZUVuZGlhbiApOworCisKKwkvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgKFBDUikKKwkgKgorCSAqIDwxNS4uMTQ+CTExCVBvcnQgNyBpcyBPdXRwdXQgKH5ETUFFTiwgQml0IDE0IDogMCA9IEVuYWJsZWQpCisJICogPDEzLi4xMj4JMTEJUG9ydCA2IGlzIE91dHB1dCAofklOVEVOLCBCaXQgMTIgOiAwID0gRW5hYmxlZCkKKwkgKiA8MTEuLjEwPiAJMDAJUG9ydCA1IGlzIElucHV0IChObyBDb25uZWN0LCBEb24ndCBDYXJlKQorCSAqIDw5Li44PiAJMDAJUG9ydCA0IGlzIElucHV0IChObyBDb25uZWN0LCBEb24ndCBDYXJlKQorCSAqIDw3Li42PgkxMQlQb3J0IDMgaXMgT3V0cHV0ICh+UlRTLCBCaXQgNiA6IDAgPSBFbmFibGVkICkKKwkgKiA8NS4uND4JMTEJUG9ydCAyIGlzIE91dHB1dCAofkRUUiwgQml0IDQgOiAwID0gRW5hYmxlZCApCisJICogPDMuLjI+CTAxCVBvcnQgMSBpcyBJbnB1dCAoRGVkaWNhdGVkIFJ4QykKKwkgKiA8MS4uMD4JMDEJUG9ydCAwIGlzIElucHV0IChEZWRpY2F0ZWQgVHhDKQorCSAqCisJICoJMTExMSAwMDAwIDExMTEgMDEwMSA9IDB4ZjBmNQorCSAqLworCisJdXNjX091dFJlZyggaW5mbywgUENSLCAweGYwZjUgKTsKKworCisJLyoKKwkgKiBJbnB1dC9PdXRwdXQgQ29udHJvbCBSZWdpc3RlcgorCSAqCisJICogPDE1Li4xND4JMDAJQ1RTIGlzIGFjdGl2ZSBsb3cgaW5wdXQKKwkgKiA8MTMuLjEyPgkwMAlEQ0QgaXMgYWN0aXZlIGxvdyBpbnB1dAorCSAqIDwxMS4uMTA+CTAwCVR4UkVRIHBpbiBpcyBpbnB1dCAoRFNSKQorCSAqIDw5Li44PgkwMAlSeFJFUSBwaW4gaXMgaW5wdXQgKFJJKQorCSAqIDw3Li42PgkwMAlUeEQgaXMgb3V0cHV0IChUcmFuc21pdCBEYXRhKQorCSAqIDw1Li4zPgkwMDAJVHhDIFBpbiBpbiBJbnB1dCAoMTQuNzQ1Nk1IeiBDbG9jaykKKwkgKiA8Mi4uMD4JMTAwCVJ4QyBpcyBPdXRwdXQgKGRyaXZlIHdpdGggQlJHMCkKKwkgKgorCSAqCTAwMDAgMDAwMCAwMDAwIDAxMDAgPSAweDAwMDQKKwkgKi8KKworCXVzY19PdXRSZWcoIGluZm8sIElPQ1IsIDB4MDAwNCApOworCit9CS8qIGVuZCBvZiB1c2NfcmVzZXQoKSAqLworCisvKiB1c2Nfc2V0X2FzeW5jX21vZGUoKQorICoKKyAqCVByb2dyYW0gYWRhcHRlciBmb3IgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb25zLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2Nfc2V0X2FzeW5jX21vZGUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IFJlZ1ZhbHVlOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWxlIHByb2dyYW1taW5nIFVTQyAqLworCXVzY19EaXNhYmxlTWFzdGVySXJxQml0KCBpbmZvICk7CisKKwlvdXR3KCAwLCBpbmZvLT5pb19iYXNlICk7IAkJCS8qIGNsZWFyIE1hc3RlciBCdXMgRW5hYmxlIChEQ0FSKSAqLworCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9SZXNldEFsbENoYW5uZWxzICk7CS8qIGRpc2FibGUgYm90aCBETUEgY2hhbm5lbHMgKi8KKworCXVzY19sb29wYmFja19mcmFtZSggaW5mbyApOworCisJLyogQ2hhbm5lbCBtb2RlIFJlZ2lzdGVyIChDTVIpCisJICoKKwkgKiA8MTUuLjE0PgkwMAlUeCBTdWIgbW9kZXMsIDAwID0gMSBTdG9wIEJpdAorCSAqIDwxMy4uMTI+CTAwCSAgICAgICAgICAgICAgMDAgPSAxNlggQ2xvY2sKKwkgKiA8MTEuLjg+CTAwMDAJVHJhbnNtaXR0ZXIgbW9kZSA9IEFzeW5jaHJvbm91cworCSAqIDw3Li42PgkwMAlyZXNlcnZlZD8KKwkgKiA8NS4uND4JMDAJUnggU3ViIG1vZGVzLCAwMCA9IDE2WCBDbG9jaworCSAqIDwzLi4wPgkwMDAwCVJlY2VpdmVyIG1vZGUgPSBBc3luY2hyb25vdXMKKwkgKgorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMDAgPSAweDAKKwkgKi8KKworCVJlZ1ZhbHVlID0gMDsKKwlpZiAoIGluZm8tPnBhcmFtcy5zdG9wX2JpdHMgIT0gMSApCisJCVJlZ1ZhbHVlIHw9IEJJVDE0OworCXVzY19PdXRSZWcoIGluZm8sIENNUiwgUmVnVmFsdWUgKTsKKworCQorCS8qIFJlY2VpdmVyIG1vZGUgUmVnaXN0ZXIgKFJNUikKKwkgKgorCSAqIDwxNS4uMTM+CTAwMAllbmNvZGluZyA9IE5vbmUKKwkgKiA8MTIuLjA4PgkwMDAwMAlyZXNlcnZlZCAoU3luYyBPbmx5KQorCSAqIDw3Li42PiAgIAkwMAlFdmVuIHBhcml0eQorCSAqIDw1PgkJMAlwYXJpdHkgZGlzYWJsZWQKKwkgKiA8NC4uMj4JMDAwCVJlY2VpdmUgQ2hhciBMZW5ndGggPSA4IGJpdHMKKwkgKiA8MS4uMD4JMDAJRGlzYWJsZSBSZWNlaXZlcgorCSAqCisJICogMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MAorCSAqLworCisJUmVnVmFsdWUgPSAwOworCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzICE9IDggKQorCQlSZWdWYWx1ZSB8PSBCSVQ0K0JJVDMrQklUMjsKKworCWlmICggaW5mby0+cGFyYW1zLnBhcml0eSAhPSBBU1lOQ19QQVJJVFlfTk9ORSApIHsKKwkJUmVnVmFsdWUgfD0gQklUNTsKKwkJaWYgKCBpbmZvLT5wYXJhbXMucGFyaXR5ICE9IEFTWU5DX1BBUklUWV9PREQgKQorCQkJUmVnVmFsdWUgfD0gQklUNjsKKwl9CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBSTVIsIFJlZ1ZhbHVlICk7CisKKworCS8qIFNldCBJUlEgdHJpZ2dlciBsZXZlbCAqLworCisJdXNjX1JDbWQoIGluZm8sIFJDbWRfU2VsZWN0UmljckludExldmVsICk7CisKKwkKKwkvKiBSZWNlaXZlIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChSSUNSKQorCSAqCisJICogPDE1Li44Pgk/CQlSeEZJRk8gSVJRIFJlcXVlc3QgTGV2ZWwKKwkgKgorCSAqIE5vdGU6IEZvciBhc3luYyBtb2RlIHRoZSByZWNlaXZlIEZJRk8gbGV2ZWwgbXVzdCBiZSBzZXQKKwkgKiB0byAwIHRvIGF2aW9kIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIEZJRk8gY29udGFpbnMgZmV3ZXIgYnl0ZXMKKwkgKiB0aGFuIHRoZSB0cmlnZ2VyIGxldmVsIGFuZCBubyBtb3JlIGRhdGEgaXMgZXhwZWN0ZWQuCisJICoKKwkgKiA8Nz4JCTAJCUV4aXRlZCBIdW50IElBIChJbnRlcnJ1cHQgQXJtKQorCSAqIDw2PgkJMAkJSWRsZSBSZWNlaXZlZCBJQQorCSAqIDw1PgkJMAkJQnJlYWsvQWJvcnQgSUEKKwkgKiA8ND4JCTAJCVJ4IEJvdW5kIElBCisJICogPDM+CQkwCQlRdWV1ZWQgc3RhdHVzIHJlZmxlY3RzIG9sZGVzdCBieXRlIGluIEZJRk8KKwkgKiA8Mj4JCTAJCUFib3J0L1BFIElBCisJICogPDE+CQkwCQlSeCBPdmVycnVuIElBCisJICogPDA+CQkwCQlTZWxlY3QgVEMwIHZhbHVlIGZvciByZWFkYmFjaworCSAqCisJICogMDAwMCAwMDAwIDAxMDAgMDAwMCA9IDB4MDAwMCArIChGSUZPTEVWRUwgaW4gTVNCKQorCSAqLworCQorCXVzY19PdXRSZWcoIGluZm8sIFJJQ1IsIDB4MDAwMCApOworCisJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoIGluZm8sIFJYU1RBVFVTX0FMTCApOworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBSRUNFSVZFX1NUQVRVUyApOworCisJCisJLyogVHJhbnNtaXQgbW9kZSBSZWdpc3RlciAoVE1SKQorCSAqCisJICogPDE1Li4xMz4JMDAwCWVuY29kaW5nID0gTm9uZQorCSAqIDwxMi4uMDg+CTAwMDAwCXJlc2VydmVkIChTeW5jIE9ubHkpCisJICogPDcuLjY+CTAwCVRyYW5zbWl0IHBhcml0eSBFdmVuCisJICogPDU+CQkwCVRyYW5zbWl0IHBhcml0eSBEaXNhYmxlZAorCSAqIDw0Li4yPgkwMDAJVHggQ2hhciBMZW5ndGggPSA4IGJpdHMKKwkgKiA8MS4uMD4JMDAJRGlzYWJsZSBUcmFuc21pdHRlcgorCSAqCisJICogMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MAorCSAqLworCisJUmVnVmFsdWUgPSAwOworCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzICE9IDggKQorCQlSZWdWYWx1ZSB8PSBCSVQ0K0JJVDMrQklUMjsKKworCWlmICggaW5mby0+cGFyYW1zLnBhcml0eSAhPSBBU1lOQ19QQVJJVFlfTk9ORSApIHsKKwkJUmVnVmFsdWUgfD0gQklUNTsKKwkJaWYgKCBpbmZvLT5wYXJhbXMucGFyaXR5ICE9IEFTWU5DX1BBUklUWV9PREQgKQorCQkJUmVnVmFsdWUgfD0gQklUNjsKKwl9CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBUTVIsIFJlZ1ZhbHVlICk7CisKKwl1c2Nfc2V0X3R4aWRsZSggaW5mbyApOworCisKKwkvKiBTZXQgSVJRIHRyaWdnZXIgbGV2ZWwgKi8KKworCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbGVjdFRpY3JJbnRMZXZlbCApOworCisJCisJLyogVHJhbnNtaXQgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKFRJQ1IpCisJICoKKwkgKiA8MTUuLjg+CT8JVHJhbnNtaXQgRklGTyBJUlEgTGV2ZWwKKwkgKiA8Nz4JCTAJUHJlc2VudCBJQSAoSW50ZXJydXB0IEFybSkKKwkgKiA8Nj4JCTEJSWRsZSBTZW50IElBCisJICogPDU+CQkwCUFib3J0IFNlbnQgSUEKKwkgKiA8ND4JCTAJRU9GL0VPTSBTZW50IElBCisJICogPDM+CQkwCUNSQyBTZW50IElBCisJICogPDI+CQkwCTEgPSBXYWl0IGZvciBTVyBUcmlnZ2VyIHRvIFN0YXJ0IEZyYW1lCisJICogPDE+CQkwCVR4IFVuZGVycnVuIElBCisJICogPDA+CQkwCVRDMCBjb25zdGFudCBvbiByZWFkIGJhY2sKKwkgKgorCSAqCTAwMDAgMDAwMCAwMTAwIDAwMDAgPSAweDAwNDAKKwkgKi8KKworCXVzY19PdXRSZWcoIGluZm8sIFRJQ1IsIDB4MWY0MCApOworCisJdXNjX1VubGF0Y2hUeHN0YXR1c0JpdHMoIGluZm8sIFRYU1RBVFVTX0FMTCApOworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKTsKKworCXVzY19lbmFibGVfYXN5bmNfY2xvY2soIGluZm8sIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKTsKKworCQorCS8qIENoYW5uZWwgQ29udHJvbC9zdGF0dXMgUmVnaXN0ZXIgKENDU1IpCisJICoKKwkgKiA8MTU+CQlYCVJDQyBGSUZPIE92ZXJmbG93IHN0YXR1cyAoUk8pCisJICogPDE0PgkJWAlSQ0MgRklGTyBOb3QgRW1wdHkgc3RhdHVzIChSTykKKwkgKiA8MTM+CQkwCTEgPSBDbGVhciBSQ0MgRklGTyAoV08pCisJICogPDEyPgkJWAlEUExMIGluIFN5bmMgc3RhdHVzIChSTykKKwkgKiA8MTE+CQlYCURQTEwgMiBNaXNzZWQgQ2xvY2tzIHN0YXR1cyAoUk8pCisJICogPDEwPgkJWAlEUExMIDEgTWlzc2VkIENsb2NrIHN0YXR1cyAoUk8pCisJICogPDkuLjg+CTAwCURQTEwgUmVzeW5jIG9uIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAoUlcpCisJICogPDc+CQlYCVNETEMgTG9vcCBPbiBzdGF0dXMgKFJPKQorCSAqIDw2PgkJWAlTRExDIExvb3AgU2VuZCBzdGF0dXMgKFJPKQorCSAqIDw1PgkJMQlCeXBhc3MgY291bnRlcnMgZm9yIFR4Q2xrIGFuZCBSeENsayAoUlcpCisJICogPDQuLjI+ICAgCTAwMAlMYXN0IENoYXIgb2YgU0RMQyBmcmFtZSBoYXMgOCBiaXRzIChSVykKKwkgKiA8MS4uMD4gICAJMDAJcmVzZXJ2ZWQKKwkgKgorCSAqCTAwMDAgMDAwMCAwMDEwIDAwMDAgPSAweDAwMjAKKwkgKi8KKwkKKwl1c2NfT3V0UmVnKCBpbmZvLCBDQ1NSLCAweDAwMjAgKTsKKworCXVzY19EaXNhYmxlSW50ZXJydXB0cyggaW5mbywgVFJBTlNNSVRfU1RBVFVTICsgVFJBTlNNSVRfREFUQSArCisJCQkgICAgICBSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyApOworCisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFRSQU5TTUlUX1NUQVRVUyArIFRSQU5TTUlUX0RBVEEgKworCQkJCVJFQ0VJVkVfREFUQSArIFJFQ0VJVkVfU1RBVFVTICk7CisKKwl1c2NfRW5hYmxlTWFzdGVySXJxQml0KCBpbmZvICk7CisKKwlpZiAoaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9JU0EpIHsKKwkJLyogRW5hYmxlIElOVEVOIChQb3J0IDYsIEJpdDEyKSAqLworCQkvKiBUaGlzIGNvbm5lY3RzIHRoZSBJUlEgcmVxdWVzdCBzaWduYWwgdG8gdGhlIElTQSBidXMgKi8KKwkJdXNjX091dFJlZyhpbmZvLCBQQ1IsICh1MTYpKCh1c2NfSW5SZWcoaW5mbywgUENSKSB8IEJJVDEzKSAmIH5CSVQxMikpOworCX0KKworfQkvKiBlbmQgb2YgdXNjX3NldF9hc3luY19tb2RlKCkgKi8KKworLyogdXNjX2xvb3BiYWNrX2ZyYW1lKCkKKyAqCisgKglMb29wIGJhY2sgYSBzbWFsbCAoMiBieXRlKSBkdW1teSBTRExDIGZyYW1lLgorICoJSW50ZXJydXB0cyBhbmQgRE1BIGFyZSBOT1QgdXNlZC4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0bworICoJY2xlYXIgYW55ICdzdGFsZScgc3RhdHVzIGluZm8gbGVmdCBvdmVyIGZyb20gcnVubmluZyBpbglhc3luYyBtb2RlLgorICoKKyAqCVRoZSAxNkMzMiBzaG93cyB0aGUgc3RyYW5nZSBiZWhhdmlvdXIgb2YgbWFya2luZyB0aGUgMXN0CisgKglyZWNlaXZlZCBTRExDIGZyYW1lIHdpdGggYSBDUkMgZXJyb3IgZXZlbiB3aGVuIHRoZXJlIGlzIG5vCisgKglDUkMgZXJyb3IuIFRvIGdldCBhcm91bmQgdGhpcyBhIHNtYWxsIGR1bW15IGZyb20gb2YgMiBieXRlcworICoJaXMgbG9vcGVkIGJhY2sgd2hlbiBzd2l0Y2hpbmcgZnJvbSBhc3luYyB0byBzeW5jIG1vZGUuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19sb29wYmFja19mcmFtZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG9sZG1vZGUgPSBpbmZvLT5wYXJhbXMubW9kZTsKKworCWluZm8tPnBhcmFtcy5tb2RlID0gTUdTTF9NT0RFX0hETEM7CisJCisJdXNjX0Rpc2FibGVNYXN0ZXJJcnFCaXQoIGluZm8gKTsKKworCXVzY19zZXRfc2RsY19tb2RlKCBpbmZvICk7CisJdXNjX2VuYWJsZV9sb29wYmFjayggaW5mbywgMSApOworCisJLyogV3JpdGUgMTYtYml0IFRpbWUgQ29uc3RhbnQgZm9yIEJSRzAgKi8KKwl1c2NfT3V0UmVnKCBpbmZvLCBUQzBSLCAwICk7CisJCisJLyogQ2hhbm5lbCBDb250cm9sIFJlZ2lzdGVyIChDQ1IpCisJICoKKwkgKiA8MTUuLjE0PgkwMAlEb24ndCB1c2UgMzItYml0IFR4IENvbnRyb2wgQmxvY2tzIChUQ0JzKQorCSAqIDwxMz4JCTAJVHJpZ2dlciBUeCBvbiBTVyBDb21tYW5kIERpc2FibGVkCisJICogPDEyPgkJMAlGbGFnIFByZWFtYmxlIERpc2FibGVkCisJICogPDExLi4xMD4JMDAJUHJlYW1ibGUgTGVuZ3RoID0gOC1CaXRzCisJICogPDkuLjg+CTAxCVByZWFtYmxlIFBhdHRlcm4gPSBmbGFncworCSAqIDw3Li42PgkxMAlEb24ndCB1c2UgMzItYml0IFJ4IHN0YXR1cyBCbG9ja3MgKFJTQnMpCisJICogPDU+CQkwCVRyaWdnZXIgUnggb24gU1cgQ29tbWFuZCBEaXNhYmxlZAorCSAqIDw0Li4wPgkwCXJlc2VydmVkCisJICoKKwkgKgkwMDAwIDAwMDEgMDAwMCAwMDAwID0gMHgwMTAwCisJICovCisKKwl1c2NfT3V0UmVnKCBpbmZvLCBDQ1IsIDB4MDEwMCApOworCisJLyogU0VUVVAgUkVDRUlWRVIgKi8KKwl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlUnhGaWZvICk7CisJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRU5BQkxFX1VOQ09ORElUSU9OQUwpOworCisJLyogU0VUVVAgVFJBTlNNSVRURVIgKi8KKwkvKiBQcm9ncmFtIHRoZSBUcmFuc21pdCBDaGFyYWN0ZXIgTGVuZ3RoIFJlZ2lzdGVyIChUQ0xSKSAqLworCS8qIGFuZCBjbGVhciBGSUZPIChUQ0MgaXMgbG9hZGVkIHdpdGggVENMUiBvbiBGSUZPIGNsZWFyKSAqLworCXVzY19PdXRSZWcoIGluZm8sIFRDTFIsIDIgKTsKKwl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlVHhGaWZvICk7CisKKwkvKiB1bmxhdGNoIFR4IHN0YXR1cyBiaXRzLCBhbmQgc3RhcnQgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwl1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyhpbmZvLFRYU1RBVFVTX0FMTCk7CisJb3V0dygwLGluZm8tPmlvX2Jhc2UgKyBEQVRBUkVHKTsKKworCS8qIEVOQUJMRSBUUkFOU01JVFRFUiAqLworCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbmRGcmFtZSApOworCXVzY19FbmFibGVUcmFuc21pdHRlcihpbmZvLEVOQUJMRV9VTkNPTkRJVElPTkFMKTsKKwkJCQkJCQkKKwkvKiBXQUlUIEZPUiBSRUNFSVZFIENPTVBMRVRFICovCisJZm9yIChpPTAgOyBpPDEwMDAgOyBpKyspCisJCWlmICh1c2NfSW5SZWcoIGluZm8sIFJDU1IgKSAmIChCSVQ4ICsgQklUNCArIEJJVDMgKyBCSVQxKSkKKwkJCWJyZWFrOworCisJLyogY2xlYXIgSW50ZXJuYWwgRGF0YSBsb29wYmFjayBtb2RlICovCisJdXNjX2VuYWJsZV9sb29wYmFjayhpbmZvLCAwKTsKKworCXVzY19FbmFibGVNYXN0ZXJJcnFCaXQoaW5mbyk7CisKKwlpbmZvLT5wYXJhbXMubW9kZSA9IG9sZG1vZGU7CisKK30JLyogZW5kIG9mIHVzY19sb29wYmFja19mcmFtZSgpICovCisKKy8qIHVzY19zZXRfc3luY19tb2RlKCkJUHJvZ3JhbXMgdGhlIFVTQyBmb3IgU0RMQyBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gYWRhcHRlciBpbmZvIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zZXRfc3luY19tb2RlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXVzY19sb29wYmFja19mcmFtZSggaW5mbyApOworCXVzY19zZXRfc2RsY19tb2RlKCBpbmZvICk7CisKKwlpZiAoaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9JU0EpIHsKKwkJLyogRW5hYmxlIElOVEVOIChQb3J0IDYsIEJpdDEyKSAqLworCQkvKiBUaGlzIGNvbm5lY3RzIHRoZSBJUlEgcmVxdWVzdCBzaWduYWwgdG8gdGhlIElTQSBidXMgKi8KKwkJdXNjX091dFJlZyhpbmZvLCBQQ1IsICh1MTYpKCh1c2NfSW5SZWcoaW5mbywgUENSKSB8IEJJVDEzKSAmIH5CSVQxMikpOworCX0KKworCXVzY19lbmFibGVfYXV4X2Nsb2NrKGluZm8sIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrKQorCQl1c2NfZW5hYmxlX2xvb3BiYWNrKGluZm8sMSk7CisKK30JLyogZW5kIG9mIG1nc2xfc2V0X3N5bmNfbW9kZSgpICovCisKKy8qIHVzY19zZXRfdHhpZGxlKCkJU2V0IHRoZSBIRExDIGlkbGUgbW9kZSBmb3IgdGhlIHRyYW5zbWl0dGVyLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zZXRfdHhpZGxlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXUxNiB1c2NfaWRsZV9tb2RlID0gSURMRU1PREVfRkxBR1M7CisKKwkvKiBNYXAgQVBJIGlkbGUgbW9kZSB0byBVU0MgcmVnaXN0ZXIgYml0cyAqLworCisJc3dpdGNoKCBpbmZvLT5pZGxlX21vZGUgKXsKKwljYXNlIEhETENfVFhJRExFX0ZMQUdTOgkJCXVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9GTEFHUzsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzoJdXNjX2lkbGVfbW9kZSA9IElETEVNT0RFX0FMVF9PTkVfWkVSTzsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9aRVJPUzoJCQl1c2NfaWRsZV9tb2RlID0gSURMRU1PREVfWkVSTzsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9PTkVTOgkJCXVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9PTkU7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfQUxUX01BUktfU1BBQ0U6CXVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9BTFRfTUFSS19TUEFDRTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9TUEFDRToJCQl1c2NfaWRsZV9tb2RlID0gSURMRU1PREVfU1BBQ0U7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfTUFSSzoJCQl1c2NfaWRsZV9tb2RlID0gSURMRU1PREVfTUFSSzsgYnJlYWs7CisJfQorCisJaW5mby0+dXNjX2lkbGVfbW9kZSA9IHVzY19pZGxlX21vZGU7CisJLy91c2NfT3V0UmVnKGluZm8sIFRDU1IsIHVzY19pZGxlX21vZGUpOworCWluZm8tPnRjc3JfdmFsdWUgJj0gfklETEVNT0RFX01BU0s7CS8qIGNsZWFyIGlkbGUgbW9kZSBiaXRzICovCisJaW5mby0+dGNzcl92YWx1ZSArPSB1c2NfaWRsZV9tb2RlOworCXVzY19PdXRSZWcoaW5mbywgVENTUiwgaW5mby0+dGNzcl92YWx1ZSk7CisKKwkvKgorCSAqIGlmIFN5bmNMaW5rIFdBTiBhZGFwdGVyIGlzIHJ1bm5pbmcgaW4gZXh0ZXJuYWwgc3luYyBtb2RlLCB0aGUKKwkgKiB0cmFuc21pdHRlciBoYXMgYmVlbiBzZXQgdG8gTW9ub3N5bmMgaW4gb3JkZXIgdG8gdHJ5IHRvIG1pbWljCisJICogYSB0cnVlIHJhdyBvdXRib3VuZCBiaXQgc3RyZWFtLiBNb25vc3luYyBzdGlsbCBzZW5kcyBhbiBvcGVuL2Nsb3NlCisJICogc3luYyBjaGFyIGF0IHRoZSBzdGFydC9lbmQgb2YgYSBmcmFtZS4gVHJ5IHRvIG1hdGNoIHRob3NlIHN5bmMKKwkgKiBwYXR0ZXJucyB0byB0aGUgaWRsZSBtb2RlIHNldCBoZXJlCisJICovCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkgeworCQl1bnNpZ25lZCBjaGFyIHN5bmNwYXQgPSAwOworCQlzd2l0Y2goIGluZm8tPmlkbGVfbW9kZSApIHsKKwkJY2FzZSBIRExDX1RYSURMRV9GTEFHUzoKKwkJCXN5bmNwYXQgPSAweDdlOworCQkJYnJlYWs7CisJCWNhc2UgSERMQ19UWElETEVfQUxUX1pFUk9TX09ORVM6CisJCQlzeW5jcGF0ID0gMHg1NTsKKwkJCWJyZWFrOworCQljYXNlIEhETENfVFhJRExFX1pFUk9TOgorCQljYXNlIEhETENfVFhJRExFX1NQQUNFOgorCQkJc3luY3BhdCA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSBIRExDX1RYSURMRV9PTkVTOgorCQljYXNlIEhETENfVFhJRExFX01BUks6CisJCQlzeW5jcGF0ID0gMHhmZjsKKwkJCWJyZWFrOworCQljYXNlIEhETENfVFhJRExFX0FMVF9NQVJLX1NQQUNFOgorCQkJc3luY3BhdCA9IDB4YWE7CisJCQlicmVhazsKKwkJfQorCisJCXVzY19TZXRUcmFuc21pdFN5bmNDaGFycyhpbmZvLHN5bmNwYXQsc3luY3BhdCk7CisJfQorCit9CS8qIGVuZCBvZiB1c2Nfc2V0X3R4aWRsZSgpICovCisKKy8qIHVzY19nZXRfc2VyaWFsX3NpZ25hbHMoKQorICoKKyAqCVF1ZXJ5IHRoZSBhZGFwdGVyIGZvciB0aGUgc3RhdGUgb2YgdGhlIFYyNCBzdGF0dXMgKGlucHV0KSBzaWduYWxzLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19nZXRfc2VyaWFsX3NpZ25hbHMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IHN0YXR1czsKKworCS8qIGNsZWFyIGFsbCBzZXJpYWwgc2lnbmFscyBleGNlcHQgRFRSIGFuZCBSVFMgKi8KKwlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSBTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUzsKKworCS8qIFJlYWQgdGhlIE1pc2MgSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAoTUlTUikgdG8gZ2V0ICovCisJLyogdGhlIFYyNCBzdGF0dXMgc2lnbmFscy4gKi8KKworCXN0YXR1cyA9IHVzY19JblJlZyggaW5mbywgTUlTUiApOworCisJLyogc2V0IHNlcmlhbCBzaWduYWwgYml0cyB0byByZWZsZWN0IE1JU1IgKi8KKworCWlmICggc3RhdHVzICYgTUlTQ1NUQVRVU19DVFMgKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfQ1RTOworCisJaWYgKCBzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRCApCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EQ0Q7CisKKwlpZiAoIHN0YXR1cyAmIE1JU0NTVEFUVVNfUkkgKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUkk7CisKKwlpZiAoIHN0YXR1cyAmIE1JU0NTVEFUVVNfRFNSICkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RTUjsKKworfQkvKiBlbmQgb2YgdXNjX2dldF9zZXJpYWxfc2lnbmFscygpICovCisKKy8qIHVzY19zZXRfc2VyaWFsX3NpZ25hbHMoKQorICoKKyAqCVNldCB0aGUgc3RhdGUgb2YgRFRSIGFuZCBSVFMgYmFzZWQgb24gY29udGVudHMgb2YKKyAqCXNlcmlhbF9zaWduYWxzIG1lbWJlciBvZiBkZXZpY2UgZXh0ZW5zaW9uLgorICoJCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXUxNiBDb250cm9sOworCXVuc2lnbmVkIGNoYXIgVjI0T3V0ID0gaW5mby0+c2VyaWFsX3NpZ25hbHM7CisKKwkvKiBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFBvcnQgQ29udHJvbCBSZWdpc3RlciAoUENSKSAqLworCisJQ29udHJvbCA9IHVzY19JblJlZyggaW5mbywgUENSICk7CisKKwlpZiAoIFYyNE91dCAmIFNlcmlhbFNpZ25hbF9SVFMgKQorCQlDb250cm9sICY9IH4oQklUNik7CisJZWxzZQorCQlDb250cm9sIHw9IEJJVDY7CisKKwlpZiAoIFYyNE91dCAmIFNlcmlhbFNpZ25hbF9EVFIgKQorCQlDb250cm9sICY9IH4oQklUNCk7CisJZWxzZQorCQlDb250cm9sIHw9IEJJVDQ7CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBQQ1IsIENvbnRyb2wgKTsKKworfQkvKiBlbmQgb2YgdXNjX3NldF9zZXJpYWxfc2lnbmFscygpICovCisKKy8qIHVzY19lbmFibGVfYXN5bmNfY2xvY2soKQorICoKKyAqCUVuYWJsZSB0aGUgYXN5bmMgY2xvY2sgYXQgdGhlIHNwZWNpZmllZCBmcmVxdWVuY3kuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICoJCQlkYXRhX3JhdGUJZGF0YSByYXRlIG9mIGNsb2NrIGluIGJwcworICoJCQkJCTAgZGlzYWJsZXMgdGhlIEFVWCBjbG9jay4KKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2NfZW5hYmxlX2FzeW5jX2Nsb2NrKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUzMiBkYXRhX3JhdGUgKQoreworCWlmICggZGF0YV9yYXRlICkJeworCQkvKgorCQkgKiBDbG9jayBtb2RlIENvbnRyb2wgUmVnaXN0ZXIgKENNQ1IpCisJCSAqIAorCQkgKiA8MTUuLjE0PiAgICAgMDAgICAgICBjb3VudGVyIDEgRGlzYWJsZWQKKwkJICogPDEzLi4xMj4gICAgIDAwICAgICAgY291bnRlciAwIERpc2FibGVkCisJCSAqIDwxMS4uMTA+ICAgICAxMSAgICAgIEJSRzEgSW5wdXQgaXMgVHhDIFBpbgorCQkgKiA8OS4uOD4gICAgICAgMTEgICAgICBCUkcwIElucHV0IGlzIFR4QyBQaW4KKwkJICogPDcuLjY+ICAgICAgIDAxICAgICAgRFBMTCBJbnB1dCBpcyBCUkcxIE91dHB1dAorCQkgKiA8NS4uMz4gICAgICAgMTAwICAgICBUeENMSyBjb21lcyBmcm9tIEJSRzAKKwkJICogPDIuLjA+ICAgICAgIDEwMCAgICAgUnhDTEsgY29tZXMgZnJvbSBCUkcwCisJCSAqCisJCSAqIDAwMDAgMTExMSAwMTEwIDAxMDAgPSAweDBmNjQKKwkJICovCisJCQorCQl1c2NfT3V0UmVnKCBpbmZvLCBDTUNSLCAweDBmNjQgKTsKKworCisJCS8qCisJCSAqIFdyaXRlIDE2LWJpdCBUaW1lIENvbnN0YW50IGZvciBCUkcwCisJCSAqIFRpbWUgQ29uc3RhbnQgPSAoQ2xrU3BlZWQgLyBkYXRhX3JhdGUpIC0gMQorCQkgKiBDbGtTcGVlZCA9IDkyMTYwMCAoSVNBKSwgNjkxMjAwIChQQ0kpCisJCSAqLworCisJCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQkJdXNjX091dFJlZyggaW5mbywgVEMwUiwgKHUxNikoKDY5MTIwMC9kYXRhX3JhdGUpIC0gMSkgKTsKKwkJZWxzZQorCQkJdXNjX091dFJlZyggaW5mbywgVEMwUiwgKHUxNikoKDkyMTYwMC9kYXRhX3JhdGUpIC0gMSkgKTsKKworCQkKKwkJLyoKKwkJICogSGFyZHdhcmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSENSKQorCQkgKiBDbGVhciBCaXQgMSwgQlJHMCBtb2RlID0gQ29udGludW91cworCQkgKiBTZXQgQml0IDAgdG8gZW5hYmxlIEJSRzAuCisJCSAqLworCisJCXVzY19PdXRSZWcoIGluZm8sIEhDUiwKKwkJCSAgICAodTE2KSgodXNjX0luUmVnKCBpbmZvLCBIQ1IgKSAmIH5CSVQxKSB8IEJJVDApICk7CisKKworCQkvKiBJbnB1dC9PdXRwdXQgQ29udHJvbCBSZWcsIDwyLi4wPiA9IDEwMCwgRHJpdmUgUnhDIHBpbiB3aXRoIEJSRzAgKi8KKworCQl1c2NfT3V0UmVnKCBpbmZvLCBJT0NSLAorCQkJICAgICh1MTYpKCh1c2NfSW5SZWcoaW5mbywgSU9DUikgJiAweGZmZjgpIHwgMHgwMDA0KSApOworCX0gZWxzZSB7CisJCS8qIGRhdGEgcmF0ZSA9PSAwIHNvIHR1cm4gb2ZmIEJSRzAgKi8KKwkJdXNjX091dFJlZyggaW5mbywgSENSLCAodTE2KSh1c2NfSW5SZWcoIGluZm8sIEhDUiApICYgfkJJVDApICk7CisJfQorCit9CS8qIGVuZCBvZiB1c2NfZW5hYmxlX2FzeW5jX2Nsb2NrKCkgKi8KKworLyoKKyAqIEJ1ZmZlciBTdHJ1Y3R1cmVzOgorICoKKyAqIE5vcm1hbCBtZW1vcnkgYWNjZXNzIHVzZXMgdmlydHVhbCBhZGRyZXNzZXMgdGhhdCBjYW4gbWFrZSBkaXNjb250aWd1b3VzCisgKiBwaHlzaWNhbCBtZW1vcnkgcGFnZXMgYXBwZWFyIHRvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIHZpcnR1YWwgYWRkcmVzcworICogc3BhY2UgKHRoZSBwcm9jZXNzb3JzIG1lbW9yeSBtYXBwaW5nIGhhbmRsZXMgdGhlIGNvbnZlcnNpb25zKS4KKyAqCisgKiBETUEgdHJhbnNmZXJzIHJlcXVpcmUgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeS4gVGhpcyBpcyBiZWNhdXNlCisgKiB0aGUgRE1BIHN5c3RlbSBjb250cm9sbGVyIGFuZCBETUEgYnVzIG1hc3RlcnMgZGVhbCB3aXRoIG1lbW9yeSB1c2luZworICogb25seSBwaHlzaWNhbCBhZGRyZXNzZXMuCisgKgorICogVGhpcyBjYXVzZXMgYSBwcm9ibGVtIHVuZGVyIFdpbmRvd3MgTlQgd2hlbiBsYXJnZSBETUEgYnVmZmVycyBhcmUKKyAqIG5lZWRlZC4gRnJhZ21lbnRhdGlvbiBvZiB0aGUgbm9ucGFnZWQgcG9vbCBwcmV2ZW50cyBhbGxvY2F0aW9ucyBvZgorICogcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gdGhlIFBBR0VfU0laRS4KKyAqCisgKiBIb3dldmVyIHRoZSAxNkMzMiBzdXBwb3J0cyBCdXMgTWFzdGVyIFNjYXR0ZXIvR2F0aGVyIERNQSB3aGljaAorICogYWxsb3dzIERNQSB0cmFuc2ZlcnMgdG8gcGh5c2ljYWxseSBkaXNjb250aWd1b3VzIGJ1ZmZlcnMuIEluZm9ybWF0aW9uCisgKiBhYm91dCBlYWNoIGRhdGEgdHJhbnNmZXIgYnVmZmVyIGlzIGNvbnRhaW5lZCBpbiBhIG1lbW9yeSBzdHJ1Y3R1cmUKKyAqIGNhbGxlZCBhICdidWZmZXIgZW50cnknLiBBIGxpc3Qgb2YgYnVmZmVyIGVudHJpZXMgaXMgbWFpbnRhaW5lZAorICogdG8gdHJhY2sgYW5kIGNvbnRyb2wgdGhlIHVzZSBvZiB0aGUgZGF0YSB0cmFuc2ZlciBidWZmZXJzLgorICoKKyAqIFRvIHN1cHBvcnQgdGhpcyBzdHJhdGVneSB3ZSB3aWxsIGFsbG9jYXRlIHN1ZmZpY2llbnQgUEFHRV9TSVpFCisgKiBjb250aWd1b3VzIG1lbW9yeSBidWZmZXJzIHRvIGFsbG93IGZvciB0aGUgdG90YWwgcmVxdWlyZWQgYnVmZmVyCisgKiBzcGFjZS4KKyAqCisgKiBUaGUgMTZDMzIgYWNjZXNzZXMgdGhlIGxpc3Qgb2YgYnVmZmVyIGVudHJpZXMgdXNpbmcgQnVzIE1hc3RlcgorICogRE1BLiBDb250cm9sIGluZm9ybWF0aW9uIGlzIHJlYWQgZnJvbSB0aGUgYnVmZmVyIGVudHJpZXMgYnkgdGhlCisgKiAxNkMzMiB0byBjb250cm9sIGRhdGEgdHJhbnNmZXJzLiBzdGF0dXMgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiB0bworICogdGhlIGJ1ZmZlciBlbnRyaWVzIGJ5IHRoZSAxNkMzMiB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIGNvbXBsZXRlZAorICogdHJhbnNmZXJzLgorICoKKyAqIFRoZSBDUFUgd3JpdGVzIGNvbnRyb2wgaW5mb3JtYXRpb24gdG8gdGhlIGJ1ZmZlciBlbnRyaWVzIHRvIGNvbnRyb2wKKyAqIHRoZSAxNkMzMiBhbmQgcmVhZHMgc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gdGhlIGJ1ZmZlciBlbnRyaWVzIHRvCisgKiBkZXRlcm1pbmUgaW5mb3JtYXRpb24gYWJvdXQgcmVjZWl2ZWQgYW5kIHRyYW5zbWl0dGVkIGZyYW1lcy4KKyAqCisgKiBCZWNhdXNlIHRoZSBDUFUgYW5kIDE2QzMyIChhZGFwdGVyKSBib3RoIG5lZWQgc2ltdWx0YW5lb3VzIGFjY2VzcworICogdG8gdGhlIGJ1ZmZlciBlbnRyaWVzLCB0aGUgYnVmZmVyIGVudHJ5IG1lbW9yeSBpcyBhbGxvY2F0ZWQgd2l0aAorICogSGFsQWxsb2NhdGVDb21tb25CdWZmZXIoKS4gVGhpcyByZXN0cmljdHMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogZW50cnkgbGlzdCB0byBQQUdFX1NJWkUuCisgKgorICogVGhlIGFjdHVhbCBkYXRhIGJ1ZmZlcnMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBvbmx5IGJlIGFjY2Vzc2VkCisgKiBieSB0aGUgQ1BVIG9yIHRoZSBhZGFwdGVyIGJ1dCBub3QgYnkgYm90aCBzaW11bHRhbmVvdXNseS4gVGhpcyBhbGxvd3MKKyAqIFNjYXR0ZXIvR2F0aGVyIHBhY2tldCBiYXNlZCBETUEgcHJvY2VkdXJlcyBmb3IgdXNpbmcgcGh5c2ljYWxseQorICogZGlzY29udGlndW91cyBwYWdlcy4KKyAqLworCisvKgorICogbWdzbF9yZXNldF90eF9kbWFfYnVmZmVycygpCisgKgorICogCVNldCB0aGUgY291bnQgZm9yIGFsbCB0cmFuc21pdCBidWZmZXJzIHRvIDAgdG8gaW5kaWNhdGUgdGhlCisgKiAJYnVmZmVyIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGFuZCBzZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIHRoZQorICogCWZpcnN0IGJ1ZmZlci4gVGhpcyBlZmZlY3RpdmVseSBtYWtlcyBhbGwgYnVmZmVycyBmcmVlIGFuZAorICogCWRpc2NhcmRzIGFueSBkYXRhIGluIGJ1ZmZlcnMuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9yZXNldF90eF9kbWFfYnVmZmVycyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoIGkgPSAwOyBpIDwgaW5mby0+dHhfYnVmZmVyX2NvdW50OyBpKysgKSB7CisJCSooKHVuc2lnbmVkIGxvbmcgKikmKGluZm8tPnR4X2J1ZmZlcl9saXN0W2ldLmNvdW50KSkgPSAwOworCX0KKworCWluZm8tPmN1cnJlbnRfdHhfYnVmZmVyID0gMDsKKwlpbmZvLT5zdGFydF90eF9kbWFfYnVmZmVyID0gMDsKKwlpbmZvLT50eF9kbWFfYnVmZmVyc191c2VkID0gMDsKKworCWluZm8tPmdldF90eF9ob2xkaW5nX2luZGV4ID0gMDsKKwlpbmZvLT5wdXRfdHhfaG9sZGluZ19pbmRleCA9IDA7CisJaW5mby0+dHhfaG9sZGluZ19jb3VudCA9IDA7CisKK30JLyogZW5kIG9mIG1nc2xfcmVzZXRfdHhfZG1hX2J1ZmZlcnMoKSAqLworCisvKgorICogbnVtX2ZyZWVfdHhfZG1hX2J1ZmZlcnMoKQorICoKKyAqIAlyZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZSB0eCBkbWEgYnVmZmVycyBhdmFpbGFibGUKKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJbnVtYmVyIG9mIGZyZWUgdHggZG1hIGJ1ZmZlcnMKKyAqLworc3RhdGljIGludCBudW1fZnJlZV90eF9kbWFfYnVmZmVycyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJcmV0dXJuIGluZm8tPnR4X2J1ZmZlcl9jb3VudCAtIGluZm8tPnR4X2RtYV9idWZmZXJzX3VzZWQ7Cit9CisKKy8qCisgKiBtZ3NsX3Jlc2V0X3J4X2RtYV9idWZmZXJzKCkKKyAqIAorICogCVNldCB0aGUgY291bnQgZm9yIGFsbCByZWNlaXZlIGJ1ZmZlcnMgdG8gRE1BQlVGRkVSU0laRQorICogCWFuZCBzZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIHRoZSBmaXJzdCBidWZmZXIuIFRoaXMgZWZmZWN0aXZlbHkKKyAqIAltYWtlcyBhbGwgYnVmZmVycyBmcmVlIGFuZCBkaXNjYXJkcyBhbnkgZGF0YSBpbiBidWZmZXJzLgorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3Jlc2V0X3J4X2RtYV9idWZmZXJzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yICggaSA9IDA7IGkgPCBpbmZvLT5yeF9idWZmZXJfY291bnQ7IGkrKyApIHsKKwkJKigodW5zaWduZWQgbG9uZyAqKSYoaW5mby0+cnhfYnVmZmVyX2xpc3RbaV0uY291bnQpKSA9IERNQUJVRkZFUlNJWkU7CisvLwkJaW5mby0+cnhfYnVmZmVyX2xpc3RbaV0uY291bnQgPSBETUFCVUZGRVJTSVpFOworLy8JCWluZm8tPnJ4X2J1ZmZlcl9saXN0W2ldLnN0YXR1cyA9IDA7CisJfQorCisJaW5mby0+Y3VycmVudF9yeF9idWZmZXIgPSAwOworCit9CS8qIGVuZCBvZiBtZ3NsX3Jlc2V0X3J4X2RtYV9idWZmZXJzKCkgKi8KKworLyoKKyAqIG1nc2xfZnJlZV9yeF9mcmFtZV9idWZmZXJzKCkKKyAqIAorICogCUZyZWUgdGhlIHJlY2VpdmUgYnVmZmVycyB1c2VkIGJ5IGEgcmVjZWl2ZWQgU0RMQworICogCWZyYW1lIHN1Y2ggdGhhdCB0aGUgYnVmZmVycyBjYW4gYmUgcmV1c2VkLgorICogCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlpbmZvCQkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCVN0YXJ0SW5kZXgJCWluZGV4IG9mIDFzdCByZWNlaXZlIGJ1ZmZlciBvZiBmcmFtZQorICogCUVuZEluZGV4CQlpbmRleCBvZiBsYXN0IHJlY2VpdmUgYnVmZmVyIG9mIGZyYW1lCisgKiAKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfcnhfZnJhbWVfYnVmZmVycyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IEVuZEluZGV4ICkKK3sKKwlpbnQgRG9uZSA9IDA7CisJRE1BQlVGRkVSRU5UUlkgKnBCdWZFbnRyeTsKKwl1bnNpZ25lZCBpbnQgSW5kZXg7CisKKwkvKiBTdGFydGluZyB3aXRoIDFzdCBidWZmZXIgZW50cnkgb2YgdGhlIGZyYW1lIGNsZWFyIHRoZSBzdGF0dXMgKi8KKwkvKiBmaWVsZCBhbmQgc2V0IHRoZSBjb3VudCBmaWVsZCB0byBETUEgQnVmZmVyIFNpemUuICovCisKKwlJbmRleCA9IFN0YXJ0SW5kZXg7CisKKwl3aGlsZSggIURvbmUgKSB7CisJCXBCdWZFbnRyeSA9ICYoaW5mby0+cnhfYnVmZmVyX2xpc3RbSW5kZXhdKTsKKworCQlpZiAoIEluZGV4ID09IEVuZEluZGV4ICkgeworCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBidWZmZXIgb2YgdGhlIGZyYW1lISAqLworCQkJRG9uZSA9IDE7CisJCX0KKworCQkvKiByZXNldCBjdXJyZW50IGJ1ZmZlciBmb3IgcmV1c2UgKi8KKy8vCQlwQnVmRW50cnktPnN0YXR1cyA9IDA7CisvLwkJcEJ1ZkVudHJ5LT5jb3VudCA9IERNQUJVRkZFUlNJWkU7CisJCSooKHVuc2lnbmVkIGxvbmcgKikmKHBCdWZFbnRyeS0+Y291bnQpKSA9IERNQUJVRkZFUlNJWkU7CisKKwkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciBlbnRyeSBpbiBsaW5rZWQgbGlzdCAqLworCQlJbmRleCsrOworCQlpZiAoIEluZGV4ID09IGluZm8tPnJ4X2J1ZmZlcl9jb3VudCApCisJCQlJbmRleCA9IDA7CisJfQorCisJLyogc2V0IGN1cnJlbnQgYnVmZmVyIHRvIG5leHQgYnVmZmVyIGFmdGVyIGxhc3QgYnVmZmVyIG9mIGZyYW1lICovCisJaW5mby0+Y3VycmVudF9yeF9idWZmZXIgPSBJbmRleDsKKworfQkvKiBlbmQgb2YgZnJlZV9yeF9mcmFtZV9idWZmZXJzKCkgKi8KKworLyogbWdzbF9nZXRfcnhfZnJhbWUoKQorICogCisgKiAJVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZXR1cm4gYSByZWNlaXZlZCBTRExDIGZyYW1lIGZyb20gdGhlCisgKiAJcmVjZWl2ZSBETUEgYnVmZmVycy4gT25seSBmcmFtZXMgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgYXJlIHJldHVybmVkLgorICoKKyAqIEFyZ3VtZW50czoJIAlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbgorICogUmV0dXJuIFZhbHVlOgkxIGlmIGZyYW1lIHJldHVybmVkLCBvdGhlcndpc2UgMAorICovCitzdGF0aWMgaW50IG1nc2xfZ2V0X3J4X2ZyYW1lKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgU3RhcnRJbmRleCwgRW5kSW5kZXg7CS8qIGluZGV4IG9mIDFzdCBhbmQgbGFzdCBidWZmZXJzIG9mIFJ4IGZyYW1lICovCisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCURNQUJVRkZFUkVOVFJZICpwQnVmRW50cnk7CisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSA9IDA7CisJaW50IFJldHVybkNvZGUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpbnQgcmV0dXJuX2ZyYW1lID0gMDsKKwkKKwkvKgorCSAqIGN1cnJlbnRfcnhfYnVmZmVyIHBvaW50cyB0byB0aGUgMXN0IGJ1ZmZlciBvZiB0aGUgbmV4dCBhdmFpbGFibGUKKwkgKiByZWNlaXZlIGZyYW1lLiBUbyBmaW5kIHRoZSBsYXN0IGJ1ZmZlciBvZiB0aGUgZnJhbWUgbG9vayBmb3IKKwkgKiBhIG5vbi16ZXJvIHN0YXR1cyBmaWVsZCBpbiB0aGUgYnVmZmVyIGVudHJpZXMuIChUaGUgc3RhdHVzCisJICogZmllbGQgaXMgc2V0IGJ5IHRoZSAxNkMzMiBhZnRlciBjb21wbGV0aW5nIGEgcmVjZWl2ZSBmcmFtZS4KKwkgKi8KKworCVN0YXJ0SW5kZXggPSBFbmRJbmRleCA9IGluZm8tPmN1cnJlbnRfcnhfYnVmZmVyOworCisJd2hpbGUoICFpbmZvLT5yeF9idWZmZXJfbGlzdFtFbmRJbmRleF0uc3RhdHVzICkgeworCQkvKgorCQkgKiBJZiB0aGUgY291bnQgZmllbGQgb2YgdGhlIGJ1ZmZlciBlbnRyeSBpcyBub24temVybyB0aGVuCisJCSAqIHRoaXMgYnVmZmVyIGhhcyBub3QgYmVlbiB1c2VkLiAoVGhlIDE2QzMyIGNsZWFycyB0aGUgY291bnQKKwkJICogZmllbGQgd2hlbiBpdCBzdGFydHMgdXNpbmcgdGhlIGJ1ZmZlci4pIElmIGFuIHVudXNlZCBidWZmZXIKKwkJICogaXMgZW5jb3VudGVyZWQgdGhlbiB0aGVyZSBhcmUgbm8gZnJhbWVzIGF2YWlsYWJsZS4KKwkJICovCisKKwkJaWYgKCBpbmZvLT5yeF9idWZmZXJfbGlzdFtFbmRJbmRleF0uY291bnQgKQorCQkJZ290byBDbGVhbnVwOworCisJCS8qIGFkdmFuY2UgdG8gbmV4dCBidWZmZXIgZW50cnkgaW4gbGlua2VkIGxpc3QgKi8KKwkJRW5kSW5kZXgrKzsKKwkJaWYgKCBFbmRJbmRleCA9PSBpbmZvLT5yeF9idWZmZXJfY291bnQgKQorCQkJRW5kSW5kZXggPSAwOworCisJCS8qIGlmIGVudGlyZSBsaXN0IHNlYXJjaGVkIHRoZW4gbm8gZnJhbWUgYXZhaWxhYmxlICovCisJCWlmICggRW5kSW5kZXggPT0gU3RhcnRJbmRleCApIHsKKwkJCS8qIElmIHRoaXMgb2NjdXJzIHRoZW4gc29tZXRoaW5nIGJhZCBoYXBwZW5lZCwKKwkJCSAqIGFsbCBidWZmZXJzIGhhdmUgYmVlbiAndXNlZCcgYnV0IG5vbmUgbWFyaworCQkJICogdGhlIGVuZCBvZiBhIGZyYW1lLiBSZXNldCBidWZmZXJzIGFuZCByZWNlaXZlci4KKwkJCSAqLworCisJCQlpZiAoIGluZm8tPnJ4X2VuYWJsZWQgKXsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCQl1c2Nfc3RhcnRfcmVjZWl2ZXIoaW5mbyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCX0KKwkJCWdvdG8gQ2xlYW51cDsKKwkJfQorCX0KKworCisJLyogY2hlY2sgc3RhdHVzIG9mIHJlY2VpdmUgZnJhbWUgKi8KKwkKKwlzdGF0dXMgPSBpbmZvLT5yeF9idWZmZXJfbGlzdFtFbmRJbmRleF0uc3RhdHVzOworCisJaWYgKCBzdGF0dXMgJiAoUlhTVEFUVVNfU0hPUlRfRlJBTUUgKyBSWFNUQVRVU19PVkVSUlVOICsKKwkJCVJYU1RBVFVTX0NSQ19FUlJPUiArIFJYU1RBVFVTX0FCT1JUKSApIHsKKwkJaWYgKCBzdGF0dXMgJiBSWFNUQVRVU19TSE9SVF9GUkFNRSApCisJCQlpbmZvLT5pY291bnQucnhzaG9ydCsrOworCQllbHNlIGlmICggc3RhdHVzICYgUlhTVEFUVVNfQUJPUlQgKQorCQkJaW5mby0+aWNvdW50LnJ4YWJvcnQrKzsKKwkJZWxzZSBpZiAoIHN0YXR1cyAmIFJYU1RBVFVTX09WRVJSVU4gKQorCQkJaW5mby0+aWNvdW50LnJ4b3ZlcisrOworCQllbHNlIHsKKwkJCWluZm8tPmljb3VudC5yeGNyYysrOworCQkJaWYgKCBpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVggKQorCQkJCXJldHVybl9mcmFtZSA9IDE7CisJCX0KKwkJZnJhbWVzaXplID0gMDsKKyNpZmRlZiBDT05GSUdfSERMQworCQl7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJCX0KKyNlbmRpZgorCX0gZWxzZQorCQlyZXR1cm5fZnJhbWUgPSAxOworCisJaWYgKCByZXR1cm5fZnJhbWUgKSB7CisJCS8qIHJlY2VpdmUgZnJhbWUgaGFzIG5vIGVycm9ycywgZ2V0IGZyYW1lIHNpemUuCisJCSAqIFRoZSBmcmFtZSBzaXplIGlzIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgUkNDICh3aGljaCB3YXMKKwkJICogc2V0IHRvIDB4ZmZmZikgbWludXMgdGhlIGVuZGluZyB2YWx1ZSBvZiB0aGUgUkNDIChkZWNyZW1lbnRlZAorCQkgKiBvbmNlIGZvciBlYWNoIHJlY2VpdmUgY2hhcmFjdGVyKSBtaW51cyAyIGZvciB0aGUgMTYtYml0IENSQy4KKwkJICovCisKKwkJZnJhbWVzaXplID0gUkNMUlZBTFVFIC0gaW5mby0+cnhfYnVmZmVyX2xpc3RbRW5kSW5kZXhdLnJjYzsKKworCQkvKiBhZGp1c3QgZnJhbWUgc2l6ZSBmb3IgQ1JDIGlmIGFueSAqLworCQlpZiAoIGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18xNl9DQ0lUVCApCisJCQlmcmFtZXNpemUgLT0gMjsKKwkJZWxzZSBpZiAoIGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18zMl9DQ0lUVCApCisJCQlmcmFtZXNpemUgLT0gNDsJCQorCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF9yeF9mcmFtZSglcykgc3RhdHVzPSUwNFggc2l6ZT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyxmcmFtZXNpemUpOworCQkJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9EQVRBICkKKwkJbWdzbF90cmFjZV9ibG9jayhpbmZvLGluZm8tPnJ4X2J1ZmZlcl9saXN0W1N0YXJ0SW5kZXhdLnZpcnRfYWRkciwKKwkJCW1pbl90KGludCwgZnJhbWVzaXplLCBETUFCVUZGRVJTSVpFKSwwKTsKKwkJCisJaWYgKGZyYW1lc2l6ZSkgeworCQlpZiAoICggKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCkgJiYKKwkJCQkoKGZyYW1lc2l6ZSsxKSA+IGluZm8tPm1heF9mcmFtZV9zaXplKSApIHx8CisJCQkoZnJhbWVzaXplID4gaW5mby0+bWF4X2ZyYW1lX3NpemUpICkKKwkJCWluZm8tPmljb3VudC5yeGxvbmcrKzsKKwkJZWxzZSB7CisJCQkvKiBjb3B5IGRtYSBidWZmZXIocykgdG8gY29udGlndW91cyBpbnRlcm1lZGlhdGUgYnVmZmVyICovCisJCQlpbnQgY29weV9jb3VudCA9IGZyYW1lc2l6ZTsKKwkJCWludCBpbmRleCA9IFN0YXJ0SW5kZXg7CisJCQl1bnNpZ25lZCBjaGFyICpwdG1wID0gaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyOworCisJCQlpZiAoICEoc3RhdHVzICYgUlhTVEFUVVNfQ1JDX0VSUk9SKSkKKwkJCWluZm8tPmljb3VudC5yeG9rKys7CisJCQkKKwkJCXdoaWxlKGNvcHlfY291bnQpIHsKKwkJCQlpbnQgcGFydGlhbF9jb3VudDsKKwkJCQlpZiAoIGNvcHlfY291bnQgPiBETUFCVUZGRVJTSVpFICkKKwkJCQkJcGFydGlhbF9jb3VudCA9IERNQUJVRkZFUlNJWkU7CisJCQkJZWxzZQorCQkJCQlwYXJ0aWFsX2NvdW50ID0gY29weV9jb3VudDsKKwkJCQorCQkJCXBCdWZFbnRyeSA9ICYoaW5mby0+cnhfYnVmZmVyX2xpc3RbaW5kZXhdKTsKKwkJCQltZW1jcHkoIHB0bXAsIHBCdWZFbnRyeS0+dmlydF9hZGRyLCBwYXJ0aWFsX2NvdW50ICk7CisJCQkJcHRtcCArPSBwYXJ0aWFsX2NvdW50OworCQkJCWNvcHlfY291bnQgLT0gcGFydGlhbF9jb3VudDsKKwkJCQkKKwkJCQlpZiAoICsraW5kZXggPT0gaW5mby0+cnhfYnVmZmVyX2NvdW50ICkKKwkJCQkJaW5kZXggPSAwOworCQkJfQorCisJCQlpZiAoIGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCApIHsKKwkJCQkrK2ZyYW1lc2l6ZTsKKwkJCQkqcHRtcCA9IChzdGF0dXMgJiBSWFNUQVRVU19DUkNfRVJST1IgPworCQkJCQkJUlhfQ1JDX0VSUk9SIDoKKwkJCQkJCVJYX09LKTsKKworCQkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfREFUQSApCisJCQkJCXByaW50aygiJXMoJWQpOm1nc2xfZ2V0X3J4X2ZyYW1lKCVzKSByeCBmcmFtZSBzdGF0dXM9JWRcbiIsCisJCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwKKwkJCQkJCSpwdG1wKTsKKwkJCX0KKworI2lmZGVmIENPTkZJR19IRExDCisJCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQkJaGRsY2Rldl9yeChpbmZvLGluZm8tPmludGVybWVkaWF0ZV9yeGJ1ZmZlcixmcmFtZXNpemUpOworCQkJZWxzZQorI2VuZGlmCisJCQkJbGRpc2NfcmVjZWl2ZV9idWYodHR5LCBpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIsIGluZm8tPmZsYWdfYnVmLCBmcmFtZXNpemUpOworCQl9CisJfQorCS8qIEZyZWUgdGhlIGJ1ZmZlcnMgdXNlZCBieSB0aGlzIGZyYW1lLiAqLworCW1nc2xfZnJlZV9yeF9mcmFtZV9idWZmZXJzKCBpbmZvLCBTdGFydEluZGV4LCBFbmRJbmRleCApOworCisJUmV0dXJuQ29kZSA9IDE7CisKK0NsZWFudXA6CisKKwlpZiAoIGluZm8tPnJ4X2VuYWJsZWQgJiYgaW5mby0+cnhfb3ZlcmZsb3cgKSB7CisJCS8qIFRoZSByZWNlaXZlciBuZWVkcyB0byByZXN0YXJ0ZWQgYmVjYXVzZSBvZiAKKwkJICogYSByZWNlaXZlIG92ZXJmbG93IChidWZmZXIgb3IgRklGTykuIElmIHRoZSAKKwkJICogcmVjZWl2ZSBidWZmZXJzIGFyZSBub3cgZW1wdHksIHRoZW4gcmVzdGFydCByZWNlaXZlci4KKwkJICovCisKKwkJaWYgKCAhaW5mby0+cnhfYnVmZmVyX2xpc3RbRW5kSW5kZXhdLnN0YXR1cyAmJgorCQkJaW5mby0+cnhfYnVmZmVyX2xpc3RbRW5kSW5kZXhdLmNvdW50ICkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQl1c2Nfc3RhcnRfcmVjZWl2ZXIoaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQl9CisJfQorCisJcmV0dXJuIFJldHVybkNvZGU7CisKK30JLyogZW5kIG9mIG1nc2xfZ2V0X3J4X2ZyYW1lKCkgKi8KKworLyogbWdzbF9nZXRfcmF3X3J4X2ZyYW1lKCkKKyAqCisgKiAgICAgCVRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcmV0dXJuIGEgcmVjZWl2ZWQgZnJhbWUgZnJvbSB0aGUKKyAqCXJlY2VpdmUgRE1BIGJ1ZmZlcnMgd2hlbiBydW5uaW5nIGluIGV4dGVybmFsIGxvb3AgbW9kZS4gSW4gdGhpcyBtb2RlLAorICoJd2Ugd2lsbCByZXR1cm4gYXQgbW9zdCBvbmUgRE1BQlVGRkVSU0laRSBmcmFtZSB0byB0aGUgYXBwbGljYXRpb24uCisgKglUaGUgVVNDIHJlY2VpdmVyIGlzIHRyaWdnZXJpbmcgb2ZmIG9mIERDRCBnb2luZyBhY3RpdmUgdG8gc3RhcnQgYSBuZXcKKyAqCWZyYW1lLCBhbmQgRENEIGdvaW5nIGluYWN0aXZlIHRvIHRlcm1pbmF0ZSB0aGUgZnJhbWUgKHNpbWlsYXIgdG8KKyAqCXByb2Nlc3NpbmcgYSBjbG9zaW5nIGZsYWcgY2hhcmFjdGVyKS4KKyAqCisgKglJbiB0aGlzIHJvdXRpbmUsIHdlIHdpbGwgcmV0dXJuIERNQUJVRkZFUlNJWkUgImNodW5rcyIgYXQgYSB0aW1lLgorICoJSWYgRENEIGdvZXMgaW5hY3RpdmUsIHRoZSBsYXN0IFJ4IERNQSBCdWZmZXIgd2lsbCBoYXZlIGEgbm9uLXplcm8KKyAqIAlzdGF0dXMgZmllbGQgYW5kIHRoZSBSQ0MgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZQorICoJZW50aXJlIHJlY2VpdmVkIGZyYW1lLiBXZSB0YWtlIHRoaXMgUkNDIGZpZWxkIGFuZCBnZXQgdGhlIG1vZHVsdXMKKyAqCW9mIFJDQyBhbmQgRE1BQlVGRkVSU0laRSB0byBkZXRlcm1pbmUgaWYgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICoJbGFzdCBSeCBETUEgYnVmZmVyIGFuZCByZXR1cm4gdGhhdCBsYXN0IHBvcnRpb24gb2YgdGhlIGZyYW1lLgorICoKKyAqIEFyZ3VtZW50czoJIAlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbgorICogUmV0dXJuIFZhbHVlOgkxIGlmIGZyYW1lIHJldHVybmVkLCBvdGhlcndpc2UgMAorICovCitzdGF0aWMgaW50IG1nc2xfZ2V0X3Jhd19yeF9mcmFtZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJdW5zaWduZWQgaW50IEN1cnJlbnRJbmRleCwgTmV4dEluZGV4OworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwlETUFCVUZGRVJFTlRSWSAqcEJ1ZkVudHJ5OworCXVuc2lnbmVkIGludCBmcmFtZXNpemUgPSAwOworCWludCBSZXR1cm5Db2RlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisKKwkvKgorIAkgKiBjdXJyZW50X3J4X2J1ZmZlciBwb2ludHMgdG8gdGhlIDFzdCBidWZmZXIgb2YgdGhlIG5leHQgYXZhaWxhYmxlCisJICogcmVjZWl2ZSBmcmFtZS4gVGhlIHN0YXR1cyBmaWVsZCBpcyBzZXQgYnkgdGhlIDE2QzMyIGFmdGVyCisJICogY29tcGxldGluZyBhIHJlY2VpdmUgZnJhbWUuIElmIHRoZSBzdGF0dXMgZmllbGQgb2YgdGhpcyBidWZmZXIKKwkgKiBpcyB6ZXJvLCBlaXRoZXIgdGhlIFVTQyBpcyBzdGlsbCBmaWxsaW5nIHRoaXMgYnVmZmVyIG9yIHRoaXMKKwkgKiBpcyBvbmUgb2YgYSBzZXJpZXMgb2YgYnVmZmVycyBtYWtpbmcgdXAgYSByZWNlaXZlZCBmcmFtZS4KKwkgKgorCSAqIElmIHRoZSBjb3VudCBmaWVsZCBvZiB0aGlzIGJ1ZmZlciBpcyB6ZXJvLCB0aGUgVVNDIGlzIGVpdGhlcgorCSAqIHVzaW5nIHRoaXMgYnVmZmVyIG9yIGhhcyB1c2VkIHRoaXMgYnVmZmVyLiBMb29rIGF0IHRoZSBjb3VudAorCSAqIGZpZWxkIG9mIHRoZSBuZXh0IGJ1ZmZlci4gSWYgdGhhdCBuZXh0IGJ1ZmZlcidzIGNvdW50IGlzCisJICogbm9uLXplcm8sIHRoZSBVU0MgaXMgc3RpbGwgYWN0aXZlbHkgdXNpbmcgdGhlIGN1cnJlbnQgYnVmZmVyLgorCSAqIE90aGVyd2lzZSwgaWYgdGhlIG5leHQgYnVmZmVyJ3MgY291bnQgZmllbGQgaXMgemVybywgdGhlCisJICogY3VycmVudCBidWZmZXIgaXMgY29tcGxldGUgYW5kIHRoZSBVU0MgaXMgdXNpbmcgdGhlIG5leHQKKwkgKiBidWZmZXIuCisJICovCisJQ3VycmVudEluZGV4ID0gTmV4dEluZGV4ID0gaW5mby0+Y3VycmVudF9yeF9idWZmZXI7CisJKytOZXh0SW5kZXg7CisJaWYgKCBOZXh0SW5kZXggPT0gaW5mby0+cnhfYnVmZmVyX2NvdW50ICkKKwkJTmV4dEluZGV4ID0gMDsKKworCWlmICggaW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS5zdGF0dXMgIT0gMCB8fAorCQkoaW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS5jb3VudCA9PSAwICYmCisJCQlpbmZvLT5yeF9idWZmZXJfbGlzdFtOZXh0SW5kZXhdLmNvdW50ID09IDApKSB7CisJCS8qCisJIAkgKiBFaXRoZXIgdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGlzIGRtYSBidWZmZXIgaXMgbm9uLXplcm8KKwkJICogKGluZGljYXRpbmcgdGhlIGxhc3QgYnVmZmVyIG9mIGEgcmVjZWl2ZSBmcmFtZSkgb3IgdGhlIG5leHQKKwkgCSAqIGJ1ZmZlciBpcyBtYXJrZWQgYXMgaW4gdXNlIC0tIGltcGx5aW5nIHRoaXMgYnVmZmVyIGlzIGNvbXBsZXRlCisJCSAqIGFuZCBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyIGZvciB0aGlzIHJlY2VpdmVkIGZyYW1lLgorCSAJICovCisKKwkJc3RhdHVzID0gaW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS5zdGF0dXM7CisKKwkJaWYgKCBzdGF0dXMgJiAoUlhTVEFUVVNfU0hPUlRfRlJBTUUgKyBSWFNUQVRVU19PVkVSUlVOICsKKwkJCQlSWFNUQVRVU19DUkNfRVJST1IgKyBSWFNUQVRVU19BQk9SVCkgKSB7CisJCQlpZiAoIHN0YXR1cyAmIFJYU1RBVFVTX1NIT1JUX0ZSQU1FICkKKwkJCQlpbmZvLT5pY291bnQucnhzaG9ydCsrOworCQkJZWxzZSBpZiAoIHN0YXR1cyAmIFJYU1RBVFVTX0FCT1JUICkKKwkJCQlpbmZvLT5pY291bnQucnhhYm9ydCsrOworCQkJZWxzZSBpZiAoIHN0YXR1cyAmIFJYU1RBVFVTX09WRVJSVU4gKQorCQkJCWluZm8tPmljb3VudC5yeG92ZXIrKzsKKwkJCWVsc2UKKwkJCQlpbmZvLT5pY291bnQucnhjcmMrKzsKKwkJCWZyYW1lc2l6ZSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQSByZWNlaXZlIGZyYW1lIGlzIGF2YWlsYWJsZSwgZ2V0IGZyYW1lIHNpemUgYW5kIHN0YXR1cy4KKwkJCSAqCisJCQkgKiBUaGUgZnJhbWUgc2l6ZSBpcyB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIFJDQyAod2hpY2ggd2FzCisJCQkgKiBzZXQgdG8gMHhmZmZmKSBtaW51cyB0aGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBSQ0MgKGRlY3JlbWVudGVkCisJCQkgKiBvbmNlIGZvciBlYWNoIHJlY2VpdmUgY2hhcmFjdGVyKSBtaW51cyAyIG9yIDQgZm9yIHRoZSAxNi1iaXQKKwkJCSAqIG9yIDMyLWJpdCBDUkMuCisJCQkgKgorCQkJICogSWYgdGhlIHN0YXR1cyBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIGFuIGludGVybWVkaWF0ZSBidWZmZXIuCisJCQkgKiBJdCdzIHNpemUgaXMgNEsuCisJCQkgKgorCQkJICogSWYgdGhlIERNQSBCdWZmZXIgRW50cnkncyBTdGF0dXMgZmllbGQgaXMgbm9uLXplcm8sIHRoZQorCQkJICogcmVjZWl2ZSBvcGVyYXRpb24gY29tcGxldGVkIG5vcm1hbGx5IChpZTogRENEIGRyb3BwZWQpLiBUaGUKKwkJCSAqIFJDQyBmaWVsZCBpcyB2YWxpZCBhbmQgaG9sZHMgdGhlIHJlY2VpdmVkIGZyYW1lIHNpemUuCisJCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBSQ0MgZmllbGQgd2lsbCBiZSB6ZXJvIG9uIGEgRE1BIGJ1ZmZlcgorCQkJICogZW50cnkgd2l0aCBhIG5vbi16ZXJvIHN0YXR1cy4gVGhpcyBjYW4gb2NjdXIgaWYgdGhlIHRvdGFsCisJCQkgKiBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiB0aGUgdGltZSBEQ0QgZ29lcyBhY3RpdmUKKwkJCSAqIHRvIHRoZSB0aW1lIERDRCBnb2VzIGluYWN0aXZlKSBleGNlZWRzIDY1NTM1IGJ5dGVzLiBJbiB0aGlzCisJCQkgKiBjYXNlIHRoZSAxNkMzMiBoYXMgdW5kZXJydW4gb24gdGhlIFJDQyBjb3VudCBhbmQgYXBwZWFycyB0bworCQkJICogc3RvcCB1cGRhdGluZyB0aGlzIGNvdW50ZXIgdG8gbGV0IHVzIGtub3cgdGhlIGFjdHVhbCByZWNlaXZlZAorCQkJICogZnJhbWUgc2l6ZS4gSWYgdGhpcyBoYXBwZW5zIChub24temVybyBzdGF0dXMgYW5kIHplcm8gUkNDKSwKKwkJCSAqIHNpbXBseSByZXR1cm4gdGhlIGVudGlyZSBSeERNQSBCdWZmZXIKKwkJCSAqLworCQkJaWYgKCBzdGF0dXMgKSB7CisJCQkJLyoKKwkJCQkgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgZmluYWwgUnhETUEgQnVmZmVyIGlzCisJCQkJICogdGVybWluYXRlZCB3aXRoIGEgbm9uLXplcm8gc3RhdHVzIGFuZCB0aGUgUkNDCisJCQkJICogZmllbGQgaXMgemVybywgd2UgaW50ZXJwcmV0IHRoaXMgYXMgdGhlIFJDQworCQkJCSAqIGhhdmluZyB1bmRlcmZsb3dlZCAocmVjZWl2ZWQgZnJhbWUgPiA2NTUzNSBieXRlcykuCisJCQkJICoKKwkJCQkgKiBTaWduYWwgdGhlIGV2ZW50IHRvIHRoZSB1c2VyIGJ5IHBhc3NpbmcgYmFjaworCQkJCSAqIGEgc3RhdHVzIG9mIFJ4U3RhdHVzX0NyY0Vycm9yIHJldHVybmluZyB0aGUgZnVsbAorCQkJCSAqIGJ1ZmZlciBhbmQgbGV0IHRoZSBhcHAgZmlndXJlIG91dCB3aGF0IGRhdGEgaXMKKwkJCQkgKiBhY3R1YWxseSB2YWxpZAorCQkJCSAqLworCQkJCWlmICggaW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS5yY2MgKQorCQkJCQlmcmFtZXNpemUgPSBSQ0xSVkFMVUUgLSBpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLnJjYzsKKwkJCQllbHNlCisJCQkJCWZyYW1lc2l6ZSA9IERNQUJVRkZFUlNJWkU7CisJCQl9CisJCQllbHNlCisJCQkJZnJhbWVzaXplID0gRE1BQlVGRkVSU0laRTsKKwkJfQorCisJCWlmICggZnJhbWVzaXplID4gRE1BQlVGRkVSU0laRSApIHsKKwkJCS8qCisJCQkgKiBpZiBydW5uaW5nIGluIHJhdyBzeW5jIG1vZGUsIElTUiBoYW5kbGVyIGZvcgorCQkJICogRW5kIE9mIEJ1ZmZlciBldmVudHMgdGVybWluYXRlcyBhbGwgYnVmZmVycyBhdCA0Sy4KKwkJCSAqIElmIHRoaXMgZnJhbWUgc2l6ZSBpcyBzYWlkIHRvIGJlID40SywgZ2V0IHRoZQorCQkJICogYWN0dWFsIG51bWJlciBvZiBieXRlcyBvZiB0aGUgZnJhbWUgaW4gdGhpcyBidWZmZXIuCisJCQkgKi8KKwkJCWZyYW1lc2l6ZSA9IGZyYW1lc2l6ZSAlIERNQUJVRkZFUlNJWkU7CisJCX0KKworCisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQkJcHJpbnRrKCIlcyglZCk6bWdzbF9nZXRfcmF3X3J4X2ZyYW1lKCVzKSBzdGF0dXM9JTA0WCBzaXplPSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyxmcmFtZXNpemUpOworCisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfREFUQSApCisJCQltZ3NsX3RyYWNlX2Jsb2NrKGluZm8saW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS52aXJ0X2FkZHIsCisJCQkJbWluX3QoaW50LCBmcmFtZXNpemUsIERNQUJVRkZFUlNJWkUpLDApOworCisJCWlmIChmcmFtZXNpemUpIHsKKwkJCS8qIGNvcHkgZG1hIGJ1ZmZlcihzKSB0byBjb250aWd1b3VzIGludGVybWVkaWF0ZSBidWZmZXIgKi8KKwkJCS8qIE5PVEU6IHdlIG5ldmVyIGNvcHkgbW9yZSB0aGFuIERNQUJVRkZFUlNJWkUgYnl0ZXMJKi8KKworCQkJcEJ1ZkVudHJ5ID0gJihpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdKTsKKwkJCW1lbWNweSggaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyLCBwQnVmRW50cnktPnZpcnRfYWRkciwgZnJhbWVzaXplKTsKKwkJCWluZm8tPmljb3VudC5yeG9rKys7CisKKwkJCWxkaXNjX3JlY2VpdmVfYnVmKHR0eSwgaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyLCBpbmZvLT5mbGFnX2J1ZiwgZnJhbWVzaXplKTsKKwkJfQorCisJCS8qIEZyZWUgdGhlIGJ1ZmZlcnMgdXNlZCBieSB0aGlzIGZyYW1lLiAqLworCQltZ3NsX2ZyZWVfcnhfZnJhbWVfYnVmZmVycyggaW5mbywgQ3VycmVudEluZGV4LCBDdXJyZW50SW5kZXggKTsKKworCQlSZXR1cm5Db2RlID0gMTsKKwl9CisKKworCWlmICggaW5mby0+cnhfZW5hYmxlZCAmJiBpbmZvLT5yeF9vdmVyZmxvdyApIHsKKwkJLyogVGhlIHJlY2VpdmVyIG5lZWRzIHRvIHJlc3RhcnRlZCBiZWNhdXNlIG9mCisJCSAqIGEgcmVjZWl2ZSBvdmVyZmxvdyAoYnVmZmVyIG9yIEZJRk8pLiBJZiB0aGUKKwkJICogcmVjZWl2ZSBidWZmZXJzIGFyZSBub3cgZW1wdHksIHRoZW4gcmVzdGFydCByZWNlaXZlci4KKwkJICovCisKKwkJaWYgKCAhaW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS5zdGF0dXMgJiYKKwkJCWluZm8tPnJ4X2J1ZmZlcl9saXN0W0N1cnJlbnRJbmRleF0uY291bnQgKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXVzY19zdGFydF9yZWNlaXZlcihpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0dXJuQ29kZTsKKworfQkvKiBlbmQgb2YgbWdzbF9nZXRfcmF3X3J4X2ZyYW1lKCkgKi8KKworLyogbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoKQorICogCisgKiAJTG9hZCB0aGUgdHJhbnNtaXQgRE1BIGJ1ZmZlciB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAqIAorICogQXJndW1lbnRzOgorICogCisgKiAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgZXh0ZW5zaW9uCisgKiAJQnVmZmVyCQlwb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIGZyYW1lIHRvIGxvYWQKKyAqIAlCdWZmZXJTaXplCXNpemUgaW4gYnl0ZXMgb2YgZnJhbWUgaW4gQnVmZmVyCisgKiAKKyAqIFJldHVybiBWYWx1ZTogCU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLAorCQljb25zdCBjaGFyICpCdWZmZXIsIHVuc2lnbmVkIGludCBCdWZmZXJTaXplKQoreworCXVuc2lnbmVkIHNob3J0IENvcHljb3VudDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJRE1BQlVGRkVSRU5UUlkgKnBCdWZFbnRyeTsKKwkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEgKQorCQltZ3NsX3RyYWNlX2Jsb2NrKGluZm8sQnVmZmVyLCBtaW5fdChpbnQsIEJ1ZmZlclNpemUsIERNQUJVRkZFUlNJWkUpLCAxKTsKKworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfSERMQ19MT09QTU9ERSkgeworCQkvKiBzZXQgQ01SOjEzIHRvIHN0YXJ0IHRyYW5zbWl0IHdoZW4KKwkJICogbmV4dCBHb0FoZWFkIChhYm9ydCkgaXMgcmVjZWl2ZWQKKwkJICovCisJIAlpbmZvLT5jbXJfdmFsdWUgfD0gQklUMTM7CQkJICAKKwl9CisJCQorCS8qIGJlZ2luIGxvYWRpbmcgdGhlIGZyYW1lIGluIHRoZSBuZXh0IGF2YWlsYWJsZSB0eCBkbWEKKwkgKiBidWZmZXIsIHJlbWVtYmVyIGl0J3Mgc3RhcnRpbmcgbG9jYXRpb24gZm9yIHNldHRpbmcKKwkgKiB1cCB0eCBkbWEgb3BlcmF0aW9uCisJICovCisJaSA9IGluZm8tPmN1cnJlbnRfdHhfYnVmZmVyOworCWluZm8tPnN0YXJ0X3R4X2RtYV9idWZmZXIgPSBpOworCisJLyogU2V0dXAgdGhlIHN0YXR1cyBhbmQgUkNDIChGcmFtZSBTaXplKSBmaWVsZHMgb2YgdGhlIDFzdCAqLworCS8qIGJ1ZmZlciBlbnRyeSBpbiB0aGUgdHJhbnNtaXQgRE1BIGJ1ZmZlciBsaXN0LiAqLworCisJaW5mby0+dHhfYnVmZmVyX2xpc3RbaV0uc3RhdHVzID0gaW5mby0+Y21yX3ZhbHVlICYgMHhmMDAwOworCWluZm8tPnR4X2J1ZmZlcl9saXN0W2ldLnJjYyAgICA9IEJ1ZmZlclNpemU7CisJaW5mby0+dHhfYnVmZmVyX2xpc3RbaV0uY291bnQgID0gQnVmZmVyU2l6ZTsKKworCS8qIENvcHkgZnJhbWUgZGF0YSBmcm9tIDFzdCBzb3VyY2UgYnVmZmVyIHRvIHRoZSBETUEgYnVmZmVycy4gKi8KKwkvKiBUaGUgZnJhbWUgZGF0YSBtYXkgc3BhbiBtdWx0aXBsZSBETUEgYnVmZmVycy4gKi8KKworCXdoaWxlKCBCdWZmZXJTaXplICl7CisJCS8qIEdldCBhIHBvaW50ZXIgdG8gbmV4dCBETUEgYnVmZmVyIGVudHJ5LiAqLworCQlwQnVmRW50cnkgPSAmaW5mby0+dHhfYnVmZmVyX2xpc3RbaSsrXTsKKwkJCQorCQlpZiAoIGkgPT0gaW5mby0+dHhfYnVmZmVyX2NvdW50ICkKKwkJCWk9MDsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBjb3BpZWQgZnJvbSAqLworCQkvKiB0aGUgc291cmNlIGJ1ZmZlciB0byB0aGlzIERNQSBidWZmZXIuICovCisJCWlmICggQnVmZmVyU2l6ZSA+IERNQUJVRkZFUlNJWkUgKQorCQkJQ29weWNvdW50ID0gRE1BQlVGRkVSU0laRTsKKwkJZWxzZQorCQkJQ29weWNvdW50ID0gQnVmZmVyU2l6ZTsKKworCQkvKiBBY3R1YWxseSBjb3B5IGRhdGEgZnJvbSBzb3VyY2UgYnVmZmVyIHRvIERNQSBidWZmZXIuICovCisJCS8qIEFsc28gc2V0IHRoZSBkYXRhIGNvdW50IGZvciB0aGlzIGluZGl2aWR1YWwgRE1BIGJ1ZmZlci4gKi8KKwkJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCQltZ3NsX2xvYWRfcGNpX21lbW9yeShwQnVmRW50cnktPnZpcnRfYWRkciwgQnVmZmVyLENvcHljb3VudCk7CisJCWVsc2UKKwkJCW1lbWNweShwQnVmRW50cnktPnZpcnRfYWRkciwgQnVmZmVyLCBDb3B5Y291bnQpOworCisJCXBCdWZFbnRyeS0+Y291bnQgPSBDb3B5Y291bnQ7CisKKwkJLyogQWR2YW5jZSBzb3VyY2UgcG9pbnRlciBhbmQgcmVkdWNlIHJlbWFpbmluZyBkYXRhIGNvdW50LiAqLworCQlCdWZmZXIgKz0gQ29weWNvdW50OworCQlCdWZmZXJTaXplIC09IENvcHljb3VudDsKKworCQkrK2luZm8tPnR4X2RtYV9idWZmZXJzX3VzZWQ7CisJfQorCisJLyogcmVtZW1iZXIgbmV4dCBhdmFpbGFibGUgdHggZG1hIGJ1ZmZlciAqLworCWluZm8tPmN1cnJlbnRfdHhfYnVmZmVyID0gaTsKKworfQkvKiBlbmQgb2YgbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoKSAqLworCisvKgorICogbWdzbF9yZWdpc3Rlcl90ZXN0KCkKKyAqIAorICogCVBlcmZvcm1zIGEgcmVnaXN0ZXIgdGVzdCBvZiB0aGUgMTZDMzIuCisgKiAJCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJCVRSVUUgaWYgdGVzdCBwYXNzZWQsIG90aGVyd2lzZSBGQUxTRQorICovCitzdGF0aWMgQk9PTEVBTiBtZ3NsX3JlZ2lzdGVyX3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IEJpdFBhdHRlcm5zW10gPQorCQl7IDB4MDAwMCwgMHhmZmZmLCAweGFhYWEsIDB4NTU1NSwgMHgxMjM0LCAweDY5NjksIDB4OTY5NiwgMHgwZjBmIH07CisJc3RhdGljIHVuc2lnbmVkIGludCBQYXR0ZXJuY291bnQgPSBzaXplb2YoQml0UGF0dGVybnMpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJdW5zaWduZWQgaW50IGk7CisJQk9PTEVBTiByYyA9IFRSVUU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXVzY19yZXNldChpbmZvKTsKKworCS8qIFZlcmlmeSB0aGUgcmVzZXQgc3RhdGUgb2Ygc29tZSByZWdpc3RlcnMuICovCisKKwlpZiAoICh1c2NfSW5SZWcoIGluZm8sIFNJQ1IgKSAhPSAwKSB8fAorCQkgICh1c2NfSW5SZWcoIGluZm8sIElWUiAgKSAhPSAwKSB8fAorCQkgICh1c2NfSW5EbWFSZWcoIGluZm8sIERJVlIgKSAhPSAwKSApeworCQlyYyA9IEZBTFNFOworCX0KKworCWlmICggcmMgPT0gVFJVRSApeworCQkvKiBXcml0ZSBiaXQgcGF0dGVybnMgdG8gdmFyaW91cyByZWdpc3RlcnMgYnV0IGRvIGl0IG91dCBvZiAqLworCQkvKiBzeW5jLCB0aGVuIHJlYWQgYmFjayBhbmQgdmVyaWZ5IHZhbHVlcy4gKi8KKworCQlmb3IgKCBpID0gMCA7IGkgPCBQYXR0ZXJuY291bnQgOyBpKysgKSB7CisJCQl1c2NfT3V0UmVnKCBpbmZvLCBUQzBSLCBCaXRQYXR0ZXJuc1tpXSApOworCQkJdXNjX091dFJlZyggaW5mbywgVEMxUiwgQml0UGF0dGVybnNbKGkrMSklUGF0dGVybmNvdW50XSApOworCQkJdXNjX091dFJlZyggaW5mbywgVENMUiwgQml0UGF0dGVybnNbKGkrMiklUGF0dGVybmNvdW50XSApOworCQkJdXNjX091dFJlZyggaW5mbywgUkNMUiwgQml0UGF0dGVybnNbKGkrMyklUGF0dGVybmNvdW50XSApOworCQkJdXNjX091dFJlZyggaW5mbywgUlNSLCAgQml0UGF0dGVybnNbKGkrNCklUGF0dGVybmNvdW50XSApOworCQkJdXNjX091dERtYVJlZyggaW5mbywgVEJDUiwgQml0UGF0dGVybnNbKGkrNSklUGF0dGVybmNvdW50XSApOworCisJCQlpZiAoICh1c2NfSW5SZWcoIGluZm8sIFRDMFIgKSAhPSBCaXRQYXR0ZXJuc1tpXSkgfHwKKwkJCQkgICh1c2NfSW5SZWcoIGluZm8sIFRDMVIgKSAhPSBCaXRQYXR0ZXJuc1soaSsxKSVQYXR0ZXJuY291bnRdKSB8fAorCQkJCSAgKHVzY19JblJlZyggaW5mbywgVENMUiApICE9IEJpdFBhdHRlcm5zWyhpKzIpJVBhdHRlcm5jb3VudF0pIHx8CisJCQkJICAodXNjX0luUmVnKCBpbmZvLCBSQ0xSICkgIT0gQml0UGF0dGVybnNbKGkrMyklUGF0dGVybmNvdW50XSkgfHwKKwkJCQkgICh1c2NfSW5SZWcoIGluZm8sIFJTUiApICAhPSBCaXRQYXR0ZXJuc1soaSs0KSVQYXR0ZXJuY291bnRdKSB8fAorCQkJCSAgKHVzY19JbkRtYVJlZyggaW5mbywgVEJDUiApICE9IEJpdFBhdHRlcm5zWyhpKzUpJVBhdHRlcm5jb3VudF0pICl7CisJCQkJcmMgPSBGQUxTRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXVzY19yZXNldChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIHJjOworCit9CS8qIGVuZCBvZiBtZ3NsX3JlZ2lzdGVyX3Rlc3QoKSAqLworCisvKiBtZ3NsX2lycV90ZXN0KCkgCVBlcmZvcm0gaW50ZXJydXB0IHRlc3Qgb2YgdGhlIDE2QzMyLgorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJVFJVRSBpZiB0ZXN0IHBhc3NlZCwgb3RoZXJ3aXNlIEZBTFNFCisgKi8KK3N0YXRpYyBCT09MRUFOIG1nc2xfaXJxX3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdW5zaWduZWQgbG9uZyBFbmRUaW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl1c2NfcmVzZXQoaW5mbyk7CisKKwkvKgorCSAqIFNldHVwIDE2QzMyIHRvIGludGVycnVwdCBvbiBUeEMgcGluICgxNE1IeiBjbG9jaykgdHJhbnNpdGlvbi4gCisJICogVGhlIElTUiBzZXRzIGlycV9vY2N1cnJlZCB0byAxLiAKKwkgKi8KKworCWluZm8tPmlycV9vY2N1cnJlZCA9IEZBTFNFOworCisJLyogRW5hYmxlIElOVEVOIGdhdGUgZm9yIElTQSBhZGFwdGVyIChQb3J0IDYsIEJpdDEyKSAqLworCS8qIEVuYWJsZSBJTlRFTiAoUG9ydCA2LCBCaXQxMikgKi8KKwkvKiBUaGlzIGNvbm5lY3RzIHRoZSBJUlEgcmVxdWVzdCBzaWduYWwgdG8gdGhlIElTQSBidXMgKi8KKwkvKiBvbiB0aGUgSVNBIGFkYXB0ZXIuIFRoaXMgaGFzIG5vIGVmZmVjdCBmb3IgdGhlIFBDSSBhZGFwdGVyICovCisJdXNjX091dFJlZyggaW5mbywgUENSLCAodW5zaWduZWQgc2hvcnQpKCh1c2NfSW5SZWcoaW5mbywgUENSKSB8IEJJVDEzKSAmIH5CSVQxMikgKTsKKworCXVzY19FbmFibGVNYXN0ZXJJcnFCaXQoaW5mbyk7CisJdXNjX0VuYWJsZUludGVycnVwdHMoaW5mbywgSU9fUElOKTsKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyhpbmZvLCBJT19QSU4pOworCQorCXVzY19VbmxhdGNoSW9zdGF0dXNCaXRzKGluZm8sIE1JU0NTVEFUVVNfVFhDX0xBVENIRUQpOworCXVzY19FbmFibGVTdGF0dXNJcnFzKGluZm8sIFNJQ1JfVFhDX0FDVElWRSArIFNJQ1JfVFhDX0lOQUNUSVZFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwlFbmRUaW1lPTEwMDsKKwl3aGlsZSggRW5kVGltZS0tICYmICFpbmZvLT5pcnFfb2NjdXJyZWQgKSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKTsKKwl9CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJdXNjX3Jlc2V0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJaWYgKCAhaW5mby0+aXJxX29jY3VycmVkICkgCisJCXJldHVybiBGQUxTRTsKKwllbHNlCisJCXJldHVybiBUUlVFOworCit9CS8qIGVuZCBvZiBtZ3NsX2lycV90ZXN0KCkgKi8KKworLyogbWdzbF9kbWFfdGVzdCgpCisgKiAKKyAqIAlQZXJmb3JtIGEgRE1BIHRlc3Qgb2YgdGhlIDE2QzMyLiBBIHNtYWxsIGZyYW1lIGlzCisgKiAJdHJhbnNtaXR0ZWQgdmlhIERNQSBmcm9tIGEgdHJhbnNtaXQgYnVmZmVyIHRvIGEgcmVjZWl2ZSBidWZmZXIKKyAqIAl1c2luZyBzaW5nbGUgYnVmZmVyIERNQSBtb2RlLgorICogCQorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CVRSVUUgaWYgdGVzdCBwYXNzZWQsIG90aGVyd2lzZSBGQUxTRQorICovCitzdGF0aWMgQk9PTEVBTiBtZ3NsX2RtYV90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXVuc2lnbmVkIHNob3J0IEZpZm9MZXZlbDsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKKwl1bnNpZ25lZCBpbnQgRnJhbWVTaXplOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKlRtcFB0cjsKKwlCT09MRUFOIHJjID0gVFJVRTsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM9MDsKKwl1bnNpZ25lZCBsb25nIEVuZFRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlNR1NMX1BBUkFNUyB0bXBfcGFyYW1zOworCisJLyogc2F2ZSBjdXJyZW50IHBvcnQgb3B0aW9ucyAqLworCW1lbWNweSgmdG1wX3BhcmFtcywmaW5mby0+cGFyYW1zLHNpemVvZihNR1NMX1BBUkFNUykpOworCS8qIGxvYWQgZGVmYXVsdCBwb3J0IG9wdGlvbnMgKi8KKwltZW1jcHkoJmluZm8tPnBhcmFtcywmZGVmYXVsdF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJCisjZGVmaW5lIFRFU1RGUkFNRVNJWkUgNDAKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorCS8qIHNldHVwIDE2QzMyIGZvciBTRExDIERNQSB0cmFuc2ZlciBtb2RlICovCisKKwl1c2NfcmVzZXQoaW5mbyk7CisJdXNjX3NldF9zZGxjX21vZGUoaW5mbyk7CisJdXNjX2VuYWJsZV9sb29wYmFjayhpbmZvLDEpOworCQorCS8qIFJlcHJvZ3JhbSB0aGUgUkRNUiBzbyB0aGF0IHRoZSAxNkMzMiBkb2VzIE5PVCBjbGVhciB0aGUgY291bnQKKwkgKiBmaWVsZCBvZiB0aGUgYnVmZmVyIGVudHJ5IGFmdGVyIGZldGNoaW5nIGJ1ZmZlciBhZGRyZXNzLiBUaGlzCisJICogd2F5IHdlIGNhbiBkZXRlY3QgYSBETUEgZmFpbHVyZSBmb3IgYSBETUEgcmVhZCAod2hpY2ggc2hvdWxkIGJlCisJICogbm9uLWRlc3RydWN0aXZlIHRvIHN5c3RlbSBtZW1vcnkpIGJlZm9yZSB3ZSB0cnkgYW5kIHdyaXRlIHRvCisJICogbWVtb3J5ICh3aGVyZSBhIGZhaWx1cmUgY291bGQgY29ycnVwdCBzeXN0ZW0gbWVtb3J5KS4KKwkgKi8KKworCS8qIFJlY2VpdmUgRE1BIG1vZGUgUmVnaXN0ZXIgKFJETVIpCisJICogCisJICogPDE1Li4xND4JMTEJRE1BIG1vZGUgPSBMaW5rZWQgTGlzdCBCdWZmZXIgbW9kZQorCSAqIDwxMz4JCTEJUlNCaW5BL0wgPSBzdG9yZSBSeCBzdGF0dXMgQmxvY2sgaW4gTGlzdCBlbnRyeQorCSAqIDwxMj4JCTAJMSA9IENsZWFyIGNvdW50IG9mIExpc3QgRW50cnkgYWZ0ZXIgZmV0Y2hpbmcKKwkgKiA8MTEuLjEwPgkwMAlBZGRyZXNzIG1vZGUgPSBJbmNyZW1lbnQKKwkgKiA8OT4JCTEJVGVybWluYXRlIEJ1ZmZlciBvbiBSeEJvdW5kCisJICogPDg+CQkwCUJ1cyBXaWR0aCA9IDE2Yml0cworCSAqIDw3Li4wPgkJPwlzdGF0dXMgQml0cyAod3JpdGUgYXMgMHMpCisJICogCisJICogMTExMCAwMDEwIDAwMDAgMDAwMCA9IDB4ZTIwMAorCSAqLworCisJdXNjX091dERtYVJlZyggaW5mbywgUkRNUiwgMHhlMjAwICk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCisJLyogU0VUVVAgVFJBTlNNSVQgQU5EIFJFQ0VJVkUgRE1BIEJVRkZFUlMgKi8KKworCUZyYW1lU2l6ZSA9IFRFU1RGUkFNRVNJWkU7CisKKwkvKiBzZXR1cCAxc3QgdHJhbnNtaXQgYnVmZmVyIGVudHJ5OiAqLworCS8qIHdpdGggZnJhbWUgc2l6ZSBhbmQgdHJhbnNtaXQgY29udHJvbCB3b3JkICovCisKKwlpbmZvLT50eF9idWZmZXJfbGlzdFswXS5jb3VudCAgPSBGcmFtZVNpemU7CisJaW5mby0+dHhfYnVmZmVyX2xpc3RbMF0ucmNjICAgID0gRnJhbWVTaXplOworCWluZm8tPnR4X2J1ZmZlcl9saXN0WzBdLnN0YXR1cyA9IDB4NDAwMDsKKworCS8qIGJ1aWxkIGEgdHJhbnNtaXQgZnJhbWUgaW4gMXN0IHRyYW5zbWl0IERNQSBidWZmZXIgKi8KKworCVRtcFB0ciA9IGluZm8tPnR4X2J1ZmZlcl9saXN0WzBdLnZpcnRfYWRkcjsKKwlmb3IgKGkgPSAwOyBpIDwgRnJhbWVTaXplOyBpKysgKQorCQkqVG1wUHRyKysgPSBpOworCisJLyogc2V0dXAgMXN0IHJlY2VpdmUgYnVmZmVyIGVudHJ5OiAqLworCS8qIGNsZWFyIHN0YXR1cywgc2V0IG1heCByZWNlaXZlIGJ1ZmZlciBzaXplICovCisKKwlpbmZvLT5yeF9idWZmZXJfbGlzdFswXS5zdGF0dXMgPSAwOworCWluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLmNvdW50ID0gRnJhbWVTaXplICsgNDsKKworCS8qIHplcm8gb3V0IHRoZSAxc3QgcmVjZWl2ZSBidWZmZXIgKi8KKworCW1lbXNldCggaW5mby0+cnhfYnVmZmVyX2xpc3RbMF0udmlydF9hZGRyLCAwLCBGcmFtZVNpemUgKyA0ICk7CisKKwkvKiBTZXQgY291bnQgZmllbGQgb2YgbmV4dCBidWZmZXIgZW50cmllcyB0byBwcmV2ZW50ICovCisJLyogMTZDMzIgZnJvbSB1c2luZyBidWZmZXJzIGFmdGVyIHRoZSAxc3Qgb25lLiAqLworCisJaW5mby0+dHhfYnVmZmVyX2xpc3RbMV0uY291bnQgPSAwOworCWluZm8tPnJ4X2J1ZmZlcl9saXN0WzFdLmNvdW50ID0gMDsKKwkKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogUHJvZ3JhbSAxNkMzMiByZWNlaXZlci4gKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJLyogc2V0dXAgRE1BIHRyYW5zZmVycyAqLworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VSeEZpZm8gKTsKKworCS8qIHByb2dyYW0gMTZDMzIgcmVjZWl2ZXIgd2l0aCBwaHlzaWNhbCBhZGRyZXNzIG9mIDFzdCBETUEgYnVmZmVyIGVudHJ5ICovCisJcGh5c19hZGRyID0gaW5mby0+cnhfYnVmZmVyX2xpc3RbMF0ucGh5c19lbnRyeTsKKwl1c2NfT3V0RG1hUmVnKCBpbmZvLCBOUkFSTCwgKHVuc2lnbmVkIHNob3J0KXBoeXNfYWRkciApOworCXVzY19PdXREbWFSZWcoIGluZm8sIE5SQVJVLCAodW5zaWduZWQgc2hvcnQpKHBoeXNfYWRkciA+PiAxNikgKTsKKworCS8qIENsZWFyIHRoZSBSeCBETUEgc3RhdHVzIGJpdHMgKHJlYWQgUkRNUikgYW5kIHN0YXJ0IGNoYW5uZWwgKi8KKwl1c2NfSW5EbWFSZWcoIGluZm8sIFJETVIgKTsKKwl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfSW5pdFJ4Q2hhbm5lbCApOworCisJLyogRW5hYmxlIFJlY2VpdmVyIChSTVIgPDEuLjA+ID0gMTApICovCisJdXNjX091dFJlZyggaW5mbywgUk1SLCAodW5zaWduZWQgc2hvcnQpKCh1c2NfSW5SZWcoaW5mbywgUk1SKSAmIDB4ZmZmYykgfCAweDAwMDIpICk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogV0FJVCBGT1IgUkVDRUlWRVIgVE8gRE1BIEFMTCBQQVJBTUVURVJTIEZST00gQlVGRkVSIEVOVFJZICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBXYWl0IDEwMG1zIGZvciBpbnRlcnJ1cHQuICovCisJRW5kVGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisKKwlmb3IoOzspIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgRW5kVGltZSkpIHsKKwkJCXJjID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQlzdGF0dXMgPSB1c2NfSW5EbWFSZWcoIGluZm8sIFJETVIgKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCQlpZiAoICEoc3RhdHVzICYgQklUNCkgJiYgKHN0YXR1cyAmIEJJVDUpICkgeworCQkJLyogSU5JVEcgKEJJVCA0KSBpcyBpbmFjdGl2ZSAobm8gZW50cnkgcmVhZCBpbiBwcm9ncmVzcykgQU5EICovCisJCQkvKiBCVVNZICAoQklUIDUpIGlzIGFjdGl2ZSAoY2hhbm5lbCBzdGlsbCBhY3RpdmUpLiAqLworCQkJLyogVGhpcyBtZWFucyB0aGUgYnVmZmVyIGVudHJ5IHJlYWQgaGFzIGNvbXBsZXRlZC4gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFByb2dyYW0gMTZDMzIgdHJhbnNtaXR0ZXIuICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCS8qIFByb2dyYW0gdGhlIFRyYW5zbWl0IENoYXJhY3RlciBMZW5ndGggUmVnaXN0ZXIgKFRDTFIpICovCisJLyogYW5kIGNsZWFyIEZJRk8gKFRDQyBpcyBsb2FkZWQgd2l0aCBUQ0xSIG9uIEZJRk8gY2xlYXIpICovCisKKwl1c2NfT3V0UmVnKCBpbmZvLCBUQ0xSLCAodW5zaWduZWQgc2hvcnQpaW5mby0+dHhfYnVmZmVyX2xpc3RbMF0uY291bnQgKTsKKwl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlVHhGaWZvICk7CisKKwkvKiBQcm9ncmFtIHRoZSBhZGRyZXNzIG9mIHRoZSAxc3QgRE1BIEJ1ZmZlciBFbnRyeSBpbiBsaW5rZWQgbGlzdCAqLworCisJcGh5c19hZGRyID0gaW5mby0+dHhfYnVmZmVyX2xpc3RbMF0ucGh5c19lbnRyeTsKKwl1c2NfT3V0RG1hUmVnKCBpbmZvLCBOVEFSTCwgKHVuc2lnbmVkIHNob3J0KXBoeXNfYWRkciApOworCXVzY19PdXREbWFSZWcoIGluZm8sIE5UQVJVLCAodW5zaWduZWQgc2hvcnQpKHBoeXNfYWRkciA+PiAxNikgKTsKKworCS8qIHVubGF0Y2ggVHggc3RhdHVzIGJpdHMsIGFuZCBzdGFydCB0cmFuc21pdCBjaGFubmVsLiAqLworCisJdXNjX091dFJlZyggaW5mbywgVENTUiwgKHVuc2lnbmVkIHNob3J0KSgoIHVzY19JblJlZyhpbmZvLCBUQ1NSKSAmIDB4MGYwMCkgfCAweGZhKSApOworCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9Jbml0VHhDaGFubmVsICk7CisKKwkvKiB3YWl0IGZvciBETUEgY29udHJvbGxlciB0byBmaWxsIHRyYW5zbWl0IEZJRk8gKi8KKworCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbGVjdFRpY3JUeEZpZm9zdGF0dXMgKTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBXQUlUIEZPUiBUUkFOU01JVCBGSUZPIFRPIEZJTEwgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkKKwkvKiBXYWl0IDEwMG1zICovCisJRW5kVGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisKKwlmb3IoOzspIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgRW5kVGltZSkpIHsKKwkJCXJjID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQlGaWZvTGV2ZWwgPSB1c2NfSW5SZWcoaW5mbywgVElDUikgPj4gODsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCQorCQlpZiAoIEZpZm9MZXZlbCA8IDE2ICkKKwkJCWJyZWFrOworCQllbHNlCisJCQlpZiAoIEZyYW1lU2l6ZSA8IDMyICkgeworCQkJCS8qIFRoaXMgZnJhbWUgaXMgc21hbGxlciB0aGFuIHRoZSBlbnRpcmUgdHJhbnNtaXQgRklGTyAqLworCQkJCS8qIHNvIHdhaXQgZm9yIHRoZSBlbnRpcmUgZnJhbWUgdG8gYmUgbG9hZGVkLiAqLworCQkJCWlmICggRmlmb0xldmVsIDw9ICgzMiAtIEZyYW1lU2l6ZSkgKQorCQkJCQlicmVhazsKKwkJCX0KKwl9CisKKworCWlmICggcmMgPT0gVFJVRSApCisJeworCQkvKiBFbmFibGUgMTZDMzIgdHJhbnNtaXR0ZXIuICovCisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQorCQkvKiBUcmFuc21pdCBtb2RlIFJlZ2lzdGVyIChUTVIpLCA8MS4uMD4gPSAxMCwgRW5hYmxlIFRyYW5zbWl0dGVyICovCisJCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbmRGcmFtZSApOworCQl1c2NfT3V0UmVnKCBpbmZvLCBUTVIsICh1bnNpZ25lZCBzaG9ydCkoKHVzY19JblJlZyhpbmZvLCBUTVIpICYgMHhmZmZjKSB8IDB4MDAwMikgKTsKKwkJCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkJCQkJCQorCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkvKiBXQUlUIEZPUiBUUkFOU01JVCBDT01QTEVURSAqLworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCS8qIFdhaXQgMTAwbXMgKi8KKwkJRW5kVGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisKKwkJLyogV2hpbGUgdGltZXIgbm90IGV4cGlyZWQgd2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGUgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJc3RhdHVzID0gdXNjX0luUmVnKCBpbmZvLCBUQ1NSICk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkJd2hpbGUgKCAhKHN0YXR1cyAmIChCSVQ2K0JJVDUrQklUNCtCSVQyK0JJVDEpKSApIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIEVuZFRpbWUpKSB7CisJCQkJcmMgPSBGQUxTRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQlzdGF0dXMgPSB1c2NfSW5SZWcoIGluZm8sIFRDU1IgKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCX0KKwl9CisKKworCWlmICggcmMgPT0gVFJVRSApeworCQkvKiBDSEVDSyBGT1IgVFJBTlNNSVQgRVJST1JTICovCisJCWlmICggc3RhdHVzICYgKEJJVDUgKyBCSVQxKSApIAorCQkJcmMgPSBGQUxTRTsKKwl9CisKKwlpZiAoIHJjID09IFRSVUUgKSB7CisJCS8qIFdBSVQgRk9SIFJFQ0VJVkUgQ09NUExFVEUgKi8KKworCQkvKiBXYWl0IDEwMG1zICovCisJCUVuZFRpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCisJCS8qIFdhaXQgZm9yIDE2QzMyIHRvIHdyaXRlIHJlY2VpdmUgc3RhdHVzIHRvIGJ1ZmZlciBlbnRyeS4gKi8KKwkJc3RhdHVzPWluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLnN0YXR1czsKKwkJd2hpbGUgKCBzdGF0dXMgPT0gMCApIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIEVuZFRpbWUpKSB7CisJCQkJcmMgPSBGQUxTRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXR1cz1pbmZvLT5yeF9idWZmZXJfbGlzdFswXS5zdGF0dXM7CisJCX0KKwl9CisKKworCWlmICggcmMgPT0gVFJVRSApIHsKKwkJLyogQ0hFQ0sgRk9SIFJFQ0VJVkUgRVJST1JTICovCisJCXN0YXR1cyA9IGluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLnN0YXR1czsKKworCQlpZiAoIHN0YXR1cyAmIChCSVQ4ICsgQklUMyArIEJJVDEpICkgeworCQkJLyogcmVjZWl2ZSBlcnJvciBoYXMgb2NjdXJyZWQgKi8KKwkJCXJjID0gRkFMU0U7CisJCX0gZWxzZSB7CisJCQlpZiAoIG1lbWNtcCggaW5mby0+dHhfYnVmZmVyX2xpc3RbMF0udmlydF9hZGRyICwKKwkJCQlpbmZvLT5yeF9idWZmZXJfbGlzdFswXS52aXJ0X2FkZHIsIEZyYW1lU2l6ZSApICl7CisJCQkJcmMgPSBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXVzY19yZXNldCggaW5mbyApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkvKiByZXN0b3JlIGN1cnJlbnQgcG9ydCBvcHRpb25zICovCisJbWVtY3B5KCZpbmZvLT5wYXJhbXMsJnRtcF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJCisJcmV0dXJuIHJjOworCit9CS8qIGVuZCBvZiBtZ3NsX2RtYV90ZXN0KCkgKi8KKworLyogbWdzbF9hZGFwdGVyX3Rlc3QoKQorICogCisgKiAJUGVyZm9ybSB0aGUgcmVnaXN0ZXIsIElSUSwgYW5kIERNQSB0ZXN0cyBmb3IgdGhlIDE2QzMyLgorICogCQorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIC1FTk9ERVYKKyAqLworc3RhdGljIGludCBtZ3NsX2FkYXB0ZXJfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6VGVzdGluZyBkZXZpY2UgJXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJCisJaWYgKCAhbWdzbF9yZWdpc3Rlcl90ZXN0KCBpbmZvICkgKSB7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NGYWlsdXJlOworCQlwcmludGsoICIlcyglZCk6UmVnaXN0ZXIgdGVzdCBmYWlsdXJlIGZvciBkZXZpY2UgJXMgQWRkcj0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+aW9fYmFzZSkgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCAhbWdzbF9pcnFfdGVzdCggaW5mbyApICkgeworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19JcnFGYWlsdXJlOworCQlwcmludGsoICIlcyglZCk6SW50ZXJydXB0IHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIElSUT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPmlycV9sZXZlbCkgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCAhbWdzbF9kbWFfdGVzdCggaW5mbyApICkgeworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19EbWFGYWlsdXJlOworCQlwcmludGsoICIlcyglZCk6RE1BIHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIERNQT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPmRtYV9sZXZlbCkgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOmRldmljZSAlcyBwYXNzZWQgZGlhZ25vc3RpY3NcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJCisJcmV0dXJuIDA7CisKK30JLyogZW5kIG9mIG1nc2xfYWRhcHRlcl90ZXN0KCkgKi8KKworLyogbWdzbF9tZW1vcnlfdGVzdCgpCisgKiAKKyAqIAlUZXN0IHRoZSBzaGFyZWQgbWVtb3J5IG9uIGEgUENJIGFkYXB0ZXIuCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglUUlVFIGlmIHRlc3QgcGFzc2VkLCBvdGhlcndpc2UgRkFMU0UKKyAqLworc3RhdGljIEJPT0xFQU4gbWdzbF9tZW1vcnlfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBCaXRQYXR0ZXJuc1tdID0geyAweDAsIDB4NTU1NTU1NTUsIDB4YWFhYWFhYWEsCisJCQkJCQkJCQkJCTB4NjY2NjY2NjYsIDB4OTk5OTk5OTksIDB4ZmZmZmZmZmYsIDB4MTIzNDU2NzggfTsKKwl1bnNpZ25lZCBsb25nIFBhdHRlcm5jb3VudCA9IHNpemVvZihCaXRQYXR0ZXJucykvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIFRlc3RMaW1pdCA9IFNIQVJFRF9NRU1fQUREUkVTU19TSVpFL3NpemVvZih1bnNpZ25lZCBsb25nKTsKKwl1bnNpZ25lZCBsb25nICogVGVzdEFkZHI7CisKKwlpZiAoIGluZm8tPmJ1c190eXBlICE9IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJcmV0dXJuIFRSVUU7CisKKwlUZXN0QWRkciA9ICh1bnNpZ25lZCBsb25nICopaW5mby0+bWVtb3J5X2Jhc2U7CisKKwkvKiBUZXN0IGRhdGEgbGluZXMgd2l0aCB0ZXN0IHBhdHRlcm4gYXQgb25lIGxvY2F0aW9uLiAqLworCisJZm9yICggaSA9IDAgOyBpIDwgUGF0dGVybmNvdW50IDsgaSsrICkgeworCQkqVGVzdEFkZHIgPSBCaXRQYXR0ZXJuc1tpXTsKKwkJaWYgKCAqVGVzdEFkZHIgIT0gQml0UGF0dGVybnNbaV0gKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIFRlc3QgYWRkcmVzcyBsaW5lcyB3aXRoIGluY3JlbWVudGluZyBwYXR0ZXJuIG92ZXIgKi8KKwkvKiBlbnRpcmUgYWRkcmVzcyByYW5nZS4gKi8KKworCWZvciAoIGkgPSAwIDsgaSA8IFRlc3RMaW1pdCA7IGkrKyApIHsKKwkJKlRlc3RBZGRyID0gaSAqIDQ7CisJCVRlc3RBZGRyKys7CisJfQorCisJVGVzdEFkZHIgPSAodW5zaWduZWQgbG9uZyAqKWluZm8tPm1lbW9yeV9iYXNlOworCisJZm9yICggaSA9IDAgOyBpIDwgVGVzdExpbWl0IDsgaSsrICkgeworCQlpZiAoICpUZXN0QWRkciAhPSBpICogNCApCisJCQlyZXR1cm4gRkFMU0U7CisJCVRlc3RBZGRyKys7CisJfQorCisJbWVtc2V0KCBpbmZvLT5tZW1vcnlfYmFzZSwgMCwgU0hBUkVEX01FTV9BRERSRVNTX1NJWkUgKTsKKworCXJldHVybiBUUlVFOworCit9CS8qIEVuZCBPZiBtZ3NsX21lbW9yeV90ZXN0KCkgKi8KKworCisvKiBtZ3NsX2xvYWRfcGNpX21lbW9yeSgpCisgKiAKKyAqIAlMb2FkIGEgbGFyZ2UgYmxvY2sgb2YgZGF0YSBpbnRvIHRoZSBQQ0kgc2hhcmVkIG1lbW9yeS4KKyAqIAlVc2UgdGhpcyBpbnN0ZWFkIG9mIG1lbWNweSgpIG9yIG1lbW1vdmUoKSB0byBtb3ZlIGRhdGEKKyAqIAlpbnRvIHRoZSBQQ0kgc2hhcmVkIG1lbW9yeS4KKyAqIAorICogTm90ZXM6CisgKiAKKyAqIAlUaGlzIGZ1bmN0aW9uIHByZXZlbnRzIHRoZSBQQ0k5MDUwIGludGVyZmFjZSBjaGlwIGZyb20gaG9nZ2luZworICogCXRoZSBhZGFwdGVyIGxvY2FsIGJ1cywgd2hpY2ggY2FuIHN0YXJ2ZSB0aGUgMTZDMzIgYnkgcHJldmVudGluZworICogCTE2QzMyIGJ1cyBtYXN0ZXIgY3ljbGVzLgorICogCisgKiAJVGhlIFBDSTkwNTAgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgdGhlIDkwNTAgd2lsbCBhbHdheXMgcmVsZWFzZQorICogCWNvbnRyb2wgb2YgdGhlIGxvY2FsIGJ1cyBhZnRlciBjb21wbGV0aW5nIHRoZSBjdXJyZW50IHJlYWQKKyAqIAlvciB3cml0ZSBvcGVyYXRpb24uCisgKiAKKyAqIAlJdCBhcHBlYXJzIHRoYXQgYXMgbG9uZyBhcyB0aGUgUENJOTA1MCB3cml0ZSBGSUZPIGlzIGZ1bGwsIHRoZQorICogCVBDSTkwNTAgdHJlYXRzIGFsbCBvZiB0aGUgd3JpdGVzIGFzIGEgc2luZ2xlIGJ1cnN0IHRyYW5zYWN0aW9uCisgKiAJYW5kIHdpbGwgbm90IHJlbGVhc2UgdGhlIGJ1cy4gVGhpcyBjYXVzZXMgRE1BIGxhdGVuY3kgcHJvYmxlbXMKKyAqIAlhdCBoaWdoIHNwZWVkcyB3aGVuIGNvcHlpbmcgbGFyZ2UgZGF0YSBibG9ja3MgdG8gdGhlIHNoYXJlZAorICogCW1lbW9yeS4KKyAqIAorICogCVRoaXMgZnVuY3Rpb24gaW4gZWZmZWN0LCBicmVha3MgdGhlIGEgbGFyZ2Ugc2hhcmVkIG1lbW9yeSB3cml0ZQorICogCWludG8gbXVsdGlwbGUgdHJhbnNhdGlvbnMgYnkgaW50ZXJsZWF2aW5nIGEgc2hhcmVkIG1lbW9yeSByZWFkCisgKiAJd2hpY2ggd2lsbCBmbHVzaCB0aGUgd3JpdGUgRklGTyBhbmQgJ2NvbXBsZXRlJyB0aGUgd3JpdGUKKyAqIAl0cmFuc2F0aW9uLiBUaGlzIGFsbG93cyBhbnkgcGVuZGluZyBETUEgcmVxdWVzdCB0byBnYWluIGNvbnRyb2wKKyAqIAlvZiB0aGUgbG9jYWwgYnVzIGluIGEgdGltZWx5IGZhc2lvbi4KKyAqIAorICogQXJndW1lbnRzOgorICogCisgKiAJVGFyZ2V0UHRyCXBvaW50ZXIgdG8gdGFyZ2V0IGFkZHJlc3MgaW4gUENJIHNoYXJlZCBtZW1vcnkKKyAqIAlTb3VyY2VQdHIJcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyIGZvciBkYXRhCisgKiAJY291bnQJCWNvdW50IGluIGJ5dGVzIG9mIGRhdGEgdG8gY29weQorICoKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2xvYWRfcGNpX21lbW9yeSggY2hhciogVGFyZ2V0UHRyLCBjb25zdCBjaGFyKiBTb3VyY2VQdHIsCisJdW5zaWduZWQgc2hvcnQgY291bnQgKQoreworCS8qIDE2IDMyLWJpdCB3cml0ZXMgQCA2MG5zIGVhY2ggPSA5NjBucyBtYXggbGF0ZW5jeSBvbiBsb2NhbCBidXMgKi8KKyNkZWZpbmUgUENJX0xPQURfSU5URVJWQUwgNjQKKworCXVuc2lnbmVkIHNob3J0IEludGVydmFsY291bnQgPSBjb3VudCAvIFBDSV9MT0FEX0lOVEVSVkFMOworCXVuc2lnbmVkIHNob3J0IEluZGV4OworCXVuc2lnbmVkIGxvbmcgRHVtbXk7CisKKwlmb3IgKCBJbmRleCA9IDAgOyBJbmRleCA8IEludGVydmFsY291bnQgOyBJbmRleCsrICkKKwl7CisJCW1lbWNweShUYXJnZXRQdHIsIFNvdXJjZVB0ciwgUENJX0xPQURfSU5URVJWQUwpOworCQlEdW1teSA9ICooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilUYXJnZXRQdHIpOworCQlUYXJnZXRQdHIgKz0gUENJX0xPQURfSU5URVJWQUw7CisJCVNvdXJjZVB0ciArPSBQQ0lfTE9BRF9JTlRFUlZBTDsKKwl9CisKKwltZW1jcHkoIFRhcmdldFB0ciwgU291cmNlUHRyLCBjb3VudCAlIFBDSV9MT0FEX0lOVEVSVkFMICk7CisKK30JLyogRW5kIE9mIG1nc2xfbG9hZF9wY2lfbWVtb3J5KCkgKi8KKworc3RhdGljIHZvaWQgbWdzbF90cmFjZV9ibG9jayhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCkKK3sKKwlpbnQgaTsKKwlpbnQgbGluZWNvdW50OworCWlmICh4bWl0KQorCQlwcmludGsoIiVzIHR4IGRhdGE6XG4iLGluZm8tPmRldmljZV9uYW1lKTsKKwllbHNlCisJCXByaW50aygiJXMgcnggZGF0YTpcbiIsaW5mby0+ZGV2aWNlX25hbWUpOworCQkKKwl3aGlsZShjb3VudCkgeworCQlpZiAoY291bnQgPiAxNikKKwkJCWxpbmVjb3VudCA9IDE2OworCQllbHNlCisJCQlsaW5lY291bnQgPSBjb3VudDsKKwkJCQorCQlmb3IoaT0wO2k8bGluZWNvdW50O2krKykKKwkJCXByaW50aygiJTAyWCAiLCh1bnNpZ25lZCBjaGFyKWRhdGFbaV0pOworCQlmb3IoO2k8MTc7aSsrKQorCQkJcHJpbnRrKCIgICAiKTsKKwkJZm9yKGk9MDtpPGxpbmVjb3VudDtpKyspIHsKKwkJCWlmIChkYXRhW2ldPj0wNDAgJiYgZGF0YVtpXTw9MDE3NikKKwkJCQlwcmludGsoIiVjIixkYXRhW2ldKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIi4iKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJCQorCQlkYXRhICArPSBsaW5lY291bnQ7CisJCWNvdW50IC09IGxpbmVjb3VudDsKKwl9Cit9CS8qIGVuZCBvZiBtZ3NsX3RyYWNlX2Jsb2NrKCkgKi8KKworLyogbWdzbF90eF90aW1lb3V0KCkKKyAqIAorICogCWNhbGxlZCB3aGVuIEhETEMgZnJhbWUgdGltZXMgb3V0CisgKiAJdXBkYXRlIHN0YXRzIGFuZCBkbyB0eCBjb21wbGV0aW9uIHByb2Nlc3NpbmcKKyAqIAkKKyAqIEFyZ3VtZW50czoJY29udGV4dAkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCopY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX3R4X3RpbWVvdXQoJXMpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCWlmKGluZm8tPnR4X2FjdGl2ZSAmJgorCSAgIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCSAgICBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXKSApIHsKKwkJaW5mby0+aWNvdW50LnR4dGltZW91dCsrOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlpbmZvLT50eF9hY3RpdmUgPSAwOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKworCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0hETENfTE9PUE1PREUgKQorCQl1c2NfbG9vcG1vZGVfY2FuY2VsX3RyYW5zbWl0KCBpbmZvICk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorI2lmZGVmIENPTkZJR19IRExDCisJaWYgKGluZm8tPm5ldGNvdW50KQorCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CisJZWxzZQorI2VuZGlmCisJCW1nc2xfYmhfdHJhbnNtaXQoaW5mbyk7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3R4X3RpbWVvdXQoKSAqLworCisvKiBzaWduYWwgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8gc2VuZCwgc28gdGhhdAorICogbGluZSBpcyAncmVsZWFzZWQnIGJ5IGVjaG9pbmcgUnhEIHRvIFR4RCB3aGVuIGN1cnJlbnQKKyAqIHRyYW5zbWlzc2lvbiBpcyBjb21wbGV0ZSAob3IgaW1tZWRpYXRlbHkgaWYgbm8gdHggaW4gcHJvZ3Jlc3MpLgorICovCitzdGF0aWMgaW50IG1nc2xfbG9vcG1vZGVfc2VuZF9kb25lKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfSERMQ19MT09QTU9ERSkgeworCQlpZiAoaW5mby0+dHhfYWN0aXZlKQorCQkJaW5mby0+bG9vcG1vZGVfc2VuZF9kb25lX3JlcXVlc3RlZCA9IFRSVUU7CisJCWVsc2UKKwkJCXVzY19sb29wbW9kZV9zZW5kX2RvbmUoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVsZWFzZSB0aGUgbGluZSBieSBlY2hvaW5nIFJ4RCB0byBUeEQKKyAqIHVwb24gY29tcGxldGlvbiBvZiBhIHRyYW5zbWl0IGZyYW1lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19sb29wbW9kZV9zZW5kX2RvbmUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gKQoreworIAlpbmZvLT5sb29wbW9kZV9zZW5kX2RvbmVfcmVxdWVzdGVkID0gRkFMU0U7CisgCS8qIGNsZWFyIENNUjoxMyB0byAwIHRvIHN0YXJ0IGVjaG9pbmcgUnhEYXRhIHRvIFR4RGF0YSAqLworIAlpbmZvLT5jbXJfdmFsdWUgJj0gfkJJVDEzOwkJCSAgCisgCXVzY19PdXRSZWcoaW5mbywgQ01SLCBpbmZvLT5jbXJfdmFsdWUpOworfQorCisvKiBhYm9ydCBhIHRyYW5zbWl0IGluIHByb2dyZXNzIHdoaWxlIGluIEhETEMgTG9vcE1vZGUKKyAqLworc3RhdGljIHZvaWQgdXNjX2xvb3Btb2RlX2NhbmNlbF90cmFuc21pdCggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyApCit7CisgCS8qIHJlc2V0IHR4IGRtYSBjaGFubmVsIGFuZCBwdXJnZSBUeEZpZm8gKi8KKyAJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVR4RmlmbyApOworIAl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfUmVzZXRUeENoYW5uZWwgKTsKKyAgCXVzY19sb29wbW9kZV9zZW5kX2RvbmUoIGluZm8gKTsKK30KKworLyogZm9yIEhETEMvU0RMQyBMb29wTW9kZSwgc2V0dGluZyBDTVI6MTMgYWZ0ZXIgdGhlIHRyYW5zbWl0dGVyIGlzIGVuYWJsZWQKKyAqIGlzIGFuIEluc2VydCBJbnRvIExvb3AgYWN0aW9uLiBVcG9uIHJlY2VpcHQgb2YgYSBHb0FoZWFkIHNlcXVlbmNlIChSeEFib3J0KQorICogd2UgbXVzdCBjbGVhciBDTVI6MTMgdG8gYmVnaW4gcmVwZWF0aW5nIFR4RGF0YSB0byBSeERhdGEKKyAqLworc3RhdGljIHZvaWQgdXNjX2xvb3Btb2RlX2luc2VydF9yZXF1ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICkKK3sKKyAJaW5mby0+bG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3RlZCA9IFRSVUU7CisgCisgCS8qIGVuYWJsZSBSeEFib3J0IGlycS4gT24gbmV4dCBSeEFib3J0LCBjbGVhciBDTVI6MTMgdG8KKyAJICogYmVnaW4gcmVwZWF0aW5nIFR4RGF0YSBvbiBSeERhdGEgKGNvbXBsZXRlIGluc2VydGlvbikKKwkgKi8KKyAJdXNjX091dFJlZyggaW5mbywgUklDUiwgCisJCSh1c2NfSW5SZWcoIGluZm8sIFJJQ1IgKSB8IFJYU1RBVFVTX0FCT1JUX1JFQ0VJVkVEICkgKTsKKwkJCisJLyogc2V0IENNUjoxMyB0byBpbnNlcnQgaW50byBsb29wIG9uIG5leHQgR29BaGVhZCAoUnhBYm9ydCkgKi8KKwlpbmZvLT5jbXJfdmFsdWUgfD0gQklUMTM7CisgCXVzY19PdXRSZWcoaW5mbywgQ01SLCBpbmZvLT5jbXJfdmFsdWUpOworfQorCisvKiByZXR1cm4gMSBpZiBzdGF0aW9uIGlzIGluc2VydGVkIGludG8gdGhlIGxvb3AsIG90aGVyd2lzZSAwCisgKi8KK3N0YXRpYyBpbnQgdXNjX2xvb3Btb2RlX2FjdGl2ZSggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbykKK3sKKyAJcmV0dXJuIHVzY19JblJlZyggaW5mbywgQ0NTUiApICYgQklUNyA/IDEgOiAwIDsKK30KKworI2lmZGVmIENPTkZJR19IRExDCisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB3aGVuIHByb3RvY29sIHNlbGVjdGVkIChQUFAsIGZyYW1lIHJlbGF5LCBldGMuKQorICogc2V0IGVuY29kaW5nIGFuZCBmcmFtZSBjaGVjayBzZXF1ZW5jZSAoRkNTKSBvcHRpb25zCisgKgorICogZGV2ICAgICAgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBlbmNvZGluZyAgc2VyaWFsIGVuY29kaW5nIHNldHRpbmcKKyAqIHBhcml0eSAgICBGQ1Mgc2V0dGluZworICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGVuY29kaW5nLAorCQkJICB1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICBuZXdfZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgbmV3X2NyY3R5cGU7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChlbmNvZGluZykKKwl7CisJY2FzZSBFTkNPRElOR19OUlo6ICAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWjsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19OUlpJOiAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzogICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6ICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX01BTkNIRVNURVI6IG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwYXJpdHkpCisJeworCWNhc2UgUEFSSVRZX05PTkU6ICAgICAgICAgICAgbmV3X2NyY3R5cGUgPSBIRExDX0NSQ19OT05FOyBicmVhazsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ6IG5ld19jcmN0eXBlID0gSERMQ19DUkNfMTZfQ0NJVFQ7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18zMl9DQ0lUVDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mby0+cGFyYW1zLmVuY29kaW5nID0gbmV3X2VuY29kaW5nOworCWluZm8tPnBhcmFtcy5jcmNfdHlwZSA9IG5ld19jcmN0eXBlOzsKKworCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCW1nc2xfcHJvZ3JhbV9odyhpbmZvKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgdG8gc2VuZCBmcmFtZQorICoKKyAqIHNrYiAgc29ja2V0IGJ1ZmZlciBjb250YWluaW5nIEhETEMgZnJhbWUKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayhLRVJOX0lORk8gIiVzOmhkbGNfeG1pdCglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIHN0b3Agc2VuZGluZyB1bnRpbCB0aGlzIGZyYW1lIGNvbXBsZXRlcyAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGNvcHkgZGF0YSB0byBkZXZpY2UgYnVmZmVycyAqLworCWluZm8tPnhtaXRfY250ID0gc2tiLT5sZW47CisJbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoaW5mbywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiB1cGRhdGUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBkb25lIHdpdGggc29ja2V0IGJ1ZmZlciwgc28gZnJlZSBpdCAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIHNhdmUgc3RhcnQgdGltZSBmb3IgdHJhbnNtaXQgdGltZW91dCBkZXRlY3Rpb24gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIHN0YXJ0IGhhcmR3YXJlIHRyYW5zbWl0dGVyIGlmIG5lY2Vzc2FyeSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfYWN0aXZlKQorCSAJdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIGludGVyZmFjZSBlbmFibGVkCisgKiBjbGFpbSByZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgaGFyZHdhcmUKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfb3BlbiglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBvcGVuIHByb2Nlc3NpbmcgKi8KKwlpZiAoKHJjID0gaGRsY19vcGVuKGRldikpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBhcmJpdHJhdGUgYmV0d2VlbiBuZXR3b3JrIGFuZCB0dHkgb3BlbnMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5jb3VudCAhPSAwIHx8IGluZm8tPm5ldGNvdW50ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhkbGNfb3BlbiByZXR1cm5pbmcgYnVzeVxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpbmZvLT5uZXRjb3VudD0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCS8qIGNsYWltIHJlc291cmNlcyBhbmQgaW5pdCBhZGFwdGVyICovCisJaWYgKChyYyA9IHN0YXJ0dXAoaW5mbykpICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJaW5mby0+bmV0Y291bnQ9MDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogYXNzZXJ0IERUUiBhbmQgUlRTLCBhcHBseSBoYXJkd2FyZSBzZXR0aW5ncyAqLworCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCW1nc2xfcHJvZ3JhbV9odyhpbmZvKTsKKworCS8qIGVuYWJsZSBuZXR3b3JrIGxheWVyIHRyYW5zbWl0ICovCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIGluZm9ybSBnZW5lcmljIEhETEMgbGF5ZXIgb2YgY3VycmVudCBEQ0Qgc3RhdHVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jaywgZmxhZ3MpOworCXVzY19nZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLCBmbGFncyk7CisJaGRsY19zZXRfY2FycmllcihpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIGludGVyZmFjZSBpcyBkaXNhYmxlZAorICogc2h1dGRvd24gaGFyZHdhcmUgYW5kIHJlbGVhc2UgcmVzb3VyY2VzCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlczpoZGxjZGV2X2Nsb3NlKCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogc2h1dGRvd24gYWRhcHRlciBhbmQgcmVsZWFzZSByZXNvdXJjZXMgKi8KKwlzaHV0ZG93bihpbmZvKTsKKworCWhkbGNfY2xvc2UoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaW5mby0+bmV0Y291bnQ9MDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB0byBwcm9jZXNzIElPQ1RMIGNhbGwgdG8gbmV0d29yayBkZXZpY2UKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBpZnIgIHBvaW50ZXIgdG8gbmV0d29yayBpbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIGNtZCAgSU9DVEwgY29tbWFuZCBjb2RlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfaW9jdGwoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6IC8qIHJldHVybiBjdXJyZW50IHN5bmNfc2VyaWFsX3NldHRpbmdzICovCisKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1NZTkNfU0VSSUFMOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKworCQlmbGFncyA9IGluZm8tPnBhcmFtcy5mbGFncyAmIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOworCisJCXN3aXRjaCAoZmxhZ3MpeworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfVFhDUElOKTogbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkcpOiAgICBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWElOVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfVFhGUk9NUlg7IGJyZWFrOworCQlkZWZhdWx0OiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfREVGQVVMVDsKKwkJfQorCisJCW5ld19saW5lLmNsb2NrX3JhdGUgPSBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQ7CisJCW5ld19saW5lLmxvb3BiYWNrICAgPSBpbmZvLT5wYXJhbXMubG9vcGJhY2sgPyAxOjA7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmbmV3X2xpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDogLyogc2V0IHN5bmNfc2VyaWFsX3NldHRpbmdzICovCisKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19saW5lLCBsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAobmV3X2xpbmUuY2xvY2tfdHlwZSkKKwkJeworCQljYXNlIENMT0NLX0VYVDogICAgICBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU47IGJyZWFrOworCQljYXNlIENMT0NLX1RYRlJPTVJYOiBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19SWENQSU47IGJyZWFrOworCQljYXNlIENMT0NLX0lOVDogICAgICBmbGFncyA9IEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkc7ICAgIGJyZWFrOworCQljYXNlIENMT0NLX1RYSU5UOiAgICBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19CUkc7ICAgIGJyZWFrOworCQljYXNlIENMT0NLX0RFRkFVTFQ6ICBmbGFncyA9IGluZm8tPnBhcmFtcy5mbGFncyAmCisJCQkJCSAgICAgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7IGJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChuZXdfbGluZS5sb29wYmFjayAhPSAwICYmIG5ld19saW5lLmxvb3BiYWNrICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpbmZvLT5wYXJhbXMuZmxhZ3MgJj0gfihIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCUhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQlIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCUhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOworCQlpbmZvLT5wYXJhbXMuZmxhZ3MgfD0gZmxhZ3M7CisKKwkJaW5mby0+cGFyYW1zLmxvb3BiYWNrID0gbmV3X2xpbmUubG9vcGJhY2s7CisKKwkJaWYgKGZsYWdzICYgKEhETENfRkxBR19SWENfQlJHIHwgSERMQ19GTEFHX1RYQ19CUkcpKQorCQkJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gbmV3X2xpbmUuY2xvY2tfcmF0ZTsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gMDsKKworCQkvKiBpZiBuZXR3b3JrIGludGVyZmFjZSB1cCwgcmVwcm9ncmFtIGhhcmR3YXJlICovCisJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCW1nc2xfcHJvZ3JhbV9odyhpbmZvKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiB0cmFuc21pdCB0aW1lb3V0IGlzIGRldGVjdGVkCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiaGRsY2Rldl90eF90aW1lb3V0KCVzKVxuIixkZXYtPm5hbWUpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIHRyYW5zbWl0IGNvbXBsZXRlcworICogcmVlbmFibGUgbmV0d29yayBsYXllciB0cmFuc21pdCBpZiBzdG9wcGVkCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl90eF9kb25lKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChpbmZvLT5uZXRkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGluZm8tPm5ldGRldik7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiBmcmFtZSByZWNlaXZlZAorICogcGFzcyBmcmFtZSB0byBuZXR3b3JrIGxheWVyCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqIGJ1ZiAgIHBvaW50ZXIgdG8gYnVmZmVyIGNvbnRpYW5pbmcgZnJhbWUgZGF0YQorICogc2l6ZSAgY291bnQgb2YgZGF0YSBieXRlcyBpbiBidWYKKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl9yeChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJoZGxjZGV2X3J4KCVzKVxuIixkZXYtPm5hbWUpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNhbid0IGFsbG9jIHNrYiwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSxidWYsc2l6ZSk7CisKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgaW5mby0+bmV0ZGV2KTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNpemU7CisKKwluZXRpZl9yeChza2IpOworCisJaW5mby0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGFkZGluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBpbml0aWFsaXphdGlvbgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pbml0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgcmM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwloZGxjX2RldmljZSAqaGRsYzsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG5ldHdvcmsgYW5kIEhETEMgbGF5ZXIgb2JqZWN0cyAqLworCisJaWYgKCEoZGV2ID0gYWxsb2NfaGRsY2RldihpbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpoZGxjIGRldmljZSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsX19GSUxFX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBmb3IgbmV0d29yayBsYXllciByZXBvcnRpbmcgcHVycG9zZXMgb25seSAqLworCWRldi0+YmFzZV9hZGRyID0gaW5mby0+aW9fYmFzZTsKKwlkZXYtPmlycSAgICAgICA9IGluZm8tPmlycV9sZXZlbDsKKwlkZXYtPmRtYSAgICAgICA9IGluZm8tPmRtYV9sZXZlbDsKKworCS8qIG5ldHdvcmsgbGF5ZXIgY2FsbGJhY2tzIGFuZCBzZXR0aW5ncyAqLworCWRldi0+ZG9faW9jdGwgICAgICAgPSBoZGxjZGV2X2lvY3RsOworCWRldi0+b3BlbiAgICAgICAgICAgPSBoZGxjZGV2X29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICA9IGhkbGNkZXZfY2xvc2U7CisJZGV2LT50eF90aW1lb3V0ICAgICA9IGhkbGNkZXZfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMTAqSFo7CisJZGV2LT50eF9xdWV1ZV9sZW4gICA9IDUwOworCisJLyogZ2VuZXJpYyBIRExDIGxheWVyIGNhbGxiYWNrcyBhbmQgc2V0dGluZ3MgKi8KKwloZGxjICAgICAgICAgPSBkZXZfdG9faGRsYyhkZXYpOworCWhkbGMtPmF0dGFjaCA9IGhkbGNkZXZfYXR0YWNoOworCWhkbGMtPnhtaXQgICA9IGhkbGNkZXZfeG1pdDsKKworCS8qIHJlZ2lzdGVyIG9iamVjdHMgd2l0aCBIRExDIGxheWVyICovCisJaWYgKChyYyA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOnVuYWJsZSB0byByZWdpc3RlciBoZGxjIGRldmljZVxuIixfX0ZJTEVfXyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiByYzsKKwl9CisKKwlpbmZvLT5uZXRkZXYgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiByZW1vdmluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBjbGVhbnVwCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGluZm8tPm5ldGRldik7CisJZnJlZV9uZXRkZXYoaW5mby0+bmV0ZGV2KTsKKwlpbmZvLT5uZXRkZXYgPSBOVUxMOworfQorCisjZW5kaWYgLyogQ09ORklHX0hETEMgKi8KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzeW5jbGlua19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm87CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgeworCQlwcmludGsoImVycm9yIGVuYWJsaW5nIHBjaSBkZXZpY2UgJXBcbiIsIGRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghKGluZm8gPSBtZ3NsX2FsbG9jYXRlX2RldmljZSgpKSkgeworCQlwcmludGsoImNhbid0IGFsbG9jYXRlIGRldmljZSBpbnN0YW5jZSBkYXRhLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworICAgICAgICAvKiBDb3B5IHVzZXIgY29uZmlndXJhdGlvbiBpbmZvIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhICovCisJCQorCWluZm8tPmlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKTsKKwlpbmZvLT5pcnFfbGV2ZWwgPSBkZXYtPmlycTsKKwlpbmZvLT5waHlzX21lbW9yeV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMyk7CisJCQkJCisgICAgICAgIC8qIEJlY2F1c2UgdmVyZW1hcCBvbmx5IHdvcmtzIG9uIHBhZ2UgYm91bmRhcmllcyB3ZSBtdXN0IG1hcAorCSAqIGEgbGFyZ2VyIGFyZWEgdGhhbiBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCBmb3IgdGhlIExDUgorCSAqIG1lbW9yeSByYW5nZS4gV2UgbWFwIGEgZnVsbCBwYWdlIHN0YXJ0aW5nIGF0IHRoZSBwYWdlIGJvdW5kYXJ5LgorCSAqLworCWluZm8tPnBoeXNfbGNyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpbmZvLT5sY3Jfb2Zmc2V0ICAgID0gaW5mby0+cGh5c19sY3JfYmFzZSAmIChQQUdFX1NJWkUtMSk7CisJaW5mby0+cGh5c19sY3JfYmFzZSAmPSB+KFBBR0VfU0laRS0xKTsKKwkJCQkKKwlpbmZvLT5idXNfdHlwZSA9IE1HU0xfQlVTX1RZUEVfUENJOworCWluZm8tPmlvX2FkZHJfc2l6ZSA9IDg7CisJaW5mby0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisKKwlpZiAoZGV2LT5kZXZpY2UgPT0gMHgwMjEwKSB7CisJCS8qIFZlcnNpb24gMSBQQ0k5MDMwIGJhc2VkIHVuaXZlcnNhbCBQQ0kgYWRhcHRlciAqLworCQlpbmZvLT5taXNjX2N0cmxfdmFsdWUgPSAweDAwN2M0MDgwOworCQlpbmZvLT5od192ZXJzaW9uID0gMTsKKwl9IGVsc2UgeworCQkvKiBWZXJzaW9uIDAgUENJOTA1MCBiYXNlZCA1ViBQQ0kgYWRhcHRlcgorCQkgKiBBIFBDSTkwNTAgYnVnIHByZXZlbnRzIHJlYWRpbmcgTENSIHJlZ2lzdGVycyBpZiAKKwkJICogTENSIGJhc2UgYWRkcmVzcyBiaXQgNyBpcyBzZXQuIE1haW50YWluIHNoYWRvdworCQkgKiB2YWx1ZSBzbyB3ZSBjYW4gd3JpdGUgdG8gTENSIG1pc2MgY29udHJvbCByZWcuCisJCSAqLworCQlpbmZvLT5taXNjX2N0cmxfdmFsdWUgPSAweDA4N2U0NTQ2OworCQlpbmZvLT5od192ZXJzaW9uID0gMDsKKwl9CisJCQkJCisJbWdzbF9hZGRfZGV2aWNlKGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzeW5jbGlua19yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk0OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpAQCAtMCwwICsxLDU2NzEgQEAKKy8qCisgKiAkSWQ6IHN5bmNsaW5rbXAuYyx2IDQuMzQgMjAwNS8wMy8wNCAxNTowNzoxMCBwYXVsa2YgRXhwICQKKyAqCisgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgTXVsdGlwb3J0CisgKiBoaWdoIHNwZWVkIG11bHRpcHJvdG9jb2wgc2VyaWFsIGFkYXB0ZXIuCisgKgorICogd3JpdHRlbiBieSBQYXVsIEZ1bGdodW0gZm9yIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICogcGF1bGtmQG1pY3JvZ2F0ZS5jb20KKyAqCisgKiBNaWNyb2dhdGUgYW5kIFN5bmNMaW5rIGFyZSB0cmFkZW1hcmtzIG9mIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIERlcml2ZWQgZnJvbSBzZXJpYWwuYyB3cml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28gYW5kIExpbnVzIFRvcnZhbGRzCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgVkVSU0lPTih2ZXIscmVsLHNlcSkgKCgodmVyKTw8MTYpIHwgKChyZWwpPDw4KSB8IChzZXEpKQorI2lmIGRlZmluZWQoX19pMzg2X18pCisjICBkZWZpbmUgQlJFQUtQT0lOVCgpIGFzbSgiICAgaW50ICQzIik7CisjZWxzZQorIyAgZGVmaW5lIEJSRUFLUE9JTlQoKSB7IH0KKyNlbmRpZgorCisjZGVmaW5lIE1BWF9ERVZJQ0VTIDEyCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjaWZkZWYgQ09ORklHX0hETENfTU9EVUxFCisjZGVmaW5lIENPTkZJR19IRExDIDEKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9VU0VSKGVycm9yLHZhbHVlLGFkZHIpIGVycm9yID0gZ2V0X3VzZXIodmFsdWUsYWRkcikKKyNkZWZpbmUgQ09QWV9GUk9NX1VTRVIoZXJyb3IsZGVzdCxzcmMsc2l6ZSkgZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihkZXN0LHNyYyxzaXplKSA/IC1FRkFVTFQgOiAwCisjZGVmaW5lIFBVVF9VU0VSKGVycm9yLHZhbHVlLGFkZHIpIGVycm9yID0gcHV0X3VzZXIodmFsdWUsYWRkcikKKyNkZWZpbmUgQ09QWV9UT19VU0VSKGVycm9yLGRlc3Qsc3JjLHNpemUpIGVycm9yID0gY29weV90b191c2VyKGRlc3Qsc3JjLHNpemUpID8gLUVGQVVMVCA6IDAKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJsaW51eC9zeW5jbGluay5oIgorCitzdGF0aWMgTUdTTF9QQVJBTVMgZGVmYXVsdF9wYXJhbXMgPSB7CisJTUdTTF9NT0RFX0hETEMsCQkJLyogdW5zaWduZWQgbG9uZyBtb2RlICovCisJMCwJCQkJLyogdW5zaWduZWQgY2hhciBsb29wYmFjazsgKi8KKwlIRExDX0ZMQUdfVU5ERVJSVU5fQUJPUlQxNSwJLyogdW5zaWduZWQgc2hvcnQgZmxhZ3M7ICovCisJSERMQ19FTkNPRElOR19OUlpJX1NQQUNFLAkvKiB1bnNpZ25lZCBjaGFyIGVuY29kaW5nOyAqLworCTAsCQkJCS8qIHVuc2lnbmVkIGxvbmcgY2xvY2tfc3BlZWQ7ICovCisJMHhmZiwJCQkJLyogdW5zaWduZWQgY2hhciBhZGRyX2ZpbHRlcjsgKi8KKwlIRExDX0NSQ18xNl9DQ0lUVCwJCS8qIHVuc2lnbmVkIHNob3J0IGNyY190eXBlOyAqLworCUhETENfUFJFQU1CTEVfTEVOR1RIXzhCSVRTLAkvKiB1bnNpZ25lZCBjaGFyIHByZWFtYmxlX2xlbmd0aDsgKi8KKwlIRExDX1BSRUFNQkxFX1BBVFRFUk5fTk9ORSwJLyogdW5zaWduZWQgY2hhciBwcmVhbWJsZTsgKi8KKwk5NjAwLAkJCQkvKiB1bnNpZ25lZCBsb25nIGRhdGFfcmF0ZTsgKi8KKwk4LAkJCQkvKiB1bnNpZ25lZCBjaGFyIGRhdGFfYml0czsgKi8KKwkxLAkJCQkvKiB1bnNpZ25lZCBjaGFyIHN0b3BfYml0czsgKi8KKwlBU1lOQ19QQVJJVFlfTk9ORQkJLyogdW5zaWduZWQgY2hhciBwYXJpdHk7ICovCit9OworCisvKiBzaXplIGluIGJ5dGVzIG9mIERNQSBkYXRhIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgU0NBQlVGU0laRSAJMTAyNAorI2RlZmluZSBTQ0FfTUVNX1NJWkUJMHg0MDAwMAorI2RlZmluZSBTQ0FfQkFTRV9TSVpFICAgNTEyCisjZGVmaW5lIFNDQV9SRUdfU0laRSAgICAxNgorI2RlZmluZSBTQ0FfTUFYX1BPUlRTICAgNAorI2RlZmluZSBTQ0FNQVhERVNDIAkxMjgKKworI2RlZmluZQlCVUZGRVJMSVNUU0laRQk0MDk2CisKKy8qIFNDQS1JIHN0eWxlIERNQSBidWZmZXIgZGVzY3JpcHRvciAqLwordHlwZWRlZiBzdHJ1Y3QgX1NDQURFU0MKK3sKKwl1MTYJbmV4dDsJCS8qIGxvd2VyIGw2IGJpdHMgb2YgbmV4dCBkZXNjcmlwdG9yIGFkZHIgKi8KKwl1MTYJYnVmX3B0cjsJLyogbG93ZXIgMTYgYml0cyBvZiBidWZmZXIgYWRkciAqLworCXU4CWJ1Zl9iYXNlOwkvKiB1cHBlciA4IGJpdHMgb2YgYnVmZmVyIGFkZHIgKi8KKwl1OAlwYWQxOworCXUxNglsZW5ndGg7CQkvKiBsZW5ndGggb2YgYnVmZmVyICovCisJdTgJc3RhdHVzOwkJLyogc3RhdHVzIG9mIGJ1ZmZlciAqLworCXU4CXBhZDI7Cit9IFNDQURFU0MsICpQU0NBREVTQzsKKwordHlwZWRlZiBzdHJ1Y3QgX1NDQURFU0NfRVgKK3sKKwkvKiBkZXZpY2UgZHJpdmVyIGJvb2trZWVwaW5nIHNlY3Rpb24gKi8KKwljaGFyIAkqdmlydF9hZGRyOyAgICAJLyogdmlydHVhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyICovCisJdTE2CXBoeXNfZW50cnk7CS8qIGxvd2VyIDE2LWJpdHMgb2YgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIGRlc2NyaXB0b3IgKi8KK30gU0NBREVTQ19FWCwgKlBTQ0FERVNDX0VYOworCisvKiBUaGUgcXVldWUgb2YgQkggYWN0aW9ucyB0byBiZSBwZXJmb3JtZWQgKi8KKworI2RlZmluZSBCSF9SRUNFSVZFICAxCisjZGVmaW5lIEJIX1RSQU5TTUlUIDIKKyNkZWZpbmUgQkhfU1RBVFVTICAgNAorCisjZGVmaW5lIElPX1BJTl9TSFVURE9XTl9MSU1JVCAxMDAKKworI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCisKK3N0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyB7CisJaW50CXJpX3VwOworCWludAlyaV9kb3duOworCWludAlkc3JfdXA7CisJaW50CWRzcl9kb3duOworCWludAlkY2RfdXA7CisJaW50CWRjZF9kb3duOworCWludAljdHNfdXA7CisJaW50CWN0c19kb3duOworfTsKKworLyoKKyAqIERldmljZSBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBfc3luY2xpbmttcF9pbmZvIHsKKwl2b2lkICppZl9wdHI7CQkJCS8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyICh1c2VkIGJ5IFNQUFApICovCisJaW50CQkJbWFnaWM7CisJaW50CQkJZmxhZ3M7CisJaW50CQkJY291bnQ7CQkvKiBjb3VudCBvZiBvcGVucyAqLworCWludAkJCWxpbmU7CisJdW5zaWduZWQgc2hvcnQJCWNsb3NlX2RlbGF5OworCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7CS8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLworCisJc3RydWN0IG1nc2xfaWNvdW50CWljb3VudDsKKworCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OworCWludAkJCXRpbWVvdXQ7CisJaW50CQkJeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50CQkJYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwl1MTYJCQlyZWFkX3N0YXR1c19tYXNrMTsgIC8qIGJyZWFrIGRldGVjdGlvbiAoU1IxIGluZGljYXRpb25zKSAqLworCXUxNgkJCXJlYWRfc3RhdHVzX21hc2syOyAgLyogcGFyaXR5L2ZyYW1pbmcvb3ZlcnVuIChTUjIgaW5kaWNhdGlvbnMpICovCisJdW5zaWduZWQgY2hhciAJCWlnbm9yZV9zdGF0dXNfbWFzazE7ICAvKiBicmVhayBkZXRlY3Rpb24gKFNSMSBpbmRpY2F0aW9ucykgKi8KKwl1bnNpZ25lZCBjaGFyCQlpZ25vcmVfc3RhdHVzX21hc2syOyAgLyogcGFyaXR5L2ZyYW1pbmcvb3ZlcnVuIChTUjIgaW5kaWNhdGlvbnMpICovCisJdW5zaWduZWQgY2hhciAJCSp0eF9idWY7CisJaW50CQkJdHhfcHV0OworCWludAkJCXR4X2dldDsKKwlpbnQJCQl0eF9jb3VudDsKKworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCisJd2FpdF9xdWV1ZV9oZWFkX3QJc3RhdHVzX2V2ZW50X3dhaXRfcTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlldmVudF93YWl0X3E7CisJc3RydWN0IHRpbWVyX2xpc3QJdHhfdGltZXI7CS8qIEhETEMgdHJhbnNtaXQgdGltZW91dCB0aW1lciAqLworCXN0cnVjdCBfc3luY2xpbmttcF9pbmZvCSpuZXh0X2RldmljZTsJLyogZGV2aWNlIGxpc3QgbGluayAqLworCXN0cnVjdCB0aW1lcl9saXN0CXN0YXR1c190aW1lcjsJLyogaW5wdXQgc2lnbmFsIHN0YXR1cyBjaGVjayB0aW1lciAqLworCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogc3BpbmxvY2sgZm9yIHN5bmNocm9uaXppbmcgd2l0aCBJU1IgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsJIAkJLyogdGFzayBzdHJ1Y3R1cmUgZm9yIHNjaGVkdWxpbmcgYmggKi8KKworCXUzMiBtYXhfZnJhbWVfc2l6ZTsJCQkvKiBhcyBzZXQgYnkgZGV2aWNlIGNvbmZpZyAqLworCisJdTMyIHBlbmRpbmdfYmg7CisKKwlpbnQgYmhfcnVubmluZzsJCQkJLyogUHJvdGVjdGlvbiBmcm9tIG11bHRpcGxlICovCisJaW50IGlzcl9vdmVyZmxvdzsKKwlpbnQgYmhfcmVxdWVzdGVkOworCisJaW50IGRjZF9jaGtjb3VudDsJCQkvKiBjaGVjayBjb3VudHMgdG8gcHJldmVudCAqLworCWludCBjdHNfY2hrY291bnQ7CQkJLyogdG9vIG1hbnkgSVJRcyBpZiBhIHNpZ25hbCAqLworCWludCBkc3JfY2hrY291bnQ7CQkJLyogaXMgZmxvYXRpbmcgKi8KKwlpbnQgcmlfY2hrY291bnQ7CisKKwljaGFyICpidWZmZXJfbGlzdDsJCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgUnggJiBUeCBidWZmZXIgbGlzdHMgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9saXN0X3BoeXM7CisKKwl1bnNpZ25lZCBpbnQgcnhfYnVmX2NvdW50OwkJLyogY291bnQgb2YgdG90YWwgYWxsb2NhdGVkIFJ4IGJ1ZmZlcnMgKi8KKwlTQ0FERVNDICpyeF9idWZfbGlzdDsgICAJCS8qIGxpc3Qgb2YgcmVjZWl2ZSBidWZmZXIgZW50cmllcyAqLworCVNDQURFU0NfRVggcnhfYnVmX2xpc3RfZXhbU0NBTUFYREVTQ107IC8qIGxpc3Qgb2YgcmVjZWl2ZSBidWZmZXIgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBjdXJyZW50X3J4X2J1ZjsKKworCXVuc2lnbmVkIGludCB0eF9idWZfY291bnQ7CQkvKiBjb3VudCBvZiB0b3RhbCBhbGxvY2F0ZWQgVHggYnVmZmVycyAqLworCVNDQURFU0MgKnR4X2J1Zl9saXN0OwkJLyogbGlzdCBvZiB0cmFuc21pdCBidWZmZXIgZW50cmllcyAqLworCVNDQURFU0NfRVggdHhfYnVmX2xpc3RfZXhbU0NBTUFYREVTQ107IC8qIGxpc3Qgb2YgdHJhbnNtaXQgYnVmZmVyIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF90eF9idWY7CisKKwl1bnNpZ25lZCBjaGFyICp0bXBfcnhfYnVmOworCXVuc2lnbmVkIGludCB0bXBfcnhfYnVmX2NvdW50OworCisJaW50IHJ4X2VuYWJsZWQ7CisJaW50IHJ4X292ZXJmbG93OworCisJaW50IHR4X2VuYWJsZWQ7CisJaW50IHR4X2FjdGl2ZTsKKwl1MzIgaWRsZV9tb2RlOworCisJdW5zaWduZWQgY2hhciBpZTBfdmFsdWU7CisJdW5zaWduZWQgY2hhciBpZTFfdmFsdWU7CisJdW5zaWduZWQgY2hhciBpZTJfdmFsdWU7CisJdW5zaWduZWQgY2hhciBjdHJscmVnX3ZhbHVlOworCXVuc2lnbmVkIGNoYXIgb2xkX3NpZ25hbHM7CisKKwljaGFyIGRldmljZV9uYW1lWzI1XTsJCQkvKiBkZXZpY2UgaW5zdGFuY2UgbmFtZSAqLworCisJaW50IHBvcnRfY291bnQ7CisJaW50IGFkYXB0ZXJfbnVtOworCWludCBwb3J0X251bTsKKworCXN0cnVjdCBfc3luY2xpbmttcF9pbmZvICpwb3J0X2FycmF5W1NDQV9NQVhfUE9SVFNdOworCisJdW5zaWduZWQgaW50IGJ1c190eXBlOwkJCS8qIGV4cGFuc2lvbiBidXMgdHlwZSAoSVNBLEVJU0EsUENJKSAqLworCisJdW5zaWduZWQgaW50IGlycV9sZXZlbDsJCQkvKiBpbnRlcnJ1cHQgbGV2ZWwgKi8KKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlpbnQgaXJxX3JlcXVlc3RlZDsJCQkvKiBub256ZXJvIGlmIElSUSByZXF1ZXN0ZWQgKi8KKworCU1HU0xfUEFSQU1TIHBhcmFtczsJCQkvKiBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCisKKwl1bnNpZ25lZCBjaGFyIHNlcmlhbF9zaWduYWxzOwkJLyogY3VycmVudCBzZXJpYWwgc2lnbmFsIHN0YXRlcyAqLworCisJaW50IGlycV9vY2N1cnJlZDsJCQkvKiBmb3IgZGlhZ25vc3RpY3MgdXNlICovCisJdW5zaWduZWQgaW50IGluaXRfZXJyb3I7CQkvKiBJbml0aWFsaXphdGlvbiBzdGFydHVwIGVycm9yICovCisKKwl1MzIgbGFzdF9tZW1fYWxsb2M7CisJdW5zaWduZWQgY2hhciogbWVtb3J5X2Jhc2U7CQkvKiBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgKFBDSSBvbmx5KSAqLworCXUzMiBwaHlzX21lbW9yeV9iYXNlOworICAgIAlpbnQgc2hhcmVkX21lbV9yZXF1ZXN0ZWQ7CisKKwl1bnNpZ25lZCBjaGFyKiBzY2FfYmFzZTsJCS8qIEhENjQ1NzAgU0NBIE1lbW9yeSBhZGRyZXNzICovCisJdTMyIHBoeXNfc2NhX2Jhc2U7CisJdTMyIHNjYV9vZmZzZXQ7CisJaW50IHNjYV9iYXNlX3JlcXVlc3RlZDsKKworCXVuc2lnbmVkIGNoYXIqIGxjcl9iYXNlOwkJLyogbG9jYWwgY29uZmlnIHJlZ2lzdGVycyAoUENJIG9ubHkpICovCisJdTMyIHBoeXNfbGNyX2Jhc2U7CisJdTMyIGxjcl9vZmZzZXQ7CisJaW50IGxjcl9tZW1fcmVxdWVzdGVkOworCisJdW5zaWduZWQgY2hhciogc3RhdGN0cmxfYmFzZTsJCS8qIHN0YXR1cy9jb250cm9sIHJlZ2lzdGVyIG1lbW9yeSAqLworCXUzMiBwaHlzX3N0YXRjdHJsX2Jhc2U7CisJdTMyIHN0YXRjdHJsX29mZnNldDsKKwlpbnQgc2NhX3N0YXRjdHJsX3JlcXVlc3RlZDsKKworCXUzMiBtaXNjX2N0cmxfdmFsdWU7CisJY2hhciBmbGFnX2J1ZltNQVhfQVNZTkNfQlVGRkVSX1NJWkVdOworCWNoYXIgY2hhcl9idWZbTUFYX0FTWU5DX0JVRkZFUl9TSVpFXTsKKwlCT09MRUFOIGRyb3BfcnRzX29uX3R4X2RvbmU7CisKKwlzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMJaW5wdXRfc2lnbmFsX2V2ZW50czsKKworCS8qIFNQUFAvQ2lzY28gSERMQyBkZXZpY2UgcGFydHMgKi8KKwlpbnQgbmV0Y291bnQ7CisJaW50IGRvc3luY3BwcDsKKwlzcGlubG9ja190IG5ldGxvY2s7CisKKyNpZmRlZiBDT05GSUdfSERMQworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisjZW5kaWYKKworfSBTTE1QX0lORk87CisKKyNkZWZpbmUgTUdTTF9NQUdJQyAweDU0MDEKKworLyoKKyAqIGRlZmluZSBzZXJpYWwgc2lnbmFsIHN0YXR1cyBjaGFuZ2UgbWFjcm9zCisgKi8KKyNkZWZpbmUJTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRAkoU2VyaWFsU2lnbmFsX0RDRDw8OCkJLyogaW5kaWNhdGVzIGNoYW5nZSBpbiBEQ0QgKi8KKyNkZWZpbmUgTUlTQ1NUQVRVU19SSV9MQVRDSEVECShTZXJpYWxTaWduYWxfUkk8PDgpCS8qIGluZGljYXRlcyBjaGFuZ2UgaW4gUkkgKi8KKyNkZWZpbmUgTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRAkoU2VyaWFsU2lnbmFsX0NUUzw8OCkJLyogaW5kaWNhdGVzIGNoYW5nZSBpbiBDVFMgKi8KKyNkZWZpbmUgTUlTQ1NUQVRVU19EU1JfTEFUQ0hFRAkoU2VyaWFsU2lnbmFsX0RTUjw8OCkJLyogY2hhbmdlIGluIERTUiAqLworCisvKiBDb21tb24gUmVnaXN0ZXIgbWFjcm9zICovCisjZGVmaW5lIExQUgkweDAwCisjZGVmaW5lIFBBQlIwCTB4MDIKKyNkZWZpbmUgUEFCUjEJMHgwMworI2RlZmluZSBXQ1JMCTB4MDQKKyNkZWZpbmUgV0NSTQkweDA1CisjZGVmaW5lIFdDUkgJMHgwNgorI2RlZmluZSBEUENSCTB4MDgKKyNkZWZpbmUgRE1FUgkweDA5CisjZGVmaW5lIElTUjAJMHgxMAorI2RlZmluZSBJU1IxCTB4MTEKKyNkZWZpbmUgSVNSMgkweDEyCisjZGVmaW5lIElFUjAJMHgxNAorI2RlZmluZSBJRVIxCTB4MTUKKyNkZWZpbmUgSUVSMgkweDE2CisjZGVmaW5lIElUQ1IJMHgxOAorI2RlZmluZSBJTlRWUiAJMHgxYQorI2RlZmluZSBJTVZSCTB4MWMKKworLyogTVNDSSBSZWdpc3RlciBtYWNyb3MgKi8KKyNkZWZpbmUgVFJCCTB4MjAKKyNkZWZpbmUgVFJCTAkweDIwCisjZGVmaW5lIFRSQkgJMHgyMQorI2RlZmluZSBTUjAJMHgyMgorI2RlZmluZSBTUjEJMHgyMworI2RlZmluZSBTUjIJMHgyNAorI2RlZmluZSBTUjMJMHgyNQorI2RlZmluZSBGU1QJMHgyNgorI2RlZmluZSBJRTAJMHgyOAorI2RlZmluZSBJRTEJMHgyOQorI2RlZmluZSBJRTIJMHgyYQorI2RlZmluZSBGSUUJMHgyYgorI2RlZmluZSBDTUQJMHgyYworI2RlZmluZSBNRDAJMHgyZQorI2RlZmluZSBNRDEJMHgyZgorI2RlZmluZSBNRDIJMHgzMAorI2RlZmluZSBDVEwJMHgzMQorI2RlZmluZSBTQTAJMHgzMgorI2RlZmluZSBTQTEJMHgzMworI2RlZmluZSBJREwJMHgzNAorI2RlZmluZSBUTUMJMHgzNQorI2RlZmluZSBSWFMJMHgzNgorI2RlZmluZSBUWFMJMHgzNworI2RlZmluZSBUUkMwCTB4MzgKKyNkZWZpbmUgVFJDMQkweDM5CisjZGVmaW5lIFJSQwkweDNhCisjZGVmaW5lIENTVDAJMHgzYworI2RlZmluZSBDU1QxCTB4M2QKKworLyogVGltZXIgUmVnaXN0ZXIgTWFjcm9zICovCisjZGVmaW5lIFRDTlQJMHg2MAorI2RlZmluZSBUQ05UTAkweDYwCisjZGVmaW5lIFRDTlRICTB4NjEKKyNkZWZpbmUgVENPTlIJMHg2MgorI2RlZmluZSBUQ09OUkwJMHg2MgorI2RlZmluZSBUQ09OUkgJMHg2MworI2RlZmluZSBUTUNTCTB4NjQKKyNkZWZpbmUgVEVQUgkweDY1CisKKy8qIERNQSBDb250cm9sbGVyIFJlZ2lzdGVyIG1hY3JvcyAqLworI2RlZmluZSBEQVJMCTB4ODAKKyNkZWZpbmUgREFSSAkweDgxCisjZGVmaW5lIERBUkIJMHg4MgorI2RlZmluZSBCQVIJMHg4MAorI2RlZmluZSBCQVJMCTB4ODAKKyNkZWZpbmUgQkFSSAkweDgxCisjZGVmaW5lIEJBUkIJMHg4MgorI2RlZmluZSBTQVIJMHg4NAorI2RlZmluZSBTQVJMCTB4ODQKKyNkZWZpbmUgU0FSSAkweDg1CisjZGVmaW5lIFNBUkIJMHg4NgorI2RlZmluZSBDUEIJMHg4NgorI2RlZmluZSBDREEJMHg4OAorI2RlZmluZSBDREFMCTB4ODgKKyNkZWZpbmUgQ0RBSAkweDg5CisjZGVmaW5lIEVEQQkweDhhCisjZGVmaW5lIEVEQUwJMHg4YQorI2RlZmluZSBFREFICTB4OGIKKyNkZWZpbmUgQkZMCTB4OGMKKyNkZWZpbmUgQkZMTAkweDhjCisjZGVmaW5lIEJGTEgJMHg4ZAorI2RlZmluZSBCQ1IJMHg4ZQorI2RlZmluZSBCQ1JMCTB4OGUKKyNkZWZpbmUgQkNSSAkweDhmCisjZGVmaW5lIERTUgkweDkwCisjZGVmaW5lIERNUgkweDkxCisjZGVmaW5lIEZDVAkweDkzCisjZGVmaW5lIERJUgkweDk0CisjZGVmaW5lIERDTUQJMHg5NQorCisvKiBjb21iaW5lIHdpdGggdGltZXIgb3IgRE1BIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgVElNRVIwCTB4MDAKKyNkZWZpbmUgVElNRVIxCTB4MDgKKyNkZWZpbmUgVElNRVIyCTB4MTAKKyNkZWZpbmUgVElNRVIzCTB4MTgKKyNkZWZpbmUgUlhETUEgCTB4MDAKKyNkZWZpbmUgVFhETUEgCTB4MjAKKworLyogU0NBIENvbW1hbmQgQ29kZXMgKi8KKyNkZWZpbmUgTk9PUAkJMHgwMAorI2RlZmluZSBUWFJFU0VUCQkweDAxCisjZGVmaW5lIFRYRU5BQkxFCTB4MDIKKyNkZWZpbmUgVFhESVNBQkxFCTB4MDMKKyNkZWZpbmUgVFhDUkNJTklUCTB4MDQKKyNkZWZpbmUgVFhDUkNFWENMCTB4MDUKKyNkZWZpbmUgVFhFT00JCTB4MDYKKyNkZWZpbmUgVFhBQk9SVAkJMHgwNworI2RlZmluZSBNUE9OCQkweDA4CisjZGVmaW5lIFRYQlVGQ0xSCTB4MDkKKyNkZWZpbmUgUlhSRVNFVAkJMHgxMQorI2RlZmluZSBSWEVOQUJMRQkweDEyCisjZGVmaW5lIFJYRElTQUJMRQkweDEzCisjZGVmaW5lIFJYQ1JDSU5JVAkweDE0CisjZGVmaW5lIFJYUkVKRUNUCTB4MTUKKyNkZWZpbmUgU0VBUkNITVAJMHgxNgorI2RlZmluZSBSWENSQ0VYQ0wJMHgxNworI2RlZmluZSBSWENSQ0NBTEMJMHgxOAorI2RlZmluZSBDSFJFU0VUCQkweDIxCisjZGVmaW5lIEhVTlQJCTB4MzEKKworLyogRE1BIGNvbW1hbmQgY29kZXMgKi8KKyNkZWZpbmUgU1dBQk9SVAkJMHgwMQorI2RlZmluZSBGRUlDTEVBUgkweDAyCisKKy8qIElFMCAqLworI2RlZmluZSBUWElOVEUgCQlCSVQ3CisjZGVmaW5lIFJYSU5URSAJCUJJVDYKKyNkZWZpbmUgVFhSRFlFIAkJQklUMQorI2RlZmluZSBSWFJEWUUgCQlCSVQwCisKKy8qIElFMSAmIFNSMSAqLworI2RlZmluZSBVRFJOICAgCUJJVDcKKyNkZWZpbmUgSURMRSAgIAlCSVQ2CisjZGVmaW5lIFNZTkNEICAJQklUNAorI2RlZmluZSBGTEdEICAgCUJJVDQKKyNkZWZpbmUgQ0NUUyAgIAlCSVQzCisjZGVmaW5lIENEQ0QgICAJQklUMgorI2RlZmluZSBCUktEICAgCUJJVDEKKyNkZWZpbmUgQUJURCAgIAlCSVQxCisjZGVmaW5lIEdBUEQgICAJQklUMQorI2RlZmluZSBCUktFICAgCUJJVDAKKyNkZWZpbmUgSURMRAlCSVQwCisKKy8qIElFMiAmIFNSMiAqLworI2RlZmluZSBFT00JQklUNworI2RlZmluZSBQTVAJQklUNgorI2RlZmluZSBTSFJUCUJJVDYKKyNkZWZpbmUgUEUJQklUNQorI2RlZmluZSBBQlQJQklUNQorI2RlZmluZSBGUk1FCUJJVDQKKyNkZWZpbmUgUkJJVAlCSVQ0CisjZGVmaW5lIE9WUk4JQklUMworI2RlZmluZSBDUkNFCUJJVDIKKworCisvKgorICogR2xvYmFsIGxpbmtlZCBsaXN0IG9mIFN5bmNMaW5rIGRldmljZXMKKyAqLworc3RhdGljIFNMTVBfSU5GTyAqc3luY2xpbmttcF9kZXZpY2VfbGlzdCA9IE5VTEw7CitzdGF0aWMgaW50IHN5bmNsaW5rbXBfYWRhcHRlcl9jb3VudCA9IC0xOworc3RhdGljIGludCBzeW5jbGlua21wX2RldmljZV9jb3VudCA9IDA7CisKKy8qCisgKiBTZXQgdGhpcyBwYXJhbSB0byBub24temVybyB0byBsb2FkIGVheCB3aXRoIHRoZQorICogLnRleHQgc2VjdGlvbiBhZGRyZXNzIGFuZCBicmVha3BvaW50IG9uIG1vZHVsZSBsb2FkLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHVzZSB3aXRoIGdkYiBhbmQgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgYnJlYWtfb25fbG9hZD0wOworCisvKgorICogRHJpdmVyIG1ham9yIG51bWJlciwgZGVmYXVsdHMgdG8gemVybyB0byBnZXQgYXV0bworICogYXNzaWduZWQgbWFqb3IgbnVtYmVyLiBNYXkgYmUgZm9yY2VkIGFzIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgdHR5bWFqb3I9MDsKKworLyoKKyAqIEFycmF5IG9mIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMgZm9yIElTQSBhZGFwdGVycy4KKyAqLworc3RhdGljIGludCBkZWJ1Z19sZXZlbCA9IDA7CitzdGF0aWMgaW50IG1heGZyYW1lW01BWF9ERVZJQ0VTXSA9IHswLH07CitzdGF0aWMgaW50IGRvc3luY3BwcFtNQVhfREVWSUNFU10gPSB7MCx9OworCittb2R1bGVfcGFyYW0oYnJlYWtfb25fbG9hZCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWdfbGV2ZWwsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4ZnJhbWUsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG9zeW5jcHBwLCBpbnQsIE5VTEwsIDApOworCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAiU3luY0xpbmsgTXVsdGlQb3J0IGRyaXZlciI7CitzdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjM0ICQiOworCitzdGF0aWMgaW50IHN5bmNsaW5rbXBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIHN5bmNsaW5rbXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN5bmNsaW5rbXBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9NSUNST0dBVEUsIFBDSV9ERVZJQ0VfSURfTUlDUk9HQVRFX1NDQSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0sIC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN5bmNsaW5rbXBfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN5bmNsaW5rbXBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic3luY2xpbmttcCIsCisJLmlkX3RhYmxlCT0gc3luY2xpbmttcF9wY2lfdGJsLAorCS5wcm9iZQkJPSBzeW5jbGlua21wX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3luY2xpbmttcF9yZW1vdmVfb25lKSwKK307CisKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfZHJpdmVyOworCisvKiBudW1iZXIgb2YgY2hhcmFjdGVycyBsZWZ0IGluIHhtaXQgYnVmZmVyIGJlZm9yZSB3ZSBhc2sgZm9yIG1vcmUgKi8KKyNkZWZpbmUgV0FLRVVQX0NIQVJTIDI1NgorCisKKy8qIHR0eSBjYWxsYmFja3MgKi8KKworc3RhdGljIGludCAgb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworc3RhdGljIHZvaWQgY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK3N0YXRpYyB2b2lkIGhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CisKK3N0YXRpYyBpbnQgIHdyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHB1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpOworc3RhdGljIHZvaWQgc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIHdhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW50ICB3cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBmbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCB0eF9ob2xkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgdHhfcmVsZWFzZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworc3RhdGljIGludCAgaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgIHJlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LGludCAqZW9mLCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgIGNoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKK3N0YXRpYyB2b2lkIHVudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOworc3RhdGljIHZvaWQgc2V0X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSk7CisKKyNpZmRlZiBDT05GSUdfSERMQworI2RlZmluZSBkZXZfdG9fcG9ydChEKSAoZGV2X3RvX2hkbGMoRCktPnByaXYpCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoU0xNUF9JTkZPICppbmZvLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgIGhkbGNkZXZfaW5pdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KFNMTVBfSU5GTyAqaW5mbyk7CisjZW5kaWYKKworLyogaW9jdGwgaGFuZGxlcnMgKi8KKworc3RhdGljIGludCAgZ2V0X3N0YXRzKFNMTVBfSU5GTyAqaW5mbywgc3RydWN0IG1nc2xfaWNvdW50IF9fdXNlciAqdXNlcl9pY291bnQpOworc3RhdGljIGludCAgZ2V0X3BhcmFtcyhTTE1QX0lORk8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqcGFyYW1zKTsKK3N0YXRpYyBpbnQgIHNldF9wYXJhbXMoU0xNUF9JTkZPICppbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKnBhcmFtcyk7CitzdGF0aWMgaW50ICBnZXRfdHhpZGxlKFNMTVBfSU5GTyAqaW5mbywgaW50IF9fdXNlciAqaWRsZV9tb2RlKTsKK3N0YXRpYyBpbnQgIHNldF90eGlkbGUoU0xNUF9JTkZPICppbmZvLCBpbnQgaWRsZV9tb2RlKTsKK3N0YXRpYyBpbnQgIHR4X2VuYWJsZShTTE1QX0lORk8gKmluZm8sIGludCBlbmFibGUpOworc3RhdGljIGludCAgdHhfYWJvcnQoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIHJ4X2VuYWJsZShTTE1QX0lORk8gKmluZm8sIGludCBlbmFibGUpOworc3RhdGljIGludCAgbWFwX3N0YXR1cyhpbnQgc2lnbmFscyk7CitzdGF0aWMgaW50ICBtb2RlbV9pbnB1dF93YWl0KFNMTVBfSU5GTyAqaW5mbyxpbnQgYXJnKTsKK3N0YXRpYyBpbnQgIHdhaXRfbWdzbF9ldmVudChTTE1QX0lORk8gKmluZm8sIGludCBfX3VzZXIgKm1hc2tfcHRyKTsKK3N0YXRpYyBpbnQgIHRpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgIHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CitzdGF0aWMgdm9pZCBzZXRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKTsKKworc3RhdGljIHZvaWQgYWRkX2RldmljZShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgZGV2aWNlX2luaXQoaW50IGFkYXB0ZXJfbnVtLCBzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaW50ICBjbGFpbV9yZXNvdXJjZXMoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVzb3VyY2VzKFNMTVBfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyBpbnQgIHN0YXJ0dXAoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHNodXRkb3duKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBwcm9ncmFtX2h3KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfcGFyYW1zKFNMTVBfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyBpbnQgIGluaXRfYWRhcHRlcihTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgcmVnaXN0ZXJfdGVzdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgaXJxX3Rlc3QoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIGxvb3BiYWNrX3Rlc3QoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIGFkYXB0ZXJfdGVzdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgbWVtb3J5X3Rlc3QoU0xNUF9JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgcmVzZXRfYWRhcHRlcihTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcmVzZXRfcG9ydChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgYXN5bmNfbW9kZShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaGRsY19tb2RlKFNMTVBfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHJ4X3N0b3AoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHJ4X3N0YXJ0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9yZXNldF9idWZmZXJzKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9mcmVlX2ZyYW1lX2J1ZmZlcnMoU0xNUF9JTkZPICppbmZvLCB1bnNpZ25lZCBpbnQgZmlyc3QsIHVuc2lnbmVkIGludCBsYXN0KTsKK3N0YXRpYyBpbnQgIHJ4X2dldF9mcmFtZShTTE1QX0lORk8gKmluZm8pOworCitzdGF0aWMgdm9pZCB0eF9zdGFydChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfc3RvcChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfbG9hZF9maWZvKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0eF9zZXRfaWRsZShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfbG9hZF9kbWFfYnVmZmVyKFNMTVBfSU5GTyAqaW5mbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpOworCitzdGF0aWMgdm9pZCBnZXRfc2lnbmFscyhTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgc2V0X3NpZ25hbHMoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9sb29wYmFjayhTTE1QX0lORk8gKmluZm8sIGludCBlbmFibGUpOworc3RhdGljIHZvaWQgc2V0X3JhdGUoU0xNUF9JTkZPICppbmZvLCB1MzIgZGF0YV9yYXRlKTsKKworc3RhdGljIGludCAgYmhfYWN0aW9uKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHZvaWQqIENvbnRleHQpOworc3RhdGljIHZvaWQgYmhfcmVjZWl2ZShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgYmhfdHJhbnNtaXQoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGJoX3N0YXR1cyhTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3RpbWVyKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfcnhpbnQoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl9yeHJkeShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3R4aW50KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfdHhyZHkoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl9yeGRtYW9rKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfcnhkbWFlcnJvcihTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3R4ZG1hb2soU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl90eGRtYWVycm9yKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfaW9fcGluKFNMTVBfSU5GTyAqaW5mbywgdTE2IHN0YXR1cyk7CisKK3N0YXRpYyBpbnQgIGFsbG9jX2RtYV9idWZzKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBmcmVlX2RtYV9idWZzKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGxvY19idWZfbGlzdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgYWxsb2NfZnJhbWVfYnVmcyhTTE1QX0lORk8gKmluZm8sIFNDQURFU0MgKmxpc3QsIFNDQURFU0NfRVggKmxpc3RfZXgsaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgIGFsbG9jX3RtcF9yeF9idWYoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGZyZWVfdG1wX3J4X2J1ZihTTE1QX0lORk8gKmluZm8pOworCitzdGF0aWMgdm9pZCBsb2FkX3BjaV9tZW1vcnkoU0xNUF9JTkZPICppbmZvLCBjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKK3N0YXRpYyB2b2lkIHRyYWNlX2Jsb2NrKFNMTVBfSU5GTyAqaW5mbywgY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCk7CitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CitzdGF0aWMgdm9pZCBzdGF0dXNfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX3JlZyhTTE1QX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgYWRkcik7CitzdGF0aWMgdm9pZCB3cml0ZV9yZWcoU0xNUF9JTkZPICppbmZvLCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3N0YXRpYyB1MTYgcmVhZF9yZWcxNihTTE1QX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgYWRkcik7CitzdGF0aWMgdm9pZCB3cml0ZV9yZWcxNihTTE1QX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgYWRkciwgdTE2IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX3N0YXR1c19yZWcoU0xNUF9JTkZPICogaW5mbyk7CitzdGF0aWMgdm9pZCB3cml0ZV9jb250cm9sX3JlZyhTTE1QX0lORk8gKiBpbmZvKTsKKworCitzdGF0aWMgdW5zaWduZWQgY2hhciByeF9hY3RpdmVfZmlmb19sZXZlbCA9IDE2OwkvLyByeCByZXF1ZXN0IEZJRk8gYWN0aXZhdGlvbiBsZXZlbCBpbiBieXRlcworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhfYWN0aXZlX2ZpZm9fbGV2ZWwgPSAxNjsJLy8gdHggcmVxdWVzdCBGSUZPIGFjdGl2YXRpb24gbGV2ZWwgaW4gYnl0ZXMKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR4X25lZ2F0ZV9maWZvX2xldmVsID0gMzI7CS8vIHR4IHJlcXVlc3QgRklGTyBuZWdhdGlvbiBsZXZlbCBpbiBieXRlcworCitzdGF0aWMgdTMyIG1pc2NfY3RybF92YWx1ZSA9IDB4MDA3ZTQwNDA7CitzdGF0aWMgdTMyIGxjcjFfYnJkcl92YWx1ZSA9IDB4MDA4MDAwMjk7CisKK3N0YXRpYyB1MzIgcmVhZF9haGVhZF9jb3VudCA9IDg7CisKKy8qIERQQ1IsIERNQSBQcmlvcml0eSBDb250cm9sCisgKgorICogMDcuLjA1ICBOb3QgdXNlZCwgbXVzdCBiZSAwCisgKiAwNCAgICAgIEJSQywgYnVzIHJlbGVhc2UgY29uZGl0aW9uOiAwPWFsbCB0cmFuc2ZlcnMgY29tcGxldGUKKyAqICAgICAgICAgICAgICAxPXJlbGVhc2UgYWZ0ZXIgMSB4ZmVyIG9uIGFsbCBjaGFubmVscworICogMDMgICAgICBDQ0MsIGNoYW5uZWwgY2hhbmdlIGNvbmRpdGlvbjogMD1ldmVyeSBjeWNsZQorICogICAgICAgICAgICAgIDE9YWZ0ZXIgZWFjaCBjaGFubmVsIGNvbXBsZXRlcyBhbGwgeGZlcnMKKyAqIDAyLi4wMCAgUFI8Mi4uMD4sIHByaW9yaXR5IDEwMD1yb3VuZCByb2JpbgorICoKKyAqIDAwMDAwMTAwID0gMHgwMAorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBkbWFfcHJpb3JpdHkgPSAweDA0OworCisvLyBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBzaGFyZWQgUkFNCisvLyBpbiBhIHNpbmdsZSB3cml0ZSBvcGVyYXRpb24KK3N0YXRpYyB1MzIgc2NhX3BjaV9sb2FkX2ludGVydmFsID0gNjQ7CisKKy8qCisgKiAxc3QgZnVuY3Rpb24gZGVmaW5lZCBpbiAudGV4dCBzZWN0aW9uLiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4KKyAqIGluaXRfbW9kdWxlKCkgZm9sbG93ZWQgYnkgYSBicmVha3BvaW50IGFsbG93cyBhIHJlbW90ZSBkZWJ1Z2dlcgorICogKGdkYikgdG8gZ2V0IHRoZSAudGV4dCBhZGRyZXNzIGZvciB0aGUgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisgKiBUaGlzIGFsbG93cyByZW1vdGUgZGVidWdnaW5nIG9mIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMuCisgKi8KK3N0YXRpYyB2b2lkKiBzeW5jbGlua21wX2dldF90ZXh0X3B0cih2b2lkKTsKK3N0YXRpYyB2b2lkKiBzeW5jbGlua21wX2dldF90ZXh0X3B0cih2b2lkKSB7cmV0dXJuIHN5bmNsaW5rbXBfZ2V0X3RleHRfcHRyO30KKworc3RhdGljIGlubGluZSBpbnQgc2FuaXR5X2NoZWNrKFNMTVBfSU5GTyAqaW5mbywKKwkJCSAgICAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFNBTklUWV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzeW5jbGlua21wX3N0cnVjdCAoJXMpIGluICVzXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRpbmZvID0KKwkJIldhcm5pbmc6IG51bGwgc3luY2xpbmttcF9zdHJ1Y3QgZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IE1HU0xfTUFHSUMpIHsKKwkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorI2Vsc2UKKwlpZiAoIWluZm8pCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbGluZSBkaXNjaXBsaW5lIGNhbGxiYWNrIHdyYXBwZXJzCisgKgorICogVGhlIHdyYXBwZXJzIG1haW50YWluIGxpbmUgZGlzY2lwbGluZSByZWZlcmVuY2VzCisgKiB3aGlsZSBjYWxsaW5nIGludG8gdGhlIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBsZGlzY19yZWNlaXZlX2J1ZiAgLSBwYXNzIHJlY2VpdmUgZGF0YSB0byBsaW5lIGRpc2NpcGxpbmUKKyAqLworCitzdGF0aWMgdm9pZCBsZGlzY19yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICAgICAgY29uc3QgX191OCAqZGF0YSwgY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChsZCkgeworCQlpZiAobGQtPnJlY2VpdmVfYnVmKQorCQkJbGQtPnJlY2VpdmVfYnVmKHR0eSwgZGF0YSwgZmxhZ3MsIGNvdW50KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9Cit9CisKKy8qIHR0eSBjYWxsYmFja3MgKi8KKworLyogQ2FsbGVkIHdoZW4gYSBwb3J0IGlzIG9wZW5lZC4gIEluaXQgYW5kIGVuYWJsZSBwb3J0LgorICovCitzdGF0aWMgaW50IG9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJU0xNUF9JTkZPICppbmZvOworCWludCByZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IHN5bmNsaW5rbXBfZGV2aWNlX2NvdW50KSkgeworCQlwcmludGsoIiVzKCVkKTogb3BlbiB3aXRoIGludmFsaWQgbGluZSAjJWQuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sbGluZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWluZm8gPSBzeW5jbGlua21wX2RldmljZV9saXN0OworCXdoaWxlKGluZm8gJiYgaW5mby0+bGluZSAhPSBsaW5lKQorCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJvcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCWlmICggaW5mby0+aW5pdF9lcnJvciApIHsKKwkJcHJpbnRrKCIlcyglZCk6JXMgZGV2aWNlIGlzIG5vdCBhbGxvY2F0ZWQsIGluaXQgZXJyb3I9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxpbmZvLT5pbml0X2Vycm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CisJaW5mby0+dHR5ID0gdHR5OworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIG9wZW4oKSwgb2xkIHJlZiBjb3VudCA9ICVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7CisKKwkvKiBJZiBwb3J0IGlzIGNsb3NpbmcsIHNpZ25hbCBjYWxsZXIgdG8gdHJ5IGFnYWluICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKXsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlyZXR2YWwgPSAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5uZXRjb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlpbmZvLT5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT5jb3VudCA9PSAxKSB7CisJCS8qIDFzdCBvcGVuIG9uIHRoaXMgZGV2aWNlLCBpbml0IGhhcmR3YXJlICovCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBjbGVhbnVwOworCX0KKworCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCQlwcmludGsoIiVzKCVkKTolcyBibG9ja190aWxfcmVhZHkoKSByZXR1cm5lZCAlZFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXR2YWwpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIG9wZW4oKSBzdWNjZXNzXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJcmV0dmFsID0gMDsKKworY2xlYW51cDoKKwlpZiAocmV0dmFsKSB7CisJCWlmICh0dHktPmNvdW50ID09IDEpCisJCQlpbmZvLT50dHkgPSBOVUxMOyAvKiB0dHkgbGF5ZXIgd2lsbCByZWxlYXNlIHR0eSBzdHJ1Y3QgKi8KKwkJaWYoaW5mby0+Y291bnQpCisJCQlpbmZvLT5jb3VudC0tOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIENhbGxlZCB3aGVuIHBvcnQgaXMgY2xvc2VkLiBXYWl0IGZvciByZW1haW5pbmcgZGF0YSB0byBiZQorICogc2VudC4gRGlzYWJsZSBwb3J0IGFuZCBmcmVlIHJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQgY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJU0xNUF9JTkZPICogaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjbG9zZSIpKQorCQlyZXR1cm47CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgY2xvc2UoKSBlbnRyeSwgY291bnQ9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5jb3VudCk7CisKKwlpZiAoIWluZm8tPmNvdW50KQorCQlyZXR1cm47CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiB0dHktPmNvdW50IGlzIDEgYW5kIHRoZSB0dHkgc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuCisJCSAqIGluZm8tPmNvdW50IHNob3VsZCBiZSBvbmUgaW4gdGhpcyBjYXNlLgorCQkgKiBpZiBpdCdzIG5vdCwgY29ycmVjdCBpdCBzbyB0aGF0IHRoZSBwb3J0IGlzIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKCIlcyglZCk6JXMgY2xvc2U6IGJhZCByZWZjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5jb3VudCk7CisJCWluZm8tPmNvdW50ID0gMTsKKwl9CisKKwlpbmZvLT5jb3VudC0tOworCisJLyogaWYgYXQgbGVhc3Qgb25lIG9wZW4gcmVtYWluaW5nLCBsZWF2ZSBoYXJkd2FyZSBhY3RpdmUgKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCWdvdG8gY2xlYW51cDsKKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKwkvKiBzZXQgdHR5LT5jbG9zaW5nIHRvIG5vdGlmeSBsaW5lIGRpc2NpcGxpbmUgdG8KKwkgKiBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4gT25seSB0aGUgTl9UVFkKKwkgKiBkaXNjaXBsaW5lIGFwcGVhcnMgdG8gdXNlIHRoaXMgKHBwcCBkb2VzIG5vdCkuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGRhdGEgdG8gY2xlYXIgYWxsIGxheWVycyAqLworCisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOiVzIGNsb3NlKCkgY2FsbGluZyB0dHlfd2FpdF91bnRpbF9zZW50XG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJfQorCisgCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorIAkJd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwlzaHV0ZG93bihpbmZvKTsKKworCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKworCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisKK2NsZWFudXA6CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIGNsb3NlKCkgZXhpdCwgY291bnQ9JWRcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50KTsKK30KKworLyogQ2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyBjbG9zaW5nIGFsbCBvcGVuIGRlc2NyaXB0b3JzIGZvciB0aGUgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgaGFuZ3VwKClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImhhbmd1cCIpKQorCQlyZXR1cm47CisKKwlmbHVzaF9idWZmZXIodHR5KTsKKwlzaHV0ZG93bihpbmZvKTsKKworCWluZm8tPmNvdW50ID0gMDsKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworfQorCisvKiBTZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MKKyAqLworc3RhdGljIHZvaWQgc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgc2V0X3Rlcm1pb3MoKVxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQl0dHktPmRyaXZlci0+bmFtZSApOworCisJLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQorCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKQorCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQorCSAgcmV0dXJuOworCisJY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLworCWlmIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorCisJLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSB7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EVFI7CisgCQlpZiAoISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fAorIAkJICAgICF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisgCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9CisKKwkvKiBIYW5kbGUgdHVybmluZyBvZmYgQ1JUU0NUUyAqLworCWlmIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQl0eF9yZWxlYXNlKHR0eSk7CisJfQorfQorCisvKiBTZW5kIGEgYmxvY2sgb2YgZGF0YQorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAJdHR5CQlwb2ludGVyIHRvIHR0eSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIAlidWYJCXBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgc2VuZCBkYXRhCisgKiAJY291bnQJCXNpemUgb2Ygc2VuZCBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuIFZhbHVlOgludW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludAljLCByZXQgPSAwOworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgd3JpdGUoKSBjb3VudD0lZFxuIiwKKwkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGNvdW50KTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAid3JpdGUiKSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKCF0dHkgfHwgIWluZm8tPnR4X2J1ZikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWlmIChjb3VudCA+IGluZm8tPm1heF9mcmFtZV9zaXplKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWlmIChpbmZvLT50eF9hY3RpdmUpCisJCQlnb3RvIGNsZWFudXA7CisJCWlmIChpbmZvLT50eF9jb3VudCkgeworCQkJLyogc2VuZCBhY2N1bXVsYXRlZCBkYXRhIGZyb20gc2VuZF9jaGFyKCkgY2FsbHMgKi8KKwkJCS8qIGFzIGZyYW1lIGFuZCB3YWl0IGJlZm9yZSBhY2NlcHRpbmcgbW9yZSBkYXRhLiAqLworCQkJdHhfbG9hZF9kbWFfYnVmZmVyKGluZm8sIGluZm8tPnR4X2J1ZiwgaW5mby0+dHhfY291bnQpOworCQkJZ290byBzdGFydDsKKwkJfQorCQlyZXQgPSBpbmZvLT50eF9jb3VudCA9IGNvdW50OworCQl0eF9sb2FkX2RtYV9idWZmZXIoaW5mbywgYnVmLCBjb3VudCk7CisJCWdvdG8gc3RhcnQ7CisJfQorCisJZm9yICg7OykgeworCQljID0gbWluX3QoaW50LCBjb3VudCwKKwkJCW1pbihpbmZvLT5tYXhfZnJhbWVfc2l6ZSAtIGluZm8tPnR4X2NvdW50IC0gMSwKKwkJCSAgICBpbmZvLT5tYXhfZnJhbWVfc2l6ZSAtIGluZm8tPnR4X3B1dCkpOworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisJCQkKKwkJbWVtY3B5KGluZm8tPnR4X2J1ZiArIGluZm8tPnR4X3B1dCwgYnVmLCBjKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWluZm8tPnR4X3B1dCArPSBjOworCQlpZiAoaW5mby0+dHhfcHV0ID49IGluZm8tPm1heF9mcmFtZV9zaXplKQorCQkJaW5mby0+dHhfcHV0IC09IGluZm8tPm1heF9mcmFtZV9zaXplOworCQlpbmZvLT50eF9jb3VudCArPSBjOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0ICs9IGM7CisJfQorCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWlmIChjb3VudCkgeworCQkJcmV0ID0gaW5mby0+dHhfY291bnQgPSAwOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXR4X2xvYWRfZG1hX2J1ZmZlcihpbmZvLCBpbmZvLT50eF9idWYsIGluZm8tPnR4X2NvdW50KTsKKwl9CitzdGFydDoKKyAJaWYgKGluZm8tPnR4X2NvdW50ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWlmICghaW5mby0+dHhfYWN0aXZlKQorCQkgCXR4X3N0YXJ0KGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKyAJfQorCitjbGVhbnVwOgorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6JXMgd3JpdGUoKSByZXR1cm5pbmc9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxyZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEFkZCBhIGNoYXJhY3RlciB0byB0aGUgdHJhbnNtaXQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBwdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKSB7CisJCXByaW50ayggIiVzKCVkKTolcyBwdXRfY2hhciglZClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxjaCk7CisJfQorCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJwdXRfY2hhciIpKQorCQlyZXR1cm47CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlpZiAoIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfSERMQykgfHwKKwkgICAgICFpbmZvLT50eF9hY3RpdmUgKSB7CisKKwkJaWYgKGluZm8tPnR4X2NvdW50IDwgaW5mby0+bWF4X2ZyYW1lX3NpemUgLSAxKSB7CisJCQlpbmZvLT50eF9idWZbaW5mby0+dHhfcHV0KytdID0gY2g7CisJCQlpZiAoaW5mby0+dHhfcHV0ID49IGluZm8tPm1heF9mcmFtZV9zaXplKQorCQkJCWluZm8tPnR4X3B1dCAtPSBpbmZvLT5tYXhfZnJhbWVfc2l6ZTsKKwkJCWluZm8tPnR4X2NvdW50Kys7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogU2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHNlbmRfeGNoYXIoJWQpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgY2ggKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAic2VuZF94Y2hhciIpKQorCQlyZXR1cm47CisKKwlpbmZvLT54X2NoYXIgPSBjaDsKKwlpZiAoY2gpIHsKKwkJLyogTWFrZSBzdXJlIHRyYW5zbWl0IGludGVycnVwdHMgYXJlIG9uICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCQkgCXR4X3N0YXJ0KGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5LgorICovCitzdGF0aWMgdm9pZCB3YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJU0xNUF9JTkZPICogaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7CisKKwlpZiAoIWluZm8gKQorCQlyZXR1cm47CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgd2FpdF91bnRpbF9zZW50KCkgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIndhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJZ290byBleGl0OworCisJb3JpZ19qaWZmaWVzID0gamlmZmllczsKKworCS8qIFNldCBjaGVjayBpbnRlcnZhbCB0byAxLzUgb2YgZXN0aW1hdGVkIHRpbWUgdG8KKwkgKiBzZW5kIGEgY2hhcmFjdGVyLCBhbmQgbWFrZSBpdCBhdCBsZWFzdCAxLiBUaGUgY2hlY2sKKwkgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCisJICogTm90ZTogdXNlIHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5IHRoZSBOSVNULVBDVFMuCisJICovCisKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKSB7CisJICAgICAgIAljaGFyX3RpbWUgPSBpbmZvLT50aW1lb3V0LygzMiAqIDUpOworCQlpZiAoIWNoYXJfdGltZSkKKwkJCWNoYXJfdGltZSsrOworCX0gZWxzZQorCQljaGFyX3RpbWUgPSAxOworCisJaWYgKHRpbWVvdXQpCisJCWNoYXJfdGltZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNoYXJfdGltZSwgdGltZW91dCk7CisKKwlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDICkgeworCQl3aGlsZSAoaW5mby0+dHhfYWN0aXZlKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8vVE9ETzogZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBzaW1pbGFyIHRvIFVTQzE2QzMyCisJCS8vIAlUWFNUQVRVU19BTExfU0VOVCBzdGF0dXMKKwkJd2hpbGUgKCBpbmZvLT50eF9hY3RpdmUgJiYgaW5mby0+dHhfZW5hYmxlZCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKK2V4aXQ6CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHdhaXRfdW50aWxfc2VudCgpIGV4aXRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7Cit9CisKKy8qIFJldHVybiB0aGUgY291bnQgb2YgZnJlZSBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCB3cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAid3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQlyZXQgPSAoaW5mby0+dHhfYWN0aXZlKSA/IDAgOiBIRExDX01BWF9GUkFNRV9TSVpFOworCX0gZWxzZSB7CisJCXJldCA9IGluZm8tPm1heF9mcmFtZV9zaXplIC0gaW5mby0+dHhfY291bnQgLSAxOworCQlpZiAocmV0IDwgMCkKKwkJCXJldCA9IDA7CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHdyaXRlX3Jvb20oKT0lZFxuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHNlbmQgcmVtYWluaW5nIGJ1ZmZlcmVkIGNoYXJhY3RlcnMKKyAqLworc3RhdGljIHZvaWQgZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIGZsdXNoX2NoYXJzKCkgZW50cnkgdHhfY291bnQ9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxpbmZvLT50eF9jb3VudCk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKworCWlmIChpbmZvLT50eF9jb3VudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwKKwkgICAgIWluZm8tPnR4X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIGZsdXNoX2NoYXJzKCkgZW50cnksIHN0YXJ0aW5nIHRyYW5zbWl0dGVyXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWlmICghaW5mby0+dHhfYWN0aXZlKSB7CisJCWlmICggKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSAmJgorCQkJaW5mby0+dHhfY291bnQgKSB7CisJCQkvKiBvcGVyYXRpbmcgaW4gc3luY2hyb25vdXMgKGZyYW1lIG9yaWVudGVkKSBtb2RlICovCisJCQkvKiBjb3B5IGRhdGEgZnJvbSBjaXJjdWxhciB0eF9idWYgdG8gKi8KKwkJCS8qIHRyYW5zbWl0IERNQSBidWZmZXIuICovCisJCQl0eF9sb2FkX2RtYV9idWZmZXIoaW5mbywKKwkJCQkgaW5mby0+dHhfYnVmLGluZm8tPnR4X2NvdW50KTsKKwkJfQorCSAJdHhfc3RhcnQoaW5mbyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIERpc2NhcmQgYWxsIGRhdGEgaW4gdGhlIHNlbmQgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgZmx1c2hfYnVmZmVyKCkgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKK30KKworLyogdGhyb3R0bGUgKHN0b3ApIHRyYW5zbWl0dGVyCisgKi8KK3N0YXRpYyB2b2lkIHR4X2hvbGQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ0eF9ob2xkIikpCisJCXJldHVybjsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMoJWQpOiVzIHR4X2hvbGQoKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoaW5mby0+dHhfZW5hYmxlZCkKKwkgCXR4X3N0b3AoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIHJlbGVhc2UgKHN0YXJ0KSB0cmFuc21pdHRlcgorICovCitzdGF0aWMgdm9pZCB0eF9yZWxlYXNlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidHhfcmVsZWFzZSIpKQorCQlyZXR1cm47CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoIiVzKCVkKTolcyB0eF9yZWxlYXNlKClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCSAJdHhfc3RhcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIFNlcnZpY2UgYW4gSU9DVEwgcmVxdWVzdAorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAJdHR5CXBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIAlmaWxlCXBvaW50ZXIgdG8gYXNzb2NpYXRlZCBmaWxlIG9iamVjdCBmb3IgZGV2aWNlCisgKiAJY21kCUlPQ1RMIGNvbW1hbmQgY29kZQorICogCWFyZwljb21tYW5kIGFyZ3VtZW50L2NvbnRleHQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CS8qIHVzZXIgc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIGlvY3RsKCkgY21kPSUwOFhcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGNtZCApOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJpb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNR1NMX0lPQ0dQQVJBTVM6CisJCXJldHVybiBnZXRfcGFyYW1zKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NTUEFSQU1TOgorCQlyZXR1cm4gc2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DR1RYSURMRToKKwkJcmV0dXJuIGdldF90eGlkbGUoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1NUWElETEU6CisJCXJldHVybiBzZXRfdHhpZGxlKGluZm8sIChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DVFhFTkFCTEU6CisJCXJldHVybiB0eF9lbmFibGUoaW5mbywgKGludClhcmcpOworCWNhc2UgTUdTTF9JT0NSWEVOQUJMRToKKwkJcmV0dXJuIHJ4X2VuYWJsZShpbmZvLCAoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ1RYQUJPUlQ6CisJCXJldHVybiB0eF9hYm9ydChpbmZvKTsKKwljYXNlIE1HU0xfSU9DR1NUQVRTOgorCQlyZXR1cm4gZ2V0X3N0YXRzKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NXQUlURVZFTlQ6CisJCXJldHVybiB3YWl0X21nc2xfZXZlbnQoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ0xPT1BUWERPTkU6CisJCXJldHVybiAwOyAvLyBUT0RPOiBOb3Qgc3VwcG9ydGVkLCBuZWVkIHRvIGRvY3VtZW50CisJCS8qIFdhaXQgZm9yIG1vZGVtIGlucHV0IChEQ0QsUkksRFNSLENUUykgY2hhbmdlCisJCSAqIGFzIHNwZWNpZmllZCBieSBtYXNrIGluIGFyZyAoVElPQ01fUk5HL0RTUi9DRC9DVFMpCisJCSAqLworCWNhc2UgVElPQ01JV0FJVDoKKwkJcmV0dXJuIG1vZGVtX2lucHV0X3dhaXQoaW5mbywoaW50KWFyZyk7CisJCQorCQkvKgorCQkgKiBHZXQgY291bnRlciBvZiBpbnB1dCBzZXJpYWwgbGluZSBpbnRlcnJ1cHRzIChEQ0QsUkksRFNSLENUUykKKwkJICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKKwkJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yCisJCSAqICAgICBSSSB3aGVyZSBvbmx5IDAtPjEgaXMgY291bnRlZC4KKwkJICovCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJcF9jdXNlciA9IGFyZ3A7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cucm5nLCAmcF9jdXNlci0+cm5nKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cucngsICZwX2N1c2VyLT5yeCk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LnR4LCAmcF9jdXNlci0+dHgpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cub3ZlcnJ1biwgJnBfY3VzZXItPm92ZXJydW4pOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5icmssICZwX2N1c2VyLT5icmspOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogL3Byb2MgZnMgcm91dGluZXMuLi4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbGluZV9pbmZvKGNoYXIgKmJ1ZiwgU0xNUF9JTkZPICppbmZvKQoreworCWNoYXIJc3RhdF9idWZbMzBdOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJXM6IFNDQUJhc2U9JTA4eCBNZW09JTA4WCBTdGF0dXNDb250cm9sPSUwOHggTENSPSUwOFhcbiIKKwkJICAgICAgICJcdElSUT0lZCBNYXhGcmFtZVNpemU9JXVcbiIsCisJCWluZm8tPmRldmljZV9uYW1lLAorCQlpbmZvLT5waHlzX3NjYV9iYXNlLAorCQlpbmZvLT5waHlzX21lbW9yeV9iYXNlLAorCQlpbmZvLT5waHlzX3N0YXRjdHJsX2Jhc2UsCisJCWluZm8tPnBoeXNfbGNyX2Jhc2UsCisJCWluZm8tPmlycV9sZXZlbCwKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgKTsKKworCS8qIG91dHB1dCBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXN0YXRfYnVmWzBdID0gMDsKKwlzdGF0X2J1ZlsxXSA9IDA7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJUUyIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDVFMiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8RFRSIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDRCIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SSSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJJIik7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlx0SERMQyB0eG9rOiVkIHJ4b2s6JWQiLAorCQkJICAgICAgaW5mby0+aWNvdW50LnR4b2ssIGluZm8tPmljb3VudC5yeG9rKTsKKwkJaWYgKGluZm8tPmljb3VudC50eHVuZGVyKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eHVuZGVyOiVkIiwgaW5mby0+aWNvdW50LnR4dW5kZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnR4YWJvcnQpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4YWJvcnQ6JWQiLCBpbmZvLT5pY291bnQudHhhYm9ydCk7CisJCWlmIChpbmZvLT5pY291bnQucnhzaG9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhzaG9ydDolZCIsIGluZm8tPmljb3VudC5yeHNob3J0KTsKKwkJaWYgKGluZm8tPmljb3VudC5yeGxvbmcpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4bG9uZzolZCIsIGluZm8tPmljb3VudC5yeGxvbmcpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4b3ZlcikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhvdmVyOiVkIiwgaW5mby0+aWNvdW50LnJ4b3Zlcik7CisJCWlmIChpbmZvLT5pY291bnQucnhjcmMpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4bG9uZzolZCIsIGluZm8tPmljb3VudC5yeGNyYyk7CisJfSBlbHNlIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlx0QVNZTkMgdHg6JWQgcng6JWQiLAorCQkJICAgICAgaW5mby0+aWNvdW50LnR4LCBpbmZvLT5pY291bnQucngpOworCQlpZiAoaW5mby0+aWNvdW50LmZyYW1lKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBmZTolZCIsIGluZm8tPmljb3VudC5mcmFtZSk7CisJCWlmIChpbmZvLT5pY291bnQucGFyaXR5KQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBwZTolZCIsIGluZm8tPmljb3VudC5wYXJpdHkpOworCQlpZiAoaW5mby0+aWNvdW50LmJyaykKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgYnJrOiVkIiwgaW5mby0+aWNvdW50LmJyayk7CisJCWlmIChpbmZvLT5pY291bnQub3ZlcnJ1bikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgb2U6JWQiLCBpbmZvLT5pY291bnQub3ZlcnJ1bik7CisJfQorCisJLyogQXBwZW5kIHNlcmlhbCBzaWduYWwgc3RhdHVzIHRvIGVuZCAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlx0dHhhY3RpdmU9JWQgYmhfcmVxPSVkIGJoX3J1bj0lZCBwZW5kaW5nX2JoPSV4XG4iLAorCSBpbmZvLT50eF9hY3RpdmUsaW5mby0+YmhfcmVxdWVzdGVkLGluZm8tPmJoX3J1bm5pbmcsCisJIGluZm8tPnBlbmRpbmdfYmgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0IGRldmljZXMKKyAqLworaW50IHJlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAorCSAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwLCBsOworCW9mZl90CWJlZ2luID0gMDsKKwlTTE1QX0lORk8gKmluZm87CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAic3luY2xpbmttcCBkcml2ZXI6JXNcbiIsIGRyaXZlcl92ZXJzaW9uKTsKKworCWluZm8gPSBzeW5jbGlua21wX2RldmljZV9saXN0OworCXdoaWxlKCBpbmZvICkgeworCQlsID0gbGluZV9pbmZvKHBhZ2UgKyBsZW4sIGluZm8pOworCQlsZW4gKz0gbDsKKwkJaWYgKGxlbitiZWdpbiA+IG9mZitjb3VudCkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKGxlbitiZWdpbiA8IG9mZikgeworCQkJYmVnaW4gKz0gbGVuOworCQkJbGVuID0gMDsKKwkJfQorCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJfQorCisJKmVvZiA9IDE7Citkb25lOgorCWlmIChvZmYgPj0gbGVuK2JlZ2luKQorCQlyZXR1cm4gMDsKKwkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7CisJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7Cit9CisKKy8qIFJldHVybiB0aGUgY291bnQgb2YgYnl0ZXMgaW4gdHJhbnNtaXQgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImNoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBjaGFyc19pbl9idWZmZXIoKT0lZFxuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnR4X2NvdW50KTsKKworCXJldHVybiBpbmZvLT50eF9jb3VudDsKK30KKworLyogU2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gdGhyb3R0bGUgc2VuZCBkYXRhIChvdXIgcmVjZWl2ZSBkYXRhKQorICovCitzdGF0aWMgdm9pZCB0aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHRocm90dGxlKCkgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInRocm90dGxlIikpCisJCXJldHVybjsKKworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXNlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisKKyAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX1JUUzsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIFNpZ25hbCByZW1vdGUgZGV2aWNlIHRvIHN0b3AgdGhyb3R0bGluZyBzZW5kIGRhdGEgKG91ciByZWNlaXZlIGRhdGEpCisgKi8KK3N0YXRpYyB2b2lkIHVudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB1bnRocm90dGxlKCkgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInVudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCisJaWYgKElfSVhPRkYodHR5KSkgeworCQlpZiAoaW5mby0+eF9jaGFyKQorCQkJaW5mby0+eF9jaGFyID0gMDsKKwkJZWxzZQorCQkJc2VuZF94Y2hhcih0dHksIFNUQVJUX0NIQVIodHR5KSk7CisJfQorCisgCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIHNldCBvciBjbGVhciB0cmFuc21pdCBicmVhayBjb25kaXRpb24KKyAqIGJyZWFrX3N0YXRlCS0xPXNldCBicmVhayBjb25kaXRpb24sIDA9Y2xlYXIKKyAqLworc3RhdGljIHZvaWQgc2V0X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIFJlZ1ZhbHVlOworCVNMTVBfSU5GTyAqIGluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHNldF9icmVhayglZClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBicmVha19zdGF0ZSk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInNldF9icmVhayIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJUmVnVmFsdWUgPSByZWFkX3JlZyhpbmZvLCBDVEwpOworIAlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCVJlZ1ZhbHVlIHw9IEJJVDM7CisJZWxzZQorCQlSZWdWYWx1ZSAmPSB+QklUMzsKKwl3cml0ZV9yZWcoaW5mbywgQ1RMLCBSZWdWYWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfSERMQworCisvKioKKyAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgd2hlbiBwcm90b2NvbCBzZWxlY3RlZCAoUFBQLCBmcmFtZSByZWxheSwgZXRjLikKKyAqIHNldCBlbmNvZGluZyBhbmQgZnJhbWUgY2hlY2sgc2VxdWVuY2UgKEZDUykgb3B0aW9ucworICoKKyAqIGRldiAgICAgICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogZW5jb2RpbmcgIHNlcmlhbCBlbmNvZGluZyBzZXR0aW5nCisgKiBwYXJpdHkgICAgRkNTIHNldHRpbmcKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywKKwkJCSAgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJdW5zaWduZWQgY2hhciAgbmV3X2VuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IG5ld19jcmN0eXBlOworCisJLyogcmV0dXJuIGVycm9yIGlmIFRUWSBpbnRlcmZhY2Ugb3BlbiAqLworCWlmIChpbmZvLT5jb3VudCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoZW5jb2RpbmcpCisJeworCWNhc2UgRU5DT0RJTkdfTlJaOiAgICAgICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19OUlo7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfTlJaSTogICAgICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19OUlpJX1NQQUNFOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX0ZNX01BUks6ICAgIG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX0ZNX1NQQUNFOiAgIG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9TUEFDRTsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19NQU5DSEVTVEVSOiBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw7IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocGFyaXR5KQorCXsKKwljYXNlIFBBUklUWV9OT05FOiAgICAgICAgICAgIG5ld19jcmN0eXBlID0gSERMQ19DUkNfTk9ORTsgYnJlYWs7CisJY2FzZSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUOiBuZXdfY3JjdHlwZSA9IEhETENfQ1JDXzE2X0NDSVRUOyBicmVhazsKKwljYXNlIFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQ6IG5ld19jcmN0eXBlID0gSERMQ19DUkNfMzJfQ0NJVFQ7IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KKworCWluZm8tPnBhcmFtcy5lbmNvZGluZyA9IG5ld19lbmNvZGluZzsKKwlpbmZvLT5wYXJhbXMuY3JjX3R5cGUgPSBuZXdfY3JjdHlwZTs7CisKKwkvKiBpZiBuZXR3b3JrIGludGVyZmFjZSB1cCwgcmVwcm9ncmFtIGhhcmR3YXJlICovCisJaWYgKGluZm8tPm5ldGNvdW50KQorCQlwcm9ncmFtX2h3KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB0byBzZW5kIGZyYW1lCisgKgorICogc2tiICBzb2NrZXQgYnVmZmVyIGNvbnRhaW5pbmcgSERMQyBmcmFtZQorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6aGRsY194bWl0KCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJLyogc3RvcCBzZW5kaW5nIHVudGlsIHRoaXMgZnJhbWUgY29tcGxldGVzICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogY29weSBkYXRhIHRvIGRldmljZSBidWZmZXJzICovCisJaW5mby0+dHhfY291bnQgPSBza2ItPmxlbjsKKwl0eF9sb2FkX2RtYV9idWZmZXIoaW5mbywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiB1cGRhdGUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBkb25lIHdpdGggc29ja2V0IGJ1ZmZlciwgc28gZnJlZSBpdCAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIHNhdmUgc3RhcnQgdGltZSBmb3IgdHJhbnNtaXQgdGltZW91dCBkZXRlY3Rpb24gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIHN0YXJ0IGhhcmR3YXJlIHRyYW5zbWl0dGVyIGlmIG5lY2Vzc2FyeSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkgCXR4X3N0YXJ0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiBpbnRlcmZhY2UgZW5hYmxlZAorICogY2xhaW0gcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIGhhcmR3YXJlCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlczpoZGxjZGV2X29wZW4oJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiBnZW5lcmljIEhETEMgbGF5ZXIgb3BlbiBwcm9jZXNzaW5nICovCisJaWYgKChyYyA9IGhkbGNfb3BlbihkZXYpKSkKKwkJcmV0dXJuIHJjOworCisJLyogYXJiaXRyYXRlIGJldHdlZW4gbmV0d29yayBhbmQgdHR5IG9wZW5zICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+Y291bnQgIT0gMCB8fCBpbmZvLT5uZXRjb3VudCAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBoZGxjX29wZW4gcmV0dXJuaW5nIGJ1c3lcbiIsIGRldi0+bmFtZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaW5mby0+bmV0Y291bnQ9MTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisKKwkvKiBjbGFpbSByZXNvdXJjZXMgYW5kIGluaXQgYWRhcHRlciAqLworCWlmICgocmMgPSBzdGFydHVwKGluZm8pKSAhPSAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCWluZm8tPm5ldGNvdW50PTA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIGFzc2VydCBEVFIgYW5kIFJUUywgYXBwbHkgaGFyZHdhcmUgc2V0dGluZ3MgKi8KKwlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwlwcm9ncmFtX2h3KGluZm8pOworCisJLyogZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogaW5mb3JtIGdlbmVyaWMgSERMQyBsYXllciBvZiBjdXJyZW50IERDRCBzdGF0dXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gaW50ZXJmYWNlIGlzIGRpc2FibGVkCisgKiBzaHV0ZG93biBoYXJkd2FyZSBhbmQgcmVsZWFzZSByZXNvdXJjZXMKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfY2xvc2UoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBzaHV0ZG93biBhZGFwdGVyIGFuZCByZWxlYXNlIHJlc291cmNlcyAqLworCXNodXRkb3duKGluZm8pOworCisJaGRsY19jbG9zZShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwlpbmZvLT5uZXRjb3VudD0wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHRvIHByb2Nlc3MgSU9DVEwgY2FsbCB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIGlmciAgcG9pbnRlciB0byBuZXR3b3JrIGludGVyZmFjZSByZXF1ZXN0IHN0cnVjdHVyZQorICogY21kICBJT0NUTCBjb21tYW5kIGNvZGUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCVNMTVBfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9pb2N0bCglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIHJldHVybiBlcnJvciBpZiBUVFkgaW50ZXJmYWNlIG9wZW4gKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRTogLyogcmV0dXJuIGN1cnJlbnQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCisJCWZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisKKwkJc3dpdGNoIChmbGFncyl7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX1RYSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWEZST01SWDsgYnJlYWs7CisJCWRlZmF1bHQ6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19ERUZBVUxUOworCQl9CisKKwkJbmV3X2xpbmUuY2xvY2tfcmF0ZSA9IGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZDsKKwkJbmV3X2xpbmUubG9vcGJhY2sgICA9IGluZm8tPnBhcmFtcy5sb29wYmFjayA/IDE6MDsKKworCQlpZiAoY29weV90b191c2VyKGxpbmUsICZuZXdfbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOiAvKiBzZXQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2xpbmUsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChuZXdfbGluZS5jbG9ja190eXBlKQorCQl7CisJCWNhc2UgQ0xPQ0tfRVhUOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6IGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfSU5UOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhJTlQ6ICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfREVGQVVMVDogIGZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYKKwkJCQkJICAgICAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfUlhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19SWENfVFhDUElOIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8tPnBhcmFtcy5mbGFncyAmPSB+KEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCUhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisJCWluZm8tPnBhcmFtcy5mbGFncyB8PSBmbGFnczsKKworCQlpbmZvLT5wYXJhbXMubG9vcGJhY2sgPSBuZXdfbGluZS5sb29wYmFjazsKKworCQlpZiAoZmxhZ3MgJiAoSERMQ19GTEFHX1JYQ19CUkcgfCBIRExDX0ZMQUdfVFhDX0JSRykpCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSBuZXdfbGluZS5jbG9ja19yYXRlOworCQllbHNlCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSAwOworCisJCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwkJaWYgKGluZm8tPm5ldGNvdW50KQorCQkJcHJvZ3JhbV9odyhpbmZvKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiB0cmFuc21pdCB0aW1lb3V0IGlzIGRldGVjdGVkCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlTTE1QX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiaGRsY2Rldl90eF90aW1lb3V0KCVzKVxuIixkZXYtPm5hbWUpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXR4X3N0b3AoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiB0cmFuc21pdCBjb21wbGV0ZXMKKyAqIHJlZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgaWYgc3RvcHBlZAorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfZG9uZShTTE1QX0lORk8gKmluZm8pCit7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoaW5mby0+bmV0ZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShpbmZvLT5uZXRkZXYpOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gZnJhbWUgcmVjZWl2ZWQKKyAqIHBhc3MgZnJhbWUgdG8gbmV0d29yayBsYXllcgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKiBidWYgICBwb2ludGVyIHRvIGJ1ZmZlciBjb250aWFuaW5nIGZyYW1lIGRhdGEKKyAqIHNpemUgIGNvdW50IG9mIGRhdGEgYnl0ZXMgaW4gYnVmCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoU0xNUF9JTkZPICppbmZvLCBjaGFyICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5uZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiaGRsY2Rldl9yeCglcylcbiIsZGV2LT5uYW1lKTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBjYW4ndCBhbGxvYyBza2IsIGRyb3BwaW5nIHBhY2tldFxuIiwgZGV2LT5uYW1lKTsKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZSksYnVmLHNpemUpOworCisJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGluZm8tPm5ldGRldik7CisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBzaXplOworCisJbmV0aWZfcngoc2tiKTsKKworCWluZm8tPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiBhZGRpbmcgZGV2aWNlIGluc3RhbmNlCisgKiBkbyBnZW5lcmljIEhETEMgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfaW5pdChTTE1QX0lORk8gKmluZm8pCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaGRsY19kZXZpY2UgKmhkbGM7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBuZXR3b3JrIGFuZCBIRExDIGxheWVyIG9iamVjdHMgKi8KKworCWlmICghKGRldiA9IGFsbG9jX2hkbGNkZXYoaW5mbykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6aGRsYyBkZXZpY2UgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLF9fRklMRV9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZm9yIG5ldHdvcmsgbGF5ZXIgcmVwb3J0aW5nIHB1cnBvc2VzIG9ubHkgKi8KKwlkZXYtPm1lbV9zdGFydCA9IGluZm8tPnBoeXNfc2NhX2Jhc2U7CisJZGV2LT5tZW1fZW5kICAgPSBpbmZvLT5waHlzX3NjYV9iYXNlICsgU0NBX0JBU0VfU0laRSAtIDE7CisJZGV2LT5pcnEgICAgICAgPSBpbmZvLT5pcnFfbGV2ZWw7CisKKwkvKiBuZXR3b3JrIGxheWVyIGNhbGxiYWNrcyBhbmQgc2V0dGluZ3MgKi8KKwlkZXYtPmRvX2lvY3RsICAgICAgID0gaGRsY2Rldl9pb2N0bDsKKwlkZXYtPm9wZW4gICAgICAgICAgID0gaGRsY2Rldl9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgPSBoZGxjZGV2X2Nsb3NlOworCWRldi0+dHhfdGltZW91dCAgICAgPSBoZGxjZGV2X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDEwKkhaOworCWRldi0+dHhfcXVldWVfbGVuICAgPSA1MDsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBjYWxsYmFja3MgYW5kIHNldHRpbmdzICovCisJaGRsYyAgICAgICAgID0gZGV2X3RvX2hkbGMoZGV2KTsKKwloZGxjLT5hdHRhY2ggPSBoZGxjZGV2X2F0dGFjaDsKKwloZGxjLT54bWl0ICAgPSBoZGxjZGV2X3htaXQ7CisKKwkvKiByZWdpc3RlciBvYmplY3RzIHdpdGggSERMQyBsYXllciAqLworCWlmICgocmMgPSByZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczp1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIsX19GSUxFX18pOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJaW5mby0+bmV0ZGV2ID0gZGV2OworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gcmVtb3ZpbmcgZGV2aWNlIGluc3RhbmNlCisgKiBkbyBnZW5lcmljIEhETEMgY2xlYW51cAorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfZXhpdChTTE1QX0lORk8gKmluZm8pCit7CisJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShpbmZvLT5uZXRkZXYpOworCWZyZWVfbmV0ZGV2KGluZm8tPm5ldGRldik7CisJaW5mby0+bmV0ZGV2ID0gTlVMTDsKK30KKworI2VuZGlmIC8qIENPTkZJR19IRExDICovCisKKworLyogUmV0dXJuIG5leHQgYm90dG9tIGhhbGYgYWN0aW9uIHRvIHBlcmZvcm0uCisgKiBSZXR1cm4gVmFsdWU6CUJIIGFjdGlvbiBjb2RlIG9yIDAgaWYgbm90aGluZyB0byBkby4KKyAqLworaW50IGJoX2FjdGlvbihTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJaWYgKGluZm8tPnBlbmRpbmdfYmggJiBCSF9SRUNFSVZFKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1JFQ0VJVkU7CisJCXJjID0gQkhfUkVDRUlWRTsKKwl9IGVsc2UgaWYgKGluZm8tPnBlbmRpbmdfYmggJiBCSF9UUkFOU01JVCkgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9UUkFOU01JVDsKKwkJcmMgPSBCSF9UUkFOU01JVDsKKwl9IGVsc2UgaWYgKGluZm8tPnBlbmRpbmdfYmggJiBCSF9TVEFUVVMpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfU1RBVFVTOworCQlyYyA9IEJIX1NUQVRVUzsKKwl9CisKKwlpZiAoIXJjKSB7CisJCS8qIE1hcmsgQkggcm91dGluZSBhcyBjb21wbGV0ZSAqLworCQlpbmZvLT5iaF9ydW5uaW5nICAgPSAwOworCQlpbmZvLT5iaF9yZXF1ZXN0ZWQgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCisvKiBQZXJmb3JtIGJvdHRvbSBoYWxmIHByb2Nlc3Npbmcgb2Ygd29yayBpdGVtcyBxdWV1ZWQgYnkgSVNSLgorICovCit2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPKilDb250ZXh0OworCWludCBhY3Rpb247CisKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6JXMgYmhfaGFuZGxlcigpIGVudHJ5XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJaW5mby0+YmhfcnVubmluZyA9IDE7CisKKwl3aGlsZSgoYWN0aW9uID0gYmhfYWN0aW9uKGluZm8pKSAhPSAwKSB7CisKKwkJLyogUHJvY2VzcyB3b3JrIGl0ZW0gKi8KKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCQlwcmludGsoICIlcyglZCk6JXMgYmhfaGFuZGxlcigpIHdvcmsgaXRlbSBhY3Rpb249JWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGFjdGlvbik7CisKKwkJc3dpdGNoIChhY3Rpb24pIHsKKworCQljYXNlIEJIX1JFQ0VJVkU6CisJCQliaF9yZWNlaXZlKGluZm8pOworCQkJYnJlYWs7CisJCWNhc2UgQkhfVFJBTlNNSVQ6CisJCQliaF90cmFuc21pdChpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEJIX1NUQVRVUzoKKwkJCWJoX3N0YXR1cyhpbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW5rbm93biB3b3JrIGl0ZW0gSUQgKi8KKwkJCXByaW50aygiJXMoJWQpOiVzIFVua25vd24gd29yayBpdGVtIElEPSUwOFghXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6JXMgYmhfaGFuZGxlcigpIGV4aXRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Cit9CisKK3ZvaWQgYmhfcmVjZWl2ZShTTE1QX0lORk8gKmluZm8pCit7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTolcyBiaF9yZWNlaXZlKClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwl3aGlsZSggcnhfZ2V0X2ZyYW1lKGluZm8pICk7Cit9CisKK3ZvaWQgYmhfdHJhbnNtaXQoU0xNUF9JTkZPICppbmZvKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIGJoX3RyYW5zbWl0KCkgZW50cnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlpZiAodHR5KSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KK30KKwordm9pZCBiaF9zdGF0dXMoU0xNUF9JTkZPICppbmZvKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6JXMgYmhfc3RhdHVzKCkgZW50cnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlpbmZvLT5yaV9jaGtjb3VudCA9IDA7CisJaW5mby0+ZHNyX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kY2RfY2hrY291bnQgPSAwOworCWluZm8tPmN0c19jaGtjb3VudCA9IDA7Cit9CisKK3ZvaWQgaXNyX3RpbWVyKFNMTVBfSU5GTyAqIGluZm8pCit7CisJdW5zaWduZWQgY2hhciB0aW1lciA9IChpbmZvLT5wb3J0X251bSAmIDEpID8gVElNRVIyIDogVElNRVIwOworCisJLyogSUVSMjw3Li40PiA9IHRpbWVyPDMuLjA+IGludGVycnVwdCBlbmFibGVzICgwPWRpc2FibGVkKSAqLworCXdyaXRlX3JlZyhpbmZvLCBJRVIyLCAwKTsKKworCS8qIFRNQ1MsIFRpbWVyIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisJICoKKwkgKiAwNyAgICAgIENNRiwgQ29tcGFyZSBtYXRjaCBmbGFnIChyZWFkIG9ubHkpIDE9bWF0Y2gKKwkgKiAwNiAgICAgIEVDTUksIENNRiBJbnRlcnJ1cHQgRW5hYmxlOiAwPWRpc2FibGVkCisJICogMDUgICAgICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDQgICAgICBUTUUsIFRpbWVyIEVuYWJsZQorCSAqIDAzLi4wMCAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqCisJICogMDAwMCAwMDAwCisJICovCisJd3JpdGVfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSh0aW1lciArIFRNQ1MpLCAwKTsKKworCWluZm8tPmlycV9vY2N1cnJlZCA9IFRSVUU7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOiVzIGlzcl90aW1lcigpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworfQorCit2b2lkIGlzcl9yeGludChTTE1QX0lORk8gKiBpbmZvKQoreworIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworIAlzdHJ1Y3QJbWdzbF9pY291bnQgKmljb3VudCA9ICZpbmZvLT5pY291bnQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByZWFkX3JlZyhpbmZvLCBTUjEpICYgaW5mby0+aWUxX3ZhbHVlICYgKEZMR0QgKyBJRExEICsgQ0RDRCArIEJSS0QpOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzMiA9IHJlYWRfcmVnKGluZm8sIFNSMikgJiBpbmZvLT5pZTJfdmFsdWUgJiBPVlJOOworCisJLyogY2xlYXIgc3RhdHVzIGJpdHMgKi8KKwlpZiAoc3RhdHVzKQorCQl3cml0ZV9yZWcoaW5mbywgU1IxLCBzdGF0dXMpOworCisJaWYgKHN0YXR1czIpCisJCXdyaXRlX3JlZyhpbmZvLCBTUjIsIHN0YXR1czIpOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3J4aW50IHN0YXR1cz0lMDJYICUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMsc3RhdHVzMik7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCWlmIChzdGF0dXMgJiBCUktEKSB7CisJCQlpY291bnQtPmJyaysrOworCisJCQkvKiBwcm9jZXNzIGJyZWFrIGRldGVjdGlvbiBpZiB0dHkgY29udHJvbAorCQkJICogaXMgbm90IHNldCB0byBpZ25vcmUgaXQKKwkJCSAqLworCQkJaWYgKCB0dHkgKSB7CisJCQkJaWYgKCEoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrMSkpIHsKKwkJCQkJaWYgKGluZm8tPnJlYWRfc3RhdHVzX21hc2sxICYgQlJLRCkgeworCQkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7CisJCQkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCQkJZG9fU0FLKHR0eSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChzdGF0dXMgJiAoRkxHRHxJRExEKSkgeworCQkJaWYgKHN0YXR1cyAmIEZMR0QpCisJCQkJaW5mby0+aWNvdW50LmV4aXRodW50Kys7CisJCQllbHNlIGlmIChzdGF0dXMgJiBJRExEKQorCQkJCWluZm8tPmljb3VudC5yeGlkbGUrKzsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgJiBDRENEKSB7CisJCS8qIHNpbXVsYXRlIGEgY29tbW9uIG1vZGVtIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0CisJCSAqIGZvciBvdXIgaGFuZGxlcgorCQkgKi8KKwkJZ2V0X3NpZ25hbHMoIGluZm8gKTsKKwkJaXNyX2lvX3BpbihpbmZvLAorCQkJTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRHwoaW5mby0+c2VyaWFsX3NpZ25hbHMmU2VyaWFsU2lnbmFsX0RDRCkpOworCX0KK30KKworLyoKKyAqIGhhbmRsZSBhc3luYyByeCBkYXRhIGludGVycnVwdHMKKyAqLwordm9pZCBpc3JfcnhyZHkoU0xNUF9JTkZPICogaW5mbykKK3sKKwl1MTYgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgRGF0YUJ5dGU7CisgCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisgCXN0cnVjdAltZ3NsX2ljb3VudCAqaWNvdW50ID0gJmluZm8tPmljb3VudDsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3J4cmR5XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJd2hpbGUoKHN0YXR1cyA9IHJlYWRfcmVnKGluZm8sQ1NUMCkpICYgQklUMCkKKwl7CisJCURhdGFCeXRlID0gcmVhZF9yZWcoaW5mbyxUUkIpOworCisJCWlmICggdHR5ICkgeworCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJCWNvbnRpbnVlOworCisJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IERhdGFCeXRlOworCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQl9CisKKwkJaWNvdW50LT5yeCsrOworCisJCWlmICggc3RhdHVzICYgKFBFICsgRlJNRSArIE9WUk4pICkgeworCQkJcHJpbnRrKCIlcyglZCk6JXMgcnhlcnI9JTA0WFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMpOworCisJCQkvKiB1cGRhdGUgZXJyb3Igc3RhdGlzdGljcyAqLworCQkJaWYgKHN0YXR1cyAmIFBFKQorCQkJCWljb3VudC0+cGFyaXR5Kys7CisJCQllbHNlIGlmIChzdGF0dXMgJiBGUk1FKQorCQkJCWljb3VudC0+ZnJhbWUrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIE9WUk4pCisJCQkJaWNvdW50LT5vdmVycnVuKys7CisKKwkJCS8qIGRpc2NhcmQgY2hhciBpZiB0dHkgY29udHJvbCBmbGFncyBzYXkgc28gKi8KKwkJCWlmIChzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2syKQorCQkJCWNvbnRpbnVlOworCisJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazI7CisKKwkJCWlmICggdHR5ICkgeworCQkJCWlmIChzdGF0dXMgJiBQRSkKKwkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOworCQkJCWVsc2UgaWYgKHN0YXR1cyAmIEZSTUUpCisJCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0ZSQU1FOworCQkJCWlmIChzdGF0dXMgJiBPVlJOKSB7CisJCQkJCS8qIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncworCQkJCQkgKiByZXBvcnRlZCBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QKKwkJCQkJICogYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3RlcgorCQkJCQkgKi8KKwkJCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkJCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQkvKiBlbmQgb2YgaWYgKGVycm9yKSAqLworCisJCWlmICggdHR5ICkgeworCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCX0KKwl9CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApIHsKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3J4cmR5KCkgZmxpcCBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLAorCQkJdHR5ID8gdHR5LT5mbGlwLmNvdW50IDogMCk7CisJCXByaW50aygiJXMoJWQpOiVzIHJ4PSVkIGJyaz0lZCBwYXJpdHk9JWQgZnJhbWU9JWQgb3ZlcnJ1bj0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLAorCQkJaWNvdW50LT5yeCxpY291bnQtPmJyayxpY291bnQtPnBhcml0eSwKKwkJCWljb3VudC0+ZnJhbWUsaWNvdW50LT5vdmVycnVuKTsKKwl9CisKKwlpZiAoIHR0eSAmJiB0dHktPmZsaXAuY291bnQgKQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBpc3JfdHhlb20oU0xNUF9JTkZPICogaW5mbywgdW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfdHhlb20gc3RhdHVzPSUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMpOworCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRElSLCAweDAwKTsgLyogZGlzYWJsZSBUeCBETUEgSVJRcyAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERTUiwgMHhjMCk7IC8qIGNsZWFyIElSUXMgYW5kIGRpc2FibGUgRE1BICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgRE1BIGNoYW5uZWwgKi8KKworCWlmIChzdGF0dXMgJiBVRFJOKSB7CisJCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFRYUkVTRVQpOworCQl3cml0ZV9yZWcoaW5mbywgQ01ELCBUWEVOQUJMRSk7CisJfSBlbHNlCisJCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFRYQlVGQ0xSKTsKKworCS8qIGRpc2FibGUgYW5kIGNsZWFyIHR4IGludGVycnVwdHMgKi8KKwlpbmZvLT5pZTBfdmFsdWUgJj0gflRYUkRZRTsKKwlpbmZvLT5pZTFfdmFsdWUgJj0gfihJRExFICsgVURSTik7CisJd3JpdGVfcmVnMTYoaW5mbywgSUUwLCAodW5zaWduZWQgc2hvcnQpKChpbmZvLT5pZTFfdmFsdWUgPDwgOCkgKyBpbmZvLT5pZTBfdmFsdWUpKTsKKwl3cml0ZV9yZWcoaW5mbywgU1IxLCAodW5zaWduZWQgY2hhcikoVURSTiArIElETEUpKTsKKworCWlmICggaW5mby0+dHhfYWN0aXZlICkgeworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCQlpZiAoc3RhdHVzICYgVURSTikKKwkJCQlpbmZvLT5pY291bnQudHh1bmRlcisrOworCQkJZWxzZSBpZiAoc3RhdHVzICYgSURMRSkKKwkJCQlpbmZvLT5pY291bnQudHhvaysrOworCQl9CisKKwkJaW5mby0+dHhfYWN0aXZlID0gMDsKKwkJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCisJCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfQVNZTkMgJiYgaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSApIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCQkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisJCQlzZXRfc2lnbmFscyhpbmZvKTsKKwkJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwkJaWYgKGluZm8tPm5ldGNvdW50KQorCQkJaGRsY2Rldl90eF9kb25lKGluZm8pOworCQllbHNlCisjZW5kaWYKKwkJeworCQkJaWYgKGluZm8tPnR0eSAmJiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkpIHsKKwkJCQl0eF9zdG9wKGluZm8pOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIGhhbmRsZSB0eCBzdGF0dXMgaW50ZXJydXB0cworICovCit2b2lkIGlzcl90eGludChTTE1QX0lORk8gKiBpbmZvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gcmVhZF9yZWcoaW5mbywgU1IxKSAmIGluZm8tPmllMV92YWx1ZSAmIChVRFJOICsgSURMRSArIENDVFMpOworCisJLyogY2xlYXIgc3RhdHVzIGJpdHMgKi8KKwl3cml0ZV9yZWcoaW5mbywgU1IxLCBzdGF0dXMpOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfdHhpbnQgc3RhdHVzPSUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIChVRFJOICsgSURMRSkpCisJCWlzcl90eGVvbShpbmZvLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIENDVFMpIHsKKwkJLyogc2ltdWxhdGUgYSBjb21tb24gbW9kZW0gc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQKKwkJICogZm9yIG91ciBoYW5kbGVyCisJCSAqLworCQlnZXRfc2lnbmFscyggaW5mbyApOworCQlpc3JfaW9fcGluKGluZm8sCisJCQlNSVNDU1RBVFVTX0NUU19MQVRDSEVEfChpbmZvLT5zZXJpYWxfc2lnbmFscyZTZXJpYWxTaWduYWxfQ1RTKSk7CisKKwl9Cit9CisKKy8qCisgKiBoYW5kbGUgYXN5bmMgdHggZGF0YSBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgaXNyX3R4cmR5KFNMTVBfSU5GTyAqIGluZm8pCit7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfdHhyZHkoKSB0eF9jb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGluZm8tPnR4X2NvdW50KTsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfQVNZTkMpIHsKKwkJLyogZGlzYWJsZSBUWFJEWSBJUlEsIGVuYWJsZSBJRExFIElSUSAqLworCQlpbmZvLT5pZTBfdmFsdWUgJj0gflRYUkRZRTsKKwkJaW5mby0+aWUxX3ZhbHVlIHw9IElETEU7CisJCXdyaXRlX3JlZzE2KGluZm8sIElFMCwgKHVuc2lnbmVkIHNob3J0KSgoaW5mby0+aWUxX3ZhbHVlIDw8IDgpICsgaW5mby0+aWUwX3ZhbHVlKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5mby0+dHR5ICYmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKSkgeworCQl0eF9zdG9wKGluZm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKCBpbmZvLT50eF9jb3VudCApCisJCXR4X2xvYWRfZmlmbyggaW5mbyApOworCWVsc2UgeworCQlpbmZvLT50eF9hY3RpdmUgPSAwOworCQlpbmZvLT5pZTBfdmFsdWUgJj0gflRYUkRZRTsKKwkJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKKwl9CisKKwlpZiAoaW5mby0+dHhfY291bnQgPCBXQUtFVVBfQ0hBUlMpCisJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7Cit9CisKK3ZvaWQgaXNyX3J4ZG1hb2soU0xNUF9JTkZPICogaW5mbykKK3sKKwkvKiBCSVQ3ID0gRU9UIChlbmQgb2YgdHJhbnNmZXIpCisJICogQklUNiA9IEVPTSAoZW5kIG9mIG1lc3NhZ2UvZnJhbWUpCisJICovCisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByZWFkX3JlZyhpbmZvLFJYRE1BICsgRFNSKSAmIDB4YzA7CisKKwkvKiBjbGVhciBJUlEgKEJJVDAgbXVzdCBiZSAxIHRvIHByZXZlbnQgY2xlYXJpbmcgREUgYml0KSAqLworCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERTUiwgKHVuc2lnbmVkIGNoYXIpKHN0YXR1cyB8IDEpKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3J4ZG1hb2soKSwgc3RhdHVzPSUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMpOworCisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9SRUNFSVZFOworfQorCit2b2lkIGlzcl9yeGRtYWVycm9yKFNMTVBfSU5GTyAqIGluZm8pCit7CisJLyogQklUNSA9IEJPRiAoYnVmZmVyIG92ZXJmbG93KQorCSAqIEJJVDQgPSBDT0YgKGNvdW50ZXIgb3ZlcmZsb3cpCisJICovCisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByZWFkX3JlZyhpbmZvLFJYRE1BICsgRFNSKSAmIDB4MzA7CisKKwkvKiBjbGVhciBJUlEgKEJJVDAgbXVzdCBiZSAxIHRvIHByZXZlbnQgY2xlYXJpbmcgREUgYml0KSAqLworCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERTUiwgKHVuc2lnbmVkIGNoYXIpKHN0YXR1cyB8IDEpKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3J4ZG1hZXJyb3IoKSwgc3RhdHVzPSUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMpOworCisJaW5mby0+cnhfb3ZlcmZsb3cgPSBUUlVFOworCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKK30KKwordm9pZCBpc3JfdHhkbWFvayhTTE1QX0lORk8gKiBpbmZvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzX3JlZzEgPSByZWFkX3JlZyhpbmZvLCBTUjEpOworCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRElSLCAweDAwKTsJLyogZGlzYWJsZSBUeCBETUEgSVJRcyAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERTUiwgMHhjMCk7IC8qIGNsZWFyIElSUXMgYW5kIGRpc2FibGUgRE1BICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgRE1BIGNoYW5uZWwgKi8KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3R4ZG1hb2soKSwgc3RhdHVzPSUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXNfcmVnMSk7CisKKwkvKiBwcm9ncmFtIFRYUkRZIGFzIEZJRk8gZW1wdHkgZmxhZywgZW5hYmxlIFRYUkRZIElSUSAqLworCXdyaXRlX3JlZzE2KGluZm8sIFRSQzAsIDApOworCWluZm8tPmllMF92YWx1ZSB8PSBUWFJEWUU7CisJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKK30KKwordm9pZCBpc3JfdHhkbWFlcnJvcihTTE1QX0lORk8gKiBpbmZvKQoreworCS8qIEJJVDUgPSBCT0YgKGJ1ZmZlciBvdmVyZmxvdykKKwkgKiBCSVQ0ID0gQ09GIChjb3VudGVyIG92ZXJmbG93KQorCSAqLworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gcmVhZF9yZWcoaW5mbyxUWERNQSArIERTUikgJiAweDMwOworCisJLyogY2xlYXIgSVJRIChCSVQwIG11c3QgYmUgMSB0byBwcmV2ZW50IGNsZWFyaW5nIERFIGJpdCkgKi8KKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEU1IsICh1bnNpZ25lZCBjaGFyKShzdGF0dXMgfCAxKSk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOiVzIGlzcl90eGRtYWVycm9yKCksIHN0YXR1cz0lMDJ4XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzKTsKK30KKworLyogaGFuZGxlIGlucHV0IHNlcmlhbCBzaWduYWwgY2hhbmdlcworICovCit2b2lkIGlzcl9pb19waW4oIFNMTVBfSU5GTyAqaW5mbywgdTE2IHN0YXR1cyApCit7CisgCXN0cnVjdAltZ3NsX2ljb3VudCAqaWNvdW50OworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTppc3JfaW9fcGluIHN0YXR1cz0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiAoTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRCB8IE1JU0NTVEFUVVNfRENEX0xBVENIRUQgfAorCSAgICAgICAgICAgICAgTUlTQ1NUQVRVU19EU1JfTEFUQ0hFRCB8IE1JU0NTVEFUVVNfUklfTEFUQ0hFRCkgKSB7CisJCWljb3VudCA9ICZpbmZvLT5pY291bnQ7CisJCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX1JJX0xBVENIRUQpIHsKKwkJCWljb3VudC0+cm5nKys7CisJCQlpZiAoIHN0YXR1cyAmIFNlcmlhbFNpZ25hbF9SSSApCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5yaV91cCsrOworCQkJZWxzZQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfZG93bisrOworCQl9CisJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RTUl9MQVRDSEVEKSB7CisJCQlpY291bnQtPmRzcisrOworCQkJaWYgKCBzdGF0dXMgJiBTZXJpYWxTaWduYWxfRFNSICkKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRzcl91cCsrOworCQkJZWxzZQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX2Rvd24rKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRCkgeworCQkJaWYgKChpbmZvLT5kY2RfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKSB7CisJCQkJaW5mby0+aWUxX3ZhbHVlICY9IH5DRENEOworCQkJCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CisJCQl9CisJCQlpY291bnQtPmRjZCsrOworCQkJaWYgKHN0YXR1cyAmIFNlcmlhbFNpZ25hbF9EQ0QpIHsKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF91cCsrOworCQkJfSBlbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOworI2lmZGVmIENPTkZJR19IRExDCisJCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQkJaGRsY19zZXRfY2FycmllcihzdGF0dXMgJiBTZXJpYWxTaWduYWxfRENELCBpbmZvLT5uZXRkZXYpOworI2VuZGlmCisJCX0KKwkJaWYgKHN0YXR1cyAmIE1JU0NTVEFUVVNfQ1RTX0xBVENIRUQpCisJCXsKKwkJCWlmICgoaW5mby0+Y3RzX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkgeworCQkJCWluZm8tPmllMV92YWx1ZSAmPSB+Q0NUUzsKKwkJCQl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOworCQkJfQorCQkJaWNvdW50LT5jdHMrKzsKKwkJCWlmICggc3RhdHVzICYgU2VyaWFsU2lnbmFsX0NUUyApCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5jdHNfdXArKzsKKwkJCWVsc2UKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmN0c19kb3duKys7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCisJCWlmICggKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmCisJCSAgICAgKHN0YXR1cyAmIE1JU0NTVEFUVVNfRENEX0xBVENIRUQpICkgeworCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJCXByaW50aygiJXMgQ0Qgbm93ICVzLi4uIiwgaW5mby0+ZGV2aWNlX25hbWUsCisJCQkJICAgICAgIChzdGF0dXMgJiBTZXJpYWxTaWduYWxfRENEKSA/ICJvbiIgOiAib2ZmIik7CisJCQlpZiAoc3RhdHVzICYgU2VyaWFsU2lnbmFsX0RDRCkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCQllbHNlIHsKKwkJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJCXByaW50aygiZG9pbmcgc2VyaWFsIGhhbmd1cC4uLiIpOworCQkJCWlmIChpbmZvLT50dHkpCisJCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJCX0KKwkJfQorCisJCWlmICggKGluZm8tPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpICYmCisJCSAgICAgKHN0YXR1cyAmIE1JU0NTVEFUVVNfQ1RTX0xBVENIRUQpICkgeworCQkJaWYgKCBpbmZvLT50dHkgKSB7CisJCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCQlpZiAoc3RhdHVzICYgU2VyaWFsU2lnbmFsX0NUUykgeworCQkJCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJCQkJCXByaW50aygiQ1RTIHR4IHN0YXJ0Li4uIik7CisJCQkgCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQkJCXR4X3N0YXJ0KGluZm8pOworCQkJCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICghKHN0YXR1cyAmIFNlcmlhbFNpZ25hbF9DVFMpKSB7CisJCQkJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJCQkJcHJpbnRrKCJDVFMgdHggc3RvcC4uLiIpOworCQkJIAkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCQl0eF9zdG9wKGluZm8pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKKy8qIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZW50cnkgcG9pbnQuCisgKgorICogQXJndW1lbnRzOgorICogCWlycQkJaW50ZXJydXB0IG51bWJlciB0aGF0IGNhdXNlZCBpbnRlcnJ1cHQKKyAqIAlkZXZfaWQJCWRldmljZSBJRCBzdXBwbGllZCBkdXJpbmcgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbgorICogCXJlZ3MJCWludGVycnVwdGVkIHByb2Nlc3NvciBjb250ZXh0CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzeW5jbGlua21wX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCVNMTVBfSU5GTyAqIGluZm87CisJdW5zaWduZWQgY2hhciBzdGF0dXMsIHN0YXR1czAsIHN0YXR1czE9MDsKKwl1bnNpZ25lZCBjaGFyIGRtYXN0YXR1cywgZG1hc3RhdHVzMCwgZG1hc3RhdHVzMT0wOworCXVuc2lnbmVkIGNoYXIgdGltZXJzdGF0dXMwLCB0aW1lcnN0YXR1czE9MDsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0OworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIHNob3J0IHRtcDsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6IHN5bmNsaW5rbXBfaW50ZXJydXB0KCVkKWVudHJ5LlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGlycSk7CisKKwlpbmZvID0gKFNMTVBfSU5GTyAqKWRldl9pZDsKKwlpZiAoIWluZm8pCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisKKwlmb3IoOzspIHsKKworCQkvKiBnZXQgc3RhdHVzIGZvciBTQ0EwIChwb3J0cyAwLTEpICovCisJCXRtcCA9IHJlYWRfcmVnMTYoaW5mbywgSVNSMCk7CS8qIGdldCBJU1IwIGFuZCBJU1IxIGluIG9uZSByZWFkICovCisJCXN0YXR1czAgPSAodW5zaWduZWQgY2hhcil0bXA7CisJCWRtYXN0YXR1czAgPSAodW5zaWduZWQgY2hhcikodG1wPj44KTsKKwkJdGltZXJzdGF0dXMwID0gcmVhZF9yZWcoaW5mbywgSVNSMik7CisKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJcHJpbnRrKCIlcyglZCk6JXMgc3RhdHVzMD0lMDJ4LCBkbWFzdGF0dXMwPSUwMngsIHRpbWVyc3RhdHVzMD0lMDJ4XG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLAorCQkJCXN0YXR1czAsZG1hc3RhdHVzMCx0aW1lcnN0YXR1czApOworCisJCWlmIChpbmZvLT5wb3J0X2NvdW50ID09IDQpIHsKKwkJCS8qIGdldCBzdGF0dXMgZm9yIFNDQTEgKHBvcnRzIDItMykgKi8KKwkJCXRtcCA9IHJlYWRfcmVnMTYoaW5mby0+cG9ydF9hcnJheVsyXSwgSVNSMCk7CisJCQlzdGF0dXMxID0gKHVuc2lnbmVkIGNoYXIpdG1wOworCQkJZG1hc3RhdHVzMSA9ICh1bnNpZ25lZCBjaGFyKSh0bXA+PjgpOworCQkJdGltZXJzdGF0dXMxID0gcmVhZF9yZWcoaW5mby0+cG9ydF9hcnJheVsyXSwgSVNSMik7CisKKwkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJCQlwcmludGsoIiVzKCVkKTolcyBzdGF0dXMxPSUwMngsIGRtYXN0YXR1czE9JTAyeCwgdGltZXJzdGF0dXMxPSUwMnhcbiIsCisJCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLAorCQkJCQlzdGF0dXMxLGRtYXN0YXR1czEsdGltZXJzdGF0dXMxKTsKKwkJfQorCisJCWlmICghc3RhdHVzMCAmJiAhZG1hc3RhdHVzMCAmJiAhdGltZXJzdGF0dXMwICYmCisJCQkgIXN0YXR1czEgJiYgIWRtYXN0YXR1czEgJiYgIXRpbWVyc3RhdHVzMSkKKwkJCWJyZWFrOworCisJCWZvcihpPTA7IGkgPCBpbmZvLT5wb3J0X2NvdW50IDsgaSsrKSB7CisJCQlpZiAoaW5mby0+cG9ydF9hcnJheVtpXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGkgPCAyKSB7CisJCQkJc3RhdHVzID0gc3RhdHVzMDsKKwkJCQlkbWFzdGF0dXMgPSBkbWFzdGF0dXMwOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSBzdGF0dXMxOworCQkJCWRtYXN0YXR1cyA9IGRtYXN0YXR1czE7CisJCQl9CisKKwkJCXNoaWZ0ID0gaSAmIDEgPyA0IDowOworCisJCQlpZiAoc3RhdHVzICYgQklUMCA8PCBzaGlmdCkKKwkJCQlpc3JfcnhyZHkoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCQlpZiAoc3RhdHVzICYgQklUMSA8PCBzaGlmdCkKKwkJCQlpc3JfdHhyZHkoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCQlpZiAoc3RhdHVzICYgQklUMiA8PCBzaGlmdCkKKwkJCQlpc3JfcnhpbnQoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCQlpZiAoc3RhdHVzICYgQklUMyA8PCBzaGlmdCkKKwkJCQlpc3JfdHhpbnQoaW5mby0+cG9ydF9hcnJheVtpXSk7CisKKwkJCWlmIChkbWFzdGF0dXMgJiBCSVQwIDw8IHNoaWZ0KQorCQkJCWlzcl9yeGRtYWVycm9yKGluZm8tPnBvcnRfYXJyYXlbaV0pOworCQkJaWYgKGRtYXN0YXR1cyAmIEJJVDEgPDwgc2hpZnQpCisJCQkJaXNyX3J4ZG1hb2soaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCQlpZiAoZG1hc3RhdHVzICYgQklUMiA8PCBzaGlmdCkKKwkJCQlpc3JfdHhkbWFlcnJvcihpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwkJCWlmIChkbWFzdGF0dXMgJiBCSVQzIDw8IHNoaWZ0KQorCQkJCWlzcl90eGRtYW9rKGluZm8tPnBvcnRfYXJyYXlbaV0pOworCQl9CisKKwkJaWYgKHRpbWVyc3RhdHVzMCAmIChCSVQ1IHwgQklUNCkpCisJCQlpc3JfdGltZXIoaW5mby0+cG9ydF9hcnJheVswXSk7CisJCWlmICh0aW1lcnN0YXR1czAgJiAoQklUNyB8IEJJVDYpKQorCQkJaXNyX3RpbWVyKGluZm8tPnBvcnRfYXJyYXlbMV0pOworCQlpZiAodGltZXJzdGF0dXMxICYgKEJJVDUgfCBCSVQ0KSkKKwkJCWlzcl90aW1lcihpbmZvLT5wb3J0X2FycmF5WzJdKTsKKwkJaWYgKHRpbWVyc3RhdHVzMSAmIChCSVQ3IHwgQklUNikpCisJCQlpc3JfdGltZXIoaW5mby0+cG9ydF9hcnJheVszXSk7CisJfQorCisJZm9yKGk9MDsgaSA8IGluZm8tPnBvcnRfY291bnQgOyBpKyspIHsKKwkJU0xNUF9JTkZPICogcG9ydCA9IGluZm8tPnBvcnRfYXJyYXlbaV07CisKKwkJLyogUmVxdWVzdCBib3R0b20gaGFsZiBwcm9jZXNzaW5nIGlmIHRoZXJlJ3Mgc29tZXRoaW5nCisJCSAqIGZvciBpdCB0byBkbyBhbmQgdGhlIGJoIGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuCisJCSAqCisJCSAqIE5vdGU6IHN0YXJ0dXAgYWRhcHRlciBkaWFncyByZXF1aXJlIGludGVycnVwdHMuCisJCSAqIGRvIG5vdCByZXF1ZXN0IGJvdHRvbSBoYWxmIHByb2Nlc3NpbmcgaWYgdGhlCisJCSAqIGRldmljZSBpcyBub3Qgb3BlbiBpbiBhIG5vcm1hbCBtb2RlLgorCQkgKi8KKwkJaWYgKCBwb3J0ICYmIChwb3J0LT5jb3VudCB8fCBwb3J0LT5uZXRjb3VudCkgJiYKKwkJICAgICBwb3J0LT5wZW5kaW5nX2JoICYmICFwb3J0LT5iaF9ydW5uaW5nICYmCisJCSAgICAgIXBvcnQtPmJoX3JlcXVlc3RlZCApIHsKKwkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJCQlwcmludGsoIiVzKCVkKTolcyBxdWV1ZWluZyBiaCB0YXNrLlxuIiwKKwkJCQkJX19GSUxFX18sX19MSU5FX18scG9ydC0+ZGV2aWNlX25hbWUpOworCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+dGFzayk7CisJCQlwb3J0LT5iaF9yZXF1ZXN0ZWQgPSAxOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTpzeW5jbGlua21wX2ludGVycnVwdCglZClleGl0LlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGlycSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBJbml0aWFsaXplIGFuZCBzdGFydCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc3RhcnR1cChTTE1QX0lORk8gKiBpbmZvKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMoJWQpOiVzIHR4X3JlbGVhc2V1cCgpXG4iLF9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorCQlyZXR1cm4gMDsKKworCWlmICghaW5mby0+dHhfYnVmKSB7CisJCWluZm8tPnR4X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopa21hbGxvYyhpbmZvLT5tYXhfZnJhbWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mby0+dHhfYnVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIiJXMoJWQpOiVzIGNhbid0IGFsbG9jYXRlIHRyYW5zbWl0IGJ1ZmZlclxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWluZm8tPnBlbmRpbmdfYmggPSAwOworCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCisJcmVzZXRfcG9ydChpbmZvKTsKKworCWNoYW5nZV9wYXJhbXMoaW5mbyk7CisKKwlpbmZvLT5zdGF0dXNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwlhZGRfdGltZXIoJmluZm8tPnN0YXR1c190aW1lcik7CisKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgYnkgY2xvc2UoKSBhbmQgaGFuZ3VwKCkgdG8gc2h1dGRvd24gaGFyZHdhcmUKKyAqLworc3RhdGljIHZvaWQgc2h1dGRvd24oU0xNUF9JTkZPICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBzeW5jbGlua21wX3NodXRkb3duKClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwkvKiBjbGVhciBzdGF0dXMgd2FpdCBxdWV1ZSBiZWNhdXNlIHN0YXR1cyBjaGFuZ2VzICovCisJLyogY2FuJ3QgaGFwcGVuIGFmdGVyIHNodXR0aW5nIGRvd24gdGhlIGhhcmR3YXJlICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwlkZWxfdGltZXIoJmluZm8tPnN0YXR1c190aW1lcik7CisKKwlpZiAoaW5mby0+dHhfYnVmKSB7CisJCWtmcmVlKGluZm8tPnR4X2J1Zik7CisJCWluZm8tPnR4X2J1ZiA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmVzZXRfcG9ydChpbmZvKTsKKworIAlpZiAoIWluZm8tPnR0eSB8fCBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgeworIAkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUyk7CisJCXNldF9zaWduYWxzKGluZm8pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJaWYgKGluZm8tPnR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9odyhTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJ4X3N0b3AoaW5mbyk7CisJdHhfc3RvcChpbmZvKTsKKworCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fCBpbmZvLT5uZXRjb3VudCkKKwkJaGRsY19tb2RlKGluZm8pOworCWVsc2UKKwkJYXN5bmNfbW9kZShpbmZvKTsKKworCXNldF9zaWduYWxzKGluZm8pOworCisJaW5mby0+ZGNkX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5jdHNfY2hrY291bnQgPSAwOworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCisJaW5mby0+aWUxX3ZhbHVlIHw9IChDRENEfENDVFMpOworCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CisKKwlnZXRfc2lnbmFscyhpbmZvKTsKKworCWlmIChpbmZvLT5uZXRjb3VudCB8fCAoaW5mby0+dHR5ICYmIGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSApCisJCXJ4X3N0YXJ0KGluZm8pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIFJlY29uZmlndXJlIGFkYXB0ZXIgYmFzZWQgb24gbmV3IHBhcmFtZXRlcnMKKyAqLworc3RhdGljIHZvaWQgY2hhbmdlX3BhcmFtcyhTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2ZsYWc7CisJaW50IGJpdHNfcGVyX2NoYXI7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgY2hhbmdlX3BhcmFtcygpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBpZiBCMCByYXRlIChoYW5ndXApIHNwZWNpZmllZCB0aGVuIG5lZ2F0ZSBEVFIgYW5kIFJUUyAqLworCS8qIG90aGVyd2lzZSBhc3NlcnQgRFRSIGFuZCBSVFMgKi8KKyAJaWYgKGNmbGFnICYgQ0JBVUQpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCWVsc2UKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUik7CisKKwkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLworCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJICAgICAgY2FzZSBDUzU6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA1OyBicmVhazsKKwkgICAgICBjYXNlIENTNjogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDY7IGJyZWFrOworCSAgICAgIGNhc2UgQ1M3OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNzsgYnJlYWs7CisJICAgICAgY2FzZSBDUzg6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA4OyBicmVhazsKKwkgICAgICAvKiBOZXZlciBoYXBwZW5zLCBidXQgR0NDIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBpdCBvdXQgKi8KKwkgICAgICBkZWZhdWx0OiAgaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDc7IGJyZWFrOworCSAgICAgIH0KKworCWlmIChjZmxhZyAmIENTVE9QQikKKwkJaW5mby0+cGFyYW1zLnN0b3BfYml0cyA9IDI7CisJZWxzZQorCQlpbmZvLT5wYXJhbXMuc3RvcF9iaXRzID0gMTsKKworCWluZm8tPnBhcmFtcy5wYXJpdHkgPSBBU1lOQ19QQVJJVFlfTk9ORTsKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKGNmbGFnICYgUEFST0REKQorCQkJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9PREQ7CisJCWVsc2UKKwkJCWluZm8tPnBhcmFtcy5wYXJpdHkgPSBBU1lOQ19QQVJJVFlfRVZFTjsKKyNpZmRlZiBDTVNQQVIKKwkJaWYgKGNmbGFnICYgQ01TUEFSKQorCQkJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9TUEFDRTsKKyNlbmRpZgorCX0KKworCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgamlmZmllcyB0byB0cmFuc21pdCBhIGZ1bGwKKwkgKiBGSUZPICgzMiBieXRlcykgYXQgc3BlY2lmaWVkIGRhdGEgcmF0ZQorCSAqLworCWJpdHNfcGVyX2NoYXIgPSBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzICsKKwkJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgKyAxOworCisJLyogaWYgcG9ydCBkYXRhIHJhdGUgaXMgc2V0IHRvIDQ2MDgwMCBvciBsZXNzIHRoZW4KKwkgKiBhbGxvdyB0dHkgc2V0dGluZ3MgdG8gb3ZlcnJpZGUsIG90aGVyd2lzZSBrZWVwIHRoZQorCSAqIGN1cnJlbnQgZGF0YSByYXRlLgorCSAqLworCWlmIChpbmZvLT5wYXJhbXMuZGF0YV9yYXRlIDw9IDQ2MDgwMCkgeworCQlpbmZvLT5wYXJhbXMuZGF0YV9yYXRlID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwl9CisKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKSB7CisJCWluZm8tPnRpbWVvdXQgPSAoMzIqSFoqYml0c19wZXJfY2hhcikgLworCQkJCWluZm8tPnBhcmFtcy5kYXRhX3JhdGU7CisJfQorCWluZm8tPnRpbWVvdXQgKz0gSFovNTA7CQkvKiBBZGQgLjAyIHNlY29uZHMgb2Ygc2xvcCAqLworCisJaWYgKGNmbGFnICYgQ1JUU0NUUykKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ1RTX0ZMT1c7CisJZWxzZQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCisJLyogcHJvY2VzcyB0dHkgaW5wdXQgY29udHJvbCBmbGFncyAqLworCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzazIgPSBPVlJOOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2syIHw9IFBFIHwgRlJNRTsKKyAJaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKKyAJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sxIHw9IEJSS0Q7CisJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzazIgfD0gUEUgfCBGUk1FOworCWlmIChJX0lHTkJSSyhpbmZvLT50dHkpKSB7CisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzazEgfD0gQlJLRDsKKwkJLyogSWYgaWdub3JpbmcgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUKKwkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrMiB8PSBPVlJOOworCX0KKworCXByb2dyYW1faHcoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRzKFNMTVBfSU5GTyAqIGluZm8sIHN0cnVjdCBtZ3NsX2ljb3VudCBfX3VzZXIgKnVzZXJfaWNvdW50KQoreworCWludCBlcnI7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgZ2V0X3BhcmFtcygpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfaWNvdW50LCAmaW5mby0+aWNvdW50LCBzaXplb2Yoc3RydWN0IG1nc2xfaWNvdW50KSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOiVzIGdldF9zdGF0cygpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BhcmFtcyhTTE1QX0lORk8gKiBpbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKnVzZXJfcGFyYW1zKQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIGdldF9wYXJhbXMoKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUpOworCisJQ09QWV9UT19VU0VSKGVycix1c2VyX3BhcmFtcywgJmluZm8tPnBhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOiVzIGdldF9wYXJhbXMoKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9wYXJhbXMoU0xNUF9JTkZPICogaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICpuZXdfcGFyYW1zKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCU1HU0xfUEFSQU1TIHRtcF9wYXJhbXM7CisJaW50IGVycjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBzZXRfcGFyYW1zXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKKwlDT1BZX0ZST01fVVNFUihlcnIsJnRtcF9wYXJhbXMsIG5ld19wYXJhbXMsIHNpemVvZihNR1NMX1BBUkFNUykpOworCWlmIChlcnIpIHsKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJCXByaW50ayggIiVzKCVkKTolcyBzZXRfcGFyYW1zKCkgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJbWVtY3B5KCZpbmZvLT5wYXJhbXMsJnRtcF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKyAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF90eGlkbGUoU0xNUF9JTkZPICogaW5mbywgaW50IF9fdXNlciAqaWRsZV9tb2RlKQoreworCWludCBlcnI7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgZ2V0X3R4aWRsZSgpPSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aWRsZV9tb2RlKTsKKworCUNPUFlfVE9fVVNFUihlcnIsaWRsZV9tb2RlLCAmaW5mby0+aWRsZV9tb2RlLCBzaXplb2YoaW50KSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOiVzIGdldF90eGlkbGUoKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF90eGlkbGUoU0xNUF9JTkZPICogaW5mbywgaW50IGlkbGVfbW9kZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBzZXRfdHhpZGxlKCVkKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpZGxlX21vZGUgKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpbmZvLT5pZGxlX21vZGUgPSBpZGxlX21vZGU7CisJdHhfc2V0X2lkbGUoIGluZm8gKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eF9lbmFibGUoU0xNUF9JTkZPICogaW5mbywgaW50IGVuYWJsZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0eF9lbmFibGUoJWQpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGVuYWJsZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCBlbmFibGUgKSB7CisJCWlmICggIWluZm8tPnR4X2VuYWJsZWQgKSB7CisJCQl0eF9zdGFydChpbmZvKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggaW5mby0+dHhfZW5hYmxlZCApCisJCQl0eF9zdG9wKGluZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogYWJvcnQgc2VuZCBIRExDIGZyYW1lCisgKi8KK3N0YXRpYyBpbnQgdHhfYWJvcnQoU0xNUF9JTkZPICogaW5mbykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0eF9hYm9ydCgpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICggaW5mby0+dHhfYWN0aXZlICYmIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDICkgeworCQlpbmZvLT5pZTFfdmFsdWUgJj0gflVEUk47CisJCWluZm8tPmllMV92YWx1ZSB8PSBJRExFOworCQl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOwkvKiBkaXNhYmxlIHR4IHN0YXR1cyBpbnRlcnJ1cHRzICovCisJCXdyaXRlX3JlZyhpbmZvLCBTUjEsICh1bnNpZ25lZCBjaGFyKShJRExFICsgVURSTikpOwkvKiBjbGVhciBwZW5kaW5nICovCisKKwkJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRFNSLCAwKTsJCS8qIGRpc2FibGUgRE1BIGNoYW5uZWwgKi8KKwkJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgRE1BIGNoYW5uZWwgKi8KKworICAgCQl3cml0ZV9yZWcoaW5mbywgQ01ELCBUWEFCT1JUKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZW5hYmxlKFNMTVBfSU5GTyAqIGluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgcnhfZW5hYmxlKCVkKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGVuYWJsZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCBlbmFibGUgKSB7CisJCWlmICggIWluZm8tPnJ4X2VuYWJsZWQgKQorCQkJcnhfc3RhcnQoaW5mbyk7CisJfSBlbHNlIHsKKwkJaWYgKCBpbmZvLT5yeF9lbmFibGVkICkKKwkJCXJ4X3N0b3AoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcF9zdGF0dXMoaW50IHNpZ25hbHMpCit7CisJLyogTWFwIHN0YXR1cyBiaXRzIHRvIEFQSSBldmVudCBiaXRzICovCisKKwlyZXR1cm4gKChzaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlIDogTWdzbEV2ZW50X0RzckluYWN0aXZlKSArCisJICAgICAgICgoc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpID8gTWdzbEV2ZW50X0N0c0FjdGl2ZSA6IE1nc2xFdmVudF9DdHNJbmFjdGl2ZSkgKworCSAgICAgICAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IE1nc2xFdmVudF9EY2RBY3RpdmUgOiBNZ3NsRXZlbnRfRGNkSW5hY3RpdmUpICsKKwkgICAgICAgKChzaWduYWxzICYgU2VyaWFsU2lnbmFsX1JJKSAgPyBNZ3NsRXZlbnRfUmlBY3RpdmUgOiBNZ3NsRXZlbnRfUmlJbmFjdGl2ZSk7Cit9CisKKy8qIHdhaXQgZm9yIHNwZWNpZmllZCBldmVudCB0byBvY2N1cgorICovCitzdGF0aWMgaW50IHdhaXRfbWdzbF9ldmVudChTTE1QX0lORk8gKiBpbmZvLCBpbnQgX191c2VyICptYXNrX3B0cikKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgczsKKwlpbnQgcmM9MDsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJaW50IGV2ZW50czsKKwlpbnQgbWFzazsKKwlzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgb2xkc2lncywgbmV3c2lnczsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCUNPUFlfRlJPTV9VU0VSKHJjLCZtYXNrLCBtYXNrX3B0ciwgc2l6ZW9mKGludCkpOworCWlmIChyYykgeworCQlyZXR1cm4gIC1FRkFVTFQ7CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHdhaXRfbWdzbF9ldmVudCglZClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxtYXNrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCS8qIHJldHVybiBpbW1lZGlhdGVseSBpZiBzdGF0ZSBtYXRjaGVzIHJlcXVlc3RlZCBldmVudHMgKi8KKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlzID0gbWFwX3N0YXR1cyhpbmZvLT5zZXJpYWxfc2lnbmFscyk7CisKKwlldmVudHMgPSBtYXNrICYKKwkJKCAoKHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IE1nc2xFdmVudF9Ec3JBY3RpdmU6TWdzbEV2ZW50X0RzckluYWN0aXZlKSArCisgCQkgICgocyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gTWdzbEV2ZW50X0RjZEFjdGl2ZTpNZ3NsRXZlbnRfRGNkSW5hY3RpdmUpICsKKwkJICAoKHMgJiBTZXJpYWxTaWduYWxfQ1RTKSA/IE1nc2xFdmVudF9DdHNBY3RpdmU6TWdzbEV2ZW50X0N0c0luYWN0aXZlKSArCisJCSAgKChzICYgU2VyaWFsU2lnbmFsX1JJKSAgPyBNZ3NsRXZlbnRfUmlBY3RpdmUgOk1nc2xFdmVudF9SaUluYWN0aXZlKSApOworCWlmIChldmVudHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBzYXZlIGN1cnJlbnQgaXJxIGNvdW50cyAqLworCWNwcmV2ID0gaW5mby0+aWNvdW50OworCW9sZHNpZ3MgPSBpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzOworCisJLyogZW5hYmxlIGh1bnQgYW5kIGlkbGUgaXJxcyBpZiBuZWVkZWQgKi8KKwlpZiAobWFzayAmIChNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlK01nc2xFdmVudF9JZGxlUmVjZWl2ZWQpKSB7CisJCXVuc2lnbmVkIGNoYXIgb2xkdmFsID0gaW5mby0+aWUxX3ZhbHVlOworCQl1bnNpZ25lZCBjaGFyIG5ld3ZhbCA9IG9sZHZhbCArCisJCQkgKG1hc2sgJiBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlID8gRkxHRDowKSArCisJCQkgKG1hc2sgJiBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkID8gSURMRDowKTsKKwkJaWYgKCBvbGR2YWwgIT0gbmV3dmFsICkgeworCQkJaW5mby0+aWUxX3ZhbHVlID0gbmV3dmFsOworCQkJd3JpdGVfcmVnKGluZm8sIElFMSwgaW5mby0+aWUxX3ZhbHVlKTsKKwkJfQorCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPmV2ZW50X3dhaXRfcSwgJndhaXQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlmb3IoOzspIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZ2V0IGN1cnJlbnQgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCW5ld3NpZ3MgPSBpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCQkvKiBpZiBubyBjaGFuZ2UsIHdhaXQgYWJvcnRlZCBmb3Igc29tZSByZWFzb24gKi8KKwkJaWYgKG5ld3NpZ3MuZHNyX3VwICAgPT0gb2xkc2lncy5kc3JfdXAgICAmJgorCQkgICAgbmV3c2lncy5kc3JfZG93biA9PSBvbGRzaWdzLmRzcl9kb3duICYmCisJCSAgICBuZXdzaWdzLmRjZF91cCAgID09IG9sZHNpZ3MuZGNkX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuZGNkX2Rvd24gPT0gb2xkc2lncy5kY2RfZG93biAmJgorCQkgICAgbmV3c2lncy5jdHNfdXAgICA9PSBvbGRzaWdzLmN0c191cCAgICYmCisJCSAgICBuZXdzaWdzLmN0c19kb3duID09IG9sZHNpZ3MuY3RzX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MucmlfdXAgICAgPT0gb2xkc2lncy5yaV91cCAgICAmJgorCQkgICAgbmV3c2lncy5yaV9kb3duICA9PSBvbGRzaWdzLnJpX2Rvd24gICYmCisJCSAgICBjbm93LmV4aXRodW50ICAgID09IGNwcmV2LmV4aXRodW50ICAgJiYKKwkJICAgIGNub3cucnhpZGxlICAgICAgPT0gY3ByZXYucnhpZGxlKSB7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCisJCWV2ZW50cyA9IG1hc2sgJgorCQkJKCAobmV3c2lncy5kc3JfdXAgICAhPSBvbGRzaWdzLmRzcl91cCAgID8gTWdzbEV2ZW50X0RzckFjdGl2ZTowKSAgICsKKwkJCSAgKG5ld3NpZ3MuZHNyX2Rvd24gIT0gb2xkc2lncy5kc3JfZG93biA/IE1nc2xFdmVudF9Ec3JJbmFjdGl2ZTowKSArCisJCQkgIChuZXdzaWdzLmRjZF91cCAgICE9IG9sZHNpZ3MuZGNkX3VwICAgPyBNZ3NsRXZlbnRfRGNkQWN0aXZlOjApICAgKworCQkJICAobmV3c2lncy5kY2RfZG93biAhPSBvbGRzaWdzLmRjZF9kb3duID8gTWdzbEV2ZW50X0RjZEluYWN0aXZlOjApICsKKwkJCSAgKG5ld3NpZ3MuY3RzX3VwICAgIT0gb2xkc2lncy5jdHNfdXAgICA/IE1nc2xFdmVudF9DdHNBY3RpdmU6MCkgICArCisJCQkgIChuZXdzaWdzLmN0c19kb3duICE9IG9sZHNpZ3MuY3RzX2Rvd24gPyBNZ3NsRXZlbnRfQ3RzSW5hY3RpdmU6MCkgKworCQkJICAobmV3c2lncy5yaV91cCAgICAhPSBvbGRzaWdzLnJpX3VwICAgID8gTWdzbEV2ZW50X1JpQWN0aXZlOjApICAgICsKKwkJCSAgKG5ld3NpZ3MucmlfZG93biAgIT0gb2xkc2lncy5yaV9kb3duICA/IE1nc2xFdmVudF9SaUluYWN0aXZlOjApICArCisJCQkgIChjbm93LmV4aXRodW50ICAgICE9IGNwcmV2LmV4aXRodW50ICAgPyBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlOjApICsKKwkJCSAgKGNub3cucnhpZGxlICAgICAgIT0gY3ByZXYucnhpZGxlICAgICA/IE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQ6MCkgKTsKKwkJaWYgKGV2ZW50cykKKwkJCWJyZWFrOworCisJCWNwcmV2ID0gY25vdzsKKwkJb2xkc2lncyA9IG5ld3NpZ3M7CisJfQorCisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPmV2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKworCWlmIChtYXNrICYgKE1nc2xFdmVudF9FeGl0SHVudE1vZGUgKyBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmaW5mby0+ZXZlbnRfd2FpdF9xKSkgeworCQkJLyogZGlzYWJsZSBlbmFibGUgZXhpdCBodW50IG1vZGUvaWRsZSByY3ZkIElSUXMgKi8KKwkJCWluZm8tPmllMV92YWx1ZSAmPSB+KEZMR0R8SURMRCk7CisJCQl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK2V4aXQ6CisJaWYgKCByYyA9PSAwICkKKwkJUFVUX1VTRVIocmMsIGV2ZW50cywgbWFza19wdHIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1vZGVtX2lucHV0X3dhaXQoU0xNUF9JTkZPICppbmZvLGludCBhcmcpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCXN0cnVjdCBtZ3NsX2ljb3VudCBjcHJldiwgY25vdzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCS8qIHNhdmUgY3VycmVudCBpcnEgY291bnRzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWNwcmV2ID0gaW5mby0+aWNvdW50OworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWZvcig7OykgeworCQlzY2hlZHVsZSgpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBnZXQgbmV3IGlycSBjb3VudHMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCQkvKiBpZiBubyBjaGFuZ2UsIHdhaXQgYWJvcnRlZCBmb3Igc29tZSByZWFzb24gKi8KKwkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYKKwkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgZm9yIGNoYW5nZSBpbiBjYWxsZXIgc3BlY2lmaWVkIG1vZGVtIGlucHV0ICovCisJCWlmICgoYXJnICYgVElPQ01fUk5HICYmIGNub3cucm5nICE9IGNwcmV2LnJuZykgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9EU1IgJiYgY25vdy5kc3IgIT0gY3ByZXYuZHNyKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0NEICAmJiBjbm93LmRjZCAhPSBjcHJldi5kY2QpIHx8CisJCSAgICAoYXJnICYgVElPQ01fQ1RTICYmIGNub3cuY3RzICE9IGNwcmV2LmN0cykpIHsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJY3ByZXYgPSBjbm93OworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJjOworfQorCisvKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBzZXJpYWwgY29udHJvbCBhbmQgc3RhdHVzIHNpZ25hbHMKKyAqLworc3RhdGljIGludCB0aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJlc3VsdCA9ICgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKSA/IFRJT0NNX1JUUzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKSA/IFRJT0NNX0RUUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IFRJT0NNX0NBUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IFRJT0NNX1JORzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IFRJT0NNX0RTUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSA/IFRJT0NNX0NUUzowKTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbWdldCgpIHZhbHVlPSUwOFhcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXN1bHQgKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBzZXQgbW9kZW0gY29udHJvbCBzaWduYWxzIChEVFIvUlRTKQorICovCitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHRpb2Ntc2V0KCV4LCV4KVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBzZXQsIGNsZWFyKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9EVFI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCXNldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKiBCbG9jayB0aGUgY3VycmVudCBwcm9jZXNzIHVudGlsIHRoZSBzcGVjaWZpZWQgcG9ydCBpcyByZWFkeSB0byBvcGVuLgorICovCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIFNMTVBfSU5GTyAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIGJsb2NrX3RpbF9yZWFkeSgpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSApOworCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLIHx8IHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKXsKKwkJLyogbm9uYmxvY2sgbW9kZSBpcyBzZXQgb3IgcG9ydCBpcyBub3QgZW5hYmxlZCAqLworCQkvKiBqdXN0IHZlcmlmeSB0aGF0IGNhbGxvdXQgZGV2aWNlIGlzIG5vdCBhY3RpdmUgKi8KKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qIFdhaXQgZm9yIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiBjbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgYmxvY2tfdGlsX3JlYWR5KCkgYmVmb3JlIGJsb2NrLCBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCWluZm8tPmNvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5ibG9ja2VkX29wZW4rKzsKKworCXdoaWxlICgxKSB7CisJCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwkJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKXsKKwkJCXJldHZhbCA9IChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KKwkJCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisgCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisgCQkgICAgKGRvX2Nsb2NhbCB8fCAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSkgKSB7CisgCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCQlwcmludGsoIiVzKCVkKTolcyBibG9ja190aWxfcmVhZHkoKSBjb3VudD0lZFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCApOworCisJCXNjaGVkdWxlKCk7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlpZiAoZXh0cmFfY291bnQpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgYmxvY2tfdGlsX3JlYWR5KCkgYWZ0ZXIsIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQgKTsKKworCWlmICghcmV0dmFsKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGFsbG9jX2RtYV9idWZzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBCdWZmZXJzUGVyRnJhbWU7CisJdW5zaWduZWQgc2hvcnQgQnVmZmVyQ291bnQ7CisKKwkvLyBGb3JjZSBhbGxvY2F0aW9uIHRvIHN0YXJ0IGF0IDY0SyBib3VuZGFyeSBmb3IgZWFjaCBwb3J0LgorCS8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgKmFsbCogYnVmZmVyIGRlc2NyaXB0b3JzIGZvciBhIHBvcnQKKwkvLyAqbXVzdCogYmUgaW4gdGhlIHNhbWUgNjRLIGJsb2NrLiBBbGwgZGVzY3JpcHRvcnMgb24gYSBwb3J0CisJLy8gc2hhcmUgYSBjb21tb24gJ2Jhc2UnIGFkZHJlc3MgKHVwcGVyIDggYml0cyBvZiAyNCBiaXRzKSBwcm9ncmFtbWVkCisJLy8gaW50byB0aGUgQ0JQIHJlZ2lzdGVyLgorCWluZm8tPnBvcnRfYXJyYXlbMF0tPmxhc3RfbWVtX2FsbG9jID0gKFNDQV9NRU1fU0laRS80KSAqIGluZm8tPnBvcnRfbnVtOworCisJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgRE1BIGJ1ZmZlcnMgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlICovCisJLyogbGFyZ2VzdCBhbGxvd2FibGUgZnJhbWUgc2l6ZS4gTm90ZTogSWYgdGhlIG1heCBmcmFtZSBzaXplIGlzICovCisJLyogbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgdGhlIERNQSBidWZmZXIgc2l6ZSB0aGVuIHdlIG5lZWQgdG8gKi8KKwkvKiByb3VuZCB0aGUgYnVmZmVyIGNvdW50IHBlciBmcmFtZSB1cCBvbmUuICovCisKKwlCdWZmZXJzUGVyRnJhbWUgPSAodW5zaWduZWQgc2hvcnQpKGluZm8tPm1heF9mcmFtZV9zaXplL1NDQUJVRlNJWkUpOworCWlmICggaW5mby0+bWF4X2ZyYW1lX3NpemUgJSBTQ0FCVUZTSVpFICkKKwkJQnVmZmVyc1BlckZyYW1lKys7CisKKwkvKiBjYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgYnVmZmVycyAoU0NBQlVGU0laRSkgcG9zc2libGUKKwkgKiBpbiBvbmUgcG9ydHMgbWVtb3J5IChTQ0FfTUVNX1NJWkUvNCkgYWZ0ZXIgYWxsb2NhdGluZyBtZW1vcnkKKwkgKiBmb3IgdGhlIGRlc2NyaXB0b3IgbGlzdCAoQlVGRkVSTElTVFNJWkUpLgorCSAqLworCUJ1ZmZlckNvdW50ID0gKFNDQV9NRU1fU0laRS80IC0gQlVGRkVSTElTVFNJWkUpL1NDQUJVRlNJWkU7CisKKwkvKiBsaW1pdCBudW1iZXIgb2YgYnVmZmVycyB0byBtYXhpbXVtIGFtb3VudCBvZiBkZXNjcmlwdG9ycyAqLworCWlmIChCdWZmZXJDb3VudCA+IEJVRkZFUkxJU1RTSVpFL3NpemVvZihTQ0FERVNDKSkKKwkJQnVmZmVyQ291bnQgPSBCVUZGRVJMSVNUU0laRS9zaXplb2YoU0NBREVTQyk7CisKKwkvKiB1c2UgZW5vdWdoIGJ1ZmZlcnMgdG8gdHJhbnNtaXQgb25lIG1heCBzaXplIGZyYW1lICovCisJaW5mby0+dHhfYnVmX2NvdW50ID0gQnVmZmVyc1BlckZyYW1lICsgMTsKKworCS8qIG5ldmVyIHVzZSBtb3JlIHRoYW4gaGFsZiB0aGUgYXZhaWxhYmxlIGJ1ZmZlcnMgZm9yIHRyYW5zbWl0ICovCisJaWYgKGluZm8tPnR4X2J1Zl9jb3VudCA+IChCdWZmZXJDb3VudC8yKSkKKwkJaW5mby0+dHhfYnVmX2NvdW50ID0gQnVmZmVyQ291bnQvMjsKKworCWlmIChpbmZvLT50eF9idWZfY291bnQgPiBTQ0FNQVhERVNDKQorCQlpbmZvLT50eF9idWZfY291bnQgPSBTQ0FNQVhERVNDOworCisJLyogdXNlIHJlbWFpbmluZyBidWZmZXJzIGZvciByZWNlaXZlICovCisJaW5mby0+cnhfYnVmX2NvdW50ID0gQnVmZmVyQ291bnQgLSBpbmZvLT50eF9idWZfY291bnQ7CisKKwlpZiAoaW5mby0+cnhfYnVmX2NvdW50ID4gU0NBTUFYREVTQykKKwkJaW5mby0+cnhfYnVmX2NvdW50ID0gU0NBTUFYREVTQzsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMoJWQpOiVzIEFsbG9jYXRpbmcgJWQgVFggYW5kICVkIFJYIERNQSBidWZmZXJzLlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwKKwkJCWluZm8tPnR4X2J1Zl9jb3VudCxpbmZvLT5yeF9idWZfY291bnQpOworCisJaWYgKCBhbGxvY19idWZfbGlzdCggaW5mbyApIDwgMCB8fAorCQlhbGxvY19mcmFtZV9idWZzKGluZm8sCisJCSAgCQkJaW5mby0+cnhfYnVmX2xpc3QsCisJCSAgCQkJaW5mby0+cnhfYnVmX2xpc3RfZXgsCisJCQkJCWluZm8tPnJ4X2J1Zl9jb3VudCkgPCAwIHx8CisJCWFsbG9jX2ZyYW1lX2J1ZnMoaW5mbywKKwkJCQkJaW5mby0+dHhfYnVmX2xpc3QsCisJCQkJCWluZm8tPnR4X2J1Zl9saXN0X2V4LAorCQkJCQlpbmZvLT50eF9idWZfY291bnQpIDwgMCB8fAorCQlhbGxvY190bXBfcnhfYnVmKGluZm8pIDwgMCApIHsKKwkJcHJpbnRrKCIlcyglZCk6JXMgQ2FuJ3QgYWxsb2NhdGUgRE1BIGJ1ZmZlciBtZW1vcnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyeF9yZXNldF9idWZmZXJzKCBpbmZvICk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGUgRE1BIGJ1ZmZlcnMgZm9yIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9yIGxpc3RzLgorICovCitpbnQgYWxsb2NfYnVmX2xpc3QoU0xNUF9JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogYnVpbGQgbGlzdCBpbiBhZGFwdGVyIHNoYXJlZCBtZW1vcnkgKi8KKwlpbmZvLT5idWZmZXJfbGlzdCA9IGluZm8tPm1lbW9yeV9iYXNlICsgaW5mby0+cG9ydF9hcnJheVswXS0+bGFzdF9tZW1fYWxsb2M7CisJaW5mby0+YnVmZmVyX2xpc3RfcGh5cyA9IGluZm8tPnBvcnRfYXJyYXlbMF0tPmxhc3RfbWVtX2FsbG9jOworCWluZm8tPnBvcnRfYXJyYXlbMF0tPmxhc3RfbWVtX2FsbG9jICs9IEJVRkZFUkxJU1RTSVpFOworCisJbWVtc2V0KGluZm8tPmJ1ZmZlcl9saXN0LCAwLCBCVUZGRVJMSVNUU0laRSk7CisKKwkvKiBTYXZlIHZpcnR1YWwgYWRkcmVzcyBwb2ludGVycyB0byB0aGUgcmVjZWl2ZSBhbmQgKi8KKwkvKiB0cmFuc21pdCBidWZmZXIgbGlzdHMuIChSZWNlaXZlIDFzdCkuIFRoZXNlIHBvaW50ZXJzIHdpbGwgKi8KKwkvKiBiZSB1c2VkIGJ5IHRoZSBwcm9jZXNzb3IgdG8gYWNjZXNzIHRoZSBsaXN0cy4gKi8KKwlpbmZvLT5yeF9idWZfbGlzdCA9IChTQ0FERVNDICopaW5mby0+YnVmZmVyX2xpc3Q7CisKKwlpbmZvLT50eF9idWZfbGlzdCA9IChTQ0FERVNDICopaW5mby0+YnVmZmVyX2xpc3Q7CisJaW5mby0+dHhfYnVmX2xpc3QgKz0gaW5mby0+cnhfYnVmX2NvdW50OworCisJLyogQnVpbGQgbGlua3MgZm9yIGNpcmN1bGFyIGJ1ZmZlciBlbnRyeSBsaXN0cyAodHggYW5kIHJ4KQorCSAqCisJICogTm90ZTogbGlua3MgYXJlIHBoeXNpY2FsIGFkZHJlc3NlcyByZWFkIGJ5IHRoZSBTQ0EgZGV2aWNlCisJICogdG8gZGV0ZXJtaW5lIHRoZSBuZXh0IGJ1ZmZlciBlbnRyeSB0byB1c2UuCisJICovCisKKwlmb3IgKCBpID0gMDsgaSA8IGluZm8tPnJ4X2J1Zl9jb3VudDsgaSsrICkgeworCQkvKiBjYWxjdWxhdGUgYW5kIHN0b3JlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBidWZmZXIgZW50cnkgKi8KKwkJaW5mby0+cnhfYnVmX2xpc3RfZXhbaV0ucGh5c19lbnRyeSA9CisJCQlpbmZvLT5idWZmZXJfbGlzdF9waHlzICsgKGkgKiBzaXplb2YoU0NBQlVGU0laRSkpOworCisJCS8qIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcGh5c2ljYWwgYWRkcmVzcyBvZiAqLworCQkvKiBuZXh0IGVudHJ5IGluIGNpcnVsYXIgbGlzdCBvZiBlbnRyaWVzICovCisJCWluZm8tPnJ4X2J1Zl9saXN0W2ldLm5leHQgPSBpbmZvLT5idWZmZXJfbGlzdF9waHlzOworCQlpZiAoIGkgPCBpbmZvLT5yeF9idWZfY291bnQgLSAxICkKKwkJCWluZm8tPnJ4X2J1Zl9saXN0W2ldLm5leHQgKz0gKGkgKyAxKSAqIHNpemVvZihTQ0FERVNDKTsKKworCQlpbmZvLT5yeF9idWZfbGlzdFtpXS5sZW5ndGggPSBTQ0FCVUZTSVpFOworCX0KKworCWZvciAoIGkgPSAwOyBpIDwgaW5mby0+dHhfYnVmX2NvdW50OyBpKysgKSB7CisJCS8qIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIGJ1ZmZlciBlbnRyeSAqLworCQlpbmZvLT50eF9idWZfbGlzdF9leFtpXS5waHlzX2VudHJ5ID0gaW5mby0+YnVmZmVyX2xpc3RfcGh5cyArCisJCQkoKGluZm8tPnJ4X2J1Zl9jb3VudCArIGkpICogc2l6ZW9mKFNDQURFU0MpKTsKKworCQkvKiBjYWxjdWxhdGUgYW5kIHN0b3JlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgKi8KKwkJLyogbmV4dCBlbnRyeSBpbiBjaXJ1bGFyIGxpc3Qgb2YgZW50cmllcyAqLworCisJCWluZm8tPnR4X2J1Zl9saXN0W2ldLm5leHQgPSBpbmZvLT5idWZmZXJfbGlzdF9waHlzICsKKwkJCWluZm8tPnJ4X2J1Zl9jb3VudCAqIHNpemVvZihTQ0FERVNDKTsKKworCQlpZiAoIGkgPCBpbmZvLT50eF9idWZfY291bnQgLSAxICkKKwkJCWluZm8tPnR4X2J1Zl9saXN0W2ldLm5leHQgKz0gKGkgKyAxKSAqIHNpemVvZihTQ0FERVNDKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGUgdGhlIGZyYW1lIERNQSBidWZmZXJzIHVzZWQgYnkgdGhlIHNwZWNpZmllZCBidWZmZXIgbGlzdC4KKyAqLworaW50IGFsbG9jX2ZyYW1lX2J1ZnMoU0xNUF9JTkZPICppbmZvLCBTQ0FERVNDICpidWZfbGlzdCxTQ0FERVNDX0VYICpidWZfbGlzdF9leCxpbnQgY291bnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisKKwlmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKSB7CisJCWJ1Zl9saXN0X2V4W2ldLnZpcnRfYWRkciA9IGluZm8tPm1lbW9yeV9iYXNlICsgaW5mby0+cG9ydF9hcnJheVswXS0+bGFzdF9tZW1fYWxsb2M7CisJCXBoeXNfYWRkciA9IGluZm8tPnBvcnRfYXJyYXlbMF0tPmxhc3RfbWVtX2FsbG9jOworCQlpbmZvLT5wb3J0X2FycmF5WzBdLT5sYXN0X21lbV9hbGxvYyArPSBTQ0FCVUZTSVpFOworCisJCWJ1Zl9saXN0W2ldLmJ1Zl9wdHIgID0gKHVuc2lnbmVkIHNob3J0KXBoeXNfYWRkcjsKKwkJYnVmX2xpc3RbaV0uYnVmX2Jhc2UgPSAodW5zaWduZWQgY2hhcikocGh5c19hZGRyID4+IDE2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmcmVlX2RtYV9idWZzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbmZvLT5idWZmZXJfbGlzdCA9IE5VTEw7CisJaW5mby0+cnhfYnVmX2xpc3QgPSBOVUxMOworCWluZm8tPnR4X2J1Zl9saXN0ID0gTlVMTDsKK30KKworLyogYWxsb2NhdGUgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG1heF9mcmFtZV9zaXplLgorICogVGhpcyBidWZmZXIgaXMgdXNlZCB0byBwYXNzIGFuIGFzc2VtYmxlZCBmcmFtZSB0byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICovCitpbnQgYWxsb2NfdG1wX3J4X2J1ZihTTE1QX0lORk8gKmluZm8pCit7CisJaW5mby0+dG1wX3J4X2J1ZiA9IGttYWxsb2MoaW5mby0+bWF4X2ZyYW1lX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChpbmZvLT50bXBfcnhfYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkIGZyZWVfdG1wX3J4X2J1ZihTTE1QX0lORk8gKmluZm8pCit7CisJaWYgKGluZm8tPnRtcF9yeF9idWYpCisJCWtmcmVlKGluZm8tPnRtcF9yeF9idWYpOworCWluZm8tPnRtcF9yeF9idWYgPSBOVUxMOworfQorCitpbnQgY2xhaW1fcmVzb3VyY2VzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsU0NBX01FTV9TSVpFLCJzeW5jbGlua21wIikgPT0gTlVMTCkgeworCQlwcmludGsoICIlcyglZCk6JXMgbWVtIGFkZHIgY29uZmxpY3QsIEFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX21lbW9yeV9iYXNlKTsKKwkJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfQWRkcmVzc0NvbmZsaWN0OworCQlnb3RvIGVycm91dDsKKwl9CisJZWxzZQorCQlpbmZvLT5zaGFyZWRfbWVtX3JlcXVlc3RlZCA9IDE7CisKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbGNyX2Jhc2UgKyBpbmZvLT5sY3Jfb2Zmc2V0LDEyOCwic3luY2xpbmttcCIpID09IE5VTEwpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIGxjciBtZW0gYWRkciBjb25mbGljdCwgQWRkcj0lMDhYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbGNyX2Jhc2UpOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzQ29uZmxpY3Q7CisJCWdvdG8gZXJyb3V0OworCX0KKwllbHNlCisJCWluZm8tPmxjcl9tZW1fcmVxdWVzdGVkID0gMTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+cGh5c19zY2FfYmFzZSArIGluZm8tPnNjYV9vZmZzZXQsU0NBX0JBU0VfU0laRSwic3luY2xpbmttcCIpID09IE5VTEwpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIHNjYSBtZW0gYWRkciBjb25mbGljdCwgQWRkcj0lMDhYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfc2NhX2Jhc2UpOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzQ29uZmxpY3Q7CisJCWdvdG8gZXJyb3V0OworCX0KKwllbHNlCisJCWluZm8tPnNjYV9iYXNlX3JlcXVlc3RlZCA9IDE7CisKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPnBoeXNfc3RhdGN0cmxfYmFzZSArIGluZm8tPnN0YXRjdHJsX29mZnNldCxTQ0FfUkVHX1NJWkUsInN5bmNsaW5rbXAiKSA9PSBOVUxMKSB7CisJCXByaW50ayggIiVzKCVkKTolcyBzdGF0L2N0cmwgbWVtIGFkZHIgY29uZmxpY3QsIEFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX3N0YXRjdHJsX2Jhc2UpOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzQ29uZmxpY3Q7CisJCWdvdG8gZXJyb3V0OworCX0KKwllbHNlCisJCWluZm8tPnNjYV9zdGF0Y3RybF9yZXF1ZXN0ZWQgPSAxOworCisJaW5mby0+bWVtb3J5X2Jhc2UgPSBpb3JlbWFwKGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsU0NBX01FTV9TSVpFKTsKKwlpZiAoIWluZm8tPm1lbW9yeV9iYXNlKSB7CisJCXByaW50ayggIiVzKCVkKTolcyBDYW50IG1hcCBzaGFyZWQgbWVtb3J5LCBNZW1BZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19tZW1vcnlfYmFzZSApOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19DYW50QXNzaWduUGNpUmVzb3VyY2VzOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlpbmZvLT5sY3JfYmFzZSA9IGlvcmVtYXAoaW5mby0+cGh5c19sY3JfYmFzZSxQQUdFX1NJWkUpOworCWlmICghaW5mby0+bGNyX2Jhc2UpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIENhbnQgbWFwIExDUiBtZW1vcnksIE1lbUFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX2xjcl9iYXNlICk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lSZXNvdXJjZXM7CisJCWdvdG8gZXJyb3V0OworCX0KKwlpbmZvLT5sY3JfYmFzZSArPSBpbmZvLT5sY3Jfb2Zmc2V0OworCisJaW5mby0+c2NhX2Jhc2UgPSBpb3JlbWFwKGluZm8tPnBoeXNfc2NhX2Jhc2UsUEFHRV9TSVpFKTsKKwlpZiAoIWluZm8tPnNjYV9iYXNlKSB7CisJCXByaW50ayggIiVzKCVkKTolcyBDYW50IG1hcCBTQ0EgbWVtb3J5LCBNZW1BZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19zY2FfYmFzZSApOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19DYW50QXNzaWduUGNpUmVzb3VyY2VzOworCQlnb3RvIGVycm91dDsKKwl9CisJaW5mby0+c2NhX2Jhc2UgKz0gaW5mby0+c2NhX29mZnNldDsKKworCWluZm8tPnN0YXRjdHJsX2Jhc2UgPSBpb3JlbWFwKGluZm8tPnBoeXNfc3RhdGN0cmxfYmFzZSxQQUdFX1NJWkUpOworCWlmICghaW5mby0+c3RhdGN0cmxfYmFzZSkgeworCQlwcmludGsoICIlcyglZCk6JXMgQ2FudCBtYXAgU0NBIFN0YXR1cy9Db250cm9sIG1lbW9yeSwgTWVtQWRkcj0lMDhYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfc3RhdGN0cmxfYmFzZSApOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19DYW50QXNzaWduUGNpUmVzb3VyY2VzOworCQlnb3RvIGVycm91dDsKKwl9CisJaW5mby0+c3RhdGN0cmxfYmFzZSArPSBpbmZvLT5zdGF0Y3RybF9vZmZzZXQ7CisKKwlpZiAoICFtZW1vcnlfdGVzdChpbmZvKSApIHsKKwkJcHJpbnRrKCAiJXMoJWQpOlNoYXJlZCBNZW1vcnkgVGVzdCBmYWlsZWQgZm9yIGRldmljZSAlcyBNZW1BZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19tZW1vcnlfYmFzZSApOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19NZW1vcnlFcnJvcjsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlyZWxlYXNlX3Jlc291cmNlcyggaW5mbyApOworCXJldHVybiAtRU5PREVWOworfQorCit2b2lkIHJlbGVhc2VfcmVzb3VyY2VzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6JXMgcmVsZWFzZV9yZXNvdXJjZXMoKSBlbnRyeVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAoIGluZm8tPmlycV9yZXF1ZXN0ZWQgKSB7CisJCWZyZWVfaXJxKGluZm8tPmlycV9sZXZlbCwgaW5mbyk7CisJCWluZm8tPmlycV9yZXF1ZXN0ZWQgPSAwOworCX0KKworCWlmICggaW5mby0+c2hhcmVkX21lbV9yZXF1ZXN0ZWQgKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5waHlzX21lbW9yeV9iYXNlLFNDQV9NRU1fU0laRSk7CisJCWluZm8tPnNoYXJlZF9tZW1fcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKCBpbmZvLT5sY3JfbWVtX3JlcXVlc3RlZCApIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbGNyX2Jhc2UgKyBpbmZvLT5sY3Jfb2Zmc2V0LDEyOCk7CisJCWluZm8tPmxjcl9tZW1fcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKCBpbmZvLT5zY2FfYmFzZV9yZXF1ZXN0ZWQgKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5waHlzX3NjYV9iYXNlICsgaW5mby0+c2NhX29mZnNldCxTQ0FfQkFTRV9TSVpFKTsKKwkJaW5mby0+c2NhX2Jhc2VfcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKCBpbmZvLT5zY2Ffc3RhdGN0cmxfcmVxdWVzdGVkICkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlICsgaW5mby0+c3RhdGN0cmxfb2Zmc2V0LFNDQV9SRUdfU0laRSk7CisJCWluZm8tPnNjYV9zdGF0Y3RybF9yZXF1ZXN0ZWQgPSAwOworCX0KKworCWlmIChpbmZvLT5tZW1vcnlfYmFzZSl7CisJCWlvdW5tYXAoaW5mby0+bWVtb3J5X2Jhc2UpOworCQlpbmZvLT5tZW1vcnlfYmFzZSA9IE5VTEw7CisJfQorCisJaWYgKGluZm8tPnNjYV9iYXNlKSB7CisJCWlvdW5tYXAoaW5mby0+c2NhX2Jhc2UgLSBpbmZvLT5zY2Ffb2Zmc2V0KTsKKwkJaW5mby0+c2NhX2Jhc2U9TlVMTDsKKwl9CisKKwlpZiAoaW5mby0+c3RhdGN0cmxfYmFzZSkgeworCQlpb3VubWFwKGluZm8tPnN0YXRjdHJsX2Jhc2UgLSBpbmZvLT5zdGF0Y3RybF9vZmZzZXQpOworCQlpbmZvLT5zdGF0Y3RybF9iYXNlPU5VTEw7CisJfQorCisJaWYgKGluZm8tPmxjcl9iYXNlKXsKKwkJaW91bm1hcChpbmZvLT5sY3JfYmFzZSAtIGluZm8tPmxjcl9vZmZzZXQpOworCQlpbmZvLT5sY3JfYmFzZSA9IE5VTEw7CisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIHJlbGVhc2VfcmVzb3VyY2VzKCkgZXhpdFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7Cit9CisKKy8qIEFkZCB0aGUgc3BlY2lmaWVkIGRldmljZSBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZSB0byB0aGUKKyAqIGdsb2JhbCBsaW5rZWQgbGlzdCBvZiBkZXZpY2VzIGFuZCBpbmNyZW1lbnQgdGhlIGRldmljZSBjb3VudC4KKyAqLwordm9pZCBhZGRfZGV2aWNlKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbmZvLT5uZXh0X2RldmljZSA9IE5VTEw7CisJaW5mby0+bGluZSA9IHN5bmNsaW5rbXBfZGV2aWNlX2NvdW50OworCXNwcmludGYoaW5mby0+ZGV2aWNlX25hbWUsInR0eVNMTSVkcCVkIixpbmZvLT5hZGFwdGVyX251bSxpbmZvLT5wb3J0X251bSk7CisKKwlpZiAoaW5mby0+bGluZSA8IE1BWF9ERVZJQ0VTKSB7CisJCWlmIChtYXhmcmFtZVtpbmZvLT5saW5lXSkKKwkJCWluZm8tPm1heF9mcmFtZV9zaXplID0gbWF4ZnJhbWVbaW5mby0+bGluZV07CisJCWluZm8tPmRvc3luY3BwcCA9IGRvc3luY3BwcFtpbmZvLT5saW5lXTsKKwl9CisKKwlzeW5jbGlua21wX2RldmljZV9jb3VudCsrOworCisJaWYgKCAhc3luY2xpbmttcF9kZXZpY2VfbGlzdCApCisJCXN5bmNsaW5rbXBfZGV2aWNlX2xpc3QgPSBpbmZvOworCWVsc2UgeworCQlTTE1QX0lORk8gKmN1cnJlbnRfZGV2ID0gc3luY2xpbmttcF9kZXZpY2VfbGlzdDsKKwkJd2hpbGUoIGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSApCisJCQljdXJyZW50X2RldiA9IGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZTsKKwkJY3VycmVudF9kZXYtPm5leHRfZGV2aWNlID0gaW5mbzsKKwl9CisKKwlpZiAoIGluZm8tPm1heF9mcmFtZV9zaXplIDwgNDA5NiApCisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKwllbHNlIGlmICggaW5mby0+bWF4X2ZyYW1lX3NpemUgPiA2NTUzNSApCisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNjU1MzU7CisKKwlwcmludGsoICJTeW5jTGluayBNdWx0aVBvcnQgJXM6ICIKKwkJIk1lbT0oJTA4eCAlMDhYICUwOHggJTA4WCkgSVJRPSVkIE1heEZyYW1lU2l6ZT0ldVxuIiwKKwkJaW5mby0+ZGV2aWNlX25hbWUsCisJCWluZm8tPnBoeXNfc2NhX2Jhc2UsCisJCWluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsCisJCWluZm8tPnBoeXNfc3RhdGN0cmxfYmFzZSwKKwkJaW5mby0+cGh5c19sY3JfYmFzZSwKKwkJaW5mby0+aXJxX2xldmVsLAorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSApOworCisjaWZkZWYgQ09ORklHX0hETEMKKwloZGxjZGV2X2luaXQoaW5mbyk7CisjZW5kaWYKK30KKworLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBkZXZpY2UgaW5zdGFuY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJuIFZhbHVlOglwb2ludGVyIHRvIFNMTVBfSU5GTyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgTlVMTAorICovCitzdGF0aWMgU0xNUF9JTkZPICphbGxvY19kZXYoaW50IGFkYXB0ZXJfbnVtLCBpbnQgcG9ydF9udW0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCVNMTVBfSU5GTyAqaW5mbzsKKworCWluZm8gPSAoU0xNUF9JTkZPICopa21hbGxvYyhzaXplb2YoU0xNUF9JTkZPKSwKKwkJIEdGUF9LRVJORUwpOworCisJaWYgKCFpbmZvKSB7CisJCXByaW50aygiJXMoJWQpIEVycm9yIGNhbid0IGFsbG9jYXRlIGRldmljZSBpbnN0YW5jZSBkYXRhIGZvciBhZGFwdGVyICVkLCBwb3J0ICVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sIGFkYXB0ZXJfbnVtLCBwb3J0X251bSk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGluZm8sIDAsIHNpemVvZihTTE1QX0lORk8pKTsKKwkJaW5mby0+bWFnaWMgPSBNR1NMX01BR0lDOworCQlJTklUX1dPUksoJmluZm8tPnRhc2ssIGJoX2hhbmRsZXIsIGluZm8pOworCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDQwOTY7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPm5ldGxvY2spOworCQltZW1jcHkoJmluZm8tPnBhcmFtcywmZGVmYXVsdF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJCWluZm8tPmlkbGVfbW9kZSA9IEhETENfVFhJRExFX0ZMQUdTOworCQlpbmZvLT5hZGFwdGVyX251bSA9IGFkYXB0ZXJfbnVtOworCQlpbmZvLT5wb3J0X251bSA9IHBvcnRfbnVtOworCisJCS8qIENvcHkgY29uZmlndXJhdGlvbiBpbmZvIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhICovCisJCWluZm8tPmlycV9sZXZlbCA9IHBkZXYtPmlycTsKKwkJaW5mby0+cGh5c19sY3JfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApOworCQlpbmZvLT5waHlzX3NjYV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMik7CisJCWluZm8tPnBoeXNfbWVtb3J5X2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwzKTsKKwkJaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsNCk7CisKKwkJLyogQmVjYXVzZSB2ZXJlbWFwIG9ubHkgd29ya3Mgb24gcGFnZSBib3VuZGFyaWVzIHdlIG11c3QgbWFwCisJCSAqIGEgbGFyZ2VyIGFyZWEgdGhhbiBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCBmb3IgdGhlIExDUgorCQkgKiBtZW1vcnkgcmFuZ2UuIFdlIG1hcCBhIGZ1bGwgcGFnZSBzdGFydGluZyBhdCB0aGUgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCWluZm8tPmxjcl9vZmZzZXQgICAgPSBpbmZvLT5waHlzX2xjcl9iYXNlICYgKFBBR0VfU0laRS0xKTsKKwkJaW5mby0+cGh5c19sY3JfYmFzZSAmPSB+KFBBR0VfU0laRS0xKTsKKworCQlpbmZvLT5zY2Ffb2Zmc2V0ICAgID0gaW5mby0+cGh5c19zY2FfYmFzZSAmIChQQUdFX1NJWkUtMSk7CisJCWluZm8tPnBoeXNfc2NhX2Jhc2UgJj0gfihQQUdFX1NJWkUtMSk7CisKKwkJaW5mby0+c3RhdGN0cmxfb2Zmc2V0ICAgID0gaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlICYgKFBBR0VfU0laRS0xKTsKKwkJaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlICY9IH4oUEFHRV9TSVpFLTEpOworCisJCWluZm8tPmJ1c190eXBlID0gTUdTTF9CVVNfVFlQRV9QQ0k7CisJCWluZm8tPmlycV9mbGFncyA9IFNBX1NISVJROworCisJCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwkJaW5mby0+dHhfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87CisJCWluZm8tPnR4X3RpbWVyLmZ1bmN0aW9uID0gdHhfdGltZW91dDsKKworCQlpbml0X3RpbWVyKCZpbmZvLT5zdGF0dXNfdGltZXIpOworCQlpbmZvLT5zdGF0dXNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87CisJCWluZm8tPnN0YXR1c190aW1lci5mdW5jdGlvbiA9IHN0YXR1c190aW1lb3V0OworCisJCS8qIFN0b3JlIHRoZSBQQ0k5MDUwIG1pc2MgY29udHJvbCByZWdpc3RlciB2YWx1ZSBiZWNhdXNlIGEgZmxhdworCQkgKiBpbiB0aGUgUENJOTA1MCBwcmV2ZW50cyBMQ1IgcmVnaXN0ZXJzIGZyb20gYmVpbmcgcmVhZCBpZgorCQkgKiBCSU9TIGFzc2lnbnMgYW4gTENSIGJhc2UgYWRkcmVzcyB3aXRoIGJpdCA3IHNldC4KKwkJICoKKwkJICogT25seSB0aGUgbWlzYyBjb250cm9sIHJlZ2lzdGVyIGlzIGFjY2Vzc2VkIGZvciB3aGljaCBvbmx5CisJCSAqIHdyaXRlIGFjY2VzcyBpcyBuZWVkZWQsIHNvIHNldCBhbiBpbml0aWFsIHZhbHVlIGFuZCBjaGFuZ2UKKwkJICogYml0cyB0byB0aGUgZGV2aWNlIGluc3RhbmNlIGRhdGEgYXMgd2Ugd3JpdGUgdGhlIHZhbHVlCisJCSAqIHRvIHRoZSBhY3R1YWwgbWlzYyBjb250cm9sIHJlZ2lzdGVyLgorCQkgKi8KKwkJaW5mby0+bWlzY19jdHJsX3ZhbHVlID0gMHgwODdlNDU0NjsKKworCQkvKiBpbml0aWFsIHBvcnQgc3RhdGUgaXMgdW5rbm93biAtIGlmIHN0YXJ0dXAgZXJyb3JzCisJCSAqIG9jY3VyLCBpbml0X2Vycm9yIHdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHRoZQorCQkgKiBwcm9ibGVtLiBPbmNlIHRoZSBwb3J0IGlzIGZ1bGx5IGluaXRpYWxpemVkLAorCQkgKiB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDAgdG8gaW5kaWNhdGUgdGhlCisJCSAqIHBvcnQgaXMgYXZhaWxhYmxlLgorCQkgKi8KKwkJaW5mby0+aW5pdF9lcnJvciA9IC0xOworCX0KKworCXJldHVybiBpbmZvOworfQorCit2b2lkIGRldmljZV9pbml0KGludCBhZGFwdGVyX251bSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJU0xNUF9JTkZPICpwb3J0X2FycmF5W1NDQV9NQVhfUE9SVFNdOworCWludCBwb3J0OworCisJLyogYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlcyBmb3IgdXAgdG8gU0NBX01BWF9QT1JUUyBkZXZpY2VzICovCisJZm9yICggcG9ydCA9IDA7IHBvcnQgPCBTQ0FfTUFYX1BPUlRTOyArK3BvcnQgKSB7CisJCXBvcnRfYXJyYXlbcG9ydF0gPSBhbGxvY19kZXYoYWRhcHRlcl9udW0scG9ydCxwZGV2KTsKKwkJaWYoIHBvcnRfYXJyYXlbcG9ydF0gPT0gTlVMTCApIHsKKwkJCWZvciAoIC0tcG9ydDsgcG9ydCA+PSAwOyAtLXBvcnQgKQorCQkJCWtmcmVlKHBvcnRfYXJyYXlbcG9ydF0pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogZ2l2ZSBjb3B5IG9mIHBvcnRfYXJyYXkgdG8gYWxsIHBvcnRzIGFuZCBhZGQgdG8gZGV2aWNlIGxpc3QgICovCisJZm9yICggcG9ydCA9IDA7IHBvcnQgPCBTQ0FfTUFYX1BPUlRTOyArK3BvcnQgKSB7CisJCW1lbWNweShwb3J0X2FycmF5W3BvcnRdLT5wb3J0X2FycmF5LHBvcnRfYXJyYXksc2l6ZW9mKHBvcnRfYXJyYXkpKTsKKwkJYWRkX2RldmljZSggcG9ydF9hcnJheVtwb3J0XSApOworCQlzcGluX2xvY2tfaW5pdCgmcG9ydF9hcnJheVtwb3J0XS0+bG9jayk7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIGNsYWltIGFkYXB0ZXIgcmVzb3VyY2VzICovCisJaWYgKCAhY2xhaW1fcmVzb3VyY2VzKHBvcnRfYXJyYXlbMF0pICkgeworCisJCWFsbG9jX2RtYV9idWZzKHBvcnRfYXJyYXlbMF0pOworCisJCS8qIGNvcHkgcmVzb3VyY2UgaW5mb3JtYXRpb24gZnJvbSBmaXJzdCBwb3J0IHRvIG90aGVycyAqLworCQlmb3IgKCBwb3J0ID0gMTsgcG9ydCA8IFNDQV9NQVhfUE9SVFM7ICsrcG9ydCApIHsKKwkJCXBvcnRfYXJyYXlbcG9ydF0tPmxvY2sgID0gcG9ydF9hcnJheVswXS0+bG9jazsKKwkJCXBvcnRfYXJyYXlbcG9ydF0tPmlycV9sZXZlbCAgICAgPSBwb3J0X2FycmF5WzBdLT5pcnFfbGV2ZWw7CisJCQlwb3J0X2FycmF5W3BvcnRdLT5tZW1vcnlfYmFzZSAgID0gcG9ydF9hcnJheVswXS0+bWVtb3J5X2Jhc2U7CisJCQlwb3J0X2FycmF5W3BvcnRdLT5zY2FfYmFzZSAgICAgID0gcG9ydF9hcnJheVswXS0+c2NhX2Jhc2U7CisJCQlwb3J0X2FycmF5W3BvcnRdLT5zdGF0Y3RybF9iYXNlID0gcG9ydF9hcnJheVswXS0+c3RhdGN0cmxfYmFzZTsKKwkJCXBvcnRfYXJyYXlbcG9ydF0tPmxjcl9iYXNlICAgICAgPSBwb3J0X2FycmF5WzBdLT5sY3JfYmFzZTsKKwkJCWFsbG9jX2RtYV9idWZzKHBvcnRfYXJyYXlbcG9ydF0pOworCQl9CisKKwkJaWYgKCByZXF1ZXN0X2lycShwb3J0X2FycmF5WzBdLT5pcnFfbGV2ZWwsCisJCQkJCXN5bmNsaW5rbXBfaW50ZXJydXB0LAorCQkJCQlwb3J0X2FycmF5WzBdLT5pcnFfZmxhZ3MsCisJCQkJCXBvcnRfYXJyYXlbMF0tPmRldmljZV9uYW1lLAorCQkJCQlwb3J0X2FycmF5WzBdKSA8IDAgKSB7CisJCQlwcmludGsoICIlcyglZCk6JXMgQ2FudCByZXF1ZXN0IGludGVycnVwdCwgSVJRPSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLAorCQkJCXBvcnRfYXJyYXlbMF0tPmRldmljZV9uYW1lLAorCQkJCXBvcnRfYXJyYXlbMF0tPmlycV9sZXZlbCApOworCQl9CisJCWVsc2UgeworCQkJcG9ydF9hcnJheVswXS0+aXJxX3JlcXVlc3RlZCA9IDE7CisJCQlhZGFwdGVyX3Rlc3QocG9ydF9hcnJheVswXSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgb3BzID0geworCS5vcGVuID0gb3BlbiwKKwkuY2xvc2UgPSBjbG9zZSwKKwkud3JpdGUgPSB3cml0ZSwKKwkucHV0X2NoYXIgPSBwdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBmbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IHdyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IGNoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IGlvY3RsLAorCS50aHJvdHRsZSA9IHRocm90dGxlLAorCS51bnRocm90dGxlID0gdW50aHJvdHRsZSwKKwkuc2VuZF94Y2hhciA9IHNlbmRfeGNoYXIsCisJLmJyZWFrX2N0bCA9IHNldF9icmVhaywKKwkud2FpdF91bnRpbF9zZW50ID0gd2FpdF91bnRpbF9zZW50LAorIAkucmVhZF9wcm9jID0gcmVhZF9wcm9jLAorCS5zZXRfdGVybWlvcyA9IHNldF90ZXJtaW9zLAorCS5zdG9wID0gdHhfaG9sZCwKKwkuc3RhcnQgPSB0eF9yZWxlYXNlLAorCS5oYW5ndXAgPSBoYW5ndXAsCisJLnRpb2NtZ2V0ID0gdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gdGlvY21zZXQsCit9OworCitzdGF0aWMgdm9pZCBzeW5jbGlua21wX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgcmM7CisJU0xNUF9JTkZPICppbmZvOworCVNMTVBfSU5GTyAqdG1wOworCisJcHJpbnRrKCJVbmxvYWRpbmcgJXMgJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisKKwlpZiAoc2VyaWFsX2RyaXZlcikgeworCQlpZiAoKHJjID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKSkKKwkJCXByaW50aygiJXMoJWQpIGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgZXJyPSVkXG4iLAorCQkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLHJjKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJfQorCisJLyogcmVzZXQgZGV2aWNlcyAqLworCWluZm8gPSBzeW5jbGlua21wX2RldmljZV9saXN0OworCXdoaWxlKGluZm8pIHsKKwkJcmVzZXRfcG9ydChpbmZvKTsKKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCX0KKworCS8qIHJlbGVhc2UgZGV2aWNlcyAqLworCWluZm8gPSBzeW5jbGlua21wX2RldmljZV9saXN0OworCXdoaWxlKGluZm8pIHsKKyNpZmRlZiBDT05GSUdfSERMQworCQloZGxjZGV2X2V4aXQoaW5mbyk7CisjZW5kaWYKKwkJZnJlZV9kbWFfYnVmcyhpbmZvKTsKKwkJZnJlZV90bXBfcnhfYnVmKGluZm8pOworCQlpZiAoIGluZm8tPnBvcnRfbnVtID09IDAgKSB7CisJCQlpZiAoaW5mby0+c2NhX2Jhc2UpCisJCQkJd3JpdGVfcmVnKGluZm8sIExQUiwgMSk7IC8qIHNldCBsb3cgcG93ZXIgbW9kZSAqLworCQkJcmVsZWFzZV9yZXNvdXJjZXMoaW5mbyk7CisJCX0KKwkJdG1wID0gaW5mbzsKKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCQlrZnJlZSh0bXApOworCX0KKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3luY2xpbmttcF9wY2lfZHJpdmVyKTsKK30KKworLyogRHJpdmVyIGluaXRpYWxpemF0aW9uIGVudHJ5IHBvaW50LgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHN5bmNsaW5rbXBfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCWlmIChicmVha19vbl9sb2FkKSB7CisJIAlzeW5jbGlua21wX2dldF90ZXh0X3B0cigpOworICAJCUJSRUFLUE9JTlQoKTsKKwl9CisKKyAJcHJpbnRrKCIlcyAlc1xuIiwgZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uKTsKKworCWlmICgocmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzeW5jbGlua21wX3BjaV9kcml2ZXIpKSA8IDApIHsKKwkJcHJpbnRrKCIlczpmYWlsZWQgdG8gcmVnaXN0ZXIgUENJIGRyaXZlciwgZXJyb3I9JWRcbiIsX19GSUxFX18scmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJc2VyaWFsX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoMTI4KTsKKwlpZiAoIXNlcmlhbF9kcml2ZXIpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisKKwlzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gInN5bmNsaW5rbXAiOworCXNlcmlhbF9kcml2ZXItPm5hbWUgPSAidHR5U0xNIjsKKwlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOworCXNlcmlhbF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gNjQ7CisJc2VyaWFsX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJc2VyaWFsX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhzZXJpYWxfZHJpdmVyLCAmb3BzKTsKKwlpZiAoKHJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkgPCAwKSB7CisJCXByaW50aygiJXMoJWQpOkNvdWxkbid0IHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCQlzZXJpYWxfZHJpdmVyID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKyAJcHJpbnRrKCIlcyAlcywgdHR5IG1ham9yIyVkXG4iLAorCQlkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24sCisJCXNlcmlhbF9kcml2ZXItPm1ham9yKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlzeW5jbGlua21wX2NsZWFudXAoKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzeW5jbGlua21wX2V4aXQodm9pZCkKK3sKKwlzeW5jbGlua21wX2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoc3luY2xpbmttcF9pbml0KTsKK21vZHVsZV9leGl0KHN5bmNsaW5rbXBfZXhpdCk7CisKKy8qIFNldCB0aGUgcG9ydCBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZS4KKyAqIFRoZSBUeENMSyBhbmQgUnhDTEsgc2lnbmFscyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIEJSRyBhbmQKKyAqIHRoZSBUeEQgaXMgbG9vcGVkIGJhY2sgdG8gdGhlIFJ4RCBpbnRlcm5hbGx5LgorICovCit2b2lkIGVuYWJsZV9sb29wYmFjayhTTE1QX0lORk8gKmluZm8sIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQkvKiBNRDIgKE1vZGUgUmVnaXN0ZXIgMikKKwkJICogMDEuLjAwICBDTkNUPDEuLjA+IENoYW5uZWwgQ29ubmVjdGlvbiAxMT1Mb2NhbCBMb29wYmFjaworCQkgKi8KKwkJd3JpdGVfcmVnKGluZm8sIE1EMiwgKHVuc2lnbmVkIGNoYXIpKHJlYWRfcmVnKGluZm8sIE1EMikgfCAoQklUMSArIEJJVDApKSk7CisKKwkJLyogZGVnYXRlIGV4dGVybmFsIFR4QyBjbG9jayBzb3VyY2UgKi8KKwkJaW5mby0+cG9ydF9hcnJheVswXS0+Y3RybHJlZ192YWx1ZSB8PSAoQklUMCA8PCAoaW5mby0+cG9ydF9udW0gKiAyKSk7CisJCXdyaXRlX2NvbnRyb2xfcmVnKGluZm8pOworCisJCS8qIFJYUy9UWFMgKFJ4L1R4IGNsb2NrIHNvdXJjZSkKKwkJICogMDcgICAgICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJCSAqIDA2Li4wNCAgQ2xvY2sgU291cmNlLCAxMDA9QlJHCisJCSAqIDAzLi4wMCAgQ2xvY2sgRGl2aXNvciwgMDAwMD0xCisJCSAqLworCQl3cml0ZV9yZWcoaW5mbywgUlhTLCAweDQwKTsKKwkJd3JpdGVfcmVnKGluZm8sIFRYUywgMHg0MCk7CisKKwl9IGVsc2UgeworCQkvKiBNRDIgKE1vZGUgUmVnaXN0ZXIgMikKKwkgCSAqIDAxLi4wMCAgQ05DVDwxLi4wPiBDaGFubmVsIGNvbm5lY3Rpb24sIDA9bm9ybWFsCisJCSAqLworCQl3cml0ZV9yZWcoaW5mbywgTUQyLCAodW5zaWduZWQgY2hhcikocmVhZF9yZWcoaW5mbywgTUQyKSAmIH4oQklUMSArIEJJVDApKSk7CisKKwkJLyogUlhTL1RYUyAoUngvVHggY2xvY2sgc291cmNlKQorCQkgKiAwNyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkJICogMDYuLjA0ICBDbG9jayBTb3VyY2UsIDAwMD1SeEMvVHhDIFBpbgorCQkgKiAwMy4uMDAgIENsb2NrIERpdmlzb3IsIDAwMDA9MQorCQkgKi8KKwkJd3JpdGVfcmVnKGluZm8sIFJYUywgMHgwMCk7CisJCXdyaXRlX3JlZyhpbmZvLCBUWFMsIDB4MDApOworCX0KKworCS8qIHNldCBMaW5rU3BlZWQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZGVmYXVsdCB0byAyTWJwcyAqLworCWlmIChpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCXNldF9yYXRlKGluZm8sIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisJZWxzZQorCQlzZXRfcmF0ZShpbmZvLCAzNjg2NDAwKTsKK30KKworLyogU2V0IHRoZSBiYXVkIHJhdGUgcmVnaXN0ZXIgdG8gdGhlIGRlc2lyZWQgc3BlZWQKKyAqCisgKglkYXRhX3JhdGUJZGF0YSByYXRlIG9mIGNsb2NrIGluIGJpdHMgcGVyIHNlY29uZAorICoJCQlBIGRhdGEgcmF0ZSBvZiAwIGRpc2FibGVzIHRoZSBBVVggY2xvY2suCisgKi8KK3ZvaWQgc2V0X3JhdGUoIFNMTVBfSU5GTyAqaW5mbywgdTMyIGRhdGFfcmF0ZSApCit7CisgICAgICAgCXUzMiBUTUNWYWx1ZTsKKyAgICAgICAJdW5zaWduZWQgY2hhciBCUlZhbHVlOworCXUzMiBEaXZpc29yPTA7CisKKwkvKiBmQlJHID0gZkNMSy8oVE1DICogMl5CUikKKwkgKi8KKwlpZiAoZGF0YV9yYXRlICE9IDApIHsKKwkJRGl2aXNvciA9IDE0NzQ1NjAwL2RhdGFfcmF0ZTsKKwkJaWYgKCFEaXZpc29yKQorCQkJRGl2aXNvciA9IDE7CisKKwkJVE1DVmFsdWUgPSBEaXZpc29yOworCisJCUJSVmFsdWUgPSAwOworCQlpZiAoVE1DVmFsdWUgIT0gMSAmJiBUTUNWYWx1ZSAhPSAyKSB7CisJCQkvKiBCUlZhbHVlIG9mIDAgcHJvdmlkZXMgNTAvNTAgZHV0eSBjeWNsZSAqb25seSogd2hlbgorCQkJICogVE1DVmFsdWUgaXMgMSBvciAyLiBCUlZhbHVlIG9mIDEgdG8gOSBhbHdheXMgcHJvdmlkZXMKKwkJCSAqIDUwLzUwIGR1dHkgY3ljbGUuCisJCQkgKi8KKwkJCUJSVmFsdWUgPSAxOworCQkJVE1DVmFsdWUgPj49IDE7CisJCX0KKworCQkvKiB3aGlsZSBUTUNWYWx1ZSBpcyB0b28gYmlnIGZvciBUTUMgcmVnaXN0ZXIsIGRpdmlkZQorCQkgKiBieSAyIGFuZCBpbmNyZW1lbnQgQlIgZXhwb25lbnQuCisJCSAqLworCQlmb3IoOyBUTUNWYWx1ZSA+IDI1NiAmJiBCUlZhbHVlIDwgMTA7IEJSVmFsdWUrKykKKwkJCVRNQ1ZhbHVlID4+PSAxOworCisJCXdyaXRlX3JlZyhpbmZvLCBUWFMsCisJCQkodW5zaWduZWQgY2hhcikoKHJlYWRfcmVnKGluZm8sIFRYUykgJiAweGYwKSB8IEJSVmFsdWUpKTsKKwkJd3JpdGVfcmVnKGluZm8sIFJYUywKKwkJCSh1bnNpZ25lZCBjaGFyKSgocmVhZF9yZWcoaW5mbywgUlhTKSAmIDB4ZjApIHwgQlJWYWx1ZSkpOworCQl3cml0ZV9yZWcoaW5mbywgVE1DLCAodW5zaWduZWQgY2hhcilUTUNWYWx1ZSk7CisJfQorCWVsc2UgeworCQl3cml0ZV9yZWcoaW5mbywgVFhTLDApOworCQl3cml0ZV9yZWcoaW5mbywgUlhTLDApOworCQl3cml0ZV9yZWcoaW5mbywgVE1DLCAwKTsKKwl9Cit9CisKKy8qIERpc2FibGUgcmVjZWl2ZXIKKyAqLwordm9pZCByeF9zdG9wKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTolcyByeF9zdG9wKClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwl3cml0ZV9yZWcoaW5mbywgQ01ELCBSWFJFU0VUKTsKKworCWluZm8tPmllMF92YWx1ZSAmPSB+UlhSRFlFOworCXdyaXRlX3JlZyhpbmZvLCBJRTAsIGluZm8tPmllMF92YWx1ZSk7CS8qIGRpc2FibGUgUnggZGF0YSBpbnRlcnJ1cHRzICovCisKKwl3cml0ZV9yZWcoaW5mbywgUlhETUEgKyBEU1IsIDApOwkvKiBkaXNhYmxlIFJ4IERNQSAqLworCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERDTUQsIFNXQUJPUlQpOwkvKiByZXNldC9pbml0IFJ4IERNQSAqLworCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERJUiwgMCk7CS8qIGRpc2FibGUgUnggRE1BIGludGVycnVwdHMgKi8KKworCWluZm8tPnJ4X2VuYWJsZWQgPSAwOworCWluZm8tPnJ4X292ZXJmbG93ID0gMDsKK30KKworLyogZW5hYmxlIHRoZSByZWNlaXZlcgorICovCit2b2lkIHJ4X3N0YXJ0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbnQgaTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOiVzIHJ4X3N0YXJ0KClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwl3cml0ZV9yZWcoaW5mbywgQ01ELCBSWFJFU0VUKTsKKworCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgKSB7CisJCS8qIEhETEMsIGRpc2FiZSBJUlEgb24gcnhkYXRhICovCisJCWluZm8tPmllMF92YWx1ZSAmPSB+UlhSRFlFOworCQl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworCisJCS8qIFJlc2V0IGFsbCBSeCBETUEgYnVmZmVycyBhbmQgcHJvZ3JhbSByeCBkbWEgKi8KKwkJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRFNSLCAwKTsJCS8qIGRpc2FibGUgUnggRE1BICovCisJCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERDTUQsIFNXQUJPUlQpOwkvKiByZXNldC9pbml0IFJ4IERNQSAqLworCisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5yeF9idWZfY291bnQ7IGkrKykgeworCQkJaW5mby0+cnhfYnVmX2xpc3RbaV0uc3RhdHVzID0gMHhmZjsKKworCQkJLy8gdGhyb3R0bGUgdG8gNCBzaGFyZWQgbWVtb3J5IHdyaXRlcyBhdCBhIHRpbWUgdG8gcHJldmVudAorCQkJLy8gaG9nZ2luZyBsb2NhbCBidXMgKGtlZXAgbGF0ZW5jeSB0aW1lIGZvciBETUEgcmVxdWVzdHMgbG93KS4KKwkJCWlmICghKGkgJSA0KSkKKwkJCQlyZWFkX3N0YXR1c19yZWcoaW5mbyk7CisJCX0KKwkJaW5mby0+Y3VycmVudF9yeF9idWYgPSAwOworCisJCS8qIHNldCBjdXJyZW50LzFzdCBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJd3JpdGVfcmVnMTYoaW5mbywgUlhETUEgKyBDREEsCisJCQlpbmZvLT5yeF9idWZfbGlzdF9leFswXS5waHlzX2VudHJ5KTsKKworCQkvKiBzZXQgbmV3IGxhc3QgcnggZGVzY3JpcHRvciBhZGRyZXNzICovCisJCXdyaXRlX3JlZzE2KGluZm8sIFJYRE1BICsgRURBLAorCQkJaW5mby0+cnhfYnVmX2xpc3RfZXhbaW5mby0+cnhfYnVmX2NvdW50IC0gMV0ucGh5c19lbnRyeSk7CisKKwkJLyogc2V0IGJ1ZmZlciBsZW5ndGggKHNoYXJlZCBieSBhbGwgcnggZG1hIGRhdGEgYnVmZmVycykgKi8KKwkJd3JpdGVfcmVnMTYoaW5mbywgUlhETUEgKyBCRkwsIFNDQUJVRlNJWkUpOworCisJCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERJUiwgMHg2MCk7CS8qIGVuYWJsZSBSeCBETUEgaW50ZXJydXB0cyAoRU9NL0JPRikgKi8KKwkJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRFNSLCAweGYyKTsJLyogY2xlYXIgUnggRE1BIElSUXMsIGVuYWJsZSBSeCBETUEgKi8KKwl9IGVsc2UgeworCQkvKiBhc3luYywgZW5hYmxlIElSUSBvbiByeGRhdGEgKi8KKwkJaW5mby0+aWUwX3ZhbHVlIHw9IFJYUkRZRTsKKwkJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKKwl9CisKKwl3cml0ZV9yZWcoaW5mbywgQ01ELCBSWEVOQUJMRSk7CisKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IEZBTFNFOworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworfQorCisvKiBFbmFibGUgdGhlIHRyYW5zbWl0dGVyIGFuZCBzZW5kIGEgdHJhbnNtaXQgZnJhbWUgaWYKKyAqIG9uZSBpcyBsb2FkZWQgaW4gdGhlIERNQSBidWZmZXJzLgorICovCit2b2lkIHR4X3N0YXJ0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTolcyB0eF9zdGFydCgpIHR4X2NvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSxpbmZvLT50eF9jb3VudCApOworCisJaWYgKCFpbmZvLT50eF9lbmFibGVkICkgeworCQl3cml0ZV9yZWcoaW5mbywgQ01ELCBUWFJFU0VUKTsKKwkJd3JpdGVfcmVnKGluZm8sIENNRCwgVFhFTkFCTEUpOworCQlpbmZvLT50eF9lbmFibGVkID0gVFJVRTsKKwl9CisKKwlpZiAoIGluZm8tPnR4X2NvdW50ICkgeworCisJCS8qIElmIGF1dG8gUlRTIGVuYWJsZWQgYW5kIFJUUyBpcyBpbmFjdGl2ZSwgdGhlbiBhc3NlcnQgKi8KKwkJLyogUlRTIGFuZCBzZXQgYSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgZHJpdmVyIHNob3VsZCAqLworCQkvKiBuZWdhdGUgUlRTIHdoZW4gdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMuICovCisKKwkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisKKwkJaWYgKGluZm8tPnBhcmFtcy5tb2RlICE9IE1HU0xfTU9ERV9BU1lOQykgeworCisJCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX1JUUyApIHsKKwkJCQlnZXRfc2lnbmFscyggaW5mbyApOworCQkJCWlmICggIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpICkgeworCQkJCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCQkJCQlzZXRfc2lnbmFscyggaW5mbyApOworCQkJCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCXdyaXRlX3JlZzE2KGluZm8sIFRSQzAsCisJCQkJKHVuc2lnbmVkIHNob3J0KSgoKHR4X25lZ2F0ZV9maWZvX2xldmVsLTEpPDw4KSArIHR4X2FjdGl2ZV9maWZvX2xldmVsKSk7CisKKwkJCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERTUiwgMCk7IAkJLyogZGlzYWJsZSBETUEgY2hhbm5lbCAqLworCQkJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgRE1BIGNoYW5uZWwgKi8KKwkKKwkJCS8qIHNldCBUWCBDREEgKGN1cnJlbnQgZGVzY3JpcHRvciBhZGRyZXNzKSAqLworCQkJd3JpdGVfcmVnMTYoaW5mbywgVFhETUEgKyBDREEsCisJCQkJaW5mby0+dHhfYnVmX2xpc3RfZXhbMF0ucGh5c19lbnRyeSk7CisJCisJCQkvKiBzZXQgVFggRURBIChsYXN0IGRlc2NyaXB0b3IgYWRkcmVzcykgKi8KKwkJCXdyaXRlX3JlZzE2KGluZm8sIFRYRE1BICsgRURBLAorCQkJCWluZm8tPnR4X2J1Zl9saXN0X2V4W2luZm8tPmxhc3RfdHhfYnVmXS5waHlzX2VudHJ5KTsKKwkKKwkJCS8qIGVuYWJsZSB1bmRlcnJ1biBJUlEgKi8KKwkJCWluZm8tPmllMV92YWx1ZSAmPSB+SURMRTsKKwkJCWluZm8tPmllMV92YWx1ZSB8PSBVRFJOOworCQkJd3JpdGVfcmVnKGluZm8sIElFMSwgaW5mby0+aWUxX3ZhbHVlKTsKKwkJCXdyaXRlX3JlZyhpbmZvLCBTUjEsICh1bnNpZ25lZCBjaGFyKShJRExFICsgVURSTikpOworCQorCQkJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRElSLCAweDQwKTsJCS8qIGVuYWJsZSBUeCBETUEgaW50ZXJydXB0cyAoRU9NKSAqLworCQkJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRFNSLCAweGYyKTsJCS8qIGNsZWFyIFR4IERNQSBJUlFzLCBlbmFibGUgVHggRE1BICovCisJCisJCQlpbmZvLT50eF90aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCk7CisJCQlhZGRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwkJfQorCQllbHNlIHsKKwkJCXR4X2xvYWRfZmlmbyhpbmZvKTsKKwkJCS8qIGFzeW5jLCBlbmFibGUgSVJRIG9uIHR4ZGF0YSAqLworCQkJaW5mby0+aWUwX3ZhbHVlIHw9IFRYUkRZRTsKKwkJCXdyaXRlX3JlZyhpbmZvLCBJRTAsIGluZm8tPmllMF92YWx1ZSk7CisJCX0KKworCQlpbmZvLT50eF9hY3RpdmUgPSAxOworCX0KK30KKworLyogc3RvcCB0aGUgdHJhbnNtaXR0ZXIgYW5kIERNQQorICovCit2b2lkIHR4X3N0b3AoIFNMTVBfSU5GTyAqaW5mbyApCit7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6JXMgdHhfc3RvcCgpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJZGVsX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CisKKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEU1IsIDApOwkJLyogZGlzYWJsZSBETUEgY2hhbm5lbCAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERDTUQsIFNXQUJPUlQpOwkvKiByZXNldC9pbml0IERNQSBjaGFubmVsICovCisKKwl3cml0ZV9yZWcoaW5mbywgQ01ELCBUWFJFU0VUKTsKKworCWluZm8tPmllMV92YWx1ZSAmPSB+KFVEUk4gKyBJRExFKTsKKwl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOwkvKiBkaXNhYmxlIHR4IHN0YXR1cyBpbnRlcnJ1cHRzICovCisJd3JpdGVfcmVnKGluZm8sIFNSMSwgKHVuc2lnbmVkIGNoYXIpKElETEUgKyBVRFJOKSk7CS8qIGNsZWFyIHBlbmRpbmcgKi8KKworCWluZm8tPmllMF92YWx1ZSAmPSB+VFhSRFlFOworCXdyaXRlX3JlZyhpbmZvLCBJRTAsIGluZm8tPmllMF92YWx1ZSk7CS8qIGRpc2FibGUgdHggZGF0YSBpbnRlcnJ1cHRzICovCisKKwlpbmZvLT50eF9lbmFibGVkID0gMDsKKwlpbmZvLT50eF9hY3RpdmUgID0gMDsKK30KKworLyogRmlsbCB0aGUgdHJhbnNtaXQgRklGTyB1bnRpbCB0aGUgRklGTyBpcyBmdWxsIG9yCisgKiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gbG9hZC4KKyAqLwordm9pZCB0eF9sb2FkX2ZpZm8oU0xNUF9JTkZPICppbmZvKQoreworCXU4IFR3b0J5dGVzWzJdOworCisJLyogZG8gbm90aGluZyBpcyBub3cgdHggZGF0YSBhdmFpbGFibGUgYW5kIG5vIFhPTi9YT0ZGIHBlbmRpbmcgKi8KKworCWlmICggIWluZm8tPnR4X2NvdW50ICYmICFpbmZvLT54X2NoYXIgKQorCQlyZXR1cm47CisKKwkvKiBsb2FkIHRoZSBUcmFuc21pdCBGSUZPIHVudGlsIEZJRk9zIGZ1bGwgb3IgYWxsIGRhdGEgc2VudCAqLworCisJd2hpbGUoIGluZm8tPnR4X2NvdW50ICYmIChyZWFkX3JlZyhpbmZvLFNSMCkgJiBCSVQxKSApIHsKKworCQkvKiB0aGVyZSBpcyBtb3JlIHNwYWNlIGluIHRoZSB0cmFuc21pdCBGSUZPIGFuZCAqLworCQkvKiB0aGVyZSBpcyBtb3JlIGRhdGEgaW4gdHJhbnNtaXQgYnVmZmVyICovCisKKwkJaWYgKCAoaW5mby0+dHhfY291bnQgPiAxKSAmJiAhaW5mby0+eF9jaGFyICkgeworIAkJCS8qIHdyaXRlIDE2LWJpdHMgKi8KKwkJCVR3b0J5dGVzWzBdID0gaW5mby0+dHhfYnVmW2luZm8tPnR4X2dldCsrXTsKKwkJCWlmIChpbmZvLT50eF9nZXQgPj0gaW5mby0+bWF4X2ZyYW1lX3NpemUpCisJCQkJaW5mby0+dHhfZ2V0IC09IGluZm8tPm1heF9mcmFtZV9zaXplOworCQkJVHdvQnl0ZXNbMV0gPSBpbmZvLT50eF9idWZbaW5mby0+dHhfZ2V0KytdOworCQkJaWYgKGluZm8tPnR4X2dldCA+PSBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkKKwkJCQlpbmZvLT50eF9nZXQgLT0gaW5mby0+bWF4X2ZyYW1lX3NpemU7CisKKwkJCXdyaXRlX3JlZzE2KGluZm8sIFRSQiwgKigodTE2ICopVHdvQnl0ZXMpKTsKKworCQkJaW5mby0+dHhfY291bnQgLT0gMjsKKwkJCWluZm8tPmljb3VudC50eCArPSAyOworCQl9IGVsc2UgeworCQkJLyogb25seSAxIGJ5dGUgbGVmdCB0byB0cmFuc21pdCBvciAxIEZJRk8gc2xvdCBsZWZ0ICovCisKKwkJCWlmIChpbmZvLT54X2NoYXIpIHsKKwkJCQkvKiB0cmFuc21pdCBwZW5kaW5nIGhpZ2ggcHJpb3JpdHkgY2hhciAqLworCQkJCXdyaXRlX3JlZyhpbmZvLCBUUkIsIGluZm8tPnhfY2hhcik7CisJCQkJaW5mby0+eF9jaGFyID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJd3JpdGVfcmVnKGluZm8sIFRSQiwgaW5mby0+dHhfYnVmW2luZm8tPnR4X2dldCsrXSk7CisJCQkJaWYgKGluZm8tPnR4X2dldCA+PSBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkKKwkJCQkJaW5mby0+dHhfZ2V0IC09IGluZm8tPm1heF9mcmFtZV9zaXplOworCQkJCWluZm8tPnR4X2NvdW50LS07CisJCQl9CisJCQlpbmZvLT5pY291bnQudHgrKzsKKwkJfQorCX0KK30KKworLyogUmVzZXQgYSBwb3J0IHRvIGEga25vd24gc3RhdGUKKyAqLwordm9pZCByZXNldF9wb3J0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAoaW5mby0+c2NhX2Jhc2UpIHsKKworCQl0eF9zdG9wKGluZm8pOworCQlyeF9zdG9wKGluZm8pOworCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFMpOworCQlzZXRfc2lnbmFscyhpbmZvKTsKKworCQkvKiBkaXNhYmxlIGFsbCBwb3J0IGludGVycnVwdHMgKi8KKwkJaW5mby0+aWUwX3ZhbHVlID0gMDsKKwkJaW5mby0+aWUxX3ZhbHVlID0gMDsKKwkJaW5mby0+aWUyX3ZhbHVlID0gMDsKKwkJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKKwkJd3JpdGVfcmVnKGluZm8sIElFMSwgaW5mby0+aWUxX3ZhbHVlKTsKKwkJd3JpdGVfcmVnKGluZm8sIElFMiwgaW5mby0+aWUyX3ZhbHVlKTsKKworCQl3cml0ZV9yZWcoaW5mbywgQ01ELCBDSFJFU0VUKTsKKwl9Cit9CisKKy8qIFJlc2V0IGFsbCB0aGUgcG9ydHMgdG8gYSBrbm93biBzdGF0ZS4KKyAqLwordm9pZCByZXNldF9hZGFwdGVyKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgaSA8IFNDQV9NQVhfUE9SVFM7ICsraSkgeworCQlpZiAoaW5mby0+cG9ydF9hcnJheVtpXSkKKwkJCXJlc2V0X3BvcnQoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJfQorfQorCisvKiBQcm9ncmFtIHBvcnQgZm9yIGFzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9ucy4KKyAqLwordm9pZCBhc3luY19tb2RlKFNMTVBfSU5GTyAqaW5mbykKK3sKKworICAJdW5zaWduZWQgY2hhciBSZWdWYWx1ZTsKKworCXR4X3N0b3AoaW5mbyk7CisJcnhfc3RvcChpbmZvKTsKKworCS8qIE1EMCwgTW9kZSBSZWdpc3RlciAwCisJICoKKwkgKiAwNy4uMDUgIFBSQ1RMPDIuLjA+LCBQcm90b2NvbCBNb2RlLCAwMDA9YXN5bmMKKwkgKiAwNCAgICAgIEFVVE8sIEF1dG8tZW5hYmxlIChSVFMvQ1RTL0RDRCkKKwkgKiAwMyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwMiAgICAgIENSQ0NDLCBDUkMgQ2FsY3VsYXRpb24sIDA9ZGlzYWJsZWQKKwkgKiAwMS4uMDAgIFNUT1A8MS4uMD4gU3RvcCBiaXRzICgwMD0xLDEwPTIpCisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8KKwlSZWdWYWx1ZSA9IDB4MDA7CisJaWYgKGluZm8tPnBhcmFtcy5zdG9wX2JpdHMgIT0gMSkKKwkJUmVnVmFsdWUgfD0gQklUMTsKKwl3cml0ZV9yZWcoaW5mbywgTUQwLCBSZWdWYWx1ZSk7CisKKwkvKiBNRDEsIE1vZGUgUmVnaXN0ZXIgMQorCSAqCisJICogMDcuLjA2ICBCUkFURTwxLi4wPiwgYml0IHJhdGUsIDAwPTEvMSAwMT0xLzE2IDEwPTEvMzIgMTE9MS82NAorCSAqIDA1Li4wNCAgVFhDSFI8MS4uMD4sIHR4IGNoYXIgc2l6ZSwgMDA9OCBiaXRzLDAxPTcsMTA9NiwxMT01CisJICogMDMuLjAyICBSWENIUjwxLi4wPiwgcnggY2hhciBzaXplCisJICogMDEuLjAwICBQTVBNPDEuLjA+LCBQYXJpdHkgbW9kZSwgMDA9bm9uZSAxMD1ldmVuIDExPW9kZAorCSAqCisJICogMDEwMCAwMDAwCisJICovCisJUmVnVmFsdWUgPSAweDQwOworCXN3aXRjaCAoaW5mby0+cGFyYW1zLmRhdGFfYml0cykgeworCWNhc2UgNzogUmVnVmFsdWUgfD0gQklUNCArIEJJVDI7IGJyZWFrOworCWNhc2UgNjogUmVnVmFsdWUgfD0gQklUNSArIEJJVDM7IGJyZWFrOworCWNhc2UgNTogUmVnVmFsdWUgfD0gQklUNSArIEJJVDQgKyBCSVQzICsgQklUMjsgYnJlYWs7CisJfQorCWlmIChpbmZvLT5wYXJhbXMucGFyaXR5ICE9IEFTWU5DX1BBUklUWV9OT05FKSB7CisJCVJlZ1ZhbHVlIHw9IEJJVDE7CisJCWlmIChpbmZvLT5wYXJhbXMucGFyaXR5ID09IEFTWU5DX1BBUklUWV9PREQpCisJCQlSZWdWYWx1ZSB8PSBCSVQwOworCX0KKwl3cml0ZV9yZWcoaW5mbywgTUQxLCBSZWdWYWx1ZSk7CisKKwkvKiBNRDIsIE1vZGUgUmVnaXN0ZXIgMgorCSAqCisJICogMDcuLjAyICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDEuLjAwICBDTkNUPDEuLjA+IENoYW5uZWwgY29ubmVjdGlvbiwgMD1ub3JtYWwKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLworCVJlZ1ZhbHVlID0gMHgwMDsKKwl3cml0ZV9yZWcoaW5mbywgTUQyLCBSZWdWYWx1ZSk7CisKKwkvKiBSWFMsIFJlY2VpdmUgY2xvY2sgc291cmNlCisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNi4uMDQgIFJYQ1M8Mi4uMD4sIGNsb2NrIHNvdXJjZSwgMDAwPVJ4QyBQaW4sIDEwMD1CUkcsIDExMD1EUExMCisJICogMDMuLjAwICBSWEJSPDMuLjA+LCByYXRlIGRpdmlzb3IsIDAwMDA9MQorCSAqLworCVJlZ1ZhbHVlPUJJVDY7CisJd3JpdGVfcmVnKGluZm8sIFJYUywgUmVnVmFsdWUpOworCisJLyogVFhTLCBUcmFuc21pdCBjbG9jayBzb3VyY2UKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA2Li4wNCAgUlhDUzwyLi4wPiwgY2xvY2sgc291cmNlLCAwMDA9VHhDIFBpbiwgMTAwPUJSRywgMTEwPVJlY2VpdmUgQ2xvY2sKKwkgKiAwMy4uMDAgIFJYQlI8My4uMD4sIHJhdGUgZGl2aXNvciwgMDAwMD0xCisJICovCisJUmVnVmFsdWU9QklUNjsKKwl3cml0ZV9yZWcoaW5mbywgVFhTLCBSZWdWYWx1ZSk7CisKKwkvKiBDb250cm9sIFJlZ2lzdGVyCisJICoKKwkgKiA2LDQsMiwwICBDTEtTRUw8My4uMD4sIDAgPSBUY0NMSyBpbiwgMSA9IEF1eGNsayBvdXQKKwkgKi8KKwlpbmZvLT5wb3J0X2FycmF5WzBdLT5jdHJscmVnX3ZhbHVlIHw9IChCSVQwIDw8IChpbmZvLT5wb3J0X251bSAqIDIpKTsKKwl3cml0ZV9jb250cm9sX3JlZyhpbmZvKTsKKworCXR4X3NldF9pZGxlKGluZm8pOworCisJLyogUlJDIFJlY2VpdmUgUmVhZHkgQ29udHJvbCAwCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNC4uMDAgIFJSQzw0Li4wPiBSeCBGSUZPIHRyaWdnZXIgYWN0aXZlIDB4MDAgPSAxIGJ5dGUKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgUlJDLCAweDAwKTsKKworCS8qIFRSQzAgVHJhbnNtaXQgUmVhZHkgQ29udHJvbCAwCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNC4uMDAgIFRSQzw0Li4wPiBUeCBGSUZPIHRyaWdnZXIgYWN0aXZlIDB4MTAgPSAxNiBieXRlcworCSAqLworCXdyaXRlX3JlZyhpbmZvLCBUUkMwLCAweDEwKTsKKworCS8qIFRSQzEgVHJhbnNtaXQgUmVhZHkgQ29udHJvbCAxCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNC4uMDAgIFRSQzw0Li4wPiBUeCBGSUZPIHRyaWdnZXIgaW5hY3RpdmUgMHgxZSA9IDMxIGJ5dGVzIChmdWxsLTEpCisJICovCisJd3JpdGVfcmVnKGluZm8sIFRSQzEsIDB4MWUpOworCisJLyogQ1RMLCBNU0NJIGNvbnRyb2wgcmVnaXN0ZXIKKwkgKgorCSAqIDA3Li4wNiAgUmVzZXJ2ZWQsIHNldCB0byAwCisJICogMDUgICAgICBVRFJOQywgdW5kZXJydW4gY29udHJvbCwgMD1hYm9ydCAxPUNSQytmbGFnIChIRExDL0JTQykKKwkgKiAwNCAgICAgIElETEMsIGlkbGUgY29udHJvbCwgMD1tYXJrIDE9aWRsZSByZWdpc3RlcgorCSAqIDAzICAgICAgQlJLLCBicmVhaywgMD1vZmYgMSA9b24gKGFzeW5jKQorCSAqIDAyICAgICAgU1lOQ0xELCBzeW5jIGNoYXIgbG9hZCBlbmFibGUgKEJTQykgMT1lbmFibGVkCisJICogMDEgICAgICBHT1AsIGdvIGFjdGl2ZSBvbiBwb2xsIChMT09QIG1vZGUpIDE9ZW5hYmxlZAorCSAqIDAwICAgICAgUlRTLCBSVFMgb3V0cHV0IGNvbnRyb2wsIDA9YWN0aXZlIDE9aW5hY3RpdmUKKwkgKgorCSAqIDAwMDEgMDAwMQorCSAqLworCVJlZ1ZhbHVlID0gMHgxMDsKKwlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpKQorCQlSZWdWYWx1ZSB8PSAweDAxOworCXdyaXRlX3JlZyhpbmZvLCBDVEwsIFJlZ1ZhbHVlKTsKKworCS8qIGVuYWJsZSBzdGF0dXMgaW50ZXJydXB0cyAqLworCWluZm8tPmllMF92YWx1ZSB8PSBUWElOVEUgKyBSWElOVEU7CisJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKKworCS8qIGVuYWJsZSBicmVhayBkZXRlY3QgaW50ZXJydXB0ICovCisJaW5mby0+aWUxX3ZhbHVlID0gQlJLRDsKKwl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOworCisJLyogZW5hYmxlIHJ4IG92ZXJydW4gaW50ZXJydXB0ICovCisJaW5mby0+aWUyX3ZhbHVlID0gT1ZSTjsKKwl3cml0ZV9yZWcoaW5mbywgSUUyLCBpbmZvLT5pZTJfdmFsdWUpOworCisJc2V0X3JhdGUoIGluZm8sIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKiAxNiApOworCisJaWYgKGluZm8tPnBhcmFtcy5sb29wYmFjaykKKwkJZW5hYmxlX2xvb3BiYWNrKGluZm8sMSk7Cit9CisKKy8qIFByb2dyYW0gdGhlIFNDQSBmb3IgSERMQyBjb21tdW5pY2F0aW9ucy4KKyAqLwordm9pZCBoZGxjX21vZGUoU0xNUF9JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgUmVnVmFsdWU7CisJdTMyIERwbGxEaXZpc29yOworCisJLy8gQ2FuJ3QgdXNlIERQTEwgYmVjYXVzZSBTQ0Egb3V0cHV0cyByZWNvdmVyZWQgY2xvY2sgb24gUnhDIHdoZW4KKwkvLyBEUExMIG1vZGUgc2VsZWN0ZWQuIFRoaXMgY2F1c2VzIG91dHB1dCBjb250ZW50aW9uIHdpdGggUnhDIHJlY2VpdmVyLgorCS8vIFVzZSBvZiBEUExMIHdvdWxkIHJlcXVpcmUgZXh0ZXJuYWwgaGFyZHdhcmUgdG8gZGlzYWJsZSBSeEMgcmVjZWl2ZXIKKwkvLyB3aGVuIERQTEwgbW9kZSBzZWxlY3RlZC4KKwlpbmZvLT5wYXJhbXMuZmxhZ3MgJj0gfihIRExDX0ZMQUdfVFhDX0RQTEwgKyBIRExDX0ZMQUdfUlhDX0RQTEwpOworCisJLyogZGlzYWJsZSBETUEgaW50ZXJydXB0cyAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERJUiwgMCk7CisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRElSLCAwKTsKKworCS8qIE1EMCwgTW9kZSBSZWdpc3RlciAwCisJICoKKwkgKiAwNy4uMDUgIFBSQ1RMPDIuLjA+LCBQcm90b2NvbCBNb2RlLCAxMDA9SERMQworCSAqIDA0ICAgICAgQVVUTywgQXV0by1lbmFibGUgKFJUUy9DVFMvRENEKQorCSAqIDAzICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAyICAgICAgQ1JDQ0MsIENSQyBDYWxjdWxhdGlvbiwgMT1lbmFibGVkCisJICogMDEgICAgICBDUkMxLCBDUkMgc2VsZWN0aW9uLCAwPUNSQy0xNiwxPUNSQy1DQ0lUVC0xNgorCSAqIDAwICAgICAgQ1JDMCwgQ1JDIGluaXRpYWwgdmFsdWUsIDEgPSBhbGwgMXMKKwkgKgorCSAqIDEwMDAgMDAwMQorCSAqLworCVJlZ1ZhbHVlID0gMHg4MTsKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fQ1RTKQorCQlSZWdWYWx1ZSB8PSBCSVQ0OworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19EQ0QpCisJCVJlZ1ZhbHVlIHw9IEJJVDQ7CisJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18xNl9DQ0lUVCkKKwkJUmVnVmFsdWUgfD0gQklUMiArIEJJVDE7CisJd3JpdGVfcmVnKGluZm8sIE1EMCwgUmVnVmFsdWUpOworCisJLyogTUQxLCBNb2RlIFJlZ2lzdGVyIDEKKwkgKgorCSAqIDA3Li4wNiAgQUREUlM8MS4uMD4sIEFkZHJlc3MgZGV0ZWN0LCAwMD1ubyBhZGRyIGNoZWNrCisJICogMDUuLjA0ICBUWENIUjwxLi4wPiwgdHggY2hhciBzaXplLCAwMD04IGJpdHMKKwkgKiAwMy4uMDIgIFJYQ0hSPDEuLjA+LCByeCBjaGFyIHNpemUsIDAwPTggYml0cworCSAqIDAxLi4wMCAgUE1QTTwxLi4wPiwgUGFyaXR5IG1vZGUsIDAwPW5vIHBhcml0eQorCSAqCisJICogMDAwMCAwMDAwCisJICovCisJUmVnVmFsdWUgPSAweDAwOworCXdyaXRlX3JlZyhpbmZvLCBNRDEsIFJlZ1ZhbHVlKTsKKworCS8qIE1EMiwgTW9kZSBSZWdpc3RlciAyCisJICoKKwkgKiAwNyAgICAgIE5SWkZNLCAwPU5SWiwgMT1GTQorCSAqIDA2Li4wNSAgQ09ERTwxLi4wPiBFbmNvZGluZywgMDA9TlJaCisJICogMDQuLjAzICBEUkFURTwxLi4wPiBEUExMIERpdmlzb3IsIDAwPTgKKwkgKiAwMiAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwMS4uMDAgIENOQ1Q8MS4uMD4gQ2hhbm5lbCBjb25uZWN0aW9uLCAwPW5vcm1hbAorCSAqCisJICogMDAwMCAwMDAwCisJICovCisJUmVnVmFsdWUgPSAweDAwOworCXN3aXRjaChpbmZvLT5wYXJhbXMuZW5jb2RpbmcpIHsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSToJICBSZWdWYWx1ZSB8PSBCSVQ1OyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOiAgUmVnVmFsdWUgfD0gQklUNyArIEJJVDU7IGJyZWFrOyAvKiBha2EgRk0xICovCisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U6IFJlZ1ZhbHVlIHw9IEJJVDcgKyBCSVQ2OyBicmVhazsgLyogYWthIEZNMCAqLworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMOiBSZWdWYWx1ZSB8PSBCSVQ3OyBicmVhazsgCS8qIGFrYSBNYW5jaGVzdGVyICovCisjaWYgMAorCWNhc2UgSERMQ19FTkNPRElOR19OUlpCOgkgICAgICAgCQkJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSV9NQVJLOiAgICAgICAgICAJCQkJLyogbm90IHN1cHBvcnRlZCAqLworCWNhc2UgSERMQ19FTkNPRElOR19ESUZGX0JJUEhBU0VfTEVWRUw6IAkJCQkvKiBub3Qgc3VwcG9ydGVkICovCisjZW5kaWYKKwl9CisJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfRFBMTF9ESVYxNiApIHsKKwkJRHBsbERpdmlzb3IgPSAxNjsKKwkJUmVnVmFsdWUgfD0gQklUMzsKKwl9IGVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfRFBMTF9ESVY4ICkgeworCQlEcGxsRGl2aXNvciA9IDg7CisJfSBlbHNlIHsKKwkJRHBsbERpdmlzb3IgPSAzMjsKKwkJUmVnVmFsdWUgfD0gQklUNDsKKwl9CisJd3JpdGVfcmVnKGluZm8sIE1EMiwgUmVnVmFsdWUpOworCisKKwkvKiBSWFMsIFJlY2VpdmUgY2xvY2sgc291cmNlCisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNi4uMDQgIFJYQ1M8Mi4uMD4sIGNsb2NrIHNvdXJjZSwgMDAwPVJ4QyBQaW4sIDEwMD1CUkcsIDExMD1EUExMCisJICogMDMuLjAwICBSWEJSPDMuLjA+LCByYXRlIGRpdmlzb3IsIDAwMDA9MQorCSAqLworCVJlZ1ZhbHVlPTA7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfQlJHKQorCQlSZWdWYWx1ZSB8PSBCSVQ2OworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwpCisJCVJlZ1ZhbHVlIHw9IEJJVDYgKyBCSVQ1OworCXdyaXRlX3JlZyhpbmZvLCBSWFMsIFJlZ1ZhbHVlKTsKKworCS8qIFRYUywgVHJhbnNtaXQgY2xvY2sgc291cmNlCisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNi4uMDQgIFJYQ1M8Mi4uMD4sIGNsb2NrIHNvdXJjZSwgMDAwPVR4QyBQaW4sIDEwMD1CUkcsIDExMD1SZWNlaXZlIENsb2NrCisJICogMDMuLjAwICBSWEJSPDMuLjA+LCByYXRlIGRpdmlzb3IsIDAwMDA9MQorCSAqLworCVJlZ1ZhbHVlPTA7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKQorCQlSZWdWYWx1ZSB8PSBCSVQ2OworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0RQTEwpCisJCVJlZ1ZhbHVlIHw9IEJJVDYgKyBCSVQ1OworCXdyaXRlX3JlZyhpbmZvLCBUWFMsIFJlZ1ZhbHVlKTsKKworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwpCisJCXNldF9yYXRlKGluZm8sIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCAqIERwbGxEaXZpc29yKTsKKwllbHNlCisJCXNldF9yYXRlKGluZm8sIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisKKwkvKiBHUERBVEEgKEdlbmVyYWwgUHVycG9zZSBJL08gRGF0YSBSZWdpc3RlcikKKwkgKgorCSAqIDYsNCwyLDAgIENMS1NFTDwzLi4wPiwgMCA9IFRjQ0xLIGluLCAxID0gQXV4Y2xrIG91dAorCSAqLworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0JSRykKKwkJaW5mby0+cG9ydF9hcnJheVswXS0+Y3RybHJlZ192YWx1ZSB8PSAoQklUMCA8PCAoaW5mby0+cG9ydF9udW0gKiAyKSk7CisJZWxzZQorCQlpbmZvLT5wb3J0X2FycmF5WzBdLT5jdHJscmVnX3ZhbHVlICY9IH4oQklUMCA8PCAoaW5mby0+cG9ydF9udW0gKiAyKSk7CisJd3JpdGVfY29udHJvbF9yZWcoaW5mbyk7CisKKwkvKiBSUkMgUmVjZWl2ZSBSZWFkeSBDb250cm9sIDAKKwkgKgorCSAqIDA3Li4wNSAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA0Li4wMCAgUlJDPDQuLjA+IFJ4IEZJRk8gdHJpZ2dlciBhY3RpdmUKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgUlJDLCByeF9hY3RpdmVfZmlmb19sZXZlbCk7CisKKwkvKiBUUkMwIFRyYW5zbWl0IFJlYWR5IENvbnRyb2wgMAorCSAqCisJICogMDcuLjA1ICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDQuLjAwICBUUkM8NC4uMD4gVHggRklGTyB0cmlnZ2VyIGFjdGl2ZQorCSAqLworCXdyaXRlX3JlZyhpbmZvLCBUUkMwLCB0eF9hY3RpdmVfZmlmb19sZXZlbCk7CisKKwkvKiBUUkMxIFRyYW5zbWl0IFJlYWR5IENvbnRyb2wgMQorCSAqCisJICogMDcuLjA1ICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDQuLjAwICBUUkM8NC4uMD4gVHggRklGTyB0cmlnZ2VyIGluYWN0aXZlIDB4MWYgPSAzMiBieXRlcyAoZnVsbCkKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgVFJDMSwgKHVuc2lnbmVkIGNoYXIpKHR4X25lZ2F0ZV9maWZvX2xldmVsIC0gMSkpOworCisJLyogRE1SLCBETUEgTW9kZSBSZWdpc3RlcgorCSAqCisJICogMDcuLjA1ICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDQgICAgICBUTU9ELCBUcmFuc2ZlciBNb2RlOiAxPWNoYWluZWQtYmxvY2sKKwkgKiAwMyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwMiAgICAgIE5GLCBOdW1iZXIgb2YgRnJhbWVzOiAxPW11bHRpLWZyYW1lCisJICogMDEgICAgICBDTlRFLCBGcmFtZSBFbmQgSVJRIENvdW50ZXIgZW5hYmxlOiAwPWRpc2FibGVkCisJICogMDAgICAgICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICoKKwkgKiAwMDAxIDAxMDAKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBETVIsIDB4MTQpOworCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERNUiwgMHgxNCk7CisKKwkvKiBTZXQgY2hhaW4gcG9pbnRlciBiYXNlICh1cHBlciA4IGJpdHMgb2YgMjQgYml0IGFkZHIpICovCisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgQ1BCLAorCQkodW5zaWduZWQgY2hhcikoaW5mby0+YnVmZmVyX2xpc3RfcGh5cyA+PiAxNikpOworCisJLyogU2V0IGNoYWluIHBvaW50ZXIgYmFzZSAodXBwZXIgOCBiaXRzIG9mIDI0IGJpdCBhZGRyKSAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIENQQiwKKwkJKHVuc2lnbmVkIGNoYXIpKGluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgPj4gMTYpKTsKKworCS8qIGVuYWJsZSBzdGF0dXMgaW50ZXJydXB0cy4gb3RoZXIgY29kZSBlbmFibGVzL2Rpc2FibGVzCisJICogdGhlIGluZGl2aWR1YWwgc291cmNlcyBmb3IgdGhlc2UgdHdvIGludGVycnVwdCBjbGFzc2VzLgorCSAqLworCWluZm8tPmllMF92YWx1ZSB8PSBUWElOVEUgKyBSWElOVEU7CisJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKKworCS8qIENUTCwgTVNDSSBjb250cm9sIHJlZ2lzdGVyCisJICoKKwkgKiAwNy4uMDYgIFJlc2VydmVkLCBzZXQgdG8gMAorCSAqIDA1ICAgICAgVURSTkMsIHVuZGVycnVuIGNvbnRyb2wsIDA9YWJvcnQgMT1DUkMrZmxhZyAoSERMQy9CU0MpCisJICogMDQgICAgICBJRExDLCBpZGxlIGNvbnRyb2wsIDA9bWFyayAxPWlkbGUgcmVnaXN0ZXIKKwkgKiAwMyAgICAgIEJSSywgYnJlYWssIDA9b2ZmIDEgPW9uIChhc3luYykKKwkgKiAwMiAgICAgIFNZTkNMRCwgc3luYyBjaGFyIGxvYWQgZW5hYmxlIChCU0MpIDE9ZW5hYmxlZAorCSAqIDAxICAgICAgR09QLCBnbyBhY3RpdmUgb24gcG9sbCAoTE9PUCBtb2RlKSAxPWVuYWJsZWQKKwkgKiAwMCAgICAgIFJUUywgUlRTIG91dHB1dCBjb250cm9sLCAwPWFjdGl2ZSAxPWluYWN0aXZlCisJICoKKwkgKiAwMDAxIDAwMDEKKwkgKi8KKwlSZWdWYWx1ZSA9IDB4MTA7CisJaWYgKCEoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKSkKKwkJUmVnVmFsdWUgfD0gMHgwMTsKKwl3cml0ZV9yZWcoaW5mbywgQ1RMLCBSZWdWYWx1ZSk7CisKKwkvKiBwcmVhbWJsZSBub3Qgc3VwcG9ydGVkICEgKi8KKworCXR4X3NldF9pZGxlKGluZm8pOworCXR4X3N0b3AoaW5mbyk7CisJcnhfc3RvcChpbmZvKTsKKworCXNldF9yYXRlKGluZm8sIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrKQorCQllbmFibGVfbG9vcGJhY2soaW5mbywxKTsKK30KKworLyogU2V0IHRoZSB0cmFuc21pdCBIRExDIGlkbGUgbW9kZQorICovCit2b2lkIHR4X3NldF9pZGxlKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIFJlZ1ZhbHVlID0gMHhmZjsKKworCS8qIE1hcCBBUEkgaWRsZSBtb2RlIHRvIFNDQSByZWdpc3RlciBiaXRzICovCisJc3dpdGNoKGluZm8tPmlkbGVfbW9kZSkgeworCWNhc2UgSERMQ19UWElETEVfRkxBR1M6CQkJUmVnVmFsdWUgPSAweDdlOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX0FMVF9aRVJPU19PTkVTOglSZWdWYWx1ZSA9IDB4YWE7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfWkVST1M6CQkJUmVnVmFsdWUgPSAweDAwOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX09ORVM6CQkJUmVnVmFsdWUgPSAweGZmOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX0FMVF9NQVJLX1NQQUNFOglSZWdWYWx1ZSA9IDB4YWE7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfU1BBQ0U6CQkJUmVnVmFsdWUgPSAweDAwOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX01BUks6CQkJUmVnVmFsdWUgPSAweGZmOyBicmVhazsKKwl9CisKKwl3cml0ZV9yZWcoaW5mbywgSURMLCBSZWdWYWx1ZSk7Cit9CisKKy8qIFF1ZXJ5IHRoZSBhZGFwdGVyIGZvciB0aGUgc3RhdGUgb2YgdGhlIFYyNCBzdGF0dXMgKGlucHV0KSBzaWduYWxzLgorICovCit2b2lkIGdldF9zaWduYWxzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1MTYgc3RhdHVzID0gcmVhZF9yZWcoaW5mbywgU1IzKTsKKwl1MTYgZ3BzdGF0dXMgPSByZWFkX3N0YXR1c19yZWcoaW5mbyk7CisJdTE2IHRlc3RiaXQ7CisKKwkvKiBjbGVhciBhbGwgc2VyaWFsIHNpZ25hbHMgZXhjZXB0IERUUiBhbmQgUlRTICovCisJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFM7CisKKwkvKiBzZXQgc2VyaWFsIHNpZ25hbCBiaXRzIHRvIHJlZmxlY3QgTUlTUiAqLworCisJaWYgKCEoc3RhdHVzICYgQklUMykpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9DVFM7CisKKwlpZiAoICEoc3RhdHVzICYgQklUMikpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EQ0Q7CisKKwl0ZXN0Yml0ID0gQklUMSA8PCAoaW5mby0+cG9ydF9udW0gKiAyKTsgLy8gUG9ydCAwLi4zIFJJIGlzIEdQREFUQTwxLDMsNSw3PgorCWlmICghKGdwc3RhdHVzICYgdGVzdGJpdCkpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SSTsKKworCXRlc3RiaXQgPSBCSVQwIDw8IChpbmZvLT5wb3J0X251bSAqIDIpOyAvLyBQb3J0IDAuLjMgRFNSIGlzIEdQREFUQTwwLDIsNCw2PgorCWlmICghKGdwc3RhdHVzICYgdGVzdGJpdCkpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EU1I7Cit9CisKKy8qIFNldCB0aGUgc3RhdGUgb2YgRFRSIGFuZCBSVFMgYmFzZWQgb24gY29udGVudHMgb2YKKyAqIHNlcmlhbF9zaWduYWxzIG1lbWJlciBvZiBkZXZpY2UgY29udGV4dC4KKyAqLwordm9pZCBzZXRfc2lnbmFscyhTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBSZWdWYWx1ZTsKKwl1MTYgRW5hYmxlQml0OworCisJUmVnVmFsdWUgPSByZWFkX3JlZyhpbmZvLCBDVEwpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCVJlZ1ZhbHVlICY9IH5CSVQwOworCWVsc2UKKwkJUmVnVmFsdWUgfD0gQklUMDsKKwl3cml0ZV9yZWcoaW5mbywgQ1RMLCBSZWdWYWx1ZSk7CisKKwkvLyBQb3J0IDAuLjMgRFRSIGlzIGN0cmwgcmVnIDwxLDMsNSw3PgorCUVuYWJsZUJpdCA9IEJJVDEgPDwgKGluZm8tPnBvcnRfbnVtKjIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpCisJCWluZm8tPnBvcnRfYXJyYXlbMF0tPmN0cmxyZWdfdmFsdWUgJj0gfkVuYWJsZUJpdDsKKwllbHNlCisJCWluZm8tPnBvcnRfYXJyYXlbMF0tPmN0cmxyZWdfdmFsdWUgfD0gRW5hYmxlQml0OworCXdyaXRlX2NvbnRyb2xfcmVnKGluZm8pOworfQorCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQSBCdWZmZXIgQ29kZSAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKy8qIFNldCB0aGUgY291bnQgZm9yIGFsbCByZWNlaXZlIGJ1ZmZlcnMgdG8gU0NBQlVGU0laRQorICogYW5kIHNldCB0aGUgY3VycmVudCBidWZmZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlci4gVGhpcyBlZmZlY3RpdmVseQorICogbWFrZXMgYWxsIGJ1ZmZlcnMgZnJlZSBhbmQgZGlzY2FyZHMgYW55IGRhdGEgaW4gYnVmZmVycy4KKyAqLwordm9pZCByeF9yZXNldF9idWZmZXJzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlyeF9mcmVlX2ZyYW1lX2J1ZmZlcnMoaW5mbywgMCwgaW5mby0+cnhfYnVmX2NvdW50IC0gMSk7Cit9CisKKy8qIEZyZWUgdGhlIGJ1ZmZlcnMgdXNlZCBieSBhIHJlY2VpdmVkIGZyYW1lCisgKgorICogaW5mbyAgIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIGZpcnN0ICBpbmRleCBvZiAxc3QgcmVjZWl2ZSBidWZmZXIgb2YgZnJhbWUKKyAqIGxhc3QgICBpbmRleCBvZiBsYXN0IHJlY2VpdmUgYnVmZmVyIG9mIGZyYW1lCisgKi8KK3ZvaWQgcnhfZnJlZV9mcmFtZV9idWZmZXJzKFNMTVBfSU5GTyAqaW5mbywgdW5zaWduZWQgaW50IGZpcnN0LCB1bnNpZ25lZCBpbnQgbGFzdCkKK3sKKwlpbnQgZG9uZSA9IDA7CisKKwl3aGlsZSghZG9uZSkgeworCSAgICAgICAgLyogcmVzZXQgY3VycmVudCBidWZmZXIgZm9yIHJldXNlICovCisJCWluZm8tPnJ4X2J1Zl9saXN0W2ZpcnN0XS5zdGF0dXMgPSAweGZmOworCisJICAgICAgICBpZiAoZmlyc3QgPT0gbGFzdCkgeworCSAgICAgICAgICAgICAgICBkb25lID0gMTsKKwkgICAgICAgICAgICAgICAgLyogc2V0IG5ldyBsYXN0IHJ4IGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQkJd3JpdGVfcmVnMTYoaW5mbywgUlhETUEgKyBFREEsIGluZm8tPnJ4X2J1Zl9saXN0X2V4W2ZpcnN0XS5waHlzX2VudHJ5KTsKKwkgICAgICAgIH0KKworCSAgICAgICAgZmlyc3QrKzsKKwkJaWYgKGZpcnN0ID09IGluZm8tPnJ4X2J1Zl9jb3VudCkKKwkJCWZpcnN0ID0gMDsKKwl9CisKKwkvKiBzZXQgY3VycmVudCBidWZmZXIgdG8gbmV4dCBidWZmZXIgYWZ0ZXIgbGFzdCBidWZmZXIgb2YgZnJhbWUgKi8KKwlpbmZvLT5jdXJyZW50X3J4X2J1ZiA9IGZpcnN0OworfQorCisvKiBSZXR1cm4gYSByZWNlaXZlZCBmcmFtZSBmcm9tIHRoZSByZWNlaXZlIERNQSBidWZmZXJzLgorICogT25seSBmcmFtZXMgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgYXJlIHJldHVybmVkLgorICoKKyAqIFJldHVybiBWYWx1ZToJMSBpZiBmcmFtZSByZXR1cm5lZCwgb3RoZXJ3aXNlIDAKKyAqLworaW50IHJ4X2dldF9mcmFtZShTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IFN0YXJ0SW5kZXgsIEVuZEluZGV4OwkvKiBpbmRleCBvZiAxc3QgYW5kIGxhc3QgYnVmZmVycyBvZiBSeCBmcmFtZSAqLworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzaXplID0gMDsKKwlpbnQgUmV0dXJuQ29kZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCXVuc2lnbmVkIGNoYXIgYWRkcl9maWVsZCA9IDB4ZmY7CisgICAJU0NBREVTQyAqZGVzYzsKKwlTQ0FERVNDX0VYICpkZXNjX2V4OworCitDaGVja0FnYWluOgorCS8qIGFzc3VtZSBubyBmcmFtZSByZXR1cm5lZCwgc2V0IHplcm8gbGVuZ3RoICovCisJZnJhbWVzaXplID0gMDsKKwlhZGRyX2ZpZWxkID0gMHhmZjsKKworCS8qCisJICogY3VycmVudF9yeF9idWYgcG9pbnRzIHRvIHRoZSAxc3QgYnVmZmVyIG9mIHRoZSBuZXh0IGF2YWlsYWJsZQorCSAqIHJlY2VpdmUgZnJhbWUuIFRvIGZpbmQgdGhlIGxhc3QgYnVmZmVyIG9mIHRoZSBmcmFtZSBsb29rIGZvcgorCSAqIGEgbm9uLXplcm8gc3RhdHVzIGZpZWxkIGluIHRoZSBidWZmZXIgZW50cmllcy4gKFRoZSBzdGF0dXMKKwkgKiBmaWVsZCBpcyBzZXQgYnkgdGhlIDE2QzMyIGFmdGVyIGNvbXBsZXRpbmcgYSByZWNlaXZlIGZyYW1lLgorCSAqLworCVN0YXJ0SW5kZXggPSBFbmRJbmRleCA9IGluZm8tPmN1cnJlbnRfcnhfYnVmOworCisJZm9yICggOzsgKSB7CisJCWRlc2MgPSAmaW5mby0+cnhfYnVmX2xpc3RbRW5kSW5kZXhdOworCQlkZXNjX2V4ID0gJmluZm8tPnJ4X2J1Zl9saXN0X2V4W0VuZEluZGV4XTsKKworCQlpZiAoZGVzYy0+c3RhdHVzID09IDB4ZmYpCisJCQlnb3RvIENsZWFudXA7CS8qIGN1cnJlbnQgZGVzYyBzdGlsbCBpbiB1c2UsIG5vIGZyYW1lcyBhdmFpbGFibGUgKi8KKworCQlpZiAoZnJhbWVzaXplID09IDAgJiYgaW5mby0+cGFyYW1zLmFkZHJfZmlsdGVyICE9IDB4ZmYpCisJCQlhZGRyX2ZpZWxkID0gZGVzY19leC0+dmlydF9hZGRyWzBdOworCisJCWZyYW1lc2l6ZSArPSBkZXNjLT5sZW5ndGg7CisKKwkJLyogU3RhdHVzICE9IDAgbWVhbnMgbGFzdCBidWZmZXIgb2YgZnJhbWUgKi8KKwkJaWYgKGRlc2MtPnN0YXR1cykKKwkJCWJyZWFrOworCisJCUVuZEluZGV4Kys7CisJCWlmIChFbmRJbmRleCA9PSBpbmZvLT5yeF9idWZfY291bnQpCisJCQlFbmRJbmRleCA9IDA7CisKKwkJaWYgKEVuZEluZGV4ID09IGluZm8tPmN1cnJlbnRfcnhfYnVmKSB7CisJCQkvKiBhbGwgYnVmZmVycyBoYXZlIGJlZW4gJ3VzZWQnIGJ1dCBub25lIG1hcmsJICAgKi8KKwkJCS8qIHRoZSBlbmQgb2YgYSBmcmFtZS4gUmVzZXQgYnVmZmVycyBhbmQgcmVjZWl2ZXIuICovCisJCQlpZiAoIGluZm8tPnJ4X2VuYWJsZWQgKXsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCQkJcnhfc3RhcnQoaW5mbyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCQl9CisJCQlnb3RvIENsZWFudXA7CisJCX0KKworCX0KKworCS8qIGNoZWNrIHN0YXR1cyBvZiByZWNlaXZlIGZyYW1lICovCisKKwkvKiBmcmFtZSBzdGF0dXMgaXMgYnl0ZSBzdG9yZWQgYWZ0ZXIgZnJhbWUgZGF0YQorCSAqCisJICogNyBFT00gKGVuZCBvZiBtc2cpLCAxID0gbGFzdCBidWZmZXIgb2YgZnJhbWUKKwkgKiA2IFNob3J0IEZyYW1lLCAxID0gc2hvcnQgZnJhbWUKKwkgKiA1IEFib3J0LCAxID0gZnJhbWUgYWJvcnRlZAorCSAqIDQgUmVzaWR1ZSwgMSA9IGxhc3QgYnl0ZSBpcyBwYXJ0aWFsCisJICogMyBPdmVycnVuLCAxID0gb3ZlcnJ1biBvY2N1cnJlZCBkdXJpbmcgZnJhbWUgcmVjZXB0aW9uCisJICogMiBDUkMsICAgICAxID0gQ1JDIGVycm9yIGRldGVjdGVkCisJICoKKwkgKi8KKwlzdGF0dXMgPSBkZXNjLT5zdGF0dXM7CisKKwkvKiBpZ25vcmUgQ1JDIGJpdCBpZiBub3QgdXNpbmcgQ1JDIChiaXQgaXMgdW5kZWZpbmVkKSAqLworCS8qIE5vdGU6Q1JDIGlzIG5vdCBzYXZlIHRvIGRhdGEgYnVmZmVyICovCisJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ19OT05FKQorCQlzdGF0dXMgJj0gfkJJVDI7CisKKwlpZiAoZnJhbWVzaXplID09IDAgfHwKKwkJIChhZGRyX2ZpZWxkICE9IDB4ZmYgJiYgYWRkcl9maWVsZCAhPSBpbmZvLT5wYXJhbXMuYWRkcl9maWx0ZXIpKSB7CisJCS8qIGRpc2NhcmQgMCBieXRlIGZyYW1lcywgdGhpcyBzZWVtcyB0byBvY2N1ciBzb21ldGltZQorCQkgKiB3aGVuIHJlbW90ZSBpcyBpZGxpbmcgZmxhZ3MuCisJCSAqLworCQlyeF9mcmVlX2ZyYW1lX2J1ZmZlcnMoaW5mbywgU3RhcnRJbmRleCwgRW5kSW5kZXgpOworCQlnb3RvIENoZWNrQWdhaW47CisJfQorCisJaWYgKGZyYW1lc2l6ZSA8IDIpCisJCXN0YXR1cyB8PSBCSVQ2OworCisJaWYgKHN0YXR1cyAmIChCSVQ2K0JJVDUrQklUMytCSVQyKSkgeworCQkvKiByZWNlaXZlZCBmcmFtZSBoYXMgZXJyb3JzLAorCQkgKiB1cGRhdGUgY291bnRzIGFuZCBtYXJrIGZyYW1lIHNpemUgYXMgMAorCQkgKi8KKwkJaWYgKHN0YXR1cyAmIEJJVDYpCisJCQlpbmZvLT5pY291bnQucnhzaG9ydCsrOworCQllbHNlIGlmIChzdGF0dXMgJiBCSVQ1KQorCQkJaW5mby0+aWNvdW50LnJ4YWJvcnQrKzsKKwkJZWxzZSBpZiAoc3RhdHVzICYgQklUMykKKwkJCWluZm8tPmljb3VudC5yeG92ZXIrKzsKKwkJZWxzZQorCQkJaW5mby0+aWNvdW50LnJ4Y3JjKys7CisKKwkJZnJhbWVzaXplID0gMDsKKyNpZmRlZiBDT05GSUdfSERMQworCQl7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJCX0KKyNlbmRpZgorCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoIiVzKCVkKTolcyByeF9nZXRfZnJhbWUoKSBzdGF0dXM9JTA0WCBzaXplPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzLGZyYW1lc2l6ZSk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEgKQorCQl0cmFjZV9ibG9jayhpbmZvLGluZm8tPnJ4X2J1Zl9saXN0X2V4W1N0YXJ0SW5kZXhdLnZpcnRfYWRkciwKKwkJCW1pbl90KGludCwgZnJhbWVzaXplLFNDQUJVRlNJWkUpLDApOworCisJaWYgKGZyYW1lc2l6ZSkgeworCQlpZiAoZnJhbWVzaXplID4gaW5mby0+bWF4X2ZyYW1lX3NpemUpCisJCQlpbmZvLT5pY291bnQucnhsb25nKys7CisJCWVsc2UgeworCQkJLyogY29weSBkbWEgYnVmZmVyKHMpIHRvIGNvbnRpZ3VvdXMgaW50ZXJtZWRpYXRlIGJ1ZmZlciAqLworCQkJaW50IGNvcHlfY291bnQgPSBmcmFtZXNpemU7CisJCQlpbnQgaW5kZXggPSBTdGFydEluZGV4OworCQkJdW5zaWduZWQgY2hhciAqcHRtcCA9IGluZm8tPnRtcF9yeF9idWY7CisJCQlpbmZvLT50bXBfcnhfYnVmX2NvdW50ID0gZnJhbWVzaXplOworCisJCQlpbmZvLT5pY291bnQucnhvaysrOworCisJCQl3aGlsZShjb3B5X2NvdW50KSB7CisJCQkJaW50IHBhcnRpYWxfY291bnQgPSBtaW4oY29weV9jb3VudCxTQ0FCVUZTSVpFKTsKKwkJCQltZW1jcHkoIHB0bXAsCisJCQkJCWluZm8tPnJ4X2J1Zl9saXN0X2V4W2luZGV4XS52aXJ0X2FkZHIsCisJCQkJCXBhcnRpYWxfY291bnQgKTsKKwkJCQlwdG1wICs9IHBhcnRpYWxfY291bnQ7CisJCQkJY29weV9jb3VudCAtPSBwYXJ0aWFsX2NvdW50OworCisJCQkJaWYgKCArK2luZGV4ID09IGluZm8tPnJ4X2J1Zl9jb3VudCApCisJCQkJCWluZGV4ID0gMDsKKwkJCX0KKworI2lmZGVmIENPTkZJR19IRExDCisJCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQkJaGRsY2Rldl9yeChpbmZvLGluZm8tPnRtcF9yeF9idWYsZnJhbWVzaXplKTsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWxkaXNjX3JlY2VpdmVfYnVmKHR0eSxpbmZvLT50bXBfcnhfYnVmLAorCQkJCQkJICBpbmZvLT5mbGFnX2J1ZiwgZnJhbWVzaXplKTsKKwkJfQorCX0KKwkvKiBGcmVlIHRoZSBidWZmZXJzIHVzZWQgYnkgdGhpcyBmcmFtZS4gKi8KKwlyeF9mcmVlX2ZyYW1lX2J1ZmZlcnMoIGluZm8sIFN0YXJ0SW5kZXgsIEVuZEluZGV4ICk7CisKKwlSZXR1cm5Db2RlID0gMTsKKworQ2xlYW51cDoKKwlpZiAoIGluZm8tPnJ4X2VuYWJsZWQgJiYgaW5mby0+cnhfb3ZlcmZsb3cgKSB7CisJCS8qIFJlY2VpdmVyIGlzIGVuYWJsZWQsIGJ1dCBuZWVkcyB0byByZXN0YXJ0ZWQgZHVlIHRvCisJCSAqIHJ4IGJ1ZmZlciBvdmVyZmxvdy4gSWYgYnVmZmVycyBhcmUgZW1wdHksIHJlc3RhcnQgcmVjZWl2ZXIuCisJCSAqLworCQlpZiAoaW5mby0+cnhfYnVmX2xpc3RbRW5kSW5kZXhdLnN0YXR1cyA9PSAweGZmKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCQlyeF9zdGFydChpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQl9CisJfQorCisJcmV0dXJuIFJldHVybkNvZGU7Cit9CisKKy8qIGxvYWQgdGhlIHRyYW5zbWl0IERNQSBidWZmZXIgd2l0aCBkYXRhCisgKi8KK3ZvaWQgdHhfbG9hZF9kbWFfYnVmZmVyKFNMTVBfSU5GTyAqaW5mbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgc2hvcnQgY29weV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJU0NBREVTQyAqZGVzYzsKKwlTQ0FERVNDX0VYICpkZXNjX2V4OworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9EQVRBICkKKwkJdHJhY2VfYmxvY2soaW5mbyxidWYsIG1pbl90KGludCwgY291bnQsU0NBQlVGU0laRSksIDEpOworCisJLyogQ29weSBzb3VyY2UgYnVmZmVyIHRvIG9uZSBvciBtb3JlIERNQSBidWZmZXJzLCBzdGFydGluZyB3aXRoCisJICogdGhlIGZpcnN0IHRyYW5zbWl0IGRtYSBidWZmZXIuCisJICovCisJZm9yKGk9MDs7KQorCXsKKwkJY29weV9jb3VudCA9IG1pbl90KHVuc2lnbmVkIHNob3J0LGNvdW50LFNDQUJVRlNJWkUpOworCisJCWRlc2MgPSAmaW5mby0+dHhfYnVmX2xpc3RbaV07CisJCWRlc2NfZXggPSAmaW5mby0+dHhfYnVmX2xpc3RfZXhbaV07CisKKwkJbG9hZF9wY2lfbWVtb3J5KGluZm8sIGRlc2NfZXgtPnZpcnRfYWRkcixidWYsY29weV9jb3VudCk7CisKKwkJZGVzYy0+bGVuZ3RoID0gY29weV9jb3VudDsKKwkJZGVzYy0+c3RhdHVzID0gMDsKKworCQlidWYgKz0gY29weV9jb3VudDsKKwkJY291bnQgLT0gY29weV9jb3VudDsKKworCQlpZiAoIWNvdW50KQorCQkJYnJlYWs7CisKKwkJaSsrOworCQlpZiAoaSA+PSBpbmZvLT50eF9idWZfY291bnQpCisJCQlpID0gMDsKKwl9CisKKwlpbmZvLT50eF9idWZfbGlzdFtpXS5zdGF0dXMgPSAweDgxOwkvKiBzZXQgRU9NIGFuZCBFT1Qgc3RhdHVzICovCisJaW5mby0+bGFzdF90eF9idWYgPSArK2k7Cit9CisKK2ludCByZWdpc3Rlcl90ZXN0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB0ZXN0dmFsW10gPSB7MHgwMCwgMHhmZiwgMHhhYSwgMHg1NSwgMHg2OSwgMHg5Nn07CisJc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IHNpemVvZih0ZXN0dmFsKS9zaXplb2YodW5zaWduZWQgY2hhcik7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjID0gVFJVRTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJlc2V0X3BvcnQoaW5mbyk7CisKKwkvKiBhc3N1bWUgZmFpbHVyZSAqLworCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NGYWlsdXJlOworCisJLyogV3JpdGUgYml0IHBhdHRlcm5zIHRvIHZhcmlvdXMgcmVnaXN0ZXJzIGJ1dCBkbyBpdCBvdXQgb2YgKi8KKwkvKiBzeW5jLCB0aGVuIHJlYWQgYmFjayBhbmQgdmVyaWZ5IHZhbHVlcy4gKi8KKworCWZvciAoaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKKwkJd3JpdGVfcmVnKGluZm8sIFRNQywgdGVzdHZhbFtpXSk7CisJCXdyaXRlX3JlZyhpbmZvLCBJREwsIHRlc3R2YWxbKGkrMSklY291bnRdKTsKKwkJd3JpdGVfcmVnKGluZm8sIFNBMCwgdGVzdHZhbFsoaSsyKSVjb3VudF0pOworCQl3cml0ZV9yZWcoaW5mbywgU0ExLCB0ZXN0dmFsWyhpKzMpJWNvdW50XSk7CisKKwkJaWYgKCAocmVhZF9yZWcoaW5mbywgVE1DKSAhPSB0ZXN0dmFsW2ldKSB8fAorCQkJICAocmVhZF9yZWcoaW5mbywgSURMKSAhPSB0ZXN0dmFsWyhpKzEpJWNvdW50XSkgfHwKKwkJCSAgKHJlYWRfcmVnKGluZm8sIFNBMCkgIT0gdGVzdHZhbFsoaSsyKSVjb3VudF0pIHx8CisJCQkgIChyZWFkX3JlZyhpbmZvLCBTQTEpICE9IHRlc3R2YWxbKGkrMyklY291bnRdKSApCisJCXsKKwkJCXJjID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlc2V0X3BvcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBpcnFfdGVzdChTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl1bnNpZ25lZCBjaGFyIHRpbWVyID0gKGluZm8tPnBvcnRfbnVtICYgMSkgPyBUSU1FUjIgOiBUSU1FUjA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfcG9ydChpbmZvKTsKKworCS8qIGFzc3VtZSBmYWlsdXJlICovCisJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfSXJxRmFpbHVyZTsKKwlpbmZvLT5pcnFfb2NjdXJyZWQgPSBGQUxTRTsKKworCS8qIHNldHVwIHRpbWVyMCBvbiBTQ0EwIHRvIGludGVycnVwdCAqLworCisJLyogSUVSMjw3Li40PiA9IHRpbWVyPDMuLjA+IGludGVycnVwdCBlbmFibGVzICgxPWVuYWJsZWQpICovCisJd3JpdGVfcmVnKGluZm8sIElFUjIsICh1bnNpZ25lZCBjaGFyKSgoaW5mby0+cG9ydF9udW0gJiAxKSA/IEJJVDYgOiBCSVQ0KSk7CisKKwl3cml0ZV9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpKHRpbWVyICsgVEVQUiksIDApOwkvKiB0aW1lciBleHBhbmQgcHJlc2NhbGUgKi8KKwl3cml0ZV9yZWcxNihpbmZvLCAodW5zaWduZWQgY2hhcikodGltZXIgKyBUQ09OUiksIDEpOwkvKiB0aW1lciBjb25zdGFudCAqLworCisKKwkvKiBUTUNTLCBUaW1lciBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgorCSAqCisJICogMDcgICAgICBDTUYsIENvbXBhcmUgbWF0Y2ggZmxhZyAocmVhZCBvbmx5KSAxPW1hdGNoCisJICogMDYgICAgICBFQ01JLCBDTUYgSW50ZXJydXB0IEVuYWJsZTogMT1lbmFibGVkCisJICogMDUgICAgICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDQgICAgICBUTUUsIFRpbWVyIEVuYWJsZQorCSAqIDAzLi4wMCAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqCisJICogMDEwMSAwMDAwCisJICovCisJd3JpdGVfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSh0aW1lciArIFRNQ1MpLCAweDUwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJdGltZW91dD0xMDA7CisJd2hpbGUoIHRpbWVvdXQtLSAmJiAhaW5mby0+aXJxX29jY3VycmVkICkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJlc2V0X3BvcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gaW5mby0+aXJxX29jY3VycmVkOworfQorCisvKiBpbml0aWFsaXplIGluZGl2aWR1YWwgU0NBIGRldmljZSAoMiBwb3J0cykKKyAqLworc3RhdGljIGludCBzY2FfaW5pdChTTE1QX0lORk8gKmluZm8pCit7CisJLyogc2V0IHdhaXQgY29udHJvbGxlciB0byBzaW5nbGUgbWVtIHBhcnRpdGlvbiAobG93KSwgbm8gd2FpdCBzdGF0ZXMgKi8KKwl3cml0ZV9yZWcoaW5mbywgUEFCUjAsIDApOwkvKiB3YWl0IGNvbnRyb2xsZXIgYWRkciBib3VuZGFyeSAwICovCisJd3JpdGVfcmVnKGluZm8sIFBBQlIxLCAwKTsJLyogd2FpdCBjb250cm9sbGVyIGFkZHIgYm91bmRhcnkgMSAqLworCXdyaXRlX3JlZyhpbmZvLCBXQ1JMLCAwKTsJLyogd2FpdCBjb250cm9sbGVyIGxvdyByYW5nZSAqLworCXdyaXRlX3JlZyhpbmZvLCBXQ1JNLCAwKTsJLyogd2FpdCBjb250cm9sbGVyIG1pZCByYW5nZSAqLworCXdyaXRlX3JlZyhpbmZvLCBXQ1JILCAwKTsJLyogd2FpdCBjb250cm9sbGVyIGhpZ2ggcmFuZ2UgKi8KKworCS8qIERQQ1IsIERNQSBQcmlvcml0eSBDb250cm9sCisJICoKKwkgKiAwNy4uMDUgIE5vdCB1c2VkLCBtdXN0IGJlIDAKKwkgKiAwNCAgICAgIEJSQywgYnVzIHJlbGVhc2UgY29uZGl0aW9uOiAwPWFsbCB0cmFuc2ZlcnMgY29tcGxldGUKKwkgKiAwMyAgICAgIENDQywgY2hhbm5lbCBjaGFuZ2UgY29uZGl0aW9uOiAwPWV2ZXJ5IGN5Y2xlCisJICogMDIuLjAwICBQUjwyLi4wPiwgcHJpb3JpdHkgMTAwPXJvdW5kIHJvYmluCisJICoKKwkgKiAwMDAwMDEwMCA9IDB4MDQKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgRFBDUiwgZG1hX3ByaW9yaXR5KTsKKworCS8qIERNQSBNYXN0ZXIgRW5hYmxlLCBCSVQ3OiAxPWVuYWJsZSBhbGwgY2hhbm5lbHMgKi8KKwl3cml0ZV9yZWcoaW5mbywgRE1FUiwgMHg4MCk7CisKKwkvKiBlbmFibGUgYWxsIGludGVycnVwdCBjbGFzc2VzICovCisJd3JpdGVfcmVnKGluZm8sIElFUjAsIDB4ZmYpOwkvKiBUeFJEWSxSeFJEWSxUeElOVCxSeElOVCAocG9ydHMgMC0xKSAqLworCXdyaXRlX3JlZyhpbmZvLCBJRVIxLCAweGZmKTsJLyogRE1JQixETUlBIChjaGFubmVscyAwLTMpICovCisJd3JpdGVfcmVnKGluZm8sIElFUjIsIDB4ZjApOwkvKiBUSVJRICh0aW1lcnMgMC0zKSAqLworCisJLyogSVRDUiwgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIKKwkgKiAwNyAgICAgIElQQywgaW50ZXJydXB0IHByaW9yaXR5LCAwPU1TQ0ktPkRNQQorCSAqIDA2Li4wNSAgSUFLPDEuLjA+LCBBY2tub3dsZWRnZSBjeWNsZSwgMDA9bm9uLWFjayBjeWNsZQorCSAqIDA0ICAgICAgVk9TLCBWZWN0b3IgT3V0cHV0LCAwPXVubW9kaWZpZWQgdmVjdG9yCisJICogMDMuLjAwICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICovCisJd3JpdGVfcmVnKGluZm8sIElUQ1IsIDApOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemUgYWRhcHRlciBoYXJkd2FyZQorICovCitpbnQgaW5pdF9hZGFwdGVyKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbnQgaTsKKworCS8qIFNldCBCSVQzMCBvZiBMb2NhbCBDb250cm9sIFJlZyAweDUwIHRvIHJlc2V0IFNDQSAqLworCXZvbGF0aWxlIHUzMiAqTWlzY0N0cmwgPSAodTMyICopKGluZm8tPmxjcl9iYXNlICsgMHg1MCk7CisJdTMyIHJlYWR2YWw7CisKKwlpbmZvLT5taXNjX2N0cmxfdmFsdWUgfD0gQklUMzA7CisJKk1pc2NDdHJsID0gaW5mby0+bWlzY19jdHJsX3ZhbHVlOworCisJLyoKKwkgKiBGb3JjZSBhdCBsZWFzdCAxNzBucyBkZWxheSBiZWZvcmUgY2xlYXJpbmcKKwkgKiByZXNldCBiaXQuIEVhY2ggcmVhZCBmcm9tIExDUiB0YWtlcyBhdCBsZWFzdAorCSAqIDMwbnMgc28gMTAgdGltZXMgZm9yIDMwMG5zIHRvIGJlIHNhZmUuCisJICovCisJZm9yKGk9MDtpPDEwO2krKykKKwkJcmVhZHZhbCA9ICpNaXNjQ3RybDsKKworCWluZm8tPm1pc2NfY3RybF92YWx1ZSAmPSB+QklUMzA7CisJKk1pc2NDdHJsID0gaW5mby0+bWlzY19jdHJsX3ZhbHVlOworCisJLyogaW5pdCBjb250cm9sIHJlZyAoYWxsIERUUnMgb2ZmLCBhbGwgY2xrc2VsPWlucHV0KSAqLworCWluZm8tPmN0cmxyZWdfdmFsdWUgPSAweGFhOworCXdyaXRlX2NvbnRyb2xfcmVnKGluZm8pOworCisJeworCQl2b2xhdGlsZSB1MzIgKkxDUjFCUkRSID0gKHUzMiAqKShpbmZvLT5sY3JfYmFzZSArIDB4MmMpOworCQlsY3IxX2JyZHJfdmFsdWUgJj0gfihCSVQ1ICsgQklUNCArIEJJVDMpOworCisJCXN3aXRjaChyZWFkX2FoZWFkX2NvdW50KQorCQl7CisJCWNhc2UgMTY6CisJCQlsY3IxX2JyZHJfdmFsdWUgfD0gQklUNSArIEJJVDQgKyBCSVQzOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWxjcjFfYnJkcl92YWx1ZSB8PSBCSVQ1ICsgQklUNDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlsY3IxX2JyZHJfdmFsdWUgfD0gQklUNSArIEJJVDM7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJbGNyMV9icmRyX3ZhbHVlIHw9IEJJVDU7CisJCQlicmVhazsKKwkJfQorCisJCSpMQ1IxQlJEUiA9IGxjcjFfYnJkcl92YWx1ZTsKKwkJKk1pc2NDdHJsID0gbWlzY19jdHJsX3ZhbHVlOworCX0KKworCXNjYV9pbml0KGluZm8tPnBvcnRfYXJyYXlbMF0pOworCXNjYV9pbml0KGluZm8tPnBvcnRfYXJyYXlbMl0pOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIExvb3BiYWNrIGFuIEhETEMgZnJhbWUgdG8gdGVzdCB0aGUgaGFyZHdhcmUKKyAqIGludGVycnVwdCBhbmQgRE1BIGZ1bmN0aW9ucy4KKyAqLworaW50IGxvb3BiYWNrX3Rlc3QoU0xNUF9JTkZPICppbmZvKQoreworI2RlZmluZSBURVNURlJBTUVTSVpFIDIwCisKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IGNvdW50ID0gVEVTVEZSQU1FU0laRTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltURVNURlJBTUVTSVpFXTsKKwlpbnQgcmMgPSBGQUxTRTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IHR0eV9zdHJ1Y3QgKm9sZHR0eSA9IGluZm8tPnR0eTsKKwl1MzIgc3BlZWQgPSBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQ7CisKKwlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSAzNjg2NDAwOworCWluZm8tPnR0eSA9IE5VTEw7CisKKwkvKiBhc3N1bWUgZmFpbHVyZSAqLworCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0RtYUZhaWx1cmU7CisKKwkvKiBidWlsZCBhbmQgc2VuZCB0cmFuc21pdCBmcmFtZSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFRFU1RGUkFNRVNJWkU7Kytjb3VudCkKKwkJYnVmW2NvdW50XSA9ICh1bnNpZ25lZCBjaGFyKWNvdW50OworCisJbWVtc2V0KGluZm8tPnRtcF9yeF9idWYsMCxURVNURlJBTUVTSVpFKTsKKworCS8qIHByb2dyYW0gaGFyZHdhcmUgZm9yIEhETEMgYW5kIGVuYWJsZWQgcmVjZWl2ZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaGRsY19tb2RlKGluZm8pOworCWVuYWJsZV9sb29wYmFjayhpbmZvLDEpOworICAgICAgIAlyeF9zdGFydChpbmZvKTsKKwlpbmZvLT50eF9jb3VudCA9IGNvdW50OworCXR4X2xvYWRfZG1hX2J1ZmZlcihpbmZvLGJ1Zixjb3VudCk7CisJdHhfc3RhcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkvKiB3YWl0IGZvciByZWNlaXZlIGNvbXBsZXRlICovCisJLyogU2V0IGEgdGltZW91dCBmb3Igd2FpdGluZyBmb3IgaW50ZXJydXB0LiAqLworCWZvciAoIHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQ7IC0tdGltZW91dCApIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCisJCWlmIChyeF9nZXRfZnJhbWUoaW5mbykpIHsKKwkJCXJjID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogdmVyaWZ5IHJlY2VpdmVkIGZyYW1lIGxlbmd0aCBhbmQgY29udGVudHMgKi8KKwlpZiAocmMgPT0gVFJVRSAmJgorCQkoIGluZm8tPnRtcF9yeF9idWZfY291bnQgIT0gY291bnQgfHwKKwkJICBtZW1jbXAoYnVmLCBpbmZvLT50bXBfcnhfYnVmLGNvdW50KSkpIHsKKwkJcmMgPSBGQUxTRTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfYWRhcHRlcihpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCA9IHNwZWVkOworCWluZm8tPnR0eSA9IG9sZHR0eTsKKworCXJldHVybiByYzsKK30KKworLyogUGVyZm9ybSBkaWFnbm9zdGljcyBvbiBoYXJkd2FyZQorICovCitpbnQgYWRhcHRlcl90ZXN0KCBTTE1QX0lORk8gKmluZm8gKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOlRlc3RpbmcgZGV2aWNlICVzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpbml0X2FkYXB0ZXIoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlpbmZvLT5wb3J0X2FycmF5WzBdLT5wb3J0X2NvdW50ID0gMDsKKworCWlmICggcmVnaXN0ZXJfdGVzdChpbmZvLT5wb3J0X2FycmF5WzBdKSAmJgorCQlyZWdpc3Rlcl90ZXN0KGluZm8tPnBvcnRfYXJyYXlbMV0pKSB7CisKKwkJaW5mby0+cG9ydF9hcnJheVswXS0+cG9ydF9jb3VudCA9IDI7CisKKwkJaWYgKCByZWdpc3Rlcl90ZXN0KGluZm8tPnBvcnRfYXJyYXlbMl0pICYmCisJCQlyZWdpc3Rlcl90ZXN0KGluZm8tPnBvcnRfYXJyYXlbM10pICkKKwkJCWluZm8tPnBvcnRfYXJyYXlbMF0tPnBvcnRfY291bnQgKz0gMjsKKwl9CisJZWxzZSB7CisJCXByaW50ayggIiVzKCVkKTpSZWdpc3RlciB0ZXN0IGZhaWx1cmUgZm9yIGRldmljZSAlcyBBZGRyPSUwOGxYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsICh1bnNpZ25lZCBsb25nKShpbmZvLT5waHlzX3NjYV9iYXNlKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICggIWlycV90ZXN0KGluZm8tPnBvcnRfYXJyYXlbMF0pIHx8CisJCSFpcnFfdGVzdChpbmZvLT5wb3J0X2FycmF5WzFdKSB8fAorCQkgKGluZm8tPnBvcnRfY291bnQgPT0gNCAmJiAhaXJxX3Rlc3QoaW5mby0+cG9ydF9hcnJheVsyXSkpIHx8CisJCSAoaW5mby0+cG9ydF9jb3VudCA9PSA0ICYmICFpcnFfdGVzdChpbmZvLT5wb3J0X2FycmF5WzNdKSkpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOkludGVycnVwdCB0ZXN0IGZhaWx1cmUgZm9yIGRldmljZSAlcyBJUlE9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5pcnFfbGV2ZWwpICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghbG9vcGJhY2tfdGVzdChpbmZvLT5wb3J0X2FycmF5WzBdKSB8fAorCQkhbG9vcGJhY2tfdGVzdChpbmZvLT5wb3J0X2FycmF5WzFdKSB8fAorCQkgKGluZm8tPnBvcnRfY291bnQgPT0gNCAmJiAhbG9vcGJhY2tfdGVzdChpbmZvLT5wb3J0X2FycmF5WzJdKSkgfHwKKwkJIChpbmZvLT5wb3J0X2NvdW50ID09IDQgJiYgIWxvb3BiYWNrX3Rlc3QoaW5mby0+cG9ydF9hcnJheVszXSkpKSB7CisJCXByaW50ayggIiVzKCVkKTpETUEgdGVzdCBmYWlsdXJlIGZvciBkZXZpY2UgJXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTpkZXZpY2UgJXMgcGFzc2VkIGRpYWdub3N0aWNzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWluZm8tPnBvcnRfYXJyYXlbMF0tPmluaXRfZXJyb3IgPSAwOworCWluZm8tPnBvcnRfYXJyYXlbMV0tPmluaXRfZXJyb3IgPSAwOworCWlmICggaW5mby0+cG9ydF9jb3VudCA+IDIgKSB7CisJCWluZm8tPnBvcnRfYXJyYXlbMl0tPmluaXRfZXJyb3IgPSAwOworCQlpbmZvLT5wb3J0X2FycmF5WzNdLT5pbml0X2Vycm9yID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGVzdCB0aGUgc2hhcmVkIG1lbW9yeSBvbiBhIFBDSSBhZGFwdGVyLgorICovCitpbnQgbWVtb3J5X3Rlc3QoU0xNUF9JTkZPICppbmZvKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHRlc3R2YWxbXSA9IHsgMHgwLCAweDU1NTU1NTU1LCAweGFhYWFhYWFhLAorCQkweDY2NjY2NjY2LCAweDk5OTk5OTk5LCAweGZmZmZmZmZmLCAweDEyMzQ1Njc4IH07CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IHNpemVvZih0ZXN0dmFsKS9zaXplb2YodW5zaWduZWQgbG9uZyk7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgbGltaXQgPSBTQ0FfTUVNX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgKiBhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilpbmZvLT5tZW1vcnlfYmFzZTsKKworCS8qIFRlc3QgZGF0YSBsaW5lcyB3aXRoIHRlc3QgcGF0dGVybiBhdCBvbmUgbG9jYXRpb24uICovCisKKwlmb3IgKCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKyApIHsKKwkJKmFkZHIgPSB0ZXN0dmFsW2ldOworCQlpZiAoICphZGRyICE9IHRlc3R2YWxbaV0gKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIFRlc3QgYWRkcmVzcyBsaW5lcyB3aXRoIGluY3JlbWVudGluZyBwYXR0ZXJuIG92ZXIgKi8KKwkvKiBlbnRpcmUgYWRkcmVzcyByYW5nZS4gKi8KKworCWZvciAoIGkgPSAwIDsgaSA8IGxpbWl0IDsgaSsrICkgeworCQkqYWRkciA9IGkgKiA0OworCQlhZGRyKys7CisJfQorCisJYWRkciA9ICh1bnNpZ25lZCBsb25nICopaW5mby0+bWVtb3J5X2Jhc2U7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBsaW1pdCA7IGkrKyApIHsKKwkJaWYgKCAqYWRkciAhPSBpICogNCApCisJCQlyZXR1cm4gRkFMU0U7CisJCWFkZHIrKzsKKwl9CisKKwltZW1zZXQoIGluZm8tPm1lbW9yeV9iYXNlLCAwLCBTQ0FfTUVNX1NJWkUgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyogTG9hZCBkYXRhIGludG8gUENJIGFkYXB0ZXIgc2hhcmVkIG1lbW9yeS4KKyAqCisgKiBUaGUgUENJOTA1MCByZWxlYXNlcyBjb250cm9sIG9mIHRoZSBsb2NhbCBidXMKKyAqIGFmdGVyIGNvbXBsZXRpbmcgdGhlIGN1cnJlbnQgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24uCisgKgorICogV2hpbGUgdGhlIFBDSTkwNTAgd3JpdGUgRklGTyBub3QgZW1wdHksIHRoZQorICogUENJOTA1MCB0cmVhdHMgYWxsIG9mIHRoZSB3cml0ZXMgYXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24KKyAqIGFuZCBkb2VzIG5vdCByZWxlYXNlIHRoZSBidXMuIFRoaXMgY2F1c2VzIERNQSBsYXRlbmN5IHByb2JsZW1zCisgKiBhdCBoaWdoIHNwZWVkcyB3aGVuIGNvcHlpbmcgbGFyZ2UgZGF0YSBibG9ja3MgdG8gdGhlIHNoYXJlZCBtZW1vcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBicmVha3MgYSB3cml0ZSBpbnRvIG11bHRpcGxlIHRyYW5zYXRpb25zIGJ5CisgKiBpbnRlcmxlYXZpbmcgYSByZWFkIHdoaWNoIGZsdXNoZXMgdGhlIHdyaXRlIEZJRk8gYW5kICdjb21wbGV0ZXMnCisgKiB0aGUgd3JpdGUgdHJhbnNhdGlvbi4gVGhpcyBhbGxvd3MgYW55IHBlbmRpbmcgRE1BIHJlcXVlc3QgdG8gZ2FpbiBjb250cm9sCisgKiBvZiB0aGUgbG9jYWwgYnVzIGluIGEgdGltZWx5IGZhc2lvbi4KKyAqLwordm9pZCBsb2FkX3BjaV9tZW1vcnkoU0xNUF9JTkZPICppbmZvLCBjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHVuc2lnbmVkIHNob3J0IGNvdW50KQoreworCS8qIEEgbG9hZCBpbnRlcnZhbCBvZiAxNiBhbGxvd3MgZm9yIDQgMzItYml0IHdyaXRlcyBhdCAqLworCS8qIDEzNm5zIGVhY2ggZm9yIGEgbWF4aW11bSBsYXRlbmN5IG9mIDU0Mm5zIG9uIHRoZSBsb2NhbCBidXMuKi8KKworCXVuc2lnbmVkIHNob3J0IGludGVydmFsID0gY291bnQgLyBzY2FfcGNpX2xvYWRfaW50ZXJ2YWw7CisJdW5zaWduZWQgc2hvcnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGludGVydmFsIDsgaSsrICkKKwl7CisJCW1lbWNweShkZXN0LCBzcmMsIHNjYV9wY2lfbG9hZF9pbnRlcnZhbCk7CisJCXJlYWRfc3RhdHVzX3JlZyhpbmZvKTsKKwkJZGVzdCArPSBzY2FfcGNpX2xvYWRfaW50ZXJ2YWw7CisJCXNyYyArPSBzY2FfcGNpX2xvYWRfaW50ZXJ2YWw7CisJfQorCisJbWVtY3B5KGRlc3QsIHNyYywgY291bnQgJSBzY2FfcGNpX2xvYWRfaW50ZXJ2YWwpOworfQorCit2b2lkIHRyYWNlX2Jsb2NrKFNMTVBfSU5GTyAqaW5mbyxjb25zdCBjaGFyKiBkYXRhLCBpbnQgY291bnQsIGludCB4bWl0KQoreworCWludCBpOworCWludCBsaW5lY291bnQ7CisJaWYgKHhtaXQpCisJCXByaW50aygiJXMgdHggZGF0YTpcbiIsaW5mby0+ZGV2aWNlX25hbWUpOworCWVsc2UKKwkJcHJpbnRrKCIlcyByeCBkYXRhOlxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwl3aGlsZShjb3VudCkgeworCQlpZiAoY291bnQgPiAxNikKKwkJCWxpbmVjb3VudCA9IDE2OworCQllbHNlCisJCQlsaW5lY291bnQgPSBjb3VudDsKKworCQlmb3IoaT0wO2k8bGluZWNvdW50O2krKykKKwkJCXByaW50aygiJTAyWCAiLCh1bnNpZ25lZCBjaGFyKWRhdGFbaV0pOworCQlmb3IoO2k8MTc7aSsrKQorCQkJcHJpbnRrKCIgICAiKTsKKwkJZm9yKGk9MDtpPGxpbmVjb3VudDtpKyspIHsKKwkJCWlmIChkYXRhW2ldPj0wNDAgJiYgZGF0YVtpXTw9MDE3NikKKwkJCQlwcmludGsoIiVjIixkYXRhW2ldKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIi4iKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisKKwkJZGF0YSAgKz0gbGluZWNvdW50OworCQljb3VudCAtPSBsaW5lY291bnQ7CisJfQorfQkvKiBlbmQgb2YgdHJhY2VfYmxvY2soKSAqLworCisvKiBjYWxsZWQgd2hlbiBIRExDIGZyYW1lIHRpbWVzIG91dAorICogdXBkYXRlIHN0YXRzIGFuZCBkbyB0eCBjb21wbGV0aW9uIHByb2Nlc3NpbmcKKyAqLwordm9pZCB0eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPKiljb250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6JXMgdHhfdGltZW91dCgpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCWlmKGluZm8tPnR4X2FjdGl2ZSAmJiBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQlpbmZvLT5pY291bnQudHh0aW1lb3V0Kys7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpbmZvLT50eF9hY3RpdmUgPSAwOworCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlCisjZW5kaWYKKwkJYmhfdHJhbnNtaXQoaW5mbyk7Cit9CisKKy8qIGNhbGxlZCB0byBwZXJpb2RpY2FsbHkgY2hlY2sgdGhlIERTUi9SSSBtb2RlbSBzaWduYWwgaW5wdXQgc3RhdHVzCisgKi8KK3ZvaWQgc3RhdHVzX3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXUxNiBzdGF0dXMgPSAwOworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8qKWNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGRlbHRhOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkvKiBjaGVjayBmb3IgRFNSL1JJIHN0YXRlIGNoYW5nZSAqLworCisJZGVsdGEgPSBpbmZvLT5vbGRfc2lnbmFscyBeIGluZm8tPnNlcmlhbF9zaWduYWxzOworCWluZm8tPm9sZF9zaWduYWxzID0gaW5mby0+c2VyaWFsX3NpZ25hbHM7CisKKwlpZiAoZGVsdGEgJiBTZXJpYWxTaWduYWxfRFNSKQorCQlzdGF0dXMgfD0gTUlTQ1NUQVRVU19EU1JfTEFUQ0hFRHwoaW5mby0+c2VyaWFsX3NpZ25hbHMmU2VyaWFsU2lnbmFsX0RTUik7CisKKwlpZiAoZGVsdGEgJiBTZXJpYWxTaWduYWxfUkkpCisJCXN0YXR1cyB8PSBNSVNDU1RBVFVTX1JJX0xBVENIRUR8KGluZm8tPnNlcmlhbF9zaWduYWxzJlNlcmlhbFNpZ25hbF9SSSk7CisKKwlpZiAoZGVsdGEgJiBTZXJpYWxTaWduYWxfRENEKQorCQlzdGF0dXMgfD0gTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRHwoaW5mby0+c2VyaWFsX3NpZ25hbHMmU2VyaWFsU2lnbmFsX0RDRCk7CisKKwlpZiAoZGVsdGEgJiBTZXJpYWxTaWduYWxfQ1RTKQorCQlzdGF0dXMgfD0gTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRHwoaW5mby0+c2VyaWFsX3NpZ25hbHMmU2VyaWFsU2lnbmFsX0NUUyk7CisKKwlpZiAoc3RhdHVzKQorCQlpc3JfaW9fcGluKGluZm8sc3RhdHVzKTsKKworCWluZm8tPnN0YXR1c190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwlpbmZvLT5zdGF0dXNfdGltZXIuZnVuY3Rpb24gPSBzdGF0dXNfdGltZW91dDsKKwlpbmZvLT5zdGF0dXNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwlhZGRfdGltZXIoJmluZm8tPnN0YXR1c190aW1lcik7Cit9CisKKworLyogUmVnaXN0ZXIgQWNjZXNzIFJvdXRpbmVzIC0KKyAqIEFsbCByZWdpc3RlcnMgYXJlIG1lbW9yeSBtYXBwZWQKKyAqLworI2RlZmluZSBDQUxDX1JFR0FERFIoKSBcCisJdW5zaWduZWQgY2hhciAqIFJlZ0FkZHIgPSAodW5zaWduZWQgY2hhciopKGluZm8tPnNjYV9iYXNlICsgQWRkcik7IFwKKwlpZiAoaW5mby0+cG9ydF9udW0gPiAxKSBcCisJCVJlZ0FkZHIgKz0gMjU2OwkgICAgCQkvKiBwb3J0IDAtMSBTQ0EwLCAyLTMgU0NBMSAqLyBcCisJaWYgKCBpbmZvLT5wb3J0X251bSAmIDEpIHsgXAorCQlpZiAoQWRkciA+IDB4N2YpIFwKKwkJCVJlZ0FkZHIgKz0gMHg0MDsJLyogRE1BIGFjY2VzcyAqLyBcCisJCWVsc2UgaWYgKEFkZHIgPiAweDFmICYmIEFkZHIgPCAweDYwKSBcCisJCQlSZWdBZGRyICs9IDB4MjA7CS8qIE1TQ0kgYWNjZXNzICovIFwKKwl9CisKKwordW5zaWduZWQgY2hhciByZWFkX3JlZyhTTE1QX0lORk8gKiBpbmZvLCB1bnNpZ25lZCBjaGFyIEFkZHIpCit7CisJQ0FMQ19SRUdBRERSKCk7CisJcmV0dXJuICpSZWdBZGRyOworfQordm9pZCB3cml0ZV9yZWcoU0xNUF9JTkZPICogaW5mbywgdW5zaWduZWQgY2hhciBBZGRyLCB1bnNpZ25lZCBjaGFyIFZhbHVlKQoreworCUNBTENfUkVHQUREUigpOworCSpSZWdBZGRyID0gVmFsdWU7Cit9CisKK3UxNiByZWFkX3JlZzE2KFNMTVBfSU5GTyAqIGluZm8sIHVuc2lnbmVkIGNoYXIgQWRkcikKK3sKKwlDQUxDX1JFR0FERFIoKTsKKwlyZXR1cm4gKigodTE2ICopUmVnQWRkcik7Cit9CisKK3ZvaWQgd3JpdGVfcmVnMTYoU0xNUF9JTkZPICogaW5mbywgdW5zaWduZWQgY2hhciBBZGRyLCB1MTYgVmFsdWUpCit7CisJQ0FMQ19SRUdBRERSKCk7CisJKigodTE2ICopUmVnQWRkcikgPSBWYWx1ZTsKK30KKwordW5zaWduZWQgY2hhciByZWFkX3N0YXR1c19yZWcoU0xNUF9JTkZPICogaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyICpSZWdBZGRyID0gKHVuc2lnbmVkIGNoYXIgKilpbmZvLT5zdGF0Y3RybF9iYXNlOworCXJldHVybiAqUmVnQWRkcjsKK30KKwordm9pZCB3cml0ZV9jb250cm9sX3JlZyhTTE1QX0lORk8gKiBpbmZvKQoreworCXVuc2lnbmVkIGNoYXIgKlJlZ0FkZHIgPSAodW5zaWduZWQgY2hhciAqKWluZm8tPnN0YXRjdHJsX2Jhc2U7CisJKlJlZ0FkZHIgPSBpbmZvLT5wb3J0X2FycmF5WzBdLT5jdHJscmVnX3ZhbHVlOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN5bmNsaW5rbXBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgeworCQlwcmludGsoImVycm9yIGVuYWJsaW5nIHBjaSBkZXZpY2UgJXBcbiIsIGRldik7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZpY2VfaW5pdCggKytzeW5jbGlua21wX2FkYXB0ZXJfY291bnQsIGRldiApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3luY2xpbmttcF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5c3JxLmMgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTlmN2NiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKQEAgLTAsMCArMSw0MzIgQEAKKy8qIC0qLSBsaW51eC1jIC0qLQorICoKKyAqCSRJZDogc3lzcnEuYyx2IDEuMTUgMTk5OC8wOC8yMyAxNDo1Njo0MSBtaiBFeHAgJAorICoKKyAqCUxpbnV4IE1hZ2ljIFN5c3RlbSBSZXF1ZXN0IEtleSBIYWNrcworICoKKyAqCShjKSAxOTk3IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgorICoJYmFzZWQgb24gaWRlYXMgYnkgUGF2ZWwgTWFjaGVrIDxwYXZlbEBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+CisgKgorICoJKGMpIDIwMDAgQ3J1dGNoZXIgRHVubmF2YW50IDxjcnV0Y2hlcitrZXJuZWxAZGF0YXN0YWNrcy5jb20+CisgKglvdmVyaGF1bGVkIHRvIHVzZSBrZXkgcmVnaXN0cmF0aW9uCisgKgliYXNlZCB1cG9uIGRpc2N1c2lvbnMgaW4gaXJjOi8vaXJjLm9wZW5wcm9qZWN0cy5uZXQvI2tlcm5lbG5ld2JpZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgZnN5bmNfYmRldigpICovCisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCisvKiBXaGV0aGVyIHdlIHJlYWN0IG9uIHN5c3JxIGtleXMgb3IganVzdCBpZ25vcmUgdGhlbSAqLworaW50IHN5c3JxX2VuYWJsZWQgPSAxOworCisvKiBMb2dsZXZlbCBzeXNycSBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfbG9nbGV2ZWwoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkJICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlpbnQgaTsKKwlpID0ga2V5IC0gJzAnOworCWNvbnNvbGVfbG9nbGV2ZWwgPSA3OworCXByaW50aygiTG9nbGV2ZWwgc2V0IHRvICVkXG4iLCBpKTsKKwljb25zb2xlX2xvZ2xldmVsID0gaTsKK30JCitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9sb2dsZXZlbF9vcCA9IHsKKwkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9sb2dsZXZlbCwKKwkuaGVscF9tc2cJPSAibG9nbGV2ZWwwLTgiLAorCS5hY3Rpb25fbXNnCT0gIkNoYW5naW5nIExvZ2xldmVsIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfTE9HLAorfTsKKworCisvKiBTQUsgc3lzcnEgaGFuZGxlciAqLworI2lmZGVmIENPTkZJR19WVAorc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX1NBSyhpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCSAgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJaWYgKHR0eSkKKwkJZG9fU0FLKHR0eSk7CisJcmVzZXRfdmModmNfY29uc1tmZ19jb25zb2xlXS5kKTsKK30KK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX1NBS19vcCA9IHsKKwkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9TQUssCisJLmhlbHBfbXNnCT0gInNhSyIsCisJLmFjdGlvbl9tc2cJPSAiU0FLIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfS0VZQk9BUkQsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVlQKKy8qIHVucmF3IHN5c3JxIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV91bnJhdyhpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCSAgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzdHJ1Y3Qga2JkX3N0cnVjdCAqa2JkID0gJmtiZF90YWJsZVtmZ19jb25zb2xlXTsKKworCWlmIChrYmQpCisJCWtiZC0+a2JkbW9kZSA9IFZDX1hMQVRFOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdW5yYXdfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfdW5yYXcsCisJLmhlbHBfbXNnCT0gInVuUmF3IiwKKwkuYWN0aW9uX21zZwk9ICJLZXlib2FyZCBtb2RlIHNldCB0byBYTEFURSIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0tFWUJPQVJELAorfTsKKyNlbmRpZiAvKiBDT05GSUdfVlQgKi8KKworLyogcmVib290IHN5c3JxIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9yZWJvb3QoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfcmVib290X29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3JlYm9vdCwKKwkuaGVscF9tc2cJPSAicmVCb290IiwKKwkuYWN0aW9uX21zZwk9ICJSZXNldHRpbmciLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9CT09ULAorfTsKKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3N5bmMoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwllbWVyZ2VuY3lfc3luYygpOworfQorCitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zeW5jX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3N5bmMsCisJLmhlbHBfbXNnCT0gIlN5bmMiLAorCS5hY3Rpb25fbXNnCT0gIkVtZXJnZW5jeSBTeW5jIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfU1lOQywKK307CisKK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9tb3VudHJvKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJCSBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwllbWVyZ2VuY3lfcmVtb3VudCgpOworfQorCitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9tb3VudHJvX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX21vdW50cm8sCisJLmhlbHBfbXNnCT0gIlVubW91bnQiLAorCS5hY3Rpb25fbXNnCT0gIkVtZXJnZW5jeSBSZW1vdW50IFIvTyIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1JFTU9VTlQsCit9OworCisvKiBFTkQgU1lOQyBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLworCisKKy8qIFNIT1cgU1lTUlEgSEFORExFUlMgQkxPQ0sgKi8KKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3Nob3dyZWdzKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJCSAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJaWYgKHB0X3JlZ3MpCisJCXNob3dfcmVncyhwdF9yZWdzKTsKK30KK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dyZWdzX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dyZWdzLAorCS5oZWxwX21zZwk9ICJzaG93UGMiLAorCS5hY3Rpb25fbXNnCT0gIlNob3cgUmVncyIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCit9OworCisKK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9zaG93c3RhdGUoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkJICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc2hvd19zdGF0ZSgpOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd3N0YXRlX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZSwKKwkuaGVscF9tc2cJPSAic2hvd1Rhc2tzIiwKKwkuYWN0aW9uX21zZwk9ICJTaG93IFN0YXRlIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKK307CisKKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3Nob3dtZW0oaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkJIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXNob3dfbWVtKCk7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93bWVtX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dtZW0sCisJLmhlbHBfbXNnCT0gInNob3dNZW0iLAorCS5hY3Rpb25fbXNnCT0gIlNob3cgTWVtb3J5IiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKK307CisKKy8qIFNIT1cgU1lTUlEgSEFORExFUlMgQkxPQ0sgKi8KKworCisvKiBTSUdOQUwgU1lTUlEgSEFORExFUlMgQkxPQ0sgKi8KKworLyogc2lnbmFsIHN5c3JxIGhlbHBlciBmdW5jdGlvbgorICogU2VuZHMgYSBzaWduYWwgdG8gYWxsIHVzZXIgcHJvY2Vzc2VzICovCitzdGF0aWMgdm9pZCBzZW5kX3NpZ19hbGwoaW50IHNpZykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisKKwlmb3JfZWFjaF9wcm9jZXNzKHApIHsKKwkJaWYgKHAtPm1tICYmIHAtPnBpZCAhPSAxKQorCQkJLyogTm90IHN3YXBwZXIsIGluaXQgbm9yIGtlcm5lbCB0aHJlYWQgKi8KKwkJCWZvcmNlX3NpZyhzaWcsIHApOworCX0KK30KKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3Rlcm0oaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzZW5kX3NpZ19hbGwoU0lHVEVSTSk7CisJY29uc29sZV9sb2dsZXZlbCA9IDg7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV90ZXJtX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Rlcm0sCisJLmhlbHBfbXNnCT0gInRFcm0iLAorCS5hY3Rpb25fbXNnCT0gIlRlcm1pbmF0ZSBBbGwgVGFza3MiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TSUdOQUwsCit9OworCitzdGF0aWMgdm9pZCBtb29tX2NhbGxiYWNrKHZvaWQgKmlnbm9yZWQpCit7CisJb3V0X29mX21lbW9yeShHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhtb29tX3dvcmssIG1vb21fY2FsbGJhY2ssIE5VTEwpOworCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfbW9vbShpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCSAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc2NoZWR1bGVfd29yaygmbW9vbV93b3JrKTsKK30KK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX21vb21fb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfbW9vbSwKKwkuaGVscF9tc2cJPSAiRnVsbCIsCisJLmFjdGlvbl9tc2cJPSAiTWFudWFsIE9PTSBleGVjdXRpb24iLAorfTsKKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX2tpbGwoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzZW5kX3NpZ19hbGwoU0lHS0lMTCk7CisJY29uc29sZV9sb2dsZXZlbCA9IDg7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9raWxsX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX2tpbGwsCisJLmhlbHBfbXNnCT0gImtJbGwiLAorCS5hY3Rpb25fbXNnCT0gIktpbGwgQWxsIFRhc2tzIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfU0lHTkFMLAorfTsKKworLyogRU5EIFNJR05BTCBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLworCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfdW5ydChpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCW5vcm1hbGl6ZV9ydF90YXNrcygpOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdW5ydF9vcCA9IHsKKwkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV91bnJ0LAorCS5oZWxwX21zZwk9ICJOaWNlIiwKKwkuYWN0aW9uX21zZwk9ICJOaWNlIEFsbCBSVCBUYXNrcyIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1JUTklDRSwKK307CisKKy8qIEtleSBPcGVyYXRpb25zIHRhYmxlIGFuZCBsb2NrICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5c3JxX2tleV90YWJsZV9sb2NrKTsKKyNkZWZpbmUgU1lTUlFfS0VZX1RBQkxFX0xFTkdUSCAzNgorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3AgKnN5c3JxX2tleV90YWJsZVtTWVNSUV9LRVlfVEFCTEVfTEVOR1RIXSA9IHsKKy8qIDAgKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogMSAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiAyICovCSZzeXNycV9sb2dsZXZlbF9vcCwKKy8qIDMgKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogNCAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiA1ICovCSZzeXNycV9sb2dsZXZlbF9vcCwKKy8qIDYgKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogNyAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiA4ICovCSZzeXNycV9sb2dsZXZlbF9vcCwKKy8qIDkgKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogYSAqLwlOVUxMLCAvKiBEb24ndCB1c2UgZm9yIHN5c3RlbSBwcm92aWRlZCBzeXNycXMsCisJCSBpdCBpcyBoYW5kbGVkIHNwZWNpYWxseSBvbiB0aGUgc3BhcmMKKwkJIGFuZCB3aWxsIG5ldmVyIGFycml2ZSAqLworLyogYiAqLwkmc3lzcnFfcmVib290X29wLAorLyogYyAqLyBOVUxMLAorLyogZCAqLwlOVUxMLAorLyogZSAqLwkmc3lzcnFfdGVybV9vcCwKKy8qIGYgKi8JJnN5c3JxX21vb21fb3AsCisvKiBnICovCU5VTEwsCisvKiBoICovCU5VTEwsCisvKiBpICovCSZzeXNycV9raWxsX29wLAorLyogaiAqLwlOVUxMLAorI2lmZGVmIENPTkZJR19WVAorLyogayAqLwkmc3lzcnFfU0FLX29wLAorI2Vsc2UKKy8qIGsgKi8JTlVMTCwKKyNlbmRpZgorLyogbCAqLwlOVUxMLAorLyogbSAqLwkmc3lzcnFfc2hvd21lbV9vcCwKKy8qIG4gKi8JJnN5c3JxX3VucnRfb3AsCisvKiBvICovCU5VTEwsIC8qIFRoaXMgd2lsbCBvZnRlbiBiZSByZWdpc3RlcmVkCisJCSBhcyAnT2ZmJyBhdCBpbml0IHRpbWUgKi8KKy8qIHAgKi8JJnN5c3JxX3Nob3dyZWdzX29wLAorLyogcSAqLwlOVUxMLAorI2lmZGVmIENPTkZJR19WVAorLyogciAqLwkmc3lzcnFfdW5yYXdfb3AsCisjZWxzZQorLyogciAqLyBOVUxMLAorI2VuZGlmCisvKiBzICovCSZzeXNycV9zeW5jX29wLAorLyogdCAqLwkmc3lzcnFfc2hvd3N0YXRlX29wLAorLyogdSAqLwkmc3lzcnFfbW91bnRyb19vcCwKKy8qIHYgKi8JTlVMTCwgLyogTWF5IGJlIGFzc2lnbmVkIGF0IGluaXQgdGltZSBieSBTTVAgVk9ZQUdFUiAqLworLyogdyAqLwlOVUxMLAorLyogeCAqLwlOVUxMLAorLyogeSAqLwlOVUxMLAorLyogeiAqLwlOVUxMCit9OworCisvKiBrZXkyaW5kZXggY2FsY3VsYXRpb24sIC0xIG9uIGludmFsaWQgaW5kZXggKi8KK3N0YXRpYyBpbnQgc3lzcnFfa2V5X3RhYmxlX2tleTJpbmRleChpbnQga2V5KSB7CisJaW50IHJldHZhbDsKKwlpZiAoKGtleSA+PSAnMCcpICYmIChrZXkgPD0gJzknKSkgeworCQlyZXR2YWwgPSBrZXkgLSAnMCc7CisJfSBlbHNlIGlmICgoa2V5ID49ICdhJykgJiYgKGtleSA8PSAneicpKSB7CisJCXJldHZhbCA9IGtleSArIDEwIC0gJ2EnOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogZ2V0IGFuZCBwdXQgZnVuY3Rpb25zIGZvciB0aGUgdGFibGUsIGV4cG9zZWQgdG8gbW9kdWxlcy4KKyAqLworCitzdHJ1Y3Qgc3lzcnFfa2V5X29wICpfX3N5c3JxX2dldF9rZXlfb3AgKGludCBrZXkpIHsKKyAgICAgICAgc3RydWN0IHN5c3JxX2tleV9vcCAqb3BfcDsKKyAgICAgICAgaW50IGk7CisJCisJaSA9IHN5c3JxX2tleV90YWJsZV9rZXkyaW5kZXgoa2V5KTsKKyAgICAgICAgb3BfcCA9IChpID09IC0xKSA/IE5VTEwgOiBzeXNycV9rZXlfdGFibGVbaV07CisgICAgICAgIHJldHVybiBvcF9wOworfQorCit2b2lkIF9fc3lzcnFfcHV0X2tleV9vcCAoaW50IGtleSwgc3RydWN0IHN5c3JxX2tleV9vcCAqb3BfcCkgeworICAgICAgICBpbnQgaTsKKworCWkgPSBzeXNycV9rZXlfdGFibGVfa2V5MmluZGV4KGtleSk7CisgICAgICAgIGlmIChpICE9IC0xKQorICAgICAgICAgICAgICAgIHN5c3JxX2tleV90YWJsZVtpXSA9IG9wX3A7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBub24tbG9ja2luZyB2ZXJzaW9uIG9mIGhhbmRsZV9zeXNycQorICogSXQgbXVzdC9jYW4gb25seSBiZSBjYWxsZWQgYnkgc3lzcnEga2V5IGhhbmRsZXJzLAorICogYXMgdGhleSBhcmUgaW5zaWRlIG9mIHRoZSBsb2NrCisgKi8KKwordm9pZCBfX2hhbmRsZV9zeXNycShpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGNoZWNrX21hc2spCit7CisJc3RydWN0IHN5c3JxX2tleV9vcCAqb3BfcDsKKwlpbnQgb3JpZ19sb2dfbGV2ZWw7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeXNycV9rZXlfdGFibGVfbG9jaywgZmxhZ3MpOworCW9yaWdfbG9nX2xldmVsID0gY29uc29sZV9sb2dsZXZlbDsKKwljb25zb2xlX2xvZ2xldmVsID0gNzsKKwlwcmludGsoS0VSTl9JTkZPICJTeXNScSA6ICIpOworCisgICAgICAgIG9wX3AgPSBfX3N5c3JxX2dldF9rZXlfb3Aoa2V5KTsKKyAgICAgICAgaWYgKG9wX3ApIHsKKwkJLyogU2hvdWxkIHdlIGNoZWNrIGZvciBlbmFibGVkIG9wZXJhdGlvbnMgKC9wcm9jL3N5c3JxLXRyaWdnZXIgc2hvdWxkIG5vdCkKKwkJICogYW5kIGlzIHRoZSBpbnZva2VkIG9wZXJhdGlvbiBlbmFibGVkPyAqLworCQlpZiAoIWNoZWNrX21hc2sgfHwgc3lzcnFfZW5hYmxlZCA9PSAxIHx8CisJCSAgICAoc3lzcnFfZW5hYmxlZCAmIG9wX3AtPmVuYWJsZV9tYXNrKSkgeworCQkJcHJpbnRrICgiJXNcbiIsIG9wX3AtPmFjdGlvbl9tc2cpOworCQkJY29uc29sZV9sb2dsZXZlbCA9IG9yaWdfbG9nX2xldmVsOworCQkJb3BfcC0+aGFuZGxlcihrZXksIHB0X3JlZ3MsIHR0eSk7CisJCX0KKwkJZWxzZQorCQkJcHJpbnRrKCJUaGlzIHN5c3JxIG9wZXJhdGlvbiBpcyBkaXNhYmxlZC5cbiIpOworCX0gZWxzZSB7CisJCXByaW50aygiSEVMUCA6ICIpOworCQkvKiBPbmx5IHByaW50IHRoZSBoZWxwIG1zZyBvbmNlIHBlciBoYW5kbGVyICovCisJCWZvciAoaT0wOyBpPFNZU1JRX0tFWV9UQUJMRV9MRU5HVEg7IGkrKykgCisJCWlmIChzeXNycV9rZXlfdGFibGVbaV0pIHsKKwkJCWZvciAoaj0wOyBzeXNycV9rZXlfdGFibGVbaV0gIT0gc3lzcnFfa2V5X3RhYmxlW2pdOyBqKyspOworCQkJaWYgKGogPT0gaSkKKwkJCQlwcmludGsgKCIlcyAiLCBzeXNycV9rZXlfdGFibGVbaV0tPmhlbHBfbXNnKTsKKwkJfQorCQlwcmludGsgKCJcbiIpOworCQljb25zb2xlX2xvZ2xldmVsID0gb3JpZ19sb2dfbGV2ZWw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5c3JxX2tleV90YWJsZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUga2V5Ym9hcmQgaGFuZGxlciB3aGVuIFN5c1JxIGlzIHByZXNzZWQKKyAqIGFuZCBhbnkgb3RoZXIga2V5Y29kZSBhcnJpdmVzLgorICovCisKK3ZvaWQgaGFuZGxlX3N5c3JxKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghc3lzcnFfZW5hYmxlZCkKKwkJcmV0dXJuOworCV9faGFuZGxlX3N5c3JxKGtleSwgcHRfcmVncywgdHR5LCAxKTsKK30KKworaW50IF9fc3lzcnFfc3dhcF9rZXlfb3BzKGludCBrZXksIHN0cnVjdCBzeXNycV9rZXlfb3AgKmluc2VydF9vcF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3lzcnFfa2V5X29wICpyZW1vdmVfb3BfcCkgeworCisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5c3JxX2tleV90YWJsZV9sb2NrLCBmbGFncyk7CisJaWYgKF9fc3lzcnFfZ2V0X2tleV9vcChrZXkpID09IHJlbW92ZV9vcF9wKSB7CisJCV9fc3lzcnFfcHV0X2tleV9vcChrZXksIGluc2VydF9vcF9wKTsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSAtMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3lzcnFfa2V5X3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCByZWdpc3Rlcl9zeXNycV9rZXkoaW50IGtleSwgc3RydWN0IHN5c3JxX2tleV9vcCAqb3BfcCkKK3sKKwlyZXR1cm4gX19zeXNycV9zd2FwX2tleV9vcHMoa2V5LCBvcF9wLCBOVUxMKTsKK30KKworaW50IHVucmVnaXN0ZXJfc3lzcnFfa2V5KGludCBrZXksIHN0cnVjdCBzeXNycV9rZXlfb3AgKm9wX3ApCit7CisJcmV0dXJuIF9fc3lzcnFfc3dhcF9rZXlfb3BzKGtleSwgTlVMTCwgb3BfcCk7Cit9CisKK0VYUE9SVF9TWU1CT0woaGFuZGxlX3N5c3JxKTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfc3lzcnFfa2V5KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9zeXNycV9rZXkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RiMDIxOS5jIGIvZHJpdmVycy9jaGFyL3RiMDIxOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTNmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorCitNT0RVTEVfQVVUSE9SKCJZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgbWFqb3I7CS8qIGRlZmF1bHQgaXMgZHluYW1pYyBtYWpvciBkZXZpY2UgbnVtYmVyICovCittb2R1bGVfcGFyYW0obWFqb3IsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1ham9yLCAiTWFqb3IgZGV2aWNlIG51bWJlciIpOworCitzdGF0aWMgdm9pZCAoKm9sZF9tYWNoaW5lX3Jlc3RhcnQpKGNoYXIgKmNvbW1hbmQpOworc3RhdGljIHZvaWQgX19pb21lbSAqdGIwMjE5X2Jhc2U7CitzdGF0aWMgc3BpbmxvY2tfdCB0YjAyMTlfbG9jazsKKworI2RlZmluZSB0YjAyMTlfcmVhZChvZmZzZXQpCQlyZWFkdyh0YjAyMTlfYmFzZSArIChvZmZzZXQpKQorI2RlZmluZSB0YjAyMTlfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIHRiMDIxOV9iYXNlICsgKG9mZnNldCkpCisKKyNkZWZpbmUgVEIwMjE5X1NUQVJUCTB4MGEwMDAwMDBVTAorI2RlZmluZSBUQjAyMTlfU0laRQkweDIwVUwKKworI2RlZmluZSBUQjAyMTlfTEVECQkJMHgwMAorI2RlZmluZSBUQjAyMTlfR1BJT19JTlBVVAkJMHgwMgorI2RlZmluZSBUQjAyMTlfR1BJT19PVVRQVVQJCTB4MDQKKyNkZWZpbmUgVEIwMjE5X0RJUF9TV0lUQ0gJCTB4MDYKKyNkZWZpbmUgVEIwMjE5X01JU0MJCQkweDA4CisjZGVmaW5lIFRCMDIxOV9SRVNFVAkJCTB4MGUKKyNkZWZpbmUgVEIwMjE5X1BDSV9TTE9UMV9JUlFfU1RBVFVTCTB4MTAKKyNkZWZpbmUgVEIwMjE5X1BDSV9TTE9UMl9JUlFfU1RBVFVTCTB4MTIKKyNkZWZpbmUgVEIwMjE5X1BDSV9TTE9UM19JUlFfU1RBVFVTCTB4MTQKKwordHlwZWRlZiBlbnVtIHsKKwlUWVBFX0xFRCwKKwlUWVBFX0dQSU9fT1VUUFVULAorfSB0YjAyMTlfdHlwZV90OworCisvKgorICogTWlub3IgZGV2aWNlIG51bWJlcgorICoJIDAgPSA3IHNlZ21lbnQgTEVECisgKgorICoJMTYgPSBHUElPIElOIDAKKyAqCTE3ID0gR1BJTyBJTiAxCisgKgkxOCA9IEdQSU8gSU4gMgorICoJMTkgPSBHUElPIElOIDMKKyAqCTIwID0gR1BJTyBJTiA0CisgKgkyMSA9IEdQSU8gSU4gNQorICoJMjIgPSBHUElPIElOIDYKKyAqCTIzID0gR1BJTyBJTiA3CisgKgorICoJMzIgPSBHUElPIE9VVCAwCisgKgkzMyA9IEdQSU8gT1VUIDEKKyAqCTM0ID0gR1BJTyBPVVQgMgorICoJMzUgPSBHUElPIE9VVCAzCisgKgkzNiA9IEdQSU8gT1VUIDQKKyAqCTM3ID0gR1BJTyBPVVQgNQorICoJMzggPSBHUElPIE9VVCA2CisgKgkzOSA9IEdQSU8gT1VUIDcKKyAqCisgKgk0OCA9IERJUCBzd2l0Y2ggMQorICoJNDkgPSBESVAgc3dpdGNoIDIKKyAqCTUwID0gRElQIHN3aXRjaCAzCisgKgk1MSA9IERJUCBzd2l0Y2ggNAorICoJNTIgPSBESVAgc3dpdGNoIDUKKyAqCTUzID0gRElQIHN3aXRjaCA2CisgKgk1NCA9IERJUCBzd2l0Y2ggNworICoJNTUgPSBESVAgc3dpdGNoIDgKKyAqLworCitzdGF0aWMgaW5saW5lIGNoYXIgZ2V0X2xlZCh2b2lkKQoreworCXJldHVybiAoY2hhcil0YjAyMTlfcmVhZChUQjAyMTlfTEVEKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyIGdldF9ncGlvX2lucHV0X3Bpbih1bnNpZ25lZCBpbnQgcGluKQoreworCXVpbnQxNl90IHZhbHVlczsKKworCXZhbHVlcyA9IHRiMDIxOV9yZWFkKFRCMDIxOV9HUElPX0lOUFVUKTsKKwlpZiAodmFsdWVzICYgKDEgPDwgcGluKSkKKwkJcmV0dXJuICcxJzsKKworCXJldHVybiAnMCc7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciBnZXRfZ3Bpb19vdXRwdXRfcGluKHVuc2lnbmVkIGludCBwaW4pCit7CisJdWludDE2X3QgdmFsdWVzOworCisJdmFsdWVzID0gdGIwMjE5X3JlYWQoVEIwMjE5X0dQSU9fT1VUUFVUKTsKKwlpZiAodmFsdWVzICYgKDEgPDwgcGluKSkKKwkJcmV0dXJuICcxJzsKKworCXJldHVybiAnMCc7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciBnZXRfZGlwX3N3aXRjaCh1bnNpZ25lZCBpbnQgcGluKQoreworCXVpbnQxNl90IHZhbHVlczsKKworCXZhbHVlcyA9IHRiMDIxOV9yZWFkKFRCMDIxOV9ESVBfU1dJVENIKTsKKwlpZiAodmFsdWVzICYgKDEgPDwgcGluKSkKKwkJcmV0dXJuICcxJzsKKworCXJldHVybiAnMCc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9sZWQoY2hhciBjb21tYW5kKQoreworCXRiMDIxOV93cml0ZShUQjAyMTlfTEVELCBjb21tYW5kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZXRfZ3Bpb19vdXRwdXRfcGluKHVuc2lnbmVkIGludCBwaW4sIGNoYXIgY29tbWFuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQxNl90IHZhbHVlOworCisJaWYgKGNvbW1hbmQgIT0gJzAnICYmIGNvbW1hbmQgIT0gJzEnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YjAyMTlfbG9jaywgZmxhZ3MpOworCXZhbHVlID0gdGIwMjE5X3JlYWQoVEIwMjE5X0dQSU9fT1VUUFVUKTsKKwlpZiAoY29tbWFuZCA9PSAnMCcpCisJCXZhbHVlICY9IH4oMSA8PCBwaW4pOworCWVsc2UKKwkJdmFsdWUgfD0gMSA8PCBwaW47CisJdGIwMjE5X3dyaXRlKFRCMDIxOV9HUElPX09VVFBVVCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRiMDIxOV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgc3NpemVfdCB0YW5iYWNfdGIwMjE5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGludCBtaW5vcjsKKwljaGFyIHZhbHVlOworCisJbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN3aXRjaCAobWlub3IpIHsKKwljYXNlIDA6CisJCXZhbHVlID0gZ2V0X2xlZCgpOworCQlicmVhazsKKwljYXNlIDE2IC4uLiAyMzoKKwkJdmFsdWUgPSBnZXRfZ3Bpb19pbnB1dF9waW4obWlub3IgLSAxNik7CisJCWJyZWFrOworCWNhc2UgMzIgLi4uIDM5OgorCQl2YWx1ZSA9IGdldF9ncGlvX291dHB1dF9waW4obWlub3IgLSAzMik7CisJCWJyZWFrOworCWNhc2UgNDggLi4uIDU1OgorCQl2YWx1ZSA9IGdldF9kaXBfc3dpdGNoKG1pbm9yIC0gNDgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVCQURGOworCX0KKworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAocHV0X3VzZXIodmFsdWUsIGJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRhbmJhY190YjAyMTlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yOworCXRiMDIxOV90eXBlX3QgdHlwZTsKKwlzaXplX3QgaTsKKwlpbnQgcmV0dmFsID0gMDsKKwljaGFyIGM7CisKKwltaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3dpdGNoIChtaW5vcikgeworCWNhc2UgMDoKKwkJdHlwZSA9IFRZUEVfTEVEOworCQlicmVhazsKKwljYXNlIDMyIC4uLiAzOToKKwkJdHlwZSA9IFRZUEVfR1BJT19PVVRQVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUJBREY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBUWVBFX0xFRDoKKwkJCXJldHZhbCA9IHNldF9sZWQoYyk7CisJCQlicmVhazsKKwkJY2FzZSBUWVBFX0dQSU9fT1VUUFVUOgorCQkJcmV0dmFsID0gc2V0X2dwaW9fb3V0cHV0X3BpbihtaW5vciAtIDMyLCBjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJldHZhbCA8IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCB0YW5iYWNfdGIwMjE5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yOworCisJbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN3aXRjaCAobWlub3IpIHsKKwljYXNlIDA6CisJY2FzZSAxNiAuLi4gMjM6CisJY2FzZSAzMiAuLi4gMzk6CisJY2FzZSA0OCAuLi4gNTU6CisJCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVCQURGOworfQorCitzdGF0aWMgaW50IHRhbmJhY190YjAyMTlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGIwMjE5X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHRhbmJhY190YjAyMTlfcmVhZCwKKwkud3JpdGUJCT0gdGFuYmFjX3RiMDIxOV93cml0ZSwKKwkub3BlbgkJPSB0YW5iYWNfdGIwMjE5X29wZW4sCisJLnJlbGVhc2UJPSB0YW5iYWNfdGIwMjE5X3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCB0YjAyMTlfcmVzdGFydChjaGFyICpjb21tYW5kKQoreworCXRiMDIxOV93cml0ZShUQjAyMTlfUkVTRVQsIDApOworfQorCitzdGF0aWMgaW50IHRiMDIxOV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oVEIwMjE5X1NUQVJULCBUQjAyMTlfU0laRSwgIlRCMDIxOSIpID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwl0YjAyMTlfYmFzZSA9IGlvcmVtYXAoVEIwMjE5X1NUQVJULCBUQjAyMTlfU0laRSk7CisJaWYgKHRiMDIxOV9iYXNlID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKFRCMDIxOV9TVEFSVCwgVEIwMjE5X1NJWkUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9jaHJkZXYobWFqb3IsICJUQjAyMTkiLCAmdGIwMjE5X2ZvcHMpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWlvdW5tYXAodGIwMjE5X2Jhc2UpOworCQl0YjAyMTlfYmFzZSA9IE5VTEw7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihUQjAyMTlfU1RBUlQsIFRCMDIxOV9TSVpFKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmdGIwMjE5X2xvY2spOworCisJb2xkX21hY2hpbmVfcmVzdGFydCA9IF9tYWNoaW5lX3Jlc3RhcnQ7CisJX21hY2hpbmVfcmVzdGFydCA9IHRiMDIxOV9yZXN0YXJ0OworCisJaWYgKG1ham9yID09IDApIHsKKwkJbWFqb3IgPSByZXR2YWw7CisJCXByaW50ayhLRVJOX0lORk8gIlRCMDIxOTogbWFqb3IgbnVtYmVyICVkXG4iLCBtYWpvcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGIwMjE5X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJX21hY2hpbmVfcmVzdGFydCA9IG9sZF9tYWNoaW5lX3Jlc3RhcnQ7CisKKwlpb3VubWFwKHRiMDIxOV9iYXNlKTsKKwl0YjAyMTlfYmFzZSA9IE5VTEw7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oVEIwMjE5X1NUQVJULCBUQjAyMTlfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRiMDIxOV9wbGF0Zm9ybV9kZXZpY2U7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB0YjAyMTlfZGV2aWNlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiVEIwMjE5IiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gdGIwMjE5X3Byb2JlLAorCS5yZW1vdmUJCT0gdGIwMjE5X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRhbmJhY190YjAyMTlfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwl0YjAyMTlfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiVEIwMjE5IiwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIodGIwMjE5X3BsYXRmb3JtX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKHRiMDIxOV9wbGF0Zm9ybV9kZXZpY2UpOworCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZ0YjAyMTlfZGV2aWNlX2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRiMDIxOV9wbGF0Zm9ybV9kZXZpY2UpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHRhbmJhY190YjAyMTlfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZ0YjAyMTlfZGV2aWNlX2RyaXZlcik7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0YjAyMTlfcGxhdGZvcm1fZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQodGFuYmFjX3RiMDIxOV9pbml0KTsKK21vZHVsZV9leGl0KHRhbmJhY190YjAyMTlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGlwYXIuYyBiL2RyaXZlcnMvY2hhci90aXBhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWJhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdGlwYXIuYwpAQCAtMCwwICsxLDU2NCBAQAorLyogSGV5IEVNQUNTIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIHRpcGFyIC0gbG93IGxldmVsIGRyaXZlciBmb3IgaGFuZGxpbmcgYSBwYXJhbGxlbCBsaW5rIGNhYmxlIGRlc2lnbmVkCisgKiBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgZ3JhcGhpbmcgY2FsY3VsYXRvcnMgKGh0dHA6Ly9scGcudGljYWxjLm9yZykuCisgKiBBIHBhcnQgb2YgdGhlIFRpTFAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiwgUm9tYWluIExpZXZpbiA8cm9tc0BscGcudGljYWxjLm9yZz4KKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVmFyaW91cyBmaXhlcyAmIGNsZWFuLXVwIGZyb20gdGhlIExpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QKKyAqIChBbGFuIENveCwgUmljaGFyZCBCLiBKb2huc29uLCBDaHJpc3RvcGggSGVsbHdpZykuCisgKi8KKworLyogVGhpcyBkcml2ZXIgc2hvdWxkLCBpbiB0aGVvcnksIHdvcmsgd2l0aCBhbnkgcGFyYWxsZWwgcG9ydCB0aGF0IGhhcyBhbgorICogYXBwcm9wcmlhdGUgbG93LWxldmVsIGRyaXZlcjsgYWxsIEkvTyBpcyBkb25lIHRocm91Z2ggdGhlIHBhcnBvcnQKKyAqIGFic3RyYWN0aW9uIGxheWVyLgorICoKKyAqIElmIHRoaXMgZHJpdmVyIGlzIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgeW91IGNhbiBjb25maWd1cmUgaXQgdXNpbmcgdGhlCisgKiBrZXJuZWwgY29tbWFuZC1saW5lLiAgRm9yIGV4YW1wbGU6CisgKgorICogICAgICB0aXBhcj10aW1lb3V0LGRlbGF5ICAgICAgIChzZXQgdGltZW91dCBhbmQgZGVsYXkpCisgKgorICogSWYgdGhlIGRyaXZlciBpcyBsb2FkZWQgYXMgYSBtb2R1bGUsIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUKKyAqIHVzaW5nIG1vZHVsZSBwYXJhbWV0ZXJzLiAgVGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlIGNvbW1hbmRzIHdvdWxkIGJlOgorICoKKyAqICAgICAgIyBpbnNtb2QgdGlwYXIgdGltZW91dD0xNSBkZWxheT0xMAorICovCisKKy8qIENPTVBBVElCSUxJVFkgV0lUSCBPTEQgS0VSTkVMUworICoKKyAqIFVzdWFsbHksIHBhcmFsbGVsIGNhYmxlcyB3ZXJlIGJvdW5kIHRvIHBvcnRzIGF0CisgKiBwYXJ0aWN1bGFyIEkvTyBhZGRyZXNzZXMsIGFzIGZvbGxvd3M6CisgKgorICogICAgICB0aXBhcjAgICAgICAgICAgICAgMHgzNzgKKyAqICAgICAgdGlwYXIxICAgICAgICAgICAgIDB4Mjc4CisgKiAgICAgIHRpcGFyMiAgICAgICAgICAgICAweDNiYworICoKKyAqCisgKiBUaGlzIGRyaXZlciwgYnkgZGVmYXVsdCwgYmluZHMgdGlwYXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gcGFycG9ydCBhbmQKKyAqIHRoZSBtaW5vciBudW1iZXIuCisgKgorICovCisjdW5kZWYgREVCVUcJCQkJLyogY2hhbmdlIHRvICNkZWZpbmUgdG8gZ2V0IGRlYnVnZ2luZworCQkJCQkgKiBvdXRwdXQgLSBmb3IgcHJfZGVidWcoKSAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgkvKiBEZXZGcyBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgkJLyogT3VyIGNvZGUgZGVwZW5kIG9uIHBhcnBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyoKKyAqIFRJIGRlZmluaXRpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC90aWNhYmxlLmg+CisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEuMTkiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICJSb21haW4gTGlldmluIDxyb21zQGxwZy50aWNhbGMub3JnPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIkRldmljZSBkcml2ZXIgZm9yIFRJL1BDIHBhcmFsbGVsIGxpbmsgY2FibGVzIgorI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgorCisjZGVmaW5lIFZFUlNJT04odmVyLHJlbCxzZXEpICgoKHZlcik8PDE2KSB8ICgocmVsKTw8OCkgfCAoc2VxKSkKKworLyogLS0tLS0gZ2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHRpcGFyX3N0cnVjdCB7CisJc3RydWN0IHBhcmRldmljZSAqZGV2OwkvKiBQYXJwb3J0IGRldmljZSBlbnRyeSAqLworfTsKKworI2RlZmluZSBQUF9OTyAzCitzdGF0aWMgc3RydWN0IHRpcGFyX3N0cnVjdCB0YWJsZVtQUF9OT107CisKK3N0YXRpYyBpbnQgZGVsYXkgPSBJT19ERUxBWTsJLyogaW50ZXItYml0IGRlbGF5IGluIG1pY3Jvc2Vjb25kcyAqLworc3RhdGljIGludCB0aW1lb3V0ID0gVElNQVhUSU1FOwkvKiB0aW1lb3V0IGluIHRlbnRoIG9mIHNlY29uZHMgICAgICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHBfY291bnQ7CS8qIHRpcGFyIGNvdW50ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvcGVuZWQ7CS8qIG9wZW5lZCBkZXZpY2VzICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICp0aXBhcl9jbGFzczsKKworLyogLS0tIG1hY3JvcyBmb3IgcGFycG9ydCBhY2Nlc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSByX2R0cih4KSAgICAgICAgKHBhcnBvcnRfcmVhZF9kYXRhKHRhYmxlWyh4KV0uZGV2LT5wb3J0KSkKKyNkZWZpbmUgcl9zdHIoeCkgICAgICAgIChwYXJwb3J0X3JlYWRfc3RhdHVzKHRhYmxlWyh4KV0uZGV2LT5wb3J0KSkKKyNkZWZpbmUgd19jdHIoeCx5KSAgICAgIChwYXJwb3J0X3dyaXRlX2NvbnRyb2wodGFibGVbKHgpXS5kZXYtPnBvcnQsICh5KSkpCisjZGVmaW5lIHdfZHRyKHgseSkgICAgICAocGFycG9ydF93cml0ZV9kYXRhKHRhYmxlWyh4KV0uZGV2LT5wb3J0LCAoeSkpKQorCisvKiAtLS0gc2V0dGluZyBzdGF0ZXMgb24gdGhlIEQtYnVzIHdpdGggdGhlIHJpZ2h0IHRpbWluZzogLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK291dGJ5dGUoaW50IHZhbHVlLCBpbnQgbWlub3IpCit7CisJd19kdHIobWlub3IsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2luYnl0ZShpbnQgbWlub3IpCit7CisJcmV0dXJuIChyX3N0cihtaW5vcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2luaXRfdGlfcGFyYWxsZWwoaW50IG1pbm9yKQoreworCW91dGJ5dGUoMywgbWlub3IpOworfQorCisvKiAtLS0tLSBnbG9iYWwgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNUQVJUKHgpIHsgeCA9IGppZmZpZXMgKyAoSFogKiB0aW1lb3V0KSAvIDEwOyB9CisjZGVmaW5lIFdBSVQoeCkgIHsgXAorICBpZiAodGltZV9iZWZvcmUoKHgpLCBqaWZmaWVzKSkgcmV0dXJuIC0xOyBcCisgIGlmIChuZWVkX3Jlc2NoZWQoKSkgc2NoZWR1bGUoKTsgfQorCisvKiAtLS0tLSBELWJ1cyBiaXQtYmFuZ2luZyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBELWJ1cyBwcm90b2NvbCAoNDVrYml0L3MgbWF4KToKKyAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgX19fX19fXyAgICAgICAgX19fX19ffF9fX19fXyAgICBfX19fX19fX19ffF9fX19fX19fICAgIF9fX19fX19fX18KK1JlZCAgOiAgICAgICAgX19fX19fX18gICAgICB8ICAgICAgX19fXyAgICAgICAgICB8ICAgICAgICBfX19fCisgICAgICAgXyAgICAgICAgX19fX19fX19fX19ffF9fX19fX19fICAgICAgX19fX19ffF9fX19fX19fX18gICAgICAgX19fX18KK1doaXRlOiAgX19fX19fX18gICAgICAgICAgICB8ICAgICAgICBfX19fX18gICAgICB8ICAgICAgICAgIF9fX19fX18KKyovCisKKy8qIFRyeSB0byB0cmFuc21pdCBhIGJ5dGUgb24gdGhlIHNwZWNpZmllZCBwb3J0ICgtMSBpZiBlcnJvcikuICovCitzdGF0aWMgaW50CitwdXRfdGlfcGFyYWxsZWwoaW50IG1pbm9yLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgaW50IGJpdDsKKwl1bnNpZ25lZCBsb25nIG1heDsKKworCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJaWYgKGRhdGEgJiAxKSB7CisJCQlvdXRieXRlKDIsIG1pbm9yKTsKKwkJCVNUQVJUKG1heCk7CisJCQlkbyB7CisJCQkJV0FJVChtYXgpOworCQkJfSB3aGlsZSAoaW5ieXRlKG1pbm9yKSAmIDB4MTApOworCisJCQlvdXRieXRlKDMsIG1pbm9yKTsKKwkJCVNUQVJUKG1heCk7CisJCQlkbyB7CisJCQkJV0FJVChtYXgpOworCQkJfSB3aGlsZSAoIShpbmJ5dGUobWlub3IpICYgMHgxMCkpOworCQl9IGVsc2UgeworCQkJb3V0Ynl0ZSgxLCBtaW5vcik7CisJCQlTVEFSVChtYXgpOworCQkJZG8geworCQkJCVdBSVQobWF4KTsKKwkJCX0gd2hpbGUgKGluYnl0ZShtaW5vcikgJiAweDIwKTsKKworCQkJb3V0Ynl0ZSgzLCBtaW5vcik7CisJCQlTVEFSVChtYXgpOworCQkJZG8geworCQkJCVdBSVQobWF4KTsKKwkJCX0gd2hpbGUgKCEoaW5ieXRlKG1pbm9yKSAmIDB4MjApKTsKKwkJfQorCisJCWRhdGEgPj49IDE7CisJCXVkZWxheShkZWxheSk7CisKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJc2NoZWR1bGUoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIGJ5dGUgb24gdGhlIHNwZWNpZmllZCBwb3J0IG9yIC0xIGlmIGVycm9yLiAqLworc3RhdGljIGludAorZ2V0X3RpX3BhcmFsbGVsKGludCBtaW5vcikKK3sKKwl1bnNpZ25lZCBpbnQgYml0OworCXVuc2lnbmVkIGNoYXIgdiwgZGF0YSA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXg7CisKKwlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisJCVNUQVJUKG1heCk7CisJCWRvIHsKKwkJCVdBSVQobWF4KTsKKwkJfSB3aGlsZSAoKHYgPSBpbmJ5dGUobWlub3IpICYgMHgzMCkgPT0gMHgzMCk7CisKKwkJaWYgKHYgPT0gMHgxMCkgeworCQkJZGF0YSA9IChkYXRhID4+IDEpIHwgMHg4MDsKKwkJCW91dGJ5dGUoMSwgbWlub3IpOworCQkJU1RBUlQobWF4KTsKKwkJCWRvIHsKKwkJCQlXQUlUKG1heCk7CisJCQl9IHdoaWxlICghKGluYnl0ZShtaW5vcikgJiAweDIwKSk7CisJCQlvdXRieXRlKDMsIG1pbm9yKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSBkYXRhID4+IDE7CisJCQlvdXRieXRlKDIsIG1pbm9yKTsKKwkJCVNUQVJUKG1heCk7CisJCQlkbyB7CisJCQkJV0FJVChtYXgpOworCQkJfSB3aGlsZSAoIShpbmJ5dGUobWlub3IpICYgMHgxMCkpOworCQkJb3V0Ynl0ZSgzLCBtaW5vcik7CisJCX0KKworCQl1ZGVsYXkoZGVsYXkpOworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSgpOworCX0KKworCXJldHVybiAoaW50KSBkYXRhOworfQorCisvKiBUcnkgdG8gZGV0ZWN0IGEgcGFyYWxsZWwgbGluayBjYWJsZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgKi8KK3N0YXRpYyBpbnQKK3Byb2JlX3RpX3BhcmFsbGVsKGludCBtaW5vcikKK3sKKwlpbnQgaTsKKwlpbnQgc2VxW10gPSB7IDB4MDAsIDB4MjAsIDB4MTAsIDB4MzAgfTsKKworCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKSB7CisJCW91dGJ5dGUoMywgbWlub3IpOworCQlvdXRieXRlKGksIG1pbm9yKTsKKwkJdWRlbGF5KGRlbGF5KTsKKwkJcHJfZGVidWcoInRpcGFyOiBQcm9iaW5nIC0+ICVpOiAweCUwMnggMHglMDJ4XG4iLCBpLAorCQkJZGF0YSAmIDB4MzAsIHNlcVtpXSk7CisJCWlmICgoaW5ieXRlKG1pbm9yKSAmIDB4MzApICE9IHNlcVtpXSkgeworCQkJb3V0Ynl0ZSgzLCBtaW5vcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlvdXRieXRlKDMsIG1pbm9yKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0ga2VybmVsIG1vZHVsZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAordGlwYXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpIC0gVElQQVJfTUlOT1I7CisKKwlpZiAobWlub3IgPiB0cF9jb3VudCAtIDEpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChtaW5vciwgJm9wZW5lZCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlwYXJwb3J0X2NsYWltX29yX2Jsb2NrKHRhYmxlW21pbm9yXS5kZXYpOworCWluaXRfdGlfcGFyYWxsZWwobWlub3IpOworCXBhcnBvcnRfcmVsZWFzZSh0YWJsZVttaW5vcl0uZGV2KTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAordGlwYXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKSAtIFRJUEFSX01JTk9SOworCisJaWYgKG1pbm9yID4gdHBfY291bnQgLSAxKQorCQlyZXR1cm4gLUVOWElPOworCisJY2xlYXJfYml0KG1pbm9yLCAmb3BlbmVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAordGlwYXJfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCWxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAtIFRJUEFSX01JTk9SOworCXNzaXplX3QgbjsKKworCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sodGFibGVbbWlub3JdLmRldik7CisKKwlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQl1bnNpZ25lZCBjaGFyIGI7CisKKwkJaWYgKGdldF91c2VyKGIsIGJ1ZiArIG4pKSB7CisJCQluID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHB1dF90aV9wYXJhbGxlbChtaW5vciwgYikgPT0gLTEpIHsKKwkJCWluaXRfdGlfcGFyYWxsZWwobWlub3IpOworCQkJbiA9IC1FVElNRURPVVQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyAgICAgIG91dDoKKwlwYXJwb3J0X3JlbGVhc2UodGFibGVbbWlub3JdLmRldik7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0aXBhcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IGIgPSAwOworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgLSBUSVBBUl9NSU5PUjsKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisJc3NpemVfdCBuID0gMDsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sodGFibGVbbWlub3JdLmRldik7CisKKwl3aGlsZSAobiA8IGNvdW50KSB7CisJCWIgPSBnZXRfdGlfcGFyYWxsZWwobWlub3IpOworCQlpZiAoYiA9PSAtMSkgeworCQkJaW5pdF90aV9wYXJhbGxlbChtaW5vcik7CisJCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQlpZiAocHV0X3VzZXIoYiwgYnVmICsgbikpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJcmV0dmFsID0gKytuOworCQl9CisKKwkJLyogTm9uLWJsb2NraW5nIG1vZGUgOiB0cnkgYWdhaW4gISAqLworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFNpZ25hbCBwZW5kaW5nLCB0cnkgYWdhaW4gISAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJc2NoZWR1bGUoKTsKKwl9CisKKyAgICAgIG91dDoKKwlwYXJwb3J0X3JlbGVhc2UodGFibGVbbWlub3JdLmRldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAordGlwYXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXR2YWwgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElPQ1RMX1RJUEFSX0RFTEFZOgorCQlkZWxheSA9IChpbnQpYXJnOyAgICAvL2dldF91c2VyKGRlbGF5LCAmYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9USVBBUl9USU1FT1VUOgorCQlpZiAoYXJnICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gKGludClhcmc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gLUVJTlZBTDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIC0tLS0tIGtlcm5lbCBtb2R1bGUgcmVnaXN0ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRpcGFyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkucmVhZCA9IHRpcGFyX3JlYWQsCisJLndyaXRlID0gdGlwYXJfd3JpdGUsCisJLmlvY3RsID0gdGlwYXJfaW9jdGwsCisJLm9wZW4gPSB0aXBhcl9vcGVuLAorCS5yZWxlYXNlID0gdGlwYXJfY2xvc2UsCit9OworCisvKiAtLS0gaW5pdGlhbGlzYXRpb24gY29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisvKiAgICAgIFlvdSBtdXN0IHNldCB0aGVzZSAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGNhYmxlLgorICogICAgICBZb3UgY2FuIHVzZSAndGlwYXI9dGltZW91dCxkZWxheScgdG8gc2V0IHRoZXNlIG5vdy4gKi8KK3N0YXRpYyBpbnQgX19pbml0Cit0aXBhcl9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbMl07CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaWYgKGludHNbMF0gPiAwKSB7CisJCWlmIChpbnRzWzFdICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gaW50c1sxXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJ0aXBhcjogYmFkIHRpbWVvdXQgdmFsdWUgKDApLCAiCisJCQkJInVzaW5nIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCIpOworCQlpZiAoaW50c1swXSA+IDEpIHsKKwkJCWRlbGF5ID0gaW50c1syXTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorI2VuZGlmCisKKy8qCisgKiBSZWdpc3RlciBvdXIgbW9kdWxlIGludG8gcGFycG9ydC4KKyAqIFBhc3MgYWxzbyAyIGNhbGxiYWNrcyBmdW5jdGlvbnMgdG8gcGFycG9ydDogYSBwcmUtZW1wdGl2ZSBmdW5jdGlvbiBhbmQgYW4KKyAqIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uICh1bnVzZWQpLgorICogRGlzcGxheSBhIG1lc3NhZ2Ugc3VjaCAidGlwYXIwOiB1c2luZyBwYXJwb3J0MCAocG9sbGluZykiLgorICovCitzdGF0aWMgaW50Cit0aXBhcl9yZWdpc3RlcihpbnQgbnIsIHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWludCBlcnIgPSAwOworCisJLyogUmVnaXN0ZXIgb3VyIG1vZHVsZSBpbnRvIHBhcnBvcnQgKi8KKwl0YWJsZVtucl0uZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgInRpcGFyIiwKKwkJCQkJCU5VTEwsIE5VTEwsIE5VTEwsIDAsCisJCQkJCQkodm9pZCAqKSAmdGFibGVbbnJdKTsKKworCWlmICh0YWJsZVtucl0uZGV2ID09IE5VTEwpIHsKKwkJZXJyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodGlwYXJfY2xhc3MsIE1LREVWKFRJUEFSX01BSk9SLAorCQkJVElQQVJfTUlOT1IgKyBuciksIE5VTEwsICJwYXIlZCIsIG5yKTsKKwkvKiBVc2UgZGV2ZnMsIHRyZWU6IC9kZXYvdGljYWJsZXMvcGFyL1swLi4yXSAqLworCWVyciA9IGRldmZzX21rX2NkZXYoTUtERVYoVElQQVJfTUFKT1IsIFRJUEFSX01JTk9SICsgbnIpLAorCQkJU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJInRpY2FibGVzL3Bhci8lZCIsIG5yKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbGFzczsKKworCS8qIERpc3BsYXkgaW5mb3JtYXRpb25zICovCisJcHJfaW5mbygidGlwYXIlZDogdXNpbmcgJXMgKCVzKVxuIiwgbnIsIHBvcnQtPm5hbWUsIChwb3J0LT5pcnEgPT0KKwkJUEFSUE9SVF9JUlFfTk9ORSkgPyAicG9sbGluZyIgOiAiaW50ZXJydXB0LWRyaXZlbiIpOworCisJaWYgKHByb2JlX3RpX3BhcmFsbGVsKG5yKSAhPSAtMSkKKwkJcHJfaW5mbygidGlwYXIlZDogbGluayBjYWJsZSBmb3VuZFxuIiwgbnIpOworCWVsc2UKKwkJcHJfaW5mbygidGlwYXIlZDogbGluayBjYWJsZSBub3QgZm91bmRcbiIsIG5yKTsKKworCWVyciA9IDA7CisJZ290byBvdXQ7CisKK291dF9jbGFzczoKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihUSVBBUl9NQUpPUiwgVElQQVJfTUlOT1IgKyBucikpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KHRpcGFyX2NsYXNzKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAordGlwYXJfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWlmICh0cF9jb3VudCA9PSBQUF9OTykgeworCQlwcl9pbmZvKCJ0aXBhcjogaWdub3JpbmcgcGFyYWxsZWwgcG9ydCAobWF4LiAlZClcbiIsIFBQX05PKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghdGlwYXJfcmVnaXN0ZXIodHBfY291bnQsIHBvcnQpKQorCQl0cF9jb3VudCsrOworfQorCitzdGF0aWMgdm9pZAordGlwYXJfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciB0aXBhcl9kcml2ZXIgPSB7CisJLm5hbWUgPSAidGlwYXIiLAorCS5hdHRhY2ggPSB0aXBhcl9hdHRhY2gsCisJLmRldGFjaCA9IHRpcGFyX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit0aXBhcl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCBlcnIgPSAwOworCisJcHJfaW5mbygidGlwYXI6IHBhcmFsbGVsIGxpbmsgY2FibGUgZHJpdmVyLCB2ZXJzaW9uICVzXG4iLAorCQlEUklWRVJfVkVSU0lPTik7CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KFRJUEFSX01BSk9SLCAidGlwYXIiLCAmdGlwYXJfZm9wcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0aXBhcjogdW5hYmxlIHRvIGdldCBtYWpvciAlZFxuIiwgVElQQVJfTUFKT1IpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBVc2UgZGV2ZnMgd2l0aCB0cmVlOiAvZGV2L3RpY2FibGVzL3Bhci9bMC4uMl0gKi8KKwlkZXZmc19ta19kaXIoInRpY2FibGVzL3BhciIpOworCisJdGlwYXJfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAidGljYWJsZXMiKTsKKwlpZiAoSVNfRVJSKHRpcGFyX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKHRpcGFyX2NsYXNzKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKwlpZiAocGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnRpcGFyX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0aXBhcjogdW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggcGFycG9ydFxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IDA7CisJZ290byBvdXQ7CisKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoVElQQVJfTUFKT1IsICJ0aXBhciIpOworb3V0OgorCXJldHVybiBlcnI7CQorfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3RpcGFyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBVbnJlZ2lzdGVyaW5nIG1vZHVsZSAqLworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnRpcGFyX2RyaXZlcik7CisKKwl1bnJlZ2lzdGVyX2NocmRldihUSVBBUl9NQUpPUiwgInRpcGFyIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUFBfTk87IGkrKykgeworCQlpZiAodGFibGVbaV0uZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZSh0YWJsZVtpXS5kZXYpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihUSVBBUl9NQUpPUiwgaSkpOworCQlkZXZmc19yZW1vdmUoInRpY2FibGVzL3Bhci8lZCIsIGkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveSh0aXBhcl9jbGFzcyk7CisJZGV2ZnNfcmVtb3ZlKCJ0aWNhYmxlcy9wYXIiKTsKKworCXByX2luZm8oInRpcGFyOiBtb2R1bGUgdW5sb2FkZWRcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworX19zZXR1cCgidGlwYXI9IiwgdGlwYXJfc2V0dXApOworbW9kdWxlX2luaXQodGlwYXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodGlwYXJfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKKworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJUaW1lb3V0IChkZWZhdWx0PTEuNSBzZWNvbmRzKSIpOworbW9kdWxlX3BhcmFtKGRlbGF5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWxheSwgIkludGVyLWJpdCBkZWxheSAoZGVmYXVsdD0xMCBtaWNyb3NlY29uZHMpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdG9zaGliYS5jIGIvZHJpdmVycy9jaGFyL3Rvc2hpYmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUyMWZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Rvc2hpYmEuYwpAQCAtMCwwICsxLDUzMiBAQAorLyogdG9zaGliYS5jIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gb24gVG9zaGliYSBsYXB0b3BzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDEgIEpvbmF0aGFuIEEuIEJ1enphcmQgKGpvbmF0aGFuQGJ1enphcmQub3JnLnVrKQorICoKKyAqIFZhbHVhYmxlIGFzc2lzdGFuY2UgYW5kIHBhdGNoZXMgZnJvbToKKyAqICAgICBUb20gTWF5IDx0b21AeW91LWJhc3RhcmRzLmNvbT4KKyAqICAgICBSb2IgTmFwaWVyIDxybmFwaWVyQGVtcGxveWVlcy5vcmc+CisgKgorICogRm4gc3RhdHVzIHBvcnQgbnVtYmVycyBmb3IgbWFjaGluZSBJRCdzIGNvdXJ0ZXN5IG9mCisgKiAgICAgMHhmYzAyOiBTY290dCBFaXNlcnQgPHNjb3R0LmVAc2t5LWV5ZS5jb20+CisgKiAgICAgMHhmYzA0OiBTdGV2ZSBWYW5EZXZlbmRlciA8c3RldmV2QGVmbi5vcmc+CisgKiAgICAgMHhmYzA4OiBHYXJ0aCBCZXJyeSA8Z2FydGhAaXRzYnJ1Y2UubmV0PgorICogICAgIDB4ZmMwYTogRWdiZXJ0IEVpY2ggPGVpY2hAeGZyZWU4Ni5vcmc+CisgKiAgICAgMHhmYzEwOiBBbmRyZXcgTG9mdGhvdXNlIDxBbmRyZXcuTG9mdGhvdXNlQHJvYmlucy5hZi5taWw+CisgKiAgICAgMHhmYzExOiBTcGVuY2VyIE9sc29uIDxzb2xzb25Abm92ZWxsLmNvbT4KKyAqICAgICAweGZjMTM6IENsYXVkaXVzIEZyYW5rZXdpdHogPGtyeXBAZ214LmRlPgorICogICAgIDB4ZmMxNTogVG9tIE1heSA8dG9tQHlvdS1iYXN0YXJkcy5jb20+CisgKiAgICAgMHhmYzE3OiBEYXZlIEtvbnJhZCA8a29ucmFkQHhlbmlhLml0PgorICogICAgIDB4ZmMxYTogR2VvcmdlIEJldHpvcyA8YmV0em9zQGVuZ3IuY29sb3N0YXRlLmVkdT4KKyAqICAgICAweGZjMWI6IE11bmVtYXNhIFdhZGEgPG11bmVtYXNhQGpub3ZlbC5jby5qcD4KKyAqICAgICAweGZjMWQ6IEFydGh1ciBMaXUgPGFybWllQHNsYXAubWluZS5udT4KKyAqICAgICAweGZjNWE6IEphY3F1ZXMgTCdoZWxnb3VhbGMnaCA8bGhoQGZyZWUuZnI+CisgKiAgICAgMHhmY2QxOiBNci4gRGF2ZSBLb25yYWQgPGtvbnJhZEB4ZW5pYS5pdD4KKyAqCisgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICoKKyAqICAgVGhpcyBjb2RlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHUEwgYW5kIHlvdSBhcmUgZnJlZSB0byBtYWtlIGFueQorICogICBjaGFuZ2VzIHlvdSB3aXNoIHRvIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZS4gSG93ZXZlciB0aGUKKyAqICAgY29kZSBoYXMgdGhlIHBvdGVudGlhbCB0byByZW5kZXIgeW91ciBjb21wdXRlciBhbmQvb3Igc29tZW9uZSBlbHNlJ3MKKyAqICAgdW51c2FibGUuIFBsZWFzZSBwcm9jZWVkIHdpdGggY2FyZSB3aGVuIG1vZGlmeWluZyB0aGUgY29kZS4KKyAqCisgKiBOb3RlOiBVbmZvcnR1bmF0ZWx5IHRoZSBsYXB0b3AgaGFyZHdhcmUgY2FuIGNsb3NlIHRoZSBTeXN0ZW0gQ29uZmlndXJhdGlvbgorICogICAgICAgSW50ZXJmYWNlIG9uIGl0J3Mgb3duIGFjY29yZC4gSXQgaXMgdGhlcmVmb3JlIG5lY2Vzc2FyeSBmb3IgKmFsbCoKKyAqICAgICAgIHByb2dyYW1zIHVzaW5nIHRoaXMgZHJpdmVyIHRvIGJlIGF3YXJlIHRoYXQgKmFueSogU0NJIGNhbGwgY2FuIGZhaWwgYXQKKyAqICAgICAgICphbnkqIHRpbWUuIEl0IGlzIHVwIHRvIGFueSBwcm9ncmFtIHRvIGJlIGF3YXJlIG9mIHRoaXMgZXZlbnR1YWxpdHkKKyAqICAgICAgIGFuZCB0YWtlIGFwcHJvcHJpYXRlIHN0ZXBzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgaW5mb3JtYXRpb24gdXNlZCB0byB3cml0ZSB0aGlzIGRyaXZlciBoYXMgYmVlbiBvYnRhaW5lZCBieSByZXZlcnNlCisgKiBlbmdpbmVlcmluZyB0aGUgc29mdHdhcmUgc3VwcGxpZWQgYnkgVG9zaGliYSBmb3IgdGhlaXIgcG9ydGFibGUgY29tcHV0ZXJzIGluCisgKiBzdHJpY3QgYWNjb3JkYW5jZSB3aXRoIHRoZSBFdXJvcGVhbiBDb3VuY2lsIERpcmVjdGl2ZSA5Mi8yNTAvRUVDIG9uIHRoZSBsZWdhbAorICogcHJvdGVjdGlvbiBvZiBjb21wdXRlciBwcm9ncmFtcywgYW5kIGl0J3MgaW1wbGVtZW50YXRpb24gaW50byBFbmdsaXNoIExhdyBieQorICogdGhlIENvcHlyaWdodCAoQ29tcHV0ZXIgUHJvZ3JhbXMpIFJlZ3VsYXRpb25zIDE5OTIgKFMuSS4gMTk5MiBOby4zMjMzKS4KKyAqCisgKi8KKworI2RlZmluZSBUT1NIX1ZFUlNJT04gIjEuMTEgMjYvOS8yMDAxIgorI2RlZmluZSBUT1NIX0RFQlVHIDAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSA8bGludXgvdG9zaGliYS5oPgorCisjZGVmaW5lIFRPU0hfTUlOT1JfREVWIDE4MQorCitzdGF0aWMgaW50IHRvc2hfaWQgPSAweDAwMDA7CitzdGF0aWMgaW50IHRvc2hfYmlvcyA9IDB4MDAwMDsKK3N0YXRpYyBpbnQgdG9zaF9kYXRlID0gMHgwMDAwOworc3RhdGljIGludCB0b3NoX3NjaSA9IDB4MDAwMDsKK3N0YXRpYyBpbnQgdG9zaF9mYW4gPSAwOworCitzdGF0aWMgaW50IHRvc2hfZm4gPSAwOworCittb2R1bGVfcGFyYW0odG9zaF9mbiwgaW50LCAwKTsKKworCitzdGF0aWMgaW50IHRvc2hfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKKwl1bnNpZ25lZCBsb25nKTsKKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0b3NoX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSB0b3NoX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHRvc2hfZGV2aWNlID0geworCVRPU0hfTUlOT1JfREVWLAorCSJ0b3NoaWJhIiwKKwkmdG9zaF9mb3BzCit9OworCisvKgorICogUmVhZCB0aGUgRm4ga2V5IHN0YXR1cworICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgdG9zaF9mbl9zdGF0dXModm9pZCkKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBzY2FuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodG9zaF9mbiE9MCkgeworCQlzY2FuID0gaW5iKHRvc2hfZm4pOworCX0gZWxzZSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJb3V0YigweDhlLCAweGU0KTsKKwkJc2NhbiA9IGluYigweGU1KTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworICAgICAgICByZXR1cm4gKGludCkgc2NhbjsKK30KKyNlbmRpZgorCisKKy8qCisgKiBGb3IgdGhlIFBvcnRhZ2UgNjEwQ1QgYW5kIHRoZSBUZWNyYSA3MDBDUy83MDBDRFQgZW11bGF0ZSB0aGUgSENJIGZhbiBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IHRvc2hfZW11bGF0ZV9mYW4oU01NUmVnaXN0ZXJzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZWF4LGVjeCxmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGFsOworCisJZWF4ID0gcmVncy0+ZWF4ICYgMHhmZjAwOworCWVjeCA9IHJlZ3MtPmVjeCAmIDB4ZmZmZjsKKworCS8qIFBvcnRhZ2UgNjEwQ1QgKi8KKworCWlmICh0b3NoX2lkPT0weGZjY2IpIHsKKwkJaWYgKGVheD09MHhmZTAwKSB7CisJCQkvKiBmYW4gc3RhdHVzICovCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlvdXRiKDB4YmUsIDB4ZTQpOworCQkJYWwgPSBpbmIoMHhlNSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZWdzLT5lYXggPSAweDAwOworCQkJcmVncy0+ZWN4ID0gKHVuc2lnbmVkIGludCkgKGFsICYgMHgwMSk7CisJCX0KKwkJaWYgKChlYXg9PTB4ZmYwMCkgJiYgKGVjeD09MHgwMDAwKSkgeworCQkJLyogZmFuIG9mZiAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJb3V0YigweGJlLCAweGU0KTsKKwkJCWFsID0gaW5iKDB4ZTUpOworCQkJb3V0YigweGJlLCAweGU0KTsKKwkJCW91dGIgKGFsIHwgMHgwMSwgMHhlNSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZWdzLT5lYXggPSAweDAwOworCQkJcmVncy0+ZWN4ID0gMHgwMDsKKwkJfQorCQlpZiAoKGVheD09MHhmZjAwKSAmJiAoZWN4PT0weDAwMDEpKSB7CisJCQkvKiBmYW4gb24gKi8KKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCW91dGIoMHhiZSwgMHhlNCk7CisJCQlhbCA9IGluYigweGU1KTsKKwkJCW91dGIoMHhiZSwgMHhlNCk7CisJCQlvdXRiKGFsICYgMHhmZSwgMHhlNSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZWdzLT5lYXggPSAweDAwOworCQkJcmVncy0+ZWN4ID0gMHgwMTsKKwkJfQorCX0KKworCS8qIFRlY3JhIDcwMENTL0NEVCAqLworCisJaWYgKHRvc2hfaWQ9PTB4ZmNjYykgeworCQlpZiAoZWF4PT0weGZlMDApIHsKKwkJCS8qIGZhbiBzdGF0dXMgKi8KKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCW91dGIoMHhlMCwgMHhlNCk7CisJCQlhbCA9IGluYigweGU1KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJlZ3MtPmVheCA9IDB4MDA7CisJCQlyZWdzLT5lY3ggPSBhbCAmIDB4MDE7CisJCX0KKwkJaWYgKChlYXg9PTB4ZmYwMCkgJiYgKGVjeD09MHgwMDAwKSkgeworCQkJLyogZmFuIG9mZiAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJb3V0YigweGUwLCAweGU0KTsKKwkJCWFsID0gaW5iKDB4ZTUpOworCQkJb3V0dygweGUwIHwgKChhbCAmIDB4ZmUpIDw8IDgpLCAweGU0KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJlZ3MtPmVheCA9IDB4MDA7CisJCQlyZWdzLT5lY3ggPSAweDAwOworCQl9CisJCWlmICgoZWF4PT0weGZmMDApICYmIChlY3g9PTB4MDAwMSkpIHsKKwkJCS8qIGZhbiBvbiAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJb3V0YigweGUwLCAweGU0KTsKKwkJCWFsID0gaW5iKDB4ZTUpOworCQkJb3V0dygweGUwIHwgKChhbCB8IDB4MDEpIDw8IDgpLCAweGU0KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJlZ3MtPmVheCA9IDB4MDA7CisJCQlyZWdzLT5lY3ggPSAweDAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFB1dCB0aGUgbGFwdG9wIGludG8gU3lzdGVtIE1hbmFnZW1lbnQgTW9kZQorICovCitpbnQgdG9zaF9zbW0oU01NUmVnaXN0ZXJzICpyZWdzKQoreworCWludCBlYXg7CisKKwlhc20gKCIjIGxvYWQgdGhlIHZhbHVlcyBpbnRvIHRoZSByZWdpc3RlcnNcblx0IiBcCisJCSJwdXNobCAlJWVheFxuXHQiIFwKKwkJIm1vdmwgMCglJWVheCksJSVlZHhcblx0IiBcCisJCSJwdXNoICUlZWR4XG5cdCIgXAorCQkibW92bCA0KCUlZWF4KSwlJWVieFxuXHQiIFwKKwkJIm1vdmwgOCglJWVheCksJSVlY3hcblx0IiBcCisJCSJtb3ZsIDEyKCUlZWF4KSwlJWVkeFxuXHQiIFwKKwkJIm1vdmwgMTYoJSVlYXgpLCUlZXNpXG5cdCIgXAorCQkibW92bCAyMCglJWVheCksJSVlZGlcblx0IiBcCisJCSJwb3BsICUlZWF4XG5cdCIgXAorCQkiIyBjYWxsIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBtb2RlXG5cdCIgXAorCQkiaW5iICQweGIyLCUlYWxcblx0IgorCQkiIyBmaWxsIG91dCB0aGUgbWVtb3J5IHdpdGggdGhlIHZhbHVlcyBpbiB0aGUgcmVnaXN0ZXJzXG5cdCIgXAorCQkieGNoZ2wgJSVlYXgsKCUlZXNwKVxuXHQiCisJCSJtb3ZsICUlZWJ4LDQoJSVlYXgpXG5cdCIgXAorCQkibW92bCAlJWVjeCw4KCUlZWF4KVxuXHQiIFwKKwkJIm1vdmwgJSVlZHgsMTIoJSVlYXgpXG5cdCIgXAorCQkibW92bCAlJWVzaSwxNiglJWVheClcblx0IiBcCisJCSJtb3ZsICUlZWRpLDIwKCUlZWF4KVxuXHQiIFwKKwkJInBvcGwgJSVlZHhcblx0IiBcCisJCSJtb3ZsICUlZWR4LDAoJSVlYXgpXG5cdCIgXAorCQkiIyBzZXR1cCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBjYXJyeSBmbGFnXG5cdCIgXAorCQkibGFoZlxuXHQiIFwKKwkJInNocmwgJDgsJSVlYXhcblx0IiBcCisJCSJhbmRsICQxLCUlZWF4XG4iIFwKKwkJOiAiPWEiIChlYXgpCisJCTogImEiIChyZWdzKQorCQk6ICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gZWF4OworfQorCisKK3N0YXRpYyBpbnQgdG9zaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJU01NUmVnaXN0ZXJzIHJlZ3M7CisJU01NUmVnaXN0ZXJzIF9fdXNlciAqYXJncCA9IChTTU1SZWdpc3RlcnMgX191c2VyICopYXJnOworCXVuc2lnbmVkIHNob3J0IGF4LGJ4OworCWludCBlcnI7CisKKwlpZiAoIWFyZ3ApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWdzLCBhcmdwLCBzaXplb2YoU01NUmVnaXN0ZXJzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBUT1NIX1NNTToKKwkJCWF4ID0gcmVncy5lYXggJiAweGZmMDA7CisJCQlieCA9IHJlZ3MuZWJ4ICYgMHhmZmZmOworCQkJLyogYmxvY2sgSENJIGNhbGxzIHRvIHJlYWQvd3JpdGUgbWVtb3J5ICYgUENJIGRldmljZXMgKi8KKwkJCWlmICgoKGF4PT0weGZmMDApIHx8IChheD09MHhmZTAwKSkgJiYgKGJ4PjB4MDA2OSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIGRvIHdlIG5lZWQgdG8gZW11bGF0ZSB0aGUgZmFuID8gKi8KKwkJCWlmICh0b3NoX2Zhbj09MSkgeworCQkJCWlmICgoKGF4PT0weGYzMDApIHx8IChheD09MHhmNDAwKSkgJiYgKGJ4PT0weDAwMDQpKSB7CisJCQkJCWVyciA9IHRvc2hfZW11bGF0ZV9mYW4oJnJlZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQllcnIgPSB0b3NoX3NtbSgmcmVncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZyZWdzLCBzaXplb2YoU01NUmVnaXN0ZXJzKSkpCisgICAgICAgIAlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAoZXJyPT0wKSA/IDA6LUVJTlZBTDsKK30KKworCisvKgorICogUHJpbnQgdGhlIGluZm9ybWF0aW9uIGZvciAvcHJvYy90b3NoaWJhCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCB0b3NoX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKQoreworCWNoYXIgKnRlbXA7CisJaW50IGtleTsKKworCXRlbXAgPSBidWZmZXI7CisJa2V5ID0gdG9zaF9mbl9zdGF0dXMoKTsKKworCS8qIEFyZ3VtZW50cworCSAgICAgMCkgTGludXggZHJpdmVyIHZlcnNpb24gKHRoaXMgd2lsbCBjaGFuZ2UgaWYgZm9ybWF0IGNoYW5nZXMpCisJICAgICAxKSBNYWNoaW5lIElECisJICAgICAyKSBTQ0kgdmVyc2lvbgorCSAgICAgMykgQklPUyB2ZXJzaW9uIChtYWpvciwgbWlub3IpCisJICAgICA0KSBCSU9TIGRhdGUgKGluIFNDSSBkYXRlIGZvcm1hdCkKKwkgICAgIDUpIEZuIEtleSBzdGF0dXMKKwkqLworCisJdGVtcCArPSBzcHJpbnRmKHRlbXAsICIxLjEgMHglMDR4ICVkLiVkICVkLiVkIDB4JTA0eCAweCUwMnhcbiIsCisJCXRvc2hfaWQsCisJCSh0b3NoX3NjaSAmIDB4ZmYwMCk+PjgsCisJCXRvc2hfc2NpICYgMHhmZiwKKwkJKHRvc2hfYmlvcyAmIDB4ZmYwMCk+PjgsCisJCXRvc2hfYmlvcyAmIDB4ZmYsCisJCXRvc2hfZGF0ZSwKKwkJa2V5KTsKKworCXJldHVybiB0ZW1wLWJ1ZmZlcjsKK30KKyNlbmRpZgorCisKKy8qCisgKiBEZXRlcm1pbmUgd2hpY2ggcG9ydCB0byB1c2UgZm9yIHRoZSBGbiBrZXkgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIHRvc2hfc2V0X2ZuX3BvcnQodm9pZCkKK3sKKwlzd2l0Y2ggKHRvc2hfaWQpIHsKKwkJY2FzZSAweGZjMDI6IGNhc2UgMHhmYzA0OiBjYXNlIDB4ZmMwOTogY2FzZSAweGZjMGE6IGNhc2UgMHhmYzEwOgorCQljYXNlIDB4ZmMxMTogY2FzZSAweGZjMTM6IGNhc2UgMHhmYzE1OiBjYXNlIDB4ZmMxYTogY2FzZSAweGZjMWI6CisJCWNhc2UgMHhmYzVhOgorCQkJdG9zaF9mbiA9IDB4NjI7CisJCQlicmVhazsKKwkJY2FzZSAweGZjMDg6IGNhc2UgMHhmYzE3OiBjYXNlIDB4ZmMxZDogY2FzZSAweGZjZDE6IGNhc2UgMHhmY2UwOgorCQljYXNlIDB4ZmNlMjoKKwkJCXRvc2hfZm4gPSAweDY4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0b3NoX2ZuID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworCisvKgorICogR2V0IHRoZSBtYWNoaW5lIGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiB0aGUgY3VycmVudCBtb2RlbAorICovCitzdGF0aWMgaW50IHRvc2hfZ2V0X21hY2hpbmVfaWQodm9pZCkKK3sKKwlpbnQgaWQ7CisJU01NUmVnaXN0ZXJzIHJlZ3M7CisJdW5zaWduZWQgc2hvcnQgYngsY3g7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCisJaWQgPSAoMHgxMDAqKGludCkgaXNhX3JlYWRiKDB4ZmZmZmUpKSsoKGludCkgaXNhX3JlYWRiKDB4ZmZmZmEpKTsKKwkKKwkvKiBkbyB3ZSBoYXZlIGEgU0NUVGFibGUgbWFjaGluZSBpZGVudGljYXRpb24gbnVtYmVyIG9uIG91ciBoYW5kcyAqLworCisJaWYgKGlkPT0weGZjMmYpIHsKKworCQkvKiBzdGFydCBieSBnZXR0aW5nIGEgcG9pbnRlciBpbnRvIHRoZSBCSU9TICovCisKKwkJcmVncy5lYXggPSAweGMwMDA7CisJCXJlZ3MuZWJ4ID0gMHgwMDAwOworCQlyZWdzLmVjeCA9IDB4MDAwMDsKKwkJdG9zaF9zbW0oJnJlZ3MpOworCQlieCA9ICh1bnNpZ25lZCBzaG9ydCkgKHJlZ3MuZWJ4ICYgMHhmZmZmKTsKKworCQkvKiBBdCB0aGlzIHBvaW50IGluIHRoZSBUb3NoaWJhIHJvdXRpbmVzIHVuZGVyIE1TIFdpbmRvd3MKKwkJICAgdGhlIGJ4IHJlZ2lzdGVyIGhvbGRzIDB4ZTZmNS4gSG93ZXZlciBteSBjb2RlIGlzIHByb2R1Y2luZworCQkgICBhIGRpZmZlcmVudCB2YWx1ZSEgRm9yIHRoZSB0aW1lIGJlaW5nIEkgd2lsbCBqdXN0IGZ1ZGdlIHRoZQorCQkgICB2YWx1ZS4gVGhpcyBoYXMgYmVlbiB2ZXJpZmllZCBvbiBhIFNhdGVsbGl0ZSBQcm8gNDMwQ0RULAorCQkgICBUZWNyYSA3NTBDRFQsIFRlY3JhIDc4MERWRCBhbmQgU2F0ZWxsaXRlIDMxMENEVC4gKi8KKyNpZiBUT1NIX0RFQlVHCisJCXByaW50aygidG9zaGliYTogZGVidWdnaW5nIElEIGVieD0weCUwNHhcbiIsIHJlZ3MuZWJ4KTsKKyNlbmRpZgorCQlieCA9IDB4ZTZmNTsKKworCQkvKiBub3cgdHdpZGRsZSB3aXRoIG91ciBwb2ludGVyIGEgYml0ICovCisKKwkJYWRkcmVzcyA9IDB4MDAwZjAwMDArYng7CisJCWN4ID0gaXNhX3JlYWR3KGFkZHJlc3MpOworCQlhZGRyZXNzID0gMHgwMDBmMDAwOStieCtjeDsKKwkJY3ggPSBpc2FfcmVhZHcoYWRkcmVzcyk7CisJCWFkZHJlc3MgPSAweDAwMGYwMDBhK2N4OworCQljeCA9IGlzYV9yZWFkdyhhZGRyZXNzKTsKKworCQkvKiBub3cgY29uc3RydWN0IG91ciBtYWNoaW5lIGlkZW50aWZpY2F0aW9uIG51bWJlciAqLworCisJCWlkID0gKChjeCAmIDB4ZmYpPDw4KSsoKGN4ICYgMHhmZjAwKT4+OCk7CisJfQorCisJcmV0dXJuIGlkOworfQorCisKKy8qCisgKiBQcm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIGEgVG9zaGliYSBsYXB0b3AKKyAqCisgKiAgIHJldHVybnMgYW5kIG5vbi16ZXJvIGlmIHVuYWJsZSB0byBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIGEgVG9zaGliYQorICogICBsYXB0b3AsIG90aGVyd2lzZSB6ZXJvIGFuZCBkZXRlcm1pbmVzIHRoZSBNYWNoaW5lIElELCBCSU9TIHZlcnNpb24gYW5kCisgKiAgIGRhdGUsIGFuZCBTQ0kgdmVyc2lvbi4KKyAqLworc3RhdGljIGludCB0b3NoX3Byb2JlKHZvaWQpCit7CisJaW50IGksbWFqb3IsbWlub3IsZGF5LHllYXIsbW9udGgsZmxhZzsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVs3XSA9IHsgMHg1NCwweDRmLDB4NTMsMHg0OCwweDQ5LDB4NDIsMHg0MSB9OworCVNNTVJlZ2lzdGVycyByZWdzOworCisJLyogZXh0cmEgc2FuaXR5IGNoZWNrIGZvciB0aGUgc3RyaW5nICJUT1NISUJBIiBpbiB0aGUgQklPUyBiZWNhdXNlCisJICAgc29tZSBtYWNoaW5lcyB0aGF0IGFyZSBub3QgVG9zaGliYSdzIHBhc3MgdGhlIG5leHQgdGVzdCAqLworCisJZm9yIChpPTA7aTw3O2krKykgeworCQlpZiAoaXNhX3JlYWRiKDB4ZmUwMTAraSkhPXNpZ25hdHVyZVtpXSkgeworCQkJcHJpbnRrKCJ0b3NoaWJhOiBub3QgYSBzdXBwb3J0ZWQgVG9zaGliYSBsYXB0b3BcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwkvKiBjYWxsIHRoZSBUb3NoaWJhIFNDSSBzdXBwb3J0IGNoZWNrIHJvdXRpbmUgKi8KKwkKKwlyZWdzLmVheCA9IDB4ZjBmMDsKKwlyZWdzLmVieCA9IDB4MDAwMDsKKwlyZWdzLmVjeCA9IDB4MDAwMDsKKwlmbGFnID0gdG9zaF9zbW0oJnJlZ3MpOworCisJLyogaWYgdGhpcyBpcyBub3QgYSBUb3NoaWJhIGxhcHRvcCBjYXJyeSBmbGFnIGlzIHNldCBhbmQgYWg9MHg4NiAqLworCisJaWYgKChmbGFnPT0xKSB8fCAoKHJlZ3MuZWF4ICYgMHhmZjAwKT09MHg4NjAwKSkgeworCQlwcmludGsoInRvc2hpYmE6IG5vdCBhIHN1cHBvcnRlZCBUb3NoaWJhIGxhcHRvcFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGlmIHdlIGdldCB0aGlzIGZhciB0aGVuIHdlIGFyZSBydW5uaW5nIG9uIGEgVG9zaGliYSAocHJvYmFibHkpISAqLworCisJdG9zaF9zY2kgPSByZWdzLmVkeCAmIDB4ZmZmZjsKKwkKKwkvKiBuZXh0IGdldCB0aGUgbWFjaGluZSBJRCBvZiB0aGUgY3VycmVudCBsYXB0b3AgKi8KKworCXRvc2hfaWQgPSB0b3NoX2dldF9tYWNoaW5lX2lkKCk7CisKKwkvKiBnZXQgdGhlIEJJT1MgdmVyc2lvbiAqLworCisJbWFqb3IgPSBpc2FfcmVhZGIoMHhmZTAwOSktJzAnOworCW1pbm9yID0gKChpc2FfcmVhZGIoMHhmZTAwYiktJzAnKSoxMCkrKGlzYV9yZWFkYigweGZlMDBjKS0nMCcpOworCXRvc2hfYmlvcyA9IChtYWpvcioweDEwMCkrbWlub3I7CisKKwkvKiBnZXQgdGhlIEJJT1MgZGF0ZSAqLworCisJZGF5ID0gKChpc2FfcmVhZGIoMHhmZmZmNSktJzAnKSoxMCkrKGlzYV9yZWFkYigweGZmZmY2KS0nMCcpOworCW1vbnRoID0gKChpc2FfcmVhZGIoMHhmZmZmOCktJzAnKSoxMCkrKGlzYV9yZWFkYigweGZmZmY5KS0nMCcpOworCXllYXIgPSAoKGlzYV9yZWFkYigweGZmZmZiKS0nMCcpKjEwKSsoaXNhX3JlYWRiKDB4ZmZmZmMpLScwJyk7CisJdG9zaF9kYXRlID0gKCgoeWVhci05MCkgJiAweDFmKTw8MTApIHwgKChtb250aCAmIDB4Zik8PDYpCisJCXwgKChkYXkgJiAweDFmKTw8MSk7CisKKworCS8qIGluIHRoZW9yeSB3ZSBzaG91bGQgY2hlY2sgdGhlIHBvcnRzIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yIHRoZQorCSAgIGZuIGtleSBkZXRlY3Rpb24gKGFuZCB0aGUgZmFuIG9uIHRoZSBQb3J0YWdlIDYxMC9UZWNyYTcwMCksIGFuZAorCSAgIHRoZW4gcmVxdWVzdCB0aGVtIHRvIHN0b3Agb3RoZXIgZHJpdmVycyB1c2luZyB0aGVtLiBIb3dldmVyIGFzCisJICAgdGhlIGtleWJvYXJkIGRyaXZlciBncmFicyAweDYwLTB4NmYgYW5kIHRoZSBwaWMgZHJpdmVyIGdyYWJzCisJICAgMHhhMC0weGJmIHdlIGNhbid0LiBXZSBqdXN0IGhhdmUgdG8gbGl2ZSBkYW5nZXJvdXNseSBhbmQgdXNlIHRoZQorCSAgIHBvcnRzIGFueXdheSwgb2ggYm95ISAqLworCisJLyogZG8gd2UgbmVlZCB0byBlbXVsYXRlIHRoZSBmYW4/ICovCisKKwlpZiAoKHRvc2hfaWQ9PTB4ZmNjYikgfHwgKHRvc2hfaWQ9PTB4ZmNjYykpCisJCXRvc2hfZmFuID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IHRvc2hfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisJLyogYXJlIHdlIHJ1bm5pbmcgb24gYSBUb3NoaWJhIGxhcHRvcCAqLworCisJaWYgKHRvc2hfcHJvYmUoKSE9MCkKKwkJcmV0dXJuIC1FSU87CisKKwlwcmludGsoS0VSTl9JTkZPICJUb3NoaWJhIFN5c3RlbSBNYW5hZ21lbnQgTW9kZSBkcml2ZXIgdiIKKwkJVE9TSF9WRVJTSU9OIlxuIik7CisKKwkvKiBzZXQgdGhlIHBvcnQgdG8gdXNlIGZvciBGbiBzdGF0dXMgaWYgbm90IHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlciAqLworCWlmICh0b3NoX2ZuPT0weDAwKQorCQl0b3NoX3NldF9mbl9wb3J0KCk7CisKKwkvKiByZWdpc3RlciB0aGUgZGV2aWNlIGZpbGUgKi8KKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZ0b3NoX2RldmljZSk7CisJaWYocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJLyogcmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KKwlpZihjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJ0b3NoaWJhIiwgMCwgTlVMTCwgdG9zaF9nZXRfaW5mbykgPT0gTlVMTCl7CisJCW1pc2NfZGVyZWdpc3RlcigmdG9zaF9kZXZpY2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gdG9zaF9pbml0KCk7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwkvKiByZW1vdmUgdGhlIHByb2MgZW50cnkgKi8KKworCXJlbW92ZV9wcm9jX2VudHJ5KCJ0b3NoaWJhIiwgTlVMTCk7CisKKwkvKiB1bnJlZ2lzdGVyIHRoZSBkZXZpY2UgZmlsZSAqLworCisJbWlzY19kZXJlZ2lzdGVyKCZ0b3NoX2RldmljZSk7Cit9CisjZW5kaWYKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1BBUk1fREVTQyh0b3NoX2ZuLCAiVXNlciBzcGVjaWZpZWQgRm4ga2V5IGRldGVjdGlvbiBwb3J0Iik7CitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBCdXp6YXJkIDxqb25hdGhhbkBidXp6YXJkLm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVG9zaGliYSBsYXB0b3AgU01NIGRyaXZlciIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInRvc2hpYmEiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTY5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKQEAgLTAsMCArMSwzOSBAQAorIworIyBUUE0gZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiVFBNIGRldmljZXMiCisKK2NvbmZpZyBUQ0dfVFBNCisJdHJpc3RhdGUgIlRQTSBIYXJkd2FyZSBTdXBwb3J0IgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgaW4geW91ciBzeXN0ZW0sIHdoaWNoCisJICBpbXBsZW1lbnRzIHRoZSBUcnVzdGVkIENvbXB1dGluZyBHcm91cCdzIHNwZWNpZmljYXRpb24sCisJICBzYXkgWWVzIGFuZCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguICBGb3IKKwkgIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxodHRwOi8vd3d3LnRydXN0ZWRjb21wdXRpbmdncm91cC5vcmc+LiAKKwkgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUcnVzdGVkIFNvZnR3YXJlIFN0YWNrIChUU1MpLCB0aGUgCisJICB1c2Vyc3BhY2UgZW5hYmxlbWVudCBwaWVjZSBvZiB0aGUgc3BlY2lmaWNhdGlvbiwgY2FuIGJlIAorCSAgb2J0YWluZWQgYXQ6IDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3Ryb3VzZXJzPi4gIFRvIAorCSAgY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTsgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIHRwbS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFRDR19OU0MKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBUUE0gSW50ZXJmYWNlIgorCWRlcGVuZHMgb24gVENHX1RQTQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgZnJvbSBOYXRpb25hbCBTZW1pY29uZHV0b3IgCisJICBzYXkgWWVzIGFuZCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguICBUbyAKKwkgIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU7IHRoZSBtb2R1bGUgCisJICB3aWxsIGJlIGNhbGxlZCB0cG1fbnNjLgorCitjb25maWcgVENHX0FUTUVMCisJdHJpc3RhdGUgIkF0bWVsIFRQTSBJbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBUQ0dfVFBNCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBmcm9tIEF0bWVsIHNheSBZZXMgYW5kIGl0IAorCSAgd2lsbCBiZSBhY2Nlc3NpYmxlIGZyb20gd2l0aGluIExpbnV4LiAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciAKKwkgIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRwbV9hdG1lbC4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3RwbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZkM2RmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgdHBtIGRldmljZSBkcml2ZXJzLgorIworb2JqLSQoQ09ORklHX1RDR19UUE0pICs9IHRwbS5vCitvYmotJChDT05GSUdfVENHX05TQykgKz0gdHBtX25zYy5vCitvYmotJChDT05GSUdfVENHX0FUTUVMKSArPSB0cG1fYXRtZWwubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzE4MjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwpAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBdXRob3JzOgorICogTGVlbmRlcnQgdmFuIERvb3JuIDxsZWVuZGVydEB3YXRzb24uaWJtLmNvbT4KKyAqIERhdmUgU2FmZm9yZCA8c2FmZm9yZEB3YXRzb24uaWJtLmNvbT4KKyAqIFJlaW5lciBTYWlsZXIgPHNhaWxlckB3YXRzb24uaWJtLmNvbT4KKyAqIEt5bGVuZSBIYWxsIDxramhhbGxAdXMuaWJtLmNvbT4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiA8dHBtZGRfZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIERldmljZSBkcml2ZXIgZm9yIFRDRy9UQ1BBIFRQTSAodHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUpLgorICogU3BlY2lmaWNhdGlvbnMgYXQgd3d3LnRydXN0ZWRjb21wdXRpbmdncm91cC5vcmcJIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqIAorICogTm90ZSwgdGhlIFRQTSBjaGlwIGlzIG5vdCBpbnRlcnJ1cHQgZHJpdmVuIChvbmx5IHBvbGxpbmcpCisgKiBhbmQgY2FuIGhhdmUgdmVyeSBsb25nIHRpbWVvdXRzIChtaW51dGVzISkuIEhlbmNlIHRoZSB1bnVzdWFsCisgKiBjYWxscyB0byBzY2hlZHVsZV90aW1lb3V0LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJ0cG0uaCIKKworI2RlZmluZQlUUE1fTUlOT1IJCQkyMjQJLyogb2ZmaWNpYWxseSBhc3NpZ25lZCAqLworCisjZGVmaW5lCVRQTV9CVUZTSVpFCQkJMjA0OAorCisvKiBQQ0kgY29uZmlndXJhdGlvbiBhZGRyZXNzZXMgKi8KKyNkZWZpbmUJUENJX0dFTl9QTUNPTl8xCQkJMHhBMAorI2RlZmluZQlQQ0lfR0VOMV9ERUMJCQkweEU0CisjZGVmaW5lCVBDSV9MUENfRU4JCQkweEU2CisjZGVmaW5lCVBDSV9HRU4yX0RFQwkJCTB4RUMKKworc3RhdGljIExJU1RfSEVBRCh0cG1fY2hpcF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHJpdmVyX2xvY2spOworc3RhdGljIGludCBkZXZfbWFza1szMl07CisKK3N0YXRpYyB2b2lkIHVzZXJfcmVhZGVyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwdHIpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gKHN0cnVjdCB0cG1fY2hpcCAqKSBwdHI7CisKKwlkb3duKCZjaGlwLT5idWZmZXJfbXV0ZXgpOworCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7CisJbWVtc2V0KGNoaXAtPmRhdGFfYnVmZmVyLCAwLCBUUE1fQlVGU0laRSk7CisJdXAoJmNoaXAtPmJ1ZmZlcl9tdXRleCk7Cit9CisKK3ZvaWQgdHBtX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwlpbnQgKmV4cCA9IChpbnQgKikgcHRyOworCSpleHAgPSAxOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fdGltZV9leHBpcmVkKTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIExQQyBidXMgYW5kIGVuYWJsZSB0aGUgVFBNIHBvcnRzCisgKi8KK2ludCB0cG1fbHBjX2J1c19pbml0KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCB1MTYgYmFzZSkKK3sKKwl1MzIgbHBjZW5hYmxlLCB0bXA7CisJaW50IGlzX2xwY20gPSAwOworCisJc3dpdGNoIChwY2lfZGV2LT52ZW5kb3IpIHsKKwljYXNlIFBDSV9WRU5ET1JfSURfSU5URUw6CisJCXN3aXRjaCAocGNpX2Rldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEyOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMjoKKwkJCWlzX2xwY20gPSAxOworCQkJYnJlYWs7CisJCX0KKwkJLyogaW5pdCBJQ0ggKGVuYWJsZSBMUEMpICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOMV9ERUMsICZscGNlbmFibGUpOworCQlscGNlbmFibGUgfD0gMHgyMDAwMDAwMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOMV9ERUMsIGxwY2VuYWJsZSk7CisKKwkJaWYgKGlzX2xwY20pIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOMV9ERUMsCisJCQkJCSAgICAgICZscGNlbmFibGUpOworCQkJaWYgKChscGNlbmFibGUgJiAweDIwMDAwMDAwKSA9PSAwKSB7CisJCQkJZGV2X2VycigmcGNpX2Rldi0+ZGV2LAorCQkJCQkiY2Fubm90IGVuYWJsZSBMUENcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9CisKKwkJLyogaW5pdGlhbGl6ZSBUUE0gcmVnaXN0ZXJzICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOMl9ERUMsICZ0bXApOworCisJCWlmICghaXNfbHBjbSkKKwkJCXRtcCA9ICh0bXAgJiAweEZGRkYwMDAwKSB8IChiYXNlICYgMHhGRkYwKTsKKwkJZWxzZQorCQkJdG1wID0KKwkJCSAgICAodG1wICYgMHhGRkZGMDAwMCkgfCAoYmFzZSAmIDB4RkZGMCkgfAorCQkJICAgIDB4MDAwMDAwMDE7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOMl9ERUMsIHRtcCk7CisKKwkJaWYgKGlzX2xwY20pIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOX1BNQ09OXzEsCisJCQkJCSAgICAgICZ0bXApOworCQkJdG1wIHw9IDB4MDAwMDAwMDQ7CS8qIGVuYWJsZSBDTEtSVU4gKi8KKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgUENJX0dFTl9QTUNPTl8xLAorCQkJCQkgICAgICAgdG1wKTsKKwkJfQorCQl0cG1fd3JpdGVfaW5kZXgoMHgwRCwgMHg1NSk7CS8qIHVubG9jayA0RiAqLworCQl0cG1fd3JpdGVfaW5kZXgoMHgwQSwgMHgwMCk7CS8qIGludCBkaXNhYmxlICovCisJCXRwbV93cml0ZV9pbmRleCgweDA4LCBiYXNlKTsJLyogYmFzZSBhZGRyIGxvICovCisJCXRwbV93cml0ZV9pbmRleCgweDA5LCAoYmFzZSAmIDB4RkYwMCkgPj4gOCk7CS8qIGJhc2UgYWRkciBoaSAqLworCQl0cG1fd3JpdGVfaW5kZXgoMHgwRCwgMHhBQSk7CS8qIGxvY2sgNEYgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfVkVORE9SX0lEX0FNRDoKKwkJLyogbm90aGluZyB5ZXQgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9scGNfYnVzX2luaXQpOworCisvKgorICogSW50ZXJuYWwga2VybmVsIGludGVyZmFjZSB0byB0cmFuc21pdCBUUE0gY29tbWFuZHMKKyAqLworc3RhdGljIHNzaXplX3QgdHBtX3RyYW5zbWl0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBidWZzaXopCit7CisJc3NpemVfdCBsZW47CisJdTMyIGNvdW50OworCV9fYmUzMiAqbmF0aXZlX3NpemU7CisKKwluYXRpdmVfc2l6ZSA9IChfX2ZvcmNlIF9fYmUzMiAqKSAoYnVmICsgMik7CisJY291bnQgPSBiZTMyX3RvX2NwdSgqbmF0aXZlX3NpemUpOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAtRU5PREFUQTsKKwlpZiAoY291bnQgPiBidWZzaXopIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJImludmFsaWQgY291bnQgdmFsdWUgJXggJXggXG4iLCBjb3VudCwgYnVmc2l6KTsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwlkb3duKCZjaGlwLT50cG1fbXV0ZXgpOworCisJaWYgKChsZW4gPSBjaGlwLT52ZW5kb3ItPnNlbmQoY2hpcCwgKHU4ICopIGJ1ZiwgY291bnQpKSA8IDApIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJInRwbV90cmFuc21pdDogdHBtX3NlbmQ6IGVycm9yICVkXG4iLCBsZW4pOworCQlyZXR1cm4gbGVuOworCX0KKworCWRvd24oJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisJY2hpcC0+dGltZV9leHBpcmVkID0gMDsKKwlpbml0X3RpbWVyKCZjaGlwLT5kZXZpY2VfdGltZXIpOworCWNoaXAtPmRldmljZV90aW1lci5mdW5jdGlvbiA9IHRwbV90aW1lX2V4cGlyZWQ7CisJY2hpcC0+ZGV2aWNlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMiAqIDYwICogSFo7CisJY2hpcC0+ZGV2aWNlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgJmNoaXAtPnRpbWVfZXhwaXJlZDsKKwlhZGRfdGltZXIoJmNoaXAtPmRldmljZV90aW1lcik7CisJdXAoJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisKKwlkbyB7CisJCXU4IHN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKKwkJaWYgKChzdGF0dXMgJiBjaGlwLT52ZW5kb3ItPnJlcV9jb21wbGV0ZV9tYXNrKSA9PQorCQkgICAgY2hpcC0+dmVuZG9yLT5yZXFfY29tcGxldGVfdmFsKSB7CisJCQlkb3duKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+ZGV2aWNlX3RpbWVyKTsKKwkJCXVwKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCQkJZ290byBvdXRfcmVjdjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoVFBNX1RJTUVPVVQpOworCQlybWIoKTsKKwl9IHdoaWxlICghY2hpcC0+dGltZV9leHBpcmVkKTsKKworCisJY2hpcC0+dmVuZG9yLT5jYW5jZWwoY2hpcCk7CisJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiVGltZSBleHBpcmVkXG4iKTsKKwl1cCgmY2hpcC0+dHBtX211dGV4KTsKKwlyZXR1cm4gLUVJTzsKKworb3V0X3JlY3Y6CisJbGVuID0gY2hpcC0+dmVuZG9yLT5yZWN2KGNoaXAsICh1OCAqKSBidWYsIGJ1ZnNpeik7CisJaWYgKGxlbiA8IDApCisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCSJ0cG1fdHJhbnNtaXQ6IHRwbV9yZWN2OiBlcnJvciAlZFxuIiwgbGVuKTsKKwl1cCgmY2hpcC0+dHBtX211dGV4KTsKKwlyZXR1cm4gbGVuOworfQorCisjZGVmaW5lIFRQTV9ESUdFU1RfU0laRSAyMAorI2RlZmluZSBDQVBfUENSX1JFU1VMVF9TSVpFIDE4CitzdGF0aWMgdTggY2FwX3BjcltdID0geworCTAsIDE5MywJCQkvKiBUUE1fVEFHX1JRVV9DT01NQU5EICovCisJMCwgMCwgMCwgMjIsCQkvKiBsZW5ndGggKi8KKwkwLCAwLCAwLCAxMDEsCQkvKiBUUE1fT1JEX0dldENhcGFiaWxpdHkgKi8KKwkwLCAwLCAwLCA1LAorCTAsIDAsIDAsIDQsCisJMCwgMCwgMSwgMQorfTsKKworI2RlZmluZSBSRUFEX1BDUl9SRVNVTFRfU0laRSAzMAorc3RhdGljIHU4IHBjcnJlYWRbXSA9IHsKKwkwLCAxOTMsCQkJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLworCTAsIDAsIDAsIDE0LAkJLyogbGVuZ3RoICovCisJMCwgMCwgMCwgMjEsCQkvKiBUUE1fT1JEX1BjclJlYWQgKi8KKwkwLCAwLCAwLCAwCQkvKiBQQ1IgaW5kZXggKi8KK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcGNycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwl1OCBkYXRhW1JFQURfUENSX1JFU1VMVF9TSVpFXTsKKwlzc2l6ZV90IGxlbjsKKwlpbnQgaSwgaiwgaW5kZXgsIG51bV9wY3JzOworCWNoYXIgKnN0ciA9IGJ1ZjsKKworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9CisJICAgIHBjaV9nZXRfZHJ2ZGF0YShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KSk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1jcHkoZGF0YSwgY2FwX3Bjciwgc2l6ZW9mKGNhcF9wY3IpKTsKKwlpZiAoKGxlbiA9IHRwbV90cmFuc21pdChjaGlwLCBkYXRhLCBzaXplb2YoZGF0YSkpKQorCSAgICA8IENBUF9QQ1JfUkVTVUxUX1NJWkUpCisJCXJldHVybiBsZW47CisKKwludW1fcGNycyA9IGJlMzJfdG9fY3B1KCooKF9fZm9yY2UgX19iZTMyICopIChkYXRhICsgMTQpKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BjcnM7IGkrKykgeworCQltZW1jcHkoZGF0YSwgcGNycmVhZCwgc2l6ZW9mKHBjcnJlYWQpKTsKKwkJaW5kZXggPSBjcHVfdG9fYmUzMihpKTsKKwkJbWVtY3B5KGRhdGEgKyAxMCwgJmluZGV4LCA0KTsKKwkJaWYgKChsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgZGF0YSwgc2l6ZW9mKGRhdGEpKSkKKwkJICAgIDwgUkVBRF9QQ1JfUkVTVUxUX1NJWkUpCisJCQlyZXR1cm4gbGVuOworCQlzdHIgKz0gc3ByaW50ZihzdHIsICJQQ1ItJTAyZDogIiwgaSk7CisJCWZvciAoaiA9IDA7IGogPCBUUE1fRElHRVNUX1NJWkU7IGorKykKKwkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiUwMlggIiwgKihkYXRhICsgMTAgKyBqKSk7CisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7CisJfQorCXJldHVybiBzdHIgLSBidWY7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihwY3JzLCBTX0lSVUdPLCBzaG93X3BjcnMsIE5VTEwpOworCisjZGVmaW5lICBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFIDMxNAorc3RhdGljIHU4IHJlYWRwdWJla1tdID0geworCTAsIDE5MywJCQkvKiBUUE1fVEFHX1JRVV9DT01NQU5EICovCisJMCwgMCwgMCwgMzAsCQkvKiBsZW5ndGggKi8KKwkwLCAwLCAwLCAxMjQsCQkvKiBUUE1fT1JEX1JlYWRQdWJlayAqLworfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wdWJlayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwl1OCBkYXRhW1JFQURfUFVCRUtfUkVTVUxUX1NJWkVdOworCXNzaXplX3QgbGVuOworCV9fYmUzMiAqbmF0aXZlX3ZhbDsKKwlpbnQgaTsKKwljaGFyICpzdHIgPSBidWY7CisKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPQorCSAgICBwY2lfZ2V0X2RydmRhdGEoY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldikpOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJbWVtY3B5KGRhdGEsIHJlYWRwdWJlaywgc2l6ZW9mKHJlYWRwdWJlaykpOworCW1lbXNldChkYXRhICsgc2l6ZW9mKHJlYWRwdWJlayksIDAsIDIwKTsJLyogemVybyBub25jZSAqLworCisJaWYgKChsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPAorCSAgICBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFKQorCQlyZXR1cm4gbGVuOworCisJLyogCisJICAgaWdub3JlIGhlYWRlciAxMCBieXRlcworCSAgIGFsZ29yaXRobSAzMiBiaXRzICgxID09IFJTQSApCisJICAgZW5jc2NoZW1lIDE2IGJpdHMKKwkgICBzaWdzY2hlbWUgMTYgYml0cworCSAgIHBhcmFtZXRlcnMgKFJTQSAxMi0+Ynl0ZXM6IGtleWJpdCwgI3ByaW1lcywgZXhwYml0KSAgCisJICAga2V5bGVuYnl0ZXMgMzIgYml0cworCSAgIDI1NiBieXRlIG1vZHVsdXMKKwkgICBpZ25vcmUgY2hlY2tzdW0gMjAgYnl0ZXMKKwkgKi8KKworCW5hdGl2ZV92YWwgPSAoX19mb3JjZSBfX2JlMzIgKikgKGRhdGEgKyAzNCk7CisKKwlzdHIgKz0KKwkgICAgc3ByaW50ZihzdHIsCisJCSAgICAiQWxnb3JpdGhtOiAlMDJYICUwMlggJTAyWCAlMDJYXG5FbmNzY2hlbWU6ICUwMlggJTAyWFxuIgorCQkgICAgIlNpZ3NjaGVtZTogJTAyWCAlMDJYXG5QYXJhbWV0ZXJzOiAlMDJYICUwMlggJTAyWCAlMDJYIgorCQkgICAgIiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIKKwkJICAgICJNb2R1bHVzIGxlbmd0aDogJWRcbk1vZHVsdXM6IFxuIiwKKwkJICAgIGRhdGFbMTBdLCBkYXRhWzExXSwgZGF0YVsxMl0sIGRhdGFbMTNdLCBkYXRhWzE0XSwKKwkJICAgIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMjJdLCBkYXRhWzIzXSwKKwkJICAgIGRhdGFbMjRdLCBkYXRhWzI1XSwgZGF0YVsyNl0sIGRhdGFbMjddLCBkYXRhWzI4XSwKKwkJICAgIGRhdGFbMjldLCBkYXRhWzMwXSwgZGF0YVszMV0sIGRhdGFbMzJdLCBkYXRhWzMzXSwKKwkJICAgIGJlMzJfdG9fY3B1KCpuYXRpdmVfdmFsKQorCSAgICApOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiUwMlggIiwgZGF0YVtpICsgMzldKTsKKwkJaWYgKChpICsgMSkgJSAxNiA9PSAwKQorCQkJc3RyICs9IHNwcmludGYoc3RyLCAiXG4iKTsKKwl9CisJcmV0dXJuIHN0ciAtIGJ1ZjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHB1YmVrLCBTX0lSVUdPLCBzaG93X3B1YmVrLCBOVUxMKTsKKworI2RlZmluZSBDQVBfVkVSX1JFU1VMVF9TSVpFIDE4CitzdGF0aWMgdTggY2FwX3ZlcnNpb25bXSA9IHsKKwkwLCAxOTMsCQkJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLworCTAsIDAsIDAsIDE4LAkJLyogbGVuZ3RoICovCisJMCwgMCwgMCwgMTAxLAkJLyogVFBNX09SRF9HZXRDYXBhYmlsaXR5ICovCisJMCwgMCwgMCwgNiwKKwkwLCAwLCAwLCAwCit9OworCisjZGVmaW5lIENBUF9NQU5VRkFDVFVSRVJfUkVTVUxUX1NJWkUgMTgKK3N0YXRpYyB1OCBjYXBfbWFudWZhY3R1cmVyW10gPSB7CisJMCwgMTkzLAkJCS8qIFRQTV9UQUdfUlFVX0NPTU1BTkQgKi8KKwkwLCAwLCAwLCAyMiwJCS8qIGxlbmd0aCAqLworCTAsIDAsIDAsIDEwMSwJCS8qIFRQTV9PUkRfR2V0Q2FwYWJpbGl0eSAqLworCTAsIDAsIDAsIDUsCisJMCwgMCwgMCwgNCwKKwkwLCAwLCAxLCAzCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2NhcHMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJdTggZGF0YVtSRUFEX1BVQkVLX1JFU1VMVF9TSVpFXTsKKwlzc2l6ZV90IGxlbjsKKwljaGFyICpzdHIgPSBidWY7CisKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPQorCSAgICBwY2lfZ2V0X2RydmRhdGEoY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldikpOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJbWVtY3B5KGRhdGEsIGNhcF9tYW51ZmFjdHVyZXIsIHNpemVvZihjYXBfbWFudWZhY3R1cmVyKSk7CisKKwlpZiAoKGxlbiA9IHRwbV90cmFuc21pdChjaGlwLCBkYXRhLCBzaXplb2YoZGF0YSkpKSA8CisJICAgIENBUF9NQU5VRkFDVFVSRVJfUkVTVUxUX1NJWkUpCisJCXJldHVybiBsZW47CisKKwlzdHIgKz0gc3ByaW50ZihzdHIsICJNYW51ZmFjdHVyZXI6IDB4JXhcbiIsCisJCSAgICAgICBiZTMyX3RvX2NwdSgqKGRhdGEgKyAxNCkpKTsKKworCW1lbWNweShkYXRhLCBjYXBfdmVyc2lvbiwgc2l6ZW9mKGNhcF92ZXJzaW9uKSk7CisKKwlpZiAoKGxlbiA9IHRwbV90cmFuc21pdChjaGlwLCBkYXRhLCBzaXplb2YoZGF0YSkpKSA8CisJICAgIENBUF9WRVJfUkVTVUxUX1NJWkUpCisJCXJldHVybiBsZW47CisKKwlzdHIgKz0KKwkgICAgc3ByaW50ZihzdHIsICJUQ0cgdmVyc2lvbjogJWQuJWRcbkZpcm13YXJlIHZlcnNpb246ICVkLiVkXG4iLAorCQkgICAgKGludCkgZGF0YVsxNF0sIChpbnQpIGRhdGFbMTVdLCAoaW50KSBkYXRhWzE2XSwKKwkJICAgIChpbnQpIGRhdGFbMTddKTsKKworCXJldHVybiBzdHIgLSBidWY7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXBzLCBTX0lSVUdPLCBzaG93X2NhcHMsIE5VTEwpOworCisvKgorICogRGV2aWNlIGZpbGUgc3lzdGVtIGludGVyZmFjZSB0byB0aGUgVFBNCisgKi8KK2ludCB0cG1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmMgPSAwLCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gTlVMTCwgKnBvczsKKworCXNwaW5fbG9jaygmZHJpdmVyX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZ0cG1fY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChwb3MtPnZlbmRvci0+bWlzY2Rldi5taW5vciA9PSBtaW5vcikgeworCQkJY2hpcCA9IHBvczsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAoY2hpcC0+bnVtX29wZW5zKSB7CisJCWRldl9kYmcoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCSJBbm90aGVyIHByb2Nlc3Mgb3ducyB0aGlzIFRQTVxuIik7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJY2hpcC0+bnVtX29wZW5zKys7CisJcGNpX2Rldl9nZXQoY2hpcC0+cGNpX2Rldik7CisKKwlzcGluX3VubG9jaygmZHJpdmVyX2xvY2spOworCisJY2hpcC0+ZGF0YV9idWZmZXIgPSBrbWFsbG9jKFRQTV9CVUZTSVpFICogc2l6ZW9mKHU4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAtPmRhdGFfYnVmZmVyID09IE5VTEwpIHsKKwkJY2hpcC0+bnVtX29wZW5zLS07CisJCXBjaV9kZXZfcHV0KGNoaXAtPnBjaV9kZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhdG9taWNfc2V0KCZjaGlwLT5kYXRhX3BlbmRpbmcsIDApOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlzcGluX3VubG9jaygmZHJpdmVyX2xvY2spOworCXJldHVybiByYzsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHBtX29wZW4pOworCitpbnQgdHBtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlzcGluX2xvY2soJmRyaXZlcl9sb2NrKTsKKwljaGlwLT5udW1fb3BlbnMtLTsKKwlzcGluX3VubG9jaygmZHJpdmVyX2xvY2spOworCisJZG93bigmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKwlpZiAodGltZXJfcGVuZGluZygmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKSkKKwkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKTsKKwllbHNlIGlmICh0aW1lcl9wZW5kaW5nKCZjaGlwLT5kZXZpY2VfdGltZXIpKQorCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZjaGlwLT5kZXZpY2VfdGltZXIpOworCXVwKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCisJa2ZyZWUoY2hpcC0+ZGF0YV9idWZmZXIpOworCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7CisKKwlwY2lfZGV2X3B1dChjaGlwLT5wY2lfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHBtX3JlbGVhc2UpOworCitzc2l6ZV90IHRwbV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkgIHNpemVfdCBzaXplLCBsb2ZmX3QgKiBvZmYpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBpbl9zaXplID0gc2l6ZSwgb3V0X3NpemU7CisKKwkvKiBjYW5ub3QgcGVyZm9ybSBhIHdyaXRlIHVudGlsIHRoZSByZWFkIGhhcyBjbGVhcmVkCisJICAgZWl0aGVyIHZpYSB0cG1fcmVhZCBvciBhIHVzZXJfcmVhZF90aW1lciB0aW1lb3V0ICovCisJd2hpbGUgKGF0b21pY19yZWFkKCZjaGlwLT5kYXRhX3BlbmRpbmcpICE9IDApIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KFRQTV9USU1FT1VUKTsKKwl9CisKKwlkb3duKCZjaGlwLT5idWZmZXJfbXV0ZXgpOworCisJaWYgKGluX3NpemUgPiBUUE1fQlVGU0laRSkKKwkJaW5fc2l6ZSA9IFRQTV9CVUZTSVpFOworCisJaWYgKGNvcHlfZnJvbV91c2VyCisJICAgIChjaGlwLT5kYXRhX2J1ZmZlciwgKHZvaWQgX191c2VyICopIGJ1ZiwgaW5fc2l6ZSkpIHsKKwkJdXAoJmNoaXAtPmJ1ZmZlcl9tdXRleCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIGF0b21pYyB0cG0gY29tbWFuZCBzZW5kIGFuZCByZXN1bHQgcmVjZWl2ZSAqLworCW91dF9zaXplID0gdHBtX3RyYW5zbWl0KGNoaXAsIGNoaXAtPmRhdGFfYnVmZmVyLCBUUE1fQlVGU0laRSk7CisKKwlhdG9taWNfc2V0KCZjaGlwLT5kYXRhX3BlbmRpbmcsIG91dF9zaXplKTsKKwl1cCgmY2hpcC0+YnVmZmVyX211dGV4KTsKKworCS8qIFNldCBhIHRpbWVvdXQgYnkgd2hpY2ggdGhlIHJlYWRlciBtdXN0IGNvbWUgY2xhaW0gdGhlIHJlc3VsdCAqLworCWRvd24oJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisJaW5pdF90aW1lcigmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKTsKKwljaGlwLT51c2VyX3JlYWRfdGltZXIuZnVuY3Rpb24gPSB1c2VyX3JlYWRlcl90aW1lb3V0OworCWNoaXAtPnVzZXJfcmVhZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNoaXA7CisJY2hpcC0+dXNlcl9yZWFkX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDYwICogSFopOworCWFkZF90aW1lcigmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKTsKKwl1cCgmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKworCXJldHVybiBpbl9zaXplOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fd3JpdGUpOworCitzc2l6ZV90IHRwbV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCSBzaXplX3Qgc2l6ZSwgbG9mZl90ICogb2ZmKQoreworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3NpemUgPSAtRU5PREFUQTsKKworCWlmIChhdG9taWNfcmVhZCgmY2hpcC0+ZGF0YV9wZW5kaW5nKSAhPSAwKSB7CS8qIFJlc3VsdCBhdmFpbGFibGUgKi8KKwkJZG93bigmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKwkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKTsKKwkJdXAoJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisKKwkJZG93bigmY2hpcC0+YnVmZmVyX211dGV4KTsKKworCQlyZXRfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGlwLT5kYXRhX3BlbmRpbmcpOworCQlhdG9taWNfc2V0KCZjaGlwLT5kYXRhX3BlbmRpbmcsIDApOworCisJCWlmIChyZXRfc2l6ZSA9PSAwKQkvKiB0aW1lb3V0IGp1c3Qgb2NjdXJyZWQgKi8KKwkJCXJldF9zaXplID0gLUVUSU1FOworCQllbHNlIGlmIChyZXRfc2l6ZSA+IDApIHsJLyogcmVsYXkgZGF0YSAqLworCQkJaWYgKHNpemUgPCByZXRfc2l6ZSkKKwkJCQlyZXRfc2l6ZSA9IHNpemU7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGJ1ZiwKKwkJCQkJIGNoaXAtPmRhdGFfYnVmZmVyLCByZXRfc2l6ZSkpIHsKKwkJCQlyZXRfc2l6ZSA9IC1FRkFVTFQ7CisJCQl9CisJCX0KKwkJdXAoJmNoaXAtPmJ1ZmZlcl9tdXRleCk7CisJfQorCisJcmV0dXJuIHJldF9zaXplOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcmVhZCk7CisKK3ZvaWQgX19kZXZleGl0IHRwbV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwY2lfZGV2LT5kZXYsICJObyBkZXZpY2UgZGF0YSBmb3VuZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJmRyaXZlcl9sb2NrKTsKKworCWxpc3RfZGVsKCZjaGlwLT5saXN0KTsKKworCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CisJbWlzY19kZXJlZ2lzdGVyKCZjaGlwLT52ZW5kb3ItPm1pc2NkZXYpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wdWJlayk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wY3JzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX2NhcHMpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCisJZGV2X21hc2tbY2hpcC0+ZGV2X251bSAvIDMyXSAmPSAhKDEgPDwgKGNoaXAtPmRldl9udW0gJSAzMikpOworCisJa2ZyZWUoY2hpcCk7CisKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHBtX3JlbW92ZSk7CisKK3N0YXRpYyB1OCBzYXZlc3RhdGVbXSA9IHsKKwkwLCAxOTMsCQkJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLworCTAsIDAsIDAsIDEwLAkJLyogYmxvYiBsZW5ndGggKGluIGJ5dGVzKSAqLworCTAsIDAsIDAsIDE1MgkJLyogVFBNX09SRF9TYXZlU3RhdGUgKi8KK307CisKKy8qCisgKiBXZSBhcmUgYWJvdXQgdG8gc3VzcGVuZC4gU2F2ZSB0aGUgVFBNIHN0YXRlCisgKiBzbyB0aGF0IGl0IGNhbiBiZSByZXN0b3JlZC4KKyAqLworaW50IHRwbV9wbV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCB1MzIgcG1fc3RhdGUpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJdHBtX3RyYW5zbWl0KGNoaXAsIHNhdmVzdGF0ZSwgc2l6ZW9mKHNhdmVzdGF0ZSkpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcG1fc3VzcGVuZCk7CisKKy8qCisgKiBSZXN1bWUgZnJvbSBhIHBvd2VyIHNhZmUuIFRoZSBCSU9TIGFscmVhZHkgcmVzdG9yZWQKKyAqIHRoZSBUUE0gc3RhdGUuCisgKi8KK2ludCB0cG1fcG1fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJc3Bpbl9sb2NrKCZkcml2ZXJfbG9jayk7CisJdHBtX2xwY19idXNfaW5pdChwY2lfZGV2LCBjaGlwLT52ZW5kb3ItPmJhc2UpOworCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHBtX3BtX3Jlc3VtZSk7CisKKy8qCisgKiBDYWxsZWQgZnJvbSB0cG1fPHNwZWNpZmljPi5jIHByb2JlIGZ1bmN0aW9uIG9ubHkgZm9yIGRldmljZXMgCisgKiB0aGUgZHJpdmVyIGhhcyBkZXRlcm1pbmVkIGl0IHNob3VsZCBjbGFpbS4gIFByaW9yIHRvIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24gdGhlIHNwZWNpZmljIHByb2JlIGZ1bmN0aW9uIGhhcyBjYWxsZWQgcGNpX2VuYWJsZV9kZXZpY2UKKyAqIHVwb24gZXJyYW50IGV4aXQgZnJvbSB0aGlzIGZ1bmN0aW9uIHNwZWNpZmljIHByb2JlIGZ1bmN0aW9uIHNob3VsZCBjYWxsCisgKiBwY2lfZGlzYWJsZV9kZXZpY2UKKyAqLworaW50IHRwbV9yZWdpc3Rlcl9oYXJkd2FyZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCSAgc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgKmVudHJ5KQoreworCWNoYXIgZGV2bmFtZVs3XTsKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXA7CisJaW50IGksIGo7CisKKwkvKiBEcml2ZXIgc3BlY2lmaWMgcGVyLWRldmljZSBkYXRhICovCisJY2hpcCA9IGttYWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoY2hpcCwgMCwgc2l6ZW9mKHN0cnVjdCB0cG1fY2hpcCkpOworCisJaW5pdF9NVVRFWCgmY2hpcC0+YnVmZmVyX211dGV4KTsKKwlpbml0X01VVEVYKCZjaGlwLT50cG1fbXV0ZXgpOworCWluaXRfTVVURVgoJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPmxpc3QpOworCisJY2hpcC0+dmVuZG9yID0gZW50cnk7CisKKwljaGlwLT5kZXZfbnVtID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWlmICgoZGV2X21hc2tbaV0gJiAoMSA8PCBqKSkgPT0gMCkgeworCQkJCWNoaXAtPmRldl9udW0gPSBpICogMzIgKyBqOworCQkJCWRldl9tYXNrW2ldIHw9IDEgPDwgajsKKwkJCQlnb3RvIGRldl9udW1fc2VhcmNoX2NvbXBsZXRlOworCQkJfQorCitkZXZfbnVtX3NlYXJjaF9jb21wbGV0ZToKKwlpZiAoY2hpcC0+ZGV2X251bSA8IDApIHsKKwkJZGV2X2VycigmcGNpX2Rldi0+ZGV2LAorCQkJIk5vIGF2YWlsYWJsZSB0cG0gZGV2aWNlIG51bWJlcnNcbiIpOworCQlrZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmIChjaGlwLT5kZXZfbnVtID09IDApCisJCWNoaXAtPnZlbmRvci0+bWlzY2Rldi5taW5vciA9IFRQTV9NSU5PUjsKKwllbHNlCisJCWNoaXAtPnZlbmRvci0+bWlzY2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKworCXNucHJpbnRmKGRldm5hbWUsIHNpemVvZihkZXZuYW1lKSwgIiVzJWQiLCAidHBtIiwgY2hpcC0+ZGV2X251bSk7CisJY2hpcC0+dmVuZG9yLT5taXNjZGV2Lm5hbWUgPSBkZXZuYW1lOworCisJY2hpcC0+dmVuZG9yLT5taXNjZGV2LmRldiA9ICYocGNpX2Rldi0+ZGV2KTsKKwljaGlwLT5wY2lfZGV2ID0gcGNpX2Rldl9nZXQocGNpX2Rldik7CisKKwlpZiAobWlzY19yZWdpc3RlcigmY2hpcC0+dmVuZG9yLT5taXNjZGV2KSkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIG1pc2NfcmVnaXN0ZXIgJXMsIG1pbm9yICVkXG4iLAorCQkJY2hpcC0+dmVuZG9yLT5taXNjZGV2Lm5hbWUsCisJCQljaGlwLT52ZW5kb3ItPm1pc2NkZXYubWlub3IpOworCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJa2ZyZWUoY2hpcCk7CisJCWRldl9tYXNrW2ldICY9ICEoMSA8PCBqKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNoaXApOworCisJbGlzdF9hZGQoJmNoaXAtPmxpc3QsICZ0cG1fY2hpcF9saXN0KTsKKworCWRldmljZV9jcmVhdGVfZmlsZSgmcGNpX2Rldi0+ZGV2LCAmZGV2X2F0dHJfcHViZWspOworCWRldmljZV9jcmVhdGVfZmlsZSgmcGNpX2Rldi0+ZGV2LCAmZGV2X2F0dHJfcGNycyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcmVnaXN0ZXJfaGFyZHdhcmUpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RwbSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF90cG0odm9pZCkKK3sKKworfQorCittb2R1bGVfaW5pdChpbml0X3RwbSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3RwbSk7CisKK01PRFVMRV9BVVRIT1IoIkxlZW5kZXJ0IHZhbiBEb29ybiAobGVlbmRlcnRAd2F0c29uLmlibS5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRQTSBEcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKCIyLjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtLmggYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yczoKKyAqIExlZW5kZXJ0IHZhbiBEb29ybiA8bGVlbmRlcnRAd2F0c29uLmlibS5jb20+CisgKiBEYXZlIFNhZmZvcmQgPHNhZmZvcmRAd2F0c29uLmlibS5jb20+CisgKiBSZWluZXIgU2FpbGVyIDxzYWlsZXJAd2F0c29uLmlibS5jb20+CisgKiBLeWxlbmUgSGFsbCA8a2poYWxsQHVzLmlibS5jb20+CisgKgorICogTWFpbnRhaW5lZCBieTogPHRwbWRkX2RldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBEZXZpY2UgZHJpdmVyIGZvciBUQ0cvVENQQSBUUE0gKHRydXN0ZWQgcGxhdGZvcm0gbW9kdWxlKS4KKyAqIFNwZWNpZmljYXRpb25zIGF0IHd3dy50cnVzdGVkY29tcHV0aW5nZ3JvdXAub3JnCSAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKiAKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorCisjZGVmaW5lIFRQTV9USU1FT1VUIG1zZWNzX3RvX2ppZmZpZXMoNSkKKworLyogVFBNIGFkZHJlc3NlcyAqLworI2RlZmluZQlUUE1fQUREUgkJCTB4NEUKKyNkZWZpbmUJVFBNX0RBVEEJCQkweDRGCisKK3N0cnVjdCB0cG1fY2hpcDsKKworc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgeworCXU4IHJlcV9jb21wbGV0ZV9tYXNrOworCXU4IHJlcV9jb21wbGV0ZV92YWw7CisJdTE2IGJhc2U7CQkvKiBUUE0gYmFzZSBhZGRyZXNzICovCisKKwlpbnQgKCpyZWN2KSAoc3RydWN0IHRwbV9jaGlwICosIHU4ICosIHNpemVfdCk7CisJaW50ICgqc2VuZCkgKHN0cnVjdCB0cG1fY2hpcCAqLCB1OCAqLCBzaXplX3QpOworCXZvaWQgKCpjYW5jZWwpIChzdHJ1Y3QgdHBtX2NoaXAgKik7CisJc3RydWN0IG1pc2NkZXZpY2UgbWlzY2RldjsKK307CisKK3N0cnVjdCB0cG1fY2hpcCB7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CS8qIFBDSSBkZXZpY2Ugc3R1ZmYgKi8KKworCWludCBkZXZfbnVtOwkJLyogL2Rldi90cG0jICovCisJaW50IG51bV9vcGVuczsJCS8qIG9ubHkgb25lIGFsbG93ZWQgKi8KKwlpbnQgdGltZV9leHBpcmVkOworCisJLyogRGF0YSBwYXNzZWQgdG8gYW5kIGZyb20gdGhlIHRwbSB2aWEgdGhlIHJlYWQvd3JpdGUgY2FsbHMgKi8KKwl1OCAqZGF0YV9idWZmZXI7CisJYXRvbWljX3QgZGF0YV9wZW5kaW5nOworCXN0cnVjdCBzZW1hcGhvcmUgYnVmZmVyX211dGV4OworCisJc3RydWN0IHRpbWVyX2xpc3QgdXNlcl9yZWFkX3RpbWVyOwkvKiB1c2VyIG5lZWRzIHRvIGNsYWltIHJlc3VsdCAqLworCXN0cnVjdCBzZW1hcGhvcmUgdHBtX211dGV4OwkvKiB0cG0gaXMgcHJvY2Vzc2luZyAqLworCXN0cnVjdCB0aW1lcl9saXN0IGRldmljZV90aW1lcjsJLyogdHBtIGlzIHByb2Nlc3NpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHRpbWVyX21hbmlwdWxhdGlvbl9tdXRleDsKKworCXN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljICp2ZW5kb3I7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIGludCB0cG1fcmVhZF9pbmRleChpbnQgaW5kZXgpCit7CisJb3V0YihpbmRleCwgVFBNX0FERFIpOworCXJldHVybiBpbmIoVFBNX0RBVEEpICYgMHhGRjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRwbV93cml0ZV9pbmRleChpbnQgaW5kZXgsIGludCB2YWx1ZSkKK3sKKwlvdXRiKGluZGV4LCBUUE1fQUREUik7CisJb3V0Yih2YWx1ZSAmIDB4RkYsIFRQTV9EQVRBKTsKK30KKworZXh0ZXJuIHZvaWQgdHBtX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgdHBtX2xwY19idXNfaW5pdChzdHJ1Y3QgcGNpX2RldiAqLCB1MTYpOworCitleHRlcm4gaW50IHRwbV9yZWdpc3Rlcl9oYXJkd2FyZShzdHJ1Y3QgcGNpX2RldiAqLAorCQkJCSBzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyAqKTsKK2V4dGVybiBpbnQgdHBtX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworZXh0ZXJuIGludCB0cG1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitleHRlcm4gc3NpemVfdCB0cG1fd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LAorCQkJIGxvZmZfdCAqKTsKK2V4dGVybiBzc2l6ZV90IHRwbV9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworZXh0ZXJuIHZvaWQgX19kZXZleGl0IHRwbV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CitleHRlcm4gaW50IHRwbV9wbV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICosIHUzMik7CitleHRlcm4gaW50IHRwbV9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTMzM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBdXRob3JzOgorICogTGVlbmRlcnQgdmFuIERvb3JuIDxsZWVuZGVydEB3YXRzb24uaWJtLmNvbT4KKyAqIERhdmUgU2FmZm9yZCA8c2FmZm9yZEB3YXRzb24uaWJtLmNvbT4KKyAqIFJlaW5lciBTYWlsZXIgPHNhaWxlckB3YXRzb24uaWJtLmNvbT4KKyAqIEt5bGVuZSBIYWxsIDxramhhbGxAdXMuaWJtLmNvbT4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiA8dHBtZGRfZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIERldmljZSBkcml2ZXIgZm9yIFRDRy9UQ1BBIFRQTSAodHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUpLgorICogU3BlY2lmaWNhdGlvbnMgYXQgd3d3LnRydXN0ZWRjb21wdXRpbmdncm91cC5vcmcJIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJ0cG0uaCIKKworLyogQXRtZWwgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJVFBNX0FUTUxfQkFTRQkJCTB4NDAwCisKKy8qIHdyaXRlIHN0YXR1cyBiaXRzICovCisjZGVmaW5lCUFUTUxfU1RBVFVTX0FCT1JUCQkweDAxCisjZGVmaW5lCUFUTUxfU1RBVFVTX0xBU1RCWVRFCQkweDA0CisKKy8qIHJlYWQgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUJQVRNTF9TVEFUVVNfQlVTWQkJMHgwMQorI2RlZmluZQlBVE1MX1NUQVRVU19EQVRBX0FWQUlMCQkweDAyCisjZGVmaW5lCUFUTUxfU1RBVFVTX1JFV1JJVEUJCTB4MDQKKworCitzdGF0aWMgaW50IHRwbV9hdG1sX3JlY3Yoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1OCAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXU4IHN0YXR1cywgKmhkciA9IGJ1ZjsKKwl1MzIgc2l6ZTsKKwlpbnQgaTsKKwlfX2JlMzIgKm5hdGl2ZV9zaXplOworCisJLyogc3RhcnQgcmVhZGluZyBoZWFkZXIgKi8KKwlpZiAoY291bnQgPCA2KQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIDEpOworCQlpZiAoKHN0YXR1cyAmIEFUTUxfU1RBVFVTX0RBVEFfQVZBSUwpID09IDApIHsKKwkJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCQkiZXJyb3IgcmVhZGluZyBoZWFkZXJcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJKmJ1ZisrID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSk7CisJfQorCisJLyogc2l6ZSBvZiB0aGUgZGF0YSByZWNlaXZlZCAqLworCW5hdGl2ZV9zaXplID0gKF9fZm9yY2UgX19iZTMyICopIChoZHIgKyAyKTsKKwlzaXplID0gYmUzMl90b19jcHUoKm5hdGl2ZV9zaXplKTsKKworCWlmIChjb3VudCA8IHNpemUpIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJIlJlY3Ygc2l6ZSglZCkgbGVzcyB0aGFuIGF2YWlsYWJsZSBzcGFjZVxuIiwgc2l6ZSk7CisJCWZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7CS8qIGNsZWFyIHRoZSB3YWl0aW5nIGRhdGEgYW55d2F5ICovCisJCQlzdGF0dXMgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgMSk7CisJCQlpZiAoKHN0YXR1cyAmIEFUTUxfU1RBVFVTX0RBVEFfQVZBSUwpID09IDApIHsKKwkJCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCisJCQkJCSJlcnJvciByZWFkaW5nIGRhdGFcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJlYWQgYWxsIHRoZSBkYXRhIGF2YWlsYWJsZSAqLworCWZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKKwkJaWYgKChzdGF0dXMgJiBBVE1MX1NUQVRVU19EQVRBX0FWQUlMKSA9PSAwKSB7CisJCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCisJCQkJImVycm9yIHJlYWRpbmcgZGF0YVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkqYnVmKysgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlKTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgZGF0YSBhdmFpbGFibGUgaXMgZ29uZSAqLworCXN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKKwlpZiAoc3RhdHVzICYgQVRNTF9TVEFUVVNfREFUQV9BVkFJTCkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJkYXRhIGF2YWlsYWJsZSBpcyBzdHVja1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IHRwbV9hdG1sX3NlbmQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1OCAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpOworCisJZGV2X2RiZygmY2hpcC0+cGNpX2Rldi0+ZGV2LCAidHBtX2F0bWxfc2VuZDogIik7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZGV2X2RiZygmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiMHgleCglZCkgIiwgYnVmW2ldLCBidWZbaV0pOworCQlvdXRiKGJ1ZltpXSwgY2hpcC0+dmVuZG9yLT5iYXNlKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHRwbV9hdG1sX2NhbmNlbChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCit7CisJb3V0YihBVE1MX1NUQVRVU19BQk9SVCwgY2hpcC0+dmVuZG9yLT5iYXNlICsgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF0bWVsX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vcGVuID0gdHBtX29wZW4sCisJLnJlYWQgPSB0cG1fcmVhZCwKKwkud3JpdGUgPSB0cG1fd3JpdGUsCisJLnJlbGVhc2UgPSB0cG1fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyB0cG1fYXRtZWwgPSB7CisJLnJlY3YgPSB0cG1fYXRtbF9yZWN2LAorCS5zZW5kID0gdHBtX2F0bWxfc2VuZCwKKwkuY2FuY2VsID0gdHBtX2F0bWxfY2FuY2VsLAorCS5yZXFfY29tcGxldGVfbWFzayA9IEFUTUxfU1RBVFVTX0JVU1kgfCBBVE1MX1NUQVRVU19EQVRBX0FWQUlMLAorCS5yZXFfY29tcGxldGVfdmFsID0gQVRNTF9TVEFUVVNfREFUQV9BVkFJTCwKKwkuYmFzZSA9IFRQTV9BVE1MX0JBU0UsCisJLm1pc2NkZXYgPSB7IC5mb3BzID0gJmF0bWVsX29wcywgfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRwbV9hdG1sX2luaXQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwl1OCB2ZXJzaW9uWzRdOworCWludCByYyA9IDA7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJCXJldHVybiAtRUlPOworCisJaWYgKHRwbV9scGNfYnVzX2luaXQocGNpX2RldiwgVFBNX0FUTUxfQkFTRSkpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogdmVyaWZ5IHRoYXQgaXQgaXMgYW4gQXRtZWwgcGFydCAqLworCWlmICh0cG1fcmVhZF9pbmRleCg0KSAhPSAnQScgfHwgdHBtX3JlYWRfaW5kZXgoNSkgIT0gJ1QnCisJICAgIHx8IHRwbV9yZWFkX2luZGV4KDYpICE9ICdNJyB8fCB0cG1fcmVhZF9pbmRleCg3KSAhPSAnTCcpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogcXVlcnkgY2hpcCBmb3IgaXRzIHZlcnNpb24gbnVtYmVyICovCisJaWYgKCh2ZXJzaW9uWzBdID0gdHBtX3JlYWRfaW5kZXgoMHgwMCkpICE9IDB4RkYpIHsKKwkJdmVyc2lvblsxXSA9IHRwbV9yZWFkX2luZGV4KDB4MDEpOworCQl2ZXJzaW9uWzJdID0gdHBtX3JlYWRfaW5kZXgoMHgwMik7CisJCXZlcnNpb25bM10gPSB0cG1fcmVhZF9pbmRleCgweDAzKTsKKwl9IGVsc2UgeworCQlkZXZfaW5mbygmcGNpX2Rldi0+ZGV2LCAidmVyc2lvbiBxdWVyeSBmYWlsZWRcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoKHJjID0gdHBtX3JlZ2lzdGVyX2hhcmR3YXJlKHBjaV9kZXYsICZ0cG1fYXRtZWwpKSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCWRldl9pbmZvKCZwY2lfZGV2LT5kZXYsCisJCSAiQXRtZWwgVFBNIHZlcnNpb24gJWQuJWQuJWQuJWRcbiIsIHZlcnNpb25bMF0sIHZlcnNpb25bMV0sCisJCSB2ZXJzaW9uWzJdLCB2ZXJzaW9uWzNdKTsKKworCXJldHVybiAwOworb3V0X2VycjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHBtX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8wKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEyKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMTIpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0xQQyl9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0cG1fcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdG1lbF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gInRwbV9hdG1lbCIsCisJLmlkX3RhYmxlID0gdHBtX3BjaV90YmwsCisJLnByb2JlID0gdHBtX2F0bWxfaW5pdCwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AodHBtX3JlbW92ZSksCisJLnN1c3BlbmQgPSB0cG1fcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gdHBtX3BtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYXRtZWwodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXRtZWxfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2F0bWVsKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhdG1lbF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9hdG1lbCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2F0bWVsKTsKKworTU9EVUxFX0FVVEhPUigiTGVlbmRlcnQgdmFuIERvb3JuIChsZWVuZGVydEB3YXRzb24uaWJtLmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVFBNIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oIjIuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2NlODMzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcnM6CisgKiBMZWVuZGVydCB2YW4gRG9vcm4gPGxlZW5kZXJ0QHdhdHNvbi5pYm0uY29tPgorICogRGF2ZSBTYWZmb3JkIDxzYWZmb3JkQHdhdHNvbi5pYm0uY29tPgorICogUmVpbmVyIFNhaWxlciA8c2FpbGVyQHdhdHNvbi5pYm0uY29tPgorICogS3lsZW5lIEhhbGwgPGtqaGFsbEB1cy5pYm0uY29tPgorICoKKyAqIE1haW50YWluZWQgYnk6IDx0cG1kZF9kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgVENHL1RDUEEgVFBNICh0cnVzdGVkIHBsYXRmb3JtIG1vZHVsZSkuCisgKiBTcGVjaWZpY2F0aW9ucyBhdCB3d3cudHJ1c3RlZGNvbXB1dGluZ2dyb3VwLm9yZwkgCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICogCisgKi8KKworI2luY2x1ZGUgInRwbS5oIgorCisvKiBOYXRpb25hbCBkZWZpbml0aW9ucyAqLworI2RlZmluZQlUUE1fTlNDX0JBU0UJCQkweDM2MAorI2RlZmluZQlUUE1fTlNDX0lSUQkJCTB4MDcKKworI2RlZmluZQlOU0NfTEROX0lOREVYCQkJMHgwNworI2RlZmluZQlOU0NfU0lEX0lOREVYCQkJMHgyMAorI2RlZmluZQlOU0NfTERDX0lOREVYCQkJMHgzMAorI2RlZmluZQlOU0NfRElPX0lOREVYCQkJMHg2MAorI2RlZmluZQlOU0NfQ0lPX0lOREVYCQkJMHg2MgorI2RlZmluZQlOU0NfSVJRX0lOREVYCQkJMHg3MAorI2RlZmluZQlOU0NfSVRTX0lOREVYCQkJMHg3MQorCisjZGVmaW5lCU5TQ19TVEFUVVMJCQkweDAxCisjZGVmaW5lCU5TQ19DT01NQU5ECQkJMHgwMQorI2RlZmluZQlOU0NfREFUQQkJCTB4MDAKKworLyogc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUJTlNDX1NUQVRVU19PQkYJCQkweDAxCS8qIG91dHB1dCBidWZmZXIgZnVsbCAqLworI2RlZmluZQlOU0NfU1RBVFVTX0lCRgkJCTB4MDIJLyogaW5wdXQgYnVmZmVyIGZ1bGwgKi8KKyNkZWZpbmUJTlNDX1NUQVRVU19GMAkJCTB4MDQJLyogRjAgKi8KKyNkZWZpbmUJTlNDX1NUQVRVU19BMgkJCTB4MDgJLyogQTIgKi8KKyNkZWZpbmUJTlNDX1NUQVRVU19SRFkJCQkweDEwCS8qIHJlYWR5IHRvIHJlY2VpdmUgY29tbWFuZCAqLworI2RlZmluZQlOU0NfU1RBVFVTX0lCUgkJCTB4MjAJLyogcmVhZHkgdG8gcmVjZWl2ZSBkYXRhICovCisKKy8qIGNvbW1hbmQgYml0cyAqLworI2RlZmluZQlOU0NfQ09NTUFORF9OT1JNQUwJCTB4MDEJLyogbm9ybWFsIG1vZGUgKi8KKyNkZWZpbmUJTlNDX0NPTU1BTkRfRU9DCQkJMHgwMworI2RlZmluZQlOU0NfQ09NTUFORF9DQU5DRUwJCTB4MjIKKworLyoKKyAqIFdhaXQgZm9yIGEgY2VydGFpbiBzdGF0dXMgdG8gYXBwZWFyCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9mb3Jfc3RhdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4IG1hc2ssIHU4IHZhbCwgdTggKiBkYXRhKQoreworCWludCBleHBpcmVkID0gMDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0dXNfdGltZXIgPQorCSAgICBUSU1FUl9JTklUSUFMSVpFUih0cG1fdGltZV9leHBpcmVkLCBqaWZmaWVzICsgMTAgKiBIWiwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKSAmZXhwaXJlZCk7CisKKwkvKiBzdGF0dXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIGNoZWNrICovCisJKmRhdGEgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX1NUQVRVUyk7CisJaWYgKCgqZGF0YSAmIG1hc2spID09IHZhbCkKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0IGZvciBzdGF0dXMgKi8KKwlhZGRfdGltZXIoJnN0YXR1c190aW1lcik7CisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoVFBNX1RJTUVPVVQpOworCQkqZGF0YSA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKKwkJaWYgKCgqZGF0YSAmIG1hc2spID09IHZhbCkgeworCQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmc3RhdHVzX3RpbWVyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXdoaWxlICghZXhwaXJlZCk7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IG5zY193YWl0X2Zvcl9yZWFkeShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCit7CisJaW50IHN0YXR1czsKKwlpbnQgZXhwaXJlZCA9IDA7CisJc3RydWN0IHRpbWVyX2xpc3Qgc3RhdHVzX3RpbWVyID0KKwkgICAgVElNRVJfSU5JVElBTElaRVIodHBtX3RpbWVfZXhwaXJlZCwgamlmZmllcyArIDEwMCwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKSAmZXhwaXJlZCk7CisKKwkvKiBzdGF0dXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIGNoZWNrICovCisJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19TVEFUVVMpOworCWlmIChzdGF0dXMgJiBOU0NfU1RBVFVTX09CRikKKwkJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKTsKKwlpZiAoc3RhdHVzICYgTlNDX1NUQVRVU19SRFkpCisJCXJldHVybiAwOworCisJLyogd2FpdCBmb3Igc3RhdHVzICovCisJYWRkX3RpbWVyKCZzdGF0dXNfdGltZXIpOworCWRvIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KFRQTV9USU1FT1VUKTsKKwkJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgTlNDX1NUQVRVU19PQkYpCisJCQlzdGF0dXMgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0RBVEEpOworCQlpZiAoc3RhdHVzICYgTlNDX1NUQVRVU19SRFkpIHsKKwkJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJnN0YXR1c190aW1lcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl3aGlsZSAoIWV4cGlyZWQpOworCisJZGV2X2luZm8oJmNoaXAtPnBjaV9kZXYtPmRldiwgIndhaXQgZm9yIHJlYWR5IGZhaWxlZFxuIik7CisJcmV0dXJuIC1FQlVTWTsKK30KKworCitzdGF0aWMgaW50IHRwbV9uc2NfcmVjdihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4ICogYnVmLCBzaXplX3QgY291bnQpCit7CisJdTggKmJ1ZmZlciA9IGJ1ZjsKKwl1OCBkYXRhLCAqcDsKKwl1MzIgc2l6ZTsKKwlfX2JlMzIgKm5hdGl2ZV9zaXplOworCisJaWYgKGNvdW50IDwgNikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAod2FpdF9mb3Jfc3RhdChjaGlwLCBOU0NfU1RBVFVTX0YwLCBOU0NfU1RBVFVTX0YwLCAmZGF0YSkgPCAwKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIkYwIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKChkYXRhID0KKwkgICAgIGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyBOU0NfREFUQSkpICE9IE5TQ19DT01NQU5EX05PUk1BTCkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJub3QgaW4gbm9ybWFsIG1vZGUgKDB4JXgpXG4iLAorCQkJZGF0YSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJlYWQgdGhlIHdob2xlIHBhY2tldCAqLworCWZvciAocCA9IGJ1ZmZlcjsgcCA8ICZidWZmZXJbY291bnRdOyBwKyspIHsKKwkJaWYgKHdhaXRfZm9yX3N0YXQKKwkJICAgIChjaGlwLCBOU0NfU1RBVFVTX09CRiwgTlNDX1NUQVRVU19PQkYsICZkYXRhKSA8IDApIHsKKwkJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCQkiT0JGIHRpbWVvdXQgKHdoaWxlIHJlYWRpbmcgZGF0YSlcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGRhdGEgJiBOU0NfU1RBVFVTX0YwKQorCQkJYnJlYWs7CisJCSpwID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKTsKKwl9CisKKwlpZiAoKGRhdGEgJiBOU0NfU1RBVFVTX0YwKSA9PSAwKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIkYwIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKChkYXRhID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKSkgIT0gTlNDX0NPTU1BTkRfRU9DKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCSJleHBlY3RlZCBlbmQgb2YgY29tbWFuZCgweCV4KVxuIiwgZGF0YSk7CisJCXJldHVybiAtRUlPOworCX0KKworCW5hdGl2ZV9zaXplID0gKF9fZm9yY2UgX19iZTMyICopIChidWYgKyAyKTsKKwlzaXplID0gYmUzMl90b19jcHUoKm5hdGl2ZV9zaXplKTsKKworCWlmIChjb3VudCA8IHNpemUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgdHBtX25zY19zZW5kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1OCBkYXRhOworCWludCBpOworCisJLyoKKwkgKiBJZiB3ZSBoaXQgdGhlIGNoaXAgd2l0aCBiYWNrIHRvIGJhY2sgY29tbWFuZHMgaXQgbG9ja3MgdXAKKwkgKiBhbmQgbmV2ZXIgc2V0IElCRi4gSGl0dGluZyBpdCB3aXRoIHRoaXMgImhhbW1lciIgc2VlbXMgdG8KKwkgKiBmaXggaXQuIE5vdCBzdXJlIHdoeSB0aGlzIGlzIG5lZWRlZCwgd2UgZm9sbG93ZWQgdGhlIGZsb3cKKwkgKiBjaGFydCBpbiB0aGUgbWFudWFsIHRvIHRoZSBsZXR0ZXIuCisJICovCisJb3V0YihOU0NfQ09NTUFORF9DQU5DRUwsIGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19DT01NQU5EKTsKKworCWlmIChuc2Nfd2FpdF9mb3JfcmVhZHkoY2hpcCkgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAod2FpdF9mb3Jfc3RhdChjaGlwLCBOU0NfU1RBVFVTX0lCRiwgMCwgJmRhdGEpIDwgMCkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJJQkYgdGltZW91dFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW91dGIoTlNDX0NPTU1BTkRfTk9STUFMLCBjaGlwLT52ZW5kb3ItPmJhc2UgKyBOU0NfQ09NTUFORCk7CisJaWYgKHdhaXRfZm9yX3N0YXQoY2hpcCwgTlNDX1NUQVRVU19JQlIsIE5TQ19TVEFUVVNfSUJSLCAmZGF0YSkgPCAwKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIklCUiB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKHdhaXRfZm9yX3N0YXQoY2hpcCwgTlNDX1NUQVRVU19JQkYsIDAsICZkYXRhKSA8IDApIHsKKwkJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCQkiSUJGIHRpbWVvdXQgKHdoaWxlIHdyaXRpbmcgZGF0YSlcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJb3V0YihidWZbaV0sIGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKTsKKwl9CisKKwlpZiAod2FpdF9mb3Jfc3RhdChjaGlwLCBOU0NfU1RBVFVTX0lCRiwgMCwgJmRhdGEpIDwgMCkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJJQkYgdGltZW91dFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlvdXRiKE5TQ19DT01NQU5EX0VPQywgY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0NPTU1BTkQpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCB0cG1fbnNjX2NhbmNlbChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCit7CisJb3V0YihOU0NfQ09NTUFORF9DQU5DRUwsIGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19DT01NQU5EKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnNjX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vcGVuID0gdHBtX29wZW4sCisJLnJlYWQgPSB0cG1fcmVhZCwKKwkud3JpdGUgPSB0cG1fd3JpdGUsCisJLnJlbGVhc2UgPSB0cG1fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyB0cG1fbnNjID0geworCS5yZWN2ID0gdHBtX25zY19yZWN2LAorCS5zZW5kID0gdHBtX25zY19zZW5kLAorCS5jYW5jZWwgPSB0cG1fbnNjX2NhbmNlbCwKKwkucmVxX2NvbXBsZXRlX21hc2sgPSBOU0NfU1RBVFVTX09CRiwKKwkucmVxX2NvbXBsZXRlX3ZhbCA9IE5TQ19TVEFUVVNfT0JGLAorCS5iYXNlID0gVFBNX05TQ19CQVNFLAorCS5taXNjZGV2ID0geyAuZm9wcyA9ICZuc2Nfb3BzLCB9LAorCQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdHBtX25zY19pbml0KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh0cG1fbHBjX2J1c19pbml0KHBjaV9kZXYsIFRQTV9OU0NfQkFTRSkpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogdmVyaWZ5IHRoYXQgaXQgaXMgYSBOYXRpb25hbCBwYXJ0IChTSUQpICovCisJaWYgKHRwbV9yZWFkX2luZGV4KE5TQ19TSURfSU5ERVgpICE9IDB4RUYpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LCAiTlNDIFRQTSBkZXRlY3RlZFxuIik7CisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LAorCQkiTlNDIExETiAweCV4LCBTSUQgMHgleCwgU1JJRCAweCV4XG4iLAorCQl0cG1fcmVhZF9pbmRleCgweDA3KSwgdHBtX3JlYWRfaW5kZXgoMHgyMCksCisJCXRwbV9yZWFkX2luZGV4KDB4MjcpKTsKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsCisJCSJOU0MgU0lPQ0YxIDB4JXggU0lPQ0Y1IDB4JXggU0lPQ0Y2IDB4JXggU0lPQ0Y4IDB4JXhcbiIsCisJCXRwbV9yZWFkX2luZGV4KDB4MjEpLCB0cG1fcmVhZF9pbmRleCgweDI1KSwKKwkJdHBtX3JlYWRfaW5kZXgoMHgyNiksIHRwbV9yZWFkX2luZGV4KDB4MjgpKTsKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsICJOU0MgSU8gQmFzZTAgMHgleFxuIiwKKwkJKHRwbV9yZWFkX2luZGV4KDB4NjApIDw8IDgpIHwgdHBtX3JlYWRfaW5kZXgoMHg2MSkpOworCWRldl9kYmcoJnBjaV9kZXYtPmRldiwgIk5TQyBJTyBCYXNlMSAweCV4XG4iLAorCQkodHBtX3JlYWRfaW5kZXgoMHg2MikgPDwgOCkgfCB0cG1fcmVhZF9pbmRleCgweDYzKSk7CisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LCAiTlNDIEludGVycnVwdCBudW1iZXIgYW5kIHdha2V1cCAweCV4XG4iLAorCQl0cG1fcmVhZF9pbmRleCgweDcwKSk7CisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LCAiTlNDIElSUSB0eXBlIHNlbGVjdCAweCV4XG4iLAorCQl0cG1fcmVhZF9pbmRleCgweDcxKSk7CisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LAorCQkiTlNDIERNQSBjaGFubmVsIHNlbGVjdDAgMHgleCwgc2VsZWN0MSAweCV4XG4iLAorCQl0cG1fcmVhZF9pbmRleCgweDc0KSwgdHBtX3JlYWRfaW5kZXgoMHg3NSkpOworCWRldl9kYmcoJnBjaV9kZXYtPmRldiwKKwkJIk5TQyBDb25maWcgIgorCQkiMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwKKwkJdHBtX3JlYWRfaW5kZXgoMHhGMCksIHRwbV9yZWFkX2luZGV4KDB4RjEpLAorCQl0cG1fcmVhZF9pbmRleCgweEYyKSwgdHBtX3JlYWRfaW5kZXgoMHhGMyksCisJCXRwbV9yZWFkX2luZGV4KDB4RjQpLCB0cG1fcmVhZF9pbmRleCgweEY1KSwKKwkJdHBtX3JlYWRfaW5kZXgoMHhGNiksIHRwbV9yZWFkX2luZGV4KDB4RjcpLAorCQl0cG1fcmVhZF9pbmRleCgweEY4KSwgdHBtX3JlYWRfaW5kZXgoMHhGOSkpOworCisJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwKKwkJICJOU0MgUEMyMTEwMCBUUE0gcmV2aXNpb24gJWRcbiIsCisJCSB0cG1fcmVhZF9pbmRleCgweDI3KSAmIDB4MUYpOworCisJaWYgKHRwbV9yZWFkX2luZGV4KE5TQ19MRENfSU5ERVgpID09IDApCisJCWRldl9pbmZvKCZwY2lfZGV2LT5kZXYsICI6IE5TQyBUUE0gbm90IGFjdGl2ZVxuIik7CisKKwkvKiBzZWxlY3QgUE0gY2hhbm5lbCAxICovCisJdHBtX3dyaXRlX2luZGV4KE5TQ19MRE5fSU5ERVgsIDB4MTIpOworCXRwbV9yZWFkX2luZGV4KE5TQ19MRE5fSU5ERVgpOworCisJLyogZGlzYWJsZSB0aGUgRFBNIG1vZHVsZSAqLworCXRwbV93cml0ZV9pbmRleChOU0NfTERDX0lOREVYLCAwKTsKKwl0cG1fcmVhZF9pbmRleChOU0NfTERDX0lOREVYKTsKKworCS8qIHNldCB0aGUgZGF0YSByZWdpc3RlciBiYXNlIGFkZHJlc3NlcyAqLworCXRwbV93cml0ZV9pbmRleChOU0NfRElPX0lOREVYLCBUUE1fTlNDX0JBU0UgPj4gOCk7CisJdHBtX3dyaXRlX2luZGV4KE5TQ19ESU9fSU5ERVggKyAxLCBUUE1fTlNDX0JBU0UpOworCXRwbV9yZWFkX2luZGV4KE5TQ19ESU9fSU5ERVgpOworCXRwbV9yZWFkX2luZGV4KE5TQ19ESU9fSU5ERVggKyAxKTsKKworCS8qIHNldCB0aGUgY29tbWFuZCByZWdpc3RlciBiYXNlIGFkZHJlc3NlcyAqLworCXRwbV93cml0ZV9pbmRleChOU0NfQ0lPX0lOREVYLCAoVFBNX05TQ19CQVNFICsgMSkgPj4gOCk7CisJdHBtX3dyaXRlX2luZGV4KE5TQ19DSU9fSU5ERVggKyAxLCAoVFBNX05TQ19CQVNFICsgMSkpOworCXRwbV9yZWFkX2luZGV4KE5TQ19ESU9fSU5ERVgpOworCXRwbV9yZWFkX2luZGV4KE5TQ19ESU9fSU5ERVggKyAxKTsKKworCS8qIHNldCB0aGUgaW50ZXJydXB0IG51bWJlciB0byBiZSB1c2VkIGZvciB0aGUgaG9zdCBpbnRlcmZhY2UgKi8KKwl0cG1fd3JpdGVfaW5kZXgoTlNDX0lSUV9JTkRFWCwgVFBNX05TQ19JUlEpOworCXRwbV93cml0ZV9pbmRleChOU0NfSVRTX0lOREVYLCAweDAwKTsKKwl0cG1fcmVhZF9pbmRleChOU0NfSVJRX0lOREVYKTsKKworCS8qIGVuYWJsZSB0aGUgRFBNIG1vZHVsZSAqLworCXRwbV93cml0ZV9pbmRleChOU0NfTERDX0lOREVYLCAweDAxKTsKKwl0cG1fcmVhZF9pbmRleChOU0NfTERDX0lOREVYKTsKKworCWlmICgocmMgPSB0cG1fcmVnaXN0ZXJfaGFyZHdhcmUocGNpX2RldiwgJnRwbV9uc2MpKSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0cG1fcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTIpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMil9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8wKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfTFBDKX0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRwbV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5zY19wY2lfZHJpdmVyID0geworCS5uYW1lID0gInRwbV9uc2MiLAorCS5pZF90YWJsZSA9IHRwbV9wY2lfdGJsLAorCS5wcm9iZSA9IHRwbV9uc2NfaW5pdCwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AodHBtX3JlbW92ZSksCisJLnN1c3BlbmQgPSB0cG1fcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gdHBtX3BtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbnNjKHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5zY19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbnNjKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZuc2NfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbnNjKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbnNjKTsKKworTU9EVUxFX0FVVEhPUigiTGVlbmRlcnQgdmFuIERvb3JuIChsZWVuZGVydEB3YXRzb24uaWJtLmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVFBNIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oIjIuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pby5jIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTVhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKQEAgLTAsMCArMSwyOTgwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci90dHlfaW8uYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyoKKyAqICd0dHlfaW8uYycgZ2l2ZXMgYW4gb3J0aG9nb25hbCBmZWVsaW5nIHRvIHR0eSdzLCBiZSB0aGV5IGNvbnNvbGVzCisgKiBvciBycy1jaGFubmVscy4gSXQgYWxzbyBpbXBsZW1lbnRzIGVjaG9pbmcsIGNvb2tlZCBtb2RlIGV0Yy4KKyAqCisgKiBLaWxsLWxpbmUgdGhhbmtzIHRvIEpvaG4gVCBLb2hsLCB3aG8gYWxzbyBjb3JyZWN0ZWQgVk1JTiA9IFZUSU1FID0gMC4KKyAqCisgKiBNb2RpZmllZCBieSBUaGVvZG9yZSBUcydvLCA5LzE0LzkyLCB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUKKyAqIHR0eV9zdHJ1Y3QgYW5kIHR0eV9xdWV1ZSBzdHJ1Y3R1cmVzLiAgUHJldmlvdXNseSB0aGVyZSB3YXMgYW4gYXJyYXkKKyAqIG9mIDI1NiB0dHlfc3RydWN0J3Mgd2hpY2ggd2FzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLCBhbmQgdGhlCisgKiB0dHlfcXVldWUgc3RydWN0dXJlcyB3ZXJlIGFsbG9jYXRlZCBhdCBib290IHRpbWUuICBCb3RoIGFyZSBub3cKKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmx5IHdoZW4gdGhlIHR0eSBpcyBvcGVuLgorICoKKyAqIEFsc28gcmVzdHJ1Y3R1cmVkIHJvdXRpbmVzIHNvIHRoYXQgdGhlcmUgaXMgbW9yZSBvZiBhIHNlcGFyYXRpb24KKyAqIGJldHdlZW4gdGhlIGhpZ2gtbGV2ZWwgdHR5IHJvdXRpbmVzICh0dHlfaW8uYyBhbmQgdHR5X2lvY3RsLmMpIGFuZAorICogdGhlIGxvdy1sZXZlbCB0dHkgcm91dGluZXMgKHNlcmlhbC5jLCBwdHkuYywgY29uc29sZS5jKS4gIFRoaXMKKyAqIG1ha2VzIGZvciBjbGVhbmVyIGFuZCBtb3JlIGNvbXBhY3QgY29kZS4gIC1UWVQsIDkvMTcvOTIgCisgKgorICogTW9kaWZpZWQgYnkgRnJlZCBOLiB2YW4gS2VtcGVuLCAwMS8yOS85MywgdG8gYWRkIGxpbmUgZGlzY2lwbGluZXMKKyAqIHdoaWNoIGNhbiBiZSBkeW5hbWljYWxseSBhY3RpdmF0ZWQgYW5kIGRlLWFjdGl2YXRlZCBieSB0aGUgbGluZQorICogZGlzY2lwbGluZSBoYW5kbGluZyBtb2R1bGVzIChsaWtlIFNMSVApLgorICoKKyAqIE5PVEU6IHBheSBubyBhdHRlbnRpb24gdG8gdGhlIGxpbmUgZGlzY2lwbGluZSBjb2RlICh5ZXQpOyBpdHMKKyAqIGludGVyZmFjZSBpcyBzdGlsbCBzdWJqZWN0IHRvIGNoYW5nZSBpbiB0aGlzIHZlcnNpb24uLi4KKyAqIC0tIFRZVCwgMS8zMS85MgorICoKKyAqIEFkZGVkIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIE9QT1NUIHR0eSBoYW5kbGluZy4gIE5vIGRlbGF5cywgYnV0IGFsbAorICogb3RoZXIgYml0cyBzaG91bGQgYmUgdGhlcmUuCisgKgktLSBOaWNrIEhvbGxvd2F5IDxhbGZpZUBkY3Mud2Fyd2ljay5hYy51az4sIDI3dGggTWF5IDE5OTMuCisgKgorICogUmV3cm90ZSBjYW5vbmljYWwgbW9kZSBhbmQgYWRkZWQgbW9yZSB0ZXJtaW9zIGZsYWdzLgorICogCS0tIGp1bGlhbkB1aHVuaXgudWhjYy5oYXdhaWkuZWR1IChKLiBDb3dsZXkpLCAxM0phbjk0CisgKgorICogUmVvcmdhbml6ZWQgRkFTWU5DIHN1cHBvcnQgc28gbW91c2UgY29kZSBjYW4gc2hhcmUgaXQuCisgKgktLSBjdG1AYXJkaS5jb20sIDlTZXA5NQorICoKKyAqIE5ldyBUSU9DTElOVVggdmFyaWFudHMgYWRkZWQuCisgKgktLSBtakBrMzMyLmZlbGQuY3Z1dC5jeiwgMTktTm92LTk1CisgKiAKKyAqIFJlc3RyaWN0IHZ0IHN3aXRjaGluZyB2aWEgaW9jdGwoKQorICogICAgICAtLSBncmlmQGNzLnVjci5lZHUsIDUtRGVjLTk1CisgKgorICogTW92ZSBjb25zb2xlIGFuZCB2aXJ0dWFsIHRlcm1pbmFsIGNvZGUgdG8gbW9yZSBhcHByb3ByaWF0ZSBmaWxlcywKKyAqIGltcGxlbWVudCBDT05GSUdfVlQgYW5kIGdlbmVyYWxpemUgY29uc29sZSBkZXZpY2UgaW50ZXJmYWNlLgorICoJLS0gTWFya28gS29odGFsYSA8TWFya28uS29odGFsYUBodXQuZmk+LCBNYXJjaCA5NworICoKKyAqIFJld3JvdGUgaW5pdF9kZXYgYW5kIHJlbGVhc2VfZGV2IHRvIGVsaW1pbmF0ZSByYWNlcy4KKyAqCS0tIEJpbGwgSGF3ZXMgPHdoYXdlc0BzdGFyLm5ldD4sIEp1bmUgOTcKKyAqCisgKiBBZGRlZCBkZXZmcyBzdXBwb3J0LgorICogICAgICAtLSBDLiBTY290dCBBbmFuaWFuIDxjYW5hbmlhbkBhbHVtbmkucHJpbmNldG9uLmVkdT4sIDEzLUphbi0xOTk4CisgKgorICogQWRkZWQgc3VwcG9ydCBmb3IgYSBVbml4OTgtc3R5bGUgcHRteCBkZXZpY2UuCisgKiAgICAgIC0tIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiwgMTQtSmFuLTE5OTgKKyAqCisgKiBSZWR1Y2VkIG1lbW9yeSB1c2FnZSBmb3Igb2xkZXIgQVJNIHN5c3RlbXMKKyAqICAgICAgLS0gUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKyAqCisgKiBNb3ZlIGRvX1NBSygpIGludG8gcHJvY2VzcyBjb250ZXh0LiAgTGVzcyBzdGFjayB1c2UgaW4gZGV2ZnMgZnVuY3Rpb25zLgorICogYWxsb2NfdHR5X3N0cnVjdCgpIGFsd2F5cyB1c2VzIGttYWxsb2MoKSAtLSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuZXU+IDE3TWFyMDEKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldnB0c19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgva21vZC5oPgorCisjdW5kZWYgVFRZX0RFQlVHX0hBTkdVUAorCisjZGVmaW5lIFRUWV9QQVJBTk9JQV9DSEVDSyAxCisjZGVmaW5lIENIRUNLX1RUWV9DT1VOVCAxCisKK3N0cnVjdCB0ZXJtaW9zIHR0eV9zdGRfdGVybWlvcyA9IHsJLyogZm9yIHRoZSBiZW5lZml0IG9mIHR0eSBkcml2ZXJzICAqLworCS5jX2lmbGFnID0gSUNSTkwgfCBJWE9OLAorCS5jX29mbGFnID0gT1BPU1QgfCBPTkxDUiwKKwkuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wsCisJLmNfbGZsYWcgPSBJU0lHIHwgSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgRUNIT0sgfAorCQkgICBFQ0hPQ1RMIHwgRUNIT0tFIHwgSUVYVEVOLAorCS5jX2NjID0gSU5JVF9DX0NDCit9OworCitFWFBPUlRfU1lNQk9MKHR0eV9zdGRfdGVybWlvcyk7CisKKy8qIFRoaXMgbGlzdCBnZXRzIHBva2VkIGF0IGJ5IHByb2NmcyBhbmQgdmFyaW91cyBiaXRzIG9mIGJvb3QgdXAgY29kZS4gVGhpcworICAgY291bGQgZG8gd2l0aCBzb21lIHJhdGlvbmFsaXNhdGlvbiBzdWNoIGFzIHB1bGxpbmcgdGhlIHR0eSBwcm9jIGZ1bmN0aW9uCisgICBpbnRvIHRoaXMgZmlsZSAqLworICAgCitMSVNUX0hFQUQodHR5X2RyaXZlcnMpOwkJCS8qIGxpbmtlZCBsaXN0IG9mIHR0eSBkcml2ZXJzICovCisKKy8qIFNlbWFwaG9yZSB0byBwcm90ZWN0IGNyZWF0aW5nIGFuZCByZWxlYXNpbmcgYSB0dHkuIFRoaXMgaXMgc2hhcmVkIHdpdGgKKyAgIHZ0LmMgZm9yIGRlZXBseSBkaXNndXN0aW5nIGhhY2sgcmVhc29ucyAqLworREVDTEFSRV9NVVRFWCh0dHlfc2VtKTsKKworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICpwdG1fZHJpdmVyOwkvKiBVbml4OTggcHR5IG1hc3RlcnM7IGZvciAvZGV2L3B0bXggKi8KK2V4dGVybiBpbnQgcHR5X2xpbWl0OwkJLyogQ29uZmlnIGxpbWl0IG9uIFVuaXg5OCBwdHlzICovCitzdGF0aWMgREVGSU5FX0lEUihhbGxvY2F0ZWRfcHR5cyk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChhbGxvY2F0ZWRfcHR5c19sb2NrKTsKK3N0YXRpYyBpbnQgcHRteF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBkaXNhYmxlX2Vhcmx5X3ByaW50ayh2b2lkKTsKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV90dHlfc3RydWN0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCitzdGF0aWMgc3NpemVfdCB0dHlfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IHR0eV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3NzaXplX3QgcmVkaXJlY3RlZF90dHlfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgdW5zaWduZWQgaW50IHR0eV9wb2xsKHN0cnVjdCBmaWxlICosIHBvbGxfdGFibGUgKik7CitzdGF0aWMgaW50IHR0eV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgdHR5X3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworaW50IHR0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgaW50IG9uKTsKK2V4dGVybiB2b2lkIHJzXzM2MF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcmVsZWFzZV9tZW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCk7CisKKworc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0ICphbGxvY190dHlfc3RydWN0KHZvaWQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXR0eSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHlfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHR0eSkKKwkJbWVtc2V0KHR0eSwgMCwgc2l6ZW9mKHN0cnVjdCB0dHlfc3RydWN0KSk7CisJcmV0dXJuIHR0eTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfdHR5X3N0cnVjdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWtmcmVlKHR0eS0+d3JpdGVfYnVmKTsKKwlrZnJlZSh0dHkpOworfQorCisjZGVmaW5lIFRUWV9OVU1CRVIodHR5KSAoKHR0eSktPmluZGV4ICsgKHR0eSktPmRyaXZlci0+bmFtZV9iYXNlKQorCitjaGFyICp0dHlfbmFtZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyICpidWYpCit7CisJaWYgKCF0dHkpIC8qIEhtbS4gIE5VTEwgcG9pbnRlci4gIFRoYXQncyBmdW4uICovCisJCXN0cmNweShidWYsICJOVUxMIHR0eSIpOworCWVsc2UKKwkJc3RyY3B5KGJ1ZiwgdHR5LT5uYW1lKTsKKwlyZXR1cm4gYnVmOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9uYW1lKTsKKworaW5saW5lIGludCB0dHlfcGFyYW5vaWFfY2hlY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgVFRZX1BBUkFOT0lBX0NIRUNLCisJaWYgKCF0dHkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIm51bGwgVFRZIGZvciAoJWQ6JWQpIGluICVzXG4iLAorCQkJaW1ham9yKGlub2RlKSwgaW1pbm9yKGlub2RlKSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAodHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImJhZCBtYWdpYyBudW1iZXIgZm9yIHR0eSBzdHJ1Y3QgKCVkOiVkKSBpbiAlc1xuIiwKKwkJCWltYWpvcihpbm9kZSksIGltaW5vcihpbm9kZSksIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja190dHlfY291bnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBDSEVDS19UVFlfQ09VTlQKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCBjb3VudCA9IDA7CisJCisJZmlsZV9saXN0X2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ0dHktPnR0eV9maWxlcykgeworCQljb3VudCsrOworCX0KKwlmaWxlX2xpc3RfdW5sb2NrKCk7CisJaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKKwkgICAgdHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUgJiYKKwkgICAgdHR5LT5saW5rICYmIHR0eS0+bGluay0+Y291bnQpCisJCWNvdW50Kys7CisJaWYgKHR0eS0+Y291bnQgIT0gY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogZGV2ICglcykgdHR5LT5jb3VudCglZCkgIgorCQkJCSAgICAiIT0gI2ZkJ3MoJWQpIGluICVzXG4iLAorCQkgICAgICAgdHR5LT5uYW1lLCB0dHktPmNvdW50LCBjb3VudCwgcm91dGluZSk7CisJCXJldHVybiBjb3VudDsKKyAgICAgICB9CQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGlzIGlzIHByb2JhYmx5IG92ZXJraWxsIGZvciByZWFsIHdvcmxkIHByb2Nlc3NvcnMgYnV0CisgKgl0aGV5IGFyZSBub3Qgb24gaG90IHBhdGhzIHNvIGEgbGl0dGxlIGRpc2NpcGxpbmUgd29uJ3QgZG8gCisgKglhbnkgaGFybS4KKyAqLworIAorc3RhdGljIHZvaWQgdHR5X3NldF90ZXJtaW9zX2xkaXNjKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBudW0pCit7CisJZG93bigmdHR5LT50ZXJtaW9zX3NlbSk7CisJdHR5LT50ZXJtaW9zLT5jX2xpbmUgPSBudW07CisJdXAoJnR0eS0+dGVybWlvc19zZW0pOworfQorCisvKgorICoJVGhpcyBndWFyZHMgdGhlIHJlZmNvdW50ZWQgbGluZSBkaXNjaXBsaW5lIGxpc3RzLiBUaGUgbG9jaworICoJbXVzdCBiZSB0YWtlbiB3aXRoIGlycXMgb2ZmIGJlY2F1c2UgdGhlcmUgYXJlIGhhbmd1cCBwYXRoCisgKgljYWxsZXJzIHdobyB3aWxsIGRvIGxkaXNjIGxvb2t1cHMgYW5kIGNhbm5vdCBzbGVlcC4KKyAqLworIAorc3RhdGljIERFRklORV9TUElOTE9DSyh0dHlfbGRpc2NfbG9jayk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodHR5X2xkaXNjX3dhaXQpOworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjc1tOUl9MRElTQ1NdOwkvKiBsaW5lIGRpc2MgZGlzcGF0Y2ggdGFibGUJKi8KKworaW50IHR0eV9yZWdpc3Rlcl9sZGlzYyhpbnQgZGlzYywgc3RydWN0IHR0eV9sZGlzYyAqbmV3X2xkaXNjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJCisJaWYgKGRpc2MgPCBOX1RUWSB8fCBkaXNjID49IE5SX0xESVNDUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJaWYgKG5ld19sZGlzYykgeworCQl0dHlfbGRpc2NzW2Rpc2NdID0gKm5ld19sZGlzYzsKKwkJdHR5X2xkaXNjc1tkaXNjXS5udW0gPSBkaXNjOworCQl0dHlfbGRpc2NzW2Rpc2NdLmZsYWdzIHw9IExESVNDX0ZMQUdfREVGSU5FRDsKKwkJdHR5X2xkaXNjc1tkaXNjXS5yZWZjb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYodHR5X2xkaXNjc1tkaXNjXS5yZWZjb3VudCkKKwkJCXJldCA9IC1FQlVTWTsKKwkJZWxzZQorCQkJdHR5X2xkaXNjc1tkaXNjXS5mbGFncyAmPSB+TERJU0NfRkxBR19ERUZJTkVEOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCQorCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X3JlZ2lzdGVyX2xkaXNjKTsKKworc3RydWN0IHR0eV9sZGlzYyAqdHR5X2xkaXNjX2dldChpbnQgZGlzYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJaWYgKGRpc2MgPCBOX1RUWSB8fCBkaXNjID49IE5SX0xESVNDUykKKwkJcmV0dXJuIE5VTEw7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisKKwlsZCA9ICZ0dHlfbGRpc2NzW2Rpc2NdOworCS8qIENoZWNrIHRoZSBlbnRyeSBpcyBkZWZpbmVkICovCisJaWYobGQtPmZsYWdzICYgTERJU0NfRkxBR19ERUZJTkVEKQorCXsKKwkJLyogSWYgdGhlIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZCB3ZSBjYW4ndCB1c2UgaXQgKi8KKwkJaWYgKCF0cnlfbW9kdWxlX2dldChsZC0+b3duZXIpKQorCQkgICAgICAgCWxkID0gTlVMTDsKKwkJZWxzZSAvKiBsb2NrIGl0ICovCisJCQlsZC0+cmVmY291bnQrKzsKKwl9CisJZWxzZQorCQlsZCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbGQ7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV9sZGlzY19nZXQpOworCit2b2lkIHR0eV9sZGlzY19wdXQoaW50IGRpc2MpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGlzYyA8IE5fVFRZIHx8IGRpc2MgPj0gTlJfTERJU0NTKQorCQlCVUcoKTsKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJbGQgPSAmdHR5X2xkaXNjc1tkaXNjXTsKKwlpZihsZC0+cmVmY291bnQgPT0gMCkKKwkJQlVHKCk7CisJbGQtPnJlZmNvdW50IC0tOworCW1vZHVsZV9wdXQobGQtPm93bmVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworfQorCQorRVhQT1JUX1NZTUJPTF9HUEwodHR5X2xkaXNjX3B1dCk7CisKK3N0YXRpYyB2b2lkIHR0eV9sZGlzY19hc3NpZ24oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9sZGlzYyAqbGQpCit7CisJdHR5LT5sZGlzYyA9ICpsZDsKKwl0dHktPmxkaXNjLnJlZmNvdW50ID0gMDsKK30KKworLyoqCisgKgl0dHlfbGRpc2NfdHJ5CQktCWludGVybmFsIGhlbHBlcgorICoJQHR0eTogdGhlIHR0eQorICoKKyAqCU1ha2UgYSBzaW5nbGUgYXR0ZW1wdCB0byBncmFiIGFuZCBidW1wIHRoZSByZWZjb3VudCBvbgorICoJdGhlIHR0eSBsZGlzYy4gUmV0dXJuIDAgb24gZmFpbHVyZSBvciAxIG9uIHN1Y2Nlc3MuIFRoaXMgaXMKKyAqCXVzZWQgdG8gaW1wbGVtZW50IGJvdGggdGhlIHdhaXRpbmcgYW5kIG5vbiB3YWl0aW5nIHZlcnNpb25zCisgKglvZiB0dHlfbGRpc2NfcmVmCisgKi8KKworc3RhdGljIGludCB0dHlfbGRpc2NfdHJ5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlpbnQgcmV0ID0gMDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlsZCA9ICZ0dHktPmxkaXNjOworCWlmKHRlc3RfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpKQorCXsKKwkJbGQtPnJlZmNvdW50Kys7CisJCXJldCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl0dHlfbGRpc2NfcmVmX3dhaXQJLQl3YWl0IGZvciB0aGUgdHR5IGxkaXNjCisgKglAdHR5OiB0dHkgZGV2aWNlCisgKgorICoJRGVyZWZlcmVuY2UgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgdGhlIHRlcm1pbmFsIGFuZCB0YWtlIGEgCisgKglyZWZlcmVuY2UgdG8gaXQuIElmIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgaW4gZmx1eCB0aGVuIAorICoJd2FpdCBwYXRpZW50bHkgdW50aWwgaXQgY2hhbmdlcy4KKyAqCisgKglOb3RlOiBNdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBhbiBJUlEvdGltZXIgY29udGV4dC4gVGhlIGNhbGxlcgorICoJbXVzdCBhbHNvIGJlIGNhcmVmdWwgbm90IHRvIGhvbGQgb3RoZXIgbG9ja3MgdGhhdCB3aWxsIGRlYWRsb2NrCisgKglhZ2FpbnN0IGEgZGlzY2lwbGluZSBjaGFuZ2UsIHN1Y2ggYXMgYW4gZXhpc3RpbmcgbGRpc2MgcmVmZXJlbmNlCisgKgkod2hpY2ggd2UgY2hlY2sgZm9yKQorICovCisgCitzdHJ1Y3QgdHR5X2xkaXNjICp0dHlfbGRpc2NfcmVmX3dhaXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwkvKiB3YWl0X2V2ZW50IGlzIGEgbWFjcm8gKi8KKwl3YWl0X2V2ZW50KHR0eV9sZGlzY193YWl0LCB0dHlfbGRpc2NfdHJ5KHR0eSkpOworCWlmKHR0eS0+bGRpc2MucmVmY291bnQgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJ0dHlfbGRpc2NfcmVmX3dhaXRcbiIpOworCXJldHVybiAmdHR5LT5sZGlzYzsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X2xkaXNjX3JlZl93YWl0KTsKKworLyoqCisgKgl0dHlfbGRpc2NfcmVmCQktCWdldCB0aGUgdHR5IGxkaXNjCisgKglAdHR5OiB0dHkgZGV2aWNlCisgKgorICoJRGVyZWZlcmVuY2UgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgdGhlIHRlcm1pbmFsIGFuZCB0YWtlIGEgCisgKglyZWZlcmVuY2UgdG8gaXQuIElmIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgaW4gZmx1eCB0aGVuIAorICoJcmV0dXJuIE5VTEwuIENhbiBiZSBjYWxsZWQgZnJvbSBJUlEgYW5kIHRpbWVyIGZ1bmN0aW9ucy4KKyAqLworIAorc3RydWN0IHR0eV9sZGlzYyAqdHR5X2xkaXNjX3JlZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmKHR0eV9sZGlzY190cnkodHR5KSkKKwkJcmV0dXJuICZ0dHktPmxkaXNjOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfcmVmKTsKKworLyoqCisgKgl0dHlfbGRpc2NfZGVyZWYJCS0JZnJlZSBhIHR0eSBsZGlzYyByZWZlcmVuY2UKKyAqCUBsZDogcmVmZXJlbmNlIHRvIGZyZWUgdXAKKyAqCisgKglVbmRvZXMgdGhlIGVmZmVjdCBvZiB0dHlfbGRpc2NfcmVmIG9yIHR0eV9sZGlzY19yZWZfd2FpdC4gTWF5CisgKgliZSBjYWxsZWQgaW4gSVJRIGNvbnRleHQuCisgKi8KKyAKK3ZvaWQgdHR5X2xkaXNjX2RlcmVmKHN0cnVjdCB0dHlfbGRpc2MgKmxkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZihsZCA9PSBOVUxMKQorCQlCVUcoKTsKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJaWYobGQtPnJlZmNvdW50ID09IDApCisJCXByaW50ayhLRVJOX0VSUiAidHR5X2xkaXNjX2RlcmVmOiBubyByZWZlcmVuY2VzLlxuIik7CisJZWxzZQorCQlsZC0+cmVmY291bnQtLTsKKwlpZihsZC0+cmVmY291bnQgPT0gMCkKKwkJd2FrZV91cCgmdHR5X2xkaXNjX3dhaXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV9sZGlzY19kZXJlZik7CisKKy8qKgorICoJdHR5X2xkaXNjX2VuYWJsZQktCWFsbG93IGxkaXNjIHVzZQorICoJQHR0eTogdGVybWluYWwgdG8gYWN0aXZhdGUgbGRpc2Mgb24KKyAqCisgKglTZXQgdGhlIFRUWV9MRElTQyBmbGFnIHdoZW4gdGhlIGxpbmUgZGlzY2lwbGluZSBjYW4gYmUgY2FsbGVkCisgKglhZ2Fpbi4gRG8gbmVjY2Vzc2FyeSB3YWtldXBzIGZvciBleGlzdGluZyBzbGVlcGVycy4KKyAqCisgKglOb3RlOiBub2JvZHkgc2hvdWxkIHNldCB0aGlzIGJpdCBleGNlcHQgdmlhIHRoaXMgZnVuY3Rpb24uIENsZWFyaW5nCisgKglkaXJlY3RseSBpcyBhbGxvd2VkLgorICovCisKK3N0YXRpYyB2b2lkIHR0eV9sZGlzY19lbmFibGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzZXRfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpOworCXdha2VfdXAoJnR0eV9sZGlzY193YWl0KTsKK30KKwkKKy8qKgorICoJdHR5X3NldF9sZGlzYwkJLQlzZXQgbGluZSBkaXNjaXBsaW5lCisgKglAdHR5OiB0aGUgdGVybWluYWwgdG8gc2V0CisgKglAbGRpc2M6IHRoZSBsaW5lIGRpc2NpcGxpbmUKKyAqCisgKglTZXQgdGhlIGRpc2NpcGxpbmUgb2YgYSB0dHkgbGluZS4gTXVzdCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MKKyAqCWNvbnRleHQuCisgKi8KKyAKK3N0YXRpYyBpbnQgdHR5X3NldF9sZGlzYyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbGRpc2MpCit7CisJaW50CXJldHZhbCA9IDA7CisJc3RydWN0CXR0eV9sZGlzYyBvX2xkaXNjOworCWNoYXIgYnVmWzY0XTsKKwlpbnQgd29yazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJaWYgKChsZGlzYyA8IE5fVFRZKSB8fCAobGRpc2MgPj0gTlJfTERJU0NTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKK3Jlc3RhcnQ6CisKKwlpZiAodHR5LT5sZGlzYy5udW0gPT0gbGRpc2MpCisJCXJldHVybiAwOwkvKiBXZSBhcmUgYWxyZWFkeSBpbiB0aGUgZGVzaXJlZCBkaXNjaXBsaW5lICovCisJCisJbGQgPSB0dHlfbGRpc2NfZ2V0KGxkaXNjKTsKKwkvKiBFZHVhcmRvIEJsYW5jbyA8ZWpic0Bjcy5jcy5jb20udXk+ICovCisJLyogQ3lydXMgRHVyZ2luIDxjaWRlckBzcGVha2Vhc3kub3JnPiAqLworCWlmIChsZCA9PSBOVUxMKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJ0dHktbGRpc2MtJWQiLCBsZGlzYyk7CisJCWxkID0gdHR5X2xkaXNjX2dldChsZGlzYyk7CisJfQorCWlmIChsZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9fbGRpc2MgPSB0dHktPmxkaXNjOworCisJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCisJLyoKKwkgKglNYWtlIHN1cmUgd2UgZG9uJ3QgY2hhbmdlIHdoaWxlIHNvbWVvbmUgaG9sZHMgYQorCSAqCXJlZmVyZW5jZSB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGUgVFRZX0xESVNDIGJpdAorCSAqCXByZXZlbnRzIGFueW9uZSB0YWtpbmcgYSByZWZlcmVuY2Ugb25jZSBpdCBpcyBjbGVhci4KKwkgKglXZSBuZWVkIHRoZSBsb2NrIHRvIGF2b2lkIHJhY2luZyByZWZlcmVuY2UgdGFrZXJzLgorCSAqLworCSAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlpZih0dHktPmxkaXNjLnJlZmNvdW50KQorCXsKKwkJLyogRnJlZSB0aGUgbmV3IGxkaXNjIHdlIGdyYWJiZWQuIE11c3QgZHJvcCB0aGUgbG9jaworCQkgICBmaXJzdC4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwkJdHR5X2xkaXNjX3B1dChsZGlzYyk7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2UgbWF5IGJlIGJ1c3ksIGluY2x1ZGluZworCQkgKiByYW5kb20gbW9tZW50YXJ5IEkvTyB0cmFmZmljLiBXZSBtdXN0IHRoZXJlZm9yZQorCQkgKiByZXRyeS4gV2UgY291bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiBibG9ja2luZyBvcHMKKwkJICogYW5kIHJldHJpZXMgaWYgd2UgbWFkZSB0dHlfbGRpc2Nfd2FpdCgpIHNtYXJ0ZXIuIFRoYXQKKwkJICogaXMgdXAgZm9yIGRpc2N1c3Npb24uCisJCSAqLworCQlpZih3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodHR5X2xkaXNjX3dhaXQsIHR0eS0+bGRpc2MucmVmY291bnQgPT0gMCkgPCAwKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsJCQkKKwkJZ290byByZXN0YXJ0OworCX0KKwljbGVhcl9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7CQorCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwkKKwkvKgorCSAqCUZyb20gdGhpcyBwb2ludCBvbiB3ZSBrbm93IG5vYm9keSBoYXMgYW4gbGRpc2MKKwkgKgl1c2FnZSByZWZlcmVuY2UsIG5vciBjYW4gdGhleSBvYnRhaW4gb25lIHVudGlsCisJICoJd2Ugc2F5IHNvIGxhdGVyIG9uLgorCSAqLworCSAKKwl3b3JrID0gY2FuY2VsX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmspOworCS8qCisJICogV2FpdCBmb3IgLT5oYW5ndXBfd29yayBhbmQgLT5mbGlwLndvcmsgaGFuZGxlcnMgdG8gdGVybWluYXRlCisJICovCisJIAorCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJLyogU2h1dGRvd24gdGhlIGN1cnJlbnQgZGlzY2lwbGluZS4gKi8KKwlpZiAodHR5LT5sZGlzYy5jbG9zZSkKKwkJKHR0eS0+bGRpc2MuY2xvc2UpKHR0eSk7CisKKwkvKiBOb3cgc2V0IHVwIHRoZSBuZXcgbGluZSBkaXNjaXBsaW5lLiAqLworCXR0eV9sZGlzY19hc3NpZ24odHR5LCBsZCk7CisJdHR5X3NldF90ZXJtaW9zX2xkaXNjKHR0eSwgbGRpc2MpOworCWlmICh0dHktPmxkaXNjLm9wZW4pCisJCXJldHZhbCA9ICh0dHktPmxkaXNjLm9wZW4pKHR0eSk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJdHR5X2xkaXNjX3B1dChsZGlzYyk7CisJCS8qIFRoZXJlIGlzIGFuIG91dHN0YW5kaW5nIHJlZmVyZW5jZSBoZXJlIHNvIHRoaXMgaXMgc2FmZSAqLworCQl0dHlfbGRpc2NfYXNzaWduKHR0eSwgdHR5X2xkaXNjX2dldChvX2xkaXNjLm51bSkpOworCQl0dHlfc2V0X3Rlcm1pb3NfbGRpc2ModHR5LCB0dHktPmxkaXNjLm51bSk7CisJCWlmICh0dHktPmxkaXNjLm9wZW4gJiYgKHR0eS0+bGRpc2Mub3Blbih0dHkpIDwgMCkpIHsKKwkJCXR0eV9sZGlzY19wdXQob19sZGlzYy5udW0pOworCQkJLyogVGhpcyBkcml2ZXIgaXMgYWx3YXlzIHByZXNlbnQgKi8KKwkJCXR0eV9sZGlzY19hc3NpZ24odHR5LCB0dHlfbGRpc2NfZ2V0KE5fVFRZKSk7CisJCQl0dHlfc2V0X3Rlcm1pb3NfbGRpc2ModHR5LCBOX1RUWSk7CisJCQlpZiAodHR5LT5sZGlzYy5vcGVuKSB7CisJCQkJaW50IHIgPSB0dHktPmxkaXNjLm9wZW4odHR5KTsKKworCQkJCWlmIChyIDwgMCkKKwkJCQkJcGFuaWMoIkNvdWxkbid0IG9wZW4gTl9UVFkgbGRpc2MgZm9yICIKKwkJCQkJICAgICAgIiVzIC0tLSBlcnJvciAlZC4iLAorCQkJCQkgICAgICB0dHlfbmFtZSh0dHksIGJ1ZiksIHIpOworCQkJfQorCQl9CisJfQorCS8qIEF0IHRoaXMgcG9pbnQgd2UgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3IGxkaXNjIGFuZCBhCisJICAgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBsZGlzYy4gSWYgd2UgZW5kZWQgdXAgZmxpcHBpbmcgYmFjaworCSAgIHRvIHRoZSBleGlzdGluZyBsZGlzYyB3ZSBoYXZlIHR3byByZWZlcmVuY2VzIHRvIGl0ICovCisJCisJaWYgKHR0eS0+bGRpc2MubnVtICE9IG9fbGRpc2MubnVtICYmIHR0eS0+ZHJpdmVyLT5zZXRfbGRpc2MpCisJCXR0eS0+ZHJpdmVyLT5zZXRfbGRpc2ModHR5KTsKKwkJCisJdHR5X2xkaXNjX3B1dChvX2xkaXNjLm51bSk7CisJCisJLyoKKwkgKglBbGxvdyBsZGlzYyByZWZlcmVuY2luZyB0byBvY2N1ciBhcyBzb29uIGFzIHRoZSBkcml2ZXIKKwkgKglsZGlzYyBjYWxsYmFjayBjb21wbGV0ZXMuCisJICovCisJIAorCXR0eV9sZGlzY19lbmFibGUodHR5KTsKKwkKKwkvKiBSZXN0YXJ0IGl0IGluIGNhc2Ugbm8gY2hhcmFjdGVycyBraWNrIGl0IG9mZi4gU2FmZSBpZgorCSAgIGFscmVhZHkgcnVubmluZyAqLworCWlmKHdvcmspCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIHR0eSBkcml2ZXIgc3RydWN0dXJlLCBnaXZlbiBhIGRldmljZSBudW1iZXIKKyAqLworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpnZXRfdHR5X2RyaXZlcihkZXZfdCBkZXZpY2UsIGludCAqaW5kZXgpCit7CisJc3RydWN0IHR0eV9kcml2ZXIgKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0dHlfZHJpdmVycywgdHR5X2RyaXZlcnMpIHsKKwkJZGV2X3QgYmFzZSA9IE1LREVWKHAtPm1ham9yLCBwLT5taW5vcl9zdGFydCk7CisJCWlmIChkZXZpY2UgPCBiYXNlIHx8IGRldmljZSA+PSBiYXNlICsgcC0+bnVtKQorCQkJY29udGludWU7CisJCSppbmRleCA9IGRldmljZSAtIGJhc2U7CisJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIElmIHdlIHRyeSB0byB3cml0ZSB0bywgb3Igc2V0IHRoZSBzdGF0ZSBvZiwgYSB0ZXJtaW5hbCBhbmQgd2UncmUKKyAqIG5vdCBpbiB0aGUgZm9yZWdyb3VuZCwgc2VuZCBhIFNJR1RUT1UuICBJZiB0aGUgc2lnbmFsIGlzIGJsb2NrZWQgb3IKKyAqIGlnbm9yZWQsIGdvIGFoZWFkIGFuZCBwZXJmb3JtIHRoZSBvcGVyYXRpb24uICAoUE9TSVggNy4yKQorICovCitpbnQgdHR5X2NoZWNrX2NoYW5nZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5KQorCQlyZXR1cm4gMDsKKwlpZiAodHR5LT5wZ3JwIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidHR5X2NoZWNrX2NoYW5nZTogdHR5LT5wZ3JwIDw9IDAhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9jZXNzX2dyb3VwKGN1cnJlbnQpID09IHR0eS0+cGdycCkKKwkJcmV0dXJuIDA7CisJaWYgKGlzX2lnbm9yZWQoU0lHVFRPVSkpCisJCXJldHVybiAwOworCWlmIChpc19vcnBoYW5lZF9wZ3JwKHByb2Nlc3NfZ3JvdXAoY3VycmVudCkpKQorCQlyZXR1cm4gLUVJTzsKKwkodm9pZCkga2lsbF9wZyhwcm9jZXNzX2dyb3VwKGN1cnJlbnQpLCBTSUdUVE9VLCAxKTsKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9jaGVja19jaGFuZ2UpOworCitzdGF0aWMgc3NpemVfdCBodW5nX3VwX3R0eV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh1bmdfdXBfdHR5X3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlPOworfQorCisvKiBObyBrZXJuZWwgbG9jayBoZWxkIC0gbm9uZSBuZWVkZWQgOykgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHVuZ191cF90dHlfcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXJldHVybiBQT0xMSU4gfCBQT0xMT1VUIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUkROT1JNIHwgUE9MTFdSTk9STTsKK30KKworc3RhdGljIGludCBodW5nX3VwX3R0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gY21kID09IFRJT0NTUEdSUCA/IC1FTk9UVFkgOiAtRUlPOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0dHlfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSB0dHlfcmVhZCwKKwkud3JpdGUJCT0gdHR5X3dyaXRlLAorCS5wb2xsCQk9IHR0eV9wb2xsLAorCS5pb2N0bAkJPSB0dHlfaW9jdGwsCisJLm9wZW4JCT0gdHR5X29wZW4sCisJLnJlbGVhc2UJPSB0dHlfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHR0eV9mYXN5bmMsCit9OworCisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwdG14X2ZvcHMgPSB7CisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gdHR5X3JlYWQsCisJLndyaXRlCQk9IHR0eV93cml0ZSwKKwkucG9sbAkJPSB0dHlfcG9sbCwKKwkuaW9jdGwJCT0gdHR5X2lvY3RsLAorCS5vcGVuCQk9IHB0bXhfb3BlbiwKKwkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAorCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29uc29sZV9mb3BzID0geworCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHR0eV9yZWFkLAorCS53cml0ZQkJPSByZWRpcmVjdGVkX3R0eV93cml0ZSwKKwkucG9sbAkJPSB0dHlfcG9sbCwKKwkuaW9jdGwJCT0gdHR5X2lvY3RsLAorCS5vcGVuCQk9IHR0eV9vcGVuLAorCS5yZWxlYXNlCT0gdHR5X3JlbGVhc2UsCisJLmZhc3luYwkJPSB0dHlfZmFzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHVuZ191cF90dHlfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBodW5nX3VwX3R0eV9yZWFkLAorCS53cml0ZQkJPSBodW5nX3VwX3R0eV93cml0ZSwKKwkucG9sbAkJPSBodW5nX3VwX3R0eV9wb2xsLAorCS5pb2N0bAkJPSBodW5nX3VwX3R0eV9pb2N0bCwKKwkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAorfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhyZWRpcmVjdF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZSAqcmVkaXJlY3Q7CisKKy8qKgorICoJdHR5X3dha2V1cAktCXJlcXVlc3QgbW9yZSBkYXRhCisgKglAdHR5OiB0ZXJtaW5hbAorICoKKyAqCUludGVybmFsIGFuZCBleHRlcm5hbCBoZWxwZXIgZm9yIHdha2V1cHMgb2YgdHR5LiBUaGlzIGZ1bmN0aW9uCisgKglpbmZvcm1zIHRoZSBsaW5lIGRpc2NpcGxpbmUgaWYgcHJlc2VudCB0aGF0IHRoZSBkcml2ZXIgaXMgcmVhZHkKKyAqCXRvIHJlY2VpdmUgbW9yZSBvdXRwdXQgZGF0YS4KKyAqLworIAordm9pZCB0dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJCisJaWYgKHRlc3RfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKSkgeworCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwkJaWYobGQpIHsKKwkJCWlmKGxkLT53cml0ZV93YWtldXApCisJCQkJbGQtPndyaXRlX3dha2V1cCh0dHkpOworCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwkJfQorCX0KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV93YWtldXApOworCisvKioKKyAqCXR0eV9sZGlzY19mbHVzaAktCWZsdXNoIGxpbmUgZGlzY2lwbGluZSBxdWV1ZQorICoJQHR0eTogdHR5CisgKgorICoJRmx1c2ggdGhlIGxpbmUgZGlzY2lwbGluZSBxdWV1ZSAoaWYgYW55KSBmb3IgdGhpcyB0dHkuIElmIHRoZXJlCisgKglpcyBubyBsaW5lIGRpc2NpcGxpbmUgYWN0aXZlIHRoaXMgaXMgYSBuby1vcC4KKyAqLworIAordm9pZCB0dHlfbGRpc2NfZmx1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZihsZCkgeworCQlpZihsZC0+Zmx1c2hfYnVmZmVyKQorCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X2xkaXNjX2ZsdXNoKTsKKwkKKy8qCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYnkgdGhlICJldmVudGQiIGtlcm5lbCB0aHJlYWQuICBUaGF0IGlzIHByb2Nlc3Mgc3luY2hyb25vdXMsCisgKiBidXQgZG9lc24ndCBob2xkIGFueSBsb2Nrcywgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgYXBwcm9wcmlhdGUKKyAqIGxvY2tzIGZvciB3aGF0IHdlJ3JlIGRvaW5nLi4KKyAqLworc3RhdGljIHZvaWQgZG9fdHR5X2hhbmd1cCh2b2lkICpkYXRhKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgZGF0YTsKKwlzdHJ1Y3QgZmlsZSAqIGNvbnNfZmlscCA9IE5VTEw7CisJc3RydWN0IGZpbGUgKmZpbHAsICpmID0gTlVMTDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJaW50ICAgIGNsb3NlY291bnQgPSAwLCBuOworCisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCS8qIGludXNlX2ZpbHBzIGlzIHByb3RlY3RlZCBieSB0aGUgc2luZ2xlIGtlcm5lbCBsb2NrICovCisJbG9ja19rZXJuZWwoKTsKKworCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7CisJaWYgKHJlZGlyZWN0ICYmIHJlZGlyZWN0LT5wcml2YXRlX2RhdGEgPT0gdHR5KSB7CisJCWYgPSByZWRpcmVjdDsKKwkJcmVkaXJlY3QgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7CisJCisJY2hlY2tfdHR5X2NvdW50KHR0eSwgImRvX3R0eV9oYW5ndXAiKTsKKwlmaWxlX2xpc3RfbG9jaygpOworCS8qIFRoaXMgYnJlYWtzIGZvciBmaWxlIGhhbmRsZXMgYmVpbmcgc2VudCBvdmVyIEFGX1VOSVggc29ja2V0cyA/ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWxwLCAmdHR5LT50dHlfZmlsZXMsIGZfbGlzdCkgeworCQlpZiAoZmlscC0+Zl9vcC0+d3JpdGUgPT0gcmVkaXJlY3RlZF90dHlfd3JpdGUpCisJCQljb25zX2ZpbHAgPSBmaWxwOworCQlpZiAoZmlscC0+Zl9vcC0+d3JpdGUgIT0gdHR5X3dyaXRlKQorCQkJY29udGludWU7CisJCWNsb3NlY291bnQrKzsKKwkJdHR5X2Zhc3luYygtMSwgZmlscCwgMCk7CS8qIGNhbid0IGJsb2NrICovCisJCWZpbHAtPmZfb3AgPSAmaHVuZ191cF90dHlfZm9wczsKKwl9CisJZmlsZV9saXN0X3VubG9jaygpOworCQorCS8qIEZJWE1FISBXaGF0IGFyZSB0aGUgbG9ja2luZyBpc3N1ZXMgaGVyZT8gVGhpcyBtYXkgbWUgb3ZlcmRvaW5nIHRoaW5ncy4uCisJICogdGhpcyBxdWVzdGlvbiBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBub3cgdGhhdCB3ZSd2ZSByZW1vdmVkIHRoZSBpcnFsb2NrLiAqLworCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYobGQgIT0gTlVMTCkJLyogV2UgbWF5IGhhdmUgbm8gbGluZSBkaXNjaXBsaW5lIGF0IHRoaXMgcG9pbnQgKi8KKwl7CisJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQorCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOworCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJaWYgKCh0ZXN0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncykpICYmCisJCSAgICBsZC0+d3JpdGVfd2FrZXVwKQorCQkJbGQtPndyaXRlX3dha2V1cCh0dHkpOworCQlpZiAobGQtPmhhbmd1cCkKKwkJCWxkLT5oYW5ndXAodHR5KTsKKwl9CisKKwkvKiBGSVhNRTogT25jZSB3ZSB0cnVzdCB0aGUgTERJU0MgY29kZSBiZXR0ZXIgd2UgY2FuIHdhaXQgaGVyZSBmb3IKKwkgICBsZGlzYyBjb21wbGV0aW9uIGFuZCBmaXggdGhlIGRyaXZlciBjYWxsIHJhY2UgKi8KKwkgICAKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7CisKKwkvKgorCSAqIFNodXRkb3duIHRoZSBjdXJyZW50IGxpbmUgZGlzY2lwbGluZSwgYW5kIHJlc2V0IGl0IHRvCisJICogTl9UVFkuCisJICovCisJaWYgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUykKKwl7CisJCWRvd24oJnR0eS0+dGVybWlvc19zZW0pOworCQkqdHR5LT50ZXJtaW9zID0gdHR5LT5kcml2ZXItPmluaXRfdGVybWlvczsKKwkJdXAoJnR0eS0+dGVybWlvc19zZW0pOworCX0KKwkKKwkvKiBEZWZlciBsZGlzYyBzd2l0Y2ggKi8KKwkvKiB0dHlfZGVmZXJyZWRfbGRpc2Nfc3dpdGNoKE5fVFRZKTsKKwkKKwkgIFRoaXMgc2hvdWxkIGdldCBkb25lIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcG9ydCBjbG9zZXMgYW5kCisJICB0dHlfcmVsZWFzZSBpcyBjYWxsZWQgKi8KKwkKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICh0dHktPnNlc3Npb24gPiAwKSB7CisJCWRvX2VhY2hfdGFza19waWQodHR5LT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgeworCQkJaWYgKHAtPnNpZ25hbC0+dHR5ID09IHR0eSkKKwkJCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7CisJCQlpZiAoIXAtPnNpZ25hbC0+bGVhZGVyKQorCQkJCWNvbnRpbnVlOworCQkJc2VuZF9ncm91cF9zaWdfaW5mbyhTSUdIVVAsIFNFTkRfU0lHX1BSSVYsIHApOworCQkJc2VuZF9ncm91cF9zaWdfaW5mbyhTSUdDT05ULCBTRU5EX1NJR19QUklWLCBwKTsKKwkJCWlmICh0dHktPnBncnAgPiAwKQorCQkJCXAtPnNpZ25hbC0+dHR5X29sZF9wZ3JwID0gdHR5LT5wZ3JwOworCQl9IHdoaWxlX2VhY2hfdGFza19waWQodHR5LT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCk7CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCXR0eS0+ZmxhZ3MgPSAwOworCXR0eS0+c2Vzc2lvbiA9IDA7CisJdHR5LT5wZ3JwID0gLTE7CisJdHR5LT5jdHJsX3N0YXR1cyA9IDA7CisJLyoKKwkgKglJZiBvbmUgb2YgdGhlIGRldmljZXMgbWF0Y2hlcyBhIGNvbnNvbGUgcG9pbnRlciwgd2UKKwkgKgljYW5ub3QganVzdCBjYWxsIGhhbmd1cCgpIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisJICoJdHR5LT5jb3VudCBhbmQgc3RhdGUtPmNvdW50IHRvIGdvIG91dCBvZiBzeW5jLgorCSAqCVNvIHdlIGp1c3QgY2FsbCBjbG9zZSgpIHRoZSByaWdodCBudW1iZXIgb2YgdGltZXMuCisJICovCisJaWYgKGNvbnNfZmlscCkgeworCQlpZiAodHR5LT5kcml2ZXItPmNsb3NlKQorCQkJZm9yIChuID0gMDsgbiA8IGNsb3NlY291bnQ7IG4rKykKKwkJCQl0dHktPmRyaXZlci0+Y2xvc2UodHR5LCBjb25zX2ZpbHApOworCX0gZWxzZSBpZiAodHR5LT5kcml2ZXItPmhhbmd1cCkKKwkJKHR0eS0+ZHJpdmVyLT5oYW5ndXApKHR0eSk7CisJCQorCS8qIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSBkcml2ZXIvbGRpc2MgaW50ZXJhY3Rpb25zIGJleW9uZAorCSAgIHRoZSBvbmVzIHdlIGRpZCBoZXJlLiBUaGUgZHJpdmVyIGxheWVyIGV4cGVjdHMgbm8KKwkgICBjYWxscyBhZnRlciAtPmhhbmd1cCgpIGZyb20gdGhlIGxkaXNjIHNpZGUuIEhvd2V2ZXIgd2UKKwkgICBjYW4ndCB5ZXQgZ3VhcmFudGVlIGFsbCB0aGF0ICovCisKKwlzZXRfYml0KFRUWV9IVVBQRUQsICZ0dHktPmZsYWdzKTsKKwlpZiAobGQpIHsKKwkJdHR5X2xkaXNjX2VuYWJsZSh0dHkpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKGYpCisJCWZwdXQoZik7Cit9CisKK3ZvaWQgdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCisJY2hhcglidWZbNjRdOworCQorCXByaW50ayhLRVJOX0RFQlVHICIlcyBoYW5ndXAuLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CisjZW5kaWYKKwlzY2hlZHVsZV93b3JrKCZ0dHktPmhhbmd1cF93b3JrKTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfaGFuZ3VwKTsKKwordm9pZCB0dHlfdmhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCisJY2hhcglidWZbNjRdOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIHZoYW5ndXAuLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CisjZW5kaWYKKwlkb190dHlfaGFuZ3VwKCh2b2lkICopIHR0eSk7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV92aGFuZ3VwKTsKKworaW50IHR0eV9odW5nX3VwX3Aoc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiAoZmlscC0+Zl9vcCA9PSAmaHVuZ191cF90dHlfZm9wcyk7Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X2h1bmdfdXBfcCk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSBjYWxsZWQgb25seSBieSB0aGUgc2Vzc2lvbiBsZWFkZXIsIHdoZW4KKyAqIGl0IHdhbnRzIHRvIGRpc2Fzc29jaWF0ZSBpdHNlbGYgZnJvbSBpdHMgY29udHJvbGxpbmcgdHR5LgorICoKKyAqIEl0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICogCSgxKSAgU2VuZHMgYSBTSUdIVVAgYW5kIFNJR0NPTlQgdG8gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cAorICogCSgyKSAgQ2xlYXJzIHRoZSB0dHkgZnJvbSBiZWluZyBjb250cm9sbGluZyB0aGUgc2Vzc2lvbgorICogCSgzKSAgQ2xlYXJzIHRoZSBjb250cm9sbGluZyB0dHkgZm9yIGFsbCBwcm9jZXNzZXMgaW4gdGhlCisgKiAJCXNlc3Npb24gZ3JvdXAuCisgKgorICogVGhlIGFyZ3VtZW50IG9uX2V4aXQgaXMgc2V0IHRvIDEgaWYgY2FsbGVkIHdoZW4gYSBwcm9jZXNzIGlzCisgKiBleGl0aW5nOyBpdCBpcyAwIGlmIGNhbGxlZCBieSB0aGUgaW9jdGwgVElPQ05PVFRZLgorICovCit2b2lkIGRpc2Fzc29jaWF0ZV9jdHR5KGludCBvbl9leGl0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCWludCB0dHlfcGdycCA9IC0xOworCisJbG9ja19rZXJuZWwoKTsKKworCWRvd24oJnR0eV9zZW0pOworCXR0eSA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5OworCWlmICh0dHkpIHsKKwkJdHR5X3BncnAgPSB0dHktPnBncnA7CisJCXVwKCZ0dHlfc2VtKTsKKwkJaWYgKG9uX2V4aXQgJiYgdHR5LT5kcml2ZXItPnR5cGUgIT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkKKwkJCXR0eV92aGFuZ3VwKHR0eSk7CisJfSBlbHNlIHsKKwkJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwKSB7CisJCQlraWxsX3BnKGN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwLCBTSUdIVVAsIG9uX2V4aXQpOworCQkJa2lsbF9wZyhjdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCwgU0lHQ09OVCwgb25fZXhpdCk7CisJCX0KKwkJdXAoJnR0eV9zZW0pOworCQl1bmxvY2tfa2VybmVsKCk7CQorCQlyZXR1cm47CisJfQorCWlmICh0dHlfcGdycCA+IDApIHsKKwkJa2lsbF9wZyh0dHlfcGdycCwgU0lHSFVQLCBvbl9leGl0KTsKKwkJaWYgKCFvbl9leGl0KQorCQkJa2lsbF9wZyh0dHlfcGdycCwgU0lHQ09OVCwgb25fZXhpdCk7CisJfQorCisJLyogTXVzdCBsb2NrIGNoYW5nZXMgdG8gdHR5X29sZF9wZ3JwICovCisJZG93bigmdHR5X3NlbSk7CisJY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSAwOworCXR0eS0+c2Vzc2lvbiA9IDA7CisJdHR5LT5wZ3JwID0gLTE7CisKKwkvKiBOb3cgY2xlYXIgc2lnbmFsLT50dHkgdW5kZXIgdGhlIGxvY2sgKi8KKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWRvX2VhY2hfdGFza19waWQoY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgeworCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7CisJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl1cCgmdHR5X3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCit2b2lkIHN0b3BfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eS0+c3RvcHBlZCkKKwkJcmV0dXJuOworCXR0eS0+c3RvcHBlZCA9IDE7CisJaWYgKHR0eS0+bGluayAmJiB0dHktPmxpbmstPnBhY2tldCkgeworCQl0dHktPmN0cmxfc3RhdHVzICY9IH5USU9DUEtUX1NUQVJUOworCQl0dHktPmN0cmxfc3RhdHVzIHw9IFRJT0NQS1RfU1RPUDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPmxpbmstPnJlYWRfd2FpdCk7CisJfQorCWlmICh0dHktPmRyaXZlci0+c3RvcCkKKwkJKHR0eS0+ZHJpdmVyLT5zdG9wKSh0dHkpOworfQorCitFWFBPUlRfU1lNQk9MKHN0b3BfdHR5KTsKKwordm9pZCBzdGFydF90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoIXR0eS0+c3RvcHBlZCB8fCB0dHktPmZsb3dfc3RvcHBlZCkKKwkJcmV0dXJuOworCXR0eS0+c3RvcHBlZCA9IDA7CisJaWYgKHR0eS0+bGluayAmJiB0dHktPmxpbmstPnBhY2tldCkgeworCQl0dHktPmN0cmxfc3RhdHVzICY9IH5USU9DUEtUX1NUT1A7CisJCXR0eS0+Y3RybF9zdGF0dXMgfD0gVElPQ1BLVF9TVEFSVDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPmxpbmstPnJlYWRfd2FpdCk7CisJfQorCWlmICh0dHktPmRyaXZlci0+c3RhcnQpCisJCSh0dHktPmRyaXZlci0+c3RhcnQpKHR0eSk7CisKKwkvKiBJZiB3ZSBoYXZlIGEgcnVubmluZyBsaW5lIGRpc2NpcGxpbmUgaXQgbWF5IG5lZWQga2lja2luZyAqLworCXR0eV93YWtldXAodHR5KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9CisKK0VYUE9SVF9TWU1CT0woc3RhcnRfdHR5KTsKKworc3RhdGljIHNzaXplX3QgdHR5X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCAKKwkJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X3JlYWQiKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKCF0dHkgfHwgKHRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBXZSB3YW50IHRvIHdhaXQgZm9yIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gc29ydCBvdXQgaW4gdGhpcworCSAgIHNpdHVhdGlvbiAqLworCWxkID0gdHR5X2xkaXNjX3JlZl93YWl0KHR0eSk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAobGQtPnJlYWQpCisJCWkgPSAobGQtPnJlYWQpKHR0eSxmaWxlLGJ1Zixjb3VudCk7CisJZWxzZQorCQlpID0gLUVJTzsKKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoaSA+IDApCisJCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIFNwbGl0IHdyaXRlcyB1cCBpbiBzYW5lIGJsb2Nrc2l6ZXMgdG8gYXZvaWQKKyAqIGRlbmlhbC1vZi1zZXJ2aWNlIHR5cGUgYXR0YWNrcworICovCitzdGF0aWMgaW5saW5lIHNzaXplX3QgZG9fdHR5X3dyaXRlKAorCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBzaXplX3QpLAorCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQgPSAwLCB3cml0dGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisJCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdHR5LT5hdG9taWNfd3JpdGUpKSB7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJLyoKKwkgKiBXZSBjaHVuayB1cCB3cml0ZXMgaW50byBhIHRlbXBvcmFyeSBidWZmZXIuIFRoaXMKKwkgKiBzaW1wbGlmaWVzIGxvdy1sZXZlbCBkcml2ZXJzIGltbWVuc2VseSwgc2luY2UgdGhleQorCSAqIGRvbid0IGhhdmUgbG9ja2luZyBpc3N1ZXMgYW5kIHVzZXIgbW9kZSBhY2Nlc3Nlcy4KKwkgKgorCSAqIEJ1dCBpZiBUVFlfTk9fV1JJVEVfU1BMSVQgaXMgc2V0LCB3ZSBzaG91bGQgdXNlIGEKKwkgKiBiaWcgY2h1bmstc2l6ZS4uCisJICoKKwkgKiBUaGUgZGVmYXVsdCBjaHVuay1zaXplIGlzIDJrQiwgYmVjYXVzZSB0aGUgTlRUWQorCSAqIGxheWVyIGhhcyBwcm9ibGVtcyB3aXRoIGJpZ2dlciBjaHVua3MuIEl0IHdpbGwKKwkgKiBjbGFpbSB0byBiZSBhYmxlIHRvIGhhbmRsZSBtb3JlIGNoYXJhY3RlcnMgdGhhbgorCSAqIGl0IGFjdHVhbGx5IGRvZXMuCisJICovCisJY2h1bmsgPSAyMDQ4OworCWlmICh0ZXN0X2JpdChUVFlfTk9fV1JJVEVfU1BMSVQsICZ0dHktPmZsYWdzKSkKKwkJY2h1bmsgPSA2NTUzNjsKKwlpZiAoY291bnQgPCBjaHVuaykKKwkJY2h1bmsgPSBjb3VudDsKKworCS8qIHdyaXRlX2J1Zi93cml0ZV9jbnQgaXMgcHJvdGVjdGVkIGJ5IHRoZSBhdG9taWNfd3JpdGUgc2VtYXBob3JlICovCisJaWYgKHR0eS0+d3JpdGVfY250IDwgY2h1bmspIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmOworCisJCWlmIChjaHVuayA8IDEwMjQpCisJCQljaHVuayA9IDEwMjQ7CisKKwkJYnVmID0ga21hbGxvYyhjaHVuaywgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKSB7CisJCQl1cCgmdHR5LT5hdG9taWNfd3JpdGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJa2ZyZWUodHR5LT53cml0ZV9idWYpOworCQl0dHktPndyaXRlX2NudCA9IGNodW5rOworCQl0dHktPndyaXRlX2J1ZiA9IGJ1ZjsKKwl9CisKKwkvKiBEbyB0aGUgd3JpdGUgLi4gKi8KKwlmb3IgKDs7KSB7CisJCXNpemVfdCBzaXplID0gY291bnQ7CisJCWlmIChzaXplID4gY2h1bmspCisJCQlzaXplID0gY2h1bms7CisJCXJldCA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcih0dHktPndyaXRlX2J1ZiwgYnVmLCBzaXplKSkKKwkJCWJyZWFrOworCQlsb2NrX2tlcm5lbCgpOworCQlyZXQgPSB3cml0ZSh0dHksIGZpbGUsIHR0eS0+d3JpdGVfYnVmLCBzaXplKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlpZiAocmV0IDw9IDApCisJCQlicmVhazsKKwkJd3JpdHRlbiArPSByZXQ7CisJCWJ1ZiArPSByZXQ7CisJCWNvdW50IC09IHJldDsKKwkJaWYgKCFjb3VudCkKKwkJCWJyZWFrOworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJaWYgKHdyaXR0ZW4pIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJCXJldCA9IHdyaXR0ZW47CisJfQorCXVwKCZ0dHktPmF0b21pY193cml0ZSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCB0dHlfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJCisJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBpbm9kZSwgInR0eV93cml0ZSIpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXItPndyaXRlIHx8ICh0ZXN0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKSkpCisJCXJldHVybiAtRUlPOworCisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsJCQorCWlmICghbGQtPndyaXRlKQorCQlyZXQgPSAtRUlPOworCWVsc2UKKwkJcmV0ID0gZG9fdHR5X3dyaXRlKGxkLT53cml0ZSwgdHR5LCBmaWxlLCBidWYsIGNvdW50KTsKKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgcmVkaXJlY3RlZF90dHlfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZmlsZSAqcCA9IE5VTEw7CisKKwlzcGluX2xvY2soJnJlZGlyZWN0X2xvY2spOworCWlmIChyZWRpcmVjdCkgeworCQlnZXRfZmlsZShyZWRpcmVjdCk7CisJCXAgPSByZWRpcmVjdDsKKwl9CisJc3Bpbl91bmxvY2soJnJlZGlyZWN0X2xvY2spOworCisJaWYgKHApIHsKKwkJc3NpemVfdCByZXM7CisJCXJlcyA9IHZmc193cml0ZShwLCBidWYsIGNvdW50LCAmcC0+Zl9wb3MpOworCQlmcHV0KHApOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiB0dHlfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBjaGFyIHB0eWNoYXJbXSA9ICJwcXJzdHV2d3h5emFiY2RlIjsKKworc3RhdGljIGlubGluZSB2b2lkIHB0eV9saW5lX25hbWUoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGluZGV4LCBjaGFyICpwKQoreworCWludCBpID0gaW5kZXggKyBkcml2ZXItPm5hbWVfYmFzZTsKKwkvKiAtPm5hbWUgaXMgaW5pdGlhbGl6ZWQgdG8gInR0eXAiLCBidXQgInR0eSIgaXMgZXhwZWN0ZWQgKi8KKwlzcHJpbnRmKHAsICIlcyVjJXgiLAorCQkJZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX1NMQVZFID8gInR0eSIgOiBkcml2ZXItPm5hbWUsCisJCQlwdHljaGFyW2kgPj4gNCAmIDB4Zl0sIGkgJiAweGYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2xpbmVfbmFtZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaW5kZXgsIGNoYXIgKnApCit7CisJc3ByaW50ZihwLCAiJXMlZCIsIGRyaXZlci0+bmFtZSwgaW5kZXggKyBkcml2ZXItPm5hbWVfYmFzZSk7Cit9CisKKy8qCisgKiBXU0ggMDYvMDkvOTc6IFJld3JpdHRlbiB0byByZW1vdmUgcmFjZXMgYW5kIHByb3Blcmx5IGNsZWFuIHVwIGFmdGVyIGEKKyAqIGZhaWxlZCBvcGVuLiAgVGhlIG5ldyBjb2RlIHByb3RlY3RzIHRoZSBvcGVuIHdpdGggYSBzZW1hcGhvcmUsIHNvIGl0J3MKKyAqIHJlYWxseSBxdWl0ZSBzdHJhaWdodGZvcndhcmQuICBUaGUgc2VtYXBob3JlIGxvY2tpbmcgY2FuIHByb2JhYmx5IGJlCisgKiByZWxheGVkIGZvciB0aGUgKG1vc3QgY29tbW9uKSBjYXNlIG9mIHJlb3BlbmluZyBhIHR0eS4KKyAqLworc3RhdGljIGludCBpbml0X2RldihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaWR4LAorCXN0cnVjdCB0dHlfc3RydWN0ICoqcmV0X3R0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAqb190dHk7CisJc3RydWN0IHRlcm1pb3MgKnRwLCAqKnRwX2xvYywgKm9fdHAsICoqb190cF9sb2M7CisJc3RydWN0IHRlcm1pb3MgKmx0cCwgKipsdHBfbG9jLCAqb19sdHAsICoqb19sdHBfbG9jOworCWludCByZXR2YWw9MDsKKworCS8qIGNoZWNrIHdoZXRoZXIgd2UncmUgcmVvcGVuaW5nIGFuIGV4aXN0aW5nIHR0eSAqLworCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSB7CisJCXR0eSA9IGRldnB0c19nZXRfdHR5KGlkeCk7CisJCWlmICh0dHkgJiYgZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKKwkJCXR0eSA9IHR0eS0+bGluazsKKwl9IGVsc2UgeworCQl0dHkgPSBkcml2ZXItPnR0eXNbaWR4XTsKKwl9CisJaWYgKHR0eSkgZ290byBmYXN0X3RyYWNrOworCisJLyoKKwkgKiBGaXJzdCB0aW1lIG9wZW4gaXMgY29tcGxleCwgZXNwZWNpYWxseSBmb3IgUFRZIGRldmljZXMuCisJICogVGhpcyBjb2RlIGd1YXJhbnRlZXMgdGhhdCBlaXRoZXIgZXZlcnl0aGluZyBzdWNjZWVkcyBhbmQgdGhlCisJICogVFRZIGlzIHJlYWR5IGZvciBvcGVyYXRpb24sIG9yIGVsc2UgdGhlIHRhYmxlIHNsb3RzIGFyZSB2YWNhdGVkCisJICogYW5kIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IHJlbGVhc2VkLiAgKEV4Y2VwdCB0aGF0IHRoZSB0ZXJtaW9zIAorCSAqIGFuZCBsb2NrZWQgdGVybWlvcyBtYXkgYmUgcmV0YWluZWQuKQorCSAqLworCisJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2ZXItPm93bmVyKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVuZF9pbml0OworCX0KKworCW9fdHR5ID0gTlVMTDsKKwl0cCA9IG9fdHAgPSBOVUxMOworCWx0cCA9IG9fbHRwID0gTlVMTDsKKworCXR0eSA9IGFsbG9jX3R0eV9zdHJ1Y3QoKTsKKwlpZighdHR5KQorCQlnb3RvIGZhaWxfbm9fbWVtOworCWluaXRpYWxpemVfdHR5X3N0cnVjdCh0dHkpOworCXR0eS0+ZHJpdmVyID0gZHJpdmVyOworCXR0eS0+aW5kZXggPSBpZHg7CisJdHR5X2xpbmVfbmFtZShkcml2ZXIsIGlkeCwgdHR5LT5uYW1lKTsKKworCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSB7CisJCXRwX2xvYyA9ICZ0dHktPnRlcm1pb3M7CisJCWx0cF9sb2MgPSAmdHR5LT50ZXJtaW9zX2xvY2tlZDsKKwl9IGVsc2UgeworCQl0cF9sb2MgPSAmZHJpdmVyLT50ZXJtaW9zW2lkeF07CisJCWx0cF9sb2MgPSAmZHJpdmVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdOworCX0KKworCWlmICghKnRwX2xvYykgeworCQl0cCA9IChzdHJ1Y3QgdGVybWlvcyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGVybWlvcyksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCF0cCkKKwkJCWdvdG8gZnJlZV9tZW1fb3V0OworCQkqdHAgPSBkcml2ZXItPmluaXRfdGVybWlvczsKKwl9CisKKwlpZiAoISpsdHBfbG9jKSB7CisJCWx0cCA9IChzdHJ1Y3QgdGVybWlvcyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGVybWlvcyksCisJCQkJCQkgR0ZQX0tFUk5FTCk7CisJCWlmICghbHRwKQorCQkJZ290byBmcmVlX21lbV9vdXQ7CisJCW1lbXNldChsdHAsIDAsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpOworCX0KKworCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkgeworCQlvX3R0eSA9IGFsbG9jX3R0eV9zdHJ1Y3QoKTsKKwkJaWYgKCFvX3R0eSkKKwkJCWdvdG8gZnJlZV9tZW1fb3V0OworCQlpbml0aWFsaXplX3R0eV9zdHJ1Y3Qob190dHkpOworCQlvX3R0eS0+ZHJpdmVyID0gZHJpdmVyLT5vdGhlcjsKKwkJb190dHktPmluZGV4ID0gaWR4OworCQl0dHlfbGluZV9uYW1lKGRyaXZlci0+b3RoZXIsIGlkeCwgb190dHktPm5hbWUpOworCisJCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSB7CisJCQlvX3RwX2xvYyA9ICZvX3R0eS0+dGVybWlvczsKKwkJCW9fbHRwX2xvYyA9ICZvX3R0eS0+dGVybWlvc19sb2NrZWQ7CisJCX0gZWxzZSB7CisJCQlvX3RwX2xvYyA9ICZkcml2ZXItPm90aGVyLT50ZXJtaW9zW2lkeF07CisJCQlvX2x0cF9sb2MgPSAmZHJpdmVyLT5vdGhlci0+dGVybWlvc19sb2NrZWRbaWR4XTsKKwkJfQorCisJCWlmICghKm9fdHBfbG9jKSB7CisJCQlvX3RwID0gKHN0cnVjdCB0ZXJtaW9zICopCisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHRlcm1pb3MpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghb190cCkKKwkJCQlnb3RvIGZyZWVfbWVtX291dDsKKwkJCSpvX3RwID0gZHJpdmVyLT5vdGhlci0+aW5pdF90ZXJtaW9zOworCQl9CisKKwkJaWYgKCEqb19sdHBfbG9jKSB7CisJCQlvX2x0cCA9IChzdHJ1Y3QgdGVybWlvcyAqKQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW9fbHRwKQorCQkJCWdvdG8gZnJlZV9tZW1fb3V0OworCQkJbWVtc2V0KG9fbHRwLCAwLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKTsKKwkJfQorCisJCS8qCisJCSAqIEV2ZXJ5dGhpbmcgYWxsb2NhdGVkIC4uLiBzZXQgdXAgdGhlIG9fdHR5IHN0cnVjdHVyZS4KKwkJICovCisJCWlmICghKGRyaXZlci0+b3RoZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkgeworCQkJZHJpdmVyLT5vdGhlci0+dHR5c1tpZHhdID0gb190dHk7CisJCX0KKwkJaWYgKCEqb190cF9sb2MpCisJCQkqb190cF9sb2MgPSBvX3RwOworCQlpZiAoISpvX2x0cF9sb2MpCisJCQkqb19sdHBfbG9jID0gb19sdHA7CisJCW9fdHR5LT50ZXJtaW9zID0gKm9fdHBfbG9jOworCQlvX3R0eS0+dGVybWlvc19sb2NrZWQgPSAqb19sdHBfbG9jOworCQlkcml2ZXItPm90aGVyLT5yZWZjb3VudCsrOworCQlpZiAoZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKKwkJCW9fdHR5LT5jb3VudCsrOworCisJCS8qIEVzdGFibGlzaCB0aGUgbGlua3MgaW4gYm90aCBkaXJlY3Rpb25zICovCisJCXR0eS0+bGluayAgID0gb190dHk7CisJCW9fdHR5LT5saW5rID0gdHR5OworCX0KKworCS8qIAorCSAqIEFsbCBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQsIHNvIG5vdyB3ZSBpbnN0YWxsIHRoZW0uCisJICogRmFpbHVyZXMgYWZ0ZXIgdGhpcyBwb2ludCB1c2UgcmVsZWFzZV9tZW0gdG8gY2xlYW4gdXAsIHNvIAorCSAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBudWxsIG91dCB0aGUgbG9jYWwgcG9pbnRlcnMuCisJICovCisJaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkpIHsKKwkJZHJpdmVyLT50dHlzW2lkeF0gPSB0dHk7CisJfQorCQorCWlmICghKnRwX2xvYykKKwkJKnRwX2xvYyA9IHRwOworCWlmICghKmx0cF9sb2MpCisJCSpsdHBfbG9jID0gbHRwOworCXR0eS0+dGVybWlvcyA9ICp0cF9sb2M7CisJdHR5LT50ZXJtaW9zX2xvY2tlZCA9ICpsdHBfbG9jOworCWRyaXZlci0+cmVmY291bnQrKzsKKwl0dHktPmNvdW50Kys7CisKKwkvKiAKKwkgKiBTdHJ1Y3R1cmVzIGFsbCBpbnN0YWxsZWQgLi4uIGNhbGwgdGhlIGxkaXNjIG9wZW4gcm91dGluZXMuCisJICogSWYgd2UgZmFpbCBoZXJlIGp1c3QgY2FsbCByZWxlYXNlX21lbSB0byBjbGVhbiB1cC4gIE5vIG5lZWQKKwkgKiB0byBkZWNyZW1lbnQgdGhlIHVzZSBjb3VudHMsIGFzIHJlbGVhc2VfbWVtIGRvZXNuJ3QgY2FyZS4KKwkgKi8KKworCWlmICh0dHktPmxkaXNjLm9wZW4pIHsKKwkJcmV0dmFsID0gKHR0eS0+bGRpc2Mub3BlbikodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gcmVsZWFzZV9tZW1fb3V0OworCX0KKwlpZiAob190dHkgJiYgb190dHktPmxkaXNjLm9wZW4pIHsKKwkJcmV0dmFsID0gKG9fdHR5LT5sZGlzYy5vcGVuKShvX3R0eSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWlmICh0dHktPmxkaXNjLmNsb3NlKQorCQkJCSh0dHktPmxkaXNjLmNsb3NlKSh0dHkpOworCQkJZ290byByZWxlYXNlX21lbV9vdXQ7CisJCX0KKwkJdHR5X2xkaXNjX2VuYWJsZShvX3R0eSk7CisJfQorCXR0eV9sZGlzY19lbmFibGUodHR5KTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKgorCSAqIFRoaXMgZmFzdCBvcGVuIGNhbiBiZSB1c2VkIGlmIHRoZSB0dHkgaXMgYWxyZWFkeSBvcGVuLgorCSAqIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIGFuZCB0aGUgb25seSBmYWlsdXJlcyBhcmUgZnJvbQorCSAqIGF0dGVtcHRpbmcgdG8gb3BlbiBhIGNsb3NpbmcgdHR5IG9yIGF0dGVtcHRpbmcgbXVsdGlwbGUKKwkgKiBvcGVucyBvbiBhIHB0eSBtYXN0ZXIuCisJICovCitmYXN0X3RyYWNrOgorCWlmICh0ZXN0X2JpdChUVFlfQ0xPU0lORywgJnR0eS0+ZmxhZ3MpKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZW5kX2luaXQ7CisJfQorCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCSAgICBkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKSB7CisJCS8qCisJCSAqIHNwZWNpYWwgY2FzZSBmb3IgUFRZIG1hc3RlcnM6IG9ubHkgb25lIG9wZW4gcGVybWl0dGVkLCAKKwkJICogYW5kIHRoZSBzbGF2ZSBzaWRlIG9wZW4gY291bnQgaXMgaW5jcmVtZW50ZWQgYXMgd2VsbC4KKwkJICovCisJCWlmICh0dHktPmNvdW50KSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBlbmRfaW5pdDsKKwkJfQorCQl0dHktPmxpbmstPmNvdW50Kys7CisJfQorCXR0eS0+Y291bnQrKzsKKwl0dHktPmRyaXZlciA9IGRyaXZlcjsgLyogTi5CLiB3aHkgZG8gdGhpcyBldmVyeSB0aW1lPz8gKi8KKworCS8qIEZJWE1FICovCisJaWYoIXRlc3RfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpKQorCQlwcmludGsoS0VSTl9FUlIgImluaXRfZGV2IGJ1dCBubyBsZGlzY1xuIik7CitzdWNjZXNzOgorCSpyZXRfdHR5ID0gdHR5OworCQorCS8qIEFsbCBwYXRocyBjb21lIHRocm91Z2ggaGVyZSB0byByZWxlYXNlIHRoZSBzZW1hcGhvcmUgKi8KK2VuZF9pbml0OgorCXJldHVybiByZXR2YWw7CisKKwkvKiBSZWxlYXNlIGxvY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAuLi4gbm90aGluZyBwbGFjZWQgaW4gc2xvdHMgKi8KK2ZyZWVfbWVtX291dDoKKwlpZiAob190cCkKKwkJa2ZyZWUob190cCk7CisJaWYgKG9fdHR5KQorCQlmcmVlX3R0eV9zdHJ1Y3Qob190dHkpOworCWlmIChsdHApCisJCWtmcmVlKGx0cCk7CisJaWYgKHRwKQorCQlrZnJlZSh0cCk7CisJZnJlZV90dHlfc3RydWN0KHR0eSk7CisKK2ZhaWxfbm9fbWVtOgorCW1vZHVsZV9wdXQoZHJpdmVyLT5vd25lcik7CisJcmV0dmFsID0gLUVOT01FTTsKKwlnb3RvIGVuZF9pbml0OworCisJLyogY2FsbCB0aGUgdHR5IHJlbGVhc2VfbWVtIHJvdXRpbmUgdG8gY2xlYW4gb3V0IHRoaXMgc2xvdCAqLworcmVsZWFzZV9tZW1fb3V0OgorCXByaW50ayhLRVJOX0lORk8gImluaXRfZGV2OiBsZGlzYyBvcGVuIGZhaWxlZCwgIgorCQkJICJjbGVhcmluZyBzbG90ICVkXG4iLCBpZHgpOworCXJlbGVhc2VfbWVtKHR0eSwgaWR4KTsKKwlnb3RvIGVuZF9pbml0OworfQorCisvKgorICogUmVsZWFzZXMgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIHR0eSBzdHJ1Y3R1cmUsIGFuZCBjbGVhcnMgb3V0IHRoZQorICogZHJpdmVyIHRhYmxlIHNsb3RzLgorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX21lbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgaWR4KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICpvX3R0eTsKKwlzdHJ1Y3QgdGVybWlvcyAqdHA7CisJaW50IGRldnB0cyA9IHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTTsKKworCWlmICgob190dHkgPSB0dHktPmxpbmspICE9IE5VTEwpIHsKKwkJaWYgKCFkZXZwdHMpCisJCQlvX3R0eS0+ZHJpdmVyLT50dHlzW2lkeF0gPSBOVUxMOworCQlpZiAob190dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MpIHsKKwkJCXRwID0gb190dHktPnRlcm1pb3M7CisJCQlpZiAoIWRldnB0cykKKwkJCQlvX3R0eS0+ZHJpdmVyLT50ZXJtaW9zW2lkeF0gPSBOVUxMOworCQkJa2ZyZWUodHApOworCisJCQl0cCA9IG9fdHR5LT50ZXJtaW9zX2xvY2tlZDsKKwkJCWlmICghZGV2cHRzKQorCQkJCW9fdHR5LT5kcml2ZXItPnRlcm1pb3NfbG9ja2VkW2lkeF0gPSBOVUxMOworCQkJa2ZyZWUodHApOworCQl9CisJCW9fdHR5LT5tYWdpYyA9IDA7CisJCW9fdHR5LT5kcml2ZXItPnJlZmNvdW50LS07CisJCWZpbGVfbGlzdF9sb2NrKCk7CisJCWxpc3RfZGVsX2luaXQoJm9fdHR5LT50dHlfZmlsZXMpOworCQlmaWxlX2xpc3RfdW5sb2NrKCk7CisJCWZyZWVfdHR5X3N0cnVjdChvX3R0eSk7CisJfQorCisJaWYgKCFkZXZwdHMpCisJCXR0eS0+ZHJpdmVyLT50dHlzW2lkeF0gPSBOVUxMOworCWlmICh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MpIHsKKwkJdHAgPSB0dHktPnRlcm1pb3M7CisJCWlmICghZGV2cHRzKQorCQkJdHR5LT5kcml2ZXItPnRlcm1pb3NbaWR4XSA9IE5VTEw7CisJCWtmcmVlKHRwKTsKKworCQl0cCA9IHR0eS0+dGVybWlvc19sb2NrZWQ7CisJCWlmICghZGV2cHRzKQorCQkJdHR5LT5kcml2ZXItPnRlcm1pb3NfbG9ja2VkW2lkeF0gPSBOVUxMOworCQlrZnJlZSh0cCk7CisJfQorCisJdHR5LT5tYWdpYyA9IDA7CisJdHR5LT5kcml2ZXItPnJlZmNvdW50LS07CisJZmlsZV9saXN0X2xvY2soKTsKKwlsaXN0X2RlbF9pbml0KCZ0dHktPnR0eV9maWxlcyk7CisJZmlsZV9saXN0X3VubG9jaygpOworCW1vZHVsZV9wdXQodHR5LT5kcml2ZXItPm93bmVyKTsKKwlmcmVlX3R0eV9zdHJ1Y3QodHR5KTsKK30KKworLyoKKyAqIEV2ZW4gcmVsZWFzaW5nIHRoZSB0dHkgc3RydWN0dXJlcyBpcyBhIHRyaWNreSBidXNpbmVzcy4uIFdlIGhhdmUKKyAqIHRvIGJlIHZlcnkgY2FyZWZ1bCB0aGF0IHRoZSBzdHJ1Y3R1cmVzIGFyZSBhbGwgcmVsZWFzZWQgYXQgdGhlCisgKiBzYW1lIHRpbWUsIGFzIGludGVycnVwdHMgbWlnaHQgb3RoZXJ3aXNlIGdldCB0aGUgd3JvbmcgcG9pbnRlcnMuCisgKgorICogV1NIIDA5LzA5Lzk3OiByZXdyaXR0ZW4gdG8gYXZvaWQgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMgdGhhdCBjb3VsZAorICogbGVhZCB0byBkb3VibGUgZnJlZXMgb3IgcmVsZWFzaW5nIG1lbW9yeSBzdGlsbCBpbiB1c2UuCisgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfZGV2KHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAqb190dHk7CisJaW50CXB0eV9tYXN0ZXIsIHR0eV9jbG9zaW5nLCBvX3R0eV9jbG9zaW5nLCBkb19zbGVlcDsKKwlpbnQJZGV2cHRzX21hc3RlciwgZGV2cHRzOworCWludAlpZHg7CisJY2hhcglidWZbNjRdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgInJlbGVhc2VfZGV2IikpCisJCXJldHVybjsKKworCWNoZWNrX3R0eV9jb3VudCh0dHksICJyZWxlYXNlX2RldiIpOworCisJdHR5X2Zhc3luYygtMSwgZmlscCwgMCk7CisKKwlpZHggPSB0dHktPmluZGV4OworCXB0eV9tYXN0ZXIgPSAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCQkgICAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpOworCWRldnB0cyA9ICh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pICE9IDA7CisJZGV2cHRzX21hc3RlciA9IHB0eV9tYXN0ZXIgJiYgZGV2cHRzOworCW9fdHR5ID0gdHR5LT5saW5rOworCisjaWZkZWYgVFRZX1BBUkFOT0lBX0NIRUNLCisJaWYgKGlkeCA8IDAgfHwgaWR4ID49IHR0eS0+ZHJpdmVyLT5udW0pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBiYWQgaWR4IHdoZW4gdHJ5aW5nIHRvICIKKwkJCQkgICJmcmVlICglcylcbiIsIHR0eS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKCEodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkgeworCQlpZiAodHR5ICE9IHR0eS0+ZHJpdmVyLT50dHlzW2lkeF0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2RldjogZHJpdmVyLnRhYmxlWyVkXSBub3QgdHR5ICIKKwkJCSAgICAgICAiZm9yICglcylcbiIsIGlkeCwgdHR5LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodHR5LT50ZXJtaW9zICE9IHR0eS0+ZHJpdmVyLT50ZXJtaW9zW2lkeF0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2RldjogZHJpdmVyLnRlcm1pb3NbJWRdIG5vdCB0ZXJtaW9zICIKKwkJCSAgICAgICAiZm9yICglcylcbiIsCisJCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0dHktPnRlcm1pb3NfbG9ja2VkICE9IHR0eS0+ZHJpdmVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IGRyaXZlci50ZXJtaW9zX2xvY2tlZFslZF0gbm90ICIKKwkJCSAgICAgICAidGVybWlvc19sb2NrZWQgZm9yICglcylcbiIsCisJCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCisJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2IG9mICVzICh0dHkgY291bnQ9JWQpLi4uIiwKKwkgICAgICAgdHR5X25hbWUodHR5LCBidWYpLCB0dHktPmNvdW50KTsKKyNlbmRpZgorCisjaWZkZWYgVFRZX1BBUkFOT0lBX0NIRUNLCisJaWYgKHR0eS0+ZHJpdmVyLT5vdGhlciAmJgorCSAgICAgISh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CisJCWlmIChvX3R0eSAhPSB0dHktPmRyaXZlci0+b3RoZXItPnR0eXNbaWR4XSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBvdGhlci0+dGFibGVbJWRdICIKKwkJCQkJICAibm90IG9fdHR5IGZvciAoJXMpXG4iLAorCQkJICAgICAgIGlkeCwgdHR5LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAob190dHktPnRlcm1pb3MgIT0gdHR5LT5kcml2ZXItPm90aGVyLT50ZXJtaW9zW2lkeF0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2Rldjogb3RoZXItPnRlcm1pb3NbJWRdICIKKwkJCQkJICAibm90IG9fdGVybWlvcyBmb3IgKCVzKVxuIiwKKwkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG9fdHR5LT50ZXJtaW9zX2xvY2tlZCAhPSAKKwkJICAgICAgdHR5LT5kcml2ZXItPm90aGVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IG90aGVyLT50ZXJtaW9zX2xvY2tlZFsiCisJCQkJCSAgIiVkXSBub3Qgb190ZXJtaW9zX2xvY2tlZCBmb3IgKCVzKVxuIiwKKwkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG9fdHR5LT5saW5rICE9IHR0eSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBiYWQgcHR5IHBvaW50ZXJzXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCWlmICh0dHktPmRyaXZlci0+Y2xvc2UpCisJCXR0eS0+ZHJpdmVyLT5jbG9zZSh0dHksIGZpbHApOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2s6IGlmIHR0eS0+Y291bnQgaXMgZ29pbmcgdG8gemVybywgdGhlcmUgc2hvdWxkbid0IGJlCisJICogYW55IHdhaXRlcnMgb24gdHR5LT5yZWFkX3dhaXQgb3IgdHR5LT53cml0ZV93YWl0LiAgV2UgdGVzdCB0aGUKKwkgKiB3YWl0IHF1ZXVlcyBhbmQga2ljayBldmVyeW9uZSBvdXQgX2JlZm9yZV8gYWN0dWFsbHkgc3RhcnRpbmcgdG8KKwkgKiBjbG9zZS4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdvbid0IGJsb2NrIHdoaWxlIHJlbGVhc2luZyB0aGUgdHR5CisJICogc3RydWN0dXJlLgorCSAqCisJICogVGhlIHRlc3QgZm9yIHRoZSBvX3R0eSBjbG9zaW5nIGlzIG5lY2Vzc2FyeSwgc2luY2UgdGhlIG1hc3RlciBhbmQKKwkgKiBzbGF2ZSBzaWRlcyBtYXkgY2xvc2UgaW4gYW55IG9yZGVyLiAgSWYgdGhlIHNsYXZlIHNpZGUgY2xvc2VzIG91dAorCSAqIGZpcnN0LCBpdHMgY291bnQgd2lsbCBiZSBvbmUsIHNpbmNlIHRoZSBtYXN0ZXIgc2lkZSBob2xkcyBhbiBvcGVuLgorCSAqIFRodXMgdGhpcyB0ZXN0IHdvdWxkbid0IGJlIHRyaWdnZXJlZCBhdCB0aGUgdGltZSB0aGUgc2xhdmUgY2xvc2VzLAorCSAqIHNvIHdlIGRvIGl0IG5vdy4KKwkgKgorCSAqIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciB0aGUgdHR5IHRvIGJlIG9wZW5lZCBhZ2FpbiB3aGlsZSB3ZSdyZQorCSAqIGZsdXNoaW5nIG91dCB3YWl0ZXJzLiAgQnkgcmVjYWxjdWxhdGluZyB0aGUgY2xvc2luZyBmbGFncyBiZWZvcmUKKwkgKiBlYWNoIGl0ZXJhdGlvbiB3ZSBhdm9pZCBhbnkgcHJvYmxlbXMuCisJICovCisJd2hpbGUgKDEpIHsKKwkJLyogR3VhcmQgYWdhaW5zdCByYWNlcyB3aXRoIHR0eS0+Y291bnQgY2hhbmdlcyBlbHNld2hlcmUgYW5kCisJCSAgIG9wZW5zIG9uIC9kZXYvdHR5ICovCisJCSAgIAorCQlkb3duKCZ0dHlfc2VtKTsKKwkJdHR5X2Nsb3NpbmcgPSB0dHktPmNvdW50IDw9IDE7CisJCW9fdHR5X2Nsb3NpbmcgPSBvX3R0eSAmJgorCQkJKG9fdHR5LT5jb3VudCA8PSAocHR5X21hc3RlciA/IDEgOiAwKSk7CisJCXVwKCZ0dHlfc2VtKTsKKwkJZG9fc2xlZXAgPSAwOworCisJCWlmICh0dHlfY2xvc2luZykgeworCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+cmVhZF93YWl0KSkgeworCQkJCXdha2VfdXAoJnR0eS0+cmVhZF93YWl0KTsKKwkJCQlkb19zbGVlcCsrOworCQkJfQorCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+d3JpdGVfd2FpdCkpIHsKKwkJCQl3YWtlX3VwKCZ0dHktPndyaXRlX3dhaXQpOworCQkJCWRvX3NsZWVwKys7CisJCQl9CisJCX0KKwkJaWYgKG9fdHR5X2Nsb3NpbmcpIHsKKwkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZvX3R0eS0+cmVhZF93YWl0KSkgeworCQkJCXdha2VfdXAoJm9fdHR5LT5yZWFkX3dhaXQpOworCQkJCWRvX3NsZWVwKys7CisJCQl9CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmb190dHktPndyaXRlX3dhaXQpKSB7CisJCQkJd2FrZV91cCgmb190dHktPndyaXRlX3dhaXQpOworCQkJCWRvX3NsZWVwKys7CisJCQl9CisJCX0KKwkJaWYgKCFkb19zbGVlcCkKKwkJCWJyZWFrOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGVhc2VfZGV2OiAlczogcmVhZC93cml0ZSB3YWl0IHF1ZXVlICIKKwkJCQkgICAgImFjdGl2ZSFcbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CisJCXNjaGVkdWxlKCk7CisJfQkKKworCS8qCisJICogVGhlIGNsb3NpbmcgZmxhZ3MgYXJlIG5vdyBjb25zaXN0ZW50IHdpdGggdGhlIG9wZW4gY291bnRzIG9uIAorCSAqIGJvdGggc2lkZXMsIGFuZCB3ZSd2ZSBjb21wbGV0ZWQgdGhlIGxhc3Qgb3BlcmF0aW9uIHRoYXQgY291bGQgCisJICogYmxvY2ssIHNvIGl0J3Mgc2FmZSB0byBwcm9jZWVkIHdpdGggY2xvc2luZy4KKwkgKi8KKwkgCisJZG93bigmdHR5X3NlbSk7CisJaWYgKHB0eV9tYXN0ZXIpIHsKKwkJaWYgKC0tb190dHktPmNvdW50IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVsZWFzZV9kZXY6IGJhZCBwdHkgc2xhdmUgY291bnQgIgorCQkJCQkgICAgIiglZCkgZm9yICVzXG4iLAorCQkJICAgICAgIG9fdHR5LT5jb3VudCwgdHR5X25hbWUob190dHksIGJ1ZikpOworCQkJb190dHktPmNvdW50ID0gMDsKKwkJfQorCX0KKwlpZiAoLS10dHktPmNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWxlYXNlX2RldjogYmFkIHR0eS0+Y291bnQgKCVkKSBmb3IgJXNcbiIsCisJCSAgICAgICB0dHktPmNvdW50LCB0dHlfbmFtZSh0dHksIGJ1ZikpOworCQl0dHktPmNvdW50ID0gMDsKKwl9CisJdXAoJnR0eV9zZW0pOworCQorCS8qCisJICogV2UndmUgZGVjcmVtZW50ZWQgdHR5LT5jb3VudCwgc28gd2UgbmVlZCB0byByZW1vdmUgdGhpcyBmaWxlCisJICogZGVzY3JpcHRvciBvZmYgdGhlIHR0eS0+dHR5X2ZpbGVzIGxpc3Q7IHRoaXMgc2VydmVzIHR3bworCSAqIHB1cnBvc2VzOgorCSAqICAtIGNoZWNrX3R0eV9jb3VudCBzZWVzIHRoZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisJICogICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHR5LgorCSAqICAtIGRvX3R0eV9oYW5ndXAgbm8gbG9uZ2VyIHNlZXMgdGhpcyBmaWxlIGRlc2NyaXB0b3IgYXMKKwkgKiAgICBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBoYW5kbGVkIGZvciBoYW5ndXBzLgorCSAqLworCWZpbGVfa2lsbChmaWxwKTsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJLyoKKwkgKiBQZXJmb3JtIHNvbWUgaG91c2VrZWVwaW5nIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRvIHJldHVybi4KKwkgKgorCSAqIFNldCB0aGUgVFRZX0NMT1NJTkcgZmxhZyBpZiB0aGlzIHdhcyB0aGUgbGFzdCBvcGVuLiAgSW4gdGhlCisJICogY2FzZSBvZiBhIHB0eSB3ZSBtYXkgaGF2ZSB0byB3YWl0IGFyb3VuZCBmb3IgdGhlIG90aGVyIHNpZGUKKwkgKiB0byBjbG9zZSwgYW5kIFRUWV9DTE9TSU5HIG1ha2VzIHN1cmUgd2UgY2FuJ3QgYmUgcmVvcGVuZWQuCisJICovCisJaWYodHR5X2Nsb3NpbmcpCisJCXNldF9iaXQoVFRZX0NMT1NJTkcsICZ0dHktPmZsYWdzKTsKKwlpZihvX3R0eV9jbG9zaW5nKQorCQlzZXRfYml0KFRUWV9DTE9TSU5HLCAmb190dHktPmZsYWdzKTsKKworCS8qCisJICogSWYgX2VpdGhlcl8gc2lkZSBpcyBjbG9zaW5nLCBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueQorCSAqIHByb2Nlc3NlcyB0aGF0IHN0aWxsIHRoaW5rIHR0eSBvciBvX3R0eSBpcyB0aGVpciBjb250cm9sbGluZworCSAqIHR0eS4KKwkgKi8KKwlpZiAodHR5X2Nsb3NpbmcgfHwgb190dHlfY2xvc2luZykgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJZG9fZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CisJCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7CisJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwkJaWYgKG9fdHR5KQorCQkJZG9fZWFjaF90YXNrX3BpZChvX3R0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApIHsKKwkJCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7CisJCQl9IHdoaWxlX2VhY2hfdGFza19waWQob190dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgYm90aCBzaWRlcyBhcmUgY2xvc2luZyAuLi4gKi8KKwlpZiAoIXR0eV9jbG9zaW5nIHx8IChvX3R0eSAmJiAhb190dHlfY2xvc2luZykpCisJCXJldHVybjsKKwkKKyNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCisJcHJpbnRrKEtFUk5fREVCVUcgImZyZWVpbmcgdHR5IHN0cnVjdHVyZS4uLiIpOworI2VuZGlmCisJLyoKKwkgKiBQcmV2ZW50IGZsdXNoX3RvX2xkaXNjKCkgZnJvbSByZXNjaGVkdWxpbmcgdGhlIHdvcmsgZm9yIGxhdGVyLiAgVGhlbgorCSAqIGtpbGwgYW55IGRlbGF5ZWQgd29yay4gQXMgdGhpcyBpcyB0aGUgZmluYWwgY2xvc2UgaXQgZG9lcyBub3QKKwkgKiByYWNlIHdpdGggdGhlIHNldF9sZGlzYyBjb2RlIHBhdGguCisJICovCisJY2xlYXJfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpOworCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmspOworCisJLyoKKwkgKiBXYWl0IGZvciAtPmhhbmd1cF93b3JrIGFuZCAtPmZsaXAud29yayBoYW5kbGVycyB0byB0ZXJtaW5hdGUKKwkgKi8KKwkgCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkKKwkvKgorCSAqIFdhaXQgZm9yIGFueSBzaG9ydCB0ZXJtIHVzZXJzICh3ZSBrbm93IHRoZXkgYXJlIGp1c3QgZHJpdmVyCisJICogc2lkZSB3YWl0ZXJzIGFzIHRoZSBmaWxlIGlzIGNsb3Npbmcgc28gdXNlciBjb3VudCBvbiB0aGUgZmlsZQorCSAqIHNpZGUgaXMgemVyby4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSh0dHktPmxkaXNjLnJlZmNvdW50KQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwkJd2FpdF9ldmVudCh0dHlfbGRpc2Nfd2FpdCwgdHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBTaHV0ZG93biB0aGUgY3VycmVudCBsaW5lIGRpc2NpcGxpbmUsIGFuZCByZXNldCBpdCB0byBOX1RUWS4KKwkgKiBOLkIuIHdoeSByZXNldCBsZGlzYyB3aGVuIHdlJ3JlIHJlbGVhc2luZyB0aGUgbWVtb3J5Pz8KKwkgKgorCSAqIEZJWE1FOiB0aGlzIE1VU1QgZ2V0IGZpeGVkIGZvciB0aGUgbmV3IHJlZmxvY2tpbmcKKwkgKi8KKwlpZiAodHR5LT5sZGlzYy5jbG9zZSkKKwkJKHR0eS0+bGRpc2MuY2xvc2UpKHR0eSk7CisJdHR5X2xkaXNjX3B1dCh0dHktPmxkaXNjLm51bSk7CisJCisJLyoKKwkgKglTd2l0Y2ggdGhlIGxpbmUgZGlzY2lwbGluZSBiYWNrCisJICovCisJdHR5X2xkaXNjX2Fzc2lnbih0dHksIHR0eV9sZGlzY19nZXQoTl9UVFkpKTsKKwl0dHlfc2V0X3Rlcm1pb3NfbGRpc2ModHR5LE5fVFRZKTsgCisJaWYgKG9fdHR5KSB7CisJCS8qIEZJWE1FOiBjb3VsZCBvX3R0eSBiZSBpbiBzZXRsZGlzYyBoZXJlID8gKi8KKwkJY2xlYXJfYml0KFRUWV9MRElTQywgJm9fdHR5LT5mbGFncyk7CisJCWlmIChvX3R0eS0+bGRpc2MuY2xvc2UpCisJCQkob190dHktPmxkaXNjLmNsb3NlKShvX3R0eSk7CisJCXR0eV9sZGlzY19wdXQob190dHktPmxkaXNjLm51bSk7CisJCXR0eV9sZGlzY19hc3NpZ24ob190dHksIHR0eV9sZGlzY19nZXQoTl9UVFkpKTsKKwkJdHR5X3NldF90ZXJtaW9zX2xkaXNjKG9fdHR5LE5fVFRZKTsgCisJfQorCS8qCisJICogVGhlIHJlbGVhc2VfbWVtIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgdGhlIGRldGFpbHMgb2YgY2xlYXJpbmcKKwkgKiB0aGUgc2xvdHMgYW5kIHByZXNlcnZpbmcgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLgorCSAqLworCXJlbGVhc2VfbWVtKHR0eSwgaWR4KTsKKworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworCS8qIE1ha2UgdGhpcyBwdHkgbnVtYmVyIGF2YWlsYWJsZSBmb3IgcmVhbGxvY2F0aW9uICovCisJaWYgKGRldnB0cykgeworCQlkb3duKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwkJaWRyX3JlbW92ZSgmYWxsb2NhdGVkX3B0eXMsIGlkeCk7CisJCXVwKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwl9CisjZW5kaWYKKworfQorCisvKgorICogdHR5X29wZW4gYW5kIHR0eV9yZWxlYXNlIGtlZXAgdXAgdGhlIHR0eSBjb3VudCB0aGF0IGNvbnRhaW5zIHRoZQorICogbnVtYmVyIG9mIG9wZW5zIGRvbmUgb24gYSB0dHkuIFdlIGNhbm5vdCB1c2UgdGhlIGlub2RlLWNvdW50LCBhcworICogZGlmZmVyZW50IGlub2RlcyBtaWdodCBwb2ludCB0byB0aGUgc2FtZSB0dHkuCisgKgorICogT3Blbi1jb3VudGluZyBpcyBuZWVkZWQgZm9yIHB0eSBtYXN0ZXJzLCBhcyB3ZWxsIGFzIGZvciBrZWVwaW5nCisgKiB0cmFjayBvZiBzZXJpYWwgbGluZXM6IERUUiBpcyBkcm9wcGVkIHdoZW4gdGhlIGxhc3QgY2xvc2UgaGFwcGVucy4KKyAqIChUaGlzIGlzIG5vdCBkb25lIHNvbGVseSB0aHJvdWdoIHR0eS0+Y291bnQsIG5vdy4gIC0gVGVkIDEvMjcvOTIpCisgKgorICogVGhlIHRlcm1pb3Mgc3RhdGUgb2YgYSBwdHkgaXMgcmVzZXQgb24gZmlyc3Qgb3BlbiBzbyB0aGF0CisgKiBzZXR0aW5ncyBkb24ndCBwZXJzaXN0IGFjcm9zcyByZXVzZS4KKyAqLworc3RhdGljIGludCB0dHlfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IG5vY3R0eSwgcmV0dmFsOworCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CisJaW50IGluZGV4OworCWRldl90IGRldmljZSA9IGlub2RlLT5pX3JkZXY7CisJdW5zaWduZWQgc2hvcnQgc2F2ZWRfZmxhZ3MgPSBmaWxwLT5mX2ZsYWdzOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CisJCityZXRyeV9vcGVuOgorCW5vY3R0eSA9IGZpbHAtPmZfZmxhZ3MgJiBPX05PQ1RUWTsKKwlpbmRleCAgPSAtMTsKKwlyZXR2YWwgPSAwOworCQorCWRvd24oJnR0eV9zZW0pOworCisJaWYgKGRldmljZSA9PSBNS0RFVihUVFlBVVhfTUFKT1IsMCkpIHsKKwkJaWYgKCFjdXJyZW50LT5zaWduYWwtPnR0eSkgeworCQkJdXAoJnR0eV9zZW0pOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlkcml2ZXIgPSBjdXJyZW50LT5zaWduYWwtPnR0eS0+ZHJpdmVyOworCQlpbmRleCA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5LT5pbmRleDsKKwkJZmlscC0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOyAvKiBEb24ndCBsZXQgL2Rldi90dHkgYmxvY2sgKi8KKwkJLyogbm9jdHR5ID0gMTsgKi8KKwkJZ290byBnb3RfZHJpdmVyOworCX0KKyNpZmRlZiBDT05GSUdfVlQKKwlpZiAoZGV2aWNlID09IE1LREVWKFRUWV9NQUpPUiwwKSkgeworCQlleHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKmNvbnNvbGVfZHJpdmVyOworCQlkcml2ZXIgPSBjb25zb2xlX2RyaXZlcjsKKwkJaW5kZXggPSBmZ19jb25zb2xlOworCQlub2N0dHkgPSAxOworCQlnb3RvIGdvdF9kcml2ZXI7CisJfQorI2VuZGlmCisJaWYgKGRldmljZSA9PSBNS0RFVihUVFlBVVhfTUFKT1IsMSkpIHsKKwkJZHJpdmVyID0gY29uc29sZV9kZXZpY2UoJmluZGV4KTsKKwkJaWYgKGRyaXZlcikgeworCQkJLyogRG9uJ3QgbGV0IC9kZXYvY29uc29sZSBibG9jayAqLworCQkJZmlscC0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworCQkJbm9jdHR5ID0gMTsKKwkJCWdvdG8gZ290X2RyaXZlcjsKKwkJfQorCQl1cCgmdHR5X3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRyaXZlciA9IGdldF90dHlfZHJpdmVyKGRldmljZSwgJmluZGV4KTsKKwlpZiAoIWRyaXZlcikgeworCQl1cCgmdHR5X3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KK2dvdF9kcml2ZXI6CisJcmV0dmFsID0gaW5pdF9kZXYoZHJpdmVyLCBpbmRleCwgJnR0eSk7CisJdXAoJnR0eV9zZW0pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSB0dHk7CisJZmlsZV9tb3ZlKGZpbHAsICZ0dHktPnR0eV9maWxlcyk7CisJY2hlY2tfdHR5X2NvdW50KHR0eSwgInR0eV9vcGVuIik7CisJaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKKwkgICAgdHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQlub2N0dHkgPSAxOworI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwlwcmludGsoS0VSTl9ERUJVRyAib3BlbmluZyAlcy4uLiIsIHR0eS0+bmFtZSk7CisjZW5kaWYKKwlpZiAoIXJldHZhbCkgeworCQlpZiAodHR5LT5kcml2ZXItPm9wZW4pCisJCQlyZXR2YWwgPSB0dHktPmRyaXZlci0+b3Blbih0dHksIGZpbHApOworCQllbHNlCisJCQlyZXR2YWwgPSAtRU5PREVWOworCX0KKwlmaWxwLT5mX2ZsYWdzID0gc2F2ZWRfZmxhZ3M7CisKKwlpZiAoIXJldHZhbCAmJiB0ZXN0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncykgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHZhbCA9IC1FQlVTWTsKKworCWlmIChyZXR2YWwpIHsKKyNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCisJCXByaW50ayhLRVJOX0RFQlVHICJlcnJvciAlZCBpbiBvcGVuaW5nICVzLi4uIiwgcmV0dmFsLAorCQkgICAgICAgdHR5LT5uYW1lKTsKKyNlbmRpZgorCQlyZWxlYXNlX2RldihmaWxwKTsKKwkJaWYgKHJldHZhbCAhPSAtRVJFU1RBUlRTWVMpCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gcmV0dmFsOworCQlzY2hlZHVsZSgpOworCQkvKgorCQkgKiBOZWVkIHRvIHJlc2V0IGZfb3AgaW4gY2FzZSBhIGhhbmd1cCBoYXBwZW5lZC4KKwkJICovCisJCWlmIChmaWxwLT5mX29wID09ICZodW5nX3VwX3R0eV9mb3BzKQorCQkJZmlscC0+Zl9vcCA9ICZ0dHlfZm9wczsKKwkJZ290byByZXRyeV9vcGVuOworCX0KKwlpZiAoIW5vY3R0eSAmJgorCSAgICBjdXJyZW50LT5zaWduYWwtPmxlYWRlciAmJgorCSAgICAhY3VycmVudC0+c2lnbmFsLT50dHkgJiYKKwkgICAgdHR5LT5zZXNzaW9uID09IDApIHsKKwkgICAgCXRhc2tfbG9jayhjdXJyZW50KTsKKwkJY3VycmVudC0+c2lnbmFsLT50dHkgPSB0dHk7CisJCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCQljdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IDA7CisJCXR0eS0+c2Vzc2lvbiA9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbjsKKwkJdHR5LT5wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKK3N0YXRpYyBpbnQgcHRteF9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgcmV0dmFsOworCWludCBpbmRleDsKKwlpbnQgaWRyX3JldDsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOworCisJLyogZmluZCBhIGRldmljZSB0aGF0IGlzIG5vdCBpbiB1c2UuICovCisJZG93bigmYWxsb2NhdGVkX3B0eXNfbG9jayk7CisJaWYgKCFpZHJfcHJlX2dldCgmYWxsb2NhdGVkX3B0eXMsIEdGUF9LRVJORUwpKSB7CisJCXVwKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlkcl9yZXQgPSBpZHJfZ2V0X25ldygmYWxsb2NhdGVkX3B0eXMsIE5VTEwsICZpbmRleCk7CisJaWYgKGlkcl9yZXQgPCAwKSB7CisJCXVwKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwkJaWYgKGlkcl9yZXQgPT0gLUVBR0FJTikKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGluZGV4ID49IHB0eV9saW1pdCkgeworCQlpZHJfcmVtb3ZlKCZhbGxvY2F0ZWRfcHR5cywgaW5kZXgpOworCQl1cCgmYWxsb2NhdGVkX3B0eXNfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwl1cCgmYWxsb2NhdGVkX3B0eXNfbG9jayk7CisKKwlkb3duKCZ0dHlfc2VtKTsKKwlyZXR2YWwgPSBpbml0X2RldihwdG1fZHJpdmVyLCBpbmRleCwgJnR0eSk7CisJdXAoJnR0eV9zZW0pOworCQorCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJc2V0X2JpdChUVFlfUFRZX0xPQ0ssICZ0dHktPmZsYWdzKTsgLyogTE9DSyBUSEUgU0xBVkUgKi8KKwlmaWxwLT5wcml2YXRlX2RhdGEgPSB0dHk7CisJZmlsZV9tb3ZlKGZpbHAsICZ0dHktPnR0eV9maWxlcyk7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCWlmIChkZXZwdHNfcHR5X25ldyh0dHktPmxpbmspKQorCQlnb3RvIG91dDE7CisKKwljaGVja190dHlfY291bnQodHR5LCAidHR5X29wZW4iKTsKKwlyZXR2YWwgPSBwdG1fZHJpdmVyLT5vcGVuKHR0eSwgZmlscCk7CisJaWYgKCFyZXR2YWwpCisJCXJldHVybiAwOworb3V0MToKKwlyZWxlYXNlX2RldihmaWxwKTsKK291dDoKKwlkb3duKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwlpZHJfcmVtb3ZlKCZhbGxvY2F0ZWRfcHR5cywgaW5kZXgpOworCXVwKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdHR5X3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlsb2NrX2tlcm5lbCgpOworCXJlbGVhc2VfZGV2KGZpbHApOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgaGVsZCAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHR5X3BvbGwoc3RydWN0IGZpbGUgKiBmaWxwLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlpbnQgcmV0ID0gMDsKKworCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsICJ0dHlfcG9sbCIpKQorCQlyZXR1cm4gMDsKKwkJCisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwlpZiAobGQtPnBvbGwpCisJCXJldCA9IChsZC0+cG9sbCkodHR5LCBmaWxwLCB3YWl0KTsKKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgaW50IG9uKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCWludCByZXR2YWw7CisKKwl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCAidHR5X2Zhc3luYyIpKQorCQlyZXR1cm4gMDsKKwkKKwlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJnR0eS0+ZmFzeW5jKTsKKwlpZiAocmV0dmFsIDw9IDApCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAob24pIHsKKwkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkpCisJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CisJCXJldHZhbCA9IGZfc2V0b3duKGZpbHAsICgtdHR5LT5wZ3JwKSA/IDogY3VycmVudC0+cGlkLCAwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfSBlbHNlIHsKKwkJaWYgKCF0dHktPmZhc3luYyAmJiAhd2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpKQorCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBOX1RUWV9CVUZfU0laRTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlvY3N0aShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIF9fdXNlciAqcCkKK3sKKwljaGFyIGNoLCBtYnogPSAwOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCQorCWlmICgoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5KSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoZ2V0X3VzZXIoY2gsIHApKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOworCWxkLT5yZWNlaXZlX2J1Zih0dHksICZjaCwgJm1ieiwgMSk7CisJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW9jZ3dpbnN6KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB3aW5zaXplIF9fdXNlciAqIGFyZykKK3sKKwlpZiAoY29weV90b191c2VyKGFyZywgJnR0eS0+d2luc2l6ZSwgc2l6ZW9mKCphcmcpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlvY3N3aW5zeihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHksCisJc3RydWN0IHdpbnNpemUgX191c2VyICogYXJnKQoreworCXN0cnVjdCB3aW5zaXplIHRtcF93czsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wX3dzLCBhcmcsIHNpemVvZigqYXJnKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghbWVtY21wKCZ0bXBfd3MsICZ0dHktPndpbnNpemUsIHNpemVvZigqYXJnKSkpCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19WVAorCWlmICh0dHktPmRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfQ09OU09MRSkgeworCQlpbnQgcmM7CisKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQlyYyA9IHZjX3Jlc2l6ZSh0dHktPmRyaXZlcl9kYXRhLCB0bXBfd3Mud3NfY29sLCB0bXBfd3Mud3Nfcm93KTsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQlpZiAocmMpCisJCQlyZXR1cm4gLUVOWElPOworCX0KKyNlbmRpZgorCWlmICh0dHktPnBncnAgPiAwKQorCQlraWxsX3BnKHR0eS0+cGdycCwgU0lHV0lOQ0gsIDEpOworCWlmICgocmVhbF90dHktPnBncnAgIT0gdHR5LT5wZ3JwKSAmJiAocmVhbF90dHktPnBncnAgPiAwKSkKKwkJa2lsbF9wZyhyZWFsX3R0eS0+cGdycCwgU0lHV0lOQ0gsIDEpOworCXR0eS0+d2luc2l6ZSA9IHRtcF93czsKKwlyZWFsX3R0eS0+d2luc2l6ZSA9IHRtcF93czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW9jY29ucyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGZpbGUtPmZfb3AtPndyaXRlID09IHJlZGlyZWN0ZWRfdHR5X3dyaXRlKSB7CisJCXN0cnVjdCBmaWxlICpmOworCQlzcGluX2xvY2soJnJlZGlyZWN0X2xvY2spOworCQlmID0gcmVkaXJlY3Q7CisJCXJlZGlyZWN0ID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJnJlZGlyZWN0X2xvY2spOworCQlpZiAoZikKKwkJCWZwdXQoZik7CisJCXJldHVybiAwOworCX0KKwlzcGluX2xvY2soJnJlZGlyZWN0X2xvY2spOworCWlmIChyZWRpcmVjdCkgeworCQlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWdldF9maWxlKGZpbGUpOworCXJlZGlyZWN0ID0gZmlsZTsKKwlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBmaW9uYmlvKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgX191c2VyICpwKQoreworCWludCBub25ibG9jazsKKworCWlmIChnZXRfdXNlcihub25ibG9jaywgcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG5vbmJsb2NrKQorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJZWxzZQorCQlmaWxlLT5mX2ZsYWdzICY9IH5PX05PTkJMT0NLOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpb2NzY3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYXJnKQoreworCXRhc2tfdCAqcDsKKworCWlmIChjdXJyZW50LT5zaWduYWwtPmxlYWRlciAmJgorCSAgICAoY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uID09IHR0eS0+c2Vzc2lvbikpCisJCXJldHVybiAwOworCS8qCisJICogVGhlIHByb2Nlc3MgbXVzdCBiZSBhIHNlc3Npb24gbGVhZGVyIGFuZAorCSAqIG5vdCBoYXZlIGEgY29udHJvbGxpbmcgdHR5IGFscmVhZHkuCisJICovCisJaWYgKCFjdXJyZW50LT5zaWduYWwtPmxlYWRlciB8fCBjdXJyZW50LT5zaWduYWwtPnR0eSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAodHR5LT5zZXNzaW9uID4gMCkgeworCQkvKgorCQkgKiBUaGlzIHR0eSBpcyBhbHJlYWR5IHRoZSBjb250cm9sbGluZworCQkgKiB0dHkgZm9yIGFub3RoZXIgc2Vzc2lvbiBncm91cCEKKwkJICovCisJCWlmICgoYXJnID09IDEpICYmIGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCS8qCisJCQkgKiBTdGVhbCBpdCBhd2F5CisJCQkgKi8KKworCQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJCWRvX2VhY2hfdGFza19waWQodHR5LT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgeworCQkJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwkJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwkJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKwl0YXNrX2xvY2soY3VycmVudCk7CisJY3VycmVudC0+c2lnbmFsLT50dHkgPSB0dHk7CisJdGFza191bmxvY2soY3VycmVudCk7CisJY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSAwOworCXR0eS0+c2Vzc2lvbiA9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbjsKKwl0dHktPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpb2NncGdycChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHksIHBpZF90IF9fdXNlciAqcCkKK3sKKwkvKgorCSAqICh0dHkgPT0gcmVhbF90dHkpIGlzIGEgY2hlYXAgd2F5IG9mCisJICogdGVzdGluZyBpZiB0aGUgdHR5IGlzIE5PVCBhIG1hc3RlciBwdHkuCisJICovCisJaWYgKHR0eSA9PSByZWFsX3R0eSAmJiBjdXJyZW50LT5zaWduYWwtPnR0eSAhPSByZWFsX3R0eSkKKwkJcmV0dXJuIC1FTk9UVFk7CisJcmV0dXJuIHB1dF91c2VyKHJlYWxfdHR5LT5wZ3JwLCBwKTsKK30KKworc3RhdGljIGludCB0aW9jc3BncnAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnJlYWxfdHR5LCBwaWRfdCBfX3VzZXIgKnApCit7CisJcGlkX3QgcGdycDsKKwlpbnQgcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZShyZWFsX3R0eSk7CisKKwlpZiAocmV0dmFsID09IC1FSU8pCisJCXJldHVybiAtRU5PVFRZOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKCFjdXJyZW50LT5zaWduYWwtPnR0eSB8fAorCSAgICAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gcmVhbF90dHkpIHx8CisJICAgIChyZWFsX3R0eS0+c2Vzc2lvbiAhPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb24pKQorCQlyZXR1cm4gLUVOT1RUWTsKKwlpZiAoZ2V0X3VzZXIocGdycCwgcCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwZ3JwIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNlc3Npb25fb2ZfcGdycChwZ3JwKSAhPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb24pCisJCXJldHVybiAtRVBFUk07CisJcmVhbF90dHktPnBncnAgPSBwZ3JwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpb2Nnc2lkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eSwgcGlkX3QgX191c2VyICpwKQoreworCS8qCisJICogKHR0eSA9PSByZWFsX3R0eSkgaXMgYSBjaGVhcCB3YXkgb2YKKwkgKiB0ZXN0aW5nIGlmIHRoZSB0dHkgaXMgTk9UIGEgbWFzdGVyIHB0eS4KKwkqLworCWlmICh0dHkgPT0gcmVhbF90dHkgJiYgY3VycmVudC0+c2lnbmFsLT50dHkgIT0gcmVhbF90dHkpCisJCXJldHVybiAtRU5PVFRZOworCWlmIChyZWFsX3R0eS0+c2Vzc2lvbiA8PSAwKQorCQlyZXR1cm4gLUVOT1RUWTsKKwlyZXR1cm4gcHV0X3VzZXIocmVhbF90dHktPnNlc3Npb24sIHApOworfQorCitzdGF0aWMgaW50IHRpb2NzZXRkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnApCit7CisJaW50IGxkaXNjOworCisJaWYgKGdldF91c2VyKGxkaXNjLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIHR0eV9zZXRfbGRpc2ModHR5LCBsZGlzYyk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgZHVyYXRpb24pCit7CisJdHR5LT5kcml2ZXItPmJyZWFrX2N0bCh0dHksIC0xKTsKKwlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoZHVyYXRpb24pOworCX0KKwl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgMCk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBfX3VzZXIgKnApCit7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisKKwlpZiAodHR5LT5kcml2ZXItPnRpb2NtZ2V0KSB7CisJCXJldHZhbCA9IHR0eS0+ZHJpdmVyLT50aW9jbWdldCh0dHksIGZpbGUpOworCisJCWlmIChyZXR2YWwgPj0gMCkKKwkJCXJldHZhbCA9IHB1dF91c2VyKHJldHZhbCwgcCk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkgICAgIHVuc2lnbmVkIF9fdXNlciAqcCkKK3sKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKworCWlmICh0dHktPmRyaXZlci0+dGlvY21zZXQpIHsKKwkJdW5zaWduZWQgaW50IHNldCwgY2xlYXIsIHZhbDsKKworCQlyZXR2YWwgPSBnZXRfdXNlcih2YWwsIHApOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQlzZXQgPSBjbGVhciA9IDA7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElPQ01CSVM6CisJCQlzZXQgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTUJJQzoKKwkJCWNsZWFyID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ01TRVQ6CisJCQlzZXQgPSB2YWw7CisJCQljbGVhciA9IH52YWw7CisJCQlicmVhazsKKwkJfQorCisJCXNldCAmPSBUSU9DTV9EVFJ8VElPQ01fUlRTfFRJT0NNX09VVDF8VElPQ01fT1VUMnxUSU9DTV9MT09QOworCQljbGVhciAmPSBUSU9DTV9EVFJ8VElPQ01fUlRTfFRJT0NNX09VVDF8VElPQ01fT1VUMnxUSU9DTV9MT09QOworCisJCXJldHZhbCA9IHR0eS0+ZHJpdmVyLT50aW9jbXNldCh0dHksIGZpbGUsIHNldCwgY2xlYXIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogU3BsaXQgdGhpcyB1cCwgYXMgZ2NjIGNhbiBjaG9rZSBvbiBpdCBvdGhlcndpc2UuLgorICovCitpbnQgdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgKnJlYWxfdHR5OworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXR2YWw7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJCisJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBpbm9kZSwgInR0eV9pb2N0bCIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlYWxfdHR5ID0gdHR5OworCWlmICh0dHktPmRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCisJICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKKwkJcmVhbF90dHkgPSB0dHktPmxpbms7CisKKwkvKgorCSAqIEJyZWFrIGhhbmRsaW5nIGJ5IGRyaXZlcgorCSAqLworCWlmICghdHR5LT5kcml2ZXItPmJyZWFrX2N0bCkgeworCQlzd2l0Y2goY21kKSB7CisJCWNhc2UgVElPQ1NCUks6CisJCWNhc2UgVElPQ0NCUks6CisJCQlpZiAodHR5LT5kcml2ZXItPmlvY3RsKQorCQkJCXJldHVybiB0dHktPmRyaXZlci0+aW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQorCQkvKiBUaGVzZSB0d28gaW9jdGwncyBhbHdheXMgcmV0dXJuIHN1Y2Nlc3M7IGV2ZW4gaWYgKi8KKwkJLyogdGhlIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgdGhlbS4gKi8KKwkJY2FzZSBUQ1NCUks6CisJCWNhc2UgVENTQlJLUDoKKwkJCWlmICghdHR5LT5kcml2ZXItPmlvY3RsKQorCQkJCXJldHVybiAwOworCQkJcmV0dmFsID0gdHR5LT5kcml2ZXItPmlvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQkJaWYgKHJldHZhbCA9PSAtRU5PSU9DVExDTUQpCisJCQkJcmV0dmFsID0gMDsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwkvKgorCSAqIEZhY3RvciBvdXQgc29tZSBjb21tb24gcHJlcCB3b3JrCisJICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NTRVREOgorCWNhc2UgVElPQ1NCUks6CisJY2FzZSBUSU9DQ0JSSzoKKwljYXNlIFRDU0JSSzoKKwljYXNlIFRDU0JSS1A6CQkJCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmIChjbWQgIT0gVElPQ0NCUkspIHsKKwkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gLUVJTlRSOworCQl9CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElPQ1NUSToKKwkJCXJldHVybiB0aW9jc3RpKHR0eSwgcCk7CisJCWNhc2UgVElPQ0dXSU5TWjoKKwkJCXJldHVybiB0aW9jZ3dpbnN6KHR0eSwgcCk7CisJCWNhc2UgVElPQ1NXSU5TWjoKKwkJCXJldHVybiB0aW9jc3dpbnN6KHR0eSwgcmVhbF90dHksIHApOworCQljYXNlIFRJT0NDT05TOgorCQkJcmV0dXJuIHJlYWxfdHR5IT10dHkgPyAtRUlOVkFMIDogdGlvY2NvbnMoZmlsZSk7CisJCWNhc2UgRklPTkJJTzoKKwkJCXJldHVybiBmaW9uYmlvKGZpbGUsIHApOworCQljYXNlIFRJT0NFWENMOgorCQkJc2V0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSU9DTlhDTDoKKwkJCWNsZWFyX2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSU9DTk9UVFk6CisJCQlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5KQorCQkJCXJldHVybiAtRU5PVFRZOworCQkJaWYgKGN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyKQorCQkJCWRpc2Fzc29jaWF0ZV9jdHR5KDApOworCQkJdGFza19sb2NrKGN1cnJlbnQpOworCQkJY3VycmVudC0+c2lnbmFsLT50dHkgPSBOVUxMOworCQkJdGFza191bmxvY2soY3VycmVudCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSU9DU0NUVFk6CisJCQlyZXR1cm4gdGlvY3NjdHR5KHR0eSwgYXJnKTsKKwkJY2FzZSBUSU9DR1BHUlA6CisJCQlyZXR1cm4gdGlvY2dwZ3JwKHR0eSwgcmVhbF90dHksIHApOworCQljYXNlIFRJT0NTUEdSUDoKKwkJCXJldHVybiB0aW9jc3BncnAodHR5LCByZWFsX3R0eSwgcCk7CisJCWNhc2UgVElPQ0dTSUQ6CisJCQlyZXR1cm4gdGlvY2dzaWQodHR5LCByZWFsX3R0eSwgcCk7CisJCWNhc2UgVElPQ0dFVEQ6CisJCQkvKiBGSVhNRTogY2hlY2sgdGhpcyBpcyBvayAqLworCQkJcmV0dXJuIHB1dF91c2VyKHR0eS0+bGRpc2MubnVtLCAoaW50IF9fdXNlciAqKXApOworCQljYXNlIFRJT0NTRVREOgorCQkJcmV0dXJuIHRpb2NzZXRkKHR0eSwgcCk7CisjaWZkZWYgQ09ORklHX1ZUCisJCWNhc2UgVElPQ0xJTlVYOgorCQkJcmV0dXJuIHRpb2NsaW51eCh0dHksIGFyZyk7CisjZW5kaWYKKwkJLyoKKwkJICogQnJlYWsgaGFuZGxpbmcKKwkJICovCisJCWNhc2UgVElPQ1NCUks6CS8qIFR1cm4gYnJlYWsgb24sIHVuY29uZGl0aW9uYWxseSAqLworCQkJdHR5LT5kcml2ZXItPmJyZWFrX2N0bCh0dHksIC0xKTsKKwkJCXJldHVybiAwOworCQkJCisJCWNhc2UgVElPQ0NCUks6CS8qIFR1cm4gYnJlYWsgb2ZmLCB1bmNvbmRpdGlvbmFsbHkgKi8KKwkJCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAwKTsKKwkJCXJldHVybiAwOworCQljYXNlIFRDU0JSSzogICAvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKwkJCS8qCisJCQkgKiBYWFggaXMgdGhlIGFib3ZlIGNvbW1lbnQgY29ycmVjdCwgb3IgdGhlCisJCQkgKiBjb2RlIGJlbG93IGNvcnJlY3Q/ICBJcyB0aGlzIGlvY3RsIHVzZWQgYXQKKwkJCSAqIGFsbCBieSBhbnlvbmU/CisJCQkgKi8KKwkJCWlmICghYXJnKQorCQkJCXJldHVybiBzZW5kX2JyZWFrKHR0eSwgSFovNCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUQ1NCUktQOgkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCQorCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBhcmcgPyBhcmcqKEhaLzEwKSA6IEhaLzQpOworCisJCWNhc2UgVElPQ01HRVQ6CisJCQlyZXR1cm4gdHR5X3Rpb2NtZ2V0KHR0eSwgZmlsZSwgcCk7CisKKwkJY2FzZSBUSU9DTVNFVDoKKwkJY2FzZSBUSU9DTUJJQzoKKwkJY2FzZSBUSU9DTUJJUzoKKwkJCXJldHVybiB0dHlfdGlvY21zZXQodHR5LCBmaWxlLCBjbWQsIHApOworCX0KKwlpZiAodHR5LT5kcml2ZXItPmlvY3RsKSB7CisJCXJldHZhbCA9ICh0dHktPmRyaXZlci0+aW9jdGwpKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmV0dmFsICE9IC1FTk9JT0NUTENNRCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWxkID0gdHR5X2xkaXNjX3JlZl93YWl0KHR0eSk7CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAobGQtPmlvY3RsKSB7CisJCXJldHZhbCA9IGxkLT5pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJldHZhbCA9PSAtRU5PSU9DVExDTUQpCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgIlNlY3VyZSBBdHRlbnRpb24gS2V5IiAtLS0gIHRoZSBpZGVhIGlzIHRvCisgKiBwcmV2ZW50IHRyb2phbiBob3JzZXMgYnkga2lsbGluZyBhbGwgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiB0dHkgd2hlbiB0aGUgdXNlciBoaXRzIHRoZSAiU2VjdXJlIEF0dGVudGlvbiBLZXkiLiAgUmVxdWlyZWQgZm9yCisgKiBzdXBlci1wYXJhbm9pZCBhcHBsaWNhdGlvbnMgLS0tIHNlZSB0aGUgT3JhbmdlIEJvb2sgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogVGhpcyBjb2RlIGNvdWxkIGJlIG5pY2VyOyBpZGVhbGx5IGl0IHNob3VsZCBzZW5kIGEgSFVQLCB3YWl0IGEgZmV3CisgKiBzZWNvbmRzLCB0aGVuIHNlbmQgYSBJTlQsIGFuZCB0aGVuIGEgS0lMTCBzaWduYWwuICBCdXQgeW91IHRoZW4KKyAqIGhhdmUgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSBpbml0IHByb2Nlc3MsIHNpbmNlIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgY3VycmVudCB0dHkgbXVzdCBiZSBkZWFkIGJlZm9yZSB0aGUgbmV3IGdldHR5IGlzIGFsbG93ZWQKKyAqIHRvIHNwYXduLgorICoKKyAqIE5vdywgaWYgaXQgd291bGQgYmUgY29ycmVjdCA7LS8gVGhlIGN1cnJlbnQgY29kZSBoYXMgYSBuYXN0eSBob2xlIC0KKyAqIGl0IGRvZXNuJ3QgY2F0Y2ggZmlsZXMgaW4gZmxpZ2h0LiBXZSBtYXkgc2VuZCB0aGUgZGVzY3JpcHRvciB0byBvdXJzZWx2ZXMKKyAqIHZpYSBBRl9VTklYIHNvY2tldCwgY2xvc2UgaXQgYW5kIGxhdGVyIGZldGNoIGZyb20gc29ja2V0LiBGSVhNRS4KKyAqCisgKiBOYXN0eSBidWc6IGRvX1NBSyBpcyBiZWluZyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuICBUaGlzIGNhbgorICogZGVhZGxvY2suICBXZSBwdW50IGl0IHVwIHRvIHByb2Nlc3MgY29udGV4dC4gIEFLUE0gLSAxNk1hcjIwMDEKKyAqLworc3RhdGljIHZvaWQgX19kb19TQUsodm9pZCAqYXJnKQoreworI2lmZGVmIFRUWV9TT0ZUX1NBSworCXR0eV9oYW5ndXAodHR5KTsKKyNlbHNlCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGFyZzsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IHNlc3Npb247CisJaW50CQlpOworCXN0cnVjdCBmaWxlCSpmaWxwOworCXN0cnVjdCB0dHlfbGRpc2MgKmRpc2M7CisJCisJaWYgKCF0dHkpCisJCXJldHVybjsKKwlzZXNzaW9uICA9IHR0eS0+c2Vzc2lvbjsKKwkKKwkvKiBXZSBkb24ndCB3YW50IGFuIGxkaXNjIHN3aXRjaCBkdXJpbmcgdGhpcyAqLworCWRpc2MgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGRpc2MgJiYgZGlzYy0+Zmx1c2hfYnVmZmVyKQorCQlkaXNjLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZGVyZWYoZGlzYyk7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQorCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZG9fZWFjaF90YXNrX3BpZChzZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgeworCQlpZiAocC0+c2lnbmFsLT50dHkgPT0gdHR5IHx8IHNlc3Npb24gPiAwKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNBSzoga2lsbGVkIHByb2Nlc3MgJWQiCisJCQkgICAgIiAoJXMpOiBwLT5zaWduYWwtPnNlc3Npb249PXR0eS0+c2Vzc2lvblxuIiwKKwkJCSAgICBwLT5waWQsIHAtPmNvbW0pOworCQkJc2VuZF9zaWcoU0lHS0lMTCwgcCwgMSk7CisJCQljb250aW51ZTsKKwkJfQorCQl0YXNrX2xvY2socCk7CisJCWlmIChwLT5maWxlcykgeworCQkJc3Bpbl9sb2NrKCZwLT5maWxlcy0+ZmlsZV9sb2NrKTsKKwkJCWZvciAoaT0wOyBpIDwgcC0+ZmlsZXMtPm1heF9mZHM7IGkrKykgeworCQkJCWZpbHAgPSBmY2hlY2tfZmlsZXMocC0+ZmlsZXMsIGkpOworCQkJCWlmICghZmlscCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGZpbHAtPmZfb3AtPnJlYWQgPT0gdHR5X3JlYWQgJiYKKwkJCQkgICAgZmlscC0+cHJpdmF0ZV9kYXRhID09IHR0eSkgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNBSzoga2lsbGVkIHByb2Nlc3MgJWQiCisJCQkJCSAgICAiICglcyk6IGZkIyVkIG9wZW5lZCB0byB0aGUgdHR5XG4iLAorCQkJCQkgICAgcC0+cGlkLCBwLT5jb21tLCBpKTsKKwkJCQkJc2VuZF9zaWcoU0lHS0lMTCwgcCwgMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZwLT5maWxlcy0+ZmlsZV9sb2NrKTsKKwkJfQorCQl0YXNrX3VubG9jayhwKTsKKwl9IHdoaWxlX2VhY2hfdGFza19waWQoc2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKyNlbmRpZgorfQorCisvKgorICogVGhlIHRxIGhhbmRsaW5nIGhlcmUgaXMgYSBsaXR0bGUgcmFjeSAtIHR0eS0+U0FLX3dvcmsgbWF5IGFscmVhZHkgYmUgcXVldWVkLgorICogRm9ydHVuYXRlbHkgd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSwgYmVjYXVzZSBpZiAtPlNBS193b3JrIGlzIGFscmVhZHkgcXVldWVkLAorICogdGhlIHZhbHVlcyB3aGljaCB3ZSB3cml0ZSB0byBpdCB3aWxsIGJlIGlkZW50aWNhbCB0byB0aGUgdmFsdWVzIHdoaWNoIGl0CisgKiBhbHJlYWR5IGhhcy4gLS1ha3BtCisgKi8KK3ZvaWQgZG9fU0FLKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwlQUkVQQVJFX1dPUksoJnR0eS0+U0FLX3dvcmssIF9fZG9fU0FLLCB0dHkpOworCXNjaGVkdWxlX3dvcmsoJnR0eS0+U0FLX3dvcmspOworfQorCitFWFBPUlRfU1lNQk9MKGRvX1NBSyk7CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG91dCBvZiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGZsdXNoIGRhdGEKKyAqIGZyb20gdGhlIGZsaXAgYnVmZmVyIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuIAorICovCisgCitzdGF0aWMgdm9pZCBmbHVzaF90b19sZGlzYyh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIHByaXZhdGVfOworCXVuc2lnbmVkIGNoYXIJKmNwOworCWNoYXIJCSpmcDsKKwlpbnQJCWNvdW50OworCXVuc2lnbmVkIGxvbmcgCWZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmRpc2M7CisKKwlkaXNjID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChkaXNjID09IE5VTEwpCS8qICAhVFRZX0xESVNDICovCisJCXJldHVybjsKKworCWlmICh0ZXN0X2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncykpIHsKKwkJLyoKKwkJICogRG8gaXQgYWZ0ZXIgdGhlIG5leHQgdGltZXIgdGljazoKKwkJICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJaWYgKHR0eS0+ZmxpcC5idWZfbnVtKSB7CisJCWNwID0gdHR5LT5mbGlwLmNoYXJfYnVmICsgVFRZX0ZMSVBCVUZfU0laRTsKKwkJZnAgPSB0dHktPmZsaXAuZmxhZ19idWYgKyBUVFlfRkxJUEJVRl9TSVpFOworCQl0dHktPmZsaXAuYnVmX251bSA9IDA7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSB0dHktPmZsaXAuY2hhcl9idWY7CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSB0dHktPmZsaXAuZmxhZ19idWY7CisJfSBlbHNlIHsKKwkJY3AgPSB0dHktPmZsaXAuY2hhcl9idWY7CisJCWZwID0gdHR5LT5mbGlwLmZsYWdfYnVmOworCQl0dHktPmZsaXAuYnVmX251bSA9IDE7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSB0dHktPmZsaXAuY2hhcl9idWYgKyBUVFlfRkxJUEJVRl9TSVpFOworCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gdHR5LT5mbGlwLmZsYWdfYnVmICsgVFRZX0ZMSVBCVUZfU0laRTsKKwl9CisJY291bnQgPSB0dHktPmZsaXAuY291bnQ7CisJdHR5LT5mbGlwLmNvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCisJZGlzYy0+cmVjZWl2ZV9idWYodHR5LCBjcCwgZnAsIGNvdW50KTsKK291dDoKKwl0dHlfbGRpc2NfZGVyZWYoZGlzYyk7Cit9CisKKy8qCisgKiBSb3V0aW5lIHdoaWNoIHJldHVybnMgdGhlIGJhdWQgcmF0ZSBvZiB0aGUgdHR5CisgKgorICogTm90ZSB0aGF0IHRoZSBiYXVkX3RhYmxlIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZQorICogaW5jbHVkZS9hc20vdGVybWJpdHMuaCBmaWxlLgorICovCitzdGF0aWMgaW50IGJhdWRfdGFibGVbXSA9IHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwKKyNpZmRlZiBfX3NwYXJjX18KKwk3NjgwMCwgMTUzNjAwLCAzMDcyMDAsIDYxNDQwMCwgOTIxNjAwCisjZWxzZQorCTUwMDAwMCwgNTc2MDAwLCA5MjE2MDAsIDEwMDAwMDAsIDExNTIwMDAsIDE1MDAwMDAsIDIwMDAwMDAsCisJMjUwMDAwMCwgMzAwMDAwMCwgMzUwMDAwMCwgNDAwMDAwMAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IG5fYmF1ZF90YWJsZSA9IEFSUkFZX1NJWkUoYmF1ZF90YWJsZSk7CisKKy8qKgorICoJdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlCisgKglAdGVybWlvczogdGVybWlvcyBzdHJ1Y3R1cmUKKyAqCisgKglDb252ZXJ0IHRlcm1pb3MgYmF1ZCByYXRlIGRhdGEgaW50byBhIHNwZWVkLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQKKyAqCXdpdGggdGhlIHRlcm1pb3MgbG9jayBoZWxkIGlmIHRoaXMgdGVybWlvcyBpcyBhIHRlcm1pbmFsIHRlcm1pb3MKKyAqCXN0cnVjdHVyZS4gTWF5IGNoYW5nZSB0aGUgdGVybWlvcyBkYXRhLgorICovCisgCitpbnQgdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zKQoreworCXVuc2lnbmVkIGludCBjYmF1ZDsKKwkKKwljYmF1ZCA9IHRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRDsKKworCWlmIChjYmF1ZCAmIENCQVVERVgpIHsKKwkJY2JhdWQgJj0gfkNCQVVERVg7CisKKwkJaWYgKGNiYXVkIDwgMSB8fCBjYmF1ZCArIDE1ID4gbl9iYXVkX3RhYmxlKQorCQkJdGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKKwkJZWxzZQorCQkJY2JhdWQgKz0gMTU7CisJfQorCXJldHVybiBiYXVkX3RhYmxlW2NiYXVkXTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfdGVybWlvc19iYXVkX3JhdGUpOworCisvKioKKyAqCXR0eV9nZXRfYmF1ZF9yYXRlCS0JZ2V0IHR0eSBiaXQgcmF0ZXMKKyAqCUB0dHk6IHR0eSB0byBxdWVyeQorICoKKyAqCVJldHVybnMgdGhlIGJhdWQgcmF0ZSBhcyBhbiBpbnRlZ2VyIGZvciB0aGlzIHRlcm1pbmFsLiBUaGUKKyAqCXRlcm1pb3MgbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlciBhbmQgdGhlIHRlcm1pbmFsIGJpdAorICoJZmxhZ3MgbWF5IGJlIHVwZGF0ZWQuCisgKi8KKyAKK2ludCB0dHlfZ2V0X2JhdWRfcmF0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBiYXVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHR0eS0+dGVybWlvcyk7CisKKwlpZiAoYmF1ZCA9PSAzODQwMCAmJiB0dHktPmFsdF9zcGVlZCkgeworCQlpZiAoIXR0eS0+d2FybmVkKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVc2Ugb2Ygc2V0c2VyaWFsL3NldHJvY2tldCB0byAiCisJCQkJCSAgICAic2V0IFNQRF8qIGZsYWdzIGlzIGRlcHJlY2F0ZWRcbiIpOworCQkJdHR5LT53YXJuZWQgPSAxOworCQl9CisJCWJhdWQgPSB0dHktPmFsdF9zcGVlZDsKKwl9CisJCisJcmV0dXJuIGJhdWQ7Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X2dldF9iYXVkX3JhdGUpOworCisvKioKKyAqCXR0eV9mbGlwX2J1ZmZlcl9wdXNoCS0JdGVybWluYWwKKyAqCUB0dHk6IHR0eSB0byBwdXNoCisgKgorICoJUXVldWUgYSBwdXNoIG9mIHRoZSB0ZXJtaW5hbCBmbGlwIGJ1ZmZlcnMgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gVGhpcworICoJZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gSVJRIGNvbnRleHQgaWYgdHR5LT5sb3dfbGF0ZW5jeSBpcyBzZXQuCisgKgorICoJSW4gdGhlIGV2ZW50IG9mIHRoZSBxdWV1ZSBiZWluZyBidXN5IGZvciBmbGlwcGluZyB0aGUgd29yayB3aWxsIGJlCisgKgloZWxkIG9mZiBhbmQgcmV0cmllZCBsYXRlci4KKyAqLworCit2b2lkIHR0eV9mbGlwX2J1ZmZlcl9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eS0+bG93X2xhdGVuY3kpCisJCWZsdXNoX3RvX2xkaXNjKCh2b2lkICopIHR0eSk7CisJZWxzZQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfZmxpcF9idWZmZXJfcHVzaCk7CisKKy8qCisgKiBUaGlzIHN1YnJvdXRpbmUgaW5pdGlhbGl6ZXMgYSB0dHkgc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwltZW1zZXQodHR5LCAwLCBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QpKTsKKwl0dHktPm1hZ2ljID0gVFRZX01BR0lDOworCXR0eV9sZGlzY19hc3NpZ24odHR5LCB0dHlfbGRpc2NfZ2V0KE5fVFRZKSk7CisJdHR5LT5wZ3JwID0gLTE7CisJdHR5LT5vdmVycnVuX3RpbWUgPSBqaWZmaWVzOworCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSB0dHktPmZsaXAuY2hhcl9idWY7CisJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IHR0eS0+ZmxpcC5mbGFnX2J1ZjsKKwlJTklUX1dPUksoJnR0eS0+ZmxpcC53b3JrLCBmbHVzaF90b19sZGlzYywgdHR5KTsKKwlpbml0X01VVEVYKCZ0dHktPmZsaXAucHR5X3NlbSk7CisJaW5pdF9NVVRFWCgmdHR5LT50ZXJtaW9zX3NlbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHR5LT53cml0ZV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0dHktPnJlYWRfd2FpdCk7CisJSU5JVF9XT1JLKCZ0dHktPmhhbmd1cF93b3JrLCBkb190dHlfaGFuZ3VwLCB0dHkpOworCXNlbWFfaW5pdCgmdHR5LT5hdG9taWNfcmVhZCwgMSk7CisJc2VtYV9pbml0KCZ0dHktPmF0b21pY193cml0ZSwgMSk7CisJc3Bpbl9sb2NrX2luaXQoJnR0eS0+cmVhZF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmdHR5LT50dHlfZmlsZXMpOworCUlOSVRfV09SSygmdHR5LT5TQUtfd29yaywgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGUgZGVmYXVsdCBwdXRfY2hhciByb3V0aW5lIGlmIHRoZSBkcml2ZXIgZGlkIG5vdCBkZWZpbmUgb25lLgorICovCitzdGF0aWMgdm9pZCB0dHlfZGVmYXVsdF9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXR0eS0+ZHJpdmVyLT53cml0ZSh0dHksICZjaCwgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICp0dHlfY2xhc3M7CisKKy8qKgorICogdHR5X3JlZ2lzdGVyX2RldmljZSAtIHJlZ2lzdGVyIGEgdHR5IGRldmljZQorICogQGRyaXZlcjogdGhlIHR0eSBkcml2ZXIgdGhhdCBkZXNjcmliZXMgdGhlIHR0eSBkZXZpY2UKKyAqIEBpbmRleDogdGhlIGluZGV4IGluIHRoZSB0dHkgZHJpdmVyIGZvciB0aGlzIHR0eSBkZXZpY2UKKyAqIEBkZXZpY2U6IGEgc3RydWN0IGRldmljZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHR0eSBkZXZpY2UuCisgKglUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLCBpZiB0aGVyZSBpcyBubyBrbm93biBzdHJ1Y3QgZGV2aWNlIGZvciB0aGlzCisgKgl0dHkgZGV2aWNlIGl0IGNhbiBiZSBzZXQgdG8gTlVMTCBzYWZlbHkuCisgKgorICogVGhpcyBjYWxsIGlzIHJlcXVpcmVkIHRvIGJlIG1hZGUgdG8gcmVnaXN0ZXIgYW4gaW5kaXZpZHVhbCB0dHkgZGV2aWNlIGlmCisgKiB0aGUgdHR5IGRyaXZlcidzIGZsYWdzIGhhdmUgdGhlIFRUWV9EUklWRVJfTk9fREVWRlMgYml0IHNldC4gIElmIHRoYXQKKyAqIGJpdCBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkLgorICovCit2b2lkIHR0eV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgdW5zaWduZWQgaW5kZXgsCisJCQkgc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWNoYXIgbmFtZVs2NF07CisJZGV2X3QgZGV2ID0gTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCkgKyBpbmRleDsKKworCWlmIChpbmRleCA+PSBkcml2ZXItPm51bSkgeworCQlwcmludGsoS0VSTl9FUlIgIkF0dGVtcHQgdG8gcmVnaXN0ZXIgaW52YWxpZCB0dHkgbGluZSBudW1iZXIgIgorCQkgICAgICAgIiAoJWQpLlxuIiwgaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJZGV2ZnNfbWtfY2RldihkZXYsIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCSIlcyVkIiwgZHJpdmVyLT5kZXZmc19uYW1lLCBpbmRleCArIGRyaXZlci0+bmFtZV9iYXNlKTsKKworCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkKKwkJcHR5X2xpbmVfbmFtZShkcml2ZXIsIGluZGV4LCBuYW1lKTsKKwllbHNlCisJCXR0eV9saW5lX25hbWUoZHJpdmVyLCBpbmRleCwgbmFtZSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodHR5X2NsYXNzLCBkZXYsIGRldmljZSwgbmFtZSk7Cit9CisKKy8qKgorICogdHR5X3VucmVnaXN0ZXJfZGV2aWNlIC0gdW5yZWdpc3RlciBhIHR0eSBkZXZpY2UKKyAqIEBkcml2ZXI6IHRoZSB0dHkgZHJpdmVyIHRoYXQgZGVzY3JpYmVzIHRoZSB0dHkgZGV2aWNlCisgKiBAaW5kZXg6IHRoZSBpbmRleCBpbiB0aGUgdHR5IGRyaXZlciBmb3IgdGhpcyB0dHkgZGV2aWNlCisgKgorICogSWYgYSB0dHkgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBhIGNhbGwgdG8gdHR5X3JlZ2lzdGVyX2RldmljZSgpIHRoZW4KKyAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBtYWRlIHdoZW4gdGhlIHR0eSBkZXZpY2UgaXMgZ29uZS4KKyAqLwordm9pZCB0dHlfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgdW5zaWduZWQgaW5kZXgpCit7CisJZGV2ZnNfcmVtb3ZlKCIlcyVkIiwgZHJpdmVyLT5kZXZmc19uYW1lLCBpbmRleCArIGRyaXZlci0+bmFtZV9iYXNlKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0KSArIGluZGV4KTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wodHR5X3VucmVnaXN0ZXJfZGV2aWNlKTsKKworc3RydWN0IHR0eV9kcml2ZXIgKmFsbG9jX3R0eV9kcml2ZXIoaW50IGxpbmVzKQoreworCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CisKKwlkcml2ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlciksIEdGUF9LRVJORUwpOworCWlmIChkcml2ZXIpIHsKKwkJbWVtc2V0KGRyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSk7CisJCWRyaXZlci0+bWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOworCQlkcml2ZXItPm51bSA9IGxpbmVzOworCQkvKiBsYXRlciB3ZSdsbCBtb3ZlIGFsbG9jYXRpb24gb2YgdGFibGVzIGhlcmUgKi8KKwl9CisJcmV0dXJuIGRyaXZlcjsKK30KKwordm9pZCBwdXRfdHR5X2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQoreworCWtmcmVlKGRyaXZlcik7Cit9CisKK3ZvaWQgdHR5X3NldF9vcGVyYXRpb25zKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyAqb3ApCit7CisJZHJpdmVyLT5vcGVuID0gb3AtPm9wZW47CisJZHJpdmVyLT5jbG9zZSA9IG9wLT5jbG9zZTsKKwlkcml2ZXItPndyaXRlID0gb3AtPndyaXRlOworCWRyaXZlci0+cHV0X2NoYXIgPSBvcC0+cHV0X2NoYXI7CisJZHJpdmVyLT5mbHVzaF9jaGFycyA9IG9wLT5mbHVzaF9jaGFyczsKKwlkcml2ZXItPndyaXRlX3Jvb20gPSBvcC0+d3JpdGVfcm9vbTsKKwlkcml2ZXItPmNoYXJzX2luX2J1ZmZlciA9IG9wLT5jaGFyc19pbl9idWZmZXI7CisJZHJpdmVyLT5pb2N0bCA9IG9wLT5pb2N0bDsKKwlkcml2ZXItPnNldF90ZXJtaW9zID0gb3AtPnNldF90ZXJtaW9zOworCWRyaXZlci0+dGhyb3R0bGUgPSBvcC0+dGhyb3R0bGU7CisJZHJpdmVyLT51bnRocm90dGxlID0gb3AtPnVudGhyb3R0bGU7CisJZHJpdmVyLT5zdG9wID0gb3AtPnN0b3A7CisJZHJpdmVyLT5zdGFydCA9IG9wLT5zdGFydDsKKwlkcml2ZXItPmhhbmd1cCA9IG9wLT5oYW5ndXA7CisJZHJpdmVyLT5icmVha19jdGwgPSBvcC0+YnJlYWtfY3RsOworCWRyaXZlci0+Zmx1c2hfYnVmZmVyID0gb3AtPmZsdXNoX2J1ZmZlcjsKKwlkcml2ZXItPnNldF9sZGlzYyA9IG9wLT5zZXRfbGRpc2M7CisJZHJpdmVyLT53YWl0X3VudGlsX3NlbnQgPSBvcC0+d2FpdF91bnRpbF9zZW50OworCWRyaXZlci0+c2VuZF94Y2hhciA9IG9wLT5zZW5kX3hjaGFyOworCWRyaXZlci0+cmVhZF9wcm9jID0gb3AtPnJlYWRfcHJvYzsKKwlkcml2ZXItPndyaXRlX3Byb2MgPSBvcC0+d3JpdGVfcHJvYzsKKwlkcml2ZXItPnRpb2NtZ2V0ID0gb3AtPnRpb2NtZ2V0OworCWRyaXZlci0+dGlvY21zZXQgPSBvcC0+dGlvY21zZXQ7Cit9CisKKworRVhQT1JUX1NZTUJPTChhbGxvY190dHlfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wocHV0X3R0eV9kcml2ZXIpOworRVhQT1JUX1NZTUJPTCh0dHlfc2V0X29wZXJhdGlvbnMpOworCisvKgorICogQ2FsbGVkIGJ5IGEgdHR5IGRyaXZlciB0byByZWdpc3RlciBpdHNlbGYuCisgKi8KK2ludCB0dHlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpCit7CisJaW50IGVycm9yOworICAgICAgICBpbnQgaTsKKwlkZXZfdCBkZXY7CisJdm9pZCAqKnAgPSBOVUxMOworCisJaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0lOU1RBTExFRCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkgeworCQlwID0ga21hbGxvYyhkcml2ZXItPm51bSAqIDMgKiBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQocCwgMCwgZHJpdmVyLT5udW0gKiAzICogc2l6ZW9mKHZvaWQgKikpOworCX0KKworCWlmICghZHJpdmVyLT5tYWpvcikgeworCQllcnJvciA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgZHJpdmVyLT5taW5vcl9zdGFydCwgZHJpdmVyLT5udW0sCisJCQkJCQkoY2hhciopZHJpdmVyLT5uYW1lKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZHJpdmVyLT5tYWpvciA9IE1BSk9SKGRldik7CisJCQlkcml2ZXItPm1pbm9yX3N0YXJ0ID0gTUlOT1IoZGV2KTsKKwkJfQorCX0gZWxzZSB7CisJCWRldiA9IE1LREVWKGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3Jfc3RhcnQpOworCQllcnJvciA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBkcml2ZXItPm51bSwKKwkJCQkJCShjaGFyKilkcml2ZXItPm5hbWUpOworCX0KKwlpZiAoZXJyb3IgPCAwKSB7CisJCWtmcmVlKHApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaWYgKHApIHsKKwkJZHJpdmVyLT50dHlzID0gKHN0cnVjdCB0dHlfc3RydWN0ICoqKXA7CisJCWRyaXZlci0+dGVybWlvcyA9IChzdHJ1Y3QgdGVybWlvcyAqKikocCArIGRyaXZlci0+bnVtKTsKKwkJZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IChzdHJ1Y3QgdGVybWlvcyAqKikocCArIGRyaXZlci0+bnVtICogMik7CisJfSBlbHNlIHsKKwkJZHJpdmVyLT50dHlzID0gTlVMTDsKKwkJZHJpdmVyLT50ZXJtaW9zID0gTlVMTDsKKwkJZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IE5VTEw7CisJfQorCisJY2Rldl9pbml0KCZkcml2ZXItPmNkZXYsICZ0dHlfZm9wcyk7CisJZHJpdmVyLT5jZGV2Lm93bmVyID0gZHJpdmVyLT5vd25lcjsKKwllcnJvciA9IGNkZXZfYWRkKCZkcml2ZXItPmNkZXYsIGRldiwgZHJpdmVyLT5udW0pOworCWlmIChlcnJvcikgeworCQljZGV2X2RlbCgmZHJpdmVyLT5jZGV2KTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgZHJpdmVyLT5udW0pOworCQlkcml2ZXItPnR0eXMgPSBOVUxMOworCQlkcml2ZXItPnRlcm1pb3MgPSBkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gTlVMTDsKKwkJa2ZyZWUocCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpZiAoIWRyaXZlci0+cHV0X2NoYXIpCisJCWRyaXZlci0+cHV0X2NoYXIgPSB0dHlfZGVmYXVsdF9wdXRfY2hhcjsKKwkKKwlsaXN0X2FkZCgmZHJpdmVyLT50dHlfZHJpdmVycywgJnR0eV9kcml2ZXJzKTsKKwkKKwlpZiAoICEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfTk9fREVWRlMpICkgeworCQlmb3IoaSA9IDA7IGkgPCBkcml2ZXItPm51bTsgaSsrKQorCQkgICAgdHR5X3JlZ2lzdGVyX2RldmljZShkcml2ZXIsIGksIE5VTEwpOworCX0KKwlwcm9jX3R0eV9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfZHJpdmVyKTsKKworLyoKKyAqIENhbGxlZCBieSBhIHR0eSBkcml2ZXIgdG8gdW5yZWdpc3RlciBpdHNlbGYuCisgKi8KK2ludCB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGVybWlvcyAqdHA7CisJdm9pZCAqcDsKKworCWlmIChkcml2ZXItPnJlZmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3Jfc3RhcnQpLAorCQkJCWRyaXZlci0+bnVtKTsKKworCWxpc3RfZGVsKCZkcml2ZXItPnR0eV9kcml2ZXJzKTsKKworCS8qCisJICogRnJlZSB0aGUgdGVybWlvcyBhbmQgdGVybWlvc19sb2NrZWQgc3RydWN0dXJlcyBiZWNhdXNlCisJICogd2UgZG9uJ3Qgd2FudCB0byBnZXQgbWVtb3J5IGxlYWtzIHdoZW4gbW9kdWxhciB0dHkKKwkgKiBkcml2ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZHJpdmVyLT5udW07IGkrKykgeworCQl0cCA9IGRyaXZlci0+dGVybWlvc1tpXTsKKwkJaWYgKHRwKSB7CisJCQlkcml2ZXItPnRlcm1pb3NbaV0gPSBOVUxMOworCQkJa2ZyZWUodHApOworCQl9CisJCXRwID0gZHJpdmVyLT50ZXJtaW9zX2xvY2tlZFtpXTsKKwkJaWYgKHRwKSB7CisJCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkW2ldID0gTlVMTDsKKwkJCWtmcmVlKHRwKTsKKwkJfQorCQlpZiAoIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9OT19ERVZGUykpCisJCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoZHJpdmVyLCBpKTsKKwl9CisJcCA9IGRyaXZlci0+dHR5czsKKwlwcm9jX3R0eV91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworCWRyaXZlci0+dHR5cyA9IE5VTEw7CisJZHJpdmVyLT50ZXJtaW9zID0gZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IE5VTEw7CisJa2ZyZWUocCk7CisJY2Rldl9kZWwoJmRyaXZlci0+Y2Rldik7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X3VucmVnaXN0ZXJfZHJpdmVyKTsKKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29uc29sZSBkZXZpY2UuIFRoaXMgaXMgY2FsbGVkICplYXJseSosIHNvCisgKiB3ZSBjYW4ndCBuZWNlc3NhcmlseSBkZXBlbmQgb24gbG90cyBvZiBrZXJuZWwgaGVscCBoZXJlLgorICogSnVzdCBkbyBzb21lIGVhcmx5IGluaXRpYWxpemF0aW9ucywgYW5kIGRvIHRoZSBjb21wbGV4IHNldHVwCisgKiBsYXRlci4KKyAqLwordm9pZCBfX2luaXQgY29uc29sZV9pbml0KHZvaWQpCit7CisJaW5pdGNhbGxfdCAqY2FsbDsKKworCS8qIFNldHVwIHRoZSBkZWZhdWx0IFRUWSBsaW5lIGRpc2NpcGxpbmUuICovCisJKHZvaWQpIHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1RUWSwgJnR0eV9sZGlzY19OX1RUWSk7CisKKwkvKgorCSAqIHNldCB1cCB0aGUgY29uc29sZSBkZXZpY2Ugc28gdGhhdCBsYXRlciBib290IHNlcXVlbmNlcyBjYW4gCisJICogaW5mb3JtIGFib3V0IHByb2JsZW1zIGV0Yy4uCisJICovCisjaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USworCWRpc2FibGVfZWFybHlfcHJpbnRrKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzY4MzYwCisgCS8qIFRoaXMgaXMgbm90IGEgY29uc29sZSBpbml0Y2FsbC4gSSBrbm93IG5vdCB3aGF0IGl0J3MgZG9pbmcgaGVyZS4KKwkgICBTbyBJIGhhdmVuJ3QgbW92ZWQgaXQuIGR3bXcyICovCisgICAgICAgIHJzXzM2MF9pbml0KCk7CisjZW5kaWYKKwljYWxsID0gX19jb25faW5pdGNhbGxfc3RhcnQ7CisJd2hpbGUgKGNhbGwgPCBfX2Nvbl9pbml0Y2FsbF9lbmQpIHsKKwkJKCpjYWxsKSgpOworCQljYWxsKys7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1ZUCitleHRlcm4gaW50IHZ0eV9pbml0KHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHR0eV9jbGFzc19pbml0KHZvaWQpCit7CisJdHR5X2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInR0eSIpOworCWlmIChJU19FUlIodHR5X2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIodHR5X2NsYXNzKTsKKwlyZXR1cm4gMDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwodHR5X2NsYXNzX2luaXQpOworCisvKiAzLzIwMDQgam1jOiB3aHkgZG8gdGhlc2UgZGV2aWNlcyBleGlzdD8gKi8KKworc3RhdGljIHN0cnVjdCBjZGV2IHR0eV9jZGV2LCBjb25zb2xlX2NkZXY7CisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCitzdGF0aWMgc3RydWN0IGNkZXYgcHRteF9jZGV2OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZUCitzdGF0aWMgc3RydWN0IGNkZXYgdmMwX2NkZXY7CisjZW5kaWYKKworLyoKKyAqIE9rLCBub3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIHR0eSBkZXZpY2VzIGFuZCBjYW4gY291bnQKKyAqIG9uIG1lbW9yeSBhbGxvY2F0aW9ucywgaW50ZXJydXB0cyBldGMuLgorICovCitzdGF0aWMgaW50IF9faW5pdCB0dHlfaW5pdCh2b2lkKQoreworCWNkZXZfaW5pdCgmdHR5X2NkZXYsICZ0dHlfZm9wcyk7CisJaWYgKGNkZXZfYWRkKCZ0dHlfY2RldiwgTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgMSkgfHwKKwkgICAgcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihUVFlBVVhfTUFKT1IsIDApLCAxLCAiL2Rldi90dHkiKSA8IDApCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3R0eSBkcml2ZXJcbiIpOworCWRldmZzX21rX2NkZXYoTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgU19JRkNIUnxTX0lSVUdPfFNfSVdVR08sICJ0dHkiKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0dHlfY2xhc3MsIE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIE5VTEwsICJ0dHkiKTsKKworCWNkZXZfaW5pdCgmY29uc29sZV9jZGV2LCAmY29uc29sZV9mb3BzKTsKKwlpZiAoY2Rldl9hZGQoJmNvbnNvbGVfY2RldiwgTUtERVYoVFRZQVVYX01BSk9SLCAxKSwgMSkgfHwKKwkgICAgcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCAxLCAiL2Rldi9jb25zb2xlIikgPCAwKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgL2Rldi9jb25zb2xlIGRyaXZlclxuIik7CisJZGV2ZnNfbWtfY2RldihNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCBTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgImNvbnNvbGUiKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0dHlfY2xhc3MsIE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIE5VTEwsICJjb25zb2xlIik7CisKKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKKwljZGV2X2luaXQoJnB0bXhfY2RldiwgJnB0bXhfZm9wcyk7CisJaWYgKGNkZXZfYWRkKCZwdG14X2NkZXYsIE1LREVWKFRUWUFVWF9NQUpPUiwgMiksIDEpIHx8CisJICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgMSwgIi9kZXYvcHRteCIpIDwgMCkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvcHRteCBkcml2ZXJcbiIpOworCWRldmZzX21rX2NkZXYoTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgU19JRkNIUnxTX0lSVUdPfFNfSVdVR08sICJwdG14Iik7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodHR5X2NsYXNzLCBNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCBOVUxMLCAicHRteCIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVlQKKwljZGV2X2luaXQoJnZjMF9jZGV2LCAmY29uc29sZV9mb3BzKTsKKwlpZiAoY2Rldl9hZGQoJnZjMF9jZGV2LCBNS0RFVihUVFlfTUFKT1IsIDApLCAxKSB8fAorCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWV9NQUpPUiwgMCksIDEsICIvZGV2L3ZjLzAiKSA8IDApCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3R0eTAgZHJpdmVyXG4iKTsKKwlkZXZmc19ta19jZGV2KE1LREVWKFRUWV9NQUpPUiwgMCksIFNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLCAidmMvMCIpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHR0eV9jbGFzcywgTUtERVYoVFRZX01BSk9SLCAwKSwgTlVMTCwgInR0eTAiKTsKKworCXZ0eV9pbml0KCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHR0eV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU5Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCisgKgorICogTW9kaWZpZWQgYnkgRnJlZCBOLiB2YW4gS2VtcGVuLCAwMS8yOS85MywgdG8gYWRkIGxpbmUgZGlzY2lwbGluZXMKKyAqIHdoaWNoIGNhbiBiZSBkeW5hbWljYWxseSBhY3RpdmF0ZWQgYW5kIGRlLWFjdGl2YXRlZCBieSB0aGUgbGluZQorICogZGlzY2lwbGluZSBoYW5kbGluZyBtb2R1bGVzIChsaWtlIFNMSVApLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI3VuZGVmIFRUWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKKworI3VuZGVmCURFQlVHCisKKy8qCisgKiBJbnRlcm5hbCBmbGFnIG9wdGlvbnMgZm9yIHRlcm1pb3Mgc2V0dGluZyBiZWhhdmlvcgorICovCisjZGVmaW5lIFRFUk1JT1NfRkxVU0gJMQorI2RlZmluZSBURVJNSU9TX1dBSVQJMgorI2RlZmluZSBURVJNSU9TX1RFUk1JTwk0CisKK3ZvaWQgdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgbG9uZyB0aW1lb3V0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisjaWZkZWYgVFRZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCWNoYXIgYnVmWzY0XTsKKwkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgd2FpdCB1bnRpbCBzZW50Li4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZikpOworI2VuZGlmCisJaWYgKCF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKQorCQlyZXR1cm47CisJYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOworCWlmICghdGltZW91dCkKKwkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWRvIHsKKyNpZmRlZiBUVFlfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisJCXByaW50ayhLRVJOX0RFQlVHICJ3YWl0aW5nICVzLi4uKCVkKVxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCQkgICAgICAgdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKKyNlbmRpZgorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIHN0b3Bfd2FpdGluZzsKKwkJaWYgKCF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpCisJCQlicmVhazsKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJfSB3aGlsZSAodGltZW91dCk7CisJaWYgKHR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQpCisJCXR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQodHR5LCB0aW1lb3V0KTsKK3N0b3Bfd2FpdGluZzoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfd2FpdF91bnRpbF9zZW50KTsKKworc3RhdGljIHZvaWQgdW5zZXRfbG9ja2VkX3Rlcm1pb3Moc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCisJCQkJIHN0cnVjdCB0ZXJtaW9zICpvbGQsCisJCQkJIHN0cnVjdCB0ZXJtaW9zICpsb2NrZWQpCit7CisJaW50CWk7CisJCisjZGVmaW5lIE5PU0VUX01BU0soeCx5LHopICh4ID0gKCh4KSAmIH4oeikpIHwgKCh5KSAmICh6KSkpCisKKwlpZiAoIWxvY2tlZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nPyE/IHRlcm1pb3NfbG9ja2VkIGlzIE5VTEwuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCU5PU0VUX01BU0sodGVybWlvcy0+Y19pZmxhZywgb2xkLT5jX2lmbGFnLCBsb2NrZWQtPmNfaWZsYWcpOworCU5PU0VUX01BU0sodGVybWlvcy0+Y19vZmxhZywgb2xkLT5jX29mbGFnLCBsb2NrZWQtPmNfb2ZsYWcpOworCU5PU0VUX01BU0sodGVybWlvcy0+Y19jZmxhZywgb2xkLT5jX2NmbGFnLCBsb2NrZWQtPmNfY2ZsYWcpOworCU5PU0VUX01BU0sodGVybWlvcy0+Y19sZmxhZywgb2xkLT5jX2xmbGFnLCBsb2NrZWQtPmNfbGZsYWcpOworCXRlcm1pb3MtPmNfbGluZSA9IGxvY2tlZC0+Y19saW5lID8gb2xkLT5jX2xpbmUgOiB0ZXJtaW9zLT5jX2xpbmU7CisJZm9yIChpPTA7IGkgPCBOQ0NTOyBpKyspCisJCXRlcm1pb3MtPmNfY2NbaV0gPSBsb2NrZWQtPmNfY2NbaV0gPworCQkJb2xkLT5jX2NjW2ldIDogdGVybWlvcy0+Y19jY1tpXTsKK30KKworc3RhdGljIHZvaWQgY2hhbmdlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCB0ZXJtaW9zICogbmV3X3Rlcm1pb3MpCit7CisJaW50IGNhbm9uX2NoYW5nZTsKKwlzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJCisJLyoKKwkgKglQZXJmb3JtIHRoZSBhY3R1YWwgdGVybWlvcyBpbnRlcm5hbCBjaGFuZ2VzIHVuZGVyIGxvY2suCisJICovCisJIAorCisJLyogRklYTUU6IHdlIG5lZWQgdG8gZGVjaWRlIG9uIHNvbWUgbG9ja2luZy9vcmRlcmluZyBzZW1hbnRpY3MKKwkgICBmb3IgdGhlIHNldF90ZXJtaW9zIG5vdGlmaWNhdGlvbiBldmVudHVhbGx5ICovCisJZG93bigmdHR5LT50ZXJtaW9zX3NlbSk7CisKKwkqdHR5LT50ZXJtaW9zID0gKm5ld190ZXJtaW9zOworCXVuc2V0X2xvY2tlZF90ZXJtaW9zKHR0eS0+dGVybWlvcywgJm9sZF90ZXJtaW9zLCB0dHktPnRlcm1pb3NfbG9ja2VkKTsKKwljYW5vbl9jaGFuZ2UgPSAob2xkX3Rlcm1pb3MuY19sZmxhZyBeIHR0eS0+dGVybWlvcy0+Y19sZmxhZykgJiBJQ0FOT047CisJaWYgKGNhbm9uX2NoYW5nZSkgeworCQltZW1zZXQoJnR0eS0+cmVhZF9mbGFncywgMCwgc2l6ZW9mIHR0eS0+cmVhZF9mbGFncyk7CisJCXR0eS0+Y2Fub25faGVhZCA9IHR0eS0+cmVhZF90YWlsOworCQl0dHktPmNhbm9uX2RhdGEgPSAwOworCQl0dHktPmVyYXNpbmcgPSAwOworCX0KKwkKKwkKKwlpZiAoY2Fub25fY2hhbmdlICYmICFMX0lDQU5PTih0dHkpICYmIHR0eS0+cmVhZF9jbnQpCisJCS8qIEdldCBjaGFyYWN0ZXJzIGxlZnQgb3ZlciBmcm9tIGNhbm9uaWNhbCBtb2RlLiAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKKworCS8qIFNlZSBpZiBwYWNrZXQgbW9kZSBjaGFuZ2Ugb2Ygc3RhdGUuICovCisKKwlpZiAodHR5LT5saW5rICYmIHR0eS0+bGluay0+cGFja2V0KSB7CisJCWludCBvbGRfZmxvdyA9ICgob2xkX3Rlcm1pb3MuY19pZmxhZyAmIElYT04pICYmCisJCQkJKG9sZF90ZXJtaW9zLmNfY2NbVlNUT1BdID09ICdcMDIzJykgJiYKKwkJCQkob2xkX3Rlcm1pb3MuY19jY1tWU1RBUlRdID09ICdcMDIxJykpOworCQlpbnQgbmV3X2Zsb3cgPSAoSV9JWE9OKHR0eSkgJiYKKwkJCQlTVE9QX0NIQVIodHR5KSA9PSAnXDAyMycgJiYKKwkJCQlTVEFSVF9DSEFSKHR0eSkgPT0gJ1wwMjEnKTsKKwkJaWYgKG9sZF9mbG93ICE9IG5ld19mbG93KSB7CisJCQl0dHktPmN0cmxfc3RhdHVzICY9IH4oVElPQ1BLVF9ET1NUT1AgfCBUSU9DUEtUX05PU1RPUCk7CisJCQlpZiAobmV3X2Zsb3cpCisJCQkJdHR5LT5jdHJsX3N0YXR1cyB8PSBUSU9DUEtUX0RPU1RPUDsKKwkJCWVsc2UKKwkJCQl0dHktPmN0cmxfc3RhdHVzIHw9IFRJT0NQS1RfTk9TVE9QOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPmxpbmstPnJlYWRfd2FpdCk7CisJCX0KKwl9CisJICAgCisJaWYgKHR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcykKKwkJKCp0dHktPmRyaXZlci0+c2V0X3Rlcm1pb3MpKHR0eSwgJm9sZF90ZXJtaW9zKTsKKworCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChsZCAhPSBOVUxMKSB7CisJCWlmIChsZC0+c2V0X3Rlcm1pb3MpCisJCQkobGQtPnNldF90ZXJtaW9zKSh0dHksICZvbGRfdGVybWlvcyk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorCXVwKCZ0dHktPnRlcm1pb3Nfc2VtKTsKK30KKworc3RhdGljIGludCBzZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgdm9pZCBfX3VzZXIgKmFyZywgaW50IG9wdCkKK3sKKwlzdHJ1Y3QgdGVybWlvcyB0bXBfdGVybWlvczsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlpbnQgcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChvcHQgJiBURVJNSU9TX1RFUk1JTykgeworCQltZW1jcHkoJnRtcF90ZXJtaW9zLCB0dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpOworCQlpZiAodXNlcl90ZXJtaW9fdG9fa2VybmVsX3Rlcm1pb3MoJnRtcF90ZXJtaW9zLAorCQkJCQkJKHN0cnVjdCB0ZXJtaW8gX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoJnRtcF90ZXJtaW9zLAorCQkJCQkJKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwkKKwlpZiAobGQgIT0gTlVMTCkgeworCQlpZiAoKG9wdCAmIFRFUk1JT1NfRkxVU0gpICYmIGxkLT5mbHVzaF9idWZmZXIpCisJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorCQorCWlmIChvcHQgJiBURVJNSU9TX1dBSVQpIHsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KKworCWNoYW5nZV90ZXJtaW9zKHR0eSwgJnRtcF90ZXJtaW9zKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdGVybWlvKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvIF9fdXNlciAqIHRlcm1pbykKK3sKKwlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0dHktPnRlcm1pb3MpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5xX2Nhbm9uKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCWludCBuciwgaGVhZCwgdGFpbDsKKworCWlmICghdHR5LT5jYW5vbl9kYXRhIHx8ICF0dHktPnJlYWRfYnVmKQorCQlyZXR1cm4gMDsKKwloZWFkID0gdHR5LT5jYW5vbl9oZWFkOworCXRhaWwgPSB0dHktPnJlYWRfdGFpbDsKKwluciA9IChoZWFkIC0gdGFpbCkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJLyogU2tpcCBFT0YtY2hhcnMuLiAqLworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJaWYgKHRlc3RfYml0KHRhaWwsIHR0eS0+cmVhZF9mbGFncykgJiYKKwkJICAgIHR0eS0+cmVhZF9idWZbdGFpbF0gPT0gX19ESVNBQkxFRF9DSEFSKQorCQkJbnItLTsKKwkJdGFpbCA9ICh0YWlsKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCX0KKwlyZXR1cm4gbnI7Cit9CisKKyNpZmRlZiBUSU9DR0VUUAorLyoKKyAqIFRoZXNlIGFyZSBkZXByZWNhdGVkLCBidXQgdGhlcmUgaXMgbGltaXRlZCBzdXBwb3J0Li4KKyAqCisgKiBUaGUgInNnX2ZsYWdzIiB0cmFuc2xhdGlvbiBpcyBhIGpva2UuLgorICovCitzdGF0aWMgaW50IGdldF9zZ2ZsYWdzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCWludCBmbGFncyA9IDA7CisKKwlpZiAoISh0dHktPnRlcm1pb3MtPmNfbGZsYWcgJiBJQ0FOT04pKSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfbGZsYWcgJiBJU0lHKQorCQkJZmxhZ3MgfD0gMHgwMjsJCS8qIGNicmVhayAqLworCQllbHNlCisJCQlmbGFncyB8PSAweDIwOwkJLyogcmF3ICovCisJfQorCWlmICh0dHktPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPKQorCQlmbGFncyB8PSAweDA4OwkJCS8qIGVjaG8gKi8KKwlpZiAodHR5LT50ZXJtaW9zLT5jX29mbGFnICYgT1BPU1QpCisJCWlmICh0dHktPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTkxDUikKKwkJCWZsYWdzIHw9IDB4MTA7CQkvKiBjcm1vZCAqLworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGludCBnZXRfc2d0dHliKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3Qgc2d0dHliIF9fdXNlciAqIHNndHR5YikKK3sKKwlzdHJ1Y3Qgc2d0dHliIHRtcDsKKworCWRvd24oJnR0eS0+dGVybWlvc19zZW0pOworCXRtcC5zZ19pc3BlZWQgPSAwOworCXRtcC5zZ19vc3BlZWQgPSAwOworCXRtcC5zZ19lcmFzZSA9IHR0eS0+dGVybWlvcy0+Y19jY1tWRVJBU0VdOworCXRtcC5zZ19raWxsID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZLSUxMXTsKKwl0bXAuc2dfZmxhZ3MgPSBnZXRfc2dmbGFncyh0dHkpOworCXVwKCZ0dHktPnRlcm1pb3Nfc2VtKTsKKwkKKwlyZXR1cm4gY29weV90b191c2VyKHNndHR5YiwgJnRtcCwgc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zZ2ZsYWdzKHN0cnVjdCB0ZXJtaW9zICogdGVybWlvcywgaW50IGZsYWdzKQoreworCXRlcm1pb3MtPmNfaWZsYWcgPSBJQ1JOTCB8IElYT047CisJdGVybWlvcy0+Y19vZmxhZyA9IDA7CisJdGVybWlvcy0+Y19sZmxhZyA9IElTSUcgfCBJQ0FOT047CisJaWYgKGZsYWdzICYgMHgwMikgewkvKiBjYnJlYWsgKi8KKwkJdGVybWlvcy0+Y19pZmxhZyA9IDA7CisJCXRlcm1pb3MtPmNfbGZsYWcgJj0gfklDQU5PTjsKKwl9CisJaWYgKGZsYWdzICYgMHgwOCkgewkJLyogZWNobyAqLworCQl0ZXJtaW9zLT5jX2xmbGFnIHw9IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwKKwkJCQkgICAgRUNIT0NUTCB8IEVDSE9LRSB8IElFWFRFTjsKKwl9CisJaWYgKGZsYWdzICYgMHgxMCkgewkJLyogY3Jtb2QgKi8KKwkJdGVybWlvcy0+Y19vZmxhZyB8PSBPUE9TVCB8IE9OTENSOworCX0KKwlpZiAoZmxhZ3MgJiAweDIwKSB7CS8qIHJhdyAqLworCQl0ZXJtaW9zLT5jX2lmbGFnID0gMDsKKwkJdGVybWlvcy0+Y19sZmxhZyAmPSB+KElTSUcgfCBJQ0FOT04pOworCX0KKwlpZiAoISh0ZXJtaW9zLT5jX2xmbGFnICYgSUNBTk9OKSkgeworCQl0ZXJtaW9zLT5jX2NjW1ZNSU5dID0gMTsKKwkJdGVybWlvcy0+Y19jY1tWVElNRV0gPSAwOworCX0KK30KKworc3RhdGljIGludCBzZXRfc2d0dHliKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3Qgc2d0dHliIF9fdXNlciAqIHNndHR5YikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzZ3R0eWIgdG1wOworCXN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CisKKwlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgc2d0dHliLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdHR5LT50ZXJtaW9zX3NlbSk7CQkKKwl0ZXJtaW9zID0gICp0dHktPnRlcm1pb3M7CisJdGVybWlvcy5jX2NjW1ZFUkFTRV0gPSB0bXAuc2dfZXJhc2U7CisJdGVybWlvcy5jX2NjW1ZLSUxMXSA9IHRtcC5zZ19raWxsOworCXNldF9zZ2ZsYWdzKCZ0ZXJtaW9zLCB0bXAuc2dfZmxhZ3MpOworCXVwKCZ0dHktPnRlcm1pb3Nfc2VtKTsKKwljaGFuZ2VfdGVybWlvcyh0dHksICZ0ZXJtaW9zKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgVElPQ0dFVEMKK3N0YXRpYyBpbnQgZ2V0X3RjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRjaGFycyBfX3VzZXIgKiB0Y2hhcnMpCit7CisJc3RydWN0IHRjaGFycyB0bXA7CisKKwl0bXAudF9pbnRyYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWSU5UUl07CisJdG1wLnRfcXVpdGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVlFVSVRdOworCXRtcC50X3N0YXJ0YyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWU1RBUlRdOworCXRtcC50X3N0b3BjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZTVE9QXTsKKwl0bXAudF9lb2ZjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZFT0ZdOworCXRtcC50X2Jya2MgPSB0dHktPnRlcm1pb3MtPmNfY2NbVkVPTDJdOwkvKiB3aGF0IGlzIGJya2MgYW55d2F5PyAqLworCXJldHVybiBjb3B5X3RvX3VzZXIodGNoYXJzLCAmdG1wLCBzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGludCBzZXRfdGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGNoYXJzIF9fdXNlciAqIHRjaGFycykKK3sKKwlzdHJ1Y3QgdGNoYXJzIHRtcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB0Y2hhcnMsIHNpemVvZih0bXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZJTlRSXSA9IHRtcC50X2ludHJjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWUVVJVF0gPSB0bXAudF9xdWl0YzsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVlNUQVJUXSA9IHRtcC50X3N0YXJ0YzsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVlNUT1BdID0gdG1wLnRfc3RvcGM7CisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZFT0ZdID0gdG1wLnRfZW9mYzsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVkVPTDJdID0gdG1wLnRfYnJrYzsJLyogd2hhdCBpcyBicmtjIGFueXdheT8gKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgVElPQ0dMVEMKK3N0YXRpYyBpbnQgZ2V0X2x0Y2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBsdGNoYXJzIF9fdXNlciAqIGx0Y2hhcnMpCit7CisJc3RydWN0IGx0Y2hhcnMgdG1wOworCisJdG1wLnRfc3VzcGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVlNVU1BdOworCXRtcC50X2RzdXNwYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWU1VTUF07CS8qIHdoYXQgaXMgZHN1c3BjIGFueXdheT8gKi8KKwl0bXAudF9ycHJudGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVlJFUFJJTlRdOworCXRtcC50X2ZsdXNoYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl07CS8qIHdoYXQgaXMgZmx1c2hjIGFueXdheT8gKi8KKwl0bXAudF93ZXJhc2MgPSB0dHktPnRlcm1pb3MtPmNfY2NbVldFUkFTRV07CisJdG1wLnRfbG5leHRjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZMTkVYVF07CisJcmV0dXJuIGNvcHlfdG9fdXNlcihsdGNoYXJzLCAmdG1wLCBzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGludCBzZXRfbHRjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGx0Y2hhcnMgX191c2VyICogbHRjaGFycykKK3sKKwlzdHJ1Y3QgbHRjaGFycyB0bXA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgbHRjaGFycywgc2l6ZW9mKHRtcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXR0eS0+dGVybWlvcy0+Y19jY1tWU1VTUF0gPSB0bXAudF9zdXNwYzsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVkVPTDJdID0gdG1wLnRfZHN1c3BjOwkvKiB3aGF0IGlzIGRzdXNwYyBhbnl3YXk/ICovCisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZSRVBSSU5UXSA9IHRtcC50X3Jwcm50YzsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVkVPTDJdID0gdG1wLnRfZmx1c2hjOwkvKiB3aGF0IGlzIGZsdXNoYyBhbnl3YXk/ICovCisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZXRVJBU0VdID0gdG1wLnRfd2VyYXNjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWTE5FWFRdID0gdG1wLnRfbG5leHRjOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBTZW5kIGEgaGlnaCBwcmlvcml0eSBjaGFyYWN0ZXIgdG8gdGhlIHR0eS4KKyAqLworc3RhdGljIHZvaWQgc2VuZF9wcmlvX2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlpbnQJd2FzX3N0b3BwZWQgPSB0dHktPnN0b3BwZWQ7CisKKwlpZiAodHR5LT5kcml2ZXItPnNlbmRfeGNoYXIpIHsKKwkJdHR5LT5kcml2ZXItPnNlbmRfeGNoYXIodHR5LCBjaCk7CisJCXJldHVybjsKKwl9CisJaWYgKHdhc19zdG9wcGVkKQorCQlzdGFydF90dHkodHR5KTsKKwl0dHktPmRyaXZlci0+d3JpdGUodHR5LCAmY2gsIDEpOworCWlmICh3YXNfc3RvcHBlZCkKKwkJc3RvcF90dHkodHR5KTsKK30KKworaW50IG5fdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHJlYWxfdHR5OworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXR2YWw7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCisJCXJlYWxfdHR5ID0gdHR5LT5saW5rOworCWVsc2UKKwkJcmVhbF90dHkgPSB0dHk7CisKKwlzd2l0Y2ggKGNtZCkgeworI2lmZGVmIFRJT0NHRVRQCisJCWNhc2UgVElPQ0dFVFA6CisJCQlyZXR1cm4gZ2V0X3NndHR5YihyZWFsX3R0eSwgKHN0cnVjdCBzZ3R0eWIgX191c2VyICopIGFyZyk7CisJCWNhc2UgVElPQ1NFVFA6CisJCWNhc2UgVElPQ1NFVE46CisJCQlyZXR1cm4gc2V0X3NndHR5YihyZWFsX3R0eSwgKHN0cnVjdCBzZ3R0eWIgX191c2VyICopIGFyZyk7CisjZW5kaWYKKyNpZmRlZiBUSU9DR0VUQworCQljYXNlIFRJT0NHRVRDOgorCQkJcmV0dXJuIGdldF90Y2hhcnMocmVhbF90dHksIHApOworCQljYXNlIFRJT0NTRVRDOgorCQkJcmV0dXJuIHNldF90Y2hhcnMocmVhbF90dHksIHApOworI2VuZGlmCisjaWZkZWYgVElPQ0dMVEMKKwkJY2FzZSBUSU9DR0xUQzoKKwkJCXJldHVybiBnZXRfbHRjaGFycyhyZWFsX3R0eSwgcCk7CisJCWNhc2UgVElPQ1NMVEM6CisJCQlyZXR1cm4gc2V0X2x0Y2hhcnMocmVhbF90dHksIHApOworI2VuZGlmCisJCWNhc2UgVENHRVRTOgorCQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUQ1NFVFNGOgorCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAgVEVSTUlPU19GTFVTSCB8IFRFUk1JT1NfV0FJVCk7CisJCWNhc2UgVENTRVRTVzoKKwkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19XQUlUKTsKKwkJY2FzZSBUQ1NFVFM6CisJCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIDApOworCQljYXNlIFRDR0VUQToKKwkJCXJldHVybiBnZXRfdGVybWlvKHJlYWxfdHR5LCBwKTsKKwkJY2FzZSBUQ1NFVEFGOgorCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX0ZMVVNIIHwgVEVSTUlPU19XQUlUIHwgVEVSTUlPU19URVJNSU8pOworCQljYXNlIFRDU0VUQVc6CisJCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfV0FJVCB8IFRFUk1JT1NfVEVSTUlPKTsKKwkJY2FzZSBUQ1NFVEE6CisJCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfVEVSTUlPKTsKKwkJY2FzZSBUQ1hPTkM6CisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlzd2l0Y2ggKGFyZykgeworCQkJY2FzZSBUQ09PRkY6CisJCQkJaWYgKCF0dHktPmZsb3dfc3RvcHBlZCkgeworCQkJCQl0dHktPmZsb3dfc3RvcHBlZCA9IDE7CisJCQkJCXN0b3BfdHR5KHR0eSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUQ09PTjoKKwkJCQlpZiAodHR5LT5mbG93X3N0b3BwZWQpIHsKKwkJCQkJdHR5LT5mbG93X3N0b3BwZWQgPSAwOworCQkJCQlzdGFydF90dHkodHR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRDSU9GRjoKKwkJCQlpZiAoU1RPUF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKQorCQkJCQlzZW5kX3ByaW9fY2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVENJT046CisJCQkJaWYgKFNUQVJUX0NIQVIodHR5KSAhPSBfX0RJU0FCTEVEX0NIQVIpCisJCQkJCXNlbmRfcHJpb19jaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUQ0ZMU0g6CisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQkJCisJCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwkJCXN3aXRjaCAoYXJnKSB7CisJCQljYXNlIFRDSUZMVVNIOgorCQkJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQorCQkJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRDSU9GTFVTSDoKKwkJCQlpZiAobGQtPmZsdXNoX2J1ZmZlcikKKwkJCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOworCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSBUQ09GTFVTSDoKKwkJCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwkJCXJldHVybiAwOworCQljYXNlIFRJT0NPVVRROgorCQkJcmV0dXJuIHB1dF91c2VyKHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIgPworCQkJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgOiAwLAorCQkJCQkoaW50IF9fdXNlciAqKSBhcmcpOworCQljYXNlIFRJT0NJTlE6CisJCQlyZXR2YWwgPSB0dHktPnJlYWRfY250OworCQkJaWYgKExfSUNBTk9OKHR0eSkpCisJCQkJcmV0dmFsID0gaW5xX2Nhbm9uKHR0eSk7CisJCQlyZXR1cm4gcHV0X3VzZXIocmV0dmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpOworCQljYXNlIFRJT0NHTENLVFJNSU9TOgorCQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvc19sb2NrZWQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUSU9DU0xDS1RSTUlPUzoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJaWYgKHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQsIChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKikgYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVElPQ1BLVDoKKwkJeworCQkJaW50IHBrdG1vZGU7CisKKwkJCWlmICh0dHktPmRyaXZlci0+dHlwZSAhPSBUVFlfRFJJVkVSX1RZUEVfUFRZIHx8CisJCQkgICAgdHR5LT5kcml2ZXItPnN1YnR5cGUgIT0gUFRZX1RZUEVfTUFTVEVSKQorCQkJCXJldHVybiAtRU5PVFRZOworCQkJaWYgKGdldF91c2VyKHBrdG1vZGUsIChpbnQgX191c2VyICopIGFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocGt0bW9kZSkgeworCQkJCWlmICghdHR5LT5wYWNrZXQpIHsKKwkJCQkJdHR5LT5wYWNrZXQgPSAxOworCQkJCQl0dHktPmxpbmstPmN0cmxfc3RhdHVzID0gMDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl0dHktPnBhY2tldCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFRJT0NHU09GVENBUjoKKwkJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsIChpbnQgX191c2VyICopYXJnKTsKKwkJY2FzZSBUSU9DU1NPRlRDQVI6CisJCQlpZiAoZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZG93bigmdHR5LT50ZXJtaW9zX3NlbSk7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCSAoYXJnID8gQ0xPQ0FMIDogMCkpOworCQkJdXAoJnR0eS0+dGVybWlvc19zZW0pOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9Cit9CisKK0VYUE9SVF9TWU1CT0wobl90dHlfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZjX3NjcmVlbi5jIGIvZHJpdmVycy9jaGFyL3ZjX3NjcmVlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmU0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMKQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMKKyAqCisgKiBQcm92aWRlIGFjY2VzcyB0byB2aXJ0dWFsIGNvbnNvbGUgbWVtb3J5LgorICogL2Rldi92Y3MwOiB0aGUgc2NyZWVuIGFzIGl0IGlzIGJlaW5nIHZpZXdlZCByaWdodCBub3cgKHBvc3NpYmx5IHNjcm9sbGVkKQorICogL2Rldi92Y3NOOiB0aGUgc2NyZWVuIG9mIC9kZXYvdHR5TiAoMSA8PSBOIDw9IDYzKQorICogICAgICAgICAgICBbbWlub3I6IE5dCisgKgorICogL2Rldi92Y3NhTjogaWRlbSwgYnV0IGluY2x1ZGluZyBhdHRyaWJ1dGVzLCBhbmQgcHJlZml4ZWQgd2l0aAorICoJdGhlIDQgYnl0ZXMgbGluZXMsY29sdW1ucyx4LHkgKGFzIHNjcmVlbmR1bXAgdXNlZCB0byBnaXZlKS4KKyAqCUF0dHJpYnV0ZS9jaGFyYWN0ZXIgcGFpciBpcyBpbiBuYXRpdmUgZW5kaWFuaXR5LgorICogICAgICAgICAgICBbbWlub3I6IE4rMTI4XQorICoKKyAqIFRoaXMgcmVwbGFjZXMgc2NyZWVuZHVtcCBhbmQgcGFydCBvZiBzZWxlY3Rpb24sIHNvIHRoYXQgdGhlIHN5c3RlbQorICogYWRtaW5pc3RyYXRvciBjYW4gY29udHJvbCBhY2Nlc3MgdXNpbmcgZmlsZSBzeXN0ZW0gcGVybWlzc2lvbnMuCisgKgorICogYWViQGN3aS5ubCAtIGVmdGVyIEZyaWVkYXMgYmVncmF2ZWxzZSAtIDk1MDIxMQorICoKKyAqIG1hY2hla0BrMzMyLmZlbGQuY3Z1dC5jeiAtIG1vZGlmaWVkIG5vdCB0byBzZW5kIGNoYXJhY3RlcnMgdG8gd3JvbmcgY29uc29sZQorICoJIC0gZml4ZWQgc29tZSBmYXRhbCBvZmYtYnktb25lIGJ1Z3MgKDAtLSBubyBsb25nZXIgPT0gLTEgLT4gbG9vcGluZyBhbmQgbG9vcGluZyBhbmQgbG9vcGluZy4uLikKKyAqCSAtIG1ha2luZyBpdCBzaG9ydGVyIC0gc2NyX3JlYWR3IGFyZSBtYWNyb3Mgd2hpY2ggZXhwYW5kIGluIFBSRVRUWSBsb25nIGNvZGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjdW5kZWYgYXR0cgorI3VuZGVmIG9yZworI3VuZGVmIGFkZHIKKyNkZWZpbmUgSEVBREVSX1NJWkUJNAorCitzdGF0aWMgaW50Cit2Y3Nfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBzaXplOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IGN1cnJjb25zID0gbWlub3IgJiAxMjc7CisJc3RydWN0IHZjX2RhdGEgKnZjOworCisJaWYgKGN1cnJjb25zID09IDApCisJCWN1cnJjb25zID0gZmdfY29uc29sZTsKKwllbHNlCisJCWN1cnJjb25zLS07CisJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChjdXJyY29ucykpCisJCXJldHVybiAtRU5YSU87CisJdmMgPSB2Y19jb25zW2N1cnJjb25zXS5kOworCisJc2l6ZSA9IHZjLT52Y19yb3dzICogdmMtPnZjX2NvbHM7CisKKwlpZiAobWlub3IgJiAxMjgpCisJCXNpemUgPSAyKnNpemUgKyBIRUFERVJfU0laRTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGxvZmZfdCB2Y3NfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworCWludCBzaXplOworCisJZG93bigmY29uX2J1Zl9zZW0pOworCXNpemUgPSB2Y3Nfc2l6ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3dpdGNoIChvcmlnKSB7CisJCWRlZmF1bHQ6CisJCQl1cCgmY29uX2J1Zl9zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgMjoKKwkJCW9mZnNldCArPSBzaXplOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJfQorCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNpemUpIHsKKwkJdXAoJmNvbl9idWZfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCXVwKCZjb25fYnVmX3NlbSk7CisJcmV0dXJuIGZpbGUtPmZfcG9zOworfQorCisKK3N0YXRpYyBzc2l6ZV90Cit2Y3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXVuc2lnbmVkIGludCBjdXJyY29ucyA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHZjX2RhdGEgKnZjOworCWxvbmcgcG9zOworCWxvbmcgdmlld2VkLCBhdHRyLCByZWFkOworCWludCBjb2wsIG1heGNvbDsKKwl1bnNpZ25lZCBzaG9ydCAqb3JnID0gTlVMTDsKKwlzc2l6ZV90IHJldDsKKworCWRvd24oJmNvbl9idWZfc2VtKTsKKworCXBvcyA9ICpwcG9zOworCisJLyogU2VsZWN0IHRoZSBwcm9wZXIgY3VycmVudCBjb25zb2xlIGFuZCB2ZXJpZnkKKwkgKiBzYW5pdHkgb2YgdGhlIHNpdHVhdGlvbiB1bmRlciB0aGUgY29uc29sZSBsb2NrLgorCSAqLworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKworCWF0dHIgPSAoY3VycmNvbnMgJiAxMjgpOworCWN1cnJjb25zID0gKGN1cnJjb25zICYgMTI3KTsKKwlpZiAoY3VycmNvbnMgPT0gMCkgeworCQljdXJyY29ucyA9IGZnX2NvbnNvbGU7CisJCXZpZXdlZCA9IDE7CisJfSBlbHNlIHsKKwkJY3VycmNvbnMtLTsKKwkJdmlld2VkID0gMDsKKwl9CisJcmV0ID0gLUVOWElPOworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoY3VycmNvbnMpKQorCQlnb3RvIHVubG9ja19vdXQ7CisJdmMgPSB2Y19jb25zW2N1cnJjb25zXS5kOworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAocG9zIDwgMCkKKwkJZ290byB1bmxvY2tfb3V0OworCXJlYWQgPSAwOworCXJldCA9IDA7CisJd2hpbGUgKGNvdW50KSB7CisJCWNoYXIgKmNvbl9idWYwLCAqY29uX2J1Zl9zdGFydDsKKwkJbG9uZyB0aGlzX3JvdW5kLCBzaXplOworCQlzc2l6ZV90IG9yaWdfY291bnQ7CisJCWxvbmcgcCA9IHBvczsKKworCQkvKiBDaGVjayB3aGV0aGVyIHdlIGFyZSBhYm92ZSBzaXplIGVhY2ggcm91bmQsCisJCSAqIGFzIGNvcHlfdG9fdXNlciBhdCB0aGUgZW5kIG9mIHRoaXMgbG9vcAorCQkgKiBjb3VsZCBzbGVlcC4KKwkJICovCisJCXNpemUgPSB2Y3Nfc2l6ZShpbm9kZSk7CisJCWlmIChwb3MgPj0gc2l6ZSkKKwkJCWJyZWFrOworCQlpZiAoY291bnQgPiBzaXplIC0gcG9zKQorCQkJY291bnQgPSBzaXplIC0gcG9zOworCisJCXRoaXNfcm91bmQgPSBjb3VudDsKKwkJaWYgKHRoaXNfcm91bmQgPiBDT05fQlVGX1NJWkUpCisJCQl0aGlzX3JvdW5kID0gQ09OX0JVRl9TSVpFOworCisJCS8qIFBlcmZvcm0gdGhlIHdob2xlIHJlYWQgaW50byB0aGUgbG9jYWwgY29uX2J1Zi4KKwkJICogVGhlbiB3ZSBjYW4gZHJvcCB0aGUgY29uc29sZSBzcGlubG9jayBhbmQgc2FmZWx5CisJCSAqIGF0dGVtcHQgdG8gbW92ZSBpdCB0byB1c2Vyc3BhY2UuCisJCSAqLworCisJCWNvbl9idWZfc3RhcnQgPSBjb25fYnVmMCA9IGNvbl9idWY7CisJCW9yaWdfY291bnQgPSB0aGlzX3JvdW5kOworCQltYXhjb2wgPSB2Yy0+dmNfY29sczsKKwkJaWYgKCFhdHRyKSB7CisJCQlvcmcgPSBzY3JlZW5fcG9zKHZjLCBwLCB2aWV3ZWQpOworCQkJY29sID0gcCAlIG1heGNvbDsKKwkJCXAgKz0gbWF4Y29sIC0gY29sOworCQkJd2hpbGUgKHRoaXNfcm91bmQtLSA+IDApIHsKKwkJCQkqY29uX2J1ZjArKyA9ICh2Y3Nfc2NyX3JlYWR3KHZjLCBvcmcrKykgJiAweGZmKTsKKwkJCQlpZiAoKytjb2wgPT0gbWF4Y29sKSB7CisJCQkJCW9yZyA9IHNjcmVlbl9wb3ModmMsIHAsIHZpZXdlZCk7CisJCQkJCWNvbCA9IDA7CisJCQkJCXAgKz0gbWF4Y29sOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwIDwgSEVBREVSX1NJWkUpIHsKKwkJCQlzaXplX3QgdG1wX2NvdW50OworCisJCQkJY29uX2J1ZjBbMF0gPSAoY2hhcil2Yy0+dmNfcm93czsKKwkJCQljb25fYnVmMFsxXSA9IChjaGFyKXZjLT52Y19jb2xzOworCQkJCWdldGNvbnN4eSh2YywgY29uX2J1ZjAgKyAyKTsKKworCQkJCWNvbl9idWZfc3RhcnQgKz0gcDsKKwkJCQl0aGlzX3JvdW5kICs9IHA7CisJCQkJaWYgKHRoaXNfcm91bmQgPiBDT05fQlVGX1NJWkUpIHsKKwkJCQkJdGhpc19yb3VuZCA9IENPTl9CVUZfU0laRTsKKwkJCQkJb3JpZ19jb3VudCA9IHRoaXNfcm91bmQgLSBwOworCQkJCX0KKworCQkJCXRtcF9jb3VudCA9IEhFQURFUl9TSVpFOworCQkJCWlmICh0bXBfY291bnQgPiB0aGlzX3JvdW5kKQorCQkJCQl0bXBfY291bnQgPSB0aGlzX3JvdW5kOworCisJCQkJLyogQWR2YW5jZSBzdGF0ZSBwb2ludGVycyBhbmQgbW92ZSBvbi4gKi8KKwkJCQl0aGlzX3JvdW5kIC09IHRtcF9jb3VudDsKKwkJCQlwID0gSEVBREVSX1NJWkU7CisJCQkJY29uX2J1ZjAgPSBjb25fYnVmICsgSEVBREVSX1NJWkU7CisJCQkJLyogSWYgdGhpc19yb3VuZCA+PSAwLCB0aGVuIHAgaXMgZXZlbi4uLiAqLworCQkJfSBlbHNlIGlmIChwICYgMSkgeworCQkJCS8qIFNraXAgZmlyc3QgYnl0ZSBmb3Igb3V0cHV0IGlmIHN0YXJ0IGFkZHJlc3MgaXMgb2RkCisJCQkJICogVXBkYXRlIHJlZ2lvbiBzaXplcyB1cC9kb3duIGRlcGVuZGluZyBvbiBmcmVlCisJCQkJICogc3BhY2UgaW4gYnVmZmVyLgorCQkJCSAqLworCQkJCWNvbl9idWZfc3RhcnQrKzsKKwkJCQlpZiAodGhpc19yb3VuZCA8IENPTl9CVUZfU0laRSkKKwkJCQkJdGhpc19yb3VuZCsrOworCQkJCWVsc2UKKwkJCQkJb3JpZ19jb3VudC0tOworCQkJfQorCQkJaWYgKHRoaXNfcm91bmQgPiAwKSB7CisJCQkJdW5zaWduZWQgc2hvcnQgKnRtcF9idWYgPSAodW5zaWduZWQgc2hvcnQgKiljb25fYnVmMDsKKworCQkJCXAgLT0gSEVBREVSX1NJWkU7CisJCQkJcCAvPSAyOworCQkJCWNvbCA9IHAgJSBtYXhjb2w7CisKKwkJCQlvcmcgPSBzY3JlZW5fcG9zKHZjLCBwLCB2aWV3ZWQpOworCQkJCXAgKz0gbWF4Y29sIC0gY29sOworCisJCQkJLyogQnVmZmVyIGhhcyBldmVuIGxlbmd0aCwgc28gd2UgY2FuIGFsd2F5cyBjb3B5CisJCQkJICogY2hhcmFjdGVyICsgYXR0cmlidXRlLiBXZSBkbyBub3QgY29weSBsYXN0IGJ5dGUKKwkJCQkgKiB0byB1c2Vyc3BhY2UgaWYgdGhpc19yb3VuZCBpcyBvZGQuCisJCQkJICovCisJCQkJdGhpc19yb3VuZCA9ICh0aGlzX3JvdW5kICsgMSkgPj4gMTsKKworCQkJCXdoaWxlICh0aGlzX3JvdW5kKSB7CisJCQkJCSp0bXBfYnVmKysgPSB2Y3Nfc2NyX3JlYWR3KHZjLCBvcmcrKyk7CisJCQkJCXRoaXNfcm91bmQgLS07CisJCQkJCWlmICgrK2NvbCA9PSBtYXhjb2wpIHsKKwkJCQkJCW9yZyA9IHNjcmVlbl9wb3ModmMsIHAsIHZpZXdlZCk7CisJCQkJCQljb2wgPSAwOworCQkJCQkJcCArPSBtYXhjb2w7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBGaW5hbGx5LCByZWxlYXNlIHRoZSBjb25zb2xlIHNlbWFwaG9yZSB3aGlsZSB3ZSBwdXNoCisJCSAqIGFsbCB0aGUgZGF0YSB0byB1c2Vyc3BhY2UgZnJvbSBvdXIgdGVtcG9yYXJ5IGJ1ZmZlci4KKwkJICoKKwkJICogQUtQTTogRXZlbiB0aG91Z2ggaXQncyBhIHNlbWFwaG9yZSwgd2Ugc2hvdWxkIGRyb3AgaXQgYmVjYXVzZQorCQkgKiB0aGUgcGFnZWZhdWx0IGhhbmRsaW5nIGNvZGUgbWF5IHdhbnQgdG8gY2FsbCBwcmludGsoKS4KKwkJICovCisKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLCBjb25fYnVmX3N0YXJ0LCBvcmlnX2NvdW50KTsKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJCWlmIChyZXQpIHsKKwkJCXJlYWQgKz0gKG9yaWdfY291bnQgLSByZXQpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZiArPSBvcmlnX2NvdW50OworCQlwb3MgKz0gb3JpZ19jb3VudDsKKwkJcmVhZCArPSBvcmlnX2NvdW50OworCQljb3VudCAtPSBvcmlnX2NvdW50OworCX0KKwkqcHBvcyArPSByZWFkOworCWlmIChyZWFkKQorCQlyZXQgPSByZWFkOwordW5sb2NrX291dDoKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJdXAoJmNvbl9idWZfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAordmNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgaW50IGN1cnJjb25zID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisJbG9uZyBwb3M7CisJbG9uZyB2aWV3ZWQsIGF0dHIsIHNpemUsIHdyaXR0ZW47CisJY2hhciAqY29uX2J1ZjA7CisJaW50IGNvbCwgbWF4Y29sOworCXUxNiAqb3JnMCA9IE5VTEwsICpvcmcgPSBOVUxMOworCXNpemVfdCByZXQ7CisKKwlkb3duKCZjb25fYnVmX3NlbSk7CisKKwlwb3MgPSAqcHBvczsKKworCS8qIFNlbGVjdCB0aGUgcHJvcGVyIGN1cnJlbnQgY29uc29sZSBhbmQgdmVyaWZ5CisJICogc2FuaXR5IG9mIHRoZSBzaXR1YXRpb24gdW5kZXIgdGhlIGNvbnNvbGUgbG9jay4KKwkgKi8KKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwlhdHRyID0gKGN1cnJjb25zICYgMTI4KTsKKwljdXJyY29ucyA9IChjdXJyY29ucyAmIDEyNyk7CisKKwlpZiAoY3VycmNvbnMgPT0gMCkgeworCQljdXJyY29ucyA9IGZnX2NvbnNvbGU7CisJCXZpZXdlZCA9IDE7CisJfSBlbHNlIHsKKwkJY3VycmNvbnMtLTsKKwkJdmlld2VkID0gMDsKKwl9CisJcmV0ID0gLUVOWElPOworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoY3VycmNvbnMpKQorCQlnb3RvIHVubG9ja19vdXQ7CisJdmMgPSB2Y19jb25zW2N1cnJjb25zXS5kOworCisJc2l6ZSA9IHZjc19zaXplKGlub2RlKTsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChwb3MgPCAwIHx8IHBvcyA+IHNpemUpCisJCWdvdG8gdW5sb2NrX291dDsKKwlpZiAoY291bnQgPiBzaXplIC0gcG9zKQorCQljb3VudCA9IHNpemUgLSBwb3M7CisJd3JpdHRlbiA9IDA7CisJd2hpbGUgKGNvdW50KSB7CisJCWxvbmcgdGhpc19yb3VuZCA9IGNvdW50OworCQlzaXplX3Qgb3JpZ19jb3VudDsKKwkJbG9uZyBwOworCisJCWlmICh0aGlzX3JvdW5kID4gQ09OX0JVRl9TSVpFKQorCQkJdGhpc19yb3VuZCA9IENPTl9CVUZfU0laRTsKKworCQkvKiBUZW1wb3JhcmlseSBkcm9wIHRoZSBjb25zb2xlIGxvY2sgc28gdGhhdCB3ZSBjYW4gcmVhZAorCQkgKiBpbiB0aGUgd3JpdGUgZGF0YSBmcm9tIHVzZXJzcGFjZSBzYWZlbHkuCisJCSAqLworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCXJldCA9IGNvcHlfZnJvbV91c2VyKGNvbl9idWYsIGJ1ZiwgdGhpc19yb3VuZCk7CisJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKworCQlpZiAocmV0KSB7CisJCQl0aGlzX3JvdW5kIC09IHJldDsKKwkJCWlmICghdGhpc19yb3VuZCkgeworCQkJCS8qIEFib3J0IGxvb3AgaWYgbm8gZGF0YSB3ZXJlIGNvcGllZC4gT3RoZXJ3aXNlCisJCQkJICogZmFpbCB3aXRoIC1FRkFVTFQuCisJCQkJICovCisJCQkJaWYgKHdyaXR0ZW4pCisJCQkJCWJyZWFrOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byB1bmxvY2tfb3V0OworCQkJfQorCQl9CisKKwkJLyogVGhlIHZjc19zaXplIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGlsZSB3ZSBzbGVwdCB0byBncmFiCisJCSAqIHRoZSB1c2VyIGJ1ZmZlciwgc28gcmVjaGVjay4KKwkJICogUmV0dXJuIGRhdGEgd3JpdHRlbiB1cCB0byBub3cgb24gZmFpbHVyZS4KKwkJICovCisJCXNpemUgPSB2Y3Nfc2l6ZShpbm9kZSk7CisJCWlmIChwb3MgPj0gc2l6ZSkKKwkJCWJyZWFrOworCQlpZiAodGhpc19yb3VuZCA+IHNpemUgLSBwb3MpCisJCQl0aGlzX3JvdW5kID0gc2l6ZSAtIHBvczsKKworCQkvKiBPSywgbm93IGFjdHVhbGx5IHB1c2ggdGhlIHdyaXRlIHRvIHRoZSBjb25zb2xlCisJCSAqIHVuZGVyIHRoZSBsb2NrIHVzaW5nIHRoZSBsb2NhbCBrZXJuZWwgYnVmZmVyLgorCQkgKi8KKworCQljb25fYnVmMCA9IGNvbl9idWY7CisJCW9yaWdfY291bnQgPSB0aGlzX3JvdW5kOworCQltYXhjb2wgPSB2Yy0+dmNfY29sczsKKwkJcCA9IHBvczsKKwkJaWYgKCFhdHRyKSB7CisJCQlvcmcwID0gb3JnID0gc2NyZWVuX3Bvcyh2YywgcCwgdmlld2VkKTsKKwkJCWNvbCA9IHAgJSBtYXhjb2w7CisJCQlwICs9IG1heGNvbCAtIGNvbDsKKworCQkJd2hpbGUgKHRoaXNfcm91bmQgPiAwKSB7CisJCQkJdW5zaWduZWQgY2hhciBjID0gKmNvbl9idWYwKys7CisKKwkJCQl0aGlzX3JvdW5kLS07CisJCQkJdmNzX3Njcl93cml0ZXcodmMsCisJCQkJCSAgICAgICAodmNzX3Njcl9yZWFkdyh2Yywgb3JnKSAmIDB4ZmYwMCkgfCBjLCBvcmcpOworCQkJCW9yZysrOworCQkJCWlmICgrK2NvbCA9PSBtYXhjb2wpIHsKKwkJCQkJb3JnID0gc2NyZWVuX3Bvcyh2YywgcCwgdmlld2VkKTsKKwkJCQkJY29sID0gMDsKKwkJCQkJcCArPSBtYXhjb2w7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHAgPCBIRUFERVJfU0laRSkgeworCQkJCWNoYXIgaGVhZGVyW0hFQURFUl9TSVpFXTsKKworCQkJCWdldGNvbnN4eSh2YywgaGVhZGVyICsgMik7CisJCQkJd2hpbGUgKHAgPCBIRUFERVJfU0laRSAmJiB0aGlzX3JvdW5kID4gMCkgeworCQkJCQl0aGlzX3JvdW5kLS07CisJCQkJCWhlYWRlcltwKytdID0gKmNvbl9idWYwKys7CisJCQkJfQorCQkJCWlmICghdmlld2VkKQorCQkJCQlwdXRjb25zeHkodmMsIGhlYWRlciArIDIpOworCQkJfQorCQkJcCAtPSBIRUFERVJfU0laRTsKKwkJCWNvbCA9IChwLzIpICUgbWF4Y29sOworCQkJaWYgKHRoaXNfcm91bmQgPiAwKSB7CisJCQkJb3JnMCA9IG9yZyA9IHNjcmVlbl9wb3ModmMsIHAvMiwgdmlld2VkKTsKKwkJCQlpZiAoKHAgJiAxKSAmJiB0aGlzX3JvdW5kID4gMCkgeworCQkJCQljaGFyIGM7CisKKwkJCQkJdGhpc19yb3VuZC0tOworCQkJCQljID0gKmNvbl9idWYwKys7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkJCXZjc19zY3Jfd3JpdGV3KHZjLCBjIHwKKwkJCQkJICAgICAodmNzX3Njcl9yZWFkdyh2Yywgb3JnKSAmIDB4ZmYwMCksIG9yZyk7CisjZWxzZQorCQkJCQl2Y3Nfc2NyX3dyaXRldyh2YywgKGMgPDwgOCkgfAorCQkJCQkgICAgICh2Y3Nfc2NyX3JlYWR3KHZjLCBvcmcpICYgMHhmZiksIG9yZyk7CisjZW5kaWYKKwkJCQkJb3JnKys7CisJCQkJCXArKzsKKwkJCQkJaWYgKCsrY29sID09IG1heGNvbCkgeworCQkJCQkJb3JnID0gc2NyZWVuX3Bvcyh2YywgcC8yLCB2aWV3ZWQpOworCQkJCQkJY29sID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlwIC89IDI7CisJCQkJcCArPSBtYXhjb2wgLSBjb2w7CisJCQl9CisJCQl3aGlsZSAodGhpc19yb3VuZCA+IDEpIHsKKwkJCQl1bnNpZ25lZCBzaG9ydCB3OworCisJCQkJdyA9IGdldF91bmFsaWduZWQoKChjb25zdCB1bnNpZ25lZCBzaG9ydCAqKWNvbl9idWYwKSk7CisJCQkJdmNzX3Njcl93cml0ZXcodmMsIHcsIG9yZysrKTsKKwkJCQljb25fYnVmMCArPSAyOworCQkJCXRoaXNfcm91bmQgLT0gMjsKKwkJCQlpZiAoKytjb2wgPT0gbWF4Y29sKSB7CisJCQkJCW9yZyA9IHNjcmVlbl9wb3ModmMsIHAsIHZpZXdlZCk7CisJCQkJCWNvbCA9IDA7CisJCQkJCXAgKz0gbWF4Y29sOworCQkJCX0KKwkJCX0KKwkJCWlmICh0aGlzX3JvdW5kID4gMCkgeworCQkJCXVuc2lnbmVkIGNoYXIgYzsKKworCQkJCWMgPSAqY29uX2J1ZjArKzsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQl2Y3Nfc2NyX3dyaXRldyh2YywgKHZjc19zY3JfcmVhZHcodmMsIG9yZykgJiAweGZmKSB8IChjIDw8IDgpLCBvcmcpOworI2Vsc2UKKwkJCQl2Y3Nfc2NyX3dyaXRldyh2YywgKHZjc19zY3JfcmVhZHcodmMsIG9yZykgJiAweGZmMDApIHwgYywgb3JnKTsKKyNlbmRpZgorCQkJfQorCQl9CisJCWNvdW50IC09IG9yaWdfY291bnQ7CisJCXdyaXR0ZW4gKz0gb3JpZ19jb3VudDsKKwkJYnVmICs9IG9yaWdfY291bnQ7CisJCXBvcyArPSBvcmlnX2NvdW50OworCQlpZiAob3JnMCkKKwkJCXVwZGF0ZV9yZWdpb24odmMsICh1bnNpZ25lZCBsb25nKShvcmcwKSwgb3JnIC0gb3JnMCk7CisJfQorCSpwcG9zICs9IHdyaXR0ZW47CisJcmV0ID0gd3JpdHRlbjsKKwordW5sb2NrX291dDoKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwl1cCgmY29uX2J1Zl9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordmNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJdW5zaWduZWQgaW50IGN1cnJjb25zID0gaW1pbm9yKGlub2RlKSAmIDEyNzsKKwlpZihjdXJyY29ucyAmJiAhdmNfY29uc19hbGxvY2F0ZWQoY3VycmNvbnMtMSkpCisJCXJldHVybiAtRU5YSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZjc19mb3BzID0geworCS5sbHNlZWsJCT0gdmNzX2xzZWVrLAorCS5yZWFkCQk9IHZjc19yZWFkLAorCS53cml0ZQkJPSB2Y3Nfd3JpdGUsCisJLm9wZW4JCT0gdmNzX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqdmNfY2xhc3M7CisKK3ZvaWQgdmNzX21ha2VfZGV2ZnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlkZXZmc19ta19jZGV2KE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEpLAorCQkJU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsCisJCQkidmNjLyV1IiwgdHR5LT5pbmRleCArIDEpOworCWRldmZzX21rX2NkZXYoTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMTI5KSwKKwkJCVNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLAorCQkJInZjYy9hJXUiLCB0dHktPmluZGV4ICsgMSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodmNfY2xhc3MsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEpLCBOVUxMLCAidmNzJXUiLCB0dHktPmluZGV4ICsgMSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodmNfY2xhc3MsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSksIE5VTEwsICJ2Y3NhJXUiLCB0dHktPmluZGV4ICsgMSk7Cit9Cit2b2lkIHZjc19yZW1vdmVfZGV2ZnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlkZXZmc19yZW1vdmUoInZjYy8ldSIsIHR0eS0+aW5kZXggKyAxKTsKKwlkZXZmc19yZW1vdmUoInZjYy9hJXUiLCB0dHktPmluZGV4ICsgMSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSkpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSkpOworfQorCitpbnQgX19pbml0IHZjc19pbml0KHZvaWQpCit7CisJaWYgKHJlZ2lzdGVyX2NocmRldihWQ1NfTUFKT1IsICJ2Y3MiLCAmdmNzX2ZvcHMpKQorCQlwYW5pYygidW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgdmNzIGRldmljZSIsIFZDU19NQUpPUik7CisJdmNfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAidmMiKTsKKworCWRldmZzX21rX2NkZXYoTUtERVYoVkNTX01BSk9SLCAwKSwgU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsICJ2Y2MvMCIpOworCWRldmZzX21rX2NkZXYoTUtERVYoVkNTX01BSk9SLCAxMjgpLCBTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgInZjYy9hMCIpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHZjX2NsYXNzLCBNS0RFVihWQ1NfTUFKT1IsIDApLCBOVUxMLCAidmNzIik7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodmNfY2xhc3MsIE1LREVWKFZDU19NQUpPUiwgMTI4KSwgTlVMTCwgInZjc2EiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92aW9jb25zLmMgYi9kcml2ZXJzL2NoYXIvdmlvY29ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjVmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdmlvY29ucy5jCkBAIC0wLDAgKzEsMTE5NSBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKgorICogIGRyaXZlcnMvY2hhci92aW9jb25zLmMKKyAqCisgKiAgaVNlcmllcyBWaXJ0dWFsIFRlcm1pbmFsCisgKgorICogIEF1dGhvcnM6IERhdmUgQm91dGNoZXIgPGJvdXRjaGVyQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgUnlhbiBBcm5vbGQgPHJ5YW5hcm5AdXMuaWJtLmNvbT4KKyAqICAgICAgICAgICBDb2xpbiBEZXZpbGJpc3MgPGRldmlsYmlzQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgU3RlcGhlbiBSb3Rod2VsbCA8c2ZyQGF1MS5pYm0uY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnl1IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKworI2luY2x1ZGUgPGFzbS9pU2VyaWVzL3Zpby5oPgorCisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZMcEV2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZDYWxsRXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwQ29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZDYWxsLmg+CisKKyNpZmRlZiBDT05GSUdfVlQKKyNlcnJvciBZb3UgbXVzdCB0dXJuIG9mZiBDT05GSUdfVlQgdG8gdXNlIENPTkZJR19WSU9DT05TCisjZW5kaWYKKworI2RlZmluZSBWSU9UVFlfTUFHSUMgKDB4MERDQikKKyNkZWZpbmUgVlRUWV9QT1JUUyAxMAorCisjZGVmaW5lIFZJT0NPTlNfS0VSTl9XQVJOCUtFUk5fV0FSTklORyAidmlvY29uczogIgorI2RlZmluZSBWSU9DT05TX0tFUk5fSU5GTwlLRVJOX0lORk8gInZpb2NvbnM6ICIKKworc3RhdGljIERFRklORV9TUElOTE9DSyhjb25zb2xlbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbnNvbGVsb2dsb2NrKTsKKworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorc3RhdGljIGludCB2aW9fc3lzcnFfcHJlc3NlZDsKK2V4dGVybiBpbnQgc3lzcnFfZW5hYmxlZDsKKyNlbmRpZgorCisvKgorICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgZXZlbnRzIHRoYXQgZmxvdyBiZXR3ZWVuIHVzIGFuZCBPUy80MDAuICBZb3UgY2FuJ3QKKyAqIG1lc3Mgd2l0aCB0aGlzIHVubGVzcyB0aGUgT1MvNDAwIHNpZGUgY2hhbmdlcyB0b28KKyAqLworc3RydWN0IHZpb2NoYXJscGV2ZW50IHsKKwlzdHJ1Y3QgSHZMcEV2ZW50IGV2ZW50OworCXUzMiByZXNlcnZlZDsKKwl1MTYgdmVyc2lvbjsKKwl1MTYgc3VidHlwZV9yZXN1bHRfY29kZTsKKwl1OCB2aXJ0dWFsX2RldmljZTsKKwl1OCBsZW47CisJdTggZGF0YVtWSU9DSEFSX01BWF9EQVRBXTsKK307CisKKyNkZWZpbmUgVklPQ0hBUl9XSU5ET1cJCTEwCisjZGVmaW5lIFZJT0NIQVJfSElHSFdBVEVSTUFSSwkzCisKK2VudW0gdmlvY2hhcnN1YnR5cGUgeworCXZpb2NoYXJvcGVuID0gMHgwMDAxLAorCXZpb2NoYXJjbG9zZSA9IDB4MDAwMiwKKwl2aW9jaGFyZGF0YSA9IDB4MDAwMywKKwl2aW9jaGFyYWNrID0gMHgwMDA0LAorCXZpb2NoYXJjb25maWcgPSAweDAwMDUKK307CisKK2VudW0gdmlvY2hhcl9yYyB7CisJdmlvY2hhcl9yY19lYnVzeSA9IDEKK307CisKKyNkZWZpbmUgVklPQ0hBUl9OVU1fQlVGCQkxNgorCisvKgorICogT3VyIHBvcnQgaW5mb3JtYXRpb24uICBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gb25lIGVudHJ5IGluIHRoZQorICogdHR5X2RyaXZlcl9kYXRhCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG9ydF9pbmZvIHsKKwlpbnQgbWFnaWM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlIdkxwSW5kZXggbHA7CisJdTggdmNvbnM7CisJdTY0IHNlcTsJLyogc2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgSFYgc2VuZCAqLworCXU2NCBhY2s7CS8qIGxhc3QgYWNrIGZyb20gSFYgKi8KKy8qCisgKiBXaGVuIHdlIGdldCB3cml0ZXMgZmFzdGVyIHRoYW4gd2UgY2FuIHNlbmQgaXQgdG8gdGhlIHBhcnRpdGlvbiwKKyAqIGJ1ZmZlciB0aGUgZGF0YSBoZXJlLiBOb3RlIHRoYXQgdXNlZCBpcyBhIGJpdCBtYXAgb2YgdXNlZCBidWZmZXJzLgorICogSXQgaGFkIGJldHRlciBoYXZlIGVub3VnaCBiaXRzIHRvIGhvbGQgVklPQ0hBUl9OVU1fQlVGIHRoZSBiaXRvcHMgYXNzdW1lCisgKiBpdCBpcyBhIG11bHRpcGxlIG9mIHVuc2lnbmVkIGxvbmcKKyAqLworCXVuc2lnbmVkIGxvbmcgdXNlZDsKKwl1OCAqYnVmZmVyW1ZJT0NIQVJfTlVNX0JVRl07CisJaW50IGJ1ZmZlckJ5dGVzW1ZJT0NIQVJfTlVNX0JVRl07CisJaW50IGN1cmJ1ZjsKKwlpbnQgYnVmZmVyT3ZlcmZsb3c7CisJaW50IG92ZXJmbG93TWVzc2FnZTsKK30gcG9ydF9pbmZvW1ZUVFlfUE9SVFNdOworCisjZGVmaW5lIHZpb2NoYXJfaXNfY29uc29sZShwaSkJKChwaSkgPT0gJnBvcnRfaW5mb1swXSkKKyNkZWZpbmUgdmlvY2hhcl9wb3J0KHBpKQkoKHBpKSAtICZwb3J0X2luZm9bMF0pCisKK3N0YXRpYyB2b2lkIGluaXREYXRhRXZlbnQoc3RydWN0IHZpb2NoYXJscGV2ZW50ICp2aW9jaGFyLCBIdkxwSW5kZXggbHApOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnZpb3R0eV9kcml2ZXI7CisKK3ZvaWQgaHZsb2coY2hhciAqZm10LCAuLi4pCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2YV9saXN0IGFyZ3M7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc29sZWxvZ2xvY2ssIGZsYWdzKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWkgPSB2c2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlidWZbaSsrXSA9ICdccic7CisJSHZDYWxsX3dyaXRlTG9nQnVmZmVyKGJ1ZiwgaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvZ2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBodmxvZ091dHB1dChjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBiZWdpbjsKKwlpbnQgaW5kZXg7CisJc3RhdGljIGNvbnN0IGNoYXIgY3IgPSAnXHInOworCisJYmVnaW4gPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9nbG9jaywgZmxhZ3MpOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisJCWlmIChidWZbaW5kZXhdID09ICdcbicpIHsKKwkJCS8qCisJCQkgKiBTdGFydCByaWdodCBhZnRlciB0aGUgbGFzdCAnXG4nIG9yIGF0IHRoZSB6ZXJvdGgKKwkJCSAqIGFycmF5IHBvc2l0aW9uIGFuZCBvdXRwdXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisJCQkgKiBpbmNsdWRpbmcgdGhlIG5ld2xpbmUuCisJCQkgKi8KKwkJCUh2Q2FsbF93cml0ZUxvZ0J1ZmZlcigmYnVmW2JlZ2luXSwgaW5kZXggLSBiZWdpbiArIDEpOworCQkJYmVnaW4gPSBpbmRleCArIDE7CisJCQlIdkNhbGxfd3JpdGVMb2dCdWZmZXIoJmNyLCAxKTsKKwkJfQorCX0KKwlpZiAoKGluZGV4IC0gYmVnaW4pID4gMCkKKwkJSHZDYWxsX3dyaXRlTG9nQnVmZmVyKCZidWZbYmVnaW5dLCBpbmRleCAtIGJlZ2luKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9nbG9jaywgZmxhZ3MpOworfQorCisvKgorICogTWFrZSBzdXJlIHdlJ3JlIHBvaW50aW5nIHRvIGEgdmFsaWQgcG9ydF9pbmZvIHN0cnVjdHVyZS4gIFNoYW1lbGVzc2x5CisgKiBwbGFnZXJpemVkIGZyb20gc2VyaWFsLmMKKyAqLworc3RhdGljIGlubGluZSBpbnQgdmlvdHR5X3BhcmFub2lhX2NoZWNrKHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRfcGlfYWRkciA9IFZJT0NPTlNfS0VSTl9XQVJOCisJCSJ3YXJuaW5nOiBiYWQgYWRkcmVzcyBmb3IgcG9ydF9pbmZvIHN0cnVjdCAoJXMpIGluICVzXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9IFZJT0NPTlNfS0VSTl9XQVJOCisJCSJ3YXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBwb3J0X2luZm8gc3RydWN0ICglcykgaW4gJXNcbiI7CisKKwlpZiAoKHBpIDwgJnBvcnRfaW5mb1swXSkgfHwgKHZpb2NoYXJfcG9ydChwaSkgPiBWVFRZX1BPUlRTKSkgeworCQlwcmludGsoYmFkX3BpX2FkZHIsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBpLT5tYWdpYyAhPSBWSU9UVFlfTUFHSUMpIHsKKwkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQWRkIGRhdGEgdG8gb3VyIHBlbmRpbmctc2VuZCBidWZmZXJzLiAgCisgKgorICogTk9URTogRG9uJ3QgdXNlIHByaW50ayBpbiBoZXJlIGJlY2F1c2UgaXQgZ2V0cyBuYXN0aWx5IHJlY3Vyc2l2ZS4KKyAqIGh2bG9nIGNhbiBiZSB1c2VkIHRvIGxvZyB0byB0aGUgaHlwZXJ2aXNvciBidWZmZXIKKyAqLworc3RhdGljIGludCBidWZmZXJfYWRkKHN0cnVjdCBwb3J0X2luZm8gKnBpLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGJsZWZ0OworCXNpemVfdCBjdXJsZW47CisJY29uc3QgY2hhciAqY3VyYnVmOworCWludCBuZXh0YnVmOworCisJY3VyYnVmID0gYnVmOworCWJsZWZ0ID0gbGVuOworCXdoaWxlIChibGVmdCA+IDApIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgbm8gc3BhY2UgbGVmdCBpbiB0aGUgY3VycmVudCBidWZmZXIsIHdlIGhhdmUKKwkJICogZmlsbGVkIGV2ZXJ5dGhpbmcgdXAsIHNvIHJldHVybi4gIElmIHdlIGZpbGxlZCB0aGUgcHJldmlvdXMKKwkJICogYnVmZmVyIHdlIHdvdWxkIGFscmVhZHkgaGF2ZSBtb3ZlZCB0byB0aGUgbmV4dCBvbmUuCisJCSAqLworCQlpZiAocGktPmJ1ZmZlckJ5dGVzW3BpLT5jdXJidWZdID09IFZJT0NIQVJfTUFYX0RBVEEpIHsKKwkJCWh2bG9nICgiXG5ccnZpb2NvbnM6IE5vIG92ZXJmbG93IGJ1ZmZlciBhdmFpbGFibGUgZm9yIG1lbWNweSgpLlxuIik7CisJCQlwaS0+YnVmZmVyT3ZlcmZsb3crKzsKKwkJCXBpLT5vdmVyZmxvd01lc3NhZ2UgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBUdXJuIG9uIHRoZSAidXNlZCIgYml0IGZvciB0aGlzIGJ1ZmZlci4gIElmIGl0J3MgYWxyZWFkeSBvbiwKKwkJICogdGhhdCdzIGZpbmUuCisJCSAqLworCQlzZXRfYml0KHBpLT5jdXJidWYsICZwaS0+dXNlZCk7CisKKwkJLyoKKwkJICogU2VlIGlmIHRoaXMgYnVmZmVyIGhhcyBiZWVuIGFsbG9jYXRlZC4gIElmIG5vdCwgYWxsb2NhdGUgaXQuCisJCSAqLworCQlpZiAocGktPmJ1ZmZlcltwaS0+Y3VyYnVmXSA9PSBOVUxMKSB7CisJCQlwaS0+YnVmZmVyW3BpLT5jdXJidWZdID0KKwkJCSAgICBrbWFsbG9jKFZJT0NIQVJfTUFYX0RBVEEsIEdGUF9BVE9NSUMpOworCQkJaWYgKHBpLT5idWZmZXJbcGktPmN1cmJ1Zl0gPT0gTlVMTCkgeworCQkJCWh2bG9nKCJcblxydmlvY29uczoga21hbGxvYyBmYWlsZWQgYWxsb2NhdGluZyBzcGFjZXMgZm9yIGJ1ZmZlciAlZC4iLAorCQkJCQlwaS0+Y3VyYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgY2FuIGNvcHkgaW50byB0aGlzIGJ1ZmZlci4gKi8KKwkJaWYgKGJsZWZ0IDwgKFZJT0NIQVJfTUFYX0RBVEEgLSBwaS0+YnVmZmVyQnl0ZXNbcGktPmN1cmJ1Zl0pKQorCQkJY3VybGVuID0gYmxlZnQ7CisJCWVsc2UKKwkJCWN1cmxlbiA9IFZJT0NIQVJfTUFYX0RBVEEgLSBwaS0+YnVmZmVyQnl0ZXNbcGktPmN1cmJ1Zl07CisKKwkJLyogQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIuICovCisJCW1lbWNweShwaS0+YnVmZmVyW3BpLT5jdXJidWZdICsgcGktPmJ1ZmZlckJ5dGVzW3BpLT5jdXJidWZdLAorCQkJCWN1cmJ1ZiwgY3VybGVuKTsKKworCQlwaS0+YnVmZmVyQnl0ZXNbcGktPmN1cmJ1Zl0gKz0gY3VybGVuOworCQljdXJidWYgKz0gY3VybGVuOworCQlibGVmdCAtPSBjdXJsZW47CisKKwkJLyoKKwkJICogTm93IHNlZSBpZiB3ZSd2ZSBmaWxsZWQgdGhpcyBidWZmZXIuICBJZiBub3QgdGhlbgorCQkgKiB3ZSdsbCB0cnkgdG8gdXNlIGl0IGFnYWluIGxhdGVyLiAgSWYgd2UndmUgZmlsbGVkIGl0CisJCSAqIHVwIHRoZW4gd2UnbGwgYWR2YW5jZSB0aGUgY3VyYnVmIHRvIHRoZSBuZXh0IGluIHRoZQorCQkgKiBjaXJjdWxhciBxdWV1ZS4KKwkJICovCisJCWlmIChwaS0+YnVmZmVyQnl0ZXNbcGktPmN1cmJ1Zl0gPT0gVklPQ0hBUl9NQVhfREFUQSkgeworCQkJbmV4dGJ1ZiA9IChwaS0+Y3VyYnVmICsgMSkgJSBWSU9DSEFSX05VTV9CVUY7CisJCQkvKgorCQkJICogTW92ZSB0byB0aGUgbmV4dCBidWZmZXIgaWYgaXQgaGFzbid0IGJlZW4gdXNlZCB5ZXQKKwkJCSAqLworCQkJaWYgKHRlc3RfYml0KG5leHRidWYsICZwaS0+dXNlZCkgPT0gMCkKKwkJCQlwaS0+Y3VyYnVmID0gbmV4dGJ1ZjsKKwkJfQorCX0KKwlyZXR1cm4gbGVuIC0gYmxlZnQ7Cit9CisKKy8qCisgKiBTZW5kIHBlbmRpbmcgZGF0YQorICoKKyAqIE5PVEU6IERvbid0IHVzZSBwcmludGsgaW4gaGVyZSBiZWNhdXNlIGl0IGdldHMgbmFzdGlseSByZWN1cnNpdmUuCisgKiBodmxvZyBjYW4gYmUgdXNlZCB0byBsb2cgdG8gdGhlIGh5cGVydmlzb3IgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfYnVmZmVycyhzdHJ1Y3QgcG9ydF9pbmZvICpwaSkKK3sKKwlIdkxwRXZlbnRfUmMgaHZyYzsKKwlpbnQgbmV4dGJ1ZjsKKwlzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKnZpb2NoYXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJdmlvY2hhciA9IChzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKikKKwkgICAgdmlvX2dldF9ldmVudF9idWZmZXIodmlvbWFqb3JzdWJ0eXBlX2NoYXJpbyk7CisKKwkvKiBNYWtlIHN1cmUgd2UgZ290IGEgYnVmZmVyICovCisJaWYgKHZpb2NoYXIgPT0gTlVMTCkgeworCQlodmxvZygiXG5ccnZpb2NvbnM6IENhbid0IGdldCB2aW9jaGFyIGJ1ZmZlciBpbiBzZW5kQnVmZmVycygpLiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBpLT51c2VkID09IDApIHsKKwkJaHZsb2coIlxuXHJ2aW9jb25zOiBpbiBzZW5kYnVmZmVycygpLCBidXQgbm8gYnVmZmVycyB1c2VkLlxuIik7CisJCXZpb19mcmVlX2V2ZW50X2J1ZmZlcih2aW9tYWpvcnN1YnR5cGVfY2hhcmlvLCB2aW9jaGFyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogY3VyYnVmIHBvaW50cyB0byB0aGUgYnVmZmVyIHdlJ3JlIGZpbGxpbmcuICBXZSB3YW50IHRvCisJICogc3RhcnQgc2VuZGluZyBBRlRFUiB0aGlzIG9uZS4gIAorCSAqLworCW5leHRidWYgPSAocGktPmN1cmJ1ZiArIDEpICUgVklPQ0hBUl9OVU1fQlVGOworCisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGZpbmQgYSBidWZmZXIgd2l0aCB0aGUgdXNlZCBiaXQgb24KKwkgKi8KKwl3aGlsZSAodGVzdF9iaXQobmV4dGJ1ZiwgJnBpLT51c2VkKSA9PSAwKQorCQluZXh0YnVmID0gKG5leHRidWYgKyAxKSAlIFZJT0NIQVJfTlVNX0JVRjsKKworCWluaXREYXRhRXZlbnQodmlvY2hhciwgcGktPmxwKTsKKworCS8qCisJICogV2hpbGUgd2UgaGF2ZSBidWZmZXJzIHdpdGggZGF0YSwgYW5kIG91ciBzZW5kIHdpbmRvdworCSAqIGlzIG9wZW4sIHNlbmQgdGhlbQorCSAqLworCXdoaWxlICgodGVzdF9iaXQobmV4dGJ1ZiwgJnBpLT51c2VkKSkgJiYKKwkgICAgICAgKChwaS0+c2VxIC0gcGktPmFjaykgPCBWSU9DSEFSX1dJTkRPVykpIHsKKwkJdmlvY2hhci0+bGVuID0gcGktPmJ1ZmZlckJ5dGVzW25leHRidWZdOworCQl2aW9jaGFyLT5ldmVudC54Q29ycmVsYXRpb25Ub2tlbiA9IHBpLT5zZXErKzsKKwkJdmlvY2hhci0+ZXZlbnQueFNpemVNaW51czEgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHZpb2NoYXJscGV2ZW50LCBkYXRhKSArIHZpb2NoYXItPmxlbjsKKworCQltZW1jcHkodmlvY2hhci0+ZGF0YSwgcGktPmJ1ZmZlcltuZXh0YnVmXSwgdmlvY2hhci0+bGVuKTsKKworCQlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudCgmdmlvY2hhci0+ZXZlbnQpOworCQlpZiAoaHZyYykgeworCQkJLyoKKwkJCSAqIE1VU1QgdW5sb2NrIHRoZSBzcGlubG9jayBiZWZvcmUgZG9pbmcgYSBwcmludGsKKwkJCSAqLworCQkJdmlvX2ZyZWVfZXZlbnRfYnVmZmVyKHZpb21ham9yc3VidHlwZV9jaGFyaW8sIHZpb2NoYXIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKworCQkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOCisJCQkgICAgICAgImVycm9yIHNlbmRpbmcgZXZlbnQhIHJldHVybiBjb2RlICVkXG4iLAorCQkJICAgICAgIChpbnQpaHZyYyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBjbGVhciB0aGUgdXNlZCBiaXQsIHplcm8gdGhlIG51bWJlciBvZiBieXRlcyBpbgorCQkgKiB0aGlzIGJ1ZmZlciwgYW5kIG1vdmUgdG8gdGhlIG5leHQgYnVmZmVyCisJCSAqLworCQljbGVhcl9iaXQobmV4dGJ1ZiwgJnBpLT51c2VkKTsKKwkJcGktPmJ1ZmZlckJ5dGVzW25leHRidWZdID0gMDsKKwkJbmV4dGJ1ZiA9IChuZXh0YnVmICsgMSkgJSBWSU9DSEFSX05VTV9CVUY7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGVtcHRpZWQgYWxsIHRoZSBidWZmZXJzLCBzdGFydCBhdCAwIGFnYWluLgorCSAqIHRoaXMgd2lsbCByZS11c2UgYW55IGFsbG9jYXRlZCBidWZmZXJzCisJICovCisJaWYgKHBpLT51c2VkID09IDApIHsKKwkJcGktPmN1cmJ1ZiA9IDA7CisKKwkJaWYgKHBpLT5vdmVyZmxvd01lc3NhZ2UpCisJCQlwaS0+b3ZlcmZsb3dNZXNzYWdlID0gMDsKKworCQlpZiAocGktPnR0eSkgeworCQkJdHR5X3dha2V1cChwaS0+dHR5KTsKKwkJfQorCX0KKworCXZpb19mcmVlX2V2ZW50X2J1ZmZlcih2aW9tYWpvcnN1YnR5cGVfY2hhcmlvLCB2aW9jaGFyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworfQorCisvKgorICogT3VyIGludGVybmFsIHdyaXRlci4gIEdldHMgY2FsbGVkIGJvdGggZnJvbSB0aGUgY29uc29sZSBkZXZpY2UgYW5kCisgKiB0aGUgdHR5IGRldmljZS4gIHRoZSB0dHkgcG9pbnRlciB3aWxsIGJlIE5VTEwgaWYgY2FsbGVkIGZyb20gdGhlIGNvbnNvbGUuCisgKiBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzICJ3cml0dGVuIi4KKyAqCisgKiBOT1RFOiBEb24ndCB1c2UgcHJpbnRrIGluIGhlcmUgYmVjYXVzZSBpdCBnZXRzIG5hc3RpbHkgcmVjdXJzaXZlLiAgaHZsb2cKKyAqIGNhbiBiZSB1c2VkIHRvIGxvZyB0byB0aGUgaHlwZXJ2aXNvciBidWZmZXIKKyAqLworc3RhdGljIGludCBpbnRlcm5hbF93cml0ZShzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCUh2THBFdmVudF9SYyBodnJjOworCXNpemVfdCBibGVmdDsKKwlzaXplX3QgY3VybGVuOworCWNvbnN0IGNoYXIgKmN1cmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqdmlvY2hhcjsKKworCS8qCisJICogV3JpdGUgdG8gdGhlIGh2bG9nIG9mIGluYm91bmQgZGF0YSBhcmUgbm93IGRvbmUgcHJpb3IgdG8KKwkgKiBjYWxsaW5nIGludGVybmFsX3dyaXRlKCkgc2luY2UgaW50ZXJuYWxfd3JpdGUoKSBpcyBvbmx5IGNhbGxlZCBpbgorCSAqIHRoZSBldmVudCB0aGF0IGFuIGxwIGV2ZW50IHBhdGggaXMgYWN0aXZlLCB3aGljaCBpc24ndCB0aGUgY2FzZSBmb3IKKwkgKiBsb2dnaW5nIGF0dGVtcHRzIHByaW9yIHRvIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24uCisJICoKKwkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGRhdGEgcXVldWVkIGZvciB0aGlzIHBvcnQsIHNlbmQgaXQgcHJpb3IgdG8KKwkgKiBhdHRlbXB0aW5nIHRvIHNlbmQgYW55IG5ldyBkYXRhLgorCSAqLworCWlmIChwaS0+dXNlZCkKKwkJc2VuZF9idWZmZXJzKHBpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJdmlvY2hhciA9IHZpb19nZXRfZXZlbnRfYnVmZmVyKHZpb21ham9yc3VidHlwZV9jaGFyaW8pOworCWlmICh2aW9jaGFyID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJaHZsb2coIlxuXHJ2aW9jb25zOiBDYW4ndCBnZXQgdmlvIGJ1ZmZlciBpbiBpbnRlcm5hbF93cml0ZSgpLiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaW5pdERhdGFFdmVudCh2aW9jaGFyLCBwaS0+bHApOworCisJY3VyYnVmID0gYnVmOworCWJsZWZ0ID0gbGVuOworCisJd2hpbGUgKChibGVmdCA+IDApICYmIChwaS0+dXNlZCA9PSAwKSAmJgorCSAgICAgICAoKHBpLT5zZXEgLSBwaS0+YWNrKSA8IFZJT0NIQVJfV0lORE9XKSkgeworCQlpZiAoYmxlZnQgPiBWSU9DSEFSX01BWF9EQVRBKQorCQkJY3VybGVuID0gVklPQ0hBUl9NQVhfREFUQTsKKwkJZWxzZQorCQkJY3VybGVuID0gYmxlZnQ7CisKKwkJdmlvY2hhci0+ZXZlbnQueENvcnJlbGF0aW9uVG9rZW4gPSBwaS0+c2VxKys7CisJCW1lbWNweSh2aW9jaGFyLT5kYXRhLCBjdXJidWYsIGN1cmxlbik7CisJCXZpb2NoYXItPmxlbiA9IGN1cmxlbjsKKwkJdmlvY2hhci0+ZXZlbnQueFNpemVNaW51czEgPQorCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHZpb2NoYXJscGV2ZW50LCBkYXRhKSArIGN1cmxlbjsKKworCQlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudCgmdmlvY2hhci0+ZXZlbnQpOworCQlpZiAoaHZyYykgeworCQkJaHZsb2coInZpb2NvbnM6IGVycm9yIHNlbmRpbmcgZXZlbnQhICVkXG4iLCAoaW50KWh2cmMpOworCQkJZ290byBvdXQ7CisJCX0KKwkJY3VyYnVmICs9IGN1cmxlbjsKKwkJYmxlZnQgLT0gY3VybGVuOworCX0KKworCS8qIElmIHdlIGRpZG4ndCBzZW5kIGl0IGFsbCwgYnVmZmVyIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLiAqLworCWlmIChibGVmdCA+IDApCisJCWJsZWZ0IC09IGJ1ZmZlcl9hZGQocGksIGN1cmJ1ZiwgYmxlZnQpOworb3V0OgorCXZpb19mcmVlX2V2ZW50X2J1ZmZlcih2aW9tYWpvcnN1YnR5cGVfY2hhcmlvLCB2aW9jaGFyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCXJldHVybiBsZW4gLSBibGVmdDsKK30KKworc3RhdGljIHN0cnVjdCBwb3J0X2luZm8gKmdldF9wb3J0X2RhdGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJaWYgKHR0eSkgeworCQlwaSA9IChzdHJ1Y3QgcG9ydF9pbmZvICopdHR5LT5kcml2ZXJfZGF0YTsKKwkJaWYgKCFwaSB8fCB2aW90dHlfcGFyYW5vaWFfY2hlY2socGksIHR0eS0+bmFtZSwKKwkJCQkJICAgICAiZ2V0X3BvcnRfZGF0YSIpKSB7CisJCQlwaSA9IE5VTEw7CisJCX0KKwl9IGVsc2UKKwkJLyoKKwkJICogSWYgdGhpcyBpcyB0aGUgY29uc29sZSBkZXZpY2UsIHVzZSB0aGUgbHAgZnJvbQorCQkgKiB0aGUgZmlyc3QgcG9ydCBlbnRyeQorCQkgKi8KKwkJcGkgPSAmcG9ydF9pbmZvWzBdOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJcmV0dXJuIHBpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29tbW9uIGZpZWxkcyBpbiBhIGNoYXJMcEV2ZW50CisgKi8KK3N0YXRpYyB2b2lkIGluaXREYXRhRXZlbnQoc3RydWN0IHZpb2NoYXJscGV2ZW50ICp2aW9jaGFyLCBIdkxwSW5kZXggbHApCit7CisJbWVtc2V0KHZpb2NoYXIsIDAsIHNpemVvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQpKTsKKworCXZpb2NoYXItPmV2ZW50LnhGbGFncy54VmFsaWQgPSAxOworCXZpb2NoYXItPmV2ZW50LnhGbGFncy54RnVuY3Rpb24gPSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50OworCXZpb2NoYXItPmV2ZW50LnhGbGFncy54QWNrSW5kID0gSHZMcEV2ZW50X0Fja0luZF9Ob0FjazsKKwl2aW9jaGFyLT5ldmVudC54RmxhZ3MueEFja1R5cGUgPSBIdkxwRXZlbnRfQWNrVHlwZV9EZWZlcnJlZEFjazsKKwl2aW9jaGFyLT5ldmVudC54VHlwZSA9IEh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbzsKKwl2aW9jaGFyLT5ldmVudC54U3VidHlwZSA9IHZpb21ham9yc3VidHlwZV9jaGFyaW8gfCB2aW9jaGFyZGF0YTsKKwl2aW9jaGFyLT5ldmVudC54U291cmNlTHAgPSBIdkxwQ29uZmlnX2dldExwSW5kZXgoKTsKKwl2aW9jaGFyLT5ldmVudC54VGFyZ2V0THAgPSBscDsKKwl2aW9jaGFyLT5ldmVudC54U2l6ZU1pbnVzMSA9IHNpemVvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQpOworCXZpb2NoYXItPmV2ZW50LnhTb3VyY2VJbnN0YW5jZUlkID0gdmlvcGF0aF9zb3VyY2VpbnN0KGxwKTsKKwl2aW9jaGFyLT5ldmVudC54VGFyZ2V0SW5zdGFuY2VJZCA9IHZpb3BhdGhfdGFyZ2V0aW5zdChscCk7Cit9CisKKy8qCisgKiBlYXJseSBjb25zb2xlIGRldmljZSB3cml0ZQorICovCitzdGF0aWMgdm9pZCB2aW9jb25zX3dyaXRlX2Vhcmx5KHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY291bnQpCit7CisJaHZsb2dPdXRwdXQocywgY291bnQpOworfQorCisvKgorICogY29uc29sZSBkZXZpY2Ugd3JpdGUKKyAqLworc3RhdGljIHZvaWQgdmlvY29uc193cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGNvdW50KQoreworCWludCBpbmRleDsKKwlpbnQgYmVnaW47CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisKKwlzdGF0aWMgY29uc3QgY2hhciBjciA9ICdccic7CisKKwkvKgorCSAqIENoZWNrIHBvcnQgZGF0YSBmaXJzdCBiZWNhdXNlIHRoZSB0YXJnZXQgTFAgbWlnaHQgYmUgdmFsaWQgYnV0CisJICogc2ltcGx5IG5vdCBhY3RpdmUsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBodmxvZyB0aGUgb3V0cHV0LgorCSAqLworCXBpID0gZ2V0X3BvcnRfZGF0YShOVUxMKTsKKwlpZiAocGkgPT0gTlVMTCkgeworCQlodmxvZygiXG5ccnZpb2NvbnNfd3JpdGU6IHVuYWJsZSB0byBnZXQgcG9ydCBkYXRhLiIpOworCQlyZXR1cm47CisJfQorCisJaHZsb2dPdXRwdXQocywgY291bnQpOworCisJaWYgKCF2aW9wYXRoX2lzYWN0aXZlKHBpLT5scCkpCisJCXJldHVybjsKKworCS8qIAorCSAqIEFueSBuZXdsaW5lIGNoYXJhY3RlciBmb3VuZCB3aWxsIGNhdXNlIGEKKwkgKiBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVyIHRvIGJlIGVtaXR0ZWQgYXMgd2VsbC4gCisJICovCisJYmVnaW4gPSAwOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisJCWlmIChzW2luZGV4XSA9PSAnXG4nKSB7CisJCQkvKiAKKwkJCSAqIE5ld2xpbmUgZm91bmQuIFByaW50IGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIAorCQkJICogaW5jbHVkaW5nIHRoZSBuZXdsaW5lCisJCQkgKi8KKwkJCWludGVybmFsX3dyaXRlKHBpLCAmc1tiZWdpbl0sIGluZGV4IC0gYmVnaW4gKyAxKTsKKwkJCWJlZ2luID0gaW5kZXggKyAxOworCQkJLyogRW1pdCBhIGNhcnJpYWdlIHJldHVybiBhcyB3ZWxsICovCisJCQlpbnRlcm5hbF93cml0ZShwaSwgJmNyLCAxKTsKKwkJfQorCX0KKworCS8qIElmIGFueSBjaGFyYWN0ZXJzIGxlZnQgdG8gd3JpdGUsIHdyaXRlIHRoZW0gbm93ICovCisJaWYgKChpbmRleCAtIGJlZ2luKSA+IDApCisJCWludGVybmFsX3dyaXRlKHBpLCAmc1tiZWdpbl0sIGluZGV4IC0gYmVnaW4pOworfQorCisvKgorICogV29yayBvdXQgdGhlIGRldmljZSBhc3NvY2lhdGUgd2l0aCB0aGlzIGNvbnNvbGUKKyAqLworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICp2aW9jb25zX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwkqaW5kZXggPSBjLT5pbmRleDsKKwlyZXR1cm4gdmlvdHR5X2RyaXZlcjsKK30KKworLyoKKyAqIGNvbnNvbGUgZGV2aWNlIEkvTyBtZXRob2RzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSB2aW9jb25zX2Vhcmx5ID0geworCS5uYW1lID0gInZpb2NvbnMiLAorCS53cml0ZSA9IHZpb2NvbnNfd3JpdGVfZWFybHksCisJLmZsYWdzID0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleCA9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHZpb2NvbnMgPSB7CisJLm5hbWUgPSAidmlvY29ucyIsCisJLndyaXRlID0gdmlvY29uc193cml0ZSwKKwkuZGV2aWNlID0gdmlvY29uc19kZXZpY2UsCisJLmZsYWdzID0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleCA9IC0xLAorfTsKKworLyoKKyAqIFRUWSBPcGVuIG1ldGhvZAorICovCitzdGF0aWMgaW50IHZpb3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisKKwlwb3J0ID0gdHR5LT5pbmRleDsKKworCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID49IFZUVFlfUE9SVFMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJcGkgPSAmcG9ydF9pbmZvW3BvcnRdOworCS8qIElmIHNvbWUgb3RoZXIgVFRZIGlzIGFscmVhZHkgY29ubmVjdGVkIGhlcmUsIHJlamVjdCB0aGUgb3BlbiAqLworCWlmICgocGktPnR0eSkgJiYgKHBpLT50dHkgIT0gdHR5KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJICAgICAgICJhdHRlbXB0IHRvIG9wZW4gZGV2aWNlIHR3aWNlIGZyb20gZGlmZmVyZW50IHR0eXNcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwl0dHktPmRyaXZlcl9kYXRhID0gcGk7CisJcGktPnR0eSA9IHR0eTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUVFkgQ2xvc2UgbWV0aG9kCisgKi8KK3N0YXRpYyB2b2lkIHZpb3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJcGkgPSAoc3RydWN0IHBvcnRfaW5mbyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBpIHx8IHZpb3R0eV9wYXJhbm9pYV9jaGVjayhwaSwgdHR5LT5uYW1lLCAidmlvdHR5X2Nsb3NlIikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodHR5LT5jb3VudCA9PSAxKQorCQlwaS0+dHR5ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVFRZIFdyaXRlIG1ldGhvZAorICovCitzdGF0aWMgaW50IHZpb3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCWludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKworCXBpID0gZ2V0X3BvcnRfZGF0YSh0dHkpOworCWlmIChwaSA9PSBOVUxMKSB7CisJCWh2bG9nKCJcblxydmlvdHR5X3dyaXRlOiBubyBwb3J0IGRhdGEuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh2aW9jaGFyX2lzX2NvbnNvbGUocGkpKQorCQlodmxvZ091dHB1dChidWYsIGNvdW50KTsKKworCS8qCisJICogSWYgdGhlIHBhdGggdG8gdGhpcyBMUCBpcyBjbG9zZWQsIGRvbid0IGJvdGhlciBkb2luZyBhbnl0aGluZyBtb3JlLgorCSAqIGp1c3QgZHVtcCB0aGUgZGF0YSBvbiB0aGUgZmxvb3IgYW5kIHJldHVybiBjb3VudC4gIEZvciBzb21lIHJlYXNvbgorCSAqIHNvbWUgdXNlciBsZXZlbCBwcm9ncmFtcyB3aWxsIGF0dGVtcHQgdG8gcHJvYmUgYXZhaWxhYmxlIHR0eSdzIGFuZAorCSAqIHRoZXknbGwgYXR0ZW1wdCBhIHZpb3R0eV93cml0ZSBvbiBhbiBpbnZhbGlkIHBvcnQgd2hpY2ggbWFwcyB0byBhbgorCSAqIGludmFsaWQgdGFyZ2V0IGxwLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIGlnbm9yZSB0aGUKKwkgKiB2aW90dHlfd3JpdGUgY2FsbCBhbmQsIHNpbmNlIHRoZSB2aW9wYXRoIGlzbid0IGFjdGl2ZSB0byB0aGlzCisJICogcGFydGl0aW9uLCByZXR1cm4gY291bnQuCisJICovCisJaWYgKCF2aW9wYXRoX2lzYWN0aXZlKHBpLT5scCkpCisJCXJldHVybiBjb3VudDsKKworCXJldHVybiBpbnRlcm5hbF93cml0ZShwaSwgYnVmLCBjb3VudCk7Cit9CisKKy8qCisgKiBUVFkgcHV0X2NoYXIgbWV0aG9kCisgKi8KK3N0YXRpYyB2b2lkIHZpb3R0eV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJcGkgPSBnZXRfcG9ydF9kYXRhKHR0eSk7CisJaWYgKHBpID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFRoaXMgd2lsbCBhcHBlbmQgJ1xyJyBhcyB3ZWxsIGlmIHRoZSBjaGFyIGlzICdcbicgKi8KKwlpZiAodmlvY2hhcl9pc19jb25zb2xlKHBpKSkKKwkJaHZsb2dPdXRwdXQoJmNoLCAxKTsKKworCWlmICh2aW9wYXRoX2lzYWN0aXZlKHBpLT5scCkpCisJCWludGVybmFsX3dyaXRlKHBpLCAmY2gsIDEpOworfQorCisvKgorICogVFRZIHdyaXRlX3Jvb20gbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgdmlvdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgaTsKKwlpbnQgcm9vbSA9IDA7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCXBpID0gKHN0cnVjdCBwb3J0X2luZm8gKil0dHktPmRyaXZlcl9kYXRhOworCWlmICghcGkgfHwgdmlvdHR5X3BhcmFub2lhX2NoZWNrKHBpLCB0dHktPm5hbWUsICJ2aW90dHlfd3JpdGVfcm9vbSIpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIG5vIGJ1ZmZlcnMgYXJlIHVzZWQsIHJldHVybiB0aGUgbWF4IHNpemUuICovCisJaWYgKHBpLT51c2VkID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIFZJT0NIQVJfTUFYX0RBVEEgKiBWSU9DSEFSX05VTV9CVUY7CisJfQorCisJLyoKKwkgKiBXZSByZXRhaW4gdGhlIHNwaW5sb2NrIGJlY2F1c2Ugd2Ugd2FudCB0byBnZXQgYW4gYWNjdXJhdGUKKwkgKiBjb3VudCBhbmQgaXQgY2FuIGNoYW5nZSBvbiB1cyBiZXR3ZWVuIGVhY2ggb3BlcmF0aW9uIGlmIHdlCisJICogZG9uJ3QgaG9sZCB0aGUgc3BpbmxvY2suCisJICovCisJZm9yIChpID0gMDsgKChpIDwgVklPQ0hBUl9OVU1fQlVGKSAmJiAocm9vbSA8IFZJT0NIQVJfTUFYX0RBVEEpKTsgaSsrKQorCQlyb29tICs9IChWSU9DSEFSX01BWF9EQVRBIC0gcGktPmJ1ZmZlckJ5dGVzW2ldKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJaWYgKHJvb20gPiBWSU9DSEFSX01BWF9EQVRBKQorCQlyb29tID0gVklPQ0hBUl9NQVhfREFUQTsKKwlyZXR1cm4gcm9vbTsKK30KKworLyoKKyAqIFRUWSBjaGFyc19pbl9idWZmZXIgbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgdmlvdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpb3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJLyoKKwkgKiB0aGUgaW9jdGxzIGJlbG93IHJlYWQvc2V0IHRoZSBmbGFncyB1c3VhbGx5IHNob3duIGluIHRoZSBsZWRzCisJICogZG9uJ3QgdXNlIHRoZW0gLSB0aGV5IHdpbGwgZ28gYXdheSB3aXRob3V0IHdhcm5pbmcKKwkgKi8KKwljYXNlIEtER0VUTEVEOgorCWNhc2UgS0RHS0JMRUQ6CisJCXJldHVybiBwdXRfdXNlcigwLCAoY2hhciAqKWFyZyk7CisKKwljYXNlIEtEU0tCTEVEOgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7Cit9CisKKy8qCisgKiBIYW5kbGUgYW4gb3BlbiBjaGFyTHBFdmVudC4gIENvdWxkIGJlIGVpdGhlciBpbnRlcnJ1cHQgb3IgYWNrCisgKi8KK3N0YXRpYyB2b2lkIHZpb0hhbmRsZU9wZW5FdmVudChzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqY2V2ZW50ID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKWV2ZW50OworCXU4IHBvcnQgPSBjZXZlbnQtPnZpcnR1YWxfZGV2aWNlOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCWludCByZWplY3QgPSAwOworCisJaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9BY2spIHsKKwkJaWYgKHBvcnQgPj0gVlRUWV9QT1JUUykKKwkJCXJldHVybjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJLyogR290IHRoZSBsb2NrLCBkb24ndCBjYXVzZSBjb25zb2xlIG91dHB1dCAqLworCisJCXBpID0gJnBvcnRfaW5mb1twb3J0XTsKKwkJaWYgKGV2ZW50LT54UmMgPT0gSHZMcEV2ZW50X1JjX0dvb2QpIHsKKwkJCXBpLT5zZXEgPSBwaS0+YWNrID0gMDsKKwkJCS8qCisJCQkgKiBUaGlzIGxpbmUgYWxsb3dzIGNvbm5lY3Rpb25zIGZyb20gdGhlIHByaW1hcnkKKwkJCSAqIHBhcnRpdGlvbiBidXQgb25jZSBvbmUgaXMgY29ubmVjdGVkIGZyb20gdGhlCisJCQkgKiBwcmltYXJ5IHBhcnRpdGlvbiBub3RoaW5nIHNob3J0IG9mIGEgcmVib290CisJCQkgKiBvZiBsaW51eCB3aWxsIGFsbG93IGFjY2VzcyBmcm9tIHRoZSBob3N0aW5nCisJCQkgKiBwYXJ0aXRpb24gYWdhaW4gd2l0aG91dCBhIHJlcXVpcmVkIGlTZXJpZXMgZml4LgorCQkJICovCisJCQlwaS0+bHAgPSBldmVudC0+eFRhcmdldExwOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJaWYgKGV2ZW50LT54UmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpCisJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCSAgICAgICAiaGFuZGxlX29wZW5fZXZlbnQ6IGV2ZW50LT54UmMgPT0gKCVkKS5cbiIsCisJCQkgICAgICAgZXZlbnQtPnhSYyk7CisKKwkJaWYgKGV2ZW50LT54Q29ycmVsYXRpb25Ub2tlbiAhPSAwKSB7CisJCQlhdG9taWNfdCAqYXB0cj0gKGF0b21pY190ICopZXZlbnQtPnhDb3JyZWxhdGlvblRva2VuOworCQkJYXRvbWljX3NldChhcHRyLCAxKTsKKwkJfSBlbHNlCisJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCSAgICAgICAid2VpcmQuLi5nb3Qgb3BlbiBhY2sgd2l0aG91dCBhdG9taWNcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogVGhpcyBoYWQgYmV0dGVyIHJlcXVpcmUgYW4gYWNrLCBvdGhlcndpc2UgY29tcGxhaW4gKi8KKwlpZiAoZXZlbnQtPnhGbGFncy54QWNrSW5kICE9IEh2THBFdmVudF9BY2tJbmRfRG9BY2spIHsKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJ2aW9jaGFyb3BlbiB3aXRob3V0IGFjayBiaXQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCS8qIEdvdCB0aGUgbG9jaywgZG9uJ3QgY2F1c2UgY29uc29sZSBvdXRwdXQgKi8KKworCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgZ29vZCB2aXJ0dWFsIHR0eSAqLworCWlmIChwb3J0ID49IFZUVFlfUE9SVFMpIHsKKwkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19TdWJ0eXBlRXJyb3I7CisJCWNldmVudC0+c3VidHlwZV9yZXN1bHRfY29kZSA9IHZpb3JjX29wZW5SZWplY3RlZDsKKwkJLyoKKwkJICogRmxhZyBzdGF0ZSBoZXJlIHNpbmNlIHdlIGNhbid0IHByaW50ayB3aGlsZSBob2xkaW5nCisJCSAqIGEgc3BpbmxvY2suCisJCSAqLworCQlyZWplY3QgPSAxOworCX0gZWxzZSB7CisJCXBpID0gJnBvcnRfaW5mb1twb3J0XTsKKwkJaWYgKChwaS0+bHAgIT0gSHZMcEluZGV4SW52YWxpZCkgJiYKKwkJCQkocGktPmxwICE9IGV2ZW50LT54U291cmNlTHApKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBpcyB0dHkgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBkaWZmZXJlbnQKKwkJCSAqIHBhcnRpdGlvbiwgZmFpbC4KKwkJCSAqLworCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19TdWJ0eXBlRXJyb3I7CisJCQljZXZlbnQtPnN1YnR5cGVfcmVzdWx0X2NvZGUgPSB2aW9yY19vcGVuUmVqZWN0ZWQ7CisJCQlyZWplY3QgPSAyOworCQl9IGVsc2UgeworCQkJcGktPmxwID0gZXZlbnQtPnhTb3VyY2VMcDsKKwkJCWV2ZW50LT54UmMgPSBIdkxwRXZlbnRfUmNfR29vZDsKKwkJCWNldmVudC0+c3VidHlwZV9yZXN1bHRfY29kZSA9IHZpb3JjX2dvb2Q7CisJCQlwaS0+c2VxID0gcGktPmFjayA9IDA7CisJCQlyZWplY3QgPSAwOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKworCWlmIChyZWplY3QgPT0gMSkKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJvcGVuIHJlamVjdGVkOiBiYWQgdmlydHVhbCB0dHkuXG4iKTsKKwllbHNlIGlmIChyZWplY3QgPT0gMikKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOCisJCQkib3BlbiByZWplY3RlZDogY29uc29sZSBpbiBleGNsdXNpdmUgdXNlIGJ5IGFub3RoZXIgcGFydGl0aW9uLlxuIik7CisKKwkvKiBSZXR1cm4gdGhlIGFja25vd2xlZGdlbWVudCAqLworCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOworfQorCisvKgorICogSGFuZGxlIGEgY2xvc2UgY2hhckxwRXZlbnQuICBUaGlzIHNob3VsZCBPTkxZIGJlIGFuIEludGVycnVwdCBiZWNhdXNlIHRoZQorICogdmlydHVhbCBjb25zb2xlIHNob3VsZCBuZXZlciBhY3R1YWxseSBpc3N1ZSBhIGNsb3NlIGV2ZW50IHRvIHRoZSBoeXBlcnZpc29yCisgKiBiZWNhdXNlIHRoZSB2aXJ0dWFsIGNvbnNvbGUgbmV2ZXIgZ29lcyBhd2F5LiAgQSBjbG9zZSBldmVudCBjb21pbmcgZnJvbSB0aGUKKyAqIGh5cGVydmlzb3Igc2ltcGx5IG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vIGNsaWVudCBjb25zb2xlcyBjb25uZWN0ZWQgdG8gdGhlCisgKiB2aXJ0dWFsIGNvbnNvbGUuCisgKgorICogUmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIG1hc3F1ZXJhZGVkIG9uIHRoZSBvdGhlciBzaWRlIG9mCisgKiB0aGUgaHlwZXJ2aXNvciBPTkxZIE9ORSBjbG9zZSBldmVudCBzaG91bGQgYmUgY2FsbGVkIHRvIGFjY29tcGFueSB0aGUgT05FCisgKiBvcGVuIGV2ZW50IHRoYXQgaXMgY2FsbGVkLiAgVGhlIGNsb3NlIGV2ZW50IHNob3VsZCBPTkxZIGJlIGNhbGxlZCB3aGVuIE5PCisgKiBNT1JFIGNvbm5lY3Rpb25zIChtYXNxdWVyYWRlZCBvciBub3QpIGV4aXN0IG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZQorICogaHlwZXJ2aXNvci4KKyAqLworc3RhdGljIHZvaWQgdmlvSGFuZGxlQ2xvc2VFdmVudChzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqY2V2ZW50ID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKWV2ZW50OworCXU4IHBvcnQgPSBjZXZlbnQtPnZpcnR1YWxfZGV2aWNlOworCisJaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwkJaWYgKHBvcnQgPj0gVlRUWV9QT1JUUykgeworCQkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOCisJCQkJCSJjbG9zZSBtZXNzYWdlIGZyb20gaW52YWxpZCB2aXJ0dWFsIGRldmljZS5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogRm9yIGNsb3NlcywganVzdCBtYXJrIHRoZSBjb25zb2xlIHBhcnRpdGlvbiBpbnZhbGlkICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQkvKiBHb3QgdGhlIGxvY2ssIGRvbid0IGNhdXNlIGNvbnNvbGUgb3V0cHV0ICovCisKKwkJaWYgKHBvcnRfaW5mb1twb3J0XS5scCA9PSBldmVudC0+eFNvdXJjZUxwKQorCQkJcG9ydF9pbmZvW3BvcnRdLmxwID0gSHZMcEluZGV4SW52YWxpZDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlwcmludGsoVklPQ09OU19LRVJOX0lORk8gImNsb3NlIGZyb20gJWRcbiIsIGV2ZW50LT54U291cmNlTHApOworCX0gZWxzZQorCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCQkiZ290IHVuZXhwZWN0ZWQgY2xvc2UgYWNrbm93bGVnZW1lbnRcbiIpOworfQorCisvKgorICogSGFuZGxlIGEgY29uZmlnIGNoYXJMcEV2ZW50LiAgQ291bGQgYmUgZWl0aGVyIGludGVycnVwdCBvciBhY2sKKyAqLworc3RhdGljIHZvaWQgdmlvSGFuZGxlQ29uZmlnKHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqY2V2ZW50ID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKWV2ZW50OworCisJSHZDYWxsX3dyaXRlTG9nQnVmZmVyKGNldmVudC0+ZGF0YSwgY2V2ZW50LT5sZW4pOworCisJaWYgKGNldmVudC0+ZGF0YVswXSA9PSAweDAxKQorCQlwcmludGsoVklPQ09OU19LRVJOX0lORk8gIndpbmRvdyByZXNpemVkIHRvICVkOiAlZDogJWQ6ICVkXG4iLAorCQkgICAgICAgY2V2ZW50LT5kYXRhWzFdLCBjZXZlbnQtPmRhdGFbMl0sCisJCSAgICAgICBjZXZlbnQtPmRhdGFbM10sIGNldmVudC0+ZGF0YVs0XSk7CisJZWxzZQorCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gInVua25vd24gY29uZmlnIGV2ZW50XG4iKTsKK30KKworLyoKKyAqIEhhbmRsZSBhIGRhdGEgY2hhckxwRXZlbnQuIAorICovCitzdGF0aWMgdm9pZCB2aW9IYW5kbGVEYXRhKHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKmNldmVudCA9IChzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKilldmVudDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKwlpbnQgaW5kZXg7CisJdTggcG9ydCA9IGNldmVudC0+dmlydHVhbF9kZXZpY2U7CisKKwlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKSB7CisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAiZGF0YSBvbiBpbnZhbGlkIHZpcnR1YWwgZGV2aWNlICVkXG4iLAorCQkJCXBvcnQpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBIb2xkIHRoZSBzcGlubG9jayBzbyB0aGF0IHdlIGRvbid0IHRha2UgYW4gaW50ZXJydXB0IHRoYXQKKwkgKiBjaGFuZ2VzIHR0eSBiZXR3ZWVuIHRoZSB0aW1lIHdlIGZldGNoIHRoZSBwb3J0X2luZm8KKwkgKiBwb2ludGVyIGFuZCB0aGUgdGltZSB3ZSBwYXJhbm9pYSBjaGVjay4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwlwaSA9ICZwb3J0X2luZm9bcG9ydF07CisKKwkvKgorCSAqIENoYW5nZSAwNS8wMS8yMDAzIC0gUnlhbiBBcm5vbGQ6IElmIGEgcGFydGl0aW9uIG90aGVyIHRoYW4KKwkgKiB0aGUgY3VycmVudCBleGNsdXNpdmUgcGFydGl0aW9uIHRyaWVzIHRvIHNlbmQgdXMgZGF0YQorCSAqIGV2ZW50cyB0aGVuIGp1c3QgZHJvcCB0aGVtIG9uIHRoZSBmbG9vciBiZWNhdXNlIHdlIGRvbid0CisJICogd2FudCBoaXMgc3RpbmtpbmcgZGF0YS4gIEhlIGlzbid0IGF1dGhvcml6ZWQgdG8gcmVjZWl2ZQorCSAqIGRhdGEgYmVjYXVzZSBoZSB3YXNuJ3QgdGhlIGZpcnN0IG9uZSB0byBnZXQgdGhlIGNvbnNvbGUsCisJICogdGhlcmVmb3JlIGhlIHNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIHNlbmQgZGF0YSBlaXRoZXIuCisJICogVGhpcyB3aWxsIHdvcmsgd2l0aG91dCBhbiBpU2VyaWVzIGZpeC4KKwkgKi8KKwlpZiAocGktPmxwICE9IGV2ZW50LT54U291cmNlTHApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXR0eSA9IHBpLT50dHk7CisJaWYgKHR0eSA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAibm8gdHR5IGZvciB2aXJ0dWFsIGRldmljZSAlZFxuIiwKKwkJCQlwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gInR0eSBiYWQgbWFnaWNcbiIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBKdXN0IHRvIGJlIHBhcmFub2lkLCBtYWtlIHN1cmUgdGhlIHR0eSBwb2ludHMgYmFjayB0byB0aGlzIHBvcnQKKwkgKi8KKwlwaSA9IChzdHJ1Y3QgcG9ydF9pbmZvICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXBpIHx8IHZpb3R0eV9wYXJhbm9pYV9jaGVjayhwaSwgdHR5LT5uYW1lLCAidmlvSGFuZGxlRGF0YSIpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKworCS8qCisJICogQ2hhbmdlIDA3LzIxLzIwMDMgLSBSeWFuIEFybm9sZDogZnVuY3Rpb25hbGl0eSBhZGRlZCB0bworCSAqIHN1cHBvcnQgc3lzcnEgdXRpbGl6aW5nIF5PIGFzIHRoZSBzeXNycSBrZXkuICBUaGUgc3lzcnEKKwkgKiBmdW5jdGlvbmFsaXR5IHdpbGwgb25seSB3b3JrIGlmIGJ1aWx0IGludG8gdGhlIGtlcm5lbCBhbmQKKwkgKiB0aGVuIG9ubHkgaWYgc3lzcnEgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBwcm9jIGZpbGVzeXN0ZW0uCisJICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY2V2ZW50LT5sZW47IGluZGV4KyspIHsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkJaWYgKHN5c3JxX2VuYWJsZWQpIHsKKwkJCS8qIDB4MGYgaXMgdGhlIGFzY2lpIGNoYXJhY3RlciBmb3IgXk8gKi8KKwkJCWlmIChjZXZlbnQtPmRhdGFbaW5kZXhdID09ICdceDBmJykgeworCQkJCXZpb19zeXNycV9wcmVzc2VkID0gMTsKKwkJCQkvKgorCQkJCSAqIGNvbnRpbnVlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhZGQKKwkJCQkgKiB0aGUgc3lzcnEga2V5IGludG8gdGhlIGRhdGEgc3RyaW5nLgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICh2aW9fc3lzcnFfcHJlc3NlZCkgeworCQkJCWhhbmRsZV9zeXNycShjZXZlbnQtPmRhdGFbaW5kZXhdLCBOVUxMLCB0dHkpOworCQkJCXZpb19zeXNycV9wcmVzc2VkID0gMDsKKwkJCQkvKgorCQkJCSAqIGNvbnRpbnVlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhZGQKKwkJCQkgKiB0aGUgc3lzcnEgc2VxdWVuY2UgaW50byB0aGUgZGF0YSBzdHJpbmcuCisJCQkJICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKiBUaGUgc3lzcnEgc2VxdWVuY2UgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBjaGVjayBpZgorCQkgKiBzeXNycSBpcyBlbmFibGVkIGFuZCBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgYmVjYXVzZQorCQkgKiB0aGUgc2VxdWVuY2Ugd2lsbCBuZXZlciBnZXQgaW5zZXJ0ZWQgaW50byB0aGUgYnVmZmVyLgorCQkgKiBEb24ndCBhdHRlbXB0IHRvIGNvcHkgbW9yZSBkYXRhIGludG8gdGhlIGJ1ZmZlciB0aGFuIHdlCisJCSAqIGhhdmUgcm9vbSBmb3IgYmVjYXVzZSBpdCB3b3VsZCBmYWlsIHdpdGhvdXQgaW5kaWNhdGlvbi4KKwkJICovCisJCWlmICgodHR5LT5mbGlwLmNvdW50ICsgMSkgPiBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gImlucHV0IGJ1ZmZlciBvdmVyZmxvdyFcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjZXZlbnQtPmRhdGFbaW5kZXhdLCBUVFlfTk9STUFMKTsKKwl9CisKKwkvKiBpZiBjZXZlbnQtPmxlbiA9PSAwIHRoZW4gbm8gZGF0YSB3YXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhbmQgZmxpcC5jb3VudCA9PSAwICovCisJaWYgKHR0eS0+ZmxpcC5jb3VudCkKKwkJLyogVGhlIG5leHQgY2FsbCByZXNldHMgZmxpcC5jb3VudCB3aGVuIHRoZSBkYXRhIGlzIGZsdXNoZWQuICovCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Cit9CisKKy8qCisgKiBIYW5kbGUgYW4gYWNrIGNoYXJMcEV2ZW50LiAKKyAqLworc3RhdGljIHZvaWQgdmlvSGFuZGxlQWNrKHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqY2V2ZW50ID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKWV2ZW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggcG9ydCA9IGNldmVudC0+dmlydHVhbF9kZXZpY2U7CisKKwlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKSB7CisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAiZGF0YSBvbiBpbnZhbGlkIHZpcnR1YWwgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCXBvcnRfaW5mb1twb3J0XS5hY2sgPSBldmVudC0+eENvcnJlbGF0aW9uVG9rZW47CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKworCWlmIChwb3J0X2luZm9bcG9ydF0udXNlZCkKKwkJc2VuZF9idWZmZXJzKCZwb3J0X2luZm9bcG9ydF0pOworfQorCisvKgorICogSGFuZGxlIGNoYXJMcEV2ZW50cyBhbmQgcm91dGUgdG8gdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmUKKyAqLworc3RhdGljIHZvaWQgdmlvSGFuZGxlQ2hhckV2ZW50KHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCWludCBjaGFybWlub3I7CisKKwlpZiAoZXZlbnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2hhcm1pbm9yID0gZXZlbnQtPnhTdWJ0eXBlICYgVklPTUlOT1JfU1VCVFlQRV9NQVNLOworCXN3aXRjaCAoY2hhcm1pbm9yKSB7CisJY2FzZSB2aW9jaGFyb3BlbjoKKwkJdmlvSGFuZGxlT3BlbkV2ZW50KGV2ZW50KTsKKwkJYnJlYWs7CisJY2FzZSB2aW9jaGFyY2xvc2U6CisJCXZpb0hhbmRsZUNsb3NlRXZlbnQoZXZlbnQpOworCQlicmVhazsKKwljYXNlIHZpb2NoYXJkYXRhOgorCQl2aW9IYW5kbGVEYXRhKGV2ZW50KTsKKwkJYnJlYWs7CisJY2FzZSB2aW9jaGFyYWNrOgorCQl2aW9IYW5kbGVBY2soZXZlbnQpOworCQlicmVhazsKKwljYXNlIHZpb2NoYXJjb25maWc6CisJCXZpb0hhbmRsZUNvbmZpZyhldmVudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICgoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkgJiYKKwkJICAgIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykpIHsKKwkJCWV2ZW50LT54UmMgPSBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGU7CisJCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KGV2ZW50KTsKKwkJfQorCX0KK30KKworLyoKKyAqIFNlbmQgYW4gb3BlbiBldmVudAorICovCitzdGF0aWMgaW50IHNlbmRfb3BlbihIdkxwSW5kZXggcmVtb3RlTHAsIHZvaWQgKnNlbSkKK3sKKwlyZXR1cm4gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QocmVtb3RlTHAsCisJCQlIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW8sCisJCQl2aW9tYWpvcnN1YnR5cGVfY2hhcmlvIHwgdmlvY2hhcm9wZW4sCisJCQlIdkxwRXZlbnRfQWNrSW5kX0RvQWNrLCBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQl2aW9wYXRoX3NvdXJjZWluc3QocmVtb3RlTHApLAorCQkJdmlvcGF0aF90YXJnZXRpbnN0KHJlbW90ZUxwKSwKKwkJCSh1NjQpKHVuc2lnbmVkIGxvbmcpc2VtLCBWSU9WRVJTSU9OIDw8IDE2LAorCQkJMCwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc2VyaWFsX29wcyA9IHsKKwkub3BlbiA9IHZpb3R0eV9vcGVuLAorCS5jbG9zZSA9IHZpb3R0eV9jbG9zZSwKKwkud3JpdGUgPSB2aW90dHlfd3JpdGUsCisJLnB1dF9jaGFyID0gdmlvdHR5X3B1dF9jaGFyLAorCS53cml0ZV9yb29tID0gdmlvdHR5X3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHZpb3R0eV9jaGFyc19pbl9idWZmZXIsCisJLmlvY3RsID0gdmlvdHR5X2lvY3RsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdmlvY29uc19pbml0Mih2b2lkKQoreworCWF0b21pY190IHdhaXRfZmxhZzsKKwlpbnQgcmM7CisKKwkvKiArMiBmb3IgZnVkZ2UgKi8KKwlyYyA9IHZpb3BhdGhfb3BlbihIdkxwQ29uZmlnX2dldFByaW1hcnlMcEluZGV4KCksCisJCQl2aW9tYWpvcnN1YnR5cGVfY2hhcmlvLCBWSU9DSEFSX1dJTkRPVyArIDIpOworCWlmIChyYykKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJlcnJvciBvcGVuaW5nIHRvIHByaW1hcnkgJWRcbiIsIHJjKTsKKworCWlmICh2aW9wYXRoX2hvc3RMcCA9PSBIdkxwSW5kZXhJbnZhbGlkKQorCQl2aW9fc2V0X2hvc3RscCgpOworCisJLyoKKwkgKiBBbmQgaWYgdGhlIHByaW1hcnkgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBob3N0aW5nIExQLCBvcGVuIHRvIHRoZSAKKwkgKiBob3N0aW5nIGxwCisJICovCisJaWYgKCh2aW9wYXRoX2hvc3RMcCAhPSBIdkxwSW5kZXhJbnZhbGlkKSAmJgorCSAgICAodmlvcGF0aF9ob3N0THAgIT0gSHZMcENvbmZpZ19nZXRQcmltYXJ5THBJbmRleCgpKSkgeworCQlwcmludGsoVklPQ09OU19LRVJOX0lORk8gIm9wZW4gcGF0aCB0byBob3N0aW5nICglZClcbiIsCisJCQkJdmlvcGF0aF9ob3N0THApOworCQlyYyA9IHZpb3BhdGhfb3Blbih2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX2NoYXJpbywKKwkJCQlWSU9DSEFSX1dJTkRPVyArIDIpOwkvKiArMiBmb3IgZnVkZ2UgKi8KKwkJaWYgKHJjKQorCQkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOCisJCQkJImVycm9yIG9wZW5pbmcgdG8gcGFydGl0aW9uICVkOiAlZFxuIiwKKwkJCQl2aW9wYXRoX2hvc3RMcCwgcmMpOworCX0KKworCWlmICh2aW9fc2V0SGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfY2hhcmlvLCB2aW9IYW5kbGVDaGFyRXZlbnQpIDwgMCkKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOCisJCQkJImVycm9yIHNldGluZyBoYW5kbGVyIGZvciBjb25zb2xlIGV2ZW50cyFcbiIpOworCisJLyoKKwkgKiBGaXJzdCwgdHJ5IHRvIG9wZW4gdGhlIGNvbnNvbGUgdG8gdGhlIGhvc3RpbmcgbHAuCisJICogV2FpdCBvbiBhIHNlbWFwaG9yZSBmb3IgdGhlIHJlc3BvbnNlLgorCSAqLworCWF0b21pY19zZXQoJndhaXRfZmxhZywgMCk7CisJaWYgKCh2aW9wYXRoX2lzYWN0aXZlKHZpb3BhdGhfaG9zdExwKSkgJiYKKwkgICAgKHNlbmRfb3Blbih2aW9wYXRoX2hvc3RMcCwgKHZvaWQgKikmd2FpdF9mbGFnKSA9PSAwKSkgeworCQlwcmludGsoVklPQ09OU19LRVJOX0lORk8gImhvc3RpbmcgcGFydGl0aW9uICVkXG4iLAorCQkJdmlvcGF0aF9ob3N0THApOworCQl3aGlsZSAoYXRvbWljX3JlYWQoJndhaXRfZmxhZykgPT0gMCkKKwkJCW1iKCk7CisJCWF0b21pY19zZXQoJndhaXRfZmxhZywgMCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBjb25zb2xlLCB0cnkgdGhlIHByaW1hcnkKKwkgKi8KKwlpZiAoKCF2aW9wYXRoX2lzYWN0aXZlKHBvcnRfaW5mb1swXS5scCkpICYmCisJICAgICh2aW9wYXRoX2lzYWN0aXZlKEh2THBDb25maWdfZ2V0UHJpbWFyeUxwSW5kZXgoKSkpICYmCisJICAgIChzZW5kX29wZW4oSHZMcENvbmZpZ19nZXRQcmltYXJ5THBJbmRleCgpLCAodm9pZCAqKSZ3YWl0X2ZsYWcpCisJICAgICA9PSAwKSkgeworCQlwcmludGsoVklPQ09OU19LRVJOX0lORk8gIm9wZW5pbmcgY29uc29sZSB0byBwcmltYXJ5IHBhcnRpdGlvblxuIik7CisJCXdoaWxlIChhdG9taWNfcmVhZCgmd2FpdF9mbGFnKSA9PSAwKQorCQkJbWIoKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLworCXZpb3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKFZUVFlfUE9SVFMpOworCXZpb3R0eV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJdmlvdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUgPSAidmlvY29uc29sZSI7CisJdmlvdHR5X2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ2Y3MvIjsKKwl2aW90dHlfZHJpdmVyLT5uYW1lID0gInR0eSI7CisJdmlvdHR5X2RyaXZlci0+bmFtZV9iYXNlID0gMTsKKwl2aW90dHlfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKKwl2aW90dHlfZHJpdmVyLT5taW5vcl9zdGFydCA9IDE7CisJdmlvdHR5X2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9DT05TT0xFOworCXZpb3R0eV9kcml2ZXItPnN1YnR5cGUgPSAxOworCXZpb3R0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwl2aW90dHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1M7CisJdHR5X3NldF9vcGVyYXRpb25zKHZpb3R0eV9kcml2ZXIsICZzZXJpYWxfb3BzKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHZpb3R0eV9kcml2ZXIpKSB7CisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAiY291bGRuJ3QgcmVnaXN0ZXIgY29uc29sZSBkcml2ZXJcbiIpOworCQlwdXRfdHR5X2RyaXZlcih2aW90dHlfZHJpdmVyKTsKKwkJdmlvdHR5X2RyaXZlciA9IE5VTEw7CisJfQorCisJdW5yZWdpc3Rlcl9jb25zb2xlKCZ2aW9jb25zX2Vhcmx5KTsKKwlyZWdpc3Rlcl9jb25zb2xlKCZ2aW9jb25zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB2aW9jb25zX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXByaW50ayhWSU9DT05TX0tFUk5fSU5GTyAicmVnaXN0ZXJpbmcgY29uc29sZVxuIik7CisJZm9yIChpID0gMDsgaSA8IFZUVFlfUE9SVFM7IGkrKykgeworCQlwb3J0X2luZm9baV0ubHAgPSBIdkxwSW5kZXhJbnZhbGlkOworCQlwb3J0X2luZm9baV0ubWFnaWMgPSBWSU9UVFlfTUFHSUM7CisJfQorCUh2Q2FsbF9zZXRMb2dCdWZmZXJGb3JtYXRBbmRDb2RlcGFnZShIdkNhbGxfTG9nQnVmZmVyX0FTQ0lJLCA0MzcpOworCXJlZ2lzdGVyX2NvbnNvbGUoJnZpb2NvbnNfZWFybHkpOworCXJldHVybiAwOworfQorCitjb25zb2xlX2luaXRjYWxsKHZpb2NvbnNfaW5pdCk7Cittb2R1bGVfaW5pdCh2aW9jb25zX2luaXQyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMgYi9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTNjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCkBAIC0wLDAgKzEsMTEyOSBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKiAgZHJpdmVycy9jaGFyL3Zpb3RhcGUuYworICoKKyAqICBpU2VyaWVzIFZpcnR1YWwgVGFwZQorICoKKyAqICBBdXRob3JzOiBEYXZlIEJvdXRjaGVyIDxib3V0Y2hlckB1cy5pYm0uY29tPgorICogICAgICAgICAgIFJ5YW4gQXJub2xkIDxyeWFuYXJuQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgQ29saW4gRGV2aWxiaXNzIDxkZXZpbGJpc0B1cy5pYm0uY29tPgorICogICAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwgPHNmckBhdTEuaWJtLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnl1IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogVGhpcyByb3V0aW5lIHByb3ZpZGVzIGFjY2VzcyB0byB0YXBlIGRyaXZlcyBvd25lZCBhbmQgbWFuYWdlZCBieSBhbiBPUy80MDAKKyAqIHBhcnRpdGlvbiBydW5uaW5nIG9uIHRoZSBzYW1lIGJveCBhcyB0aGlzIExpbnV4IHBhcnRpdGlvbi4KKyAqCisgKiBBbGwgdGFwZSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYnkgc2VuZGluZyBtZXNzYWdlcyBiYWNrIGFuZCBmb3J0aCB0bworICogdGhlIE9TLzQwMCBwYXJ0aXRpb24uICBUaGUgZm9ybWF0IG9mIHRoZSBtZXNzYWdlcyBpcyBkZWZpbmVkIGluCisgKiBpU2VyaWVzL3Zpby5oCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy92aW8uaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwRXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkNhbGxFdmVudC5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2THBDb25maWcuaD4KKworI2RlZmluZSBWSU9UQVBFX1ZFUlNJT04JCSIxLjIiCisjZGVmaW5lIFZJT1RBUEVfTUFYUkVRCQkxCisKKyNkZWZpbmUgVklPVEFQRV9LRVJOX1dBUk4JS0VSTl9XQVJOSU5HICJ2aW90YXBlOiAiCisjZGVmaW5lIFZJT1RBUEVfS0VSTl9JTkZPCUtFUk5fSU5GTyAidmlvdGFwZTogIgorCitzdGF0aWMgaW50IHZpb3RhcGVfbnVtZGV2OworCisvKgorICogVGhlIG1pbm9yIG51bWJlciBmb2xsb3dzIHRoZSBjb252ZW50aW9ucyBvZiB0aGUgU0NTSSB0YXBlIGRyaXZlcy4gIFRoZQorICogcmV3aW5kIGFuZCBtb2RlIGFyZSBlbmNvZGVkIGluIHRoZSBtaW5vciAjLiAgV2UgdXNlIHRoaXMgc3RydWN0IHRvIGJyZWFrCisgKiB0aGVtIG91dAorICovCitzdHJ1Y3QgdmlvdF9kZXZpbmZvX3N0cnVjdCB7CisJaW50IGRldm5vOworCWludCBtb2RlOworCWludCByZXdpbmQ7Cit9OworCisjZGVmaW5lIFZJT1RBUE9QX1JFU0VUICAgICAgICAgIDAKKyNkZWZpbmUgVklPVEFQT1BfRlNGCSAgICAgICAgMQorI2RlZmluZSBWSU9UQVBPUF9CU0YJICAgICAgICAyCisjZGVmaW5lIFZJT1RBUE9QX0ZTUgkgICAgICAgIDMKKyNkZWZpbmUgVklPVEFQT1BfQlNSCSAgICAgICAgNAorI2RlZmluZSBWSU9UQVBPUF9XRU9GCSAgICAgICAgNQorI2RlZmluZSBWSU9UQVBPUF9SRVcJICAgICAgICA2CisjZGVmaW5lIFZJT1RBUE9QX05PUAkgICAgICAgIDcKKyNkZWZpbmUgVklPVEFQT1BfRU9NCSAgICAgICAgOAorI2RlZmluZSBWSU9UQVBPUF9FUkFTRSAgICAgICAgICA5CisjZGVmaW5lIFZJT1RBUE9QX1NFVEJMSyAgICAgICAgMTAKKyNkZWZpbmUgVklPVEFQT1BfU0VUREVOU0lUWSAgICAxMQorI2RlZmluZSBWSU9UQVBPUF9TRVRQT1MJICAgICAgIDEyCisjZGVmaW5lIFZJT1RBUE9QX0dFVFBPUwkgICAgICAgMTMKKyNkZWZpbmUgVklPVEFQT1BfU0VUUEFSVCAgICAgICAxNAorI2RlZmluZSBWSU9UQVBPUF9VTkxPQUQgICAgICAgIDE1CisKK3N0cnVjdCB2aW90YXBlbHBldmVudCB7CisJc3RydWN0IEh2THBFdmVudCBldmVudDsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTE2IHZlcnNpb247CisJdTE2IHN1Yl90eXBlX3Jlc3VsdDsKKwl1MTYgdGFwZTsKKwl1MTYgZmxhZ3M7CisJdTMyIHRva2VuOworCXU2NCBsZW47CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIHRhcGVfb3A7CisJCQl1MzIgY291bnQ7CisJCX0gb3A7CisJCXN0cnVjdCB7CisJCQl1MzIgdHlwZTsKKwkJCXUzMiByZXNpZDsKKwkJCXUzMiBkc3JlZzsKKwkJCXUzMiBnc3RhdDsKKwkJCXUzMiBlcnJlZzsKKwkJCXUzMiBmaWxlX25vOworCQkJdTMyIGJsb2NrX25vOworCQl9IGdldF9zdGF0dXM7CisJCXN0cnVjdCB7CisJCQl1MzIgYmxvY2tfbm87CisJCX0gZ2V0X3BvczsKKwl9IHU7Cit9OworCitlbnVtIHZpb3RhcGVzdWJ0eXBlIHsKKwl2aW90YXBlb3BlbiA9IDB4MDAwMSwKKwl2aW90YXBlY2xvc2UgPSAweDAwMDIsCisJdmlvdGFwZXJlYWQgPSAweDAwMDMsCisJdmlvdGFwZXdyaXRlID0gMHgwMDA0LAorCXZpb3RhcGVnZXRpbmZvID0gMHgwMDA1LAorCXZpb3RhcGVvcCA9IDB4MDAwNiwKKwl2aW90YXBlZ2V0cG9zID0gMHgwMDA3LAorCXZpb3RhcGVzZXRwb3MgPSAweDAwMDgsCisJdmlvdGFwZWdldHN0YXR1cyA9IDB4MDAwOQorfTsKKworZW51bSB2aW90YXBlcmMgeworCXZpb3RhcGVfSW52YWxpZFJhbmdlID0gMHgwNjAxLAorCXZpb3RhcGVfSW52YWxpZFRva2VuID0gMHgwNjAyLAorCXZpb3RhcGVfRE1BRXJyb3IgPSAweDA2MDMsCisJdmlvdGFwZV9Vc2VFcnJvciA9IDB4MDYwNCwKKwl2aW90YXBlX1JlbGVhc2VFcnJvciA9IDB4MDYwNSwKKwl2aW90YXBlX0ludmFsaWRUYXBlID0gMHgwNjA2LAorCXZpb3RhcGVfSW52YWxpZE9wID0gMHgwNjA3LAorCXZpb3RhcGVfVGFwZUVyciA9IDB4MDYwOCwKKworCXZpb3RhcGVfQWxsb2NUaW1lZE91dCA9IDB4MDY0MCwKKwl2aW90YXBlX0JPVEVuYyA9IDB4MDY0MSwKKwl2aW90YXBlX0JsYW5rVGFwZSA9IDB4MDY0MiwKKwl2aW90YXBlX0J1ZmZlckVtcHR5ID0gMHgwNjQzLAorCXZpb3RhcGVfQ2xlYW5DYXJ0Rm91bmQgPSAweDA2NDQsCisJdmlvdGFwZV9DbWROb3RBbGxvd2VkID0gMHgwNjQ1LAorCXZpb3RhcGVfQ21kTm90U3VwcG9ydGVkID0gMHgwNjQ2LAorCXZpb3RhcGVfRGF0YUNoZWNrID0gMHgwNjQ3LAorCXZpb3RhcGVfRGVjb21wcmVzc0VyciA9IDB4MDY0OCwKKwl2aW90YXBlX0RldmljZVRpbWVvdXQgPSAweDA2NDksCisJdmlvdGFwZV9EZXZpY2VVbmF2YWlsID0gMHgwNjRhLAorCXZpb3RhcGVfRGV2aWNlQnVzeSA9IDB4MDY0YiwKKwl2aW90YXBlX0VuZE9mTWVkaWEgPSAweDA2NGMsCisJdmlvdGFwZV9FbmRPZlRhcGUgPSAweDA2NGQsCisJdmlvdGFwZV9FcXVpcENoZWNrID0gMHgwNjRlLAorCXZpb3RhcGVfSW5zdWZmaWNpZW50UnMgPSAweDA2NGYsCisJdmlvdGFwZV9JbnZhbGlkTG9nQmxrID0gMHgwNjUwLAorCXZpb3RhcGVfTGVuZ3RoRXJyb3IgPSAweDA2NTEsCisJdmlvdGFwZV9MaWJEb29yT3BlbiA9IDB4MDY1MiwKKwl2aW90YXBlX0xvYWRGYWlsdXJlID0gMHgwNjUzLAorCXZpb3RhcGVfTm90Q2FwYWJsZSA9IDB4MDY1NCwKKwl2aW90YXBlX05vdE9wZXJhdGlvbmFsID0gMHgwNjU1LAorCXZpb3RhcGVfTm90UmVhZHkgPSAweDA2NTYsCisJdmlvdGFwZV9PcENhbmNlbGxlZCA9IDB4MDY1NywKKwl2aW90YXBlX1BoeUxpbmtFcnIgPSAweDA2NTgsCisJdmlvdGFwZV9SZHlOb3RCT1QgPSAweDA2NTksCisJdmlvdGFwZV9UYXBlTWFyayA9IDB4MDY1YSwKKwl2aW90YXBlX1dyaXRlUHJvdCA9IDB4MDY1YgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aW9fZXJyb3JfZW50cnkgdmlvdGFwZV9lcnJfdGFibGVbXSA9IHsKKwl7IHZpb3RhcGVfSW52YWxpZFJhbmdlLCBFSU8sICJJbnRlcm5hbCBlcnJvciIgfSwKKwl7IHZpb3RhcGVfSW52YWxpZFRva2VuLCBFSU8sICJJbnRlcm5hbCBlcnJvciIgfSwKKwl7IHZpb3RhcGVfRE1BRXJyb3IsIEVJTywgIkRNQSBlcnJvciIgfSwKKwl7IHZpb3RhcGVfVXNlRXJyb3IsIEVJTywgIkludGVybmFsIGVycm9yIiB9LAorCXsgdmlvdGFwZV9SZWxlYXNlRXJyb3IsIEVJTywgIkludGVybmFsIGVycm9yIiB9LAorCXsgdmlvdGFwZV9JbnZhbGlkVGFwZSwgRUlPLCAiSW52YWxpZCB0YXBlIGRldmljZSIgfSwKKwl7IHZpb3RhcGVfSW52YWxpZE9wLCBFSU8sICJJbnZhbGlkIG9wZXJhdGlvbiIgfSwKKwl7IHZpb3RhcGVfVGFwZUVyciwgRUlPLCAiVGFwZSBlcnJvciIgfSwKKwl7IHZpb3RhcGVfQWxsb2NUaW1lZE91dCwgRUJVU1ksICJBbGxvY2F0ZSB0aW1lZCBvdXQiIH0sCisJeyB2aW90YXBlX0JPVEVuYywgRUlPLCAiQmVnaW5uaW5nIG9mIHRhcGUgZW5jb3VudGVyZWQiIH0sCisJeyB2aW90YXBlX0JsYW5rVGFwZSwgRUlPLCAiQmxhbmsgdGFwZSIgfSwKKwl7IHZpb3RhcGVfQnVmZmVyRW1wdHksIEVJTywgIkJ1ZmZlciBlbXB0eSIgfSwKKwl7IHZpb3RhcGVfQ2xlYW5DYXJ0Rm91bmQsIEVOT01FRElVTSwgIkNsZWFuaW5nIGNhcnRyaWRnZSBmb3VuZCIgfSwKKwl7IHZpb3RhcGVfQ21kTm90QWxsb3dlZCwgRUlPLCAiQ29tbWFuZCBub3QgYWxsb3dlZCIgfSwKKwl7IHZpb3RhcGVfQ21kTm90U3VwcG9ydGVkLCBFSU8sICJDb21tYW5kIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyB2aW90YXBlX0RhdGFDaGVjaywgRUlPLCAiRGF0YSBjaGVjayIgfSwKKwl7IHZpb3RhcGVfRGVjb21wcmVzc0VyciwgRUlPLCAiRGVjb21wcmVzc2lvbiBlcnJvciIgfSwKKwl7IHZpb3RhcGVfRGV2aWNlVGltZW91dCwgRUJVU1ksICJEZXZpY2UgdGltZW91dCIgfSwKKwl7IHZpb3RhcGVfRGV2aWNlVW5hdmFpbCwgRUlPLCAiRGV2aWNlIHVuYXZhaWxhYmxlIiB9LAorCXsgdmlvdGFwZV9EZXZpY2VCdXN5LCBFQlVTWSwgIkRldmljZSBidXN5IiB9LAorCXsgdmlvdGFwZV9FbmRPZk1lZGlhLCBFTk9TUEMsICJFbmQgb2YgbWVkaWEiIH0sCisJeyB2aW90YXBlX0VuZE9mVGFwZSwgRU5PU1BDLCAiRW5kIG9mIHRhcGUiIH0sCisJeyB2aW90YXBlX0VxdWlwQ2hlY2ssIEVJTywgIkVxdWlwbWVudCBjaGVjayIgfSwKKwl7IHZpb3RhcGVfSW5zdWZmaWNpZW50UnMsIEVPVkVSRkxPVywgIkluc3VmZmljaWVudCB0YXBlIHJlc291cmNlcyIgfSwKKwl7IHZpb3RhcGVfSW52YWxpZExvZ0JsaywgRUlPLCAiSW52YWxpZCBsb2dpY2FsIGJsb2NrIGxvY2F0aW9uIiB9LAorCXsgdmlvdGFwZV9MZW5ndGhFcnJvciwgRU9WRVJGTE9XLCAiTGVuZ3RoIGVycm9yIiB9LAorCXsgdmlvdGFwZV9MaWJEb29yT3BlbiwgRUJVU1ksICJEb29yIG9wZW4iIH0sCisJeyB2aW90YXBlX0xvYWRGYWlsdXJlLCBFTk9NRURJVU0sICJMb2FkIGZhaWx1cmUiIH0sCisJeyB2aW90YXBlX05vdENhcGFibGUsIEVJTywgIk5vdCBjYXBhYmxlIiB9LAorCXsgdmlvdGFwZV9Ob3RPcGVyYXRpb25hbCwgRUlPLCAiTm90IG9wZXJhdGlvbmFsIiB9LAorCXsgdmlvdGFwZV9Ob3RSZWFkeSwgRUlPLCAiTm90IHJlYWR5IiB9LAorCXsgdmlvdGFwZV9PcENhbmNlbGxlZCwgRUlPLCAiT3BlcmF0aW9uIGNhbmNlbGxlZCIgfSwKKwl7IHZpb3RhcGVfUGh5TGlua0VyciwgRUlPLCAiUGh5c2ljYWwgbGluayBlcnJvciIgfSwKKwl7IHZpb3RhcGVfUmR5Tm90Qk9ULCBFSU8sICJSZWFkeSBidXQgbm90IGJlZ2lubmluZyBvZiB0YXBlIiB9LAorCXsgdmlvdGFwZV9UYXBlTWFyaywgRUlPLCAiVGFwZSBtYXJrIiB9LAorCXsgdmlvdGFwZV9Xcml0ZVByb3QsIEVST0ZTLCAiV3JpdGUgcHJvdGVjdGlvbiBlcnJvciIgfSwKKwl7IDAsIDAsIE5VTEwgfSwKK307CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHRhcGVzIHdlIHN1cHBvcnQgKi8KKyNkZWZpbmUgVklPVEFQRV9NQVhfVEFQRQlIVk1BWEFSQ0hJVEVDVEVEVklSVFVBTFRBUEVTCisjZGVmaW5lIE1BWF9QQVJUSVRJT05TCQk0CisKKy8qIGRlZmluZXMgZm9yIGN1cnJlbnQgdGFwZSBzdGF0ZSAqLworI2RlZmluZSBWSU9UX0lETEUJCTAKKyNkZWZpbmUgVklPVF9SRUFESU5HCQkxCisjZGVmaW5lIFZJT1RfV1JJVElORwkJMgorCisvKiBPdXIgaW5mbyBvbiB0aGUgdGFwZXMgKi8KK3N0cnVjdCB0YXBlX2Rlc2NyIHsKKwljaGFyIHJzcmNuYW1lWzEwXTsKKwljaGFyIHR5cGVbNF07CisJY2hhciBtb2RlbFszXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFwZV9kZXNjciAqdmlvdGFwZV91bml0aW5mbzsKK3N0YXRpYyBkbWFfYWRkcl90IHZpb3RhcGVfdW5pdGluZm9fdG9rZW47CisKK3N0YXRpYyBzdHJ1Y3QgbXRnZXQgdmlvbXRnZXRbVklPVEFQRV9NQVhfVEFQRV07CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICp0YXBlX2NsYXNzOworCitzdGF0aWMgc3RydWN0IGRldmljZSAqdGFwZV9kZXZpY2VbVklPVEFQRV9NQVhfVEFQRV07CisKKy8qCisgKiBtYWludGFpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBlYWNoIHRhcGUgKGFuZCBwYXJ0aXRpb24pCisgKiBzbyB0aGF0IHdlIGtub3cgd2hlbiB0byB3cml0ZSBFT0YgbWFya3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIJY3VyX3BhcnQ7CisJaW50CQlkZXZfaGFuZGxlOworCXVuc2lnbmVkIGNoYXIJcGFydF9zdGF0X3J3aVtNQVhfUEFSVElUSU9OU107Cit9IHN0YXRlW1ZJT1RBUEVfTUFYX1RBUEVdOworCisvKiBXZSBzaW5nbGUtdGhyZWFkICovCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSByZXFTZW07CisKKy8qCisgKiBXaGVuIHdlIHNlbmQgYSByZXF1ZXN0LCB3ZSB1c2UgdGhpcyBzdHJ1Y3QgdG8gZ2V0IHRoZSByZXNwb25zZSBiYWNrCisgKiBmcm9tIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdHJ1Y3Qgb3Bfc3RydWN0IHsKKwl2b2lkCQkJKmJ1ZmZlcjsKKwlkbWFfYWRkcl90CQlkbWFhZGRyOworCXNpemVfdAkJCWNvdW50OworCWludAkJCXJjOworCWludAkJCW5vbl9ibG9ja2luZzsKKwlzdHJ1Y3QgY29tcGxldGlvbgljb207CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3Qgb3Bfc3RydWN0CSpuZXh0OworfTsKKworc3RhdGljIHNwaW5sb2NrX3QJb3Bfc3RydWN0X2xpc3RfbG9jazsKK3N0YXRpYyBzdHJ1Y3Qgb3Bfc3RydWN0CSpvcF9zdHJ1Y3RfbGlzdDsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiB0byByZXNvbHZlIGludGVyZGVwZW5kZW5jZSAqLworc3RhdGljIGludCBjaGdfc3RhdGUoaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyIG5ld19zdGF0ZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCisvKiBwcm9jZnMgc3VwcG9ydCAqLworc3RhdGljIGludCBwcm9jX3Zpb3RhcGVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJaW50IGk7CisKKwlzZXFfcHJpbnRmKG0sICJ2aW90YXBlIGRyaXZlciB2ZXJzaW9uICIgVklPVEFQRV9WRVJTSU9OICJcbiIpOworCWZvciAoaSA9IDA7IGkgPCB2aW90YXBlX251bWRldjsgaSsrKSB7CisJCXNlcV9wcmludGYobSwgInZpb3RhcGUgZGV2aWNlICVkIGlzIGlTZXJpZXMgcmVzb3VyY2UgJTEwLjEwcyIKKwkJCQkidHlwZSAlNC40cywgbW9kZWwgJTMuM3NcbiIsCisJCQkJaSwgdmlvdGFwZV91bml0aW5mb1tpXS5yc3JjbmFtZSwKKwkJCQl2aW90YXBlX3VuaXRpbmZvW2ldLnR5cGUsCisJCQkJdmlvdGFwZV91bml0aW5mb1tpXS5tb2RlbCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfdmlvdGFwZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX3Zpb3RhcGVfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdmlvdGFwZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHByb2NfdmlvdGFwZV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBEZWNvZGUgdGhlIGRldmljZSBtaW5vciBudW1iZXIgaW50byBpdHMgcGFydHMgKi8KK3ZvaWQgZ2V0X2Rldl9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgdmlvdF9kZXZpbmZvX3N0cnVjdCAqZGV2aSkKK3sKKwlkZXZpLT5kZXZubyA9IGltaW5vcihpbm8pICYgMHgxRjsKKwlkZXZpLT5tb2RlID0gKGltaW5vcihpbm8pICYgMHg2MCkgPj4gNTsKKwkvKiBpZiBiaXQgaXMgc2V0IGluIHRoZSBtaW5vciwgZG8gX25vdF8gcmV3aW5kIGF1dG9tYXRpY2FsbHkgKi8KKwlkZXZpLT5yZXdpbmQgPSAoaW1pbm9yKGlubykgJiAweDgwKSA9PSAwOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBvbmx5IGZyb20gdGhlIGV4aXQgYW5kIGluaXQgcGF0aHMsIHNvIG5vIG5lZWQgZm9yIGxvY2tpbmcgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX29wX3N0cnVjdF9wb29sKHZvaWQpCit7CisJd2hpbGUgKG9wX3N0cnVjdF9saXN0KSB7CisJCXN0cnVjdCBvcF9zdHJ1Y3QgKnRvRnJlZSA9IG9wX3N0cnVjdF9saXN0OworCQlvcF9zdHJ1Y3RfbGlzdCA9IG9wX3N0cnVjdF9saXN0LT5uZXh0OworCQlrZnJlZSh0b0ZyZWUpOworCX0KK30KKworLyogTGlrZXdpc2UsIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSB0aGUgaW5pdCBwYXRoICovCitzdGF0aWMgaW50IGFkZF9vcF9zdHJ1Y3RzKGludCBzdHJ1Y3RzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHN0cnVjdHM7ICsraSkgeworCQlzdHJ1Y3Qgb3Bfc3RydWN0ICpuZXdfc3RydWN0ID0KKwkJCWttYWxsb2Moc2l6ZW9mKCpuZXdfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X3N0cnVjdCkgeworCQkJY2xlYXJfb3Bfc3RydWN0X3Bvb2woKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW5ld19zdHJ1Y3QtPm5leHQgPSBvcF9zdHJ1Y3RfbGlzdDsKKwkJb3Bfc3RydWN0X2xpc3QgPSBuZXdfc3RydWN0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGUgYW4gb3Agc3RydWN0dXJlIGZyb20gb3VyIHBvb2wgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3Bfc3RydWN0ICpnZXRfb3Bfc3RydWN0KHZvaWQpCit7CisJc3RydWN0IG9wX3N0cnVjdCAqcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3Bfc3RydWN0X2xpc3RfbG9jaywgZmxhZ3MpOworCXJldHZhbCA9IG9wX3N0cnVjdF9saXN0OworCWlmIChyZXR2YWwpCisJCW9wX3N0cnVjdF9saXN0ID0gcmV0dmFsLT5uZXh0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wX3N0cnVjdF9saXN0X2xvY2ssIGZsYWdzKTsKKwlpZiAocmV0dmFsKSB7CisJCW1lbXNldChyZXR2YWwsIDAsIHNpemVvZigqcmV0dmFsKSk7CisJCWluaXRfY29tcGxldGlvbigmcmV0dmFsLT5jb20pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFJldHVybiBhbiBvcCBzdHJ1Y3R1cmUgdG8gb3VyIHBvb2wgKi8KK3N0YXRpYyB2b2lkIGZyZWVfb3Bfc3RydWN0KHN0cnVjdCBvcF9zdHJ1Y3QgKm9wX3N0cnVjdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9wX3N0cnVjdF9saXN0X2xvY2ssIGZsYWdzKTsKKwlvcF9zdHJ1Y3QtPm5leHQgPSBvcF9zdHJ1Y3RfbGlzdDsKKwlvcF9zdHJ1Y3RfbGlzdCA9IG9wX3N0cnVjdDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcF9zdHJ1Y3RfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIE1hcCBvdXIgdGFwZSByZXR1cm4gY29kZXMgdG8gZXJybm8gdmFsdWVzICovCitpbnQgdGFwZV9yY190b19lcnJubyhpbnQgdGFwZV9yYywgY2hhciAqb3BlcmF0aW9uLCBpbnQgdGFwZW5vKQoreworCWNvbnN0IHN0cnVjdCB2aW9fZXJyb3JfZW50cnkgKmVycjsKKworCWlmICh0YXBlX3JjID09IDApCisJCXJldHVybiAwOworCisJZXJyID0gdmlvX2xvb2t1cF9yYyh2aW90YXBlX2Vycl90YWJsZSwgdGFwZV9yYyk7CisJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJlcnJvciglcykgMHglMDR4IG9uIERldmljZSAlZCAoJS0xMHMpOiAlc1xuIiwKKwkJCW9wZXJhdGlvbiwgdGFwZV9yYywgdGFwZW5vLAorCQkJdmlvdGFwZV91bml0aW5mb1t0YXBlbm9dLnJzcmNuYW1lLCBlcnItPm1zZyk7CisJcmV0dXJuIC1lcnItPmVycm5vOworfQorCisvKiBHZXQgaW5mbyBvbiBhbGwgdGFwZXMgZnJvbSBPUy80MDAgKi8KK3N0YXRpYyBpbnQgZ2V0X3Zpb3RhcGVfaW5mbyh2b2lkKQoreworCUh2THBFdmVudF9SYyBodnJjOworCWludCBpOworCXNpemVfdCBsZW4gPSBzaXplb2YoKnZpb3RhcGVfdW5pdGluZm8pICogVklPVEFQRV9NQVhfVEFQRTsKKwlzdHJ1Y3Qgb3Bfc3RydWN0ICpvcCA9IGdldF9vcF9zdHJ1Y3QoKTsKKworCWlmIChvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZpb3RhcGVfdW5pdGluZm8gPSBkbWFfYWxsb2NfY29oZXJlbnQoaVNlcmllc192aW9fZGV2LCBsZW4sCisJCSZ2aW90YXBlX3VuaXRpbmZvX3Rva2VuLCBHRlBfQVRPTUlDKTsKKwlpZiAodmlvdGFwZV91bml0aW5mbyA9PSBOVUxMKSB7CisJCWZyZWVfb3Bfc3RydWN0KG9wKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHZpb3RhcGVfdW5pdGluZm8sIDAsIGxlbik7CisKKwlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QodmlvcGF0aF9ob3N0THAsCisJCQlIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW8sCisJCQl2aW9tYWpvcnN1YnR5cGVfdGFwZSB8IHZpb3RhcGVnZXRpbmZvLAorCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywgSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAorCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkodTY0KSAodW5zaWduZWQgbG9uZykgb3AsIFZJT1ZFUlNJT04gPDwgMTYsCisJCQl2aW90YXBlX3VuaXRpbmZvX3Rva2VuLCBsZW4sIDAsIDApOworCWlmIChodnJjICE9IEh2THBFdmVudF9SY19Hb29kKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiaHYgZXJyb3Igb24gb3AgJWRcbiIsCisJCQkJKGludClodnJjKTsKKwkJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKworCWZyZWVfb3Bfc3RydWN0KG9wKTsKKworCWZvciAoaSA9IDA7CisJICAgICAoKGkgPCBWSU9UQVBFX01BWF9UQVBFKSAmJiAodmlvdGFwZV91bml0aW5mb1tpXS5yc3JjbmFtZVswXSkpOworCSAgICAgaSsrKQorCQl2aW90YXBlX251bWRldisrOworCXJldHVybiAwOworfQorCisKKy8qIFdyaXRlICovCitzdGF0aWMgc3NpemVfdCB2aW90YXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCUh2THBFdmVudF9SYyBodnJjOworCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gZmlsZS0+Zl9mbGFnczsKKwlpbnQgbm9ibG9jayA9ICgoZmxhZ3MgJiBPX05PTkJMT0NLKSAhPSAwKTsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgdmlvdF9kZXZpbmZvX3N0cnVjdCBkZXZpOworCXN0cnVjdCBvcF9zdHJ1Y3QgKm9wID0gZ2V0X29wX3N0cnVjdCgpOworCisJaWYgKG9wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2V0X2Rldl9pbmZvKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCAmZGV2aSk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGNhbiBzZW5kIGEgcmVxdWVzdC4gIFdlIHVzZQorCSAqIGEgc2VtYXBob3JlIHRvIGtlZXAgdHJhY2sgb2YgIyByZXF1ZXN0cyBpbiB1c2UuICBJZgorCSAqIHdlIGFyZSBub24tYmxvY2tpbmcsIG1ha2Ugc3VyZSB3ZSBkb24ndCBibG9jayBvbiB0aGUKKwkgKiBzZW1hcGhvcmUKKwkgKi8KKwlpZiAobm9ibG9jaykgeworCQlpZiAoZG93bl90cnlsb2NrKCZyZXFTZW0pKSB7CisJCQlyZXQgPSAtRVdPVUxEQkxPQ0s7CisJCQlnb3RvIGZyZWVfb3A7CisJCX0KKwl9IGVsc2UKKwkJZG93bigmcmVxU2VtKTsKKworCS8qIEFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLworCW9wLT5kZXYgPSB0YXBlX2RldmljZVtkZXZpLmRldm5vXTsKKwlvcC0+YnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KG9wLT5kZXYsIGNvdW50LCAmb3AtPmRtYWFkZHIsCisJCQlHRlBfQVRPTUlDKTsKKworCWlmIChvcC0+YnVmZmVyID09IE5VTEwpIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOCisJCQkJImVycm9yIGFsbG9jYXRpbmcgZG1hIGJ1ZmZlciBmb3IgbGVuICVsZFxuIiwKKwkJCQljb3VudCk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gdXBfc2VtOworCX0KKworCS8qIENvcHkgdGhlIGRhdGEgaW50byB0aGUgYnVmZmVyICovCisJaWYgKGNvcHlfZnJvbV91c2VyKG9wLT5idWZmZXIsIGJ1ZiwgY291bnQpKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAidGFwZTogZXJyb3Igb24gY29weSBmcm9tIHVzZXJcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGZyZWVfZG1hOworCX0KKworCW9wLT5ub25fYmxvY2tpbmcgPSBub2Jsb2NrOworCWluaXRfY29tcGxldGlvbigmb3AtPmNvbSk7CisJb3AtPmNvdW50ID0gY291bnQ7CisKKwlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QodmlvcGF0aF9ob3N0THAsCisJCQlIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW8sCisJCQl2aW9tYWpvcnN1YnR5cGVfdGFwZSB8IHZpb3RhcGV3cml0ZSwKKwkJCUh2THBFdmVudF9BY2tJbmRfRG9BY2ssIEh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCXZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQl2aW9wYXRoX3RhcmdldGluc3QodmlvcGF0aF9ob3N0THApLAorCQkJKHU2NCkodW5zaWduZWQgbG9uZylvcCwgVklPVkVSU0lPTiA8PCAxNiwKKwkJCSgodTY0KWRldmkuZGV2bm8gPDwgNDgpIHwgb3AtPmRtYWFkZHIsIGNvdW50LCAwLCAwKTsKKwlpZiAoaHZyYyAhPSBIdkxwRXZlbnRfUmNfR29vZCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImh2IGVycm9yIG9uIG9wICVkXG4iLAorCQkJCShpbnQpaHZyYyk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZnJlZV9kbWE7CisJfQorCisJaWYgKG5vYmxvY2spCisJCXJldHVybiBjb3VudDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJaWYgKG9wLT5yYykKKwkJcmV0ID0gdGFwZV9yY190b19lcnJubyhvcC0+cmMsICJ3cml0ZSIsIGRldmkuZGV2bm8pOworCWVsc2UgeworCQljaGdfc3RhdGUoZGV2aS5kZXZubywgVklPVF9XUklUSU5HLCBmaWxlKTsKKwkJcmV0ID0gb3AtPmNvdW50OworCX0KKworZnJlZV9kbWE6CisJZG1hX2ZyZWVfY29oZXJlbnQob3AtPmRldiwgY291bnQsIG9wLT5idWZmZXIsIG9wLT5kbWFhZGRyKTsKK3VwX3NlbToKKwl1cCgmcmVxU2VtKTsKK2ZyZWVfb3A6CisJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCXJldHVybiByZXQ7Cit9CisKKy8qIHJlYWQgKi8KK3N0YXRpYyBzc2l6ZV90IHZpb3RhcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJbG9mZl90ICpwdHIpCit7CisJSHZMcEV2ZW50X1JjIGh2cmM7CisJdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzOworCXN0cnVjdCBvcF9zdHJ1Y3QgKm9wID0gZ2V0X29wX3N0cnVjdCgpOworCWludCBub2Jsb2NrID0gKChmbGFncyAmIE9fTk9OQkxPQ0spICE9IDApOworCXNzaXplX3QgcmV0OworCXN0cnVjdCB2aW90X2RldmluZm9fc3RydWN0IGRldmk7CisKKwlpZiAob3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnZXRfZGV2X2luZm8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKKworCS8qCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2FuIHNlbmQgYSByZXF1ZXN0LiAgV2UgdXNlCisJICogYSBzZW1hcGhvcmUgdG8ga2VlcCB0cmFjayBvZiAjIHJlcXVlc3RzIGluIHVzZS4gIElmCisJICogd2UgYXJlIG5vbi1ibG9ja2luZywgbWFrZSBzdXJlIHdlIGRvbid0IGJsb2NrIG9uIHRoZQorCSAqIHNlbWFwaG9yZQorCSAqLworCWlmIChub2Jsb2NrKSB7CisJCWlmIChkb3duX3RyeWxvY2soJnJlcVNlbSkpIHsKKwkJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJCWdvdG8gZnJlZV9vcDsKKwkJfQorCX0gZWxzZQorCQlkb3duKCZyZXFTZW0pOworCisJY2hnX3N0YXRlKGRldmkuZGV2bm8sIFZJT1RfUkVBRElORywgZmlsZSk7CisKKwkvKiBBbGxvY2F0ZSBhIERNQSBidWZmZXIgKi8KKwlvcC0+ZGV2ID0gdGFwZV9kZXZpY2VbZGV2aS5kZXZub107CisJb3AtPmJ1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudChvcC0+ZGV2LCBjb3VudCwgJm9wLT5kbWFhZGRyLAorCQkJR0ZQX0FUT01JQyk7CisJaWYgKG9wLT5idWZmZXIgPT0gTlVMTCkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIHVwX3NlbTsKKwl9CisKKwlvcC0+Y291bnQgPSBjb3VudDsKKwlpbml0X2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJaHZyYyA9IEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KHZpb3BhdGhfaG9zdExwLAorCQkJSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvLAorCQkJdmlvbWFqb3JzdWJ0eXBlX3RhcGUgfCB2aW90YXBlcmVhZCwKKwkJCUh2THBFdmVudF9BY2tJbmRfRG9BY2ssIEh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCXZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQl2aW9wYXRoX3RhcmdldGluc3QodmlvcGF0aF9ob3N0THApLAorCQkJKHU2NCkodW5zaWduZWQgbG9uZylvcCwgVklPVkVSU0lPTiA8PCAxNiwKKwkJCSgodTY0KWRldmkuZGV2bm8gPDwgNDgpIHwgb3AtPmRtYWFkZHIsIGNvdW50LCAwLCAwKTsKKwlpZiAoaHZyYyAhPSBIdkxwRXZlbnRfUmNfR29vZCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gInRhcGUgaHYgZXJyb3Igb24gb3AgJWRcbiIsCisJCQkJKGludClodnJjKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBmcmVlX2RtYTsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKworCWlmIChvcC0+cmMpCisJCXJldCA9IHRhcGVfcmNfdG9fZXJybm8ob3AtPnJjLCAicmVhZCIsIGRldmkuZGV2bm8pOworCWVsc2UgeworCQlyZXQgPSBvcC0+Y291bnQ7CisJCWlmIChyZXQgJiYgY29weV90b191c2VyKGJ1Ziwgb3AtPmJ1ZmZlciwgcmV0KSkgeworCQkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJlcnJvciBvbiBjb3B5X3RvX3VzZXJcbiIpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCX0KKworZnJlZV9kbWE6CisJZG1hX2ZyZWVfY29oZXJlbnQob3AtPmRldiwgY291bnQsIG9wLT5idWZmZXIsIG9wLT5kbWFhZGRyKTsKK3VwX3NlbToKKwl1cCgmcmVxU2VtKTsKK2ZyZWVfb3A6CisJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCXJldHVybiByZXQ7Cit9CisKKy8qIGlvY3RsICovCitzdGF0aWMgaW50IHZpb3RhcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJSHZMcEV2ZW50X1JjIGh2cmM7CisJaW50IHJldDsKKwlzdHJ1Y3QgdmlvdF9kZXZpbmZvX3N0cnVjdCBkZXZpOworCXN0cnVjdCBtdG9wIG10YzsKKwl1MzIgbXlPcDsKKwlzdHJ1Y3Qgb3Bfc3RydWN0ICpvcCA9IGdldF9vcF9zdHJ1Y3QoKTsKKworCWlmIChvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdldF9kZXZfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOworCisJZG93bigmcmVxU2VtKTsKKworCXJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTVRJT0NUT1A6CisJCXJldCA9IC1FRkFVTFQ7CisJCS8qCisJCSAqIGlub2RlIGlzIG51bGwgaWYgYW5kIG9ubHkgaWYgd2UgKHRoZSBrZXJuZWwpCisJCSAqIG1hZGUgdGhlIHJlcXVlc3QKKwkJICovCisJCWlmIChpbm9kZSA9PSBOVUxMKQorCQkJbWVtY3B5KCZtdGMsICh2b2lkICopIGFyZywgc2l6ZW9mKHN0cnVjdCBtdG9wKSk7CisJCWVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopJm10YywgKGNoYXIgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgbXRvcCkpKQorCQkJZ290byBmcmVlX29wOworCisJCXJldCA9IC1FSU87CisJCXN3aXRjaCAobXRjLm10X29wKSB7CisJCWNhc2UgTVRSRVNFVDoKKwkJCW15T3AgPSBWSU9UQVBPUF9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1URlNGOgorCQkJbXlPcCA9IFZJT1RBUE9QX0ZTRjsKKwkJCWJyZWFrOworCQljYXNlIE1UQlNGOgorCQkJbXlPcCA9IFZJT1RBUE9QX0JTRjsKKwkJCWJyZWFrOworCQljYXNlIE1URlNSOgorCQkJbXlPcCA9IFZJT1RBUE9QX0ZTUjsKKwkJCWJyZWFrOworCQljYXNlIE1UQlNSOgorCQkJbXlPcCA9IFZJT1RBUE9QX0JTUjsKKwkJCWJyZWFrOworCQljYXNlIE1UV0VPRjoKKwkJCW15T3AgPSBWSU9UQVBPUF9XRU9GOworCQkJYnJlYWs7CisJCWNhc2UgTVRSRVc6CisJCQlteU9wID0gVklPVEFQT1BfUkVXOworCQkJYnJlYWs7CisJCWNhc2UgTVROT1A6CisJCQlteU9wID0gVklPVEFQT1BfTk9QOworCQkJYnJlYWs7CisJCWNhc2UgTVRFT006CisJCQlteU9wID0gVklPVEFQT1BfRU9NOworCQkJYnJlYWs7CisJCWNhc2UgTVRFUkFTRToKKwkJCW15T3AgPSBWSU9UQVBPUF9FUkFTRTsKKwkJCWJyZWFrOworCQljYXNlIE1UU0VUQkxLOgorCQkJbXlPcCA9IFZJT1RBUE9QX1NFVEJMSzsKKwkJCWJyZWFrOworCQljYXNlIE1UU0VUREVOU0lUWToKKwkJCW15T3AgPSBWSU9UQVBPUF9TRVRERU5TSVRZOworCQkJYnJlYWs7CisJCWNhc2UgTVRURUxMOgorCQkJbXlPcCA9IFZJT1RBUE9QX0dFVFBPUzsKKwkJCWJyZWFrOworCQljYXNlIE1UU0VFSzoKKwkJCW15T3AgPSBWSU9UQVBPUF9TRVRQT1M7CisJCQlicmVhazsKKwkJY2FzZSBNVFNFVFBBUlQ6CisJCQlteU9wID0gVklPVEFQT1BfU0VUUEFSVDsKKwkJCWJyZWFrOworCQljYXNlIE1UT0ZGTDoKKwkJCW15T3AgPSBWSU9UQVBPUF9VTkxPQUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiTVRJT0NUT1AgY2FsbGVkICIKKwkJCQkJIndpdGggaW52YWxpZCBvcCAweCV4XG4iLCBtdGMubXRfb3ApOworCQkJZ290byBmcmVlX29wOworCQl9CisKKwkJLyoKKwkJICogaWYgd2UgbW92ZWQgdGhlIGhlYWQsIHdlIGFyZSBubyBsb25nZXIKKwkJICogcmVhZGluZyBvciB3cml0aW5nCisJCSAqLworCQlzd2l0Y2ggKG10Yy5tdF9vcCkgeworCQljYXNlIE1URlNGOgorCQljYXNlIE1UQlNGOgorCQljYXNlIE1URlNSOgorCQljYXNlIE1UQlNSOgorCQljYXNlIE1UVEVMTDoKKwkJY2FzZSBNVFNFRUs6CisJCWNhc2UgTVRSRVc6CisJCQljaGdfc3RhdGUoZGV2aS5kZXZubywgVklPVF9JRExFLCBmaWxlKTsKKwkJfQorCisJCWluaXRfY29tcGxldGlvbigmb3AtPmNvbSk7CisJCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdCh2aW9wYXRoX2hvc3RMcCwKKwkJCQlIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW8sCisJCQkJdmlvbWFqb3JzdWJ0eXBlX3RhcGUgfCB2aW90YXBlb3AsCisJCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywKKwkJCQlIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCQl2aW9wYXRoX3RhcmdldGluc3QodmlvcGF0aF9ob3N0THApLAorCQkJCSh1NjQpKHVuc2lnbmVkIGxvbmcpb3AsCisJCQkJVklPVkVSU0lPTiA8PCAxNiwKKwkJCQkoKHU2NClkZXZpLmRldm5vIDw8IDQ4KSwgMCwKKwkJCQkoKCh1NjQpbXlPcCkgPDwgMzIpIHwgbXRjLm10X2NvdW50LCAwKTsKKwkJaWYgKGh2cmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpIHsKKwkJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiaHYgZXJyb3Igb24gb3AgJWRcbiIsCisJCQkJCShpbnQpaHZyYyk7CisJCQlnb3RvIGZyZWVfb3A7CisJCX0KKwkJd2FpdF9mb3JfY29tcGxldGlvbigmb3AtPmNvbSk7CisJCXJldCA9IHRhcGVfcmNfdG9fZXJybm8ob3AtPnJjLCAidGFwZSBvcGVyYXRpb24iLCBkZXZpLmRldm5vKTsKKwkJZ290byBmcmVlX29wOworCisJY2FzZSBNVElPQ0dFVDoKKwkJcmV0ID0gLUVJTzsKKwkJaW5pdF9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKwkJaHZyYyA9IEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KHZpb3BhdGhfaG9zdExwLAorCQkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCQl2aW9tYWpvcnN1YnR5cGVfdGFwZSB8IHZpb3RhcGVnZXRzdGF0dXMsCisJCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywKKwkJCQlIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCQl2aW9wYXRoX3RhcmdldGluc3QodmlvcGF0aF9ob3N0THApLAorCQkJCSh1NjQpKHVuc2lnbmVkIGxvbmcpb3AsIFZJT1ZFUlNJT04gPDwgMTYsCisJCQkJKCh1NjQpZGV2aS5kZXZubyA8PCA0OCksIDAsIDAsIDApOworCQlpZiAoaHZyYyAhPSBIdkxwRXZlbnRfUmNfR29vZCkgeworCQkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJodiBlcnJvciBvbiBvcCAlZFxuIiwKKwkJCQkJKGludClodnJjKTsKKwkJCWdvdG8gZnJlZV9vcDsKKwkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKworCQkvKiBPcGVyYXRpb24gaXMgY29tcGxldGUgLSBncmFiIHRoZSBlcnJvciBjb2RlICovCisJCXJldCA9IHRhcGVfcmNfdG9fZXJybm8ob3AtPnJjLCAiZ2V0IHN0YXR1cyIsIGRldmkuZGV2bm8pOworCQlmcmVlX29wX3N0cnVjdChvcCk7CisJCXVwKCZyZXFTZW0pOworCisJCWlmICgocmV0ID09IDApICYmIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJJnZpb210Z2V0W2RldmkuZGV2bm9dLAorCQkJCQlzaXplb2YodmlvbXRnZXRbMF0pKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCXJldHVybiByZXQ7CisJY2FzZSBNVElPQ1BPUzoKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJHb3QgYW4gKHVuc3VwcG9ydGVkKSBNVElPQ1BPU1xuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiZ290IGFuIHVuc3VwcG9ydGVkIGlvY3RsIDB4JTB4XG4iLAorCQkJCWNtZCk7CisJCWJyZWFrOworCX0KKworZnJlZV9vcDoKKwlmcmVlX29wX3N0cnVjdChvcCk7CisJdXAoJnJlcVNlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aW90YXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlIdkxwRXZlbnRfUmMgaHZyYzsKKwlzdHJ1Y3QgdmlvdF9kZXZpbmZvX3N0cnVjdCBkZXZpOworCWludCByZXQ7CisJc3RydWN0IG9wX3N0cnVjdCAqb3AgPSBnZXRfb3Bfc3RydWN0KCk7CisKKwlpZiAob3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnZXRfZGV2X2luZm8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKKworCS8qIE5vdGU6IFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgb25lIG1vZGUhICovCisJaWYgKChkZXZpLmRldm5vID49IHZpb3RhcGVfbnVtZGV2KSB8fCAoZGV2aS5tb2RlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfb3A7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKworCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdCh2aW9wYXRoX2hvc3RMcCwKKwkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCXZpb21ham9yc3VidHlwZV90YXBlIHwgdmlvdGFwZW9wZW4sCisJCQlIdkxwRXZlbnRfQWNrSW5kX0RvQWNrLCBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQl2aW9wYXRoX3NvdXJjZWluc3QodmlvcGF0aF9ob3N0THApLAorCQkJdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCSh1NjQpKHVuc2lnbmVkIGxvbmcpb3AsIFZJT1ZFUlNJT04gPDwgMTYsCisJCQkoKHU2NClkZXZpLmRldm5vIDw8IDQ4KSwgMCwgMCwgMCk7CisJaWYgKGh2cmMgIT0gMCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImJhZCByYyBvbiBzaWduYWxMcEV2ZW50ICVkXG4iLAorCQkJCShpbnQpIGh2cmMpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZyZWVfb3A7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmb3AtPmNvbSk7CisJcmV0ID0gdGFwZV9yY190b19lcnJubyhvcC0+cmMsICJvcGVuIiwgZGV2aS5kZXZubyk7CisKK2ZyZWVfb3A6CisJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB2aW90YXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlIdkxwRXZlbnRfUmMgaHZyYzsKKwlzdHJ1Y3QgdmlvdF9kZXZpbmZvX3N0cnVjdCBkZXZpOworCWludCByZXQgPSAwOworCXN0cnVjdCBvcF9zdHJ1Y3QgKm9wID0gZ2V0X29wX3N0cnVjdCgpOworCisJaWYgKG9wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWluaXRfY29tcGxldGlvbigmb3AtPmNvbSk7CisKKwlnZXRfZGV2X2luZm8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKKworCWlmIChkZXZpLmRldm5vID49IHZpb3RhcGVfbnVtZGV2KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9vcDsKKwl9CisKKwljaGdfc3RhdGUoZGV2aS5kZXZubywgVklPVF9JRExFLCBmaWxlKTsKKworCWlmIChkZXZpLnJld2luZCkgeworCQlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QodmlvcGF0aF9ob3N0THAsCisJCQkJSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvLAorCQkJCXZpb21ham9yc3VidHlwZV90YXBlIHwgdmlvdGFwZW9wLAorCQkJCUh2THBFdmVudF9BY2tJbmRfRG9BY2ssCisJCQkJSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAorCQkJCXZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkJdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCQkodTY0KSh1bnNpZ25lZCBsb25nKW9wLCBWSU9WRVJTSU9OIDw8IDE2LAorCQkJCSgodTY0KWRldmkuZGV2bm8gPDwgNDgpLCAwLAorCQkJCSgodTY0KVZJT1RBUE9QX1JFVykgPDwgMzIsIDApOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKworCQl0YXBlX3JjX3RvX2Vycm5vKG9wLT5yYywgInJld2luZCIsIGRldmkuZGV2bm8pOworCX0KKworCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdCh2aW9wYXRoX2hvc3RMcCwKKwkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCXZpb21ham9yc3VidHlwZV90YXBlIHwgdmlvdGFwZWNsb3NlLAorCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywgSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAorCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkodTY0KSh1bnNpZ25lZCBsb25nKW9wLCBWSU9WRVJTSU9OIDw8IDE2LAorCQkJKCh1NjQpZGV2aS5kZXZubyA8PCA0OCksIDAsIDAsIDApOworCWlmIChodnJjICE9IDApIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJiYWQgcmMgb24gc2lnbmFsTHBFdmVudCAlZFxuIiwKKwkJCQkoaW50KSBodnJjKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBmcmVlX29wOworCX0KKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJaWYgKG9wLT5yYykKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJjbG9zZSBmYWlsZWRcbiIpOworCitmcmVlX29wOgorCWZyZWVfb3Bfc3RydWN0KG9wKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpb3RhcF9mb3BzID0geworCW93bmVyOiBUSElTX01PRFVMRSwKKwlyZWFkOiB2aW90YXBfcmVhZCwKKwl3cml0ZTogdmlvdGFwX3dyaXRlLAorCWlvY3RsOiB2aW90YXBfaW9jdGwsCisJb3BlbjogdmlvdGFwX29wZW4sCisJcmVsZWFzZTogdmlvdGFwX3JlbGVhc2UsCit9OworCisvKiBIYW5kbGUgaW50ZXJydXB0IGV2ZW50cyBmb3IgdGFwZSAqLworc3RhdGljIHZvaWQgdmlvSGFuZGxlVGFwZUV2ZW50KHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCWludCB0YXBlbWlub3I7CisJc3RydWN0IG9wX3N0cnVjdCAqb3A7CisJc3RydWN0IHZpb3RhcGVscGV2ZW50ICp0ZXZlbnQgPSAoc3RydWN0IHZpb3RhcGVscGV2ZW50ICopZXZlbnQ7CisKKwlpZiAoZXZlbnQgPT0gTlVMTCkgeworCQkvKiBOb3RpZmljYXRpb24gdGhhdCBhIHBhcnRpdGlvbiB3ZW50IGF3YXkhICovCisJCWlmICghdmlvcGF0aF9pc2FjdGl2ZSh2aW9wYXRoX2hvc3RMcCkpIHsKKwkJCS8qIFRPRE8hIENsZWFuIHVwICovCisJCX0KKwkJcmV0dXJuOworCX0KKworCXRhcGVtaW5vciA9IGV2ZW50LT54U3VidHlwZSAmIFZJT01JTk9SX1NVQlRZUEVfTUFTSzsKKwlvcCA9IChzdHJ1Y3Qgb3Bfc3RydWN0ICopZXZlbnQtPnhDb3JyZWxhdGlvblRva2VuOworCXN3aXRjaCAodGFwZW1pbm9yKSB7CisJY2FzZSB2aW90YXBlZ2V0aW5mbzoKKwljYXNlIHZpb3RhcGVvcGVuOgorCWNhc2UgdmlvdGFwZWNsb3NlOgorCQlvcC0+cmMgPSB0ZXZlbnQtPnN1Yl90eXBlX3Jlc3VsdDsKKwkJY29tcGxldGUoJm9wLT5jb20pOworCQlicmVhazsKKwljYXNlIHZpb3RhcGVyZWFkOgorCQlvcC0+cmMgPSB0ZXZlbnQtPnN1Yl90eXBlX3Jlc3VsdDsKKwkJb3AtPmNvdW50ID0gdGV2ZW50LT5sZW47CisJCWNvbXBsZXRlKCZvcC0+Y29tKTsKKwkJYnJlYWs7CisJY2FzZSB2aW90YXBld3JpdGU6CisJCWlmIChvcC0+bm9uX2Jsb2NraW5nKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChvcC0+ZGV2LCBvcC0+Y291bnQsCisJCQkJCW9wLT5idWZmZXIsIG9wLT5kbWFhZGRyKTsKKwkJCWZyZWVfb3Bfc3RydWN0KG9wKTsKKwkJCXVwKCZyZXFTZW0pOworCQl9IGVsc2UgeworCQkJb3AtPnJjID0gdGV2ZW50LT5zdWJfdHlwZV9yZXN1bHQ7CisJCQlvcC0+Y291bnQgPSB0ZXZlbnQtPmxlbjsKKwkJCWNvbXBsZXRlKCZvcC0+Y29tKTsKKwkJfQorCQlicmVhazsKKwljYXNlIHZpb3RhcGVvcDoKKwljYXNlIHZpb3RhcGVnZXRwb3M6CisJY2FzZSB2aW90YXBlc2V0cG9zOgorCWNhc2UgdmlvdGFwZWdldHN0YXR1czoKKwkJaWYgKG9wKSB7CisJCQlvcC0+Y291bnQgPSB0ZXZlbnQtPnUub3AuY291bnQ7CisJCQlvcC0+cmMgPSB0ZXZlbnQtPnN1Yl90eXBlX3Jlc3VsdDsKKwkJCWlmICghb3AtPm5vbl9ibG9ja2luZykKKwkJCQljb21wbGV0ZSgmb3AtPmNvbSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJ3ZWlyZCBhY2tcbiIpOworCX0KK30KKworc3RhdGljIGludCB2aW90YXBlX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJY2hhciB0YXBlbmFtZVszMl07CisJaW50IGkgPSB2ZGV2LT51bml0X2FkZHJlc3M7CisJaW50IGo7CisKKwlpZiAoaSA+PSB2aW90YXBlX251bWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0YXBlX2RldmljZVtpXSA9ICZ2ZGV2LT5kZXY7CisKKwlzdGF0ZVtpXS5jdXJfcGFydCA9IDA7CisJZm9yIChqID0gMDsgaiA8IE1BWF9QQVJUSVRJT05TOyArK2opCisJCXN0YXRlW2ldLnBhcnRfc3RhdF9yd2lbal0gPSBWSU9UX0lETEU7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodGFwZV9jbGFzcywgTUtERVYoVklPVEFQRV9NQUpPUiwgaSksIE5VTEwsCisJCQkiaXNlcmllcyF2dCVkIiwgaSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodGFwZV9jbGFzcywgTUtERVYoVklPVEFQRV9NQUpPUiwgaSB8IDB4ODApLAorCQkJTlVMTCwgImlzZXJpZXMhbnZ0JWQiLCBpKTsKKwlkZXZmc19ta19jZGV2KE1LREVWKFZJT1RBUEVfTUFKT1IsIGkpLCBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkiaXNlcmllcy92dCVkIiwgaSk7CisJZGV2ZnNfbWtfY2RldihNS0RFVihWSU9UQVBFX01BSk9SLCBpIHwgMHg4MCksCisJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsICJpc2VyaWVzL252dCVkIiwgaSk7CisJc3ByaW50Zih0YXBlbmFtZSwgImlzZXJpZXMvdnQlZCIsIGkpOworCXN0YXRlW2ldLmRldl9oYW5kbGUgPSBkZXZmc19yZWdpc3Rlcl90YXBlKHRhcGVuYW1lKTsKKwlwcmludGsoVklPVEFQRV9LRVJOX0lORk8gInRhcGUgJXMgaXMgaVNlcmllcyAiCisJCQkicmVzb3VyY2UgJTEwLjEwcyB0eXBlICU0LjRzLCBtb2RlbCAlMy4zc1xuIiwKKwkJCXRhcGVuYW1lLCB2aW90YXBlX3VuaXRpbmZvW2ldLnJzcmNuYW1lLAorCQkJdmlvdGFwZV91bml0aW5mb1tpXS50eXBlLCB2aW90YXBlX3VuaXRpbmZvW2ldLm1vZGVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW90YXBlX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlpbnQgaSA9IHZkZXYtPnVuaXRfYWRkcmVzczsKKworCWRldmZzX3JlbW92ZSgiaXNlcmllcy9udnQlZCIsIGkpOworCWRldmZzX3JlbW92ZSgiaXNlcmllcy92dCVkIiwgaSk7CisJZGV2ZnNfdW5yZWdpc3Rlcl90YXBlKHN0YXRlW2ldLmRldl9oYW5kbGUpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFZJT1RBUEVfTUFKT1IsIGkgfCAweDgwKSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoVklPVEFQRV9NQUpPUiwgaSkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHZpb3RhcGVfZGV2aWNlX3RhYmxlOiBVc2VkIGJ5IHZpby5jIHRvIG1hdGNoIGRldmljZXMgdGhhdCB3ZQorICogc3VwcG9ydC4KKyAqLworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZpb3RhcGVfZGV2aWNlX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJ2aW90YXBlIiwgIiIgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2aW90YXBlX2RldmljZV90YWJsZSk7CitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgdmlvdGFwZV9kcml2ZXIgPSB7CisJLm5hbWUgPSAidmlvdGFwZSIsCisJLmlkX3RhYmxlID0gdmlvdGFwZV9kZXZpY2VfdGFibGUsCisJLnByb2JlID0gdmlvdGFwZV9wcm9iZSwKKwkucmVtb3ZlID0gdmlvdGFwZV9yZW1vdmUKK307CisKKworaW50IF9faW5pdCB2aW90YXBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCisJb3Bfc3RydWN0X2xpc3QgPSBOVUxMOworCWlmICgocmV0ID0gYWRkX29wX3N0cnVjdHMoVklPVEFQRV9NQVhSRVEpKSA8IDApIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJjb3VsZG4ndCBhbGxvY2F0ZSBvcCBzdHJ1Y3RzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJm9wX3N0cnVjdF9saXN0X2xvY2spOworCisJc2VtYV9pbml0KCZyZXFTZW0sIFZJT1RBUEVfTUFYUkVRKTsKKworCWlmICh2aW9wYXRoX2hvc3RMcCA9PSBIdkxwSW5kZXhJbnZhbGlkKSB7CisJCXZpb19zZXRfaG9zdGxwKCk7CisJCWlmICh2aW9wYXRoX2hvc3RMcCA9PSBIdkxwSW5kZXhJbnZhbGlkKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBjbGVhcl9vcDsKKwkJfQorCX0KKworCXJldCA9IHZpb3BhdGhfb3Blbih2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX3RhcGUsCisJCQlWSU9UQVBFX01BWFJFUSArIDIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOCisJCQkJImVycm9yIG9uIHZpb3BhdGhfb3BlbiB0byBob3N0bHAgJWRcbiIsIHJldCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gY2xlYXJfb3A7CisJfQorCisJcHJpbnRrKFZJT1RBUEVfS0VSTl9JTkZPICJ2ZXJzICIgVklPVEFQRV9WRVJTSU9OCisJCQkiLCBob3N0aW5nIHBhcnRpdGlvbiAlZFxuIiwgdmlvcGF0aF9ob3N0THApOworCisJdmlvX3NldEhhbmRsZXIodmlvbWFqb3JzdWJ0eXBlX3RhcGUsIHZpb0hhbmRsZVRhcGVFdmVudCk7CisKKwlyZXQgPSByZWdpc3Rlcl9jaHJkZXYoVklPVEFQRV9NQUpPUiwgInZpb3RhcGUiLCAmdmlvdGFwX2ZvcHMpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiRXJyb3IgcmVnaXN0ZXJpbmcgdmlvdGFwZSBkZXZpY2VcbiIpOworCQlnb3RvIGNsZWFyX2hhbmRsZXI7CisJfQorCisJdGFwZV9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJ0YXBlIik7CisJaWYgKElTX0VSUih0YXBlX2NsYXNzKSkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gIlVuYWJsZSB0byBhbGxvY2F0IGNsYXNzXG4iKTsKKwkJcmV0ID0gUFRSX0VSUih0YXBlX2NsYXNzKTsKKwkJZ290byB1bnJlZ19jaHJkZXY7CisJfQorCisJaWYgKChyZXQgPSBnZXRfdmlvdGFwZV9pbmZvKCkpIDwgMCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gIlVuYWJsZSB0byBvYnRhaW4gdmlydHVhbCBkZXZpY2UgaW5mb3JtYXRpb24iKTsKKwkJZ290byB1bnJlZ19jbGFzczsKKwl9CisKKwlyZXQgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2aW90YXBlX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byB1bnJlZ19jbGFzczsKKworCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiaVNlcmllcy92aW90YXBlIiwgU19JRlJFR3xTX0lSVUdPLCBOVUxMKTsKKwlpZiAoZSkgeworCQllLT5vd25lciA9IFRISVNfTU9EVUxFOworCQllLT5wcm9jX2ZvcHMgPSAmcHJvY192aW90YXBlX29wZXJhdGlvbnM7CisJfQorCisJcmV0dXJuIDA7CisKK3VucmVnX2NsYXNzOgorCWNsYXNzX3NpbXBsZV9kZXN0cm95KHRhcGVfY2xhc3MpOwordW5yZWdfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KFZJT1RBUEVfTUFKT1IsICJ2aW90YXBlIik7CitjbGVhcl9oYW5kbGVyOgorCXZpb19jbGVhckhhbmRsZXIodmlvbWFqb3JzdWJ0eXBlX3RhcGUpOworCXZpb3BhdGhfY2xvc2UodmlvcGF0aF9ob3N0THAsIHZpb21ham9yc3VidHlwZV90YXBlLCBWSU9UQVBFX01BWFJFUSArIDIpOworY2xlYXJfb3A6CisJY2xlYXJfb3Bfc3RydWN0X3Bvb2woKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBHaXZlIGEgbmV3IHN0YXRlIHRvIHRoZSB0YXBlIG9iamVjdCAqLworc3RhdGljIGludCBjaGdfc3RhdGUoaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyIG5ld19zdGF0ZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgY2hhciAqY3VyX3N0YXRlID0KKwkgICAgJnN0YXRlW2luZGV4XS5wYXJ0X3N0YXRfcndpW3N0YXRlW2luZGV4XS5jdXJfcGFydF07CisJaW50IHJjID0gMDsKKworCS8qIGlmIHRoZSBzYW1lIHN0YXRlLCBkb24ndCBib3RoZXIgKi8KKwlpZiAoKmN1cl9zdGF0ZSA9PSBuZXdfc3RhdGUpCisJCXJldHVybiAwOworCisJLyogd3JpdGUgYW4gRU9GIGlmIGNoYW5naW5nIGZyb20gd3JpdGluZyB0byBzb21lIG90aGVyIHN0YXRlICovCisJaWYgKCpjdXJfc3RhdGUgPT0gVklPVF9XUklUSU5HKSB7CisJCXN0cnVjdCBtdG9wIHdyaXRlX2VvZiA9IHsgTVRXRU9GLCAxIH07CisKKwkJcmMgPSB2aW90YXBfaW9jdGwoTlVMTCwgZmlsZSwgTVRJT0NUT1AsCisJCQkJICAodW5zaWduZWQgbG9uZykmd3JpdGVfZW9mKTsKKwl9CisJKmN1cl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIENsZWFudXAgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB2aW90YXBfZXhpdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZW1vdmVfcHJvY19lbnRyeSgiaVNlcmllcy92aW90YXBlIiwgTlVMTCk7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2aW90YXBlX2RyaXZlcik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kodGFwZV9jbGFzcyk7CisJcmV0ID0gdW5yZWdpc3Rlcl9jaHJkZXYoVklPVEFQRV9NQUpPUiwgInZpb3RhcGUiKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJFcnJvciB1bnJlZ2lzdGVyaW5nIGRldmljZTogJWRcbiIsCisJCQkJcmV0KTsKKwlpZiAodmlvdGFwZV91bml0aW5mbykKKwkJZG1hX2ZyZWVfY29oZXJlbnQoaVNlcmllc192aW9fZGV2LAorCQkJCXNpemVvZih2aW90YXBlX3VuaXRpbmZvWzBdKSAqIFZJT1RBUEVfTUFYX1RBUEUsCisJCQkJdmlvdGFwZV91bml0aW5mbywgdmlvdGFwZV91bml0aW5mb190b2tlbik7CisJdmlvcGF0aF9jbG9zZSh2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX3RhcGUsIFZJT1RBUEVfTUFYUkVRICsgMik7CisJdmlvX2NsZWFySGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfdGFwZSk7CisJY2xlYXJfb3Bfc3RydWN0X3Bvb2woKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQodmlvdGFwX2luaXQpOworbW9kdWxlX2V4aXQodmlvdGFwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYyBiL2RyaXZlcnMvY2hhci92bWVfc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliYTgzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92bWVfc2NjLmMKQEAgLTAsMCArMSwxMDU2IEBACisvKgorICogZHJpdmVycy9jaGFyL3ZtZV9zY2MuYzogTVZNRTE0NywgTVZNRTE2MiwgQlZNRTYwMDAgU0NDIHNlcmlhbCBwb3J0cworICogaW1wbGVtZW50YXRpb24uCisgKiBDb3B5cmlnaHQgMTk5OSBSaWNoYXJkIEhpcnN0IDxyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWs+CisgKgorICogQmFzZWQgb24gYXRhcmlfU0NDLmMgd2hpY2ggd2FzCisgKiAgIENvcHlyaWdodCAxOTk0LTk1IFJvbWFuIEhvZGVrIDxSb21hbi5Ib2Rla0BpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKyAqICAgUGFydGlhbGx5IGJhc2VkIG9uIFBDLUxpbnV4IHNlcmlhbC5jIGJ5IExpbnVzIFRvcnZhbGRzIGFuZCBUaGVvZG9yZSBUcydvCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisKKyNpZmRlZiBDT05GSUdfTVZNRTE0N19TQ0MKKyNpbmNsdWRlIDxhc20vbXZtZTE0N2h3Lmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZNRTE2Ml9TQ0MKKyNpbmNsdWRlIDxhc20vbXZtZTE2eGh3Lmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlZNRTYwMDBfU0NDCisjaW5jbHVkZSA8YXNtL2J2bWU2MDAwaHcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKyNpbmNsdWRlICJzY2MuaCIKKworCisjZGVmaW5lIENIQU5ORUxfQQkwCisjZGVmaW5lIENIQU5ORUxfQgkxCisKKyNkZWZpbmUgU0NDX01JTk9SX0JBU0UJNjQKKworLyogU2hhZG93cyBmb3IgYWxsIFNDQyB3cml0ZSByZWdpc3RlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNjY19zaGFkb3dbMl1bMTZdOworCisvKiBMb2NhdGlvbiB0byBhY2Nlc3MgZm9yIFNDQyByZWdpc3RlciBhY2Nlc3MgZGVsYXkgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpzY2NfZGVsID0gTlVMTDsKKworLyogVG8ga2VlcCB0cmFjayBvZiBTVEFUVVNfUkVHIHN0YXRlIGZvciBkZXRlY3Rpb24gb2YgRXh0L1N0YXR1cyBpbnQgc291cmNlICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzY2NfbGFzdF9zdGF0dXNfcmVnWzJdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgc2NjX2Rpc2FibGVfdHhfaW50ZXJydXB0cyh2b2lkICogcHRyKTsKK3N0YXRpYyB2b2lkIHNjY19lbmFibGVfdHhfaW50ZXJydXB0cyh2b2lkICogcHRyKTsKK3N0YXRpYyB2b2lkIHNjY19kaXNhYmxlX3J4X2ludGVycnVwdHModm9pZCAqIHB0cik7CitzdGF0aWMgdm9pZCBzY2NfZW5hYmxlX3J4X2ludGVycnVwdHModm9pZCAqIHB0cik7CitzdGF0aWMgaW50ICBzY2NfZ2V0X0NEKHZvaWQgKiBwdHIpOworc3RhdGljIHZvaWQgc2NjX3NodXRkb3duX3BvcnQodm9pZCAqIHB0cik7CitzdGF0aWMgaW50IHNjY19zZXRfcmVhbF90ZXJtaW9zKHZvaWQgICpwdHIpOworc3RhdGljIHZvaWQgc2NjX2h1bmd1cCh2b2lkICAqcHRyKTsKK3N0YXRpYyB2b2lkIHNjY19jbG9zZSh2b2lkICAqcHRyKTsKK3N0YXRpYyBpbnQgc2NjX2NoYXJzX2luX2J1ZmZlcih2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgc2NjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CitzdGF0aWMgaW50IHNjY19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgc2NjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgc2NjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX3R4X2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlycXJldHVybl90IHNjY19yeF9pbnQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2Nfc3RhdF9pbnQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2Nfc3Bjb25kX2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIHZvaWQgc2NjX3NldHNpZ25hbHMoc3RydWN0IHNjY19wb3J0ICpwb3J0LCBpbnQgZHRyLCBpbnQgcnRzKTsKK3N0YXRpYyB2b2lkIHNjY19icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzY2NfZHJpdmVyOworCitzdHJ1Y3Qgc2NjX3BvcnQgc2NjX3BvcnRzWzJdOworCitpbnQgc2NjX2luaXRpYWxpemVkID0gMDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVyZmFjZSBmcm9tIGdlbmVyaWNfc2VyaWFsLmMgYmFjayBoZXJlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCByZWFsX2RyaXZlciBzY2NfcmVhbF9kcml2ZXIgPSB7CisgICAgICAgIHNjY19kaXNhYmxlX3R4X2ludGVycnVwdHMsCisgICAgICAgIHNjY19lbmFibGVfdHhfaW50ZXJydXB0cywKKyAgICAgICAgc2NjX2Rpc2FibGVfcnhfaW50ZXJydXB0cywKKyAgICAgICAgc2NjX2VuYWJsZV9yeF9pbnRlcnJ1cHRzLAorICAgICAgICBzY2NfZ2V0X0NELAorICAgICAgICBzY2Nfc2h1dGRvd25fcG9ydCwKKyAgICAgICAgc2NjX3NldF9yZWFsX3Rlcm1pb3MsCisgICAgICAgIHNjY19jaGFyc19pbl9idWZmZXIsCisgICAgICAgIHNjY19jbG9zZSwKKyAgICAgICAgc2NjX2h1bmd1cCwKKyAgICAgICAgTlVMTAorfTsKKworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNjY19vcHMgPSB7CisJLm9wZW4JPSBzY2Nfb3BlbiwKKwkuY2xvc2UgPSBnc19jbG9zZSwKKwkud3JpdGUgPSBnc193cml0ZSwKKwkucHV0X2NoYXIgPSBnc19wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBnc19mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IGdzX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IGdzX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gZ3NfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IHNjY19pb2N0bCwKKwkudGhyb3R0bGUgPSBzY2NfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBzY2NfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBnc19zZXRfdGVybWlvcywKKwkuc3RvcCA9IGdzX3N0b3AsCisJLnN0YXJ0ID0gZ3Nfc3RhcnQsCisJLmhhbmd1cCA9IGdzX2hhbmd1cCwKKwkuYnJlYWtfY3RsID0gc2NjX2JyZWFrX2N0bCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdm1lX3NjY19pbml0KCkgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc2NjX2luaXRfZHJpdmVycyh2b2lkKQoreworCWludCBlcnJvcjsKKworCXNjY19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKDIpOworCWlmICghc2NjX2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJc2NjX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzY2NfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJzY2MiOworCXNjY19kcml2ZXItPm5hbWUgPSAidHR5UyI7CisJc2NjX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvIjsKKwlzY2NfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKKwlzY2NfZHJpdmVyLT5taW5vcl9zdGFydCA9IFNDQ19NSU5PUl9CQVNFOworCXNjY19kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXNjY19kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc2NjX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXNjY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgIEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzY2NfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHNjY19kcml2ZXIsICZzY2Nfb3BzKTsKKworCWlmICgoZXJyb3IgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHNjY19kcml2ZXIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNjYzogQ291bGRuJ3QgcmVnaXN0ZXIgc2NjIGRyaXZlciwgZXJyb3IgPSAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2NjX2RyaXZlcik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIHBvcnRzW10gYXJyYXkgaXMgaW5kZXhlZCBieSBsaW5lIG5vIChpLmUuIFswXSBmb3IgdHR5UzAsIFsxXSBmb3IgdHR5UzEpLgorICovCisKK3N0YXRpYyB2b2lkIHNjY19pbml0X3BvcnRzdHJ1Y3RzKHZvaWQpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlwb3J0ID0gc2NjX3BvcnRzICsgaTsKKwkJcG9ydC0+Z3MubWFnaWMgPSBTQ0NfTUFHSUM7CisJCXBvcnQtPmdzLmNsb3NlX2RlbGF5ID0gSFovMjsKKwkJcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJcG9ydC0+Z3MucmQgPSAmc2NjX3JlYWxfZHJpdmVyOworI2lmZGVmIE5FV19XUklURV9MT0NLSU5HCisJCXBvcnQtPmdzLnBvcnRfd3JpdGVfc2VtID0gTVVURVg7CisjZW5kaWYKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3MuY2xvc2Vfd2FpdCk7CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfTVZNRTE0N19TQ0MKK3N0YXRpYyBpbnQgbXZtZTE0N19zY2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydDsKKworCXByaW50ayhLRVJOX0lORk8gIlNDQzogTVZNRTE0NyBTZXJpYWwgRHJpdmVyXG4iKTsKKwkvKiBJbml0IGNoYW5uZWwgQSAqLworCXBvcnQgPSAmc2NjX3BvcnRzWzBdOworCXBvcnQtPmNoYW5uZWwgPSBDSEFOTkVMX0E7CisJcG9ydC0+Y3RybHAgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKU0xNDdfU0NDX0FfQUREUjsKKwlwb3J0LT5kYXRhcCA9IHBvcnQtPmN0cmxwICsgMTsKKwlwb3J0LT5wb3J0X2EgPSAmc2NjX3BvcnRzWzBdOworCXBvcnQtPnBvcnRfYiA9ICZzY2NfcG9ydHNbMV07CisJcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQV9UWCwgc2NjX3R4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgVFgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1NUQVQsIHNjY19zdGF0X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgc3RhdHVzIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQV9SWCwgc2NjX3J4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgUlgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCXsKKwkJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCVNDQ3dyaXRlKElOVF9BTkRfRE1BX1JFRywgMCk7CisJCS8qIFNldCB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworCQlTQ0N3cml0ZShJTlRfVkVDVE9SX1JFRywgTVZNRTE0N19JUlFfU0NDX0JBU0UpOworCQkvKiBJbnRlcnJ1cHQgcGFyYW1ldGVyczogdmVjdG9yIGluY2x1ZGVzIHN0YXR1cywgc3RhdHVzIGxvdyAqLworCQlTQ0N3cml0ZShNQVNURVJfSU5UX0NUUkwsIE1JQ19WRUNfSU5DTF9TVEFUKTsKKwkJU0NDbW9kKE1BU1RFUl9JTlRfQ1RSTCwgMHhmZiwgTUlDX01BU1RFUl9JTlRfRU5BQik7CisJfQorCisJLyogSW5pdCBjaGFubmVsIEIgKi8KKwlwb3J0ID0gJnNjY19wb3J0c1sxXTsKKwlwb3J0LT5jaGFubmVsID0gQ0hBTk5FTF9COworCXBvcnQtPmN0cmxwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilNMTQ3X1NDQ19CX0FERFI7CisJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDE7CisJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKKwlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOworCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0JfVFgsIHNjY190eF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIFRYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQl9TVEFULCBzY2Nfc3RhdF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIHN0YXR1cyIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0JfUlgsIHNjY19yeF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIFJYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQl9TUENPTkQsIHNjY19zcGNvbmRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwl7CisJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgY2hhbm5lbCAqLworCQlTQ0N3cml0ZShJTlRfQU5EX0RNQV9SRUcsIDApOworCX0KKworICAgICAgICAvKiBFbnN1cmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBpbiB0aGUgUENDIGNoaXAgKi8KKyAgICAgICAgbTE0N19wY2MtPnNlcmlhbF9jbnRybD1QQ0NfTEVWRUxfU0VSSUFMfFBDQ19JTlRfRU5BQjsKKworCS8qIEluaXRpYWxpc2UgdGhlIHR0eSBkcml2ZXIgc3RydWN0dXJlcyBhbmQgcmVnaXN0ZXIgKi8KKwlzY2NfaW5pdF9wb3J0c3RydWN0cygpOworCXNjY19pbml0X2RyaXZlcnMoKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19NVk1FMTYyX1NDQworc3RhdGljIGludCBtdm1lMTYyX3NjY19pbml0KHZvaWQpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0OworCisJaWYgKCEobXZtZTE2eF9jb25maWcgJiBNVk1FMTZ4X0NPTkZJR19HT1RfU0NDQSkpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwlwcmludGsoS0VSTl9JTkZPICJTQ0M6IE1WTUUxNjIgU2VyaWFsIERyaXZlclxuIik7CisJLyogSW5pdCBjaGFubmVsIEEgKi8KKwlwb3J0ID0gJnNjY19wb3J0c1swXTsKKwlwb3J0LT5jaGFubmVsID0gQ0hBTk5FTF9BOworCXBvcnQtPmN0cmxwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilNVk1FX1NDQ19BX0FERFI7CisJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDI7CisJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKKwlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOworCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfVFgsIHNjY190eF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIFRYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQV9TVEFULCBzY2Nfc3RhdF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIHN0YXR1cyIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfUlgsIHNjY19yeF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIFJYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQV9TUENPTkQsIHNjY19zcGNvbmRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwl7CisJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgY2hhbm5lbCAqLworCQlTQ0N3cml0ZShJTlRfQU5EX0RNQV9SRUcsIDApOworCQkvKiBTZXQgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKwkJU0NDd3JpdGUoSU5UX1ZFQ1RPUl9SRUcsIE1WTUUxNjJfSVJRX1NDQ19CQVNFKTsKKwkJLyogSW50ZXJydXB0IHBhcmFtZXRlcnM6IHZlY3RvciBpbmNsdWRlcyBzdGF0dXMsIHN0YXR1cyBsb3cgKi8KKwkJU0NDd3JpdGUoTUFTVEVSX0lOVF9DVFJMLCBNSUNfVkVDX0lOQ0xfU1RBVCk7CisJCVNDQ21vZChNQVNURVJfSU5UX0NUUkwsIDB4ZmYsIE1JQ19NQVNURVJfSU5UX0VOQUIpOworCX0KKworCS8qIEluaXQgY2hhbm5lbCBCICovCisJcG9ydCA9ICZzY2NfcG9ydHNbMV07CisJcG9ydC0+Y2hhbm5lbCA9IENIQU5ORUxfQjsKKwlwb3J0LT5jdHJscCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopTVZNRV9TQ0NfQl9BRERSOworCXBvcnQtPmRhdGFwID0gcG9ydC0+Y3RybHAgKyAyOworCXBvcnQtPnBvcnRfYSA9ICZzY2NfcG9ydHNbMF07CisJcG9ydC0+cG9ydF9iID0gJnNjY19wb3J0c1sxXTsKKwlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NCX1RYLCBzY2NfdHhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBUWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfU1RBVCwgc2NjX3N0YXRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBzdGF0dXMiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NCX1JYLCBzY2NfcnhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBSWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisKKwl7CisJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsJLyogRWl0aGVyIGNoYW5uZWwgd2lsbCBkbyAqLworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCVNDQ3dyaXRlKElOVF9BTkRfRE1BX1JFRywgMCk7CisJfQorCisgICAgICAgIC8qIEVuc3VyZSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGluIHRoZSBNQzIgY2hpcCAqLworICAgICAgICAqKHZvbGF0aWxlIGNoYXIgKikweGZmZjQyMDFkID0gMHgxNDsKKworCS8qIEluaXRpYWxpc2UgdGhlIHR0eSBkcml2ZXIgc3RydWN0dXJlcyBhbmQgcmVnaXN0ZXIgKi8KKwlzY2NfaW5pdF9wb3J0c3RydWN0cygpOworCXNjY19pbml0X2RyaXZlcnMoKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19CVk1FNjAwMF9TQ0MKK3N0YXRpYyBpbnQgYnZtZTYwMDBfc2NjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJTQ0M6IEJWTUU2MDAwIFNlcmlhbCBEcml2ZXJcbiIpOworCS8qIEluaXQgY2hhbm5lbCBBICovCisJcG9ydCA9ICZzY2NfcG9ydHNbMF07CisJcG9ydC0+Y2hhbm5lbCA9IENIQU5ORUxfQTsKKwlwb3J0LT5jdHJscCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQlZNRV9TQ0NfQV9BRERSOworCXBvcnQtPmRhdGFwID0gcG9ydC0+Y3RybHAgKyA0OworCXBvcnQtPnBvcnRfYSA9ICZzY2NfcG9ydHNbMF07CisJcG9ydC0+cG9ydF9iID0gJnNjY19wb3J0c1sxXTsKKwlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NBX1RYLCBzY2NfdHhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBUWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfU1RBVCwgc2NjX3N0YXRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBzdGF0dXMiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NBX1JYLCBzY2NfcnhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBSWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisJeworCQlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJU0NDd3JpdGUoSU5UX0FORF9ETUFfUkVHLCAwKTsKKwkJLyogU2V0IHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCisJCVNDQ3dyaXRlKElOVF9WRUNUT1JfUkVHLCBCVk1FX0lSUV9TQ0NfQkFTRSk7CisJCS8qIEludGVycnVwdCBwYXJhbWV0ZXJzOiB2ZWN0b3IgaW5jbHVkZXMgc3RhdHVzLCBzdGF0dXMgbG93ICovCisJCVNDQ3dyaXRlKE1BU1RFUl9JTlRfQ1RSTCwgTUlDX1ZFQ19JTkNMX1NUQVQpOworCQlTQ0Ntb2QoTUFTVEVSX0lOVF9DVFJMLCAweGZmLCBNSUNfTUFTVEVSX0lOVF9FTkFCKTsKKwl9CisKKwkvKiBJbml0IGNoYW5uZWwgQiAqLworCXBvcnQgPSAmc2NjX3BvcnRzWzFdOworCXBvcnQtPmNoYW5uZWwgPSBDSEFOTkVMX0I7CisJcG9ydC0+Y3RybHAgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUJWTUVfU0NDX0JfQUREUjsKKwlwb3J0LT5kYXRhcCA9IHBvcnQtPmN0cmxwICsgNDsKKwlwb3J0LT5wb3J0X2EgPSAmc2NjX3BvcnRzWzBdOworCXBvcnQtPnBvcnRfYiA9ICZzY2NfcG9ydHNbMV07CisJcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQl9UWCwgc2NjX3R4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgVFgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NCX1NUQVQsIHNjY19zdGF0X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgc3RhdHVzIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQl9SWCwgc2NjX3J4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgUlgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NCX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCisJeworCQlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CS8qIEVpdGhlciBjaGFubmVsIHdpbGwgZG8gKi8KKworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgY2hhbm5lbCAqLworCQlTQ0N3cml0ZShJTlRfQU5EX0RNQV9SRUcsIDApOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlIHR0eSBkcml2ZXIgc3RydWN0dXJlcyBhbmQgcmVnaXN0ZXIgKi8KKwlzY2NfaW5pdF9wb3J0c3RydWN0cygpOworCXNjY19pbml0X2RyaXZlcnMoKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKworc3RhdGljIGludCB2bWVfc2NjX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzID0gLUVOT0RFVjsKKworI2lmZGVmIENPTkZJR19NVk1FMTQ3X1NDQworCWlmIChNQUNIX0lTX01WTUUxNDcpCisJCXJlcyA9IG12bWUxNDdfc2NjX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVk1FMTYyX1NDQworCWlmIChNQUNIX0lTX01WTUUxNngpCisJCXJlcyA9IG12bWUxNjJfc2NjX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CVk1FNjAwMF9TQ0MKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkKKwkJcmVzID0gYnZtZTYwMDBfc2NjX2luaXQoKTsKKyNlbmRpZgorCXJldHVybiByZXM7Cit9CisKK21vZHVsZV9pbml0KHZtZV9zY2NfaW5pdCk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVycnVwdCBoYW5kbGVycworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2NfcnhfaW50KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwl1bnNpZ25lZCBjaGFyCWNoOworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IGRhdGE7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmdzLnR0eTsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwljaCA9IFNDQ3JlYWRfTkIoUlhfREFUQV9SRUcpOworCWlmICghdHR5KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjY19yeF9pbnQgd2l0aCBOVUxMIHR0eSFcbiIpOworCQlTQ0N3cml0ZV9OQihDT01NQU5EX1JFRywgQ1JfSElHSEVTVF9JVVNfUkVTRVQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7CisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJCXR0eS0+ZmxpcC5jb3VudCsrOworCX0KKworCS8qIENoZWNrIGlmIGFub3RoZXIgY2hhcmFjdGVyIGlzIGFscmVhZHkgcmVhZHk7IGluIHRoYXQgY2FzZSwgdGhlCisJICogc3Bjb25kX2ludCgpIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCwgYmVjYXVzZSB0aGlzIGNoYXJhY3RlciBtYXkgaGF2ZSBhbgorCSAqIGVycm9yIGNvbmRpdGlvbiB0aGF0IGlzbid0IHNpZ25hbGxlZCBieSB0aGUgaW50ZXJydXB0IHZlY3RvciB1c2VkIQorCSAqLworCWlmIChTQ0NyZWFkKElOVF9QRU5ESU5HX1JFRykgJgorCSAgICAocG9ydC0+Y2hhbm5lbCA9PSBDSEFOTkVMX0EgPyBJUFJfQV9SWCA6IElQUl9CX1JYKSkgeworCQlzY2Nfc3Bjb25kX2ludCAoaXJxLCBkYXRhLCBmcCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlTQ0N3cml0ZV9OQihDT01NQU5EX1JFRywgQ1JfSElHSEVTVF9JVVNfUkVTRVQpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHNjY19zcGNvbmRfaW50KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5ncy50dHk7CisJdW5zaWduZWQgY2hhcglzdGF0LCBjaCwgZXJyOworCWludAkJaW50X3BlbmRpbmdfbWFzayA9IHBvcnQtPmNoYW5uZWwgPT0gQ0hBTk5FTF9BID8KKwkJCSAgICAgICAgICAgICAgICAgICBJUFJfQV9SWCA6IElQUl9CX1JYOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKwkKKwlpZiAoIXR0eSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY2Nfc3Bjb25kX2ludCB3aXRoIE5VTEwgdHR5IVxuIik7CisJCVNDQ3dyaXRlKENPTU1BTkRfUkVHLCBDUl9FUlJPUl9SRVNFVCk7CisJCVNDQ3dyaXRlX05CKENPTU1BTkRfUkVHLCBDUl9ISUdIRVNUX0lVU19SRVNFVCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJZG8geworCQlzdGF0ID0gU0NDcmVhZChTUENPTkRfU1RBVFVTX1JFRyk7CisJCWNoID0gU0NDcmVhZF9OQihSWF9EQVRBX1JFRyk7CisKKwkJaWYgKHN0YXQgJiBTQ1NSX1JYX09WRVJSVU4pCisJCQllcnIgPSBUVFlfT1ZFUlJVTjsKKwkJZWxzZSBpZiAoc3RhdCAmIFNDU1JfUEFSSVRZX0VSUikKKwkJCWVyciA9IFRUWV9QQVJJVFk7CisJCWVsc2UgaWYgKHN0YXQgJiBTQ1NSX0NSQ19GUkFNRV9FUlIpCisJCQllcnIgPSBUVFlfRlJBTUU7CisJCWVsc2UKKwkJCWVyciA9IDA7CisKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7CisJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IGVycjsKKwkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKKwkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQl9CisKKwkJLyogKytUZVNjaGU6ICpBbGwqIGVycm9ycyBoYXZlIHRvIGJlIGNsZWFyZWQgbWFudWFsbHksCisJCSAqIGVsc2UgdGhlIGNvbmRpdGlvbiBwZXJzaXN0cyBmb3IgdGhlIG5leHQgY2hhcnMKKwkJICovCisJCWlmIChlcnIpCisJCSAgU0NDd3JpdGUoQ09NTUFORF9SRUcsIENSX0VSUk9SX1JFU0VUKTsKKworCX0gd2hpbGUoU0NDcmVhZChJTlRfUEVORElOR19SRUcpICYgaW50X3BlbmRpbmdfbWFzayk7CisKKwlTQ0N3cml0ZV9OQihDT01NQU5EX1JFRywgQ1JfSElHSEVTVF9JVVNfUkVTRVQpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHNjY190eF9pbnQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IGRhdGE7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJaWYgKCFwb3J0LT5ncy50dHkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NjX3R4X2ludCB3aXRoIE5VTEwgdHR5IVxuIik7CisJCVNDQ21vZCAoSU5UX0FORF9ETUFfUkVHLCB+SURSX1RYX0lOVF9FTkFCLCAwKTsKKwkJU0NDd3JpdGUoQ09NTUFORF9SRUcsIENSX1RYX1BFTkRJTkdfUkVTRVQpOworCQlTQ0N3cml0ZV9OQihDT01NQU5EX1JFRywgQ1JfSElHSEVTVF9JVVNfUkVTRVQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXdoaWxlICgoU0NDcmVhZF9OQihTVEFUVVNfUkVHKSAmIFNSX1RYX0JVRl9FTVBUWSkpIHsKKwkJaWYgKHBvcnQtPnhfY2hhcikgeworCQkJU0NDd3JpdGUoVFhfREFUQV9SRUcsIHBvcnQtPnhfY2hhcik7CisJCQlwb3J0LT54X2NoYXIgPSAwOworCQl9CisJCWVsc2UgaWYgKChwb3J0LT5ncy54bWl0X2NudCA8PSAwKSB8fCBwb3J0LT5ncy50dHktPnN0b3BwZWQgfHwKKwkJCQlwb3J0LT5ncy50dHktPmh3X3N0b3BwZWQpCisJCQlicmVhazsKKwkJZWxzZSB7CisJCQlTQ0N3cml0ZShUWF9EQVRBX1JFRywgcG9ydC0+Z3MueG1pdF9idWZbcG9ydC0+Z3MueG1pdF90YWlsKytdKTsKKwkJCXBvcnQtPmdzLnhtaXRfdGFpbCA9IHBvcnQtPmdzLnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQkJaWYgKC0tcG9ydC0+Z3MueG1pdF9jbnQgPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoKHBvcnQtPmdzLnhtaXRfY250IDw9IDApIHx8IHBvcnQtPmdzLnR0eS0+c3RvcHBlZCB8fAorCQkJcG9ydC0+Z3MudHR5LT5od19zdG9wcGVkKSB7CisJCS8qIGRpc2FibGUgdHggaW50ZXJydXB0cyAqLworCQlTQ0Ntb2QgKElOVF9BTkRfRE1BX1JFRywgfklEUl9UWF9JTlRfRU5BQiwgMCk7CisJCVNDQ3dyaXRlKENPTU1BTkRfUkVHLCBDUl9UWF9QRU5ESU5HX1JFU0VUKTsgICAvKiBkaXNhYmxlIHR4X2ludCBvbiBuZXh0IHR4IHVuZGVycnVuPyAqLworCQlwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CisJfQorCWlmIChwb3J0LT5ncy50dHkgJiYgcG9ydC0+Z3MueG1pdF9jbnQgPD0gcG9ydC0+Z3Mud2FrZXVwX2NoYXJzKQorCQl0dHlfd2FrZXVwKHBvcnQtPmdzLnR0eSk7CisKKwlTQ0N3cml0ZV9OQihDT01NQU5EX1JFRywgQ1JfSElHSEVTVF9JVVNfUkVTRVQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX3N0YXRfaW50KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBkYXRhOworCXVuc2lnbmVkIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCXVuc2lnbmVkIGNoYXIJbGFzdF9zciwgc3IsIGNoYW5nZWQ7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJbGFzdF9zciA9IHNjY19sYXN0X3N0YXR1c19yZWdbY2hhbm5lbF07CisJc3IgPSBzY2NfbGFzdF9zdGF0dXNfcmVnW2NoYW5uZWxdID0gU0NDcmVhZF9OQihTVEFUVVNfUkVHKTsKKwljaGFuZ2VkID0gbGFzdF9zciBeIHNyOworCisJaWYgKGNoYW5nZWQgJiBTUl9EQ0QpIHsKKwkJcG9ydC0+Y19kY2QgPSAhIShzciAmIFNSX0RDRCk7CisJCWlmICghKHBvcnQtPmdzLmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpKQorCQkJOwkvKiBEb24ndCByZXBvcnQgRENEIGNoYW5nZXMgKi8KKwkJZWxzZSBpZiAocG9ydC0+Y19kY2QpIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChwb3J0LT5ncy50dHkpCisJCQkJdHR5X2hhbmd1cCAocG9ydC0+Z3MudHR5KTsKKwkJfQorCX0KKwlTQ0N3cml0ZShDT01NQU5EX1JFRywgQ1JfRVhUU1RBVF9SRVNFVCk7CisJU0NDd3JpdGVfTkIoQ09NTUFORF9SRUcsIENSX0hJR0hFU1RfSVVTX1JFU0VUKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGdlbmVyaWNfc2VyaWFsLmMgY2FsbGJhY2sgZnVudGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzY2NfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBwdHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJU0NDbW9kKElOVF9BTkRfRE1BX1JFRywgfklEUl9UWF9JTlRfRU5BQiwgMCk7CisJcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBzY2NfZW5hYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlTQ0Ntb2QoSU5UX0FORF9ETUFfUkVHLCAweGZmLCBJRFJfVFhfSU5UX0VOQUIpOworCS8qIHJlc3RhcnQgdGhlIHRyYW5zbWl0dGVyICovCisJc2NjX3R4X2ludCAoMCwgcG9ydCwgMCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNjY19kaXNhYmxlX3J4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlTQ0Ntb2QoSU5UX0FORF9ETUFfUkVHLAorCSAgICB+KElEUl9SWF9JTlRfTUFTS3xJRFJfUEFSRVJSX0FTX1NQQ09ORHxJRFJfRVhUU1RBVF9JTlRfRU5BQiksIDApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBzY2NfZW5hYmxlX3J4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlTQ0Ntb2QoSU5UX0FORF9ETUFfUkVHLCAweGZmLAorCQlJRFJfRVhUU1RBVF9JTlRfRU5BQnxJRFJfUEFSRVJSX0FTX1NQQ09ORHxJRFJfUlhfSU5UX0FMTCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQgc2NjX2dldF9DRCh2b2lkICpwdHIpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gcHRyOworCXVuc2lnbmVkIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJcmV0dXJuICEhKHNjY19sYXN0X3N0YXR1c19yZWdbY2hhbm5lbF0gJiBTUl9EQ0QpOworfQorCisKK3N0YXRpYyB2b2lkIHNjY19zaHV0ZG93bl9wb3J0KHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBwdHI7CisKKwlwb3J0LT5ncy5mbGFncyAmPSB+IEdTX0FDVElWRTsKKwlpZiAocG9ydC0+Z3MudHR5ICYmIHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisJCXNjY19zZXRzaWduYWxzIChwb3J0LCAwLCAwKTsKKwl9Cit9CisKKworc3RhdGljIGludCBzY2Nfc2V0X3JlYWxfdGVybWlvcyAodm9pZCAqcHRyKQoreworCS8qIHRoZSBTQ0MgaGFzIGNoYXIgc2l6ZXMgNSw3LDYsOCBpbiB0aGF0IG9yZGVyISAqLworCXN0YXRpYyBpbnQgY2hzaXplX21hcFs0XSA9IHsgMCwgMiwgMSwgMyB9OworCXVuc2lnbmVkIGNmbGFnLCBiYXVkLCBjaHNpemUsIGNoYW5uZWwsIGJyZ3ZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBwdHI7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJaWYgKCFwb3J0LT5ncy50dHkgfHwgIXBvcnQtPmdzLnR0eS0+dGVybWlvcykgcmV0dXJuIDA7CisKKwljaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmIChjaGFubmVsID09IENIQU5ORUxfQSkKKwkJcmV0dXJuIDA7CQkvKiBTZXR0aW5ncyBjb250cm9sbGVkIGJ5IGJvb3QgUFJPTSAqLworCisJY2ZsYWcgID0gcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCWJhdWQgPSBwb3J0LT5ncy5iYXVkOworCWNoc2l6ZSA9IChjZmxhZyAmIENTSVpFKSA+PiA0OworCisJaWYgKGJhdWQgPT0gMCkgeworCQkvKiBzcGVlZCA9PSAwIC0+IGRyb3AgRFRSICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJU0NDbW9kKFRYX0NUUkxfUkVHLCB+VENSX0RUUiwgMCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgaWYgKChNQUNIX0lTX01WTUUxNnggJiYgKGJhdWQgPCA1MCB8fCBiYXVkID4gMzg0MDApKSB8fAorCQkgKE1BQ0hfSVNfTVZNRTE0NyAmJiAoYmF1ZCA8IDUwIHx8IGJhdWQgPiAxOTIwMCkpIHx8CisJCSAoTUFDSF9JU19CVk1FNjAwMCAmJihiYXVkIDwgNTAgfHwgYmF1ZCA+IDc2ODAwKSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJTQ0M6IEJhZCBzcGVlZCByZXF1ZXN0ZWQsICVkXG4iLCBiYXVkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlwb3J0LT5ncy5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlwb3J0LT5ncy5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworI2lmZGVmIENPTkZJR19NVk1FMTQ3X1NDQworCWlmIChNQUNIX0lTX01WTUUxNDcpCisJCWJyZ3ZhbCA9IChNMTQ3X1NDQ19QQ0xLICsgYmF1ZC8yKSAvICgxNiAqIDIgKiBiYXVkKSAtIDI7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZNRTE2Ml9TQ0MKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KQorCQlicmd2YWwgPSAoTVZNRV9TQ0NfUENMSyArIGJhdWQvMikgLyAoMTYgKiAyICogYmF1ZCkgLSAyOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JWTUU2MDAwX1NDQworCWlmIChNQUNIX0lTX0JWTUU2MDAwKQorCQlicmd2YWwgPSAoQlZNRV9TQ0NfUlR4QyArIGJhdWQvMikgLyAoMTYgKiAyICogYmF1ZCkgLSAyOworI2VuZGlmCisJLyogTm93IHdlIGhhdmUgYWxsIHBhcmFtZXRlcnMgYW5kIGNhbiBnbyB0byBzZXQgdGhlbTogKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiByZWNlaXZlcidzIGNoYXJhY3RlciBzaXplIGFuZCBhdXRvLWVuYWJsZXMgKi8KKwlTQ0Ntb2QoUlhfQ1RSTF9SRUcsIH4oUkNSX0NIU0laRV9NQVNLfFJDUl9BVVRPX0VOQUJfTU9ERSksCisJCQkoY2hzaXplX21hcFtjaHNpemVdIDw8IDYpIHwKKwkJCSgoY2ZsYWcgJiBDUlRTQ1RTKSA/IFJDUl9BVVRPX0VOQUJfTU9ERSA6IDApKTsKKwkvKiBwYXJpdHkgYW5kIHN0b3AgYml0cyAoYm90aCwgVHggYW5kIFJ4KSwgY2xvY2sgbW9kZSBuZXZlciBjaGFuZ2VzICovCisJU0NDbW9kIChBVVgxX0NUUkxfUkVHLAorCQl+KEExQ1JfUEFSSVRZX01BU0sgfCBBMUNSX01PREVfTUFTSyksCisJCSgoY2ZsYWcgJiBQQVJFTkIKKwkJICA/IChjZmxhZyAmIFBBUk9ERCA/IEExQ1JfUEFSSVRZX09ERCA6IEExQ1JfUEFSSVRZX0VWRU4pCisJCSAgOiBBMUNSX1BBUklUWV9OT05FKQorCQkgfCAoY2ZsYWcgJiBDU1RPUEIgPyBBMUNSX01PREVfQVNZTkNfMiA6IEExQ1JfTU9ERV9BU1lOQ18xKSkpOworCS8qIHNlbmRlcidzIGNoYXJhY3RlciBzaXplLCBzZXQgRFRSIGZvciB2YWxpZCBiYXVkIHJhdGUgKi8KKwlTQ0Ntb2QoVFhfQ1RSTF9SRUcsIH5UQ1JfQ0hTSVpFX01BU0ssIGNoc2l6ZV9tYXBbY2hzaXplXSA8PCA1IHwgVENSX0RUUik7CisJLyogY2xvY2sgc291cmNlcyBuZXZlciBjaGFuZ2UgKi8KKwkvKiBkaXNhYmxlIEJSRyBiZWZvcmUgY2hhbmdpbmcgdGhlIHZhbHVlICovCisJU0NDbW9kKERQTExfQ1RSTF9SRUcsIH5EQ1JfQlJHX0VOQUIsIDApOworCS8qIEJSRyB2YWx1ZSAqLworCVNDQ3dyaXRlKFRJTUVSX0xPV19SRUcsIGJyZ3ZhbCAmIDB4ZmYpOworCVNDQ3dyaXRlKFRJTUVSX0hJR0hfUkVHLCAoYnJndmFsID4+IDgpICYgMHhmZik7CisJLyogQlJHIGVuYWJsZSwgYW5kIGNsb2NrIHNvdXJjZSBuZXZlciBjaGFuZ2VzICovCisJU0NDbW9kKERQTExfQ1RSTF9SRUcsIDB4ZmYsIERDUl9CUkdfRU5BQik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNjY19jaGFyc19pbl9idWZmZXIgKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBwdHI7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJcmV0dXJuIChTQ0NyZWFkIChTUENPTkRfU1RBVFVTX1JFRykgJiBTQ1NSX0FMTF9TRU5UKSA/IDAgIDogMTsKK30KKworCisvKiBDb21tZW50IHRha2VuIGZyb20gc3guYyAoMi40LjApOgorICAgSSBoYXZlbid0IHRoZSBmb2dnaWVzdCB3aHkgdGhlIGRlY3JlbWVudCB1c2UgY291bnQgaGFzIHRvIGhhcHBlbgorICAgaGVyZS4gVGhlIHdob2xlIGxpbnV4IHNlcmlhbCBkcml2ZXJzIHN0dWZmIG5lZWRzIHRvIGJlIHJlZGVzaWduZWQuCisgICBNeSBndWVzcyBpcyB0aGF0IHRoaXMgaXMgYSBoYWNrIHRvIG1pbmltaXplIHRoZSBpbXBhY3Qgb2YgYSBidWcKKyAgIGVsc2V3aGVyZS4gVGhpbmtpbmcgYWJvdXQgaXQgc29tZSBtb3JlLiAodHJ5IGl0IHNvbWV0aW1lKSBUcnkKKyAgIHJ1bm5pbmcgbWluaWNvbSBvbiBhIHNlcmlhbCBwb3J0IHRoYXQgaXMgZHJpdmVuIGJ5IGEgbW9kdWxhcml6ZWQKKyAgIGRyaXZlci4gSGF2ZSB0aGUgbW9kZW0gaGFuZ3VwLiBUaGVuIHJlbW92ZSB0aGUgZHJpdmVyIG1vZHVsZS4gVGhlbgorICAgZXhpdCBtaW5pY29tLiAgSSBleHBlY3QgYW4gIm9vcHMiLiAgLS0gUkVXICovCisKK3N0YXRpYyB2b2lkIHNjY19odW5ndXAodm9pZCAqcHRyKQoreworCXNjY19kaXNhYmxlX3R4X2ludGVycnVwdHMocHRyKTsKKwlzY2NfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzKHB0cik7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX2Nsb3NlKHZvaWQgKnB0cikKK3sKKwlzY2NfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHB0cik7CisJc2NjX2Rpc2FibGVfcnhfaW50ZXJydXB0cyhwdHIpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcm5hbCBzdXBwb3J0IGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNjY19zZXRzaWduYWxzKHN0cnVjdCBzY2NfcG9ydCAqcG9ydCwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdDsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdCA9IFNDQ3JlYWQoVFhfQ1RSTF9SRUcpOworCWlmIChkdHIgPj0gMCkgdCA9IGR0cj8gKHQgfCBUQ1JfRFRSKTogKHQgJiB+VENSX0RUUik7CisJaWYgKHJ0cyA+PSAwKSB0ID0gcnRzPyAodCB8IFRDUl9SVFMpOiAodCAmIH5UQ1JfUlRTKTsKKwlTQ0N3cml0ZShUWF9DVFJMX1JFRywgdCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNjY19zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gKHN0cnVjdCBzY2NfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlwb3J0LT54X2NoYXIgPSBjaDsKKwlpZiAoY2gpCisJCXNjY19lbmFibGVfdHhfaW50ZXJydXB0cyhwb3J0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRHJpdmVyIGVudHJ5cG9pbnRzIHJlZmVyZW5jZWQgZnJvbSBhYm92ZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc2NjX29wZW4gKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJaW50IGxpbmUgPSB0dHktPmluZGV4OworCWludCByZXR2YWw7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gJnNjY19wb3J0c1tsaW5lXTsKKwlpbnQgaSwgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisjaWYgZGVmaW5lZChDT05GSUdfTVZNRTE2Ml9TQ0MpIHx8IGRlZmluZWQoQ09ORklHX01WTUUxNDdfU0NDKQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1bnNpZ25lZCByZWcsIHZhbDsKKwl9IG12bWVfaW5pdF90YWJbXSA9IHsKKwkJLyogVmFsdWVzIGZvciBNVk1FMTYyIGFuZCBNVk1FMTQ3ICovCisJCS8qIG5vIHBhcml0eSwgMSBzdG9wIGJpdCwgYXN5bmMsIDE6MTYgKi8KKwkJeyBBVVgxX0NUUkxfUkVHLCBBMUNSX1BBUklUWV9OT05FfEExQ1JfTU9ERV9BU1lOQ18xfEExQ1JfQ0xLTU9ERV94MTYgfSwKKwkJLyogcGFyaXR5IGVycm9yIGlzIHNwZWNpYWwgY29uZCwgaW50cyBkaXNhYmxlZCwgbm8gRE1BICovCisJCXsgSU5UX0FORF9ETUFfUkVHLCBJRFJfUEFSRVJSX0FTX1NQQ09ORCB8IElEUl9SWF9JTlRfRElTQUIgfSwKKwkJLyogUnggOCBiaXRzL2NoYXIsIG5vIGF1dG8gZW5hYmxlLCBSeCBvZmYgKi8KKwkJeyBSWF9DVFJMX1JFRywgUkNSX0NIU0laRV84IH0sCisJCS8qIERUUiBvZmYsIFR4IDggYml0cy9jaGFyLCBSVFMgb2ZmLCBUeCBvZmYgKi8KKwkJeyBUWF9DVFJMX1JFRywgVENSX0NIU0laRV84IH0sCisJCS8qIHNwZWNpYWwgZmVhdHVyZXMgb2ZmICovCisJCXsgQVVYMl9DVFJMX1JFRywgMCB9LAorCQl7IENMS19DVFJMX1JFRywgQ0NSX1JYQ0xLX0JSRyB8IENDUl9UWENMS19CUkcgfSwKKwkJeyBEUExMX0NUUkxfUkVHLCBEQ1JfQlJHX0VOQUIgfCBEQ1JfQlJHX1VTRV9QQ0xLIH0sCisJCS8qIFN0YXJ0IFJ4ICovCisJCXsgUlhfQ1RSTF9SRUcsIFJDUl9SWF9FTkFCIHwgUkNSX0NIU0laRV84IH0sCisJCS8qIFN0YXJ0IFR4ICovCisJCXsgVFhfQ1RSTF9SRUcsIFRDUl9UWF9FTkFCIHwgVENSX1JUUyB8IFRDUl9EVFIgfCBUQ1JfQ0hTSVpFXzggfSwKKwkJLyogRXh0L1N0YXQgaW50czogRENEIG9ubHkgKi8KKwkJeyBJTlRfQ1RSTF9SRUcsIElDUl9FTkFCX0RDRF9JTlQgfSwKKwkJLyogUmVzZXQgRXh0L1N0YXQgaW50cyAqLworCQl7IENPTU1BTkRfUkVHLCBDUl9FWFRTVEFUX1JFU0VUIH0sCisJCS8qIC4uLmFnYWluICovCisJCXsgQ09NTUFORF9SRUcsIENSX0VYVFNUQVRfUkVTRVQgfSwKKwl9OworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQlZNRTYwMDBfU0NDKQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1bnNpZ25lZCByZWcsIHZhbDsKKwl9IGJ2bWVfaW5pdF90YWJbXSA9IHsKKwkJLyogVmFsdWVzIGZvciBCVk1FNjAwMCAqLworCQkvKiBubyBwYXJpdHksIDEgc3RvcCBiaXQsIGFzeW5jLCAxOjE2ICovCisJCXsgQVVYMV9DVFJMX1JFRywgQTFDUl9QQVJJVFlfTk9ORXxBMUNSX01PREVfQVNZTkNfMXxBMUNSX0NMS01PREVfeDE2IH0sCisJCS8qIHBhcml0eSBlcnJvciBpcyBzcGVjaWFsIGNvbmQsIGludHMgZGlzYWJsZWQsIG5vIERNQSAqLworCQl7IElOVF9BTkRfRE1BX1JFRywgSURSX1BBUkVSUl9BU19TUENPTkQgfCBJRFJfUlhfSU5UX0RJU0FCIH0sCisJCS8qIFJ4IDggYml0cy9jaGFyLCBubyBhdXRvIGVuYWJsZSwgUnggb2ZmICovCisJCXsgUlhfQ1RSTF9SRUcsIFJDUl9DSFNJWkVfOCB9LAorCQkvKiBEVFIgb2ZmLCBUeCA4IGJpdHMvY2hhciwgUlRTIG9mZiwgVHggb2ZmICovCisJCXsgVFhfQ1RSTF9SRUcsIFRDUl9DSFNJWkVfOCB9LAorCQkvKiBzcGVjaWFsIGZlYXR1cmVzIG9mZiAqLworCQl7IEFVWDJfQ1RSTF9SRUcsIDAgfSwKKwkJeyBDTEtfQ1RSTF9SRUcsIENDUl9SVHhDX1hUQUwgfCBDQ1JfUlhDTEtfQlJHIHwgQ0NSX1RYQ0xLX0JSRyB9LAorCQl7IERQTExfQ1RSTF9SRUcsIERDUl9CUkdfRU5BQiB9LAorCQkvKiBTdGFydCBSeCAqLworCQl7IFJYX0NUUkxfUkVHLCBSQ1JfUlhfRU5BQiB8IFJDUl9DSFNJWkVfOCB9LAorCQkvKiBTdGFydCBUeCAqLworCQl7IFRYX0NUUkxfUkVHLCBUQ1JfVFhfRU5BQiB8IFRDUl9SVFMgfCBUQ1JfRFRSIHwgVENSX0NIU0laRV84IH0sCisJCS8qIEV4dC9TdGF0IGludHM6IERDRCBvbmx5ICovCisJCXsgSU5UX0NUUkxfUkVHLCBJQ1JfRU5BQl9EQ0RfSU5UIH0sCisJCS8qIFJlc2V0IEV4dC9TdGF0IGludHMgKi8KKwkJeyBDT01NQU5EX1JFRywgQ1JfRVhUU1RBVF9SRVNFVCB9LAorCQkvKiAuLi5hZ2FpbiAqLworCQl7IENPTU1BTkRfUkVHLCBDUl9FWFRTVEFUX1JFU0VUIH0sCisJfTsKKyNlbmRpZgorCWlmICghKHBvcnQtPmdzLmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTQ3X1NDQykgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE2Ml9TQ0MpCisJCWlmIChNQUNIX0lTX01WTUUxNDcgfHwgTUFDSF9JU19NVk1FMTZ4KSB7CisJCQlmb3IgKGk9MDsgaTxzaXplb2YobXZtZV9pbml0X3RhYikvc2l6ZW9mKCptdm1lX2luaXRfdGFiKTsgKytpKQorCQkJCVNDQ3dyaXRlKG12bWVfaW5pdF90YWJbaV0ucmVnLCBtdm1lX2luaXRfdGFiW2ldLnZhbCk7CisJCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JWTUU2MDAwX1NDQykKKwkJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJCWZvciAoaT0wOyBpPHNpemVvZihidm1lX2luaXRfdGFiKS9zaXplb2YoKmJ2bWVfaW5pdF90YWIpOyArK2kpCisJCQkJU0NDd3JpdGUoYnZtZV9pbml0X3RhYltpXS5yZWcsIGJ2bWVfaW5pdF90YWJbaV0udmFsKTsKKwkJfQorI2VuZGlmCisKKwkJLyogcmVtZW1iZXIgc3RhdHVzIHJlZ2lzdGVyIGZvciBkZXRlY3Rpb24gb2YgRENEIGFuZCBDVFMgY2hhbmdlcyAqLworCQlzY2NfbGFzdF9zdGF0dXNfcmVnW2NoYW5uZWxdID0gU0NDcmVhZChTVEFUVVNfUkVHKTsKKworCQlwb3J0LT5jX2RjZCA9IDA7CS8qIFByZXZlbnQgaW5pdGlhbCAxLT4wIGludGVycnVwdCAqLworCQlzY2Nfc2V0c2lnbmFscyAocG9ydCwgMSwxKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OworCXBvcnQtPmdzLnR0eSA9IHR0eTsKKwlwb3J0LT5ncy5jb3VudCsrOworCXJldHZhbCA9IGdzX2luaXRfcG9ydCgmcG9ydC0+Z3MpOworCWlmIChyZXR2YWwpIHsKKwkJcG9ydC0+Z3MuY291bnQtLTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcG9ydC0+Z3MuZmxhZ3MgfD0gR1NfQUNUSVZFOworCXJldHZhbCA9IGdzX2Jsb2NrX3RpbF9yZWFkeShwb3J0LCBmaWxwKTsKKworCWlmIChyZXR2YWwpIHsKKwkJcG9ydC0+Z3MuY291bnQtLTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlwb3J0LT5jX2RjZCA9IHNjY19nZXRfQ0QgKHBvcnQpOworCisJc2NjX2VuYWJsZV9yeF9pbnRlcnJ1cHRzKHBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSAoc3RydWN0IHNjY19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJU0NDbW9kKFRYX0NUUkxfUkVHLCB+VENSX1JUUywgMCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisJaWYgKElfSVhPRkYodHR5KSkKKwkJc2NjX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX3VudGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc2NjX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlTQ0Ntb2QoVFhfQ1RSTF9SRUcsIDB4ZmYsIFRDUl9SVFMpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCWlmIChJX0lYT0ZGKHR0eSkpCisJCXNjY19zZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKK30KKworCitzdGF0aWMgaW50IHNjY19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisKK3N0YXRpYyB2b2lkIHNjY19icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc2NjX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCVNDQ21vZChUWF9DVFJMX1JFRywgflRDUl9TRU5EX0JSRUFLLCAKKwkJCWJyZWFrX3N0YXRlID8gVENSX1NFTkRfQlJFQUsgOiAwKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlcmlhbCBjb25zb2xlIHN0dWZmLi4uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBzY2NfZGVsYXkoKSBkbyB7IF9fYXNtX18gX192b2xhdGlsZV9fICgiIG5vcDsgbm9wIik7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHNjY19jaF93cml0ZSAoY2hhciBjaCkKK3sKKwl2b2xhdGlsZSBjaGFyICpwID0gTlVMTDsKKwkKKyNpZmRlZiBDT05GSUdfTVZNRTE0N19TQ0MKKwlpZiAoTUFDSF9JU19NVk1FMTQ3KQorCQlwID0gKHZvbGF0aWxlIGNoYXIgKilNMTQ3X1NDQ19BX0FERFI7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZNRTE2Ml9TQ0MKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KQorCQlwID0gKHZvbGF0aWxlIGNoYXIgKilNVk1FX1NDQ19BX0FERFI7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlZNRTYwMDBfU0NDCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApCisJCXAgPSAodm9sYXRpbGUgY2hhciAqKUJWTUVfU0NDX0FfQUREUjsKKyNlbmRpZgorCisJZG8geworCQlzY2NfZGVsYXkoKTsKKwl9CisJd2hpbGUgKCEoKnAgJiA0KSk7CisJc2NjX2RlbGF5KCk7CisJKnAgPSA4OworCXNjY19kZWxheSgpOworCSpwID0gY2g7Cit9CisKKy8qIFRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuICovCisKK3N0YXRpYyB2b2lkIHNjY19jb25zb2xlX3dyaXRlIChzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXdoaWxlIChjb3VudC0tKQorCXsKKwkJaWYgKCpzdHIgPT0gJ1xuJykKKwkJCXNjY19jaF93cml0ZSAoJ1xyJyk7CisJCXNjY19jaF93cml0ZSAoKnN0cisrKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNjY19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwkqaW5kZXggPSBjLT5pbmRleDsKKwlyZXR1cm4gc2NjX2RyaXZlcjsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzY2NfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPSB7CisJLm5hbWUJCT0gInR0eVMiLAorCS53cml0ZQkJPSBzY2NfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlCQk9IHNjY19jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gc2NjX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHZtZV9zY2NfY29uc29sZV9pbml0KHZvaWQpCit7CisJaWYgKHZtZV9icmR0eXBlID09IFZNRV9UWVBFX01WTUUxNDcgfHwKKwkJCXZtZV9icmR0eXBlID09IFZNRV9UWVBFX01WTUUxNjIgfHwKKwkJCXZtZV9icmR0eXBlID09IFZNRV9UWVBFX01WTUUxNzIgfHwKKwkJCXZtZV9icmR0eXBlID09IFZNRV9UWVBFX0JWTUU0MDAwIHx8CisJCQl2bWVfYnJkdHlwZSA9PSBWTUVfVFlQRV9CVk1FNjAwMCkKKwkJcmVnaXN0ZXJfY29uc29sZSgmc2VyY29ucyk7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKHZtZV9zY2NfY29uc29sZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92cjQxeHhfcnRjLmMgYi9kcml2ZXJzL2NoYXIvdnI0MXh4X3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZGJlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdnI0MXh4X3J0Yy5jCkBAIC0wLDAgKzEsNzA5IEBACisvKgorICogIERyaXZlciBmb3IgTkVDIFZSNDEwMCBzZXJpZXMgIFJlYWwgVGltZSBDbG9jayB1bml0LgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS92cjQxeHgvdnI0MXh4Lmg+CisKK01PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBWUjQxMDAgc2VyaWVzIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBSVEMxX1RZUEUxX1NUQVJUCTB4MGIwMDAwYzBVTAorI2RlZmluZSBSVEMxX1RZUEUxX0VORAkJMHgwYjAwMDBkZlVMCisjZGVmaW5lIFJUQzJfVFlQRTFfU1RBUlQJMHgwYjAwMDFjMFVMCisjZGVmaW5lIFJUQzJfVFlQRTFfRU5ECQkweDBiMDAwMWRmVUwKKworI2RlZmluZSBSVEMxX1RZUEUyX1NUQVJUCTB4MGYwMDAxMDBVTAorI2RlZmluZSBSVEMxX1RZUEUyX0VORAkJMHgwZjAwMDExZlVMCisjZGVmaW5lIFJUQzJfVFlQRTJfU1RBUlQJMHgwZjAwMDEyMFVMCisjZGVmaW5lIFJUQzJfVFlQRTJfRU5ECQkweDBmMDAwMTNmVUwKKworI2RlZmluZSBSVEMxX1NJWkUJCTB4MjAKKyNkZWZpbmUgUlRDMl9TSVpFCQkweDIwCisKKy8qIFJUQyAxIHJlZ2lzdGVycyAqLworI2RlZmluZSBFVElNRUxSRUcJCTB4MDAKKyNkZWZpbmUgRVRJTUVNUkVHCQkweDAyCisjZGVmaW5lIEVUSU1FSFJFRwkJMHgwNAorLyogUkZVICovCisjZGVmaW5lIEVDTVBMUkVHCQkweDA4CisjZGVmaW5lIEVDTVBNUkVHCQkweDBhCisjZGVmaW5lIEVDTVBIUkVHCQkweDBjCisvKiBSRlUgKi8KKyNkZWZpbmUgUlRDTDFMUkVHCQkweDEwCisjZGVmaW5lIFJUQ0wxSFJFRwkJMHgxMgorI2RlZmluZSBSVENMMUNOVExSRUcJCTB4MTQKKyNkZWZpbmUgUlRDTDFDTlRIUkVHCQkweDE2CisjZGVmaW5lIFJUQ0wyTFJFRwkJMHgxOAorI2RlZmluZSBSVENMMkhSRUcJCTB4MWEKKyNkZWZpbmUgUlRDTDJDTlRMUkVHCQkweDFjCisjZGVmaW5lIFJUQ0wyQ05USFJFRwkJMHgxZQorCisvKiBSVEMgMiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVENMS0xSRUcJCTB4MDAKKyNkZWZpbmUgVENMS0hSRUcJCTB4MDIKKyNkZWZpbmUgVENMS0NOVExSRUcJCTB4MDQKKyNkZWZpbmUgVENMS0NOVEhSRUcJCTB4MDYKKy8qIFJGVSAqLworI2RlZmluZSBSVENJTlRSRUcJCTB4MWUKKyAjZGVmaW5lIFRDTE9DS19JTlQJCTB4MDgKKyAjZGVmaW5lIFJUQ0xPTkcyX0lOVAkJMHgwNAorICNkZWZpbmUgUlRDTE9ORzFfSU5UCQkweDAyCisgI2RlZmluZSBFTEFQU0VEVElNRV9JTlQJMHgwMQorCisjZGVmaW5lIFJUQ19GUkVRVUVOQ1kJCTMyNzY4CisjZGVmaW5lIE1BWF9QRVJJT0RJQ19SQVRFCTY1NTMKKyNkZWZpbmUgTUFYX1VTRVJfUEVSSU9ESUNfUkFURQk2NAorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpydGMxX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpydGMyX2Jhc2U7CisKKyNkZWZpbmUgcnRjMV9yZWFkKG9mZnNldCkJCXJlYWR3KHJ0YzFfYmFzZSArIChvZmZzZXQpKQorI2RlZmluZSBydGMxX3dyaXRlKG9mZnNldCwgdmFsdWUpCXdyaXRldygodmFsdWUpLCBydGMxX2Jhc2UgKyAob2Zmc2V0KSkKKworI2RlZmluZSBydGMyX3JlYWQob2Zmc2V0KQkJcmVhZHcocnRjMl9iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIHJ0YzJfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIHJ0YzJfYmFzZSArIChvZmZzZXQpKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlcG9jaCA9IDE5NzA7CS8qIEphbiAxIDE5NzAgMDA6MDA6MDAgKi8KKworc3RhdGljIHNwaW5sb2NrX3QgcnRjX3Rhc2tfbG9jazsKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBydGNfd2FpdDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19pcnFfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqcnRjX2FzeW5jX3F1ZXVlOworc3RhdGljIHJ0Y190YXNrX3QgKnJ0Y19jYWxsYmFjazsKK3N0YXRpYyBjaGFyIHJ0Y19uYW1lW10gPSAiUlRDIjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmlvZGljX2ZyZXF1ZW5jeTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmlvZGljX2NvdW50OworCit0eXBlZGVmIGVudW0geworCVJUQ19SRUxFQVNFLAorCVJUQ19PUEVOLAorfSBydGNfc3RhdHVzX3Q7CisKK3N0YXRpYyBydGNfc3RhdHVzX3QgcnRjX3N0YXR1czsKKwordHlwZWRlZiBlbnVtIHsKKwlGVU5DVElPTl9SVENfSU9DVEwsCisJRlVOQ1RJT05fUlRDX0NPTlRST0wsCit9IHJ0Y19jYWxsZnJvbV90OworCitzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc291cmNlWzJdID0geworCXsJLm5hbWUJPSBydGNfbmFtZSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCX0sCisJewkubmFtZQk9IHJ0Y19uYW1lLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJfSwKK307CisKKyNkZWZpbmUgUlRDX05VTV9SRVNPVVJDRVMJc2l6ZW9mKHJ0Y19yZXNvdXJjZSkgLyBzaXplb2Yoc3RydWN0IHJlc291cmNlKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9lbGFwc2VkX3NlY29uZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmlyc3RfbG93LCBmaXJzdF9taWQsIGZpcnN0X2hpZ2g7CisJdW5zaWduZWQgbG9uZyBzZWNvbmRfbG93LCBzZWNvbmRfbWlkLCBzZWNvbmRfaGlnaDsKKworCWRvIHsKKwkJZmlyc3RfbG93ID0gcnRjMV9yZWFkKEVUSU1FTFJFRyk7CisJCWZpcnN0X21pZCA9IHJ0YzFfcmVhZChFVElNRU1SRUcpOworCQlmaXJzdF9oaWdoID0gcnRjMV9yZWFkKEVUSU1FSFJFRyk7CisJCXNlY29uZF9sb3cgPSBydGMxX3JlYWQoRVRJTUVMUkVHKTsKKwkJc2Vjb25kX21pZCA9IHJ0YzFfcmVhZChFVElNRU1SRUcpOworCQlzZWNvbmRfaGlnaCA9IHJ0YzFfcmVhZChFVElNRUhSRUcpOworCX0gd2hpbGUgKGZpcnN0X2xvdyAhPSBzZWNvbmRfbG93IHx8IGZpcnN0X21pZCAhPSBzZWNvbmRfbWlkIHx8CisJICAgICAgICAgZmlyc3RfaGlnaCAhPSBzZWNvbmRfaGlnaCk7CisKKwlyZXR1cm4gKGZpcnN0X2hpZ2ggPDwgMTcpIHwgKGZpcnN0X21pZCA8PCAxKSB8IChmaXJzdF9sb3cgPj4gMTUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZWxhcHNlZF9zZWNvbmQodW5zaWduZWQgbG9uZyBzZWMpCit7CisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJcnRjMV93cml0ZShFVElNRUxSRUcsICh1aW50MTZfdCkoc2VjIDw8IDE1KSk7CisJcnRjMV93cml0ZShFVElNRU1SRUcsICh1aW50MTZfdCkoc2VjID4+IDEpKTsKKwlydGMxX3dyaXRlKEVUSU1FSFJFRywgKHVpbnQxNl90KShzZWMgPj4gMTcpKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWxhcm0oc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgYWxhcm1fc2VjOworCisJYWxhcm1fc2VjID0gbWt0aW1lKHRpbWUtPnRtX3llYXIgKyAxOTAwLCB0aW1lLT50bV9tb24gKyAxLCB0aW1lLT50bV9tZGF5LAorCSAgICAgICAgICAgICAgICAgICB0aW1lLT50bV9ob3VyLCB0aW1lLT50bV9taW4sIHRpbWUtPnRtX3NlYyk7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVDTVBMUkVHLCAodWludDE2X3QpKGFsYXJtX3NlYyA8PCAxNSkpOworCXJ0YzFfd3JpdGUoRUNNUE1SRUcsICh1aW50MTZfdCkoYWxhcm1fc2VjID4+IDEpKTsKKwlydGMxX3dyaXRlKEVDTVBIUkVHLCAodWludDE2X3QpKGFsYXJtX3NlYyA+PiAxNykpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfYWxhcm0oc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgbG93LCBtaWQsIGhpZ2g7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlsb3cgPSBydGMxX3JlYWQoRUNNUExSRUcpOworCW1pZCA9IHJ0YzFfcmVhZChFQ01QTVJFRyk7CisJaGlnaCA9IHJ0YzFfcmVhZChFQ01QSFJFRyk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXRvX3RtKChoaWdoIDw8IDE3KSB8IChtaWQgPDwgMSkgfCAobG93ID4+IDE1KSwgdGltZSk7CisJdGltZS0+dG1feWVhciAtPSAxOTAwOworfQorCitzdGF0aWMgdm9pZCByZWFkX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgZXBvY2hfc2VjLCBlbGFwc2VkX3NlYzsKKworCWVwb2NoX3NlYyA9IG1rdGltZShlcG9jaCwgMSwgMSwgMCwgMCwgMCk7CisJZWxhcHNlZF9zZWMgPSByZWFkX2VsYXBzZWRfc2Vjb25kKCk7CisKKwl0b190bShlcG9jaF9zZWMgKyBlbGFwc2VkX3NlYywgdGltZSk7CisJdGltZS0+dG1feWVhciAtPSAxOTAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBlcG9jaF9zZWMsIGN1cnJlbnRfc2VjOworCisJZXBvY2hfc2VjID0gbWt0aW1lKGVwb2NoLCAxLCAxLCAwLCAwLCAwKTsKKwljdXJyZW50X3NlYyA9IG1rdGltZSh0aW1lLT50bV95ZWFyICsgMTkwMCwgdGltZS0+dG1fbW9uICsgMSwgdGltZS0+dG1fbWRheSwKKwkgICAgICAgICAgICAgICAgICAgICB0aW1lLT50bV9ob3VyLCB0aW1lLT50bV9taW4sIHRpbWUtPnRtX3NlYyk7CisKKwl3cml0ZV9lbGFwc2VkX3NlY29uZChjdXJyZW50X3NlYyAtIGVwb2NoX3NlYyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJ0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGlycV9kYXRhOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGNvdW50ICE9IHNpemVvZih1bnNpZ25lZCBpbnQpICYmIGNvdW50ICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcnRjX3dhaXQsICZ3YWl0KTsKKworCWRvIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJaXJxX2RhdGEgPSBydGNfaXJxX2RhdGE7CisJCXJ0Y19pcnFfZGF0YSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJCWlmIChpcnFfZGF0YSAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAocmV0dmFsID09IDApIHsKKwkJaWYgKGNvdW50ID09IHNpemVvZih1bnNpZ25lZCBpbnQpKSB7CisJCQlyZXR2YWwgPSBwdXRfdXNlcihpcnFfZGF0YSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilidWYpOworCQkJaWYgKHJldHZhbCA9PSAwKQorCQkJCXJldHZhbCA9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gcHV0X3VzZXIoaXJxX2RhdGEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWJ1Zik7CisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcmV0dmFsID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQl9CisKKwl9CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnJ0Y193YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0Y19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnRhYmxlKQoreworCXBvbGxfd2FpdChmaWxlLCAmcnRjX3dhaXQsIHRhYmxlKTsKKworCWlmIChydGNfaXJxX2RhdGEgIT0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfZG9faW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIHJ0Y19jYWxsZnJvbV90IGZyb20pCit7CisJc3RydWN0IHJ0Y190aW1lIHRpbWU7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09OOgorCQllbmFibGVfaXJxKEVMQVBTRURUSU1FX0lSUSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PRkY6CisJCWRpc2FibGVfaXJxKEVMQVBTRURUSU1FX0lSUSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1BJRV9PTjoKKwkJZW5hYmxlX2lycShSVENMT05HMV9JUlEpOworCQlicmVhazsKKwljYXNlIFJUQ19QSUVfT0ZGOgorCQlkaXNhYmxlX2lycShSVENMT05HMV9JUlEpOworCQlicmVhazsKKwljYXNlIFJUQ19BTE1fU0VUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnRpbWUsIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc2V0X2FsYXJtKCZ0aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUxNX1JFQUQ6CisJCW1lbXNldCgmdGltZSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOworCQlyZWFkX2FsYXJtKCZ0aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfUkRfVElNRToKKwkJbWVtc2V0KCZ0aW1lLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJCXJlYWRfdGltZSgmdGltZSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdGltZSwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgUlRDX1NFVF9USU1FOgorCQlpZiAoY2FwYWJsZShDQVBfU1lTX1RJTUUpID09IDApCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnRpbWUsIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc2V0X3RpbWUoJnRpbWUpOworCQlicmVhazsKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CisJCXJldHVybiBwdXRfdXNlcihwZXJpb2RpY19mcmVxdWVuY3ksICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgUlRDX0lSUVBfU0VUOgorCQlpZiAoYXJnID4gTUFYX1BFUklPRElDX1JBVEUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoZnJvbSA9PSBGVU5DVElPTl9SVENfSU9DVEwgJiYgYXJnID4gTUFYX1VTRVJfUEVSSU9ESUNfUkFURSAmJgorCQkgICAgY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSA9PSAwKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJcGVyaW9kaWNfZnJlcXVlbmN5ID0gYXJnOworCisJCWNvdW50ID0gUlRDX0ZSRVFVRU5DWTsKKwkJZG9fZGl2KGNvdW50LCBhcmcpOworCisJCXBlcmlvZGljX2NvdW50ID0gY291bnQ7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJCXJ0YzFfd3JpdGUoUlRDTDFMUkVHLCBjb3VudCk7CisJCXJ0YzFfd3JpdGUoUlRDTDFIUkVHLCBjb3VudCA+PiAxNik7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCWJyZWFrOworCWNhc2UgUlRDX0VQT0NIX1JFQUQ6CisJCXJldHVybiBwdXRfdXNlcihlcG9jaCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKTsKKwljYXNlIFJUQ19FUE9DSF9TRVQ6CisJCS8qIERvZXNuJ3Qgc3VwcG9ydCBiZWZvcmUgMTkwMCAqLworCQlpZiAoYXJnIDwgMTkwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjYXBhYmxlKENBUF9TWVNfVElNRSkgPT0gMCkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWVwb2NoID0gYXJnOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gcnRjX2RvX2lvY3RsKGNtZCwgYXJnLCBGVU5DVElPTl9SVENfSU9DVEwpOworfQorCitzdGF0aWMgaW50IHJ0Y19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmIChydGNfc3RhdHVzID09IFJUQ19PUEVOKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJ0Y19zdGF0dXMgPSBSVENfT1BFTjsKKwlydGNfaXJxX2RhdGEgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykKKwkJKHZvaWQpZmFzeW5jX2hlbHBlcigtMSwgZmlsZSwgMCwgJnJ0Y19hc3luY19xdWV1ZSk7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVDTVBMUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBNUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBIUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxTFJFRywgMCk7CisJcnRjMV93cml0ZShSVENMMUhSRUcsIDApOworCisJcnRjX3N0YXR1cyA9IFJUQ19SRUxFQVNFOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlkaXNhYmxlX2lycShFTEFQU0VEVElNRV9JUlEpOworCWRpc2FibGVfaXJxKFJUQ0xPTkcxX0lSUSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZydGNfYXN5bmNfcXVldWUpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcnRjX3JlYWQsCisJLnBvbGwJCT0gcnRjX3BvbGwsCisJLmlvY3RsCQk9IHJ0Y19pb2N0bCwKKwkub3BlbgkJPSBydGNfb3BlbiwKKwkucmVsZWFzZQk9IHJ0Y19yZWxlYXNlLAorCS5mYXN5bmMJCT0gcnRjX2Zhc3luYywKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbGFwc2VkdGltZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzcGluX2xvY2soJnJ0Y19sb2NrKTsKKwlydGMyX3dyaXRlKFJUQ0lOVFJFRywgRUxBUFNFRFRJTUVfSU5UKTsKKworCXJ0Y19pcnFfZGF0YSArPSAweDEwMDsKKwlydGNfaXJxX2RhdGEgJj0gfjB4ZmY7CisJcnRjX2lycV9kYXRhIHw9IFJUQ19BRjsKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJc3Bpbl9sb2NrKCZydGNfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjaykKKwkJcnRjX2NhbGxiYWNrLT5mdW5jKHJ0Y19jYWxsYmFjay0+cHJpdmF0ZV9kYXRhKTsKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CisKKwlraWxsX2Zhc3luYygmcnRjX2FzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBydGNsb25nMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gcGVyaW9kaWNfY291bnQ7CisKKwlzcGluX2xvY2soJnJ0Y19sb2NrKTsKKwlydGMyX3dyaXRlKFJUQ0lOVFJFRywgUlRDTE9ORzFfSU5UKTsKKworCXJ0YzFfd3JpdGUoUlRDTDFMUkVHLCBjb3VudCk7CisJcnRjMV93cml0ZShSVENMMUhSRUcsIGNvdW50ID4+IDE2KTsKKworCXJ0Y19pcnFfZGF0YSArPSAweDEwMDsKKwlydGNfaXJxX2RhdGEgJj0gfjB4ZmY7CisJcnRjX2lycV9kYXRhIHw9IFJUQ19QRjsKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJc3Bpbl9sb2NrKCZydGNfdGFza19sb2NrKTsKKwlpZiAocnRjX2NhbGxiYWNrKQorCQlydGNfY2FsbGJhY2stPmZ1bmMocnRjX2NhbGxiYWNrLT5wcml2YXRlX2RhdGEpOworCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcnRjX3dhaXQpOworCisJa2lsbF9mYXN5bmMoJnJ0Y19hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgcnRjX3JlZ2lzdGVyKHJ0Y190YXNrX3QgKnRhc2spCit7CisJaWYgKHRhc2sgPT0gTlVMTCB8fCB0YXNrLT5mdW5jID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWlmIChydGNfc3RhdHVzID09IFJUQ19PUEVOKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjayAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfdGFza19sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlydGNfY2FsbGJhY2sgPSB0YXNrOworCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKworCXJ0Y19zdGF0dXMgPSBSVENfT1BFTjsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19yZWdpc3Rlcik7CisKK2ludCBydGNfdW5yZWdpc3RlcihydGNfdGFza190ICp0YXNrKQoreworCXNwaW5fbG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCWlmICh0YXNrID09IE5VTEwgfHwgcnRjX2NhbGxiYWNrICE9IHRhc2spIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfdGFza19sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2soJnJ0Y19sb2NrKTsKKworCXJ0YzFfd3JpdGUoRUNNUExSRUcsIDApOworCXJ0YzFfd3JpdGUoRUNNUE1SRUcsIDApOworCXJ0YzFfd3JpdGUoRUNNUEhSRUcsIDApOworCXJ0YzFfd3JpdGUoUlRDTDFMUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxSFJFRywgMCk7CisKKwlydGNfc3RhdHVzID0gUlRDX1JFTEVBU0U7CisKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJcnRjX2NhbGxiYWNrID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX3Rhc2tfbG9jayk7CisKKwlkaXNhYmxlX2lycShFTEFQU0VEVElNRV9JUlEpOworCWRpc2FibGVfaXJxKFJUQ0xPTkcxX0lSUSk7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnRjX3VucmVnaXN0ZXIpOworCitpbnQgcnRjX2NvbnRyb2wocnRjX3Rhc2tfdCAqdGFzaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfdGFza19sb2NrKTsKKworCWlmIChydGNfY2FsbGJhY2sgIT0gdGFzaykKKwkJcmV0dmFsID0gLUVOWElPOworCWVsc2UKKwkJcnRjX2RvX2lvY3RsKGNtZCwgYXJnLCBGVU5DVElPTl9SVENfQ09OVFJPTCk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnRjX2NvbnRyb2wpOworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcnRjX21pc2NkZXZpY2UgPSB7CisJLm1pbm9yCT0gUlRDX01JTk9SLAorCS5uYW1lCT0gcnRjX25hbWUsCisJLmZvcHMJPSAmcnRjX2ZvcHMsCit9OworCitzdGF0aWMgaW50IHJ0Y19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1bnNpZ25lZCBpbnQgaXJxOworCWludCByZXR2YWw7CisKKwlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMikKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJ0YzFfYmFzZSA9IGlvcmVtYXAocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIFJUQzFfU0laRSk7CisJaWYgKHJ0YzFfYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJcnRjMl9iYXNlID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVsxXS5zdGFydCwgUlRDMl9TSVpFKTsKKwlpZiAocnRjMl9iYXNlID09IE5VTEwpIHsKKwkJaW91bm1hcChydGMxX2Jhc2UpOworCQlydGMxX2Jhc2UgPSBOVUxMOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnJ0Y19taXNjZGV2aWNlKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlpb3VubWFwKHJ0YzFfYmFzZSk7CisJCWlvdW5tYXAocnRjMl9iYXNlKTsKKwkJcnRjMV9iYXNlID0gTlVMTDsKKwkJcnRjMl9iYXNlID0gTlVMTDsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVDTVBMUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBNUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBIUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxTFJFRywgMCk7CisJcnRjMV93cml0ZShSVENMMUhSRUcsIDApOworCisJcnRjX3N0YXR1cyA9IFJUQ19SRUxFQVNFOworCXJ0Y19pcnFfZGF0YSA9IDA7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Y193YWl0KTsKKworCWlycSA9IEVMQVBTRURUSU1FX0lSUTsKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIGVsYXBzZWR0aW1lX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCSAgICAgICAgICAgICAgICAgICAgICJlbGFwc2VkX3RpbWUiLCBOVUxMKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJaXJxID0gUlRDTE9ORzFfSVJROworCQlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIHJ0Y2xvbmcxX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAgICAgICAgICAicnRjbG9uZzEiLCBOVUxMKTsKKwl9CisKKwlpZiAocmV0dmFsIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YzogSVJRJWQgaXMgYnVzeVxuIiwgaXJxKTsKKwkJaWYgKGlycSA9PSBSVENMT05HMV9JUlEpCisJCQlmcmVlX2lycShFTEFQU0VEVElNRV9JUlEsIE5VTEwpOworCQlpb3VubWFwKHJ0YzFfYmFzZSk7CisJCWlvdW5tYXAocnRjMl9iYXNlKTsKKwkJcnRjMV9iYXNlID0gTlVMTDsKKwkJcnRjMl9iYXNlID0gTlVMTDsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkaXNhYmxlX2lycShFTEFQU0VEVElNRV9JUlEpOworCWRpc2FibGVfaXJxKFJUQ0xPTkcxX0lSUSk7CisKKwlzcGluX2xvY2tfaW5pdCgmcnRjX3Rhc2tfbG9jayk7CisKKwlwcmludGsoS0VSTl9JTkZPICJydGM6IFJlYWwgVGltZSBDbG9jayBvZiBORUMgVlI0MTAwIHNlcmllc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gbWlzY19kZXJlZ2lzdGVyKCZydGNfbWlzY2RldmljZSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlmcmVlX2lycShFTEFQU0VEVElNRV9JUlEsIE5VTEwpOworCWZyZWVfaXJxKFJUQ0xPTkcxX0lSUSwgTlVMTCk7CisJaWYgKHJ0YzFfYmFzZSAhPSBOVUxMKQorCQlpb3VubWFwKHJ0YzFfYmFzZSk7CisJaWYgKHJ0YzJfYmFzZSAhPSBOVUxMKQorCQlpb3VubWFwKHJ0YzJfYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJ0Y19wbGF0Zm9ybV9kZXZpY2U7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBydGNfZGV2aWNlX2RyaXZlciA9IHsKKwkubmFtZQkJPSBydGNfbmFtZSwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gcnRjX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZyNDF4eF9ydGNfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSkgeworCWNhc2UgQ1BVX1ZSNDExMToKKwljYXNlIENQVV9WUjQxMjE6CisJCXJ0Y19yZXNvdXJjZVswXS5zdGFydCA9IFJUQzFfVFlQRTFfU1RBUlQ7CisJCXJ0Y19yZXNvdXJjZVswXS5lbmQgPSBSVEMxX1RZUEUxX0VORDsKKwkJcnRjX3Jlc291cmNlWzFdLnN0YXJ0ID0gUlRDMl9UWVBFMV9TVEFSVDsKKwkJcnRjX3Jlc291cmNlWzFdLmVuZCA9IFJUQzJfVFlQRTFfRU5EOworCQlicmVhazsKKwljYXNlIENQVV9WUjQxMjI6CisJY2FzZSBDUFVfVlI0MTMxOgorCWNhc2UgQ1BVX1ZSNDEzMzoKKwkJcnRjX3Jlc291cmNlWzBdLnN0YXJ0ID0gUlRDMV9UWVBFMl9TVEFSVDsKKwkJcnRjX3Jlc291cmNlWzBdLmVuZCA9IFJUQzFfVFlQRTJfRU5EOworCQlydGNfcmVzb3VyY2VbMV0uc3RhcnQgPSBSVEMyX1RZUEUyX1NUQVJUOworCQlydGNfcmVzb3VyY2VbMV0uZW5kID0gUlRDMl9UWVBFMl9FTkQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCQlicmVhazsKKwl9CisKKwlydGNfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiUlRDIiwgLTEsIHJ0Y19yZXNvdXJjZSwgUlRDX05VTV9SRVNPVVJDRVMpOworCWlmIChJU19FUlIocnRjX3BsYXRmb3JtX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKHJ0Y19wbGF0Zm9ybV9kZXZpY2UpOworCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZydGNfZGV2aWNlX2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHJ0Y19wbGF0Zm9ybV9kZXZpY2UpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZyNDF4eF9ydGNfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZydGNfZGV2aWNlX2RyaXZlcik7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihydGNfcGxhdGZvcm1fZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQodnI0MXh4X3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHZyNDF4eF9ydGNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWYxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdnQuYwpAQCAtMCwwICsxLDMyNDIgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL3Z0LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBIb3BlZnVsbHkgdGhpcyB3aWxsIGJlIGEgcmF0aGVyIGNvbXBsZXRlIFZUMTAyIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEJlZXBpbmcgdGhhbmtzIHRvIEpvaG4gVCBLb2hsLgorICoKKyAqIFZpcnR1YWwgQ29uc29sZXMsIFNjcmVlbiBCbGFua2luZywgU2NyZWVuIER1bXBpbmcsIENvbG9yLCBHcmFwaGljcworICogICBDaGFycywgYW5kIFZUMTAwIGVuaGFuY2VtZW50cyBieSBQZXRlciBNYWNEb25hbGQuCisgKgorICogQ29weSBhbmQgcGFzdGUgZnVuY3Rpb24gYnkgQW5kcmV3IEhheWxldHQsCisgKiAgIHNvbWUgZW5oYW5jZW1lbnRzIGJ5IEFsZXNzYW5kcm8gUnViaW5pLgorICoKKyAqIENvZGUgdG8gY2hlY2sgZm9yIGRpZmZlcmVudCB2aWRlby1jYXJkcyBtb3N0bHkgYnkgR2FsZW4gSHVudCwKKyAqIDxnLWh1bnRAZWUudXRhaC5lZHU+CisgKgorICogUnVkaW1lbnRhcnkgSVNPIDEwNjQ2L1VuaWNvZGUvVVRGLTggY2hhcmFjdGVyIHNldCBzdXBwb3J0IGJ5CisgKiBNYXJrdXMgS3VobiwgPG1za3VobkBpbW1kNC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4uCisgKgorICogRHluYW1pYyBhbGxvY2F0aW9uIG9mIGNvbnNvbGVzLCBhZWJAY3dpLm5sLCBNYXkgMTk5NAorICogUmVzaXppbmcgb2YgY29uc29sZXMsIGFlYiwgOTQwOTI2CisgKgorICogQ29kZSBmb3IgeHRlcm0gbGlrZSBtb3VzZSBjbGljayByZXBvcnRpbmcgYnkgUGV0ZXIgT3JiYWVrIDIwLUp1bC05NAorICogPHBvZUBkYWltaS5hYXUuZGs+CisgKgorICogVXNlci1kZWZpbmVkIGJlbGwgc291bmQsIG5ldyBzZXR0ZXJtIGNvbnRyb2wgc2VxdWVuY2VzIGFuZCBwcmludGsKKyAqIHJlZGlyZWN0aW9uIGJ5IE1hcnRpbiBNYXJlcyA8bWpAazMzMi5mZWxkLmN2dXQuY3o+IDE5LU5vdi05NQorICoKKyAqIEFQTSBzY3JlZW5ibGFuayBidWcgZml4ZWQgVGFrYXNoaSBNYW5hYmUgPG1hbmFiZUByb3kuZHNsLnR1dGljcy50dXQuanA+CisgKgorICogTWVyZ2Ugd2l0aCB0aGUgYWJzdHJhY3QgY29uc29sZSBkcml2ZXIgYnkgR2VlcnQgVXl0dGVyaG9ldmVuCisgKiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+LCBKYW4gMTk5Ny4KKyAqCisgKiAgIE9yaWdpbmFsIG02OGsgY29uc29sZSBkcml2ZXIgbW9kaWZpY2F0aW9ucyBieQorICoKKyAqICAgICAtIEFybm8gR3JpZmZpb2VuIDxhcm5vQHVzbi5ubD4KKyAqICAgICAtIERhdmlkIENhcnRlciA8Y2FydGVyQGNzLmJyaXMuYWMudWs+CisgKiAKKyAqICAgVGhlIGFic3RyYWN0IGNvbnNvbGUgZHJpdmVyIHByb3ZpZGVzIGEgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgdGV4dAorICogICBjb25zb2xlLiBJdCBzdXBwb3J0cyBWR0EgdGV4dCBtb2RlLCBmcmFtZSBidWZmZXIgYmFzZWQgZ3JhcGhpY2FsIGNvbnNvbGVzCisgKiAgIGFuZCBzcGVjaWFsIGdyYXBoaWNzIHByb2Nlc3NvcnMgdGhhdCBhcmUgb25seSBhY2Nlc3NpYmxlIHRocm91Z2ggc29tZQorICogICByZWdpc3RlcnMgKGUuZy4gYSBUTVMzNDB4MCBHU1ApLgorICoKKyAqICAgVGhlIGludGVyZmFjZSB0byB0aGUgaGFyZHdhcmUgaXMgc3BlY2lmaWVkIHVzaW5nIGEgc3BlY2lhbCBzdHJ1Y3R1cmUKKyAqICAgKHN0cnVjdCBjb25zdykgd2hpY2ggY29udGFpbnMgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY29uc29sZSBvcGVyYXRpb25zCisgKiAgIChzZWUgPGxpbnV4L2NvbnNvbGUuaD4gZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorICoKKyAqIFN1cHBvcnQgZm9yIGNoYW5nZWFibGUgY3Vyc29yIHNoYXBlCisgKiBieSBQYXZlbCBNYWNoZWsgPHBhdmVsQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4sIEF1Z3VzdCAxOTk3CisgKgorICogUG9ydGVkIHRvIGkzODYgYW5kIGNvbl9zY3JvbGxkZWx0YSBmaXhlZAorICogYnkgRW1tYW51ZWwgTWFydHkgPGNvcmVAZ2dpLXByb2plY3Qub3JnPiwgQXByaWwgMTk5OAorICoKKyAqIFJlc3VycmVjdGVkIGNoYXJhY3RlciBidWZmZXJzIGluIHZpZGVvcmFtIHBsdXMgbG90cyBvZiBvdGhlciB0cmlja2VyeQorICogYnkgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+LCBKdWx5IDE5OTgKKyAqCisgKiBSZW1vdmVkIG9sZC1zdHlsZSB0aW1lcnMsIGludHJvZHVjZWQgY29uc29sZV90aW1lciwgbWFkZSB0aW1lcgorICogZGVsZXRpb24gU01QLXNhZmUuICAxN0p1bjAwLCBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CisgKgorICogUmVtb3ZlZCBjb25zb2xlX2xvY2ssIGVuYWJsZWQgaW50ZXJydXB0cyBhY3Jvc3MgYWxsIGNvbnNvbGUgb3BlcmF0aW9ucworICogMTMgTWFyY2ggMjAwMSwgQW5kcmV3IE1vcnRvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90aW9jbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworY29uc3Qgc3RydWN0IGNvbnN3ICpjb25zd2l0Y2hwOworCisvKiBBIGJpdG1hcCBmb3IgY29kZXMgPDMyLiBBIGJpdCBvZiAxIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoYXQgYml0IG51bWJlciBpbnZva2VzIHNvbWUgc3BlY2lhbCBhY3Rpb24KKyAqIChzdWNoIGFzIGN1cnNvciBtb3ZlbWVudCkgYW5kIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIGFzIGEKKyAqIGdseXBoIHVubGVzcyB0aGUgZGlzcF9jdHJsIG1vZGUgaXMgZXhwbGljaXRseSBlbmFibGVkLgorICovCisjZGVmaW5lIENUUkxfQUNUSU9OIDB4MGQwMGZmODEKKyNkZWZpbmUgQ1RSTF9BTFdBWVMgMHgwODAwZjUwMQkvKiBDYW5ub3QgYmUgb3ZlcnJpZGRlbiBieSBkaXNwX2N0cmwgKi8KKworLyoKKyAqIEhlcmUgaXMgdGhlIGRlZmF1bHQgYmVsbCBwYXJhbWV0ZXJzOiA3NTBIWiwgMS84dGggb2YgYSBzZWNvbmQKKyAqLworI2RlZmluZSBERUZBVUxUX0JFTExfUElUQ0gJNzUwCisjZGVmaW5lIERFRkFVTFRfQkVMTF9EVVJBVElPTgkoSFovOCkKKworZXh0ZXJuIHZvaWQgdmNzX21ha2VfZGV2ZnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCB2Y3NfcmVtb3ZlX2RldmZzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCitleHRlcm4gdm9pZCBjb25zb2xlX21hcF9pbml0KHZvaWQpOworI2lmZGVmIENPTkZJR19QUk9NX0NPTlNPTEUKK2V4dGVybiB2b2lkIHByb21fY29uX2luaXQodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTURBX0NPTlNPTEUKK2V4dGVybiBpbnQgbWRhX2NvbnNvbGVfaW5pdCh2b2lkKTsKKyNlbmRpZgorCitzdHJ1Y3QgdmMgdmNfY29ucyBbTUFYX05SX0NPTlNPTEVTXTsKKworI2lmbmRlZiBWVF9TSU5HTEVfRFJJVkVSCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnN3ICpjb25fZHJpdmVyX21hcFtNQVhfTlJfQ09OU09MRVNdOworI2VuZGlmCisKK3N0YXRpYyBpbnQgY29uX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCB2Y19pbml0KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IHJvd3MsCisJCSAgICB1bnNpZ25lZCBpbnQgY29scywgaW50IGRvX2NsZWFyKTsKK3N0YXRpYyB2b2lkIGdvdG94eShzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBuZXdfeCwgaW50IG5ld195KTsKK3N0YXRpYyB2b2lkIHNhdmVfY3VyKHN0cnVjdCB2Y19kYXRhICp2Yyk7CitzdGF0aWMgdm9pZCByZXNldF90ZXJtaW5hbChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBkb19jbGVhcik7CitzdGF0aWMgdm9pZCBjb25fZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBzZXRfdmVzYV9ibGFua2luZyhjaGFyIF9fdXNlciAqcCk7CitzdGF0aWMgdm9pZCBzZXRfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yyk7CitzdGF0aWMgdm9pZCBoaWRlX2N1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMpOworc3RhdGljIHZvaWQgY29uc29sZV9jYWxsYmFjayh2b2lkICppZ25vcmVkKTsKK3N0YXRpYyB2b2lkIGJsYW5rX3NjcmVlbl90KHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHZvaWQgc2V0X3BhbGV0dGUoc3RydWN0IHZjX2RhdGEgKnZjKTsKKworc3RhdGljIGludCBwcmludGFibGU7CQkvKiBJcyBjb25zb2xlIHJlYWR5IGZvciBwcmludGluZz8gKi8KKworLyoKKyAqIGlnbm9yZV9wb2tlOiBkb24ndCB1bmJsYW5rIHRoZSBzY3JlZW4gd2hlbiB0aGluZ3MgYXJlIHR5cGVkLiAgVGhpcyBpcworICogbWFpbmx5IGZvciB0aGUgcHJpdmFjeSBvZiBicmFpbGxlIHRlcm1pbmFsIHVzZXJzLgorICovCitzdGF0aWMgaW50IGlnbm9yZV9wb2tlOworCitpbnQgZG9fcG9rZV9ibGFua2VkX2NvbnNvbGU7CitpbnQgY29uc29sZV9ibGFua2VkOworCitzdGF0aWMgaW50IHZlc2FfYmxhbmtfbW9kZTsgLyogMDpub25lIDE6c3VzcGVuZFYgMjpzdXNwZW5kSCAzOnBvd2VyZG93biAqLworc3RhdGljIGludCBibGFua2ludGVydmFsID0gMTAqNjAqSFo7CitzdGF0aWMgaW50IHZlc2Ffb2ZmX2ludGVydmFsOworCitzdGF0aWMgREVDTEFSRV9XT1JLKGNvbnNvbGVfd29yaywgY29uc29sZV9jYWxsYmFjaywgTlVMTCk7CisKKy8qCisgKiBmZ19jb25zb2xlIGlzIHRoZSBjdXJyZW50IHZpcnR1YWwgY29uc29sZSwKKyAqIGxhc3RfY29uc29sZSBpcyB0aGUgbGFzdCB1c2VkIG9uZSwKKyAqIHdhbnRfY29uc29sZSBpcyB0aGUgY29uc29sZSB3ZSB3YW50IHRvIHN3aXRjaCB0bywKKyAqIGttc2dfcmVkaXJlY3QgaXMgdGhlIGNvbnNvbGUgZm9yIGtlcm5lbCBtZXNzYWdlcywKKyAqLworaW50IGZnX2NvbnNvbGU7CitpbnQgbGFzdF9jb25zb2xlOworaW50IHdhbnRfY29uc29sZSA9IC0xOworaW50IGttc2dfcmVkaXJlY3Q7CisKKy8qCisgKiBGb3IgZWFjaCBleGlzdGluZyBkaXNwbGF5LCB3ZSBoYXZlIGEgcG9pbnRlciB0byBjb25zb2xlIGN1cnJlbnRseSB2aXNpYmxlCisgKiBvbiB0aGF0IGRpc3BsYXksIGFsbG93aW5nIGNvbnNvbGVzIG90aGVyIHRoYW4gZmdfY29uc29sZSB0byBiZSByZWZyZXNoZWQKKyAqIGFwcHJvcHJpYXRlbHkuIFVubGVzcyB0aGUgbG93LWxldmVsIGRyaXZlciBzdXBwbGllcyBpdHMgb3duIGRpc3BsYXlfZmcKKyAqIHZhcmlhYmxlLCB3ZSB1c2UgdGhpcyBvbmUgZm9yIHRoZSAibWFzdGVyIGRpc3BsYXkiLgorICovCitzdGF0aWMgc3RydWN0IHZjX2RhdGEgKm1hc3Rlcl9kaXNwbGF5X2ZnOworCisvKgorICogVW5mb3J0dW5hdGVseSwgd2UgbmVlZCB0byBkZWxheSB0dHkgZWNobyB3aGVuIHdlJ3JlIGN1cnJlbnRseSB3cml0aW5nIHRvIHRoZQorICogY29uc29sZSBzaW5jZSB0aGUgY29kZSBpcyAoYW5kIGFsd2F5cyB3YXMpIG5vdCByZS1lbnRyYW50LCBzbyB3ZSBzY2hlZHVsZQorICogYWxsIGZsaXAgcmVxdWVzdHMgdG8gcHJvY2VzcyBjb250ZXh0IHdpdGggc2NoZWR1bGUtdGFzaygpIGFuZCBydW4gaXQgZnJvbQorICogY29uc29sZV9jYWxsYmFjaygpLgorICovCisKKy8qCisgKiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBkZWZlciBzY3JvbGxiYWNrIHRvIHRoZSBjb25zb2xlIGNhbGxiYWNrLgorICovCitzdGF0aWMgaW50IHNjcm9sbGJhY2tfZGVsdGE7CisKKy8qCisgKiBIb29rIHNvIHRoYXQgdGhlIHBvd2VyIG1hbmFnZW1lbnQgcm91dGluZXMgY2FuICh1bilibGFuaworICogdGhlIGNvbnNvbGUgb24gb3VyIGJlaGFsZi4KKyAqLworaW50ICgqY29uc29sZV9ibGFua19ob29rKShpbnQpOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY29uc29sZV90aW1lcjsKK3N0YXRpYyBpbnQgYmxhbmtfc3RhdGU7CitzdGF0aWMgaW50IGJsYW5rX3RpbWVyX2V4cGlyZWQ7CitlbnVtIHsKKwlibGFua19vZmYgPSAwLAorCWJsYW5rX25vcm1hbF93YWl0LAorCWJsYW5rX3Zlc2Ffd2FpdCwKK307CisKKy8qCisgKglMb3ctTGV2ZWwgRnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBJU19GRyh2YykJKCh2YyktPnZjX251bSA9PSBmZ19jb25zb2xlKQorCisjaWZkZWYgVlRfQlVGX1ZSQU1fT05MWQorI2RlZmluZSBET19VUERBVEUodmMpCTAKKyNlbHNlCisjZGVmaW5lIERPX1VQREFURSh2YykJQ09OX0lTX1ZJU0lCTEUodmMpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCAqc2NyZWVucG9zKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG9mZnNldCwgaW50IHZpZXdlZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqcDsKKwkKKwlpZiAoIXZpZXdlZCkKKwkJcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfb3JpZ2luICsgb2Zmc2V0KTsKKwllbHNlIGlmICghdmMtPnZjX3N3LT5jb25fc2NyZWVuX3BvcykKKwkJcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfdmlzaWJsZV9vcmlnaW4gKyBvZmZzZXQpOworCWVsc2UKKwkJcCA9IHZjLT52Y19zdy0+Y29uX3NjcmVlbl9wb3ModmMsIG9mZnNldCk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3JvbGxkZWx0YShpbnQgbGluZXMpCit7CisJc2Nyb2xsYmFja19kZWx0YSArPSBsaW5lczsKKwlzY2hlZHVsZV9jb25zb2xlX2NhbGxiYWNrKCk7Cit9CisKK3ZvaWQgc2NoZWR1bGVfY29uc29sZV9jYWxsYmFjayh2b2lkKQoreworCXNjaGVkdWxlX3dvcmsoJmNvbnNvbGVfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHNjcnVwKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBiLCBpbnQgbnIpCit7CisJdW5zaWduZWQgc2hvcnQgKmQsICpzOworCisJaWYgKHQrbnIgPj0gYikKKwkJbnIgPSBiIC0gdCAtIDE7CisJaWYgKGIgPiB2Yy0+dmNfcm93cyB8fCB0ID49IGIgfHwgbnIgPCAxKQorCQlyZXR1cm47CisJaWYgKENPTl9JU19WSVNJQkxFKHZjKSAmJiB2Yy0+dmNfc3ctPmNvbl9zY3JvbGwodmMsIHQsIGIsIFNNX1VQLCBucikpCisJCXJldHVybjsKKwlkID0gKHVuc2lnbmVkIHNob3J0ICopKHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2l6ZV9yb3cgKiB0KTsKKwlzID0gKHVuc2lnbmVkIHNob3J0ICopKHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2l6ZV9yb3cgKiAodCArIG5yKSk7CisJc2NyX21lbW1vdmV3KGQsIHMsIChiIC0gdCAtIG5yKSAqIHZjLT52Y19zaXplX3Jvdyk7CisJc2NyX21lbXNldHcoZCArIChiIC0gdCAtIG5yKSAqIHZjLT52Y19jb2xzLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKKwkJICAgIHZjLT52Y19zaXplX3JvdyAqIG5yKTsKK30KKworc3RhdGljIHZvaWQgc2NyZG93bihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgYiwgaW50IG5yKQoreworCXVuc2lnbmVkIHNob3J0ICpzOworCXVuc2lnbmVkIGludCBzdGVwOworCisJaWYgKHQrbnIgPj0gYikKKwkJbnIgPSBiIC0gdCAtIDE7CisJaWYgKGIgPiB2Yy0+dmNfcm93cyB8fCB0ID49IGIgfHwgbnIgPCAxKQorCQlyZXR1cm47CisJaWYgKENPTl9JU19WSVNJQkxFKHZjKSAmJiB2Yy0+dmNfc3ctPmNvbl9zY3JvbGwodmMsIHQsIGIsIFNNX0RPV04sIG5yKSkKKwkJcmV0dXJuOworCXMgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqIHQpOworCXN0ZXAgPSB2Yy0+dmNfY29scyAqIG5yOworCXNjcl9tZW1tb3ZldyhzICsgc3RlcCwgcywgKGIgLSB0IC0gbnIpICogdmMtPnZjX3NpemVfcm93KTsKKwlzY3JfbWVtc2V0dyhzLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgMiAqIHN0ZXApOworfQorCitzdGF0aWMgdm9pZCBkb191cGRhdGVfcmVnaW9uKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgbG9uZyBzdGFydCwgaW50IGNvdW50KQoreworI2lmbmRlZiBWVF9CVUZfVlJBTV9PTkxZCisJdW5zaWduZWQgaW50IHh4LCB5eSwgb2Zmc2V0OworCXUxNiAqcDsKKworCXAgPSAodTE2ICopIHN0YXJ0OworCWlmICghdmMtPnZjX3N3LT5jb25fZ2V0eHkpIHsKKwkJb2Zmc2V0ID0gKHN0YXJ0IC0gdmMtPnZjX29yaWdpbikgLyAyOworCQl4eCA9IG9mZnNldCAlIHZjLT52Y19jb2xzOworCQl5eSA9IG9mZnNldCAvIHZjLT52Y19jb2xzOworCX0gZWxzZSB7CisJCWludCBueHgsIG55eTsKKwkJc3RhcnQgPSB2Yy0+dmNfc3ctPmNvbl9nZXR4eSh2Yywgc3RhcnQsICZueHgsICZueXkpOworCQl4eCA9IG54eDsgeXkgPSBueXk7CisJfQorCWZvcig7OykgeworCQl1MTYgYXR0cmliID0gc2NyX3JlYWR3KHApICYgMHhmZjAwOworCQlpbnQgc3RhcnR4ID0geHg7CisJCXUxNiAqcSA9IHA7CisJCXdoaWxlICh4eCA8IHZjLT52Y19jb2xzICYmIGNvdW50KSB7CisJCQlpZiAoYXR0cmliICE9IChzY3JfcmVhZHcocCkgJiAweGZmMDApKSB7CisJCQkJaWYgKHAgPiBxKQorCQkJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjcyh2YywgcSwgcC1xLCB5eSwgc3RhcnR4KTsKKwkJCQlzdGFydHggPSB4eDsKKwkJCQlxID0gcDsKKwkJCQlhdHRyaWIgPSBzY3JfcmVhZHcocCkgJiAweGZmMDA7CisJCQl9CisJCQlwKys7CisJCQl4eCsrOworCQkJY291bnQtLTsKKwkJfQorCQlpZiAocCA+IHEpCisJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjcyh2YywgcSwgcC1xLCB5eSwgc3RhcnR4KTsKKwkJaWYgKCFjb3VudCkKKwkJCWJyZWFrOworCQl4eCA9IDA7CisJCXl5Kys7CisJCWlmICh2Yy0+dmNfc3ctPmNvbl9nZXR4eSkgeworCQkJcCA9ICh1MTYgKilzdGFydDsKKwkJCXN0YXJ0ID0gdmMtPnZjX3N3LT5jb25fZ2V0eHkodmMsIHN0YXJ0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKyNlbmRpZgorfQorCit2b2lkIHVwZGF0ZV9yZWdpb24oc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgY291bnQpCit7CisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwlpZiAoRE9fVVBEQVRFKHZjKSkgeworCQloaWRlX2N1cnNvcih2Yyk7CisJCWRvX3VwZGF0ZV9yZWdpb24odmMsIHN0YXJ0LCBjb3VudCk7CisJCXNldF9jdXJzb3IodmMpOworCX0KK30KKworLyogU3RydWN0dXJlIG9mIGF0dHJpYnV0ZXMgaXMgaGFyZHdhcmUtZGVwZW5kZW50ICovCisKK3N0YXRpYyB1OCBidWlsZF9hdHRyKHN0cnVjdCB2Y19kYXRhICp2YywgdTggX2NvbG9yLCB1OCBfaW50ZW5zaXR5LCB1OCBfYmxpbmssIHU4IF91bmRlcmxpbmUsIHU4IF9yZXZlcnNlKQoreworCWlmICh2Yy0+dmNfc3ctPmNvbl9idWlsZF9hdHRyKQorCQlyZXR1cm4gdmMtPnZjX3N3LT5jb25fYnVpbGRfYXR0cih2YywgX2NvbG9yLCBfaW50ZW5zaXR5LCBfYmxpbmssIF91bmRlcmxpbmUsIF9yZXZlcnNlKTsKKworI2lmbmRlZiBWVF9CVUZfVlJBTV9PTkxZCisvKgorICogKytyb21hbjogSSBjb21wbGV0ZWx5IGNoYW5nZWQgdGhlIGF0dHJpYnV0ZSBmb3JtYXQgZm9yIG1vbm9jaHJvbWUKKyAqIG1vZGUgKCFjYW5fZG9fY29sb3IpLiBUaGUgZm9ybWVybHkgdXNlZCBNREEgKG1vbm9jaHJvbWUgZGlzcGxheQorICogYWRhcHRlcikgZm9ybWF0IGRpZG4ndCBhbGxvdyB0aGUgY29tYmluYXRpb24gb2YgY2VydGFpbiBlZmZlY3RzLgorICogTm93IHRoZSBhdHRyaWJ1dGUgaXMganVzdCBhIGJpdCB2ZWN0b3I6CisgKiAgQml0IDAuLjE6IGludGVuc2l0eSAoMC4uMikKKyAqICBCaXQgMiAgIDogdW5kZXJsaW5lCisgKiAgQml0IDMgICA6IHJldmVyc2UKKyAqICBCaXQgNyAgIDogYmxpbmsKKyAqLworCXsKKwl1OCBhID0gdmMtPnZjX2NvbG9yOworCWlmICghdmMtPnZjX2Nhbl9kb19jb2xvcikKKwkJcmV0dXJuIF9pbnRlbnNpdHkgfAorCQkgICAgICAgKF91bmRlcmxpbmUgPyA0IDogMCkgfAorCQkgICAgICAgKF9yZXZlcnNlID8gOCA6IDApIHwKKwkJICAgICAgIChfYmxpbmsgPyAweDgwIDogMCk7CisJaWYgKF91bmRlcmxpbmUpCisJCWEgPSAoYSAmIDB4ZjApIHwgdmMtPnZjX3VsY29sb3I7CisJZWxzZSBpZiAoX2ludGVuc2l0eSA9PSAwKQorCQlhID0gKGEgJiAweGYwKSB8IHZjLT52Y191bGNvbG9yOworCWlmIChfcmV2ZXJzZSkKKwkJYSA9ICgoYSkgJiAweDg4KSB8ICgoKChhKSA+PiA0KSB8ICgoYSkgPDwgNCkpICYgMHg3Nyk7CisJaWYgKF9ibGluaykKKwkJYSBePSAweDgwOworCWlmIChfaW50ZW5zaXR5ID09IDIpCisJCWEgXj0gMHgwODsKKwlpZiAodmMtPnZjX2hpX2ZvbnRfbWFzayA9PSAweDEwMCkKKwkJYSA8PD0gMTsKKwlyZXR1cm4gYTsKKwl9CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9hdHRyKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwl2Yy0+dmNfYXR0ciA9IGJ1aWxkX2F0dHIodmMsIHZjLT52Y19jb2xvciwgdmMtPnZjX2ludGVuc2l0eSwgdmMtPnZjX2JsaW5rLCB2Yy0+dmNfdW5kZXJsaW5lLCB2Yy0+dmNfcmV2ZXJzZSBeIHZjLT52Y19kZWNzY25tKTsKKwl2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA9IChidWlsZF9hdHRyKHZjLCB2Yy0+dmNfY29sb3IsIDEsIHZjLT52Y19ibGluaywgMCwgdmMtPnZjX2RlY3Njbm0pIDw8IDgpIHwgJyAnOworfQorCisvKiBOb3RlOiBpbnZlcnRpbmcgdGhlIHNjcmVlbiB0d2ljZSBzaG91bGQgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCBzdGF0ZSAqLwordm9pZCBpbnZlcnRfc2NyZWVuKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG9mZnNldCwgaW50IGNvdW50LCBpbnQgdmlld2VkKQoreworCXVuc2lnbmVkIHNob3J0ICpwOworCisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwljb3VudCAvPSAyOworCXAgPSBzY3JlZW5wb3ModmMsIG9mZnNldCwgdmlld2VkKTsKKwlpZiAodmMtPnZjX3N3LT5jb25faW52ZXJ0X3JlZ2lvbikKKwkJdmMtPnZjX3N3LT5jb25faW52ZXJ0X3JlZ2lvbih2YywgcCwgY291bnQpOworI2lmbmRlZiBWVF9CVUZfVlJBTV9PTkxZCisJZWxzZSB7CisJCXUxNiAqcSA9IHA7CisJCWludCBjbnQgPSBjb3VudDsKKwkJdTE2IGE7CisKKwkJaWYgKCF2Yy0+dmNfY2FuX2RvX2NvbG9yKSB7CisJCQl3aGlsZSAoY250LS0pIHsKKwkJCSAgICBhID0gc2NyX3JlYWR3KHEpOworCQkJICAgIGEgXj0gMHgwODAwOworCQkJICAgIHNjcl93cml0ZXcoYSwgcSk7CisJCQkgICAgcSsrOworCQkJfQorCQl9IGVsc2UgaWYgKHZjLT52Y19oaV9mb250X21hc2sgPT0gMHgxMDApIHsKKwkJCXdoaWxlIChjbnQtLSkgeworCQkJCWEgPSBzY3JfcmVhZHcocSk7CisJCQkJYSA9ICgoYSkgJiAweDExZmYpIHwgKCgoYSkgJiAweGUwMDApID4+IDQpIHwgKCgoYSkgJiAweDBlMDApIDw8IDQpOworCQkJCXNjcl93cml0ZXcoYSwgcSk7CisJCQkJcSsrOworCQkJfQorCQl9IGVsc2UgeworCQkJd2hpbGUgKGNudC0tKSB7CisJCQkJYSA9IHNjcl9yZWFkdyhxKTsKKwkJCQlhID0gKChhKSAmIDB4ODhmZikgfCAoKChhKSAmIDB4NzAwMCkgPj4gNCkgfCAoKChhKSAmIDB4MDcwMCkgPDwgNCk7CisJCQkJc2NyX3dyaXRldyhhLCBxKTsKKwkJCQlxKys7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoRE9fVVBEQVRFKHZjKSkKKwkJZG9fdXBkYXRlX3JlZ2lvbih2YywgKHVuc2lnbmVkIGxvbmcpIHAsIGNvdW50KTsKK30KKworLyogdXNlZCBieSBzZWxlY3Rpb246IGNvbXBsZW1lbnQgcG9pbnRlciBwb3NpdGlvbiAqLwordm9pZCBjb21wbGVtZW50X3BvcyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBvZmZzZXQpCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0ICpwOworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvbGQ7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IG9sZHgsIG9sZHk7CisKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmIChwKSB7CisJCXNjcl93cml0ZXcob2xkLCBwKTsKKwkJaWYgKERPX1VQREFURSh2YykpCisJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCBvbGQsIG9sZHksIG9sZHgpOworCX0KKwlpZiAob2Zmc2V0ID09IC0xKQorCQlwID0gTlVMTDsKKwllbHNlIHsKKwkJdW5zaWduZWQgc2hvcnQgbmV3OworCQlwID0gc2NyZWVucG9zKHZjLCBvZmZzZXQsIDEpOworCQlvbGQgPSBzY3JfcmVhZHcocCk7CisJCW5ldyA9IG9sZCBeIHZjLT52Y19jb21wbGVtZW50X21hc2s7CisJCXNjcl93cml0ZXcobmV3LCBwKTsKKwkJaWYgKERPX1VQREFURSh2YykpIHsKKwkJCW9sZHggPSAob2Zmc2V0ID4+IDEpICUgdmMtPnZjX2NvbHM7CisJCQlvbGR5ID0gKG9mZnNldCA+PiAxKSAvIHZjLT52Y19jb2xzOworCQkJdmMtPnZjX3N3LT5jb25fcHV0Yyh2YywgbmV3LCBvbGR5LCBvbGR4KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaW5zZXJ0X2NoYXIoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJdW5zaWduZWQgc2hvcnQgKnAsICpxID0gKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX3BvczsKKworCXAgPSBxICsgdmMtPnZjX2NvbHMgLSBuciAtIHZjLT52Y194OworCXdoaWxlICgtLXAgPj0gcSkKKwkJc2NyX3dyaXRldyhzY3JfcmVhZHcocCksIHAgKyBucik7CisJc2NyX21lbXNldHcocSwgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsIG5yICogMik7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7CisJaWYgKERPX1VQREFURSh2YykpIHsKKwkJdW5zaWduZWQgc2hvcnQgb2xkYXR0ciA9IHZjLT52Y19hdHRyOworCQl2Yy0+dmNfc3ctPmNvbl9ibW92ZSh2YywgdmMtPnZjX3ksIHZjLT52Y194LCB2Yy0+dmNfeSwgdmMtPnZjX3ggKyBuciwgMSwKKwkJCQkgICAgIHZjLT52Y19jb2xzIC0gdmMtPnZjX3ggLSBucik7CisJCXZjLT52Y19hdHRyID0gdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgPj4gODsKKwkJd2hpbGUgKG5yLS0pCisJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgdmMtPnZjX3ksIHZjLT52Y194ICsgbnIpOworCQl2Yy0+dmNfYXR0ciA9IG9sZGF0dHI7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZWxldGVfY2hhcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBucikKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IHZjLT52Y194OworCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX3BvczsKKworCXdoaWxlICgrK2kgPD0gdmMtPnZjX2NvbHMgLSBucikgeworCQlzY3Jfd3JpdGV3KHNjcl9yZWFkdyhwK25yKSwgcCk7CisJCXArKzsKKwl9CisJc2NyX21lbXNldHcocCwgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsIG5yICogMik7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7CisJaWYgKERPX1VQREFURSh2YykpIHsKKwkJdW5zaWduZWQgc2hvcnQgb2xkYXR0ciA9IHZjLT52Y19hdHRyOworCQl2Yy0+dmNfc3ctPmNvbl9ibW92ZSh2YywgdmMtPnZjX3ksIHZjLT52Y194ICsgbnIsIHZjLT52Y195LCB2Yy0+dmNfeCwgMSwKKwkJCQkgICAgIHZjLT52Y19jb2xzIC0gdmMtPnZjX3ggLSBucik7CisJCXZjLT52Y19hdHRyID0gdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgPj4gODsKKwkJd2hpbGUgKG5yLS0pCisJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgdmMtPnZjX3ksCisJCQkJICAgICB2Yy0+dmNfY29scyAtIDEgLSBucik7CisJCXZjLT52Y19hdHRyID0gb2xkYXR0cjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc29mdGN1cnNvcl9vcmlnaW5hbDsKKworc3RhdGljIHZvaWQgYWRkX3NvZnRjdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWludCBpID0gc2NyX3JlYWR3KCh1MTYgKikgdmMtPnZjX3Bvcyk7CisJdTMyIHR5cGUgPSB2Yy0+dmNfY3Vyc29yX3R5cGU7CisKKwlpZiAoISAodHlwZSAmIDB4MTApKSByZXR1cm47CisJaWYgKHNvZnRjdXJzb3Jfb3JpZ2luYWwgIT0gLTEpIHJldHVybjsKKwlzb2Z0Y3Vyc29yX29yaWdpbmFsID0gaTsKKwlpIHw9ICgodHlwZSA+PiA4KSAmIDB4ZmYwMCApOworCWkgXj0gKCh0eXBlKSAmIDB4ZmYwMCApOworCWlmICgodHlwZSAmIDB4MjApICYmICgoc29mdGN1cnNvcl9vcmlnaW5hbCAmIDB4NzAwMCkgPT0gKGkgJiAweDcwMDApKSkgaSBePSAweDcwMDA7CisJaWYgKCh0eXBlICYgMHg0MCkgJiYgKChpICYgMHg3MDApID09ICgoaSAmIDB4NzAwMCkgPj4gNCkpKSBpIF49IDB4MDcwMDsKKwlzY3Jfd3JpdGV3KGksICh1MTYgKikgdmMtPnZjX3Bvcyk7CisJaWYgKERPX1VQREFURSh2YykpCisJCXZjLT52Y19zdy0+Y29uX3B1dGModmMsIGksIHZjLT52Y195LCB2Yy0+dmNfeCk7Cit9CisKK3N0YXRpYyB2b2lkIGhpZGVfc29mdGN1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaWYgKHNvZnRjdXJzb3Jfb3JpZ2luYWwgIT0gLTEpIHsKKwkJc2NyX3dyaXRldyhzb2Z0Y3Vyc29yX29yaWdpbmFsLCAodTE2ICopdmMtPnZjX3Bvcyk7CisJCWlmIChET19VUERBVEUodmMpKQorCQkJdmMtPnZjX3N3LT5jb25fcHV0Yyh2Yywgc29mdGN1cnNvcl9vcmlnaW5hbCwKKwkJCQkJdmMtPnZjX3ksIHZjLT52Y194KTsKKwkJc29mdGN1cnNvcl9vcmlnaW5hbCA9IC0xOworCX0KK30KKworc3RhdGljIHZvaWQgaGlkZV9jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWlmICh2YyA9PSBzZWxfY29ucykKKwkJY2xlYXJfc2VsZWN0aW9uKCk7CisJdmMtPnZjX3N3LT5jb25fY3Vyc29yKHZjLCBDTV9FUkFTRSk7CisJaGlkZV9zb2Z0Y3Vyc29yKHZjKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2N1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaWYgKCFJU19GRyh2YykgfHwgY29uc29sZV9ibGFua2VkIHx8CisJICAgIHZjLT52Y19tb2RlID09IEtEX0dSQVBISUNTKQorCQlyZXR1cm47CisJaWYgKHZjLT52Y19kZWNjbSkgeworCQlpZiAodmMgPT0gc2VsX2NvbnMpCisJCQljbGVhcl9zZWxlY3Rpb24oKTsKKwkJYWRkX3NvZnRjdXJzb3IodmMpOworCQlpZiAoKHZjLT52Y19jdXJzb3JfdHlwZSAmIDB4MGYpICE9IDEpCisJCQl2Yy0+dmNfc3ctPmNvbl9jdXJzb3IodmMsIENNX0RSQVcpOworCX0gZWxzZQorCQloaWRlX2N1cnNvcih2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9vcmlnaW4oc3RydWN0IHZjX2RhdGEgKnZjKQoreworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKCFDT05fSVNfVklTSUJMRSh2YykgfHwKKwkgICAgIXZjLT52Y19zdy0+Y29uX3NldF9vcmlnaW4gfHwKKwkgICAgIXZjLT52Y19zdy0+Y29uX3NldF9vcmlnaW4odmMpKQorCQl2Yy0+dmNfb3JpZ2luID0gKHVuc2lnbmVkIGxvbmcpdmMtPnZjX3NjcmVlbmJ1ZjsKKwl2Yy0+dmNfdmlzaWJsZV9vcmlnaW4gPSB2Yy0+dmNfb3JpZ2luOworCXZjLT52Y19zY3JfZW5kID0gdmMtPnZjX29yaWdpbiArIHZjLT52Y19zY3JlZW5idWZfc2l6ZTsKKwl2Yy0+dmNfcG9zID0gdmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqIHZjLT52Y195ICsgMiAqIHZjLT52Y194OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9zY3JlZW4oc3RydWN0IHZjX2RhdGEgKnZjKQoreworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKHZjLT52Y19zdy0+Y29uX3NhdmVfc2NyZWVuKQorCQl2Yy0+dmNfc3ctPmNvbl9zYXZlX3NjcmVlbih2Yyk7Cit9CisKKy8qCisgKglSZWRyYXdpbmcgb2Ygc2NyZWVuCisgKi8KKworc3RhdGljIHZvaWQgY2xlYXJfYnVmZmVyX2F0dHJpYnV0ZXMoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX29yaWdpbjsKKwlpbnQgY291bnQgPSB2Yy0+dmNfc2NyZWVuYnVmX3NpemUgLyAyOworCWludCBtYXNrID0gdmMtPnZjX2hpX2ZvbnRfbWFzayB8IDB4ZmY7CisKKwlmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tLCBwKyspIHsKKwkJc2NyX3dyaXRldygoc2NyX3JlYWR3KHApJm1hc2spIHwgKHZjLT52Y192aWRlb19lcmFzZV9jaGFyICYgfm1hc2spLCBwKTsKKwl9Cit9CisKK3ZvaWQgcmVkcmF3X3NjcmVlbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBpc19zd2l0Y2gpCit7CisJaW50IHJlZHJhdyA9IDA7CisKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmICghdmMpIHsKKwkJLyogc3RyYW5nZSAuLi4gKi8KKwkJLyogcHJpbnRrKCJyZWRyYXdfc2NyZWVuOiB0dHkgJWQgbm90IGFsbG9jYXRlZCA/P1xuIiwgbmV3X2NvbnNvbGUrMSk7ICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfc3dpdGNoKSB7CisJCXN0cnVjdCB2Y19kYXRhICpvbGRfdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJCWlmIChvbGRfdmMgPT0gdmMpCisJCQlyZXR1cm47CisJCWlmICghQ09OX0lTX1ZJU0lCTEUodmMpKQorCQkJcmVkcmF3ID0gMTsKKwkJKnZjLT52Y19kaXNwbGF5X2ZnID0gdmM7CisJCWZnX2NvbnNvbGUgPSB2Yy0+dmNfbnVtOworCQloaWRlX2N1cnNvcihvbGRfdmMpOworCQlpZiAoIUNPTl9JU19WSVNJQkxFKG9sZF92YykpIHsKKwkJCXNhdmVfc2NyZWVuKG9sZF92Yyk7CisJCQlzZXRfb3JpZ2luKG9sZF92Yyk7CisJCX0KKwl9IGVsc2UgeworCQloaWRlX2N1cnNvcih2Yyk7CisJCXJlZHJhdyA9IDE7CisJfQorCisJaWYgKHJlZHJhdykgeworCQlpbnQgdXBkYXRlOworCQlpbnQgb2xkX3dhc19jb2xvciA9IHZjLT52Y19jYW5fZG9fY29sb3I7CisKKwkJc2V0X29yaWdpbih2Yyk7CisJCXVwZGF0ZSA9IHZjLT52Y19zdy0+Y29uX3N3aXRjaCh2Yyk7CisJCXNldF9wYWxldHRlKHZjKTsKKwkJLyoKKwkJICogSWYgY29uc29sZSBjaGFuZ2VkIGZyb20gbW9ubzwtPmNvbG9yLCB0aGUgYmVzdCB3ZSBjYW4gZG8KKwkJICogaXMgdG8gY2xlYXIgdGhlIGJ1ZmZlciBhdHRyaWJ1dGVzLiBBcyBpdCBjdXJyZW50bHkgc3RhbmRzLAorCQkgKiByZWJ1aWxkaW5nIG5ldyBhdHRyaWJ1dGVzIGZyb20gdGhlIG9sZCBidWZmZXIgaXMgbm90IGRvYWJsZQorCQkgKiB3aXRob3V0IG92ZXJseSBjb21wbGV4IGNvZGUuCisJCSAqLworCQlpZiAob2xkX3dhc19jb2xvciAhPSB2Yy0+dmNfY2FuX2RvX2NvbG9yKSB7CisJCQl1cGRhdGVfYXR0cih2Yyk7CisJCQljbGVhcl9idWZmZXJfYXR0cmlidXRlcyh2Yyk7CisJCX0KKwkJaWYgKHVwZGF0ZSAmJiB2Yy0+dmNfbW9kZSAhPSBLRF9HUkFQSElDUykKKwkJCWRvX3VwZGF0ZV9yZWdpb24odmMsIHZjLT52Y19vcmlnaW4sIHZjLT52Y19zY3JlZW5idWZfc2l6ZSAvIDIpOworCX0KKwlzZXRfY3Vyc29yKHZjKTsKKwlpZiAoaXNfc3dpdGNoKSB7CisJCXNldF9sZWRzKCk7CisJCWNvbXB1dGVfc2hpZnRzdGF0ZSgpOworCX0KK30KKworLyoKKyAqCUFsbG9jYXRpb24sIGZyZWVpbmcgYW5kIHJlc2l6aW5nIG9mIFZUcy4KKyAqLworCitpbnQgdmNfY29uc19hbGxvY2F0ZWQodW5zaWduZWQgaW50IGkpCit7CisJcmV0dXJuIChpIDwgTUFYX05SX0NPTlNPTEVTICYmIHZjX2NvbnNbaV0uZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpc3VhbF9pbml0KHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG51bSwgaW50IGluaXQpCit7CisJLyogKytHZWVydDogdmMtPnZjX3N3LT5jb25faW5pdCBkZXRlcm1pbmVzIGNvbnNvbGUgc2l6ZSAqLworCWlmICh2Yy0+dmNfc3cpCisJCW1vZHVsZV9wdXQodmMtPnZjX3N3LT5vd25lcik7CisJdmMtPnZjX3N3ID0gY29uc3dpdGNocDsKKyNpZm5kZWYgVlRfU0lOR0xFX0RSSVZFUgorCWlmIChjb25fZHJpdmVyX21hcFtudW1dKQorCQl2Yy0+dmNfc3cgPSBjb25fZHJpdmVyX21hcFtudW1dOworI2VuZGlmCisJX19tb2R1bGVfZ2V0KHZjLT52Y19zdy0+b3duZXIpOworCXZjLT52Y19udW0gPSBudW07CisJdmMtPnZjX2Rpc3BsYXlfZmcgPSAmbWFzdGVyX2Rpc3BsYXlfZmc7CisJdmMtPnZjX3VuaV9wYWdlZGlyX2xvYyA9ICZ2Yy0+dmNfdW5pX3BhZ2VkaXI7CisJdmMtPnZjX3VuaV9wYWdlZGlyID0gMDsKKwl2Yy0+dmNfaGlfZm9udF9tYXNrID0gMDsKKwl2Yy0+dmNfY29tcGxlbWVudF9tYXNrID0gMDsKKwl2Yy0+dmNfY2FuX2RvX2NvbG9yID0gMDsKKwl2Yy0+dmNfc3ctPmNvbl9pbml0KHZjLCBpbml0KTsKKwlpZiAoIXZjLT52Y19jb21wbGVtZW50X21hc2spCisJCXZjLT52Y19jb21wbGVtZW50X21hc2sgPSB2Yy0+dmNfY2FuX2RvX2NvbG9yID8gMHg3NzAwIDogMHgwODAwOworCXZjLT52Y19zX2NvbXBsZW1lbnRfbWFzayA9IHZjLT52Y19jb21wbGVtZW50X21hc2s7CisJdmMtPnZjX3NpemVfcm93ID0gdmMtPnZjX2NvbHMgPDwgMTsKKwl2Yy0+dmNfc2NyZWVuYnVmX3NpemUgPSB2Yy0+dmNfcm93cyAqIHZjLT52Y19zaXplX3JvdzsKK30KKworaW50IHZjX2FsbG9jYXRlKHVuc2lnbmVkIGludCBjdXJyY29ucykJLyogcmV0dXJuIDAgb24gc3VjY2VzcyAqLworeworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKGN1cnJjb25zID49IE1BWF9OUl9DT05TT0xFUykKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXZjX2NvbnNbY3VycmNvbnNdLmQpIHsKKwkgICAgc3RydWN0IHZjX2RhdGEgKnZjOworCisJICAgIC8qIHByZXZlbnQgdXNlcnMgZnJvbSB0YWtpbmcgdG9vIG11Y2ggbWVtb3J5ICovCisJICAgIGlmIChjdXJyY29ucyA+PSBNQVhfTlJfVVNFUl9DT05TT0xFUyAmJiAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkgICAgICByZXR1cm4gLUVQRVJNOworCisJICAgIC8qIGR1ZSB0byB0aGUgZ3JhbnVsYXJpdHkgb2Yga21hbGxvYywgd2Ugd2FzdGUgc29tZSBtZW1vcnkgaGVyZSAqLworCSAgICAvKiB0aGUgYWxsb2MgaXMgZG9uZSBpbiB0d28gc3RlcHMsIHRvIG9wdGltaXplIHRoZSBjb21tb24gc2l0dWF0aW9uCisJICAgICAgIG9mIGEgMjV4ODAgY29uc29sZSAoc3RydWN0c2l6ZT0yMTYsIHNjcmVlbmJ1Zl9zaXplPTQwMDApICovCisJICAgIC8qIGFsdGhvdWdoIHRoZSBudW1iZXJzIGFib3ZlIGFyZSBub3QgdmFsaWQgc2luY2UgbG9uZyBhZ28sIHRoZQorCSAgICAgICBwb2ludCBpcyBzdGlsbCB1cC10by1kYXRlIGFuZCB0aGUgY29tbWVudCBzdGlsbCBoYXMgaXRzIHZhbHVlCisJICAgICAgIGV2ZW4gaWYgb25seSBhcyBhIGhpc3RvcmljYWwgYXJ0aWZhY3QuICAtLW1qLCBKdWx5IDE5OTggKi8KKwkgICAgdmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmNfZGF0YSksIEdGUF9LRVJORUwpOworCSAgICBpZiAoIXZjKQorCQlyZXR1cm4gLUVOT01FTTsKKwkgICAgbWVtc2V0KHZjLCAwLCBzaXplb2YoKnZjKSk7CisJICAgIHZjX2NvbnNbY3VycmNvbnNdLmQgPSB2YzsKKwkgICAgdmlzdWFsX2luaXQodmMsIGN1cnJjb25zLCAxKTsKKwkgICAgaWYgKCEqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYykKKwkJY29uX3NldF9kZWZhdWx0X3VuaW1hcCh2Yyk7CisJICAgIHZjLT52Y19zY3JlZW5idWYgPSBrbWFsbG9jKHZjLT52Y19zY3JlZW5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJICAgIGlmICghdmMtPnZjX3NjcmVlbmJ1ZikgeworCQlrZnJlZSh2Yyk7CisJCXZjX2NvbnNbY3VycmNvbnNdLmQgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwkgICAgfQorCSAgICB2Yy0+dmNfa21hbGxvY2VkID0gMTsKKwkgICAgdmNfaW5pdCh2YywgdmMtPnZjX3Jvd3MsIHZjLT52Y19jb2xzLCAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc2l6ZV9zY3JlZW4oc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJLyogUmVzaXplcyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZGlzcGxheSBhZGFwYXRlciAqLworCWludCBlcnIgPSAwOworCisJaWYgKHZjLT52Y19tb2RlICE9IEtEX0dSQVBISUNTICYmIHZjLT52Y19zdy0+Y29uX3Jlc2l6ZSkKKwkJZXJyID0gdmMtPnZjX3N3LT5jb25fcmVzaXplKHZjLCB3aWR0aCwgaGVpZ2h0KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ2hhbmdlICMgb2Ygcm93cyBhbmQgY29sdW1ucyAoMCBtZWFucyB1bmNoYW5nZWQvdGhlIHNpemUgb2YgZmdfY29uc29sZSkKKyAqIFt0aGlzIGlzIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBzb21lIHVzZXIgcHJvZ3JhbQorICogbGlrZSByZXNpemUgdGhhdCBjaGFuZ2VzIHRoZSBoYXJkd2FyZSB2aWRlb21vZGVdCisgKi8KKyNkZWZpbmUgVkNfUkVTSVpFX01BWENPTCAoMzI3NjcpCisjZGVmaW5lIFZDX1JFU0laRV9NQVhST1cgKDMyNzY3KQoraW50IHZjX3Jlc2l6ZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBjb2xzLCB1bnNpZ25lZCBpbnQgbGluZXMpCit7CisJdW5zaWduZWQgbG9uZyBvbGRfb3JpZ2luLCBuZXdfb3JpZ2luLCBuZXdfc2NyX2VuZCwgcmx0aCwgcnJlbSwgZXJyID0gMDsKKwl1bnNpZ25lZCBpbnQgb2xkX2NvbHMsIG9sZF9yb3dzLCBvbGRfcm93X3NpemUsIG9sZF9zY3JlZW5fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbmV3X2NvbHMsIG5ld19yb3dzLCBuZXdfcm93X3NpemUsIG5ld19zY3JlZW5fc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCAqbmV3c2NyZWVuOworCisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwlpZiAoIXZjKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKGNvbHMgPiBWQ19SRVNJWkVfTUFYQ09MIHx8IGxpbmVzID4gVkNfUkVTSVpFX01BWFJPVykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluZXdfY29scyA9IChjb2xzID8gY29scyA6IHZjLT52Y19jb2xzKTsKKwluZXdfcm93cyA9IChsaW5lcyA/IGxpbmVzIDogdmMtPnZjX3Jvd3MpOworCW5ld19yb3dfc2l6ZSA9IG5ld19jb2xzIDw8IDE7CisJbmV3X3NjcmVlbl9zaXplID0gbmV3X3Jvd19zaXplICogbmV3X3Jvd3M7CisKKwlpZiAobmV3X2NvbHMgPT0gdmMtPnZjX2NvbHMgJiYgbmV3X3Jvd3MgPT0gdmMtPnZjX3Jvd3MpCisJCXJldHVybiAwOworCisJbmV3c2NyZWVuID0gKHVuc2lnbmVkIHNob3J0ICopIGttYWxsb2MobmV3X3NjcmVlbl9zaXplLCBHRlBfVVNFUik7CisJaWYgKCFuZXdzY3JlZW4pCisJCXJldHVybiAtRU5PTUVNOworCisJb2xkX3Jvd3MgPSB2Yy0+dmNfcm93czsKKwlvbGRfY29scyA9IHZjLT52Y19jb2xzOworCW9sZF9yb3dfc2l6ZSA9IHZjLT52Y19zaXplX3JvdzsKKwlvbGRfc2NyZWVuX3NpemUgPSB2Yy0+dmNfc2NyZWVuYnVmX3NpemU7CisKKwllcnIgPSByZXNpemVfc2NyZWVuKHZjLCBuZXdfY29scywgbmV3X3Jvd3MpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUobmV3c2NyZWVuKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl2Yy0+dmNfcm93cyA9IG5ld19yb3dzOworCXZjLT52Y19jb2xzID0gbmV3X2NvbHM7CisJdmMtPnZjX3NpemVfcm93ID0gbmV3X3Jvd19zaXplOworCXZjLT52Y19zY3JlZW5idWZfc2l6ZSA9IG5ld19zY3JlZW5fc2l6ZTsKKworCXJsdGggPSBtaW4ob2xkX3Jvd19zaXplLCBuZXdfcm93X3NpemUpOworCXJyZW0gPSBuZXdfcm93X3NpemUgLSBybHRoOworCW9sZF9vcmlnaW4gPSB2Yy0+dmNfb3JpZ2luOworCW5ld19vcmlnaW4gPSAobG9uZykgbmV3c2NyZWVuOworCW5ld19zY3JfZW5kID0gbmV3X29yaWdpbiArIG5ld19zY3JlZW5fc2l6ZTsKKwlpZiAobmV3X3Jvd3MgPCBvbGRfcm93cykKKwkJb2xkX29yaWdpbiArPSAob2xkX3Jvd3MgLSBuZXdfcm93cykgKiBvbGRfcm93X3NpemU7CisKKwl1cGRhdGVfYXR0cih2Yyk7CisKKwl3aGlsZSAob2xkX29yaWdpbiA8IHZjLT52Y19zY3JfZW5kKSB7CisJCXNjcl9tZW1jcHl3KCh1bnNpZ25lZCBzaG9ydCAqKSBuZXdfb3JpZ2luLCAodW5zaWduZWQgc2hvcnQgKikgb2xkX29yaWdpbiwgcmx0aCk7CisJCWlmIChycmVtKQorCQkJc2NyX21lbXNldHcoKHZvaWQgKikobmV3X29yaWdpbiArIHJsdGgpLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgcnJlbSk7CisJCW9sZF9vcmlnaW4gKz0gb2xkX3Jvd19zaXplOworCQluZXdfb3JpZ2luICs9IG5ld19yb3dfc2l6ZTsKKwl9CisJaWYgKG5ld19zY3JfZW5kID4gbmV3X29yaWdpbikKKwkJc2NyX21lbXNldHcoKHZvaWQgKiluZXdfb3JpZ2luLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgbmV3X3Njcl9lbmQgLSBuZXdfb3JpZ2luKTsKKwlpZiAodmMtPnZjX2ttYWxsb2NlZCkKKwkJa2ZyZWUodmMtPnZjX3NjcmVlbmJ1Zik7CisJdmMtPnZjX3NjcmVlbmJ1ZiA9IG5ld3NjcmVlbjsKKwl2Yy0+dmNfa21hbGxvY2VkID0gMTsKKwl2Yy0+dmNfc2NyZWVuYnVmX3NpemUgPSBuZXdfc2NyZWVuX3NpemU7CisJc2V0X29yaWdpbih2Yyk7CisKKwkvKiBkbyBwYXJ0IG9mIGEgcmVzZXRfdGVybWluYWwoKSAqLworCXZjLT52Y190b3AgPSAwOworCXZjLT52Y19ib3R0b20gPSB2Yy0+dmNfcm93czsKKwlnb3RveHkodmMsIHZjLT52Y194LCB2Yy0+dmNfeSk7CisJc2F2ZV9jdXIodmMpOworCisJaWYgKHZjLT52Y190dHkpIHsKKwkJc3RydWN0IHdpbnNpemUgd3MsICpjd3MgPSAmdmMtPnZjX3R0eS0+d2luc2l6ZTsKKworCQltZW1zZXQoJndzLCAwLCBzaXplb2Yod3MpKTsKKwkJd3Mud3Nfcm93ID0gdmMtPnZjX3Jvd3M7CisJCXdzLndzX2NvbCA9IHZjLT52Y19jb2xzOworCQl3cy53c195cGl4ZWwgPSB2Yy0+dmNfc2Nhbl9saW5lczsKKwkJaWYgKCh3cy53c19yb3cgIT0gY3dzLT53c19yb3cgfHwgd3Mud3NfY29sICE9IGN3cy0+d3NfY29sKSAmJgorCQkgICAgdmMtPnZjX3R0eS0+cGdycCA+IDApCisJCQlraWxsX3BnKHZjLT52Y190dHktPnBncnAsIFNJR1dJTkNILCAxKTsKKwkJKmN3cyA9IHdzOworCX0KKworCWlmIChDT05fSVNfVklTSUJMRSh2YykpCisJCXVwZGF0ZV9zY3JlZW4odmMpOworCXJldHVybiBlcnI7Cit9CisKKwordm9pZCB2Y19kaXNhbGxvY2F0ZSh1bnNpZ25lZCBpbnQgY3VycmNvbnMpCit7CisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwlpZiAodmNfY29uc19hbGxvY2F0ZWQoY3VycmNvbnMpKSB7CisJCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbY3VycmNvbnNdLmQ7CisJCXZjLT52Y19zdy0+Y29uX2RlaW5pdCh2Yyk7CisJCWlmICh2Yy0+dmNfa21hbGxvY2VkKQorCQkJa2ZyZWUodmMtPnZjX3NjcmVlbmJ1Zik7CisJCWlmIChjdXJyY29ucyA+PSBNSU5fTlJfQ09OU09MRVMpCisJCQlrZnJlZSh2Yyk7CisJCXZjX2NvbnNbY3VycmNvbnNdLmQgPSBOVUxMOworCX0KK30KKworLyoKKyAqCVZUMTAyIGVtdWxhdG9yCisgKi8KKworI2RlZmluZSBzZXRfa2JkKHZjLCB4KQlzZXRfdmNfa2JkX21vZGUoa2JkX3RhYmxlICsgKHZjKS0+dmNfbnVtLCAoeCkpCisjZGVmaW5lIGNscl9rYmQodmMsIHgpCWNscl92Y19rYmRfbW9kZShrYmRfdGFibGUgKyAodmMpLT52Y19udW0sICh4KSkKKyNkZWZpbmUgaXNfa2JkKHZjLCB4KQl2Y19rYmRfbW9kZShrYmRfdGFibGUgKyAodmMpLT52Y19udW0sICh4KSkKKworI2RlZmluZSBkZWNhcm0JCVZDX1JFUEVBVAorI2RlZmluZSBkZWNja20JCVZDX0NLTU9ERQorI2RlZmluZSBrYmRhcHBsaWMJVkNfQVBQTElDCisjZGVmaW5lIGxubQkJVkNfQ1JMRgorCisvKgorICogdGhpcyBpcyB3aGF0IHRoZSB0ZXJtaW5hbCBhbnN3ZXJzIHRvIGEgRVNDLVogb3IgY3NpMGMgcXVlcnkuCisgKi8KKyNkZWZpbmUgVlQxMDBJRCAiXDAzM1s/MTsyYyIKKyNkZWZpbmUgVlQxMDJJRCAiXDAzM1s/NmMiCisKK3Vuc2lnbmVkIGNoYXIgY29sb3JfdGFibGVbXSA9IHsgMCwgNCwgMiwgNiwgMSwgNSwgMywgNywKKwkJCQkgICAgICAgOCwxMiwxMCwxNCwgOSwxMywxMSwxNSB9OworCisvKiB0aGUgZGVmYXVsdCBjb2xvdXIgdGFibGUsIGZvciBWR0ErIGNvbG91ciBzeXN0ZW1zICovCitpbnQgZGVmYXVsdF9yZWRbXSA9IHsweDAwLDB4YWEsMHgwMCwweGFhLDB4MDAsMHhhYSwweDAwLDB4YWEsCisgICAgMHg1NSwweGZmLDB4NTUsMHhmZiwweDU1LDB4ZmYsMHg1NSwweGZmfTsKK2ludCBkZWZhdWx0X2dybltdID0gezB4MDAsMHgwMCwweGFhLDB4NTUsMHgwMCwweDAwLDB4YWEsMHhhYSwKKyAgICAweDU1LDB4NTUsMHhmZiwweGZmLDB4NTUsMHg1NSwweGZmLDB4ZmZ9OworaW50IGRlZmF1bHRfYmx1W10gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweGFhLDB4YWEsMHhhYSwweGFhLAorICAgIDB4NTUsMHg1NSwweDU1LDB4NTUsMHhmZiwweGZmLDB4ZmYsMHhmZn07CisKKy8qCisgKiBnb3RveHkoKSBtdXN0IHZlcmlmeSBhbGwgYm91bmRhcmllcywgYmVjYXVzZSB0aGUgYXJndW1lbnRzCisgKiBtaWdodCBhbHNvIGJlIG5lZ2F0aXZlLiBJZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgb3V0IG9mCisgKiBib3VuZHMsIHRoZSBjdXJzb3IgaXMgcGxhY2VkIGF0IHRoZSBuZWFyZXN0IG1hcmdpbi4KKyAqLworc3RhdGljIHZvaWQgZ290b3h5KHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG5ld194LCBpbnQgbmV3X3kpCit7CisJaW50IG1pbl95LCBtYXhfeTsKKworCWlmIChuZXdfeCA8IDApCisJCXZjLT52Y194ID0gMDsKKwllbHNlIHsKKwkJaWYgKG5ld194ID49IHZjLT52Y19jb2xzKQorCQkJdmMtPnZjX3ggPSB2Yy0+dmNfY29scyAtIDE7CisJCWVsc2UKKwkJCXZjLT52Y194ID0gbmV3X3g7CisJfQorCisgCWlmICh2Yy0+dmNfZGVjb20pIHsKKwkJbWluX3kgPSB2Yy0+dmNfdG9wOworCQltYXhfeSA9IHZjLT52Y19ib3R0b207CisJfSBlbHNlIHsKKwkJbWluX3kgPSAwOworCQltYXhfeSA9IHZjLT52Y19yb3dzOworCX0KKwlpZiAobmV3X3kgPCBtaW5feSkKKwkJdmMtPnZjX3kgPSBtaW5feTsKKwllbHNlIGlmIChuZXdfeSA+PSBtYXhfeSkKKwkJdmMtPnZjX3kgPSBtYXhfeSAtIDE7CisJZWxzZQorCQl2Yy0+dmNfeSA9IG5ld195OworCXZjLT52Y19wb3MgPSB2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3kgKiB2Yy0+dmNfc2l6ZV9yb3cgKyAodmMtPnZjX3g8PDEpOworCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCisvKiBmb3IgYWJzb2x1dGUgdXNlciBtb3Zlcywgd2hlbiBkZWNvbSBpcyBzZXQgKi8KK3N0YXRpYyB2b2lkIGdvdG94YXkoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgbmV3X3gsIGludCBuZXdfeSkKK3sKKwlnb3RveHkodmMsIG5ld194LCB2Yy0+dmNfZGVjb20gPyAodmMtPnZjX3RvcCArIG5ld195KSA6IG5ld195KTsKK30KKwordm9pZCBzY3JvbGxiYWNrKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGxpbmVzKQoreworCWlmICghbGluZXMpCisJCWxpbmVzID0gdmMtPnZjX3Jvd3MgLyAyOworCXNjcm9sbGRlbHRhKC1saW5lcyk7Cit9CisKK3ZvaWQgc2Nyb2xsZnJvbnQoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgbGluZXMpCit7CisJaWYgKCFsaW5lcykKKwkJbGluZXMgPSB2Yy0+dmNfcm93cyAvIDI7CisJc2Nyb2xsZGVsdGEobGluZXMpOworfQorCitzdGF0aWMgdm9pZCBsZihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisgICAgCS8qIGRvbid0IHNjcm9sbCBpZiBhYm92ZSBib3R0b20gb2Ygc2Nyb2xsaW5nIHJlZ2lvbiwgb3IKKwkgKiBpZiBiZWxvdyBzY3JvbGxpbmcgcmVnaW9uCisJICovCisgICAgCWlmICh2Yy0+dmNfeSArIDEgPT0gdmMtPnZjX2JvdHRvbSkKKwkJc2NydXAodmMsIHZjLT52Y190b3AsIHZjLT52Y19ib3R0b20sIDEpOworCWVsc2UgaWYgKHZjLT52Y195IDwgdmMtPnZjX3Jvd3MgLSAxKSB7CisJICAgIAl2Yy0+dmNfeSsrOworCQl2Yy0+dmNfcG9zICs9IHZjLT52Y19zaXplX3JvdzsKKwl9CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJpKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKyAgICAJLyogZG9uJ3Qgc2Nyb2xsIGlmIGJlbG93IHRvcCBvZiBzY3JvbGxpbmcgcmVnaW9uLCBvcgorCSAqIGlmIGFib3ZlIHNjcm9sbGluZyByZWdpb24KKwkgKi8KKwlpZiAodmMtPnZjX3kgPT0gdmMtPnZjX3RvcCkKKwkJc2NyZG93bih2YywgdmMtPnZjX3RvcCwgdmMtPnZjX2JvdHRvbSwgMSk7CisJZWxzZSBpZiAodmMtPnZjX3kgPiAwKSB7CisJCXZjLT52Y195LS07CisJCXZjLT52Y19wb3MgLT0gdmMtPnZjX3NpemVfcm93OworCX0KKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwl2Yy0+dmNfcG9zIC09IHZjLT52Y194IDw8IDE7CisJdmMtPnZjX25lZWRfd3JhcCA9IHZjLT52Y194ID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlpZiAodmMtPnZjX3gpIHsKKwkJdmMtPnZjX3BvcyAtPSAyOworCQl2Yy0+dmNfeC0tOworCQl2Yy0+dmNfbmVlZF93cmFwID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWwoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCS8qIGlnbm9yZWQgKi8KK30KKworc3RhdGljIHZvaWQgY3NpX0ooc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgdnBhcikKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgc2hvcnQgKiBzdGFydDsKKworCXN3aXRjaCAodnBhcikgeworCQljYXNlIDA6CS8qIGVyYXNlIGZyb20gY3Vyc29yIHRvIGVuZCBvZiBkaXNwbGF5ICovCisJCQljb3VudCA9ICh2Yy0+dmNfc2NyX2VuZCAtIHZjLT52Y19wb3MpID4+IDE7CisJCQlzdGFydCA9ICh1bnNpZ25lZCBzaG9ydCAqKXZjLT52Y19wb3M7CisJCQlpZiAoRE9fVVBEQVRFKHZjKSkgeworCQkJCS8qIGRvIGluIHR3byBzdGFnZXMgKi8KKwkJCQl2Yy0+dmNfc3ctPmNvbl9jbGVhcih2YywgdmMtPnZjX3ksIHZjLT52Y194LCAxLAorCQkJCQkgICAgICB2Yy0+dmNfY29scyAtIHZjLT52Y194KTsKKwkJCQl2Yy0+dmNfc3ctPmNvbl9jbGVhcih2YywgdmMtPnZjX3kgKyAxLCAwLAorCQkJCQkgICAgICB2Yy0+dmNfcm93cyAtIHZjLT52Y195IC0gMSwKKwkJCQkJICAgICAgdmMtPnZjX2NvbHMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToJLyogZXJhc2UgZnJvbSBzdGFydCB0byBjdXJzb3IgKi8KKwkJCWNvdW50ID0gKCh2Yy0+dmNfcG9zIC0gdmMtPnZjX29yaWdpbikgPj4gMSkgKyAxOworCQkJc3RhcnQgPSAodW5zaWduZWQgc2hvcnQgKil2Yy0+dmNfb3JpZ2luOworCQkJaWYgKERPX1VQREFURSh2YykpIHsKKwkJCQkvKiBkbyBpbiB0d28gc3RhZ2VzICovCisJCQkJdmMtPnZjX3N3LT5jb25fY2xlYXIodmMsIDAsIDAsIHZjLT52Y195LAorCQkJCQkgICAgICB2Yy0+dmNfY29scyk7CisJCQkJdmMtPnZjX3N3LT5jb25fY2xlYXIodmMsIHZjLT52Y195LCAwLCAxLAorCQkJCQkgICAgICB2Yy0+dmNfeCArIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjogLyogZXJhc2Ugd2hvbGUgZGlzcGxheSAqLworCQkJY291bnQgPSB2Yy0+dmNfY29scyAqIHZjLT52Y19yb3dzOworCQkJc3RhcnQgPSAodW5zaWduZWQgc2hvcnQgKil2Yy0+dmNfb3JpZ2luOworCQkJaWYgKERPX1VQREFURSh2YykpCisJCQkJdmMtPnZjX3N3LT5jb25fY2xlYXIodmMsIDAsIDAsCisJCQkJCSAgICAgIHZjLT52Y19yb3dzLAorCQkJCQkgICAgICB2Yy0+dmNfY29scyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwl9CisJc2NyX21lbXNldHcoc3RhcnQsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCAyICogY291bnQpOworCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCitzdGF0aWMgdm9pZCBjc2lfSyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCB2cGFyKQoreworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCAqIHN0YXJ0OworCisJc3dpdGNoICh2cGFyKSB7CisJCWNhc2UgMDoJLyogZXJhc2UgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUgKi8KKwkJCWNvdW50ID0gdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeDsKKwkJCXN0YXJ0ID0gKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX3BvczsKKwkJCWlmIChET19VUERBVEUodmMpKQorCQkJCXZjLT52Y19zdy0+Y29uX2NsZWFyKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX3gsIDEsCisJCQkJCQkgICAgIHZjLT52Y19jb2xzIC0gdmMtPnZjX3gpOworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogZXJhc2UgZnJvbSBzdGFydCBvZiBsaW5lIHRvIGN1cnNvciAqLworCQkJc3RhcnQgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX3BvcyAtICh2Yy0+dmNfeCA8PCAxKSk7CisJCQljb3VudCA9IHZjLT52Y194ICsgMTsKKwkJCWlmIChET19VUERBVEUodmMpKQorCQkJCXZjLT52Y19zdy0+Y29uX2NsZWFyKHZjLCB2Yy0+dmNfeSwgMCwgMSwKKwkJCQkJCSAgICAgdmMtPnZjX3ggKyAxKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIGVyYXNlIHdob2xlIGxpbmUgKi8KKwkJCXN0YXJ0ID0gKHVuc2lnbmVkIHNob3J0ICopKHZjLT52Y19wb3MgLSAodmMtPnZjX3ggPDwgMSkpOworCQkJY291bnQgPSB2Yy0+dmNfY29sczsKKwkJCWlmIChET19VUERBVEUodmMpKQorCQkJCXZjLT52Y19zdy0+Y29uX2NsZWFyKHZjLCB2Yy0+dmNfeSwgMCwgMSwKKwkJCQkJICAgICAgdmMtPnZjX2NvbHMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJfQorCXNjcl9tZW1zZXR3KHN0YXJ0LCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgMiAqIGNvdW50KTsKKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKK30KKworc3RhdGljIHZvaWQgY3NpX1goc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgdnBhcikgLyogZXJhc2UgdGhlIGZvbGxvd2luZyB2cGFyIHBvc2l0aW9ucyAqLworewkJCQkJICAvKiBub3QgdnQxMDA/ICovCisJaW50IGNvdW50OworCisJaWYgKCF2cGFyKQorCQl2cGFyKys7CisJY291bnQgPSAodnBhciA+IHZjLT52Y19jb2xzIC0gdmMtPnZjX3gpID8gKHZjLT52Y19jb2xzIC0gdmMtPnZjX3gpIDogdnBhcjsKKworCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKXZjLT52Y19wb3MsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCAyICogY291bnQpOworCWlmIChET19VUERBVEUodmMpKQorCQl2Yy0+dmNfc3ctPmNvbl9jbGVhcih2YywgdmMtPnZjX3ksIHZjLT52Y194LCAxLCBjb3VudCk7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfYXR0cihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJdmMtPnZjX2ludGVuc2l0eSA9IDE7CisJdmMtPnZjX3VuZGVybGluZSA9IDA7CisJdmMtPnZjX3JldmVyc2UgPSAwOworCXZjLT52Y19ibGluayA9IDA7CisJdmMtPnZjX2NvbG9yID0gdmMtPnZjX2RlZl9jb2xvcjsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAqLworc3RhdGljIHZvaWQgY3NpX20oc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSB2Yy0+dmNfbnBhcjsgaSsrKQorCQlzd2l0Y2ggKHZjLT52Y19wYXJbaV0pIHsKKwkJCWNhc2UgMDoJLyogYWxsIGF0dHJpYnV0ZXMgb2ZmICovCisJCQkJZGVmYXVsdF9hdHRyKHZjKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl2Yy0+dmNfaW50ZW5zaXR5ID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl2Yy0+dmNfaW50ZW5zaXR5ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQl2Yy0+dmNfdW5kZXJsaW5lID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQl2Yy0+dmNfYmxpbmsgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCXZjLT52Y19yZXZlcnNlID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6IC8qIEFOU0kgWDMuNjQtMTk3OSAoU0NPLWlzaD8pCisJCQkJICAqIFNlbGVjdCBwcmltYXJ5IGZvbnQsIGRvbid0IGRpc3BsYXkKKwkJCQkgICogY29udHJvbCBjaGFycyBpZiBkZWZpbmVkLCBkb24ndCBzZXQKKwkJCQkgICogYml0IDggb24gb3V0cHV0LgorCQkJCSAgKi8KKwkJCQl2Yy0+dmNfdHJhbnNsYXRlID0gc2V0X3RyYW5zbGF0ZSh2Yy0+dmNfY2hhcnNldCA9PSAwCisJCQkJCQk/IHZjLT52Y19HMF9jaGFyc2V0CisJCQkJCQk6IHZjLT52Y19HMV9jaGFyc2V0LCB2Yyk7CisJCQkJdmMtPnZjX2Rpc3BfY3RybCA9IDA7CisJCQkJdmMtPnZjX3RvZ2dsZV9tZXRhID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6IC8qIEFOU0kgWDMuNjQtMTk3OSAoU0NPLWlzaD8pCisJCQkJICAqIFNlbGVjdCBmaXJzdCBhbHRlcm5hdGUgZm9udCwgbGV0cworCQkJCSAgKiBjaGFycyA8IDMyIGJlIGRpc3BsYXllZCBhcyBST00gY2hhcnMuCisJCQkJICAqLworCQkJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKElCTVBDX01BUCwgdmMpOworCQkJCXZjLT52Y19kaXNwX2N0cmwgPSAxOworCQkJCXZjLT52Y190b2dnbGVfbWV0YSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDEyOiAvKiBBTlNJIFgzLjY0LTE5NzkgKFNDTy1pc2g/KQorCQkJCSAgKiBTZWxlY3Qgc2Vjb25kIGFsdGVybmF0ZSBmb250LCB0b2dnbGUKKwkJCQkgICogaGlnaCBiaXQgYmVmb3JlIGRpc3BsYXlpbmcgYXMgUk9NIGNoYXIuCisJCQkJICAqLworCQkJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKElCTVBDX01BUCwgdmMpOworCQkJCXZjLT52Y19kaXNwX2N0cmwgPSAxOworCQkJCXZjLT52Y190b2dnbGVfbWV0YSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDIxOgorCQkJY2FzZSAyMjoKKwkJCQl2Yy0+dmNfaW50ZW5zaXR5ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjQ6CisJCQkJdmMtPnZjX3VuZGVybGluZSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI1OgorCQkJCXZjLT52Y19ibGluayA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI3OgorCQkJCXZjLT52Y19yZXZlcnNlID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzg6IC8qIEFOU0kgWDMuNjQtMTk3OSAoU0NPLWlzaD8pCisJCQkJICAqIEVuYWJsZXMgdW5kZXJzY29yZSwgd2hpdGUgZm9yZWdyb3VuZAorCQkJCSAgKiB3aXRoIHdoaXRlIHVuZGVyc2NvcmUgKExpbnV4IC0gdXNlCisJCQkJICAqIGRlZmF1bHQgZm9yZWdyb3VuZCkuCisJCQkJICAqLworCQkJCXZjLT52Y19jb2xvciA9ICh2Yy0+dmNfZGVmX2NvbG9yICYgMHgwZikgfCAodmMtPnZjX2NvbG9yICYgMHhmMCk7CisJCQkJdmMtPnZjX3VuZGVybGluZSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDM5OiAvKiBBTlNJIFgzLjY0LTE5NzkgKFNDTy1pc2g/KQorCQkJCSAgKiBEaXNhYmxlIHVuZGVybGluZSBvcHRpb24uCisJCQkJICAqIFJlc2V0IGNvbG91ciB0byBkZWZhdWx0PyBJdCBkaWQgdGhpcworCQkJCSAgKiBiZWZvcmUuLi4KKwkJCQkgICovCisJCQkJdmMtPnZjX2NvbG9yID0gKHZjLT52Y19kZWZfY29sb3IgJiAweDBmKSB8ICh2Yy0+dmNfY29sb3IgJiAweGYwKTsKKwkJCQl2Yy0+dmNfdW5kZXJsaW5lID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDk6CisJCQkJdmMtPnZjX2NvbG9yID0gKHZjLT52Y19kZWZfY29sb3IgJiAweGYwKSB8ICh2Yy0+dmNfY29sb3IgJiAweDBmKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHZjLT52Y19wYXJbaV0gPj0gMzAgJiYgdmMtPnZjX3BhcltpXSA8PSAzNykKKwkJCQkJdmMtPnZjX2NvbG9yID0gY29sb3JfdGFibGVbdmMtPnZjX3BhcltpXSAtIDMwXQorCQkJCQkJfCAodmMtPnZjX2NvbG9yICYgMHhmMCk7CisJCQkJZWxzZSBpZiAodmMtPnZjX3BhcltpXSA+PSA0MCAmJiB2Yy0+dmNfcGFyW2ldIDw9IDQ3KQorCQkJCQl2Yy0+dmNfY29sb3IgPSAoY29sb3JfdGFibGVbdmMtPnZjX3BhcltpXSAtIDQwXSA8PCA0KQorCQkJCQkJfCAodmMtPnZjX2NvbG9yICYgMHgwZik7CisJCQkJYnJlYWs7CisJCX0KKwl1cGRhdGVfYXR0cih2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3BvbmRfc3RyaW5nKGNvbnN0IGNoYXIgKnAsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJd2hpbGUgKCpwKSB7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgKnAsIDApOworCQlwKys7CisJfQorCWNvbl9zY2hlZHVsZV9mbGlwKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGN1cnNvcl9yZXBvcnQoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWNoYXIgYnVmWzQwXTsKKworCXNwcmludGYoYnVmLCAiXDAzM1slZDslZFIiLCB2Yy0+dmNfeSArICh2Yy0+dmNfZGVjb20gPyB2Yy0+dmNfdG9wICsgMSA6IDEpLCB2Yy0+dmNfeCArIDEpOworCXJlc3BvbmRfc3RyaW5nKGJ1ZiwgdHR5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXR1c19yZXBvcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXNwb25kX3N0cmluZygiXDAzM1swbiIsIHR0eSk7CS8qIFRlcm1pbmFsIG9rICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNwb25kX0lEKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXJlc3BvbmRfc3RyaW5nKFZUMTAySUQsIHR0eSk7Cit9CisKK3ZvaWQgbW91c2VfcmVwb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBidXR0LCBpbnQgbXJ4LCBpbnQgbXJ5KQoreworCWNoYXIgYnVmWzhdOworCisJc3ByaW50ZihidWYsICJcMDMzW00lYyVjJWMiLCAoY2hhcikoJyAnICsgYnV0dCksIChjaGFyKSgnIScgKyBtcngpLAorCQkoY2hhcikoJyEnICsgbXJ5KSk7CisJcmVzcG9uZF9zdHJpbmcoYnVmLCB0dHkpOworfQorCisvKiBpbnZva2VkIHZpYSBpb2N0bChUSU9DTElOVVgpIGFuZCB0aHJvdWdoIHNldF9zZWxlY3Rpb24gKi8KK2ludCBtb3VzZV9yZXBvcnRpbmcodm9pZCkKK3sKKwlyZXR1cm4gdmNfY29uc1tmZ19jb25zb2xlXS5kLT52Y19yZXBvcnRfbW91c2U7Cit9CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIHNldF9tb2RlKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG9uX29mZikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gdmMtPnZjX25wYXI7IGkrKykKKwkJaWYgKHZjLT52Y19xdWVzKSB7CisJCQlzd2l0Y2godmMtPnZjX3BhcltpXSkgewkvKiBERUMgcHJpdmF0ZSBtb2RlcyBzZXQvcmVzZXQgKi8KKwkJCWNhc2UgMToJCQkvKiBDdXJzb3Iga2V5cyBzZW5kIF5bT3gvXltbeCAqLworCQkJCWlmIChvbl9vZmYpCisJCQkJCXNldF9rYmQodmMsIGRlY2NrbSk7CisJCQkJZWxzZQorCQkJCQljbHJfa2JkKHZjLCBkZWNja20pOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgkvKiA4MC8xMzIgbW9kZSBzd2l0Y2ggdW5pbXBsZW1lbnRlZCAqLworCQkJCXZjLT52Y19kZWNjb2xtID0gb25fb2ZmOworI2lmIDAKKwkJCQl2Y19yZXNpemUoZGVjY29sbSA/IDEzMiA6IDgwLCB2Yy0+dmNfcm93cyk7CisJCQkJLyogdGhpcyBhbG9uZSBkb2VzIG5vdCBzdWZmaWNlOyBzb21lIHVzZXIgbW9kZQorCQkJCSAgIHV0aWxpdHkgaGFzIHRvIGNoYW5nZSB0aGUgaGFyZHdhcmUgcmVncyAqLworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIDU6CQkJLyogSW52ZXJ0ZWQgc2NyZWVuIG9uL29mZiAqLworCQkJCWlmICh2Yy0+dmNfZGVjc2NubSAhPSBvbl9vZmYpIHsKKwkJCQkJdmMtPnZjX2RlY3Njbm0gPSBvbl9vZmY7CisJCQkJCWludmVydF9zY3JlZW4odmMsIDAsIHZjLT52Y19zY3JlZW5idWZfc2l6ZSwgMCk7CisJCQkJCXVwZGF0ZV9hdHRyKHZjKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CQkJLyogT3JpZ2luIHJlbGF0aXZlL2Fic29sdXRlICovCisJCQkJdmMtPnZjX2RlY29tID0gb25fb2ZmOworCQkJCWdvdG94YXkodmMsIDAsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSA3OgkJCS8qIEF1dG93cmFwIG9uL29mZiAqLworCQkJCXZjLT52Y19kZWNhd20gPSBvbl9vZmY7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CQkJLyogQXV0b3JlcGVhdCBvbi9vZmYgKi8KKwkJCQlpZiAob25fb2ZmKQorCQkJCQlzZXRfa2JkKHZjLCBkZWNhcm0pOworCQkJCWVsc2UKKwkJCQkJY2xyX2tiZCh2YywgZGVjYXJtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgOToKKwkJCQl2Yy0+dmNfcmVwb3J0X21vdXNlID0gb25fb2ZmID8gMSA6IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI1OgkJLyogQ3Vyc29yIG9uL29mZiAqLworCQkJCXZjLT52Y19kZWNjbSA9IG9uX29mZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTAwMDoKKwkJCQl2Yy0+dmNfcmVwb3J0X21vdXNlID0gb25fb2ZmID8gMiA6IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2godmMtPnZjX3BhcltpXSkgewkvKiBBTlNJIG1vZGVzIHNldC9yZXNldCAqLworCQkJY2FzZSAzOgkJCS8qIE1vbml0b3IgKGRpc3BsYXkgY3RybHMpICovCisJCQkJdmMtPnZjX2Rpc3BfY3RybCA9IG9uX29mZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoJCQkvKiBJbnNlcnQgTW9kZSBvbi9vZmYgKi8KKwkJCQl2Yy0+dmNfZGVjaW0gPSBvbl9vZmY7CisJCQkJYnJlYWs7CisJCQljYXNlIDIwOgkJLyogTGYsIEVudGVyID09IENyTGYvTGYgKi8KKwkJCQlpZiAob25fb2ZmKQorCQkJCQlzZXRfa2JkKHZjLCBsbm0pOworCQkJCWVsc2UKKwkJCQkJY2xyX2tiZCh2YywgbG5tKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBzZXR0ZXJtX2NvbW1hbmQoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXN3aXRjaCh2Yy0+dmNfcGFyWzBdKSB7CisJCWNhc2UgMToJLyogc2V0IGNvbG9yIGZvciB1bmRlcmxpbmUgbW9kZSAqLworCQkJaWYgKHZjLT52Y19jYW5fZG9fY29sb3IgJiYKKwkJCQkJdmMtPnZjX3BhclsxXSA8IDE2KSB7CisJCQkJdmMtPnZjX3VsY29sb3IgPSBjb2xvcl90YWJsZVt2Yy0+dmNfcGFyWzFdXTsKKwkJCQlpZiAodmMtPnZjX3VuZGVybGluZSkKKwkJCQkJdXBkYXRlX2F0dHIodmMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoJLyogc2V0IGNvbG9yIGZvciBoYWxmIGludGVuc2l0eSBtb2RlICovCisJCQlpZiAodmMtPnZjX2Nhbl9kb19jb2xvciAmJgorCQkJCQl2Yy0+dmNfcGFyWzFdIDwgMTYpIHsKKwkJCQl2Yy0+dmNfaGFsZmNvbG9yID0gY29sb3JfdGFibGVbdmMtPnZjX3BhclsxXV07CisJCQkJaWYgKHZjLT52Y19pbnRlbnNpdHkgPT0gMCkKKwkJCQkJdXBkYXRlX2F0dHIodmMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgODoJLyogc3RvcmUgY29sb3JzIGFzIGRlZmF1bHRzICovCisJCQl2Yy0+dmNfZGVmX2NvbG9yID0gdmMtPnZjX2F0dHI7CisJCQlpZiAodmMtPnZjX2hpX2ZvbnRfbWFzayA9PSAweDEwMCkKKwkJCQl2Yy0+dmNfZGVmX2NvbG9yID4+PSAxOworCQkJZGVmYXVsdF9hdHRyKHZjKTsKKwkJCXVwZGF0ZV9hdHRyKHZjKTsKKwkJCWJyZWFrOworCQljYXNlIDk6CS8qIHNldCBibGFua2luZyBpbnRlcnZhbCAqLworCQkJYmxhbmtpbnRlcnZhbCA9ICgodmMtPnZjX3BhclsxXSA8IDYwKSA/IHZjLT52Y19wYXJbMV0gOiA2MCkgKiA2MCAqIEhaOworCQkJcG9rZV9ibGFua2VkX2NvbnNvbGUoKTsKKwkJCWJyZWFrOworCQljYXNlIDEwOiAvKiBzZXQgYmVsbCBmcmVxdWVuY3kgaW4gSHogKi8KKwkJCWlmICh2Yy0+dmNfbnBhciA+PSAxKQorCQkJCXZjLT52Y19iZWxsX3BpdGNoID0gdmMtPnZjX3BhclsxXTsKKwkJCWVsc2UKKwkJCQl2Yy0+dmNfYmVsbF9waXRjaCA9IERFRkFVTFRfQkVMTF9QSVRDSDsKKwkJCWJyZWFrOworCQljYXNlIDExOiAvKiBzZXQgYmVsbCBkdXJhdGlvbiBpbiBtc2VjICovCisJCQlpZiAodmMtPnZjX25wYXIgPj0gMSkKKwkJCQl2Yy0+dmNfYmVsbF9kdXJhdGlvbiA9ICh2Yy0+dmNfcGFyWzFdIDwgMjAwMCkgPworCQkJCQl2Yy0+dmNfcGFyWzFdICogSFogLyAxMDAwIDogMDsKKwkJCWVsc2UKKwkJCQl2Yy0+dmNfYmVsbF9kdXJhdGlvbiA9IERFRkFVTFRfQkVMTF9EVVJBVElPTjsKKwkJCWJyZWFrOworCQljYXNlIDEyOiAvKiBicmluZyBzcGVjaWZpZWQgY29uc29sZSB0byB0aGUgZnJvbnQgKi8KKwkJCWlmICh2Yy0+dmNfcGFyWzFdID49IDEgJiYgdmNfY29uc19hbGxvY2F0ZWQodmMtPnZjX3BhclsxXSAtIDEpKQorCQkJCXNldF9jb25zb2xlKHZjLT52Y19wYXJbMV0gLSAxKTsKKwkJCWJyZWFrOworCQljYXNlIDEzOiAvKiB1bmJsYW5rIHRoZSBzY3JlZW4gKi8KKwkJCXBva2VfYmxhbmtlZF9jb25zb2xlKCk7CisJCQlicmVhazsKKwkJY2FzZSAxNDogLyogc2V0IHZlc2EgcG93ZXJkb3duIGludGVydmFsICovCisJCQl2ZXNhX29mZl9pbnRlcnZhbCA9ICgodmMtPnZjX3BhclsxXSA8IDYwKSA/IHZjLT52Y19wYXJbMV0gOiA2MCkgKiA2MCAqIEhaOworCQkJYnJlYWs7CisJCWNhc2UgMTU6IC8qIGFjdGl2YXRlIHRoZSBwcmV2aW91cyBjb25zb2xlICovCisJCQlzZXRfY29uc29sZShsYXN0X2NvbnNvbGUpOworCQkJYnJlYWs7CisJfQorfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBjc2lfYXQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJaWYgKG5yID4gdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeCkKKwkJbnIgPSB2Yy0+dmNfY29scyAtIHZjLT52Y194OworCWVsc2UgaWYgKCFucikKKwkJbnIgPSAxOworCWluc2VydF9jaGFyKHZjLCBucik7Cit9CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGNzaV9MKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IG5yKQoreworCWlmIChuciA+IHZjLT52Y19yb3dzIC0gdmMtPnZjX3kpCisJCW5yID0gdmMtPnZjX3Jvd3MgLSB2Yy0+dmNfeTsKKwllbHNlIGlmICghbnIpCisJCW5yID0gMTsKKwlzY3Jkb3duKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX2JvdHRvbSwgbnIpOworCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBjc2lfUChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBucikKK3sKKwlpZiAobnIgPiB2Yy0+dmNfY29scyAtIHZjLT52Y194KQorCQluciA9IHZjLT52Y19jb2xzIC0gdmMtPnZjX3g7CisJZWxzZSBpZiAoIW5yKQorCQluciA9IDE7CisJZGVsZXRlX2NoYXIodmMsIG5yKTsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAqLworc3RhdGljIHZvaWQgY3NpX00oc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJaWYgKG5yID4gdmMtPnZjX3Jvd3MgLSB2Yy0+dmNfeSkKKwkJbnIgPSB2Yy0+dmNfcm93cyAtIHZjLT52Y195OworCWVsc2UgaWYgKCFucikKKwkJbnI9MTsKKwlzY3J1cCh2YywgdmMtPnZjX3ksIHZjLT52Y19ib3R0b20sIG5yKTsKKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAoZXhjZXB0IHZpYSB2Y19pbml0LT5yZXNldF90ZXJtaW5hbCAqLworc3RhdGljIHZvaWQgc2F2ZV9jdXIoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXZjLT52Y19zYXZlZF94CQk9IHZjLT52Y194OworCXZjLT52Y19zYXZlZF95CQk9IHZjLT52Y195OworCXZjLT52Y19zX2ludGVuc2l0eQk9IHZjLT52Y19pbnRlbnNpdHk7CisJdmMtPnZjX3NfdW5kZXJsaW5lCT0gdmMtPnZjX3VuZGVybGluZTsKKwl2Yy0+dmNfc19ibGluawkJPSB2Yy0+dmNfYmxpbms7CisJdmMtPnZjX3NfcmV2ZXJzZQk9IHZjLT52Y19yZXZlcnNlOworCXZjLT52Y19zX2NoYXJzZXQJPSB2Yy0+dmNfY2hhcnNldDsKKwl2Yy0+dmNfc19jb2xvcgkJPSB2Yy0+dmNfY29sb3I7CisJdmMtPnZjX3NhdmVkX0cwCQk9IHZjLT52Y19HMF9jaGFyc2V0OworCXZjLT52Y19zYXZlZF9HMQkJPSB2Yy0+dmNfRzFfY2hhcnNldDsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAqLworc3RhdGljIHZvaWQgcmVzdG9yZV9jdXIoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWdvdG94eSh2YywgdmMtPnZjX3NhdmVkX3gsIHZjLT52Y19zYXZlZF95KTsKKwl2Yy0+dmNfaW50ZW5zaXR5CT0gdmMtPnZjX3NfaW50ZW5zaXR5OworCXZjLT52Y191bmRlcmxpbmUJPSB2Yy0+dmNfc191bmRlcmxpbmU7CisJdmMtPnZjX2JsaW5rCQk9IHZjLT52Y19zX2JsaW5rOworCXZjLT52Y19yZXZlcnNlCQk9IHZjLT52Y19zX3JldmVyc2U7CisJdmMtPnZjX2NoYXJzZXQJCT0gdmMtPnZjX3NfY2hhcnNldDsKKwl2Yy0+dmNfY29sb3IJCT0gdmMtPnZjX3NfY29sb3I7CisJdmMtPnZjX0cwX2NoYXJzZXQJPSB2Yy0+dmNfc2F2ZWRfRzA7CisJdmMtPnZjX0cxX2NoYXJzZXQJPSB2Yy0+dmNfc2F2ZWRfRzE7CisJdmMtPnZjX3RyYW5zbGF0ZQk9IHNldF90cmFuc2xhdGUodmMtPnZjX2NoYXJzZXQgPyB2Yy0+dmNfRzFfY2hhcnNldCA6IHZjLT52Y19HMF9jaGFyc2V0LCB2Yyk7CisJdXBkYXRlX2F0dHIodmMpOworCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCitlbnVtIHsgRVNub3JtYWwsIEVTZXNjLCBFU3NxdWFyZSwgRVNnZXRwYXJzLCBFU2dvdHBhcnMsIEVTZnVuY2tleSwKKwlFU2hhc2gsIEVTc2V0RzAsIEVTc2V0RzEsIEVTcGVyY2VudCwgRVNpZ25vcmUsIEVTbm9uc3RkLAorCUVTcGFsZXR0ZSB9OworCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkIChleGNlcHQgdmlhIHZjX2luaXQoKSkgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3Rlcm1pbmFsKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGRvX2NsZWFyKQoreworCXZjLT52Y190b3AJCT0gMDsKKwl2Yy0+dmNfYm90dG9tCQk9IHZjLT52Y19yb3dzOworCXZjLT52Y19zdGF0ZQkJPSBFU25vcm1hbDsKKwl2Yy0+dmNfcXVlcwkJPSAwOworCXZjLT52Y190cmFuc2xhdGUJPSBzZXRfdHJhbnNsYXRlKExBVDFfTUFQLCB2Yyk7CisJdmMtPnZjX0cwX2NoYXJzZXQJPSBMQVQxX01BUDsKKwl2Yy0+dmNfRzFfY2hhcnNldAk9IEdSQUZfTUFQOworCXZjLT52Y19jaGFyc2V0CQk9IDA7CisJdmMtPnZjX25lZWRfd3JhcAk9IDA7CisJdmMtPnZjX3JlcG9ydF9tb3VzZQk9IDA7CisJdmMtPnZjX3V0ZgkJPSAwOworCXZjLT52Y191dGZfY291bnQJPSAwOworCisJdmMtPnZjX2Rpc3BfY3RybAk9IDA7CisJdmMtPnZjX3RvZ2dsZV9tZXRhCT0gMDsKKworCXZjLT52Y19kZWNzY25tCQk9IDA7CisJdmMtPnZjX2RlY29tCQk9IDA7CisJdmMtPnZjX2RlY2F3bQkJPSAxOworCXZjLT52Y19kZWNjbQkJPSAxOworCXZjLT52Y19kZWNpbQkJPSAwOworCisJc2V0X2tiZCh2YywgZGVjYXJtKTsKKwljbHJfa2JkKHZjLCBkZWNja20pOworCWNscl9rYmQodmMsIGtiZGFwcGxpYyk7CisJY2xyX2tiZCh2YywgbG5tKTsKKwlrYmRfdGFibGVbdmMtPnZjX251bV0ubG9ja3N0YXRlID0gMDsKKwlrYmRfdGFibGVbdmMtPnZjX251bV0uc2xvY2tzdGF0ZSA9IDA7CisJa2JkX3RhYmxlW3ZjLT52Y19udW1dLmxlZG1vZGUgPSBMRURfU0hPV19GTEFHUzsKKwlrYmRfdGFibGVbdmMtPnZjX251bV0ubGVkZmxhZ3N0YXRlID0ga2JkX3RhYmxlW3ZjLT52Y19udW1dLmRlZmF1bHRfbGVkZmxhZ3N0YXRlOworCS8qIGRvIG5vdCBkbyBzZXRfbGVkcyBoZXJlIGJlY2F1c2UgdGhpcyBjYXVzZXMgYW4gZW5kbGVzcyB0YXNrbGV0IGxvb3AKKwkgICB3aGVuIHRoZSBrZXlib2FyZCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKi8KKworCXZjLT52Y19jdXJzb3JfdHlwZSA9IENVUl9ERUZBVUxUOworCXZjLT52Y19jb21wbGVtZW50X21hc2sgPSB2Yy0+dmNfc19jb21wbGVtZW50X21hc2s7CisKKwlkZWZhdWx0X2F0dHIodmMpOworCXVwZGF0ZV9hdHRyKHZjKTsKKworCXZjLT52Y190YWJfc3RvcFswXQk9IDB4MDEwMTAxMDA7CisJdmMtPnZjX3RhYl9zdG9wWzFdCT0KKwl2Yy0+dmNfdGFiX3N0b3BbMl0JPQorCXZjLT52Y190YWJfc3RvcFszXQk9CisJdmMtPnZjX3RhYl9zdG9wWzRdCT0gMHgwMTAxMDEwMTsKKworCXZjLT52Y19iZWxsX3BpdGNoID0gREVGQVVMVF9CRUxMX1BJVENIOworCXZjLT52Y19iZWxsX2R1cmF0aW9uID0gREVGQVVMVF9CRUxMX0RVUkFUSU9OOworCisJZ290b3h5KHZjLCAwLCAwKTsKKwlzYXZlX2N1cih2Yyk7CisJaWYgKGRvX2NsZWFyKQorCSAgICBjc2lfSih2YywgMik7Cit9CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGRvX2Nvbl90cm9sKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGMpCit7CisJLyoKKwkgKiAgQ29udHJvbCBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkIGluIHRoZSBfbWlkZGxlXworCSAqICBvZiBhbiBlc2NhcGUgc2VxdWVuY2UuCisJICovCisJc3dpdGNoIChjKSB7CisJY2FzZSAwOgorCQlyZXR1cm47CisJY2FzZSA3OgorCQlpZiAodmMtPnZjX2JlbGxfZHVyYXRpb24pCisJCQlrZF9ta3NvdW5kKHZjLT52Y19iZWxsX3BpdGNoLCB2Yy0+dmNfYmVsbF9kdXJhdGlvbik7CisJCXJldHVybjsKKwljYXNlIDg6CisJCWJzKHZjKTsKKwkJcmV0dXJuOworCWNhc2UgOToKKwkJdmMtPnZjX3BvcyAtPSAodmMtPnZjX3ggPDwgMSk7CisJCXdoaWxlICh2Yy0+dmNfeCA8IHZjLT52Y19jb2xzIC0gMSkgeworCQkJdmMtPnZjX3grKzsKKwkJCWlmICh2Yy0+dmNfdGFiX3N0b3BbdmMtPnZjX3ggPj4gNV0gJiAoMSA8PCAodmMtPnZjX3ggJiAzMSkpKQorCQkJCWJyZWFrOworCQl9CisJCXZjLT52Y19wb3MgKz0gKHZjLT52Y194IDw8IDEpOworCQlyZXR1cm47CisJY2FzZSAxMDogY2FzZSAxMTogY2FzZSAxMjoKKwkJbGYodmMpOworCQlpZiAoIWlzX2tiZCh2YywgbG5tKSkKKwkJCXJldHVybjsKKwljYXNlIDEzOgorCQljcih2Yyk7CisJCXJldHVybjsKKwljYXNlIDE0OgorCQl2Yy0+dmNfY2hhcnNldCA9IDE7CisJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKHZjLT52Y19HMV9jaGFyc2V0LCB2Yyk7CisJCXZjLT52Y19kaXNwX2N0cmwgPSAxOworCQlyZXR1cm47CisJY2FzZSAxNToKKwkJdmMtPnZjX2NoYXJzZXQgPSAwOworCQl2Yy0+dmNfdHJhbnNsYXRlID0gc2V0X3RyYW5zbGF0ZSh2Yy0+dmNfRzBfY2hhcnNldCwgdmMpOworCQl2Yy0+dmNfZGlzcF9jdHJsID0gMDsKKwkJcmV0dXJuOworCWNhc2UgMjQ6IGNhc2UgMjY6CisJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlyZXR1cm47CisJY2FzZSAyNzoKKwkJdmMtPnZjX3N0YXRlID0gRVNlc2M7CisJCXJldHVybjsKKwljYXNlIDEyNzoKKwkJZGVsKHZjKTsKKwkJcmV0dXJuOworCWNhc2UgMTI4KzI3OgorCQl2Yy0+dmNfc3RhdGUgPSBFU3NxdWFyZTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2godmMtPnZjX3N0YXRlKSB7CisJY2FzZSBFU2VzYzoKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdbJzoKKwkJCXZjLT52Y19zdGF0ZSA9IEVTc3F1YXJlOworCQkJcmV0dXJuOworCQljYXNlICddJzoKKwkJCXZjLT52Y19zdGF0ZSA9IEVTbm9uc3RkOworCQkJcmV0dXJuOworCQljYXNlICclJzoKKwkJCXZjLT52Y19zdGF0ZSA9IEVTcGVyY2VudDsKKwkJCXJldHVybjsKKwkJY2FzZSAnRSc6CisJCQljcih2Yyk7CisJCQlsZih2Yyk7CisJCQlyZXR1cm47CisJCWNhc2UgJ00nOgorCQkJcmkodmMpOworCQkJcmV0dXJuOworCQljYXNlICdEJzoKKwkJCWxmKHZjKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnSCc6CisJCQl2Yy0+dmNfdGFiX3N0b3BbdmMtPnZjX3ggPj4gNV0gfD0gKDEgPDwgKHZjLT52Y194ICYgMzEpKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnWic6CisJCQlyZXNwb25kX0lEKHR0eSk7CisJCQlyZXR1cm47CisJCWNhc2UgJzcnOgorCQkJc2F2ZV9jdXIodmMpOworCQkJcmV0dXJuOworCQljYXNlICc4JzoKKwkJCXJlc3RvcmVfY3VyKHZjKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnKCc6CisJCQl2Yy0+dmNfc3RhdGUgPSBFU3NldEcwOworCQkJcmV0dXJuOworCQljYXNlICcpJzoKKwkJCXZjLT52Y19zdGF0ZSA9IEVTc2V0RzE7CisJCQlyZXR1cm47CisJCWNhc2UgJyMnOgorCQkJdmMtPnZjX3N0YXRlID0gRVNoYXNoOworCQkJcmV0dXJuOworCQljYXNlICdjJzoKKwkJCXJlc2V0X3Rlcm1pbmFsKHZjLCAxKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnPic6ICAvKiBOdW1lcmljIGtleXBhZCAqLworCQkJY2xyX2tiZCh2Yywga2JkYXBwbGljKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnPSc6ICAvKiBBcHBsLiBrZXlwYWQgKi8KKwkJCXNldF9rYmQodmMsIGtiZGFwcGxpYyk7CisJCQlyZXR1cm47CisJCX0KKwkJcmV0dXJuOworCWNhc2UgRVNub25zdGQ6CisJCWlmIChjPT0nUCcpIHsgICAvKiBwYWxldHRlIGVzY2FwZSBzZXF1ZW5jZSAqLworCQkJZm9yICh2Yy0+dmNfbnBhciA9IDA7IHZjLT52Y19ucGFyIDwgTlBBUjsgdmMtPnZjX25wYXIrKykKKwkJCQl2Yy0+dmNfcGFyW3ZjLT52Y19ucGFyXSA9IDA7CisJCQl2Yy0+dmNfbnBhciA9IDA7CisJCQl2Yy0+dmNfc3RhdGUgPSBFU3BhbGV0dGU7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoYz09J1InKSB7ICAgLyogcmVzZXQgcGFsZXR0ZSAqLworCQkJcmVzZXRfcGFsZXR0ZSh2Yyk7CisJCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJfSBlbHNlCisJCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJcmV0dXJuOworCWNhc2UgRVNwYWxldHRlOgorCQlpZiAoIChjPj0nMCcmJmM8PSc5JykgfHwgKGM+PSdBJyYmYzw9J0YnKSB8fCAoYz49J2EnJiZjPD0nZicpICkgeworCQkJdmMtPnZjX3Bhclt2Yy0+dmNfbnBhcisrXSA9IChjID4gJzknID8gKGMgJiAweERGKSAtICdBJyArIDEwIDogYyAtICcwJyk7CisJCQlpZiAodmMtPnZjX25wYXIgPT0gNykgeworCQkJCWludCBpID0gdmMtPnZjX3BhclswXSAqIDMsIGogPSAxOworCQkJCXZjLT52Y19wYWxldHRlW2ldID0gMTYgKiB2Yy0+dmNfcGFyW2orK107CisJCQkJdmMtPnZjX3BhbGV0dGVbaSsrXSArPSB2Yy0+dmNfcGFyW2orK107CisJCQkJdmMtPnZjX3BhbGV0dGVbaV0gPSAxNiAqIHZjLT52Y19wYXJbaisrXTsKKwkJCQl2Yy0+dmNfcGFsZXR0ZVtpKytdICs9IHZjLT52Y19wYXJbaisrXTsKKwkJCQl2Yy0+dmNfcGFsZXR0ZVtpXSA9IDE2ICogdmMtPnZjX3BhcltqKytdOworCQkJCXZjLT52Y19wYWxldHRlW2ldICs9IHZjLT52Y19wYXJbal07CisJCQkJc2V0X3BhbGV0dGUodmMpOworCQkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQkJfQorCQl9IGVsc2UKKwkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlyZXR1cm47CisJY2FzZSBFU3NxdWFyZToKKwkJZm9yICh2Yy0+dmNfbnBhciA9IDA7IHZjLT52Y19ucGFyIDwgTlBBUjsgdmMtPnZjX25wYXIrKykKKwkJCXZjLT52Y19wYXJbdmMtPnZjX25wYXJdID0gMDsKKwkJdmMtPnZjX25wYXIgPSAwOworCQl2Yy0+dmNfc3RhdGUgPSBFU2dldHBhcnM7CisJCWlmIChjID09ICdbJykgeyAvKiBGdW5jdGlvbiBrZXkgKi8KKwkJCXZjLT52Y19zdGF0ZT1FU2Z1bmNrZXk7CisJCQlyZXR1cm47CisJCX0KKwkJdmMtPnZjX3F1ZXMgPSAoYyA9PSAnPycpOworCQlpZiAodmMtPnZjX3F1ZXMpCisJCQlyZXR1cm47CisJY2FzZSBFU2dldHBhcnM6CisJCWlmIChjID09ICc7JyAmJiB2Yy0+dmNfbnBhciA8IE5QQVIgLSAxKSB7CisJCQl2Yy0+dmNfbnBhcisrOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGM+PScwJyAmJiBjPD0nOScpIHsKKwkJCXZjLT52Y19wYXJbdmMtPnZjX25wYXJdICo9IDEwOworCQkJdmMtPnZjX3Bhclt2Yy0+dmNfbnBhcl0gKz0gYyAtICcwJzsKKwkJCXJldHVybjsKKwkJfSBlbHNlCisJCQl2Yy0+dmNfc3RhdGUgPSBFU2dvdHBhcnM7CisJY2FzZSBFU2dvdHBhcnM6CisJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlzd2l0Y2goYykgeworCQljYXNlICdoJzoKKwkJCXNldF9tb2RlKHZjLCAxKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnbCc6CisJCQlzZXRfbW9kZSh2YywgMCk7CisJCQlyZXR1cm47CisJCWNhc2UgJ2MnOgorCQkJaWYgKHZjLT52Y19xdWVzKSB7CisJCQkJaWYgKHZjLT52Y19wYXJbMF0pCisJCQkJCXZjLT52Y19jdXJzb3JfdHlwZSA9IHZjLT52Y19wYXJbMF0gfCAodmMtPnZjX3BhclsxXSA8PCA4KSB8ICh2Yy0+dmNfcGFyWzJdIDw8IDE2KTsKKwkJCQllbHNlCisJCQkJCXZjLT52Y19jdXJzb3JfdHlwZSA9IENVUl9ERUZBVUxUOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWlmICh2Yy0+dmNfcXVlcykgeworCQkJCWNsZWFyX3NlbGVjdGlvbigpOworCQkJCWlmICh2Yy0+dmNfcGFyWzBdKQorCQkJCQl2Yy0+dmNfY29tcGxlbWVudF9tYXNrID0gdmMtPnZjX3BhclswXSA8PCA4IHwgdmMtPnZjX3BhclsxXTsKKwkJCQllbHNlCisJCQkJCXZjLT52Y19jb21wbGVtZW50X21hc2sgPSB2Yy0+dmNfc19jb21wbGVtZW50X21hc2s7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJaWYgKCF2Yy0+dmNfcXVlcykgeworCQkJCWlmICh2Yy0+dmNfcGFyWzBdID09IDUpCisJCQkJCXN0YXR1c19yZXBvcnQodHR5KTsKKwkJCQllbHNlIGlmICh2Yy0+dmNfcGFyWzBdID09IDYpCisJCQkJCWN1cnNvcl9yZXBvcnQodmMsIHR0eSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHZjLT52Y19xdWVzKSB7CisJCQl2Yy0+dmNfcXVlcyA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnRyc6IGNhc2UgJ2AnOgorCQkJaWYgKHZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXS0tOworCQkJZ290b3h5KHZjLCB2Yy0+dmNfcGFyWzBdLCB2Yy0+dmNfeSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0EnOgorCQkJaWYgKCF2Yy0+dmNfcGFyWzBdKQorCQkJCXZjLT52Y19wYXJbMF0rKzsKKwkJCWdvdG94eSh2YywgdmMtPnZjX3gsIHZjLT52Y195IC0gdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0InOiBjYXNlICdlJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdKys7CisJCQlnb3RveHkodmMsIHZjLT52Y194LCB2Yy0+dmNfeSArIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdDJzogY2FzZSAnYSc6CisJCQlpZiAoIXZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXSsrOworCQkJZ290b3h5KHZjLCB2Yy0+dmNfeCArIHZjLT52Y19wYXJbMF0sIHZjLT52Y195KTsKKwkJCXJldHVybjsKKwkJY2FzZSAnRCc6CisJCQlpZiAoIXZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXSsrOworCQkJZ290b3h5KHZjLCB2Yy0+dmNfeCAtIHZjLT52Y19wYXJbMF0sIHZjLT52Y195KTsKKwkJCXJldHVybjsKKwkJY2FzZSAnRSc6CisJCQlpZiAoIXZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXSsrOworCQkJZ290b3h5KHZjLCAwLCB2Yy0+dmNfeSArIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdGJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdKys7CisJCQlnb3RveHkodmMsIDAsIHZjLT52Y195IC0gdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ2QnOgorCQkJaWYgKHZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXS0tOworCQkJZ290b3hheSh2YywgdmMtPnZjX3ggLHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdIJzogY2FzZSAnZic6CisJCQlpZiAodmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdLS07CisJCQlpZiAodmMtPnZjX3BhclsxXSkKKwkJCQl2Yy0+dmNfcGFyWzFdLS07CisJCQlnb3RveGF5KHZjLCB2Yy0+dmNfcGFyWzFdLCB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnSic6CisJCQljc2lfSih2YywgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0snOgorCQkJY3NpX0sodmMsIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdMJzoKKwkJCWNzaV9MKHZjLCB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnTSc6CisJCQljc2lfTSh2YywgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ1AnOgorCQkJY3NpX1AodmMsIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdjJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQlyZXNwb25kX0lEKHR0eSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ2cnOgorCQkJaWYgKCF2Yy0+dmNfcGFyWzBdKQorCQkJCXZjLT52Y190YWJfc3RvcFt2Yy0+dmNfeCA+PiA1XSAmPSB+KDEgPDwgKHZjLT52Y194ICYgMzEpKTsKKwkJCWVsc2UgaWYgKHZjLT52Y19wYXJbMF0gPT0gMykgeworCQkJCXZjLT52Y190YWJfc3RvcFswXSA9CisJCQkJCXZjLT52Y190YWJfc3RvcFsxXSA9CisJCQkJCXZjLT52Y190YWJfc3RvcFsyXSA9CisJCQkJCXZjLT52Y190YWJfc3RvcFszXSA9CisJCQkJCXZjLT52Y190YWJfc3RvcFs0XSA9IDA7CisJCQl9CisJCQlyZXR1cm47CisJCWNhc2UgJ20nOgorCQkJY3NpX20odmMpOworCQkJcmV0dXJuOworCQljYXNlICdxJzogLyogREVDTEwgLSBidXQgb25seSAzIGxlZHMgKi8KKwkJCS8qIG1hcCAwLDEsMiwzIHRvIDAsMSwyLDQgKi8KKwkJCWlmICh2Yy0+dmNfcGFyWzBdIDwgNCkKKwkJCQlzZXRsZWRzdGF0ZShrYmRfdGFibGUgKyB2Yy0+dmNfbnVtLAorCQkJCQkgICAgKHZjLT52Y19wYXJbMF0gPCAzKSA/IHZjLT52Y19wYXJbMF0gOiA0KTsKKwkJCXJldHVybjsKKwkJY2FzZSAncic6CisJCQlpZiAoIXZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXSsrOworCQkJaWYgKCF2Yy0+dmNfcGFyWzFdKQorCQkJCXZjLT52Y19wYXJbMV0gPSB2Yy0+dmNfcm93czsKKwkJCS8qIE1pbmltdW0gYWxsb3dlZCByZWdpb24gaXMgMiBsaW5lcyAqLworCQkJaWYgKHZjLT52Y19wYXJbMF0gPCB2Yy0+dmNfcGFyWzFdICYmCisJCQkgICAgdmMtPnZjX3BhclsxXSA8PSB2Yy0+dmNfcm93cykgeworCQkJCXZjLT52Y190b3AgPSB2Yy0+dmNfcGFyWzBdIC0gMTsKKwkJCQl2Yy0+dmNfYm90dG9tID0gdmMtPnZjX3BhclsxXTsKKwkJCQlnb3RveGF5KHZjLCAwLCAwKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJY2FzZSAncyc6CisJCQlzYXZlX2N1cih2Yyk7CisJCQlyZXR1cm47CisJCWNhc2UgJ3UnOgorCQkJcmVzdG9yZV9jdXIodmMpOworCQkJcmV0dXJuOworCQljYXNlICdYJzoKKwkJCWNzaV9YKHZjLCB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnQCc6CisJCQljc2lfYXQodmMsIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICddJzogLyogc2V0dGVybSBmdW5jdGlvbnMgKi8KKwkJCXNldHRlcm1fY29tbWFuZCh2Yyk7CisJCQlyZXR1cm47CisJCX0KKwkJcmV0dXJuOworCWNhc2UgRVNwZXJjZW50OgorCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ0AnOiAgLyogZGVmaW5lZCBpbiBJU08gMjAyMiAqLworCQkJdmMtPnZjX3V0ZiA9IDA7CisJCQlyZXR1cm47CisJCWNhc2UgJ0cnOiAgLyogcHJlbGltIG9mZmljaWFsIGVzY2FwZSBjb2RlICovCisJCWNhc2UgJzgnOiAgLyogcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KKwkJCXZjLT52Y191dGYgPSAxOworCQkJcmV0dXJuOworCQl9CisJCXJldHVybjsKKwljYXNlIEVTZnVuY2tleToKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCXJldHVybjsKKwljYXNlIEVTaGFzaDoKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCWlmIChjID09ICc4JykgeworCQkJLyogREVDIHNjcmVlbiBhbGlnbm1lbnQgdGVzdC4ga2x1ZGdlIDotKSAqLworCQkJdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgPQorCQkJCSh2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciAmIDB4ZmYwMCkgfCAnRSc7CisJCQljc2lfSih2YywgMik7CisJCQl2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA9CisJCQkJKHZjLT52Y192aWRlb19lcmFzZV9jaGFyICYgMHhmZjAwKSB8ICcgJzsKKwkJCWRvX3VwZGF0ZV9yZWdpb24odmMsIHZjLT52Y19vcmlnaW4sIHZjLT52Y19zY3JlZW5idWZfc2l6ZSAvIDIpOworCQl9CisJCXJldHVybjsKKwljYXNlIEVTc2V0RzA6CisJCWlmIChjID09ICcwJykKKwkJCXZjLT52Y19HMF9jaGFyc2V0ID0gR1JBRl9NQVA7CisJCWVsc2UgaWYgKGMgPT0gJ0InKQorCQkJdmMtPnZjX0cwX2NoYXJzZXQgPSBMQVQxX01BUDsKKwkJZWxzZSBpZiAoYyA9PSAnVScpCisJCQl2Yy0+dmNfRzBfY2hhcnNldCA9IElCTVBDX01BUDsKKwkJZWxzZSBpZiAoYyA9PSAnSycpCisJCQl2Yy0+dmNfRzBfY2hhcnNldCA9IFVTRVJfTUFQOworCQlpZiAodmMtPnZjX2NoYXJzZXQgPT0gMCkKKwkJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKHZjLT52Y19HMF9jaGFyc2V0LCB2Yyk7CisJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlyZXR1cm47CisJY2FzZSBFU3NldEcxOgorCQlpZiAoYyA9PSAnMCcpCisJCQl2Yy0+dmNfRzFfY2hhcnNldCA9IEdSQUZfTUFQOworCQllbHNlIGlmIChjID09ICdCJykKKwkJCXZjLT52Y19HMV9jaGFyc2V0ID0gTEFUMV9NQVA7CisJCWVsc2UgaWYgKGMgPT0gJ1UnKQorCQkJdmMtPnZjX0cxX2NoYXJzZXQgPSBJQk1QQ19NQVA7CisJCWVsc2UgaWYgKGMgPT0gJ0snKQorCQkJdmMtPnZjX0cxX2NoYXJzZXQgPSBVU0VSX01BUDsKKwkJaWYgKHZjLT52Y19jaGFyc2V0ID09IDEpCisJCQl2Yy0+dmNfdHJhbnNsYXRlID0gc2V0X3RyYW5zbGF0ZSh2Yy0+dmNfRzFfY2hhcnNldCwgdmMpOworCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCX0KK30KKworLyogVGhpcyBpcyBhIHRlbXBvcmFyeSBidWZmZXIgdXNlZCB0byBwcmVwYXJlIGEgdHR5IGNvbnNvbGUgd3JpdGUKKyAqIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBhdm9pZCB0b3VjaGluZyB1c2VyIHNwYWNlIHdoaWxlIGhvbGRpbmcgdGhlCisgKiBjb25zb2xlIHNwaW5sb2NrLiAgSXQgaXMgYWxsb2NhdGVkIGluIGNvbl9pbml0IGFuZCBpcyBzaGFyZWQgYnkKKyAqIHRoaXMgY29kZSBhbmQgdGhlIHZjX3NjcmVlbiByZWFkL3dyaXRlIHR0eSBjYWxscy4KKyAqCisgKiBXZSBoYXZlIHRvIGFsbG9jYXRlIHRoaXMgc3RhdGljYWxseSBpbiB0aGUga2VybmVsIGRhdGEgc2VjdGlvbgorICogc2luY2UgY29uc29sZV9pbml0IChhbmQgdGh1cyBjb25faW5pdCkgYXJlIGNhbGxlZCBiZWZvcmUgYW55CisgKiBrZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gaXMgYXZhaWxhYmxlLgorICovCitjaGFyIGNvbl9idWZbQ09OX0JVRl9TSVpFXTsKK0RFQ0xBUkVfTVVURVgoY29uX2J1Zl9zZW0pOworCisvKiBhY3F1aXJlcyBjb25zb2xlX3NlbSAqLworc3RhdGljIGludCBkb19jb25fd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisjaWZkZWYgVlRfQlVGX1ZSQU1fT05MWQorI2RlZmluZSBGTFVTSCBkbyB7IH0gd2hpbGUoMCk7CisjZWxzZQorI2RlZmluZSBGTFVTSCBpZiAoZHJhd194ID49IDApIHsgXAorCXZjLT52Y19zdy0+Y29uX3B1dGNzKHZjLCAodTE2ICopZHJhd19mcm9tLCAodTE2ICopZHJhd190byAtICh1MTYgKilkcmF3X2Zyb20sIHZjLT52Y195LCBkcmF3X3gpOyBcCisJZHJhd194ID0gLTE7IFwKKwl9CisjZW5kaWYKKworCWludCBjLCB0Yywgb2ssIG4gPSAwLCBkcmF3X3ggPSAtMTsKKwl1bnNpZ25lZCBpbnQgY3VycmNvbnM7CisJdW5zaWduZWQgbG9uZyBkcmF3X2Zyb20gPSAwLCBkcmF3X3RvID0gMDsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisJdTE2IGhpbWFzaywgY2hhcm1hc2s7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb3JpZ19idWYgPSBOVUxMOworCWludCBvcmlnX2NvdW50OworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm4gY291bnQ7CisKKwltaWdodF9zbGVlcCgpOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCXZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAodmMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInZ0OiBhcmdoLCBkcml2ZXJfZGF0YSBpcyBOVUxMICFcbiIpOworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCXJldHVybiAwOworCX0KKworCWN1cnJjb25zID0gdmMtPnZjX251bTsKKwlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKGN1cnJjb25zKSkgeworCSAgICAvKiBjb3VsZCB0aGlzIGhhcHBlbj8gKi8KKwkgICAgc3RhdGljIGludCBlcnJvciA9IDA7CisJICAgIGlmICghZXJyb3IpIHsKKwkJZXJyb3IgPSAxOworCQlwcmludGsoImNvbl93cml0ZTogdHR5ICVkIG5vdCBhbGxvY2F0ZWRcbiIsIGN1cnJjb25zKzEpOworCSAgICB9CisJICAgIHJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCW9yaWdfYnVmID0gYnVmOworCW9yaWdfY291bnQgPSBjb3VudDsKKworCS8qIEF0IHRoaXMgcG9pbnQgJ2J1ZicgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGtlcm5lbCBidWZmZXIKKwkgKiBhbmQgdGhlcmVmb3JlIG5vIGFjY2VzcyB0byB1c2Vyc3BhY2UgKGFuZCB0aGVyZWZvcmUgc2xlZXBpbmcpCisJICogd2lsbCBiZSBuZWVkZWQuICBUaGUgY29uX2J1Zl9zZW0gc2VyaWFsaXplcyBhbGwgdHR5IGJhc2VkCisJICogY29uc29sZSByZW5kZXJpbmcgYW5kIHZjcyB3cml0ZS9yZWFkIG9wZXJhdGlvbnMuICBXZSBob2xkCisJICogdGhlIGNvbnNvbGUgc3BpbmxvY2sgZHVyaW5nIHRoZSBlbnRpcmUgd3JpdGUuCisJICovCisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwl2YyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHZjID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2dDogYXJnaCwgZHJpdmVyX2RhdGEgX2JlY2FtZV8gTlVMTCAhXG4iKTsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQlnb3RvIG91dDsKKwl9CisKKwloaW1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrOworCWNoYXJtYXNrID0gaGltYXNrID8gMHgxZmYgOiAweGZmOworCisJLyogdW5kcmF3IGN1cnNvciBmaXJzdCAqLworCWlmIChJU19GRyh2YykpCisJCWhpZGVfY3Vyc29yKHZjKTsKKworCXdoaWxlICghdHR5LT5zdG9wcGVkICYmIGNvdW50KSB7CisJCWludCBvcmlnID0gKmJ1ZjsKKwkJYyA9IG9yaWc7CisJCWJ1ZisrOworCQluKys7CisJCWNvdW50LS07CisKKwkJLyogRG8gbm8gdHJhbnNsYXRpb24gYXQgYWxsIGluIGNvbnRyb2wgc3RhdGVzICovCisJCWlmICh2Yy0+dmNfc3RhdGUgIT0gRVNub3JtYWwpIHsKKwkJCXRjID0gYzsKKwkJfSBlbHNlIGlmICh2Yy0+dmNfdXRmKSB7CisJCSAgICAvKiBDb21iaW5lIFVURi04IGludG8gVW5pY29kZSAqLworCQkgICAgLyogSW5jb21wbGV0ZSBjaGFyYWN0ZXJzIHNpbGVudGx5IGlnbm9yZWQgKi8KKwkJICAgIGlmKGMgPiAweDdmKSB7CisJCQlpZiAodmMtPnZjX3V0Zl9jb3VudCA+IDAgJiYgKGMgJiAweGMwKSA9PSAweDgwKSB7CisJCQkJdmMtPnZjX3V0Zl9jaGFyID0gKHZjLT52Y191dGZfY2hhciA8PCA2KSB8IChjICYgMHgzZik7CisJCQkJdmMtPnZjX3V0Zl9jb3VudC0tOworCQkJCWlmICh2Yy0+dmNfdXRmX2NvdW50ID09IDApCisJCQkJICAgIHRjID0gYyA9IHZjLT52Y191dGZfY2hhcjsKKwkJCQllbHNlIGNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGMgJiAweGUwKSA9PSAweGMwKSB7CisJCQkJICAgIHZjLT52Y191dGZfY291bnQgPSAxOworCQkJCSAgICB2Yy0+dmNfdXRmX2NoYXIgPSAoYyAmIDB4MWYpOworCQkJCX0gZWxzZSBpZiAoKGMgJiAweGYwKSA9PSAweGUwKSB7CisJCQkJICAgIHZjLT52Y191dGZfY291bnQgPSAyOworCQkJCSAgICB2Yy0+dmNfdXRmX2NoYXIgPSAoYyAmIDB4MGYpOworCQkJCX0gZWxzZSBpZiAoKGMgJiAweGY4KSA9PSAweGYwKSB7CisJCQkJICAgIHZjLT52Y191dGZfY291bnQgPSAzOworCQkJCSAgICB2Yy0+dmNfdXRmX2NoYXIgPSAoYyAmIDB4MDcpOworCQkJCX0gZWxzZSBpZiAoKGMgJiAweGZjKSA9PSAweGY4KSB7CisJCQkJICAgIHZjLT52Y191dGZfY291bnQgPSA0OworCQkJCSAgICB2Yy0+dmNfdXRmX2NoYXIgPSAoYyAmIDB4MDMpOworCQkJCX0gZWxzZSBpZiAoKGMgJiAweGZlKSA9PSAweGZjKSB7CisJCQkJICAgIHZjLT52Y191dGZfY291bnQgPSA1OworCQkJCSAgICB2Yy0+dmNfdXRmX2NoYXIgPSAoYyAmIDB4MDEpOworCQkJCX0gZWxzZQorCQkJCSAgICB2Yy0+dmNfdXRmX2NvdW50ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCSAgICAgIH0KKwkJICAgIH0gZWxzZSB7CisJCSAgICAgIHRjID0gYzsKKwkJICAgICAgdmMtPnZjX3V0Zl9jb3VudCA9IDA7CisJCSAgICB9CisJCX0gZWxzZSB7CS8qIG5vIHV0ZiAqLworCQkgIHRjID0gdmMtPnZjX3RyYW5zbGF0ZVt2Yy0+dmNfdG9nZ2xlX21ldGEgPyAoYyB8IDB4ODApIDogY107CisJCX0KKworICAgICAgICAgICAgICAgIC8qIElmIHRoZSBvcmlnaW5hbCBjb2RlIHdhcyBhIGNvbnRyb2wgY2hhcmFjdGVyIHdlCisgICAgICAgICAgICAgICAgICogb25seSBhbGxvdyBhIGdseXBoIHRvIGJlIGRpc3BsYXllZCBpZiB0aGUgY29kZSBpcworICAgICAgICAgICAgICAgICAqIG5vdCBub3JtYWxseSB1c2VkIChzdWNoIGFzIGZvciBjdXJzb3IgbW92ZW1lbnQpIG9yCisgICAgICAgICAgICAgICAgICogaWYgdGhlIGRpc3BfY3RybCBtb2RlIGhhcyBiZWVuIGV4cGxpY2l0bHkgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgKiBDZXJ0YWluIGNoYXJhY3RlcnMgKGFzIGdpdmVuIGJ5IHRoZSBDVFJMX0FMV0FZUworICAgICAgICAgICAgICAgICAqIGJpdG1hcCkgYXJlIGFsd2F5cyBkaXNwbGF5ZWQgYXMgY29udHJvbCBjaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAqIGFzIHRoZSBjb25zb2xlIHdvdWxkIGJlIHByZXR0eSB1c2VsZXNzIHdpdGhvdXQKKyAgICAgICAgICAgICAgICAgKiB0aGVtOyB0byBkaXNwbGF5IGFuIGFyYml0cmFyeSBmb250IHBvc2l0aW9uIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBkaXJlY3QtdG8tZm9udCB6b25lIGluIFVURi04IG1vZGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgb2sgPSB0YyAmJiAoYyA+PSAzMiB8fAorCQkJICAgICghdmMtPnZjX3V0ZiAmJiAhKCgodmMtPnZjX2Rpc3BfY3RybCA/IENUUkxfQUxXQVlTCisJCQkJCQk6IENUUkxfQUNUSU9OKSA+PiBjKSAmIDEpKSkKKwkJCSYmIChjICE9IDEyNyB8fCB2Yy0+dmNfZGlzcF9jdHJsKQorCQkJJiYgKGMgIT0gMTI4KzI3KTsKKworCQlpZiAodmMtPnZjX3N0YXRlID09IEVTbm9ybWFsICYmIG9rKSB7CisJCQkvKiBOb3cgdHJ5IHRvIGZpbmQgb3V0IGhvdyB0byBkaXNwbGF5IGl0ICovCisJCQl0YyA9IGNvbnZfdW5pX3RvX3BjKHZjLCB0Yyk7CisJCQlpZiAoIHRjID09IC00ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBnb3QgLTQgKG5vdCBmb3VuZCkgdGhlbiBzZWUgaWYgd2UgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIChVK0ZGRkQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjID0gY29udl91bmlfdG9fcGModmMsIDB4ZmZmZCk7CisKKwkJCQkvKiBPbmUgcmVhc29uIGZvciB0aGUgLTQgY2FuIGJlIHRoYXQgd2UganVzdAorCQkJCSAgIGRpZCBhIGNsZWFyX3VuaW1hcCgpOworCQkJCSAgIHRyeSBhdCBsZWFzdCB0byBzaG93IHNvbWV0aGluZy4gKi8KKwkJCQlpZiAodGMgPT0gLTQpCisJCQkJICAgICB0YyA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCB0YyA9PSAtMyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFkIGhhc2ggdGFibGUgLS0gaG9wZSBmb3IgdGhlIGJlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJaWYgKHRjICYgfmNoYXJtYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogQ29udmVyc2lvbiBmYWlsZWQgKi8KKworCQkJaWYgKHZjLT52Y19uZWVkX3dyYXAgfHwgdmMtPnZjX2RlY2ltKQorCQkJCUZMVVNICisJCQlpZiAodmMtPnZjX25lZWRfd3JhcCkgeworCQkJCWNyKHZjKTsKKwkJCQlsZih2Yyk7CisJCQl9CisJCQlpZiAodmMtPnZjX2RlY2ltKQorCQkJCWluc2VydF9jaGFyKHZjLCAxKTsKKwkJCXNjcl93cml0ZXcoaGltYXNrID8KKwkJCQkgICAgICgodmMtPnZjX2F0dHIgPDwgOCkgJiB+aGltYXNrKSArICgodGMgJiAweDEwMCkgPyBoaW1hc2sgOiAwKSArICh0YyAmIDB4ZmYpIDoKKwkJCQkgICAgICh2Yy0+dmNfYXR0ciA8PCA4KSArIHRjLAorCQkJCSAgICh1MTYgKikgdmMtPnZjX3Bvcyk7CisJCQlpZiAoRE9fVVBEQVRFKHZjKSAmJiBkcmF3X3ggPCAwKSB7CisJCQkJZHJhd194ID0gdmMtPnZjX3g7CisJCQkJZHJhd19mcm9tID0gdmMtPnZjX3BvczsKKwkJCX0KKwkJCWlmICh2Yy0+dmNfeCA9PSB2Yy0+dmNfY29scyAtIDEpIHsKKwkJCQl2Yy0+dmNfbmVlZF93cmFwID0gdmMtPnZjX2RlY2F3bTsKKwkJCQlkcmF3X3RvID0gdmMtPnZjX3BvcyArIDI7CisJCQl9IGVsc2UgeworCQkJCXZjLT52Y194Kys7CisJCQkJZHJhd190byA9ICh2Yy0+dmNfcG9zICs9IDIpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJRkxVU0gKKwkJZG9fY29uX3Ryb2wodHR5LCB2Yywgb3JpZyk7CisJfQorCUZMVVNICisJY29uc29sZV9jb25kaXRpb25hbF9zY2hlZHVsZSgpOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworb3V0OgorCXJldHVybiBuOworI3VuZGVmIEZMVVNICit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjb25zb2xlIHN3aXRjaGluZyBjYWxsYmFjay4KKyAqCisgKiBEb2luZyBjb25zb2xlIHN3aXRjaGluZyBpbiBhIHByb2Nlc3MgY29udGV4dCBhbGxvd3MKKyAqIHVzIHRvIGRvIHRoZSBzd2l0Y2hlcyBhc3luY2hyb25vdXNseSAobmVlZGVkIHdoZW4gd2Ugd2FudAorICogdG8gc3dpdGNoIGR1ZSB0byBhIGtleWJvYXJkIGludGVycnVwdCkuICBTeW5jaHJvbml6YXRpb24KKyAqIHdpdGggb3RoZXIgY29uc29sZSBjb2RlIGFuZCBwcmV2ZW50aW9uIG9mIHJlLWVudHJhbmN5IGlzCisgKiBlbnN1cmVkIHdpdGggY29uc29sZV9zZW0uCisgKi8KK3N0YXRpYyB2b2lkIGNvbnNvbGVfY2FsbGJhY2sodm9pZCAqaWdub3JlZCkKK3sKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwlpZiAod2FudF9jb25zb2xlID49IDApIHsKKwkJaWYgKHdhbnRfY29uc29sZSAhPSBmZ19jb25zb2xlICYmCisJCSAgICB2Y19jb25zX2FsbG9jYXRlZCh3YW50X2NvbnNvbGUpKSB7CisJCQloaWRlX2N1cnNvcih2Y19jb25zW2ZnX2NvbnNvbGVdLmQpOworCQkJY2hhbmdlX2NvbnNvbGUodmNfY29uc1t3YW50X2NvbnNvbGVdLmQpOworCQkJLyogd2Ugb25seSBjaGFuZ2VkIHdoZW4gdGhlIGNvbnNvbGUgaGFkIGFscmVhZHkKKwkJCSAgIGJlZW4gYWxsb2NhdGVkIC0gYSBuZXcgY29uc29sZSBpcyBub3QgY3JlYXRlZAorCQkJICAgaW4gYW4gaW50ZXJydXB0IHJvdXRpbmUgKi8KKwkJfQorCQl3YW50X2NvbnNvbGUgPSAtMTsKKwl9CisJaWYgKGRvX3Bva2VfYmxhbmtlZF9jb25zb2xlKSB7IC8qIGRvIG5vdCB1bmJsYW5rIGZvciBhIExFRCBjaGFuZ2UgKi8KKwkJZG9fcG9rZV9ibGFua2VkX2NvbnNvbGUgPSAwOworCQlwb2tlX2JsYW5rZWRfY29uc29sZSgpOworCX0KKwlpZiAoc2Nyb2xsYmFja19kZWx0YSkgeworCQlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJCWNsZWFyX3NlbGVjdGlvbigpOworCQlpZiAodmMtPnZjX21vZGUgPT0gS0RfVEVYVCkKKwkJCXZjLT52Y19zdy0+Y29uX3Njcm9sbGRlbHRhKHZjLCBzY3JvbGxiYWNrX2RlbHRhKTsKKwkJc2Nyb2xsYmFja19kZWx0YSA9IDA7CisJfQorCWlmIChibGFua190aW1lcl9leHBpcmVkKSB7CisJCWRvX2JsYW5rX3NjcmVlbigwKTsKKwkJYmxhbmtfdGltZXJfZXhwaXJlZCA9IDA7CisJfQorCisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworfQorCit2b2lkIHNldF9jb25zb2xlKGludCBucikKK3sKKwl3YW50X2NvbnNvbGUgPSBucjsKKwlzY2hlZHVsZV9jb25zb2xlX2NhbGxiYWNrKCk7Cit9CisKK3N0cnVjdCB0dHlfZHJpdmVyICpjb25zb2xlX2RyaXZlcjsKKworI2lmZGVmIENPTkZJR19WVF9DT05TT0xFCisKKy8qCisgKglDb25zb2xlIG9uIHZpcnR1YWwgdGVybWluYWwKKyAqCisgKiBUaGUgY29uc29sZSBtdXN0IGJlIGxvY2tlZCB3aGVuIHdlIGdldCBoZXJlLgorICovCisKK3N0YXRpYyB2b2lkIHZ0X2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpiLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJdW5zaWduZWQgY2hhciBjOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHByaW50aW5nOworCWNvbnN0IHVzaG9ydCAqc3RhcnQ7CisJdXNob3J0IGNudCA9IDA7CisJdXNob3J0IG15eDsKKworCS8qIGNvbnNvbGUgYnVzeSBvciBub3QgeWV0IGluaXRpYWxpemVkICovCisJaWYgKCFwcmludGFibGUgfHwgdGVzdF9hbmRfc2V0X2JpdCgwLCAmcHJpbnRpbmcpKQorCQlyZXR1cm47CisKKwlpZiAoa21zZ19yZWRpcmVjdCAmJiB2Y19jb25zX2FsbG9jYXRlZChrbXNnX3JlZGlyZWN0IC0gMSkpCisJCXZjID0gdmNfY29uc1trbXNnX3JlZGlyZWN0IC0gMV0uZDsKKworCS8qIHJlYWQgYHgnIG9ubHkgYWZ0ZXIgc2V0dGluZyBjdXJyY29ucyBwcm9wZXJseSAob3RoZXJ3aXNlCisJICAgdGhlIGB4JyBtYWNybyB3aWxsIHJlYWQgdGhlIHggb2YgdGhlIGZvcmVncm91bmQgY29uc29sZSkuICovCisJbXl4ID0gdmMtPnZjX3g7CisKKwlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKGZnX2NvbnNvbGUpKSB7CisJCS8qIGltcG9zc2libGUgKi8KKwkJLyogcHJpbnRrKCJ2dF9jb25zb2xlX3ByaW50OiB0dHkgJWQgbm90IGFsbG9jYXRlZCA/P1xuIiwgY3VycmNvbnMrMSk7ICovCisJCWdvdG8gcXVpdDsKKwl9CisKKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkKKwkJZ290byBxdWl0OworCisJLyogdW5kcmF3IGN1cnNvciBmaXJzdCAqLworCWlmIChJU19GRyh2YykpCisJCWhpZGVfY3Vyc29yKHZjKTsKKworCXN0YXJ0ID0gKHVzaG9ydCAqKXZjLT52Y19wb3M7CisKKwkvKiBDb250cml2ZWQgc3RydWN0dXJlIHRvIHRyeSB0byBlbXVsYXRlIG9yaWdpbmFsIG5lZWRfd3JhcCBiZWhhdmlvdXIKKwkgKiBQcm9ibGVtcyBjYXVzZWQgd2hlbiB3ZSBoYXZlIG5lZWRfd3JhcCBzZXQgb24gJ1xuJyBjaGFyYWN0ZXIgKi8KKwl3aGlsZSAoY291bnQtLSkgeworCQljID0gKmIrKzsKKwkJaWYgKGMgPT0gMTAgfHwgYyA9PSAxMyB8fCBjID09IDggfHwgdmMtPnZjX25lZWRfd3JhcCkgeworCQkJaWYgKGNudCA+IDApIHsKKwkJCQlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpKQorCQkJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjcyh2Yywgc3RhcnQsIGNudCwgdmMtPnZjX3ksIHZjLT52Y194KTsKKwkJCQl2Yy0+dmNfeCArPSBjbnQ7CisJCQkJaWYgKHZjLT52Y19uZWVkX3dyYXApCisJCQkJCXZjLT52Y194LS07CisJCQkJY250ID0gMDsKKwkJCX0KKwkJCWlmIChjID09IDgpIHsJCS8qIGJhY2tzcGFjZSAqLworCQkJCWJzKHZjKTsKKwkJCQlzdGFydCA9ICh1c2hvcnQgKil2Yy0+dmNfcG9zOworCQkJCW15eCA9IHZjLT52Y194OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGMgIT0gMTMpCisJCQkJbGYodmMpOworCQkJY3IodmMpOworCQkJc3RhcnQgPSAodXNob3J0ICopdmMtPnZjX3BvczsKKwkJCW15eCA9IHZjLT52Y194OworCQkJaWYgKGMgPT0gMTAgfHwgYyA9PSAxMykKKwkJCQljb250aW51ZTsKKwkJfQorCQlzY3Jfd3JpdGV3KCh2Yy0+dmNfYXR0ciA8PCA4KSArIGMsICh1bnNpZ25lZCBzaG9ydCAqKXZjLT52Y19wb3MpOworCQljbnQrKzsKKwkJaWYgKG15eCA9PSB2Yy0+dmNfY29scyAtIDEpIHsKKwkJCXZjLT52Y19uZWVkX3dyYXAgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJdmMtPnZjX3BvcyArPSAyOworCQlteXgrKzsKKwl9CisJaWYgKGNudCA+IDApIHsKKwkJaWYgKENPTl9JU19WSVNJQkxFKHZjKSkKKwkJCXZjLT52Y19zdy0+Y29uX3B1dGNzKHZjLCBzdGFydCwgY250LCB2Yy0+dmNfeSwgdmMtPnZjX3gpOworCQl2Yy0+dmNfeCArPSBjbnQ7CisJCWlmICh2Yy0+dmNfeCA9PSB2Yy0+dmNfY29scykgeworCQkJdmMtPnZjX3gtLTsKKwkJCXZjLT52Y19uZWVkX3dyYXAgPSAxOworCQl9CisJfQorCXNldF9jdXJzb3IodmMpOworCitxdWl0OgorCWNsZWFyX2JpdCgwLCAmcHJpbnRpbmcpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnZ0X2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IGMtPmluZGV4ID8gYy0+aW5kZXgtMSA6IGZnX2NvbnNvbGU7CisJcmV0dXJuIGNvbnNvbGVfZHJpdmVyOworfQorCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgdnRfY29uc29sZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInR0eSIsCisJLndyaXRlCQk9IHZ0X2NvbnNvbGVfcHJpbnQsCisJLmRldmljZQkJPSB2dF9jb25zb2xlX2RldmljZSwKKwkudW5ibGFuawk9IHVuYmxhbmtfc2NyZWVuLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CQk9IC0xLAorfTsKKyNlbmRpZgorCisvKgorICoJSGFuZGxpbmcgb2YgTGludXgtc3BlY2lmaWMgVkMgaW9jdGxzCisgKi8KKworLyoKKyAqIEdlbmVyYWxseSBhIGJpdCByYWN5IHdpdGggcmVzcGVjdCB0byBjb25zb2xlX3NlbSgpLgorICoKKyAqIFRoZXJlIGFyZSBzb21lIGZ1bmN0aW9ucyB3aGljaCBkb24ndCBuZWVkIGl0LgorICoKKyAqIFRoZXJlIGFyZSBzb21lIGZ1bmN0aW9ucyB3aGljaCBjYW4gc2xlZXAgZm9yIGFyYml0cmFyeSBwZXJpb2RzCisgKiAocGFzdGVfc2VsZWN0aW9uKSBidXQgd2UgZG9uJ3QgbmVlZCB0aGUgbG9jayB0aGVyZSBhbnl3YXkuCisgKgorICogc2V0X3NlbGVjdGlvbiBoYXMgbG9ja2luZywgYW5kIGRlZmluaXRlbHkgbmVlZHMgaXQKKyAqLworCitpbnQgdGlvY2xpbnV4KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNoYXIgdHlwZSwgZGF0YTsKKwljaGFyIF9fdXNlciAqcCA9IChjaGFyIF9fdXNlciAqKWFyZzsKKwlpbnQgbGluZXM7CisJaW50IHJldDsKKworCWlmICh0dHktPmRyaXZlci0+dHlwZSAhPSBUVFlfRFJJVkVSX1RZUEVfQ09OU09MRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5ICE9IHR0eSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoZ2V0X3VzZXIodHlwZSwgcCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJc3dpdGNoICh0eXBlKQorCXsKKwkJY2FzZSBUSU9DTF9TRVRTRUw6CisJCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJCQlyZXQgPSBzZXRfc2VsZWN0aW9uKChzdHJ1Y3QgdGlvY2xfc2VsZWN0aW9uIF9fdXNlciAqKShwKzEpLCB0dHkpOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfUEFTVEVTRUw6CisJCQlyZXQgPSBwYXN0ZV9zZWxlY3Rpb24odHR5KTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1VOQkxBTktTQ1JFRU46CisJCQl1bmJsYW5rX3NjcmVlbigpOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfU0VMTE9BRExVVDoKKwkJCXJldCA9IHNlbF9sb2FkbHV0KHApOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfR0VUU0hJRlRTVEFURToKKwkJCQorCS8qCisJICogTWFrZSBpdCBwb3NzaWJsZSB0byByZWFjdCB0byBTaGlmdCtNb3VzZWJ1dHRvbi4KKwkgKiBOb3RlIHRoYXQgJ3NoaWZ0X3N0YXRlJyBpcyBhbiB1bmRvY3VtZW50ZWQKKwkgKiBrZXJuZWwtaW50ZXJuYWwgdmFyaWFibGU7IHByb2dyYW1zIG5vdCBjbG9zZWx5CisJICogcmVsYXRlZCB0byB0aGUga2VybmVsIHNob3VsZCBub3QgdXNlIHRoaXMuCisJICovCisJIAkJZGF0YSA9IHNoaWZ0X3N0YXRlOworCQkJcmV0ID0gX19wdXRfdXNlcihkYXRhLCBwKTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX0dFVE1PVVNFUkVQT1JUSU5HOgorCQkJZGF0YSA9IG1vdXNlX3JlcG9ydGluZygpOworCQkJcmV0ID0gX19wdXRfdXNlcihkYXRhLCBwKTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1NFVFZFU0FCTEFOSzoKKwkJCXNldF92ZXNhX2JsYW5raW5nKHApOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfU0VUS01TR1JFRElSRUNUOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQkJcmV0ID0gLUVQRVJNOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgcCsxKSkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQllbHNlCisJCQkJCWttc2dfcmVkaXJlY3QgPSBkYXRhOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfR0VURkdDT05TT0xFOgorCQkJcmV0ID0gZmdfY29uc29sZTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1NDUk9MTENPTlNPTEU6CisJCQlpZiAoZ2V0X3VzZXIobGluZXMsIChzMzIgX191c2VyICopKHArNCkpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJc2Nyb2xsZnJvbnQodmNfY29uc1tmZ19jb25zb2xlXS5kLCBsaW5lcyk7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX0JMQU5LU0NSRUVOOgkvKiB1bnRpbCBleHBsaWNpdGx5IHVuYmxhbmtlZCwgbm90IG9ubHkgcG9rZWQgKi8KKwkJCWlnbm9yZV9wb2tlID0gMTsKKwkJCWRvX2JsYW5rX3NjcmVlbigwKTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX0JMQU5LRURTQ1JFRU46CisJCQlyZXQgPSBjb25zb2xlX2JsYW5rZWQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIC9kZXYvdHR5TiBoYW5kbGluZworICovCisKK3N0YXRpYyBpbnQgY29uX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludAlyZXR2YWw7CisKKwlyZXR2YWwgPSBkb19jb25fd3JpdGUodHR5LCBidWYsIGNvdW50KTsKKwljb25fZmx1c2hfY2hhcnModHR5KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNvbl9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuOwkvKiBuX3IzOTY0IGNhbGxzIHB1dF9jaGFyKCkgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAqLworCWRvX2Nvbl93cml0ZSh0dHksICZjaCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgY29uX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAodHR5LT5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gNDA5NjsJCS8qIE5vIGxpbWl0LCByZWFsbHk7IHdlJ3JlIG5vdCBidWZmZXJpbmcgKi8KK30KKworc3RhdGljIGludCBjb25fY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDA7CQkvKiB3ZSdyZSBub3QgYnVmZmVyaW5nICovCit9CisKKy8qCisgKiBjb25fdGhyb3R0bGUgYW5kIGNvbl91bnRocm90dGxlIGFyZSBvbmx5IHVzZWQgZm9yCisgKiBwYXN0ZV9zZWxlY3Rpb24oKSwgd2hpY2ggaGFzIHRvIHN0dWZmIGluIGEgbGFyZ2UgbnVtYmVyIG9mCisgKiBjaGFyYWN0ZXJzLi4uCisgKi8KK3N0YXRpYyB2b2lkIGNvbl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworfQorCitzdGF0aWMgdm9pZCBjb25fdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZjLT5wYXN0ZV93YWl0KTsKK30KKworLyoKKyAqIFR1cm4gdGhlIFNjcm9sbC1Mb2NrIExFRCBvbiB3aGVuIHRoZSB0dHkgaXMgc3RvcHBlZAorICovCitzdGF0aWMgdm9pZCBjb25fc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBjb25zb2xlX251bTsKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCWNvbnNvbGVfbnVtID0gdHR5LT5pbmRleDsKKwlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKGNvbnNvbGVfbnVtKSkKKwkJcmV0dXJuOworCXNldF92Y19rYmRfbGVkKGtiZF90YWJsZSArIGNvbnNvbGVfbnVtLCBWQ19TQ1JPTExPQ0spOworCXNldF9sZWRzKCk7Cit9CisKKy8qCisgKiBUdXJuIHRoZSBTY3JvbGwtTG9jayBMRUQgb2ZmIHdoZW4gdGhlIGNvbnNvbGUgaXMgc3RhcnRlZAorICovCitzdGF0aWMgdm9pZCBjb25fc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgY29uc29sZV9udW07CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwljb25zb2xlX251bSA9IHR0eS0+aW5kZXg7CisJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChjb25zb2xlX251bSkpCisJCXJldHVybjsKKwljbHJfdmNfa2JkX2xlZChrYmRfdGFibGUgKyBjb25zb2xlX251bSwgVkNfU0NST0xMT0NLKTsKKwlzZXRfbGVkcygpOworfQorCitzdGF0aWMgdm9pZCBjb25fZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCS8qIGZyb20gZmx1c2hfdG9fbGRpc2MgKi8KKwkJcmV0dXJuOworCisJLyogaWYgd2UgcmFjZSB3aXRoIGNvbl9jbG9zZSgpLCB2dCBtYXkgYmUgbnVsbCAqLworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwl2YyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHZjKQorCQlzZXRfY3Vyc29yKHZjKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSB0aGUgY29uc29sZSBzY3JlZW4gbWVtb3J5LgorICovCitzdGF0aWMgaW50IGNvbl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXVuc2lnbmVkIGludCBjdXJyY29ucyA9IHR0eS0+aW5kZXg7CisJaW50IHJldCA9IDA7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWYgKHR0eS0+Y291bnQgPT0gMSkgeworCQlyZXQgPSB2Y19hbGxvY2F0ZShjdXJyY29ucyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tjdXJyY29uc10uZDsKKwkJCXR0eS0+ZHJpdmVyX2RhdGEgPSB2YzsKKwkJCXZjLT52Y190dHkgPSB0dHk7CisKKwkJCWlmICghdHR5LT53aW5zaXplLndzX3JvdyAmJiAhdHR5LT53aW5zaXplLndzX2NvbCkgeworCQkJCXR0eS0+d2luc2l6ZS53c19yb3cgPSB2Y19jb25zW2N1cnJjb25zXS5kLT52Y19yb3dzOworCQkJCXR0eS0+d2luc2l6ZS53c19jb2wgPSB2Y19jb25zW2N1cnJjb25zXS5kLT52Y19jb2xzOworCQkJfQorCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQkJdmNzX21ha2VfZGV2ZnModHR5KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXZSB0YWtlIHR0eV9zZW0gaW4gaGVyZSB0byBwcmV2ZW50IGFub3RoZXIgdGhyZWFkIGZyb20gY29taW5nIGluIHZpYSBpbml0X2RldgorICogYW5kIHRha2luZyBhIHJlZiBhZ2FpbnN0IHRoZSB0dHkgd2hpbGUgd2UncmUgaW4gdGhlIHByb2Nlc3Mgb2YgZm9yZ2V0dGluZworICogYWJvdXQgaXQgYW5kIGNsZWFuaW5nIHRoaW5ncyB1cC4KKyAqCisgKiBUaGlzIGlzIGJlY2F1c2UgdmNzX3JlbW92ZV9kZXZmcygpIGNhbiBzbGVlcCBhbmQgd2lsbCBkcm9wIHRoZSBCS0wuCisgKi8KK3N0YXRpYyB2b2lkIGNvbl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkb3duKCZ0dHlfc2VtKTsKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWYgKHR0eSAmJiB0dHktPmNvdW50ID09IDEpIHsKKwkJc3RydWN0IHZjX2RhdGEgKnZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCQlpZiAodmMpCisJCQl2Yy0+dmNfdHR5ID0gTlVMTDsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJdmNzX3JlbW92ZV9kZXZmcyh0dHkpOworCQl1cCgmdHR5X3NlbSk7CisJCS8qCisJCSAqIHR0eV9zZW0gaXMgcmVsZWFzZWQsIGJ1dCB3ZSBzdGlsbCBob2xkIEJLTCwgc28gdGhlcmUgaXMKKwkJICogc3RpbGwgZXhjbHVzaW9uIGFnYWluc3QgaW5pdF9kZXYoKQorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJdXAoJnR0eV9zZW0pOworfQorCitzdGF0aWMgdm9pZCB2Y19pbml0KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IHJvd3MsCisJCSAgICB1bnNpZ25lZCBpbnQgY29scywgaW50IGRvX2NsZWFyKQoreworCWludCBqLCBrIDsKKworCXZjLT52Y19jb2xzID0gY29sczsKKwl2Yy0+dmNfcm93cyA9IHJvd3M7CisJdmMtPnZjX3NpemVfcm93ID0gY29scyA8PCAxOworCXZjLT52Y19zY3JlZW5idWZfc2l6ZSA9IHZjLT52Y19yb3dzICogdmMtPnZjX3NpemVfcm93OworCisJc2V0X29yaWdpbih2Yyk7CisJdmMtPnZjX3BvcyA9IHZjLT52Y19vcmlnaW47CisJcmVzZXRfdmModmMpOworCWZvciAoaj1rPTA7IGo8MTY7IGorKykgeworCQl2Yy0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9yZWRbal0gOworCQl2Yy0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9ncm5bal0gOworCQl2Yy0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9ibHVbal0gOworCX0KKwl2Yy0+dmNfZGVmX2NvbG9yICAgICAgID0gMHgwNzsgICAvKiB3aGl0ZSAqLworCXZjLT52Y191bGNvbG9yCQk9IDB4MGY7ICAgLyogYm9sZCB3aGl0ZSAqLworCXZjLT52Y19oYWxmY29sb3IgICAgICAgPSAweDA4OyAgIC8qIGdyZXkgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Yy0+cGFzdGVfd2FpdCk7CisJcmVzZXRfdGVybWluYWwodmMsIGRvX2NsZWFyKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjb25zb2xlIGludGVycnVwdHMsIGFuZCBkb2VzIG5vdGhpbmcKKyAqIGVsc2UuIElmIHlvdSB3YW50IHRoZSBzY3JlZW4gdG8gY2xlYXIsIGNhbGwgdHR5X3dyaXRlIHdpdGgKKyAqIHRoZSBhcHByb3ByaWF0ZSBlc2NhcGUtc2VxdWVuY2UuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY29uX2luaXQodm9pZCkKK3sKKwljb25zdCBjaGFyICpkaXNwbGF5X2Rlc2MgPSBOVUxMOworCXN0cnVjdCB2Y19kYXRhICp2YzsKKwl1bnNpZ25lZCBpbnQgY3VycmNvbnMgPSAwOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJaWYgKGNvbnN3aXRjaHApCisJCWRpc3BsYXlfZGVzYyA9IGNvbnN3aXRjaHAtPmNvbl9zdGFydHVwKCk7CisJaWYgKCFkaXNwbGF5X2Rlc2MpIHsKKwkJZmdfY29uc29sZSA9IDA7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5pdF90aW1lcigmY29uc29sZV90aW1lcik7CisJY29uc29sZV90aW1lci5mdW5jdGlvbiA9IGJsYW5rX3NjcmVlbl90OworCWlmIChibGFua2ludGVydmFsKSB7CisJCWJsYW5rX3N0YXRlID0gYmxhbmtfbm9ybWFsX3dhaXQ7CisJCW1vZF90aW1lcigmY29uc29sZV90aW1lciwgamlmZmllcyArIGJsYW5raW50ZXJ2YWwpOworCX0KKworCS8qCisJICoga21hbGxvYyBpcyBub3QgcnVubmluZyB5ZXQgLSB3ZSB1c2UgdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgorCSAqLworCWZvciAoY3VycmNvbnMgPSAwOyBjdXJyY29ucyA8IE1JTl9OUl9DT05TT0xFUzsgY3VycmNvbnMrKykgeworCQl2Y19jb25zW2N1cnJjb25zXS5kID0gdmMgPSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgdmNfZGF0YSkpOworCQl2aXN1YWxfaW5pdCh2YywgY3VycmNvbnMsIDEpOworCQl2Yy0+dmNfc2NyZWVuYnVmID0gKHVuc2lnbmVkIHNob3J0ICopYWxsb2NfYm9vdG1lbSh2Yy0+dmNfc2NyZWVuYnVmX3NpemUpOworCQl2Yy0+dmNfa21hbGxvY2VkID0gMDsKKwkJdmNfaW5pdCh2YywgdmMtPnZjX3Jvd3MsIHZjLT52Y19jb2xzLAorCQkJY3VycmNvbnMgfHwgIXZjLT52Y19zdy0+Y29uX3NhdmVfc2NyZWVuKTsKKwl9CisJY3VycmNvbnMgPSBmZ19jb25zb2xlID0gMDsKKwltYXN0ZXJfZGlzcGxheV9mZyA9IHZjID0gdmNfY29uc1tjdXJyY29uc10uZDsKKwlzZXRfb3JpZ2luKHZjKTsKKwlzYXZlX3NjcmVlbih2Yyk7CisJZ290b3h5KHZjLCB2Yy0+dmNfeCwgdmMtPnZjX3kpOworCWNzaV9KKHZjLCAwKTsKKwl1cGRhdGVfc2NyZWVuKHZjKTsKKwlwcmludGsoIkNvbnNvbGU6ICVzICVzICVkeCVkIiwKKwkJdmMtPnZjX2Nhbl9kb19jb2xvciA/ICJjb2xvdXIiIDogIm1vbm8iLAorCQlkaXNwbGF5X2Rlc2MsIHZjLT52Y19jb2xzLCB2Yy0+dmNfcm93cyk7CisJcHJpbnRhYmxlID0gMTsKKwlwcmludGsoIlxuIik7CisKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKyNpZmRlZiBDT05GSUdfVlRfQ09OU09MRQorCXJlZ2lzdGVyX2NvbnNvbGUoJnZ0X2NvbnNvbGVfZHJpdmVyKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChjb25faW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgY29uX29wcyA9IHsKKwkub3BlbiA9IGNvbl9vcGVuLAorCS5jbG9zZSA9IGNvbl9jbG9zZSwKKwkud3JpdGUgPSBjb25fd3JpdGUsCisJLndyaXRlX3Jvb20gPSBjb25fd3JpdGVfcm9vbSwKKwkucHV0X2NoYXIgPSBjb25fcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gY29uX2ZsdXNoX2NoYXJzLAorCS5jaGFyc19pbl9idWZmZXIgPSBjb25fY2hhcnNfaW5fYnVmZmVyLAorCS5pb2N0bCA9IHZ0X2lvY3RsLAorCS5zdG9wID0gY29uX3N0b3AsCisJLnN0YXJ0ID0gY29uX3N0YXJ0LAorCS50aHJvdHRsZSA9IGNvbl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IGNvbl91bnRocm90dGxlLAorfTsKKworaW50IF9faW5pdCB2dHlfaW5pdCh2b2lkKQoreworCXZjc19pbml0KCk7CisKKwljb25zb2xlX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX05SX0NPTlNPTEVTKTsKKwlpZiAoIWNvbnNvbGVfZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgY29uc29sZSBkcml2ZXJcbiIpOworCWNvbnNvbGVfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvbnNvbGVfZHJpdmVyLT5kZXZmc19uYW1lID0gInZjLyI7CisJY29uc29sZV9kcml2ZXItPm5hbWUgPSAidHR5IjsKKwljb25zb2xlX2RyaXZlci0+bmFtZV9iYXNlID0gMTsKKwljb25zb2xlX2RyaXZlci0+bWFqb3IgPSBUVFlfTUFKT1I7CisJY29uc29sZV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMTsKKwljb25zb2xlX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9DT05TT0xFOworCWNvbnNvbGVfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJY29uc29sZV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoY29uc29sZV9kcml2ZXIsICZjb25fb3BzKTsKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihjb25zb2xlX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBjb25zb2xlIGRyaXZlclxuIik7CisKKwlrYmRfaW5pdCgpOworCWNvbnNvbGVfbWFwX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfUFJPTV9DT05TT0xFCisJcHJvbV9jb25faW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01EQV9DT05TT0xFCisJbWRhX2NvbnNvbGVfaW5pdCgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgVlRfU0lOR0xFX0RSSVZFUgorCisvKgorICoJSWYgd2Ugc3VwcG9ydCBtb3JlIGNvbnNvbGUgZHJpdmVycywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgKgl3aGVuIGEgZHJpdmVyIHdhbnRzIHRvIHRha2Ugb3ZlciBzb21lIGV4aXN0aW5nIGNvbnNvbGVzCisgKglhbmQgYmVjb21lIGRlZmF1bHQgZHJpdmVyIGZvciBuZXdseSBvcGVuZWQgb25lcy4KKyAqLworCitpbnQgdGFrZV9vdmVyX2NvbnNvbGUoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3csIGludCBmaXJzdCwgaW50IGxhc3QsIGludCBkZWZsdCkKK3sKKwlpbnQgaSwgaiA9IC0xOworCWNvbnN0IGNoYXIgKmRlc2M7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwlvd25lciA9IGNzdy0+b3duZXI7CisJaWYgKCF0cnlfbW9kdWxlX2dldChvd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJZGVzYyA9IGNzdy0+Y29uX3N0YXJ0dXAoKTsKKwlpZiAoIWRlc2MpIHsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQltb2R1bGVfcHV0KG93bmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChkZWZsdCkgeworCQlpZiAoY29uc3dpdGNocCkKKwkJCW1vZHVsZV9wdXQoY29uc3dpdGNocC0+b3duZXIpOworCQlfX21vZHVsZV9nZXQob3duZXIpOworCQljb25zd2l0Y2hwID0gY3N3OworCX0KKworCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgeworCQlpbnQgb2xkX3dhc19jb2xvcjsKKwkJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tpXS5kOworCisJCWlmIChjb25fZHJpdmVyX21hcFtpXSkKKwkJCW1vZHVsZV9wdXQoY29uX2RyaXZlcl9tYXBbaV0tPm93bmVyKTsKKwkJX19tb2R1bGVfZ2V0KG93bmVyKTsKKwkJY29uX2RyaXZlcl9tYXBbaV0gPSBjc3c7CisKKwkJaWYgKCF2YyB8fCAhdmMtPnZjX3N3KQorCQkJY29udGludWU7CisKKwkJaiA9IGk7CisJCWlmIChDT05fSVNfVklTSUJMRSh2YykpCisJCQlzYXZlX3NjcmVlbih2Yyk7CisJCW9sZF93YXNfY29sb3IgPSB2Yy0+dmNfY2FuX2RvX2NvbG9yOworCQl2Yy0+dmNfc3ctPmNvbl9kZWluaXQodmMpOworCQl2Yy0+dmNfb3JpZ2luID0gKHVuc2lnbmVkIGxvbmcpdmMtPnZjX3NjcmVlbmJ1ZjsKKwkJdmMtPnZjX3Zpc2libGVfb3JpZ2luID0gdmMtPnZjX29yaWdpbjsKKwkJdmMtPnZjX3Njcl9lbmQgPSB2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NjcmVlbmJ1Zl9zaXplOworCQl2Yy0+dmNfcG9zID0gdmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqIHZjLT52Y195ICsgMiAqIHZjLT52Y194OworCQl2aXN1YWxfaW5pdCh2YywgaSwgMCk7CisJCXVwZGF0ZV9hdHRyKHZjKTsKKworCQkvKiBJZiB0aGUgY29uc29sZSBjaGFuZ2VkIGJldHdlZW4gbW9ubyA8LT4gY29sb3IsIHRoZW4KKwkJICogdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHNjcmVlbmJ1ZiB3aWxsIGJlIHdyb25nLiAgVGhlCisJCSAqIGZvbGxvd2luZyByZXNldHMgYWxsIGF0dHJpYnV0ZXMgdG8gc29tZXRoaW5nIHNhbmUuCisJCSAqLworCQlpZiAob2xkX3dhc19jb2xvciAhPSB2Yy0+dmNfY2FuX2RvX2NvbG9yKQorCQkJY2xlYXJfYnVmZmVyX2F0dHJpYnV0ZXModmMpOworCisJCWlmIChDT05fSVNfVklTSUJMRSh2YykpCisJCQl1cGRhdGVfc2NyZWVuKHZjKTsKKwl9CisJcHJpbnRrKCJDb25zb2xlOiBzd2l0Y2hpbmcgIik7CisJaWYgKCFkZWZsdCkKKwkJcHJpbnRrKCJjb25zb2xlcyAlZC0lZCAiLCBmaXJzdCsxLCBsYXN0KzEpOworCWlmIChqID49IDApCisJCXByaW50aygidG8gJXMgJXMgJWR4JWRcbiIsCisJCSAgICAgICB2Y19jb25zW2pdLmQtPnZjX2Nhbl9kb19jb2xvciA/ICJjb2xvdXIiIDogIm1vbm8iLAorCQkgICAgICAgZGVzYywgdmNfY29uc1tqXS5kLT52Y19jb2xzLCB2Y19jb25zW2pdLmQtPnZjX3Jvd3MpOworCWVsc2UKKwkJcHJpbnRrKCJ0byAlc1xuIiwgZGVzYyk7CisKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwltb2R1bGVfcHV0KG93bmVyKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBnaXZlX3VwX2NvbnNvbGUoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3cpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKKwkJaWYgKGNvbl9kcml2ZXJfbWFwW2ldID09IGNzdykgeworCQkJbW9kdWxlX3B1dChjc3ctPm93bmVyKTsKKwkJCWNvbl9kcml2ZXJfbWFwW2ldID0gTlVMTDsKKwkJfQorfQorCisjZW5kaWYKKworLyoKKyAqCVNjcmVlbiBibGFua2luZworICovCisKK3N0YXRpYyB2b2lkIHNldF92ZXNhX2JsYW5raW5nKGNoYXIgX191c2VyICpwKQoreworICAgIHVuc2lnbmVkIGludCBtb2RlOworICAgIGdldF91c2VyKG1vZGUsIHAgKyAxKTsKKyAgICB2ZXNhX2JsYW5rX21vZGUgPSAobW9kZSA8IDQpID8gbW9kZSA6IDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSBhIHRpbWVyIGhhbmRsZXIKKyAqLworc3RhdGljIHZvaWQgdmVzYV9wb3dlcmRvd24odm9pZCkKK3sKKyAgICBzdHJ1Y3QgdmNfZGF0YSAqYyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKyAgICAvKgorICAgICAqICBQb3dlciBkb3duIGlmIGN1cnJlbnRseSBzdXNwZW5kZWQgKDEgb3IgMiksCisgICAgICogIHN1c3BlbmQgaWYgY3VycmVudGx5IGJsYW5rZWQgKDApLAorICAgICAqICBlbHNlIGRvIG5vdGhpbmcgKGkuZS4gYWxyZWFkeSBwb3dlcmVkIGRvd24gKDMpKS4KKyAgICAgKiAgQ2FsbGVkIG9ubHkgaWYgcG93ZXJkb3duIGZlYXR1cmVzIGFyZSBhbGxvd2VkLgorICAgICAqLworICAgIHN3aXRjaCAodmVzYV9ibGFua19tb2RlKSB7CisgICAgY2FzZSBWRVNBX05PX0JMQU5LSU5HOgorCSAgICBjLT52Y19zdy0+Y29uX2JsYW5rKGMsIFZFU0FfVlNZTkNfU1VTUEVORCsxLCAwKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSBWRVNBX1ZTWU5DX1NVU1BFTkQ6CisgICAgY2FzZSBWRVNBX0hTWU5DX1NVU1BFTkQ6CisJICAgIGMtPnZjX3N3LT5jb25fYmxhbmsoYywgVkVTQV9QT1dFUkRPV04rMSwgMCk7CisJICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBkb19ibGFua19zY3JlZW4oaW50IGVudGVyaW5nX2dmeCkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJaW50IGk7CisKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmIChjb25zb2xlX2JsYW5rZWQpIHsKKwkJaWYgKGJsYW5rX3N0YXRlID09IGJsYW5rX3Zlc2Ffd2FpdCkgeworCQkJYmxhbmtfc3RhdGUgPSBibGFua19vZmY7CisJCQl2ZXNhX3Bvd2VyZG93bigpOworCisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoYmxhbmtfc3RhdGUgIT0gYmxhbmtfbm9ybWFsX3dhaXQpCisJCXJldHVybjsKKwlibGFua19zdGF0ZSA9IGJsYW5rX29mZjsKKworCS8qIGVudGVyaW5nIGdyYXBoaWNzIG1vZGU/ICovCisJaWYgKGVudGVyaW5nX2dmeCkgeworCQloaWRlX2N1cnNvcih2Yyk7CisJCXNhdmVfc2NyZWVuKHZjKTsKKwkJdmMtPnZjX3N3LT5jb25fYmxhbmsodmMsIC0xLCAxKTsKKwkJY29uc29sZV9ibGFua2VkID0gZmdfY29uc29sZSArIDE7CisJCXNldF9vcmlnaW4odmMpOworCQlyZXR1cm47CisJfQorCisJLyogZG9uJ3QgYmxhbmsgZ3JhcGhpY3MgKi8KKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkgeworCQljb25zb2xlX2JsYW5rZWQgPSBmZ19jb25zb2xlICsgMTsKKwkJcmV0dXJuOworCX0KKworCWhpZGVfY3Vyc29yKHZjKTsKKwlkZWxfdGltZXJfc3luYygmY29uc29sZV90aW1lcik7CisJYmxhbmtfdGltZXJfZXhwaXJlZCA9IDA7CisKKwlzYXZlX3NjcmVlbih2Yyk7CisJLyogSW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2V0IG9yaWdpbiwgYmxhbmtpbmcgaG9vayByZXR1cm5zIDEgKi8KKwlpID0gdmMtPnZjX3N3LT5jb25fYmxhbmsodmMsIDEsIDApOworCWNvbnNvbGVfYmxhbmtlZCA9IGZnX2NvbnNvbGUgKyAxOworCWlmIChpKQorCQlzZXRfb3JpZ2luKHZjKTsKKworCWlmIChjb25zb2xlX2JsYW5rX2hvb2sgJiYgY29uc29sZV9ibGFua19ob29rKDEpKQorCQlyZXR1cm47CisKKwlpZiAodmVzYV9vZmZfaW50ZXJ2YWwpIHsKKwkJYmxhbmtfc3RhdGUgPSBibGFua192ZXNhX3dhaXQsCisJCW1vZF90aW1lcigmY29uc29sZV90aW1lciwgamlmZmllcyArIHZlc2Ffb2ZmX2ludGVydmFsKTsKKwl9CisKKyAgICAJaWYgKHZlc2FfYmxhbmtfbW9kZSkKKwkJdmMtPnZjX3N3LT5jb25fYmxhbmsodmMsIHZlc2FfYmxhbmtfbW9kZSArIDEsIDApOworfQorRVhQT1JUX1NZTUJPTChkb19ibGFua19zY3JlZW4pOworCisvKgorICogQ2FsbGVkIGJ5IHRpbWVyIGFzIHdlbGwgYXMgZnJvbSB2dF9jb25zb2xlX2RyaXZlcgorICovCit2b2lkIGRvX3VuYmxhbmtfc2NyZWVuKGludCBsZWF2aW5nX2dmeCkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisKKwkvKiBUaGlzIHNob3VsZCBub3cgYWx3YXlzIGJlIGNhbGxlZCBmcm9tIGEgInNhbmUiIChyZWFkOiBjYW4gc2NoZWR1bGUpCisJICogY29udGV4dCBmb3IgdGhlIHNha2Ugb2YgdGhlIGxvdyBsZXZlbCBkcml2ZXJzLCBleGNlcHQgaW4gdGhlIHNwZWNpYWwKKwkgKiBjYXNlIG9mIG9vcHNfaW5fcHJvZ3Jlc3MKKwkgKi8KKwlpZiAoIW9vcHNfaW5fcHJvZ3Jlc3MpCisJCW1pZ2h0X3NsZWVwKCk7CisKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlnbm9yZV9wb2tlID0gMDsKKwlpZiAoIWNvbnNvbGVfYmxhbmtlZCkKKwkJcmV0dXJuOworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoZmdfY29uc29sZSkpIHsKKwkJLyogaW1wb3NzaWJsZSAqLworCQlwcmludGsoInVuYmxhbmtfc2NyZWVuOiB0dHkgJWQgbm90IGFsbG9jYXRlZCA/P1xuIiwgZmdfY29uc29sZSsxKTsKKwkJcmV0dXJuOworCX0KKwl2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkKKwkJcmV0dXJuOyAvKiBidXQgbGVhdmUgY29uc29sZV9ibGFua2VkICE9IDAgKi8KKworCWlmIChibGFua2ludGVydmFsKSB7CisJCW1vZF90aW1lcigmY29uc29sZV90aW1lciwgamlmZmllcyArIGJsYW5raW50ZXJ2YWwpOworCQlibGFua19zdGF0ZSA9IGJsYW5rX25vcm1hbF93YWl0OworCX0KKworCWNvbnNvbGVfYmxhbmtlZCA9IDA7CisJaWYgKHZjLT52Y19zdy0+Y29uX2JsYW5rKHZjLCAwLCBsZWF2aW5nX2dmeCkpCisJCS8qIExvdy1sZXZlbCBkcml2ZXIgY2Fubm90IHJlc3RvcmUgLT4gZG8gaXQgb3Vyc2VsdmVzICovCisJCXVwZGF0ZV9zY3JlZW4odmMpOworCWlmIChjb25zb2xlX2JsYW5rX2hvb2spCisJCWNvbnNvbGVfYmxhbmtfaG9vaygwKTsKKwlzZXRfcGFsZXR0ZSh2Yyk7CisJc2V0X2N1cnNvcih2Yyk7Cit9CitFWFBPUlRfU1lNQk9MKGRvX3VuYmxhbmtfc2NyZWVuKTsKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBvdXRzaWRlIHdvcmxkIHRvIGNhdXNlIGEgZm9yY2VkIHVuYmxhbmssIG1vc3RseSBmb3IKKyAqIG9vcHNlcy4gQ3VycmVudGx5LCBJIGp1c3QgY2FsbCBkb191bmJsYW5rX3NjcmVlbigwKSwgYnV0IHdlIGNvdWxkIGV2ZW50dWFsbHkKKyAqIGNhbGwgaXQgd2l0aCAxIGFzIGFuIGFyZ3VtZW50IGFuZCBzbyBmb3JjZSBhIG1vZGUgcmVzdG9yZS4uLiB0aGF0IG1heSBraWxsCisgKiBYIG9yIGF0IGxlYXN0IGdhcmJhZ2UgdGhlIHNjcmVlbiBidXQgd291bGQgYWxzbyBtYWtlIHRoZSBPb3BzIHZpc2libGUuLi4KKyAqLwordm9pZCB1bmJsYW5rX3NjcmVlbih2b2lkKQoreworCWRvX3VuYmxhbmtfc2NyZWVuKDApOworfQorCisvKgorICogV2UgZGVmZXIgdGhlIHRpbWVyIGJsYW5raW5nIHRvIHdvcmsgcXVldWUgc28gaXQgY2FuIHRha2UgdGhlIGNvbnNvbGUgc2VtYXBob3JlCisgKiAoY29uc29sZSBvcGVyYXRpb25zIGNhbiBzdGlsbCBoYXBwZW4gYXQgaXJxIHRpbWUsIGJ1dCBvbmx5IGZyb20gcHJpbnRrIHdoaWNoCisgKiBoYXMgdGhlIGNvbnNvbGUgc2VtYXBob3JlLiBOb3QgcGVyZmVjdCB5ZXQsIGJ1dCBiZXR0ZXIgdGhhbiBubyBsb2NraW5nCisgKi8KK3N0YXRpYyB2b2lkIGJsYW5rX3NjcmVlbl90KHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJYmxhbmtfdGltZXJfZXhwaXJlZCA9IDE7CisJc2NoZWR1bGVfd29yaygmY29uc29sZV93b3JrKTsKK30KKwordm9pZCBwb2tlX2JsYW5rZWRfY29uc29sZSh2b2lkKQoreworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJLyogQWRkIHRoaXMgc28gd2UgcXVpY2tseSBjYXRjaCB3aG9ldmVyIG1pZ2h0IGNhbGwgdXMgaW4gYSBub24KKwkgKiBzYWZlIGNvbnRleHQuIE5vd2FkYXlzLCB1bmJsYW5rX3NjcmVlbigpIGlzbid0IHRvIGJlIGNhbGxlZCBpbgorCSAqIGF0b21pYyBjb250ZXh0cyBhbmQgaXMgYWxsb3dlZCB0byBzY2hlZHVsZSAod2l0aCB0aGUgc3BlY2lhbCBjYXNlCisJICogb2Ygb29wc19pbl9wcm9ncmVzcywgYnV0IHRoYXQgaXNuJ3Qgb2YgYW55IGNvbmNlcm4gZm9yIHRoaXMKKwkgKiBmdW5jdGlvbi4gLS1CZW5ILgorCSAqLworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBUaGlzIGlzbid0IHBlcmZlY3RseSByYWNlIGZyZWUsIGJ1dCBhIHJhY2UgaGVyZSB3b3VsZCBiZSBtb3N0bHkgaGFybWxlc3MsCisJICogYXQgd29yc2UsIHdlJ2xsIGRvIGEgc3B1cnJpb3VzIGJsYW5rIGFuZCBpdCdzIHVubGlrZWx5CisJICovCisJZGVsX3RpbWVyKCZjb25zb2xlX3RpbWVyKTsKKwlibGFua190aW1lcl9leHBpcmVkID0gMDsKKworCWlmIChpZ25vcmVfcG9rZSB8fCAhdmNfY29uc1tmZ19jb25zb2xlXS5kIHx8IHZjX2NvbnNbZmdfY29uc29sZV0uZC0+dmNfbW9kZSA9PSBLRF9HUkFQSElDUykKKwkJcmV0dXJuOworCWlmIChjb25zb2xlX2JsYW5rZWQpCisJCXVuYmxhbmtfc2NyZWVuKCk7CisJZWxzZSBpZiAoYmxhbmtpbnRlcnZhbCkgeworCQltb2RfdGltZXIoJmNvbnNvbGVfdGltZXIsIGppZmZpZXMgKyBibGFua2ludGVydmFsKTsKKwkJYmxhbmtfc3RhdGUgPSBibGFua19ub3JtYWxfd2FpdDsKKwl9Cit9CisKKy8qCisgKglQYWxldHRlcworICovCisKK3N0YXRpYyB2b2lkIHNldF9wYWxldHRlKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmICh2Yy0+dmNfbW9kZSAhPSBLRF9HUkFQSElDUykKKwkJdmMtPnZjX3N3LT5jb25fc2V0X3BhbGV0dGUodmMsIGNvbG9yX3RhYmxlKTsKK30KKworc3RhdGljIGludCBzZXRfZ2V0X2NtYXAodW5zaWduZWQgY2hhciBfX3VzZXIgKmFyZywgaW50IHNldCkKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIFdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJaWYgKHNldCkgeworCSAgICBnZXRfdXNlcihkZWZhdWx0X3JlZFtpXSwgYXJnKyspOworCSAgICBnZXRfdXNlcihkZWZhdWx0X2dybltpXSwgYXJnKyspOworCSAgICBnZXRfdXNlcihkZWZhdWx0X2JsdVtpXSwgYXJnKyspOworCX0gZWxzZSB7CisJICAgIHB1dF91c2VyKGRlZmF1bHRfcmVkW2ldLCBhcmcrKyk7CisJICAgIHB1dF91c2VyKGRlZmF1bHRfZ3JuW2ldLCBhcmcrKyk7CisJICAgIHB1dF91c2VyKGRlZmF1bHRfYmx1W2ldLCBhcmcrKyk7CisJfQorICAgIGlmIChzZXQpIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspCisJICAgIGlmICh2Y19jb25zX2FsbG9jYXRlZChpKSkgeworCQlmb3IgKGogPSBrID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJICAgIHZjX2NvbnNbaV0uZC0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9yZWRbal07CisJCSAgICB2Y19jb25zW2ldLmQtPnZjX3BhbGV0dGVbaysrXSA9IGRlZmF1bHRfZ3JuW2pdOworCQkgICAgdmNfY29uc1tpXS5kLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X2JsdVtqXTsKKwkJfQorCQlzZXRfcGFsZXR0ZSh2Y19jb25zW2ldLmQpOworCSAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogTG9hZCBwYWxldHRlIGludG8gdGhlIERBQyByZWdpc3RlcnMuIGFyZyBwb2ludHMgdG8gYSBjb2xvdXIKKyAqIG1hcCwgMyBieXRlcyBwZXIgY29sb3VyLCAxNiBjb2xvdXJzLCByYW5nZSBmcm9tIDAgdG8gMjU1LgorICovCisKK2ludCBjb25fc2V0X2NtYXAodW5zaWduZWQgY2hhciBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmM7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJcmMgPSBzZXRfZ2V0X2NtYXAgKGFyZywxKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjb25fZ2V0X2NtYXAodW5zaWduZWQgY2hhciBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmM7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJcmMgPSBzZXRfZ2V0X2NtYXAgKGFyZywwKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgcmVzZXRfcGFsZXR0ZShzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaW50IGosIGs7CisJZm9yIChqPWs9MDsgajwxNjsgaisrKSB7CisJCXZjLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X3JlZFtqXTsKKwkJdmMtPnZjX3BhbGV0dGVbaysrXSA9IGRlZmF1bHRfZ3JuW2pdOworCQl2Yy0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9ibHVbal07CisJfQorCXNldF9wYWxldHRlKHZjKTsKK30KKworLyoKKyAqICBGb250IHN3aXRjaGluZworICoKKyAqICBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IGZvbnRzIHVwIHRvIDMyIHBpeGVscyB3aWRlLCBhdCBhIG1heGltdW0gaGVpZ2h0CisgKiAgb2YgMzIgcGl4ZWxzLiBVc2Vyc3BhY2UgZm9udGRhdGEgaXMgc3RvcmVkIHdpdGggMzIgYnl0ZXMgKHNob3J0cy9pbnRzLCAKKyAqICBkZXBlbmRpbmcgb24gd2lkdGgpIHJlc2VydmVkIGZvciBlYWNoIGNoYXJhY3RlciB3aGljaCBpcyBraW5kYSB3YXN0eSwgYnV0IAorICogIHRoaXMgaXMgZG9uZSBpbiBvcmRlciB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEVHQS9WR0EgZm9udHMuIEl0IAorICogIGlzIHVwdG8gdGhlIGFjdHVhbCBsb3ctbGV2ZWwgY29uc29sZS1kcml2ZXIgY29udmVydCBkYXRhIGludG8gaXRzIGZhdm9yaXRlCisgKiAgZm9ybWF0IChtYXliZSB3ZSBzaG91bGQgYWRkIGEgYGZvbnRvZmZzZXQnIGZpZWxkIHRvIHRoZSBgZGlzcGxheScKKyAqICBzdHJ1Y3R1cmUgc28gd2Ugd29uJ3QgaGF2ZSB0byBjb252ZXJ0IHRoZSBmb250ZGF0YSBhbGwgdGhlIHRpbWUuCisgKiAgL0plcworICovCisKKyNkZWZpbmUgbWF4X2ZvbnRfc2l6ZSA2NTUzNgorCitzdGF0aWMgaW50IGNvbl9mb250X2dldChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AgKm9wKQoreworCXN0cnVjdCBjb25zb2xlX2ZvbnQgZm9udDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCWludCBjOworCisJaWYgKHZjLT52Y19tb2RlICE9IEtEX1RFWFQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9wLT5kYXRhKSB7CisJCWZvbnQuZGF0YSA9IGttYWxsb2MobWF4X2ZvbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZm9udC5kYXRhKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlCisJCWZvbnQuZGF0YSA9IE5VTEw7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWYgKHZjLT52Y19zdy0+Y29uX2ZvbnRfZ2V0KQorCQlyYyA9IHZjLT52Y19zdy0+Y29uX2ZvbnRfZ2V0KHZjLCAmZm9udCk7CisJZWxzZQorCQlyYyA9IC1FTk9TWVM7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCWMgPSAoZm9udC53aWR0aCs3KS84ICogMzIgKiBmb250LmNoYXJjb3VudDsKKwkKKwlpZiAob3AtPmRhdGEgJiYgZm9udC5jaGFyY291bnQgPiBvcC0+Y2hhcmNvdW50KQorCQlyYyA9IC1FTk9TUEM7CisJaWYgKCEob3AtPmZsYWdzICYgS0RfRk9OVF9GTEFHX09MRCkpIHsKKwkJaWYgKGZvbnQud2lkdGggPiBvcC0+d2lkdGggfHwgZm9udC5oZWlnaHQgPiBvcC0+aGVpZ2h0KSAKKwkJCXJjID0gLUVOT1NQQzsKKwl9IGVsc2UgeworCQlpZiAoZm9udC53aWR0aCAhPSA4KQorCQkJcmMgPSAtRUlPOworCQllbHNlIGlmICgob3AtPmhlaWdodCAmJiBmb250LmhlaWdodCA+IG9wLT5oZWlnaHQpIHx8CisJCQkgZm9udC5oZWlnaHQgPiAzMikKKwkJCXJjID0gLUVOT1NQQzsKKwl9CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCW9wLT5oZWlnaHQgPSBmb250LmhlaWdodDsKKwlvcC0+d2lkdGggPSBmb250LndpZHRoOworCW9wLT5jaGFyY291bnQgPSBmb250LmNoYXJjb3VudDsKKworCWlmIChvcC0+ZGF0YSAmJiBjb3B5X3RvX3VzZXIob3AtPmRhdGEsIGZvbnQuZGF0YSwgYykpCisJCXJjID0gLUVGQVVMVDsKKworb3V0OgorCWtmcmVlKGZvbnQuZGF0YSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNvbl9mb250X3NldChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AgKm9wKQoreworCXN0cnVjdCBjb25zb2xlX2ZvbnQgZm9udDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCWludCBzaXplOworCisJaWYgKHZjLT52Y19tb2RlICE9IEtEX1RFWFQpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghb3AtPmRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChvcC0+Y2hhcmNvdW50ID4gNTEyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW9wLT5oZWlnaHQpIHsJCS8qIE5lZWQgdG8gZ3Vlc3MgZm9udCBoZWlnaHQgW2NvbXBhdF0gKi8KKwkJaW50IGgsIGk7CisJCXU4IF9fdXNlciAqY2hhcm1hcCA9IG9wLT5kYXRhOworCQl1OCB0bXA7CisJCQorCQkvKiBJZiBmcm9tIEtERk9OVE9QIGlvY3RsLCBkb24ndCBhbGxvdyB0aGluZ3Mgd2hpY2ggY2FuIGJlIGRvbmUgaW4gdXNlcmxhbmQsCisJCSAgIHNvIHRoYXQgd2UgY2FuIGdldCByaWQgb2YgdGhpcyBzb29uICovCisJCWlmICghKG9wLT5mbGFncyAmIEtEX0ZPTlRfRkxBR19PTEQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZvciAoaCA9IDMyOyBoID4gMDsgaC0tKQorCQkJZm9yIChpID0gMDsgaSA8IG9wLT5jaGFyY291bnQ7IGkrKykgeworCQkJCWlmIChnZXRfdXNlcih0bXAsICZjaGFybWFwWzMyKmkraC0xXSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmICh0bXApCisJCQkJCWdvdG8gbm9uemVybzsKKwkJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJbm9uemVybzoKKwkJb3AtPmhlaWdodCA9IGg7CisJfQorCWlmIChvcC0+d2lkdGggPD0gMCB8fCBvcC0+d2lkdGggPiAzMiB8fCBvcC0+aGVpZ2h0ID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCXNpemUgPSAob3AtPndpZHRoKzcpLzggKiAzMiAqIG9wLT5jaGFyY291bnQ7CisJaWYgKHNpemUgPiBtYXhfZm9udF9zaXplKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlmb250LmNoYXJjb3VudCA9IG9wLT5jaGFyY291bnQ7CisJZm9udC5oZWlnaHQgPSBvcC0+aGVpZ2h0OworCWZvbnQud2lkdGggPSBvcC0+d2lkdGg7CisJZm9udC5kYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZvbnQuZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKGZvbnQuZGF0YSwgb3AtPmRhdGEsIHNpemUpKSB7CisJCWtmcmVlKGZvbnQuZGF0YSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWYgKHZjLT52Y19zdy0+Y29uX2ZvbnRfc2V0KQorCQlyYyA9IHZjLT52Y19zdy0+Y29uX2ZvbnRfc2V0KHZjLCAmZm9udCwgb3AtPmZsYWdzKTsKKwllbHNlCisJCXJjID0gLUVOT1NZUzsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJa2ZyZWUoZm9udC5kYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY29uX2ZvbnRfZGVmYXVsdChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AgKm9wKQoreworCXN0cnVjdCBjb25zb2xlX2ZvbnQgZm9udCA9IHsud2lkdGggPSBvcC0+d2lkdGgsIC5oZWlnaHQgPSBvcC0+aGVpZ2h0fTsKKwljaGFyIG5hbWVbTUFYX0ZPTlRfTkFNRV07CisJY2hhciAqcyA9IG5hbWU7CisJaW50IHJjOworCisJaWYgKHZjLT52Y19tb2RlICE9IEtEX1RFWFQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFvcC0+ZGF0YSkKKwkJcyA9IE5VTEw7CisJZWxzZSBpZiAoc3RybmNweV9mcm9tX3VzZXIobmFtZSwgb3AtPmRhdGEsIE1BWF9GT05UX05BTUUgLSAxKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCWVsc2UKKwkJbmFtZVtNQVhfRk9OVF9OQU1FIC0gMV0gPSAwOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlmICh2Yy0+dmNfc3ctPmNvbl9mb250X2RlZmF1bHQpCisJCXJjID0gdmMtPnZjX3N3LT5jb25fZm9udF9kZWZhdWx0KHZjLCAmZm9udCwgcyk7CisJZWxzZQorCQlyYyA9IC1FTk9TWVM7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCWlmICghcmMpIHsKKwkJb3AtPndpZHRoID0gZm9udC53aWR0aDsKKwkJb3AtPmhlaWdodCA9IGZvbnQuaGVpZ2h0OworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY29uX2ZvbnRfY29weShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AgKm9wKQoreworCWludCBjb24gPSBvcC0+aGVpZ2h0OworCWludCByYzsKKworCWlmICh2Yy0+dmNfbW9kZSAhPSBLRF9URVhUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZiAoIXZjLT52Y19zdy0+Y29uX2ZvbnRfY29weSkKKwkJcmMgPSAtRU5PU1lTOworCWVsc2UgaWYgKGNvbiA8IDAgfHwgIXZjX2NvbnNfYWxsb2NhdGVkKGNvbikpCisJCXJjID0gLUVOT1RUWTsKKwllbHNlIGlmIChjb24gPT0gdmMtPnZjX251bSkJLyogbm90aGluZyB0byBkbyAqLworCQlyYyA9IDA7CisJZWxzZQorCQlyYyA9IHZjLT52Y19zdy0+Y29uX2ZvbnRfY29weSh2YywgY29uKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY29uX2ZvbnRfb3Aoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgY29uc29sZV9mb250X29wICpvcCkKK3sKKwlzd2l0Y2ggKG9wLT5vcCkgeworCWNhc2UgS0RfRk9OVF9PUF9TRVQ6CisJCXJldHVybiBjb25fZm9udF9zZXQodmMsIG9wKTsKKwljYXNlIEtEX0ZPTlRfT1BfR0VUOgorCQlyZXR1cm4gY29uX2ZvbnRfZ2V0KHZjLCBvcCk7CisJY2FzZSBLRF9GT05UX09QX1NFVF9ERUZBVUxUOgorCQlyZXR1cm4gY29uX2ZvbnRfZGVmYXVsdCh2Yywgb3ApOworCWNhc2UgS0RfRk9OVF9PUF9DT1BZOgorCQlyZXR1cm4gY29uX2ZvbnRfY29weSh2Yywgb3ApOworCX0KKwlyZXR1cm4gLUVOT1NZUzsKK30KKworLyoKKyAqCUludGVyZmFjZSBleHBvcnRlZCB0byBzZWxlY3Rpb24gYW5kIHZjcy4KKyAqLworCisvKiB1c2VkIGJ5IHNlbGVjdGlvbiAqLwordTE2IHNjcmVlbl9nbHlwaChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBvZmZzZXQpCit7CisJdTE2IHcgPSBzY3JfcmVhZHcoc2NyZWVucG9zKHZjLCBvZmZzZXQsIDEpKTsKKwl1MTYgYyA9IHcgJiAweGZmOworCisJaWYgKHcgJiB2Yy0+dmNfaGlfZm9udF9tYXNrKQorCQljIHw9IDB4MTAwOworCXJldHVybiBjOworfQorCisvKiB1c2VkIGJ5IHZjcyAtIG5vdGUgdGhlIHdvcmQgb2Zmc2V0ICovCit1bnNpZ25lZCBzaG9ydCAqc2NyZWVuX3BvcyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCB3X29mZnNldCwgaW50IHZpZXdlZCkKK3sKKwlyZXR1cm4gc2NyZWVucG9zKHZjLCAyICogd19vZmZzZXQsIHZpZXdlZCk7Cit9CisKK3ZvaWQgZ2V0Y29uc3h5KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciAqcCkKK3sKKwlwWzBdID0gdmMtPnZjX3g7CisJcFsxXSA9IHZjLT52Y195OworfQorCit2b2lkIHB1dGNvbnN4eShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgKnApCit7CisJZ290b3h5KHZjLCBwWzBdLCBwWzFdKTsKKwlzZXRfY3Vyc29yKHZjKTsKK30KKwordTE2IHZjc19zY3JfcmVhZHcoc3RydWN0IHZjX2RhdGEgKnZjLCBjb25zdCB1MTYgKm9yZykKK3sKKwlpZiAoKHVuc2lnbmVkIGxvbmcpb3JnID09IHZjLT52Y19wb3MgJiYgc29mdGN1cnNvcl9vcmlnaW5hbCAhPSAtMSkKKwkJcmV0dXJuIHNvZnRjdXJzb3Jfb3JpZ2luYWw7CisJcmV0dXJuIHNjcl9yZWFkdyhvcmcpOworfQorCit2b2lkIHZjc19zY3Jfd3JpdGV3KHN0cnVjdCB2Y19kYXRhICp2YywgdTE2IHZhbCwgdTE2ICpvcmcpCit7CisJc2NyX3dyaXRldyh2YWwsIG9yZyk7CisJaWYgKCh1bnNpZ25lZCBsb25nKW9yZyA9PSB2Yy0+dmNfcG9zKSB7CisJCXNvZnRjdXJzb3Jfb3JpZ2luYWwgPSAtMTsKKwkJYWRkX3NvZnRjdXJzb3IodmMpOworCX0KK30KKworLyoKKyAqCVZpc2libGUgc3ltYm9scyBmb3IgbW9kdWxlcworICovCisKK0VYUE9SVF9TWU1CT0woY29sb3JfdGFibGUpOworRVhQT1JUX1NZTUJPTChkZWZhdWx0X3JlZCk7CitFWFBPUlRfU1lNQk9MKGRlZmF1bHRfZ3JuKTsKK0VYUE9SVF9TWU1CT0woZGVmYXVsdF9ibHUpOworRVhQT1JUX1NZTUJPTCh1cGRhdGVfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0wocmVkcmF3X3NjcmVlbik7CitFWFBPUlRfU1lNQk9MKHZjX3Jlc2l6ZSk7CitFWFBPUlRfU1lNQk9MKGZnX2NvbnNvbGUpOworRVhQT1JUX1NZTUJPTChjb25zb2xlX2JsYW5rX2hvb2spOworRVhQT1JUX1NZTUJPTChjb25zb2xlX2JsYW5rZWQpOworRVhQT1JUX1NZTUJPTCh2Y19jb25zKTsKKyNpZm5kZWYgVlRfU0lOR0xFX0RSSVZFUgorRVhQT1JUX1NZTUJPTCh0YWtlX292ZXJfY29uc29sZSk7CitFWFBPUlRfU1lNQk9MKGdpdmVfdXBfY29uc29sZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzODZmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCkBAIC0wLDAgKzEsMTIwMSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2NoYXIvdnRfaW9jdGwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgb2J6IHVuZGVyIHRoZSBsaW51eCBjb3B5cmlnaHQKKyAqCisgKiAgRHluYW1pYyBkaWFjcml0aWNhbCBoYW5kbGluZyAtIGFlYkBjd2kubmwgLSBEZWMgMTk5MworICogIER5bmFtaWMga2V5bWFwIGFuZCBzdHJpbmcgYWxsb2NhdGlvbiAtIGFlYkBjd2kubmwgLSBNYXkgMTk5NAorICogIFJlc3RyaWN0IFZUIHN3aXRjaGluZyB2aWEgaW9jdGwoKSAtIGdyaWZAY3MudWNyLmVkdSAtIERlYyAxOTk1CisgKiAgU29tZSBjb2RlIG1vdmVkIGZvciBsZXNzIGNvZGUgZHVwbGljYXRpb24gLSBBbmRpIEtsZWVuIC0gTWFyIDE5OTcKKyAqICBDaGVjayBwdXQvZ2V0X3VzZXIsIGNsZWFudXBzIC0gYWNtZUBjb25lY3RpdmEuY29tLmJyIC0gSnVuIDIwMDEKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2RpYWNyLmg+CisjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CisKK3N0YXRpYyBjaGFyIHZ0X2RvbnRfc3dpdGNoOworZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICpjb25zb2xlX2RyaXZlcjsKKworI2RlZmluZSBWVF9JU19JTl9VU0UoaSkJKGNvbnNvbGVfZHJpdmVyLT50dHlzW2ldICYmIGNvbnNvbGVfZHJpdmVyLT50dHlzW2ldLT5jb3VudCkKKyNkZWZpbmUgVlRfQlVTWShpKQkoVlRfSVNfSU5fVVNFKGkpIHx8IGkgPT0gZmdfY29uc29sZSB8fCB2Y19jb25zW2ldLmQgPT0gc2VsX2NvbnMpCisKKy8qCisgKiBDb25zb2xlICh2dCBhbmQga2QpIHJvdXRpbmVzLCBhcyBkZWZpbmVkIGJ5IFVTTCBTVlI0IG1hbnVhbCwgYW5kIGJ5CisgKiBleHBlcmltZW50YXRpb24gYW5kIHN0dWR5IG9mIFgzODYgU1lTViBoYW5kbGluZy4KKyAqCisgKiBPbmUgcG9pbnQgb2YgZGlmZmVyZW5jZTogU1lTViB2dCdzIGFyZSAvZGV2L3Z0WCwgd2hpY2ggWCA+PSAwLCBhbmQKKyAqIC9kZXYvY29uc29sZSBpcyBhIHNlcGFyYXRlIHR0eXAuIFVuZGVyIExpbnV4LCAvZGV2L3R0eTAgaXMgL2Rldi9jb25zb2xlLAorICogYW5kIHRoZSB2YyBzdGFydCBhdCAvZGV2L3R0eVgsIFggPj0gMS4gV2UgbWFpbnRhaW4gdGhhdCBoZXJlLCBzbyB3ZSB3aWxsCisgKiBhbHdheXMgdHJlYXQgb3VyIHNldCBvZiB2dCBhcyBudW1iZXJlZCAxLi5NQVhfTlJfQ09OU09MRVMgKGNvcnJlc3BvbmRpbmcgdG8KKyAqIHR0eXMgMC4uTUFYX05SX0NPTlNPTEVTLTEpLiBFeHBsaWNpdGx5IG5hbWluZyBWVCAwIGlzIGlsbGVnYWwsIGJ1dCB1c2luZworICogL2Rldi90dHkwIChmZ19jb25zb2xlKSBhcyBhIHRhcmdldCBpcyBsZWdhbCwgc2luY2UgYW4gaW1wbGljaXQgYWxpYXNpbmcKKyAqIHRvIHRoZSBjdXJyZW50IGNvbnNvbGUgaXMgZG9uZSBieSB0aGUgbWFpbiBpb2N0bCBjb2RlLgorICovCisKKyNpZmRlZiBDT05GSUdfWDg2CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9jaGFuZ2VfY29uc29sZShzdHJ1Y3QgdmNfZGF0YSAqdmMpOworCisvKgorICogdGhlc2UgYXJlIHRoZSB2YWxpZCBpL28gcG9ydHMgd2UncmUgYWxsb3dlZCB0byBjaGFuZ2UuIHRoZXkgbWFwIGFsbCB0aGUKKyAqIHZpZGVvIHBvcnRzCisgKi8KKyNkZWZpbmUgR1BGSVJTVCAweDNiNAorI2RlZmluZSBHUExBU1QgMHgzZGYKKyNkZWZpbmUgR1BOVU0gKEdQTEFTVCAtIEdQRklSU1QgKyAxKQorCisjZGVmaW5lIGkgKHRtcC5rYl9pbmRleCkKKyNkZWZpbmUgcyAodG1wLmtiX3RhYmxlKQorI2RlZmluZSB2ICh0bXAua2JfdmFsdWUpCitzdGF0aWMgaW5saW5lIGludAorZG9fa2Rza19pb2N0bChpbnQgY21kLCBzdHJ1Y3Qga2JlbnRyeSBfX3VzZXIgKnVzZXJfa2JlLCBpbnQgcGVybSwgc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCkKK3sKKwlzdHJ1Y3Qga2JlbnRyeSB0bXA7CisJdXNob3J0ICprZXlfbWFwLCB2YWwsIG92OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXJfa2JlLCBzaXplb2Yoc3RydWN0IGtiZW50cnkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgS0RHS0JFTlQ6CisJCWtleV9tYXAgPSBrZXlfbWFwc1tzXTsKKwkJaWYgKGtleV9tYXApIHsKKwkJICAgIHZhbCA9IFUoa2V5X21hcFtpXSk7CisJCSAgICBpZiAoa2JkLT5rYmRtb2RlICE9IFZDX1VOSUNPREUgJiYgS1RZUCh2YWwpID49IE5SX1RZUEVTKQorCQkJdmFsID0gS19IT0xFOworCQl9IGVsc2UKKwkJICAgIHZhbCA9IChpID8gS19IT0xFIDogS19OT1NVQ0hNQVApOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAmdXNlcl9rYmUtPmtiX3ZhbHVlKTsKKwljYXNlIEtEU0tCRU5UOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoIWkgJiYgdiA9PSBLX05PU1VDSE1BUCkgeworCQkJLyogZGlzYWxsb2NhdGUgbWFwICovCisJCQlrZXlfbWFwID0ga2V5X21hcHNbc107CisJCQlpZiAocyAmJiBrZXlfbWFwKSB7CisJCQkgICAga2V5X21hcHNbc10gPSBOVUxMOworCQkJICAgIGlmIChrZXlfbWFwWzBdID09IFUoS19BTExPQ0FURUQpKSB7CisJCQkJCWtmcmVlKGtleV9tYXApOworCQkJCQlrZXltYXBfY291bnQtLTsKKwkJCSAgICB9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmIChLVFlQKHYpIDwgTlJfVFlQRVMpIHsKKwkJICAgIGlmIChLVkFMKHYpID4gbWF4X3ZhbHNbS1RZUCh2KV0pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZQorCQkgICAgaWYgKGtiZC0+a2JkbW9kZSAhPSBWQ19VTklDT0RFKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCS8qICsrR2VlcnQ6IG5vbi1QQyBrZXlib2FyZHMgbWF5IGdlbmVyYXRlIGtleWNvZGUgemVybyAqLworI2lmICFkZWZpbmVkKF9fbWM2ODAwMF9fKSAmJiAhZGVmaW5lZChfX3Bvd2VycGNfXykKKwkJLyogYXNzaWdubWVudCB0byBlbnRyeSAwIG9ubHkgdGVzdHMgdmFsaWRpdHkgb2YgYXJncyAqLworCQlpZiAoIWkpCisJCQlicmVhazsKKyNlbmRpZgorCisJCWlmICghKGtleV9tYXAgPSBrZXlfbWFwc1tzXSkpIHsKKwkJCWludCBqOworCisJCQlpZiAoa2V5bWFwX2NvdW50ID49IE1BWF9OUl9PRl9VU0VSX0tFWU1BUFMgJiYKKwkJCSAgICAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQlrZXlfbWFwID0gKHVzaG9ydCAqKSBrbWFsbG9jKHNpemVvZihwbGFpbl9tYXApLAorCQkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICgha2V5X21hcCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWtleV9tYXBzW3NdID0ga2V5X21hcDsKKwkJCWtleV9tYXBbMF0gPSBVKEtfQUxMT0NBVEVEKTsKKwkJCWZvciAoaiA9IDE7IGogPCBOUl9LRVlTOyBqKyspCisJCQkJa2V5X21hcFtqXSA9IFUoS19IT0xFKTsKKwkJCWtleW1hcF9jb3VudCsrOworCQl9CisJCW92ID0gVShrZXlfbWFwW2ldKTsKKwkJaWYgKHYgPT0gb3YpCisJCQlicmVhazsJLyogbm90aGluZyB0byBkbyAqLworCQkvKgorCQkgKiBBdHRlbnRpb24gS2V5LgorCQkgKi8KKwkJaWYgKCgob3YgPT0gS19TQUspIHx8ICh2ID09IEtfU0FLKSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlrZXlfbWFwW2ldID0gVSh2KTsKKwkJaWYgKCFzICYmIChLVFlQKG92KSA9PSBLVF9TSElGVCB8fCBLVFlQKHYpID09IEtUX1NISUZUKSkKKwkJCWNvbXB1dGVfc2hpZnRzdGF0ZSgpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisjdW5kZWYgaQorI3VuZGVmIHMKKyN1bmRlZiB2CisKK3N0YXRpYyBpbmxpbmUgaW50IAorZG9fa2JrZXljb2RlX2lvY3RsKGludCBjbWQsIHN0cnVjdCBrYmtleWNvZGUgX191c2VyICp1c2VyX2tia2MsIGludCBwZXJtKQoreworCXN0cnVjdCBrYmtleWNvZGUgdG1wOworCWludCBrYyA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlcl9rYmtjLCBzaXplb2Yoc3RydWN0IGtia2V5Y29kZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgS0RHRVRLRVlDT0RFOgorCQlrYyA9IGdldGtleWNvZGUodG1wLnNjYW5jb2RlKTsKKwkJaWYgKGtjID49IDApCisJCQlrYyA9IHB1dF91c2VyKGtjLCAmdXNlcl9rYmtjLT5rZXljb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBLRFNFVEtFWUNPREU6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWtjID0gc2V0a2V5Y29kZSh0bXAuc2NhbmNvZGUsIHRtcC5rZXljb2RlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBrYzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RvX2tkZ2tiX2lvY3RsKGludCBjbWQsIHN0cnVjdCBrYnNlbnRyeSBfX3VzZXIgKnVzZXJfa2Rna2IsIGludCBwZXJtKQoreworCXN0cnVjdCBrYnNlbnRyeSAqa2JzOworCWNoYXIgKnA7CisJdV9jaGFyICpxOworCXVfY2hhciBfX3VzZXIgKnVwOworCWludCBzejsKKwlpbnQgZGVsdGE7CisJY2hhciAqZmlyc3RfZnJlZSwgKmZqLCAqZm53OworCWludCBpLCBqLCBrOworCWludCByZXQ7CisKKwlrYnMgPSBrbWFsbG9jKHNpemVvZigqa2JzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byByZXRlcnI7CisJfQorCisJLyogd2UgbW9zdGx5IGNvcHkgdG9vIG11Y2ggaGVyZSAoNTEyYnl0ZXMpLCBidXQgd2hvIGNhcmVzIDspICovCisJaWYgKGNvcHlfZnJvbV91c2VyKGticywgdXNlcl9rZGdrYiwgc2l6ZW9mKHN0cnVjdCBrYnNlbnRyeSkpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gcmV0ZXJyOworCX0KKwlrYnMtPmtiX3N0cmluZ1tzaXplb2Yoa2JzLT5rYl9zdHJpbmcpLTFdID0gJ1wwJzsKKwlpID0ga2JzLT5rYl9mdW5jOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEtER0tCU0VOVDoKKwkJc3ogPSBzaXplb2Yoa2JzLT5rYl9zdHJpbmcpIC0gMTsgLyogc3ogc2hvdWxkIGhhdmUgYmVlbgorCQkJCQkJICBhIHN0cnVjdCBtZW1iZXIgKi8KKwkJdXAgPSB1c2VyX2tkZ2tiLT5rYl9zdHJpbmc7CisJCXAgPSBmdW5jX3RhYmxlW2ldOworCQlpZihwKQorCQkJZm9yICggOyAqcCAmJiBzejsgcCsrLCBzei0tKQorCQkJCWlmIChwdXRfdXNlcigqcCwgdXArKykpIHsKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJZ290byByZXRlcnI7CisJCQkJfQorCQlpZiAocHV0X3VzZXIoJ1wwJywgdXApKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byByZXRlcnI7CisJCX0KKwkJa2ZyZWUoa2JzKTsKKwkJcmV0dXJuICgocCAmJiAqcCkgPyAtRU9WRVJGTE9XIDogMCk7CisJY2FzZSBLRFNLQlNFTlQ6CisJCWlmICghcGVybSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byByZXRlcnI7CisJCX0KKworCQlxID0gZnVuY190YWJsZVtpXTsKKwkJZmlyc3RfZnJlZSA9IGZ1bmNidWZwdHIgKyAoZnVuY2J1ZnNpemUgLSBmdW5jYnVmbGVmdCk7CisJCWZvciAoaiA9IGkrMTsgaiA8IE1BWF9OUl9GVU5DICYmICFmdW5jX3RhYmxlW2pdOyBqKyspIAorCQkJOworCQlpZiAoaiA8IE1BWF9OUl9GVU5DKQorCQkJZmogPSBmdW5jX3RhYmxlW2pdOworCQllbHNlCisJCQlmaiA9IGZpcnN0X2ZyZWU7CisKKwkJZGVsdGEgPSAocSA/IC1zdHJsZW4ocSkgOiAxKSArIHN0cmxlbihrYnMtPmtiX3N0cmluZyk7CisJCWlmIChkZWx0YSA8PSBmdW5jYnVmbGVmdCkgeyAJLyogaXQgZml0cyBpbiBjdXJyZW50IGJ1ZiAqLworCQkgICAgaWYgKGogPCBNQVhfTlJfRlVOQykgeworCQkJbWVtbW92ZShmaiArIGRlbHRhLCBmaiwgZmlyc3RfZnJlZSAtIGZqKTsKKwkJCWZvciAoayA9IGo7IGsgPCBNQVhfTlJfRlVOQzsgaysrKQorCQkJICAgIGlmIChmdW5jX3RhYmxlW2tdKQorCQkJCWZ1bmNfdGFibGVba10gKz0gZGVsdGE7CisJCSAgICB9CisJCSAgICBpZiAoIXEpCisJCSAgICAgIGZ1bmNfdGFibGVbaV0gPSBmajsKKwkJICAgIGZ1bmNidWZsZWZ0IC09IGRlbHRhOworCQl9IGVsc2UgewkJCS8qIGFsbG9jYXRlIGEgbGFyZ2VyIGJ1ZmZlciAqLworCQkgICAgc3ogPSAyNTY7CisJCSAgICB3aGlsZSAoc3ogPCBmdW5jYnVmc2l6ZSAtIGZ1bmNidWZsZWZ0ICsgZGVsdGEpCisJCSAgICAgIHN6IDw8PSAxOworCQkgICAgZm53ID0gKGNoYXIgKikga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCSAgICBpZighZm53KSB7CisJCSAgICAgIHJldCA9IC1FTk9NRU07CisJCSAgICAgIGdvdG8gcmV0ZXJyOworCQkgICAgfQorCisJCSAgICBpZiAoIXEpCisJCSAgICAgIGZ1bmNfdGFibGVbaV0gPSBmajsKKwkJICAgIGlmIChmaiA+IGZ1bmNidWZwdHIpCisJCQltZW1tb3ZlKGZudywgZnVuY2J1ZnB0ciwgZmogLSBmdW5jYnVmcHRyKTsKKwkJICAgIGZvciAoayA9IDA7IGsgPCBqOyBrKyspCisJCSAgICAgIGlmIChmdW5jX3RhYmxlW2tdKQorCQkJZnVuY190YWJsZVtrXSA9IGZudyArIChmdW5jX3RhYmxlW2tdIC0gZnVuY2J1ZnB0cik7CisKKwkJICAgIGlmIChmaXJzdF9mcmVlID4gZmopIHsKKwkJCW1lbW1vdmUoZm53ICsgKGZqIC0gZnVuY2J1ZnB0cikgKyBkZWx0YSwgZmosIGZpcnN0X2ZyZWUgLSBmaik7CisJCQlmb3IgKGsgPSBqOyBrIDwgTUFYX05SX0ZVTkM7IGsrKykKKwkJCSAgaWYgKGZ1bmNfdGFibGVba10pCisJCQkgICAgZnVuY190YWJsZVtrXSA9IGZudyArIChmdW5jX3RhYmxlW2tdIC0gZnVuY2J1ZnB0cikgKyBkZWx0YTsKKwkJICAgIH0KKwkJICAgIGlmIChmdW5jYnVmcHRyICE9IGZ1bmNfYnVmKQorCQkgICAgICBrZnJlZShmdW5jYnVmcHRyKTsKKwkJICAgIGZ1bmNidWZwdHIgPSBmbnc7CisJCSAgICBmdW5jYnVmbGVmdCA9IGZ1bmNidWZsZWZ0IC0gZGVsdGEgKyBzeiAtIGZ1bmNidWZzaXplOworCQkgICAgZnVuY2J1ZnNpemUgPSBzejsKKwkJfQorCQlzdHJjcHkoZnVuY190YWJsZVtpXSwga2JzLT5rYl9zdHJpbmcpOworCQlicmVhazsKKwl9CisJcmV0ID0gMDsKK3JldGVycjoKKwlrZnJlZShrYnMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IAorZG9fZm9udHhfaW9jdGwoaW50IGNtZCwgc3RydWN0IGNvbnNvbGVmb250ZGVzYyBfX3VzZXIgKnVzZXJfY2ZkLCBpbnQgcGVybSwgc3RydWN0IGNvbnNvbGVfZm9udF9vcCAqb3ApCit7CisJc3RydWN0IGNvbnNvbGVmb250ZGVzYyBjZmRhcmc7CisJaW50IGk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNmZGFyZywgdXNlcl9jZmQsIHNpemVvZihzdHJ1Y3QgY29uc29sZWZvbnRkZXNjKSkpIAorCQlyZXR1cm4gLUVGQVVMVDsKKyAJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBJT19GT05UWDoKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJb3AtPm9wID0gS0RfRk9OVF9PUF9TRVQ7CisJCW9wLT5mbGFncyA9IEtEX0ZPTlRfRkxBR19PTEQ7CisJCW9wLT53aWR0aCA9IDg7CisJCW9wLT5oZWlnaHQgPSBjZmRhcmcuY2hhcmhlaWdodDsKKwkJb3AtPmNoYXJjb3VudCA9IGNmZGFyZy5jaGFyY291bnQ7CisJCW9wLT5kYXRhID0gY2ZkYXJnLmNoYXJkYXRhOworCQlyZXR1cm4gY29uX2ZvbnRfb3AodmNfY29uc1tmZ19jb25zb2xlXS5kLCBvcCk7CisJY2FzZSBHSU9fRk9OVFg6IHsKKwkJb3AtPm9wID0gS0RfRk9OVF9PUF9HRVQ7CisJCW9wLT5mbGFncyA9IEtEX0ZPTlRfRkxBR19PTEQ7CisJCW9wLT53aWR0aCA9IDg7CisJCW9wLT5oZWlnaHQgPSBjZmRhcmcuY2hhcmhlaWdodDsKKwkJb3AtPmNoYXJjb3VudCA9IGNmZGFyZy5jaGFyY291bnQ7CisJCW9wLT5kYXRhID0gY2ZkYXJnLmNoYXJkYXRhOworCQlpID0gY29uX2ZvbnRfb3AodmNfY29uc1tmZ19jb25zb2xlXS5kLCBvcCk7CisJCWlmIChpKQorCQkJcmV0dXJuIGk7CisJCWNmZGFyZy5jaGFyaGVpZ2h0ID0gb3AtPmhlaWdodDsKKwkJY2ZkYXJnLmNoYXJjb3VudCA9IG9wLT5jaGFyY291bnQ7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9jZmQsICZjZmRhcmcsIHNpemVvZihzdHJ1Y3QgY29uc29sZWZvbnRkZXNjKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IAorZG9fdW5pbWFwX2lvY3RsKGludCBjbWQsIHN0cnVjdCB1bmltYXBkZXNjIF9fdXNlciAqdXNlcl91ZCwgaW50IHBlcm0sIHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlzdHJ1Y3QgdW5pbWFwZGVzYyB0bXA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlcl91ZCwgc2l6ZW9mIHRtcCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh0bXAuZW50cmllcykKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bXAuZW50cmllcywKKwkJCQl0bXAuZW50cnlfY3Qqc2l6ZW9mKHN0cnVjdCB1bmlwYWlyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUElPX1VOSU1BUDoKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIGNvbl9zZXRfdW5pbWFwKHZjLCB0bXAuZW50cnlfY3QsIHRtcC5lbnRyaWVzKTsKKwljYXNlIEdJT19VTklNQVA6CisJCWlmICghcGVybSAmJiBmZ19jb25zb2xlICE9IHZjLT52Y19udW0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gY29uX2dldF91bmltYXAodmMsIHRtcC5lbnRyeV9jdCwgJih1c2VyX3VkLT5lbnRyeV9jdCksIHRtcC5lbnRyaWVzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBoYW5kbGUgdGhlIGNvbnNvbGUtc3BlY2lmaWMgaW9jdGwncyBoZXJlLiAgV2UgYWxsb3cgdGhlCisgKiBjYXBhYmlsaXR5IHRvIG1vZGlmeSBhbnkgY29uc29sZSwgbm90IGp1c3QgdGhlIGZnX2NvbnNvbGUuIAorICovCitpbnQgdnRfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gKHN0cnVjdCB2Y19kYXRhICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgY29uc29sZV9mb250X29wIG9wOwkvKiB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBoZXJlICovCisJc3RydWN0IGtiZF9zdHJ1Y3QgKiBrYmQ7CisJdW5zaWduZWQgaW50IGNvbnNvbGU7CisJdW5zaWduZWQgY2hhciB1Y3ZhbDsKKwl2b2lkIF9fdXNlciAqdXAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGksIHBlcm07CisJCisJY29uc29sZSA9IHZjLT52Y19udW07CisKKwlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKGNvbnNvbGUpKSAJLyogaW1wb3NzaWJsZT8gKi8KKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCS8qCisJICogVG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBkbyBtb3N0IG9mIHRoZSB2dCBpb2N0bHMsIHdlIGVpdGhlciBoYXZlCisJICogdG8gYmUgdGhlIG93bmVyIG9mIHRoZSB0dHksIG9yIGhhdmUgQ0FQX1NZU19UVFlfQ09ORklHLgorCSAqLworCXBlcm0gPSAwOworCWlmIChjdXJyZW50LT5zaWduYWwtPnR0eSA9PSB0dHkgfHwgY2FwYWJsZShDQVBfU1lTX1RUWV9DT05GSUcpKQorCQlwZXJtID0gMTsKKyAKKwlrYmQgPSBrYmRfdGFibGUgKyBjb25zb2xlOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBLSU9DU09VTkQ6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChhcmcpCisJCQlhcmcgPSAxMTkzMTgyIC8gYXJnOworCQlrZF9ta3NvdW5kKGFyZywgMCk7CisJCXJldHVybiAwOworCisJY2FzZSBLRE1LVE9ORToKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl7CisJCXVuc2lnbmVkIGludCB0aWNrcywgY291bnQ7CisJCQorCQkvKgorCQkgKiBHZW5lcmF0ZSB0aGUgdG9uZSBmb3IgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiB0aWNrcy4KKwkJICogSWYgdGhlIHRpbWUgaXMgemVybywgdHVybiBvZmYgc291bmQgb3Vyc2VsdmVzLgorCQkgKi8KKwkJdGlja3MgPSBIWiAqICgoYXJnID4+IDE2KSAmIDB4ZmZmZikgLyAxMDAwOworCQljb3VudCA9IHRpY2tzID8gKGFyZyAmIDB4ZmZmZikgOiAwOworCQlpZiAoY291bnQpCisJCQljb3VudCA9IDExOTMxODIgLyBjb3VudDsKKwkJa2RfbWtzb3VuZChjb3VudCwgdGlja3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIEtER0tCVFlQRToKKwkJLyoKKwkJICogdGhpcyBpcyBuYWl2ZS4KKwkJICovCisJCXVjdmFsID0gS0JfMTAxOworCQlnb3RvIHNldGNoYXI7CisKKwkJLyoKKwkJICogVGhlc2UgY2Fubm90IGJlIGltcGxlbWVudGVkIG9uIGFueSBtYWNoaW5lIHRoYXQgaW1wbGVtZW50cworCQkgKiBpb3Blcm0oKSBpbiB1c2VyIGxldmVsIChzdWNoIGFzIEFscGhhIFBDcykgb3Igbm90IGF0IGFsbC4KKwkJICoKKwkJICogWFhYOiB5b3Ugc2hvdWxkIG5ldmVyIHVzZSB0aGVzZSwganVzdCBjYWxsIGlvcGVybSBkaXJlY3RseS4uCisJCSAqLworI2lmZGVmIENPTkZJR19YODYKKwljYXNlIEtEQURESU86CisJY2FzZSBLRERFTElPOgorCQkvKgorCQkgKiBLREFERElPIGFuZCBLRERFTElPIG1heSBiZSBhYmxlIHRvIGFkZCBwb3J0cyBiZXlvbmQgd2hhdAorCQkgKiB3ZSByZWplY3QgaGVyZSwgYnV0IHRvIGJlIHNhZmUuLi4KKwkJICovCisJCWlmIChhcmcgPCBHUEZJUlNUIHx8IGFyZyA+IEdQTEFTVCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gc3lzX2lvcGVybShhcmcsIDEsIChjbWQgPT0gS0RBRERJTykpID8gLUVOWElPIDogMDsKKworCWNhc2UgS0RFTkFCSU86CisJY2FzZSBLRERJU0FCSU86CisJCXJldHVybiBzeXNfaW9wZXJtKEdQRklSU1QsIEdQTlVNLAorCQkJCSAgKGNtZCA9PSBLREVOQUJJTykpID8gLUVOWElPIDogMDsKKyNlbmRpZgorCisJLyogTGludXggbTY4ay9pMzg2IGludGVyZmFjZSBmb3Igc2V0dGluZyB0aGUga2V5Ym9hcmQgZGVsYXkvcmVwZWF0IHJhdGUgKi8KKwkJCisJY2FzZSBLREtCRFJFUDoKKwl7CisJCXN0cnVjdCBrYmRfcmVwZWF0IGticmVwOworCQlpbnQgZXJyOworCQkKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVFRZX0NPTkZJRykpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigma2JyZXAsIHVwLCBzaXplb2Yoc3RydWN0IGtiZF9yZXBlYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPSBrYmRfcmF0ZSgma2JyZXApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGNvcHlfdG9fdXNlcih1cCwgJmticmVwLCBzaXplb2Yoc3RydWN0IGtiZF9yZXBlYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIEtEU0VUTU9ERToKKwkJLyoKKwkJICogY3VycmVudGx5LCBzZXR0aW5nIHRoZSBtb2RlIGZyb20gS0RfVEVYVCB0byBLRF9HUkFQSElDUworCQkgKiBkb2Vzbid0IGRvIGEgd2hvbGUgbG90LiBpJ20gbm90IHN1cmUgaWYgaXQgc2hvdWxkIGRvIGFueQorCQkgKiByZXN0b3JhdGlvbiBvZiBtb2RlcyBvciB3aGF0Li4uCisJCSAqCisJCSAqIFhYWCBJdCBzaG91bGQgYXQgbGVhc3QgY2FsbCBpbnRvIHRoZSBkcml2ZXIsIGZiZGV2J3MgZGVmaW5pdGVseQorCQkgKiBuZWVkIHRvIHJlc3RvcmUgdGhlaXIgZW5naW5lIHN0YXRlLiAtLUJlbkgKKwkJICovCisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCXN3aXRjaCAoYXJnKSB7CisJCWNhc2UgS0RfR1JBUEhJQ1M6CisJCQlicmVhazsKKwkJY2FzZSBLRF9URVhUMDoKKwkJY2FzZSBLRF9URVhUMToKKwkJCWFyZyA9IEtEX1RFWFQ7CisJCWNhc2UgS0RfVEVYVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHZjLT52Y19tb2RlID09ICh1bnNpZ25lZCBjaGFyKSBhcmcpCisJCQlyZXR1cm4gMDsKKwkJdmMtPnZjX21vZGUgPSAodW5zaWduZWQgY2hhcikgYXJnOworCQlpZiAoY29uc29sZSAhPSBmZ19jb25zb2xlKQorCQkJcmV0dXJuIDA7CisJCS8qCisJCSAqIGV4cGxpY2l0bHkgYmxhbmsvdW5ibGFuayB0aGUgc2NyZWVuIGlmIHN3aXRjaGluZyBtb2RlcworCQkgKi8KKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQlpZiAoYXJnID09IEtEX1RFWFQpCisJCQlkb191bmJsYW5rX3NjcmVlbigxKTsKKwkJZWxzZQorCQkJZG9fYmxhbmtfc2NyZWVuKDEpOworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCXJldHVybiAwOworCisJY2FzZSBLREdFVE1PREU6CisJCXVjdmFsID0gdmMtPnZjX21vZGU7CisJCWdvdG8gc2V0aW50OworCisJY2FzZSBLRE1BUERJU1A6CisJY2FzZSBLRFVOTUFQRElTUDoKKwkJLyoKKwkJICogdGhlc2Ugd29yayBsaWtlIGEgY29tYmluYXRpb24gb2YgbW1hcCBhbmQgS0RFTkFCSU8uCisJCSAqIHRoaXMgY291bGQgYmUgZWFzaWx5IGZpbmlzaGVkLgorCQkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIEtEU0tCTU9ERToKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc3dpdGNoKGFyZykgeworCQkgIGNhc2UgS19SQVc6CisJCQlrYmQtPmtiZG1vZGUgPSBWQ19SQVc7CisJCQlicmVhazsKKwkJICBjYXNlIEtfTUVESVVNUkFXOgorCQkJa2JkLT5rYmRtb2RlID0gVkNfTUVESVVNUkFXOworCQkJYnJlYWs7CisJCSAgY2FzZSBLX1hMQVRFOgorCQkJa2JkLT5rYmRtb2RlID0gVkNfWExBVEU7CisJCQljb21wdXRlX3NoaWZ0c3RhdGUoKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgS19VTklDT0RFOgorCQkJa2JkLT5rYmRtb2RlID0gVkNfVU5JQ09ERTsKKwkJCWNvbXB1dGVfc2hpZnRzdGF0ZSgpOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQlyZXR1cm4gMDsKKworCWNhc2UgS0RHS0JNT0RFOgorCQl1Y3ZhbCA9ICgoa2JkLT5rYmRtb2RlID09IFZDX1JBVykgPyBLX1JBVyA6CisJCQkJIChrYmQtPmtiZG1vZGUgPT0gVkNfTUVESVVNUkFXKSA/IEtfTUVESVVNUkFXIDoKKwkJCQkgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKSA/IEtfVU5JQ09ERSA6CisJCQkJIEtfWExBVEUpOworCQlnb3RvIHNldGludDsKKworCS8qIHRoaXMgY291bGQgYmUgZm9sZGVkIGludG8gS0RTS0JNT0RFLCBidXQgZm9yIGNvbXBhdGliaWxpdHkKKwkgICByZWFzb25zIGl0IGlzIG5vdCBzbyBlYXN5IHRvIGZvbGQgS0RHS0JNRVRBIGludG8gS0RHS0JNT0RFICovCisJY2FzZSBLRFNLQk1FVEE6CisJCXN3aXRjaChhcmcpIHsKKwkJICBjYXNlIEtfTUVUQUJJVDoKKwkJCWNscl92Y19rYmRfbW9kZShrYmQsIFZDX01FVEEpOworCQkJYnJlYWs7CisJCSAgY2FzZSBLX0VTQ1BSRUZJWDoKKwkJCXNldF92Y19rYmRfbW9kZShrYmQsIFZDX01FVEEpOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBLREdLQk1FVEE6CisJCXVjdmFsID0gKHZjX2tiZF9tb2RlKGtiZCwgVkNfTUVUQSkgPyBLX0VTQ1BSRUZJWCA6IEtfTUVUQUJJVCk7CisJc2V0aW50OgorCQlyZXR1cm4gcHV0X3VzZXIodWN2YWwsIChpbnQgX191c2VyICopYXJnKTsgCisKKwljYXNlIEtER0VUS0VZQ09ERToKKwljYXNlIEtEU0VUS0VZQ09ERToKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19UVFlfQ09ORklHKSkKKwkJCXBlcm09MDsKKwkJcmV0dXJuIGRvX2tia2V5Y29kZV9pb2N0bChjbWQsIHVwLCBwZXJtKTsKKworCWNhc2UgS0RHS0JFTlQ6CisJY2FzZSBLRFNLQkVOVDoKKwkJcmV0dXJuIGRvX2tkc2tfaW9jdGwoY21kLCB1cCwgcGVybSwga2JkKTsKKworCWNhc2UgS0RHS0JTRU5UOgorCWNhc2UgS0RTS0JTRU5UOgorCQlyZXR1cm4gZG9fa2Rna2JfaW9jdGwoY21kLCB1cCwgcGVybSk7CisKKwljYXNlIEtER0tCRElBQ1I6CisJeworCQlzdHJ1Y3Qga2JkaWFjcnMgX191c2VyICphID0gdXA7CisKKwkJaWYgKHB1dF91c2VyKGFjY2VudF90YWJsZV9zaXplLCAmYS0+a2JfY250KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV90b191c2VyKGEtPmtiZGlhY3IsIGFjY2VudF90YWJsZSwgYWNjZW50X3RhYmxlX3NpemUqc2l6ZW9mKHN0cnVjdCBrYmRpYWNyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBLRFNLQkRJQUNSOgorCXsKKwkJc3RydWN0IGtiZGlhY3JzIF9fdXNlciAqYSA9IHVwOworCQl1bnNpZ25lZCBpbnQgY3Q7CisKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGdldF91c2VyKGN0LCZhLT5rYl9jbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjdCA+PSBNQVhfRElBQ1IpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWNjZW50X3RhYmxlX3NpemUgPSBjdDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFjY2VudF90YWJsZSwgYS0+a2JkaWFjciwgY3Qqc2l6ZW9mKHN0cnVjdCBrYmRpYWNyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdGhlIGlvY3RscyBiZWxvdyByZWFkL3NldCB0aGUgZmxhZ3MgdXN1YWxseSBzaG93biBpbiB0aGUgbGVkcyAqLworCS8qIGRvbid0IHVzZSB0aGVtIC0gdGhleSB3aWxsIGdvIGF3YXkgd2l0aG91dCB3YXJuaW5nICovCisJY2FzZSBLREdLQkxFRDoKKwkJdWN2YWwgPSBrYmQtPmxlZGZsYWdzdGF0ZSB8IChrYmQtPmRlZmF1bHRfbGVkZmxhZ3N0YXRlIDw8IDQpOworCQlnb3RvIHNldGNoYXI7CisKKwljYXNlIEtEU0tCTEVEOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoYXJnICYgfjB4NzcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2JkLT5sZWRmbGFnc3RhdGUgPSAoYXJnICYgNyk7CisJCWtiZC0+ZGVmYXVsdF9sZWRmbGFnc3RhdGUgPSAoKGFyZyA+PiA0KSAmIDcpOworCQlzZXRfbGVkcygpOworCQlyZXR1cm4gMDsKKworCS8qIHRoZSBpb2N0bHMgYmVsb3cgb25seSBzZXQgdGhlIGxpZ2h0cywgbm90IHRoZSBmdW5jdGlvbnMgKi8KKwkvKiBmb3IgdGhvc2UsIHNlZSBLREdLQkxFRCBhbmQgS0RTS0JMRUQgYWJvdmUgKi8KKwljYXNlIEtER0VUTEVEOgorCQl1Y3ZhbCA9IGdldGxlZHN0YXRlKCk7CisJc2V0Y2hhcjoKKwkJcmV0dXJuIHB1dF91c2VyKHVjdmFsLCAoY2hhciBfX3VzZXIgKilhcmcpOworCisJY2FzZSBLRFNFVExFRDoKKwkJaWYgKCFwZXJtKQorCQkgIHJldHVybiAtRVBFUk07CisJCXNldGxlZHN0YXRlKGtiZCwgYXJnKTsKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIEEgcHJvY2VzcyBjYW4gaW5kaWNhdGUgaXRzIHdpbGxpbmduZXNzIHRvIGFjY2VwdCBzaWduYWxzCisJICogZ2VuZXJhdGVkIGJ5IHByZXNzaW5nIGFuIGFwcHJvcHJpYXRlIGtleSBjb21iaW5hdGlvbi4KKwkgKiBUaHVzLCBvbmUgY2FuIGhhdmUgYSBkYWVtb24gdGhhdCBlLmcuIHNwYXducyBhIG5ldyBjb25zb2xlCisJICogdXBvbiBhIGtleXByZXNzIGFuZCB0aGVuIGNoYW5nZXMgdG8gaXQuCisJICogU2VlIGFsc28gdGhlIGticmVxdWVzdCBmaWVsZCBvZiBpbml0dGFiKDUpLgorCSAqLworCWNhc2UgS0RTSUdBQ0NFUFQ6CisJeworCQlleHRlcm4gaW50IHNwYXducGlkLCBzcGF3bnNpZzsKKwkJaWYgKCFwZXJtIHx8ICFjYXBhYmxlKENBUF9LSUxMKSkKKwkJICByZXR1cm4gLUVQRVJNOworCQlpZiAoYXJnIDwgMSB8fCBhcmcgPiBfTlNJRyB8fCBhcmcgPT0gU0lHS0lMTCkKKwkJICByZXR1cm4gLUVJTlZBTDsKKwkJc3Bhd25waWQgPSBjdXJyZW50LT5waWQ7CisJCXNwYXduc2lnID0gYXJnOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZUX1NFVE1PREU6CisJeworCQlzdHJ1Y3QgdnRfbW9kZSB0bXA7CisKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVwLCBzaXplb2Yoc3RydWN0IHZ0X21vZGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodG1wLm1vZGUgIT0gVlRfQVVUTyAmJiB0bXAubW9kZSAhPSBWVF9QUk9DRVNTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJdmMtPnZ0X21vZGUgPSB0bXA7CisJCS8qIHRoZSBmcnNpZyBpcyBpZ25vcmVkLCBzbyB3ZSBzZXQgaXQgdG8gMCAqLworCQl2Yy0+dnRfbW9kZS5mcnNpZyA9IDA7CisJCXZjLT52dF9waWQgPSBjdXJyZW50LT5waWQ7CisJCS8qIG5vIHN3aXRjaCBpcyByZXF1aXJlZCAtLSBzYXdAc2hhZGUubXN1LnJ1ICovCisJCXZjLT52dF9uZXd2dCA9IC0xOworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVlRfR0VUTU9ERToKKwl7CisJCXN0cnVjdCB2dF9tb2RlIHRtcDsKKwkJaW50IHJjOworCisJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJbWVtY3B5KCZ0bXAsICZ2Yy0+dnRfbW9kZSwgc2l6ZW9mKHN0cnVjdCB2dF9tb2RlKSk7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCQlyYyA9IGNvcHlfdG9fdXNlcih1cCwgJnRtcCwgc2l6ZW9mKHN0cnVjdCB2dF9tb2RlKSk7CisJCXJldHVybiByYyA/IC1FRkFVTFQgOiAwOworCX0KKworCS8qCisJICogUmV0dXJucyBnbG9iYWwgdnQgc3RhdGUuIE5vdGUgdGhhdCBWVCAwIGlzIGFsd2F5cyBvcGVuLCBzaW5jZQorCSAqIGl0J3MgYW4gYWxpYXMgZm9yIHRoZSBjdXJyZW50IFZULCBhbmQgcGVvcGxlIGNhbid0IHVzZSBpdCBoZXJlLgorCSAqIFdlIGNhbm5vdCByZXR1cm4gc3RhdGUgZm9yIG1vcmUgdGhhbiAxNiBWVHMsIHNpbmNlIHZfc3RhdGUgaXMgc2hvcnQuCisJICovCisJY2FzZSBWVF9HRVRTVEFURToKKwl7CisJCXN0cnVjdCB2dF9zdGF0IF9fdXNlciAqdnRzdGF0ID0gdXA7CisJCXVuc2lnbmVkIHNob3J0IHN0YXRlLCBtYXNrOworCisJCWlmIChwdXRfdXNlcihmZ19jb25zb2xlICsgMSwgJnZ0c3RhdC0+dl9hY3RpdmUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN0YXRlID0gMTsJLyogL2Rldi90dHkwIGlzIGFsd2F5cyBvcGVuICovCisJCWZvciAoaSA9IDAsIG1hc2sgPSAyOyBpIDwgTUFYX05SX0NPTlNPTEVTICYmIG1hc2s7ICsraSwgbWFzayA8PD0gMSkKKwkJCWlmIChWVF9JU19JTl9VU0UoaSkpCisJCQkJc3RhdGUgfD0gbWFzazsKKwkJcmV0dXJuIHB1dF91c2VyKHN0YXRlLCAmdnRzdGF0LT52X3N0YXRlKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGF2YWlsYWJsZSAobm9uLW9wZW5lZCkgY29uc29sZS4KKwkgKi8KKwljYXNlIFZUX09QRU5RUlk6CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7ICsraSkKKwkJCWlmICghIFZUX0lTX0lOX1VTRShpKSkKKwkJCQlicmVhazsKKwkJdWN2YWwgPSBpIDwgTUFYX05SX0NPTlNPTEVTID8gKGkrMSkgOiAtMTsKKwkJZ290byBzZXRpbnQ7CQkgCisKKwkvKgorCSAqIGlvY3RsKGZkLCBWVF9BQ1RJVkFURSwgbnVtKSB3aWxsIGNhdXNlIHVzIHRvIHN3aXRjaCB0byB2dCAjIG51bSwKKwkgKiB3aXRoIG51bSA+PSAxIChzd2l0Y2hlcyB0byB2dCAwLCBvdXIgY29uc29sZSwgYXJlIG5vdCBhbGxvd2VkLCBqdXN0CisJICogdG8gcHJlc2VydmUgc2FuaXR5KS4KKwkgKi8KKwljYXNlIFZUX0FDVElWQVRFOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoYXJnID09IDAgfHwgYXJnID4gTUFYX05SX0NPTlNPTEVTKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJYXJnLS07CisJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJaSA9IHZjX2FsbG9jYXRlKGFyZyk7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gaTsKKwkJc2V0X2NvbnNvbGUoYXJnKTsKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIHdhaXQgdW50aWwgdGhlIHNwZWNpZmllZCBWVCBoYXMgYmVlbiBhY3RpdmF0ZWQKKwkgKi8KKwljYXNlIFZUX1dBSVRBQ1RJVkU6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChhcmcgPT0gMCB8fCBhcmcgPiBNQVhfTlJfQ09OU09MRVMpCisJCQlyZXR1cm4gLUVOWElPOworCQlyZXR1cm4gdnRfd2FpdGFjdGl2ZShhcmctMSk7CisKKwkvKgorCSAqIElmIGEgdnQgaXMgdW5kZXIgcHJvY2VzcyBjb250cm9sLCB0aGUga2VybmVsIHdpbGwgbm90IHN3aXRjaCB0byBpdAorCSAqIGltbWVkaWF0ZWx5LCBidXQgcG9zdHBvbmUgdGhlIG9wZXJhdGlvbiB1bnRpbCB0aGUgcHJvY2VzcyBjYWxscyB0aGlzCisJICogaW9jdGwsIGFsbG93aW5nIHRoZSBzd2l0Y2ggdG8gY29tcGxldGUuCisJICoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIFggc291cmNlcyB0aGlzIGlzIHRoZSBiZWhhdmlvcjoKKwkgKgkwOglwZW5kaW5nIHN3aXRjaC1mcm9tIG5vdCBPSworCSAqCTE6CXBlbmRpbmcgc3dpdGNoLWZyb20gT0sKKwkgKgkyOgljb21wbGV0ZWQgc3dpdGNoLXRvIE9LCisJICovCisJY2FzZSBWVF9SRUxESVNQOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAodmMtPnZ0X21vZGUubW9kZSAhPSBWVF9QUk9DRVNTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyoKKwkJICogU3dpdGNoaW5nLWZyb20gcmVzcG9uc2UKKwkJICovCisJCWlmICh2Yy0+dnRfbmV3dnQgPj0gMCkgeworCQkJaWYgKGFyZyA9PSAwKQorCQkJCS8qCisJCQkJICogU3dpdGNoIGRpc2FsbG93ZWQsIHNvIGZvcmdldCB3ZSB3ZXJlIHRyeWluZworCQkJCSAqIHRvIGRvIGl0LgorCQkJCSAqLworCQkJCXZjLT52dF9uZXd2dCA9IC0xOworCisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBjdXJyZW50IHZ0IGhhcyBiZWVuIHJlbGVhc2VkLCBzbworCQkJCSAqIGNvbXBsZXRlIHRoZSBzd2l0Y2guCisJCQkJICovCisJCQkJaW50IG5ld3Z0OworCQkJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJCQluZXd2dCA9IHZjLT52dF9uZXd2dDsKKwkJCQl2Yy0+dnRfbmV3dnQgPSAtMTsKKwkJCQlpID0gdmNfYWxsb2NhdGUobmV3dnQpOworCQkJCWlmIChpKSB7CisJCQkJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJCQkJcmV0dXJuIGk7CisJCQkJfQorCQkJCS8qCisJCQkJICogV2hlbiB3ZSBhY3R1YWxseSBkbyB0aGUgY29uc29sZSBzd2l0Y2gsCisJCQkJICogbWFrZSBzdXJlIHdlIGFyZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvCisJCQkJICogb3RoZXIgY29uc29sZSBzd2l0Y2hlcy4uCisJCQkJICovCisJCQkJY29tcGxldGVfY2hhbmdlX2NvbnNvbGUodmNfY29uc1tuZXd2dF0uZCk7CisJCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogU3dpdGNoZWQtdG8gcmVzcG9uc2UKKwkJICovCisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSAqIElmIGl0J3MganVzdCBhbiBBQ0ssIGlnbm9yZSBpdAorCQkJICovCisJCQlpZiAoYXJnICE9IFZUX0FDS0FDUSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldHVybiAwOworCisJIC8qCisJICAqIERpc2FsbG9jYXRlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIFZUIChidXQgbGVhdmUgVlQxKQorCSAgKi8KKwkgY2FzZSBWVF9ESVNBTExPQ0FURToKKwkJaWYgKGFyZyA+IE1BWF9OUl9DT05TT0xFUykKKwkJCXJldHVybiAtRU5YSU87CisJCWlmIChhcmcgPT0gMCkgeworCQkgICAgLyogZGlzYWxsb2NhdGUgYWxsIHVudXNlZCBjb25zb2xlcywgYnV0IGxlYXZlIDAgKi8KKwkJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJCWZvciAoaT0xOyBpPE1BWF9OUl9DT05TT0xFUzsgaSsrKQorCQkJCWlmICghIFZUX0JVU1koaSkpCisJCQkJCXZjX2Rpc2FsbG9jYXRlKGkpOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQl9IGVsc2UgeworCQkJLyogZGlzYWxsb2NhdGUgYSBzaW5nbGUgY29uc29sZSwgaWYgcG9zc2libGUgKi8KKwkJCWFyZy0tOworCQkJaWYgKFZUX0JVU1koYXJnKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJaWYgKGFyZykgewkJCSAgICAgIC8qIGxlYXZlIDAgKi8KKwkJCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJCQkJdmNfZGlzYWxsb2NhdGUoYXJnKTsKKwkJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFZUX1JFU0laRToKKwl7CisJCXN0cnVjdCB2dF9zaXplcyBfX3VzZXIgKnZ0c2l6ZXMgPSB1cDsKKwkJdXNob3J0IGxsLGNjOworCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZ2V0X3VzZXIobGwsICZ2dHNpemVzLT52X3Jvd3MpIHx8CisJCSAgICBnZXRfdXNlcihjYywgJnZ0c2l6ZXMtPnZfY29scykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJCQl2Y19yZXNpemUodmNfY29uc1tpXS5kLCBjYywgbGwpOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVlRfUkVTSVpFWDoKKwl7CisJCXN0cnVjdCB2dF9jb25zaXplIF9fdXNlciAqdnRjb25zaXplID0gdXA7CisJCXVzaG9ydCBsbCxjYyx2bGluLGNsaW4sdmNvbCxjY29sOworCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdnRjb25zaXplLAorCQkJCXNpemVvZihzdHJ1Y3QgdnRfY29uc2l6ZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fZ2V0X3VzZXIobGwsICZ2dGNvbnNpemUtPnZfcm93cyk7CisJCV9fZ2V0X3VzZXIoY2MsICZ2dGNvbnNpemUtPnZfY29scyk7CisJCV9fZ2V0X3VzZXIodmxpbiwgJnZ0Y29uc2l6ZS0+dl92bGluKTsKKwkJX19nZXRfdXNlcihjbGluLCAmdnRjb25zaXplLT52X2NsaW4pOworCQlfX2dldF91c2VyKHZjb2wsICZ2dGNvbnNpemUtPnZfdmNvbCk7CisJCV9fZ2V0X3VzZXIoY2NvbCwgJnZ0Y29uc2l6ZS0+dl9jY29sKTsKKwkJdmxpbiA9IHZsaW4gPyB2bGluIDogdmMtPnZjX3NjYW5fbGluZXM7CisJCWlmIChjbGluKSB7CisJCQlpZiAobGwpIHsKKwkJCQlpZiAobGwgIT0gdmxpbi9jbGluKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsgLyogUGFyYW1ldGVycyBkb24ndCBhZGQgdXAgKi8KKwkJCX0gZWxzZSAKKwkJCQlsbCA9IHZsaW4vY2xpbjsKKwkJfQorCQlpZiAodmNvbCAmJiBjY29sKSB7CisJCQlpZiAoY2MpIHsKKwkJCQlpZiAoY2MgIT0gdmNvbC9jY29sKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZQorCQkJCWNjID0gdmNvbC9jY29sOworCQl9CisKKwkJaWYgKGNsaW4gPiAzMikKKwkJCXJldHVybiAtRUlOVkFMOworCQkgICAgCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykgeworCQkJaWYgKCF2Y19jb25zW2ldLmQpCisJCQkJY29udGludWU7CisJCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJCQlpZiAodmxpbikKKwkJCQl2Y19jb25zW2ldLmQtPnZjX3NjYW5fbGluZXMgPSB2bGluOworCQkJaWYgKGNsaW4pCisJCQkJdmNfY29uc1tpXS5kLT52Y19mb250LmhlaWdodCA9IGNsaW47CisJCQl2Y19yZXNpemUodmNfY29uc1tpXS5kLCBjYywgbGwpOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQl9CisgIAkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBQSU9fRk9OVDogeworCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlvcC5vcCA9IEtEX0ZPTlRfT1BfU0VUOworCQlvcC5mbGFncyA9IEtEX0ZPTlRfRkxBR19PTEQgfCBLRF9GT05UX0ZMQUdfRE9OVF9SRUNBTEM7CS8qIENvbXBhdGliaWxpdHkgKi8KKwkJb3Aud2lkdGggPSA4OworCQlvcC5oZWlnaHQgPSAwOworCQlvcC5jaGFyY291bnQgPSAyNTY7CisJCW9wLmRhdGEgPSB1cDsKKwkJcmV0dXJuIGNvbl9mb250X29wKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgJm9wKTsKKwl9CisKKwljYXNlIEdJT19GT05UOiB7CisJCW9wLm9wID0gS0RfRk9OVF9PUF9HRVQ7CisJCW9wLmZsYWdzID0gS0RfRk9OVF9GTEFHX09MRDsKKwkJb3Aud2lkdGggPSA4OworCQlvcC5oZWlnaHQgPSAzMjsKKwkJb3AuY2hhcmNvdW50ID0gMjU2OworCQlvcC5kYXRhID0gdXA7CisJCXJldHVybiBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsICZvcCk7CisJfQorCisJY2FzZSBQSU9fQ01BUDoKKyAgICAgICAgICAgICAgICBpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworICAgICAgICAgICAgICAgIHJldHVybiBjb25fc2V0X2NtYXAodXApOworCisJY2FzZSBHSU9fQ01BUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uX2dldF9jbWFwKHVwKTsKKworCWNhc2UgUElPX0ZPTlRYOgorCWNhc2UgR0lPX0ZPTlRYOgorCQlyZXR1cm4gZG9fZm9udHhfaW9jdGwoY21kLCB1cCwgcGVybSwgJm9wKTsKKworCWNhc2UgUElPX0ZPTlRSRVNFVDoKKwl7CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisKKyNpZmRlZiBCUk9LRU5fR1JBUEhJQ1NfUFJPR1JBTVMKKwkJLyogV2l0aCBCUk9LRU5fR1JBUEhJQ1NfUFJPR1JBTVMgZGVmaW5lZCwgdGhlIGRlZmF1bHQKKwkJICAgZm9udCBpcyBub3Qgc2F2ZWQuICovCisJCXJldHVybiAtRU5PU1lTOworI2Vsc2UKKwkJeworCQlvcC5vcCA9IEtEX0ZPTlRfT1BfU0VUX0RFRkFVTFQ7CisJCW9wLmRhdGEgPSBOVUxMOworCQlpID0gY29uX2ZvbnRfb3AodmNfY29uc1tmZ19jb25zb2xlXS5kLCAmb3ApOworCQlpZiAoaSkKKwkJCXJldHVybiBpOworCQljb25fc2V0X2RlZmF1bHRfdW5pbWFwKHZjX2NvbnNbZmdfY29uc29sZV0uZCk7CisJCXJldHVybiAwOworCQl9CisjZW5kaWYKKwl9CisKKwljYXNlIEtERk9OVE9QOiB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmb3AsIHVwLCBzaXplb2Yob3ApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoIXBlcm0gJiYgb3Aub3AgIT0gS0RfRk9OVF9PUF9HRVQpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpID0gY29uX2ZvbnRfb3AodmMsICZvcCk7CisJCWlmIChpKSByZXR1cm4gaTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1cCwgJm9wLCBzaXplb2Yob3ApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFBJT19TQ1JOTUFQOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gY29uX3NldF90cmFuc19vbGQodXApOworCisJY2FzZSBHSU9fU0NSTk1BUDoKKwkJcmV0dXJuIGNvbl9nZXRfdHJhbnNfb2xkKHVwKTsKKworCWNhc2UgUElPX1VOSVNDUk5NQVA6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCXJldHVybiBjb25fc2V0X3RyYW5zX25ldyh1cCk7CisKKwljYXNlIEdJT19VTklTQ1JOTUFQOgorCQlyZXR1cm4gY29uX2dldF90cmFuc19uZXcodXApOworCisJY2FzZSBQSU9fVU5JTUFQQ0xSOgorCSAgICAgIHsgc3RydWN0IHVuaW1hcGluaXQgdWk7CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWkgPSBjb3B5X2Zyb21fdXNlcigmdWksIHVwLCBzaXplb2Yoc3RydWN0IHVuaW1hcGluaXQpKTsKKwkJaWYgKGkpIHJldHVybiAtRUZBVUxUOworCQljb25fY2xlYXJfdW5pbWFwKHZjLCAmdWkpOworCQlyZXR1cm4gMDsKKwkgICAgICB9CisKKwljYXNlIFBJT19VTklNQVA6CisJY2FzZSBHSU9fVU5JTUFQOgorCQlyZXR1cm4gZG9fdW5pbWFwX2lvY3RsKGNtZCwgdXAsIHBlcm0sIHZjKTsKKworCWNhc2UgVlRfTE9DS1NXSVRDSDoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVFRZX0NPTkZJRykpCisJCSAgIHJldHVybiAtRVBFUk07CisJCXZ0X2RvbnRfc3dpdGNoID0gMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWVF9VTkxPQ0tTV0lUQ0g6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RUWV9DT05GSUcpKQorCQkgICByZXR1cm4gLUVQRVJNOworCQl2dF9kb250X3N3aXRjaCA9IDA7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCisvKgorICogU29tZXRpbWVzIHdlIHdhbnQgdG8gd2FpdCB1bnRpbCBhIHBhcnRpY3VsYXIgVlQgaGFzIGJlZW4gYWN0aXZhdGVkLiBXZQorICogZG8gaXQgaW4gYSB2ZXJ5IHNpbXBsZSBtYW5uZXIuIEV2ZXJ5Ym9keSB3YWl0cyBvbiBhIHNpbmdsZSBxdWV1ZSBhbmQKKyAqIGdldCB3b2tlbiB1cCBhdCBvbmNlLiBUaG9zZSB0aGF0IGFyZSBzYXRpc2ZpZWQgZ28gb24gd2l0aCB0aGVpciBidXNpbmVzcywKKyAqIHdoaWxlIHRob3NlIG5vdCByZWFkeSBnbyBiYWNrIHRvIHNsZWVwLiBTZWVtcyBvdmVya2lsbCB0byBhZGQgYSB3YWl0CisgKiB0byBlYWNoIHZ0IGp1c3QgZm9yIHRoaXMgLSB1c3VhbGx5IHRoaXMgZG9lcyBub3RoaW5nIQorICovCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodnRfYWN0aXZhdGVfcXVldWUpOworCisvKgorICogU2xlZXBzIHVudGlsIGEgdnQgaXMgYWN0aXZhdGVkLCBvciB0aGUgdGFzayBpcyBpbnRlcnJ1cHRlZC4gUmV0dXJucworICogMCBpZiBhY3RpdmF0aW9uLCAtRUlOVFIgaWYgaW50ZXJydXB0ZWQuCisgKi8KK2ludCB2dF93YWl0YWN0aXZlKGludCB2dCkKK3sKKwlpbnQgcmV0dmFsOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWRkX3dhaXRfcXVldWUoJnZ0X2FjdGl2YXRlX3F1ZXVlLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlyZXR2YWwgPSAwOworCQlpZiAodnQgPT0gZmdfY29uc29sZSkKKwkJCWJyZWFrOworCQlyZXR2YWwgPSAtRUlOVFI7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdnRfYWN0aXZhdGVfcXVldWUsICZ3YWl0KTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIHZ0X3dha2Vfd2FpdGFjdGl2ZSgpIHdha2VfdXAoJnZ0X2FjdGl2YXRlX3F1ZXVlKQorCit2b2lkIHJlc2V0X3ZjKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwl2Yy0+dmNfbW9kZSA9IEtEX1RFWFQ7CisJa2JkX3RhYmxlW3ZjLT52Y19udW1dLmtiZG1vZGUgPSBWQ19YTEFURTsKKwl2Yy0+dnRfbW9kZS5tb2RlID0gVlRfQVVUTzsKKwl2Yy0+dnRfbW9kZS53YWl0diA9IDA7CisJdmMtPnZ0X21vZGUucmVsc2lnID0gMDsKKwl2Yy0+dnRfbW9kZS5hY3FzaWcgPSAwOworCXZjLT52dF9tb2RlLmZyc2lnID0gMDsKKwl2Yy0+dnRfcGlkID0gLTE7CisJdmMtPnZ0X25ld3Z0ID0gLTE7CisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgICAgLyogVmlhIGtleWJvYXJkLmM6U0FLKCkgLSBha3BtICovCisJCXJlc2V0X3BhbGV0dGUodmMpOworfQorCisvKgorICogUGVyZm9ybXMgdGhlIGJhY2sgZW5kIG9mIGEgdnQgc3dpdGNoCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2NoYW5nZV9jb25zb2xlKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZF92Y19tb2RlOworCisJbGFzdF9jb25zb2xlID0gZmdfY29uc29sZTsKKworCS8qCisJICogSWYgd2UncmUgc3dpdGNoaW5nLCB3ZSBjb3VsZCBiZSBnb2luZyBmcm9tIEtEX0dSQVBISUNTIHRvCisJICogS0RfVEVYVCBtb2RlIG9yIHZpY2UgdmVyc2EsIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gYmxhbmsgb3IKKwkgKiB1bmJsYW5rIHRoZSBzY3JlZW4gbGF0ZXIuCisJICovCisJb2xkX3ZjX21vZGUgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQtPnZjX21vZGU7CisJc3dpdGNoX3NjcmVlbih2Yyk7CisKKwkvKgorCSAqIFRoaXMgY2FuJ3QgYXBwZWFyIGJlbG93IGEgc3VjY2Vzc2Z1bCBraWxsX3Byb2MoKS4gIElmIGl0IGRpZCwKKwkgKiB0aGVuIHRoZSAqYmxhbmtfc2NyZWVuIG9wZXJhdGlvbiBjb3VsZCBvY2N1ciB3aGlsZSBYLCBoYXZpbmcKKwkgKiByZWNlaXZlZCBhY3FzaWcsIGlzIHdha2luZyB1cCBvbiBhbm90aGVyIHByb2Nlc3Nvci4gIFRoaXMKKwkgKiBjb25kaXRpb24gY2FuIGxlYWQgdG8gb3ZlcmxhcHBpbmcgYWNjZXNzZXMgdG8gdGhlIFZHQSByYW5nZQorCSAqIGFuZCB0aGUgZnJhbWVidWZmZXIgKGNhdXNpbmcgc3lzdGVtIGxvY2t1cHMpLgorCSAqCisJICogVG8gYWNjb3VudCBmb3IgdGhpcyB3ZSBkdXBsaWNhdGUgdGhpcyBjb2RlIGJlbG93IG9ubHkgaWYgdGhlCisJICogY29udHJvbGxpbmcgcHJvY2VzcyBpcyBnb25lIGFuZCB3ZSd2ZSBjYWxsZWQgcmVzZXRfdmMuCisJICovCisJaWYgKG9sZF92Y19tb2RlICE9IHZjLT52Y19tb2RlKSB7CisJCWlmICh2Yy0+dmNfbW9kZSA9PSBLRF9URVhUKQorCQkJZG9fdW5ibGFua19zY3JlZW4oMSk7CisJCWVsc2UKKwkJCWRvX2JsYW5rX3NjcmVlbigxKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgbmV3IGNvbnNvbGUgaXMgdW5kZXIgcHJvY2VzcyBjb250cm9sLCBzZW5kIGl0IGEgc2lnbmFsCisJICogdGVsbGluZyBpdCB0aGF0IGl0IGhhcyBhY3F1aXJlZC4gQWxzbyBjaGVjayBpZiBpdCBoYXMgZGllZCBhbmQKKwkgKiBjbGVhbiB1cCAoc2ltaWxhciB0byBsb2dpYyBlbXBsb3llZCBpbiBjaGFuZ2VfY29uc29sZSgpKQorCSAqLworCWlmICh2Yy0+dnRfbW9kZS5tb2RlID09IFZUX1BST0NFU1MpIHsKKwkJLyoKKwkJICogU2VuZCB0aGUgc2lnbmFsIGFzIHByaXZpbGVnZWQgLSBraWxsX3Byb2MoKSB3aWxsCisJCSAqIHRlbGwgdXMgaWYgdGhlIHByb2Nlc3MgaGFzIGdvbmUgb3Igc29tZXRoaW5nIGVsc2UKKwkJICogaXMgYXdyeQorCQkgKi8KKwkJaWYgKGtpbGxfcHJvYyh2Yy0+dnRfcGlkLCB2Yy0+dnRfbW9kZS5hY3FzaWcsIDEpICE9IDApIHsKKwkJLyoKKwkJICogVGhlIGNvbnRyb2xsaW5nIHByb2Nlc3MgaGFzIGRpZWQsIHNvIHdlIHJldmVydCBiYWNrIHRvCisJCSAqIG5vcm1hbCBvcGVyYXRpb24uIEluIHRoaXMgY2FzZSwgd2UnbGwgYWxzbyBjaGFuZ2UgYmFjaworCQkgKiB0byBLRF9URVhUIG1vZGUuIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIHN0cmljdGx5IGNvcnJlY3QKKwkJICogYnV0IGl0IHNhdmVzIHRoZSBhZ29ueSB3aGVuIHRoZSBYIHNlcnZlciBkaWVzIGFuZCB0aGUgc2NyZWVuCisJCSAqIHJlbWFpbnMgYmxhbmtlZCBkdWUgdG8gS0RfR1JBUEhJQ1MhIEl0IHdvdWxkIGJlIG5pY2UgdG8gZG8KKwkJICogdGhpcyBvdXRzaWRlIG9mIFZUX1BST0NFU1MgYnV0IHRoZXJlIGlzIG5vIHNpbmdsZSBwcm9jZXNzCisJCSAqIHRvIGFjY291bnQgZm9yIGFuZCB0cmFja2luZyB0dHkgY291bnQgbWF5IGJlIHVuZGVzaXJhYmxlLgorCQkgKi8KKwkJCXJlc2V0X3ZjKHZjKTsKKworCQkJaWYgKG9sZF92Y19tb2RlICE9IHZjLT52Y19tb2RlKSB7CisJCQkJaWYgKHZjLT52Y19tb2RlID09IEtEX1RFWFQpCisJCQkJCWRvX3VuYmxhbmtfc2NyZWVuKDEpOworCQkJCWVsc2UKKwkJCQkJZG9fYmxhbmtfc2NyZWVuKDEpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBXYWtlIGFueW9uZSB3YWl0aW5nIGZvciB0aGVpciBWVCB0byBhY3RpdmF0ZQorCSAqLworCXZ0X3dha2Vfd2FpdGFjdGl2ZSgpOworCXJldHVybjsKK30KKworLyoKKyAqIFBlcmZvcm1zIHRoZSBmcm9udC1lbmQgb2YgYSB2dCBzd2l0Y2gKKyAqLwordm9pZCBjaGFuZ2VfY29uc29sZShzdHJ1Y3QgdmNfZGF0YSAqbmV3X3ZjKQoreworCXN0cnVjdCB2Y19kYXRhICp2YzsKKworCWlmICghbmV3X3ZjIHx8IG5ld192Yy0+dmNfbnVtID09IGZnX2NvbnNvbGUgfHwgdnRfZG9udF9zd2l0Y2gpCisJCXJldHVybjsKKworCS8qCisJICogSWYgdGhpcyB2dCBpcyBpbiBwcm9jZXNzIG1vZGUsIHRoZW4gd2UgbmVlZCB0byBoYW5kc2hha2Ugd2l0aAorCSAqIHRoYXQgcHJvY2VzcyBiZWZvcmUgc3dpdGNoaW5nLiBFc3NlbnRpYWxseSwgd2Ugc3RvcmUgd2hlcmUgdGhhdAorCSAqIHZ0IHdhbnRzIHRvIHN3aXRjaCB0byBhbmQgd2FpdCBmb3IgaXQgdG8gdGVsbCB1cyB3aGVuIGl0J3MgZG9uZQorCSAqICh2aWEgVlRfUkVMRElTUCBpb2N0bCkuCisJICoKKwkgKiBXZSBhbHNvIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29udHJvbGxpbmcgcHJvY2VzcyBzdGlsbCBleGlzdHMuCisJICogSWYgaXQgZG9lc24ndCwgd2UgcmVzZXQgdGhpcyB2dCB0byBhdXRvIG1vZGUgYW5kIGNvbnRpbnVlLgorCSAqIFRoaXMgaXMgYSBjaGVhcCB3YXkgdG8gdHJhY2sgcHJvY2VzcyBjb250cm9sLiBUaGUgd29yc3QgdGhpbmcKKwkgKiB0aGF0IGNhbiBoYXBwZW4gaXM6IHdlIHNlbmQgYSBzaWduYWwgdG8gYSBwcm9jZXNzLCBpdCBkaWVzLCBhbmQKKwkgKiB0aGUgc3dpdGNoIGdldHMgImxvc3QiIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2U7IGhvcGVmdWxseSwgdGhlCisJICogdXNlciB3aWxsIHRyeSBhZ2Fpbiwgd2UnbGwgZGV0ZWN0IHRoZSBwcm9jZXNzIGlzIGdvbmUgKHVubGVzcworCSAqIHRoZSB1c2VyIHdhaXRzIGp1c3QgdGhlIHJpZ2h0IGFtb3VudCBvZiB0aW1lIDotKSBhbmQgcmV2ZXJ0IHRoZQorCSAqIHZ0IHRvIGF1dG8gY29udHJvbC4KKwkgKi8KKwl2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwlpZiAodmMtPnZ0X21vZGUubW9kZSA9PSBWVF9QUk9DRVNTKSB7CisJCS8qCisJCSAqIFNlbmQgdGhlIHNpZ25hbCBhcyBwcml2aWxlZ2VkIC0ga2lsbF9wcm9jKCkgd2lsbAorCQkgKiB0ZWxsIHVzIGlmIHRoZSBwcm9jZXNzIGhhcyBnb25lIG9yIHNvbWV0aGluZyBlbHNlCisJCSAqIGlzIGF3cnkKKwkJICovCisJCWlmIChraWxsX3Byb2ModmMtPnZ0X3BpZCwgdmMtPnZ0X21vZGUucmVsc2lnLCAxKSA9PSAwKSB7CisJCQkvKgorCQkJICogSXQgd29ya2VkLiBNYXJrIHRoZSB2dCB0byBzd2l0Y2ggdG8gYW5kCisJCQkgKiByZXR1cm4uIFRoZSBwcm9jZXNzIG5lZWRzIHRvIHNlbmQgdXMgYQorCQkJICogVlRfUkVMRElTUCBpb2N0bCB0byBjb21wbGV0ZSB0aGUgc3dpdGNoLgorCQkJICovCisJCQl2Yy0+dnRfbmV3dnQgPSBuZXdfdmMtPnZjX251bTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBjb250cm9sbGluZyBwcm9jZXNzIGhhcyBkaWVkLCBzbyB3ZSByZXZlcnQgYmFjayB0bworCQkgKiBub3JtYWwgb3BlcmF0aW9uLiBJbiB0aGlzIGNhc2UsIHdlJ2xsIGFsc28gY2hhbmdlIGJhY2sKKwkJICogdG8gS0RfVEVYVCBtb2RlLiBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBzdHJpY3RseSBjb3JyZWN0CisJCSAqIGJ1dCBpdCBzYXZlcyB0aGUgYWdvbnkgd2hlbiB0aGUgWCBzZXJ2ZXIgZGllcyBhbmQgdGhlIHNjcmVlbgorCQkgKiByZW1haW5zIGJsYW5rZWQgZHVlIHRvIEtEX0dSQVBISUNTISBJdCB3b3VsZCBiZSBuaWNlIHRvIGRvCisJCSAqIHRoaXMgb3V0c2lkZSBvZiBWVF9QUk9DRVNTIGJ1dCB0aGVyZSBpcyBubyBzaW5nbGUgcHJvY2VzcworCQkgKiB0byBhY2NvdW50IGZvciBhbmQgdHJhY2tpbmcgdHR5IGNvdW50IG1heSBiZSB1bmRlc2lyYWJsZS4KKwkJICovCisJCXJlc2V0X3ZjKHZjKTsKKworCQkvKgorCQkgKiBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIChWVF9BVVRPKSBoYW5kbGluZyBvZiB0aGUgc3dpdGNoLi4uCisJCSAqLworCX0KKworCS8qCisJICogSWdub3JlIGFsbCBzd2l0Y2hlcyBpbiBLRF9HUkFQSElDUytWVF9BVVRPIG1vZGUKKwkgKi8KKwlpZiAodmMtPnZjX21vZGUgPT0gS0RfR1JBUEhJQ1MpCisJCXJldHVybjsKKworCWNvbXBsZXRlX2NoYW5nZV9jb25zb2xlKG5ld192Yyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTMxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtMCwwICsxLDU0OSBAQAorIworIyBXYXRjaGRvZyBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCittZW51ICJXYXRjaGRvZyBDYXJkcyIKKworY29uZmlnIFdBVENIRE9HCisJYm9vbCAiV2F0Y2hkb2cgVGltZXIgU3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSAoYW5kIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMpIGFuZCBjcmVhdGUgYQorCSAgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3dhdGNoZG9nIHdpdGggbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vcgorCSAgbnVtYmVyIDEzMCB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3Ugd2lsbCBnZXQgYSB3YXRjaGRvZywgaS5lLjoKKwkgIHN1YnNlcXVlbnRseSBvcGVuaW5nIHRoZSBmaWxlIGFuZCB0aGVuIGZhaWxpbmcgdG8gd3JpdGUgdG8gaXQgZm9yCisJICBsb25nZXIgdGhhbiAxIG1pbnV0ZSB3aWxsIHJlc3VsdCBpbiByZWJvb3RpbmcgdGhlIG1hY2hpbmUuIFRoaXMKKwkgIGNvdWxkIGJlIHVzZWZ1bCBmb3IgYSBuZXR3b3JrZWQgbWFjaGluZSB0aGF0IG5lZWRzIHRvIGNvbWUgYmFjaworCSAgb25saW5lIGFzIGZhc3QgYXMgcG9zc2libGUgYWZ0ZXIgYSBsb2NrLXVwLiBUaGVyZSdzIGJvdGggYSB3YXRjaGRvZworCSAgaW1wbGVtZW50YXRpb24gZW50aXJlbHkgaW4gc29mdHdhcmUgKHdoaWNoIGNhbiBzb21ldGltZXMgZmFpbCB0bworCSAgcmVib290IHRoZSBtYWNoaW5lKSBhbmQgYSBkcml2ZXIgZm9yIGhhcmR3YXJlIHdhdGNoZG9nIGJvYXJkcywgd2hpY2gKKwkgIGFyZSBtb3JlIHJvYnVzdCBhbmQgY2FuIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgdGVtcGVyYXR1cmUgaW5zaWRlCisJICB5b3VyIGNvbXB1dGVyLiBGb3IgZGV0YWlscywgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLnR4dD4KKwkgIGluIHRoZSBrZXJuZWwgc291cmNlLgorCisJICBUaGUgd2F0Y2hkb2cgaXMgdXN1YWxseSB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIHdhdGNoZG9nIGRhZW1vbgorCSAgd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20KKwkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL2RhZW1vbnMvd2F0Y2hkb2cvPi4gVGhpcyBkYWVtb24gY2FuCisJICBhbHNvIG1vbml0b3IgTkZTIGNvbm5lY3Rpb25zIGFuZCBjYW4gcmVib290IHRoZSBtYWNoaW5lIHdoZW4gdGhlIHByb2Nlc3MKKwkgIHRhYmxlIGlzIGZ1bGwuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBXQVRDSERPR19OT1dBWU9VVAorCWJvb2wgIkRpc2FibGUgd2F0Y2hkb2cgc2h1dGRvd24gb24gY2xvc2UiCisJZGVwZW5kcyBvbiBXQVRDSERPRworCWhlbHAKKwkgIFRoZSBkZWZhdWx0IHdhdGNoZG9nIGJlaGF2aW91ciAod2hpY2ggeW91IGdldCBpZiB5b3Ugc2F5IE4gaGVyZSkgaXMKKwkgIHRvIHN0b3AgdGhlIHRpbWVyIGlmIHRoZSBwcm9jZXNzIG1hbmFnaW5nIGl0IGNsb3NlcyB0aGUgZmlsZQorCSAgL2Rldi93YXRjaGRvZy4gSXQncyBhbHdheXMgcmVtb3RlbHkgcG9zc2libGUgdGhhdCB0aGlzIHByb2Nlc3MgbWlnaHQKKwkgIGdldCBraWxsZWQuIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgd2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZQorCSAgaXQgaGFzIGJlZW4gc3RhcnRlZC4KKworIworIyBHZW5lcmFsIFdhdGNoZG9nIGRyaXZlcnMKKyMKKworY29tbWVudCAiV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMiCisJZGVwZW5kcyBvbiBXQVRDSERPRworCisjIEFyY2hpdGVjdHVyZSBJbmRlcGVuZGFudAorCitjb25maWcgU09GVF9XQVRDSERPRworCXRyaXN0YXRlICJTb2Z0d2FyZSB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HCisJaGVscAorCSAgQSBzb2Z0d2FyZSBtb25pdG9yaW5nIHdhdGNoZG9nLiBUaGlzIHdpbGwgZmFpbCB0byByZWJvb3QgeW91ciBzeXN0ZW0KKwkgIGZyb20gc29tZSBzaXR1YXRpb25zIHRoYXQgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIHdpbGwgcmVjb3ZlcgorCSAgZnJvbS4gRXF1YWxseSBpdCdzIGEgbG90IGNoZWFwZXIgdG8gaW5zdGFsbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc29mdGRvZy4KKworIyBBUk0gQXJjaGl0ZWN0dXJlCisKK2NvbmZpZyAyMTI4NV9XQVRDSERPRworCXRyaXN0YXRlICJEQzIxMjg1IHdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgRk9PVEJSSURHRQorCWhlbHAKKwkgIFRoZSBJbnRlbCBGb290YnJpZGdlIGNoaXAgY29udGFpbnMgYSBidWlsdGluIHdhdGNoZG9nIGNpcmN1aXQuIFNheSBZCisJICBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGlzLiBBbHRlcm5hdGl2ZWx5IHNheSBNIHRvIGNvbXBpbGUgdGhlCisJICBkcml2ZXIgYXMgYSBtb2R1bGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdkdDI4NS4KKworCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayBvbiBhbGwgbWFjaGluZXMuIEluIHBhcnRpY3VsYXIsIGVhcmx5IENBVFMKKwkgIGJvYXJkcyBoYXZlIGhhcmR3YXJlIHByb2JsZW1zIHRoYXQgd2lsbCBjYXVzZSB0aGUgbWFjaGluZSB0byBzaW1wbHkKKwkgIGxvY2sgdXAgaWYgdGhlIHdhdGNoZG9nIGZpcmVzLgorCisJICAiSWYgaW4gZG91YnQsIGxlYXZlIGl0IG91dCIgLSBzYXkgTi4KKworY29uZmlnIDk3N19XQVRDSERPRworCXRyaXN0YXRlICJOZXRXaW5kZXIgV0I4M0M5Nzcgd2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBGT09UQlJJREdFICYmIEFSQ0hfTkVUV0lOREVSCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBXQjk3NyB3YXRjaGRvZyBpbmNsdWRlZCBpbgorCSAgTmV0V2luZGVyIG1hY2hpbmVzLiBBbHRlcm5hdGl2ZWx5IHNheSBNIHRvIGNvbXBpbGUgdGhlIGRyaXZlciBhcworCSAgYSBtb2R1bGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdkdDk3Ny4KKworCSAgTm90IHN1cmU/IEl0J3Mgc2FmZSB0byBzYXkgTi4KKworY29uZmlnIElYUDRYWF9XQVRDSERPRworCXRyaXN0YXRlICJJWFA0eHggV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBBUkNIX0lYUDRYWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIKKwkgIGluIHRoZSBJbnRlbCBJWFA0eHggbmV0d29yayBwcm9jZXNzb3JzLiBUaGlzIGRyaXZlciBjYW4KKwkgIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGJ5IGNob29zaW5nIE0uIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGl4cDR4eF93ZHQuCisKKwkgIE5vdGU6IFRoZSBpbnRlcm5hbCBJWFA0eHggd2F0Y2hkb2cgZG9lcyBhIHNvZnQgQ1BVIHJlc2V0CisJICB3aGljaCBkb2Vzbid0IHJlc2V0IGFueSBwZXJpcGhlcmFscy4gVGhlcmUgYXJlIGNpcmN1bXN0YW5jZXMKKwkgIHdoZXJlIHRoZSB3YXRjaGRvZyB3aWxsIGZhaWwgdG8gcmVzZXQgdGhlIGJvYXJkIGNvcnJlY3RseQorCSAgKGUuZy4sIGlmIHRoZSBib290IFJPTSBpcyBpbiBhbiB1bnJlYWRhYmxlIHN0YXRlKS4KKworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBJWFAyMDAwX1dBVENIRE9HCisJdHJpc3RhdGUgIklYUDIwMDAgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBBUkNIX0lYUDIwMDAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyCisJICBpbiB0aGUgSW50ZWwgSVhQMjAwMCgyNDAwLCAyODAwLCAyODUwKSBuZXR3b3JrIHByb2Nlc3NvcnMuCisJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbHQgYXMgYSBtb2R1bGUgYnkgY2hvb3NpbmcgTS4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXhwMjAwMF93ZHQuCisKKwkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorCitjb25maWcgUzNDMjQxMF9XQVRDSERPRworCXRyaXN0YXRlICJTM0MyNDEwIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgQVJDSF9TM0MyNDEwCisJaGVscAorCSAgV2F0Y2hkb2cgdGltZXIgYmxvY2sgaW4gdGhlIFNhbXN1bmcgUzNDMjQxMCBjaGlwcy4gVGhpcyB3aWxsCisJICByZWJvb3QgdGhlIHN5c3RlbSB3aGVuIHRoZSB0aW1lciBleHBpcmVzIHdpdGggdGhlIHdhdGNoZG9nCisJICBlbmFibGVkLgorCisJICBUaGUgZHJpdmVyIGlzIGxpbWl0ZWQgYnkgdGhlIHNwZWVkIG9mIHRoZSBzeXN0ZW0ncyBQQ0xLCisJICBzaWduYWwsIHNvIHdpdGggcmVhc29uYmFseSBmYXN0IHN5c3RlbXMgKFBDTEsgYXJvdW5kIDUwLTY2TUh6KQorCSAgdGhlbiB3YXRjaGRvZyBpbnRlcnZhbHMgb2Ygb3ZlciBhcHByb3hpbWF0ZWx5IDIwc2Vjb25kcyBhcmUKKwkgIHVuYXZhaWxhYmxlLgorCisJICBUaGUgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZSBieSBjaG9vc2luZyBNLCBhbmQgd2lsbAorCSAgYmUgY2FsbGVkIHMzYzI0MTBfd2R0CisKK2NvbmZpZyBTQTExMDBfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiU0ExMTAwL1BYQTJ4eCB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmICggQVJDSF9TQTExMDAgfHwgQVJDSF9QWEEgKQorCWhlbHAKKwkgIFdhdGNoZG9nIHRpbWVyIGVtYmVkZGVkIGludG8gU0ExMXgwIGFuZCBQWEEyeHggY2hpcHMuIFRoaXMgd2lsbAorCSAgcmVib290IHlvdXIgc3lzdGVtIHdoZW4gdGltZW91dCBpcyByZWFjaGVkLgorCisJICBOT1RFOiBvbmNlIGVuYWJsZWQsIHRoaXMgdGltZXIgY2Fubm90IGJlIGRpc2FibGVkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYTExMDBfd2R0LgorCisjIFg4NiAoaTM4NiArIGlhNjQgKyB4ODZfNjQpIEFyY2hpdGVjdHVyZQorCitjb25maWcgQUNRVUlSRV9XRFQKKwl0cmlzdGF0ZSAiQWNxdWlyZSBTQkMgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiBTaW5nbGUgQm9hcmQKKwkgIENvbXB1dGVycyBwcm9kdWNlZCBieSBBY3F1aXJlIEluYyAoYW5kIG90aGVycykuIFRoaXMgd2F0Y2hkb2cKKwkgIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwgYW5kIGlmCisJICBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3F1aXJld2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgQURWQU5URUNIX1dEVAorCXRyaXN0YXRlICJBZHZhbnRlY2ggU0JDIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJaGVscAorCSAgSWYgeW91IGFyZSBjb25maWd1cmluZyBhIExpbnV4IGtlcm5lbCBmb3IgdGhlIEFkdmFudGVjaCBzaW5nbGUtYm9hcmQKKwkgIGNvbXB1dGVyLCBzYXkgYFknIGhlcmUgdG8gc3VwcG9ydCBpdHMgYnVpbHQtaW4gd2F0Y2hkb2cgdGltZXIKKwkgIGZlYXR1cmUuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0CisJICA8aHR0cDovL3d3dy5hZHZhbnRlY2guY29tLnR3L3Byb2R1Y3RzLz4KKworY29uZmlnIEFMSU0xNTM1X1dEVAorCXRyaXN0YXRlICJBTGkgTTE1MzUgUE1VIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2ICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBBTGkgTTE1MzUgUE1VLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhbGltMTUzNV93ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBBTElNNzEwMV9XRFQKKwl0cmlzdGF0ZSAiQUxpIE03MTAxIFBNVSBDb21wdXRlciBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NiAmJiBQQ0kKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgQUxpIE03MTAxIFBNVQorCSAgYXMgdXNlZCBpbiB0aGUgeDg2IENvYmFsdCBzZXJ2ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhbGltNzEwMV93ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBTQzUyMF9XRFQKKwl0cmlzdGF0ZSAiQU1EIEVsYW4gU0M1MjAgcHJvY2Vzc29yIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgYnVpbHQgaW4gdG8gdGhlCisJICBBTUQgIkVsYW4iIFNDNTIwIG1pY3JvY29tcHV0ZXIgY29tbW9ubHkgdXNlZCBpbiBlbWJlZGRlZCBzeXN0ZW1zLgorCSAgVGhpcyB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndAorCSAgZnJlZXplLCBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbgorCSAgYW1vdW50IG9mIHRpbWUuCisKKwkgIFlvdSBjYW4gY29tcGlsZSB0aGlzIGRyaXZlciBkaXJlY3RseSBpbnRvIHRoZSBrZXJuZWwsIG9yIHVzZQorCSAgaXQgYXMgYSBtb2R1bGUuICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjNTIwX3dkdC4KKworY29uZmlnIEVVUk9URUNIX1dEVAorCXRyaXN0YXRlICJFdXJvdGVjaCBDUFUtMTIyMC8xNDEwIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyB0aW1lciBvbiB0aGUgRXVyb3RlY2ggQ1BVLTEyMjAgYW5kCisJICBDUFUtMTQxMCBjYXJkcy4gIFRoZXNlIGFyZSBQQy8xMDQgU0JDcy4gU3BlYyBzaGVldHMgYW5kIHByb2R1Y3QKKwkgIGluZm9ybWF0aW9uIGFyZSBhdCA8aHR0cDovL3d3dy5ldXJvdGVjaC5pdC8+LgorCitjb25maWcgSUI3MDBfV0RUCisJdHJpc3RhdGUgIklCNzAwIFNCQyBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBJQjcwMCBTaW5nbGUKKwkgIEJvYXJkIENvbXB1dGVyIHByb2R1Y2VkIGJ5IFRNQyBUZWNobm9sb2d5ICh3d3cudG1jLXVrLmNvbSkuIFRoaXMgd2F0Y2hkb2cKKwkgIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwgYW5kIGlmCisJICBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLgorCisJICBUaGlzIGRyaXZlciBpcyBsaWtlIHRoZSBXRFQ1MDEgZHJpdmVyIGJ1dCBmb3Igc2xpZ2h0bHkgZGlmZmVyZW50IGhhcmR3YXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpYjcwMHdkdC4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKworY29uZmlnIFdBRkVSX1dEVAorCXRyaXN0YXRlICJJQ1AgV2FmZXIgNTgyMyBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIElDUCBXYWZlciA1ODIzCisJICBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgKGFuZCBwcm9iYWJseSBvdGhlciBzaW1pbGFyIG1vZGVscykuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdhZmVyNTgyM3dkdC4KKworY29uZmlnIEk4WFhfVENPCisJdHJpc3RhdGUgIkludGVsIGk4eHggVENPIFRpbWVyL1dhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgKFg4NiB8fCBJQTY0KSAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBUQ08gdGltZXIgYnVpbHQgaW50byB0aGUgSW50ZWwgODI4MDEKKwkgIEkvTyBDb250cm9sbGVyIEh1YiBmYW1pbHkuICBUaGUgVENPIChUb3RhbCBDb3N0IG9mIE93bmVyc2hpcCkKKwkgIHRpbWVyIGlzIGEgd2F0Y2hkb2cgdGltZXIgdGhhdCB3aWxsIHJlYm9vdCB0aGUgbWFjaGluZSBhZnRlcgorCSAgaXRzIHNlY29uZCBleHBpcmF0aW9uLiBUaGUgZXhwaXJhdGlvbiB0aW1lIGNhbiBiZSBjb25maWd1cmVkCisJICB3aXRoIHRoZSAiaGVhcnRiZWF0IiBwYXJhbWV0ZXIuCisKKwkgIE9uIHNvbWUgbW90aGVyYm9hcmRzIHRoZSBkcml2ZXIgbWF5IGZhaWwgdG8gcmVzZXQgdGhlIGNoaXBzZXQncworCSAgTk9fUkVCT09UIGZsYWcgd2hpY2ggcHJldmVudHMgdGhlIHdhdGNoZG9nIGZyb20gcmVib290aW5nIHRoZQorCSAgbWFjaGluZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3Ugd2lsbCBnZXQgYSBrZXJuZWwgbWVzc2FnZSBsaWtlCisJICAiZmFpbGVkIHRvIHJlc2V0IE5PX1JFQk9PVCBmbGFnLCByZWJvb3QgZGlzYWJsZWQgYnkgaGFyZHdhcmUiLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpOHh4X3Rjby4KKworY29uZmlnIFNDMTIwMF9XRFQKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzA3L1BDOTczMDcgKGFsYSBTQzEyMDApIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzA3L1BDOTczMDcgaGFyZHdhcmUKKwkgIHdhdGNoZG9nIGNhcmRzIGFzIGZvdW5kIG9uIHRoZSBTQzEyMDAuIFRoaXMgd2F0Y2hkb2cgaXMgbWFpbmx5IHVzZWQKKwkgIGZvciBwb3dlciBtYW5hZ2VtZW50IHB1cnBvc2VzIGFuZCBjYW4gYmUgdXNlZCB0byBwb3dlciBkb3duIHRoZSBkZXZpY2UKKwkgIGR1cmluZyBpbmFjdGl2aXR5IHBlcmlvZHMgKGluY2x1ZGVzIGludGVycnVwdCBhY3Rpdml0eSBtb25pdG9yaW5nKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2MxMjAwd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgU0N4MjAwX1dEVAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFNDeDIwMCBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFNDeDIwMCAmJiBQQ0kKKwloZWxwCisJICBFbmFibGUgdGhlIGJ1aWx0LWluIHdhdGNoZG9nIHRpbWVyIHN1cHBvcnQgb24gdGhlIE5hdGlvbmFsCisJICBTZW1pY29uZHVjdG9yIFNDeDIwMCBwcm9jZXNzb3JzLgorCisJICBJZiBjb21waWxlZCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgc2N4MjAwX3dkdC4KKworY29uZmlnIDYwWFhfV0RUCisJdHJpc3RhdGUgIlNCQy02MFhYIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJaGVscAorCSAgVGhpcyBkcml2ZXIgY2FuIGJlIHVzZWQgd2l0aCB0aGUgd2F0Y2hkb2cgdGltZXIgZm91bmQgb24gc29tZQorCSAgc2luZ2xlIGJvYXJkIGNvbXB1dGVycywgbmFtZWx5IHRoZSA2MDEwIFBJSSBiYXNlZCBjb21wdXRlci4KKwkgIEl0IG1heSB3ZWxsIHdvcmsgd2l0aCBvdGhlciBjYXJkcy4gIEl0IHJlYWRzIHBvcnQgMHg0NDMgdG8gZW5hYmxlCisJICBhbmQgcmUtc2V0IHRoZSB3YXRjaGRvZyB0aW1lciwgYW5kIHJlYWRzIHBvcnQgMHg0NSB0byBkaXNhYmxlCisJICB0aGUgd2F0Y2hkb2cuICBJZiB5b3UgaGF2ZSBhIGNhcmQgdGhhdCBiZWhhdmUgaW4gc2ltaWxhciB3YXlzLAorCSAgeW91IGNhbiBwcm9iYWJseSBtYWtlIHRoaXMgZHJpdmVyIHdvcmsgd2l0aCB5b3VyIGNhcmQgYXMgd2VsbC4KKworCSAgWW91IGNhbiBjb21waWxlIHRoaXMgZHJpdmVyIGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbCwgb3IgdXNlCisJICBpdCBhcyBhIG1vZHVsZS4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2JjNjB4eHdkdC4KKworY29uZmlnIENQVTVfV0RUCisJdHJpc3RhdGUgIlNNQSBDUFU1IFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVEJELgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3B1NXdkdC4KKworY29uZmlnIFc4MzYyN0hGX1dEVAorCXRyaXN0YXRlICJXODM2MjdIRiBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBXODM2MjdIRiBjaGlwc2V0CisJICBhcyB1c2VkIGluIEFkdmFudGVjaCBQQy05NTc4IGFuZCBUeWFuIFMyNzIxLTUzMyBtb3RoZXJib2FyZHMKKwkgIChhbmQgbGlrZWx5IG90aGVycykuICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvCisJICBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIKKwkgIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdzgzNjI3aGZfd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgVzgzODc3Rl9XRFQKKwl0cmlzdGF0ZSAiVzgzODc3RiAoRU1BQ1MpIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIFc4Mzg3N0YgY2hpcHNldAorCSAgYXMgdXNlZCBpbiBFTUFDUyBQQy0xMDQgbW90aGVyYm9hcmRzIChhbmQgbGlrZWx5IG90aGVycykuICBUaGlzCisJICB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsCisJICBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YKKwkgIHRpbWUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHc4Mzg3N2Zfd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgTUFDSFpfV0RUCisJdHJpc3RhdGUgIlpGIE1hY2haIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgSWYgeW91IGFyZSB1c2luZyBhIFpGIE1pY3JvIE1hY2haIHByb2Nlc3Nvciwgc2F5IFkgaGVyZSwgb3RoZXJ3aXNlCisJICBOLiAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgYnVpbHRpbiBvbiB0aGF0CisJICBwcm9jZXNzb3IgdXNpbmcgWkYtTG9naWMgaW50ZXJmYWNlLiAgVGhpcyB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcworCSAgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLCBhbmQgaWYgaXQgZG9lcywgaXQKKwkgIHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1hY2h6d2QuCisKKyMgUG93ZXJQQyBBcmNoaXRlY3R1cmUKKworY29uZmlnIDh4eF9XRFQKKwl0cmlzdGF0ZSAiTVBDOHh4IFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgOHh4CisKKyMgTUlQUyBBcmNoaXRlY3R1cmUKKworY29uZmlnIElORFlET0cKKwl0cmlzdGF0ZSAiSW5keS9JMiBIYXJkd2FyZSBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFNHSV9JUDIyCisJaGVscAorCSAgSGFyZHdhcmVkcml2ZXIgZm9yIHRoZSBJbmR5J3MvSTIncyB3YXRjaGRvZy4gVGhpcyBpcyBhCisJICB3YXRjaGRvZyB0aW1lciB0aGF0IHdpbGwgcmVib290IHRoZSBtYWNoaW5lIGFmdGVyIGEgNjAgc2Vjb25kCisJICB0aW1lciBleHBpcmVkIGFuZCBubyBwcm9jZXNzIGhhcyB3cml0dGVuIHRvIC9kZXYvd2F0Y2hkb2cgZHVyaW5nCisJICB0aGF0IHRpbWUuCisKKyMgUzM5MCBBcmNoaXRlY3R1cmUKKworY29uZmlnIFpWTV9XQVRDSERPRworCXRyaXN0YXRlICJ6L1ZNIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgQVJDSF9TMzkwCisJaGVscAorCSAgSUJNIHMvMzkwIGFuZCB6U2VyaWVzIG1hY2hpbmVzIHJ1bm5pbmcgdW5kZXIgei9WTSA1LjEgb3IgbGF0ZXIKKwkgIHByb3ZpZGUgYSB2aXJ0dWFsIHdhdGNoZG9nIHRpbWVyIHRvIHRoZWlyIGd1ZXN0IHRoYXQgY2F1c2UgYQorCSAgdXNlciBkZWZpbmUgQ29udHJvbCBQcm9ncmFtIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgYQorCSAgdGltZW91dC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdm13YXRjaGRvZy4KKworIyBTVVBFUkggQXJjaGl0ZWN0dXJlCisKK2NvbmZpZyBTSF9XRFQKKwl0cmlzdGF0ZSAiU3VwZXJIIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgU1VQRVJICisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyB3YXRjaGRvZyBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCB3YXRjaGRvZyBpbiB0aGUKKwkgIFN1cGVySCBwcm9jZXNzb3JzLiBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UgcHJvY2Vzc29ycyBhbmQgd2lzaAorCSAgdG8gaGF2ZSB3YXRjaGRvZyBzdXBwb3J0IGVuYWJsZWQsIHNheSBZLCBvdGhlcndpc2Ugc2F5IE4uCisKKwkgIEFzIGEgc2lkZSBub3RlLCBzYXlpbmcgWSBoZXJlIHdpbGwgYXV0b21hdGljYWxseSBib29zdCBIWiB0byAxMDAwCisJICBzbyB0aGF0IHRoZSB0aW1lciBoYXMgYSBjaGFuY2UgdG8gY2xlYXIgdGhlIG92ZXJmbG93IGNvdW50ZXIuIE9uCisJICBzbG93ZXIgc3lzdGVtcyAoc3VjaCBhcyB0aGUgU0gtMiBhbmQgU0gtMykgdGhpcyB3aWxsIGxpa2VseSB5aWVsZAorCSAgc29tZSBwZXJmb3JtYW5jZSBpc3N1ZXMuIEFzIHN1Y2gsIHRoZSBXRFQgc2hvdWxkIGJlIGF2b2lkZWQgaGVyZQorCSAgdW5sZXNzIGl0IGlzIGFic29sdXRlbHkgbmVjZXNzYXJ5LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaHdkdC4KKworIyBTUEFSQzY0IEFyY2hpdGVjdHVyZQorCitjb25maWcgV0FUQ0hET0dfQ1AxWFhYCisJdHJpc3RhdGUgIkNQMVhYWCBIYXJkd2FyZSBXYXRjaGRvZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgU1BBUkM2NCAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyB0aW1lcnMgcHJlc2VudCBvbgorCSAgU3VuIE1pY3Jvc3lzdGVtcyBDb21wYWN0UENJIG1vZGVscyBDUDE0MDAgYW5kIENQMTUwMC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3B3YXRjaGRvZy4KKworCSAgSWYgeW91IGRvIG5vdCBoYXZlIGEgQ29tcGFjdFBDSSBtb2RlbCBDUDE0MDAgb3IgQ1AxNTAwLCBvcgorCSAgYW5vdGhlciBVbHRyYVNQQVJDLUlJaS1jRW5naW5lIGJvYXJkc2V0IHdpdGggaGFyZHdhcmUgd2F0Y2hkb2csCisJICB5b3Ugc2hvdWxkIHNheSBOIHRvIHRoaXMgb3B0aW9uLgorCitjb25maWcgV0FUQ0hET0dfUklPCisJdHJpc3RhdGUgIlJJTyBIYXJkd2FyZSBXYXRjaGRvZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgU1BBUkM2NCAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGNhcGFiaWxpdHkgb24gU3VuIFJJTworCSAgbWFjaGluZXMuICBUaGUgd2F0Y2hkb2cgdGltZW91dCBwZXJpb2QgaXMgbm9ybWFsbHkgb25lIG1pbnV0ZSBidXQKKwkgIGNhbiBiZSBjaGFuZ2VkIHdpdGggYSBib290LXRpbWUgcGFyYW1ldGVyLgorCisjCisjIElTQS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworCitjb21tZW50ICJJU0EtYmFzZWQgV2F0Y2hkb2cgQ2FyZHMiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBJU0EKKworY29uZmlnIFBDV0FUQ0hET0cKKwl0cmlzdGF0ZSAiQmVya3NoaXJlIFByb2R1Y3RzIElTQS1QQyBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIEJlcmtzaGlyZSBQcm9kdWN0cyBJU0EtUEMgV2F0Y2hkb2cgY2FyZC4KKwkgIFRoaXMgY2FyZCBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsCisJICBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YKKwkgIHRpbWUuIFRoaXMgZHJpdmVyIGlzIGxpa2UgdGhlIFdEVDUwMSBkcml2ZXIgYnV0IGZvciBkaWZmZXJlbnQKKwkgIGhhcmR3YXJlLiBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3dhdGNoZG9nL3Bjd2Qtd2F0Y2hkb2cudHh0Pi4gVGhlIFBDCisJICB3YXRjaGRvZyBjYXJkcyBjYW4gYmUgb3JkZXJlZCBmcm9tIDxodHRwOi8vd3d3LmJlcmtwcm9kLmNvbS8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwY3dkLgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgTUlYQ09NV0QKKwl0cmlzdGF0ZSAiTWl4Y29tIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgSVNBCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE1peGNvbSBoYXJkd2FyZSB3YXRjaGRvZyBjYXJkcy4gIFRoaXMKKwkgIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwKKwkgIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZgorCSAgdGltZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWl4Y29td2QuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBXRFQKKwl0cmlzdGF0ZSAiV0RUIFdhdGNoZG9nIHRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgSVNBCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBXRFQ1MDBQIG9yIFdEVDUwMVAgd2F0Y2hkb2cgYm9hcmQsIHNheSBZIGhlcmUsCisJICBvdGhlcndpc2UgTi4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLCB3aGljaCBtZWFucworCSAgdGhhdCB5b3UgaGF2ZSB0byBpbmZvcm0gdGhlIGtlcm5lbCBhYm91dCB0aGUgSU8gcG9ydCBhbmQgSVJRIHRoYXQKKwkgIGlzIG5lZWRlZCAoeW91IGNhbiBkbyB0aGlzIHZpYSB0aGUgaW8gYW5kIGlycSBwYXJhbWV0ZXJzKQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ZHQuCisKK2NvbmZpZyBXRFRfNTAxCisJYm9vbCAiV0RUNTAxIGZlYXR1cmVzIgorCWRlcGVuZHMgb24gV0RUCisJaGVscAorCSAgU2F5aW5nIFkgaGVyZSBhbmQgY3JlYXRpbmcgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvdGVtcGVyYXR1cmUKKwkgIHdpdGggbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTMxICgibWFuIG1rbm9kIikgd2lsbCBnaXZlCisJICB5b3UgYSB0aGVybW9tZXRlciBpbnNpZGUgeW91ciBjb21wdXRlcjogcmVhZGluZyBmcm9tCisJICAvZGV2L3RlbXBlcmF0dXJlIHlpZWxkcyBvbmUgYnl0ZSwgdGhlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMKKwkgIEZhaHJlbmhlaXQuIFRoaXMgd29ya3Mgb25seSBpZiB5b3UgaGF2ZSBhIFdEVDUwMVAgd2F0Y2hkb2cgYm9hcmQKKwkgIGluc3RhbGxlZC4KKworCSAgSWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSBGYW4gVGFjaG9tZXRlciBvbiB0aGUgV0RUNTAxUCwgdGhlbiB5b3UKKwkgIGNhbiBkbyB0aGlzIHZpYSB0aGUgdGFjaG9tZXRlciBwYXJhbWV0ZXIuIE9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhCisJICBmYW4gdGFjaG9tZXRlciBhY3R1YWxseSBzZXQgdXAuCisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisKK2NvbW1lbnQgIlBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFBDSQorCitjb25maWcgUENJUENXQVRDSERPRworCXRyaXN0YXRlICJCZXJrc2hpcmUgUHJvZHVjdHMgUENJLVBDIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgQmVya3NoaXJlIFByb2R1Y3RzIFBDSS1QQyBXYXRjaGRvZyBjYXJkLgorCSAgVGhpcyBjYXJkIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwKKwkgIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZgorCSAgdGltZS4gVGhlIGNhcmQgY2FuIGFsc28gbW9uaXRvciB0aGUgaW50ZXJuYWwgdGVtcGVyYXR1cmUgb2YgdGhlIFBDLgorCSAgTW9yZSBpbmZvIGlzIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy5iZXJrcHJvZC5jb20vcGNpX3BjX3dhdGNoZG9nLmh0bT4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjd2RfcGNpLgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgV0RUUENJCisJdHJpc3RhdGUgIlBDSS1XRFQ1MDAvNTAxIFdhdGNoZG9nIHRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgUENJCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBQQ0ktV0RUNTAwLzUwMSB3YXRjaGRvZyBib2FyZCwgc2F5IFkgaGVyZSwgb3RoZXJ3aXNlIE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdkdF9wY2kuCisKK2NvbmZpZyBXRFRfNTAxX1BDSQorCWJvb2wgIlBDSS1XRFQ1MDEgZmVhdHVyZXMiCisJZGVwZW5kcyBvbiBXRFRQQ0kKKwloZWxwCisJICBTYXlpbmcgWSBoZXJlIGFuZCBjcmVhdGluZyBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi90ZW1wZXJhdHVyZQorCSAgd2l0aCBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzEgKCJtYW4gbWtub2QiKSB3aWxsIGdpdmUKKwkgIHlvdSBhIHRoZXJtb21ldGVyIGluc2lkZSB5b3VyIGNvbXB1dGVyOiByZWFkaW5nIGZyb20KKwkgIC9kZXYvdGVtcGVyYXR1cmUgeWllbGRzIG9uZSBieXRlLCB0aGUgdGVtcGVyYXR1cmUgaW4gZGVncmVlcworCSAgRmFocmVuaGVpdC4gVGhpcyB3b3JrcyBvbmx5IGlmIHlvdSBoYXZlIGEgUENJLVdEVDUwMSB3YXRjaGRvZyBib2FyZAorCSAgaW5zdGFsbGVkLgorCisJICBJZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIEZhbiBUYWNob21ldGVyIG9uIHRoZSBQQ0ktV0RUNTAxLCB0aGVuIHlvdQorCSAgY2FuIGRvIHRoaXMgdmlhIHRoZSB0YWNob21ldGVyIHBhcmFtZXRlci4gT25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEKKwkgIGZhbiB0YWNob21ldGVyIGFjdHVhbGx5IHNldCB1cC4KKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKworY29tbWVudCAiVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgVVNCCisKK2NvbmZpZyBVU0JQQ1dBVENIRE9HCisJdHJpc3RhdGUgIkJlcmtzaGlyZSBQcm9kdWN0cyBVU0ItUEMgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBVU0IKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBCZXJrc2hpcmUgUHJvZHVjdHMgVVNCLVBDIFdhdGNoZG9nIGNhcmQuCisJICBUaGlzIGNhcmQgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLAorCSAgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mCisJICB0aW1lLiBUaGUgY2FyZCBjYW4gYWxzbyBtb25pdG9yIHRoZSBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBvZiB0aGUgUEMuCisJICBNb3JlIGluZm8gaXMgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LmJlcmtwcm9kLmNvbS91c2JfcGNfd2F0Y2hkb2cuaHRtPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGN3ZF91c2IuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QyN2VmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBXYXRjaERvZyBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX1BDV0FUQ0hET0cpICs9IHBjd2Qubworb2JqLSQoQ09ORklHX0FDUVVJUkVfV0RUKSArPSBhY3F1aXJld2R0Lm8KK29iai0kKENPTkZJR19BRFZBTlRFQ0hfV0RUKSArPSBhZHZhbnRlY2h3ZHQubworb2JqLSQoQ09ORklHX0lCNzAwX1dEVCkgKz0gaWI3MDB3ZHQubworb2JqLSQoQ09ORklHX01JWENPTVdEKSArPSBtaXhjb213ZC5vCitvYmotJChDT05GSUdfU0N4MjAwX1dEVCkgKz0gc2N4MjAwX3dkdC5vCitvYmotJChDT05GSUdfNjBYWF9XRFQpICs9IHNiYzYweHh3ZHQubworb2JqLSQoQ09ORklHX1dEVCkgKz0gd2R0Lm8KK29iai0kKENPTkZJR19XRFRQQ0kpICs9IHdkdF9wY2kubworb2JqLSQoQ09ORklHXzIxMjg1X1dBVENIRE9HKSArPSB3ZHQyODUubworb2JqLSQoQ09ORklHXzk3N19XQVRDSERPRykgKz0gd2R0OTc3Lm8KK29iai0kKENPTkZJR19JOFhYX1RDTykgKz0gaTh4eF90Y28ubworb2JqLSQoQ09ORklHX01BQ0haX1dEVCkgKz0gbWFjaHp3ZC5vCitvYmotJChDT05GSUdfU0hfV0RUKSArPSBzaHdkdC5vCitvYmotJChDT05GSUdfUzNDMjQxMF9XQVRDSERPRykgKz0gczNjMjQxMF93ZHQubworb2JqLSQoQ09ORklHX1NBMTEwMF9XQVRDSERPRykgKz0gc2ExMTAwX3dkdC5vCitvYmotJChDT05GSUdfRVVST1RFQ0hfV0RUKSArPSBldXJvdGVjaHdkdC5vCitvYmotJChDT05GSUdfVzgzODc3Rl9XRFQpICs9IHc4Mzg3N2Zfd2R0Lm8KK29iai0kKENPTkZJR19XODM2MjdIRl9XRFQpICs9IHc4MzYyN2hmX3dkdC5vCitvYmotJChDT05GSUdfU0M1MjBfV0RUKSArPSBzYzUyMF93ZHQubworb2JqLSQoQ09ORklHX0FMSU03MTAxX1dEVCkgKz0gYWxpbTcxMDFfd2R0Lm8KK29iai0kKENPTkZJR19BTElNMTUzNV9XRFQpICs9IGFsaW0xNTM1X3dkdC5vCitvYmotJChDT05GSUdfU0MxMjAwX1dEVCkgKz0gc2MxMjAwd2R0Lm8KK29iai0kKENPTkZJR19XQUZFUl9XRFQpICs9IHdhZmVyNTgyM3dkdC5vCitvYmotJChDT05GSUdfQ1BVNV9XRFQpICs9IGNwdTV3ZHQubworb2JqLSQoQ09ORklHX0lORFlET0cpICs9IGluZHlkb2cubworb2JqLSQoQ09ORklHX1BDSVBDV0FUQ0hET0cpICs9IHBjd2RfcGNpLm8KK29iai0kKENPTkZJR19VU0JQQ1dBVENIRE9HKSArPSBwY3dkX3VzYi5vCitvYmotJChDT05GSUdfSVhQNFhYX1dBVENIRE9HKSArPSBpeHA0eHhfd2R0Lm8KK29iai0kKENPTkZJR19JWFAyMDAwX1dBVENIRE9HKSArPSBpeHAyMDAwX3dkdC5vCitvYmotJChDT05GSUdfOHh4X1dEVCkgKz0gbXBjOHh4X3dkdC5vCisKKyMgT25seSBvbmUgd2F0Y2hkb2cgY2FuIHN1Y2NlZWQuIFdlIHByb2JlIHRoZSBoYXJkd2FyZSB3YXRjaGRvZworIyBkcml2ZXJzIGZpcnN0LCB0aGVuIHRoZSBzb2Z0ZG9nIGRyaXZlci4gIFRoaXMgbWVhbnMgaWYgeW91ciBoYXJkd2FyZQorIyB3YXRjaGRvZyBkaWVzIG9yIGlzICdib3Jyb3dlZCcgZm9yIHNvbWUgcmVhc29uIHRoZSBzb2Z0d2FyZSB3YXRjaGRvZworIyBzdGlsbCBnaXZlcyB5b3Ugc29tZSBjb3Zlci4KKworb2JqLSQoQ09ORklHX1NPRlRfV0FUQ0hET0cpICs9IHNvZnRkb2cubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hY3F1aXJld2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMDIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hY3F1aXJld2R0LmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKglBY3F1aXJlIFNpbmdsZSBCb2FyZCBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIKKyAqCisgKiAgICAgIEJhc2VkIG9uIHdkdC5jLiBPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogICAgICAxNC1EZWMtMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAgICAgICAgICBBZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorICogICAgICAgICAgQ2FuJ3QgYWRkIHRpbWVvdXQgLSBkcml2ZXIgZG9lc24ndCBhbGxvdyBjaGFuZ2luZyB2YWx1ZQorICovCisKKy8qCisgKglUaGVvcnkgb2YgT3BlcmF0aW9uOgorICoJCVRoZSBXYXRjaC1Eb2cgVGltZXIgaXMgcHJvdmlkZWQgdG8gZW5zdXJlIHRoYXQgc3RhbmRhbG9uZQorICoJCVN5c3RlbXMgY2FuIGFsd2F5cyByZWNvdmVyIGZyb20gY2F0YXN0cm9waGljIGNvbmRpdGlvbnMgdGhhdAorICoJCWNhdXNlZCB0aGUgQ1BVIHRvIGNyYXNoLiBUaGlzIGNvbmRpdGlvbiBtYXkgaGF2ZSBvY2N1cmVkIGJ5CisgKgkJZXh0ZXJuYWwgRU1JIG9yIGEgc29mdHdhcmUgYnVnLiBXaGVuIHRoZSBDUFUgc3RvcHMgd29ya2luZworICoJCWNvcnJlY3RseSwgaGFyZHdhcmUgb24gdGhlIGJvYXJkIHdpbGwgZWl0aGVyIHBlcmZvcm0gYSBoYXJkd2FyZQorICoJCXJlc2V0IChjb2xkIGJvb3QpIG9yIGEgbm9uLW1hc2thYmxlIGludGVycnVwdCAoTk1JKSB0byBicmluZyB0aGUKKyAqCQlzeXN0ZW0gYmFjayB0byBhIGtub3duIHN0YXRlLgorICoKKyAqCQlUaGUgV2F0Y2gtRG9nIFRpbWVyIGlzIGNvbnRyb2xsZWQgYnkgdHdvIEkvTyBQb3J0cy4KKyAqCQkgIDQ0MyBoZXgJLSBSZWFkCS0gRW5hYmxlIG9yIHJlZnJlc2ggdGhlIFdhdGNoLURvZyBUaW1lcgorICoJCSAgMDQzIGhleAktIFJlYWQJLSBEaXNhYmxlIHRoZSBXYXRjaC1Eb2cgVGltZXIKKyAqCisgKgkJVG8gZW5hYmxlIHRoZSBXYXRjaC1Eb2cgVGltZXIsIGEgcmVhZCBmcm9tIEkvTyBwb3J0IDQ0M2ggbXVzdAorICoJCWJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVuYWJsZSBhbmQgYWN0aXZhdGUgdGhlIGNvdW50ZG93biB0aW1lcgorICoJCXdoaWNoIHdpbGwgZXZlbnR1YWxseSB0aW1lIG91dCBhbmQgZWl0aGVyIHJlc2V0IHRoZSBDUFUgb3IgY2F1c2UKKyAqCQlhbiBOTUkgZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5nIG9mIGEganVtcGVyLiBUbyBlbnN1cmUgdGhhdCB0aGlzCisgKgkJcmVzZXQgY29uZGl0aW9uIGRvZXMgbm90IG9jY3VyLCB0aGUgV2F0Y2gtRG9nIFRpbWVyIG11c3QgYmUKKyAqCQlwZXJpb2RpY2FsbHkgcmVmcmVzaGVkIGJ5IHJlYWRpbmcgdGhlIHNhbWUgSS9PIHBvcnQgNDQzaC4KKyAqCQlUaGUgV2F0Y2gtRG9nIFRpbWVyIGlzIGRpc2FibGVkIGJ5IHJlYWRpbmcgSS9PIHBvcnQgMDQzaC4KKyAqCisgKgkJVGhlIFdhdGNoLURvZyBUaW1lciBUaW1lLU91dCBQZXJpb2QgaXMgc2V0IHZpYSBqdW1wZXJzLgorICoJCUl0IGNhbiBiZSAxLCAyLCAxMCwgMjAsIDExMCBvciAyMjAgc2Vjb25kcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBXQVRDSERPR19OQU1FICJBY3F1aXJlIFdEVCIKKyNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgMAkvKiBUaGVyZSBpcyBubyB3YXkgdG8gc2VlIHdoYXQgdGhlIGNvcnJlY3QgdGltZS1vdXQgcGVyaW9kIGlzICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFjcV9pc19vcGVuOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworCisvKgorICoJWW91IG11c3Qgc2V0IHRoZXNlIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuCisgKi8KKworc3RhdGljIGludCB3ZHRfc3RvcCA9IDB4NDM7Cittb2R1bGVfcGFyYW0od2R0X3N0b3AsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9zdG9wLCAiQWNxdWlyZSBXRFQgJ3N0b3AnIGlvIHBvcnQgKGRlZmF1bHQgMHg0MykiKTsKKworc3RhdGljIGludCB3ZHRfc3RhcnQgPSAweDQ0MzsKK21vZHVsZV9wYXJhbSh3ZHRfc3RhcnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9zdGFydCwgIkFjcXVpcmUgV0RUICdzdGFydCcgaW8gcG9ydCAoZGVmYXVsdCAweDQ0MykiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglLZXJuZWwgbWV0aG9kcy4KKyAqLworCitzdGF0aWMgdm9pZCBhY3Ffa2VlcGFsaXZlKHZvaWQpCit7CisJLyogV3JpdGUgYSB3YXRjaGRvZyB2YWx1ZSAqLworCWluYl9wKHdkdF9zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcV9zdG9wKHZvaWQpCit7CisJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwlpbmJfcCh3ZHRfc3RvcCk7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nLgorICovCisKK3N0YXRpYyBzc2l6ZV90IGFjcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBub3RlOiBqdXN0IGluIGNhc2Ugc29tZW9uZSB3cm90ZSB0aGUgbWFnaWMgY2hhcmFjdGVyCisJCQkgKiBmaXZlIG1vbnRocyBhZ28uLi4gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogV2VsbCwgYW55aG93IHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZXR1cm4gdGhhdCBmYXZvdXIgKi8KKwkJYWNxX2tlZXBhbGl2ZSgpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYWNxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9CisJeworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJBY3F1aXJlIFdEVCIsCisJfTsKKworCXN3aXRjaChjbWQpCisJeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCSAgcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJICBhY3Ffa2VlcGFsaXZlKCk7CisJICByZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkgIHJldHVybiBwdXRfdXNlcihXQVRDSERPR19IRUFSVEJFQVQsIHApOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCXsKKwkgICAgaWYgKGdldF91c2VyKG9wdGlvbnMsIHApKQorCSAgICAgIHJldHVybiAtRUZBVUxUOworCisJICAgIGlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpCisJICAgIHsKKwkgICAgICBhY3Ffc3RvcCgpOworCSAgICAgIHJldHZhbCA9IDA7CisJICAgIH0KKworCSAgICBpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpCisJICAgIHsKKwkgICAgICBhY3Ffa2VlcGFsaXZlKCk7CisJICAgICAgcmV0dmFsID0gMDsKKwkgICAgfQorCisJICAgIHJldHVybiByZXR2YWw7CisJfQorCisJZGVmYXVsdDoKKwkgIHJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdGF0aWMgaW50IGFjcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZhY3FfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBBY3RpdmF0ZSAqLworCWFjcV9rZWVwYWxpdmUoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYWNxX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJYWNxX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCWFjcV9rZWVwYWxpdmUoKTsKKwl9CisJY2xlYXJfYml0KDAsICZhY3FfaXNfb3Blbik7CisJZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQgYWNxX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJYWNxX3N0b3AoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3FfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGFjcV93cml0ZSwKKwkuaW9jdGwJCT0gYWNxX2lvY3RsLAorCS5vcGVuCQk9IGFjcV9vcGVuLAorCS5yZWxlYXNlCT0gYWNxX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGFjcV9taXNjZGV2PQoreworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZhY3FfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIGNhcmQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhY3Ffbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gYWNxX25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY3FfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJXRFQgZHJpdmVyIGZvciBBY3F1aXJlIHNpbmdsZSBib2FyZCBjb21wdXRlciBpbml0aWFsaXNpbmcuXG4iKTsKKworCWlmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RvcCwgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkJd2R0X3N0b3ApOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RhcnQsIDEsIFdBVENIRE9HX05BTUUpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQl3ZHRfc3RhcnQpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIHVucmVnX3N0b3A7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhY3Ffbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gdW5yZWdfcmVnaW9uczsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZhY3FfbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIHVucmVnX3JlYm9vdDsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiAobm93YXlvdXQ9JWQpXG4iLAorCQlub3dheW91dCk7CisKKwlyZXR1cm4gMDsKKwordW5yZWdfcmVib290OgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhY3Ffbm90aWZpZXIpOwordW5yZWdfcmVnaW9uczoKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsIDEpOwordW5yZWdfc3RvcDoKKwlpZiAod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KQorCQlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RvcCwgMSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjcV9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZhY3FfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmFjcV9ub3RpZmllcik7CisJaWYod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KQorCQlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RvcCwxKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsMSk7Cit9CisKK21vZHVsZV9pbml0KGFjcV9pbml0KTsKK21vZHVsZV9leGl0KGFjcV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgV29vZGhvdXNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFjcXVpcmUgSW5jLiBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3M2M4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hZHZhbnRlY2h3ZHQuYwpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqCUFkdmFudGVjaCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV0RUIGRyaXZlcgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CisgKgorICoJQmFzZWQgb24gYWNxdWlyZXdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgorICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCBub3IgQ3ltcnVOZXQgTHRkLiBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NSAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCTE0LURlYy0yMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqCSAgICBBZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorICoKKyAqCTE2LU9jdC0yMDAyIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPgorICoJICAgIENsZWFuIHVwIGlvY3RscywgY2xlYW4gdXAgaW5pdCArIGV4aXQsIGFkZCBleHBlY3QgY2xvc2Ugc3VwcG9ydCwKKyAqCSAgICBhZGQgd2R0X3N0YXJ0IGFuZCB3ZHRfc3RvcCBhcyBwYXJhbWV0ZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgIkFkdmFudGVjaCBXRFQiCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhZHZ3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIGFkdl9leHBlY3RfY2xvc2U7CisKKy8qCisgKglZb3UgbXVzdCBzZXQgdGhlc2UgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4KKyAqCisgKglUbyBlbmFibGUgb3IgcmVzdGFydCwgd3JpdGUgdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyAoMSB0byA2MykKKyAqCXRvIEkvTyBwb3J0IHdkdF9zdGFydC4gIFRvIGRpc2FibGUsIHJlYWQgSS9PIHBvcnQgd2R0X3N0b3AuCisgKglCb3RoIGFyZSAweDQ0MyBmb3IgbW9zdCBib2FyZHMgKHRlc3RlZCBvbiBhIFBDQS02Mjc2VkUtMDBCMSksIGJ1dAorICoJY2hlY2sgeW91ciBtYW51YWwgKGF0IGxlYXN0IHRoZSBQQ0EtNjE1OSBzZWVtcyB0byBiZSBkaWZmZXJlbnQgLQorICoJdGhlIG1hbnVhbCBzYXlzIHdkdF9zdG9wIGlzIDB4NDMsIG5vdCAweDQ0MykuCisgKgkoMHg0MyBpcyBhbHNvIGEgd3JpdGUtb25seSBjb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgODI1NCB0aW1lciEpCisgKi8KKworc3RhdGljIGludCB3ZHRfc3RvcCA9IDB4NDQzOworbW9kdWxlX3BhcmFtKHdkdF9zdG9wLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfc3RvcCwgIkFkdmFudGVjaCBXRFQgJ3N0b3AnIGlvIHBvcnQgKGRlZmF1bHQgMHg0NDMpIik7CisKK3N0YXRpYyBpbnQgd2R0X3N0YXJ0ID0gMHg0NDM7Cittb2R1bGVfcGFyYW0od2R0X3N0YXJ0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfc3RhcnQsICJBZHZhbnRlY2ggV0RUICdzdGFydCcgaW8gcG9ydCAoZGVmYXVsdCAweDQ0MykiKTsKKworc3RhdGljIGludCB0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsJLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuIDE8PSB0aW1lb3V0IDw9NjMsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglLZXJuZWwgbWV0aG9kcy4KKyAqLworCitzdGF0aWMgdm9pZAorYWR2d2R0X3Bpbmcodm9pZCkKK3sKKwkvKiBXcml0ZSBhIHdhdGNoZG9nIHZhbHVlICovCisJb3V0Yl9wKHRpbWVvdXQsIHdkdF9zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkCithZHZ3ZHRfZGlzYWJsZSh2b2lkKQoreworCWluYl9wKHdkdF9zdG9wKTsKK30KKworc3RhdGljIHNzaXplX3QKK2FkdndkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQlhZHZfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJYWR2X2V4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCWFkdndkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorYWR2d2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld190aW1lb3V0OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIkFkdmFudGVjaCBXRFQiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJICBicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkgIHJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCSAgYWR2d2R0X3BpbmcoKTsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCSAgaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJICByZXR1cm4gLUVGQVVMVDsKKwkgIGlmICgobmV3X3RpbWVvdXQgPCAxKSB8fCAobmV3X3RpbWVvdXQgPiA2MykpCisJCSAgcmV0dXJuIC1FSU5WQUw7CisJICB0aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisJICBhZHZ3ZHRfcGluZygpOworCSAgLyogRmFsbCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCSAgcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCXsKKwkgIGludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJICBpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCisJICAgIHJldHVybiAtRUZBVUxUOworCisJICBpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJICAgIGFkdndkdF9kaXNhYmxlKCk7CisJICAgIHJldHZhbCA9IDA7CisJICB9CisKKwkgIGlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCSAgICBhZHZ3ZHRfcGluZygpOworCSAgICByZXR2YWwgPSAwOworCSAgfQorCisJICByZXR1cm4gcmV0dmFsOworCX0KKworCWRlZmF1bHQ6CisJICByZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWR2d2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmFkdndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKgorCSAqCUFjdGl2YXRlCisJICovCisKKwlhZHZ3ZHRfcGluZygpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAorYWR2d2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChhZHZfZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCWFkdndkdF9kaXNhYmxlKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQlhZHZ3ZHRfcGluZygpOworCX0KKwljbGVhcl9iaXQoMCwgJmFkdndkdF9pc19vcGVuKTsKKwlhZHZfZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQKK2FkdndkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJYWR2d2R0X2Rpc2FibGUoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZHZ3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGFkdndkdF93cml0ZSwKKwkuaW9jdGwJCT0gYWR2d2R0X2lvY3RsLAorCS5vcGVuCQk9IGFkdndkdF9vcGVuLAorCS5yZWxlYXNlCT0gYWR2d2R0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGFkdndkdF9taXNjZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZhZHZ3ZHRfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWR2d2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gYWR2d2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorYWR2d2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgQWR2YW50ZWNoIHNpbmdsZSBib2FyZCBjb21wdXRlciBpbml0aWFsaXNpbmcuXG4iKTsKKworCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gNjMpIHsKKwkJdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDE8PXg8PTYzLCB1c2luZyAlZFxuIiwKKwkJCXRpbWVvdXQpOworCX0KKworCWlmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RvcCwgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkJd2R0X3N0b3ApOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RhcnQsIDEsIFdBVENIRE9HX05BTUUpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQl3ZHRfc3RhcnQpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIHVucmVnX3N0b3A7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhZHZ3ZHRfbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gdW5yZWdfcmVnaW9uczsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZhZHZ3ZHRfbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIHVucmVnX3JlYm9vdDsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQl0aW1lb3V0LCBub3dheW91dCk7CisKK291dDoKKwlyZXR1cm4gcmV0OwordW5yZWdfcmVib290OgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhZHZ3ZHRfbm90aWZpZXIpOwordW5yZWdfcmVnaW9uczoKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsIDEpOwordW5yZWdfc3RvcDoKKwlpZiAod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KQorCQlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RvcCwgMSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorYWR2d2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmFkdndkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmYWR2d2R0X25vdGlmaWVyKTsKKwlpZih3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLDEpOworCXJlbGVhc2VfcmVnaW9uKHdkdF9zdGFydCwxKTsKK30KKworbW9kdWxlX2luaXQoYWR2d2R0X2luaXQpOworbW9kdWxlX2V4aXQoYWR2d2R0X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJlayBNaWNoYWxraWV3aWN6IDxtYXJla21AbGludXgub3JnLnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBZHZhbnRlY2ggU2luZ2xlIEJvYXJkIENvbXB1dGVyIFdEVCBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltMTUzNV93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltMTUzNV93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRjYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICoJV2F0Y2hkb2cgZm9yIHRoZSA3MTAxIFBNVSB2ZXJzaW9uIGZvdW5kIGluIHRoZSBBTGkgTTE1MzUgY2hpcHNldHMKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgV0FUQ0hET0dfTkFNRSAiQUxpX00xNTM1IgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworCisvKiBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFsaV9pc19vcGVuOworc3RhdGljIGNoYXIgYWxpX2V4cGVjdF9yZWxlYXNlOworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICphbGlfcGNpOworc3RhdGljIHUzMiBhbGlfdGltZW91dF9iaXRzOwkvKiBzdG9yZXMgdGhlIGNvbXB1dGVkIHRpbWVvdXQgKi8KK3N0YXRpYyBzcGlubG9ja190IGFsaV9sb2NrOwkvKiBHdWFyZHMgdGhlIGhhcmR3YXJlICovCisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuICgwPHRpbWVvdXQ8MTgwMDAsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglhbGlfc3RhcnQJLQlzdGFydCB3YXRjaGRvZyBjb3VudGRvd24KKyAqCisgKglTdGFydHMgdGhlIHRpbWVyIHJ1bm5pbmcgcHJvdmlkaW5nIHRoZSB0aW1lciBoYXMgYSBjb3VudGVyCisgKgljb25maWd1cmF0aW9uIHNldC4KKyAqLworCitzdGF0aWMgdm9pZCBhbGlfc3RhcnQodm9pZCkKK3sKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrKCZhbGlfbG9jayk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWxpX3BjaSwgMHhDQywgJnZhbCk7CisJdmFsICY9IH4weDNGOwkvKiBNYXNrIGNvdW50ICovCisJdmFsIHw9ICgxPDwyNSkgfCBhbGlfdGltZW91dF9iaXRzOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWxpX3BjaSwgMHhDQywgdmFsKTsKKworCXNwaW5fdW5sb2NrKCZhbGlfbG9jayk7Cit9CisKKy8qCisgKglhbGlfc3RvcAktCXN0b3AgdGhlIHRpbWVyIGNvdW50ZG93bgorICoKKyAqCVN0b3AgdGhlIEFMaSB3YXRjaGRvZyBjb3VudGRvd24KKyAqLworCitzdGF0aWMgdm9pZCBhbGlfc3RvcCh2b2lkKQoreworCXUzMiB2YWw7CisKKwlzcGluX2xvY2soJmFsaV9sb2NrKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhbGlfcGNpLCAweENDLCAmdmFsKTsKKwl2YWwgJj0gfjB4M0Y7CS8qIE1hc2sgY291bnQgdG8gemVybyAoZGlzYWJsZWQpICovCisJdmFsICY9IH4oMTw8MjUpOy8qIGFuZCBmb3Igc2FmZXR5IG1hc2sgdGhlIHJlc2V0IGVuYWJsZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWxpX3BjaSwgMHhDQywgdmFsKTsKKworCXNwaW5fdW5sb2NrKCZhbGlfbG9jayk7Cit9CisKKy8qCisgKglhbGlfa2VlcGFsaXZlCS0Jc2VuZCBhIGtlZXBhbGl2ZSB0byB0aGUgd2F0Y2hkb2cKKyAqCisgKiAgICAgIFNlbmQgYSBrZWVwYWxpdmUgdG8gdGhlIHRpbWVyIChhY3R1YWxseSB3ZSByZXN0YXJ0IHRoZSB0aW1lcikuCisgKi8KKworc3RhdGljIHZvaWQgYWxpX2tlZXBhbGl2ZSh2b2lkKQoreworCWFsaV9zdGFydCgpOworfQorCisvKgorICoJYWxpX3NldHRpbWVyCS0JY29tcHV0ZSB0aGUgdGltZXIgcmVsb2FkIHZhbHVlCisgKglAdDogdGltZSBpbiBzZWNvbmRzCisgKgorICoJQ29tcHV0ZXMgdGhlIHRpbWVvdXQgdmFsdWVzIG5lZWRlZAorICovCisKK3N0YXRpYyBpbnQgYWxpX3NldHRpbWVyKGludCB0KQoreworCWlmKHQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmKHQgPCA2MCkKKwkJYWxpX3RpbWVvdXRfYml0cyA9IHR8KDE8PDYpOworCWVsc2UgaWYodCA8IDM2MDApCisJCWFsaV90aW1lb3V0X2JpdHMgPSAodC82MCl8KDE8PDcpOworCWVsc2UgaWYodCA8IDE4MDAwKQorCQlhbGlfdGltZW91dF9iaXRzID0gKHQvMzAwKXwoMTw8Nil8KDE8PDcpOworCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisKKwl0aW1lb3V0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCisvKgorICoJYWxpX3dyaXRlCS0Jd3JpdGVzIHRvIEFMaSB3YXRjaGRvZworICoJQGZpbGU6IGZpbGUgZnJvbSBWRlMKKyAqCUBkYXRhOiB1c2VyIGFkZHJlc3Mgb2YgZGF0YQorICoJQGxlbjogbGVuZ3RoIG9mIGRhdGEKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBmaWxlIG9mZnNldAorICoKKyAqCUhhbmRsZSBhIHdyaXRlIHRvIHRoZSBBTGkgd2F0Y2hkb2cuIFdyaXRpbmcgdG8gdGhlIGZpbGUgcGluZ3MKKyAqCXRoZSB3YXRjaGRvZyBhbmQgcmVzZXRzIGl0LiBXcml0aW5nIHRoZSBtYWdpYyAnVicgc2VxdWVuY2UgYWxsb3dzCisgKgl0aGUgbmV4dCBjbG9zZSB0byB0dXJuIG9mZiB0aGUgd2F0Y2hkb2cuCisgKi8KKworc3RhdGljIHNzaXplX3QgYWxpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqIHBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJYWxpX2V4cGVjdF9yZWxlYXNlID0gMDsKKworCQkJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYoZ2V0X3VzZXIoYywgZGF0YStpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlhbGlfZXhwZWN0X3JlbGVhc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCS8qIHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZWxvYWQgdGhlIHRpbWVyICovCisJCWFsaV9zdGFydCgpOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKgorICoJYWxpX2lvY3RsCS0JaGFuZGxlIHdhdGNoZG9nIGlvY3RscworICoJQGlub2RlOiBWRlMgaW5vZGUKKyAqCUBmaWxlOiBWRlMgZmlsZSBwb2ludGVyCisgKglAY21kOiBpb2N0bCBudW1iZXIKKyAqCUBhcmc6IGFyZ3VtZW50cyB0byB0aGUgaW9jdGwKKyAqCisgKglIYW5kbGUgdGhlIHdhdGNoZG9nIGlvY3RscyBzdXBwb3J0ZWQgYnkgdGhlIEFMaSBkcml2ZXIuIFJlYWxseQorICoJd2Ugd2FudCBhbiBleHRlbnNpb24gdG8gZW5hYmxlIGlycSBhY2sgbW9uaXRvcmluZyBhbmQgdGhlIGxpa2UKKyAqLworCitzdGF0aWMgaW50IGFsaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9CQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0JMCwKKwkJLmlkZW50aXR5ID0JCSJBTGkgTTE1MzUgV2F0Y2hEb2cgVGltZXIiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwKKwkJCQlzaXplb2YgKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJYWxpX2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmIChnZXRfdXNlciAobmV3X29wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCWFsaV9zdG9wKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCWFsaV9zdGFydCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXsKKwkJCWludCBuZXdfdGltZW91dDsKKworCQkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGFsaV9zZXR0aW1lcihuZXdfdGltZW91dCkpCisJCQkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkJCWFsaV9rZWVwYWxpdmUoKTsKKwkJCS8qIEZhbGwgKi8KKwkJfQorCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKy8qCisgKglhbGlfb3BlbgktCWhhbmRsZSBvcGVuIG9mIGFsaSB3YXRjaGRvZworICoJQGlub2RlOiBpbm9kZSBmcm9tIFZGUworICoJQGZpbGU6IGZpbGUgZnJvbSBWRlMKKyAqCisgKglPcGVuIHRoZSBBTGkgd2F0Y2hkb2cgZGV2aWNlLiBFbnN1cmUgb25seSBvbmUgcGVyc29uIG9wZW5zIGl0CisgKglhdCBhIHRpbWUuIEFsc28gc3RhcnQgdGhlIHdhdGNoZG9nIHJ1bm5pbmcuCisgKi8KKworc3RhdGljIGludCBhbGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmFsaV9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEFjdGl2YXRlICovCisJYWxpX3N0YXJ0KCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKgorICoJYWxpX3JlbGVhc2UJLQljbG9zZSBhbiBBTGkgd2F0Y2hkb2cKKyAqCUBpbm9kZTogaW5vZGUgZnJvbSBWRlMKKyAqCUBmaWxlOiBmaWxlIGZyb20gVkZTCisgKgorICoJQ2xvc2UgdGhlIEFMaSB3YXRjaGRvZyBkZXZpY2UuIEFjdHVhbCBzaHV0ZG93biBvZiB0aGUgdGltZXIKKyAqCW9ubHkgb2NjdXJzIGlmIHRoZSBtYWdpYyBzZXF1ZW5jZSBoYXMgYmVlbiBzZXQuCisgKi8KKworc3RhdGljIGludCBhbGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqICAgICAgU2h1dCBvZmYgdGhlIHRpbWVyLgorCSAqLworCWlmIChhbGlfZXhwZWN0X3JlbGVhc2UgPT0gNDIpIHsKKwkJYWxpX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCWFsaV9rZWVwYWxpdmUoKTsKKwl9CisJY2xlYXJfYml0KDAsICZhbGlfaXNfb3Blbik7CisJYWxpX2V4cGVjdF9yZWxlYXNlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWFsaV9ub3RpZnlfc3lzCS0JU3lzdGVtIGRvd24gbm90aWZpZXIKKyAqCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCisKK3N0YXRpYyBpbnQgYWxpX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQlhbGlfc3RvcCgpOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCURhdGEgZm9yIFBDSSBkcml2ZXIgaW50ZXJmYWNlCisgKgorICoJVGhpcyBkYXRhIG9ubHkgZXhpc3RzIGZvciBleHBvcnRpbmcgdGhlIHN1cHBvcnRlZAorICoJUENJIGlkcyB2aWEgTU9EVUxFX0RFVklDRV9UQUJMRS4gIFdlIGRvIG5vdCBhY3R1YWxseQorICoJcmVnaXN0ZXIgYSBwY2lfZHJpdmVyLCBiZWNhdXNlIHNvbWVvbmUgZWxzZSBtaWdodCBvbmUgZGF5CisgKgl3YW50IHRvIHJlZ2lzdGVyIGFub3RoZXIgZHJpdmVyIG9uIHRoZSBzYW1lIFBDSSBpZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQUwsIDE1MzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFsaV9wY2lfdGJsKTsKKworLyoKKyAqCWFsaV9maW5kX3dhdGNoZG9nCS0JZmluZCBhIDE1MzUgYW5kIDcxMDEKKyAqCisgKglTY2FucyB0aGUgUENJIGhhcmR3YXJlIGZvciBhIDE1MzUgc2VyaWVzIGJyaWRnZSBhbmQgbWF0Y2hpbmcgNzEwMQorICoJd2F0Y2hkb2cgZGV2aWNlLiBUaGlzIG1heSBiZSBvdmVydGlnaHQgYnV0IGl0IGlzIGJldHRlciB0byBiZSBzYWZlCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYWxpX2ZpbmRfd2F0Y2hkb2codm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1MzIgd2RvZzsKKworCS8qIENoZWNrIGZvciBhIDE1MzUgc2VyaWVzIGJyaWRnZSAqLworCXBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgMHgxNTM1LCBOVUxMKTsKKwlpZihwZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgZm9yIHRoZSBhIDcxMDEgUE1VICovCisJcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAweDcxMDEsIE5VTEwpOworCWlmKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZihwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwlhbGlfcGNpID0gcGRldjsKKworCS8qCisJICoJSW5pdGlhbGl6ZSB0aGUgdGltZXIgYml0cworCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweENDLCAmd2RvZyk7CisKKwl3ZG9nICY9IH4weDNGOwkJLyogVGltZXIgYml0cyAqLworCXdkb2cgJj0gfigoMTw8MjcpfCgxPDwyNil8KDE8PDI1KXwoMTw8MjQpKTsJLyogSXNzdWVkIGV2ZW50cyAqLworCXdkb2cgJj0gfigoMTw8MTYpfCgxPDwxMyl8KDE8PDEyKXwoMTw8MTEpfCgxPDwxMCl8KDE8PDkpKTsJLyogTm8gbW9uaXRvciBiaXRzICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4Q0MsIHdkb2cpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFsaV9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLndyaXRlID0JYWxpX3dyaXRlLAorCS5pb2N0bCA9CWFsaV9pb2N0bCwKKwkub3BlbiA9CQlhbGlfb3BlbiwKKwkucmVsZWFzZSA9CWFsaV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGFsaV9taXNjZGV2ID0geworCS5taW5vciA9CVdBVENIRE9HX01JTk9SLAorCS5uYW1lID0JCSJ3YXRjaGRvZyIsCisJLmZvcHMgPQkJJmFsaV9mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhbGlfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPQlhbGlfbm90aWZ5X3N5cywKK307CisKKy8qCisgKgl3YXRjaGRvZ19pbml0CS0JbW9kdWxlIGluaXRpYWxpc2VyCisgKgorICoJU2NhbiBmb3IgYSBzdWl0YWJsZSB3YXRjaGRvZyBhbmQgaWYgc28gaW5pdGlhbGl6ZSBpdC4gUmV0dXJuIGFuIGVycm9yCisgKglpZiB3ZSBjYW5ub3QsIHRoZSBlcnJvciBjYXVzZXMgdGhlIG1vZHVsZSB0byB1bmxvYWQKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pbml0KCZhbGlfbG9jayk7CisKKwkvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgaXMgdGhlcmUgKi8KKwlpZiAoYWxpX2ZpbmRfd2F0Y2hkb2coKSAhPSAwKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENoZWNrIHRoYXQgdGhlIHRpbWVvdXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAodGltZW91dCA8IDEgfHwgdGltZW91dCA+PSAxODAwMCkgeworCQl0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAwPHRpbWVvdXQ8MTgwMDAsIHVzaW5nICVkXG4iLAorCQkJdGltZW91dCk7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSB3YXRjaGRvZydzIHRpbWVvdXQgKi8KKwlhbGlfc2V0dGltZXIodGltZW91dCk7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZhbGlfbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmYWxpX25vdGlmaWVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gdW5yZWdfbWlzY2RldjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit1bnJlZ19taXNjZGV2OgorCW1pc2NfZGVyZWdpc3RlcigmYWxpX21pc2NkZXYpOworCWdvdG8gb3V0OworfQorCisvKgorICoJd2F0Y2hkb2dfZXhpdAktCW1vZHVsZSBkZS1pbml0aWFsaXNlcgorICoKKyAqCUNhbGxlZCB3aGlsZSB1bmxvYWRpbmcgYSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHdhdGNoZG9nIG1vZHVsZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgd2F0Y2hkb2dfZXhpdCh2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyIGJlZm9yZSB3ZSBsZWF2ZSAqLworCWFsaV9zdG9wKCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmFsaV9ub3RpZmllcik7CisJbWlzY19kZXJlZ2lzdGVyKCZhbGlfbWlzY2Rldik7Cit9CisKK21vZHVsZV9pbml0KHdhdGNoZG9nX2luaXQpOworbW9kdWxlX2V4aXQod2F0Y2hkb2dfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMaSBNMTUzNSBQTVUgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjMDkxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltNzEwMV93ZHQuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqCUFMaSBNNzEwMSBQTVUgQ29tcHV0ZXIgV2F0Y2hkb2cgVGltZXIgZHJpdmVyCisgKgorICoJQmFzZWQgb24gdzgzODc3Zl93ZHQuYyBieSBTY290dCBKZW5uaW5ncyA8bGludXhkcml2ZXJzQG9yby5uZXQ+CisgKglhbmQgdGhlIENvYmFsdCBrZXJuZWwgV0RUIHRpbWVyIGRyaXZlciBieSBUaW0gSG9ja2luCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aG9ja2luQGNvYmFsdG5ldC5jb20+CisgKgorICoJKGMpMjAwMiBTdGV2ZSBIaWxsIDxzdGV2ZUBuYXZhaG8uY28udWs+CisgKgorICogIFRoaXMgV0RUIGRyaXZlciBpcyBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIExpbnV4IFdEVAorICogIGRyaXZlcnMgaW4gdGhhdCB0aGUgZHJpdmVyIHdpbGwgcGluZyB0aGUgd2F0Y2hkb2cgYnkgaXRzZWxmLAorICogIGJlY2F1c2UgdGhpcyBwYXJ0aWN1bGFyIFdEVCBoYXMgYSB2ZXJ5IHNob3J0IHRpbWVvdXQgKDEuNgorICogIHNlY29uZHMpIGFuZCBpdCB3b3VsZCBiZSBpbnNhbmUgdG8gY291bnQgb24gYW55IHVzZXJzcGFjZQorICogIGRhZW1vbiBhbHdheXMgZ2V0dGluZyBzY2hlZHVsZWQgd2l0aGluIHRoYXQgdGltZSBmcmFtZS4KKyAqCisgKiAgQWRkaXRpb25zOgorICogICBBdWcgMjMsIDIwMDQgLSBBZGRlZCB1c2VfZ3BpbyBtb2R1bGUgcGFyYW1ldGVyIGZvciB1c2Ugb24gcmV2aXNpb24gYTFkIFBNVXMKKyAqICAgICAgICAgICAgICAgICAgZm91bmQgb24gdmVyeSBvbGQgY29iYWx0IGhhcmR3YXJlLgorICogICAgICAgICAgICAgICAgICAtLSBNaWtlIFdheWNoaXNvbiA8bWljaGFlbC53YXljaGlzb25Ac3VuLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIE9VUl9OQU1FICJhbGltNzEwMV93ZHQiCisjZGVmaW5lIFBGWCBPVVJfTkFNRSAiOiAiCisKKyNkZWZpbmUgV0RUX0VOQUJMRSAweDlDCisjZGVmaW5lIFdEVF9ESVNBQkxFIDB4OEMKKworI2RlZmluZSBBTElfNzEwMV9XRFQgICAgMHg5MgorI2RlZmluZSBBTElfNzEwMV9HUElPICAgMHg3RAorI2RlZmluZSBBTElfNzEwMV9HUElPX08gMHg3RQorI2RlZmluZSBBTElfV0RUX0FSTSAgICAgMHgwMQorCisvKgorICogV2UncmUgZ29pbmcgdG8gdXNlIGEgMSBzZWNvbmQgdGltZW91dC4KKyAqIElmIHdlIHJlc2V0IHRoZSB3YXRjaGRvZyBldmVyeSB+MjUwbXMgd2Ugc2hvdWxkIGJlIHNhZmUuICAqLworCisjZGVmaW5lIFdEVF9JTlRFUlZBTCAoSFovNCsxKQorCisvKgorICogV2UgbXVzdCBub3QgcmVxdWlyZSB0b28gZ29vZCByZXNwb25zZSBmcm9tIHRoZSB1c2Vyc3BhY2UgZGFlbW9uLgorICogSGVyZSB3ZSByZXF1aXJlIHRoZSB1c2Vyc3BhY2UgZGFlbW9uIHRvIHNlbmQgdXMgYSBoZWFydGJlYXQKKyAqIGNoYXIgdG8gL2Rldi93YXRjaGRvZyBldmVyeSAzMCBzZWNvbmRzLgorICovCisKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAzMCAgICAgICAgICAgIC8qIDMwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7IC8qIGluIHNlY29uZHMsIHdpbGwgYmUgbXVsdGlwbGllZCBieSBIWiB0byBnZXQgc2Vjb25kcyB0byB3YWl0IGZvciBhIHBpbmcgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAoMTw9dGltZW91dDw9MzYwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiKSIpOworCitzdGF0aWMgaW50IHVzZV9ncGlvID0gMDsgLyogVXNlIHRoZSBwaWMgKGZvciBhMWQgcmV2aXNpb24gYWxpbTcxMDEpICovCittb2R1bGVfcGFyYW0odXNlX2dwaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9ncGlvLCAiVXNlIHRoZSBncGlvIHdhdGNoZG9nLiAgKHJlcXVpcmVkIGJ5IG9sZCBjb2JhbHQgYm9hcmRzKSIpOworCitzdGF0aWMgdm9pZCB3ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRfaGVhcnRiZWF0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgY2hhciB3ZHRfZXhwZWN0X2Nsb3NlOworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICphbGltNzEwMV9wbXU7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKgorICoJV2hhY2sgdGhlIGRvZworICovCisKK3N0YXRpYyB2b2lkIHdkdF90aW1lcl9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBJZiB3ZSBnb3QgYSBoZWFydGJlYXQgcHVsc2Ugd2l0aGluIHRoZSBXRFRfVVNfSU5URVJWQUwKKwkgKiB3ZSBhZ3JlZSB0byBwaW5nIHRoZSBXRFQKKwkgKi8KKwljaGFyCXRtcDsKKworCWlmKHRpbWVfYmVmb3JlKGppZmZpZXMsIG5leHRfaGVhcnRiZWF0KSkKKwl7CisJCS8qIFBpbmcgdGhlIFdEVCAodGhpcyBpcyBhY3R1YWxseSBhIGRpc2FybS9hcm0gc2VxdWVuY2UpICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgMHg5MiwgJnRtcCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX1dEVCwgKHRtcCAmIH5BTElfV0RUX0FSTSkpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9XRFQsICh0bXAgfCBBTElfV0RUX0FSTSkpOworCQlpZiAodXNlX2dwaW8pIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfR1BJT19PLCAmdG1wKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX0dQSU9fTywgdG1wCisJCQkJCXwgMHgyMCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9HUElPX08sIHRtcAorCQkJCQkmIH4weDIwKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJIZWFydGJlYXQgbG9zdCEgV2lsbCBub3QgcGluZyB0aGUgd2F0Y2hkb2dcbiIpOworCX0KKwkvKiBSZS1zZXQgdGhlIHRpbWVyIGludGVydmFsICovCisJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXRFRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZ0aW1lcik7Cit9CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzCisgKi8KKworc3RhdGljIHZvaWQgd2R0X2NoYW5nZShpbnQgd3JpdGV2YWwpCit7CisJY2hhcgl0bXA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX1dEVCwgJnRtcCk7CisJaWYgKHdyaXRldmFsID09IFdEVF9FTkFCTEUpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfV0RULCAodG1wIHwgQUxJX1dEVF9BUk0pKTsKKwkJaWYgKHVzZV9ncGlvKSB7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX0dQSU9fTywgJnRtcCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9HUElPX08sIHRtcCAmIH4weDIwKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfV0RULCAodG1wICYgfkFMSV9XRFRfQVJNKSk7CisJCWlmICh1c2VfZ3BpbykgeworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9HUElPX08sICZ0bXApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfR1BJT19PLCB0bXAgfCAweDIwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgd2R0X3N0YXJ0dXAodm9pZCkKK3sKKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKKworCS8qIFdlIG11c3QgZW5hYmxlIGJlZm9yZSB3ZSBraWNrIG9mZiB0aGUgdGltZXIgaW4gY2FzZSB0aGUgdGltZXIKKwkgICBvY2N1cnMgYXMgd2UgcGluZyBpdCAqLworCisJd2R0X2NoYW5nZShXRFRfRU5BQkxFKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciAqLworCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCWFkZF90aW1lcigmdGltZXIpOworCisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGVuYWJsZWQuXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2R0X3R1cm5vZmYodm9pZCkKK3sKKwkvKiBTdG9wIHRoZSB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZ0aW1lcik7CisJd2R0X2NoYW5nZShXRFRfRElTQUJMRSk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGlzIG5vdyBkaXNhYmxlZC4uLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwkvKiB1c2VyIGxhbmQgcGluZyAqLworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArICh0aW1lb3V0ICogSFopOworfQorCisvKgorICogL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKK3N0YXRpYyBzc2l6ZV90IGZvcF93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBvZnM7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIG5vdyBzY2FuICovCisJCQlmb3IgKG9mcyA9IDA7IG9mcyAhPSBjb3VudDsgb2ZzKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZitvZnMpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCXdkdF9leHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVzdGFydCB0aW1lciAqLworCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBmb3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCS8qIEp1c3QgaW4gY2FzZSB3ZSdyZSBhbHJlYWR5IHRhbGtpbmcgdG8gc29tZW9uZS4uLiAqLworCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKiBHb29kLCBmaXJlIHVwIHRoZSBzaG93ICovCisJd2R0X3N0YXJ0dXAoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2Nsb3NlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaWYod2R0X2V4cGVjdF9jbG9zZSA9PSA0MikKKwkJd2R0X3R1cm5vZmYoKTsKKwllbHNlIHsKKwkJLyogd2ltOiBzaG91bGRuJ3QgdGhlcmUgYmUgYTogZGVsX3RpbWVyKCZ0aW1lcik7ICovCisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJkZXZpY2UgZmlsZSBjbG9zZWQgdW5leHBlY3RlZGx5LiBXaWxsIG5vdCBzdG9wIHRoZSBXRFQhXG4iKTsKKwl9CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPQorCXsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIkFMaU03MTAxIiwKKwl9OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKT8tRUZBVUxUOjA7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG5ld19vcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCQlpZihnZXRfdXNlcihuZXdfb3B0aW9ucywgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKG5ld19vcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQl3ZHRfdHVybm9mZigpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXdkdF9zdGFydHVwKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXsKKwkJCWludCBuZXdfdGltZW91dDsKKworCQkJaWYoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZihuZXdfdGltZW91dCA8IDEgfHwgbmV3X3RpbWVvdXQgPiAzNjAwKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJdGltZW91dCA9IG5ld190aW1lb3V0OworCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCX0KKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcj0JCVRISVNfTU9EVUxFLAorCS5sbHNlZWs9CW5vX2xsc2VlaywKKwkud3JpdGU9CQlmb3Bfd3JpdGUsCisJLm9wZW49CQlmb3Bfb3BlbiwKKwkucmVsZWFzZT0JZm9wX2Nsb3NlLAorCS5pb2N0bD0JCWZvcF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3I9V0FUQ0hET0dfTUlOT1IsCisJLm5hbWU9IndhdGNoZG9nIiwKKwkuZm9wcz0md2R0X2ZvcHMsCit9OworCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkKKwkJd2R0X3R1cm5vZmYoKTsKKworCWlmIChjb2RlPT1TWVNfUkVTVEFSVCkgeworCQkvKgorCQkgKiBDb2JhbHQgZGV2aWNlcyBoYXZlIG5vIHdheSBvZiByZWJvb3RpbmcgdGhlbXNlbHZlcyBvdGhlciB0aGFuCisJCSAqIGdldHRpbmcgdGhlIHdhdGNoZG9nIHRvIHB1bGwgcmVzZXQsIHNvIHdlIHJlc3RhcnQgdGhlIHdhdGNoZG9nIG9uCisJCSAqIHJlYm9vdCB3aXRoIG5vIGhlYXJ0YmVhdAorCQkgKi8KKwkJd2R0X2NoYW5nZShXRFRfRU5BQkxFKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGlzIG5vdyBlbmFibGVkIHdpdGggbm8gaGVhcnRiZWF0IC0gc2hvdWxkIHJlYm9vdCBpbiB+MSBzZWNvbmQuXG4iKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllcj0KK3sKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IGFsaW03MTAxX3dkdF91bmxvYWQodm9pZCkKK3sKKwl3ZHRfdHVybm9mZigpOworCS8qIERlcmVnaXN0ZXIgKi8KKwltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWxpbTcxMDFfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAtRUJVU1k7CisJc3RydWN0IHBjaV9kZXYgKmFsaTE1NDNfc291dGg7CisJY2hhciB0bXA7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RldmUgSGlsbCA8c3RldmVAbmF2YWhvLmNvLnVrPi5cbiIpOworCWFsaW03MTAxX3BtdSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX003MTAxLE5VTEwpOworCWlmICghYWxpbTcxMDFfcG11KSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJBTGkgTTcxMDEgUE1VIG5vdCBwcmVzZW50IC0gV0RUIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFNldCB0aGUgV0RUIGluIHRoZSBQTVUgdG8gMSBzZWNvbmQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9XRFQsIDB4MDIpOworCisJYWxpMTU0M19zb3V0aCA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKKwlpZiAoIWFsaTE1NDNfc291dGgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFMaSAxNTQzIFNvdXRoLUJyaWRnZSBub3QgcHJlc2VudCAtIFdEVCBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWxpMTU0M19zb3V0aCwgMHg1ZSwgJnRtcCk7CisJaWYgKCh0bXAgJiAweDFlKSA9PSAweDAwKSB7CisJCWlmICghdXNlX2dwaW8pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBvbGQgYWxpbTcxMDEgcmV2aXNpb24gJ2ExZCcuICBJZiB0aGlzIGlzIGEgY29iYWx0IGJvYXJkLCBzZXQgdGhlICd1c2VfZ3BpbycgbW9kdWxlIHBhcmFtZXRlci5cbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfSAKKwkJbm93YXlvdXQgPSAxOworCX0gZWxzZSBpZiAoKHRtcCAmIDB4MWUpICE9IDB4MTIgJiYgKHRtcCAmIDB4MWUpICE9IDB4MDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFMaSAxNTQzIFNvdXRoLUJyaWRnZSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHJldmlzaW9uIG51bWJlciAoPz8/MTAwMT8pIC0gV0RUIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiAzNjAwKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwl7CisJCXRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDE8PXg8PTM2MDAsIHVzaW5nICVkXG4iLAorCQkJdGltZW91dCk7CisJfQorCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmZ1bmN0aW9uID0gd2R0X3RpbWVyX3Bpbmc7CisJdGltZXIuZGF0YSA9IDE7CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQl3ZHRfbWlzY2Rldi5taW5vciwgcmMpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyYyk7CisJCWdvdG8gZXJyX291dF9taXNjZGV2OworCX0KKworCWlmIChub3dheW91dCkgeworCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXRFQgZHJpdmVyIGZvciBBTGkgTTcxMDEgaW5pdGlhbGlzZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9taXNjZGV2OgorCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK21vZHVsZV9pbml0KGFsaW03MTAxX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KGFsaW03MTAxX3dkdF91bmxvYWQpOworCitNT0RVTEVfQVVUSE9SKCJTdGV2ZSBIaWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMaSBNNzEwMSBQTVUgQ29tcHV0ZXIgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvY3B1NXdkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2NwdTV3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODY1ZGFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2NwdTV3ZHQuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIHNtYSBjcHU1IHdhdGNoZG9nIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBIZWlrbyBSb25zZG9yZiA8aGVyb0BpaGcudW5pLWR1aXNidXJnLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisKKy8qIGFkanVzdGFibGUgcGFyYW1ldGVycyAqLworCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCBwb3J0ID0gMHg5MTsKK3N0YXRpYyBpbnQgdGlja3MgPSAxMDAwMDsKKworI2RlZmluZSBQRlgJCQkiY3B1NXdkdDogIgorCisjZGVmaW5lIENQVTVXRFRfRVhURU5UICAgICAgICAgIDB4MEEKKworI2RlZmluZSBDUFU1V0RUX1NUQVRVU19SRUcgICAgICAweDAwCisjZGVmaW5lIENQVTVXRFRfVElNRV9BX1JFRyAgICAgIDB4MDIKKyNkZWZpbmUgQ1BVNVdEVF9USU1FX0JfUkVHICAgICAgMHgwMworI2RlZmluZSBDUFU1V0RUX01PREVfUkVHICAgICAgICAweDA0CisjZGVmaW5lIENQVTVXRFRfVFJJR0dFUl9SRUcgICAgIDB4MDcKKyNkZWZpbmUgQ1BVNVdEVF9FTkFCTEVfUkVHICAgICAgMHgwOAorI2RlZmluZSBDUFU1V0RUX1JFU0VUX1JFRyAgICAgICAweDA5CisKKyNkZWZpbmUgQ1BVNVdEVF9JTlRFUlZBTAkoSFovMTArMSkKKworLyogc29tZSBkZXZpY2UgZGF0YSAqLworCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHN0b3A7CisJdm9sYXRpbGUgaW50IHJ1bm5pbmc7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdm9sYXRpbGUgaW50IHF1ZXVlOworCWludCBkZWZhdWx0X3RpY2tzOworCXVuc2lnbmVkIGxvbmcgaW51c2U7Cit9IGNwdTV3ZHRfZGV2aWNlOworCisvKiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgY3B1NXdkdF90cmlnZ2VyKHVuc2lnbmVkIGxvbmcgdW51c2VkKQoreworCWlmICggdmVyYm9zZSA+IDIgKQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggInRyaWdnZXIgYXQgJWkgdGlja3NcbiIsIHRpY2tzKTsKKworCWlmKCBjcHU1d2R0X2RldmljZS5ydW5uaW5nICkKKwkJdGlja3MtLTsKKworCS8qIGtlZXAgd2F0Y2hkb2cgYWxpdmUgKi8KKwlvdXRiKDEsIHBvcnQgKyBDUFU1V0RUX1RSSUdHRVJfUkVHKTsKKworCS8qIHJlcXVldWU/PyAqLworCWlmKCBjcHU1d2R0X2RldmljZS5xdWV1ZSAmJiB0aWNrcyApIHsKKwkJY3B1NXdkdF9kZXZpY2UudGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDUFU1V0RUX0lOVEVSVkFMOworCQlhZGRfdGltZXIoJmNwdTV3ZHRfZGV2aWNlLnRpbWVyKTsKKwl9CisJZWxzZSB7CisJCS8qIHRpY2tzIGRvZXNuJ3QgbWF0dGVyIGFueXdheSAqLworCQl1cCgmY3B1NXdkdF9kZXZpY2Uuc3RvcCk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGNwdTV3ZHRfcmVzZXQodm9pZCkKK3sKKwl0aWNrcyA9IGNwdTV3ZHRfZGV2aWNlLmRlZmF1bHRfdGlja3M7CisKKwlpZiAoIHZlcmJvc2UgKQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggInJlc2V0ICglaSB0aWNrcylcbiIsIChpbnQpIHRpY2tzKTsKKworfQorCitzdGF0aWMgdm9pZCBjcHU1d2R0X3N0YXJ0KHZvaWQpCit7CisJaWYgKCAhY3B1NXdkdF9kZXZpY2UucXVldWUgKSB7CisJCWNwdTV3ZHRfZGV2aWNlLnF1ZXVlID0gMTsKKwkJb3V0YigwLCBwb3J0ICsgQ1BVNVdEVF9USU1FX0FfUkVHKTsKKwkJb3V0YigwLCBwb3J0ICsgQ1BVNVdEVF9USU1FX0JfUkVHKTsKKwkJb3V0YigxLCBwb3J0ICsgQ1BVNVdEVF9NT0RFX1JFRyk7CisJCW91dGIoMCwgcG9ydCArIENQVTVXRFRfUkVTRVRfUkVHKTsKKwkJb3V0YigwLCBwb3J0ICsgQ1BVNVdEVF9FTkFCTEVfUkVHKTsKKwkJY3B1NXdkdF9kZXZpY2UudGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDUFU1V0RUX0lOVEVSVkFMOworCQlhZGRfdGltZXIoJmNwdTV3ZHRfZGV2aWNlLnRpbWVyKTsKKwl9CisJLyogaWYgcHJvY2VzcyBkaWVzLCBjb3VudGVyIGlzIG5vdCBkZWNyZW1lbnRlZCAqLworCWNwdTV3ZHRfZGV2aWNlLnJ1bm5pbmcrKzsKK30KKworc3RhdGljIGludCBjcHU1d2R0X3N0b3Aodm9pZCkKK3sKKwlpZiAoIGNwdTV3ZHRfZGV2aWNlLnJ1bm5pbmcgKQorCQljcHU1d2R0X2RldmljZS5ydW5uaW5nID0gMDsKKworCXRpY2tzID0gY3B1NXdkdF9kZXZpY2UuZGVmYXVsdF90aWNrczsKKworCWlmICggdmVyYm9zZSApCisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJzdG9wIG5vdCBwb3NzaWJsZVxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyogZmlsZXN5c3RlbSBvcGVyYXRpb25zICovCisKK3N0YXRpYyBpbnQgY3B1NXdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICggdGVzdF9hbmRfc2V0X2JpdCgwLCAmY3B1NXdkdF9kZXZpY2UuaW51c2UpICkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBjcHU1d2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY2xlYXJfYml0KDAsICZjcHU1d2R0X2RldmljZS5pbnVzZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1NXdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9CisJeworCQkub3B0aW9ucyA9IFdESU9GX0NBUkRSRVNFVCwKKwkJLmlkZW50aXR5ID0gIkNQVTUgV0RUIiwKKwl9OworCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCWNwdTV3ZHRfcmVzZXQoKTsKKwkJCWJyZWFrOworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJCXZhbHVlID0gaW5iKHBvcnQgKyBDUFU1V0RUX1NUQVRVU19SRUcpOworCQkJdmFsdWUgPSAodmFsdWUgPj4gMikgJiAxOworCQkJaWYgKCBjb3B5X3RvX3VzZXIoYXJncCwgJnZhbHVlLCBzaXplb2YoaW50KSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCWlmICggY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJCWlmICggY29weV9mcm9tX3VzZXIoJnZhbHVlLCBhcmdwLCBzaXplb2YoaW50KSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3dpdGNoKHZhbHVlKSB7CisJCQkJY2FzZSBXRElPU19FTkFCTEVDQVJEOgorCQkJCQljcHU1d2R0X3N0YXJ0KCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV0RJT1NfRElTQUJMRUNBUkQ6CisJCQkJCXJldHVybiBjcHU1d2R0X3N0b3AoKTsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBjcHU1d2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoICFjb3VudCApCisJCXJldHVybiAtRUlPOworCisJY3B1NXdkdF9yZXNldCgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcHU1d2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBjcHU1d2R0X2lvY3RsLAorCS5vcGVuCQk9IGNwdTV3ZHRfb3BlbiwKKwkud3JpdGUJCT0gY3B1NXdkdF93cml0ZSwKKwkucmVsZWFzZQk9IGNwdTV3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBjcHU1d2R0X21pc2MgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJmNwdTV3ZHRfZm9wcywKK307CisKKy8qIGluaXQvZXhpdCBmdW5jdGlvbiAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjcHU1d2R0X2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBlcnI7CisKKwlpZiAoIHZlcmJvc2UgKQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggInBvcnQ9MHgleCwgdmVyYm9zZT0laVxuIiwgcG9ydCwgdmVyYm9zZSk7CisKKwlpZiAoIChlcnIgPSBtaXNjX3JlZ2lzdGVyKCZjcHU1d2R0X21pc2MpKSA8IDAgKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBub19taXNjOworCX0KKworCWlmICggIXJlcXVlc3RfcmVnaW9uKHBvcnQsIENQVTVXRFRfRVhURU5ULCBQRlgpICkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gbm9fcG9ydDsKKwl9CisKKwkvKiB3YXRjaGRvZyByZWJvb3Q/ICovCisJdmFsID0gaW5iKHBvcnQgKyBDUFU1V0RUX1NUQVRVU19SRUcpOworCXZhbCA9ICh2YWwgPj4gMikgJiAxOworCWlmICggIXZhbCApCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJzb3JyeSwgd2FzIG15IGZhdWx0XG4iKTsKKworCWluaXRfTVVURVhfTE9DS0VEKCZjcHU1d2R0X2RldmljZS5zdG9wKTsKKwljcHU1d2R0X2RldmljZS5xdWV1ZSA9IDA7CisKKwljbGVhcl9iaXQoMCwgJmNwdTV3ZHRfZGV2aWNlLmludXNlKTsKKworCWluaXRfdGltZXIoJmNwdTV3ZHRfZGV2aWNlLnRpbWVyKTsKKwljcHU1d2R0X2RldmljZS50aW1lci5mdW5jdGlvbiA9IGNwdTV3ZHRfdHJpZ2dlcjsKKwljcHU1d2R0X2RldmljZS50aW1lci5kYXRhID0gMDsKKworCWNwdTV3ZHRfZGV2aWNlLmRlZmF1bHRfdGlja3MgPSB0aWNrczsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0IHN1Y2Nlc3NcbiIpOworCisJcmV0dXJuIDA7CisKK25vX3BvcnQ6CisJbWlzY19kZXJlZ2lzdGVyKCZjcHU1d2R0X21pc2MpOworbm9fbWlzYzoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjcHU1d2R0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNwdTV3ZHRfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3B1NXdkdF9leGl0KHZvaWQpCit7CisJaWYgKCBjcHU1d2R0X2RldmljZS5xdWV1ZSApIHsKKwkJY3B1NXdkdF9kZXZpY2UucXVldWUgPSAwOworCQlkb3duKCZjcHU1d2R0X2RldmljZS5zdG9wKTsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJmNwdTV3ZHRfbWlzYyk7CisKKwlyZWxlYXNlX3JlZ2lvbihwb3J0LCBDUFU1V0RUX0VYVEVOVCk7CisKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNwdTV3ZHRfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwljcHU1d2R0X2V4aXQoKTsKK30KKworLyogbW9kdWxlIGVudHJ5IHBvaW50cyAqLworCittb2R1bGVfaW5pdChjcHU1d2R0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGNwdTV3ZHRfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJIZWlrbyBSb25zZG9yZiA8aGVyb0BpaGcudW5pLWR1aXNidXJnLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzbWEgY3B1NSB3YXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJzbWEgY3B1NSB3YXRjaGRvZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCittb2R1bGVfcGFyYW0ocG9ydCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydCwgImJhc2UgYWRkcmVzcyBvZiB3YXRjaGRvZyBjYXJkLCBkZWZhdWx0IGlzIDB4OTEiKTsKKworbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJiZSB2ZXJib3NlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOworCittb2R1bGVfcGFyYW0odGlja3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpY2tzLCAiY291bnQgZG93biB0aWNrcywgZGVmYXVsdCBpcyAxMDAwMCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2V1cm90ZWNod2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvZXVyb3RlY2h3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTBlNTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2V1cm90ZWNod2R0LmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKglFdXJvdGVjaCBDUFUtMTIyMC8xNDEwIG9uIGJvYXJkIFdEVCBkcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgQXNjZW5zaXQgPHN1cHBvcnRAYXNjZW5zaXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGFzY2Vuc2l0LmNvbT4KKyAqCShjKSBDb3B5cmlnaHQgMjAwMiBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4KKyAqCisgKglCYXNlZCBvbiB3ZHQuYy4KKyAqCU9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlczoKKyAqCisgKiAgICAgIChjKSBDb3B5cmlnaHQgMTk5Ni0xOTk3IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICogICAgICB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqICAgICAgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqICAgICAgKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+KgorICovCisKKy8qIENoYW5nZWxvZzoKKyAqCisgKiAyMDAyLzA0LzI1IC0gUm9iIFJhZGV6CisgKgljbGVhbiB1cCAjaW5jbHVkZXMKKyAqCWNsZWFuIHVwIGxvY2tpbmcKKyAqCW1ha2UgX19zZXR1cCBwYXJhbSB1bmlxdWUKKyAqCXByb3BlciBvcHRpb25zIGluIHdhdGNoZG9nX2luZm8KKyAqCWFkZCBXRElPQ19HRVRTVEFUVVMgYW5kIFdESU9DX1NFVE9QVElPTlMgaW9jdGxzCisgKglhZGQgZXhwZWN0X2Nsb3NlIHN1cHBvcnQKKyAqCisgKiAyMDAxIC0gUm9kb2xmbyBHaW9tZXR0aQorICoJSW5pdGlhbCByZWxlYXNlCisgKgorICogMjAwMi4wNS4zMCAtIEpvZWwgQmVja2VyIDxqb2VsLmJlY2tlckBvcmFjbGUuY29tPgorICogCUFkZGVkIE1hdHQgRG9tc2NoJ3Mgbm93YXlvdXQgbW9kdWxlIG9wdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXVyd2R0X2lzX29wZW47CitzdGF0aWMgaW50IGV1cndkdF90aW1lb3V0Oworc3RhdGljIGNoYXIgZXVyX2V4cGVjdF9jbG9zZTsKKworLyoKKyAqIFlvdSBtdXN0IHNldCB0aGVzZSAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLgorICogWW91IGNhbiB1c2UgZXVyd2R0PXgseSB0byBzZXQgdGhlc2Ugbm93LgorICovCisKK3N0YXRpYyBpbnQgaW8gPSAweDNmMDsKK3N0YXRpYyBpbnQgaXJxID0gMTA7CitzdGF0aWMgY2hhciAqZXYgPSAiaW50IjsKKworI2RlZmluZSBXRFRfVElNRU9VVAkJNjAgICAgICAgICAgICAgICAgLyogMSBtaW51dGUgKi8KKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKiBTb21lIHN5bWJvbGljIG5hbWVzCisgKi8KKworI2RlZmluZSBXRFRfQ1RSTF9SRUcJCTB4MzAKKyNkZWZpbmUgV0RUX09VVFBJTl9DRkcJCTB4ZTIKKyNkZWZpbmUgV0RUX0VWRU5UX0lOVAkJMHgwMAorI2RlZmluZSBXRFRfRVZFTlRfUkVCT09UCTB4MDgKKyNkZWZpbmUgV0RUX1VOSVRfU0VMCQkweGYxCisjZGVmaW5lIFdEVF9VTklUX1NFQ1MJCTB4ODAKKyNkZWZpbmUgV0RUX1RJTUVPVVRfVkFMCQkweGYyCisjZGVmaW5lIFdEVF9USU1FUl9DRkcJCTB4ZjMKKworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXVyb3RlY2ggV0RUIGlvIHBvcnQgKGRlZmF1bHQ9MHgzZjApIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJFdXJvdGVjaCBXRFQgaXJxIChkZWZhdWx0PTEwKSIpOworbW9kdWxlX3BhcmFtKGV2LCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV2LCAiRXVyb3RlY2ggV0RUIGV2ZW50IHR5cGUgKGRlZmF1bHQgaXMgYGludCcpIik7CisKKworLyoKKyAqIFByb2dyYW1taW5nIHN1cHBvcnQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZXVyd2R0X3dyaXRlX3JlZyh1OCBpbmRleCwgdTggZGF0YSkKK3sKKwlvdXRiKGluZGV4LCBpbyk7CisJb3V0YihkYXRhLCBpbysxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV1cndkdF9sb2NrX2NoaXAodm9pZCkKK3sKKwlvdXRiKDB4YWEsIGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV1cndkdF91bmxvY2tfY2hpcCh2b2lkKQoreworCW91dGIoMHg1NSwgaW8pOworCWV1cndkdF93cml0ZV9yZWcoMHgwNywgMHgwOCk7CS8qIHNldCB0aGUgbG9naWNhbCBkZXZpY2UgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGV1cndkdF9zZXRfdGltZW91dChpbnQgdGltZW91dCkKK3sKKwlldXJ3ZHRfd3JpdGVfcmVnKFdEVF9USU1FT1VUX1ZBTCwgKHU4KSB0aW1lb3V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV1cndkdF9kaXNhYmxlX3RpbWVyKHZvaWQpCit7CisJZXVyd2R0X3NldF90aW1lb3V0KDApOworfQorCitzdGF0aWMgdm9pZCBldXJ3ZHRfYWN0aXZhdGVfdGltZXIodm9pZCkKK3sKKwlldXJ3ZHRfZGlzYWJsZV90aW1lcigpOworCWV1cndkdF93cml0ZV9yZWcoV0RUX0NUUkxfUkVHLCAweDAxKTsJLyogYWN0aXZhdGUgdGhlIFdEVCAqLworCWV1cndkdF93cml0ZV9yZWcoV0RUX09VVFBJTl9DRkcsICFzdHJjbXAoImludCIsIGV2KSA/IFdEVF9FVkVOVF9JTlQgOiBXRFRfRVZFTlRfUkVCT09UKTsKKworCS8qIFNldHRpbmcgaW50ZXJydXB0IGxpbmUgKi8KKwlpZiAoaXJxID09IDIgfHwgaXJxID4gMTUgfHwgaXJxIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIjogaW52YWxpZCBpcnEgbnVtYmVyXG4iKTsKKwkJaXJxID0gMDsJLyogaWYgaW52YWxpZCB3ZSBkaXNhYmxlIGludGVycnVwdCAqLworCX0KKwlpZiAoaXJxID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIjogaW50ZXJydXB0IGRpc2FibGVkXG4iKTsKKworCWV1cndkdF93cml0ZV9yZWcoV0RUX1RJTUVSX0NGRywgaXJxPDw0KTsKKworCWV1cndkdF93cml0ZV9yZWcoV0RUX1VOSVRfU0VMLCBXRFRfVU5JVF9TRUNTKTsJLyogd2UgdXNlIHNlY29uZHMgKi8KKwlldXJ3ZHRfc2V0X3RpbWVvdXQoMCk7CS8qIHRoZSBkZWZhdWx0IHRpbWVvdXQgKi8KK30KKworCisvKgorICogS2VybmVsIG1ldGhvZHMuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGV1cndkdF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoS0VSTl9DUklUICJ0aW1lb3V0IFdEVCB0aW1lb3V0XG4iKTsKKworI2lmZGVmIE9OTFlfVEVTVElORworCXByaW50ayhLRVJOX0NSSVQgIldvdWxkIFJlYm9vdC5cbiIpOworI2Vsc2UKKwlwcmludGsoS0VSTl9DUklUICJJbml0aWF0aW5nIHN5c3RlbSByZWJvb3QuXG4iKTsKKwltYWNoaW5lX3Jlc3RhcnQoTlVMTCk7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKiBldXJ3ZHRfcGluZzoKKyAqCisgKiBSZWxvYWQgY291bnRlciBvbmUgd2l0aCB0aGUgd2F0Y2hkb2cgdGltZW91dC4KKyAqLworCitzdGF0aWMgdm9pZCBldXJ3ZHRfcGluZyh2b2lkKQoreworCS8qIFdyaXRlIHRoZSB3YXRjaGRvZyBkZWZhdWx0IHZhbHVlICovCisJZXVyd2R0X3NldF90aW1lb3V0KGV1cndkdF90aW1lb3V0KTsKK30KKworLyoqCisgKiBldXJ3ZHRfd3JpdGU6CisgKiBAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCisgKiBAYnVmOiBidWZmZXIgdG8gd3JpdGUgKHVudXNlZCBhcyBkYXRhIGRvZXMgbm90IG1hdHRlciBoZXJlCisgKiBAY291bnQ6IGNvdW50IG9mIGJ5dGVzCisgKiBAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKKyAqCisgKiBBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqIHdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2Ugd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KKyAqLworCitzdGF0aWMgc3NpemVfdCBldXJ3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCitzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIAl7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQlldXJfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmKGdldF91c2VyKGMsIGJ1ZitpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlldXJfZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJZXVyd2R0X3BpbmcoKTsJLyogdGhlIGRlZmF1bHQgdGltZW91dCAqLworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBldXJ3ZHRfaW9jdGw6CisgKiBAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKiBAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKiBAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICogVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqIGFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuCisgKi8KKworc3RhdGljIGludCBldXJ3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucwkgID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eQkgID0gIldEVCBFdXJvdGVjaCBDUFUtMTIyMC8xNDEwIiwKKwl9OworCisJaW50IHRpbWU7CisJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwlzd2l0Y2goY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlldXJ3ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aW1lLCBwLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJaWYgKHRpbWUgPCAwIHx8IHRpbWUgPiAyNTUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlldXJ3ZHRfdGltZW91dCA9IHRpbWU7CisJCWV1cndkdF9zZXRfdGltZW91dCh0aW1lKTsKKwkJLyogRmFsbCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoZXVyd2R0X3RpbWVvdXQsIHApOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJZXVyd2R0X2Rpc2FibGVfdGltZXIoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKwkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQlldXJ3ZHRfYWN0aXZhdGVfdGltZXIoKTsKKwkJCWV1cndkdF9waW5nKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisJCXJldHVybiByZXR2YWw7CisJfQorfQorCisvKioKKyAqIGV1cndkdF9vcGVuOgorICogQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqIEBmaWxlOiBmaWxlIGhhbmRsZSB0byBkZXZpY2UKKyAqCisgKiBUaGUgbWlzYyBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLiBUaGUgd2F0Y2hkb2cgZGV2aWNlIGlzIHNpbmdsZQorICogb3BlbiBhbmQgb24gb3BlbmluZyB3ZSBsb2FkIHRoZSBjb3VudGVyLgorICovCisKK3N0YXRpYyBpbnQgZXVyd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmV1cndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlldXJ3ZHRfdGltZW91dCA9IFdEVF9USU1FT1VUOwkvKiBpbml0aWFsIHRpbWVvdXQgKi8KKwkvKiBBY3RpdmF0ZSB0aGUgV0RUICovCisJZXVyd2R0X2FjdGl2YXRlX3RpbWVyKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKioKKyAqIGV1cndkdF9yZWxlYXNlOgorICogQGlub2RlOiBpbm9kZSB0byBib2FyZAorICogQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGJvYXJkCisgKgorICogVGhlIHdhdGNoZG9nIGhhcyBhIGNvbmZpZ3VyYWJsZSBBUEkuIFRoZXJlIGlzIGEgcmVsaWdpb3VzIGRpc3B1dGUKKyAqIGJldHdlZW4gcGVvcGxlIHdobyB3YW50IHRoZWlyIHdhdGNoZG9nIHRvIGJlIGFibGUgdG8gc2h1dCBkb3duIGFuZAorICogdGhvc2Ugd2hvIHdhbnQgdG8gYmUgc3VyZSBpZiB0aGUgd2F0Y2hkb2cgbWFuYWdlciBkaWVzIHRoZSBtYWNoaW5lCisgKiByZWJvb3RzLiBJbiB0aGUgZm9ybWVyIGNhc2Ugd2UgZGlzYWJsZSB0aGUgY291bnRlcnMsIGluIHRoZSBsYXR0ZXIKKyAqIGNhc2UgeW91IGhhdmUgdG8gb3BlbiBpdCBhZ2FpbiB2ZXJ5IHNvb24uCisgKi8KKworc3RhdGljIGludCBldXJ3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZXVyX2V4cGVjdF9jbG9zZSA9PSA0MikgeworCQlldXJ3ZHRfZGlzYWJsZV90aW1lcigpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgImV1cndkdDogVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCWV1cndkdF9waW5nKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmZXVyd2R0X2lzX29wZW4pOworCWV1cl9leHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGV1cndkdF9ub3RpZnlfc3lzOgorICogQHRoaXM6IG91ciBub3RpZmllciBibG9jaworICogQGNvZGU6IHRoZSBldmVudCBiZWluZyByZXBvcnRlZAorICogQHVudXNlZDogdW51c2VkCisgKgorICogT3VyIG5vdGlmaWVyIGlzIGNhbGxlZCBvbiBzeXN0ZW0gc2h1dGRvd25zLiBXZSB3YW50IHRvIHR1cm4gdGhlIGNhcmQKKyAqIG9mZiBhdCByZWJvb3Qgb3RoZXJ3aXNlIHRoZSBtYWNoaW5lIHdpbGwgcmVib290IGFnYWluIGR1cmluZyBtZW1vcnkKKyAqIHRlc3Qgb3Igd29yc2UgeWV0IGR1cmluZyB0aGUgZm9sbG93aW5nIGZzY2suIFRoaXMgd291bGQgc3VjaywgaW4gZmFjdAorICogdHJ1c3QgbWUgLSBpZiBpdCBoYXBwZW5zIGl0IGRvZXMgc3Vjay4KKyAqLworCitzdGF0aWMgaW50IGV1cndkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIGNhcmQgb2ZmICovCisJCWV1cndkdF9kaXNhYmxlX3RpbWVyKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICogS2VybmVsIEludGVyZmFjZXMKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV1cndkdF9mb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJPSBub19sbHNlZWssCisJLndyaXRlCT0gZXVyd2R0X3dyaXRlLAorCS5pb2N0bAk9IGV1cndkdF9pb2N0bCwKKwkub3Blbgk9IGV1cndkdF9vcGVuLAorCS5yZWxlYXNlCT0gZXVyd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZXVyd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJmV1cndkdF9mb3BzLAorfTsKKworLyoKKyAqIFRoZSBXRFQgY2FyZCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICogdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGV1cndkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGV1cndkdF9ub3RpZnlfc3lzLAorfTsKKworLyoqCisgKiBjbGVhbnVwX21vZHVsZToKKyAqCisgKiBVbmxvYWQgdGhlIHdhdGNoZG9nLiBZb3UgY2Fubm90IGRvIHRoaXMgd2l0aCBhbnkgZmlsZSBoYW5kbGVzIG9wZW4uCisgKiBJZiB5b3VyIHdhdGNoZG9nIGlzIHNldCB0byBjb250aW51ZSB0aWNraW5nIG9uIGNsb3NlIGFuZCB5b3UgdW5sb2FkCisgKiBpdCwgd2VsbCBpdCBrZWVwcyB0aWNraW5nLiBXZSB3b24ndCBnZXQgdGhlIGludGVycnVwdCBidXQgdGhlIGJvYXJkCisgKiB3aWxsIG5vdCB0b3VjaCBQQyBtZW1vcnkgc28gYWxsIGlzIGZpbmUuIFlvdSBqdXN0IGhhdmUgdG8gbG9hZCBhIG5ldworICogbW9kdWxlIGluIDYwIHNlY29uZHMgb3IgcmVib290LgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBldXJ3ZHRfZXhpdCh2b2lkKQoreworCWV1cndkdF9sb2NrX2NoaXAoKTsKKworCW1pc2NfZGVyZWdpc3RlcigmZXVyd2R0X21pc2NkZXYpOworCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmV1cndkdF9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24oaW8sIDIpOworCWZyZWVfaXJxKGlycSwgTlVMTCk7Cit9CisKKy8qKgorICogZXVyd2R0X2luaXQ6CisgKgorICogU2V0IHVwIHRoZSBXRFQgd2F0Y2hkb2cgYm9hcmQuIEFmdGVyIGdyYWJiaW5nIHRoZSByZXNvdXJjZXMKKyAqIHdlIHJlcXVpcmUgd2UgbmVlZCBhbHNvIHRvIHVubG9jayB0aGUgZGV2aWNlLgorICogVGhlIG9wZW4oKSBmdW5jdGlvbiB3aWxsIGFjdHVhbGx5IGtpY2sgdGhlIGJvYXJkIG9mZi4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBldXJ3ZHRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZldXJ3ZHRfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImV1cndkdDogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwKKwkJV0FUQ0hET0dfTUlOT1IpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGV1cndkdF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgImV1cndkdCIsIE5VTEwpOworCWlmKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImV1cndkdDogSVJRICVkIGlzIG5vdCBmcmVlLlxuIiwgaXJxKTsKKwkJZ290byBvdXRtaXNjOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDIsICJldXJ3ZHQiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImV1cndkdDogSU8gJVggaXMgbm90IGZyZWUuXG4iLCBpbyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRpcnE7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZldXJ3ZHRfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJldXJ3ZHQ6IGNhbid0IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwgcmV0KTsKKwkJZ290byBvdXRyZWc7CisJfQorCisJZXVyd2R0X3VubG9ja19jaGlwKCk7CisKKwlyZXQgPSAwOworCXByaW50ayhLRVJOX0lORk8gIkV1cm90ZWNoIFdEVCBkcml2ZXIgMC4wMSBhdCAlWCAoSW50ZXJydXB0ICVkKSIKKwkJIiAtIHRpbWVvdXQgZXZlbnQ6ICVzXG4iLAorCQlpbywgaXJxLCAoIXN0cmNtcCgiaW50IiwgZXYpID8gImludCIgOiAicmVib290IikpOworCitvdXQ6CisJcmV0dXJuIHJldDsKKworb3V0cmVnOgorCXJlbGVhc2VfcmVnaW9uKGlvLCAyKTsKKworb3V0aXJxOgorCWZyZWVfaXJxKGlycSwgTlVMTCk7CisKK291dG1pc2M6CisJbWlzY19kZXJlZ2lzdGVyKCZldXJ3ZHRfbWlzY2Rldik7CisJZ290byBvdXQ7Cit9CisKK21vZHVsZV9pbml0KGV1cndkdF9pbml0KTsKK21vZHVsZV9leGl0KGV1cndkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUm9kb2xmbyBHaW9tZXR0aSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEV1cm90ZWNoIENQVS0xMjIwLzE0MTAgb24gYm9hcmQgd2F0Y2hkb2ciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzNzk3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5jCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICoJaTh4eF90Y28gMC4wNzoJVENPIHRpbWVyIGRyaXZlciBmb3IgaTh4eCBjaGlwc2V0cworICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMCBrZXJuZWwgY29uY2VwdHMgPG5pbHNAa2VybmVsY29uY2VwdHMuZGU+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5rZXJuZWxjb25jZXB0cy5kZQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBrZXJuZWwgY29uY2VwdHMgbm9yIE5pbHMgRmFlcmJlciBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMAlrZXJuZWwgY29uY2VwdHMgPG5pbHNAa2VybmVsY29uY2VwdHMuZGU+CisgKgkJCQlkZXZlbG9wZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplbnRybyBBRywgSGFhci9NdW5pY2ggKEdlcm1hbnkpCisgKgorICoJVENPIHRpbWVyIGRyaXZlciBmb3IgaTh4eCBjaGlwc2V0cworICoJYmFzZWQgb24gc29mdGRvZy5jIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJVGhlIFRDTyB0aW1lciBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgZm9sbG93aW5nIEkvTyBjb250cm9sbGVyIGh1YnM6CisgKgkoU2VlIHRoZSBpbnRlbCBkb2N1bWVudGF0aW9uIG9uIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tLikKKyAqCTgyODAxQUEgIChJQ0gpICAgIDogZG9jdW1lbnQgbnVtYmVyIDI5MDY1NS0wMDMsIDI5MDY3Ny0wMTQsCisgKgk4MjgwMUFCICAoSUNITykgICA6IGRvY3VtZW50IG51bWJlciAyOTA2NTUtMDAzLCAyOTA2NzctMDE0LAorICoJODI4MDFCQSAgKElDSDIpICAgOiBkb2N1bWVudCBudW1iZXIgMjkwNjg3LTAwMiwgMjk4MjQyLTAyNywKKyAqCTgyODAxQkFNIChJQ0gyLU0pIDogZG9jdW1lbnQgbnVtYmVyIDI5MDY4Ny0wMDIsIDI5ODI0Mi0wMjcsCisgKgk4MjgwMUNBICAoSUNIMy1TKSA6IGRvY3VtZW50IG51bWJlciAyOTA3MzMtMDAzLCAyOTA3MzktMDEzLAorICoJODI4MDFDQU0gKElDSDMtTSkgOiBkb2N1bWVudCBudW1iZXIgMjkwNzE2LTAwMSwgMjkwNzE4LTAwNywKKyAqCTgyODAxREIgIChJQ0g0KSAgIDogZG9jdW1lbnQgbnVtYmVyIDI5MDc0NC0wMDEsIDI5MDc0NS0wMjAsCisgKgk4MjgwMURCTSAoSUNINC1NKSA6IGRvY3VtZW50IG51bWJlciAyNTIzMzctMDAxLCAyNTI2NjMtMDA1LAorICoJODI4MDFFICAgKEMtSUNIKSAgOiBkb2N1bWVudCBudW1iZXIgMjczNTk5LTAwMSwgMjczNjQ1LTAwMiwKKyAqCTgyODAxRUIgIChJQ0g1KSAgIDogZG9jdW1lbnQgbnVtYmVyIDI1MjUxNi0wMDEsIDI1MjUxNy0wMDMsCisgKgk4MjgwMUVSICAoSUNINVIpICA6IGRvY3VtZW50IG51bWJlciAyNTI1MTYtMDAxLCAyNTI1MTctMDAzLAorICoJODI4MDFGQiAgKElDSDYpICAgOiBkb2N1bWVudCBudW1iZXIgMzAxNDczLTAwMiwgMzAxNDc0LTAwNywKKyAqCTgyODAxRlIgIChJQ0g2UikgIDogZG9jdW1lbnQgbnVtYmVyIDMwMTQ3My0wMDIsIDMwMTQ3NC0wMDcsCisgKgk4MjgwMUZCTSAoSUNINi1NKSA6IGRvY3VtZW50IG51bWJlciAzMDE0NzMtMDAyLCAzMDE0NzQtMDA3LAorICoJODI4MDFGVyAgKElDSDZXKSAgOiBkb2N1bWVudCBudW1iZXIgMzAxNDczLTAwMSwgMzAxNDc0LTAwNywKKyAqCTgyODAxRlJXIChJQ0g2UlcpIDogZG9jdW1lbnQgbnVtYmVyIDMwMTQ3My0wMDEsIDMwMTQ3NC0wMDcKKyAqCisgKiAgMjAwMDA3MTAgTmlscyBGYWVyYmVyCisgKglJbml0aWFsIFZlcnNpb24gMC4wMQorICogIDIwMDAwNzI4IE5pbHMgRmFlcmJlcgorICoJMC4wMiBGaXggZm9yIFNNSV9FTi0+VENPX0VOIGJpdCwgc29tZSBjbGVhbnVwcworICogIDIwMDExMjE0IE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqCTAuMDMgQWRkZWQgbm93YXlvdXQgbW9kdWxlIG9wdGlvbiB0byBvdmVycmlkZSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKyAqCSAgICAgRGlkbid0IGFkZCB0aW1lb3V0IG9wdGlvbiBhcyBpODEwX21hcmdpbiBhbHJlYWR5IGV4aXN0cy4KKyAqICAyMDAyMDIyNCBKb2VsIEJlY2tlciwgV2ltIFZhbiBTZWJyb2VjaworICoJMC4wNCBTdXBwb3J0IGZvciA4MjgwMUNBKE0pIGNoaXBzZXQsIHRpbWVyIG1hcmdpbiBuZWVkcyB0byBiZSA+IDMsCisgKgkgICAgIGFkZCBzdXBwb3J0IGZvciBXRElPQ19TRVRUSU1FT1VUIGFuZCBXRElPQ19HRVRUSU1FT1VULgorICogIDIwMDIwNDEyIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPiwgV2ltIFZhbiBTZWJyb2VjaworICoJMC4wNSBGaXggcG9zc2libGUgdGltZXJfYWxpdmUgcmFjZSwgYWRkIGV4cGVjdCBjbG9zZSBzdXBwb3J0LAorICoJICAgICBjbGVhbiB1cCBpb2N0bHMgKFdESU9DX0dFVFNUQVRVUywgV0RJT0NfR0VUQk9PVFNUQVRVUyBhbmQKKyAqCSAgICAgV0RJT0NfU0VUT1BUSU9OUyksIG1hZGUgaTgxMHRjb19nZXRkZXZpY2UgX19pbml0LAorICoJICAgICByZW1vdmVkIGJvb3Rfc3RhdHVzLCByZW1vdmVkIHRjb190aW1lcl9yZWFkLAorICoJICAgICBhZGRlZCBzdXBwb3J0IGZvciA4MjgwMURCIGFuZCA4MjgwMUUgY2hpcHNldCwKKyAqCSAgICAgYWRkZWQgc3VwcG9ydCBmb3IgODI4MDFFQiBhbmQgODI4MEVSIGNoaXBzZXQsCisgKgkgICAgIGdlbmVyYWwgY2xlYW51cC4KKyAqICAyMDAzMDkyMSBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPgorICoJMC4wNiBjaGFuZ2UgaTgxMF9tYXJnaW4gdG8gaGVhcnRiZWF0LCB1c2UgbW9kdWxlX3BhcmFtLAorICoJICAgICBhZGRlZCBub3RpZnkgc3lzdGVtIHN1cHBvcnQsIHJlbmFtZWQgbW9kdWxlIHRvIGk4eHhfdGNvLgorICogIDIwMDUwMTI4IFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+CisgKgkwLjA3IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBJQ0g0LU0sIElDSDYsIElDSDZSLCBJQ0g2LU0sIElDSDZXIGFuZCBJQ0g2UlcKKyAqCSAgICAgY2hpcHNldHMuIEFsc28gYWRkZWQgc3VwcG9ydCBmb3IgdGhlICJ1bmRvY3VtZW50ZWQiIElDSDcgY2hpcHNldC4KKyAqLworCisvKgorICoJSW5jbHVkZXMsIGRlZmluZXMsIHZhcmlhYmxlcywgbW9kdWxlIHBhcmFtZXRlcnMsIC4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJpOHh4X3Rjby5oIgorCisvKiBNb2R1bGUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVENPX1ZFUlNJT04gIjAuMDciCisjZGVmaW5lIFRDT19NT0RVTEVfTkFNRSAiaTh4eCBUQ08gdGltZXIiCisjZGVmaW5lIFRDT19EUklWRVJfTkFNRSAgIFRDT19NT0RVTEVfTkFNRSAiLCB2IiBUQ09fVkVSU0lPTgorI2RlZmluZSBQRlggVENPX01PRFVMRV9OQU1FICI6ICIKKworLyogaW50ZXJuYWwgdmFyaWFibGVzICovCitzdGF0aWMgdW5zaWduZWQgaW50IEFDUElCQVNFOworc3RhdGljIHNwaW5sb2NrX3QgdGNvX2xvY2s7CS8qIEd1YXJkcyB0aGUgaGFyZHdhcmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2FsaXZlOworc3RhdGljIGNoYXIgdGNvX2V4cGVjdF9jbG9zZTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqaTh4eF90Y29fcGNpOworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgMzAJLyogMzAgc2VjIGRlZmF1bHQgaGVhcnRiZWF0ICgyPGhlYXJ0YmVhdDwzOSkgKi8KK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOyAgLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgyPGhlYXJ0YmVhdDwzOSwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19IRUFSVEJFQVQpICIpIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKgorICogU29tZSBUQ08gc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHNlY29uZHNfdG9fdGlja3MoaW50IHNlY29uZHMpCit7CisJLyogdGhlIGludGVybmFsIHRpbWVyIGlzIHN0b3JlZCBhcyB0aWNrcyB3aGljaCBkZWNyZW1lbnQKKwkgKiBldmVyeSAwLjYgc2Vjb25kcyAqLworCXJldHVybiAoc2Vjb25kcyAqIDEwKSAvIDY7Cit9CisKK3N0YXRpYyBpbnQgdGNvX3RpbWVyX3N0YXJ0ICh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJc3Bpbl9sb2NrKCZ0Y29fbG9jayk7CisJdmFsID0gaW5iIChUQ08xX0NOVCArIDEpOworCXZhbCAmPSAweGY3OworCW91dGIgKHZhbCwgVENPMV9DTlQgKyAxKTsKKwl2YWwgPSBpbmIgKFRDTzFfQ05UICsgMSk7CisJc3Bpbl91bmxvY2soJnRjb19sb2NrKTsKKworCWlmICh2YWwgJiAweDA4KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNvX3RpbWVyX3N0b3AgKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzcGluX2xvY2soJnRjb19sb2NrKTsKKwl2YWwgPSBpbmIgKFRDTzFfQ05UICsgMSk7CisJdmFsIHw9IDB4MDg7CisJb3V0YiAodmFsLCBUQ08xX0NOVCArIDEpOworCXZhbCA9IGluYiAoVENPMV9DTlQgKyAxKTsKKwlzcGluX3VubG9jaygmdGNvX2xvY2spOworCisJaWYgKCh2YWwgJiAweDA4KSA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNvX3RpbWVyX2tlZXBhbGl2ZSAodm9pZCkKK3sKKwlzcGluX2xvY2soJnRjb19sb2NrKTsKKwlvdXRiICgweDAxLCBUQ08xX1JMRCk7CisJc3Bpbl91bmxvY2soJnRjb19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y29fdGltZXJfc2V0X2hlYXJ0YmVhdCAoaW50IHQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgY2hhciB0bXJ2YWw7CisKKwl0bXJ2YWwgPSBzZWNvbmRzX3RvX3RpY2tzKHQpOworCS8qIGZyb20gdGhlIHNwZWNzOiAqLworCS8qICJWYWx1ZXMgb2YgMGgtM2ggYXJlIGlnbm9yZWQgYW5kIHNob3VsZCBub3QgYmUgYXR0ZW1wdGVkIiAqLworCWlmICh0bXJ2YWwgPiAweDNmIHx8IHRtcnZhbCA8IDB4MDQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV3JpdGUgbmV3IGhlYXJ0YmVhdCB0byB3YXRjaGRvZyAqLworCXNwaW5fbG9jaygmdGNvX2xvY2spOworCXZhbCA9IGluYiAoVENPMV9UTVIpOworCXZhbCAmPSAweGMwOworCXZhbCB8PSB0bXJ2YWw7CisJb3V0YiAodmFsLCBUQ08xX1RNUik7CisJdmFsID0gaW5iIChUQ08xX1RNUik7CisJc3Bpbl91bmxvY2soJnRjb19sb2NrKTsKKworCWlmICgodmFsICYgMHgzZikgIT0gdG1ydmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhlYXJ0YmVhdCA9IHQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIGludCBpOHh4X3Rjb19vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnRpbWVyX2FsaXZlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qCisJICogICAgICBSZWxvYWQgYW5kIGFjdGl2YXRlIHRpbWVyCisJICovCisJdGNvX3RpbWVyX2tlZXBhbGl2ZSAoKTsKKwl0Y29fdGltZXJfc3RhcnQgKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGk4eHhfdGNvX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogICAgICBTaHV0IG9mZiB0aGUgdGltZXIuCisJICovCisJaWYgKHRjb19leHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJdGNvX3RpbWVyX3N0b3AgKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQl0Y29fdGltZXJfa2VlcGFsaXZlICgpOworCX0KKwljbGVhcl9iaXQoMCwgJnRpbWVyX2FsaXZlKTsKKwl0Y29fZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaTh4eF90Y29fd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqIHBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJdGNvX2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJdGNvX2V4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJlbG9hZCB0aGUgdGltZXIgKi8KKwkJdGNvX3RpbWVyX2tlZXBhbGl2ZSAoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBpOHh4X3Rjb19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgbmV3X2hlYXJ0YmVhdDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX1NFVFRJTUVPVVQgfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPQkJVENPX01PRFVMRV9OQU1FLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwKKwkJCQlzaXplb2YgKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyICgwLCBwKTsKKworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXRjb190aW1lcl9rZWVwYWxpdmUgKCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWlmIChnZXRfdXNlciAobmV3X29wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXRjb190aW1lcl9zdG9wICgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQl0Y29fdGltZXJfa2VlcGFsaXZlICgpOworCQkJCXRjb190aW1lcl9zdGFydCAoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQl7CisJCQlpZiAoZ2V0X3VzZXIobmV3X2hlYXJ0YmVhdCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICh0Y29fdGltZXJfc2V0X2hlYXJ0YmVhdChuZXdfaGVhcnRiZWF0KSkKKwkJCSAgICByZXR1cm4gLUVJTlZBTDsKKworCQkJdGNvX3RpbWVyX2tlZXBhbGl2ZSAoKTsKKwkJCS8qIEZhbGwgKi8KKwkJfQorCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworLyoKKyAqCU5vdGlmeSBzeXN0ZW0KKyAqLworCitzdGF0aWMgaW50IGk4eHhfdGNvX25vdGlmeV9zeXMgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJdGNvX3RpbWVyX3N0b3AgKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpOHh4X3Rjb19mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLndyaXRlID0JaTh4eF90Y29fd3JpdGUsCisJLmlvY3RsID0JaTh4eF90Y29faW9jdGwsCisJLm9wZW4gPQkJaTh4eF90Y29fb3BlbiwKKwkucmVsZWFzZSA9CWk4eHhfdGNvX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaTh4eF90Y29fbWlzY2RldiA9IHsKKwkubWlub3IgPQlXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9CQkid2F0Y2hkb2ciLAorCS5mb3BzID0JCSZpOHh4X3Rjb19mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpOHh4X3Rjb19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9CWk4eHhfdGNvX25vdGlmeV9zeXMsCit9OworCisvKgorICogRGF0YSBmb3IgUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGRhdGEgb25seSBleGlzdHMgZm9yIGV4cG9ydGluZyB0aGUgc3VwcG9ydGVkCisgKiBQQ0kgaWRzIHZpYSBNT0RVTEVfREVWSUNFX1RBQkxFLiAgV2UgZG8gbm90IGFjdHVhbGx5CisgKiByZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0IG9uZSBkYXkKKyAqIHdhbnQgdG8gcmVnaXN0ZXIgYW5vdGhlciBkcml2ZXIgb24gdGhlIHNhbWUgUENJIGlkLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTh4eF90Y29fcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzEwLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTIsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFXzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLCB9LAkJCS8qIEVuZCBvZiBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBpOHh4X3Rjb19wY2lfdGJsKTsKKworLyoKKyAqCUluaXQgJiBleGl0IHJvdXRpbmVzCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pbml0IGk4eHhfdGNvX2dldGRldmljZSAodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwl1OCB2YWwxLCB2YWwyOworCXUxNiBiYWRyOworCS8qCisJICogICAgICBGaW5kIHRoZSBQQ0kgZGV2aWNlCisJICovCisKKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJCWlmIChwY2lfbWF0Y2hfZGV2aWNlKGk4eHhfdGNvX3BjaV90YmwsIGRldikpIHsKKwkJCWk4eHhfdGNvX3BjaSA9IGRldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGk4eHhfdGNvX3BjaSkgeworCQkvKgorCQkgKiAgICAgIEZpbmQgdGhlIEFDUEkgYmFzZSBJL08gYWRkcmVzcyB3aGljaCBpcyB0aGUgYmFzZQorCQkgKiAgICAgIGZvciB0aGUgVENPIHJlZ2lzdGVycyAoVENPQkFTRT1BQ1BJQkFTRSArIDB4NjApCisJCSAqICAgICAgQUNQSUJBU0UgaXMgYml0cyBbMTU6N10gZnJvbSAweDQwLTB4NDMKKwkJICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChpOHh4X3Rjb19wY2ksIDB4NDAsICZ2YWwxKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGk4eHhfdGNvX3BjaSwgMHg0MSwgJnZhbDIpOworCQliYWRyID0gKCh2YWwyIDw8IDEpIHwgKHZhbDEgPj4gNykpIDw8IDc7CisJCUFDUElCQVNFID0gYmFkcjsKKwkJLyogU29tZXRoaW5nJ3Mgd3JvbmcgaGVyZSwgQUNQSUJBU0UgaGFzIHRvIGJlIHNldCAqLworCQlpZiAoYmFkciA9PSAweDAwMDEgfHwgYmFkciA9PSAweDAwMDApIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gZ2V0IFRDT0JBU0UgYWRkcmVzc1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKgorCQkgKiBDaGVjayBjaGlwc2V0J3MgTk9fUkVCT09UIGJpdAorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGk4eHhfdGNvX3BjaSwgMHhkNCwgJnZhbDEpOworCQlpZiAodmFsMSAmIDB4MDIpIHsKKwkJCXZhbDEgJj0gMHhmZDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoaTh4eF90Y29fcGNpLCAweGQ0LCB2YWwxKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChpOHh4X3Rjb19wY2ksIDB4ZDQsICZ2YWwxKTsKKwkJCWlmICh2YWwxICYgMHgwMikgeworCQkJCXByaW50ayAoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gcmVzZXQgTk9fUkVCT09UIGZsYWcsIHJlYm9vdCBkaXNhYmxlZCBieSBoYXJkd2FyZVxuIik7CisJCQkJcmV0dXJuIDA7CS8qIENhbm5vdCByZXNldCBOT19SRUJPT1QgYml0ICovCisJCQl9CisJCX0KKwkJLyogU2V0IHRoZSBUQ09fRU4gYml0IGluIFNNSV9FTiByZWdpc3RlciAqLworCQlpZiAoIXJlcXVlc3RfcmVnaW9uIChTTUlfRU4gKyAxLCAxLCAiaTh4eCBUQ08iKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCQlTTUlfRU4gKyAxKTsKKwkJCXJldHVybiAwOworCQl9CisJCXZhbDEgPSBpbmIgKFNNSV9FTiArIDEpOworCQl2YWwxICY9IDB4ZGY7CisJCW91dGIgKHZhbDEsIFNNSV9FTiArIDEpOworCQlyZWxlYXNlX3JlZ2lvbiAoU01JX0VOICsgMSwgMSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgd2F0Y2hkb2dfaW5pdCAodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJnRjb19sb2NrKTsKKworCS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBpcyB0aGVyZSAqLworCWlmICghaTh4eF90Y29fZ2V0ZGV2aWNlICgpIHx8IGk4eHhfdGNvX3BjaSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghcmVxdWVzdF9yZWdpb24gKFRDT0JBU0UsIDB4MTAsICJpOHh4IFRDTyIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQlUQ09CQVNFKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2xlYXIgb3V0IHRoZSAocHJvYmFibHkgb2xkKSBzdGF0dXMgKi8KKwlvdXRiICgwLCBUQ08xX1NUUyk7CisJb3V0YiAoMywgVENPMl9TVFMpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKHRjb190aW1lcl9zZXRfaGVhcnRiZWF0IChoZWFydGJlYXQpKSB7CisJCWhlYXJ0YmVhdCA9IFdBVENIRE9HX0hFQVJUQkVBVDsKKwkJdGNvX3RpbWVyX3NldF9oZWFydGJlYXQgKGhlYXJ0YmVhdCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJoZWFydGJlYXQgdmFsdWUgbXVzdCBiZSAyPGhlYXJ0YmVhdDwzOSwgdXNpbmcgJWRcbiIsCisJCQloZWFydGJlYXQpOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaTh4eF90Y29fbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ19yZWdpb247CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmaTh4eF90Y29fbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gdW5yZWdfbm90aWZpZXI7CisJfQorCisJdGNvX3RpbWVyX3N0b3AgKCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkICgweCUwNHgpLiBoZWFydGJlYXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCVRDT0JBU0UsIGhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7CisKK3VucmVnX25vdGlmaWVyOgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpOHh4X3Rjb19ub3RpZmllcik7Cit1bnJlZ19yZWdpb246CisJcmVsZWFzZV9yZWdpb24gKFRDT0JBU0UsIDB4MTApOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YXRjaGRvZ19jbGVhbnVwICh2b2lkKQoreworCXU4IHZhbDsKKworCS8qIFN0b3AgdGhlIHRpbWVyIGJlZm9yZSB3ZSBsZWF2ZSAqLworCWlmICghbm93YXlvdXQpCisJCXRjb190aW1lcl9zdG9wICgpOworCisJLyogU2V0IHRoZSBOT19SRUJPT1QgYml0IHRvIHByZXZlbnQgbGF0ZXIgcmVib290cywganVzdCBmb3Igc3VyZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChpOHh4X3Rjb19wY2ksIDB4ZDQsICZ2YWwpOworCXZhbCB8PSAweDAyOworCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoaTh4eF90Y29fcGNpLCAweGQ0LCB2YWwpOworCisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3RlciAoJmk4eHhfdGNvX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpOHh4X3Rjb19ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24gKFRDT0JBU0UsIDB4MTApOworfQorCittb2R1bGVfaW5pdCh3YXRjaGRvZ19pbml0KTsKK21vZHVsZV9leGl0KHdhdGNoZG9nX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJOaWxzIEZhZXJiZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVENPIHRpbWVyIGRyaXZlciBmb3IgaTh4eCBjaGlwc2V0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmggYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzE0ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqCWk4eHhfdGNvOglUQ08gdGltZXIgZHJpdmVyIGZvciBpOHh4IGNoaXBzZXRzCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwIGtlcm5lbCBjb25jZXB0cyA8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3Lmtlcm5lbGNvbmNlcHRzLmRlCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIGtlcm5lbCBjb25jZXB0cyBub3IgTmlscyBGYWVyYmVyIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwCWtlcm5lbCBjb25jZXB0cyA8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4KKyAqCQkJCWRldmVsb3BlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVudHJvIEFHLCBIYWFyL011bmljaCAoR2VybWFueSkKKyAqCisgKglUQ08gdGltZXIgZHJpdmVyIGZvciBpOHh4IGNoaXBzZXRzCisgKgliYXNlZCBvbiBzb2Z0ZG9nLmMgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKglGb3IgaGlzdG9yeSBhbmQgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIEkvTyBDb250cm9sbGVyIEh1YidzCisgKglzZWUgaTh4eF90Y28uYworICovCisKKworLyoKKyAqIFNvbWUgYWRkcmVzcyBkZWZpbml0aW9ucyBmb3IgdGhlIFRDTworICovCisKKyNkZWZpbmUJVENPQkFTRQkJQUNQSUJBU0UgKyAweDYwCS8qIFRDTyBiYXNlIGFkZHJlc3MJCSovCisjZGVmaW5lIFRDTzFfUkxECVRDT0JBU0UgKyAweDAwCS8qIFRDTyBUaW1lciBSZWxvYWQgYW5kIEN1cnJlbnQgVmFsdWUgKi8KKyNkZWZpbmUgVENPMV9UTVIJVENPQkFTRSArIDB4MDEJLyogVENPIFRpbWVyIEluaXRpYWwgVmFsdWUJKi8KKyNkZWZpbmUJVENPMV9EQVRfSU4JVENPQkFTRSArIDB4MDIJLyogVENPIERhdGEgSW4gUmVnaXN0ZXIJCSovCisjZGVmaW5lCVRDTzFfREFUX09VVAlUQ09CQVNFICsgMHgwMwkvKiBUQ08gRGF0YSBPdXQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUJVENPMV9TVFMJVENPQkFTRSArIDB4MDQJLyogVENPMSBTdGF0dXMgUmVnaXN0ZXIJCSovCisjZGVmaW5lCVRDTzJfU1RTCVRDT0JBU0UgKyAweDA2CS8qIFRDTzIgU3RhdHVzIFJlZ2lzdGVyCQkqLworI2RlZmluZSBUQ08xX0NOVAlUQ09CQVNFICsgMHgwOAkvKiBUQ08xIENvbnRyb2wgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVENPMl9DTlQJVENPQkFTRSArIDB4MGEJLyogVENPMiBDb250cm9sIFJlZ2lzdGVyCSovCisKKyNkZWZpbmUJU01JX0VOCQlBQ1BJQkFTRSArIDB4MzAJLyogU01JIENvbnRyb2wgYW5kIEVuYWJsZSBSZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2liNzAwd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaWI3MDB3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTc0ZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2liNzAwd2R0LmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKglJQjcwMCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV0RUIGRyaXZlcgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBDaGFybGVzIEhvd2VzIDxjaG93ZXNAdnNvbC5uZXQ+CisgKgorICogICAgICBCYXNlZCBvbiBhZHZhbnRlY2h3ZHQuYyB3aGljaCBpcyBiYXNlZCBvbiBhY3F1aXJld2R0LmMgd2hpY2gKKyAqICAgICAgIGlzIGJhc2VkIG9uIHdkdC5jLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CisgKgorICoJQmFzZWQgb24gYWNxdWlyZXdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgorICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCBub3IgQ3ltcnVOZXQgTHRkLiBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NSAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqICAgICAgMTQtRGVjLTIwMDEgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogICAgICAgICAgIEFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKiAgICAgICAgICAgQWRkZWQgdGltZW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIGRlZmF1bHQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaWJ3ZHRfaXNfb3BlbjsKK3N0YXRpYyBzcGlubG9ja190IGlid2R0X2xvY2s7CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CisKKyNkZWZpbmUgUEZYICJpYjcwMHdkdDogIgorCisvKgorICoKKyAqIFdhdGNoZG9nIFRpbWVyIENvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGUgZnVuY3Rpb24gb2YgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIHRvIHJlc2V0IHRoZSBzeXN0ZW0KKyAqIGF1dG9tYXRpY2FsbHkgYW5kIGlzIGRlZmluZWQgYXQgSS9PIHBvcnQgMDQ0M0guICBUbyBlbmFibGUgdGhlCisgKiB3YXRjaGRvZyB0aW1lciBhbmQgYWxsb3cgdGhlIHN5c3RlbSB0byByZXNldCwgd3JpdGUgSS9PIHBvcnQgMDQ0M0guCisgKiBUbyBkaXNhYmxlIHRoZSB0aW1lciwgd3JpdGUgSS9PIHBvcnQgMDQ0MUggZm9yIHRoZSBzeXN0ZW0gdG8gc3RvcCB0aGUKKyAqIHdhdGNoZG9nIGZ1bmN0aW9uLiAgVGhlIHRpbWVyIGhhcyBhIHRvbGVyYW5jZSBvZiAyMCUgZm9yIGl0cworICogaW50ZXJ2YWxzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIGhvdyB0aGUgdGltZXIgc2hvdWxkIGJlIHByb2dyYW1tZWQuCisgKgorICogRW5hYmxpbmcgV2F0Y2hkb2c6CisgKiBNT1YgQVgsMDAwRkggKENob29zZSB0aGUgdmFsdWVzIGZyb20gMCB0byBGKQorICogTU9WIERYLDA0NDNICisgKiBPVVQgRFgsQVgKKyAqCisgKiBEaXNhYmxpbmcgV2F0Y2hkb2c6CisgKiBNT1YgQVgsMDAwRkggKEFueSB2YWx1ZSBpcyBmaW5lLikKKyAqIE1PViBEWCwwNDQxSAorICogT1VUIERYLEFYCisgKgorICogV2F0Y2hkb2cgdGltZXIgY29udHJvbCB0YWJsZToKKyAqIExldmVsICAgVmFsdWUgIFRpbWUvc2VjIHwgTGV2ZWwgVmFsdWUgVGltZS9zZWMKKyAqICAgMSAgICAgICBGICAgICAgIDAgICAgIHwgICA5ICAgICA3ICAgICAgMTYKKyAqICAgMiAgICAgICBFICAgICAgIDIgICAgIHwgICAxMCAgICA2ICAgICAgMTgKKyAqICAgMyAgICAgICBEICAgICAgIDQgICAgIHwgICAxMSAgICA1ICAgICAgMjAKKyAqICAgNCAgICAgICBDICAgICAgIDYgICAgIHwgICAxMiAgICA0ICAgICAgMjIKKyAqICAgNSAgICAgICBCICAgICAgIDggICAgIHwgICAxMyAgICAzICAgICAgMjQKKyAqICAgNiAgICAgICBBICAgICAgIDEwICAgIHwgICAxNCAgICAyICAgICAgMjYKKyAqICAgNyAgICAgICA5ICAgICAgIDEyICAgIHwgICAxNSAgICAxICAgICAgMjgKKyAqICAgOCAgICAgICA4ICAgICAgIDE0ICAgIHwgICAxNiAgICAwICAgICAgMzAKKyAqCisgKi8KKworc3RhdGljIGludCB3ZF90aW1lc1tdID0geworCTMwLAkvKiAweDAgKi8KKwkyOCwJLyogMHgxICovCisJMjYsCS8qIDB4MiAqLworCTI0LAkvKiAweDMgKi8KKwkyMiwJLyogMHg0ICovCisJMjAsCS8qIDB4NSAqLworCTE4LAkvKiAweDYgKi8KKwkxNiwJLyogMHg3ICovCisJMTQsCS8qIDB4OCAqLworCTEyLAkvKiAweDkgKi8KKwkxMCwJLyogMHhBICovCisJOCwJLyogMHhCICovCisJNiwJLyogMHhDICovCisJNCwJLyogMHhEICovCisJMiwJLyogMHhFICovCisJMCwJLyogMHhGICovCit9OworCisjZGVmaW5lIFdEVF9TVE9QIDB4NDQxCisjZGVmaW5lIFdEVF9TVEFSVCAweDQ0MworCisvKiBEZWZhdWx0IHRpbWVvdXQgKi8KKyNkZWZpbmUgV0RfVElNTyAwCQkvKiAzMCBzZWNvbmRzICsvLSAyMCUsIGZyb20gdGFibGUgKi8KKworc3RhdGljIGludCB3ZF9tYXJnaW4gPSBXRF9USU1POworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworCisvKgorICoJS2VybmVsIG1ldGhvZHMuCisgKi8KKworc3RhdGljIHZvaWQKK2lid2R0X3Bpbmcodm9pZCkKK3sKKwkvKiBXcml0ZSBhIHdhdGNoZG9nIHZhbHVlICovCisJb3V0Yl9wKHdkX21hcmdpbiwgV0RUX1NUQVJUKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lid2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlpYndkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAoraWJ3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaSwgbmV3X21hcmdpbjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIklCNzAwIFdEVCIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCSAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJICByZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkgIGlid2R0X3BpbmcoKTsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCSAgaWYgKGdldF91c2VyKG5ld19tYXJnaW4sIHApKQorCQkgIHJldHVybiAtRUZBVUxUOworCSAgaWYgKChuZXdfbWFyZ2luIDwgMCkgfHwgKG5ld19tYXJnaW4gPiAzMCkpCisJCSAgcmV0dXJuIC1FSU5WQUw7CisJICBmb3IgKGkgPSAweDBGOyBpID4gLTE7IGktLSkKKwkJICBpZiAod2RfdGltZXNbaV0gPiBuZXdfbWFyZ2luKQorCQkJICBicmVhazsKKwkgIHdkX21hcmdpbiA9IGk7CisJICBpYndkdF9waW5nKCk7CisJICAvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJICByZXR1cm4gcHV0X3VzZXIod2RfdGltZXNbd2RfbWFyZ2luXSwgcCk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICByZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWJ3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2soJmlid2R0X2xvY2spOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZpYndkdF9pc19vcGVuKSkgeworCQlzcGluX3VubG9jaygmaWJ3ZHRfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIEFjdGl2YXRlICovCisJaWJ3ZHRfcGluZygpOworCXNwaW5fdW5sb2NrKCZpYndkdF9sb2NrKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQKK2lid2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNwaW5fbG9jaygmaWJ3ZHRfbG9jayk7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikKKwkJb3V0Yl9wKDAsIFdEVF9TVE9QKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJXRFQgZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkuICBXRFQgd2lsbCBub3Qgc3RvcCFcbiIpOworCisJY2xlYXJfYml0KDAsICZpYndkdF9pc19vcGVuKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCXNwaW5fdW5sb2NrKCZpYndkdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQKK2lid2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQlvdXRiX3AoMCwgV0RUX1NUT1ApOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlid2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBpYndkdF93cml0ZSwKKwkuaW9jdGwJCT0gaWJ3ZHRfaW9jdGwsCisJLm9wZW4JCT0gaWJ3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IGlid2R0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGlid2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJmlid2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlid2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gaWJ3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlid2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldEVCBkcml2ZXIgZm9yIElCNzAwIHNpbmdsZSBib2FyZCBjb21wdXRlciBpbml0aWFsaXNpbmcuXG4iKTsKKworCXNwaW5fbG9ja19pbml0KCZpYndkdF9sb2NrKTsKKwlyZXMgPSBtaXNjX3JlZ2lzdGVyKCZpYndkdF9taXNjZGV2KTsKKwlpZiAocmVzKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9ub21pc2M7CisJfQorCisjaWYgV0RUX1NUQVJUICE9IFdEVF9TVE9QCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihXRFRfU1RPUCwgMSwgIklCNzAwIFdEVCIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJTVE9QIG1ldGhvZCBJL08gJVggaXMgbm90IGF2YWlsYWJsZS5cbiIsIFdEVF9TVE9QKTsKKwkJcmVzID0gLUVJTzsKKwkJZ290byBvdXRfbm9zdG9wcmVnOworCX0KKyNlbmRpZgorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihXRFRfU1RBUlQsIDEsICJJQjcwMCBXRFQiKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiU1RBUlQgbWV0aG9kIEkvTyAlWCBpcyBub3QgYXZhaWxhYmxlLlxuIiwgV0RUX1NUQVJUKTsKKwkJcmVzID0gLUVJTzsKKwkJZ290byBvdXRfbm9zdGFydHJlZzsKKwl9CisJcmVzID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpYndkdF9ub3RpZmllcik7CisJaWYgKHJlcykgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllci5cbiIpOworCQlnb3RvIG91dF9ub3JlYm9vdDsKKwl9CisJcmV0dXJuIDA7CisKK291dF9ub3JlYm9vdDoKKwlyZWxlYXNlX3JlZ2lvbihXRFRfU1RBUlQsIDEpOworb3V0X25vc3RhcnRyZWc6CisjaWYgV0RUX1NUQVJUICE9IFdEVF9TVE9QCisJcmVsZWFzZV9yZWdpb24oV0RUX1NUT1AsIDEpOworI2VuZGlmCitvdXRfbm9zdG9wcmVnOgorCW1pc2NfZGVyZWdpc3RlcigmaWJ3ZHRfbWlzY2Rldik7CitvdXRfbm9taXNjOgorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraWJ3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmaWJ3ZHRfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmlid2R0X25vdGlmaWVyKTsKKyNpZiBXRFRfU1RBUlQgIT0gV0RUX1NUT1AKKwlyZWxlYXNlX3JlZ2lvbihXRFRfU1RPUCwxKTsKKyNlbmRpZgorCXJlbGVhc2VfcmVnaW9uKFdEVF9TVEFSVCwxKTsKK30KKworbW9kdWxlX2luaXQoaWJ3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChpYndkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQ2hhcmxlcyBIb3dlcyA8Y2hvd2VzQHZzb2wubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJQjcwMCBTQkMgd2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKKy8qIGVuZCBvZiBpYjcwMHdkdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaW5keWRvZy5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2luZHlkb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWYyYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2luZHlkb2cuYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqCUluZHlEb2cJMC4zCUEgSGFyZHdhcmUgV2F0Y2hkb2cgRGV2aWNlIGZvciBTR0kgSVAyMgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMiBHdWlkbyBHdWVudGhlciA8YWd4QHNpZ3hjcHUub3JnPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCWJhc2VkIG9uIHNvZnRkb2cuYyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9tYy5oPgorCisjZGVmaW5lIFBGWCAiaW5keWRvZzogIgorc3RhdGljIGludCBpbmR5ZG9nX2FsaXZlOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgMzAJCS8qIDMwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKK3N0YXRpYyB2b2lkIGluZHlkb2dfc3RhcnQodm9pZCkKK3sKKwl1MzIgbWNfY3RybDAgPSBzZ2ltYy0+Y3B1Y3RybDA7CisKKwltY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMCB8IFNHSU1DX0NDVFJMMF9XRE9HOworCXNnaW1jLT5jcHVjdHJsMCA9IG1jX2N0cmwwOworfQorCitzdGF0aWMgdm9pZCBpbmR5ZG9nX3N0b3Aodm9pZCkKK3sKKwl1MzIgbWNfY3RybDAgPSBzZ2ltYy0+Y3B1Y3RybDA7CisKKwltY19jdHJsMCAmPSB+U0dJTUNfQ0NUUkwwX1dET0c7CisJc2dpbWMtPmNwdWN0cmwwID0gbWNfY3RybDA7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RvcHBlZCB3YXRjaGRvZyB0aW1lci5cbiIpOworfQorCitzdGF0aWMgdm9pZCBpbmR5ZG9nX3Bpbmcodm9pZCkKK3sKKwlzZ2ltYy0+d2F0Y2hkb2d0ID0gMDsKK30KKworLyoKKyAqCUFsbG93IG9ubHkgb25lIHBlcnNvbiB0byBob2xkIGl0IG9wZW4KKyAqLworc3RhdGljIGludCBpbmR5ZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGluZHlkb2dfYWxpdmUpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBBY3RpdmF0ZSB0aW1lciAqLworCWluZHlkb2dfc3RhcnQoKTsKKwlpbmR5ZG9nX3BpbmcoKTsKKworCWluZHlkb2dfYWxpdmUgPSAxOworCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0ZWQgd2F0Y2hkb2cgdGltZXIuXG4iKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBpbmR5ZG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogU2h1dCBvZmYgdGhlIHRpbWVyLgorCSAqIExvY2sgaXQgaW4gaWYgaXQncyBhIG1vZHVsZSBhbmQgd2UgZGVmaW5lZCAuLi5OT1dBWU9VVCAqLworCWlmICghbm93YXlvdXQpCisJCWluZHlkb2dfc3RvcCgpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCisJaW5keWRvZ19hbGl2ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaW5keWRvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCS8qIFJlZnJlc2ggdGhlIHRpbWVyLiAqLworCWlmIChsZW4pIHsKKwkJaW5keWRvZ19waW5nKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgaW5keWRvZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zCQk9IFdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCQkgIFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uCT0gMCwKKwkJLmlkZW50aXR5CQk9ICJIYXJkd2FyZSBXYXRjaGRvZyBmb3IgU0dJIElQMjIiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gKilhcmcsCisJCQkJCSAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwoaW50ICopYXJnKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQlpbmR5ZG9nX3BpbmcoKTsKKwkJCXJldHVybiAwOworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoV0FUQ0hET0dfVElNRU9VVCwoaW50ICopYXJnKTsKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgKGludCAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQlpbmR5ZG9nX3N0b3AoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQlpbmR5ZG9nX3N0YXJ0KCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBpbmR5ZG9nX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQlpbmR5ZG9nX3N0b3AoKTsJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW5keWRvZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gaW5keWRvZ193cml0ZSwKKwkuaW9jdGwJCT0gaW5keWRvZ19pb2N0bCwKKwkub3BlbgkJPSBpbmR5ZG9nX29wZW4sCisJLnJlbGVhc2UJPSBpbmR5ZG9nX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaW5keWRvZ19taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZpbmR5ZG9nX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGluZHlkb2dfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpbmR5ZG9nX25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gUEZYICJIYXJkd2FyZSBXYXRjaGRvZyBUaW1lciBmb3IgU0dJIElQMjI6IDAuM1xuIjsKKworc3RhdGljIGludCBfX2luaXQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmluZHlkb2dfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmaW5keWRvZ19taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpbmR5ZG9nX25vdGlmaWVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoYmFubmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2F0Y2hkb2dfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmaW5keWRvZ19taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaW5keWRvZ19ub3RpZmllcik7Cit9CisKK21vZHVsZV9pbml0KHdhdGNoZG9nX2luaXQpOworbW9kdWxlX2V4aXQod2F0Y2hkb2dfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkd1aWRvIEd1ZW50aGVyIDxhZ3hAc2lneGNwdS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIFdhdGNoZG9nIERldmljZSBmb3IgU0dJIElQMjIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHAyMDAwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2NTlkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHAyMDAwX3dkdC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogZHJpdmVycy93YXRjaGRvZy9peHAyMDAwX3dkdC5jCisgKgorICogV2F0Y2hkb2cgZHJpdmVyIGZvciBJbnRlbCBJWFAyMDAwIG5ldHdvcmsgcHJvY2Vzc29ycworICoKKyAqIEFkYXB0ZWQgZnJvbSB0aGUgSVhQNHh4IHdhdGNoZG9nIGRyaXZlciBieSBMZW5uZXJ0IEJ1eXRlbmhlay4KKyAqIFRoZSBvcmlnaW5hbCB2ZXJzaW9uIGNhcnJpZXMgdGhlc2Ugbm90aWNlczoKKyAqCisgKiBBdXRob3I6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKgorICogQ29weXJpZ2h0IDIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCisgKiBCYXNlZCBvbiBzYTExMDAgZHJpdmVyLCBDb3B5cmlnaHQgKEMpIDIwMDAgT2xlZyBEcm9raW4gPGdyZWVuQGNyaW1lYS5lZHU+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IGhlYXJ0YmVhdCA9IDYwOwkvKiAoc2VjcykgRGVmYXVsdCBpcyAxIG1pbnV0ZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X3N0YXR1czsKKworI2RlZmluZQlXRFRfSU5fVVNFCQkwCisjZGVmaW5lCVdEVF9PS19UT19DTE9TRQkJMQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfdGlja19yYXRlOworCitzdGF0aWMgdm9pZAord2R0X2VuYWJsZSh2b2lkKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfUkVTRVQwLCAqKElYUDIwMDBfUkVTRVQwKSB8IFdEVF9SRVNFVF9FTkFCTEUpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVFdERSwgV0RUX0VOQUJMRSk7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9UNF9DTEQsIGhlYXJ0YmVhdCAqIHdkdF90aWNrX3JhdGUpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVDRfQ1RMLCBUSU1FUl9ESVZJREVSXzI1NiB8IFRJTUVSX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkCit3ZHRfZGlzYWJsZSh2b2lkKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVDRfQ1RMLCAwKTsKK30KKworc3RhdGljIHZvaWQKK3dkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1Q0X0NMRCwgaGVhcnRiZWF0ICogd2R0X3RpY2tfcmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2l4cDIwMDBfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoV0RUX0lOX1VTRSwgJndkdF9zdGF0dXMpKQorCQlyZXR1cm4gLUVCVVNZOworCisJY2xlYXJfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpOworCisJd2R0X2VuYWJsZSgpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdAoraXhwMjAwMF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAobGVuKSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQljbGVhcl9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YSArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCXNldF9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisJCQl9CisJCX0KKwkJd2R0X2tlZXBhbGl2ZSgpOworCX0KKworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCS5vcHRpb25zCT0gV0RJT0ZfTUFHSUNDTE9TRSB8IFdESU9GX1NFVFRJTUVPVVQgfAorCQkJCVdESU9GX0tFRVBBTElWRVBJTkcsCisJLmlkZW50aXR5CT0gIklYUDIwMDAgV2F0Y2hkb2ciLAorfTsKKworc3RhdGljIGludAoraXhwMjAwMF93ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOworCWludCB0aW1lOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCXJldCA9IGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gKilhcmcsICZpZGVudCwKKwkJCQkgICBzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJcmV0ID0gZ2V0X3VzZXIodGltZSwgKGludCAqKWFyZyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlpZiAodGltZSA8PSAwIHx8IHRpbWUgPiA2MCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaGVhcnRiZWF0ID0gdGltZTsKKwkJd2R0X2tlZXBhbGl2ZSgpOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0ID0gcHV0X3VzZXIoaGVhcnRiZWF0LCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0X2VuYWJsZSgpOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpeHAyMDAwX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKSkgeworCQl3ZHRfZGlzYWJsZSgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgIldBVENIRE9HOiBEZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZGx5IC0gIgorCQkJCQkidGltZXIgd2lsbCBub3Qgc3RvcFxuIik7CisJfQorCisJY2xlYXJfYml0KFdEVF9JTl9VU0UsICZ3ZHRfc3RhdHVzKTsKKwljbGVhcl9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpeHAyMDAwX3dkdF9mb3BzID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGl4cDIwMDBfd2R0X3dyaXRlLAorCS5pb2N0bAkJPSBpeHAyMDAwX3dkdF9pb2N0bCwKKwkub3BlbgkJPSBpeHAyMDAwX3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gaXhwMjAwMF93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpeHAyMDAwX3dkdF9taXNjZGV2ID0KK3sKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIklYUDIwMDAgV2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZpeHAyMDAwX3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXhwMjAwMF93ZHRfaW5pdCh2b2lkKQoreworCXdkdF90aWNrX3JhdGUgPSAoKklYUDIwMDBfVDFfQ0xEICogSFopLyAyNTY7OworCisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJml4cDIwMDBfd2R0X21pc2NkZXYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXhwMjAwMF93ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmaXhwMjAwMF93ZHRfbWlzY2Rldik7Cit9CisKK21vZHVsZV9pbml0KGl4cDIwMDBfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoaXhwMjAwMF93ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQiPik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklYUDIwMDAgTmV0d29yayBQcm9jZXNzb3IgV2F0Y2hkb2ciKTsKKworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMgKGRlZmF1bHQgNjBzKSIpOworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHA0eHhfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzOTZlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHA0eHhfd2R0LmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBkcml2ZXJzL3dhdGNoZG9nL2l4cDR4eF93ZHQuYworICoKKyAqIFdhdGNoZG9nIGRyaXZlciBmb3IgSW50ZWwgSVhQNHh4IG5ldHdvcmsgcHJvY2Vzc29ycworICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4KKyAqIEJhc2VkIG9uIHNhMTEwMCBkcml2ZXIsIENvcHlyaWdodCAoQykgMjAwMCBPbGVnIERyb2tpbiA8Z3JlZW5AY3JpbWVhLmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gNjA7CS8qIChzZWNzKSBEZWZhdWx0IGlzIDEgbWludXRlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vdF9zdGF0dXM7CisKKyNkZWZpbmUgV0RUX1RJQ0tfUkFURSAoSVhQNFhYX1BFUklQSEVSQUxfQlVTX0NMT0NLICogMTAwMDAwMFVMKQorCisjZGVmaW5lCVdEVF9JTl9VU0UJCTAKKyNkZWZpbmUJV0RUX09LX1RPX0NMT1NFCQkxCisKK3N0YXRpYyB2b2lkCit3ZHRfZW5hYmxlKHZvaWQpCit7CisJKklYUDRYWF9PU1dLID0gSVhQNFhYX1dEVF9LRVk7CisJKklYUDRYWF9PU1dFID0gMDsKKwkqSVhQNFhYX09TV1QgPSBXRFRfVElDS19SQVRFICogaGVhcnRiZWF0OworCSpJWFA0WFhfT1NXRSA9IElYUDRYWF9XRFRfQ09VTlRfRU5BQkxFIHwgSVhQNFhYX1dEVF9SRVNFVF9FTkFCTEU7CisJKklYUDRYWF9PU1dLID0gMDsKK30KKworc3RhdGljIHZvaWQKK3dkdF9kaXNhYmxlKHZvaWQpCit7CisJKklYUDRYWF9PU1dLID0gSVhQNFhYX1dEVF9LRVk7CisJKklYUDRYWF9PU1dFID0gMDsKKwkqSVhQNFhYX09TV0sgPSAwOworfQorCitzdGF0aWMgaW50CitpeHA0eHhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoV0RUX0lOX1VTRSwgJndkdF9zdGF0dXMpKQorCQlyZXR1cm4gLUVCVVNZOworCisJY2xlYXJfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpOworCisJd2R0X2VuYWJsZSgpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdAoraXhwNHh4X3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJc2V0X2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKwkJCX0KKwkJfQorCQl3ZHRfZW5hYmxlKCk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCS5vcHRpb25zCT0gV0RJT0ZfQ0FSRFJFU0VUIHwgV0RJT0ZfTUFHSUNDTE9TRSB8CisJCQkgIFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAorCS5pZGVudGl0eQk9ICJJWFA0eHggV2F0Y2hkb2ciLAorfTsKKworCitzdGF0aWMgaW50CitpeHA0eHhfd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IC1FTk9JT0NUTENNRDsKKwlpbnQgdGltZTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopYXJnLCAmaWRlbnQsCisJCQkJICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcihib290X3N0YXR1cywgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcih0aW1lLCAoaW50ICopYXJnKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lIDw9IDAgfHwgdGltZSA+IDYwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQloZWFydGJlYXQgPSB0aW1lOworCQl3ZHRfZW5hYmxlKCk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXQgPSBwdXRfdXNlcihoZWFydGJlYXQsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfZW5hYmxlKCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpeHA0eHhfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpKSB7CisJCXdkdF9kaXNhYmxlKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV0FUQ0hET0c6IERldmljZSBjbG9zZWQgdW5leHBlY3RkbHkgLSAiCisJCQkJCSJ0aW1lciB3aWxsIG5vdCBzdG9wXG4iKTsKKwl9CisKKwljbGVhcl9iaXQoV0RUX0lOX1VTRSwgJndkdF9zdGF0dXMpOworCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl4cDR4eF93ZHRfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBpeHA0eHhfd2R0X3dyaXRlLAorCS5pb2N0bAkJPSBpeHA0eHhfd2R0X2lvY3RsLAorCS5vcGVuCQk9IGl4cDR4eF93ZHRfb3BlbiwKKwkucmVsZWFzZQk9IGl4cDR4eF93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpeHA0eHhfd2R0X21pc2NkZXYgPQoreworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAiSVhQNHh4IFdhdGNoZG9nIiwKKwkuZm9wcwkJPSAmaXhwNHh4X3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXhwNHh4X3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHByb2Nlc3Nvcl9pZDsKKworCWFzbSgibXJjIHAxNSwgMCwgJTAsIGNyMCwgY3IwLCAwOyIgOiAiPXIiKHByb2Nlc3Nvcl9pZCkgOik7CisJaWYgKCEocHJvY2Vzc29yX2lkICYgMHhmKSkgeworCQlwcmludGsoIklYUDRYWFggV2F0Y2hkb2c6IFJldi4gQTAgQ1BVIGRldGVjdGVkIC0gIgorCQkJIndhdGNoZG9nIGRpc2FibGVkXG4iKTsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZpeHA0eHhfd2R0X21pc2NkZXYpOworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRrKCJJWFA0eHggV2F0Y2hkb2cgVGltZXI6IGhlYXJ0YmVhdCAlZCBzZWNcbiIsIGhlYXJ0YmVhdCk7CisKKwlib290X3N0YXR1cyA9ICgqSVhQNFhYX09TU1QgJiBJWFA0WFhfT1NTVF9USU1FUl9XQVJNX1JFU0VUKSA/CisJCQlXRElPRl9DQVJEUkVTRVQgOiAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl4cDR4eF93ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmaXhwNHh4X3dkdF9taXNjZGV2KTsKK30KKworCittb2R1bGVfaW5pdChpeHA0eHhfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoaXhwNHh4X3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVhQNHh4IE5ldHdvcmsgUHJvY2Vzc29yIFdhdGNoZG9nIik7CisKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdCBpbiBzZWNvbmRzIChkZWZhdWx0IDYwcykiKTsKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tYWNoendkLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWFjaHp3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTM5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWFjaHp3ZC5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogIE1hY2haIFpGLUxvZ2ljIFdhdGNoZG9nIFRpbWVyIGRyaXZlciBmb3IgTGludXgKKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoZSBhdXRob3IgZG9lcyBOT1QgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlIHdhcnJhbnR5IGZvcgorICogIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgaW4KKyAqICB0aGUgaG9wZSB0aGF0IGl0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVycy4KKyAqCisgKiAgQXV0aG9yOiBGZXJuYW5kbyBGdWdhbnRpIDxmdWdhbnRpQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogIEJhc2VkIG9uIHNiYzYweHh3ZHQuYyBieSBKYWtvYiBPZXN0ZXJnYWFyZAorICoKKyAqCisgKiAgV2UgaGF2ZSB0d28gdGltZXJzICh3ZCMxLCB3ZCMyKSBkcml2ZW4gYnkgYSAzMiBLSHogY2xvY2sgd2l0aCB0aGUKKyAqICBmb2xsb3dpbmcgcGVyaW9kczoKKyAqICAgICAgd2QjMSAtIDIgc2Vjb25kczsKKyAqICAgICAgd2QjMiAtIDcuMiBtczsKKyAqICBBZnRlciB0aGUgZXhwaXJhdGlvbiBvZiB3ZCMxLCBpdCBjYW4gZ2VuZXJhdGUgYSBOTUksIFNDSSwgU01JLCBvcgorICogIGEgc3lzdGVtIFJFU0VUIGFuZCBpdCBzdGFydHMgd2QjMiB0aGF0IHVuY29uZGl0aW9uYWx5IHdpbGwgUkVTRVQKKyAqICB0aGUgc3lzdGVtIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLgorICoKKyAqICAxNC1EZWMtMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAgICAgIEFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIHBvcnRzICovCisjZGVmaW5lIFpGX0lPQkFTRQkweDIxOAorI2RlZmluZSBJTkRFWAkJMHgyMTgKKyNkZWZpbmUgREFUQV9CCQkweDIxOQorI2RlZmluZSBEQVRBX1cJCTB4MjFBCisjZGVmaW5lIERBVEFfRAkJMHgyMUEKKworLyogaW5kZXhlcyAqLwkJCS8qIHNpemUgKi8KKyNkZWZpbmUgWkZMX1ZFUlNJT04JMHgwMgkvKiAxNiAgICovCisjZGVmaW5lIENPTlRST0wgCTB4MTAJLyogMTYgICAqLworI2RlZmluZSBTVEFUVVMJCTB4MTIJLyogOCAgICAqLworI2RlZmluZSBDT1VOVEVSXzEJMHgwQwkvKiAxNiAgICovCisjZGVmaW5lIENPVU5URVJfMgkweDBFCS8qIDggICAgKi8KKyNkZWZpbmUgUFVMU0VfTEVOCTB4MEYJLyogOCAgICAqLworCisvKiBjb250cm9scyAqLworI2RlZmluZSBFTkFCTEVfV0QxCTB4MDAwMQorI2RlZmluZSBFTkFCTEVfV0QyCTB4MDAwMgorI2RlZmluZSBSRVNFVF9XRDEJMHgwMDEwCisjZGVmaW5lIFJFU0VUX1dEMgkweDAwMjAKKyNkZWZpbmUgR0VOX1NDSQkJMHgwMTAwCisjZGVmaW5lIEdFTl9OTUkJCTB4MDIwMAorI2RlZmluZSBHRU5fU01JCQkweDA0MDAKKyNkZWZpbmUgR0VOX1JFU0VUCTB4MDgwMAorCisKKy8qIHV0aWxpdGllcyAqLworCisjZGVmaW5lIFdEMQkwCisjZGVmaW5lIFdEMgkxCisKKyNkZWZpbmUgemZfd3JpdGV3KHBvcnQsIGRhdGEpICB7IG91dGIocG9ydCwgSU5ERVgpOyBvdXR3KGRhdGEsIERBVEFfVyk7IH0KKyNkZWZpbmUgemZfd3JpdGViKHBvcnQsIGRhdGEpICB7IG91dGIocG9ydCwgSU5ERVgpOyBvdXRiKGRhdGEsIERBVEFfQik7IH0KKyNkZWZpbmUgemZfZ2V0X1pGTF92ZXJzaW9uKCkgICB6Zl9yZWFkdyhaRkxfVkVSU0lPTikKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgemZfcmVhZHcodW5zaWduZWQgY2hhciBwb3J0KQoreworCW91dGIocG9ydCwgSU5ERVgpOworCXJldHVybiBpbncoREFUQV9XKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJGZXJuYW5kbyBGdWdhbnRpIDxmdWdhbnRpQGNvbmVjdGl2YS5jb20uYnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hY2haIFpGLUxvZ2ljIFdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworI2RlZmluZSBQRlggIm1hY2h6d2QiCisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB6Zl9pbmZvID0geworCS5vcHRpb25zCQk9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9NQUdJQ0NMT1NFLAorCS5maXJtd2FyZV92ZXJzaW9uCT0gMSwKKwkuaWRlbnRpdHkJCT0gIlpGLUxvZ2ljIHdhdGNoZG9nIiwKK307CisKKworLyoKKyAqIGFjdGlvbiByZWZlcnMgdG8gYWN0aW9uIHRha2VuIHdoZW4gd2F0Y2hkb2cgcmVzZXRzCisgKiAwID0gR0VOX1JFU0VUCisgKiAxID0gR0VOX1NNSQorICogMiA9IEdFTl9OTUkKKyAqIDMgPSBHRU5fU0NJCisgKiBkZWZhdWx0cyB0byBHRU5fUkVTRVQgKDApCisgKi8KK3N0YXRpYyBpbnQgYWN0aW9uID0gMDsKK21vZHVsZV9wYXJhbShhY3Rpb24sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjdGlvbiwgImFmdGVyIHdhdGNoZG9nIHJlc2V0cywgZ2VuZXJhdGU6IDAgPSBSRVNFVCgqKSAgMSA9IFNNSSAgMiA9IE5NSSAgMyA9IFNDSSIpOworCitzdGF0aWMgaW50IHpmX2FjdGlvbiA9IEdFTl9SRVNFVDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHpmX2lzX29wZW47CitzdGF0aWMgY2hhciB6Zl9leHBlY3RfY2xvc2U7CitzdGF0aWMgc3BpbmxvY2tfdCB6Zl9sb2NrOworc3RhdGljIHNwaW5sb2NrX3QgemZfcG9ydF9sb2NrOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHpmX3RpbWVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9oZWFydGJlYXQgPSAwOworCisKKy8qIHRpbWVvdXQgZm9yIHVzZXIgbGFuZCBoZWFydCBiZWF0ICgxMCBzZWNvbmRzKSAqLworI2RlZmluZSBaRl9VU0VSX1RJTUVPIChIWioxMCkKKworLyogdGltZW91dCBmb3IgaGFyZHdhcmUgd2F0Y2hkb2cgKH41MDBtcykgKi8KKyNkZWZpbmUgWkZfSFdfVElNRU8gKEhaLzIpCisKKy8qIG51bWJlciBvZiB0aWNrcyBvbiBXRCMxIChkcml2ZW4gYnkgYSAzMktIeiBjbG9jaywgMnMpICovCisjZGVmaW5lIFpGX0NUSU1FT1VUIDB4ZmZmZgorCisjaWZuZGVmIFpGX0RFQlVHCisjCWRlZmluZSBkcHJpbnRrKGZvcm1hdCwgYXJncy4uLikKKyNlbHNlCisjCWRlZmluZSBkcHJpbnRrKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgUEZYICI6JXM6JWQ6ICIgZm9ybWF0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncykKKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6Zl9zZXRfc3RhdHVzKHVuc2lnbmVkIGNoYXIgbmV3KQoreworCXpmX3dyaXRlYihTVEFUVVMsIG5ldyk7Cit9CisKKworLyogQ09OVFJPTCByZWdpc3RlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCB6Zl9nZXRfY29udHJvbCh2b2lkKQoreworCXJldHVybiB6Zl9yZWFkdyhDT05UUk9MKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHpmX3NldF9jb250cm9sKHVuc2lnbmVkIHNob3J0IG5ldykKK3sKKwl6Zl93cml0ZXcoQ09OVFJPTCwgbmV3KTsKK30KKworCisvKiBXRCM/IGNvdW50ZXIgZnVuY3Rpb25zICovCisvKgorICoJSnVzdCBzZXQgY291bnRlciB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6Zl9zZXRfdGltZXIodW5zaWduZWQgc2hvcnQgbmV3LCB1bnNpZ25lZCBjaGFyIG4pCit7CisJc3dpdGNoKG4peworCQljYXNlIFdEMToKKwkJCXpmX3dyaXRldyhDT1VOVEVSXzEsIG5ldyk7CisJCWNhc2UgV0QyOgorCQkJemZfd3JpdGViKENPVU5URVJfMiwgbmV3ID4gMHhmZiA/IDB4ZmYgOiBuZXcpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIHN0b3AgaGFyZHdhcmUgdGltZXIKKyAqLworc3RhdGljIHZvaWQgemZfdGltZXJfb2ZmKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGN0cmxfcmVnID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogc3RvcCBpbnRlcm5hbCBwaW5nICovCisJZGVsX3RpbWVyX3N5bmMoJnpmX3RpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6Zl9wb3J0X2xvY2ssIGZsYWdzKTsKKwkvKiBzdG9wIHdhdGNoZG9nIHRpbWVyICovCisJY3RybF9yZWcgPSB6Zl9nZXRfY29udHJvbCgpOworCWN0cmxfcmVnIHw9IChFTkFCTEVfV0QxfEVOQUJMRV9XRDIpOwkvKiBkaXNhYmxlIHdkMSBhbmQgd2QyICovCisJY3RybF9yZWcgJj0gfihFTkFCTEVfV0QxfEVOQUJMRV9XRDIpOworCXpmX3NldF9jb250cm9sKGN0cmxfcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6Zl9wb3J0X2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICI6IFdhdGNoZG9nIHRpbWVyIGlzIG5vdyBkaXNhYmxlZFxuIik7Cit9CisKKworLyoKKyAqIHN0YXJ0IGhhcmR3YXJlIHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIHpmX3RpbWVyX29uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGN0cmxfcmVnID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpmX3BvcnRfbG9jaywgZmxhZ3MpOworCisJemZfd3JpdGViKFBVTFNFX0xFTiwgMHhmZik7CisKKwl6Zl9zZXRfdGltZXIoWkZfQ1RJTUVPVVQsIFdEMSk7CisKKwkvKiB1c2VyIGxhbmQgcGluZyAqLworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIFpGX1VTRVJfVElNRU87CisKKwkvKiBzdGFydCB0aGUgdGltZXIgZm9yIGludGVybmFsIHBpbmcgKi8KKwl6Zl90aW1lci5leHBpcmVzID0gamlmZmllcyArIFpGX0hXX1RJTUVPOworCisJYWRkX3RpbWVyKCZ6Zl90aW1lcik7CisKKwkvKiBzdGFydCB3YXRjaGRvZyB0aW1lciAqLworCWN0cmxfcmVnID0gemZfZ2V0X2NvbnRyb2woKTsKKwljdHJsX3JlZyB8PSAoRU5BQkxFX1dEMXx6Zl9hY3Rpb24pOworCXpmX3NldF9jb250cm9sKGN0cmxfcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6Zl9wb3J0X2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICI6IFdhdGNoZG9nIHRpbWVyIGlzIG5vdyBlbmFibGVkXG4iKTsKK30KKworCitzdGF0aWMgdm9pZCB6Zl9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgY3RybF9yZWcgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl6Zl93cml0ZWIoQ09VTlRFUl8yLCAweGZmKTsKKworCWlmKHRpbWVfYmVmb3JlKGppZmZpZXMsIG5leHRfaGVhcnRiZWF0KSl7CisKKwkJZHByaW50aygidGltZV9iZWZvcmU6ICVsZFxuIiwgbmV4dF9oZWFydGJlYXQgLSBqaWZmaWVzKTsKKworCQkvKgorCQkgKiByZXNldCBldmVudCBpcyBhY3RpdmF0ZWQgYnkgdHJhbnNpdGlvbiBmcm9tIDAgdG8gMSBvbgorCQkgKiBSRVNFVF9XRDEgYml0IGFuZCB3ZSBhc3N1bWUgdGhhdCBpdCBpcyBhbHJlYWR5IHplcm8uLi4KKwkJICovCisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnpmX3BvcnRfbG9jaywgZmxhZ3MpOworCQljdHJsX3JlZyA9IHpmX2dldF9jb250cm9sKCk7CisJCWN0cmxfcmVnIHw9IFJFU0VUX1dEMTsKKwkJemZfc2V0X2NvbnRyb2woY3RybF9yZWcpOworCisJCS8qIC4uLmFuZCBub3RoaW5nIGNoYW5nZXMgdW50aWwgaGVyZSAqLworCQljdHJsX3JlZyAmPSB+KFJFU0VUX1dEMSk7CisJCXpmX3NldF9jb250cm9sKGN0cmxfcmVnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmemZfcG9ydF9sb2NrLCBmbGFncyk7CisKKwkJemZfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBaRl9IV19USU1FTzsKKwkJYWRkX3RpbWVyKCZ6Zl90aW1lcik7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICI6IEkgd2lsbCByZXNldCB5b3VyIG1hY2hpbmVcbiIpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgemZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCQkJCQkJbG9mZl90ICpwcG9zKQoreworCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCWlmKGNvdW50KXsKKworCQkvKgorCQkgKiBubyBuZWVkIHRvIGNoZWNrIGZvciBjbG9zZSBjb25maXJtYXRpb24KKwkJICogbm8gd2F5IHRvIGRpc2FibGUgd2F0Y2hkb2cgOykKKwkJICovCisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBvZnM7CisKKwkJCS8qCisJCQkgKiBub3RlOiBqdXN0IGluIGNhc2Ugc29tZW9uZSB3cm90ZSB0aGUgbWFnaWMgY2hhcmFjdGVyCisJCQkgKiBmaXZlIG1vbnRocyBhZ28uLi4KKwkJCSAqLworCQkJemZfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogbm93IHNjYW4gKi8KKwkJCWZvciAob2ZzID0gMDsgb2ZzICE9IGNvdW50OyBvZnMrKyl7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBvZnMpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpeworCQkJCQl6Zl9leHBlY3RfY2xvc2UgPSA0MjsKKwkJCQkJZHByaW50aygiemZfZXhwZWN0X2Nsb3NlID0gNDJcbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFdlbGwsIGFueWhvdyBzb21lb25lIHdyb3RlIHRvIHVzLAorCQkgKiB3ZSBzaG91bGQgcmV0dXJuIHRoYXQgZmF2b3VyCisJCSAqLworCQluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyBaRl9VU0VSX1RJTUVPOworCQlkcHJpbnRrKCJ1c2VyIHBpbmcgYXQgJWxkXG4iLCBqaWZmaWVzKTsKKworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB6Zl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzd2l0Y2goY21kKXsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmemZfaW5mbywgc2l6ZW9mKHpmX2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJemZfcGluZygwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpmX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrKCZ6Zl9sb2NrKTsKKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZ6Zl9pc19vcGVuKSkgeworCQlzcGluX3VubG9jaygmemZfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKG5vd2F5b3V0KQorCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJc3Bpbl91bmxvY2soJnpmX2xvY2spOworCisJemZfdGltZXJfb24oKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB6Zl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZih6Zl9leHBlY3RfY2xvc2UgPT0gNDIpeworCQl6Zl90aW1lcl9vZmYoKTsKKwl9IGVsc2UgeworCQlkZWxfdGltZXIoJnpmX3RpbWVyKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiOiBkZXZpY2UgZmlsZSBjbG9zZWQgdW5leHBlY3RlZGx5LiBXaWxsIG5vdCBzdG9wIHRoZSBXRFQhXG4iKTsKKwl9CisKKwlzcGluX2xvY2soJnpmX2xvY2spOworCWNsZWFyX2JpdCgwLCAmemZfaXNfb3Blbik7CisJc3Bpbl91bmxvY2soJnpmX2xvY2spOworCisJemZfZXhwZWN0X2Nsb3NlID0gMDsKKworCXJldHVybiAwOworfQorCisvKgorICogTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCB6Zl9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJCQkJCQl2b2lkICp1bnVzZWQpCit7CisJaWYoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKXsKKwkJemZfdGltZXJfb2ZmKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6Zl9mb3BzID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKKwkud3JpdGUgICAgICAgICAgPSB6Zl93cml0ZSwKKwkuaW9jdGwgICAgICAgICAgPSB6Zl9pb2N0bCwKKwkub3BlbiAgICAgICAgICAgPSB6Zl9vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IHpmX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHpmX21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJnpmX2ZvcHMsCit9OworIAorCisvKgorICogVGhlIGRldmljZSBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICogdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB6Zl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHpmX25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgemZfc2hvd19hY3Rpb24oaW50IGFjdCkKK3sKKwljaGFyICpzdHJbXSA9IHsgIlJFU0VUIiwgIlNNSSIsICJOTUkiLCAiU0NJIiB9OworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIjogV2F0Y2hkb2cgdXNpbmcgYWN0aW9uID0gJXNcbiIsIHN0clthY3RdKTsKK30KKworc3RhdGljIGludCBfX2luaXQgemZfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiOiBNYWNoWiBaRi1Mb2dpYyBXYXRjaGRvZyBkcml2ZXIgaW5pdGlhbGl6aW5nLlxuIik7CisKKwlyZXQgPSB6Zl9nZXRfWkZMX3ZlcnNpb24oKTsKKwlwcmludGsoIiUjeFxuIiwgcmV0KTsKKwlpZigoIXJldCkgfHwgKHJldCAhPSAweGZmZmYpKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIjogbm8gWkYtTG9naWMgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZigoYWN0aW9uIDw9IDMpICYmIChhY3Rpb24gPj0gMCkpeworCQl6Zl9hY3Rpb24gPSB6Zl9hY3Rpb24+PmFjdGlvbjsKKwl9IGVsc2UKKwkJYWN0aW9uID0gMDsKKworCXpmX3Nob3dfYWN0aW9uKGFjdGlvbik7CisKKwlzcGluX2xvY2tfaW5pdCgmemZfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnpmX3BvcnRfbG9jayk7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ6Zl9taXNjZGV2KTsKKwlpZiAocmV0KXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtaXNjX3JlZ2lzdGVyIG9uIG1pbm9yPSVkXG4iLAorCQkJCQkJCVdBVENIRE9HX01JTk9SKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYoIXJlcXVlc3RfcmVnaW9uKFpGX0lPQkFTRSwgMywgIk1hY2haIFpGTCBXRFQiKSl7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlc2VydmUgSS9PIHBvcnRzIGF0ICVkXG4iLAorCQkJCQkJCVpGX0lPQkFTRSk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBub19yZWdpb247CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ6Zl9ub3RpZmllcik7CisJaWYocmV0KXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQkJCQkJCQlyZXQpOworCQlnb3RvIG5vX3JlYm9vdDsKKwl9CisKKwl6Zl9zZXRfc3RhdHVzKDApOworCXpmX3NldF9jb250cm9sKDApOworCisJLyogdGhpcyBpcyB0aGUgdGltZXIgdGhhdCB3aWxsIGRvIHRoZSBoYXJkIHdvcmsgKi8KKwlpbml0X3RpbWVyKCZ6Zl90aW1lcik7CisJemZfdGltZXIuZnVuY3Rpb24gPSB6Zl9waW5nOworCXpmX3RpbWVyLmRhdGEgPSAwOworCisJcmV0dXJuIDA7CisKK25vX3JlYm9vdDoKKwlyZWxlYXNlX3JlZ2lvbihaRl9JT0JBU0UsIDMpOworbm9fcmVnaW9uOgorCW1pc2NfZGVyZWdpc3RlcigmemZfbWlzY2Rldik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgemZfZXhpdCh2b2lkKQoreworCXpmX3RpbWVyX29mZigpOworCisJbWlzY19kZXJlZ2lzdGVyKCZ6Zl9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmemZfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKFpGX0lPQkFTRSwgMyk7Cit9CisKK21vZHVsZV9pbml0KHpmX2luaXQpOworbW9kdWxlX2V4aXQoemZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWl4Y29td2QuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9taXhjb213ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDNlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWl4Y29td2QuYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIE1peENvbSBXYXRjaGRvZzogQSBTaW1wbGUgSGFyZHdhcmUgV2F0Y2hkb2cgRGV2aWNlCisgKiBCYXNlZCBvbiBTb2Z0ZG9nIGRyaXZlciBieSBBbGFuIENveCBhbmQgUEMgV2F0Y2hkb2cgZHJpdmVyIGJ5IEtlbiBIb2xsaXMKKyAqCisgKiBBdXRob3I6IEdlcmdlbHkgTWFkYXJhc3ogPGdvcmdvQGl0Yy5odT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgSVRDb25zdWx0LVBybyBDby4gPGluZm9AaXRjLmh1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVmVyc2lvbiAwLjEgKDk5LzA0LzE1KToKKyAqCQktIGZpcnN0IHZlcnNpb24KKyAqCisgKiBWZXJzaW9uIDAuMiAoOTkvMDYvMTYpOgorICoJCS0gYWRkZWQga2VybmVsIHRpbWVyIHdhdGNoZG9nIHBpbmcgYWZ0ZXIgY2xvc2UKKyAqCQkgIHNpbmNlIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IHdhdGNoZG9nIHNodXRkb3duCisgKgorICogVmVyc2lvbiAwLjMgKDk5LzA2LzIxKToKKyAqCQktIGFkZGVkIFdESU9DX0dFVFNUQVRVUyBhbmQgV0RJT0NfR0VUU1VQUE9SVCBpb2N0bCBjYWxscworICoKKyAqIFZlcnNpb24gMC4zLjEgKDk5LzA2LzIyKToKKyAqCQktIGFsbG93IG1vZHVsZSByZW1vdmFsIHdoaWxlIGludGVybmFsIHRpbWVyIGlzIGFjdGl2ZSwKKyAqCQkgIHByaW50IHdhcm5pbmcgYWJvdXQgcHJvYmFibGUgcmVzZXQKKyAqCisgKiBWZXJzaW9uIDAuNCAoOTkvMTEvMTUpOgorICoJCS0gc3VwcG9ydCBmb3Igb25lIG1vcmUgdHlwZSBib2FyZAorICoKKyAqIFZlcnNpb24gMC41ICgyMDAxLzEyLzE0KSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAgICAgICAgICAgICAgLSBhZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorICoKKyAqLworCisjZGVmaW5lIFZFUlNJT04gIjAuNSIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IG1peGNvbXdkX2lvcG9ydHNbXSA9IHsgMHgxODAsIDB4MjgwLCAweDM4MCwgMHgwMDAgfTsKKworI2RlZmluZSBNSVhDT01fV0FUQ0hET0dfT0ZGU0VUIDB4YzEwCisjZGVmaW5lIE1JWENPTV9JRCAweDExCisjZGVmaW5lIEZMQVNIQ09NX1dBVENIRE9HX09GRlNFVCAweDQKKyNkZWZpbmUgRkxBU0hDT01fSUQgMHgxOAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtaXhjb213ZF9vcGVuZWQ7IC8qIGxvbmcgcmVxJ2QgZm9yIHNldGJpdCAtLVJSICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfcG9ydDsKK3N0YXRpYyBpbnQgbWl4Y29td2RfdGltZXJfYWxpdmU7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbWl4Y29td2RfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKK3N0YXRpYyB2b2lkIG1peGNvbXdkX3Bpbmcodm9pZCkKK3sKKwlvdXRiX3AoNTUsd2F0Y2hkb2dfcG9ydCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBtaXhjb213ZF90aW1lcmZ1bih1bnNpZ25lZCBsb25nIGQpCit7CisJbWl4Y29td2RfcGluZygpOworCisJbW9kX3RpbWVyKCZtaXhjb213ZF90aW1lcixqaWZmaWVzKyA1KkhaKTsKK30KKworLyoKKyAqCUFsbG93IG9ubHkgb25lIHBlcnNvbiB0byBob2xkIGl0IG9wZW4KKyAqLworCitzdGF0aWMgaW50IG1peGNvbXdkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCZtaXhjb213ZF9vcGVuZWQpKSB7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW1peGNvbXdkX3BpbmcoKTsKKworCWlmIChub3dheW91dCkgeworCQkvKgorCQkgKiBmb3BzX2dldCgpIGNvZGUgdmlhIG9wZW4oKSBoYXMgYWxyZWFkeSBkb25lCisJCSAqIGEgdHJ5X21vZHVsZV9nZXQoKSBzbyBpdCBpcyBzYWZlIHRvIGRvIHRoZQorCQkgKiBfX21vZHVsZV9nZXQoKS4KKwkJICovCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJfSBlbHNlIHsKKwkJaWYobWl4Y29td2RfdGltZXJfYWxpdmUpIHsKKwkJCWRlbF90aW1lcigmbWl4Y29td2RfdGltZXIpOworCQkJbWl4Y29td2RfdGltZXJfYWxpdmU9MDsKKwkJfQorCX0KKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgbWl4Y29td2RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCWlmKG1peGNvbXdkX3RpbWVyX2FsaXZlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1peGNvbXdkOiByZWxlYXNlIGNhbGxlZCB3aGlsZSBpbnRlcm5hbCB0aW1lciBhbGl2ZSIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpbml0X3RpbWVyKCZtaXhjb213ZF90aW1lcik7CisJCW1peGNvbXdkX3RpbWVyLmV4cGlyZXM9amlmZmllcyArIDUgKiBIWjsKKwkJbWl4Y29td2RfdGltZXIuZnVuY3Rpb249bWl4Y29td2RfdGltZXJmdW47CisJCW1peGNvbXdkX3RpbWVyLmRhdGE9MDsKKwkJbWl4Y29td2RfdGltZXJfYWxpdmU9MTsKKwkJYWRkX3RpbWVyKCZtaXhjb213ZF90aW1lcik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAibWl4Y29td2Q6IFdEVCBkZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseS4gIFdEVCB3aWxsIG5vdCBzdG9wIVxuIik7CisJfQorCisJY2xlYXJfYml0KDAsJm1peGNvbXdkX29wZW5lZCk7CisJZXhwZWN0X2Nsb3NlPTA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNzaXplX3QgbWl4Y29td2Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYobGVuKQorCXsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YSArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCW1peGNvbXdkX3BpbmcoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBtaXhjb213ZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgc3RhdHVzOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiTWl4Q09NIHdhdGNoZG9nIiwKKwl9OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJc3RhdHVzPW1peGNvbXdkX29wZW5lZDsKKwkJCWlmICghbm93YXlvdXQpIHsKKwkJCQlzdGF0dXN8PW1peGNvbXdkX3RpbWVyX2FsaXZlOworCQkJfQorCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmc3RhdHVzLCBzaXplb2YoaW50KSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCW1peGNvbXdkX3BpbmcoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1peGNvbXdkX2ZvcHM9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBtaXhjb213ZF93cml0ZSwKKwkuaW9jdGwJCT0gbWl4Y29td2RfaW9jdGwsCisJLm9wZW4JCT0gbWl4Y29td2Rfb3BlbiwKKwkucmVsZWFzZQk9IG1peGNvbXdkX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbWl4Y29td2RfbWlzY2Rldj0KK3sKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmbWl4Y29td2RfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1peGNvbXdkX2NoZWNrY2FyZChpbnQgcG9ydCkKK3sKKwlpbnQgaWQ7CisKKwlwb3J0ICs9IE1JWENPTV9XQVRDSERPR19PRkZTRVQ7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0LCAxLCAiTWl4Q09NIHdhdGNoZG9nIikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWQ9aW5iX3AocG9ydCkgJiAweDNmOworCWlmKGlkIT1NSVhDT01fSUQpIHsKKwkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gcG9ydDsKK30KKworc3RhdGljIGludCBfX2luaXQgZmxhc2hjb21fY2hlY2tjYXJkKGludCBwb3J0KQoreworCWludCBpZDsKKworCXBvcnQgKz0gRkxBU0hDT01fV0FUQ0hET0dfT0ZGU0VUOworCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydCwgMSwgIk1peENPTSB3YXRjaGRvZyIpKSB7CisJCXJldHVybiAwOworCX0KKworCWlkPWluYl9wKHBvcnQpOworIAlpZihpZCE9RkxBU0hDT01fSUQpIHsKKwkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMSk7CisJCXJldHVybiAwOworCX0KKyAJcmV0dXJuIHBvcnQ7CisgfQorCitzdGF0aWMgaW50IF9faW5pdCBtaXhjb213ZF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJldDsKKwlpbnQgZm91bmQ9MDsKKworCWZvciAoaSA9IDA7ICFmb3VuZCAmJiBtaXhjb213ZF9pb3BvcnRzW2ldICE9IDA7IGkrKykgeworCQl3YXRjaGRvZ19wb3J0ID0gbWl4Y29td2RfY2hlY2tjYXJkKG1peGNvbXdkX2lvcG9ydHNbaV0pOworCQlpZiAod2F0Y2hkb2dfcG9ydCkgeworCQkJZm91bmQgPSAxOworCQl9CisJfQorCisJLyogVGhlIEZsYXNoQ09NIGNhcmQgY2FuIGJlIHNldCB1cCBhdCAweDMwMCAtPiAweDM3OCwgaW4gMHg4IGp1bXBzICovCisJZm9yIChpID0gMHgzMDA7ICFmb3VuZCAmJiBpIDwgMHgzODA7IGkrPTB4OCkgeworCQl3YXRjaGRvZ19wb3J0ID0gZmxhc2hjb21fY2hlY2tjYXJkKGkpOworCQlpZiAod2F0Y2hkb2dfcG9ydCkgeworCQkJZm91bmQgPSAxOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlwcmludGsoIm1peGNvbXdkOiBObyBjYXJkIGRldGVjdGVkLCBvciBwb3J0IG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmbWl4Y29td2RfbWlzY2Rldik7CisJaWYgKHJldCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKHdhdGNoZG9nX3BvcnQsIDEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIk1peENPTSB3YXRjaGRvZyBkcml2ZXIgdiVzLCB3YXRjaGRvZyBwb3J0IGF0IDB4JTN4XG4iLFZFUlNJT04sd2F0Y2hkb2dfcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1peGNvbXdkX2V4aXQodm9pZCkKK3sKKwlpZiAoIW5vd2F5b3V0KSB7CisJCWlmKG1peGNvbXdkX3RpbWVyX2FsaXZlKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaXhjb213ZDogSSBxdWl0IG5vdywgaGFyZHdhcmUgd2lsbCIKKwkJCSAgICAgICAiIHByb2JhYmx5IHJlYm9vdCFcbiIpOworCQkJZGVsX3RpbWVyKCZtaXhjb213ZF90aW1lcik7CisJCQltaXhjb213ZF90aW1lcl9hbGl2ZT0wOworCQl9CisJfQorCXJlbGVhc2VfcmVnaW9uKHdhdGNoZG9nX3BvcnQsMSk7CisJbWlzY19kZXJlZ2lzdGVyKCZtaXhjb213ZF9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQobWl4Y29td2RfaW5pdCk7Cittb2R1bGVfZXhpdChtaXhjb213ZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR2VyZ2VseSBNYWRhcmFzeiA8Z29yZ29AaXRjLmh1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaXhDb20gV2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjOHh4X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21wYzh4eF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQ2MmJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21wYzh4eF93ZHQuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIG1wYzh4eF93ZHQuYyAtIE1QQzh4eCB3YXRjaGRvZyB1c2Vyc3BhY2UgaW50ZXJmYWNlCisgKgorICogQXV0aG9yOiBGbG9yaWFuIFNjaGlybWVyIDxqb2x0QHR1eGJveC5vcmc+CisgKgorICogMjAwMiAoYykgRmxvcmlhbiBTY2hpcm1lciA8am9sdEB0dXhib3gub3JnPiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8YXNtLzh4eF9pbW1hcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8c3lzbGliL204eHhfd2R0Lmg+CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9vcGVuZWQ7CitzdGF0aWMgaW50IHdkdF9zdGF0dXM7CisKK3N0YXRpYyB2b2lkIG1wYzh4eF93ZHRfaGFuZGxlcl9kaXNhYmxlKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1hcCA9ICh2b2xhdGlsZSBpbW1hcF90ICopSU1BUF9BRERSOworCisJaW1hcC0+aW1fc2l0LnNpdF9waXNjciAmPSB+KFBJU0NSX1BJRSB8IFBJU0NSX1BURSk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIm1wYzh4eF93ZHQ6IGtlZXAtYWxpdmUgaGFuZGxlciBkZWFjdGl2YXRlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eF93ZHRfaGFuZGxlcl9lbmFibGUodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbWFwID0gKHZvbGF0aWxlIGltbWFwX3QgKilJTUFQX0FERFI7CisKKwlpbWFwLT5pbV9zaXQuc2l0X3Bpc2NyIHw9IFBJU0NSX1BJRSB8IFBJU0NSX1BURTsKKworCXByaW50ayhLRVJOX05PVElDRSAibXBjOHh4X3dkdDoga2VlcC1hbGl2ZSBoYW5kbGVyIGFjdGl2YXRlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgbXBjOHh4X3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfb3BlbmVkKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW04eHhfd2R0X3Jlc2V0KCk7CisJbXBjOHh4X3dkdF9oYW5kbGVyX2Rpc2FibGUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzh4eF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwltOHh4X3dkdF9yZXNldCgpOworCisjaWYgIWRlZmluZWQoQ09ORklHX1dBVENIRE9HX05PV0FZT1VUKQorCW1wYzh4eF93ZHRfaGFuZGxlcl9lbmFibGUoKTsKKyNlbmRpZgorCisJY2xlYXJfYml0KDAsICZ3ZHRfb3BlbmVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBtcGM4eHhfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLAorCQkJCWxvZmZfdCAqIHBwb3MpCit7CisJaWYgKHBwb3MgIT0gJmZpbGUtPmZfcG9zKQorCQlyZXR1cm4gLUVTUElQRTsKKworCWlmIChsZW4pCisJCW04eHhfd2R0X3Jlc2V0KCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IG1wYzh4eF93ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHRpbWVvdXQ7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGluZm8gPSB7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORywKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAwLAorCQkuaWRlbnRpdHkgPSAiTVBDOHh4IHdhdGNoZG9nIiwKKwl9OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAocHV0X3VzZXIod2R0X3N0YXR1cywgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJd2R0X3N0YXR1cyAmPSB+V0RJT0ZfS0VFUEFMSVZFUElORzsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFRFTVA6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCW04eHhfd2R0X3Jlc2V0KCk7CisJCXdkdF9zdGF0dXMgfD0gV0RJT0ZfS0VFUEFMSVZFUElORzsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJdGltZW91dCA9IG04eHhfd2R0X2dldF90aW1lb3V0KCk7CisJCWlmIChwdXRfdXNlcih0aW1lb3V0LCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1wYzh4eF93ZHRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS53cml0ZSA9IG1wYzh4eF93ZHRfd3JpdGUsCisJLmlvY3RsID0gbXBjOHh4X3dkdF9pb2N0bCwKKwkub3BlbiA9IG1wYzh4eF93ZHRfb3BlbiwKKwkucmVsZWFzZSA9IG1wYzh4eF93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtcGM4eHhfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJm1wYzh4eF93ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzh4eF93ZHRfaW5pdCh2b2lkKQoreworCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZtcGM4eHhfd2R0X21pc2NkZXYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXBjOHh4X3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZtcGM4eHhfd2R0X21pc2NkZXYpOworCisJbTh4eF93ZHRfcmVzZXQoKTsKKwltcGM4eHhfd2R0X2hhbmRsZXJfZW5hYmxlKCk7Cit9CisKK21vZHVsZV9pbml0KG1wYzh4eF93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChtcGM4eHhfd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJGbG9yaWFuIFNjaGlybWVyIDxqb2x0QHR1eGJveC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1QQzh4eCB3YXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MmRjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZC5jCkBAIC0wLDAgKzEsOTI2IEBACisvKgorICogUEMgV2F0Y2hkb2cgRHJpdmVyCisgKiBieSBLZW4gSG9sbGlzIChraG9sbGlzQGJpdGdhdGUuY29tKQorICoKKyAqIFBlcm1pc3Npb24gZ3JhbnRlZCBmcm9tIFNpbW9uIE1hY2hlbGwgKDczMjQ0LjEyNzBAY29tcHVzZXJ2ZS5jb20pCisgKiBXcml0dGVuIGZvciB0aGUgTGludXggS2VybmVsLCBhbmQgR1BMZWQgYnkgS2VuIEhvbGxpcworICoKKyAqIDk2MDEwNwlBZGRlZCByZXF1ZXN0X3JlZ2lvbiByb3V0aW5lcywgbW9kdWxpemVkIHRoZSB3aG9sZSB0aGluZy4KKyAqIDk2MDEwOAlGaXhlZCBlbmQtb2YtZmlsZSBwb2ludGVyIChUaGFua3MgdG8gRGFuIEhvbGxpcyksIGFkZGVkCisgKgkJV0RfVElNRU9VVCBkZWZpbmUuCisgKiA5NjAyMTYJQWRkZWQgZW9mIG1hcmtlciBvbiB0aGUgZmlsZSwgYW5kIGNoYW5nZWQgdmVyYm9zZSBtZXNzYWdlcy4KKyAqIDk2MDcxNglNYWRlIGZ1bmN0aW9uYWwgYW5kIGNvc21ldGljIGNoYW5nZXMgdG8gdGhlIHNvdXJjZSBmb3IKKyAqCQlpbmNsdXNpb24gaW4gTGludXggMi4wLngga2VybmVscywgdGhhbmtzIHRvIEFsYW4gQ294LgorICogOTYwNzE3CVJlbW92ZWQgcmVhZC9zZWVrIHJvdXRpbmVzLCByZXBsYWNlZCB3aXRoIGlvY3RsLiAgQWxzbywgYWRkZWQKKyAqCQljaGVja19yZWdpb24gY29tbWFuZCBkdWUgdG8gQWxhbidzIHN1Z2dlc3Rpb24uCisgKiA5NjA4MjEJTWFkZSBjaGFuZ2VzIHRvIGNvbXBpbGUgaW4gbmV3ZXIgMi4wLngga2VybmVscy4gIEFkZGVkCisgKgkJImNvbGQgcmVib290IHNlbnNlIiBlbnRyeS4KKyAqIDk2MDgyNQlNYWRlIGEgZmV3IGNoYW5nZXMgdG8gY29kZSwgZGVsZXRlZCBzb21lIGRlZmluZXMgYW5kIG1hZGUKKyAqCQl0eXBlZGVmcyB0byByZXBsYWNlIHRoZW0uICBNYWRlIGhlYXJ0YmVhdCByZXNldCBvbmx5IGF2YWlsYWJsZQorICoJCXZpYSBpb2N0bCwgYW5kIHJlbW92ZWQgdGhlIHdyaXRlIHJvdXRpbmUuCisgKiA5NjA4MjgJQWRkZWQgbmV3IGl0ZW1zIGZvciBQQyBXYXRjaGRvZyBSZXYuQyBjYXJkLgorICogOTYwODI5CUNoYW5nZWQgYXJvdW5kIGFsbCBvZiB0aGUgSU9DVExzLCBhZGRlZCBuZXcgZmVhdHVyZXMsCisgKgkJYWRkZWQgd2F0Y2hkb2cgZGlzYWJsZS9yZS1lbmFibGUgcm91dGluZXMuICBBZGRlZCBmaXJtd2FyZQorICoJCXZlcnNpb24gcmVwb3J0aW5nLiAgQWRkZWQgcmVhZCByb3V0aW5lIGZvciB0ZW1wZXJhdHVyZS4KKyAqCQlSZW1vdmVkIHNvbWUgZXh0cmEgZGVmaW5lcywgYWRkZWQgYW4gYXV0b2RldGVjdCBSZXZpc2lvbgorICoJCXJvdXRpbmUuCisgKiA5NjEwMDYgICAgICAgUmV2aXNlZCBzb21lIGRvY3VtZW50YXRpb24sIGZpeGVkIHNvbWUgY29zbWV0aWMgYnVncy4gIE1hZGUKKyAqICAgICAgICAgICAgICBkcml2ZXJzIHRvIHBhbmljIHRoZSBzeXN0ZW0gaWYgaXQncyBvdmVyaGVhdGluZyBhdCBib290dXAuCisgKiA5NjExMTgJQ2hhbmdlZCBzb21lIHZlcmJpYWdlIG9uIHNvbWUgb2YgdGhlIG91dHB1dCwgdGlkaWVkIHVwCisgKgkJY29kZSBiaXRzLCBhbmQgYWRkZWQgY29tcGF0aWJpbGl0eSB0byAyLjEueC4KKyAqIDk3MDkxMiAgICAgICBFbmFibGVkIGJvYXJkIG9uIG9wZW4gYW5kIGRpc2FibGUgb24gY2xvc2UuCisgKiA5NzExMDcJVG9vayBhY2NvdW50IG9mIHJlY2VudCBWRlMgY2hhbmdlcyAoYnJva2UgcmVhZCkuCisgKiA5NzEyMTAgICAgICAgRGlzYWJsZSBib2FyZCBvbiBpbml0aWFsaXNhdGlvbiBpbiBjYXNlIGJvYXJkIGFscmVhZHkgdGlja2luZy4KKyAqIDk3MTIyMiAgICAgICBDaGFuZ2VkIG9wZW4vY2xvc2UgZm9yIHRlbXBlcmF0dXJlIGhhbmRsaW5nCisgKiAgICAgICAgICAgICAgTWljaGFlbCBNZXNrZXMgPG1lc2tlc0BkZWJpYW4ub3JnPi4KKyAqIDk4MDExMiAgICAgICBVc2VkIG1pbm9yIG51bWJlcnMgZnJvbSBpbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAorICogOTkwNDAzICAgICAgIENsZWFyIHJlc2V0IHN0YXR1cyBhZnRlciByZWFkaW5nIGNvbnRyb2wgc3RhdHVzIHJlZ2lzdGVyIGluCisgKiAgICAgICAgICAgICAgcGN3ZF9zaG93cHJldnN0YXRlKCkuIFtNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT5dCisgKiA5OTA2MDUJTWFkZSBjaGFuZ2VzIHRvIGNvZGUgdG8gc3VwcG9ydCBGaXJtd2FyZSAxLjIyYSwgYWRkZWQKKyAqCQlmYWlybHkgdXNlbGVzcyBwcm9jIGVudHJ5LgorICogOTkwNjEwCXJlbW92ZWQgc2FpZCB1c2VsZXNzIHByb2MgY29kZSBmb3IgdGhlIG1lcmdlIDxhbGFuPgorICogMDAwNDAzCVJlbW92ZWQgbGFzdCB0cmFjZXMgb2YgcHJvYyBjb2RlLiA8ZGF2ZWo+CisgKiAwMTEyMTQJQWRkZWQgbm93YXlvdXQgbW9kdWxlIG9wdGlvbiB0byBvdmVycmlkZSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogICAgICAgICAgICAgIEFkZGVkIHRpbWVvdXQgbW9kdWxlIG9wdGlvbiB0byBvdmVycmlkZSBkZWZhdWx0CisgKi8KKworLyoKKyAqCUEgYmVsbHMgYW5kIHdoaXN0bGVzIGRyaXZlciBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LnBjd2QuZGUvCisgKglNb3JlIGluZm8gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYmVya3Byb2QuY29tLyBvciBodHRwOi8vd3d3LnBjd2F0Y2hkb2cuY29tLworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgV0RfVkVSICAgICAgICAgICAgICAgICAgIjEuMTYgKDA2LzEyLzIwMDQpIgorI2RlZmluZSBQRlgJCQkicGN3ZDogIgorCisvKgorICogSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgUENXRF9SRVZJU0lPTl9CIHdhcyByZW1vdmVkIGJlY2F1c2UgQSBhbmQgQgorICogYXJlIGVzc2VudGlhbGx5IHRoZSBzYW1lIHR5cGVzIG9mIGNhcmQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IEIKKyAqIGhhcyB0ZW1wZXJhdHVyZSByZXBvcnRpbmcuICBTaW5jZSBJIGRpZG4ndCByZWNlaXZlIGEgUmV2LkIgY2FyZCwKKyAqIHRoZSBSZXYuQiBjYXJkIGlzIG5vdCBzdXBwb3J0ZWQuICAoSXQncyBhIGdvb2QgdGhpbmcgdG9vLCBhcyB0aGV5CisgKiBhcmUgbm8gbG9uZ2VyIGluIHByb2R1Y3Rpb24uKQorICovCisjZGVmaW5lCVBDV0RfUkVWSVNJT05fQQkJMQorI2RlZmluZQlQQ1dEX1JFVklTSU9OX0MJCTIKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5lcyB0aGF0IGRlc2NyaWJlIHRoZSBjb250cm9sIHN0YXR1cyBiaXRzIGZvciB0aGUKKyAqIFBDIFdhdGNoZG9nIGNhcmQsIHJldmlzaW9uIEEuCisgKi8KKyNkZWZpbmUgV0RfV0RSU1QgICAgICAgICAgICAgICAgMHgwMQkvKiBQcmV2aW91c2x5IHJlc2V0IHN0YXRlICovCisjZGVmaW5lIFdEX1QxMTAgICAgICAgICAgICAgICAgIDB4MDIJLyogVGVtcGVyYXR1cmUgb3ZlcmhlYXQgc2Vuc2UgKi8KKyNkZWZpbmUgV0RfSFJUQlQgICAgICAgICAgICAgICAgMHgwNAkvKiBIZWFydGJlYXQgc2Vuc2UgKi8KKyNkZWZpbmUgV0RfUkxZMiAgICAgICAgICAgICAgICAgMHgwOAkvKiBFeHRlcm5hbCByZWxheSB0cmlnZ2VyZWQgKi8KKyNkZWZpbmUgV0RfU1JMWTIgICAgICAgICAgICAgICAgMHg4MAkvKiBTb2Z0d2FyZSBleHRlcm5hbCByZWxheSB0cmlnZ2VyZWQgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5lcyB0aGF0IGRlc2NyaWJlIHRoZSBjb250cm9sIHN0YXR1cyBiaXRzIGZvciB0aGUKKyAqIFBDIFdhdGNoZG9nIGNhcmQsIHJldmlzaW9uIEMuCisgKi8KKyNkZWZpbmUgV0RfUkVWQ19XVFJQICAgICAgICAgICAgMHgwMQkvKiBXYXRjaGRvZyBUcmlwIHN0YXR1cyAqLworI2RlZmluZSBXRF9SRVZDX0hSQlQgICAgICAgICAgICAweDAyCS8qIFdhdGNoZG9nIEhlYXJ0YmVhdCAqLworI2RlZmluZSBXRF9SRVZDX1RUUlAgICAgICAgICAgICAweDA0CS8qIFRlbXBlcmF0dXJlIFRyaXAgc3RhdHVzICovCisKKy8qIG1heC4gdGltZSB3ZSBnaXZlIGFuIElTQSB3YXRjaGRvZyBjYXJkIHRvIHByb2Nlc3MgYSBjb21tYW5kICovCisvKiA1MDBtcyBmb3IgZWFjaCA0IGJpdCByZXNwb25zZSAoYWNjb3JkaW5nIHRvIHNwZWMuKSAqLworI2RlZmluZSBJU0FfQ09NTUFORF9USU1FT1VUICAgICAxMDAwCisKKy8qIFdhdGNoZG9nJ3MgaW50ZXJuYWwgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ01EX0lTQV9JRExFICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENNRF9JU0FfVkVSU0lPTl9JTlRFR0VSICAgICAgICAgMHgwMQorI2RlZmluZSBDTURfSVNBX1ZFUlNJT05fVEVOVEggICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ01EX0lTQV9WRVJTSU9OX0hVTkRSRVRIICAgICAgICAweDAzCisjZGVmaW5lIENNRF9JU0FfVkVSU0lPTl9NSU5PUiAgICAgICAgICAgMHgwNAorI2RlZmluZSBDTURfSVNBX1NXSVRDSF9TRVRUSU5HUyAgICAgICAgIDB4MDUKKyNkZWZpbmUgQ01EX0lTQV9ERUxBWV9USU1FXzJTRUNTICAgICAgICAweDBBCisjZGVmaW5lIENNRF9JU0FfREVMQVlfVElNRV80U0VDUyAgICAgICAgMHgwQgorI2RlZmluZSBDTURfSVNBX0RFTEFZX1RJTUVfOFNFQ1MgICAgICAgIDB4MEMKKworLyoKKyAqIFdlIGFyZSB1c2luZyBhbiBrZXJuZWwgdGltZXIgdG8gZG8gdGhlIHBpbmdpbmcgb2YgdGhlIHdhdGNoZG9nCisgKiBldmVyeSB+NTAwbXMuIFdlIHRyeSB0byBzZXQgdGhlIGludGVybmFsIGhlYXJ0YmVhdCBvZiB0aGUKKyAqIHdhdGNoZG9nIHRvIDIgbXMuCisgKi8KKworI2RlZmluZSBXRFRfSU5URVJWQUwgKEhaLzIrMSkKKworLyogV2UgY2FuIG9ubHkgdXNlIDEgY2FyZCBkdWUgdG8gdGhlIC9kZXYvd2F0Y2hkb2cgcmVzdHJpY3Rpb24gKi8KK3N0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisKKy8qIGludGVybmFsIHZhcmlhYmxlcyAqLworc3RhdGljIGF0b21pY190IG9wZW5fYWxsb3dlZCA9IEFUT01JQ19JTklUKDEpOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9oZWFydGJlYXQ7CitzdGF0aWMgaW50IHRlbXBfcGFuaWM7CitzdGF0aWMgaW50IHJldmlzaW9uOwkJCS8qIFRoZSBjYXJkJ3MgcmV2aXNpb24gKi8KK3N0YXRpYyBpbnQgc3VwcG9ydHNfdGVtcDsJCS8qIFdldGhlciBvciBub3QgdGhlIGNhcmQgaGFzIGEgdGVtcGVyYXR1cmUgZGV2aWNlICovCitzdGF0aWMgaW50IGNvbW1hbmRfbW9kZTsJCS8qIFdldGhlciBvciBub3QgdGhlIGNhcmQgaXMgaW4gY29tbWFuZCBtb2RlICovCitzdGF0aWMgaW50IGluaXRpYWxfc3RhdHVzOwkJLyogVGhlIGNhcmQncyBib290IHN0YXR1cyAqLworc3RhdGljIGludCBjdXJyZW50X3JlYWRwb3J0OwkJLyogVGhlIGNhcmRzIEkvTyBhZGRyZXNzICovCitzdGF0aWMgc3BpbmxvY2tfdCBpb19sb2NrOworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IGhlYXJ0YmVhdCAqLworc3RhdGljIGludCBoZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7Cittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKDI8PWhlYXJ0YmVhdDw9NzIwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19IRUFSVEJFQVQpICIpIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKgorICoJSW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBzZW5kX2lzYV9jb21tYW5kKGludCBjbWQpCit7CisJaW50IGk7CisJaW50IGNvbnRyb2xfc3RhdHVzOworCWludCBwb3J0MCwgbGFzdF9wb3J0MDsJLyogRG91YmxlIHJlYWQgZm9yIHN0YWJpbGlzaW5nICovCisKKwkvKiBUaGUgV0NNRCBiaXQgbXVzdCBiZSAxIGFuZCB0aGUgY29tbWFuZCBpcyBvbmx5IDQgYml0cyBpbiBzaXplICovCisJY29udHJvbF9zdGF0dXMgPSAoY21kICYgMHgwRikgfCAweDgwOworCW91dGJfcChjb250cm9sX3N0YXR1cywgY3VycmVudF9yZWFkcG9ydCArIDIpOworCXVkZWxheShJU0FfQ09NTUFORF9USU1FT1VUKTsKKworCXBvcnQwID0gaW5iX3AoY3VycmVudF9yZWFkcG9ydCk7CisJZm9yIChpID0gMDsgaSA8IDI1OyArK2kpIHsKKwkJbGFzdF9wb3J0MCA9IHBvcnQwOworCQlwb3J0MCA9IGluYl9wKGN1cnJlbnRfcmVhZHBvcnQpOworCisJCWlmIChwb3J0MCA9PSBsYXN0X3BvcnQwKQorCQkJYnJlYWs7CS8qIERhdGEgaXMgc3RhYmxlICovCisKKwkJdWRlbGF5ICgyNTApOworCX0KKworCXJldHVybiBwb3J0MDsKK30KKworc3RhdGljIGludCBzZXRfY29tbWFuZF9tb2RlKHZvaWQpCit7CisJaW50IGksIGZvdW5kPTAsIGNvdW50PTA7CisKKwkvKiBTZXQgdGhlIGNhcmQgaW50byBjb21tYW5kIG1vZGUgKi8KKwlzcGluX2xvY2soJmlvX2xvY2spOworCXdoaWxlICgoIWZvdW5kKSAmJiAoY291bnQgPCAzKSkgeworCQlpID0gc2VuZF9pc2FfY29tbWFuZChDTURfSVNBX0lETEUpOworCisJCWlmIChpID09IDB4MDApCisJCQlmb3VuZCA9IDE7CisJCWVsc2UgaWYgKGkgPT0gMHhGMykgeworCQkJLyogQ2FyZCBkb2VzIG5vdCBsaWtlIHdoYXQgd2UndmUgZG9uZSB0byBpdCAqLworCQkJb3V0Yl9wKDB4MDAsIGN1cnJlbnRfcmVhZHBvcnQgKyAyKTsKKwkJCXVkZWxheSgxMjAwKTsJLyogU3BlYyBzYXlzIHdhaXQgMW1zICovCisJCQlvdXRiX3AoMHgwMCwgY3VycmVudF9yZWFkcG9ydCArIDIpOworCQkJdWRlbGF5KElTQV9DT01NQU5EX1RJTUVPVVQpOworCQl9CisJCWNvdW50Kys7CisJfQorCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKwljb21tYW5kX21vZGUgPSBmb3VuZDsKKworCXJldHVybihmb3VuZCk7Cit9CisKK3N0YXRpYyB2b2lkIHVuc2V0X2NvbW1hbmRfbW9kZSh2b2lkKQoreworCS8qIFNldCB0aGUgY2FyZCBpbnRvIG5vcm1hbCBtb2RlICovCisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwlvdXRiX3AoMHgwMCwgY3VycmVudF9yZWFkcG9ydCArIDIpOworCXVkZWxheShJU0FfQ09NTUFORF9USU1FT1VUKTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisKKwljb21tYW5kX21vZGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBwY3dkX3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCB3ZHJzdF9zdGF0OworCisJLyogSWYgd2UgZ290IGEgaGVhcnRiZWF0IHB1bHNlIHdpdGhpbiB0aGUgV0RUX0lOVEVSVkFMCisJICogd2UgYWdyZWUgdG8gcGluZyB0aGUgV0RUICovCisJaWYodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKSB7CisJCS8qIFBpbmcgdGhlIHdhdGNoZG9nICovCisJCXNwaW5fbG9jaygmaW9fbG9jayk7CisJCWlmIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0EpIHsKKwkJCS8qICBSZXYgQSBjYXJkcyBhcmUgcmVzZXQgYnkgc2V0dGluZyB0aGUgV0RfV0RSU1QgYml0IGluIHJlZ2lzdGVyIDEgKi8KKwkJCXdkcnN0X3N0YXQgPSBpbmJfcChjdXJyZW50X3JlYWRwb3J0KTsKKwkJCXdkcnN0X3N0YXQgJj0gMHgwRjsKKwkJCXdkcnN0X3N0YXQgfD0gV0RfV0RSU1Q7CisKKwkJCW91dGJfcCh3ZHJzdF9zdGF0LCBjdXJyZW50X3JlYWRwb3J0ICsgMSk7CisJCX0gZWxzZSB7CisJCQkvKiBSZS10cmlnZ2VyIHdhdGNoZG9nIGJ5IHdyaXRpbmcgdG8gcG9ydCAwICovCisJCQlvdXRiX3AoMHgwMCwgY3VycmVudF9yZWFkcG9ydCk7CisJCX0KKworCQkvKiBSZS1zZXQgdGhlIHRpbWVyIGludGVydmFsICovCisJCW1vZF90aW1lcigmdGltZXIsIGppZmZpZXMgKyBXRFRfSU5URVJWQUwpOworCisJCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSGVhcnRiZWF0IGxvc3QhIFdpbGwgbm90IHBpbmcgdGhlIHdhdGNoZG9nXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGN3ZF9zdGFydCh2b2lkKQoreworCWludCBzdGF0X3JlZzsKKworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIChoZWFydGJlYXQgKiBIWik7CisKKwkvKiBTdGFydCB0aGUgdGltZXIgKi8KKwltb2RfdGltZXIoJnRpbWVyLCBqaWZmaWVzICsgV0RUX0lOVEVSVkFMKTsKKworCS8qIEVuYWJsZSB0aGUgcG9ydCAqLworCWlmIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0MpIHsKKwkJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwkJb3V0Yl9wKDB4MDAsIGN1cnJlbnRfcmVhZHBvcnQgKyAzKTsKKwkJdWRlbGF5KElTQV9DT01NQU5EX1RJTUVPVVQpOworCQlzdGF0X3JlZyA9IGluYl9wKGN1cnJlbnRfcmVhZHBvcnQgKyAyKTsKKwkJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCQlpZiAoc3RhdF9yZWcgJiAweDEwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGQgbm90IHN0YXJ0IHdhdGNoZG9nXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjd2Rfc3RvcCh2b2lkKQoreworCWludCBzdGF0X3JlZzsKKworCS8qIFN0b3AgdGhlIHRpbWVyICovCisJZGVsX3RpbWVyKCZ0aW1lcik7CisKKwkvKiAgRGlzYWJsZSB0aGUgYm9hcmQgICovCisJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQykgeworCQlzcGluX2xvY2soJmlvX2xvY2spOworCQlvdXRiX3AoMHhBNSwgY3VycmVudF9yZWFkcG9ydCArIDMpOworCQl1ZGVsYXkoSVNBX0NPTU1BTkRfVElNRU9VVCk7CisJCW91dGJfcCgweEE1LCBjdXJyZW50X3JlYWRwb3J0ICsgMyk7CisJCXVkZWxheShJU0FfQ09NTUFORF9USU1FT1VUKTsKKwkJc3RhdF9yZWcgPSBpbmJfcChjdXJyZW50X3JlYWRwb3J0ICsgMik7CisJCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKwkJaWYgKChzdGF0X3JlZyAmIDB4MTApID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJDb3VsZCBub3Qgc3RvcCB3YXRjaGRvZ1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY3dkX2tlZXBhbGl2ZSh2b2lkKQoreworCS8qIHVzZXIgbGFuZCBwaW5nICovCisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKGhlYXJ0YmVhdCAqIEhaKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY3dkX3NldF9oZWFydGJlYXQoaW50IHQpCit7CisJaWYgKCh0IDwgMikgfHwgKHQgPiA3MjAwKSkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJCXJldHVybiAtRUlOVkFMOworCisJaGVhcnRiZWF0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY3dkX2dldF9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJaW50IGNhcmRfc3RhdHVzOworCisJKnN0YXR1cz0wOworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkKKwkJLyogUmV2IEEgY2FyZHMgcmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tCisJCSAqIHRoZSBiYXNlIHJlZ2lzdGVyLCB3aGljaCBpcyB1c2VkIGZvciB0aGUKKwkJICogdGVtcGVyYXR1cmUgaW4gb3RoZXIgY2FyZHMuICovCisJCWNhcmRfc3RhdHVzID0gaW5iKGN1cnJlbnRfcmVhZHBvcnQpOworCWVsc2UgeworCQkvKiBSZXYgQyBjYXJkcyByZXR1cm4gY2FyZCBzdGF0dXMgaW4gdGhlIGJhc2UKKwkJICogYWRkcmVzcyArIDEgcmVnaXN0ZXIuIEFuZCB1c2UgZGlmZmVyZW50IGJpdHMKKwkJICogdG8gaW5kaWNhdGUgYSBjYXJkIGluaXRpYXRlZCByZXNldCwgYW5kIGFuCisJCSAqIG92ZXItdGVtcGVyYXR1cmUgY29uZGl0aW9uLiBBbmQgdGhlIHJlYm9vdAorCQkgKiBzdGF0dXMgY2FuIGJlIHJlc2V0LiAqLworCQljYXJkX3N0YXR1cyA9IGluYihjdXJyZW50X3JlYWRwb3J0ICsgMSk7CisJfQorCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKworCWlmIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0EpIHsKKwkJaWYgKGNhcmRfc3RhdHVzICYgV0RfV0RSU1QpCisJCQkqc3RhdHVzIHw9IFdESU9GX0NBUkRSRVNFVDsKKworCQlpZiAoY2FyZF9zdGF0dXMgJiBXRF9UMTEwKSB7CisJCQkqc3RhdHVzIHw9IFdESU9GX09WRVJIRUFUOworCQkJaWYgKHRlbXBfcGFuaWMpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlRlbXBlcmF0dXJlIG92ZXJoZWF0IHRyaXAhXG4iKTsKKwkJCQltYWNoaW5lX3Bvd2VyX29mZigpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNhcmRfc3RhdHVzICYgV0RfUkVWQ19XVFJQKQorCQkJKnN0YXR1cyB8PSBXRElPRl9DQVJEUkVTRVQ7CisKKwkJaWYgKGNhcmRfc3RhdHVzICYgV0RfUkVWQ19UVFJQKSB7CisJCQkqc3RhdHVzIHw9IFdESU9GX09WRVJIRUFUOworCQkJaWYgKHRlbXBfcGFuaWMpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlRlbXBlcmF0dXJlIG92ZXJoZWF0IHRyaXAhXG4iKTsKKwkJCQltYWNoaW5lX3Bvd2VyX29mZigpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGN3ZF9jbGVhcl9zdGF0dXModm9pZCkKK3sKKwlpZiAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9DKSB7CisJCXNwaW5fbG9jaygmaW9fbG9jayk7CisJCW91dGJfcCgweDAwLCBjdXJyZW50X3JlYWRwb3J0ICsgMSk7IC8qIGNsZWFyIHJlc2V0IHN0YXR1cyAqLworCQlzcGluX3VubG9jaygmaW9fbG9jayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjd2RfZ2V0X3RlbXBlcmF0dXJlKGludCAqdGVtcGVyYXR1cmUpCit7CisJLyogY2hlY2sgdGhhdCBwb3J0IDAgZ2l2ZXMgdGVtcGVyYXR1cmUgaW5mbyBhbmQgbm8gY29tbWFuZCByZXN1bHRzICovCisJaWYgKGNvbW1hbmRfbW9kZSkKKwkJcmV0dXJuIC0xOworCisJKnRlbXBlcmF0dXJlID0gMDsKKwlpZiAoIXN1cHBvcnRzX3RlbXApCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBDb252ZXJ0IGNlbHNpdXMgdG8gZmFocmVuaGVpdCwgc2luY2UgdGhpcyB3YXMKKwkgKiB0aGUgZGVjaWRlZCAnc3RhbmRhcmQnIGZvciB0aGlzIHJldHVybiB2YWx1ZS4KKwkgKi8KKwlzcGluX2xvY2soJmlvX2xvY2spOworCSp0ZW1wZXJhdHVyZSA9ICgoaW5iKGN1cnJlbnRfcmVhZHBvcnQpKSAqIDkgLyA1KSArIDMyOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKK3N0YXRpYyBpbnQgcGN3ZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJ2OworCWludCBzdGF0dXM7CisJaW50IHRlbXBlcmF0dXJlOworCWludCBuZXdfaGVhcnRiZWF0OworCWludCBfX3VzZXIgKmFyZ3AgPSAoaW50IF9fdXNlciAqKWFyZzsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX09WRVJIRUFUIHwKKwkJCQkJV0RJT0ZfQ0FSRFJFU0VUIHwKKwkJCQkJV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCQkJCVdESU9GX1NFVFRJTUVPVVQgfAorCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJCS5pZGVudGl0eSA9CQkiUENXRCIsCisJfTsKKworCXN3aXRjaChjbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlwY3dkX2dldF9zdGF0dXMoJnN0YXR1cyk7CisJCXJldHVybiBwdXRfdXNlcihzdGF0dXMsIGFyZ3ApOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoaW5pdGlhbF9zdGF0dXMsIGFyZ3ApOworCisJY2FzZSBXRElPQ19HRVRURU1QOgorCQlpZiAocGN3ZF9nZXRfdGVtcGVyYXR1cmUoJnRlbXBlcmF0dXJlKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBwdXRfdXNlcih0ZW1wZXJhdHVyZSwgYXJncCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCWlmIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0MpCisJCXsKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZydiwgYXJncCwgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocnYgJiBXRElPU19ESVNBQkxFQ0FSRCkKKwkJCXsKKwkJCQlyZXR1cm4gcGN3ZF9zdG9wKCk7CisJCQl9CisKKwkJCWlmIChydiAmIFdESU9TX0VOQUJMRUNBUkQpCisJCQl7CisJCQkJcmV0dXJuIHBjd2Rfc3RhcnQoKTsKKwkJCX0KKworCQkJaWYgKHJ2ICYgV0RJT1NfVEVNUFBBTklDKQorCQkJeworCQkJCXRlbXBfcGFuaWMgPSAxOworCQkJfQorCQl9CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXBjd2Rfa2VlcGFsaXZlKCk7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X2hlYXJ0YmVhdCwgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAocGN3ZF9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcGN3ZF9rZWVwYWxpdmUoKTsKKwkJLyogRmFsbCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBhcmdwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcGN3ZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlwY3dkX2tlZXBhbGl2ZSgpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHBjd2Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJm9wZW5fYWxsb3dlZCkgKSB7CisJCWF0b21pY19pbmMoICZvcGVuX2FsbG93ZWQgKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBBY3RpdmF0ZSAqLworCXBjd2Rfc3RhcnQoKTsKKwlwY3dkX2tlZXBhbGl2ZSgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBwY3dkX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJcGN3ZF9zdG9wKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQlwY3dkX2tlZXBhbGl2ZSgpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCWF0b21pY19pbmMoICZvcGVuX2FsbG93ZWQgKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvdGVtcGVyYXR1cmUgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCBwY3dkX3RlbXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgdGVtcGVyYXR1cmU7CisKKwlpZiAocGN3ZF9nZXRfdGVtcGVyYXR1cmUoJnRlbXBlcmF0dXJlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJnRlbXBlcmF0dXJlLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwY3dkX3RlbXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoIXN1cHBvcnRzX3RlbXApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHBjd2RfdGVtcF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmeSBzeXN0ZW0KKyAqLworCitzdGF0aWMgaW50IHBjd2Rfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCXBjd2Rfc3RvcCgpOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGN3ZF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gcGN3ZF93cml0ZSwKKwkuaW9jdGwJCT0gcGN3ZF9pb2N0bCwKKwkub3BlbgkJPSBwY3dkX29wZW4sCisJLnJlbGVhc2UJPSBwY3dkX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHBjd2RfbWlzY2RldiA9IHsKKwkubWlub3IgPQlXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9CQkid2F0Y2hkb2ciLAorCS5mb3BzID0JCSZwY3dkX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY3dkX3RlbXBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcGN3ZF90ZW1wX3JlYWQsCisJLm9wZW4JCT0gcGN3ZF90ZW1wX29wZW4sCisJLnJlbGVhc2UJPSBwY3dkX3RlbXBfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdGVtcF9taXNjZGV2ID0geworCS5taW5vciA9CVRFTVBfTUlOT1IsCisJLm5hbWUgPQkJInRlbXBlcmF0dXJlIiwKKwkuZm9wcyA9CQkmcGN3ZF90ZW1wX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBjd2Rfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPQlwY3dkX25vdGlmeV9zeXMsCit9OworCisvKgorICoJSW5pdCAmIGV4aXQgcm91dGluZXMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3N1cHBvcnQodm9pZCkKK3sKKwlpZiAoaW5iKGN1cnJlbnRfcmVhZHBvcnQpICE9IDB4RjApCisJCXN1cHBvcnRzX3RlbXAgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfcmV2aXNpb24odm9pZCkKK3sKKwlpbnQgciA9IFBDV0RfUkVWSVNJT05fQzsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJLyogUkVWIEEgY2FyZHMgdXNlIG9ubHkgMiBpbyBwb3J0czsgdGVzdAorCSAqIHByZXN1bWVzIGEgZmxvYXRpbmcgYnVzIHJlYWRzIGFzIDB4ZmYuICovCisJaWYgKChpbmIoY3VycmVudF9yZWFkcG9ydCArIDIpID09IDB4RkYpIHx8CisJICAgIChpbmIoY3VycmVudF9yZWFkcG9ydCArIDMpID09IDB4RkYpKQorCQlyPVBDV0RfUkVWSVNJT05fQTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpnZXRfZmlybXdhcmUodm9pZCkKK3sKKwlpbnQgb25lLCB0ZW4sIGh1bmQsIG1pbm9yOworCWNoYXIgKnJldDsKKworCXJldCA9IGttYWxsb2MoNiwgR0ZQX0tFUk5FTCk7CisJaWYocmV0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKHNldF9jb21tYW5kX21vZGUoKSkgeworCQlvbmUgPSBzZW5kX2lzYV9jb21tYW5kKENNRF9JU0FfVkVSU0lPTl9JTlRFR0VSKTsKKwkJdGVuID0gc2VuZF9pc2FfY29tbWFuZChDTURfSVNBX1ZFUlNJT05fVEVOVEgpOworCQlodW5kID0gc2VuZF9pc2FfY29tbWFuZChDTURfSVNBX1ZFUlNJT05fSFVORFJFVEgpOworCQltaW5vciA9IHNlbmRfaXNhX2NvbW1hbmQoQ01EX0lTQV9WRVJTSU9OX01JTk9SKTsKKwkJc3ByaW50ZihyZXQsICIlYy4lYyVjJWMiLCBvbmUsIHRlbiwgaHVuZCwgbWlub3IpOworCX0KKwllbHNlCisJCXNwcmludGYocmV0LCAiRVJST1IiKTsKKworCXVuc2V0X2NvbW1hbmRfbW9kZSgpOworCXJldHVybihyZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfb3B0aW9uX3N3aXRjaGVzKHZvaWQpCit7CisJaW50IHJ2PTA7CisKKwlpZiAoc2V0X2NvbW1hbmRfbW9kZSgpKSB7CisJCS8qIEdldCBzd2l0Y2ggc2V0dGluZ3MgKi8KKwkJcnYgPSBzZW5kX2lzYV9jb21tYW5kKENNRF9JU0FfU1dJVENIX1NFVFRJTkdTKTsKKwl9CisKKwl1bnNldF9jb21tYW5kX21vZGUoKTsKKwlyZXR1cm4ocnYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY3dhdGNoZG9nX2luaXQoaW50IGJhc2VfYWRkcikKK3sKKwlpbnQgcmV0OworCWNoYXIgKmZpcm13YXJlOworCWludCBvcHRpb25fc3dpdGNoZXM7CisKKwljYXJkc19mb3VuZCsrOworCWlmIChjYXJkc19mb3VuZCA9PSAxKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAidiVzIEtlbiBIb2xsaXMgKGtlbmppQGJpdGdhdGUuY29tKVxuIiwgV0RfVkVSKTsKKworCWlmIChjYXJkc19mb3VuZCA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyAxIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChiYXNlX2FkZHIgPT0gMHgwMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIEkvTy1BZGRyZXNzIGZvciBjYXJkIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWN1cnJlbnRfcmVhZHBvcnQgPSBiYXNlX2FkZHI7CisKKwkvKiBDaGVjayBjYXJkJ3MgcmV2aXNpb24gKi8KKwlyZXZpc2lvbiA9IGdldF9yZXZpc2lvbigpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjdXJyZW50X3JlYWRwb3J0LCAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9BKSA/IDIgOiA0LCAiUENXRCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCWN1cnJlbnRfcmVhZHBvcnQpOworCQljdXJyZW50X3JlYWRwb3J0ID0gMHgwMDAwOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBJbml0aWFsIHZhcmlhYmxlcyAqLworCXN1cHBvcnRzX3RlbXAgPSAwOworCXRlbXBfcGFuaWMgPSAwOworCWluaXRpYWxfc3RhdHVzID0gMHgwMDAwOworCisJLyogZ2V0IHRoZSBib290X3N0YXR1cyAqLworCXBjd2RfZ2V0X3N0YXR1cygmaW5pdGlhbF9zdGF0dXMpOworCisJLyogY2xlYXIgdGhlICJjYXJkIGNhdXNlZCByZWJvb3QiIGZsYWcgKi8KKwlwY3dkX2NsZWFyX3N0YXR1cygpOworCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmZ1bmN0aW9uID0gcGN3ZF90aW1lcl9waW5nOworCXRpbWVyLmRhdGEgPSAwOworCisJLyogIERpc2FibGUgdGhlIGJvYXJkICAqLworCXBjd2Rfc3RvcCgpOworCisJLyogIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBjYXJkIHN1cHBvcnRzIHRoZSB0ZW1wZXJhdHVyZSBkZXZpY2UgKi8KKwlnZXRfc3VwcG9ydCgpOworCisJLyogR2V0IHNvbWUgZXh0cmEgaW5mbyBmcm9tIHRoZSBoYXJkd2FyZSAoaW4gY29tbWFuZC9kZWJ1Zy9kaWFnIG1vZGUpICovCisJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklTQS1QQyBXYXRjaGRvZyAoUkVWLkEpIGRldGVjdGVkIGF0IHBvcnQgMHglMDR4XG4iLCBjdXJyZW50X3JlYWRwb3J0KTsKKwllbHNlIGlmIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0MpIHsKKwkJZmlybXdhcmUgPSBnZXRfZmlybXdhcmUoKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklTQS1QQyBXYXRjaGRvZyAoUkVWLkMpIGRldGVjdGVkIGF0IHBvcnQgMHglMDR4IChGaXJtd2FyZSB2ZXJzaW9uOiAlcylcbiIsCisJCQljdXJyZW50X3JlYWRwb3J0LCBmaXJtd2FyZSk7CisJCWtmcmVlKGZpcm13YXJlKTsKKwkJb3B0aW9uX3N3aXRjaGVzID0gZ2V0X29wdGlvbl9zd2l0Y2hlcygpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiT3B0aW9uIHN3aXRjaGVzICgweCUwMngpOiBUZW1wZXJhdHVyZSBSZXNldCBFbmFibGU9JXMsIFBvd2VyIE9uIERlbGF5PSVzXG4iLAorCQkJb3B0aW9uX3N3aXRjaGVzLAorCQkJKChvcHRpb25fc3dpdGNoZXMgJiAweDEwKSA/ICJPTiIgOiAiT0ZGIiksCisJCQkoKG9wdGlvbl9zd2l0Y2hlcyAmIDB4MDgpID8gIk9OIiA6ICJPRkYiKSk7CisKKwkJLyogUmVwcm9ncmFtIGludGVybmFsIGhlYXJ0YmVhdCB0byAyIHNlY29uZHMgKi8KKwkJaWYgKHNldF9jb21tYW5kX21vZGUoKSkgeworCQkJc2VuZF9pc2FfY29tbWFuZChDTURfSVNBX0RFTEFZX1RJTUVfMlNFQ1MpOworCQkJdW5zZXRfY29tbWFuZF9tb2RlKCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTaG91bGQgTkVWRVIgaGFwcGVuLCB1bmxlc3MgZ2V0X3JldmlzaW9uKCkgZmFpbHMuICovCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbmFibGUgdG8gZ2V0IHJldmlzaW9uXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oY3VycmVudF9yZWFkcG9ydCwgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgPyAyIDogNCk7CisJCWN1cnJlbnRfcmVhZHBvcnQgPSAweDAwMDA7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3VwcG9ydHNfdGVtcCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlRlbXBlcmF0dXJlIE9wdGlvbiBEZXRlY3RlZFxuIik7CisKKwlpZiAoaW5pdGlhbF9zdGF0dXMgJiBXRElPRl9DQVJEUkVTRVQpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQcmV2aW91cyByZWJvb3Qgd2FzIGNhdXNlZCBieSB0aGUgY2FyZFxuIik7CisKKwlpZiAoaW5pdGlhbF9zdGF0dXMgJiBXRElPRl9PVkVSSEVBVCkgeworCQlwcmludGsoS0VSTl9FTUVSRyBQRlggIkNhcmQgc2Vuc2VzIGEgQ1BVIE92ZXJoZWF0LiBQYW5pY2tpbmchXG4iKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgUEZYICJDUFUgT3ZlcmhlYXRcbiIpOworCX0KKworCWlmIChpbml0aWFsX3N0YXR1cyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gcHJldmlvdXMgdHJpcCBkZXRlY3RlZCAtIENvbGQgYm9vdCBvciByZXNldFxuIik7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKyAgICAgICAgaWYgKHBjd2Rfc2V0X2hlYXJ0YmVhdChoZWFydGJlYXQpKSB7CisgICAgICAgICAgICAgICAgcGN3ZF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX0hFQVJUQkVBVCk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggImhlYXJ0YmVhdCB2YWx1ZSBtdXN0IGJlIDI8PWhlYXJ0YmVhdDw9NzIwMCwgdXNpbmcgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBXQVRDSERPR19IRUFSVEJFQVQpOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGN3ZF9ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJcmVsZWFzZV9yZWdpb24oY3VycmVudF9yZWFkcG9ydCwgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgPyAyIDogNCk7CisJCWN1cnJlbnRfcmVhZHBvcnQgPSAweDAwMDA7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHN1cHBvcnRzX3RlbXApIHsKKwkJcmV0ID0gbWlzY19yZWdpc3RlcigmdGVtcF9taXNjZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQkJVEVNUF9NSU5PUiwgcmV0KTsKKwkJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwY3dkX25vdGlmaWVyKTsKKwkJCXJlbGVhc2VfcmVnaW9uKGN1cnJlbnRfcmVhZHBvcnQsIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0EpID8gMiA6IDQpOworCQkJY3VycmVudF9yZWFkcG9ydCA9IDB4MDAwMDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZwY3dkX21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJaWYgKHN1cHBvcnRzX3RlbXApCisJCQltaXNjX2RlcmVnaXN0ZXIoJnRlbXBfbWlzY2Rldik7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwY3dkX25vdGlmaWVyKTsKKwkJcmVsZWFzZV9yZWdpb24oY3VycmVudF9yZWFkcG9ydCwgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgPyAyIDogNCk7CisJCWN1cnJlbnRfcmVhZHBvcnQgPSAweDAwMDA7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiBoZWFydGJlYXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCWhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwY3dhdGNoZG9nX2V4aXQodm9pZCkKK3sKKwkvKiAgRGlzYWJsZSB0aGUgYm9hcmQgICovCisJaWYgKCFub3dheW91dCkKKwkJcGN3ZF9zdG9wKCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyKCZwY3dkX21pc2NkZXYpOworCWlmIChzdXBwb3J0c190ZW1wKQorCQltaXNjX2RlcmVnaXN0ZXIoJnRlbXBfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjd2Rfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKGN1cnJlbnRfcmVhZHBvcnQsIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0EpID8gMiA6IDQpOworCWN1cnJlbnRfcmVhZHBvcnQgPSAweDAwMDA7Cit9CisKKy8qCisgKiAgVGhlIElTQSBjYXJkcyBoYXZlIGEgaGVhcnRiZWF0IGJpdCBpbiBvbmUgb2YgdGhlIHJlZ2lzdGVycywgd2hpY2gKKyAqICByZWdpc3RlciBpcyBjYXJkIGRlcGVuZGVudC4gIFRoZSBoZWFydGJlYXQgYml0IGlzIG1vbml0b3JlZCwgYW5kIGlmCisgKiAgZm91bmQsIGlzIGNvbnNpZGVyZWQgcHJvb2YgdGhhdCBhIEJlcmtzaGlyZSBjYXJkIGhhcyBiZWVuIGZvdW5kLgorICogIFRoZSBpbml0aWFsIHJhdGUgaXMgb25jZSBwZXIgc2Vjb25kIGF0IGJvYXJkIHN0YXJ0IHVwLCB0aGVuIHR3aWNlCisgKiAgcGVyIHNlY29uZCBmb3Igbm9ybWFsIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGN3ZF9jaGVja2NhcmQoaW50IGJhc2VfYWRkcikKK3sKKwlpbnQgcG9ydDAsIGxhc3RfcG9ydDA7CS8qIFJlZyAwLCBpbiBjYXNlIGl0J3MgUkVWIEEgKi8KKwlpbnQgcG9ydDEsIGxhc3RfcG9ydDE7CS8qIFJlZ2lzdGVyIDEgZm9yIFJFViBDIGNhcmRzICovCisJaW50IGk7CisJaW50IHJldHZhbDsKKworCWlmICghcmVxdWVzdF9yZWdpb24gKGJhc2VfYWRkciwgNCwgIlBDV0QiKSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlBvcnQgMHglMDR4IHVuYXZhaWxhYmxlXG4iLCBiYXNlX2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR2YWwgPSAwOworCisJcG9ydDAgPSBpbmJfcChiYXNlX2FkZHIpOwkvKiBGb3IgUkVWIEEgYm9hcmRzICovCisJcG9ydDEgPSBpbmJfcChiYXNlX2FkZHIgKyAxKTsJLyogRm9yIFJFViBDIGJvYXJkcyAqLworCWlmIChwb3J0MCAhPSAweGZmIHx8IHBvcnQxICE9IDB4ZmYpIHsKKwkJLyogTm90IGFuICdmZicgZnJvbSBhIGZsb2F0aW5nIGJ1cywgc28gbXVzdCBiZSBhIGNhcmQhICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKworCQkJbXNsZWVwKDUwMCk7CisKKwkJCWxhc3RfcG9ydDAgPSBwb3J0MDsKKwkJCWxhc3RfcG9ydDEgPSBwb3J0MTsKKworCQkJcG9ydDAgPSBpbmJfcChiYXNlX2FkZHIpOworCQkJcG9ydDEgPSBpbmJfcChiYXNlX2FkZHIgKyAxKTsKKworCQkJLyogSGFzIGVpdGhlciBoZWFyYmVhdCBiaXQgY2hhbmdlZD8gICovCisJCQlpZiAoKHBvcnQwIF4gbGFzdF9wb3J0MCkgJiBXRF9IUlRCVCB8fAorCQkJICAgIChwb3J0MSBeIGxhc3RfcG9ydDEpICYgV0RfUkVWQ19IUkJUKSB7CisJCQkJcmV0dmFsID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZWxlYXNlX3JlZ2lvbiAoYmFzZV9hZGRyLCA0KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGF1dG8tcHJvYmUgYWRkcmVzc2VzIGF2YWlsYWJsZS4KKyAqCisgKiBSZXZpc2lvbiBBIG9ubHkgdXNlcyBwb3J0cyAweDI3MCBhbmQgMHgzNzAuICBSZXZpc2lvbiBDIGludHJvZHVjZWQgMHgzNTAuCisgKiBSZXZpc2lvbiBBIGhhcyBhbiBhZGRyZXNzIHJhbmdlIG9mIDIgYWRkcmVzc2VzLCB3aGlsZSBSZXZpc2lvbiBDIGhhcyA0LgorICovCitzdGF0aWMgaW50IHBjd2RfaW9wb3J0c1tdID0geyAweDI3MCwgMHgzNTAsIDB4MzcwLCAweDAwMCB9OworCitzdGF0aWMgaW50IF9faW5pdCBwY3dkX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGksIGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKworCWZvciAoaSA9IDA7IHBjd2RfaW9wb3J0c1tpXSAhPSAwOyBpKyspIHsKKwkJaWYgKHBjd2RfY2hlY2tjYXJkKHBjd2RfaW9wb3J0c1tpXSkpIHsKKwkJCWlmICghKHBjd2F0Y2hkb2dfaW5pdChwY3dkX2lvcG9ydHNbaV0pKSkKKwkJCQlmb3VuZCsrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIk5vIGNhcmQgZGV0ZWN0ZWQsIG9yIHBvcnQgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGN3ZF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWlmIChjdXJyZW50X3JlYWRwb3J0KQorCQlwY3dhdGNoZG9nX2V4aXQoKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KHBjd2RfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocGN3ZF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIktlbiBIb2xsaXMgPGtlbmppQGJpdGdhdGUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCZXJrc2hpcmUgSVNBLVBDIFdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworTU9EVUxFX0FMSUFTX01JU0NERVYoVEVNUF9NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF9wY2kuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTA2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF9wY2kuYwpAQCAtMCwwICsxLDY3NyBAQAorLyoKKyAqCUJlcmtzaGlyZSBQQ0ktUEMgV2F0Y2hkb2cgQ2FyZCBEcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDMgV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4uCisgKgorICoJQmFzZWQgb24gc291cmNlIGNvZGUgb2YgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorICoJICBLZW4gSG9sbGlzIDxrZW5qaUBiaXRnYXRlLmNvbT4sCisgKgkgIExpbmRzYXkgSGFycmlzIDxsaW5kc2F5QGJsdWVndW0uY29tPiwKKyAqCSAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sCisgKgkgIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4sCisgKgkgIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBXaW0gVmFuIFNlYnJvZWNrIG5vciBJZ3VhbmEgdnp3LiBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKglwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICoJcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICovCisKKy8qCisgKglBIGJlbGxzIGFuZCB3aGlzdGxlcyBkcml2ZXIgaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5wY3dkLmRlLworICoJTW9yZSBpbmZvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJlcmtwcm9kLmNvbS8gb3IgaHR0cDovL3d3dy5wY3dhdGNoZG9nLmNvbS8KKyAqLworCisvKgorICoJSW5jbHVkZXMsIGRlZmluZXMsIHZhcmlhYmxlcywgbW9kdWxlIHBhcmFtZXRlcnMsIC4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBNb2R1bGUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgV0FUQ0hET0dfVkVSU0lPTiAiMS4wMSIKKyNkZWZpbmUgV0FUQ0hET0dfREFURSAiMTUgTWFyIDIwMDUiCisjZGVmaW5lIFdBVENIRE9HX0RSSVZFUl9OQU1FICJQQ0ktUEMgV2F0Y2hkb2ciCisjZGVmaW5lIFdBVENIRE9HX05BTUUgInBjd2RfcGNpIgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OIFdBVENIRE9HX0RSSVZFUl9OQU1FICIgZHJpdmVyLCB2IiBXQVRDSERPR19WRVJTSU9OICIgKCIgV0FUQ0hET0dfREFURSAiKVxuIgorCisvKiBTdHVmZiBmb3IgdGhlIFBDSSBJRCdzICAqLworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1FVSUNLTE9HSUMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RVUlDS0xPR0lDICAgIDB4MTFlMworI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9XQVRDSERPR19QQ0lQQ1dECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0FUQ0hET0dfUENJUENXRCAweDUwMzAKKyNlbmRpZgorCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbmVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbnRyb2wgc3RhdHVzIGJpdHMgZm9yIHRoZQorICogUENJLVBDIFdhdGNoZG9nIGNhcmQuCisgKi8KKyNkZWZpbmUgV0RfUENJX1dUUlAgICAgICAgICAgICAgMHgwMQkvKiBXYXRjaGRvZyBUcmlwIHN0YXR1cyAqLworI2RlZmluZSBXRF9QQ0lfSFJCVCAgICAgICAgICAgICAweDAyCS8qIFdhdGNoZG9nIEhlYXJ0YmVhdCAqLworI2RlZmluZSBXRF9QQ0lfVFRSUCAgICAgICAgICAgICAweDA0CS8qIFRlbXBlcmF0dXJlIFRyaXAgc3RhdHVzICovCisKKy8qIGFjY29yZGluZyB0byBkb2N1bWVudGF0aW9uIG1heC4gdGltZSB0byBwcm9jZXNzIGEgY29tbWFuZCBmb3IgdGhlIHBjaQorICogd2F0Y2hkb2cgY2FyZCBpcyAxMDAgbXMsIHNvIHdlIGdpdmUgaXQgMTUwIG1zIHRvIGRvIGl0J3Mgam9iICovCisjZGVmaW5lIFBDSV9DT01NQU5EX1RJTUVPVVQJMTUwCisKKy8qIFdhdGNoZG9nJ3MgaW50ZXJuYWwgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ01EX0dFVF9TVEFUVVMJCQkweDA0CisjZGVmaW5lIENNRF9HRVRfRklSTVdBUkVfVkVSU0lPTgkweDA4CisjZGVmaW5lIENNRF9SRUFEX1dBVENIRE9HX1RJTUVPVVQJMHgxOAorI2RlZmluZSBDTURfV1JJVEVfV0FUQ0hET0dfVElNRU9VVAkweDE5CisKKy8qIFdlIGNhbiBvbmx5IHVzZSAxIGNhcmQgZHVlIHRvIHRoZSAvZGV2L3dhdGNoZG9nIHJlc3RyaWN0aW9uICovCitzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworCisvKiBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgdGVtcF9wYW5pYzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlzX2FjdGl2ZTsKK3N0YXRpYyBjaGFyIGV4cGVjdF9yZWxlYXNlOworc3RhdGljIHN0cnVjdCB7CisJaW50IHN1cHBvcnRzX3RlbXA7CS8qIFdldGhlciBvciBub3QgdGhlIGNhcmQgaGFzIGEgdGVtcGVyYXR1cmUgZGV2aWNlICovCisJaW50IGJvb3Rfc3RhdHVzOwkvKiBUaGUgY2FyZCdzIGJvb3Qgc3RhdHVzICovCisJdW5zaWduZWQgbG9uZyBpb19hZGRyOwkvKiBUaGUgY2FyZHMgSS9PIGFkZHJlc3MgKi8KKwlzcGlubG9ja190IGlvX2xvY2s7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7Cit9IHBjaXBjd2RfcHJpdmF0ZTsKKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgV0FUQ0hET0dfSEVBUlRCRUFUIDIJLyogMiBzZWMgZGVmYXVsdCBoZWFydGJlYXQgKi8KK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgwPGhlYXJ0YmVhdDw2NTUzNiwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19IRUFSVEJFQVQpICIpIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKgorICoJSW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBzZW5kX2NvbW1hbmQoaW50IGNtZCwgaW50ICptc2IsIGludCAqbHNiKQoreworCWludCBnb3RfcmVzcG9uc2UsIGNvdW50OworCisJc3Bpbl9sb2NrKCZwY2lwY3dkX3ByaXZhdGUuaW9fbG9jayk7CisJLyogSWYgYSBjb21tYW5kIHJlcXVpcmVzIGRhdGEgaXQgc2hvdWxkIGJlIHdyaXR0ZW4gZmlyc3QuCisJICogRGF0YSBmb3IgY29tbWFuZHMgd2l0aCA4IGJpdHMgb2YgZGF0YSBzaG91bGQgYmUgd3JpdHRlbiB0byBwb3J0IDQuCisJICogQ29tbWFuZHMgd2l0aCAxNiBiaXRzIG9mIGRhdGEsIHNob3VsZCBiZSB3cml0dGVuIGFzIExTQiB0byBwb3J0IDQKKwkgKiBhbmQgTVNCIHRvIHBvcnQgNS4KKwkgKiBBZnRlciB0aGUgcmVxdWlyZWQgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRoZW4gd3JpdGUgdGhlIGNvbW1hbmQgdG8KKwkgKiBwb3J0IDYuICovCisJb3V0Yl9wKCpsc2IsIHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgNCk7CisJb3V0Yl9wKCptc2IsIHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgNSk7CisJb3V0Yl9wKGNtZCwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyA2KTsKKworCS8qIHdhaXQgdGlsbCB0aGUgcGNpIGNhcmQgcHJvY2Vzc2VkIHRoZSBjb21tYW5kLCBzaWduYWxlZCBieQorCSAqIHRoZSBXUlNQIGJpdCBpbiBwb3J0IDIgYW5kIGdpdmUgaXQgYSBtYXguIHRpbWVvdXQgb2YKKwkgKiBQQ0lfQ09NTUFORF9USU1FT1VUIHRvIHByb2Nlc3MgKi8KKwlnb3RfcmVzcG9uc2UgPSBpbmJfcChwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDIpICYgMHg0MDsKKwlmb3IgKGNvdW50ID0gMDsgKGNvdW50IDwgUENJX0NPTU1BTkRfVElNRU9VVCkgJiYgKCFnb3RfcmVzcG9uc2UpOyBjb3VudCsrKSB7CisJCW1kZWxheSgxKTsKKwkJZ290X3Jlc3BvbnNlID0gaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAyKSAmIDB4NDA7CisJfQorCisJaWYgKGdvdF9yZXNwb25zZSkgeworCQkvKiByZWFkIGJhY2sgcmVzcG9uc2UgKi8KKwkJKmxzYiA9IGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgNCk7CisJCSptc2IgPSBpbmJfcChwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDUpOworCisJCS8qIGNsZWFyIFdSU1AgYml0ICovCisJCWluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgNik7CisJfQorCXNwaW5fdW5sb2NrKCZwY2lwY3dkX3ByaXZhdGUuaW9fbG9jayk7CisKKwlyZXR1cm4gZ290X3Jlc3BvbnNlOworfQorCitzdGF0aWMgaW50IHBjaXBjd2Rfc3RhcnQodm9pZCkKK3sKKwlpbnQgc3RhdF9yZWc7CisKKwlzcGluX2xvY2soJnBjaXBjd2RfcHJpdmF0ZS5pb19sb2NrKTsKKwlvdXRiX3AoMHgwMCwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAzKTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlzdGF0X3JlZyA9IGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgMik7CisJc3Bpbl91bmxvY2soJnBjaXBjd2RfcHJpdmF0ZS5pb19sb2NrKTsKKworCWlmIChzdGF0X3JlZyAmIDB4MTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FyZCB0aW1lciBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lwY3dkX3N0b3Aodm9pZCkKK3sKKwlpbnQgc3RhdF9yZWc7CisKKwlzcGluX2xvY2soJnBjaXBjd2RfcHJpdmF0ZS5pb19sb2NrKTsKKwlvdXRiX3AoMHhBNSwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAzKTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlvdXRiX3AoMHhBNSwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAzKTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlzdGF0X3JlZyA9IGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgMik7CisJc3Bpbl91bmxvY2soJnBjaXBjd2RfcHJpdmF0ZS5pb19sb2NrKTsKKworCWlmICghKHN0YXRfcmVnICYgMHgxMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FyZCBkaWQgbm90IGFja25vd2xlZGdlIGRpc2FibGUgYXR0ZW1wdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lwY3dkX2tlZXBhbGl2ZSh2b2lkKQoreworCS8qIFJlLXRyaWdnZXIgd2F0Y2hkb2cgYnkgd3JpdGluZyB0byBwb3J0IDAgKi8KKwlvdXRiX3AoMHg0MiwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaXBjd2Rfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpbnQgdF9tc2IgPSB0IC8gMjU2OworCWludCB0X2xzYiA9IHQgJSAyNTY7CisKKwlpZiAoKHQgPCAweDAwMDEpIHx8ICh0ID4gMHhGRkZGKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBXcml0ZSBuZXcgaGVhcnRiZWF0IHRvIHdhdGNoZG9nICovCisJc2VuZF9jb21tYW5kKENNRF9XUklURV9XQVRDSERPR19USU1FT1VULCAmdF9tc2IsICZ0X2xzYik7CisKKwloZWFydGJlYXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaXBjd2RfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwlpbnQgbmV3X3N0YXR1czsKKworCSpzdGF0dXM9MDsKKwluZXdfc3RhdHVzID0gaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAxKTsKKwlpZiAobmV3X3N0YXR1cyAmIFdEX1BDSV9XVFJQKQorCQkqc3RhdHVzIHw9IFdESU9GX0NBUkRSRVNFVDsKKwlpZiAobmV3X3N0YXR1cyAmIFdEX1BDSV9UVFJQKSB7CisJCSpzdGF0dXMgfD0gV0RJT0ZfT1ZFUkhFQVQ7CisJCWlmICh0ZW1wX3BhbmljKQorCQkJcGFuaWMoUEZYICJUZW1wZXJhdHVyZSBvdmVyaGVhdCB0cmlwIVxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9jbGVhcl9zdGF0dXModm9pZCkKK3sKKwlvdXRiX3AoMHgwMSwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lwY3dkX2dldF90ZW1wZXJhdHVyZShpbnQgKnRlbXBlcmF0dXJlKQoreworCSp0ZW1wZXJhdHVyZSA9IDA7CisJaWYgKCFwY2lwY3dkX3ByaXZhdGUuc3VwcG9ydHNfdGVtcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIENvbnZlcnQgY2Vsc2l1cyB0byBmYWhyZW5oZWl0LCBzaW5jZSB0aGlzIHdhcworCSAqIHRoZSBkZWNpZGVkICdzdGFuZGFyZCcgZm9yIHRoaXMgcmV0dXJuIHZhbHVlLgorCSAqLworCSp0ZW1wZXJhdHVyZSA9ICgoaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIpKSAqIDkgLyA1KSArIDMyOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgcGNpcGN3ZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJZXhwZWN0X3JlbGVhc2UgPSAwOworCisJCQkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZihnZXRfdXNlcihjLCBkYXRhK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9yZWxlYXNlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVsb2FkIHRoZSB0aW1lciAqLworCQlwY2lwY3dkX2tlZXBhbGl2ZSgpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHBjaXBjd2RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPQkJV0RJT0ZfT1ZFUkhFQVQgfAorCQkJCQlXRElPRl9DQVJEUkVTRVQgfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKKwkJLmlkZW50aXR5ID0JCVdBVENIRE9HX0RSSVZFUl9OQU1FLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwKKwkJCQlzaXplb2YgKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJeworCQkJaW50IHN0YXR1czsKKworCQkJcGNpcGN3ZF9nZXRfc3RhdHVzKCZzdGF0dXMpOworCisJCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCBwKTsKKwkJfQorCisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcihwY2lwY3dkX3ByaXZhdGUuYm9vdF9zdGF0dXMsIHApOworCisJCWNhc2UgV0RJT0NfR0VUVEVNUDoKKwkJeworCQkJaW50IHRlbXBlcmF0dXJlOworCisJCQlpZiAocGNpcGN3ZF9nZXRfdGVtcGVyYXR1cmUoJnRlbXBlcmF0dXJlKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIHB1dF91c2VyKHRlbXBlcmF0dXJlLCBwKTsKKwkJfQorCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJcGNpcGN3ZF9rZWVwYWxpdmUoKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG5ld19vcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCQlpZiAoZ2V0X3VzZXIgKG5ld19vcHRpb25zLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQlwY2lwY3dkX3N0b3AoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJcGNpcGN3ZF9zdGFydCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX1RFTVBQQU5JQykgeworCQkJCXRlbXBfcGFuaWMgPSAxOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXsKKwkJCWludCBuZXdfaGVhcnRiZWF0OworCisJCQlpZiAoZ2V0X3VzZXIobmV3X2hlYXJ0YmVhdCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwY2lwY3dkX3NldF9oZWFydGJlYXQobmV3X2hlYXJ0YmVhdCkpCisJCQkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkJCXBjaXBjd2Rfa2VlcGFsaXZlKCk7CisJCQkvKiBGYWxsICovCisJCX0KKworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBwKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmaXNfYWN0aXZlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEFjdGl2YXRlICovCisJcGNpcGN3ZF9zdGFydCgpOworCXBjaXBjd2Rfa2VlcGFsaXZlKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHBjaXBjd2RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqICAgICAgU2h1dCBvZmYgdGhlIHRpbWVyLgorCSAqLworCWlmIChleHBlY3RfcmVsZWFzZSA9PSA0MikgeworCQlwY2lwY3dkX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXBjaXBjd2Rfa2VlcGFsaXZlKCk7CisJfQorCWV4cGVjdF9yZWxlYXNlID0gMDsKKwljbGVhcl9iaXQoMCwgJmlzX2FjdGl2ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3RlbXBlcmF0dXJlIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgcGNpcGN3ZF90ZW1wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAorCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgdGVtcGVyYXR1cmU7CisKKwlpZiAocGNpcGN3ZF9nZXRfdGVtcGVyYXR1cmUoJnRlbXBlcmF0dXJlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyIChkYXRhLCAmdGVtcGVyYXR1cmUsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBjaXBjd2RfdGVtcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghcGNpcGN3ZF9wcml2YXRlLnN1cHBvcnRzX3RlbXApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHBjaXBjd2RfdGVtcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZ5IHN5c3RlbQorICovCisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJcGNpcGN3ZF9zdG9wKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY2lwY3dkX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CW5vX2xsc2VlaywKKwkud3JpdGUgPQlwY2lwY3dkX3dyaXRlLAorCS5pb2N0bCA9CXBjaXBjd2RfaW9jdGwsCisJLm9wZW4gPQkJcGNpcGN3ZF9vcGVuLAorCS5yZWxlYXNlID0JcGNpcGN3ZF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHBjaXBjd2RfbWlzY2RldiA9IHsKKwkubWlub3IgPQlXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9CQkid2F0Y2hkb2ciLAorCS5mb3BzID0JCSZwY2lwY3dkX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY2lwY3dkX3RlbXBfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS5yZWFkID0JCXBjaXBjd2RfdGVtcF9yZWFkLAorCS5vcGVuID0JCXBjaXBjd2RfdGVtcF9vcGVuLAorCS5yZWxlYXNlID0JcGNpcGN3ZF90ZW1wX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcGNpcGN3ZF90ZW1wX21pc2NkZXYgPSB7CisJLm1pbm9yID0JVEVNUF9NSU5PUiwKKwkubmFtZSA9CQkidGVtcGVyYXR1cmUiLAorCS5mb3BzID0JCSZwY2lwY3dkX3RlbXBfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGNpcGN3ZF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9CXBjaXBjd2Rfbm90aWZ5X3N5cywKK307CisKKy8qCisgKglJbml0ICYgZXhpdCByb3V0aW5lcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja190ZW1wZXJhdHVyZV9zdXBwb3J0KHZvaWQpCit7CisJaWYgKGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyKSAhPSAweEYwKQorCQlwY2lwY3dkX3ByaXZhdGUuc3VwcG9ydHNfdGVtcCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaXBjd2RfY2FyZF9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCByZXQgPSAtRUlPOworCWludCBnb3RfZndfcmV2LCBmd19yZXZfbWFqb3IsIGZ3X3Jldl9taW5vcjsKKwljaGFyIGZ3X3Zlcl9zdHJbMjBdOworCWNoYXIgb3B0aW9uX3N3aXRjaGVzOworCisJY2FyZHNfZm91bmQrKzsKKwlpZiAoY2FyZHNfZm91bmQgPT0gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggRFJJVkVSX1ZFUlNJT04pOworCisJaWYgKGNhcmRzX2ZvdW5kID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIDEgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBwb3NzaWJsZSB0byBlbmFibGUgUENJIERldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkgPT0gMHgwMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIEkvTy1BZGRyZXNzIGZvciBjYXJkIGRldGVjdGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCXBjaXBjd2RfcHJpdmF0ZS5wZGV2ID0gcGRldjsKKwlwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFdBVENIRE9HX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCShpbnQpIHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIGdldCB0aGUgYm9vdF9zdGF0dXMgKi8KKwlwY2lwY3dkX2dldF9zdGF0dXMoJnBjaXBjd2RfcHJpdmF0ZS5ib290X3N0YXR1cyk7CisKKwkvKiBjbGVhciB0aGUgImNhcmQgY2F1c2VkIHJlYm9vdCIgZmxhZyAqLworCXBjaXBjd2RfY2xlYXJfc3RhdHVzKCk7CisKKwkvKiBkaXNhYmxlIGNhcmQgKi8KKwlwY2lwY3dkX3N0b3AoKTsKKworCS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBjYXJkIHN1cHBvcnRzIHRoZSB0ZW1wZXJhdHVyZSBkZXZpY2UgKi8KKwljaGVja190ZW1wZXJhdHVyZV9zdXBwb3J0KCk7CisKKwkvKiBHZXQgdGhlIEZpcm13YXJlIFZlcnNpb24gKi8KKwlnb3RfZndfcmV2ID0gc2VuZF9jb21tYW5kKENNRF9HRVRfRklSTVdBUkVfVkVSU0lPTiwgJmZ3X3Jldl9tYWpvciwgJmZ3X3Jldl9taW5vcik7CisJaWYgKGdvdF9md19yZXYpIHsKKwkJc3ByaW50Zihmd192ZXJfc3RyLCAiJXUuJTAydSIsIGZ3X3Jldl9tYWpvciwgZndfcmV2X21pbm9yKTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGZ3X3Zlcl9zdHIsICI8Y2FyZCBubyBhbnN3ZXI+Iik7CisJfQorCisJLyogR2V0IHN3aXRjaCBzZXR0aW5ncyAqLworCW9wdGlvbl9zd2l0Y2hlcyA9IGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgMyk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiRm91bmQgY2FyZCBhdCBwb3J0IDB4JTA0eCAoRmlybXdhcmU6ICVzKSAlcyB0ZW1wIG9wdGlvblxuIiwKKwkJKGludCkgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIsIGZ3X3Zlcl9zdHIsCisJCShwY2lwY3dkX3ByaXZhdGUuc3VwcG9ydHNfdGVtcCA/ICJ3aXRoIiA6ICJ3aXRob3V0IikpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk9wdGlvbiBzd2l0Y2hlcyAoMHglMDJ4KTogVGVtcGVyYXR1cmUgUmVzZXQgRW5hYmxlPSVzLCBQb3dlciBPbiBEZWxheT0lc1xuIiwKKwkJb3B0aW9uX3N3aXRjaGVzLAorCQkoKG9wdGlvbl9zd2l0Y2hlcyAmIDB4MTApID8gIk9OIiA6ICJPRkYiKSwKKwkJKChvcHRpb25fc3dpdGNoZXMgJiAweDA4KSA/ICJPTiIgOiAiT0ZGIikpOworCisJaWYgKHBjaXBjd2RfcHJpdmF0ZS5ib290X3N0YXR1cyAmIFdESU9GX0NBUkRSRVNFVCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlByZXZpb3VzIHJlc2V0IHdhcyBjYXVzZWQgYnkgdGhlIFdhdGNoZG9nIGNhcmRcbiIpOworCisJaWYgKHBjaXBjd2RfcHJpdmF0ZS5ib290X3N0YXR1cyAmIFdESU9GX09WRVJIRUFUKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ2FyZCBzZW5zZWQgYSBDUFUgT3ZlcmhlYXRcbiIpOworCisJaWYgKHBjaXBjd2RfcHJpdmF0ZS5ib290X3N0YXR1cyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gcHJldmlvdXMgdHJpcCBkZXRlY3RlZCAtIENvbGQgYm9vdCBvciByZXNldFxuIik7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAocGNpcGN3ZF9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkpIHsKKwkJcGNpcGN3ZF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX0hFQVJUQkVBVCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJoZWFydGJlYXQgdmFsdWUgbXVzdCBiZSAwPGhlYXJ0YmVhdDw2NTUzNiwgdXNpbmcgJWRcbiIsCisJCQlXQVRDSERPR19IRUFSVEJFQVQpOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGNpcGN3ZF9ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJaWYgKHBjaXBjd2RfcHJpdmF0ZS5zdXBwb3J0c190ZW1wKSB7CisJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnBjaXBjd2RfdGVtcF9taXNjZGV2KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCQlURU1QX01JTk9SLCByZXQpOworCQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfcmVib290OworCQl9CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmcGNpcGN3ZF9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byBlcnJfb3V0X21pc2NfZGVyZWdpc3RlcjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIGhlYXJ0YmVhdD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJaGVhcnRiZWF0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9taXNjX2RlcmVnaXN0ZXI6CisJaWYgKHBjaXBjd2RfcHJpdmF0ZS5zdXBwb3J0c190ZW1wKQorCQltaXNjX2RlcmVnaXN0ZXIoJnBjaXBjd2RfdGVtcF9taXNjZGV2KTsKK2Vycl9vdXRfdW5yZWdpc3Rlcl9yZWJvb3Q6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjaXBjd2Rfbm90aWZpZXIpOworZXJyX291dF9yZWxlYXNlX3JlZ2lvbjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHBjaXBjd2RfY2FyZF9leGl0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCS8qIFN0b3AgdGhlIHRpbWVyIGJlZm9yZSB3ZSBsZWF2ZSAqLworCWlmICghbm93YXlvdXQpCisJCXBjaXBjd2Rfc3RvcCgpOworCisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3RlcigmcGNpcGN3ZF9taXNjZGV2KTsKKwlpZiAocGNpcGN3ZF9wcml2YXRlLnN1cHBvcnRzX3RlbXApCisJCW1pc2NfZGVyZWdpc3RlcigmcGNpcGN3ZF90ZW1wX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwY2lwY3dkX25vdGlmaWVyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwljYXJkc19mb3VuZC0tOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpcGN3ZF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1FVSUNLTE9HSUMsIFBDSV9ERVZJQ0VfSURfV0FUQ0hET0dfUENJUENXRCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAgfSwJCQkvKiBFbmQgb2YgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lwY3dkX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpcGN3ZF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gV0FUQ0hET0dfTkFNRSwKKwkuaWRfdGFibGUJPSBwY2lwY3dkX3BjaV90YmwsCisJLnByb2JlCQk9IHBjaXBjd2RfY2FyZF9pbml0LAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGNpcGN3ZF9jYXJkX2V4aXQpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNpcGN3ZF9pbml0X21vZHVsZSh2b2lkKQoreworCXNwaW5fbG9ja19pbml0ICgmcGNpcGN3ZF9wcml2YXRlLmlvX2xvY2spOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaXBjd2RfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBjaXBjd2RfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaXBjd2RfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGNpcGN3ZF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwY2lwY3dkX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmVya3NoaXJlIFBDSS1QQyBXYXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFRFTVBfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfdXNiLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI3MjAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfdXNiLmMKQEAgLTAsMCArMSw3OTYgQEAKKy8qCisgKglCZXJrc2hpcmUgVVNCLVBDIFdhdGNoZG9nIENhcmQgRHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA0IFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgorICoKKyAqCUJhc2VkIG9uIHNvdXJjZSBjb2RlIG9mIHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKyAqCSAgS2VuIEhvbGxpcyA8a2VuamlAYml0Z2F0ZS5jb20+LAorICoJICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwKKyAqCSAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiwKKyAqCSAgUm9iIFJhZGV6IDxyb2JAb3NpbnZlc3Rvci5jb20+LAorICoJICBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBXaW0gVmFuIFNlYnJvZWNrIG5vciBJZ3VhbmEgdnp3LiBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKglwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICoJcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCVRoYW5rcyBhbHNvIHRvIFNpbW9uIE1hY2hlbGwgYXQgQmVya3NoaXJlIFByb2R1Y3RzIEluYy4gZm9yCisgKglwcm92aWRpbmcgdGhlIHRlc3QgaGFyZHdhcmUuIE1vcmUgaW5mbyBpcyBhdmFpbGFibGUgYXQKKyAqCWh0dHA6Ly93d3cuYmVya3Byb2QuY29tLyBvciBodHRwOi8vd3d3LnBjd2F0Y2hkb2cuY29tLworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKKwlzdGF0aWMgaW50IGRlYnVnID0gMTsKKyNlbHNlCisJc3RhdGljIGludCBkZWJ1ZzsKKyNlbmRpZgorCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyN1bmRlZiBkYmcKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgcHJpbnRrKEtFUk5fREVCVUcgUEZYIGZvcm1hdCAiXG4iICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKworCisvKiBNb2R1bGUgYW5kIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEuMDEiCisjZGVmaW5lIERSSVZFUl9EQVRFICIxNSBNYXIgMjAwNSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJCZXJrc2hpcmUgVVNCLVBDIFdhdGNoZG9nIGRyaXZlciIKKyNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKKyNkZWZpbmUgRFJJVkVSX05BTUUgInBjd2RfdXNiIgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFRFTVBfTUlOT1IpOworCisvKiBNb2R1bGUgUGFyYW1ldGVycyAqLworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKyNkZWZpbmUgV0FUQ0hET0dfSEVBUlRCRUFUIDIJLyogMiBzZWMgZGVmYXVsdCBoZWFydGJlYXQgKi8KK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgwPGhlYXJ0YmVhdDw2NTUzNiwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19IRUFSVEJFQVQpICIpIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKiBUaGUgdmVuZG9yIGFuZCBwcm9kdWN0IGlkJ3MgZm9yIHRoZSBVU0ItUEMgV2F0Y2hkb2cgY2FyZCAqLworI2RlZmluZSBVU0JfUENXRF9WRU5ET1JfSUQJMHgwYzk4CisjZGVmaW5lIFVTQl9QQ1dEX1BST0RVQ1RfSUQJMHgxMTQwCisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfcGN3ZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1BDV0RfVkVORE9SX0lELCBVU0JfUENXRF9QUk9EVUNUX0lEKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHVzYl9wY3dkX3RhYmxlKTsKKworLyogYWNjb3JkaW5nIHRvIGRvY3VtZW50YXRpb24gbWF4LiB0aW1lIHRvIHByb2Nlc3MgYSBjb21tYW5kIGZvciB0aGUgVVNCCisgKiB3YXRjaGRvZyBjYXJkIGlzIDEwMCBvciAyMDAgbXMsIHNvIHdlIGdpdmUgaXQgMjUwIG1zIHRvIGRvIGl0J3Mgam9iICovCisjZGVmaW5lIFVTQl9DT01NQU5EX1RJTUVPVVQJMjUwCisKKy8qIFdhdGNoZG9nJ3MgaW50ZXJuYWwgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ01EX1JFQURfVEVNUAkJCTB4MDIJLyogUmVhZCBUZW1wZXJhdHVyZTsgUmUtdHJpZ2dlciBXYXRjaGRvZyAqLworI2RlZmluZSBDTURfVFJJR0dFUgkJCUNNRF9SRUFEX1RFTVAKKyNkZWZpbmUgQ01EX0dFVF9TVEFUVVMJCQkweDA0CS8qIEdldCBTdGF0dXMgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQ01EX0dFVF9GSVJNV0FSRV9WRVJTSU9OCTB4MDgJLyogR2V0IEZpcm13YXJlIFZlcnNpb24gKi8KKyNkZWZpbmUgQ01EX0dFVF9ESVBfU1dJVENIX1NFVFRJTkdTCTB4MGMJLyogR2V0IERpcCBTd2l0Y2ggU2V0dGluZ3MgKi8KKyNkZWZpbmUgQ01EX1JFQURfV0FUQ0hET0dfVElNRU9VVAkweDE4CS8qIFJlYWQgQ3VycmVudCBXYXRjaGRvZyBUaW1lICovCisjZGVmaW5lIENNRF9XUklURV9XQVRDSERPR19USU1FT1VUCTB4MTkJLyogV3JpdGUgQ3VycmVudCBXYXRjaGRvZyBUaW1lICovCisjZGVmaW5lIENNRF9FTkFCTEVfV0FUQ0hET0cJCTB4MzAJLyogRW5hYmxlIC8gRGlzYWJsZSBXYXRjaGRvZyAqLworI2RlZmluZSBDTURfRElTQUJMRV9XQVRDSERPRwkJQ01EX0VOQUJMRV9XQVRDSERPRworCisvKiBTb21lIGRlZmluZXMgdGhhdCBJIGxpa2UgdG8gYmUgc29tZXdoZXJlIGVsc2UgbGlrZSBpbmNsdWRlL2xpbnV4L3VzYl9oaWQuaCAqLworI2RlZmluZSBISURfUkVRX1NFVF9SRVBPUlQJCTB4MDkKKyNkZWZpbmUgSElEX0RUX1JFUE9SVAkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDIpCisKKy8qIFdlIGNhbiBvbmx5IHVzZSAxIGNhcmQgZHVlIHRvIHRoZSAvZGV2L3dhdGNoZG9nIHJlc3RyaWN0aW9uICovCitzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworCisvKiBzb21lIGludGVybmFsIHZhcmlhYmxlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNfYWN0aXZlOworc3RhdGljIGNoYXIgZXhwZWN0X3JlbGVhc2U7CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCitzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSB7CisJc3RydWN0IHVzYl9kZXZpY2UgKgl1ZGV2OwkJCS8qIHNhdmUgb2ZmIHRoZSB1c2IgZGV2aWNlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqCWludGVyZmFjZTsJCS8qIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgZGV2aWNlICovCisKKwl1bnNpZ25lZCBpbnQJCWludGVyZmFjZV9udW1iZXI7CS8qIHRoZSBpbnRlcmZhY2UgbnVtYmVyIHVzZWQgZm9yIGNtZCdzICovCisKKwl1bnNpZ25lZCBjaGFyICoJCWludHJfYnVmZmVyOwkJLyogdGhlIGJ1ZmZlciB0byBpbnRyIGRhdGEgKi8KKwlkbWFfYWRkcl90CQlpbnRyX2RtYTsJCS8qIHRoZSBkbWEgYWRkcmVzcyBmb3IgdGhlIGludHIgYnVmZmVyICovCisJc2l6ZV90CQkJaW50cl9zaXplOwkJLyogdGhlIHNpemUgb2YgdGhlIGludHIgYnVmZmVyICovCisJc3RydWN0IHVyYiAqCQlpbnRyX3VyYjsJCS8qIHRoZSB1cmIgdXNlZCBmb3IgdGhlIGludHIgcGlwZSAqLworCisJdW5zaWduZWQgY2hhcgkJY21kX2NvbW1hbmQ7CQkvKiBUaGUgY29tbWFuZCB0aGF0IGlzIHJlcG9ydGVkIGJhY2sgKi8KKwl1bnNpZ25lZCBjaGFyCQljbWRfZGF0YV9tc2I7CQkvKiBUaGUgZGF0YSBNU0IgdGhhdCBpcyByZXBvcnRlZCBiYWNrICovCisJdW5zaWduZWQgY2hhcgkJY21kX2RhdGFfbHNiOwkJLyogVGhlIGRhdGEgTFNCIHRoYXQgaXMgcmVwb3J0ZWQgYmFjayAqLworCWF0b21pY190CQljbWRfcmVjZWl2ZWQ7CQkvKiB0cnVlIGlmIHdlIHJlY2VpdmVkIGEgcmVwb3J0IGFmdGVyIGEgY29tbWFuZCAqLworCisJaW50CQkJZXhpc3RzOwkJCS8qIFdldGhlciBvciBub3QgdGhlIGRldmljZSBleGlzdHMgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJCQkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2RfZGV2aWNlOworCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYIChkaXNjb25uZWN0X3NlbSk7CisKKy8qIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgdXNiX3Bjd2RfcHJvYmUJKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCB1c2JfcGN3ZF9kaXNjb25uZWN0CShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl9wY3dkX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQlEUklWRVJfTkFNRSwKKwkucHJvYmUgPQl1c2JfcGN3ZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9wY3dkX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JdXNiX3Bjd2RfdGFibGUsCit9OworCisKK3N0YXRpYyB2b2lkIHVzYl9wY3dkX2ludHJfZG9uZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICp1c2JfcGN3ZCA9IChzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqKXVyYi0+Y29udGV4dDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXNiX3Bjd2QtPmludHJfYnVmZmVyOworCWludCByZXR2YWw7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJLyogLUVQSVBFOiAgc2hvdWxkIGNsZWFyIHRoZSBoYWx0ICovCisJZGVmYXVsdDoJCS8qIGVycm9yICovCisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWdvdG8gcmVzdWJtaXQ7CisJfQorCisJZGJnKCJyZWNlaXZlZCBmb2xsb3dpbmcgZGF0YSBjbWQ9MHglMDJ4IG1zYj0weCUwMnggbHNiPTB4JTAyeCIsCisJCWRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0pOworCisJdXNiX3Bjd2QtPmNtZF9jb21tYW5kICA9IGRhdGFbMF07CisJdXNiX3Bjd2QtPmNtZF9kYXRhX21zYiA9IGRhdGFbMV07CisJdXNiX3Bjd2QtPmNtZF9kYXRhX2xzYiA9IGRhdGFbMl07CisKKwkvKiBub3RpZnkgYW55b25lIHdhaXRpbmcgdGhhdCB0aGUgY21kIGhhcyBmaW5pc2hlZCAqLworCWF0b21pY19zZXQgKCZ1c2JfcGN3ZC0+Y21kX3JlY2VpdmVkLCAxKTsKKworcmVzdWJtaXQ6CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FuJ3QgcmVzdWJtaXQgaW50ciwgdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkXG4iLAorCQkJcmV0dmFsKTsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9zZW5kX2NvbW1hbmQoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkLCB1bnNpZ25lZCBjaGFyIGNtZCwKKwl1bnNpZ25lZCBjaGFyICptc2IsIHVuc2lnbmVkIGNoYXIgKmxzYikKK3sKKwlpbnQgZ290X3Jlc3BvbnNlLCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCS8qIFdlIHdpbGwgbm90IHNlbmQgYW55IGNvbW1hbmRzIGlmIHRoZSBVU0IgUENXRCBkZXZpY2UgZG9lcyBub3QgZXhpc3QgKi8KKwlpZiAoKCF1c2JfcGN3ZCkgfHwgKCF1c2JfcGN3ZC0+ZXhpc3RzKSkKKwkJcmV0dXJuIC0xOworCisJLyogVGhlIFVTQiBQQyBXYXRjaGRvZyB1c2VzIGEgNiBieXRlIHJlcG9ydCBmb3JtYXQuIFRoZSBib2FyZCBjdXJyZW50bHkgdXNlcworCSAqIG9ubHkgMyBvZiB0aGUgc2l4IGJ5dGVzIG9mIHRoZSByZXBvcnQuICovCisJYnVmWzBdID0gY21kOwkJCS8qIEJ5dGUgMCA9IENNRCAqLworCWJ1ZlsxXSA9ICptc2I7CQkJLyogQnl0ZSAxID0gRGF0YSBNU0IgKi8KKwlidWZbMl0gPSAqbHNiOwkJCS8qIEJ5dGUgMiA9IERhdGEgTFNCICovCisJYnVmWzNdID0gYnVmWzRdID0gYnVmWzVdID0gMDsJLyogQWxsIG90aGVyIGJ5dGVzIG5vdCB1c2VkICovCisKKwlkYmcoInNlbmRpbmcgZm9sbG93aW5nIGRhdGEgY21kPTB4JTAyeCBtc2I9MHglMDJ4IGxzYj0weCUwMngiLAorCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdKTsKKworCWF0b21pY19zZXQgKCZ1c2JfcGN3ZC0+Y21kX3JlY2VpdmVkLCAwKTsKKworCWlmICh1c2JfY29udHJvbF9tc2codXNiX3Bjd2QtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfcGN3ZC0+dWRldiwgMCksCisJCQlISURfUkVRX1NFVF9SRVBPUlQsIEhJRF9EVF9SRVBPUlQsCisJCQkweDAyMDAsIHVzYl9wY3dkLT5pbnRlcmZhY2VfbnVtYmVyLCBidWYsIHNpemVvZihidWYpLAorCQkJVVNCX0NPTU1BTkRfVElNRU9VVCkgIT0gc2l6ZW9mKGJ1ZikpIHsKKwkJZGJnKCJ1c2JfcGN3ZF9zZW5kX2NvbW1hbmQ6IGVycm9yIGluIHVzYl9jb250cm9sX21zZyBmb3IgY21kIDB4JXggMHgleCAweCV4XG4iLCBjbWQsICptc2IsICpsc2IpOworCX0KKwkvKiB3YWl0IHRpbGwgdGhlIHVzYiBjYXJkIHByb2Nlc3NlZCB0aGUgY29tbWFuZCwKKwkgKiB3aXRoIGEgbWF4LiB0aW1lb3V0IG9mIFVTQl9DT01NQU5EX1RJTUVPVVQgKi8KKwlnb3RfcmVzcG9uc2UgPSAwOworCWZvciAoY291bnQgPSAwOyAoY291bnQgPCBVU0JfQ09NTUFORF9USU1FT1VUKSAmJiAoIWdvdF9yZXNwb25zZSk7IGNvdW50KyspIHsKKwkJbWRlbGF5KDEpOworCQlpZiAoYXRvbWljX3JlYWQgKCZ1c2JfcGN3ZC0+Y21kX3JlY2VpdmVkKSkKKwkJCWdvdF9yZXNwb25zZSA9IDE7CisJfQorCisJaWYgKChnb3RfcmVzcG9uc2UpICYmIChjbWQgPT0gdXNiX3Bjd2QtPmNtZF9jb21tYW5kKSkgeworCQkvKiByZWFkIGJhY2sgcmVzcG9uc2UgKi8KKwkJKm1zYiA9IHVzYl9wY3dkLT5jbWRfZGF0YV9tc2I7CisJCSpsc2IgPSB1c2JfcGN3ZC0+Y21kX2RhdGFfbHNiOworCX0KKworCXJldHVybiBnb3RfcmVzcG9uc2U7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Bjd2Rfc3RhcnQoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkKQoreworCXVuc2lnbmVkIGNoYXIgbXNiID0gMHgwMDsKKwl1bnNpZ25lZCBjaGFyIGxzYiA9IDB4MDA7CisJaW50IHJldHZhbDsKKworCS8qIEVuYWJsZSBXYXRjaGRvZyAqLworCXJldHZhbCA9IHVzYl9wY3dkX3NlbmRfY29tbWFuZCh1c2JfcGN3ZCwgQ01EX0VOQUJMRV9XQVRDSERPRywgJm1zYiwgJmxzYik7CisKKwlpZiAoKHJldHZhbCA9PSAwKSB8fCAobHNiID09IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhcmQgZGlkIG5vdCBhY2tub3dsZWRnZSBlbmFibGUgYXR0ZW1wdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9zdG9wKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICp1c2JfcGN3ZCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1zYiA9IDB4QTU7CisJdW5zaWduZWQgY2hhciBsc2IgPSAweEMzOworCWludCByZXR2YWw7CisKKwkvKiBEaXNhYmxlIFdhdGNoZG9nICovCisJcmV0dmFsID0gdXNiX3Bjd2Rfc2VuZF9jb21tYW5kKHVzYl9wY3dkLCBDTURfRElTQUJMRV9XQVRDSERPRywgJm1zYiwgJmxzYik7CisKKwlpZiAoKHJldHZhbCA9PSAwKSB8fCAobHNiICE9IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhcmQgZGlkIG5vdCBhY2tub3dsZWRnZSBkaXNhYmxlIGF0dGVtcHRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Bjd2Rfa2VlcGFsaXZlKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICp1c2JfcGN3ZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGR1bW15OworCisJLyogUmUtdHJpZ2dlciBXYXRjaGRvZyAqLworCXVzYl9wY3dkX3NlbmRfY29tbWFuZCh1c2JfcGN3ZCwgQ01EX1RSSUdHRVIsICZkdW1teSwgJmR1bW15KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX3NldF9oZWFydGJlYXQoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkLCBpbnQgdCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1zYiA9IHQgLyAyNTY7CisJdW5zaWduZWQgY2hhciBsc2IgPSB0ICUgMjU2OworCisJaWYgKCh0IDwgMHgwMDAxKSB8fCAodCA+IDB4RkZGRikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV3JpdGUgbmV3IGhlYXJ0YmVhdCB0byB3YXRjaGRvZyAqLworCXVzYl9wY3dkX3NlbmRfY29tbWFuZCh1c2JfcGN3ZCwgQ01EX1dSSVRFX1dBVENIRE9HX1RJTUVPVVQsICZtc2IsICZsc2IpOworCisJaGVhcnRiZWF0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkLCBpbnQgKnRlbXBlcmF0dXJlKQoreworCXVuc2lnbmVkIGNoYXIgbXNiLCBsc2I7CisKKwl1c2JfcGN3ZF9zZW5kX2NvbW1hbmQodXNiX3Bjd2QsIENNRF9SRUFEX1RFTVAsICZtc2IsICZsc2IpOworCisJLyoKKwkgKiBDb252ZXJ0IGNlbHNpdXMgdG8gZmFocmVuaGVpdCwgc2luY2UgdGhpcyB3YXMKKwkgKiB0aGUgZGVjaWRlZCAnc3RhbmRhcmQnIGZvciB0aGlzIHJldHVybiB2YWx1ZS4KKwkgKi8KKwkqdGVtcGVyYXR1cmUgPSAobHNiICogOSAvIDUpICsgMzI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCB1c2JfcGN3ZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJZXhwZWN0X3JlbGVhc2UgPSAwOworCisJCQkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZihnZXRfdXNlcihjLCBkYXRhK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9yZWxlYXNlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVsb2FkIHRoZSB0aW1lciAqLworCQl1c2JfcGN3ZF9rZWVwYWxpdmUodXNiX3Bjd2RfZGV2aWNlKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9CQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKKwkJLmlkZW50aXR5ID0JCURSSVZFUl9OQU1FLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwKKwkJCQlzaXplb2YgKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJCWNhc2UgV0RJT0NfR0VUVEVNUDoKKwkJeworCQkJaW50IHRlbXBlcmF0dXJlOworCisJCQlpZiAodXNiX3Bjd2RfZ2V0X3RlbXBlcmF0dXJlKHVzYl9wY3dkX2RldmljZSwgJnRlbXBlcmF0dXJlKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIHB1dF91c2VyKHRlbXBlcmF0dXJlLCBwKTsKKwkJfQorCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJdXNiX3Bjd2Rfa2VlcGFsaXZlKHVzYl9wY3dkX2RldmljZSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYgKGdldF91c2VyIChuZXdfb3B0aW9ucywgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJdXNiX3Bjd2Rfc3RvcCh1c2JfcGN3ZF9kZXZpY2UpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQl1c2JfcGN3ZF9zdGFydCh1c2JfcGN3ZF9kZXZpY2UpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXsKKwkJCWludCBuZXdfaGVhcnRiZWF0OworCisJCQlpZiAoZ2V0X3VzZXIobmV3X2hlYXJ0YmVhdCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICh1c2JfcGN3ZF9zZXRfaGVhcnRiZWF0KHVzYl9wY3dkX2RldmljZSwgbmV3X2hlYXJ0YmVhdCkpCisJCQkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkJCXVzYl9wY3dkX2tlZXBhbGl2ZSh1c2JfcGN3ZF9kZXZpY2UpOworCQkJLyogRmFsbCAqLworCQl9CisKKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKGhlYXJ0YmVhdCwgcCk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogL2Rldi93YXRjaGRvZyBjYW4gb25seSBiZSBvcGVuZWQgb25jZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZpc19hY3RpdmUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQWN0aXZhdGUgKi8KKwl1c2JfcGN3ZF9zdGFydCh1c2JfcGN3ZF9kZXZpY2UpOworCXVzYl9wY3dkX2tlZXBhbGl2ZSh1c2JfcGN3ZF9kZXZpY2UpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogICAgICBTaHV0IG9mZiB0aGUgdGltZXIuCisJICovCisJaWYgKGV4cGVjdF9yZWxlYXNlID09IDQyKSB7CisJCXVzYl9wY3dkX3N0b3AodXNiX3Bjd2RfZGV2aWNlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXVzYl9wY3dkX2tlZXBhbGl2ZSh1c2JfcGN3ZF9kZXZpY2UpOworCX0KKwlleHBlY3RfcmVsZWFzZSA9IDA7CisJY2xlYXJfYml0KDAsICZpc19hY3RpdmUpOworCXJldHVybiAwOworfQorCisvKgorICoJL2Rldi90ZW1wZXJhdHVyZSBoYW5kbGluZworICovCisKK3N0YXRpYyBzc2l6ZV90IHVzYl9wY3dkX3RlbXBlcmF0dXJlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAorCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgdGVtcGVyYXR1cmU7CisKKwlpZiAodXNiX3Bjd2RfZ2V0X3RlbXBlcmF0dXJlKHVzYl9wY3dkX2RldmljZSwgJnRlbXBlcmF0dXJlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKGRhdGEsICZ0ZW1wZXJhdHVyZSwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Bjd2RfdGVtcGVyYXR1cmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Bjd2RfdGVtcGVyYXR1cmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmeSBzeXN0ZW0KKyAqLworCitzdGF0aWMgaW50IHVzYl9wY3dkX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQl1c2JfcGN3ZF9zdG9wKHVzYl9wY3dkX2RldmljZSk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfcGN3ZF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLndyaXRlID0JdXNiX3Bjd2Rfd3JpdGUsCisJLmlvY3RsID0JdXNiX3Bjd2RfaW9jdGwsCisJLm9wZW4gPQkJdXNiX3Bjd2Rfb3BlbiwKKwkucmVsZWFzZSA9CXVzYl9wY3dkX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdXNiX3Bjd2RfbWlzY2RldiA9IHsKKwkubWlub3IgPQlXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9CQkid2F0Y2hkb2ciLAorCS5mb3BzID0JCSZ1c2JfcGN3ZF9mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX3Bjd2RfdGVtcGVyYXR1cmVfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS5yZWFkID0JCXVzYl9wY3dkX3RlbXBlcmF0dXJlX3JlYWQsCisJLm9wZW4gPQkJdXNiX3Bjd2RfdGVtcGVyYXR1cmVfb3BlbiwKKwkucmVsZWFzZSA9CXVzYl9wY3dkX3RlbXBlcmF0dXJlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdXNiX3Bjd2RfdGVtcGVyYXR1cmVfbWlzY2RldiA9IHsKKwkubWlub3IgPQlURU1QX01JTk9SLAorCS5uYW1lID0JCSJ0ZW1wZXJhdHVyZSIsCisJLmZvcHMgPQkJJnVzYl9wY3dkX3RlbXBlcmF0dXJlX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHVzYl9wY3dkX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0JdXNiX3Bjd2Rfbm90aWZ5X3N5cywKK307CisKKy8qKgorICoJdXNiX3Bjd2RfZGVsZXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfcGN3ZF9kZWxldGUgKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICp1c2JfcGN3ZCkKK3sKKwlpZiAodXNiX3Bjd2QtPmludHJfdXJiICE9IE5VTEwpCisJCXVzYl9mcmVlX3VyYiAodXNiX3Bjd2QtPmludHJfdXJiKTsKKwlpZiAodXNiX3Bjd2QtPmludHJfYnVmZmVyICE9IE5VTEwpCisJCXVzYl9idWZmZXJfZnJlZSh1c2JfcGN3ZC0+dWRldiwgdXNiX3Bjd2QtPmludHJfc2l6ZSwKKwkJCQl1c2JfcGN3ZC0+aW50cl9idWZmZXIsIHVzYl9wY3dkLT5pbnRyX2RtYSk7CisJa2ZyZWUgKHVzYl9wY3dkKTsKK30KKworLyoqCisgKgl1c2JfcGN3ZF9wcm9iZQorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50IHVzYl9wY3dkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkID0gTlVMTDsKKwlpbnQgcGlwZSwgbWF4cDsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwlpbnQgZ290X2Z3X3JldjsKKwl1bnNpZ25lZCBjaGFyIGZ3X3Jldl9tYWpvciwgZndfcmV2X21pbm9yOworCWNoYXIgZndfdmVyX3N0clsyMF07CisJdW5zaWduZWQgY2hhciBvcHRpb25fc3dpdGNoZXMsIGR1bW15OworCisJY2FyZHNfZm91bmQrKzsKKwlpZiAoY2FyZHNfZm91bmQgPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgMSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBnZXQgdGhlIGFjdGl2ZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJLyogY2hlY2sgb3V0IHRoYXQgd2UgaGF2ZSBhIEhJRCBkZXZpY2UgKi8KKwlpZiAoIShpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfSElEKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJUaGUgZGV2aWNlIGlzbid0IGEgSHVtYW4gSW50ZXJmYWNlIERldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGNoZWNrIG91dCB0aGUgZW5kcG9pbnQ6IGl0IGhhcyB0byBiZSBJbnRlcnJ1cHQgJiBJTiAqLworCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50WzBdLmRlc2M7CisKKwlpZiAoISgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAmJgorCSAgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCisJCQkJPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkpIHsKKwkJLyogd2UgZGlkbid0IGZpbmQgYSBJbnRlcnJ1cHQgZW5kcG9pbnQgd2l0aCBkaXJlY3Rpb24gSU4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGRuJ3QgZmluZCBhbiBJTlRSICYgSU4gZW5kcG9pbnRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBnZXQgYSBoYW5kbGUgdG8gdGhlIGludGVycnVwdCBkYXRhIHBpcGUgKi8KKwlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworCXVzYl9wY3dkID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVzYl9wY3dkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbXNldCAodXNiX3Bjd2QsIDB4MDAsIHNpemVvZiAoKnVzYl9wY3dkKSk7CisKKwl1c2JfcGN3ZF9kZXZpY2UgPSB1c2JfcGN3ZDsKKworCWluaXRfTVVURVggKCZ1c2JfcGN3ZC0+c2VtKTsKKwl1c2JfcGN3ZC0+dWRldiA9IHVkZXY7CisJdXNiX3Bjd2QtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKwl1c2JfcGN3ZC0+aW50ZXJmYWNlX251bWJlciA9IGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwl1c2JfcGN3ZC0+aW50cl9zaXplID0gKGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgPiA4ID8gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA6IDgpOworCisJLyogc2V0IHVwIHRoZSBtZW1vcnkgYnVmZmVyJ3MgKi8KKwlpZiAoISh1c2JfcGN3ZC0+aW50cl9idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIHVzYl9wY3dkLT5pbnRyX3NpemUsIFNMQUJfQVRPTUlDLCAmdXNiX3Bjd2QtPmludHJfZG1hKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIHVyYidzICovCisJdXNiX3Bjd2QtPmludHJfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYl9wY3dkLT5pbnRyX3VyYikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBpbml0aWFsaXNlIHRoZSBpbnRyIHVyYidzICovCisJdXNiX2ZpbGxfaW50X3VyYih1c2JfcGN3ZC0+aW50cl91cmIsIHVkZXYsIHBpcGUsCisJCQl1c2JfcGN3ZC0+aW50cl9idWZmZXIsIHVzYl9wY3dkLT5pbnRyX3NpemUsCisJCQl1c2JfcGN3ZF9pbnRyX2RvbmUsIHVzYl9wY3dkLCBlbmRwb2ludC0+YkludGVydmFsKTsKKwl1c2JfcGN3ZC0+aW50cl91cmItPnRyYW5zZmVyX2RtYSA9IHVzYl9wY3dkLT5pbnRyX2RtYTsKKwl1c2JfcGN3ZC0+aW50cl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJLyogcmVnaXN0ZXIgb3VyIGludGVycnVwdCBVUkIgd2l0aCB0aGUgVVNCIHN5c3RlbSAqLworCWlmICh1c2Jfc3VibWl0X3VyYih1c2JfcGN3ZC0+aW50cl91cmIsIEdGUF9LRVJORUwpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlByb2JsZW0gcmVnaXN0ZXJpbmcgaW50ZXJydXB0IFVSQlxuIik7CisJCXJldHZhbCA9IC1FSU87IC8qIGZhaWx1cmUgKi8KKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBUaGUgZGV2aWNlIGV4aXN0cyBhbmQgY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoICovCisJdXNiX3Bjd2QtPmV4aXN0cyA9IDE7CisKKwkvKiBkaXNhYmxlIGNhcmQgKi8KKwl1c2JfcGN3ZF9zdG9wKHVzYl9wY3dkKTsKKworCS8qIEdldCB0aGUgRmlybXdhcmUgVmVyc2lvbiAqLworCWdvdF9md19yZXYgPSB1c2JfcGN3ZF9zZW5kX2NvbW1hbmQodXNiX3Bjd2QsIENNRF9HRVRfRklSTVdBUkVfVkVSU0lPTiwgJmZ3X3Jldl9tYWpvciwgJmZ3X3Jldl9taW5vcik7CisJaWYgKGdvdF9md19yZXYpIHsKKwkJc3ByaW50Zihmd192ZXJfc3RyLCAiJXUuJTAydSIsIGZ3X3Jldl9tYWpvciwgZndfcmV2X21pbm9yKTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGZ3X3Zlcl9zdHIsICI8Y2FyZCBubyBhbnN3ZXI+Iik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIGNhcmQgKEZpcm13YXJlOiAlcykgd2l0aCB0ZW1wIG9wdGlvblxuIiwKKwkJZndfdmVyX3N0cik7CisKKwkvKiBHZXQgc3dpdGNoIHNldHRpbmdzICovCisJdXNiX3Bjd2Rfc2VuZF9jb21tYW5kKHVzYl9wY3dkLCBDTURfR0VUX0RJUF9TV0lUQ0hfU0VUVElOR1MsICZkdW1teSwgJm9wdGlvbl9zd2l0Y2hlcyk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiT3B0aW9uIHN3aXRjaGVzICgweCUwMngpOiBUZW1wZXJhdHVyZSBSZXNldCBFbmFibGU9JXMsIFBvd2VyIE9uIERlbGF5PSVzXG4iLAorCQlvcHRpb25fc3dpdGNoZXMsCisJCSgob3B0aW9uX3N3aXRjaGVzICYgMHgxMCkgPyAiT04iIDogIk9GRiIpLAorCQkoKG9wdGlvbl9zd2l0Y2hlcyAmIDB4MDgpID8gIk9OIiA6ICJPRkYiKSk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAodXNiX3Bjd2Rfc2V0X2hlYXJ0YmVhdCh1c2JfcGN3ZCwgaGVhcnRiZWF0KSkgeworCQl1c2JfcGN3ZF9zZXRfaGVhcnRiZWF0KHVzYl9wY3dkLCBXQVRDSERPR19IRUFSVEJFQVQpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaGVhcnRiZWF0IHZhbHVlIG11c3QgYmUgMDxoZWFydGJlYXQ8NjU1MzYsIHVzaW5nICVkXG4iLAorCQkJV0FUQ0hET0dfSEVBUlRCRUFUKTsKKwl9CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnVzYl9wY3dkX25vdGlmaWVyKTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldHZhbCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dmFsID0gbWlzY19yZWdpc3RlcigmdXNiX3Bjd2RfdGVtcGVyYXR1cmVfbWlzY2Rldik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJVEVNUF9NSU5PUiwgcmV0dmFsKTsKKwkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfcmVib290OworCX0KKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnVzYl9wY3dkX21pc2NkZXYpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXR2YWwpOworCQlnb3RvIGVycl9vdXRfbWlzY19kZXJlZ2lzdGVyOworCX0KKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIHVzYl9wY3dkKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gaGVhcnRiZWF0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQloZWFydGJlYXQsIG5vd2F5b3V0KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X21pc2NfZGVyZWdpc3RlcjoKKwltaXNjX2RlcmVnaXN0ZXIoJnVzYl9wY3dkX3RlbXBlcmF0dXJlX21pc2NkZXYpOworZXJyX291dF91bnJlZ2lzdGVyX3JlYm9vdDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmdXNiX3Bjd2Rfbm90aWZpZXIpOworZXJyb3I6CisJdXNiX3Bjd2RfZGVsZXRlICh1c2JfcGN3ZCk7CisJdXNiX3Bjd2RfZGV2aWNlID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICoJdXNiX3Bjd2RfZGlzY29ubmVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICoKKyAqCVRoaXMgcm91dGluZSBndWFyYW50ZWVzIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBzdWJtaXQgYW55IG1vcmUgdXJicworICoJYnkgY2xlYXJpbmcgZGV2LT51ZGV2LgorICovCitzdGF0aWMgdm9pZCB1c2JfcGN3ZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkOworCisJLyogcHJldmVudCByYWNlcyB3aXRoIG9wZW4oKSAqLworCWRvd24gKCZkaXNjb25uZWN0X3NlbSk7CisKKwl1c2JfcGN3ZCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKKworCWRvd24gKCZ1c2JfcGN3ZC0+c2VtKTsKKworCS8qIFN0b3AgdGhlIHRpbWVyIGJlZm9yZSB3ZSBsZWF2ZSAqLworCWlmICghbm93YXlvdXQpCisJCXVzYl9wY3dkX3N0b3AodXNiX3Bjd2QpOworCisJLyogV2Ugc2hvdWxkIG5vdyBzdG9wIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVVNCIFBDV0QgZGV2aWNlICovCisJdXNiX3Bjd2QtPmV4aXN0cyA9IDA7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyKCZ1c2JfcGN3ZF9taXNjZGV2KTsKKwltaXNjX2RlcmVnaXN0ZXIoJnVzYl9wY3dkX3RlbXBlcmF0dXJlX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ1c2JfcGN3ZF9ub3RpZmllcik7CisKKwl1cCAoJnVzYl9wY3dkLT5zZW0pOworCisJLyogRGVsZXRlIHRoZSBVU0IgUENXRCBkZXZpY2UgKi8KKwl1c2JfcGN3ZF9kZWxldGUodXNiX3Bjd2QpOworCisJY2FyZHNfZm91bmQtLTsKKworCXVwICgmZGlzY29ubmVjdF9zZW0pOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlVTQiBQQyBXYXRjaGRvZyBkaXNjb25uZWN0ZWRcbiIpOworfQorCisKKworLyoqCisgKgl1c2JfcGN3ZF9pbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHVzYl9wY3dkX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdXNiX3Bjd2RfZHJpdmVyKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwKKwkJICAgIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggRFJJVkVSX0RFU0MgIiB2IiBEUklWRVJfVkVSU0lPTiAiICgiIERSSVZFUl9EQVRFICIpXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCXVzYl9wY3dkX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl9wY3dkX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmdXNiX3Bjd2RfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdCAodXNiX3Bjd2RfaW5pdCk7Cittb2R1bGVfZXhpdCAodXNiX3Bjd2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTlkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYwpAQCAtMCwwICsxLDUxNiBAQAorLyogbGludXgvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjQxMCBXYXRjaGRvZyBUaW1lciBTdXBwb3J0CisgKgorICogQmFzZWQgb24sIHNvZnRkb2cuYyBieSBBbGFuIENveCwKKyAqICAgICAoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQ2hhbmdlbG9nOgorICoJMDUtT2N0LTIwMDQJQkpECUFkZGVkIHNlbWFwaG9yZSBpbml0IHRvIHN0b3AgY3Jhc2hlcyBvbiBvcGVuCisgKgkJCQlGaXhlZCB0bXJfY291bnQgLyB3ZHRfY291bnQgY29uZnVzaW9uCisgKgkJCQlBZGRlZCBjb25maWd1cmFibGUgZGVidWcKKyAqCisgKgkxMS1KYW4tMjAwNAlCSkQJRml4ZWQgZGl2aWRlLWJ5LTIgaW4gdGltZW91dCBjb2RlCisgKgorICoJMTAtTWFyLTIwMDUJTENWUglDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisKKyN1bmRlZiBTM0MyNFhYX1ZBX1dBVENIRE9HCisjZGVmaW5lIFMzQzI0WFhfVkFfV0FUQ0hET0cgKDApCisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXdhdGNoZG9nLmg+CisKKyNkZWZpbmUgUEZYICJzM2MyNDEwLXdkdDogIgorCisjZGVmaW5lIENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0FUQk9PVAkJKDApCisjZGVmaW5lIENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0RFRkFVTFRfVElNRQkoMTUpCisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdG1yX21hcmdpbgk9IENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0RFRkFVTFRfVElNRTsKK3N0YXRpYyBpbnQgdG1yX2F0Ym9vdAk9IENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0FUQk9PVDsKK3N0YXRpYyBpbnQgc29mdF9ub2Jvb3QJPSAwOworc3RhdGljIGludCBkZWJ1Zwk9IDA7CisKK21vZHVsZV9wYXJhbSh0bXJfbWFyZ2luLCAgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0bXJfYXRib290LCAgaW50LCAwKTsKK21vZHVsZV9wYXJhbShub3dheW91dCwgICAgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzb2Z0X25vYm9vdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywJICBpbnQsIDApOworCitNT0RVTEVfUEFSTV9ERVNDKHRtcl9tYXJnaW4sICJXYXRjaGRvZyB0bXJfbWFyZ2luIGluIHNlY29uZHMuIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoQ09ORklHX1MzQzI0MTBfV0FUQ0hET0dfREVGQVVMVF9USU1FKSAiKSIpOworCitNT0RVTEVfUEFSTV9ERVNDKHRtcl9hdGJvb3QsICJXYXRjaGRvZyBpcyBzdGFydGVkIGF0IGJvb3QgdGltZSBpZiBzZXQgdG8gMSwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhDT05GSUdfUzNDMjQxMF9XQVRDSERPR19BVEJPT1QpKTsKKworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKK01PRFVMRV9QQVJNX0RFU0Moc29mdF9ub2Jvb3QsICJXYXRjaGRvZyBhY3Rpb24sIHNldCB0byAxIHRvIGlnbm9yZSByZWJvb3RzLCAwIHRvIHJlYm9vdCAoZGVmYXVsdCBkZXBlbmRzIG9uIE9OTFlfVEVTVElORykiKTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIldhdGNoZG9nIGRlYnVnLCBzZXQgdG8gPjEgZm9yIGRlYnVnLCAoZGVmYXVsdCAwKSIpOworCisKK3R5cGVkZWYgZW51bSBjbG9zZV9zdGF0ZSB7CisJQ0xPU0VfU1RBVEVfTk9ULAorCUNMT1NFX1NUQVRFX0FMTE9XPTB4NDAyMQorfSBjbG9zZV9zdGF0ZV90OworCitzdGF0aWMgREVDTEFSRV9NVVRFWChvcGVuX2xvY2spOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlCSp3ZHRfbWVtOworc3RhdGljIHN0cnVjdCByZXNvdXJjZQkqd2R0X2lycTsKK3N0YXRpYyBzdHJ1Y3QgY2xrCSp3ZHRfY2xvY2s7CitzdGF0aWMgdm9pZCBfX2lvbWVtCSp3ZHRfYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJIHdkdF9jb3VudDsKK3N0YXRpYyBjbG9zZV9zdGF0ZV90CSBhbGxvd19jbG9zZTsKKworLyogd2F0Y2hkb2cgY29udHJvbCByb3V0aW5lcyAqLworCisjZGVmaW5lIERCRyhtc2cuLi4pIGRvIHsgXAorCWlmIChkZWJ1ZykgXAorCQlwcmludGsoS0VSTl9JTkZPIG1zZyk7IFwKKwl9IHdoaWxlKDApCisKKy8qIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHZvaWQpCit7CisJd3JpdGVsKHdkdF9jb3VudCwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ05UKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwd2R0X3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHd0Y29uOworCisJd3Rjb24gPSByZWFkbCh3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOworCXd0Y29uICY9IH4oUzNDMjQxMF9XVENPTl9FTkFCTEUgfCBTM0MyNDEwX1dUQ09OX1JTVEVOKTsKKwl3cml0ZWwod3Rjb24sIHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwd2R0X3N0YXJ0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB3dGNvbjsKKworCXMzYzI0MTB3ZHRfc3RvcCgpOworCisJd3Rjb24gPSByZWFkbCh3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOworCXd0Y29uIHw9IFMzQzI0MTBfV1RDT05fRU5BQkxFIHwgUzNDMjQxMF9XVENPTl9ESVYxMjg7CisKKwlpZiAoc29mdF9ub2Jvb3QpIHsKKwkJd3Rjb24gfD0gUzNDMjQxMF9XVENPTl9JTlRFTjsKKwkJd3Rjb24gJj0gflMzQzI0MTBfV1RDT05fUlNURU47CisJfSBlbHNlIHsKKwkJd3Rjb24gJj0gflMzQzI0MTBfV1RDT05fSU5URU47CisJCXd0Y29uIHw9IFMzQzI0MTBfV1RDT05fUlNURU47CisJfQorCisJREJHKCIlczogd2R0X2NvdW50PTB4JTA4eCwgd3Rjb249JTA4bHhcbiIsCisJICAgIF9fRlVOQ1RJT05fXywgd2R0X2NvdW50LCB3dGNvbik7CisKKwl3cml0ZWwod2R0X2NvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1REQVQpOworCXdyaXRlbCh3ZHRfY291bnQsIHdkdF9iYXNlICsgUzNDMjQxMF9XVENOVCk7CisJd3JpdGVsKHd0Y29uLCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KGludCB0aW1lb3V0KQoreworCXVuc2lnbmVkIGludCBmcmVxID0gY2xrX2dldF9yYXRlKHdkdF9jbG9jayk7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBkaXZpc29yID0gMTsKKwl1bnNpZ25lZCBsb25nIHd0Y29uOworCisJaWYgKHRpbWVvdXQgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZXEgLz0gMTI4OworCWNvdW50ID0gdGltZW91dCAqIGZyZXE7CisKKwlEQkcoIiVzOiBjb3VudD0lZCwgdGltZW91dD0lZCwgZnJlcT0lZFxuIiwKKwkgICAgX19GVU5DVElPTl9fLCBjb3VudCwgdGltZW91dCwgZnJlcSk7CisKKwkvKiBpZiB0aGUgY291bnQgaXMgYmlnZ2VyIHRoYW4gdGhlIHdhdGNoZG9nIHJlZ2lzdGVyLAorCSAgIHRoZW4gd29yayBvdXQgd2hhdCB3ZSBuZWVkIHRvIGRvIChhbmQgaWYpIHdlIGNhbgorCSAgIGFjdHVhbGx5IG1ha2UgdGhpcyB2YWx1ZQorCSovCisKKwlpZiAoY291bnQgPj0gMHgxMDAwMCkgeworCQlmb3IgKGRpdmlzb3IgPSAxOyBkaXZpc29yIDw9IDB4MTAwOyBkaXZpc29yKyspIHsKKwkJCWlmICgoY291bnQgLyBkaXZpc29yKSA8IDB4MTAwMDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGNvdW50IC8gZGl2aXNvcikgPj0gMHgxMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGltZW91dCAlZCB0b28gYmlnXG4iLCB0aW1lb3V0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJdG1yX21hcmdpbiA9IHRpbWVvdXQ7CisKKwlEQkcoIiVzOiB0aW1lb3V0PSVkLCBkaXZpc29yPSVkLCBjb3VudD0lZCAoJTA4eClcbiIsCisJICAgIF9fRlVOQ1RJT05fXywgdGltZW91dCwgZGl2aXNvciwgY291bnQsIGNvdW50L2Rpdmlzb3IpOworCisJY291bnQgLz0gZGl2aXNvcjsKKwl3ZHRfY291bnQgPSBjb3VudDsKKworCS8qIHVwZGF0ZSB0aGUgcHJlLXNjYWxlciAqLworCXd0Y29uID0gcmVhZGwod2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ09OKTsKKwl3dGNvbiAmPSB+UzNDMjQxMF9XVENPTl9QUkVTQ0FMRV9NQVNLOworCXd0Y29uIHw9IFMzQzI0MTBfV1RDT05fUFJFU0NBTEUoZGl2aXNvci0xKTsKKworCXdyaXRlbChjb3VudCwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUREFUKTsKKwl3cml0ZWwod3Rjb24sIHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZihkb3duX3RyeWxvY2soJm9wZW5fbG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpIHsKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl9IGVsc2UgeworCQlhbGxvd19jbG9zZSA9IENMT1NFX1NUQVRFX0FMTE9XOworCX0KKworCS8qIHN0YXJ0IHRoZSB0aW1lciAqLworCXMzYzI0MTB3ZHRfc3RhcnQoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICoJU2h1dCBvZmYgdGhlIHRpbWVyLgorCSAqIAlMb2NrIGl0IGluIGlmIGl0J3MgYSBtb2R1bGUgYW5kIHdlIHNldCBub3dheW91dAorCSAqLworCWlmIChhbGxvd19jbG9zZSA9PSBDTE9TRV9TVEFURV9BTExPVykgeworCQlzM2MyNDEwd2R0X3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJfQorCisJYWxsb3dfY2xvc2UgPSBDTE9TRV9TVEFURV9OT1Q7CisJdXAoJm9wZW5fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHMzYzI0MTB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKgorCSAqCVJlZnJlc2ggdGhlIHRpbWVyLgorCSAqLworCWlmKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlhbGxvd19jbG9zZSA9IENMT1NFX1NUQVRFX05PVDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJYWxsb3dfY2xvc2UgPSBDTE9TRV9TVEFURV9BTExPVzsKKwkJCX0KKwkJfQorCisJCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKKyNkZWZpbmUgT1BUSU9OUyBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UKKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHMzYzI0MTBfd2R0X2lkZW50ID0geworCS5vcHRpb25zICAgICAgICAgID0gICAgIE9QVElPTlMsCisJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCS5pZGVudGl0eSAgICAgICAgID0JIlMzQzI0MTAgV2F0Y2hkb2ciLAorfTsKKworCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IG5ld19tYXJnaW47CisKKwlzd2l0Y2ggKGNtZCkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZzM2MyNDEwX3dkdF9pZGVudCwKKwkJCQlzaXplb2YoczNjMjQxMF93ZHRfaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQlzM2MyNDEwd2R0X2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQkJaWYgKGdldF91c2VyKG5ld19tYXJnaW4sIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KG5ld19tYXJnaW4pKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzM2MyNDEwd2R0X2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIHB1dF91c2VyKHRtcl9tYXJnaW4sIHApOworCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcih0bXJfbWFyZ2luLCBwKTsKKwl9Cit9CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwkJCSAgICAgIHZvaWQgKnVudXNlZCkKK3sKKwlpZihjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCXMzYzI0MTB3ZHRfc3RvcCgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qIGtlcm5lbCBpbnRlcmZhY2UgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjMjQxMHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gczNjMjQxMHdkdF93cml0ZSwKKwkuaW9jdGwJCT0gczNjMjQxMHdkdF9pb2N0bCwKKwkub3BlbgkJPSBzM2MyNDEwd2R0X29wZW4sCisJLnJlbGVhc2UJPSBzM2MyNDEwd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgczNjMjQxMHdkdF9taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZzM2MyNDEwd2R0X2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHMzYzI0MTB3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBzM2MyNDEwd2R0X25vdGlmeV9zeXMsCit9OworCisvKiBpbnRlcnJ1cHQgaGFuZGxlciBjb2RlICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzM2MyNDEwd2R0X2lycShpbnQgaXJxbm8sIHZvaWQgKnBhcmFtLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGV4cGlyZWQhXG4iKTsKKworCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorLyogZGV2aWNlIGludGVyZmFjZSAqLworCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgc3RhcnRlZCA9IDA7CisJaW50IHJldDsKKwlpbnQgc2l6ZTsKKworCURCRygiJXM6IHByb2JlPSVwLCBkZXZpY2U9JXBcbiIsIF9fRlVOQ1RJT05fXywgcGRldiwgZGV2KTsKKworCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyICovCisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uIHJlc291Y2VcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzaXplID0gKHJlcy0+ZW5kLXJlcy0+c3RhcnQpKzE7CisJd2R0X21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCBwZGV2LT5uYW1lKTsKKwlpZiAod2R0X21lbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb25cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwl3ZHRfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgc2l6ZSk7CisJaWYgKHdkdF9iYXNlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBpb3JlbWFwKCkgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJREJHKCJwcm9iZTogbWFwcGVkIHdkdF9iYXNlPSVwXG4iLCB3ZHRfYmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShyZXMtPnN0YXJ0LCBzM2MyNDEwd2R0X2lycSwgMCwgcGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXdkdF9jbG9jayA9IGNsa19nZXQoZGV2LCAid2F0Y2hkb2ciKTsKKwlpZiAod2R0X2Nsb2NrID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBmaW5kIHdhdGNoZG9nIGNsb2NrIHNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNsa191c2Uod2R0X2Nsb2NrKTsKKwljbGtfZW5hYmxlKHdkdF9jbG9jayk7CisKKwkvKiBzZWUgaWYgd2UgY2FuIGFjdHVhbGx5IHNldCB0aGUgcmVxdWVzdGVkIHRpbWVyIG1hcmdpbiwgYW5kIGlmCisJICogbm90LCB0cnkgdGhlIGRlZmF1bHQgdmFsdWUgKi8KKworCWlmIChzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQodG1yX21hcmdpbikpIHsKKwkJc3RhcnRlZCA9IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdChDT05GSUdfUzNDMjQxMF9XQVRDSERPR19ERUZBVUxUX1RJTUUpOworCisJCWlmIChzdGFydGVkID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJ0bXJfbWFyZ2luIHZhbHVlIG91dCBvZiByYW5nZSwgZGVmYXVsdCAlZCB1c2VkXG4iLAorCQkJICAgICAgIENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0RFRkFVTFRfVElNRSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZGVmYXVsdCB0aW1lciB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UsIGNhbm5vdCBzdGFydFxuIik7CisJCX0KKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnMzYzI0MTB3ZHRfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKCVkKVxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoJWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzM2MyNDEwd2R0X25vdGlmaWVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAodG1yX2F0Ym9vdCAmJiBzdGFydGVkID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlN0YXJ0aW5nIFdhdGNoZG9nIFRpbWVyXG4iKTsKKwkJczNjMjQxMHdkdF9zdGFydCgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAod2R0X21lbSAhPSBOVUxMKSB7CisJCXJlbGVhc2VfcmVzb3VyY2Uod2R0X21lbSk7CisJCWtmcmVlKHdkdF9tZW0pOworCQl3ZHRfbWVtID0gTlVMTDsKKwl9CisKKwlpZiAod2R0X2lycSAhPSBOVUxMKSB7CisJCWZyZWVfaXJxKHdkdF9pcnEtPnN0YXJ0LCBkZXYpOworCQl3ZHRfaXJxID0gTlVMTDsKKwl9CisKKwlpZiAod2R0X2Nsb2NrICE9IE5VTEwpIHsKKwkJY2xrX2Rpc2FibGUod2R0X2Nsb2NrKTsKKwkJY2xrX3VudXNlKHdkdF9jbG9jayk7CisJCWNsa19wdXQod2R0X2Nsb2NrKTsKKwkJd2R0X2Nsb2NrID0gTlVMTDsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzM2MyNDEwd2R0X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC13ZHQiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzM2MyNDEwd2R0X3Byb2JlLAorCS5yZW1vdmUJCT0gczNjMjQxMHdkdF9yZW1vdmUsCit9OworCisKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiUzNDMjQxMCBXYXRjaGRvZyBUaW1lciwgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iOworCitzdGF0aWMgaW50IF9faW5pdCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJcHJpbnRrKGJhbm5lcik7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmczNjMjQxMHdkdF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2F0Y2hkb2dfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNDEwd2R0X2RyaXZlcik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnMzYzI0MTB3ZHRfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdCh3YXRjaGRvZ19pbml0KTsKK21vZHVsZV9leGl0KHdhdGNoZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0MTAgV2F0Y2hkb2cgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NhMTEwMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYTExMDBfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlOGY3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYTExMDBfd2R0LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKglXYXRjaGRvZyBkcml2ZXIgZm9yIHRoZSBTQTExeDAvUFhBMnh4CisgKgorICogICAgICAoYykgQ29weXJpZ2h0IDIwMDAgT2xlZyBEcm9raW4gPGdyZWVuQGNyaW1lYS5lZHU+CisgKiAgICAgICAgICBCYXNlZCBvbiBTb2Z0RG9nIGRyaXZlciBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBPbGVnIERyb2tpbiBub3IgaVhjZWxlcmF0b3IuY29tIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwICAgICAgICAgICBPbGVnIERyb2tpbiA8Z3JlZW5AY3JpbWVhLmVkdT4KKyAqCisgKiAgICAgIDI3LzExLzIwMDAgSW5pdGlhbCByZWxlYXNlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpZmRlZiBDT05GSUdfQVJDSF9QWEEKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBPU0NSX0ZSRVEJCUNMT0NLX1RJQ0tfUkFURQorI2RlZmluZSBTQTExMDBfQ0xPU0VfTUFHSUMJKDB4NWFmYzQ0NTMpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhMTEwMHdkdF91c2VyczsKK3N0YXRpYyBpbnQgZXhwZWN0X2Nsb3NlOworc3RhdGljIGludCBwcmVfbWFyZ2luOworc3RhdGljIGludCBib290X3N0YXR1czsKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKKy8qCisgKglBbGxvdyBvbmx5IG9uZSBwZXJzb24gdG8gaG9sZCBpdCBvcGVuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTAwZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMSwmc2ExMTAwd2R0X3VzZXJzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEFjdGl2YXRlIFNBMTEwMCBXYXRjaGRvZyB0aW1lciAqLworCU9TTVIzID0gT1NDUiArIHByZV9tYXJnaW47CisJT1NTUiA9IE9TU1JfTTM7CisJT1dFUiA9IE9XRVJfV01FOworCU9JRVIgfD0gT0lFUl9FMzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVNodXQgb2ZmIHRoZSB0aW1lci4KKyAqIAlMb2NrIGl0IGluIGlmIGl0J3MgYSBtb2R1bGUgYW5kIHdlIGRlZmluZWQgLi4uTk9XQVlPVVQKKyAqCU9kZGx5LCB0aGUgd2F0Y2hkb2cgY2FuIG9ubHkgYmUgZW5hYmxlZCwgYnV0IHdlIGNhbiB0dXJuIG9mZgorICoJdGhlIGludGVycnVwdCwgd2hpY2ggYXBwZWFycyB0byBwcmV2ZW50IHRoZSB3YXRjaGRvZyB0aW1pbmcgb3V0LgorICovCitzdGF0aWMgaW50IHNhMTEwMGRvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCU9TTVIzID0gT1NDUiArIHByZV9tYXJnaW47CisKKwlpZiAoZXhwZWN0X2Nsb3NlID09IFNBMTEwMF9DTE9TRV9NQUdJQykgeworCQlPSUVSICY9IH5PSUVSX0UzOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgIldBVENIRE9HOiBXRFQgZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkuICBXRFQgd2lsbCBub3Qgc3RvcCFcbiIpOworCX0KKworCWNsZWFyX2JpdCgxLCAmc2ExMTAwd2R0X3VzZXJzKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNhMTEwMGRvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YSArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IFNBMTEwMF9DTE9TRV9NQUdJQzsKKwkJCX0KKwkJfQorCQkvKiBSZWZyZXNoIE9TTVIzIHRpbWVyLiAqLworCQlPU01SMyA9IE9TQ1IgKyBwcmVfbWFyZ2luOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkub3B0aW9ucwk9IFdESU9GX0NBUkRSRVNFVCB8IFdESU9GX01BR0lDQ0xPU0UgfAorCQkJICBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuaWRlbnRpdHkJPSAiU0ExMTAwIFdhdGNoZG9nIiwKK307CisKK3N0YXRpYyBpbnQgc2ExMTAwZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CisJaW50IHRpbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqKWFyZywgJmlkZW50LAorCQkJCSAgIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0ID0gcHV0X3VzZXIoYm9vdF9zdGF0dXMsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJcmV0ID0gZ2V0X3VzZXIodGltZSwgKGludCAqKWFyZyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlpZiAodGltZSA8PSAwIHx8IHRpbWUgPiAyNTUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXByZV9tYXJnaW4gPSBPU0NSX0ZSRVEgKiB0aW1lOworCQlPU01SMyA9IE9TQ1IgKyBwcmVfbWFyZ2luOworCQkvKmZhbGwgdGhyb3VnaCovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldCA9IHB1dF91c2VyKHByZV9tYXJnaW4gLyBPU0NSX0ZSRVEsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlPU01SMyA9IE9TQ1IgKyBwcmVfbWFyZ2luOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2ExMTAwZG9nX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gc2ExMTAwZG9nX3dyaXRlLAorCS5pb2N0bAkJPSBzYTExMDBkb2dfaW9jdGwsCisJLm9wZW4JCT0gc2ExMTAwZG9nX29wZW4sCisJLnJlbGVhc2UJPSBzYTExMDBkb2dfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzYTExMDBkb2dfbWlzY2RldiA9Cit7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJTQTExMDAvUFhBMnh4IHdhdGNoZG9nIiwKKwkuZm9wcwkJPSAmc2ExMTAwZG9nX2ZvcHMsCit9OworCitzdGF0aWMgaW50IG1hcmdpbiBfX2luaXRkYXRhID0gNjA7CQkvKiAoc2VjcykgRGVmYXVsdCBpcyAxIG1pbnV0ZSAqLworCitzdGF0aWMgaW50IF9faW5pdCBzYTExMDBkb2dfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFJlYWQgdGhlIHJlc2V0IHN0YXR1cywgYW5kIHNhdmUgaXQgZm9yIGxhdGVyLiAgSWYKKwkgKiB3ZSBzdXNwZW5kLCBSQ1NSIHdpbGwgYmUgY2xlYXJlZCwgYW5kIHRoZSB3YXRjaGRvZworCSAqIHJlc2V0IHJlYXNvbiB3aWxsIGJlIGxvc3QuCisJICovCisJYm9vdF9zdGF0dXMgPSAoUkNTUiAmIFJDU1JfV0RSKSA/IFdESU9GX0NBUkRSRVNFVCA6IDA7CisJcHJlX21hcmdpbiA9IE9TQ1JfRlJFUSAqIG1hcmdpbjsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnNhMTEwMGRvZ19taXNjZGV2KTsKKwlpZiAocmV0ID09IDApCisJCXByaW50aygiU0ExMTAwL1BYQTJ4eCBXYXRjaGRvZyBUaW1lcjogdGltZXIgbWFyZ2luICVkIHNlY1xuIiwKKwkJICAgICAgIG1hcmdpbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2ExMTAwZG9nX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJnNhMTEwMGRvZ19taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoc2ExMTAwZG9nX2luaXQpOworbW9kdWxlX2V4aXQoc2ExMTAwZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJPbGVnIERyb2tpbiA8Z3JlZW5AY3JpbWVhLmVkdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0ExMTAwL1BYQTJ4eCBXYXRjaGRvZyIpOworCittb2R1bGVfcGFyYW0obWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXJnaW4sICJXYXRjaGRvZyBtYXJnaW4gaW4gc2Vjb25kcyAoZGVmYXVsdCA2MHMpIik7CisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQiKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NiYzYweHh3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYmM2MHh4d2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkZTk4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYmM2MHh4d2R0LmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKgk2MHh4IFNpbmdsZSBCb2FyZCBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIgZm9yIExpbnV4IDIuMi54CisgKgorICogICAgICBCYXNlZCBvbiBhY3F1aXJld2R0LmMgYnkgQWxhbiBDb3guCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgYXV0aG9yIGRvZXMgTk9UIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IKKyAqCWFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgaW4KKyAqCXRoZSBob3BlIHRoYXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXJzLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMCAgICBKYWtvYiBPZXN0ZXJnYWFyZCA8amFrb2JAdW50aG91Z2h0Lm5ldD4KKyAqCisgKiAgICAgICAgICAgMTIvNCAtIDIwMDAgICAgICBbSW5pdGlhbCByZXZpc2lvbl0KKyAqICAgICAgICAgICAyNS80IC0gMjAwMCAgICAgIEFkZGVkIC9kZXYvd2F0Y2hkb2cgc3VwcG9ydAorICogICAgICAgICAgIDA5LzUgLSAyMDAxICAgICAgW3NtakBvcm8ubmV0XSBmaXhlZCBmb3Bfd3JpdGUgdG8gInJldHVybiAxIiBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgMTIvNCAtIDIwMDIgICAgICBbcm9iQG9zaW52ZXN0b3IuY29tXSBlbGltaW5hdGUgZm9wX3JlYWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeCBwb3NzaWJsZSB3ZHRfaXNfb3BlbiByYWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSBsb2NrX2tlcm5lbC91bmxvY2tfa2VybmVsIHBhaXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBLRVJOXyogdG8gcHJpbnRrJ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdCByaWQgb2YgZXh0cmFuZW91cyBjb21tZW50cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB3YXRjaGRvZ19pbmZvIHRvIGNvcnJlY3RseSByZWZsZWN0IHdoYXQgdGhlIGRyaXZlciBvZmZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIFdESU9DX0dFVFNUQVRVUywgV0RJT0NfR0VUQk9PVFNUQVRVUywgV0RJT0NfU0VUVElNRU9VVCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESU9DX0dFVFRJTUVPVVQsIGFuZCBXRElPQ19TRVRPUFRJT05TIGlvY3RscworICogICAgICAgICAgIDA5LzggLSAyMDAzICAgICAgW3dpbUBpZ3VhbmEuYmVdIGNsZWFudXAgb2YgdHJhaWxpbmcgc3BhY2VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgbW9kdWxlX3BhcmFtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWRlIHRpbWVvdXQgKHRoZSBlbXVsYXRlZCBoZWFydGJlYXQpIGEgbW9kdWxlX3BhcmFtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWRlIHRoZSBrZWVwYWxpdmUgcGluZyBhbiBpbnRlcm5hbCBzdWJyb3V0aW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWRlIHdkdF9zdG9wIGFuZCB3ZHRfc3RhcnQgbW9kdWxlIHBhcmFtcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgZXh0cmEgcHJpbnRrJ3MgZm9yIHN0YXJ0dXAgcHJvYmxlbXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIE1PRFVMRV9BVVRIT1IgYW5kIE1PRFVMRV9ERVNDUklQVElPTiBpbmZvCisgKgorICoKKyAqICBUaGlzIFdEVCBkcml2ZXIgaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIExpbnV4IFdEVAorICogIGRyaXZlcnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgorICogICopICBUaGUgZHJpdmVyIHdpbGwgcGluZyB0aGUgd2F0Y2hkb2cgYnkgaXRzZWxmLCBiZWNhdXNlIHRoaXMKKyAqICAgICAgcGFydGljdWxhciBXRFQgaGFzIGEgdmVyeSBzaG9ydCB0aW1lb3V0IChvbmUgc2Vjb25kKSBhbmQgaXQKKyAqICAgICAgd291bGQgYmUgaW5zYW5lIHRvIGNvdW50IG9uIGFueSB1c2Vyc3BhY2UgZGFlbW9uIGFsd2F5cworICogICAgICBnZXR0aW5nIHNjaGVkdWxlZCB3aXRoaW4gdGhhdCB0aW1lIGZyYW1lLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBPVVJfTkFNRSAic2JjNjB4eHdkdCIKKyNkZWZpbmUgUEZYIE9VUl9OQU1FICI6ICIKKworLyoKKyAqIFlvdSBtdXN0IHNldCB0aGVzZSAtIFRoZSBkcml2ZXIgY2Fubm90IHByb2JlIGZvciB0aGUgc2V0dGluZ3MKKyAqLworCitzdGF0aWMgaW50IHdkdF9zdG9wID0gMHg0NTsKK21vZHVsZV9wYXJhbSh3ZHRfc3RvcCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X3N0b3AsICJTQkM2MHh4IFdEVCAnc3RvcCcgaW8gcG9ydCAoZGVmYXVsdCAweDQ1KSIpOworCitzdGF0aWMgaW50IHdkdF9zdGFydCA9IDB4NDQzOworbW9kdWxlX3BhcmFtKHdkdF9zdGFydCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X3N0YXJ0LCAiU0JDNjB4eCBXRFQgJ3N0YXJ0JyBpbyBwb3J0IChkZWZhdWx0IDB4NDQzKSIpOworCisvKgorICogVGhlIDYweHggYm9hcmQgY2FuIHVzZSB3YXRjaGRvZyB0aW1lb3V0IHZhbHVlcyBmcm9tIG9uZSBzZWNvbmQKKyAqIHRvIHNldmVyYWwgbWludXRlcy4gIFRoZSBkZWZhdWx0IGlzIG9uZSBzZWNvbmQsIHNvIGlmIHdlIHJlc2V0CisgKiB0aGUgd2F0Y2hkb2cgZXZlcnkgfjI1MG1zIHdlIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNkZWZpbmUgV0RUX0lOVEVSVkFMIChIWi80KzEpCisKKy8qCisgKiBXZSBtdXN0IG5vdCByZXF1aXJlIHRvbyBnb29kIHJlc3BvbnNlIGZyb20gdGhlIHVzZXJzcGFjZSBkYWVtb24uCisgKiBIZXJlIHdlIHJlcXVpcmUgdGhlIHVzZXJzcGFjZSBkYWVtb24gdG8gc2VuZCB1cyBhIGhlYXJ0YmVhdAorICogY2hhciB0byAvZGV2L3dhdGNoZG9nIGV2ZXJ5IDMwIHNlY29uZHMuCisgKiBJZiB0aGUgZGFlbW9uIHB1bHNlcyB1cyBldmVyeSAyNSBzZWNvbmRzLCB3ZSBjYW4gc3RpbGwgYWZmb3JkCisgKiBhIDUgc2Vjb25kIHNjaGVkdWxpbmcgZGVsYXkgb24gdGhlIChoaWdoIHByaW9yaXR5KSBkYWVtb24uIFRoYXQKKyAqIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBhIGJveCB1bmRlciBhbnkgbG9hZC4KKyAqLworCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgMzAJCS8qIDMwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMsIHdpbGwgYmUgbXVsdGlwbGllZCBieSBIWiB0byBnZXQgc2Vjb25kcyB0byB3YWl0IGZvciBhIHBpbmcgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAoMTw9dGltZW91dDw9MzYwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworc3RhdGljIHZvaWQgd2R0X3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2hlYXJ0YmVhdDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGNoYXIgd2R0X2V4cGVjdF9jbG9zZTsKKworLyoKKyAqCVdoYWNrIHRoZSBkb2cKKyAqLworCitzdGF0aWMgdm9pZCB3ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLyogSWYgd2UgZ290IGEgaGVhcnRiZWF0IHB1bHNlIHdpdGhpbiB0aGUgV0RUX1VTX0lOVEVSVkFMCisJICogd2UgYWdyZWUgdG8gcGluZyB0aGUgV0RUCisJICovCisJaWYodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKQorCXsKKwkJLyogUGluZyB0aGUgV0RUIGJ5IHJlYWRpbmcgZnJvbSB3ZHRfc3RhcnQgKi8KKwkJaW5iX3Aod2R0X3N0YXJ0KTsKKwkJLyogUmUtc2V0IHRoZSB0aW1lciBpbnRlcnZhbCAqLworCQl0aW1lci5leHBpcmVzID0gamlmZmllcyArIFdEVF9JTlRFUlZBTDsKKwkJYWRkX3RpbWVyKCZ0aW1lcik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkhlYXJ0YmVhdCBsb3N0ISBXaWxsIG5vdCBwaW5nIHRoZSB3YXRjaGRvZ1xuIik7CisJfQorfQorCisvKgorICogVXRpbGl0eSByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIHdkdF9zdGFydHVwKHZvaWQpCit7CisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKHRpbWVvdXQgKiBIWik7CisKKwkvKiBTdGFydCB0aGUgdGltZXIgKi8KKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArIFdEVF9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJnRpbWVyKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGVuYWJsZWQuXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2R0X3R1cm5vZmYodm9pZCkKK3sKKwkvKiBTdG9wIHRoZSB0aW1lciAqLworCWRlbF90aW1lcigmdGltZXIpOworCWluYl9wKHdkdF9zdG9wKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGRpc2FibGVkLi4uXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCS8qIHVzZXIgbGFuZCBwaW5nICovCisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKHRpbWVvdXQgKiBIWik7Cit9CisKKy8qCisgKiAvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgZm9wX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYoY291bnQpCisJeworCQlpZiAoIW5vd2F5b3V0KQorCQl7CisJCQlzaXplX3Qgb2ZzOworCisJCQkvKiBub3RlOiBqdXN0IGluIGNhc2Ugc29tZW9uZSB3cm90ZSB0aGUgbWFnaWMgY2hhcmFjdGVyCisJCQkgKiBmaXZlIG1vbnRocyBhZ28uLi4gKi8KKwkJCXdkdF9leHBlY3RfY2xvc2UgPSAwOworCisJCQkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCQkJZm9yKG9mcyA9IDA7IG9mcyAhPSBjb3VudDsgb2ZzKyspCisJCQl7CisJCQkJY2hhciBjOworCQkJCWlmKGdldF91c2VyKGMsIGJ1ZitvZnMpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZihjID09ICdWJykKKwkJCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogV2VsbCwgYW55aG93IHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZXR1cm4gdGhhdCBmYXZvdXIgKi8KKwkJd2R0X2tlZXBhbGl2ZSgpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZm9wX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKworCS8qIEp1c3QgaW4gY2FzZSB3ZSdyZSBhbHJlYWR5IHRhbGtpbmcgdG8gc29tZW9uZS4uLiAqLworCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIEdvb2QsIGZpcmUgdXAgdGhlIHNob3cgKi8KKwl3ZHRfc3RhcnR1cCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZvcF9jbG9zZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCWlmKHdkdF9leHBlY3RfY2xvc2UgPT0gNDIpCisJCXdkdF90dXJub2ZmKCk7CisJZWxzZSB7CisJCWRlbF90aW1lcigmdGltZXIpOworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiZGV2aWNlIGZpbGUgY2xvc2VkIHVuZXhwZWN0ZWRseS4gV2lsbCBub3Qgc3RvcCB0aGUgV0RUIVxuIik7CisJfQorCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOworCXdkdF9leHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZvcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQ9CisJeworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiU0JDNjB4eCIsCisJfTsKKworCXN3aXRjaChjbWQpCisJeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpPy1FRkFVTFQ6MDsKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmKGdldF91c2VyKG5ld19vcHRpb25zLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXdkdF90dXJub2ZmKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYobmV3X29wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJd2R0X3N0YXJ0dXAoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IG5ld190aW1lb3V0OworCisJCQlpZihnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKG5ld190aW1lb3V0IDwgMSB8fCBuZXdfdGltZW91dCA+IDM2MDApIC8qIGFyYml0cmFyeSB1cHBlciBsaW1pdCAqLworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl0aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJfQorCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGZvcF93cml0ZSwKKwkub3BlbgkJPSBmb3Bfb3BlbiwKKwkucmVsZWFzZQk9IGZvcF9jbG9zZSwKKwkuaW9jdGwJCT0gZm9wX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZ3ZHRfZm9wcywKK307CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZihjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkKKwkJd2R0X3R1cm5vZmYoKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyPQoreworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgc2JjNjB4eHdkdF91bmxvYWQodm9pZCkKK3sKKwl3ZHRfdHVybm9mZigpOworCisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaWYgKCh3ZHRfc3RvcCAhPSAweDQ1KSAmJiAod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KSkKKwkJcmVsZWFzZV9yZWdpb24od2R0X3N0b3AsMSk7CisJcmVsZWFzZV9yZWdpb24od2R0X3N0YXJ0LDEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzYmM2MHh4d2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAtRUJVU1k7CisKKwlpZih0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gMzYwMCkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJeworCQl0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD14PD0zNjAwLCB1c2luZyAlZFxuIiwKKwkJCXRpbWVvdXQpOworIAl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9zdGFydCwgMSwgIlNCQyA2MFhYIFdEVCIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJd2R0X3N0YXJ0KTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogV2UgY2Fubm90IHJlc2VydmUgMHg0NSAtIHRoZSBrZXJuZWwgYWxyZWFkeSBoYXMhICovCisJaWYgKCh3ZHRfc3RvcCAhPSAweDQ1KSAmJiAod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KSkKKwl7CisJCWlmICghcmVxdWVzdF9yZWdpb24od2R0X3N0b3AsIDEsICJTQkMgNjBYWCBXRFQiKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJCXdkdF9zdG9wKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF9yZWdpb24xOworCQl9CisJfQorCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmZ1bmN0aW9uID0gd2R0X3RpbWVyX3Bpbmc7CisJdGltZXIuZGF0YSA9IDA7CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmMpCisJeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCXdkdF9taXNjZGV2Lm1pbm9yLCByYyk7CisJCWdvdG8gZXJyX291dF9yZWdpb24yOworCX0KKworCXJjID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlmIChyYykKKwl7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyYyk7CisJCWdvdG8gZXJyX291dF9taXNjZGV2OworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXRFQgZHJpdmVyIGZvciA2MFhYIHNpbmdsZSBib2FyZCBjb21wdXRlciBpbml0aWFsaXNlZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfbWlzY2RldjoKKwltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKK2Vycl9vdXRfcmVnaW9uMjoKKwlpZiAoKHdkdF9zdG9wICE9IDB4NDUpICYmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpKQorCQlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RvcCwxKTsKK2Vycl9vdXRfcmVnaW9uMToKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsMSk7CitlcnJfb3V0OgorCXJldHVybiByYzsKK30KKworbW9kdWxlX2luaXQoc2JjNjB4eHdkdF9pbml0KTsKK21vZHVsZV9leGl0KHNiYzYweHh3ZHRfdW5sb2FkKTsKKworTU9EVUxFX0FVVEhPUigiSmFrb2IgT2VzdGVyZ2FhcmQgPGpha29iQHVudGhvdWdodC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjYweHggU2luZ2xlIEJvYXJkIENvbXB1dGVyIFdhdGNoZG9nIFRpbWVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjMTIwMHdkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjMTIwMHdkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDAxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2MxMjAwd2R0LmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKglOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczMDcvUEM5NzMwNyAoYWxhIFNDMTIwMCkgV0RUIGRyaXZlcgorICoJKGMpIENvcHlyaWdodCAyMDAyIFp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+LAorICoJCQlBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJQmFzZWQgb24gd2R0LmMgYW5kIHdkdDk3Ny5jIGJ5IEFsYW4gQ294IGFuZCBXb29keSBTdXdhbHNraSByZXNwZWN0aXZlbHkuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgYXV0aG9yKHMpIG9mIHRoaXMgc29mdHdhcmUgc2hhbGwgbm90IGJlIGhlbGQgbGlhYmxlIGZvciBkYW1hZ2VzCisgKglvZiBhbnkgbmF0dXJlIHJlc3VsdGluZyBkdWUgdG8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzCisgKglzb2Z0d2FyZSBpcyBwcm92aWRlZCBBUy1JUyB3aXRoIG5vIHdhcnJhbnRpZXMuCisgKgorICoJQ2hhbmdlbG9nOgorICoJMjAwMjAyMjAgWndhbmUgTXdhaWthbWJvCUNvZGUgYmFzZWQgb24gZGF0YXNoZWV0LCBubyBoYXJkd2FyZS4KKyAqCTIwMDIwMjIxIFp3YW5lIE13YWlrYW1ibwlDbGVhbnVwcyBhcyBzdWdnZXN0ZWQgYnkgSmVmZiBHYXJ6aWsgYW5kIEFsYW4gQ294LgorICoJMjAwMjAyMjIgWndhbmUgTXdhaWthbWJvCUFkZGVkIHByb2JpbmcuCisgKgkyMDAyMDIyNSBad2FuZSBNd2Fpa2FtYm8JQWRkZWQgSVNBUE5QIHN1cHBvcnQuCisgKgkyMDAyMDQxMiBSb2IgUmFkZXoJCUJyb2tlIG91dCBzdGFydC9zdG9wIGZ1bmN0aW9ucworICoJCSA8cm9iQG9zaW52ZXN0b3IuY29tPglSZXR1cm4gcHJvcGVyIHN0YXR1cyBpbnN0ZWFkIG9mIHRlbXBlcmF0dXJlIHdhcm5pbmcKKyAqCQkJCQlBZGQgV0RJT0NfR0VUQk9PVFNUQVRVUyBhbmQgV0RJT0NfU0VUT1BUSU9OUyBpb2N0bHMKKyAqCQkJCQlGaXggQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKgkyMDAyMDUzMCBKb2VsIEJlY2tlcgkJQWRkIE1hdHQgRG9tc2NoJ3Mgbm93YXlvdXQgbW9kdWxlIG9wdGlvbgorICoJMjAwMzAxMTYgQWRhbSBCZWxheQkJVXBkYXRlZCB0byB0aGUgbGF0ZXN0IHBucCBjb2RlCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFNDMTIwMF9NT0RVTEVfVkVSCSJidWlsZCAyMDAyMDMwMyIKKyNkZWZpbmUgU0MxMjAwX01PRFVMRV9OQU1FCSJzYzEyMDB3ZHQiCisjZGVmaW5lIFBGWAkJCVNDMTIwMF9NT0RVTEVfTkFNRSAiOiAiCisKKyNkZWZpbmUJTUFYX1RJTUVPVVQJMjU1CS8qIDI1NSBtaW51dGVzICovCisjZGVmaW5lIFBNSVIJCShpbykJLyogUG93ZXIgTWFuYWdlbWVudCBJbmRleCBSZWdpc3RlciAqLworI2RlZmluZSBQTURSCQkoaW8rMSkJLyogUG93ZXIgTWFuYWdlbWVudCBEYXRhIFJlZ2lzdGVyICovCisKKy8qIERhdGEgUmVnaXN0ZXIgaW5kZXhlcyAqLworI2RlZmluZSBGRVIxCQkweDAwCS8qIEZ1bmN0aW9uIGVuYWJsZSByZWdpc3RlciAxICovCisjZGVmaW5lIEZFUjIJCTB4MDEJLyogRnVuY3Rpb24gZW5hYmxlIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUE1DMQkJMHgwMgkvKiBQb3dlciBNYW5hZ2VtZW50IEN0cmwgMSAqLworI2RlZmluZSBQTUMyCQkweDAzCS8qIFBvd2VyIE1hbmFnZW1lbnQgQ3RybCAyICovCisjZGVmaW5lIFBNQzMJCTB4MDQJLyogUG93ZXIgTWFuYWdlbWVudCBDdHJsIDMgKi8KKyNkZWZpbmUgV0RUTwkJMHgwNQkvKiBXYXRjaGRvZyB0aW1lb3V0IHJlZ2lzdGVyICovCisjZGVmaW5lCVdEQ0YJCTB4MDYJLyogV2F0Y2hkb2cgY29uZmlnIHJlZ2lzdGVyICovCisjZGVmaW5lIFdEU1QJCTB4MDcJLyogV2F0Y2hkb2cgc3RhdHVzIHJlZ2lzdGVyICovCisKKy8qIFdEQ0YgYml0ZmllbGRzIC0gd2hpY2ggZGV2aWNlcyBhc3NlcnQgV0RPICovCisjZGVmaW5lIEtCQ19JUlEJCTB4MDEJLyogS2V5Ym9hcmQgQ29udHJvbGxlciAqLworI2RlZmluZSBNU0VfSVJRCQkweDAyCS8qIE1vdXNlICovCisjZGVmaW5lIFVBUlQxX0lSUQkweDAzCS8qIFNlcmlhbDAgKi8KKyNkZWZpbmUgVUFSVDJfSVJRCTB4MDQJLyogU2VyaWFsMSAqLworLyogNSAtNyBhcmUgcmVzZXJ2ZWQgKi8KKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyBQRlggU0MxMjAwX01PRFVMRV9WRVI7CitzdGF0aWMgaW50IHRpbWVvdXQgPSAxOworc3RhdGljIGludCBpbyA9IC0xOworc3RhdGljIGludCBpb19sZW4gPSAyOwkJLyogZm9yIG5vbiBwbHVnIGFuZCBwbGF5ICovCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKK3N0YXRpYyBzcGlubG9ja190IHNjMTIwMHdkdF9sb2NrOwkvKiBpbyBwb3J0IGFjY2VzcyBzZXJpYWxpc2F0aW9uICovCisKKyNpZiBkZWZpbmVkIENPTkZJR19QTlAKK3N0YXRpYyBpbnQgaXNhcG5wID0gMTsKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldiAqd2R0X2RldjsKKworbW9kdWxlX3BhcmFtKGlzYXBucCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLCAiV2hlbiBzZXQgdG8gMCBkcml2ZXIgSVNBIFBuUCBzdXBwb3J0IHdpbGwgYmUgZGlzYWJsZWQiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiaW8gcG9ydCIpOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJyYW5nZSBpcyAwLTI1NSBtaW51dGVzLCBkZWZhdWx0IGlzIDEiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKworCisvKiBSZWFkIGZyb20gRGF0YSBSZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjMTIwMHdkdF9yZWFkX2RhdGEodW5zaWduZWQgY2hhciBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlzcGluX2xvY2soJnNjMTIwMHdkdF9sb2NrKTsKKwlvdXRiX3AoaW5kZXgsIFBNSVIpOworCSpkYXRhID0gaW5iKFBNRFIpOworCXNwaW5fdW5sb2NrKCZzYzEyMDB3ZHRfbG9jayk7Cit9CisKKworLyogV3JpdGUgdG8gRGF0YSBSZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjMTIwMHdkdF93cml0ZV9kYXRhKHVuc2lnbmVkIGNoYXIgaW5kZXgsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzcGluX2xvY2soJnNjMTIwMHdkdF9sb2NrKTsKKwlvdXRiX3AoaW5kZXgsIFBNSVIpOworCW91dGIoZGF0YSwgUE1EUik7CisJc3Bpbl91bmxvY2soJnNjMTIwMHdkdF9sb2NrKTsKK30KKworCitzdGF0aWMgdm9pZCBzYzEyMDB3ZHRfc3RhcnQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKworCXNjMTIwMHdkdF9yZWFkX2RhdGEoV0RDRiwgJnJlZyk7CisJLyogYXNzZXJ0IFdETyB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGludGVycnVwdHMgYXJlIHRyaWdnZXJlZCB0b28gKi8KKwlyZWcgfD0gKEtCQ19JUlEgfCBNU0VfSVJRIHwgVUFSVDFfSVJRIHwgVUFSVDJfSVJRKTsKKwlzYzEyMDB3ZHRfd3JpdGVfZGF0YShXRENGLCByZWcpOworCS8qIHNldCB0aGUgdGltZW91dCBhbmQgZ2V0IHRoZSBiYWxsIHJvbGxpbmcgKi8KKwlzYzEyMDB3ZHRfd3JpdGVfZGF0YShXRFRPLCB0aW1lb3V0KTsKK30KKworCitzdGF0aWMgdm9pZCBzYzEyMDB3ZHRfc3RvcCh2b2lkKQoreworCXNjMTIwMHdkdF93cml0ZV9kYXRhKFdEVE8sIDApOworfQorCisKKy8qIFRoaXMgcmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBXRE8gc2lnbmFsLCBpbmFjdGl2ZSBoaWdoLiAqLworc3RhdGljIGlubGluZSBpbnQgc2MxMjAwd2R0X3N0YXR1cyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmV0OworCisJc2MxMjAwd2R0X3JlYWRfZGF0YShXRFNULCAmcmV0KTsKKwkvKiBJZiB0aGUgYml0IGlzIGluYWN0aXZlLCB0aGUgd2F0Y2hkb2cgaXMgZW5hYmxlZCwgc28gcmV0dXJuCisJICogS0VFUEFMSVZFUElORyB3aGljaCBpcyBhIGJpdCBvZiBhIGtsdWRnZSBiZWNhdXNlIHRoZXJlJ3Mgbm90aGluZworCSAqIGVsc2UgZm9yIGVuYWJsZWQvZGlzYWJsZWQgc3RhdHVzCisJICovCisJcmV0dXJuIChyZXQgJiAweDAxKSA/IDAgOiBXRElPRl9LRUVQQUxJVkVQSU5HOwkvKiBiaXRzIDEgLSA3IGFyZSB1bmRlZmluZWQgKi8KK30KKworCitzdGF0aWMgaW50IHNjMTIwMHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCisJLyogYWxsb3cgb25lIGF0IGEgdGltZSAqLworCWlmIChkb3duX3RyeWxvY2soJm9wZW5fc2VtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICh0aW1lb3V0ID4gTUFYX1RJTUVPVVQpCisJCXRpbWVvdXQgPSBNQVhfVElNRU9VVDsKKworCXNjMTIwMHdkdF9zdGFydCgpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyBlbmFibGVkLCB0aW1lb3V0ID0gJWQgbWluKHMpIiwgdGltZW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNjMTIwMHdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld190aW1lb3V0OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMCwKKwkJLmlkZW50aXR5ID0gIlBDODczMDcvUEM5NzMwNyIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwkvKiBLZWVwIFBhdmVsIE1hY2hlayBhbXVzZWQgOykgKi8KKworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mIGlkZW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKHNjMTIwMHdkdF9zdGF0dXMoKSwgcCk7CisKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJc2MxMjAwd2R0X3dyaXRlX2RhdGEoV0RUTywgdGltZW91dCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKiB0aGUgQVBJIHN0YXRlcyB0aGlzIGlzIGdpdmVuIGluIHNlY3MgKi8KKwkJCW5ld190aW1lb3V0IC89IDYwOworCQkJaWYgKG5ld190aW1lb3V0IDwgMCB8fCBuZXdfdGltZW91dCA+IE1BWF9USU1FT1VUKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl0aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisJCQlzYzEyMDB3ZHRfd3JpdGVfZGF0YShXRFRPLCB0aW1lb3V0KTsKKwkJCS8qIGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIHRoZSBuZXcgdGltZW91dCAqLworCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0ICogNjAsIHApOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXNjMTIwMHdkdF9zdG9wKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJc2MxMjAwd2R0X3N0YXJ0KCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IHNjMTIwMHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJc2MxMjAwd2R0X3N0b3AoKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIGRpc2FibGVkXG4iKTsKKwl9IGVsc2UgeworCQlzYzEyMDB3ZHRfd3JpdGVfZGF0YShXRFRPLCB0aW1lb3V0KTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UhLCB0aW1lb3V0ID0gJWQgbWluKHMpXG4iLCB0aW1lb3V0KTsKKwl9CisJdXAoJm9wZW5fc2VtKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc2MxMjAwd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YStpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCXNjMTIwMHdkdF93cml0ZV9kYXRhKFdEVE8sIHRpbWVvdXQpOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2MxMjAwd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQlzYzEyMDB3ZHRfc3RvcCgpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2MxMjAwd2R0X25vdGlmaWVyID0KK3sKKwkubm90aWZpZXJfY2FsbCA9CXNjMTIwMHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2MxMjAwd2R0X2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gc2MxMjAwd2R0X3dyaXRlLAorCS5pb2N0bAkJPSBzYzEyMDB3ZHRfaW9jdGwsCisJLm9wZW4JCT0gc2MxMjAwd2R0X29wZW4sCisJLnJlbGVhc2UJPSBzYzEyMDB3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzYzEyMDB3ZHRfbWlzY2RldiA9Cit7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJnNjMTIwMHdkdF9mb3BzLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBzYzEyMDB3ZHRfcHJvYmUodm9pZCkKK3sKKwkvKiBUaGUgcHJvYmUgd29ya3MgYnkgcmVhZGluZyB0aGUgUE1DMyByZWdpc3RlcidzIGRlZmF1bHQgdmFsdWUgb2YgMHgwZQorCSAqIHRoZXJlIGlzIG9uZSBjYXZlYXQsIGlmIHRoZSBkZXZpY2UgZGlzYWJsZXMgdGhlIHBhcmFsbGVsIHBvcnQgb3IgYW55CisJICogb2YgdGhlIFVBUlRzIHdlIHdvbid0IGJlIGFibGUgdG8gZGV0ZWN0IGl0LgorCSAqIE5iLiBUaGlzIGNvdWxkIGJlIGRvbmUgd2l0aCBhY2N1cmFjeSBieSByZWFkaW5nIHRoZSBTSUQgcmVnaXN0ZXJzLCBidXQKKwkgKiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aG9zZSBpbyByZWdpb25zLgorCSAqLworCisJdW5zaWduZWQgY2hhciByZWc7CisKKwlzYzEyMDB3ZHRfcmVhZF9kYXRhKFBNQzMsICZyZWcpOworCXJlZyAmPSAweDBmOwkJCQkvKiB3ZSBkb24ndCB3YW50IHRoZSBVQVJUIGJ1c3kgYml0cyAqLworCXJldHVybiAocmVnID09IDB4MGUpID8gMCA6IC1FTk9ERVY7Cit9CisKKworI2lmIGRlZmluZWQgQ09ORklHX1BOUAorCitzdGF0aWMgc3RydWN0IHBucF9kZXZpY2VfaWQgc2NsMjAwd2R0X3BucF9kZXZpY2VzW10gPSB7CisJLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzA3L1BDOTczMDcgd2F0Y2hkb2cgY29tcG9uZW50ICovCisJey5pZCA9ICJOU0MwODAwIiwgLmRyaXZlcl9kYXRhID0gMH0sCisJey5pZCA9ICIifSwKK307CisKK3N0YXRpYyBpbnQgc2NsMjAwd2R0X3BucF9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqIGRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwkvKiB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIG9uZSBjYXJkIGF0IGEgdGltZSAqLworCWlmICh3ZHRfZGV2IHx8ICFpc2FwbnApCisJCXJldHVybiAtRUJVU1k7CisKKwl3ZHRfZGV2ID0gZGV2OworCWlvID0gcG5wX3BvcnRfc3RhcnQod2R0X2RldiwgMCk7CisJaW9fbGVuID0gcG5wX3BvcnRfbGVuKHdkdF9kZXYsIDApOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgaW9fbGVuLCBTQzEyMDBfTU9EVUxFX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBJTyBwb3J0ICUjeFxuIiwgaW8pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInNjbDIwMHdkdDogUG5QIGRldmljZSBmb3VuZCBhdCBpbyBwb3J0ICUjeC8lZFxuIiwgaW8sIGlvX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjbDIwMHdkdF9wbnBfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICogZGV2KQoreworCWlmICh3ZHRfZGV2KXsKKwkJcmVsZWFzZV9yZWdpb24oaW8sIGlvX2xlbik7CisJCXdkdF9kZXYgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIHNjbDIwMHdkdF9wbnBfZHJpdmVyID0geworCS5uYW1lCQk9ICJzY2wyMDB3ZHQiLAorCS5pZF90YWJsZQk9IHNjbDIwMHdkdF9wbnBfZGV2aWNlcywKKwkucHJvYmUJCT0gc2NsMjAwd2R0X3BucF9wcm9iZSwKKwkucmVtb3ZlCQk9IHNjbDIwMHdkdF9wbnBfcmVtb3ZlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKworCitzdGF0aWMgaW50IF9faW5pdCBzYzEyMDB3ZHRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoYmFubmVyKTsKKworCXNwaW5fbG9ja19pbml0KCZzYzEyMDB3ZHRfbG9jayk7CisJc2VtYV9pbml0KCZvcGVuX3NlbSwgMSk7CisKKyNpZiBkZWZpbmVkIENPTkZJR19QTlAKKwlpZiAoaXNhcG5wKSB7CisJCXJldCA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJnNjbDIwMHdkdF9wbnBfZHJpdmVyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2NsZWFuOworCX0KKyNlbmRpZgorCisJaWYgKGlvID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlvIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2NsZWFuOworCX0KKworI2lmIGRlZmluZWQgQ09ORklHX1BOUAorCS8qIG5vdyB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYW4gSU8gcG9ydCBhbmQgd2UgaGF2ZW4ndCBkZXRlY3RlZAorCSAqIGFueSBkZXZpY2VzLCBkaXNhYmxlIHBucCBzdXBwb3J0ICovCisJaXNhcG5wID0gMDsKKwlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJnNjbDIwMHdkdF9wbnBfZHJpdmVyKTsKKyNlbmRpZgorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgaW9fbGVuLCBTQzEyMDBfTU9EVUxFX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBJTyBwb3J0ICUjeFxuIiwgaW8pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2NsZWFuOworCX0KKworCXJldCA9IHNjMTIwMHdkdF9wcm9iZSgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lvOworCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzYzEyMDB3ZHRfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciBlcnIgPSAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfaW87CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3Rlcigmc2MxMjAwd2R0X21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3IgJWRcbiIsIFdBVENIRE9HX01JTk9SKTsKKwkJZ290byBvdXRfcmJ0OworCX0KKworCS8qIHJldCA9IDAgKi8KKworb3V0X2NsZWFuOgorCXJldHVybiByZXQ7CisKK291dF9yYnQ6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNjMTIwMHdkdF9ub3RpZmllcik7CisKK291dF9pbzoKKwlyZWxlYXNlX3JlZ2lvbihpbywgaW9fbGVuKTsKKworCWdvdG8gb3V0X2NsZWFuOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYzEyMDB3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmc2MxMjAwd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzYzEyMDB3ZHRfbm90aWZpZXIpOworCisjaWYgZGVmaW5lZCBDT05GSUdfUE5QCisJaWYoaXNhcG5wKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJnNjbDIwMHdkdF9wbnBfZHJpdmVyKTsKKwllbHNlCisjZW5kaWYKKwlyZWxlYXNlX3JlZ2lvbihpbywgaW9fbGVuKTsKK30KKworbW9kdWxlX2luaXQoc2MxMjAwd2R0X2luaXQpOworbW9kdWxlX2V4aXQoc2MxMjAwd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGNvbW1maXJlc2VydmljZXMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzMwNy9QQzk3MzA3IHdhdGNoZG9nIGNvbXBvbmVudCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjNTIwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjNTIwX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDE0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKQEAgLTAsMCArMSw0NDcgQEAKKy8qCisgKglBTUQgRWxhbiBTQzUyMCBwcm9jZXNzb3IgV2F0Y2hkb2cgVGltZXIgZHJpdmVyCisgKgorICogICAgICBCYXNlZCBvbiBhY3F1aXJld2R0LmMgYnkgQWxhbiBDb3gsCisgKiAgICAgICAgICAgYW5kIHNiYzYweHh3ZHQuYyBieSBKYWtvYiBPZXN0ZXJnYWFyZCA8amFrb2JAdW50aG91Z2h0Lm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBhdXRob3JzIGRvIE5PVCBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yCisgKglhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGluCisgKiAgICAgIHRoZSBob3BlIHRoYXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXJzLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSAgICBTY290dCBKZW5uaW5ncyA8bGludXhkcml2ZXJzQG9yby5uZXQ+CisgKiAgICAgICAgICAgOS8yNyAtIDIwMDEgICAgICBbSW5pdGlhbCByZWxlYXNlXQorICoKKyAqCUFkZGl0aW9uYWwgZml4ZXMgQWxhbiBDb3gKKyAqCS0JRml4ZWQgZm9ybWF0dGluZworICoJLQlSZW1vdmVkIGRlYnVnIHByaW50a3MKKyAqCS0JRml4ZWQgU01QIGJ1aWx0IGtlcm5lbCBkZWFkbG9jaworICoJLQlTd2l0Y2hlZCB0byBwcml2YXRlIGxvY2tzIG5vdCBsb2NrX2tlcm5lbAorICoJLQlVc2VkIGlvcmVtYXAvd3JpdGV3L3JlYWR3CisgKgktCUFkZGVkIE5PV0FZT1VUIHN1cHBvcnQKKyAqCTQvMTIgLSAyMDAyIENoYW5nZXMgYnkgUm9iIFJhZGV6IDxyb2JAb3NpbnZlc3Rvci5jb20+CisgKgktCUNoYW5nZSBjb21tZW50cworICoJLQlFbGltaW5hdGUgZm9wX2xsc2VlaworICoJLQlDaGFuZ2UgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIHNlbWFudGljcworICoJLQlBZGQgS0VSTl8qIHRhZ3MgdG8gcHJpbnRrcworICoJLQlmaXggcG9zc2libGUgd2R0X2lzX29wZW4gcmFjZQorICoJLQlSZXBvcnQgcHJvcGVyIGNhcGFiaWxpdGllcyBpbiB3YXRjaGRvZ19pbmZvCisgKgktCUFkZCBXRElPQ197R0VUU1RBVFVTLCBHRVRCT09UU1RBVFVTLCBTRVRUSU1FT1VULAorICoJCUdFVFRJTUVPVVQsIFNFVE9QVElPTlN9IGlvY3RscworICoJMDkvOCAtIDIwMDMgQ2hhbmdlcyBieSBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPgorICoJLQljbGVhbnVwIG9mIHRyYWlsaW5nIHNwYWNlcworICoJLQlhZGRlZCBleHRyYSBwcmludGsncyBmb3Igc3RhcnR1cCBwcm9ibGVtcworICoJLQl1c2UgbW9kdWxlX3BhcmFtCisgKgktCW1hZGUgdGltZW91dCAodGhlIGVtdWxhdGVkIGhlYXJ0YmVhdCkgYSBtb2R1bGVfcGFyYW0KKyAqCS0JbWFkZSB0aGUga2VlcGFsaXZlIHBpbmcgYW4gaW50ZXJuYWwgc3Vicm91dGluZQorICoJMy8yNyAtIDIwMDQgQ2hhbmdlcyBieSBTZWFuIFlvdW5nIDxzZWFuQG1lc3Mub3JnPgorICoJLQlzZXQgTU1DUl9CQVNFIHRvIDB4ZmZmZWYwMDAKKyAqCS0JQ0JBUiBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlYWQKKyAqCS0JcmVtb3ZlZCBkZWJ1Z2dpbmcgcHJpbnRrcworICoKKyAqICBUaGlzIFdEVCBkcml2ZXIgaXMgZGlmZmVyZW50IGZyb20gbW9zdCBvdGhlciBMaW51eCBXRFQKKyAqICBkcml2ZXJzIGluIHRoYXQgdGhlIGRyaXZlciB3aWxsIHBpbmcgdGhlIHdhdGNoZG9nIGJ5IGl0c2VsZiwKKyAqICBiZWNhdXNlIHRoaXMgcGFydGljdWxhciBXRFQgaGFzIGEgdmVyeSBzaG9ydCB0aW1lb3V0ICgxLjYKKyAqICBzZWNvbmRzKSBhbmQgaXQgd291bGQgYmUgaW5zYW5lIHRvIGNvdW50IG9uIGFueSB1c2Vyc3BhY2UKKyAqICBkYWVtb24gYWx3YXlzIGdldHRpbmcgc2NoZWR1bGVkIHdpdGhpbiB0aGF0IHRpbWUgZnJhbWUuCisgKgorICogIFRoaXMgZHJpdmVyIHVzZXMgbWVtb3J5IG1hcHBlZCBJTywgYW5kIHNwaW5sb2NrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgT1VSX05BTUUgInNjNTIwX3dkdCIKKyNkZWZpbmUgUEZYIE9VUl9OQU1FICI6ICIKKworLyoKKyAqIFRoZSBBTUQgRWxhbiBTQzUyMCB0aW1lb3V0IHZhbHVlIGlzIDQ5MnVzIHRpbWVzIGEgcG93ZXIgb2YgMiAoMC03KQorICoKKyAqICAgMDogNDkydXMgICAgMjogMS4wMXMgICAgNDogNC4wM3MgICA2OiAxNi4yMnMKKyAqICAgMTogNTAzbXMgICAgMzogMi4wMXMgICAgNTogOC4wNXMgICA3OiAzMi4yMXMKKyAqCisgKiBXZSB3aWxsIHByb2dyYW0gdGhlIFNDNTIwIHdhdGNoZG9nIGZvciBhIHRpbWVvdXQgb2YgMi4wMXMuCisgKiBJZiB3ZSByZXNldCB0aGUgd2F0Y2hkb2cgZXZlcnkgfjI1MG1zIHdlIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNkZWZpbmUgV0RUX0lOVEVSVkFMIChIWi80KzEpCisKKy8qCisgKiBXZSBtdXN0IG5vdCByZXF1aXJlIHRvbyBnb29kIHJlc3BvbnNlIGZyb20gdGhlIHVzZXJzcGFjZSBkYWVtb24uCisgKiBIZXJlIHdlIHJlcXVpcmUgdGhlIHVzZXJzcGFjZSBkYWVtb24gdG8gc2VuZCB1cyBhIGhlYXJ0YmVhdAorICogY2hhciB0byAvZGV2L3dhdGNoZG9nIGV2ZXJ5IDMwIHNlY29uZHMuCisgKi8KKworI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDMwCQkvKiAzMCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzLCB3aWxsIGJlIG11bHRpcGxpZWQgYnkgSFogdG8gZ2V0IHNlY29uZHMgdG8gd2FpdCBmb3IgYSBwaW5nICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gKDE8PXRpbWVvdXQ8PTM2MDAsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKiBBTUQgRWxhbiBTQzUyMCAtIFdhdGNoZG9nIFRpbWVyIFJlZ2lzdGVycworICovCisjZGVmaW5lIE1NQ1JfQkFTRQkweGZmZmVmMDAwCS8qIFRoZSBkZWZhdWx0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBPRkZTX1dEVE1SQ1RMCTB4Q0IwCS8qIFdhdGNoZG9nIFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworLyogV0RUIENvbnRyb2wgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFdEVF9FWFBfU0VMXzAxCTB4MDAwMQkvKiBbMDFdIFRpbWUtb3V0ID0gNDk2IHVzICh3aXRoIDMzIE1oeiBjbGspLiAqLworI2RlZmluZSBXRFRfRVhQX1NFTF8wMgkweDAwMDIJLyogWzAyXSBUaW1lLW91dCA9IDUwOCBtcyAod2l0aCAzMyBNaHogY2xrKS4gKi8KKyNkZWZpbmUgV0RUX0VYUF9TRUxfMDMJMHgwMDA0CS8qIFswM10gVGltZS1vdXQgPSAxLjAyIHMgKHdpdGggMzMgTWh6IGNsaykuICovCisjZGVmaW5lIFdEVF9FWFBfU0VMXzA0CTB4MDAwOAkvKiBbMDRdIFRpbWUtb3V0ID0gMi4wMyBzICh3aXRoIDMzIE1oeiBjbGspLiAqLworI2RlZmluZSBXRFRfRVhQX1NFTF8wNQkweDAwMTAJLyogWzA1XSBUaW1lLW91dCA9IDQuMDcgcyAod2l0aCAzMyBNaHogY2xrKS4gKi8KKyNkZWZpbmUgV0RUX0VYUF9TRUxfMDYJMHgwMDIwCS8qIFswNl0gVGltZS1vdXQgPSA4LjEzIHMgKHdpdGggMzMgTWh6IGNsaykuICovCisjZGVmaW5lIFdEVF9FWFBfU0VMXzA3CTB4MDA0MAkvKiBbMDddIFRpbWUtb3V0ID0gMTYuMjdzICh3aXRoIDMzIE1oeiBjbGspLiAqLworI2RlZmluZSBXRFRfRVhQX1NFTF8wOAkweDAwODAJLyogWzA4XSBUaW1lLW91dCA9IDMyLjU0cyAod2l0aCAzMyBNaHogY2xrKS4gKi8KKyNkZWZpbmUgV0RUX0lSUV9GTEcJMHgxMDAwCS8qIFsxMl0gSW50ZXJydXB0IFJlcXVlc3QgRmxhZyAqLworI2RlZmluZSBXRFRfV1JTVF9FTkIJMHg0MDAwCS8qIFsxNF0gV2F0Y2hkb2cgVGltZXIgUmVzZXQgRW5hYmxlICovCisjZGVmaW5lIFdEVF9FTkIJCTB4ODAwMAkvKiBbMTVdIFdhdGNoZG9nIFRpbWVyIEVuYWJsZSAqLworCitzdGF0aWMgX191MTYgX19pb21lbSAqd2R0bXJjdGw7CisKK3N0YXRpYyB2b2lkIHdkdF90aW1lcl9waW5nKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9oZWFydGJlYXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIHdkdF9leHBlY3RfY2xvc2U7CitzdGF0aWMgc3BpbmxvY2tfdCB3ZHRfc3BpbmxvY2s7CisKKy8qCisgKglXaGFjayB0aGUgZG9nCisgKi8KKworc3RhdGljIHZvaWQgd2R0X3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIElmIHdlIGdvdCBhIGhlYXJ0YmVhdCBwdWxzZSB3aXRoaW4gdGhlIFdEVF9VU19JTlRFUlZBTAorCSAqIHdlIGFncmVlIHRvIHBpbmcgdGhlIFdEVAorCSAqLworCWlmKHRpbWVfYmVmb3JlKGppZmZpZXMsIG5leHRfaGVhcnRiZWF0KSkKKwl7CisJCS8qIFBpbmcgdGhlIFdEVCAqLworCQlzcGluX2xvY2soJndkdF9zcGlubG9jayk7CisJCXdyaXRldygweEFBQUEsIHdkdG1yY3RsKTsKKwkJd3JpdGV3KDB4NTU1NSwgd2R0bXJjdGwpOworCQlzcGluX3VubG9jaygmd2R0X3NwaW5sb2NrKTsKKworCQkvKiBSZS1zZXQgdGhlIHRpbWVyIGludGVydmFsICovCisJCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCQlhZGRfdGltZXIoJnRpbWVyKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSGVhcnRiZWF0IGxvc3QhIFdpbGwgbm90IHBpbmcgdGhlIHdhdGNoZG9nXG4iKTsKKwl9Cit9CisKKy8qCisgKglVdGlsaXR5IHJvdXRpbmVzCisgKi8KKworc3RhdGljIHZvaWQgd2R0X2NvbmZpZyhpbnQgd3JpdGV2YWwpCit7CisJX191MTYgZHVtbXk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGJ1eSBzb21lIHRpbWUgKHBpbmcpICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkdF9zcGlubG9jaywgZmxhZ3MpOworCWR1bW15PXJlYWR3KHdkdG1yY3RsKTsJLyogZW5zdXJlIHdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworCXdyaXRldygweEFBQUEsIHdkdG1yY3RsKTsKKwl3cml0ZXcoMHg1NTU1LCB3ZHRtcmN0bCk7CisJLyogdW5sb2NrIFdEVCA9IG1ha2UgV0RUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgd3JpdGFibGUgb25lIHRpbWUgKi8KKwl3cml0ZXcoMHgzMzMzLCB3ZHRtcmN0bCk7CisJd3JpdGV3KDB4Q0NDQywgd2R0bXJjdGwpOworCS8qIHdyaXRlIFdEVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJd3JpdGV3KHdyaXRldmFsLCB3ZHRtcmN0bCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0X3NwaW5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgd2R0X3N0YXJ0dXAodm9pZCkKK3sKKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciAqLworCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCWFkZF90aW1lcigmdGltZXIpOworCisJLyogU3RhcnQgdGhlIHdhdGNoZG9nICovCisJd2R0X2NvbmZpZyhXRFRfRU5CIHwgV0RUX1dSU1RfRU5CIHwgV0RUX0VYUF9TRUxfMDQpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGlzIG5vdyBlbmFibGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2R0X3R1cm5vZmYodm9pZCkKK3sKKwkvKiBTdG9wIHRoZSB0aW1lciAqLworCWRlbF90aW1lcigmdGltZXIpOworCisJLyogU3RvcCB0aGUgd2F0Y2hkb2cgKi8KKwl3ZHRfY29uZmlnKDApOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGlzIG5vdyBkaXNhYmxlZC4uLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCS8qIHVzZXIgbGFuZCBwaW5nICovCisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKHRpbWVvdXQgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2R0X3NldF9oZWFydGJlYXQoaW50IHQpCit7CisJaWYgKCh0IDwgMSkgfHwgKHQgPiAzNjAwKSkJLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJCXJldHVybiAtRUlOVkFMOworCisJdGltZW91dCA9IHQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgZm9wX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IG9mczsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQl3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogbm93IHNjYW4gKi8KKwkJCWZvcihvZnMgPSAwOyBvZnMgIT0gY291bnQ7IG9mcysrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBvZnMpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZihjID09ICdWJykKKwkJCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogV2VsbCwgYW55aG93IHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZXR1cm4gdGhhdCBmYXZvdXIgKi8KKwkJd2R0X2tlZXBhbGl2ZSgpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZm9wX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKworCS8qIEp1c3QgaW4gY2FzZSB3ZSdyZSBhbHJlYWR5IHRhbGtpbmcgdG8gc29tZW9uZS4uLiAqLworCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBHb29kLCBmaXJlIHVwIHRoZSBzaG93ICovCisJd2R0X3N0YXJ0dXAoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmb3BfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlpZih3ZHRfZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCXdkdF90dXJub2ZmKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOworCXdkdF9leHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZvcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJTQzUyMCIsCisJfTsKKworCXN3aXRjaChjbWQpCisJeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpPy1FRkFVTFQ6MDsKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmKGdldF91c2VyKG5ld19vcHRpb25zLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXdkdF90dXJub2ZmKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYobmV3X29wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJd2R0X3N0YXJ0dXAoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IG5ld190aW1lb3V0OworCisJCQlpZihnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCX0KKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBmb3Bfd3JpdGUsCisJLm9wZW4JCT0gZm9wX29wZW4sCisJLnJlbGVhc2UJPSBmb3BfY2xvc2UsCisJLmlvY3RsCQk9IGZvcF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpCisJCXdkdF90dXJub2ZmKCk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IHNjNTIwX3dkdF91bmxvYWQodm9pZCkKK3sKKwlpZiAoIW5vd2F5b3V0KQorCQl3ZHRfdHVybm9mZigpOworCisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlvdW5tYXAod2R0bXJjdGwpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzYzUyMF93ZHRfaW5pdCh2b2lkKQoreworCWludCByYyA9IC1FQlVTWTsKKworCXNwaW5fbG9ja19pbml0KCZ3ZHRfc3BpbmxvY2spOworCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmZ1bmN0aW9uID0gd2R0X3RpbWVyX3Bpbmc7CisJdGltZXIuZGF0YSA9IDA7CisKKwkvKiBDaGVjayB0aGF0IHRoZSB0aW1lb3V0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDE8PXRpbWVvdXQ8PTM2MDAsIHVzaW5nICVkXG4iLAorCQkJV0FUQ0hET0dfVElNRU9VVCk7CisJfQorCisJd2R0bXJjdGwgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKShNTUNSX0JBU0UgKyBPRkZTX1dEVE1SQ1RMKSwgMik7CisJaWYgKCF3ZHRtcmN0bCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVtYXAgbWVtb3J5XG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uMjsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJjKTsKKwkJZ290byBlcnJfb3V0X2lvcmVtYXA7CisJfQorCisJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJjKTsKKwkJZ290byBlcnJfb3V0X25vdGlmaWVyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXRFQgZHJpdmVyIGZvciBTQzUyMCBpbml0aWFsaXNlZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCxub3dheW91dCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9ub3RpZmllcjoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKK2Vycl9vdXRfaW9yZW1hcDoKKwlpb3VubWFwKHdkdG1yY3RsKTsKK2Vycl9vdXRfcmVnaW9uMjoKKwlyZXR1cm4gcmM7Cit9CisKK21vZHVsZV9pbml0KHNjNTIwX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KHNjNTIwX3dkdF91bmxvYWQpOworCitNT0RVTEVfQVVUSE9SKCJTY290dCBhbmQgQmlsbCBKZW5uaW5ncyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdhdGNoZG9nIHRpbWVyIGluIEFNRCBcIkVsYW5cIiBTQzUyMCB1UHJvY2Vzc29yIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2N4MjAwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjeDIwMF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY5NjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjeDIwMF93ZHQuYwpAQCAtMCwwICsxLDI3NCBAQAorLyogZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjeDIwMF93ZHQuYworCisgICBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFNDeDIwMCBXYXRjaGRvZyBzdXBwb3J0CisKKyAgIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPgorCisgICBTb21lIGNvZGUgdGFrZW4gZnJvbToKKyAgIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzMwNy9QQzk3MzA3IChhbGEgU0MxMjAwKSBXRFQgZHJpdmVyCisgICAoYykgQ29weXJpZ2h0IDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBjb21tZmlyZXNlcnZpY2VzLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIGF1dGhvcihzKSBvZiB0aGlzIHNvZnR3YXJlIHNoYWxsIG5vdCBiZSBoZWxkIGxpYWJsZSBmb3IgZGFtYWdlcworICAgb2YgYW55IG5hdHVyZSByZXN1bHRpbmcgZHVlIHRvIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcworICAgc29mdHdhcmUgaXMgcHJvdmlkZWQgQVMtSVMgd2l0aCBubyB3YXJyYW50aWVzLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjeDIwMC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBOQU1FICJzY3gyMDBfd2R0IgorCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0U2VtaSBTQ3gyMDAgV2F0Y2hkb2cgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKKyNpZm5kZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisjZGVmaW5lIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCAwCisjZW5kaWYKKworc3RhdGljIGludCBtYXJnaW4gPSA2MDsJCS8qIGluIHNlY29uZHMgKi8KK21vZHVsZV9wYXJhbShtYXJnaW4sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hcmdpbiwgIldhdGNoZG9nIG1hcmdpbiBpbiBzZWNvbmRzIik7CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiRGlzYWJsZSB3YXRjaGRvZyBzaHV0ZG93biBvbiBjbG9zZSIpOworCitzdGF0aWMgdTE2IHdkdG9fcmVzdGFydDsKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtYXBob3JlOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworCisvKiBCaXRzIG9mIHRoZSBXRENORkcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgV19FTkFCTEUgMHgwMGZhCQkvKiBFbmFibGUgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgV19ESVNBQkxFIDB4MDAwMAkvKiBEaXNhYmxlIHdhdGNoZG9nICovCisKKy8qIFRoZSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIHRpbWVyLCB0aGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIFdfRU5BQkxFICovCisjZGVmaW5lIFdfU0NBTEUgKDMyNzY4LzEwMjQpCisKK3N0YXRpYyB2b2lkIHNjeDIwMF93ZHRfcGluZyh2b2lkKQoreworCW91dHcod2R0b19yZXN0YXJ0LCBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfV0RUTyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjeDIwMF93ZHRfdXBkYXRlX21hcmdpbih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiB0aW1lciBtYXJnaW4gJWQgc2Vjb25kc1xuIiwgbWFyZ2luKTsKKwl3ZHRvX3Jlc3RhcnQgPSBtYXJnaW4gKiBXX1NDQUxFOworfQorCitzdGF0aWMgdm9pZCBzY3gyMDBfd2R0X2VuYWJsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZW5hYmxpbmcgd2F0Y2hkb2cgdGltZXIsIHdkdG9fcmVzdGFydCA9ICVkXG4iLAorCSAgICAgICB3ZHRvX3Jlc3RhcnQpOworCisJb3V0dygwLCBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfV0RUTyk7CisJb3V0YihTQ3gyMDBfV0RUX1dEU1RTX1dET1ZGLCBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfV0RTVFMpOworCW91dHcoV19FTkFCTEUsIHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9XRENORkcpOworCisJc2N4MjAwX3dkdF9waW5nKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjeDIwMF93ZHRfZGlzYWJsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZGlzYWJsaW5nIHdhdGNoZG9nIHRpbWVyXG4iKTsKKworCW91dHcoMCwgc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX1dEVE8pOworCW91dGIoU0N4MjAwX1dEVF9XRFNUU19XRE9WRiwgc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX1dEU1RTKTsKKwlvdXR3KFdfRElTQUJMRSwgc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX1dEQ05GRyk7Cit9CisKK3N0YXRpYyBpbnQgc2N4MjAwX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIG9ubHkgYWxsb3cgb25lIGF0IGEgdGltZSAqLworCWlmIChkb3duX3RyeWxvY2soJm9wZW5fc2VtYXBob3JlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlzY3gyMDBfd2R0X2VuYWJsZSgpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHNjeDIwMF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZXhwZWN0X2Nsb3NlICE9IDQyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTkFNRSAiOiB3YXRjaGRvZyBkZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseSwgd2lsbCBub3QgZGlzYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXJcbiIpOworCX0gZWxzZSBpZiAoIW5vd2F5b3V0KSB7CisJCXNjeDIwMF93ZHRfZGlzYWJsZSgpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCXVwKCZvcGVuX3NlbWFwaG9yZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY3gyMDBfd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19IQUxUIHx8IGNvZGUgPT0gU1lTX1BPV0VSX09GRikKKwkJaWYgKCFub3dheW91dCkKKwkJCXNjeDIwMF93ZHRfZGlzYWJsZSgpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNjeDIwMF93ZHRfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gc2N4MjAwX3dkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2N4MjAwX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogY2hlY2sgZm9yIGEgbWFnaWMgY2xvc2UgY2hhcmFjdGVyICovCisJaWYgKGxlbikKKwl7CisJCXNpemVfdCBpOworCisJCXNjeDIwMF93ZHRfcGluZygpOworCisJCWV4cGVjdF9jbG9zZSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJY2hhciBjOworCQkJaWYgKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoYyA9PSAnVicpCisJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCX0KKworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjeDIwMF93ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkuaWRlbnRpdHkgPSAiTmF0U2VtaSBTQ3gyMDAgV2F0Y2hkb2ciLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5vcHRpb25zID0gKFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HKSwKKwl9OworCWludCBuZXdfbWFyZ2luOworCisJc3dpdGNoIChjbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAocHV0X3VzZXIoMCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXNjeDIwMF93ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfbWFyZ2luLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobmV3X21hcmdpbiA8IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWFyZ2luID0gbmV3X21hcmdpbjsKKwkJc2N4MjAwX3dkdF91cGRhdGVfbWFyZ2luKCk7CisJCXNjeDIwMF93ZHRfcGluZygpOworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaWYgKHB1dF91c2VyKG1hcmdpbiwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY3gyMDBfd2R0X2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorCS53cml0ZSAgID0gc2N4MjAwX3dkdF93cml0ZSwKKwkuaW9jdGwgICA9IHNjeDIwMF93ZHRfaW9jdGwsCisJLm9wZW4gICAgPSBzY3gyMDBfd2R0X29wZW4sCisJLnJlbGVhc2UgPSBzY3gyMDBfd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc2N4MjAwX3dkdF9taXNjZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lICA9IE5BTUUsCisJLmZvcHMgID0gJnNjeDIwMF93ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNjeDIwMF93ZHRfaW5pdCh2b2lkKQoreworCWludCByOworCisJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBOYXRTZW1pIFNDeDIwMCBXYXRjaGRvZyBEcml2ZXJcbiIpOworCisJLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGZvdW5kIHRoZSBjb25maWd1cmF0aW9uIGJsb2NrICovCisJaWYgKCFzY3gyMDBfY2JfcHJlc2VudCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX09GRlNFVCwKKwkJCSAgICBTQ3gyMDBfV0RUX1NJWkUsCisJCQkgICAgIk5hdFNlbWkgU0N4MjAwIFdhdGNoZG9nIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICI6IHdhdGNoZG9nIEkvTyByZWdpb24gYnVzeVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc2N4MjAwX3dkdF91cGRhdGVfbWFyZ2luKCk7CisJc2N4MjAwX3dkdF9kaXNhYmxlKCk7CisKKwlzZW1hX2luaXQoJm9wZW5fc2VtYXBob3JlLCAxKTsKKworCXIgPSBtaXNjX3JlZ2lzdGVyKCZzY3gyMDBfd2R0X21pc2NkZXYpOworCWlmIChyKSB7CisJCXJlbGVhc2VfcmVnaW9uKHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9PRkZTRVQsCisJCQkJU0N4MjAwX1dEVF9TSVpFKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc2N4MjAwX3dkdF9ub3RpZmllcik7CisJaWYgKHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogdW5hYmxlIHRvIHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciIpOworCQltaXNjX2RlcmVnaXN0ZXIoJnNjeDIwMF93ZHRfbWlzY2Rldik7CisJCXJlbGVhc2VfcmVnaW9uKHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9PRkZTRVQsCisJCQkJU0N4MjAwX1dEVF9TSVpFKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY3gyMDBfd2R0X2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc2N4MjAwX3dkdF9ub3RpZmllcik7CisJbWlzY19kZXJlZ2lzdGVyKCZzY3gyMDBfd2R0X21pc2NkZXYpOworCXJlbGVhc2VfcmVnaW9uKHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9PRkZTRVQsCisJCSAgICAgICBTQ3gyMDBfV0RUX1NJWkUpOworfQorCittb2R1bGVfaW5pdChzY3gyMDBfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoc2N4MjAwX3dkdF9jbGVhbnVwKTsKKworLyoKKyAgICBMb2NhbCB2YXJpYWJsZXM6CisgICAgICAgIGNvbXBpbGUtY29tbWFuZDogIm1ha2UgLWsgLUMgLi4vLi4gU1VCRElSUz1kcml2ZXJzL2NoYXIgbW9kdWxlcyIKKyAgICAgICAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAgICBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Nod2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM5MjcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Nod2R0LmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBkcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYworICoKKyAqIFdhdGNoZG9nIGRyaXZlciBmb3IgaW50ZWdyYXRlZCB3YXRjaGRvZyBpbiB0aGUgU3VwZXJIIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAxNC1EZWMtMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAgICAgQWRkZWQgbm93YXlvdXQgbW9kdWxlIG9wdGlvbiB0byBvdmVycmlkZSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKyAqCisgKiAxOS1BcHItMjAwMiBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4KKyAqICAgICBBZGRlZCBleHBlY3QgY2xvc2Ugc3VwcG9ydCwgbWFkZSBlbXVsYXRlZCB0aW1lb3V0IHJ1bnRpbWUgY2hhbmdlYWJsZQorICogICAgIGdlbmVyYWwgY2xlYW51cHMsIGFkZCBzb21lIGlvY3RscworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS93YXRjaGRvZy5oPgorCisjZGVmaW5lIFBGWCAic2h3ZHQ6ICIKKworLyoKKyAqIERlZmF1bHQgY2xvY2sgZGl2aXNpb24gcmF0aW8gaXMgNS4yNSBtc2Vjcy4gRm9yIGFuIGFkZGl0aW9uYWwgdGFibGUgb2YKKyAqIHZhbHVlcywgY29uc3VsdCB0aGUgYXNtLXNoL3dhdGNoZG9nLmguIE92ZXJsb2FkIHRoaXMgYXQgbW9kdWxlIGxvYWQKKyAqIHRpbWUuCisgKgorICogSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayByZWxpYWJseSB3ZSBuZWVkIHRvIGhhdmUgSFogc2V0IHRvIDEwMDAgb3IKKyAqIHNvbWV0aGluZyBxdWl0ZSBoaWdoZXIgdGhhbiAxMDAgKG9yIHdlIG5lZWQgYSBwcm9wZXIgaGlnaC1yZXMgdGltZXIKKyAqIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBkZWFsIHdpdGggdGhpcyBwcm9wZXJseSksIG90aGVyd2lzZSB0aGUgMTBtcworICogcmVzb2x1dGlvbiBvZiBhIGppZmZ5IGlzIGVub3VnaCB0byB0cmlnZ2VyIHRoZSBvdmVyZmxvdy4gRm9yIHRoaW5ncyBsaWtlCisgKiB0aGUgU0gtNCBhbmQgU0gtNSwgdGhpcyBpc24ndCBuZWNlc3NhcmlseSB0aGF0IGJpZyBvZiBhIHByb2JsZW0sIHRob3VnaAorICogZm9yIHRoZSBTSC0yIGFuZCBTSC0zLCB0aGlzIGlzbid0IHJlY29tbWVuZGVkIHVubGVzcyB0aGUgV0RUIGlzIGFic29sdXRlbHkKKyAqIG5lY3NzYXJ5LgorICoKKyAqIEFzIGEgcmVzdWx0IG9mIHRoaXMgdGltaW5nIHByb2JsZW0sIHRoZSBvbmx5IG1vZGVzIHRoYXQgYXJlIHBhcnRpY3VsYXJseQorICogZmVhc2libGUgYXJlIHRoZSA0MDk2IGFuZCB0aGUgMjA0OCBkaXZpc29ycywgd2hpY2ggeWVpbGQgNS4yNSBhbmQgMi42Mm1zCisgKiBvdmVyZmxvdyBwZXJpb2RzIHJlc3BlY3RpdmVseS4KKyAqCisgKiBBbHNvLCBzaW5jZSB3ZSBjYW4ndCByZWFsbHkgZXhwZWN0IHVzZXJzcGFjZSB0byBiZSByZXNwb25zaXZlIGVub3VnaAorICogYmVmb3JlIHRoZSBvdmVyZmxvdyBoYXBwZW5zLCB3ZSBtYWludGFpbiB0d28gc2VwZXJhdGUgdGltZXJzIC4uIE9uZSBpbgorICogdGhlIGtlcm5lbCBmb3IgY2xlYXJpbmcgb3V0IFdPVkYgZXZlcnkgMm1zIG9yIHNvIChhZ2FpbiwgdGhpcyBkZXBlbmRzIG9uCisgKiBIWiA9PSAxMDAwKSwgYW5kIGFub3RoZXIgZm9yIG1vbml0b3JpbmcgdXNlcnNwYWNlIHdyaXRlcyB0byB0aGUgV0RUIGRldmljZS4KKyAqCisgKiBBcyBzdWNoLCB3ZSBjdXJyZW50bHkgdXNlIGEgY29uZmlndXJhYmxlIGhlYXJ0YmVhdCBpbnRlcnZhbCB3aGljaCBkZWZhdWx0cworICogdG8gMzBzLiBJbiB0aGlzIGNhc2UsIHRoZSB1c2Vyc3BhY2UgZGFlbW9uIGlzIG9ubHkgcmVzcG9uc2libGUgZm9yIHBlcmlvZGljCisgKiB3cml0ZXMgdG8gdGhlIGRldmljZSBiZWZvcmUgdGhlIG5leHQgaGVhcnRiZWF0IGlzIHNjaGVkdWxlZC4gSWYgdGhlIGRhZW1vbgorICogbWlzc2VzIGl0cyBkZWFkbGluZSwgdGhlIGtlcm5lbCB0aW1lciB3aWxsIGFsbG93IHRoZSBXRFQgdG8gb3ZlcmZsb3cuCisgKi8KK3N0YXRpYyBpbnQgY2xvY2tfZGl2aXNpb25fcmF0aW8gPSBXVENTUl9DS1NfNDA5NjsKKworI2RlZmluZSBuZXh0X3BpbmdfcGVyaW9kKGNrcykJbXNlY3NfdG9famlmZmllcyhja3MgLSA0KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaHdkdF9pc19vcGVuOworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHNoX3dkdF9pbmZvOworc3RhdGljIGNoYXIgc2h3ZHRfZXhwZWN0X2Nsb3NlOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9oZWFydGJlYXQ7CisKKyNkZWZpbmUgV0FUQ0hET0dfSEVBUlRCRUFUIDMwCQkJLyogMzAgc2VjIGRlZmF1bHQgaGVhcnRiZWF0ICovCitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9IFdBVENIRE9HX0hFQVJUQkVBVDsJLyogaW4gc2Vjb25kcyAqLworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCisvKioKKyAqIAlzaF93ZHRfc3RhcnQgLSBTdGFydCB0aGUgV2F0Y2hkb2cKKyAqCisgKiAJU3RhcnRzIHRoZSB3YXRjaGRvZy4KKyAqLworc3RhdGljIHZvaWQgc2hfd2R0X3N0YXJ0KHZvaWQpCit7CisJX191OCBjc3I7CisKKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAoaGVhcnRiZWF0ICogSFopOworCW1vZF90aW1lcigmdGltZXIsIG5leHRfcGluZ19wZXJpb2QoY2xvY2tfZGl2aXNpb25fcmF0aW8pKTsKKworCWNzciA9IHNoX3dkdF9yZWFkX2NzcigpOworCWNzciB8PSBXVENTUl9XVCB8IGNsb2NrX2RpdmlzaW9uX3JhdGlvOworCXNoX3dkdF93cml0ZV9jc3IoY3NyKTsKKworCXNoX3dkdF93cml0ZV9jbnQoMCk7CisKKwkvKgorCSAqIFRoZXNlIHByb2Nlc3NvcnMgaGF2ZSBhIGJpdCBvZiBhbiBpbmNvbnNpc3RlbnQgaW5pdGlhbGl6YXRpb24KKwkgKiBwcm9jZXNzLi4gc3RhcnRpbmcgd2l0aCBTSC0zLCBSU1RTIHdhcyBtb3ZlZCB0byBXVENTUiwgYW5kIHRoZQorCSAqIFJTVENTUiByZWdpc3RlciB3YXMgcmVtb3ZlZC4KKwkgKgorCSAqIE9uIHRoZSBTSC0yIGhvd2V2ZXIsIGluIGFkZGl0aW9uIHdpdGggYml0cyBiZWluZyBpbiBkaWZmZXJlbnQKKwkgKiBsb2NhdGlvbnMsIHdlIG11c3QgZGVhbCB3aXRoIFJTVENTUiBvdXRyaWdodC4uCisJICovCisJY3NyID0gc2hfd2R0X3JlYWRfY3NyKCk7CisJY3NyIHw9IFdUQ1NSX1RNRTsKKwljc3IgJj0gfldUQ1NSX1JTVFM7CisJc2hfd2R0X3dyaXRlX2Nzcihjc3IpOworCisjaWZkZWYgQ09ORklHX0NQVV9TSDIKKwkvKgorCSAqIFdob2V2ZXIgY2FtZSB1cCB3aXRoIHRoZSBSU1RDU1Igc2VtYW50aWNzIG11c3QndmUgYmVlbiBzbW9raW5nCisJICogc29tZSBvZiB0aGUgZ29vZCBzdHVmZiwgc2luY2UgaW4gYWRkaXRpb24gdG8gdGhlIFdUQ1NSL1dUQ05UIHdyaXRlCisJICogYnJhaW4tZGFtYWdlLCBpdCdzIG1hbmFnZWQgdG8gZnVjayB0aGluZ3MgdXAgb25lIHN0ZXAgZnVydGhlci4uCisJICoKKwkgKiBJZiB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBXT1ZGIGJpdCwgdGhlIHVwcGVyIGJ5dGUgaGFzIHRvIGJlIDB4YTUuLgorCSAqIGJ1dCBpZiB3ZSB3YW50IHRvIHRvdWNoIFJTVEUgb3IgUlNUUywgdGhlIHVwcGVyIGJ5dGUgaGFzIHRvIGJlCisJICogMHg1YS4uCisJICovCisJY3NyID0gc2hfd2R0X3JlYWRfcnN0Y3NyKCk7CisJY3NyICY9IH5SU1RDU1JfUlNUUzsKKwlzaF93ZHRfd3JpdGVfcnN0Y3NyKGNzcik7CisjZW5kaWYKK30KKworLyoqCisgKiAJc2hfd2R0X3N0b3AgLSBTdG9wIHRoZSBXYXRjaGRvZworICoKKyAqIAlTdG9wcyB0aGUgd2F0Y2hkb2cuCisgKi8KK3N0YXRpYyB2b2lkIHNoX3dkdF9zdG9wKHZvaWQpCit7CisJX191OCBjc3I7CisKKwlkZWxfdGltZXIoJnRpbWVyKTsKKworCWNzciA9IHNoX3dkdF9yZWFkX2NzcigpOworCWNzciAmPSB+V1RDU1JfVE1FOworCXNoX3dkdF93cml0ZV9jc3IoY3NyKTsKK30KKworLyoqCisgKiAJc2hfd2R0X2tlZXBhbGl2ZSAtIEtlZXAgdGhlIFVzZXJzcGFjZSBXYXRjaGRvZyBBbGl2ZQorICoKKyAqIAlUaGUgVXNlcnNwYWNlIHdhdGNoZG9nIGdvdCBhIEtlZXBBbGl2ZTogc2NoZWR1bGUgdGhlIG5leHQgaGVhcnRiZWF0LgorICovCitzdGF0aWMgdm9pZCBzaF93ZHRfa2VlcGFsaXZlKHZvaWQpCit7CisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKGhlYXJ0YmVhdCAqIEhaKTsKK30KKworLyoqCisgKiAJc2hfd2R0X3NldF9oZWFydGJlYXQgLSBTZXQgdGhlIFVzZXJzcGFjZSBXYXRjaGRvZyBoZWFydGJlYXQKKyAqCisgKiAJU2V0IHRoZSBVc2Vyc3BhY2UgV2F0Y2hkb2cgaGVhcnRiZWF0CisgKi8KK3N0YXRpYyBpbnQgc2hfd2R0X3NldF9oZWFydGJlYXQoaW50IHQpCit7CisJaWYgKCh0IDwgMSkgfHwgKHQgPiAzNjAwKSkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJCXJldHVybiAtRUlOVkFMOworCisJaGVhcnRiZWF0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAJc2hfd2R0X3BpbmcgLSBQaW5nIHRoZSBXYXRjaGRvZworICoKKyAqCUBkYXRhOiBVbnVzZWQKKyAqCisgKiAJQ2xlYXJzIG92ZXJmbG93IGJpdCwgcmVzZXRzIHRpbWVyIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNoX3dkdF9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKSB7CisJCV9fdTggY3NyOworCisJCWNzciA9IHNoX3dkdF9yZWFkX2NzcigpOworCQljc3IgJj0gfldUQ1NSX0lPVkY7CisJCXNoX3dkdF93cml0ZV9jc3IoY3NyKTsKKworCQlzaF93ZHRfd3JpdGVfY250KDApOworCisJCW1vZF90aW1lcigmdGltZXIsIG5leHRfcGluZ19wZXJpb2QoY2xvY2tfZGl2aXNpb25fcmF0aW8pKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSGVhcnRiZWF0IGxvc3QhIFdpbGwgbm90IHBpbmcgdGhlIHdhdGNoZG9nXG4iKTsKKwl9Cit9CisKKy8qKgorICogCXNoX3dkdF9vcGVuIC0gT3BlbiB0aGUgRGV2aWNlCisgKgorICogCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKiAJQGZpbGU6IGZpbGUgaGFuZGxlIG9mIGRldmljZQorICoKKyAqIAlXYXRjaGRvZyBkZXZpY2UgaXMgb3BlbmVkIGFuZCBzdGFydGVkLgorICovCitzdGF0aWMgaW50IHNoX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzaHdkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwlzaF93ZHRfc3RhcnQoKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyoqCisgKiAJc2hfd2R0X2Nsb3NlIC0gQ2xvc2UgdGhlIERldmljZQorICoKKyAqIAlAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICogCUBmaWxlOiBmaWxlIGhhbmRsZSBvZiBkZXZpY2UKKyAqCisgKiAJV2F0Y2hkb2cgZGV2aWNlIGlzIGNsb3NlZCBhbmQgc3RvcHBlZC4KKyAqLworc3RhdGljIGludCBzaF93ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHNod2R0X2V4cGVjdF9jbG9zZSA9PSA0MikgeworCQlzaF93ZHRfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJc2hfd2R0X2tlZXBhbGl2ZSgpOworCX0KKworCWNsZWFyX2JpdCgwLCAmc2h3ZHRfaXNfb3Blbik7CisJc2h3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIAlzaF93ZHRfd3JpdGUgLSBXcml0ZSB0byBEZXZpY2UKKyAqCisgKiAJQGZpbGU6IGZpbGUgaGFuZGxlIG9mIGRldmljZQorICogCUBidWY6IGJ1ZmZlciB0byB3cml0ZQorICogCUBjb3VudDogbGVuZ3RoIG9mIGJ1ZmZlcgorICogCUBwcG9zOiBvZmZzZXQKKyAqCisgKiAJUGluZ3MgdGhlIHdhdGNoZG9nIG9uIHdyaXRlLgorICovCitzdGF0aWMgc3NpemVfdCBzaF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCXNod2R0X2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJc2h3ZHRfZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJc2hfd2R0X2tlZXBhbGl2ZSgpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiAJc2hfd2R0X2lvY3RsIC0gUXVlcnkgRGV2aWNlCisgKgorICogCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKiAJQGZpbGU6IGZpbGUgaGFuZGxlIG9mIGRldmljZQorICogCUBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqIAlAYXJnOiBhcmd1bWVudAorICoKKyAqIAlRdWVyeSBiYXNpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZXZpY2Ugb3IgcGluZyBpdCwgYXMgb3V0bGluZWQgYnkgdGhlCisgKiAJd2F0Y2hkb2cgQVBJLgorICovCitzdGF0aWMgaW50IHNoX3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBuZXdfaGVhcnRiZWF0OworCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gKilhcmcsCisJCQkJCSAgJnNoX3dkdF9pbmZvLAorCQkJCQkgIHNpemVvZihzaF93ZHRfaW5mbykpID8gLUVGQVVMVCA6IDA7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJc2hfd2R0X2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCAoaW50ICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHNoX3dkdF9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzaF93ZHRfa2VlcGFsaXZlKCk7CisJCQkvKiBGYWxsICovCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIChpbnQgKilhcmcpOworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgKGludCAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQlzaF93ZHRfc3RvcCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXNoX3dkdF9zdGFydCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIAlzaF93ZHRfbm90aWZ5X3N5cyAtIE5vdGlmaWVyIEhhbmRsZXIKKyAqCisgKiAJQHRoaXM6IG5vdGlmaWVyIGJsb2NrCisgKiAJQGNvZGU6IG5vdGlmaWVyIGV2ZW50CisgKiAJQHVudXNlZDogdW51c2VkCisgKgorICogCUhhbmRsZXMgc3BlY2lmaWMgZXZlbnRzLCBzdWNoIGFzIHR1cm5pbmcgb2ZmIHRoZSB3YXRjaGRvZyBkdXJpbmcgYQorICogCXNodXRkb3duIGV2ZW50LgorICovCitzdGF0aWMgaW50IHNoX3dkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgeworCQlzaF93ZHRfc3RvcCgpOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2hfd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBzaF93ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHNoX3dkdF9pb2N0bCwKKwkub3BlbgkJPSBzaF93ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHNoX3dkdF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBzaF93ZHRfaW5mbyA9IHsKKwkub3B0aW9ucwkJPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJLmZpcm13YXJlX3ZlcnNpb24JPSAxLAorCS5pZGVudGl0eQkJPSAiU0ggV0RUIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2hfd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCQk9IHNoX3dkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNoX3dkdF9taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZzaF93ZHRfZm9wcywKK307CisKKy8qKgorICogCXNoX3dkdF9pbml0IC0gSW5pdGlhbGl6ZSBtb2R1bGUKKyAqCisgKiAJUmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIG5vdGlmaWVyIGhhbmRsZXIuIEFjdHVhbCBkZXZpY2UKKyAqIAlpbml0aWFsaXphdGlvbiBpcyBoYW5kbGVkIGJ5IHNoX3dkdF9vcGVuKCkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNoX3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKChjbG9ja19kaXZpc2lvbl9yYXRpbyA8IDB4NSkgfHwgKGNsb2NrX2RpdmlzaW9uX3JhdGlvID4gMHg3KSkgeworCQljbG9ja19kaXZpc2lvbl9yYXRpbyA9IFdUQ1NSX0NLU180MDk2OworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiY2xvY2tfZGl2aXNpb25fcmF0aW8gdmFsdWUgbXVzdCBiZSAweDU8PXg8PTB4NywgdXNpbmcgJWRcbiIsCisJCQljbG9ja19kaXZpc2lvbl9yYXRpbyk7CisJfQorCisJaWYgKHNoX3dkdF9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkpCisJeworCQloZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJoZWFydGJlYXQgdmFsdWUgbXVzdCBiZSAxPD14PD0zNjAwLCB1c2luZyAlZFxuIiwKKwkJCWhlYXJ0YmVhdCk7CisJfQorCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmZ1bmN0aW9uID0gc2hfd2R0X3Bpbmc7CisJdGltZXIuZGF0YSA9IDA7CisKKwlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc2hfd2R0X25vdGlmaWVyKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJnNoX3dkdF9taXNjZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCXNoX3dkdF9taXNjZGV2Lm1pbm9yLCByYyk7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzaF93ZHRfbm90aWZpZXIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiBoZWFydGJlYXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCWhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogCXNoX3dkdF9leGl0IC0gRGVpbml0aWFsaXplIG1vZHVsZQorICoKKyAqIAlVbnJlZ2lzdGVycyB0aGUgZGV2aWNlIGFuZCBub3RpZmllciBoYW5kbGVyLiBBY3R1YWwgZGV2aWNlCisgKiAJZGVpbml0aWFsaXphdGlvbiBpcyBoYW5kbGVkIGJ5IHNoX3dkdF9jbG9zZSgpLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc2hfd2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJnNoX3dkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc2hfd2R0X25vdGlmaWVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwZXJIIHdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCittb2R1bGVfcGFyYW0oY2xvY2tfZGl2aXNpb25fcmF0aW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrX2RpdmlzaW9uX3JhdGlvLCAiQ2xvY2sgZGl2aXNpb24gcmF0aW8uIFZhbGlkIHJhbmdlcyBhcmUgZnJvbSAweDUgKDEuMzFtcykgdG8gMHg3ICg1LjI1bXMpLiBEZWZhdWx0cyB0byAweDcuIik7CisKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdCBpbiBzZWNvbmRzLiAoMTw9aGVhcnRiZWF0PD0zNjAwLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKK21vZHVsZV9pbml0KHNoX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KHNoX3dkdF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NvZnRkb2cuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zb2Z0ZG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3OTAzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc29mdGRvZy5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICoJU29mdERvZwkwLjA3OglBIFNvZnR3YXJlIFdhdGNoZG9nIERldmljZQorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCBub3IgQ3ltcnVOZXQgTHRkLiBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NSAgICBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoKKyAqCVNvZnR3YXJlIG9ubHkgd2F0Y2hkb2cgZHJpdmVyLiBVbmxpa2UgaXRzIGJpZyBicm90aGVyIHRoZSBXRFQ1MDFQCisgKglkcml2ZXIgdGhpcyB3b24ndCBhbHdheXMgcmVjb3ZlciBhIGZhaWxlZCBtYWNoaW5lLgorICoKKyAqICAwMy85NjogQW5nZWxvIEhhcml0c2lzIDxhaEBkb2MuaWMuYWMudWs+IDoKKyAqCU1vZHVsYXJpc2VkLgorICoJQWRkZWQgc29mdF9tYXJnaW47IHVzZSB1cG9uIGluc21vZCB0byBjaGFuZ2UgdGhlIHRpbWVyIGRlbGF5LgorICoJTkI6IHVzZXMgc2FtZSBtaW5vciBhcyB3ZHQgKFdBVENIRE9HX01JTk9SKTsgd2UgY291bGQgdXNlIHNlcGFyYXRlCisgKgkgICAgbWlub3JzLgorICoKKyAqICAxOTk4MDkxMSBBbGFuIENveAorICoJTWFkZSBTTVAgc2FmZSBmb3IgMi4zLngKKyAqCisgKiAgMjAwMTExMjcgSm9lbCBCZWNrZXIgKGpsYmVjQGV2aWxwbGFuLm9yZz4KKyAqCUFkZGVkIHNvZnRfbm9ib290OyBBbGxvd3MgdGVzdGluZyB0aGUgc29mdGRvZyB0cmlnZ2VyIHdpdGhvdXQKKyAqCXJlcXVpcmluZyBhIHJlY29tcGlsZS4KKyAqCUFkZGVkIFdESU9DX0dFVFRJTUVPVVQgYW5kIFdESU9DX1NFVFRJTU9VVC4KKyAqCisgKiAgMjAwMjA1MzAgSm9lbCBCZWNrZXIgPGpvZWwuYmVja2VyQG9yYWNsZS5jb20+CisgKiAgCUFkZGVkIE1hdHQgRG9tc2NoJ3Mgbm93YXlvdXQgbW9kdWxlIG9wdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFBGWCAiU29mdERvZzogIgorCisjZGVmaW5lIFRJTUVSX01BUkdJTgk2MAkJLyogRGVmYXVsdCBpcyA2MCBzZWNvbmRzICovCitzdGF0aWMgaW50IHNvZnRfbWFyZ2luID0gVElNRVJfTUFSR0lOOwkvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0oc29mdF9tYXJnaW4sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNvZnRfbWFyZ2luLCAiV2F0Y2hkb2cgc29mdF9tYXJnaW4gaW4gc2Vjb25kcy4gKDA8c29mdF9tYXJnaW48NjU1MzYsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoVElNRVJfTUFSR0lOKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworI2lmZGVmIE9OTFlfVEVTVElORworc3RhdGljIGludCBzb2Z0X25vYm9vdCA9IDE7CisjZWxzZQorc3RhdGljIGludCBzb2Z0X25vYm9vdCA9IDA7CisjZW5kaWYgIC8qIE9OTFlfVEVTVElORyAqLworCittb2R1bGVfcGFyYW0oc29mdF9ub2Jvb3QsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNvZnRfbm9ib290LCAiU29mdGRvZyBhY3Rpb24sIHNldCB0byAxIHRvIGlnbm9yZSByZWJvb3RzLCAwIHRvIHJlYm9vdCAoZGVmYXVsdCBkZXBlbmRzIG9uIE9OTFlfVEVTVElORykiKTsKKworLyoKKyAqCU91ciB0aW1lcgorICovCisKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2ZpcmUodW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aWNrdG9jayA9CisJCVRJTUVSX0lOSVRJQUxJWkVSKHdhdGNoZG9nX2ZpcmUsIDAsIDApOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfYWxpdmU7CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CisKKworLyoKKyAqCUlmIHRoZSB0aW1lciBleHBpcmVzLi4KKyAqLworCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19maXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpZiAoc29mdF9ub2Jvb3QpCisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJUcmlnZ2VyZWQgLSBSZWJvb3QgaWdub3JlZC5cbiIpOworCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJJbml0aWF0aW5nIHN5c3RlbSByZWJvb3QuXG4iKTsKKwkJbWFjaGluZV9yZXN0YXJ0KE5VTEwpOworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiUmVib290IGRpZG4ndCA/Pz8/P1xuIik7CisJfQorfQorCisvKgorICoJU29mdGRvZyBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludCBzb2Z0ZG9nX2tlZXBhbGl2ZSh2b2lkKQoreworCW1vZF90aW1lcigmd2F0Y2hkb2dfdGlja3RvY2ssIGppZmZpZXMrKHNvZnRfbWFyZ2luKkhaKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29mdGRvZ19zdG9wKHZvaWQpCit7CisJZGVsX3RpbWVyKCZ3YXRjaGRvZ190aWNrdG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29mdGRvZ19zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICgodCA8IDB4MDAwMSkgfHwgKHQgPiAweEZGRkYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfbWFyZ2luID0gdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgaW50IHNvZnRkb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZ0aW1lcl9hbGl2ZSkpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKG5vd2F5b3V0KQorCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCS8qCisJICoJQWN0aXZhdGUgdGltZXIKKwkgKi8KKwlzb2Z0ZG9nX2tlZXBhbGl2ZSgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzb2Z0ZG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKglTaHV0IG9mZiB0aGUgdGltZXIuCisJICogCUxvY2sgaXQgaW4gaWYgaXQncyBhIG1vZHVsZSBhbmQgd2Ugc2V0IG5vd2F5b3V0CisJICovCisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQlzb2Z0ZG9nX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXNvZnRkb2dfa2VlcGFsaXZlKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmdGltZXJfYWxpdmUpOworCWV4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvZnRkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyoKKwkgKglSZWZyZXNoIHRoZSB0aW1lci4KKwkgKi8KKwlpZihsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJc29mdGRvZ19rZWVwYWxpdmUoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBzb2Z0ZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBuZXdfbWFyZ2luOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9CTAsCisJCS5pZGVudGl0eSA9CQkiU29mdHdhcmUgV2F0Y2hkb2ciLAorCX07CisJc3dpdGNoIChjbWQpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LAorCQkJCXNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJc29mdGRvZ19rZWVwYWxpdmUoKTsKKwkJCXJldHVybiAwOworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X21hcmdpbiwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoc29mdGRvZ19zZXRfaGVhcnRiZWF0KG5ld19tYXJnaW4pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc29mdGRvZ19rZWVwYWxpdmUoKTsKKwkJCS8qIEZhbGwgKi8KKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHNvZnRfbWFyZ2luLCBwKTsKKwl9Cit9CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHNvZnRkb2dfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQlzb2Z0ZG9nX3N0b3AoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb2Z0ZG9nX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBzb2Z0ZG9nX3dyaXRlLAorCS5pb2N0bAkJPSBzb2Z0ZG9nX2lvY3RsLAorCS5vcGVuCQk9IHNvZnRkb2dfb3BlbiwKKwkucmVsZWFzZQk9IHNvZnRkb2dfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzb2Z0ZG9nX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJnNvZnRkb2dfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc29mdGRvZ19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHNvZnRkb2dfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIlNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyOiAwLjA3IGluaXRpYWxpemVkLiBzb2Z0X25vYm9vdD0lZCBzb2Z0X21hcmdpbj0lZCBzZWMgKG5vd2F5b3V0PSAlZClcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogQ2hlY2sgdGhhdCB0aGUgc29mdF9tYXJnaW4gdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAoc29mdGRvZ19zZXRfaGVhcnRiZWF0KHNvZnRfbWFyZ2luKSkgeworCQlzb2Z0ZG9nX3NldF9oZWFydGJlYXQoVElNRVJfTUFSR0lOKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInNvZnRfbWFyZ2luIHZhbHVlIG11c3QgYmUgMDxzb2Z0X21hcmdpbjw2NTUzNiwgdXNpbmcgJWRcbiIsCisJCQlUSU1FUl9NQVJHSU4pOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc29mdGRvZ19ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3Rlcigmc29mdGRvZ19taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc29mdGRvZ19ub3RpZmllcik7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKGJhbm5lciwgc29mdF9ub2Jvb3QsIHNvZnRfbWFyZ2luLCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhdGNoZG9nX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJnNvZnRkb2dfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNvZnRkb2dfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdCh3YXRjaGRvZ19pbml0KTsKK21vZHVsZV9leGl0KHdhdGNoZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2Z0d2FyZSBXYXRjaGRvZyBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzYzk3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2MjdoZl93ZHQuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqCXc4MzYyN2hmIFdEVCBkcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDMgUOFkcmFpZyBCcmFkeSA8UEBkcmFpZ0JyYWR5LmNvbT4KKyAqCisgKglCYXNlZCBvbiBhZHZhbnRlY2h3ZHQuYyB3aGljaCBpcyBiYXNlZCBvbiB3ZHQuYy4KKyAqCU9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlczoKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDAtMjAwMSBNYXJlayBNaWNoYWxraWV3aWN6IDxtYXJla21AbGludXgub3JnLnBsPgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCBub3IgQ3ltcnVOZXQgTHRkLiBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NSAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzYyN2hmIFdEVCIKKyNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDYwCQkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworCisvKiBZb3UgbXVzdCBzZXQgdGhpcyAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLworc3RhdGljIGludCB3ZHRfaW8gPSAweDJFOworbW9kdWxlX3BhcmFtKHdkdF9pbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X2lvLCAidzgzNjI3aGYgV0RUIGlvIHBvcnQgKGRlZmF1bHQgMHgyRSkiKTsKKworc3RhdGljIGludCB0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsJLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuIDE8PSB0aW1lb3V0IDw9NjMsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglLZXJuZWwgbWV0aG9kcy4KKyAqLworCisjZGVmaW5lIFdEVF9FRkVSICh3ZHRfaW8rMCkgICAvKiBFeHRlbmRlZCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFdEVF9FRklSICh3ZHRfaW8rMCkgICAvKiBFeHRlbmRlZCBGdW5jdGlvbiBJbmRleCBSZWdpc3RlciAoc2FtZSBhcyBFRkVSKSAqLworI2RlZmluZSBXRFRfRUZEUiAoV0RUX0VGSVIrMSkgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRGF0YSBSZWdpc3RlciAqLworCitzdGF0aWMgdm9pZAordzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKHZvaWQpCit7CisJb3V0Yl9wKDB4ODcsIFdEVF9FRkVSKTsgLyogRW50ZXIgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLworCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEFnYWluIGFjY29yZGluZyB0byBtYW51YWwgKi8KKworCW91dGJfcCgweDA3LCBXRFRfRUZFUik7IC8qIHBvaW50IHRvIGxvZ2ljYWwgZGV2aWNlIG51bWJlciByZWcgKi8KKwlvdXRiX3AoMHgwOCwgV0RUX0VGRFIpOyAvKiBzZWxlY3QgbG9naWNhbCBkZXZpY2UgOCAoR1BJTzIpICovCisJb3V0Yl9wKDB4MzAsIFdEVF9FRkVSKTsgLyogc2VsZWN0IENSMzAgKi8KKwlvdXRiX3AoMHgwMSwgV0RUX0VGRFIpOyAvKiBzZXQgYml0IDAgdG8gYWN0aXZhdGUgR1BJTzIgKi8KK30KKworc3RhdGljIHZvaWQKK3c4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKHZvaWQpCit7CisJb3V0Yl9wKDB4QUEsIFdEVF9FRkVSKTsgLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLworfQorCisvKiB0eWFuIG1vdGhlcmJvYXJkcyBzZWVtIHRvIHNldCBGNSB0byAweDRDID8KKyAqIFNvIGV4cGxpY2l0bHkgaW5pdCB0byBhcHByb3ByaWF0ZSB2YWx1ZS4gKi8KK3N0YXRpYyB2b2lkCit3ODM2MjdoZl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB0OworCisJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CisKKwlvdXRiX3AoMHhGNSwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNSAqLworCXQ9aW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNSAqLworCXQmPX4weDBDOyAgICAgICAgICAgICAgIC8qIHNldCBzZWNvbmQgbW9kZSAmIGRpc2FibGUga2V5Ym9hcmQgdHVybmluZyBvZmYgd2F0Y2hkb2cgKi8KKwlvdXRiX3AodCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjUgKi8KKworCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7Cit9CisKK3N0YXRpYyB2b2lkCit3ZHRfY3RybChpbnQgdGltZW91dCkKK3sKKwl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKKworCW91dGJfcCgweEY2LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY2ICovCisJb3V0Yl9wKHRpbWVvdXQsIFdEVF9FRkRSKTsgLyogV3JpdGUgVGltZW91dCBjb3VudGVyIHRvIENSRjYgKi8KKworCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9waW5nKHZvaWQpCit7CisJd2R0X2N0cmwodGltZW91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9kaXNhYmxlKHZvaWQpCit7CisJd2R0X2N0cmwoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICgodCA8IDEpIHx8ICh0ID4gNjMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRpbWVvdXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAord2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXdkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAord2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IG5ld190aW1lb3V0OworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIlc4MzYyN0hGIFdEVCIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCSAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCSAgcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJICB3ZHRfcGluZygpOworCSAgYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJICBpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkgIHJldHVybiAtRUZBVUxUOworCSAgaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKKwkJICByZXR1cm4gLUVJTlZBTDsKKwkgIHdkdF9waW5nKCk7CisJICAvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJICByZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJeworCSAgaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkgIGlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwkgIGlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkgICAgd2R0X2Rpc2FibGUoKTsKKwkgICAgcmV0dmFsID0gMDsKKwkgIH0KKworCSAgaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJICAgIHdkdF9waW5nKCk7CisJICAgIHJldHZhbCA9IDA7CisJICB9CisKKwkgIHJldHVybiByZXR2YWw7CisJfQorCisJZGVmYXVsdDoKKwkgIHJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJQWN0aXZhdGUKKwkgKi8KKworCXdkdF9waW5nKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQl3ZHRfZGlzYWJsZSgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJd2R0X3BpbmcoKTsKKwl9CisJZXhwZWN0X2Nsb3NlID0gMDsKKwljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQKK3dkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJd2R0X2Rpc2FibGUoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHdkdF93cml0ZSwKKwkuaW9jdGwJCT0gd2R0X2lvY3RsLAorCS5vcGVuCQk9IHdkdF9vcGVuLAorCS5yZWxlYXNlCT0gd2R0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZ3ZHRfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdAord2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzYyN0hGIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOworCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD10aW1lb3V0PD02MywgdXNpbmcgJWRcbiIsCisJCQlXQVRDSERPR19USU1FT1VUKTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9pbywgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCXdkdF9pbyk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXc4MzYyN2hmX2luaXQoKTsKKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXQpOworCQlnb3RvIHVucmVnX3JlZ2lvbnM7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byB1bnJlZ19yZWJvb3Q7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK3VucmVnX3JlYm9vdDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKK3VucmVnX3JlZ2lvbnM6CisJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAxKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywxKTsKK30KKworbW9kdWxlX2luaXQod2R0X2luaXQpOworbW9kdWxlX2V4aXQod2R0X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ3Mzg2MjdoZiBXRFQgZHJpdmVyIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzODc3Zl93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM4NzdmX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjY2JkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzODc3Zl93ZHQuYwpAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqCVc4Mzg3N0YgQ29tcHV0ZXIgV2F0Y2hkb2cgVGltZXIgZHJpdmVyCisgKgorICogICAgICBCYXNlZCBvbiBhY3F1aXJld2R0LmMgYnkgQWxhbiBDb3gsCisgKiAgICAgICAgICAgYW5kIHNiYzYweHh3ZHQuYyBieSBKYWtvYiBPZXN0ZXJnYWFyZCA8amFrb2JAdW50aG91Z2h0Lm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBhdXRob3JzIGRvIE5PVCBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yCisgKglhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGluCisgKiAgICAgIHRoZSBob3BlIHRoYXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXJzLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSAgICBTY290dCBKZW5uaW5ncyA8bGludXhkcml2ZXJzQG9yby5uZXQ+CisgKgorICogICAgICAgICAgIDQvMTkgLSAyMDAxICAgICAgW0luaXRpYWwgcmV2aXNpb25dCisgKiAgICAgICAgICAgOS8yNyAtIDIwMDEgICAgICBBZGRlZCBzcGlubG9ja2luZworICogICAgICAgICAgIDQvMTIgLSAyMDAyICAgICAgW3JvYkBvc2ludmVzdG9yLmNvbV0gRWxpbWluYXRlIGV4dHJhIGNvbW1lbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGltaW5hdGUgZm9wX3JlYWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsaW1pbmF0ZSBleHRyYSBzcGluX3VubG9jaworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgS0VSTl8qIHRhZ3MgdG8gcHJpbnRrcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXggcG9zc2libGUgd2R0X2lzX29wZW4gcmFjZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB3YXRjaGRvZ19pbmZvIHRvIGNvcnJlY3RseSByZWZsZWN0IHdoYXQgdGhlIGRyaXZlciBvZmZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIFdESU9DX0dFVFNUQVRVUywgV0RJT0NfR0VUQk9PVFNUQVRVUywgV0RJT0NfU0VUVElNRU9VVCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESU9DX0dFVFRJTUVPVVQsIGFuZCBXRElPQ19TRVRPUFRJT05TIGlvY3RscworICogICAgICAgICAgIDA5LzggLSAyMDAzICAgICAgW3dpbUBpZ3VhbmEuYmVdIGNsZWFudXAgb2YgdHJhaWxpbmcgc3BhY2VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBleHRyYSBwcmludGsncyBmb3Igc3RhcnR1cCBwcm9ibGVtcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIG1vZHVsZV9wYXJhbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFkZSB0aW1lb3V0ICh0aGUgZW11bGF0ZWQgaGVhcnRiZWF0KSBhIG1vZHVsZV9wYXJhbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFkZSB0aGUga2VlcGFsaXZlIHBpbmcgYW4gaW50ZXJuYWwgc3Vicm91dGluZQorICoKKyAqICBUaGlzIFdEVCBkcml2ZXIgaXMgZGlmZmVyZW50IGZyb20gbW9zdCBvdGhlciBMaW51eCBXRFQKKyAqICBkcml2ZXJzIGluIHRoYXQgdGhlIGRyaXZlciB3aWxsIHBpbmcgdGhlIHdhdGNoZG9nIGJ5IGl0c2VsZiwKKyAqICBiZWNhdXNlIHRoaXMgcGFydGljdWxhciBXRFQgaGFzIGEgdmVyeSBzaG9ydCB0aW1lb3V0ICgxLjYKKyAqICBzZWNvbmRzKSBhbmQgaXQgd291bGQgYmUgaW5zYW5lIHRvIGNvdW50IG9uIGFueSB1c2Vyc3BhY2UKKyAqICBkYWVtb24gYWx3YXlzIGdldHRpbmcgc2NoZWR1bGVkIHdpdGhpbiB0aGF0IHRpbWUgZnJhbWUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIE9VUl9OQU1FICJ3ODM4NzdmX3dkdCIKKyNkZWZpbmUgUEZYIE9VUl9OQU1FICI6ICIKKworI2RlZmluZSBFTkFCTEVfVzgzODc3Rl9QT1JUIDB4M0YwCisjZGVmaW5lIEVOQUJMRV9XODM4NzdGIDB4ODcKKyNkZWZpbmUgRElTQUJMRV9XODM4NzdGIDB4QUEKKyNkZWZpbmUgV0RUX1BJTkcgMHg0NDMKKyNkZWZpbmUgV0RUX1JFR0lTVEVSIDB4MTQKKyNkZWZpbmUgV0RUX0VOQUJMRSAweDlDCisjZGVmaW5lIFdEVF9ESVNBQkxFIDB4OEMKKworLyoKKyAqIFRoZSBXODM4NzdGIHNlZW1zIHRvIGJlIGZpeGVkIGF0IDEuNnMgdGltZW91dCAoYXQgbGVhc3Qgb24gdGhlCisgKiBFTUFDUyBQQy0xMDQgYm9hcmQgSSdtIHVzaW5nKS4gSWYgd2UgcmVzZXQgdGhlIHdhdGNoZG9nIGV2ZXJ5CisgKiB+MjUwbXMgd2Ugc2hvdWxkIGJlIHNhZmUuICAqLworCisjZGVmaW5lIFdEVF9JTlRFUlZBTCAoSFovNCsxKQorCisvKgorICogV2UgbXVzdCBub3QgcmVxdWlyZSB0b28gZ29vZCByZXNwb25zZSBmcm9tIHRoZSB1c2Vyc3BhY2UgZGFlbW9uLgorICogSGVyZSB3ZSByZXF1aXJlIHRoZSB1c2Vyc3BhY2UgZGFlbW9uIHRvIHNlbmQgdXMgYSBoZWFydGJlYXQKKyAqIGNoYXIgdG8gL2Rldi93YXRjaGRvZyBldmVyeSAzMCBzZWNvbmRzLgorICovCisKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAzMCAgICAgICAgICAgIC8qIDMwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7IC8qIGluIHNlY29uZHMsIHdpbGwgYmUgbXVsdGlwbGllZCBieSBIWiB0byBnZXQgc2Vjb25kcyB0byB3YWl0IGZvciBhIHBpbmcgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAoMTw9dGltZW91dDw9MzYwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiKSIpOworCisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCitzdGF0aWMgdm9pZCB3ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRfaGVhcnRiZWF0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgY2hhciB3ZHRfZXhwZWN0X2Nsb3NlOworc3RhdGljIHNwaW5sb2NrX3Qgd2R0X3NwaW5sb2NrOworCisvKgorICoJV2hhY2sgdGhlIGRvZworICovCisKK3N0YXRpYyB2b2lkIHdkdF90aW1lcl9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBJZiB3ZSBnb3QgYSBoZWFydGJlYXQgcHVsc2Ugd2l0aGluIHRoZSBXRFRfVVNfSU5URVJWQUwKKwkgKiB3ZSBhZ3JlZSB0byBwaW5nIHRoZSBXRFQKKwkgKi8KKwlpZih0aW1lX2JlZm9yZShqaWZmaWVzLCBuZXh0X2hlYXJ0YmVhdCkpCisJeworCQkvKiBQaW5nIHRoZSBXRFQgKi8KKwkJc3Bpbl9sb2NrKCZ3ZHRfc3BpbmxvY2spOworCisJCS8qIFBpbmcgdGhlIFdEVCBieSByZWFkaW5nIGZyb20gV0RUX1BJTkcgKi8KKwkJaW5iX3AoV0RUX1BJTkcpOworCisJCS8qIFJlLXNldCB0aGUgdGltZXIgaW50ZXJ2YWwgKi8KKwkJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXRFRfSU5URVJWQUw7CisJCWFkZF90aW1lcigmdGltZXIpOworCisJCXNwaW5fdW5sb2NrKCZ3ZHRfc3BpbmxvY2spOworCisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkhlYXJ0YmVhdCBsb3N0ISBXaWxsIG5vdCBwaW5nIHRoZSB3YXRjaGRvZ1xuIik7CisJfQorfQorCisvKgorICogVXRpbGl0eSByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIHdkdF9jaGFuZ2UoaW50IHdyaXRldmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJndkdF9zcGlubG9jaywgZmxhZ3MpOworCisJLyogYnV5IHNvbWUgdGltZSAqLworCWluYl9wKFdEVF9QSU5HKTsKKworCS8qIG1ha2UgVzgzODc3RiBhdmFpbGFibGUgKi8KKwlvdXRiX3AoRU5BQkxFX1c4Mzg3N0YsICBFTkFCTEVfVzgzODc3Rl9QT1JUKTsKKwlvdXRiX3AoRU5BQkxFX1c4Mzg3N0YsICBFTkFCTEVfVzgzODc3Rl9QT1JUKTsKKworCS8qIGVuYWJsZSB3YXRjaGRvZyAqLworCW91dGJfcChXRFRfUkVHSVNURVIsICAgIEVOQUJMRV9XODM4NzdGX1BPUlQpOworCW91dGJfcCh3cml0ZXZhbCwgICAgICAgIEVOQUJMRV9XODM4NzdGX1BPUlQrMSk7CisKKwkvKiBsb2NrIHRoZSBXODM4N0ZGIGF3YXkgKi8KKwlvdXRiX3AoRElTQUJMRV9XODM4NzdGLCBFTkFCTEVfVzgzODc3Rl9QT1JUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkdF9zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfc3RhcnR1cCh2b2lkKQoreworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArICh0aW1lb3V0ICogSFopOworCisJLyogU3RhcnQgdGhlIHRpbWVyICovCisJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXRFRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZ0aW1lcik7CisKKwl3ZHRfY2hhbmdlKFdEVF9FTkFCTEUpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGlzIG5vdyBlbmFibGVkLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdkdF90dXJub2ZmKHZvaWQpCit7CisJLyogU3RvcCB0aGUgdGltZXIgKi8KKwlkZWxfdGltZXIoJnRpbWVyKTsKKworCXdkdF9jaGFuZ2UoV0RUX0RJU0FCTEUpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHRpbWVyIGlzIG5vdyBkaXNhYmxlZC4uLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwkvKiB1c2VyIGxhbmQgcGluZyAqLworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArICh0aW1lb3V0ICogSFopOworfQorCisvKgorICogL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKK3N0YXRpYyBzc2l6ZV90IGZvcF93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmKGNvdW50KQorCXsKKwkJaWYgKCFub3dheW91dCkKKwkJeworCQkJc2l6ZV90IG9mczsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQl3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwkJCWZvcihvZnMgPSAwOyBvZnMgIT0gY291bnQ7IG9mcysrKQorCQkJeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgb2ZzKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQl3ZHRfZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVzdGFydCB0aW1lciAqLworCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBmb3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCS8qIEp1c3QgaW4gY2FzZSB3ZSdyZSBhbHJlYWR5IHRhbGtpbmcgdG8gc29tZW9uZS4uLiAqLworCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEdvb2QsIGZpcmUgdXAgdGhlIHNob3cgKi8KKwl3ZHRfc3RhcnR1cCgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBmb3BfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlpZih3ZHRfZXhwZWN0X2Nsb3NlID09IDQyKQorCQl3ZHRfdHVybm9mZigpOworCWVsc2UgeworCQlkZWxfdGltZXIoJnRpbWVyKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggImRldmljZSBmaWxlIGNsb3NlZCB1bmV4cGVjdGVkbHkuIFdpbGwgbm90IHN0b3AgdGhlIFdEVCFcbiIpOworCX0KKwljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwl3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmb3BfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50PQorCXsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIlc4Mzg3N0YiLAorCX07CisKKwlzd2l0Y2goY21kKQorCXsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKT8tRUZBVUxUOjA7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG5ld19vcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCQlpZihnZXRfdXNlcihuZXdfb3B0aW9ucywgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKG5ld19vcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQl3ZHRfdHVybm9mZigpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXdkdF9zdGFydHVwKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXsKKwkJCWludCBuZXdfdGltZW91dDsKKworCQkJaWYoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZihuZXdfdGltZW91dCA8IDEgfHwgbmV3X3RpbWVvdXQgPiAzNjAwKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJdGltZW91dCA9IG5ld190aW1lb3V0OworCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCX0KKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBmb3Bfd3JpdGUsCisJLm9wZW4JCT0gZm9wX29wZW4sCisJLnJlbGVhc2UJPSBmb3BfY2xvc2UsCisJLmlvY3RsCQk9IGZvcF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpCisJCXdkdF90dXJub2ZmKCk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllcj0KK3sKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IHc4Mzg3N2Zfd2R0X3VubG9hZCh2b2lkKQoreworCXdkdF90dXJub2ZmKCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlyZWxlYXNlX3JlZ2lvbihXRFRfUElORywxKTsKKwlyZWxlYXNlX3JlZ2lvbihFTkFCTEVfVzgzODc3Rl9QT1JULDIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3ODM4NzdmX3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJjID0gLUVCVVNZOworCisJc3Bpbl9sb2NrX2luaXQoJndkdF9zcGlubG9jayk7CisKKwlpZih0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gMzYwMCkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJeworCQl0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD14PD0zNjAwLCB1c2luZyAlZFxuIiwKKwkJCXRpbWVvdXQpOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oRU5BQkxFX1c4Mzg3N0ZfUE9SVCwgMiwgIlc4Mzg3N0YgV0RUIikpCisJeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQlFTkFCTEVfVzgzODc3Rl9QT1JUKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihXRFRfUElORywgMSwgIlc4Mzg3RkYgV0RUIikpCisJeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQlXRFRfUElORyk7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbjE7CisJfQorCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmZ1bmN0aW9uID0gd2R0X3RpbWVyX3Bpbmc7CisJdGltZXIuZGF0YSA9IDA7CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmMpCisJeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCXdkdF9taXNjZGV2Lm1pbm9yLCByYyk7CisJCWdvdG8gZXJyX291dF9yZWdpb24yOworCX0KKworCXJjID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlmIChyYykKKwl7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyYyk7CisJCWdvdG8gZXJyX291dF9taXNjZGV2OworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXRFQgZHJpdmVyIGZvciBXODM4NzdGIGluaXRpYWxpc2VkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQl0aW1lb3V0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9taXNjZGV2OgorCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworZXJyX291dF9yZWdpb24yOgorCXJlbGVhc2VfcmVnaW9uKFdEVF9QSU5HLDEpOworZXJyX291dF9yZWdpb24xOgorCXJlbGVhc2VfcmVnaW9uKEVOQUJMRV9XODM4NzdGX1BPUlQsMik7CitlcnJfb3V0OgorCXJldHVybiByYzsKK30KKworbW9kdWxlX2luaXQodzgzODc3Zl93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh3ODM4NzdmX3dkdF91bmxvYWQpOworCitNT0RVTEVfQVVUSE9SKCJTY290dCBhbmQgQmlsbCBKZW5uaW5ncyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdhdGNoZG9nIHRpbWVyIGluIHc4Mzg3N2YgY2hpcCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dhZmVyNTgyM3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dhZmVyNTgyM3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjBiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2FmZXI1ODIzd2R0LmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKglJQ1AgV2FmZXIgNTgyMyBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV0RUIGRyaXZlcgorICogICAgICBodHRwOi8vd3d3LmljcGFtZXJpY2EuY29tL3dhZmVyXzU4MjMucGhwCisgKiAgICAgIE1heSBhbHNvIHdvcmsgb24gb3RoZXIgc2ltaWxhciBtb2RlbHMKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDIgSnVzdGluIENvcm1hY2sgPGp1c3RpbkBzdHJlZXQtdmlzaW9uLmNvbT4KKyAqCisgKiAgICAgIFJlbGVhc2UgMC4wMgorICoKKyAqCUJhc2VkIG9uIGFkdmFudGVjaHdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgorICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5Ni0xOTk3IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgIldhZmVyIDU4MjMgV0RUIgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisjZGVmaW5lIFdEX1RJTU8gNjAJCQkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdhZndkdF9pc19vcGVuOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworc3RhdGljIHNwaW5sb2NrX3Qgd2Fmd2R0X2xvY2s7CisKKy8qCisgKglZb3UgbXVzdCBzZXQgdGhlc2UgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4KKyAqCisgKiAgICAgIFRvIGVuYWJsZSwgd3JpdGUgdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyAoMSB0byAyNTUpIHRvIEkvTworICogICAgICBwb3J0IFdEVF9TVEFSVCwgdGhlbiByZWFkIHRoZSBwb3J0IHRvIHN0YXJ0IHRoZSB3YXRjaGRvZy4gVG8gcGF0CisgKiAgICAgIHRoZSBkb2csIHJlYWQgcG9ydCBXRFRfU1RPUCB0byBzdG9wIHRoZSB0aW1lciwgdGhlbiByZWFkIFdEVF9TVEFSVAorICogICAgICB0byByZXN0YXJ0IGl0IGFnYWluLgorICovCisKK3N0YXRpYyBpbnQgd2R0X3N0b3AgPSAweDg0MzsKK3N0YXRpYyBpbnQgd2R0X3N0YXJ0ID0gMHg0NDM7CisKK3N0YXRpYyBpbnQgdGltZW91dCA9IFdEX1RJTU87ICAvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMTw9IHRpbWVvdXQgPD0yNTUsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0RfVElNTykgIi4iKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKK3N0YXRpYyB2b2lkIHdhZndkdF9waW5nKHZvaWQpCit7CisJLyogcGF0IHdhdGNoZG9nICovCisJc3Bpbl9sb2NrKCZ3YWZ3ZHRfbG9jayk7CisJaW5iX3Aod2R0X3N0b3ApOworCWluYl9wKHdkdF9zdGFydCk7CisJc3Bpbl91bmxvY2soJndhZndkdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgd2Fmd2R0X3N0YXJ0KHZvaWQpCit7CisJLyogc3RhcnQgdXAgd2F0Y2hkb2cgKi8KKwlvdXRiX3AodGltZW91dCwgd2R0X3N0YXJ0KTsKKwlpbmJfcCh3ZHRfc3RhcnQpOworfQorCitzdGF0aWMgdm9pZAord2Fmd2R0X3N0b3Aodm9pZCkKK3sKKwkvKiBzdG9wIHdhdGNoZG9nICovCisJaW5iX3Aod2R0X3N0b3ApOworfQorCitzdGF0aWMgc3NpemVfdCB3YWZ3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCS8qIFdlbGwsIGFueWhvdyBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmV0dXJuIHRoYXQgZmF2b3VyICovCisJCXdhZndkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB3YWZ3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X3RpbWVvdXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiV2FmZXIgNTgyMyBXRFQiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZiAoaWRlbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXdhZndkdF9waW5nKCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICgobmV3X3RpbWVvdXQgPCAxKSB8fCAobmV3X3RpbWVvdXQgPiAyNTUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJd2Fmd2R0X3N0b3AoKTsKKwkJd2Fmd2R0X3N0YXJ0KCk7CisJCS8qIEZhbGwgKi8KKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwl7CisJCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXdhZndkdF9zdGFydCgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJd2Fmd2R0X3N0b3AoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhZndkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3YWZ3ZHRfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqICAgICAgQWN0aXZhdGUKKwkgKi8KKwl3YWZ3ZHRfc3RhcnQoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQKK3dhZndkdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCXdhZndkdF9zdG9wKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIldEVCBkZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseS4gIFdEVCB3aWxsIG5vdCBzdG9wIVxuIik7CisJCXdhZndkdF9waW5nKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmd2Fmd2R0X2lzX29wZW4pOworCWV4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHdhZndkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCXdhZndkdF9zdG9wKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2Fmd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3YWZ3ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHdhZndkdF9pb2N0bCwKKwkub3BlbgkJPSB3YWZ3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdhZndkdF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3YWZ3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmd2Fmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdhZndkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdhZndkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2Fmd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgV2FmZXIgNTgyMyBzaW5nbGUgYm9hcmQgY29tcHV0ZXIgaW5pdGlhbGlzaW5nLlxuIik7CisKKwlzcGluX2xvY2tfaW5pdCgmd2Fmd2R0X2xvY2spOworCisJaWYgKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiAyNTUpIHsKKwkJdGltZW91dCA9IFdEX1RJTU87CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDE8PXg8PTI1NSwgdXNpbmcgJWRcbiIsCisJCQl0aW1lb3V0KTsKKwl9CisKKwlpZiAod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KSB7CisJCWlmKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RvcCwgMSwgIldhZmVyIDU4MjMgV0RUIikpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQl3ZHRfc3RvcCk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWlmKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RhcnQsIDEsICJXYWZlciA1ODIzIFdEVCIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQl3ZHRfc3RhcnQpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndhZndkdF9ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3Rlcigmd2Fmd2R0X21pc2NkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byBlcnJvcjQ7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCisJcmV0dXJuIHJldDsKK2Vycm9yNDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Fmd2R0X25vdGlmaWVyKTsKK2Vycm9yMzoKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsIDEpOworZXJyb3IyOgorCWlmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLCAxKTsKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YWZ3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmd2Fmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3YWZ3ZHRfbm90aWZpZXIpOworCWlmKHdkdF9zdG9wICE9IHdkdF9zdGFydCkKKwkJcmVsZWFzZV9yZWdpb24od2R0X3N0b3AsIDEpOworCXJlbGVhc2VfcmVnaW9uKHdkdF9zdGFydCwgMSk7Cit9CisKK21vZHVsZV9pbml0KHdhZndkdF9pbml0KTsKK21vZHVsZV9leGl0KHdhZndkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSnVzdGluIENvcm1hY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUNQIFdhZmVyIDU4MjMgU2luZ2xlIEJvYXJkIENvbXB1dGVyIFdEVCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKworLyogZW5kIG9mIHdhZmVyNTgyM3dkdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2Q1MDFwLmggYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2Q1MDFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlNjBlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZDUwMXAuaApAQCAtMCwwICsxLDUyIEBACisvKgorICoJSW5kdXN0cmlhbCBDb21wdXRlciBTb3VyY2UgV0RUNTAwLzUwMSBkcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTUJQ3ltcnVORVQgTHRkCisgKgkJCQlJbm5vdmF0aW9uIENlbnRyZQorICoJCQkJU2luZ2xldG9uIFBhcmsKKyAqCQkJCVN3YW5zZWEKKyAqCQkJCVdhbGVzCisgKgkJCQlVSworICoJCQkJU0EyIDhQUAorICoKKyAqCWh0dHA6Ly93d3cuY3ltcnUubmV0CisgKgorICoJVGhpcyBkcml2ZXIgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQKKyAqCWhlcmVpbiBieSByZWZlcmVuY2UuIFRoZSBkcml2ZXIgaXMgcHJvdmlkZWQgd2l0aG91dCB3YXJyYW50eSBvciAKKyAqCXN1cHBvcnQuCisgKgorICoJUmVsZWFzZSAwLjA0LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNkZWZpbmUgV0RUX0NPVU5UMAkJKGlvKzApCisjZGVmaW5lIFdEVF9DT1VOVDEJCShpbysxKQorI2RlZmluZSBXRFRfQ09VTlQyCQkoaW8rMikKKyNkZWZpbmUgV0RUX0NSCQkJKGlvKzMpCisjZGVmaW5lIFdEVF9TUgkJCShpbys0KQkvKiBTdGFydCBidXp6ZXIgb24gUENJIHdyaXRlICovCisjZGVmaW5lIFdEVF9SVAkJCShpbys1KQkvKiBTdG9wIGJ1enplciBvbiBQQ0kgd3JpdGUgKi8KKyNkZWZpbmUgV0RUX0JVWlpFUgkJKGlvKzYpCS8qIFBDSSBvbmx5OiByZD1kaXNhYmxlLCB3cj1lbmFibGUgKi8KKyNkZWZpbmUgV0RUX0RDCQkJKGlvKzcpCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgb24gdGhlIFBDSSBjYXJkLCB0aGV5J3JlIG91dHNpZGUgb2YgSS9PIHNwYWNlIG9uCisgKiB0aGUgSVNBIGNhcmQ6ICovCisjZGVmaW5lIFdEVF9DTE9DSwkJKGlvKzEyKQkvKiBDT1VOVDI6IHJkPTE2LjY3TUh6LCB3cj0yLjA4MzNNSHogKi8KKy8qIGludmVydGVkIG9wdG8gaXNvbGF0ZWQgcmVzZXQgb3V0cHV0OiAqLworI2RlZmluZSBXRFRfT1BUT05PVFJTVAkJKGlvKzEzKQkvKiB3cj1lbmFibGUsIHJkPWRpc2FibGUgKi8KKy8qIG9wdG8gaXNvbGF0ZWQgcmVzZXQgb3V0cHV0OiAqLworI2RlZmluZSBXRFRfT1BUT1JTVAkJKGlvKzE0KQkvKiB3cj1lbmFibGUsIHJkPWRpc2FibGUgKi8KKy8qIHByb2dyYW1tYWJsZSBvdXRwdXRzOiAqLworI2RlZmluZSBXRFRfUFJPR09VVAkJKGlvKzE1KQkvKiB3cj1lbmFibGUsIHJkPWRpc2FibGUgKi8KKworCQkJCQkJCQkvKiBGQU4gNTAxIDUwMCAqLworI2RlZmluZSBXRENfU1JfV0NDUgkJMQkvKiBBY3RpdmUgbG93ICovCS8qICBYICAgWCAgIFggICovCisjZGVmaW5lIFdEQ19TUl9UR09PRAkJMgkJCQkvKiAgWCAgIFggICAtICAqLworI2RlZmluZSBXRENfU1JfSVNPSTAJCTQJCQkJLyogIFggICBYICAgWCAgKi8KKyNkZWZpbmUgV0RDX1NSX0lTSUkxCQk4CQkJCS8qICBYICAgWCAgIFggICovCisjZGVmaW5lIFdEQ19TUl9GQU5HT09ECQkxNgkJCQkvKiAgWCAgIC0gICAtICAqLworI2RlZmluZSBXRENfU1JfUFNVT1ZFUgkJMzIJLyogQWN0aXZlIGxvdyAqLwkvKiAgWCAgIFggICAtICAqLworI2RlZmluZSBXRENfU1JfUFNVVU5EUgkJNjQJLyogQWN0aXZlIGxvdyAqLwkvKiAgWCAgIFggICAtICAqLworI2RlZmluZSBXRENfU1JfSVJRCQkxMjgJLyogQWN0aXZlIGxvdyAqLwkvKiAgWCAgIFggICBYICAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4NGFhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQuYwpAQCAtMCwwICsxLDY0NyBAQAorLyoKKyAqCUluZHVzdHJpYWwgQ29tcHV0ZXIgU291cmNlIFdEVDUwMC81MDEgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2LTE5OTcgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KKyAqCisgKglSZWxlYXNlIDAuMTAuCisgKgorICoJRml4ZXMKKyAqCQlEYXZlIEdyZWdvcmljaAk6CU1vZHVsYXJpc2F0aW9uIGFuZCBtaW5vciBidWdzCisgKgkJQWxhbiBDb3gJOglBZGRlZCB0aGUgd2F0Y2hkb2cgaW9jdGwoKSBzdHVmZgorICoJCUFsYW4gQ294CToJRml4ZWQgdGhlIHJlYm9vdCBwcm9ibGVtIChhcyBub3RlZCBieQorICoJCQkJCU1hdHQgQ3JvY2tlcikuCisgKgkJQWxhbiBDb3gJOglBZGRlZCB3ZHQ9IGJvb3Qgb3B0aW9uCisgKgkJQWxhbiBDb3gJOglDbGVhbmVkIHVwIGNvcHkvdXNlciBzdHVmZgorICoJCVRpbSBIb2NraW4JOglBZGRlZCBpbnNtb2QgcGFyYW1ldGVycywgY29tbWVudCBjbGVhbnVwCisgKgkJCQkJUGFyYW1ldGVyaXplZCB0aW1lb3V0CisgKgkJVGlncmFuIEFpdmF6aWFuCToJUmVzdHJ1Y3R1cmVkIHdkdF9pbml0KCkgdG8gaGFuZGxlIGZhaWx1cmVzCisgKgkJSm9lbCBCZWNrZXIJOglBZGRlZCBXRElPQ19HRVQvU0VUVElNRU9VVAorICoJCU1hdHQgRG9tc2NoCToJQWRkZWQgbm93YXlvdXQgbW9kdWxlIG9wdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgIndkNTAxcC5oIgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworLyoKKyAqCU1vZHVsZSBwYXJhbWV0ZXJzCisgKi8KKworI2RlZmluZSBXRF9USU1PIDYwCQkJLyogRGVmYXVsdCBoZWFydGJlYXQgPSA2MCBzZWNvbmRzICovCisKK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0RfVElNTzsKK3N0YXRpYyBpbnQgd2RfaGVhcnRiZWF0OworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgwPGhlYXJ0YmVhdDw2NTUzNiwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXRF9USU1PKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyogWW91IG11c3Qgc2V0IHRoZXNlIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuICovCitzdGF0aWMgaW50IGlvPTB4MjQwOworc3RhdGljIGludCBpcnE9MTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJXRFQgaW8gcG9ydCAoZGVmYXVsdD0weDI0MCkiKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIldEVCBpcnEgKGRlZmF1bHQ9MTEpIik7CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorLyogU3VwcG9ydCBmb3IgdGhlIEZhbiBUYWNob21ldGVyIG9uIHRoZSBXRFQ1MDEtUCAqLworc3RhdGljIGludCB0YWNob21ldGVyOworCittb2R1bGVfcGFyYW0odGFjaG9tZXRlciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGFjaG9tZXRlciwgIldEVDUwMS1QIEZhbiBUYWNob21ldGVyIHN1cHBvcnQgKDA9ZGlzYWJsZSwgZGVmYXVsdD0wKSIpOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisKKy8qCisgKglQcm9ncmFtbWluZyBzdXBwb3J0CisgKi8KKworc3RhdGljIHZvaWQgd2R0X2N0cl9tb2RlKGludCBjdHIsIGludCBtb2RlKQoreworCWN0cjw8PTY7CisJY3RyfD0weDMwOworCWN0cnw9KG1vZGU8PDEpOworCW91dGJfcChjdHIsIFdEVF9DUik7Cit9CisKK3N0YXRpYyB2b2lkIHdkdF9jdHJfbG9hZChpbnQgY3RyLCBpbnQgdmFsKQoreworCW91dGJfcCh2YWwmMHhGRiwgV0RUX0NPVU5UMCtjdHIpOworCW91dGJfcCh2YWw+PjgsIFdEVF9DT1VOVDArY3RyKTsKK30KKworLyoqCisgKgl3ZHRfc3RhcnQ6CisgKgorICoJU3RhcnQgdGhlIHdhdGNoZG9nIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHdkdF9zdGFydCh2b2lkKQoreworCWluYl9wKFdEVF9EQyk7CQkJLyogRGlzYWJsZSB3YXRjaGRvZyAqLworCXdkdF9jdHJfbW9kZSgwLDMpOwkJLyogUHJvZ3JhbSBDVFIwIGZvciBNb2RlIDM6IFNxdWFyZSBXYXZlIEdlbmVyYXRvciAqLworCXdkdF9jdHJfbW9kZSgxLDIpOwkJLyogUHJvZ3JhbSBDVFIxIGZvciBNb2RlIDI6IFJhdGUgR2VuZXJhdG9yICovCisJd2R0X2N0cl9tb2RlKDIsMCk7CQkvKiBQcm9ncmFtIENUUjIgZm9yIE1vZGUgMDogUHVsc2Ugb24gVGVybWluYWwgQ291bnQgKi8KKwl3ZHRfY3RyX2xvYWQoMCwgODk0OCk7CQkvKiBDb3VudCBhdCAxMDBIeiAqLworCXdkdF9jdHJfbG9hZCgxLHdkX2hlYXJ0YmVhdCk7CS8qIEhlYXJ0YmVhdCAqLworCXdkdF9jdHJfbG9hZCgyLDY1NTM1KTsJCS8qIExlbmd0aCBvZiByZXNldCBwdWxzZSAqLworCW91dGJfcCgwLCBXRFRfREMpOwkJLyogRW5hYmxlIHdhdGNoZG9nICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJd2R0X3N0b3A6CisgKgorICoJU3RvcCB0aGUgd2F0Y2hkb2cgZHJpdmVyLgorICovCisKK3N0YXRpYyBpbnQgd2R0X3N0b3AgKHZvaWQpCit7CisJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwlpbmJfcChXRFRfREMpOwkJCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwl3ZHRfY3RyX2xvYWQoMiwwKTsJCS8qIDAgbGVuZ3RoIHJlc2V0IHB1bHNlcyBub3cgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfcGluZzoKKyAqCisgKglSZWxvYWQgY291bnRlciBvbmUgd2l0aCB0aGUgd2F0Y2hkb2cgaGVhcnRiZWF0LiBXZSBkb24ndCBib3RoZXIgcmVsb2FkaW5nCisgKgl0aGUgY2FzY2FkZSBjb3VudGVyLgorICovCisKK3N0YXRpYyBpbnQgd2R0X3Bpbmcodm9pZCkKK3sKKwkvKiBXcml0ZSBhIHdhdGNoZG9nIHZhbHVlICovCisJaW5iX3AoV0RUX0RDKTsJCQkvKiBEaXNhYmxlIHdhdGNoZG9nICovCisJd2R0X2N0cl9tb2RlKDEsMik7CQkvKiBSZS1Qcm9ncmFtIENUUjEgZm9yIE1vZGUgMjogUmF0ZSBHZW5lcmF0b3IgKi8KKwl3ZHRfY3RyX2xvYWQoMSx3ZF9oZWFydGJlYXQpOwkvKiBIZWFydGJlYXQgKi8KKwlvdXRiX3AoMCwgV0RUX0RDKTsJCS8qIEVuYWJsZSB3YXRjaGRvZyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdF9zZXRfaGVhcnRiZWF0OgorICoJQHQ6CQl0aGUgbmV3IGhlYXJ0YmVhdCB2YWx1ZSB0aGF0IG5lZWRzIHRvIGJlIHNldC4KKyAqCisgKglTZXQgYSBuZXcgaGVhcnRiZWF0IHZhbHVlIGZvciB0aGUgd2F0Y2hkb2cgZGV2aWNlLiBJZiB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzCisgKglpbmNvcnJlY3Qgd2Uga2VlcCB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm4gLUVJTlZBTC4gSWYgc3VjY2Vzc2Z1bGwgd2UKKyAqCXJldHVybiAwLgorICovCitzdGF0aWMgaW50IHdkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICgodCA8IDEpIHx8ICh0ID4gNjU1MzUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhlYXJ0YmVhdCA9IHQ7CisJd2RfaGVhcnRiZWF0ID0gdCAqIDEwMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfZ2V0X3N0YXR1czoKKyAqCUBzdGF0dXM6CQl0aGUgbmV3IHN0YXR1cy4KKyAqCisgKglFeHRyYWN0IHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gZnJvbSBhIFdEVCB3YXRjaGRvZyBkZXZpY2UuIFRoZXJlIGFyZQorICoJc2V2ZXJhbCBib2FyZCB2YXJpYW50cyBzbyB3ZSBoYXZlIHRvIGtub3cgd2hpY2ggYml0cyBhcmUgdmFsaWQuIFNvbWUKKyAqCWJpdHMgZGVmYXVsdCB0byBvbmUgYW5kIHNvbWUgdG8gemVybyBpbiBvcmRlciB0byBiZSBtYXhpbWFsbHkgcGFpbmZ1bC4KKyAqCisgKgl3ZSB0aGVuIG1hcCB0aGUgYml0cyBvbnRvIHRoZSBzdGF0dXMgaW9jdGwgZmxhZ3MuCisgKi8KKworc3RhdGljIGludCB3ZHRfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBjaGFyIG5ld19zdGF0dXM9aW5iX3AoV0RUX1NSKTsKKworCSpzdGF0dXM9MDsKKwlpZiAobmV3X3N0YXR1cyAmIFdEQ19TUl9JU09JMCkKKwkJKnN0YXR1cyB8PSBXRElPRl9FWFRFUk4xOworCWlmIChuZXdfc3RhdHVzICYgV0RDX1NSX0lTSUkxKQorCQkqc3RhdHVzIHw9IFdESU9GX0VYVEVSTjI7CisjaWZkZWYgQ09ORklHX1dEVF81MDEKKwlpZiAoIShuZXdfc3RhdHVzICYgV0RDX1NSX1RHT09EKSkKKwkJKnN0YXR1cyB8PSBXRElPRl9PVkVSSEVBVDsKKwlpZiAoIShuZXdfc3RhdHVzICYgV0RDX1NSX1BTVU9WRVIpKQorCQkqc3RhdHVzIHw9IFdESU9GX1BPV0VST1ZFUjsKKwlpZiAoIShuZXdfc3RhdHVzICYgV0RDX1NSX1BTVVVORFIpKQorCQkqc3RhdHVzIHw9IFdESU9GX1BPV0VSVU5ERVI7CisJaWYgKHRhY2hvbWV0ZXIpIHsKKwkJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9GQU5HT09EKSkKKwkJCSpzdGF0dXMgfD0gV0RJT0ZfRkFORkFVTFQ7CisJfQorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorLyoqCisgKgl3ZHRfZ2V0X3RlbXBlcmF0dXJlOgorICoKKyAqCVJlcG9ydHMgdGhlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gVGhlIEFQSSBpcyBpbgorICoJZmFyZW5oZWl0LiBJdCB3YXMgZGVzaWduZWQgYnkgYW4gaW1wZXJpYWwgbWVhc3VyZW1lbnQgbHVkZGl0ZS4KKyAqLworCitzdGF0aWMgaW50IHdkdF9nZXRfdGVtcGVyYXR1cmUoaW50ICp0ZW1wZXJhdHVyZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjPWluYl9wKFdEVF9SVCk7CisKKwkqdGVtcGVyYXR1cmUgPSAoYyAqIDExIC8gMTUpICsgNzsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMSAqLworCisvKioKKyAqCXdkdF9pbnRlcnJ1cHQ6CisgKglAaXJxOgkJSW50ZXJydXB0IG51bWJlcgorICoJQGRldl9pZDoJVW51c2VkIGFzIHdlIGRvbid0IGFsbG93IG11bHRpcGxlIGRldmljZXMuCisgKglAcmVnczoJCVVudXNlZC4KKyAqCisgKglIYW5kbGUgYW4gaW50ZXJydXB0IGZyb20gdGhlIGJvYXJkLiBUaGVzZSBhcmUgcmFpc2VkIHdoZW4gdGhlIHN0YXR1cworICoJbWFwIGNoYW5nZXMgaW4gd2hhdCB0aGUgYm9hcmQgY29uc2lkZXJzIGFuIGludGVyZXN0aW5nIHdheS4gVGhhdCBtZWFucworICoJYSBmYWlsdXJlIGNvbmRpdGlvbiBvY2N1cnJpbmcuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHdkdF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqCVJlYWQgdGhlIHN0YXR1cyByZWdpc3RlciBzZWUgd2hhdCBpcyB1cCBhbmQKKwkgKgl0aGVuIHByaW50ayBpdC4KKwkgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1cz1pbmJfcChXRFRfU1IpOworCisJcHJpbnRrKEtFUk5fQ1JJVCAiV0RUIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19XRFRfNTAxCisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1RHT09EKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiT3ZlcmhlYXQgYWxhcm0uKCVkKVxuIixpbmJfcChXRFRfUlQpKTsKKwlpZiAoIShzdGF0dXMgJiBXRENfU1JfUFNVT1ZFUikpCisJCXByaW50ayhLRVJOX0NSSVQgIlBTVSBvdmVyIHZvbHRhZ2UuXG4iKTsKKwlpZiAoIShzdGF0dXMgJiBXRENfU1JfUFNVVU5EUikpCisJCXByaW50ayhLRVJOX0NSSVQgIlBTVSB1bmRlciB2b2x0YWdlLlxuIik7CisJaWYgKHRhY2hvbWV0ZXIpIHsKKwkJaWYgKCEoc3RhdHVzICYgV0RDX1NSX0ZBTkdPT0QpKQorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiUG9zc2libGUgZmFuIGZhdWx0LlxuIik7CisJfQorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1dDQ1IpKQorI2lmZGVmIFNPRlRXQVJFX1JFQk9PVAorI2lmZGVmIE9OTFlfVEVTVElORworCQlwcmludGsoS0VSTl9DUklUICJXb3VsZCBSZWJvb3QuXG4iKTsKKyNlbHNlCisJCXByaW50ayhLRVJOX0NSSVQgIkluaXRpYXRpbmcgc3lzdGVtIHJlYm9vdC5cbiIpOworCQltYWNoaW5lX3Jlc3RhcnQoTlVMTCk7CisjZW5kaWYKKyNlbHNlCisJCXByaW50ayhLRVJOX0NSSVQgIlJlc2V0IGluIDVtcy5cbiIpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qKgorICoJd2R0X3dyaXRlOgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZworICoJQGJ1ZjogYnVmZmVyIHRvIHdyaXRlICh1bnVzZWQgYXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIgaGVyZQorICoJQGNvdW50OiBjb3VudCBvZiBieXRlcworICoJQHBwb3M6IHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIHRvIHdyaXRlLiBObyBzZWVrcyBhbGxvd2VkCisgKgorICoJQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHNpZ25hbC4gQW55CisgKgl3cml0ZSBvZiBkYXRhIHdpbGwgZG8sIGFzIHdlIHdlIGRvbid0IGRlZmluZSBjb250ZW50IG1lYW5pbmcuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZihjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXdkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKgl3ZHRfaW9jdGw6CisgKglAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKglAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKglAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICoJVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqCWFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuIFdlIG9ubHkgYWN0dWFsbHkgdXNlZnVsbHkgc3VwcG9ydAorICoJcXVlcnlpbmcgY2FwYWJpbGl0aWVzIGFuZCBjdXJyZW50IHN0YXR1cy4KKyAqLworCitzdGF0aWMgaW50IHdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgbmV3X2hlYXJ0YmVhdDsKKwlpbnQgc3RhdHVzOworCisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9CQlXRElPRl9TRVRUSU1FT1VUfAorCQkJCQlXRElPRl9NQUdJQ0NMT1NFfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJCS5pZGVudGl0eSA9CQkiV0RUNTAwLzUwMSIsCisJfTsKKworCS8qIEFkZCBvcHRpb25zIGFjY29yZGluZyB0byB0aGUgY2FyZCB3ZSBoYXZlICovCisJaWRlbnQub3B0aW9ucyB8PSAoV0RJT0ZfRVhURVJOMXxXRElPRl9FWFRFUk4yKTsKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorCWlkZW50Lm9wdGlvbnMgfD0gKFdESU9GX09WRVJIRUFUfFdESU9GX1BPV0VSVU5ERVJ8V0RJT0ZfUE9XRVJPVkVSKTsKKwlpZiAodGFjaG9tZXRlcikKKwkJaWRlbnQub3B0aW9ucyB8PSBXRElPRl9GQU5GQVVMVDsKKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMSAqLworCisJc3dpdGNoKGNtZCkKKwl7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSk/LUVGQVVMVDowOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJd2R0X2dldF9zdGF0dXMoJnN0YXR1cyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCBwKTsKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdkdF9waW5nKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQkJaWYgKGdldF91c2VyKG5ld19oZWFydGJlYXQsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAod2R0X3NldF9oZWFydGJlYXQobmV3X2hlYXJ0YmVhdCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXdkdF9waW5nKCk7CisJCQkvKiBGYWxsICovCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCX0KK30KKworLyoqCisgKgl3ZHRfb3BlbjoKKyAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICoJVGhlIHdhdGNoZG9nIGRldmljZSBoYXMgYmVlbiBvcGVuZWQuIFRoZSB3YXRjaGRvZyBkZXZpY2UgaXMgc2luZ2xlCisgKglvcGVuIGFuZCBvbiBvcGVuaW5nIHdlIGxvYWQgdGhlIGNvdW50ZXJzLiBDb3VudGVyIHplcm8gaXMgYSAxMDBIegorICoJY2FzY2FkZSwgaW50byBjb3VudGVyIDEgd2hpY2ggZG93bmNvdW50cyB0byByZWJvb3QuIFdoZW4gdGhlIGNvdW50ZXIKKyAqCXRyaWdnZXJzIGNvdW50ZXIgMiBkb3duY291bnRzIHRoZSBsZW5ndGggb2YgdGhlIHJlc2V0IHB1bHNlIHdoaWNoCisgKglzZXQgc2V0IHRvIGJlIGFzIGxvbmcgYXMgcG9zc2libGUuCisgKi8KKworc3RhdGljIGludCB3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisJLyoKKwkgKglBY3RpdmF0ZQorCSAqLworCXdkdF9zdGFydCgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyoqCisgKgl3ZHRfcmVsZWFzZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqCVRoZSB3YXRjaGRvZyBoYXMgYSBjb25maWd1cmFibGUgQVBJLiBUaGVyZSBpcyBhIHJlbGlnaW91cyBkaXNwdXRlCisgKgliZXR3ZWVuIHBlb3BsZSB3aG8gd2FudCB0aGVpciB3YXRjaGRvZyB0byBiZSBhYmxlIHRvIHNodXQgZG93biBhbmQKKyAqCXRob3NlIHdobyB3YW50IHRvIGJlIHN1cmUgaWYgdGhlIHdhdGNoZG9nIG1hbmFnZXIgZGllcyB0aGUgbWFjaGluZQorICoJcmVib290cy4gSW4gdGhlIGZvcm1lciBjYXNlIHdlIGRpc2FibGUgdGhlIGNvdW50ZXJzLCBpbiB0aGUgbGF0dGVyCisgKgljYXNlIHlvdSBoYXZlIHRvIG9wZW4gaXQgYWdhaW4gdmVyeSBzb29uLgorICovCisKK3N0YXRpYyBpbnQgd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQl3ZHRfc3RvcCgpOworCQljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUICJ3ZHQ6IFdEVCBkZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseS4gIFdEVCB3aWxsIG5vdCBzdG9wIVxuIik7CisJCXdkdF9waW5nKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorLyoqCisgKgl3ZHRfdGVtcF9yZWFkOgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZyBib2FyZAorICoJQGJ1ZjogYnVmZmVyIHRvIHdyaXRlIDEgYnl0ZSBpbnRvCisgKglAY291bnQ6IGxlbmd0aCBvZiBidWZmZXIKKyAqCUBwdHI6IG9mZnNldCAobm8gc2VlayBhbGxvd2VkKQorICoKKyAqCVRlbXBfcmVhZCByZXBvcnRzIHRoZSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzIEZhaHJlbmhlaXQuIFRoZSBBUEkgaXMgaW4KKyAqCWZhcmVuaGVpdC4gSXQgd2FzIGRlc2lnbmVkIGJ5IGFuIGltcGVyaWFsIG1lYXN1cmVtZW50IGx1ZGRpdGUuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd2R0X3RlbXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnB0cikKK3sKKwlpbnQgdGVtcGVyYXR1cmU7CisKKwlpZiAod2R0X2dldF90ZW1wZXJhdHVyZSgmdGVtcGVyYXR1cmUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIgKGJ1ZiwgJnRlbXBlcmF0dXJlLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKgl3ZHRfdGVtcF9vcGVuOgorICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBkZXZpY2UKKyAqCisgKglUaGUgdGVtcGVyYXR1cmUgZGV2aWNlIGhhcyBiZWVuIG9wZW5lZC4KKyAqLworCitzdGF0aWMgaW50IHdkdF90ZW1wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKioKKyAqCXdkdF90ZW1wX3JlbGVhc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKglUaGUgdGVtcGVyYXR1cmUgZGV2aWNlIGhhcyBiZWVuIGNsb3NlZC4KKyAqLworCitzdGF0aWMgaW50IHdkdF90ZW1wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKworLyoqCisgKglub3RpZnlfc3lzOgorICoJQHRoaXM6IG91ciBub3RpZmllciBibG9jaworICoJQGNvZGU6IHRoZSBldmVudCBiZWluZyByZXBvcnRlZAorICoJQHVudXNlZDogdW51c2VkCisgKgorICoJT3VyIG5vdGlmaWVyIGlzIGNhbGxlZCBvbiBzeXN0ZW0gc2h1dGRvd25zLiBXZSB3YW50IHRvIHR1cm4gdGhlIGNhcmQKKyAqCW9mZiBhdCByZWJvb3Qgb3RoZXJ3aXNlIHRoZSBtYWNoaW5lIHdpbGwgcmVib290IGFnYWluIGR1cmluZyBtZW1vcnkKKyAqCXRlc3Qgb3Igd29yc2UgeWV0IGR1cmluZyB0aGUgZm9sbG93aW5nIGZzY2suIFRoaXMgd291bGQgc3VjaywgaW4gZmFjdAorICoJdHJ1c3QgbWUgLSBpZiBpdCBoYXBwZW5zIGl0IGRvZXMgc3Vjay4KKyAqLworCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZihjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBjYXJkIG9mZiAqLworCQl3ZHRfc3RvcCgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHdkdF9pb2N0bCwKKwkub3BlbgkJPSB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCT0gIndhdGNoZG9nIiwKKwkuZm9wcwk9ICZ3ZHRfZm9wcywKK307CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X3RlbXBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gd2R0X3RlbXBfcmVhZCwKKwkub3BlbgkJPSB3ZHRfdGVtcF9vcGVuLAorCS5yZWxlYXNlCT0gd2R0X3RlbXBfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB0ZW1wX21pc2NkZXYgPSB7CisJLm1pbm9yCT0gVEVNUF9NSU5PUiwKKwkubmFtZQk9ICJ0ZW1wZXJhdHVyZSIsCisJLmZvcHMJPSAmd2R0X3RlbXBfZm9wcywKK307CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKworLyoKKyAqCVRoZSBXRFQgY2FyZCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworLyoqCisgKgljbGVhbnVwX21vZHVsZToKKyAqCisgKglVbmxvYWQgdGhlIHdhdGNoZG9nLiBZb3UgY2Fubm90IGRvIHRoaXMgd2l0aCBhbnkgZmlsZSBoYW5kbGVzIG9wZW4uCisgKglJZiB5b3VyIHdhdGNoZG9nIGlzIHNldCB0byBjb250aW51ZSB0aWNraW5nIG9uIGNsb3NlIGFuZCB5b3UgdW5sb2FkCisgKglpdCwgd2VsbCBpdCBrZWVwcyB0aWNraW5nLiBXZSB3b24ndCBnZXQgdGhlIGludGVycnVwdCBidXQgdGhlIGJvYXJkCisgKgl3aWxsIG5vdCB0b3VjaCBQQyBtZW1vcnkgc28gYWxsIGlzIGZpbmUuIFlvdSBqdXN0IGhhdmUgdG8gbG9hZCBhIG5ldworICoJbW9kdWxlIGluIDYwIHNlY29uZHMgb3IgcmVib290LgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworI2lmZGVmIENPTkZJR19XRFRfNTAxCisJbWlzY19kZXJlZ2lzdGVyKCZ0ZW1wX21pc2NkZXYpOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJZnJlZV9pcnEoaXJxLCBOVUxMKTsKKwlyZWxlYXNlX3JlZ2lvbihpbyw4KTsKK30KKworLyoqCisgKiAJd2R0X2luaXQ6CisgKgorICoJU2V0IHVwIHRoZSBXRFQgd2F0Y2hkb2cgYm9hcmQuIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGdyYWIgdGhlCisgKglyZXNvdXJjZXMgd2UgcmVxdWlyZSBhbmQgYml0Y2ggaWYgYW55b25lIGJlYXQgdXMgdG8gdGhlbS4KKyAqCVRoZSBvcGVuKCkgZnVuY3Rpb24gd2lsbCBhY3R1YWxseSBraWNrIHRoZSBib2FyZCBvZmYuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkpIHsKKwkJd2R0X3NldF9oZWFydGJlYXQoV0RfVElNTyk7CisJCXByaW50ayhLRVJOX0lORk8gIndkdDogaGVhcnRiZWF0IHZhbHVlIG11c3QgYmUgMDxoZWFydGJlYXQ8NjU1MzYsIHVzaW5nICVkXG4iLAorCQkJV0RfVElNTyk7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgOCwgIndkdDUwMXAiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIndkdDogSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLCBpbyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB3ZHRfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJ3ZHQ1MDFwIiwgTlVMTCk7CisJaWYocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAid2R0OiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBpcnEpOworCQlnb3RvIG91dHJlZzsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaWYocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAid2R0OiBjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByZXQpOworCQlnb3RvIG91dGlycTsKKwl9CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnRlbXBfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIndkdDogY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlURU1QX01JTk9SLCByZXQpOworCQlnb3RvIG91dHJidDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAid2R0OiBjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIG91dG1pc2M7CisJfQorCisJcmV0ID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJXRFQ1MDAvNTAxLVAgZHJpdmVyIDAuMTAgYXQgMHglMDR4IChJbnRlcnJ1cHQgJWQpLiBoZWFydGJlYXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCWlvLCBpcnEsIGhlYXJ0YmVhdCwgbm93YXlvdXQpOworI2lmZGVmIENPTkZJR19XRFRfNTAxCisJcHJpbnRrKEtFUk5fSU5GTyAid2R0OiBGYW4gVGFjaG9tZXRlciBpcyAlc1xuIiwgKHRhY2hvbWV0ZXIgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKSk7CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKworb3V0OgorCXJldHVybiByZXQ7CisKK291dG1pc2M6CisjaWZkZWYgQ09ORklHX1dEVF81MDEKKwltaXNjX2RlcmVnaXN0ZXIoJnRlbXBfbWlzY2Rldik7CitvdXRyYnQ6CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKK291dGlycToKKwlmcmVlX2lycShpcnEsIE5VTEwpOworb3V0cmVnOgorCXJlbGVhc2VfcmVnaW9uKGlvLDgpOworCWdvdG8gb3V0OworfQorCittb2R1bGVfaW5pdCh3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh3ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgSVNBIElDUyB3YXRjaGRvZyBjYXJkcyAoV0RUNTAwLzUwMSkiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFRFTVBfTUlOT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDI4NS5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDI4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODI1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0Mjg1LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKglJbnRlbCAyMTI4NSB3YXRjaGRvZyBkcml2ZXIKKyAqCUNvcHlyaWdodCAoYykgUGhpbCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+LCAxOTk4CisgKgorICoJYmFzZWQgb24KKyAqCisgKglTb2Z0RG9nCTAuMDU6CUEgU29mdHdhcmUgV2F0Y2hkb2cgRGV2aWNlCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisKKy8qCisgKiBEZWZpbmUgdGhpcyB0byBzdG9wIHRoZSB3YXRjaGRvZyBhY3R1YWxseSByZWJvb3RpbmcgdGhlIG1hY2hpbmUuCisgKi8KKyN1bmRlZiBPTkxZX1RFU1RJTkcKKworc3RhdGljIHVuc2lnbmVkIGludCBzb2Z0X21hcmdpbiA9IDYwOwkJLyogaW4gc2Vjb25kcyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZWxvYWQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl9hbGl2ZTsKKworI2lmZGVmIE9OTFlfVEVTVElORworLyoKKyAqCUlmIHRoZSB0aW1lciBleHBpcmVzLi4KKyAqLworc3RhdGljIHZvaWQgd2F0Y2hkb2dfZmlyZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ayhLRVJOX0NSSVQgIldhdGNoZG9nOiBXb3VsZCBSZWJvb3QuXG4iKTsKKwkqQ1NSX1RJTUVSNF9DTlRMID0gMDsKKwkqQ1NSX1RJTUVSNF9DTFIgPSAwOworfQorI2VuZGlmCisKKy8qCisgKglSZWZyZXNoIHRoZSB0aW1lci4KKyAqLworc3RhdGljIHZvaWQgd2F0Y2hkb2dfcGluZyh2b2lkKQoreworCSpDU1JfVElNRVI0X0xPQUQgPSByZWxvYWQ7Cit9CisKKy8qCisgKglBbGxvdyBvbmx5IG9uZSBwZXJzb24gdG8gaG9sZCBpdCBvcGVuCisgKi8KK3N0YXRpYyBpbnQgd2F0Y2hkb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCpDU1JfU0ExMTBfQ05UTCAmICgxIDw8IDEzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDEsICZ0aW1lcl9hbGl2ZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZWxvYWQgPSBzb2Z0X21hcmdpbiAqIChtZW1fZmNsa18yMTI4NSAvIDI1Nik7CisKKwkqQ1NSX1RJTUVSNF9DTFIgPSAwOworCXdhdGNoZG9nX3BpbmcoKTsKKwkqQ1NSX1RJTUVSNF9DTlRMID0gVElNRVJfQ05UTF9FTkFCTEUgfCBUSU1FUl9DTlRMX0FVVE9SRUxPQUQKKwkJfCBUSU1FUl9DTlRMX0RJVjI1NjsKKworI2lmZGVmIE9OTFlfVEVTVElORworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9USU1FUjQsIHdhdGNoZG9nX2ZpcmUsIDAsICJ3YXRjaGRvZyIsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJKkNTUl9USU1FUjRfQ05UTCA9IDA7CisJCWNsZWFyX2JpdCgxLCAmdGltZXJfYWxpdmUpOworCX0KKyNlbHNlCisJLyoKKwkgKiBTZXR0aW5nIHRoaXMgYml0IGlzIGlycmV2ZXJzaWJsZTsgb25jZSBlbmFibGVkLCB0aGVyZSBpcworCSAqIG5vIHdheSB0byBkaXNhYmxlIHRoZSB3YXRjaGRvZy4KKwkgKi8KKwkqQ1NSX1NBMTEwX0NOVEwgfD0gMSA8PCAxMzsKKworCXJldCA9IDA7CisjZW5kaWYKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJU2h1dCBvZmYgdGhlIHRpbWVyLgorICoJTm90ZTogaWYgd2UgcmVhbGx5IGhhdmUgZW5hYmxlZCB0aGUgd2F0Y2hkb2csIHRoZXJlCisgKglpcyBubyB3YXkgdG8gdHVybiBvZmYuCisgKi8KK3N0YXRpYyBpbnQgd2F0Y2hkb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyNpZmRlZiBPTkxZX1RFU1RJTkcKKwlmcmVlX2lycShJUlFfVElNRVI0LCBOVUxMKTsKKwljbGVhcl9iaXQoMSwgJnRpbWVyX2FsaXZlKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAord2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKgorCSAqCVJlZnJlc2ggdGhlIHRpbWVyLgorCSAqLworCWlmIChsZW4pCisJCXdhdGNoZG9nX3BpbmcoKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkub3B0aW9ucwk9IFdESU9GX1NFVFRJTUVPVVQsCisJLmlkZW50aXR5CT0gIkZvb3RicmlkZ2UgV2F0Y2hkb2ciLAorfTsKKworc3RhdGljIGludAord2F0Y2hkb2dfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuZXdfbWFyZ2luOworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXQgPSAwOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXdhdGNoZG9nX3BpbmcoKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXJldCA9IGdldF91c2VyKG5ld19tYXJnaW4sIChpbnQgKilhcmcpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJLyogQXJiaXRyYXJ5LCBjYW4ndCBmaW5kIHRoZSBjYXJkJ3MgbGltaXRzICovCisJCWlmIChuZXdfbWFyZ2luIDwgMCB8fCBuZXdfbWFyZ2luID4gNjApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXNvZnRfbWFyZ2luID0gbmV3X21hcmdpbjsKKwkJcmVsb2FkID0gc29mdF9tYXJnaW4gKiAobWVtX2ZjbGtfMjEyODUgLyAyNTYpOworCQl3YXRjaGRvZ19waW5nKCk7CisJCS8qIEZhbGwgKi8KKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldCA9IHB1dF91c2VyKHNvZnRfbWFyZ2luLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdhdGNoZG9nX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3YXRjaGRvZ193cml0ZSwKKwkuaW9jdGwJCT0gd2F0Y2hkb2dfaW9jdGwsCisJLm9wZW4JCT0gd2F0Y2hkb2dfb3BlbiwKKwkucmVsZWFzZQk9IHdhdGNoZG9nX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2F0Y2hkb2dfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmd2F0Y2hkb2dfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZvb3RicmlkZ2Vfd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZ3YXRjaGRvZ19taXNjZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXByaW50aygiRm9vdGJyaWRnZSBXYXRjaGRvZyBUaW1lcjogMC4wMSwgdGltZXIgbWFyZ2luOiAlZCBzZWNcbiIsCisJICAgICAgIHNvZnRfbWFyZ2luKTsKKworCWlmIChtYWNoaW5lX2lzX2NhdHMoKSkKKwkJcHJpbnRrKCJXYXJuaW5nOiBXYXRjaGRvZyByZXNldCBtYXkgbm90IHdvcmsgb24gdGhpcyBtYWNoaW5lLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmb290YnJpZGdlX3dhdGNoZG9nX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJndhdGNoZG9nX21pc2NkZXYpOworfQorCitNT0RVTEVfQVVUSE9SKCJQaGlsIEJsdW5kZWxsIDxwYkBuZXh1cy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRm9vdGJyaWRnZSB3YXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKworbW9kdWxlX3BhcmFtKHNvZnRfbWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzb2Z0X21hcmdpbiwiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzIik7CisKK21vZHVsZV9pbml0KGZvb3RicmlkZ2Vfd2F0Y2hkb2dfaW5pdCk7Cittb2R1bGVfZXhpdChmb290YnJpZGdlX3dhdGNoZG9nX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDk3Ny5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDk3Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MmU5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0OTc3LmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKglXZHQ5NzcJMC4wMzoJQSBXYXRjaGRvZyBEZXZpY2UgZm9yIE5ldHdpbmRlciBXODM5NzdBRiBjaGlwCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk4IFJlYmVsLmNvbSAoV29vZHkgU3V3YWxza2kgPHdvb2R5QG5ldHdpbmRlci5vcmc+KQorICoKKyAqCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgMTQtRGVjLTIwMDEgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogICAgICAgICAgIEFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKgkxOS1EZWMtMjAwMSBXb29keSBTdXdhbHNraTogTmV0d2luZGVyIGZpeGVzLCBpb2N0bCBpbnRlcmZhY2UKKyAqCTA2LUphbi0yMDAyIFdvb2R5IFN1d2Fsc2tpOiBGb3IgY29tcGF0aWJpbGl0eSwgY29udmVydCBhbGwgdGltZW91dHMKKyAqCQkJCSAgICBmcm9tIG1pbnV0ZXMgdG8gc2Vjb25kcy4KKyAqICAgICAgMDctSnVsLTIwMDMgRGFuaWVsZSBCZWxsdWNjaTogQXVkaXQgcmV0dXJuIGNvZGUgb2YgbWlzY19yZWdpc3RlciBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBud3dhdGNoZG9nX2luaXQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQRlggIldkdDk3NzogIgorI2RlZmluZSBXQVRDSERPR19NSU5PUgkxMzAKKworI2RlZmluZQlERUZBVUxUX1RJTUVPVVQJNjAJCQkvKiBkZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcyAqLworCitzdGF0aWMJaW50IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7CitzdGF0aWMJaW50IHRpbWVvdXRNOwkJCQkvKiB0aW1lb3V0IGluIG1pbnV0ZXMgKi8KK3N0YXRpYwl1bnNpZ25lZCBsb25nIHRpbWVyX2FsaXZlOworc3RhdGljCWludCB0ZXN0bW9kZTsKK3N0YXRpYwljaGFyIGV4cGVjdF9jbG9zZTsKKworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyAoNjAuLjE1MzAwKSwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RJTUVPVVQpICIpIik7Cittb2R1bGVfcGFyYW0odGVzdG1vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRlc3Rtb2RlLCJXYXRjaGRvZyB0ZXN0bW9kZSAoMSA9IG5vIHJlYm9vdCksIGRlZmF1bHQ9MCIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqIFN0YXJ0IHRoZSB3YXRjaGRvZworICovCisKK3N0YXRpYyBpbnQgd2R0OTc3X3N0YXJ0KHZvaWQpCit7CisJLyogdW5sb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KKwlvdXRiKDB4ODcsMHgzNzApOworCW91dGIoMHg4NywweDM3MCk7CisKKwkvKiBzZWxlY3QgZGV2aWNlIEF1eDIgKGRldmljZT04KSBhbmQgc2V0IHdhdGNoZG9nIHJlZ3MgRjIsIEYzIGFuZCBGNAorCSAqIEYyIGhhcyB0aGUgdGltZW91dCBpbiBtaW51dGVzCisJICogRjMgY291bGQgYmUgc2V0IHRvIHRoZSBQT1dFUiBMRUQgYmxpbmsgKHdpdGggR1AxNyBzZXQgdG8gUG93ZXJMZWQpCisJICogICBhdCB0aW1lb3V0LCBhbmQgdG8gcmVzZXQgdGltZXIgb24ga2JkL21vdXNlIGFjdGl2aXR5IChub3QgaW1wbC4pCisJICogRjQgaXMgdXNlZCB0byBqdXN0IGNsZWFyIHRoZSBUSU1FT1VUJ2VkIHN0YXRlIChiaXQgMCkKKwkgKi8KKwlvdXRiKDB4MDcsMHgzNzApOworCW91dGIoMHgwOCwweDM3MSk7CisJb3V0YigweEYyLDB4MzcwKTsKKwlvdXRiKHRpbWVvdXRNLDB4MzcxKTsKKwlvdXRiKDB4RjMsMHgzNzApOworCW91dGIoMHgwMCwweDM3MSk7CS8qIGFub3RoZXIgc2V0dGluZyBpcyAwRSBmb3Iga2JkL21vdXNlL0xFRCAqLworCW91dGIoMHhGNCwweDM3MCk7CisJb3V0YigweDAwLDB4MzcxKTsKKworCS8qIGF0IGxhc3Qgc2VsZWN0IGRldmljZSBBdXgxIChkZXY9NykgYW5kIHNldCBHUDE2IGFzIGEgd2F0Y2hkb2cgb3V0cHV0ICovCisJLyogaW4gdGVzdCBtb2RlIHdhdGNoIHRoZSBiaXQgMSBvbiBGNCB0byBpbmRpY2F0ZSAidHJpZ2dlcmVkIiAqLworCWlmICghdGVzdG1vZGUpCisJeworCQlvdXRiKDB4MDcsMHgzNzApOworCQlvdXRiKDB4MDcsMHgzNzEpOworCQlvdXRiKDB4RTYsMHgzNzApOworCQlvdXRiKDB4MDgsMHgzNzEpOworCX0KKworCS8qIGxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLworCW91dGIoMHhBQSwweDM3MCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiYWN0aXZhdGVkLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0b3AgdGhlIHdhdGNoZG9nCisgKi8KKworc3RhdGljIGludCB3ZHQ5Nzdfc3RvcCh2b2lkKQoreworCS8qIHVubG9jayB0aGUgU3VwZXJJTyBjaGlwICovCisJb3V0YigweDg3LDB4MzcwKTsKKwlvdXRiKDB4ODcsMHgzNzApOworCisJLyogc2VsZWN0IGRldmljZSBBdXgyIChkZXZpY2U9OCkgYW5kIHNldCB3YXRjaGRvZyByZWdzIEYyLEYzIGFuZCBGNAorCSogRjMgaXMgcmVzZXQgdG8gaXRzIGRlZmF1bHQgc3RhdGUKKwkqIEY0IGNhbiBjbGVhciB0aGUgVElNRU9VVCdlZCBzdGF0ZSAoYml0IDApIC0gYmFjayB0byBkZWZhdWx0CisJKiBXZSBjYW4gbm90IHVzZSBHUDE3IGFzIGEgUG93ZXJMZWQsIGFzIHdlIHVzZSBpdHMgdXNhZ2UgYXMgYSBSZWRMZWQKKwkqLworCW91dGIoMHgwNywweDM3MCk7CisJb3V0YigweDA4LDB4MzcxKTsKKwlvdXRiKDB4RjIsMHgzNzApOworCW91dGIoMHhGRiwweDM3MSk7CisJb3V0YigweEYzLDB4MzcwKTsKKwlvdXRiKDB4MDAsMHgzNzEpOworCW91dGIoMHhGNCwweDM3MCk7CisJb3V0YigweDAwLDB4MzcxKTsKKwlvdXRiKDB4RjIsMHgzNzApOworCW91dGIoMHgwMCwweDM3MSk7CisKKwkvKiBhdCBsYXN0IHNlbGVjdCBkZXZpY2UgQXV4MSAoZGV2PTcpIGFuZCBzZXQgR1AxNiBhcyBhIHdhdGNoZG9nIG91dHB1dCAqLworCW91dGIoMHgwNywweDM3MCk7CisJb3V0YigweDA3LDB4MzcxKTsKKwlvdXRiKDB4RTYsMHgzNzApOworCW91dGIoMHgwOCwweDM3MSk7CisKKwkvKiBsb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KKwlvdXRiKDB4QUEsMHgzNzApOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggInNodXRkb3duLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNlbmQgYSBrZWVwYWxpdmUgcGluZyB0byB0aGUgd2F0Y2hkb2cKKyAqIFRoaXMgaXMgZG9uZSBieSBzaW1wbHkgcmUtd3JpdGluZyB0aGUgdGltZW91dCB0byByZWcuIDB4RjIKKyAqLworCitzdGF0aWMgaW50IHdkdDk3N19rZWVwYWxpdmUodm9pZCkKK3sKKwkvKiB1bmxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLworCW91dGIoMHg4NywweDM3MCk7CisJb3V0YigweDg3LDB4MzcwKTsKKworCS8qIHNlbGVjdCBkZXZpY2UgQXV4MiAoZGV2aWNlPTgpIGFuZCBraWNrcyB3YXRjaGRvZyByZWcgRjIgKi8KKwkvKiBGMiBoYXMgdGhlIHRpbWVvdXQgaW4gbWludXRlcyAqLworCW91dGIoMHgwNywweDM3MCk7CisJb3V0YigweDA4LDB4MzcxKTsKKwlvdXRiKDB4RjIsMHgzNzApOworCW91dGIodGltZW91dE0sMHgzNzEpOworCisJLyogbG9jayB0aGUgU3VwZXJJTyBjaGlwICovCisJb3V0YigweEFBLDB4MzcwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSB3YXRjaGRvZyB0aW1lb3V0IHZhbHVlCisgKi8KKworc3RhdGljIGludCB3ZHQ5Nzdfc2V0X3RpbWVvdXQoaW50IHQpCit7CisJaW50IHRtcnZhbDsKKworCS8qIGNvbnZlcnQgc2Vjb25kcyB0byBtaW51dGVzLCByb3VuZGluZyB1cCAqLworCXRtcnZhbCA9ICh0ICsgNTkpIC8gNjA7CisKKwlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkgeworCQkvKiB3ZSBoYXZlIGEgaHcgYnVnIHNvbWV3aGVyZSwgc28gZWFjaCA5NzcgbWludXRlIGlzIGFjdHVhbGx5IG9ubHkgMzBzZWMKKwkJICogIHRoaXMgbGltaXRzIHRoZSBtYXggdGltZW91dCB0byBoYWxmIG9mIGRldmljZSBtYXggb2YgMjU1IG1pbnV0ZXMuLi4KKwkJICovCisJCXRtcnZhbCArPSB0bXJ2YWw7CisJfQorCisJaWYgKCh0bXJ2YWwgPCAxKSB8fCAodG1ydmFsID4gMjU1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiB0aW1lb3V0IGlzIHRoZSB0aW1lb3V0IGluIHNlY29uZHMsIHRpbWVvdXRNIGlzIHRoZSB0aW1lb3V0IGluIG1pbnV0ZXMpICovCisJdGltZW91dCA9IHQ7CisJdGltZW91dE0gPSB0bXJ2YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIHdhdGNoZG9nIHN0YXR1cworICovCisKK3N0YXRpYyBpbnQgd2R0OTc3X2dldF9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJaW50IG5ld19zdGF0dXM7CisKKwkqc3RhdHVzPTA7CisKKwkvKiB1bmxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLworCW91dGIoMHg4NywweDM3MCk7CisJb3V0YigweDg3LDB4MzcwKTsKKworCS8qIHNlbGVjdCBkZXZpY2UgQXV4MiAoZGV2aWNlPTgpIGFuZCByZWFkIHdhdGNoZG9nIHJlZyBGNCAqLworCW91dGIoMHgwNywweDM3MCk7CisJb3V0YigweDA4LDB4MzcxKTsKKwlvdXRiKDB4RjQsMHgzNzApOworCW5ld19zdGF0dXMgPSBpbmIoMHgzNzEpOworCisJLyogbG9jayB0aGUgU3VwZXJJTyBjaGlwICovCisJb3V0YigweEFBLDB4MzcwKTsKKworCWlmIChuZXdfc3RhdHVzICYgMSkKKwkJKnN0YXR1cyB8PSBXRElPRl9DQVJEUkVTRVQ7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKK3N0YXRpYyBpbnQgd2R0OTc3X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogSWYgdGhlIHdhdGNoZG9nIGlzIGFsaXZlIHdlIGRvbid0IG5lZWQgdG8gc3RhcnQgaXQgYWdhaW4gKi8KKwlpZiggdGVzdF9hbmRfc2V0X2JpdCgwLCZ0aW1lcl9hbGl2ZSkgKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKG5vd2F5b3V0KQorCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJd2R0OTc3X3N0YXJ0KCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHdkdDk3N19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICoJU2h1dCBvZmYgdGhlIHRpbWVyLgorCSAqIAlMb2NrIGl0IGluIGlmIGl0J3MgYSBtb2R1bGUgYW5kIHdlIHNldCBub3dheW91dAorCSAqLworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpCisJeworCQl3ZHQ5Nzdfc3RvcCgpOworCQljbGVhcl9iaXQoMCwmdGltZXJfYWxpdmUpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJd2R0OTc3X2tlZXBhbGl2ZSgpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICAgIHdkdDk3N193cml0ZToKKyAqICAgICAgQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZworICogICAgICBAYnVmOiBidWZmZXIgdG8gd3JpdGUgKHVudXNlZCBhcyBkYXRhIGRvZXMgbm90IG1hdHRlciBoZXJlCisgKiAgICAgIEBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqICAgICAgQHBwb3M6IHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIHRvIHdyaXRlLiBObyBzZWVrcyBhbGxvd2VkCisgKgorICogICAgICBBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqICAgICAgd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdkdDk3N193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCXdkdDk3N19rZWVwYWxpdmUoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogICAgICB3ZHQ5NzdfaW9jdGw6CisgKiAgICAgIEBpbm9kZTogaW5vZGUgb2YgdGhlIGRldmljZQorICogICAgICBAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICogICAgICBAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKiAgICAgIEBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKiAgICAgIFRoZSB3YXRjaGRvZyBBUEkgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgZnVuY3Rpb25zIGZvciBhbGwgd2F0Y2hkb2dzCisgKiAgICAgIGFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuCisgKi8KKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCS5vcHRpb25zID0JCVdESU9GX1NFVFRJTUVPVVQgfAorCQkJCVdESU9GX01BR0lDQ0xPU0UgfAorCQkJCVdESU9GX0tFRVBBTElWRVBJTkcsCisJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCS5pZGVudGl0eSA9CQkiV2luYm9uZCA4Mzk3NyIsCit9OworCitzdGF0aWMgaW50IHdkdDk3N19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgc3RhdHVzOworCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgbmV3X3RpbWVvdXQ7CisJdW5pb24geworCQlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKmlkZW50OworCQlpbnQgX191c2VyICppOworCX0gdWFyZzsKKworCXVhcmcuaSA9IChpbnQgX191c2VyICopYXJnOworCisJc3dpdGNoKGNtZCkKKwl7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcih1YXJnLmlkZW50LCAmaWRlbnQsCisJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXdkdDk3N19nZXRfc3RhdHVzKCZzdGF0dXMpOworCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCB1YXJnLmkpOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgdWFyZy5pKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHQ5Nzdfa2VlcGFsaXZlKCk7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIgKG5ld19vcHRpb25zLCB1YXJnLmkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXdkdDk3N19zdG9wKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJd2R0OTc3X3N0YXJ0KCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCB1YXJnLmkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHdkdDk3N19zZXRfdGltZW91dChuZXdfdGltZW91dCkpCisJCSAgICByZXR1cm4gLUVJTlZBTDsKKworCQl3ZHQ5Nzdfa2VlcGFsaXZlKCk7CisJCS8qIEZhbGwgKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHVhcmcuaSk7CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2R0OTc3X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKQorCQl3ZHQ5Nzdfc3RvcCgpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0OTc3X2ZvcHM9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3ZHQ5Nzdfd3JpdGUsCisJLmlvY3RsCQk9IHdkdDk3N19pb2N0bCwKKwkub3BlbgkJPSB3ZHQ5Nzdfb3BlbiwKKwkucmVsZWFzZQk9IHdkdDk3N19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdDk3N19taXNjZGV2PQoreworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZ3ZHQ5NzdfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0OTc3X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0OTc3X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBud3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCWlmICghbWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayB0aGF0IHRoZSB0aW1lb3V0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKHdkdDk3N19zZXRfdGltZW91dCh0aW1lb3V0KSkgeworCQl3ZHQ5Nzdfc2V0X3RpbWVvdXQoREVGQVVMVF9USU1FT1VUKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSA2MDx0aW1lb3V0PDE1MzAwLCB1c2luZyAlZFxuIiwKKwkJCURFRkFVTFRfVElNRU9VVCk7CisJfQorCisJcmV0dmFsID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHQ5Nzdfbm90aWZpZXIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gbWlzY19yZWdpc3Rlcigmd2R0OTc3X21pc2NkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0dmFsKTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdDk3N19ub3RpZmllcik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQsIHRlc3Rtb2RlID0gJWkpXG4iLAorCQl0aW1lb3V0LCBub3dheW91dCwgdGVzdG1vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBud3dhdGNoZG9nX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJndkdDk3N19taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0OTc3X25vdGlmaWVyKTsKK30KKworbW9kdWxlX2luaXQobnd3YXRjaGRvZ19pbml0KTsKK21vZHVsZV9leGl0KG53d2F0Y2hkb2dfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIldvb2R5IFN1d2Fsc2tpIDx3b29keUBuZXR3aW5kZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXODM5NzdBRiBXYXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHRfcGNpLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0X3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NTFkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0X3BjaS5jCkBAIC0wLDAgKzEsNzYzIEBACisvKgorICoJSW5kdXN0cmlhbCBDb21wdXRlciBTb3VyY2UgUENJLVdEVDUwMC81MDEgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2LTE5OTcgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KKyAqCisgKglSZWxlYXNlIDAuMTAuCisgKgorICoJRml4ZXMKKyAqCQlEYXZlIEdyZWdvcmljaAk6CU1vZHVsYXJpc2F0aW9uIGFuZCBtaW5vciBidWdzCisgKgkJQWxhbiBDb3gJOglBZGRlZCB0aGUgd2F0Y2hkb2cgaW9jdGwoKSBzdHVmZgorICoJCUFsYW4gQ294CToJRml4ZWQgdGhlIHJlYm9vdCBwcm9ibGVtIChhcyBub3RlZCBieQorICoJCQkJCU1hdHQgQ3JvY2tlcikuCisgKgkJQWxhbiBDb3gJOglBZGRlZCB3ZHQ9IGJvb3Qgb3B0aW9uCisgKgkJQWxhbiBDb3gJOglDbGVhbmVkIHVwIGNvcHkvdXNlciBzdHVmZgorICoJCVRpbSBIb2NraW4JOglBZGRlZCBpbnNtb2QgcGFyYW1ldGVycywgY29tbWVudCBjbGVhbnVwCisgKgkJCQkJUGFyYW1ldGVyaXplZCB0aW1lb3V0CisgKgkJSlAgTm9sbG1hbm4JOglBZGRlZCBzdXBwb3J0IGZvciBQQ0kgd2R0NTAxcAorICoJCUFsYW4gQ294CToJU3BsaXQgSVNBIGFuZCBQQ0kgY2FyZHMgaW50byB0d28gZHJpdmVycworICoJCUplZmYgR2FyemlrCToJUENJIGNsZWFudXBzCisgKgkJVGlncmFuIEFpdmF6aWFuCToJUmVzdHJ1Y3R1cmVkIHdkdHBjaV9pbml0X29uZSgpIHRvIGhhbmRsZSBmYWlsdXJlcworICoJCUpvZWwgQmVja2VyIAk6CUFkZGVkIFdESU9DX0dFVC9TRVRUSU1FT1VUCisgKgkJWndhbmUgTXdhaWthbWJvCToJTWFnaWMgY2hhciBjbG9zaW5nLCBsb2NraW5nIGNoYW5nZXMsIGNsZWFudXBzCisgKgkJTWF0dCBEb21zY2gJOglub3dheW91dCBtb2R1bGUgb3B0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgV0RUX0lTX1BDSQorI2luY2x1ZGUgIndkNTAxcC5oIgorCisjZGVmaW5lIFBGWCAid2R0X3BjaTogIgorCisvKgorICogVW50aWwgQWNjZXNzIEkvTyBnZXRzIHRoZWlyIGFwcGxpY2F0aW9uIGZvciBhIFBDSSB2ZW5kb3IgSUQgYXBwcm92ZWQsCisgKiBJIGRvbid0IHRoaW5rIHRoYXQgaXQncyBhcHByb3ByaWF0ZSB0byBtb3ZlIHRoZXNlIGNvbnN0YW50cyBpbnRvIHRoZQorICogcmVndWxhciBwY2lfaWRzLmggZmlsZS4gLS0gSlBOIDIwMDAvMDEvMTgKKyAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQUNDRVNTSU8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BQ0NFU1NJTyAweDQ5NGYKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1dER19DU00KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XREdfQ1NNIDB4MjJjMAorI2VuZGlmCisKKy8qIFdlIGNhbiBvbmx5IHVzZSAxIGNhcmQgZHVlIHRvIHRoZSAvZGV2L3dhdGNoZG9nIHJlc3RyaWN0aW9uICovCitzdGF0aWMgaW50IGRldl9jb3VudDsKKworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CitzdGF0aWMgc3BpbmxvY2tfdCB3ZHRwY2lfbG9jazsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworc3RhdGljIGludCBpbzsKK3N0YXRpYyBpbnQgaXJxOworCisvKiBEZWZhdWx0IHRpbWVvdXQgKi8KKyNkZWZpbmUgV0RfVElNTyA2MAkJCS8qIERlZmF1bHQgaGVhcnRiZWF0ID0gNjAgc2Vjb25kcyAqLworCitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9IFdEX1RJTU87CitzdGF0aWMgaW50IHdkX2hlYXJ0YmVhdDsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdCBpbiBzZWNvbmRzLiAoMDxoZWFydGJlYXQ8NjU1MzYsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0RfVElNTykgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKy8qIFN1cHBvcnQgZm9yIHRoZSBGYW4gVGFjaG9tZXRlciBvbiB0aGUgUENJLVdEVDUwMSAqLworc3RhdGljIGludCB0YWNob21ldGVyOworCittb2R1bGVfcGFyYW0odGFjaG9tZXRlciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGFjaG9tZXRlciwgIlBDSS1XRFQ1MDEgRmFuIFRhY2hvbWV0ZXIgc3VwcG9ydCAoMD1kaXNhYmxlLCBkZWZhdWx0PTApIik7CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisKKy8qCisgKglQcm9ncmFtbWluZyBzdXBwb3J0CisgKi8KKworc3RhdGljIHZvaWQgd2R0cGNpX2N0cl9tb2RlKGludCBjdHIsIGludCBtb2RlKQoreworCWN0cjw8PTY7CisJY3RyfD0weDMwOworCWN0cnw9KG1vZGU8PDEpOworCW91dGJfcChjdHIsIFdEVF9DUik7Cit9CisKK3N0YXRpYyB2b2lkIHdkdHBjaV9jdHJfbG9hZChpbnQgY3RyLCBpbnQgdmFsKQoreworCW91dGJfcCh2YWwmMHhGRiwgV0RUX0NPVU5UMCtjdHIpOworCW91dGJfcCh2YWw+PjgsIFdEVF9DT1VOVDArY3RyKTsKK30KKworLyoqCisgKgl3ZHRwY2lfc3RhcnQ6CisgKgorICoJU3RhcnQgdGhlIHdhdGNoZG9nIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9zdGFydCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0cGNpX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogInBldCIgdGhlIHdhdGNoZG9nLCBhcyBBY2Nlc3Mgc2F5cy4KKwkgKiBUaGlzIHJlc2V0cyB0aGUgY2xvY2sgb3V0cHV0cy4KKwkgKi8KKwlpbmJfcChXRFRfREMpOwkJCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwl3ZHRwY2lfY3RyX21vZGUoMiwwKTsJCS8qIFByb2dyYW0gQ1RSMiBmb3IgTW9kZSAwOiBQdWxzZSBvbiBUZXJtaW5hbCBDb3VudCAqLworCW91dGJfcCgwLCBXRFRfREMpOwkJLyogRW5hYmxlIHdhdGNoZG9nICovCisKKwlpbmJfcChXRFRfREMpOwkJCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwlvdXRiX3AoMCwgV0RUX0NMT0NLKTsJCS8qIDIuMDgzM01IeiBjbG9jayAqLworCWluYl9wKFdEVF9CVVpaRVIpOwkJLyogZGlzYWJsZSAqLworCWluYl9wKFdEVF9PUFRPTk9UUlNUKTsJCS8qIGRpc2FibGUgKi8KKwlpbmJfcChXRFRfT1BUT1JTVCk7CQkvKiBkaXNhYmxlICovCisJaW5iX3AoV0RUX1BST0dPVVQpOwkJLyogZGlzYWJsZSAqLworCXdkdHBjaV9jdHJfbW9kZSgwLDMpOwkJLyogUHJvZ3JhbSBDVFIwIGZvciBNb2RlIDM6IFNxdWFyZSBXYXZlIEdlbmVyYXRvciAqLworCXdkdHBjaV9jdHJfbW9kZSgxLDIpOwkJLyogUHJvZ3JhbSBDVFIxIGZvciBNb2RlIDI6IFJhdGUgR2VuZXJhdG9yICovCisJd2R0cGNpX2N0cl9tb2RlKDIsMSk7CQkvKiBQcm9ncmFtIENUUjIgZm9yIE1vZGUgMTogUmV0cmlnZ2VyYWJsZSBPbmUtU2hvdCAqLworCXdkdHBjaV9jdHJfbG9hZCgwLDIwODMzKTsJLyogY291bnQgYXQgMTAwSHogKi8KKwl3ZHRwY2lfY3RyX2xvYWQoMSx3ZF9oZWFydGJlYXQpOy8qIEhlYXJ0YmVhdCAqLworCS8qIERPIE5PVCBMT0FEIENUUjIgb24gUENJIGNhcmQhIC0tIEpQTiAqLworCW91dGJfcCgwLCBXRFRfREMpOwkJLyogRW5hYmxlIHdhdGNoZG9nICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHRwY2lfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdHBjaV9zdG9wOgorICoKKyAqCVN0b3AgdGhlIHdhdGNoZG9nIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9zdG9wICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBUdXJuIHRoZSBjYXJkIG9mZiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHRwY2lfbG9jaywgZmxhZ3MpOworCWluYl9wKFdEVF9EQyk7CQkJLyogRGlzYWJsZSB3YXRjaGRvZyAqLworCXdkdHBjaV9jdHJfbG9hZCgyLDApOwkJLyogMCBsZW5ndGggcmVzZXQgcHVsc2VzIG5vdyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkdHBjaV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJd2R0cGNpX3Bpbmc6CisgKgorICoJUmVsb2FkIGNvdW50ZXIgb25lIHdpdGggdGhlIHdhdGNoZG9nIGhlYXJ0YmVhdC4gV2UgZG9uJ3QgYm90aGVyIHJlbG9hZGluZworICoJdGhlIGNhc2NhZGUgY291bnRlci4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9waW5nKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFdyaXRlIGEgd2F0Y2hkb2cgdmFsdWUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0cGNpX2xvY2ssIGZsYWdzKTsKKwlpbmJfcChXRFRfREMpOwkJCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwl3ZHRwY2lfY3RyX21vZGUoMSwyKTsJCS8qIFJlLVByb2dyYW0gQ1RSMSBmb3IgTW9kZSAyOiBSYXRlIEdlbmVyYXRvciAqLworCXdkdHBjaV9jdHJfbG9hZCgxLHdkX2hlYXJ0YmVhdCk7LyogSGVhcnRiZWF0ICovCisJb3V0Yl9wKDAsIFdEVF9EQyk7CQkvKiBFbmFibGUgd2F0Y2hkb2cgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHRwY2lfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdHBjaV9zZXRfaGVhcnRiZWF0OgorICoJQHQ6CQl0aGUgbmV3IGhlYXJ0YmVhdCB2YWx1ZSB0aGF0IG5lZWRzIHRvIGJlIHNldC4KKyAqCisgKglTZXQgYSBuZXcgaGVhcnRiZWF0IHZhbHVlIGZvciB0aGUgd2F0Y2hkb2cgZGV2aWNlLiBJZiB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzCisgKglpbmNvcnJlY3Qgd2Uga2VlcCB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm4gLUVJTlZBTC4gSWYgc3VjY2Vzc2Z1bGwgd2UKKyAqCXJldHVybiAwLgorICovCitzdGF0aWMgaW50IHdkdHBjaV9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCS8qIEFyYml0cmFyeSwgY2FuJ3QgZmluZCB0aGUgY2FyZCdzIGxpbWl0cyAqLworCWlmICgodCA8IDEpIHx8ICh0ID4gNjU1MzUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhlYXJ0YmVhdCA9IHQ7CisJd2RfaGVhcnRiZWF0ID0gdCAqIDEwMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRwY2lfZ2V0X3N0YXR1czoKKyAqCUBzdGF0dXM6CQl0aGUgbmV3IHN0YXR1cy4KKyAqCisgKglFeHRyYWN0IHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gZnJvbSBhIFdEVCB3YXRjaGRvZyBkZXZpY2UuIFRoZXJlIGFyZQorICoJc2V2ZXJhbCBib2FyZCB2YXJpYW50cyBzbyB3ZSBoYXZlIHRvIGtub3cgd2hpY2ggYml0cyBhcmUgdmFsaWQuIFNvbWUKKyAqCWJpdHMgZGVmYXVsdCB0byBvbmUgYW5kIHNvbWUgdG8gemVybyBpbiBvcmRlciB0byBiZSBtYXhpbWFsbHkgcGFpbmZ1bC4KKyAqCisgKgl3ZSB0aGVuIG1hcCB0aGUgYml0cyBvbnRvIHRoZSBzdGF0dXMgaW9jdGwgZmxhZ3MuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBjaGFyIG5ld19zdGF0dXM9aW5iX3AoV0RUX1NSKTsKKworCSpzdGF0dXM9MDsKKwlpZiAobmV3X3N0YXR1cyAmIFdEQ19TUl9JU09JMCkKKwkJKnN0YXR1cyB8PSBXRElPRl9FWFRFUk4xOworCWlmIChuZXdfc3RhdHVzICYgV0RDX1NSX0lTSUkxKQorCQkqc3RhdHVzIHw9IFdESU9GX0VYVEVSTjI7CisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCisJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9UR09PRCkpCisJCSpzdGF0dXMgfD0gV0RJT0ZfT1ZFUkhFQVQ7CisJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9QU1VPVkVSKSkKKwkJKnN0YXR1cyB8PSBXRElPRl9QT1dFUk9WRVI7CisJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9QU1VVTkRSKSkKKwkJKnN0YXR1cyB8PSBXRElPRl9QT1dFUlVOREVSOworCWlmICh0YWNob21ldGVyKSB7CisJCWlmICghKG5ld19zdGF0dXMgJiBXRENfU1JfRkFOR09PRCkpCisJCQkqc3RhdHVzIHw9IFdESU9GX0ZBTkZBVUxUOworCX0KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorLyoqCisgKgl3ZHRwY2lfZ2V0X3RlbXBlcmF0dXJlOgorICoKKyAqCVJlcG9ydHMgdGhlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gVGhlIEFQSSBpcyBpbgorICoJZmFyZW5oZWl0LiBJdCB3YXMgZGVzaWduZWQgYnkgYW4gaW1wZXJpYWwgbWVhc3VyZW1lbnQgbHVkZGl0ZS4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9nZXRfdGVtcGVyYXR1cmUoaW50ICp0ZW1wZXJhdHVyZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjPWluYl9wKFdEVF9SVCk7CisKKwkqdGVtcGVyYXR1cmUgPSAoYyAqIDExIC8gMTUpICsgNzsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKworLyoqCisgKgl3ZHRwY2lfaW50ZXJydXB0OgorICoJQGlycToJCUludGVycnVwdCBudW1iZXIKKyAqCUBkZXZfaWQ6CVVudXNlZCBhcyB3ZSBkb24ndCBhbGxvdyBtdWx0aXBsZSBkZXZpY2VzLgorICoJQHJlZ3M6CQlVbnVzZWQuCisgKgorICoJSGFuZGxlIGFuIGludGVycnVwdCBmcm9tIHRoZSBib2FyZC4gVGhlc2UgYXJlIHJhaXNlZCB3aGVuIHRoZSBzdGF0dXMKKyAqCW1hcCBjaGFuZ2VzIGluIHdoYXQgdGhlIGJvYXJkIGNvbnNpZGVycyBhbiBpbnRlcmVzdGluZyB3YXkuIFRoYXQgbWVhbnMKKyAqCWEgZmFpbHVyZSBjb25kaXRpb24gb2NjdXJyaW5nLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3ZHRwY2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyoKKwkgKglSZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIgc2VlIHdoYXQgaXMgdXAgYW5kCisJICoJdGhlbiBwcmludGsgaXQuCisJICovCisJdW5zaWduZWQgY2hhciBzdGF0dXM9aW5iX3AoV0RUX1NSKTsKKworCXByaW50ayhLRVJOX0NSSVQgUEZYICJzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKwlpZiAoIShzdGF0dXMgJiBXRENfU1JfVEdPT0QpKQorIAkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIk92ZXJoZWF0IGFsYXJtLiglZClcbiIsaW5iX3AoV0RUX1JUKSk7CisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1BTVU9WRVIpKQorIAkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlBTVSBvdmVyIHZvbHRhZ2UuXG4iKTsKKwlpZiAoIShzdGF0dXMgJiBXRENfU1JfUFNVVU5EUikpCisgCQlwcmludGsoS0VSTl9DUklUIFBGWCAiUFNVIHVuZGVyIHZvbHRhZ2UuXG4iKTsKKwlpZiAodGFjaG9tZXRlcikgeworCQlpZiAoIShzdGF0dXMgJiBXRENfU1JfRkFOR09PRCkpCisJCQlwcmludGsoS0VSTl9DUklUIFBGWCAiUG9zc2libGUgZmFuIGZhdWx0LlxuIik7CisJfQorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxX1BDSSAqLworCWlmICghKHN0YXR1cyZXRENfU1JfV0NDUikpCisjaWZkZWYgU09GVFdBUkVfUkVCT09UCisjaWZkZWYgT05MWV9URVNUSU5HCisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJXb3VsZCBSZWJvb3QuXG4iKTsKKyNlbHNlCisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJJbml0aWF0aW5nIHN5c3RlbSByZWJvb3QuXG4iKTsKKwkJbWFjaGluZV9yZXN0YXJ0KE5VTEwpOworI2VuZGlmCisjZWxzZQorCQlwcmludGsoS0VSTl9DUklUIFBGWCAiUmVzZXQgaW4gNW1zLlxuIik7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKgl3ZHRwY2lfd3JpdGU6CisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCisgKglAYnVmOiBidWZmZXIgdG8gd3JpdGUgKHVudXNlZCBhcyBkYXRhIGRvZXMgbm90IG1hdHRlciBoZXJlCisgKglAY291bnQ6IGNvdW50IG9mIGJ5dGVzCisgKglAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKKyAqCisgKglBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqCXdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2Ugd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KKyAqLworCitzdGF0aWMgc3NpemVfdCB3ZHRwY2lfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmKGdldF91c2VyKGMsIGJ1ZitpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQl3ZHRwY2lfcGluZygpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKgl3ZHRwY2lfaW9jdGw6CisgKglAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKglAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKglAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICoJVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqCWFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuIFdlIG9ubHkgYWN0dWFsbHkgdXNlZnVsbHkgc3VwcG9ydAorICoJcXVlcnlpbmcgY2FwYWJpbGl0aWVzIGFuZCBjdXJyZW50IHN0YXR1cy4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X2hlYXJ0YmVhdDsKKwlpbnQgc3RhdHVzOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9CQlXRElPRl9TRVRUSU1FT1VUfAorCQkJCQlXRElPRl9NQUdJQ0NMT1NFfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJCS5pZGVudGl0eSA9CQkiUENJLVdEVDUwMC81MDEiLAorCX07CisKKwkvKiBBZGQgb3B0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGNhcmQgd2UgaGF2ZSAqLworCWlkZW50Lm9wdGlvbnMgfD0gKFdESU9GX0VYVEVSTjF8V0RJT0ZfRVhURVJOMik7CisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCisJaWRlbnQub3B0aW9ucyB8PSAoV0RJT0ZfT1ZFUkhFQVR8V0RJT0ZfUE9XRVJVTkRFUnxXRElPRl9QT1dFUk9WRVIpOworCWlmICh0YWNob21ldGVyKQorCQlpZGVudC5vcHRpb25zIHw9IFdESU9GX0ZBTkZBVUxUOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxX1BDSSAqLworCisJc3dpdGNoKGNtZCkKKwl7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSk/LUVGQVVMVDowOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJd2R0cGNpX2dldF9zdGF0dXMoJnN0YXR1cyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCBwKTsKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdkdHBjaV9waW5nKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQkJaWYgKGdldF91c2VyKG5ld19oZWFydGJlYXQsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAod2R0cGNpX3NldF9oZWFydGJlYXQobmV3X2hlYXJ0YmVhdCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXdkdHBjaV9waW5nKCk7CisJCQkvKiBGYWxsICovCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCX0KK30KKworLyoqCisgKgl3ZHRwY2lfb3BlbjoKKyAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICoJVGhlIHdhdGNoZG9nIGRldmljZSBoYXMgYmVlbiBvcGVuZWQuIFRoZSB3YXRjaGRvZyBkZXZpY2UgaXMgc2luZ2xlCisgKglvcGVuIGFuZCBvbiBvcGVuaW5nIHdlIGxvYWQgdGhlIGNvdW50ZXJzLiBDb3VudGVyIHplcm8gaXMgYSAxMDBIegorICoJY2FzY2FkZSwgaW50byBjb3VudGVyIDEgd2hpY2ggZG93bmNvdW50cyB0byByZWJvb3QuIFdoZW4gdGhlIGNvdW50ZXIKKyAqCXRyaWdnZXJzIGNvdW50ZXIgMiBkb3duY291bnRzIHRoZSBsZW5ndGggb2YgdGhlIHJlc2V0IHB1bHNlIHdoaWNoCisgKglzZXQgc2V0IHRvIGJlIGFzIGxvbmcgYXMgcG9zc2libGUuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZG93bl90cnlsb2NrKCZvcGVuX3NlbSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpIHsKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl9CisJLyoKKwkgKglBY3RpdmF0ZQorCSAqLworCXdkdHBjaV9zdGFydCgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyoqCisgKgl3ZHRwY2lfcmVsZWFzZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqCVRoZSB3YXRjaGRvZyBoYXMgYSBjb25maWd1cmFibGUgQVBJLiBUaGVyZSBpcyBhIHJlbGlnaW91cyBkaXNwdXRlCisgKgliZXR3ZWVuIHBlb3BsZSB3aG8gd2FudCB0aGVpciB3YXRjaGRvZyB0byBiZSBhYmxlIHRvIHNodXQgZG93biBhbmQKKyAqCXRob3NlIHdobyB3YW50IHRvIGJlIHN1cmUgaWYgdGhlIHdhdGNoZG9nIG1hbmFnZXIgZGllcyB0aGUgbWFjaGluZQorICoJcmVib290cy4gSW4gdGhlIGZvcm1lciBjYXNlIHdlIGRpc2FibGUgdGhlIGNvdW50ZXJzLCBpbiB0aGUgbGF0dGVyCisgKgljYXNlIHlvdSBoYXZlIHRvIG9wZW4gaXQgYWdhaW4gdmVyeSBzb29uLgorICovCisKK3N0YXRpYyBpbnQgd2R0cGNpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQl3ZHRwY2lfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgdGltZXIhIik7CisJCXdkdHBjaV9waW5nKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJdXAoJm9wZW5fc2VtKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorLyoqCisgKgl3ZHRwY2lfdGVtcF9yZWFkOgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZyBib2FyZAorICoJQGJ1ZjogYnVmZmVyIHRvIHdyaXRlIDEgYnl0ZSBpbnRvCisgKglAY291bnQ6IGxlbmd0aCBvZiBidWZmZXIKKyAqCUBwdHI6IG9mZnNldCAobm8gc2VlayBhbGxvd2VkKQorICoKKyAqCVJlYWQgcmVwb3J0cyB0aGUgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBGYWhyZW5oZWl0LiBUaGUgQVBJIGlzIGluCisgKglmYWhyZW5oZWl0LiBJdCB3YXMgZGVzaWduZWQgYnkgYW4gaW1wZXJpYWwgbWVhc3VyZW1lbnQgbHVkZGl0ZS4KKyAqLworCitzdGF0aWMgc3NpemVfdCB3ZHRwY2lfdGVtcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHRyKQoreworCWludCB0ZW1wZXJhdHVyZTsKKworCWlmICh3ZHRwY2lfZ2V0X3RlbXBlcmF0dXJlKCZ0ZW1wZXJhdHVyZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfdG9fdXNlciAoYnVmLCAmdGVtcGVyYXR1cmUsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXdkdHBjaV90ZW1wX29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqCVRoZSB0ZW1wZXJhdHVyZSBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLgorICovCisKK3N0YXRpYyBpbnQgd2R0cGNpX3RlbXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qKgorICoJd2R0cGNpX3RlbXBfcmVsZWFzZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqCVRoZSB0ZW1wZXJhdHVyZSBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkLgorICovCisKK3N0YXRpYyBpbnQgd2R0cGNpX3RlbXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKworLyoqCisgKglub3RpZnlfc3lzOgorICoJQHRoaXM6IG91ciBub3RpZmllciBibG9jaworICoJQGNvZGU6IHRoZSBldmVudCBiZWluZyByZXBvcnRlZAorICoJQHVudXNlZDogdW51c2VkCisgKgorICoJT3VyIG5vdGlmaWVyIGlzIGNhbGxlZCBvbiBzeXN0ZW0gc2h1dGRvd25zLiBXZSB3YW50IHRvIHR1cm4gdGhlIGNhcmQKKyAqCW9mZiBhdCByZWJvb3Qgb3RoZXJ3aXNlIHRoZSBtYWNoaW5lIHdpbGwgcmVib290IGFnYWluIGR1cmluZyBtZW1vcnkKKyAqCXRlc3Qgb3Igd29yc2UgeWV0IGR1cmluZyB0aGUgZm9sbG93aW5nIGZzY2suIFRoaXMgd291bGQgc3VjaywgaW4gZmFjdAorICoJdHJ1c3QgbWUgLSBpZiBpdCBoYXBwZW5zIGl0IGRvZXMgc3Vjay4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwkJd2R0cGNpX3N0b3AoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdHBjaV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0cGNpX3dyaXRlLAorCS5pb2N0bAkJPSB3ZHRwY2lfaW9jdGwsCisJLm9wZW4JCT0gd2R0cGNpX29wZW4sCisJLnJlbGVhc2UJPSB3ZHRwY2lfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRwY2lfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmd2R0cGNpX2ZvcHMsCit9OworCisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRwY2lfdGVtcF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSB3ZHRwY2lfdGVtcF9yZWFkLAorCS5vcGVuCQk9IHdkdHBjaV90ZW1wX29wZW4sCisJLnJlbGVhc2UJPSB3ZHRwY2lfdGVtcF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHRlbXBfbWlzY2RldiA9IHsKKwkubWlub3IJPSBURU1QX01JTk9SLAorCS5uYW1lCT0gInRlbXBlcmF0dXJlIiwKKwkuZm9wcwk9ICZ3ZHRwY2lfdGVtcF9mb3BzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKworLyoKKyAqCVRoZSBXRFQgY2FyZCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdHBjaV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdHBjaV9ub3RpZnlfc3lzLAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3ZHRwY2lfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgcmV0ID0gLUVJTzsKKworCWRldl9jb3VudCsrOworCWlmIChkZXZfY291bnQgPiAxKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJ0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIDEgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlIChkZXYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJOb3QgcG9zc2libGUgdG8gZW5hYmxlIFBDSSBEZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocGNpX3Jlc291cmNlX3N0YXJ0IChkZXYsIDIpID09IDB4MDAwMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiTm8gSS9PLUFkZHJlc3MgZm9yIGNhcmQgZGV0ZWN0ZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9wY2k7CisJfQorCisJc2VtYV9pbml0KCZvcGVuX3NlbSwgMSk7CisJc3Bpbl9sb2NrX2luaXQoJndkdHBjaV9sb2NrKTsKKworCWlycSA9IGRldi0+aXJxOworCWlvID0gcGNpX3Jlc291cmNlX3N0YXJ0IChkZXYsIDIpOworCisJaWYgKHJlcXVlc3RfcmVnaW9uIChpbywgMTYsICJ3ZHRfcGNpIikgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLCBpbyk7CisJCWdvdG8gb3V0X3BjaTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEgKGlycSwgd2R0cGNpX2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJCQkgIndkdF9wY2kiLCAmd2R0cGNpX21pc2NkZXYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJUlEgJWQgaXMgbm90IGZyZWVcbiIsIGlycSk7CisJCWdvdG8gb3V0X3JlZzsKKwl9CisKKwlwcmludGsgKCJQQ0ktV0RUNTAwLzUwMSAoUENJLVdERy1DU00pIGRyaXZlciAwLjEwIGF0IDB4JTA0eCAoSW50ZXJydXB0ICVkKVxuIiwKKwkJaW8sIGlycSk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAod2R0cGNpX3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KSkgeworCQl3ZHRwY2lfc2V0X2hlYXJ0YmVhdChXRF9USU1PKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImhlYXJ0YmVhdCB2YWx1ZSBtdXN0IGJlIDA8aGVhcnRiZWF0PDY1NTM2LCB1c2luZyAlZFxuIiwKKwkJCVdEX1RJTU8pOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllciAoJndkdHBjaV9ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwgcmV0KTsKKwkJZ290byBvdXRfaXJxOworCX0KKworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorCXJldCA9IG1pc2NfcmVnaXN0ZXIgKCZ0ZW1wX21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJVEVNUF9NSU5PUiwgcmV0KTsKKwkJZ290byBvdXRfcmJ0OworCX0KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIgKCZ3ZHRwY2lfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byBvdXRfbWlzYzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIGhlYXJ0YmVhdD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJaGVhcnRiZWF0LCBub3dheW91dCk7CisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCisJcHJpbnRrKEtFUk5fSU5GTyAid2R0OiBGYW4gVGFjaG9tZXRlciBpcyAlc1xuIiwgKHRhY2hvbWV0ZXIgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKSk7CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7CisKK291dF9taXNjOgorI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorCW1pc2NfZGVyZWdpc3RlcigmdGVtcF9taXNjZGV2KTsKK291dF9yYnQ6CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdHBjaV9ub3RpZmllcik7CitvdXRfaXJxOgorCWZyZWVfaXJxKGlycSwgJndkdHBjaV9taXNjZGV2KTsKK291dF9yZWc6CisJcmVsZWFzZV9yZWdpb24gKGlvLCAxNik7CitvdXRfcGNpOgorCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCWdvdG8gb3V0OworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3ZHRwY2lfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyogaGVyZSB3ZSBhc3N1bWUgb25seSBvbmUgZGV2aWNlIHdpbGwgZXZlciBoYXZlCisJICogYmVlbiBwaWNrZWQgdXAgYW5kIHJlZ2lzdGVyZWQgYnkgcHJvYmUgZnVuY3Rpb24gKi8KKwltaXNjX2RlcmVnaXN0ZXIoJndkdHBjaV9taXNjZGV2KTsKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKwltaXNjX2RlcmVnaXN0ZXIoJnRlbXBfbWlzY2Rldik7CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdHBjaV9ub3RpZmllcik7CisJZnJlZV9pcnEoaXJxLCAmd2R0cGNpX21pc2NkZXYpOworCXJlbGVhc2VfcmVnaW9uKGlvLCAxNik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWRldl9jb3VudC0tOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3ZHRwY2lfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkgICA9IFBDSV9WRU5ET1JfSURfQUNDRVNTSU8sCisJCS5kZXZpY2UJICAgPSBQQ0lfREVWSUNFX0lEX1dER19DU00sCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwl9LAorCXsgMCwgfSwgLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgd2R0cGNpX3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB3ZHRwY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJ3ZHRfcGNpIiwKKwkuaWRfdGFibGUJPSB3ZHRwY2lfcGNpX3RibCwKKwkucHJvYmUJCT0gd2R0cGNpX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod2R0cGNpX3JlbW92ZV9vbmUpLAorfTsKKworCisvKioKKyAqCXdkdHBjaV9jbGVhbnVwOgorICoKKyAqCVVubG9hZCB0aGUgd2F0Y2hkb2cuIFlvdSBjYW5ub3QgZG8gdGhpcyB3aXRoIGFueSBmaWxlIGhhbmRsZXMgb3Blbi4KKyAqCUlmIHlvdXIgd2F0Y2hkb2cgaXMgc2V0IHRvIGNvbnRpbnVlIHRpY2tpbmcgb24gY2xvc2UgYW5kIHlvdSB1bmxvYWQKKyAqCWl0LCB3ZWxsIGl0IGtlZXBzIHRpY2tpbmcuIFdlIHdvbid0IGdldCB0aGUgaW50ZXJydXB0IGJ1dCB0aGUgYm9hcmQKKyAqCXdpbGwgbm90IHRvdWNoIFBDIG1lbW9yeSBzbyBhbGwgaXMgZmluZS4gWW91IGp1c3QgaGF2ZSB0byBsb2FkIGEgbmV3CisgKgltb2R1bGUgaW4geHggc2Vjb25kcyBvciByZWJvb3QuCisgKi8KKworc3RhdGljIHZvaWQgX19leGl0IHdkdHBjaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmd2R0cGNpX2RyaXZlcik7Cit9CisKKworLyoqCisgKiAJd2R0cGNpX2luaXQ6CisgKgorICoJU2V0IHVwIHRoZSBXRFQgd2F0Y2hkb2cgYm9hcmQuIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGdyYWIgdGhlCisgKglyZXNvdXJjZXMgd2UgcmVxdWlyZSBhbmQgYml0Y2ggaWYgYW55b25lIGJlYXQgdXMgdG8gdGhlbS4KKyAqCVRoZSBvcGVuKCkgZnVuY3Rpb24gd2lsbCBhY3R1YWxseSBraWNrIHRoZSBib2FyZCBvZmYuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgd2R0cGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlciAoJndkdHBjaV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHdkdHBjaV9pbml0KTsKK21vZHVsZV9leGl0KHdkdHBjaV9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiSlAgTm9sbG1hbm4sIEFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIElDUyBQQ0ktV0RUNTAwLzUwMSB3YXRjaGRvZyBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworTU9EVUxFX0FMSUFTX01JU0NERVYoVEVNUF9NSU5PUik7Cg==